From e3c00addd85c5db7331983474f82d64dee808959 Mon Sep 17 00:00:00 2001 From: HeuJung Date: Thu, 9 Jul 2026 16:41:42 +0900 Subject: [PATCH 1/6] =?UTF-8?q?fix(sirsoft-basic):=20=EB=AA=A8=EB=B0=94?= =?UTF-8?q?=EC=9D=BC=20=EB=B7=B0=ED=8F=AC=ED=8A=B8=20=EA=B0=80=EB=A1=9C=20?= =?UTF-8?q?=EC=98=A4=EB=B2=84=ED=94=8C=EB=A1=9C=C2=B7=EC=95=95=EC=B0=A9=20?= =?UTF-8?q?=ED=95=B4=EC=86=8C=20=EB=B0=8F=20=ED=99=95=EC=9E=A5=20=EC=A1=B0?= =?UTF-8?q?=EA=B0=81=20audit=20=EC=82=AC=EA=B0=81=EC=A7=80=EB=8C=80=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 390px 실측 결과 26개 라우트 중 24개에서 문서가 뷰포트를 11px 넘겼고, 320px 에서는 햄버거 버튼이 화면 밖으로 밀려 내비게이션 자체가 불가능했다. 원인은 예외 없이 헤더 우측의 언어(71px)+통화(91px) 선택기였다. 이를 모바일 드로어로 옮기고, 좁은 화면에서는 세로 목록 대신 가로 칩으로 나열하도록 했다. 통화·배송국가는 이커머스 모듈이 슬롯에 주입하는 조각이므로 모듈 쪽에도 responsive.portable 오버라이드를 넣었다. 템플릿의 드로어 자리는 overflow-y-auto 라 옛 absolute 드롭다운이 잘리므로, 템플릿의 이커머스 모듈 의존 하한을 >=1.0.2 로 올렸다. 게시글 상단 네비는 성격이 다른 회귀였다. 게시판 이름이 길수록 flex 형제인 목록·이전글·다음글 버튼이 좁아지는데(87→73→62px), document.scrollWidth 는 내내 뷰포트와 같아 오버플로 검사로는 잡히지 않았다. 넘치는 게 아니라 줄어드는 회귀다. shrink-0 으로 버튼 폭을 고정하고, 모바일에서만 게시판 이름을 자기 줄로 올렸다. 버튼 3개 고정폭 261px + 21자 제목 323px = 584px < 태블릿 콘텐츠 735px 이므로 portable 이 아니라 mobile 스코프로 한정했다. 커밋 전 점검에서 audit 결함 두 건이 드러나 함께 고쳤다. 첫째, layout-* 룰 28개 중 27개가 appliesTo 에 확장 주입 조각 경로를 빠뜨려 조각 32개가 정적 검사에서 통째로 빠져 있었다. 실제 위반 60건이 은닉돼 있었고 그중 45건은 error 다. 다만 glob 만 넓히면 layout-grammar 의 root 화이트리스트가 조각의 정당한 키(target_layout/injections/extension_point/mode/priority)를 전부 오탐해 90건의 error 를 새로 만든다. 조각은 레이아웃이 아니라 별도 스키마이므로 extension-fragment 스키마를 신설해 오탐을 없애는 동시에 조각 고유의 결함(대상 키 누락으로 인한 silent drop, target_layout ↔ extension_point 동시 정의, 무동작 조각)을 새로 검출하게 했다. 둘째, Icon 의 w-N h-N 을 size prop 으로 바꾸라는 규정이 틀렸다. Icon 은 글리프라 박스 크기가 곧 font-size 인데, size prop 은 Font Awesome fa-* 로 매핑되어 상대값 0.875em + line-height 붕괴를 동반한다. 실측하면 w-4 h-4(16×16)가 fa-sm 에서 12.25×0.88 이 된다. 등가는 text-base 하나뿐이다. 앞선 작업에서 size:"sm" 으로 치환했던 2건을 되돌리고, 규정과 룰 메시지를 실측 등가표로 교체했다. --- AGENTS.md | 13 +- .../_bundled/sirsoft-ecommerce/CHANGELOG.md | 6 + .../_bundled/sirsoft-ecommerce/composer.json | 2 +- .../_bundled/sirsoft-ecommerce/module.json | 2 +- .../sirsoft-ecommerce/package-lock.json | 4 +- .../_bundled/sirsoft-ecommerce/package.json | 2 +- .../header-currency-selector-admin.json | 8 +- .../header-currency-selector-user.json | 88 ++++- .../layouts/shippingCountryLayouts.test.tsx | 106 ++++++ .../troubleshooting-components.test.ts | 45 +++ templates/_bundled/sirsoft-basic/CHANGELOG.md | 27 ++ .../layouts/currencySelector.test.tsx | 184 +++++++++- .../layouts/mobile-viewport-overflow.test.tsx | 325 ++++++++++++++++++ .../sirsoft-basic/dist/css/components.css | 2 +- .../sirsoft-basic/dist/js/components.iife.js | 4 +- .../dist/js/components.iife.js.map | 2 +- .../sirsoft-basic/layouts/_user_base.json | 221 ++++-------- .../partials/board/form/_post_form.json | 2 +- .../partials/board/show/_comment_input.json | 2 +- .../partials/board/show/_navigation.json | 19 +- .../mypage/addresses/_modal_address.json | 2 +- .../partials/mypage/orders/_modal_cancel.json | 45 ++- .../orders/_modal_confirm_purchase.json | 5 +- .../mypage/orders/_modal_write_review.json | 1 - .../partials/shop/_modal_address_manage.json | 2 +- .../partials/shop/detail/_info_summary.json | 5 +- .../_bundled/sirsoft-basic/package-lock.json | 4 +- templates/_bundled/sirsoft-basic/package.json | 2 +- .../src/components/composite/Modal.tsx | 2 +- .../_bundled/sirsoft-basic/template.json | 4 +- .../tests/Playwright/playwright.config.ts | 84 +++++ .../specs/board-navigation-long-name.spec.ts | 245 +++++++++++++ .../specs/mobile-viewport-overflow.spec.ts | 214 ++++++++++++ 33 files changed, 1442 insertions(+), 237 deletions(-) create mode 100644 templates/_bundled/sirsoft-basic/__tests__/layouts/mobile-viewport-overflow.test.tsx create mode 100644 templates/_bundled/sirsoft-basic/tests/Playwright/playwright.config.ts create mode 100644 templates/_bundled/sirsoft-basic/tests/Playwright/specs/board-navigation-long-name.spec.ts create mode 100644 templates/_bundled/sirsoft-basic/tests/Playwright/specs/mobile-viewport-overflow.spec.ts diff --git a/AGENTS.md b/AGENTS.md index 60af0255..b70277e3 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -248,11 +248,22 @@ | 금지 | 올바른 사용 | |------|------------| -| `Icon className="w-4 h-4"` | `Icon size="sm"` 또는 `className="text-sm"` | +| `Icon className="w-4 h-4"` | `className="text-base"` (아래 등가표) 또는 `size` prop | | `Select valueKey/labelKey` | computed로 `{ value, label }` 변환 | | Form 내 `Button` type 없음 | `type="button"` 명시 (submit 방지) | | `options={{options}}` | `options={{options ?? []}}` (fallback) | +Icon 은 `` 글리프라 박스 크기가 곧 `font-size` 다. `w-N h-N` 은 박스만 정하고 글리프는 부모 `font-size` 를 상속하므로 어긋난다. 기존 `w-N h-N` 을 옮길 때는 아래 등가표를 쓴다 (Chrome 실측). + +| `w-N h-N` | px | 등가 `className` | +|---|---|---| +| `w-3 h-3` | 12 | `text-xs` | +| `w-3.5 h-3.5` | 14 | `text-sm` | +| `w-4 h-4` | 16 | `text-base` | +| `w-5 h-5` | 20 | `text-xl` | + +`size` prop 은 Font Awesome `fa-*` 클래스로 매핑되며 등가가 아니다 — `size="sm"` → `fa-sm` → `font-size: 0.875em`(상대값) + `line-height` 붕괴로 16px 이 12.25×0.88px 이 된다. 새 아이콘에는 써도 되지만, 기존 `w-N h-N` 의 치환용으로는 쓰지 않는다. + ### 상태 관리 | 금지 | 올바른 사용 | diff --git a/modules/_bundled/sirsoft-ecommerce/CHANGELOG.md b/modules/_bundled/sirsoft-ecommerce/CHANGELOG.md index 9e4a26a6..080efa7d 100644 --- a/modules/_bundled/sirsoft-ecommerce/CHANGELOG.md +++ b/modules/_bundled/sirsoft-ecommerce/CHANGELOG.md @@ -4,6 +4,12 @@ 형식은 [Keep a Changelog](https://keepachangelog.com/ko/1.1.0/)를 따르며, [Semantic Versioning](https://semver.org/lang/ko/)을 준수합니다. +## [1.0.2] - 2026-07-09 + +### Changed + +- 휴대폰·태블릿 화면에서 통화·배송국가 선택이 드롭다운 대신 항상 펼쳐진 가로 버튼으로 표시됩니다. 좁은 화면의 메뉴 안에서 드롭다운이 잘려 보이던 문제가 함께 해소됩니다. 데스크톱 화면의 드롭다운은 그대로입니다. + ## [1.0.1] - 2026-07-08 ### Added diff --git a/modules/_bundled/sirsoft-ecommerce/composer.json b/modules/_bundled/sirsoft-ecommerce/composer.json index 3ccab90e..d7af07c0 100644 --- a/modules/_bundled/sirsoft-ecommerce/composer.json +++ b/modules/_bundled/sirsoft-ecommerce/composer.json @@ -2,7 +2,7 @@ "name": "modules/sirsoft-ecommerce", "description": "Ecommerce module for Gnuboard7", "type": "library", - "version": "1.0.1", + "version": "1.0.2", "license": "MIT", "autoload": { "psr-4": { diff --git a/modules/_bundled/sirsoft-ecommerce/module.json b/modules/_bundled/sirsoft-ecommerce/module.json index 323944a8..8463b86d 100644 --- a/modules/_bundled/sirsoft-ecommerce/module.json +++ b/modules/_bundled/sirsoft-ecommerce/module.json @@ -5,7 +5,7 @@ "ko": "이커머스", "en": "Ecommerce" }, - "version": "1.0.1", + "version": "1.0.2", "license": "MIT", "description": { "ko": "그누보드7 이커머스 모듈 - 상품, 주문, 결제 관리", diff --git a/modules/_bundled/sirsoft-ecommerce/package-lock.json b/modules/_bundled/sirsoft-ecommerce/package-lock.json index 608be326..dc9901a7 100644 --- a/modules/_bundled/sirsoft-ecommerce/package-lock.json +++ b/modules/_bundled/sirsoft-ecommerce/package-lock.json @@ -1,12 +1,12 @@ { "name": "@g7/sirsoft-ecommerce", - "version": "1.0.1", + "version": "1.0.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@g7/sirsoft-ecommerce", - "version": "1.0.1", + "version": "1.0.2", "devDependencies": { "jsdom": "^27.4.0", "typescript": "^5.3.3", diff --git a/modules/_bundled/sirsoft-ecommerce/package.json b/modules/_bundled/sirsoft-ecommerce/package.json index 3066e2a1..08a25b1e 100644 --- a/modules/_bundled/sirsoft-ecommerce/package.json +++ b/modules/_bundled/sirsoft-ecommerce/package.json @@ -1,6 +1,6 @@ { "name": "@g7/sirsoft-ecommerce", - "version": "1.0.1", + "version": "1.0.2", "description": "그누보드7 이커머스 모듈 프론트엔드 에셋", "private": true, "type": "module", diff --git a/modules/_bundled/sirsoft-ecommerce/resources/extensions/header-currency-selector-admin.json b/modules/_bundled/sirsoft-ecommerce/resources/extensions/header-currency-selector-admin.json index 626c594b..69277391 100644 --- a/modules/_bundled/sirsoft-ecommerce/resources/extensions/header-currency-selector-admin.json +++ b/modules/_bundled/sirsoft-ecommerce/resources/extensions/header-currency-selector-admin.json @@ -63,9 +63,9 @@ "props": { "className": "text-xs text-gray-500 dark:text-gray-400" }, "text": "{{_global.preferredShippingCountry ?? _global.modules?.['sirsoft-ecommerce']?.shipping?.default_country ?? 'KR'}}" }, - { "type": "basic", "name": "Icon", "props": { "name": "coins", "className": "w-4 h-4" } }, + { "type": "basic", "name": "Icon", "props": { "name": "coins", "className": "text-base" } }, { "type": "basic", "name": "Span", "props": { "className": "font-medium" }, "text": "{{_global.preferredCurrency ?? _global.modules?.['sirsoft-ecommerce']?.language_currency?.default_currency ?? 'KRW'}}" }, - { "type": "basic", "name": "Icon", "props": { "name": "chevron-down", "className": "w-3 h-3" } } + { "type": "basic", "name": "Icon", "props": { "name": "chevron-down", "className": "text-xs" } } ], "actions": [ { @@ -119,7 +119,7 @@ "type": "basic", "name": "Icon", "if": "{{_global.preferredCurrency === currency.code}}", - "props": { "name": "check", "className": "w-4 h-4" } + "props": { "name": "check", "className": "text-base" } } ], "actions": [ @@ -174,7 +174,7 @@ "type": "basic", "name": "Icon", "if": "{{(_global.preferredShippingCountry ?? 'KR') === shipCountry.code}}", - "props": { "name": "check", "className": "w-4 h-4" } + "props": { "name": "check", "className": "text-base" } } ], "actions": [ diff --git a/modules/_bundled/sirsoft-ecommerce/resources/extensions/header-currency-selector-user.json b/modules/_bundled/sirsoft-ecommerce/resources/extensions/header-currency-selector-user.json index 9f908f94..95967281 100644 --- a/modules/_bundled/sirsoft-ecommerce/resources/extensions/header-currency-selector-user.json +++ b/modules/_bundled/sirsoft-ecommerce/resources/extensions/header-currency-selector-user.json @@ -12,8 +12,15 @@ "name": "Div", "slot": "header_currency", "props": { "className": "relative {{(_global.availableCurrencies ?? []).length > 0 || ((_global.availableShippingCountries ?? []).length > 1 && _global.modules?.['sirsoft-ecommerce']?.shipping?.international_shipping_enabled === true) ? '' : 'hidden'}}" }, + "responsive": { + "portable": { + "comment": "portable 에서는 이 조각이 사용자 템플릿 모바일 드로어(세로 블록) 안에 렌더된다. 펼친 목록이 컨테이너 폭을 채우도록 w-full. hidden 게이트 표현식은 그대로 유지(props 얕은 머지가 아니라 className 통째 교체이므로 표현식을 복제해야 함).", + "props": { "className": "relative w-full {{(_global.availableCurrencies ?? []).length > 0 || ((_global.availableShippingCountries ?? []).length > 1 && _global.modules?.['sirsoft-ecommerce']?.shipping?.international_shipping_enabled === true) ? '' : 'hidden'}}" } + } + }, "children": [ { + "comment": "트리거 버튼 — 데스크톱 전용. 모바일/태블릿(portable)에서는 이 조각이 드로어(overflow-y-auto) 안에 렌더되어 absolute 드롭다운이 잘리므로, 트리거를 숨기고 패널을 항상 펼친다.", "type": "basic", "name": "Button", "props": { @@ -22,6 +29,11 @@ "aria-expanded": "{{_local.showCurrencyDropdown ?? false}}", "aria-label": "$t:sirsoft-ecommerce.common.currency_label" }, + "responsive": { + "portable": { + "props": { "className": "hidden" } + } + }, "children": [ { "comment": "트리거 라벨: 해외배송 활성이면 선택 배송국가 코드 병기 (관리자 헤더와 동일하게 코드 텍스트로 표기 — flag-icons 의존 제거).", @@ -31,9 +43,9 @@ "props": { "className": "text-xs text-gray-500 dark:text-gray-400" }, "text": "{{_global.preferredShippingCountry ?? _global.modules?.['sirsoft-ecommerce']?.shipping?.default_country ?? 'KR'}}" }, - { "type": "basic", "name": "Icon", "props": { "name": "coins", "className": "w-4 h-4" } }, + { "type": "basic", "name": "Icon", "props": { "name": "coins", "className": "text-base" } }, { "type": "basic", "name": "Span", "props": { "className": "font-medium" }, "text": "{{_global.preferredCurrency ?? _global.defaultCurrency ?? 'KRW'}}" }, - { "type": "basic", "name": "Icon", "props": { "name": "chevron-down", "className": "w-3 h-3" } } + { "type": "basic", "name": "Icon", "props": { "name": "chevron-down", "className": "text-xs" } } ], "actions": [ { @@ -44,7 +56,7 @@ ] }, { - "comment": "드롭다운 메뉴 (통화 + 배송국가 2섹션)", + "comment": "드롭다운 메뉴 (통화 + 배송국가 2섹션). portable(0~1023px) 에서는 트리거 없이 항상 펼쳐진 정적 목록 — 드로어 스크롤 경계에서 absolute 패널이 잘리는 문제 회피.", "type": "basic", "name": "Div", "if": "{{_local.showCurrencyDropdown}}", @@ -52,6 +64,15 @@ "className": "absolute right-0 top-full mt-2 w-52 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-lg z-50 py-1 overflow-hidden", "role": "listbox" }, + "responsive": { + "portable": { + "if": "{{true}}", + "props": { + "className": "static w-full mt-2 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg py-1", + "role": "listbox" + } + } + }, "children": [ { "comment": "── 통화 섹션 ──", @@ -63,8 +84,19 @@ "type": "basic", "name": "Div", "props": { "className": "px-4 py-1.5 text-xs font-semibold text-gray-400 dark:text-gray-500 uppercase tracking-wide" }, + "responsive": { "portable": { "props": { "className": "px-3 py-1 text-xs font-medium text-gray-500 dark:text-gray-400 uppercase" } } }, "text": "$t:sirsoft-ecommerce.common.currency_label" }, + { + "comment": "옵션 래퍼. portable 에서만 가로 칩 나열(flex-wrap). 데스크톱은 무클래스 블록이라 기존 세로 목록 그대로. iteration 은 아래 Div 자신에 걸려 있어 항목 수만큼 복제되므로, 복제본들이 이 래퍼의 flex item 이 된다.", + "type": "basic", + "name": "Div", + "responsive": { + "portable": { + "props": { "className": "flex flex-wrap gap-2 px-3 pb-2" } + } + }, + "children": [ { "type": "basic", "name": "Div", @@ -78,22 +110,34 @@ "role": "option", "aria-selected": "{{_global.preferredCurrency === currency.code}}" }, + "responsive": { + "portable": { + "props": { + "className": "inline-flex items-center gap-1.5 px-3 py-1.5 text-sm border rounded-full cursor-pointer whitespace-nowrap transition-colors {{_global.preferredCurrency === currency.code ? 'bg-blue-50 dark:bg-blue-900/20 text-blue-600 dark:text-blue-400 border-blue-200 dark:border-blue-800' : 'text-gray-700 dark:text-gray-300 border-gray-200 dark:border-gray-600 hover:bg-gray-100 dark:hover:bg-gray-700'}}", + "role": "option", + "aria-selected": "{{_global.preferredCurrency === currency.code}}" + } + } + }, "children": [ { "type": "basic", "name": "Span", "props": { "className": "text-base" }, "text": "{{currency.flag}}" }, { "type": "basic", "name": "Span", "props": { "className": "flex-1" }, + "responsive": { "portable": { "props": { "className": "" } } }, "children": [ { "type": "basic", "name": "Span", "props": { "className": "font-medium" }, "text": "{{currency.code}}" }, { "type": "basic", "name": "Span", "props": { "className": "text-gray-500 dark:text-gray-400 ml-1" }, "text": "({{currency.symbol}})" } ] }, { + "comment": "portable(칩 나열)에서는 선택 상태가 배경/테두리 색으로 이미 표현되고 aria-selected 로도 전달되므로, 칩 폭을 아끼려 체크 아이콘을 숨긴다.", "type": "basic", "name": "Icon", "if": "{{_global.preferredCurrency === currency.code}}", - "props": { "name": "check", "className": "w-4 h-4" } + "responsive": { "portable": { "if": "{{false}}" } }, + "props": { "name": "check", "className": "text-base" } } ], "actions": [ @@ -128,6 +172,8 @@ } ] } + ] + } ] }, { @@ -147,8 +193,19 @@ "type": "basic", "name": "Div", "props": { "className": "px-4 py-1.5 text-xs font-semibold text-gray-400 dark:text-gray-500 uppercase tracking-wide" }, + "responsive": { "portable": { "props": { "className": "px-3 py-1 text-xs font-medium text-gray-500 dark:text-gray-400 uppercase" } } }, "text": "$t:sirsoft-ecommerce.common.shipping_country_label" }, + { + "comment": "옵션 래퍼. portable 에서만 가로 칩 나열(flex-wrap). 데스크톱은 무클래스 블록.", + "type": "basic", + "name": "Div", + "responsive": { + "portable": { + "props": { "className": "flex flex-wrap gap-2 px-3 pb-2" } + } + }, + "children": [ { "type": "basic", "name": "Div", @@ -162,13 +219,30 @@ "role": "option", "aria-selected": "{{(_global.preferredShippingCountry ?? 'KR') === shipCountry.code}}" }, + "responsive": { + "portable": { + "props": { + "className": "inline-flex items-center gap-1.5 px-3 py-1.5 text-sm border rounded-full cursor-pointer whitespace-nowrap transition-colors {{(_global.preferredShippingCountry ?? 'KR') === shipCountry.code ? 'bg-blue-50 dark:bg-blue-900/20 text-blue-600 dark:text-blue-400 border-blue-200 dark:border-blue-800' : 'text-gray-700 dark:text-gray-300 border-gray-200 dark:border-gray-600 hover:bg-gray-100 dark:hover:bg-gray-700'}}", + "role": "option", + "aria-selected": "{{(_global.preferredShippingCountry ?? 'KR') === shipCountry.code}}" + } + } + }, "children": [ - { "type": "basic", "name": "Span", "props": { "className": "flex-1 font-medium" }, "text": "{{shipCountry.name}}" }, { + "type": "basic", + "name": "Span", + "props": { "className": "flex-1 font-medium" }, + "responsive": { "portable": { "props": { "className": "font-medium" } } }, + "text": "{{shipCountry.name}}" + }, + { + "comment": "portable(칩 나열)에서는 선택 상태를 배경/테두리 색 + aria-selected 로 전달하므로 체크 아이콘을 숨긴다.", "type": "basic", "name": "Icon", "if": "{{(_global.preferredShippingCountry ?? 'KR') === shipCountry.code}}", - "props": { "name": "check", "className": "w-4 h-4" } + "responsive": { "portable": { "if": "{{false}}" } }, + "props": { "name": "check", "className": "text-base" } } ], "actions": [ @@ -217,6 +291,8 @@ } ] } + ] + } ] } ] diff --git a/modules/_bundled/sirsoft-ecommerce/resources/js/__tests__/layouts/shippingCountryLayouts.test.tsx b/modules/_bundled/sirsoft-ecommerce/resources/js/__tests__/layouts/shippingCountryLayouts.test.tsx index c66cc957..b354a3f9 100644 --- a/modules/_bundled/sirsoft-ecommerce/resources/js/__tests__/layouts/shippingCountryLayouts.test.tsx +++ b/modules/_bundled/sirsoft-ecommerce/resources/js/__tests__/layouts/shippingCountryLayouts.test.tsx @@ -116,6 +116,112 @@ describe('header-currency-selector-user.json — 헤더 공용 셀렉터 2섹션 expect(raw).toContain('g7_preferred_shipping_country'); }); + /** + * 사용자 템플릿(sirsoft-basic)은 390px 뷰포트 오버플로(+11px) 해소를 위해 이 슬롯을 + * 헤더 우측 그룹에서 모바일 드로어(overflow-y-auto + w-80)로 옮겼다. 드로어에서는 + * absolute 드롭다운 패널이 스크롤 경계에서 잘리므로, 주입 노드 자체가 responsive.portable + * (0~1023px) 오버라이드로 "트리거 숨김 + 패널 항상 펼침(static)" 을 선언한다. + * + * SlotContainer 는 주입 자식에게 variant/context prop 을 전달하지 않으므로 컨테이너별로 + * 다르게 그릴 방법이 이것뿐이다. 데스크톱(≥1024px)은 기존 드롭다운을 그대로 유지한다. + */ + it('트리거 버튼은 portable(0~1023px)에서 숨겨진다 (모바일 드로어 = 펼친 목록)', () => { + const trigger = walk(root, (n) => n.name === 'Button' && Array.isArray(n.actions) && + n.actions.some((a: any) => a.handler === 'setState' && a.params?.showCurrencyDropdown !== undefined)); + expect(trigger).toBeTruthy(); + expect(trigger.responsive?.portable?.props?.className).toBe('hidden'); + }); + + it('패널은 portable 에서 if 해제 + static 흐름 (데스크톱 absolute/z-50 은 보존)', () => { + const panel = (root.children ?? []).find( + (n: any) => n.name === 'Div' && n.props?.role === 'listbox' + ); + expect(panel).toBeTruthy(); + + // 데스크톱 기본 경로 — 회귀 방지 + expect(panel.if).toBe('{{_local.showCurrencyDropdown}}'); + expect(panel.props.className).toContain('absolute'); + expect(panel.props.className).toContain('z-50'); + + // portable 오버라이드 — 엔진은 override.if 로 base if 를 완전 교체한다 + const portable = panel.responsive?.portable; + expect(portable).toBeTruthy(); + expect(portable.if).toBe('{{true}}'); + expect(portable.props.className).toContain('static'); + expect(portable.props.className).not.toContain('absolute'); + expect(portable.props.className).not.toContain('z-50'); + // 접근성 role 은 props 얕은 머지에서 유실되지 않도록 오버라이드에도 명시 + expect(portable.props.role).toBe('listbox'); + }); + + /** + * 모바일(portable)에서는 통화·배송국가를 세로 목록이 아니라 가로 나열 칩으로 그린다. + * 세로 목록은 좁은 드로어에서 세로 공간을 과하게 먹는다. + * + * 엔진의 `iteration` 은 그 속성을 가진 노드 자신을 항목 수만큼 복제한다. 따라서 옵션들을 + * 한 줄에 흘리려면 iteration 노드의 **부모**가 flex 컨테이너여야 한다 → 래퍼 Div 를 두고 + * 그 래퍼에만 responsive.portable 로 `flex flex-wrap` 을 준다(데스크톱은 무클래스 블록). + */ + const findSection = (labelKey: string) => { + const panel = (root.children ?? []).find((c: any) => c.props?.role === 'listbox'); + return (panel.children ?? []).find( + (c: any) => JSON.stringify(c).includes(labelKey) && Array.isArray(c.children) + ); + }; + + for (const [name, labelKey] of [ + ['통화', 'common.currency_label'], + ['배송국가', 'common.shipping_country_label'], + ] as const) { + it(`${name} 섹션: iteration 노드의 부모 래퍼가 portable 에서 flex-wrap 이다 (가로 칩 나열)`, () => { + const section = findSection(labelKey); + expect(section).toBeTruthy(); + + // [0] = 라벨, [1] = 옵션 래퍼 + const wrapper = section.children[1]; + expect(wrapper.name).toBe('Div'); + // 데스크톱은 무클래스(블록 흐름) — 기존 세로 목록 유지 + expect(wrapper.props?.className).toBeUndefined(); + + const portableCls = wrapper.responsive?.portable?.props?.className ?? ''; + expect(portableCls).toContain('flex'); + expect(portableCls).toContain('flex-wrap'); + + // iteration 은 래퍼가 아니라 그 자식에 있어야 한다 (래퍼가 복제되면 칩이 세로로 쌓임) + expect(wrapper.iteration).toBeUndefined(); + expect(wrapper.children[0].iteration).toBeTruthy(); + }); + + it(`${name} 섹션: 옵션 버튼이 portable 에서 칩(rounded-full) 이고 데스크톱은 w-full 행이다`, () => { + const section = findSection(labelKey); + const iterNode = section.children[1].children[0]; + const button = iterNode.children[0]; + expect(button.name).toBe('Button'); + + // 데스크톱 기본 — 전체폭 행 + expect(button.props.className).toContain('w-full'); + expect(button.props.className).not.toContain('rounded-full'); + + // portable — 가로 칩 + const chip = button.responsive?.portable?.props?.className ?? ''; + expect(chip).toContain('inline-flex'); + expect(chip).toContain('rounded-full'); + expect(chip).toContain('whitespace-nowrap'); + expect(chip).not.toContain('w-full'); + // 접근성 속성은 props 얕은 머지에서 유실되지 않도록 오버라이드에도 유지 + expect(button.responsive.portable.props.role).toBe('option'); + expect(button.responsive.portable.props['aria-selected']).toBeTruthy(); + }); + + it(`${name} 섹션: 선택 체크 아이콘은 portable 에서 숨긴다 (칩 폭 절약, 선택은 색+aria-selected 로 전달)`, () => { + const section = findSection(labelKey); + const button = section.children[1].children[0].children[0]; + const check = (button.children ?? []).find((c: any) => c.props?.name === 'check'); + expect(check).toBeTruthy(); + expect(check.responsive?.portable?.if).toBe('{{false}}'); + }); + } + it('트리거 라벨 = 배송국가 코드 텍스트 (관리자 헤더와 동일, flag-icons 비의존)', () => { // 트리거(통화 버튼) 안의 첫 Span 이 배송국가 코드를 텍스트로 표시해야 한다. const trigger = walk(root, (n) => n.name === 'Button' && Array.isArray(n.actions) && diff --git a/resources/js/core/template-engine/__tests__/troubleshooting-components.test.ts b/resources/js/core/template-engine/__tests__/troubleshooting-components.test.ts index 22758d63..7ef6baf1 100644 --- a/resources/js/core/template-engine/__tests__/troubleshooting-components.test.ts +++ b/resources/js/core/template-engine/__tests__/troubleshooting-components.test.ts @@ -12,6 +12,51 @@ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; import { Logger } from '../../utils/Logger'; import { hasExplicitSetStateForField } from '../FormContext'; +import { responsiveManager } from '../ResponsiveManager'; + +describe('트러블슈팅 회귀 테스트 - flex 압착(shrink)', () => { + /** + * 사례: 텍스트가 길어질수록 형제 버튼이 좁아지는데 오버플로 검사로는 안 잡힘 + * + * 해결책이 `responsive.mobile`(0~767) 로 좁힌 2행 레이아웃에 의존한다. + * `portable`(0~1023) 이면 태블릿에서 불필요하게 줄바꿈된다. + * 여기서는 그 전제인 스코프 경계와 우선순위를 고정한다. + * + * @see docs/frontend/troubleshooting-components-misc.md "flex 압착(shrink) 관련 이슈" + */ + describe('[사례 1] responsive 스코프 경계 — mobile(0~767) vs portable(0~1023)', () => { + it('mobile 은 767px 까지만 매칭되고 768px 부터는 미적용', () => { + const responsive = { mobile: { props: { className: 'flex-wrap' } } }; + + expect(responsiveManager.getMatchingKey(responsive, 320)).toBe('mobile'); + expect(responsiveManager.getMatchingKey(responsive, 390)).toBe('mobile'); + expect(responsiveManager.getMatchingKey(responsive, 767)).toBe('mobile'); + // 768px 부터 태블릿 — 한 줄 유지 (버튼 261px + 21자 제목 323px = 584px < 735px) + expect(responsiveManager.getMatchingKey(responsive, 768)).toBeNull(); + expect(responsiveManager.getMatchingKey(responsive, 1280)).toBeNull(); + }); + + it('portable 은 1023px 까지 매칭되어 태블릿도 포함한다', () => { + const responsive = { portable: { props: { className: 'flex-wrap' } } }; + + expect(responsiveManager.getMatchingKey(responsive, 767)).toBe('portable'); + expect(responsiveManager.getMatchingKey(responsive, 768)).toBe('portable'); + expect(responsiveManager.getMatchingKey(responsive, 1023)).toBe('portable'); + expect(responsiveManager.getMatchingKey(responsive, 1024)).toBeNull(); + }); + + it('mobile 과 portable 이 함께 정의되면 좁은 범위(mobile)가 우선한다', () => { + const responsive = { + portable: { props: { className: 'portable-wins' } }, + mobile: { props: { className: 'mobile-wins' } }, + }; + + expect(responsiveManager.getMatchingKey(responsive, 390)).toBe('mobile'); + // 태블릿 구간에서는 mobile 이 매칭되지 않으므로 portable 로 폴백 + expect(responsiveManager.getMatchingKey(responsive, 900)).toBe('portable'); + }); + }); +}); describe('트러블슈팅 회귀 테스트 - DataGrid 컴포넌트', () => { beforeEach(() => { diff --git a/templates/_bundled/sirsoft-basic/CHANGELOG.md b/templates/_bundled/sirsoft-basic/CHANGELOG.md index f0e85ca8..07274934 100644 --- a/templates/_bundled/sirsoft-basic/CHANGELOG.md +++ b/templates/_bundled/sirsoft-basic/CHANGELOG.md @@ -4,6 +4,33 @@ 형식은 [Keep a Changelog](https://keepachangelog.com/ko/1.1.0/)를 따르며, [Semantic Versioning](https://semver.org/lang/ko/)을 준수합니다. +## [1.0.2] - 2026-07-09 + +### Changed + +- 이커머스 모듈 최소 요구 버전을 1.0.2 로 상향했습니다. 휴대폰 메뉴 안의 통화·배송국가 선택이 이 템플릿의 새 배치에서 잘리지 않고 표시되려면 해당 버전 이상이 필요합니다. + +### Fixed + +#### 모바일 화면 + +- 휴대폰 화면에서 헤더가 가로로 넘쳐 사이트명이 잘리고 메뉴 버튼이 화면 밖으로 밀려나던 문제를 수정했습니다. 언어·통화 선택은 메뉴(햄버거) 안으로 옮겼습니다. +- 좁은 화면(320px)에서 메뉴 버튼을 누를 수 없어 사이트 이동 자체가 불가능하던 문제를 수정했습니다. +- 메뉴 안의 언어·통화·배송국가 선택이 세로로 길게 늘어지지 않고 가로로 나란히 배치됩니다. +- 언어 선택이 로그인하지 않은 방문자에게도 보입니다. 이전에는 메뉴 안에서 로그인한 사용자만 언어를 바꿀 수 있었습니다. +- 게시판 이름이 길면 게시글 위쪽의 목록·이전글·다음글 버튼이 찌그러지거나 보이지 않던 문제를 수정했습니다. 이제 게시판 이름이 윗줄에 표시되고 버튼은 아랫줄에 원래 크기로 놓입니다. + +#### 입력 화면 + +- 비회원이 글을 쓰거나 댓글을 달 때 이름·비밀번호 입력칸이 화면을 벗어나거나 지나치게 좁아지던 문제를 수정했습니다. +- 해외 배송지를 등록할 때 도시·주(州) 입력칸이 좁아 내용을 확인하기 어렵던 문제를 수정했습니다. + +#### 표시 + +- 상품 상세의 쿠폰 할인 금액이 두 줄로 잘려 보이던 문제를 수정했습니다. 쿠폰이 많으면 여러 줄로 나눠 표시합니다. +- 주문 취소 화면에서 쿠폰 이름과 항목 이름이 단어 중간에서 잘려 읽기 어렵던 문제를 수정했습니다. +- 좁은 화면에서 팝업 창이 화면 가장자리에 붙어 보이던 문제를 수정했습니다. 이제 양옆에 여백이 생깁니다. + ## [1.0.1] - 2026-07-08 ### Added diff --git a/templates/_bundled/sirsoft-basic/__tests__/layouts/currencySelector.test.tsx b/templates/_bundled/sirsoft-basic/__tests__/layouts/currencySelector.test.tsx index 631e5148..68d0d2fc 100644 --- a/templates/_bundled/sirsoft-basic/__tests__/layouts/currencySelector.test.tsx +++ b/templates/_bundled/sirsoft-basic/__tests__/layouts/currencySelector.test.tsx @@ -9,10 +9,17 @@ * - 표시 통화 초기화 핸들러(initPreferredCurrency)는 sirsoft-ecommerce 모듈 소유 * (`sirsoft-ecommerce.initPreferredCurrency`). _user_base.json init_actions 가 모듈 네임스페이스로 호출. * + * 모바일 배치 (390px 오버플로 해소 후): + * - 언어·통화는 헤더 우측 그룹이 아니라 모바일 드로어 최상단(mobile_drawer_prefs)에 있다. + * 데스크톱(Header.tsx)은 기존 헤더 배치를 유지한다. 사유는 아래 해당 it 블록 주석 참조. + * - 드로어는 overflow-y-auto 라 absolute 드롭다운이 잘린다 → 주입 조각이 responsive.portable + * 오버라이드로 모바일에서만 펼친 목록이 된다(트리거 숨김 + 패널 static). + * * 회귀 차단: * - _user_base.json: defaultCurrency/preferredCurrency(_global)/availableCurrencies 주입 + X-Currency 헤더. * - init 핸들러 호출이 모듈 네임스페이스(sirsoft-ecommerce.initPreferredCurrency)로 되어 있다. * - 헤더에 통화 슬롯(SlotContainer header_currency)과 언어 버튼이 있고, Header.tsx 는 통화 코드/모듈을 모른다. + * - 데스크톱 드롭다운(absolute/z-50)은 responsive 오버라이드로 무력화되지 않는다. * * @vitest-environment jsdom */ @@ -34,6 +41,32 @@ function loadRepo(relPath: string): string { return fs.readFileSync(path.resolve(repoRoot, relPath), 'utf8'); } +/** + * 레이아웃 트리에서 id 로 노드를 찾습니다. + * + * @param node 탐색 시작 노드/배열 + * @param id 찾을 노드 id + * @return 찾은 노드 (없으면 null) + */ +function findNode(node: any, id: string): any { + if (!node || typeof node !== 'object') return null; + if (Array.isArray(node)) { + for (const n of node) { + const r = findNode(n, id); + if (r) return r; + } + return null; + } + if (node.id === id) return node; + for (const k of ['children', 'components']) { + if (node[k]) { + const r = findNode(node[k], id); + if (r) return r; + } + } + return null; +} + describe('A1 — _user_base.json 통화 주입', () => { const userBase = loadJson('layouts/_user_base.json'); const initActions = userBase.init_actions ?? []; @@ -119,31 +152,110 @@ describe('헤더 통화 슬롯(이커머스 주입) + 언어 버튼(코어 내 expect(headerTsx).toContain('currentLocale'); }); - it('모바일 헤더(_user_base.json)도 header_currency 슬롯(SlotContainer)을 마운트한다', () => { - expect(userBaseText).toContain('mobile_currency_selector_wrap'); + it('모바일 표면(_user_base.json)도 header_currency 슬롯(SlotContainer)을 마운트한다', () => { + // 마운트 위치는 헤더 우측 그룹 → 모바일 드로어로 이동했으나, 슬롯 소비 자체는 유지된다. + expect(userBaseText).toContain('mobile_drawer_currency_wrap'); expect(userBaseText).toContain('"slotId": "header_currency"'); }); - it('모바일 헤더에 언어 선택기가 통화와 같은 줄에 노출된다 (데스크톱 패리티, 4표면 일관)', () => { + /** + * 배치 반전 사유 (과거 결정의 의도적 해제): + * + * 이 자리에는 원래 `it('모바일 헤더에 언어 선택기가 통화와 같은 줄에 노출된다 + * (데스크톱 패리티, 4표면 일관)')` 이 있었고, 헤더 우측 그룹(#mobile_header_right)의 + * 직계 자식에 mobile_lang_selector_wrap / mobile_currency_selector_wrap 이 있음을 단언했다. + * + * 390px(iPhone) 실측 결과 그 배치가 사이트 전역 가로 오버플로의 단일 원인이었다: + * 우측 그룹 = theme(36)+notification(36)+cart(34)+lang(71)+currency(91)+user(30)+hamburger(30) + * = 351px, 로고 뒤 x=50 에서 시작 → 우측 끝 401px → 뷰포트 390px 를 11px 초과. + * 언어+통화만 제거하면 document.scrollWidth 가 401 → 390 으로 떨어진다. + * 320px(iPhone SE)에서는 햄버거 버튼이 화면 밖으로 밀려 내비게이션 자체가 불가능했다. + * + * 따라서 "데스크톱 패리티"는 **모바일에 한해** 의도적으로 해제하고, 언어·통화를 + * 드로어(mobile_nav_drawer > mobile_drawer_prefs) 최상단으로 옮겼다. + * 데스크톱(Header.tsx)의 배치는 그대로다 — 위 'Header.tsx' 단언들이 그것을 지킨다. + * + * 되돌리려면 먼저 390px 오버플로를 다른 방법으로 해소해야 한다. + */ + it('모바일 헤더 우측 그룹에 언어/통화가 없다 (390px 오버플로 해소 — 데스크톱 패리티 모바일 한정 해제)', () => { const userBase = loadJson('layouts/_user_base.json'); - // 모바일 헤더 우측 영역에서 언어 셀렉터와 통화 슬롯을 찾는다 - function find(node: any, id: string): any { - if (!node || typeof node !== 'object') return null; - if (Array.isArray(node)) { for (const n of node) { const r = find(n, id); if (r) return r; } return null; } - if (node.id === id) return node; - for (const k of ['children', 'components']) { if (node[k]) { const r = find(node[k], id); if (r) return r; } } - return null; - } - const mobileRight = find(userBase.components, 'mobile_header_right'); + const mobileRight = findNode(userBase.components, 'mobile_header_right'); expect(mobileRight).toBeTruthy(); const ids = (mobileRight.children ?? []).map((c: any) => c.id); - expect(ids).toContain('mobile_lang_selector_wrap'); - expect(ids).toContain('mobile_currency_selector_wrap'); - // 언어 버튼은 setLocale + 현재 로케일 코드($locale) 표기 - const langWrap = find(mobileRight, 'mobile_lang_selector_wrap'); - const raw = JSON.stringify(langWrap); - expect(raw).toContain('setLocale'); - expect(raw).toContain('{{$locale}}'); + expect(ids).not.toContain('mobile_lang_selector_wrap'); + expect(ids).not.toContain('mobile_currency_selector_wrap'); + }); + + it('언어/통화는 모바일 드로어 최상단(mobile_drawer_prefs)에 있다', () => { + const userBase = loadJson('layouts/_user_base.json'); + const drawer = findNode(userBase.components, 'mobile_nav_drawer'); + expect(drawer).toBeTruthy(); + + const prefs = findNode(drawer, 'mobile_drawer_prefs'); + expect(prefs).toBeTruthy(); + + // 언어: setLocale 액션 + $locales iteration + const prefsRaw = JSON.stringify(prefs); + expect(prefsRaw).toContain('setLocale'); + expect(prefsRaw).toContain('{{$locales}}'); + + // 통화: 슬롯 컨테이너. id 는 필수 — SlotContainer 가 같은 슬롯을 여러 컨테이너에서 + // 렌더할 때 주입 컴포넌트 root id 를 `{id}__{containerId}` 로 스코프하기 때문 + // (데스크톱 Header.tsx 와 동시 소비 → id 없으면 HTML id 중복). + const currencyWrap = findNode(prefs, 'mobile_drawer_currency_wrap'); + expect(currencyWrap).toBeTruthy(); + expect(currencyWrap.name).toBe('SlotContainer'); + expect(currencyWrap.props?.slotId).toBe('header_currency'); + }); + + /** + * 엔진의 `iteration` 은 그 속성을 가진 노드 **자신**을 항목 수만큼 복제한다. + * flex 컨테이너에 iteration 을 걸면 컨테이너가 복제되어 각 칩이 자기 컨테이너를 갖고 + * 세로로 쌓인다. 가로 나열을 유지하려면 iteration 은 반드시 Button 자신에 있어야 한다. + */ + it('드로어 언어 칩은 flex-wrap 컨테이너 + Button 에 iteration (가로 나열)', () => { + const userBase = loadJson('layouts/_user_base.json'); + const prefs = findNode(userBase.components, 'mobile_drawer_prefs'); + const langSection = (prefs.children ?? []).find( + (c: any) => typeof c.if === 'string' && c.if.includes('$locales.length') + ); + expect(langSection).toBeTruthy(); + + // [0] = 라벨, [1] = 칩 컨테이너 + const chipRow = langSection.children[1]; + expect(chipRow.props.className).toContain('flex'); + expect(chipRow.props.className).toContain('flex-wrap'); + expect(chipRow.iteration).toBeUndefined(); + + const button = chipRow.children[0]; + expect(button.name).toBe('Button'); + expect(button.iteration?.source).toBe('{{$locales}}'); + expect(button.iteration?.item_var).toBe('loc'); + expect(button.props.className).toContain('rounded-full'); + expect(button.props.className).toContain('whitespace-nowrap'); + }); + + it('드로어 언어/통화 섹션은 비회원에게도 노출된다 (아코디언 currentUser 게이트 바깥)', () => { + const userBase = loadJson('layouts/_user_base.json'); + const drawer = findNode(userBase.components, 'mobile_nav_drawer'); + const prefs = (drawer.children ?? []).find((c: any) => c.id === 'mobile_drawer_prefs'); + // 드로어의 직계 자식이어야 한다 (로그인 아코디언 `if: currentUser?.uuid` 안이면 비회원 미노출) + expect(prefs).toBeTruthy(); + expect(prefs.if).toBeUndefined(); + }); + + it('로그인 아코디언 안에 중복 언어 블록이 남아있지 않다 (드로어 단일 소스)', () => { + const userBase = loadJson('layouts/_user_base.json'); + const drawer = findNode(userBase.components, 'mobile_nav_drawer'); + const accordion = (drawer.children ?? []).find( + (c: any) => typeof c.if === 'string' && c.if.includes('currentUser?.uuid') + ); + expect(accordion).toBeTruthy(); + expect(JSON.stringify(accordion)).not.toContain('setLocale'); + }); + + it('헤더 드롭다운 잔여 상태(mobileLangMenuOpen)가 제거되었다', () => { + expect(userBaseText).not.toContain('mobileLangMenuOpen'); }); it('통화 슬롯 주입 앵커(header_currency_inject_anchor)가 _user_base 에 있다', () => { @@ -197,6 +309,40 @@ describe('이커머스 헤더 통화 주입 확장 (slot=header_currency)', () = expect(raw).not.toContain('/api/modules/sirsoft-ecommerce/user/currency'); }); + /** + * 모바일 드로어는 overflow-y-auto + w-80 이라 absolute 드롭다운 패널이 스크롤 경계에서 잘린다. + * SlotContainer 는 주입 자식에게 variant/context prop 을 전달하지 않으므로 컨테이너별로 + * 다르게 그릴 수 없다 → 주입 노드 자체에 responsive.portable(0~1023px) 오버라이드를 둔다. + */ + it('유저 확장 트리거 버튼은 portable(모바일/태블릿)에서 숨겨진다', () => { + const node = userExt.injections[0].components[0]; + const trigger = (node.children ?? []).find((c: any) => c.name === 'Button'); + expect(trigger).toBeTruthy(); + expect(trigger.responsive?.portable?.props?.className).toBe('hidden'); + }); + + it('유저 확장 패널은 portable 에서 항상 펼쳐진 정적 목록이다 (absolute/z-50 해제)', () => { + const node = userExt.injections[0].components[0]; + const panel = (node.children ?? []).find( + (c: any) => c.name === 'Div' && c.props?.role === 'listbox' + ); + expect(panel).toBeTruthy(); + + // 데스크톱 기본 경로는 그대로 (회귀 방지) + expect(panel.if).toBe('{{_local.showCurrencyDropdown}}'); + expect(panel.props.className).toContain('absolute'); + expect(panel.props.className).toContain('z-50'); + + // portable 오버라이드: if 해제 + 정적 흐름 + const portable = panel.responsive?.portable; + expect(portable).toBeTruthy(); + expect(portable.if).toBe('{{true}}'); + expect(portable.props.className).toContain('static'); + expect(portable.props.className).not.toContain('absolute'); + expect(portable.props.className).not.toContain('z-50'); + expect(portable.props.role).toBe('listbox'); + }); + it('관리자 확장이 _admin_base 에 header_currency 슬롯 + init_actions(통화 복원)를 기여한다', () => { expect(adminExt.target_layout).toBe('_admin_base'); const node = adminExt.injections[0].components[0]; diff --git a/templates/_bundled/sirsoft-basic/__tests__/layouts/mobile-viewport-overflow.test.tsx b/templates/_bundled/sirsoft-basic/__tests__/layouts/mobile-viewport-overflow.test.tsx new file mode 100644 index 00000000..4a71ebac --- /dev/null +++ b/templates/_bundled/sirsoft-basic/__tests__/layouts/mobile-viewport-overflow.test.tsx @@ -0,0 +1,325 @@ +/** + * @file mobile-viewport-overflow.test.tsx + * @description 390px(iPhone) 모바일 뷰포트 가로 오버플로/압착 회귀 차단 + * + * 배경 (Chrome DevTools 390x844x3, mobile UA 실측): + * - 헤더 우측 그룹에 언어(71px)+통화(91px)가 있어 26개 라우트 중 24개에서 + * document.scrollWidth = 401px (뷰포트 390px 대비 +11px). 320px(iPhone SE)에서는 + * 햄버거 버튼이 화면 밖으로 밀려 내비게이션 자체가 불가능했다. + * → 언어/통화를 드로어로 이동 (currencySelector.test.tsx 가 배치를 단언) + * - 비회원 댓글폼: 아바타 76px 들여쓰기 + flex-1 입력 2개 → 문서 +81px 초과 + * - 비회원 글쓰기폼: grid-cols-2 → 각 입력 147px 로 압착, placeholder 잘림 + * - 상품상세 쿠폰 칩: 라벨 Span 에 className 이 없어 39px 폭에서 2줄로 줄바꿈 + * - 부분환불 모달: 91px 3열에서 한글 쿠폰명이 단어 중간에서 잘림 + * - 해외주소 도시/주: 무접두 grid-cols-2 → 390px 에서 각 입력 155px + * - 게시글 상단 네비: 게시판명이 길수록 좌우 버튼을 압착 (390px 실측 — 5자 '이전글' 87px, + * 11자 73px, 21자 62px 로 chevron 과 텍스트가 겹침). docOverflow 는 0 이라 오버플로 + * 검사로는 잡히지 않는다. + * + * 이 파일은 위 좌표들이 되돌아가지 않도록 레이아웃 JSON 구조를 직접 단언한다. + * 2열 행의 좁은 화면 대비는 두 방식 모두 허용한다: Tailwind 접두(`grid-cols-1 sm:grid-cols-2`) + * 또는 엔진 노드 레벨 `responsive.portable`(0~1023px) 오버라이드. + * + * @vitest-environment jsdom + */ + +import { describe, it, expect } from 'vitest'; +import fs from 'node:fs'; +import path from 'node:path'; + +const layoutsDir = path.resolve(__dirname, '../../layouts'); + +/** + * 레이아웃 JSON 을 로드합니다. + * + * @param relativePath layouts/ 기준 상대 경로 + * @return 파싱된 레이아웃 객체 + */ +function loadLayout(relativePath: string): any { + return JSON.parse(fs.readFileSync(path.join(layoutsDir, relativePath), 'utf-8')); +} + +/** + * 술어를 만족하는 첫 노드를 찾습니다. + * + * @param node 탐색 시작 노드/배열 + * @param predicate 판정 함수 + * @return 찾은 노드 (없으면 null) + */ +function findNode(node: any, predicate: (n: any) => boolean): any { + if (!node || typeof node !== 'object') return null; + if (Array.isArray(node)) { + for (const n of node) { + const r = findNode(n, predicate); + if (r) return r; + } + return null; + } + if (predicate(node)) return node; + for (const k of ['children', 'components']) { + if (node[k]) { + const r = findNode(node[k], predicate); + if (r) return r; + } + } + return null; +} + +/** + * 술어를 만족하는 모든 노드를 찾습니다. + * + * @param node 탐색 시작 노드/배열 + * @param predicate 판정 함수 + * @param acc 누적 배열 (재귀 내부용) + * @return 찾은 노드 배열 + */ +function findAllNodes(node: any, predicate: (n: any) => boolean, acc: any[] = []): any[] { + if (!node || typeof node !== 'object') return acc; + if (Array.isArray(node)) { + for (const n of node) findAllNodes(n, predicate, acc); + return acc; + } + if (predicate(node)) acc.push(node); + for (const k of ['children', 'components']) { + if (node[k]) findAllNodes(node[k], predicate, acc); + } + return acc; +} + +describe('게시판 비회원 입력 행 — 좁은 화면에서 세로 스택', () => { + it('댓글 입력폼의 이름/비밀번호 행이 flex-col sm:flex-row 다 (+81px 오버플로 회귀)', () => { + const layout = loadLayout('partials/board/show/_comment_input.json'); + const guestRow = findNode( + layout, + (n) => typeof n.if === 'string' && n.if.includes('!_global.currentUser?.uuid') + ); + expect(guestRow).toBeTruthy(); + + const cls: string = guestRow.props?.className ?? ''; + expect(cls).toContain('flex-col'); + expect(cls).toContain('sm:flex-row'); + }); + + it('글쓰기폼의 이름/비밀번호 행이 grid-cols-1 sm:grid-cols-2 다 (147px 압착 회귀)', () => { + const layout = loadLayout('partials/board/form/_post_form.json'); + const guestRow = findNode( + layout, + (n) => + typeof n.if === 'string' && + n.if.includes('!_global.currentUser?.uuid') && + n.if.includes('!route.id') + ); + expect(guestRow).toBeTruthy(); + + const cls: string = guestRow.props?.className ?? ''; + expect(cls).toContain('grid-cols-1'); + expect(cls).toContain('sm:grid-cols-2'); + // 무접두 grid-cols-2 는 모바일에서 그대로 2열이 된다 + expect(cls).not.toMatch(/(^|\s)grid-cols-2(\s|$)/); + }); +}); + +describe('상품상세 쿠폰 칩 — 라벨 한 줄, 목록은 여러 줄', () => { + const layout = loadLayout('partials/shop/detail/_info_summary.json'); + + it('칩 컨테이너가 가로 스크롤 대신 줄바꿈한다', () => { + const container = findNode( + layout, + (n) => typeof n.comment === 'string' && n.comment.includes('쿠폰 배지 목록') + ); + expect(container).toBeTruthy(); + + const cls: string = container.props?.className ?? ''; + expect(cls).toContain('flex-wrap'); + // 실측상 스크롤되지 않았고(scrollWidth == clientWidth), 칩이 숨겨질 뿐이었다 + expect(cls).not.toContain('overflow-x-auto'); + }); + + it('칩 라벨(할인 금액)이 whitespace-nowrap 으로 한 줄을 유지한다', () => { + const label = findNode( + layout, + (n) => n.name === 'Span' && typeof n.text === 'string' && n.text.includes('benefit_formatted') + ); + expect(label).toBeTruthy(); + expect(label.props?.className ?? '').toContain('whitespace-nowrap'); + }); +}); + +describe('Modal 좌우 여백 — max-w-full 이 clamp 를 이기지 못하게', () => { + /** + * Modal.tsx 는 `max-w-[calc(100vw-2rem)]` 로 화면 좌우 16px 여백을 보장한다. + * 그런데 그 뒤에 `${className}` 이 붙으므로, 레이아웃이 `max-w-full`(=100%)을 주면 + * CSS 우선순위상 100% 가 이겨 모달이 화면에 딱 붙는다(390px 실측: left=0, right=390). + * + * Modal 이 스스로 clamp 하므로 `max-w-full` 은 불필요하며 해롭다. + */ + const modalFiles = [ + 'partials/mypage/orders/_modal_cancel.json', + 'partials/mypage/orders/_modal_confirm_purchase.json', + 'partials/mypage/orders/_modal_write_review.json', + ]; + + for (const file of modalFiles) { + it(`${file} 의 Modal props.className 에 max-w-full 이 없다`, () => { + const layout = loadLayout(file); + expect(layout.name).toBe('Modal'); + const cls: string = layout.props?.className ?? ''; + expect(cls.split(/\s+/)).not.toContain('max-w-full'); + }); + } + + it('Modal.tsx 패널이 max-w-[calc(100vw-2rem)] 로 화면 폭을 clamp 한다', () => { + const tsx = fs.readFileSync( + path.resolve(__dirname, '../../src/components/composite/Modal.tsx'), + 'utf-8' + ); + expect(tsx).toContain('max-w-[calc(100vw-2rem)]'); + }); +}); + +describe('부분환불 계산 모달 — 좁은 열에서 단어 중간 줄바꿈 금지', () => { + const layout = loadLayout('partials/mypage/orders/_modal_cancel.json'); + + it('행 라벨(상품쿠폰 할인 등)이 모두 break-keep 이다', () => { + // 390px 에서 3열 grid 의 첫 열은 71px — keep-all 이 없으면 "상품쿠폰 할" / "인" 으로 잘린다 + const labels = findAllNodes( + layout, + (n) => + n.name === 'Span' && + typeof n.text === 'string' && + n.text.startsWith('$t:mypage.order_detail.cancel_modal.') + ).filter((n) => (n.props?.className ?? '').includes('text-gray-600')); + + expect(labels.length).toBeGreaterThan(0); + for (const node of labels) { + expect(node.props.className).toContain('break-keep'); + } + }); + + it('쿠폰 상세 행(쿠폰명 + 할인액)이 모두 break-keep 이다', () => { + // `{{pc.name}} -{{amount}}원` 형태의 P 노드 — 91px 3열에서 한글 단어가 중간에서 잘렸다 + const couponLines = findAllNodes( + layout, + (n) => + n.name === 'P' && + typeof n.text === 'string' && + n.text.includes('.name}}') && + n.text.includes('discount_amount') + ); + expect(couponLines.length).toBeGreaterThan(0); + + for (const node of couponLines) { + expect(node.props?.className ?? '').toContain('break-keep'); + } + }); + + it('복원 쿠폰 행은 쿠폰명 break-keep + 금액 whitespace-nowrap 이다', () => { + const name = findNode( + layout, + (n) => n.name === 'Span' && typeof n.text === 'string' && n.text.includes('coupon.coupon_name') + ); + expect(name).toBeTruthy(); + expect(name.props?.className ?? '').toContain('break-keep'); + + const amount = findNode( + layout, + (n) => + n.name === 'Span' && + typeof n.text === 'string' && + n.text.includes('coupon.discount_amount') + ); + expect(amount).toBeTruthy(); + expect(amount.props?.className ?? '').toContain('whitespace-nowrap'); + }); +}); + +describe('게시글 상단 네비 — 긴 게시판명이 좌우 버튼을 압착하지 않는다', () => { + const layout = loadLayout('partials/board/show/_navigation.json'); + + it('컨테이너가 모바일에서 줄바꿈한다 (flex-wrap)', () => { + // 셋을 한 줄에 두면 게시판명이 남은 폭을 먹고 형제를 눌러버린다. + // 390px 실측: '이전글' 버튼 폭이 5자 87px → 11자 73px → 21자 62px 로 줄었다. + expect(layout.props.className).toContain('justify-between'); + + // portable(0~1023) 이 아니라 mobile(0~767). 버튼 3개 고정폭 261px + 21자 제목 자연폭 + // 323px = 584px 이므로 태블릿(콘텐츠 735px)은 한 줄로 충분하다. + expect(layout.responsive?.portable).toBeUndefined(); + const mobile: string = layout.responsive?.mobile?.props?.className ?? ''; + expect(mobile).toContain('flex-wrap'); + expect(mobile).toContain('justify-between'); + // 줄바꿈 시 두 행이 붙지 않도록 세로 gap 이 필요하다 + expect(mobile).toMatch(/\bgap-y-\d/); + }); + + it('게시판명이 모바일에서 자기 줄을 차지한다 (order-first w-full)', () => { + const title = findNode( + layout, + (n) => n.name === 'Span' && typeof n.text === 'string' && n.text.includes('board?.name') + ); + expect(title).toBeTruthy(); + + const mobile: string = title.responsive?.mobile?.props?.className ?? ''; + const tokens = mobile.split(/\s+/); + expect(tokens).toContain('order-first'); + expect(tokens).toContain('w-full'); + }); + + it('목록 버튼과 이전/다음 그룹은 shrink-0 이라 눌리지 않는다', () => { + const backBtn = findNode( + layout, + (n) => n.name === 'Button' && findNode(n, (c) => c.text === '$t:board.back_to_list') !== null + ); + expect(backBtn).toBeTruthy(); + expect(backBtn.props.className.split(/\s+/)).toContain('shrink-0'); + + // 루트 컨테이너도 이전글/다음글 을 자손으로 갖는다. 직계 자식이 두 Button 인 노드만 고른다. + const prevNextGroup = findNode( + layout, + (n) => + n.name === 'Div' && + Array.isArray(n.children) && + n.children.length === 2 && + n.children.every((c: any) => c.name === 'Button') && + findNode(n, (c: any) => c.text === '$t:board.prev') !== null && + findNode(n, (c: any) => c.text === '$t:board.next') !== null + ); + expect(prevNextGroup).toBeTruthy(); + expect(prevNextGroup.props.className.split(/\s+/)).toContain('shrink-0'); + }); +}); + +describe('해외주소 도시/주 입력 — 무접두 grid-cols-2 금지', () => { + const files = [ + 'partials/shop/_modal_address_manage.json', + 'partials/mypage/addresses/_modal_address.json', + ]; + + for (const file of files) { + it(`${file} 의 2열 행은 모두 좁은 화면 대비가 있다 (sm: 접두 또는 responsive.portable)`, () => { + const layout = loadLayout(file); + // 390px 에서 2열을 그대로 유지하는 노드를 찾는다. + // 허용되는 두 가지 대비책: + // (a) Tailwind breakpoint 접두 — "grid-cols-1 sm:grid-cols-2" + // (b) 엔진 노드 레벨 responsive.portable(0~1023px) 오버라이드 — 받는분/연락처 행 패턴 + const offenders = findAllNodes(layout, (n) => { + const cls = n.props?.className; + if (typeof cls !== 'string' || !cls.split(/\s+/).includes('grid-cols-2')) return false; + const portableCls = n.responsive?.portable?.props?.className; + const portableIsSingleColumn = + typeof portableCls === 'string' && portableCls.split(/\s+/).includes('grid-cols-1'); + return !portableIsSingleColumn; + }); + expect(offenders.map((n) => n.props.className)).toEqual([]); + }); + + it(`${file} 의 도시/주 행은 grid-cols-1 sm:grid-cols-2 다`, () => { + const layout = loadLayout(file); + const row = findNode(layout, (n) => { + const cls = n.props?.className; + return typeof cls === 'string' && cls.includes('sm:grid-cols-2') && cls.includes('gap-2'); + }); + expect(row).toBeTruthy(); + expect(row.props.className.split(/\s+/)).toContain('grid-cols-1'); + }); + } +}); diff --git a/templates/_bundled/sirsoft-basic/dist/css/components.css b/templates/_bundled/sirsoft-basic/dist/css/components.css index 63e26ca5..7deaa6ab 100644 --- a/templates/_bundled/sirsoft-basic/dist/css/components.css +++ b/templates/_bundled/sirsoft-basic/dist/css/components.css @@ -1 +1 @@ -@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-pan-x:initial;--tw-pan-y:initial;--tw-pinch-zoom:initial;--tw-scroll-snap-strictness:proximity;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-x-reverse:0;--tw-border-style:solid;--tw-divide-y-reverse:0;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:""}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-100:oklch(93.6% .032 17.717);--color-red-200:oklch(88.5% .062 18.334);--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-800:oklch(44.4% .177 26.899);--color-red-900:oklch(39.6% .141 25.723);--color-red-950:oklch(25.8% .092 26.042);--color-orange-50:oklch(98% .016 73.684);--color-orange-100:oklch(95.4% .038 75.164);--color-orange-200:oklch(90.1% .076 70.697);--color-orange-300:oklch(83.7% .128 66.29);--color-orange-400:oklch(75% .183 55.934);--color-orange-500:oklch(70.5% .213 47.604);--color-orange-600:oklch(64.6% .222 41.116);--color-orange-700:oklch(55.3% .195 38.402);--color-orange-800:oklch(47% .157 37.304);--color-orange-900:oklch(40.8% .123 38.172);--color-orange-950:oklch(26.6% .079 36.259);--color-amber-50:oklch(98.7% .022 95.277);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-900:oklch(41.4% .112 45.904);--color-amber-950:oklch(27.9% .077 45.635);--color-yellow-50:oklch(98.7% .026 102.212);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-200:oklch(94.5% .129 101.54);--color-yellow-300:oklch(90.5% .182 98.111);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-yellow-700:oklch(55.4% .135 66.442);--color-yellow-800:oklch(47.6% .114 61.907);--color-yellow-900:oklch(42.1% .095 57.708);--color-yellow-950:oklch(28.6% .066 53.813);--color-lime-50:oklch(98.6% .031 120.757);--color-lime-100:oklch(96.7% .067 122.328);--color-lime-200:oklch(93.8% .127 124.321);--color-lime-300:oklch(89.7% .196 126.665);--color-lime-400:oklch(84.1% .238 128.85);--color-lime-500:oklch(76.8% .233 130.85);--color-lime-600:oklch(64.8% .2 131.684);--color-lime-700:oklch(53.2% .157 131.589);--color-lime-800:oklch(45.3% .124 130.933);--color-lime-900:oklch(40.5% .101 131.063);--color-lime-950:oklch(27.4% .072 132.109);--color-green-50:oklch(98.2% .018 155.826);--color-green-100:oklch(96.2% .044 156.743);--color-green-200:oklch(92.5% .084 155.995);--color-green-300:oklch(87.1% .15 154.449);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-green-900:oklch(39.3% .095 152.535);--color-green-950:oklch(26.6% .065 152.934);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-100:oklch(95% .052 163.051);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-600:oklch(59.6% .145 163.225);--color-emerald-700:oklch(50.8% .118 165.612);--color-emerald-800:oklch(43.2% .095 166.913);--color-emerald-900:oklch(37.8% .077 168.94);--color-emerald-950:oklch(26.2% .051 172.552);--color-teal-50:oklch(98.4% .014 180.72);--color-teal-100:oklch(95.3% .051 180.801);--color-teal-200:oklch(91% .096 180.426);--color-teal-300:oklch(85.5% .138 181.071);--color-teal-400:oklch(77.7% .152 181.912);--color-teal-500:oklch(70.4% .14 182.503);--color-teal-600:oklch(60% .118 184.704);--color-teal-700:oklch(51.1% .096 186.391);--color-teal-800:oklch(43.7% .078 188.216);--color-teal-900:oklch(38.6% .063 188.416);--color-teal-950:oklch(27.7% .046 192.524);--color-cyan-50:oklch(98.4% .019 200.873);--color-cyan-100:oklch(95.6% .045 203.388);--color-cyan-200:oklch(91.7% .08 205.041);--color-cyan-300:oklch(86.5% .127 207.078);--color-cyan-400:oklch(78.9% .154 211.53);--color-cyan-500:oklch(71.5% .143 215.221);--color-cyan-600:oklch(60.9% .126 221.723);--color-cyan-700:oklch(52% .105 223.128);--color-cyan-800:oklch(45% .085 224.283);--color-cyan-900:oklch(39.8% .07 227.392);--color-cyan-950:oklch(30.2% .056 229.695);--color-sky-50:oklch(97.7% .013 236.62);--color-sky-100:oklch(95.1% .026 236.824);--color-sky-200:oklch(90.1% .058 230.902);--color-sky-300:oklch(82.8% .111 230.318);--color-sky-400:oklch(74.6% .16 232.661);--color-sky-500:oklch(68.5% .169 237.323);--color-sky-600:oklch(58.8% .158 241.966);--color-sky-700:oklch(50% .134 242.749);--color-sky-800:oklch(44.3% .11 240.79);--color-sky-900:oklch(39.1% .09 240.876);--color-sky-950:oklch(29.3% .066 243.157);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-blue-950:oklch(28.2% .091 267.935);--color-indigo-50:oklch(96.2% .018 272.314);--color-indigo-100:oklch(93% .034 272.788);--color-indigo-200:oklch(87% .065 274.039);--color-indigo-300:oklch(78.5% .115 274.713);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-indigo-600:oklch(51.1% .262 276.966);--color-indigo-700:oklch(45.7% .24 277.023);--color-indigo-800:oklch(39.8% .195 277.366);--color-indigo-900:oklch(35.9% .144 278.697);--color-indigo-950:oklch(25.7% .09 281.288);--color-violet-50:oklch(96.9% .016 293.756);--color-violet-100:oklch(94.3% .029 294.588);--color-violet-200:oklch(89.4% .057 293.283);--color-violet-300:oklch(81.1% .111 293.571);--color-violet-400:oklch(70.2% .183 293.541);--color-violet-500:oklch(60.6% .25 292.717);--color-violet-600:oklch(54.1% .281 293.009);--color-violet-700:oklch(49.1% .27 292.581);--color-violet-800:oklch(43.2% .232 292.759);--color-violet-900:oklch(38% .189 293.745);--color-violet-950:oklch(28.3% .141 291.089);--color-purple-50:oklch(97.7% .014 308.299);--color-purple-100:oklch(94.6% .033 307.174);--color-purple-200:oklch(90.2% .063 306.703);--color-purple-300:oklch(82.7% .119 306.383);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-purple-600:oklch(55.8% .288 302.321);--color-purple-700:oklch(49.6% .265 301.924);--color-purple-800:oklch(43.8% .218 303.724);--color-purple-900:oklch(38.1% .176 304.987);--color-purple-950:oklch(29.1% .149 302.717);--color-fuchsia-50:oklch(97.7% .017 320.058);--color-fuchsia-100:oklch(95.2% .037 318.852);--color-fuchsia-200:oklch(90.3% .076 319.62);--color-fuchsia-300:oklch(83.3% .145 321.434);--color-fuchsia-400:oklch(74% .238 322.16);--color-fuchsia-500:oklch(66.7% .295 322.15);--color-fuchsia-600:oklch(59.1% .293 322.896);--color-fuchsia-700:oklch(51.8% .253 323.949);--color-fuchsia-800:oklch(45.2% .211 324.591);--color-fuchsia-900:oklch(40.1% .17 325.612);--color-fuchsia-950:oklch(29.3% .136 325.661);--color-pink-50:oklch(97.1% .014 343.198);--color-pink-100:oklch(94.8% .028 342.258);--color-pink-200:oklch(89.9% .061 343.231);--color-pink-300:oklch(82.3% .12 346.018);--color-pink-400:oklch(71.8% .202 349.761);--color-pink-500:oklch(65.6% .241 354.308);--color-pink-600:oklch(59.2% .249 .584);--color-pink-700:oklch(52.5% .223 3.958);--color-pink-800:oklch(45.9% .187 3.815);--color-pink-900:oklch(40.8% .153 2.432);--color-pink-950:oklch(28.4% .109 3.907);--color-rose-50:oklch(96.9% .015 12.422);--color-rose-100:oklch(94.1% .03 12.58);--color-rose-200:oklch(89.2% .058 10.001);--color-rose-300:oklch(81% .117 11.638);--color-rose-400:oklch(71.2% .194 13.428);--color-rose-500:oklch(64.5% .246 16.439);--color-rose-600:oklch(58.6% .253 17.585);--color-rose-700:oklch(51.4% .222 16.935);--color-rose-800:oklch(45.5% .188 13.697);--color-rose-900:oklch(41% .159 10.272);--color-rose-950:oklch(27.1% .105 12.094);--color-slate-50:oklch(98.4% .003 247.858);--color-slate-100:oklch(96.8% .007 247.896);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-600:oklch(44.6% .043 257.281);--color-slate-700:oklch(37.2% .044 257.287);--color-slate-800:oklch(27.9% .041 260.031);--color-slate-900:oklch(20.8% .042 265.755);--color-slate-950:oklch(12.9% .042 264.695);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-gray-950:oklch(13% .028 261.692);--color-zinc-50:oklch(98.5% 0 0);--color-zinc-100:oklch(96.7% .001 286.375);--color-zinc-200:oklch(92% .004 286.32);--color-zinc-300:oklch(87.1% .006 286.286);--color-zinc-400:oklch(70.5% .015 286.067);--color-zinc-500:oklch(55.2% .016 285.938);--color-zinc-600:oklch(44.2% .017 285.786);--color-zinc-700:oklch(37% .013 285.805);--color-zinc-800:oklch(27.4% .006 286.033);--color-zinc-900:oklch(21% .006 285.885);--color-zinc-950:oklch(14.1% .005 285.823);--color-neutral-50:oklch(98.5% 0 0);--color-neutral-100:oklch(97% 0 0);--color-neutral-200:oklch(92.2% 0 0);--color-neutral-300:oklch(87% 0 0);--color-neutral-400:oklch(70.8% 0 0);--color-neutral-500:oklch(55.6% 0 0);--color-neutral-600:oklch(43.9% 0 0);--color-neutral-700:oklch(37.1% 0 0);--color-neutral-800:oklch(26.9% 0 0);--color-neutral-900:oklch(20.5% 0 0);--color-neutral-950:oklch(14.5% 0 0);--color-stone-50:oklch(98.5% .001 106.423);--color-stone-100:oklch(97% .001 106.424);--color-stone-200:oklch(92.3% .003 48.717);--color-stone-300:oklch(86.9% .005 56.366);--color-stone-400:oklch(70.9% .01 56.259);--color-stone-500:oklch(55.3% .013 58.071);--color-stone-600:oklch(44.4% .011 73.639);--color-stone-700:oklch(37.4% .01 67.558);--color-stone-800:oklch(26.8% .007 34.298);--color-stone-900:oklch(21.6% .006 56.043);--color-stone-950:oklch(14.7% .004 49.25);--color-black:#000;--color-white:#fff;--spacing:.25rem;--breakpoint-sm:40rem;--breakpoint-md:48rem;--breakpoint-lg:64rem;--breakpoint-xl:80rem;--breakpoint-2xl:96rem;--container-3xs:16rem;--container-2xs:18rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-5xl:64rem;--container-6xl:72rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5/2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--text-7xl:4.5rem;--text-7xl--line-height:1;--text-8xl:6rem;--text-8xl--line-height:1;--text-9xl:8rem;--text-9xl--line-height:1;--font-weight-thin:100;--font-weight-extralight:200;--font-weight-light:300;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--font-weight-black:900;--tracking-tighter:-.05em;--tracking-tight:-.025em;--tracking-normal:0em;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-tight:1.25;--leading-snug:1.375;--leading-normal:1.5;--leading-relaxed:1.625;--leading-loose:2;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--radius-3xl:1.5rem;--drop-shadow-sm:0 1px 2px #00000026;--drop-shadow-md:0 3px 3px #0000001f;--drop-shadow-lg:0 4px 4px #00000026;--drop-shadow-xl:0 9px 7px #0000001a;--drop-shadow-2xl:0 25px 25px #00000026;--ease-in:cubic-bezier(.4,0,1,1);--ease-out:cubic-bezier(0,0,.2,1);--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0,0,.2,1)infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--animate-bounce:bounce 1s infinite;--blur-sm:8px;--blur-md:12px;--blur-lg:16px;--blur-xl:24px;--blur-2xl:40px;--blur-3xl:64px;--aspect-video:16/9;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-primary-50:#eff6ff;--color-primary-100:#dbeafe;--color-primary-400:#60a5fa;--color-primary-500:#3b82f6;--color-primary-600:#2563eb;--color-primary-700:#1d4ed8;--color-primary-900:#1e3a8a}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:root{--background:255 255 255;--foreground:17 24 39}.dark{--background:17 24 39;--foreground:255 255 255}html{scroll-behavior:smooth}body{background-color:var(--color-white);color:var(--color-gray-900)}.dark :is(body){background-color:var(--color-gray-900);color:var(--color-white)}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif}a{color:var(--color-blue-600)}@media(hover:hover){a:hover{color:var(--color-blue-700)}}.dark :is(a){color:var(--color-blue-400)}@media(hover:hover){.dark :is(a):hover{color:var(--color-blue-300)}}a{text-decoration:none}:focus-visible{outline-style:var(--tw-outline-style);outline-offset:2px;outline-width:2px;outline-color:var(--color-blue-500)}}@layer components{.flex-between{justify-content:space-between;align-items:center;display:flex}.btn{border-radius:var(--radius-lg);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));justify-content:center;align-items:center;display:inline-flex}.btn:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color);--tw-outline-style:none;outline-style:none}.btn:disabled{cursor:not-allowed;opacity:.5}.btn-primary{background-color:var(--color-blue-600);color:var(--color-white)}@media(hover:hover){.btn-primary:hover{background-color:var(--color-blue-700)}}.btn-primary:focus{--tw-ring-color:var(--color-blue-500)}.dark .btn-primary{background-color:var(--color-blue-500)}@media(hover:hover){.dark .btn-primary:hover{background-color:var(--color-blue-600)}}.dark .btn-primary:focus{--tw-ring-color:var(--color-blue-400)}.btn-secondary{background-color:var(--color-gray-100);color:var(--color-gray-900)}@media(hover:hover){.btn-secondary:hover{background-color:var(--color-gray-200)}}.btn-secondary:focus{--tw-ring-color:var(--color-gray-500)}.dark .btn-secondary{background-color:var(--color-gray-700);color:var(--color-white)}@media(hover:hover){.dark .btn-secondary:hover{background-color:var(--color-gray-600)}}.dark .btn-secondary:focus{--tw-ring-color:var(--color-gray-400)}.btn-ghost{color:var(--color-gray-700);background-color:#0000}@media(hover:hover){.btn-ghost:hover{background-color:var(--color-gray-100)}}.btn-ghost:focus{--tw-ring-color:var(--color-gray-500)}.dark .btn-ghost{color:var(--color-gray-300)}@media(hover:hover){.dark .btn-ghost:hover{background-color:var(--color-gray-800)}}.dark .btn-ghost:focus{--tw-ring-color:var(--color-gray-400)}.btn-danger{background-color:var(--color-red-600);color:var(--color-white)}@media(hover:hover){.btn-danger:hover{background-color:var(--color-red-700)}}.btn-danger:focus{--tw-ring-color:var(--color-red-500)}.dark .btn-danger{background-color:var(--color-red-500)}@media(hover:hover){.dark .btn-danger:hover{background-color:var(--color-red-600)}}.dark .btn-danger:focus{--tw-ring-color:var(--color-red-400)}.input{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-gray-300);width:100%;padding-inline:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*2);background-color:var(--color-white);color:var(--color-gray-900)}.input:focus{border-color:var(--color-blue-500);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--color-blue-500)}.dark .input{border-color:var(--color-gray-600);background-color:var(--color-gray-800);color:var(--color-white)}.input::placeholder{color:var(--color-gray-400)}.dark .input::placeholder{color:var(--color-gray-500)}.input-error{border-color:var(--color-red-500)}.input-error:focus{border-color:var(--color-red-500);--tw-ring-color:var(--color-red-500)}.card{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-gray-200);background-color:var(--color-white);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.dark .card{border-color:var(--color-gray-700);background-color:var(--color-gray-800)}.badge{padding-inline:calc(var(--spacing)*2.5);padding-block:calc(var(--spacing)*.5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);border-radius:3.40282e38px;align-items:center;display:inline-flex}.badge-primary{background-color:var(--color-blue-100);color:var(--color-blue-800)}.dark .badge-primary{background-color:var(--color-blue-900);color:var(--color-blue-200)}.badge-success{background-color:var(--color-green-100);color:var(--color-green-800)}.dark .badge-success{background-color:var(--color-green-900);color:var(--color-green-200)}.badge-warning{background-color:var(--color-yellow-100);color:var(--color-yellow-800)}.dark .badge-warning{background-color:var(--color-yellow-900);color:var(--color-yellow-200)}.badge-danger{background-color:var(--color-red-100);color:var(--color-red-800)}.dark .badge-danger{background-color:var(--color-red-900);color:var(--color-red-200)}}@layer utilities{.\@container{container-type:inline-size}.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing)*0)}.inset-1{inset:calc(var(--spacing)*1)}.inset-2{inset:calc(var(--spacing)*2)}.inset-3{inset:calc(var(--spacing)*3)}.inset-4{inset:calc(var(--spacing)*4)}.inset-5{inset:calc(var(--spacing)*5)}.inset-6{inset:calc(var(--spacing)*6)}.inset-8{inset:calc(var(--spacing)*8)}.inset-auto{inset:auto}.inset-x-0{inset-inline:calc(var(--spacing)*0)}.inset-x-1{inset-inline:calc(var(--spacing)*1)}.inset-x-2{inset-inline:calc(var(--spacing)*2)}.inset-x-3{inset-inline:calc(var(--spacing)*3)}.inset-x-4{inset-inline:calc(var(--spacing)*4)}.inset-x-auto{inset-inline:auto}.inset-y-0{inset-block:calc(var(--spacing)*0)}.inset-y-1{inset-block:calc(var(--spacing)*1)}.inset-y-2{inset-block:calc(var(--spacing)*2)}.inset-y-3{inset-block:calc(var(--spacing)*3)}.inset-y-4{inset-block:calc(var(--spacing)*4)}.inset-y-auto{inset-block:auto}.-top-1{top:calc(var(--spacing)*-1)}.-top-2{top:calc(var(--spacing)*-2)}.-top-3{top:calc(var(--spacing)*-3)}.-top-4{top:calc(var(--spacing)*-4)}.top-0{top:calc(var(--spacing)*0)}.top-1{top:calc(var(--spacing)*1)}.top-1\.5{top:calc(var(--spacing)*1.5)}.top-1\/2{top:50%}.top-1\/3{top:33.3333%}.top-1\/4{top:25%}.top-2{top:calc(var(--spacing)*2)}.top-2\/3{top:66.6667%}.top-3{top:calc(var(--spacing)*3)}.top-3\/4{top:75%}.top-4{top:calc(var(--spacing)*4)}.top-5{top:calc(var(--spacing)*5)}.top-6{top:calc(var(--spacing)*6)}.top-8{top:calc(var(--spacing)*8)}.top-10{top:calc(var(--spacing)*10)}.top-12{top:calc(var(--spacing)*12)}.top-16{top:calc(var(--spacing)*16)}.top-24{top:calc(var(--spacing)*24)}.top-auto{top:auto}.top-full{top:100%}.-right-1{right:calc(var(--spacing)*-1)}.-right-2{right:calc(var(--spacing)*-2)}.-right-3{right:calc(var(--spacing)*-3)}.-right-4{right:calc(var(--spacing)*-4)}.right-0{right:calc(var(--spacing)*0)}.right-1{right:calc(var(--spacing)*1)}.right-1\/2{right:50%}.right-2{right:calc(var(--spacing)*2)}.right-3{right:calc(var(--spacing)*3)}.right-4{right:calc(var(--spacing)*4)}.right-5{right:calc(var(--spacing)*5)}.right-6{right:calc(var(--spacing)*6)}.right-8{right:calc(var(--spacing)*8)}.right-10{right:calc(var(--spacing)*10)}.right-12{right:calc(var(--spacing)*12)}.right-16{right:calc(var(--spacing)*16)}.right-auto{right:auto}.right-full{right:100%}.-bottom-1{bottom:calc(var(--spacing)*-1)}.-bottom-2{bottom:calc(var(--spacing)*-2)}.-bottom-3{bottom:calc(var(--spacing)*-3)}.-bottom-4{bottom:calc(var(--spacing)*-4)}.bottom-0{bottom:calc(var(--spacing)*0)}.bottom-1{bottom:calc(var(--spacing)*1)}.bottom-1\/2{bottom:50%}.bottom-2{bottom:calc(var(--spacing)*2)}.bottom-3{bottom:calc(var(--spacing)*3)}.bottom-4{bottom:calc(var(--spacing)*4)}.bottom-5{bottom:calc(var(--spacing)*5)}.bottom-6{bottom:calc(var(--spacing)*6)}.bottom-8{bottom:calc(var(--spacing)*8)}.bottom-10{bottom:calc(var(--spacing)*10)}.bottom-12{bottom:calc(var(--spacing)*12)}.bottom-16{bottom:calc(var(--spacing)*16)}.bottom-auto{bottom:auto}.bottom-full{bottom:100%}.-left-1{left:calc(var(--spacing)*-1)}.-left-2{left:calc(var(--spacing)*-2)}.-left-3{left:calc(var(--spacing)*-3)}.-left-4{left:calc(var(--spacing)*-4)}.left-0{left:calc(var(--spacing)*0)}.left-1{left:calc(var(--spacing)*1)}.left-1\.5{left:calc(var(--spacing)*1.5)}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing)*2)}.left-3{left:calc(var(--spacing)*3)}.left-4{left:calc(var(--spacing)*4)}.left-5{left:calc(var(--spacing)*5)}.left-6{left:calc(var(--spacing)*6)}.left-8{left:calc(var(--spacing)*8)}.left-10{left:calc(var(--spacing)*10)}.left-12{left:calc(var(--spacing)*12)}.left-16{left:calc(var(--spacing)*16)}.left-auto{left:auto}.left-full{left:100%}.isolate{isolation:isolate}.isolation-auto{isolation:auto}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[9999\]{z-index:9999}.z-auto{z-index:auto}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-first{order:-9999}.order-last{order:9999}.order-none{order:0}.col-span-1{grid-column:span 1/span 1}.col-span-2{grid-column:span 2/span 2}.col-span-3{grid-column:span 3/span 3}.col-span-4{grid-column:span 4/span 4}.col-span-5{grid-column:span 5/span 5}.col-span-6{grid-column:span 6/span 6}.col-span-7{grid-column:span 7/span 7}.col-span-8{grid-column:span 8/span 8}.col-span-9{grid-column:span 9/span 9}.col-span-10{grid-column:span 10/span 10}.col-span-11{grid-column:span 11/span 11}.col-span-12{grid-column:span 12/span 12}.col-span-full{grid-column:1/-1}.col-start-1{grid-column-start:1}.col-start-2{grid-column-start:2}.col-start-3{grid-column-start:3}.col-start-4{grid-column-start:4}.col-start-5{grid-column-start:5}.col-start-6{grid-column-start:6}.col-start-7{grid-column-start:7}.col-start-8{grid-column-start:8}.col-start-9{grid-column-start:9}.col-start-10{grid-column-start:10}.col-start-11{grid-column-start:11}.col-start-12{grid-column-start:12}.col-start-13{grid-column-start:13}.col-end-1{grid-column-end:1}.col-end-2{grid-column-end:2}.col-end-3{grid-column-end:3}.col-end-4{grid-column-end:4}.col-end-5{grid-column-end:5}.col-end-6{grid-column-end:6}.col-end-7{grid-column-end:7}.col-end-8{grid-column-end:8}.col-end-9{grid-column-end:9}.col-end-10{grid-column-end:10}.col-end-11{grid-column-end:11}.col-end-12{grid-column-end:12}.col-end-13{grid-column-end:13}.row-span-1{grid-row:span 1/span 1}.row-span-2{grid-row:span 2/span 2}.row-span-3{grid-row:span 3/span 3}.row-span-4{grid-row:span 4/span 4}.row-span-5{grid-row:span 5/span 5}.row-span-6{grid-row:span 6/span 6}.row-span-full{grid-row:1/-1}.row-start-1{grid-row-start:1}.row-start-2{grid-row-start:2}.row-start-3{grid-row-start:3}.row-start-4{grid-row-start:4}.row-start-5{grid-row-start:5}.row-start-6{grid-row-start:6}.row-start-7{grid-row-start:7}.row-end-1{grid-row-end:1}.row-end-2{grid-row-end:2}.row-end-3{grid-row-end:3}.row-end-4{grid-row-end:4}.row-end-5{grid-row-end:5}.row-end-6{grid-row-end:6}.row-end-7{grid-row-end:7}.float-end{float:inline-end}.float-left{float:left}.float-none{float:none}.float-right{float:right}.float-start{float:inline-start}.clear-both{clear:both}.clear-end{clear:inline-end}.clear-left{clear:left}.clear-none{clear:none}.clear-right{clear:right}.clear-start{clear:inline-start}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.-m-1{margin:calc(var(--spacing)*-1)}.-m-2{margin:calc(var(--spacing)*-2)}.-m-3{margin:calc(var(--spacing)*-3)}.-m-4{margin:calc(var(--spacing)*-4)}.-m-5{margin:calc(var(--spacing)*-5)}.-m-6{margin:calc(var(--spacing)*-6)}.-m-8{margin:calc(var(--spacing)*-8)}.m-0{margin:calc(var(--spacing)*0)}.m-1{margin:calc(var(--spacing)*1)}.m-2{margin:calc(var(--spacing)*2)}.m-3{margin:calc(var(--spacing)*3)}.m-4{margin:calc(var(--spacing)*4)}.m-5{margin:calc(var(--spacing)*5)}.m-6{margin:calc(var(--spacing)*6)}.m-8{margin:calc(var(--spacing)*8)}.m-10{margin:calc(var(--spacing)*10)}.m-12{margin:calc(var(--spacing)*12)}.m-16{margin:calc(var(--spacing)*16)}.m-auto{margin:auto}.-mx-1{margin-inline:calc(var(--spacing)*-1)}.-mx-2{margin-inline:calc(var(--spacing)*-2)}.-mx-3{margin-inline:calc(var(--spacing)*-3)}.-mx-4{margin-inline:calc(var(--spacing)*-4)}.-mx-5{margin-inline:calc(var(--spacing)*-5)}.-mx-6{margin-inline:calc(var(--spacing)*-6)}.-mx-8{margin-inline:calc(var(--spacing)*-8)}.mx-0{margin-inline:calc(var(--spacing)*0)}.mx-1{margin-inline:calc(var(--spacing)*1)}.mx-2{margin-inline:calc(var(--spacing)*2)}.mx-3{margin-inline:calc(var(--spacing)*3)}.mx-4{margin-inline:calc(var(--spacing)*4)}.mx-5{margin-inline:calc(var(--spacing)*5)}.mx-6{margin-inline:calc(var(--spacing)*6)}.mx-8{margin-inline:calc(var(--spacing)*8)}.mx-10{margin-inline:calc(var(--spacing)*10)}.mx-12{margin-inline:calc(var(--spacing)*12)}.mx-16{margin-inline:calc(var(--spacing)*16)}.mx-auto{margin-inline:auto}.-my-1{margin-block:calc(var(--spacing)*-1)}.-my-2{margin-block:calc(var(--spacing)*-2)}.-my-3{margin-block:calc(var(--spacing)*-3)}.-my-4{margin-block:calc(var(--spacing)*-4)}.-my-5{margin-block:calc(var(--spacing)*-5)}.-my-6{margin-block:calc(var(--spacing)*-6)}.-my-8{margin-block:calc(var(--spacing)*-8)}.my-0{margin-block:calc(var(--spacing)*0)}.my-1{margin-block:calc(var(--spacing)*1)}.my-2{margin-block:calc(var(--spacing)*2)}.my-3{margin-block:calc(var(--spacing)*3)}.my-4{margin-block:calc(var(--spacing)*4)}.my-5{margin-block:calc(var(--spacing)*5)}.my-6{margin-block:calc(var(--spacing)*6)}.my-8{margin-block:calc(var(--spacing)*8)}.my-10{margin-block:calc(var(--spacing)*10)}.my-12{margin-block:calc(var(--spacing)*12)}.my-16{margin-block:calc(var(--spacing)*16)}.my-auto{margin-block:auto}.-mt-1{margin-top:calc(var(--spacing)*-1)}.-mt-2{margin-top:calc(var(--spacing)*-2)}.-mt-3{margin-top:calc(var(--spacing)*-3)}.-mt-4{margin-top:calc(var(--spacing)*-4)}.-mt-5{margin-top:calc(var(--spacing)*-5)}.-mt-6{margin-top:calc(var(--spacing)*-6)}.-mt-8{margin-top:calc(var(--spacing)*-8)}.mt-0{margin-top:calc(var(--spacing)*0)}.mt-0\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-1\.5{margin-top:calc(var(--spacing)*1.5)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-5{margin-top:calc(var(--spacing)*5)}.mt-6{margin-top:calc(var(--spacing)*6)}.mt-8{margin-top:calc(var(--spacing)*8)}.mt-10{margin-top:calc(var(--spacing)*10)}.mt-12{margin-top:calc(var(--spacing)*12)}.mt-16{margin-top:calc(var(--spacing)*16)}.mt-auto{margin-top:auto}.-mr-1{margin-right:calc(var(--spacing)*-1)}.-mr-2{margin-right:calc(var(--spacing)*-2)}.-mr-3{margin-right:calc(var(--spacing)*-3)}.-mr-4{margin-right:calc(var(--spacing)*-4)}.-mr-5{margin-right:calc(var(--spacing)*-5)}.-mr-6{margin-right:calc(var(--spacing)*-6)}.-mr-8{margin-right:calc(var(--spacing)*-8)}.mr-0{margin-right:calc(var(--spacing)*0)}.mr-1{margin-right:calc(var(--spacing)*1)}.mr-1\.5{margin-right:calc(var(--spacing)*1.5)}.mr-2{margin-right:calc(var(--spacing)*2)}.mr-3{margin-right:calc(var(--spacing)*3)}.mr-4{margin-right:calc(var(--spacing)*4)}.mr-5{margin-right:calc(var(--spacing)*5)}.mr-6{margin-right:calc(var(--spacing)*6)}.mr-8{margin-right:calc(var(--spacing)*8)}.mr-10{margin-right:calc(var(--spacing)*10)}.mr-12{margin-right:calc(var(--spacing)*12)}.mr-16{margin-right:calc(var(--spacing)*16)}.mr-auto{margin-right:auto}.-mb-1{margin-bottom:calc(var(--spacing)*-1)}.-mb-2{margin-bottom:calc(var(--spacing)*-2)}.-mb-3{margin-bottom:calc(var(--spacing)*-3)}.-mb-4{margin-bottom:calc(var(--spacing)*-4)}.-mb-5{margin-bottom:calc(var(--spacing)*-5)}.-mb-6{margin-bottom:calc(var(--spacing)*-6)}.-mb-8{margin-bottom:calc(var(--spacing)*-8)}.mb-0{margin-bottom:calc(var(--spacing)*0)}.mb-0\.5{margin-bottom:calc(var(--spacing)*.5)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-1\.5{margin-bottom:calc(var(--spacing)*1.5)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-5{margin-bottom:calc(var(--spacing)*5)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.mb-8{margin-bottom:calc(var(--spacing)*8)}.mb-10{margin-bottom:calc(var(--spacing)*10)}.mb-12{margin-bottom:calc(var(--spacing)*12)}.mb-16{margin-bottom:calc(var(--spacing)*16)}.mb-auto{margin-bottom:auto}.-ml-1{margin-left:calc(var(--spacing)*-1)}.-ml-2{margin-left:calc(var(--spacing)*-2)}.-ml-3{margin-left:calc(var(--spacing)*-3)}.-ml-4{margin-left:calc(var(--spacing)*-4)}.-ml-5{margin-left:calc(var(--spacing)*-5)}.-ml-6{margin-left:calc(var(--spacing)*-6)}.-ml-8{margin-left:calc(var(--spacing)*-8)}.ml-0{margin-left:calc(var(--spacing)*0)}.ml-0\.5{margin-left:calc(var(--spacing)*.5)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-1\.5{margin-left:calc(var(--spacing)*1.5)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-3{margin-left:calc(var(--spacing)*3)}.ml-4{margin-left:calc(var(--spacing)*4)}.ml-5{margin-left:calc(var(--spacing)*5)}.ml-6{margin-left:calc(var(--spacing)*6)}.ml-8{margin-left:calc(var(--spacing)*8)}.ml-10{margin-left:calc(var(--spacing)*10)}.ml-12{margin-left:calc(var(--spacing)*12)}.ml-14{margin-left:calc(var(--spacing)*14)}.ml-16{margin-left:calc(var(--spacing)*16)}.ml-auto{margin-left:auto}.box-border{box-sizing:border-box}.box-content{box-sizing:content-box}.block{display:block}.contents{display:contents}.flex{display:flex}.flow-root{display:flow-root}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.inline-grid{display:inline-grid}.inline-table{display:inline-table}.list-item{display:list-item}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-column{display:table-column}.table-column-group{display:table-column-group}.table-footer-group{display:table-footer-group}.table-header-group{display:table-header-group}.table-row{display:table-row}.table-row-group{display:table-row-group}.aspect-\[4\/3\]{aspect-ratio:4/3}.aspect-auto{aspect-ratio:auto}.aspect-square{aspect-ratio:1}.aspect-video{aspect-ratio:var(--aspect-video)}.h-0{height:calc(var(--spacing)*0)}.h-1{height:calc(var(--spacing)*1)}.h-1\/2{height:50%}.h-1\/3{height:33.3333%}.h-1\/4{height:25%}.h-1\/5{height:20%}.h-1\/6{height:16.6667%}.h-2{height:calc(var(--spacing)*2)}.h-2\.5{height:calc(var(--spacing)*2.5)}.h-2\/3{height:66.6667%}.h-2\/4{height:50%}.h-2\/5{height:40%}.h-3{height:calc(var(--spacing)*3)}.h-3\.5{height:calc(var(--spacing)*3.5)}.h-3\/4{height:75%}.h-3\/5{height:60%}.h-4{height:calc(var(--spacing)*4)}.h-4\/5{height:80%}.h-5{height:calc(var(--spacing)*5)}.h-5\/6{height:83.3333%}.h-6{height:calc(var(--spacing)*6)}.h-7{height:calc(var(--spacing)*7)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-10{height:calc(var(--spacing)*10)}.h-12{height:calc(var(--spacing)*12)}.h-14{height:calc(var(--spacing)*14)}.h-16{height:calc(var(--spacing)*16)}.h-20{height:calc(var(--spacing)*20)}.h-24{height:calc(var(--spacing)*24)}.h-32{height:calc(var(--spacing)*32)}.h-40{height:calc(var(--spacing)*40)}.h-48{height:calc(var(--spacing)*48)}.h-56{height:calc(var(--spacing)*56)}.h-64{height:calc(var(--spacing)*64)}.h-72{height:calc(var(--spacing)*72)}.h-80{height:calc(var(--spacing)*80)}.h-96{height:calc(var(--spacing)*96)}.h-\[42px\]{height:42px}.h-auto{height:auto}.h-fit{height:fit-content}.h-full{height:100%}.h-max{height:max-content}.h-min{height:min-content}.h-px{height:1px}.h-screen{height:100vh}.max-h-0{max-height:calc(var(--spacing)*0)}.max-h-60{max-height:calc(var(--spacing)*60)}.max-h-64{max-height:calc(var(--spacing)*64)}.max-h-80{max-height:calc(var(--spacing)*80)}.max-h-96{max-height:calc(var(--spacing)*96)}.max-h-\[55vh\]{max-height:55vh}.max-h-\[70vh\]{max-height:70vh}.max-h-\[75vh\]{max-height:75vh}.max-h-\[90vh\]{max-height:90vh}.max-h-\[calc\(90vh-140px\)\]{max-height:calc(90vh - 140px)}.max-h-\[calc\(100vh-200px\)\]{max-height:calc(100vh - 200px)}.max-h-fit{max-height:fit-content}.max-h-full{max-height:100%}.max-h-max{max-height:max-content}.max-h-min{max-height:min-content}.max-h-none{max-height:none}.max-h-screen{max-height:100vh}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-20{min-height:calc(var(--spacing)*20)}.min-h-\[40px\]{min-height:40px}.min-h-\[60vh\]{min-height:60vh}.min-h-\[80px\]{min-height:80px}.min-h-\[200px\]{min-height:200px}.min-h-\[400px\]{min-height:400px}.min-h-fit{min-height:fit-content}.min-h-full{min-height:100%}.min-h-max{min-height:max-content}.min-h-min{min-height:min-content}.min-h-screen{min-height:100vh}.w-0{width:calc(var(--spacing)*0)}.w-1{width:calc(var(--spacing)*1)}.w-1\/2{width:50%}.w-1\/3{width:33.3333%}.w-1\/4{width:25%}.w-1\/5{width:20%}.w-1\/6{width:16.6667%}.w-2{width:calc(var(--spacing)*2)}.w-2\.5{width:calc(var(--spacing)*2.5)}.w-2\/3{width:66.6667%}.w-2\/4{width:50%}.w-2\/5{width:40%}.w-3{width:calc(var(--spacing)*3)}.w-3\.5{width:calc(var(--spacing)*3.5)}.w-3\/4{width:75%}.w-3\/5{width:60%}.w-4{width:calc(var(--spacing)*4)}.w-4\/5{width:80%}.w-5{width:calc(var(--spacing)*5)}.w-5\/6{width:83.3333%}.w-6{width:calc(var(--spacing)*6)}.w-8{width:calc(var(--spacing)*8)}.w-9{width:calc(var(--spacing)*9)}.w-10{width:calc(var(--spacing)*10)}.w-12{width:calc(var(--spacing)*12)}.w-14{width:calc(var(--spacing)*14)}.w-16{width:calc(var(--spacing)*16)}.w-20{width:calc(var(--spacing)*20)}.w-24{width:calc(var(--spacing)*24)}.w-28{width:calc(var(--spacing)*28)}.w-32{width:calc(var(--spacing)*32)}.w-40{width:calc(var(--spacing)*40)}.w-44{width:calc(var(--spacing)*44)}.w-48{width:calc(var(--spacing)*48)}.w-52{width:calc(var(--spacing)*52)}.w-56{width:calc(var(--spacing)*56)}.w-60{width:calc(var(--spacing)*60)}.w-64{width:calc(var(--spacing)*64)}.w-72{width:calc(var(--spacing)*72)}.w-80{width:calc(var(--spacing)*80)}.w-96{width:calc(var(--spacing)*96)}.w-\[220px\]{width:220px}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.w-max{width:max-content}.w-min{width:min-content}.w-px{width:1px}.w-screen{width:100vw}.max-w-0{max-width:calc(var(--spacing)*0)}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-\[60\%\]{max-width:60%}.max-w-\[85vw\]{max-width:85vw}.max-w-\[calc\(100vw-1rem\)\]{max-width:calc(100vw - 1rem)}.max-w-fit{max-width:fit-content}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-max{max-width:max-content}.max-w-md{max-width:var(--container-md)}.max-w-min{max-width:min-content}.max-w-none{max-width:none}.max-w-prose{max-width:65ch}.max-w-screen-2xl{max-width:var(--breakpoint-2xl)}.max-w-screen-lg{max-width:var(--breakpoint-lg)}.max-w-screen-md{max-width:var(--breakpoint-md)}.max-w-screen-sm{max-width:var(--breakpoint-sm)}.max-w-screen-xl{max-width:var(--breakpoint-xl)}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-5{min-width:calc(var(--spacing)*5)}.min-w-24{min-width:calc(var(--spacing)*24)}.min-w-\[100px\]{min-width:100px}.min-w-\[120px\]{min-width:120px}.min-w-\[300px\]{min-width:300px}.min-w-fit{min-width:fit-content}.min-w-full{min-width:100%}.min-w-max{min-width:max-content}.min-w-min{min-width:min-content}.flex-1{flex:1}.flex-auto{flex:auto}.flex-initial{flex:0 auto}.flex-none{flex:none}.flex-shrink{flex-shrink:1}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.grow-0{flex-grow:0}.basis-0{flex-basis:calc(var(--spacing)*0)}.basis-1{flex-basis:calc(var(--spacing)*1)}.basis-1\/2{flex-basis:50%}.basis-1\/3{flex-basis:33.3333%}.basis-1\/4{flex-basis:25%}.basis-2{flex-basis:calc(var(--spacing)*2)}.basis-2\/3{flex-basis:66.6667%}.basis-3\/4{flex-basis:75%}.basis-auto{flex-basis:auto}.basis-full{flex-basis:100%}.table-auto{table-layout:auto}.table-fixed{table-layout:fixed}.caption-bottom{caption-side:bottom}.caption-top{caption-side:top}.border-collapse{border-collapse:collapse}.border-separate{border-collapse:separate}.border-spacing-0{--tw-border-spacing-x:calc(var(--spacing)*0);--tw-border-spacing-y:calc(var(--spacing)*0);border-spacing:var(--tw-border-spacing-x)var(--tw-border-spacing-y)}.border-spacing-1{--tw-border-spacing-x:calc(var(--spacing)*1);--tw-border-spacing-y:calc(var(--spacing)*1);border-spacing:var(--tw-border-spacing-x)var(--tw-border-spacing-y)}.border-spacing-2{--tw-border-spacing-x:calc(var(--spacing)*2);--tw-border-spacing-y:calc(var(--spacing)*2);border-spacing:var(--tw-border-spacing-x)var(--tw-border-spacing-y)}.border-spacing-3{--tw-border-spacing-x:calc(var(--spacing)*3);--tw-border-spacing-y:calc(var(--spacing)*3);border-spacing:var(--tw-border-spacing-x)var(--tw-border-spacing-y)}.border-spacing-4{--tw-border-spacing-x:calc(var(--spacing)*4);--tw-border-spacing-y:calc(var(--spacing)*4);border-spacing:var(--tw-border-spacing-x)var(--tw-border-spacing-y)}.border-spacing-5{--tw-border-spacing-x:calc(var(--spacing)*5);--tw-border-spacing-y:calc(var(--spacing)*5);border-spacing:var(--tw-border-spacing-x)var(--tw-border-spacing-y)}.border-spacing-6{--tw-border-spacing-x:calc(var(--spacing)*6);--tw-border-spacing-y:calc(var(--spacing)*6);border-spacing:var(--tw-border-spacing-x)var(--tw-border-spacing-y)}.border-spacing-8{--tw-border-spacing-x:calc(var(--spacing)*8);--tw-border-spacing-y:calc(var(--spacing)*8);border-spacing:var(--tw-border-spacing-x)var(--tw-border-spacing-y)}.origin-bottom{transform-origin:bottom}.origin-bottom-left{transform-origin:0 100%}.origin-bottom-right{transform-origin:100% 100%}.origin-center{transform-origin:50%}.origin-left{transform-origin:0}.origin-right{transform-origin:100%}.origin-top{transform-origin:top}.origin-top-left{transform-origin:0 0}.origin-top-right{transform-origin:100% 0}.-translate-x-1{--tw-translate-x:calc(var(--spacing)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-x-2{--tw-translate-x:calc(var(--spacing)*-2);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-x-3{--tw-translate-x:calc(var(--spacing)*-3);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-x-4{--tw-translate-x:calc(var(--spacing)*-4);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-0{--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-1{--tw-translate-x:calc(var(--spacing)*1);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-1\/2{--tw-translate-x: 50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-1\/3{--tw-translate-x:calc(1/3*100%);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-1\/4{--tw-translate-x: 25% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-2{--tw-translate-x:calc(var(--spacing)*2);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-2\/3{--tw-translate-x:calc(2/3*100%);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-3{--tw-translate-x:calc(var(--spacing)*3);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-3\/4{--tw-translate-x: 75% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-4{--tw-translate-x:calc(var(--spacing)*4);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-5{--tw-translate-x:calc(var(--spacing)*5);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-6{--tw-translate-x:calc(var(--spacing)*6);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-8{--tw-translate-x:calc(var(--spacing)*8);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-10{--tw-translate-x:calc(var(--spacing)*10);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-12{--tw-translate-x:calc(var(--spacing)*12);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-full{--tw-translate-x:100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1{--tw-translate-y:calc(var(--spacing)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-2{--tw-translate-y:calc(var(--spacing)*-2);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-3{--tw-translate-y:calc(var(--spacing)*-3);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-4{--tw-translate-y:calc(var(--spacing)*-4);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-full{--tw-translate-y:-100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-0{--tw-translate-y:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-1{--tw-translate-y:calc(var(--spacing)*1);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-1\/2{--tw-translate-y: 50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-1\/3{--tw-translate-y:calc(1/3*100%);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-1\/4{--tw-translate-y: 25% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-2{--tw-translate-y:calc(var(--spacing)*2);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-2\/3{--tw-translate-y:calc(2/3*100%);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-3{--tw-translate-y:calc(var(--spacing)*3);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-3\/4{--tw-translate-y: 75% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-4{--tw-translate-y:calc(var(--spacing)*4);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-5{--tw-translate-y:calc(var(--spacing)*5);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-6{--tw-translate-y:calc(var(--spacing)*6);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-8{--tw-translate-y:calc(var(--spacing)*8);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-10{--tw-translate-y:calc(var(--spacing)*10);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-12{--tw-translate-y:calc(var(--spacing)*12);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-full{--tw-translate-y:100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.scale-0{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-50{--tw-scale-x:50%;--tw-scale-y:50%;--tw-scale-z:50%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-75{--tw-scale-x:75%;--tw-scale-y:75%;--tw-scale-z:75%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-90{--tw-scale-x:90%;--tw-scale-y:90%;--tw-scale-z:90%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-95{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-105{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-110{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-125{--tw-scale-x:125%;--tw-scale-y:125%;--tw-scale-z:125%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-150{--tw-scale-x:150%;--tw-scale-y:150%;--tw-scale-z:150%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-x-0{--tw-scale-x:0%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-x-50{--tw-scale-x:50%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-x-75{--tw-scale-x:75%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-x-90{--tw-scale-x:90%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-x-95{--tw-scale-x:95%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-x-100{--tw-scale-x:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-x-105{--tw-scale-x:105%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-x-110{--tw-scale-x:110%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-x-125{--tw-scale-x:125%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-x-150{--tw-scale-x:150%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-y-0{--tw-scale-y:0%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-y-50{--tw-scale-y:50%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-y-75{--tw-scale-y:75%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-y-90{--tw-scale-y:90%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-y-95{--tw-scale-y:95%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-y-100{--tw-scale-y:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-y-105{--tw-scale-y:105%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-y-110{--tw-scale-y:110%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-y-125{--tw-scale-y:125%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-y-150{--tw-scale-y:150%;scale:var(--tw-scale-x)var(--tw-scale-y)}.-rotate-1{rotate:-1deg}.-rotate-2{rotate:-2deg}.-rotate-3{rotate:-3deg}.-rotate-6{rotate:-6deg}.-rotate-12{rotate:-12deg}.-rotate-45{rotate:-45deg}.-rotate-90{rotate:-90deg}.-rotate-180{rotate:-180deg}.rotate-0{rotate:none}.rotate-1{rotate:1deg}.rotate-2{rotate:2deg}.rotate-3{rotate:3deg}.rotate-6{rotate:6deg}.rotate-12{rotate:12deg}.rotate-45{rotate:45deg}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.-skew-x-1{--tw-skew-x:skewX( -1deg );transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.-skew-x-2{--tw-skew-x:skewX( -2deg );transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.-skew-x-3{--tw-skew-x:skewX( -3deg );transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.-skew-x-6{--tw-skew-x:skewX( -6deg );transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.-skew-x-12{--tw-skew-x:skewX( -12deg );transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.skew-x-0{--tw-skew-x:skewX(0deg);transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.skew-x-1{--tw-skew-x:skewX(1deg);transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.skew-x-2{--tw-skew-x:skewX(2deg);transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.skew-x-3{--tw-skew-x:skewX(3deg);transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.skew-x-6{--tw-skew-x:skewX(6deg);transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.skew-x-12{--tw-skew-x:skewX(12deg);transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.-skew-y-1{--tw-skew-y:skewY( -1deg );transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.-skew-y-2{--tw-skew-y:skewY( -2deg );transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.-skew-y-3{--tw-skew-y:skewY( -3deg );transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.-skew-y-6{--tw-skew-y:skewY( -6deg );transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.-skew-y-12{--tw-skew-y:skewY( -12deg );transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.skew-y-0{--tw-skew-y:skewY(0deg);transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.skew-y-1{--tw-skew-y:skewY(1deg);transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.skew-y-2{--tw-skew-y:skewY(2deg);transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.skew-y-3{--tw-skew-y:skewY(3deg);transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.skew-y-6{--tw-skew-y:skewY(6deg);transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.skew-y-12{--tw-skew-y:skewY(12deg);transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.transform,.transform-cpu{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.transform-gpu{transform:translateZ(0)var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.transform-none{transform:none}.animate-\[loading_1\.5s_ease-in-out_infinite\]{animation:1.5s ease-in-out infinite loading}.animate-bounce{animation:var(--animate-bounce)}.animate-none{animation:none}.animate-ping{animation:var(--animate-ping)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-alias{cursor:alias}.cursor-all-scroll{cursor:all-scroll}.cursor-auto{cursor:auto}.cursor-cell{cursor:cell}.cursor-col-resize{cursor:col-resize}.cursor-context-menu{cursor:context-menu}.cursor-copy{cursor:copy}.cursor-crosshair{cursor:crosshair}.cursor-default{cursor:default}.cursor-e-resize{cursor:e-resize}.cursor-ew-resize{cursor:ew-resize}.cursor-grab{cursor:grab}.cursor-grabbing{cursor:grabbing}.cursor-help{cursor:help}.cursor-move{cursor:move}.cursor-n-resize{cursor:n-resize}.cursor-ne-resize{cursor:ne-resize}.cursor-nesw-resize{cursor:nesw-resize}.cursor-no-drop{cursor:no-drop}.cursor-none{cursor:none}.cursor-not-allowed{cursor:not-allowed}.cursor-ns-resize{cursor:ns-resize}.cursor-nw-resize{cursor:nw-resize}.cursor-nwse-resize{cursor:nwse-resize}.cursor-pointer{cursor:pointer}.cursor-progress{cursor:progress}.cursor-row-resize{cursor:row-resize}.cursor-s-resize{cursor:s-resize}.cursor-se-resize{cursor:se-resize}.cursor-sw-resize{cursor:sw-resize}.cursor-text{cursor:text}.cursor-vertical-text{cursor:vertical-text}.cursor-w-resize{cursor:w-resize}.cursor-wait{cursor:wait}.cursor-zoom-in{cursor:zoom-in}.cursor-zoom-out{cursor:zoom-out}.touch-pan-left{--tw-pan-x:pan-left;touch-action:var(--tw-pan-x,)var(--tw-pan-y,)var(--tw-pinch-zoom,)}.touch-pan-right{--tw-pan-x:pan-right;touch-action:var(--tw-pan-x,)var(--tw-pan-y,)var(--tw-pinch-zoom,)}.touch-pan-x{--tw-pan-x:pan-x;touch-action:var(--tw-pan-x,)var(--tw-pan-y,)var(--tw-pinch-zoom,)}.touch-pan-down{--tw-pan-y:pan-down;touch-action:var(--tw-pan-x,)var(--tw-pan-y,)var(--tw-pinch-zoom,)}.touch-pan-up{--tw-pan-y:pan-up;touch-action:var(--tw-pan-x,)var(--tw-pan-y,)var(--tw-pinch-zoom,)}.touch-pan-y{--tw-pan-y:pan-y;touch-action:var(--tw-pan-x,)var(--tw-pan-y,)var(--tw-pinch-zoom,)}.touch-pinch-zoom{--tw-pinch-zoom:pinch-zoom;touch-action:var(--tw-pan-x,)var(--tw-pan-y,)var(--tw-pinch-zoom,)}.touch-auto{touch-action:auto}.touch-manipulation{touch-action:manipulation}.touch-none{touch-action:none}.resize{resize:both}.resize-none{resize:none}.resize-x{resize:horizontal}.resize-y{resize:vertical}.snap-both{scroll-snap-type:both var(--tw-scroll-snap-strictness)}.snap-none{scroll-snap-type:none}.snap-x{scroll-snap-type:x var(--tw-scroll-snap-strictness)}.snap-y{scroll-snap-type:y var(--tw-scroll-snap-strictness)}.snap-mandatory{--tw-scroll-snap-strictness:mandatory}.snap-proximity{--tw-scroll-snap-strictness:proximity}.snap-align-none{scroll-snap-align:none}.snap-center{scroll-snap-align:center}.snap-end{scroll-snap-align:end}.snap-start{scroll-snap-align:start}.snap-always{scroll-snap-stop:always}.snap-normal{scroll-snap-stop:normal}.list-inside{list-style-position:inside}.list-outside{list-style-position:outside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.\[appearance\:textfield\]{appearance:textfield}.appearance-auto{appearance:auto}.appearance-none{appearance:none}.columns-1{columns:1}.columns-2{columns:2}.columns-2xl{columns:var(--container-2xl)}.columns-2xs{columns:var(--container-2xs)}.columns-3{columns:3}.columns-3xl{columns:var(--container-3xl)}.columns-3xs{columns:var(--container-3xs)}.columns-4{columns:4}.columns-4xl{columns:var(--container-4xl)}.columns-5{columns:5}.columns-5xl{columns:var(--container-5xl)}.columns-6{columns:6}.columns-6xl{columns:var(--container-6xl)}.columns-7{columns:7}.columns-7xl{columns:var(--container-7xl)}.columns-8{columns:8}.columns-9{columns:9}.columns-10{columns:10}.columns-11{columns:11}.columns-12{columns:12}.columns-auto{columns:auto}.columns-lg{columns:var(--container-lg)}.columns-md{columns:var(--container-md)}.columns-sm{columns:var(--container-sm)}.columns-xl{columns:var(--container-xl)}.columns-xs{columns:var(--container-xs)}.break-before-all{break-before:all}.break-before-auto{break-before:auto}.break-before-avoid{break-before:avoid}.break-before-avoid-page{break-before:avoid-page}.break-before-column{break-before:column}.break-before-left{break-before:left}.break-before-page{break-before:page}.break-before-right{break-before:right}.break-inside-auto{break-inside:auto}.break-inside-avoid{break-inside:avoid}.break-inside-avoid-column{break-inside:avoid-column}.break-inside-avoid-page{break-inside:avoid-page}.break-after-all{break-after:all}.break-after-auto{break-after:auto}.break-after-avoid{break-after:avoid}.break-after-avoid-page{break-after:avoid-page}.break-after-column{break-after:column}.break-after-left{break-after:left}.break-after-page{break-after:page}.break-after-right{break-after:right}.auto-cols-\[calc\(25\%_-_12px\)\]{grid-auto-columns:calc(25% - 12px)}.auto-cols-\[calc\(33\.333\%_-_11px\)\]{grid-auto-columns:calc(33.333% - 11px)}.auto-cols-\[calc\(50\%_-_8px\)\]{grid-auto-columns:calc(50% - 8px)}.auto-cols-auto{grid-auto-columns:auto}.auto-cols-fr{grid-auto-columns:minmax(0,1fr)}.auto-cols-max{grid-auto-columns:max-content}.auto-cols-min{grid-auto-columns:min-content}.grid-flow-col{grid-auto-flow:column}.grid-flow-col-dense{grid-auto-flow:column dense}.grid-flow-dense{grid-auto-flow:dense}.grid-flow-row{grid-auto-flow:row}.grid-flow-row-dense{grid-auto-flow:dense}.auto-rows-auto{grid-auto-rows:auto}.auto-rows-fr{grid-auto-rows:minmax(0,1fr)}.auto-rows-max{grid-auto-rows:max-content}.auto-rows-min{grid-auto-rows:min-content}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.grid-cols-\[\.\.\.\]{grid-template-columns:...}.grid-cols-\[60px_1fr\]{grid-template-columns:60px 1fr}.grid-cols-\[60px_1fr_160px\]{grid-template-columns:60px 1fr 160px}.grid-cols-\[60px_minmax\(300px\,1fr\)_160px\]{grid-template-columns:60px minmax(300px,1fr) 160px}.grid-cols-\[60px_minmax\(300px\,1fr\)_160px_100px\]{grid-template-columns:60px minmax(300px,1fr) 160px 100px}.grid-cols-\[60px_minmax\(300px\,1fr\)_160px_100px_70px\]{grid-template-columns:60px minmax(300px,1fr) 160px 100px 70px}.grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.grid-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))}.grid-rows-5{grid-template-rows:repeat(5,minmax(0,1fr))}.grid-rows-6{grid-template-rows:repeat(6,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-row-reverse{flex-direction:row-reverse}.flex-nowrap{flex-wrap:nowrap}.flex-wrap{flex-wrap:wrap}.flex-wrap-reverse{flex-wrap:wrap-reverse}.place-content-around{place-content:space-around}.place-content-baseline{place-content:baseline start}.place-content-between{place-content:space-between}.place-content-center{place-content:center}.place-content-end{place-content:end}.place-content-evenly{place-content:space-evenly}.place-content-start{place-content:start}.place-content-stretch{place-content:stretch}.place-items-baseline{place-items:baseline}.place-items-center{place-items:center}.place-items-end{place-items:end}.place-items-start{place-items:start}.place-items-stretch{place-items:stretch stretch}.content-around{align-content:space-around}.content-between{align-content:space-between}.content-center{align-content:center}.content-end{align-content:flex-end}.content-evenly{align-content:space-evenly}.content-start{align-content:flex-start}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-around{justify-content:space-around}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-evenly{justify-content:space-evenly}.justify-start{justify-content:flex-start}.gap-0{gap:calc(var(--spacing)*0)}.gap-0\.5{gap:calc(var(--spacing)*.5)}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-5{gap:calc(var(--spacing)*5)}.gap-6{gap:calc(var(--spacing)*6)}.gap-8{gap:calc(var(--spacing)*8)}.gap-10{gap:calc(var(--spacing)*10)}.gap-12{gap:calc(var(--spacing)*12)}.gap-16{gap:calc(var(--spacing)*16)}:where(.-space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*-1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*-1)*calc(1 - var(--tw-space-y-reverse)))}:where(.-space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*-2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*-2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-0>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*0)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*0)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*8)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-y-reverse)))}.gap-x-0{column-gap:calc(var(--spacing)*0)}.gap-x-1{column-gap:calc(var(--spacing)*1)}.gap-x-2{column-gap:calc(var(--spacing)*2)}.gap-x-3{column-gap:calc(var(--spacing)*3)}.gap-x-4{column-gap:calc(var(--spacing)*4)}.gap-x-5{column-gap:calc(var(--spacing)*5)}.gap-x-6{column-gap:calc(var(--spacing)*6)}.gap-x-8{column-gap:calc(var(--spacing)*8)}.gap-x-10{column-gap:calc(var(--spacing)*10)}.gap-x-12{column-gap:calc(var(--spacing)*12)}:where(.-space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*-1)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*-1)*calc(1 - var(--tw-space-x-reverse)))}:where(.-space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*-2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*-2)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-0>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*0)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*0)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*1)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*3)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*4)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-5>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*5)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*5)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-6>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*6)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-8>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*8)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-x-reverse)))}.gap-y-0{row-gap:calc(var(--spacing)*0)}.gap-y-1{row-gap:calc(var(--spacing)*1)}.gap-y-2{row-gap:calc(var(--spacing)*2)}.gap-y-3{row-gap:calc(var(--spacing)*3)}.gap-y-4{row-gap:calc(var(--spacing)*4)}.gap-y-5{row-gap:calc(var(--spacing)*5)}.gap-y-6{row-gap:calc(var(--spacing)*6)}.gap-y-8{row-gap:calc(var(--spacing)*8)}.gap-y-10{row-gap:calc(var(--spacing)*10)}.gap-y-12{row-gap:calc(var(--spacing)*12)}:where(.divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)))}:where(.divide-x-0>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(0px*var(--tw-divide-x-reverse));border-inline-end-width:calc(0px*calc(1 - var(--tw-divide-x-reverse)))}:where(.divide-x-2>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(2px*var(--tw-divide-x-reverse));border-inline-end-width:calc(2px*calc(1 - var(--tw-divide-x-reverse)))}:where(.divide-x-4>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(4px*var(--tw-divide-x-reverse));border-inline-end-width:calc(4px*calc(1 - var(--tw-divide-x-reverse)))}:where(.divide-x-8>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(8px*var(--tw-divide-x-reverse));border-inline-end-width:calc(8px*calc(1 - var(--tw-divide-x-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-y-0>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-y-2>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(2px*var(--tw-divide-y-reverse));border-bottom-width:calc(2px*calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-y-4>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(4px*var(--tw-divide-y-reverse));border-bottom-width:calc(4px*calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-y-8>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(8px*var(--tw-divide-y-reverse));border-bottom-width:calc(8px*calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-y-reverse>:not(:last-child)){--tw-divide-y-reverse:1}:where(.divide-dashed>:not(:last-child)){--tw-border-style:dashed;border-style:dashed}:where(.divide-dotted>:not(:last-child)){--tw-border-style:dotted;border-style:dotted}:where(.divide-double>:not(:last-child)){--tw-border-style:double;border-style:double}:where(.divide-none>:not(:last-child)){--tw-border-style:none;border-style:none}:where(.divide-solid>:not(:last-child)){--tw-border-style:solid;border-style:solid}:where(.divide-black>:not(:last-child)){border-color:var(--color-black)}:where(.divide-current>:not(:last-child)){border-color:currentColor}:where(.divide-gray-50>:not(:last-child)){border-color:var(--color-gray-50)}:where(.divide-gray-100>:not(:last-child)){border-color:var(--color-gray-100)}:where(.divide-gray-200>:not(:last-child)){border-color:var(--color-gray-200)}:where(.divide-gray-300>:not(:last-child)){border-color:var(--color-gray-300)}:where(.divide-gray-400>:not(:last-child)){border-color:var(--color-gray-400)}:where(.divide-gray-500>:not(:last-child)){border-color:var(--color-gray-500)}:where(.divide-gray-600>:not(:last-child)){border-color:var(--color-gray-600)}:where(.divide-gray-700>:not(:last-child)){border-color:var(--color-gray-700)}:where(.divide-gray-800>:not(:last-child)){border-color:var(--color-gray-800)}:where(.divide-gray-900>:not(:last-child)){border-color:var(--color-gray-900)}:where(.divide-inherit>:not(:last-child)){border-color:inherit}:where(.divide-slate-50>:not(:last-child)){border-color:var(--color-slate-50)}:where(.divide-slate-100>:not(:last-child)){border-color:var(--color-slate-100)}:where(.divide-slate-200>:not(:last-child)){border-color:var(--color-slate-200)}:where(.divide-slate-300>:not(:last-child)){border-color:var(--color-slate-300)}:where(.divide-slate-400>:not(:last-child)){border-color:var(--color-slate-400)}:where(.divide-slate-500>:not(:last-child)){border-color:var(--color-slate-500)}:where(.divide-slate-600>:not(:last-child)){border-color:var(--color-slate-600)}:where(.divide-slate-700>:not(:last-child)){border-color:var(--color-slate-700)}:where(.divide-slate-800>:not(:last-child)){border-color:var(--color-slate-800)}:where(.divide-slate-900>:not(:last-child)){border-color:var(--color-slate-900)}:where(.divide-transparent>:not(:last-child)){border-color:#0000}:where(.divide-white>:not(:last-child)){border-color:var(--color-white)}.place-self-auto{place-self:auto}.place-self-center{place-self:center}.place-self-end{place-self:end}.place-self-start{place-self:start}.place-self-stretch{place-self:stretch stretch}.self-auto{align-self:auto}.self-baseline{align-self:baseline}.self-center{align-self:center}.self-end{align-self:flex-end}.self-start{align-self:flex-start}.self-stretch{align-self:stretch}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-clip{overflow:clip}.overflow-hidden{overflow:hidden}.overflow-scroll{overflow:scroll}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-x-clip{overflow-x:clip}.overflow-x-hidden{overflow-x:hidden}.overflow-x-scroll{overflow-x:scroll}.overflow-x-visible{overflow-x:visible}.overflow-y-auto{overflow-y:auto}.overflow-y-clip{overflow-y:clip}.overflow-y-hidden{overflow-y:hidden}.overflow-y-scroll{overflow-y:scroll}.overflow-y-visible{overflow-y:visible}.overscroll-auto{overscroll-behavior:auto}.overscroll-contain{overscroll-behavior:contain}.overscroll-none{overscroll-behavior:none}.overscroll-x-auto{overscroll-behavior-x:auto}.overscroll-x-contain{overscroll-behavior-x:contain}.overscroll-x-none{overscroll-behavior-x:none}.overscroll-y-auto{overscroll-behavior-y:auto}.overscroll-y-contain{overscroll-behavior-y:contain}.overscroll-y-none{overscroll-behavior-y:none}.scroll-auto{scroll-behavior:auto}.scroll-smooth{scroll-behavior:smooth}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-3xl{border-radius:var(--radius-3xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-none{border-radius:0}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-t-2xl{border-top-left-radius:var(--radius-2xl);border-top-right-radius:var(--radius-2xl)}.rounded-t-3xl{border-top-left-radius:var(--radius-3xl);border-top-right-radius:var(--radius-3xl)}.rounded-t-full{border-top-left-radius:3.40282e38px;border-top-right-radius:3.40282e38px}.rounded-t-lg{border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg)}.rounded-t-md{border-top-left-radius:var(--radius-md);border-top-right-radius:var(--radius-md)}.rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.rounded-t-sm{border-top-left-radius:var(--radius-sm);border-top-right-radius:var(--radius-sm)}.rounded-t-xl{border-top-left-radius:var(--radius-xl);border-top-right-radius:var(--radius-xl)}.rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-l-2xl{border-top-left-radius:var(--radius-2xl);border-bottom-left-radius:var(--radius-2xl)}.rounded-l-3xl{border-top-left-radius:var(--radius-3xl);border-bottom-left-radius:var(--radius-3xl)}.rounded-l-full{border-top-left-radius:3.40282e38px;border-bottom-left-radius:3.40282e38px}.rounded-l-lg{border-top-left-radius:var(--radius-lg);border-bottom-left-radius:var(--radius-lg)}.rounded-l-md{border-top-left-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.rounded-l-sm{border-top-left-radius:var(--radius-sm);border-bottom-left-radius:var(--radius-sm)}.rounded-l-xl{border-top-left-radius:var(--radius-xl);border-bottom-left-radius:var(--radius-xl)}.rounded-tl{border-top-left-radius:.25rem}.rounded-tl-2xl{border-top-left-radius:var(--radius-2xl)}.rounded-tl-3xl{border-top-left-radius:var(--radius-3xl)}.rounded-tl-full{border-top-left-radius:3.40282e38px}.rounded-tl-lg{border-top-left-radius:var(--radius-lg)}.rounded-tl-md{border-top-left-radius:var(--radius-md)}.rounded-tl-none{border-top-left-radius:0}.rounded-tl-sm{border-top-left-radius:var(--radius-sm)}.rounded-tl-xl{border-top-left-radius:var(--radius-xl)}.rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-r-2xl{border-top-right-radius:var(--radius-2xl);border-bottom-right-radius:var(--radius-2xl)}.rounded-r-3xl{border-top-right-radius:var(--radius-3xl);border-bottom-right-radius:var(--radius-3xl)}.rounded-r-full{border-top-right-radius:3.40282e38px;border-bottom-right-radius:3.40282e38px}.rounded-r-lg{border-top-right-radius:var(--radius-lg);border-bottom-right-radius:var(--radius-lg)}.rounded-r-md{border-top-right-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md)}.rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-r-sm{border-top-right-radius:var(--radius-sm);border-bottom-right-radius:var(--radius-sm)}.rounded-r-xl{border-top-right-radius:var(--radius-xl);border-bottom-right-radius:var(--radius-xl)}.rounded-tr{border-top-right-radius:.25rem}.rounded-tr-2xl{border-top-right-radius:var(--radius-2xl)}.rounded-tr-3xl{border-top-right-radius:var(--radius-3xl)}.rounded-tr-full{border-top-right-radius:3.40282e38px}.rounded-tr-lg{border-top-right-radius:var(--radius-lg)}.rounded-tr-md{border-top-right-radius:var(--radius-md)}.rounded-tr-none{border-top-right-radius:0}.rounded-tr-sm{border-top-right-radius:var(--radius-sm)}.rounded-tr-xl{border-top-right-radius:var(--radius-xl)}.rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-b-2xl{border-bottom-right-radius:var(--radius-2xl);border-bottom-left-radius:var(--radius-2xl)}.rounded-b-3xl{border-bottom-right-radius:var(--radius-3xl);border-bottom-left-radius:var(--radius-3xl)}.rounded-b-full{border-bottom-right-radius:3.40282e38px;border-bottom-left-radius:3.40282e38px}.rounded-b-lg{border-bottom-right-radius:var(--radius-lg);border-bottom-left-radius:var(--radius-lg)}.rounded-b-md{border-bottom-right-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.rounded-b-none{border-bottom-right-radius:0;border-bottom-left-radius:0}.rounded-b-sm{border-bottom-right-radius:var(--radius-sm);border-bottom-left-radius:var(--radius-sm)}.rounded-b-xl{border-bottom-right-radius:var(--radius-xl);border-bottom-left-radius:var(--radius-xl)}.rounded-br{border-bottom-right-radius:.25rem}.rounded-br-2xl{border-bottom-right-radius:var(--radius-2xl)}.rounded-br-3xl{border-bottom-right-radius:var(--radius-3xl)}.rounded-br-full{border-bottom-right-radius:3.40282e38px}.rounded-br-lg{border-bottom-right-radius:var(--radius-lg)}.rounded-br-md{border-bottom-right-radius:var(--radius-md)}.rounded-br-none{border-bottom-right-radius:0}.rounded-br-sm{border-bottom-right-radius:var(--radius-sm)}.rounded-br-xl{border-bottom-right-radius:var(--radius-xl)}.rounded-bl{border-bottom-left-radius:.25rem}.rounded-bl-2xl{border-bottom-left-radius:var(--radius-2xl)}.rounded-bl-3xl{border-bottom-left-radius:var(--radius-3xl)}.rounded-bl-full{border-bottom-left-radius:3.40282e38px}.rounded-bl-lg{border-bottom-left-radius:var(--radius-lg)}.rounded-bl-md{border-bottom-left-radius:var(--radius-md)}.rounded-bl-none{border-bottom-left-radius:0}.rounded-bl-sm{border-bottom-left-radius:var(--radius-sm)}.rounded-bl-xl{border-bottom-left-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-4{border-style:var(--tw-border-style);border-width:4px}.border-8{border-style:var(--tw-border-style);border-width:8px}.border-x{border-inline-style:var(--tw-border-style);border-inline-width:1px}.border-x-0{border-inline-style:var(--tw-border-style);border-inline-width:0}.border-x-2{border-inline-style:var(--tw-border-style);border-inline-width:2px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-y-0{border-block-style:var(--tw-border-style);border-block-width:0}.border-y-2{border-block-style:var(--tw-border-style);border-block-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.border-t-4{border-top-style:var(--tw-border-style);border-top-width:4px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-r-0{border-right-style:var(--tw-border-style);border-right-width:0}.border-r-2{border-right-style:var(--tw-border-style);border-right-width:2px}.border-r-4{border-right-style:var(--tw-border-style);border-right-width:4px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-b-4{border-bottom-style:var(--tw-border-style);border-bottom-width:4px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-0{border-left-style:var(--tw-border-style);border-left-width:0}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-dotted{--tw-border-style:dotted;border-style:dotted}.border-double{--tw-border-style:double;border-style:double}.border-hidden{--tw-border-style:hidden;border-style:hidden}.border-none{--tw-border-style:none;border-style:none}.border-solid{--tw-border-style:solid;border-style:solid}.border-amber-50{border-color:var(--color-amber-50)}.border-amber-100{border-color:var(--color-amber-100)}.border-amber-200{border-color:var(--color-amber-200)}.border-amber-300{border-color:var(--color-amber-300)}.border-amber-400{border-color:var(--color-amber-400)}.border-amber-500{border-color:var(--color-amber-500)}.border-amber-600{border-color:var(--color-amber-600)}.border-amber-700{border-color:var(--color-amber-700)}.border-amber-800{border-color:var(--color-amber-800)}.border-amber-900{border-color:var(--color-amber-900)}.border-amber-950{border-color:var(--color-amber-950)}.border-black{border-color:var(--color-black)}.border-blue-50{border-color:var(--color-blue-50)}.border-blue-100{border-color:var(--color-blue-100)}.border-blue-200{border-color:var(--color-blue-200)}.border-blue-300{border-color:var(--color-blue-300)}.border-blue-400{border-color:var(--color-blue-400)}.border-blue-500{border-color:var(--color-blue-500)}.border-blue-600{border-color:var(--color-blue-600)}.border-blue-700{border-color:var(--color-blue-700)}.border-blue-800{border-color:var(--color-blue-800)}.border-blue-900{border-color:var(--color-blue-900)}.border-blue-950{border-color:var(--color-blue-950)}.border-current{border-color:currentColor}.border-cyan-50{border-color:var(--color-cyan-50)}.border-cyan-100{border-color:var(--color-cyan-100)}.border-cyan-200{border-color:var(--color-cyan-200)}.border-cyan-300{border-color:var(--color-cyan-300)}.border-cyan-400{border-color:var(--color-cyan-400)}.border-cyan-500{border-color:var(--color-cyan-500)}.border-cyan-600{border-color:var(--color-cyan-600)}.border-cyan-700{border-color:var(--color-cyan-700)}.border-cyan-800{border-color:var(--color-cyan-800)}.border-cyan-900{border-color:var(--color-cyan-900)}.border-cyan-950{border-color:var(--color-cyan-950)}.border-emerald-50{border-color:var(--color-emerald-50)}.border-emerald-100{border-color:var(--color-emerald-100)}.border-emerald-200{border-color:var(--color-emerald-200)}.border-emerald-300{border-color:var(--color-emerald-300)}.border-emerald-400{border-color:var(--color-emerald-400)}.border-emerald-500{border-color:var(--color-emerald-500)}.border-emerald-600{border-color:var(--color-emerald-600)}.border-emerald-700{border-color:var(--color-emerald-700)}.border-emerald-800{border-color:var(--color-emerald-800)}.border-emerald-900{border-color:var(--color-emerald-900)}.border-emerald-950{border-color:var(--color-emerald-950)}.border-fuchsia-50{border-color:var(--color-fuchsia-50)}.border-fuchsia-100{border-color:var(--color-fuchsia-100)}.border-fuchsia-200{border-color:var(--color-fuchsia-200)}.border-fuchsia-300{border-color:var(--color-fuchsia-300)}.border-fuchsia-400{border-color:var(--color-fuchsia-400)}.border-fuchsia-500{border-color:var(--color-fuchsia-500)}.border-fuchsia-600{border-color:var(--color-fuchsia-600)}.border-fuchsia-700{border-color:var(--color-fuchsia-700)}.border-fuchsia-800{border-color:var(--color-fuchsia-800)}.border-fuchsia-900{border-color:var(--color-fuchsia-900)}.border-fuchsia-950{border-color:var(--color-fuchsia-950)}.border-gray-50{border-color:var(--color-gray-50)}.border-gray-100{border-color:var(--color-gray-100)}.border-gray-200{border-color:var(--color-gray-200)}.border-gray-300{border-color:var(--color-gray-300)}.border-gray-400{border-color:var(--color-gray-400)}.border-gray-500{border-color:var(--color-gray-500)}.border-gray-600{border-color:var(--color-gray-600)}.border-gray-700{border-color:var(--color-gray-700)}.border-gray-800{border-color:var(--color-gray-800)}.border-gray-900{border-color:var(--color-gray-900)}.border-gray-950{border-color:var(--color-gray-950)}.border-green-50{border-color:var(--color-green-50)}.border-green-100{border-color:var(--color-green-100)}.border-green-200{border-color:var(--color-green-200)}.border-green-300{border-color:var(--color-green-300)}.border-green-400{border-color:var(--color-green-400)}.border-green-500{border-color:var(--color-green-500)}.border-green-600{border-color:var(--color-green-600)}.border-green-700{border-color:var(--color-green-700)}.border-green-800{border-color:var(--color-green-800)}.border-green-900{border-color:var(--color-green-900)}.border-green-950{border-color:var(--color-green-950)}.border-indigo-50{border-color:var(--color-indigo-50)}.border-indigo-100{border-color:var(--color-indigo-100)}.border-indigo-200{border-color:var(--color-indigo-200)}.border-indigo-300{border-color:var(--color-indigo-300)}.border-indigo-400{border-color:var(--color-indigo-400)}.border-indigo-500{border-color:var(--color-indigo-500)}.border-indigo-600{border-color:var(--color-indigo-600)}.border-indigo-700{border-color:var(--color-indigo-700)}.border-indigo-800{border-color:var(--color-indigo-800)}.border-indigo-900{border-color:var(--color-indigo-900)}.border-indigo-950{border-color:var(--color-indigo-950)}.border-inherit{border-color:inherit}.border-lime-50{border-color:var(--color-lime-50)}.border-lime-100{border-color:var(--color-lime-100)}.border-lime-200{border-color:var(--color-lime-200)}.border-lime-300{border-color:var(--color-lime-300)}.border-lime-400{border-color:var(--color-lime-400)}.border-lime-500{border-color:var(--color-lime-500)}.border-lime-600{border-color:var(--color-lime-600)}.border-lime-700{border-color:var(--color-lime-700)}.border-lime-800{border-color:var(--color-lime-800)}.border-lime-900{border-color:var(--color-lime-900)}.border-lime-950{border-color:var(--color-lime-950)}.border-neutral-50{border-color:var(--color-neutral-50)}.border-neutral-100{border-color:var(--color-neutral-100)}.border-neutral-200{border-color:var(--color-neutral-200)}.border-neutral-300{border-color:var(--color-neutral-300)}.border-neutral-400{border-color:var(--color-neutral-400)}.border-neutral-500{border-color:var(--color-neutral-500)}.border-neutral-600{border-color:var(--color-neutral-600)}.border-neutral-700{border-color:var(--color-neutral-700)}.border-neutral-800{border-color:var(--color-neutral-800)}.border-neutral-900{border-color:var(--color-neutral-900)}.border-neutral-950{border-color:var(--color-neutral-950)}.border-orange-50{border-color:var(--color-orange-50)}.border-orange-100{border-color:var(--color-orange-100)}.border-orange-200{border-color:var(--color-orange-200)}.border-orange-300{border-color:var(--color-orange-300)}.border-orange-400{border-color:var(--color-orange-400)}.border-orange-500{border-color:var(--color-orange-500)}.border-orange-600{border-color:var(--color-orange-600)}.border-orange-700{border-color:var(--color-orange-700)}.border-orange-800{border-color:var(--color-orange-800)}.border-orange-900{border-color:var(--color-orange-900)}.border-orange-950{border-color:var(--color-orange-950)}.border-pink-50{border-color:var(--color-pink-50)}.border-pink-100{border-color:var(--color-pink-100)}.border-pink-200{border-color:var(--color-pink-200)}.border-pink-300{border-color:var(--color-pink-300)}.border-pink-400{border-color:var(--color-pink-400)}.border-pink-500{border-color:var(--color-pink-500)}.border-pink-600{border-color:var(--color-pink-600)}.border-pink-700{border-color:var(--color-pink-700)}.border-pink-800{border-color:var(--color-pink-800)}.border-pink-900{border-color:var(--color-pink-900)}.border-pink-950{border-color:var(--color-pink-950)}.border-primary-500{border-color:var(--color-primary-500)}.border-purple-50{border-color:var(--color-purple-50)}.border-purple-100{border-color:var(--color-purple-100)}.border-purple-200{border-color:var(--color-purple-200)}.border-purple-300{border-color:var(--color-purple-300)}.border-purple-400{border-color:var(--color-purple-400)}.border-purple-500{border-color:var(--color-purple-500)}.border-purple-600{border-color:var(--color-purple-600)}.border-purple-700{border-color:var(--color-purple-700)}.border-purple-800{border-color:var(--color-purple-800)}.border-purple-900{border-color:var(--color-purple-900)}.border-purple-950{border-color:var(--color-purple-950)}.border-red-50{border-color:var(--color-red-50)}.border-red-100{border-color:var(--color-red-100)}.border-red-200{border-color:var(--color-red-200)}.border-red-300{border-color:var(--color-red-300)}.border-red-400{border-color:var(--color-red-400)}.border-red-500{border-color:var(--color-red-500)}.border-red-600{border-color:var(--color-red-600)}.border-red-700{border-color:var(--color-red-700)}.border-red-800{border-color:var(--color-red-800)}.border-red-900{border-color:var(--color-red-900)}.border-red-950{border-color:var(--color-red-950)}.border-rose-50{border-color:var(--color-rose-50)}.border-rose-100{border-color:var(--color-rose-100)}.border-rose-200{border-color:var(--color-rose-200)}.border-rose-300{border-color:var(--color-rose-300)}.border-rose-400{border-color:var(--color-rose-400)}.border-rose-500{border-color:var(--color-rose-500)}.border-rose-600{border-color:var(--color-rose-600)}.border-rose-700{border-color:var(--color-rose-700)}.border-rose-800{border-color:var(--color-rose-800)}.border-rose-900{border-color:var(--color-rose-900)}.border-rose-950{border-color:var(--color-rose-950)}.border-sky-50{border-color:var(--color-sky-50)}.border-sky-100{border-color:var(--color-sky-100)}.border-sky-200{border-color:var(--color-sky-200)}.border-sky-300{border-color:var(--color-sky-300)}.border-sky-400{border-color:var(--color-sky-400)}.border-sky-500{border-color:var(--color-sky-500)}.border-sky-600{border-color:var(--color-sky-600)}.border-sky-700{border-color:var(--color-sky-700)}.border-sky-800{border-color:var(--color-sky-800)}.border-sky-900{border-color:var(--color-sky-900)}.border-sky-950{border-color:var(--color-sky-950)}.border-slate-50{border-color:var(--color-slate-50)}.border-slate-100{border-color:var(--color-slate-100)}.border-slate-200{border-color:var(--color-slate-200)}.border-slate-300{border-color:var(--color-slate-300)}.border-slate-400{border-color:var(--color-slate-400)}.border-slate-500{border-color:var(--color-slate-500)}.border-slate-600{border-color:var(--color-slate-600)}.border-slate-700{border-color:var(--color-slate-700)}.border-slate-800{border-color:var(--color-slate-800)}.border-slate-900{border-color:var(--color-slate-900)}.border-slate-950{border-color:var(--color-slate-950)}.border-stone-50{border-color:var(--color-stone-50)}.border-stone-100{border-color:var(--color-stone-100)}.border-stone-200{border-color:var(--color-stone-200)}.border-stone-300{border-color:var(--color-stone-300)}.border-stone-400{border-color:var(--color-stone-400)}.border-stone-500{border-color:var(--color-stone-500)}.border-stone-600{border-color:var(--color-stone-600)}.border-stone-700{border-color:var(--color-stone-700)}.border-stone-800{border-color:var(--color-stone-800)}.border-stone-900{border-color:var(--color-stone-900)}.border-stone-950{border-color:var(--color-stone-950)}.border-teal-50{border-color:var(--color-teal-50)}.border-teal-100{border-color:var(--color-teal-100)}.border-teal-200{border-color:var(--color-teal-200)}.border-teal-300{border-color:var(--color-teal-300)}.border-teal-400{border-color:var(--color-teal-400)}.border-teal-500{border-color:var(--color-teal-500)}.border-teal-600{border-color:var(--color-teal-600)}.border-teal-700{border-color:var(--color-teal-700)}.border-teal-800{border-color:var(--color-teal-800)}.border-teal-900{border-color:var(--color-teal-900)}.border-teal-950{border-color:var(--color-teal-950)}.border-transparent{border-color:#0000}.border-violet-50{border-color:var(--color-violet-50)}.border-violet-100{border-color:var(--color-violet-100)}.border-violet-200{border-color:var(--color-violet-200)}.border-violet-300{border-color:var(--color-violet-300)}.border-violet-400{border-color:var(--color-violet-400)}.border-violet-500{border-color:var(--color-violet-500)}.border-violet-600{border-color:var(--color-violet-600)}.border-violet-700{border-color:var(--color-violet-700)}.border-violet-800{border-color:var(--color-violet-800)}.border-violet-900{border-color:var(--color-violet-900)}.border-violet-950{border-color:var(--color-violet-950)}.border-white{border-color:var(--color-white)}.border-white\/30{border-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.border-white\/30{border-color:color-mix(in oklab,var(--color-white)30%,transparent)}}.border-yellow-50{border-color:var(--color-yellow-50)}.border-yellow-100{border-color:var(--color-yellow-100)}.border-yellow-200{border-color:var(--color-yellow-200)}.border-yellow-300{border-color:var(--color-yellow-300)}.border-yellow-400{border-color:var(--color-yellow-400)}.border-yellow-500{border-color:var(--color-yellow-500)}.border-yellow-600{border-color:var(--color-yellow-600)}.border-yellow-700{border-color:var(--color-yellow-700)}.border-yellow-800{border-color:var(--color-yellow-800)}.border-yellow-900{border-color:var(--color-yellow-900)}.border-yellow-950{border-color:var(--color-yellow-950)}.border-zinc-50{border-color:var(--color-zinc-50)}.border-zinc-100{border-color:var(--color-zinc-100)}.border-zinc-200{border-color:var(--color-zinc-200)}.border-zinc-300{border-color:var(--color-zinc-300)}.border-zinc-400{border-color:var(--color-zinc-400)}.border-zinc-500{border-color:var(--color-zinc-500)}.border-zinc-600{border-color:var(--color-zinc-600)}.border-zinc-700{border-color:var(--color-zinc-700)}.border-zinc-800{border-color:var(--color-zinc-800)}.border-zinc-900{border-color:var(--color-zinc-900)}.border-zinc-950{border-color:var(--color-zinc-950)}.border-t-blue-500{border-top-color:var(--color-blue-500)}.border-t-gray-900{border-top-color:var(--color-gray-900)}.border-t-white{border-top-color:var(--color-white)}.bg-\[\#03C75A\]{background-color:#03c75a}.bg-\[\#1877F2\]{background-color:#1877f2}.bg-\[\#FEE500\]{background-color:#fee500}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-100{background-color:var(--color-amber-100)}.bg-amber-200{background-color:var(--color-amber-200)}.bg-amber-300{background-color:var(--color-amber-300)}.bg-amber-400{background-color:var(--color-amber-400)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-amber-600{background-color:var(--color-amber-600)}.bg-amber-700{background-color:var(--color-amber-700)}.bg-amber-800{background-color:var(--color-amber-800)}.bg-amber-900{background-color:var(--color-amber-900)}.bg-amber-950{background-color:var(--color-amber-950)}.bg-black{background-color:var(--color-black)}.bg-black\/0{background-color:#0000}@supports (color:color-mix(in lab,red,red)){.bg-black\/0{background-color:color-mix(in oklab,var(--color-black)0%,transparent)}}.bg-black\/40{background-color:#0006}@supports (color:color-mix(in lab,red,red)){.bg-black\/40{background-color:color-mix(in oklab,var(--color-black)40%,transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black)50%,transparent)}}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-50\/70{background-color:#eff6ffb3}@supports (color:color-mix(in lab,red,red)){.bg-blue-50\/70{background-color:color-mix(in oklab,var(--color-blue-50)70%,transparent)}}.bg-blue-100{background-color:var(--color-blue-100)}.bg-blue-200{background-color:var(--color-blue-200)}.bg-blue-300{background-color:var(--color-blue-300)}.bg-blue-400{background-color:var(--color-blue-400)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-blue-500\/20{background-color:#3080ff33}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/20{background-color:color-mix(in oklab,var(--color-blue-500)20%,transparent)}}.bg-blue-600{background-color:var(--color-blue-600)}.bg-blue-700{background-color:var(--color-blue-700)}.bg-blue-800{background-color:var(--color-blue-800)}.bg-blue-900{background-color:var(--color-blue-900)}.bg-blue-950{background-color:var(--color-blue-950)}.bg-current{background-color:currentColor}.bg-cyan-50{background-color:var(--color-cyan-50)}.bg-cyan-100{background-color:var(--color-cyan-100)}.bg-cyan-200{background-color:var(--color-cyan-200)}.bg-cyan-300{background-color:var(--color-cyan-300)}.bg-cyan-400{background-color:var(--color-cyan-400)}.bg-cyan-500{background-color:var(--color-cyan-500)}.bg-cyan-600{background-color:var(--color-cyan-600)}.bg-cyan-700{background-color:var(--color-cyan-700)}.bg-cyan-800{background-color:var(--color-cyan-800)}.bg-cyan-900{background-color:var(--color-cyan-900)}.bg-cyan-950{background-color:var(--color-cyan-950)}.bg-emerald-50{background-color:var(--color-emerald-50)}.bg-emerald-100{background-color:var(--color-emerald-100)}.bg-emerald-200{background-color:var(--color-emerald-200)}.bg-emerald-300{background-color:var(--color-emerald-300)}.bg-emerald-400{background-color:var(--color-emerald-400)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-emerald-600{background-color:var(--color-emerald-600)}.bg-emerald-700{background-color:var(--color-emerald-700)}.bg-emerald-800{background-color:var(--color-emerald-800)}.bg-emerald-900{background-color:var(--color-emerald-900)}.bg-emerald-950{background-color:var(--color-emerald-950)}.bg-fuchsia-50{background-color:var(--color-fuchsia-50)}.bg-fuchsia-100{background-color:var(--color-fuchsia-100)}.bg-fuchsia-200{background-color:var(--color-fuchsia-200)}.bg-fuchsia-300{background-color:var(--color-fuchsia-300)}.bg-fuchsia-400{background-color:var(--color-fuchsia-400)}.bg-fuchsia-500{background-color:var(--color-fuchsia-500)}.bg-fuchsia-600{background-color:var(--color-fuchsia-600)}.bg-fuchsia-700{background-color:var(--color-fuchsia-700)}.bg-fuchsia-800{background-color:var(--color-fuchsia-800)}.bg-fuchsia-900{background-color:var(--color-fuchsia-900)}.bg-fuchsia-950{background-color:var(--color-fuchsia-950)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-100\/70{background-color:#f3f4f6b3}@supports (color:color-mix(in lab,red,red)){.bg-gray-100\/70{background-color:color-mix(in oklab,var(--color-gray-100)70%,transparent)}}.bg-gray-200{background-color:var(--color-gray-200)}.bg-gray-300{background-color:var(--color-gray-300)}.bg-gray-400{background-color:var(--color-gray-400)}.bg-gray-500{background-color:var(--color-gray-500)}.bg-gray-600{background-color:var(--color-gray-600)}.bg-gray-700{background-color:var(--color-gray-700)}.bg-gray-800{background-color:var(--color-gray-800)}.bg-gray-800\/50{background-color:#1e293980}@supports (color:color-mix(in lab,red,red)){.bg-gray-800\/50{background-color:color-mix(in oklab,var(--color-gray-800)50%,transparent)}}.bg-gray-900{background-color:var(--color-gray-900)}.bg-gray-900\/40{background-color:#10182866}@supports (color:color-mix(in lab,red,red)){.bg-gray-900\/40{background-color:color-mix(in oklab,var(--color-gray-900)40%,transparent)}}.bg-gray-900\/50{background-color:#10182880}@supports (color:color-mix(in lab,red,red)){.bg-gray-900\/50{background-color:color-mix(in oklab,var(--color-gray-900)50%,transparent)}}.bg-gray-950{background-color:var(--color-gray-950)}.bg-green-50{background-color:var(--color-green-50)}.bg-green-100{background-color:var(--color-green-100)}.bg-green-200{background-color:var(--color-green-200)}.bg-green-300{background-color:var(--color-green-300)}.bg-green-400{background-color:var(--color-green-400)}.bg-green-500{background-color:var(--color-green-500)}.bg-green-600{background-color:var(--color-green-600)}.bg-green-700{background-color:var(--color-green-700)}.bg-green-800{background-color:var(--color-green-800)}.bg-green-900{background-color:var(--color-green-900)}.bg-green-950{background-color:var(--color-green-950)}.bg-indigo-50{background-color:var(--color-indigo-50)}.bg-indigo-100{background-color:var(--color-indigo-100)}.bg-indigo-200{background-color:var(--color-indigo-200)}.bg-indigo-300{background-color:var(--color-indigo-300)}.bg-indigo-400{background-color:var(--color-indigo-400)}.bg-indigo-500{background-color:var(--color-indigo-500)}.bg-indigo-600{background-color:var(--color-indigo-600)}.bg-indigo-700{background-color:var(--color-indigo-700)}.bg-indigo-800{background-color:var(--color-indigo-800)}.bg-indigo-900{background-color:var(--color-indigo-900)}.bg-indigo-950{background-color:var(--color-indigo-950)}.bg-inherit{background-color:inherit}.bg-lime-50{background-color:var(--color-lime-50)}.bg-lime-100{background-color:var(--color-lime-100)}.bg-lime-200{background-color:var(--color-lime-200)}.bg-lime-300{background-color:var(--color-lime-300)}.bg-lime-400{background-color:var(--color-lime-400)}.bg-lime-500{background-color:var(--color-lime-500)}.bg-lime-600{background-color:var(--color-lime-600)}.bg-lime-700{background-color:var(--color-lime-700)}.bg-lime-800{background-color:var(--color-lime-800)}.bg-lime-900{background-color:var(--color-lime-900)}.bg-lime-950{background-color:var(--color-lime-950)}.bg-neutral-50{background-color:var(--color-neutral-50)}.bg-neutral-100{background-color:var(--color-neutral-100)}.bg-neutral-200{background-color:var(--color-neutral-200)}.bg-neutral-300{background-color:var(--color-neutral-300)}.bg-neutral-400{background-color:var(--color-neutral-400)}.bg-neutral-500{background-color:var(--color-neutral-500)}.bg-neutral-600{background-color:var(--color-neutral-600)}.bg-neutral-700{background-color:var(--color-neutral-700)}.bg-neutral-800{background-color:var(--color-neutral-800)}.bg-neutral-900{background-color:var(--color-neutral-900)}.bg-neutral-950{background-color:var(--color-neutral-950)}.bg-orange-50{background-color:var(--color-orange-50)}.bg-orange-100{background-color:var(--color-orange-100)}.bg-orange-200{background-color:var(--color-orange-200)}.bg-orange-300{background-color:var(--color-orange-300)}.bg-orange-400{background-color:var(--color-orange-400)}.bg-orange-500{background-color:var(--color-orange-500)}.bg-orange-600{background-color:var(--color-orange-600)}.bg-orange-700{background-color:var(--color-orange-700)}.bg-orange-800{background-color:var(--color-orange-800)}.bg-orange-900{background-color:var(--color-orange-900)}.bg-orange-950{background-color:var(--color-orange-950)}.bg-pink-50{background-color:var(--color-pink-50)}.bg-pink-100{background-color:var(--color-pink-100)}.bg-pink-200{background-color:var(--color-pink-200)}.bg-pink-300{background-color:var(--color-pink-300)}.bg-pink-400{background-color:var(--color-pink-400)}.bg-pink-500{background-color:var(--color-pink-500)}.bg-pink-600{background-color:var(--color-pink-600)}.bg-pink-700{background-color:var(--color-pink-700)}.bg-pink-800{background-color:var(--color-pink-800)}.bg-pink-900{background-color:var(--color-pink-900)}.bg-pink-950{background-color:var(--color-pink-950)}.bg-primary-50{background-color:var(--color-primary-50)}.bg-primary-100{background-color:var(--color-primary-100)}.bg-primary-600{background-color:var(--color-primary-600)}.bg-purple-50{background-color:var(--color-purple-50)}.bg-purple-100{background-color:var(--color-purple-100)}.bg-purple-200{background-color:var(--color-purple-200)}.bg-purple-300{background-color:var(--color-purple-300)}.bg-purple-400{background-color:var(--color-purple-400)}.bg-purple-500{background-color:var(--color-purple-500)}.bg-purple-500\/80{background-color:#ac4bffcc}@supports (color:color-mix(in lab,red,red)){.bg-purple-500\/80{background-color:color-mix(in oklab,var(--color-purple-500)80%,transparent)}}.bg-purple-600{background-color:var(--color-purple-600)}.bg-purple-700{background-color:var(--color-purple-700)}.bg-purple-800{background-color:var(--color-purple-800)}.bg-purple-900{background-color:var(--color-purple-900)}.bg-purple-950{background-color:var(--color-purple-950)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-50\/30{background-color:#fef2f24d}@supports (color:color-mix(in lab,red,red)){.bg-red-50\/30{background-color:color-mix(in oklab,var(--color-red-50)30%,transparent)}}.bg-red-100{background-color:var(--color-red-100)}.bg-red-200{background-color:var(--color-red-200)}.bg-red-300{background-color:var(--color-red-300)}.bg-red-400{background-color:var(--color-red-400)}.bg-red-500{background-color:var(--color-red-500)}.bg-red-500\/50{background-color:#fb2c3680}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/50{background-color:color-mix(in oklab,var(--color-red-500)50%,transparent)}}.bg-red-600{background-color:var(--color-red-600)}.bg-red-700{background-color:var(--color-red-700)}.bg-red-800{background-color:var(--color-red-800)}.bg-red-900{background-color:var(--color-red-900)}.bg-red-950{background-color:var(--color-red-950)}.bg-rose-50{background-color:var(--color-rose-50)}.bg-rose-100{background-color:var(--color-rose-100)}.bg-rose-200{background-color:var(--color-rose-200)}.bg-rose-300{background-color:var(--color-rose-300)}.bg-rose-400{background-color:var(--color-rose-400)}.bg-rose-500{background-color:var(--color-rose-500)}.bg-rose-600{background-color:var(--color-rose-600)}.bg-rose-700{background-color:var(--color-rose-700)}.bg-rose-800{background-color:var(--color-rose-800)}.bg-rose-900{background-color:var(--color-rose-900)}.bg-rose-950{background-color:var(--color-rose-950)}.bg-sky-50{background-color:var(--color-sky-50)}.bg-sky-100{background-color:var(--color-sky-100)}.bg-sky-200{background-color:var(--color-sky-200)}.bg-sky-300{background-color:var(--color-sky-300)}.bg-sky-400{background-color:var(--color-sky-400)}.bg-sky-500{background-color:var(--color-sky-500)}.bg-sky-600{background-color:var(--color-sky-600)}.bg-sky-700{background-color:var(--color-sky-700)}.bg-sky-800{background-color:var(--color-sky-800)}.bg-sky-900{background-color:var(--color-sky-900)}.bg-sky-950{background-color:var(--color-sky-950)}.bg-slate-50{background-color:var(--color-slate-50)}.bg-slate-100{background-color:var(--color-slate-100)}.bg-slate-200{background-color:var(--color-slate-200)}.bg-slate-300{background-color:var(--color-slate-300)}.bg-slate-400{background-color:var(--color-slate-400)}.bg-slate-500{background-color:var(--color-slate-500)}.bg-slate-600{background-color:var(--color-slate-600)}.bg-slate-700{background-color:var(--color-slate-700)}.bg-slate-800{background-color:var(--color-slate-800)}.bg-slate-900{background-color:var(--color-slate-900)}.bg-slate-950{background-color:var(--color-slate-950)}.bg-stone-50{background-color:var(--color-stone-50)}.bg-stone-100{background-color:var(--color-stone-100)}.bg-stone-200{background-color:var(--color-stone-200)}.bg-stone-300{background-color:var(--color-stone-300)}.bg-stone-400{background-color:var(--color-stone-400)}.bg-stone-500{background-color:var(--color-stone-500)}.bg-stone-600{background-color:var(--color-stone-600)}.bg-stone-700{background-color:var(--color-stone-700)}.bg-stone-800{background-color:var(--color-stone-800)}.bg-stone-900{background-color:var(--color-stone-900)}.bg-stone-950{background-color:var(--color-stone-950)}.bg-teal-50{background-color:var(--color-teal-50)}.bg-teal-100{background-color:var(--color-teal-100)}.bg-teal-200{background-color:var(--color-teal-200)}.bg-teal-300{background-color:var(--color-teal-300)}.bg-teal-400{background-color:var(--color-teal-400)}.bg-teal-500{background-color:var(--color-teal-500)}.bg-teal-600{background-color:var(--color-teal-600)}.bg-teal-700{background-color:var(--color-teal-700)}.bg-teal-800{background-color:var(--color-teal-800)}.bg-teal-900{background-color:var(--color-teal-900)}.bg-teal-950{background-color:var(--color-teal-950)}.bg-transparent{background-color:#0000}.bg-violet-50{background-color:var(--color-violet-50)}.bg-violet-100{background-color:var(--color-violet-100)}.bg-violet-200{background-color:var(--color-violet-200)}.bg-violet-300{background-color:var(--color-violet-300)}.bg-violet-400{background-color:var(--color-violet-400)}.bg-violet-500{background-color:var(--color-violet-500)}.bg-violet-600{background-color:var(--color-violet-600)}.bg-violet-700{background-color:var(--color-violet-700)}.bg-violet-800{background-color:var(--color-violet-800)}.bg-violet-900{background-color:var(--color-violet-900)}.bg-violet-950{background-color:var(--color-violet-950)}.bg-white{background-color:var(--color-white)}.bg-white\/20{background-color:#fff3}@supports (color:color-mix(in lab,red,red)){.bg-white\/20{background-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.bg-white\/30{background-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.bg-white\/30{background-color:color-mix(in oklab,var(--color-white)30%,transparent)}}.bg-white\/50{background-color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.bg-white\/50{background-color:color-mix(in oklab,var(--color-white)50%,transparent)}}.bg-white\/90{background-color:#ffffffe6}@supports (color:color-mix(in lab,red,red)){.bg-white\/90{background-color:color-mix(in oklab,var(--color-white)90%,transparent)}}.bg-yellow-50{background-color:var(--color-yellow-50)}.bg-yellow-100{background-color:var(--color-yellow-100)}.bg-yellow-200{background-color:var(--color-yellow-200)}.bg-yellow-300{background-color:var(--color-yellow-300)}.bg-yellow-400{background-color:var(--color-yellow-400)}.bg-yellow-500{background-color:var(--color-yellow-500)}.bg-yellow-600{background-color:var(--color-yellow-600)}.bg-yellow-700{background-color:var(--color-yellow-700)}.bg-yellow-800{background-color:var(--color-yellow-800)}.bg-yellow-900{background-color:var(--color-yellow-900)}.bg-yellow-950{background-color:var(--color-yellow-950)}.bg-zinc-50{background-color:var(--color-zinc-50)}.bg-zinc-100{background-color:var(--color-zinc-100)}.bg-zinc-200{background-color:var(--color-zinc-200)}.bg-zinc-300{background-color:var(--color-zinc-300)}.bg-zinc-400{background-color:var(--color-zinc-400)}.bg-zinc-500{background-color:var(--color-zinc-500)}.bg-zinc-600{background-color:var(--color-zinc-600)}.bg-zinc-700{background-color:var(--color-zinc-700)}.bg-zinc-800{background-color:var(--color-zinc-800)}.bg-zinc-900{background-color:var(--color-zinc-900)}.bg-zinc-950{background-color:var(--color-zinc-950)}.bg-gradient-to-b{--tw-gradient-position:to bottom in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-bl{--tw-gradient-position:to bottom left in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-l{--tw-gradient-position:to left in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-t{--tw-gradient-position:to top in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-tl{--tw-gradient-position:to top left in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-tr{--tw-gradient-position:to top right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-none{background-image:none}.from-black{--tw-gradient-from:var(--color-black);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-black\/90{--tw-gradient-from:#000000e6}@supports (color:color-mix(in lab,red,red)){.from-black\/90{--tw-gradient-from:color-mix(in oklab,var(--color-black)90%,transparent)}}.from-black\/90{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-blue-50{--tw-gradient-from:var(--color-blue-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-blue-100{--tw-gradient-from:var(--color-blue-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-blue-200{--tw-gradient-from:var(--color-blue-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-blue-300{--tw-gradient-from:var(--color-blue-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-blue-400{--tw-gradient-from:var(--color-blue-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-blue-500{--tw-gradient-from:var(--color-blue-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-blue-600{--tw-gradient-from:var(--color-blue-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-blue-700{--tw-gradient-from:var(--color-blue-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-blue-800{--tw-gradient-from:var(--color-blue-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-blue-900{--tw-gradient-from:var(--color-blue-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-current{--tw-gradient-from:currentcolor;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-emerald-500{--tw-gradient-from:var(--color-emerald-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-gray-50{--tw-gradient-from:var(--color-gray-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-gray-100{--tw-gradient-from:var(--color-gray-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-gray-200{--tw-gradient-from:var(--color-gray-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-gray-300{--tw-gradient-from:var(--color-gray-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-gray-400{--tw-gradient-from:var(--color-gray-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-gray-500{--tw-gradient-from:var(--color-gray-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-gray-600{--tw-gradient-from:var(--color-gray-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-gray-700{--tw-gradient-from:var(--color-gray-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-gray-800{--tw-gradient-from:var(--color-gray-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-gray-900{--tw-gradient-from:var(--color-gray-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-green-50{--tw-gradient-from:var(--color-green-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-green-100{--tw-gradient-from:var(--color-green-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-green-200{--tw-gradient-from:var(--color-green-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-green-300{--tw-gradient-from:var(--color-green-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-green-400{--tw-gradient-from:var(--color-green-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-green-500{--tw-gradient-from:var(--color-green-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-green-600{--tw-gradient-from:var(--color-green-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-green-700{--tw-gradient-from:var(--color-green-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-green-800{--tw-gradient-from:var(--color-green-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-green-900{--tw-gradient-from:var(--color-green-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-indigo-50{--tw-gradient-from:var(--color-indigo-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-indigo-100{--tw-gradient-from:var(--color-indigo-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-indigo-200{--tw-gradient-from:var(--color-indigo-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-indigo-300{--tw-gradient-from:var(--color-indigo-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-indigo-400{--tw-gradient-from:var(--color-indigo-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-indigo-500{--tw-gradient-from:var(--color-indigo-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-indigo-600{--tw-gradient-from:var(--color-indigo-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-indigo-700{--tw-gradient-from:var(--color-indigo-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-indigo-800{--tw-gradient-from:var(--color-indigo-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-indigo-900{--tw-gradient-from:var(--color-indigo-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-inherit{--tw-gradient-from:inherit;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-orange-50{--tw-gradient-from:var(--color-orange-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-orange-100{--tw-gradient-from:var(--color-orange-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-orange-200{--tw-gradient-from:var(--color-orange-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-orange-300{--tw-gradient-from:var(--color-orange-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-orange-400{--tw-gradient-from:var(--color-orange-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-orange-500{--tw-gradient-from:var(--color-orange-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-orange-600{--tw-gradient-from:var(--color-orange-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-orange-700{--tw-gradient-from:var(--color-orange-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-orange-800{--tw-gradient-from:var(--color-orange-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-orange-900{--tw-gradient-from:var(--color-orange-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-pink-50{--tw-gradient-from:var(--color-pink-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-pink-100{--tw-gradient-from:var(--color-pink-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-pink-200{--tw-gradient-from:var(--color-pink-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-pink-300{--tw-gradient-from:var(--color-pink-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-pink-400{--tw-gradient-from:var(--color-pink-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-pink-500{--tw-gradient-from:var(--color-pink-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-pink-600{--tw-gradient-from:var(--color-pink-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-pink-700{--tw-gradient-from:var(--color-pink-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-pink-800{--tw-gradient-from:var(--color-pink-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-pink-900{--tw-gradient-from:var(--color-pink-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-purple-50{--tw-gradient-from:var(--color-purple-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-purple-100{--tw-gradient-from:var(--color-purple-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-purple-200{--tw-gradient-from:var(--color-purple-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-purple-300{--tw-gradient-from:var(--color-purple-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-purple-400{--tw-gradient-from:var(--color-purple-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-purple-500{--tw-gradient-from:var(--color-purple-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-purple-600{--tw-gradient-from:var(--color-purple-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-purple-700{--tw-gradient-from:var(--color-purple-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-purple-800{--tw-gradient-from:var(--color-purple-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-purple-900{--tw-gradient-from:var(--color-purple-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-red-50{--tw-gradient-from:var(--color-red-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-red-100{--tw-gradient-from:var(--color-red-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-red-200{--tw-gradient-from:var(--color-red-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-red-300{--tw-gradient-from:var(--color-red-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-red-400{--tw-gradient-from:var(--color-red-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-red-500{--tw-gradient-from:var(--color-red-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-red-600{--tw-gradient-from:var(--color-red-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-red-700{--tw-gradient-from:var(--color-red-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-red-800{--tw-gradient-from:var(--color-red-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-red-900{--tw-gradient-from:var(--color-red-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-slate-50{--tw-gradient-from:var(--color-slate-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-slate-100{--tw-gradient-from:var(--color-slate-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-slate-200{--tw-gradient-from:var(--color-slate-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-slate-300{--tw-gradient-from:var(--color-slate-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-slate-400{--tw-gradient-from:var(--color-slate-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-slate-500{--tw-gradient-from:var(--color-slate-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-slate-600{--tw-gradient-from:var(--color-slate-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-slate-700{--tw-gradient-from:var(--color-slate-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-slate-800{--tw-gradient-from:var(--color-slate-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-slate-900{--tw-gradient-from:var(--color-slate-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-transparent{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-white{--tw-gradient-from:var(--color-white);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-yellow-50{--tw-gradient-from:var(--color-yellow-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-yellow-100{--tw-gradient-from:var(--color-yellow-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-yellow-200{--tw-gradient-from:var(--color-yellow-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-yellow-300{--tw-gradient-from:var(--color-yellow-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-yellow-400{--tw-gradient-from:var(--color-yellow-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-yellow-500{--tw-gradient-from:var(--color-yellow-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-yellow-600{--tw-gradient-from:var(--color-yellow-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-yellow-700{--tw-gradient-from:var(--color-yellow-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-yellow-800{--tw-gradient-from:var(--color-yellow-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-yellow-900{--tw-gradient-from:var(--color-yellow-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.via-black{--tw-gradient-via:var(--color-black);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-black\/60{--tw-gradient-via:#0009}@supports (color:color-mix(in lab,red,red)){.via-black\/60{--tw-gradient-via:color-mix(in oklab,var(--color-black)60%,transparent)}}.via-black\/60{--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-blue-50{--tw-gradient-via:var(--color-blue-50);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-blue-100{--tw-gradient-via:var(--color-blue-100);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-blue-200{--tw-gradient-via:var(--color-blue-200);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-blue-300{--tw-gradient-via:var(--color-blue-300);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-blue-400{--tw-gradient-via:var(--color-blue-400);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-blue-500{--tw-gradient-via:var(--color-blue-500);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-blue-600{--tw-gradient-via:var(--color-blue-600);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-blue-700{--tw-gradient-via:var(--color-blue-700);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-blue-800{--tw-gradient-via:var(--color-blue-800);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-blue-900{--tw-gradient-via:var(--color-blue-900);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-current{--tw-gradient-via:currentcolor;--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-gray-50{--tw-gradient-via:var(--color-gray-50);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-gray-100{--tw-gradient-via:var(--color-gray-100);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-gray-200{--tw-gradient-via:var(--color-gray-200);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-gray-300{--tw-gradient-via:var(--color-gray-300);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-gray-400{--tw-gradient-via:var(--color-gray-400);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-gray-500{--tw-gradient-via:var(--color-gray-500);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-gray-600{--tw-gradient-via:var(--color-gray-600);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-gray-700{--tw-gradient-via:var(--color-gray-700);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-gray-800{--tw-gradient-via:var(--color-gray-800);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-gray-900{--tw-gradient-via:var(--color-gray-900);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-inherit{--tw-gradient-via:inherit;--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-slate-50{--tw-gradient-via:var(--color-slate-50);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-slate-100{--tw-gradient-via:var(--color-slate-100);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-slate-200{--tw-gradient-via:var(--color-slate-200);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-slate-300{--tw-gradient-via:var(--color-slate-300);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-slate-400{--tw-gradient-via:var(--color-slate-400);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-slate-500{--tw-gradient-via:var(--color-slate-500);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-slate-600{--tw-gradient-via:var(--color-slate-600);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-slate-700{--tw-gradient-via:var(--color-slate-700);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-slate-800{--tw-gradient-via:var(--color-slate-800);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-slate-900{--tw-gradient-via:var(--color-slate-900);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-transparent{--tw-gradient-via:transparent;--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-white{--tw-gradient-via:var(--color-white);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.to-black{--tw-gradient-to:var(--color-black);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-blue-50{--tw-gradient-to:var(--color-blue-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-blue-100{--tw-gradient-to:var(--color-blue-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-blue-200{--tw-gradient-to:var(--color-blue-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-blue-300{--tw-gradient-to:var(--color-blue-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-blue-400{--tw-gradient-to:var(--color-blue-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-blue-500{--tw-gradient-to:var(--color-blue-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-blue-600{--tw-gradient-to:var(--color-blue-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-blue-700{--tw-gradient-to:var(--color-blue-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-blue-800{--tw-gradient-to:var(--color-blue-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-blue-900{--tw-gradient-to:var(--color-blue-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-current{--tw-gradient-to:currentcolor;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-gray-50{--tw-gradient-to:var(--color-gray-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-gray-100{--tw-gradient-to:var(--color-gray-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-gray-200{--tw-gradient-to:var(--color-gray-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-gray-300{--tw-gradient-to:var(--color-gray-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-gray-400{--tw-gradient-to:var(--color-gray-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-gray-500{--tw-gradient-to:var(--color-gray-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-gray-600{--tw-gradient-to:var(--color-gray-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-gray-700{--tw-gradient-to:var(--color-gray-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-gray-800{--tw-gradient-to:var(--color-gray-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-gray-900{--tw-gradient-to:var(--color-gray-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-inherit{--tw-gradient-to:inherit;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-purple-50{--tw-gradient-to:var(--color-purple-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-purple-100{--tw-gradient-to:var(--color-purple-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-purple-200{--tw-gradient-to:var(--color-purple-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-purple-300{--tw-gradient-to:var(--color-purple-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-purple-400{--tw-gradient-to:var(--color-purple-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-purple-500{--tw-gradient-to:var(--color-purple-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-purple-600{--tw-gradient-to:var(--color-purple-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-purple-700{--tw-gradient-to:var(--color-purple-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-purple-800{--tw-gradient-to:var(--color-purple-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-purple-900{--tw-gradient-to:var(--color-purple-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-red-50{--tw-gradient-to:var(--color-red-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-red-100{--tw-gradient-to:var(--color-red-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-red-200{--tw-gradient-to:var(--color-red-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-red-300{--tw-gradient-to:var(--color-red-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-red-400{--tw-gradient-to:var(--color-red-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-red-500{--tw-gradient-to:var(--color-red-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-red-600{--tw-gradient-to:var(--color-red-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-red-700{--tw-gradient-to:var(--color-red-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-red-800{--tw-gradient-to:var(--color-red-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-red-900{--tw-gradient-to:var(--color-red-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-slate-50{--tw-gradient-to:var(--color-slate-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-slate-100{--tw-gradient-to:var(--color-slate-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-slate-200{--tw-gradient-to:var(--color-slate-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-slate-300{--tw-gradient-to:var(--color-slate-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-slate-400{--tw-gradient-to:var(--color-slate-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-slate-500{--tw-gradient-to:var(--color-slate-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-slate-600{--tw-gradient-to:var(--color-slate-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-slate-700{--tw-gradient-to:var(--color-slate-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-slate-800{--tw-gradient-to:var(--color-slate-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-slate-900{--tw-gradient-to:var(--color-slate-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-teal-600{--tw-gradient-to:var(--color-teal-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-transparent{--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-white{--tw-gradient-to:var(--color-white);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.object-fill{object-fit:fill}.object-none{object-fit:none}.object-scale-down{object-fit:scale-down}.object-bottom{object-position:bottom}.object-center{object-position:center}.object-left{object-position:left}.object-left-bottom{object-position:left bottom}.object-left-top{object-position:left top}.object-right{object-position:right}.object-right-bottom{object-position:right bottom}.object-right-top{object-position:right top}.object-top{object-position:top}.p-0{padding:calc(var(--spacing)*0)}.p-1{padding:calc(var(--spacing)*1)}.p-1\.5{padding:calc(var(--spacing)*1.5)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-5{padding:calc(var(--spacing)*5)}.p-6{padding:calc(var(--spacing)*6)}.p-8{padding:calc(var(--spacing)*8)}.p-10{padding:calc(var(--spacing)*10)}.p-12{padding:calc(var(--spacing)*12)}.p-16{padding:calc(var(--spacing)*16)}.p-20{padding:calc(var(--spacing)*20)}.p-24{padding:calc(var(--spacing)*24)}.px-0{padding-inline:calc(var(--spacing)*0)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-1\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-5{padding-inline:calc(var(--spacing)*5)}.px-6{padding-inline:calc(var(--spacing)*6)}.px-8{padding-inline:calc(var(--spacing)*8)}.px-10{padding-inline:calc(var(--spacing)*10)}.px-12{padding-inline:calc(var(--spacing)*12)}.px-16{padding-inline:calc(var(--spacing)*16)}.py-0{padding-block:calc(var(--spacing)*0)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-2\.5{padding-block:calc(var(--spacing)*2.5)}.py-3{padding-block:calc(var(--spacing)*3)}.py-3\.5{padding-block:calc(var(--spacing)*3.5)}.py-4{padding-block:calc(var(--spacing)*4)}.py-5{padding-block:calc(var(--spacing)*5)}.py-6{padding-block:calc(var(--spacing)*6)}.py-8{padding-block:calc(var(--spacing)*8)}.py-10{padding-block:calc(var(--spacing)*10)}.py-12{padding-block:calc(var(--spacing)*12)}.py-16{padding-block:calc(var(--spacing)*16)}.py-20{padding-block:calc(var(--spacing)*20)}.pt-0{padding-top:calc(var(--spacing)*0)}.pt-1{padding-top:calc(var(--spacing)*1)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-3{padding-top:calc(var(--spacing)*3)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-5{padding-top:calc(var(--spacing)*5)}.pt-6{padding-top:calc(var(--spacing)*6)}.pt-8{padding-top:calc(var(--spacing)*8)}.pt-10{padding-top:calc(var(--spacing)*10)}.pt-12{padding-top:calc(var(--spacing)*12)}.pt-16{padding-top:calc(var(--spacing)*16)}.pr-0{padding-right:calc(var(--spacing)*0)}.pr-1{padding-right:calc(var(--spacing)*1)}.pr-2{padding-right:calc(var(--spacing)*2)}.pr-3{padding-right:calc(var(--spacing)*3)}.pr-4{padding-right:calc(var(--spacing)*4)}.pr-5{padding-right:calc(var(--spacing)*5)}.pr-6{padding-right:calc(var(--spacing)*6)}.pr-8{padding-right:calc(var(--spacing)*8)}.pr-10{padding-right:calc(var(--spacing)*10)}.pr-12{padding-right:calc(var(--spacing)*12)}.pr-16{padding-right:calc(var(--spacing)*16)}.pb-0{padding-bottom:calc(var(--spacing)*0)}.pb-1{padding-bottom:calc(var(--spacing)*1)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pb-3{padding-bottom:calc(var(--spacing)*3)}.pb-4{padding-bottom:calc(var(--spacing)*4)}.pb-5{padding-bottom:calc(var(--spacing)*5)}.pb-6{padding-bottom:calc(var(--spacing)*6)}.pb-8{padding-bottom:calc(var(--spacing)*8)}.pb-10{padding-bottom:calc(var(--spacing)*10)}.pb-12{padding-bottom:calc(var(--spacing)*12)}.pb-16{padding-bottom:calc(var(--spacing)*16)}.pl-0{padding-left:calc(var(--spacing)*0)}.pl-1{padding-left:calc(var(--spacing)*1)}.pl-2{padding-left:calc(var(--spacing)*2)}.pl-3{padding-left:calc(var(--spacing)*3)}.pl-4{padding-left:calc(var(--spacing)*4)}.pl-5{padding-left:calc(var(--spacing)*5)}.pl-6{padding-left:calc(var(--spacing)*6)}.pl-8{padding-left:calc(var(--spacing)*8)}.pl-10{padding-left:calc(var(--spacing)*10)}.pl-12{padding-left:calc(var(--spacing)*12)}.pl-16{padding-left:calc(var(--spacing)*16)}.text-center{text-align:center}.text-end{text-align:end}.text-justify{text-align:justify}.text-left{text-align:left}.text-right{text-align:right}.text-start{text-align:start}.indent-0{text-indent:calc(var(--spacing)*0)}.indent-1{text-indent:calc(var(--spacing)*1)}.indent-2{text-indent:calc(var(--spacing)*2)}.indent-4{text-indent:calc(var(--spacing)*4)}.indent-8{text-indent:calc(var(--spacing)*8)}.align-baseline{vertical-align:baseline}.align-bottom{vertical-align:bottom}.align-middle{vertical-align:middle}.align-sub{vertical-align:sub}.align-super{vertical-align:super}.align-text-bottom{vertical-align:text-bottom}.align-text-top{vertical-align:text-top}.align-top{vertical-align:top}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}.text-7xl{font-size:var(--text-7xl);line-height:var(--tw-leading,var(--text-7xl--line-height))}.text-8xl{font-size:var(--text-8xl);line-height:var(--tw-leading,var(--text-8xl--line-height))}.text-9xl{font-size:var(--text-9xl);line-height:var(--tw-leading,var(--text-9xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.leading-3{--tw-leading:calc(var(--spacing)*3);line-height:calc(var(--spacing)*3)}.leading-4{--tw-leading:calc(var(--spacing)*4);line-height:calc(var(--spacing)*4)}.leading-5{--tw-leading:calc(var(--spacing)*5);line-height:calc(var(--spacing)*5)}.leading-6{--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6)}.leading-7{--tw-leading:calc(var(--spacing)*7);line-height:calc(var(--spacing)*7)}.leading-8{--tw-leading:calc(var(--spacing)*8);line-height:calc(var(--spacing)*8)}.leading-9{--tw-leading:calc(var(--spacing)*9);line-height:calc(var(--spacing)*9)}.leading-10{--tw-leading:calc(var(--spacing)*10);line-height:calc(var(--spacing)*10)}.leading-loose{--tw-leading:var(--leading-loose);line-height:var(--leading-loose)}.leading-none{--tw-leading:1;line-height:1}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-extralight{--tw-font-weight:var(--font-weight-extralight);font-weight:var(--font-weight-extralight)}.font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.font-thin{--tw-font-weight:var(--font-weight-thin);font-weight:var(--font-weight-thin)}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-tighter{--tw-tracking:var(--tracking-tighter);letter-spacing:var(--tracking-tighter)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-normal{overflow-wrap:normal;word-break:normal}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.break-keep{word-break:keep-all}.text-clip{text-overflow:clip}.text-ellipsis{text-overflow:ellipsis}.\!whitespace-normal{white-space:normal!important}.whitespace-break-spaces{white-space:break-spaces}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.text-\[\#000000\]\/85{color:oklab(0% none none/.85)}.text-amber-50{color:var(--color-amber-50)}.text-amber-100{color:var(--color-amber-100)}.text-amber-200{color:var(--color-amber-200)}.text-amber-300{color:var(--color-amber-300)}.text-amber-400{color:var(--color-amber-400)}.text-amber-500{color:var(--color-amber-500)}.text-amber-600{color:var(--color-amber-600)}.text-amber-700{color:var(--color-amber-700)}.text-amber-800{color:var(--color-amber-800)}.text-amber-900{color:var(--color-amber-900)}.text-amber-950{color:var(--color-amber-950)}.text-black{color:var(--color-black)}.text-blue-50{color:var(--color-blue-50)}.text-blue-100{color:var(--color-blue-100)}.text-blue-200{color:var(--color-blue-200)}.text-blue-300{color:var(--color-blue-300)}.text-blue-400{color:var(--color-blue-400)}.text-blue-500{color:var(--color-blue-500)}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-blue-800{color:var(--color-blue-800)}.text-blue-900{color:var(--color-blue-900)}.text-blue-950{color:var(--color-blue-950)}.text-current{color:currentColor}.text-cyan-50{color:var(--color-cyan-50)}.text-cyan-100{color:var(--color-cyan-100)}.text-cyan-200{color:var(--color-cyan-200)}.text-cyan-300{color:var(--color-cyan-300)}.text-cyan-400{color:var(--color-cyan-400)}.text-cyan-500{color:var(--color-cyan-500)}.text-cyan-600{color:var(--color-cyan-600)}.text-cyan-700{color:var(--color-cyan-700)}.text-cyan-800{color:var(--color-cyan-800)}.text-cyan-900{color:var(--color-cyan-900)}.text-cyan-950{color:var(--color-cyan-950)}.text-emerald-50{color:var(--color-emerald-50)}.text-emerald-100{color:var(--color-emerald-100)}.text-emerald-200{color:var(--color-emerald-200)}.text-emerald-300{color:var(--color-emerald-300)}.text-emerald-400{color:var(--color-emerald-400)}.text-emerald-500{color:var(--color-emerald-500)}.text-emerald-600{color:var(--color-emerald-600)}.text-emerald-700{color:var(--color-emerald-700)}.text-emerald-800{color:var(--color-emerald-800)}.text-emerald-900{color:var(--color-emerald-900)}.text-emerald-950{color:var(--color-emerald-950)}.text-fuchsia-50{color:var(--color-fuchsia-50)}.text-fuchsia-100{color:var(--color-fuchsia-100)}.text-fuchsia-200{color:var(--color-fuchsia-200)}.text-fuchsia-300{color:var(--color-fuchsia-300)}.text-fuchsia-400{color:var(--color-fuchsia-400)}.text-fuchsia-500{color:var(--color-fuchsia-500)}.text-fuchsia-600{color:var(--color-fuchsia-600)}.text-fuchsia-700{color:var(--color-fuchsia-700)}.text-fuchsia-800{color:var(--color-fuchsia-800)}.text-fuchsia-900{color:var(--color-fuchsia-900)}.text-fuchsia-950{color:var(--color-fuchsia-950)}.text-gray-50{color:var(--color-gray-50)}.text-gray-100{color:var(--color-gray-100)}.text-gray-200{color:var(--color-gray-200)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-gray-900{color:var(--color-gray-900)}.text-gray-950{color:var(--color-gray-950)}.text-green-50{color:var(--color-green-50)}.text-green-100{color:var(--color-green-100)}.text-green-200{color:var(--color-green-200)}.text-green-300{color:var(--color-green-300)}.text-green-400{color:var(--color-green-400)}.text-green-500{color:var(--color-green-500)}.text-green-600{color:var(--color-green-600)}.text-green-700{color:var(--color-green-700)}.text-green-800{color:var(--color-green-800)}.text-green-900{color:var(--color-green-900)}.text-green-950{color:var(--color-green-950)}.text-indigo-50{color:var(--color-indigo-50)}.text-indigo-100{color:var(--color-indigo-100)}.text-indigo-200{color:var(--color-indigo-200)}.text-indigo-300{color:var(--color-indigo-300)}.text-indigo-400{color:var(--color-indigo-400)}.text-indigo-500{color:var(--color-indigo-500)}.text-indigo-600{color:var(--color-indigo-600)}.text-indigo-700{color:var(--color-indigo-700)}.text-indigo-800{color:var(--color-indigo-800)}.text-indigo-900{color:var(--color-indigo-900)}.text-indigo-950{color:var(--color-indigo-950)}.text-inherit{color:inherit}.text-lime-50{color:var(--color-lime-50)}.text-lime-100{color:var(--color-lime-100)}.text-lime-200{color:var(--color-lime-200)}.text-lime-300{color:var(--color-lime-300)}.text-lime-400{color:var(--color-lime-400)}.text-lime-500{color:var(--color-lime-500)}.text-lime-600{color:var(--color-lime-600)}.text-lime-700{color:var(--color-lime-700)}.text-lime-800{color:var(--color-lime-800)}.text-lime-900{color:var(--color-lime-900)}.text-lime-950{color:var(--color-lime-950)}.text-neutral-50{color:var(--color-neutral-50)}.text-neutral-100{color:var(--color-neutral-100)}.text-neutral-200{color:var(--color-neutral-200)}.text-neutral-300{color:var(--color-neutral-300)}.text-neutral-400{color:var(--color-neutral-400)}.text-neutral-500{color:var(--color-neutral-500)}.text-neutral-600{color:var(--color-neutral-600)}.text-neutral-700{color:var(--color-neutral-700)}.text-neutral-800{color:var(--color-neutral-800)}.text-neutral-900{color:var(--color-neutral-900)}.text-neutral-950{color:var(--color-neutral-950)}.text-orange-50{color:var(--color-orange-50)}.text-orange-100{color:var(--color-orange-100)}.text-orange-200{color:var(--color-orange-200)}.text-orange-300{color:var(--color-orange-300)}.text-orange-400{color:var(--color-orange-400)}.text-orange-500{color:var(--color-orange-500)}.text-orange-600{color:var(--color-orange-600)}.text-orange-700{color:var(--color-orange-700)}.text-orange-800{color:var(--color-orange-800)}.text-orange-900{color:var(--color-orange-900)}.text-orange-950{color:var(--color-orange-950)}.text-pink-50{color:var(--color-pink-50)}.text-pink-100{color:var(--color-pink-100)}.text-pink-200{color:var(--color-pink-200)}.text-pink-300{color:var(--color-pink-300)}.text-pink-400{color:var(--color-pink-400)}.text-pink-500{color:var(--color-pink-500)}.text-pink-600{color:var(--color-pink-600)}.text-pink-700{color:var(--color-pink-700)}.text-pink-800{color:var(--color-pink-800)}.text-pink-900{color:var(--color-pink-900)}.text-pink-950{color:var(--color-pink-950)}.text-primary-400{color:var(--color-primary-400)}.text-primary-600{color:var(--color-primary-600)}.text-purple-50{color:var(--color-purple-50)}.text-purple-100{color:var(--color-purple-100)}.text-purple-200{color:var(--color-purple-200)}.text-purple-300{color:var(--color-purple-300)}.text-purple-400{color:var(--color-purple-400)}.text-purple-500{color:var(--color-purple-500)}.text-purple-600{color:var(--color-purple-600)}.text-purple-700{color:var(--color-purple-700)}.text-purple-800{color:var(--color-purple-800)}.text-purple-900{color:var(--color-purple-900)}.text-purple-950{color:var(--color-purple-950)}.text-red-50{color:var(--color-red-50)}.text-red-100{color:var(--color-red-100)}.text-red-200{color:var(--color-red-200)}.text-red-300{color:var(--color-red-300)}.text-red-400{color:var(--color-red-400)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-red-700{color:var(--color-red-700)}.text-red-800{color:var(--color-red-800)}.text-red-900{color:var(--color-red-900)}.text-red-950{color:var(--color-red-950)}.text-rose-50{color:var(--color-rose-50)}.text-rose-100{color:var(--color-rose-100)}.text-rose-200{color:var(--color-rose-200)}.text-rose-300{color:var(--color-rose-300)}.text-rose-400{color:var(--color-rose-400)}.text-rose-500{color:var(--color-rose-500)}.text-rose-600{color:var(--color-rose-600)}.text-rose-700{color:var(--color-rose-700)}.text-rose-800{color:var(--color-rose-800)}.text-rose-900{color:var(--color-rose-900)}.text-rose-950{color:var(--color-rose-950)}.text-sky-50{color:var(--color-sky-50)}.text-sky-100{color:var(--color-sky-100)}.text-sky-200{color:var(--color-sky-200)}.text-sky-300{color:var(--color-sky-300)}.text-sky-400{color:var(--color-sky-400)}.text-sky-500{color:var(--color-sky-500)}.text-sky-600{color:var(--color-sky-600)}.text-sky-700{color:var(--color-sky-700)}.text-sky-800{color:var(--color-sky-800)}.text-sky-900{color:var(--color-sky-900)}.text-sky-950{color:var(--color-sky-950)}.text-slate-50{color:var(--color-slate-50)}.text-slate-100{color:var(--color-slate-100)}.text-slate-200{color:var(--color-slate-200)}.text-slate-300{color:var(--color-slate-300)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-slate-700{color:var(--color-slate-700)}.text-slate-800{color:var(--color-slate-800)}.text-slate-900{color:var(--color-slate-900)}.text-slate-950{color:var(--color-slate-950)}.text-stone-50{color:var(--color-stone-50)}.text-stone-100{color:var(--color-stone-100)}.text-stone-200{color:var(--color-stone-200)}.text-stone-300{color:var(--color-stone-300)}.text-stone-400{color:var(--color-stone-400)}.text-stone-500{color:var(--color-stone-500)}.text-stone-600{color:var(--color-stone-600)}.text-stone-700{color:var(--color-stone-700)}.text-stone-800{color:var(--color-stone-800)}.text-stone-900{color:var(--color-stone-900)}.text-stone-950{color:var(--color-stone-950)}.text-teal-50{color:var(--color-teal-50)}.text-teal-100{color:var(--color-teal-100)}.text-teal-200{color:var(--color-teal-200)}.text-teal-300{color:var(--color-teal-300)}.text-teal-400{color:var(--color-teal-400)}.text-teal-500{color:var(--color-teal-500)}.text-teal-600{color:var(--color-teal-600)}.text-teal-700{color:var(--color-teal-700)}.text-teal-800{color:var(--color-teal-800)}.text-teal-900{color:var(--color-teal-900)}.text-teal-950{color:var(--color-teal-950)}.text-transparent{color:#0000}.text-violet-50{color:var(--color-violet-50)}.text-violet-100{color:var(--color-violet-100)}.text-violet-200{color:var(--color-violet-200)}.text-violet-300{color:var(--color-violet-300)}.text-violet-400{color:var(--color-violet-400)}.text-violet-500{color:var(--color-violet-500)}.text-violet-600{color:var(--color-violet-600)}.text-violet-700{color:var(--color-violet-700)}.text-violet-800{color:var(--color-violet-800)}.text-violet-900{color:var(--color-violet-900)}.text-violet-950{color:var(--color-violet-950)}.text-white{color:var(--color-white)}.text-yellow-50{color:var(--color-yellow-50)}.text-yellow-100{color:var(--color-yellow-100)}.text-yellow-200{color:var(--color-yellow-200)}.text-yellow-300{color:var(--color-yellow-300)}.text-yellow-400{color:var(--color-yellow-400)}.text-yellow-500{color:var(--color-yellow-500)}.text-yellow-600{color:var(--color-yellow-600)}.text-yellow-700{color:var(--color-yellow-700)}.text-yellow-800{color:var(--color-yellow-800)}.text-yellow-900{color:var(--color-yellow-900)}.text-yellow-950{color:var(--color-yellow-950)}.text-zinc-50{color:var(--color-zinc-50)}.text-zinc-100{color:var(--color-zinc-100)}.text-zinc-200{color:var(--color-zinc-200)}.text-zinc-300{color:var(--color-zinc-300)}.text-zinc-400{color:var(--color-zinc-400)}.text-zinc-500{color:var(--color-zinc-500)}.text-zinc-600{color:var(--color-zinc-600)}.text-zinc-700{color:var(--color-zinc-700)}.text-zinc-800{color:var(--color-zinc-800)}.text-zinc-900{color:var(--color-zinc-900)}.text-zinc-950{color:var(--color-zinc-950)}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.not-italic{font-style:normal}.line-through{text-decoration-line:line-through}.no-underline{text-decoration-line:none}.overline{text-decoration-line:overline}.underline{text-decoration-line:underline}.placeholder-gray-400::placeholder{color:var(--color-gray-400)}.placeholder-gray-500::placeholder{color:var(--color-gray-500)}.accent-black{accent-color:var(--color-black)}.accent-blue-600{accent-color:var(--color-blue-600)}.accent-gray-900{accent-color:var(--color-gray-900)}.opacity-0{opacity:0}.opacity-5{opacity:.05}.opacity-10{opacity:.1}.opacity-15{opacity:.15}.opacity-20{opacity:.2}.opacity-25{opacity:.25}.opacity-30{opacity:.3}.opacity-35{opacity:.35}.opacity-40{opacity:.4}.opacity-45{opacity:.45}.opacity-50{opacity:.5}.opacity-55{opacity:.55}.opacity-60{opacity:.6}.opacity-65{opacity:.65}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-85{opacity:.85}.opacity-90{opacity:.9}.opacity-95{opacity:.95}.opacity-100{opacity:1}.bg-blend-color{background-blend-mode:color}.bg-blend-color-burn{background-blend-mode:color-burn}.bg-blend-color-dodge{background-blend-mode:color-dodge}.bg-blend-darken{background-blend-mode:darken}.bg-blend-difference{background-blend-mode:difference}.bg-blend-exclusion{background-blend-mode:exclusion}.bg-blend-hard-light{background-blend-mode:hard-light}.bg-blend-hue{background-blend-mode:hue}.bg-blend-lighten{background-blend-mode:lighten}.bg-blend-luminosity{background-blend-mode:luminosity}.bg-blend-multiply{background-blend-mode:multiply}.bg-blend-normal{background-blend-mode:normal}.bg-blend-overlay{background-blend-mode:overlay}.bg-blend-saturation{background-blend-mode:saturation}.bg-blend-screen{background-blend-mode:screen}.bg-blend-soft-light{background-blend-mode:soft-light}.mix-blend-color{mix-blend-mode:color}.mix-blend-color-burn{mix-blend-mode:color-burn}.mix-blend-color-dodge{mix-blend-mode:color-dodge}.mix-blend-darken{mix-blend-mode:darken}.mix-blend-difference{mix-blend-mode:difference}.mix-blend-exclusion{mix-blend-mode:exclusion}.mix-blend-hard-light{mix-blend-mode:hard-light}.mix-blend-hue{mix-blend-mode:hue}.mix-blend-lighten{mix-blend-mode:lighten}.mix-blend-luminosity{mix-blend-mode:luminosity}.mix-blend-multiply{mix-blend-mode:multiply}.mix-blend-normal{mix-blend-mode:normal}.mix-blend-overlay{mix-blend-mode:overlay}.mix-blend-plus-darker{mix-blend-mode:plus-darker}.mix-blend-plus-lighter{mix-blend-mode:plus-lighter}.mix-blend-saturation{mix-blend-mode:saturation}.mix-blend-screen{mix-blend-mode:screen}.mix-blend-soft-light{mix-blend-mode:soft-light}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-0{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-4{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(4px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-8{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(8px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-black{--tw-ring-color:var(--color-black)}.ring-blue-50{--tw-ring-color:var(--color-blue-50)}.ring-blue-100{--tw-ring-color:var(--color-blue-100)}.ring-blue-200{--tw-ring-color:var(--color-blue-200)}.ring-blue-300{--tw-ring-color:var(--color-blue-300)}.ring-blue-400{--tw-ring-color:var(--color-blue-400)}.ring-blue-500{--tw-ring-color:var(--color-blue-500)}.ring-blue-600{--tw-ring-color:var(--color-blue-600)}.ring-blue-700{--tw-ring-color:var(--color-blue-700)}.ring-blue-800{--tw-ring-color:var(--color-blue-800)}.ring-blue-900{--tw-ring-color:var(--color-blue-900)}.ring-current{--tw-ring-color:currentcolor}.ring-gray-50{--tw-ring-color:var(--color-gray-50)}.ring-gray-100{--tw-ring-color:var(--color-gray-100)}.ring-gray-200{--tw-ring-color:var(--color-gray-200)}.ring-gray-300{--tw-ring-color:var(--color-gray-300)}.ring-gray-400{--tw-ring-color:var(--color-gray-400)}.ring-gray-500{--tw-ring-color:var(--color-gray-500)}.ring-gray-600{--tw-ring-color:var(--color-gray-600)}.ring-gray-700{--tw-ring-color:var(--color-gray-700)}.ring-gray-800{--tw-ring-color:var(--color-gray-800)}.ring-gray-900{--tw-ring-color:var(--color-gray-900)}.ring-inherit{--tw-ring-color:inherit}.ring-red-500{--tw-ring-color:var(--color-red-500)}.ring-slate-50{--tw-ring-color:var(--color-slate-50)}.ring-slate-100{--tw-ring-color:var(--color-slate-100)}.ring-slate-200{--tw-ring-color:var(--color-slate-200)}.ring-slate-300{--tw-ring-color:var(--color-slate-300)}.ring-slate-400{--tw-ring-color:var(--color-slate-400)}.ring-slate-500{--tw-ring-color:var(--color-slate-500)}.ring-slate-600{--tw-ring-color:var(--color-slate-600)}.ring-slate-700{--tw-ring-color:var(--color-slate-700)}.ring-slate-800{--tw-ring-color:var(--color-slate-800)}.ring-slate-900{--tw-ring-color:var(--color-slate-900)}.ring-transparent{--tw-ring-color:transparent}.ring-white{--tw-ring-color:var(--color-white)}.ring-offset-0{--tw-ring-offset-width:0px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.ring-offset-1{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.ring-offset-2{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.ring-offset-4{--tw-ring-offset-width:4px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.ring-offset-8{--tw-ring-offset-width:8px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.ring-offset-black{--tw-ring-offset-color:var(--color-black)}.ring-offset-current{--tw-ring-offset-color:currentcolor}.ring-offset-inherit{--tw-ring-offset-color:inherit}.ring-offset-transparent{--tw-ring-offset-color:transparent}.ring-offset-white{--tw-ring-offset-color:var(--color-white)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.outline-0{outline-style:var(--tw-outline-style);outline-width:0}.outline-1{outline-style:var(--tw-outline-style);outline-width:1px}.outline-2{outline-style:var(--tw-outline-style);outline-width:2px}.outline-4{outline-style:var(--tw-outline-style);outline-width:4px}.outline-8{outline-style:var(--tw-outline-style);outline-width:8px}.outline-offset-0{outline-offset:0px}.outline-offset-1{outline-offset:1px}.outline-offset-2{outline-offset:2px}.outline-offset-4{outline-offset:4px}.outline-offset-8{outline-offset:8px}.outline-black{outline-color:var(--color-black)}.outline-current{outline-color:currentColor}.outline-inherit{outline-color:inherit}.outline-transparent{outline-color:#0000}.outline-white{outline-color:var(--color-white)}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.blur-2xl{--tw-blur:blur(var(--blur-2xl));filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.blur-3xl{--tw-blur:blur(var(--blur-3xl));filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.blur-lg{--tw-blur:blur(var(--blur-lg));filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.blur-md{--tw-blur:blur(var(--blur-md));filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.blur-none{--tw-blur: ;filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.blur-sm{--tw-blur:blur(var(--blur-sm));filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.blur-xl{--tw-blur:blur(var(--blur-xl));filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.brightness-0{--tw-brightness:brightness(0%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.brightness-50{--tw-brightness:brightness(50%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.brightness-75{--tw-brightness:brightness(75%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.brightness-90{--tw-brightness:brightness(90%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.brightness-95{--tw-brightness:brightness(95%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.brightness-100{--tw-brightness:brightness(100%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.brightness-105{--tw-brightness:brightness(105%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.brightness-110{--tw-brightness:brightness(110%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.brightness-125{--tw-brightness:brightness(125%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.brightness-150{--tw-brightness:brightness(150%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.brightness-200{--tw-brightness:brightness(200%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.contrast-0{--tw-contrast:contrast(0%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.contrast-50{--tw-contrast:contrast(50%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.contrast-75{--tw-contrast:contrast(75%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.contrast-100{--tw-contrast:contrast(100%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.contrast-125{--tw-contrast:contrast(125%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.contrast-150{--tw-contrast:contrast(150%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.contrast-200{--tw-contrast:contrast(200%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.drop-shadow{--tw-drop-shadow-size:drop-shadow(0 1px 2px var(--tw-drop-shadow-color,#0000001a))drop-shadow(0 1px 1px var(--tw-drop-shadow-color,#0000000f));--tw-drop-shadow:drop-shadow(0 1px 2px #0000001a)drop-shadow(0 1px 1px #0000000f);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.drop-shadow-2xl{--tw-drop-shadow-size:drop-shadow(0 25px 25px var(--tw-drop-shadow-color,#00000026));--tw-drop-shadow:drop-shadow(var(--drop-shadow-2xl));filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.drop-shadow-lg{--tw-drop-shadow-size:drop-shadow(0 4px 4px var(--tw-drop-shadow-color,#00000026));--tw-drop-shadow:drop-shadow(var(--drop-shadow-lg));filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.drop-shadow-md{--tw-drop-shadow-size:drop-shadow(0 3px 3px var(--tw-drop-shadow-color,#0000001f));--tw-drop-shadow:drop-shadow(var(--drop-shadow-md));filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.drop-shadow-sm{--tw-drop-shadow-size:drop-shadow(0 1px 2px var(--tw-drop-shadow-color,#00000026));--tw-drop-shadow:drop-shadow(var(--drop-shadow-sm));filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.drop-shadow-xl{--tw-drop-shadow-size:drop-shadow(0 9px 7px var(--tw-drop-shadow-color,#0000001a));--tw-drop-shadow:drop-shadow(var(--drop-shadow-xl));filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.drop-shadow-none{--tw-drop-shadow: ;filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.grayscale{--tw-grayscale:grayscale(100%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.grayscale-0{--tw-grayscale:grayscale(0%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.-hue-rotate-15{--tw-hue-rotate:hue-rotate( -15deg );filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.-hue-rotate-30{--tw-hue-rotate:hue-rotate( -30deg );filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.-hue-rotate-60{--tw-hue-rotate:hue-rotate( -60deg );filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.-hue-rotate-90{--tw-hue-rotate:hue-rotate( -90deg );filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.-hue-rotate-180{--tw-hue-rotate:hue-rotate( -180deg );filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.hue-rotate-0{--tw-hue-rotate:hue-rotate(0deg);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.hue-rotate-15{--tw-hue-rotate:hue-rotate(15deg);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.hue-rotate-30{--tw-hue-rotate:hue-rotate(30deg);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.hue-rotate-60{--tw-hue-rotate:hue-rotate(60deg);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.hue-rotate-90{--tw-hue-rotate:hue-rotate(90deg);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.hue-rotate-180{--tw-hue-rotate:hue-rotate(180deg);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.invert-0{--tw-invert:invert(0%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.saturate-0{--tw-saturate:saturate(0%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.saturate-50{--tw-saturate:saturate(50%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.saturate-100{--tw-saturate:saturate(100%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.saturate-150{--tw-saturate:saturate(150%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.saturate-200{--tw-saturate:saturate(200%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.sepia{--tw-sepia:sepia(100%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.sepia-0{--tw-sepia:sepia(0%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-2xl{--tw-backdrop-blur:blur(var(--blur-2xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-3xl{--tw-backdrop-blur:blur(var(--blur-3xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-lg{--tw-backdrop-blur:blur(var(--blur-lg));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-md{--tw-backdrop-blur:blur(var(--blur-md));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-none{--tw-backdrop-blur: ;-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-xl{--tw-backdrop-blur:blur(var(--blur-xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-brightness-0{--tw-backdrop-brightness:brightness(0%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-brightness-50{--tw-backdrop-brightness:brightness(50%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-brightness-75{--tw-backdrop-brightness:brightness(75%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-brightness-90{--tw-backdrop-brightness:brightness(90%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-brightness-95{--tw-backdrop-brightness:brightness(95%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-brightness-100{--tw-backdrop-brightness:brightness(100%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-brightness-105{--tw-backdrop-brightness:brightness(105%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-brightness-110{--tw-backdrop-brightness:brightness(110%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-brightness-125{--tw-backdrop-brightness:brightness(125%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-brightness-150{--tw-backdrop-brightness:brightness(150%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-brightness-200{--tw-backdrop-brightness:brightness(200%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-contrast-0{--tw-backdrop-contrast:contrast(0%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-contrast-50{--tw-backdrop-contrast:contrast(50%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-contrast-75{--tw-backdrop-contrast:contrast(75%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-contrast-100{--tw-backdrop-contrast:contrast(100%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-contrast-125{--tw-backdrop-contrast:contrast(125%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-contrast-150{--tw-backdrop-contrast:contrast(150%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-contrast-200{--tw-backdrop-contrast:contrast(200%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-grayscale{--tw-backdrop-grayscale:grayscale(100%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-grayscale-0{--tw-backdrop-grayscale:grayscale(0%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-hue-rotate-0{--tw-backdrop-hue-rotate:hue-rotate(0deg);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-hue-rotate-15{--tw-backdrop-hue-rotate:hue-rotate(15deg);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-hue-rotate-30{--tw-backdrop-hue-rotate:hue-rotate(30deg);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-hue-rotate-60{--tw-backdrop-hue-rotate:hue-rotate(60deg);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-hue-rotate-90{--tw-backdrop-hue-rotate:hue-rotate(90deg);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-hue-rotate-180{--tw-backdrop-hue-rotate:hue-rotate(180deg);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-invert{--tw-backdrop-invert:invert(100%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-invert-0{--tw-backdrop-invert:invert(0%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-opacity-0{--tw-backdrop-opacity:opacity(0%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-opacity-5{--tw-backdrop-opacity:opacity(5%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-opacity-10{--tw-backdrop-opacity:opacity(10%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-opacity-20{--tw-backdrop-opacity:opacity(20%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-opacity-25{--tw-backdrop-opacity:opacity(25%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-opacity-30{--tw-backdrop-opacity:opacity(30%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-opacity-40{--tw-backdrop-opacity:opacity(40%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-opacity-50{--tw-backdrop-opacity:opacity(50%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-opacity-60{--tw-backdrop-opacity:opacity(60%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-opacity-70{--tw-backdrop-opacity:opacity(70%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-opacity-75{--tw-backdrop-opacity:opacity(75%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-opacity-80{--tw-backdrop-opacity:opacity(80%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-opacity-90{--tw-backdrop-opacity:opacity(90%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-opacity-95{--tw-backdrop-opacity:opacity(95%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-opacity-100{--tw-backdrop-opacity:opacity(100%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-saturate-0{--tw-backdrop-saturate:saturate(0%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-saturate-50{--tw-backdrop-saturate:saturate(50%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-saturate-100{--tw-backdrop-saturate:saturate(100%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-saturate-150{--tw-backdrop-saturate:saturate(150%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-saturate-200{--tw-backdrop-saturate:saturate(200%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-sepia{--tw-backdrop-sepia:sepia(100%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-sepia-0{--tw-backdrop-sepia:sepia(0%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[max-height\]{transition-property:max-height;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-none{transition-property:none}.delay-75{transition-delay:75ms}.delay-100{transition-delay:.1s}.delay-150{transition-delay:.15s}.delay-200{transition-delay:.2s}.delay-300{transition-delay:.3s}.delay-500{transition-delay:.5s}.delay-700{transition-delay:.7s}.delay-1000{transition-delay:1s}.duration-75{--tw-duration:75ms;transition-duration:75ms}.duration-100{--tw-duration:.1s;transition-duration:.1s}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.duration-700{--tw-duration:.7s;transition-duration:.7s}.duration-1000{--tw-duration:1s;transition-duration:1s}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-linear{--tw-ease:linear;transition-timing-function:linear}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-dashed{--tw-outline-style:dashed;outline-style:dashed}.outline-dotted{--tw-outline-style:dotted;outline-style:dotted}.outline-double{--tw-outline-style:double;outline-style:double}.outline-none{--tw-outline-style:none;outline-style:none}.select-all{-webkit-user-select:all;user-select:all}.select-auto{-webkit-user-select:auto;user-select:auto}.select-none{-webkit-user-select:none;user-select:none}.select-text{-webkit-user-select:text;user-select:text}:where(.divide-x-reverse>:not(:last-child)){--tw-divide-x-reverse:1}.ring-inset{--tw-ring-inset:inset}@media(hover:hover){.group-hover\:visible:is(:where(.group):hover *){visibility:visible}.group-hover\:translate-x-1:is(:where(.group):hover *){--tw-translate-x:calc(var(--spacing)*1);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-hover\:translate-y-1:is(:where(.group):hover *){--tw-translate-y:calc(var(--spacing)*1);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-hover\:scale-100:is(:where(.group):hover *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.group-hover\:scale-105:is(:where(.group):hover *){--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x)var(--tw-scale-y)}.group-hover\:bg-black\/40:is(:where(.group):hover *){background-color:#0006}@supports (color:color-mix(in lab,red,red)){.group-hover\:bg-black\/40:is(:where(.group):hover *){background-color:color-mix(in oklab,var(--color-black)40%,transparent)}}.group-hover\:bg-blue-100:is(:where(.group):hover *){background-color:var(--color-blue-100)}.group-hover\:bg-blue-500:is(:where(.group):hover *){background-color:var(--color-blue-500)}.group-hover\:bg-blue-600:is(:where(.group):hover *){background-color:var(--color-blue-600)}.group-hover\:bg-gray-100:is(:where(.group):hover *){background-color:var(--color-gray-100)}.group-hover\:bg-gray-200:is(:where(.group):hover *){background-color:var(--color-gray-200)}.group-hover\:bg-gray-700:is(:where(.group):hover *){background-color:var(--color-gray-700)}.group-hover\:bg-gray-800:is(:where(.group):hover *){background-color:var(--color-gray-800)}.group-hover\:text-black:is(:where(.group):hover *){color:var(--color-black)}.group-hover\:text-blue-500:is(:where(.group):hover *){color:var(--color-blue-500)}.group-hover\:text-blue-600:is(:where(.group):hover *){color:var(--color-blue-600)}.group-hover\:text-blue-700:is(:where(.group):hover *){color:var(--color-blue-700)}.group-hover\:text-gray-700:is(:where(.group):hover *){color:var(--color-gray-700)}.group-hover\:text-gray-800:is(:where(.group):hover *){color:var(--color-gray-800)}.group-hover\:text-gray-900:is(:where(.group):hover *){color:var(--color-gray-900)}.group-hover\:text-white:is(:where(.group):hover *){color:var(--color-white)}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.group-focus\:border-blue-500:is(:where(.group):focus *){border-color:var(--color-blue-500)}.group-focus\:ring-2:is(:where(.group):focus *){--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.peer-checked\:border-blue-500:is(:where(.peer):checked~*){border-color:var(--color-blue-500)}.peer-checked\:bg-blue-500:is(:where(.peer):checked~*){background-color:var(--color-blue-500)}.peer-invalid\:border-red-500:is(:where(.peer):invalid~*){border-color:var(--color-red-500)}.peer-invalid\:text-red-500:is(:where(.peer):invalid~*){color:var(--color-red-500)}.peer-focus\:border-blue-500:is(:where(.peer):focus~*){border-color:var(--color-blue-500)}.peer-focus\:ring-2:is(:where(.peer):focus~*){--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-50:is(:where(.peer):disabled~*){opacity:.5}.first-letter\:text-2xl:first-letter{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.first-letter\:font-bold:first-letter{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.first-letter\:text-blue-600:first-letter{color:var(--color-blue-600)}.first-line\:font-semibold:first-line{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.first-line\:text-gray-700:first-line{color:var(--color-gray-700)}.marker\:text-blue-500 ::marker{color:var(--color-blue-500)}.marker\:text-blue-500::marker{color:var(--color-blue-500)}.marker\:text-blue-500 ::-webkit-details-marker{color:var(--color-blue-500)}.marker\:text-blue-500::-webkit-details-marker{color:var(--color-blue-500)}.marker\:text-gray-500 ::marker{color:var(--color-gray-500)}.marker\:text-gray-500::marker{color:var(--color-gray-500)}.marker\:text-gray-500 ::-webkit-details-marker{color:var(--color-gray-500)}.marker\:text-gray-500::-webkit-details-marker{color:var(--color-gray-500)}.selection\:bg-blue-200 ::selection{background-color:var(--color-blue-200)}.selection\:bg-blue-200::selection{background-color:var(--color-blue-200)}.selection\:text-blue-900 ::selection{color:var(--color-blue-900)}.selection\:text-blue-900::selection{color:var(--color-blue-900)}.file\:mr-4::file-selector-button{margin-right:calc(var(--spacing)*4)}.file\:cursor-pointer::file-selector-button{cursor:pointer}.file\:rounded-full::file-selector-button{border-radius:3.40282e38px}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-blue-50::file-selector-button{background-color:var(--color-blue-50)}.file\:px-4::file-selector-button{padding-inline:calc(var(--spacing)*4)}.file\:py-2::file-selector-button{padding-block:calc(var(--spacing)*2)}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-semibold::file-selector-button{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.file\:text-blue-700::file-selector-button{color:var(--color-blue-700)}.before\:absolute:before{content:var(--tw-content);position:absolute}.before\:inset-0:before{content:var(--tw-content);inset:calc(var(--spacing)*0)}.before\:block:before{content:var(--tw-content);display:block}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:inset-0:after{content:var(--tw-content);inset:calc(var(--spacing)*0)}.after\:clear-both:after{content:var(--tw-content);clear:both}.after\:block:after{content:var(--tw-content);display:block}.after\:content-\[\'\'\]:after{--tw-content:"";content:var(--tw-content)}.first\:mt-0:first-child{margin-top:calc(var(--spacing)*0)}.first\:rounded-t-lg:first-child{border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg)}.first\:rounded-l-lg:first-child{border-top-left-radius:var(--radius-lg);border-bottom-left-radius:var(--radius-lg)}.first\:border-t-0:first-child{border-top-style:var(--tw-border-style);border-top-width:0}.first\:pt-0:first-child{padding-top:calc(var(--spacing)*0)}.last\:mb-0:last-child{margin-bottom:calc(var(--spacing)*0)}.last\:rounded-r-lg:last-child{border-top-right-radius:var(--radius-lg);border-bottom-right-radius:var(--radius-lg)}.last\:rounded-b-lg:last-child{border-bottom-right-radius:var(--radius-lg);border-bottom-left-radius:var(--radius-lg)}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.last\:pb-0:last-child{padding-bottom:calc(var(--spacing)*0)}.odd\:bg-gray-50:nth-child(odd){background-color:var(--color-gray-50)}.odd\:bg-gray-100:nth-child(odd){background-color:var(--color-gray-100)}.odd\:bg-white:nth-child(odd){background-color:var(--color-white)}.even\:bg-gray-50:nth-child(2n){background-color:var(--color-gray-50)}.even\:bg-gray-100:nth-child(2n){background-color:var(--color-gray-100)}.even\:bg-white:nth-child(2n){background-color:var(--color-white)}.checked\:border-blue-500:checked{border-color:var(--color-blue-500)}.checked\:border-blue-600:checked{border-color:var(--color-blue-600)}.checked\:bg-blue-500:checked{background-color:var(--color-blue-500)}.checked\:bg-blue-600:checked{background-color:var(--color-blue-600)}.checked\:bg-green-500:checked{background-color:var(--color-green-500)}.checked\:text-white:checked{color:var(--color-white)}.indeterminate\:border-gray-400:indeterminate{border-color:var(--color-gray-400)}.indeterminate\:bg-gray-300:indeterminate{background-color:var(--color-gray-300)}.placeholder-shown\:border-gray-300:placeholder-shown{border-color:var(--color-gray-300)}.autofill\:bg-yellow-100:autofill{background-color:var(--color-yellow-100)}.autofill\:text-black:autofill{color:var(--color-black)}.valid\:border-green-500:valid{border-color:var(--color-green-500)}.valid\:text-green-600:valid{color:var(--color-green-600)}.valid\:ring-green-500:valid{--tw-ring-color:var(--color-green-500)}.invalid\:border-red-500:invalid{border-color:var(--color-red-500)}.invalid\:text-red-600:invalid{color:var(--color-red-600)}.invalid\:ring-red-500:invalid{--tw-ring-color:var(--color-red-500)}.read-only\:cursor-not-allowed:read-only{cursor:not-allowed}.read-only\:bg-gray-50:read-only{background-color:var(--color-gray-50)}.read-only\:bg-gray-100:read-only{background-color:var(--color-gray-100)}.empty\:hidden:empty{display:none}.focus-within\:border-blue-500:focus-within{border-color:var(--color-blue-500)}.focus-within\:border-gray-500:focus-within{border-color:var(--color-gray-500)}.focus-within\:ring-2:focus-within{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-within\:ring-blue-500:focus-within{--tw-ring-color:var(--color-blue-500)}.focus-within\:ring-gray-500:focus-within{--tw-ring-color:var(--color-gray-500)}@media(hover:hover){.hover\:scale-95:hover{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x)var(--tw-scale-y)}.hover\:scale-100:hover{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x)var(--tw-scale-y)}.hover\:scale-110:hover{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x)var(--tw-scale-y)}.hover\:border-blue-50:hover{border-color:var(--color-blue-50)}.hover\:border-blue-100:hover{border-color:var(--color-blue-100)}.hover\:border-blue-200:hover{border-color:var(--color-blue-200)}.hover\:border-blue-300:hover{border-color:var(--color-blue-300)}.hover\:border-blue-400:hover{border-color:var(--color-blue-400)}.hover\:border-blue-500:hover{border-color:var(--color-blue-500)}.hover\:border-blue-600:hover{border-color:var(--color-blue-600)}.hover\:border-blue-700:hover{border-color:var(--color-blue-700)}.hover\:border-blue-800:hover{border-color:var(--color-blue-800)}.hover\:border-blue-900:hover{border-color:var(--color-blue-900)}.hover\:border-gray-50:hover{border-color:var(--color-gray-50)}.hover\:border-gray-100:hover{border-color:var(--color-gray-100)}.hover\:border-gray-200:hover{border-color:var(--color-gray-200)}.hover\:border-gray-300:hover{border-color:var(--color-gray-300)}.hover\:border-gray-400:hover{border-color:var(--color-gray-400)}.hover\:border-gray-500:hover{border-color:var(--color-gray-500)}.hover\:border-gray-600:hover{border-color:var(--color-gray-600)}.hover\:border-gray-700:hover{border-color:var(--color-gray-700)}.hover\:border-gray-800:hover{border-color:var(--color-gray-800)}.hover\:border-gray-900:hover{border-color:var(--color-gray-900)}.hover\:bg-black:hover{background-color:var(--color-black)}.hover\:bg-black\/10:hover{background-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-black\/10:hover{background-color:color-mix(in oklab,var(--color-black)10%,transparent)}}.hover\:bg-blue-50:hover{background-color:var(--color-blue-50)}.hover\:bg-blue-100:hover{background-color:var(--color-blue-100)}.hover\:bg-blue-200:hover{background-color:var(--color-blue-200)}.hover\:bg-blue-300:hover{background-color:var(--color-blue-300)}.hover\:bg-blue-400:hover{background-color:var(--color-blue-400)}.hover\:bg-blue-500:hover{background-color:var(--color-blue-500)}.hover\:bg-blue-600:hover{background-color:var(--color-blue-600)}.hover\:bg-blue-700:hover{background-color:var(--color-blue-700)}.hover\:bg-blue-800:hover{background-color:var(--color-blue-800)}.hover\:bg-blue-900:hover{background-color:var(--color-blue-900)}.hover\:bg-emerald-600:hover{background-color:var(--color-emerald-600)}.hover\:bg-gray-50:hover{background-color:var(--color-gray-50)}.hover\:bg-gray-100:hover{background-color:var(--color-gray-100)}.hover\:bg-gray-200:hover{background-color:var(--color-gray-200)}.hover\:bg-gray-300:hover{background-color:var(--color-gray-300)}.hover\:bg-gray-400:hover{background-color:var(--color-gray-400)}.hover\:bg-gray-500:hover{background-color:var(--color-gray-500)}.hover\:bg-gray-600:hover{background-color:var(--color-gray-600)}.hover\:bg-gray-700:hover{background-color:var(--color-gray-700)}.hover\:bg-gray-800:hover{background-color:var(--color-gray-800)}.hover\:bg-gray-900:hover{background-color:var(--color-gray-900)}.hover\:bg-green-50:hover{background-color:var(--color-green-50)}.hover\:bg-green-100:hover{background-color:var(--color-green-100)}.hover\:bg-green-200:hover{background-color:var(--color-green-200)}.hover\:bg-green-300:hover{background-color:var(--color-green-300)}.hover\:bg-green-400:hover{background-color:var(--color-green-400)}.hover\:bg-green-500:hover{background-color:var(--color-green-500)}.hover\:bg-green-600:hover{background-color:var(--color-green-600)}.hover\:bg-green-700:hover{background-color:var(--color-green-700)}.hover\:bg-green-800:hover{background-color:var(--color-green-800)}.hover\:bg-green-900:hover{background-color:var(--color-green-900)}.hover\:bg-indigo-50:hover{background-color:var(--color-indigo-50)}.hover\:bg-indigo-100:hover{background-color:var(--color-indigo-100)}.hover\:bg-indigo-200:hover{background-color:var(--color-indigo-200)}.hover\:bg-indigo-300:hover{background-color:var(--color-indigo-300)}.hover\:bg-indigo-400:hover{background-color:var(--color-indigo-400)}.hover\:bg-indigo-500:hover{background-color:var(--color-indigo-500)}.hover\:bg-indigo-600:hover{background-color:var(--color-indigo-600)}.hover\:bg-indigo-700:hover{background-color:var(--color-indigo-700)}.hover\:bg-indigo-800:hover{background-color:var(--color-indigo-800)}.hover\:bg-indigo-900:hover{background-color:var(--color-indigo-900)}.hover\:bg-orange-50:hover{background-color:var(--color-orange-50)}.hover\:bg-orange-100:hover{background-color:var(--color-orange-100)}.hover\:bg-orange-200:hover{background-color:var(--color-orange-200)}.hover\:bg-orange-300:hover{background-color:var(--color-orange-300)}.hover\:bg-orange-400:hover{background-color:var(--color-orange-400)}.hover\:bg-orange-500:hover{background-color:var(--color-orange-500)}.hover\:bg-orange-600:hover{background-color:var(--color-orange-600)}.hover\:bg-orange-700:hover{background-color:var(--color-orange-700)}.hover\:bg-orange-800:hover{background-color:var(--color-orange-800)}.hover\:bg-orange-900:hover{background-color:var(--color-orange-900)}.hover\:bg-pink-50:hover{background-color:var(--color-pink-50)}.hover\:bg-pink-100:hover{background-color:var(--color-pink-100)}.hover\:bg-pink-200:hover{background-color:var(--color-pink-200)}.hover\:bg-pink-300:hover{background-color:var(--color-pink-300)}.hover\:bg-pink-400:hover{background-color:var(--color-pink-400)}.hover\:bg-pink-500:hover{background-color:var(--color-pink-500)}.hover\:bg-pink-600:hover{background-color:var(--color-pink-600)}.hover\:bg-pink-700:hover{background-color:var(--color-pink-700)}.hover\:bg-pink-800:hover{background-color:var(--color-pink-800)}.hover\:bg-pink-900:hover{background-color:var(--color-pink-900)}.hover\:bg-primary-700:hover{background-color:var(--color-primary-700)}.hover\:bg-purple-50:hover{background-color:var(--color-purple-50)}.hover\:bg-purple-100:hover{background-color:var(--color-purple-100)}.hover\:bg-purple-200:hover{background-color:var(--color-purple-200)}.hover\:bg-purple-300:hover{background-color:var(--color-purple-300)}.hover\:bg-purple-400:hover{background-color:var(--color-purple-400)}.hover\:bg-purple-500:hover{background-color:var(--color-purple-500)}.hover\:bg-purple-600:hover{background-color:var(--color-purple-600)}.hover\:bg-purple-700:hover{background-color:var(--color-purple-700)}.hover\:bg-purple-800:hover{background-color:var(--color-purple-800)}.hover\:bg-purple-900:hover{background-color:var(--color-purple-900)}.hover\:bg-red-50:hover{background-color:var(--color-red-50)}.hover\:bg-red-100:hover{background-color:var(--color-red-100)}.hover\:bg-red-200:hover{background-color:var(--color-red-200)}.hover\:bg-red-300:hover{background-color:var(--color-red-300)}.hover\:bg-red-400:hover{background-color:var(--color-red-400)}.hover\:bg-red-500:hover{background-color:var(--color-red-500)}.hover\:bg-red-600:hover{background-color:var(--color-red-600)}.hover\:bg-red-700:hover{background-color:var(--color-red-700)}.hover\:bg-red-800:hover{background-color:var(--color-red-800)}.hover\:bg-red-900:hover{background-color:var(--color-red-900)}.hover\:bg-slate-50:hover{background-color:var(--color-slate-50)}.hover\:bg-slate-100:hover{background-color:var(--color-slate-100)}.hover\:bg-slate-200:hover{background-color:var(--color-slate-200)}.hover\:bg-slate-300:hover{background-color:var(--color-slate-300)}.hover\:bg-slate-400:hover{background-color:var(--color-slate-400)}.hover\:bg-slate-500:hover{background-color:var(--color-slate-500)}.hover\:bg-slate-600:hover{background-color:var(--color-slate-600)}.hover\:bg-slate-700:hover{background-color:var(--color-slate-700)}.hover\:bg-slate-800:hover{background-color:var(--color-slate-800)}.hover\:bg-slate-900:hover{background-color:var(--color-slate-900)}.hover\:bg-transparent:hover{background-color:#0000}.hover\:bg-white:hover{background-color:var(--color-white)}.hover\:bg-white\/30:hover{background-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/30:hover{background-color:color-mix(in oklab,var(--color-white)30%,transparent)}}.hover\:bg-yellow-50:hover{background-color:var(--color-yellow-50)}.hover\:bg-yellow-100:hover{background-color:var(--color-yellow-100)}.hover\:bg-yellow-200:hover{background-color:var(--color-yellow-200)}.hover\:bg-yellow-300:hover{background-color:var(--color-yellow-300)}.hover\:bg-yellow-400:hover{background-color:var(--color-yellow-400)}.hover\:bg-yellow-500:hover{background-color:var(--color-yellow-500)}.hover\:bg-yellow-600:hover{background-color:var(--color-yellow-600)}.hover\:bg-yellow-700:hover{background-color:var(--color-yellow-700)}.hover\:bg-yellow-800:hover{background-color:var(--color-yellow-800)}.hover\:bg-yellow-900:hover{background-color:var(--color-yellow-900)}.hover\:text-black:hover{color:var(--color-black)}.hover\:text-blue-50:hover{color:var(--color-blue-50)}.hover\:text-blue-100:hover{color:var(--color-blue-100)}.hover\:text-blue-200:hover{color:var(--color-blue-200)}.hover\:text-blue-300:hover{color:var(--color-blue-300)}.hover\:text-blue-400:hover{color:var(--color-blue-400)}.hover\:text-blue-500:hover{color:var(--color-blue-500)}.hover\:text-blue-600:hover{color:var(--color-blue-600)}.hover\:text-blue-700:hover{color:var(--color-blue-700)}.hover\:text-blue-800:hover{color:var(--color-blue-800)}.hover\:text-blue-900:hover{color:var(--color-blue-900)}.hover\:text-gray-50:hover{color:var(--color-gray-50)}.hover\:text-gray-100:hover{color:var(--color-gray-100)}.hover\:text-gray-200:hover{color:var(--color-gray-200)}.hover\:text-gray-300:hover{color:var(--color-gray-300)}.hover\:text-gray-400:hover{color:var(--color-gray-400)}.hover\:text-gray-500:hover{color:var(--color-gray-500)}.hover\:text-gray-600:hover{color:var(--color-gray-600)}.hover\:text-gray-700:hover{color:var(--color-gray-700)}.hover\:text-gray-800:hover{color:var(--color-gray-800)}.hover\:text-gray-900:hover{color:var(--color-gray-900)}.hover\:text-green-50:hover{color:var(--color-green-50)}.hover\:text-green-100:hover{color:var(--color-green-100)}.hover\:text-green-200:hover{color:var(--color-green-200)}.hover\:text-green-300:hover{color:var(--color-green-300)}.hover\:text-green-400:hover{color:var(--color-green-400)}.hover\:text-green-500:hover{color:var(--color-green-500)}.hover\:text-green-600:hover{color:var(--color-green-600)}.hover\:text-green-700:hover{color:var(--color-green-700)}.hover\:text-green-800:hover{color:var(--color-green-800)}.hover\:text-green-900:hover{color:var(--color-green-900)}.hover\:text-purple-50:hover{color:var(--color-purple-50)}.hover\:text-purple-100:hover{color:var(--color-purple-100)}.hover\:text-purple-200:hover{color:var(--color-purple-200)}.hover\:text-purple-300:hover{color:var(--color-purple-300)}.hover\:text-purple-400:hover{color:var(--color-purple-400)}.hover\:text-purple-500:hover{color:var(--color-purple-500)}.hover\:text-purple-600:hover{color:var(--color-purple-600)}.hover\:text-purple-700:hover{color:var(--color-purple-700)}.hover\:text-purple-800:hover{color:var(--color-purple-800)}.hover\:text-purple-900:hover{color:var(--color-purple-900)}.hover\:text-red-50:hover{color:var(--color-red-50)}.hover\:text-red-100:hover{color:var(--color-red-100)}.hover\:text-red-200:hover{color:var(--color-red-200)}.hover\:text-red-300:hover{color:var(--color-red-300)}.hover\:text-red-400:hover{color:var(--color-red-400)}.hover\:text-red-500:hover{color:var(--color-red-500)}.hover\:text-red-600:hover{color:var(--color-red-600)}.hover\:text-red-700:hover{color:var(--color-red-700)}.hover\:text-red-800:hover{color:var(--color-red-800)}.hover\:text-red-900:hover{color:var(--color-red-900)}.hover\:text-slate-50:hover{color:var(--color-slate-50)}.hover\:text-slate-100:hover{color:var(--color-slate-100)}.hover\:text-slate-200:hover{color:var(--color-slate-200)}.hover\:text-slate-300:hover{color:var(--color-slate-300)}.hover\:text-slate-400:hover{color:var(--color-slate-400)}.hover\:text-slate-500:hover{color:var(--color-slate-500)}.hover\:text-slate-600:hover{color:var(--color-slate-600)}.hover\:text-slate-700:hover{color:var(--color-slate-700)}.hover\:text-slate-800:hover{color:var(--color-slate-800)}.hover\:text-slate-900:hover{color:var(--color-slate-900)}.hover\:text-white:hover{color:var(--color-white)}.hover\:line-through:hover{text-decoration-line:line-through}.hover\:no-underline:hover{text-decoration-line:none}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-0:hover{opacity:0}.hover\:opacity-25:hover{opacity:.25}.hover\:opacity-50:hover{opacity:.5}.hover\:opacity-75:hover{opacity:.75}.hover\:opacity-80:hover{opacity:.8}.hover\:opacity-90:hover{opacity:.9}.hover\:opacity-100:hover{opacity:1}.hover\:shadow:hover{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-2xl:hover{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-none:hover{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-sm:hover{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:ring-0:hover{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:ring-1:hover{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:ring-2:hover{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:ring-4:hover{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(4px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:ring-8:hover{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(8px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:ring-blue-500:hover{--tw-ring-color:var(--color-blue-500)}.hover\:ring-gray-500:hover{--tw-ring-color:var(--color-gray-500)}.hover\:ring-green-500:hover{--tw-ring-color:var(--color-green-500)}.hover\:ring-red-500:hover{--tw-ring-color:var(--color-red-500)}.file\:hover\:bg-blue-100::file-selector-button:hover{background-color:var(--color-blue-100)}}.focus\:border-blue-50:focus{border-color:var(--color-blue-50)}.focus\:border-blue-100:focus{border-color:var(--color-blue-100)}.focus\:border-blue-200:focus{border-color:var(--color-blue-200)}.focus\:border-blue-300:focus{border-color:var(--color-blue-300)}.focus\:border-blue-400:focus{border-color:var(--color-blue-400)}.focus\:border-blue-500:focus{border-color:var(--color-blue-500)}.focus\:border-blue-600:focus{border-color:var(--color-blue-600)}.focus\:border-blue-700:focus{border-color:var(--color-blue-700)}.focus\:border-blue-800:focus{border-color:var(--color-blue-800)}.focus\:border-blue-900:focus{border-color:var(--color-blue-900)}.focus\:border-gray-50:focus{border-color:var(--color-gray-50)}.focus\:border-gray-100:focus{border-color:var(--color-gray-100)}.focus\:border-gray-200:focus{border-color:var(--color-gray-200)}.focus\:border-gray-300:focus{border-color:var(--color-gray-300)}.focus\:border-gray-400:focus{border-color:var(--color-gray-400)}.focus\:border-gray-500:focus{border-color:var(--color-gray-500)}.focus\:border-gray-600:focus{border-color:var(--color-gray-600)}.focus\:border-gray-700:focus{border-color:var(--color-gray-700)}.focus\:border-gray-800:focus{border-color:var(--color-gray-800)}.focus\:border-gray-900:focus{border-color:var(--color-gray-900)}.focus\:border-green-500:focus{border-color:var(--color-green-500)}.focus\:border-indigo-500:focus{border-color:var(--color-indigo-500)}.focus\:border-purple-500:focus{border-color:var(--color-purple-500)}.focus\:border-red-500:focus{border-color:var(--color-red-500)}.focus\:border-transparent:focus{border-color:#0000}.focus\:border-yellow-500:focus{border-color:var(--color-yellow-500)}.focus\:bg-black:focus{background-color:var(--color-black)}.focus\:bg-blue-50:focus{background-color:var(--color-blue-50)}.focus\:bg-blue-100:focus{background-color:var(--color-blue-100)}.focus\:bg-blue-200:focus{background-color:var(--color-blue-200)}.focus\:bg-blue-300:focus{background-color:var(--color-blue-300)}.focus\:bg-blue-400:focus{background-color:var(--color-blue-400)}.focus\:bg-blue-500:focus{background-color:var(--color-blue-500)}.focus\:bg-blue-600:focus{background-color:var(--color-blue-600)}.focus\:bg-blue-700:focus{background-color:var(--color-blue-700)}.focus\:bg-blue-800:focus{background-color:var(--color-blue-800)}.focus\:bg-blue-900:focus{background-color:var(--color-blue-900)}.focus\:bg-gray-50:focus{background-color:var(--color-gray-50)}.focus\:bg-gray-100:focus{background-color:var(--color-gray-100)}.focus\:bg-gray-200:focus{background-color:var(--color-gray-200)}.focus\:bg-gray-300:focus{background-color:var(--color-gray-300)}.focus\:bg-gray-400:focus{background-color:var(--color-gray-400)}.focus\:bg-gray-500:focus{background-color:var(--color-gray-500)}.focus\:bg-gray-600:focus{background-color:var(--color-gray-600)}.focus\:bg-gray-700:focus{background-color:var(--color-gray-700)}.focus\:bg-gray-800:focus{background-color:var(--color-gray-800)}.focus\:bg-gray-900:focus{background-color:var(--color-gray-900)}.focus\:bg-transparent:focus{background-color:#0000}.focus\:bg-white:focus{background-color:var(--color-white)}.focus\:text-black:focus{color:var(--color-black)}.focus\:text-blue-50:focus{color:var(--color-blue-50)}.focus\:text-blue-100:focus{color:var(--color-blue-100)}.focus\:text-blue-200:focus{color:var(--color-blue-200)}.focus\:text-blue-300:focus{color:var(--color-blue-300)}.focus\:text-blue-400:focus{color:var(--color-blue-400)}.focus\:text-blue-500:focus{color:var(--color-blue-500)}.focus\:text-blue-600:focus{color:var(--color-blue-600)}.focus\:text-blue-700:focus{color:var(--color-blue-700)}.focus\:text-blue-800:focus{color:var(--color-blue-800)}.focus\:text-blue-900:focus{color:var(--color-blue-900)}.focus\:text-gray-50:focus{color:var(--color-gray-50)}.focus\:text-gray-100:focus{color:var(--color-gray-100)}.focus\:text-gray-200:focus{color:var(--color-gray-200)}.focus\:text-gray-300:focus{color:var(--color-gray-300)}.focus\:text-gray-400:focus{color:var(--color-gray-400)}.focus\:text-gray-500:focus{color:var(--color-gray-500)}.focus\:text-gray-600:focus{color:var(--color-gray-600)}.focus\:text-gray-700:focus{color:var(--color-gray-700)}.focus\:text-gray-800:focus{color:var(--color-gray-800)}.focus\:text-gray-900:focus{color:var(--color-gray-900)}.focus\:text-white:focus{color:var(--color-white)}.focus\:shadow:focus{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:shadow-lg:focus{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:shadow-md:focus{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:shadow-none:focus{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:shadow-sm:focus{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:shadow-xl:focus{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-0:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-4:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(4px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-8:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(8px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-amber-500:focus{--tw-ring-color:var(--color-amber-500)}.focus\:ring-blue-50:focus{--tw-ring-color:var(--color-blue-50)}.focus\:ring-blue-100:focus{--tw-ring-color:var(--color-blue-100)}.focus\:ring-blue-200:focus{--tw-ring-color:var(--color-blue-200)}.focus\:ring-blue-300:focus{--tw-ring-color:var(--color-blue-300)}.focus\:ring-blue-400:focus{--tw-ring-color:var(--color-blue-400)}.focus\:ring-blue-500:focus{--tw-ring-color:var(--color-blue-500)}.focus\:ring-blue-600:focus{--tw-ring-color:var(--color-blue-600)}.focus\:ring-blue-700:focus{--tw-ring-color:var(--color-blue-700)}.focus\:ring-blue-800:focus{--tw-ring-color:var(--color-blue-800)}.focus\:ring-blue-900:focus{--tw-ring-color:var(--color-blue-900)}.focus\:ring-current:focus{--tw-ring-color:currentcolor}.focus\:ring-gray-50:focus{--tw-ring-color:var(--color-gray-50)}.focus\:ring-gray-100:focus{--tw-ring-color:var(--color-gray-100)}.focus\:ring-gray-200:focus{--tw-ring-color:var(--color-gray-200)}.focus\:ring-gray-300:focus{--tw-ring-color:var(--color-gray-300)}.focus\:ring-gray-400:focus{--tw-ring-color:var(--color-gray-400)}.focus\:ring-gray-500:focus{--tw-ring-color:var(--color-gray-500)}.focus\:ring-gray-600:focus{--tw-ring-color:var(--color-gray-600)}.focus\:ring-gray-700:focus{--tw-ring-color:var(--color-gray-700)}.focus\:ring-gray-800:focus{--tw-ring-color:var(--color-gray-800)}.focus\:ring-gray-900:focus{--tw-ring-color:var(--color-gray-900)}.focus\:ring-green-500:focus{--tw-ring-color:var(--color-green-500)}.focus\:ring-indigo-500:focus{--tw-ring-color:var(--color-indigo-500)}.focus\:ring-primary-500:focus{--tw-ring-color:var(--color-primary-500)}.focus\:ring-purple-500:focus{--tw-ring-color:var(--color-purple-500)}.focus\:ring-red-500:focus{--tw-ring-color:var(--color-red-500)}.focus\:ring-transparent:focus{--tw-ring-color:transparent}.focus\:ring-yellow-500:focus{--tw-ring-color:var(--color-yellow-500)}.focus\:ring-offset-0:focus{--tw-ring-offset-width:0px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus\:ring-offset-1:focus{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus\:ring-offset-4:focus{--tw-ring-offset-width:4px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus\:ring-offset-gray-100:focus{--tw-ring-offset-color:var(--color-gray-100)}.focus\:ring-offset-gray-900:focus{--tw-ring-offset-color:var(--color-gray-900)}.focus\:ring-offset-white:focus{--tw-ring-offset-color:var(--color-white)}.focus\:outline:focus{outline-style:var(--tw-outline-style);outline-width:1px}.focus\:outline-0:focus{outline-style:var(--tw-outline-style);outline-width:0}.focus\:outline-1:focus{outline-style:var(--tw-outline-style);outline-width:1px}.focus\:outline-2:focus{outline-style:var(--tw-outline-style);outline-width:2px}.focus\:outline-4:focus{outline-style:var(--tw-outline-style);outline-width:4px}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus\:ring-inset:focus{--tw-ring-inset:inset}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-blue-500:focus-visible{--tw-ring-color:var(--color-blue-500)}.focus-visible\:ring-gray-500:focus-visible{--tw-ring-color:var(--color-gray-500)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus-visible\:outline:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px}.active\:scale-95:active{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x)var(--tw-scale-y)}.active\:scale-100:active{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.active\:cursor-grabbing:active{cursor:grabbing}.active\:bg-blue-600:active{background-color:var(--color-blue-600)}.active\:bg-blue-700:active{background-color:var(--color-blue-700)}.active\:bg-blue-800:active{background-color:var(--color-blue-800)}.active\:bg-gray-100:active{background-color:var(--color-gray-100)}.active\:bg-gray-200:active{background-color:var(--color-gray-200)}.active\:bg-gray-300:active{background-color:var(--color-gray-300)}.active\:bg-gray-700:active{background-color:var(--color-gray-700)}.active\:bg-gray-800:active{background-color:var(--color-gray-800)}.active\:bg-green-600:active{background-color:var(--color-green-600)}.active\:bg-green-700:active{background-color:var(--color-green-700)}.active\:bg-red-600:active{background-color:var(--color-red-600)}.active\:bg-red-700:active{background-color:var(--color-red-700)}.active\:opacity-75:active{opacity:.75}.active\:opacity-100:active{opacity:1}.disabled\:cursor-default:disabled{cursor:default}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:border-gray-200:disabled{border-color:var(--color-gray-200)}.disabled\:border-gray-300:disabled{border-color:var(--color-gray-300)}.disabled\:bg-gray-100:disabled{background-color:var(--color-gray-100)}.disabled\:bg-gray-200:disabled{background-color:var(--color-gray-200)}.disabled\:bg-gray-300:disabled{background-color:var(--color-gray-300)}.disabled\:text-gray-300:disabled{color:var(--color-gray-300)}.disabled\:text-gray-400:disabled{color:var(--color-gray-400)}.disabled\:text-gray-500:disabled{color:var(--color-gray-500)}.disabled\:no-underline:disabled{text-decoration-line:none}.disabled\:opacity-20:disabled{opacity:.2}.disabled\:opacity-25:disabled{opacity:.25}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-75:disabled{opacity:.75}@media(min-width:40rem){.sm\:col-span-1{grid-column:span 1/span 1}.sm\:col-span-2{grid-column:span 2/span 2}.sm\:col-span-3{grid-column:span 3/span 3}.sm\:col-span-4{grid-column:span 4/span 4}.sm\:col-span-6{grid-column:span 6/span 6}.sm\:col-span-12{grid-column:span 12/span 12}.sm\:col-span-full{grid-column:1/-1}.sm\:m-0{margin:calc(var(--spacing)*0)}.sm\:m-1{margin:calc(var(--spacing)*1)}.sm\:m-2{margin:calc(var(--spacing)*2)}.sm\:m-3{margin:calc(var(--spacing)*3)}.sm\:m-4{margin:calc(var(--spacing)*4)}.sm\:m-auto{margin:auto}.sm\:mx-auto{margin-inline:auto}.sm\:my-auto{margin-block:auto}.sm\:ml-auto{margin-left:auto}.sm\:block{display:block}.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:inline{display:inline}.sm\:inline-block{display:inline-block}.sm\:inline-flex{display:inline-flex}.sm\:w-1\/2{width:50%}.sm\:w-1\/3{width:33.3333%}.sm\:w-1\/4{width:25%}.sm\:w-2\/3{width:66.6667%}.sm\:w-3\/4{width:75%}.sm\:w-64{width:calc(var(--spacing)*64)}.sm\:w-auto{width:auto}.sm\:w-full{width:100%}.sm\:min-w-48{min-width:calc(var(--spacing)*48)}.sm\:auto-cols-\[calc\(33\.333\%_-_11px\)\]{grid-auto-columns:calc(33.333% - 11px)}.sm\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.sm\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.sm\:flex-col{flex-direction:column}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:items-end{align-items:flex-end}.sm\:items-start{align-items:flex-start}.sm\:justify-between{justify-content:space-between}.sm\:justify-center{justify-content:center}.sm\:justify-end{justify-content:flex-end}.sm\:justify-start{justify-content:flex-start}.sm\:gap-0{gap:calc(var(--spacing)*0)}.sm\:gap-1{gap:calc(var(--spacing)*1)}.sm\:gap-2{gap:calc(var(--spacing)*2)}.sm\:gap-3{gap:calc(var(--spacing)*3)}.sm\:gap-4{gap:calc(var(--spacing)*4)}.sm\:gap-5{gap:calc(var(--spacing)*5)}.sm\:gap-6{gap:calc(var(--spacing)*6)}.sm\:gap-8{gap:calc(var(--spacing)*8)}:where(.sm\:space-y-0>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*0)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*0)*calc(1 - var(--tw-space-y-reverse)))}:where(.sm\:space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.sm\:space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.sm\:space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.sm\:space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.sm\:space-x-0>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*0)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*0)*calc(1 - var(--tw-space-x-reverse)))}:where(.sm\:space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*1)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-x-reverse)))}:where(.sm\:space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-x-reverse)))}:where(.sm\:space-x-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*3)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-x-reverse)))}:where(.sm\:space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*4)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-x-reverse)))}.sm\:p-0{padding:calc(var(--spacing)*0)}.sm\:p-1{padding:calc(var(--spacing)*1)}.sm\:p-2{padding:calc(var(--spacing)*2)}.sm\:p-3{padding:calc(var(--spacing)*3)}.sm\:p-4{padding:calc(var(--spacing)*4)}.sm\:p-5{padding:calc(var(--spacing)*5)}.sm\:p-6{padding:calc(var(--spacing)*6)}.sm\:p-8{padding:calc(var(--spacing)*8)}.sm\:px-0{padding-inline:calc(var(--spacing)*0)}.sm\:px-1{padding-inline:calc(var(--spacing)*1)}.sm\:px-2{padding-inline:calc(var(--spacing)*2)}.sm\:px-3{padding-inline:calc(var(--spacing)*3)}.sm\:px-4{padding-inline:calc(var(--spacing)*4)}.sm\:px-5{padding-inline:calc(var(--spacing)*5)}.sm\:px-6{padding-inline:calc(var(--spacing)*6)}.sm\:px-8{padding-inline:calc(var(--spacing)*8)}.sm\:py-0{padding-block:calc(var(--spacing)*0)}.sm\:py-1{padding-block:calc(var(--spacing)*1)}.sm\:py-2{padding-block:calc(var(--spacing)*2)}.sm\:py-3{padding-block:calc(var(--spacing)*3)}.sm\:py-4{padding-block:calc(var(--spacing)*4)}.sm\:py-5{padding-block:calc(var(--spacing)*5)}.sm\:py-6{padding-block:calc(var(--spacing)*6)}.sm\:py-8{padding-block:calc(var(--spacing)*8)}.sm\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.sm\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.sm\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.sm\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.sm\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.sm\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.sm\:text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}}@media(min-width:48rem){.md\:absolute{position:absolute}.md\:fixed{position:fixed}.md\:relative{position:relative}.md\:static{position:static}.md\:sticky{position:sticky}.md\:inset-0{inset:calc(var(--spacing)*0)}.md\:top-0{top:calc(var(--spacing)*0)}.md\:right-0{right:calc(var(--spacing)*0)}.md\:bottom-0{bottom:calc(var(--spacing)*0)}.md\:left-0{left:calc(var(--spacing)*0)}.md\:order-1{order:1}.md\:order-2{order:2}.md\:order-3{order:3}.md\:order-first{order:-9999}.md\:order-last{order:9999}.md\:order-none{order:0}.md\:col-span-1{grid-column:span 1/span 1}.md\:col-span-2{grid-column:span 2/span 2}.md\:col-span-3{grid-column:span 3/span 3}.md\:col-span-4{grid-column:span 4/span 4}.md\:col-span-5{grid-column:span 5/span 5}.md\:col-span-6{grid-column:span 6/span 6}.md\:col-span-12{grid-column:span 12/span 12}.md\:col-span-full{grid-column:1/-1}.md\:row-span-1{grid-row:span 1/span 1}.md\:row-span-2{grid-row:span 2/span 2}.md\:row-span-3{grid-row:span 3/span 3}.md\:row-span-4{grid-row:span 4/span 4}.md\:row-span-full{grid-row:1/-1}.md\:m-0{margin:calc(var(--spacing)*0)}.md\:m-1{margin:calc(var(--spacing)*1)}.md\:m-2{margin:calc(var(--spacing)*2)}.md\:m-3{margin:calc(var(--spacing)*3)}.md\:m-4{margin:calc(var(--spacing)*4)}.md\:m-auto{margin:auto}.md\:mx-auto{margin-inline:auto}.md\:my-auto{margin-block:auto}.md\:mt-0{margin-top:calc(var(--spacing)*0)}.md\:mt-1{margin-top:calc(var(--spacing)*1)}.md\:mt-2{margin-top:calc(var(--spacing)*2)}.md\:mt-3{margin-top:calc(var(--spacing)*3)}.md\:mt-4{margin-top:calc(var(--spacing)*4)}.md\:mt-6{margin-top:calc(var(--spacing)*6)}.md\:mt-8{margin-top:calc(var(--spacing)*8)}.md\:mr-0{margin-right:calc(var(--spacing)*0)}.md\:mr-1{margin-right:calc(var(--spacing)*1)}.md\:mr-2{margin-right:calc(var(--spacing)*2)}.md\:mr-3{margin-right:calc(var(--spacing)*3)}.md\:mr-4{margin-right:calc(var(--spacing)*4)}.md\:mr-6{margin-right:calc(var(--spacing)*6)}.md\:mr-8{margin-right:calc(var(--spacing)*8)}.md\:mr-auto{margin-right:auto}.md\:mb-0{margin-bottom:calc(var(--spacing)*0)}.md\:mb-1{margin-bottom:calc(var(--spacing)*1)}.md\:mb-2{margin-bottom:calc(var(--spacing)*2)}.md\:mb-3{margin-bottom:calc(var(--spacing)*3)}.md\:mb-4{margin-bottom:calc(var(--spacing)*4)}.md\:mb-6{margin-bottom:calc(var(--spacing)*6)}.md\:mb-8{margin-bottom:calc(var(--spacing)*8)}.md\:ml-0{margin-left:calc(var(--spacing)*0)}.md\:ml-1{margin-left:calc(var(--spacing)*1)}.md\:ml-2{margin-left:calc(var(--spacing)*2)}.md\:ml-3{margin-left:calc(var(--spacing)*3)}.md\:ml-4{margin-left:calc(var(--spacing)*4)}.md\:ml-6{margin-left:calc(var(--spacing)*6)}.md\:ml-8{margin-left:calc(var(--spacing)*8)}.md\:ml-auto{margin-left:auto}.md\:block{display:block}.md\:flex{display:flex}.md\:grid{display:grid}.md\:hidden{display:none}.md\:inline{display:inline}.md\:inline-block{display:inline-block}.md\:inline-flex{display:inline-flex}.md\:w-1\/2{width:50%}.md\:w-1\/3{width:33.3333%}.md\:w-1\/4{width:25%}.md\:w-1\/5{width:20%}.md\:w-2\/3{width:66.6667%}.md\:w-2\/5{width:40%}.md\:w-3\/4{width:75%}.md\:w-3\/5{width:60%}.md\:w-4\/5{width:80%}.md\:w-auto{width:auto}.md\:w-full{width:100%}.md\:max-w-2xl{max-width:var(--container-2xl)}.md\:max-w-3xl{max-width:var(--container-3xl)}.md\:max-w-4xl{max-width:var(--container-4xl)}.md\:max-w-5xl{max-width:var(--container-5xl)}.md\:max-w-6xl{max-width:var(--container-6xl)}.md\:max-w-7xl{max-width:var(--container-7xl)}.md\:max-w-full{max-width:100%}.md\:max-w-lg{max-width:var(--container-lg)}.md\:max-w-md{max-width:var(--container-md)}.md\:max-w-none{max-width:none}.md\:max-w-sm{max-width:var(--container-sm)}.md\:max-w-xl{max-width:var(--container-xl)}.md\:max-w-xs{max-width:var(--container-xs)}.md\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.md\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.md\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.md\:grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.md\:grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.md\:grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.md\:grid-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))}.md\:grid-rows-5{grid-template-rows:repeat(5,minmax(0,1fr))}.md\:grid-rows-6{grid-template-rows:repeat(6,minmax(0,1fr))}.md\:flex-col{flex-direction:column}.md\:flex-row{flex-direction:row}.md\:items-baseline{align-items:baseline}.md\:items-center{align-items:center}.md\:items-end{align-items:flex-end}.md\:items-start{align-items:flex-start}.md\:items-stretch{align-items:stretch}.md\:justify-around{justify-content:space-around}.md\:justify-between{justify-content:space-between}.md\:justify-center{justify-content:center}.md\:justify-end{justify-content:flex-end}.md\:justify-start{justify-content:flex-start}.md\:gap-0{gap:calc(var(--spacing)*0)}.md\:gap-1{gap:calc(var(--spacing)*1)}.md\:gap-2{gap:calc(var(--spacing)*2)}.md\:gap-3{gap:calc(var(--spacing)*3)}.md\:gap-4{gap:calc(var(--spacing)*4)}.md\:gap-5{gap:calc(var(--spacing)*5)}.md\:gap-6{gap:calc(var(--spacing)*6)}.md\:gap-8{gap:calc(var(--spacing)*8)}.md\:gap-10{gap:calc(var(--spacing)*10)}.md\:gap-12{gap:calc(var(--spacing)*12)}:where(.md\:space-y-0>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*0)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*0)*calc(1 - var(--tw-space-y-reverse)))}:where(.md\:space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.md\:space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.md\:space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.md\:space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.md\:space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.md\:space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*8)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-y-reverse)))}:where(.md\:space-x-0>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*0)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*0)*calc(1 - var(--tw-space-x-reverse)))}:where(.md\:space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*1)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-x-reverse)))}:where(.md\:space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-x-reverse)))}:where(.md\:space-x-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*3)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-x-reverse)))}:where(.md\:space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*4)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-x-reverse)))}:where(.md\:space-x-6>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*6)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-x-reverse)))}:where(.md\:space-x-8>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*8)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-x-reverse)))}.md\:p-0{padding:calc(var(--spacing)*0)}.md\:p-1{padding:calc(var(--spacing)*1)}.md\:p-2{padding:calc(var(--spacing)*2)}.md\:p-3{padding:calc(var(--spacing)*3)}.md\:p-4{padding:calc(var(--spacing)*4)}.md\:p-5{padding:calc(var(--spacing)*5)}.md\:p-6{padding:calc(var(--spacing)*6)}.md\:p-8{padding:calc(var(--spacing)*8)}.md\:p-10{padding:calc(var(--spacing)*10)}.md\:p-12{padding:calc(var(--spacing)*12)}.md\:px-0{padding-inline:calc(var(--spacing)*0)}.md\:px-1{padding-inline:calc(var(--spacing)*1)}.md\:px-2{padding-inline:calc(var(--spacing)*2)}.md\:px-3{padding-inline:calc(var(--spacing)*3)}.md\:px-4{padding-inline:calc(var(--spacing)*4)}.md\:px-5{padding-inline:calc(var(--spacing)*5)}.md\:px-6{padding-inline:calc(var(--spacing)*6)}.md\:px-8{padding-inline:calc(var(--spacing)*8)}.md\:px-10{padding-inline:calc(var(--spacing)*10)}.md\:px-12{padding-inline:calc(var(--spacing)*12)}.md\:py-0{padding-block:calc(var(--spacing)*0)}.md\:py-1{padding-block:calc(var(--spacing)*1)}.md\:py-2{padding-block:calc(var(--spacing)*2)}.md\:py-3{padding-block:calc(var(--spacing)*3)}.md\:py-4{padding-block:calc(var(--spacing)*4)}.md\:py-5{padding-block:calc(var(--spacing)*5)}.md\:py-6{padding-block:calc(var(--spacing)*6)}.md\:py-8{padding-block:calc(var(--spacing)*8)}.md\:py-10{padding-block:calc(var(--spacing)*10)}.md\:py-12{padding-block:calc(var(--spacing)*12)}.md\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.md\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.md\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.md\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.md\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.md\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.md\:text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}}@media(min-width:64rem){.lg\:absolute{position:absolute}.lg\:fixed{position:fixed}.lg\:relative{position:relative}.lg\:static{position:static}.lg\:sticky{position:sticky}.lg\:inset-0{inset:calc(var(--spacing)*0)}.lg\:top-0{top:calc(var(--spacing)*0)}.lg\:right-0{right:calc(var(--spacing)*0)}.lg\:bottom-0{bottom:calc(var(--spacing)*0)}.lg\:left-0{left:calc(var(--spacing)*0)}.lg\:order-1{order:1}.lg\:order-2{order:2}.lg\:order-3{order:3}.lg\:order-4{order:4}.lg\:order-first{order:-9999}.lg\:order-last{order:9999}.lg\:order-none{order:0}.lg\:col-span-1{grid-column:span 1/span 1}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-span-3{grid-column:span 3/span 3}.lg\:col-span-4{grid-column:span 4/span 4}.lg\:col-span-5{grid-column:span 5/span 5}.lg\:col-span-6{grid-column:span 6/span 6}.lg\:col-span-7{grid-column:span 7/span 7}.lg\:col-span-8{grid-column:span 8/span 8}.lg\:col-span-12{grid-column:span 12/span 12}.lg\:col-span-full{grid-column:1/-1}.lg\:row-span-1{grid-row:span 1/span 1}.lg\:row-span-2{grid-row:span 2/span 2}.lg\:row-span-3{grid-row:span 3/span 3}.lg\:row-span-4{grid-row:span 4/span 4}.lg\:row-span-full{grid-row:1/-1}.lg\:m-0{margin:calc(var(--spacing)*0)}.lg\:m-1{margin:calc(var(--spacing)*1)}.lg\:m-2{margin:calc(var(--spacing)*2)}.lg\:m-3{margin:calc(var(--spacing)*3)}.lg\:m-4{margin:calc(var(--spacing)*4)}.lg\:m-auto{margin:auto}.lg\:mx-auto{margin-inline:auto}.lg\:my-auto{margin-block:auto}.lg\:mt-0{margin-top:calc(var(--spacing)*0)}.lg\:mt-1{margin-top:calc(var(--spacing)*1)}.lg\:mt-2{margin-top:calc(var(--spacing)*2)}.lg\:mt-3{margin-top:calc(var(--spacing)*3)}.lg\:mt-4{margin-top:calc(var(--spacing)*4)}.lg\:mt-6{margin-top:calc(var(--spacing)*6)}.lg\:mt-8{margin-top:calc(var(--spacing)*8)}.lg\:mt-10{margin-top:calc(var(--spacing)*10)}.lg\:mt-12{margin-top:calc(var(--spacing)*12)}.lg\:mr-0{margin-right:calc(var(--spacing)*0)}.lg\:mr-1{margin-right:calc(var(--spacing)*1)}.lg\:mr-2{margin-right:calc(var(--spacing)*2)}.lg\:mr-3{margin-right:calc(var(--spacing)*3)}.lg\:mr-4{margin-right:calc(var(--spacing)*4)}.lg\:mr-6{margin-right:calc(var(--spacing)*6)}.lg\:mr-8{margin-right:calc(var(--spacing)*8)}.lg\:mr-auto{margin-right:auto}.lg\:mb-0{margin-bottom:calc(var(--spacing)*0)}.lg\:mb-1{margin-bottom:calc(var(--spacing)*1)}.lg\:mb-2{margin-bottom:calc(var(--spacing)*2)}.lg\:mb-3{margin-bottom:calc(var(--spacing)*3)}.lg\:mb-4{margin-bottom:calc(var(--spacing)*4)}.lg\:mb-6{margin-bottom:calc(var(--spacing)*6)}.lg\:mb-8{margin-bottom:calc(var(--spacing)*8)}.lg\:mb-10{margin-bottom:calc(var(--spacing)*10)}.lg\:mb-12{margin-bottom:calc(var(--spacing)*12)}.lg\:ml-0{margin-left:calc(var(--spacing)*0)}.lg\:ml-1{margin-left:calc(var(--spacing)*1)}.lg\:ml-2{margin-left:calc(var(--spacing)*2)}.lg\:ml-3{margin-left:calc(var(--spacing)*3)}.lg\:ml-4{margin-left:calc(var(--spacing)*4)}.lg\:ml-6{margin-left:calc(var(--spacing)*6)}.lg\:ml-8{margin-left:calc(var(--spacing)*8)}.lg\:ml-auto{margin-left:auto}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:grid{display:grid}.lg\:hidden{display:none}.lg\:inline{display:inline}.lg\:inline-block{display:inline-block}.lg\:inline-flex{display:inline-flex}.lg\:w-1\/2{width:50%}.lg\:w-1\/3{width:33.3333%}.lg\:w-1\/4{width:25%}.lg\:w-1\/5{width:20%}.lg\:w-1\/6{width:16.6667%}.lg\:w-2\/3{width:66.6667%}.lg\:w-2\/5{width:40%}.lg\:w-3\/4{width:75%}.lg\:w-3\/5{width:60%}.lg\:w-4\/5{width:80%}.lg\:w-5\/6{width:83.3333%}.lg\:w-auto{width:auto}.lg\:w-full{width:100%}.lg\:max-w-2xl{max-width:var(--container-2xl)}.lg\:max-w-3xl{max-width:var(--container-3xl)}.lg\:max-w-4xl{max-width:var(--container-4xl)}.lg\:max-w-5xl{max-width:var(--container-5xl)}.lg\:max-w-6xl{max-width:var(--container-6xl)}.lg\:max-w-7xl{max-width:var(--container-7xl)}.lg\:max-w-full{max-width:100%}.lg\:max-w-lg{max-width:var(--container-lg)}.lg\:max-w-md{max-width:var(--container-md)}.lg\:max-w-none{max-width:none}.lg\:max-w-sm{max-width:var(--container-sm)}.lg\:max-w-xl{max-width:var(--container-xl)}.lg\:max-w-xs{max-width:var(--container-xs)}.lg\:auto-cols-\[calc\(25\%_-_12px\)\]{grid-auto-columns:calc(25% - 12px)}.lg\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.lg\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.lg\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lg\:grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.lg\:grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.lg\:grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.lg\:grid-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))}.lg\:grid-rows-5{grid-template-rows:repeat(5,minmax(0,1fr))}.lg\:grid-rows-6{grid-template-rows:repeat(6,minmax(0,1fr))}.lg\:flex-col{flex-direction:column}.lg\:flex-row{flex-direction:row}.lg\:items-baseline{align-items:baseline}.lg\:items-center{align-items:center}.lg\:items-end{align-items:flex-end}.lg\:items-start{align-items:flex-start}.lg\:items-stretch{align-items:stretch}.lg\:justify-around{justify-content:space-around}.lg\:justify-between{justify-content:space-between}.lg\:justify-center{justify-content:center}.lg\:justify-end{justify-content:flex-end}.lg\:justify-evenly{justify-content:space-evenly}.lg\:justify-start{justify-content:flex-start}.lg\:gap-0{gap:calc(var(--spacing)*0)}.lg\:gap-1{gap:calc(var(--spacing)*1)}.lg\:gap-2{gap:calc(var(--spacing)*2)}.lg\:gap-3{gap:calc(var(--spacing)*3)}.lg\:gap-4{gap:calc(var(--spacing)*4)}.lg\:gap-5{gap:calc(var(--spacing)*5)}.lg\:gap-6{gap:calc(var(--spacing)*6)}.lg\:gap-8{gap:calc(var(--spacing)*8)}.lg\:gap-10{gap:calc(var(--spacing)*10)}.lg\:gap-12{gap:calc(var(--spacing)*12)}.lg\:gap-16{gap:calc(var(--spacing)*16)}:where(.lg\:space-y-0>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*0)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*0)*calc(1 - var(--tw-space-y-reverse)))}:where(.lg\:space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.lg\:space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.lg\:space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.lg\:space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.lg\:space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.lg\:space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*8)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-y-reverse)))}:where(.lg\:space-y-10>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*10)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*10)*calc(1 - var(--tw-space-y-reverse)))}:where(.lg\:space-x-0>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*0)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*0)*calc(1 - var(--tw-space-x-reverse)))}:where(.lg\:space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*1)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-x-reverse)))}:where(.lg\:space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-x-reverse)))}:where(.lg\:space-x-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*3)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-x-reverse)))}:where(.lg\:space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*4)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-x-reverse)))}:where(.lg\:space-x-6>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*6)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-x-reverse)))}:where(.lg\:space-x-8>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*8)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-x-reverse)))}:where(.lg\:space-x-10>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*10)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*10)*calc(1 - var(--tw-space-x-reverse)))}.lg\:p-0{padding:calc(var(--spacing)*0)}.lg\:p-1{padding:calc(var(--spacing)*1)}.lg\:p-2{padding:calc(var(--spacing)*2)}.lg\:p-3{padding:calc(var(--spacing)*3)}.lg\:p-4{padding:calc(var(--spacing)*4)}.lg\:p-5{padding:calc(var(--spacing)*5)}.lg\:p-6{padding:calc(var(--spacing)*6)}.lg\:p-8{padding:calc(var(--spacing)*8)}.lg\:p-10{padding:calc(var(--spacing)*10)}.lg\:p-12{padding:calc(var(--spacing)*12)}.lg\:p-16{padding:calc(var(--spacing)*16)}.lg\:px-0{padding-inline:calc(var(--spacing)*0)}.lg\:px-1{padding-inline:calc(var(--spacing)*1)}.lg\:px-2{padding-inline:calc(var(--spacing)*2)}.lg\:px-3{padding-inline:calc(var(--spacing)*3)}.lg\:px-4{padding-inline:calc(var(--spacing)*4)}.lg\:px-5{padding-inline:calc(var(--spacing)*5)}.lg\:px-6{padding-inline:calc(var(--spacing)*6)}.lg\:px-8{padding-inline:calc(var(--spacing)*8)}.lg\:px-10{padding-inline:calc(var(--spacing)*10)}.lg\:px-12{padding-inline:calc(var(--spacing)*12)}.lg\:px-16{padding-inline:calc(var(--spacing)*16)}.lg\:py-0{padding-block:calc(var(--spacing)*0)}.lg\:py-1{padding-block:calc(var(--spacing)*1)}.lg\:py-2{padding-block:calc(var(--spacing)*2)}.lg\:py-3{padding-block:calc(var(--spacing)*3)}.lg\:py-4{padding-block:calc(var(--spacing)*4)}.lg\:py-5{padding-block:calc(var(--spacing)*5)}.lg\:py-6{padding-block:calc(var(--spacing)*6)}.lg\:py-8{padding-block:calc(var(--spacing)*8)}.lg\:py-10{padding-block:calc(var(--spacing)*10)}.lg\:py-12{padding-block:calc(var(--spacing)*12)}.lg\:py-16{padding-block:calc(var(--spacing)*16)}.lg\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.lg\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.lg\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.lg\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.lg\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.lg\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.lg\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.lg\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.lg\:text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}}@media(min-width:80rem){.xl\:col-span-1{grid-column:span 1/span 1}.xl\:col-span-2{grid-column:span 2/span 2}.xl\:col-span-3{grid-column:span 3/span 3}.xl\:col-span-4{grid-column:span 4/span 4}.xl\:col-span-5{grid-column:span 5/span 5}.xl\:col-span-6{grid-column:span 6/span 6}.xl\:col-span-12{grid-column:span 12/span 12}.xl\:col-span-full{grid-column:1/-1}.xl\:row-span-1{grid-row:span 1/span 1}.xl\:row-span-2{grid-row:span 2/span 2}.xl\:row-span-3{grid-row:span 3/span 3}.xl\:row-span-full{grid-row:1/-1}.xl\:m-0{margin:calc(var(--spacing)*0)}.xl\:m-auto{margin:auto}.xl\:mx-auto{margin-inline:auto}.xl\:my-auto{margin-block:auto}.xl\:block{display:block}.xl\:flex{display:flex}.xl\:hidden{display:none}.xl\:inline{display:inline}.xl\:inline-block{display:inline-block}.xl\:inline-flex{display:inline-flex}.xl\:w-1\/2{width:50%}.xl\:w-1\/3{width:33.3333%}.xl\:w-1\/4{width:25%}.xl\:w-1\/5{width:20%}.xl\:w-2\/3{width:66.6667%}.xl\:w-2\/5{width:40%}.xl\:w-3\/4{width:75%}.xl\:w-3\/5{width:60%}.xl\:w-4\/5{width:80%}.xl\:w-auto{width:auto}.xl\:w-full{width:100%}.xl\:max-w-2xl{max-width:var(--container-2xl)}.xl\:max-w-3xl{max-width:var(--container-3xl)}.xl\:max-w-4xl{max-width:var(--container-4xl)}.xl\:max-w-5xl{max-width:var(--container-5xl)}.xl\:max-w-6xl{max-width:var(--container-6xl)}.xl\:max-w-7xl{max-width:var(--container-7xl)}.xl\:max-w-full{max-width:100%}.xl\:max-w-lg{max-width:var(--container-lg)}.xl\:max-w-md{max-width:var(--container-md)}.xl\:max-w-none{max-width:none}.xl\:max-w-sm{max-width:var(--container-sm)}.xl\:max-w-xl{max-width:var(--container-xl)}.xl\:max-w-xs{max-width:var(--container-xs)}.xl\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.xl\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.xl\:grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.xl\:grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.xl\:grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.xl\:grid-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))}.xl\:flex-col{flex-direction:column}.xl\:flex-row{flex-direction:row}.xl\:items-center{align-items:center}.xl\:items-end{align-items:flex-end}.xl\:items-start{align-items:flex-start}.xl\:justify-between{justify-content:space-between}.xl\:justify-center{justify-content:center}.xl\:justify-end{justify-content:flex-end}.xl\:justify-start{justify-content:flex-start}.xl\:gap-0{gap:calc(var(--spacing)*0)}.xl\:gap-1{gap:calc(var(--spacing)*1)}.xl\:gap-2{gap:calc(var(--spacing)*2)}.xl\:gap-3{gap:calc(var(--spacing)*3)}.xl\:gap-4{gap:calc(var(--spacing)*4)}.xl\:gap-5{gap:calc(var(--spacing)*5)}.xl\:gap-6{gap:calc(var(--spacing)*6)}.xl\:gap-8{gap:calc(var(--spacing)*8)}.xl\:gap-10{gap:calc(var(--spacing)*10)}.xl\:gap-12{gap:calc(var(--spacing)*12)}.xl\:gap-16{gap:calc(var(--spacing)*16)}:where(.xl\:space-y-0>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*0)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*0)*calc(1 - var(--tw-space-y-reverse)))}:where(.xl\:space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.xl\:space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.xl\:space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.xl\:space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.xl\:space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.xl\:space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*8)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-y-reverse)))}:where(.xl\:space-x-0>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*0)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*0)*calc(1 - var(--tw-space-x-reverse)))}:where(.xl\:space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*1)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-x-reverse)))}:where(.xl\:space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-x-reverse)))}:where(.xl\:space-x-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*3)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-x-reverse)))}:where(.xl\:space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*4)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-x-reverse)))}:where(.xl\:space-x-6>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*6)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-x-reverse)))}:where(.xl\:space-x-8>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*8)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-x-reverse)))}.xl\:p-0{padding:calc(var(--spacing)*0)}.xl\:p-1{padding:calc(var(--spacing)*1)}.xl\:p-2{padding:calc(var(--spacing)*2)}.xl\:p-3{padding:calc(var(--spacing)*3)}.xl\:p-4{padding:calc(var(--spacing)*4)}.xl\:p-5{padding:calc(var(--spacing)*5)}.xl\:p-6{padding:calc(var(--spacing)*6)}.xl\:p-8{padding:calc(var(--spacing)*8)}.xl\:p-10{padding:calc(var(--spacing)*10)}.xl\:p-12{padding:calc(var(--spacing)*12)}.xl\:p-16{padding:calc(var(--spacing)*16)}.xl\:px-0{padding-inline:calc(var(--spacing)*0)}.xl\:px-1{padding-inline:calc(var(--spacing)*1)}.xl\:px-2{padding-inline:calc(var(--spacing)*2)}.xl\:px-3{padding-inline:calc(var(--spacing)*3)}.xl\:px-4{padding-inline:calc(var(--spacing)*4)}.xl\:px-5{padding-inline:calc(var(--spacing)*5)}.xl\:px-6{padding-inline:calc(var(--spacing)*6)}.xl\:px-8{padding-inline:calc(var(--spacing)*8)}.xl\:px-10{padding-inline:calc(var(--spacing)*10)}.xl\:px-12{padding-inline:calc(var(--spacing)*12)}.xl\:px-16{padding-inline:calc(var(--spacing)*16)}.xl\:py-0{padding-block:calc(var(--spacing)*0)}.xl\:py-1{padding-block:calc(var(--spacing)*1)}.xl\:py-2{padding-block:calc(var(--spacing)*2)}.xl\:py-3{padding-block:calc(var(--spacing)*3)}.xl\:py-4{padding-block:calc(var(--spacing)*4)}.xl\:py-5{padding-block:calc(var(--spacing)*5)}.xl\:py-6{padding-block:calc(var(--spacing)*6)}.xl\:py-8{padding-block:calc(var(--spacing)*8)}.xl\:py-10{padding-block:calc(var(--spacing)*10)}.xl\:py-12{padding-block:calc(var(--spacing)*12)}.xl\:py-16{padding-block:calc(var(--spacing)*16)}.xl\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.xl\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.xl\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.xl\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.xl\:text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}.xl\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.xl\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.xl\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.xl\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.xl\:text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}}@media(min-width:96rem){.\32xl\:col-span-1{grid-column:span 1/span 1}.\32xl\:col-span-2{grid-column:span 2/span 2}.\32xl\:col-span-3{grid-column:span 3/span 3}.\32xl\:col-span-4{grid-column:span 4/span 4}.\32xl\:col-span-6{grid-column:span 6/span 6}.\32xl\:col-span-12{grid-column:span 12/span 12}.\32xl\:block{display:block}.\32xl\:flex{display:flex}.\32xl\:hidden{display:none}.\32xl\:w-1\/2{width:50%}.\32xl\:w-1\/3{width:33.3333%}.\32xl\:w-1\/4{width:25%}.\32xl\:w-2\/3{width:66.6667%}.\32xl\:w-3\/4{width:75%}.\32xl\:w-auto{width:auto}.\32xl\:w-full{width:100%}.\32xl\:max-w-2xl{max-width:var(--container-2xl)}.\32xl\:max-w-3xl{max-width:var(--container-3xl)}.\32xl\:max-w-4xl{max-width:var(--container-4xl)}.\32xl\:max-w-5xl{max-width:var(--container-5xl)}.\32xl\:max-w-6xl{max-width:var(--container-6xl)}.\32xl\:max-w-7xl{max-width:var(--container-7xl)}.\32xl\:max-w-full{max-width:100%}.\32xl\:max-w-lg{max-width:var(--container-lg)}.\32xl\:max-w-md{max-width:var(--container-md)}.\32xl\:max-w-sm{max-width:var(--container-sm)}.\32xl\:max-w-xl{max-width:var(--container-xl)}.\32xl\:max-w-xs{max-width:var(--container-xs)}.\32xl\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.\32xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.\32xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.\32xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.\32xl\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.\32xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.\32xl\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.\32xl\:gap-0{gap:calc(var(--spacing)*0)}.\32xl\:gap-4{gap:calc(var(--spacing)*4)}.\32xl\:gap-6{gap:calc(var(--spacing)*6)}.\32xl\:gap-8{gap:calc(var(--spacing)*8)}.\32xl\:gap-12{gap:calc(var(--spacing)*12)}.\32xl\:gap-16{gap:calc(var(--spacing)*16)}.\32xl\:p-0{padding:calc(var(--spacing)*0)}.\32xl\:p-4{padding:calc(var(--spacing)*4)}.\32xl\:p-6{padding:calc(var(--spacing)*6)}.\32xl\:p-8{padding:calc(var(--spacing)*8)}.\32xl\:p-12{padding:calc(var(--spacing)*12)}.\32xl\:p-16{padding:calc(var(--spacing)*16)}.\32xl\:px-0{padding-inline:calc(var(--spacing)*0)}.\32xl\:px-4{padding-inline:calc(var(--spacing)*4)}.\32xl\:px-6{padding-inline:calc(var(--spacing)*6)}.\32xl\:px-8{padding-inline:calc(var(--spacing)*8)}.\32xl\:px-12{padding-inline:calc(var(--spacing)*12)}.\32xl\:px-16{padding-inline:calc(var(--spacing)*16)}.\32xl\:py-0{padding-block:calc(var(--spacing)*0)}.\32xl\:py-4{padding-block:calc(var(--spacing)*4)}.\32xl\:py-6{padding-block:calc(var(--spacing)*6)}.\32xl\:py-8{padding-block:calc(var(--spacing)*8)}.\32xl\:py-12{padding-block:calc(var(--spacing)*12)}.\32xl\:py-16{padding-block:calc(var(--spacing)*16)}.\32xl\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.\32xl\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.\32xl\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.\32xl\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.\32xl\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.\32xl\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.\32xl\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.\32xl\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.\32xl\:text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}}.dark .dark\:block{display:block}.dark .dark\:flex{display:flex}.dark .dark\:flex-1{flex:1}.dark .dark\:flex-auto{flex:auto}.dark .dark\:flex-none{flex:none}.dark .dark\:flex-col{flex-direction:column}.dark .dark\:flex-row{flex-direction:row}.dark .dark\:flex-wrap{flex-wrap:wrap}.dark .dark\:items-center{align-items:center}.dark .dark\:items-end{align-items:flex-end}.dark .dark\:items-start{align-items:flex-start}.dark .dark\:items-stretch{align-items:stretch}.dark .dark\:justify-around{justify-content:space-around}.dark .dark\:justify-between{justify-content:space-between}.dark .dark\:justify-center{justify-content:center}.dark .dark\:justify-end{justify-content:flex-end}.dark .dark\:justify-start{justify-content:flex-start}:where(.dark .dark\:divide-gray-50>:not(:last-child)){border-color:var(--color-gray-50)}:where(.dark .dark\:divide-gray-100>:not(:last-child)){border-color:var(--color-gray-100)}:where(.dark .dark\:divide-gray-200>:not(:last-child)){border-color:var(--color-gray-200)}:where(.dark .dark\:divide-gray-300>:not(:last-child)){border-color:var(--color-gray-300)}:where(.dark .dark\:divide-gray-400>:not(:last-child)){border-color:var(--color-gray-400)}:where(.dark .dark\:divide-gray-500>:not(:last-child)){border-color:var(--color-gray-500)}:where(.dark .dark\:divide-gray-600>:not(:last-child)){border-color:var(--color-gray-600)}:where(.dark .dark\:divide-gray-700>:not(:last-child)){border-color:var(--color-gray-700)}:where(.dark .dark\:divide-gray-800>:not(:last-child)){border-color:var(--color-gray-800)}:where(.dark .dark\:divide-gray-900>:not(:last-child)){border-color:var(--color-gray-900)}.dark .dark\:self-center{align-self:center}.dark .dark\:self-end{align-self:flex-end}.dark .dark\:self-start{align-self:flex-start}.dark .dark\:self-stretch{align-self:stretch}.dark .dark\:overflow-auto{overflow:auto}.dark .dark\:overflow-hidden{overflow:hidden}.dark .dark\:overflow-visible{overflow:visible}.dark .dark\:overflow-x-auto{overflow-x:auto}.dark .dark\:overflow-y-auto{overflow-y:auto}.dark .dark\:rounded{border-radius:.25rem}.dark .dark\:rounded-full{border-radius:3.40282e38px}.dark .dark\:rounded-lg{border-radius:var(--radius-lg)}.dark .dark\:rounded-none{border-radius:0}.dark .dark\:rounded-sm{border-radius:var(--radius-sm)}.dark .dark\:rounded-xl{border-radius:var(--radius-xl)}.dark .dark\:border{border-style:var(--tw-border-style);border-width:1px}.dark .dark\:border-0{border-style:var(--tw-border-style);border-width:0}.dark .dark\:border-dashed{--tw-border-style:dashed;border-style:dashed}.dark .dark\:border-dotted{--tw-border-style:dotted;border-style:dotted}.dark .dark\:border-solid{--tw-border-style:solid;border-style:solid}.dark .dark\:border-black{border-color:var(--color-black)}.dark .dark\:border-blue-50{border-color:var(--color-blue-50)}.dark .dark\:border-blue-100{border-color:var(--color-blue-100)}.dark .dark\:border-blue-200{border-color:var(--color-blue-200)}.dark .dark\:border-blue-300{border-color:var(--color-blue-300)}.dark .dark\:border-blue-400{border-color:var(--color-blue-400)}.dark .dark\:border-blue-500{border-color:var(--color-blue-500)}.dark .dark\:border-blue-600{border-color:var(--color-blue-600)}.dark .dark\:border-blue-700{border-color:var(--color-blue-700)}.dark .dark\:border-blue-800{border-color:var(--color-blue-800)}.dark .dark\:border-blue-900{border-color:var(--color-blue-900)}.dark .dark\:border-gray-50{border-color:var(--color-gray-50)}.dark .dark\:border-gray-100{border-color:var(--color-gray-100)}.dark .dark\:border-gray-200{border-color:var(--color-gray-200)}.dark .dark\:border-gray-300{border-color:var(--color-gray-300)}.dark .dark\:border-gray-400{border-color:var(--color-gray-400)}.dark .dark\:border-gray-500{border-color:var(--color-gray-500)}.dark .dark\:border-gray-600{border-color:var(--color-gray-600)}.dark .dark\:border-gray-700{border-color:var(--color-gray-700)}.dark .dark\:border-gray-700\/50{border-color:#36415380}@supports (color:color-mix(in lab,red,red)){.dark .dark\:border-gray-700\/50{border-color:color-mix(in oklab,var(--color-gray-700)50%,transparent)}}.dark .dark\:border-gray-800{border-color:var(--color-gray-800)}.dark .dark\:border-gray-900{border-color:var(--color-gray-900)}.dark .dark\:border-gray-900\/30{border-color:#1018284d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:border-gray-900\/30{border-color:color-mix(in oklab,var(--color-gray-900)30%,transparent)}}.dark .dark\:border-gray-950{border-color:var(--color-gray-950)}.dark .dark\:border-green-600{border-color:var(--color-green-600)}.dark .dark\:border-green-700{border-color:var(--color-green-700)}.dark .dark\:border-green-800{border-color:var(--color-green-800)}.dark .dark\:border-orange-600{border-color:var(--color-orange-600)}.dark .dark\:border-orange-800{border-color:var(--color-orange-800)}.dark .dark\:border-red-50{border-color:var(--color-red-50)}.dark .dark\:border-red-100{border-color:var(--color-red-100)}.dark .dark\:border-red-200{border-color:var(--color-red-200)}.dark .dark\:border-red-300{border-color:var(--color-red-300)}.dark .dark\:border-red-400{border-color:var(--color-red-400)}.dark .dark\:border-red-500{border-color:var(--color-red-500)}.dark .dark\:border-red-600{border-color:var(--color-red-600)}.dark .dark\:border-red-700{border-color:var(--color-red-700)}.dark .dark\:border-red-800{border-color:var(--color-red-800)}.dark .dark\:border-red-900{border-color:var(--color-red-900)}.dark .dark\:border-red-900\/50{border-color:#82181a80}@supports (color:color-mix(in lab,red,red)){.dark .dark\:border-red-900\/50{border-color:color-mix(in oklab,var(--color-red-900)50%,transparent)}}.dark .dark\:border-slate-50{border-color:var(--color-slate-50)}.dark .dark\:border-slate-100{border-color:var(--color-slate-100)}.dark .dark\:border-slate-200{border-color:var(--color-slate-200)}.dark .dark\:border-slate-300{border-color:var(--color-slate-300)}.dark .dark\:border-slate-400{border-color:var(--color-slate-400)}.dark .dark\:border-slate-500{border-color:var(--color-slate-500)}.dark .dark\:border-slate-600{border-color:var(--color-slate-600)}.dark .dark\:border-slate-700{border-color:var(--color-slate-700)}.dark .dark\:border-slate-800{border-color:var(--color-slate-800)}.dark .dark\:border-slate-900{border-color:var(--color-slate-900)}.dark .dark\:border-slate-950{border-color:var(--color-slate-950)}.dark .dark\:border-transparent{border-color:#0000}.dark .dark\:border-white{border-color:var(--color-white)}.dark .dark\:border-yellow-800{border-color:var(--color-yellow-800)}.dark .dark\:border-t-gray-900{border-top-color:var(--color-gray-900)}.dark .dark\:border-t-white{border-top-color:var(--color-white)}.dark .dark\:bg-amber-900\/30{background-color:#7b33064d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-amber-900\/30{background-color:color-mix(in oklab,var(--color-amber-900)30%,transparent)}}.dark .dark\:bg-black{background-color:var(--color-black)}.dark .dark\:bg-blue-50{background-color:var(--color-blue-50)}.dark .dark\:bg-blue-100{background-color:var(--color-blue-100)}.dark .dark\:bg-blue-200{background-color:var(--color-blue-200)}.dark .dark\:bg-blue-300{background-color:var(--color-blue-300)}.dark .dark\:bg-blue-400{background-color:var(--color-blue-400)}.dark .dark\:bg-blue-500{background-color:var(--color-blue-500)}.dark .dark\:bg-blue-600{background-color:var(--color-blue-600)}.dark .dark\:bg-blue-700{background-color:var(--color-blue-700)}.dark .dark\:bg-blue-800{background-color:var(--color-blue-800)}.dark .dark\:bg-blue-900{background-color:var(--color-blue-900)}.dark .dark\:bg-blue-900\/10{background-color:#1c398e1a}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-blue-900\/10{background-color:color-mix(in oklab,var(--color-blue-900)10%,transparent)}}.dark .dark\:bg-blue-900\/20{background-color:#1c398e33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-blue-900\/20{background-color:color-mix(in oklab,var(--color-blue-900)20%,transparent)}}.dark .dark\:bg-blue-900\/30{background-color:#1c398e4d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-blue-900\/30{background-color:color-mix(in oklab,var(--color-blue-900)30%,transparent)}}.dark .dark\:bg-blue-900\/40{background-color:#1c398e66}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-blue-900\/40{background-color:color-mix(in oklab,var(--color-blue-900)40%,transparent)}}.dark .dark\:bg-blue-900\/50{background-color:#1c398e80}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-blue-900\/50{background-color:color-mix(in oklab,var(--color-blue-900)50%,transparent)}}.dark .dark\:bg-blue-950{background-color:var(--color-blue-950)}.dark .dark\:bg-blue-950\/50{background-color:#16245680}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-blue-950\/50{background-color:color-mix(in oklab,var(--color-blue-950)50%,transparent)}}.dark .dark\:bg-emerald-900{background-color:var(--color-emerald-900)}.dark .dark\:bg-gray-50{background-color:var(--color-gray-50)}.dark .dark\:bg-gray-100{background-color:var(--color-gray-100)}.dark .dark\:bg-gray-200{background-color:var(--color-gray-200)}.dark .dark\:bg-gray-300{background-color:var(--color-gray-300)}.dark .dark\:bg-gray-400{background-color:var(--color-gray-400)}.dark .dark\:bg-gray-500{background-color:var(--color-gray-500)}.dark .dark\:bg-gray-600{background-color:var(--color-gray-600)}.dark .dark\:bg-gray-700{background-color:var(--color-gray-700)}.dark .dark\:bg-gray-700\/50{background-color:#36415380}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-gray-700\/50{background-color:color-mix(in oklab,var(--color-gray-700)50%,transparent)}}.dark .dark\:bg-gray-800{background-color:var(--color-gray-800)}.dark .dark\:bg-gray-800\/50{background-color:#1e293980}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-gray-800\/50{background-color:color-mix(in oklab,var(--color-gray-800)50%,transparent)}}.dark .dark\:bg-gray-800\/80{background-color:#1e2939cc}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-gray-800\/80{background-color:color-mix(in oklab,var(--color-gray-800)80%,transparent)}}.dark .dark\:bg-gray-800\/90{background-color:#1e2939e6}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-gray-800\/90{background-color:color-mix(in oklab,var(--color-gray-800)90%,transparent)}}.dark .dark\:bg-gray-900{background-color:var(--color-gray-900)}.dark .dark\:bg-gray-900\/30{background-color:#1018284d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-gray-900\/30{background-color:color-mix(in oklab,var(--color-gray-900)30%,transparent)}}.dark .dark\:bg-gray-900\/50{background-color:#10182880}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-gray-900\/50{background-color:color-mix(in oklab,var(--color-gray-900)50%,transparent)}}.dark .dark\:bg-gray-950{background-color:var(--color-gray-950)}.dark .dark\:bg-green-50{background-color:var(--color-green-50)}.dark .dark\:bg-green-100{background-color:var(--color-green-100)}.dark .dark\:bg-green-200{background-color:var(--color-green-200)}.dark .dark\:bg-green-300{background-color:var(--color-green-300)}.dark .dark\:bg-green-400{background-color:var(--color-green-400)}.dark .dark\:bg-green-500{background-color:var(--color-green-500)}.dark .dark\:bg-green-600{background-color:var(--color-green-600)}.dark .dark\:bg-green-700{background-color:var(--color-green-700)}.dark .dark\:bg-green-800{background-color:var(--color-green-800)}.dark .dark\:bg-green-900{background-color:var(--color-green-900)}.dark .dark\:bg-green-900\/20{background-color:#0d542b33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-green-900\/20{background-color:color-mix(in oklab,var(--color-green-900)20%,transparent)}}.dark .dark\:bg-green-900\/30{background-color:#0d542b4d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-green-900\/30{background-color:color-mix(in oklab,var(--color-green-900)30%,transparent)}}.dark .dark\:bg-green-900\/50{background-color:#0d542b80}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-green-900\/50{background-color:color-mix(in oklab,var(--color-green-900)50%,transparent)}}.dark .dark\:bg-green-950{background-color:var(--color-green-950)}.dark .dark\:bg-indigo-50{background-color:var(--color-indigo-50)}.dark .dark\:bg-indigo-100{background-color:var(--color-indigo-100)}.dark .dark\:bg-indigo-200{background-color:var(--color-indigo-200)}.dark .dark\:bg-indigo-300{background-color:var(--color-indigo-300)}.dark .dark\:bg-indigo-400{background-color:var(--color-indigo-400)}.dark .dark\:bg-indigo-500{background-color:var(--color-indigo-500)}.dark .dark\:bg-indigo-600{background-color:var(--color-indigo-600)}.dark .dark\:bg-indigo-700{background-color:var(--color-indigo-700)}.dark .dark\:bg-indigo-800{background-color:var(--color-indigo-800)}.dark .dark\:bg-indigo-900{background-color:var(--color-indigo-900)}.dark .dark\:bg-indigo-900\/30{background-color:#312c854d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-indigo-900\/30{background-color:color-mix(in oklab,var(--color-indigo-900)30%,transparent)}}.dark .dark\:bg-indigo-950{background-color:var(--color-indigo-950)}.dark .dark\:bg-orange-50{background-color:var(--color-orange-50)}.dark .dark\:bg-orange-100{background-color:var(--color-orange-100)}.dark .dark\:bg-orange-200{background-color:var(--color-orange-200)}.dark .dark\:bg-orange-300{background-color:var(--color-orange-300)}.dark .dark\:bg-orange-400{background-color:var(--color-orange-400)}.dark .dark\:bg-orange-500{background-color:var(--color-orange-500)}.dark .dark\:bg-orange-600{background-color:var(--color-orange-600)}.dark .dark\:bg-orange-700{background-color:var(--color-orange-700)}.dark .dark\:bg-orange-800{background-color:var(--color-orange-800)}.dark .dark\:bg-orange-900{background-color:var(--color-orange-900)}.dark .dark\:bg-orange-900\/20{background-color:#7e2a0c33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-orange-900\/20{background-color:color-mix(in oklab,var(--color-orange-900)20%,transparent)}}.dark .dark\:bg-orange-900\/30{background-color:#7e2a0c4d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-orange-900\/30{background-color:color-mix(in oklab,var(--color-orange-900)30%,transparent)}}.dark .dark\:bg-orange-900\/50{background-color:#7e2a0c80}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-orange-900\/50{background-color:color-mix(in oklab,var(--color-orange-900)50%,transparent)}}.dark .dark\:bg-orange-950{background-color:var(--color-orange-950)}.dark .dark\:bg-pink-50{background-color:var(--color-pink-50)}.dark .dark\:bg-pink-100{background-color:var(--color-pink-100)}.dark .dark\:bg-pink-200{background-color:var(--color-pink-200)}.dark .dark\:bg-pink-300{background-color:var(--color-pink-300)}.dark .dark\:bg-pink-400{background-color:var(--color-pink-400)}.dark .dark\:bg-pink-500{background-color:var(--color-pink-500)}.dark .dark\:bg-pink-600{background-color:var(--color-pink-600)}.dark .dark\:bg-pink-700{background-color:var(--color-pink-700)}.dark .dark\:bg-pink-800{background-color:var(--color-pink-800)}.dark .dark\:bg-pink-900{background-color:var(--color-pink-900)}.dark .dark\:bg-pink-950{background-color:var(--color-pink-950)}.dark .dark\:bg-primary-900\/30{background-color:#1e3a8a4d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-primary-900\/30{background-color:color-mix(in oklab,var(--color-primary-900)30%,transparent)}}.dark .dark\:bg-purple-50{background-color:var(--color-purple-50)}.dark .dark\:bg-purple-100{background-color:var(--color-purple-100)}.dark .dark\:bg-purple-200{background-color:var(--color-purple-200)}.dark .dark\:bg-purple-300{background-color:var(--color-purple-300)}.dark .dark\:bg-purple-400{background-color:var(--color-purple-400)}.dark .dark\:bg-purple-500{background-color:var(--color-purple-500)}.dark .dark\:bg-purple-600{background-color:var(--color-purple-600)}.dark .dark\:bg-purple-700{background-color:var(--color-purple-700)}.dark .dark\:bg-purple-800{background-color:var(--color-purple-800)}.dark .dark\:bg-purple-900{background-color:var(--color-purple-900)}.dark .dark\:bg-purple-900\/30{background-color:#59168b4d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-purple-900\/30{background-color:color-mix(in oklab,var(--color-purple-900)30%,transparent)}}.dark .dark\:bg-purple-900\/50{background-color:#59168b80}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-purple-900\/50{background-color:color-mix(in oklab,var(--color-purple-900)50%,transparent)}}.dark .dark\:bg-purple-950{background-color:var(--color-purple-950)}.dark .dark\:bg-red-50{background-color:var(--color-red-50)}.dark .dark\:bg-red-100{background-color:var(--color-red-100)}.dark .dark\:bg-red-200{background-color:var(--color-red-200)}.dark .dark\:bg-red-300{background-color:var(--color-red-300)}.dark .dark\:bg-red-400{background-color:var(--color-red-400)}.dark .dark\:bg-red-500{background-color:var(--color-red-500)}.dark .dark\:bg-red-600{background-color:var(--color-red-600)}.dark .dark\:bg-red-700{background-color:var(--color-red-700)}.dark .dark\:bg-red-800{background-color:var(--color-red-800)}.dark .dark\:bg-red-900{background-color:var(--color-red-900)}.dark .dark\:bg-red-900\/10{background-color:#82181a1a}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-red-900\/10{background-color:color-mix(in oklab,var(--color-red-900)10%,transparent)}}.dark .dark\:bg-red-900\/20{background-color:#82181a33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-red-900\/20{background-color:color-mix(in oklab,var(--color-red-900)20%,transparent)}}.dark .dark\:bg-red-900\/30{background-color:#82181a4d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-red-900\/30{background-color:color-mix(in oklab,var(--color-red-900)30%,transparent)}}.dark .dark\:bg-red-950{background-color:var(--color-red-950)}.dark .dark\:bg-red-950\/50{background-color:#46080980}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-red-950\/50{background-color:color-mix(in oklab,var(--color-red-950)50%,transparent)}}.dark .dark\:bg-red-950\/80{background-color:#460809cc}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-red-950\/80{background-color:color-mix(in oklab,var(--color-red-950)80%,transparent)}}.dark .dark\:bg-slate-50{background-color:var(--color-slate-50)}.dark .dark\:bg-slate-100{background-color:var(--color-slate-100)}.dark .dark\:bg-slate-200{background-color:var(--color-slate-200)}.dark .dark\:bg-slate-300{background-color:var(--color-slate-300)}.dark .dark\:bg-slate-400{background-color:var(--color-slate-400)}.dark .dark\:bg-slate-500{background-color:var(--color-slate-500)}.dark .dark\:bg-slate-600{background-color:var(--color-slate-600)}.dark .dark\:bg-slate-700{background-color:var(--color-slate-700)}.dark .dark\:bg-slate-800{background-color:var(--color-slate-800)}.dark .dark\:bg-slate-900{background-color:var(--color-slate-900)}.dark .dark\:bg-slate-950{background-color:var(--color-slate-950)}.dark .dark\:bg-white{background-color:var(--color-white)}.dark .dark\:bg-yellow-50{background-color:var(--color-yellow-50)}.dark .dark\:bg-yellow-100{background-color:var(--color-yellow-100)}.dark .dark\:bg-yellow-200{background-color:var(--color-yellow-200)}.dark .dark\:bg-yellow-300{background-color:var(--color-yellow-300)}.dark .dark\:bg-yellow-400{background-color:var(--color-yellow-400)}.dark .dark\:bg-yellow-500{background-color:var(--color-yellow-500)}.dark .dark\:bg-yellow-600{background-color:var(--color-yellow-600)}.dark .dark\:bg-yellow-700{background-color:var(--color-yellow-700)}.dark .dark\:bg-yellow-800{background-color:var(--color-yellow-800)}.dark .dark\:bg-yellow-900{background-color:var(--color-yellow-900)}.dark .dark\:bg-yellow-900\/20{background-color:#733e0a33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-yellow-900\/20{background-color:color-mix(in oklab,var(--color-yellow-900)20%,transparent)}}.dark .dark\:bg-yellow-900\/30{background-color:#733e0a4d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-yellow-900\/30{background-color:color-mix(in oklab,var(--color-yellow-900)30%,transparent)}}.dark .dark\:bg-yellow-950{background-color:var(--color-yellow-950)}.dark .dark\:from-gray-50{--tw-gradient-from:var(--color-gray-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:from-gray-100{--tw-gradient-from:var(--color-gray-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:from-gray-200{--tw-gradient-from:var(--color-gray-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:from-gray-300{--tw-gradient-from:var(--color-gray-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:from-gray-400{--tw-gradient-from:var(--color-gray-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:from-gray-500{--tw-gradient-from:var(--color-gray-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:from-gray-600{--tw-gradient-from:var(--color-gray-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:from-gray-700{--tw-gradient-from:var(--color-gray-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:from-gray-800{--tw-gradient-from:var(--color-gray-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:from-gray-900{--tw-gradient-from:var(--color-gray-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:to-gray-50{--tw-gradient-to:var(--color-gray-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:to-gray-100{--tw-gradient-to:var(--color-gray-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:to-gray-200{--tw-gradient-to:var(--color-gray-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:to-gray-300{--tw-gradient-to:var(--color-gray-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:to-gray-400{--tw-gradient-to:var(--color-gray-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:to-gray-500{--tw-gradient-to:var(--color-gray-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:to-gray-600{--tw-gradient-to:var(--color-gray-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:to-gray-700{--tw-gradient-to:var(--color-gray-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:to-gray-800{--tw-gradient-to:var(--color-gray-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:to-gray-900{--tw-gradient-to:var(--color-gray-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:text-center{text-align:center}.dark .dark\:text-justify{text-align:justify}.dark .dark\:text-left{text-align:left}.dark .dark\:text-right{text-align:right}.dark .dark\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.dark .dark\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.dark .dark\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.dark .dark\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.dark .dark\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.dark .dark\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.dark .dark\:text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.dark .dark\:leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.dark .dark\:leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.dark .dark\:leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.dark .dark\:font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.dark .dark\:font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.dark .dark\:font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.dark .dark\:tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.dark .dark\:tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.dark .dark\:tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.dark .dark\:whitespace-normal{white-space:normal}.dark .dark\:whitespace-nowrap{white-space:nowrap}.dark .dark\:whitespace-pre-wrap{white-space:pre-wrap}.dark .dark\:text-amber-400{color:var(--color-amber-400)}.dark .dark\:text-black{color:var(--color-black)}.dark .dark\:text-blue-50{color:var(--color-blue-50)}.dark .dark\:text-blue-100{color:var(--color-blue-100)}.dark .dark\:text-blue-200{color:var(--color-blue-200)}.dark .dark\:text-blue-300{color:var(--color-blue-300)}.dark .dark\:text-blue-400{color:var(--color-blue-400)}.dark .dark\:text-blue-500{color:var(--color-blue-500)}.dark .dark\:text-blue-600{color:var(--color-blue-600)}.dark .dark\:text-blue-700{color:var(--color-blue-700)}.dark .dark\:text-blue-800{color:var(--color-blue-800)}.dark .dark\:text-blue-900{color:var(--color-blue-900)}.dark .dark\:text-emerald-400{color:var(--color-emerald-400)}.dark .dark\:text-gray-50{color:var(--color-gray-50)}.dark .dark\:text-gray-100{color:var(--color-gray-100)}.dark .dark\:text-gray-200{color:var(--color-gray-200)}.dark .dark\:text-gray-300{color:var(--color-gray-300)}.dark .dark\:text-gray-400{color:var(--color-gray-400)}.dark .dark\:text-gray-500{color:var(--color-gray-500)}.dark .dark\:text-gray-500\/80{color:#6a7282cc}@supports (color:color-mix(in lab,red,red)){.dark .dark\:text-gray-500\/80{color:color-mix(in oklab,var(--color-gray-500)80%,transparent)}}.dark .dark\:text-gray-600{color:var(--color-gray-600)}.dark .dark\:text-gray-700{color:var(--color-gray-700)}.dark .dark\:text-gray-800{color:var(--color-gray-800)}.dark .dark\:text-gray-900{color:var(--color-gray-900)}.dark .dark\:text-green-50{color:var(--color-green-50)}.dark .dark\:text-green-100{color:var(--color-green-100)}.dark .dark\:text-green-200{color:var(--color-green-200)}.dark .dark\:text-green-300{color:var(--color-green-300)}.dark .dark\:text-green-400{color:var(--color-green-400)}.dark .dark\:text-green-500{color:var(--color-green-500)}.dark .dark\:text-green-600{color:var(--color-green-600)}.dark .dark\:text-green-700{color:var(--color-green-700)}.dark .dark\:text-green-800{color:var(--color-green-800)}.dark .dark\:text-green-900{color:var(--color-green-900)}.dark .dark\:text-indigo-400{color:var(--color-indigo-400)}.dark .dark\:text-orange-50{color:var(--color-orange-50)}.dark .dark\:text-orange-100{color:var(--color-orange-100)}.dark .dark\:text-orange-200{color:var(--color-orange-200)}.dark .dark\:text-orange-300{color:var(--color-orange-300)}.dark .dark\:text-orange-400{color:var(--color-orange-400)}.dark .dark\:text-orange-500{color:var(--color-orange-500)}.dark .dark\:text-orange-600{color:var(--color-orange-600)}.dark .dark\:text-orange-700{color:var(--color-orange-700)}.dark .dark\:text-orange-800{color:var(--color-orange-800)}.dark .dark\:text-orange-900{color:var(--color-orange-900)}.dark .dark\:text-pink-50{color:var(--color-pink-50)}.dark .dark\:text-pink-100{color:var(--color-pink-100)}.dark .dark\:text-pink-200{color:var(--color-pink-200)}.dark .dark\:text-pink-300{color:var(--color-pink-300)}.dark .dark\:text-pink-400{color:var(--color-pink-400)}.dark .dark\:text-pink-500{color:var(--color-pink-500)}.dark .dark\:text-pink-600{color:var(--color-pink-600)}.dark .dark\:text-pink-700{color:var(--color-pink-700)}.dark .dark\:text-pink-800{color:var(--color-pink-800)}.dark .dark\:text-pink-900{color:var(--color-pink-900)}.dark .dark\:text-primary-400{color:var(--color-primary-400)}.dark .dark\:text-primary-500{color:var(--color-primary-500)}.dark .dark\:text-purple-50{color:var(--color-purple-50)}.dark .dark\:text-purple-100{color:var(--color-purple-100)}.dark .dark\:text-purple-200{color:var(--color-purple-200)}.dark .dark\:text-purple-300{color:var(--color-purple-300)}.dark .dark\:text-purple-400{color:var(--color-purple-400)}.dark .dark\:text-purple-500{color:var(--color-purple-500)}.dark .dark\:text-purple-600{color:var(--color-purple-600)}.dark .dark\:text-purple-700{color:var(--color-purple-700)}.dark .dark\:text-purple-800{color:var(--color-purple-800)}.dark .dark\:text-purple-900{color:var(--color-purple-900)}.dark .dark\:text-red-50{color:var(--color-red-50)}.dark .dark\:text-red-100{color:var(--color-red-100)}.dark .dark\:text-red-200{color:var(--color-red-200)}.dark .dark\:text-red-300{color:var(--color-red-300)}.dark .dark\:text-red-400{color:var(--color-red-400)}.dark .dark\:text-red-500{color:var(--color-red-500)}.dark .dark\:text-red-600{color:var(--color-red-600)}.dark .dark\:text-red-700{color:var(--color-red-700)}.dark .dark\:text-red-800{color:var(--color-red-800)}.dark .dark\:text-red-900{color:var(--color-red-900)}.dark .dark\:text-slate-50{color:var(--color-slate-50)}.dark .dark\:text-slate-100{color:var(--color-slate-100)}.dark .dark\:text-slate-200{color:var(--color-slate-200)}.dark .dark\:text-slate-300{color:var(--color-slate-300)}.dark .dark\:text-slate-400{color:var(--color-slate-400)}.dark .dark\:text-slate-500{color:var(--color-slate-500)}.dark .dark\:text-slate-600{color:var(--color-slate-600)}.dark .dark\:text-slate-700{color:var(--color-slate-700)}.dark .dark\:text-slate-800{color:var(--color-slate-800)}.dark .dark\:text-slate-900{color:var(--color-slate-900)}.dark .dark\:text-white{color:var(--color-white)}.dark .dark\:text-yellow-50{color:var(--color-yellow-50)}.dark .dark\:text-yellow-100{color:var(--color-yellow-100)}.dark .dark\:text-yellow-200{color:var(--color-yellow-200)}.dark .dark\:text-yellow-300{color:var(--color-yellow-300)}.dark .dark\:text-yellow-400{color:var(--color-yellow-400)}.dark .dark\:text-yellow-500{color:var(--color-yellow-500)}.dark .dark\:text-yellow-600{color:var(--color-yellow-600)}.dark .dark\:text-yellow-700{color:var(--color-yellow-700)}.dark .dark\:text-yellow-800{color:var(--color-yellow-800)}.dark .dark\:text-yellow-900{color:var(--color-yellow-900)}.dark .dark\:italic{font-style:italic}.dark .dark\:underline{text-decoration-line:underline}.dark .dark\:placeholder-gray-400::placeholder{color:var(--color-gray-400)}.dark .dark\:placeholder-gray-500::placeholder{color:var(--color-gray-500)}.dark .dark\:opacity-0{opacity:0}.dark .dark\:opacity-25{opacity:.25}.dark .dark\:opacity-50{opacity:.5}.dark .dark\:opacity-75{opacity:.75}.dark .dark\:opacity-100{opacity:1}.dark .dark\:shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.dark .dark\:shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.dark .dark\:shadow-inner{--tw-shadow:inset 0 2px 4px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.dark .dark\:shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.dark .dark\:shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.dark .dark\:shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.dark .dark\:shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.dark .dark\:shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.dark .dark\:ring-blue-50{--tw-ring-color:var(--color-blue-50)}.dark .dark\:ring-blue-100{--tw-ring-color:var(--color-blue-100)}.dark .dark\:ring-blue-200{--tw-ring-color:var(--color-blue-200)}.dark .dark\:ring-blue-300{--tw-ring-color:var(--color-blue-300)}.dark .dark\:ring-blue-400{--tw-ring-color:var(--color-blue-400)}.dark .dark\:ring-blue-500{--tw-ring-color:var(--color-blue-500)}.dark .dark\:ring-blue-600{--tw-ring-color:var(--color-blue-600)}.dark .dark\:ring-blue-700{--tw-ring-color:var(--color-blue-700)}.dark .dark\:ring-blue-800{--tw-ring-color:var(--color-blue-800)}.dark .dark\:ring-blue-900{--tw-ring-color:var(--color-blue-900)}.dark .dark\:ring-gray-50{--tw-ring-color:var(--color-gray-50)}.dark .dark\:ring-gray-100{--tw-ring-color:var(--color-gray-100)}.dark .dark\:ring-gray-200{--tw-ring-color:var(--color-gray-200)}.dark .dark\:ring-gray-300{--tw-ring-color:var(--color-gray-300)}.dark .dark\:ring-gray-400{--tw-ring-color:var(--color-gray-400)}.dark .dark\:ring-gray-500{--tw-ring-color:var(--color-gray-500)}.dark .dark\:ring-gray-600{--tw-ring-color:var(--color-gray-600)}.dark .dark\:ring-gray-700{--tw-ring-color:var(--color-gray-700)}.dark .dark\:ring-gray-800{--tw-ring-color:var(--color-gray-800)}.dark .dark\:ring-gray-900{--tw-ring-color:var(--color-gray-900)}.dark .dark\:ring-white{--tw-ring-color:var(--color-white)}.dark .dark\:ring-offset-gray-800{--tw-ring-offset-color:var(--color-gray-800)}@media(hover:hover){.dark .dark\:group-hover\:bg-gray-700:is(:where(.group):hover *){background-color:var(--color-gray-700)}.dark .dark\:group-hover\:bg-gray-800:is(:where(.group):hover *){background-color:var(--color-gray-800)}.dark .dark\:group-hover\:text-blue-400:is(:where(.group):hover *){color:var(--color-blue-400)}.dark .dark\:group-hover\:text-gray-100:is(:where(.group):hover *){color:var(--color-gray-100)}.dark .dark\:group-hover\:text-white:is(:where(.group):hover *){color:var(--color-white)}}.dark .dark\:selection\:bg-blue-800 ::selection{background-color:var(--color-blue-800)}.dark .dark\:selection\:bg-blue-800::selection{background-color:var(--color-blue-800)}.dark .dark\:selection\:text-blue-100 ::selection{color:var(--color-blue-100)}.dark .dark\:selection\:text-blue-100::selection{color:var(--color-blue-100)}.dark .dark\:odd\:bg-gray-800:nth-child(odd){background-color:var(--color-gray-800)}.dark .dark\:odd\:bg-gray-900:nth-child(odd){background-color:var(--color-gray-900)}.dark .dark\:even\:bg-gray-800:nth-child(2n){background-color:var(--color-gray-800)}.dark .dark\:even\:bg-gray-900:nth-child(2n){background-color:var(--color-gray-900)}@media(hover:hover){.dark .dark\:hover\:border-blue-600:hover{border-color:var(--color-blue-600)}.dark .dark\:hover\:border-blue-700:hover{border-color:var(--color-blue-700)}.dark .dark\:hover\:border-blue-800:hover{border-color:var(--color-blue-800)}.dark .dark\:hover\:border-gray-50:hover{border-color:var(--color-gray-50)}.dark .dark\:hover\:border-gray-100:hover{border-color:var(--color-gray-100)}.dark .dark\:hover\:border-gray-200:hover{border-color:var(--color-gray-200)}.dark .dark\:hover\:border-gray-300:hover{border-color:var(--color-gray-300)}.dark .dark\:hover\:border-gray-400:hover{border-color:var(--color-gray-400)}.dark .dark\:hover\:border-gray-500:hover{border-color:var(--color-gray-500)}.dark .dark\:hover\:border-gray-600:hover{border-color:var(--color-gray-600)}.dark .dark\:hover\:border-gray-700:hover{border-color:var(--color-gray-700)}.dark .dark\:hover\:border-gray-800:hover{border-color:var(--color-gray-800)}.dark .dark\:hover\:border-gray-900:hover{border-color:var(--color-gray-900)}.dark .dark\:hover\:bg-blue-50:hover{background-color:var(--color-blue-50)}.dark .dark\:hover\:bg-blue-100:hover{background-color:var(--color-blue-100)}.dark .dark\:hover\:bg-blue-200:hover{background-color:var(--color-blue-200)}.dark .dark\:hover\:bg-blue-300:hover{background-color:var(--color-blue-300)}.dark .dark\:hover\:bg-blue-400:hover{background-color:var(--color-blue-400)}.dark .dark\:hover\:bg-blue-500:hover{background-color:var(--color-blue-500)}.dark .dark\:hover\:bg-blue-600:hover{background-color:var(--color-blue-600)}.dark .dark\:hover\:bg-blue-700:hover{background-color:var(--color-blue-700)}.dark .dark\:hover\:bg-blue-800:hover{background-color:var(--color-blue-800)}.dark .dark\:hover\:bg-blue-900:hover{background-color:var(--color-blue-900)}.dark .dark\:hover\:bg-blue-900\/20:hover{background-color:#1c398e33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:hover\:bg-blue-900\/20:hover{background-color:color-mix(in oklab,var(--color-blue-900)20%,transparent)}}.dark .dark\:hover\:bg-blue-900\/30:hover{background-color:#1c398e4d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:hover\:bg-blue-900\/30:hover{background-color:color-mix(in oklab,var(--color-blue-900)30%,transparent)}}.dark .dark\:hover\:bg-gray-50:hover{background-color:var(--color-gray-50)}.dark .dark\:hover\:bg-gray-100:hover{background-color:var(--color-gray-100)}.dark .dark\:hover\:bg-gray-200:hover{background-color:var(--color-gray-200)}.dark .dark\:hover\:bg-gray-300:hover{background-color:var(--color-gray-300)}.dark .dark\:hover\:bg-gray-400:hover{background-color:var(--color-gray-400)}.dark .dark\:hover\:bg-gray-500:hover{background-color:var(--color-gray-500)}.dark .dark\:hover\:bg-gray-600:hover{background-color:var(--color-gray-600)}.dark .dark\:hover\:bg-gray-700:hover{background-color:var(--color-gray-700)}.dark .dark\:hover\:bg-gray-700\/50:hover{background-color:#36415380}@supports (color:color-mix(in lab,red,red)){.dark .dark\:hover\:bg-gray-700\/50:hover{background-color:color-mix(in oklab,var(--color-gray-700)50%,transparent)}}.dark .dark\:hover\:bg-gray-800:hover{background-color:var(--color-gray-800)}.dark .dark\:hover\:bg-gray-800\/50:hover{background-color:#1e293980}@supports (color:color-mix(in lab,red,red)){.dark .dark\:hover\:bg-gray-800\/50:hover{background-color:color-mix(in oklab,var(--color-gray-800)50%,transparent)}}.dark .dark\:hover\:bg-gray-900:hover{background-color:var(--color-gray-900)}.dark .dark\:hover\:bg-indigo-600:hover{background-color:var(--color-indigo-600)}.dark .dark\:hover\:bg-orange-900\/20:hover{background-color:#7e2a0c33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:hover\:bg-orange-900\/20:hover{background-color:color-mix(in oklab,var(--color-orange-900)20%,transparent)}}.dark .dark\:hover\:bg-orange-900\/30:hover{background-color:#7e2a0c4d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:hover\:bg-orange-900\/30:hover{background-color:color-mix(in oklab,var(--color-orange-900)30%,transparent)}}.dark .dark\:hover\:bg-red-600:hover{background-color:var(--color-red-600)}.dark .dark\:hover\:bg-red-900\/20:hover{background-color:#82181a33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:hover\:bg-red-900\/20:hover{background-color:color-mix(in oklab,var(--color-red-900)20%,transparent)}}.dark .dark\:hover\:bg-slate-50:hover{background-color:var(--color-slate-50)}.dark .dark\:hover\:bg-slate-100:hover{background-color:var(--color-slate-100)}.dark .dark\:hover\:bg-slate-200:hover{background-color:var(--color-slate-200)}.dark .dark\:hover\:bg-slate-300:hover{background-color:var(--color-slate-300)}.dark .dark\:hover\:bg-slate-400:hover{background-color:var(--color-slate-400)}.dark .dark\:hover\:bg-slate-500:hover{background-color:var(--color-slate-500)}.dark .dark\:hover\:bg-slate-600:hover{background-color:var(--color-slate-600)}.dark .dark\:hover\:bg-slate-700:hover{background-color:var(--color-slate-700)}.dark .dark\:hover\:bg-slate-800:hover{background-color:var(--color-slate-800)}.dark .dark\:hover\:bg-slate-900:hover{background-color:var(--color-slate-900)}.dark .dark\:hover\:bg-white\/10:hover{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark .dark\:hover\:bg-white\/10:hover{background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.dark .dark\:hover\:text-black:hover{color:var(--color-black)}.dark .dark\:hover\:text-blue-50:hover{color:var(--color-blue-50)}.dark .dark\:hover\:text-blue-100:hover{color:var(--color-blue-100)}.dark .dark\:hover\:text-blue-200:hover{color:var(--color-blue-200)}.dark .dark\:hover\:text-blue-300:hover{color:var(--color-blue-300)}.dark .dark\:hover\:text-blue-400:hover{color:var(--color-blue-400)}.dark .dark\:hover\:text-blue-500:hover{color:var(--color-blue-500)}.dark .dark\:hover\:text-blue-600:hover{color:var(--color-blue-600)}.dark .dark\:hover\:text-blue-700:hover{color:var(--color-blue-700)}.dark .dark\:hover\:text-blue-800:hover{color:var(--color-blue-800)}.dark .dark\:hover\:text-blue-900:hover{color:var(--color-blue-900)}.dark .dark\:hover\:text-gray-50:hover{color:var(--color-gray-50)}.dark .dark\:hover\:text-gray-100:hover{color:var(--color-gray-100)}.dark .dark\:hover\:text-gray-200:hover{color:var(--color-gray-200)}.dark .dark\:hover\:text-gray-300:hover{color:var(--color-gray-300)}.dark .dark\:hover\:text-gray-400:hover{color:var(--color-gray-400)}.dark .dark\:hover\:text-gray-500:hover{color:var(--color-gray-500)}.dark .dark\:hover\:text-gray-600:hover{color:var(--color-gray-600)}.dark .dark\:hover\:text-gray-700:hover{color:var(--color-gray-700)}.dark .dark\:hover\:text-gray-800:hover{color:var(--color-gray-800)}.dark .dark\:hover\:text-gray-900:hover{color:var(--color-gray-900)}.dark .dark\:hover\:text-green-50:hover{color:var(--color-green-50)}.dark .dark\:hover\:text-green-100:hover{color:var(--color-green-100)}.dark .dark\:hover\:text-green-200:hover{color:var(--color-green-200)}.dark .dark\:hover\:text-green-300:hover{color:var(--color-green-300)}.dark .dark\:hover\:text-green-400:hover{color:var(--color-green-400)}.dark .dark\:hover\:text-green-500:hover{color:var(--color-green-500)}.dark .dark\:hover\:text-green-600:hover{color:var(--color-green-600)}.dark .dark\:hover\:text-green-700:hover{color:var(--color-green-700)}.dark .dark\:hover\:text-green-800:hover{color:var(--color-green-800)}.dark .dark\:hover\:text-green-900:hover{color:var(--color-green-900)}.dark .dark\:hover\:text-red-50:hover{color:var(--color-red-50)}.dark .dark\:hover\:text-red-100:hover{color:var(--color-red-100)}.dark .dark\:hover\:text-red-200:hover{color:var(--color-red-200)}.dark .dark\:hover\:text-red-300:hover{color:var(--color-red-300)}.dark .dark\:hover\:text-red-400:hover{color:var(--color-red-400)}.dark .dark\:hover\:text-red-500:hover{color:var(--color-red-500)}.dark .dark\:hover\:text-red-600:hover{color:var(--color-red-600)}.dark .dark\:hover\:text-red-700:hover{color:var(--color-red-700)}.dark .dark\:hover\:text-red-800:hover{color:var(--color-red-800)}.dark .dark\:hover\:text-red-900:hover{color:var(--color-red-900)}.dark .dark\:hover\:text-white:hover{color:var(--color-white)}}.dark .dark\:focus\:border-gray-500:focus{border-color:var(--color-gray-500)}.dark .dark\:focus\:border-gray-600:focus{border-color:var(--color-gray-600)}.dark .dark\:focus\:border-gray-700:focus{border-color:var(--color-gray-700)}.dark .dark\:focus\:bg-gray-700:focus{background-color:var(--color-gray-700)}.dark .dark\:focus\:bg-gray-800:focus{background-color:var(--color-gray-800)}.dark .dark\:focus\:bg-gray-900:focus{background-color:var(--color-gray-900)}.dark .dark\:focus\:text-gray-100:focus{color:var(--color-gray-100)}.dark .dark\:focus\:text-gray-200:focus{color:var(--color-gray-200)}.dark .dark\:focus\:text-gray-300:focus{color:var(--color-gray-300)}.dark .dark\:focus\:text-white:focus{color:var(--color-white)}.dark .dark\:focus\:ring-amber-600:focus{--tw-ring-color:var(--color-amber-600)}.dark .dark\:focus\:ring-blue-400:focus{--tw-ring-color:var(--color-blue-400)}.dark .dark\:focus\:ring-blue-500:focus{--tw-ring-color:var(--color-blue-500)}.dark .dark\:focus\:ring-blue-600:focus{--tw-ring-color:var(--color-blue-600)}.dark .dark\:focus\:ring-blue-700:focus{--tw-ring-color:var(--color-blue-700)}.dark .dark\:focus\:ring-gray-500:focus{--tw-ring-color:var(--color-gray-500)}.dark .dark\:focus\:ring-gray-600:focus{--tw-ring-color:var(--color-gray-600)}.dark .dark\:focus\:ring-gray-700:focus{--tw-ring-color:var(--color-gray-700)}.dark .dark\:focus\:ring-indigo-400:focus{--tw-ring-color:var(--color-indigo-400)}.dark .dark\:focus\:ring-white:focus{--tw-ring-color:var(--color-white)}.dark .dark\:focus\:ring-offset-gray-800:focus{--tw-ring-offset-color:var(--color-gray-800)}.dark .dark\:focus\:ring-offset-gray-900:focus{--tw-ring-offset-color:var(--color-gray-900)}.dark .dark\:active\:bg-gray-200:active{background-color:var(--color-gray-200)}.dark .dark\:active\:bg-gray-600:active{background-color:var(--color-gray-600)}.dark .dark\:active\:bg-gray-700:active{background-color:var(--color-gray-700)}.dark .dark\:active\:bg-gray-800:active{background-color:var(--color-gray-800)}.dark .dark\:disabled\:bg-gray-700:disabled{background-color:var(--color-gray-700)}.dark .dark\:disabled\:bg-gray-800:disabled{background-color:var(--color-gray-800)}.dark .dark\:disabled\:text-gray-500:disabled{color:var(--color-gray-500)}.dark .dark\:disabled\:text-gray-600:disabled{color:var(--color-gray-600)}.dark .dark\:disabled\:opacity-50:disabled{opacity:.5}.\[\&_img\]\:hidden img{display:none}.\[\&_mark\]\:rounded mark{border-radius:.25rem}.\[\&_mark\]\:bg-yellow-200 mark{background-color:var(--color-yellow-200)}.\[\&_mark\]\:px-0\.5 mark{padding-inline:calc(var(--spacing)*.5)}.dark :is(.\[\&_mark\]\:dark\:bg-yellow-500\/40 mark){background-color:#edb20066}@supports (color:color-mix(in lab,red,red)){.dark :is(.\[\&_mark\]\:dark\:bg-yellow-500\/40 mark){background-color:color-mix(in oklab,var(--color-yellow-500)40%,transparent)}}.\[\&_table\]\:hidden table{display:none}.\[\&_table\]\:w-full table{width:100%}.\[\&_table\]\:border-collapse table{border-collapse:collapse}.\[\&_table\]\:border table{border-style:var(--tw-border-style);border-width:1px}.\[\&_table\]\:border-gray-300 table{border-color:var(--color-gray-300)}.dark .dark\:\[\&_table\]\:border-gray-600 table{border-color:var(--color-gray-600)}.\[\&_td\]\:border td{border-style:var(--tw-border-style);border-width:1px}.\[\&_td\]\:border-gray-300 td{border-color:var(--color-gray-300)}.\[\&_td\]\:px-4 td{padding-inline:calc(var(--spacing)*4)}.\[\&_td\]\:py-2 td{padding-block:calc(var(--spacing)*2)}.dark .dark\:\[\&_td\]\:border-gray-600 td{border-color:var(--color-gray-600)}.\[\&_textarea\]\:\!border-red-500 textarea{border-color:var(--color-red-500)!important}.\[\&_textarea\]\:focus\:\!ring-red-500 textarea:focus{--tw-ring-color:var(--color-red-500)!important}.dark :is(.\[\&_textarea\]\:dark\:\!border-red-500 textarea){border-color:var(--color-red-500)!important}.\[\&_th\]\:border th{border-style:var(--tw-border-style);border-width:1px}.\[\&_th\]\:border-gray-300 th{border-color:var(--color-gray-300)}.\[\&_th\]\:bg-gray-100 th{background-color:var(--color-gray-100)}.\[\&_th\]\:px-4 th{padding-inline:calc(var(--spacing)*4)}.\[\&_th\]\:py-2 th{padding-block:calc(var(--spacing)*2)}.\[\&_th\]\:text-left th{text-align:left}.dark .dark\:\[\&_th\]\:border-gray-600 th{border-color:var(--color-gray-600)}.dark .dark\:\[\&_th\]\:bg-gray-800 th{background-color:var(--color-gray-800)}.\[\&_tr\:hover\]\:bg-gray-50 tr:hover{background-color:var(--color-gray-50)}.dark .dark\:\[\&_tr\:hover\]\:bg-gray-700\/50 tr:hover{background-color:#36415380}@supports (color:color-mix(in lab,red,red)){.dark .dark\:\[\&_tr\:hover\]\:bg-gray-700\/50 tr:hover{background-color:color-mix(in oklab,var(--color-gray-700)50%,transparent)}}.\[\&\:\:-webkit-inner-spin-button\]\:appearance-none::-webkit-inner-spin-button{appearance:none}.\[\&\:\:-webkit-outer-spin-button\]\:appearance-none::-webkit-outer-spin-button{appearance:none}.sr-only{clip:rect(0,0,0,0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none}.scrollbar-hide::-webkit-scrollbar{display:none}.line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}}@property --tw-border-spacing-x{syntax:"";inherits:false;initial-value:0}@property --tw-border-spacing-y{syntax:"";inherits:false;initial-value:0}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-pan-x{syntax:"*";inherits:false}@property --tw-pan-y{syntax:"*";inherits:false}@property --tw-pinch-zoom{syntax:"*";inherits:false}@property --tw-scroll-snap-strictness{syntax:"*";inherits:false;initial-value:proximity}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}}.yarl__fullsize{height:100%;width:100%}.yarl__relative{position:relative}.yarl__portal{inset:0;opacity:0;overflow:hidden;position:fixed;transition:opacity var(--yarl__fade_animation_duration,.25s) var(--yarl__fade_animation_timing_function,ease);z-index:var(--yarl__portal_zindex,9999)}.yarl__portal_open{opacity:1}.yarl__container{background-color:var(--yarl__container_background_color,var(--yarl__color_backdrop,#000));inset:0;outline:none;overflow:hidden;overscroll-behavior:var(--yarl__controller_overscroll_behavior,contain);position:absolute;touch-action:var(--yarl__controller_touch_action,none);-webkit-user-select:none;-moz-user-select:none;user-select:none}.yarl__carousel{align-content:center;align-items:stretch;display:flex;flex:0 0 auto;height:100%;justify-content:center;opacity:var(--yarl__pull_opacity,1);transform:translate(var(--yarl__swipe_offset,0),var(--yarl__pull_offset,0));width:calc(100% + (var(--yarl__carousel_slides_count) - 1)*(100% + var(--yarl__carousel_spacing_px, 0)*1px + var(--yarl__carousel_spacing_percent, 0)*1%))}.yarl__carousel_with_slides{-moz-column-gap:calc(var(--yarl__carousel_spacing_px, 0)*1px + 100/(var(--yarl__carousel_slides_count)*100 + (var(--yarl__carousel_slides_count) - 1)*var(--yarl__carousel_spacing_percent, 0))*var(--yarl__carousel_spacing_percent, 0)*1%);column-gap:calc(var(--yarl__carousel_spacing_px, 0)*1px + 100/(var(--yarl__carousel_slides_count)*100 + (var(--yarl__carousel_slides_count) - 1)*var(--yarl__carousel_spacing_percent, 0))*var(--yarl__carousel_spacing_percent, 0)*1%)}.yarl__flex_center{align-content:center;align-items:center;display:flex;justify-content:center}.yarl__slide{flex:1;overflow:hidden;padding:calc(var(--yarl__carousel_padding_px, 0)*1px + 100/(var(--yarl__carousel_slides_count)*100 + (var(--yarl__carousel_slides_count) - 1)*var(--yarl__carousel_spacing_percent, 0))*var(--yarl__carousel_padding_percent, 0)*1%);position:relative}[dir=rtl] .yarl__slide{--yarl__direction:-1}.yarl__slide_image{max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain;touch-action:var(--yarl__controller_touch_action,none);-moz-user-select:none;user-select:none;-webkit-user-select:none;-webkit-touch-callout:none}.yarl__slide_image_cover{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.yarl__slide_image_loading{opacity:0}@media screen and (min-width:800px){.yarl__slide_wrapper:not(.yarl__slide_wrapper_interactive) .yarl__slide_image{-webkit-backface-visibility:hidden;-webkit-transform:translateZ(0);-webkit-transform-style:preserve-3d}}.yarl__slide_placeholder{left:50%;line-height:0;position:absolute;top:50%;transform:translate(-50%) translateY(-50%)}.yarl__slide_loading{animation:yarl__delayed_fadein 1s linear;color:var(--yarl__slide_icon_loading_color,var(--yarl__color_button,hsla(0,0%,100%,.8)))}.yarl__slide_loading line{animation:yarl__stroke_opacity 1s linear infinite}.yarl__slide_loading line:first-of-type{animation-delay:-1.875s}.yarl__slide_loading line:nth-of-type(2){animation-delay:-1.75s}.yarl__slide_loading line:nth-of-type(3){animation-delay:-1.625s}.yarl__slide_loading line:nth-of-type(4){animation-delay:-1.5s}.yarl__slide_loading line:nth-of-type(5){animation-delay:-1.375s}.yarl__slide_loading line:nth-of-type(6){animation-delay:-1.25s}.yarl__slide_loading line:nth-of-type(7){animation-delay:-1.125s}.yarl__slide_loading line:nth-of-type(8){animation-delay:-1s}.yarl__slide_error{color:var(--yarl__slide_icon_error_color,red);height:var(--yarl__slide_icon_error_size,48px);width:var(--yarl__slide_icon_error_size,48px)}@media(prefers-reduced-motion){.yarl__portal,.yarl__slide{transition:unset}.yarl__slide_loading,.yarl__slide_loading line{animation:unset}}.yarl__toolbar{display:flex;justify-content:flex-end;inset:0 0 auto auto;padding:var(--yarl__toolbar_padding,8px);position:absolute}[dir=rtl] .yarl__toolbar{inset:0 auto auto 0}.yarl__icon{height:var(--yarl__icon_size,32px);width:var(--yarl__icon_size,32px)}.yarl__button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--yarl__button_background_color,transparent);border:var(--yarl__button_border,0);color:var(--yarl__color_button,hsla(0,0%,100%,.8));cursor:pointer;filter:var(--yarl__button_filter,drop-shadow(2px 2px 2px rgba(0,0,0,.8)));line-height:0;margin:var(--yarl__button_margin,0);outline:none;padding:var(--yarl__button_padding,8px);-webkit-tap-highlight-color:transparent}.yarl__button:focus{color:var(--yarl__color_button_active,#fff)}.yarl__button:focus:not(:focus-visible){color:var(--yarl__color_button,hsla(0,0%,100%,.8))}.yarl__button:focus-visible{color:var(--yarl__color_button_active,#fff)}@media(hover:hover){.yarl__button:focus-visible:hover,.yarl__button:focus:hover,.yarl__button:hover{color:var(--yarl__color_button_active,#fff)}}.yarl__button:disabled{color:var(--yarl__color_button_disabled,hsla(0,0%,100%,.4));cursor:default}.yarl__navigation_next,.yarl__navigation_prev{padding:var(--yarl__navigation_button_padding,24px 16px);position:absolute;top:50%;transform:translateY(-50%)}.yarl__navigation_prev{left:0}[dir=rtl] .yarl__navigation_prev{left:unset;right:0;transform:translateY(-50%) rotate(180deg)}.yarl__navigation_next{right:0}[dir=rtl] .yarl__navigation_next{left:0;right:unset;transform:translateY(-50%) rotate(180deg)}.yarl__no_scroll{height:100%;overflow:hidden;overscroll-behavior:none}@keyframes yarl__delayed_fadein{0%{opacity:0}80%{opacity:0}to{opacity:1}}@keyframes yarl__stroke_opacity{0%{stroke-opacity:1}to{stroke-opacity:.125}}.yarl__counter{bottom:var(--yarl__counter_bottom,unset);color:var(--yarl__counter_color,var(--yarl__color_button,hsla(0,0%,100%,.8)));filter:var(--yarl__counter_filter,drop-shadow(2px 2px 2px rgba(0,0,0,.8)));left:var(--yarl__counter_left,0);line-height:var(--yarl__counter_line_height,var(--yarl__icon_size,32px));margin:var(--yarl__counter_margin,var(--yarl__toolbar_padding,8px));padding:var(--yarl__counter_padding,var(--yarl__button_padding,8px));position:var(--yarl__counter_position,absolute);right:var(--yarl__counter_right,unset);top:var(--yarl__counter_top,0);-webkit-user-select:var(--yarl__counter_user_select,none);-moz-user-select:var(--yarl__counter_user_select,none);user-select:var(--yarl__counter_user_select,none)}.yarl__thumbnails{display:flex;height:100%}.yarl__thumbnails_bottom,.yarl__thumbnails_end .yarl__thumbnails_track,.yarl__thumbnails_start .yarl__thumbnails_track,.yarl__thumbnails_top{flex-direction:column}.yarl__thumbnails_wrapper{flex:1;position:relative}.yarl__thumbnails_container{background-color:var(--yarl__thumbnails_container_background_color,var(--yarl__color_backdrop,#000));flex:0 0 auto;overflow:hidden;padding:var(--yarl__thumbnails_container_padding,16px);position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-touch-callout:none}.yarl__thumbnails_vignette{pointer-events:none;position:absolute;--yarl__thumbnails_vignette_size:12%}@media(min-width:1200px){.yarl__thumbnails_vignette{--yarl__thumbnails_vignette_size:8%}}@media(min-width:2000px){.yarl__thumbnails_vignette{--yarl__thumbnails_vignette_size:5%}}.yarl__thumbnails_bottom .yarl__thumbnails_vignette,.yarl__thumbnails_top .yarl__thumbnails_vignette{background:linear-gradient(to right,var(--yarl__color_backdrop,#000) 0,transparent var(--yarl__thumbnails_vignette_size,12%) calc(100% - var(--yarl__thumbnails_vignette_size, 12%)),var(--yarl__color_backdrop,#000) 100%);height:100%;left:0;right:0}.yarl__thumbnails_end .yarl__thumbnails_vignette,.yarl__thumbnails_start .yarl__thumbnails_vignette{background:linear-gradient(to bottom,var(--yarl__color_backdrop,#000) 0,transparent var(--yarl__thumbnails_vignette_size,12%) calc(100% - var(--yarl__thumbnails_vignette_size, 12%)),var(--yarl__color_backdrop,#000) 100%);bottom:0;top:0;width:100%}.yarl__thumbnails_track{gap:var(--yarl__thumbnails_thumbnail_gap,16px);outline:none}.yarl__thumbnails_thumbnail{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:var(--yarl__thumbnails_thumbnail_background,#000);border-color:var(--yarl__thumbnails_thumbnail_border_color,var(--yarl__color_button,hsla(0,0%,100%,.8)));border-radius:var(--yarl__thumbnails_thumbnail_border_radius,4px);border-style:var(--yarl__thumbnails_thumbnail_border_style,solid);border-width:var(--yarl__thumbnails_thumbnail_border,1px);cursor:pointer;flex:0 0 auto;-webkit-tap-highlight-color:transparent;box-sizing:content-box;height:var(--yarl__thumbnails_thumbnail_height,80px);outline:none;overflow:hidden;padding:var(--yarl__thumbnails_thumbnail_padding,4px);position:relative;width:var(--yarl__thumbnails_thumbnail_width,120px)}.yarl__thumbnails_thumbnail_active{border-color:var(--yarl__thumbnails_thumbnail_active_border_color,var(--yarl__color_button_active,#fff))}.yarl__thumbnails_thumbnail_fadein{animation:yarl__thumbnails_thumbnail_fadein var(--yarl__thumbnails_thumbnail_fadein_duration,.5s) ease-in-out var(--yarl__thumbnails_thumbnail_fadein_delay,0s) forwards;opacity:0}.yarl__thumbnails_thumbnail_fadeout{animation:yarl__thumbnails_thumbnail_fadeout var(--yarl__thumbnails_thumbnail_fadeout_duration,.5s) ease-in-out var(--yarl__thumbnails_thumbnail_fadeout_delay,0s) forwards;cursor:unset}.yarl__thumbnails_thumbnail_placeholder{cursor:unset;visibility:hidden}.yarl__thumbnails_thumbnail:focus{box-shadow:var(--yarl__thumbnails_thumbnail_focus_box_shadow,#000 0 0 0 2px,var(--yarl__color_button,hsla(0,0%,100%,.8)) 0 0 0 4px)}.yarl__thumbnails_thumbnail:focus:not(:focus-visible){box-shadow:unset}.yarl__thumbnails_thumbnail:focus-visible{box-shadow:var(--yarl__thumbnails_thumbnail_focus_box_shadow,#000 0 0 0 2px,var(--yarl__color_button,hsla(0,0%,100%,.8)) 0 0 0 4px)}.yarl__thumbnails_thumbnail_icon{color:var(--yarl__thumbnails_thumbnail_icon_color,var(--yarl__color_button,hsla(0,0%,100%,.8)));filter:var(--yarl__thumbnails_thumbnail_icon_filter,drop-shadow(2px 2px 2px rgba(0,0,0,.8)));height:var(--yarl__thumbnails_thumbnail_icon_size,32px);left:50%;position:absolute;top:50%;transform:translate(-50%) translateY(-50%);width:var(--yarl__thumbnails_thumbnail_icon_size,32px)}@keyframes yarl__thumbnails_thumbnail_fadein{0%{opacity:0}to{opacity:1}}@keyframes yarl__thumbnails_thumbnail_fadeout{0%{opacity:1}to{opacity:0}} +@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-pan-x:initial;--tw-pan-y:initial;--tw-pinch-zoom:initial;--tw-scroll-snap-strictness:proximity;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-x-reverse:0;--tw-border-style:solid;--tw-divide-y-reverse:0;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--tw-content:""}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-100:oklch(93.6% .032 17.717);--color-red-200:oklch(88.5% .062 18.334);--color-red-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-red-700:oklch(50.5% .213 27.518);--color-red-800:oklch(44.4% .177 26.899);--color-red-900:oklch(39.6% .141 25.723);--color-red-950:oklch(25.8% .092 26.042);--color-orange-50:oklch(98% .016 73.684);--color-orange-100:oklch(95.4% .038 75.164);--color-orange-200:oklch(90.1% .076 70.697);--color-orange-300:oklch(83.7% .128 66.29);--color-orange-400:oklch(75% .183 55.934);--color-orange-500:oklch(70.5% .213 47.604);--color-orange-600:oklch(64.6% .222 41.116);--color-orange-700:oklch(55.3% .195 38.402);--color-orange-800:oklch(47% .157 37.304);--color-orange-900:oklch(40.8% .123 38.172);--color-orange-950:oklch(26.6% .079 36.259);--color-amber-50:oklch(98.7% .022 95.277);--color-amber-100:oklch(96.2% .059 95.617);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-900:oklch(41.4% .112 45.904);--color-amber-950:oklch(27.9% .077 45.635);--color-yellow-50:oklch(98.7% .026 102.212);--color-yellow-100:oklch(97.3% .071 103.193);--color-yellow-200:oklch(94.5% .129 101.54);--color-yellow-300:oklch(90.5% .182 98.111);--color-yellow-400:oklch(85.2% .199 91.936);--color-yellow-500:oklch(79.5% .184 86.047);--color-yellow-600:oklch(68.1% .162 75.834);--color-yellow-700:oklch(55.4% .135 66.442);--color-yellow-800:oklch(47.6% .114 61.907);--color-yellow-900:oklch(42.1% .095 57.708);--color-yellow-950:oklch(28.6% .066 53.813);--color-lime-50:oklch(98.6% .031 120.757);--color-lime-100:oklch(96.7% .067 122.328);--color-lime-200:oklch(93.8% .127 124.321);--color-lime-300:oklch(89.7% .196 126.665);--color-lime-400:oklch(84.1% .238 128.85);--color-lime-500:oklch(76.8% .233 130.85);--color-lime-600:oklch(64.8% .2 131.684);--color-lime-700:oklch(53.2% .157 131.589);--color-lime-800:oklch(45.3% .124 130.933);--color-lime-900:oklch(40.5% .101 131.063);--color-lime-950:oklch(27.4% .072 132.109);--color-green-50:oklch(98.2% .018 155.826);--color-green-100:oklch(96.2% .044 156.743);--color-green-200:oklch(92.5% .084 155.995);--color-green-300:oklch(87.1% .15 154.449);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-800:oklch(44.8% .119 151.328);--color-green-900:oklch(39.3% .095 152.535);--color-green-950:oklch(26.6% .065 152.934);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-100:oklch(95% .052 163.051);--color-emerald-200:oklch(90.5% .093 164.15);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-600:oklch(59.6% .145 163.225);--color-emerald-700:oklch(50.8% .118 165.612);--color-emerald-800:oklch(43.2% .095 166.913);--color-emerald-900:oklch(37.8% .077 168.94);--color-emerald-950:oklch(26.2% .051 172.552);--color-teal-50:oklch(98.4% .014 180.72);--color-teal-100:oklch(95.3% .051 180.801);--color-teal-200:oklch(91% .096 180.426);--color-teal-300:oklch(85.5% .138 181.071);--color-teal-400:oklch(77.7% .152 181.912);--color-teal-500:oklch(70.4% .14 182.503);--color-teal-600:oklch(60% .118 184.704);--color-teal-700:oklch(51.1% .096 186.391);--color-teal-800:oklch(43.7% .078 188.216);--color-teal-900:oklch(38.6% .063 188.416);--color-teal-950:oklch(27.7% .046 192.524);--color-cyan-50:oklch(98.4% .019 200.873);--color-cyan-100:oklch(95.6% .045 203.388);--color-cyan-200:oklch(91.7% .08 205.041);--color-cyan-300:oklch(86.5% .127 207.078);--color-cyan-400:oklch(78.9% .154 211.53);--color-cyan-500:oklch(71.5% .143 215.221);--color-cyan-600:oklch(60.9% .126 221.723);--color-cyan-700:oklch(52% .105 223.128);--color-cyan-800:oklch(45% .085 224.283);--color-cyan-900:oklch(39.8% .07 227.392);--color-cyan-950:oklch(30.2% .056 229.695);--color-sky-50:oklch(97.7% .013 236.62);--color-sky-100:oklch(95.1% .026 236.824);--color-sky-200:oklch(90.1% .058 230.902);--color-sky-300:oklch(82.8% .111 230.318);--color-sky-400:oklch(74.6% .16 232.661);--color-sky-500:oklch(68.5% .169 237.323);--color-sky-600:oklch(58.8% .158 241.966);--color-sky-700:oklch(50% .134 242.749);--color-sky-800:oklch(44.3% .11 240.79);--color-sky-900:oklch(39.1% .09 240.876);--color-sky-950:oklch(29.3% .066 243.157);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-blue-950:oklch(28.2% .091 267.935);--color-indigo-50:oklch(96.2% .018 272.314);--color-indigo-100:oklch(93% .034 272.788);--color-indigo-200:oklch(87% .065 274.039);--color-indigo-300:oklch(78.5% .115 274.713);--color-indigo-400:oklch(67.3% .182 276.935);--color-indigo-500:oklch(58.5% .233 277.117);--color-indigo-600:oklch(51.1% .262 276.966);--color-indigo-700:oklch(45.7% .24 277.023);--color-indigo-800:oklch(39.8% .195 277.366);--color-indigo-900:oklch(35.9% .144 278.697);--color-indigo-950:oklch(25.7% .09 281.288);--color-violet-50:oklch(96.9% .016 293.756);--color-violet-100:oklch(94.3% .029 294.588);--color-violet-200:oklch(89.4% .057 293.283);--color-violet-300:oklch(81.1% .111 293.571);--color-violet-400:oklch(70.2% .183 293.541);--color-violet-500:oklch(60.6% .25 292.717);--color-violet-600:oklch(54.1% .281 293.009);--color-violet-700:oklch(49.1% .27 292.581);--color-violet-800:oklch(43.2% .232 292.759);--color-violet-900:oklch(38% .189 293.745);--color-violet-950:oklch(28.3% .141 291.089);--color-purple-50:oklch(97.7% .014 308.299);--color-purple-100:oklch(94.6% .033 307.174);--color-purple-200:oklch(90.2% .063 306.703);--color-purple-300:oklch(82.7% .119 306.383);--color-purple-400:oklch(71.4% .203 305.504);--color-purple-500:oklch(62.7% .265 303.9);--color-purple-600:oklch(55.8% .288 302.321);--color-purple-700:oklch(49.6% .265 301.924);--color-purple-800:oklch(43.8% .218 303.724);--color-purple-900:oklch(38.1% .176 304.987);--color-purple-950:oklch(29.1% .149 302.717);--color-fuchsia-50:oklch(97.7% .017 320.058);--color-fuchsia-100:oklch(95.2% .037 318.852);--color-fuchsia-200:oklch(90.3% .076 319.62);--color-fuchsia-300:oklch(83.3% .145 321.434);--color-fuchsia-400:oklch(74% .238 322.16);--color-fuchsia-500:oklch(66.7% .295 322.15);--color-fuchsia-600:oklch(59.1% .293 322.896);--color-fuchsia-700:oklch(51.8% .253 323.949);--color-fuchsia-800:oklch(45.2% .211 324.591);--color-fuchsia-900:oklch(40.1% .17 325.612);--color-fuchsia-950:oklch(29.3% .136 325.661);--color-pink-50:oklch(97.1% .014 343.198);--color-pink-100:oklch(94.8% .028 342.258);--color-pink-200:oklch(89.9% .061 343.231);--color-pink-300:oklch(82.3% .12 346.018);--color-pink-400:oklch(71.8% .202 349.761);--color-pink-500:oklch(65.6% .241 354.308);--color-pink-600:oklch(59.2% .249 .584);--color-pink-700:oklch(52.5% .223 3.958);--color-pink-800:oklch(45.9% .187 3.815);--color-pink-900:oklch(40.8% .153 2.432);--color-pink-950:oklch(28.4% .109 3.907);--color-rose-50:oklch(96.9% .015 12.422);--color-rose-100:oklch(94.1% .03 12.58);--color-rose-200:oklch(89.2% .058 10.001);--color-rose-300:oklch(81% .117 11.638);--color-rose-400:oklch(71.2% .194 13.428);--color-rose-500:oklch(64.5% .246 16.439);--color-rose-600:oklch(58.6% .253 17.585);--color-rose-700:oklch(51.4% .222 16.935);--color-rose-800:oklch(45.5% .188 13.697);--color-rose-900:oklch(41% .159 10.272);--color-rose-950:oklch(27.1% .105 12.094);--color-slate-50:oklch(98.4% .003 247.858);--color-slate-100:oklch(96.8% .007 247.896);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-600:oklch(44.6% .043 257.281);--color-slate-700:oklch(37.2% .044 257.287);--color-slate-800:oklch(27.9% .041 260.031);--color-slate-900:oklch(20.8% .042 265.755);--color-slate-950:oklch(12.9% .042 264.695);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-gray-950:oklch(13% .028 261.692);--color-zinc-50:oklch(98.5% 0 0);--color-zinc-100:oklch(96.7% .001 286.375);--color-zinc-200:oklch(92% .004 286.32);--color-zinc-300:oklch(87.1% .006 286.286);--color-zinc-400:oklch(70.5% .015 286.067);--color-zinc-500:oklch(55.2% .016 285.938);--color-zinc-600:oklch(44.2% .017 285.786);--color-zinc-700:oklch(37% .013 285.805);--color-zinc-800:oklch(27.4% .006 286.033);--color-zinc-900:oklch(21% .006 285.885);--color-zinc-950:oklch(14.1% .005 285.823);--color-neutral-50:oklch(98.5% 0 0);--color-neutral-100:oklch(97% 0 0);--color-neutral-200:oklch(92.2% 0 0);--color-neutral-300:oklch(87% 0 0);--color-neutral-400:oklch(70.8% 0 0);--color-neutral-500:oklch(55.6% 0 0);--color-neutral-600:oklch(43.9% 0 0);--color-neutral-700:oklch(37.1% 0 0);--color-neutral-800:oklch(26.9% 0 0);--color-neutral-900:oklch(20.5% 0 0);--color-neutral-950:oklch(14.5% 0 0);--color-stone-50:oklch(98.5% .001 106.423);--color-stone-100:oklch(97% .001 106.424);--color-stone-200:oklch(92.3% .003 48.717);--color-stone-300:oklch(86.9% .005 56.366);--color-stone-400:oklch(70.9% .01 56.259);--color-stone-500:oklch(55.3% .013 58.071);--color-stone-600:oklch(44.4% .011 73.639);--color-stone-700:oklch(37.4% .01 67.558);--color-stone-800:oklch(26.8% .007 34.298);--color-stone-900:oklch(21.6% .006 56.043);--color-stone-950:oklch(14.7% .004 49.25);--color-black:#000;--color-white:#fff;--spacing:.25rem;--breakpoint-sm:40rem;--breakpoint-md:48rem;--breakpoint-lg:64rem;--breakpoint-xl:80rem;--breakpoint-2xl:96rem;--container-3xs:16rem;--container-2xs:18rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--container-lg:32rem;--container-xl:36rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--container-5xl:64rem;--container-6xl:72rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5/2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--text-7xl:4.5rem;--text-7xl--line-height:1;--text-8xl:6rem;--text-8xl--line-height:1;--text-9xl:8rem;--text-9xl--line-height:1;--font-weight-thin:100;--font-weight-extralight:200;--font-weight-light:300;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--font-weight-black:900;--tracking-tighter:-.05em;--tracking-tight:-.025em;--tracking-normal:0em;--tracking-wide:.025em;--tracking-wider:.05em;--tracking-widest:.1em;--leading-tight:1.25;--leading-snug:1.375;--leading-normal:1.5;--leading-relaxed:1.625;--leading-loose:2;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--radius-3xl:1.5rem;--drop-shadow-sm:0 1px 2px #00000026;--drop-shadow-md:0 3px 3px #0000001f;--drop-shadow-lg:0 4px 4px #00000026;--drop-shadow-xl:0 9px 7px #0000001a;--drop-shadow-2xl:0 25px 25px #00000026;--ease-in:cubic-bezier(.4,0,1,1);--ease-out:cubic-bezier(0,0,.2,1);--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-spin:spin 1s linear infinite;--animate-ping:ping 1s cubic-bezier(0,0,.2,1)infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--animate-bounce:bounce 1s infinite;--blur-sm:8px;--blur-md:12px;--blur-lg:16px;--blur-xl:24px;--blur-2xl:40px;--blur-3xl:64px;--aspect-video:16/9;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-primary-50:#eff6ff;--color-primary-100:#dbeafe;--color-primary-400:#60a5fa;--color-primary-500:#3b82f6;--color-primary-600:#2563eb;--color-primary-700:#1d4ed8;--color-primary-900:#1e3a8a}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}:root{--background:255 255 255;--foreground:17 24 39}.dark{--background:17 24 39;--foreground:255 255 255}html{scroll-behavior:smooth}body{background-color:var(--color-white);color:var(--color-gray-900)}.dark :is(body){background-color:var(--color-gray-900);color:var(--color-white)}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif}a{color:var(--color-blue-600)}@media(hover:hover){a:hover{color:var(--color-blue-700)}}.dark :is(a){color:var(--color-blue-400)}@media(hover:hover){.dark :is(a):hover{color:var(--color-blue-300)}}a{text-decoration:none}:focus-visible{outline-style:var(--tw-outline-style);outline-offset:2px;outline-width:2px;outline-color:var(--color-blue-500)}}@layer components{.flex-between{justify-content:space-between;align-items:center;display:flex}.btn{border-radius:var(--radius-lg);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));justify-content:center;align-items:center;display:inline-flex}.btn:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color);--tw-outline-style:none;outline-style:none}.btn:disabled{cursor:not-allowed;opacity:.5}.btn-primary{background-color:var(--color-blue-600);color:var(--color-white)}@media(hover:hover){.btn-primary:hover{background-color:var(--color-blue-700)}}.btn-primary:focus{--tw-ring-color:var(--color-blue-500)}.dark .btn-primary{background-color:var(--color-blue-500)}@media(hover:hover){.dark .btn-primary:hover{background-color:var(--color-blue-600)}}.dark .btn-primary:focus{--tw-ring-color:var(--color-blue-400)}.btn-secondary{background-color:var(--color-gray-100);color:var(--color-gray-900)}@media(hover:hover){.btn-secondary:hover{background-color:var(--color-gray-200)}}.btn-secondary:focus{--tw-ring-color:var(--color-gray-500)}.dark .btn-secondary{background-color:var(--color-gray-700);color:var(--color-white)}@media(hover:hover){.dark .btn-secondary:hover{background-color:var(--color-gray-600)}}.dark .btn-secondary:focus{--tw-ring-color:var(--color-gray-400)}.btn-ghost{color:var(--color-gray-700);background-color:#0000}@media(hover:hover){.btn-ghost:hover{background-color:var(--color-gray-100)}}.btn-ghost:focus{--tw-ring-color:var(--color-gray-500)}.dark .btn-ghost{color:var(--color-gray-300)}@media(hover:hover){.dark .btn-ghost:hover{background-color:var(--color-gray-800)}}.dark .btn-ghost:focus{--tw-ring-color:var(--color-gray-400)}.btn-danger{background-color:var(--color-red-600);color:var(--color-white)}@media(hover:hover){.btn-danger:hover{background-color:var(--color-red-700)}}.btn-danger:focus{--tw-ring-color:var(--color-red-500)}.dark .btn-danger{background-color:var(--color-red-500)}@media(hover:hover){.dark .btn-danger:hover{background-color:var(--color-red-600)}}.dark .btn-danger:focus{--tw-ring-color:var(--color-red-400)}.input{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-gray-300);width:100%;padding-inline:calc(var(--spacing)*4);padding-block:calc(var(--spacing)*2);background-color:var(--color-white);color:var(--color-gray-900)}.input:focus{border-color:var(--color-blue-500);--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:var(--color-blue-500)}.dark .input{border-color:var(--color-gray-600);background-color:var(--color-gray-800);color:var(--color-white)}.input::placeholder{color:var(--color-gray-400)}.dark .input::placeholder{color:var(--color-gray-500)}.input-error{border-color:var(--color-red-500)}.input-error:focus{border-color:var(--color-red-500);--tw-ring-color:var(--color-red-500)}.card{border-radius:var(--radius-lg);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-gray-200);background-color:var(--color-white);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.dark .card{border-color:var(--color-gray-700);background-color:var(--color-gray-800)}.badge{padding-inline:calc(var(--spacing)*2.5);padding-block:calc(var(--spacing)*.5);font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);border-radius:3.40282e38px;align-items:center;display:inline-flex}.badge-primary{background-color:var(--color-blue-100);color:var(--color-blue-800)}.dark .badge-primary{background-color:var(--color-blue-900);color:var(--color-blue-200)}.badge-success{background-color:var(--color-green-100);color:var(--color-green-800)}.dark .badge-success{background-color:var(--color-green-900);color:var(--color-green-200)}.badge-warning{background-color:var(--color-yellow-100);color:var(--color-yellow-800)}.dark .badge-warning{background-color:var(--color-yellow-900);color:var(--color-yellow-200)}.badge-danger{background-color:var(--color-red-100);color:var(--color-red-800)}.dark .badge-danger{background-color:var(--color-red-900);color:var(--color-red-200)}}@layer utilities{.\@container{container-type:inline-size}.pointer-events-auto{pointer-events:auto}.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{inset:calc(var(--spacing)*0)}.inset-1{inset:calc(var(--spacing)*1)}.inset-2{inset:calc(var(--spacing)*2)}.inset-3{inset:calc(var(--spacing)*3)}.inset-4{inset:calc(var(--spacing)*4)}.inset-5{inset:calc(var(--spacing)*5)}.inset-6{inset:calc(var(--spacing)*6)}.inset-8{inset:calc(var(--spacing)*8)}.inset-auto{inset:auto}.inset-x-0{inset-inline:calc(var(--spacing)*0)}.inset-x-1{inset-inline:calc(var(--spacing)*1)}.inset-x-2{inset-inline:calc(var(--spacing)*2)}.inset-x-3{inset-inline:calc(var(--spacing)*3)}.inset-x-4{inset-inline:calc(var(--spacing)*4)}.inset-x-auto{inset-inline:auto}.inset-y-0{inset-block:calc(var(--spacing)*0)}.inset-y-1{inset-block:calc(var(--spacing)*1)}.inset-y-2{inset-block:calc(var(--spacing)*2)}.inset-y-3{inset-block:calc(var(--spacing)*3)}.inset-y-4{inset-block:calc(var(--spacing)*4)}.inset-y-auto{inset-block:auto}.-top-1{top:calc(var(--spacing)*-1)}.-top-2{top:calc(var(--spacing)*-2)}.-top-3{top:calc(var(--spacing)*-3)}.-top-4{top:calc(var(--spacing)*-4)}.top-0{top:calc(var(--spacing)*0)}.top-1{top:calc(var(--spacing)*1)}.top-1\.5{top:calc(var(--spacing)*1.5)}.top-1\/2{top:50%}.top-1\/3{top:33.3333%}.top-1\/4{top:25%}.top-2{top:calc(var(--spacing)*2)}.top-2\/3{top:66.6667%}.top-3{top:calc(var(--spacing)*3)}.top-3\/4{top:75%}.top-4{top:calc(var(--spacing)*4)}.top-5{top:calc(var(--spacing)*5)}.top-6{top:calc(var(--spacing)*6)}.top-8{top:calc(var(--spacing)*8)}.top-10{top:calc(var(--spacing)*10)}.top-12{top:calc(var(--spacing)*12)}.top-16{top:calc(var(--spacing)*16)}.top-24{top:calc(var(--spacing)*24)}.top-auto{top:auto}.top-full{top:100%}.-right-1{right:calc(var(--spacing)*-1)}.-right-2{right:calc(var(--spacing)*-2)}.-right-3{right:calc(var(--spacing)*-3)}.-right-4{right:calc(var(--spacing)*-4)}.right-0{right:calc(var(--spacing)*0)}.right-1{right:calc(var(--spacing)*1)}.right-1\/2{right:50%}.right-2{right:calc(var(--spacing)*2)}.right-3{right:calc(var(--spacing)*3)}.right-4{right:calc(var(--spacing)*4)}.right-5{right:calc(var(--spacing)*5)}.right-6{right:calc(var(--spacing)*6)}.right-8{right:calc(var(--spacing)*8)}.right-10{right:calc(var(--spacing)*10)}.right-12{right:calc(var(--spacing)*12)}.right-16{right:calc(var(--spacing)*16)}.right-auto{right:auto}.right-full{right:100%}.-bottom-1{bottom:calc(var(--spacing)*-1)}.-bottom-2{bottom:calc(var(--spacing)*-2)}.-bottom-3{bottom:calc(var(--spacing)*-3)}.-bottom-4{bottom:calc(var(--spacing)*-4)}.bottom-0{bottom:calc(var(--spacing)*0)}.bottom-1{bottom:calc(var(--spacing)*1)}.bottom-1\/2{bottom:50%}.bottom-2{bottom:calc(var(--spacing)*2)}.bottom-3{bottom:calc(var(--spacing)*3)}.bottom-4{bottom:calc(var(--spacing)*4)}.bottom-5{bottom:calc(var(--spacing)*5)}.bottom-6{bottom:calc(var(--spacing)*6)}.bottom-8{bottom:calc(var(--spacing)*8)}.bottom-10{bottom:calc(var(--spacing)*10)}.bottom-12{bottom:calc(var(--spacing)*12)}.bottom-16{bottom:calc(var(--spacing)*16)}.bottom-auto{bottom:auto}.bottom-full{bottom:100%}.-left-1{left:calc(var(--spacing)*-1)}.-left-2{left:calc(var(--spacing)*-2)}.-left-3{left:calc(var(--spacing)*-3)}.-left-4{left:calc(var(--spacing)*-4)}.left-0{left:calc(var(--spacing)*0)}.left-1{left:calc(var(--spacing)*1)}.left-1\.5{left:calc(var(--spacing)*1.5)}.left-1\/2{left:50%}.left-2{left:calc(var(--spacing)*2)}.left-3{left:calc(var(--spacing)*3)}.left-4{left:calc(var(--spacing)*4)}.left-5{left:calc(var(--spacing)*5)}.left-6{left:calc(var(--spacing)*6)}.left-8{left:calc(var(--spacing)*8)}.left-10{left:calc(var(--spacing)*10)}.left-12{left:calc(var(--spacing)*12)}.left-16{left:calc(var(--spacing)*16)}.left-auto{left:auto}.left-full{left:100%}.isolate{isolation:isolate}.isolation-auto{isolation:auto}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[9999\]{z-index:9999}.z-auto{z-index:auto}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-first{order:-9999}.order-last{order:9999}.order-none{order:0}.col-span-1{grid-column:span 1/span 1}.col-span-2{grid-column:span 2/span 2}.col-span-3{grid-column:span 3/span 3}.col-span-4{grid-column:span 4/span 4}.col-span-5{grid-column:span 5/span 5}.col-span-6{grid-column:span 6/span 6}.col-span-7{grid-column:span 7/span 7}.col-span-8{grid-column:span 8/span 8}.col-span-9{grid-column:span 9/span 9}.col-span-10{grid-column:span 10/span 10}.col-span-11{grid-column:span 11/span 11}.col-span-12{grid-column:span 12/span 12}.col-span-full{grid-column:1/-1}.col-start-1{grid-column-start:1}.col-start-2{grid-column-start:2}.col-start-3{grid-column-start:3}.col-start-4{grid-column-start:4}.col-start-5{grid-column-start:5}.col-start-6{grid-column-start:6}.col-start-7{grid-column-start:7}.col-start-8{grid-column-start:8}.col-start-9{grid-column-start:9}.col-start-10{grid-column-start:10}.col-start-11{grid-column-start:11}.col-start-12{grid-column-start:12}.col-start-13{grid-column-start:13}.col-end-1{grid-column-end:1}.col-end-2{grid-column-end:2}.col-end-3{grid-column-end:3}.col-end-4{grid-column-end:4}.col-end-5{grid-column-end:5}.col-end-6{grid-column-end:6}.col-end-7{grid-column-end:7}.col-end-8{grid-column-end:8}.col-end-9{grid-column-end:9}.col-end-10{grid-column-end:10}.col-end-11{grid-column-end:11}.col-end-12{grid-column-end:12}.col-end-13{grid-column-end:13}.row-span-1{grid-row:span 1/span 1}.row-span-2{grid-row:span 2/span 2}.row-span-3{grid-row:span 3/span 3}.row-span-4{grid-row:span 4/span 4}.row-span-5{grid-row:span 5/span 5}.row-span-6{grid-row:span 6/span 6}.row-span-full{grid-row:1/-1}.row-start-1{grid-row-start:1}.row-start-2{grid-row-start:2}.row-start-3{grid-row-start:3}.row-start-4{grid-row-start:4}.row-start-5{grid-row-start:5}.row-start-6{grid-row-start:6}.row-start-7{grid-row-start:7}.row-end-1{grid-row-end:1}.row-end-2{grid-row-end:2}.row-end-3{grid-row-end:3}.row-end-4{grid-row-end:4}.row-end-5{grid-row-end:5}.row-end-6{grid-row-end:6}.row-end-7{grid-row-end:7}.float-end{float:inline-end}.float-left{float:left}.float-none{float:none}.float-right{float:right}.float-start{float:inline-start}.clear-both{clear:both}.clear-end{clear:inline-end}.clear-left{clear:left}.clear-none{clear:none}.clear-right{clear:right}.clear-start{clear:inline-start}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.-m-1{margin:calc(var(--spacing)*-1)}.-m-2{margin:calc(var(--spacing)*-2)}.-m-3{margin:calc(var(--spacing)*-3)}.-m-4{margin:calc(var(--spacing)*-4)}.-m-5{margin:calc(var(--spacing)*-5)}.-m-6{margin:calc(var(--spacing)*-6)}.-m-8{margin:calc(var(--spacing)*-8)}.m-0{margin:calc(var(--spacing)*0)}.m-1{margin:calc(var(--spacing)*1)}.m-2{margin:calc(var(--spacing)*2)}.m-3{margin:calc(var(--spacing)*3)}.m-4{margin:calc(var(--spacing)*4)}.m-5{margin:calc(var(--spacing)*5)}.m-6{margin:calc(var(--spacing)*6)}.m-8{margin:calc(var(--spacing)*8)}.m-10{margin:calc(var(--spacing)*10)}.m-12{margin:calc(var(--spacing)*12)}.m-16{margin:calc(var(--spacing)*16)}.m-auto{margin:auto}.-mx-1{margin-inline:calc(var(--spacing)*-1)}.-mx-2{margin-inline:calc(var(--spacing)*-2)}.-mx-3{margin-inline:calc(var(--spacing)*-3)}.-mx-4{margin-inline:calc(var(--spacing)*-4)}.-mx-5{margin-inline:calc(var(--spacing)*-5)}.-mx-6{margin-inline:calc(var(--spacing)*-6)}.-mx-8{margin-inline:calc(var(--spacing)*-8)}.mx-0{margin-inline:calc(var(--spacing)*0)}.mx-1{margin-inline:calc(var(--spacing)*1)}.mx-2{margin-inline:calc(var(--spacing)*2)}.mx-3{margin-inline:calc(var(--spacing)*3)}.mx-4{margin-inline:calc(var(--spacing)*4)}.mx-5{margin-inline:calc(var(--spacing)*5)}.mx-6{margin-inline:calc(var(--spacing)*6)}.mx-8{margin-inline:calc(var(--spacing)*8)}.mx-10{margin-inline:calc(var(--spacing)*10)}.mx-12{margin-inline:calc(var(--spacing)*12)}.mx-16{margin-inline:calc(var(--spacing)*16)}.mx-auto{margin-inline:auto}.-my-1{margin-block:calc(var(--spacing)*-1)}.-my-2{margin-block:calc(var(--spacing)*-2)}.-my-3{margin-block:calc(var(--spacing)*-3)}.-my-4{margin-block:calc(var(--spacing)*-4)}.-my-5{margin-block:calc(var(--spacing)*-5)}.-my-6{margin-block:calc(var(--spacing)*-6)}.-my-8{margin-block:calc(var(--spacing)*-8)}.my-0{margin-block:calc(var(--spacing)*0)}.my-1{margin-block:calc(var(--spacing)*1)}.my-2{margin-block:calc(var(--spacing)*2)}.my-3{margin-block:calc(var(--spacing)*3)}.my-4{margin-block:calc(var(--spacing)*4)}.my-5{margin-block:calc(var(--spacing)*5)}.my-6{margin-block:calc(var(--spacing)*6)}.my-8{margin-block:calc(var(--spacing)*8)}.my-10{margin-block:calc(var(--spacing)*10)}.my-12{margin-block:calc(var(--spacing)*12)}.my-16{margin-block:calc(var(--spacing)*16)}.my-auto{margin-block:auto}.-mt-1{margin-top:calc(var(--spacing)*-1)}.-mt-2{margin-top:calc(var(--spacing)*-2)}.-mt-3{margin-top:calc(var(--spacing)*-3)}.-mt-4{margin-top:calc(var(--spacing)*-4)}.-mt-5{margin-top:calc(var(--spacing)*-5)}.-mt-6{margin-top:calc(var(--spacing)*-6)}.-mt-8{margin-top:calc(var(--spacing)*-8)}.mt-0{margin-top:calc(var(--spacing)*0)}.mt-0\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-1\.5{margin-top:calc(var(--spacing)*1.5)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-3{margin-top:calc(var(--spacing)*3)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-5{margin-top:calc(var(--spacing)*5)}.mt-6{margin-top:calc(var(--spacing)*6)}.mt-8{margin-top:calc(var(--spacing)*8)}.mt-10{margin-top:calc(var(--spacing)*10)}.mt-12{margin-top:calc(var(--spacing)*12)}.mt-16{margin-top:calc(var(--spacing)*16)}.mt-auto{margin-top:auto}.-mr-1{margin-right:calc(var(--spacing)*-1)}.-mr-2{margin-right:calc(var(--spacing)*-2)}.-mr-3{margin-right:calc(var(--spacing)*-3)}.-mr-4{margin-right:calc(var(--spacing)*-4)}.-mr-5{margin-right:calc(var(--spacing)*-5)}.-mr-6{margin-right:calc(var(--spacing)*-6)}.-mr-8{margin-right:calc(var(--spacing)*-8)}.mr-0{margin-right:calc(var(--spacing)*0)}.mr-1{margin-right:calc(var(--spacing)*1)}.mr-1\.5{margin-right:calc(var(--spacing)*1.5)}.mr-2{margin-right:calc(var(--spacing)*2)}.mr-3{margin-right:calc(var(--spacing)*3)}.mr-4{margin-right:calc(var(--spacing)*4)}.mr-5{margin-right:calc(var(--spacing)*5)}.mr-6{margin-right:calc(var(--spacing)*6)}.mr-8{margin-right:calc(var(--spacing)*8)}.mr-10{margin-right:calc(var(--spacing)*10)}.mr-12{margin-right:calc(var(--spacing)*12)}.mr-16{margin-right:calc(var(--spacing)*16)}.mr-auto{margin-right:auto}.-mb-1{margin-bottom:calc(var(--spacing)*-1)}.-mb-2{margin-bottom:calc(var(--spacing)*-2)}.-mb-3{margin-bottom:calc(var(--spacing)*-3)}.-mb-4{margin-bottom:calc(var(--spacing)*-4)}.-mb-5{margin-bottom:calc(var(--spacing)*-5)}.-mb-6{margin-bottom:calc(var(--spacing)*-6)}.-mb-8{margin-bottom:calc(var(--spacing)*-8)}.mb-0{margin-bottom:calc(var(--spacing)*0)}.mb-0\.5{margin-bottom:calc(var(--spacing)*.5)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-1\.5{margin-bottom:calc(var(--spacing)*1.5)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-5{margin-bottom:calc(var(--spacing)*5)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.mb-8{margin-bottom:calc(var(--spacing)*8)}.mb-10{margin-bottom:calc(var(--spacing)*10)}.mb-12{margin-bottom:calc(var(--spacing)*12)}.mb-16{margin-bottom:calc(var(--spacing)*16)}.mb-auto{margin-bottom:auto}.-ml-1{margin-left:calc(var(--spacing)*-1)}.-ml-2{margin-left:calc(var(--spacing)*-2)}.-ml-3{margin-left:calc(var(--spacing)*-3)}.-ml-4{margin-left:calc(var(--spacing)*-4)}.-ml-5{margin-left:calc(var(--spacing)*-5)}.-ml-6{margin-left:calc(var(--spacing)*-6)}.-ml-8{margin-left:calc(var(--spacing)*-8)}.ml-0{margin-left:calc(var(--spacing)*0)}.ml-0\.5{margin-left:calc(var(--spacing)*.5)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-1\.5{margin-left:calc(var(--spacing)*1.5)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-3{margin-left:calc(var(--spacing)*3)}.ml-4{margin-left:calc(var(--spacing)*4)}.ml-5{margin-left:calc(var(--spacing)*5)}.ml-6{margin-left:calc(var(--spacing)*6)}.ml-8{margin-left:calc(var(--spacing)*8)}.ml-10{margin-left:calc(var(--spacing)*10)}.ml-12{margin-left:calc(var(--spacing)*12)}.ml-14{margin-left:calc(var(--spacing)*14)}.ml-16{margin-left:calc(var(--spacing)*16)}.ml-auto{margin-left:auto}.box-border{box-sizing:border-box}.box-content{box-sizing:content-box}.block{display:block}.contents{display:contents}.flex{display:flex}.flow-root{display:flow-root}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.inline-grid{display:inline-grid}.inline-table{display:inline-table}.list-item{display:list-item}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.table-column{display:table-column}.table-column-group{display:table-column-group}.table-footer-group{display:table-footer-group}.table-header-group{display:table-header-group}.table-row{display:table-row}.table-row-group{display:table-row-group}.aspect-\[4\/3\]{aspect-ratio:4/3}.aspect-auto{aspect-ratio:auto}.aspect-square{aspect-ratio:1}.aspect-video{aspect-ratio:var(--aspect-video)}.h-0{height:calc(var(--spacing)*0)}.h-1{height:calc(var(--spacing)*1)}.h-1\/2{height:50%}.h-1\/3{height:33.3333%}.h-1\/4{height:25%}.h-1\/5{height:20%}.h-1\/6{height:16.6667%}.h-2{height:calc(var(--spacing)*2)}.h-2\.5{height:calc(var(--spacing)*2.5)}.h-2\/3{height:66.6667%}.h-2\/4{height:50%}.h-2\/5{height:40%}.h-3{height:calc(var(--spacing)*3)}.h-3\.5{height:calc(var(--spacing)*3.5)}.h-3\/4{height:75%}.h-3\/5{height:60%}.h-4{height:calc(var(--spacing)*4)}.h-4\/5{height:80%}.h-5{height:calc(var(--spacing)*5)}.h-5\/6{height:83.3333%}.h-6{height:calc(var(--spacing)*6)}.h-7{height:calc(var(--spacing)*7)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-10{height:calc(var(--spacing)*10)}.h-12{height:calc(var(--spacing)*12)}.h-14{height:calc(var(--spacing)*14)}.h-16{height:calc(var(--spacing)*16)}.h-20{height:calc(var(--spacing)*20)}.h-24{height:calc(var(--spacing)*24)}.h-32{height:calc(var(--spacing)*32)}.h-40{height:calc(var(--spacing)*40)}.h-48{height:calc(var(--spacing)*48)}.h-56{height:calc(var(--spacing)*56)}.h-64{height:calc(var(--spacing)*64)}.h-72{height:calc(var(--spacing)*72)}.h-80{height:calc(var(--spacing)*80)}.h-96{height:calc(var(--spacing)*96)}.h-\[42px\]{height:42px}.h-auto{height:auto}.h-fit{height:fit-content}.h-full{height:100%}.h-max{height:max-content}.h-min{height:min-content}.h-px{height:1px}.h-screen{height:100vh}.max-h-0{max-height:calc(var(--spacing)*0)}.max-h-60{max-height:calc(var(--spacing)*60)}.max-h-64{max-height:calc(var(--spacing)*64)}.max-h-80{max-height:calc(var(--spacing)*80)}.max-h-96{max-height:calc(var(--spacing)*96)}.max-h-\[55vh\]{max-height:55vh}.max-h-\[70vh\]{max-height:70vh}.max-h-\[75vh\]{max-height:75vh}.max-h-\[90vh\]{max-height:90vh}.max-h-\[calc\(90vh-140px\)\]{max-height:calc(90vh - 140px)}.max-h-\[calc\(100vh-200px\)\]{max-height:calc(100vh - 200px)}.max-h-fit{max-height:fit-content}.max-h-full{max-height:100%}.max-h-max{max-height:max-content}.max-h-min{max-height:min-content}.max-h-none{max-height:none}.max-h-screen{max-height:100vh}.min-h-0{min-height:calc(var(--spacing)*0)}.min-h-20{min-height:calc(var(--spacing)*20)}.min-h-\[40px\]{min-height:40px}.min-h-\[60vh\]{min-height:60vh}.min-h-\[80px\]{min-height:80px}.min-h-\[200px\]{min-height:200px}.min-h-\[400px\]{min-height:400px}.min-h-fit{min-height:fit-content}.min-h-full{min-height:100%}.min-h-max{min-height:max-content}.min-h-min{min-height:min-content}.min-h-screen{min-height:100vh}.w-0{width:calc(var(--spacing)*0)}.w-1{width:calc(var(--spacing)*1)}.w-1\/2{width:50%}.w-1\/3{width:33.3333%}.w-1\/4{width:25%}.w-1\/5{width:20%}.w-1\/6{width:16.6667%}.w-2{width:calc(var(--spacing)*2)}.w-2\.5{width:calc(var(--spacing)*2.5)}.w-2\/3{width:66.6667%}.w-2\/4{width:50%}.w-2\/5{width:40%}.w-3{width:calc(var(--spacing)*3)}.w-3\.5{width:calc(var(--spacing)*3.5)}.w-3\/4{width:75%}.w-3\/5{width:60%}.w-4{width:calc(var(--spacing)*4)}.w-4\/5{width:80%}.w-5{width:calc(var(--spacing)*5)}.w-5\/6{width:83.3333%}.w-6{width:calc(var(--spacing)*6)}.w-8{width:calc(var(--spacing)*8)}.w-9{width:calc(var(--spacing)*9)}.w-10{width:calc(var(--spacing)*10)}.w-12{width:calc(var(--spacing)*12)}.w-14{width:calc(var(--spacing)*14)}.w-16{width:calc(var(--spacing)*16)}.w-20{width:calc(var(--spacing)*20)}.w-24{width:calc(var(--spacing)*24)}.w-28{width:calc(var(--spacing)*28)}.w-32{width:calc(var(--spacing)*32)}.w-40{width:calc(var(--spacing)*40)}.w-44{width:calc(var(--spacing)*44)}.w-48{width:calc(var(--spacing)*48)}.w-52{width:calc(var(--spacing)*52)}.w-56{width:calc(var(--spacing)*56)}.w-60{width:calc(var(--spacing)*60)}.w-64{width:calc(var(--spacing)*64)}.w-72{width:calc(var(--spacing)*72)}.w-80{width:calc(var(--spacing)*80)}.w-96{width:calc(var(--spacing)*96)}.w-\[220px\]{width:220px}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.w-max{width:max-content}.w-min{width:min-content}.w-px{width:1px}.w-screen{width:100vw}.max-w-0{max-width:calc(var(--spacing)*0)}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-5xl{max-width:var(--container-5xl)}.max-w-6xl{max-width:var(--container-6xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-\[60\%\]{max-width:60%}.max-w-\[85vw\]{max-width:85vw}.max-w-\[calc\(100vw-1rem\)\]{max-width:calc(100vw - 1rem)}.max-w-\[calc\(100vw-2rem\)\]{max-width:calc(100vw - 2rem)}.max-w-fit{max-width:fit-content}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.max-w-max{max-width:max-content}.max-w-md{max-width:var(--container-md)}.max-w-min{max-width:min-content}.max-w-none{max-width:none}.max-w-prose{max-width:65ch}.max-w-screen-2xl{max-width:var(--breakpoint-2xl)}.max-w-screen-lg{max-width:var(--breakpoint-lg)}.max-w-screen-md{max-width:var(--breakpoint-md)}.max-w-screen-sm{max-width:var(--breakpoint-sm)}.max-w-screen-xl{max-width:var(--breakpoint-xl)}.max-w-sm{max-width:var(--container-sm)}.max-w-xl{max-width:var(--container-xl)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-5{min-width:calc(var(--spacing)*5)}.min-w-24{min-width:calc(var(--spacing)*24)}.min-w-\[100px\]{min-width:100px}.min-w-\[120px\]{min-width:120px}.min-w-\[300px\]{min-width:300px}.min-w-fit{min-width:fit-content}.min-w-full{min-width:100%}.min-w-max{min-width:max-content}.min-w-min{min-width:min-content}.flex-1{flex:1}.flex-auto{flex:auto}.flex-initial{flex:0 auto}.flex-none{flex:none}.flex-shrink{flex-shrink:1}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.grow-0{flex-grow:0}.basis-0{flex-basis:calc(var(--spacing)*0)}.basis-1{flex-basis:calc(var(--spacing)*1)}.basis-1\/2{flex-basis:50%}.basis-1\/3{flex-basis:33.3333%}.basis-1\/4{flex-basis:25%}.basis-2{flex-basis:calc(var(--spacing)*2)}.basis-2\/3{flex-basis:66.6667%}.basis-3\/4{flex-basis:75%}.basis-auto{flex-basis:auto}.basis-full{flex-basis:100%}.table-auto{table-layout:auto}.table-fixed{table-layout:fixed}.caption-bottom{caption-side:bottom}.caption-top{caption-side:top}.border-collapse{border-collapse:collapse}.border-separate{border-collapse:separate}.border-spacing-0{--tw-border-spacing-x:calc(var(--spacing)*0);--tw-border-spacing-y:calc(var(--spacing)*0);border-spacing:var(--tw-border-spacing-x)var(--tw-border-spacing-y)}.border-spacing-1{--tw-border-spacing-x:calc(var(--spacing)*1);--tw-border-spacing-y:calc(var(--spacing)*1);border-spacing:var(--tw-border-spacing-x)var(--tw-border-spacing-y)}.border-spacing-2{--tw-border-spacing-x:calc(var(--spacing)*2);--tw-border-spacing-y:calc(var(--spacing)*2);border-spacing:var(--tw-border-spacing-x)var(--tw-border-spacing-y)}.border-spacing-3{--tw-border-spacing-x:calc(var(--spacing)*3);--tw-border-spacing-y:calc(var(--spacing)*3);border-spacing:var(--tw-border-spacing-x)var(--tw-border-spacing-y)}.border-spacing-4{--tw-border-spacing-x:calc(var(--spacing)*4);--tw-border-spacing-y:calc(var(--spacing)*4);border-spacing:var(--tw-border-spacing-x)var(--tw-border-spacing-y)}.border-spacing-5{--tw-border-spacing-x:calc(var(--spacing)*5);--tw-border-spacing-y:calc(var(--spacing)*5);border-spacing:var(--tw-border-spacing-x)var(--tw-border-spacing-y)}.border-spacing-6{--tw-border-spacing-x:calc(var(--spacing)*6);--tw-border-spacing-y:calc(var(--spacing)*6);border-spacing:var(--tw-border-spacing-x)var(--tw-border-spacing-y)}.border-spacing-8{--tw-border-spacing-x:calc(var(--spacing)*8);--tw-border-spacing-y:calc(var(--spacing)*8);border-spacing:var(--tw-border-spacing-x)var(--tw-border-spacing-y)}.origin-bottom{transform-origin:bottom}.origin-bottom-left{transform-origin:0 100%}.origin-bottom-right{transform-origin:100% 100%}.origin-center{transform-origin:50%}.origin-left{transform-origin:0}.origin-right{transform-origin:100%}.origin-top{transform-origin:top}.origin-top-left{transform-origin:0 0}.origin-top-right{transform-origin:100% 0}.-translate-x-1{--tw-translate-x:calc(var(--spacing)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-x-2{--tw-translate-x:calc(var(--spacing)*-2);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-x-3{--tw-translate-x:calc(var(--spacing)*-3);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-x-4{--tw-translate-x:calc(var(--spacing)*-4);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-0{--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-1{--tw-translate-x:calc(var(--spacing)*1);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-1\/2{--tw-translate-x: 50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-1\/3{--tw-translate-x:calc(1/3*100%);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-1\/4{--tw-translate-x: 25% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-2{--tw-translate-x:calc(var(--spacing)*2);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-2\/3{--tw-translate-x:calc(2/3*100%);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-3{--tw-translate-x:calc(var(--spacing)*3);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-3\/4{--tw-translate-x: 75% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-4{--tw-translate-x:calc(var(--spacing)*4);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-5{--tw-translate-x:calc(var(--spacing)*5);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-6{--tw-translate-x:calc(var(--spacing)*6);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-8{--tw-translate-x:calc(var(--spacing)*8);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-10{--tw-translate-x:calc(var(--spacing)*10);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-12{--tw-translate-x:calc(var(--spacing)*12);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-full{--tw-translate-x:100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1{--tw-translate-y:calc(var(--spacing)*-1);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-2{--tw-translate-y:calc(var(--spacing)*-2);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-3{--tw-translate-y:calc(var(--spacing)*-3);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-4{--tw-translate-y:calc(var(--spacing)*-4);translate:var(--tw-translate-x)var(--tw-translate-y)}.-translate-y-full{--tw-translate-y:-100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-0{--tw-translate-y:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-1{--tw-translate-y:calc(var(--spacing)*1);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-1\/2{--tw-translate-y: 50% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-1\/3{--tw-translate-y:calc(1/3*100%);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-1\/4{--tw-translate-y: 25% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-2{--tw-translate-y:calc(var(--spacing)*2);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-2\/3{--tw-translate-y:calc(2/3*100%);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-3{--tw-translate-y:calc(var(--spacing)*3);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-3\/4{--tw-translate-y: 75% ;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-4{--tw-translate-y:calc(var(--spacing)*4);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-5{--tw-translate-y:calc(var(--spacing)*5);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-6{--tw-translate-y:calc(var(--spacing)*6);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-8{--tw-translate-y:calc(var(--spacing)*8);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-10{--tw-translate-y:calc(var(--spacing)*10);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-12{--tw-translate-y:calc(var(--spacing)*12);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-full{--tw-translate-y:100%;translate:var(--tw-translate-x)var(--tw-translate-y)}.scale-0{--tw-scale-x:0%;--tw-scale-y:0%;--tw-scale-z:0%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-50{--tw-scale-x:50%;--tw-scale-y:50%;--tw-scale-z:50%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-75{--tw-scale-x:75%;--tw-scale-y:75%;--tw-scale-z:75%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-90{--tw-scale-x:90%;--tw-scale-y:90%;--tw-scale-z:90%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-95{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-100{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-105{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-110{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-125{--tw-scale-x:125%;--tw-scale-y:125%;--tw-scale-z:125%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-150{--tw-scale-x:150%;--tw-scale-y:150%;--tw-scale-z:150%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-x-0{--tw-scale-x:0%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-x-50{--tw-scale-x:50%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-x-75{--tw-scale-x:75%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-x-90{--tw-scale-x:90%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-x-95{--tw-scale-x:95%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-x-100{--tw-scale-x:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-x-105{--tw-scale-x:105%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-x-110{--tw-scale-x:110%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-x-125{--tw-scale-x:125%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-x-150{--tw-scale-x:150%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-y-0{--tw-scale-y:0%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-y-50{--tw-scale-y:50%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-y-75{--tw-scale-y:75%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-y-90{--tw-scale-y:90%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-y-95{--tw-scale-y:95%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-y-100{--tw-scale-y:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-y-105{--tw-scale-y:105%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-y-110{--tw-scale-y:110%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-y-125{--tw-scale-y:125%;scale:var(--tw-scale-x)var(--tw-scale-y)}.scale-y-150{--tw-scale-y:150%;scale:var(--tw-scale-x)var(--tw-scale-y)}.-rotate-1{rotate:-1deg}.-rotate-2{rotate:-2deg}.-rotate-3{rotate:-3deg}.-rotate-6{rotate:-6deg}.-rotate-12{rotate:-12deg}.-rotate-45{rotate:-45deg}.-rotate-90{rotate:-90deg}.-rotate-180{rotate:-180deg}.rotate-0{rotate:none}.rotate-1{rotate:1deg}.rotate-2{rotate:2deg}.rotate-3{rotate:3deg}.rotate-6{rotate:6deg}.rotate-12{rotate:12deg}.rotate-45{rotate:45deg}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.-skew-x-1{--tw-skew-x:skewX( -1deg );transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.-skew-x-2{--tw-skew-x:skewX( -2deg );transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.-skew-x-3{--tw-skew-x:skewX( -3deg );transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.-skew-x-6{--tw-skew-x:skewX( -6deg );transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.-skew-x-12{--tw-skew-x:skewX( -12deg );transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.skew-x-0{--tw-skew-x:skewX(0deg);transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.skew-x-1{--tw-skew-x:skewX(1deg);transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.skew-x-2{--tw-skew-x:skewX(2deg);transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.skew-x-3{--tw-skew-x:skewX(3deg);transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.skew-x-6{--tw-skew-x:skewX(6deg);transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.skew-x-12{--tw-skew-x:skewX(12deg);transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.-skew-y-1{--tw-skew-y:skewY( -1deg );transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.-skew-y-2{--tw-skew-y:skewY( -2deg );transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.-skew-y-3{--tw-skew-y:skewY( -3deg );transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.-skew-y-6{--tw-skew-y:skewY( -6deg );transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.-skew-y-12{--tw-skew-y:skewY( -12deg );transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.skew-y-0{--tw-skew-y:skewY(0deg);transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.skew-y-1{--tw-skew-y:skewY(1deg);transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.skew-y-2{--tw-skew-y:skewY(2deg);transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.skew-y-3{--tw-skew-y:skewY(3deg);transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.skew-y-6{--tw-skew-y:skewY(6deg);transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.skew-y-12{--tw-skew-y:skewY(12deg);transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.transform,.transform-cpu{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.transform-gpu{transform:translateZ(0)var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.transform-none{transform:none}.animate-\[loading_1\.5s_ease-in-out_infinite\]{animation:1.5s ease-in-out infinite loading}.animate-bounce{animation:var(--animate-bounce)}.animate-none{animation:none}.animate-ping{animation:var(--animate-ping)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-alias{cursor:alias}.cursor-all-scroll{cursor:all-scroll}.cursor-auto{cursor:auto}.cursor-cell{cursor:cell}.cursor-col-resize{cursor:col-resize}.cursor-context-menu{cursor:context-menu}.cursor-copy{cursor:copy}.cursor-crosshair{cursor:crosshair}.cursor-default{cursor:default}.cursor-e-resize{cursor:e-resize}.cursor-ew-resize{cursor:ew-resize}.cursor-grab{cursor:grab}.cursor-grabbing{cursor:grabbing}.cursor-help{cursor:help}.cursor-move{cursor:move}.cursor-n-resize{cursor:n-resize}.cursor-ne-resize{cursor:ne-resize}.cursor-nesw-resize{cursor:nesw-resize}.cursor-no-drop{cursor:no-drop}.cursor-none{cursor:none}.cursor-not-allowed{cursor:not-allowed}.cursor-ns-resize{cursor:ns-resize}.cursor-nw-resize{cursor:nw-resize}.cursor-nwse-resize{cursor:nwse-resize}.cursor-pointer{cursor:pointer}.cursor-progress{cursor:progress}.cursor-row-resize{cursor:row-resize}.cursor-s-resize{cursor:s-resize}.cursor-se-resize{cursor:se-resize}.cursor-sw-resize{cursor:sw-resize}.cursor-text{cursor:text}.cursor-vertical-text{cursor:vertical-text}.cursor-w-resize{cursor:w-resize}.cursor-wait{cursor:wait}.cursor-zoom-in{cursor:zoom-in}.cursor-zoom-out{cursor:zoom-out}.touch-pan-left{--tw-pan-x:pan-left;touch-action:var(--tw-pan-x,)var(--tw-pan-y,)var(--tw-pinch-zoom,)}.touch-pan-right{--tw-pan-x:pan-right;touch-action:var(--tw-pan-x,)var(--tw-pan-y,)var(--tw-pinch-zoom,)}.touch-pan-x{--tw-pan-x:pan-x;touch-action:var(--tw-pan-x,)var(--tw-pan-y,)var(--tw-pinch-zoom,)}.touch-pan-down{--tw-pan-y:pan-down;touch-action:var(--tw-pan-x,)var(--tw-pan-y,)var(--tw-pinch-zoom,)}.touch-pan-up{--tw-pan-y:pan-up;touch-action:var(--tw-pan-x,)var(--tw-pan-y,)var(--tw-pinch-zoom,)}.touch-pan-y{--tw-pan-y:pan-y;touch-action:var(--tw-pan-x,)var(--tw-pan-y,)var(--tw-pinch-zoom,)}.touch-pinch-zoom{--tw-pinch-zoom:pinch-zoom;touch-action:var(--tw-pan-x,)var(--tw-pan-y,)var(--tw-pinch-zoom,)}.touch-auto{touch-action:auto}.touch-manipulation{touch-action:manipulation}.touch-none{touch-action:none}.resize{resize:both}.resize-none{resize:none}.resize-x{resize:horizontal}.resize-y{resize:vertical}.snap-both{scroll-snap-type:both var(--tw-scroll-snap-strictness)}.snap-none{scroll-snap-type:none}.snap-x{scroll-snap-type:x var(--tw-scroll-snap-strictness)}.snap-y{scroll-snap-type:y var(--tw-scroll-snap-strictness)}.snap-mandatory{--tw-scroll-snap-strictness:mandatory}.snap-proximity{--tw-scroll-snap-strictness:proximity}.snap-align-none{scroll-snap-align:none}.snap-center{scroll-snap-align:center}.snap-end{scroll-snap-align:end}.snap-start{scroll-snap-align:start}.snap-always{scroll-snap-stop:always}.snap-normal{scroll-snap-stop:normal}.list-inside{list-style-position:inside}.list-outside{list-style-position:outside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.\[appearance\:textfield\]{appearance:textfield}.appearance-auto{appearance:auto}.appearance-none{appearance:none}.columns-1{columns:1}.columns-2{columns:2}.columns-2xl{columns:var(--container-2xl)}.columns-2xs{columns:var(--container-2xs)}.columns-3{columns:3}.columns-3xl{columns:var(--container-3xl)}.columns-3xs{columns:var(--container-3xs)}.columns-4{columns:4}.columns-4xl{columns:var(--container-4xl)}.columns-5{columns:5}.columns-5xl{columns:var(--container-5xl)}.columns-6{columns:6}.columns-6xl{columns:var(--container-6xl)}.columns-7{columns:7}.columns-7xl{columns:var(--container-7xl)}.columns-8{columns:8}.columns-9{columns:9}.columns-10{columns:10}.columns-11{columns:11}.columns-12{columns:12}.columns-auto{columns:auto}.columns-lg{columns:var(--container-lg)}.columns-md{columns:var(--container-md)}.columns-sm{columns:var(--container-sm)}.columns-xl{columns:var(--container-xl)}.columns-xs{columns:var(--container-xs)}.break-before-all{break-before:all}.break-before-auto{break-before:auto}.break-before-avoid{break-before:avoid}.break-before-avoid-page{break-before:avoid-page}.break-before-column{break-before:column}.break-before-left{break-before:left}.break-before-page{break-before:page}.break-before-right{break-before:right}.break-inside-auto{break-inside:auto}.break-inside-avoid{break-inside:avoid}.break-inside-avoid-column{break-inside:avoid-column}.break-inside-avoid-page{break-inside:avoid-page}.break-after-all{break-after:all}.break-after-auto{break-after:auto}.break-after-avoid{break-after:avoid}.break-after-avoid-page{break-after:avoid-page}.break-after-column{break-after:column}.break-after-left{break-after:left}.break-after-page{break-after:page}.break-after-right{break-after:right}.auto-cols-\[calc\(25\%_-_12px\)\]{grid-auto-columns:calc(25% - 12px)}.auto-cols-\[calc\(33\.333\%_-_11px\)\]{grid-auto-columns:calc(33.333% - 11px)}.auto-cols-\[calc\(50\%_-_8px\)\]{grid-auto-columns:calc(50% - 8px)}.auto-cols-auto{grid-auto-columns:auto}.auto-cols-fr{grid-auto-columns:minmax(0,1fr)}.auto-cols-max{grid-auto-columns:max-content}.auto-cols-min{grid-auto-columns:min-content}.grid-flow-col{grid-auto-flow:column}.grid-flow-col-dense{grid-auto-flow:column dense}.grid-flow-dense{grid-auto-flow:dense}.grid-flow-row{grid-auto-flow:row}.grid-flow-row-dense{grid-auto-flow:dense}.auto-rows-auto{grid-auto-rows:auto}.auto-rows-fr{grid-auto-rows:minmax(0,1fr)}.auto-rows-max{grid-auto-rows:max-content}.auto-rows-min{grid-auto-rows:min-content}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.grid-cols-9{grid-template-columns:repeat(9,minmax(0,1fr))}.grid-cols-10{grid-template-columns:repeat(10,minmax(0,1fr))}.grid-cols-11{grid-template-columns:repeat(11,minmax(0,1fr))}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.grid-cols-\[\.\.\.\]{grid-template-columns:...}.grid-cols-\[60px_1fr\]{grid-template-columns:60px 1fr}.grid-cols-\[60px_1fr_160px\]{grid-template-columns:60px 1fr 160px}.grid-cols-\[60px_minmax\(300px\,1fr\)_160px\]{grid-template-columns:60px minmax(300px,1fr) 160px}.grid-cols-\[60px_minmax\(300px\,1fr\)_160px_100px\]{grid-template-columns:60px minmax(300px,1fr) 160px 100px}.grid-cols-\[60px_minmax\(300px\,1fr\)_160px_100px_70px\]{grid-template-columns:60px minmax(300px,1fr) 160px 100px 70px}.grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.grid-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))}.grid-rows-5{grid-template-rows:repeat(5,minmax(0,1fr))}.grid-rows-6{grid-template-rows:repeat(6,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-row{flex-direction:row}.flex-row-reverse{flex-direction:row-reverse}.flex-nowrap{flex-wrap:nowrap}.flex-wrap{flex-wrap:wrap}.flex-wrap-reverse{flex-wrap:wrap-reverse}.place-content-around{place-content:space-around}.place-content-baseline{place-content:baseline start}.place-content-between{place-content:space-between}.place-content-center{place-content:center}.place-content-end{place-content:end}.place-content-evenly{place-content:space-evenly}.place-content-start{place-content:start}.place-content-stretch{place-content:stretch}.place-items-baseline{place-items:baseline}.place-items-center{place-items:center}.place-items-end{place-items:end}.place-items-start{place-items:start}.place-items-stretch{place-items:stretch stretch}.content-around{align-content:space-around}.content-between{align-content:space-between}.content-center{align-content:center}.content-end{align-content:flex-end}.content-evenly{align-content:space-evenly}.content-start{align-content:flex-start}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-around{justify-content:space-around}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-evenly{justify-content:space-evenly}.justify-start{justify-content:flex-start}.gap-0{gap:calc(var(--spacing)*0)}.gap-0\.5{gap:calc(var(--spacing)*.5)}.gap-1{gap:calc(var(--spacing)*1)}.gap-1\.5{gap:calc(var(--spacing)*1.5)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-5{gap:calc(var(--spacing)*5)}.gap-6{gap:calc(var(--spacing)*6)}.gap-8{gap:calc(var(--spacing)*8)}.gap-10{gap:calc(var(--spacing)*10)}.gap-12{gap:calc(var(--spacing)*12)}.gap-16{gap:calc(var(--spacing)*16)}:where(.-space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*-1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*-1)*calc(1 - var(--tw-space-y-reverse)))}:where(.-space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*-2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*-2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-0>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*0)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*0)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-0\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1.5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1.5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*5)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*5)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*8)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-y-reverse)))}.gap-x-0{column-gap:calc(var(--spacing)*0)}.gap-x-1{column-gap:calc(var(--spacing)*1)}.gap-x-2{column-gap:calc(var(--spacing)*2)}.gap-x-3{column-gap:calc(var(--spacing)*3)}.gap-x-4{column-gap:calc(var(--spacing)*4)}.gap-x-5{column-gap:calc(var(--spacing)*5)}.gap-x-6{column-gap:calc(var(--spacing)*6)}.gap-x-8{column-gap:calc(var(--spacing)*8)}.gap-x-10{column-gap:calc(var(--spacing)*10)}.gap-x-12{column-gap:calc(var(--spacing)*12)}:where(.-space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*-1)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*-1)*calc(1 - var(--tw-space-x-reverse)))}:where(.-space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*-2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*-2)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-0>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*0)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*0)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*1)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*3)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*4)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-5>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*5)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*5)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-6>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*6)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-8>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*8)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-x-reverse)))}.gap-y-0{row-gap:calc(var(--spacing)*0)}.gap-y-1{row-gap:calc(var(--spacing)*1)}.gap-y-2{row-gap:calc(var(--spacing)*2)}.gap-y-3{row-gap:calc(var(--spacing)*3)}.gap-y-4{row-gap:calc(var(--spacing)*4)}.gap-y-5{row-gap:calc(var(--spacing)*5)}.gap-y-6{row-gap:calc(var(--spacing)*6)}.gap-y-8{row-gap:calc(var(--spacing)*8)}.gap-y-10{row-gap:calc(var(--spacing)*10)}.gap-y-12{row-gap:calc(var(--spacing)*12)}:where(.divide-x>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(1px*var(--tw-divide-x-reverse));border-inline-end-width:calc(1px*calc(1 - var(--tw-divide-x-reverse)))}:where(.divide-x-0>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(0px*var(--tw-divide-x-reverse));border-inline-end-width:calc(0px*calc(1 - var(--tw-divide-x-reverse)))}:where(.divide-x-2>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(2px*var(--tw-divide-x-reverse));border-inline-end-width:calc(2px*calc(1 - var(--tw-divide-x-reverse)))}:where(.divide-x-4>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(4px*var(--tw-divide-x-reverse));border-inline-end-width:calc(4px*calc(1 - var(--tw-divide-x-reverse)))}:where(.divide-x-8>:not(:last-child)){--tw-divide-x-reverse:0;border-inline-style:var(--tw-border-style);border-inline-start-width:calc(8px*var(--tw-divide-x-reverse));border-inline-end-width:calc(8px*calc(1 - var(--tw-divide-x-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-y-0>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(0px*var(--tw-divide-y-reverse));border-bottom-width:calc(0px*calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-y-2>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(2px*var(--tw-divide-y-reverse));border-bottom-width:calc(2px*calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-y-4>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(4px*var(--tw-divide-y-reverse));border-bottom-width:calc(4px*calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-y-8>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(8px*var(--tw-divide-y-reverse));border-bottom-width:calc(8px*calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-y-reverse>:not(:last-child)){--tw-divide-y-reverse:1}:where(.divide-dashed>:not(:last-child)){--tw-border-style:dashed;border-style:dashed}:where(.divide-dotted>:not(:last-child)){--tw-border-style:dotted;border-style:dotted}:where(.divide-double>:not(:last-child)){--tw-border-style:double;border-style:double}:where(.divide-none>:not(:last-child)){--tw-border-style:none;border-style:none}:where(.divide-solid>:not(:last-child)){--tw-border-style:solid;border-style:solid}:where(.divide-black>:not(:last-child)){border-color:var(--color-black)}:where(.divide-current>:not(:last-child)){border-color:currentColor}:where(.divide-gray-50>:not(:last-child)){border-color:var(--color-gray-50)}:where(.divide-gray-100>:not(:last-child)){border-color:var(--color-gray-100)}:where(.divide-gray-200>:not(:last-child)){border-color:var(--color-gray-200)}:where(.divide-gray-300>:not(:last-child)){border-color:var(--color-gray-300)}:where(.divide-gray-400>:not(:last-child)){border-color:var(--color-gray-400)}:where(.divide-gray-500>:not(:last-child)){border-color:var(--color-gray-500)}:where(.divide-gray-600>:not(:last-child)){border-color:var(--color-gray-600)}:where(.divide-gray-700>:not(:last-child)){border-color:var(--color-gray-700)}:where(.divide-gray-800>:not(:last-child)){border-color:var(--color-gray-800)}:where(.divide-gray-900>:not(:last-child)){border-color:var(--color-gray-900)}:where(.divide-inherit>:not(:last-child)){border-color:inherit}:where(.divide-slate-50>:not(:last-child)){border-color:var(--color-slate-50)}:where(.divide-slate-100>:not(:last-child)){border-color:var(--color-slate-100)}:where(.divide-slate-200>:not(:last-child)){border-color:var(--color-slate-200)}:where(.divide-slate-300>:not(:last-child)){border-color:var(--color-slate-300)}:where(.divide-slate-400>:not(:last-child)){border-color:var(--color-slate-400)}:where(.divide-slate-500>:not(:last-child)){border-color:var(--color-slate-500)}:where(.divide-slate-600>:not(:last-child)){border-color:var(--color-slate-600)}:where(.divide-slate-700>:not(:last-child)){border-color:var(--color-slate-700)}:where(.divide-slate-800>:not(:last-child)){border-color:var(--color-slate-800)}:where(.divide-slate-900>:not(:last-child)){border-color:var(--color-slate-900)}:where(.divide-transparent>:not(:last-child)){border-color:#0000}:where(.divide-white>:not(:last-child)){border-color:var(--color-white)}.place-self-auto{place-self:auto}.place-self-center{place-self:center}.place-self-end{place-self:end}.place-self-start{place-self:start}.place-self-stretch{place-self:stretch stretch}.self-auto{align-self:auto}.self-baseline{align-self:baseline}.self-center{align-self:center}.self-end{align-self:flex-end}.self-start{align-self:flex-start}.self-stretch{align-self:stretch}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-clip{overflow:clip}.overflow-hidden{overflow:hidden}.overflow-scroll{overflow:scroll}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-x-clip{overflow-x:clip}.overflow-x-hidden{overflow-x:hidden}.overflow-x-scroll{overflow-x:scroll}.overflow-x-visible{overflow-x:visible}.overflow-y-auto{overflow-y:auto}.overflow-y-clip{overflow-y:clip}.overflow-y-hidden{overflow-y:hidden}.overflow-y-scroll{overflow-y:scroll}.overflow-y-visible{overflow-y:visible}.overscroll-auto{overscroll-behavior:auto}.overscroll-contain{overscroll-behavior:contain}.overscroll-none{overscroll-behavior:none}.overscroll-x-auto{overscroll-behavior-x:auto}.overscroll-x-contain{overscroll-behavior-x:contain}.overscroll-x-none{overscroll-behavior-x:none}.overscroll-y-auto{overscroll-behavior-y:auto}.overscroll-y-contain{overscroll-behavior-y:contain}.overscroll-y-none{overscroll-behavior-y:none}.scroll-auto{scroll-behavior:auto}.scroll-smooth{scroll-behavior:smooth}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-3xl{border-radius:var(--radius-3xl)}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-none{border-radius:0}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-t-2xl{border-top-left-radius:var(--radius-2xl);border-top-right-radius:var(--radius-2xl)}.rounded-t-3xl{border-top-left-radius:var(--radius-3xl);border-top-right-radius:var(--radius-3xl)}.rounded-t-full{border-top-left-radius:3.40282e38px;border-top-right-radius:3.40282e38px}.rounded-t-lg{border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg)}.rounded-t-md{border-top-left-radius:var(--radius-md);border-top-right-radius:var(--radius-md)}.rounded-t-none{border-top-left-radius:0;border-top-right-radius:0}.rounded-t-sm{border-top-left-radius:var(--radius-sm);border-top-right-radius:var(--radius-sm)}.rounded-t-xl{border-top-left-radius:var(--radius-xl);border-top-right-radius:var(--radius-xl)}.rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-l-2xl{border-top-left-radius:var(--radius-2xl);border-bottom-left-radius:var(--radius-2xl)}.rounded-l-3xl{border-top-left-radius:var(--radius-3xl);border-bottom-left-radius:var(--radius-3xl)}.rounded-l-full{border-top-left-radius:3.40282e38px;border-bottom-left-radius:3.40282e38px}.rounded-l-lg{border-top-left-radius:var(--radius-lg);border-bottom-left-radius:var(--radius-lg)}.rounded-l-md{border-top-left-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.rounded-l-none{border-top-left-radius:0;border-bottom-left-radius:0}.rounded-l-sm{border-top-left-radius:var(--radius-sm);border-bottom-left-radius:var(--radius-sm)}.rounded-l-xl{border-top-left-radius:var(--radius-xl);border-bottom-left-radius:var(--radius-xl)}.rounded-tl{border-top-left-radius:.25rem}.rounded-tl-2xl{border-top-left-radius:var(--radius-2xl)}.rounded-tl-3xl{border-top-left-radius:var(--radius-3xl)}.rounded-tl-full{border-top-left-radius:3.40282e38px}.rounded-tl-lg{border-top-left-radius:var(--radius-lg)}.rounded-tl-md{border-top-left-radius:var(--radius-md)}.rounded-tl-none{border-top-left-radius:0}.rounded-tl-sm{border-top-left-radius:var(--radius-sm)}.rounded-tl-xl{border-top-left-radius:var(--radius-xl)}.rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-r-2xl{border-top-right-radius:var(--radius-2xl);border-bottom-right-radius:var(--radius-2xl)}.rounded-r-3xl{border-top-right-radius:var(--radius-3xl);border-bottom-right-radius:var(--radius-3xl)}.rounded-r-full{border-top-right-radius:3.40282e38px;border-bottom-right-radius:3.40282e38px}.rounded-r-lg{border-top-right-radius:var(--radius-lg);border-bottom-right-radius:var(--radius-lg)}.rounded-r-md{border-top-right-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md)}.rounded-r-none{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-r-sm{border-top-right-radius:var(--radius-sm);border-bottom-right-radius:var(--radius-sm)}.rounded-r-xl{border-top-right-radius:var(--radius-xl);border-bottom-right-radius:var(--radius-xl)}.rounded-tr{border-top-right-radius:.25rem}.rounded-tr-2xl{border-top-right-radius:var(--radius-2xl)}.rounded-tr-3xl{border-top-right-radius:var(--radius-3xl)}.rounded-tr-full{border-top-right-radius:3.40282e38px}.rounded-tr-lg{border-top-right-radius:var(--radius-lg)}.rounded-tr-md{border-top-right-radius:var(--radius-md)}.rounded-tr-none{border-top-right-radius:0}.rounded-tr-sm{border-top-right-radius:var(--radius-sm)}.rounded-tr-xl{border-top-right-radius:var(--radius-xl)}.rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-b-2xl{border-bottom-right-radius:var(--radius-2xl);border-bottom-left-radius:var(--radius-2xl)}.rounded-b-3xl{border-bottom-right-radius:var(--radius-3xl);border-bottom-left-radius:var(--radius-3xl)}.rounded-b-full{border-bottom-right-radius:3.40282e38px;border-bottom-left-radius:3.40282e38px}.rounded-b-lg{border-bottom-right-radius:var(--radius-lg);border-bottom-left-radius:var(--radius-lg)}.rounded-b-md{border-bottom-right-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.rounded-b-none{border-bottom-right-radius:0;border-bottom-left-radius:0}.rounded-b-sm{border-bottom-right-radius:var(--radius-sm);border-bottom-left-radius:var(--radius-sm)}.rounded-b-xl{border-bottom-right-radius:var(--radius-xl);border-bottom-left-radius:var(--radius-xl)}.rounded-br{border-bottom-right-radius:.25rem}.rounded-br-2xl{border-bottom-right-radius:var(--radius-2xl)}.rounded-br-3xl{border-bottom-right-radius:var(--radius-3xl)}.rounded-br-full{border-bottom-right-radius:3.40282e38px}.rounded-br-lg{border-bottom-right-radius:var(--radius-lg)}.rounded-br-md{border-bottom-right-radius:var(--radius-md)}.rounded-br-none{border-bottom-right-radius:0}.rounded-br-sm{border-bottom-right-radius:var(--radius-sm)}.rounded-br-xl{border-bottom-right-radius:var(--radius-xl)}.rounded-bl{border-bottom-left-radius:.25rem}.rounded-bl-2xl{border-bottom-left-radius:var(--radius-2xl)}.rounded-bl-3xl{border-bottom-left-radius:var(--radius-3xl)}.rounded-bl-full{border-bottom-left-radius:3.40282e38px}.rounded-bl-lg{border-bottom-left-radius:var(--radius-lg)}.rounded-bl-md{border-bottom-left-radius:var(--radius-md)}.rounded-bl-none{border-bottom-left-radius:0}.rounded-bl-sm{border-bottom-left-radius:var(--radius-sm)}.rounded-bl-xl{border-bottom-left-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-4{border-style:var(--tw-border-style);border-width:4px}.border-8{border-style:var(--tw-border-style);border-width:8px}.border-x{border-inline-style:var(--tw-border-style);border-inline-width:1px}.border-x-0{border-inline-style:var(--tw-border-style);border-inline-width:0}.border-x-2{border-inline-style:var(--tw-border-style);border-inline-width:2px}.border-y{border-block-style:var(--tw-border-style);border-block-width:1px}.border-y-0{border-block-style:var(--tw-border-style);border-block-width:0}.border-y-2{border-block-style:var(--tw-border-style);border-block-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-0{border-top-style:var(--tw-border-style);border-top-width:0}.border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.border-t-4{border-top-style:var(--tw-border-style);border-top-width:4px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-r-0{border-right-style:var(--tw-border-style);border-right-width:0}.border-r-2{border-right-style:var(--tw-border-style);border-right-width:2px}.border-r-4{border-right-style:var(--tw-border-style);border-right-width:4px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-0{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-b-4{border-bottom-style:var(--tw-border-style);border-bottom-width:4px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-0{border-left-style:var(--tw-border-style);border-left-width:0}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-dotted{--tw-border-style:dotted;border-style:dotted}.border-double{--tw-border-style:double;border-style:double}.border-hidden{--tw-border-style:hidden;border-style:hidden}.border-none{--tw-border-style:none;border-style:none}.border-solid{--tw-border-style:solid;border-style:solid}.border-amber-50{border-color:var(--color-amber-50)}.border-amber-100{border-color:var(--color-amber-100)}.border-amber-200{border-color:var(--color-amber-200)}.border-amber-300{border-color:var(--color-amber-300)}.border-amber-400{border-color:var(--color-amber-400)}.border-amber-500{border-color:var(--color-amber-500)}.border-amber-600{border-color:var(--color-amber-600)}.border-amber-700{border-color:var(--color-amber-700)}.border-amber-800{border-color:var(--color-amber-800)}.border-amber-900{border-color:var(--color-amber-900)}.border-amber-950{border-color:var(--color-amber-950)}.border-black{border-color:var(--color-black)}.border-blue-50{border-color:var(--color-blue-50)}.border-blue-100{border-color:var(--color-blue-100)}.border-blue-200{border-color:var(--color-blue-200)}.border-blue-300{border-color:var(--color-blue-300)}.border-blue-400{border-color:var(--color-blue-400)}.border-blue-500{border-color:var(--color-blue-500)}.border-blue-600{border-color:var(--color-blue-600)}.border-blue-700{border-color:var(--color-blue-700)}.border-blue-800{border-color:var(--color-blue-800)}.border-blue-900{border-color:var(--color-blue-900)}.border-blue-950{border-color:var(--color-blue-950)}.border-current{border-color:currentColor}.border-cyan-50{border-color:var(--color-cyan-50)}.border-cyan-100{border-color:var(--color-cyan-100)}.border-cyan-200{border-color:var(--color-cyan-200)}.border-cyan-300{border-color:var(--color-cyan-300)}.border-cyan-400{border-color:var(--color-cyan-400)}.border-cyan-500{border-color:var(--color-cyan-500)}.border-cyan-600{border-color:var(--color-cyan-600)}.border-cyan-700{border-color:var(--color-cyan-700)}.border-cyan-800{border-color:var(--color-cyan-800)}.border-cyan-900{border-color:var(--color-cyan-900)}.border-cyan-950{border-color:var(--color-cyan-950)}.border-emerald-50{border-color:var(--color-emerald-50)}.border-emerald-100{border-color:var(--color-emerald-100)}.border-emerald-200{border-color:var(--color-emerald-200)}.border-emerald-300{border-color:var(--color-emerald-300)}.border-emerald-400{border-color:var(--color-emerald-400)}.border-emerald-500{border-color:var(--color-emerald-500)}.border-emerald-600{border-color:var(--color-emerald-600)}.border-emerald-700{border-color:var(--color-emerald-700)}.border-emerald-800{border-color:var(--color-emerald-800)}.border-emerald-900{border-color:var(--color-emerald-900)}.border-emerald-950{border-color:var(--color-emerald-950)}.border-fuchsia-50{border-color:var(--color-fuchsia-50)}.border-fuchsia-100{border-color:var(--color-fuchsia-100)}.border-fuchsia-200{border-color:var(--color-fuchsia-200)}.border-fuchsia-300{border-color:var(--color-fuchsia-300)}.border-fuchsia-400{border-color:var(--color-fuchsia-400)}.border-fuchsia-500{border-color:var(--color-fuchsia-500)}.border-fuchsia-600{border-color:var(--color-fuchsia-600)}.border-fuchsia-700{border-color:var(--color-fuchsia-700)}.border-fuchsia-800{border-color:var(--color-fuchsia-800)}.border-fuchsia-900{border-color:var(--color-fuchsia-900)}.border-fuchsia-950{border-color:var(--color-fuchsia-950)}.border-gray-50{border-color:var(--color-gray-50)}.border-gray-100{border-color:var(--color-gray-100)}.border-gray-200{border-color:var(--color-gray-200)}.border-gray-300{border-color:var(--color-gray-300)}.border-gray-400{border-color:var(--color-gray-400)}.border-gray-500{border-color:var(--color-gray-500)}.border-gray-600{border-color:var(--color-gray-600)}.border-gray-700{border-color:var(--color-gray-700)}.border-gray-800{border-color:var(--color-gray-800)}.border-gray-900{border-color:var(--color-gray-900)}.border-gray-950{border-color:var(--color-gray-950)}.border-green-50{border-color:var(--color-green-50)}.border-green-100{border-color:var(--color-green-100)}.border-green-200{border-color:var(--color-green-200)}.border-green-300{border-color:var(--color-green-300)}.border-green-400{border-color:var(--color-green-400)}.border-green-500{border-color:var(--color-green-500)}.border-green-600{border-color:var(--color-green-600)}.border-green-700{border-color:var(--color-green-700)}.border-green-800{border-color:var(--color-green-800)}.border-green-900{border-color:var(--color-green-900)}.border-green-950{border-color:var(--color-green-950)}.border-indigo-50{border-color:var(--color-indigo-50)}.border-indigo-100{border-color:var(--color-indigo-100)}.border-indigo-200{border-color:var(--color-indigo-200)}.border-indigo-300{border-color:var(--color-indigo-300)}.border-indigo-400{border-color:var(--color-indigo-400)}.border-indigo-500{border-color:var(--color-indigo-500)}.border-indigo-600{border-color:var(--color-indigo-600)}.border-indigo-700{border-color:var(--color-indigo-700)}.border-indigo-800{border-color:var(--color-indigo-800)}.border-indigo-900{border-color:var(--color-indigo-900)}.border-indigo-950{border-color:var(--color-indigo-950)}.border-inherit{border-color:inherit}.border-lime-50{border-color:var(--color-lime-50)}.border-lime-100{border-color:var(--color-lime-100)}.border-lime-200{border-color:var(--color-lime-200)}.border-lime-300{border-color:var(--color-lime-300)}.border-lime-400{border-color:var(--color-lime-400)}.border-lime-500{border-color:var(--color-lime-500)}.border-lime-600{border-color:var(--color-lime-600)}.border-lime-700{border-color:var(--color-lime-700)}.border-lime-800{border-color:var(--color-lime-800)}.border-lime-900{border-color:var(--color-lime-900)}.border-lime-950{border-color:var(--color-lime-950)}.border-neutral-50{border-color:var(--color-neutral-50)}.border-neutral-100{border-color:var(--color-neutral-100)}.border-neutral-200{border-color:var(--color-neutral-200)}.border-neutral-300{border-color:var(--color-neutral-300)}.border-neutral-400{border-color:var(--color-neutral-400)}.border-neutral-500{border-color:var(--color-neutral-500)}.border-neutral-600{border-color:var(--color-neutral-600)}.border-neutral-700{border-color:var(--color-neutral-700)}.border-neutral-800{border-color:var(--color-neutral-800)}.border-neutral-900{border-color:var(--color-neutral-900)}.border-neutral-950{border-color:var(--color-neutral-950)}.border-orange-50{border-color:var(--color-orange-50)}.border-orange-100{border-color:var(--color-orange-100)}.border-orange-200{border-color:var(--color-orange-200)}.border-orange-300{border-color:var(--color-orange-300)}.border-orange-400{border-color:var(--color-orange-400)}.border-orange-500{border-color:var(--color-orange-500)}.border-orange-600{border-color:var(--color-orange-600)}.border-orange-700{border-color:var(--color-orange-700)}.border-orange-800{border-color:var(--color-orange-800)}.border-orange-900{border-color:var(--color-orange-900)}.border-orange-950{border-color:var(--color-orange-950)}.border-pink-50{border-color:var(--color-pink-50)}.border-pink-100{border-color:var(--color-pink-100)}.border-pink-200{border-color:var(--color-pink-200)}.border-pink-300{border-color:var(--color-pink-300)}.border-pink-400{border-color:var(--color-pink-400)}.border-pink-500{border-color:var(--color-pink-500)}.border-pink-600{border-color:var(--color-pink-600)}.border-pink-700{border-color:var(--color-pink-700)}.border-pink-800{border-color:var(--color-pink-800)}.border-pink-900{border-color:var(--color-pink-900)}.border-pink-950{border-color:var(--color-pink-950)}.border-primary-500{border-color:var(--color-primary-500)}.border-purple-50{border-color:var(--color-purple-50)}.border-purple-100{border-color:var(--color-purple-100)}.border-purple-200{border-color:var(--color-purple-200)}.border-purple-300{border-color:var(--color-purple-300)}.border-purple-400{border-color:var(--color-purple-400)}.border-purple-500{border-color:var(--color-purple-500)}.border-purple-600{border-color:var(--color-purple-600)}.border-purple-700{border-color:var(--color-purple-700)}.border-purple-800{border-color:var(--color-purple-800)}.border-purple-900{border-color:var(--color-purple-900)}.border-purple-950{border-color:var(--color-purple-950)}.border-red-50{border-color:var(--color-red-50)}.border-red-100{border-color:var(--color-red-100)}.border-red-200{border-color:var(--color-red-200)}.border-red-300{border-color:var(--color-red-300)}.border-red-400{border-color:var(--color-red-400)}.border-red-500{border-color:var(--color-red-500)}.border-red-600{border-color:var(--color-red-600)}.border-red-700{border-color:var(--color-red-700)}.border-red-800{border-color:var(--color-red-800)}.border-red-900{border-color:var(--color-red-900)}.border-red-950{border-color:var(--color-red-950)}.border-rose-50{border-color:var(--color-rose-50)}.border-rose-100{border-color:var(--color-rose-100)}.border-rose-200{border-color:var(--color-rose-200)}.border-rose-300{border-color:var(--color-rose-300)}.border-rose-400{border-color:var(--color-rose-400)}.border-rose-500{border-color:var(--color-rose-500)}.border-rose-600{border-color:var(--color-rose-600)}.border-rose-700{border-color:var(--color-rose-700)}.border-rose-800{border-color:var(--color-rose-800)}.border-rose-900{border-color:var(--color-rose-900)}.border-rose-950{border-color:var(--color-rose-950)}.border-sky-50{border-color:var(--color-sky-50)}.border-sky-100{border-color:var(--color-sky-100)}.border-sky-200{border-color:var(--color-sky-200)}.border-sky-300{border-color:var(--color-sky-300)}.border-sky-400{border-color:var(--color-sky-400)}.border-sky-500{border-color:var(--color-sky-500)}.border-sky-600{border-color:var(--color-sky-600)}.border-sky-700{border-color:var(--color-sky-700)}.border-sky-800{border-color:var(--color-sky-800)}.border-sky-900{border-color:var(--color-sky-900)}.border-sky-950{border-color:var(--color-sky-950)}.border-slate-50{border-color:var(--color-slate-50)}.border-slate-100{border-color:var(--color-slate-100)}.border-slate-200{border-color:var(--color-slate-200)}.border-slate-300{border-color:var(--color-slate-300)}.border-slate-400{border-color:var(--color-slate-400)}.border-slate-500{border-color:var(--color-slate-500)}.border-slate-600{border-color:var(--color-slate-600)}.border-slate-700{border-color:var(--color-slate-700)}.border-slate-800{border-color:var(--color-slate-800)}.border-slate-900{border-color:var(--color-slate-900)}.border-slate-950{border-color:var(--color-slate-950)}.border-stone-50{border-color:var(--color-stone-50)}.border-stone-100{border-color:var(--color-stone-100)}.border-stone-200{border-color:var(--color-stone-200)}.border-stone-300{border-color:var(--color-stone-300)}.border-stone-400{border-color:var(--color-stone-400)}.border-stone-500{border-color:var(--color-stone-500)}.border-stone-600{border-color:var(--color-stone-600)}.border-stone-700{border-color:var(--color-stone-700)}.border-stone-800{border-color:var(--color-stone-800)}.border-stone-900{border-color:var(--color-stone-900)}.border-stone-950{border-color:var(--color-stone-950)}.border-teal-50{border-color:var(--color-teal-50)}.border-teal-100{border-color:var(--color-teal-100)}.border-teal-200{border-color:var(--color-teal-200)}.border-teal-300{border-color:var(--color-teal-300)}.border-teal-400{border-color:var(--color-teal-400)}.border-teal-500{border-color:var(--color-teal-500)}.border-teal-600{border-color:var(--color-teal-600)}.border-teal-700{border-color:var(--color-teal-700)}.border-teal-800{border-color:var(--color-teal-800)}.border-teal-900{border-color:var(--color-teal-900)}.border-teal-950{border-color:var(--color-teal-950)}.border-transparent{border-color:#0000}.border-violet-50{border-color:var(--color-violet-50)}.border-violet-100{border-color:var(--color-violet-100)}.border-violet-200{border-color:var(--color-violet-200)}.border-violet-300{border-color:var(--color-violet-300)}.border-violet-400{border-color:var(--color-violet-400)}.border-violet-500{border-color:var(--color-violet-500)}.border-violet-600{border-color:var(--color-violet-600)}.border-violet-700{border-color:var(--color-violet-700)}.border-violet-800{border-color:var(--color-violet-800)}.border-violet-900{border-color:var(--color-violet-900)}.border-violet-950{border-color:var(--color-violet-950)}.border-white{border-color:var(--color-white)}.border-white\/30{border-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.border-white\/30{border-color:color-mix(in oklab,var(--color-white)30%,transparent)}}.border-yellow-50{border-color:var(--color-yellow-50)}.border-yellow-100{border-color:var(--color-yellow-100)}.border-yellow-200{border-color:var(--color-yellow-200)}.border-yellow-300{border-color:var(--color-yellow-300)}.border-yellow-400{border-color:var(--color-yellow-400)}.border-yellow-500{border-color:var(--color-yellow-500)}.border-yellow-600{border-color:var(--color-yellow-600)}.border-yellow-700{border-color:var(--color-yellow-700)}.border-yellow-800{border-color:var(--color-yellow-800)}.border-yellow-900{border-color:var(--color-yellow-900)}.border-yellow-950{border-color:var(--color-yellow-950)}.border-zinc-50{border-color:var(--color-zinc-50)}.border-zinc-100{border-color:var(--color-zinc-100)}.border-zinc-200{border-color:var(--color-zinc-200)}.border-zinc-300{border-color:var(--color-zinc-300)}.border-zinc-400{border-color:var(--color-zinc-400)}.border-zinc-500{border-color:var(--color-zinc-500)}.border-zinc-600{border-color:var(--color-zinc-600)}.border-zinc-700{border-color:var(--color-zinc-700)}.border-zinc-800{border-color:var(--color-zinc-800)}.border-zinc-900{border-color:var(--color-zinc-900)}.border-zinc-950{border-color:var(--color-zinc-950)}.border-t-blue-500{border-top-color:var(--color-blue-500)}.border-t-gray-900{border-top-color:var(--color-gray-900)}.border-t-white{border-top-color:var(--color-white)}.bg-\[\#03C75A\]{background-color:#03c75a}.bg-\[\#1877F2\]{background-color:#1877f2}.bg-\[\#FEE500\]{background-color:#fee500}.bg-amber-50{background-color:var(--color-amber-50)}.bg-amber-100{background-color:var(--color-amber-100)}.bg-amber-200{background-color:var(--color-amber-200)}.bg-amber-300{background-color:var(--color-amber-300)}.bg-amber-400{background-color:var(--color-amber-400)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-amber-600{background-color:var(--color-amber-600)}.bg-amber-700{background-color:var(--color-amber-700)}.bg-amber-800{background-color:var(--color-amber-800)}.bg-amber-900{background-color:var(--color-amber-900)}.bg-amber-950{background-color:var(--color-amber-950)}.bg-black{background-color:var(--color-black)}.bg-black\/0{background-color:#0000}@supports (color:color-mix(in lab,red,red)){.bg-black\/0{background-color:color-mix(in oklab,var(--color-black)0%,transparent)}}.bg-black\/40{background-color:#0006}@supports (color:color-mix(in lab,red,red)){.bg-black\/40{background-color:color-mix(in oklab,var(--color-black)40%,transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black)50%,transparent)}}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-50\/70{background-color:#eff6ffb3}@supports (color:color-mix(in lab,red,red)){.bg-blue-50\/70{background-color:color-mix(in oklab,var(--color-blue-50)70%,transparent)}}.bg-blue-100{background-color:var(--color-blue-100)}.bg-blue-200{background-color:var(--color-blue-200)}.bg-blue-300{background-color:var(--color-blue-300)}.bg-blue-400{background-color:var(--color-blue-400)}.bg-blue-500{background-color:var(--color-blue-500)}.bg-blue-500\/20{background-color:#3080ff33}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/20{background-color:color-mix(in oklab,var(--color-blue-500)20%,transparent)}}.bg-blue-600{background-color:var(--color-blue-600)}.bg-blue-700{background-color:var(--color-blue-700)}.bg-blue-800{background-color:var(--color-blue-800)}.bg-blue-900{background-color:var(--color-blue-900)}.bg-blue-950{background-color:var(--color-blue-950)}.bg-current{background-color:currentColor}.bg-cyan-50{background-color:var(--color-cyan-50)}.bg-cyan-100{background-color:var(--color-cyan-100)}.bg-cyan-200{background-color:var(--color-cyan-200)}.bg-cyan-300{background-color:var(--color-cyan-300)}.bg-cyan-400{background-color:var(--color-cyan-400)}.bg-cyan-500{background-color:var(--color-cyan-500)}.bg-cyan-600{background-color:var(--color-cyan-600)}.bg-cyan-700{background-color:var(--color-cyan-700)}.bg-cyan-800{background-color:var(--color-cyan-800)}.bg-cyan-900{background-color:var(--color-cyan-900)}.bg-cyan-950{background-color:var(--color-cyan-950)}.bg-emerald-50{background-color:var(--color-emerald-50)}.bg-emerald-100{background-color:var(--color-emerald-100)}.bg-emerald-200{background-color:var(--color-emerald-200)}.bg-emerald-300{background-color:var(--color-emerald-300)}.bg-emerald-400{background-color:var(--color-emerald-400)}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-emerald-600{background-color:var(--color-emerald-600)}.bg-emerald-700{background-color:var(--color-emerald-700)}.bg-emerald-800{background-color:var(--color-emerald-800)}.bg-emerald-900{background-color:var(--color-emerald-900)}.bg-emerald-950{background-color:var(--color-emerald-950)}.bg-fuchsia-50{background-color:var(--color-fuchsia-50)}.bg-fuchsia-100{background-color:var(--color-fuchsia-100)}.bg-fuchsia-200{background-color:var(--color-fuchsia-200)}.bg-fuchsia-300{background-color:var(--color-fuchsia-300)}.bg-fuchsia-400{background-color:var(--color-fuchsia-400)}.bg-fuchsia-500{background-color:var(--color-fuchsia-500)}.bg-fuchsia-600{background-color:var(--color-fuchsia-600)}.bg-fuchsia-700{background-color:var(--color-fuchsia-700)}.bg-fuchsia-800{background-color:var(--color-fuchsia-800)}.bg-fuchsia-900{background-color:var(--color-fuchsia-900)}.bg-fuchsia-950{background-color:var(--color-fuchsia-950)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-100\/70{background-color:#f3f4f6b3}@supports (color:color-mix(in lab,red,red)){.bg-gray-100\/70{background-color:color-mix(in oklab,var(--color-gray-100)70%,transparent)}}.bg-gray-200{background-color:var(--color-gray-200)}.bg-gray-300{background-color:var(--color-gray-300)}.bg-gray-400{background-color:var(--color-gray-400)}.bg-gray-500{background-color:var(--color-gray-500)}.bg-gray-600{background-color:var(--color-gray-600)}.bg-gray-700{background-color:var(--color-gray-700)}.bg-gray-800{background-color:var(--color-gray-800)}.bg-gray-800\/50{background-color:#1e293980}@supports (color:color-mix(in lab,red,red)){.bg-gray-800\/50{background-color:color-mix(in oklab,var(--color-gray-800)50%,transparent)}}.bg-gray-900{background-color:var(--color-gray-900)}.bg-gray-900\/40{background-color:#10182866}@supports (color:color-mix(in lab,red,red)){.bg-gray-900\/40{background-color:color-mix(in oklab,var(--color-gray-900)40%,transparent)}}.bg-gray-900\/50{background-color:#10182880}@supports (color:color-mix(in lab,red,red)){.bg-gray-900\/50{background-color:color-mix(in oklab,var(--color-gray-900)50%,transparent)}}.bg-gray-950{background-color:var(--color-gray-950)}.bg-green-50{background-color:var(--color-green-50)}.bg-green-100{background-color:var(--color-green-100)}.bg-green-200{background-color:var(--color-green-200)}.bg-green-300{background-color:var(--color-green-300)}.bg-green-400{background-color:var(--color-green-400)}.bg-green-500{background-color:var(--color-green-500)}.bg-green-600{background-color:var(--color-green-600)}.bg-green-700{background-color:var(--color-green-700)}.bg-green-800{background-color:var(--color-green-800)}.bg-green-900{background-color:var(--color-green-900)}.bg-green-950{background-color:var(--color-green-950)}.bg-indigo-50{background-color:var(--color-indigo-50)}.bg-indigo-100{background-color:var(--color-indigo-100)}.bg-indigo-200{background-color:var(--color-indigo-200)}.bg-indigo-300{background-color:var(--color-indigo-300)}.bg-indigo-400{background-color:var(--color-indigo-400)}.bg-indigo-500{background-color:var(--color-indigo-500)}.bg-indigo-600{background-color:var(--color-indigo-600)}.bg-indigo-700{background-color:var(--color-indigo-700)}.bg-indigo-800{background-color:var(--color-indigo-800)}.bg-indigo-900{background-color:var(--color-indigo-900)}.bg-indigo-950{background-color:var(--color-indigo-950)}.bg-inherit{background-color:inherit}.bg-lime-50{background-color:var(--color-lime-50)}.bg-lime-100{background-color:var(--color-lime-100)}.bg-lime-200{background-color:var(--color-lime-200)}.bg-lime-300{background-color:var(--color-lime-300)}.bg-lime-400{background-color:var(--color-lime-400)}.bg-lime-500{background-color:var(--color-lime-500)}.bg-lime-600{background-color:var(--color-lime-600)}.bg-lime-700{background-color:var(--color-lime-700)}.bg-lime-800{background-color:var(--color-lime-800)}.bg-lime-900{background-color:var(--color-lime-900)}.bg-lime-950{background-color:var(--color-lime-950)}.bg-neutral-50{background-color:var(--color-neutral-50)}.bg-neutral-100{background-color:var(--color-neutral-100)}.bg-neutral-200{background-color:var(--color-neutral-200)}.bg-neutral-300{background-color:var(--color-neutral-300)}.bg-neutral-400{background-color:var(--color-neutral-400)}.bg-neutral-500{background-color:var(--color-neutral-500)}.bg-neutral-600{background-color:var(--color-neutral-600)}.bg-neutral-700{background-color:var(--color-neutral-700)}.bg-neutral-800{background-color:var(--color-neutral-800)}.bg-neutral-900{background-color:var(--color-neutral-900)}.bg-neutral-950{background-color:var(--color-neutral-950)}.bg-orange-50{background-color:var(--color-orange-50)}.bg-orange-100{background-color:var(--color-orange-100)}.bg-orange-200{background-color:var(--color-orange-200)}.bg-orange-300{background-color:var(--color-orange-300)}.bg-orange-400{background-color:var(--color-orange-400)}.bg-orange-500{background-color:var(--color-orange-500)}.bg-orange-600{background-color:var(--color-orange-600)}.bg-orange-700{background-color:var(--color-orange-700)}.bg-orange-800{background-color:var(--color-orange-800)}.bg-orange-900{background-color:var(--color-orange-900)}.bg-orange-950{background-color:var(--color-orange-950)}.bg-pink-50{background-color:var(--color-pink-50)}.bg-pink-100{background-color:var(--color-pink-100)}.bg-pink-200{background-color:var(--color-pink-200)}.bg-pink-300{background-color:var(--color-pink-300)}.bg-pink-400{background-color:var(--color-pink-400)}.bg-pink-500{background-color:var(--color-pink-500)}.bg-pink-600{background-color:var(--color-pink-600)}.bg-pink-700{background-color:var(--color-pink-700)}.bg-pink-800{background-color:var(--color-pink-800)}.bg-pink-900{background-color:var(--color-pink-900)}.bg-pink-950{background-color:var(--color-pink-950)}.bg-primary-50{background-color:var(--color-primary-50)}.bg-primary-100{background-color:var(--color-primary-100)}.bg-primary-600{background-color:var(--color-primary-600)}.bg-purple-50{background-color:var(--color-purple-50)}.bg-purple-100{background-color:var(--color-purple-100)}.bg-purple-200{background-color:var(--color-purple-200)}.bg-purple-300{background-color:var(--color-purple-300)}.bg-purple-400{background-color:var(--color-purple-400)}.bg-purple-500{background-color:var(--color-purple-500)}.bg-purple-500\/80{background-color:#ac4bffcc}@supports (color:color-mix(in lab,red,red)){.bg-purple-500\/80{background-color:color-mix(in oklab,var(--color-purple-500)80%,transparent)}}.bg-purple-600{background-color:var(--color-purple-600)}.bg-purple-700{background-color:var(--color-purple-700)}.bg-purple-800{background-color:var(--color-purple-800)}.bg-purple-900{background-color:var(--color-purple-900)}.bg-purple-950{background-color:var(--color-purple-950)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-50\/30{background-color:#fef2f24d}@supports (color:color-mix(in lab,red,red)){.bg-red-50\/30{background-color:color-mix(in oklab,var(--color-red-50)30%,transparent)}}.bg-red-100{background-color:var(--color-red-100)}.bg-red-200{background-color:var(--color-red-200)}.bg-red-300{background-color:var(--color-red-300)}.bg-red-400{background-color:var(--color-red-400)}.bg-red-500{background-color:var(--color-red-500)}.bg-red-500\/50{background-color:#fb2c3680}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/50{background-color:color-mix(in oklab,var(--color-red-500)50%,transparent)}}.bg-red-600{background-color:var(--color-red-600)}.bg-red-700{background-color:var(--color-red-700)}.bg-red-800{background-color:var(--color-red-800)}.bg-red-900{background-color:var(--color-red-900)}.bg-red-950{background-color:var(--color-red-950)}.bg-rose-50{background-color:var(--color-rose-50)}.bg-rose-100{background-color:var(--color-rose-100)}.bg-rose-200{background-color:var(--color-rose-200)}.bg-rose-300{background-color:var(--color-rose-300)}.bg-rose-400{background-color:var(--color-rose-400)}.bg-rose-500{background-color:var(--color-rose-500)}.bg-rose-600{background-color:var(--color-rose-600)}.bg-rose-700{background-color:var(--color-rose-700)}.bg-rose-800{background-color:var(--color-rose-800)}.bg-rose-900{background-color:var(--color-rose-900)}.bg-rose-950{background-color:var(--color-rose-950)}.bg-sky-50{background-color:var(--color-sky-50)}.bg-sky-100{background-color:var(--color-sky-100)}.bg-sky-200{background-color:var(--color-sky-200)}.bg-sky-300{background-color:var(--color-sky-300)}.bg-sky-400{background-color:var(--color-sky-400)}.bg-sky-500{background-color:var(--color-sky-500)}.bg-sky-600{background-color:var(--color-sky-600)}.bg-sky-700{background-color:var(--color-sky-700)}.bg-sky-800{background-color:var(--color-sky-800)}.bg-sky-900{background-color:var(--color-sky-900)}.bg-sky-950{background-color:var(--color-sky-950)}.bg-slate-50{background-color:var(--color-slate-50)}.bg-slate-100{background-color:var(--color-slate-100)}.bg-slate-200{background-color:var(--color-slate-200)}.bg-slate-300{background-color:var(--color-slate-300)}.bg-slate-400{background-color:var(--color-slate-400)}.bg-slate-500{background-color:var(--color-slate-500)}.bg-slate-600{background-color:var(--color-slate-600)}.bg-slate-700{background-color:var(--color-slate-700)}.bg-slate-800{background-color:var(--color-slate-800)}.bg-slate-900{background-color:var(--color-slate-900)}.bg-slate-950{background-color:var(--color-slate-950)}.bg-stone-50{background-color:var(--color-stone-50)}.bg-stone-100{background-color:var(--color-stone-100)}.bg-stone-200{background-color:var(--color-stone-200)}.bg-stone-300{background-color:var(--color-stone-300)}.bg-stone-400{background-color:var(--color-stone-400)}.bg-stone-500{background-color:var(--color-stone-500)}.bg-stone-600{background-color:var(--color-stone-600)}.bg-stone-700{background-color:var(--color-stone-700)}.bg-stone-800{background-color:var(--color-stone-800)}.bg-stone-900{background-color:var(--color-stone-900)}.bg-stone-950{background-color:var(--color-stone-950)}.bg-teal-50{background-color:var(--color-teal-50)}.bg-teal-100{background-color:var(--color-teal-100)}.bg-teal-200{background-color:var(--color-teal-200)}.bg-teal-300{background-color:var(--color-teal-300)}.bg-teal-400{background-color:var(--color-teal-400)}.bg-teal-500{background-color:var(--color-teal-500)}.bg-teal-600{background-color:var(--color-teal-600)}.bg-teal-700{background-color:var(--color-teal-700)}.bg-teal-800{background-color:var(--color-teal-800)}.bg-teal-900{background-color:var(--color-teal-900)}.bg-teal-950{background-color:var(--color-teal-950)}.bg-transparent{background-color:#0000}.bg-violet-50{background-color:var(--color-violet-50)}.bg-violet-100{background-color:var(--color-violet-100)}.bg-violet-200{background-color:var(--color-violet-200)}.bg-violet-300{background-color:var(--color-violet-300)}.bg-violet-400{background-color:var(--color-violet-400)}.bg-violet-500{background-color:var(--color-violet-500)}.bg-violet-600{background-color:var(--color-violet-600)}.bg-violet-700{background-color:var(--color-violet-700)}.bg-violet-800{background-color:var(--color-violet-800)}.bg-violet-900{background-color:var(--color-violet-900)}.bg-violet-950{background-color:var(--color-violet-950)}.bg-white{background-color:var(--color-white)}.bg-white\/20{background-color:#fff3}@supports (color:color-mix(in lab,red,red)){.bg-white\/20{background-color:color-mix(in oklab,var(--color-white)20%,transparent)}}.bg-white\/30{background-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.bg-white\/30{background-color:color-mix(in oklab,var(--color-white)30%,transparent)}}.bg-white\/50{background-color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.bg-white\/50{background-color:color-mix(in oklab,var(--color-white)50%,transparent)}}.bg-white\/90{background-color:#ffffffe6}@supports (color:color-mix(in lab,red,red)){.bg-white\/90{background-color:color-mix(in oklab,var(--color-white)90%,transparent)}}.bg-yellow-50{background-color:var(--color-yellow-50)}.bg-yellow-100{background-color:var(--color-yellow-100)}.bg-yellow-200{background-color:var(--color-yellow-200)}.bg-yellow-300{background-color:var(--color-yellow-300)}.bg-yellow-400{background-color:var(--color-yellow-400)}.bg-yellow-500{background-color:var(--color-yellow-500)}.bg-yellow-600{background-color:var(--color-yellow-600)}.bg-yellow-700{background-color:var(--color-yellow-700)}.bg-yellow-800{background-color:var(--color-yellow-800)}.bg-yellow-900{background-color:var(--color-yellow-900)}.bg-yellow-950{background-color:var(--color-yellow-950)}.bg-zinc-50{background-color:var(--color-zinc-50)}.bg-zinc-100{background-color:var(--color-zinc-100)}.bg-zinc-200{background-color:var(--color-zinc-200)}.bg-zinc-300{background-color:var(--color-zinc-300)}.bg-zinc-400{background-color:var(--color-zinc-400)}.bg-zinc-500{background-color:var(--color-zinc-500)}.bg-zinc-600{background-color:var(--color-zinc-600)}.bg-zinc-700{background-color:var(--color-zinc-700)}.bg-zinc-800{background-color:var(--color-zinc-800)}.bg-zinc-900{background-color:var(--color-zinc-900)}.bg-zinc-950{background-color:var(--color-zinc-950)}.bg-gradient-to-b{--tw-gradient-position:to bottom in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-bl{--tw-gradient-position:to bottom left in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-l{--tw-gradient-position:to left in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-t{--tw-gradient-position:to top in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-tl{--tw-gradient-position:to top left in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-tr{--tw-gradient-position:to top right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-none{background-image:none}.from-black{--tw-gradient-from:var(--color-black);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-black\/90{--tw-gradient-from:#000000e6}@supports (color:color-mix(in lab,red,red)){.from-black\/90{--tw-gradient-from:color-mix(in oklab,var(--color-black)90%,transparent)}}.from-black\/90{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-blue-50{--tw-gradient-from:var(--color-blue-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-blue-100{--tw-gradient-from:var(--color-blue-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-blue-200{--tw-gradient-from:var(--color-blue-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-blue-300{--tw-gradient-from:var(--color-blue-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-blue-400{--tw-gradient-from:var(--color-blue-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-blue-500{--tw-gradient-from:var(--color-blue-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-blue-600{--tw-gradient-from:var(--color-blue-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-blue-700{--tw-gradient-from:var(--color-blue-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-blue-800{--tw-gradient-from:var(--color-blue-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-blue-900{--tw-gradient-from:var(--color-blue-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-current{--tw-gradient-from:currentcolor;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-emerald-500{--tw-gradient-from:var(--color-emerald-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-gray-50{--tw-gradient-from:var(--color-gray-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-gray-100{--tw-gradient-from:var(--color-gray-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-gray-200{--tw-gradient-from:var(--color-gray-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-gray-300{--tw-gradient-from:var(--color-gray-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-gray-400{--tw-gradient-from:var(--color-gray-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-gray-500{--tw-gradient-from:var(--color-gray-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-gray-600{--tw-gradient-from:var(--color-gray-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-gray-700{--tw-gradient-from:var(--color-gray-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-gray-800{--tw-gradient-from:var(--color-gray-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-gray-900{--tw-gradient-from:var(--color-gray-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-green-50{--tw-gradient-from:var(--color-green-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-green-100{--tw-gradient-from:var(--color-green-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-green-200{--tw-gradient-from:var(--color-green-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-green-300{--tw-gradient-from:var(--color-green-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-green-400{--tw-gradient-from:var(--color-green-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-green-500{--tw-gradient-from:var(--color-green-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-green-600{--tw-gradient-from:var(--color-green-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-green-700{--tw-gradient-from:var(--color-green-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-green-800{--tw-gradient-from:var(--color-green-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-green-900{--tw-gradient-from:var(--color-green-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-indigo-50{--tw-gradient-from:var(--color-indigo-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-indigo-100{--tw-gradient-from:var(--color-indigo-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-indigo-200{--tw-gradient-from:var(--color-indigo-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-indigo-300{--tw-gradient-from:var(--color-indigo-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-indigo-400{--tw-gradient-from:var(--color-indigo-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-indigo-500{--tw-gradient-from:var(--color-indigo-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-indigo-600{--tw-gradient-from:var(--color-indigo-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-indigo-700{--tw-gradient-from:var(--color-indigo-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-indigo-800{--tw-gradient-from:var(--color-indigo-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-indigo-900{--tw-gradient-from:var(--color-indigo-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-inherit{--tw-gradient-from:inherit;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-orange-50{--tw-gradient-from:var(--color-orange-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-orange-100{--tw-gradient-from:var(--color-orange-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-orange-200{--tw-gradient-from:var(--color-orange-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-orange-300{--tw-gradient-from:var(--color-orange-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-orange-400{--tw-gradient-from:var(--color-orange-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-orange-500{--tw-gradient-from:var(--color-orange-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-orange-600{--tw-gradient-from:var(--color-orange-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-orange-700{--tw-gradient-from:var(--color-orange-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-orange-800{--tw-gradient-from:var(--color-orange-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-orange-900{--tw-gradient-from:var(--color-orange-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-pink-50{--tw-gradient-from:var(--color-pink-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-pink-100{--tw-gradient-from:var(--color-pink-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-pink-200{--tw-gradient-from:var(--color-pink-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-pink-300{--tw-gradient-from:var(--color-pink-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-pink-400{--tw-gradient-from:var(--color-pink-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-pink-500{--tw-gradient-from:var(--color-pink-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-pink-600{--tw-gradient-from:var(--color-pink-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-pink-700{--tw-gradient-from:var(--color-pink-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-pink-800{--tw-gradient-from:var(--color-pink-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-pink-900{--tw-gradient-from:var(--color-pink-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-purple-50{--tw-gradient-from:var(--color-purple-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-purple-100{--tw-gradient-from:var(--color-purple-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-purple-200{--tw-gradient-from:var(--color-purple-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-purple-300{--tw-gradient-from:var(--color-purple-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-purple-400{--tw-gradient-from:var(--color-purple-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-purple-500{--tw-gradient-from:var(--color-purple-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-purple-600{--tw-gradient-from:var(--color-purple-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-purple-700{--tw-gradient-from:var(--color-purple-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-purple-800{--tw-gradient-from:var(--color-purple-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-purple-900{--tw-gradient-from:var(--color-purple-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-red-50{--tw-gradient-from:var(--color-red-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-red-100{--tw-gradient-from:var(--color-red-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-red-200{--tw-gradient-from:var(--color-red-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-red-300{--tw-gradient-from:var(--color-red-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-red-400{--tw-gradient-from:var(--color-red-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-red-500{--tw-gradient-from:var(--color-red-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-red-600{--tw-gradient-from:var(--color-red-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-red-700{--tw-gradient-from:var(--color-red-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-red-800{--tw-gradient-from:var(--color-red-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-red-900{--tw-gradient-from:var(--color-red-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-slate-50{--tw-gradient-from:var(--color-slate-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-slate-100{--tw-gradient-from:var(--color-slate-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-slate-200{--tw-gradient-from:var(--color-slate-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-slate-300{--tw-gradient-from:var(--color-slate-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-slate-400{--tw-gradient-from:var(--color-slate-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-slate-500{--tw-gradient-from:var(--color-slate-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-slate-600{--tw-gradient-from:var(--color-slate-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-slate-700{--tw-gradient-from:var(--color-slate-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-slate-800{--tw-gradient-from:var(--color-slate-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-slate-900{--tw-gradient-from:var(--color-slate-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-transparent{--tw-gradient-from:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-white{--tw-gradient-from:var(--color-white);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-yellow-50{--tw-gradient-from:var(--color-yellow-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-yellow-100{--tw-gradient-from:var(--color-yellow-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-yellow-200{--tw-gradient-from:var(--color-yellow-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-yellow-300{--tw-gradient-from:var(--color-yellow-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-yellow-400{--tw-gradient-from:var(--color-yellow-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-yellow-500{--tw-gradient-from:var(--color-yellow-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-yellow-600{--tw-gradient-from:var(--color-yellow-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-yellow-700{--tw-gradient-from:var(--color-yellow-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-yellow-800{--tw-gradient-from:var(--color-yellow-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-yellow-900{--tw-gradient-from:var(--color-yellow-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.via-black{--tw-gradient-via:var(--color-black);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-black\/60{--tw-gradient-via:#0009}@supports (color:color-mix(in lab,red,red)){.via-black\/60{--tw-gradient-via:color-mix(in oklab,var(--color-black)60%,transparent)}}.via-black\/60{--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-blue-50{--tw-gradient-via:var(--color-blue-50);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-blue-100{--tw-gradient-via:var(--color-blue-100);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-blue-200{--tw-gradient-via:var(--color-blue-200);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-blue-300{--tw-gradient-via:var(--color-blue-300);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-blue-400{--tw-gradient-via:var(--color-blue-400);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-blue-500{--tw-gradient-via:var(--color-blue-500);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-blue-600{--tw-gradient-via:var(--color-blue-600);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-blue-700{--tw-gradient-via:var(--color-blue-700);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-blue-800{--tw-gradient-via:var(--color-blue-800);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-blue-900{--tw-gradient-via:var(--color-blue-900);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-current{--tw-gradient-via:currentcolor;--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-gray-50{--tw-gradient-via:var(--color-gray-50);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-gray-100{--tw-gradient-via:var(--color-gray-100);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-gray-200{--tw-gradient-via:var(--color-gray-200);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-gray-300{--tw-gradient-via:var(--color-gray-300);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-gray-400{--tw-gradient-via:var(--color-gray-400);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-gray-500{--tw-gradient-via:var(--color-gray-500);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-gray-600{--tw-gradient-via:var(--color-gray-600);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-gray-700{--tw-gradient-via:var(--color-gray-700);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-gray-800{--tw-gradient-via:var(--color-gray-800);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-gray-900{--tw-gradient-via:var(--color-gray-900);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-inherit{--tw-gradient-via:inherit;--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-slate-50{--tw-gradient-via:var(--color-slate-50);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-slate-100{--tw-gradient-via:var(--color-slate-100);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-slate-200{--tw-gradient-via:var(--color-slate-200);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-slate-300{--tw-gradient-via:var(--color-slate-300);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-slate-400{--tw-gradient-via:var(--color-slate-400);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-slate-500{--tw-gradient-via:var(--color-slate-500);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-slate-600{--tw-gradient-via:var(--color-slate-600);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-slate-700{--tw-gradient-via:var(--color-slate-700);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-slate-800{--tw-gradient-via:var(--color-slate-800);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-slate-900{--tw-gradient-via:var(--color-slate-900);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-transparent{--tw-gradient-via:transparent;--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.via-white{--tw-gradient-via:var(--color-white);--tw-gradient-via-stops:var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-via)var(--tw-gradient-via-position),var(--tw-gradient-to)var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-via-stops)}.to-black{--tw-gradient-to:var(--color-black);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-blue-50{--tw-gradient-to:var(--color-blue-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-blue-100{--tw-gradient-to:var(--color-blue-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-blue-200{--tw-gradient-to:var(--color-blue-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-blue-300{--tw-gradient-to:var(--color-blue-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-blue-400{--tw-gradient-to:var(--color-blue-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-blue-500{--tw-gradient-to:var(--color-blue-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-blue-600{--tw-gradient-to:var(--color-blue-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-blue-700{--tw-gradient-to:var(--color-blue-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-blue-800{--tw-gradient-to:var(--color-blue-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-blue-900{--tw-gradient-to:var(--color-blue-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-current{--tw-gradient-to:currentcolor;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-gray-50{--tw-gradient-to:var(--color-gray-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-gray-100{--tw-gradient-to:var(--color-gray-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-gray-200{--tw-gradient-to:var(--color-gray-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-gray-300{--tw-gradient-to:var(--color-gray-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-gray-400{--tw-gradient-to:var(--color-gray-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-gray-500{--tw-gradient-to:var(--color-gray-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-gray-600{--tw-gradient-to:var(--color-gray-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-gray-700{--tw-gradient-to:var(--color-gray-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-gray-800{--tw-gradient-to:var(--color-gray-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-gray-900{--tw-gradient-to:var(--color-gray-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-inherit{--tw-gradient-to:inherit;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-purple-50{--tw-gradient-to:var(--color-purple-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-purple-100{--tw-gradient-to:var(--color-purple-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-purple-200{--tw-gradient-to:var(--color-purple-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-purple-300{--tw-gradient-to:var(--color-purple-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-purple-400{--tw-gradient-to:var(--color-purple-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-purple-500{--tw-gradient-to:var(--color-purple-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-purple-600{--tw-gradient-to:var(--color-purple-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-purple-700{--tw-gradient-to:var(--color-purple-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-purple-800{--tw-gradient-to:var(--color-purple-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-purple-900{--tw-gradient-to:var(--color-purple-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-red-50{--tw-gradient-to:var(--color-red-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-red-100{--tw-gradient-to:var(--color-red-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-red-200{--tw-gradient-to:var(--color-red-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-red-300{--tw-gradient-to:var(--color-red-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-red-400{--tw-gradient-to:var(--color-red-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-red-500{--tw-gradient-to:var(--color-red-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-red-600{--tw-gradient-to:var(--color-red-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-red-700{--tw-gradient-to:var(--color-red-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-red-800{--tw-gradient-to:var(--color-red-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-red-900{--tw-gradient-to:var(--color-red-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-slate-50{--tw-gradient-to:var(--color-slate-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-slate-100{--tw-gradient-to:var(--color-slate-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-slate-200{--tw-gradient-to:var(--color-slate-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-slate-300{--tw-gradient-to:var(--color-slate-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-slate-400{--tw-gradient-to:var(--color-slate-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-slate-500{--tw-gradient-to:var(--color-slate-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-slate-600{--tw-gradient-to:var(--color-slate-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-slate-700{--tw-gradient-to:var(--color-slate-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-slate-800{--tw-gradient-to:var(--color-slate-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-slate-900{--tw-gradient-to:var(--color-slate-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-teal-600{--tw-gradient-to:var(--color-teal-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-transparent{--tw-gradient-to:transparent;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-white{--tw-gradient-to:var(--color-white);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.object-fill{object-fit:fill}.object-none{object-fit:none}.object-scale-down{object-fit:scale-down}.object-bottom{object-position:bottom}.object-center{object-position:center}.object-left{object-position:left}.object-left-bottom{object-position:left bottom}.object-left-top{object-position:left top}.object-right{object-position:right}.object-right-bottom{object-position:right bottom}.object-right-top{object-position:right top}.object-top{object-position:top}.p-0{padding:calc(var(--spacing)*0)}.p-1{padding:calc(var(--spacing)*1)}.p-1\.5{padding:calc(var(--spacing)*1.5)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-5{padding:calc(var(--spacing)*5)}.p-6{padding:calc(var(--spacing)*6)}.p-8{padding:calc(var(--spacing)*8)}.p-10{padding:calc(var(--spacing)*10)}.p-12{padding:calc(var(--spacing)*12)}.p-16{padding:calc(var(--spacing)*16)}.p-20{padding:calc(var(--spacing)*20)}.p-24{padding:calc(var(--spacing)*24)}.px-0{padding-inline:calc(var(--spacing)*0)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-1\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-5{padding-inline:calc(var(--spacing)*5)}.px-6{padding-inline:calc(var(--spacing)*6)}.px-8{padding-inline:calc(var(--spacing)*8)}.px-10{padding-inline:calc(var(--spacing)*10)}.px-12{padding-inline:calc(var(--spacing)*12)}.px-16{padding-inline:calc(var(--spacing)*16)}.py-0{padding-block:calc(var(--spacing)*0)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-1\.5{padding-block:calc(var(--spacing)*1.5)}.py-2{padding-block:calc(var(--spacing)*2)}.py-2\.5{padding-block:calc(var(--spacing)*2.5)}.py-3{padding-block:calc(var(--spacing)*3)}.py-3\.5{padding-block:calc(var(--spacing)*3.5)}.py-4{padding-block:calc(var(--spacing)*4)}.py-5{padding-block:calc(var(--spacing)*5)}.py-6{padding-block:calc(var(--spacing)*6)}.py-8{padding-block:calc(var(--spacing)*8)}.py-10{padding-block:calc(var(--spacing)*10)}.py-12{padding-block:calc(var(--spacing)*12)}.py-16{padding-block:calc(var(--spacing)*16)}.py-20{padding-block:calc(var(--spacing)*20)}.pt-0{padding-top:calc(var(--spacing)*0)}.pt-1{padding-top:calc(var(--spacing)*1)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-3{padding-top:calc(var(--spacing)*3)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-5{padding-top:calc(var(--spacing)*5)}.pt-6{padding-top:calc(var(--spacing)*6)}.pt-8{padding-top:calc(var(--spacing)*8)}.pt-10{padding-top:calc(var(--spacing)*10)}.pt-12{padding-top:calc(var(--spacing)*12)}.pt-16{padding-top:calc(var(--spacing)*16)}.pr-0{padding-right:calc(var(--spacing)*0)}.pr-1{padding-right:calc(var(--spacing)*1)}.pr-2{padding-right:calc(var(--spacing)*2)}.pr-3{padding-right:calc(var(--spacing)*3)}.pr-4{padding-right:calc(var(--spacing)*4)}.pr-5{padding-right:calc(var(--spacing)*5)}.pr-6{padding-right:calc(var(--spacing)*6)}.pr-8{padding-right:calc(var(--spacing)*8)}.pr-10{padding-right:calc(var(--spacing)*10)}.pr-12{padding-right:calc(var(--spacing)*12)}.pr-16{padding-right:calc(var(--spacing)*16)}.pb-0{padding-bottom:calc(var(--spacing)*0)}.pb-1{padding-bottom:calc(var(--spacing)*1)}.pb-2{padding-bottom:calc(var(--spacing)*2)}.pb-3{padding-bottom:calc(var(--spacing)*3)}.pb-4{padding-bottom:calc(var(--spacing)*4)}.pb-5{padding-bottom:calc(var(--spacing)*5)}.pb-6{padding-bottom:calc(var(--spacing)*6)}.pb-8{padding-bottom:calc(var(--spacing)*8)}.pb-10{padding-bottom:calc(var(--spacing)*10)}.pb-12{padding-bottom:calc(var(--spacing)*12)}.pb-16{padding-bottom:calc(var(--spacing)*16)}.pl-0{padding-left:calc(var(--spacing)*0)}.pl-1{padding-left:calc(var(--spacing)*1)}.pl-2{padding-left:calc(var(--spacing)*2)}.pl-3{padding-left:calc(var(--spacing)*3)}.pl-4{padding-left:calc(var(--spacing)*4)}.pl-5{padding-left:calc(var(--spacing)*5)}.pl-6{padding-left:calc(var(--spacing)*6)}.pl-8{padding-left:calc(var(--spacing)*8)}.pl-10{padding-left:calc(var(--spacing)*10)}.pl-12{padding-left:calc(var(--spacing)*12)}.pl-16{padding-left:calc(var(--spacing)*16)}.text-center{text-align:center}.text-end{text-align:end}.text-justify{text-align:justify}.text-left{text-align:left}.text-right{text-align:right}.text-start{text-align:start}.indent-0{text-indent:calc(var(--spacing)*0)}.indent-1{text-indent:calc(var(--spacing)*1)}.indent-2{text-indent:calc(var(--spacing)*2)}.indent-4{text-indent:calc(var(--spacing)*4)}.indent-8{text-indent:calc(var(--spacing)*8)}.align-baseline{vertical-align:baseline}.align-bottom{vertical-align:bottom}.align-middle{vertical-align:middle}.align-sub{vertical-align:sub}.align-super{vertical-align:super}.align-text-bottom{vertical-align:text-bottom}.align-text-top{vertical-align:text-top}.align-top{vertical-align:top}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}.text-7xl{font-size:var(--text-7xl);line-height:var(--tw-leading,var(--text-7xl--line-height))}.text-8xl{font-size:var(--text-8xl);line-height:var(--tw-leading,var(--text-8xl--line-height))}.text-9xl{font-size:var(--text-9xl);line-height:var(--tw-leading,var(--text-9xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.leading-3{--tw-leading:calc(var(--spacing)*3);line-height:calc(var(--spacing)*3)}.leading-4{--tw-leading:calc(var(--spacing)*4);line-height:calc(var(--spacing)*4)}.leading-5{--tw-leading:calc(var(--spacing)*5);line-height:calc(var(--spacing)*5)}.leading-6{--tw-leading:calc(var(--spacing)*6);line-height:calc(var(--spacing)*6)}.leading-7{--tw-leading:calc(var(--spacing)*7);line-height:calc(var(--spacing)*7)}.leading-8{--tw-leading:calc(var(--spacing)*8);line-height:calc(var(--spacing)*8)}.leading-9{--tw-leading:calc(var(--spacing)*9);line-height:calc(var(--spacing)*9)}.leading-10{--tw-leading:calc(var(--spacing)*10);line-height:calc(var(--spacing)*10)}.leading-loose{--tw-leading:var(--leading-loose);line-height:var(--leading-loose)}.leading-none{--tw-leading:1;line-height:1}.leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-extralight{--tw-font-weight:var(--font-weight-extralight);font-weight:var(--font-weight-extralight)}.font-light{--tw-font-weight:var(--font-weight-light);font-weight:var(--font-weight-light)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.font-thin{--tw-font-weight:var(--font-weight-thin);font-weight:var(--font-weight-thin)}.tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-tighter{--tw-tracking:var(--tracking-tighter);letter-spacing:var(--tracking-tighter)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.break-normal{overflow-wrap:normal;word-break:normal}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.break-keep{word-break:keep-all}.text-clip{text-overflow:clip}.text-ellipsis{text-overflow:ellipsis}.\!whitespace-normal{white-space:normal!important}.whitespace-break-spaces{white-space:break-spaces}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.text-\[\#000000\]\/85{color:oklab(0% none none/.85)}.text-amber-50{color:var(--color-amber-50)}.text-amber-100{color:var(--color-amber-100)}.text-amber-200{color:var(--color-amber-200)}.text-amber-300{color:var(--color-amber-300)}.text-amber-400{color:var(--color-amber-400)}.text-amber-500{color:var(--color-amber-500)}.text-amber-600{color:var(--color-amber-600)}.text-amber-700{color:var(--color-amber-700)}.text-amber-800{color:var(--color-amber-800)}.text-amber-900{color:var(--color-amber-900)}.text-amber-950{color:var(--color-amber-950)}.text-black{color:var(--color-black)}.text-blue-50{color:var(--color-blue-50)}.text-blue-100{color:var(--color-blue-100)}.text-blue-200{color:var(--color-blue-200)}.text-blue-300{color:var(--color-blue-300)}.text-blue-400{color:var(--color-blue-400)}.text-blue-500{color:var(--color-blue-500)}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-blue-800{color:var(--color-blue-800)}.text-blue-900{color:var(--color-blue-900)}.text-blue-950{color:var(--color-blue-950)}.text-current{color:currentColor}.text-cyan-50{color:var(--color-cyan-50)}.text-cyan-100{color:var(--color-cyan-100)}.text-cyan-200{color:var(--color-cyan-200)}.text-cyan-300{color:var(--color-cyan-300)}.text-cyan-400{color:var(--color-cyan-400)}.text-cyan-500{color:var(--color-cyan-500)}.text-cyan-600{color:var(--color-cyan-600)}.text-cyan-700{color:var(--color-cyan-700)}.text-cyan-800{color:var(--color-cyan-800)}.text-cyan-900{color:var(--color-cyan-900)}.text-cyan-950{color:var(--color-cyan-950)}.text-emerald-50{color:var(--color-emerald-50)}.text-emerald-100{color:var(--color-emerald-100)}.text-emerald-200{color:var(--color-emerald-200)}.text-emerald-300{color:var(--color-emerald-300)}.text-emerald-400{color:var(--color-emerald-400)}.text-emerald-500{color:var(--color-emerald-500)}.text-emerald-600{color:var(--color-emerald-600)}.text-emerald-700{color:var(--color-emerald-700)}.text-emerald-800{color:var(--color-emerald-800)}.text-emerald-900{color:var(--color-emerald-900)}.text-emerald-950{color:var(--color-emerald-950)}.text-fuchsia-50{color:var(--color-fuchsia-50)}.text-fuchsia-100{color:var(--color-fuchsia-100)}.text-fuchsia-200{color:var(--color-fuchsia-200)}.text-fuchsia-300{color:var(--color-fuchsia-300)}.text-fuchsia-400{color:var(--color-fuchsia-400)}.text-fuchsia-500{color:var(--color-fuchsia-500)}.text-fuchsia-600{color:var(--color-fuchsia-600)}.text-fuchsia-700{color:var(--color-fuchsia-700)}.text-fuchsia-800{color:var(--color-fuchsia-800)}.text-fuchsia-900{color:var(--color-fuchsia-900)}.text-fuchsia-950{color:var(--color-fuchsia-950)}.text-gray-50{color:var(--color-gray-50)}.text-gray-100{color:var(--color-gray-100)}.text-gray-200{color:var(--color-gray-200)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-gray-900{color:var(--color-gray-900)}.text-gray-950{color:var(--color-gray-950)}.text-green-50{color:var(--color-green-50)}.text-green-100{color:var(--color-green-100)}.text-green-200{color:var(--color-green-200)}.text-green-300{color:var(--color-green-300)}.text-green-400{color:var(--color-green-400)}.text-green-500{color:var(--color-green-500)}.text-green-600{color:var(--color-green-600)}.text-green-700{color:var(--color-green-700)}.text-green-800{color:var(--color-green-800)}.text-green-900{color:var(--color-green-900)}.text-green-950{color:var(--color-green-950)}.text-indigo-50{color:var(--color-indigo-50)}.text-indigo-100{color:var(--color-indigo-100)}.text-indigo-200{color:var(--color-indigo-200)}.text-indigo-300{color:var(--color-indigo-300)}.text-indigo-400{color:var(--color-indigo-400)}.text-indigo-500{color:var(--color-indigo-500)}.text-indigo-600{color:var(--color-indigo-600)}.text-indigo-700{color:var(--color-indigo-700)}.text-indigo-800{color:var(--color-indigo-800)}.text-indigo-900{color:var(--color-indigo-900)}.text-indigo-950{color:var(--color-indigo-950)}.text-inherit{color:inherit}.text-lime-50{color:var(--color-lime-50)}.text-lime-100{color:var(--color-lime-100)}.text-lime-200{color:var(--color-lime-200)}.text-lime-300{color:var(--color-lime-300)}.text-lime-400{color:var(--color-lime-400)}.text-lime-500{color:var(--color-lime-500)}.text-lime-600{color:var(--color-lime-600)}.text-lime-700{color:var(--color-lime-700)}.text-lime-800{color:var(--color-lime-800)}.text-lime-900{color:var(--color-lime-900)}.text-lime-950{color:var(--color-lime-950)}.text-neutral-50{color:var(--color-neutral-50)}.text-neutral-100{color:var(--color-neutral-100)}.text-neutral-200{color:var(--color-neutral-200)}.text-neutral-300{color:var(--color-neutral-300)}.text-neutral-400{color:var(--color-neutral-400)}.text-neutral-500{color:var(--color-neutral-500)}.text-neutral-600{color:var(--color-neutral-600)}.text-neutral-700{color:var(--color-neutral-700)}.text-neutral-800{color:var(--color-neutral-800)}.text-neutral-900{color:var(--color-neutral-900)}.text-neutral-950{color:var(--color-neutral-950)}.text-orange-50{color:var(--color-orange-50)}.text-orange-100{color:var(--color-orange-100)}.text-orange-200{color:var(--color-orange-200)}.text-orange-300{color:var(--color-orange-300)}.text-orange-400{color:var(--color-orange-400)}.text-orange-500{color:var(--color-orange-500)}.text-orange-600{color:var(--color-orange-600)}.text-orange-700{color:var(--color-orange-700)}.text-orange-800{color:var(--color-orange-800)}.text-orange-900{color:var(--color-orange-900)}.text-orange-950{color:var(--color-orange-950)}.text-pink-50{color:var(--color-pink-50)}.text-pink-100{color:var(--color-pink-100)}.text-pink-200{color:var(--color-pink-200)}.text-pink-300{color:var(--color-pink-300)}.text-pink-400{color:var(--color-pink-400)}.text-pink-500{color:var(--color-pink-500)}.text-pink-600{color:var(--color-pink-600)}.text-pink-700{color:var(--color-pink-700)}.text-pink-800{color:var(--color-pink-800)}.text-pink-900{color:var(--color-pink-900)}.text-pink-950{color:var(--color-pink-950)}.text-primary-400{color:var(--color-primary-400)}.text-primary-600{color:var(--color-primary-600)}.text-purple-50{color:var(--color-purple-50)}.text-purple-100{color:var(--color-purple-100)}.text-purple-200{color:var(--color-purple-200)}.text-purple-300{color:var(--color-purple-300)}.text-purple-400{color:var(--color-purple-400)}.text-purple-500{color:var(--color-purple-500)}.text-purple-600{color:var(--color-purple-600)}.text-purple-700{color:var(--color-purple-700)}.text-purple-800{color:var(--color-purple-800)}.text-purple-900{color:var(--color-purple-900)}.text-purple-950{color:var(--color-purple-950)}.text-red-50{color:var(--color-red-50)}.text-red-100{color:var(--color-red-100)}.text-red-200{color:var(--color-red-200)}.text-red-300{color:var(--color-red-300)}.text-red-400{color:var(--color-red-400)}.text-red-500{color:var(--color-red-500)}.text-red-600{color:var(--color-red-600)}.text-red-700{color:var(--color-red-700)}.text-red-800{color:var(--color-red-800)}.text-red-900{color:var(--color-red-900)}.text-red-950{color:var(--color-red-950)}.text-rose-50{color:var(--color-rose-50)}.text-rose-100{color:var(--color-rose-100)}.text-rose-200{color:var(--color-rose-200)}.text-rose-300{color:var(--color-rose-300)}.text-rose-400{color:var(--color-rose-400)}.text-rose-500{color:var(--color-rose-500)}.text-rose-600{color:var(--color-rose-600)}.text-rose-700{color:var(--color-rose-700)}.text-rose-800{color:var(--color-rose-800)}.text-rose-900{color:var(--color-rose-900)}.text-rose-950{color:var(--color-rose-950)}.text-sky-50{color:var(--color-sky-50)}.text-sky-100{color:var(--color-sky-100)}.text-sky-200{color:var(--color-sky-200)}.text-sky-300{color:var(--color-sky-300)}.text-sky-400{color:var(--color-sky-400)}.text-sky-500{color:var(--color-sky-500)}.text-sky-600{color:var(--color-sky-600)}.text-sky-700{color:var(--color-sky-700)}.text-sky-800{color:var(--color-sky-800)}.text-sky-900{color:var(--color-sky-900)}.text-sky-950{color:var(--color-sky-950)}.text-slate-50{color:var(--color-slate-50)}.text-slate-100{color:var(--color-slate-100)}.text-slate-200{color:var(--color-slate-200)}.text-slate-300{color:var(--color-slate-300)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-slate-700{color:var(--color-slate-700)}.text-slate-800{color:var(--color-slate-800)}.text-slate-900{color:var(--color-slate-900)}.text-slate-950{color:var(--color-slate-950)}.text-stone-50{color:var(--color-stone-50)}.text-stone-100{color:var(--color-stone-100)}.text-stone-200{color:var(--color-stone-200)}.text-stone-300{color:var(--color-stone-300)}.text-stone-400{color:var(--color-stone-400)}.text-stone-500{color:var(--color-stone-500)}.text-stone-600{color:var(--color-stone-600)}.text-stone-700{color:var(--color-stone-700)}.text-stone-800{color:var(--color-stone-800)}.text-stone-900{color:var(--color-stone-900)}.text-stone-950{color:var(--color-stone-950)}.text-teal-50{color:var(--color-teal-50)}.text-teal-100{color:var(--color-teal-100)}.text-teal-200{color:var(--color-teal-200)}.text-teal-300{color:var(--color-teal-300)}.text-teal-400{color:var(--color-teal-400)}.text-teal-500{color:var(--color-teal-500)}.text-teal-600{color:var(--color-teal-600)}.text-teal-700{color:var(--color-teal-700)}.text-teal-800{color:var(--color-teal-800)}.text-teal-900{color:var(--color-teal-900)}.text-teal-950{color:var(--color-teal-950)}.text-transparent{color:#0000}.text-violet-50{color:var(--color-violet-50)}.text-violet-100{color:var(--color-violet-100)}.text-violet-200{color:var(--color-violet-200)}.text-violet-300{color:var(--color-violet-300)}.text-violet-400{color:var(--color-violet-400)}.text-violet-500{color:var(--color-violet-500)}.text-violet-600{color:var(--color-violet-600)}.text-violet-700{color:var(--color-violet-700)}.text-violet-800{color:var(--color-violet-800)}.text-violet-900{color:var(--color-violet-900)}.text-violet-950{color:var(--color-violet-950)}.text-white{color:var(--color-white)}.text-yellow-50{color:var(--color-yellow-50)}.text-yellow-100{color:var(--color-yellow-100)}.text-yellow-200{color:var(--color-yellow-200)}.text-yellow-300{color:var(--color-yellow-300)}.text-yellow-400{color:var(--color-yellow-400)}.text-yellow-500{color:var(--color-yellow-500)}.text-yellow-600{color:var(--color-yellow-600)}.text-yellow-700{color:var(--color-yellow-700)}.text-yellow-800{color:var(--color-yellow-800)}.text-yellow-900{color:var(--color-yellow-900)}.text-yellow-950{color:var(--color-yellow-950)}.text-zinc-50{color:var(--color-zinc-50)}.text-zinc-100{color:var(--color-zinc-100)}.text-zinc-200{color:var(--color-zinc-200)}.text-zinc-300{color:var(--color-zinc-300)}.text-zinc-400{color:var(--color-zinc-400)}.text-zinc-500{color:var(--color-zinc-500)}.text-zinc-600{color:var(--color-zinc-600)}.text-zinc-700{color:var(--color-zinc-700)}.text-zinc-800{color:var(--color-zinc-800)}.text-zinc-900{color:var(--color-zinc-900)}.text-zinc-950{color:var(--color-zinc-950)}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.normal-case{text-transform:none}.uppercase{text-transform:uppercase}.italic{font-style:italic}.not-italic{font-style:normal}.line-through{text-decoration-line:line-through}.no-underline{text-decoration-line:none}.overline{text-decoration-line:overline}.underline{text-decoration-line:underline}.placeholder-gray-400::placeholder{color:var(--color-gray-400)}.placeholder-gray-500::placeholder{color:var(--color-gray-500)}.accent-black{accent-color:var(--color-black)}.accent-blue-600{accent-color:var(--color-blue-600)}.accent-gray-900{accent-color:var(--color-gray-900)}.opacity-0{opacity:0}.opacity-5{opacity:.05}.opacity-10{opacity:.1}.opacity-15{opacity:.15}.opacity-20{opacity:.2}.opacity-25{opacity:.25}.opacity-30{opacity:.3}.opacity-35{opacity:.35}.opacity-40{opacity:.4}.opacity-45{opacity:.45}.opacity-50{opacity:.5}.opacity-55{opacity:.55}.opacity-60{opacity:.6}.opacity-65{opacity:.65}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-85{opacity:.85}.opacity-90{opacity:.9}.opacity-95{opacity:.95}.opacity-100{opacity:1}.bg-blend-color{background-blend-mode:color}.bg-blend-color-burn{background-blend-mode:color-burn}.bg-blend-color-dodge{background-blend-mode:color-dodge}.bg-blend-darken{background-blend-mode:darken}.bg-blend-difference{background-blend-mode:difference}.bg-blend-exclusion{background-blend-mode:exclusion}.bg-blend-hard-light{background-blend-mode:hard-light}.bg-blend-hue{background-blend-mode:hue}.bg-blend-lighten{background-blend-mode:lighten}.bg-blend-luminosity{background-blend-mode:luminosity}.bg-blend-multiply{background-blend-mode:multiply}.bg-blend-normal{background-blend-mode:normal}.bg-blend-overlay{background-blend-mode:overlay}.bg-blend-saturation{background-blend-mode:saturation}.bg-blend-screen{background-blend-mode:screen}.bg-blend-soft-light{background-blend-mode:soft-light}.mix-blend-color{mix-blend-mode:color}.mix-blend-color-burn{mix-blend-mode:color-burn}.mix-blend-color-dodge{mix-blend-mode:color-dodge}.mix-blend-darken{mix-blend-mode:darken}.mix-blend-difference{mix-blend-mode:difference}.mix-blend-exclusion{mix-blend-mode:exclusion}.mix-blend-hard-light{mix-blend-mode:hard-light}.mix-blend-hue{mix-blend-mode:hue}.mix-blend-lighten{mix-blend-mode:lighten}.mix-blend-luminosity{mix-blend-mode:luminosity}.mix-blend-multiply{mix-blend-mode:multiply}.mix-blend-normal{mix-blend-mode:normal}.mix-blend-overlay{mix-blend-mode:overlay}.mix-blend-plus-darker{mix-blend-mode:plus-darker}.mix-blend-plus-lighter{mix-blend-mode:plus-lighter}.mix-blend-saturation{mix-blend-mode:saturation}.mix-blend-screen{mix-blend-mode:screen}.mix-blend-soft-light{mix-blend-mode:soft-light}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-inner{--tw-shadow:inset 0 2px 4px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-0{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-4{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(4px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-8{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(8px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-black{--tw-ring-color:var(--color-black)}.ring-blue-50{--tw-ring-color:var(--color-blue-50)}.ring-blue-100{--tw-ring-color:var(--color-blue-100)}.ring-blue-200{--tw-ring-color:var(--color-blue-200)}.ring-blue-300{--tw-ring-color:var(--color-blue-300)}.ring-blue-400{--tw-ring-color:var(--color-blue-400)}.ring-blue-500{--tw-ring-color:var(--color-blue-500)}.ring-blue-600{--tw-ring-color:var(--color-blue-600)}.ring-blue-700{--tw-ring-color:var(--color-blue-700)}.ring-blue-800{--tw-ring-color:var(--color-blue-800)}.ring-blue-900{--tw-ring-color:var(--color-blue-900)}.ring-current{--tw-ring-color:currentcolor}.ring-gray-50{--tw-ring-color:var(--color-gray-50)}.ring-gray-100{--tw-ring-color:var(--color-gray-100)}.ring-gray-200{--tw-ring-color:var(--color-gray-200)}.ring-gray-300{--tw-ring-color:var(--color-gray-300)}.ring-gray-400{--tw-ring-color:var(--color-gray-400)}.ring-gray-500{--tw-ring-color:var(--color-gray-500)}.ring-gray-600{--tw-ring-color:var(--color-gray-600)}.ring-gray-700{--tw-ring-color:var(--color-gray-700)}.ring-gray-800{--tw-ring-color:var(--color-gray-800)}.ring-gray-900{--tw-ring-color:var(--color-gray-900)}.ring-inherit{--tw-ring-color:inherit}.ring-red-500{--tw-ring-color:var(--color-red-500)}.ring-slate-50{--tw-ring-color:var(--color-slate-50)}.ring-slate-100{--tw-ring-color:var(--color-slate-100)}.ring-slate-200{--tw-ring-color:var(--color-slate-200)}.ring-slate-300{--tw-ring-color:var(--color-slate-300)}.ring-slate-400{--tw-ring-color:var(--color-slate-400)}.ring-slate-500{--tw-ring-color:var(--color-slate-500)}.ring-slate-600{--tw-ring-color:var(--color-slate-600)}.ring-slate-700{--tw-ring-color:var(--color-slate-700)}.ring-slate-800{--tw-ring-color:var(--color-slate-800)}.ring-slate-900{--tw-ring-color:var(--color-slate-900)}.ring-transparent{--tw-ring-color:transparent}.ring-white{--tw-ring-color:var(--color-white)}.ring-offset-0{--tw-ring-offset-width:0px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.ring-offset-1{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.ring-offset-2{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.ring-offset-4{--tw-ring-offset-width:4px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.ring-offset-8{--tw-ring-offset-width:8px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.ring-offset-black{--tw-ring-offset-color:var(--color-black)}.ring-offset-current{--tw-ring-offset-color:currentcolor}.ring-offset-inherit{--tw-ring-offset-color:inherit}.ring-offset-transparent{--tw-ring-offset-color:transparent}.ring-offset-white{--tw-ring-offset-color:var(--color-white)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.outline-0{outline-style:var(--tw-outline-style);outline-width:0}.outline-1{outline-style:var(--tw-outline-style);outline-width:1px}.outline-2{outline-style:var(--tw-outline-style);outline-width:2px}.outline-4{outline-style:var(--tw-outline-style);outline-width:4px}.outline-8{outline-style:var(--tw-outline-style);outline-width:8px}.outline-offset-0{outline-offset:0px}.outline-offset-1{outline-offset:1px}.outline-offset-2{outline-offset:2px}.outline-offset-4{outline-offset:4px}.outline-offset-8{outline-offset:8px}.outline-black{outline-color:var(--color-black)}.outline-current{outline-color:currentColor}.outline-inherit{outline-color:inherit}.outline-transparent{outline-color:#0000}.outline-white{outline-color:var(--color-white)}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.blur-2xl{--tw-blur:blur(var(--blur-2xl));filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.blur-3xl{--tw-blur:blur(var(--blur-3xl));filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.blur-lg{--tw-blur:blur(var(--blur-lg));filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.blur-md{--tw-blur:blur(var(--blur-md));filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.blur-none{--tw-blur: ;filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.blur-sm{--tw-blur:blur(var(--blur-sm));filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.blur-xl{--tw-blur:blur(var(--blur-xl));filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.brightness-0{--tw-brightness:brightness(0%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.brightness-50{--tw-brightness:brightness(50%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.brightness-75{--tw-brightness:brightness(75%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.brightness-90{--tw-brightness:brightness(90%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.brightness-95{--tw-brightness:brightness(95%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.brightness-100{--tw-brightness:brightness(100%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.brightness-105{--tw-brightness:brightness(105%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.brightness-110{--tw-brightness:brightness(110%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.brightness-125{--tw-brightness:brightness(125%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.brightness-150{--tw-brightness:brightness(150%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.brightness-200{--tw-brightness:brightness(200%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.contrast-0{--tw-contrast:contrast(0%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.contrast-50{--tw-contrast:contrast(50%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.contrast-75{--tw-contrast:contrast(75%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.contrast-100{--tw-contrast:contrast(100%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.contrast-125{--tw-contrast:contrast(125%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.contrast-150{--tw-contrast:contrast(150%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.contrast-200{--tw-contrast:contrast(200%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.drop-shadow{--tw-drop-shadow-size:drop-shadow(0 1px 2px var(--tw-drop-shadow-color,#0000001a))drop-shadow(0 1px 1px var(--tw-drop-shadow-color,#0000000f));--tw-drop-shadow:drop-shadow(0 1px 2px #0000001a)drop-shadow(0 1px 1px #0000000f);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.drop-shadow-2xl{--tw-drop-shadow-size:drop-shadow(0 25px 25px var(--tw-drop-shadow-color,#00000026));--tw-drop-shadow:drop-shadow(var(--drop-shadow-2xl));filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.drop-shadow-lg{--tw-drop-shadow-size:drop-shadow(0 4px 4px var(--tw-drop-shadow-color,#00000026));--tw-drop-shadow:drop-shadow(var(--drop-shadow-lg));filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.drop-shadow-md{--tw-drop-shadow-size:drop-shadow(0 3px 3px var(--tw-drop-shadow-color,#0000001f));--tw-drop-shadow:drop-shadow(var(--drop-shadow-md));filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.drop-shadow-sm{--tw-drop-shadow-size:drop-shadow(0 1px 2px var(--tw-drop-shadow-color,#00000026));--tw-drop-shadow:drop-shadow(var(--drop-shadow-sm));filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.drop-shadow-xl{--tw-drop-shadow-size:drop-shadow(0 9px 7px var(--tw-drop-shadow-color,#0000001a));--tw-drop-shadow:drop-shadow(var(--drop-shadow-xl));filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.drop-shadow-none{--tw-drop-shadow: ;filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.grayscale{--tw-grayscale:grayscale(100%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.grayscale-0{--tw-grayscale:grayscale(0%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.-hue-rotate-15{--tw-hue-rotate:hue-rotate( -15deg );filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.-hue-rotate-30{--tw-hue-rotate:hue-rotate( -30deg );filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.-hue-rotate-60{--tw-hue-rotate:hue-rotate( -60deg );filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.-hue-rotate-90{--tw-hue-rotate:hue-rotate( -90deg );filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.-hue-rotate-180{--tw-hue-rotate:hue-rotate( -180deg );filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.hue-rotate-0{--tw-hue-rotate:hue-rotate(0deg);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.hue-rotate-15{--tw-hue-rotate:hue-rotate(15deg);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.hue-rotate-30{--tw-hue-rotate:hue-rotate(30deg);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.hue-rotate-60{--tw-hue-rotate:hue-rotate(60deg);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.hue-rotate-90{--tw-hue-rotate:hue-rotate(90deg);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.hue-rotate-180{--tw-hue-rotate:hue-rotate(180deg);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.invert-0{--tw-invert:invert(0%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.saturate-0{--tw-saturate:saturate(0%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.saturate-50{--tw-saturate:saturate(50%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.saturate-100{--tw-saturate:saturate(100%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.saturate-150{--tw-saturate:saturate(150%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.saturate-200{--tw-saturate:saturate(200%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.sepia{--tw-sepia:sepia(100%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.sepia-0{--tw-sepia:sepia(0%);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-2xl{--tw-backdrop-blur:blur(var(--blur-2xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-3xl{--tw-backdrop-blur:blur(var(--blur-3xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-lg{--tw-backdrop-blur:blur(var(--blur-lg));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-md{--tw-backdrop-blur:blur(var(--blur-md));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-none{--tw-backdrop-blur: ;-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-blur-xl{--tw-backdrop-blur:blur(var(--blur-xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-brightness-0{--tw-backdrop-brightness:brightness(0%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-brightness-50{--tw-backdrop-brightness:brightness(50%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-brightness-75{--tw-backdrop-brightness:brightness(75%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-brightness-90{--tw-backdrop-brightness:brightness(90%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-brightness-95{--tw-backdrop-brightness:brightness(95%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-brightness-100{--tw-backdrop-brightness:brightness(100%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-brightness-105{--tw-backdrop-brightness:brightness(105%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-brightness-110{--tw-backdrop-brightness:brightness(110%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-brightness-125{--tw-backdrop-brightness:brightness(125%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-brightness-150{--tw-backdrop-brightness:brightness(150%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-brightness-200{--tw-backdrop-brightness:brightness(200%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-contrast-0{--tw-backdrop-contrast:contrast(0%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-contrast-50{--tw-backdrop-contrast:contrast(50%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-contrast-75{--tw-backdrop-contrast:contrast(75%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-contrast-100{--tw-backdrop-contrast:contrast(100%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-contrast-125{--tw-backdrop-contrast:contrast(125%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-contrast-150{--tw-backdrop-contrast:contrast(150%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-contrast-200{--tw-backdrop-contrast:contrast(200%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-grayscale{--tw-backdrop-grayscale:grayscale(100%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-grayscale-0{--tw-backdrop-grayscale:grayscale(0%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-hue-rotate-0{--tw-backdrop-hue-rotate:hue-rotate(0deg);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-hue-rotate-15{--tw-backdrop-hue-rotate:hue-rotate(15deg);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-hue-rotate-30{--tw-backdrop-hue-rotate:hue-rotate(30deg);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-hue-rotate-60{--tw-backdrop-hue-rotate:hue-rotate(60deg);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-hue-rotate-90{--tw-backdrop-hue-rotate:hue-rotate(90deg);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-hue-rotate-180{--tw-backdrop-hue-rotate:hue-rotate(180deg);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-invert{--tw-backdrop-invert:invert(100%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-invert-0{--tw-backdrop-invert:invert(0%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-opacity-0{--tw-backdrop-opacity:opacity(0%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-opacity-5{--tw-backdrop-opacity:opacity(5%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-opacity-10{--tw-backdrop-opacity:opacity(10%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-opacity-20{--tw-backdrop-opacity:opacity(20%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-opacity-25{--tw-backdrop-opacity:opacity(25%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-opacity-30{--tw-backdrop-opacity:opacity(30%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-opacity-40{--tw-backdrop-opacity:opacity(40%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-opacity-50{--tw-backdrop-opacity:opacity(50%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-opacity-60{--tw-backdrop-opacity:opacity(60%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-opacity-70{--tw-backdrop-opacity:opacity(70%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-opacity-75{--tw-backdrop-opacity:opacity(75%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-opacity-80{--tw-backdrop-opacity:opacity(80%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-opacity-90{--tw-backdrop-opacity:opacity(90%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-opacity-95{--tw-backdrop-opacity:opacity(95%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-opacity-100{--tw-backdrop-opacity:opacity(100%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-saturate-0{--tw-backdrop-saturate:saturate(0%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-saturate-50{--tw-backdrop-saturate:saturate(50%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-saturate-100{--tw-backdrop-saturate:saturate(100%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-saturate-150{--tw-backdrop-saturate:saturate(150%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-saturate-200{--tw-backdrop-saturate:saturate(200%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-sepia{--tw-backdrop-sepia:sepia(100%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.backdrop-sepia-0{--tw-backdrop-sepia:sepia(0%);-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\[max-height\]{transition-property:max-height;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-none{transition-property:none}.delay-75{transition-delay:75ms}.delay-100{transition-delay:.1s}.delay-150{transition-delay:.15s}.delay-200{transition-delay:.2s}.delay-300{transition-delay:.3s}.delay-500{transition-delay:.5s}.delay-700{transition-delay:.7s}.delay-1000{transition-delay:1s}.duration-75{--tw-duration:75ms;transition-duration:75ms}.duration-100{--tw-duration:.1s;transition-duration:.1s}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.duration-500{--tw-duration:.5s;transition-duration:.5s}.duration-700{--tw-duration:.7s;transition-duration:.7s}.duration-1000{--tw-duration:1s;transition-duration:1s}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.ease-linear{--tw-ease:linear;transition-timing-function:linear}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}.outline-dashed{--tw-outline-style:dashed;outline-style:dashed}.outline-dotted{--tw-outline-style:dotted;outline-style:dotted}.outline-double{--tw-outline-style:double;outline-style:double}.outline-none{--tw-outline-style:none;outline-style:none}.select-all{-webkit-user-select:all;user-select:all}.select-auto{-webkit-user-select:auto;user-select:auto}.select-none{-webkit-user-select:none;user-select:none}.select-text{-webkit-user-select:text;user-select:text}:where(.divide-x-reverse>:not(:last-child)){--tw-divide-x-reverse:1}.ring-inset{--tw-ring-inset:inset}@media(hover:hover){.group-hover\:visible:is(:where(.group):hover *){visibility:visible}.group-hover\:translate-x-1:is(:where(.group):hover *){--tw-translate-x:calc(var(--spacing)*1);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-hover\:translate-y-1:is(:where(.group):hover *){--tw-translate-y:calc(var(--spacing)*1);translate:var(--tw-translate-x)var(--tw-translate-y)}.group-hover\:scale-100:is(:where(.group):hover *){--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.group-hover\:scale-105:is(:where(.group):hover *){--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x)var(--tw-scale-y)}.group-hover\:bg-black\/40:is(:where(.group):hover *){background-color:#0006}@supports (color:color-mix(in lab,red,red)){.group-hover\:bg-black\/40:is(:where(.group):hover *){background-color:color-mix(in oklab,var(--color-black)40%,transparent)}}.group-hover\:bg-blue-100:is(:where(.group):hover *){background-color:var(--color-blue-100)}.group-hover\:bg-blue-500:is(:where(.group):hover *){background-color:var(--color-blue-500)}.group-hover\:bg-blue-600:is(:where(.group):hover *){background-color:var(--color-blue-600)}.group-hover\:bg-gray-100:is(:where(.group):hover *){background-color:var(--color-gray-100)}.group-hover\:bg-gray-200:is(:where(.group):hover *){background-color:var(--color-gray-200)}.group-hover\:bg-gray-700:is(:where(.group):hover *){background-color:var(--color-gray-700)}.group-hover\:bg-gray-800:is(:where(.group):hover *){background-color:var(--color-gray-800)}.group-hover\:text-black:is(:where(.group):hover *){color:var(--color-black)}.group-hover\:text-blue-500:is(:where(.group):hover *){color:var(--color-blue-500)}.group-hover\:text-blue-600:is(:where(.group):hover *){color:var(--color-blue-600)}.group-hover\:text-blue-700:is(:where(.group):hover *){color:var(--color-blue-700)}.group-hover\:text-gray-700:is(:where(.group):hover *){color:var(--color-gray-700)}.group-hover\:text-gray-800:is(:where(.group):hover *){color:var(--color-gray-800)}.group-hover\:text-gray-900:is(:where(.group):hover *){color:var(--color-gray-900)}.group-hover\:text-white:is(:where(.group):hover *){color:var(--color-white)}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.group-focus\:border-blue-500:is(:where(.group):focus *){border-color:var(--color-blue-500)}.group-focus\:ring-2:is(:where(.group):focus *){--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.peer-checked\:border-blue-500:is(:where(.peer):checked~*){border-color:var(--color-blue-500)}.peer-checked\:bg-blue-500:is(:where(.peer):checked~*){background-color:var(--color-blue-500)}.peer-invalid\:border-red-500:is(:where(.peer):invalid~*){border-color:var(--color-red-500)}.peer-invalid\:text-red-500:is(:where(.peer):invalid~*){color:var(--color-red-500)}.peer-focus\:border-blue-500:is(:where(.peer):focus~*){border-color:var(--color-blue-500)}.peer-focus\:ring-2:is(:where(.peer):focus~*){--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.peer-disabled\:cursor-not-allowed:is(:where(.peer):disabled~*){cursor:not-allowed}.peer-disabled\:opacity-50:is(:where(.peer):disabled~*){opacity:.5}.first-letter\:text-2xl:first-letter{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.first-letter\:font-bold:first-letter{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.first-letter\:text-blue-600:first-letter{color:var(--color-blue-600)}.first-line\:font-semibold:first-line{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.first-line\:text-gray-700:first-line{color:var(--color-gray-700)}.marker\:text-blue-500 ::marker{color:var(--color-blue-500)}.marker\:text-blue-500::marker{color:var(--color-blue-500)}.marker\:text-blue-500 ::-webkit-details-marker{color:var(--color-blue-500)}.marker\:text-blue-500::-webkit-details-marker{color:var(--color-blue-500)}.marker\:text-gray-500 ::marker{color:var(--color-gray-500)}.marker\:text-gray-500::marker{color:var(--color-gray-500)}.marker\:text-gray-500 ::-webkit-details-marker{color:var(--color-gray-500)}.marker\:text-gray-500::-webkit-details-marker{color:var(--color-gray-500)}.selection\:bg-blue-200 ::selection{background-color:var(--color-blue-200)}.selection\:bg-blue-200::selection{background-color:var(--color-blue-200)}.selection\:text-blue-900 ::selection{color:var(--color-blue-900)}.selection\:text-blue-900::selection{color:var(--color-blue-900)}.file\:mr-4::file-selector-button{margin-right:calc(var(--spacing)*4)}.file\:cursor-pointer::file-selector-button{cursor:pointer}.file\:rounded-full::file-selector-button{border-radius:3.40282e38px}.file\:border-0::file-selector-button{border-style:var(--tw-border-style);border-width:0}.file\:bg-blue-50::file-selector-button{background-color:var(--color-blue-50)}.file\:px-4::file-selector-button{padding-inline:calc(var(--spacing)*4)}.file\:py-2::file-selector-button{padding-block:calc(var(--spacing)*2)}.file\:text-sm::file-selector-button{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.file\:font-semibold::file-selector-button{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.file\:text-blue-700::file-selector-button{color:var(--color-blue-700)}.before\:absolute:before{content:var(--tw-content);position:absolute}.before\:inset-0:before{content:var(--tw-content);inset:calc(var(--spacing)*0)}.before\:block:before{content:var(--tw-content);display:block}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:inset-0:after{content:var(--tw-content);inset:calc(var(--spacing)*0)}.after\:clear-both:after{content:var(--tw-content);clear:both}.after\:block:after{content:var(--tw-content);display:block}.after\:content-\[\'\'\]:after{--tw-content:"";content:var(--tw-content)}.first\:mt-0:first-child{margin-top:calc(var(--spacing)*0)}.first\:rounded-t-lg:first-child{border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg)}.first\:rounded-l-lg:first-child{border-top-left-radius:var(--radius-lg);border-bottom-left-radius:var(--radius-lg)}.first\:border-t-0:first-child{border-top-style:var(--tw-border-style);border-top-width:0}.first\:pt-0:first-child{padding-top:calc(var(--spacing)*0)}.last\:mb-0:last-child{margin-bottom:calc(var(--spacing)*0)}.last\:rounded-r-lg:last-child{border-top-right-radius:var(--radius-lg);border-bottom-right-radius:var(--radius-lg)}.last\:rounded-b-lg:last-child{border-bottom-right-radius:var(--radius-lg);border-bottom-left-radius:var(--radius-lg)}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.last\:pb-0:last-child{padding-bottom:calc(var(--spacing)*0)}.odd\:bg-gray-50:nth-child(odd){background-color:var(--color-gray-50)}.odd\:bg-gray-100:nth-child(odd){background-color:var(--color-gray-100)}.odd\:bg-white:nth-child(odd){background-color:var(--color-white)}.even\:bg-gray-50:nth-child(2n){background-color:var(--color-gray-50)}.even\:bg-gray-100:nth-child(2n){background-color:var(--color-gray-100)}.even\:bg-white:nth-child(2n){background-color:var(--color-white)}.checked\:border-blue-500:checked{border-color:var(--color-blue-500)}.checked\:border-blue-600:checked{border-color:var(--color-blue-600)}.checked\:bg-blue-500:checked{background-color:var(--color-blue-500)}.checked\:bg-blue-600:checked{background-color:var(--color-blue-600)}.checked\:bg-green-500:checked{background-color:var(--color-green-500)}.checked\:text-white:checked{color:var(--color-white)}.indeterminate\:border-gray-400:indeterminate{border-color:var(--color-gray-400)}.indeterminate\:bg-gray-300:indeterminate{background-color:var(--color-gray-300)}.placeholder-shown\:border-gray-300:placeholder-shown{border-color:var(--color-gray-300)}.autofill\:bg-yellow-100:autofill{background-color:var(--color-yellow-100)}.autofill\:text-black:autofill{color:var(--color-black)}.valid\:border-green-500:valid{border-color:var(--color-green-500)}.valid\:text-green-600:valid{color:var(--color-green-600)}.valid\:ring-green-500:valid{--tw-ring-color:var(--color-green-500)}.invalid\:border-red-500:invalid{border-color:var(--color-red-500)}.invalid\:text-red-600:invalid{color:var(--color-red-600)}.invalid\:ring-red-500:invalid{--tw-ring-color:var(--color-red-500)}.read-only\:cursor-not-allowed:read-only{cursor:not-allowed}.read-only\:bg-gray-50:read-only{background-color:var(--color-gray-50)}.read-only\:bg-gray-100:read-only{background-color:var(--color-gray-100)}.empty\:hidden:empty{display:none}.focus-within\:border-blue-500:focus-within{border-color:var(--color-blue-500)}.focus-within\:border-gray-500:focus-within{border-color:var(--color-gray-500)}.focus-within\:ring-2:focus-within{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-within\:ring-blue-500:focus-within{--tw-ring-color:var(--color-blue-500)}.focus-within\:ring-gray-500:focus-within{--tw-ring-color:var(--color-gray-500)}@media(hover:hover){.hover\:scale-95:hover{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x)var(--tw-scale-y)}.hover\:scale-100:hover{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.hover\:scale-105:hover{--tw-scale-x:105%;--tw-scale-y:105%;--tw-scale-z:105%;scale:var(--tw-scale-x)var(--tw-scale-y)}.hover\:scale-110:hover{--tw-scale-x:110%;--tw-scale-y:110%;--tw-scale-z:110%;scale:var(--tw-scale-x)var(--tw-scale-y)}.hover\:border-blue-50:hover{border-color:var(--color-blue-50)}.hover\:border-blue-100:hover{border-color:var(--color-blue-100)}.hover\:border-blue-200:hover{border-color:var(--color-blue-200)}.hover\:border-blue-300:hover{border-color:var(--color-blue-300)}.hover\:border-blue-400:hover{border-color:var(--color-blue-400)}.hover\:border-blue-500:hover{border-color:var(--color-blue-500)}.hover\:border-blue-600:hover{border-color:var(--color-blue-600)}.hover\:border-blue-700:hover{border-color:var(--color-blue-700)}.hover\:border-blue-800:hover{border-color:var(--color-blue-800)}.hover\:border-blue-900:hover{border-color:var(--color-blue-900)}.hover\:border-gray-50:hover{border-color:var(--color-gray-50)}.hover\:border-gray-100:hover{border-color:var(--color-gray-100)}.hover\:border-gray-200:hover{border-color:var(--color-gray-200)}.hover\:border-gray-300:hover{border-color:var(--color-gray-300)}.hover\:border-gray-400:hover{border-color:var(--color-gray-400)}.hover\:border-gray-500:hover{border-color:var(--color-gray-500)}.hover\:border-gray-600:hover{border-color:var(--color-gray-600)}.hover\:border-gray-700:hover{border-color:var(--color-gray-700)}.hover\:border-gray-800:hover{border-color:var(--color-gray-800)}.hover\:border-gray-900:hover{border-color:var(--color-gray-900)}.hover\:bg-black:hover{background-color:var(--color-black)}.hover\:bg-black\/10:hover{background-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.hover\:bg-black\/10:hover{background-color:color-mix(in oklab,var(--color-black)10%,transparent)}}.hover\:bg-blue-50:hover{background-color:var(--color-blue-50)}.hover\:bg-blue-100:hover{background-color:var(--color-blue-100)}.hover\:bg-blue-200:hover{background-color:var(--color-blue-200)}.hover\:bg-blue-300:hover{background-color:var(--color-blue-300)}.hover\:bg-blue-400:hover{background-color:var(--color-blue-400)}.hover\:bg-blue-500:hover{background-color:var(--color-blue-500)}.hover\:bg-blue-600:hover{background-color:var(--color-blue-600)}.hover\:bg-blue-700:hover{background-color:var(--color-blue-700)}.hover\:bg-blue-800:hover{background-color:var(--color-blue-800)}.hover\:bg-blue-900:hover{background-color:var(--color-blue-900)}.hover\:bg-emerald-600:hover{background-color:var(--color-emerald-600)}.hover\:bg-gray-50:hover{background-color:var(--color-gray-50)}.hover\:bg-gray-100:hover{background-color:var(--color-gray-100)}.hover\:bg-gray-200:hover{background-color:var(--color-gray-200)}.hover\:bg-gray-300:hover{background-color:var(--color-gray-300)}.hover\:bg-gray-400:hover{background-color:var(--color-gray-400)}.hover\:bg-gray-500:hover{background-color:var(--color-gray-500)}.hover\:bg-gray-600:hover{background-color:var(--color-gray-600)}.hover\:bg-gray-700:hover{background-color:var(--color-gray-700)}.hover\:bg-gray-800:hover{background-color:var(--color-gray-800)}.hover\:bg-gray-900:hover{background-color:var(--color-gray-900)}.hover\:bg-green-50:hover{background-color:var(--color-green-50)}.hover\:bg-green-100:hover{background-color:var(--color-green-100)}.hover\:bg-green-200:hover{background-color:var(--color-green-200)}.hover\:bg-green-300:hover{background-color:var(--color-green-300)}.hover\:bg-green-400:hover{background-color:var(--color-green-400)}.hover\:bg-green-500:hover{background-color:var(--color-green-500)}.hover\:bg-green-600:hover{background-color:var(--color-green-600)}.hover\:bg-green-700:hover{background-color:var(--color-green-700)}.hover\:bg-green-800:hover{background-color:var(--color-green-800)}.hover\:bg-green-900:hover{background-color:var(--color-green-900)}.hover\:bg-indigo-50:hover{background-color:var(--color-indigo-50)}.hover\:bg-indigo-100:hover{background-color:var(--color-indigo-100)}.hover\:bg-indigo-200:hover{background-color:var(--color-indigo-200)}.hover\:bg-indigo-300:hover{background-color:var(--color-indigo-300)}.hover\:bg-indigo-400:hover{background-color:var(--color-indigo-400)}.hover\:bg-indigo-500:hover{background-color:var(--color-indigo-500)}.hover\:bg-indigo-600:hover{background-color:var(--color-indigo-600)}.hover\:bg-indigo-700:hover{background-color:var(--color-indigo-700)}.hover\:bg-indigo-800:hover{background-color:var(--color-indigo-800)}.hover\:bg-indigo-900:hover{background-color:var(--color-indigo-900)}.hover\:bg-orange-50:hover{background-color:var(--color-orange-50)}.hover\:bg-orange-100:hover{background-color:var(--color-orange-100)}.hover\:bg-orange-200:hover{background-color:var(--color-orange-200)}.hover\:bg-orange-300:hover{background-color:var(--color-orange-300)}.hover\:bg-orange-400:hover{background-color:var(--color-orange-400)}.hover\:bg-orange-500:hover{background-color:var(--color-orange-500)}.hover\:bg-orange-600:hover{background-color:var(--color-orange-600)}.hover\:bg-orange-700:hover{background-color:var(--color-orange-700)}.hover\:bg-orange-800:hover{background-color:var(--color-orange-800)}.hover\:bg-orange-900:hover{background-color:var(--color-orange-900)}.hover\:bg-pink-50:hover{background-color:var(--color-pink-50)}.hover\:bg-pink-100:hover{background-color:var(--color-pink-100)}.hover\:bg-pink-200:hover{background-color:var(--color-pink-200)}.hover\:bg-pink-300:hover{background-color:var(--color-pink-300)}.hover\:bg-pink-400:hover{background-color:var(--color-pink-400)}.hover\:bg-pink-500:hover{background-color:var(--color-pink-500)}.hover\:bg-pink-600:hover{background-color:var(--color-pink-600)}.hover\:bg-pink-700:hover{background-color:var(--color-pink-700)}.hover\:bg-pink-800:hover{background-color:var(--color-pink-800)}.hover\:bg-pink-900:hover{background-color:var(--color-pink-900)}.hover\:bg-primary-700:hover{background-color:var(--color-primary-700)}.hover\:bg-purple-50:hover{background-color:var(--color-purple-50)}.hover\:bg-purple-100:hover{background-color:var(--color-purple-100)}.hover\:bg-purple-200:hover{background-color:var(--color-purple-200)}.hover\:bg-purple-300:hover{background-color:var(--color-purple-300)}.hover\:bg-purple-400:hover{background-color:var(--color-purple-400)}.hover\:bg-purple-500:hover{background-color:var(--color-purple-500)}.hover\:bg-purple-600:hover{background-color:var(--color-purple-600)}.hover\:bg-purple-700:hover{background-color:var(--color-purple-700)}.hover\:bg-purple-800:hover{background-color:var(--color-purple-800)}.hover\:bg-purple-900:hover{background-color:var(--color-purple-900)}.hover\:bg-red-50:hover{background-color:var(--color-red-50)}.hover\:bg-red-100:hover{background-color:var(--color-red-100)}.hover\:bg-red-200:hover{background-color:var(--color-red-200)}.hover\:bg-red-300:hover{background-color:var(--color-red-300)}.hover\:bg-red-400:hover{background-color:var(--color-red-400)}.hover\:bg-red-500:hover{background-color:var(--color-red-500)}.hover\:bg-red-600:hover{background-color:var(--color-red-600)}.hover\:bg-red-700:hover{background-color:var(--color-red-700)}.hover\:bg-red-800:hover{background-color:var(--color-red-800)}.hover\:bg-red-900:hover{background-color:var(--color-red-900)}.hover\:bg-slate-50:hover{background-color:var(--color-slate-50)}.hover\:bg-slate-100:hover{background-color:var(--color-slate-100)}.hover\:bg-slate-200:hover{background-color:var(--color-slate-200)}.hover\:bg-slate-300:hover{background-color:var(--color-slate-300)}.hover\:bg-slate-400:hover{background-color:var(--color-slate-400)}.hover\:bg-slate-500:hover{background-color:var(--color-slate-500)}.hover\:bg-slate-600:hover{background-color:var(--color-slate-600)}.hover\:bg-slate-700:hover{background-color:var(--color-slate-700)}.hover\:bg-slate-800:hover{background-color:var(--color-slate-800)}.hover\:bg-slate-900:hover{background-color:var(--color-slate-900)}.hover\:bg-transparent:hover{background-color:#0000}.hover\:bg-white:hover{background-color:var(--color-white)}.hover\:bg-white\/30:hover{background-color:#ffffff4d}@supports (color:color-mix(in lab,red,red)){.hover\:bg-white\/30:hover{background-color:color-mix(in oklab,var(--color-white)30%,transparent)}}.hover\:bg-yellow-50:hover{background-color:var(--color-yellow-50)}.hover\:bg-yellow-100:hover{background-color:var(--color-yellow-100)}.hover\:bg-yellow-200:hover{background-color:var(--color-yellow-200)}.hover\:bg-yellow-300:hover{background-color:var(--color-yellow-300)}.hover\:bg-yellow-400:hover{background-color:var(--color-yellow-400)}.hover\:bg-yellow-500:hover{background-color:var(--color-yellow-500)}.hover\:bg-yellow-600:hover{background-color:var(--color-yellow-600)}.hover\:bg-yellow-700:hover{background-color:var(--color-yellow-700)}.hover\:bg-yellow-800:hover{background-color:var(--color-yellow-800)}.hover\:bg-yellow-900:hover{background-color:var(--color-yellow-900)}.hover\:text-black:hover{color:var(--color-black)}.hover\:text-blue-50:hover{color:var(--color-blue-50)}.hover\:text-blue-100:hover{color:var(--color-blue-100)}.hover\:text-blue-200:hover{color:var(--color-blue-200)}.hover\:text-blue-300:hover{color:var(--color-blue-300)}.hover\:text-blue-400:hover{color:var(--color-blue-400)}.hover\:text-blue-500:hover{color:var(--color-blue-500)}.hover\:text-blue-600:hover{color:var(--color-blue-600)}.hover\:text-blue-700:hover{color:var(--color-blue-700)}.hover\:text-blue-800:hover{color:var(--color-blue-800)}.hover\:text-blue-900:hover{color:var(--color-blue-900)}.hover\:text-gray-50:hover{color:var(--color-gray-50)}.hover\:text-gray-100:hover{color:var(--color-gray-100)}.hover\:text-gray-200:hover{color:var(--color-gray-200)}.hover\:text-gray-300:hover{color:var(--color-gray-300)}.hover\:text-gray-400:hover{color:var(--color-gray-400)}.hover\:text-gray-500:hover{color:var(--color-gray-500)}.hover\:text-gray-600:hover{color:var(--color-gray-600)}.hover\:text-gray-700:hover{color:var(--color-gray-700)}.hover\:text-gray-800:hover{color:var(--color-gray-800)}.hover\:text-gray-900:hover{color:var(--color-gray-900)}.hover\:text-green-50:hover{color:var(--color-green-50)}.hover\:text-green-100:hover{color:var(--color-green-100)}.hover\:text-green-200:hover{color:var(--color-green-200)}.hover\:text-green-300:hover{color:var(--color-green-300)}.hover\:text-green-400:hover{color:var(--color-green-400)}.hover\:text-green-500:hover{color:var(--color-green-500)}.hover\:text-green-600:hover{color:var(--color-green-600)}.hover\:text-green-700:hover{color:var(--color-green-700)}.hover\:text-green-800:hover{color:var(--color-green-800)}.hover\:text-green-900:hover{color:var(--color-green-900)}.hover\:text-purple-50:hover{color:var(--color-purple-50)}.hover\:text-purple-100:hover{color:var(--color-purple-100)}.hover\:text-purple-200:hover{color:var(--color-purple-200)}.hover\:text-purple-300:hover{color:var(--color-purple-300)}.hover\:text-purple-400:hover{color:var(--color-purple-400)}.hover\:text-purple-500:hover{color:var(--color-purple-500)}.hover\:text-purple-600:hover{color:var(--color-purple-600)}.hover\:text-purple-700:hover{color:var(--color-purple-700)}.hover\:text-purple-800:hover{color:var(--color-purple-800)}.hover\:text-purple-900:hover{color:var(--color-purple-900)}.hover\:text-red-50:hover{color:var(--color-red-50)}.hover\:text-red-100:hover{color:var(--color-red-100)}.hover\:text-red-200:hover{color:var(--color-red-200)}.hover\:text-red-300:hover{color:var(--color-red-300)}.hover\:text-red-400:hover{color:var(--color-red-400)}.hover\:text-red-500:hover{color:var(--color-red-500)}.hover\:text-red-600:hover{color:var(--color-red-600)}.hover\:text-red-700:hover{color:var(--color-red-700)}.hover\:text-red-800:hover{color:var(--color-red-800)}.hover\:text-red-900:hover{color:var(--color-red-900)}.hover\:text-slate-50:hover{color:var(--color-slate-50)}.hover\:text-slate-100:hover{color:var(--color-slate-100)}.hover\:text-slate-200:hover{color:var(--color-slate-200)}.hover\:text-slate-300:hover{color:var(--color-slate-300)}.hover\:text-slate-400:hover{color:var(--color-slate-400)}.hover\:text-slate-500:hover{color:var(--color-slate-500)}.hover\:text-slate-600:hover{color:var(--color-slate-600)}.hover\:text-slate-700:hover{color:var(--color-slate-700)}.hover\:text-slate-800:hover{color:var(--color-slate-800)}.hover\:text-slate-900:hover{color:var(--color-slate-900)}.hover\:text-white:hover{color:var(--color-white)}.hover\:line-through:hover{text-decoration-line:line-through}.hover\:no-underline:hover{text-decoration-line:none}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-0:hover{opacity:0}.hover\:opacity-25:hover{opacity:.25}.hover\:opacity-50:hover{opacity:.5}.hover\:opacity-75:hover{opacity:.75}.hover\:opacity-80:hover{opacity:.8}.hover\:opacity-90:hover{opacity:.9}.hover\:opacity-100:hover{opacity:1}.hover\:shadow:hover{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-2xl:hover{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-lg:hover{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-none:hover{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-sm:hover{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-xl:hover{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:ring-0:hover{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:ring-1:hover{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:ring-2:hover{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:ring-4:hover{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(4px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:ring-8:hover{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(8px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:ring-blue-500:hover{--tw-ring-color:var(--color-blue-500)}.hover\:ring-gray-500:hover{--tw-ring-color:var(--color-gray-500)}.hover\:ring-green-500:hover{--tw-ring-color:var(--color-green-500)}.hover\:ring-red-500:hover{--tw-ring-color:var(--color-red-500)}.file\:hover\:bg-blue-100::file-selector-button:hover{background-color:var(--color-blue-100)}}.focus\:border-blue-50:focus{border-color:var(--color-blue-50)}.focus\:border-blue-100:focus{border-color:var(--color-blue-100)}.focus\:border-blue-200:focus{border-color:var(--color-blue-200)}.focus\:border-blue-300:focus{border-color:var(--color-blue-300)}.focus\:border-blue-400:focus{border-color:var(--color-blue-400)}.focus\:border-blue-500:focus{border-color:var(--color-blue-500)}.focus\:border-blue-600:focus{border-color:var(--color-blue-600)}.focus\:border-blue-700:focus{border-color:var(--color-blue-700)}.focus\:border-blue-800:focus{border-color:var(--color-blue-800)}.focus\:border-blue-900:focus{border-color:var(--color-blue-900)}.focus\:border-gray-50:focus{border-color:var(--color-gray-50)}.focus\:border-gray-100:focus{border-color:var(--color-gray-100)}.focus\:border-gray-200:focus{border-color:var(--color-gray-200)}.focus\:border-gray-300:focus{border-color:var(--color-gray-300)}.focus\:border-gray-400:focus{border-color:var(--color-gray-400)}.focus\:border-gray-500:focus{border-color:var(--color-gray-500)}.focus\:border-gray-600:focus{border-color:var(--color-gray-600)}.focus\:border-gray-700:focus{border-color:var(--color-gray-700)}.focus\:border-gray-800:focus{border-color:var(--color-gray-800)}.focus\:border-gray-900:focus{border-color:var(--color-gray-900)}.focus\:border-green-500:focus{border-color:var(--color-green-500)}.focus\:border-indigo-500:focus{border-color:var(--color-indigo-500)}.focus\:border-purple-500:focus{border-color:var(--color-purple-500)}.focus\:border-red-500:focus{border-color:var(--color-red-500)}.focus\:border-transparent:focus{border-color:#0000}.focus\:border-yellow-500:focus{border-color:var(--color-yellow-500)}.focus\:bg-black:focus{background-color:var(--color-black)}.focus\:bg-blue-50:focus{background-color:var(--color-blue-50)}.focus\:bg-blue-100:focus{background-color:var(--color-blue-100)}.focus\:bg-blue-200:focus{background-color:var(--color-blue-200)}.focus\:bg-blue-300:focus{background-color:var(--color-blue-300)}.focus\:bg-blue-400:focus{background-color:var(--color-blue-400)}.focus\:bg-blue-500:focus{background-color:var(--color-blue-500)}.focus\:bg-blue-600:focus{background-color:var(--color-blue-600)}.focus\:bg-blue-700:focus{background-color:var(--color-blue-700)}.focus\:bg-blue-800:focus{background-color:var(--color-blue-800)}.focus\:bg-blue-900:focus{background-color:var(--color-blue-900)}.focus\:bg-gray-50:focus{background-color:var(--color-gray-50)}.focus\:bg-gray-100:focus{background-color:var(--color-gray-100)}.focus\:bg-gray-200:focus{background-color:var(--color-gray-200)}.focus\:bg-gray-300:focus{background-color:var(--color-gray-300)}.focus\:bg-gray-400:focus{background-color:var(--color-gray-400)}.focus\:bg-gray-500:focus{background-color:var(--color-gray-500)}.focus\:bg-gray-600:focus{background-color:var(--color-gray-600)}.focus\:bg-gray-700:focus{background-color:var(--color-gray-700)}.focus\:bg-gray-800:focus{background-color:var(--color-gray-800)}.focus\:bg-gray-900:focus{background-color:var(--color-gray-900)}.focus\:bg-transparent:focus{background-color:#0000}.focus\:bg-white:focus{background-color:var(--color-white)}.focus\:text-black:focus{color:var(--color-black)}.focus\:text-blue-50:focus{color:var(--color-blue-50)}.focus\:text-blue-100:focus{color:var(--color-blue-100)}.focus\:text-blue-200:focus{color:var(--color-blue-200)}.focus\:text-blue-300:focus{color:var(--color-blue-300)}.focus\:text-blue-400:focus{color:var(--color-blue-400)}.focus\:text-blue-500:focus{color:var(--color-blue-500)}.focus\:text-blue-600:focus{color:var(--color-blue-600)}.focus\:text-blue-700:focus{color:var(--color-blue-700)}.focus\:text-blue-800:focus{color:var(--color-blue-800)}.focus\:text-blue-900:focus{color:var(--color-blue-900)}.focus\:text-gray-50:focus{color:var(--color-gray-50)}.focus\:text-gray-100:focus{color:var(--color-gray-100)}.focus\:text-gray-200:focus{color:var(--color-gray-200)}.focus\:text-gray-300:focus{color:var(--color-gray-300)}.focus\:text-gray-400:focus{color:var(--color-gray-400)}.focus\:text-gray-500:focus{color:var(--color-gray-500)}.focus\:text-gray-600:focus{color:var(--color-gray-600)}.focus\:text-gray-700:focus{color:var(--color-gray-700)}.focus\:text-gray-800:focus{color:var(--color-gray-800)}.focus\:text-gray-900:focus{color:var(--color-gray-900)}.focus\:text-white:focus{color:var(--color-white)}.focus\:shadow:focus{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:shadow-lg:focus{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:shadow-md:focus{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:shadow-none:focus{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:shadow-sm:focus{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:shadow-xl:focus{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-0:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-4:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(4px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-8:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(8px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-amber-500:focus{--tw-ring-color:var(--color-amber-500)}.focus\:ring-blue-50:focus{--tw-ring-color:var(--color-blue-50)}.focus\:ring-blue-100:focus{--tw-ring-color:var(--color-blue-100)}.focus\:ring-blue-200:focus{--tw-ring-color:var(--color-blue-200)}.focus\:ring-blue-300:focus{--tw-ring-color:var(--color-blue-300)}.focus\:ring-blue-400:focus{--tw-ring-color:var(--color-blue-400)}.focus\:ring-blue-500:focus{--tw-ring-color:var(--color-blue-500)}.focus\:ring-blue-600:focus{--tw-ring-color:var(--color-blue-600)}.focus\:ring-blue-700:focus{--tw-ring-color:var(--color-blue-700)}.focus\:ring-blue-800:focus{--tw-ring-color:var(--color-blue-800)}.focus\:ring-blue-900:focus{--tw-ring-color:var(--color-blue-900)}.focus\:ring-current:focus{--tw-ring-color:currentcolor}.focus\:ring-gray-50:focus{--tw-ring-color:var(--color-gray-50)}.focus\:ring-gray-100:focus{--tw-ring-color:var(--color-gray-100)}.focus\:ring-gray-200:focus{--tw-ring-color:var(--color-gray-200)}.focus\:ring-gray-300:focus{--tw-ring-color:var(--color-gray-300)}.focus\:ring-gray-400:focus{--tw-ring-color:var(--color-gray-400)}.focus\:ring-gray-500:focus{--tw-ring-color:var(--color-gray-500)}.focus\:ring-gray-600:focus{--tw-ring-color:var(--color-gray-600)}.focus\:ring-gray-700:focus{--tw-ring-color:var(--color-gray-700)}.focus\:ring-gray-800:focus{--tw-ring-color:var(--color-gray-800)}.focus\:ring-gray-900:focus{--tw-ring-color:var(--color-gray-900)}.focus\:ring-green-500:focus{--tw-ring-color:var(--color-green-500)}.focus\:ring-indigo-500:focus{--tw-ring-color:var(--color-indigo-500)}.focus\:ring-primary-500:focus{--tw-ring-color:var(--color-primary-500)}.focus\:ring-purple-500:focus{--tw-ring-color:var(--color-purple-500)}.focus\:ring-red-500:focus{--tw-ring-color:var(--color-red-500)}.focus\:ring-transparent:focus{--tw-ring-color:transparent}.focus\:ring-yellow-500:focus{--tw-ring-color:var(--color-yellow-500)}.focus\:ring-offset-0:focus{--tw-ring-offset-width:0px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus\:ring-offset-1:focus{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus\:ring-offset-4:focus{--tw-ring-offset-width:4px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus\:ring-offset-gray-100:focus{--tw-ring-offset-color:var(--color-gray-100)}.focus\:ring-offset-gray-900:focus{--tw-ring-offset-color:var(--color-gray-900)}.focus\:ring-offset-white:focus{--tw-ring-offset-color:var(--color-white)}.focus\:outline:focus{outline-style:var(--tw-outline-style);outline-width:1px}.focus\:outline-0:focus{outline-style:var(--tw-outline-style);outline-width:0}.focus\:outline-1:focus{outline-style:var(--tw-outline-style);outline-width:1px}.focus\:outline-2:focus{outline-style:var(--tw-outline-style);outline-width:2px}.focus\:outline-4:focus{outline-style:var(--tw-outline-style);outline-width:4px}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus\:ring-inset:focus{--tw-ring-inset:inset}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-blue-500:focus-visible{--tw-ring-color:var(--color-blue-500)}.focus-visible\:ring-gray-500:focus-visible{--tw-ring-color:var(--color-gray-500)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus-visible\:outline:focus-visible{outline-style:var(--tw-outline-style);outline-width:1px}.focus-visible\:outline-2:focus-visible{outline-style:var(--tw-outline-style);outline-width:2px}.focus-visible\:outline-offset-2:focus-visible{outline-offset:2px}.active\:scale-95:active{--tw-scale-x:95%;--tw-scale-y:95%;--tw-scale-z:95%;scale:var(--tw-scale-x)var(--tw-scale-y)}.active\:scale-100:active{--tw-scale-x:100%;--tw-scale-y:100%;--tw-scale-z:100%;scale:var(--tw-scale-x)var(--tw-scale-y)}.active\:cursor-grabbing:active{cursor:grabbing}.active\:bg-blue-600:active{background-color:var(--color-blue-600)}.active\:bg-blue-700:active{background-color:var(--color-blue-700)}.active\:bg-blue-800:active{background-color:var(--color-blue-800)}.active\:bg-gray-100:active{background-color:var(--color-gray-100)}.active\:bg-gray-200:active{background-color:var(--color-gray-200)}.active\:bg-gray-300:active{background-color:var(--color-gray-300)}.active\:bg-gray-700:active{background-color:var(--color-gray-700)}.active\:bg-gray-800:active{background-color:var(--color-gray-800)}.active\:bg-green-600:active{background-color:var(--color-green-600)}.active\:bg-green-700:active{background-color:var(--color-green-700)}.active\:bg-red-600:active{background-color:var(--color-red-600)}.active\:bg-red-700:active{background-color:var(--color-red-700)}.active\:opacity-75:active{opacity:.75}.active\:opacity-100:active{opacity:1}.disabled\:cursor-default:disabled{cursor:default}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:border-gray-200:disabled{border-color:var(--color-gray-200)}.disabled\:border-gray-300:disabled{border-color:var(--color-gray-300)}.disabled\:bg-gray-100:disabled{background-color:var(--color-gray-100)}.disabled\:bg-gray-200:disabled{background-color:var(--color-gray-200)}.disabled\:bg-gray-300:disabled{background-color:var(--color-gray-300)}.disabled\:text-gray-300:disabled{color:var(--color-gray-300)}.disabled\:text-gray-400:disabled{color:var(--color-gray-400)}.disabled\:text-gray-500:disabled{color:var(--color-gray-500)}.disabled\:no-underline:disabled{text-decoration-line:none}.disabled\:opacity-20:disabled{opacity:.2}.disabled\:opacity-25:disabled{opacity:.25}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-75:disabled{opacity:.75}@media(min-width:40rem){.sm\:col-span-1{grid-column:span 1/span 1}.sm\:col-span-2{grid-column:span 2/span 2}.sm\:col-span-3{grid-column:span 3/span 3}.sm\:col-span-4{grid-column:span 4/span 4}.sm\:col-span-6{grid-column:span 6/span 6}.sm\:col-span-12{grid-column:span 12/span 12}.sm\:col-span-full{grid-column:1/-1}.sm\:m-0{margin:calc(var(--spacing)*0)}.sm\:m-1{margin:calc(var(--spacing)*1)}.sm\:m-2{margin:calc(var(--spacing)*2)}.sm\:m-3{margin:calc(var(--spacing)*3)}.sm\:m-4{margin:calc(var(--spacing)*4)}.sm\:m-auto{margin:auto}.sm\:mx-auto{margin-inline:auto}.sm\:my-auto{margin-block:auto}.sm\:ml-auto{margin-left:auto}.sm\:block{display:block}.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:inline{display:inline}.sm\:inline-block{display:inline-block}.sm\:inline-flex{display:inline-flex}.sm\:w-1\/2{width:50%}.sm\:w-1\/3{width:33.3333%}.sm\:w-1\/4{width:25%}.sm\:w-2\/3{width:66.6667%}.sm\:w-3\/4{width:75%}.sm\:w-64{width:calc(var(--spacing)*64)}.sm\:w-auto{width:auto}.sm\:w-full{width:100%}.sm\:min-w-48{min-width:calc(var(--spacing)*48)}.sm\:auto-cols-\[calc\(33\.333\%_-_11px\)\]{grid-auto-columns:calc(33.333% - 11px)}.sm\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.sm\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.sm\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.sm\:flex-col{flex-direction:column}.sm\:flex-row{flex-direction:row}.sm\:items-center{align-items:center}.sm\:items-end{align-items:flex-end}.sm\:items-start{align-items:flex-start}.sm\:justify-between{justify-content:space-between}.sm\:justify-center{justify-content:center}.sm\:justify-end{justify-content:flex-end}.sm\:justify-start{justify-content:flex-start}.sm\:gap-0{gap:calc(var(--spacing)*0)}.sm\:gap-1{gap:calc(var(--spacing)*1)}.sm\:gap-2{gap:calc(var(--spacing)*2)}.sm\:gap-3{gap:calc(var(--spacing)*3)}.sm\:gap-4{gap:calc(var(--spacing)*4)}.sm\:gap-5{gap:calc(var(--spacing)*5)}.sm\:gap-6{gap:calc(var(--spacing)*6)}.sm\:gap-8{gap:calc(var(--spacing)*8)}:where(.sm\:space-y-0>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*0)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*0)*calc(1 - var(--tw-space-y-reverse)))}:where(.sm\:space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.sm\:space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.sm\:space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.sm\:space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.sm\:space-x-0>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*0)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*0)*calc(1 - var(--tw-space-x-reverse)))}:where(.sm\:space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*1)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-x-reverse)))}:where(.sm\:space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-x-reverse)))}:where(.sm\:space-x-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*3)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-x-reverse)))}:where(.sm\:space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*4)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-x-reverse)))}.sm\:p-0{padding:calc(var(--spacing)*0)}.sm\:p-1{padding:calc(var(--spacing)*1)}.sm\:p-2{padding:calc(var(--spacing)*2)}.sm\:p-3{padding:calc(var(--spacing)*3)}.sm\:p-4{padding:calc(var(--spacing)*4)}.sm\:p-5{padding:calc(var(--spacing)*5)}.sm\:p-6{padding:calc(var(--spacing)*6)}.sm\:p-8{padding:calc(var(--spacing)*8)}.sm\:px-0{padding-inline:calc(var(--spacing)*0)}.sm\:px-1{padding-inline:calc(var(--spacing)*1)}.sm\:px-2{padding-inline:calc(var(--spacing)*2)}.sm\:px-3{padding-inline:calc(var(--spacing)*3)}.sm\:px-4{padding-inline:calc(var(--spacing)*4)}.sm\:px-5{padding-inline:calc(var(--spacing)*5)}.sm\:px-6{padding-inline:calc(var(--spacing)*6)}.sm\:px-8{padding-inline:calc(var(--spacing)*8)}.sm\:py-0{padding-block:calc(var(--spacing)*0)}.sm\:py-1{padding-block:calc(var(--spacing)*1)}.sm\:py-2{padding-block:calc(var(--spacing)*2)}.sm\:py-3{padding-block:calc(var(--spacing)*3)}.sm\:py-4{padding-block:calc(var(--spacing)*4)}.sm\:py-5{padding-block:calc(var(--spacing)*5)}.sm\:py-6{padding-block:calc(var(--spacing)*6)}.sm\:py-8{padding-block:calc(var(--spacing)*8)}.sm\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.sm\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.sm\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.sm\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.sm\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.sm\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.sm\:text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}}@media(min-width:48rem){.md\:absolute{position:absolute}.md\:fixed{position:fixed}.md\:relative{position:relative}.md\:static{position:static}.md\:sticky{position:sticky}.md\:inset-0{inset:calc(var(--spacing)*0)}.md\:top-0{top:calc(var(--spacing)*0)}.md\:right-0{right:calc(var(--spacing)*0)}.md\:bottom-0{bottom:calc(var(--spacing)*0)}.md\:left-0{left:calc(var(--spacing)*0)}.md\:order-1{order:1}.md\:order-2{order:2}.md\:order-3{order:3}.md\:order-first{order:-9999}.md\:order-last{order:9999}.md\:order-none{order:0}.md\:col-span-1{grid-column:span 1/span 1}.md\:col-span-2{grid-column:span 2/span 2}.md\:col-span-3{grid-column:span 3/span 3}.md\:col-span-4{grid-column:span 4/span 4}.md\:col-span-5{grid-column:span 5/span 5}.md\:col-span-6{grid-column:span 6/span 6}.md\:col-span-12{grid-column:span 12/span 12}.md\:col-span-full{grid-column:1/-1}.md\:row-span-1{grid-row:span 1/span 1}.md\:row-span-2{grid-row:span 2/span 2}.md\:row-span-3{grid-row:span 3/span 3}.md\:row-span-4{grid-row:span 4/span 4}.md\:row-span-full{grid-row:1/-1}.md\:m-0{margin:calc(var(--spacing)*0)}.md\:m-1{margin:calc(var(--spacing)*1)}.md\:m-2{margin:calc(var(--spacing)*2)}.md\:m-3{margin:calc(var(--spacing)*3)}.md\:m-4{margin:calc(var(--spacing)*4)}.md\:m-auto{margin:auto}.md\:mx-auto{margin-inline:auto}.md\:my-auto{margin-block:auto}.md\:mt-0{margin-top:calc(var(--spacing)*0)}.md\:mt-1{margin-top:calc(var(--spacing)*1)}.md\:mt-2{margin-top:calc(var(--spacing)*2)}.md\:mt-3{margin-top:calc(var(--spacing)*3)}.md\:mt-4{margin-top:calc(var(--spacing)*4)}.md\:mt-6{margin-top:calc(var(--spacing)*6)}.md\:mt-8{margin-top:calc(var(--spacing)*8)}.md\:mr-0{margin-right:calc(var(--spacing)*0)}.md\:mr-1{margin-right:calc(var(--spacing)*1)}.md\:mr-2{margin-right:calc(var(--spacing)*2)}.md\:mr-3{margin-right:calc(var(--spacing)*3)}.md\:mr-4{margin-right:calc(var(--spacing)*4)}.md\:mr-6{margin-right:calc(var(--spacing)*6)}.md\:mr-8{margin-right:calc(var(--spacing)*8)}.md\:mr-auto{margin-right:auto}.md\:mb-0{margin-bottom:calc(var(--spacing)*0)}.md\:mb-1{margin-bottom:calc(var(--spacing)*1)}.md\:mb-2{margin-bottom:calc(var(--spacing)*2)}.md\:mb-3{margin-bottom:calc(var(--spacing)*3)}.md\:mb-4{margin-bottom:calc(var(--spacing)*4)}.md\:mb-6{margin-bottom:calc(var(--spacing)*6)}.md\:mb-8{margin-bottom:calc(var(--spacing)*8)}.md\:ml-0{margin-left:calc(var(--spacing)*0)}.md\:ml-1{margin-left:calc(var(--spacing)*1)}.md\:ml-2{margin-left:calc(var(--spacing)*2)}.md\:ml-3{margin-left:calc(var(--spacing)*3)}.md\:ml-4{margin-left:calc(var(--spacing)*4)}.md\:ml-6{margin-left:calc(var(--spacing)*6)}.md\:ml-8{margin-left:calc(var(--spacing)*8)}.md\:ml-auto{margin-left:auto}.md\:block{display:block}.md\:flex{display:flex}.md\:grid{display:grid}.md\:hidden{display:none}.md\:inline{display:inline}.md\:inline-block{display:inline-block}.md\:inline-flex{display:inline-flex}.md\:w-1\/2{width:50%}.md\:w-1\/3{width:33.3333%}.md\:w-1\/4{width:25%}.md\:w-1\/5{width:20%}.md\:w-2\/3{width:66.6667%}.md\:w-2\/5{width:40%}.md\:w-3\/4{width:75%}.md\:w-3\/5{width:60%}.md\:w-4\/5{width:80%}.md\:w-auto{width:auto}.md\:w-full{width:100%}.md\:max-w-2xl{max-width:var(--container-2xl)}.md\:max-w-3xl{max-width:var(--container-3xl)}.md\:max-w-4xl{max-width:var(--container-4xl)}.md\:max-w-5xl{max-width:var(--container-5xl)}.md\:max-w-6xl{max-width:var(--container-6xl)}.md\:max-w-7xl{max-width:var(--container-7xl)}.md\:max-w-full{max-width:100%}.md\:max-w-lg{max-width:var(--container-lg)}.md\:max-w-md{max-width:var(--container-md)}.md\:max-w-none{max-width:none}.md\:max-w-sm{max-width:var(--container-sm)}.md\:max-w-xl{max-width:var(--container-xl)}.md\:max-w-xs{max-width:var(--container-xs)}.md\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.md\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.md\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.md\:grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.md\:grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.md\:grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.md\:grid-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))}.md\:grid-rows-5{grid-template-rows:repeat(5,minmax(0,1fr))}.md\:grid-rows-6{grid-template-rows:repeat(6,minmax(0,1fr))}.md\:flex-col{flex-direction:column}.md\:flex-row{flex-direction:row}.md\:items-baseline{align-items:baseline}.md\:items-center{align-items:center}.md\:items-end{align-items:flex-end}.md\:items-start{align-items:flex-start}.md\:items-stretch{align-items:stretch}.md\:justify-around{justify-content:space-around}.md\:justify-between{justify-content:space-between}.md\:justify-center{justify-content:center}.md\:justify-end{justify-content:flex-end}.md\:justify-start{justify-content:flex-start}.md\:gap-0{gap:calc(var(--spacing)*0)}.md\:gap-1{gap:calc(var(--spacing)*1)}.md\:gap-2{gap:calc(var(--spacing)*2)}.md\:gap-3{gap:calc(var(--spacing)*3)}.md\:gap-4{gap:calc(var(--spacing)*4)}.md\:gap-5{gap:calc(var(--spacing)*5)}.md\:gap-6{gap:calc(var(--spacing)*6)}.md\:gap-8{gap:calc(var(--spacing)*8)}.md\:gap-10{gap:calc(var(--spacing)*10)}.md\:gap-12{gap:calc(var(--spacing)*12)}:where(.md\:space-y-0>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*0)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*0)*calc(1 - var(--tw-space-y-reverse)))}:where(.md\:space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.md\:space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.md\:space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.md\:space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.md\:space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.md\:space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*8)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-y-reverse)))}:where(.md\:space-x-0>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*0)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*0)*calc(1 - var(--tw-space-x-reverse)))}:where(.md\:space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*1)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-x-reverse)))}:where(.md\:space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-x-reverse)))}:where(.md\:space-x-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*3)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-x-reverse)))}:where(.md\:space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*4)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-x-reverse)))}:where(.md\:space-x-6>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*6)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-x-reverse)))}:where(.md\:space-x-8>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*8)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-x-reverse)))}.md\:p-0{padding:calc(var(--spacing)*0)}.md\:p-1{padding:calc(var(--spacing)*1)}.md\:p-2{padding:calc(var(--spacing)*2)}.md\:p-3{padding:calc(var(--spacing)*3)}.md\:p-4{padding:calc(var(--spacing)*4)}.md\:p-5{padding:calc(var(--spacing)*5)}.md\:p-6{padding:calc(var(--spacing)*6)}.md\:p-8{padding:calc(var(--spacing)*8)}.md\:p-10{padding:calc(var(--spacing)*10)}.md\:p-12{padding:calc(var(--spacing)*12)}.md\:px-0{padding-inline:calc(var(--spacing)*0)}.md\:px-1{padding-inline:calc(var(--spacing)*1)}.md\:px-2{padding-inline:calc(var(--spacing)*2)}.md\:px-3{padding-inline:calc(var(--spacing)*3)}.md\:px-4{padding-inline:calc(var(--spacing)*4)}.md\:px-5{padding-inline:calc(var(--spacing)*5)}.md\:px-6{padding-inline:calc(var(--spacing)*6)}.md\:px-8{padding-inline:calc(var(--spacing)*8)}.md\:px-10{padding-inline:calc(var(--spacing)*10)}.md\:px-12{padding-inline:calc(var(--spacing)*12)}.md\:py-0{padding-block:calc(var(--spacing)*0)}.md\:py-1{padding-block:calc(var(--spacing)*1)}.md\:py-2{padding-block:calc(var(--spacing)*2)}.md\:py-3{padding-block:calc(var(--spacing)*3)}.md\:py-4{padding-block:calc(var(--spacing)*4)}.md\:py-5{padding-block:calc(var(--spacing)*5)}.md\:py-6{padding-block:calc(var(--spacing)*6)}.md\:py-8{padding-block:calc(var(--spacing)*8)}.md\:py-10{padding-block:calc(var(--spacing)*10)}.md\:py-12{padding-block:calc(var(--spacing)*12)}.md\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.md\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.md\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.md\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.md\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.md\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.md\:text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}}@media(min-width:64rem){.lg\:absolute{position:absolute}.lg\:fixed{position:fixed}.lg\:relative{position:relative}.lg\:static{position:static}.lg\:sticky{position:sticky}.lg\:inset-0{inset:calc(var(--spacing)*0)}.lg\:top-0{top:calc(var(--spacing)*0)}.lg\:right-0{right:calc(var(--spacing)*0)}.lg\:bottom-0{bottom:calc(var(--spacing)*0)}.lg\:left-0{left:calc(var(--spacing)*0)}.lg\:order-1{order:1}.lg\:order-2{order:2}.lg\:order-3{order:3}.lg\:order-4{order:4}.lg\:order-first{order:-9999}.lg\:order-last{order:9999}.lg\:order-none{order:0}.lg\:col-span-1{grid-column:span 1/span 1}.lg\:col-span-2{grid-column:span 2/span 2}.lg\:col-span-3{grid-column:span 3/span 3}.lg\:col-span-4{grid-column:span 4/span 4}.lg\:col-span-5{grid-column:span 5/span 5}.lg\:col-span-6{grid-column:span 6/span 6}.lg\:col-span-7{grid-column:span 7/span 7}.lg\:col-span-8{grid-column:span 8/span 8}.lg\:col-span-12{grid-column:span 12/span 12}.lg\:col-span-full{grid-column:1/-1}.lg\:row-span-1{grid-row:span 1/span 1}.lg\:row-span-2{grid-row:span 2/span 2}.lg\:row-span-3{grid-row:span 3/span 3}.lg\:row-span-4{grid-row:span 4/span 4}.lg\:row-span-full{grid-row:1/-1}.lg\:m-0{margin:calc(var(--spacing)*0)}.lg\:m-1{margin:calc(var(--spacing)*1)}.lg\:m-2{margin:calc(var(--spacing)*2)}.lg\:m-3{margin:calc(var(--spacing)*3)}.lg\:m-4{margin:calc(var(--spacing)*4)}.lg\:m-auto{margin:auto}.lg\:mx-auto{margin-inline:auto}.lg\:my-auto{margin-block:auto}.lg\:mt-0{margin-top:calc(var(--spacing)*0)}.lg\:mt-1{margin-top:calc(var(--spacing)*1)}.lg\:mt-2{margin-top:calc(var(--spacing)*2)}.lg\:mt-3{margin-top:calc(var(--spacing)*3)}.lg\:mt-4{margin-top:calc(var(--spacing)*4)}.lg\:mt-6{margin-top:calc(var(--spacing)*6)}.lg\:mt-8{margin-top:calc(var(--spacing)*8)}.lg\:mt-10{margin-top:calc(var(--spacing)*10)}.lg\:mt-12{margin-top:calc(var(--spacing)*12)}.lg\:mr-0{margin-right:calc(var(--spacing)*0)}.lg\:mr-1{margin-right:calc(var(--spacing)*1)}.lg\:mr-2{margin-right:calc(var(--spacing)*2)}.lg\:mr-3{margin-right:calc(var(--spacing)*3)}.lg\:mr-4{margin-right:calc(var(--spacing)*4)}.lg\:mr-6{margin-right:calc(var(--spacing)*6)}.lg\:mr-8{margin-right:calc(var(--spacing)*8)}.lg\:mr-auto{margin-right:auto}.lg\:mb-0{margin-bottom:calc(var(--spacing)*0)}.lg\:mb-1{margin-bottom:calc(var(--spacing)*1)}.lg\:mb-2{margin-bottom:calc(var(--spacing)*2)}.lg\:mb-3{margin-bottom:calc(var(--spacing)*3)}.lg\:mb-4{margin-bottom:calc(var(--spacing)*4)}.lg\:mb-6{margin-bottom:calc(var(--spacing)*6)}.lg\:mb-8{margin-bottom:calc(var(--spacing)*8)}.lg\:mb-10{margin-bottom:calc(var(--spacing)*10)}.lg\:mb-12{margin-bottom:calc(var(--spacing)*12)}.lg\:ml-0{margin-left:calc(var(--spacing)*0)}.lg\:ml-1{margin-left:calc(var(--spacing)*1)}.lg\:ml-2{margin-left:calc(var(--spacing)*2)}.lg\:ml-3{margin-left:calc(var(--spacing)*3)}.lg\:ml-4{margin-left:calc(var(--spacing)*4)}.lg\:ml-6{margin-left:calc(var(--spacing)*6)}.lg\:ml-8{margin-left:calc(var(--spacing)*8)}.lg\:ml-auto{margin-left:auto}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:grid{display:grid}.lg\:hidden{display:none}.lg\:inline{display:inline}.lg\:inline-block{display:inline-block}.lg\:inline-flex{display:inline-flex}.lg\:w-1\/2{width:50%}.lg\:w-1\/3{width:33.3333%}.lg\:w-1\/4{width:25%}.lg\:w-1\/5{width:20%}.lg\:w-1\/6{width:16.6667%}.lg\:w-2\/3{width:66.6667%}.lg\:w-2\/5{width:40%}.lg\:w-3\/4{width:75%}.lg\:w-3\/5{width:60%}.lg\:w-4\/5{width:80%}.lg\:w-5\/6{width:83.3333%}.lg\:w-auto{width:auto}.lg\:w-full{width:100%}.lg\:max-w-2xl{max-width:var(--container-2xl)}.lg\:max-w-3xl{max-width:var(--container-3xl)}.lg\:max-w-4xl{max-width:var(--container-4xl)}.lg\:max-w-5xl{max-width:var(--container-5xl)}.lg\:max-w-6xl{max-width:var(--container-6xl)}.lg\:max-w-7xl{max-width:var(--container-7xl)}.lg\:max-w-full{max-width:100%}.lg\:max-w-lg{max-width:var(--container-lg)}.lg\:max-w-md{max-width:var(--container-md)}.lg\:max-w-none{max-width:none}.lg\:max-w-sm{max-width:var(--container-sm)}.lg\:max-w-xl{max-width:var(--container-xl)}.lg\:max-w-xs{max-width:var(--container-xs)}.lg\:auto-cols-\[calc\(25\%_-_12px\)\]{grid-auto-columns:calc(25% - 12px)}.lg\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.lg\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.lg\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.lg\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.lg\:grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.lg\:grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.lg\:grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.lg\:grid-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))}.lg\:grid-rows-5{grid-template-rows:repeat(5,minmax(0,1fr))}.lg\:grid-rows-6{grid-template-rows:repeat(6,minmax(0,1fr))}.lg\:flex-col{flex-direction:column}.lg\:flex-row{flex-direction:row}.lg\:items-baseline{align-items:baseline}.lg\:items-center{align-items:center}.lg\:items-end{align-items:flex-end}.lg\:items-start{align-items:flex-start}.lg\:items-stretch{align-items:stretch}.lg\:justify-around{justify-content:space-around}.lg\:justify-between{justify-content:space-between}.lg\:justify-center{justify-content:center}.lg\:justify-end{justify-content:flex-end}.lg\:justify-evenly{justify-content:space-evenly}.lg\:justify-start{justify-content:flex-start}.lg\:gap-0{gap:calc(var(--spacing)*0)}.lg\:gap-1{gap:calc(var(--spacing)*1)}.lg\:gap-2{gap:calc(var(--spacing)*2)}.lg\:gap-3{gap:calc(var(--spacing)*3)}.lg\:gap-4{gap:calc(var(--spacing)*4)}.lg\:gap-5{gap:calc(var(--spacing)*5)}.lg\:gap-6{gap:calc(var(--spacing)*6)}.lg\:gap-8{gap:calc(var(--spacing)*8)}.lg\:gap-10{gap:calc(var(--spacing)*10)}.lg\:gap-12{gap:calc(var(--spacing)*12)}.lg\:gap-16{gap:calc(var(--spacing)*16)}:where(.lg\:space-y-0>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*0)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*0)*calc(1 - var(--tw-space-y-reverse)))}:where(.lg\:space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.lg\:space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.lg\:space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.lg\:space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.lg\:space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.lg\:space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*8)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-y-reverse)))}:where(.lg\:space-y-10>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*10)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*10)*calc(1 - var(--tw-space-y-reverse)))}:where(.lg\:space-x-0>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*0)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*0)*calc(1 - var(--tw-space-x-reverse)))}:where(.lg\:space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*1)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-x-reverse)))}:where(.lg\:space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-x-reverse)))}:where(.lg\:space-x-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*3)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-x-reverse)))}:where(.lg\:space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*4)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-x-reverse)))}:where(.lg\:space-x-6>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*6)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-x-reverse)))}:where(.lg\:space-x-8>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*8)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-x-reverse)))}:where(.lg\:space-x-10>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*10)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*10)*calc(1 - var(--tw-space-x-reverse)))}.lg\:p-0{padding:calc(var(--spacing)*0)}.lg\:p-1{padding:calc(var(--spacing)*1)}.lg\:p-2{padding:calc(var(--spacing)*2)}.lg\:p-3{padding:calc(var(--spacing)*3)}.lg\:p-4{padding:calc(var(--spacing)*4)}.lg\:p-5{padding:calc(var(--spacing)*5)}.lg\:p-6{padding:calc(var(--spacing)*6)}.lg\:p-8{padding:calc(var(--spacing)*8)}.lg\:p-10{padding:calc(var(--spacing)*10)}.lg\:p-12{padding:calc(var(--spacing)*12)}.lg\:p-16{padding:calc(var(--spacing)*16)}.lg\:px-0{padding-inline:calc(var(--spacing)*0)}.lg\:px-1{padding-inline:calc(var(--spacing)*1)}.lg\:px-2{padding-inline:calc(var(--spacing)*2)}.lg\:px-3{padding-inline:calc(var(--spacing)*3)}.lg\:px-4{padding-inline:calc(var(--spacing)*4)}.lg\:px-5{padding-inline:calc(var(--spacing)*5)}.lg\:px-6{padding-inline:calc(var(--spacing)*6)}.lg\:px-8{padding-inline:calc(var(--spacing)*8)}.lg\:px-10{padding-inline:calc(var(--spacing)*10)}.lg\:px-12{padding-inline:calc(var(--spacing)*12)}.lg\:px-16{padding-inline:calc(var(--spacing)*16)}.lg\:py-0{padding-block:calc(var(--spacing)*0)}.lg\:py-1{padding-block:calc(var(--spacing)*1)}.lg\:py-2{padding-block:calc(var(--spacing)*2)}.lg\:py-3{padding-block:calc(var(--spacing)*3)}.lg\:py-4{padding-block:calc(var(--spacing)*4)}.lg\:py-5{padding-block:calc(var(--spacing)*5)}.lg\:py-6{padding-block:calc(var(--spacing)*6)}.lg\:py-8{padding-block:calc(var(--spacing)*8)}.lg\:py-10{padding-block:calc(var(--spacing)*10)}.lg\:py-12{padding-block:calc(var(--spacing)*12)}.lg\:py-16{padding-block:calc(var(--spacing)*16)}.lg\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.lg\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.lg\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.lg\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.lg\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.lg\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.lg\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.lg\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.lg\:text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}}@media(min-width:80rem){.xl\:col-span-1{grid-column:span 1/span 1}.xl\:col-span-2{grid-column:span 2/span 2}.xl\:col-span-3{grid-column:span 3/span 3}.xl\:col-span-4{grid-column:span 4/span 4}.xl\:col-span-5{grid-column:span 5/span 5}.xl\:col-span-6{grid-column:span 6/span 6}.xl\:col-span-12{grid-column:span 12/span 12}.xl\:col-span-full{grid-column:1/-1}.xl\:row-span-1{grid-row:span 1/span 1}.xl\:row-span-2{grid-row:span 2/span 2}.xl\:row-span-3{grid-row:span 3/span 3}.xl\:row-span-full{grid-row:1/-1}.xl\:m-0{margin:calc(var(--spacing)*0)}.xl\:m-auto{margin:auto}.xl\:mx-auto{margin-inline:auto}.xl\:my-auto{margin-block:auto}.xl\:block{display:block}.xl\:flex{display:flex}.xl\:hidden{display:none}.xl\:inline{display:inline}.xl\:inline-block{display:inline-block}.xl\:inline-flex{display:inline-flex}.xl\:w-1\/2{width:50%}.xl\:w-1\/3{width:33.3333%}.xl\:w-1\/4{width:25%}.xl\:w-1\/5{width:20%}.xl\:w-2\/3{width:66.6667%}.xl\:w-2\/5{width:40%}.xl\:w-3\/4{width:75%}.xl\:w-3\/5{width:60%}.xl\:w-4\/5{width:80%}.xl\:w-auto{width:auto}.xl\:w-full{width:100%}.xl\:max-w-2xl{max-width:var(--container-2xl)}.xl\:max-w-3xl{max-width:var(--container-3xl)}.xl\:max-w-4xl{max-width:var(--container-4xl)}.xl\:max-w-5xl{max-width:var(--container-5xl)}.xl\:max-w-6xl{max-width:var(--container-6xl)}.xl\:max-w-7xl{max-width:var(--container-7xl)}.xl\:max-w-full{max-width:100%}.xl\:max-w-lg{max-width:var(--container-lg)}.xl\:max-w-md{max-width:var(--container-md)}.xl\:max-w-none{max-width:none}.xl\:max-w-sm{max-width:var(--container-sm)}.xl\:max-w-xl{max-width:var(--container-xl)}.xl\:max-w-xs{max-width:var(--container-xs)}.xl\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.xl\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.xl\:grid-rows-1{grid-template-rows:repeat(1,minmax(0,1fr))}.xl\:grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.xl\:grid-rows-3{grid-template-rows:repeat(3,minmax(0,1fr))}.xl\:grid-rows-4{grid-template-rows:repeat(4,minmax(0,1fr))}.xl\:flex-col{flex-direction:column}.xl\:flex-row{flex-direction:row}.xl\:items-center{align-items:center}.xl\:items-end{align-items:flex-end}.xl\:items-start{align-items:flex-start}.xl\:justify-between{justify-content:space-between}.xl\:justify-center{justify-content:center}.xl\:justify-end{justify-content:flex-end}.xl\:justify-start{justify-content:flex-start}.xl\:gap-0{gap:calc(var(--spacing)*0)}.xl\:gap-1{gap:calc(var(--spacing)*1)}.xl\:gap-2{gap:calc(var(--spacing)*2)}.xl\:gap-3{gap:calc(var(--spacing)*3)}.xl\:gap-4{gap:calc(var(--spacing)*4)}.xl\:gap-5{gap:calc(var(--spacing)*5)}.xl\:gap-6{gap:calc(var(--spacing)*6)}.xl\:gap-8{gap:calc(var(--spacing)*8)}.xl\:gap-10{gap:calc(var(--spacing)*10)}.xl\:gap-12{gap:calc(var(--spacing)*12)}.xl\:gap-16{gap:calc(var(--spacing)*16)}:where(.xl\:space-y-0>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*0)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*0)*calc(1 - var(--tw-space-y-reverse)))}:where(.xl\:space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*1)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-y-reverse)))}:where(.xl\:space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*2)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-y-reverse)))}:where(.xl\:space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-y-reverse)))}:where(.xl\:space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}:where(.xl\:space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.xl\:space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*8)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-y-reverse)))}:where(.xl\:space-x-0>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*0)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*0)*calc(1 - var(--tw-space-x-reverse)))}:where(.xl\:space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*1)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-x-reverse)))}:where(.xl\:space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-x-reverse)))}:where(.xl\:space-x-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*3)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-x-reverse)))}:where(.xl\:space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*4)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-x-reverse)))}:where(.xl\:space-x-6>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*6)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-x-reverse)))}:where(.xl\:space-x-8>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*8)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-x-reverse)))}.xl\:p-0{padding:calc(var(--spacing)*0)}.xl\:p-1{padding:calc(var(--spacing)*1)}.xl\:p-2{padding:calc(var(--spacing)*2)}.xl\:p-3{padding:calc(var(--spacing)*3)}.xl\:p-4{padding:calc(var(--spacing)*4)}.xl\:p-5{padding:calc(var(--spacing)*5)}.xl\:p-6{padding:calc(var(--spacing)*6)}.xl\:p-8{padding:calc(var(--spacing)*8)}.xl\:p-10{padding:calc(var(--spacing)*10)}.xl\:p-12{padding:calc(var(--spacing)*12)}.xl\:p-16{padding:calc(var(--spacing)*16)}.xl\:px-0{padding-inline:calc(var(--spacing)*0)}.xl\:px-1{padding-inline:calc(var(--spacing)*1)}.xl\:px-2{padding-inline:calc(var(--spacing)*2)}.xl\:px-3{padding-inline:calc(var(--spacing)*3)}.xl\:px-4{padding-inline:calc(var(--spacing)*4)}.xl\:px-5{padding-inline:calc(var(--spacing)*5)}.xl\:px-6{padding-inline:calc(var(--spacing)*6)}.xl\:px-8{padding-inline:calc(var(--spacing)*8)}.xl\:px-10{padding-inline:calc(var(--spacing)*10)}.xl\:px-12{padding-inline:calc(var(--spacing)*12)}.xl\:px-16{padding-inline:calc(var(--spacing)*16)}.xl\:py-0{padding-block:calc(var(--spacing)*0)}.xl\:py-1{padding-block:calc(var(--spacing)*1)}.xl\:py-2{padding-block:calc(var(--spacing)*2)}.xl\:py-3{padding-block:calc(var(--spacing)*3)}.xl\:py-4{padding-block:calc(var(--spacing)*4)}.xl\:py-5{padding-block:calc(var(--spacing)*5)}.xl\:py-6{padding-block:calc(var(--spacing)*6)}.xl\:py-8{padding-block:calc(var(--spacing)*8)}.xl\:py-10{padding-block:calc(var(--spacing)*10)}.xl\:py-12{padding-block:calc(var(--spacing)*12)}.xl\:py-16{padding-block:calc(var(--spacing)*16)}.xl\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.xl\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.xl\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.xl\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.xl\:text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}.xl\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.xl\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.xl\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.xl\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.xl\:text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}}@media(min-width:96rem){.\32xl\:col-span-1{grid-column:span 1/span 1}.\32xl\:col-span-2{grid-column:span 2/span 2}.\32xl\:col-span-3{grid-column:span 3/span 3}.\32xl\:col-span-4{grid-column:span 4/span 4}.\32xl\:col-span-6{grid-column:span 6/span 6}.\32xl\:col-span-12{grid-column:span 12/span 12}.\32xl\:block{display:block}.\32xl\:flex{display:flex}.\32xl\:hidden{display:none}.\32xl\:w-1\/2{width:50%}.\32xl\:w-1\/3{width:33.3333%}.\32xl\:w-1\/4{width:25%}.\32xl\:w-2\/3{width:66.6667%}.\32xl\:w-3\/4{width:75%}.\32xl\:w-auto{width:auto}.\32xl\:w-full{width:100%}.\32xl\:max-w-2xl{max-width:var(--container-2xl)}.\32xl\:max-w-3xl{max-width:var(--container-3xl)}.\32xl\:max-w-4xl{max-width:var(--container-4xl)}.\32xl\:max-w-5xl{max-width:var(--container-5xl)}.\32xl\:max-w-6xl{max-width:var(--container-6xl)}.\32xl\:max-w-7xl{max-width:var(--container-7xl)}.\32xl\:max-w-full{max-width:100%}.\32xl\:max-w-lg{max-width:var(--container-lg)}.\32xl\:max-w-md{max-width:var(--container-md)}.\32xl\:max-w-sm{max-width:var(--container-sm)}.\32xl\:max-w-xl{max-width:var(--container-xl)}.\32xl\:max-w-xs{max-width:var(--container-xs)}.\32xl\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.\32xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.\32xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.\32xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.\32xl\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.\32xl\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.\32xl\:grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.\32xl\:gap-0{gap:calc(var(--spacing)*0)}.\32xl\:gap-4{gap:calc(var(--spacing)*4)}.\32xl\:gap-6{gap:calc(var(--spacing)*6)}.\32xl\:gap-8{gap:calc(var(--spacing)*8)}.\32xl\:gap-12{gap:calc(var(--spacing)*12)}.\32xl\:gap-16{gap:calc(var(--spacing)*16)}.\32xl\:p-0{padding:calc(var(--spacing)*0)}.\32xl\:p-4{padding:calc(var(--spacing)*4)}.\32xl\:p-6{padding:calc(var(--spacing)*6)}.\32xl\:p-8{padding:calc(var(--spacing)*8)}.\32xl\:p-12{padding:calc(var(--spacing)*12)}.\32xl\:p-16{padding:calc(var(--spacing)*16)}.\32xl\:px-0{padding-inline:calc(var(--spacing)*0)}.\32xl\:px-4{padding-inline:calc(var(--spacing)*4)}.\32xl\:px-6{padding-inline:calc(var(--spacing)*6)}.\32xl\:px-8{padding-inline:calc(var(--spacing)*8)}.\32xl\:px-12{padding-inline:calc(var(--spacing)*12)}.\32xl\:px-16{padding-inline:calc(var(--spacing)*16)}.\32xl\:py-0{padding-block:calc(var(--spacing)*0)}.\32xl\:py-4{padding-block:calc(var(--spacing)*4)}.\32xl\:py-6{padding-block:calc(var(--spacing)*6)}.\32xl\:py-8{padding-block:calc(var(--spacing)*8)}.\32xl\:py-12{padding-block:calc(var(--spacing)*12)}.\32xl\:py-16{padding-block:calc(var(--spacing)*16)}.\32xl\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.\32xl\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.\32xl\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.\32xl\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.\32xl\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.\32xl\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.\32xl\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.\32xl\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.\32xl\:text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}}.dark .dark\:block{display:block}.dark .dark\:flex{display:flex}.dark .dark\:flex-1{flex:1}.dark .dark\:flex-auto{flex:auto}.dark .dark\:flex-none{flex:none}.dark .dark\:flex-col{flex-direction:column}.dark .dark\:flex-row{flex-direction:row}.dark .dark\:flex-wrap{flex-wrap:wrap}.dark .dark\:items-center{align-items:center}.dark .dark\:items-end{align-items:flex-end}.dark .dark\:items-start{align-items:flex-start}.dark .dark\:items-stretch{align-items:stretch}.dark .dark\:justify-around{justify-content:space-around}.dark .dark\:justify-between{justify-content:space-between}.dark .dark\:justify-center{justify-content:center}.dark .dark\:justify-end{justify-content:flex-end}.dark .dark\:justify-start{justify-content:flex-start}:where(.dark .dark\:divide-gray-50>:not(:last-child)){border-color:var(--color-gray-50)}:where(.dark .dark\:divide-gray-100>:not(:last-child)){border-color:var(--color-gray-100)}:where(.dark .dark\:divide-gray-200>:not(:last-child)){border-color:var(--color-gray-200)}:where(.dark .dark\:divide-gray-300>:not(:last-child)){border-color:var(--color-gray-300)}:where(.dark .dark\:divide-gray-400>:not(:last-child)){border-color:var(--color-gray-400)}:where(.dark .dark\:divide-gray-500>:not(:last-child)){border-color:var(--color-gray-500)}:where(.dark .dark\:divide-gray-600>:not(:last-child)){border-color:var(--color-gray-600)}:where(.dark .dark\:divide-gray-700>:not(:last-child)){border-color:var(--color-gray-700)}:where(.dark .dark\:divide-gray-800>:not(:last-child)){border-color:var(--color-gray-800)}:where(.dark .dark\:divide-gray-900>:not(:last-child)){border-color:var(--color-gray-900)}.dark .dark\:self-center{align-self:center}.dark .dark\:self-end{align-self:flex-end}.dark .dark\:self-start{align-self:flex-start}.dark .dark\:self-stretch{align-self:stretch}.dark .dark\:overflow-auto{overflow:auto}.dark .dark\:overflow-hidden{overflow:hidden}.dark .dark\:overflow-visible{overflow:visible}.dark .dark\:overflow-x-auto{overflow-x:auto}.dark .dark\:overflow-y-auto{overflow-y:auto}.dark .dark\:rounded{border-radius:.25rem}.dark .dark\:rounded-full{border-radius:3.40282e38px}.dark .dark\:rounded-lg{border-radius:var(--radius-lg)}.dark .dark\:rounded-none{border-radius:0}.dark .dark\:rounded-sm{border-radius:var(--radius-sm)}.dark .dark\:rounded-xl{border-radius:var(--radius-xl)}.dark .dark\:border{border-style:var(--tw-border-style);border-width:1px}.dark .dark\:border-0{border-style:var(--tw-border-style);border-width:0}.dark .dark\:border-dashed{--tw-border-style:dashed;border-style:dashed}.dark .dark\:border-dotted{--tw-border-style:dotted;border-style:dotted}.dark .dark\:border-solid{--tw-border-style:solid;border-style:solid}.dark .dark\:border-black{border-color:var(--color-black)}.dark .dark\:border-blue-50{border-color:var(--color-blue-50)}.dark .dark\:border-blue-100{border-color:var(--color-blue-100)}.dark .dark\:border-blue-200{border-color:var(--color-blue-200)}.dark .dark\:border-blue-300{border-color:var(--color-blue-300)}.dark .dark\:border-blue-400{border-color:var(--color-blue-400)}.dark .dark\:border-blue-500{border-color:var(--color-blue-500)}.dark .dark\:border-blue-600{border-color:var(--color-blue-600)}.dark .dark\:border-blue-700{border-color:var(--color-blue-700)}.dark .dark\:border-blue-800{border-color:var(--color-blue-800)}.dark .dark\:border-blue-900{border-color:var(--color-blue-900)}.dark .dark\:border-gray-50{border-color:var(--color-gray-50)}.dark .dark\:border-gray-100{border-color:var(--color-gray-100)}.dark .dark\:border-gray-200{border-color:var(--color-gray-200)}.dark .dark\:border-gray-300{border-color:var(--color-gray-300)}.dark .dark\:border-gray-400{border-color:var(--color-gray-400)}.dark .dark\:border-gray-500{border-color:var(--color-gray-500)}.dark .dark\:border-gray-600{border-color:var(--color-gray-600)}.dark .dark\:border-gray-700{border-color:var(--color-gray-700)}.dark .dark\:border-gray-700\/50{border-color:#36415380}@supports (color:color-mix(in lab,red,red)){.dark .dark\:border-gray-700\/50{border-color:color-mix(in oklab,var(--color-gray-700)50%,transparent)}}.dark .dark\:border-gray-800{border-color:var(--color-gray-800)}.dark .dark\:border-gray-900{border-color:var(--color-gray-900)}.dark .dark\:border-gray-900\/30{border-color:#1018284d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:border-gray-900\/30{border-color:color-mix(in oklab,var(--color-gray-900)30%,transparent)}}.dark .dark\:border-gray-950{border-color:var(--color-gray-950)}.dark .dark\:border-green-600{border-color:var(--color-green-600)}.dark .dark\:border-green-700{border-color:var(--color-green-700)}.dark .dark\:border-green-800{border-color:var(--color-green-800)}.dark .dark\:border-orange-600{border-color:var(--color-orange-600)}.dark .dark\:border-orange-800{border-color:var(--color-orange-800)}.dark .dark\:border-red-50{border-color:var(--color-red-50)}.dark .dark\:border-red-100{border-color:var(--color-red-100)}.dark .dark\:border-red-200{border-color:var(--color-red-200)}.dark .dark\:border-red-300{border-color:var(--color-red-300)}.dark .dark\:border-red-400{border-color:var(--color-red-400)}.dark .dark\:border-red-500{border-color:var(--color-red-500)}.dark .dark\:border-red-600{border-color:var(--color-red-600)}.dark .dark\:border-red-700{border-color:var(--color-red-700)}.dark .dark\:border-red-800{border-color:var(--color-red-800)}.dark .dark\:border-red-900{border-color:var(--color-red-900)}.dark .dark\:border-red-900\/50{border-color:#82181a80}@supports (color:color-mix(in lab,red,red)){.dark .dark\:border-red-900\/50{border-color:color-mix(in oklab,var(--color-red-900)50%,transparent)}}.dark .dark\:border-slate-50{border-color:var(--color-slate-50)}.dark .dark\:border-slate-100{border-color:var(--color-slate-100)}.dark .dark\:border-slate-200{border-color:var(--color-slate-200)}.dark .dark\:border-slate-300{border-color:var(--color-slate-300)}.dark .dark\:border-slate-400{border-color:var(--color-slate-400)}.dark .dark\:border-slate-500{border-color:var(--color-slate-500)}.dark .dark\:border-slate-600{border-color:var(--color-slate-600)}.dark .dark\:border-slate-700{border-color:var(--color-slate-700)}.dark .dark\:border-slate-800{border-color:var(--color-slate-800)}.dark .dark\:border-slate-900{border-color:var(--color-slate-900)}.dark .dark\:border-slate-950{border-color:var(--color-slate-950)}.dark .dark\:border-transparent{border-color:#0000}.dark .dark\:border-white{border-color:var(--color-white)}.dark .dark\:border-yellow-800{border-color:var(--color-yellow-800)}.dark .dark\:border-t-gray-900{border-top-color:var(--color-gray-900)}.dark .dark\:border-t-white{border-top-color:var(--color-white)}.dark .dark\:bg-amber-900\/30{background-color:#7b33064d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-amber-900\/30{background-color:color-mix(in oklab,var(--color-amber-900)30%,transparent)}}.dark .dark\:bg-black{background-color:var(--color-black)}.dark .dark\:bg-blue-50{background-color:var(--color-blue-50)}.dark .dark\:bg-blue-100{background-color:var(--color-blue-100)}.dark .dark\:bg-blue-200{background-color:var(--color-blue-200)}.dark .dark\:bg-blue-300{background-color:var(--color-blue-300)}.dark .dark\:bg-blue-400{background-color:var(--color-blue-400)}.dark .dark\:bg-blue-500{background-color:var(--color-blue-500)}.dark .dark\:bg-blue-600{background-color:var(--color-blue-600)}.dark .dark\:bg-blue-700{background-color:var(--color-blue-700)}.dark .dark\:bg-blue-800{background-color:var(--color-blue-800)}.dark .dark\:bg-blue-900{background-color:var(--color-blue-900)}.dark .dark\:bg-blue-900\/10{background-color:#1c398e1a}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-blue-900\/10{background-color:color-mix(in oklab,var(--color-blue-900)10%,transparent)}}.dark .dark\:bg-blue-900\/20{background-color:#1c398e33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-blue-900\/20{background-color:color-mix(in oklab,var(--color-blue-900)20%,transparent)}}.dark .dark\:bg-blue-900\/30{background-color:#1c398e4d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-blue-900\/30{background-color:color-mix(in oklab,var(--color-blue-900)30%,transparent)}}.dark .dark\:bg-blue-900\/40{background-color:#1c398e66}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-blue-900\/40{background-color:color-mix(in oklab,var(--color-blue-900)40%,transparent)}}.dark .dark\:bg-blue-900\/50{background-color:#1c398e80}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-blue-900\/50{background-color:color-mix(in oklab,var(--color-blue-900)50%,transparent)}}.dark .dark\:bg-blue-950{background-color:var(--color-blue-950)}.dark .dark\:bg-blue-950\/50{background-color:#16245680}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-blue-950\/50{background-color:color-mix(in oklab,var(--color-blue-950)50%,transparent)}}.dark .dark\:bg-emerald-900{background-color:var(--color-emerald-900)}.dark .dark\:bg-gray-50{background-color:var(--color-gray-50)}.dark .dark\:bg-gray-100{background-color:var(--color-gray-100)}.dark .dark\:bg-gray-200{background-color:var(--color-gray-200)}.dark .dark\:bg-gray-300{background-color:var(--color-gray-300)}.dark .dark\:bg-gray-400{background-color:var(--color-gray-400)}.dark .dark\:bg-gray-500{background-color:var(--color-gray-500)}.dark .dark\:bg-gray-600{background-color:var(--color-gray-600)}.dark .dark\:bg-gray-700{background-color:var(--color-gray-700)}.dark .dark\:bg-gray-700\/50{background-color:#36415380}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-gray-700\/50{background-color:color-mix(in oklab,var(--color-gray-700)50%,transparent)}}.dark .dark\:bg-gray-800{background-color:var(--color-gray-800)}.dark .dark\:bg-gray-800\/50{background-color:#1e293980}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-gray-800\/50{background-color:color-mix(in oklab,var(--color-gray-800)50%,transparent)}}.dark .dark\:bg-gray-800\/80{background-color:#1e2939cc}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-gray-800\/80{background-color:color-mix(in oklab,var(--color-gray-800)80%,transparent)}}.dark .dark\:bg-gray-800\/90{background-color:#1e2939e6}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-gray-800\/90{background-color:color-mix(in oklab,var(--color-gray-800)90%,transparent)}}.dark .dark\:bg-gray-900{background-color:var(--color-gray-900)}.dark .dark\:bg-gray-900\/30{background-color:#1018284d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-gray-900\/30{background-color:color-mix(in oklab,var(--color-gray-900)30%,transparent)}}.dark .dark\:bg-gray-900\/50{background-color:#10182880}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-gray-900\/50{background-color:color-mix(in oklab,var(--color-gray-900)50%,transparent)}}.dark .dark\:bg-gray-950{background-color:var(--color-gray-950)}.dark .dark\:bg-green-50{background-color:var(--color-green-50)}.dark .dark\:bg-green-100{background-color:var(--color-green-100)}.dark .dark\:bg-green-200{background-color:var(--color-green-200)}.dark .dark\:bg-green-300{background-color:var(--color-green-300)}.dark .dark\:bg-green-400{background-color:var(--color-green-400)}.dark .dark\:bg-green-500{background-color:var(--color-green-500)}.dark .dark\:bg-green-600{background-color:var(--color-green-600)}.dark .dark\:bg-green-700{background-color:var(--color-green-700)}.dark .dark\:bg-green-800{background-color:var(--color-green-800)}.dark .dark\:bg-green-900{background-color:var(--color-green-900)}.dark .dark\:bg-green-900\/20{background-color:#0d542b33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-green-900\/20{background-color:color-mix(in oklab,var(--color-green-900)20%,transparent)}}.dark .dark\:bg-green-900\/30{background-color:#0d542b4d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-green-900\/30{background-color:color-mix(in oklab,var(--color-green-900)30%,transparent)}}.dark .dark\:bg-green-900\/50{background-color:#0d542b80}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-green-900\/50{background-color:color-mix(in oklab,var(--color-green-900)50%,transparent)}}.dark .dark\:bg-green-950{background-color:var(--color-green-950)}.dark .dark\:bg-indigo-50{background-color:var(--color-indigo-50)}.dark .dark\:bg-indigo-100{background-color:var(--color-indigo-100)}.dark .dark\:bg-indigo-200{background-color:var(--color-indigo-200)}.dark .dark\:bg-indigo-300{background-color:var(--color-indigo-300)}.dark .dark\:bg-indigo-400{background-color:var(--color-indigo-400)}.dark .dark\:bg-indigo-500{background-color:var(--color-indigo-500)}.dark .dark\:bg-indigo-600{background-color:var(--color-indigo-600)}.dark .dark\:bg-indigo-700{background-color:var(--color-indigo-700)}.dark .dark\:bg-indigo-800{background-color:var(--color-indigo-800)}.dark .dark\:bg-indigo-900{background-color:var(--color-indigo-900)}.dark .dark\:bg-indigo-900\/30{background-color:#312c854d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-indigo-900\/30{background-color:color-mix(in oklab,var(--color-indigo-900)30%,transparent)}}.dark .dark\:bg-indigo-950{background-color:var(--color-indigo-950)}.dark .dark\:bg-orange-50{background-color:var(--color-orange-50)}.dark .dark\:bg-orange-100{background-color:var(--color-orange-100)}.dark .dark\:bg-orange-200{background-color:var(--color-orange-200)}.dark .dark\:bg-orange-300{background-color:var(--color-orange-300)}.dark .dark\:bg-orange-400{background-color:var(--color-orange-400)}.dark .dark\:bg-orange-500{background-color:var(--color-orange-500)}.dark .dark\:bg-orange-600{background-color:var(--color-orange-600)}.dark .dark\:bg-orange-700{background-color:var(--color-orange-700)}.dark .dark\:bg-orange-800{background-color:var(--color-orange-800)}.dark .dark\:bg-orange-900{background-color:var(--color-orange-900)}.dark .dark\:bg-orange-900\/20{background-color:#7e2a0c33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-orange-900\/20{background-color:color-mix(in oklab,var(--color-orange-900)20%,transparent)}}.dark .dark\:bg-orange-900\/30{background-color:#7e2a0c4d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-orange-900\/30{background-color:color-mix(in oklab,var(--color-orange-900)30%,transparent)}}.dark .dark\:bg-orange-900\/50{background-color:#7e2a0c80}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-orange-900\/50{background-color:color-mix(in oklab,var(--color-orange-900)50%,transparent)}}.dark .dark\:bg-orange-950{background-color:var(--color-orange-950)}.dark .dark\:bg-pink-50{background-color:var(--color-pink-50)}.dark .dark\:bg-pink-100{background-color:var(--color-pink-100)}.dark .dark\:bg-pink-200{background-color:var(--color-pink-200)}.dark .dark\:bg-pink-300{background-color:var(--color-pink-300)}.dark .dark\:bg-pink-400{background-color:var(--color-pink-400)}.dark .dark\:bg-pink-500{background-color:var(--color-pink-500)}.dark .dark\:bg-pink-600{background-color:var(--color-pink-600)}.dark .dark\:bg-pink-700{background-color:var(--color-pink-700)}.dark .dark\:bg-pink-800{background-color:var(--color-pink-800)}.dark .dark\:bg-pink-900{background-color:var(--color-pink-900)}.dark .dark\:bg-pink-950{background-color:var(--color-pink-950)}.dark .dark\:bg-primary-900\/30{background-color:#1e3a8a4d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-primary-900\/30{background-color:color-mix(in oklab,var(--color-primary-900)30%,transparent)}}.dark .dark\:bg-purple-50{background-color:var(--color-purple-50)}.dark .dark\:bg-purple-100{background-color:var(--color-purple-100)}.dark .dark\:bg-purple-200{background-color:var(--color-purple-200)}.dark .dark\:bg-purple-300{background-color:var(--color-purple-300)}.dark .dark\:bg-purple-400{background-color:var(--color-purple-400)}.dark .dark\:bg-purple-500{background-color:var(--color-purple-500)}.dark .dark\:bg-purple-600{background-color:var(--color-purple-600)}.dark .dark\:bg-purple-700{background-color:var(--color-purple-700)}.dark .dark\:bg-purple-800{background-color:var(--color-purple-800)}.dark .dark\:bg-purple-900{background-color:var(--color-purple-900)}.dark .dark\:bg-purple-900\/30{background-color:#59168b4d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-purple-900\/30{background-color:color-mix(in oklab,var(--color-purple-900)30%,transparent)}}.dark .dark\:bg-purple-900\/50{background-color:#59168b80}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-purple-900\/50{background-color:color-mix(in oklab,var(--color-purple-900)50%,transparent)}}.dark .dark\:bg-purple-950{background-color:var(--color-purple-950)}.dark .dark\:bg-red-50{background-color:var(--color-red-50)}.dark .dark\:bg-red-100{background-color:var(--color-red-100)}.dark .dark\:bg-red-200{background-color:var(--color-red-200)}.dark .dark\:bg-red-300{background-color:var(--color-red-300)}.dark .dark\:bg-red-400{background-color:var(--color-red-400)}.dark .dark\:bg-red-500{background-color:var(--color-red-500)}.dark .dark\:bg-red-600{background-color:var(--color-red-600)}.dark .dark\:bg-red-700{background-color:var(--color-red-700)}.dark .dark\:bg-red-800{background-color:var(--color-red-800)}.dark .dark\:bg-red-900{background-color:var(--color-red-900)}.dark .dark\:bg-red-900\/10{background-color:#82181a1a}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-red-900\/10{background-color:color-mix(in oklab,var(--color-red-900)10%,transparent)}}.dark .dark\:bg-red-900\/20{background-color:#82181a33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-red-900\/20{background-color:color-mix(in oklab,var(--color-red-900)20%,transparent)}}.dark .dark\:bg-red-900\/30{background-color:#82181a4d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-red-900\/30{background-color:color-mix(in oklab,var(--color-red-900)30%,transparent)}}.dark .dark\:bg-red-950{background-color:var(--color-red-950)}.dark .dark\:bg-red-950\/50{background-color:#46080980}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-red-950\/50{background-color:color-mix(in oklab,var(--color-red-950)50%,transparent)}}.dark .dark\:bg-red-950\/80{background-color:#460809cc}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-red-950\/80{background-color:color-mix(in oklab,var(--color-red-950)80%,transparent)}}.dark .dark\:bg-slate-50{background-color:var(--color-slate-50)}.dark .dark\:bg-slate-100{background-color:var(--color-slate-100)}.dark .dark\:bg-slate-200{background-color:var(--color-slate-200)}.dark .dark\:bg-slate-300{background-color:var(--color-slate-300)}.dark .dark\:bg-slate-400{background-color:var(--color-slate-400)}.dark .dark\:bg-slate-500{background-color:var(--color-slate-500)}.dark .dark\:bg-slate-600{background-color:var(--color-slate-600)}.dark .dark\:bg-slate-700{background-color:var(--color-slate-700)}.dark .dark\:bg-slate-800{background-color:var(--color-slate-800)}.dark .dark\:bg-slate-900{background-color:var(--color-slate-900)}.dark .dark\:bg-slate-950{background-color:var(--color-slate-950)}.dark .dark\:bg-white{background-color:var(--color-white)}.dark .dark\:bg-yellow-50{background-color:var(--color-yellow-50)}.dark .dark\:bg-yellow-100{background-color:var(--color-yellow-100)}.dark .dark\:bg-yellow-200{background-color:var(--color-yellow-200)}.dark .dark\:bg-yellow-300{background-color:var(--color-yellow-300)}.dark .dark\:bg-yellow-400{background-color:var(--color-yellow-400)}.dark .dark\:bg-yellow-500{background-color:var(--color-yellow-500)}.dark .dark\:bg-yellow-600{background-color:var(--color-yellow-600)}.dark .dark\:bg-yellow-700{background-color:var(--color-yellow-700)}.dark .dark\:bg-yellow-800{background-color:var(--color-yellow-800)}.dark .dark\:bg-yellow-900{background-color:var(--color-yellow-900)}.dark .dark\:bg-yellow-900\/20{background-color:#733e0a33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-yellow-900\/20{background-color:color-mix(in oklab,var(--color-yellow-900)20%,transparent)}}.dark .dark\:bg-yellow-900\/30{background-color:#733e0a4d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:bg-yellow-900\/30{background-color:color-mix(in oklab,var(--color-yellow-900)30%,transparent)}}.dark .dark\:bg-yellow-950{background-color:var(--color-yellow-950)}.dark .dark\:from-gray-50{--tw-gradient-from:var(--color-gray-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:from-gray-100{--tw-gradient-from:var(--color-gray-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:from-gray-200{--tw-gradient-from:var(--color-gray-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:from-gray-300{--tw-gradient-from:var(--color-gray-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:from-gray-400{--tw-gradient-from:var(--color-gray-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:from-gray-500{--tw-gradient-from:var(--color-gray-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:from-gray-600{--tw-gradient-from:var(--color-gray-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:from-gray-700{--tw-gradient-from:var(--color-gray-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:from-gray-800{--tw-gradient-from:var(--color-gray-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:from-gray-900{--tw-gradient-from:var(--color-gray-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:to-gray-50{--tw-gradient-to:var(--color-gray-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:to-gray-100{--tw-gradient-to:var(--color-gray-100);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:to-gray-200{--tw-gradient-to:var(--color-gray-200);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:to-gray-300{--tw-gradient-to:var(--color-gray-300);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:to-gray-400{--tw-gradient-to:var(--color-gray-400);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:to-gray-500{--tw-gradient-to:var(--color-gray-500);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:to-gray-600{--tw-gradient-to:var(--color-gray-600);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:to-gray-700{--tw-gradient-to:var(--color-gray-700);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:to-gray-800{--tw-gradient-to:var(--color-gray-800);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:to-gray-900{--tw-gradient-to:var(--color-gray-900);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark .dark\:text-center{text-align:center}.dark .dark\:text-justify{text-align:justify}.dark .dark\:text-left{text-align:left}.dark .dark\:text-right{text-align:right}.dark .dark\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.dark .dark\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.dark .dark\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.dark .dark\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.dark .dark\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.dark .dark\:text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.dark .dark\:text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.dark .dark\:leading-normal{--tw-leading:var(--leading-normal);line-height:var(--leading-normal)}.dark .dark\:leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.dark .dark\:leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.dark .dark\:font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.dark .dark\:font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.dark .dark\:font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.dark .dark\:tracking-normal{--tw-tracking:var(--tracking-normal);letter-spacing:var(--tracking-normal)}.dark .dark\:tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.dark .dark\:tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.dark .dark\:whitespace-normal{white-space:normal}.dark .dark\:whitespace-nowrap{white-space:nowrap}.dark .dark\:whitespace-pre-wrap{white-space:pre-wrap}.dark .dark\:text-amber-400{color:var(--color-amber-400)}.dark .dark\:text-black{color:var(--color-black)}.dark .dark\:text-blue-50{color:var(--color-blue-50)}.dark .dark\:text-blue-100{color:var(--color-blue-100)}.dark .dark\:text-blue-200{color:var(--color-blue-200)}.dark .dark\:text-blue-300{color:var(--color-blue-300)}.dark .dark\:text-blue-400{color:var(--color-blue-400)}.dark .dark\:text-blue-500{color:var(--color-blue-500)}.dark .dark\:text-blue-600{color:var(--color-blue-600)}.dark .dark\:text-blue-700{color:var(--color-blue-700)}.dark .dark\:text-blue-800{color:var(--color-blue-800)}.dark .dark\:text-blue-900{color:var(--color-blue-900)}.dark .dark\:text-emerald-400{color:var(--color-emerald-400)}.dark .dark\:text-gray-50{color:var(--color-gray-50)}.dark .dark\:text-gray-100{color:var(--color-gray-100)}.dark .dark\:text-gray-200{color:var(--color-gray-200)}.dark .dark\:text-gray-300{color:var(--color-gray-300)}.dark .dark\:text-gray-400{color:var(--color-gray-400)}.dark .dark\:text-gray-500{color:var(--color-gray-500)}.dark .dark\:text-gray-500\/80{color:#6a7282cc}@supports (color:color-mix(in lab,red,red)){.dark .dark\:text-gray-500\/80{color:color-mix(in oklab,var(--color-gray-500)80%,transparent)}}.dark .dark\:text-gray-600{color:var(--color-gray-600)}.dark .dark\:text-gray-700{color:var(--color-gray-700)}.dark .dark\:text-gray-800{color:var(--color-gray-800)}.dark .dark\:text-gray-900{color:var(--color-gray-900)}.dark .dark\:text-green-50{color:var(--color-green-50)}.dark .dark\:text-green-100{color:var(--color-green-100)}.dark .dark\:text-green-200{color:var(--color-green-200)}.dark .dark\:text-green-300{color:var(--color-green-300)}.dark .dark\:text-green-400{color:var(--color-green-400)}.dark .dark\:text-green-500{color:var(--color-green-500)}.dark .dark\:text-green-600{color:var(--color-green-600)}.dark .dark\:text-green-700{color:var(--color-green-700)}.dark .dark\:text-green-800{color:var(--color-green-800)}.dark .dark\:text-green-900{color:var(--color-green-900)}.dark .dark\:text-indigo-400{color:var(--color-indigo-400)}.dark .dark\:text-orange-50{color:var(--color-orange-50)}.dark .dark\:text-orange-100{color:var(--color-orange-100)}.dark .dark\:text-orange-200{color:var(--color-orange-200)}.dark .dark\:text-orange-300{color:var(--color-orange-300)}.dark .dark\:text-orange-400{color:var(--color-orange-400)}.dark .dark\:text-orange-500{color:var(--color-orange-500)}.dark .dark\:text-orange-600{color:var(--color-orange-600)}.dark .dark\:text-orange-700{color:var(--color-orange-700)}.dark .dark\:text-orange-800{color:var(--color-orange-800)}.dark .dark\:text-orange-900{color:var(--color-orange-900)}.dark .dark\:text-pink-50{color:var(--color-pink-50)}.dark .dark\:text-pink-100{color:var(--color-pink-100)}.dark .dark\:text-pink-200{color:var(--color-pink-200)}.dark .dark\:text-pink-300{color:var(--color-pink-300)}.dark .dark\:text-pink-400{color:var(--color-pink-400)}.dark .dark\:text-pink-500{color:var(--color-pink-500)}.dark .dark\:text-pink-600{color:var(--color-pink-600)}.dark .dark\:text-pink-700{color:var(--color-pink-700)}.dark .dark\:text-pink-800{color:var(--color-pink-800)}.dark .dark\:text-pink-900{color:var(--color-pink-900)}.dark .dark\:text-primary-400{color:var(--color-primary-400)}.dark .dark\:text-primary-500{color:var(--color-primary-500)}.dark .dark\:text-purple-50{color:var(--color-purple-50)}.dark .dark\:text-purple-100{color:var(--color-purple-100)}.dark .dark\:text-purple-200{color:var(--color-purple-200)}.dark .dark\:text-purple-300{color:var(--color-purple-300)}.dark .dark\:text-purple-400{color:var(--color-purple-400)}.dark .dark\:text-purple-500{color:var(--color-purple-500)}.dark .dark\:text-purple-600{color:var(--color-purple-600)}.dark .dark\:text-purple-700{color:var(--color-purple-700)}.dark .dark\:text-purple-800{color:var(--color-purple-800)}.dark .dark\:text-purple-900{color:var(--color-purple-900)}.dark .dark\:text-red-50{color:var(--color-red-50)}.dark .dark\:text-red-100{color:var(--color-red-100)}.dark .dark\:text-red-200{color:var(--color-red-200)}.dark .dark\:text-red-300{color:var(--color-red-300)}.dark .dark\:text-red-400{color:var(--color-red-400)}.dark .dark\:text-red-500{color:var(--color-red-500)}.dark .dark\:text-red-600{color:var(--color-red-600)}.dark .dark\:text-red-700{color:var(--color-red-700)}.dark .dark\:text-red-800{color:var(--color-red-800)}.dark .dark\:text-red-900{color:var(--color-red-900)}.dark .dark\:text-slate-50{color:var(--color-slate-50)}.dark .dark\:text-slate-100{color:var(--color-slate-100)}.dark .dark\:text-slate-200{color:var(--color-slate-200)}.dark .dark\:text-slate-300{color:var(--color-slate-300)}.dark .dark\:text-slate-400{color:var(--color-slate-400)}.dark .dark\:text-slate-500{color:var(--color-slate-500)}.dark .dark\:text-slate-600{color:var(--color-slate-600)}.dark .dark\:text-slate-700{color:var(--color-slate-700)}.dark .dark\:text-slate-800{color:var(--color-slate-800)}.dark .dark\:text-slate-900{color:var(--color-slate-900)}.dark .dark\:text-white{color:var(--color-white)}.dark .dark\:text-yellow-50{color:var(--color-yellow-50)}.dark .dark\:text-yellow-100{color:var(--color-yellow-100)}.dark .dark\:text-yellow-200{color:var(--color-yellow-200)}.dark .dark\:text-yellow-300{color:var(--color-yellow-300)}.dark .dark\:text-yellow-400{color:var(--color-yellow-400)}.dark .dark\:text-yellow-500{color:var(--color-yellow-500)}.dark .dark\:text-yellow-600{color:var(--color-yellow-600)}.dark .dark\:text-yellow-700{color:var(--color-yellow-700)}.dark .dark\:text-yellow-800{color:var(--color-yellow-800)}.dark .dark\:text-yellow-900{color:var(--color-yellow-900)}.dark .dark\:italic{font-style:italic}.dark .dark\:underline{text-decoration-line:underline}.dark .dark\:placeholder-gray-400::placeholder{color:var(--color-gray-400)}.dark .dark\:placeholder-gray-500::placeholder{color:var(--color-gray-500)}.dark .dark\:opacity-0{opacity:0}.dark .dark\:opacity-25{opacity:.25}.dark .dark\:opacity-50{opacity:.5}.dark .dark\:opacity-75{opacity:.75}.dark .dark\:opacity-100{opacity:1}.dark .dark\:shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.dark .dark\:shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.dark .dark\:shadow-inner{--tw-shadow:inset 0 2px 4px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.dark .dark\:shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.dark .dark\:shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.dark .dark\:shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.dark .dark\:shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.dark .dark\:shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.dark .dark\:ring-blue-50{--tw-ring-color:var(--color-blue-50)}.dark .dark\:ring-blue-100{--tw-ring-color:var(--color-blue-100)}.dark .dark\:ring-blue-200{--tw-ring-color:var(--color-blue-200)}.dark .dark\:ring-blue-300{--tw-ring-color:var(--color-blue-300)}.dark .dark\:ring-blue-400{--tw-ring-color:var(--color-blue-400)}.dark .dark\:ring-blue-500{--tw-ring-color:var(--color-blue-500)}.dark .dark\:ring-blue-600{--tw-ring-color:var(--color-blue-600)}.dark .dark\:ring-blue-700{--tw-ring-color:var(--color-blue-700)}.dark .dark\:ring-blue-800{--tw-ring-color:var(--color-blue-800)}.dark .dark\:ring-blue-900{--tw-ring-color:var(--color-blue-900)}.dark .dark\:ring-gray-50{--tw-ring-color:var(--color-gray-50)}.dark .dark\:ring-gray-100{--tw-ring-color:var(--color-gray-100)}.dark .dark\:ring-gray-200{--tw-ring-color:var(--color-gray-200)}.dark .dark\:ring-gray-300{--tw-ring-color:var(--color-gray-300)}.dark .dark\:ring-gray-400{--tw-ring-color:var(--color-gray-400)}.dark .dark\:ring-gray-500{--tw-ring-color:var(--color-gray-500)}.dark .dark\:ring-gray-600{--tw-ring-color:var(--color-gray-600)}.dark .dark\:ring-gray-700{--tw-ring-color:var(--color-gray-700)}.dark .dark\:ring-gray-800{--tw-ring-color:var(--color-gray-800)}.dark .dark\:ring-gray-900{--tw-ring-color:var(--color-gray-900)}.dark .dark\:ring-white{--tw-ring-color:var(--color-white)}.dark .dark\:ring-offset-gray-800{--tw-ring-offset-color:var(--color-gray-800)}@media(hover:hover){.dark .dark\:group-hover\:bg-gray-700:is(:where(.group):hover *){background-color:var(--color-gray-700)}.dark .dark\:group-hover\:bg-gray-800:is(:where(.group):hover *){background-color:var(--color-gray-800)}.dark .dark\:group-hover\:text-blue-400:is(:where(.group):hover *){color:var(--color-blue-400)}.dark .dark\:group-hover\:text-gray-100:is(:where(.group):hover *){color:var(--color-gray-100)}.dark .dark\:group-hover\:text-white:is(:where(.group):hover *){color:var(--color-white)}}.dark .dark\:selection\:bg-blue-800 ::selection{background-color:var(--color-blue-800)}.dark .dark\:selection\:bg-blue-800::selection{background-color:var(--color-blue-800)}.dark .dark\:selection\:text-blue-100 ::selection{color:var(--color-blue-100)}.dark .dark\:selection\:text-blue-100::selection{color:var(--color-blue-100)}.dark .dark\:odd\:bg-gray-800:nth-child(odd){background-color:var(--color-gray-800)}.dark .dark\:odd\:bg-gray-900:nth-child(odd){background-color:var(--color-gray-900)}.dark .dark\:even\:bg-gray-800:nth-child(2n){background-color:var(--color-gray-800)}.dark .dark\:even\:bg-gray-900:nth-child(2n){background-color:var(--color-gray-900)}@media(hover:hover){.dark .dark\:hover\:border-blue-600:hover{border-color:var(--color-blue-600)}.dark .dark\:hover\:border-blue-700:hover{border-color:var(--color-blue-700)}.dark .dark\:hover\:border-blue-800:hover{border-color:var(--color-blue-800)}.dark .dark\:hover\:border-gray-50:hover{border-color:var(--color-gray-50)}.dark .dark\:hover\:border-gray-100:hover{border-color:var(--color-gray-100)}.dark .dark\:hover\:border-gray-200:hover{border-color:var(--color-gray-200)}.dark .dark\:hover\:border-gray-300:hover{border-color:var(--color-gray-300)}.dark .dark\:hover\:border-gray-400:hover{border-color:var(--color-gray-400)}.dark .dark\:hover\:border-gray-500:hover{border-color:var(--color-gray-500)}.dark .dark\:hover\:border-gray-600:hover{border-color:var(--color-gray-600)}.dark .dark\:hover\:border-gray-700:hover{border-color:var(--color-gray-700)}.dark .dark\:hover\:border-gray-800:hover{border-color:var(--color-gray-800)}.dark .dark\:hover\:border-gray-900:hover{border-color:var(--color-gray-900)}.dark .dark\:hover\:bg-blue-50:hover{background-color:var(--color-blue-50)}.dark .dark\:hover\:bg-blue-100:hover{background-color:var(--color-blue-100)}.dark .dark\:hover\:bg-blue-200:hover{background-color:var(--color-blue-200)}.dark .dark\:hover\:bg-blue-300:hover{background-color:var(--color-blue-300)}.dark .dark\:hover\:bg-blue-400:hover{background-color:var(--color-blue-400)}.dark .dark\:hover\:bg-blue-500:hover{background-color:var(--color-blue-500)}.dark .dark\:hover\:bg-blue-600:hover{background-color:var(--color-blue-600)}.dark .dark\:hover\:bg-blue-700:hover{background-color:var(--color-blue-700)}.dark .dark\:hover\:bg-blue-800:hover{background-color:var(--color-blue-800)}.dark .dark\:hover\:bg-blue-900:hover{background-color:var(--color-blue-900)}.dark .dark\:hover\:bg-blue-900\/20:hover{background-color:#1c398e33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:hover\:bg-blue-900\/20:hover{background-color:color-mix(in oklab,var(--color-blue-900)20%,transparent)}}.dark .dark\:hover\:bg-blue-900\/30:hover{background-color:#1c398e4d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:hover\:bg-blue-900\/30:hover{background-color:color-mix(in oklab,var(--color-blue-900)30%,transparent)}}.dark .dark\:hover\:bg-gray-50:hover{background-color:var(--color-gray-50)}.dark .dark\:hover\:bg-gray-100:hover{background-color:var(--color-gray-100)}.dark .dark\:hover\:bg-gray-200:hover{background-color:var(--color-gray-200)}.dark .dark\:hover\:bg-gray-300:hover{background-color:var(--color-gray-300)}.dark .dark\:hover\:bg-gray-400:hover{background-color:var(--color-gray-400)}.dark .dark\:hover\:bg-gray-500:hover{background-color:var(--color-gray-500)}.dark .dark\:hover\:bg-gray-600:hover{background-color:var(--color-gray-600)}.dark .dark\:hover\:bg-gray-700:hover{background-color:var(--color-gray-700)}.dark .dark\:hover\:bg-gray-700\/50:hover{background-color:#36415380}@supports (color:color-mix(in lab,red,red)){.dark .dark\:hover\:bg-gray-700\/50:hover{background-color:color-mix(in oklab,var(--color-gray-700)50%,transparent)}}.dark .dark\:hover\:bg-gray-800:hover{background-color:var(--color-gray-800)}.dark .dark\:hover\:bg-gray-800\/50:hover{background-color:#1e293980}@supports (color:color-mix(in lab,red,red)){.dark .dark\:hover\:bg-gray-800\/50:hover{background-color:color-mix(in oklab,var(--color-gray-800)50%,transparent)}}.dark .dark\:hover\:bg-gray-900:hover{background-color:var(--color-gray-900)}.dark .dark\:hover\:bg-indigo-600:hover{background-color:var(--color-indigo-600)}.dark .dark\:hover\:bg-orange-900\/20:hover{background-color:#7e2a0c33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:hover\:bg-orange-900\/20:hover{background-color:color-mix(in oklab,var(--color-orange-900)20%,transparent)}}.dark .dark\:hover\:bg-orange-900\/30:hover{background-color:#7e2a0c4d}@supports (color:color-mix(in lab,red,red)){.dark .dark\:hover\:bg-orange-900\/30:hover{background-color:color-mix(in oklab,var(--color-orange-900)30%,transparent)}}.dark .dark\:hover\:bg-red-600:hover{background-color:var(--color-red-600)}.dark .dark\:hover\:bg-red-900\/20:hover{background-color:#82181a33}@supports (color:color-mix(in lab,red,red)){.dark .dark\:hover\:bg-red-900\/20:hover{background-color:color-mix(in oklab,var(--color-red-900)20%,transparent)}}.dark .dark\:hover\:bg-slate-50:hover{background-color:var(--color-slate-50)}.dark .dark\:hover\:bg-slate-100:hover{background-color:var(--color-slate-100)}.dark .dark\:hover\:bg-slate-200:hover{background-color:var(--color-slate-200)}.dark .dark\:hover\:bg-slate-300:hover{background-color:var(--color-slate-300)}.dark .dark\:hover\:bg-slate-400:hover{background-color:var(--color-slate-400)}.dark .dark\:hover\:bg-slate-500:hover{background-color:var(--color-slate-500)}.dark .dark\:hover\:bg-slate-600:hover{background-color:var(--color-slate-600)}.dark .dark\:hover\:bg-slate-700:hover{background-color:var(--color-slate-700)}.dark .dark\:hover\:bg-slate-800:hover{background-color:var(--color-slate-800)}.dark .dark\:hover\:bg-slate-900:hover{background-color:var(--color-slate-900)}.dark .dark\:hover\:bg-white\/10:hover{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.dark .dark\:hover\:bg-white\/10:hover{background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.dark .dark\:hover\:text-black:hover{color:var(--color-black)}.dark .dark\:hover\:text-blue-50:hover{color:var(--color-blue-50)}.dark .dark\:hover\:text-blue-100:hover{color:var(--color-blue-100)}.dark .dark\:hover\:text-blue-200:hover{color:var(--color-blue-200)}.dark .dark\:hover\:text-blue-300:hover{color:var(--color-blue-300)}.dark .dark\:hover\:text-blue-400:hover{color:var(--color-blue-400)}.dark .dark\:hover\:text-blue-500:hover{color:var(--color-blue-500)}.dark .dark\:hover\:text-blue-600:hover{color:var(--color-blue-600)}.dark .dark\:hover\:text-blue-700:hover{color:var(--color-blue-700)}.dark .dark\:hover\:text-blue-800:hover{color:var(--color-blue-800)}.dark .dark\:hover\:text-blue-900:hover{color:var(--color-blue-900)}.dark .dark\:hover\:text-gray-50:hover{color:var(--color-gray-50)}.dark .dark\:hover\:text-gray-100:hover{color:var(--color-gray-100)}.dark .dark\:hover\:text-gray-200:hover{color:var(--color-gray-200)}.dark .dark\:hover\:text-gray-300:hover{color:var(--color-gray-300)}.dark .dark\:hover\:text-gray-400:hover{color:var(--color-gray-400)}.dark .dark\:hover\:text-gray-500:hover{color:var(--color-gray-500)}.dark .dark\:hover\:text-gray-600:hover{color:var(--color-gray-600)}.dark .dark\:hover\:text-gray-700:hover{color:var(--color-gray-700)}.dark .dark\:hover\:text-gray-800:hover{color:var(--color-gray-800)}.dark .dark\:hover\:text-gray-900:hover{color:var(--color-gray-900)}.dark .dark\:hover\:text-green-50:hover{color:var(--color-green-50)}.dark .dark\:hover\:text-green-100:hover{color:var(--color-green-100)}.dark .dark\:hover\:text-green-200:hover{color:var(--color-green-200)}.dark .dark\:hover\:text-green-300:hover{color:var(--color-green-300)}.dark .dark\:hover\:text-green-400:hover{color:var(--color-green-400)}.dark .dark\:hover\:text-green-500:hover{color:var(--color-green-500)}.dark .dark\:hover\:text-green-600:hover{color:var(--color-green-600)}.dark .dark\:hover\:text-green-700:hover{color:var(--color-green-700)}.dark .dark\:hover\:text-green-800:hover{color:var(--color-green-800)}.dark .dark\:hover\:text-green-900:hover{color:var(--color-green-900)}.dark .dark\:hover\:text-red-50:hover{color:var(--color-red-50)}.dark .dark\:hover\:text-red-100:hover{color:var(--color-red-100)}.dark .dark\:hover\:text-red-200:hover{color:var(--color-red-200)}.dark .dark\:hover\:text-red-300:hover{color:var(--color-red-300)}.dark .dark\:hover\:text-red-400:hover{color:var(--color-red-400)}.dark .dark\:hover\:text-red-500:hover{color:var(--color-red-500)}.dark .dark\:hover\:text-red-600:hover{color:var(--color-red-600)}.dark .dark\:hover\:text-red-700:hover{color:var(--color-red-700)}.dark .dark\:hover\:text-red-800:hover{color:var(--color-red-800)}.dark .dark\:hover\:text-red-900:hover{color:var(--color-red-900)}.dark .dark\:hover\:text-white:hover{color:var(--color-white)}}.dark .dark\:focus\:border-gray-500:focus{border-color:var(--color-gray-500)}.dark .dark\:focus\:border-gray-600:focus{border-color:var(--color-gray-600)}.dark .dark\:focus\:border-gray-700:focus{border-color:var(--color-gray-700)}.dark .dark\:focus\:bg-gray-700:focus{background-color:var(--color-gray-700)}.dark .dark\:focus\:bg-gray-800:focus{background-color:var(--color-gray-800)}.dark .dark\:focus\:bg-gray-900:focus{background-color:var(--color-gray-900)}.dark .dark\:focus\:text-gray-100:focus{color:var(--color-gray-100)}.dark .dark\:focus\:text-gray-200:focus{color:var(--color-gray-200)}.dark .dark\:focus\:text-gray-300:focus{color:var(--color-gray-300)}.dark .dark\:focus\:text-white:focus{color:var(--color-white)}.dark .dark\:focus\:ring-amber-600:focus{--tw-ring-color:var(--color-amber-600)}.dark .dark\:focus\:ring-blue-400:focus{--tw-ring-color:var(--color-blue-400)}.dark .dark\:focus\:ring-blue-500:focus{--tw-ring-color:var(--color-blue-500)}.dark .dark\:focus\:ring-blue-600:focus{--tw-ring-color:var(--color-blue-600)}.dark .dark\:focus\:ring-blue-700:focus{--tw-ring-color:var(--color-blue-700)}.dark .dark\:focus\:ring-gray-500:focus{--tw-ring-color:var(--color-gray-500)}.dark .dark\:focus\:ring-gray-600:focus{--tw-ring-color:var(--color-gray-600)}.dark .dark\:focus\:ring-gray-700:focus{--tw-ring-color:var(--color-gray-700)}.dark .dark\:focus\:ring-indigo-400:focus{--tw-ring-color:var(--color-indigo-400)}.dark .dark\:focus\:ring-white:focus{--tw-ring-color:var(--color-white)}.dark .dark\:focus\:ring-offset-gray-800:focus{--tw-ring-offset-color:var(--color-gray-800)}.dark .dark\:focus\:ring-offset-gray-900:focus{--tw-ring-offset-color:var(--color-gray-900)}.dark .dark\:active\:bg-gray-200:active{background-color:var(--color-gray-200)}.dark .dark\:active\:bg-gray-600:active{background-color:var(--color-gray-600)}.dark .dark\:active\:bg-gray-700:active{background-color:var(--color-gray-700)}.dark .dark\:active\:bg-gray-800:active{background-color:var(--color-gray-800)}.dark .dark\:disabled\:bg-gray-700:disabled{background-color:var(--color-gray-700)}.dark .dark\:disabled\:bg-gray-800:disabled{background-color:var(--color-gray-800)}.dark .dark\:disabled\:text-gray-500:disabled{color:var(--color-gray-500)}.dark .dark\:disabled\:text-gray-600:disabled{color:var(--color-gray-600)}.dark .dark\:disabled\:opacity-50:disabled{opacity:.5}.\[\&_img\]\:hidden img{display:none}.\[\&_mark\]\:rounded mark{border-radius:.25rem}.\[\&_mark\]\:bg-yellow-200 mark{background-color:var(--color-yellow-200)}.\[\&_mark\]\:px-0\.5 mark{padding-inline:calc(var(--spacing)*.5)}.dark :is(.\[\&_mark\]\:dark\:bg-yellow-500\/40 mark){background-color:#edb20066}@supports (color:color-mix(in lab,red,red)){.dark :is(.\[\&_mark\]\:dark\:bg-yellow-500\/40 mark){background-color:color-mix(in oklab,var(--color-yellow-500)40%,transparent)}}.\[\&_table\]\:hidden table{display:none}.\[\&_table\]\:w-full table{width:100%}.\[\&_table\]\:border-collapse table{border-collapse:collapse}.\[\&_table\]\:border table{border-style:var(--tw-border-style);border-width:1px}.\[\&_table\]\:border-gray-300 table{border-color:var(--color-gray-300)}.dark .dark\:\[\&_table\]\:border-gray-600 table{border-color:var(--color-gray-600)}.\[\&_td\]\:border td{border-style:var(--tw-border-style);border-width:1px}.\[\&_td\]\:border-gray-300 td{border-color:var(--color-gray-300)}.\[\&_td\]\:px-4 td{padding-inline:calc(var(--spacing)*4)}.\[\&_td\]\:py-2 td{padding-block:calc(var(--spacing)*2)}.dark .dark\:\[\&_td\]\:border-gray-600 td{border-color:var(--color-gray-600)}.\[\&_textarea\]\:\!border-red-500 textarea{border-color:var(--color-red-500)!important}.\[\&_textarea\]\:focus\:\!ring-red-500 textarea:focus{--tw-ring-color:var(--color-red-500)!important}.dark :is(.\[\&_textarea\]\:dark\:\!border-red-500 textarea){border-color:var(--color-red-500)!important}.\[\&_th\]\:border th{border-style:var(--tw-border-style);border-width:1px}.\[\&_th\]\:border-gray-300 th{border-color:var(--color-gray-300)}.\[\&_th\]\:bg-gray-100 th{background-color:var(--color-gray-100)}.\[\&_th\]\:px-4 th{padding-inline:calc(var(--spacing)*4)}.\[\&_th\]\:py-2 th{padding-block:calc(var(--spacing)*2)}.\[\&_th\]\:text-left th{text-align:left}.dark .dark\:\[\&_th\]\:border-gray-600 th{border-color:var(--color-gray-600)}.dark .dark\:\[\&_th\]\:bg-gray-800 th{background-color:var(--color-gray-800)}.\[\&_tr\:hover\]\:bg-gray-50 tr:hover{background-color:var(--color-gray-50)}.dark .dark\:\[\&_tr\:hover\]\:bg-gray-700\/50 tr:hover{background-color:#36415380}@supports (color:color-mix(in lab,red,red)){.dark .dark\:\[\&_tr\:hover\]\:bg-gray-700\/50 tr:hover{background-color:color-mix(in oklab,var(--color-gray-700)50%,transparent)}}.\[\&\:\:-webkit-inner-spin-button\]\:appearance-none::-webkit-inner-spin-button{appearance:none}.\[\&\:\:-webkit-outer-spin-button\]\:appearance-none::-webkit-outer-spin-button{appearance:none}.sr-only{clip:rect(0,0,0,0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none}.scrollbar-hide::-webkit-scrollbar{display:none}.line-clamp-1{-webkit-line-clamp:1;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.line-clamp-3{-webkit-line-clamp:3;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}}@property --tw-border-spacing-x{syntax:"";inherits:false;initial-value:0}@property --tw-border-spacing-y{syntax:"";inherits:false;initial-value:0}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-pan-x{syntax:"*";inherits:false}@property --tw-pan-y{syntax:"*";inherits:false}@property --tw-pinch-zoom{syntax:"*";inherits:false}@property --tw-scroll-snap-strictness{syntax:"*";inherits:false;initial-value:proximity}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}@keyframes ping{75%,to{opacity:0;transform:scale(2)}}@keyframes pulse{50%{opacity:.5}}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}}.yarl__fullsize{height:100%;width:100%}.yarl__relative{position:relative}.yarl__portal{inset:0;opacity:0;overflow:hidden;position:fixed;transition:opacity var(--yarl__fade_animation_duration,.25s) var(--yarl__fade_animation_timing_function,ease);z-index:var(--yarl__portal_zindex,9999)}.yarl__portal_open{opacity:1}.yarl__container{background-color:var(--yarl__container_background_color,var(--yarl__color_backdrop,#000));inset:0;outline:none;overflow:hidden;overscroll-behavior:var(--yarl__controller_overscroll_behavior,contain);position:absolute;touch-action:var(--yarl__controller_touch_action,none);-webkit-user-select:none;-moz-user-select:none;user-select:none}.yarl__carousel{align-content:center;align-items:stretch;display:flex;flex:0 0 auto;height:100%;justify-content:center;opacity:var(--yarl__pull_opacity,1);transform:translate(var(--yarl__swipe_offset,0),var(--yarl__pull_offset,0));width:calc(100% + (var(--yarl__carousel_slides_count) - 1)*(100% + var(--yarl__carousel_spacing_px, 0)*1px + var(--yarl__carousel_spacing_percent, 0)*1%))}.yarl__carousel_with_slides{-moz-column-gap:calc(var(--yarl__carousel_spacing_px, 0)*1px + 100/(var(--yarl__carousel_slides_count)*100 + (var(--yarl__carousel_slides_count) - 1)*var(--yarl__carousel_spacing_percent, 0))*var(--yarl__carousel_spacing_percent, 0)*1%);column-gap:calc(var(--yarl__carousel_spacing_px, 0)*1px + 100/(var(--yarl__carousel_slides_count)*100 + (var(--yarl__carousel_slides_count) - 1)*var(--yarl__carousel_spacing_percent, 0))*var(--yarl__carousel_spacing_percent, 0)*1%)}.yarl__flex_center{align-content:center;align-items:center;display:flex;justify-content:center}.yarl__slide{flex:1;overflow:hidden;padding:calc(var(--yarl__carousel_padding_px, 0)*1px + 100/(var(--yarl__carousel_slides_count)*100 + (var(--yarl__carousel_slides_count) - 1)*var(--yarl__carousel_spacing_percent, 0))*var(--yarl__carousel_padding_percent, 0)*1%);position:relative}[dir=rtl] .yarl__slide{--yarl__direction:-1}.yarl__slide_image{max-height:100%;max-width:100%;-o-object-fit:contain;object-fit:contain;touch-action:var(--yarl__controller_touch_action,none);-moz-user-select:none;user-select:none;-webkit-user-select:none;-webkit-touch-callout:none}.yarl__slide_image_cover{height:100%;-o-object-fit:cover;object-fit:cover;width:100%}.yarl__slide_image_loading{opacity:0}@media screen and (min-width:800px){.yarl__slide_wrapper:not(.yarl__slide_wrapper_interactive) .yarl__slide_image{-webkit-backface-visibility:hidden;-webkit-transform:translateZ(0);-webkit-transform-style:preserve-3d}}.yarl__slide_placeholder{left:50%;line-height:0;position:absolute;top:50%;transform:translate(-50%) translateY(-50%)}.yarl__slide_loading{animation:yarl__delayed_fadein 1s linear;color:var(--yarl__slide_icon_loading_color,var(--yarl__color_button,hsla(0,0%,100%,.8)))}.yarl__slide_loading line{animation:yarl__stroke_opacity 1s linear infinite}.yarl__slide_loading line:first-of-type{animation-delay:-1.875s}.yarl__slide_loading line:nth-of-type(2){animation-delay:-1.75s}.yarl__slide_loading line:nth-of-type(3){animation-delay:-1.625s}.yarl__slide_loading line:nth-of-type(4){animation-delay:-1.5s}.yarl__slide_loading line:nth-of-type(5){animation-delay:-1.375s}.yarl__slide_loading line:nth-of-type(6){animation-delay:-1.25s}.yarl__slide_loading line:nth-of-type(7){animation-delay:-1.125s}.yarl__slide_loading line:nth-of-type(8){animation-delay:-1s}.yarl__slide_error{color:var(--yarl__slide_icon_error_color,red);height:var(--yarl__slide_icon_error_size,48px);width:var(--yarl__slide_icon_error_size,48px)}@media(prefers-reduced-motion){.yarl__portal,.yarl__slide{transition:unset}.yarl__slide_loading,.yarl__slide_loading line{animation:unset}}.yarl__toolbar{display:flex;justify-content:flex-end;inset:0 0 auto auto;padding:var(--yarl__toolbar_padding,8px);position:absolute}[dir=rtl] .yarl__toolbar{inset:0 auto auto 0}.yarl__icon{height:var(--yarl__icon_size,32px);width:var(--yarl__icon_size,32px)}.yarl__button{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:var(--yarl__button_background_color,transparent);border:var(--yarl__button_border,0);color:var(--yarl__color_button,hsla(0,0%,100%,.8));cursor:pointer;filter:var(--yarl__button_filter,drop-shadow(2px 2px 2px rgba(0,0,0,.8)));line-height:0;margin:var(--yarl__button_margin,0);outline:none;padding:var(--yarl__button_padding,8px);-webkit-tap-highlight-color:transparent}.yarl__button:focus{color:var(--yarl__color_button_active,#fff)}.yarl__button:focus:not(:focus-visible){color:var(--yarl__color_button,hsla(0,0%,100%,.8))}.yarl__button:focus-visible{color:var(--yarl__color_button_active,#fff)}@media(hover:hover){.yarl__button:focus-visible:hover,.yarl__button:focus:hover,.yarl__button:hover{color:var(--yarl__color_button_active,#fff)}}.yarl__button:disabled{color:var(--yarl__color_button_disabled,hsla(0,0%,100%,.4));cursor:default}.yarl__navigation_next,.yarl__navigation_prev{padding:var(--yarl__navigation_button_padding,24px 16px);position:absolute;top:50%;transform:translateY(-50%)}.yarl__navigation_prev{left:0}[dir=rtl] .yarl__navigation_prev{left:unset;right:0;transform:translateY(-50%) rotate(180deg)}.yarl__navigation_next{right:0}[dir=rtl] .yarl__navigation_next{left:0;right:unset;transform:translateY(-50%) rotate(180deg)}.yarl__no_scroll{height:100%;overflow:hidden;overscroll-behavior:none}@keyframes yarl__delayed_fadein{0%{opacity:0}80%{opacity:0}to{opacity:1}}@keyframes yarl__stroke_opacity{0%{stroke-opacity:1}to{stroke-opacity:.125}}.yarl__counter{bottom:var(--yarl__counter_bottom,unset);color:var(--yarl__counter_color,var(--yarl__color_button,hsla(0,0%,100%,.8)));filter:var(--yarl__counter_filter,drop-shadow(2px 2px 2px rgba(0,0,0,.8)));left:var(--yarl__counter_left,0);line-height:var(--yarl__counter_line_height,var(--yarl__icon_size,32px));margin:var(--yarl__counter_margin,var(--yarl__toolbar_padding,8px));padding:var(--yarl__counter_padding,var(--yarl__button_padding,8px));position:var(--yarl__counter_position,absolute);right:var(--yarl__counter_right,unset);top:var(--yarl__counter_top,0);-webkit-user-select:var(--yarl__counter_user_select,none);-moz-user-select:var(--yarl__counter_user_select,none);user-select:var(--yarl__counter_user_select,none)}.yarl__thumbnails{display:flex;height:100%}.yarl__thumbnails_bottom,.yarl__thumbnails_end .yarl__thumbnails_track,.yarl__thumbnails_start .yarl__thumbnails_track,.yarl__thumbnails_top{flex-direction:column}.yarl__thumbnails_wrapper{flex:1;position:relative}.yarl__thumbnails_container{background-color:var(--yarl__thumbnails_container_background_color,var(--yarl__color_backdrop,#000));flex:0 0 auto;overflow:hidden;padding:var(--yarl__thumbnails_container_padding,16px);position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-touch-callout:none}.yarl__thumbnails_vignette{pointer-events:none;position:absolute;--yarl__thumbnails_vignette_size:12%}@media(min-width:1200px){.yarl__thumbnails_vignette{--yarl__thumbnails_vignette_size:8%}}@media(min-width:2000px){.yarl__thumbnails_vignette{--yarl__thumbnails_vignette_size:5%}}.yarl__thumbnails_bottom .yarl__thumbnails_vignette,.yarl__thumbnails_top .yarl__thumbnails_vignette{background:linear-gradient(to right,var(--yarl__color_backdrop,#000) 0,transparent var(--yarl__thumbnails_vignette_size,12%) calc(100% - var(--yarl__thumbnails_vignette_size, 12%)),var(--yarl__color_backdrop,#000) 100%);height:100%;left:0;right:0}.yarl__thumbnails_end .yarl__thumbnails_vignette,.yarl__thumbnails_start .yarl__thumbnails_vignette{background:linear-gradient(to bottom,var(--yarl__color_backdrop,#000) 0,transparent var(--yarl__thumbnails_vignette_size,12%) calc(100% - var(--yarl__thumbnails_vignette_size, 12%)),var(--yarl__color_backdrop,#000) 100%);bottom:0;top:0;width:100%}.yarl__thumbnails_track{gap:var(--yarl__thumbnails_thumbnail_gap,16px);outline:none}.yarl__thumbnails_thumbnail{-webkit-appearance:none;-moz-appearance:none;appearance:none;background:var(--yarl__thumbnails_thumbnail_background,#000);border-color:var(--yarl__thumbnails_thumbnail_border_color,var(--yarl__color_button,hsla(0,0%,100%,.8)));border-radius:var(--yarl__thumbnails_thumbnail_border_radius,4px);border-style:var(--yarl__thumbnails_thumbnail_border_style,solid);border-width:var(--yarl__thumbnails_thumbnail_border,1px);cursor:pointer;flex:0 0 auto;-webkit-tap-highlight-color:transparent;box-sizing:content-box;height:var(--yarl__thumbnails_thumbnail_height,80px);outline:none;overflow:hidden;padding:var(--yarl__thumbnails_thumbnail_padding,4px);position:relative;width:var(--yarl__thumbnails_thumbnail_width,120px)}.yarl__thumbnails_thumbnail_active{border-color:var(--yarl__thumbnails_thumbnail_active_border_color,var(--yarl__color_button_active,#fff))}.yarl__thumbnails_thumbnail_fadein{animation:yarl__thumbnails_thumbnail_fadein var(--yarl__thumbnails_thumbnail_fadein_duration,.5s) ease-in-out var(--yarl__thumbnails_thumbnail_fadein_delay,0s) forwards;opacity:0}.yarl__thumbnails_thumbnail_fadeout{animation:yarl__thumbnails_thumbnail_fadeout var(--yarl__thumbnails_thumbnail_fadeout_duration,.5s) ease-in-out var(--yarl__thumbnails_thumbnail_fadeout_delay,0s) forwards;cursor:unset}.yarl__thumbnails_thumbnail_placeholder{cursor:unset;visibility:hidden}.yarl__thumbnails_thumbnail:focus{box-shadow:var(--yarl__thumbnails_thumbnail_focus_box_shadow,#000 0 0 0 2px,var(--yarl__color_button,hsla(0,0%,100%,.8)) 0 0 0 4px)}.yarl__thumbnails_thumbnail:focus:not(:focus-visible){box-shadow:unset}.yarl__thumbnails_thumbnail:focus-visible{box-shadow:var(--yarl__thumbnails_thumbnail_focus_box_shadow,#000 0 0 0 2px,var(--yarl__color_button,hsla(0,0%,100%,.8)) 0 0 0 4px)}.yarl__thumbnails_thumbnail_icon{color:var(--yarl__thumbnails_thumbnail_icon_color,var(--yarl__color_button,hsla(0,0%,100%,.8)));filter:var(--yarl__thumbnails_thumbnail_icon_filter,drop-shadow(2px 2px 2px rgba(0,0,0,.8)));height:var(--yarl__thumbnails_thumbnail_icon_size,32px);left:50%;position:absolute;top:50%;transform:translate(-50%) translateY(-50%);width:var(--yarl__thumbnails_thumbnail_icon_size,32px)}@keyframes yarl__thumbnails_thumbnail_fadein{0%{opacity:0}to{opacity:1}}@keyframes yarl__thumbnails_thumbnail_fadeout{0%{opacity:1}to{opacity:0}} diff --git a/templates/_bundled/sirsoft-basic/dist/js/components.iife.js b/templates/_bundled/sirsoft-basic/dist/js/components.iife.js index b5ead756..a78ee80d 100644 --- a/templates/_bundled/sirsoft-basic/dist/js/components.iife.js +++ b/templates/_bundled/sirsoft-basic/dist/js/components.iife.js @@ -39,7 +39,7 @@ var SirsoftBasic=(function(J,d,k,Jt){"use strict";function Mc(e){const t=Object. [&_tr:hover]:bg-gray-50 dark:[&_tr:hover]:bg-gray-700/50 after:content-[''] after:block after:clear-both ${n} - `.trim().replace(/\s+/g," ");return d.jsx(W,{id:a,className:c,dangerouslySetInnerHTML:{__html:h},...s})},Wf=Object.freeze(Object.defineProperty({__proto__:null,HtmlContent:Yo},Symbol.toStringTag,{value:"Module"})),Xo=()=>window.G7Core,qo=(e,t)=>Xo()?.t?.(e,t)??e,Dl=({content:e="",onChange:t,isHtml:r=!1,onIsHtmlChange:n,rows:o=15,placeholder:a="",label:s,showHtmlModeToggle:l=!0,contentClassName:g="",purifyConfig:h,className:c="",name:i="content",htmlFieldName:u="content_mode",readOnly:f=!1,id:p,editorAttrs:m})=>{const[w,x]=k.useState(r),[A,v]=k.useState(e),[E,O]=k.useState(!1);k.useEffect(()=>{x(r)},[r]),k.useEffect(()=>{v(e)},[e]);const _=k.useCallback(y=>{const N=y.target.value;if(v(N),t){const M=Xo()?.createChangeEvent?.({value:N,name:i,type:"textarea"})??{target:{name:i,value:N}};t(M)}},[t,i]),I=k.useCallback(y=>{const N=y.target.checked;if(x(N),N||O(!1),n){const M=Xo()?.createChangeEvent?.({checked:N,name:u,type:"checkbox"})??{target:{name:u,checked:N}};n(M)}},[n,u]),C=k.useCallback(()=>{O(y=>!y)},[]);return d.jsxs(W,{className:`space-y-2 ${c}`,id:p,...m,children:[d.jsxs(W,{className:"flex items-center justify-between",children:[s&&d.jsx(yr,{className:"block text-sm font-medium text-gray-500 dark:text-gray-400",children:s}),d.jsxs(W,{className:"flex items-center gap-3",children:[w&&!f&&d.jsx(Q,{type:"button",onClick:C,className:`px-3 py-1.5 text-xs font-bold rounded-lg focus:outline-none focus:ring-2 ${E?"text-gray-700 dark:text-gray-200 bg-gray-200 dark:bg-gray-600 border border-gray-300 dark:border-gray-500 hover:bg-gray-300 dark:hover:bg-gray-500 focus:ring-gray-400 dark:focus:ring-gray-500":"text-blue-600 dark:text-blue-400 bg-white dark:bg-gray-700 border border-blue-300 dark:border-blue-600 hover:bg-blue-50 dark:hover:bg-gray-600 focus:ring-blue-500 dark:focus:ring-blue-600"}`,children:qo(E?"common.preview_off":"common.preview")}),l&&d.jsxs(yr,{className:"flex items-center gap-2 p-2 cursor-pointer",children:[d.jsx(xt,{type:"checkbox",name:u,checked:w,onChange:I,disabled:f,className:"w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500 dark:focus:ring-blue-600 dark:ring-offset-gray-800 focus:ring-2 dark:bg-gray-700 dark:border-gray-600"}),d.jsx(W,{className:"text-sm font-medium text-gray-700 dark:text-gray-300",children:qo("common.html_mode")})]})]})]}),!E&&d.jsx(no,{name:i,value:A,onChange:_,placeholder:a,rows:o,readOnly:f,className:`block w-full rounded-lg border px-3 py-2 text-sm placeholder-gray-400 dark:placeholder-gray-500 focus:outline-none focus:ring-1 disabled:opacity-50 disabled:cursor-not-allowed ${w?"font-mono bg-white dark:bg-gray-800 border-blue-300 dark:border-blue-600 text-gray-800 dark:text-gray-200 focus:border-blue-500 focus:ring-blue-500":"bg-white dark:bg-gray-800 border-gray-300 dark:border-gray-600 text-gray-900 dark:text-white focus:border-blue-500 focus:ring-blue-500"}`}),E&&d.jsx(W,{className:"p-4 bg-gray-50 dark:bg-gray-900 rounded-lg border border-gray-200 dark:border-gray-800 min-h-[400px]",children:d.jsx(Yo,{content:A,isHtml:!0,className:g||"prose dark:prose-invert max-w-none text-gray-900 dark:text-gray-100",purifyConfig:h})})]})},Kf=Object.freeze(Object.defineProperty({__proto__:null,HtmlEditor:Dl},Symbol.toStringTag,{value:"Module"})),Ll=e=>window.G7Core?.t?.(e)??e,Zo=({maxHeight:e=500,expandText:t,collapseText:r,className:n="",children:o,id:a,editorAttrs:s})=>{const[l,g]=k.useState(!1),[h,c]=k.useState(!1),i=k.useRef(null),u=k.useCallback(()=>{if(i.current){const w=i.current.scrollHeight;c(w>e)}},[e]);k.useEffect(()=>{u();const w=i.current;if(!w)return;const x=w.querySelectorAll("img");x.forEach(v=>{v.complete||v.addEventListener("load",u)});let A=null;return typeof ResizeObserver<"u"&&(A=new ResizeObserver(u),A.observe(w)),()=>{x.forEach(v=>{v.removeEventListener("load",u)}),A?.disconnect()}},[u,o]);const f=()=>{g(w=>!w)},p=t||Ll("sirsoft-ecommerce.shop.product.expand_detail"),m=r||Ll("sirsoft-ecommerce.shop.product.collapse_detail");return d.jsxs(W,{className:n,id:a,...s,children:[d.jsxs(W,{className:"relative",children:[d.jsx(W,{ref:i,className:!l&&h?"overflow-hidden transition-[max-height] duration-300 ease-in-out":"transition-[max-height] duration-300 ease-in-out",style:!l&&h?{maxHeight:`${e}px`}:void 0,children:o}),!l&&h&&d.jsx(W,{className:"absolute bottom-0 left-0 right-0 h-24 bg-gradient-to-t from-white dark:from-gray-900 to-transparent pointer-events-none"})]}),h&&d.jsxs(Q,{type:"button",onClick:f,className:"flex items-center justify-center w-full py-3.5 bg-white dark:bg-gray-900 border border-gray-200 dark:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors cursor-pointer gap-1.5",children:[d.jsx(te,{className:"text-sm font-semibold text-gray-600 dark:text-gray-400",children:l?m:p}),d.jsx(de,{name:l?"chevron-up":"chevron-down",size:"sm"})]})]})},Vf=Object.freeze(Object.defineProperty({__proto__:null,ExpandableContent:Zo,default:Zo},Symbol.toStringTag,{value:"Module"})),Yf=(e,t)=>window.G7Core?.t?.(e,t)??e,Qo=({isOpen:e,onClose:t,title:r,icon:n,iconClassName:o="text-gray-500 dark:text-gray-400",closeOnBackdropClick:a=!0,closeOnOverlayClick:s,showCloseButton:l=!0,closeOnEscape:g=!0,children:h,width:c="500px",className:i="",style:u})=>{const f=s!==void 0?s:a,p=k.useRef(null),m=k.useRef(null);if(k.useEffect(()=>{const x=A=>{A.key==="Escape"&&e&&g&&t()};if(e&&g)return document.addEventListener("keydown",x),()=>document.removeEventListener("keydown",x)},[e,t,g]),k.useEffect(()=>{if(e&&p.current){m.current=document.activeElement;const x=p.current.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'),A=x[0],v=x[x.length-1];A?.focus();const E=O=>{O.key==="Tab"&&(O.shiftKey?document.activeElement===A&&(O.preventDefault(),v?.focus()):document.activeElement===v&&(O.preventDefault(),A?.focus()))};return document.addEventListener("keydown",E),()=>{document.removeEventListener("keydown",E),m.current?.focus()}}},[e]),k.useEffect(()=>{if(e)return document.body.style.overflow="hidden",()=>{document.body.style.overflow=""}},[e]),!e)return null;const w=u?.zIndex??50;return d.jsxs(W,{className:"fixed inset-0 flex items-center justify-center",style:{zIndex:w},onClick:f?t:void 0,children:[d.jsx(W,{className:"absolute inset-0 bg-black/50","aria-hidden":"true"}),d.jsxs(W,{ref:p,className:`relative bg-white dark:bg-gray-800 rounded-lg shadow-xl max-h-[90vh] overflow-hidden ${i}`,style:{width:c,...u?{...u,zIndex:void 0}:{}},onClick:x=>x.stopPropagation(),role:"dialog","aria-modal":"true","aria-labelledby":r?"modal-title":void 0,children:[(r||n||l)&&d.jsxs(W,{className:"flex items-center justify-between p-4",children:[(r||n)&&d.jsxs(W,{id:"modal-title",className:"flex items-center gap-3 text-lg font-semibold text-gray-900 dark:text-white",children:[n&&d.jsx(de,{name:n,size:"md",className:o}),r]}),l&&d.jsx(Q,{onClick:t,className:"ml-auto text-gray-400 dark:text-gray-500 hover:text-gray-600 dark:hover:text-gray-300 focus:outline-none","aria-label":Yf("common.close_modal"),children:d.jsx("svg",{className:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:d.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})})})]}),d.jsx(W,{className:"px-6 py-4 overflow-y-auto max-h-[calc(90vh-140px)]",children:h})]})]})},Xf=Object.freeze(Object.defineProperty({__proto__:null,Modal:Qo},Symbol.toStringTag,{value:"Module"})),Jo=(e,t)=>window.G7Core?.t?.(e,t)??e,Ro=({isOpen:e,onClose:t,title:r,message:n,confirmText:o,cancelText:a,onConfirm:s,onCancel:l,confirmButtonVariant:g="primary",cancelButtonVariant:h="secondary",width:c="500px",closeOnOverlay:i=!0,isLoading:u=!1,loadingText:f})=>{const p=o??Jo("common.confirm"),m=a??Jo("common.cancel"),w=f??Jo("common.loading"),x=()=>{s()},A=()=>{u||(l?.(),t())},v=()=>{u||t()},E={primary:"bg-blue-600 text-white hover:bg-blue-700",secondary:"bg-gray-200 dark:bg-gray-700 text-gray-800 dark:text-gray-200 hover:bg-gray-300 dark:hover:bg-gray-600",danger:"bg-red-600 text-white hover:bg-red-700",ghost:"bg-transparent text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700"};return d.jsxs(Qo,{isOpen:e,onClose:v,title:r,width:c,children:[d.jsx(W,{className:"py-2",children:typeof n=="string"?d.jsx(Dt,{className:"text-gray-700 dark:text-gray-300",children:n}):n}),d.jsxs(W,{className:"flex justify-end gap-3 mt-6",children:[d.jsx(Q,{onClick:A,disabled:u,className:"px-4 py-2 bg-white dark:bg-gray-800 text-gray-700 dark:text-gray-300 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700 disabled:opacity-50 disabled:cursor-not-allowed",children:d.jsx(te,{children:m})}),d.jsxs(Q,{onClick:x,disabled:u,className:`flex items-center gap-2 px-4 py-2 rounded-lg disabled:opacity-50 disabled:cursor-not-allowed ${E[g]}`,children:[u&&d.jsx(Ct,{className:"fa-solid fa-spinner w-4 h-4 animate-spin"}),d.jsx(te,{children:u?w:p})]})]})]})},qf=Object.freeze(Object.defineProperty({__proto__:null,ConfirmDialog:Ro},Symbol.toStringTag,{value:"Module"})),Pl=k.createContext(null),Fl=({value:e,children:t})=>d.jsx(Pl.Provider,{value:e,children:t}),Zf=()=>{const e=k.useContext(Pl);if(!e)throw new Error("useFileUploaderContext must be used within FileUploaderProvider");return e};function Qf(e,t){return t.forEach((function(r){r&&typeof r!="string"&&!Array.isArray(r)&&Object.keys(r).forEach((function(n){if(n!=="default"&&!(n in e)){var o=Object.getOwnPropertyDescriptor(r,n);Object.defineProperty(e,n,o.get?o:{enumerable:!0,get:function(){return r[n]}})}}))})),Object.freeze(e)}function Ul(e,t){return new Promise((function(r,n){let o;return Jf(e).then((function(a){try{return o=a,r(new Blob([t.slice(0,2),o,t.slice(2)],{type:"image/jpeg"}))}catch(s){return n(s)}}),n)}))}const Jf=e=>new Promise(((t,r)=>{const n=new FileReader;n.addEventListener("load",(({target:{result:o}})=>{const a=new DataView(o);let s=0;if(a.getUint16(s)!==65496)return r("not a valid JPEG");for(s+=2;;){const l=a.getUint16(s);if(l===65498)break;const g=a.getUint16(s+2);if(l===65505&&a.getUint32(s+4)===1165519206){const h=s+10;let c;switch(a.getUint16(h)){case 18761:c=!0;break;case 19789:c=!1;break;default:return r("TIFF header contains invalid endian")}if(a.getUint16(h+2,c)!==42)return r("TIFF header contains invalid version");const i=a.getUint32(h+4,c),u=h+i+2+12*a.getUint16(h+i,c);for(let f=h+i+2;f>>24&255,l[s+1]=g>>>16&255,l[s+2]=g>>>8&255,l[s+3]=g>>>0&255,new Uint8Array(l.buffer,0,s+4)},n.deflateRaw=function(o,a){a==null&&(a={level:6});var s=new Uint8Array(50+Math.floor(1.1*o.length)),l=n.F.deflateRaw(o,s,l,a.level);return new Uint8Array(s.buffer,0,l)},n.encode=function(o,a){a==null&&(a=!1);var s=0,l=n.bin.writeUint,g=n.bin.writeUshort,h={};for(var c in o){var i=!n._noNeed(c)&&!a,u=o[c],f=n.crc.crc(u,0,u.length);h[c]={cpr:i,usize:u.length,crc:f,file:i?n.deflateRaw(u):u}}for(var c in h)s+=h[c].file.length+30+46+2*n.bin.sizeUTF8(c);s+=22;var p=new Uint8Array(s),m=0,w=[];for(var c in h){var x=h[c];w.push(m),m=n._writeHeader(p,m,c,x,0)}var A=0,v=m;for(var c in h)x=h[c],w.push(m),m=n._writeHeader(p,m,c,x,1,w[A++]);var E=m-v;return l(p,m,101010256),m+=4,g(p,m+=4,A),g(p,m+=2,A),l(p,m+=2,E),l(p,m+=4,v),m+=4,m+=2,p.buffer},n._noNeed=function(o){var a=o.split(".").pop().toLowerCase();return"png,jpg,jpeg,zip".indexOf(a)!=-1},n._writeHeader=function(o,a,s,l,g,h){var c=n.bin.writeUint,i=n.bin.writeUshort,u=l.file;return c(o,a,g==0?67324752:33639248),a+=4,g==1&&(a+=2),i(o,a,20),i(o,a+=2,0),i(o,a+=2,l.cpr?8:0),c(o,a+=2,0),c(o,a+=4,l.crc),c(o,a+=4,u.length),c(o,a+=4,l.usize),i(o,a+=4,n.bin.sizeUTF8(s)),i(o,a+=2,0),a+=2,g==1&&(a+=2,a+=2,c(o,a+=6,h),a+=4),a+=n.bin.writeUTF8(o,a,s),g==0&&(o.set(u,a),a+=u.length),a},n.crc={table:(function(){for(var o=new Uint32Array(256),a=0;a<256;a++){for(var s=a,l=0;l<8;l++)1&s?s=3988292384^s>>>1:s>>>=1;o[a]=s}return o})(),update:function(o,a,s,l){for(var g=0;g>>8;return o},crc:function(o,a,s){return 4294967295^n.crc.update(4294967295,o,a,s)}},n.adler=function(o,a,s){for(var l=1,g=0,h=a,c=a+s;h>8&255},readUint:function(o,a){return 16777216*o[a+3]+(o[a+2]<<16|o[a+1]<<8|o[a])},writeUint:function(o,a,s){o[a]=255&s,o[a+1]=s>>8&255,o[a+2]=s>>16&255,o[a+3]=s>>24&255},readASCII:function(o,a,s){for(var l="",g=0;g>6,o[a+g+1]=128|c>>0&63,g+=2;else if((4294901760&c)==0)o[a+g]=224|c>>12,o[a+g+1]=128|c>>6&63,o[a+g+2]=128|c>>0&63,g+=3;else{if((4292870144&c)!=0)throw"e";o[a+g]=240|c>>18,o[a+g+1]=128|c>>12&63,o[a+g+2]=128|c>>6&63,o[a+g+3]=128|c>>0&63,g+=4}}return g},sizeUTF8:function(o){for(var a=o.length,s=0,l=0;l>>3}var w=h.lits,x=h.strt,A=h.prev,v=0,E=0,O=0,_=0,I=0,C=0;for(m>2&&(x[C=n.F._hash(o,0)]=0),u=0;u14e3||E>26697)&&m-u>100&&(p>>16,P=65535&N;if(N!=0){P=65535&N;var D=c(M=N>>>16,h.of0);h.lhst[257+D]++;var L=c(P,h.df0);h.dhst[L]++,_+=h.exb[D]+h.dxb[L],w[v]=M<<23|u-p,w[v+1]=P<<16|D<<8|L,v+=2,p=u+M}else h.lhst[o[u]]++;E++}}for(O==u&&o.length!=0||(p>>3},n.F._bestMatch=function(o,a,s,l,g,h){var c=32767&a,i=s[c],u=c-i+32768&32767;if(i==c||l!=n.F._hash(o,a-u))return 0;for(var f=0,p=0,m=Math.min(32767,a);u<=m&&--h!=0&&i!=c;){if(f==0||o[a+f]==o[a+f-u]){var w=n.F._howLong(o,a,u);if(w>f){if(p=u,(f=w)>=g)break;u+2x&&(x=E,i=v)}}}u+=(c=i)-(i=s[c])+32768&32767}return f<<16|p},n.F._howLong=function(o,a,s){if(o[a]!=o[a-s]||o[a+1]!=o[a+1-s]||o[a+2]!=o[a+2-s])return 0;var l=a,g=Math.min(o.length,a+258);for(a+=3;a>>23,Y=b+(8388607&F);b>16,j=B>>8&255,H=255&B;C(i,u=n.F._writeLit(257+j,L,i,u),G-_.of0[j]),u+=_.exb[j],I(i,u=n.F._writeLit(H,$,i,u),V-_.df0[H]),u+=_.dxb[H],b+=G}}u=n.F._writeLit(256,L,i,u)}return u},n.F._copyExact=function(o,a,s,l,g){var h=g>>>3;return l[h]=s,l[h+1]=s>>>8,l[h+2]=255-l[h],l[h+3]=255-l[h+1],h+=4,l.set(new Uint8Array(o.buffer,a,s),h),g+(s+4<<3)},n.F.getTrees=function(){for(var o=n.F.U,a=n.F._hufTree(o.lhst,o.ltree,15),s=n.F._hufTree(o.dhst,o.dtree,15),l=[],g=n.F._lenCodes(o.ltree,l),h=[],c=n.F._lenCodes(o.dtree,h),i=0;i4&&o.itree[1+(o.ordr[f-1]<<1)]==0;)f--;return[a,s,u,g,c,f,l,h]},n.F.getSecond=function(o){for(var a=[],s=0;s>1)+",");return a},n.F.contSize=function(o,a){for(var s=0,l=0;l15&&(n.F._putsE(s,l,c,i),l+=i)}return l},n.F._lenCodes=function(o,a){for(var s=o.length;s!=2&&o[s-1]==0;)s-=2;for(var l=0;l>>1,138))<11?a.push(17,f-3):a.push(18,f-11),l+=2*f-2}else if(g==i&&h==g&&c==g){for(u=l+5;u+2>>1,6);a.push(16,f-3),l+=2*f-2}else a.push(g,0)}return s>>>1},n.F._hufTree=function(o,a,s){var l=[],g=o.length,h=a.length,c=0;for(c=0;cs&&(n.F.restrictDepth(u,s,v),v=s),c=0;ca;l++){var c=o[l].d;o[l].d=a,h+=g-(1<>>=s-a;h>0;)(c=o[l].d)=0;l--)o[l].d==a&&h<0&&(o[l].d--,h++);h!=0&&console.log("debt left")},n.F._goodIndex=function(o,a){var s=0;return a[16|s]<=o&&(s|=16),a[8|s]<=o&&(s|=8),a[4|s]<=o&&(s|=4),a[2|s]<=o&&(s|=2),a[1|s]<=o&&(s|=1),s},n.F._writeLit=function(o,a,s,l){return n.F._putsF(s,l,a[o<<1]),l+a[1+(o<<1)]},n.F.inflate=function(o,a){var s=Uint8Array;if(o[0]==3&&o[1]==0)return a||new s(0);var l=n.F,g=l._bitsF,h=l._bitsE,c=l._decodeTiny,i=l.makeCodes,u=l.codes2map,f=l._get17,p=l.U,m=a==null;m&&(a=new s(o.length>>>2<<3));for(var w,x,A=0,v=0,E=0,O=0,_=0,I=0,C=0,y=0,N=0;A==0;)if(A=g(o,N,1),v=g(o,N+1,2),N+=3,v!=0){if(m&&(a=n.F._check(a,y+131072)),v==1&&(w=p.flmap,x=p.fdmap,I=511,C=31),v==2){E=h(o,N,5)+257,O=h(o,N+5,5)+1,_=h(o,N+10,4)+4,N+=14;for(var M=0;M<38;M+=2)p.itree[M]=0,p.itree[M+1]=0;var P=1;for(M=0;M<_;M++){var D=h(o,N+3*M,3);p.itree[1+(p.ordr[M]<<1)]=D,D>P&&(P=D)}N+=3*_,i(p.itree,P),u(p.itree,P,p.imap),w=p.lmap,x=p.dmap,N=c(p.imap,(1<>>4;if(!(b>>>8))a[y++]=b;else{if(b==256)break;var U=y+b-254;if(b>264){var F=p.ldef[b-257];U=y+(F>>>3)+h(o,N,7&F),N+=7&F}var G=x[f(o,N)&C];N+=15&G;var Y=G>>>4,B=p.ddef[Y],V=(B>>>4)+g(o,N,15&B);for(N+=15&B,m&&(a=n.F._check(a,y+131072));y>>3),H=o[j-4]|o[j-3]<<8;m&&(a=n.F._check(a,y+H)),a.set(new s(o.buffer,o.byteOffset+j,H),y),N=j+H<<3,y+=H}return a.length==y?a:a.slice(0,y)},n.F._check=function(o,a){var s=o.length;if(a<=s)return o;var l=new Uint8Array(Math.max(s<<1,a));return l.set(o,0),l},n.F._decodeTiny=function(o,a,s,l,g,h){for(var c=n.F._bitsE,i=n.F._get17,u=0;u>>4;if(p<=15)h[u]=p,u++;else{var m=0,w=0;p==16?(w=3+c(l,g,2),g+=2,m=h[u-1]):p==17?(w=3+c(l,g,3),g+=3):p==18&&(w=11+c(l,g,7),g+=7);for(var x=u+w;u>>1;hg&&(g=i),h++}for(;h>1,i=o[h+1],u=c<<4|i,f=a-i,p=o[h]<>>15-a]=u,p++},n.F.revCodes=function(o,a){for(var s=n.F.U.rev15,l=15-a,g=0;g>>l}},n.F._putsE=function(o,a,s){s<<=7&a;var l=a>>>3;o[l]|=s,o[l+1]|=s>>>8},n.F._putsF=function(o,a,s){s<<=7&a;var l=a>>>3;o[l]|=s,o[l+1]|=s>>>8,o[l+2]|=s>>>16},n.F._bitsE=function(o,a,s){return(o[a>>>3]|o[1+(a>>>3)]<<8)>>>(7&a)&(1<>>3]|o[1+(a>>>3)]<<8|o[2+(a>>>3)]<<16)>>>(7&a)&(1<>>3]|o[1+(a>>>3)]<<8|o[2+(a>>>3)]<<16)>>>(7&a)},n.F._get25=function(o,a){return(o[a>>>3]|o[1+(a>>>3)]<<8|o[2+(a>>>3)]<<16|o[3+(a>>>3)]<<24)>>>(7&a)},n.F.U=(t=Uint16Array,r=Uint32Array,{next_code:new t(16),bl_count:new t(16),ordr:[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],of0:[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,999,999,999],exb:[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0],ldef:new t(32),df0:[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,65535,65535],dxb:[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0],ddef:new r(32),flmap:new t(512),fltree:[],fdmap:new t(32),fdtree:[],lmap:new t(32768),ltree:[],ttree:[],dmap:new t(32768),dtree:[],imap:new t(512),itree:[],rev15:new t(32768),lhst:new r(286),dhst:new r(30),ihst:new r(19),lits:new r(15e3),strt:new t(65536),prev:new t(32768)}),(function(){for(var o=n.F.U,a=0;a<32768;a++){var s=a;s=(4278255360&(s=(4042322160&(s=(3435973836&(s=(2863311530&s)>>>1|(1431655765&s)<<1))>>>2|(858993459&s)<<2))>>>4|(252645135&s)<<4))>>>8|(16711935&s)<<8,o.rev15[a]=(s>>>16|s<<16)>>>17}function l(g,h,c){for(;h--!=0;)g.push(0,c)}for(a=0;a<32;a++)o.ldef[a]=o.of0[a]<<3|o.exb[a],o.ddef[a]=o.df0[a]<<4|o.dxb[a];l(o.fltree,144,8),l(o.fltree,112,9),l(o.fltree,24,7),l(o.fltree,8,8),n.F.makeCodes(o.fltree,9),n.F.codes2map(o.fltree,9,o.flmap),n.F.revCodes(o.fltree,9),l(o.fdtree,32,5),n.F.makeCodes(o.fdtree,5),n.F.codes2map(o.fdtree,5,o.fdmap),n.F.revCodes(o.fdtree,5),l(o.itree,19,0),l(o.ltree,286,0),l(o.dtree,30,0),l(o.ttree,320,0)})()})();var eg=Qf({__proto__:null,default:On},[On]);const Ht=(function(){var e={nextZero(c,i){for(;c[i]!=0;)i++;return i},readUshort:(c,i)=>c[i]<<8|c[i+1],writeUshort(c,i,u){c[i]=u>>8&255,c[i+1]=255&u},readUint:(c,i)=>16777216*c[i]+(c[i+1]<<16|c[i+2]<<8|c[i+3]),writeUint(c,i,u){c[i]=u>>24&255,c[i+1]=u>>16&255,c[i+2]=u>>8&255,c[i+3]=255&u},readASCII(c,i,u){let f="";for(let p=0;pc.length<2?`0${c}`:c,readUTF8(c,i,u){let f,p="";for(let m=0;m>3)]>>7-((7&_)<<0)&1);x[y]=F[D],x[y+1]=F[D+1],x[y+2]=F[D+2],x[y+3]=L>2)]>>6-((3&_)<<1)&3),x[y]=F[D],x[y+1]=F[D+1],x[y+2]=F[D+2],x[y+3]=L>1)]>>4-((1&_)<<2)&15),x[y]=F[D],x[y+1]=F[D+1],x[y+2]=F[D+2],x[y+3]=L>>3)]>>>7-(7&b)&1))==255*C?0:255;A[G+b]=U<<24|$<<16|$<<8|$}else if(E==2)for(b=0;b>>2)]>>>6-((3&b)<<1)&3))==85*C?0:255,A[G+b]=U<<24|$<<16|$<<8|$;else if(E==4)for(b=0;b>>1)]>>>4-((1&b)<<2)&15))==17*C?0:255,A[G+b]=U<<24|$<<16|$<<8|$;else if(E==8)for(b=0;b>3,C=Math.ceil(E*_/8),y=new Uint8Array(O*C);let N=0;const M=[0,0,4,0,2,0,1],P=[0,4,0,2,0,1,0],D=[8,8,8,4,4,2,2],L=[8,8,4,4,2,2,1];let $=0;for(;$<7;){const b=D[$],U=L[$];let F=0,G=0,Y=M[$];for(;Y>3])>>7-(7&ue)&1,y[H*C+(q>>3)]|=S<<7-((7&q)<<0)),_==2&&(S=(S=A[ue>>3])>>6-(7&ue)&3,y[H*C+(q>>2)]|=S<<6-((3&q)<<1)),_==4&&(S=(S=A[ue>>3])>>4-(7&ue)&15,y[H*C+(q>>1)]|=S<<4-((1&q)<<2)),_>=8){const ee=H*C+q*I;for(let fe=0;fe>3)+fe]}ue+=_,q+=U}j++,H+=b}F*G!=0&&(N+=G*(1+V)),$+=1}return y})(i,c)),i}function n(c,i){return o(new Uint8Array(c.buffer,2,c.length-6),i)}var o=(function(){const c={H:{}};return c.H.N=function(i,u){const f=Uint8Array;let p,m,w=0,x=0,A=0,v=0,E=0,O=0,_=0,I=0,C=0;if(i[0]==3&&i[1]==0)return u||new f(0);const y=c.H,N=y.b,M=y.e,P=y.R,D=y.n,L=y.A,$=y.Z,S=y.m,b=u==null;for(b&&(u=new f(i.length>>>2<<5));w==0;)if(w=N(i,C,1),x=N(i,C+1,2),C+=3,x!=0){if(b&&(u=c.H.W(u,I+(1<<17))),x==1&&(p=S.J,m=S.h,O=511,_=31),x==2){A=M(i,C,5)+257,v=M(i,C+5,5)+1,E=M(i,C+10,4)+4,C+=14;let F=1;for(var U=0;U<38;U+=2)S.Q[U]=0,S.Q[U+1]=0;for(U=0;UF&&(F=B)}C+=3*E,D(S.Q,F),L(S.Q,F,S.u),p=S.w,m=S.d,C=P(S.u,(1<>>4;if(!(G>>>8))u[I++]=G;else{if(G==256)break;{let Y=I+G-254;if(G>264){const q=S.q[G-257];Y=I+(q>>>3)+M(i,C,7&q),C+=7&q}const B=m[$(i,C)&_];C+=15&B;const V=B>>>4,j=S.c[V],H=(j>>>4)+N(i,C,15&j);for(C+=15&j;I>>3),G=i[F-4]|i[F-3]<<8;b&&(u=c.H.W(u,I+G)),u.set(new f(i.buffer,i.byteOffset+F,G),I),C=F+G<<3,I+=G}return u.length==I?u:u.slice(0,I)},c.H.W=function(i,u){const f=i.length;if(u<=f)return i;const p=new Uint8Array(f<<1);return p.set(i,0),p},c.H.R=function(i,u,f,p,m,w){const x=c.H.e,A=c.H.Z;let v=0;for(;v>>4;if(O<=15)w[v]=O,v++;else{let _=0,I=0;O==16?(I=3+x(p,m,2),m+=2,_=w[v-1]):O==17?(I=3+x(p,m,3),m+=3):O==18&&(I=11+x(p,m,7),m+=7);const C=v+I;for(;v>>1;for(;wm&&(m=A),w++}for(;w>1,A=i[w+1],v=x<<4|A,E=u-A;let O=i[w]<>>15-u]=v,O++}},c.H.l=function(i,u){const f=c.H.m.r,p=15-u;for(let m=0;m>>p}},c.H.M=function(i,u,f){f<<=7&u;const p=u>>>3;i[p]|=f,i[p+1]|=f>>>8},c.H.I=function(i,u,f){f<<=7&u;const p=u>>>3;i[p]|=f,i[p+1]|=f>>>8,i[p+2]|=f>>>16},c.H.e=function(i,u,f){return(i[u>>>3]|i[1+(u>>>3)]<<8)>>>(7&u)&(1<>>3]|i[1+(u>>>3)]<<8|i[2+(u>>>3)]<<16)>>>(7&u)&(1<>>3]|i[1+(u>>>3)]<<8|i[2+(u>>>3)]<<16)>>>(7&u)},c.H.i=function(i,u){return(i[u>>>3]|i[1+(u>>>3)]<<8|i[2+(u>>>3)]<<16|i[3+(u>>>3)]<<24)>>>(7&u)},c.H.m=(function(){const i=Uint16Array,u=Uint32Array;return{K:new i(16),j:new i(16),X:[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],S:[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,999,999,999],T:[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0],q:new i(32),p:[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,65535,65535],z:[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0],c:new u(32),J:new i(512),_:[],h:new i(32),$:[],w:new i(32768),C:[],v:[],d:new i(32768),D:[],u:new i(512),Q:[],r:new i(32768),s:new u(286),Y:new u(30),a:new u(19),t:new u(15e3),k:new i(65536),g:new i(32768)}})(),(function(){const i=c.H.m;for(var u=0;u<32768;u++){let p=u;p=(2863311530&p)>>>1|(1431655765&p)<<1,p=(3435973836&p)>>>2|(858993459&p)<<2,p=(4042322160&p)>>>4|(252645135&p)<<4,p=(4278255360&p)>>>8|(16711935&p)<<8,i.r[u]=(p>>>16|p<<16)>>>17}function f(p,m,w){for(;m--!=0;)p.push(0,w)}for(u=0;u<32;u++)i.q[u]=i.S[u]<<3|i.T[u],i.c[u]=i.p[u]<<4|i.z[u];f(i._,144,8),f(i._,112,9),f(i._,24,7),f(i._,8,8),c.H.n(i._,9),c.H.A(i._,9,i.J),c.H.l(i._,9),f(i.$,32,5),c.H.n(i.$,5),c.H.A(i.$,5,i.h),c.H.l(i.$,5),f(i.Q,19,0),f(i.C,286,0),f(i.D,30,0),f(i.v,320,0)})(),c.H.N})();function a(c){return[1,null,3,1,2,null,4][c.ctype]*c.depth}function s(c,i,u,f,p){let m=a(i);const w=Math.ceil(f*m/8);let x,A;m=Math.ceil(m/8);let v=c[u],E=0;if(v>1&&(c[u]=[0,0,1][v-2]),v==3)for(E=m;E>>1)&255;for(let O=0;O>>1);for(;E>>1)}else{for(;E=0&&x>=0?(O=$*i+S<<2,_=(x+$)*p+w+S<<2):(O=(-x+$)*i-w+S<<2,_=$*p+S<<2),A==0)f[_]=c[O],f[_+1]=c[O+1],f[_+2]=c[O+2],f[_+3]=c[O+3];else if(A==1){var I=c[O+3]*.00392156862745098,C=c[O]*I,y=c[O+1]*I,N=c[O+2]*I,M=f[_+3]*(1/255),P=f[_]*M,D=f[_+1]*M,L=f[_+2]*M;const b=1-I,U=I+M*b,F=U==0?0:1/U;f[_+3]=255*U,f[_+0]=(C+P*b)*F,f[_+1]=(y+D*b)*F,f[_+2]=(N+L*b)*F}else if(A==2)I=c[O+3],C=c[O],y=c[O+1],N=c[O+2],M=f[_+3],P=f[_],D=f[_+1],L=f[_+2],I==M&&C==P&&y==D&&N==L?(f[_]=0,f[_+1]=0,f[_+2]=0,f[_+3]=0):(f[_]=C,f[_+1]=y,f[_+2]=N,f[_+3]=I);else if(A==3){if(I=c[O+3],C=c[O],y=c[O+1],N=c[O+2],M=f[_+3],P=f[_],D=f[_+1],L=f[_+2],I==M&&C==P&&y==D&&N==L)continue;if(I<220&&M>20)return!1}return!0}return{decode:function(i){const u=new Uint8Array(i);let f=8;const p=e,m=p.readUshort,w=p.readUint,x={tabs:{},frames:[]},A=new Uint8Array(u.length);let v,E=0,O=0;const _=[137,80,78,71,13,10,26,10];for(var I=0;I<8;I++)if(u[I]!=_[I])throw"The input is not a PNG file!";for(;f>>1:N>>>=1;C[y]=N}return C})(),update(C,y,N,M){for(let P=0;P>>8;return C},crc:(C,y,N)=>4294967295^n.update(4294967295,C,y,N)};function o(C,y,N,M){y[N]+=C[0]*M>>4,y[N+1]+=C[1]*M>>4,y[N+2]+=C[2]*M>>4,y[N+3]+=C[3]*M>>4}function a(C){return Math.max(0,Math.min(255,C))}function s(C,y){const N=C[0]-y[0],M=C[1]-y[1],P=C[2]-y[2],D=C[3]-y[3];return N*N+M*M+P*P+D*D}function l(C,y,N,M,P,D,L){L==null&&(L=1);const $=M.length,S=[];for(var b=0;b<$;b++){const H=M[b];S.push([H>>>0&255,H>>>8&255,H>>>16&255,H>>>24&255])}for(b=0;b<$;b++){let H=4294967295;for(var U=0,F=0;F<$;F++){var G=s(S[b],S[F]);F!=b&&G>2]=U,Y[b>>2]=M[U]}}function g(C,y,N,M,P){P==null&&(P={});const{crc:D}=n,L=t.writeUint,$=t.writeUshort,S=t.writeASCII;let b=8;const U=C.frames.length>1;let F,G=!1,Y=33+(U?20:0);if(P.sRGB!=null&&(Y+=13),P.pHYs!=null&&(Y+=21),P.iCCP!=null&&(F=pako.deflate(P.iCCP),Y+=21+F.length+4),C.ctype==3){for(var B=C.plte.length,V=0;V>>24!=255&&(G=!0);Y+=8+3*B+4+(G?8+1*B+4:0)}for(var j=0;j>>8&255,Ge=R>>>16&255;H[b+fe+0]=ke,H[b+fe+1]=me,H[b+fe+2]=Ge}if(b+=3*B,L(H,b,D(H,b-3*B-4,3*B+4)),b+=4,G){for(L(H,b,B),b+=4,S(H,b,"tRNS"),b+=4,V=0;V>>24&255;b+=B,L(H,b,D(H,b-B-4,B+4)),b+=4}}let ue=0;for(j=0;jNe&&(Ne=Ze),BeVe&&(Ve=Be));Ne==-1&&(Ee=he=Ne=Ve=0),K&&((1&Ee)==1&&Ee--,(1&he)==1&&he--);const Fe=(Ne-Ee+1)*(Ve-he+1);Fe<_e&&(_e=Fe,Se=$e,se=Ee,ie=he,le=Ne-Ee+1,ne=Ve-he+1)}xe=new Uint8Array(Ce[ae-1-Se]),Se==1&&(oe[ae-1].dispose=2),be=new Uint8Array(le*ne*4),e(xe,we,Ue,be,le,ne,-se,-ie,0),Te=e(Oe,we,Ue,be,le,ne,-se,-ie,3)?1:0,Te==1?u(Oe,we,Ue,be,{x:se,y:ie,width:le,height:ne}):e(Oe,we,Ue,be,le,ne,-se,-ie,0)}else be=Oe.slice(0);oe.push({rect:{x:se,y:ie,width:le,height:ne},img:be,blend:Te,dispose:0})}if(Le)for(ae=0;ae>2,Le>>2);fe.push(R);const K=new Uint8Array(we.abuf,Ue,Le);U&&l(ke.img,ke.rect.width,ke.rect.height,ee,K,R),ke.img.set(K),Ue+=Le}}else for(B=0;Bme&&Ce==Me[j-me])R[j]=R[j-me];else{let we=ue[Ce];if(we==null&&(ue[Ce]=we=ee.length,ee.push(Ce),ee.length>=300))break;R[j]=we}}}const Ge=ee.length;for(Ge<=256&&b==0&&(G=Ge<=2?1:Ge<=4?2:Ge<=16?4:8,G=Math.max(G,S)),B=0;B>1)]|=Le[re+ye]<<4-4*(1&ye);else if(G==2)for(ye=0;ye>2)]|=Le[re+ye]<<6-2*(3&ye);else if(G==1)for(ye=0;ye>3)]|=Le[re+ye]<<7-1*(7&ye)}Ce=De,F=3,Ue=1}else if(H==0&&q.length==1){De=new Uint8Array(me*Me*3);const Le=me*Me;for(j=0;jj&&(j=fe),RH&&(H=R))}j==-1&&(B=V=j=H=0),L&&((1&B)==1&&B--,(1&V)==1&&V--),D={x:B,y:V,width:j-B+1,height:H-V+1};const q=M[P];q.rect=D,q.blend=1,q.img=new Uint8Array(D.width*D.height*4),M[P-1].dispose==0?(e(b,y,N,q.img,D.width,D.height,-D.x,-D.y,0),u(G,y,N,q.img,D)):e(G,y,N,q.img,D.width,D.height,-D.x,-D.y,0)}function u(C,y,N,M,P){e(C,y,N,M,P.width,P.height,-P.x,-P.y,2)}function f(C,y,N,M,P,D,L){const $=[];let S,b=[0,1,2,3,4];D!=-1?b=[D]:(y*M>5e5||N==1)&&(b=[0]),L&&(S={level:0});const U=eg;for(var F=0;F>1)+256&255;if(D==4)for(S=P;S>1)&255;for(S=P;S>1)&255}if(D==4){for(S=0;S>2);let U;if(N.length<2e7)for(var F=0;F>2]=U.ind,P[F>>2]=U.est.rgba;else for(F=0;F>2]=U.ind,P[F>>2]=U.est.rgba}return{abuf:M.buffer,inds:b,plte:$}}function w(C,y,N){N==null&&(N=1e-4);const M=new Uint32Array(C.buffer),P={i0:0,i1:C.length,bst:null,est:null,tdst:0,left:null,right:null};P.bst=O(C,P.i0,P.i1),P.est=_(P.bst);const D=[P];for(;D.length$&&($=D[L].est.L,S=L);if($=U||b.i1<=U){b.est.L=0;continue}const F={i0:b.i0,i1:U,bst:null,est:null,tdst:0,left:null,right:null};F.bst=O(C,F.i0,F.i1),F.est=_(F.bst);const G={i0:U,i1:b.i1,bst:null,est:null,tdst:0,left:null,right:null};for(G.bst={R:[],m:[],N:b.bst.N-F.bst.N},L=0;L<16;L++)G.bst.R[L]=b.bst.R[L]-F.bst.R[L];for(L=0;L<4;L++)G.bst.m[L]=b.bst.m[L]-F.bst.m[L];G.est=_(G.bst),b.left=F,b.right=G,D[S]=F,D.push(G)}for(D.sort((($,S)=>S.bst.N-$.bst.N)),L=0;L0&&(L=C.right,$=C.left);const S=x(L,y,N,M,P);if(S.tdst<=D*D)return S;const b=x($,y,N,M,P);return b.tdstD;)M-=4;if(N>=M)break;const L=y[N>>2];y[N>>2]=y[M>>2],y[M>>2]=L,N+=4,M-=4}for(;E(C,N,P)>D;)N-=4;return N+4}function E(C,y,N){return C[y]*N[0]+C[y+1]*N[1]+C[y+2]*N[2]+C[y+3]*N[3]}function O(C,y,N){const M=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],P=[0,0,0,0],D=N-y>>2;for(let L=y;L>>0}}var I={multVec:(C,y)=>[C[0]*y[0]+C[1]*y[1]+C[2]*y[2]+C[3]*y[3],C[4]*y[0]+C[5]*y[1]+C[6]*y[2]+C[7]*y[3],C[8]*y[0]+C[9]*y[1]+C[10]*y[2]+C[11]*y[3],C[12]*y[0]+C[13]*y[1]+C[14]*y[2]+C[15]*y[3]],dot:(C,y)=>C[0]*y[0]+C[1]*y[1]+C[2]*y[2]+C[3]*y[3],sml:(C,y)=>[C*y[0],C*y[1],C*y[2],C*y[3]]};Ht.encode=function(y,N,M,P,D,L,$){P==null&&(P=0),$==null&&($=!1);const S=c(y,N,M,P,[!1,!1,!1,0,$,!1]);return h(S,-1),g(S,N,M,D,L)},Ht.encodeLL=function(y,N,M,P,D,L,$,S){const b={ctype:0+(P==1?0:2)+(D==0?0:4),depth:L,frames:[]},U=(P+D)*L,F=U*N;for(let G=0;G>>0),O(1),O(32),_(3),_(g),_(2835),_(2835),I(8),_(16711680),_(65280),_(255),_(4278190080),_(1466527264),(function C(){for(;A0;){for(w=122+A*l,f=0;f>>24,i.setUint32(w+f,p<<8|m),f+=4;A++}E{t(new Blob([r],{type:"image/bmp"}))}))},_dly:9};var bt={CHROME:"CHROME",FIREFOX:"FIREFOX",DESKTOP_SAFARI:"DESKTOP_SAFARI",IE:"IE",IOS:"IOS",ETC:"ETC"},tg={[bt.CHROME]:16384,[bt.FIREFOX]:11180,[bt.DESKTOP_SAFARI]:16384,[bt.IE]:8192,[bt.IOS]:4096,[bt.ETC]:8192};const ea=typeof window<"u",zl=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope,In=ea&&window.cordova&&window.cordova.require&&window.cordova.require("cordova/modulemapper"),rg=(ea||zl)&&(In&&In.getOriginalSymbol(window,"File")||typeof File<"u"&&File),Hl=(ea||zl)&&(In&&In.getOriginalSymbol(window,"FileReader")||typeof FileReader<"u"&&FileReader);function ta(e,t,r=Date.now()){return new Promise((n=>{const o=e.split(","),a=o[0].match(/:(.*?);/)[1],s=globalThis.atob(o[1]);let l=s.length;const g=new Uint8Array(l);for(;l--;)g[l]=s.charCodeAt(l);const h=new Blob([g],{type:a});h.name=t,h.lastModified=r,n(h)}))}function Gl(e){return new Promise(((t,r)=>{const n=new Hl;n.onload=()=>t(n.result),n.onerror=o=>r(o),n.readAsDataURL(e)}))}function jl(e){return new Promise(((t,r)=>{const n=new Image;n.onload=()=>t(n),n.onerror=o=>r(o),n.src=e}))}function fr(){if(fr.cachedResult!==void 0)return fr.cachedResult;let e=bt.ETC;const{userAgent:t}=navigator;return/Chrom(e|ium)/i.test(t)?e=bt.CHROME:/iP(ad|od|hone)/i.test(t)&&/WebKit/i.test(t)?e=bt.IOS:/Safari/i.test(t)?e=bt.DESKTOP_SAFARI:/Firefox/i.test(t)?e=bt.FIREFOX:(/MSIE/i.test(t)||document.documentMode)&&(e=bt.IE),fr.cachedResult=e,fr.cachedResult}function Bl(e,t){const r=fr(),n=tg[r];let o=e,a=t,s=o*a;const l=o>a?a/o:o/a;for(;s>n*n;){const g=(n+o)/2,h=(n+a)/2;g$l.toBlob(e,c))).then(function(c){try{return l=c,l.name=r,l.lastModified=n,h.call(this)}catch(i){return s(i)}}.bind(this),s);{let c=function(){return h.call(this)};if(typeof OffscreenCanvas=="function"&&e instanceof OffscreenCanvas)return e.convertToBlob({type:t,quality:o}).then(function(i){try{return l=i,l.name=r,l.lastModified=n,c.call(this)}catch(u){return s(u)}}.bind(this),s);{let i;return i=e.toDataURL(t,o),ta(i,r,n).then(function(u){try{return l=u,c.call(this)}catch(f){return s(f)}}.bind(this),s)}}}function g(){return a(l)}}))}function Vt(e){e.width=0,e.height=0}function Nr(){return new Promise((function(e,t){let r,n,o,a;return Nr.cachedResult!==void 0?e(Nr.cachedResult):ta("data:image/jpeg;base64,/9j/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAYAAAAAAAD/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/AABEIAAEAAgMBEQACEQEDEQH/xABKAAEAAAAAAAAAAAAAAAAAAAALEAEAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAAAAAAAEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwA/8H//2Q==","test.jpg",Date.now()).then((function(s){try{return r=s,Pn(r).then((function(l){try{return n=l[1],Fn(n,r.type,r.name,r.lastModified).then((function(g){try{return o=g,Vt(n),Pn(o).then((function(h){try{return a=h[0],Nr.cachedResult=a.width===1&&a.height===2,e(Nr.cachedResult)}catch(c){return t(c)}}),t)}catch(h){return t(h)}}),t)}catch(g){return t(g)}}),t)}catch(l){return t(l)}}),t)}))}function Kl(e){return new Promise(((t,r)=>{const n=new Hl;n.onload=o=>{const a=new DataView(o.target.result);if(a.getUint16(0,!1)!=65496)return t(-2);const s=a.byteLength;let l=2;for(;lr(o),n.readAsArrayBuffer(e)}))}function Vl(e,t){const{width:r}=e,{height:n}=e,{maxWidthOrHeight:o}=t;let a,s=e;return isFinite(o)&&(r>o||n>o)&&([s,a]=Dn(r,n),r>n?(s.width=o,s.height=n/r*o):(s.width=r/n*o,s.height=o),a.drawImage(e,0,0,s.width,s.height),Vt(e)),s}function Yl(e,t){const{width:r}=e,{height:n}=e,[o,a]=Dn(r,n);switch(t>4&&t<9?(o.width=n,o.height=r):(o.width=r,o.height=n),t){case 2:a.transform(-1,0,0,1,r,0);break;case 3:a.transform(-1,0,0,-1,r,n);break;case 4:a.transform(1,0,0,-1,0,n);break;case 5:a.transform(0,1,1,0,0,0);break;case 6:a.transform(0,1,-1,0,n,0);break;case 7:a.transform(0,-1,-1,0,n,r);break;case 8:a.transform(0,-1,1,0,0,r)}return a.drawImage(e,0,0,r,n),Vt(e),o}function Xl(e,t,r=0){return new Promise((function(n,o){let a,s,l,g,h,c,i,u,f,p,m,w,x,A,v,E,O,_,I,C;function y(M=5){if(t.signal&&t.signal.aborted)throw t.signal.reason;a+=M,t.onProgress(Math.min(a,100))}function N(M){if(t.signal&&t.signal.aborted)throw t.signal.reason;a=Math.min(Math.max(M,a),100),t.onProgress(a)}return a=r,s=t.maxIteration||10,l=1024*t.maxSizeMB*1024,y(),Pn(e,t).then(function(M){try{return[,g]=M,y(),h=Vl(g,t),y(),new Promise((function(P,D){var L;if(!(L=t.exifOrientation))return Kl(e).then(function(S){try{return L=S,$.call(this)}catch(b){return D(b)}}.bind(this),D);function $(){return P(L)}return $.call(this)})).then(function(P){try{return c=P,y(),Nr().then(function(D){try{return i=D?h:Yl(h,c),y(),u=t.initialQuality||1,f=t.fileType||e.type,Fn(i,f,e.name,e.lastModified,u).then(function(L){try{{let S=function(){if(s--&&(v>l||v>x)){let U,F;return U=C?.95*I.width:I.width,F=C?.95*I.height:I.height,[O,_]=Dn(U,F),_.drawImage(I,0,0,U,F),u*=f==="image/png"?.85:.95,Fn(O,f,e.name,e.lastModified,u).then((function(G){try{return E=G,Vt(I),I=O,v=E.size,N(Math.min(99,Math.floor((A-v)/(A-l)*100))),S}catch(Y){return o(Y)}}),o)}return[1]},b=function(){return Vt(I),Vt(O),Vt(h),Vt(i),Vt(g),N(100),n(E)};if(p=L,y(),m=p.size>l,w=p.size>e.size,!m&&!w)return N(100),n(p);var $;return x=e.size,A=p.size,v=A,I=i,C=!t.alwaysKeepResolution&&m,($=function(U){for(;U;){if(U.then)return void U.then($,o);try{if(U.pop){if(U.length)return U.pop()?b.call(this):U;U=S}else U=U.call(this)}catch(F){return o(F)}}}.bind(this))(S)}}catch(S){return o(S)}}.bind(this),o)}catch(L){return o(L)}}.bind(this),o)}catch(D){return o(D)}}.bind(this),o)}catch(P){return o(P)}}.bind(this),o)}))}const ng=` + `.trim().replace(/\s+/g," ");return d.jsx(W,{id:a,className:c,dangerouslySetInnerHTML:{__html:h},...s})},Wf=Object.freeze(Object.defineProperty({__proto__:null,HtmlContent:Yo},Symbol.toStringTag,{value:"Module"})),Xo=()=>window.G7Core,qo=(e,t)=>Xo()?.t?.(e,t)??e,Dl=({content:e="",onChange:t,isHtml:r=!1,onIsHtmlChange:n,rows:o=15,placeholder:a="",label:s,showHtmlModeToggle:l=!0,contentClassName:g="",purifyConfig:h,className:c="",name:i="content",htmlFieldName:u="content_mode",readOnly:f=!1,id:p,editorAttrs:m})=>{const[w,x]=k.useState(r),[A,v]=k.useState(e),[E,O]=k.useState(!1);k.useEffect(()=>{x(r)},[r]),k.useEffect(()=>{v(e)},[e]);const _=k.useCallback(y=>{const N=y.target.value;if(v(N),t){const M=Xo()?.createChangeEvent?.({value:N,name:i,type:"textarea"})??{target:{name:i,value:N}};t(M)}},[t,i]),I=k.useCallback(y=>{const N=y.target.checked;if(x(N),N||O(!1),n){const M=Xo()?.createChangeEvent?.({checked:N,name:u,type:"checkbox"})??{target:{name:u,checked:N}};n(M)}},[n,u]),C=k.useCallback(()=>{O(y=>!y)},[]);return d.jsxs(W,{className:`space-y-2 ${c}`,id:p,...m,children:[d.jsxs(W,{className:"flex items-center justify-between",children:[s&&d.jsx(yr,{className:"block text-sm font-medium text-gray-500 dark:text-gray-400",children:s}),d.jsxs(W,{className:"flex items-center gap-3",children:[w&&!f&&d.jsx(Q,{type:"button",onClick:C,className:`px-3 py-1.5 text-xs font-bold rounded-lg focus:outline-none focus:ring-2 ${E?"text-gray-700 dark:text-gray-200 bg-gray-200 dark:bg-gray-600 border border-gray-300 dark:border-gray-500 hover:bg-gray-300 dark:hover:bg-gray-500 focus:ring-gray-400 dark:focus:ring-gray-500":"text-blue-600 dark:text-blue-400 bg-white dark:bg-gray-700 border border-blue-300 dark:border-blue-600 hover:bg-blue-50 dark:hover:bg-gray-600 focus:ring-blue-500 dark:focus:ring-blue-600"}`,children:qo(E?"common.preview_off":"common.preview")}),l&&d.jsxs(yr,{className:"flex items-center gap-2 p-2 cursor-pointer",children:[d.jsx(xt,{type:"checkbox",name:u,checked:w,onChange:I,disabled:f,className:"w-4 h-4 text-blue-600 bg-gray-100 border-gray-300 rounded focus:ring-blue-500 dark:focus:ring-blue-600 dark:ring-offset-gray-800 focus:ring-2 dark:bg-gray-700 dark:border-gray-600"}),d.jsx(W,{className:"text-sm font-medium text-gray-700 dark:text-gray-300",children:qo("common.html_mode")})]})]})]}),!E&&d.jsx(no,{name:i,value:A,onChange:_,placeholder:a,rows:o,readOnly:f,className:`block w-full rounded-lg border px-3 py-2 text-sm placeholder-gray-400 dark:placeholder-gray-500 focus:outline-none focus:ring-1 disabled:opacity-50 disabled:cursor-not-allowed ${w?"font-mono bg-white dark:bg-gray-800 border-blue-300 dark:border-blue-600 text-gray-800 dark:text-gray-200 focus:border-blue-500 focus:ring-blue-500":"bg-white dark:bg-gray-800 border-gray-300 dark:border-gray-600 text-gray-900 dark:text-white focus:border-blue-500 focus:ring-blue-500"}`}),E&&d.jsx(W,{className:"p-4 bg-gray-50 dark:bg-gray-900 rounded-lg border border-gray-200 dark:border-gray-800 min-h-[400px]",children:d.jsx(Yo,{content:A,isHtml:!0,className:g||"prose dark:prose-invert max-w-none text-gray-900 dark:text-gray-100",purifyConfig:h})})]})},Kf=Object.freeze(Object.defineProperty({__proto__:null,HtmlEditor:Dl},Symbol.toStringTag,{value:"Module"})),Ll=e=>window.G7Core?.t?.(e)??e,Zo=({maxHeight:e=500,expandText:t,collapseText:r,className:n="",children:o,id:a,editorAttrs:s})=>{const[l,g]=k.useState(!1),[h,c]=k.useState(!1),i=k.useRef(null),u=k.useCallback(()=>{if(i.current){const w=i.current.scrollHeight;c(w>e)}},[e]);k.useEffect(()=>{u();const w=i.current;if(!w)return;const x=w.querySelectorAll("img");x.forEach(v=>{v.complete||v.addEventListener("load",u)});let A=null;return typeof ResizeObserver<"u"&&(A=new ResizeObserver(u),A.observe(w)),()=>{x.forEach(v=>{v.removeEventListener("load",u)}),A?.disconnect()}},[u,o]);const f=()=>{g(w=>!w)},p=t||Ll("sirsoft-ecommerce.shop.product.expand_detail"),m=r||Ll("sirsoft-ecommerce.shop.product.collapse_detail");return d.jsxs(W,{className:n,id:a,...s,children:[d.jsxs(W,{className:"relative",children:[d.jsx(W,{ref:i,className:!l&&h?"overflow-hidden transition-[max-height] duration-300 ease-in-out":"transition-[max-height] duration-300 ease-in-out",style:!l&&h?{maxHeight:`${e}px`}:void 0,children:o}),!l&&h&&d.jsx(W,{className:"absolute bottom-0 left-0 right-0 h-24 bg-gradient-to-t from-white dark:from-gray-900 to-transparent pointer-events-none"})]}),h&&d.jsxs(Q,{type:"button",onClick:f,className:"flex items-center justify-center w-full py-3.5 bg-white dark:bg-gray-900 border border-gray-200 dark:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-800 transition-colors cursor-pointer gap-1.5",children:[d.jsx(te,{className:"text-sm font-semibold text-gray-600 dark:text-gray-400",children:l?m:p}),d.jsx(de,{name:l?"chevron-up":"chevron-down",size:"sm"})]})]})},Vf=Object.freeze(Object.defineProperty({__proto__:null,ExpandableContent:Zo,default:Zo},Symbol.toStringTag,{value:"Module"})),Yf=(e,t)=>window.G7Core?.t?.(e,t)??e,Qo=({isOpen:e,onClose:t,title:r,icon:n,iconClassName:o="text-gray-500 dark:text-gray-400",closeOnBackdropClick:a=!0,closeOnOverlayClick:s,showCloseButton:l=!0,closeOnEscape:g=!0,children:h,width:c="500px",className:i="",style:u})=>{const f=s!==void 0?s:a,p=k.useRef(null),m=k.useRef(null);if(k.useEffect(()=>{const x=A=>{A.key==="Escape"&&e&&g&&t()};if(e&&g)return document.addEventListener("keydown",x),()=>document.removeEventListener("keydown",x)},[e,t,g]),k.useEffect(()=>{if(e&&p.current){m.current=document.activeElement;const x=p.current.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'),A=x[0],v=x[x.length-1];A?.focus();const E=O=>{O.key==="Tab"&&(O.shiftKey?document.activeElement===A&&(O.preventDefault(),v?.focus()):document.activeElement===v&&(O.preventDefault(),A?.focus()))};return document.addEventListener("keydown",E),()=>{document.removeEventListener("keydown",E),m.current?.focus()}}},[e]),k.useEffect(()=>{if(e)return document.body.style.overflow="hidden",()=>{document.body.style.overflow=""}},[e]),!e)return null;const w=u?.zIndex??50;return d.jsxs(W,{className:"fixed inset-0 flex items-center justify-center",style:{zIndex:w},onClick:f?t:void 0,children:[d.jsx(W,{className:"absolute inset-0 bg-black/50","aria-hidden":"true"}),d.jsxs(W,{ref:p,className:`relative bg-white dark:bg-gray-800 rounded-lg shadow-xl max-h-[90vh] max-w-[calc(100vw-2rem)] overflow-hidden ${i}`,style:{width:c,...u?{...u,zIndex:void 0}:{}},onClick:x=>x.stopPropagation(),role:"dialog","aria-modal":"true","aria-labelledby":r?"modal-title":void 0,children:[(r||n||l)&&d.jsxs(W,{className:"flex items-center justify-between p-4",children:[(r||n)&&d.jsxs(W,{id:"modal-title",className:"flex items-center gap-3 text-lg font-semibold text-gray-900 dark:text-white",children:[n&&d.jsx(de,{name:n,size:"md",className:o}),r]}),l&&d.jsx(Q,{onClick:t,className:"ml-auto text-gray-400 dark:text-gray-500 hover:text-gray-600 dark:hover:text-gray-300 focus:outline-none","aria-label":Yf("common.close_modal"),children:d.jsx("svg",{className:"w-6 h-6",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:d.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M6 18L18 6M6 6l12 12"})})})]}),d.jsx(W,{className:"px-6 py-4 overflow-y-auto max-h-[calc(90vh-140px)]",children:h})]})]})},Xf=Object.freeze(Object.defineProperty({__proto__:null,Modal:Qo},Symbol.toStringTag,{value:"Module"})),Jo=(e,t)=>window.G7Core?.t?.(e,t)??e,Ro=({isOpen:e,onClose:t,title:r,message:n,confirmText:o,cancelText:a,onConfirm:s,onCancel:l,confirmButtonVariant:g="primary",cancelButtonVariant:h="secondary",width:c="500px",closeOnOverlay:i=!0,isLoading:u=!1,loadingText:f})=>{const p=o??Jo("common.confirm"),m=a??Jo("common.cancel"),w=f??Jo("common.loading"),x=()=>{s()},A=()=>{u||(l?.(),t())},v=()=>{u||t()},E={primary:"bg-blue-600 text-white hover:bg-blue-700",secondary:"bg-gray-200 dark:bg-gray-700 text-gray-800 dark:text-gray-200 hover:bg-gray-300 dark:hover:bg-gray-600",danger:"bg-red-600 text-white hover:bg-red-700",ghost:"bg-transparent text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700"};return d.jsxs(Qo,{isOpen:e,onClose:v,title:r,width:c,children:[d.jsx(W,{className:"py-2",children:typeof n=="string"?d.jsx(Dt,{className:"text-gray-700 dark:text-gray-300",children:n}):n}),d.jsxs(W,{className:"flex justify-end gap-3 mt-6",children:[d.jsx(Q,{onClick:A,disabled:u,className:"px-4 py-2 bg-white dark:bg-gray-800 text-gray-700 dark:text-gray-300 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700 disabled:opacity-50 disabled:cursor-not-allowed",children:d.jsx(te,{children:m})}),d.jsxs(Q,{onClick:x,disabled:u,className:`flex items-center gap-2 px-4 py-2 rounded-lg disabled:opacity-50 disabled:cursor-not-allowed ${E[g]}`,children:[u&&d.jsx(Ct,{className:"fa-solid fa-spinner w-4 h-4 animate-spin"}),d.jsx(te,{children:u?w:p})]})]})]})},qf=Object.freeze(Object.defineProperty({__proto__:null,ConfirmDialog:Ro},Symbol.toStringTag,{value:"Module"})),Pl=k.createContext(null),Fl=({value:e,children:t})=>d.jsx(Pl.Provider,{value:e,children:t}),Zf=()=>{const e=k.useContext(Pl);if(!e)throw new Error("useFileUploaderContext must be used within FileUploaderProvider");return e};function Qf(e,t){return t.forEach((function(r){r&&typeof r!="string"&&!Array.isArray(r)&&Object.keys(r).forEach((function(n){if(n!=="default"&&!(n in e)){var o=Object.getOwnPropertyDescriptor(r,n);Object.defineProperty(e,n,o.get?o:{enumerable:!0,get:function(){return r[n]}})}}))})),Object.freeze(e)}function Ul(e,t){return new Promise((function(r,n){let o;return Jf(e).then((function(a){try{return o=a,r(new Blob([t.slice(0,2),o,t.slice(2)],{type:"image/jpeg"}))}catch(s){return n(s)}}),n)}))}const Jf=e=>new Promise(((t,r)=>{const n=new FileReader;n.addEventListener("load",(({target:{result:o}})=>{const a=new DataView(o);let s=0;if(a.getUint16(s)!==65496)return r("not a valid JPEG");for(s+=2;;){const l=a.getUint16(s);if(l===65498)break;const g=a.getUint16(s+2);if(l===65505&&a.getUint32(s+4)===1165519206){const h=s+10;let c;switch(a.getUint16(h)){case 18761:c=!0;break;case 19789:c=!1;break;default:return r("TIFF header contains invalid endian")}if(a.getUint16(h+2,c)!==42)return r("TIFF header contains invalid version");const i=a.getUint32(h+4,c),u=h+i+2+12*a.getUint16(h+i,c);for(let f=h+i+2;f>>24&255,l[s+1]=g>>>16&255,l[s+2]=g>>>8&255,l[s+3]=g>>>0&255,new Uint8Array(l.buffer,0,s+4)},n.deflateRaw=function(o,a){a==null&&(a={level:6});var s=new Uint8Array(50+Math.floor(1.1*o.length)),l=n.F.deflateRaw(o,s,l,a.level);return new Uint8Array(s.buffer,0,l)},n.encode=function(o,a){a==null&&(a=!1);var s=0,l=n.bin.writeUint,g=n.bin.writeUshort,h={};for(var c in o){var i=!n._noNeed(c)&&!a,u=o[c],f=n.crc.crc(u,0,u.length);h[c]={cpr:i,usize:u.length,crc:f,file:i?n.deflateRaw(u):u}}for(var c in h)s+=h[c].file.length+30+46+2*n.bin.sizeUTF8(c);s+=22;var p=new Uint8Array(s),m=0,w=[];for(var c in h){var x=h[c];w.push(m),m=n._writeHeader(p,m,c,x,0)}var A=0,v=m;for(var c in h)x=h[c],w.push(m),m=n._writeHeader(p,m,c,x,1,w[A++]);var E=m-v;return l(p,m,101010256),m+=4,g(p,m+=4,A),g(p,m+=2,A),l(p,m+=2,E),l(p,m+=4,v),m+=4,m+=2,p.buffer},n._noNeed=function(o){var a=o.split(".").pop().toLowerCase();return"png,jpg,jpeg,zip".indexOf(a)!=-1},n._writeHeader=function(o,a,s,l,g,h){var c=n.bin.writeUint,i=n.bin.writeUshort,u=l.file;return c(o,a,g==0?67324752:33639248),a+=4,g==1&&(a+=2),i(o,a,20),i(o,a+=2,0),i(o,a+=2,l.cpr?8:0),c(o,a+=2,0),c(o,a+=4,l.crc),c(o,a+=4,u.length),c(o,a+=4,l.usize),i(o,a+=4,n.bin.sizeUTF8(s)),i(o,a+=2,0),a+=2,g==1&&(a+=2,a+=2,c(o,a+=6,h),a+=4),a+=n.bin.writeUTF8(o,a,s),g==0&&(o.set(u,a),a+=u.length),a},n.crc={table:(function(){for(var o=new Uint32Array(256),a=0;a<256;a++){for(var s=a,l=0;l<8;l++)1&s?s=3988292384^s>>>1:s>>>=1;o[a]=s}return o})(),update:function(o,a,s,l){for(var g=0;g>>8;return o},crc:function(o,a,s){return 4294967295^n.crc.update(4294967295,o,a,s)}},n.adler=function(o,a,s){for(var l=1,g=0,h=a,c=a+s;h>8&255},readUint:function(o,a){return 16777216*o[a+3]+(o[a+2]<<16|o[a+1]<<8|o[a])},writeUint:function(o,a,s){o[a]=255&s,o[a+1]=s>>8&255,o[a+2]=s>>16&255,o[a+3]=s>>24&255},readASCII:function(o,a,s){for(var l="",g=0;g>6,o[a+g+1]=128|c>>0&63,g+=2;else if((4294901760&c)==0)o[a+g]=224|c>>12,o[a+g+1]=128|c>>6&63,o[a+g+2]=128|c>>0&63,g+=3;else{if((4292870144&c)!=0)throw"e";o[a+g]=240|c>>18,o[a+g+1]=128|c>>12&63,o[a+g+2]=128|c>>6&63,o[a+g+3]=128|c>>0&63,g+=4}}return g},sizeUTF8:function(o){for(var a=o.length,s=0,l=0;l>>3}var w=h.lits,x=h.strt,A=h.prev,v=0,E=0,O=0,_=0,I=0,C=0;for(m>2&&(x[C=n.F._hash(o,0)]=0),u=0;u14e3||E>26697)&&m-u>100&&(p>>16,P=65535&N;if(N!=0){P=65535&N;var D=c(M=N>>>16,h.of0);h.lhst[257+D]++;var L=c(P,h.df0);h.dhst[L]++,_+=h.exb[D]+h.dxb[L],w[v]=M<<23|u-p,w[v+1]=P<<16|D<<8|L,v+=2,p=u+M}else h.lhst[o[u]]++;E++}}for(O==u&&o.length!=0||(p>>3},n.F._bestMatch=function(o,a,s,l,g,h){var c=32767&a,i=s[c],u=c-i+32768&32767;if(i==c||l!=n.F._hash(o,a-u))return 0;for(var f=0,p=0,m=Math.min(32767,a);u<=m&&--h!=0&&i!=c;){if(f==0||o[a+f]==o[a+f-u]){var w=n.F._howLong(o,a,u);if(w>f){if(p=u,(f=w)>=g)break;u+2x&&(x=E,i=v)}}}u+=(c=i)-(i=s[c])+32768&32767}return f<<16|p},n.F._howLong=function(o,a,s){if(o[a]!=o[a-s]||o[a+1]!=o[a+1-s]||o[a+2]!=o[a+2-s])return 0;var l=a,g=Math.min(o.length,a+258);for(a+=3;a>>23,Y=b+(8388607&F);b>16,j=B>>8&255,H=255&B;C(i,u=n.F._writeLit(257+j,L,i,u),G-_.of0[j]),u+=_.exb[j],I(i,u=n.F._writeLit(H,$,i,u),V-_.df0[H]),u+=_.dxb[H],b+=G}}u=n.F._writeLit(256,L,i,u)}return u},n.F._copyExact=function(o,a,s,l,g){var h=g>>>3;return l[h]=s,l[h+1]=s>>>8,l[h+2]=255-l[h],l[h+3]=255-l[h+1],h+=4,l.set(new Uint8Array(o.buffer,a,s),h),g+(s+4<<3)},n.F.getTrees=function(){for(var o=n.F.U,a=n.F._hufTree(o.lhst,o.ltree,15),s=n.F._hufTree(o.dhst,o.dtree,15),l=[],g=n.F._lenCodes(o.ltree,l),h=[],c=n.F._lenCodes(o.dtree,h),i=0;i4&&o.itree[1+(o.ordr[f-1]<<1)]==0;)f--;return[a,s,u,g,c,f,l,h]},n.F.getSecond=function(o){for(var a=[],s=0;s>1)+",");return a},n.F.contSize=function(o,a){for(var s=0,l=0;l15&&(n.F._putsE(s,l,c,i),l+=i)}return l},n.F._lenCodes=function(o,a){for(var s=o.length;s!=2&&o[s-1]==0;)s-=2;for(var l=0;l>>1,138))<11?a.push(17,f-3):a.push(18,f-11),l+=2*f-2}else if(g==i&&h==g&&c==g){for(u=l+5;u+2>>1,6);a.push(16,f-3),l+=2*f-2}else a.push(g,0)}return s>>>1},n.F._hufTree=function(o,a,s){var l=[],g=o.length,h=a.length,c=0;for(c=0;cs&&(n.F.restrictDepth(u,s,v),v=s),c=0;ca;l++){var c=o[l].d;o[l].d=a,h+=g-(1<>>=s-a;h>0;)(c=o[l].d)=0;l--)o[l].d==a&&h<0&&(o[l].d--,h++);h!=0&&console.log("debt left")},n.F._goodIndex=function(o,a){var s=0;return a[16|s]<=o&&(s|=16),a[8|s]<=o&&(s|=8),a[4|s]<=o&&(s|=4),a[2|s]<=o&&(s|=2),a[1|s]<=o&&(s|=1),s},n.F._writeLit=function(o,a,s,l){return n.F._putsF(s,l,a[o<<1]),l+a[1+(o<<1)]},n.F.inflate=function(o,a){var s=Uint8Array;if(o[0]==3&&o[1]==0)return a||new s(0);var l=n.F,g=l._bitsF,h=l._bitsE,c=l._decodeTiny,i=l.makeCodes,u=l.codes2map,f=l._get17,p=l.U,m=a==null;m&&(a=new s(o.length>>>2<<3));for(var w,x,A=0,v=0,E=0,O=0,_=0,I=0,C=0,y=0,N=0;A==0;)if(A=g(o,N,1),v=g(o,N+1,2),N+=3,v!=0){if(m&&(a=n.F._check(a,y+131072)),v==1&&(w=p.flmap,x=p.fdmap,I=511,C=31),v==2){E=h(o,N,5)+257,O=h(o,N+5,5)+1,_=h(o,N+10,4)+4,N+=14;for(var M=0;M<38;M+=2)p.itree[M]=0,p.itree[M+1]=0;var P=1;for(M=0;M<_;M++){var D=h(o,N+3*M,3);p.itree[1+(p.ordr[M]<<1)]=D,D>P&&(P=D)}N+=3*_,i(p.itree,P),u(p.itree,P,p.imap),w=p.lmap,x=p.dmap,N=c(p.imap,(1<>>4;if(!(b>>>8))a[y++]=b;else{if(b==256)break;var U=y+b-254;if(b>264){var F=p.ldef[b-257];U=y+(F>>>3)+h(o,N,7&F),N+=7&F}var G=x[f(o,N)&C];N+=15&G;var Y=G>>>4,B=p.ddef[Y],V=(B>>>4)+g(o,N,15&B);for(N+=15&B,m&&(a=n.F._check(a,y+131072));y>>3),H=o[j-4]|o[j-3]<<8;m&&(a=n.F._check(a,y+H)),a.set(new s(o.buffer,o.byteOffset+j,H),y),N=j+H<<3,y+=H}return a.length==y?a:a.slice(0,y)},n.F._check=function(o,a){var s=o.length;if(a<=s)return o;var l=new Uint8Array(Math.max(s<<1,a));return l.set(o,0),l},n.F._decodeTiny=function(o,a,s,l,g,h){for(var c=n.F._bitsE,i=n.F._get17,u=0;u>>4;if(p<=15)h[u]=p,u++;else{var m=0,w=0;p==16?(w=3+c(l,g,2),g+=2,m=h[u-1]):p==17?(w=3+c(l,g,3),g+=3):p==18&&(w=11+c(l,g,7),g+=7);for(var x=u+w;u>>1;hg&&(g=i),h++}for(;h>1,i=o[h+1],u=c<<4|i,f=a-i,p=o[h]<>>15-a]=u,p++},n.F.revCodes=function(o,a){for(var s=n.F.U.rev15,l=15-a,g=0;g>>l}},n.F._putsE=function(o,a,s){s<<=7&a;var l=a>>>3;o[l]|=s,o[l+1]|=s>>>8},n.F._putsF=function(o,a,s){s<<=7&a;var l=a>>>3;o[l]|=s,o[l+1]|=s>>>8,o[l+2]|=s>>>16},n.F._bitsE=function(o,a,s){return(o[a>>>3]|o[1+(a>>>3)]<<8)>>>(7&a)&(1<>>3]|o[1+(a>>>3)]<<8|o[2+(a>>>3)]<<16)>>>(7&a)&(1<>>3]|o[1+(a>>>3)]<<8|o[2+(a>>>3)]<<16)>>>(7&a)},n.F._get25=function(o,a){return(o[a>>>3]|o[1+(a>>>3)]<<8|o[2+(a>>>3)]<<16|o[3+(a>>>3)]<<24)>>>(7&a)},n.F.U=(t=Uint16Array,r=Uint32Array,{next_code:new t(16),bl_count:new t(16),ordr:[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],of0:[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,999,999,999],exb:[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0],ldef:new t(32),df0:[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,65535,65535],dxb:[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0],ddef:new r(32),flmap:new t(512),fltree:[],fdmap:new t(32),fdtree:[],lmap:new t(32768),ltree:[],ttree:[],dmap:new t(32768),dtree:[],imap:new t(512),itree:[],rev15:new t(32768),lhst:new r(286),dhst:new r(30),ihst:new r(19),lits:new r(15e3),strt:new t(65536),prev:new t(32768)}),(function(){for(var o=n.F.U,a=0;a<32768;a++){var s=a;s=(4278255360&(s=(4042322160&(s=(3435973836&(s=(2863311530&s)>>>1|(1431655765&s)<<1))>>>2|(858993459&s)<<2))>>>4|(252645135&s)<<4))>>>8|(16711935&s)<<8,o.rev15[a]=(s>>>16|s<<16)>>>17}function l(g,h,c){for(;h--!=0;)g.push(0,c)}for(a=0;a<32;a++)o.ldef[a]=o.of0[a]<<3|o.exb[a],o.ddef[a]=o.df0[a]<<4|o.dxb[a];l(o.fltree,144,8),l(o.fltree,112,9),l(o.fltree,24,7),l(o.fltree,8,8),n.F.makeCodes(o.fltree,9),n.F.codes2map(o.fltree,9,o.flmap),n.F.revCodes(o.fltree,9),l(o.fdtree,32,5),n.F.makeCodes(o.fdtree,5),n.F.codes2map(o.fdtree,5,o.fdmap),n.F.revCodes(o.fdtree,5),l(o.itree,19,0),l(o.ltree,286,0),l(o.dtree,30,0),l(o.ttree,320,0)})()})();var eg=Qf({__proto__:null,default:On},[On]);const Ht=(function(){var e={nextZero(c,i){for(;c[i]!=0;)i++;return i},readUshort:(c,i)=>c[i]<<8|c[i+1],writeUshort(c,i,u){c[i]=u>>8&255,c[i+1]=255&u},readUint:(c,i)=>16777216*c[i]+(c[i+1]<<16|c[i+2]<<8|c[i+3]),writeUint(c,i,u){c[i]=u>>24&255,c[i+1]=u>>16&255,c[i+2]=u>>8&255,c[i+3]=255&u},readASCII(c,i,u){let f="";for(let p=0;pc.length<2?`0${c}`:c,readUTF8(c,i,u){let f,p="";for(let m=0;m>3)]>>7-((7&_)<<0)&1);x[y]=F[D],x[y+1]=F[D+1],x[y+2]=F[D+2],x[y+3]=L>2)]>>6-((3&_)<<1)&3),x[y]=F[D],x[y+1]=F[D+1],x[y+2]=F[D+2],x[y+3]=L>1)]>>4-((1&_)<<2)&15),x[y]=F[D],x[y+1]=F[D+1],x[y+2]=F[D+2],x[y+3]=L>>3)]>>>7-(7&b)&1))==255*C?0:255;A[G+b]=U<<24|$<<16|$<<8|$}else if(E==2)for(b=0;b>>2)]>>>6-((3&b)<<1)&3))==85*C?0:255,A[G+b]=U<<24|$<<16|$<<8|$;else if(E==4)for(b=0;b>>1)]>>>4-((1&b)<<2)&15))==17*C?0:255,A[G+b]=U<<24|$<<16|$<<8|$;else if(E==8)for(b=0;b>3,C=Math.ceil(E*_/8),y=new Uint8Array(O*C);let N=0;const M=[0,0,4,0,2,0,1],P=[0,4,0,2,0,1,0],D=[8,8,8,4,4,2,2],L=[8,8,4,4,2,2,1];let $=0;for(;$<7;){const b=D[$],U=L[$];let F=0,G=0,Y=M[$];for(;Y>3])>>7-(7&ue)&1,y[H*C+(q>>3)]|=S<<7-((7&q)<<0)),_==2&&(S=(S=A[ue>>3])>>6-(7&ue)&3,y[H*C+(q>>2)]|=S<<6-((3&q)<<1)),_==4&&(S=(S=A[ue>>3])>>4-(7&ue)&15,y[H*C+(q>>1)]|=S<<4-((1&q)<<2)),_>=8){const ee=H*C+q*I;for(let fe=0;fe>3)+fe]}ue+=_,q+=U}j++,H+=b}F*G!=0&&(N+=G*(1+V)),$+=1}return y})(i,c)),i}function n(c,i){return o(new Uint8Array(c.buffer,2,c.length-6),i)}var o=(function(){const c={H:{}};return c.H.N=function(i,u){const f=Uint8Array;let p,m,w=0,x=0,A=0,v=0,E=0,O=0,_=0,I=0,C=0;if(i[0]==3&&i[1]==0)return u||new f(0);const y=c.H,N=y.b,M=y.e,P=y.R,D=y.n,L=y.A,$=y.Z,S=y.m,b=u==null;for(b&&(u=new f(i.length>>>2<<5));w==0;)if(w=N(i,C,1),x=N(i,C+1,2),C+=3,x!=0){if(b&&(u=c.H.W(u,I+(1<<17))),x==1&&(p=S.J,m=S.h,O=511,_=31),x==2){A=M(i,C,5)+257,v=M(i,C+5,5)+1,E=M(i,C+10,4)+4,C+=14;let F=1;for(var U=0;U<38;U+=2)S.Q[U]=0,S.Q[U+1]=0;for(U=0;UF&&(F=B)}C+=3*E,D(S.Q,F),L(S.Q,F,S.u),p=S.w,m=S.d,C=P(S.u,(1<>>4;if(!(G>>>8))u[I++]=G;else{if(G==256)break;{let Y=I+G-254;if(G>264){const q=S.q[G-257];Y=I+(q>>>3)+M(i,C,7&q),C+=7&q}const B=m[$(i,C)&_];C+=15&B;const V=B>>>4,j=S.c[V],H=(j>>>4)+N(i,C,15&j);for(C+=15&j;I>>3),G=i[F-4]|i[F-3]<<8;b&&(u=c.H.W(u,I+G)),u.set(new f(i.buffer,i.byteOffset+F,G),I),C=F+G<<3,I+=G}return u.length==I?u:u.slice(0,I)},c.H.W=function(i,u){const f=i.length;if(u<=f)return i;const p=new Uint8Array(f<<1);return p.set(i,0),p},c.H.R=function(i,u,f,p,m,w){const x=c.H.e,A=c.H.Z;let v=0;for(;v>>4;if(O<=15)w[v]=O,v++;else{let _=0,I=0;O==16?(I=3+x(p,m,2),m+=2,_=w[v-1]):O==17?(I=3+x(p,m,3),m+=3):O==18&&(I=11+x(p,m,7),m+=7);const C=v+I;for(;v>>1;for(;wm&&(m=A),w++}for(;w>1,A=i[w+1],v=x<<4|A,E=u-A;let O=i[w]<>>15-u]=v,O++}},c.H.l=function(i,u){const f=c.H.m.r,p=15-u;for(let m=0;m>>p}},c.H.M=function(i,u,f){f<<=7&u;const p=u>>>3;i[p]|=f,i[p+1]|=f>>>8},c.H.I=function(i,u,f){f<<=7&u;const p=u>>>3;i[p]|=f,i[p+1]|=f>>>8,i[p+2]|=f>>>16},c.H.e=function(i,u,f){return(i[u>>>3]|i[1+(u>>>3)]<<8)>>>(7&u)&(1<>>3]|i[1+(u>>>3)]<<8|i[2+(u>>>3)]<<16)>>>(7&u)&(1<>>3]|i[1+(u>>>3)]<<8|i[2+(u>>>3)]<<16)>>>(7&u)},c.H.i=function(i,u){return(i[u>>>3]|i[1+(u>>>3)]<<8|i[2+(u>>>3)]<<16|i[3+(u>>>3)]<<24)>>>(7&u)},c.H.m=(function(){const i=Uint16Array,u=Uint32Array;return{K:new i(16),j:new i(16),X:[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],S:[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,999,999,999],T:[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0],q:new i(32),p:[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,65535,65535],z:[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0],c:new u(32),J:new i(512),_:[],h:new i(32),$:[],w:new i(32768),C:[],v:[],d:new i(32768),D:[],u:new i(512),Q:[],r:new i(32768),s:new u(286),Y:new u(30),a:new u(19),t:new u(15e3),k:new i(65536),g:new i(32768)}})(),(function(){const i=c.H.m;for(var u=0;u<32768;u++){let p=u;p=(2863311530&p)>>>1|(1431655765&p)<<1,p=(3435973836&p)>>>2|(858993459&p)<<2,p=(4042322160&p)>>>4|(252645135&p)<<4,p=(4278255360&p)>>>8|(16711935&p)<<8,i.r[u]=(p>>>16|p<<16)>>>17}function f(p,m,w){for(;m--!=0;)p.push(0,w)}for(u=0;u<32;u++)i.q[u]=i.S[u]<<3|i.T[u],i.c[u]=i.p[u]<<4|i.z[u];f(i._,144,8),f(i._,112,9),f(i._,24,7),f(i._,8,8),c.H.n(i._,9),c.H.A(i._,9,i.J),c.H.l(i._,9),f(i.$,32,5),c.H.n(i.$,5),c.H.A(i.$,5,i.h),c.H.l(i.$,5),f(i.Q,19,0),f(i.C,286,0),f(i.D,30,0),f(i.v,320,0)})(),c.H.N})();function a(c){return[1,null,3,1,2,null,4][c.ctype]*c.depth}function s(c,i,u,f,p){let m=a(i);const w=Math.ceil(f*m/8);let x,A;m=Math.ceil(m/8);let v=c[u],E=0;if(v>1&&(c[u]=[0,0,1][v-2]),v==3)for(E=m;E>>1)&255;for(let O=0;O>>1);for(;E>>1)}else{for(;E=0&&x>=0?(O=$*i+S<<2,_=(x+$)*p+w+S<<2):(O=(-x+$)*i-w+S<<2,_=$*p+S<<2),A==0)f[_]=c[O],f[_+1]=c[O+1],f[_+2]=c[O+2],f[_+3]=c[O+3];else if(A==1){var I=c[O+3]*.00392156862745098,C=c[O]*I,y=c[O+1]*I,N=c[O+2]*I,M=f[_+3]*(1/255),P=f[_]*M,D=f[_+1]*M,L=f[_+2]*M;const b=1-I,U=I+M*b,F=U==0?0:1/U;f[_+3]=255*U,f[_+0]=(C+P*b)*F,f[_+1]=(y+D*b)*F,f[_+2]=(N+L*b)*F}else if(A==2)I=c[O+3],C=c[O],y=c[O+1],N=c[O+2],M=f[_+3],P=f[_],D=f[_+1],L=f[_+2],I==M&&C==P&&y==D&&N==L?(f[_]=0,f[_+1]=0,f[_+2]=0,f[_+3]=0):(f[_]=C,f[_+1]=y,f[_+2]=N,f[_+3]=I);else if(A==3){if(I=c[O+3],C=c[O],y=c[O+1],N=c[O+2],M=f[_+3],P=f[_],D=f[_+1],L=f[_+2],I==M&&C==P&&y==D&&N==L)continue;if(I<220&&M>20)return!1}return!0}return{decode:function(i){const u=new Uint8Array(i);let f=8;const p=e,m=p.readUshort,w=p.readUint,x={tabs:{},frames:[]},A=new Uint8Array(u.length);let v,E=0,O=0;const _=[137,80,78,71,13,10,26,10];for(var I=0;I<8;I++)if(u[I]!=_[I])throw"The input is not a PNG file!";for(;f>>1:N>>>=1;C[y]=N}return C})(),update(C,y,N,M){for(let P=0;P>>8;return C},crc:(C,y,N)=>4294967295^n.update(4294967295,C,y,N)};function o(C,y,N,M){y[N]+=C[0]*M>>4,y[N+1]+=C[1]*M>>4,y[N+2]+=C[2]*M>>4,y[N+3]+=C[3]*M>>4}function a(C){return Math.max(0,Math.min(255,C))}function s(C,y){const N=C[0]-y[0],M=C[1]-y[1],P=C[2]-y[2],D=C[3]-y[3];return N*N+M*M+P*P+D*D}function l(C,y,N,M,P,D,L){L==null&&(L=1);const $=M.length,S=[];for(var b=0;b<$;b++){const H=M[b];S.push([H>>>0&255,H>>>8&255,H>>>16&255,H>>>24&255])}for(b=0;b<$;b++){let H=4294967295;for(var U=0,F=0;F<$;F++){var G=s(S[b],S[F]);F!=b&&G>2]=U,Y[b>>2]=M[U]}}function g(C,y,N,M,P){P==null&&(P={});const{crc:D}=n,L=t.writeUint,$=t.writeUshort,S=t.writeASCII;let b=8;const U=C.frames.length>1;let F,G=!1,Y=33+(U?20:0);if(P.sRGB!=null&&(Y+=13),P.pHYs!=null&&(Y+=21),P.iCCP!=null&&(F=pako.deflate(P.iCCP),Y+=21+F.length+4),C.ctype==3){for(var B=C.plte.length,V=0;V>>24!=255&&(G=!0);Y+=8+3*B+4+(G?8+1*B+4:0)}for(var j=0;j>>8&255,Ge=R>>>16&255;H[b+fe+0]=ke,H[b+fe+1]=me,H[b+fe+2]=Ge}if(b+=3*B,L(H,b,D(H,b-3*B-4,3*B+4)),b+=4,G){for(L(H,b,B),b+=4,S(H,b,"tRNS"),b+=4,V=0;V>>24&255;b+=B,L(H,b,D(H,b-B-4,B+4)),b+=4}}let ue=0;for(j=0;jNe&&(Ne=Ze),BeVe&&(Ve=Be));Ne==-1&&(Ee=he=Ne=Ve=0),K&&((1&Ee)==1&&Ee--,(1&he)==1&&he--);const Fe=(Ne-Ee+1)*(Ve-he+1);Fe<_e&&(_e=Fe,Se=$e,se=Ee,ie=he,le=Ne-Ee+1,ne=Ve-he+1)}xe=new Uint8Array(Ce[ae-1-Se]),Se==1&&(oe[ae-1].dispose=2),be=new Uint8Array(le*ne*4),e(xe,we,Ue,be,le,ne,-se,-ie,0),Te=e(Oe,we,Ue,be,le,ne,-se,-ie,3)?1:0,Te==1?u(Oe,we,Ue,be,{x:se,y:ie,width:le,height:ne}):e(Oe,we,Ue,be,le,ne,-se,-ie,0)}else be=Oe.slice(0);oe.push({rect:{x:se,y:ie,width:le,height:ne},img:be,blend:Te,dispose:0})}if(Le)for(ae=0;ae>2,Le>>2);fe.push(R);const K=new Uint8Array(we.abuf,Ue,Le);U&&l(ke.img,ke.rect.width,ke.rect.height,ee,K,R),ke.img.set(K),Ue+=Le}}else for(B=0;Bme&&Ce==Me[j-me])R[j]=R[j-me];else{let we=ue[Ce];if(we==null&&(ue[Ce]=we=ee.length,ee.push(Ce),ee.length>=300))break;R[j]=we}}}const Ge=ee.length;for(Ge<=256&&b==0&&(G=Ge<=2?1:Ge<=4?2:Ge<=16?4:8,G=Math.max(G,S)),B=0;B>1)]|=Le[re+ye]<<4-4*(1&ye);else if(G==2)for(ye=0;ye>2)]|=Le[re+ye]<<6-2*(3&ye);else if(G==1)for(ye=0;ye>3)]|=Le[re+ye]<<7-1*(7&ye)}Ce=De,F=3,Ue=1}else if(H==0&&q.length==1){De=new Uint8Array(me*Me*3);const Le=me*Me;for(j=0;jj&&(j=fe),RH&&(H=R))}j==-1&&(B=V=j=H=0),L&&((1&B)==1&&B--,(1&V)==1&&V--),D={x:B,y:V,width:j-B+1,height:H-V+1};const q=M[P];q.rect=D,q.blend=1,q.img=new Uint8Array(D.width*D.height*4),M[P-1].dispose==0?(e(b,y,N,q.img,D.width,D.height,-D.x,-D.y,0),u(G,y,N,q.img,D)):e(G,y,N,q.img,D.width,D.height,-D.x,-D.y,0)}function u(C,y,N,M,P){e(C,y,N,M,P.width,P.height,-P.x,-P.y,2)}function f(C,y,N,M,P,D,L){const $=[];let S,b=[0,1,2,3,4];D!=-1?b=[D]:(y*M>5e5||N==1)&&(b=[0]),L&&(S={level:0});const U=eg;for(var F=0;F>1)+256&255;if(D==4)for(S=P;S>1)&255;for(S=P;S>1)&255}if(D==4){for(S=0;S>2);let U;if(N.length<2e7)for(var F=0;F>2]=U.ind,P[F>>2]=U.est.rgba;else for(F=0;F>2]=U.ind,P[F>>2]=U.est.rgba}return{abuf:M.buffer,inds:b,plte:$}}function w(C,y,N){N==null&&(N=1e-4);const M=new Uint32Array(C.buffer),P={i0:0,i1:C.length,bst:null,est:null,tdst:0,left:null,right:null};P.bst=O(C,P.i0,P.i1),P.est=_(P.bst);const D=[P];for(;D.length$&&($=D[L].est.L,S=L);if($=U||b.i1<=U){b.est.L=0;continue}const F={i0:b.i0,i1:U,bst:null,est:null,tdst:0,left:null,right:null};F.bst=O(C,F.i0,F.i1),F.est=_(F.bst);const G={i0:U,i1:b.i1,bst:null,est:null,tdst:0,left:null,right:null};for(G.bst={R:[],m:[],N:b.bst.N-F.bst.N},L=0;L<16;L++)G.bst.R[L]=b.bst.R[L]-F.bst.R[L];for(L=0;L<4;L++)G.bst.m[L]=b.bst.m[L]-F.bst.m[L];G.est=_(G.bst),b.left=F,b.right=G,D[S]=F,D.push(G)}for(D.sort((($,S)=>S.bst.N-$.bst.N)),L=0;L0&&(L=C.right,$=C.left);const S=x(L,y,N,M,P);if(S.tdst<=D*D)return S;const b=x($,y,N,M,P);return b.tdstD;)M-=4;if(N>=M)break;const L=y[N>>2];y[N>>2]=y[M>>2],y[M>>2]=L,N+=4,M-=4}for(;E(C,N,P)>D;)N-=4;return N+4}function E(C,y,N){return C[y]*N[0]+C[y+1]*N[1]+C[y+2]*N[2]+C[y+3]*N[3]}function O(C,y,N){const M=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],P=[0,0,0,0],D=N-y>>2;for(let L=y;L>>0}}var I={multVec:(C,y)=>[C[0]*y[0]+C[1]*y[1]+C[2]*y[2]+C[3]*y[3],C[4]*y[0]+C[5]*y[1]+C[6]*y[2]+C[7]*y[3],C[8]*y[0]+C[9]*y[1]+C[10]*y[2]+C[11]*y[3],C[12]*y[0]+C[13]*y[1]+C[14]*y[2]+C[15]*y[3]],dot:(C,y)=>C[0]*y[0]+C[1]*y[1]+C[2]*y[2]+C[3]*y[3],sml:(C,y)=>[C*y[0],C*y[1],C*y[2],C*y[3]]};Ht.encode=function(y,N,M,P,D,L,$){P==null&&(P=0),$==null&&($=!1);const S=c(y,N,M,P,[!1,!1,!1,0,$,!1]);return h(S,-1),g(S,N,M,D,L)},Ht.encodeLL=function(y,N,M,P,D,L,$,S){const b={ctype:0+(P==1?0:2)+(D==0?0:4),depth:L,frames:[]},U=(P+D)*L,F=U*N;for(let G=0;G>>0),O(1),O(32),_(3),_(g),_(2835),_(2835),I(8),_(16711680),_(65280),_(255),_(4278190080),_(1466527264),(function C(){for(;A0;){for(w=122+A*l,f=0;f>>24,i.setUint32(w+f,p<<8|m),f+=4;A++}E{t(new Blob([r],{type:"image/bmp"}))}))},_dly:9};var bt={CHROME:"CHROME",FIREFOX:"FIREFOX",DESKTOP_SAFARI:"DESKTOP_SAFARI",IE:"IE",IOS:"IOS",ETC:"ETC"},tg={[bt.CHROME]:16384,[bt.FIREFOX]:11180,[bt.DESKTOP_SAFARI]:16384,[bt.IE]:8192,[bt.IOS]:4096,[bt.ETC]:8192};const ea=typeof window<"u",zl=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope,In=ea&&window.cordova&&window.cordova.require&&window.cordova.require("cordova/modulemapper"),rg=(ea||zl)&&(In&&In.getOriginalSymbol(window,"File")||typeof File<"u"&&File),Hl=(ea||zl)&&(In&&In.getOriginalSymbol(window,"FileReader")||typeof FileReader<"u"&&FileReader);function ta(e,t,r=Date.now()){return new Promise((n=>{const o=e.split(","),a=o[0].match(/:(.*?);/)[1],s=globalThis.atob(o[1]);let l=s.length;const g=new Uint8Array(l);for(;l--;)g[l]=s.charCodeAt(l);const h=new Blob([g],{type:a});h.name=t,h.lastModified=r,n(h)}))}function Gl(e){return new Promise(((t,r)=>{const n=new Hl;n.onload=()=>t(n.result),n.onerror=o=>r(o),n.readAsDataURL(e)}))}function jl(e){return new Promise(((t,r)=>{const n=new Image;n.onload=()=>t(n),n.onerror=o=>r(o),n.src=e}))}function fr(){if(fr.cachedResult!==void 0)return fr.cachedResult;let e=bt.ETC;const{userAgent:t}=navigator;return/Chrom(e|ium)/i.test(t)?e=bt.CHROME:/iP(ad|od|hone)/i.test(t)&&/WebKit/i.test(t)?e=bt.IOS:/Safari/i.test(t)?e=bt.DESKTOP_SAFARI:/Firefox/i.test(t)?e=bt.FIREFOX:(/MSIE/i.test(t)||document.documentMode)&&(e=bt.IE),fr.cachedResult=e,fr.cachedResult}function Bl(e,t){const r=fr(),n=tg[r];let o=e,a=t,s=o*a;const l=o>a?a/o:o/a;for(;s>n*n;){const g=(n+o)/2,h=(n+a)/2;g$l.toBlob(e,c))).then(function(c){try{return l=c,l.name=r,l.lastModified=n,h.call(this)}catch(i){return s(i)}}.bind(this),s);{let c=function(){return h.call(this)};if(typeof OffscreenCanvas=="function"&&e instanceof OffscreenCanvas)return e.convertToBlob({type:t,quality:o}).then(function(i){try{return l=i,l.name=r,l.lastModified=n,c.call(this)}catch(u){return s(u)}}.bind(this),s);{let i;return i=e.toDataURL(t,o),ta(i,r,n).then(function(u){try{return l=u,c.call(this)}catch(f){return s(f)}}.bind(this),s)}}}function g(){return a(l)}}))}function Vt(e){e.width=0,e.height=0}function Nr(){return new Promise((function(e,t){let r,n,o,a;return Nr.cachedResult!==void 0?e(Nr.cachedResult):ta("data:image/jpeg;base64,/9j/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAYAAAAAAAD/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/AABEIAAEAAgMBEQACEQEDEQH/xABKAAEAAAAAAAAAAAAAAAAAAAALEAEAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAAAAAAAEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwA/8H//2Q==","test.jpg",Date.now()).then((function(s){try{return r=s,Pn(r).then((function(l){try{return n=l[1],Fn(n,r.type,r.name,r.lastModified).then((function(g){try{return o=g,Vt(n),Pn(o).then((function(h){try{return a=h[0],Nr.cachedResult=a.width===1&&a.height===2,e(Nr.cachedResult)}catch(c){return t(c)}}),t)}catch(h){return t(h)}}),t)}catch(g){return t(g)}}),t)}catch(l){return t(l)}}),t)}))}function Kl(e){return new Promise(((t,r)=>{const n=new Hl;n.onload=o=>{const a=new DataView(o.target.result);if(a.getUint16(0,!1)!=65496)return t(-2);const s=a.byteLength;let l=2;for(;lr(o),n.readAsArrayBuffer(e)}))}function Vl(e,t){const{width:r}=e,{height:n}=e,{maxWidthOrHeight:o}=t;let a,s=e;return isFinite(o)&&(r>o||n>o)&&([s,a]=Dn(r,n),r>n?(s.width=o,s.height=n/r*o):(s.width=r/n*o,s.height=o),a.drawImage(e,0,0,s.width,s.height),Vt(e)),s}function Yl(e,t){const{width:r}=e,{height:n}=e,[o,a]=Dn(r,n);switch(t>4&&t<9?(o.width=n,o.height=r):(o.width=r,o.height=n),t){case 2:a.transform(-1,0,0,1,r,0);break;case 3:a.transform(-1,0,0,-1,r,n);break;case 4:a.transform(1,0,0,-1,0,n);break;case 5:a.transform(0,1,1,0,0,0);break;case 6:a.transform(0,1,-1,0,n,0);break;case 7:a.transform(0,-1,-1,0,n,r);break;case 8:a.transform(0,-1,1,0,0,r)}return a.drawImage(e,0,0,r,n),Vt(e),o}function Xl(e,t,r=0){return new Promise((function(n,o){let a,s,l,g,h,c,i,u,f,p,m,w,x,A,v,E,O,_,I,C;function y(M=5){if(t.signal&&t.signal.aborted)throw t.signal.reason;a+=M,t.onProgress(Math.min(a,100))}function N(M){if(t.signal&&t.signal.aborted)throw t.signal.reason;a=Math.min(Math.max(M,a),100),t.onProgress(a)}return a=r,s=t.maxIteration||10,l=1024*t.maxSizeMB*1024,y(),Pn(e,t).then(function(M){try{return[,g]=M,y(),h=Vl(g,t),y(),new Promise((function(P,D){var L;if(!(L=t.exifOrientation))return Kl(e).then(function(S){try{return L=S,$.call(this)}catch(b){return D(b)}}.bind(this),D);function $(){return P(L)}return $.call(this)})).then(function(P){try{return c=P,y(),Nr().then(function(D){try{return i=D?h:Yl(h,c),y(),u=t.initialQuality||1,f=t.fileType||e.type,Fn(i,f,e.name,e.lastModified,u).then(function(L){try{{let S=function(){if(s--&&(v>l||v>x)){let U,F;return U=C?.95*I.width:I.width,F=C?.95*I.height:I.height,[O,_]=Dn(U,F),_.drawImage(I,0,0,U,F),u*=f==="image/png"?.85:.95,Fn(O,f,e.name,e.lastModified,u).then((function(G){try{return E=G,Vt(I),I=O,v=E.size,N(Math.min(99,Math.floor((A-v)/(A-l)*100))),S}catch(Y){return o(Y)}}),o)}return[1]},b=function(){return Vt(I),Vt(O),Vt(h),Vt(i),Vt(g),N(100),n(E)};if(p=L,y(),m=p.size>l,w=p.size>e.size,!m&&!w)return N(100),n(p);var $;return x=e.size,A=p.size,v=A,I=i,C=!t.alwaysKeepResolution&&m,($=function(U){for(;U;){if(U.then)return void U.then($,o);try{if(U.pop){if(U.length)return U.pop()?b.call(this):U;U=S}else U=U.call(this)}catch(F){return o(F)}}}.bind(this))(S)}}catch(S){return o(S)}}.bind(this),o)}catch(L){return o(L)}}.bind(this),o)}catch(D){return o(D)}}.bind(this),o)}catch(P){return o(P)}}.bind(this),o)}))}const ng=` let scriptImported = false self.addEventListener('message', async (e) => { const { file, id, imageCompressionLibUrl, options } = e.data @@ -83,5 +83,5 @@ self.addEventListener('message', async (e) => { transform: translateX(-100%); } } - `})]}):null},Rh=Object.freeze(Object.defineProperty({__proto__:null,PageTransitionIndicator:ka,default:ka},Symbol.toStringTag,{value:"Module"})),Vi=window.G7Core?.createLogger?.("Comp:PageTransitionBlur")??{log:(...e)=>console.log("[Comp:PageTransitionBlur]",...e),warn:(...e)=>console.warn("[Comp:PageTransitionBlur]",...e)},Ca=({className:e="",style:t})=>{const[r,n]=k.useState(!1);return k.useEffect(()=>{const o=window.G7Core?.TransitionManager;if(!o){Vi.warn("TransitionManager를 찾을 수 없습니다.");return}return n(o.getIsPending()),o.subscribe(s=>{Vi.log("isPending changed:",s),n(s)})},[]),r?d.jsx(W,{className:`fixed inset-0 z-40 bg-white/30 dark:bg-gray-900/30 backdrop-blur-sm transition-opacity duration-150 pointer-events-none ${e}`,style:t,role:"status","aria-label":"페이지 전환 중","data-testid":"page-transition-blur"}):null},e0=Object.freeze(Object.defineProperty({__proto__:null,PageTransitionBlur:Ca,default:Ca},Symbol.toStringTag,{value:"Module"})),Yi={sm:640,md:768,lg:1024,xl:1280,"2xl":1536},Xi=new Set(["hidden","block","inline-block","inline","flex","inline-flex","grid","inline-grid","table","table-row","table-cell","contents","list-item","flow-root"]),t0=new Set(["Div","Flex","Grid","Section","Article","Nav","Aside","Main","Header","Footer","Fragment","Form","Container"]),r0=new Set(["H1","H2","H3","H4","H5","H6","P","Span","Label","A","Strong","Em","Small","Badge"]),n0=new Set(["Input","Textarea","Select","Checkbox","Radio","Toggle","DatePicker","TagInput","SearchBar"]),o0=new Set(["Img","Image","Avatar","AvatarUploader","ImageGallery","ProductImageViewer","FileUploader"]),qi={DataGrid:(e,t)=>d.jsxs("div",{className:"w-full border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden",children:[d.jsx("div",{className:`h-10 bg-gray-100 dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700 ${e}`,children:d.jsxs("div",{className:"flex items-center h-full px-4 gap-8",children:[d.jsx("div",{className:"h-3 w-16 bg-gray-300 dark:bg-gray-600 rounded"}),d.jsx("div",{className:"h-3 w-24 bg-gray-300 dark:bg-gray-600 rounded"}),d.jsx("div",{className:"h-3 w-20 bg-gray-300 dark:bg-gray-600 rounded"}),d.jsx("div",{className:"h-3 w-16 bg-gray-300 dark:bg-gray-600 rounded"})]})}),Array.from({length:t},(r,n)=>d.jsx("div",{className:`h-12 border-b border-gray-100 dark:border-gray-800 ${e}`,style:{animationDelay:`${n*75}ms`},children:d.jsxs("div",{className:"flex items-center h-full px-4 gap-8",children:[d.jsx("div",{className:"h-3 w-12 bg-gray-200 dark:bg-gray-700 rounded"}),d.jsx("div",{className:"h-3 flex-1 bg-gray-200 dark:bg-gray-700 rounded"}),d.jsx("div",{className:"h-3 w-16 bg-gray-100 dark:bg-gray-800 rounded"}),d.jsx("div",{className:"h-3 w-14 bg-gray-100 dark:bg-gray-800 rounded"})]})},n))]}),Pagination:e=>d.jsx("div",{className:"flex justify-center gap-1.5 py-3",children:Array.from({length:5},(t,r)=>d.jsx("div",{className:`w-8 h-8 bg-gray-200 dark:bg-gray-700 rounded ${e}`},r))}),Tabs:e=>d.jsxs("div",{children:[d.jsx("div",{className:"flex gap-4 border-b border-gray-200 dark:border-gray-700 pb-2 mb-3",children:Array.from({length:3},(t,r)=>d.jsx("div",{className:`h-4 w-20 bg-gray-200 dark:bg-gray-700 rounded ${e}`},r))}),d.jsx("div",{className:`h-32 bg-gray-100 dark:bg-gray-800 rounded ${e}`})]}),TabNavigation:e=>d.jsx("div",{className:"flex gap-4 border-b border-gray-200 dark:border-gray-700 pb-2",children:Array.from({length:3},(t,r)=>d.jsx("div",{className:`h-4 w-20 bg-gray-200 dark:bg-gray-700 rounded ${e}`},r))}),ProductCard:e=>d.jsxs("div",{className:"rounded-lg overflow-hidden",children:[d.jsx("div",{className:`h-48 w-full bg-gray-200 dark:bg-gray-700 ${e}`}),d.jsxs("div",{className:"p-3 space-y-2",children:[d.jsx("div",{className:`h-3.5 w-3/4 bg-gray-200 dark:bg-gray-700 rounded ${e}`}),d.jsx("div",{className:`h-4 w-1/3 bg-gray-300 dark:bg-gray-600 rounded ${e}`})]})]}),UserInfo:e=>d.jsx("div",{className:`h-3 w-14 bg-gray-200 dark:bg-gray-700 rounded ${e}`}),QuantitySelector:e=>d.jsx("div",{className:`h-9 w-28 bg-gray-100 dark:bg-gray-800 rounded border border-gray-200 dark:border-gray-700 ${e}`}),Header:e=>d.jsx("header",{className:"bg-white dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700",children:d.jsx("div",{className:"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8",children:d.jsxs("div",{className:"flex items-center justify-between h-16",children:[d.jsxs("div",{className:"flex items-center gap-8",children:[d.jsx("div",{className:`h-8 w-24 bg-gray-200 dark:bg-gray-700 rounded ${e}`}),d.jsx("div",{className:"hidden lg:flex items-center gap-6",children:Array.from({length:4},(t,r)=>d.jsx("div",{className:`h-3.5 w-16 bg-gray-200 dark:bg-gray-700 rounded ${e}`},r))})]}),d.jsx("div",{className:"flex items-center gap-4",children:Array.from({length:3},(t,r)=>d.jsx("div",{className:`h-8 w-8 bg-gray-200 dark:bg-gray-700 rounded-full ${e}`},r))})]})})}),Footer:e=>d.jsx("footer",{className:"bg-white dark:bg-gray-800 border-t border-gray-200 dark:border-gray-700 mt-auto",children:d.jsx("div",{className:"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8",children:d.jsxs("div",{className:"flex flex-col items-center gap-4",children:[d.jsx("div",{className:`h-4 w-32 bg-gray-200 dark:bg-gray-700 rounded ${e}`}),d.jsx("div",{className:`h-3 w-48 bg-gray-100 dark:bg-gray-800 rounded ${e}`}),d.jsx("div",{className:"flex gap-3",children:Array.from({length:3},(t,r)=>d.jsx("div",{className:`h-6 w-6 bg-gray-200 dark:bg-gray-700 rounded-full ${e}`},r))}),d.jsx("div",{className:`h-3 w-40 bg-gray-100 dark:bg-gray-800 rounded ${e}`})]})})}),Modal:()=>d.jsx(d.Fragment,{}),Toast:()=>d.jsx(d.Fragment,{}),ConfirmDialog:()=>d.jsx(d.Fragment,{})};function a0(e){if(!e||e.length===0)return[];const t=e.filter(n=>n.if),r=e.filter(n=>!n.if);if(r.length>0&&t.length>0){const n=t.filter(o=>!Zi(o.if));return n.length>1&&s0(n)?[...r,Qi(n)]:[...r,...n]}if(t.length>1&&r.length===0){const n=t.filter(o=>!Zi(o.if));return n.length===0?[]:n.length===1?n:[Qi(n)]}return e}function Zi(e){const t=e.replace(/^\{\{|\}\}$/g,"").trim();return t.startsWith("!")||/\b(hasError|isError|isLoading|error|Error)\b/.test(t)||/===\s*0\s*(\)|\}|$)/.test(t)}function s0(e){if(e.length<2)return!1;const t=[];for(const n of e){const o=(n.if||"").replace(/^\{\{|\}\}$/g,"").trim(),a=o.match(/^(.+?)\s*===\s*['"]/);if(a)t.push(a[1].trim());else{const s=o.match(/(.+?)\s*===\s*['"]/);if(!s)return!1;t.push(s[1].trim())}}const r=t[0];return t.every(n=>n===r)}function Qi(e){return e.reduce((t,r)=>Sa(r)>Sa(t)?r:t)}function Sa(e){return e.children?e.children.length+e.children.reduce((t,r)=>t+Sa(r),0):0}function l0(e){return e.includes("{{")?e.replace(/\{\{([^}]+)\}\}/g,(t,r)=>{const n=r.match(/\?[\s]*['"]([^'"]*)['"]\s*:\s*['"]/);return n?n[1]:""}):e}function _a(e,t){if(!e)return"";let r=e;return r=r.replace(/\b(bg-\S+|text-\S+|border\b|border-\S+|shadow\S*|ring-\S+|outline-\S+|divide-\S+|opacity-\S+|font-\S+|tracking-\S+|leading-\S+|whitespace-\S+|truncate|line-clamp-\S+|underline|no-underline|decoration-\S+|cursor-\S+|hover:\S+|focus:\S+|active:\S+|group-hover:\S+|transition\S*|duration-\S+|ease-\S+|animate-\S+|dark:\S+)\b/g,"").replace(/\s{2,}/g," ").trim(),(t==="Grid"||/\bgrid-cols-\d/.test(r))&&(r=r.replace(/\bgrid-cols-(\d+)/g,(n,o)=>{const a=parseInt(o);return a>4?`grid-cols-${Math.ceil(a/2)}`:`grid-cols-${a}`})),r}function i0(e){const{name:t,props:r}=e;if(!r||!t)return"";const n=[];if(t==="Flex"){n.push("flex");const o=r.direction||"row",a={row:"flex-row","row-reverse":"flex-row-reverse",col:"flex-col","col-reverse":"flex-col-reverse"};a[o]&&n.push(a[o]);const s=r.justify||"start",l={start:"justify-start",end:"justify-end",center:"justify-center",between:"justify-between",around:"justify-around",evenly:"justify-evenly"};l[s]&&n.push(l[s]);const g=r.align||"stretch",h={start:"items-start",end:"items-end",center:"items-center",baseline:"items-baseline",stretch:"items-stretch"};h[g]&&n.push(h[g]);const c=r.wrap||"nowrap",i={wrap:"flex-wrap",nowrap:"flex-nowrap","wrap-reverse":"flex-wrap-reverse"};i[c]&&n.push(i[c]),r.gap&&r.gap>0&&n.push(`gap-${r.gap}`)}if(t==="Grid"){n.push("grid");const o=r.cols||1;if(n.push(`grid-cols-${o}`),r.responsive){const a=r.responsive;a.sm&&n.push(`sm:grid-cols-${a.sm}`),a.md&&n.push(`md:grid-cols-${a.md}`),a.lg&&n.push(`lg:grid-cols-${a.lg}`),a.xl&&n.push(`xl:grid-cols-${a.xl}`),a["2xl"]&&n.push(`2xl:grid-cols-${a["2xl"]}`)}r.gap!==void 0&&r.gap>0&&n.push(`gap-${r.gap}`),r.rowGap!==void 0&&r.rowGap>0&&n.push(`gap-y-${r.rowGap}`),r.colGap!==void 0&&r.colGap>0&&n.push(`gap-x-${r.colGap}`)}return n.join(" ")}function c0(e){switch(e){case"pulse":return"animate-pulse";case"wave":return"animate-pulse";case"none":return"";default:return"animate-pulse"}}function qn(e,t,r,n){return!e||e.length===0?[]:a0(e).map((a,s)=>Ji(a,t,r,s,n))}function d0(e,t){const r=e.props?.className||e.className||"";return e.responsive?t>=1024&&e.responsive.desktop?.props?.className?e.responsive.desktop.props.className:t>=768&&e.responsive.tablet?.props?.className?e.responsive.tablet.props.className:r:r}function u0(e,t){const r=e.split(/\s+/).filter(Boolean),n=[],o=[];for(const g of r){const h=g.match(/^(sm|md|lg|xl|2xl):(.+)$/);if(h){const[,c,i]=h;if(Xi.has(i)){n.push({breakpoint:Yi[c]||0,display:i});continue}(Yi[c]||0)<=t&&o.push(i);continue}if(Xi.has(g)){n.push({breakpoint:0,display:g});continue}o.push(g)}if(n.length===0)return{visible:!0,className:e};n.sort((g,h)=>g.breakpoint-h.breakpoint);let a="";for(const g of n)g.breakpoint<=t&&(a=g.display);a||(a=n[0].display);const s=a!=="hidden",l=s?[a,...o].join(" "):"";return{visible:s,className:l}}function f0(e){const t=e.match(/\bgrid-cols-\[([^\]]+)\]/);if(!t)return{className:e};const r=t[1].replace(/_/g," ");return{className:e.replace(/\bgrid-cols-\[([^\]]+)\]/,"").replace(/\s{2,}/g," ").trim(),style:{gridTemplateColumns:r}}}function Ji(e,t,r,n,o){const{name:a,children:s,iteration:l}=e,g=d0(e,o),h=i0(e),c=h?`${h} ${g}`.trim():g,i=l0(c),u=u0(i,o);if(!a||!u.visible)return null;const f=u.className;if(l)return d.jsx(k.Fragment,{children:Array.from({length:r},(m,w)=>Ji({...e,iteration:void 0},t,r,w,o))},n);if(qi[a])return d.jsx("div",{className:f,children:qi[a](t,r)},n);if(t0.has(a)){const m=_a(f,a);if(!s||s.length===0){const E=/\b(h-\S|w-\S)/.test(m)?`${m} bg-gray-200 dark:bg-gray-700 rounded ${t}`:`${m} h-3.5 w-full bg-gray-200 dark:bg-gray-700 rounded ${t}`.trim();return d.jsx("div",{className:E},n)}const w=qn(s,t,r,o);if(!(w.length>0&&w.some(v=>v!==null)))return null;const A=f0(m);return d.jsx("div",{className:A.className,style:A.style,children:w},n)}const p=_a(f,a);if(r0.has(a)){const m={H1:"h-7",H2:"h-6",H3:"h-5",H4:"h-5",H5:"h-4",H6:"h-4",P:"h-3.5",Span:"h-3",Label:"h-3",A:"h-3.5",Badge:"h-5 w-16"},w={H1:"w-3/5",H2:"w-2/5",H3:"w-1/3",H4:"w-1/3",H5:"w-1/4",H6:"w-1/4",P:"w-full",Span:"w-1/4",Label:"w-1/4",A:"w-1/3",Strong:"w-1/5",Em:"w-1/4",Small:"w-1/5",Badge:"w-16"},x=m[a]||"h-3.5",A=w[a]||"w-full",v=a.startsWith("H")?"mb-2 mt-1":"mb-1.5";return d.jsx("div",{className:`${x} ${A} bg-gray-200 dark:bg-gray-700 rounded ${t} ${v} ${p}`.trim()},n)}if(n0.has(a))return a==="Textarea"?d.jsx("div",{className:`h-20 w-full bg-gray-100 dark:bg-gray-800 rounded border border-gray-200 dark:border-gray-700 mb-2 ${t}`},n):a==="Checkbox"||a==="Radio"||a==="Toggle"?d.jsx("div",{className:`h-5 w-5 bg-gray-200 dark:bg-gray-700 rounded mb-1.5 ${t}`},n):d.jsx("div",{className:`h-9 w-full bg-gray-100 dark:bg-gray-800 rounded border border-gray-200 dark:border-gray-700 mb-2 ${t}`},n);if(o0.has(a))return a==="Avatar"||a==="AvatarUploader"?d.jsx("div",{className:`h-10 w-10 bg-gray-200 dark:bg-gray-700 rounded-full ${t}`},n):a==="ProductImageViewer"?d.jsx("div",{className:`h-80 w-full bg-gray-200 dark:bg-gray-700 rounded ${t}`},n):d.jsx("div",{className:`h-40 w-full bg-gray-200 dark:bg-gray-700 rounded mb-2 ${t}`},n);if(a==="Button"){if(s&&s.length>0){const m=_a(f,a),w=qn(s,t,r,o);if(!(w.length>0&&w.some(E=>E!==null)))return null;const v=/\b(border|rounded|px-\d|py-\d)/.test(g)?"border border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800/50 rounded-lg":"";return d.jsx("div",{className:`${m} ${v}`.trim(),children:w},n)}return d.jsx("div",{className:`h-9 w-24 bg-gray-200 dark:bg-gray-700 rounded ${t}`},n)}return a==="Icon"?d.jsx("div",{className:`h-5 w-5 bg-gray-200 dark:bg-gray-700 rounded ${t}`},n):s&&s.length>0?d.jsx("div",{className:p,children:qn(s,t,r,o)},n):d.jsx("div",{className:`h-3.5 w-full bg-gray-200 dark:bg-gray-700 rounded mb-1.5 ${t}`},n)}const Ea=({components:e,options:t})=>{const r=c0(t.animation),o=window.G7Core?.useResponsive,a=o?.(),s=a?a.width:typeof window<"u"?window.innerWidth:1024;return d.jsx("div",{className:"w-full",role:"status","aria-busy":"true","aria-label":"Loading...",children:qn(e,r,t.iteration_count,s)})},g0=Object.freeze(Object.defineProperty({__proto__:null,PageSkeleton:Ea,default:Ea},Symbol.toStringTag,{value:"Module"})),h0=(e,t)=>window.G7Core?.t?.(e,t)??e,Ri=({options:e})=>{const t=document.documentElement.classList.contains("dark"),r=t?"rgb(17,24,39)":"rgb(249,250,251)",n=t?"#6b7280":"#9ca3af",o=t?"#9ca3af":"#6b7280";return d.jsxs("div",{style:{position:"absolute",inset:0,zIndex:2147483647,overflow:"hidden",background:r,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"flex-start",paddingTop:"15%",gap:"12px"},children:[d.jsx("div",{style:{width:"32px",height:"32px",border:`3px solid ${n}`,borderTopColor:"transparent",borderRadius:"50%",animation:"g7-spin 0.8s linear infinite"}}),d.jsx("span",{style:{color:o,fontSize:"14px"},children:e?.text||h0("nav.loading")})]})},p0=Object.freeze(Object.defineProperty({__proto__:null,default:Ri},Symbol.toStringTag,{value:"Module"})),Dr=(e,t)=>window.G7Core?.t?.(e,t)??e,ec=({currentPage:e,totalPages:t,onPageChange:r,maxVisiblePages:n=5,showFirstLast:o=!0,className:a="",style:s,prevText:l,nextText:g,id:h,editorAttrs:c})=>{const i=k.useMemo(()=>{const m=[];if(t<=n+2)for(let w=1;w<=t;w++)m.push(w);else{const w=Math.floor(n/2);let x=Math.max(2,e-w),A=Math.min(t-1,e+w);e<=w+1?A=n:e>=t-w&&(x=t-n+1),m.push(1),x>2&&m.push("...");for(let v=x;v<=A;v++)m.push(v);A1&&m.push(t)}return m},[e,t,n]),u=m=>{m<1||m>t||m===e||r(m)},f=()=>{e>1&&r(e-1)},p=()=>{eu(1),disabled:e===1,className:"px-3 py-1 text-sm border border-gray-300 dark:border-gray-600 rounded hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-50 disabled:cursor-not-allowed text-gray-700 dark:text-gray-300 bg-white dark:bg-gray-800","aria-label":Dr("common.first_page"),children:"«"}),d.jsx(Q,{onClick:f,disabled:e===1,className:"px-3 py-1 text-sm border border-gray-300 dark:border-gray-600 rounded hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-50 disabled:cursor-not-allowed text-gray-700 dark:text-gray-300 bg-white dark:bg-gray-800","aria-label":Dr("common.prev_page"),children:l||d.jsx(d.Fragment,{children:"‹"})}),d.jsx(W,{className:"flex items-center gap-1",children:i.map((m,w)=>{if(m==="...")return d.jsx(te,{className:"px-3 py-1 text-sm text-gray-500 dark:text-gray-400",children:"..."},`ellipsis-${w}`);const x=m,A=x===e;return d.jsx(Q,{onClick:()=>u(x),className:`px-3 py-1 text-sm border rounded ${A?"bg-blue-500 dark:bg-blue-600 text-white border-blue-500 dark:border-blue-600":"border-gray-300 dark:border-gray-600 hover:bg-gray-100 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300 bg-white dark:bg-gray-800"}`,"aria-label":Dr("common.page_n",{n:x}),"aria-current":A?"page":void 0,children:x},x)})}),d.jsx(Q,{onClick:p,disabled:e===t,className:"px-3 py-1 text-sm border border-gray-300 dark:border-gray-600 rounded hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-50 disabled:cursor-not-allowed text-gray-700 dark:text-gray-300 bg-white dark:bg-gray-800","aria-label":Dr("common.next_page"),children:g||d.jsx(d.Fragment,{children:"›"})}),o&&d.jsx(Q,{onClick:()=>u(t),disabled:e===t,className:"px-3 py-1 text-sm border border-gray-300 dark:border-gray-600 rounded hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-50 disabled:cursor-not-allowed text-gray-700 dark:text-gray-300 bg-white dark:bg-gray-800","aria-label":Dr("common.last_page"),children:"»"})]})},m0=Object.freeze(Object.defineProperty({__proto__:null,Pagination:ec},Symbol.toStringTag,{value:"Module"})),tc=(e,t)=>window.G7Core?.t?.(e,t)??e,rc=({name:e="search",placeholder:t,value:r,onChange:n,onSubmit:o,showButton:a=!1,suggestions:s=[],onSuggestionClick:l,showSuggestions:g=!1,className:h="",style:c,id:i,editorAttrs:u})=>{const f=t??tc("common.search_placeholder"),[p,m]=k.useState(""),[w,x]=k.useState(!1),A=k.useRef(null),v=k.useRef(""),E=r!==void 0?r:p,O=g&&w&&s.length>0&&E.length>0;k.useEffect(()=>{r!==void 0&&(v.current=r)},[r]);const _=y=>{const N=y.target.value;m(N),n?.(y),v.current!==""&&N===""&&!y.nativeEvent.inputType&&setTimeout(()=>{const M=A.current?.querySelector("form");M&&M.requestSubmit()},0),v.current=N},I=y=>{m(y.text);const N={target:{value:y.text,name:e}};n?.(N),l?.(y),x(!1)},C=y=>{y.preventDefault(),o?.(y)};return d.jsxs(W,{ref:A,className:`relative ${h}`,style:c,id:i,...u,children:[d.jsx(so,{onSubmit:C,className:"relative",children:d.jsxs(W,{className:`relative flex items-center ${a?"gap-2":""}`,children:[d.jsxs(W,{className:"relative flex-1",children:[d.jsx(W,{className:"absolute left-3 top-1/2 -translate-y-1/2 pointer-events-none",children:d.jsx(de,{name:Je.Search,className:"w-5 h-5 text-gray-400 dark:text-gray-500"})}),d.jsx(xt,{type:"search",name:e,value:E,onChange:_,onFocus:()=>x(!0),onBlur:()=>setTimeout(()=>x(!1),200),placeholder:f,className:"w-full pl-10 pr-4 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white text-sm"})]}),a&&d.jsx(Q,{type:"submit",className:"px-4 py-2 bg-gray-800 dark:bg-gray-600 text-white rounded-lg hover:bg-gray-900 dark:hover:bg-gray-500 transition-colors text-sm font-medium cursor-pointer h-[42px]",children:tc("common.search")})]})}),O&&d.jsx(W,{className:"absolute z-10 w-full mt-2 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-lg max-h-64 overflow-y-auto",children:s.map(y=>d.jsx(W,{className:"px-4 py-3 hover:bg-gray-50 dark:hover:bg-gray-700 cursor-pointer border-b border-gray-100 dark:border-gray-700 last:border-b-0 transition-colors",onClick:()=>I(y),children:d.jsxs(W,{className:"flex items-center gap-2",children:[d.jsx(de,{name:Je.Search,className:"w-4 h-4 text-gray-400 dark:text-gray-500"}),d.jsx(te,{className:"text-sm text-gray-700 dark:text-gray-300",children:y.text})]})},y.id))})]})},b0=Object.freeze(Object.defineProperty({__proto__:null,SearchBar:rc},Symbol.toStringTag,{value:"Module"})),vt=window.G7Core,y0={sm:"md",md:"lg",lg:"xl",xl:"2xl","2xl":"3xl"};function Ta({src:e,fallbackText:t="U",size:r="lg",uploadEndpoint:n="/api/me/avatar",deleteEndpoint:o="/api/me/avatar",onUploadSuccess:a,onUploadError:s,onDeleteSuccess:l,onDeleteError:g,showDeleteButton:h=!0,accept:c="image/*",maxSize:i=5,className:u="",uploadButtonText:f,deleteButtonText:p,readOnly:m=!1,confirmDelete:w=!0,deleteConfirmMessage:x,confirmUpload:A=!0,uploadConfirmMessage:v,uploadSuccessActions:E,uploadErrorActions:O,deleteSuccessActions:_,deleteErrorActions:I,id:C,editorAttrs:y}){const N=k.useRef(null),[M,P]=k.useState(!1),[D,L]=k.useState(!1),[$,S]=k.useState(void 0),[b,U]=k.useState(null),[F,G]=k.useState(!1),[Y,B]=k.useState(!1),[V,j]=k.useState(null),[H,q]=k.useState(null),ue=k.useRef(`avatar-upload-${Math.random().toString(36).slice(2,11)}`).current;k.useEffect(()=>{if(V){const oe=URL.createObjectURL(V);return q(oe),()=>URL.revokeObjectURL(oe)}else q(null)},[V]);const ee=k.useCallback(oe=>vt?.t?.(oe)??oe,[]),fe=k.useCallback(()=>{const oe=document.cookie.match(/XSRF-TOKEN=([^;]+)/);return oe?decodeURIComponent(oe[1]):null},[]),R=k.useCallback(()=>vt?.api?.getToken?.()??null,[]),ke=k.useCallback(async oe=>{B(!1),j(null),P(!0),U(null);try{const ae=new FormData;ae.append("avatar",oe);const be=fe(),xe=R(),He=await fetch(n,{method:"POST",headers:{Accept:"application/json",...be&&{"X-XSRF-TOKEN":be},...xe&&{Authorization:`Bearer ${xe}`}},credentials:"include",body:ae});if(!He.ok){const Oe=await He.json().catch(()=>({}));throw new Error(Oe.message||ee("attachment.upload_failed"))}const Pe=await He.json(),Ke=Pe.data||Pe;Ke.avatar&&S(Ke.avatar),a?.(Ke),vt?.toast?.success?.(ee("mypage.profile.avatar_uploaded")),E?.length?E.forEach(Oe=>vt?.dispatch?.(Oe)):vt?.refetchDataSource?.("user")}catch(ae){const be=ae instanceof Error?ae:new Error(String(ae));U(be.message),s?.(be),vt?.toast?.error?.(be.message),O?.length&&O.forEach(xe=>vt?.dispatch?.(xe))}finally{P(!1),N.current&&(N.current.value="")}},[n,a,s,fe,R,ee]),me=k.useCallback(async oe=>{const ae=oe.target.files?.[0];if(!ae)return;U(null);const be=i*1024*1024;if(ae.size>be){const xe=new Error(ee("attachment.file_too_large").replace(":max",`${i}MB`));U(xe.message),s?.(xe),vt?.toast?.error?.(xe.message);return}if(c&&!ae.type.match(c.replace("*",".*"))){const xe=new Error(ee("attachment.invalid_file_type"));U(xe.message),s?.(xe),vt?.toast?.error?.(xe.message);return}A?(j(ae),B(!0)):ke(ae)},[i,c,s,A,ke,ee]),Ge=k.useCallback(async()=>{G(!1),L(!0),U(null);try{const oe=fe(),ae=R(),be=await fetch(o,{method:"DELETE",headers:{Accept:"application/json","Content-Type":"application/json",...oe&&{"X-XSRF-TOKEN":oe},...ae&&{Authorization:`Bearer ${ae}`}},credentials:"include"});if(!be.ok){const xe=await be.json().catch(()=>({}));throw new Error(xe.message||ee("attachment.delete_failed"))}S(null),l?.(),vt?.toast?.success?.(ee("mypage.profile.avatar_deleted")),_?.length?_.forEach(xe=>vt?.dispatch?.(xe)):vt?.refetchDataSource?.("user")}catch(oe){const ae=oe instanceof Error?oe:new Error(String(oe));U(ae.message),g?.(ae),vt?.toast?.error?.(ae.message),I?.length&&I.forEach(be=>vt?.dispatch?.(be))}finally{L(!1)}},[o,l,g,fe,R,ee]),De=k.useCallback(()=>{w?G(!0):Ge()},[w,Ge]),ye=k.useCallback(()=>{G(!1)},[]),Me=k.useCallback(()=>{B(!1),j(null),N.current&&(N.current.value="")},[]),Ce=k.useCallback(()=>{V&&ke(V)},[V,ke]),we=$===void 0?e:$,Ue=!!we,Le=y0[r]||"lg",K=F||Y,re=()=>d.jsxs(W,{className:"flex items-center justify-center gap-2",children:[d.jsx(xt,{ref:N,id:ue,type:"file",accept:c,className:"hidden",onChange:me,disabled:M}),!Ue&&d.jsxs(yr,{htmlFor:ue,className:`inline-flex items-center gap-2 px-4 py-2 border border-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-300 rounded-lg text-sm font-medium hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors cursor-pointer ${M?"opacity-50 cursor-not-allowed":""}`,children:[M?d.jsx(de,{name:"spinner",size:"sm",className:"animate-spin"}):d.jsx(de,{name:"image",size:"sm"}),d.jsx(te,{children:f||ee("mypage.profile.register_avatar")})]}),Ue&&d.jsxs(d.Fragment,{children:[d.jsxs(yr,{htmlFor:ue,className:`inline-flex items-center gap-2 px-4 py-2 border border-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-300 rounded-lg text-sm font-medium hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors cursor-pointer ${M?"opacity-50 cursor-not-allowed":""}`,children:[M?d.jsx(de,{name:"spinner",size:"sm",className:"animate-spin"}):d.jsx(de,{name:"upload",size:"sm"}),d.jsx(te,{children:f||ee("common.change")})]}),h&&d.jsxs(Q,{type:"button",className:"inline-flex items-center gap-2 px-4 py-2 border border-red-300 dark:border-red-600 text-red-600 dark:text-red-400 rounded-lg text-sm font-medium hover:bg-red-50 dark:hover:bg-red-900/20 transition-colors disabled:opacity-50 disabled:cursor-not-allowed",onClick:De,disabled:D,children:[D?d.jsx(de,{name:"spinner",size:"sm",className:"animate-spin"}):d.jsx(de,{name:"trash-2",size:"sm"}),d.jsx(te,{children:p||ee("common.delete")})]})]})]});return d.jsxs(W,{className:`flex flex-col items-center gap-3 ${u}`,id:C,...y,children:[Y&&H?d.jsxs(W,{className:"relative",children:[d.jsx(Lt,{src:H,alt:"Preview",className:`rounded-full object-cover ${r==="sm"?"w-10 h-10":r==="md"?"w-12 h-12":r==="lg"?"w-16 h-16":r==="xl"?"w-24 h-24":"w-32 h-32"}`}),d.jsx(W,{className:"absolute inset-0 rounded-full bg-blue-500/20 border-2 border-blue-500 border-dashed"})]}):d.jsx($r,{avatar:we||void 0,name:t,size:Le}),!m&&d.jsxs(W,{className:"w-[220px] flex flex-col items-center gap-2",children:[Y&&V&&d.jsxs(W,{className:"w-full p-3 bg-blue-50 dark:bg-blue-950/50 border border-blue-200 dark:border-blue-800 rounded-lg",children:[d.jsxs(W,{className:"flex items-center gap-2 mb-2",children:[d.jsx(de,{name:"upload",size:"sm",className:"text-blue-600 dark:text-blue-400 shrink-0"}),d.jsx(te,{className:"text-sm font-medium text-blue-800 dark:text-blue-300",children:v||ee("mypage.profile.upload_avatar_confirm")})]}),d.jsxs(W,{className:"text-xs text-blue-600 dark:text-blue-400 truncate mb-3",title:V.name,children:[V.name," (",(V.size/1024/1024).toFixed(2),"MB)"]}),d.jsxs(W,{className:"grid grid-cols-2 gap-2",children:[d.jsxs(Q,{type:"button",className:"inline-flex items-center justify-center gap-1.5 px-3 py-2 bg-blue-600 hover:bg-blue-700 text-white rounded-md text-sm font-medium transition-colors disabled:opacity-50",onClick:Ce,disabled:M,children:[M?d.jsx(de,{name:"spinner",size:"sm",className:"animate-spin"}):d.jsx(de,{name:"check",size:"sm"}),d.jsx(te,{children:ee("common.confirm")})]}),d.jsx(Q,{type:"button",className:"inline-flex items-center justify-center gap-1.5 px-3 py-2 bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-300 rounded-md text-sm font-medium hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors",onClick:Me,children:d.jsx(te,{children:ee("common.cancel")})})]})]}),F&&d.jsxs(W,{className:"w-full p-3 bg-red-50 dark:bg-red-950/50 border border-red-200 dark:border-red-800 rounded-lg",children:[d.jsxs(W,{className:"flex items-center gap-2 mb-2",children:[d.jsx(de,{name:"alert-triangle",size:"sm",className:"text-red-600 dark:text-red-400 shrink-0"}),d.jsx(te,{className:"text-sm font-medium text-red-800 dark:text-red-300",children:x||ee("mypage.profile.delete_avatar_confirm")})]}),d.jsxs(W,{className:"grid grid-cols-2 gap-2",children:[d.jsxs(Q,{type:"button",className:"inline-flex items-center justify-center gap-1.5 px-3 py-2 bg-red-600 hover:bg-red-700 text-white rounded-md text-sm font-medium transition-colors disabled:opacity-50",onClick:Ge,disabled:D,children:[D?d.jsx(de,{name:"spinner",size:"sm",className:"animate-spin"}):d.jsx(de,{name:"trash-2",size:"sm"}),d.jsx(te,{children:ee("common.delete")})]}),d.jsx(Q,{type:"button",className:"inline-flex items-center justify-center gap-1.5 px-3 py-2 bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-300 rounded-md text-sm font-medium hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors",onClick:ye,children:d.jsx(te,{children:ee("common.cancel")})})]})]}),!K&&re()]}),b&&!K&&d.jsxs(W,{className:"flex items-center gap-2 text-sm text-red-600 dark:text-red-400",children:[d.jsx(de,{name:"alert-circle",size:"sm"}),d.jsx(te,{children:b})]})]})}const v0=Object.freeze(Object.defineProperty({__proto__:null,AvatarUploader:Ta,default:Ta},Symbol.toStringTag,{value:"Module"})),nc=()=>window.G7Core,Zn=(e,t)=>window.G7Core?.t?.(e,t)??e,oc={horizontal:"flex items-center gap-1.5",vertical:"flex flex-col items-start"},w0=()=>[{key:"view_profile",label:Zn("userinfo.view_profile"),icon:"user",path:"/users/{{userId}}"},{key:"view_posts",label:Zn("userinfo.view_posts"),icon:"file-lines",path:"/users/{{userId}}/posts"}],Na=({text:e,title:t})=>e?d.jsx(te,{className:"text-sm text-gray-500 dark:text-gray-400",title:t,children:e}):null,ac=({author:e,name:t,userId:r,subText:n,subTextTitle:o,isGuest:a=!1,isWithdrawn:s=!1,showDropdown:l=!0,clickable:g=!0,profilePath:h="/users/{userId}",className:c="",layout:i="vertical",text:u,stopPropagation:f=!1,menuItems:p,hideMenuItems:m=[],appendMenuItems:w=[],id:x,editorAttrs:A})=>{const v=r??e?.uuid,E=a||e?.is_guest||!1,O=s||e?.status==="withdrawn",_=O?Zn("userinfo.withdrawn_user"):u??t??e?.name??"",[I,C]=k.useState(!1),[y,N]=k.useState({top:0,left:0}),M=k.useRef(null),P=k.useRef(null),D=k.useRef(null),L=h.replace("{userId}",String(v??"")),$=`${oc[i]} ${c}`;k.useEffect(()=>{if(!I)return;const j=q=>{const ue=q.target,ee=M.current?.contains(ue),fe=P.current?.contains(ue);!ee&&!fe&&C(!1)},H=()=>C(!1);return document.addEventListener("mousedown",j),window.addEventListener("scroll",H,!0),window.addEventListener("resize",H),()=>{document.removeEventListener("mousedown",j),window.removeEventListener("scroll",H,!0),window.removeEventListener("resize",H)}},[I]);const S=k.useCallback(()=>{if(p&&p.length>0)return p.filter(q=>q.show!==!1);let H=w0().filter(q=>!m.includes(q.key)&&q.show!==!1);return w&&w.length>0&&(H=[...H,...w.filter(q=>q.show!==!1)]),H},[p,m,w]),b=k.useCallback(()=>{if(D.current){const j=D.current.getBoundingClientRect();N({top:j.bottom+4,left:j.left})}},[]),U=k.useCallback((j,H)=>{if(H.stopPropagation(),H.preventDefault(),C(!1),j.onClick)j.onClick();else if(j.path){const q=j.path.replace(/\{\{userId\}\}/g,String(v??"")),ue=nc();ue?.navigate?ue.navigate(q):window.location.href=q}},[v]),F=k.useCallback(j=>{j.preventDefault(),f&&j.stopPropagation(),!(E||!v)&&(l?(I||b(),C(H=>!H)):g&&nc()?.navigate?.(L))},[f,E,v,l,I,b,g,L]);if(E||!v)return d.jsxs(W,{className:$,id:x,...A,children:[d.jsxs(W,{className:"flex items-center gap-1.5 text-gray-400 dark:text-gray-500",children:[d.jsx(te,{children:_}),d.jsx(te,{className:"text-xs px-1.5 py-0.5 bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-300 rounded",children:Zn("userinfo.guest_badge")})]}),d.jsx(Na,{text:n,title:o})]});if(O)return d.jsxs(W,{className:$,id:x,...A,children:[d.jsx(te,{className:"text-gray-400 dark:text-gray-500 line-through",children:_}),d.jsx(Na,{text:n,title:o})]});const G=S(),B=/\btext-\S+/.test(c)?"":"text-gray-900 dark:text-white",V=l||g?`${B} hover:text-blue-600 dark:hover:text-blue-400 cursor-pointer font-medium`.trim():`${B} font-medium`.trim();return d.jsxs(W,{ref:M,className:`relative inline-block ${c}`,id:x,...A,children:[d.jsxs(W,{className:oc[i],children:[d.jsx(Q,{ref:D,onClick:F,className:V,children:_}),d.jsx(Na,{text:n,title:o})]}),l&&I&&G.length>0&&Jt.createPortal(d.jsx(W,{ref:P,className:"fixed w-40 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-lg py-1 z-[9999]",style:{top:y.top,left:y.left},"data-testid":"author-dropdown-menu",children:G.map(j=>d.jsxs(Q,{onClick:H=>U(j,H),className:"flex items-center justify-start gap-2 w-full text-left px-3 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 cursor-pointer","data-testid":`menu-item-${j.key}`,children:[j.icon&&d.jsx(de,{name:j.icon,className:"w-4 h-4"}),d.jsx(te,{children:j.label})]},j.key))}),document.body)]})},x0=Object.freeze(Object.defineProperty({__proto__:null,UserInfo:ac},Symbol.toStringTag,{value:"Module"})),sc=({tabs:e,activeTabId:t,onTabChange:r,variant:n="underline",className:o="",style:a,hiddenTabIds:s=[],mobileBreakpoint:l=768,id:g,editorAttrs:h})=>{const i=window.G7Core?.useResponsive,u=i?.(),f=u?u.width{!v.disabled&&v.id!==t&&r?.(v.id)},m=v=>{const E=v.target.value,O=Number(E),_=typeof E=="string"&&E!==""&&!Number.isNaN(O)?O:E,I=e.find(C=>String(C.id)===String(_));I&&p(I)},w=s.length>0?e.filter(v=>!s.includes(v.id)):e;if(f)return d.jsx(W,{className:`relative ${o}`,style:a,id:g,...h,children:d.jsx(Va,{value:t!==void 0?String(t):"",onChange:m,options:w.map(v=>({value:String(v.id),label:v.badge!==void 0?`${v.label} (${v.badge})`:v.label,disabled:v.disabled})),className:"w-full"})});const x=v=>{const E=v.id===t,O="flex items-center gap-2 px-3 py-2 font-medium text-sm transition-all shrink-0 whitespace-nowrap";if(v.disabled)return`${O} opacity-50 cursor-not-allowed text-gray-400 dark:text-gray-600`;switch(n){case"pills":return E?`${O} bg-blue-600 dark:bg-blue-500 text-white rounded-lg`:`${O} text-gray-600 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg`;case"underline":return E?`${O} text-gray-900 dark:text-white border-b-2 border-gray-900 dark:border-white`:`${O} text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-200 border-b-2 border-transparent hover:border-gray-300 dark:hover:border-gray-600`;default:return E?`${O} text-blue-600 dark:text-blue-400 bg-blue-50 dark:bg-blue-900/20 border-b-2 border-blue-600 dark:border-blue-400`:`${O} text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-200 hover:bg-gray-50 dark:hover:bg-gray-700 border-b-2 border-transparent`}},A=n==="underline"?"flex gap-0 border-b border-gray-200 dark:border-gray-700":"flex gap-2";return d.jsx(W,{className:`relative ${o}`,style:a,id:g,...h,children:d.jsx(Ur,{className:A,children:w.map(v=>d.jsxs(Q,{type:"button",onClick:()=>p(v),disabled:v.disabled,className:x(v),children:[v.iconName&&d.jsx(de,{name:v.iconName,size:"sm"}),d.jsx(te,{children:v.label}),v.badge!==void 0&&d.jsx(W,{className:"flex items-center justify-center min-w-5 h-5 px-1.5 bg-red-500 text-white text-xs font-bold rounded-full",children:d.jsx(te,{children:v.badge})})]},v.id))})})},k0=Object.freeze(Object.defineProperty({__proto__:null,TabNavigation:sc},Symbol.toStringTag,{value:"Module"})),C0={Header:()=>Promise.resolve().then(()=>rd),Footer:()=>Promise.resolve().then(()=>sd),MobileNav:()=>Promise.resolve().then(()=>ld),SlotContainer:()=>Promise.resolve().then(()=>ed),NotificationCenter:()=>Promise.resolve().then(()=>td),ProductCard:()=>Promise.resolve().then(()=>Id),ImageGallery:()=>Promise.resolve().then(()=>Nl),ProductImageViewer:()=>Promise.resolve().then(()=>$f),QuantitySelector:()=>Promise.resolve().then(()=>zf),PostReactions:()=>Promise.resolve().then(()=>jf),RichTextEditor:()=>Promise.resolve().then(()=>Bf),HtmlContent:()=>Promise.resolve().then(()=>Wf),HtmlEditor:()=>Promise.resolve().then(()=>Kf),ExpandableContent:()=>Promise.resolve().then(()=>Vf),FileUploader:()=>Promise.resolve().then(()=>Wh),ConfirmDialog:()=>Promise.resolve().then(()=>qf),SocialLoginButtons:()=>Promise.resolve().then(()=>Vh),Toast:()=>Promise.resolve().then(()=>Qh),PageTransitionIndicator:()=>Promise.resolve().then(()=>Rh),PageTransitionBlur:()=>Promise.resolve().then(()=>e0),PageSkeleton:()=>Promise.resolve().then(()=>g0),PageLoading:()=>Promise.resolve().then(()=>p0),ThemeToggle:()=>Promise.resolve().then(()=>qc),Pagination:()=>Promise.resolve().then(()=>m0),SearchBar:()=>Promise.resolve().then(()=>b0),Avatar:()=>Promise.resolve().then(()=>Jc),AvatarUploader:()=>Promise.resolve().then(()=>v0),UserInfo:()=>Promise.resolve().then(()=>x0),Modal:()=>Promise.resolve().then(()=>Xf),TabNavigation:()=>Promise.resolve().then(()=>k0)},S0=({id:e,className:t,style:r,children:n,editorAttrs:o})=>d.jsx(W,{id:e,className:t,style:r,...o,children:n}),_0=({id:e,children:t,cols:r=1,responsive:n,gap:o,rowGap:a,colGap:s,autoRows:l,autoCols:g,flow:h="row",className:c="",style:i,onClick:u,editorAttrs:f})=>{const p=["grid"];if(r&&p.push(`grid-cols-${r}`),n&&(n.sm&&p.push(`sm:grid-cols-${n.sm}`),n.md&&p.push(`md:grid-cols-${n.md}`),n.lg&&p.push(`lg:grid-cols-${n.lg}`),n.xl&&p.push(`xl:grid-cols-${n.xl}`),n["2xl"]&&p.push(`2xl:grid-cols-${n["2xl"]}`)),o!==void 0&&o>0&&p.push(`gap-${o}`),a!==void 0&&a>0&&p.push(`gap-y-${a}`),s!==void 0&&s>0&&p.push(`gap-x-${s}`),l){const w={auto:"auto-rows-auto",min:"auto-rows-min",max:"auto-rows-max",fr:"auto-rows-fr"};p.push(w[l])}if(g){const w={auto:"auto-cols-auto",min:"auto-cols-min",max:"auto-cols-max",fr:"auto-cols-fr"};p.push(w[g])}const m={row:"grid-flow-row",col:"grid-flow-col",dense:"grid-flow-dense","row-dense":"grid-flow-row-dense","col-dense":"grid-flow-col-dense"};return p.push(m[h]),c&&p.push(c),d.jsx(W,{id:e,className:p.join(" "),style:i,onClick:u,...f,children:t})},E0=({id:e,children:t,direction:r="row",justify:n="start",align:o="stretch",wrap:a="nowrap",gap:s=0,grow:l=!1,shrink:g=!0,className:h="",style:c,onClick:i,editorAttrs:u})=>{const f=["flex"],p={row:"flex-row","row-reverse":"flex-row-reverse",col:"flex-col","col-reverse":"flex-col-reverse"};f.push(p[r]);const m={wrap:"flex-wrap",nowrap:"flex-nowrap","wrap-reverse":"flex-wrap-reverse"};f.push(m[a]);const w={start:"justify-start",end:"justify-end",center:"justify-center",between:"justify-between",around:"justify-around",evenly:"justify-evenly"};f.push(w[n]);const x={start:"items-start",end:"items-end",center:"items-center",baseline:"items-baseline",stretch:"items-stretch"};return f.push(x[o]),s>0&&f.push(`gap-${s}`),l===!0?f.push("flex-grow"):typeof l=="number"&&l>0&&f.push(`flex-grow-${l}`),g===!1?f.push("shrink-0"):g===!0?f.push("flex-shrink"):typeof g=="number"&&g>0&&f.push(`flex-shrink-${g}`),h&&f.push(h),d.jsx(W,{id:e,className:f.join(" "),style:c,onClick:i,...u,children:t})},T0=({id:e,title:t,subtitle:r,children:n,padding:o="md",background:a="none",maxWidth:s,centered:l=!1,border:g=!1,shadow:h="none",rounded:c=!1,className:i="",style:u,onClick:f,editorAttrs:p})=>{const m=[],w={none:"p-0",sm:"p-2",md:"p-4",lg:"p-6",xl:"p-8"};m.push(w[o]);const x={none:"",white:"bg-white dark:bg-gray-700",gray:"bg-gray-50 dark:bg-gray-800",primary:"bg-blue-50 dark:bg-blue-900/20",secondary:"bg-gray-50 dark:bg-gray-800"};if(a!=="none"&&m.push(x[a]),s){const v={sm:"max-w-sm",md:"max-w-md",lg:"max-w-lg",xl:"max-w-xl","2xl":"max-w-2xl","4xl":"max-w-4xl","6xl":"max-w-6xl","7xl":"max-w-7xl",full:"max-w-full"};m.push(v[s])}l&&m.push("mx-auto"),g&&m.push("border","border-gray-200","dark:border-gray-700");const A={none:"",sm:"shadow-sm",md:"shadow-md",lg:"shadow-lg",xl:"shadow-xl"};return h!=="none"&&m.push(A[h]),c&&m.push("rounded-lg"),i&&m.push(i),d.jsxs(Xa,{id:e,className:m.join(" "),style:u,onClick:f,...p,children:[(t||r)&&d.jsxs(W,{className:"mb-4",children:[t&&d.jsx(Wa,{className:"text-2xl font-bold text-gray-900 dark:text-white",children:t}),r&&d.jsx(Dt,{className:"mt-1 text-sm text-gray-600 dark:text-gray-400",children:r})]}),n]})},N0=({id:e,leftWidth:t="250px",rightWidth:r="300px",leftSlot:n,centerSlot:o,rightSlot:a,className:s="",style:l,editorAttrs:g})=>{const h=`flex flex-row w-full h-full ${s}`.trim(),c={width:t,flexShrink:0},i={flex:1,minWidth:0},u={width:r,flexShrink:0};return d.jsxs(W,{id:e,className:h,style:l,...g,children:[d.jsx(W,{className:"flex flex-col",style:c,children:n}),d.jsx(W,{className:"flex flex-col",style:i,children:o}),d.jsx(W,{className:"flex flex-col",style:u,children:a})]})},A0={identifier:"sirsoft-basic",vendor:"sirsoft",name:{ko:"Basic",en:"Basic"},version:"1.0.1",license:"MIT",description:{ko:"그누보드7 기본 사용자 템플릿",en:"Gnuboard7 default user template"},type:"user",locales:["ko","en"],author:{name:"sirsoft",email:"contact@sirsoft.com",url:"https://sirsoft.com"},release_date:"2026-01-07",g7_version:">=7.0.0",dependencies:{modules:{"sirsoft-board":">=1.0.0","sirsoft-ecommerce":">=1.0.0","sirsoft-page":">=1.0.0"},plugins:{"sirsoft-daum_postcode":">=1.0.0"}},assets:{css:["dist/css/components.css"],js:["dist/js/components.iife.js"],fonts:[],images:[]},components:{basic:["a","button","checkbox","div","form","h1","h2","h3","h4","hr","icon","img","input","label","li","nav","p","section","select","span","svg","table","tbody","td","textarea","th","thead","tr","ul"],composite:["header","footer","mobile-nav","product-card","rich-text-editor","image-gallery","quantity-selector","post-reactions","social-login-buttons","file-uploader","card","modal","toast","pagination","stat-card","status-badge","tab-navigation","empty-state","loading-spinner","breadcrumb","search-bar","dropdown"],layout:["container","flex","grid","section"]},preview:{thumbnail:"preview/thumbnail.png",screenshots:["preview/screenshot1.png","preview/screenshot2.png"]},error_config:{layouts:{401:"errors/401",403:"errors/403",404:"errors/404",500:"errors/500",503:"errors/503",maintenance:"errors/maintenance"}},features:{dark_mode:!0,responsive:!0,multi_language:!0,multi_currency:!0},github_url:"https://github.com/gnuboard/g7-template-sirsoft-basic",github_changelog_url:"https://github.com/gnuboard/g7-template-sirsoft-basic/blob/main/CHANGELOG.md",externals:[{id:"fontawesome",type:"style",url:"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css",preconnect:"https://cdnjs.cloudflare.com"},{id:"pretendard",type:"webfont",url:"https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css",preconnect:"https://cdn.jsdelivr.net",crossorigin:"anonymous"}]},lc={KRW:{locale:"ko-KR",decimals:0},USD:{locale:"en-US",decimals:2},JPY:{locale:"ja-JP",decimals:0},CNY:{locale:"zh-CN",decimals:2},EUR:{locale:"de-DE",decimals:2}};function Lr(e,t="KRW"){if(!Number.isFinite(e))return"0";const r=lc[t]||lc.KRW;try{return new Intl.NumberFormat(r.locale,{style:"currency",currency:t,minimumFractionDigits:r.decimals,maximumFractionDigits:r.decimals}).format(e)}catch{return e.toLocaleString()+(t==="KRW"?"원":"")}}function Qn(e,t,r=0){if(!e)return;const n=e.KRW?.value??e.KRW?.price??0,o={};for(const[a,s]of Object.entries(e)){const l=s?.value??s?.price??0;let g=0;r>0&&(a==="KRW"?g=r:n>0&&(g=r*l/n));const h=(l+g)*t;o[a]={value:h,formatted:Lr(h,a)}}return o}function Jn(e){const t={};for(const n of e){const o=n?.multiCurrencyTotalPrice;if(o)for(const[a,s]of Object.entries(o)){const l=s?.value??s?.price??0;t[a]=(t[a]??0)+l}}const r={};for(const[n,o]of Object.entries(t))r[n]={value:o,formatted:Lr(o,n)};return r}function ic(e,t){if(!e||!t?.length)return 0;let r=0;for(const n of t){const o=e[n.id];if(o==null)continue;const a=n.values?.find(s=>s.id===Number(o));a&&(r+=a.price_adjustment??0)}return r}function Rn(e){return e.name_localized?e.name_localized:typeof e.name=="string"?e.name:e.name?.ko??""}function M0(e,t,r){if(t&&r in t)return t[r];if(Array.isArray(e)){const n=e.find(o=>typeof o.key=="string"?o.key===r:o.key?.ko===r||Object.values(o.key).includes(r));return n?typeof n.value=="string"?n.value:n.value?.ko??Object.values(n.value)[0]:void 0}return e[r]}function O0(e,t){if(t)return t;if(!Array.isArray(e))return e;const r={};for(const n of e){const o=typeof n.key=="string"?n.key:n.key?.ko??Object.values(n.key)[0]??"",a=typeof n.value=="string"?n.value:n.value?.ko??Object.values(n.value)[0]??"";o&&(r[o]=a)}return r}function I0(e,t,r){return r.find(n=>!n?.option_values||!n?.is_active?!1:e.every(o=>{const a=Rn(o),s=t?.[a];return M0(n.option_values,n.option_values_localized,a)===s}))}function D0(e,t){const r=e.params;if(!r)return;const{optionGroups:n,options:o,selectedOptionItems:a,preferredCurrency:s}=r;let l;if(r.newGroupName&&r.newValue?l={...r.currentSelection??{},[r.newGroupName]:r.newValue}:l=r.currentSelection??{},!n?.every(O=>{const _=Rn(O);return l?.[_]}))return;const h=I0(n,l,o??[]);if(!h){t.setState?.({currentSelection:{},__mergeMode:"shallow"});return}const c=n.map(O=>l[Rn(O)]).join("_"),i=a??[];if(i.find(O=>O.id===c)){const O=window.G7Core;O?.toast?.warning?.(O?.t?.("sirsoft-ecommerce.shop.already_added_option")??"이미 추가된 옵션입니다."),t.setState?.({currentSelection:{},__mergeMode:"shallow"});return}const f=h.selling_price??0,p={};n.forEach(O=>{const _=Rn(O);p[_]=l[_]});const m=r.additionalOptionGroups??[],w={};for(const O of m){if(!O.is_required)continue;const _=O.values?.find(I=>I.is_default);_&&(w[O.id]=_.id)}const x=ic(w,m),A=f+x,v={id:c,optionId:h.id,options:p,optionValues:O0(h.option_values,h.option_values_localized),quantity:1,stock:h.stock_quantity??999,unitPrice:f,unitPriceFormatted:Lr(f,s),totalPrice:A,totalPriceFormatted:Lr(A,s),multiCurrencyUnitPrice:h.multi_currency_selling_price,multiCurrencyTotalPrice:Qn(h.multi_currency_selling_price,1,x),additionalOptionSelections:w,additionalOptionsTotal:x},E=[...i,v];t.setState?.({selectedOptionItems:E,selectedTotalMultiCurrency:Jn(E),currentSelection:{},__mergeMode:"shallow"})}function L0(e,t){const r=e.params;if(!r)return;const{selectedOptionItems:n,preferredCurrency:o}=r,a=Number(r.itemIndex)||0,s=Number(r.newQuantity)||1,l=(n??[]).map((g,h)=>{if(h!==a)return g;const c=g?.unitPrice??0,i=g?.additionalOptionsTotal??0,u=(c+i)*s;return{...g,quantity:s,totalPrice:u,totalPriceFormatted:Lr(u,o),multiCurrencyTotalPrice:Qn(g?.multiCurrencyUnitPrice,s,i)}});t.setState?.({selectedOptionItems:l,selectedTotalMultiCurrency:Jn(l)})}function P0(e,t){const r=e.params;if(!r)return;const{selectedOptionItems:n,additionalOptionGroups:o,preferredCurrency:a}=r,s=Number(r.itemIndex)||0,l=Number(r.additionalOptionId),g=Object.prototype.hasOwnProperty.call(r,"customText"),h=r.valueId===""||r.valueId==null?null:Number(r.valueId),c=(n??[]).map((i,u)=>{if(u!==s)return i;const f={...i.additionalOptionSelections??{}},p={...i.additionalOptionCustomTexts??{}};if(g){const v=String(r.customText??"");v.trim()===""?delete p[l]:p[l]=v}else h==null?(delete f[l],delete p[l]):(f[l]=h,(o??[]).find(O=>O.id===l)?.values?.find(O=>O.id===h)?.allow_custom_text||delete p[l]);const m=ic(f,o),w=i?.unitPrice??0,x=i?.quantity??1,A=(w+m)*x;return{...i,additionalOptionSelections:f,additionalOptionCustomTexts:p,additionalOptionsTotal:m,totalPrice:A,totalPriceFormatted:Lr(A,a),multiCurrencyTotalPrice:Qn(i?.multiCurrencyUnitPrice,x,m)}});t.setState?.({selectedOptionItems:c,selectedTotalMultiCurrency:Jn(c)})}function F0(e,t){const r=e.params;if(!r)return;const n=Number(r.itemIndex)||0,o=(r.selectedOptionItems??[]).filter((a,s)=>s!==n);t.setState?.({selectedOptionItems:o,selectedTotalMultiCurrency:Jn(o)})}function U0(e,t){const r=e.params;if(!r)return;const n=Math.max(1,Number(r.newQuantity)||1);t.setState?.({noOptionQuantity:n,noOptionTotalMultiCurrency:Qn(r.multiCurrencyUnitPrice,n)})}const cn=window.G7Core?.createLogger?.("Handler:Cart")??{log:(...e)=>console.log("[Handler:Cart]",...e),warn:(...e)=>console.warn("[Handler:Cart]",...e),error:(...e)=>console.error("[Handler:Cart]",...e)};function hr(e){const t=window.G7Core;t?.state?.setLocal?(t.state.setLocal(e),cn.log("Local state updated:",e)):cn.warn("G7Core.state.setLocal not available")}function cc(){return window.G7Core?.state?.getLocal?.()||{}}function $0(){return window.G7Core?.state?.get?.()||{}}function z0(e,t="info"){const r=window.G7Core;r?.toast?.show?r.toast.show(e,t):cn.warn("G7Core.toast.show not available, message:",e)}function H0(e){const t=window.G7Core;return t?.t?t.t(e):e}function dc(){const e=window.G7Core;if(e?.dispatch){const r=cc().selectedItems||[];e.dispatch({handler:"refetchDataSource",params:{dataSourceId:"cartItems"}}),cn.log("Refetching cartItems with selected_ids:",r)}else cn.warn("G7Core.dispatch not available")}function G0(e,t){const{itemId:r,selectedItems:n}=e?.params||{},o=n||[];let a;o.includes(r)?a=o.filter(h=>h!==r):a=[...o,r];const l=$0().cartItems?.data?.items||[],g=l.length>0&&a.length===l.length;hr({selectedItems:a,allSelected:g,selectedCount:a.length}),dc()}function j0(e,t){const{allItemIds:r,isSelected:n}=e?.params||{};hr({selectedItems:n?r:[],allSelected:n,selectedCount:n?r.length:0}),dc()}function B0(e,t){const{optionName:r,optionValue:n}=e?.params||{},a=cc().selectedOptions||{};hr({selectedOptions:{...a,[r]:n}})}function W0(e,t){const{targetIds:r}=e?.params||{};if(!r||r.length===0){z0(H0("shop.cart.select_items_to_delete"),"warning");return}hr({deleteModal:{visible:!0,targetIds:r}})}function K0(e,t){const{targetItem:r}=e?.params||{};hr({optionModal:{visible:!0,targetItem:r},selectedOptions:r?.options||{},selectedQuantity:r?.quantity})}function V0(e,t){const{selectedItems:r}=e?.params||{};if(!r||r.length===0){hr({isCalculating:!1});return}hr({isCalculating:!0})}const pr=window.G7Core?.createLogger?.("Handler:CartOptionChange")??{log:(...e)=>console.log("[Handler:CartOptionChange]",...e),warn:(...e)=>console.warn("[Handler:CartOptionChange]",...e),error:(...e)=>console.error("[Handler:CartOptionChange]",...e)};function Aa(e){return e.name_localized?e.name_localized:typeof e.name=="string"?e.name:e.name?.ko??""}function Y0(e,t,r){if(t&&r in t)return t[r];if(Array.isArray(e)){const n=e.find(o=>typeof o.key=="string"?o.key===r:o.key?.ko===r||Object.values(o.key).includes(r));return n?typeof n.value=="string"?n.value:n.value?.ko??Object.values(n.value)[0]:void 0}return e[r]}function uc(e,t,r){return!e||!t?.length?null:t.every(a=>{const s=Aa(a);return e[s]})?r?.find(a=>t.every(s=>{const l=Aa(s);return Y0(a.option_values,a.option_values_localized,l)===e[l]}))||null:(pr.log("Not all options selected yet"),null)}function X0(e,t){const{selectedOptions:r,optionGroups:n,options:o}=e?.params||{};pr.log("findMatchingOption called:",{selectedOptions:r,optionGroups:n,optionsCount:o?.length});const a=uc(r,n,o);return pr.log("Matched option:",a),{matchedOption:a}}function q0(e,t){const{currentOptionValues:r,optionGroups:n,options:o}=e?.params||{};if(pr.log("initCartOptionSelection called:",{currentOptionValues:r,optionGroups:n,optionsCount:o?.length}),!n?.length||!r)return pr.log("No option groups or current values, returning empty"),{selectedOptions:{},matchedOption:null};const a={};for(const l of n){const g=Aa(l),h=r[g],c=l.values_localized??(Array.isArray(l.values)?l.values.map(i=>typeof i=="string"?i:i?.ko??""):[]);h&&c.includes(h)&&(a[g]=h)}pr.log("Initial selectedOptions:",a);const s=uc(a,n,o||[]);return pr.log("Matched option:",s),{selectedOptions:a,matchedOption:s}}const dn="g7_cart_key",Z0="/api/modules/sirsoft-ecommerce/cart/key",Ma="g7_guest_order_token",fc="g7_guest_order_number",Oa="g7_guest_order_expires_at",at=window.G7Core?.createLogger?.("Handler:Storage")??{log:(...e)=>console.log("[Handler:Storage]",...e),warn:(...e)=>console.warn("[Handler:Storage]",...e),error:(...e)=>console.error("[Handler:Storage]",...e)};async function gc(){try{const e=await fetch(Z0,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"}});return e.ok?(await e.json()).data?.cart_key||null:(at.error("Failed to issue cartKey from API:",e.status),null)}catch(e){return at.error("Error issuing cartKey from API:",e),null}}function rr(e){const t=window.G7Core;t?.state?.set?(t.state.set(e),at.log("Global state updated:",e)):at.warn("G7Core.state.set not available")}function Q0(){try{const e=window.G7Config;return e?.user?e.user:(window.G7Core?.state?.get?.()||{}).currentUser||null}catch{return null}}async function J0(e,t){let r=null;try{r=localStorage.getItem(dn)}catch{}if(r)at.log("Existing cartKey loaded:",r);else if(r=await gc(),r)try{localStorage.setItem(dn,r),at.log("New cartKey issued from API:",r)}catch{}else at.error("Failed to issue cartKey from API");rr({cartKey:r})}function R0(e,t){try{return localStorage.getItem(dn)}catch{return null}}function hc(e,t){try{localStorage.removeItem(dn),at.log("cartKey removed from localStorage")}catch{}rr({cartKey:null})}async function ep(e,t){if(Q0()){hc();return}const n=await gc();if(n){try{localStorage.setItem(dn,n),at.log("New cartKey regenerated from API:",n)}catch{}rr({cartKey:n})}else at.error("Failed to regenerate cartKey from API")}function tp(e,t){const{key:r,value:n}=e?.params||{};if(!r){at.warn("saveToStorage: key is required");return}try{localStorage.setItem(r,n),at.log("Saved to storage:",r,n)}catch{}}function rp(e,t){const{key:r,defaultValue:n}=e?.params||{};if(!r)return at.warn("loadFromStorage: key is required"),n||null;try{return localStorage.getItem(r)||n||null}catch{return n||null}}function Ia(){try{sessionStorage.removeItem(Ma),sessionStorage.removeItem(fc),sessionStorage.removeItem(Oa)}catch{}}function np(e,t){let r=null,n=null;try{r=sessionStorage.getItem(Ma),n=sessionStorage.getItem(Oa)}catch{}let o=!1;if(r){const a=n?new Date(n).getTime():NaN;(isNaN(a)||a<=Date.now())&&(Ia(),r=null,o=!0)}if(r){rr({guestOrderToken:r}),at.log("Guest order token loaded from sessionStorage");return}if(!o){const s=window.G7Core?.state?.get?.("_global")?.guestOrderToken;if(typeof s=="string"&&s!==""){at.log("Guest order token preserved from in-memory _global (sessionStorage empty)");return}}rr({guestOrderToken:null}),at.log("No guest order token (visitor not authenticated)")}function op(e,t){const{token:r,orderNumber:n,expiresAt:o}=e?.params||{};if(!r||!n||!o){at.warn("saveGuestOrderToken: token, orderNumber, expiresAt are required");return}try{sessionStorage.setItem(Ma,r),sessionStorage.setItem(fc,n),sessionStorage.setItem(Oa,o)}catch{}rr({guestOrderToken:r})}function ap(e,t){Ia(),rr({guestOrderToken:null})}function sp(e,t){Ia(),rr({guestOrderToken:null})}function lp(e,t){const{product:r,priceField:n,currencyCode:o}=e,a=o||t.getState("_global.preferredCurrency")||"KRW",s=`multi_currency_${n}`,l=r[s];if(l&&l[a])return l[a].formatted;const g=`${n}_formatted`;return r[g]||String(r[n])}const Da={KRW:{code:"KRW",symbol:"₩",locale:"ko-KR",decimals:0},USD:{code:"USD",symbol:"$",locale:"en-US",decimals:2},JPY:{code:"JPY",symbol:"¥",locale:"ja-JP",decimals:0},CNY:{code:"CNY",symbol:"¥",locale:"zh-CN",decimals:2},EUR:{code:"EUR",symbol:"€",locale:"de-DE",decimals:2}};function ip(e,t){const{value:r,currencyCode:n,locale:o}=e,a=n||t.getState("_global.preferredCurrency")||"KRW",s=Da[a]||Da.KRW,l=o||s.locale;try{return new Intl.NumberFormat(l,{style:"currency",currency:s.code,minimumFractionDigits:s.decimals,maximumFractionDigits:s.decimals}).format(r)}catch{const g=r.toLocaleString(void 0,{minimumFractionDigits:s.decimals,maximumFractionDigits:s.decimals});return`${s.symbol}${g}`}}function cp(e){return Da[e]?.symbol||e}const La=window.G7Core?.createLogger?.("Handler:Currency")??{log:(...e)=>console.log("[Handler:Currency]",...e),warn:(...e)=>console.warn("[Handler:Currency]",...e),error:(...e)=>console.error("[Handler:Currency]",...e)},pc="g7_preferred_currency",dp="KRW";function up(e,t){const{defaultCurrency:r=dp}=e;let n=r;try{if(typeof window<"u"&&window.localStorage){const o=localStorage.getItem(pc);o&&mc(o)&&(n=o)}}catch{La.warn("localStorage 접근 불가, 기본 통화 사용:",r)}return t.setState("global",{preferredCurrency:n}),n}function fp(e,t){const{currencyCode:r}=e;if(!mc(r)){La.warn("유효하지 않은 통화 코드:",r);return}try{typeof window<"u"&&window.localStorage&&localStorage.setItem(pc,r)}catch{La.warn("localStorage 저장 실패")}t.setState("global",{preferredCurrency:r})}function mc(e){return typeof e=="string"&&/^[A-Z]{3}$/.test(e)}const Pr=window.G7Core?.createLogger?.("Handler:SetTheme")??{log:(...e)=>console.log("[Handler:SetTheme]",...e),warn:(...e)=>console.warn("[Handler:SetTheme]",...e),error:(...e)=>console.error("[Handler:SetTheme]",...e)},Pa=["auto","light","dark"],bc="g7_color_scheme",gp=e=>e==="auto"?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":e,eo=e=>{const t=gp(e);document.documentElement.setAttribute("data-theme",t),t==="dark"?document.documentElement.classList.add("dark"):document.documentElement.classList.remove("dark")};function hp(){try{const e=localStorage.getItem(bc),t=e&&Pa.includes(e)?e:"auto";eo(t),Pr.log("Initial theme applied:",t)}catch(e){Pr.warn("Failed to load initial theme:",e),eo("auto")}}async function pp(e,t){const r=e?.target;if(r&&typeof r=="string"&&Pa.includes(r)){eo(r);return}hp()}async function mp(e,t){let r;if(e?.target&&typeof e.target=="string"&&!e.target.includes("{{")&&(r=e.target),!r||typeof r!="string"){Pr.warn("Invalid theme:",r);return}if(!Pa.includes(r)){Pr.warn("Unsupported theme:",r);return}const n=r;try{localStorage.setItem(bc,n)}catch(o){Pr.error("Failed to save theme to localStorage:",o);return}eo(n),Pr.log("Theme changed to:",n)}const bp=window.G7Core?.createLogger?.("Handler:RedirectToLoginWithReturn")??{log:(...e)=>console.log("[Handler:RedirectToLoginWithReturn]",...e),warn:(...e)=>console.warn("[Handler:RedirectToLoginWithReturn]",...e),error:(...e)=>console.error("[Handler:RedirectToLoginWithReturn]",...e)};async function yp(e,t){const r=window.G7Core;if(!r?.dispatch){bp.error("G7Core.dispatch 가 초기화되지 않아 로그인 리다이렉트를 실행할 수 없습니다.");return}const n=window.location.pathname+window.location.search;await r.dispatch({handler:"navigate",params:{path:"/login",query:{redirect:n}}})}const Fa=window.G7Core?.createLogger?.("Handler:DownloadAttachment")??{log:(...e)=>console.log("[Handler:DownloadAttachment]",...e),warn:(...e)=>console.warn("[Handler:DownloadAttachment]",...e),error:(...e)=>console.error("[Handler:DownloadAttachment]",...e)};async function vp(e,t){const r=window.G7Core,{url:n,filename:o}=e?.params||{};if(!n){Fa.warn("다운로드 URL 이 없어 요청을 건너뜁니다.");return}if(!r?.api?.get){Fa.error("G7Core.api.get 이 초기화되지 않아 다운로드를 실행할 수 없습니다.");return}try{const a=await r.api.get(n,{responseType:"blob"});if(a){const s=URL.createObjectURL(a),l=document.createElement("a");l.href=s,l.download=o||"",document.body.appendChild(l),l.click(),document.body.removeChild(l),URL.revokeObjectURL(s)}}catch(a){Fa.error("첨부파일 다운로드 실패",a),r?.toast?.error?.(r?.t?.("common.download_failed")??"Download failed")}}const to={"sirsoft-basic.addSelectedItemIfComplete":D0,"sirsoft-basic.updateSelectedItemQuantity":L0,"sirsoft-basic.removeSelectedItem":F0,"sirsoft-basic.updateNoOptionQuantity":U0,"sirsoft-basic.setBlockAdditionalOption":P0,"sirsoft-basic.getDisplayPrice":lp,"sirsoft-basic.formatCurrency":ip,"sirsoft-basic.getCurrencySymbol":cp,"sirsoft-basic.loadPreferredCurrency":up,"sirsoft-basic.savePreferredCurrency":fp,setTheme:mp,initTheme:pp,redirectToLoginWithReturn:yp,downloadAttachment:vp,toggleCartItemSelection:G0,selectAllCartItems:j0,setCartOption:B0,openCartDeleteModal:W0,openCartOptionModal:K0,recalculateCart:V0,findMatchingOption:X0,initCartOptionSelection:q0,initCartKey:J0,getCartKey:R0,clearCartKey:hc,regenerateCartKey:ep,saveToStorage:tp,loadFromStorage:rp,initGuestOrderToken:np,saveGuestOrderToken:op,clearGuestOrderToken:ap,clearGuestTokenOnEntry:sp},un=window.G7Core?.createLogger?.("Template:sirsoft-basic:IdentityLauncher")??{log:(...e)=>console.log("[Template:sirsoft-basic:IdentityLauncher]",...e),warn:(...e)=>console.warn("[Template:sirsoft-basic:IdentityLauncher]",...e),error:(...e)=>console.error("[Template:sirsoft-basic:IdentityLauncher]",...e)};function wp(e){const t=window.G7Core,r=t?.state?.getLocal?.()??{},n=t?.state?.getGlobal?.()??t?.state?.get?.()??{},o=(...g)=>g.find(h=>typeof h=="string"&&h.length>0),a=o(e.target?.email,n?.currentUser?.email,n?.user?.email,n?.auth?.user?.email,e.purpose==="signup"?r?.registerForm?.email:void 0,e.purpose==="password_reset"?r?.passwordResetForm?.email:void 0,e.purpose==="password_reset"?r?.email:void 0),s=o(e.target?.phone,n?.currentUser?.phone,n?.user?.phone,n?.auth?.user?.phone);if(!a&&!s)return null;const l={};return a&&(l.email=a),s&&(l.phone=s),l}function xp(){const t=window.G7Core?.api?.getToken?.()??null;return t?{Authorization:`Bearer ${t}`}:{}}function kp(){try{const e=typeof window<"u"?window.localStorage?.getItem("g7_locale"):null;return e?{"Accept-Language":e}:{}}catch{return{}}}async function Cp(e,t){const r={purpose:e.purpose};e.provider_id&&(r.provider_id=e.provider_id),t&&(r.target=t);const n=e.challenge_start_url||"/api/identity/challenges",o=await fetch(n,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json",Accept:"application/json",...kp(),...xp()},body:JSON.stringify(r)}),a=await o.json().catch(()=>null);if(!o.ok||!a?.success){const l=a?.message??`Challenge 시작 실패 (HTTP ${o.status})`;throw new Error(l)}const s=a.data??a;return{id:s.id,expires_at:s.expires_at,render_hint:s.render_hint??e.render_hint??"text_code",public_payload:s.public_payload,redirect_url:s.redirect_url,max_attempts:typeof s.max_attempts=="number"?s.max_attempts:void 0}}async function Sp(e){const t=window.G7Core,r=t?.identity;if(!t?.dispatch||!t?.state||!r)return un.error("G7Core 또는 G7Core.identity 가 초기화되지 않아 launcher 를 실행할 수 없습니다."),{status:"failed",failureCode:"G7_NOT_READY"};if(e.render_hint==="external_redirect"||e.redirect_url)return r.redirectExternally(e);const n=wp(e);let o;try{o=await Cp(e,n)}catch(p){un.error("Challenge 시작 실패:",p);try{await t.dispatch({handler:"toast",params:{type:"error",message:p instanceof Error?p.message:"본인인증 시작에 실패했습니다."}})}catch{}return{status:"failed",failureCode:"CHALLENGE_START_FAILED",reason:p instanceof Error?p.message:String(p)}}if(o.redirect_url)return r.redirectExternally({...e,render_hint:"external_redirect",redirect_url:o.redirect_url});const a=o.expires_at?new Date(o.expires_at).getTime():0,s=a>0?Math.max(0,Math.floor((a-Date.now())/1e3)):0,l=typeof o.max_attempts=="number"?o.max_attempts:0;t.state.set({identityChallenge:{policy_key:e.policy_key,purpose:e.purpose,provider_id:e.provider_id??null,render_hint:o.render_hint,challenge_id:o.id,expires_at:o.expires_at,public_payload:o.public_payload??{},target:n??null,code:"",error:null,attempts:0,maxAttempts:l,remainingSeconds:s,resendCooldown:0}});let g=a,h=0;const c=window.setInterval(()=>{const p=g>0?Math.max(0,Math.floor((g-Date.now())/1e3)):0;h=Math.max(0,h-1),t.state.set({identityChallenge:{remainingSeconds:p,resendCooldown:h}})},1e3);let i=null;try{i=t.state.subscribe?.(p=>{const m=p?.identityChallenge?.expires_at;if(typeof m=="string"){const x=new Date(m).getTime();Number.isFinite(x)&&x!==g&&(g=x)}const w=p?.identityChallenge?.resendCooldown;typeof w=="number"&&w>h&&(h=w)})??null}catch{}const u=r.createDeferred();try{await t.dispatch({handler:"openModal",target:"identity-challenge-modal"})}catch(p){return un.error("openModal 실패 — 풀페이지로 폴백:",p),window.clearInterval(c),i?.(),r.redirectExternally({...e,render_hint:"external_redirect",redirect_url:`/identity/challenge?challenge_id=${encodeURIComponent(o.id)}&return=${encodeURIComponent(window.location.href)}`})}const f=await u;return window.clearInterval(c),i?.(),f}function _p(){const e=window.G7Core?.identity;if(!e?.setLauncher){un.warn("G7Core.identity 가 아직 초기화되지 않아 launcher 등록을 건너뜁니다. 코어 부트스트랩 순서를 확인하세요.");return}e.setLauncher(Sp),un.log("IDV launcher registered (sirsoft-basic)")}function Ep(e){const t=e.icons;return Array.isArray(t)?t.filter(r=>!!r&&typeof r=="object"&&typeof r.value=="string"):[]}function Tp(e,t){const r=e.label;return typeof r=="string"?r.startsWith("$t:")?t(r.slice(3)):r:e.value}function Np(e,t,r){if(r==="")return!0;const n=r.toLowerCase();return e.value.toLowerCase().includes(n)||t.toLowerCase().includes(n)?!0:(e.keywords??[]).some(o=>o.toLowerCase().includes(n))}function Ap({entry:e}){const t=e.preview;return t?.html?d.jsx("span",{className:"g7le-icon-preview",dangerouslySetInnerHTML:{__html:t.html},style:$a}):t?.className?d.jsx("span",{className:`g7le-icon-preview ${t.className}`,style:$a}):d.jsx("i",{className:`fas fa-${e.value}`,style:$a,"aria-hidden":"true"})}function Mp({control:e,value:t,onChange:r,t:n}){const o=Ep(e),a=t==null?"":String(t),s=typeof e.iconColumns=="number"?e.iconColumns:6,l=e.iconSearchPlaceholder,g=typeof l=="string"&&l.startsWith("$t:")?n(l.slice(3)):n("layout_editor.icon_picker.search_placeholder"),[h,c]=k.useState("");if(o.length===0)return d.jsx("div",{className:"g7le-widget g7le-widget--icon-picker","data-testid":"g7le-widget-icon-picker",style:yc,children:d.jsx("input",{type:"text",className:"g7le-widget g7le-widget--icon-free","data-testid":"g7le-widget-icon-picker-free",value:a,placeholder:n("layout_editor.icon_picker.free_input_hint"),onChange:f=>r(f.target.value===""?void 0:f.target.value),style:vc})});const i=f=>Tp(f,n),u=o.filter(f=>Np(f,i(f),h));return d.jsxs("div",{className:"g7le-widget g7le-widget--icon-picker","data-testid":"g7le-widget-icon-picker",style:yc,children:[d.jsx("input",{type:"text",className:"g7le-widget g7le-widget--icon-search","data-testid":"g7le-widget-icon-picker-search",value:h,placeholder:g,onChange:f=>c(f.target.value),style:vc}),d.jsxs("div",{className:"g7le-icon-grid","data-testid":"g7le-widget-icon-picker-grid",style:{...Op,gridTemplateColumns:`repeat(${s}, minmax(0, 1fr))`},children:[d.jsx("button",{type:"button","data-testid":"g7le-icon-cell-none",title:n("layout_editor.icon_picker.none"),onClick:()=>r(void 0),"aria-pressed":a==="",style:a===""?wc:Ua,children:d.jsx("span",{style:Ip,children:"—"})}),u.map(f=>{const p=f.value===a;return d.jsx("button",{type:"button","data-testid":`g7le-icon-cell-${f.value}`,title:i(f),"aria-pressed":p,onClick:()=>r(f.value),style:p?wc:Ua,children:d.jsx(Ap,{entry:f})},f.value)})]}),u.length===0&&d.jsx("div",{"data-testid":"g7le-widget-icon-picker-empty",style:Dp,children:n("layout_editor.icon_picker.no_results")})]})}const yc={display:"flex",flexDirection:"column",gap:6,width:"100%"},vc={padding:"5px 8px",fontSize:12,border:"1px solid #cbd5e1",borderRadius:6,width:"100%"},Op={display:"grid",gap:4,maxHeight:220,overflowY:"auto",padding:2},Ua={display:"flex",alignItems:"center",justifyContent:"center",minHeight:34,padding:4,border:"1px solid #e2e8f0",borderRadius:6,background:"#fff",cursor:"pointer"},wc={...Ua,border:"2px solid #2563eb",background:"#eff6ff"},$a={display:"inline-flex",alignItems:"center",justifyContent:"center",fontSize:16,lineHeight:1},Ip={fontSize:10,color:"#475569",fontFamily:"monospace",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",maxWidth:"100%"},Dp={fontSize:11,color:"#94a3b8",fontStyle:"italic",padding:"4px 2px"},xc=window.G7Core?.createLogger?.("Template:sirsoft-basic:EditorWidgets")??{log:(...e)=>console.log("[Template:sirsoft-basic:EditorWidgets]",...e),warn:(...e)=>console.warn("[Template:sirsoft-basic:EditorWidgets]",...e)};function Lp(){if(typeof window>"u")return;const e=window.G7Core?.layoutEditor;if(!e?.registerWidget){xc.warn("G7Core.layoutEditor 미노출 — icon-picker 위젯 등록 보류");return}e.registerWidget("icon-picker",Mp),xc.log("편집기 위젯 'icon-picker' 등록됨(Font Awesome 검색 그리드)")}const za=window.G7Core?.createLogger?.("Template:sirsoft-basic")??{log:(...e)=>console.log("[Template:sirsoft-basic]",...e),warn:(...e)=>console.warn("[Template:sirsoft-basic]",...e),error:(...e)=>console.error("[Template:sirsoft-basic]",...e)};typeof window<"u"&&(window.G7TemplateHandlers=to);function kc(){if(typeof window<"u"){let e=0;const t=50,r=()=>{const n=window.G7Core?.getActionDispatcher?.();n?(Object.entries(to).forEach(([o,a])=>{n.registerHandler(o,a)}),za.log(`${Object.keys(to).length} custom handler(s) registered:`,Object.keys(to)),_p()):(e++,e<=t?(za.warn(`ActionDispatcher not found, retrying... (${e}/${t})`),setTimeout(r,100)):za.error("Failed to register handlers: ActionDispatcher not available after maximum retries"))};document.readyState==="complete"?r():window.addEventListener("load",r)}}return Lp(),kc(),J.A=ao,J.Avatar=$r,J.AvatarUploader=Ta,J.Button=Q,J.Checkbox=Ya,J.Code=Vc,J.ConfirmDialog=Ro,J.Container=S0,J.Div=W,J.ExpandableContent=Zo,J.FileInput=Ga,J.FileUploader=Xn,J.Flex=E0,J.Footer=es,J.Form=so,J.Grid=_0,J.H1=Lc,J.H2=Wa,J.H3=gn,J.H4=Ka,J.Header=Ja,J.Hr=lo,J.HtmlContent=Yo,J.HtmlEditor=Dl,J.Icon=de,J.IconName=Je,J.ImageGallery=Tr,J.Img=Lt,J.Input=xt,J.Label=yr,J.Li=Xt,J.MobileNav=ts,J.Modal=Qo,J.Nav=Ur,J.NotificationCenter=mn,J.Ol=Pc,J.Optgroup=zc,J.Option=$c,J.P=Dt,J.PageLoading=Ri,J.PageSkeleton=Ea,J.PageTransitionBlur=Ca,J.PageTransitionIndicator=ka,J.Pagination=ec,J.PasswordInput=Ba,J.PostReactions=Ol,J.ProductCard=ps,J.ProductImageViewer=An,J.QuantitySelector=Al,J.RichTextEditor=Il,J.SearchBar=rc,J.Section=Xa,J.SectionLayout=T0,J.Select=Va,J.SlotContainer=pn,J.SocialLoginButtons=Wi,J.Span=te,J.Svg=fn,J.TabNavigation=sc,J.Table=Hc,J.Tbody=jc,J.Td=Kc,J.Textarea=no,J.Th=Wc,J.Thead=Gc,J.ThemeToggle=hn,J.ThreeColumnLayout=N0,J.Toast=xa,J.Tr=Bc,J.Ul=oo,J.UserInfo=ac,J.availablePasswordRules=ro,J.compositeComponents=C0,J.defaultPasswordRules=ja,J.initTemplate=kc,J.templateMetadata=A0,Object.defineProperty(J,Symbol.toStringTag,{value:"Module"}),J})({},ReactJSXRuntime,React,ReactDOM); + `})]}):null},Rh=Object.freeze(Object.defineProperty({__proto__:null,PageTransitionIndicator:ka,default:ka},Symbol.toStringTag,{value:"Module"})),Vi=window.G7Core?.createLogger?.("Comp:PageTransitionBlur")??{log:(...e)=>console.log("[Comp:PageTransitionBlur]",...e),warn:(...e)=>console.warn("[Comp:PageTransitionBlur]",...e)},Ca=({className:e="",style:t})=>{const[r,n]=k.useState(!1);return k.useEffect(()=>{const o=window.G7Core?.TransitionManager;if(!o){Vi.warn("TransitionManager를 찾을 수 없습니다.");return}return n(o.getIsPending()),o.subscribe(s=>{Vi.log("isPending changed:",s),n(s)})},[]),r?d.jsx(W,{className:`fixed inset-0 z-40 bg-white/30 dark:bg-gray-900/30 backdrop-blur-sm transition-opacity duration-150 pointer-events-none ${e}`,style:t,role:"status","aria-label":"페이지 전환 중","data-testid":"page-transition-blur"}):null},e0=Object.freeze(Object.defineProperty({__proto__:null,PageTransitionBlur:Ca,default:Ca},Symbol.toStringTag,{value:"Module"})),Yi={sm:640,md:768,lg:1024,xl:1280,"2xl":1536},Xi=new Set(["hidden","block","inline-block","inline","flex","inline-flex","grid","inline-grid","table","table-row","table-cell","contents","list-item","flow-root"]),t0=new Set(["Div","Flex","Grid","Section","Article","Nav","Aside","Main","Header","Footer","Fragment","Form","Container"]),r0=new Set(["H1","H2","H3","H4","H5","H6","P","Span","Label","A","Strong","Em","Small","Badge"]),n0=new Set(["Input","Textarea","Select","Checkbox","Radio","Toggle","DatePicker","TagInput","SearchBar"]),o0=new Set(["Img","Image","Avatar","AvatarUploader","ImageGallery","ProductImageViewer","FileUploader"]),qi={DataGrid:(e,t)=>d.jsxs("div",{className:"w-full border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden",children:[d.jsx("div",{className:`h-10 bg-gray-100 dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700 ${e}`,children:d.jsxs("div",{className:"flex items-center h-full px-4 gap-8",children:[d.jsx("div",{className:"h-3 w-16 bg-gray-300 dark:bg-gray-600 rounded"}),d.jsx("div",{className:"h-3 w-24 bg-gray-300 dark:bg-gray-600 rounded"}),d.jsx("div",{className:"h-3 w-20 bg-gray-300 dark:bg-gray-600 rounded"}),d.jsx("div",{className:"h-3 w-16 bg-gray-300 dark:bg-gray-600 rounded"})]})}),Array.from({length:t},(r,n)=>d.jsx("div",{className:`h-12 border-b border-gray-100 dark:border-gray-800 ${e}`,style:{animationDelay:`${n*75}ms`},children:d.jsxs("div",{className:"flex items-center h-full px-4 gap-8",children:[d.jsx("div",{className:"h-3 w-12 bg-gray-200 dark:bg-gray-700 rounded"}),d.jsx("div",{className:"h-3 flex-1 bg-gray-200 dark:bg-gray-700 rounded"}),d.jsx("div",{className:"h-3 w-16 bg-gray-100 dark:bg-gray-800 rounded"}),d.jsx("div",{className:"h-3 w-14 bg-gray-100 dark:bg-gray-800 rounded"})]})},n))]}),Pagination:e=>d.jsx("div",{className:"flex justify-center gap-1.5 py-3",children:Array.from({length:5},(t,r)=>d.jsx("div",{className:`w-8 h-8 bg-gray-200 dark:bg-gray-700 rounded ${e}`},r))}),Tabs:e=>d.jsxs("div",{children:[d.jsx("div",{className:"flex gap-4 border-b border-gray-200 dark:border-gray-700 pb-2 mb-3",children:Array.from({length:3},(t,r)=>d.jsx("div",{className:`h-4 w-20 bg-gray-200 dark:bg-gray-700 rounded ${e}`},r))}),d.jsx("div",{className:`h-32 bg-gray-100 dark:bg-gray-800 rounded ${e}`})]}),TabNavigation:e=>d.jsx("div",{className:"flex gap-4 border-b border-gray-200 dark:border-gray-700 pb-2",children:Array.from({length:3},(t,r)=>d.jsx("div",{className:`h-4 w-20 bg-gray-200 dark:bg-gray-700 rounded ${e}`},r))}),ProductCard:e=>d.jsxs("div",{className:"rounded-lg overflow-hidden",children:[d.jsx("div",{className:`h-48 w-full bg-gray-200 dark:bg-gray-700 ${e}`}),d.jsxs("div",{className:"p-3 space-y-2",children:[d.jsx("div",{className:`h-3.5 w-3/4 bg-gray-200 dark:bg-gray-700 rounded ${e}`}),d.jsx("div",{className:`h-4 w-1/3 bg-gray-300 dark:bg-gray-600 rounded ${e}`})]})]}),UserInfo:e=>d.jsx("div",{className:`h-3 w-14 bg-gray-200 dark:bg-gray-700 rounded ${e}`}),QuantitySelector:e=>d.jsx("div",{className:`h-9 w-28 bg-gray-100 dark:bg-gray-800 rounded border border-gray-200 dark:border-gray-700 ${e}`}),Header:e=>d.jsx("header",{className:"bg-white dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700",children:d.jsx("div",{className:"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8",children:d.jsxs("div",{className:"flex items-center justify-between h-16",children:[d.jsxs("div",{className:"flex items-center gap-8",children:[d.jsx("div",{className:`h-8 w-24 bg-gray-200 dark:bg-gray-700 rounded ${e}`}),d.jsx("div",{className:"hidden lg:flex items-center gap-6",children:Array.from({length:4},(t,r)=>d.jsx("div",{className:`h-3.5 w-16 bg-gray-200 dark:bg-gray-700 rounded ${e}`},r))})]}),d.jsx("div",{className:"flex items-center gap-4",children:Array.from({length:3},(t,r)=>d.jsx("div",{className:`h-8 w-8 bg-gray-200 dark:bg-gray-700 rounded-full ${e}`},r))})]})})}),Footer:e=>d.jsx("footer",{className:"bg-white dark:bg-gray-800 border-t border-gray-200 dark:border-gray-700 mt-auto",children:d.jsx("div",{className:"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-8",children:d.jsxs("div",{className:"flex flex-col items-center gap-4",children:[d.jsx("div",{className:`h-4 w-32 bg-gray-200 dark:bg-gray-700 rounded ${e}`}),d.jsx("div",{className:`h-3 w-48 bg-gray-100 dark:bg-gray-800 rounded ${e}`}),d.jsx("div",{className:"flex gap-3",children:Array.from({length:3},(t,r)=>d.jsx("div",{className:`h-6 w-6 bg-gray-200 dark:bg-gray-700 rounded-full ${e}`},r))}),d.jsx("div",{className:`h-3 w-40 bg-gray-100 dark:bg-gray-800 rounded ${e}`})]})})}),Modal:()=>d.jsx(d.Fragment,{}),Toast:()=>d.jsx(d.Fragment,{}),ConfirmDialog:()=>d.jsx(d.Fragment,{})};function a0(e){if(!e||e.length===0)return[];const t=e.filter(n=>n.if),r=e.filter(n=>!n.if);if(r.length>0&&t.length>0){const n=t.filter(o=>!Zi(o.if));return n.length>1&&s0(n)?[...r,Qi(n)]:[...r,...n]}if(t.length>1&&r.length===0){const n=t.filter(o=>!Zi(o.if));return n.length===0?[]:n.length===1?n:[Qi(n)]}return e}function Zi(e){const t=e.replace(/^\{\{|\}\}$/g,"").trim();return t.startsWith("!")||/\b(hasError|isError|isLoading|error|Error)\b/.test(t)||/===\s*0\s*(\)|\}|$)/.test(t)}function s0(e){if(e.length<2)return!1;const t=[];for(const n of e){const o=(n.if||"").replace(/^\{\{|\}\}$/g,"").trim(),a=o.match(/^(.+?)\s*===\s*['"]/);if(a)t.push(a[1].trim());else{const s=o.match(/(.+?)\s*===\s*['"]/);if(!s)return!1;t.push(s[1].trim())}}const r=t[0];return t.every(n=>n===r)}function Qi(e){return e.reduce((t,r)=>Sa(r)>Sa(t)?r:t)}function Sa(e){return e.children?e.children.length+e.children.reduce((t,r)=>t+Sa(r),0):0}function l0(e){return e.includes("{{")?e.replace(/\{\{([^}]+)\}\}/g,(t,r)=>{const n=r.match(/\?[\s]*['"]([^'"]*)['"]\s*:\s*['"]/);return n?n[1]:""}):e}function _a(e,t){if(!e)return"";let r=e;return r=r.replace(/\b(bg-\S+|text-\S+|border\b|border-\S+|shadow\S*|ring-\S+|outline-\S+|divide-\S+|opacity-\S+|font-\S+|tracking-\S+|leading-\S+|whitespace-\S+|truncate|line-clamp-\S+|underline|no-underline|decoration-\S+|cursor-\S+|hover:\S+|focus:\S+|active:\S+|group-hover:\S+|transition\S*|duration-\S+|ease-\S+|animate-\S+|dark:\S+)\b/g,"").replace(/\s{2,}/g," ").trim(),(t==="Grid"||/\bgrid-cols-\d/.test(r))&&(r=r.replace(/\bgrid-cols-(\d+)/g,(n,o)=>{const a=parseInt(o);return a>4?`grid-cols-${Math.ceil(a/2)}`:`grid-cols-${a}`})),r}function i0(e){const{name:t,props:r}=e;if(!r||!t)return"";const n=[];if(t==="Flex"){n.push("flex");const o=r.direction||"row",a={row:"flex-row","row-reverse":"flex-row-reverse",col:"flex-col","col-reverse":"flex-col-reverse"};a[o]&&n.push(a[o]);const s=r.justify||"start",l={start:"justify-start",end:"justify-end",center:"justify-center",between:"justify-between",around:"justify-around",evenly:"justify-evenly"};l[s]&&n.push(l[s]);const g=r.align||"stretch",h={start:"items-start",end:"items-end",center:"items-center",baseline:"items-baseline",stretch:"items-stretch"};h[g]&&n.push(h[g]);const c=r.wrap||"nowrap",i={wrap:"flex-wrap",nowrap:"flex-nowrap","wrap-reverse":"flex-wrap-reverse"};i[c]&&n.push(i[c]),r.gap&&r.gap>0&&n.push(`gap-${r.gap}`)}if(t==="Grid"){n.push("grid");const o=r.cols||1;if(n.push(`grid-cols-${o}`),r.responsive){const a=r.responsive;a.sm&&n.push(`sm:grid-cols-${a.sm}`),a.md&&n.push(`md:grid-cols-${a.md}`),a.lg&&n.push(`lg:grid-cols-${a.lg}`),a.xl&&n.push(`xl:grid-cols-${a.xl}`),a["2xl"]&&n.push(`2xl:grid-cols-${a["2xl"]}`)}r.gap!==void 0&&r.gap>0&&n.push(`gap-${r.gap}`),r.rowGap!==void 0&&r.rowGap>0&&n.push(`gap-y-${r.rowGap}`),r.colGap!==void 0&&r.colGap>0&&n.push(`gap-x-${r.colGap}`)}return n.join(" ")}function c0(e){switch(e){case"pulse":return"animate-pulse";case"wave":return"animate-pulse";case"none":return"";default:return"animate-pulse"}}function qn(e,t,r,n){return!e||e.length===0?[]:a0(e).map((a,s)=>Ji(a,t,r,s,n))}function d0(e,t){const r=e.props?.className||e.className||"";return e.responsive?t>=1024&&e.responsive.desktop?.props?.className?e.responsive.desktop.props.className:t>=768&&e.responsive.tablet?.props?.className?e.responsive.tablet.props.className:r:r}function u0(e,t){const r=e.split(/\s+/).filter(Boolean),n=[],o=[];for(const g of r){const h=g.match(/^(sm|md|lg|xl|2xl):(.+)$/);if(h){const[,c,i]=h;if(Xi.has(i)){n.push({breakpoint:Yi[c]||0,display:i});continue}(Yi[c]||0)<=t&&o.push(i);continue}if(Xi.has(g)){n.push({breakpoint:0,display:g});continue}o.push(g)}if(n.length===0)return{visible:!0,className:e};n.sort((g,h)=>g.breakpoint-h.breakpoint);let a="";for(const g of n)g.breakpoint<=t&&(a=g.display);a||(a=n[0].display);const s=a!=="hidden",l=s?[a,...o].join(" "):"";return{visible:s,className:l}}function f0(e){const t=e.match(/\bgrid-cols-\[([^\]]+)\]/);if(!t)return{className:e};const r=t[1].replace(/_/g," ");return{className:e.replace(/\bgrid-cols-\[([^\]]+)\]/,"").replace(/\s{2,}/g," ").trim(),style:{gridTemplateColumns:r}}}function Ji(e,t,r,n,o){const{name:a,children:s,iteration:l}=e,g=d0(e,o),h=i0(e),c=h?`${h} ${g}`.trim():g,i=l0(c),u=u0(i,o);if(!a||!u.visible)return null;const f=u.className;if(l)return d.jsx(k.Fragment,{children:Array.from({length:r},(m,w)=>Ji({...e,iteration:void 0},t,r,w,o))},n);if(qi[a])return d.jsx("div",{className:f,children:qi[a](t,r)},n);if(t0.has(a)){const m=_a(f,a);if(!s||s.length===0){const E=/\b(h-\S|w-\S)/.test(m)?`${m} bg-gray-200 dark:bg-gray-700 rounded ${t}`:`${m} h-3.5 w-full bg-gray-200 dark:bg-gray-700 rounded ${t}`.trim();return d.jsx("div",{className:E},n)}const w=qn(s,t,r,o);if(!(w.length>0&&w.some(v=>v!==null)))return null;const A=f0(m);return d.jsx("div",{className:A.className,style:A.style,children:w},n)}const p=_a(f,a);if(r0.has(a)){const m={H1:"h-7",H2:"h-6",H3:"h-5",H4:"h-5",H5:"h-4",H6:"h-4",P:"h-3.5",Span:"h-3",Label:"h-3",A:"h-3.5",Badge:"h-5 w-16"},w={H1:"w-3/5",H2:"w-2/5",H3:"w-1/3",H4:"w-1/3",H5:"w-1/4",H6:"w-1/4",P:"w-full",Span:"w-1/4",Label:"w-1/4",A:"w-1/3",Strong:"w-1/5",Em:"w-1/4",Small:"w-1/5",Badge:"w-16"},x=m[a]||"h-3.5",A=w[a]||"w-full",v=a.startsWith("H")?"mb-2 mt-1":"mb-1.5";return d.jsx("div",{className:`${x} ${A} bg-gray-200 dark:bg-gray-700 rounded ${t} ${v} ${p}`.trim()},n)}if(n0.has(a))return a==="Textarea"?d.jsx("div",{className:`h-20 w-full bg-gray-100 dark:bg-gray-800 rounded border border-gray-200 dark:border-gray-700 mb-2 ${t}`},n):a==="Checkbox"||a==="Radio"||a==="Toggle"?d.jsx("div",{className:`h-5 w-5 bg-gray-200 dark:bg-gray-700 rounded mb-1.5 ${t}`},n):d.jsx("div",{className:`h-9 w-full bg-gray-100 dark:bg-gray-800 rounded border border-gray-200 dark:border-gray-700 mb-2 ${t}`},n);if(o0.has(a))return a==="Avatar"||a==="AvatarUploader"?d.jsx("div",{className:`h-10 w-10 bg-gray-200 dark:bg-gray-700 rounded-full ${t}`},n):a==="ProductImageViewer"?d.jsx("div",{className:`h-80 w-full bg-gray-200 dark:bg-gray-700 rounded ${t}`},n):d.jsx("div",{className:`h-40 w-full bg-gray-200 dark:bg-gray-700 rounded mb-2 ${t}`},n);if(a==="Button"){if(s&&s.length>0){const m=_a(f,a),w=qn(s,t,r,o);if(!(w.length>0&&w.some(E=>E!==null)))return null;const v=/\b(border|rounded|px-\d|py-\d)/.test(g)?"border border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800/50 rounded-lg":"";return d.jsx("div",{className:`${m} ${v}`.trim(),children:w},n)}return d.jsx("div",{className:`h-9 w-24 bg-gray-200 dark:bg-gray-700 rounded ${t}`},n)}return a==="Icon"?d.jsx("div",{className:`h-5 w-5 bg-gray-200 dark:bg-gray-700 rounded ${t}`},n):s&&s.length>0?d.jsx("div",{className:p,children:qn(s,t,r,o)},n):d.jsx("div",{className:`h-3.5 w-full bg-gray-200 dark:bg-gray-700 rounded mb-1.5 ${t}`},n)}const Ea=({components:e,options:t})=>{const r=c0(t.animation),o=window.G7Core?.useResponsive,a=o?.(),s=a?a.width:typeof window<"u"?window.innerWidth:1024;return d.jsx("div",{className:"w-full",role:"status","aria-busy":"true","aria-label":"Loading...",children:qn(e,r,t.iteration_count,s)})},g0=Object.freeze(Object.defineProperty({__proto__:null,PageSkeleton:Ea,default:Ea},Symbol.toStringTag,{value:"Module"})),h0=(e,t)=>window.G7Core?.t?.(e,t)??e,Ri=({options:e})=>{const t=document.documentElement.classList.contains("dark"),r=t?"rgb(17,24,39)":"rgb(249,250,251)",n=t?"#6b7280":"#9ca3af",o=t?"#9ca3af":"#6b7280";return d.jsxs("div",{style:{position:"absolute",inset:0,zIndex:2147483647,overflow:"hidden",background:r,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"flex-start",paddingTop:"15%",gap:"12px"},children:[d.jsx("div",{style:{width:"32px",height:"32px",border:`3px solid ${n}`,borderTopColor:"transparent",borderRadius:"50%",animation:"g7-spin 0.8s linear infinite"}}),d.jsx("span",{style:{color:o,fontSize:"14px"},children:e?.text||h0("nav.loading")})]})},p0=Object.freeze(Object.defineProperty({__proto__:null,default:Ri},Symbol.toStringTag,{value:"Module"})),Dr=(e,t)=>window.G7Core?.t?.(e,t)??e,ec=({currentPage:e,totalPages:t,onPageChange:r,maxVisiblePages:n=5,showFirstLast:o=!0,className:a="",style:s,prevText:l,nextText:g,id:h,editorAttrs:c})=>{const i=k.useMemo(()=>{const m=[];if(t<=n+2)for(let w=1;w<=t;w++)m.push(w);else{const w=Math.floor(n/2);let x=Math.max(2,e-w),A=Math.min(t-1,e+w);e<=w+1?A=n:e>=t-w&&(x=t-n+1),m.push(1),x>2&&m.push("...");for(let v=x;v<=A;v++)m.push(v);A1&&m.push(t)}return m},[e,t,n]),u=m=>{m<1||m>t||m===e||r(m)},f=()=>{e>1&&r(e-1)},p=()=>{eu(1),disabled:e===1,className:"px-3 py-1 text-sm border border-gray-300 dark:border-gray-600 rounded hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-50 disabled:cursor-not-allowed text-gray-700 dark:text-gray-300 bg-white dark:bg-gray-800","aria-label":Dr("common.first_page"),children:"«"}),d.jsx(Q,{onClick:f,disabled:e===1,className:"px-3 py-1 text-sm border border-gray-300 dark:border-gray-600 rounded hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-50 disabled:cursor-not-allowed text-gray-700 dark:text-gray-300 bg-white dark:bg-gray-800","aria-label":Dr("common.prev_page"),children:l||d.jsx(d.Fragment,{children:"‹"})}),d.jsx(W,{className:"flex items-center gap-1",children:i.map((m,w)=>{if(m==="...")return d.jsx(te,{className:"px-3 py-1 text-sm text-gray-500 dark:text-gray-400",children:"..."},`ellipsis-${w}`);const x=m,A=x===e;return d.jsx(Q,{onClick:()=>u(x),className:`px-3 py-1 text-sm border rounded ${A?"bg-blue-500 dark:bg-blue-600 text-white border-blue-500 dark:border-blue-600":"border-gray-300 dark:border-gray-600 hover:bg-gray-100 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300 bg-white dark:bg-gray-800"}`,"aria-label":Dr("common.page_n",{n:x}),"aria-current":A?"page":void 0,children:x},x)})}),d.jsx(Q,{onClick:p,disabled:e===t,className:"px-3 py-1 text-sm border border-gray-300 dark:border-gray-600 rounded hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-50 disabled:cursor-not-allowed text-gray-700 dark:text-gray-300 bg-white dark:bg-gray-800","aria-label":Dr("common.next_page"),children:g||d.jsx(d.Fragment,{children:"›"})}),o&&d.jsx(Q,{onClick:()=>u(t),disabled:e===t,className:"px-3 py-1 text-sm border border-gray-300 dark:border-gray-600 rounded hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-50 disabled:cursor-not-allowed text-gray-700 dark:text-gray-300 bg-white dark:bg-gray-800","aria-label":Dr("common.last_page"),children:"»"})]})},m0=Object.freeze(Object.defineProperty({__proto__:null,Pagination:ec},Symbol.toStringTag,{value:"Module"})),tc=(e,t)=>window.G7Core?.t?.(e,t)??e,rc=({name:e="search",placeholder:t,value:r,onChange:n,onSubmit:o,showButton:a=!1,suggestions:s=[],onSuggestionClick:l,showSuggestions:g=!1,className:h="",style:c,id:i,editorAttrs:u})=>{const f=t??tc("common.search_placeholder"),[p,m]=k.useState(""),[w,x]=k.useState(!1),A=k.useRef(null),v=k.useRef(""),E=r!==void 0?r:p,O=g&&w&&s.length>0&&E.length>0;k.useEffect(()=>{r!==void 0&&(v.current=r)},[r]);const _=y=>{const N=y.target.value;m(N),n?.(y),v.current!==""&&N===""&&!y.nativeEvent.inputType&&setTimeout(()=>{const M=A.current?.querySelector("form");M&&M.requestSubmit()},0),v.current=N},I=y=>{m(y.text);const N={target:{value:y.text,name:e}};n?.(N),l?.(y),x(!1)},C=y=>{y.preventDefault(),o?.(y)};return d.jsxs(W,{ref:A,className:`relative ${h}`,style:c,id:i,...u,children:[d.jsx(so,{onSubmit:C,className:"relative",children:d.jsxs(W,{className:`relative flex items-center ${a?"gap-2":""}`,children:[d.jsxs(W,{className:"relative flex-1",children:[d.jsx(W,{className:"absolute left-3 top-1/2 -translate-y-1/2 pointer-events-none",children:d.jsx(de,{name:Je.Search,className:"w-5 h-5 text-gray-400 dark:text-gray-500"})}),d.jsx(xt,{type:"search",name:e,value:E,onChange:_,onFocus:()=>x(!0),onBlur:()=>setTimeout(()=>x(!1),200),placeholder:f,className:"w-full pl-10 pr-4 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white text-sm"})]}),a&&d.jsx(Q,{type:"submit",className:"px-4 py-2 bg-gray-800 dark:bg-gray-600 text-white rounded-lg hover:bg-gray-900 dark:hover:bg-gray-500 transition-colors text-sm font-medium cursor-pointer h-[42px]",children:tc("common.search")})]})}),O&&d.jsx(W,{className:"absolute z-10 w-full mt-2 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-lg max-h-64 overflow-y-auto",children:s.map(y=>d.jsx(W,{className:"px-4 py-3 hover:bg-gray-50 dark:hover:bg-gray-700 cursor-pointer border-b border-gray-100 dark:border-gray-700 last:border-b-0 transition-colors",onClick:()=>I(y),children:d.jsxs(W,{className:"flex items-center gap-2",children:[d.jsx(de,{name:Je.Search,className:"w-4 h-4 text-gray-400 dark:text-gray-500"}),d.jsx(te,{className:"text-sm text-gray-700 dark:text-gray-300",children:y.text})]})},y.id))})]})},b0=Object.freeze(Object.defineProperty({__proto__:null,SearchBar:rc},Symbol.toStringTag,{value:"Module"})),vt=window.G7Core,y0={sm:"md",md:"lg",lg:"xl",xl:"2xl","2xl":"3xl"};function Ta({src:e,fallbackText:t="U",size:r="lg",uploadEndpoint:n="/api/me/avatar",deleteEndpoint:o="/api/me/avatar",onUploadSuccess:a,onUploadError:s,onDeleteSuccess:l,onDeleteError:g,showDeleteButton:h=!0,accept:c="image/*",maxSize:i=5,className:u="",uploadButtonText:f,deleteButtonText:p,readOnly:m=!1,confirmDelete:w=!0,deleteConfirmMessage:x,confirmUpload:A=!0,uploadConfirmMessage:v,uploadSuccessActions:E,uploadErrorActions:O,deleteSuccessActions:_,deleteErrorActions:I,id:C,editorAttrs:y}){const N=k.useRef(null),[M,P]=k.useState(!1),[D,L]=k.useState(!1),[$,S]=k.useState(void 0),[b,U]=k.useState(null),[F,G]=k.useState(!1),[Y,B]=k.useState(!1),[V,j]=k.useState(null),[H,q]=k.useState(null),ue=k.useRef(`avatar-upload-${Math.random().toString(36).slice(2,11)}`).current;k.useEffect(()=>{if(V){const oe=URL.createObjectURL(V);return q(oe),()=>URL.revokeObjectURL(oe)}else q(null)},[V]);const ee=k.useCallback(oe=>vt?.t?.(oe)??oe,[]),fe=k.useCallback(()=>{const oe=document.cookie.match(/XSRF-TOKEN=([^;]+)/);return oe?decodeURIComponent(oe[1]):null},[]),R=k.useCallback(()=>vt?.api?.getToken?.()??null,[]),ke=k.useCallback(async oe=>{B(!1),j(null),P(!0),U(null);try{const ae=new FormData;ae.append("avatar",oe);const be=fe(),xe=R(),He=await fetch(n,{method:"POST",headers:{Accept:"application/json",...be&&{"X-XSRF-TOKEN":be},...xe&&{Authorization:`Bearer ${xe}`}},credentials:"include",body:ae});if(!He.ok){const Oe=await He.json().catch(()=>({}));throw new Error(Oe.message||ee("attachment.upload_failed"))}const Pe=await He.json(),Ke=Pe.data||Pe;Ke.avatar&&S(Ke.avatar),a?.(Ke),vt?.toast?.success?.(ee("mypage.profile.avatar_uploaded")),E?.length?E.forEach(Oe=>vt?.dispatch?.(Oe)):vt?.refetchDataSource?.("user")}catch(ae){const be=ae instanceof Error?ae:new Error(String(ae));U(be.message),s?.(be),vt?.toast?.error?.(be.message),O?.length&&O.forEach(xe=>vt?.dispatch?.(xe))}finally{P(!1),N.current&&(N.current.value="")}},[n,a,s,fe,R,ee]),me=k.useCallback(async oe=>{const ae=oe.target.files?.[0];if(!ae)return;U(null);const be=i*1024*1024;if(ae.size>be){const xe=new Error(ee("attachment.file_too_large").replace(":max",`${i}MB`));U(xe.message),s?.(xe),vt?.toast?.error?.(xe.message);return}if(c&&!ae.type.match(c.replace("*",".*"))){const xe=new Error(ee("attachment.invalid_file_type"));U(xe.message),s?.(xe),vt?.toast?.error?.(xe.message);return}A?(j(ae),B(!0)):ke(ae)},[i,c,s,A,ke,ee]),Ge=k.useCallback(async()=>{G(!1),L(!0),U(null);try{const oe=fe(),ae=R(),be=await fetch(o,{method:"DELETE",headers:{Accept:"application/json","Content-Type":"application/json",...oe&&{"X-XSRF-TOKEN":oe},...ae&&{Authorization:`Bearer ${ae}`}},credentials:"include"});if(!be.ok){const xe=await be.json().catch(()=>({}));throw new Error(xe.message||ee("attachment.delete_failed"))}S(null),l?.(),vt?.toast?.success?.(ee("mypage.profile.avatar_deleted")),_?.length?_.forEach(xe=>vt?.dispatch?.(xe)):vt?.refetchDataSource?.("user")}catch(oe){const ae=oe instanceof Error?oe:new Error(String(oe));U(ae.message),g?.(ae),vt?.toast?.error?.(ae.message),I?.length&&I.forEach(be=>vt?.dispatch?.(be))}finally{L(!1)}},[o,l,g,fe,R,ee]),De=k.useCallback(()=>{w?G(!0):Ge()},[w,Ge]),ye=k.useCallback(()=>{G(!1)},[]),Me=k.useCallback(()=>{B(!1),j(null),N.current&&(N.current.value="")},[]),Ce=k.useCallback(()=>{V&&ke(V)},[V,ke]),we=$===void 0?e:$,Ue=!!we,Le=y0[r]||"lg",K=F||Y,re=()=>d.jsxs(W,{className:"flex items-center justify-center gap-2",children:[d.jsx(xt,{ref:N,id:ue,type:"file",accept:c,className:"hidden",onChange:me,disabled:M}),!Ue&&d.jsxs(yr,{htmlFor:ue,className:`inline-flex items-center gap-2 px-4 py-2 border border-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-300 rounded-lg text-sm font-medium hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors cursor-pointer ${M?"opacity-50 cursor-not-allowed":""}`,children:[M?d.jsx(de,{name:"spinner",size:"sm",className:"animate-spin"}):d.jsx(de,{name:"image",size:"sm"}),d.jsx(te,{children:f||ee("mypage.profile.register_avatar")})]}),Ue&&d.jsxs(d.Fragment,{children:[d.jsxs(yr,{htmlFor:ue,className:`inline-flex items-center gap-2 px-4 py-2 border border-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-300 rounded-lg text-sm font-medium hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors cursor-pointer ${M?"opacity-50 cursor-not-allowed":""}`,children:[M?d.jsx(de,{name:"spinner",size:"sm",className:"animate-spin"}):d.jsx(de,{name:"upload",size:"sm"}),d.jsx(te,{children:f||ee("common.change")})]}),h&&d.jsxs(Q,{type:"button",className:"inline-flex items-center gap-2 px-4 py-2 border border-red-300 dark:border-red-600 text-red-600 dark:text-red-400 rounded-lg text-sm font-medium hover:bg-red-50 dark:hover:bg-red-900/20 transition-colors disabled:opacity-50 disabled:cursor-not-allowed",onClick:De,disabled:D,children:[D?d.jsx(de,{name:"spinner",size:"sm",className:"animate-spin"}):d.jsx(de,{name:"trash-2",size:"sm"}),d.jsx(te,{children:p||ee("common.delete")})]})]})]});return d.jsxs(W,{className:`flex flex-col items-center gap-3 ${u}`,id:C,...y,children:[Y&&H?d.jsxs(W,{className:"relative",children:[d.jsx(Lt,{src:H,alt:"Preview",className:`rounded-full object-cover ${r==="sm"?"w-10 h-10":r==="md"?"w-12 h-12":r==="lg"?"w-16 h-16":r==="xl"?"w-24 h-24":"w-32 h-32"}`}),d.jsx(W,{className:"absolute inset-0 rounded-full bg-blue-500/20 border-2 border-blue-500 border-dashed"})]}):d.jsx($r,{avatar:we||void 0,name:t,size:Le}),!m&&d.jsxs(W,{className:"w-[220px] flex flex-col items-center gap-2",children:[Y&&V&&d.jsxs(W,{className:"w-full p-3 bg-blue-50 dark:bg-blue-950/50 border border-blue-200 dark:border-blue-800 rounded-lg",children:[d.jsxs(W,{className:"flex items-center gap-2 mb-2",children:[d.jsx(de,{name:"upload",size:"sm",className:"text-blue-600 dark:text-blue-400 shrink-0"}),d.jsx(te,{className:"text-sm font-medium text-blue-800 dark:text-blue-300",children:v||ee("mypage.profile.upload_avatar_confirm")})]}),d.jsxs(W,{className:"text-xs text-blue-600 dark:text-blue-400 truncate mb-3",title:V.name,children:[V.name," (",(V.size/1024/1024).toFixed(2),"MB)"]}),d.jsxs(W,{className:"grid grid-cols-2 gap-2",children:[d.jsxs(Q,{type:"button",className:"inline-flex items-center justify-center gap-1.5 px-3 py-2 bg-blue-600 hover:bg-blue-700 text-white rounded-md text-sm font-medium transition-colors disabled:opacity-50",onClick:Ce,disabled:M,children:[M?d.jsx(de,{name:"spinner",size:"sm",className:"animate-spin"}):d.jsx(de,{name:"check",size:"sm"}),d.jsx(te,{children:ee("common.confirm")})]}),d.jsx(Q,{type:"button",className:"inline-flex items-center justify-center gap-1.5 px-3 py-2 bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-300 rounded-md text-sm font-medium hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors",onClick:Me,children:d.jsx(te,{children:ee("common.cancel")})})]})]}),F&&d.jsxs(W,{className:"w-full p-3 bg-red-50 dark:bg-red-950/50 border border-red-200 dark:border-red-800 rounded-lg",children:[d.jsxs(W,{className:"flex items-center gap-2 mb-2",children:[d.jsx(de,{name:"alert-triangle",size:"sm",className:"text-red-600 dark:text-red-400 shrink-0"}),d.jsx(te,{className:"text-sm font-medium text-red-800 dark:text-red-300",children:x||ee("mypage.profile.delete_avatar_confirm")})]}),d.jsxs(W,{className:"grid grid-cols-2 gap-2",children:[d.jsxs(Q,{type:"button",className:"inline-flex items-center justify-center gap-1.5 px-3 py-2 bg-red-600 hover:bg-red-700 text-white rounded-md text-sm font-medium transition-colors disabled:opacity-50",onClick:Ge,disabled:D,children:[D?d.jsx(de,{name:"spinner",size:"sm",className:"animate-spin"}):d.jsx(de,{name:"trash-2",size:"sm"}),d.jsx(te,{children:ee("common.delete")})]}),d.jsx(Q,{type:"button",className:"inline-flex items-center justify-center gap-1.5 px-3 py-2 bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-300 rounded-md text-sm font-medium hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors",onClick:ye,children:d.jsx(te,{children:ee("common.cancel")})})]})]}),!K&&re()]}),b&&!K&&d.jsxs(W,{className:"flex items-center gap-2 text-sm text-red-600 dark:text-red-400",children:[d.jsx(de,{name:"alert-circle",size:"sm"}),d.jsx(te,{children:b})]})]})}const v0=Object.freeze(Object.defineProperty({__proto__:null,AvatarUploader:Ta,default:Ta},Symbol.toStringTag,{value:"Module"})),nc=()=>window.G7Core,Zn=(e,t)=>window.G7Core?.t?.(e,t)??e,oc={horizontal:"flex items-center gap-1.5",vertical:"flex flex-col items-start"},w0=()=>[{key:"view_profile",label:Zn("userinfo.view_profile"),icon:"user",path:"/users/{{userId}}"},{key:"view_posts",label:Zn("userinfo.view_posts"),icon:"file-lines",path:"/users/{{userId}}/posts"}],Na=({text:e,title:t})=>e?d.jsx(te,{className:"text-sm text-gray-500 dark:text-gray-400",title:t,children:e}):null,ac=({author:e,name:t,userId:r,subText:n,subTextTitle:o,isGuest:a=!1,isWithdrawn:s=!1,showDropdown:l=!0,clickable:g=!0,profilePath:h="/users/{userId}",className:c="",layout:i="vertical",text:u,stopPropagation:f=!1,menuItems:p,hideMenuItems:m=[],appendMenuItems:w=[],id:x,editorAttrs:A})=>{const v=r??e?.uuid,E=a||e?.is_guest||!1,O=s||e?.status==="withdrawn",_=O?Zn("userinfo.withdrawn_user"):u??t??e?.name??"",[I,C]=k.useState(!1),[y,N]=k.useState({top:0,left:0}),M=k.useRef(null),P=k.useRef(null),D=k.useRef(null),L=h.replace("{userId}",String(v??"")),$=`${oc[i]} ${c}`;k.useEffect(()=>{if(!I)return;const j=q=>{const ue=q.target,ee=M.current?.contains(ue),fe=P.current?.contains(ue);!ee&&!fe&&C(!1)},H=()=>C(!1);return document.addEventListener("mousedown",j),window.addEventListener("scroll",H,!0),window.addEventListener("resize",H),()=>{document.removeEventListener("mousedown",j),window.removeEventListener("scroll",H,!0),window.removeEventListener("resize",H)}},[I]);const S=k.useCallback(()=>{if(p&&p.length>0)return p.filter(q=>q.show!==!1);let H=w0().filter(q=>!m.includes(q.key)&&q.show!==!1);return w&&w.length>0&&(H=[...H,...w.filter(q=>q.show!==!1)]),H},[p,m,w]),b=k.useCallback(()=>{if(D.current){const j=D.current.getBoundingClientRect();N({top:j.bottom+4,left:j.left})}},[]),U=k.useCallback((j,H)=>{if(H.stopPropagation(),H.preventDefault(),C(!1),j.onClick)j.onClick();else if(j.path){const q=j.path.replace(/\{\{userId\}\}/g,String(v??"")),ue=nc();ue?.navigate?ue.navigate(q):window.location.href=q}},[v]),F=k.useCallback(j=>{j.preventDefault(),f&&j.stopPropagation(),!(E||!v)&&(l?(I||b(),C(H=>!H)):g&&nc()?.navigate?.(L))},[f,E,v,l,I,b,g,L]);if(E||!v)return d.jsxs(W,{className:$,id:x,...A,children:[d.jsxs(W,{className:"flex items-center gap-1.5 text-gray-400 dark:text-gray-500",children:[d.jsx(te,{children:_}),d.jsx(te,{className:"text-xs px-1.5 py-0.5 bg-gray-100 dark:bg-gray-700 text-gray-600 dark:text-gray-300 rounded",children:Zn("userinfo.guest_badge")})]}),d.jsx(Na,{text:n,title:o})]});if(O)return d.jsxs(W,{className:$,id:x,...A,children:[d.jsx(te,{className:"text-gray-400 dark:text-gray-500 line-through",children:_}),d.jsx(Na,{text:n,title:o})]});const G=S(),B=/\btext-\S+/.test(c)?"":"text-gray-900 dark:text-white",V=l||g?`${B} hover:text-blue-600 dark:hover:text-blue-400 cursor-pointer font-medium`.trim():`${B} font-medium`.trim();return d.jsxs(W,{ref:M,className:`relative inline-block ${c}`,id:x,...A,children:[d.jsxs(W,{className:oc[i],children:[d.jsx(Q,{ref:D,onClick:F,className:V,children:_}),d.jsx(Na,{text:n,title:o})]}),l&&I&&G.length>0&&Jt.createPortal(d.jsx(W,{ref:P,className:"fixed w-40 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-lg py-1 z-[9999]",style:{top:y.top,left:y.left},"data-testid":"author-dropdown-menu",children:G.map(j=>d.jsxs(Q,{onClick:H=>U(j,H),className:"flex items-center justify-start gap-2 w-full text-left px-3 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 cursor-pointer","data-testid":`menu-item-${j.key}`,children:[j.icon&&d.jsx(de,{name:j.icon,className:"w-4 h-4"}),d.jsx(te,{children:j.label})]},j.key))}),document.body)]})},x0=Object.freeze(Object.defineProperty({__proto__:null,UserInfo:ac},Symbol.toStringTag,{value:"Module"})),sc=({tabs:e,activeTabId:t,onTabChange:r,variant:n="underline",className:o="",style:a,hiddenTabIds:s=[],mobileBreakpoint:l=768,id:g,editorAttrs:h})=>{const i=window.G7Core?.useResponsive,u=i?.(),f=u?u.width{!v.disabled&&v.id!==t&&r?.(v.id)},m=v=>{const E=v.target.value,O=Number(E),_=typeof E=="string"&&E!==""&&!Number.isNaN(O)?O:E,I=e.find(C=>String(C.id)===String(_));I&&p(I)},w=s.length>0?e.filter(v=>!s.includes(v.id)):e;if(f)return d.jsx(W,{className:`relative ${o}`,style:a,id:g,...h,children:d.jsx(Va,{value:t!==void 0?String(t):"",onChange:m,options:w.map(v=>({value:String(v.id),label:v.badge!==void 0?`${v.label} (${v.badge})`:v.label,disabled:v.disabled})),className:"w-full"})});const x=v=>{const E=v.id===t,O="flex items-center gap-2 px-3 py-2 font-medium text-sm transition-all shrink-0 whitespace-nowrap";if(v.disabled)return`${O} opacity-50 cursor-not-allowed text-gray-400 dark:text-gray-600`;switch(n){case"pills":return E?`${O} bg-blue-600 dark:bg-blue-500 text-white rounded-lg`:`${O} text-gray-600 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg`;case"underline":return E?`${O} text-gray-900 dark:text-white border-b-2 border-gray-900 dark:border-white`:`${O} text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-200 border-b-2 border-transparent hover:border-gray-300 dark:hover:border-gray-600`;default:return E?`${O} text-blue-600 dark:text-blue-400 bg-blue-50 dark:bg-blue-900/20 border-b-2 border-blue-600 dark:border-blue-400`:`${O} text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-200 hover:bg-gray-50 dark:hover:bg-gray-700 border-b-2 border-transparent`}},A=n==="underline"?"flex gap-0 border-b border-gray-200 dark:border-gray-700":"flex gap-2";return d.jsx(W,{className:`relative ${o}`,style:a,id:g,...h,children:d.jsx(Ur,{className:A,children:w.map(v=>d.jsxs(Q,{type:"button",onClick:()=>p(v),disabled:v.disabled,className:x(v),children:[v.iconName&&d.jsx(de,{name:v.iconName,size:"sm"}),d.jsx(te,{children:v.label}),v.badge!==void 0&&d.jsx(W,{className:"flex items-center justify-center min-w-5 h-5 px-1.5 bg-red-500 text-white text-xs font-bold rounded-full",children:d.jsx(te,{children:v.badge})})]},v.id))})})},k0=Object.freeze(Object.defineProperty({__proto__:null,TabNavigation:sc},Symbol.toStringTag,{value:"Module"})),C0={Header:()=>Promise.resolve().then(()=>rd),Footer:()=>Promise.resolve().then(()=>sd),MobileNav:()=>Promise.resolve().then(()=>ld),SlotContainer:()=>Promise.resolve().then(()=>ed),NotificationCenter:()=>Promise.resolve().then(()=>td),ProductCard:()=>Promise.resolve().then(()=>Id),ImageGallery:()=>Promise.resolve().then(()=>Nl),ProductImageViewer:()=>Promise.resolve().then(()=>$f),QuantitySelector:()=>Promise.resolve().then(()=>zf),PostReactions:()=>Promise.resolve().then(()=>jf),RichTextEditor:()=>Promise.resolve().then(()=>Bf),HtmlContent:()=>Promise.resolve().then(()=>Wf),HtmlEditor:()=>Promise.resolve().then(()=>Kf),ExpandableContent:()=>Promise.resolve().then(()=>Vf),FileUploader:()=>Promise.resolve().then(()=>Wh),ConfirmDialog:()=>Promise.resolve().then(()=>qf),SocialLoginButtons:()=>Promise.resolve().then(()=>Vh),Toast:()=>Promise.resolve().then(()=>Qh),PageTransitionIndicator:()=>Promise.resolve().then(()=>Rh),PageTransitionBlur:()=>Promise.resolve().then(()=>e0),PageSkeleton:()=>Promise.resolve().then(()=>g0),PageLoading:()=>Promise.resolve().then(()=>p0),ThemeToggle:()=>Promise.resolve().then(()=>qc),Pagination:()=>Promise.resolve().then(()=>m0),SearchBar:()=>Promise.resolve().then(()=>b0),Avatar:()=>Promise.resolve().then(()=>Jc),AvatarUploader:()=>Promise.resolve().then(()=>v0),UserInfo:()=>Promise.resolve().then(()=>x0),Modal:()=>Promise.resolve().then(()=>Xf),TabNavigation:()=>Promise.resolve().then(()=>k0)},S0=({id:e,className:t,style:r,children:n,editorAttrs:o})=>d.jsx(W,{id:e,className:t,style:r,...o,children:n}),_0=({id:e,children:t,cols:r=1,responsive:n,gap:o,rowGap:a,colGap:s,autoRows:l,autoCols:g,flow:h="row",className:c="",style:i,onClick:u,editorAttrs:f})=>{const p=["grid"];if(r&&p.push(`grid-cols-${r}`),n&&(n.sm&&p.push(`sm:grid-cols-${n.sm}`),n.md&&p.push(`md:grid-cols-${n.md}`),n.lg&&p.push(`lg:grid-cols-${n.lg}`),n.xl&&p.push(`xl:grid-cols-${n.xl}`),n["2xl"]&&p.push(`2xl:grid-cols-${n["2xl"]}`)),o!==void 0&&o>0&&p.push(`gap-${o}`),a!==void 0&&a>0&&p.push(`gap-y-${a}`),s!==void 0&&s>0&&p.push(`gap-x-${s}`),l){const w={auto:"auto-rows-auto",min:"auto-rows-min",max:"auto-rows-max",fr:"auto-rows-fr"};p.push(w[l])}if(g){const w={auto:"auto-cols-auto",min:"auto-cols-min",max:"auto-cols-max",fr:"auto-cols-fr"};p.push(w[g])}const m={row:"grid-flow-row",col:"grid-flow-col",dense:"grid-flow-dense","row-dense":"grid-flow-row-dense","col-dense":"grid-flow-col-dense"};return p.push(m[h]),c&&p.push(c),d.jsx(W,{id:e,className:p.join(" "),style:i,onClick:u,...f,children:t})},E0=({id:e,children:t,direction:r="row",justify:n="start",align:o="stretch",wrap:a="nowrap",gap:s=0,grow:l=!1,shrink:g=!0,className:h="",style:c,onClick:i,editorAttrs:u})=>{const f=["flex"],p={row:"flex-row","row-reverse":"flex-row-reverse",col:"flex-col","col-reverse":"flex-col-reverse"};f.push(p[r]);const m={wrap:"flex-wrap",nowrap:"flex-nowrap","wrap-reverse":"flex-wrap-reverse"};f.push(m[a]);const w={start:"justify-start",end:"justify-end",center:"justify-center",between:"justify-between",around:"justify-around",evenly:"justify-evenly"};f.push(w[n]);const x={start:"items-start",end:"items-end",center:"items-center",baseline:"items-baseline",stretch:"items-stretch"};return f.push(x[o]),s>0&&f.push(`gap-${s}`),l===!0?f.push("flex-grow"):typeof l=="number"&&l>0&&f.push(`flex-grow-${l}`),g===!1?f.push("shrink-0"):g===!0?f.push("flex-shrink"):typeof g=="number"&&g>0&&f.push(`flex-shrink-${g}`),h&&f.push(h),d.jsx(W,{id:e,className:f.join(" "),style:c,onClick:i,...u,children:t})},T0=({id:e,title:t,subtitle:r,children:n,padding:o="md",background:a="none",maxWidth:s,centered:l=!1,border:g=!1,shadow:h="none",rounded:c=!1,className:i="",style:u,onClick:f,editorAttrs:p})=>{const m=[],w={none:"p-0",sm:"p-2",md:"p-4",lg:"p-6",xl:"p-8"};m.push(w[o]);const x={none:"",white:"bg-white dark:bg-gray-700",gray:"bg-gray-50 dark:bg-gray-800",primary:"bg-blue-50 dark:bg-blue-900/20",secondary:"bg-gray-50 dark:bg-gray-800"};if(a!=="none"&&m.push(x[a]),s){const v={sm:"max-w-sm",md:"max-w-md",lg:"max-w-lg",xl:"max-w-xl","2xl":"max-w-2xl","4xl":"max-w-4xl","6xl":"max-w-6xl","7xl":"max-w-7xl",full:"max-w-full"};m.push(v[s])}l&&m.push("mx-auto"),g&&m.push("border","border-gray-200","dark:border-gray-700");const A={none:"",sm:"shadow-sm",md:"shadow-md",lg:"shadow-lg",xl:"shadow-xl"};return h!=="none"&&m.push(A[h]),c&&m.push("rounded-lg"),i&&m.push(i),d.jsxs(Xa,{id:e,className:m.join(" "),style:u,onClick:f,...p,children:[(t||r)&&d.jsxs(W,{className:"mb-4",children:[t&&d.jsx(Wa,{className:"text-2xl font-bold text-gray-900 dark:text-white",children:t}),r&&d.jsx(Dt,{className:"mt-1 text-sm text-gray-600 dark:text-gray-400",children:r})]}),n]})},N0=({id:e,leftWidth:t="250px",rightWidth:r="300px",leftSlot:n,centerSlot:o,rightSlot:a,className:s="",style:l,editorAttrs:g})=>{const h=`flex flex-row w-full h-full ${s}`.trim(),c={width:t,flexShrink:0},i={flex:1,minWidth:0},u={width:r,flexShrink:0};return d.jsxs(W,{id:e,className:h,style:l,...g,children:[d.jsx(W,{className:"flex flex-col",style:c,children:n}),d.jsx(W,{className:"flex flex-col",style:i,children:o}),d.jsx(W,{className:"flex flex-col",style:u,children:a})]})},A0={identifier:"sirsoft-basic",vendor:"sirsoft",name:{ko:"Basic",en:"Basic"},version:"1.0.2",license:"MIT",description:{ko:"그누보드7 기본 사용자 템플릿",en:"Gnuboard7 default user template"},type:"user",locales:["ko","en"],author:{name:"sirsoft",email:"contact@sirsoft.com",url:"https://sirsoft.com"},release_date:"2026-01-07",g7_version:">=7.0.0",dependencies:{modules:{"sirsoft-board":">=1.0.0","sirsoft-ecommerce":">=1.0.0","sirsoft-page":">=1.0.0"},plugins:{"sirsoft-daum_postcode":">=1.0.0"}},assets:{css:["dist/css/components.css"],js:["dist/js/components.iife.js"],fonts:[],images:[]},components:{basic:["a","button","checkbox","div","form","h1","h2","h3","h4","hr","icon","img","input","label","li","nav","p","section","select","span","svg","table","tbody","td","textarea","th","thead","tr","ul"],composite:["header","footer","mobile-nav","product-card","rich-text-editor","image-gallery","quantity-selector","post-reactions","social-login-buttons","file-uploader","card","modal","toast","pagination","stat-card","status-badge","tab-navigation","empty-state","loading-spinner","breadcrumb","search-bar","dropdown"],layout:["container","flex","grid","section"]},preview:{thumbnail:"preview/thumbnail.png",screenshots:["preview/screenshot1.png","preview/screenshot2.png"]},error_config:{layouts:{401:"errors/401",403:"errors/403",404:"errors/404",500:"errors/500",503:"errors/503",maintenance:"errors/maintenance"}},features:{dark_mode:!0,responsive:!0,multi_language:!0,multi_currency:!0},github_url:"https://github.com/gnuboard/g7-template-sirsoft-basic",github_changelog_url:"https://github.com/gnuboard/g7-template-sirsoft-basic/blob/main/CHANGELOG.md",externals:[{id:"fontawesome",type:"style",url:"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css",preconnect:"https://cdnjs.cloudflare.com"},{id:"pretendard",type:"webfont",url:"https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css",preconnect:"https://cdn.jsdelivr.net",crossorigin:"anonymous"}]},lc={KRW:{locale:"ko-KR",decimals:0},USD:{locale:"en-US",decimals:2},JPY:{locale:"ja-JP",decimals:0},CNY:{locale:"zh-CN",decimals:2},EUR:{locale:"de-DE",decimals:2}};function Lr(e,t="KRW"){if(!Number.isFinite(e))return"0";const r=lc[t]||lc.KRW;try{return new Intl.NumberFormat(r.locale,{style:"currency",currency:t,minimumFractionDigits:r.decimals,maximumFractionDigits:r.decimals}).format(e)}catch{return e.toLocaleString()+(t==="KRW"?"원":"")}}function Qn(e,t,r=0){if(!e)return;const n=e.KRW?.value??e.KRW?.price??0,o={};for(const[a,s]of Object.entries(e)){const l=s?.value??s?.price??0;let g=0;r>0&&(a==="KRW"?g=r:n>0&&(g=r*l/n));const h=(l+g)*t;o[a]={value:h,formatted:Lr(h,a)}}return o}function Jn(e){const t={};for(const n of e){const o=n?.multiCurrencyTotalPrice;if(o)for(const[a,s]of Object.entries(o)){const l=s?.value??s?.price??0;t[a]=(t[a]??0)+l}}const r={};for(const[n,o]of Object.entries(t))r[n]={value:o,formatted:Lr(o,n)};return r}function ic(e,t){if(!e||!t?.length)return 0;let r=0;for(const n of t){const o=e[n.id];if(o==null)continue;const a=n.values?.find(s=>s.id===Number(o));a&&(r+=a.price_adjustment??0)}return r}function Rn(e){return e.name_localized?e.name_localized:typeof e.name=="string"?e.name:e.name?.ko??""}function M0(e,t,r){if(t&&r in t)return t[r];if(Array.isArray(e)){const n=e.find(o=>typeof o.key=="string"?o.key===r:o.key?.ko===r||Object.values(o.key).includes(r));return n?typeof n.value=="string"?n.value:n.value?.ko??Object.values(n.value)[0]:void 0}return e[r]}function O0(e,t){if(t)return t;if(!Array.isArray(e))return e;const r={};for(const n of e){const o=typeof n.key=="string"?n.key:n.key?.ko??Object.values(n.key)[0]??"",a=typeof n.value=="string"?n.value:n.value?.ko??Object.values(n.value)[0]??"";o&&(r[o]=a)}return r}function I0(e,t,r){return r.find(n=>!n?.option_values||!n?.is_active?!1:e.every(o=>{const a=Rn(o),s=t?.[a];return M0(n.option_values,n.option_values_localized,a)===s}))}function D0(e,t){const r=e.params;if(!r)return;const{optionGroups:n,options:o,selectedOptionItems:a,preferredCurrency:s}=r;let l;if(r.newGroupName&&r.newValue?l={...r.currentSelection??{},[r.newGroupName]:r.newValue}:l=r.currentSelection??{},!n?.every(O=>{const _=Rn(O);return l?.[_]}))return;const h=I0(n,l,o??[]);if(!h){t.setState?.({currentSelection:{},__mergeMode:"shallow"});return}const c=n.map(O=>l[Rn(O)]).join("_"),i=a??[];if(i.find(O=>O.id===c)){const O=window.G7Core;O?.toast?.warning?.(O?.t?.("sirsoft-ecommerce.shop.already_added_option")??"이미 추가된 옵션입니다."),t.setState?.({currentSelection:{},__mergeMode:"shallow"});return}const f=h.selling_price??0,p={};n.forEach(O=>{const _=Rn(O);p[_]=l[_]});const m=r.additionalOptionGroups??[],w={};for(const O of m){if(!O.is_required)continue;const _=O.values?.find(I=>I.is_default);_&&(w[O.id]=_.id)}const x=ic(w,m),A=f+x,v={id:c,optionId:h.id,options:p,optionValues:O0(h.option_values,h.option_values_localized),quantity:1,stock:h.stock_quantity??999,unitPrice:f,unitPriceFormatted:Lr(f,s),totalPrice:A,totalPriceFormatted:Lr(A,s),multiCurrencyUnitPrice:h.multi_currency_selling_price,multiCurrencyTotalPrice:Qn(h.multi_currency_selling_price,1,x),additionalOptionSelections:w,additionalOptionsTotal:x},E=[...i,v];t.setState?.({selectedOptionItems:E,selectedTotalMultiCurrency:Jn(E),currentSelection:{},__mergeMode:"shallow"})}function L0(e,t){const r=e.params;if(!r)return;const{selectedOptionItems:n,preferredCurrency:o}=r,a=Number(r.itemIndex)||0,s=Number(r.newQuantity)||1,l=(n??[]).map((g,h)=>{if(h!==a)return g;const c=g?.unitPrice??0,i=g?.additionalOptionsTotal??0,u=(c+i)*s;return{...g,quantity:s,totalPrice:u,totalPriceFormatted:Lr(u,o),multiCurrencyTotalPrice:Qn(g?.multiCurrencyUnitPrice,s,i)}});t.setState?.({selectedOptionItems:l,selectedTotalMultiCurrency:Jn(l)})}function P0(e,t){const r=e.params;if(!r)return;const{selectedOptionItems:n,additionalOptionGroups:o,preferredCurrency:a}=r,s=Number(r.itemIndex)||0,l=Number(r.additionalOptionId),g=Object.prototype.hasOwnProperty.call(r,"customText"),h=r.valueId===""||r.valueId==null?null:Number(r.valueId),c=(n??[]).map((i,u)=>{if(u!==s)return i;const f={...i.additionalOptionSelections??{}},p={...i.additionalOptionCustomTexts??{}};if(g){const v=String(r.customText??"");v.trim()===""?delete p[l]:p[l]=v}else h==null?(delete f[l],delete p[l]):(f[l]=h,(o??[]).find(O=>O.id===l)?.values?.find(O=>O.id===h)?.allow_custom_text||delete p[l]);const m=ic(f,o),w=i?.unitPrice??0,x=i?.quantity??1,A=(w+m)*x;return{...i,additionalOptionSelections:f,additionalOptionCustomTexts:p,additionalOptionsTotal:m,totalPrice:A,totalPriceFormatted:Lr(A,a),multiCurrencyTotalPrice:Qn(i?.multiCurrencyUnitPrice,x,m)}});t.setState?.({selectedOptionItems:c,selectedTotalMultiCurrency:Jn(c)})}function F0(e,t){const r=e.params;if(!r)return;const n=Number(r.itemIndex)||0,o=(r.selectedOptionItems??[]).filter((a,s)=>s!==n);t.setState?.({selectedOptionItems:o,selectedTotalMultiCurrency:Jn(o)})}function U0(e,t){const r=e.params;if(!r)return;const n=Math.max(1,Number(r.newQuantity)||1);t.setState?.({noOptionQuantity:n,noOptionTotalMultiCurrency:Qn(r.multiCurrencyUnitPrice,n)})}const cn=window.G7Core?.createLogger?.("Handler:Cart")??{log:(...e)=>console.log("[Handler:Cart]",...e),warn:(...e)=>console.warn("[Handler:Cart]",...e),error:(...e)=>console.error("[Handler:Cart]",...e)};function hr(e){const t=window.G7Core;t?.state?.setLocal?(t.state.setLocal(e),cn.log("Local state updated:",e)):cn.warn("G7Core.state.setLocal not available")}function cc(){return window.G7Core?.state?.getLocal?.()||{}}function $0(){return window.G7Core?.state?.get?.()||{}}function z0(e,t="info"){const r=window.G7Core;r?.toast?.show?r.toast.show(e,t):cn.warn("G7Core.toast.show not available, message:",e)}function H0(e){const t=window.G7Core;return t?.t?t.t(e):e}function dc(){const e=window.G7Core;if(e?.dispatch){const r=cc().selectedItems||[];e.dispatch({handler:"refetchDataSource",params:{dataSourceId:"cartItems"}}),cn.log("Refetching cartItems with selected_ids:",r)}else cn.warn("G7Core.dispatch not available")}function G0(e,t){const{itemId:r,selectedItems:n}=e?.params||{},o=n||[];let a;o.includes(r)?a=o.filter(h=>h!==r):a=[...o,r];const l=$0().cartItems?.data?.items||[],g=l.length>0&&a.length===l.length;hr({selectedItems:a,allSelected:g,selectedCount:a.length}),dc()}function j0(e,t){const{allItemIds:r,isSelected:n}=e?.params||{};hr({selectedItems:n?r:[],allSelected:n,selectedCount:n?r.length:0}),dc()}function B0(e,t){const{optionName:r,optionValue:n}=e?.params||{},a=cc().selectedOptions||{};hr({selectedOptions:{...a,[r]:n}})}function W0(e,t){const{targetIds:r}=e?.params||{};if(!r||r.length===0){z0(H0("shop.cart.select_items_to_delete"),"warning");return}hr({deleteModal:{visible:!0,targetIds:r}})}function K0(e,t){const{targetItem:r}=e?.params||{};hr({optionModal:{visible:!0,targetItem:r},selectedOptions:r?.options||{},selectedQuantity:r?.quantity})}function V0(e,t){const{selectedItems:r}=e?.params||{};if(!r||r.length===0){hr({isCalculating:!1});return}hr({isCalculating:!0})}const pr=window.G7Core?.createLogger?.("Handler:CartOptionChange")??{log:(...e)=>console.log("[Handler:CartOptionChange]",...e),warn:(...e)=>console.warn("[Handler:CartOptionChange]",...e),error:(...e)=>console.error("[Handler:CartOptionChange]",...e)};function Aa(e){return e.name_localized?e.name_localized:typeof e.name=="string"?e.name:e.name?.ko??""}function Y0(e,t,r){if(t&&r in t)return t[r];if(Array.isArray(e)){const n=e.find(o=>typeof o.key=="string"?o.key===r:o.key?.ko===r||Object.values(o.key).includes(r));return n?typeof n.value=="string"?n.value:n.value?.ko??Object.values(n.value)[0]:void 0}return e[r]}function uc(e,t,r){return!e||!t?.length?null:t.every(a=>{const s=Aa(a);return e[s]})?r?.find(a=>t.every(s=>{const l=Aa(s);return Y0(a.option_values,a.option_values_localized,l)===e[l]}))||null:(pr.log("Not all options selected yet"),null)}function X0(e,t){const{selectedOptions:r,optionGroups:n,options:o}=e?.params||{};pr.log("findMatchingOption called:",{selectedOptions:r,optionGroups:n,optionsCount:o?.length});const a=uc(r,n,o);return pr.log("Matched option:",a),{matchedOption:a}}function q0(e,t){const{currentOptionValues:r,optionGroups:n,options:o}=e?.params||{};if(pr.log("initCartOptionSelection called:",{currentOptionValues:r,optionGroups:n,optionsCount:o?.length}),!n?.length||!r)return pr.log("No option groups or current values, returning empty"),{selectedOptions:{},matchedOption:null};const a={};for(const l of n){const g=Aa(l),h=r[g],c=l.values_localized??(Array.isArray(l.values)?l.values.map(i=>typeof i=="string"?i:i?.ko??""):[]);h&&c.includes(h)&&(a[g]=h)}pr.log("Initial selectedOptions:",a);const s=uc(a,n,o||[]);return pr.log("Matched option:",s),{selectedOptions:a,matchedOption:s}}const dn="g7_cart_key",Z0="/api/modules/sirsoft-ecommerce/cart/key",Ma="g7_guest_order_token",fc="g7_guest_order_number",Oa="g7_guest_order_expires_at",at=window.G7Core?.createLogger?.("Handler:Storage")??{log:(...e)=>console.log("[Handler:Storage]",...e),warn:(...e)=>console.warn("[Handler:Storage]",...e),error:(...e)=>console.error("[Handler:Storage]",...e)};async function gc(){try{const e=await fetch(Z0,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"}});return e.ok?(await e.json()).data?.cart_key||null:(at.error("Failed to issue cartKey from API:",e.status),null)}catch(e){return at.error("Error issuing cartKey from API:",e),null}}function rr(e){const t=window.G7Core;t?.state?.set?(t.state.set(e),at.log("Global state updated:",e)):at.warn("G7Core.state.set not available")}function Q0(){try{const e=window.G7Config;return e?.user?e.user:(window.G7Core?.state?.get?.()||{}).currentUser||null}catch{return null}}async function J0(e,t){let r=null;try{r=localStorage.getItem(dn)}catch{}if(r)at.log("Existing cartKey loaded:",r);else if(r=await gc(),r)try{localStorage.setItem(dn,r),at.log("New cartKey issued from API:",r)}catch{}else at.error("Failed to issue cartKey from API");rr({cartKey:r})}function R0(e,t){try{return localStorage.getItem(dn)}catch{return null}}function hc(e,t){try{localStorage.removeItem(dn),at.log("cartKey removed from localStorage")}catch{}rr({cartKey:null})}async function ep(e,t){if(Q0()){hc();return}const n=await gc();if(n){try{localStorage.setItem(dn,n),at.log("New cartKey regenerated from API:",n)}catch{}rr({cartKey:n})}else at.error("Failed to regenerate cartKey from API")}function tp(e,t){const{key:r,value:n}=e?.params||{};if(!r){at.warn("saveToStorage: key is required");return}try{localStorage.setItem(r,n),at.log("Saved to storage:",r,n)}catch{}}function rp(e,t){const{key:r,defaultValue:n}=e?.params||{};if(!r)return at.warn("loadFromStorage: key is required"),n||null;try{return localStorage.getItem(r)||n||null}catch{return n||null}}function Ia(){try{sessionStorage.removeItem(Ma),sessionStorage.removeItem(fc),sessionStorage.removeItem(Oa)}catch{}}function np(e,t){let r=null,n=null;try{r=sessionStorage.getItem(Ma),n=sessionStorage.getItem(Oa)}catch{}let o=!1;if(r){const a=n?new Date(n).getTime():NaN;(isNaN(a)||a<=Date.now())&&(Ia(),r=null,o=!0)}if(r){rr({guestOrderToken:r}),at.log("Guest order token loaded from sessionStorage");return}if(!o){const s=window.G7Core?.state?.get?.("_global")?.guestOrderToken;if(typeof s=="string"&&s!==""){at.log("Guest order token preserved from in-memory _global (sessionStorage empty)");return}}rr({guestOrderToken:null}),at.log("No guest order token (visitor not authenticated)")}function op(e,t){const{token:r,orderNumber:n,expiresAt:o}=e?.params||{};if(!r||!n||!o){at.warn("saveGuestOrderToken: token, orderNumber, expiresAt are required");return}try{sessionStorage.setItem(Ma,r),sessionStorage.setItem(fc,n),sessionStorage.setItem(Oa,o)}catch{}rr({guestOrderToken:r})}function ap(e,t){Ia(),rr({guestOrderToken:null})}function sp(e,t){Ia(),rr({guestOrderToken:null})}function lp(e,t){const{product:r,priceField:n,currencyCode:o}=e,a=o||t.getState("_global.preferredCurrency")||"KRW",s=`multi_currency_${n}`,l=r[s];if(l&&l[a])return l[a].formatted;const g=`${n}_formatted`;return r[g]||String(r[n])}const Da={KRW:{code:"KRW",symbol:"₩",locale:"ko-KR",decimals:0},USD:{code:"USD",symbol:"$",locale:"en-US",decimals:2},JPY:{code:"JPY",symbol:"¥",locale:"ja-JP",decimals:0},CNY:{code:"CNY",symbol:"¥",locale:"zh-CN",decimals:2},EUR:{code:"EUR",symbol:"€",locale:"de-DE",decimals:2}};function ip(e,t){const{value:r,currencyCode:n,locale:o}=e,a=n||t.getState("_global.preferredCurrency")||"KRW",s=Da[a]||Da.KRW,l=o||s.locale;try{return new Intl.NumberFormat(l,{style:"currency",currency:s.code,minimumFractionDigits:s.decimals,maximumFractionDigits:s.decimals}).format(r)}catch{const g=r.toLocaleString(void 0,{minimumFractionDigits:s.decimals,maximumFractionDigits:s.decimals});return`${s.symbol}${g}`}}function cp(e){return Da[e]?.symbol||e}const La=window.G7Core?.createLogger?.("Handler:Currency")??{log:(...e)=>console.log("[Handler:Currency]",...e),warn:(...e)=>console.warn("[Handler:Currency]",...e),error:(...e)=>console.error("[Handler:Currency]",...e)},pc="g7_preferred_currency",dp="KRW";function up(e,t){const{defaultCurrency:r=dp}=e;let n=r;try{if(typeof window<"u"&&window.localStorage){const o=localStorage.getItem(pc);o&&mc(o)&&(n=o)}}catch{La.warn("localStorage 접근 불가, 기본 통화 사용:",r)}return t.setState("global",{preferredCurrency:n}),n}function fp(e,t){const{currencyCode:r}=e;if(!mc(r)){La.warn("유효하지 않은 통화 코드:",r);return}try{typeof window<"u"&&window.localStorage&&localStorage.setItem(pc,r)}catch{La.warn("localStorage 저장 실패")}t.setState("global",{preferredCurrency:r})}function mc(e){return typeof e=="string"&&/^[A-Z]{3}$/.test(e)}const Pr=window.G7Core?.createLogger?.("Handler:SetTheme")??{log:(...e)=>console.log("[Handler:SetTheme]",...e),warn:(...e)=>console.warn("[Handler:SetTheme]",...e),error:(...e)=>console.error("[Handler:SetTheme]",...e)},Pa=["auto","light","dark"],bc="g7_color_scheme",gp=e=>e==="auto"?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":e,eo=e=>{const t=gp(e);document.documentElement.setAttribute("data-theme",t),t==="dark"?document.documentElement.classList.add("dark"):document.documentElement.classList.remove("dark")};function hp(){try{const e=localStorage.getItem(bc),t=e&&Pa.includes(e)?e:"auto";eo(t),Pr.log("Initial theme applied:",t)}catch(e){Pr.warn("Failed to load initial theme:",e),eo("auto")}}async function pp(e,t){const r=e?.target;if(r&&typeof r=="string"&&Pa.includes(r)){eo(r);return}hp()}async function mp(e,t){let r;if(e?.target&&typeof e.target=="string"&&!e.target.includes("{{")&&(r=e.target),!r||typeof r!="string"){Pr.warn("Invalid theme:",r);return}if(!Pa.includes(r)){Pr.warn("Unsupported theme:",r);return}const n=r;try{localStorage.setItem(bc,n)}catch(o){Pr.error("Failed to save theme to localStorage:",o);return}eo(n),Pr.log("Theme changed to:",n)}const bp=window.G7Core?.createLogger?.("Handler:RedirectToLoginWithReturn")??{log:(...e)=>console.log("[Handler:RedirectToLoginWithReturn]",...e),warn:(...e)=>console.warn("[Handler:RedirectToLoginWithReturn]",...e),error:(...e)=>console.error("[Handler:RedirectToLoginWithReturn]",...e)};async function yp(e,t){const r=window.G7Core;if(!r?.dispatch){bp.error("G7Core.dispatch 가 초기화되지 않아 로그인 리다이렉트를 실행할 수 없습니다.");return}const n=window.location.pathname+window.location.search;await r.dispatch({handler:"navigate",params:{path:"/login",query:{redirect:n}}})}const Fa=window.G7Core?.createLogger?.("Handler:DownloadAttachment")??{log:(...e)=>console.log("[Handler:DownloadAttachment]",...e),warn:(...e)=>console.warn("[Handler:DownloadAttachment]",...e),error:(...e)=>console.error("[Handler:DownloadAttachment]",...e)};async function vp(e,t){const r=window.G7Core,{url:n,filename:o}=e?.params||{};if(!n){Fa.warn("다운로드 URL 이 없어 요청을 건너뜁니다.");return}if(!r?.api?.get){Fa.error("G7Core.api.get 이 초기화되지 않아 다운로드를 실행할 수 없습니다.");return}try{const a=await r.api.get(n,{responseType:"blob"});if(a){const s=URL.createObjectURL(a),l=document.createElement("a");l.href=s,l.download=o||"",document.body.appendChild(l),l.click(),document.body.removeChild(l),URL.revokeObjectURL(s)}}catch(a){Fa.error("첨부파일 다운로드 실패",a),r?.toast?.error?.(r?.t?.("common.download_failed")??"Download failed")}}const to={"sirsoft-basic.addSelectedItemIfComplete":D0,"sirsoft-basic.updateSelectedItemQuantity":L0,"sirsoft-basic.removeSelectedItem":F0,"sirsoft-basic.updateNoOptionQuantity":U0,"sirsoft-basic.setBlockAdditionalOption":P0,"sirsoft-basic.getDisplayPrice":lp,"sirsoft-basic.formatCurrency":ip,"sirsoft-basic.getCurrencySymbol":cp,"sirsoft-basic.loadPreferredCurrency":up,"sirsoft-basic.savePreferredCurrency":fp,setTheme:mp,initTheme:pp,redirectToLoginWithReturn:yp,downloadAttachment:vp,toggleCartItemSelection:G0,selectAllCartItems:j0,setCartOption:B0,openCartDeleteModal:W0,openCartOptionModal:K0,recalculateCart:V0,findMatchingOption:X0,initCartOptionSelection:q0,initCartKey:J0,getCartKey:R0,clearCartKey:hc,regenerateCartKey:ep,saveToStorage:tp,loadFromStorage:rp,initGuestOrderToken:np,saveGuestOrderToken:op,clearGuestOrderToken:ap,clearGuestTokenOnEntry:sp},un=window.G7Core?.createLogger?.("Template:sirsoft-basic:IdentityLauncher")??{log:(...e)=>console.log("[Template:sirsoft-basic:IdentityLauncher]",...e),warn:(...e)=>console.warn("[Template:sirsoft-basic:IdentityLauncher]",...e),error:(...e)=>console.error("[Template:sirsoft-basic:IdentityLauncher]",...e)};function wp(e){const t=window.G7Core,r=t?.state?.getLocal?.()??{},n=t?.state?.getGlobal?.()??t?.state?.get?.()??{},o=(...g)=>g.find(h=>typeof h=="string"&&h.length>0),a=o(e.target?.email,n?.currentUser?.email,n?.user?.email,n?.auth?.user?.email,e.purpose==="signup"?r?.registerForm?.email:void 0,e.purpose==="password_reset"?r?.passwordResetForm?.email:void 0,e.purpose==="password_reset"?r?.email:void 0),s=o(e.target?.phone,n?.currentUser?.phone,n?.user?.phone,n?.auth?.user?.phone);if(!a&&!s)return null;const l={};return a&&(l.email=a),s&&(l.phone=s),l}function xp(){const t=window.G7Core?.api?.getToken?.()??null;return t?{Authorization:`Bearer ${t}`}:{}}function kp(){try{const e=typeof window<"u"?window.localStorage?.getItem("g7_locale"):null;return e?{"Accept-Language":e}:{}}catch{return{}}}async function Cp(e,t){const r={purpose:e.purpose};e.provider_id&&(r.provider_id=e.provider_id),t&&(r.target=t);const n=e.challenge_start_url||"/api/identity/challenges",o=await fetch(n,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json",Accept:"application/json",...kp(),...xp()},body:JSON.stringify(r)}),a=await o.json().catch(()=>null);if(!o.ok||!a?.success){const l=a?.message??`Challenge 시작 실패 (HTTP ${o.status})`;throw new Error(l)}const s=a.data??a;return{id:s.id,expires_at:s.expires_at,render_hint:s.render_hint??e.render_hint??"text_code",public_payload:s.public_payload,redirect_url:s.redirect_url,max_attempts:typeof s.max_attempts=="number"?s.max_attempts:void 0}}async function Sp(e){const t=window.G7Core,r=t?.identity;if(!t?.dispatch||!t?.state||!r)return un.error("G7Core 또는 G7Core.identity 가 초기화되지 않아 launcher 를 실행할 수 없습니다."),{status:"failed",failureCode:"G7_NOT_READY"};if(e.render_hint==="external_redirect"||e.redirect_url)return r.redirectExternally(e);const n=wp(e);let o;try{o=await Cp(e,n)}catch(p){un.error("Challenge 시작 실패:",p);try{await t.dispatch({handler:"toast",params:{type:"error",message:p instanceof Error?p.message:"본인인증 시작에 실패했습니다."}})}catch{}return{status:"failed",failureCode:"CHALLENGE_START_FAILED",reason:p instanceof Error?p.message:String(p)}}if(o.redirect_url)return r.redirectExternally({...e,render_hint:"external_redirect",redirect_url:o.redirect_url});const a=o.expires_at?new Date(o.expires_at).getTime():0,s=a>0?Math.max(0,Math.floor((a-Date.now())/1e3)):0,l=typeof o.max_attempts=="number"?o.max_attempts:0;t.state.set({identityChallenge:{policy_key:e.policy_key,purpose:e.purpose,provider_id:e.provider_id??null,render_hint:o.render_hint,challenge_id:o.id,expires_at:o.expires_at,public_payload:o.public_payload??{},target:n??null,code:"",error:null,attempts:0,maxAttempts:l,remainingSeconds:s,resendCooldown:0}});let g=a,h=0;const c=window.setInterval(()=>{const p=g>0?Math.max(0,Math.floor((g-Date.now())/1e3)):0;h=Math.max(0,h-1),t.state.set({identityChallenge:{remainingSeconds:p,resendCooldown:h}})},1e3);let i=null;try{i=t.state.subscribe?.(p=>{const m=p?.identityChallenge?.expires_at;if(typeof m=="string"){const x=new Date(m).getTime();Number.isFinite(x)&&x!==g&&(g=x)}const w=p?.identityChallenge?.resendCooldown;typeof w=="number"&&w>h&&(h=w)})??null}catch{}const u=r.createDeferred();try{await t.dispatch({handler:"openModal",target:"identity-challenge-modal"})}catch(p){return un.error("openModal 실패 — 풀페이지로 폴백:",p),window.clearInterval(c),i?.(),r.redirectExternally({...e,render_hint:"external_redirect",redirect_url:`/identity/challenge?challenge_id=${encodeURIComponent(o.id)}&return=${encodeURIComponent(window.location.href)}`})}const f=await u;return window.clearInterval(c),i?.(),f}function _p(){const e=window.G7Core?.identity;if(!e?.setLauncher){un.warn("G7Core.identity 가 아직 초기화되지 않아 launcher 등록을 건너뜁니다. 코어 부트스트랩 순서를 확인하세요.");return}e.setLauncher(Sp),un.log("IDV launcher registered (sirsoft-basic)")}function Ep(e){const t=e.icons;return Array.isArray(t)?t.filter(r=>!!r&&typeof r=="object"&&typeof r.value=="string"):[]}function Tp(e,t){const r=e.label;return typeof r=="string"?r.startsWith("$t:")?t(r.slice(3)):r:e.value}function Np(e,t,r){if(r==="")return!0;const n=r.toLowerCase();return e.value.toLowerCase().includes(n)||t.toLowerCase().includes(n)?!0:(e.keywords??[]).some(o=>o.toLowerCase().includes(n))}function Ap({entry:e}){const t=e.preview;return t?.html?d.jsx("span",{className:"g7le-icon-preview",dangerouslySetInnerHTML:{__html:t.html},style:$a}):t?.className?d.jsx("span",{className:`g7le-icon-preview ${t.className}`,style:$a}):d.jsx("i",{className:`fas fa-${e.value}`,style:$a,"aria-hidden":"true"})}function Mp({control:e,value:t,onChange:r,t:n}){const o=Ep(e),a=t==null?"":String(t),s=typeof e.iconColumns=="number"?e.iconColumns:6,l=e.iconSearchPlaceholder,g=typeof l=="string"&&l.startsWith("$t:")?n(l.slice(3)):n("layout_editor.icon_picker.search_placeholder"),[h,c]=k.useState("");if(o.length===0)return d.jsx("div",{className:"g7le-widget g7le-widget--icon-picker","data-testid":"g7le-widget-icon-picker",style:yc,children:d.jsx("input",{type:"text",className:"g7le-widget g7le-widget--icon-free","data-testid":"g7le-widget-icon-picker-free",value:a,placeholder:n("layout_editor.icon_picker.free_input_hint"),onChange:f=>r(f.target.value===""?void 0:f.target.value),style:vc})});const i=f=>Tp(f,n),u=o.filter(f=>Np(f,i(f),h));return d.jsxs("div",{className:"g7le-widget g7le-widget--icon-picker","data-testid":"g7le-widget-icon-picker",style:yc,children:[d.jsx("input",{type:"text",className:"g7le-widget g7le-widget--icon-search","data-testid":"g7le-widget-icon-picker-search",value:h,placeholder:g,onChange:f=>c(f.target.value),style:vc}),d.jsxs("div",{className:"g7le-icon-grid","data-testid":"g7le-widget-icon-picker-grid",style:{...Op,gridTemplateColumns:`repeat(${s}, minmax(0, 1fr))`},children:[d.jsx("button",{type:"button","data-testid":"g7le-icon-cell-none",title:n("layout_editor.icon_picker.none"),onClick:()=>r(void 0),"aria-pressed":a==="",style:a===""?wc:Ua,children:d.jsx("span",{style:Ip,children:"—"})}),u.map(f=>{const p=f.value===a;return d.jsx("button",{type:"button","data-testid":`g7le-icon-cell-${f.value}`,title:i(f),"aria-pressed":p,onClick:()=>r(f.value),style:p?wc:Ua,children:d.jsx(Ap,{entry:f})},f.value)})]}),u.length===0&&d.jsx("div",{"data-testid":"g7le-widget-icon-picker-empty",style:Dp,children:n("layout_editor.icon_picker.no_results")})]})}const yc={display:"flex",flexDirection:"column",gap:6,width:"100%"},vc={padding:"5px 8px",fontSize:12,border:"1px solid #cbd5e1",borderRadius:6,width:"100%"},Op={display:"grid",gap:4,maxHeight:220,overflowY:"auto",padding:2},Ua={display:"flex",alignItems:"center",justifyContent:"center",minHeight:34,padding:4,border:"1px solid #e2e8f0",borderRadius:6,background:"#fff",cursor:"pointer"},wc={...Ua,border:"2px solid #2563eb",background:"#eff6ff"},$a={display:"inline-flex",alignItems:"center",justifyContent:"center",fontSize:16,lineHeight:1},Ip={fontSize:10,color:"#475569",fontFamily:"monospace",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",maxWidth:"100%"},Dp={fontSize:11,color:"#94a3b8",fontStyle:"italic",padding:"4px 2px"},xc=window.G7Core?.createLogger?.("Template:sirsoft-basic:EditorWidgets")??{log:(...e)=>console.log("[Template:sirsoft-basic:EditorWidgets]",...e),warn:(...e)=>console.warn("[Template:sirsoft-basic:EditorWidgets]",...e)};function Lp(){if(typeof window>"u")return;const e=window.G7Core?.layoutEditor;if(!e?.registerWidget){xc.warn("G7Core.layoutEditor 미노출 — icon-picker 위젯 등록 보류");return}e.registerWidget("icon-picker",Mp),xc.log("편집기 위젯 'icon-picker' 등록됨(Font Awesome 검색 그리드)")}const za=window.G7Core?.createLogger?.("Template:sirsoft-basic")??{log:(...e)=>console.log("[Template:sirsoft-basic]",...e),warn:(...e)=>console.warn("[Template:sirsoft-basic]",...e),error:(...e)=>console.error("[Template:sirsoft-basic]",...e)};typeof window<"u"&&(window.G7TemplateHandlers=to);function kc(){if(typeof window<"u"){let e=0;const t=50,r=()=>{const n=window.G7Core?.getActionDispatcher?.();n?(Object.entries(to).forEach(([o,a])=>{n.registerHandler(o,a)}),za.log(`${Object.keys(to).length} custom handler(s) registered:`,Object.keys(to)),_p()):(e++,e<=t?(za.warn(`ActionDispatcher not found, retrying... (${e}/${t})`),setTimeout(r,100)):za.error("Failed to register handlers: ActionDispatcher not available after maximum retries"))};document.readyState==="complete"?r():window.addEventListener("load",r)}}return Lp(),kc(),J.A=ao,J.Avatar=$r,J.AvatarUploader=Ta,J.Button=Q,J.Checkbox=Ya,J.Code=Vc,J.ConfirmDialog=Ro,J.Container=S0,J.Div=W,J.ExpandableContent=Zo,J.FileInput=Ga,J.FileUploader=Xn,J.Flex=E0,J.Footer=es,J.Form=so,J.Grid=_0,J.H1=Lc,J.H2=Wa,J.H3=gn,J.H4=Ka,J.Header=Ja,J.Hr=lo,J.HtmlContent=Yo,J.HtmlEditor=Dl,J.Icon=de,J.IconName=Je,J.ImageGallery=Tr,J.Img=Lt,J.Input=xt,J.Label=yr,J.Li=Xt,J.MobileNav=ts,J.Modal=Qo,J.Nav=Ur,J.NotificationCenter=mn,J.Ol=Pc,J.Optgroup=zc,J.Option=$c,J.P=Dt,J.PageLoading=Ri,J.PageSkeleton=Ea,J.PageTransitionBlur=Ca,J.PageTransitionIndicator=ka,J.Pagination=ec,J.PasswordInput=Ba,J.PostReactions=Ol,J.ProductCard=ps,J.ProductImageViewer=An,J.QuantitySelector=Al,J.RichTextEditor=Il,J.SearchBar=rc,J.Section=Xa,J.SectionLayout=T0,J.Select=Va,J.SlotContainer=pn,J.SocialLoginButtons=Wi,J.Span=te,J.Svg=fn,J.TabNavigation=sc,J.Table=Hc,J.Tbody=jc,J.Td=Kc,J.Textarea=no,J.Th=Wc,J.Thead=Gc,J.ThemeToggle=hn,J.ThreeColumnLayout=N0,J.Toast=xa,J.Tr=Bc,J.Ul=oo,J.UserInfo=ac,J.availablePasswordRules=ro,J.compositeComponents=C0,J.defaultPasswordRules=ja,J.initTemplate=kc,J.templateMetadata=A0,Object.defineProperty(J,Symbol.toStringTag,{value:"Module"}),J})({},ReactJSXRuntime,React,ReactDOM); //# sourceMappingURL=components.iife.js.map diff --git a/templates/_bundled/sirsoft-basic/dist/js/components.iife.js.map b/templates/_bundled/sirsoft-basic/dist/js/components.iife.js.map index 4798c8f7..6d4c5d71 100644 --- a/templates/_bundled/sirsoft-basic/dist/js/components.iife.js.map +++ b/templates/_bundled/sirsoft-basic/dist/js/components.iife.js.map @@ -1 +1 @@ -{"version":3,"file":"components.iife.js","sources":["../../src/components/basic/Button.tsx","../../src/components/basic/Div.tsx","../../src/components/basic/Span.tsx","../../src/components/basic/Svg.tsx","../../src/components/basic/Input.tsx","../../src/components/basic/FileInput.tsx","../../src/components/basic/IconTypes.ts","../../src/components/basic/Icon.tsx","../../src/components/basic/PasswordInput.tsx","../../src/components/basic/Textarea.tsx","../../src/components/basic/Label.tsx","../../src/components/basic/P.tsx","../../src/components/basic/Img.tsx","../../src/components/basic/H1.tsx","../../src/components/basic/H2.tsx","../../src/components/basic/H3.tsx","../../src/components/basic/H4.tsx","../../src/components/basic/Ul.tsx","../../src/components/basic/Ol.tsx","../../src/components/basic/Li.tsx","../../src/components/basic/A.tsx","../../src/components/basic/Form.tsx","../../src/components/basic/Select.tsx","../../src/components/basic/Option.tsx","../../src/components/basic/Optgroup.tsx","../../src/components/basic/Checkbox.tsx","../../src/components/basic/Table.tsx","../../src/components/basic/Thead.tsx","../../src/components/basic/Tbody.tsx","../../src/components/basic/Tr.tsx","../../src/components/basic/Th.tsx","../../src/components/basic/Td.tsx","../../src/components/basic/Nav.tsx","../../src/components/basic/Section.tsx","../../src/components/basic/Code.tsx","../../src/components/basic/Hr.tsx","../../src/components/basic/Header.tsx","../../src/components/composite/ThemeToggle.tsx","../../src/components/composite/Avatar.tsx","../../src/components/composite/SlotContainer.tsx","../../src/components/composite/NotificationCenter.tsx","../../src/components/composite/Header.tsx","../../src/components/basic/Footer.tsx","../../src/components/composite/Footer.tsx","../../src/components/composite/MobileNav.tsx","../../node_modules/dompurify/dist/purify.es.mjs","../../src/components/composite/ProductCard.tsx","../../node_modules/yet-another-react-lightbox/dist/types.js","../../node_modules/yet-another-react-lightbox/dist/index.js","../../node_modules/yet-another-react-lightbox/dist/plugins/zoom/index.js","../../node_modules/yet-another-react-lightbox/dist/plugins/counter/index.js","../../node_modules/yet-another-react-lightbox/dist/plugins/slideshow/index.js","../../node_modules/yet-another-react-lightbox/dist/plugins/fullscreen/index.js","../../node_modules/yet-another-react-lightbox/dist/plugins/thumbnails/index.js","../../src/components/basic/I.tsx","../../src/components/composite/ImageGallery.tsx","../../src/components/composite/ProductImageViewer.tsx","../../src/components/composite/QuantitySelector.tsx","../../src/components/composite/PostReactions.tsx","../../src/components/composite/RichTextEditor.tsx","../../src/components/composite/HtmlContent.tsx","../../src/components/composite/HtmlEditor.tsx","../../src/components/composite/ExpandableContent.tsx","../../src/components/composite/Modal.tsx","../../src/components/composite/ConfirmDialog.tsx","../../src/components/composite/FileUploader/FileUploaderContext.tsx","../../node_modules/browser-image-compression/dist/browser-image-compression.mjs","../../src/components/composite/FileUploader/utils.ts","../../src/components/composite/FileUploader/useFileUploader.ts","../../src/components/composite/FileUploader/FileDropZone.tsx","../../node_modules/@dnd-kit/utilities/dist/utilities.esm.js","../../node_modules/@dnd-kit/accessibility/dist/accessibility.esm.js","../../node_modules/@dnd-kit/core/dist/core.esm.js","../../node_modules/@dnd-kit/sortable/dist/sortable.esm.js","../../src/components/composite/FileUploader/SortableThumbnailItem.tsx","../../src/components/composite/FileUploader/FileList.tsx","../../src/components/composite/FileUploader/FileUploader.tsx","../../src/components/composite/SocialLoginButtons.tsx","../../src/components/composite/Toast.tsx","../../src/components/composite/PageTransitionIndicator.tsx","../../src/components/composite/PageTransitionBlur.tsx","../../src/components/composite/PageSkeleton.tsx","../../src/components/composite/PageLoading.tsx","../../src/components/composite/Pagination.tsx","../../src/components/composite/SearchBar.tsx","../../src/components/composite/AvatarUploader.tsx","../../src/components/composite/UserInfo.tsx","../../src/components/composite/TabNavigation.tsx","../../src/components/composite/index.ts","../../src/components/layout/Container.tsx","../../src/components/layout/Grid.tsx","../../src/components/layout/Flex.tsx","../../src/components/layout/SectionLayout.tsx","../../src/components/layout/ThreeColumnLayout.tsx","../../src/handlers/productOptions.ts","../../src/handlers/cartHandlers.ts","../../src/handlers/cartOptionChange.ts","../../src/handlers/storageHandlers.ts","../../src/handlers/getDisplayPrice.ts","../../src/handlers/formatCurrency.ts","../../src/handlers/loadPreferredCurrency.ts","../../src/handlers/setThemeHandler.ts","../../src/handlers/redirectToLoginWithReturn.ts","../../src/handlers/downloadAttachment.ts","../../src/handlers/index.ts","../../src/handlers/identityLauncher.ts","../../src/layout-editor/IconPickerWidget.tsx","../../src/layout-editor/registerEditorWidgets.ts","../../src/index.ts"],"sourcesContent":["import React, { forwardRef } from 'react';\n\n// G7Core 전역 객체의 스타일 헬퍼 접근\nconst G7Core = () => (window as any).G7Core;\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes {\n variant?: 'primary' | 'secondary' | 'danger' | 'success';\n size?: 'sm' | 'md' | 'lg';\n}\n\n/**\n * 기본 버튼 컴포넌트\n */\nexport const Button = forwardRef(({\n children,\n variant = 'primary',\n size = 'md',\n className = '',\n ...props\n}, ref) => {\n const baseClasses = 'inline-flex items-center justify-center';\n\n // G7Core.style.mergeClasses를 사용하여 충돌하는 Tailwind 클래스 병합\n const mergedClassName = G7Core()?.style?.mergeClasses?.(baseClasses, className)\n ?? `${baseClasses} ${className}`;\n\n return (\n \n {children}\n \n );\n});\n\nButton.displayName = 'Button';\n","import React from 'react';\n\nexport interface DivProps extends React.HTMLAttributes {\n ref?: React.Ref;\n}\n\n/**\n * 기본 div 컴포넌트\n */\nexport const Div = React.forwardRef(({\n children,\n className = '',\n ...props\n}, ref) => {\n return (\n \n {children}\n \n );\n});\n","import React from 'react';\n\nexport interface SpanProps extends React.HTMLAttributes {}\n\n/**\n * 기본 span 컴포넌트\n */\nexport const Span: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface SvgProps extends React.SVGAttributes {}\n\n/**\n * 기본 svg 컴포넌트\n */\nexport const Svg: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React, { useRef, useCallback, useState, useEffect, forwardRef, useImperativeHandle } from 'react';\n\nexport interface InputProps extends React.InputHTMLAttributes {\n label?: string;\n error?: string;\n}\n\n/**\n * 기본 입력 필드 컴포넌트\n *\n * IME(한글 등) 조합 중에는 외부 onChange 이벤트를 발생시키지 않습니다.\n * 내부 로컬 상태를 사용하여 입력을 처리하고, 조합이 완료되면 외부에 알립니다.\n *\n * forwardRef를 사용하여 외부에서 ref로 input 요소에 접근할 수 있습니다.\n * 예: indeterminate 상태 설정 시 ref.current.indeterminate = true\n */\nexport const Input = forwardRef(({\n label,\n error,\n className = '',\n onChange,\n onKeyPress,\n value,\n defaultValue,\n type = 'text',\n checked,\n defaultChecked,\n ...props\n}, ref) => {\n // radio/checkbox 타입인지 확인\n const isCheckableType = type === 'radio' || type === 'checkbox';\n\n // IME 조합 중인지 추적 (text input에만 필요)\n const isComposingRef = useRef(false);\n // input 요소 참조\n const internalRef = useRef(null);\n\n // 외부 ref와 내부 ref를 연결\n useImperativeHandle(ref, () => internalRef.current as HTMLInputElement);\n\n // 내부 로컬 값 (IME 조합 중에도 화면에 표시됨) - text input에만 사용\n const [localValue, setLocalValue] = useState(\n (value as string) ?? (defaultValue as string) ?? ''\n );\n\n // 외부 value prop이 변경되면 로컬 값도 동기화 (text input에만 적용)\n useEffect(() => {\n if (!isCheckableType && !isComposingRef.current && value !== undefined) {\n setLocalValue(value as string);\n }\n }, [value, isCheckableType]);\n\n const handleCompositionStart = useCallback(() => {\n isComposingRef.current = true;\n }, []);\n\n const handleCompositionEnd = useCallback(\n (e: React.CompositionEvent) => {\n isComposingRef.current = false;\n // 조합 완료 후 onChange 이벤트 발생\n if (onChange) {\n // 현재 input의 실제 값을 사용\n const currentValue = (e.target as HTMLInputElement).value;\n setLocalValue(currentValue);\n\n // 새로운 ChangeEvent 생성\n const changeEvent = new Event('change', { bubbles: true }) as unknown as React.ChangeEvent;\n Object.defineProperty(changeEvent, 'target', {\n writable: false,\n value: { value: currentValue },\n });\n Object.defineProperty(changeEvent, 'currentTarget', {\n writable: false,\n value: { value: currentValue },\n });\n\n onChange(changeEvent);\n }\n },\n [onChange]\n );\n\n const handleChange = useCallback(\n (e: React.ChangeEvent) => {\n const newValue = e.target.value;\n // 항상 로컬 값은 업데이트 (화면에 입력이 보이도록)\n setLocalValue(newValue);\n\n // IME 조합 중이면 외부 onChange를 호출하지 않음\n if (isComposingRef.current) {\n return;\n }\n if (onChange) {\n onChange(e);\n }\n },\n [onChange]\n );\n\n const handleKeyPress = useCallback(\n (e: React.KeyboardEvent) => {\n // IME 조합 중이면 keypress 무시 (Enter 등)\n if (isComposingRef.current) {\n return;\n }\n if (onKeyPress) {\n onKeyPress(e);\n }\n },\n [onKeyPress]\n );\n\n // HTML 표준 속성이 아닌 것들을 필터링 (템플릿 엔진 내부 속성)\n const { loadingactions, formdata, ...validProps } = props as any;\n\n // radio/checkbox: checked 속성 사용\n // text input: value 속성 사용 (IME 처리 포함)\n if (isCheckableType) {\n return (\n \n );\n }\n\n // text input: controlled/uncontrolled 구분\n const inputProps = value !== undefined\n ? { value: localValue }\n : { defaultValue };\n\n return (\n \n );\n});\n\n// displayName 설정 (React DevTools에서 컴포넌트 이름 표시)\nInput.displayName = 'Input';","// e2e:allow편집기 passthrough 결함#2 수정(admin 동기, data-editor-*/id 를 시각적 루트 Div 로 라우팅). 단위 회귀는 FileInput.test.tsx passthrough describe.\nimport React, { forwardRef, useRef, useCallback, useState } from 'react';\nimport { Div } from './Div';\nimport { Span } from './Span';\nimport { Svg } from './Svg';\nimport { Input } from './Input';\nimport { Button } from './Button';\n\nexport interface FileInputProps extends Omit, 'type' | 'onChange' | 'onError'> {\n /** 허용되는 파일 확장자 (예: \".zip,.pdf\") */\n accept?: string;\n /** 최대 파일 크기 (MB) */\n maxSize?: number;\n /** 파일 선택 시 콜백 */\n onChange?: (file: File | null) => void;\n /** 에러 발생 시 콜백 */\n onError?: (error: string) => void;\n /** 버튼 텍스트 */\n buttonText?: string;\n /** 빈 상태 텍스트 */\n placeholder?: string;\n}\n\n/**\n * 파일 업로드 입력 컴포넌트\n *\n * ZIP 파일 등의 파일 업로드를 처리하며, 파일 크기 검증을 지원합니다.\n */\nexport const FileInput = forwardRef(({\n accept,\n maxSize,\n onChange,\n onError,\n buttonText = 'Browse',\n placeholder = 'No file selected',\n className = '',\n disabled,\n ...props\n}, ref) => {\n const internalRef = useRef(null);\n const inputRef = (ref as React.RefObject) || internalRef;\n const [fileName, setFileName] = useState('');\n\n // 레이아웃 편집기 식별 표식(data-editor-*) 과 DOM id 는 시각적 루트(
)에 부착해야\n // 캔버스에서 선택/편집이 닿는다. basic 컴포넌트라 DynamicRenderer 가 개별 data-editor-*\n // 키를 props 로 주입하는데, 숨겨진 는 0×0 이라 식별 표식이 닿아도\n // 선택 불가. 식별/표식 키만 분리해 루트로 보낸다.\n const rootEditorProps: Record = {};\n const inputProps: Record = {};\n Object.entries(props as Record).forEach(([key, val]) => {\n if (key.startsWith('data-editor-') || key === 'id' || key === 'onMouseMove' || key === 'onMouseLeave') {\n rootEditorProps[key] = val;\n } else {\n inputProps[key] = val;\n }\n });\n\n const handleClick = useCallback(() => {\n if (!disabled && inputRef.current) {\n inputRef.current.click();\n }\n }, [disabled, inputRef]);\n\n const handleChange = useCallback((e: React.ChangeEvent) => {\n const file = e.target.files?.[0] || null;\n\n if (!file) {\n setFileName('');\n onChange?.(null);\n return;\n }\n\n // 파일 크기 검증 (MB 단위)\n if (maxSize && file.size > maxSize * 1024 * 1024) {\n const errorMsg = `File size exceeds ${maxSize}MB limit`;\n onError?.(errorMsg);\n // 입력 초기화\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n setFileName('');\n return;\n }\n\n setFileName(file.name);\n onChange?.(file);\n }, [maxSize, onChange, onError, inputRef]);\n\n const handleClear = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n setFileName('');\n onChange?.(null);\n }, [onChange, inputRef]);\n\n return (\n
\n \n \n {buttonText}\n \n \n {fileName || placeholder}\n \n {fileName && !disabled && (\n \n \n \n \n \n )}\n
\n );\n});\n\nFileInput.displayName = 'FileInput';\n","/**\n * Font Awesome 아이콘 스타일\n */\nexport type IconStyle = 'solid' | 'regular' | 'light' | 'duotone' | 'brands';\n\n/**\n * Font Awesome 아이콘 크기\n */\nexport type IconSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2x' | '3x' | '4x' | '5x';\n\n/**\n * 자주 사용되는 Font Awesome 아이콘 이름\n *\n * @example\n * // 사용 예시\n * \n * \n * \n */\nexport enum IconName {\n // 사용자 및 계정\n User = 'fa-user',\n Users = 'fa-users',\n UserCircle = 'fa-user-circle',\n UserPlus = 'fa-user-plus',\n UserMinus = 'fa-user-minus',\n UserShield = 'fa-user-shield',\n\n // 액션 아이콘\n Search = 'fa-search',\n Edit = 'fa-edit',\n Pencil = 'fa-pencil-alt',\n Trash = 'fa-trash',\n Save = 'fa-save',\n Plus = 'fa-plus',\n Minus = 'fa-minus',\n Check = 'fa-check',\n Times = 'fa-times',\n Download = 'fa-download',\n Upload = 'fa-upload',\n Copy = 'fa-copy',\n ExternalLink = 'fa-external-link-alt',\n\n // 네비게이션\n Home = 'fa-home',\n ChevronLeft = 'fa-chevron-left',\n ChevronRight = 'fa-chevron-right',\n ChevronUp = 'fa-chevron-up',\n ChevronDown = 'fa-chevron-down',\n AngleLeft = 'fa-angle-left',\n AngleRight = 'fa-angle-right',\n AngleUp = 'fa-angle-up',\n AngleDown = 'fa-angle-down',\n ArrowUp = 'fa-arrow-up',\n ArrowDown = 'fa-arrow-down',\n ArrowLeft = 'fa-arrow-left',\n ArrowRight = 'fa-arrow-right',\n Bars = 'fa-bars',\n EllipsisVertical = 'fa-ellipsis-v',\n EllipsisHorizontal = 'fa-ellipsis-h',\n\n // 상태 아이콘\n CheckCircle = 'fa-check-circle',\n TimesCircle = 'fa-times-circle',\n ExclamationCircle = 'fa-exclamation-circle',\n ExclamationTriangle = 'fa-exclamation-triangle',\n InfoCircle = 'fa-info-circle',\n QuestionCircle = 'fa-question-circle',\n XCircle = 'fa-times-circle',\n\n // 이커머스\n ShoppingCart = 'fa-shopping-cart',\n ShoppingBag = 'fa-shopping-bag',\n CreditCard = 'fa-credit-card',\n Tag = 'fa-tag',\n Tags = 'fa-tags',\n\n // 파일 및 문서\n File = 'fa-file',\n FileAlt = 'fa-file-alt',\n Folder = 'fa-folder',\n FolderOpen = 'fa-folder-open',\n\n // 통신\n Envelope = 'fa-envelope',\n Phone = 'fa-phone',\n Comment = 'fa-comment',\n Comments = 'fa-comments',\n\n // 설정\n Cog = 'fa-cog',\n Cogs = 'fa-cogs',\n Settings = 'fa-cog',\n Wrench = 'fa-wrench',\n Sliders = 'fa-sliders-h',\n\n // 미디어\n Image = 'fa-image',\n Images = 'fa-images',\n Video = 'fa-video',\n Camera = 'fa-camera',\n\n // 소셜\n Heart = 'fa-heart',\n Star = 'fa-star',\n ThumbsUp = 'fa-thumbs-up',\n ThumbsDown = 'fa-thumbs-down',\n Share = 'fa-share',\n\n // 시간\n Clock = 'fa-clock',\n Calendar = 'fa-calendar',\n CalendarAlt = 'fa-calendar-alt',\n\n // 기타\n Lock = 'fa-lock',\n Unlock = 'fa-unlock',\n Eye = 'fa-eye',\n EyeSlash = 'fa-eye-slash',\n Bell = 'fa-bell',\n Flag = 'fa-flag',\n Map = 'fa-map',\n MapMarker = 'fa-map-marker-alt',\n Globe = 'fa-globe',\n Link = 'fa-link',\n Unlink = 'fa-unlink',\n Sun = 'fa-sun',\n Moon = 'fa-moon',\n\n // 차트 및 통계\n ChartBar = 'fa-chart-bar',\n ChartLine = 'fa-chart-line',\n ChartPie = 'fa-chart-pie',\n ChartArea = 'fa-chart-area',\n\n // 스피너 (로딩)\n Spinner = 'fa-spinner',\n CircleNotch = 'fa-circle-notch',\n\n // 배지 아이콘\n CheckBadge = 'fa-badge-check',\n\n // 알림 관련\n BellSlash = 'fa-bell-slash',\n\n // 문서/책 관련\n BookOpen = 'fa-book-open',\n\n // 건물/주소 관련\n Building = 'fa-building',\n\n // 파일 관련\n FileCircleCheck = 'fa-file-circle-check',\n\n // 마법 관련\n WandMagicSparkles = 'fa-wand-magic-sparkles',\n\n // 사용자 관련\n UserXmark = 'fa-user-xmark',\n\n // 확장 시스템 (모듈/플러그인)\n Cube = 'fa-cube',\n Cubes = 'fa-cubes',\n Plug = 'fa-plug',\n PuzzlePiece = 'fa-puzzle-piece',\n\n // 추가 아이콘 (Lucide 호환)\n Fire = 'fa-fire',\n CommentDots = 'fa-comment-dots',\n DollarSign = 'fa-dollar-sign',\n Bars2 = 'fa-bars',\n X = 'fa-times',\n List = 'fa-list',\n ThLarge = 'fa-th-large',\n Inbox = 'fa-inbox',\n Box = 'fa-box',\n PaperPlane = 'fa-paper-plane',\n FileText = 'fa-file-alt',\n Paperclip = 'fa-paperclip',\n Truck = 'fa-truck',\n Sync = 'fa-sync',\n RotateLeft = 'fa-rotate-left',\n MapPin = 'fa-map-marker-alt',\n HelpCircle = 'fa-question-circle',\n}\n\n/**\n * 문자열 아이콘 이름을 IconName enum으로 매핑합니다.\n * JSON 레이아웃에서 문자열로 아이콘 이름을 지정할 때 사용합니다.\n */\nexport const iconNameMap: Record = {\n // 사용자 및 계정\n 'user': IconName.User,\n 'users': IconName.Users,\n 'user-circle': IconName.UserCircle,\n 'user-plus': IconName.UserPlus,\n 'user-minus': IconName.UserMinus,\n 'user-shield': IconName.UserShield,\n\n // 액션 아이콘\n 'search': IconName.Search,\n 'edit': IconName.Edit,\n 'pencil': IconName.Pencil,\n 'trash': IconName.Trash,\n 'save': IconName.Save,\n 'plus': IconName.Plus,\n 'minus': IconName.Minus,\n 'check': IconName.Check,\n 'times': IconName.Times,\n 'download': IconName.Download,\n 'upload': IconName.Upload,\n 'copy': IconName.Copy,\n 'external-link': IconName.ExternalLink,\n\n // 네비게이션\n 'home': IconName.Home,\n 'chevron-left': IconName.ChevronLeft,\n 'chevron-right': IconName.ChevronRight,\n 'chevron-up': IconName.ChevronUp,\n 'chevron-down': IconName.ChevronDown,\n 'angle-left': IconName.AngleLeft,\n 'angle-right': IconName.AngleRight,\n 'angle-up': IconName.AngleUp,\n 'angle-down': IconName.AngleDown,\n 'arrow-up': IconName.ArrowUp,\n 'arrow-down': IconName.ArrowDown,\n 'arrow-left': IconName.ArrowLeft,\n 'arrow-right': IconName.ArrowRight,\n 'bars': IconName.Bars,\n 'ellipsis-vertical': IconName.EllipsisVertical,\n 'ellipsis-v': IconName.EllipsisVertical,\n 'ellipsis-horizontal': IconName.EllipsisHorizontal,\n 'ellipsis-h': IconName.EllipsisHorizontal,\n\n // 상태 아이콘\n 'check-circle': IconName.CheckCircle,\n 'times-circle': IconName.TimesCircle,\n 'x-circle': IconName.XCircle,\n 'exclamation-circle': IconName.ExclamationCircle,\n 'exclamation-triangle': IconName.ExclamationTriangle,\n 'info-circle': IconName.InfoCircle,\n 'question-circle': IconName.QuestionCircle,\n\n // 이커머스\n 'shopping-cart': IconName.ShoppingCart,\n 'shopping-bag': IconName.ShoppingBag,\n 'credit-card': IconName.CreditCard,\n 'tag': IconName.Tag,\n 'tags': IconName.Tags,\n\n // 파일 및 문서\n 'file': IconName.File,\n 'file-alt': IconName.FileAlt,\n 'folder': IconName.Folder,\n 'folder-open': IconName.FolderOpen,\n\n // 통신\n 'envelope': IconName.Envelope,\n 'phone': IconName.Phone,\n 'comment': IconName.Comment,\n 'comments': IconName.Comments,\n\n // 설정\n 'cog': IconName.Cog,\n 'cogs': IconName.Cogs,\n 'settings': IconName.Settings,\n 'wrench': IconName.Wrench,\n 'sliders': IconName.Sliders,\n\n // 미디어\n 'image': IconName.Image,\n 'images': IconName.Images,\n 'video': IconName.Video,\n 'camera': IconName.Camera,\n\n // 소셜\n 'heart': IconName.Heart,\n 'star': IconName.Star,\n 'thumbs-up': IconName.ThumbsUp,\n 'thumbs-down': IconName.ThumbsDown,\n 'share': IconName.Share,\n\n // 시간\n 'clock': IconName.Clock,\n 'calendar': IconName.Calendar,\n 'calendar-alt': IconName.CalendarAlt,\n\n // 기타\n 'lock': IconName.Lock,\n 'unlock': IconName.Unlock,\n 'eye': IconName.Eye,\n 'eye-slash': IconName.EyeSlash,\n 'bell': IconName.Bell,\n 'flag': IconName.Flag,\n 'map': IconName.Map,\n 'map-marker': IconName.MapMarker,\n 'globe': IconName.Globe,\n 'link': IconName.Link,\n 'unlink': IconName.Unlink,\n 'sun': IconName.Sun,\n 'moon': IconName.Moon,\n\n // 차트 및 통계\n 'chart-bar': IconName.ChartBar,\n 'chart-line': IconName.ChartLine,\n 'chart-pie': IconName.ChartPie,\n 'chart-area': IconName.ChartArea,\n\n // 스피너 (로딩)\n 'spinner': IconName.Spinner,\n 'circle-notch': IconName.CircleNotch,\n\n // 배지 아이콘\n 'check-badge': IconName.CheckBadge,\n 'badge-check': IconName.CheckBadge,\n\n // 확장 시스템 (모듈/플러그인)\n 'cube': IconName.Cube,\n 'cubes': IconName.Cubes,\n 'plug': IconName.Plug,\n 'puzzle-piece': IconName.PuzzlePiece,\n\n // Lucide 호환 아이콘 매핑\n 'flame': IconName.Fire,\n 'fire': IconName.Fire,\n 'message-square': IconName.CommentDots,\n 'dollar-sign': IconName.DollarSign,\n 'menu': IconName.Bars,\n 'x': IconName.X,\n 'list': IconName.List,\n 'layout-grid': IconName.ThLarge,\n 'th-large': IconName.ThLarge,\n 'grid': IconName.ThLarge,\n 'inbox': IconName.Inbox,\n 'package': IconName.Box,\n 'box': IconName.Box,\n 'send': IconName.PaperPlane,\n 'paper-plane': IconName.PaperPlane,\n 'file-text': IconName.FileText,\n 'paperclip': IconName.Paperclip,\n 'truck': IconName.Truck,\n 'refresh-cw': IconName.Sync,\n 'sync': IconName.Sync,\n 'undo-2': IconName.RotateLeft,\n 'rotate-left': IconName.RotateLeft,\n 'map-pin': IconName.MapPin,\n 'help-circle': IconName.HelpCircle,\n\n // 추가 Lucide 호환 아이콘 매핑\n 'alert-triangle': IconName.ExclamationTriangle,\n 'bell-off': IconName.BellSlash,\n 'book-open': IconName.BookOpen,\n 'building': IconName.Building,\n 'edit-2': IconName.Edit,\n 'edit-3': IconName.Edit,\n 'file-check': IconName.FileCircleCheck,\n 'mail': IconName.Envelope,\n 'sparkles': IconName.WandMagicSparkles,\n 'trash-2': IconName.Trash,\n 'user-x': IconName.UserXmark,\n};\n","import React from 'react';\nimport { IconName, IconStyle, IconSize, iconNameMap } from './IconTypes';\n\nexport interface IconProps extends Omit, 'style'> {\n /**\n * 아이콘 이름 (Font Awesome 클래스명 또는 IconName enum)\n *\n * @example\n * // 문자열로 직접 지정\n * \n *\n * // enum 사용 (타입 안전)\n * \n */\n name: string | IconName;\n\n /**\n * 아이콘 스타일 (Font Awesome 5/6)\n *\n * - solid: fas (기본값)\n * - regular: far\n * - light: fal\n * - duotone: fad\n * - brands: fab\n */\n iconStyle?: IconStyle;\n\n /**\n * CSS 스타일 객체 (HTML style 속성)\n */\n style?: React.CSSProperties;\n\n /**\n * 아이콘 크기\n *\n * @default 'md'\n */\n size?: IconSize;\n\n /**\n * 색상 (Tailwind 클래스 또는 CSS 색상)\n */\n color?: string;\n\n /**\n * 회전 애니메이션 활성화\n */\n spin?: boolean;\n\n /**\n * 펄스 애니메이션 활성화 (8단계 회전)\n */\n pulse?: boolean;\n\n /**\n * 고정 너비 (아이콘 정렬 시 유용)\n */\n fixedWidth?: boolean;\n\n /**\n * 접근성 레이블 (자동 생성 가능)\n */\n ariaLabel?: string;\n}\n\n/**\n * Font Awesome 아이콘 컴포넌트\n *\n * Font Awesome 5/6 버전과 호환되며 다양한 props를 지원합니다.\n *\n * @example\n * // 기본 사용\n * \n *\n * // enum 사용 (타입 안전)\n * \n *\n * // 스타일 및 크기 지정\n * \n *\n * // 애니메이션\n * \n * \n *\n * // 색상 지정\n * \n *\n * // 접근성\n * \n */\nexport const Icon: React.FC = ({\n name,\n iconStyle = 'solid',\n size,\n color,\n spin = false,\n pulse = false,\n fixedWidth = false,\n ariaLabel,\n className = '',\n style,\n ...props\n}) => {\n // Font Awesome 스타일 클래스 매핑\n const styleClassMap: Record = {\n solid: 'fas',\n regular: 'far',\n light: 'fal',\n duotone: 'fad',\n brands: 'fab',\n };\n\n // 아이콘 이름 처리: iconNameMap을 사용하여 Lucide 스타일 이름을 FontAwesome으로 변환\n const rawName = typeof name === 'string' ? name : String(name);\n const mappedName = iconNameMap[rawName];\n // 매핑된 이름이 있으면 사용, 없으면 원본 사용 후 'fa-' 접두사 제거\n const iconName = mappedName\n ? String(mappedName).replace(/^fa-/, '')\n : rawName.replace(/^fa-/, '');\n\n // 클래스 조합\n const classes = [\n styleClassMap[iconStyle],\n `fa-${iconName}`,\n size && `fa-${size}`,\n spin && 'fa-spin',\n pulse && 'fa-pulse',\n fixedWidth && 'fa-fw',\n color,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n // 접근성: ariaLabel이 없으면 name에서 생성\n const accessibilityLabel = ariaLabel || iconName.replace(/-/g, ' ');\n\n return (\n \n );\n};\n","import React, { useState, useCallback, forwardRef, useImperativeHandle, useRef, useEffect, useMemo } from 'react';\nimport { Icon } from './Icon';\n\n// G7Core.t() 번역 함수 참조\nconst t = (key: string, params?: Record) =>\n (window as unknown as { G7Core?: { t?: (key: string, params?: Record) => string } })\n .G7Core?.t?.(key, params) ?? key;\n\n/**\n * 비밀번호 검증 규칙 정의\n */\nexport interface PasswordRule {\n /** 규칙 식별자 */\n key: string;\n /** 규칙 설명 (다국어 키) */\n labelKey: string;\n /** 검증 함수 (param은 규칙별 설정값) */\n validate: (value: string, param?: number) => boolean;\n /** 기본 파라미터 값 */\n defaultParam?: number;\n}\n\n/**\n * 사용 가능한 모든 비밀번호 검증 규칙\n *\n * JSON 레이아웃에서 enableRules prop으로 키를 지정하여 선택적으로 활성화\n * 파라미터가 있는 규칙은 \"규칙명:값\" 형식으로 지정 (예: \"minLength:12\")\n */\nexport const availablePasswordRules: Record = {\n minLength: {\n key: 'minLength',\n labelKey: 'auth.password_input.rules.minLength',\n defaultParam: 6,\n validate: (value: string, param = 6) => value.length >= param,\n },\n maxLength: {\n key: 'maxLength',\n labelKey: 'auth.password_input.rules.maxLength',\n defaultParam: 20,\n validate: (value: string, param = 20) => value.length <= param,\n },\n hasUppercase: {\n key: 'hasUppercase',\n labelKey: 'auth.password_input.rules.hasUppercase',\n validate: (value: string) => /[A-Z]/.test(value),\n },\n hasLowercase: {\n key: 'hasLowercase',\n labelKey: 'auth.password_input.rules.hasLowercase',\n validate: (value: string) => /[a-z]/.test(value),\n },\n hasNumber: {\n key: 'hasNumber',\n labelKey: 'auth.password_input.rules.hasNumber',\n validate: (value: string) => /[0-9]/.test(value),\n },\n hasSpecial: {\n key: 'hasSpecial',\n labelKey: 'auth.password_input.rules.hasSpecial',\n validate: (value: string) => /[!@#$%^&*(),.?\":{}|<>]/.test(value),\n },\n noSpaces: {\n key: 'noSpaces',\n labelKey: 'auth.password_input.rules.noSpaces',\n validate: (value: string) => !/\\s/.test(value),\n },\n minTypes: {\n key: 'minTypes',\n labelKey: 'auth.password_input.rules.minTypes',\n defaultParam: 3,\n validate: (value: string, param = 3) => {\n let types = 0;\n if (/[A-Z]/.test(value)) types++;\n if (/[a-z]/.test(value)) types++;\n if (/[0-9]/.test(value)) types++;\n if (/[!@#$%^&*(),.?\":{}|<>]/.test(value)) types++;\n return types >= param;\n },\n },\n};\n\n/**\n * 기본 비밀번호 검증 규칙\n *\n * 백엔드 검증 규칙(RegisterRequest.php)과 동일:\n * - password: required|string|min:6|confirmed\n */\nexport const defaultPasswordRules: PasswordRule[] = [\n availablePasswordRules.minLength,\n];\n\n/**\n * 파싱된 규칙 (규칙 + 파라미터)\n */\ninterface ParsedRule {\n rule: PasswordRule;\n param?: number;\n}\n\n/**\n * enableRules 문자열을 파싱하여 규칙과 파라미터를 추출\n * 예: \"minLength:12\" → { rule: minLengthRule, param: 12 }\n * 예: \"hasUppercase\" → { rule: hasUppercaseRule, param: undefined }\n *\n * @param ruleString 규칙 문자열 (예: \"minLength:12\" 또는 \"hasUppercase\")\n * @returns 파싱된 규칙 또는 null (규칙이 존재하지 않는 경우)\n */\nfunction parseRuleString(ruleString: string): ParsedRule | null {\n const [key, paramStr] = ruleString.split(':');\n const rule = availablePasswordRules[key];\n if (!rule) return null;\n\n const param = paramStr ? parseInt(paramStr, 10) : rule.defaultParam;\n return { rule, param: isNaN(param as number) ? rule.defaultParam : param };\n}\n\n/**\n * PasswordInput에서 사용하지 않는 HTML 속성 목록\n * (그누보드7 템플릿 엔진에서 전달되는 커스텀 속성)\n */\ninterface NonStandardProps {\n loadingactions?: unknown;\n formdata?: unknown;\n}\n\nexport interface PasswordInputProps extends Omit, 'type'> {\n /** 레이블 텍스트 */\n label?: string;\n /** 에러 메시지 */\n error?: string;\n /** 비밀번호 보기/숨기기 버튼 표시 */\n showToggle?: boolean;\n /** 비밀번호 조건 검증 표시 */\n showValidation?: boolean;\n /** 비밀번호 확인 모드 (확인 필드로 사용) */\n isConfirmField?: boolean;\n /** 비밀번호 확인 대상 값 (isConfirmField가 true일 때 필요) */\n confirmTarget?: string;\n /** 비밀번호 확인 일치 여부 콜백 */\n onMatchChange?: (isMatch: boolean) => void;\n /** 비밀번호 유효성 변경 콜백 */\n onValidityChange?: (isValid: boolean, failedRules: string[]) => void;\n /** 커스텀 비밀번호 규칙 (기본 규칙 대체, 코드에서만 사용) */\n rules?: PasswordRule[];\n /**\n * 활성화할 규칙 키 목록 (JSON 레이아웃에서 사용)\n * 사용 가능: minLength, maxLength, hasUppercase, hasLowercase, hasNumber, hasSpecial, noSpaces, minTypes\n * 파라미터 지정: \"규칙명:값\" 형식 (예: \"minLength:12\", \"minTypes:3\")\n * 예: [\"minLength:12\", \"hasUppercase\", \"hasSpecial\"]\n */\n enableRules?: string[];\n /** 표시할 규칙 키 목록 (지정하지 않으면 전체 표시) */\n showRules?: string[];\n /** 입력 필드 wrapper 클래스 */\n wrapperClassName?: string;\n /** 검증 결과 표시 영역 클래스 */\n validationClassName?: string;\n}\n\n/**\n * 비밀번호 입력 컴포넌트\n *\n * 비밀번호 보기/숨기기 토글, 실시간 조건 검증, 비밀번호 확인 기능을 제공합니다.\n *\n * @example\n * // 기본 사용 (보기/숨기기만)\n * \n *\n * @example\n * // 조건 검증 표시\n * console.log(isValid, failed)}\n * />\n *\n * @example\n * // 비밀번호 확인 필드\n * console.log(isMatch)}\n * />\n */\nexport const PasswordInput = forwardRef(\n (\n {\n label,\n error,\n showToggle = true,\n showValidation = false,\n isConfirmField = false,\n confirmTarget,\n onMatchChange,\n onValidityChange,\n rules,\n enableRules,\n showRules,\n wrapperClassName = '',\n validationClassName = '',\n className = '',\n onChange,\n value,\n defaultValue,\n disabled,\n ...props\n },\n ref\n ) => {\n const internalRef = useRef(null);\n useImperativeHandle(ref, () => internalRef.current as HTMLInputElement);\n\n // 비밀번호 보기/숨기기 상태\n const [showPassword, setShowPassword] = useState(false);\n\n // CapsLock 활성화 상태\n const [capsLockOn, setCapsLockOn] = useState(false);\n\n // 내부 값 상태 (controlled/uncontrolled 지원)\n const [internalValue, setInternalValue] = useState(\n (value as string) ?? (defaultValue as string) ?? ''\n );\n\n // 외부 value가 변경되면 동기화\n useEffect(() => {\n if (value !== undefined) {\n setInternalValue(value as string);\n }\n }, [value]);\n\n // 사용할 규칙 결정: rules > enableRules > defaultPasswordRules\n const parsedRules = useMemo((): ParsedRule[] => {\n // 1. rules prop이 있으면 그대로 사용 (코드에서 직접 전달, 기본 파라미터 적용)\n if (rules && rules.length > 0) {\n return rules.map((rule) => ({ rule, param: rule.defaultParam }));\n }\n\n // 2. enableRules가 있으면 파싱하여 규칙과 파라미터 추출\n if (enableRules && enableRules.length > 0) {\n return enableRules\n .map((ruleStr) => parseRuleString(ruleStr))\n .filter((parsed): parsed is ParsedRule => parsed !== null);\n }\n\n // 3. 기본 규칙 사용\n return defaultPasswordRules.map((rule) => ({ rule, param: rule.defaultParam }));\n }, [rules, enableRules]);\n\n // 표시할 규칙 필터링\n const displayRules = useMemo(() => {\n if (!showRules || showRules.length === 0) return parsedRules;\n return parsedRules.filter((parsed) => showRules.includes(parsed.rule.key));\n }, [parsedRules, showRules]);\n\n // 비밀번호 규칙 검증 결과\n const validationResults = useMemo(() => {\n if (!showValidation || isConfirmField) return {};\n return displayRules.reduce((acc, { rule, param }) => {\n acc[rule.key] = rule.validate(internalValue, param);\n return acc;\n }, {} as Record);\n }, [internalValue, displayRules, showValidation, isConfirmField]);\n\n // 비밀번호 확인 일치 여부\n const isMatch = useMemo(() => {\n if (!isConfirmField || confirmTarget === undefined) return true;\n return internalValue === confirmTarget && internalValue.length > 0;\n }, [isConfirmField, internalValue, confirmTarget]);\n\n // 전체 유효성 (모든 규칙 통과)\n const isAllValid = useMemo(() => {\n if (!showValidation) return true;\n return Object.values(validationResults).every((v) => v);\n }, [validationResults, showValidation]);\n\n // 유효성 변경 콜백\n useEffect(() => {\n if (onValidityChange && showValidation && !isConfirmField) {\n const failedRules = Object.entries(validationResults)\n .filter(([, passed]) => !passed)\n .map(([key]) => key);\n onValidityChange(isAllValid, failedRules);\n }\n }, [isAllValid, validationResults, onValidityChange, showValidation, isConfirmField]);\n\n // 비밀번호 확인 일치 콜백\n useEffect(() => {\n if (onMatchChange && isConfirmField) {\n onMatchChange(isMatch);\n }\n }, [isMatch, onMatchChange, isConfirmField]);\n\n // 비밀번호 보기/숨기기 토글\n const handleToggle = useCallback(() => {\n setShowPassword((prev) => !prev);\n }, []);\n\n // 입력값 변경 처리\n const handleChange = useCallback(\n (e: React.ChangeEvent) => {\n const newValue = e.target.value;\n setInternalValue(newValue);\n if (onChange) {\n onChange(e);\n }\n },\n [onChange]\n );\n\n // CapsLock 상태 감지\n const handleKeyEvent = useCallback(\n (e: React.KeyboardEvent) => {\n setCapsLockOn(e.getModifierState('CapsLock'));\n },\n []\n );\n\n // HTML 표준 속성이 아닌 것들을 필터링 (타입 안전성 개선)\n const { loadingactions, formdata, ...validProps } = props as typeof props & NonStandardProps;\n\n // 레이아웃 편집기 표식/핸들러(data-editor-*, onMouseMove/Leave 등)는 시각적\n // 루트(wrapper div)에 부착해야 캔버스 선택/드래그가 컴포넌트 전체를 잡는다.\n // 내부 input 에만 spread 하면 선택 박스가 input 으로 한정되고 error/검증/토글이\n // 선택 영역 밖이 된다.\n const editorRootProps: Record = {};\n const inputRestProps: Record = {};\n for (const [k, v] of Object.entries(validProps as Record)) {\n if (k.startsWith('data-editor-') || k === 'onMouseMove' || k === 'onMouseLeave') {\n editorRootProps[k] = v;\n } else {\n inputRestProps[k] = v;\n }\n }\n\n return (\n
\n {/* 입력 필드 wrapper */}\n
\n \n\n {/* 비밀번호 보기/숨기기 버튼 */}\n {showToggle && (\n \n \n \n )}\n
\n\n {/* CapsLock 경고 */}\n {capsLockOn && !showPassword && (\n
\n \n {t('auth.password_input.caps_lock_on')}\n
\n )}\n\n {/* 비밀번호 확인 일치/불일치 표시 */}\n {isConfirmField && confirmTarget !== undefined && internalValue.length > 0 && (\n \n \n {isMatch ? t('auth.password_input.match') : t('auth.password_input.mismatch')}\n
\n )}\n\n {/* 비밀번호 조건 검증 표시 */}\n {showValidation && !isConfirmField && internalValue.length > 0 && (\n
\n {displayRules.map(({ rule, param }) => {\n const passed = validationResults[rule.key];\n // 파라미터가 있는 규칙은 라벨에 파라미터 값 전달\n const labelParams = param !== undefined ? { count: param } : undefined;\n return (\n \n \n {t(rule.labelKey, labelParams)}\n
\n );\n })}\n
\n )}\n\n {/* 에러 메시지 */}\n {error && (\n

{error}

\n )}\n \n );\n }\n);\n\nPasswordInput.displayName = 'PasswordInput';\n","import React, { useRef, useCallback, useState, useEffect } from 'react';\n\nexport interface TextareaProps extends React.TextareaHTMLAttributes {\n label?: string;\n error?: string;\n}\n\n/**\n * 기본 텍스트 영역 컴포넌트\n *\n * IME(한글 등) 조합 중에는 외부 onChange 이벤트를 발생시키지 않습니다.\n * 내부 로컬 상태를 사용하여 입력을 처리하고, 조합이 완료되면 외부에 알립니다.\n */\nexport const Textarea: React.FC = ({\n label,\n error,\n className = '',\n onChange,\n value,\n defaultValue,\n ...props\n}) => {\n // IME 조합 중인지 추적\n const isComposingRef = useRef(false);\n // textarea 요소 참조\n const textareaRef = useRef(null);\n\n // 내부 로컬 값 (IME 조합 중에도 화면에 표시됨)\n const [localValue, setLocalValue] = useState(\n (value as string) ?? (defaultValue as string) ?? ''\n );\n\n // 외부 value prop이 변경되면 로컬 값도 동기화\n useEffect(() => {\n if (!isComposingRef.current && value !== undefined) {\n setLocalValue(value as string);\n }\n }, [value]);\n\n const handleCompositionStart = useCallback(() => {\n isComposingRef.current = true;\n }, []);\n\n const handleCompositionEnd = useCallback(\n (e: React.CompositionEvent) => {\n isComposingRef.current = false;\n // 조합 완료 후 onChange 이벤트 발생\n if (onChange) {\n // 현재 textarea의 실제 값을 사용\n const currentValue = (e.target as HTMLTextAreaElement).value;\n setLocalValue(currentValue);\n\n // 새로운 ChangeEvent 생성\n const changeEvent = new Event('change', { bubbles: true }) as unknown as React.ChangeEvent;\n Object.defineProperty(changeEvent, 'target', {\n writable: false,\n value: { value: currentValue },\n });\n Object.defineProperty(changeEvent, 'currentTarget', {\n writable: false,\n value: { value: currentValue },\n });\n\n onChange(changeEvent);\n }\n },\n [onChange]\n );\n\n const handleChange = useCallback(\n (e: React.ChangeEvent) => {\n const newValue = e.target.value;\n // 항상 로컬 값은 업데이트 (화면에 입력이 보이도록)\n setLocalValue(newValue);\n\n // IME 조합 중이면 외부 onChange를 호출하지 않음\n if (isComposingRef.current) {\n return;\n }\n if (onChange) {\n onChange(e);\n }\n },\n [onChange]\n );\n\n // HTML 표준 속성이 아닌 것들을 필터링 (템플릿 엔진 내부 속성)\n const { loadingactions, formdata, ...validProps } = props as any;\n\n // controlled/uncontrolled 구분\n const textareaValueProps = value !== undefined\n ? { value: localValue }\n : { defaultValue };\n\n return (\n \n );\n};\n","import React from 'react';\n\nexport interface LabelProps extends React.LabelHTMLAttributes {}\n\n/**\n * 기본 레이블 컴포넌트\n */\nexport const Label: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface PProps extends React.HTMLAttributes {}\n\n/**\n * 기본 p(단락) 컴포넌트\n */\nexport const P: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n

\n );\n};\n","import React from 'react';\n\nexport interface ImgProps extends React.ImgHTMLAttributes {}\n\n/**\n * 기본 이미지 컴포넌트\n */\nexport const Img: React.FC = ({\n className = '',\n alt = '',\n ...props\n}) => {\n return (\n \n );\n};\n","import React from 'react';\n\nexport interface H1Props extends React.HTMLAttributes {}\n\n/**\n * 기본 h1 제목 컴포넌트\n */\nexport const H1: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface H2Props extends React.HTMLAttributes {}\n\n/**\n * 기본 h2 제목 컴포넌트\n */\nexport const H2: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface H3Props extends React.HTMLAttributes {}\n\n/**\n * 기본 h3 제목 컴포넌트\n */\nexport const H3: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface H4Props extends React.HTMLAttributes {}\n\n/**\n * 기본 h4 제목 컴포넌트\n */\nexport const H4: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface UlProps extends React.HTMLAttributes {}\n\n/**\n * 기본 ul(순서없는 목록) 컴포넌트\n */\nexport const Ul: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface OlProps extends React.HTMLAttributes {}\n\n/**\n * 기본 ol(순서있는 목록) 컴포넌트\n */\nexport const Ol: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface LiProps extends React.LiHTMLAttributes {}\n\n/**\n * 기본 li(목록 항목) 컴포넌트\n */\nexport const Li: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface AProps extends React.AnchorHTMLAttributes {}\n\n/**\n * 기본 a(링크) 컴포넌트\n */\nexport const A: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface FormProps extends React.FormHTMLAttributes {}\n\n/**\n * 기본 form 컴포넌트\n */\nexport const Form: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","// e2e:allow커스텀 드롭다운 루트 props spread 타입 안전 캐스팅(admin 동기). 단위 회귀는 Select.test.tsx.\nimport React, { useMemo, useState, useRef, useEffect, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Div } from './Div';\nimport { Button } from './Button';\nimport { Span } from './Span';\nimport { Svg } from './Svg';\nimport { Input } from './Input';\n\n// Logger 설정 (G7Core 초기화 전에도 동작하도록 폴백 포함)\nconst logger = ((window as any).G7Core?.createLogger?.('Comp:Select')) ?? {\n log: (...args: unknown[]) => console.log('[Comp:Select]', ...args),\n warn: (...args: unknown[]) => console.warn('[Comp:Select]', ...args),\n error: (...args: unknown[]) => console.error('[Comp:Select]', ...args),\n};\n\nexport interface SelectOption {\n value: string | number;\n label: string;\n disabled?: boolean;\n}\n\nexport interface SelectProps extends Omit, 'onChange'> {\n label?: string;\n error?: string;\n options?: SelectOption[] | string[];\n onChange?: (e: React.ChangeEvent | { target: { value: string | number } }) => void;\n /** 드롭다운 내 검색 input 활성화 (engine-v1.40.0+) */\n searchable?: boolean;\n /** 검색 input placeholder */\n searchPlaceholder?: string;\n /**\n * 레이아웃 편집기 주입 속성 (편집 모드 전용). Select 는 커스텀 드롭다운 루트에\n * 개별 data-editor-* 키를 spread 해야 선택/편집이 닿는다(커스텀 루트\n * passthrough). basic 컴포넌트라 `{...props}` 로 DOM 표준 속성(id 등)도 함께 흐른다.\n */\n editorAttrs?: Record;\n}\n\n/**\n * 로케일 코드를 사람이 읽을 수 있는 이름으로 변환\n */\nfunction getLocaleName(locale: string): string {\n const fromAppConfig = (window as any).G7Core?.state?.get?.('_global.appConfig.localeNames')?.[locale];\n if (fromAppConfig) {\n return fromAppConfig;\n }\n const fallback: Record = {\n ko: '한국어',\n en: 'English',\n ja: '日本語',\n zh: '中文',\n es: 'Español',\n fr: 'Français',\n de: 'Deutsch',\n };\n return fallback[locale] || locale;\n}\n\n/**\n * 커스텀 Select 컴포넌트\n *\n * options prop을 사용하여 드롭다운 메뉴를 생성합니다.\n * 둥근 모서리, 그림자, 체크마크가 있는 커스텀 스타일을 지원합니다.\n */\nexport const Select: React.FC = ({\n children,\n label,\n error,\n options,\n className = '',\n value,\n onChange,\n disabled,\n searchable = false,\n searchPlaceholder,\n editorAttrs,\n ...props\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const [searchTerm, setSearchTerm] = useState('');\n const [dropdownPos, setDropdownPos] = useState<{ top?: number; bottom?: number; left: number; width: number } | null>(null);\n const containerRef = useRef(null);\n const buttonRef = useRef(null);\n const searchInputRef = useRef(null);\n const dropdownRef = useRef(null);\n\n // options를 SelectOption[] 형식으로 정규화\n const normalizedOptions = useMemo((): SelectOption[] | null => {\n if (!options) return null;\n\n // 배열이 아닌 경우 (바인딩 에러 또는 잘못된 prop)\n if (!Array.isArray(options)) {\n logger.warn('options prop is not an array:', options);\n return null;\n }\n\n // 빈 배열인 경우\n if (options.length === 0) return [];\n\n // string[] 배열인 경우\n if (typeof options[0] === 'string') {\n return (options as string[]).map((locale): SelectOption => ({\n value: locale,\n label: getLocaleName(locale),\n }));\n }\n\n // SelectOption[] 배열인 경우 (기존 동작)\n return options as SelectOption[];\n }, [options]);\n\n // 현재 선택된 옵션의 라벨 가져오기\n const selectedLabel = useMemo(() => {\n if (!normalizedOptions) return '';\n const selected = normalizedOptions.find(opt => String(opt.value) === String(value));\n return selected?.label || '';\n }, [normalizedOptions, value]);\n\n // searchable 모드에서 검색어로 필터링된 옵션\n const visibleOptions = useMemo((): SelectOption[] | null => {\n if (!normalizedOptions) return null;\n if (!searchable || searchTerm.trim() === '') return normalizedOptions;\n const needle = searchTerm.trim().toLowerCase();\n return normalizedOptions.filter(opt =>\n opt.label.toLowerCase().includes(needle) ||\n String(opt.value).toLowerCase().includes(needle)\n );\n }, [normalizedOptions, searchable, searchTerm]);\n\n // 드롭다운 열릴 때 검색어 초기화 및 input 포커스\n useEffect(() => {\n if (isOpen && searchable) {\n setSearchTerm('');\n // 다음 tick에 포커스 (DOM 렌더 이후)\n const timer = setTimeout(() => searchInputRef.current?.focus(), 0);\n return () => clearTimeout(timer);\n }\n if (!isOpen) {\n setSearchTerm('');\n }\n }, [isOpen, searchable]);\n\n /**\n * 드롭다운 위치 계산 (버튼 기준 fixed positioning)\n * Modal 등 overflow:hidden 컨테이너 내부에서도 정상 표시\n */\n const updateDropdownPos = useCallback(() => {\n if (!buttonRef.current) return;\n const rect = buttonRef.current.getBoundingClientRect();\n const spaceBelow = window.innerHeight - rect.bottom;\n const dropdownMaxH = 280; // max-h-60(240px) + search(~40px)\n // 아래 공간 부족 시 위로 열기\n const openUpward = spaceBelow < dropdownMaxH && rect.top > spaceBelow;\n if (openUpward) {\n setDropdownPos({\n bottom: window.innerHeight - rect.top + 4,\n left: rect.left,\n width: rect.width,\n });\n } else {\n setDropdownPos({\n top: rect.bottom + 4,\n left: rect.left,\n width: rect.width,\n });\n }\n }, []);\n\n // 드롭다운 열릴 때 위치 계산 + 스크롤/리사이즈 추적\n useEffect(() => {\n if (!isOpen) {\n setDropdownPos(null);\n return;\n }\n updateDropdownPos();\n window.addEventListener('scroll', updateDropdownPos, true);\n window.addEventListener('resize', updateDropdownPos);\n return () => {\n window.removeEventListener('scroll', updateDropdownPos, true);\n window.removeEventListener('resize', updateDropdownPos);\n };\n }, [isOpen, updateDropdownPos]);\n\n // 외부 클릭 시 드롭다운 닫기 (Portal 영역 포함)\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node;\n if (\n containerRef.current && !containerRef.current.contains(target) &&\n (!dropdownRef.current || !dropdownRef.current.contains(target))\n ) {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n }\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isOpen]);\n\n // ESC 키로 드롭다운 닫기\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && isOpen) {\n setIsOpen(false);\n buttonRef.current?.focus();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen]);\n\n const handleToggle = () => {\n if (!disabled) {\n setIsOpen(!isOpen);\n }\n };\n\n const handleSelect = (optionValue: string | number) => {\n if (onChange) {\n // ActionDispatcher가 이벤트를 인식할 수 있도록 preventDefault 메서드 포함\n const syntheticEvent = {\n target: { value: optionValue },\n preventDefault: () => {},\n stopPropagation: () => {},\n type: 'change',\n };\n onChange(syntheticEvent as any);\n }\n setIsOpen(false);\n buttonRef.current?.focus();\n };\n\n // options가 없으면 기본 select 사용 (children 지원)\n if (!normalizedOptions) {\n return (\n }\n disabled={disabled}\n {...editorAttrs}\n {...props}\n >\n {children}\n \n );\n }\n\n // 기본 스타일 (className이 없을 때 적용)\n const hasCustomStyle = className && className.includes('bg-');\n // 커스텀 스타일에 텍스트 색상이 없으면 기본 텍스트 색상 보충\n const hasTextColor = className && /text-(gray|red|blue|green|yellow|white|black|indigo|purple|pink|orange|amber|emerald|teal|cyan|slate)-\\d+|text-white|text-black/.test(className);\n const baseButtonClass = hasCustomStyle\n ? `${className}${hasTextColor ? '' : ' text-gray-700 dark:text-gray-200'}`\n : `w-full px-4 py-2.5 bg-gray-100 dark:bg-gray-700 border-0 rounded-xl text-gray-700 dark:text-gray-200 font-medium focus:ring-2 focus:ring-blue-500 focus:outline-none ${className}`;\n\n // props 는 SelectHTMLAttributes 기반이라 Div(HTMLDivElement) 에 직접 spread 시 타입 불일치.\n // 런타임 동작(편집기 data-editor-* / id 등 DOM 표준 속성 passthrough)은 동일하므로\n // DOM-safe 레코드로 캐스팅해 커스텀 드롭다운 루트에 전달한다.\n const rootDomProps = { ...editorAttrs, ...props } as Record;\n\n return (\n
\n \n {selectedLabel || '\\u00A0'}\n \n \n \n \n\n {isOpen && dropdownPos && createPortal(\n \n {searchable && (\n
\n ) => setSearchTerm(e.target.value)}\n placeholder={searchPlaceholder ?? 'Search...'}\n className=\"w-full px-3 py-2 bg-gray-100 dark:bg-gray-700 border-0 rounded-lg text-sm text-gray-700 dark:text-gray-200 placeholder-gray-400 dark:placeholder-gray-500 focus:ring-2 focus:ring-blue-500 focus:outline-none\"\n role=\"searchbox\"\n aria-label={searchPlaceholder ?? 'Search'}\n />\n
\n )}\n
\n {visibleOptions && visibleOptions.length === 0 && (\n
\n {searchTerm ? 'No results' : ''}\n
\n )}\n {(visibleOptions ?? []).map((option) => {\n const isSelected = String(option.value) === String(value);\n return (\n !option.disabled && handleSelect(option.value)}\n disabled={option.disabled}\n className={`w-full px-4 py-3 text-left flex items-center justify-between hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors ${\n isSelected ? 'text-blue-600 dark:text-blue-400 font-medium' : 'text-gray-700 dark:text-gray-200'\n } ${option.disabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer'}`}\n role=\"option\"\n aria-selected={isSelected}\n >\n {option.label}\n {isSelected && (\n \n \n \n )}\n \n );\n })}\n
\n
,\n document.body\n )}\n \n );\n};\n","import React from 'react';\n\nexport interface OptionProps extends React.OptionHTMLAttributes {}\n\n/**\n * 기본 option 컴포넌트 (Select 내부에서 사용)\n */\nexport const Option: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface OptgroupProps extends React.OptgroupHTMLAttributes {}\n\n/**\n * 기본 optgroup 컴포넌트 (Select 내부에서 옵션 그룹화)\n */\nexport const Optgroup: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React, { forwardRef } from 'react';\n\nexport interface CheckboxProps extends React.InputHTMLAttributes {\n label?: string;\n}\n\n/**\n * 기본 체크박스 컴포넌트\n *\n * forwardRef를 사용하여 ref 전달을 지원합니다.\n * indeterminate 상태 등을 설정할 때 ref가 필요합니다.\n */\nexport const Checkbox = forwardRef(\n ({ label, className = '', ...props }, ref) => {\n return (\n \n );\n }\n);\n\nCheckbox.displayName = 'Checkbox';\n","import React from 'react';\n\nexport interface TableProps extends React.TableHTMLAttributes {}\n\n/**\n * 기본 table 컴포넌트\n */\nexport const Table: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface TheadProps extends React.HTMLAttributes {}\n\n/**\n * 기본 thead 컴포넌트\n */\nexport const Thead: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface TbodyProps extends React.HTMLAttributes {}\n\n/**\n * 기본 tbody 컴포넌트\n */\nexport const Tbody: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface TrProps extends React.HTMLAttributes {}\n\n/**\n * 기본 tr(테이블 행) 컴포넌트\n */\nexport const Tr: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface ThProps extends React.ThHTMLAttributes {}\n\n/**\n * 기본 th(테이블 헤더 셀) 컴포넌트\n */\nexport const Th: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface TdProps extends React.TdHTMLAttributes {}\n\n/**\n * 기본 td(테이블 데이터 셀) 컴포넌트\n */\nexport const Td: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React, { forwardRef } from 'react';\n\nexport interface NavProps extends React.HTMLAttributes {}\n\n/**\n * 기본 nav 컴포넌트\n */\nexport const Nav = forwardRef(\n ({ children, className = '', ...props }, ref) => {\n return (\n \n {children}\n \n );\n }\n);\n\nNav.displayName = 'Nav';\n","import React from 'react';\n\nexport interface SectionProps extends React.HTMLAttributes {}\n\n/**\n * 기본 section 컴포넌트\n */\nexport const Section: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface CodeProps extends React.HTMLAttributes {}\n\n/**\n * 기본 code 컴포넌트\n *\n * 인라인 코드 또는 코드 스니펫을 표시하기 위한 기본 컴포넌트입니다.\n * HTML 태그를 래핑합니다.\n */\nexport const Code: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface HrProps extends React.HTMLAttributes {\n ref?: React.Ref;\n}\n\n/**\n * 기본 hr (수평선) 컴포넌트\n */\nexport const Hr = React.forwardRef(({\n className = '',\n ...props\n}, ref) => {\n return (\n \n );\n});\n","import React from 'react';\n\nexport interface HeaderProps extends React.HTMLAttributes {\n ref?: React.Ref;\n}\n\n/**\n * 기본 header 컴포넌트\n */\nexport const Header = React.forwardRef(({\n children,\n className = '',\n ...props\n}, ref) => {\n return (\n \n {children}\n \n );\n});\n","import React, { useState, useEffect, useRef } from 'react';\nimport { Div } from '../basic/Div';\nimport { Button } from '../basic/Button';\nimport { Icon } from '../basic/Icon';\nimport { IconName } from '../basic/IconTypes';\nimport { Span } from '../basic/Span';\nimport type { EditorAttrs } from '../../types';\n\n/**\n * 테마 모드 타입\n */\nexport type ThemeMode = 'auto' | 'light' | 'dark';\n\n/**\n * ThemeToggle Props\n */\nexport interface ThemeToggleProps {\n /** 테마 변경 콜백 */\n onThemeChange?: (theme: ThemeMode) => void;\n /** 추가 CSS 클래스 */\n className?: string;\n /** 자동 모드 텍스트 (다국어 키 사용 권장) */\n autoText?: string;\n /** 라이트 모드 텍스트 (다국어 키 사용 권장) */\n lightText?: string;\n /** 다크 모드 텍스트 (다국어 키 사용 권장) */\n darkText?: string;\n /** DOM id 속성 (레이아웃 편집기 코어 일괄 ID) */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * ThemeToggle 컴포넌트\n *\n * 다크/라이트 모드 전환 버튼\n * - 3가지 모드: 자동(시스템 설정 따름), 라이트, 다크\n * - localStorage에 'g7_color_scheme' 키로 저장 (admin 템플릿과 동일)\n * - 시스템 prefers-color-scheme 감지 지원\n *\n * @example\n * ```json\n * {\n * \"type\": \"composite\",\n * \"name\": \"ThemeToggle\",\n * \"props\": {\n * \"autoText\": \"$t:common.theme.auto\",\n * \"lightText\": \"$t:common.theme.light\",\n * \"darkText\": \"$t:common.theme.dark\"\n * }\n * }\n * ```\n */\n\n/**\n * 실제 적용될 테마 결정 (auto인 경우 시스템 설정 반영)\n */\nconst getEffectiveTheme = (mode: ThemeMode): 'light' | 'dark' => {\n if (mode === 'auto') {\n return window.matchMedia('(prefers-color-scheme: dark)').matches\n ? 'dark'\n : 'light';\n }\n return mode;\n};\n\n/**\n * 테마 적용\n */\nconst applyTheme = (mode: ThemeMode) => {\n const effectiveTheme = getEffectiveTheme(mode);\n document.documentElement.setAttribute('data-theme', effectiveTheme);\n\n // dark 클래스 토글 (Tailwind CSS dark: 모드 지원)\n if (effectiveTheme === 'dark') {\n document.documentElement.classList.add('dark');\n } else {\n document.documentElement.classList.remove('dark');\n }\n};\n\n/**\n * 초기 테마 로드 및 적용 (즉시 실행)\n * admin 템플릿과 동일한 localStorage 키 사용: 'g7_color_scheme'\n */\nconst getInitialTheme = (): ThemeMode => {\n const savedTheme = localStorage.getItem('g7_color_scheme') as ThemeMode | null;\n if (savedTheme && ['auto', 'light', 'dark'].includes(savedTheme)) {\n return savedTheme;\n }\n return 'auto';\n};\n\nexport const ThemeToggle: React.FC = ({\n onThemeChange,\n className = '',\n autoText = 'System',\n lightText = 'Light',\n darkText = 'Dark',\n id,\n editorAttrs,\n}) => {\n // 초기 테마를 즉시 로드하고 적용\n const initialTheme = getInitialTheme();\n const [currentMode, setCurrentMode] = useState(initialTheme);\n const [showMenu, setShowMenu] = useState(false);\n const menuRef = useRef(null);\n\n /**\n * 컴포넌트 마운트 시 즉시 테마 적용\n */\n useEffect(() => {\n applyTheme(currentMode);\n }, []);\n\n /**\n * 시스템 테마 변경 감지\n */\n useEffect(() => {\n if (currentMode !== 'auto') return;\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const handleChange = () => {\n applyTheme('auto');\n };\n\n mediaQuery.addEventListener('change', handleChange);\n return () => mediaQuery.removeEventListener('change', handleChange);\n }, [currentMode]);\n\n /**\n * 외부 클릭 감지\n */\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(event.target as Node)) {\n setShowMenu(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n /**\n * 테마 변경 핸들러\n * admin 템플릿과 동일한 localStorage 키 사용: 'g7_color_scheme'\n */\n const handleThemeChange = (mode: ThemeMode) => {\n setCurrentMode(mode);\n localStorage.setItem('g7_color_scheme', mode);\n applyTheme(mode);\n setShowMenu(false);\n onThemeChange?.(mode);\n };\n\n /**\n * 현재 표시할 아이콘 결정\n */\n const getCurrentIcon = (): IconName => {\n const effectiveTheme = getEffectiveTheme(currentMode);\n return effectiveTheme === 'dark' ? IconName.Moon : IconName.Sun;\n };\n\n return (\n
\n {/* 테마 토글 버튼 */}\n setShowMenu(!showMenu)}\n className=\"p-2 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-lg transition-colors text-gray-600 dark:text-gray-400\"\n aria-label=\"Toggle theme\"\n >\n \n \n\n {/* 테마 선택 드롭다운 */}\n {showMenu && (\n
\n
\n {/* 자동 모드 */}\n handleThemeChange('auto')}\n className={`\n w-full px-4 py-2 text-left hover:bg-gray-50 dark:hover:bg-gray-700 flex items-center gap-3 transition-colors\n ${currentMode === 'auto' ? 'bg-gray-50 dark:bg-gray-700' : ''}\n `}\n >\n \n {autoText}\n {currentMode === 'auto' && (\n \n )}\n \n\n {/* 라이트 모드 */}\n handleThemeChange('light')}\n className={`\n w-full px-4 py-2 text-left hover:bg-gray-50 dark:hover:bg-gray-700 flex items-center gap-3 transition-colors\n ${currentMode === 'light' ? 'bg-gray-50 dark:bg-gray-700' : ''}\n `}\n >\n \n {lightText}\n {currentMode === 'light' && (\n \n )}\n \n\n {/* 다크 모드 */}\n handleThemeChange('dark')}\n className={`\n w-full px-4 py-2 text-left hover:bg-gray-50 dark:hover:bg-gray-700 flex items-center gap-3 transition-colors\n ${currentMode === 'dark' ? 'bg-gray-50 dark:bg-gray-700' : ''}\n `}\n >\n \n {darkText}\n {currentMode === 'dark' && (\n \n )}\n \n
\n
\n )}\n
\n );\n};\n\nexport default ThemeToggle;\n","import React, { useMemo } from 'react';\nimport { Div } from '../basic/Div';\nimport { Img } from '../basic/Img';\nimport { Icon } from '../basic/Icon';\nimport type { EditorAttrs } from '../../types';\n\n/**\n * 아바타 크기 타입\n */\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl' | '5xl';\n\n/**\n * 사이즈별 Tailwind 클래스 매핑\n * - 크기 (w/h) + 텍스트 크기 (이니셜용)\n */\nconst SIZE_CLASSES: Record = {\n xs: 'w-6 h-6 text-xs', // 24px\n sm: 'w-8 h-8 text-sm', // 32px\n md: 'w-10 h-10 text-base', // 40px\n lg: 'w-12 h-12 text-lg', // 48px\n xl: 'w-16 h-16 text-xl', // 64px\n '2xl': 'w-24 h-24 text-2xl', // 96px\n '3xl': 'w-32 h-32 text-3xl', // 128px\n '4xl': 'w-40 h-40 text-4xl', // 160px\n '5xl': 'w-48 h-48 text-5xl', // 192px\n} as const;\n\n/**\n * 기본 컨테이너 스타일 (공통)\n */\nconst BASE_CONTAINER_CLASSES = 'rounded-full overflow-hidden flex-shrink-0 border border-gray-200 dark:border-gray-700';\n\n/**\n * 탈퇴 사용자 스타일\n */\nconst WITHDRAWN_CLASSES = 'grayscale opacity-50';\n\n/**\n * 이니셜 배경 스타일\n */\nconst INITIAL_BG_CLASSES = {\n normal: 'bg-gradient-to-br from-blue-500 to-purple-600',\n withdrawn: 'bg-gray-300 dark:bg-gray-600',\n guest: 'bg-gray-200 dark:bg-gray-700',\n} as const;\n\n/**\n * Author 객체 인터페이스\n */\nexport interface AuthorInfo {\n /** 사용자 ID */\n id?: string | number;\n /** 사용자 이름 */\n name?: string;\n /** 아바타 URL */\n avatar?: string;\n /** 사용자 상태 */\n status?: 'active' | 'inactive' | 'blocked' | 'withdrawn';\n /** 비회원 여부 */\n is_guest?: boolean;\n}\n\nexport interface AvatarProps {\n /**\n * 작성자 객체 (권장)\n * API 응답의 author 객체를 그대로 전달하면 됩니다.\n * 개별 props(name, avatar 등)가 함께 전달되면 개별 props가 우선합니다.\n */\n author?: AuthorInfo;\n /** 사용자 이름 (author.name보다 우선) */\n name?: string;\n /** 아바타 이미지 URL (author.avatar보다 우선) */\n avatar?: string;\n /** 사이즈 @default 'md' */\n size?: AvatarSize;\n /** 추가 className */\n className?: string;\n /** 레이아웃 JSON text 속성 (name보다 우선) */\n text?: string;\n /** 탈퇴한 사용자 여부 (author.status === 'withdrawn'과 OR 조건) @default false */\n isWithdrawn?: boolean;\n /** 비회원 여부 (author.is_guest보다 우선) @default false */\n isGuest?: boolean;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n/**\n * 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread)\n */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * Avatar 컴포넌트\n *\n * 사용자 아바타를 표시하는 재사용 가능한 composite 컴포넌트입니다.\n * - 아바타 이미지가 있으면 이미지 표시\n * - 이미지가 없으면 이름의 첫 글자(이니셜) 표시\n * - 비회원: 연한 회색 배경 + 사람 실루엣 아이콘\n * - 탈퇴한 사용자: 회색 빈 원 (그레이스케일 + 투명도)\n *\n * ## Props 우선순위\n * 명시적으로 전달한 props가 author에서 추출한 값보다 우선합니다.\n * - 이름: text > name > author.name\n * - 아바타: avatar > author.avatar\n * - 비회원 여부: isGuest > author.is_guest\n * - 탈퇴 여부: isWithdrawn || author.status === 'withdrawn'\n *\n * @example\n * // 레이아웃 JSON에서 사용 (author 객체 전달 - 권장)\n * {\n * \"type\": \"composite\",\n * \"name\": \"Avatar\",\n * \"props\": {\n * \"author\": \"{{post.author}}\",\n * \"size\": \"md\"\n * }\n * }\n *\n * @example\n * // author와 개별 props 혼합 사용 (개별 props가 우선)\n * {\n * \"type\": \"composite\",\n * \"name\": \"Avatar\",\n * \"props\": {\n * \"author\": \"{{post.author}}\",\n * \"avatar\": \"/images/custom-avatar.png\",\n * \"size\": \"md\"\n * }\n * }\n * // author.avatar가 있어도 \"/images/custom-avatar.png\"이 표시됨\n */\nexport const Avatar: React.FC = ({\n author,\n name,\n avatar,\n size = 'md',\n className = '',\n text,\n isWithdrawn = false,\n isGuest = false,\n id,\n editorAttrs,\n}) => {\n // 명시적 props > author 추출값 순서로 결정\n const actualAvatar = avatar ?? author?.avatar;\n const actualName = text ?? name ?? author?.name ?? '?';\n const actualIsWithdrawn = isWithdrawn || author?.status === 'withdrawn';\n const actualIsGuest = isGuest || author?.is_guest || false;\n\n // 컨테이너 클래스 메모이제이션\n const containerClasses = useMemo(() => {\n const sizeClass = SIZE_CLASSES[size] || SIZE_CLASSES.md;\n const withdrawnClass = actualIsWithdrawn ? WITHDRAWN_CLASSES : '';\n\n return [sizeClass, BASE_CONTAINER_CLASSES, withdrawnClass, className]\n .filter(Boolean)\n .join(' ');\n }, [size, actualIsWithdrawn, className]);\n\n // 이니셜 배경 클래스\n const initialBgClass = actualIsGuest\n ? INITIAL_BG_CLASSES.guest\n : actualIsWithdrawn\n ? INITIAL_BG_CLASSES.withdrawn\n : INITIAL_BG_CLASSES.normal;\n\n // 비회원: 사람 실루엣 아이콘 (연한 회색), 탈퇴 사용자: 사람 실루엣 아이콘 (진한 회색), 일반: 이니셜\n const renderContent = () => {\n if (actualIsGuest) {\n return (\n
\n \n
\n );\n }\n if (actualIsWithdrawn) {\n return (\n
\n \n
\n );\n }\n return (\n
\n {actualName.charAt(0).toUpperCase()}\n
\n );\n };\n\n return (\n
\n {actualAvatar && !actualIsGuest && !actualIsWithdrawn ? (\n \n ) : (\n renderContent()\n )}\n
\n );\n};\n","/**\n * SlotContainer.tsx\n *\n * 동적 슬롯에 등록된 컴포넌트들을 렌더링하는 컨테이너 컴포넌트\n *\n * SlotContainer는 SlotContext에서 지정된 슬롯 ID에 등록된 모든 컴포넌트를 수집하고,\n * slotOrder 기준으로 정렬하여 렌더링합니다.\n *\n * 통짜 TSX 컴포넌트(예: Header)가 레이아웃 JSON 노드(`\"slot\": \"...\"`)로 주입된 UI를\n * 떙겨 쓰는 코어 슬롯 시스템의 소비 측 컴포넌트입니다. 빈 슬롯이면 null 을 렌더하므로\n * \"모듈 활성 시에만 노출\"이 확장 주입 인프라로 자동 충족됩니다(헤더는 주입 모듈을 모름).\n *\n * @module SlotContainer\n *\n * @example\n * ```json\n * {\n * \"type\": \"composite\",\n * \"name\": \"SlotContainer\",\n * \"props\": {\n * \"slotId\": \"header_currency\",\n * \"className\": \"flex items-center\"\n * }\n * }\n * ```\n */\n\nimport React, { useEffect, useState, useCallback } from 'react';\nimport { Div } from '../basic/Div';\n\n// Logger 설정 (G7Core 초기화 전에도 동작하도록 폴백 포함)\nconst logger = ((window as any).G7Core?.createLogger?.('Comp:SlotContainer')) ?? {\n log: (...args: unknown[]) => console.log('[Comp:SlotContainer]', ...args),\n warn: (...args: unknown[]) => console.warn('[Comp:SlotContainer]', ...args),\n error: (...args: unknown[]) => console.error('[Comp:SlotContainer]', ...args),\n};\n\n/**\n * 슬롯에 주입된 컴포넌트의 root id 를 컨테이너 id 로 스코프해 고유화한다.\n *\n * 같은 슬롯 컴포넌트가 여러 SlotContainer(예: 헤더 데스크톱/모바일)에서 렌더되면 주입\n * 컴포넌트의 정적 root id 가 컨테이너마다 같은 값으로 중복 출력되어 HTML id 유일성을\n * 위반한다. 컨테이너 고유 id 가 있고 컴포넌트가 root id 를 가지면 `{id}__{containerId}`\n * 로 스코프한다. 둘 중 하나라도 없으면 원본 그대로(무영향).\n *\n * @param componentDef 주입 컴포넌트 정의\n * @param containerId 이 SlotContainer 의 DOM id (없으면 스코프 안 함)\n * @returns 스코프된(또는 원본) 컴포넌트 정의\n */\nexport function scopeSlotChildDef(\n componentDef: T,\n containerId: string | undefined,\n): T {\n if (\n containerId &&\n componentDef &&\n typeof componentDef.id === 'string' &&\n componentDef.id.length > 0\n ) {\n return { ...componentDef, id: `${componentDef.id}__${containerId}` };\n }\n return componentDef;\n}\n\n/**\n * SlotContainer Props\n */\nexport interface SlotContainerProps {\n /**\n * 슬롯 ID\n *\n * 이 슬롯에 등록된 컴포넌트들을 렌더링합니다.\n */\n slotId: string;\n\n /**\n * 컨테이너 CSS 클래스\n */\n className?: string;\n\n /**\n * 빈 슬롯일 때 표시할 내용\n */\n emptyContent?: React.ReactNode;\n\n /**\n * 인라인 스타일\n */\n style?: React.CSSProperties;\n\n /**\n * 컴포넌트 ID (DOM id)\n */\n id?: string;\n\n /**\n * 자식 컴포넌트 (children을 통한 fallback 또는 slot 컴포넌트가 아닌 정적 컨텐츠)\n */\n children?: React.ReactNode;\n}\n\n/**\n * SlotRegistration 타입 (SlotContext에서 정의된 것과 호환)\n */\ninterface SlotRegistration {\n componentDef: any;\n dataContext: Record;\n order: number;\n parentFormContext: any;\n getParentComponentContext: () => { state: Record; setState: (updates: any) => void };\n translationContext: any;\n registrationKey: string;\n}\n\n/**\n * SlotContext 값 타입\n */\ninterface SlotContextValue {\n getSlotComponents: (slotId: string) => SlotRegistration[];\n subscribeToSlot: (slotId: string, callback: () => void) => () => void;\n isEnabled: boolean;\n}\n\n/**\n * SlotContainer 컴포넌트\n *\n * SlotContext에서 지정된 슬롯 ID에 등록된 컴포넌트들을 수집하여 렌더링합니다.\n * 컴포넌트는 slotOrder 기준으로 정렬됩니다.\n *\n * 이 컴포넌트는 SlotContext를 사용하므로 SlotProvider 내부에서만 동작합니다.\n * SlotProvider는 DynamicRenderer의 루트에서 자동으로 래핑됩니다.\n *\n * @param props SlotContainerProps\n */\nexport const SlotContainer: React.FC = ({\n slotId,\n className = '',\n emptyContent,\n style,\n id,\n children,\n}) => {\n const [slotComponents, setSlotComponents] = useState([]);\n const [, forceUpdate] = useState({});\n\n // SlotContext 가져오기 (window.__slotContextValue 또는 G7Core.getSlotContext() 사용)\n const getSlotContext = useCallback((): SlotContextValue | null => {\n const directSlotContext = (window as any).__slotContextValue;\n if (directSlotContext) {\n return directSlotContext;\n }\n\n const g7Core = (window as any).G7Core;\n if (!g7Core) return null;\n\n const slotContext = g7Core.getSlotContext?.();\n return slotContext || null;\n }, []);\n\n // 슬롯 컴포넌트 업데이트 함수\n const updateSlotComponents = useCallback(() => {\n const slotContext = getSlotContext();\n if (slotContext && slotContext.isEnabled) {\n setSlotComponents(slotContext.getSlotComponents(slotId));\n }\n }, [slotId, getSlotContext]);\n\n // 슬롯 구독 및 업데이트\n useEffect(() => {\n const slotContext = getSlotContext();\n\n if (!slotContext || !slotContext.isEnabled) {\n return;\n }\n\n updateSlotComponents();\n\n const unsubscribe = slotContext.subscribeToSlot(slotId, () => {\n updateSlotComponents();\n forceUpdate({});\n });\n\n return unsubscribe;\n }, [slotId, getSlotContext, updateSlotComponents]);\n\n // G7Core에서 DynamicRenderer 가져오기\n const getDynamicRenderer = useCallback(() => {\n const g7Core = (window as any).G7Core;\n if (!g7Core) return null;\n\n return g7Core.getDynamicRenderer?.();\n }, []);\n\n // 빈 슬롯 처리\n if (slotComponents.length === 0) {\n if (emptyContent) {\n return (\n
\n {emptyContent}\n
\n );\n }\n\n if (children) {\n return (\n
\n {children}\n
\n );\n }\n\n return null;\n }\n\n const DynamicRenderer = getDynamicRenderer();\n const g7Core = (window as any).G7Core;\n\n if (!DynamicRenderer || !g7Core) {\n logger.error('G7Core or DynamicRenderer not available');\n return null;\n }\n\n return (\n
\n {slotComponents.map((registration) => {\n const {\n componentDef,\n dataContext,\n parentFormContext,\n getParentComponentContext,\n translationContext,\n } = registration;\n\n // 같은 슬롯 컴포넌트가 여러 SlotContainer(헤더 데스크톱/모바일)에서 렌더될 때\n // 주입 컴포넌트 root id 를 컨테이너 id 로 스코프해 HTML id 중복을 막는다.\n const scopedDef = scopeSlotChildDef(componentDef, id);\n\n return (\n \n );\n })}\n {children}\n
\n );\n};\n\nexport default SlotContainer;\n","import React, { useState, useRef, useEffect, useCallback, useLayoutEffect } from 'react';\nimport { Div } from '../basic/Div';\nimport { Button } from '../basic/Button';\nimport { Span } from '../basic/Span';\nimport { Icon } from '../basic/Icon';\nimport { IconName } from '../basic/IconTypes';\nimport { Input } from '../basic/Input';\nimport type { EditorAttrs } from '../../types';\n\n/**\n * 알림 아이템 인터페이스\n */\nexport interface NotificationItem {\n id: string | number;\n title: string;\n message: string;\n time: string;\n read?: boolean;\n iconName?: IconName;\n data?: Record;\n onClick?: () => void;\n}\n\n/**\n * NotificationCenter Props\n */\nexport interface NotificationCenterProps {\n /** 알림 목록 */\n notifications?: NotificationItem[];\n /** 서버 기반 미읽음 알림 수 */\n unreadCount?: number;\n /** 추가 로드 가능 여부 */\n hasMore?: boolean;\n /** 로딩 상태 */\n loading?: boolean;\n /** 알림 제목 텍스트 */\n titleText?: string;\n /** 알림 없음 텍스트 */\n emptyText?: string;\n /** \"모두 읽음\" 버튼 텍스트 */\n markAllReadText?: string;\n /** \"모두 삭제\" 버튼 텍스트 */\n deleteAllText?: string;\n /** \"미읽음만\" 체크박스 텍스트 */\n unreadOnlyText?: string;\n /** \"미읽음만\" 체크박스 상태 */\n unreadOnly?: boolean;\n /** 알림 클릭 핸들러 (알림 전체 객체 전달) */\n onNotificationClick?: (notification: NotificationItem) => void;\n /** 드롭다운 닫힐 때 (뷰포트에 들어온 미읽음 알림 ID 목록) */\n onClose?: (visibleUnreadIds: (string | number)[]) => void;\n /** 추가 로드 요청 */\n onLoadMore?: () => void;\n /** 모두 읽음 처리 요청 */\n onMarkAllRead?: () => void;\n /** 모두 삭제 요청 */\n onDeleteAll?: () => void;\n /** 개별 알림 삭제 요청 (알림 전체 객체 전달) */\n onDelete?: (notification: NotificationItem) => void;\n /** \"미읽음만\" 체크박스 토글 */\n onUnreadOnlyToggle?: (checked: boolean) => void;\n /** 드롭다운 정렬 방향 — \"right\"(기본): 우측 정렬되어 좌측으로 확장 / \"left\": 좌측 정렬되어 우측으로 확장 */\n dropdownAlign?: 'left' | 'right';\n className?: string;\n /** DOM id 속성 (레이아웃 편집기 코어 일괄 ID) */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * NotificationCenter 컴포넌트 (User)\n *\n * 알림 센터 - 알림 목록 표시, 무한스크롤, 읽음 추적.\n * sirsoft-admin_basic의 NotificationCenter와 동일 API/동작을 제공한다.\n *\n * @example\n * ```tsx\n * \n * ```\n */\nexport const NotificationCenter: React.FC = ({\n notifications = [],\n unreadCount = 0,\n hasMore = false,\n loading = false,\n titleText = '알림',\n emptyText = '알림이 없습니다.',\n markAllReadText = '모두 읽음',\n deleteAllText = '모두 삭제',\n unreadOnlyText = '안 읽은 알림만',\n unreadOnly = false,\n onNotificationClick,\n onClose,\n onLoadMore,\n onMarkAllRead,\n onDeleteAll,\n onDelete,\n onUnreadOnlyToggle,\n dropdownAlign = 'right',\n className = '',\n id,\n editorAttrs,\n}) => {\n const [showNotifications, setShowNotifications] = useState(false);\n const notificationRef = useRef(null);\n const dropdownRef = useRef(null);\n const scrollRef = useRef(null);\n const sentinelRef = useRef(null);\n const visibleUnreadIdsRef = useRef>(new Set());\n\n // 무한스크롤 관련 최신 값 참조 (observer 재등록 없이 최신 prop 접근)\n const onLoadMoreRef = useRef(onLoadMore);\n const hasMoreRef = useRef(hasMore);\n const loadingRef = useRef(loading);\n const notificationsCountRef = useRef(notifications.length);\n // 마지막 onLoadMore 발행 시점의 notifications.length — 동일 길이에서 중복 발행 가드\n const lastRequestedCountRef = useRef(-1);\n\n useEffect(() => {\n onLoadMoreRef.current = onLoadMore;\n hasMoreRef.current = hasMore;\n loadingRef.current = loading;\n notificationsCountRef.current = notifications.length;\n });\n\n /**\n * 무한스크롤 — IntersectionObserver\n *\n * observer는 드롭다운 열림/닫힘 전환 시에만 재등록한다.\n * 목록이 append되거나 loading/hasMore가 바뀌어도 observer를 새로 만들지 않으므로,\n * sentinel이 이미 뷰포트에 있는 상태에서 재등록 시 즉시 intersecting callback이\n * 중복 발행되던 문제를 방지한다.\n */\n useEffect(() => {\n if (!sentinelRef.current || !scrollRef.current || !showNotifications) return;\n\n // 드롭다운이 새로 열릴 때마다 중복 가드 초기화\n lastRequestedCountRef.current = -1;\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (!entry.isIntersecting) return;\n if (loadingRef.current || !hasMoreRef.current) return;\n // B안 가드: 같은 length에서 이미 한 번 발행했다면 skip\n if (lastRequestedCountRef.current === notificationsCountRef.current) return;\n lastRequestedCountRef.current = notificationsCountRef.current;\n onLoadMoreRef.current?.();\n },\n { root: scrollRef.current, threshold: 0.1 }\n );\n\n observer.observe(sentinelRef.current);\n return () => observer.disconnect();\n }, [showNotifications]);\n\n /**\n * 뷰포트 내 미읽음 알림 추적 — IntersectionObserver\n */\n useEffect(() => {\n if (!scrollRef.current || !showNotifications) return;\n\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n const id = entry.target.getAttribute('data-notification-id');\n const isUnread = entry.target.getAttribute('data-unread') === 'true';\n if (id && isUnread && entry.isIntersecting) {\n visibleUnreadIdsRef.current.add(id);\n }\n });\n },\n {\n root: scrollRef.current,\n threshold: 0.5,\n }\n );\n\n const items = scrollRef.current.querySelectorAll('[data-notification-id]');\n items.forEach((item) => observer.observe(item));\n\n return () => observer.disconnect();\n }, [showNotifications, notifications]);\n\n /**\n * 뱃지에 표시할 카운트 (handleClose 보다 먼저 선언 — deps 참조 순서)\n */\n const displayCount = unreadCount > 0 ? unreadCount : notifications.filter((n) => !n.read).length;\n\n /**\n * 드롭다운 닫기 — 뷰포트에 들어온 미읽음 알림 ID 전달\n *\n * 불필요한 read-batch 호출 방지:\n * 1) displayCount 가 0 이면 이미 모두 읽음/삭제 처리된 상태 → 전체 skip\n * 2) 뷰포트에 나타났던 ID 중 현재 notifications 기준 여전히 unread 인 것만 전달\n * (\"모두 읽음\" onSuccess 로 notifications 가 갱신되면 필터 결과가 빈 배열이 됨)\n */\n const handleClose = useCallback(() => {\n if (showNotifications) {\n if (displayCount > 0) {\n const unreadIds = Array.from(visibleUnreadIdsRef.current).filter((id) => {\n const n = notifications.find((item) => String(item.id) === String(id));\n return n && !n.read;\n });\n if (unreadIds.length > 0) {\n onClose?.(unreadIds);\n }\n }\n visibleUnreadIdsRef.current.clear();\n setShowNotifications(false);\n }\n }, [showNotifications, onClose, displayCount, notifications]);\n\n /**\n * 외부 클릭 감지 — 드롭다운이 열려 있을 때만 리스너 등록\n * (stale closure 방지: showNotifications 변경 시 리스너 재등록)\n * 주의: handleClose가 useCallback으로 선언된 이후에 위치해야 TDZ 위반 방지\n */\n useEffect(() => {\n if (!showNotifications) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n if (\n notificationRef.current &&\n !notificationRef.current.contains(event.target as Node)\n ) {\n handleClose();\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [showNotifications, handleClose]);\n\n /**\n * 드롭다운 토글\n */\n const handleToggle = useCallback(() => {\n if (showNotifications) {\n handleClose();\n } else {\n setShowNotifications(true);\n }\n }, [showNotifications, handleClose]);\n\n /**\n * 드롭다운 열릴 때 뷰포트 경계 검사 후 이탈량만큼 translateX 로 보정\n *\n * class 기반 left-0/right-0 전환은 부모 컨테이너 기준이라 부모가 뷰포트 가장자리에 있을 때\n * 여전히 이탈할 수 있다. 따라서 초기 렌더 후 드롭다운의 실제 뷰포트 좌표를 측정하여\n * 이탈한 픽셀만큼 반대 방향으로 이동시키는 방식을 사용한다.\n */\n useLayoutEffect(() => {\n const dropdown = dropdownRef.current;\n if (!showNotifications || !dropdown) return;\n\n // 측정 전 기존 transform 초기화 (재측정 시 누적 방지)\n dropdown.style.transform = '';\n const rect = dropdown.getBoundingClientRect();\n const vw = typeof window !== 'undefined' ? window.innerWidth : 0;\n\n // layout 미측정(jsdom 등)에서 rect 가 0 으로 반환되는 경우 보정 스킵\n if (rect.width === 0 && rect.height === 0) return;\n\n const margin = 8;\n let shift = 0;\n if (rect.right > vw - margin) {\n shift = -(rect.right - (vw - margin));\n } else if (rect.left < margin) {\n shift = margin - rect.left;\n }\n\n if (shift !== 0) {\n dropdown.style.transform = `translateX(${shift}px)`;\n }\n }, [showNotifications, dropdownAlign, notifications.length]);\n\n return (\n
\n \n \n {displayCount > 0 && (\n \n {displayCount > 99 ? '99+' : displayCount}\n \n )}\n \n\n {/* 알림 드롭다운 */}\n {showNotifications && (\n
\n
\n
\n {titleText}\n {onUnreadOnlyToggle && (\n onUnreadOnlyToggle(!unreadOnly)}\n >\n ) => {\n e.stopPropagation();\n onUnreadOnlyToggle(e.target.checked);\n }}\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n className=\"w-3.5 h-3.5 rounded border-gray-300 dark:border-gray-600 text-blue-600 dark:text-blue-400 focus:ring-blue-500 dark:focus:ring-blue-400 cursor-pointer\"\n />\n {unreadOnlyText}\n
\n )}\n
\n
\n {onMarkAllRead && displayCount > 0 && (\n {\n onMarkAllRead();\n visibleUnreadIdsRef.current.clear();\n }}\n className=\"text-xs text-blue-600 dark:text-blue-400 hover:text-blue-800 dark:hover:text-blue-300 hover:underline cursor-pointer\"\n >\n {markAllReadText}\n \n )}\n {onDeleteAll && notifications.length > 0 && (\n {\n // 드롭다운은 닫지 않음 — 확인 모달이 닫히면 다시 자연스럽게 노출되어야 하고,\n // 사용자가 모달 취소 시에도 컨텍스트 유지 (요구사항)\n onDeleteAll();\n }}\n className=\"text-xs text-red-600 dark:text-red-400 hover:text-red-800 dark:hover:text-red-300 hover:underline cursor-pointer\"\n >\n {deleteAllText}\n \n )}\n
\n
\n
\n {notifications.length === 0 && !loading ? (\n
\n {emptyText}\n
\n ) : (\n <>\n {notifications.map((notification) => {\n const isUnread = !notification.read;\n return (\n {\n notification.onClick?.();\n onNotificationClick?.(notification);\n setShowNotifications(false);\n }}\n className={`group flex items-start gap-3 px-4 py-3 text-left border-b border-gray-100 dark:border-gray-700 transition-colors cursor-pointer ${\n isUnread\n ? 'bg-blue-50/70 dark:bg-blue-900/20 hover:bg-blue-50 dark:hover:bg-blue-900/30'\n : 'bg-white dark:bg-gray-800 hover:bg-gray-50 dark:hover:bg-gray-700/50 opacity-70'\n }`}\n >\n {notification.iconName && (\n \n )}\n
\n \n {notification.title}\n
\n \n {notification.message}\n
\n
\n {notification.time}\n
\n
\n
\n {isUnread && (\n \n )}\n {onDelete && (\n {\n e.stopPropagation();\n onDelete(notification);\n }}\n className=\"p-1 text-gray-400 dark:text-gray-500 hover:text-red-600 dark:hover:text-red-400 rounded hover:bg-red-50 dark:hover:bg-red-900/20 cursor-pointer opacity-0 group-hover:opacity-100 transition-opacity\"\n aria-label=\"Delete notification\"\n >\n \n \n )}\n
\n \n );\n })}\n {/* 무한스크롤 sentinel */}\n {hasMore && (\n
\n {loading ? (\n ...\n ) : (\n \n )}\n
\n )}\n {loading && !hasMore && notifications.length > 0 && (\n
\n ...\n
\n )}\n \n )}\n \n \n )}\n \n );\n};\n\nexport default NotificationCenter;\n","/**\n * Header 컴포넌트\n *\n * 사이트 상단 헤더 컴포넌트입니다.\n * 로고, 검색바, 네비게이션, 사용자 메뉴, 장바구니, 알림을 포함합니다.\n *\n * @see 화면 구성:\n * ┌─────────────────────────────────────────────────────────────────┐\n * │ [Logo] [검색바................] [🔔] [🛒(3)] [👤 닉네임 ▼] │\n * ├─────────────────────────────────────────────────────────────────┤\n * │ [홈] [🔥인기] [🛒쇼핑] [자유게시판] [질문답변] [갤러리] [더보기▼] │\n * └─────────────────────────────────────────────────────────────────┘\n */\n\nimport React, { useState, useRef, useEffect } from 'react';\n\n// 기본 컴포넌트 import\nimport { Div } from '../basic/Div';\nimport { Button } from '../basic/Button';\nimport { Input } from '../basic/Input';\nimport { Span } from '../basic/Span';\nimport { Img } from '../basic/Img';\nimport { Icon } from '../basic/Icon';\nimport { Form } from '../basic/Form';\nimport { Nav } from '../basic/Nav';\nimport { Header as HeaderBasic } from '../basic/Header';\nimport { Hr } from '../basic/Hr';\nimport { A } from '../basic/A';\n\n// ThemeToggle 컴포넌트 import\nimport { ThemeToggle } from './ThemeToggle';\n\n// Avatar 컴포넌트 import\nimport { Avatar } from './Avatar';\n\n// SlotContainer — 헤더 통화 등 모듈 주입 UI 를 떙겨 렌더 (헤더는 주입 모듈을 모름)\nimport { SlotContainer } from './SlotContainer';\n\n// NotificationCenter 컴포넌트 import\nimport { NotificationCenter, type NotificationItem } from './NotificationCenter';\n\n// G7Core.t() 번역 함수 참조\nconst t = (key: string, params?: Record) =>\n (window as any).G7Core?.t?.(key, params) ?? key;\n\n// G7Core.dispatch() navigate 헬퍼\nconst navigate = (path: string) => {\n (window as any).G7Core?.dispatch?.({\n handler: 'navigate',\n params: { path },\n });\n};\n\ninterface Board {\n id: number;\n name: string;\n slug: string;\n icon?: string;\n}\n\ninterface User {\n uuid: string;\n name: string;\n avatar?: string;\n is_admin?: boolean;\n}\n\ninterface HeaderProps {\n /** 사이트 로고 URL */\n logo?: string;\n /** 사이트 이름 */\n siteName?: string;\n /** 현재 로그인된 사용자 */\n user?: User | null;\n /** 장바구니 아이템 수 */\n cartCount?: number;\n /** 읽지 않은 알림 수 */\n notificationCount?: number;\n /** 게시판 목록 */\n boards?: Board[];\n /** 탭에 표시할 최대 게시판 수 */\n maxVisibleBoards?: number;\n /** 모바일 메뉴 열기 콜백 */\n onMobileMenuOpen?: () => void;\n /** 사용 가능한 언어 목록 */\n availableLocales?: string[];\n /** 현재 언어 */\n currentLocale?: string;\n /** 쇼핑몰 기본 경로 (예: \"/shop\", \"/\") */\n shopBase?: string;\n /** 추가 CSS 클래스 */\n className?: string;\n /** 레이아웃 편집기 식별 속성(data-editor-*) — 시각적 루트에 spread */\n editorAttrs?: Record;\n\n // ===== 알림센터 드롭다운 Props =====\n /** 알림 목록 (NotificationCenter에 전달) */\n notifications?: NotificationItem[];\n /** 더 불러올 페이지 존재 여부 */\n notificationHasMore?: boolean;\n /** 알림 로딩 상태 */\n notificationLoading?: boolean;\n /** \"안 읽은 알림만\" 필터 상태 */\n notificationUnreadOnly?: boolean;\n /** 알림 드롭다운 제목 */\n notificationTitleText?: string;\n /** 알림 없음 텍스트 */\n notificationEmptyText?: string;\n /** \"모두 읽음\" 텍스트 */\n notificationMarkAllReadText?: string;\n /** \"모두 삭제\" 텍스트 */\n notificationDeleteAllText?: string;\n /** \"안 읽은 알림만\" 체크박스 텍스트 */\n notificationUnreadOnlyText?: string;\n /** 알림 드롭다운 닫힐 때 (뷰포트에 보인 미읽음 ID 배열 전달) */\n onNotificationClose?: (visibleUnreadIds: (string | number)[]) => void;\n /** 개별 알림 클릭 */\n onNotificationClick?: (notification: NotificationItem) => void;\n /** 무한 스크롤: 추가 로드 */\n onNotificationLoadMore?: () => void;\n /** \"모두 읽음\" 처리 */\n onNotificationMarkAllRead?: () => void;\n /** \"모두 삭제\" 요청 (모달 오픈) */\n onNotificationDeleteAll?: () => void;\n /** 개별 알림 삭제 */\n onNotificationDelete?: (notification: NotificationItem) => void;\n /** \"안 읽은 알림만\" 체크박스 토글 */\n onNotificationUnreadOnlyToggle?: (checked: boolean) => void;\n}\n\n/**\n * 사이트 헤더 컴포넌트\n *\n * @example\n * ```json\n * // 레이아웃 JSON에서 사용\n * {\n * \"type\": \"composite\",\n * \"name\": \"Header\",\n * \"props\": {\n * \"logo\": \"{{_global.settings.site_logo}}\",\n * \"siteName\": \"{{_global.settings.site_name}}\",\n * \"user\": \"{{_global.currentUser}}\",\n * \"cartCount\": \"{{_global.cartCount}}\",\n * \"notificationCount\": \"{{_global.notificationCount}}\",\n * \"boards\": \"{{boards.data}}\",\n * \"maxVisibleBoards\": 5\n * }\n * }\n * ```\n */\nconst Header: React.FC = ({\n logo,\n siteName = '그누보드7',\n user,\n cartCount = 0,\n notificationCount = 0,\n boards = [],\n maxVisibleBoards = 5,\n onMobileMenuOpen,\n availableLocales = [],\n currentLocale = 'ko',\n shopBase = '/shop',\n className = '',\n editorAttrs,\n // 알림센터\n notifications = [],\n notificationHasMore = false,\n notificationLoading = false,\n notificationUnreadOnly = false,\n notificationTitleText,\n notificationEmptyText,\n notificationMarkAllReadText,\n notificationDeleteAllText,\n notificationUnreadOnlyText,\n onNotificationClose,\n onNotificationClick,\n onNotificationLoadMore,\n onNotificationMarkAllRead,\n onNotificationDeleteAll,\n onNotificationDelete,\n onNotificationUnreadOnlyToggle,\n}) => {\n const [searchQuery, setSearchQuery] = useState('');\n const [showUserMenu, setShowUserMenu] = useState(false);\n const [showMoreBoards, setShowMoreBoards] = useState(false);\n const [showLangMenu, setShowLangMenu] = useState(false);\n const [dropdownPosition, setDropdownPosition] = useState<{ top: number; left: number }>({ top: 0, left: 0 });\n const [currentPath, setCurrentPath] = useState(window.location.pathname);\n const userMenuRef = useRef(null);\n const moreButtonRef = useRef(null);\n const langMenuRef = useRef(null);\n\n // G7Core.useResponsive를 통해 반응형 상태 구독 (G7 표준 — 위지윅 overrideWidth 호환)\n const G7Core = (window as any).G7Core;\n const useResponsive = G7Core?.useResponsive;\n const responsiveValue = useResponsive?.();\n const isMobile = responsiveValue\n ? responsiveValue.width < 768\n : typeof window !== 'undefined' && window.innerWidth < 768;\n\n // 경로 변경 감지 (SPA 네비게이션 대응)\n useEffect(() => {\n const handlePopState = () => setCurrentPath(window.location.pathname);\n window.addEventListener('popstate', handlePopState);\n\n // G7Core의 navigate 이벤트 감지\n const originalPushState = history.pushState;\n history.pushState = function(...args) {\n originalPushState.apply(this, args);\n setCurrentPath(window.location.pathname);\n };\n\n return () => {\n window.removeEventListener('popstate', handlePopState);\n history.pushState = originalPushState;\n };\n }, []);\n\n // 경로 매칭 헬퍼 함수\n const isActiveRoute = (path: string, exact = false): boolean => {\n if (exact) {\n return currentPath === path;\n }\n return currentPath === path || currentPath.startsWith(path + '/');\n };\n\n // 쇼핑 관련 경로 체크 (products, cart, checkout, category 등)\n const isShopActive = (): boolean => {\n const base = shopBase === '/' ? '' : shopBase;\n return currentPath.startsWith(`${base}/products`) ||\n currentPath.startsWith(`${base}/cart`) ||\n currentPath.startsWith(`${base}/checkout`) ||\n currentPath.startsWith(`${base}/category`);\n };\n\n // 네비게이션 버튼 스타일\n const getNavButtonClass = (isActive: boolean): string => {\n const baseClass = 'px-3 py-2 text-sm font-medium whitespace-nowrap cursor-pointer rounded-lg transition-colors';\n if (isActive) {\n return `${baseClass} bg-gray-900 text-white dark:bg-white dark:text-gray-900`;\n }\n return `${baseClass} text-gray-700 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white hover:bg-gray-100 dark:hover:bg-gray-800`;\n };\n\n // 메뉴 외부 클릭 시 닫기\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (userMenuRef.current && !userMenuRef.current.contains(event.target as Node)) {\n setShowUserMenu(false);\n }\n if (moreButtonRef.current && !moreButtonRef.current.contains(event.target as Node)) {\n setShowMoreBoards(false);\n }\n if (langMenuRef.current && !langMenuRef.current.contains(event.target as Node)) {\n setShowLangMenu(false);\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n const visibleBoards = boards.slice(0, maxVisibleBoards);\n const hiddenBoards = boards.slice(maxVisibleBoards);\n\n const handleSearch = (e: React.FormEvent) => {\n e.preventDefault();\n if (searchQuery.trim()) {\n navigate(`/search?q=${encodeURIComponent(searchQuery)}`);\n }\n };\n\n const handleLogout = async () => {\n // G7Core.dispatch를 사용하여 logout 핸들러 호출\n // AuthManager가 토큰 삭제, 상태 초기화, 리다이렉트를 처리\n (window as any).G7Core?.dispatch?.({\n handler: 'logout',\n });\n };\n\n // 언어 변경 핸들러 — 헤더 독립 언어 버튼(코어 기능)에서 호출. setLocale 은 비회원도 동작.\n const handleLocaleChange = (locale: string) => {\n (window as any).G7Core?.dispatch?.({\n handler: 'setLocale',\n target: locale,\n });\n setShowLangMenu(false);\n };\n\n // 로케일 코드 → 표시명 (활성 언어팩 native_name 우선, 폴백 사전)\n const getLocaleName = (locale: string): string =>\n (window as any).G7Core?.state?.get?.('_global.appConfig.localeNames')?.[locale] ??\n (locale === 'ko' ? '한국어' : locale === 'en' ? 'English' : locale === 'ja' ? '日本語' : locale === 'zh' ? '中文' : locale === 'es' ? 'Español' : locale === 'fr' ? 'Français' : locale === 'de' ? 'Deutsch' : locale.toUpperCase());\n\n return (\n )}\n className={`sticky top-0 z-50 bg-white dark:bg-gray-900 border-b border-gray-200 dark:border-gray-800 ${className}`}\n >\n {/* 상단 바 */}\n
\n
\n {/* 로고 */}\n \n\n {/* 검색바 (데스크톱 전용) */}\n {!isMobile && (\n
\n
\n setSearchQuery(e.target.value)}\n placeholder={t('common.search_placeholder')}\n className=\"w-full px-4 py-2 pl-10 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n \n
\n
\n )}\n\n {/* 우측 액션 버튼들 */}\n
\n {/* 다크모드 전환 */}\n \n\n {/* 알림센터 드롭다운 — 로그인 사용자에게만 노출 */}\n {user?.uuid && (\n \n )}\n\n {/* 장바구니 */}\n \n\n {/* 언어 선택 — 헤더 독립 버튼(코어 기능, 비회원 포함 전체 노출). 공간 절약 위해 아이콘+로케일 코드만.\n 언어는 항상 존재(이커머스 무관) → 템플릿 헤더 내장. */}\n {availableLocales && availableLocales.length > 1 && (\n
\n setShowLangMenu(!showLangMenu)}\n className=\"flex items-center gap-1.5 px-2.5 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg cursor-pointer transition-colors\"\n aria-haspopup=\"listbox\"\n aria-expanded={showLangMenu}\n aria-label={t('common.language')}\n >\n \n {currentLocale}\n \n \n {showLangMenu && (\n \n {availableLocales.map((locale) => {\n const isActive = locale === currentLocale;\n return (\n handleLocaleChange(locale)}\n className={`w-full px-4 py-2.5 text-left text-sm flex items-center gap-3 cursor-pointer transition-colors ${\n isActive\n ? 'bg-blue-50 dark:bg-blue-900/20 text-blue-600 dark:text-blue-400'\n : 'text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700'\n }`}\n >\n \n {getLocaleName(locale)}\n {isActive && }\n \n );\n })}\n
\n )}\n
\n )}\n\n {/* 통화 선택 — 이커머스 모듈이 'header_currency' 슬롯에 주입(layout_extensions).\n 헤더는 슬롯 이름만 알고 통화/모듈을 모름. 모듈 비활성 시 빈 슬롯 → 미렌더(인프라 자동 게이트).\n id 지정 필수 — 같은 슬롯이 모바일 헤더 SlotContainer 와 동시 렌더되므로 주입 컴포넌트\n root id 가 컨테이너별로 스코프되도록(SlotContainer 가 id 로 자식 root id 를 고유화) 한다. */}\n \n\n {/* 사용자 메뉴 */}\n {user?.uuid ? (\n
\n setShowUserMenu(!showUserMenu)}\n className=\"flex items-center gap-2 p-2 text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white\"\n >\n \n {user.name}\n \n \n\n {/* 드롭다운 메뉴 */}\n {showUserMenu && (\n
\n {/* 사용자 정보 헤더 */}\n
\n
\n \n
\n
{user.name}
\n
{t('common.member')}
\n
\n
\n
\n\n {/* 메뉴 항목 */}\n
\n {/* 관리자 메뉴 (is_admin일 때만 표시) - 하이퍼링크로 전체 페이지 새로고침 */}\n {user.is_admin && (\n <>\n \n \n {t('common.admin_menu')}\n \n
\n \n )}\n \n \n \n
\n\n {/* 언어 선택은 헤더 독립 버튼으로 일원화(드롭다운에서 제거) — 비회원도 헤더에서 전환 가능 */}\n\n
\n \n \n {t('auth.logout')}\n \n
\n )}\n
\n ) : (\n
\n {/* 주문조회 — 로그인 페이지로 진입. 회원은 로그인 후 redirect 파라미터로 마이페이지 주문 내역으로 이동, 비회원은 로그인 페이지의 '비회원 주문 조회' 링크로 폼 진입. 로그아웃된 회원이 비회원 페이지에서 막다른 길에 빠지는 케이스를 차단한다. */}\n navigate('/login?redirect=/mypage/orders')}\n className=\"px-2.5 py-2 text-sm font-medium text-gray-700 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white cursor-pointer\"\n >\n {t('shop.guest_order_form.nav_link')}\n \n navigate('/login')}\n className=\"px-2.5 py-2 text-sm font-medium text-gray-700 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white cursor-pointer\"\n >\n {t('auth.login')}\n \n navigate('/register')}\n className=\"ml-1 px-3 py-2 text-sm font-medium text-white bg-emerald-500 rounded-lg hover:bg-emerald-600 cursor-pointer\"\n >\n {t('auth.register_link')}\n \n
\n )}\n\n {/* 모바일 햄버거 메뉴 (모바일 전용) */}\n {isMobile && (\n \n \n \n )}\n
\n
\n \n\n {/* 탭 네비게이션 (데스크톱 전용) */}\n {!isMobile && (\n \n )}\n \n );\n};\n\nexport default Header;\n","import React from 'react';\n\nexport interface FooterProps extends React.HTMLAttributes {\n ref?: React.Ref;\n}\n\n/**\n * 기본 footer 컴포넌트\n */\nexport const Footer = React.forwardRef(({\n children,\n className = '',\n ...props\n}, ref) => {\n return (\n \n {children}\n \n );\n});\n","/**\n * Footer 컴포넌트\n *\n * 사이트 하단 푸터 컴포넌트입니다.\n * 사이트 정보, 링크 그룹, 소셜 링크, 저작권 표시를 포함합니다.\n *\n * @see 화면 구성:\n * ┌─────────────────────────────────────────────────────────────────┐\n * │ [사이트명] │\n * │ 함께 성장하는 커뮤니티 │\n * ├────────────┬────────────┬────────────┬────────────────────────────┤\n * │ 커뮤니티 │ 정보 │ 정책 │ [GitHub] [Twitter] [Discord]│\n * ├─────────────────────────────────────────────────────────────────┤\n * │ © 2026 사이트명. All rights reserved. Made with ❤️ │\n * └─────────────────────────────────────────────────────────────────┘\n */\n\nimport React from 'react';\n\n// 기본 컴포넌트 import\nimport { Div } from '../basic/Div';\nimport { A } from '../basic/A';\nimport { Button } from '../basic/Button';\nimport { H3 } from '../basic/H3';\nimport { H4 } from '../basic/H4';\nimport { P } from '../basic/P';\nimport { Ul } from '../basic/Ul';\nimport { Li } from '../basic/Li';\nimport { Footer as FooterBasic } from '../basic/Footer';\nimport { Icon } from '../basic/Icon';\n\n// G7Core.t() 번역 함수 참조\nconst t = (key: string, params?: Record) =>\n (window as any).G7Core?.t?.(key, params) ?? key;\n\n// G7 표준 반응형 breakpoint — 모바일(< 768) / 데스크톱(>= 1024).\n// 레이아웃 편집기 프리뷰 호환을 위해 Tailwind md:/lg:/sm: 미디어쿼리 대신\n// G7Core.useResponsive() width 기반 분기 사용 (편집 가능 템플릿은 G7 표준\n// responsive 만 허용 — viewport 미디어쿼리는 프리뷰 overrideWidth 를 무시).\nconst TABLET_BREAKPOINT = 768;\nconst DESKTOP_BREAKPOINT = 1024;\n\n// G7Core.dispatch() navigate 헬퍼\nconst navigate = (path: string) => {\n (window as any).G7Core?.dispatch?.({\n handler: 'navigate',\n params: { path },\n });\n};\n\ninterface SocialLinks {\n github?: string;\n twitter?: string;\n discord?: string;\n facebook?: string;\n instagram?: string;\n}\n\ninterface FooterLink {\n label: string;\n href: string;\n}\n\ninterface FooterLinkGroup {\n title: string;\n links: FooterLink[];\n}\n\ninterface FooterProps {\n /** 사이트 이름 */\n siteName?: string;\n /** 사이트 설명 */\n siteDescription?: string;\n /** 저작권 텍스트 */\n copyrightText?: string;\n /** 소셜 미디어 링크 */\n socialLinks?: SocialLinks;\n /** 링크 그룹 (미지정 시 기본값 사용) */\n linkGroups?: FooterLinkGroup[];\n /** 추가 CSS 클래스 */\n className?: string;\n /** 레이아웃 편집기 식별 속성(data-editor-*) — 시각적 루트에 spread */\n editorAttrs?: Record;\n}\n\n/**\n * 사이트 푸터 컴포넌트\n *\n * @example\n * ```json\n * // 레이아웃 JSON에서 사용\n * {\n * \"type\": \"composite\",\n * \"name\": \"Footer\",\n * \"props\": {\n * \"siteName\": \"{{_global.settings.site_name}}\",\n * \"siteDescription\": \"{{_global.settings.site_description}}\",\n * \"copyrightText\": \"{{_global.settings.copyright_text}}\",\n * \"socialLinks\": {\n * \"github\": \"https://github.com/...\",\n * \"twitter\": \"https://twitter.com/...\",\n * \"discord\": \"https://discord.gg/...\"\n * }\n * }\n * }\n * ```\n */\nconst Footer: React.FC = ({\n siteName = '그누보드7',\n siteDescription,\n copyrightText,\n socialLinks = {},\n linkGroups,\n className = '',\n editorAttrs,\n}) => {\n const currentYear = new Date().getFullYear();\n\n // G7 표준 반응형 — useResponsive() 로 프리뷰 overrideWidth 수신 (편집기 디바이스\n // 전환에 정상 반응). hook 미주입 시 window.innerWidth fallback.\n const G7Core = (window as any).G7Core;\n const useResponsive = G7Core?.useResponsive as (() => { width: number }) | undefined;\n const responsiveValue = useResponsive?.();\n const width =\n responsiveValue?.width ??\n (typeof window !== 'undefined' ? window.innerWidth : DESKTOP_BREAKPOINT);\n const isMobile = width < TABLET_BREAKPOINT;\n const isDesktop = width >= DESKTOP_BREAKPOINT;\n // 링크 그룹 그리드 컬럼 — 모바일 1열 / 태블릿 2열 / 데스크톱 5열.\n const gridColumns = isMobile ? 1 : isDesktop ? 5 : 2;\n\n // 기본 링크 그룹\n const defaultLinkGroups: FooterLinkGroup[] = [\n {\n title: t('footer.community'),\n links: [\n { label: t('nav.home'), href: '/' },\n { label: t('nav.popular'), href: '/boards/popular' },\n { label: t('footer.all_boards'), href: '/boards' },\n ],\n },\n {\n title: t('footer.info'),\n links: [\n { label: t('footer.about'), href: '/page/about' },\n { label: t('footer.faq'), href: '/page/faq' },\n { label: t('footer.contact'), href: '/page/contact' },\n ],\n },\n {\n title: t('footer.policy'),\n links: [\n { label: t('footer.terms'), href: '/page/terms' },\n { label: t('footer.privacy'), href: '/page/privacy' },\n { label: t('footer.refund'), href: '/page/refund' },\n ],\n },\n ];\n\n const groups = linkGroups || defaultLinkGroups;\n\n // 소셜 아이콘 이름 매핑\n const socialIconMap: Record = {\n github: 'github',\n twitter: 'twitter',\n discord: 'discord',\n facebook: 'facebook',\n instagram: 'instagram',\n };\n\n return (\n )}\n className={`bg-gray-50 dark:bg-gray-900 border-t border-gray-200 dark:border-gray-800 ${className}`}\n >\n
\n \n {/* 사이트 정보 — 데스크톱(5열)에서만 2칸 차지 */}\n
\n

{siteName}

\n {siteDescription && (\n

{siteDescription}

\n )}\n\n {/* 소셜 링크 */}\n
\n {Object.entries(socialLinks).map(([type, url]) =>\n url ? (\n \n \n \n ) : null\n )}\n
\n
\n\n {/* 링크 그룹 */}\n {groups.map((group, index) => (\n
\n

\n {group.title}\n

\n
    \n {group.links.map((link, linkIndex) => (\n
  • \n navigate(link.href)}\n className=\"text-sm text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white cursor-pointer\"\n >\n {link.label}\n \n
  • \n ))}\n
\n
\n ))}\n
\n\n {/* 저작권 */}\n \n

\n {copyrightText || `© ${currentYear} ${siteName}. All rights reserved.`}\n

\n

\n {t('footer.powered_by')}\n

\n \n \n \n );\n};\n\nexport default Footer;\n","/**\n * MobileNav 컴포넌트\n *\n * 모바일 환경에서 표시되는 슬라이드 드로어 네비게이션입니다.\n * 햄버거 메뉴 클릭 시 좌측에서 슬라이드하며 나타납니다.\n */\n\nimport React, { useEffect, useRef } from 'react';\nimport { Div } from '../basic/Div';\nimport { Button } from '../basic/Button';\nimport { Span } from '../basic/Span';\nimport { P } from '../basic/P';\nimport { Icon } from '../basic/Icon';\nimport { Img } from '../basic/Img';\nimport { Nav } from '../basic/Nav';\nimport { Ul } from '../basic/Ul';\nimport { Li } from '../basic/Li';\n\n/**\n * G7Core 번역 함수\n */\nconst t = (key: string, params?: Record) =>\n (window as any).G7Core?.t?.(key, params) ?? key;\n\n/**\n * G7Core navigate 헬퍼\n */\nconst navigate = (path: string) => {\n (window as any).G7Core?.dispatch?.({\n handler: 'navigate',\n params: { path },\n });\n};\n\ninterface Board {\n id: number;\n name: string;\n slug: string;\n icon?: string;\n}\n\ninterface User {\n id: number;\n name: string;\n avatar?: string;\n}\n\ninterface MobileNavProps {\n /** 드로어 열림 상태 */\n isOpen: boolean;\n /** 닫기 콜백 */\n onClose: () => void;\n /** 사이트 로고 URL */\n logo?: string;\n /** 사이트 이름 */\n siteName?: string;\n /** 현재 로그인된 사용자 */\n user?: User | null;\n /** 게시판 목록 */\n boards?: Board[];\n /** 장바구니 아이템 수 */\n cartCount?: number;\n}\n\n/**\n * 모바일 네비게이션 드로어\n *\n * @example\n * ```tsx\n * const [isOpen, setIsOpen] = useState(false);\n *\n * setIsOpen(false)}\n * user={currentUser}\n * boards={boards}\n * />\n * ```\n */\nconst MobileNav: React.FC = ({\n isOpen,\n onClose,\n logo,\n siteName = '그누보드7',\n user,\n boards = [],\n cartCount = 0,\n}) => {\n const drawerRef = useRef(null);\n\n // G7Core.useResponsive를 통해 반응형 상태 구독 (G7 표준 — 위지윅 overrideWidth 호환)\n const G7Core = (window as any).G7Core;\n const useResponsive = G7Core?.useResponsive;\n const responsiveValue = useResponsive?.();\n // lg 미만(< 1024px)에서만 드로어 노출 — 데스크톱은 Header의 탭 nav 사용\n const isPortable = responsiveValue\n ? responsiveValue.width < 1024\n : typeof window !== 'undefined' && window.innerWidth < 1024;\n\n // ESC 키로 닫기\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose();\n }\n };\n\n if (isOpen) {\n document.addEventListener('keydown', handleEscape);\n document.body.style.overflow = 'hidden';\n }\n\n return () => {\n document.removeEventListener('keydown', handleEscape);\n document.body.style.overflow = '';\n };\n }, [isOpen, onClose]);\n\n // 오버레이 클릭으로 닫기\n const handleOverlayClick = (e: React.MouseEvent) => {\n if (e.target === e.currentTarget) {\n onClose();\n }\n };\n\n if (!isOpen) return null;\n // 데스크톱(lg+)에서는 모바일 드로어 자체를 노출하지 않음 (위지윅 overrideWidth 호환)\n if (!isPortable) return null;\n\n return (\n \n {/* 오버레이 */}\n
\n\n {/* 드로어 */}\n \n {/* 헤더 */}\n
\n \n \n \n \n
\n\n {/* 사용자 정보 */}\n {user ? (\n
\n
\n {user.avatar ? (\n {user.name}\n ) : (\n
\n {(user.name || 'U').charAt(0).toUpperCase()}\n
\n )}\n
\n

{user.name}

\n \n
\n
\n
\n ) : (\n
\n
\n { onClose(); navigate('/login'); }}\n className=\"flex-1 py-2 text-center text-sm font-medium text-white bg-gray-900 dark:bg-white dark:text-gray-900 rounded-lg cursor-pointer\"\n >\n {t('auth.login')}\n \n { onClose(); navigate('/register'); }}\n className=\"flex-1 py-2 text-center text-sm font-medium text-gray-700 dark:text-gray-300 border border-gray-300 dark:border-gray-600 rounded-lg cursor-pointer\"\n >\n {t('auth.register')}\n \n
\n
\n )}\n\n {/* 메뉴 */}\n \n\n {/* 하단 링크 */}\n
\n
\n \n \n \n
\n
\n
\n \n );\n};\n\nexport default MobileNav;\n","/*! @license DOMPurify 3.3.1 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.3.1/LICENSE */\n\nconst {\n entries,\n setPrototypeOf,\n isFrozen,\n getPrototypeOf,\n getOwnPropertyDescriptor\n} = Object;\nlet {\n freeze,\n seal,\n create\n} = Object; // eslint-disable-line import/no-mutable-exports\nlet {\n apply,\n construct\n} = typeof Reflect !== 'undefined' && Reflect;\nif (!freeze) {\n freeze = function freeze(x) {\n return x;\n };\n}\nif (!seal) {\n seal = function seal(x) {\n return x;\n };\n}\nif (!apply) {\n apply = function apply(func, thisArg) {\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return func.apply(thisArg, args);\n };\n}\nif (!construct) {\n construct = function construct(Func) {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n return new Func(...args);\n };\n}\nconst arrayForEach = unapply(Array.prototype.forEach);\nconst arrayLastIndexOf = unapply(Array.prototype.lastIndexOf);\nconst arrayPop = unapply(Array.prototype.pop);\nconst arrayPush = unapply(Array.prototype.push);\nconst arraySplice = unapply(Array.prototype.splice);\nconst stringToLowerCase = unapply(String.prototype.toLowerCase);\nconst stringToString = unapply(String.prototype.toString);\nconst stringMatch = unapply(String.prototype.match);\nconst stringReplace = unapply(String.prototype.replace);\nconst stringIndexOf = unapply(String.prototype.indexOf);\nconst stringTrim = unapply(String.prototype.trim);\nconst objectHasOwnProperty = unapply(Object.prototype.hasOwnProperty);\nconst regExpTest = unapply(RegExp.prototype.test);\nconst typeErrorCreate = unconstruct(TypeError);\n/**\n * Creates a new function that calls the given function with a specified thisArg and arguments.\n *\n * @param func - The function to be wrapped and called.\n * @returns A new function that calls the given function with a specified thisArg and arguments.\n */\nfunction unapply(func) {\n return function (thisArg) {\n if (thisArg instanceof RegExp) {\n thisArg.lastIndex = 0;\n }\n for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n args[_key3 - 1] = arguments[_key3];\n }\n return apply(func, thisArg, args);\n };\n}\n/**\n * Creates a new function that constructs an instance of the given constructor function with the provided arguments.\n *\n * @param func - The constructor function to be wrapped and called.\n * @returns A new function that constructs an instance of the given constructor function with the provided arguments.\n */\nfunction unconstruct(Func) {\n return function () {\n for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n args[_key4] = arguments[_key4];\n }\n return construct(Func, args);\n };\n}\n/**\n * Add properties to a lookup table\n *\n * @param set - The set to which elements will be added.\n * @param array - The array containing elements to be added to the set.\n * @param transformCaseFunc - An optional function to transform the case of each element before adding to the set.\n * @returns The modified set with added elements.\n */\nfunction addToSet(set, array) {\n let transformCaseFunc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : stringToLowerCase;\n if (setPrototypeOf) {\n // Make 'in' and truthy checks like Boolean(set.constructor)\n // independent of any properties defined on Object.prototype.\n // Prevent prototype setters from intercepting set as a this value.\n setPrototypeOf(set, null);\n }\n let l = array.length;\n while (l--) {\n let element = array[l];\n if (typeof element === 'string') {\n const lcElement = transformCaseFunc(element);\n if (lcElement !== element) {\n // Config presets (e.g. tags.js, attrs.js) are immutable.\n if (!isFrozen(array)) {\n array[l] = lcElement;\n }\n element = lcElement;\n }\n }\n set[element] = true;\n }\n return set;\n}\n/**\n * Clean up an array to harden against CSPP\n *\n * @param array - The array to be cleaned.\n * @returns The cleaned version of the array\n */\nfunction cleanArray(array) {\n for (let index = 0; index < array.length; index++) {\n const isPropertyExist = objectHasOwnProperty(array, index);\n if (!isPropertyExist) {\n array[index] = null;\n }\n }\n return array;\n}\n/**\n * Shallow clone an object\n *\n * @param object - The object to be cloned.\n * @returns A new object that copies the original.\n */\nfunction clone(object) {\n const newObject = create(null);\n for (const [property, value] of entries(object)) {\n const isPropertyExist = objectHasOwnProperty(object, property);\n if (isPropertyExist) {\n if (Array.isArray(value)) {\n newObject[property] = cleanArray(value);\n } else if (value && typeof value === 'object' && value.constructor === Object) {\n newObject[property] = clone(value);\n } else {\n newObject[property] = value;\n }\n }\n }\n return newObject;\n}\n/**\n * This method automatically checks if the prop is function or getter and behaves accordingly.\n *\n * @param object - The object to look up the getter function in its prototype chain.\n * @param prop - The property name for which to find the getter function.\n * @returns The getter function found in the prototype chain or a fallback function.\n */\nfunction lookupGetter(object, prop) {\n while (object !== null) {\n const desc = getOwnPropertyDescriptor(object, prop);\n if (desc) {\n if (desc.get) {\n return unapply(desc.get);\n }\n if (typeof desc.value === 'function') {\n return unapply(desc.value);\n }\n }\n object = getPrototypeOf(object);\n }\n function fallbackValue() {\n return null;\n }\n return fallbackValue;\n}\n\nconst html$1 = freeze(['a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'big', 'blink', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'decorator', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'element', 'em', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meter', 'nav', 'nobr', 'ol', 'optgroup', 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'search', 'section', 'select', 'shadow', 'slot', 'small', 'source', 'spacer', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr']);\nconst svg$1 = freeze(['svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'enterkeyhint', 'exportparts', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'inputmode', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'part', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'view', 'vkern']);\nconst svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']);\n// List of SVG elements that are disallowed by default.\n// We still need to know them so that we can do namespace\n// checks properly in case one wants to add them to\n// allow-list.\nconst svgDisallowed = freeze(['animate', 'color-profile', 'cursor', 'discard', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'foreignobject', 'hatch', 'hatchpath', 'mesh', 'meshgradient', 'meshpatch', 'meshrow', 'missing-glyph', 'script', 'set', 'solidcolor', 'unknown', 'use']);\nconst mathMl$1 = freeze(['math', 'menclose', 'merror', 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mspace', 'msqrt', 'mstyle', 'msub', 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover', 'mprescripts']);\n// Similarly to SVG, we want to know all MathML elements,\n// even those that we disallow by default.\nconst mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']);\nconst text = freeze(['#text']);\n\nconst html = freeze(['accept', 'action', 'align', 'alt', 'autocapitalize', 'autocomplete', 'autopictureinpicture', 'autoplay', 'background', 'bgcolor', 'border', 'capture', 'cellpadding', 'cellspacing', 'checked', 'cite', 'class', 'clear', 'color', 'cols', 'colspan', 'controls', 'controlslist', 'coords', 'crossorigin', 'datetime', 'decoding', 'default', 'dir', 'disabled', 'disablepictureinpicture', 'disableremoteplayback', 'download', 'draggable', 'enctype', 'enterkeyhint', 'exportparts', 'face', 'for', 'headers', 'height', 'hidden', 'high', 'href', 'hreflang', 'id', 'inert', 'inputmode', 'integrity', 'ismap', 'kind', 'label', 'lang', 'list', 'loading', 'loop', 'low', 'max', 'maxlength', 'media', 'method', 'min', 'minlength', 'multiple', 'muted', 'name', 'nonce', 'noshade', 'novalidate', 'nowrap', 'open', 'optimum', 'part', 'pattern', 'placeholder', 'playsinline', 'popover', 'popovertarget', 'popovertargetaction', 'poster', 'preload', 'pubdate', 'radiogroup', 'readonly', 'rel', 'required', 'rev', 'reversed', 'role', 'rows', 'rowspan', 'spellcheck', 'scope', 'selected', 'shape', 'size', 'sizes', 'slot', 'span', 'srclang', 'start', 'src', 'srcset', 'step', 'style', 'summary', 'tabindex', 'title', 'translate', 'type', 'usemap', 'valign', 'value', 'width', 'wrap', 'xmlns', 'slot']);\nconst svg = freeze(['accent-height', 'accumulate', 'additive', 'alignment-baseline', 'amplitude', 'ascent', 'attributename', 'attributetype', 'azimuth', 'basefrequency', 'baseline-shift', 'begin', 'bias', 'by', 'class', 'clip', 'clippathunits', 'clip-path', 'clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cx', 'cy', 'd', 'dx', 'dy', 'diffuseconstant', 'direction', 'display', 'divisor', 'dur', 'edgemode', 'elevation', 'end', 'exponent', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'filterunits', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'glyphref', 'gradientunits', 'gradienttransform', 'height', 'href', 'id', 'image-rendering', 'in', 'in2', 'intercept', 'k', 'k1', 'k2', 'k3', 'k4', 'kerning', 'keypoints', 'keysplines', 'keytimes', 'lang', 'lengthadjust', 'letter-spacing', 'kernelmatrix', 'kernelunitlength', 'lighting-color', 'local', 'marker-end', 'marker-mid', 'marker-start', 'markerheight', 'markerunits', 'markerwidth', 'maskcontentunits', 'maskunits', 'max', 'mask', 'mask-type', 'media', 'method', 'mode', 'min', 'name', 'numoctaves', 'offset', 'operator', 'opacity', 'order', 'orient', 'orientation', 'origin', 'overflow', 'paint-order', 'path', 'pathlength', 'patterncontentunits', 'patterntransform', 'patternunits', 'points', 'preservealpha', 'preserveaspectratio', 'primitiveunits', 'r', 'rx', 'ry', 'radius', 'refx', 'refy', 'repeatcount', 'repeatdur', 'restart', 'result', 'rotate', 'scale', 'seed', 'shape-rendering', 'slope', 'specularconstant', 'specularexponent', 'spreadmethod', 'startoffset', 'stddeviation', 'stitchtiles', 'stop-color', 'stop-opacity', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke', 'stroke-width', 'style', 'surfacescale', 'systemlanguage', 'tabindex', 'tablevalues', 'targetx', 'targety', 'transform', 'transform-origin', 'text-anchor', 'text-decoration', 'text-rendering', 'textlength', 'type', 'u1', 'u2', 'unicode', 'values', 'viewbox', 'visibility', 'version', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'width', 'word-spacing', 'wrap', 'writing-mode', 'xchannelselector', 'ychannelselector', 'x', 'x1', 'x2', 'xmlns', 'y', 'y1', 'y2', 'z', 'zoomandpan']);\nconst mathMl = freeze(['accent', 'accentunder', 'align', 'bevelled', 'close', 'columnsalign', 'columnlines', 'columnspan', 'denomalign', 'depth', 'dir', 'display', 'displaystyle', 'encoding', 'fence', 'frame', 'height', 'href', 'id', 'largeop', 'length', 'linethickness', 'lspace', 'lquote', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'maxsize', 'minsize', 'movablelimits', 'notation', 'numalign', 'open', 'rowalign', 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'rquote', 'scriptlevel', 'scriptminsize', 'scriptsizemultiplier', 'selection', 'separator', 'separators', 'stretchy', 'subscriptshift', 'supscriptshift', 'symmetric', 'voffset', 'width', 'xmlns']);\nconst xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']);\n\n// eslint-disable-next-line unicorn/better-regex\nconst MUSTACHE_EXPR = seal(/\\{\\{[\\w\\W]*|[\\w\\W]*\\}\\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode\nconst ERB_EXPR = seal(/<%[\\w\\W]*|[\\w\\W]*%>/gm);\nconst TMPLIT_EXPR = seal(/\\$\\{[\\w\\W]*/gm); // eslint-disable-line unicorn/better-regex\nconst DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]+$/); // eslint-disable-line no-useless-escape\nconst ARIA_ATTR = seal(/^aria-[\\-\\w]+$/); // eslint-disable-line no-useless-escape\nconst IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i // eslint-disable-line no-useless-escape\n);\nconst IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\nconst ATTR_WHITESPACE = seal(/[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g // eslint-disable-line no-control-regex\n);\nconst DOCTYPE_NAME = seal(/^html$/i);\nconst CUSTOM_ELEMENT = seal(/^[a-z][.\\w]*(-[.\\w]+)+$/i);\n\nvar EXPRESSIONS = /*#__PURE__*/Object.freeze({\n __proto__: null,\n ARIA_ATTR: ARIA_ATTR,\n ATTR_WHITESPACE: ATTR_WHITESPACE,\n CUSTOM_ELEMENT: CUSTOM_ELEMENT,\n DATA_ATTR: DATA_ATTR,\n DOCTYPE_NAME: DOCTYPE_NAME,\n ERB_EXPR: ERB_EXPR,\n IS_ALLOWED_URI: IS_ALLOWED_URI,\n IS_SCRIPT_OR_DATA: IS_SCRIPT_OR_DATA,\n MUSTACHE_EXPR: MUSTACHE_EXPR,\n TMPLIT_EXPR: TMPLIT_EXPR\n});\n\n/* eslint-disable @typescript-eslint/indent */\n// https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\nconst NODE_TYPE = {\n element: 1,\n attribute: 2,\n text: 3,\n cdataSection: 4,\n entityReference: 5,\n // Deprecated\n entityNode: 6,\n // Deprecated\n progressingInstruction: 7,\n comment: 8,\n document: 9,\n documentType: 10,\n documentFragment: 11,\n notation: 12 // Deprecated\n};\nconst getGlobal = function getGlobal() {\n return typeof window === 'undefined' ? null : window;\n};\n/**\n * Creates a no-op policy for internal use only.\n * Don't export this function outside this module!\n * @param trustedTypes The policy factory.\n * @param purifyHostElement The Script element used to load DOMPurify (to determine policy name suffix).\n * @return The policy created (or null, if Trusted Types\n * are not supported or creating the policy failed).\n */\nconst _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, purifyHostElement) {\n if (typeof trustedTypes !== 'object' || typeof trustedTypes.createPolicy !== 'function') {\n return null;\n }\n // Allow the callers to control the unique policy name\n // by adding a data-tt-policy-suffix to the script element with the DOMPurify.\n // Policy creation with duplicate names throws in Trusted Types.\n let suffix = null;\n const ATTR_NAME = 'data-tt-policy-suffix';\n if (purifyHostElement && purifyHostElement.hasAttribute(ATTR_NAME)) {\n suffix = purifyHostElement.getAttribute(ATTR_NAME);\n }\n const policyName = 'dompurify' + (suffix ? '#' + suffix : '');\n try {\n return trustedTypes.createPolicy(policyName, {\n createHTML(html) {\n return html;\n },\n createScriptURL(scriptUrl) {\n return scriptUrl;\n }\n });\n } catch (_) {\n // Policy creation failed (most likely another DOMPurify script has\n // already run). Skip creating the policy, as this will only cause errors\n // if TT are enforced.\n console.warn('TrustedTypes policy ' + policyName + ' could not be created.');\n return null;\n }\n};\nconst _createHooksMap = function _createHooksMap() {\n return {\n afterSanitizeAttributes: [],\n afterSanitizeElements: [],\n afterSanitizeShadowDOM: [],\n beforeSanitizeAttributes: [],\n beforeSanitizeElements: [],\n beforeSanitizeShadowDOM: [],\n uponSanitizeAttribute: [],\n uponSanitizeElement: [],\n uponSanitizeShadowNode: []\n };\n};\nfunction createDOMPurify() {\n let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();\n const DOMPurify = root => createDOMPurify(root);\n DOMPurify.version = '3.3.1';\n DOMPurify.removed = [];\n if (!window || !window.document || window.document.nodeType !== NODE_TYPE.document || !window.Element) {\n // Not running in a browser, provide a factory function\n // so that you can pass your own Window\n DOMPurify.isSupported = false;\n return DOMPurify;\n }\n let {\n document\n } = window;\n const originalDocument = document;\n const currentScript = originalDocument.currentScript;\n const {\n DocumentFragment,\n HTMLTemplateElement,\n Node,\n Element,\n NodeFilter,\n NamedNodeMap = window.NamedNodeMap || window.MozNamedAttrMap,\n HTMLFormElement,\n DOMParser,\n trustedTypes\n } = window;\n const ElementPrototype = Element.prototype;\n const cloneNode = lookupGetter(ElementPrototype, 'cloneNode');\n const remove = lookupGetter(ElementPrototype, 'remove');\n const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');\n const getChildNodes = lookupGetter(ElementPrototype, 'childNodes');\n const getParentNode = lookupGetter(ElementPrototype, 'parentNode');\n // As per issue #47, the web-components registry is inherited by a\n // new document created via createHTMLDocument. As per the spec\n // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)\n // a new empty registry is used when creating a template contents owner\n // document, so we use that as our parent document to ensure nothing\n // is inherited.\n if (typeof HTMLTemplateElement === 'function') {\n const template = document.createElement('template');\n if (template.content && template.content.ownerDocument) {\n document = template.content.ownerDocument;\n }\n }\n let trustedTypesPolicy;\n let emptyHTML = '';\n const {\n implementation,\n createNodeIterator,\n createDocumentFragment,\n getElementsByTagName\n } = document;\n const {\n importNode\n } = originalDocument;\n let hooks = _createHooksMap();\n /**\n * Expose whether this browser supports running the full DOMPurify.\n */\n DOMPurify.isSupported = typeof entries === 'function' && typeof getParentNode === 'function' && implementation && implementation.createHTMLDocument !== undefined;\n const {\n MUSTACHE_EXPR,\n ERB_EXPR,\n TMPLIT_EXPR,\n DATA_ATTR,\n ARIA_ATTR,\n IS_SCRIPT_OR_DATA,\n ATTR_WHITESPACE,\n CUSTOM_ELEMENT\n } = EXPRESSIONS;\n let {\n IS_ALLOWED_URI: IS_ALLOWED_URI$1\n } = EXPRESSIONS;\n /**\n * We consider the elements and attributes below to be safe. Ideally\n * don't add any new ones but feel free to remove unwanted ones.\n */\n /* allowed element names */\n let ALLOWED_TAGS = null;\n const DEFAULT_ALLOWED_TAGS = addToSet({}, [...html$1, ...svg$1, ...svgFilters, ...mathMl$1, ...text]);\n /* Allowed attribute names */\n let ALLOWED_ATTR = null;\n const DEFAULT_ALLOWED_ATTR = addToSet({}, [...html, ...svg, ...mathMl, ...xml]);\n /*\n * Configure how DOMPurify should handle custom elements and their attributes as well as customized built-in elements.\n * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)\n * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)\n * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.\n */\n let CUSTOM_ELEMENT_HANDLING = Object.seal(create(null, {\n tagNameCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n },\n attributeNameCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n },\n allowCustomizedBuiltInElements: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: false\n }\n }));\n /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */\n let FORBID_TAGS = null;\n /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */\n let FORBID_ATTR = null;\n /* Config object to store ADD_TAGS/ADD_ATTR functions (when used as functions) */\n const EXTRA_ELEMENT_HANDLING = Object.seal(create(null, {\n tagCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n },\n attributeCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n }\n }));\n /* Decide if ARIA attributes are okay */\n let ALLOW_ARIA_ATTR = true;\n /* Decide if custom data attributes are okay */\n let ALLOW_DATA_ATTR = true;\n /* Decide if unknown protocols are okay */\n let ALLOW_UNKNOWN_PROTOCOLS = false;\n /* Decide if self-closing tags in attributes are allowed.\n * Usually removed due to a mXSS issue in jQuery 3.0 */\n let ALLOW_SELF_CLOSE_IN_ATTR = true;\n /* Output should be safe for common template engines.\n * This means, DOMPurify removes data attributes, mustaches and ERB\n */\n let SAFE_FOR_TEMPLATES = false;\n /* Output should be safe even for XML used within HTML and alike.\n * This means, DOMPurify removes comments when containing risky content.\n */\n let SAFE_FOR_XML = true;\n /* Decide if document with ... should be returned */\n let WHOLE_DOCUMENT = false;\n /* Track whether config is already set on this instance of DOMPurify. */\n let SET_CONFIG = false;\n /* Decide if all elements (e.g. style, script) must be children of\n * document.body. By default, browsers might move them to document.head */\n let FORCE_BODY = false;\n /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported).\n * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead\n */\n let RETURN_DOM = false;\n /* Decide if a DOM `DocumentFragment` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported) */\n let RETURN_DOM_FRAGMENT = false;\n /* Try to return a Trusted Type object instead of a string, return a string in\n * case Trusted Types are not supported */\n let RETURN_TRUSTED_TYPE = false;\n /* Output should be free from DOM clobbering attacks?\n * This sanitizes markups named with colliding, clobberable built-in DOM APIs.\n */\n let SANITIZE_DOM = true;\n /* Achieve full DOM Clobbering protection by isolating the namespace of named\n * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.\n *\n * HTML/DOM spec rules that enable DOM Clobbering:\n * - Named Access on Window (§7.3.3)\n * - DOM Tree Accessors (§3.1.5)\n * - Form Element Parent-Child Relations (§4.10.3)\n * - Iframe srcdoc / Nested WindowProxies (§4.8.5)\n * - HTMLCollection (§4.2.10.2)\n *\n * Namespace isolation is implemented by prefixing `id` and `name` attributes\n * with a constant string, i.e., `user-content-`\n */\n let SANITIZE_NAMED_PROPS = false;\n const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';\n /* Keep element content when removing element? */\n let KEEP_CONTENT = true;\n /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead\n * of importing it into a new Document and returning a sanitized copy */\n let IN_PLACE = false;\n /* Allow usage of profiles like html, svg and mathMl */\n let USE_PROFILES = {};\n /* Tags to ignore content of when KEEP_CONTENT is true */\n let FORBID_CONTENTS = null;\n const DEFAULT_FORBID_CONTENTS = addToSet({}, ['annotation-xml', 'audio', 'colgroup', 'desc', 'foreignobject', 'head', 'iframe', 'math', 'mi', 'mn', 'mo', 'ms', 'mtext', 'noembed', 'noframes', 'noscript', 'plaintext', 'script', 'style', 'svg', 'template', 'thead', 'title', 'video', 'xmp']);\n /* Tags that are safe for data: URIs */\n let DATA_URI_TAGS = null;\n const DEFAULT_DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']);\n /* Attributes safe for values like \"javascript:\" */\n let URI_SAFE_ATTRIBUTES = null;\n const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'role', 'summary', 'title', 'value', 'style', 'xmlns']);\n const MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n /* Document namespace */\n let NAMESPACE = HTML_NAMESPACE;\n let IS_EMPTY_INPUT = false;\n /* Allowed XHTML+XML namespaces */\n let ALLOWED_NAMESPACES = null;\n const DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE], stringToString);\n let MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']);\n let HTML_INTEGRATION_POINTS = addToSet({}, ['annotation-xml']);\n // Certain elements are allowed in both SVG and HTML\n // namespace. We need to specify them explicitly\n // so that they don't get erroneously deleted from\n // HTML namespace.\n const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ['title', 'style', 'font', 'a', 'script']);\n /* Parsing of strict XHTML documents */\n let PARSER_MEDIA_TYPE = null;\n const SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html'];\n const DEFAULT_PARSER_MEDIA_TYPE = 'text/html';\n let transformCaseFunc = null;\n /* Keep a reference to config to pass to hooks */\n let CONFIG = null;\n /* Ideally, do not touch anything below this line */\n /* ______________________________________________ */\n const formElement = document.createElement('form');\n const isRegexOrFunction = function isRegexOrFunction(testValue) {\n return testValue instanceof RegExp || testValue instanceof Function;\n };\n /**\n * _parseConfig\n *\n * @param cfg optional config literal\n */\n // eslint-disable-next-line complexity\n const _parseConfig = function _parseConfig() {\n let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n if (CONFIG && CONFIG === cfg) {\n return;\n }\n /* Shield configuration object from tampering */\n if (!cfg || typeof cfg !== 'object') {\n cfg = {};\n }\n /* Shield configuration object from prototype pollution */\n cfg = clone(cfg);\n PARSER_MEDIA_TYPE =\n // eslint-disable-next-line unicorn/prefer-includes\n SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? DEFAULT_PARSER_MEDIA_TYPE : cfg.PARSER_MEDIA_TYPE;\n // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.\n transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? stringToString : stringToLowerCase;\n /* Set configuration parameters */\n ALLOWED_TAGS = objectHasOwnProperty(cfg, 'ALLOWED_TAGS') ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc) : DEFAULT_ALLOWED_TAGS;\n ALLOWED_ATTR = objectHasOwnProperty(cfg, 'ALLOWED_ATTR') ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc) : DEFAULT_ALLOWED_ATTR;\n ALLOWED_NAMESPACES = objectHasOwnProperty(cfg, 'ALLOWED_NAMESPACES') ? addToSet({}, cfg.ALLOWED_NAMESPACES, stringToString) : DEFAULT_ALLOWED_NAMESPACES;\n URI_SAFE_ATTRIBUTES = objectHasOwnProperty(cfg, 'ADD_URI_SAFE_ATTR') ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES), cfg.ADD_URI_SAFE_ATTR, transformCaseFunc) : DEFAULT_URI_SAFE_ATTRIBUTES;\n DATA_URI_TAGS = objectHasOwnProperty(cfg, 'ADD_DATA_URI_TAGS') ? addToSet(clone(DEFAULT_DATA_URI_TAGS), cfg.ADD_DATA_URI_TAGS, transformCaseFunc) : DEFAULT_DATA_URI_TAGS;\n FORBID_CONTENTS = objectHasOwnProperty(cfg, 'FORBID_CONTENTS') ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc) : DEFAULT_FORBID_CONTENTS;\n FORBID_TAGS = objectHasOwnProperty(cfg, 'FORBID_TAGS') ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc) : clone({});\n FORBID_ATTR = objectHasOwnProperty(cfg, 'FORBID_ATTR') ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc) : clone({});\n USE_PROFILES = objectHasOwnProperty(cfg, 'USE_PROFILES') ? cfg.USE_PROFILES : false;\n ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true\n ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true\n ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false\n ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; // Default true\n SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false\n SAFE_FOR_XML = cfg.SAFE_FOR_XML !== false; // Default true\n WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false\n RETURN_DOM = cfg.RETURN_DOM || false; // Default false\n RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false\n RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false\n FORCE_BODY = cfg.FORCE_BODY || false; // Default false\n SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true\n SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false\n KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true\n IN_PLACE = cfg.IN_PLACE || false; // Default false\n IS_ALLOWED_URI$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI;\n NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;\n MATHML_TEXT_INTEGRATION_POINTS = cfg.MATHML_TEXT_INTEGRATION_POINTS || MATHML_TEXT_INTEGRATION_POINTS;\n HTML_INTEGRATION_POINTS = cfg.HTML_INTEGRATION_POINTS || HTML_INTEGRATION_POINTS;\n CUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || {};\n if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)) {\n CUSTOM_ELEMENT_HANDLING.tagNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck;\n }\n if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)) {\n CUSTOM_ELEMENT_HANDLING.attributeNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck;\n }\n if (cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements === 'boolean') {\n CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements;\n }\n if (SAFE_FOR_TEMPLATES) {\n ALLOW_DATA_ATTR = false;\n }\n if (RETURN_DOM_FRAGMENT) {\n RETURN_DOM = true;\n }\n /* Parse profile info */\n if (USE_PROFILES) {\n ALLOWED_TAGS = addToSet({}, text);\n ALLOWED_ATTR = [];\n if (USE_PROFILES.html === true) {\n addToSet(ALLOWED_TAGS, html$1);\n addToSet(ALLOWED_ATTR, html);\n }\n if (USE_PROFILES.svg === true) {\n addToSet(ALLOWED_TAGS, svg$1);\n addToSet(ALLOWED_ATTR, svg);\n addToSet(ALLOWED_ATTR, xml);\n }\n if (USE_PROFILES.svgFilters === true) {\n addToSet(ALLOWED_TAGS, svgFilters);\n addToSet(ALLOWED_ATTR, svg);\n addToSet(ALLOWED_ATTR, xml);\n }\n if (USE_PROFILES.mathMl === true) {\n addToSet(ALLOWED_TAGS, mathMl$1);\n addToSet(ALLOWED_ATTR, mathMl);\n addToSet(ALLOWED_ATTR, xml);\n }\n }\n /* Merge configuration parameters */\n if (cfg.ADD_TAGS) {\n if (typeof cfg.ADD_TAGS === 'function') {\n EXTRA_ELEMENT_HANDLING.tagCheck = cfg.ADD_TAGS;\n } else {\n if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {\n ALLOWED_TAGS = clone(ALLOWED_TAGS);\n }\n addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);\n }\n }\n if (cfg.ADD_ATTR) {\n if (typeof cfg.ADD_ATTR === 'function') {\n EXTRA_ELEMENT_HANDLING.attributeCheck = cfg.ADD_ATTR;\n } else {\n if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {\n ALLOWED_ATTR = clone(ALLOWED_ATTR);\n }\n addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);\n }\n }\n if (cfg.ADD_URI_SAFE_ATTR) {\n addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);\n }\n if (cfg.FORBID_CONTENTS) {\n if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n FORBID_CONTENTS = clone(FORBID_CONTENTS);\n }\n addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);\n }\n if (cfg.ADD_FORBID_CONTENTS) {\n if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n FORBID_CONTENTS = clone(FORBID_CONTENTS);\n }\n addToSet(FORBID_CONTENTS, cfg.ADD_FORBID_CONTENTS, transformCaseFunc);\n }\n /* Add #text in case KEEP_CONTENT is set to true */\n if (KEEP_CONTENT) {\n ALLOWED_TAGS['#text'] = true;\n }\n /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */\n if (WHOLE_DOCUMENT) {\n addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);\n }\n /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */\n if (ALLOWED_TAGS.table) {\n addToSet(ALLOWED_TAGS, ['tbody']);\n delete FORBID_TAGS.tbody;\n }\n if (cfg.TRUSTED_TYPES_POLICY) {\n if (typeof cfg.TRUSTED_TYPES_POLICY.createHTML !== 'function') {\n throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createHTML\" hook.');\n }\n if (typeof cfg.TRUSTED_TYPES_POLICY.createScriptURL !== 'function') {\n throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createScriptURL\" hook.');\n }\n // Overwrite existing TrustedTypes policy.\n trustedTypesPolicy = cfg.TRUSTED_TYPES_POLICY;\n // Sign local variables required by `sanitize`.\n emptyHTML = trustedTypesPolicy.createHTML('');\n } else {\n // Uninitialized policy, attempt to initialize the internal dompurify policy.\n if (trustedTypesPolicy === undefined) {\n trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, currentScript);\n }\n // If creating the internal policy succeeded sign internal variables.\n if (trustedTypesPolicy !== null && typeof emptyHTML === 'string') {\n emptyHTML = trustedTypesPolicy.createHTML('');\n }\n }\n // Prevent further manipulation of configuration.\n // Not available in IE8, Safari 5, etc.\n if (freeze) {\n freeze(cfg);\n }\n CONFIG = cfg;\n };\n /* Keep track of all possible SVG and MathML tags\n * so that we can perform the namespace checks\n * correctly. */\n const ALL_SVG_TAGS = addToSet({}, [...svg$1, ...svgFilters, ...svgDisallowed]);\n const ALL_MATHML_TAGS = addToSet({}, [...mathMl$1, ...mathMlDisallowed]);\n /**\n * @param element a DOM element whose namespace is being checked\n * @returns Return false if the element has a\n * namespace that a spec-compliant parser would never\n * return. Return true otherwise.\n */\n const _checkValidNamespace = function _checkValidNamespace(element) {\n let parent = getParentNode(element);\n // In JSDOM, if we're inside shadow DOM, then parentNode\n // can be null. We just simulate parent in this case.\n if (!parent || !parent.tagName) {\n parent = {\n namespaceURI: NAMESPACE,\n tagName: 'template'\n };\n }\n const tagName = stringToLowerCase(element.tagName);\n const parentTagName = stringToLowerCase(parent.tagName);\n if (!ALLOWED_NAMESPACES[element.namespaceURI]) {\n return false;\n }\n if (element.namespaceURI === SVG_NAMESPACE) {\n // The only way to switch from HTML namespace to SVG\n // is via . If it happens via any other tag, then\n // it should be killed.\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === 'svg';\n }\n // The only way to switch from MathML to SVG is via`\n // svg if parent is either or MathML\n // text integration points.\n if (parent.namespaceURI === MATHML_NAMESPACE) {\n return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);\n }\n // We only allow elements that are defined in SVG\n // spec. All others are disallowed in SVG namespace.\n return Boolean(ALL_SVG_TAGS[tagName]);\n }\n if (element.namespaceURI === MATHML_NAMESPACE) {\n // The only way to switch from HTML namespace to MathML\n // is via . If it happens via any other tag, then\n // it should be killed.\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === 'math';\n }\n // The only way to switch from SVG to MathML is via\n // and HTML integration points\n if (parent.namespaceURI === SVG_NAMESPACE) {\n return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];\n }\n // We only allow elements that are defined in MathML\n // spec. All others are disallowed in MathML namespace.\n return Boolean(ALL_MATHML_TAGS[tagName]);\n }\n if (element.namespaceURI === HTML_NAMESPACE) {\n // The only way to switch from SVG to HTML is via\n // HTML integration points, and from MathML to HTML\n // is via MathML text integration points\n if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {\n return false;\n }\n if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {\n return false;\n }\n // We disallow tags that are specific for MathML\n // or SVG and should never appear in HTML namespace\n return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);\n }\n // For XHTML and XML documents that support custom namespaces\n if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && ALLOWED_NAMESPACES[element.namespaceURI]) {\n return true;\n }\n // The code should never reach this place (this means\n // that the element somehow got namespace that is not\n // HTML, SVG, MathML or allowed via ALLOWED_NAMESPACES).\n // Return false just in case.\n return false;\n };\n /**\n * _forceRemove\n *\n * @param node a DOM node\n */\n const _forceRemove = function _forceRemove(node) {\n arrayPush(DOMPurify.removed, {\n element: node\n });\n try {\n // eslint-disable-next-line unicorn/prefer-dom-node-remove\n getParentNode(node).removeChild(node);\n } catch (_) {\n remove(node);\n }\n };\n /**\n * _removeAttribute\n *\n * @param name an Attribute name\n * @param element a DOM node\n */\n const _removeAttribute = function _removeAttribute(name, element) {\n try {\n arrayPush(DOMPurify.removed, {\n attribute: element.getAttributeNode(name),\n from: element\n });\n } catch (_) {\n arrayPush(DOMPurify.removed, {\n attribute: null,\n from: element\n });\n }\n element.removeAttribute(name);\n // We void attribute values for unremovable \"is\" attributes\n if (name === 'is') {\n if (RETURN_DOM || RETURN_DOM_FRAGMENT) {\n try {\n _forceRemove(element);\n } catch (_) {}\n } else {\n try {\n element.setAttribute(name, '');\n } catch (_) {}\n }\n }\n };\n /**\n * _initDocument\n *\n * @param dirty - a string of dirty markup\n * @return a DOM, filled with the dirty markup\n */\n const _initDocument = function _initDocument(dirty) {\n /* Create a HTML document */\n let doc = null;\n let leadingWhitespace = null;\n if (FORCE_BODY) {\n dirty = '' + dirty;\n } else {\n /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */\n const matches = stringMatch(dirty, /^[\\r\\n\\t ]+/);\n leadingWhitespace = matches && matches[0];\n }\n if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && NAMESPACE === HTML_NAMESPACE) {\n // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict)\n dirty = '' + dirty + '';\n }\n const dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty;\n /*\n * Use the DOMParser API by default, fallback later if needs be\n * DOMParser not work for svg when has multiple root element.\n */\n if (NAMESPACE === HTML_NAMESPACE) {\n try {\n doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);\n } catch (_) {}\n }\n /* Use createHTMLDocument in case DOMParser is not available */\n if (!doc || !doc.documentElement) {\n doc = implementation.createDocument(NAMESPACE, 'template', null);\n try {\n doc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload;\n } catch (_) {\n // Syntax error if dirtyPayload is invalid xml\n }\n }\n const body = doc.body || doc.documentElement;\n if (dirty && leadingWhitespace) {\n body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);\n }\n /* Work on whole document or just its body */\n if (NAMESPACE === HTML_NAMESPACE) {\n return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0];\n }\n return WHOLE_DOCUMENT ? doc.documentElement : body;\n };\n /**\n * Creates a NodeIterator object that you can use to traverse filtered lists of nodes or elements in a document.\n *\n * @param root The root element or node to start traversing on.\n * @return The created NodeIterator\n */\n const _createNodeIterator = function _createNodeIterator(root) {\n return createNodeIterator.call(root.ownerDocument || root, root,\n // eslint-disable-next-line no-bitwise\n NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT | NodeFilter.SHOW_PROCESSING_INSTRUCTION | NodeFilter.SHOW_CDATA_SECTION, null);\n };\n /**\n * _isClobbered\n *\n * @param element element to check for clobbering attacks\n * @return true if clobbered, false if safe\n */\n const _isClobbered = function _isClobbered(element) {\n return element instanceof HTMLFormElement && (typeof element.nodeName !== 'string' || typeof element.textContent !== 'string' || typeof element.removeChild !== 'function' || !(element.attributes instanceof NamedNodeMap) || typeof element.removeAttribute !== 'function' || typeof element.setAttribute !== 'function' || typeof element.namespaceURI !== 'string' || typeof element.insertBefore !== 'function' || typeof element.hasChildNodes !== 'function');\n };\n /**\n * Checks whether the given object is a DOM node.\n *\n * @param value object to check whether it's a DOM node\n * @return true is object is a DOM node\n */\n const _isNode = function _isNode(value) {\n return typeof Node === 'function' && value instanceof Node;\n };\n function _executeHooks(hooks, currentNode, data) {\n arrayForEach(hooks, hook => {\n hook.call(DOMPurify, currentNode, data, CONFIG);\n });\n }\n /**\n * _sanitizeElements\n *\n * @protect nodeName\n * @protect textContent\n * @protect removeChild\n * @param currentNode to check for permission to exist\n * @return true if node was killed, false if left alive\n */\n const _sanitizeElements = function _sanitizeElements(currentNode) {\n let content = null;\n /* Execute a hook if present */\n _executeHooks(hooks.beforeSanitizeElements, currentNode, null);\n /* Check if element is clobbered or can clobber */\n if (_isClobbered(currentNode)) {\n _forceRemove(currentNode);\n return true;\n }\n /* Now let's check the element's type and name */\n const tagName = transformCaseFunc(currentNode.nodeName);\n /* Execute a hook if present */\n _executeHooks(hooks.uponSanitizeElement, currentNode, {\n tagName,\n allowedTags: ALLOWED_TAGS\n });\n /* Detect mXSS attempts abusing namespace confusion */\n if (SAFE_FOR_XML && currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && regExpTest(/<[/\\w!]/g, currentNode.innerHTML) && regExpTest(/<[/\\w!]/g, currentNode.textContent)) {\n _forceRemove(currentNode);\n return true;\n }\n /* Remove any occurrence of processing instructions */\n if (currentNode.nodeType === NODE_TYPE.progressingInstruction) {\n _forceRemove(currentNode);\n return true;\n }\n /* Remove any kind of possibly harmful comments */\n if (SAFE_FOR_XML && currentNode.nodeType === NODE_TYPE.comment && regExpTest(/<[/\\w]/g, currentNode.data)) {\n _forceRemove(currentNode);\n return true;\n }\n /* Remove element if anything forbids its presence */\n if (!(EXTRA_ELEMENT_HANDLING.tagCheck instanceof Function && EXTRA_ELEMENT_HANDLING.tagCheck(tagName)) && (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName])) {\n /* Check if we have a custom element to handle */\n if (!FORBID_TAGS[tagName] && _isBasicCustomElement(tagName)) {\n if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) {\n return false;\n }\n if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) {\n return false;\n }\n }\n /* Keep content except for bad-listed elements */\n if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {\n const parentNode = getParentNode(currentNode) || currentNode.parentNode;\n const childNodes = getChildNodes(currentNode) || currentNode.childNodes;\n if (childNodes && parentNode) {\n const childCount = childNodes.length;\n for (let i = childCount - 1; i >= 0; --i) {\n const childClone = cloneNode(childNodes[i], true);\n childClone.__removalCount = (currentNode.__removalCount || 0) + 1;\n parentNode.insertBefore(childClone, getNextSibling(currentNode));\n }\n }\n }\n _forceRemove(currentNode);\n return true;\n }\n /* Check whether element has a valid namespace */\n if (currentNode instanceof Element && !_checkValidNamespace(currentNode)) {\n _forceRemove(currentNode);\n return true;\n }\n /* Make sure that older browsers don't get fallback-tag mXSS */\n if ((tagName === 'noscript' || tagName === 'noembed' || tagName === 'noframes') && regExpTest(/<\\/no(script|embed|frames)/i, currentNode.innerHTML)) {\n _forceRemove(currentNode);\n return true;\n }\n /* Sanitize element content to be template-safe */\n if (SAFE_FOR_TEMPLATES && currentNode.nodeType === NODE_TYPE.text) {\n /* Get the element's text content */\n content = currentNode.textContent;\n arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n content = stringReplace(content, expr, ' ');\n });\n if (currentNode.textContent !== content) {\n arrayPush(DOMPurify.removed, {\n element: currentNode.cloneNode()\n });\n currentNode.textContent = content;\n }\n }\n /* Execute a hook if present */\n _executeHooks(hooks.afterSanitizeElements, currentNode, null);\n return false;\n };\n /**\n * _isValidAttribute\n *\n * @param lcTag Lowercase tag name of containing element.\n * @param lcName Lowercase attribute name.\n * @param value Attribute value.\n * @return Returns true if `value` is valid, otherwise false.\n */\n // eslint-disable-next-line complexity\n const _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {\n /* Make sure attribute cannot clobber */\n if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) {\n return false;\n }\n /* Allow valid data-* attributes: At least one character after \"-\"\n (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)\n XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)\n We don't need to check the value; it's always URI safe. */\n if (ALLOW_DATA_ATTR && !FORBID_ATTR[lcName] && regExpTest(DATA_ATTR, lcName)) ; else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR, lcName)) ; else if (EXTRA_ELEMENT_HANDLING.attributeCheck instanceof Function && EXTRA_ELEMENT_HANDLING.attributeCheck(lcName, lcTag)) ; else if (!ALLOWED_ATTR[lcName] || FORBID_ATTR[lcName]) {\n if (\n // First condition does a very basic check if a) it's basically a valid custom element tagname AND\n // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck\n _isBasicCustomElement(lcTag) && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag)) && (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName) || CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName, lcTag)) ||\n // Alternative, second condition checks if it's an `is`-attribute, AND\n // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n lcName === 'is' && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(value))) ; else {\n return false;\n }\n /* Check value is safe. First, is attr inert? If so, is safe */\n } else if (URI_SAFE_ATTRIBUTES[lcName]) ; else if (regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if ((lcName === 'src' || lcName === 'xlink:href' || lcName === 'href') && lcTag !== 'script' && stringIndexOf(value, 'data:') === 0 && DATA_URI_TAGS[lcTag]) ; else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if (value) {\n return false;\n } else ;\n return true;\n };\n /**\n * _isBasicCustomElement\n * checks if at least one dash is included in tagName, and it's not the first char\n * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name\n *\n * @param tagName name of the tag of the node to sanitize\n * @returns Returns true if the tag name meets the basic criteria for a custom element, otherwise false.\n */\n const _isBasicCustomElement = function _isBasicCustomElement(tagName) {\n return tagName !== 'annotation-xml' && stringMatch(tagName, CUSTOM_ELEMENT);\n };\n /**\n * _sanitizeAttributes\n *\n * @protect attributes\n * @protect nodeName\n * @protect removeAttribute\n * @protect setAttribute\n *\n * @param currentNode to sanitize\n */\n const _sanitizeAttributes = function _sanitizeAttributes(currentNode) {\n /* Execute a hook if present */\n _executeHooks(hooks.beforeSanitizeAttributes, currentNode, null);\n const {\n attributes\n } = currentNode;\n /* Check if we have attributes; if not we might have a text node */\n if (!attributes || _isClobbered(currentNode)) {\n return;\n }\n const hookEvent = {\n attrName: '',\n attrValue: '',\n keepAttr: true,\n allowedAttributes: ALLOWED_ATTR,\n forceKeepAttr: undefined\n };\n let l = attributes.length;\n /* Go backwards over all attributes; safely remove bad ones */\n while (l--) {\n const attr = attributes[l];\n const {\n name,\n namespaceURI,\n value: attrValue\n } = attr;\n const lcName = transformCaseFunc(name);\n const initValue = attrValue;\n let value = name === 'value' ? initValue : stringTrim(initValue);\n /* Execute a hook if present */\n hookEvent.attrName = lcName;\n hookEvent.attrValue = value;\n hookEvent.keepAttr = true;\n hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set\n _executeHooks(hooks.uponSanitizeAttribute, currentNode, hookEvent);\n value = hookEvent.attrValue;\n /* Full DOM Clobbering protection via namespace isolation,\n * Prefix id and name attributes with `user-content-`\n */\n if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name')) {\n // Remove the attribute with this value\n _removeAttribute(name, currentNode);\n // Prefix the value and later re-create the attribute with the sanitized value\n value = SANITIZE_NAMED_PROPS_PREFIX + value;\n }\n /* Work around a security issue with comments inside attributes */\n if (SAFE_FOR_XML && regExpTest(/((--!?|])>)|<\\/(style|title|textarea)/i, value)) {\n _removeAttribute(name, currentNode);\n continue;\n }\n /* Make sure we cannot easily use animated hrefs, even if animations are allowed */\n if (lcName === 'attributename' && stringMatch(value, 'href')) {\n _removeAttribute(name, currentNode);\n continue;\n }\n /* Did the hooks approve of the attribute? */\n if (hookEvent.forceKeepAttr) {\n continue;\n }\n /* Did the hooks approve of the attribute? */\n if (!hookEvent.keepAttr) {\n _removeAttribute(name, currentNode);\n continue;\n }\n /* Work around a security issue in jQuery 3.0 */\n if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(/\\/>/i, value)) {\n _removeAttribute(name, currentNode);\n continue;\n }\n /* Sanitize attribute content to be template-safe */\n if (SAFE_FOR_TEMPLATES) {\n arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n value = stringReplace(value, expr, ' ');\n });\n }\n /* Is `value` valid for this attribute? */\n const lcTag = transformCaseFunc(currentNode.nodeName);\n if (!_isValidAttribute(lcTag, lcName, value)) {\n _removeAttribute(name, currentNode);\n continue;\n }\n /* Handle attributes that require Trusted Types */\n if (trustedTypesPolicy && typeof trustedTypes === 'object' && typeof trustedTypes.getAttributeType === 'function') {\n if (namespaceURI) ; else {\n switch (trustedTypes.getAttributeType(lcTag, lcName)) {\n case 'TrustedHTML':\n {\n value = trustedTypesPolicy.createHTML(value);\n break;\n }\n case 'TrustedScriptURL':\n {\n value = trustedTypesPolicy.createScriptURL(value);\n break;\n }\n }\n }\n }\n /* Handle invalid data-* attribute set by try-catching it */\n if (value !== initValue) {\n try {\n if (namespaceURI) {\n currentNode.setAttributeNS(namespaceURI, name, value);\n } else {\n /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. \"x-schema\". */\n currentNode.setAttribute(name, value);\n }\n if (_isClobbered(currentNode)) {\n _forceRemove(currentNode);\n } else {\n arrayPop(DOMPurify.removed);\n }\n } catch (_) {\n _removeAttribute(name, currentNode);\n }\n }\n }\n /* Execute a hook if present */\n _executeHooks(hooks.afterSanitizeAttributes, currentNode, null);\n };\n /**\n * _sanitizeShadowDOM\n *\n * @param fragment to iterate over recursively\n */\n const _sanitizeShadowDOM = function _sanitizeShadowDOM(fragment) {\n let shadowNode = null;\n const shadowIterator = _createNodeIterator(fragment);\n /* Execute a hook if present */\n _executeHooks(hooks.beforeSanitizeShadowDOM, fragment, null);\n while (shadowNode = shadowIterator.nextNode()) {\n /* Execute a hook if present */\n _executeHooks(hooks.uponSanitizeShadowNode, shadowNode, null);\n /* Sanitize tags and elements */\n _sanitizeElements(shadowNode);\n /* Check attributes next */\n _sanitizeAttributes(shadowNode);\n /* Deep shadow DOM detected */\n if (shadowNode.content instanceof DocumentFragment) {\n _sanitizeShadowDOM(shadowNode.content);\n }\n }\n /* Execute a hook if present */\n _executeHooks(hooks.afterSanitizeShadowDOM, fragment, null);\n };\n // eslint-disable-next-line complexity\n DOMPurify.sanitize = function (dirty) {\n let cfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n let body = null;\n let importedNode = null;\n let currentNode = null;\n let returnNode = null;\n /* Make sure we have a string to sanitize.\n DO NOT return early, as this will return the wrong type if\n the user has requested a DOM object rather than a string */\n IS_EMPTY_INPUT = !dirty;\n if (IS_EMPTY_INPUT) {\n dirty = '';\n }\n /* Stringify, in case dirty is an object */\n if (typeof dirty !== 'string' && !_isNode(dirty)) {\n if (typeof dirty.toString === 'function') {\n dirty = dirty.toString();\n if (typeof dirty !== 'string') {\n throw typeErrorCreate('dirty is not a string, aborting');\n }\n } else {\n throw typeErrorCreate('toString is not a function');\n }\n }\n /* Return dirty HTML if DOMPurify cannot run */\n if (!DOMPurify.isSupported) {\n return dirty;\n }\n /* Assign config vars */\n if (!SET_CONFIG) {\n _parseConfig(cfg);\n }\n /* Clean up removed elements */\n DOMPurify.removed = [];\n /* Check if dirty is correctly typed for IN_PLACE */\n if (typeof dirty === 'string') {\n IN_PLACE = false;\n }\n if (IN_PLACE) {\n /* Do some early pre-sanitization to avoid unsafe root nodes */\n if (dirty.nodeName) {\n const tagName = transformCaseFunc(dirty.nodeName);\n if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place');\n }\n }\n } else if (dirty instanceof Node) {\n /* If dirty is a DOM element, append to an empty document to avoid\n elements being stripped by the parser */\n body = _initDocument('');\n importedNode = body.ownerDocument.importNode(dirty, true);\n if (importedNode.nodeType === NODE_TYPE.element && importedNode.nodeName === 'BODY') {\n /* Node is already a body, use as is */\n body = importedNode;\n } else if (importedNode.nodeName === 'HTML') {\n body = importedNode;\n } else {\n // eslint-disable-next-line unicorn/prefer-dom-node-append\n body.appendChild(importedNode);\n }\n } else {\n /* Exit directly if we have nothing to do */\n if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT &&\n // eslint-disable-next-line unicorn/prefer-includes\n dirty.indexOf('<') === -1) {\n return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(dirty) : dirty;\n }\n /* Initialize the document to work on */\n body = _initDocument(dirty);\n /* Check we have a DOM node from the data */\n if (!body) {\n return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : '';\n }\n }\n /* Remove first element node (ours) if FORCE_BODY is set */\n if (body && FORCE_BODY) {\n _forceRemove(body.firstChild);\n }\n /* Get node iterator */\n const nodeIterator = _createNodeIterator(IN_PLACE ? dirty : body);\n /* Now start iterating over the created document */\n while (currentNode = nodeIterator.nextNode()) {\n /* Sanitize tags and elements */\n _sanitizeElements(currentNode);\n /* Check attributes next */\n _sanitizeAttributes(currentNode);\n /* Shadow DOM detected, sanitize it */\n if (currentNode.content instanceof DocumentFragment) {\n _sanitizeShadowDOM(currentNode.content);\n }\n }\n /* If we sanitized `dirty` in-place, return it. */\n if (IN_PLACE) {\n return dirty;\n }\n /* Return sanitized string or DOM */\n if (RETURN_DOM) {\n if (RETURN_DOM_FRAGMENT) {\n returnNode = createDocumentFragment.call(body.ownerDocument);\n while (body.firstChild) {\n // eslint-disable-next-line unicorn/prefer-dom-node-append\n returnNode.appendChild(body.firstChild);\n }\n } else {\n returnNode = body;\n }\n if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmode) {\n /*\n AdoptNode() is not used because internal state is not reset\n (e.g. the past names map of a HTMLFormElement), this is safe\n in theory but we would rather not risk another attack vector.\n The state that is cloned by importNode() is explicitly defined\n by the specs.\n */\n returnNode = importNode.call(originalDocument, returnNode, true);\n }\n return returnNode;\n }\n let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;\n /* Serialize doctype if allowed */\n if (WHOLE_DOCUMENT && ALLOWED_TAGS['!doctype'] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) {\n serializedHTML = '\\n' + serializedHTML;\n }\n /* Sanitize final string template-safe */\n if (SAFE_FOR_TEMPLATES) {\n arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n serializedHTML = stringReplace(serializedHTML, expr, ' ');\n });\n }\n return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(serializedHTML) : serializedHTML;\n };\n DOMPurify.setConfig = function () {\n let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n _parseConfig(cfg);\n SET_CONFIG = true;\n };\n DOMPurify.clearConfig = function () {\n CONFIG = null;\n SET_CONFIG = false;\n };\n DOMPurify.isValidAttribute = function (tag, attr, value) {\n /* Initialize shared config vars if necessary. */\n if (!CONFIG) {\n _parseConfig({});\n }\n const lcTag = transformCaseFunc(tag);\n const lcName = transformCaseFunc(attr);\n return _isValidAttribute(lcTag, lcName, value);\n };\n DOMPurify.addHook = function (entryPoint, hookFunction) {\n if (typeof hookFunction !== 'function') {\n return;\n }\n arrayPush(hooks[entryPoint], hookFunction);\n };\n DOMPurify.removeHook = function (entryPoint, hookFunction) {\n if (hookFunction !== undefined) {\n const index = arrayLastIndexOf(hooks[entryPoint], hookFunction);\n return index === -1 ? undefined : arraySplice(hooks[entryPoint], index, 1)[0];\n }\n return arrayPop(hooks[entryPoint]);\n };\n DOMPurify.removeHooks = function (entryPoint) {\n hooks[entryPoint] = [];\n };\n DOMPurify.removeAllHooks = function () {\n hooks = _createHooksMap();\n };\n return DOMPurify;\n}\nvar purify = createDOMPurify();\n\nexport { purify as default };\n//# sourceMappingURL=purify.es.mjs.map\n","/**\n * ProductCard 컴포넌트\n *\n * 상품 목록에서 개별 상품을 표시하는 카드 컴포넌트입니다.\n * 다중 통화를 지원하며, 할인율 뱃지를 표시합니다.\n */\n\nimport React, { useEffect, useState } from 'react';\n\n// @ts-ignore - DOMPurify 타입 정의 없음\nimport DOMPurify from 'dompurify';\n\n// 기본 컴포넌트 import\nimport { Div } from '../basic/Div';\nimport { Button } from '../basic/Button';\nimport { Span } from '../basic/Span';\nimport { H3 } from '../basic/H3';\nimport { Img } from '../basic/Img';\nimport type { EditorAttrs } from '../../types';\n\n/**\n * 선호 통화를 전역 상태에서 읽고, 변경을 구독하는 훅.\n *\n * 회귀 배경: 종전 `G7Core.state.get('preferredCurrency')` 는 key 를 무시하고\n * _global 전체 객체를 반환해(G7CoreGlobals: get: () => getGlobalState()) 통화 코드가\n * 아닌 객체가 들어가 multi_currency 조회가 항상 KRW 폴백되었고, 단발 get 이라 헤더에서\n * 통화를 바꿔도 카드가 리렌더되지 않았다(상품 리스트/검색/캐러셀 KRW 고정 결함).\n * → 전체 객체에서 `.preferredCurrency` 키로 접근 + state.subscribe 로 리렌더한다.\n *\n * @returns 현재 선호 통화 코드(미설정 시 'KRW')\n */\nconst usePreferredCurrency = (): string => {\n const read = (): string => {\n const state = (window as any).G7Core?.state?.get?.();\n return (state && state.preferredCurrency) || 'KRW';\n };\n const [currency, setCurrency] = useState(read);\n\n useEffect(() => {\n const subscribe = (window as any).G7Core?.state?.subscribe;\n // 구독 시점과 마운트 사이 변경분 보정\n setCurrency(read());\n if (typeof subscribe !== 'function') return;\n const unsubscribe = subscribe((state: Record) => {\n setCurrency((state && state.preferredCurrency) || 'KRW');\n });\n return typeof unsubscribe === 'function' ? unsubscribe : undefined;\n }, []);\n\n return currency;\n};\n\n// G7Core.dispatch() navigate 헬퍼\nconst navigate = (path: string) => {\n (window as any).G7Core?.dispatch?.({\n handler: 'navigate',\n params: { path },\n });\n};\n\ninterface CurrencyPrice {\n value: number;\n formatted: string;\n}\n\ninterface ProductLabel {\n name: string;\n color: string;\n}\n\ninterface ProductCardProps {\n product: {\n id: number;\n /** 상품코드 — 상세 페이지 링크 식별자 (product_code 기준 라우팅). 없으면 id 로 폴백 */\n product_code?: string;\n name?: string | Record;\n name_localized?: string;\n thumbnail_url: string;\n primary_category?: string;\n selling_price: number;\n selling_price_formatted: string;\n list_price?: number;\n list_price_formatted?: string;\n discount_rate?: number;\n multi_currency_selling_price?: Record;\n multi_currency_list_price?: Record;\n /** 검색 하이라이트된 상품명 (HTML) */\n name_highlighted?: string;\n /** 검색 하이라이트된 설명 (HTML) */\n description_highlighted?: string;\n /** 짧은 설명 */\n short_description?: string;\n /** 판매 상태 (on_sale, sold_out, suspended, coming_soon) */\n sales_status?: string;\n /** 판매 상태 번역 라벨 */\n sales_status_label?: string;\n /** 브랜드명 */\n brand_name?: string;\n /** 상품 라벨/뱃지 목록 */\n labels?: ProductLabel[];\n /** 평균 별점 (0.0 ~ 5.0, 소수점 1자리) */\n rating_avg?: number;\n /** 전시중 리뷰 수 */\n review_count?: number;\n };\n /** 클릭 시 호출되는 콜백 */\n onClick?: (productId: number) => void;\n /** 쇼핑몰 base 경로 (예: '/shop', '/store', '/') */\n shopBase?: string;\n /** 추가 CSS 클래스 */\n className?: string;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n/**\n * 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread)\n */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * 상품 카드 컴포넌트\n *\n * @example\n * ```tsx\n * \n * ```\n *\n * @example\n * ```json\n * // 레이아웃 JSON에서 사용\n * {\n * \"type\": \"composite\",\n * \"name\": \"ProductCard\",\n * \"props\": { \"product\": \"{{product}}\" }\n * }\n * ```\n */\n/**\n * rating_avg(0~5)를 0.5 단위로 반올림하여 별 아이콘 배열을 반환합니다.\n * 반환값: 5개 원소, 각각 'full' | 'half' | 'empty'\n */\nconst getStarTypes = (avg: number): Array<'full' | 'half' | 'empty'> => {\n const rounded = Math.round(avg * 2) / 2; // 0.5 단위 반올림\n return [1, 2, 3, 4, 5].map((pos) => {\n if (rounded >= pos) return 'full';\n if (rounded >= pos - 0.5) return 'half';\n return 'empty';\n });\n};\n\nconst ProductCard: React.FC = ({\n product,\n onClick,\n shopBase = '/shop',\n className = '',\n id,\n editorAttrs,\n}) => {\n const preferredCurrency = usePreferredCurrency();\n\n /**\n * 다중 통화 가격을 가져옵니다.\n * 선호 통화가 없으면 기본 포맷 가격을 반환합니다.\n */\n const getPrice = (field: 'selling_price' | 'list_price'): string | undefined => {\n const multiCurrencyField = `multi_currency_${field}` as keyof typeof product;\n const multiCurrencyData = product[multiCurrencyField] as Record | undefined;\n\n if (multiCurrencyData && multiCurrencyData[preferredCurrency]) {\n return multiCurrencyData[preferredCurrency].formatted;\n }\n\n const formattedField = `${field}_formatted` as keyof typeof product;\n return product[formattedField] as string | undefined;\n };\n\n const displayName = product.name_localized\n ?? (typeof product.name === 'string' ? product.name : '')\n ?? '';\n const sellingPrice = getPrice('selling_price');\n const listPrice = getPrice('list_price');\n const hasDiscount = product.discount_rate && product.discount_rate > 0;\n const isNotOnSale = product.sales_status && product.sales_status !== 'on_sale';\n const labels = product.labels ?? [];\n\n /**\n * HTML 하이라이트가 있으면 sanitize하여 반환합니다.\n * mark 태그만 허용하여 XSS를 방지합니다.\n */\n const sanitizeHighlight = (html: string): string => {\n return DOMPurify.sanitize(html, {\n ALLOWED_TAGS: ['mark'],\n ALLOWED_ATTR: [],\n }) as unknown as string;\n };\n\n const nameHighlighted = product.name_highlighted;\n const descriptionHtml = product.description_highlighted ?? product.short_description;\n\n const handleClick = () => {\n if (onClick) {\n onClick(product.id);\n } else {\n const base = shopBase === '/' ? '' : shopBase;\n // 상세 페이지는 product_code 기준 라우팅. code 미제공 시 id 로 폴백(하위호환).\n const identifier = product.product_code ?? product.id;\n navigate(`${base}/products/${identifier}`);\n }\n };\n\n return (\n \n {/* 이미지 영역 */}\n
\n {/* 상품 이미지 */}\n \n\n {/* 판매 상태 오버레이 */}\n {isNotOnSale && (\n
\n \n {product.sales_status_label ?? product.sales_status}\n \n
\n )}\n\n {/* 할인율 뱃지 (좌상단) - 품절/판매중단 시 숨김 */}\n {hasDiscount && product.sales_status !== 'sold_out' && product.sales_status !== 'suspended' && (\n \n {product.discount_rate}%\n \n )}\n\n {/* 상품 라벨/뱃지 (우하단) */}\n {labels.length > 0 && (\n
\n {labels.map((label, idx) => (\n \n {label.name}\n \n ))}\n
\n )}\n
\n\n {/* 상품 정보 */}\n
\n {/* 카테고리 및 브랜드 */}\n
\n {product.primary_category && (\n \n {product.primary_category}\n \n )}\n {product.brand_name && (\n \n {product.brand_name}\n \n )}\n
\n\n {/* 상품명 */}\n {nameHighlighted ? (\n \n ) : (\n

\n {displayName}\n

\n )}\n\n {/* 상품 설명 (검색 결과 등에서 표시) */}\n {descriptionHtml && (\n \n )}\n\n {/* 별점 영역 */}\n
\n {getStarTypes(product.rating_avg ?? 0).map((type, idx) => (\n \n {type === 'full' && }\n {type === 'half' && }\n {type === 'empty' && }\n \n ))}\n \n {(product.rating_avg ?? 0).toFixed(1)}\n \n \n ({product.review_count ?? 0})\n \n
\n\n {/* 가격 영역 */}\n
\n \n {sellingPrice}\n \n {listPrice && hasDiscount && (\n \n {listPrice}\n \n )}\n
\n
\n \n );\n};\n\nexport default ProductCard;\n","const MODULE_CAROUSEL = \"carousel\";\nconst MODULE_CONTROLLER = \"controller\";\nconst MODULE_NAVIGATION = \"navigation\";\nconst MODULE_NO_SCROLL = \"no-scroll\";\nconst MODULE_PORTAL = \"portal\";\nconst MODULE_ROOT = \"root\";\nconst MODULE_TOOLBAR = \"toolbar\";\nconst PLUGIN_CAPTIONS = \"captions\";\nconst PLUGIN_COUNTER = \"counter\";\nconst PLUGIN_DOWNLOAD = \"download\";\nconst PLUGIN_FULLSCREEN = \"fullscreen\";\nconst PLUGIN_INLINE = \"inline\";\nconst PLUGIN_SHARE = \"share\";\nconst PLUGIN_SLIDESHOW = \"slideshow\";\nconst PLUGIN_THUMBNAILS = \"thumbnails\";\nconst PLUGIN_ZOOM = \"zoom\";\nconst SLIDE_STATUS_LOADING = \"loading\";\nconst SLIDE_STATUS_PLAYING = \"playing\";\nconst SLIDE_STATUS_ERROR = \"error\";\nconst SLIDE_STATUS_COMPLETE = \"complete\";\nconst SLIDE_STATUS_PLACEHOLDER = \"placeholder\";\nconst activeSlideStatus = (status) => `active-slide-${status}`;\nconst ACTIVE_SLIDE_LOADING = activeSlideStatus(SLIDE_STATUS_LOADING);\nconst ACTIVE_SLIDE_PLAYING = activeSlideStatus(SLIDE_STATUS_PLAYING);\nconst ACTIVE_SLIDE_ERROR = activeSlideStatus(SLIDE_STATUS_ERROR);\nconst ACTIVE_SLIDE_COMPLETE = activeSlideStatus(SLIDE_STATUS_COMPLETE);\nconst CLASS_FULLSIZE = \"fullsize\";\nconst CLASS_FLEX_CENTER = \"flex_center\";\nconst CLASS_NO_SCROLL = \"no_scroll\";\nconst CLASS_NO_SCROLL_PADDING = \"no_scroll_padding\";\nconst CLASS_SLIDE = \"slide\";\nconst CLASS_SLIDE_WRAPPER = \"slide_wrapper\";\nconst CLASS_SLIDE_WRAPPER_INTERACTIVE = \"slide_wrapper_interactive\";\nconst ACTION_PREV = \"prev\";\nconst ACTION_NEXT = \"next\";\nconst ACTION_SWIPE = \"swipe\";\nconst ACTION_CLOSE = \"close\";\nconst EVENT_ON_POINTER_DOWN = \"onPointerDown\";\nconst EVENT_ON_POINTER_MOVE = \"onPointerMove\";\nconst EVENT_ON_POINTER_UP = \"onPointerUp\";\nconst EVENT_ON_POINTER_LEAVE = \"onPointerLeave\";\nconst EVENT_ON_POINTER_CANCEL = \"onPointerCancel\";\nconst EVENT_ON_KEY_DOWN = \"onKeyDown\";\nconst EVENT_ON_KEY_UP = \"onKeyUp\";\nconst EVENT_ON_WHEEL = \"onWheel\";\nconst VK_ESCAPE = \"Escape\";\nconst VK_ARROW_LEFT = \"ArrowLeft\";\nconst VK_ARROW_RIGHT = \"ArrowRight\";\nconst ELEMENT_BUTTON = \"button\";\nconst ELEMENT_ICON = \"icon\";\nconst IMAGE_FIT_CONTAIN = \"contain\";\nconst IMAGE_FIT_COVER = \"cover\";\nconst UNKNOWN_ACTION_TYPE = \"Unknown action type\";\n\nexport { ACTION_CLOSE, ACTION_NEXT, ACTION_PREV, ACTION_SWIPE, ACTIVE_SLIDE_COMPLETE, ACTIVE_SLIDE_ERROR, ACTIVE_SLIDE_LOADING, ACTIVE_SLIDE_PLAYING, CLASS_FLEX_CENTER, CLASS_FULLSIZE, CLASS_NO_SCROLL, CLASS_NO_SCROLL_PADDING, CLASS_SLIDE, CLASS_SLIDE_WRAPPER, CLASS_SLIDE_WRAPPER_INTERACTIVE, ELEMENT_BUTTON, ELEMENT_ICON, EVENT_ON_KEY_DOWN, EVENT_ON_KEY_UP, EVENT_ON_POINTER_CANCEL, EVENT_ON_POINTER_DOWN, EVENT_ON_POINTER_LEAVE, EVENT_ON_POINTER_MOVE, EVENT_ON_POINTER_UP, EVENT_ON_WHEEL, IMAGE_FIT_CONTAIN, IMAGE_FIT_COVER, MODULE_CAROUSEL, MODULE_CONTROLLER, MODULE_NAVIGATION, MODULE_NO_SCROLL, MODULE_PORTAL, MODULE_ROOT, MODULE_TOOLBAR, PLUGIN_CAPTIONS, PLUGIN_COUNTER, PLUGIN_DOWNLOAD, PLUGIN_FULLSCREEN, PLUGIN_INLINE, PLUGIN_SHARE, PLUGIN_SLIDESHOW, PLUGIN_THUMBNAILS, PLUGIN_ZOOM, SLIDE_STATUS_COMPLETE, SLIDE_STATUS_ERROR, SLIDE_STATUS_LOADING, SLIDE_STATUS_PLACEHOLDER, SLIDE_STATUS_PLAYING, UNKNOWN_ACTION_TYPE, VK_ARROW_LEFT, VK_ARROW_RIGHT, VK_ESCAPE, activeSlideStatus };\n","\"use client\";\nimport * as React from 'react';\nimport { IMAGE_FIT_COVER, IMAGE_FIT_CONTAIN, ACTION_CLOSE, MODULE_CONTROLLER, UNKNOWN_ACTION_TYPE, ELEMENT_BUTTON, ELEMENT_ICON, EVENT_ON_WHEEL, EVENT_ON_KEY_UP, EVENT_ON_KEY_DOWN, EVENT_ON_POINTER_CANCEL, EVENT_ON_POINTER_LEAVE, EVENT_ON_POINTER_UP, EVENT_ON_POINTER_MOVE, EVENT_ON_POINTER_DOWN, SLIDE_STATUS_LOADING, activeSlideStatus, SLIDE_STATUS_COMPLETE, SLIDE_STATUS_ERROR, SLIDE_STATUS_PLACEHOLDER, CLASS_SLIDE, CLASS_SLIDE_WRAPPER, ACTION_PREV, ACTION_NEXT, ACTION_SWIPE, MODULE_PORTAL, CLASS_FLEX_CENTER, MODULE_CAROUSEL, VK_ARROW_RIGHT, VK_ARROW_LEFT, VK_ESCAPE, MODULE_NAVIGATION, CLASS_NO_SCROLL, CLASS_NO_SCROLL_PADDING, MODULE_NO_SCROLL, MODULE_ROOT, MODULE_TOOLBAR } from './types.js';\nimport { createPortal } from 'react-dom';\nexport { ACTIVE_SLIDE_COMPLETE, ACTIVE_SLIDE_ERROR, ACTIVE_SLIDE_LOADING, ACTIVE_SLIDE_PLAYING, CLASS_FULLSIZE, CLASS_SLIDE_WRAPPER_INTERACTIVE, PLUGIN_CAPTIONS, PLUGIN_COUNTER, PLUGIN_DOWNLOAD, PLUGIN_FULLSCREEN, PLUGIN_INLINE, PLUGIN_SHARE, PLUGIN_SLIDESHOW, PLUGIN_THUMBNAILS, PLUGIN_ZOOM, SLIDE_STATUS_PLAYING } from './types.js';\n\nconst cssPrefix$3 = \"yarl__\";\nfunction clsx(...classes) {\n return [...classes].filter(Boolean).join(\" \");\n}\nfunction cssClass(name) {\n return `${cssPrefix$3}${name}`;\n}\nfunction cssVar(name) {\n return `--${cssPrefix$3}${name}`;\n}\nfunction composePrefix(base, prefix) {\n return `${base}${prefix ? `_${prefix}` : \"\"}`;\n}\nfunction makeComposePrefix(base) {\n return (prefix) => composePrefix(base, prefix);\n}\nfunction translateLabel(labels, defaultLabel) {\n var _a;\n return (_a = labels === null || labels === void 0 ? void 0 : labels[defaultLabel]) !== null && _a !== void 0 ? _a : defaultLabel;\n}\nfunction label(labels, defaultLabel) {\n return translateLabel(labels, defaultLabel);\n}\nfunction translateSlideCounter(labels, slides, index) {\n return translateLabel(labels, \"{index} of {total}\")\n .replace(/\\{index}/g, `${getSlideIndex(index, slides.length) + 1}`)\n .replace(/\\{total}/g, `${slides.length}`);\n}\nfunction cleanup(...cleaners) {\n return () => {\n cleaners.forEach((cleaner) => {\n cleaner();\n });\n };\n}\nfunction makeUseContext(name, contextName, context) {\n return () => {\n const ctx = React.useContext(context);\n if (!ctx) {\n throw new Error(`${name} must be used within a ${contextName}.Provider`);\n }\n return ctx;\n };\n}\nfunction hasWindow() {\n return typeof window !== \"undefined\";\n}\nfunction round(value, decimals = 0) {\n const factor = 10 ** decimals;\n return Math.round((value + Number.EPSILON) * factor) / factor;\n}\nfunction isImageSlide(slide) {\n return slide.type === undefined || slide.type === \"image\";\n}\nfunction isImageFitCover(image, imageFit) {\n return image.imageFit === IMAGE_FIT_COVER || (image.imageFit !== IMAGE_FIT_CONTAIN && imageFit === IMAGE_FIT_COVER);\n}\nfunction parseInt(value) {\n return typeof value === \"string\" ? Number.parseInt(value, 10) : value;\n}\nfunction parseLengthPercentage(input) {\n if (typeof input === \"number\") {\n return { pixel: input };\n }\n if (typeof input === \"string\") {\n const value = parseInt(input);\n return input.endsWith(\"%\") ? { percent: value } : { pixel: value };\n }\n return { pixel: 0 };\n}\nfunction computeSlideRect(containerRect, padding) {\n const paddingValue = parseLengthPercentage(padding);\n const paddingPixels = paddingValue.percent !== undefined ? (containerRect.width / 100) * paddingValue.percent : paddingValue.pixel;\n return {\n width: Math.max(containerRect.width - 2 * paddingPixels, 0),\n height: Math.max(containerRect.height - 2 * paddingPixels, 0),\n };\n}\nfunction devicePixelRatio() {\n return (hasWindow() ? window === null || window === void 0 ? void 0 : window.devicePixelRatio : undefined) || 1;\n}\nfunction getSlideIndex(index, slidesCount) {\n return slidesCount > 0 ? ((index % slidesCount) + slidesCount) % slidesCount : 0;\n}\nfunction hasSlides(slides) {\n return slides.length > 0;\n}\nfunction getSlide(slides, index) {\n return slides[getSlideIndex(index, slides.length)];\n}\nfunction getSlideIfPresent(slides, index) {\n return hasSlides(slides) ? getSlide(slides, index) : undefined;\n}\nfunction getSlideKey(slide) {\n return isImageSlide(slide) ? slide.src : undefined;\n}\nfunction addToolbarButton(toolbar, key, button) {\n if (!button)\n return toolbar;\n const { buttons, ...restToolbar } = toolbar;\n const index = buttons.findIndex((item) => item === key);\n const buttonWithKey = React.isValidElement(button) ? React.cloneElement(button, { key }, null) : button;\n if (index >= 0) {\n const result = [...buttons];\n result.splice(index, 1, buttonWithKey);\n return { buttons: result, ...restToolbar };\n }\n return { buttons: [buttonWithKey, ...buttons], ...restToolbar };\n}\nfunction stopNavigationEventsPropagation() {\n const stopPropagation = (event) => {\n event.stopPropagation();\n };\n return { onPointerDown: stopPropagation, onKeyDown: stopPropagation, onWheel: stopPropagation };\n}\nfunction calculatePreload(carousel, slides, minimum = 0) {\n return Math.min(carousel.preload, Math.max(carousel.finite ? slides.length - 1 : Math.floor(slides.length / 2), minimum));\n}\nconst isReact19 = Number(React.version.split(\".\")[0]) >= 19;\nfunction makeInertWhen(condition) {\n const legacyValue = condition ? \"\" : undefined;\n return { inert: isReact19 ? condition : legacyValue };\n}\nfunction reflow(node) {\n node.scrollTop;\n}\n\nconst LightboxDefaultProps = {\n open: false,\n close: () => { },\n index: 0,\n slides: [],\n render: {},\n plugins: [],\n toolbar: { buttons: [ACTION_CLOSE] },\n labels: {},\n animation: {\n fade: 250,\n swipe: 500,\n easing: {\n fade: \"ease\",\n swipe: \"ease-out\",\n navigation: \"ease-in-out\",\n },\n },\n carousel: {\n finite: false,\n preload: 2,\n padding: \"16px\",\n spacing: \"30%\",\n imageFit: IMAGE_FIT_CONTAIN,\n imageProps: {},\n },\n controller: {\n ref: null,\n focus: true,\n aria: false,\n touchAction: \"none\",\n closeOnPullUp: false,\n closeOnPullDown: false,\n closeOnBackdropClick: false,\n preventDefaultWheelX: true,\n preventDefaultWheelY: false,\n disableSwipeNavigation: false,\n },\n portal: {},\n noScroll: {\n disabled: false,\n },\n on: {},\n styles: {},\n className: \"\",\n};\n\nfunction createModule(name, component) {\n return { name, component };\n}\nfunction createNode(module, children) {\n return { module, children };\n}\nfunction traverseNode(node, target, apply) {\n if (node.module.name === target) {\n return apply(node);\n }\n if (node.children) {\n return [\n createNode(node.module, node.children.flatMap((n) => { var _a; return (_a = traverseNode(n, target, apply)) !== null && _a !== void 0 ? _a : []; })),\n ];\n }\n return [node];\n}\nfunction traverse(nodes, target, apply) {\n return nodes.flatMap((node) => { var _a; return (_a = traverseNode(node, target, apply)) !== null && _a !== void 0 ? _a : []; });\n}\nfunction withPlugins(root, plugins = [], augmentations = []) {\n let config = root;\n const contains = (target) => {\n const nodes = [...config];\n while (nodes.length > 0) {\n const node = nodes.pop();\n if ((node === null || node === void 0 ? void 0 : node.module.name) === target)\n return true;\n if (node === null || node === void 0 ? void 0 : node.children)\n nodes.push(...node.children);\n }\n return false;\n };\n const addParent = (target, module) => {\n if (target === \"\") {\n config = [createNode(module, config)];\n return;\n }\n config = traverse(config, target, (node) => [createNode(module, [node])]);\n };\n const append = (target, module) => {\n config = traverse(config, target, (node) => [createNode(node.module, [createNode(module, node.children)])]);\n };\n const addChild = (target, module, precede) => {\n config = traverse(config, target, (node) => {\n var _a;\n return [\n createNode(node.module, [\n ...(precede ? [createNode(module)] : []),\n ...((_a = node.children) !== null && _a !== void 0 ? _a : []),\n ...(!precede ? [createNode(module)] : []),\n ]),\n ];\n });\n };\n const addSibling = (target, module, precede) => {\n config = traverse(config, target, (node) => [\n ...(precede ? [createNode(module)] : []),\n node,\n ...(!precede ? [createNode(module)] : []),\n ]);\n };\n const addModule = (module) => {\n append(MODULE_CONTROLLER, module);\n };\n const replace = (target, module) => {\n config = traverse(config, target, (node) => [createNode(module, node.children)]);\n };\n const remove = (target) => {\n config = traverse(config, target, (node) => node.children);\n };\n const augment = (augmentation) => {\n augmentations.push(augmentation);\n };\n plugins.forEach((plugin) => {\n plugin({\n contains,\n addParent,\n append,\n addChild,\n addSibling,\n addModule,\n replace,\n remove,\n augment,\n });\n });\n return {\n config,\n augmentation: (props) => augmentations.reduce((acc, augmentation) => augmentation(acc), props),\n };\n}\n\nconst A11yContext = React.createContext(null);\nconst useA11yContext = makeUseContext(\"useA11yContext\", \"A11yContext\", A11yContext);\nfunction A11yContextProvider({ children }) {\n const [focusWithin, setFocusWithin] = React.useState(false);\n const [autoPlaying, setAutoPlaying] = React.useState(false);\n const context = React.useMemo(() => {\n const trackFocusWithin = (onFocus, onBlur) => {\n const trackAndDelegate = (focusWithinValue) => (event) => {\n var _a;\n if (!event.currentTarget.contains(event.relatedTarget)) {\n setFocusWithin(focusWithinValue);\n }\n (_a = (focusWithinValue ? onFocus : onBlur)) === null || _a === void 0 ? void 0 : _a(event);\n };\n return {\n onFocus: trackAndDelegate(true),\n onBlur: trackAndDelegate(false),\n };\n };\n return { focusWithin, trackFocusWithin, autoPlaying, setAutoPlaying };\n }, [focusWithin, autoPlaying]);\n return React.createElement(A11yContext.Provider, { value: context }, children);\n}\n\nconst DocumentContext = React.createContext(null);\nconst useDocumentContext = makeUseContext(\"useDocument\", \"DocumentContext\", DocumentContext);\nfunction DocumentContextProvider({ nodeRef, children }) {\n const context = React.useMemo(() => {\n const getOwnerDocument = (node) => { var _a; return ((_a = (node || nodeRef.current)) === null || _a === void 0 ? void 0 : _a.ownerDocument) || document; };\n const getOwnerWindow = (node) => { var _a; return ((_a = getOwnerDocument(node)) === null || _a === void 0 ? void 0 : _a.defaultView) || window; };\n return { getOwnerDocument, getOwnerWindow };\n }, [nodeRef]);\n return React.createElement(DocumentContext.Provider, { value: context }, children);\n}\n\nconst EventsContext = React.createContext(null);\nconst useEvents = makeUseContext(\"useEvents\", \"EventsContext\", EventsContext);\nfunction EventsProvider({ children }) {\n const [subscriptions] = React.useState({});\n React.useEffect(() => () => {\n Object.keys(subscriptions).forEach((topic) => delete subscriptions[topic]);\n }, [subscriptions]);\n const context = React.useMemo(() => {\n const unsubscribe = (topic, callback) => {\n var _a;\n (_a = subscriptions[topic]) === null || _a === void 0 ? void 0 : _a.splice(0, subscriptions[topic].length, ...subscriptions[topic].filter((cb) => cb !== callback));\n };\n const subscribe = (topic, callback) => {\n if (!subscriptions[topic]) {\n subscriptions[topic] = [];\n }\n subscriptions[topic].push(callback);\n return () => unsubscribe(topic, callback);\n };\n const publish = (...[topic, event]) => {\n var _a;\n (_a = subscriptions[topic]) === null || _a === void 0 ? void 0 : _a.forEach((callback) => callback(event));\n };\n return { publish, subscribe, unsubscribe };\n }, [subscriptions]);\n return React.createElement(EventsContext.Provider, { value: context }, children);\n}\n\nconst LightboxPropsContext = React.createContext(null);\nconst useLightboxProps = makeUseContext(\"useLightboxProps\", \"LightboxPropsContext\", LightboxPropsContext);\nfunction LightboxPropsProvider({ children, ...props }) {\n return React.createElement(LightboxPropsContext.Provider, { value: props }, children);\n}\n\nconst LightboxStateContext = React.createContext(null);\nconst useLightboxState = makeUseContext(\"useLightboxState\", \"LightboxStateContext\", LightboxStateContext);\nconst LightboxDispatchContext = React.createContext(null);\nconst useLightboxDispatch = makeUseContext(\"useLightboxDispatch\", \"LightboxDispatchContext\", LightboxDispatchContext);\nfunction reducer(state, action) {\n switch (action.type) {\n case \"swipe\": {\n const { slides } = state;\n const increment = (action === null || action === void 0 ? void 0 : action.increment) || 0;\n const globalIndex = state.globalIndex + increment;\n const currentIndex = getSlideIndex(globalIndex, slides.length);\n const currentSlide = getSlideIfPresent(slides, currentIndex);\n const animation = increment || action.duration !== undefined\n ? {\n increment,\n duration: action.duration,\n easing: action.easing,\n }\n : undefined;\n return { slides, currentIndex, globalIndex, currentSlide, animation };\n }\n case \"update\":\n if (action.slides !== state.slides || action.index !== state.currentIndex) {\n return {\n slides: action.slides,\n currentIndex: action.index,\n globalIndex: action.index,\n currentSlide: getSlideIfPresent(action.slides, action.index),\n };\n }\n return state;\n default:\n throw new Error(UNKNOWN_ACTION_TYPE);\n }\n}\nfunction LightboxStateProvider({ slides, index, children }) {\n const [state, dispatch] = React.useReducer(reducer, {\n slides,\n currentIndex: index,\n globalIndex: index,\n currentSlide: getSlideIfPresent(slides, index),\n });\n React.useEffect(() => {\n dispatch({ type: \"update\", slides, index });\n }, [slides, index]);\n const context = React.useMemo(() => ({ ...state, state, dispatch }), [state, dispatch]);\n return (React.createElement(LightboxDispatchContext.Provider, { value: dispatch },\n React.createElement(LightboxStateContext.Provider, { value: context }, children)));\n}\n\nconst TimeoutsContext = React.createContext(null);\nconst useTimeouts = makeUseContext(\"useTimeouts\", \"TimeoutsContext\", TimeoutsContext);\nfunction TimeoutsProvider({ children }) {\n const [timeouts] = React.useState([]);\n React.useEffect(() => () => {\n timeouts.forEach((tid) => window.clearTimeout(tid));\n timeouts.splice(0, timeouts.length);\n }, [timeouts]);\n const context = React.useMemo(() => {\n const removeTimeout = (id) => {\n timeouts.splice(0, timeouts.length, ...timeouts.filter((tid) => tid !== id));\n };\n const setTimeout = (fn, delay) => {\n const id = window.setTimeout(() => {\n removeTimeout(id);\n fn();\n }, delay);\n timeouts.push(id);\n return id;\n };\n const clearTimeout = (id) => {\n if (id !== undefined) {\n removeTimeout(id);\n window.clearTimeout(id);\n }\n };\n return { setTimeout, clearTimeout };\n }, [timeouts]);\n return React.createElement(TimeoutsContext.Provider, { value: context }, children);\n}\n\nconst IconButton = React.forwardRef(function IconButton({ label, className, icon: Icon, renderIcon, onClick, style, ...rest }, ref) {\n const { styles, labels } = useLightboxProps();\n const buttonLabel = translateLabel(labels, label);\n return (React.createElement(\"button\", { ref: ref, type: \"button\", title: buttonLabel, \"aria-label\": buttonLabel, className: clsx(cssClass(ELEMENT_BUTTON), className), onClick: onClick, style: { ...style, ...styles.button }, ...rest }, renderIcon ? renderIcon() : React.createElement(Icon, { className: cssClass(ELEMENT_ICON), style: styles.icon })));\n});\n\nfunction svgIcon(name, children) {\n const icon = (props) => (React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", viewBox: \"0 0 24 24\", width: \"24\", height: \"24\", \"aria-hidden\": \"true\", focusable: \"false\", ...props }, children));\n icon.displayName = name;\n return icon;\n}\nfunction createIcon(name, glyph) {\n return svgIcon(name, React.createElement(\"g\", { fill: \"currentColor\" },\n React.createElement(\"path\", { d: \"M0 0h24v24H0z\", fill: \"none\" }),\n glyph));\n}\nfunction createIconDisabled(name, glyph) {\n return svgIcon(name, React.createElement(React.Fragment, null,\n React.createElement(\"defs\", null,\n React.createElement(\"mask\", { id: \"strike\" },\n React.createElement(\"path\", { d: \"M0 0h24v24H0z\", fill: \"white\" }),\n React.createElement(\"path\", { d: \"M0 0L24 24\", stroke: \"black\", strokeWidth: 4 }))),\n React.createElement(\"path\", { d: \"M0.70707 2.121320L21.878680 23.292883\", stroke: \"currentColor\", strokeWidth: 2 }),\n React.createElement(\"g\", { fill: \"currentColor\", mask: \"url(#strike)\" },\n React.createElement(\"path\", { d: \"M0 0h24v24H0z\", fill: \"none\" }),\n glyph)));\n}\nconst CloseIcon = createIcon(\"Close\", React.createElement(\"path\", { d: \"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" }));\nconst PreviousIcon = createIcon(\"Previous\", React.createElement(\"path\", { d: \"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\" }));\nconst NextIcon = createIcon(\"Next\", React.createElement(\"path\", { d: \"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\" }));\nconst LoadingIcon = createIcon(\"Loading\", React.createElement(React.Fragment, null, Array.from({ length: 8 }).map((_, index, array) => (React.createElement(\"line\", { key: index, x1: \"12\", y1: \"6.5\", x2: \"12\", y2: \"1.8\", strokeLinecap: \"round\", strokeWidth: \"2.6\", stroke: \"currentColor\", strokeOpacity: (1 / array.length) * (index + 1), transform: `rotate(${(360 / array.length) * index}, 12, 12)` })))));\nconst ErrorIcon = createIcon(\"Error\", React.createElement(\"path\", { d: \"M21.9,21.9l-8.49-8.49l0,0L3.59,3.59l0,0L2.1,2.1L0.69,3.51L3,5.83V19c0,1.1,0.9,2,2,2h13.17l2.31,2.31L21.9,21.9z M5,18 l3.5-4.5l2.5,3.01L12.17,15l3,3H5z M21,18.17L5.83,3H19c1.1,0,2,0.9,2,2V18.17z\" }));\n\nconst useLayoutEffect = hasWindow() ? React.useLayoutEffect : React.useEffect;\n\nfunction useMotionPreference() {\n const [reduceMotion, setReduceMotion] = React.useState(false);\n React.useEffect(() => {\n var _a, _b;\n const mediaQuery = (_a = window.matchMedia) === null || _a === void 0 ? void 0 : _a.call(window, \"(prefers-reduced-motion: reduce)\");\n setReduceMotion(mediaQuery === null || mediaQuery === void 0 ? void 0 : mediaQuery.matches);\n const listener = (event) => setReduceMotion(event.matches);\n (_b = mediaQuery === null || mediaQuery === void 0 ? void 0 : mediaQuery.addEventListener) === null || _b === void 0 ? void 0 : _b.call(mediaQuery, \"change\", listener);\n return () => { var _a; return (_a = mediaQuery === null || mediaQuery === void 0 ? void 0 : mediaQuery.removeEventListener) === null || _a === void 0 ? void 0 : _a.call(mediaQuery, \"change\", listener); };\n }, []);\n return reduceMotion;\n}\n\nfunction currentTransformation(node) {\n let x = 0;\n let y = 0;\n let z = 0;\n const matrix = window.getComputedStyle(node).transform;\n const matcher = matrix.match(/matrix.*\\((.+)\\)/);\n if (matcher) {\n const values = matcher[1].split(\",\").map(parseInt);\n if (values.length === 6) {\n x = values[4];\n y = values[5];\n }\n else if (values.length === 16) {\n x = values[12];\n y = values[13];\n z = values[14];\n }\n }\n return { x, y, z };\n}\nfunction useAnimation(nodeRef, computeAnimation) {\n const snapshot = React.useRef(undefined);\n const animation = React.useRef(undefined);\n const reduceMotion = useMotionPreference();\n useLayoutEffect(() => {\n var _a, _b, _c;\n if (nodeRef.current && snapshot.current !== undefined && !reduceMotion) {\n const { keyframes, duration, easing, onfinish } = computeAnimation(snapshot.current, nodeRef.current.getBoundingClientRect(), currentTransformation(nodeRef.current)) || {};\n if (keyframes && duration) {\n (_a = animation.current) === null || _a === void 0 ? void 0 : _a.cancel();\n animation.current = undefined;\n try {\n animation.current = (_c = (_b = nodeRef.current).animate) === null || _c === void 0 ? void 0 : _c.call(_b, keyframes, { duration, easing });\n }\n catch (err) {\n console.error(err);\n }\n if (animation.current) {\n animation.current.onfinish = () => {\n animation.current = undefined;\n onfinish === null || onfinish === void 0 ? void 0 : onfinish();\n };\n }\n }\n }\n snapshot.current = undefined;\n });\n return {\n prepareAnimation: (currentSnapshot) => {\n snapshot.current = currentSnapshot;\n },\n isAnimationPlaying: () => { var _a; return ((_a = animation.current) === null || _a === void 0 ? void 0 : _a.playState) === \"running\"; },\n };\n}\n\nfunction useContainerRect() {\n const containerRef = React.useRef(null);\n const observerRef = React.useRef(undefined);\n const [containerRect, setContainerRect] = React.useState();\n const setContainerRef = React.useCallback((node) => {\n containerRef.current = node;\n if (observerRef.current) {\n observerRef.current.disconnect();\n observerRef.current = undefined;\n }\n const updateContainerRect = () => {\n if (node) {\n const styles = window.getComputedStyle(node);\n const parse = (value) => parseFloat(value) || 0;\n setContainerRect({\n width: Math.round(node.clientWidth - parse(styles.paddingLeft) - parse(styles.paddingRight)),\n height: Math.round(node.clientHeight - parse(styles.paddingTop) - parse(styles.paddingBottom)),\n });\n }\n else {\n setContainerRect(undefined);\n }\n };\n updateContainerRect();\n if (node && typeof ResizeObserver !== \"undefined\") {\n observerRef.current = new ResizeObserver(updateContainerRect);\n observerRef.current.observe(node);\n }\n }, []);\n return { setContainerRef, containerRef, containerRect };\n}\n\nfunction useDelay() {\n const timeoutId = React.useRef(undefined);\n const { setTimeout, clearTimeout } = useTimeouts();\n return React.useCallback((callback, delay) => {\n clearTimeout(timeoutId.current);\n timeoutId.current = setTimeout(callback, delay > 0 ? delay : 0);\n }, [setTimeout, clearTimeout]);\n}\n\nfunction useEventCallback(fn) {\n const ref = React.useRef(fn);\n useLayoutEffect(() => {\n ref.current = fn;\n });\n return React.useCallback((...args) => { var _a; return (_a = ref.current) === null || _a === void 0 ? void 0 : _a.call(ref, ...args); }, []);\n}\n\nfunction setRef(ref, value) {\n if (typeof ref === \"function\") {\n ref(value);\n }\n else if (ref) {\n ref.current = value;\n }\n}\nfunction useForkRef(refA, refB) {\n return React.useMemo(() => refA == null && refB == null\n ? null\n : (refValue) => {\n setRef(refA, refValue);\n setRef(refB, refValue);\n }, [refA, refB]);\n}\n\nfunction useLoseFocus(focus, disabled = false) {\n const focused = React.useRef(false);\n useLayoutEffect(() => {\n if (disabled && focused.current) {\n focused.current = false;\n focus();\n }\n }, [disabled, focus]);\n const onFocus = React.useCallback(() => {\n focused.current = true;\n }, []);\n const onBlur = React.useCallback(() => {\n focused.current = false;\n }, []);\n return { onFocus, onBlur };\n}\n\nfunction useRTL() {\n const [isRTL, setIsRTL] = React.useState(false);\n useLayoutEffect(() => {\n setIsRTL(window.getComputedStyle(window.document.documentElement).direction === \"rtl\");\n }, []);\n return isRTL;\n}\n\nfunction useSensors() {\n const [subscribers] = React.useState({});\n const notifySubscribers = React.useCallback((type, event) => {\n var _a;\n (_a = subscribers[type]) === null || _a === void 0 ? void 0 : _a.forEach((listener) => {\n if (!event.isPropagationStopped())\n listener(event);\n });\n }, [subscribers]);\n const registerSensors = React.useMemo(() => ({\n onPointerDown: (event) => notifySubscribers(EVENT_ON_POINTER_DOWN, event),\n onPointerMove: (event) => notifySubscribers(EVENT_ON_POINTER_MOVE, event),\n onPointerUp: (event) => notifySubscribers(EVENT_ON_POINTER_UP, event),\n onPointerLeave: (event) => notifySubscribers(EVENT_ON_POINTER_LEAVE, event),\n onPointerCancel: (event) => notifySubscribers(EVENT_ON_POINTER_CANCEL, event),\n onKeyDown: (event) => notifySubscribers(EVENT_ON_KEY_DOWN, event),\n onKeyUp: (event) => notifySubscribers(EVENT_ON_KEY_UP, event),\n onWheel: (event) => notifySubscribers(EVENT_ON_WHEEL, event),\n }), [notifySubscribers]);\n const subscribeSensors = React.useCallback((type, callback) => {\n if (!subscribers[type]) {\n subscribers[type] = [];\n }\n subscribers[type].unshift(callback);\n return () => {\n const listeners = subscribers[type];\n if (listeners) {\n listeners.splice(0, listeners.length, ...listeners.filter((el) => el !== callback));\n }\n };\n }, [subscribers]);\n return { registerSensors, subscribeSensors };\n}\n\nfunction useThrottle(callback, delay) {\n const lastCallbackTime = React.useRef(0);\n const delayCallback = useDelay();\n const executeCallback = useEventCallback((...args) => {\n lastCallbackTime.current = Date.now();\n callback(args);\n });\n return React.useCallback((...args) => {\n delayCallback(() => {\n executeCallback(args);\n }, delay - (Date.now() - lastCallbackTime.current));\n }, [delay, executeCallback, delayCallback]);\n}\n\nconst slidePrefix = makeComposePrefix(\"slide\");\nconst slideImagePrefix = makeComposePrefix(\"slide_image\");\nfunction ImageSlide({ slide: image, offset, render, rect, imageFit, imageProps, onClick, onLoad, onError, style, }) {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n const [status, setStatus] = React.useState(SLIDE_STATUS_LOADING);\n const { publish } = useEvents();\n const { setTimeout } = useTimeouts();\n const imageRef = React.useRef(null);\n React.useEffect(() => {\n if (offset === 0) {\n publish(activeSlideStatus(status));\n }\n }, [offset, status, publish]);\n const handleLoading = useEventCallback((img) => {\n (\"decode\" in img ? img.decode() : Promise.resolve())\n .catch(() => { })\n .then(() => {\n if (!img.parentNode) {\n return;\n }\n setStatus(SLIDE_STATUS_COMPLETE);\n setTimeout(() => {\n onLoad === null || onLoad === void 0 ? void 0 : onLoad(img);\n }, 0);\n });\n });\n const setImageRef = React.useCallback((img) => {\n imageRef.current = img;\n if (img === null || img === void 0 ? void 0 : img.complete) {\n handleLoading(img);\n }\n }, [handleLoading]);\n const handleOnLoad = React.useCallback((event) => {\n handleLoading(event.currentTarget);\n }, [handleLoading]);\n const handleOnError = useEventCallback(() => {\n setStatus(SLIDE_STATUS_ERROR);\n onError === null || onError === void 0 ? void 0 : onError();\n });\n const cover = isImageFitCover(image, imageFit);\n const nonInfinite = (value, fallback) => (Number.isFinite(value) ? value : fallback);\n const maxWidth = nonInfinite(Math.max(...((_b = (_a = image.srcSet) === null || _a === void 0 ? void 0 : _a.map((x) => x.width)) !== null && _b !== void 0 ? _b : []).concat(image.width ? [image.width] : []).filter(Boolean)), ((_c = imageRef.current) === null || _c === void 0 ? void 0 : _c.naturalWidth) || 0);\n const maxHeight = nonInfinite(Math.max(...((_e = (_d = image.srcSet) === null || _d === void 0 ? void 0 : _d.map((x) => x.height)) !== null && _e !== void 0 ? _e : []).concat(image.height ? [image.height] : []).filter(Boolean)), ((_f = imageRef.current) === null || _f === void 0 ? void 0 : _f.naturalHeight) || 0);\n const defaultStyle = maxWidth && maxHeight\n ? {\n maxWidth: `min(${maxWidth}px, 100%)`,\n maxHeight: `min(${maxHeight}px, 100%)`,\n }\n : {\n maxWidth: \"100%\",\n maxHeight: \"100%\",\n };\n const srcSet = (_g = image.srcSet) === null || _g === void 0 ? void 0 : _g.sort((a, b) => a.width - b.width).map((item) => `${item.src} ${item.width}w`).join(\", \");\n const estimateActualWidth = () => rect && !cover && image.width && image.height ? (rect.height / image.height) * image.width : Number.MAX_VALUE;\n const sizes = srcSet && rect && hasWindow() ? `${Math.round(Math.min(estimateActualWidth(), rect.width))}px` : undefined;\n const { style: imagePropsStyle, className: imagePropsClassName, ...restImageProps } = imageProps || {};\n return (React.createElement(React.Fragment, null,\n React.createElement(\"img\", { ref: setImageRef, onLoad: handleOnLoad, onError: handleOnError, onClick: onClick, draggable: false, className: clsx(cssClass(slideImagePrefix()), cover && cssClass(slideImagePrefix(\"cover\")), status !== SLIDE_STATUS_COMPLETE && cssClass(slideImagePrefix(\"loading\")), imagePropsClassName), style: { ...defaultStyle, ...style, ...imagePropsStyle }, ...restImageProps, alt: (_h = image.alt) !== null && _h !== void 0 ? _h : \"\", sizes: sizes, srcSet: srcSet, src: image.src }),\n status !== SLIDE_STATUS_COMPLETE && (React.createElement(\"div\", { className: cssClass(slidePrefix(SLIDE_STATUS_PLACEHOLDER)) },\n status === SLIDE_STATUS_LOADING &&\n ((render === null || render === void 0 ? void 0 : render.iconLoading) ? (render.iconLoading()) : (React.createElement(LoadingIcon, { className: clsx(cssClass(ELEMENT_ICON), cssClass(slidePrefix(SLIDE_STATUS_LOADING))) }))),\n status === SLIDE_STATUS_ERROR &&\n ((render === null || render === void 0 ? void 0 : render.iconError) ? (render.iconError()) : (React.createElement(ErrorIcon, { className: clsx(cssClass(ELEMENT_ICON), cssClass(slidePrefix(SLIDE_STATUS_ERROR))) })))))));\n}\n\nconst LightboxRoot = React.forwardRef(function LightboxRoot({ className, children, onFocus, onBlur, ...rest }, ref) {\n const nodeRef = React.useRef(null);\n const { trackFocusWithin } = useA11yContext();\n return (React.createElement(DocumentContextProvider, { nodeRef: nodeRef },\n React.createElement(\"div\", { ref: useForkRef(ref, nodeRef), className: clsx(cssClass(\"root\"), className), ...trackFocusWithin(onFocus, onBlur), ...rest }, children)));\n});\n\nvar SwipeState;\n(function (SwipeState) {\n SwipeState[SwipeState[\"NONE\"] = 0] = \"NONE\";\n SwipeState[SwipeState[\"SWIPE\"] = 1] = \"SWIPE\";\n SwipeState[SwipeState[\"PULL\"] = 2] = \"PULL\";\n SwipeState[SwipeState[\"ANIMATION\"] = 3] = \"ANIMATION\";\n})(SwipeState || (SwipeState = {}));\n\nfunction usePointerEvents(subscribeSensors, onPointerDown, onPointerMove, onPointerUp, disabled) {\n React.useEffect(() => !disabled\n ? cleanup(subscribeSensors(EVENT_ON_POINTER_DOWN, onPointerDown), subscribeSensors(EVENT_ON_POINTER_MOVE, onPointerMove), subscribeSensors(EVENT_ON_POINTER_UP, onPointerUp), subscribeSensors(EVENT_ON_POINTER_LEAVE, onPointerUp), subscribeSensors(EVENT_ON_POINTER_CANCEL, onPointerUp))\n : () => { }, [subscribeSensors, onPointerDown, onPointerMove, onPointerUp, disabled]);\n}\n\nvar Gesture;\n(function (Gesture) {\n Gesture[Gesture[\"NONE\"] = 0] = \"NONE\";\n Gesture[Gesture[\"SWIPE\"] = 1] = \"SWIPE\";\n Gesture[Gesture[\"PULL\"] = 2] = \"PULL\";\n})(Gesture || (Gesture = {}));\nconst SWIPE_THRESHOLD = 30;\nfunction usePointerSwipe({ disableSwipeNavigation, closeOnBackdropClick }, subscribeSensors, isSwipeValid, containerWidth, swipeAnimationDuration, onSwipeStart, onSwipeProgress, onSwipeFinish, onSwipeCancel, pullUpEnabled, pullDownEnabled, onPullStart, onPullProgress, onPullFinish, onPullCancel, onClose) {\n const offset = React.useRef(0);\n const pointers = React.useRef([]);\n const activePointer = React.useRef(undefined);\n const startTime = React.useRef(0);\n const gesture = React.useRef(Gesture.NONE);\n const clearPointer = React.useCallback((event) => {\n if (activePointer.current === event.pointerId) {\n activePointer.current = undefined;\n gesture.current = Gesture.NONE;\n }\n const currentPointers = pointers.current;\n currentPointers.splice(0, currentPointers.length, ...currentPointers.filter((p) => p.pointerId !== event.pointerId));\n }, []);\n const addPointer = React.useCallback((event) => {\n clearPointer(event);\n event.persist();\n pointers.current.push(event);\n }, [clearPointer]);\n const lookupPointer = React.useCallback((event) => pointers.current.find(({ pointerId }) => event.pointerId === pointerId), []);\n const onPointerDown = useEventCallback((event) => {\n addPointer(event);\n });\n const exceedsPullThreshold = (value, threshold) => (pullDownEnabled && value > threshold) || (pullUpEnabled && value < -threshold);\n const onPointerUp = useEventCallback((event) => {\n const pointer = lookupPointer(event);\n if (pointer) {\n if (activePointer.current === event.pointerId) {\n const duration = Date.now() - startTime.current;\n const currentOffset = offset.current;\n if (gesture.current === Gesture.SWIPE) {\n if (Math.abs(currentOffset) > 0.3 * containerWidth ||\n (Math.abs(currentOffset) > 5 && duration < swipeAnimationDuration)) {\n onSwipeFinish(currentOffset, duration);\n }\n else {\n onSwipeCancel(currentOffset);\n }\n }\n else if (gesture.current === Gesture.PULL) {\n if (exceedsPullThreshold(currentOffset, 2 * SWIPE_THRESHOLD)) {\n onPullFinish(currentOffset, duration);\n }\n else {\n onPullCancel(currentOffset);\n }\n }\n offset.current = 0;\n gesture.current = Gesture.NONE;\n }\n else {\n const { target } = event;\n if (closeOnBackdropClick &&\n target instanceof HTMLElement &&\n target === pointer.target &&\n (target.classList.contains(cssClass(CLASS_SLIDE)) || target.classList.contains(cssClass(CLASS_SLIDE_WRAPPER)))) {\n onClose();\n }\n }\n }\n clearPointer(event);\n });\n const onPointerMove = useEventCallback((event) => {\n const pointer = lookupPointer(event);\n if (pointer) {\n const isCurrentPointer = activePointer.current === event.pointerId;\n if (event.buttons === 0) {\n if (isCurrentPointer && offset.current !== 0) {\n onPointerUp(event);\n }\n else {\n clearPointer(pointer);\n }\n return;\n }\n const deltaX = event.clientX - pointer.clientX;\n const deltaY = event.clientY - pointer.clientY;\n if (activePointer.current === undefined) {\n const startGesture = (newGesture) => {\n addPointer(event);\n activePointer.current = event.pointerId;\n startTime.current = Date.now();\n gesture.current = newGesture;\n };\n if (Math.abs(deltaX) > Math.abs(deltaY) && Math.abs(deltaX) > SWIPE_THRESHOLD && isSwipeValid(deltaX)) {\n if (!disableSwipeNavigation) {\n startGesture(Gesture.SWIPE);\n onSwipeStart();\n }\n }\n else if (Math.abs(deltaY) > Math.abs(deltaX) && exceedsPullThreshold(deltaY, SWIPE_THRESHOLD)) {\n startGesture(Gesture.PULL);\n onPullStart();\n }\n }\n else if (isCurrentPointer) {\n if (gesture.current === Gesture.SWIPE) {\n offset.current = deltaX;\n onSwipeProgress(deltaX);\n }\n else if (gesture.current === Gesture.PULL) {\n offset.current = deltaY;\n onPullProgress(deltaY);\n }\n }\n }\n });\n usePointerEvents(subscribeSensors, onPointerDown, onPointerMove, onPointerUp);\n}\n\nfunction usePreventWheelDefaults({ preventDefaultWheelX, preventDefaultWheelY, }) {\n const ref = React.useRef(null);\n const listener = useEventCallback((event) => {\n const horizontal = Math.abs(event.deltaX) > Math.abs(event.deltaY);\n if ((horizontal && preventDefaultWheelX) || (!horizontal && preventDefaultWheelY) || event.ctrlKey) {\n event.preventDefault();\n }\n });\n return React.useCallback((node) => {\n var _a;\n if (node) {\n node.addEventListener(\"wheel\", listener, { passive: false });\n }\n else {\n (_a = ref.current) === null || _a === void 0 ? void 0 : _a.removeEventListener(\"wheel\", listener);\n }\n ref.current = node;\n }, [listener]);\n}\n\nfunction useWheelSwipe(swipeState, subscribeSensors, isSwipeValid, containerWidth, swipeAnimationDuration, onSwipeStart, onSwipeProgress, onSwipeFinish, onSwipeCancel) {\n const offset = React.useRef(0);\n const intent = React.useRef(0);\n const intentCleanup = React.useRef(undefined);\n const resetCleanup = React.useRef(undefined);\n const wheelInertia = React.useRef(0);\n const wheelInertiaCleanup = React.useRef(undefined);\n const startTime = React.useRef(0);\n const { setTimeout, clearTimeout } = useTimeouts();\n const cancelSwipeIntentCleanup = React.useCallback(() => {\n if (intentCleanup.current) {\n clearTimeout(intentCleanup.current);\n intentCleanup.current = undefined;\n }\n }, [clearTimeout]);\n const cancelSwipeResetCleanup = React.useCallback(() => {\n if (resetCleanup.current) {\n clearTimeout(resetCleanup.current);\n resetCleanup.current = undefined;\n }\n }, [clearTimeout]);\n const handleCleanup = useEventCallback(() => {\n if (swipeState !== SwipeState.SWIPE) {\n offset.current = 0;\n startTime.current = 0;\n cancelSwipeIntentCleanup();\n cancelSwipeResetCleanup();\n }\n });\n React.useEffect(handleCleanup, [swipeState, handleCleanup]);\n const handleCancelSwipe = useEventCallback((currentSwipeOffset) => {\n resetCleanup.current = undefined;\n if (offset.current === currentSwipeOffset) {\n onSwipeCancel(offset.current);\n }\n });\n const onWheel = useEventCallback((event) => {\n if (event.ctrlKey) {\n return;\n }\n if (Math.abs(event.deltaY) > Math.abs(event.deltaX)) {\n return;\n }\n const setWheelInertia = (inertia) => {\n wheelInertia.current = inertia;\n clearTimeout(wheelInertiaCleanup.current);\n wheelInertiaCleanup.current =\n inertia > 0\n ? setTimeout(() => {\n wheelInertia.current = 0;\n wheelInertiaCleanup.current = undefined;\n }, 300)\n : undefined;\n };\n if (swipeState === SwipeState.NONE) {\n if (Math.abs(event.deltaX) <= 1.2 * Math.abs(wheelInertia.current)) {\n setWheelInertia(event.deltaX);\n return;\n }\n if (!isSwipeValid(-event.deltaX)) {\n return;\n }\n intent.current += event.deltaX;\n cancelSwipeIntentCleanup();\n if (Math.abs(intent.current) > 30) {\n intent.current = 0;\n setWheelInertia(0);\n startTime.current = Date.now();\n onSwipeStart();\n }\n else {\n const currentSwipeIntent = intent.current;\n intentCleanup.current = setTimeout(() => {\n intentCleanup.current = undefined;\n if (currentSwipeIntent === intent.current) {\n intent.current = 0;\n }\n }, swipeAnimationDuration);\n }\n }\n else if (swipeState === SwipeState.SWIPE) {\n let newSwipeOffset = offset.current - event.deltaX;\n newSwipeOffset = Math.min(Math.abs(newSwipeOffset), containerWidth) * Math.sign(newSwipeOffset);\n offset.current = newSwipeOffset;\n onSwipeProgress(newSwipeOffset);\n cancelSwipeResetCleanup();\n if (Math.abs(newSwipeOffset) > 0.2 * containerWidth) {\n setWheelInertia(event.deltaX);\n onSwipeFinish(newSwipeOffset, Date.now() - startTime.current);\n return;\n }\n resetCleanup.current = setTimeout(() => handleCancelSwipe(newSwipeOffset), 2 * swipeAnimationDuration);\n }\n else {\n setWheelInertia(event.deltaX);\n }\n });\n React.useEffect(() => subscribeSensors(EVENT_ON_WHEEL, onWheel), [subscribeSensors, onWheel]);\n}\n\nconst cssContainerPrefix = makeComposePrefix(\"container\");\nconst ControllerContext = React.createContext(null);\nconst useController = makeUseContext(\"useController\", \"ControllerContext\", ControllerContext);\nfunction Controller({ children, ...props }) {\n var _a;\n const { carousel, animation, controller, on, styles, render } = props;\n const { closeOnPullUp, closeOnPullDown, preventDefaultWheelX, preventDefaultWheelY } = controller;\n const [toolbarWidth, setToolbarWidth] = React.useState();\n const state = useLightboxState();\n const dispatch = useLightboxDispatch();\n const [swipeState, setSwipeState] = React.useState(SwipeState.NONE);\n const swipeOffset = React.useRef(0);\n const pullOffset = React.useRef(0);\n const pullOpacity = React.useRef(1);\n const { registerSensors, subscribeSensors } = useSensors();\n const { subscribe, publish } = useEvents();\n const cleanupAnimationIncrement = useDelay();\n const cleanupSwipeOffset = useDelay();\n const cleanupPullOffset = useDelay();\n const { containerRef, setContainerRef, containerRect } = useContainerRect();\n const handleContainerRef = useForkRef(usePreventWheelDefaults({ preventDefaultWheelX, preventDefaultWheelY }), setContainerRef);\n const carouselRef = React.useRef(null);\n const setCarouselRef = useForkRef(carouselRef, undefined);\n const { getOwnerDocument } = useDocumentContext();\n const isRTL = useRTL();\n const rtl = (value) => (isRTL ? -1 : 1) * (typeof value === \"number\" ? value : 1);\n const focus = useEventCallback(() => { var _a; return (_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.focus(); });\n const getLightboxProps = useEventCallback(() => props);\n const getLightboxState = useEventCallback(() => state);\n const prev = React.useCallback((params) => publish(ACTION_PREV, params), [publish]);\n const next = React.useCallback((params) => publish(ACTION_NEXT, params), [publish]);\n const close = React.useCallback(() => publish(ACTION_CLOSE), [publish]);\n const isSwipeValid = (offset) => !(carousel.finite &&\n ((rtl(offset) > 0 && state.currentIndex === 0) ||\n (rtl(offset) < 0 && state.currentIndex === state.slides.length - 1)));\n const setSwipeOffset = (offset) => {\n var _a;\n swipeOffset.current = offset;\n (_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.style.setProperty(cssVar(\"swipe_offset\"), `${Math.round(offset)}px`);\n };\n const setPullOffset = (offset) => {\n var _a, _b;\n pullOffset.current = offset;\n pullOpacity.current = (() => {\n const threshold = 60;\n const minOpacity = 0.5;\n const offsetValue = (() => {\n if (closeOnPullDown && offset > 0)\n return offset;\n if (closeOnPullUp && offset < 0)\n return -offset;\n return 0;\n })();\n return Math.min(Math.max(round(1 - (offsetValue / threshold) * (1 - minOpacity), 2), minOpacity), 1);\n })();\n (_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.style.setProperty(cssVar(\"pull_offset\"), `${Math.round(offset)}px`);\n (_b = containerRef.current) === null || _b === void 0 ? void 0 : _b.style.setProperty(cssVar(\"pull_opacity\"), `${pullOpacity.current}`);\n };\n const { prepareAnimation: preparePullAnimation } = useAnimation(carouselRef, (snapshot, rect, translate) => {\n if (carouselRef.current && containerRect) {\n return {\n keyframes: [\n {\n transform: `translate(0, ${snapshot.rect.y - rect.y + translate.y}px)`,\n opacity: snapshot.opacity,\n },\n { transform: \"translate(0, 0)\", opacity: 1 },\n ],\n duration: snapshot.duration,\n easing: animation.easing.fade,\n };\n }\n return undefined;\n });\n const pull = (offset, cancel) => {\n if (closeOnPullUp || closeOnPullDown) {\n setPullOffset(offset);\n let duration = 0;\n if (carouselRef.current) {\n duration = animation.fade * (cancel ? 2 : 1);\n preparePullAnimation({\n rect: carouselRef.current.getBoundingClientRect(),\n opacity: pullOpacity.current,\n duration,\n });\n }\n cleanupPullOffset(() => {\n setPullOffset(0);\n setSwipeState(SwipeState.NONE);\n }, duration);\n setSwipeState(SwipeState.ANIMATION);\n if (!cancel) {\n close();\n }\n }\n };\n const { prepareAnimation, isAnimationPlaying } = useAnimation(carouselRef, (snapshot, rect, translate) => {\n var _a;\n if (carouselRef.current && containerRect && ((_a = state.animation) === null || _a === void 0 ? void 0 : _a.duration)) {\n const parsedSpacing = parseLengthPercentage(carousel.spacing);\n const spacingValue = (parsedSpacing.percent ? (parsedSpacing.percent * containerRect.width) / 100 : parsedSpacing.pixel) || 0;\n return {\n keyframes: [\n {\n transform: `translate(${rtl(state.globalIndex - snapshot.index) * (containerRect.width + spacingValue) +\n snapshot.rect.x -\n rect.x +\n translate.x}px, 0)`,\n },\n { transform: \"translate(0, 0)\" },\n ],\n duration: state.animation.duration,\n easing: state.animation.easing,\n };\n }\n return undefined;\n });\n const swipe = useEventCallback((action) => {\n var _a, _b;\n const currentSwipeOffset = action.offset || 0;\n const swipeDuration = !currentSwipeOffset ? ((_a = animation.navigation) !== null && _a !== void 0 ? _a : animation.swipe) : animation.swipe;\n const swipeEasing = !currentSwipeOffset && !isAnimationPlaying() ? animation.easing.navigation : animation.easing.swipe;\n let { direction } = action;\n const count = (_b = action.count) !== null && _b !== void 0 ? _b : 1;\n let newSwipeState = SwipeState.ANIMATION;\n let newSwipeAnimationDuration = swipeDuration * count;\n if (!direction) {\n const containerWidth = containerRect === null || containerRect === void 0 ? void 0 : containerRect.width;\n const elapsedTime = action.duration || 0;\n const expectedTime = containerWidth\n ? (swipeDuration / containerWidth) * Math.abs(currentSwipeOffset)\n : swipeDuration;\n if (count !== 0) {\n if (elapsedTime < expectedTime) {\n newSwipeAnimationDuration =\n (newSwipeAnimationDuration / expectedTime) * Math.max(elapsedTime, expectedTime / 5);\n }\n else if (containerWidth) {\n newSwipeAnimationDuration =\n (swipeDuration / containerWidth) * (containerWidth - Math.abs(currentSwipeOffset));\n }\n direction = rtl(currentSwipeOffset) > 0 ? ACTION_PREV : ACTION_NEXT;\n }\n else {\n newSwipeAnimationDuration = swipeDuration / 2;\n }\n }\n let increment = 0;\n if (direction === ACTION_PREV) {\n if (isSwipeValid(rtl(1))) {\n increment = -count;\n }\n else {\n newSwipeState = SwipeState.NONE;\n newSwipeAnimationDuration = swipeDuration;\n }\n }\n else if (direction === ACTION_NEXT) {\n if (isSwipeValid(rtl(-1))) {\n increment = count;\n }\n else {\n newSwipeState = SwipeState.NONE;\n newSwipeAnimationDuration = swipeDuration;\n }\n }\n newSwipeAnimationDuration = Math.round(newSwipeAnimationDuration);\n cleanupSwipeOffset(() => {\n setSwipeOffset(0);\n setSwipeState(SwipeState.NONE);\n }, newSwipeAnimationDuration);\n if (carouselRef.current) {\n prepareAnimation({\n rect: carouselRef.current.getBoundingClientRect(),\n index: state.globalIndex,\n });\n }\n setSwipeState(newSwipeState);\n publish(ACTION_SWIPE, {\n type: \"swipe\",\n increment,\n duration: newSwipeAnimationDuration,\n easing: swipeEasing,\n });\n });\n React.useEffect(() => {\n var _a, _b;\n if (((_a = state.animation) === null || _a === void 0 ? void 0 : _a.increment) && ((_b = state.animation) === null || _b === void 0 ? void 0 : _b.duration)) {\n cleanupAnimationIncrement(() => dispatch({ type: \"swipe\", increment: 0 }), state.animation.duration);\n }\n }, [state.animation, dispatch, cleanupAnimationIncrement]);\n const swipeParams = [\n subscribeSensors,\n isSwipeValid,\n (containerRect === null || containerRect === void 0 ? void 0 : containerRect.width) || 0,\n animation.swipe,\n () => setSwipeState(SwipeState.SWIPE),\n (offset) => setSwipeOffset(offset),\n (offset, duration) => swipe({ offset, duration, count: 1 }),\n (offset) => swipe({ offset, count: 0 }),\n ];\n const pullParams = [\n () => {\n if (closeOnPullDown) {\n setSwipeState(SwipeState.PULL);\n }\n },\n (offset) => setPullOffset(offset),\n (offset) => pull(offset),\n (offset) => pull(offset, true),\n ];\n usePointerSwipe(controller, ...swipeParams, closeOnPullUp, closeOnPullDown, ...pullParams, close);\n useWheelSwipe(swipeState, ...swipeParams);\n const focusOnMount = useEventCallback(() => {\n if (controller.focus &&\n getOwnerDocument().querySelector(`.${cssClass(MODULE_PORTAL)} .${cssClass(cssContainerPrefix())}`)) {\n focus();\n }\n });\n React.useEffect(focusOnMount, [focusOnMount]);\n const onViewCallback = useEventCallback(() => {\n var _a;\n (_a = on.view) === null || _a === void 0 ? void 0 : _a.call(on, { index: state.currentIndex });\n });\n React.useEffect(onViewCallback, [state.globalIndex, onViewCallback]);\n React.useEffect(() => cleanup(subscribe(ACTION_PREV, (action) => swipe({ direction: ACTION_PREV, ...action })), subscribe(ACTION_NEXT, (action) => swipe({ direction: ACTION_NEXT, ...action })), subscribe(ACTION_SWIPE, (action) => dispatch(action))), [subscribe, swipe, dispatch]);\n const context = React.useMemo(() => ({\n prev,\n next,\n close,\n focus,\n slideRect: containerRect ? computeSlideRect(containerRect, carousel.padding) : { width: 0, height: 0 },\n containerRect: containerRect || { width: 0, height: 0 },\n subscribeSensors,\n containerRef,\n setCarouselRef,\n toolbarWidth,\n setToolbarWidth,\n }), [\n prev,\n next,\n close,\n focus,\n subscribeSensors,\n containerRect,\n containerRef,\n setCarouselRef,\n toolbarWidth,\n setToolbarWidth,\n carousel.padding,\n ]);\n React.useImperativeHandle(controller.ref, () => ({\n prev,\n next,\n close,\n focus,\n getLightboxProps,\n getLightboxState,\n }), [prev, next, close, focus, getLightboxProps, getLightboxState]);\n return (React.createElement(\"div\", { ref: handleContainerRef, className: clsx(cssClass(cssContainerPrefix()), cssClass(CLASS_FLEX_CENTER)), style: {\n ...(swipeState === SwipeState.SWIPE\n ? { [cssVar(\"swipe_offset\")]: `${Math.round(swipeOffset.current)}px` }\n : null),\n ...(swipeState === SwipeState.PULL\n ? {\n [cssVar(\"pull_offset\")]: `${Math.round(pullOffset.current)}px`,\n [cssVar(\"pull_opacity\")]: `${pullOpacity.current}`,\n }\n : null),\n ...(controller.touchAction !== \"none\" ? { [cssVar(\"controller_touch_action\")]: controller.touchAction } : null),\n ...styles.container,\n }, tabIndex: -1, ...registerSensors }, containerRect && (React.createElement(ControllerContext.Provider, { value: context },\n children, (_a = render.controls) === null || _a === void 0 ? void 0 :\n _a.call(render)))));\n}\nconst ControllerModule = createModule(MODULE_CONTROLLER, Controller);\n\nfunction cssPrefix$2(value) {\n return composePrefix(MODULE_CAROUSEL, value);\n}\nfunction cssSlidePrefix(value) {\n return composePrefix(CLASS_SLIDE, value);\n}\nfunction CarouselSlide({ slide, offset }) {\n const containerRef = React.useRef(null);\n const { currentIndex, slides } = useLightboxState();\n const { slideRect, focus } = useController();\n const { render, carousel: { imageFit, imageProps }, on: { click: onClick }, styles: { slide: style }, labels, } = useLightboxProps();\n const { getOwnerDocument } = useDocumentContext();\n const offscreen = offset !== 0;\n React.useEffect(() => {\n var _a;\n if (offscreen && ((_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.contains(getOwnerDocument().activeElement))) {\n focus();\n }\n }, [offscreen, focus, getOwnerDocument]);\n const renderSlide = () => {\n var _a, _b, _c, _d;\n let rendered = (_a = render.slide) === null || _a === void 0 ? void 0 : _a.call(render, { slide, offset, rect: slideRect });\n if (!rendered && isImageSlide(slide)) {\n rendered = (React.createElement(ImageSlide, { slide: slide, offset: offset, render: render, rect: slideRect, imageFit: imageFit, imageProps: imageProps, onClick: !offscreen ? () => onClick === null || onClick === void 0 ? void 0 : onClick({ index: currentIndex }) : undefined }));\n }\n return rendered ? (React.createElement(React.Fragment, null, (_b = render.slideHeader) === null || _b === void 0 ? void 0 :\n _b.call(render, { slide }),\n ((_c = render.slideContainer) !== null && _c !== void 0 ? _c : (({ children }) => children))({ slide, children: rendered }), (_d = render.slideFooter) === null || _d === void 0 ? void 0 :\n _d.call(render, { slide }))) : null;\n };\n return (React.createElement(\"div\", { ref: containerRef, className: clsx(cssClass(cssSlidePrefix()), !offscreen && cssClass(cssSlidePrefix(\"current\")), cssClass(CLASS_FLEX_CENTER)), ...makeInertWhen(offscreen), style: style, role: \"group\", \"aria-roledescription\": translateLabel(labels, \"Slide\"), \"aria-label\": translateSlideCounter(labels, slides, currentIndex + offset) }, renderSlide()));\n}\nfunction Placeholder() {\n const style = useLightboxProps().styles.slide;\n return React.createElement(\"div\", { className: cssClass(CLASS_SLIDE), style: style });\n}\nfunction Carousel({ carousel, labels }) {\n const { slides, currentIndex, globalIndex } = useLightboxState();\n const { setCarouselRef } = useController();\n const { autoPlaying, focusWithin } = useA11yContext();\n const spacingValue = parseLengthPercentage(carousel.spacing);\n const paddingValue = parseLengthPercentage(carousel.padding);\n const preload = calculatePreload(carousel, slides, 1);\n const items = [];\n if (hasSlides(slides)) {\n for (let index = currentIndex - preload; index <= currentIndex + preload; index += 1) {\n const slide = getSlide(slides, index);\n const key = globalIndex - currentIndex + index;\n const placeholder = carousel.finite && (index < 0 || index > slides.length - 1);\n items.push(!placeholder\n ? {\n key: [`${key}`, getSlideKey(slide)].filter(Boolean).join(\"|\"),\n offset: index - currentIndex,\n slide,\n }\n : { key });\n }\n }\n return (React.createElement(\"div\", { ref: setCarouselRef, className: clsx(cssClass(cssPrefix$2()), items.length > 0 && cssClass(cssPrefix$2(\"with_slides\"))), style: {\n [`${cssVar(cssPrefix$2(\"slides_count\"))}`]: items.length,\n [`${cssVar(cssPrefix$2(\"spacing_px\"))}`]: spacingValue.pixel || 0,\n [`${cssVar(cssPrefix$2(\"spacing_percent\"))}`]: spacingValue.percent || 0,\n [`${cssVar(cssPrefix$2(\"padding_px\"))}`]: paddingValue.pixel || 0,\n [`${cssVar(cssPrefix$2(\"padding_percent\"))}`]: paddingValue.percent || 0,\n }, role: \"region\", \"aria-live\": autoPlaying && !focusWithin ? \"off\" : \"polite\", \"aria-roledescription\": translateLabel(labels, \"Carousel\"), \"aria-label\": translateLabel(labels, \"Photo gallery\") }, items.map(({ key, slide, offset }) => slide ? React.createElement(CarouselSlide, { key: key, slide: slide, offset: offset }) : React.createElement(Placeholder, { key: key }))));\n}\nconst CarouselModule = createModule(MODULE_CAROUSEL, Carousel);\n\nfunction useNavigationState() {\n const { carousel } = useLightboxProps();\n const { slides, currentIndex } = useLightboxState();\n const prevDisabled = slides.length === 0 || (carousel.finite && currentIndex === 0);\n const nextDisabled = slides.length === 0 || (carousel.finite && currentIndex === slides.length - 1);\n return { prevDisabled, nextDisabled };\n}\n\nfunction useKeyboardNavigation(subscribeSensors) {\n var _a;\n const isRTL = useRTL();\n const { publish } = useEvents();\n const { animation } = useLightboxProps();\n const { prevDisabled, nextDisabled } = useNavigationState();\n const throttle = ((_a = animation.navigation) !== null && _a !== void 0 ? _a : animation.swipe) / 2;\n const prev = useThrottle(() => publish(ACTION_PREV), throttle);\n const next = useThrottle(() => publish(ACTION_NEXT), throttle);\n const handleKeyDown = useEventCallback((event) => {\n switch (event.key) {\n case VK_ESCAPE:\n publish(ACTION_CLOSE);\n break;\n case VK_ARROW_LEFT:\n if (!(isRTL ? nextDisabled : prevDisabled))\n (isRTL ? next : prev)();\n break;\n case VK_ARROW_RIGHT:\n if (!(isRTL ? prevDisabled : nextDisabled))\n (isRTL ? prev : next)();\n break;\n default:\n }\n });\n React.useEffect(() => subscribeSensors(EVENT_ON_KEY_DOWN, handleKeyDown), [subscribeSensors, handleKeyDown]);\n}\n\nfunction NavigationButton({ label, icon, renderIcon, action, onClick, disabled, style }) {\n return (React.createElement(IconButton, { label: label, icon: icon, renderIcon: renderIcon, className: cssClass(`navigation_${action}`), disabled: disabled, onClick: onClick, style: style, ...useLoseFocus(useController().focus, disabled) }));\n}\nfunction Navigation({ render: { buttonPrev, buttonNext, iconPrev, iconNext }, styles }) {\n const { prev, next, subscribeSensors } = useController();\n const { prevDisabled, nextDisabled } = useNavigationState();\n useKeyboardNavigation(subscribeSensors);\n return (React.createElement(React.Fragment, null,\n buttonPrev ? (buttonPrev()) : (React.createElement(NavigationButton, { label: \"Previous\", action: ACTION_PREV, icon: PreviousIcon, renderIcon: iconPrev, style: styles.navigationPrev, disabled: prevDisabled, onClick: prev })),\n buttonNext ? (buttonNext()) : (React.createElement(NavigationButton, { label: \"Next\", action: ACTION_NEXT, icon: NextIcon, renderIcon: iconNext, style: styles.navigationNext, disabled: nextDisabled, onClick: next }))));\n}\nconst NavigationModule = createModule(MODULE_NAVIGATION, Navigation);\n\nconst noScroll = cssClass(CLASS_NO_SCROLL);\nconst noScrollPadding = cssClass(CLASS_NO_SCROLL_PADDING);\nfunction isHTMLElement(element) {\n return \"style\" in element;\n}\nfunction padScrollbar(element, padding, rtl) {\n const styles = window.getComputedStyle(element);\n const property = rtl ? \"padding-left\" : \"padding-right\";\n const computedValue = rtl ? styles.paddingLeft : styles.paddingRight;\n const originalValue = element.style.getPropertyValue(property);\n element.style.setProperty(property, `${(parseInt(computedValue) || 0) + padding}px`);\n return () => {\n if (originalValue) {\n element.style.setProperty(property, originalValue);\n }\n else {\n element.style.removeProperty(property);\n }\n };\n}\nfunction NoScroll({ noScroll: { disabled }, children }) {\n const rtl = useRTL();\n const { getOwnerDocument, getOwnerWindow } = useDocumentContext();\n React.useEffect(() => {\n if (disabled)\n return () => { };\n const cleanup = [];\n const ownerWindow = getOwnerWindow();\n const { body, documentElement } = getOwnerDocument();\n const scrollbar = Math.round(ownerWindow.innerWidth - documentElement.clientWidth);\n if (scrollbar > 0) {\n cleanup.push(padScrollbar(body, scrollbar, rtl));\n const elements = body.getElementsByTagName(\"*\");\n for (let i = 0; i < elements.length; i += 1) {\n const element = elements[i];\n if (isHTMLElement(element) &&\n ownerWindow.getComputedStyle(element).getPropertyValue(\"position\") === \"fixed\" &&\n !element.classList.contains(noScrollPadding)) {\n cleanup.push(padScrollbar(element, scrollbar, rtl));\n }\n }\n }\n body.classList.add(noScroll);\n return () => {\n body.classList.remove(noScroll);\n cleanup.forEach((clean) => clean());\n };\n }, [rtl, disabled, getOwnerDocument, getOwnerWindow]);\n return React.createElement(React.Fragment, null, children);\n}\nconst NoScrollModule = createModule(MODULE_NO_SCROLL, NoScroll);\n\nfunction cssPrefix$1(value) {\n return composePrefix(MODULE_PORTAL, value);\n}\nfunction setAttribute(element, attribute, value) {\n const previousValue = element.getAttribute(attribute);\n element.setAttribute(attribute, value);\n return () => {\n if (previousValue) {\n element.setAttribute(attribute, previousValue);\n }\n else {\n element.removeAttribute(attribute);\n }\n };\n}\nfunction Portal({ children, animation, styles, className, on, portal, close, labels }) {\n const [mounted, setMounted] = React.useState(false);\n const [visible, setVisible] = React.useState(false);\n const cleanup = React.useRef([]);\n const restoreFocus = React.useRef(null);\n const { setTimeout } = useTimeouts();\n const { subscribe } = useEvents();\n const reduceMotion = useMotionPreference();\n const animationDuration = !reduceMotion ? animation.fade : 0;\n React.useEffect(() => {\n setMounted(true);\n return () => {\n setMounted(false);\n setVisible(false);\n };\n }, []);\n const handleCleanup = useEventCallback(() => {\n cleanup.current.forEach((clean) => clean());\n cleanup.current = [];\n });\n const handleClose = useEventCallback(() => {\n var _a;\n setVisible(false);\n handleCleanup();\n (_a = on.exiting) === null || _a === void 0 ? void 0 : _a.call(on);\n setTimeout(() => {\n var _a;\n (_a = on.exited) === null || _a === void 0 ? void 0 : _a.call(on);\n close();\n }, animationDuration);\n });\n React.useEffect(() => subscribe(ACTION_CLOSE, handleClose), [subscribe, handleClose]);\n const handleEnter = useEventCallback((node) => {\n var _a, _b, _c;\n reflow(node);\n setVisible(true);\n (_a = on.entering) === null || _a === void 0 ? void 0 : _a.call(on);\n const elements = (_c = (_b = node.parentNode) === null || _b === void 0 ? void 0 : _b.children) !== null && _c !== void 0 ? _c : [];\n for (let i = 0; i < elements.length; i += 1) {\n const element = elements[i];\n if ([\"TEMPLATE\", \"SCRIPT\", \"STYLE\"].indexOf(element.tagName) === -1 && element !== node) {\n cleanup.current.push(setAttribute(element, \"inert\", \"\"));\n cleanup.current.push(setAttribute(element, \"aria-hidden\", \"true\"));\n }\n }\n cleanup.current.push(() => {\n var _a, _b;\n (_b = (_a = restoreFocus.current) === null || _a === void 0 ? void 0 : _a.focus) === null || _b === void 0 ? void 0 : _b.call(_a);\n });\n setTimeout(() => {\n var _a;\n (_a = on.entered) === null || _a === void 0 ? void 0 : _a.call(on);\n }, animationDuration);\n });\n const handleRef = React.useCallback((node) => {\n if (node) {\n handleEnter(node);\n }\n else {\n handleCleanup();\n }\n }, [handleEnter, handleCleanup]);\n return mounted\n ? createPortal(React.createElement(LightboxRoot, { ref: handleRef, className: clsx(className, cssClass(cssPrefix$1()), cssClass(CLASS_NO_SCROLL_PADDING), visible && cssClass(cssPrefix$1(\"open\"))), \"aria-modal\": true, role: \"dialog\", \"aria-label\": translateLabel(labels, \"Lightbox\"), style: {\n ...(animation.fade !== LightboxDefaultProps.animation.fade\n ? { [cssVar(\"fade_animation_duration\")]: `${animationDuration}ms` }\n : null),\n ...(animation.easing.fade !== LightboxDefaultProps.animation.easing.fade\n ? { [cssVar(\"fade_animation_timing_function\")]: animation.easing.fade }\n : null),\n ...styles.root,\n }, onFocus: (event) => {\n if (!restoreFocus.current) {\n restoreFocus.current = event.relatedTarget;\n }\n } }, children), portal.root || document.body)\n : null;\n}\nconst PortalModule = createModule(MODULE_PORTAL, Portal);\n\nfunction Root({ children }) {\n return React.createElement(React.Fragment, null, children);\n}\nconst RootModule = createModule(MODULE_ROOT, Root);\n\nfunction cssPrefix(value) {\n return composePrefix(MODULE_TOOLBAR, value);\n}\nfunction Toolbar({ toolbar: { buttons }, render: { buttonClose, iconClose }, styles }) {\n const { close, setToolbarWidth } = useController();\n const { setContainerRef, containerRect } = useContainerRect();\n useLayoutEffect(() => {\n setToolbarWidth(containerRect === null || containerRect === void 0 ? void 0 : containerRect.width);\n }, [setToolbarWidth, containerRect === null || containerRect === void 0 ? void 0 : containerRect.width]);\n const renderCloseButton = () => {\n if (buttonClose)\n return buttonClose();\n return React.createElement(IconButton, { key: ACTION_CLOSE, label: \"Close\", icon: CloseIcon, renderIcon: iconClose, onClick: close });\n };\n return (React.createElement(\"div\", { ref: setContainerRef, style: styles.toolbar, className: cssClass(cssPrefix()) }, buttons === null || buttons === void 0 ? void 0 : buttons.map((button) => (button === ACTION_CLOSE ? renderCloseButton() : button))));\n}\nconst ToolbarModule = createModule(MODULE_TOOLBAR, Toolbar);\n\nfunction renderNode(node, props) {\n var _a;\n return React.createElement(node.module.component, { key: node.module.name, ...props }, (_a = node.children) === null || _a === void 0 ? void 0 : _a.map((child) => renderNode(child, props)));\n}\nfunction mergeAnimation(defaultAnimation, animation = {}) {\n const { easing: defaultAnimationEasing, ...restDefaultAnimation } = defaultAnimation;\n const { easing, ...restAnimation } = animation;\n return {\n easing: { ...defaultAnimationEasing, ...easing },\n ...restDefaultAnimation,\n ...restAnimation,\n };\n}\nfunction Lightbox({ carousel, animation, render, toolbar, controller, noScroll, on, plugins, slides, index, ...restProps }) {\n const { animation: defaultAnimation, carousel: defaultCarousel, render: defaultRender, toolbar: defaultToolbar, controller: defaultController, noScroll: defaultNoScroll, on: defaultOn, slides: defaultSlides, index: defaultIndex, plugins: defaultPlugins, ...restDefaultProps } = LightboxDefaultProps;\n const { config, augmentation } = withPlugins([\n createNode(PortalModule, [\n createNode(NoScrollModule, [\n createNode(ControllerModule, [\n createNode(CarouselModule),\n createNode(ToolbarModule),\n createNode(NavigationModule),\n ]),\n ]),\n ]),\n ], plugins || defaultPlugins);\n const props = augmentation({\n animation: mergeAnimation(defaultAnimation, animation),\n carousel: { ...defaultCarousel, ...carousel },\n render: { ...defaultRender, ...render },\n toolbar: { ...defaultToolbar, ...toolbar },\n controller: { ...defaultController, ...controller },\n noScroll: { ...defaultNoScroll, ...noScroll },\n on: { ...defaultOn, ...on },\n ...restDefaultProps,\n ...restProps,\n });\n if (!props.open)\n return null;\n return (React.createElement(LightboxPropsProvider, { ...props },\n React.createElement(LightboxStateProvider, { slides: slides || defaultSlides, index: parseInt(index || defaultIndex) },\n React.createElement(TimeoutsProvider, null,\n React.createElement(EventsProvider, null,\n React.createElement(A11yContextProvider, null, renderNode(createNode(RootModule, config), props)))))));\n}\n\nexport { A11yContext, A11yContextProvider, ACTION_CLOSE, ACTION_NEXT, ACTION_PREV, ACTION_SWIPE, CLASS_FLEX_CENTER, CLASS_NO_SCROLL, CLASS_NO_SCROLL_PADDING, CLASS_SLIDE, CLASS_SLIDE_WRAPPER, Carousel, CarouselModule, CloseIcon, Controller, ControllerContext, ControllerModule, DocumentContext, DocumentContextProvider, ELEMENT_BUTTON, ELEMENT_ICON, EVENT_ON_KEY_DOWN, EVENT_ON_KEY_UP, EVENT_ON_POINTER_CANCEL, EVENT_ON_POINTER_DOWN, EVENT_ON_POINTER_LEAVE, EVENT_ON_POINTER_MOVE, EVENT_ON_POINTER_UP, EVENT_ON_WHEEL, ErrorIcon, EventsContext, EventsProvider, IMAGE_FIT_CONTAIN, IMAGE_FIT_COVER, IconButton, ImageSlide, Lightbox, LightboxDefaultProps, LightboxDispatchContext, LightboxPropsContext, LightboxPropsProvider, LightboxRoot, LightboxStateContext, LightboxStateProvider, LoadingIcon, MODULE_CAROUSEL, MODULE_CONTROLLER, MODULE_NAVIGATION, MODULE_NO_SCROLL, MODULE_PORTAL, MODULE_ROOT, MODULE_TOOLBAR, Navigation, NavigationButton, NavigationModule, NextIcon, NoScroll, NoScrollModule, Portal, PortalModule, PreviousIcon, Root, RootModule, SLIDE_STATUS_COMPLETE, SLIDE_STATUS_ERROR, SLIDE_STATUS_LOADING, SLIDE_STATUS_PLACEHOLDER, SwipeState, TimeoutsContext, TimeoutsProvider, Toolbar, ToolbarModule, UNKNOWN_ACTION_TYPE, VK_ARROW_LEFT, VK_ARROW_RIGHT, VK_ESCAPE, activeSlideStatus, addToolbarButton, calculatePreload, cleanup, clsx, composePrefix, computeSlideRect, createIcon, createIconDisabled, createModule, createNode, cssClass, cssVar, Lightbox as default, devicePixelRatio, getSlide, getSlideIfPresent, getSlideIndex, getSlideKey, hasSlides, hasWindow, isImageFitCover, isImageSlide, label, makeComposePrefix, makeInertWhen, makeUseContext, parseInt, parseLengthPercentage, reflow, round, setRef, stopNavigationEventsPropagation, translateLabel, translateSlideCounter, useA11yContext, useAnimation, useContainerRect, useController, useDelay, useDocumentContext, useEventCallback, useEvents, useForkRef, useKeyboardNavigation, useLayoutEffect, useLightboxDispatch, useLightboxProps, useLightboxState, useLoseFocus, useMotionPreference, useNavigationState, usePointerEvents, usePointerSwipe, usePreventWheelDefaults, useRTL, useSensors, useThrottle, useTimeouts, useWheelSwipe, withPlugins };","import * as React from 'react';\nimport { useLightboxProps, useMotionPreference, useEventCallback, useLayoutEffect, useLightboxState, isImageSlide, isImageFitCover, round, useDocumentContext, useController, usePointerEvents, cleanup, makeUseContext, createIcon, IconButton, devicePixelRatio, ImageSlide, clsx, cssClass, addToolbarButton, createModule } from '../../index.js';\nimport { EVENT_ON_KEY_DOWN, EVENT_ON_WHEEL, UNKNOWN_ACTION_TYPE, CLASS_FULLSIZE, CLASS_FLEX_CENTER, CLASS_SLIDE_WRAPPER, CLASS_SLIDE_WRAPPER_INTERACTIVE, PLUGIN_ZOOM } from '../../types.js';\n\nconst defaultZoomProps = {\n minZoom: 1,\n maxZoomPixelRatio: 1,\n zoomInMultiplier: 2,\n doubleTapDelay: 300,\n doubleClickDelay: 500,\n doubleClickMaxStops: 2,\n keyboardMoveDistance: 50,\n wheelZoomDistanceFactor: 100,\n pinchZoomDistanceFactor: 100,\n pinchZoomV4: false,\n scrollToZoom: false,\n};\nfunction validateMinZoom(minZoom) {\n return Math.min(Math.max(minZoom, Number.EPSILON), 1);\n}\nfunction resolveZoomProps(zoom) {\n const { minZoom, ...rest } = { ...defaultZoomProps, ...zoom };\n return { minZoom: validateMinZoom(minZoom), ...rest };\n}\n\nfunction useZoomAnimation(zoom, offsetX, offsetY, zoomWrapperRef) {\n const zoomAnimation = React.useRef(undefined);\n const zoomAnimationStart = React.useRef(undefined);\n const { zoom: zoomAnimationDuration } = useLightboxProps().animation;\n const reduceMotion = useMotionPreference();\n const playZoomAnimation = useEventCallback(() => {\n var _a, _b, _c;\n (_a = zoomAnimation.current) === null || _a === void 0 ? void 0 : _a.cancel();\n zoomAnimation.current = undefined;\n if (zoomAnimationStart.current && (zoomWrapperRef === null || zoomWrapperRef === void 0 ? void 0 : zoomWrapperRef.current)) {\n try {\n zoomAnimation.current = (_c = (_b = zoomWrapperRef.current).animate) === null || _c === void 0 ? void 0 : _c.call(_b, [\n { transform: zoomAnimationStart.current },\n { transform: `scale(${zoom}) translateX(${offsetX}px) translateY(${offsetY}px)` },\n ], {\n duration: !reduceMotion ? (zoomAnimationDuration !== null && zoomAnimationDuration !== void 0 ? zoomAnimationDuration : 500) : 0,\n easing: zoomAnimation.current ? \"ease-out\" : \"ease-in-out\",\n });\n }\n catch (err) {\n console.error(err);\n }\n zoomAnimationStart.current = undefined;\n if (zoomAnimation.current) {\n zoomAnimation.current.onfinish = () => {\n zoomAnimation.current = undefined;\n };\n }\n }\n });\n useLayoutEffect(playZoomAnimation, [zoom, offsetX, offsetY, playZoomAnimation]);\n return React.useCallback(() => {\n zoomAnimationStart.current = (zoomWrapperRef === null || zoomWrapperRef === void 0 ? void 0 : zoomWrapperRef.current)\n ? window.getComputedStyle(zoomWrapperRef.current).transform\n : undefined;\n }, [zoomWrapperRef]);\n}\n\nfunction useZoomCallback(zoom, disabled) {\n const { on } = useLightboxProps();\n const onZoomCallback = useEventCallback(() => {\n var _a;\n if (!disabled) {\n (_a = on.zoom) === null || _a === void 0 ? void 0 : _a.call(on, { zoom });\n }\n });\n React.useEffect(onZoomCallback, [zoom, onZoomCallback]);\n}\n\nfunction useZoomProps() {\n const { zoom } = useLightboxProps();\n return resolveZoomProps(zoom);\n}\n\nfunction useZoomImageRect(slideRect, imageDimensions) {\n var _a, _b;\n let imageRect = { width: 0, height: 0 };\n let maxImageRect = { width: 0, height: 0 };\n const { currentSlide } = useLightboxState();\n const { imageFit } = useLightboxProps().carousel;\n const { maxZoomPixelRatio } = useZoomProps();\n if (slideRect && currentSlide) {\n const slide = { ...currentSlide, ...imageDimensions };\n if (isImageSlide(slide)) {\n const cover = isImageFitCover(slide, imageFit);\n const width = Math.max(...(((_a = slide.srcSet) === null || _a === void 0 ? void 0 : _a.map((x) => x.width)) || []).concat(slide.width ? [slide.width] : []));\n const height = Math.max(...(((_b = slide.srcSet) === null || _b === void 0 ? void 0 : _b.map((x) => x.height)) || []).concat(slide.height ? [slide.height] : []));\n if (width > 0 && height > 0 && slideRect.width > 0 && slideRect.height > 0) {\n maxImageRect = cover\n ? {\n width: Math.round(Math.min(width, (slideRect.width / slideRect.height) * height)),\n height: Math.round(Math.min(height, (slideRect.height / slideRect.width) * width)),\n }\n : { width, height };\n maxImageRect = {\n width: maxImageRect.width * maxZoomPixelRatio,\n height: maxImageRect.height * maxZoomPixelRatio,\n };\n imageRect = cover\n ? {\n width: Math.min(slideRect.width, maxImageRect.width, width),\n height: Math.min(slideRect.height, maxImageRect.height, height),\n }\n : {\n width: Math.round(Math.min(slideRect.width, (slideRect.height / height) * width, width)),\n height: Math.round(Math.min(slideRect.height, (slideRect.width / width) * height, height)),\n };\n }\n }\n }\n const maxZoom = imageRect.width ? Math.max(round(maxImageRect.width / imageRect.width, 5), 1) : 1;\n return { imageRect, maxZoom };\n}\n\nfunction distance(pointerA, pointerB) {\n return Math.hypot(pointerA.clientX - pointerB.clientX, pointerA.clientY - pointerB.clientY);\n}\nfunction scaleZoom(value, delta, factor = 100, clamp = 2) {\n return value * Math.min(1 + Math.abs(delta / factor), clamp) ** Math.sign(delta);\n}\nfunction useZoomSensors(zoom, minZoom, maxZoom, disabled, zoomIn, zoomOut, changeZoom, changeOffsets, zoomWrapperRef) {\n const activePointers = React.useRef([]);\n const lastPointerDown = React.useRef(0);\n const pinchZoom = React.useRef(undefined);\n const { globalIndex } = useLightboxState();\n const { getOwnerWindow } = useDocumentContext();\n const { containerRef, subscribeSensors } = useController();\n const { keyboardMoveDistance, zoomInMultiplier, wheelZoomDistanceFactor, scrollToZoom, doubleTapDelay, doubleClickDelay, doubleClickMaxStops, pinchZoomDistanceFactor, pinchZoomV4, } = useZoomProps();\n const translateCoordinates = React.useCallback((event) => {\n if (containerRef.current) {\n const { pageX, pageY } = event;\n const { scrollX, scrollY } = getOwnerWindow();\n const { left, top, width, height } = containerRef.current.getBoundingClientRect();\n return [pageX - left - scrollX - width / 2, pageY - top - scrollY - height / 2];\n }\n return [];\n }, [containerRef, getOwnerWindow]);\n const onKeyDown = useEventCallback((event) => {\n const { key, metaKey, ctrlKey } = event;\n const meta = metaKey || ctrlKey;\n const preventDefault = () => {\n event.preventDefault();\n event.stopPropagation();\n };\n if (zoom > 1) {\n const move = (deltaX, deltaY) => {\n preventDefault();\n changeOffsets(deltaX, deltaY);\n };\n if (key === \"ArrowDown\") {\n move(0, keyboardMoveDistance);\n }\n else if (key === \"ArrowUp\") {\n move(0, -keyboardMoveDistance);\n }\n else if (key === \"ArrowLeft\") {\n move(-keyboardMoveDistance, 0);\n }\n else if (key === \"ArrowRight\") {\n move(keyboardMoveDistance, 0);\n }\n }\n if (key === \"+\" || (meta && key === \"=\")) {\n preventDefault();\n zoomIn();\n }\n else if (key === \"-\" || (meta && key === \"_\")) {\n preventDefault();\n zoomOut();\n }\n else if (meta && key === \"0\") {\n preventDefault();\n changeZoom(1);\n }\n });\n const onWheel = useEventCallback((event) => {\n if (event.ctrlKey || scrollToZoom) {\n if (Math.abs(event.deltaY) > Math.abs(event.deltaX)) {\n event.stopPropagation();\n changeZoom(scaleZoom(zoom, -event.deltaY, wheelZoomDistanceFactor), true, ...translateCoordinates(event));\n return;\n }\n }\n if (zoom > 1) {\n event.stopPropagation();\n if (!scrollToZoom) {\n changeOffsets(event.deltaX, event.deltaY);\n }\n }\n });\n const clearPointer = React.useCallback((event) => {\n const pointers = activePointers.current;\n pointers.splice(0, pointers.length, ...pointers.filter((p) => p.pointerId !== event.pointerId));\n }, []);\n const replacePointer = React.useCallback((event) => {\n clearPointer(event);\n event.persist();\n activePointers.current.push(event);\n }, [clearPointer]);\n const onPointerDown = useEventCallback((event) => {\n var _a;\n const pointers = activePointers.current;\n if ((event.pointerType === \"mouse\" && event.buttons > 1) ||\n !((_a = zoomWrapperRef === null || zoomWrapperRef === void 0 ? void 0 : zoomWrapperRef.current) === null || _a === void 0 ? void 0 : _a.contains(event.target))) {\n return;\n }\n if (zoom > 1) {\n event.stopPropagation();\n }\n const { timeStamp } = event;\n if (pointers.length === 0 &&\n timeStamp - lastPointerDown.current < (event.pointerType === \"touch\" ? doubleTapDelay : doubleClickDelay)) {\n lastPointerDown.current = 0;\n const targetZoom = zoom >= 1\n ? zoom !== maxZoom\n ? zoom * Math.max(maxZoom ** (1 / doubleClickMaxStops), zoomInMultiplier)\n : 1\n : zoom !== minZoom\n ? zoom / Math.max(minZoom ** (-1 / doubleClickMaxStops), zoomInMultiplier)\n : 1;\n changeZoom(targetZoom, false, ...translateCoordinates(event));\n }\n else {\n lastPointerDown.current = timeStamp;\n }\n replacePointer(event);\n if (pointers.length === 2) {\n const initialDistance = distance(pointers[0], pointers[1]);\n pinchZoom.current = {\n previousDistance: initialDistance,\n initialDistance: Math.max(initialDistance, 1),\n initialZoom: zoom,\n };\n }\n });\n const onPointerMove = useEventCallback((event) => {\n const pointers = activePointers.current;\n const activePointer = pointers.find((p) => p.pointerId === event.pointerId);\n if (pointers.length === 2 && pinchZoom.current) {\n event.stopPropagation();\n replacePointer(event);\n const currentDistance = distance(pointers[0], pointers[1]);\n const targetZoom = pinchZoomV4\n ? (pinchZoom.current.initialZoom / pinchZoom.current.initialDistance) * currentDistance\n : scaleZoom(zoom, currentDistance - pinchZoom.current.previousDistance, pinchZoomDistanceFactor);\n changeZoom(targetZoom, true, ...pointers\n .map((x) => translateCoordinates(x))\n .reduce((acc, coordinate) => coordinate.map((x, i) => acc[i] + x / 2)));\n pinchZoom.current.previousDistance = currentDistance;\n return;\n }\n if (zoom > 1) {\n event.stopPropagation();\n if (activePointer) {\n if (pointers.length === 1) {\n changeOffsets((activePointer.clientX - event.clientX) / zoom, (activePointer.clientY - event.clientY) / zoom);\n }\n replacePointer(event);\n }\n }\n });\n const onPointerUp = React.useCallback((event) => {\n const pointers = activePointers.current;\n if (pointers.length === 2 && pointers.find((p) => p.pointerId === event.pointerId)) {\n pinchZoom.current = undefined;\n }\n clearPointer(event);\n }, [clearPointer]);\n const cleanupSensors = React.useCallback(() => {\n const pointers = activePointers.current;\n pointers.splice(0, pointers.length);\n lastPointerDown.current = 0;\n pinchZoom.current = undefined;\n }, []);\n usePointerEvents(subscribeSensors, onPointerDown, onPointerMove, onPointerUp, disabled);\n React.useEffect(cleanupSensors, [globalIndex, cleanupSensors]);\n React.useEffect(() => {\n if (!disabled) {\n return cleanup(cleanupSensors, subscribeSensors(EVENT_ON_KEY_DOWN, onKeyDown), subscribeSensors(EVENT_ON_WHEEL, onWheel));\n }\n return () => { };\n }, [disabled, subscribeSensors, cleanupSensors, onKeyDown, onWheel]);\n}\n\nfunction useZoomState(imageRect, maxZoom, zoomWrapperRef) {\n const [zoom, setZoom] = React.useState(1);\n const [offsetX, setOffsetX] = React.useState(0);\n const [offsetY, setOffsetY] = React.useState(0);\n const animate = useZoomAnimation(zoom, offsetX, offsetY, zoomWrapperRef);\n const { currentSlide, globalIndex } = useLightboxState();\n const { containerRect, slideRect } = useController();\n const { minZoom, zoomInMultiplier } = useZoomProps();\n const currentSource = currentSlide && isImageSlide(currentSlide) ? currentSlide.src : undefined;\n const disabled = !currentSource || !(zoomWrapperRef === null || zoomWrapperRef === void 0 ? void 0 : zoomWrapperRef.current);\n useLayoutEffect(() => {\n setZoom(1);\n setOffsetX(0);\n setOffsetY(0);\n }, [globalIndex, currentSource]);\n const changeOffsets = React.useCallback((dx, dy, targetZoom) => {\n const newZoom = targetZoom || zoom;\n const newOffsetX = offsetX - (dx || 0);\n const newOffsetY = offsetY - (dy || 0);\n const maxOffsetX = (imageRect.width * newZoom - slideRect.width) / 2 / newZoom;\n const maxOffsetY = (imageRect.height * newZoom - slideRect.height) / 2 / newZoom;\n setOffsetX(Math.min(Math.abs(newOffsetX), Math.max(maxOffsetX, 0)) * Math.sign(newOffsetX));\n setOffsetY(Math.min(Math.abs(newOffsetY), Math.max(maxOffsetY, 0)) * Math.sign(newOffsetY));\n }, [zoom, offsetX, offsetY, slideRect, imageRect.width, imageRect.height]);\n const changeZoom = React.useCallback((targetZoom, rapid, dx, dy) => {\n const newZoom = round(targetZoom + 0.01 < maxZoom ? (targetZoom - 0.01 > minZoom ? targetZoom : minZoom) : maxZoom, 5);\n if (!rapid) {\n animate();\n }\n changeOffsets(dx ? dx * (1 / zoom - 1 / newZoom) : 0, dy ? dy * (1 / zoom - 1 / newZoom) : 0, newZoom);\n setZoom(newZoom);\n }, [zoom, minZoom, maxZoom, changeOffsets, animate]);\n const handleControllerRectChange = useEventCallback(() => {\n if (zoom > 1) {\n if (zoom > maxZoom) {\n changeZoom(maxZoom, true);\n }\n changeOffsets();\n }\n });\n useLayoutEffect(handleControllerRectChange, [containerRect.width, containerRect.height, handleControllerRectChange]);\n const zoomIn = React.useCallback(() => {\n const targetZoom = zoom * zoomInMultiplier;\n changeZoom(zoom < 1 && targetZoom > 1 ? 1 : targetZoom);\n }, [zoom, zoomInMultiplier, changeZoom]);\n const zoomOut = React.useCallback(() => {\n const targetZoom = zoom / zoomInMultiplier;\n changeZoom(zoom > 1 && targetZoom < 1 ? 1 : targetZoom);\n }, [zoom, zoomInMultiplier, changeZoom]);\n return { zoom, offsetX, offsetY, disabled, changeOffsets, changeZoom, zoomIn, zoomOut };\n}\n\nconst ZoomControllerContext = React.createContext(null);\nconst useZoom = makeUseContext(\"useZoom\", \"ZoomControllerContext\", ZoomControllerContext);\nfunction ZoomContextProvider({ children }) {\n const [zoomWrapper, setZoomWrapper] = React.useState();\n const { slideRect } = useController();\n const { ref, minZoom } = useZoomProps();\n const { imageRect, maxZoom } = useZoomImageRect(slideRect, zoomWrapper === null || zoomWrapper === void 0 ? void 0 : zoomWrapper.imageDimensions);\n const { zoom, offsetX, offsetY, disabled, changeZoom, changeOffsets, zoomIn, zoomOut } = useZoomState(imageRect, maxZoom, zoomWrapper === null || zoomWrapper === void 0 ? void 0 : zoomWrapper.zoomWrapperRef);\n useZoomCallback(zoom, disabled);\n useZoomSensors(zoom, minZoom, maxZoom, disabled, zoomIn, zoomOut, changeZoom, changeOffsets, zoomWrapper === null || zoomWrapper === void 0 ? void 0 : zoomWrapper.zoomWrapperRef);\n const zoomRef = React.useMemo(() => ({ zoom, minZoom, maxZoom, offsetX, offsetY, disabled, zoomIn, zoomOut, changeZoom }), [zoom, minZoom, maxZoom, offsetX, offsetY, disabled, zoomIn, zoomOut, changeZoom]);\n React.useImperativeHandle(ref, () => zoomRef, [zoomRef]);\n const context = React.useMemo(() => ({ ...zoomRef, setZoomWrapper }), [zoomRef, setZoomWrapper]);\n return React.createElement(ZoomControllerContext.Provider, { value: context }, children);\n}\n\nconst ZoomInIcon = createIcon(\"ZoomIn\", React.createElement(React.Fragment, null,\n React.createElement(\"path\", { d: \"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\" }),\n React.createElement(\"path\", { d: \"M12 10h-2v2H9v-2H7V9h2V7h1v2h2v1z\" })));\nconst ZoomOutIcon = createIcon(\"ZoomOut\", React.createElement(\"path\", { d: \"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14zM7 9h5v1H7z\" }));\nconst ZoomButton = React.forwardRef(function ZoomButton({ zoomIn, onLoseFocus }, ref) {\n const wasEnabled = React.useRef(false);\n const wasFocused = React.useRef(false);\n const { zoom, minZoom, maxZoom, zoomIn: zoomInCallback, zoomOut: zoomOutCallback, disabled: zoomDisabled, } = useZoom();\n const { render } = useLightboxProps();\n const disabled = zoomDisabled || (zoomIn ? zoom >= maxZoom : zoom <= minZoom);\n React.useEffect(() => {\n if (disabled && wasEnabled.current && wasFocused.current) {\n onLoseFocus();\n }\n if (!disabled) {\n wasEnabled.current = true;\n }\n }, [disabled, onLoseFocus]);\n return (React.createElement(IconButton, { ref: ref, disabled: disabled, label: zoomIn ? \"Zoom in\" : \"Zoom out\", icon: zoomIn ? ZoomInIcon : ZoomOutIcon, renderIcon: zoomIn ? render.iconZoomIn : render.iconZoomOut, onClick: zoomIn ? zoomInCallback : zoomOutCallback, onFocus: () => {\n wasFocused.current = true;\n }, onBlur: () => {\n wasFocused.current = false;\n } }));\n});\n\nfunction ZoomButtonsGroup() {\n const zoomInRef = React.useRef(null);\n const zoomOutRef = React.useRef(null);\n const { focus } = useController();\n const focusSibling = React.useCallback((sibling) => {\n var _a, _b;\n if (!((_a = sibling.current) === null || _a === void 0 ? void 0 : _a.disabled)) {\n (_b = sibling.current) === null || _b === void 0 ? void 0 : _b.focus();\n }\n else {\n focus();\n }\n }, [focus]);\n const focusZoomIn = React.useCallback(() => focusSibling(zoomInRef), [focusSibling]);\n const focusZoomOut = React.useCallback(() => focusSibling(zoomOutRef), [focusSibling]);\n return (React.createElement(React.Fragment, null,\n React.createElement(ZoomButton, { zoomIn: true, ref: zoomInRef, onLoseFocus: focusZoomOut }),\n React.createElement(ZoomButton, { ref: zoomOutRef, onLoseFocus: focusZoomIn })));\n}\n\nfunction ZoomToolbarControl() {\n const { render } = useLightboxProps();\n const zoomRef = useZoom();\n if (render.buttonZoom) {\n return React.createElement(React.Fragment, null, render.buttonZoom(zoomRef));\n }\n return React.createElement(ZoomButtonsGroup, null);\n}\n\nfunction isResponsiveImageSlide(slide) {\n var _a;\n return (((_a = slide.srcSet) === null || _a === void 0 ? void 0 : _a.length) || 0) > 0;\n}\nfunction reducer({ current, preload }, { type, source }) {\n switch (type) {\n case \"fetch\":\n if (!current) {\n return { current: source };\n }\n return { current, preload: source };\n case \"done\":\n if (source === preload) {\n return { current: source };\n }\n return { current, preload };\n default:\n throw new Error(UNKNOWN_ACTION_TYPE);\n }\n}\nfunction ResponsiveImage(props) {\n var _a, _b;\n const [{ current, preload }, dispatch] = React.useReducer(reducer, {});\n const { slide: image, rect, imageFit, render, interactive } = props;\n const srcSet = image.srcSet.sort((a, b) => a.width - b.width);\n const width = (_a = image.width) !== null && _a !== void 0 ? _a : srcSet[srcSet.length - 1].width;\n const height = (_b = image.height) !== null && _b !== void 0 ? _b : srcSet[srcSet.length - 1].height;\n const cover = isImageFitCover(image, imageFit);\n const maxWidth = Math.max(...srcSet.map((x) => x.width));\n const targetWidth = Math.min((cover ? Math.max : Math.min)(rect.width, width * (rect.height / height)), maxWidth);\n const pixelDensity = devicePixelRatio();\n const handleResize = useEventCallback(() => {\n var _a;\n const targetSource = (_a = srcSet.find((x) => x.width >= targetWidth * pixelDensity)) !== null && _a !== void 0 ? _a : srcSet[srcSet.length - 1];\n if (!current || srcSet.findIndex((x) => x.src === current) < srcSet.findIndex((x) => x === targetSource)) {\n dispatch({ type: \"fetch\", source: targetSource.src });\n }\n });\n useLayoutEffect(handleResize, [rect.width, rect.height, pixelDensity, handleResize]);\n const handlePreload = useEventCallback((currentPreload) => dispatch({ type: \"done\", source: currentPreload }));\n const style = {\n WebkitTransform: !interactive ? \"translateZ(0)\" : \"initial\",\n };\n if (!cover) {\n Object.assign(style, rect.width / rect.height < width / height ? { width: \"100%\", height: \"auto\" } : { width: \"auto\", height: \"100%\" });\n }\n return (React.createElement(React.Fragment, null,\n preload && preload !== current && (React.createElement(ImageSlide, { key: \"preload\", ...props, offset: undefined, slide: { ...image, src: preload, srcSet: undefined }, style: { position: \"absolute\", visibility: \"hidden\", ...style }, onLoad: () => handlePreload(preload), render: {\n ...render,\n iconLoading: () => null,\n iconError: () => null,\n } })),\n current && (React.createElement(ImageSlide, { key: \"current\", ...props, slide: { ...image, src: current, srcSet: undefined }, style: style }))));\n}\n\nfunction ZoomWrapper({ render, slide, offset, rect }) {\n var _a;\n const [imageDimensions, setImageDimensions] = React.useState();\n const zoomWrapperRef = React.useRef(null);\n const { zoom, maxZoom, offsetX, offsetY, setZoomWrapper } = useZoom();\n const interactive = zoom > 1;\n const { carousel, on } = useLightboxProps();\n const { currentIndex } = useLightboxState();\n useLayoutEffect(() => {\n if (offset === 0) {\n setZoomWrapper({ zoomWrapperRef, imageDimensions });\n return () => setZoomWrapper(undefined);\n }\n return () => { };\n }, [offset, imageDimensions, setZoomWrapper]);\n let rendered = (_a = render.slide) === null || _a === void 0 ? void 0 : _a.call(render, { slide, offset, rect, zoom, maxZoom });\n if (!rendered && isImageSlide(slide)) {\n const slideProps = {\n slide,\n offset,\n rect,\n render,\n imageFit: carousel.imageFit,\n imageProps: carousel.imageProps,\n onClick: offset === 0 ? () => { var _a; return (_a = on.click) === null || _a === void 0 ? void 0 : _a.call(on, { index: currentIndex }); } : undefined,\n };\n rendered = isResponsiveImageSlide(slide) ? (React.createElement(ResponsiveImage, { ...slideProps, slide: slide, interactive: interactive, rect: offset === 0 ? { width: rect.width * zoom, height: rect.height * zoom } : rect })) : (React.createElement(ImageSlide, { onLoad: (img) => setImageDimensions({ width: img.naturalWidth, height: img.naturalHeight }), ...slideProps }));\n }\n if (!rendered)\n return null;\n return (React.createElement(\"div\", { ref: zoomWrapperRef, className: clsx(cssClass(CLASS_FULLSIZE), cssClass(CLASS_FLEX_CENTER), cssClass(CLASS_SLIDE_WRAPPER), interactive && cssClass(CLASS_SLIDE_WRAPPER_INTERACTIVE)), style: offset === 0 ? { transform: `scale(${zoom}) translateX(${offsetX}px) translateY(${offsetY}px)` } : undefined }, rendered));\n}\n\nconst Zoom = ({ augment, addModule }) => {\n augment(({ zoom: zoomProps, toolbar, render, controller, ...restProps }) => {\n const zoom = resolveZoomProps(zoomProps);\n return {\n zoom,\n toolbar: addToolbarButton(toolbar, PLUGIN_ZOOM, React.createElement(ZoomToolbarControl, null)),\n render: {\n ...render,\n slide: (props) => { var _a; return isImageSlide(props.slide) ? React.createElement(ZoomWrapper, { render: render, ...props }) : (_a = render.slide) === null || _a === void 0 ? void 0 : _a.call(render, props); },\n },\n controller: { ...controller, preventDefaultWheelY: zoom.scrollToZoom },\n ...restProps,\n };\n });\n addModule(createModule(PLUGIN_ZOOM, ZoomContextProvider));\n};\n\nexport { Zoom as default };\n","import * as React from 'react';\nimport { useLightboxState, clsx, cssClass, createModule } from '../../index.js';\nimport { MODULE_CONTROLLER, PLUGIN_COUNTER } from '../../types.js';\n\nconst defaultCounterProps = {\n separator: \"/\",\n container: {},\n};\nconst resolveCounterProps = (counter) => ({\n ...defaultCounterProps,\n ...counter,\n});\n\nfunction CounterComponent({ counter }) {\n const { slides, currentIndex } = useLightboxState();\n const { separator, container: { className, ...rest }, className: legacyClassName, ...legacyRest } = resolveCounterProps(counter);\n if (slides.length === 0)\n return null;\n return (React.createElement(\"div\", { className: clsx(cssClass(\"counter\"), className || legacyClassName), ...legacyRest, ...rest, \"aria-hidden\": true },\n currentIndex + 1,\n \" \",\n separator,\n \" \",\n slides.length));\n}\nfunction Counter({ augment, addChild }) {\n augment(({ counter, ...restProps }) => ({\n counter: resolveCounterProps(counter),\n ...restProps,\n }));\n addChild(MODULE_CONTROLLER, createModule(PLUGIN_COUNTER, CounterComponent));\n}\n\nexport { Counter as default };\n","import * as React from 'react';\nimport { makeUseContext, useLightboxState, useTimeouts, useEvents, useController, useA11yContext, useEventCallback, cleanup, createIcon, useLightboxProps, useLoseFocus, IconButton, addToolbarButton, createModule } from '../../index.js';\nimport { SLIDE_STATUS_LOADING, SLIDE_STATUS_PLAYING, ACTIVE_SLIDE_LOADING, ACTIVE_SLIDE_PLAYING, ACTIVE_SLIDE_ERROR, SLIDE_STATUS_ERROR, ACTIVE_SLIDE_COMPLETE, SLIDE_STATUS_COMPLETE, PLUGIN_SLIDESHOW } from '../../types.js';\n\nconst defaultSlideshowProps = {\n autoplay: false,\n delay: 3000,\n ref: null,\n};\nconst resolveSlideshowProps = (slideshow) => ({\n ...defaultSlideshowProps,\n ...slideshow,\n});\n\nconst SlideshowContext = React.createContext(null);\nconst useSlideshow = makeUseContext(\"useSlideshow\", \"SlideshowContext\", SlideshowContext);\nfunction SlideshowContextProvider({ slideshow, carousel: { finite }, on, children }) {\n const { autoplay, delay, ref } = resolveSlideshowProps(slideshow);\n const wasPlaying = React.useRef(autoplay);\n const [playing, setPlaying] = React.useState(autoplay);\n const scheduler = React.useRef(undefined);\n const slideStatus = React.useRef(undefined);\n const { slides, currentIndex } = useLightboxState();\n const { setTimeout, clearTimeout } = useTimeouts();\n const { subscribe } = useEvents();\n const { next } = useController();\n const { setAutoPlaying } = useA11yContext();\n React.useEffect(() => setAutoPlaying(playing), [playing, setAutoPlaying]);\n const disabled = slides.length === 0 || (finite && currentIndex === slides.length - 1);\n const play = React.useCallback(() => {\n if (!playing && !disabled) {\n setPlaying(true);\n }\n }, [playing, disabled]);\n const pause = React.useCallback(() => {\n if (playing) {\n setPlaying(false);\n }\n }, [playing]);\n const cancelScheduler = React.useCallback(() => {\n clearTimeout(scheduler.current);\n scheduler.current = undefined;\n }, [clearTimeout]);\n const scheduleNextSlide = useEventCallback(() => {\n cancelScheduler();\n if (!playing ||\n disabled ||\n slideStatus.current === SLIDE_STATUS_LOADING ||\n slideStatus.current === SLIDE_STATUS_PLAYING) {\n return;\n }\n scheduler.current = setTimeout(() => {\n if (playing) {\n slideStatus.current = undefined;\n next();\n }\n }, delay);\n });\n React.useEffect(scheduleNextSlide, [currentIndex, playing, scheduleNextSlide]);\n React.useEffect(() => {\n if (playing && disabled) {\n setPlaying(false);\n }\n }, [currentIndex, playing, disabled]);\n const onSlideshowStart = useEventCallback(() => { var _a; return (_a = on.slideshowStart) === null || _a === void 0 ? void 0 : _a.call(on); });\n const onSlideshowStop = useEventCallback(() => { var _a; return (_a = on.slideshowStop) === null || _a === void 0 ? void 0 : _a.call(on); });\n React.useEffect(() => {\n if (playing) {\n onSlideshowStart();\n }\n else if (wasPlaying.current) {\n onSlideshowStop();\n }\n wasPlaying.current = playing;\n }, [playing, onSlideshowStart, onSlideshowStop]);\n React.useEffect(() => cleanup(cancelScheduler, subscribe(ACTIVE_SLIDE_LOADING, () => {\n slideStatus.current = SLIDE_STATUS_LOADING;\n cancelScheduler();\n }), subscribe(ACTIVE_SLIDE_PLAYING, () => {\n slideStatus.current = SLIDE_STATUS_PLAYING;\n cancelScheduler();\n }), subscribe(ACTIVE_SLIDE_ERROR, () => {\n slideStatus.current = SLIDE_STATUS_ERROR;\n scheduleNextSlide();\n }), subscribe(ACTIVE_SLIDE_COMPLETE, () => {\n slideStatus.current = SLIDE_STATUS_COMPLETE;\n scheduleNextSlide();\n })), [subscribe, cancelScheduler, scheduleNextSlide]);\n const context = React.useMemo(() => ({ playing, disabled, play, pause }), [playing, disabled, play, pause]);\n React.useImperativeHandle(ref, () => context, [context]);\n return React.createElement(SlideshowContext.Provider, { value: context }, children);\n}\n\nconst PlayIcon = createIcon(\"Play\", React.createElement(\"path\", { d: \"M8 5v14l11-7z\" }));\nconst PauseIcon = createIcon(\"Pause\", React.createElement(\"path\", { d: \"M6 19h4V5H6v14zm8-14v14h4V5h-4z\" }));\nfunction SlideshowButton() {\n const { playing, disabled, play, pause } = useSlideshow();\n const { render } = useLightboxProps();\n const focusListeners = useLoseFocus(useController().focus, disabled);\n if (render.buttonSlideshow) {\n return React.createElement(React.Fragment, null, render.buttonSlideshow({ playing, disabled, play, pause }));\n }\n return (React.createElement(IconButton, { label: playing ? \"Pause\" : \"Play\", icon: playing ? PauseIcon : PlayIcon, renderIcon: playing ? render.iconSlideshowPause : render.iconSlideshowPlay, onClick: playing ? pause : play, disabled: disabled, ...focusListeners }));\n}\n\nfunction Slideshow({ augment, addModule }) {\n augment(({ slideshow, toolbar, ...restProps }) => ({\n toolbar: addToolbarButton(toolbar, PLUGIN_SLIDESHOW, React.createElement(SlideshowButton, null)),\n slideshow: resolveSlideshowProps(slideshow),\n ...restProps,\n }));\n addModule(createModule(PLUGIN_SLIDESHOW, SlideshowContextProvider));\n}\n\nexport { Slideshow as default };\n","import * as React from 'react';\nimport { makeUseContext, useDocumentContext, useLayoutEffect, cleanup, useEventCallback, clsx, cssClass, createIcon, useLightboxProps, IconButton, addToolbarButton, createModule } from '../../index.js';\nimport { PLUGIN_FULLSCREEN, CLASS_FULLSIZE, PLUGIN_THUMBNAILS, MODULE_CONTROLLER } from '../../types.js';\n\nconst defaultFullscreenProps = {\n auto: false,\n ref: null,\n};\nconst resolveFullscreenProps = (fullscreen) => ({\n ...defaultFullscreenProps,\n ...fullscreen,\n});\n\nconst FullscreenContext = React.createContext(null);\nconst useFullscreen = makeUseContext(\"useFullscreen\", \"FullscreenContext\", FullscreenContext);\nfunction FullscreenContextProvider({ fullscreen: fullscreenProps, on, children }) {\n const { auto, ref } = resolveFullscreenProps(fullscreenProps);\n const containerRef = React.useRef(null);\n const [disabled, setDisabled] = React.useState();\n const [fullscreen, setFullscreen] = React.useState(false);\n const wasFullscreen = React.useRef(false);\n const { getOwnerDocument } = useDocumentContext();\n useLayoutEffect(() => {\n var _a, _b, _c, _d;\n const ownerDocument = getOwnerDocument();\n setDisabled(!((_d = (_c = (_b = (_a = ownerDocument.fullscreenEnabled) !== null && _a !== void 0 ? _a : ownerDocument.webkitFullscreenEnabled) !== null && _b !== void 0 ? _b : ownerDocument.mozFullScreenEnabled) !== null && _c !== void 0 ? _c : ownerDocument.msFullscreenEnabled) !== null && _d !== void 0 ? _d : false));\n }, [getOwnerDocument]);\n const getFullscreenElement = React.useCallback(() => {\n var _a;\n const ownerDocument = getOwnerDocument();\n const fullscreenElement = ownerDocument.fullscreenElement ||\n ownerDocument.webkitFullscreenElement ||\n ownerDocument.mozFullScreenElement ||\n ownerDocument.msFullscreenElement;\n return ((_a = fullscreenElement === null || fullscreenElement === void 0 ? void 0 : fullscreenElement.shadowRoot) === null || _a === void 0 ? void 0 : _a.fullscreenElement) || fullscreenElement;\n }, [getOwnerDocument]);\n const enter = React.useCallback(() => {\n const container = containerRef.current;\n try {\n if (container.requestFullscreen) {\n container.requestFullscreen().catch(() => { });\n }\n else if (container.webkitRequestFullscreen) {\n container.webkitRequestFullscreen();\n }\n else if (container.mozRequestFullScreen) {\n container.mozRequestFullScreen();\n }\n else if (container.msRequestFullscreen) {\n container.msRequestFullscreen();\n }\n }\n catch (_) {\n }\n }, []);\n const exit = React.useCallback(() => {\n if (!getFullscreenElement())\n return;\n const ownerDocument = getOwnerDocument();\n try {\n if (ownerDocument.exitFullscreen) {\n ownerDocument.exitFullscreen().catch(() => { });\n }\n else if (ownerDocument.webkitExitFullscreen) {\n ownerDocument.webkitExitFullscreen();\n }\n else if (ownerDocument.mozCancelFullScreen) {\n ownerDocument.mozCancelFullScreen();\n }\n else if (ownerDocument.msExitFullscreen) {\n ownerDocument.msExitFullscreen();\n }\n }\n catch (_) {\n }\n }, [getFullscreenElement, getOwnerDocument]);\n React.useEffect(() => {\n const ownerDocument = getOwnerDocument();\n const listener = () => {\n setFullscreen(getFullscreenElement() === containerRef.current);\n };\n return cleanup(...[\"fullscreenchange\", \"webkitfullscreenchange\", \"mozfullscreenchange\", \"MSFullscreenChange\"].map((event) => {\n ownerDocument.addEventListener(event, listener);\n return () => ownerDocument.removeEventListener(event, listener);\n }));\n }, [getFullscreenElement, getOwnerDocument]);\n const onEnterFullscreen = useEventCallback(() => { var _a; return (_a = on.enterFullscreen) === null || _a === void 0 ? void 0 : _a.call(on); });\n const onExitFullscreen = useEventCallback(() => { var _a; return (_a = on.exitFullscreen) === null || _a === void 0 ? void 0 : _a.call(on); });\n React.useEffect(() => {\n if (fullscreen) {\n wasFullscreen.current = true;\n }\n if (wasFullscreen.current) {\n (fullscreen ? onEnterFullscreen : onExitFullscreen)();\n }\n }, [fullscreen, onEnterFullscreen, onExitFullscreen]);\n const handleAutoFullscreen = useEventCallback(() => {\n var _a;\n (_a = (auto ? enter : null)) === null || _a === void 0 ? void 0 : _a();\n return exit;\n });\n React.useEffect(handleAutoFullscreen, [handleAutoFullscreen]);\n const context = React.useMemo(() => ({ fullscreen, disabled, enter, exit }), [fullscreen, disabled, enter, exit]);\n React.useImperativeHandle(ref, () => context, [context]);\n return (React.createElement(\"div\", { ref: containerRef, className: clsx(cssClass(PLUGIN_FULLSCREEN), cssClass(CLASS_FULLSIZE)) },\n React.createElement(FullscreenContext.Provider, { value: context }, children)));\n}\n\nconst EnterFullscreenIcon = createIcon(\"EnterFullscreen\", React.createElement(\"path\", { d: \"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z\" }));\nconst ExitFullscreenIcon = createIcon(\"ExitFullscreen\", React.createElement(\"path\", { d: \"M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z\" }));\nfunction FullscreenButton() {\n var _a;\n const { fullscreen, disabled, enter, exit } = useFullscreen();\n const { render } = useLightboxProps();\n if (disabled)\n return null;\n if (render.buttonFullscreen) {\n return React.createElement(React.Fragment, null, (_a = render.buttonFullscreen) === null || _a === void 0 ? void 0 : _a.call(render, { fullscreen, disabled, enter, exit }));\n }\n return (React.createElement(IconButton, { disabled: disabled, label: fullscreen ? \"Exit Fullscreen\" : \"Enter Fullscreen\", icon: fullscreen ? ExitFullscreenIcon : EnterFullscreenIcon, renderIcon: fullscreen ? render.iconExitFullscreen : render.iconEnterFullscreen, onClick: fullscreen ? exit : enter }));\n}\n\nfunction Fullscreen({ augment, contains, addParent }) {\n augment(({ fullscreen, toolbar, ...restProps }) => ({\n toolbar: addToolbarButton(toolbar, PLUGIN_FULLSCREEN, React.createElement(FullscreenButton, null)),\n fullscreen: resolveFullscreenProps(fullscreen),\n ...restProps,\n }));\n addParent(contains(PLUGIN_THUMBNAILS) ? PLUGIN_THUMBNAILS : MODULE_CONTROLLER, createModule(PLUGIN_FULLSCREEN, FullscreenContextProvider));\n}\n\nexport { Fullscreen as default };\n","import * as React from 'react';\nimport { useLightboxProps, composePrefix, createIcon, ImageSlide, isImageSlide, cssClass, makeComposePrefix, useLightboxState, useDocumentContext, useEventCallback, translateSlideCounter, cssVar, clsx, getSlideKey, useRTL, useEvents, useSensors, useKeyboardNavigation, useAnimation, cleanup, calculatePreload, hasSlides, getSlide, translateLabel, makeUseContext, LightboxPropsProvider, createIconDisabled, IconButton, addToolbarButton, createModule } from '../../index.js';\nimport { PLUGIN_THUMBNAILS, ELEMENT_ICON, CLASS_FLEX_CENTER, ACTION_SWIPE, ACTION_NEXT, ACTION_PREV, PLUGIN_FULLSCREEN, MODULE_CONTROLLER } from '../../types.js';\n\nconst defaultThumbnailsProps = {\n ref: null,\n position: \"bottom\",\n width: 120,\n height: 80,\n border: 1,\n borderRadius: 4,\n padding: 4,\n gap: 16,\n imageFit: \"contain\",\n vignette: true,\n hidden: false,\n showToggle: false,\n};\nconst resolveThumbnailsProps = (thumbnails) => ({\n ...defaultThumbnailsProps,\n ...thumbnails,\n});\nfunction useThumbnailsProps() {\n const { thumbnails } = useLightboxProps();\n return resolveThumbnailsProps(thumbnails);\n}\n\nconst cssPrefix = (value) => composePrefix(PLUGIN_THUMBNAILS, value);\nconst cssThumbnailPrefix = (value) => cssPrefix(composePrefix(\"thumbnail\", value));\n\nconst VideoThumbnailIcon = createIcon(\"VideoThumbnail\", React.createElement(\"path\", { d: \"M10 16.5l6-4.5-6-4.5v9zM12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\" }));\nconst UnknownThumbnailIcon = createIcon(\"UnknownThumbnail\", React.createElement(\"path\", { d: \"M23 18V6c0-1.1-.9-2-2-2H3c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2zM8.5 12.5l2.5 3.01L14.5 11l4.5 6H5l3.5-4.5z\" }));\nfunction renderThumbnail({ slide, render, rect, imageFit }) {\n var _a;\n const customThumbnail = (_a = render.thumbnail) === null || _a === void 0 ? void 0 : _a.call(render, { slide, render, rect, imageFit });\n if (customThumbnail) {\n return customThumbnail;\n }\n const imageSlideProps = { render, rect, imageFit };\n if (slide.thumbnail) {\n return React.createElement(ImageSlide, { slide: { src: slide.thumbnail }, ...imageSlideProps });\n }\n if (isImageSlide(slide)) {\n return React.createElement(ImageSlide, { slide: slide, ...imageSlideProps });\n }\n const thumbnailIconClass = cssClass(cssThumbnailPrefix(ELEMENT_ICON));\n if (slide.type === \"video\") {\n return (React.createElement(React.Fragment, null,\n slide.poster && React.createElement(ImageSlide, { slide: { src: slide.poster }, ...imageSlideProps }),\n React.createElement(VideoThumbnailIcon, { className: thumbnailIconClass })));\n }\n return React.createElement(UnknownThumbnailIcon, { className: thumbnailIconClass });\n}\nconst activePrefix = makeComposePrefix(\"active\");\nconst fadeInPrefix = makeComposePrefix(\"fadein\");\nconst fadeOutPrefix = makeComposePrefix(\"fadeout\");\nconst placeholderPrefix = makeComposePrefix(\"placeholder\");\nconst DELAY = \"delay\";\nconst DURATION = \"duration\";\nfunction Thumbnail({ slide, index, onClick, fadeIn, fadeOut, placeholder, onLoseFocus }) {\n const ref = React.useRef(null);\n const { render, styles, labels } = useLightboxProps();\n const { slides, globalIndex } = useLightboxState();\n const { getOwnerDocument } = useDocumentContext();\n const { width, height, imageFit } = useThumbnailsProps();\n const rect = { width, height };\n const active = index === globalIndex;\n const onLoseFocusCallback = useEventCallback(onLoseFocus);\n React.useEffect(() => {\n if (fadeOut && getOwnerDocument().activeElement === ref.current) {\n onLoseFocusCallback();\n }\n }, [fadeOut, onLoseFocusCallback, getOwnerDocument]);\n return (React.createElement(\"button\", { ref: ref, type: \"button\", className: clsx(cssClass(CLASS_FLEX_CENTER), cssClass(cssThumbnailPrefix()), active && cssClass(cssThumbnailPrefix(activePrefix())), fadeIn && cssClass(cssThumbnailPrefix(fadeInPrefix())), fadeOut && cssClass(cssThumbnailPrefix(fadeOutPrefix())), placeholder && cssClass(cssThumbnailPrefix(placeholderPrefix()))), style: {\n ...(fadeIn\n ? {\n [cssVar(cssThumbnailPrefix(fadeInPrefix(DURATION)))]: `${fadeIn.duration}ms`,\n [cssVar(cssThumbnailPrefix(fadeInPrefix(DELAY)))]: `${fadeIn.delay}ms`,\n }\n : null),\n ...(fadeOut\n ? {\n [cssVar(cssThumbnailPrefix(fadeOutPrefix(DURATION)))]: `${fadeOut.duration}ms`,\n [cssVar(cssThumbnailPrefix(fadeOutPrefix(DELAY)))]: `${fadeOut.delay}ms`,\n }\n : null),\n ...styles.thumbnail,\n }, onClick: onClick, \"aria-current\": active ? true : undefined, \"aria-label\": translateSlideCounter(labels, slides, index) }, slide && renderThumbnail({ slide, render, rect, imageFit })));\n}\n\nfunction isHorizontal(position) {\n return [\"top\", \"bottom\"].includes(position);\n}\nfunction boxSize(thumbnails, dimension) {\n return dimension + 2 * (thumbnails.border + thumbnails.padding) + thumbnails.gap;\n}\nfunction getThumbnailKey(slide) {\n const { thumbnail, poster } = slide || { thumbnail: \"placeholder\" };\n return ((typeof thumbnail === \"string\" && thumbnail) ||\n (typeof poster === \"string\" && poster) ||\n (slide && getSlideKey(slide)) ||\n undefined);\n}\nfunction ThumbnailsTrack({ visible, containerRef }) {\n const track = React.useRef(null);\n const isRTL = useRTL();\n const { publish, subscribe } = useEvents();\n const { carousel, styles, labels } = useLightboxProps();\n const { slides, globalIndex, animation } = useLightboxState();\n const { registerSensors, subscribeSensors } = useSensors();\n useKeyboardNavigation(subscribeSensors);\n const thumbnails = useThumbnailsProps();\n const { position, width, height, border, borderStyle, borderColor, borderRadius, padding, gap, vignette } = thumbnails;\n const offset = ((animation === null || animation === void 0 ? void 0 : animation.duration) !== undefined && (animation === null || animation === void 0 ? void 0 : animation.increment)) || 0;\n const animationDuration = (animation === null || animation === void 0 ? void 0 : animation.duration) || 0;\n const { prepareAnimation } = useAnimation(track, (snapshot) => ({\n keyframes: isHorizontal(position)\n ? [\n {\n transform: `translateX(${(isRTL ? -1 : 1) * boxSize(thumbnails, width) * offset + snapshot}px)`,\n },\n { transform: \"translateX(0)\" },\n ]\n : [\n {\n transform: `translateY(${boxSize(thumbnails, height) * offset + snapshot}px)`,\n },\n { transform: \"translateY(0)\" },\n ],\n duration: animationDuration,\n easing: animation === null || animation === void 0 ? void 0 : animation.easing,\n }));\n const handleControllerSwipe = useEventCallback(() => {\n let animationOffset = 0;\n if (containerRef.current && track.current) {\n const containerRect = containerRef.current.getBoundingClientRect();\n const trackRect = track.current.getBoundingClientRect();\n animationOffset = isHorizontal(position)\n ? trackRect.left - containerRect.left - (containerRect.width - trackRect.width) / 2\n : trackRect.top - containerRect.top - (containerRect.height - trackRect.height) / 2;\n }\n prepareAnimation(animationOffset);\n });\n React.useEffect(() => cleanup(subscribe(ACTION_SWIPE, handleControllerSwipe)), [subscribe, handleControllerSwipe]);\n const preload = calculatePreload(carousel, slides);\n const items = [];\n if (hasSlides(slides)) {\n for (let index = globalIndex - preload - Math.abs(offset); index <= globalIndex + preload + Math.abs(offset); index += 1) {\n const placeholder = (carousel.finite && (index < 0 || index > slides.length - 1)) ||\n (offset < 0 && index < globalIndex - preload) ||\n (offset > 0 && index > globalIndex + preload);\n const slide = !placeholder ? getSlide(slides, index) : null;\n const key = [`${index}`, getThumbnailKey(slide)].filter(Boolean).join(\"|\");\n items.push({ key, index, slide });\n }\n }\n const handleClick = (slideIndex) => () => {\n if (slideIndex > globalIndex) {\n publish(ACTION_NEXT, { count: slideIndex - globalIndex });\n }\n else if (slideIndex < globalIndex) {\n publish(ACTION_PREV, { count: globalIndex - slideIndex });\n }\n };\n return (React.createElement(\"div\", { className: clsx(cssClass(cssPrefix(\"container\")), cssClass(CLASS_FLEX_CENTER)), style: {\n ...(!visible ? { display: \"none\" } : null),\n ...(width !== defaultThumbnailsProps.width ? { [cssVar(cssThumbnailPrefix(\"width\"))]: `${width}px` } : null),\n ...(height !== defaultThumbnailsProps.height\n ? { [cssVar(cssThumbnailPrefix(\"height\"))]: `${height}px` }\n : null),\n ...(border !== defaultThumbnailsProps.border\n ? { [cssVar(cssThumbnailPrefix(\"border\"))]: `${border}px` }\n : null),\n ...(borderStyle ? { [cssVar(cssThumbnailPrefix(\"border_style\"))]: borderStyle } : null),\n ...(borderColor ? { [cssVar(cssThumbnailPrefix(\"border_color\"))]: borderColor } : null),\n ...(borderRadius !== defaultThumbnailsProps.borderRadius\n ? { [cssVar(cssThumbnailPrefix(\"border_radius\"))]: `${borderRadius}px` }\n : null),\n ...(padding !== defaultThumbnailsProps.padding\n ? { [cssVar(cssThumbnailPrefix(\"padding\"))]: `${padding}px` }\n : null),\n ...(gap !== defaultThumbnailsProps.gap ? { [cssVar(cssThumbnailPrefix(\"gap\"))]: `${gap}px` } : null),\n ...styles.thumbnailsContainer,\n } },\n React.createElement(\"nav\", { ref: track, style: styles.thumbnailsTrack, className: clsx(cssClass(cssPrefix(\"track\")), cssClass(CLASS_FLEX_CENTER)), \"aria-label\": translateLabel(labels, \"Thumbnails\"), tabIndex: -1, ...registerSensors }, items.map(({ key, index, slide }) => {\n const fadeAnimationDuration = animationDuration / Math.abs(offset || 1);\n const fadeIn = (offset > 0 && index > globalIndex + preload - offset && index <= globalIndex + preload) ||\n (offset < 0 && index < globalIndex - preload - offset && index >= globalIndex - preload)\n ? {\n duration: fadeAnimationDuration,\n delay: ((offset > 0 ? index - (globalIndex + preload - offset) : globalIndex - preload - offset - index) -\n 1) *\n fadeAnimationDuration,\n }\n : undefined;\n const fadeOut = (offset > 0 && index < globalIndex - preload) || (offset < 0 && index > globalIndex + preload)\n ? {\n duration: fadeAnimationDuration,\n delay: (offset > 0\n ? offset - (globalIndex - preload - index)\n : -offset - (index - (globalIndex + preload))) * fadeAnimationDuration,\n }\n : undefined;\n return (React.createElement(Thumbnail, { key: key, index: index, slide: slide, fadeIn: fadeIn, fadeOut: fadeOut, placeholder: !slide, onClick: handleClick(index), onLoseFocus: () => { var _a; return (_a = track.current) === null || _a === void 0 ? void 0 : _a.focus(); } }));\n })),\n vignette && React.createElement(\"div\", { className: cssClass(cssPrefix(\"vignette\")) })));\n}\n\nconst ThumbnailsContext = React.createContext(null);\nconst useThumbnails = makeUseContext(\"useThumbnails\", \"ThumbnailsContext\", ThumbnailsContext);\nfunction ThumbnailsContextProvider({ children, ...props }) {\n const { ref, position, hidden } = resolveThumbnailsProps(props.thumbnails);\n const [visible, setVisible] = React.useState(!hidden);\n const containerRef = React.useRef(null);\n const context = React.useMemo(() => ({\n visible,\n show: () => setVisible(true),\n hide: () => setVisible(false),\n }), [visible]);\n React.useImperativeHandle(ref, () => context, [context]);\n return (React.createElement(LightboxPropsProvider, { ...props },\n React.createElement(ThumbnailsContext.Provider, { value: context },\n React.createElement(\"div\", { ref: containerRef, className: clsx(cssClass(cssPrefix()), cssClass(cssPrefix(`${position}`))) },\n [\"start\", \"top\"].includes(position) && React.createElement(ThumbnailsTrack, { containerRef: containerRef, visible: visible }),\n React.createElement(\"div\", { className: cssClass(cssPrefix(\"wrapper\")) }, children),\n [\"end\", \"bottom\"].includes(position) && React.createElement(ThumbnailsTrack, { containerRef: containerRef, visible: visible })))));\n}\n\nconst thumbnailsIcon = () => (React.createElement(React.Fragment, null,\n React.createElement(\"path\", { strokeWidth: 2, stroke: \"currentColor\", strokeLinejoin: \"round\", fill: \"none\", d: \"M3 5l18 0l0 14l-18 0l0-14z\" }),\n React.createElement(\"path\", { d: \"M5 14h4v3h-4zM10 14h4v3h-4zM15 14h4v3h-4z\" })));\nconst ThumbnailsVisible = createIcon(\"ThumbnailsVisible\", thumbnailsIcon());\nconst ThumbnailsHidden = createIconDisabled(\"ThumbnailsHidden\", thumbnailsIcon());\nfunction ThumbnailsButton() {\n const { visible, show, hide } = useThumbnails();\n const { render } = useLightboxProps();\n if (render.buttonThumbnails) {\n return React.createElement(React.Fragment, null, render.buttonThumbnails({ visible, show, hide }));\n }\n return (React.createElement(IconButton, { label: visible ? \"Hide thumbnails\" : \"Show thumbnails\", icon: visible ? ThumbnailsVisible : ThumbnailsHidden, renderIcon: visible ? render.iconThumbnailsVisible : render.iconThumbnailsHidden, onClick: visible ? hide : show }));\n}\n\nfunction Thumbnails({ augment, contains, append, addParent }) {\n augment(({ thumbnails: thumbnailsProps, toolbar, ...restProps }) => {\n const thumbnails = resolveThumbnailsProps(thumbnailsProps);\n return {\n toolbar: addToolbarButton(toolbar, PLUGIN_THUMBNAILS, thumbnails.showToggle ? React.createElement(ThumbnailsButton, null) : null),\n thumbnails,\n ...restProps,\n };\n });\n const module = createModule(PLUGIN_THUMBNAILS, ThumbnailsContextProvider);\n if (contains(PLUGIN_FULLSCREEN)) {\n append(PLUGIN_FULLSCREEN, module);\n }\n else {\n addParent(MODULE_CONTROLLER, module);\n }\n}\n\nexport { Thumbnails as default };\n","import React from 'react';\n\nexport interface IProps extends React.HTMLAttributes {\n className?: string;\n children?: React.ReactNode;\n style?: React.CSSProperties;\n}\n\n/**\n * I 기본 컴포넌트\n *\n * HTML 태그를 래핑한 기본 컴포넌트입니다.\n * 주로 아이콘 폰트 (FontAwesome 등)와 함께 사용됩니다.\n *\n * @example\n * ```tsx\n * \n * \n * ```\n */\nexport const I: React.FC = ({ className = '', children, style, ...props }) => {\n return (\n \n {children}\n \n );\n};","/**\n * ImageGallery 컴포넌트\n *\n * yet-another-react-lightbox 기반 이미지 갤러리 컴포넌트입니다.\n * 줌, 슬라이드쇼, 전체화면, 다운로드 기능을 지원합니다.\n *\n * @module composite/ImageGallery\n */\n\nimport React, { useState, useCallback, useEffect, useRef } from 'react';\nimport Lightbox, { Slide } from 'yet-another-react-lightbox';\nimport Zoom from 'yet-another-react-lightbox/plugins/zoom';\nimport Counter from 'yet-another-react-lightbox/plugins/counter';\nimport Slideshow from 'yet-another-react-lightbox/plugins/slideshow';\nimport Fullscreen from 'yet-another-react-lightbox/plugins/fullscreen';\nimport Thumbnails from 'yet-another-react-lightbox/plugins/thumbnails';\nimport 'yet-another-react-lightbox/styles.css';\nimport 'yet-another-react-lightbox/plugins/counter.css';\nimport 'yet-another-react-lightbox/plugins/thumbnails.css';\n\nimport { Button } from '../basic/Button';\nimport { I } from '../basic/I';\nimport { Div } from '../basic/Div';\nimport { Img } from '../basic/Img';\nimport type { EditorAttrs } from '../../types';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst G7Core = (window as any).G7Core;\n\n// G7Core.t() 번역 함수 참조\nconst t = (key: string, params?: Record) =>\n G7Core?.t?.(key, params) ?? key;\n\n// ========== Types ==========\n\nexport interface GalleryImage {\n /** 이미지 표시용 URL (라이트박스에서 보여줄 이미지) */\n src: string;\n /** 다운로드용 URL (src와 다를 수 있음, 없으면 src 사용) */\n downloadUrl?: string;\n /** 이미지 제목/캡션 */\n title?: string;\n /** 이미지 설명 */\n description?: string;\n /** 썸네일 URL (없으면 src 사용) */\n thumbnail?: string;\n /** 원본 파일명 (다운로드 시 사용) */\n filename?: string;\n /** 다운로드 시 인증된 요청이 필요한지 여부 (기본값: false) */\n downloadRequiresAuth?: boolean;\n}\n\nexport interface ImageGalleryProps {\n /** 갤러리에 표시할 이미지 배열 */\n images: GalleryImage[];\n /** 라이트박스 열기 여부 */\n isOpen: boolean;\n /** 라이트박스 닫기 콜백 */\n onClose: () => void;\n /** 시작 인덱스 (기본값: 0) */\n startIndex?: number;\n /** 줌 기능 활성화 (기본값: true) */\n enableZoom?: boolean;\n /** 슬라이드쇼 기능 활성화 (기본값: false) */\n enableSlideshow?: boolean;\n /** 전체화면 기능 활성화 (기본값: true) */\n enableFullscreen?: boolean;\n /** 이미지 카운터 표시 (기본값: true) */\n showCounter?: boolean;\n /** 다운로드 버튼 표시 (기본값: true) */\n showDownload?: boolean;\n /** 썸네일 네비게이션 표시 (기본값: true) */\n showThumbnails?: boolean;\n /** 커스텀 다운로드 핸들러 (제공 시 기본 다운로드 로직 대신 실행) */\n onDownload?: (image: GalleryImage, index: number) => void;\n /**\n * 레이아웃 편집기 주입 속성 (편집 모드 전용).\n * 본 컴포넌트는 서드파티 Lightbox 모달(`createPortal` 로 body 렌더)이라 런타임에는\n * 인라인 DOM 이 없다. 편집 모드(editorAttrs 존재)에서는 캔버스 선택·속성 편집이\n * 가능하도록 인라인 placeholder(이미지 썸네일 그리드)를 대신 렌더하고 거기에\n * editorAttrs·id 를 부착한다. 런타임(editorAttrs 미주입)은 종전 Lightbox 동작 그대로.\n *\n */\n editorAttrs?: EditorAttrs;\n\n /** DOM id 속성 (레이아웃 편집기 코어 일괄 ID — 편집 placeholder 루트에 부착) */\n id?: string;\n}\n\n// ========== Helper Functions ==========\n\n/**\n * 인증된 이미지 다운로드 (Blob으로 변환 후 다운로드)\n */\nconst downloadAuthenticatedFile = async (url: string, filename: string): Promise => {\n try {\n const blob = await G7Core.api.get(url, {\n responseType: 'blob',\n });\n\n if (blob) {\n const objectUrl = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = objectUrl;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(objectUrl);\n }\n } catch (error) {\n console.error('Failed to download file:', error);\n G7Core?.toast?.error?.(t('common.download_failed'));\n }\n};\n\n/**\n * 일반 파일 다운로드\n */\nconst downloadFile = (url: string, filename: string): void => {\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n link.target = '_blank';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n};\n\n/**\n * 이미지 다운로드 실행\n */\nexport const executeImageDownload = async (image: GalleryImage): Promise => {\n const downloadUrl = image.downloadUrl || image.src;\n const filename = image.filename || image.title || 'image';\n\n if (image.downloadRequiresAuth) {\n await downloadAuthenticatedFile(downloadUrl, filename);\n } else {\n downloadFile(downloadUrl, filename);\n }\n};\n\n// ========== Custom Download Button Component ==========\n\ninterface DownloadButtonProps {\n image: GalleryImage;\n index: number;\n onDownload?: (image: GalleryImage, index: number) => void;\n}\n\nconst DownloadButton: React.FC = ({ image, index, onDownload }) => {\n const [isDownloading, setIsDownloading] = useState(false);\n\n const handleDownload = async (e: React.MouseEvent) => {\n e.stopPropagation();\n\n if (onDownload) {\n onDownload(image, index);\n return;\n }\n\n setIsDownloading(true);\n try {\n await executeImageDownload(image);\n } finally {\n setIsDownloading(false);\n }\n };\n\n return (\n \n {isDownloading ? (\n \n ) : (\n \n )}\n \n );\n};\n\n// ========== Main Component ==========\n\nexport const ImageGallery: React.FC = ({\n images,\n isOpen,\n onClose,\n startIndex = 0,\n enableZoom = true,\n enableSlideshow = false,\n enableFullscreen = true,\n showCounter = true,\n showDownload = true,\n showThumbnails = true,\n onDownload,\n editorAttrs,\n id,\n}) => {\n // 현재 슬라이드 인덱스 (다운로드 버튼용)\n const [currentIndex, setCurrentIndex] = useState(startIndex);\n // 최신 인덱스를 ref로 추적 (클로저 문제 방지)\n const currentIndexRef = useRef(startIndex);\n\n // 이미지를 라이트박스 슬라이드 형식으로 변환 (썸네일 포함)\n const slides: Slide[] = images.map((image) => ({\n src: image.src,\n title: image.title,\n description: image.description,\n }));\n\n // 활성화할 플러그인 목록\n const plugins = [];\n if (enableZoom) plugins.push(Zoom);\n if (enableSlideshow) plugins.push(Slideshow);\n if (enableFullscreen) plugins.push(Fullscreen);\n if (showCounter) plugins.push(Counter);\n if (showThumbnails) plugins.push(Thumbnails);\n\n // 현재 이미지\n const currentImage = images[currentIndex];\n\n // currentIndex가 변경되면 ref도 업데이트\n useEffect(() => {\n currentIndexRef.current = currentIndex;\n }, [currentIndex]);\n\n // 편집 모드(편집기 캔버스) — Lightbox 모달은 인라인 DOM 이 없어 선택·편집 불가.\n // editorAttrs 가 주입되면 인라인 placeholder(썸네일 그리드)를 대신 렌더해\n // 캔버스에서 선택·속성 편집이 가능하게 한다. 런타임(editorAttrs 미주입)은 미진입.\n // (Hooks 규칙 — 모든 hook 호출 이후에 분기 return)\n if (editorAttrs) {\n const previewImages = (images ?? []).slice(0, 4);\n return (\n \n {previewImages.length > 0 ? (\n previewImages.map((image, index) => (\n \n ))\n ) : (\n
\n \n {t('editor.component.image_gallery')}\n
\n )}\n \n );\n }\n\n return (\n {\n if (index !== currentIndexRef.current) {\n setCurrentIndex(index);\n }\n },\n }}\n zoom={{\n maxZoomPixelRatio: 3,\n zoomInMultiplier: 2,\n doubleTapDelay: 300,\n doubleClickDelay: 300,\n doubleClickMaxStops: 2,\n keyboardMoveDistance: 50,\n wheelZoomDistanceFactor: 100,\n pinchZoomDistanceFactor: 100,\n scrollToZoom: true,\n }}\n carousel={{\n finite: true,\n preload: 2,\n padding: '16px',\n spacing: '30%',\n }}\n animation={{\n fade: 250,\n swipe: 500,\n easing: {\n fade: 'ease',\n swipe: 'ease-out',\n navigation: 'ease-in-out',\n },\n }}\n controller={{\n closeOnBackdropClick: true,\n closeOnPullDown: true,\n closeOnPullUp: true,\n }}\n thumbnails={{\n position: 'bottom',\n width: 120,\n height: 80,\n border: 2,\n borderRadius: 4,\n padding: 4,\n gap: 16,\n showToggle: false,\n vignette: true,\n }}\n toolbar={{\n buttons: [\n showDownload && currentImage && (\n \n ),\n 'close',\n ].filter(Boolean),\n }}\n styles={{\n container: {\n backgroundColor: 'rgba(0, 0, 0, 0.9)',\n },\n }}\n />\n );\n};\n\n// ========== Utility Hook ==========\n\n/**\n * ImageGallery를 쉽게 사용하기 위한 커스텀 훅\n *\n * @example\n * const { openGallery, galleryProps } = useImageGallery();\n *\n * // 이미지 클릭 시\n * openGallery(images, 0)} />\n *\n * // 컴포넌트 렌더링\n * \n */\nexport const useImageGallery = () => {\n const [isOpen, setIsOpen] = useState(false);\n const [images, setImages] = useState([]);\n const [startIndex, setStartIndex] = useState(0);\n\n const openGallery = useCallback((galleryImages: GalleryImage[], index = 0) => {\n setImages(galleryImages);\n setStartIndex(index);\n setIsOpen(true);\n }, []);\n\n const closeGallery = useCallback(() => {\n setIsOpen(false);\n }, []);\n\n return {\n isOpen,\n openGallery,\n closeGallery,\n galleryProps: {\n images,\n isOpen,\n onClose: closeGallery,\n startIndex,\n },\n };\n};\n\nImageGallery.displayName = 'ImageGallery';\n\nexport default ImageGallery;\n","/**\n * ProductImageViewer 컴포넌트\n *\n * 상품 상세 페이지용 이미지 뷰어입니다.\n * 메인 이미지 + 썸네일 리스트 + 라이트박스(ImageGallery) 연동을 지원합니다.\n *\n * @module composite/ProductImageViewer\n */\n\nimport React, { useState, useMemo } from 'react';\nimport { Div } from '../basic/Div';\nimport { Img } from '../basic/Img';\nimport { Button } from '../basic/Button';\nimport { Icon } from '../basic/Icon';\nimport { ImageGallery, useImageGallery, GalleryImage } from './ImageGallery';\nimport type { EditorAttrs } from '../../types';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst G7Core = (window as any).G7Core;\n\nconst t = (key: string, params?: Record) =>\n G7Core?.t?.(key, params) ?? key;\n\n// ========== Types ==========\n\nexport interface ProductImage {\n /** 이미지 ID */\n id: number;\n /** 외부 URL (CDN 등, nullable) */\n url: string | null;\n /** API 서빙 URL (항상 존재) */\n download_url: string;\n /** 현재 로케일 대체 텍스트 */\n alt_text_current?: string;\n /** 대표 이미지 여부 */\n is_thumbnail?: boolean;\n /** 정렬 순서 */\n sort_order?: number;\n}\n\nexport interface ProductImageViewerProps {\n /** 상품 이미지 배열 (API 응답 그대로) */\n images: ProductImage[];\n /** 커스텀 클래스 */\n className?: string;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\n// ========== Helper ==========\n\n/**\n * 이미지 표시용 URL 반환 (url 우선, 없으면 download_url)\n */\nconst getImageSrc = (image: ProductImage): string => {\n return image.url ?? image.download_url;\n};\n\n// ========== Main Component ==========\n\nexport const ProductImageViewer: React.FC = ({\n images = [],\n className = '',\n id,\n editorAttrs,\n}) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n const { openGallery, galleryProps } = useImageGallery();\n\n // 이미지를 ImageGallery용 형식으로 변환\n const galleryImages: GalleryImage[] = useMemo(\n () =>\n images.map((img) => ({\n src: getImageSrc(img),\n title: img.alt_text_current ?? '',\n thumbnail: getImageSrc(img),\n downloadUrl: img.download_url,\n filename: img.alt_text_current ?? `image-${img.id}`,\n })),\n [images],\n );\n\n // 이미지 없음\n if (!images || images.length === 0) {\n return (\n \n
\n \n
{t('shop.no_image')}
\n
\n \n );\n }\n\n const currentImage = images[selectedIndex] ?? images[0];\n\n return (\n
\n {/* 메인 이미지 */}\n
\n openGallery(galleryImages, selectedIndex)}\n aria-label={t('shop.view_image')}\n >\n \n \n
\n\n {/* 썸네일 리스트 (2개 이상일 때만) */}\n {images.length > 1 && (\n
\n {images.map((img, index) => (\n setSelectedIndex(index)}\n aria-label={img.alt_text_current ?? `${t('shop.image')} ${index + 1}`}\n >\n \n \n ))}\n
\n )}\n\n {/* 라이트박스 */}\n \n
\n );\n};\n\nProductImageViewer.displayName = 'ProductImageViewer';\n\nexport default ProductImageViewer;\n","/**\n * QuantitySelector 컴포넌트\n *\n * 수량 선택을 위한 +/- 버튼 컴포넌트입니다.\n * 상품 상세 페이지, 장바구니 등에서 사용됩니다.\n */\n\nimport React from 'react';\nimport { Div } from '../basic/Div';\nimport { Button } from '../basic/Button';\nimport { Input } from '../basic/Input';\nimport { Icon } from '../basic/Icon';\nimport type { EditorAttrs } from '../../types';\n\ninterface QuantitySelectorProps {\n /** 현재 수량 */\n value: number;\n /** 최소 수량 */\n min?: number;\n /** 최대 수량 */\n max?: number;\n /** 수량 변경 콜백 */\n onChange: (value: number) => void;\n /** 컴포넌트 크기 */\n size?: 'sm' | 'md' | 'lg';\n /** 비활성화 여부 */\n disabled?: boolean;\n /** 추가 CSS 클래스 */\n className?: string;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n/**\n * 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread)\n */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * 수량 선택 컴포넌트\n *\n * @example\n * ```tsx\n * const [quantity, setQuantity] = useState(1);\n *\n * \n * ```\n *\n * @example\n * ```json\n * // 레이아웃 JSON에서 사용\n * {\n * \"type\": \"composite\",\n * \"name\": \"QuantitySelector\",\n * \"props\": {\n * \"value\": \"{{item.quantity}}\",\n * \"min\": 1,\n * \"max\": \"{{item.stock}}\",\n * \"size\": \"sm\"\n * },\n * \"actions\": [{\n * \"event\": \"onChange\",\n * \"type\": \"change\",\n * \"handler\": \"updateQuantity\",\n * \"params\": { \"itemId\": \"{{item.id}}\", \"quantity\": \"{{$args[0]}}\" }\n * }]\n * }\n * ```\n */\nconst QuantitySelector: React.FC = ({\n value,\n min = 1,\n max = 999,\n onChange,\n size = 'md',\n disabled = false,\n className = '',\n id,\n editorAttrs,\n}) => {\n const sizeClasses = {\n sm: {\n container: 'h-8',\n button: 'w-8 h-8 text-sm',\n input: 'w-10 text-sm',\n },\n md: {\n container: 'h-10',\n button: 'w-10 h-10',\n input: 'w-14',\n },\n lg: {\n container: 'h-12',\n button: 'w-12 h-12 text-lg',\n input: 'w-16 text-lg',\n },\n };\n\n const classes = sizeClasses[size];\n\n const handleDecrease = () => {\n if (value > min && !disabled) {\n onChange(value - 1);\n }\n };\n\n const handleIncrease = () => {\n if (value < max && !disabled) {\n onChange(value + 1);\n }\n };\n\n const handleInputChange = (e: React.ChangeEvent) => {\n const newValue = parseInt(e.target.value, 10);\n if (!isNaN(newValue)) {\n const clampedValue = Math.max(min, Math.min(max, newValue));\n onChange(clampedValue);\n }\n };\n\n const handleInputBlur = (e: React.FocusEvent) => {\n const newValue = parseInt(e.target.value, 10);\n if (isNaN(newValue) || newValue < min) {\n onChange(min);\n } else if (newValue > max) {\n onChange(max);\n }\n };\n\n const isMinDisabled = disabled || value <= min;\n const isMaxDisabled = disabled || value >= max;\n\n return (\n \n {/* 감소 버튼 */}\n \n \n \n\n {/* 수량 입력 */}\n \n\n {/* 증가 버튼 */}\n \n \n \n \n );\n};\n\nexport default QuantitySelector;\n","/**\n * PostReactions 컴포넌트\n *\n * 게시글에 대한 리액션(이모지) 버튼 그룹입니다.\n * 좋아요, 웃겨요, 동의해요, 감사해요, 놀라워요 5종 리액션을 지원합니다.\n */\n\nimport React from 'react';\nimport { Div } from '../basic/Div';\nimport { Button } from '../basic/Button';\nimport { Span } from '../basic/Span';\nimport type { EditorAttrs } from '../../types';\n\n// Logger 설정 (G7Core 초기화 전에도 동작하도록 폴백 포함)\nconst logger = ((window as any).G7Core?.createLogger?.('Comp:PostReactions')) ?? {\n log: (...args: unknown[]) => console.log('[Comp:PostReactions]', ...args),\n warn: (...args: unknown[]) => console.warn('[Comp:PostReactions]', ...args),\n error: (...args: unknown[]) => console.error('[Comp:PostReactions]', ...args),\n};\n\n/**\n * G7Core 번역 함수\n */\nconst t = (key: string, params?: Record) =>\n (window as any).G7Core?.t?.(key, params) ?? key;\n\ntype ReactionType = 'like' | 'funny' | 'agree' | 'thanks' | 'wow';\n\ninterface ReactionCount {\n type: ReactionType;\n count: number;\n}\n\ninterface PostReactionsProps {\n /** 각 리액션별 카운트 */\n reactions: ReactionCount[];\n /** 현재 사용자의 리액션 (없으면 null) */\n userReaction?: ReactionType | null;\n /** 게시글 ID */\n postId: number;\n /** 리액션 클릭 콜백 */\n onReact?: (type: ReactionType) => void;\n /** 컴포넌트 크기 */\n size?: 'sm' | 'md' | 'lg';\n /** 추가 CSS 클래스 */\n className?: string;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\ninterface ReactionConfig {\n type: ReactionType;\n emoji: string;\n labelKey: string;\n activeColor: string;\n}\n\n/**\n * 리액션 설정\n */\nconst REACTION_CONFIGS: ReactionConfig[] = [\n { type: 'like', emoji: '👍', labelKey: 'board.reactions.like', activeColor: 'bg-blue-100 dark:bg-blue-900/30 text-blue-600 dark:text-blue-400' },\n { type: 'funny', emoji: '😂', labelKey: 'board.reactions.funny', activeColor: 'bg-yellow-100 dark:bg-yellow-900/30 text-yellow-600 dark:text-yellow-400' },\n { type: 'agree', emoji: '👌', labelKey: 'board.reactions.agree', activeColor: 'bg-green-100 dark:bg-green-900/30 text-green-600 dark:text-green-400' },\n { type: 'thanks', emoji: '🙏', labelKey: 'board.reactions.thanks', activeColor: 'bg-purple-100 dark:bg-purple-900/30 text-purple-600 dark:text-purple-400' },\n { type: 'wow', emoji: '😮', labelKey: 'board.reactions.wow', activeColor: 'bg-orange-100 dark:bg-orange-900/30 text-orange-600 dark:text-orange-400' },\n];\n\n/**\n * 게시글 리액션 컴포넌트\n *\n * @example\n * ```tsx\n * handleReact(type)}\n * />\n * ```\n *\n * @example\n * ```json\n * // 레이아웃 JSON에서 사용\n * {\n * \"type\": \"composite\",\n * \"name\": \"PostReactions\",\n * \"props\": {\n * \"reactions\": \"{{post.data.reactions}}\",\n * \"userReaction\": \"{{post.data.user_reaction}}\",\n * \"postId\": \"{{post.data.id}}\"\n * }\n * }\n * ```\n */\nconst PostReactions: React.FC = ({\n reactions,\n userReaction,\n postId,\n onReact,\n size = 'md',\n className = '',\n id,\n editorAttrs,\n}) => {\n const sizeClasses = {\n sm: 'px-2 py-1 text-xs gap-1',\n md: 'px-3 py-1.5 text-sm gap-1.5',\n lg: 'px-4 py-2 text-base gap-2',\n };\n\n const emojiSizes = {\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n };\n\n const getReactionCount = (type: ReactionType): number => {\n const reaction = reactions.find((r) => r.type === type);\n return reaction?.count ?? 0;\n };\n\n const handleClick = async (type: ReactionType) => {\n if (onReact) {\n onReact(type);\n return;\n }\n\n // 기본 API 호출\n try {\n const response = await fetch(`/api/posts/${postId}/reactions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ type }),\n credentials: 'include',\n });\n\n if (!response.ok) {\n throw new Error('리액션 처리 실패');\n }\n\n // 성공 시 페이지 새로고침 또는 상태 업데이트\n window.location.reload();\n } catch (error) {\n logger.error('리액션 오류:', error);\n }\n };\n\n return (\n
\n {REACTION_CONFIGS.map((config) => {\n const count = getReactionCount(config.type);\n const isActive = userReaction === config.type;\n\n return (\n handleClick(config.type)}\n className={`\n inline-flex items-center rounded-full border transition-colors\n ${sizeClasses[size]}\n ${isActive\n ? `${config.activeColor} border-transparent`\n : 'border-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700'\n }\n `}\n title={t(config.labelKey)}\n >\n {config.emoji}\n {t(config.labelKey)}\n {count > 0 && (\n {count}\n )}\n \n );\n })}\n
\n );\n};\n\nexport default PostReactions;\n","/**\n * RichTextEditor 컴포넌트\n *\n * 게시글 작성을 위한 리치 텍스트 에디터입니다.\n * TipTap 또는 Quill 등의 외부 라이브러리를 래핑합니다.\n *\n * @note 실제 구현 시 TipTap, Quill, CKEditor 등 선택하여 래핑\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Div } from '../basic/Div';\n\n// Logger 설정 (G7Core 초기화 전에도 동작하도록 폴백 포함)\nconst logger = ((window as any).G7Core?.createLogger?.('Comp:RichTextEditor')) ?? {\n log: (...args: unknown[]) => console.log('[Comp:RichTextEditor]', ...args),\n warn: (...args: unknown[]) => console.warn('[Comp:RichTextEditor]', ...args),\n error: (...args: unknown[]) => console.error('[Comp:RichTextEditor]', ...args),\n};\nimport { Button } from '../basic/Button';\nimport { Input } from '../basic/Input';\nimport { Textarea } from '../basic/Textarea';\nimport { H3 } from '../basic/H3';\nimport { Label } from '../basic/Label';\nimport type { EditorAttrs } from '../../types';\n\n// G7Core.t() 번역 함수 참조\nconst t = (key: string, params?: Record) =>\n (window as any).G7Core?.t?.(key, params) ?? key;\n\ninterface RichTextEditorProps {\n /** 필드 이름 */\n name: string;\n /** 초기 HTML 값 */\n initialValue?: string;\n /** 플레이스홀더 */\n placeholder?: string;\n /** 값 변경 콜백 */\n onChange?: (html: string) => void;\n /** 이미지 업로드 URL */\n imageUploadUrl?: string;\n /** 최소 높이 */\n minHeight?: string;\n /** 비활성화 여부 */\n disabled?: boolean;\n /** 추가 CSS 클래스 */\n className?: string;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n/**\n * 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread)\n */\n editorAttrs?: EditorAttrs;\n}\n\ntype FormatType =\n | 'bold'\n | 'italic'\n | 'underline'\n | 'strike'\n | 'code'\n | 'h1'\n | 'h2'\n | 'h3'\n | 'bulletList'\n | 'orderedList'\n | 'blockquote'\n | 'link'\n | 'image';\n\n/**\n * 리치 텍스트 에디터 컴포넌트\n *\n * @example\n * ```tsx\n * setContent(html)}\n * />\n * ```\n *\n * @example\n * ```json\n * // 레이아웃 JSON에서 사용\n * {\n * \"type\": \"composite\",\n * \"name\": \"RichTextEditor\",\n * \"props\": {\n * \"name\": \"content\",\n * \"placeholder\": \"$t:board.form.content_placeholder\",\n * \"initialValue\": \"{{post.data?.content ?? ''}}\"\n * }\n * }\n * ```\n */\nconst RichTextEditor: React.FC = ({\n name,\n initialValue = '',\n placeholder,\n onChange,\n imageUploadUrl = '/api/upload/image',\n minHeight = '300px',\n disabled = false,\n className = '',\n id,\n editorAttrs,\n}) => {\n const editorRef = useRef(null);\n const [content, setContent] = useState(initialValue);\n const [showCodeView, setShowCodeView] = useState(false);\n const [showLinkModal, setShowLinkModal] = useState(false);\n const [linkUrl, setLinkUrl] = useState('');\n\n // 에디터 초기화 (실제 구현 시 TipTap/Quill 초기화)\n useEffect(() => {\n // 초기값 설정 (dangerouslySetInnerHTML 대신 직접 설정)\n if (editorRef.current && !editorRef.current.innerHTML) {\n editorRef.current.innerHTML = initialValue;\n }\n }, [initialValue]);\n\n // 값 변경 시 콜백 호출\n useEffect(() => {\n if (onChange) {\n onChange(content);\n }\n }, [content, onChange]);\n\n // 포맷 적용 (실제 구현 시 에디터 API 사용)\n const applyFormat = (format: FormatType) => {\n // TODO: 에디터 라이브러리의 포맷 API 호출\n logger.log('Apply format:', format);\n };\n\n // 이미지 업로드\n const handleImageUpload = async (file: File) => {\n const formData = new FormData();\n formData.append('file', file);\n\n try {\n const response = await fetch(imageUploadUrl, {\n method: 'POST',\n body: formData,\n credentials: 'include',\n });\n\n if (!response.ok) throw new Error('업로드 실패');\n\n const data = await response.json();\n // TODO: 에디터에 이미지 삽입\n logger.log('Image uploaded:', data.url);\n } catch (error) {\n logger.error('이미지 업로드 오류:', error);\n }\n };\n\n // 파일 선택 핸들러\n const handleFileSelect = (e: React.ChangeEvent) => {\n const file = e.target.files?.[0];\n if (file) {\n handleImageUpload(file);\n }\n };\n\n // 링크 삽입\n const insertLink = () => {\n if (linkUrl) {\n // TODO: 에디터에 링크 삽입\n logger.log('Insert link:', linkUrl);\n setShowLinkModal(false);\n setLinkUrl('');\n }\n };\n\n const toolbarButtons: { format: FormatType; icon: React.ReactNode; title: string }[] = [\n { format: 'bold', icon: 'B', title: t('editor.toolbar.bold') },\n { format: 'italic', icon: 'I', title: t('editor.toolbar.italic') },\n { format: 'underline', icon: 'U', title: t('editor.toolbar.underline') },\n { format: 'strike', icon: 'S', title: t('editor.toolbar.strike') },\n { format: 'code', icon: '', title: t('editor.toolbar.code') },\n ];\n\n const headingButtons: { format: FormatType; label: string }[] = [\n { format: 'h1', label: 'H1' },\n { format: 'h2', label: 'H2' },\n { format: 'h3', label: 'H3' },\n ];\n\n const listButtons: { format: FormatType; icon: string; title: string }[] = [\n { format: 'bulletList', icon: '•', title: t('editor.toolbar.bullet_list') },\n { format: 'orderedList', icon: '1.', title: t('editor.toolbar.ordered_list') },\n { format: 'blockquote', icon: '❝', title: t('editor.toolbar.blockquote') },\n ];\n\n return (\n
\n {/* 툴바 */}\n
\n {/* 텍스트 포맷 */}\n
\n {toolbarButtons.map((btn) => (\n applyFormat(btn.format)}\n disabled={disabled}\n className=\"w-8 h-8 flex items-center justify-center text-sm font-medium text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 rounded disabled:opacity-50\"\n title={btn.title}\n >\n {btn.icon}\n \n ))}\n
\n\n {/* 제목 */}\n
\n {headingButtons.map((btn) => (\n applyFormat(btn.format)}\n disabled={disabled}\n className=\"px-2 h-8 text-sm font-medium text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 rounded disabled:opacity-50\"\n >\n {btn.label}\n \n ))}\n
\n\n {/* 리스트 */}\n
\n {listButtons.map((btn) => (\n applyFormat(btn.format)}\n disabled={disabled}\n className=\"w-8 h-8 flex items-center justify-center text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 rounded disabled:opacity-50\"\n title={btn.title}\n >\n {btn.icon}\n \n ))}\n
\n\n {/* 미디어 */}\n
\n setShowLinkModal(true)}\n disabled={disabled}\n className=\"w-8 h-8 flex items-center justify-center text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 rounded disabled:opacity-50\"\n title={t('editor.toolbar.link')}\n >\n 🔗\n \n \n
\n\n {/* 코드 보기 토글 */}\n setShowCodeView(!showCodeView)}\n disabled={disabled}\n className={`px-2 h-8 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 rounded disabled:opacity-50 ${\n showCodeView ? 'bg-gray-200 dark:bg-gray-700' : ''\n }`}\n >\n {''}\n {t('editor.toolbar.code_view')}\n \n
\n\n {/* 에디터 영역 */}\n {showCodeView ? (\n setContent(e.target.value)}\n placeholder={placeholder}\n disabled={disabled}\n className=\"w-full p-4 bg-gray-900 text-gray-100 font-mono text-sm focus:outline-none resize-none\"\n style={{ minHeight }}\n />\n ) : (\n setContent(e.currentTarget.innerHTML)}\n className=\"p-4 bg-white dark:bg-gray-900 text-gray-900 dark:text-white focus:outline-none prose dark:prose-invert max-w-none\"\n style={{ minHeight }}\n data-placeholder={placeholder}\n />\n )}\n\n {/* 숨겨진 input (폼 전송용) */}\n \n\n {/* 링크 모달 */}\n {showLinkModal && (\n
\n
\n

\n {t('editor.link_modal.title')}\n

\n setLinkUrl(e.target.value)}\n placeholder=\"https://example.com\"\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white mb-4\"\n />\n
\n {\n setShowLinkModal(false);\n setLinkUrl('');\n }}\n className=\"px-4 py-2 text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg\"\n >\n {t('common.cancel')}\n \n \n {t('editor.link_modal.insert')}\n \n
\n
\n
\n )}\n
\n );\n};\n\nexport default RichTextEditor;\n","import React, { useMemo } from 'react';\n// @ts-ignore - DOMPurify 타입 정의 없음\nimport DOMPurify from 'dompurify';\nimport { Div } from '../basic/Div';\nimport type { EditorAttrs } from '../../types';\n\nexport interface HtmlContentProps {\n /**\n * 콘텐츠 (HTML 또는 일반 텍스트)\n */\n content?: string;\n\n /**\n * 콘텐츠가 HTML 형식인지 여부\n * - true: HTML 렌더링 (DOMPurify 적용, prose 스타일)\n * - false: 일반 텍스트 (whitespace-pre-wrap으로 줄바꿈 보존)\n * @default true\n */\n isHtml?: boolean;\n\n /**\n * 사용자 정의 클래스\n */\n className?: string;\n\n /**\n * DOMPurify 설정 오버라이드 (isHtml=true일 때만 사용)\n */\n purifyConfig?: any;\n\n /**\n * 레이아웃 JSON에서 text 속성으로 전달되는 콘텐츠\n * content보다 우선순위가 높음\n */\n text?: string;\n\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n/**\n * 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread)\n */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * HtmlContent 콘텐츠 렌더링 컴포넌트\n *\n * HTML과 일반 텍스트를 안전하게 렌더링하는 범용 composite 컴포넌트입니다.\n * - isHtml=true: DOMPurify를 사용하여 XSS 공격 방지\n * - isHtml=false: 일반 텍스트로 렌더링 (줄바꿈 보존)\n *\n * @example\n * // HTML 렌더링 (기본값)\n * 안녕하세요

\" />\n *\n * // 일반 텍스트 렌더링\n * \n *\n * // 커스텀 클래스 적용\n * 게시글 내용

\"\n * className=\"prose dark:prose-invert\"\n * />\n *\n * // DOMPurify 설정 커스터마이징 (HTML 모드)\n * 내용

\"\n * purifyConfig={{ ALLOWED_TAGS: ['p', 'br', 'strong', 'em'] }}\n * />\n */\nexport const HtmlContent: React.FC = ({\n content,\n text,\n isHtml = true,\n className = '',\n purifyConfig,\n id,\n editorAttrs,\n}) => {\n // text prop이 우선순위가 높음 (레이아웃 JSON에서 사용)\n const actualContent = text ?? content ?? '';\n\n // 빈 값 처리\n if (!actualContent || actualContent.trim() === '') {\n return null;\n }\n\n // isHtml=false: 일반 텍스트 렌더링\n if (!isHtml) {\n const textClasses = `\n whitespace-pre-wrap\n text-gray-900 dark:text-gray-100\n font-sans\n ${className}\n `.trim().replace(/\\s+/g, ' ');\n\n return (\n
\n {actualContent}\n
\n );\n }\n\n // 기본 DOMPurify 설정 (FORBID 방식: 위험 태그/속성만 차단, 나머지 허용)\n const defaultConfig: any = {\n FORBID_TAGS: [\n // 스크립트 실행\n 'script', 'noscript',\n // 외부 콘텐츠 삽입\n 'iframe', 'frame', 'frameset', 'object', 'embed', 'applet', 'portal',\n // 폼 요소 (피싱 방지)\n 'form', 'input', 'textarea', 'select', 'button',\n // 메타/스타일 조작\n 'style', 'link', 'meta', 'base',\n // 구조 태그 주입\n 'body', 'head', 'html', 'title',\n // SVG/MathML (XSS 벡터)\n 'svg', 'math',\n // 미디어 이벤트 핸들러 (onerror, onloadstart)\n 'audio', 'video', 'source', 'track', 'canvas',\n // UI 오버레이/이벤트\n 'details', 'dialog',\n // HTML 파서 혼란/sanitizer 우회\n 'plaintext', 'xmp', 'listing',\n // 레거시/비표준\n 'marquee', 'noframes', 'noembed', 'template', 'slot',\n ],\n FORBID_ATTR: [\n 'onerror', 'onload', 'onclick', 'onmouseover', 'onfocus', 'onblur',\n 'ontoggle', 'oncanplay', 'onloadstart',\n 'formaction', 'xlink:href', 'action',\n ],\n ALLOW_DATA_ATTR: true,\n ADD_ATTR: ['target'],\n };\n\n // sanitize된 HTML을 메모이제이션\n const sanitizedHtml = useMemo(() => {\n const config = purifyConfig\n ? {\n ...defaultConfig,\n ...purifyConfig,\n // 보안 기본값은 항상 유지 (사용자 설정으로 덮어쓰기 방지)\n FORBID_TAGS: [...defaultConfig.FORBID_TAGS, ...(purifyConfig.FORBID_TAGS || [])],\n FORBID_ATTR: [...defaultConfig.FORBID_ATTR, ...(purifyConfig.FORBID_ATTR || [])],\n }\n : defaultConfig;\n const cleaned = DOMPurify.sanitize(actualContent, config) as unknown as string;\n\n // target=\"_blank\" 링크에 rel 속성 추가 (보안)\n return cleaned.replace(\n /]*?)href=[\"']([^\"']+)[\"']([^>]*?)>/gi,\n (match: string, before: string, href: string, after: string) => {\n if (href.startsWith('http://') || href.startsWith('https://')) {\n if (!match.includes('rel=')) {\n return ``;\n }\n }\n return match;\n }\n );\n }, [actualContent, purifyConfig]);\n\n // 컨테이너 클래스 조합\n const containerClasses = `\n prose dark:prose-invert max-w-none\n prose-p:my-2\n prose-headings:font-bold prose-headings:mt-6 prose-headings:mb-4\n prose-h1:text-2xl prose-h2:text-xl prose-h3:text-lg\n prose-a:text-blue-600 dark:prose-a:text-blue-400\n prose-a:no-underline hover:prose-a:underline\n prose-blockquote:border-l-4 prose-blockquote:border-gray-300 dark:prose-blockquote:border-gray-600\n prose-blockquote:pl-4 prose-blockquote:italic\n prose-code:bg-gray-100 dark:prose-code:bg-gray-800\n prose-code:px-1 prose-code:py-0.5 prose-code:rounded\n prose-pre:bg-gray-100 dark:prose-pre:bg-gray-800\n prose-pre:p-4 prose-pre:rounded-lg prose-pre:overflow-x-auto\n [&_table]:w-full [&_table]:border-collapse [&_table]:border [&_table]:border-gray-300\n dark:[&_table]:border-gray-600\n [&_th]:border [&_th]:border-gray-300 [&_th]:px-4 [&_th]:py-2 [&_th]:bg-gray-100 [&_th]:text-left\n dark:[&_th]:border-gray-600 dark:[&_th]:bg-gray-800\n [&_td]:border [&_td]:border-gray-300 [&_td]:px-4 [&_td]:py-2\n dark:[&_td]:border-gray-600\n [&_tr:hover]:bg-gray-50 dark:[&_tr:hover]:bg-gray-700/50\n after:content-[''] after:block after:clear-both\n ${className}\n `.trim().replace(/\\s+/g, ' ');\n\n return (\n \n );\n};\n","import React, { useCallback, useState } from 'react';\nimport { Div } from '../basic/Div';\nimport { Label } from '../basic/Label';\nimport { Button } from '../basic/Button';\nimport { Textarea } from '../basic/Textarea';\nimport { Input } from '../basic/Input';\nimport { HtmlContent } from './HtmlContent';\nimport type { EditorAttrs } from '../../types';\n\n// G7Core 참조\nconst G7Core = () => (window as any).G7Core;\n\n// G7Core.t() 번역 함수 참조\nconst t = (key: string, params?: Record) =>\n G7Core()?.t?.(key, params) ?? key;\n\nexport interface HtmlEditorProps {\n /**\n * 콘텐츠 값\n */\n content?: string;\n\n /**\n * 콘텐츠 변경 콜백\n * Form 자동 바인딩을 위해 이벤트 객체 형식으로 전달\n */\n onChange?: (event: { target: { name: string; value: string } }) => void;\n\n /**\n * HTML 모드 여부 (미리보기 버튼 표시 조건)\n * 자동 바인딩된 값을 Layout JSON에서 전달받아 사용\n */\n isHtml?: boolean;\n\n /**\n * HTML 모드 변경 콜백\n * Form 자동 바인딩을 위해 이벤트 객체 형식으로 전달\n */\n onIsHtmlChange?: (event: { target: { name: string; checked: boolean } }) => void;\n\n /**\n * Textarea 행 수\n * @default 15\n */\n rows?: number;\n\n /**\n * placeholder 텍스트\n */\n placeholder?: string;\n\n /**\n * 라벨 텍스트\n */\n label?: string;\n\n /**\n * HTML 모드 체크박스 표시 여부\n * @default true\n */\n showHtmlModeToggle?: boolean;\n\n /**\n * HtmlContent 렌더링 시 적용할 클래스\n */\n contentClassName?: string;\n\n /**\n * DOMPurify 설정 (HTML 모드)\n */\n purifyConfig?: any;\n\n /**\n * 추가 className\n */\n className?: string;\n\n /**\n * 콘텐츠 필드 name 속성\n * @default 'content'\n */\n name?: string;\n\n /**\n * HTML 모드 체크박스 name 속성\n * @default 'content_mode'\n */\n htmlFieldName?: string;\n\n /**\n * 읽기 전용 모드\n */\n readOnly?: boolean;\n\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n/**\n * 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread)\n */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * HtmlEditor 컴포넌트\n *\n * HTML과 일반 텍스트를 편집할 수 있는 범용 에디터 컴포넌트입니다.\n * - HTML 모드 체크박스는 자동 바인딩됩니다 (htmlFieldName prop 사용)\n * - HTML 모드에서는 편집/미리보기 토글 가능 (내부 상태 관리)\n * - 일반 텍스트 모드에서는 Textarea만 표시\n *\n * @example\n * // Layout JSON에서 사용 (자동 바인딩)\n * {\n * \"type\": \"composite\",\n * \"name\": \"HtmlEditor\",\n * \"props\": {\n * \"content\": \"{{_local.form?.content}}\",\n * \"name\": \"content\",\n * \"htmlFieldName\": \"content_mode\"\n * }\n * }\n */\nexport const HtmlEditor: React.FC = ({\n content = '',\n onChange,\n isHtml: isHtmlProp = false,\n onIsHtmlChange,\n rows = 15,\n placeholder = '',\n label,\n showHtmlModeToggle = true,\n contentClassName = '',\n purifyConfig,\n className = '',\n name = 'content',\n htmlFieldName = 'content_mode',\n readOnly = false,\n id,\n editorAttrs,\n}) => {\n // HTML 모드 내부 상태 (Toggle과 동기화)\n const [isHtml, setIsHtml] = useState(isHtmlProp);\n\n // 콘텐츠 내부 상태 (입력값 즉시 반영용)\n const [localContent, setLocalContent] = useState(content);\n\n // 미리보기 모드 내부 상태 (컴포넌트 자체에서 관리)\n const [previewMode, setPreviewMode] = useState(false);\n\n // Props 변경 시 내부 상태 동기화\n React.useEffect(() => {\n setIsHtml(isHtmlProp);\n }, [isHtmlProp]);\n\n // content prop 변경 시 로컬 상태 동기화\n React.useEffect(() => {\n setLocalContent(content);\n }, [content]);\n\n // 콘텐츠 변경 핸들러\n const handleContentChange = useCallback((e: React.ChangeEvent) => {\n const newContent = e.target.value;\n\n // 로컬 상태 즉시 업데이트 (입력 반응성)\n setLocalContent(newContent);\n\n // Props 콜백 호출 (G7Core.createChangeEvent 사용으로 ActionDispatcher 호환성 확보)\n if (onChange) {\n const event = G7Core()?.createChangeEvent?.({ value: newContent, name, type: 'textarea' })\n ?? { target: { name, value: newContent } };\n onChange(event);\n }\n }, [onChange, name]);\n\n // HTML 모드 변경 핸들러\n const handleHtmlModeChange = useCallback((e: React.ChangeEvent) => {\n const isHtmlMode = e.target.checked;\n\n // 로컬 상태 즉시 업데이트 (미리보기 버튼 표시용)\n setIsHtml(isHtmlMode);\n\n // HTML 모드 비활성화 시 미리보기 모드도 함께 비활성화\n if (!isHtmlMode) {\n setPreviewMode(false);\n }\n\n // Props 콜백 호출 (G7Core.createChangeEvent 사용으로 ActionDispatcher 호환성 확보)\n if (onIsHtmlChange) {\n const event = G7Core()?.createChangeEvent?.({ checked: isHtmlMode, name: htmlFieldName, type: 'checkbox' })\n ?? { target: { name: htmlFieldName, checked: isHtmlMode } };\n onIsHtmlChange(event);\n }\n }, [onIsHtmlChange, htmlFieldName]);\n\n // 미리보기 모드 토글 핸들러 (내부 상태만 변경)\n const handlePreviewModeToggle = useCallback(() => {\n setPreviewMode(prev => !prev);\n }, []);\n\n return (\n
\n {/* 라벨 및 HTML 모드 토글 */}\n
\n\n {label && (\n \n )}\n\n
\n {/* 미리보기 버튼 (HTML 모드일 때만 표시) */}\n {isHtml && !readOnly && (\n \n {previewMode ? t('common.preview_off') : t('common.preview')}\n \n )}\n\n {showHtmlModeToggle && (\n \n )}\n
\n
\n\n {/* 콘텐츠 편집 영역 */}\n {!previewMode && (\n \n )}\n\n {/* 미리보기 영역 (미리보기 모드일 때만) */}\n {previewMode && (\n
\n \n
\n )}\n\n
\n );\n};\n","import React, { useState, useRef, useEffect, useCallback } from 'react';\nimport { Div } from '../basic/Div';\nimport { Button } from '../basic/Button';\nimport { Span } from '../basic/Span';\nimport { Icon } from '../basic/Icon';\nimport type { EditorAttrs } from '../../types';\n\n/**\n * G7Core 다국어 헬퍼\n *\n * @param key 다국어 키\n * @return 번역된 문자열\n */\nconst t = (key: string): string =>\n (window as any).G7Core?.t?.(key) ?? key;\n\nexport interface ExpandableContentProps {\n /**\n * 접힌 상태의 최대 높이 (px)\n * @default 500\n */\n maxHeight?: number;\n\n /**\n * 펼치기 버튼 텍스트\n */\n expandText?: string;\n\n /**\n * 접기 버튼 텍스트\n */\n collapseText?: string;\n\n /**\n * 사용자 정의 클래스\n */\n className?: string;\n\n /**\n * children 렌더링\n */\n children?: React.ReactNode;\n\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n/**\n * 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread)\n */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * ExpandableContent 컴포넌트\n *\n * 콘텐츠가 maxHeight를 초과하면 그라데이션 오버레이와 펼치기/접기 버튼을 표시합니다.\n * 콘텐츠가 짧으면 버튼/그라데이션 없이 전체 콘텐츠를 그대로 표시합니다.\n *\n * @example\n * // 레이아웃 JSON에서 사용\n * {\n * \"type\": \"composite\",\n * \"name\": \"ExpandableContent\",\n * \"props\": { \"maxHeight\": 500 },\n * \"children\": [\n * {\n * \"type\": \"composite\",\n * \"name\": \"HtmlContent\",\n * \"props\": { \"content\": \"{{product.data?.description_localized ?? ''}}\" }\n * }\n * ]\n * }\n */\nexport const ExpandableContent: React.FC = ({\n maxHeight = 500,\n expandText,\n collapseText,\n className = '',\n children,\n id,\n editorAttrs,\n}) => {\n const [isExpanded, setIsExpanded] = useState(false);\n const [needsExpand, setNeedsExpand] = useState(false);\n const contentRef = useRef(null);\n\n /**\n * 콘텐츠 높이를 측정하여 펼치기 버튼 필요 여부를 결정합니다.\n */\n const checkHeight = useCallback(() => {\n if (contentRef.current) {\n const scrollHeight = contentRef.current.scrollHeight;\n setNeedsExpand(scrollHeight > maxHeight);\n }\n }, [maxHeight]);\n\n useEffect(() => {\n checkHeight();\n\n // 이미지 로드 후 높이 재측정\n const container = contentRef.current;\n if (!container) return;\n\n const images = container.querySelectorAll('img');\n images.forEach((img) => {\n if (!img.complete) {\n img.addEventListener('load', checkHeight);\n }\n });\n\n // ResizeObserver로 동적 콘텐츠 변경 감지\n let observer: ResizeObserver | null = null;\n if (typeof ResizeObserver !== 'undefined') {\n observer = new ResizeObserver(checkHeight);\n observer.observe(container);\n }\n\n return () => {\n images.forEach((img) => {\n img.removeEventListener('load', checkHeight);\n });\n observer?.disconnect();\n };\n }, [checkHeight, children]);\n\n const toggleExpand = () => {\n setIsExpanded((prev) => !prev);\n };\n\n const resolvedExpandText = expandText || t('sirsoft-ecommerce.shop.product.expand_detail');\n const resolvedCollapseText = collapseText || t('sirsoft-ecommerce.shop.product.collapse_detail');\n\n return (\n
\n {/* 콘텐츠 컨테이너 */}\n
\n \n {children}\n
\n\n {/* 그라데이션 오버레이 */}\n {!isExpanded && needsExpand && (\n
\n )}\n
\n\n {/* 펼치기/접기 버튼 (전체 너비 바 스타일) */}\n {needsExpand && (\n \n \n {isExpanded ? resolvedCollapseText : resolvedExpandText}\n \n \n \n )}\n
\n );\n};\n\nexport default ExpandableContent;\n","import React, { useEffect, useRef } from 'react';\nimport { Div } from '../basic/Div';\nimport { Button } from '../basic/Button';\nimport { Icon } from '../basic/Icon';\n\n// G7Core.t() 번역 함수 참조\nconst t = (key: string, params?: Record) =>\n (window as any).G7Core?.t?.(key, params) ?? key;\n\nexport interface ModalProps {\n isOpen: boolean;\n onClose: () => void;\n title?: string;\n /**\n * 타이틀 옆에 표시할 아이콘 이름 (Font Awesome)\n * @example \"lock\", \"trash\", \"warning\"\n */\n icon?: string;\n /**\n * 아이콘 색상 클래스 (Tailwind)\n * @default \"text-gray-500\"\n */\n iconClassName?: string;\n /**\n * Backdrop(오버레이) 클릭 시 모달 닫기 여부\n * @default true\n */\n closeOnBackdropClick?: boolean;\n /**\n * closeOnOverlayClick 별칭 (레이아웃 JSON 호환)\n * @default true\n */\n closeOnOverlayClick?: boolean;\n /**\n * 헤더 닫기 버튼 표시 여부\n * @default true\n */\n showCloseButton?: boolean;\n /**\n * ESC 키로 모달 닫기 허용 여부\n * @default true\n */\n closeOnEscape?: boolean;\n children?: React.ReactNode;\n width?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * Modal 집합 컴포넌트\n *\n * Div + Button 기본 컴포넌트를 조합하여 모달 UI를 구성합니다.\n * ESC 키 닫기, 포커스 트랩, 오버레이 클릭 닫기 기능을 포함합니다.\n *\n * @example\n * // 레이아웃 JSON 사용 예시\n * {\n * \"name\": \"Modal\",\n * \"props\": {\n * \"isOpen\": \"{{modals.userEdit}}\",\n * \"title\": \"사용자 편집\",\n * \"width\": \"600px\"\n * },\n * \"children\": [...]\n * }\n */\nexport const Modal: React.FC = ({\n isOpen,\n onClose,\n title,\n icon,\n iconClassName = 'text-gray-500 dark:text-gray-400',\n closeOnBackdropClick = true,\n closeOnOverlayClick,\n showCloseButton = true,\n closeOnEscape = true,\n children,\n width = '500px',\n className = '',\n style,\n}) => {\n // closeOnOverlayClick 별칭 지원 (레이아웃 JSON 호환)\n const shouldCloseOnBackdrop = closeOnOverlayClick !== undefined\n ? closeOnOverlayClick\n : closeOnBackdropClick;\n const modalRef = useRef(null);\n const previousFocusRef = useRef(null);\n\n // ESC 키로 모달 닫기\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && isOpen && closeOnEscape) {\n onClose();\n }\n };\n\n if (isOpen && closeOnEscape) {\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }\n }, [isOpen, onClose, closeOnEscape]);\n\n // 포커스 트랩\n useEffect(() => {\n if (isOpen && modalRef.current) {\n // 모달 열릴 때 현재 포커스 저장\n previousFocusRef.current = document.activeElement as HTMLElement;\n\n // 모달 내부 포커스 가능한 요소들\n const focusableElements = modalRef.current.querySelectorAll(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n\n const firstElement = focusableElements[0] as HTMLElement;\n const lastElement = focusableElements[focusableElements.length - 1] as HTMLElement;\n\n // 첫 번째 요소에 포커스\n firstElement?.focus();\n\n // Tab 키 핸들러 (포커스 트랩)\n const handleTab = (event: KeyboardEvent) => {\n if (event.key !== 'Tab') return;\n\n if (event.shiftKey) {\n // Shift + Tab\n if (document.activeElement === firstElement) {\n event.preventDefault();\n lastElement?.focus();\n }\n } else {\n // Tab\n if (document.activeElement === lastElement) {\n event.preventDefault();\n firstElement?.focus();\n }\n }\n };\n\n document.addEventListener('keydown', handleTab);\n\n return () => {\n document.removeEventListener('keydown', handleTab);\n // 모달 닫힐 때 이전 포커스 복원\n previousFocusRef.current?.focus();\n };\n }\n }, [isOpen]);\n\n // body 스크롤 방지\n useEffect(() => {\n if (isOpen) {\n document.body.style.overflow = 'hidden';\n return () => {\n document.body.style.overflow = '';\n };\n }\n }, [isOpen]);\n\n if (!isOpen) return null;\n\n // z-index를 style에서 가져오거나 기본값 50 사용\n const zIndex = style?.zIndex ?? 50;\n\n return (\n \n {/* Overlay */}\n \n\n {/* Modal Content */}\n e.stopPropagation()}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? 'modal-title' : undefined}\n >\n {/* Header */}\n {(title || icon || showCloseButton) && (\n
\n {(title || icon) && (\n \n {icon && }\n {title}\n
\n )}\n {showCloseButton && (\n \n \n \n \n \n )}\n \n )}\n\n {/* Body */}\n
\n {children}\n
\n \n \n );\n};\n","import React from 'react';\nimport { Modal } from './Modal';\nimport { Div } from '../basic/Div';\nimport { Button } from '../basic/Button';\nimport { P } from '../basic/P';\nimport { Span } from '../basic/Span';\nimport { I } from '../basic/I';\n\n// G7Core.t() 번역 함수 참조\nconst t = (key: string, params?: Record) =>\n (window as any).G7Core?.t?.(key, params) ?? key;\n\nexport interface ConfirmDialogProps {\n isOpen: boolean;\n onClose: () => void;\n title: string;\n message: string | React.ReactNode;\n confirmText?: string;\n cancelText?: string;\n onConfirm: () => void;\n onCancel?: () => void;\n confirmButtonVariant?: 'primary' | 'secondary' | 'danger' | 'ghost';\n cancelButtonVariant?: 'primary' | 'secondary' | 'danger' | 'ghost';\n width?: string;\n closeOnOverlay?: boolean;\n /** 로딩 중 여부 (확인 버튼 비활성화 및 텍스트 변경) */\n isLoading?: boolean;\n /** 로딩 중 확인 버튼에 표시할 텍스트 */\n loadingText?: string;\n}\n\n/**\n * ConfirmDialog 집합 컴포넌트\n *\n * Modal 기반 확인/취소 다이얼로그 컴포넌트.\n * 사용자에게 확인을 요청하고 확인/취소 중 하나를 선택하도록 합니다.\n *\n * 기본 컴포넌트 조합:\n * - Modal > P(message) + Button(확인) + Button(취소)\n *\n * @example\n * // 레이아웃 JSON 사용 예시\n * {\n * \"name\": \"ConfirmDialog\",\n * \"props\": {\n * \"isOpen\": \"{{dialogs.deleteConfirm}}\",\n * \"title\": \"삭제 확인\",\n * \"message\": \"정말 이 항목을 삭제하시겠습니까?\",\n * \"confirmText\": \"삭제\",\n * \"cancelText\": \"$t:common.cancel\",\n * \"confirmButtonVariant\": \"danger\"\n * }\n * }\n */\nexport const ConfirmDialog: React.FC = ({\n isOpen,\n onClose,\n title,\n message,\n confirmText,\n cancelText,\n onConfirm,\n onCancel,\n confirmButtonVariant = 'primary',\n // cancelButtonVariant는 현재 고정 스타일 사용으로 미사용\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n cancelButtonVariant: _cancelButtonVariant = 'secondary',\n width = '500px',\n // closeOnOverlay는 Modal에서 처리하므로 미사용\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n closeOnOverlay: _closeOnOverlay = true,\n isLoading = false,\n loadingText,\n}) => {\n // props로 전달된 값이 없으면 다국어 키 사용\n const resolvedConfirmText = confirmText ?? t('common.confirm');\n const resolvedCancelText = cancelText ?? t('common.cancel');\n const resolvedLoadingText = loadingText ?? t('common.loading');\n\n const handleConfirm = () => {\n onConfirm();\n };\n\n const handleCancel = () => {\n // 로딩 중에는 취소 불가\n if (isLoading) return;\n onCancel?.();\n onClose();\n };\n\n const handleClose = () => {\n // 로딩 중에는 닫기 불가\n if (isLoading) return;\n onClose();\n };\n\n // 버튼 variant별 스타일 매핑\n const confirmVariantClassMap: Record<'primary' | 'secondary' | 'danger' | 'ghost', string> = {\n primary: 'bg-blue-600 text-white hover:bg-blue-700',\n secondary: 'bg-gray-200 dark:bg-gray-700 text-gray-800 dark:text-gray-200 hover:bg-gray-300 dark:hover:bg-gray-600',\n danger: 'bg-red-600 text-white hover:bg-red-700',\n ghost: 'bg-transparent text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700',\n };\n\n return (\n \n {/* 본문 */}\n
\n {typeof message === 'string' ? (\n

{message}

\n ) : (\n message\n )}\n
\n\n {/* 푸터 (버튼 영역) */}\n
\n {/* 취소 버튼 */}\n \n {resolvedCancelText}\n \n\n {/* 확인 버튼 */}\n \n {isLoading && (\n \n )}\n {isLoading ? resolvedLoadingText : resolvedConfirmText}\n \n
\n \n );\n};\n","/**\n * FileUploader Context\n *\n * 파일 업로더의 상태와 액션을 공유하는 Context입니다.\n *\n * @module composite/FileUploader/FileUploaderContext\n */\n\nimport React, { createContext, useContext } from 'react';\nimport type { Attachment, PendingFile, ApiEndpoints } from './types';\n\n// ========== Context Types ==========\n\nexport interface FileUploaderContextValue {\n // 상태\n existingFiles: Attachment[];\n pendingFiles: PendingFile[];\n isDragOver: boolean;\n isDeleting: boolean;\n\n // 설정\n maxFiles: number;\n maxSize: number;\n accept?: string;\n endpoints: ApiEndpoints;\n confirmBeforeRemove: boolean;\n\n // 계산된 값\n totalCount: number;\n hasFiles: boolean;\n canAddMore: boolean;\n allItems: (Attachment | PendingFile)[];\n imageFiles: (Attachment | PendingFile)[];\n\n // 액션\n handleFiles: (files: FileList) => Promise;\n handleRemove: (item: PendingFile | Attachment) => Promise;\n handleRetry: (pendingFile: PendingFile) => void;\n handleUploadAll: () => Promise;\n handleOpenGallery: (item: PendingFile | Attachment) => void;\n handleDownload: (item: Attachment) => Promise;\n handleDragEnd: (event: import('@dnd-kit/core').DragEndEvent) => Promise;\n\n // 드래그 상태 설정\n setIsDragOver: (value: boolean) => void;\n\n // Input ref\n inputRef: React.RefObject;\n\n // 갤러리 상태\n galleryOpen: boolean;\n setGalleryOpen: (value: boolean) => void;\n galleryStartIndex: number;\n galleryKeyRef: React.MutableRefObject;\n\n // 삭제 확인 모달 상태\n confirmDialogOpen: boolean;\n setConfirmDialogOpen: (value: boolean) => void;\n itemToDelete: Attachment | null;\n executeRemoveAttachment: (item: Attachment) => Promise;\n\n // 인증된 이미지 URL 캐시\n authenticatedImageUrls: Map;\n}\n\n// ========== Context ==========\n\nconst FileUploaderContext = createContext(null);\n\n/**\n * FileUploader Context Provider\n */\nexport const FileUploaderProvider: React.FC<{\n value: FileUploaderContextValue;\n children: React.ReactNode;\n}> = ({ value, children }) => {\n return (\n \n {children}\n \n );\n};\n\n/**\n * FileUploader Context 사용 훅\n */\nexport const useFileUploaderContext = (): FileUploaderContextValue => {\n const context = useContext(FileUploaderContext);\n if (!context) {\n throw new Error('useFileUploaderContext must be used within FileUploaderProvider');\n }\n return context;\n};\n\nexport default FileUploaderContext;","/**\n * Browser Image Compression\n * v2.0.2\n * by Donald \n * https://github.com/Donaldcwl/browser-image-compression\n */\n\nfunction _mergeNamespaces(e,t){return t.forEach((function(t){t&&\"string\"!=typeof t&&!Array.isArray(t)&&Object.keys(t).forEach((function(r){if(\"default\"!==r&&!(r in e)){var i=Object.getOwnPropertyDescriptor(t,r);Object.defineProperty(e,r,i.get?i:{enumerable:!0,get:function(){return t[r]}})}}))})),Object.freeze(e)}function copyExifWithoutOrientation(e,t){return new Promise((function(r,i){let o;return getApp1Segment(e).then((function(e){try{return o=e,r(new Blob([t.slice(0,2),o,t.slice(2)],{type:\"image/jpeg\"}))}catch(e){return i(e)}}),i)}))}const getApp1Segment=e=>new Promise(((t,r)=>{const i=new FileReader;i.addEventListener(\"load\",(({target:{result:e}})=>{const i=new DataView(e);let o=0;if(65496!==i.getUint16(o))return r(\"not a valid JPEG\");for(o+=2;;){const a=i.getUint16(o);if(65498===a)break;const s=i.getUint16(o+2);if(65505===a&&1165519206===i.getUint32(o+4)){const a=o+10;let f;switch(i.getUint16(a)){case 18761:f=!0;break;case 19789:f=!1;break;default:return r(\"TIFF header contains invalid endian\")}if(42!==i.getUint16(a+2,f))return r(\"TIFF header contains invalid version\");const l=i.getUint32(a+4,f),c=a+l+2+12*i.getUint16(a+l,f);for(let e=a+l+2;e>>24&255,i[r+1]=o>>>16&255,i[r+2]=o>>>8&255,i[r+3]=o>>>0&255,new Uint8Array(i.buffer,0,r+4)},UZIP.deflateRaw=function(e,t){null==t&&(t={level:6});var r=new Uint8Array(50+Math.floor(1.1*e.length)),i=UZIP.F.deflateRaw(e,r,i,t.level);return new Uint8Array(r.buffer,0,i)},UZIP.encode=function(e,t){null==t&&(t=!1);var r=0,i=UZIP.bin.writeUint,o=UZIP.bin.writeUshort,a={};for(var s in e){var f=!UZIP._noNeed(s)&&!t,l=e[s],c=UZIP.crc.crc(l,0,l.length);a[s]={cpr:f,usize:l.length,crc:c,file:f?UZIP.deflateRaw(l):l}}for(var s in a)r+=a[s].file.length+30+46+2*UZIP.bin.sizeUTF8(s);r+=22;var u=new Uint8Array(r),h=0,d=[];for(var s in a){var A=a[s];d.push(h),h=UZIP._writeHeader(u,h,s,A,0)}var g=0,p=h;for(var s in a){A=a[s];d.push(h),h=UZIP._writeHeader(u,h,s,A,1,d[g++])}var m=h-p;return i(u,h,101010256),h+=4,o(u,h+=4,g),o(u,h+=2,g),i(u,h+=2,m),i(u,h+=4,p),h+=4,h+=2,u.buffer},UZIP._noNeed=function(e){var t=e.split(\".\").pop().toLowerCase();return-1!=\"png,jpg,jpeg,zip\".indexOf(t)},UZIP._writeHeader=function(e,t,r,i,o,a){var s=UZIP.bin.writeUint,f=UZIP.bin.writeUshort,l=i.file;return s(e,t,0==o?67324752:33639248),t+=4,1==o&&(t+=2),f(e,t,20),f(e,t+=2,0),f(e,t+=2,i.cpr?8:0),s(e,t+=2,0),s(e,t+=4,i.crc),s(e,t+=4,l.length),s(e,t+=4,i.usize),f(e,t+=4,UZIP.bin.sizeUTF8(r)),f(e,t+=2,0),t+=2,1==o&&(t+=2,t+=2,s(e,t+=6,a),t+=4),t+=UZIP.bin.writeUTF8(e,t,r),0==o&&(e.set(l,t),t+=l.length),t},UZIP.crc={table:function(){for(var e=new Uint32Array(256),t=0;t<256;t++){for(var r=t,i=0;i<8;i++)1&r?r=3988292384^r>>>1:r>>>=1;e[t]=r}return e}(),update:function(e,t,r,i){for(var o=0;o>>8;return e},crc:function(e,t,r){return 4294967295^UZIP.crc.update(4294967295,e,t,r)}},UZIP.adler=function(e,t,r){for(var i=1,o=0,a=t,s=t+r;a>8&255},readUint:function(e,t){return 16777216*e[t+3]+(e[t+2]<<16|e[t+1]<<8|e[t])},writeUint:function(e,t,r){e[t]=255&r,e[t+1]=r>>8&255,e[t+2]=r>>16&255,e[t+3]=r>>24&255},readASCII:function(e,t,r){for(var i=\"\",o=0;o>6,e[t+o+1]=128|s>>0&63,o+=2;else if(0==(4294901760&s))e[t+o]=224|s>>12,e[t+o+1]=128|s>>6&63,e[t+o+2]=128|s>>0&63,o+=3;else{if(0!=(4292870144&s))throw\"e\";e[t+o]=240|s>>18,e[t+o+1]=128|s>>12&63,e[t+o+2]=128|s>>6&63,e[t+o+3]=128|s>>0&63,o+=4}}return o},sizeUTF8:function(e){for(var t=e.length,r=0,i=0;i>>3}var d=a.lits,A=a.strt,g=a.prev,p=0,m=0,w=0,v=0,b=0,y=0;for(h>2&&(A[y=UZIP.F._hash(e,0)]=0),l=0;l14e3||m>26697)&&h-l>100&&(u>>16,B=65535&F;if(0!=F){B=65535&F;var U=s(_=F>>>16,a.of0);a.lhst[257+U]++;var C=s(B,a.df0);a.dhst[C]++,v+=a.exb[U]+a.dxb[C],d[p]=_<<23|l-u,d[p+1]=B<<16|U<<8|C,p+=2,u=l+_}else a.lhst[e[l]]++;m++}}for(w==l&&0!=e.length||(u>>3},UZIP.F._bestMatch=function(e,t,r,i,o,a){var s=32767&t,f=r[s],l=s-f+32768&32767;if(f==s||i!=UZIP.F._hash(e,t-l))return 0;for(var c=0,u=0,h=Math.min(32767,t);l<=h&&0!=--a&&f!=s;){if(0==c||e[t+c]==e[t+c-l]){var d=UZIP.F._howLong(e,t,l);if(d>c){if(u=l,(c=d)>=o)break;l+2A&&(A=m,f=p)}}}l+=(s=f)-(f=r[s])+32768&32767}return c<<16|u},UZIP.F._howLong=function(e,t,r){if(e[t]!=e[t-r]||e[t+1]!=e[t+1-r]||e[t+2]!=e[t+2-r])return 0;var i=t,o=Math.min(e.length,t+258);for(t+=3;t>>23,T=M+(8388607&S);M>16,H=O>>8&255,L=255&O;y(f,l=UZIP.F._writeLit(257+H,C,f,l),R-v.of0[H]),l+=v.exb[H],b(f,l=UZIP.F._writeLit(L,I,f,l),P-v.df0[L]),l+=v.dxb[L],M+=R}}l=UZIP.F._writeLit(256,C,f,l)}return l},UZIP.F._copyExact=function(e,t,r,i,o){var a=o>>>3;return i[a]=r,i[a+1]=r>>>8,i[a+2]=255-i[a],i[a+3]=255-i[a+1],a+=4,i.set(new Uint8Array(e.buffer,t,r),a),o+(r+4<<3)},UZIP.F.getTrees=function(){for(var e=UZIP.F.U,t=UZIP.F._hufTree(e.lhst,e.ltree,15),r=UZIP.F._hufTree(e.dhst,e.dtree,15),i=[],o=UZIP.F._lenCodes(e.ltree,i),a=[],s=UZIP.F._lenCodes(e.dtree,a),f=0;f4&&0==e.itree[1+(e.ordr[c-1]<<1)];)c--;return[t,r,l,o,s,c,i,a]},UZIP.F.getSecond=function(e){for(var t=[],r=0;r>1)+\",\");return t},UZIP.F.contSize=function(e,t){for(var r=0,i=0;i15&&(UZIP.F._putsE(r,i,s,f),i+=f)}return i},UZIP.F._lenCodes=function(e,t){for(var r=e.length;2!=r&&0==e[r-1];)r-=2;for(var i=0;i>>1,138))<11?t.push(17,c-3):t.push(18,c-11),i+=2*c-2}else if(o==f&&a==o&&s==o){for(l=i+5;l+2>>1,6);t.push(16,c-3),i+=2*c-2}else t.push(o,0)}return r>>>1},UZIP.F._hufTree=function(e,t,r){var i=[],o=e.length,a=t.length,s=0;for(s=0;sr&&(UZIP.F.restrictDepth(l,r,p),p=r),s=0;st;i++){var s=e[i].d;e[i].d=t,a+=o-(1<>>=r-t;a>0;){(s=e[i].d)=0;i--)e[i].d==t&&a<0&&(e[i].d--,a++);0!=a&&console.log(\"debt left\")},UZIP.F._goodIndex=function(e,t){var r=0;return t[16|r]<=e&&(r|=16),t[8|r]<=e&&(r|=8),t[4|r]<=e&&(r|=4),t[2|r]<=e&&(r|=2),t[1|r]<=e&&(r|=1),r},UZIP.F._writeLit=function(e,t,r,i){return UZIP.F._putsF(r,i,t[e<<1]),i+t[1+(e<<1)]},UZIP.F.inflate=function(e,t){var r=Uint8Array;if(3==e[0]&&0==e[1])return t||new r(0);var i=UZIP.F,o=i._bitsF,a=i._bitsE,s=i._decodeTiny,f=i.makeCodes,l=i.codes2map,c=i._get17,u=i.U,h=null==t;h&&(t=new r(e.length>>>2<<3));for(var d,A,g=0,p=0,m=0,w=0,v=0,b=0,y=0,E=0,F=0;0==g;)if(g=o(e,F,1),p=o(e,F+1,2),F+=3,0!=p){if(h&&(t=UZIP.F._check(t,E+(1<<17))),1==p&&(d=u.flmap,A=u.fdmap,b=511,y=31),2==p){m=a(e,F,5)+257,w=a(e,F+5,5)+1,v=a(e,F+10,4)+4,F+=14;for(var _=0;_<38;_+=2)u.itree[_]=0,u.itree[_+1]=0;var B=1;for(_=0;_B&&(B=U)}F+=3*v,f(u.itree,B),l(u.itree,B,u.imap),d=u.lmap,A=u.dmap,F=s(u.imap,(1<>>4;if(M>>>8==0)t[E++]=M;else{if(256==M)break;var x=E+M-254;if(M>264){var S=u.ldef[M-257];x=E+(S>>>3)+a(e,F,7&S),F+=7&S}var R=A[c(e,F)&y];F+=15&R;var T=R>>>4,O=u.ddef[T],P=(O>>>4)+o(e,F,15&O);for(F+=15&O,h&&(t=UZIP.F._check(t,E+(1<<17)));E>>3),L=e[H-4]|e[H-3]<<8;h&&(t=UZIP.F._check(t,E+L)),t.set(new r(e.buffer,e.byteOffset+H,L),E),F=H+L<<3,E+=L}return t.length==E?t:t.slice(0,E)},UZIP.F._check=function(e,t){var r=e.length;if(t<=r)return e;var i=new Uint8Array(Math.max(r<<1,t));return i.set(e,0),i},UZIP.F._decodeTiny=function(e,t,r,i,o,a){for(var s=UZIP.F._bitsE,f=UZIP.F._get17,l=0;l>>4;if(u<=15)a[l]=u,l++;else{var h=0,d=0;16==u?(d=3+s(i,o,2),o+=2,h=a[l-1]):17==u?(d=3+s(i,o,3),o+=3):18==u&&(d=11+s(i,o,7),o+=7);for(var A=l+d;l>>1;ao&&(o=f),a++}for(;a>1,f=e[a+1],l=s<<4|f,c=t-f,u=e[a]<>>15-t]=l,u++}},UZIP.F.revCodes=function(e,t){for(var r=UZIP.F.U.rev15,i=15-t,o=0;o>>i}},UZIP.F._putsE=function(e,t,r){r<<=7&t;var i=t>>>3;e[i]|=r,e[i+1]|=r>>>8},UZIP.F._putsF=function(e,t,r){r<<=7&t;var i=t>>>3;e[i]|=r,e[i+1]|=r>>>8,e[i+2]|=r>>>16},UZIP.F._bitsE=function(e,t,r){return(e[t>>>3]|e[1+(t>>>3)]<<8)>>>(7&t)&(1<>>3]|e[1+(t>>>3)]<<8|e[2+(t>>>3)]<<16)>>>(7&t)&(1<>>3]|e[1+(t>>>3)]<<8|e[2+(t>>>3)]<<16)>>>(7&t)},UZIP.F._get25=function(e,t){return(e[t>>>3]|e[1+(t>>>3)]<<8|e[2+(t>>>3)]<<16|e[3+(t>>>3)]<<24)>>>(7&t)},UZIP.F.U=(r=Uint16Array,i=Uint32Array,{next_code:new r(16),bl_count:new r(16),ordr:[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],of0:[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,999,999,999],exb:[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0],ldef:new r(32),df0:[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,65535,65535],dxb:[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0],ddef:new i(32),flmap:new r(512),fltree:[],fdmap:new r(32),fdtree:[],lmap:new r(32768),ltree:[],ttree:[],dmap:new r(32768),dtree:[],imap:new r(512),itree:[],rev15:new r(32768),lhst:new i(286),dhst:new i(30),ihst:new i(19),lits:new i(15e3),strt:new r(65536),prev:new r(32768)}),function(){for(var e=UZIP.F.U,t=0;t<32768;t++){var r=t;r=(4278255360&(r=(4042322160&(r=(3435973836&(r=(2863311530&r)>>>1|(1431655765&r)<<1))>>>2|(858993459&r)<<2))>>>4|(252645135&r)<<4))>>>8|(16711935&r)<<8,e.rev15[t]=(r>>>16|r<<16)>>>17}function pushV(e,t,r){for(;0!=t--;)e.push(0,r)}for(t=0;t<32;t++)e.ldef[t]=e.of0[t]<<3|e.exb[t],e.ddef[t]=e.df0[t]<<4|e.dxb[t];pushV(e.fltree,144,8),pushV(e.fltree,112,9),pushV(e.fltree,24,7),pushV(e.fltree,8,8),UZIP.F.makeCodes(e.fltree,9),UZIP.F.codes2map(e.fltree,9,e.flmap),UZIP.F.revCodes(e.fltree,9),pushV(e.fdtree,32,5),UZIP.F.makeCodes(e.fdtree,5),UZIP.F.codes2map(e.fdtree,5,e.fdmap),UZIP.F.revCodes(e.fdtree,5),pushV(e.itree,19,0),pushV(e.ltree,286,0),pushV(e.dtree,30,0),pushV(e.ttree,320,0)}()}();var UZIP=_mergeNamespaces({__proto__:null,default:e},[e]);const UPNG=function(){var e={nextZero(e,t){for(;0!=e[t];)t++;return t},readUshort:(e,t)=>e[t]<<8|e[t+1],writeUshort(e,t,r){e[t]=r>>8&255,e[t+1]=255&r},readUint:(e,t)=>16777216*e[t]+(e[t+1]<<16|e[t+2]<<8|e[t+3]),writeUint(e,t,r){e[t]=r>>24&255,e[t+1]=r>>16&255,e[t+2]=r>>8&255,e[t+3]=255&r},readASCII(e,t,r){let i=\"\";for(let o=0;oe.length<2?`0${e}`:e,readUTF8(t,r,i){let o,a=\"\";for(let o=0;o>3)]>>7-((7&A)<<0)&1);l[m]=e[y],l[m+1]=e[y+1],l[m+2]=e[y+2],l[m+3]=E>2)]>>6-((3&A)<<1)&3);l[m]=e[y],l[m+1]=e[y+1],l[m+2]=e[y+2],l[m+3]=E>1)]>>4-((1&A)<<2)&15);l[m]=e[y],l[m+1]=e[y+1],l[m+2]=e[y+2],l[m+3]=E>>3)]>>>7-(7&B)&1))==255*p?0:255;c[i+B]=U<<24|F<<16|F<<8|F}else if(2==h)for(B=0;B>>2)]>>>6-((3&B)<<1)&3))==85*p?0:255;c[i+B]=U<<24|F<<16|F<<8|F}else if(4==h)for(B=0;B>>1)]>>>4-((1&B)<<2)&15))==17*p?0:255;c[i+B]=U<<24|F<<16|F<<8|F}else if(8==h)for(B=0;B>3,s=Math.ceil(r*o/8),f=new Uint8Array(i*s);let l=0;const c=[0,0,4,0,2,0,1],u=[0,4,0,2,0,1,0],h=[8,8,8,4,4,2,2],d=[8,8,4,4,2,2,1];let A=0;for(;A<7;){const p=h[A],m=d[A];let w=0,v=0,b=c[A];for(;b>3])>>7-(7&i)&1,f[_*s+(t>>3)]|=g<<7-((7&t)<<0);if(2==o)g=(g=e[i>>3])>>6-(7&i)&3,f[_*s+(t>>2)]|=g<<6-((3&t)<<1);if(4==o)g=(g=e[i>>3])>>4-(7&i)&15,f[_*s+(t>>1)]|=g<<4-((1&t)<<2);if(o>=8){const r=_*s+t*a;for(let t=0;t>3)+t]}i+=o,t+=m}F++,_+=p}w*v!=0&&(l+=v*(1+E)),A+=1}return f}(r,e)),r}function _inflate(e,r){return t(new Uint8Array(e.buffer,2,e.length-6),r)}var t=function(){const e={H:{}};return e.H.N=function(t,r){const i=Uint8Array;let o,a,s=0,f=0,l=0,c=0,u=0,h=0,d=0,A=0,g=0;if(3==t[0]&&0==t[1])return r||new i(0);const p=e.H,m=p.b,w=p.e,v=p.R,b=p.n,y=p.A,E=p.Z,F=p.m,_=null==r;for(_&&(r=new i(t.length>>>2<<5));0==s;)if(s=m(t,g,1),f=m(t,g+1,2),g+=3,0!=f){if(_&&(r=e.H.W(r,A+(1<<17))),1==f&&(o=F.J,a=F.h,h=511,d=31),2==f){l=w(t,g,5)+257,c=w(t,g+5,5)+1,u=w(t,g+10,4)+4,g+=14;let e=1;for(var B=0;B<38;B+=2)F.Q[B]=0,F.Q[B+1]=0;for(B=0;Be&&(e=r)}g+=3*u,b(F.Q,e),y(F.Q,e,F.u),o=F.w,a=F.d,g=v(F.u,(1<>>4;if(i>>>8==0)r[A++]=i;else{if(256==i)break;{let e=A+i-254;if(i>264){const r=F.q[i-257];e=A+(r>>>3)+w(t,g,7&r),g+=7&r}const o=a[E(t,g)&d];g+=15&o;const s=o>>>4,f=F.c[s],l=(f>>>4)+m(t,g,15&f);for(g+=15&f;A>>3),a=t[o-4]|t[o-3]<<8;_&&(r=e.H.W(r,A+a)),r.set(new i(t.buffer,t.byteOffset+o,a),A),g=o+a<<3,A+=a}return r.length==A?r:r.slice(0,A)},e.H.W=function(e,t){const r=e.length;if(t<=r)return e;const i=new Uint8Array(r<<1);return i.set(e,0),i},e.H.R=function(t,r,i,o,a,s){const f=e.H.e,l=e.H.Z;let c=0;for(;c>>4;if(i<=15)s[c]=i,c++;else{let e=0,t=0;16==i?(t=3+f(o,a,2),a+=2,e=s[c-1]):17==i?(t=3+f(o,a,3),a+=3):18==i&&(t=11+f(o,a,7),a+=7);const r=c+t;for(;c>>1;for(;ao&&(o=r),a++}for(;a>1,s=t[e+1],f=o<<4|s,l=r-s;let c=t[e]<>>15-r]=f,c++}}},e.H.l=function(t,r){const i=e.H.m.r,o=15-r;for(let e=0;e>>o}},e.H.M=function(e,t,r){r<<=7&t;const i=t>>>3;e[i]|=r,e[i+1]|=r>>>8},e.H.I=function(e,t,r){r<<=7&t;const i=t>>>3;e[i]|=r,e[i+1]|=r>>>8,e[i+2]|=r>>>16},e.H.e=function(e,t,r){return(e[t>>>3]|e[1+(t>>>3)]<<8)>>>(7&t)&(1<>>3]|e[1+(t>>>3)]<<8|e[2+(t>>>3)]<<16)>>>(7&t)&(1<>>3]|e[1+(t>>>3)]<<8|e[2+(t>>>3)]<<16)>>>(7&t)},e.H.i=function(e,t){return(e[t>>>3]|e[1+(t>>>3)]<<8|e[2+(t>>>3)]<<16|e[3+(t>>>3)]<<24)>>>(7&t)},e.H.m=function(){const e=Uint16Array,t=Uint32Array;return{K:new e(16),j:new e(16),X:[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],S:[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,999,999,999],T:[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0],q:new e(32),p:[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,65535,65535],z:[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0],c:new t(32),J:new e(512),_:[],h:new e(32),$:[],w:new e(32768),C:[],v:[],d:new e(32768),D:[],u:new e(512),Q:[],r:new e(32768),s:new t(286),Y:new t(30),a:new t(19),t:new t(15e3),k:new e(65536),g:new e(32768)}}(),function(){const t=e.H.m;for(var r=0;r<32768;r++){let e=r;e=(2863311530&e)>>>1|(1431655765&e)<<1,e=(3435973836&e)>>>2|(858993459&e)<<2,e=(4042322160&e)>>>4|(252645135&e)<<4,e=(4278255360&e)>>>8|(16711935&e)<<8,t.r[r]=(e>>>16|e<<16)>>>17}function n(e,t,r){for(;0!=t--;)e.push(0,r)}for(r=0;r<32;r++)t.q[r]=t.S[r]<<3|t.T[r],t.c[r]=t.p[r]<<4|t.z[r];n(t._,144,8),n(t._,112,9),n(t._,24,7),n(t._,8,8),e.H.n(t._,9),e.H.A(t._,9,t.J),e.H.l(t._,9),n(t.$,32,5),e.H.n(t.$,5),e.H.A(t.$,5,t.h),e.H.l(t.$,5),n(t.Q,19,0),n(t.C,286,0),n(t.D,30,0),n(t.v,320,0)}(),e.H.N}();function _getBPP(e){return[1,null,3,1,2,null,4][e.ctype]*e.depth}function _filterZero(e,t,r,i,o){let a=_getBPP(t);const s=Math.ceil(i*a/8);let f,l;a=Math.ceil(a/8);let c=e[r],u=0;if(c>1&&(e[r]=[0,0,1][c-2]),3==c)for(u=a;u>>1)&255;for(let t=0;t>>1);for(;u>>1)}else{for(;u=0&&f>=0?(h=r*t+a<<2,d=(f+r)*o+s+a<<2):(h=(-f+r)*t-s+a<<2,d=r*o+a<<2),0==l)i[d]=e[h],i[d+1]=e[h+1],i[d+2]=e[h+2],i[d+3]=e[h+3];else if(1==l){var A=e[h+3]*(1/255),g=e[h]*A,p=e[h+1]*A,m=e[h+2]*A,w=i[d+3]*(1/255),v=i[d]*w,b=i[d+1]*w,y=i[d+2]*w;const t=1-A,r=A+w*t,o=0==r?0:1/r;i[d+3]=255*r,i[d+0]=(g+v*t)*o,i[d+1]=(p+b*t)*o,i[d+2]=(m+y*t)*o}else if(2==l){A=e[h+3],g=e[h],p=e[h+1],m=e[h+2],w=i[d+3],v=i[d],b=i[d+1],y=i[d+2];A==w&&g==v&&p==b&&m==y?(i[d]=0,i[d+1]=0,i[d+2]=0,i[d+3]=0):(i[d]=g,i[d+1]=p,i[d+2]=m,i[d+3]=A)}else if(3==l){A=e[h+3],g=e[h],p=e[h+1],m=e[h+2],w=i[d+3],v=i[d],b=i[d+1],y=i[d+2];if(A==w&&g==v&&p==b&&m==y)continue;if(A<220&&w>20)return!1}return!0}return{decode:function decode(r){const i=new Uint8Array(r);let o=8;const a=e,s=a.readUshort,f=a.readUint,l={tabs:{},frames:[]},c=new Uint8Array(i.length);let u,h=0,d=0;const A=[137,80,78,71,13,10,26,10];for(var g=0;g<8;g++)if(i[g]!=A[g])throw\"The input is not a PNG file!\";for(;o>>1:r>>>=1;e[t]=r}return e}(),update(e,t,r,o){for(let a=0;a>>8;return e},crc:(e,t,r)=>4294967295^i.update(4294967295,e,t,r)};function addErr(e,t,r,i){t[r]+=e[0]*i>>4,t[r+1]+=e[1]*i>>4,t[r+2]+=e[2]*i>>4,t[r+3]+=e[3]*i>>4}function N(e){return Math.max(0,Math.min(255,e))}function D(e,t){const r=e[0]-t[0],i=e[1]-t[1],o=e[2]-t[2],a=e[3]-t[3];return r*r+i*i+o*o+a*a}function dither(e,t,r,i,o,a,s){null==s&&(s=1);const f=i.length,l=[];for(var c=0;c>>0&255,e>>>8&255,e>>>16&255,e>>>24&255])}for(c=0;c>2]=u,A[c>>2]=i[u]}}function _main(e,r,o,a,s){null==s&&(s={});const{crc:f}=i,l=t.writeUint,c=t.writeUshort,u=t.writeASCII;let h=8;const d=e.frames.length>1;let A,g=!1,p=33+(d?20:0);if(null!=s.sRGB&&(p+=13),null!=s.pHYs&&(p+=21),null!=s.iCCP&&(A=pako.deflate(s.iCCP),p+=21+A.length+4),3==e.ctype){for(var m=e.plte.length,w=0;w>>24!=255&&(g=!0);p+=8+3*m+4+(g?8+1*m+4:0)}for(var v=0;v>>8&255,a=r>>>16&255;b[h+t+0]=i,b[h+t+1]=o,b[h+t+2]=a}if(h+=3*m,l(b,h,f(b,h-3*m-4,3*m+4)),h+=4,g){l(b,h,m),h+=4,u(b,h,\"tRNS\"),h+=4;for(w=0;w>>24&255;h+=m,l(b,h,f(b,h-m-4,m+4)),h+=4}}let E=0;for(v=0;vc&&(c=t),eh&&(h=e))}-1==c&&(s=f=c=h=0),a&&(1==(1&s)&&s--,1==(1&f)&&f--);const v=(c-s+1)*(h-f+1);v>2,e>>2);F.push(_);const t=new Uint8Array(r.abuf,i,e);h&&dither(B.img,B.rect.width,B.rect.height,E,t,_),B.img.set(t),i+=e}}else for(p=0;pU&&t==e[w-U])_[w]=_[w-U];else{let e=y[t];if(null==e&&(y[t]=e=E.length,E.push(t),E.length>=300))break;_[w]=e}}}const C=E.length;C<=256&&0==u&&(A=C<=2?1:C<=4?2:C<=16?4:8,A=Math.max(A,c));for(p=0;p>1)]|=o[e+Q]<<4-4*(1&Q);else if(2==A)for(Q=0;Q>2)]|=o[e+Q]<<6-2*(3&Q);else if(1==A)for(Q=0;Q>3)]|=o[e+Q]<<7-1*(7&Q)}t=I,d=3,i=1}else if(0==v&&1==b.length){I=new Uint8Array(U*e*3);const o=U*e;for(w=0;ww&&(w=i),fv&&(v=f))}-1==w&&(p=m=w=v=0),f&&(1==(1&p)&&p--,1==(1&m)&&m--),s={x:p,y:m,width:w-p+1,height:v-m+1};const b=o[a];b.rect=s,b.blend=1,b.img=new Uint8Array(s.width*s.height*4),0==o[a-1].dispose?(e(u,r,i,b.img,s.width,s.height,-s.x,-s.y,0),_prepareDiff(A,r,i,b.img,s)):e(A,r,i,b.img,s.width,s.height,-s.x,-s.y,0)}function _prepareDiff(t,r,i,o,a){e(t,r,i,o,a.width,a.height,-a.x,-a.y,2)}function _filterZero(e,t,r,i,o,a,s){const f=[];let l,c=[0,1,2,3,4];-1!=a?c=[a]:(t*i>5e5||1==r)&&(c=[0]),s&&(l={level:0});const u=UZIP;for(var h=0;h>1)+256&255;if(4==s)for(c=a;c>1)&255;for(c=a;c>1)&255}if(4==s){for(c=0;c>2);let u;if(r.length<2e7)for(var h=0;h>2]=u.ind,o[h>>2]=u.est.rgba}else for(h=0;h>2]=u.ind,o[h>>2]=u.est.rgba}return{abuf:i.buffer,inds:c,plte:f}}function getKDtree(e,t,r){null==r&&(r=1e-4);const i=new Uint32Array(e.buffer),o={i0:0,i1:e.length,bst:null,est:null,tdst:0,left:null,right:null};o.bst=stats(e,o.i0,o.i1),o.est=estats(o.bst);const a=[o];for(;a.lengtht&&(t=a[s].est.L,o=s);if(t=l||f.i1<=l){f.est.L=0;continue}const c={i0:f.i0,i1:l,bst:null,est:null,tdst:0,left:null,right:null};c.bst=stats(e,c.i0,c.i1),c.est=estats(c.bst);const u={i0:l,i1:f.i1,bst:null,est:null,tdst:0,left:null,right:null};u.bst={R:[],m:[],N:f.bst.N-c.bst.N};for(s=0;s<16;s++)u.bst.R[s]=f.bst.R[s]-c.bst.R[s];for(s=0;s<4;s++)u.bst.m[s]=f.bst.m[s]-c.bst.m[s];u.est=estats(u.bst),f.left=c,f.right=u,a[o]=c,a.push(u)}a.sort(((e,t)=>t.bst.N-e.bst.N));for(s=0;s0&&(s=e.right,f=e.left);const l=getNearest(s,t,r,i,o);if(l.tdst<=a*a)return l;const c=getNearest(f,t,r,i,o);return c.tdsta;)i-=4;if(r>=i)break;const s=t[r>>2];t[r>>2]=t[i>>2],t[i>>2]=s,r+=4,i-=4}for(;vecDot(e,r,o)>a;)r-=4;return r+4}function vecDot(e,t,r){return e[t]*r[0]+e[t+1]*r[1]+e[t+2]*r[2]+e[t+3]*r[3]}function stats(e,t,r){const i=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],o=[0,0,0,0],a=r-t>>2;for(let a=t;a>>0}}var o={multVec:(e,t)=>[e[0]*t[0]+e[1]*t[1]+e[2]*t[2]+e[3]*t[3],e[4]*t[0]+e[5]*t[1]+e[6]*t[2]+e[7]*t[3],e[8]*t[0]+e[9]*t[1]+e[10]*t[2]+e[11]*t[3],e[12]*t[0]+e[13]*t[1]+e[14]*t[2]+e[15]*t[3]],dot:(e,t)=>e[0]*t[0]+e[1]*t[1]+e[2]*t[2]+e[3]*t[3],sml:(e,t)=>[e*t[0],e*t[1],e*t[2],e*t[3]]};UPNG.encode=function encode(e,t,r,i,o,a,s){null==i&&(i=0),null==s&&(s=!1);const f=compress(e,t,r,i,[!1,!1,!1,0,s,!1]);return compressPNG(f,-1),_main(f,t,r,o,a)},UPNG.encodeLL=function encodeLL(e,t,r,i,o,a,s,f){const l={ctype:0+(1==i?0:2)+(0==o?0:4),depth:a,frames:[]},c=(i+o)*a,u=c*t;for(let i=0;i>>0),set16(1),set16(32),set32(3),set32(c),set32(2835),set32(2835),seek(8),set32(16711680),set32(65280),set32(255),set32(4278190080),set32(1466527264),function convert(){for(;b0;){for(w=122+b*l,g=0;g>>24,d.setUint32(w+g,p<<8|m),g+=4;b++}E{t(new Blob([e],{type:\"image/bmp\"}))}))},_dly:9};var i={CHROME:\"CHROME\",FIREFOX:\"FIREFOX\",DESKTOP_SAFARI:\"DESKTOP_SAFARI\",IE:\"IE\",IOS:\"IOS\",ETC:\"ETC\"},o={[i.CHROME]:16384,[i.FIREFOX]:11180,[i.DESKTOP_SAFARI]:16384,[i.IE]:8192,[i.IOS]:4096,[i.ETC]:8192};const a=\"undefined\"!=typeof window,s=\"undefined\"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope,f=a&&window.cordova&&window.cordova.require&&window.cordova.require(\"cordova/modulemapper\"),CustomFile=(a||s)&&(f&&f.getOriginalSymbol(window,\"File\")||\"undefined\"!=typeof File&&File),CustomFileReader=(a||s)&&(f&&f.getOriginalSymbol(window,\"FileReader\")||\"undefined\"!=typeof FileReader&&FileReader);function getFilefromDataUrl(e,t,r=Date.now()){return new Promise((i=>{const o=e.split(\",\"),a=o[0].match(/:(.*?);/)[1],s=globalThis.atob(o[1]);let f=s.length;const l=new Uint8Array(f);for(;f--;)l[f]=s.charCodeAt(f);const c=new Blob([l],{type:a});c.name=t,c.lastModified=r,i(c)}))}function getDataUrlFromFile(e){return new Promise(((t,r)=>{const i=new CustomFileReader;i.onload=()=>t(i.result),i.onerror=e=>r(e),i.readAsDataURL(e)}))}function loadImage(e){return new Promise(((t,r)=>{const i=new Image;i.onload=()=>t(i),i.onerror=e=>r(e),i.src=e}))}function getBrowserName(){if(void 0!==getBrowserName.cachedResult)return getBrowserName.cachedResult;let e=i.ETC;const{userAgent:t}=navigator;return/Chrom(e|ium)/i.test(t)?e=i.CHROME:/iP(ad|od|hone)/i.test(t)&&/WebKit/i.test(t)?e=i.IOS:/Safari/i.test(t)?e=i.DESKTOP_SAFARI:/Firefox/i.test(t)?e=i.FIREFOX:(/MSIE/i.test(t)||!0==!!document.documentMode)&&(e=i.IE),getBrowserName.cachedResult=e,getBrowserName.cachedResult}function approximateBelowMaximumCanvasSizeOfBrowser(e,t){const r=getBrowserName(),i=o[r];let a=e,s=t,f=a*s;const l=a>s?s/a:a/s;for(;f>i*i;){const e=(i+a)/2,t=(i+s)/2;er.toBlob(e,t))).then(function(e){try{return l=e,l.name=i,l.lastModified=o,$If_5.call(this)}catch(e){return f(e)}}.bind(this),f);{if(\"function\"==typeof OffscreenCanvas&&e instanceof OffscreenCanvas)return e.convertToBlob({type:t,quality:a}).then(function(e){try{return l=e,l.name=i,l.lastModified=o,$If_6.call(this)}catch(e){return f(e)}}.bind(this),f);{let d;return d=e.toDataURL(t,a),getFilefromDataUrl(d,i,o).then(function(e){try{return l=e,$If_6.call(this)}catch(e){return f(e)}}.bind(this),f)}function $If_6(){return $If_5.call(this)}}function $If_5(){return $If_4.call(this)}}function $If_4(){return s(l)}}))}function cleanupCanvasMemory(e){e.width=0,e.height=0}function isAutoOrientationInBrowser(){return new Promise((function(e,t){let r,i,o,a,s;return void 0!==isAutoOrientationInBrowser.cachedResult?e(isAutoOrientationInBrowser.cachedResult):(r=\"data:image/jpeg;base64,/9j/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAYAAAAAAAD/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/AABEIAAEAAgMBEQACEQEDEQH/xABKAAEAAAAAAAAAAAAAAAAAAAALEAEAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAAAAAAAEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwA/8H//2Q==\",getFilefromDataUrl(\"data:image/jpeg;base64,/9j/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAYAAAAAAAD/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/AABEIAAEAAgMBEQACEQEDEQH/xABKAAEAAAAAAAAAAAAAAAAAAAALEAEAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAAAAAAAEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwA/8H//2Q==\",\"test.jpg\",Date.now()).then((function(r){try{return i=r,drawFileInCanvas(i).then((function(r){try{return o=r[1],canvasToFile(o,i.type,i.name,i.lastModified).then((function(r){try{return a=r,cleanupCanvasMemory(o),drawFileInCanvas(a).then((function(r){try{return s=r[0],isAutoOrientationInBrowser.cachedResult=1===s.width&&2===s.height,e(isAutoOrientationInBrowser.cachedResult)}catch(e){return t(e)}}),t)}catch(e){return t(e)}}),t)}catch(e){return t(e)}}),t)}catch(e){return t(e)}}),t))}))}function getExifOrientation(e){return new Promise(((t,r)=>{const i=new CustomFileReader;i.onload=e=>{const r=new DataView(e.target.result);if(65496!=r.getUint16(0,!1))return t(-2);const i=r.byteLength;let o=2;for(;or(e),i.readAsArrayBuffer(e)}))}function handleMaxWidthOrHeight(e,t){const{width:r}=e,{height:i}=e,{maxWidthOrHeight:o}=t;let a,s=e;return isFinite(o)&&(r>o||i>o)&&([s,a]=getNewCanvasAndCtx(r,i),r>i?(s.width=o,s.height=i/r*o):(s.width=r/i*o,s.height=o),a.drawImage(e,0,0,s.width,s.height),cleanupCanvasMemory(e)),s}function followExifOrientation(e,t){const{width:r}=e,{height:i}=e,[o,a]=getNewCanvasAndCtx(r,i);switch(t>4&&t<9?(o.width=i,o.height=r):(o.width=r,o.height=i),t){case 2:a.transform(-1,0,0,1,r,0);break;case 3:a.transform(-1,0,0,-1,r,i);break;case 4:a.transform(1,0,0,-1,0,i);break;case 5:a.transform(0,1,1,0,0,0);break;case 6:a.transform(0,1,-1,0,i,0);break;case 7:a.transform(0,-1,-1,0,i,r);break;case 8:a.transform(0,-1,1,0,0,r)}return a.drawImage(e,0,0,r,i),cleanupCanvasMemory(e),o}function compress(e,t,r=0){return new Promise((function(i,o){let a,s,f,l,c,u,h,d,A,g,p,m,w,v,b,y,E,F,_,B;function incProgress(e=5){if(t.signal&&t.signal.aborted)throw t.signal.reason;a+=e,t.onProgress(Math.min(a,100))}function setProgress(e){if(t.signal&&t.signal.aborted)throw t.signal.reason;a=Math.min(Math.max(e,a),100),t.onProgress(a)}return a=r,s=t.maxIteration||10,f=1024*t.maxSizeMB*1024,incProgress(),drawFileInCanvas(e,t).then(function(r){try{return[,l]=r,incProgress(),c=handleMaxWidthOrHeight(l,t),incProgress(),new Promise((function(r,i){var o;if(!(o=t.exifOrientation))return getExifOrientation(e).then(function(e){try{return o=e,$If_2.call(this)}catch(e){return i(e)}}.bind(this),i);function $If_2(){return r(o)}return $If_2.call(this)})).then(function(r){try{return u=r,incProgress(),isAutoOrientationInBrowser().then(function(r){try{return h=r?c:followExifOrientation(c,u),incProgress(),d=t.initialQuality||1,A=t.fileType||e.type,canvasToFile(h,A,e.name,e.lastModified,d).then(function(r){try{{if(g=r,incProgress(),p=g.size>f,m=g.size>e.size,!p&&!m)return setProgress(100),i(g);var a;function $Loop_3(){if(s--&&(b>f||b>w)){let t,r;return t=B?.95*_.width:_.width,r=B?.95*_.height:_.height,[E,F]=getNewCanvasAndCtx(t,r),F.drawImage(_,0,0,t,r),d*=\"image/png\"===A?.85:.95,canvasToFile(E,A,e.name,e.lastModified,d).then((function(e){try{return y=e,cleanupCanvasMemory(_),_=E,b=y.size,setProgress(Math.min(99,Math.floor((v-b)/(v-f)*100))),$Loop_3}catch(e){return o(e)}}),o)}return[1]}return w=e.size,v=g.size,b=v,_=h,B=!t.alwaysKeepResolution&&p,(a=function(e){for(;e;){if(e.then)return void e.then(a,o);try{if(e.pop){if(e.length)return e.pop()?$Loop_3_exit.call(this):e;e=$Loop_3}else e=e.call(this)}catch(e){return o(e)}}}.bind(this))($Loop_3);function $Loop_3_exit(){return cleanupCanvasMemory(_),cleanupCanvasMemory(E),cleanupCanvasMemory(c),cleanupCanvasMemory(h),cleanupCanvasMemory(l),setProgress(100),i(y)}}}catch(u){return o(u)}}.bind(this),o)}catch(e){return o(e)}}.bind(this),o)}catch(e){return o(e)}}.bind(this),o)}catch(e){return o(e)}}.bind(this),o)}))}const l=\"\\nlet scriptImported = false\\nself.addEventListener('message', async (e) => {\\n const { file, id, imageCompressionLibUrl, options } = e.data\\n options.onProgress = (progress) => self.postMessage({ progress, id })\\n try {\\n if (!scriptImported) {\\n // console.log('[worker] importScripts', imageCompressionLibUrl)\\n self.importScripts(imageCompressionLibUrl)\\n scriptImported = true\\n }\\n // console.log('[worker] self', self)\\n const compressedFile = await imageCompression(file, options)\\n self.postMessage({ file: compressedFile, id })\\n } catch (e) {\\n // console.error('[worker] error', e)\\n self.postMessage({ error: e.message + '\\\\n' + e.stack, id })\\n }\\n})\\n\";let c;function compressOnWebWorker(e,t){return new Promise(((r,i)=>{c||(c=function createWorkerScriptURL(e){const t=[];return\"function\"==typeof e?t.push(`(${e})()`):t.push(e),URL.createObjectURL(new Blob(t))}(l));const o=new Worker(c);o.addEventListener(\"message\",(function handler(e){if(t.signal&&t.signal.aborted)o.terminate();else if(void 0===e.data.progress){if(e.data.error)return i(new Error(e.data.error)),void o.terminate();r(e.data.file),o.terminate()}else t.onProgress(e.data.progress)})),o.addEventListener(\"error\",i),t.signal&&t.signal.addEventListener(\"abort\",(()=>{i(t.signal.reason),o.terminate()})),o.postMessage({file:e,imageCompressionLibUrl:t.libURL,options:{...t,onProgress:void 0,signal:void 0}})}))}function imageCompression(e,t){return new Promise((function(r,i){let o,a,s,f,l,c;if(o={...t},s=0,({onProgress:f}=o),o.maxSizeMB=o.maxSizeMB||Number.POSITIVE_INFINITY,l=\"boolean\"!=typeof o.useWebWorker||o.useWebWorker,delete o.useWebWorker,o.onProgress=e=>{s=e,\"function\"==typeof f&&f(s)},!(e instanceof Blob||e instanceof CustomFile))return i(new Error(\"The file given is not an instance of Blob or File\"));if(!/^image/.test(e.type))return i(new Error(\"The file given is not an image\"));if(c=\"undefined\"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope,!l||\"function\"!=typeof Worker||c)return compress(e,o).then(function(e){try{return a=e,$If_4.call(this)}catch(e){return i(e)}}.bind(this),i);var u=function(){try{return $If_4.call(this)}catch(e){return i(e)}}.bind(this),$Try_1_Catch=function(t){try{return compress(e,o).then((function(e){try{return a=e,u()}catch(e){return i(e)}}),i)}catch(e){return i(e)}};try{return o.libURL=o.libURL||\"https://cdn.jsdelivr.net/npm/browser-image-compression@2.0.2/dist/browser-image-compression.js\",compressOnWebWorker(e,o).then((function(e){try{return a=e,u()}catch(e){return $Try_1_Catch()}}),$Try_1_Catch)}catch(e){$Try_1_Catch()}function $If_4(){try{a.name=e.name,a.lastModified=e.lastModified}catch(e){}try{o.preserveExif&&\"image/jpeg\"===e.type&&(!o.fileType||o.fileType&&o.fileType===e.type)&&(a=copyExifWithoutOrientation(e,a))}catch(e){}return r(a)}}))}imageCompression.getDataUrlFromFile=getDataUrlFromFile,imageCompression.getFilefromDataUrl=getFilefromDataUrl,imageCompression.loadImage=loadImage,imageCompression.drawImageInCanvas=drawImageInCanvas,imageCompression.drawFileInCanvas=drawFileInCanvas,imageCompression.canvasToFile=canvasToFile,imageCompression.getExifOrientation=getExifOrientation,imageCompression.handleMaxWidthOrHeight=handleMaxWidthOrHeight,imageCompression.followExifOrientation=followExifOrientation,imageCompression.cleanupCanvasMemory=cleanupCanvasMemory,imageCompression.isAutoOrientationInBrowser=isAutoOrientationInBrowser,imageCompression.approximateBelowMaximumCanvasSizeOfBrowser=approximateBelowMaximumCanvasSizeOfBrowser,imageCompression.copyExifWithoutOrientation=copyExifWithoutOrientation,imageCompression.getBrowserName=getBrowserName,imageCompression.version=\"2.0.2\";export{imageCompression as default};\n//# sourceMappingURL=browser-image-compression.mjs.map\n","/**\n * FileUploader 유틸리티 함수\n *\n * @module composite/FileUploader/utils\n */\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst G7Core = (window as any).G7Core;\n\n/**\n * 파일 크기를 읽기 쉬운 형식으로 변환합니다.\n */\nexport const formatFileSize = (bytes: number): string => {\n const units = ['B', 'KB', 'MB', 'GB'];\n let i = 0;\n let size = bytes;\n while (size >= 1024 && i < units.length - 1) {\n size /= 1024;\n i++;\n }\n return `${size.toFixed(2)} ${units[i]}`;\n};\n\n/**\n * API 에러 응답에서 상세 메시지를 추출합니다.\n */\nexport const extractErrorMessage = (error: unknown): string => {\n // Axios 에러 응답 구조 처리\n if (error && typeof error === 'object') {\n const axiosError = error as {\n response?: {\n data?: {\n message?: string;\n errors?: Record;\n };\n };\n message?: string;\n };\n\n // API 응답의 message 필드\n if (axiosError.response?.data?.message) {\n return axiosError.response.data.message;\n }\n\n // Laravel validation 에러 (errors 객체의 첫 번째 메시지)\n if (axiosError.response?.data?.errors) {\n const firstError = Object.values(axiosError.response.data.errors)[0];\n if (Array.isArray(firstError) && firstError[0]) {\n return firstError[0];\n }\n }\n\n // 일반 에러 메시지\n if (axiosError.message) {\n return axiosError.message;\n }\n }\n\n // Error 인스턴스\n if (error instanceof Error) {\n return error.message;\n }\n\n return '업로드 실패';\n};\n\n/**\n * MIME 타입에 따른 Font Awesome 아이콘 클래스를 반환합니다.\n */\nexport const getFileIcon = (mimeType: string): string => {\n if (!mimeType) return 'fa-file';\n if (mimeType.startsWith('image/')) return 'fa-file-image';\n if (mimeType.startsWith('video/')) return 'fa-file-video';\n if (mimeType.startsWith('audio/')) return 'fa-file-audio';\n if (mimeType === 'application/pdf') return 'fa-file-pdf';\n if (mimeType.includes('word') || mimeType.includes('document')) return 'fa-file-word';\n if (mimeType.includes('excel') || mimeType.includes('spreadsheet')) return 'fa-file-excel';\n if (mimeType.includes('zip') || mimeType.includes('compressed')) return 'fa-file-zipper';\n return 'fa-file';\n};\n\n/**\n * G7Core.t() 번역 함수 참조\n */\nexport const t = (key: string, params?: Record) =>\n G7Core?.t?.(key, params) ?? key;","/**\n * useFileUploader Hook\n *\n * FileUploader의 핵심 로직을 담당하는 훅입니다.\n * - 파일 추가/삭제/업로드\n * - 이미지 압축\n * - 병렬 업로드 큐\n * - 순서 변경\n *\n * @module composite/FileUploader/useFileUploader\n */\n\nimport { useState, useCallback, useRef, useEffect, useMemo } from 'react';\nimport imageCompression from 'browser-image-compression';\n\nimport type { Attachment, PendingFile, FileUploaderProps, ApiEndpoints } from './types';\nimport { formatFileSize, extractErrorMessage, t } from './utils';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst G7Core = (window as any).G7Core;\n\nexport interface UseFileUploaderOptions {\n attachmentableType?: string;\n attachmentableId?: number;\n collection: string;\n maxFiles: number;\n maxSize: number;\n maxConcurrentUploads: number;\n accept?: string;\n imageCompression?: FileUploaderProps['imageCompression'];\n roleIds: number[];\n autoUpload: boolean;\n initialFiles: Attachment[];\n endpoints: ApiEndpoints;\n onFilesChange?: (files: PendingFile[]) => void;\n onUploadComplete?: (attachments: Attachment[]) => void;\n onUploadError?: (error: string, file: File) => void;\n onRemove?: (id: number | string) => void;\n onReorder?: (files: Attachment[]) => void;\n uploadTriggerEvent?: string;\n confirmBeforeRemove: boolean;\n uploadParams?: Record;\n}\n\nexport interface UseFileUploaderReturn {\n // 상태\n existingFiles: Attachment[];\n pendingFiles: PendingFile[];\n isDragOver: boolean;\n setIsDragOver: (value: boolean) => void;\n isDeleting: boolean;\n\n // 계산된 값\n totalCount: number;\n hasFiles: boolean;\n canAddMore: boolean;\n allItems: (Attachment | PendingFile)[];\n imageFiles: (Attachment | PendingFile)[];\n\n // 액션\n handleFiles: (files: FileList) => Promise;\n handleRemove: (item: PendingFile | Attachment) => Promise;\n handleRetry: (pendingFile: PendingFile) => void;\n handleUploadAll: () => Promise;\n handleOpenGallery: (item: PendingFile | Attachment) => void;\n handleDownload: (item: Attachment) => Promise;\n handleDragEnd: (event: import('@dnd-kit/core').DragEndEvent) => Promise;\n\n // Input ref\n inputRef: React.RefObject;\n\n // 갤러리 상태\n galleryOpen: boolean;\n setGalleryOpen: (value: boolean) => void;\n galleryStartIndex: number;\n galleryKeyRef: React.MutableRefObject;\n\n // 삭제 확인 모달 상태\n confirmDialogOpen: boolean;\n setConfirmDialogOpen: (value: boolean) => void;\n itemToDelete: Attachment | null;\n executeRemoveAttachment: (item: Attachment) => Promise;\n\n // 인증된 이미지 URL 캐시\n authenticatedImageUrls: Map;\n\n // 초기화\n clear: () => void;\n getPendingFiles: () => PendingFile[];\n}\n\nexport function useFileUploader(options: UseFileUploaderOptions): UseFileUploaderReturn {\n const {\n attachmentableType,\n attachmentableId,\n collection,\n maxFiles,\n maxSize,\n maxConcurrentUploads,\n accept,\n imageCompression: compressionOptions,\n roleIds,\n autoUpload,\n initialFiles,\n endpoints,\n onFilesChange,\n onUploadComplete,\n onUploadError,\n onRemove,\n onReorder,\n uploadTriggerEvent,\n confirmBeforeRemove,\n uploadParams,\n } = options;\n\n // 상태\n const [existingFiles, setExistingFiles] = useState(initialFiles);\n const [pendingFiles, setPendingFiles] = useState([]);\n const [isDragOver, setIsDragOver] = useState(false);\n const inputRef = useRef(null);\n const activeUploadsRef = useRef(0);\n // 삭제된 파일 ID 또는 hash를 추적하여 initialFiles 동기화 시 제외\n const deletedIdsRef = useRef>(new Set());\n // 세션 중 업로드된 파일을 추적하여 initialFiles 동기화 시 유지\n const uploadedFilesRef = useRef>(new Map());\n\n // 삭제 확인 모달 상태\n const [confirmDialogOpen, setConfirmDialogOpen] = useState(false);\n const [itemToDelete, setItemToDelete] = useState(null);\n const [isDeleting, setIsDeleting] = useState(false);\n // 순서가 변경되었는지 추적 (변경 후에는 initialFiles 동기화 무시)\n const hasReorderedRef = useRef(false);\n // 드래그 순서 유지: 기존/신규 파일 간 섞인 순서를 보존하기 위한 ID 배열\n const [customOrder, setCustomOrder] = useState<(string | number)[]>([]);\n // initialFiles 참조 안정성 — 외부에서 매 렌더마다 새 배열이 전달되는 경우 방어\n const prevInitialFilesRef = useRef(initialFiles);\n\n // 이미지 갤러리 상태\n const [galleryOpen, setGalleryOpen] = useState(false);\n const [galleryStartIndex, setGalleryStartIndex] = useState(0);\n // 갤러리 리마운트용 key (열릴 때마다 증가)\n const galleryKeyRef = useRef(0);\n // 인증된 이미지 URL 캐시 (기존 첨부파일용)\n const [authenticatedImageUrls, setAuthenticatedImageUrls] = useState>(new Map());\n // ref로 URL 캐시 추적 (stale closure 방지 — cleanup/has 체크에서 항상 최신 참조)\n const authenticatedImageUrlsRef = useRef>(new Map());\n\n // 대기 파일 변경 시 콜백\n useEffect(() => {\n onFilesChange?.(pendingFiles);\n }, [pendingFiles, onFilesChange]);\n\n // initialFiles 참조 안정화 — 매 렌더마다 새 배열이 전달되어도 내용이 같으면 무시\n const stableInitialFiles = useMemo(() => {\n const prev = prevInitialFilesRef.current;\n // 동일 참조면 즉시 반환\n if (prev === initialFiles) return prev;\n // 길이가 다르면 실제 변경\n if (prev.length !== initialFiles.length) {\n prevInitialFilesRef.current = initialFiles;\n return initialFiles;\n }\n // 빈 배열끼리는 항상 동일 (가장 흔한 케이스 — 무한 루프 방지)\n if (prev.length === 0 && initialFiles.length === 0) return prev;\n // ID 기반 얕은 비교\n const changed = initialFiles.some((f, i) => f.id !== prev[i]?.id);\n if (changed) {\n prevInitialFilesRef.current = initialFiles;\n return initialFiles;\n }\n return prev;\n }, [initialFiles]);\n\n // initialFiles prop 변경 시 existingFiles 동기화 (삭제/순서변경된 경우 제외)\n useEffect(() => {\n // 순서가 변경된 후에는 initialFiles 동기화를 무시\n if (hasReorderedRef.current) {\n return;\n }\n const filteredFiles = stableInitialFiles.filter(\n (file) => !deletedIdsRef.current.has(file.id) && (!file.hash || !deletedIdsRef.current.has(file.hash))\n );\n\n // 세션 중 업로드된 파일 병합 (initialFiles에 없는 것만 추가)\n const initialIds = new Set(filteredFiles.map((f) => f.id));\n const sessionUploaded = Array.from(uploadedFilesRef.current.values()).filter(\n (f) => !initialIds.has(f.id) && !deletedIdsRef.current.has(f.id)\n );\n\n setExistingFiles([...filteredFiles, ...sessionUploaded]);\n }, [stableInitialFiles]);\n\n // 이미지 압축\n const compressImage = useCallback(\n async (file: File): Promise => {\n const compressionOpts = {\n maxSizeMB: compressionOptions?.maxSizeMB ?? 1,\n maxWidthOrHeight: compressionOptions?.maxWidthOrHeight ?? 1920,\n useWebWorker: true,\n };\n return await imageCompression(file, compressionOpts);\n },\n [compressionOptions]\n );\n\n // 파일 추가 처리\n const handleFiles = useCallback(\n async (selectedFiles: FileList) => {\n const totalCount = existingFiles.length + pendingFiles.length;\n const remainingSlots = Math.max(0, maxFiles - totalCount);\n const filesToAdd = Array.from(selectedFiles).slice(0, remainingSlots);\n\n // 개수 상한 초과분은 조용히 절단하지 않고 안내 (개수 초과 silent 무시 방지)\n if (selectedFiles.length > remainingSlots) {\n const overflow = Array.from(selectedFiles).slice(remainingSlots);\n const message = t('attachment.upload_limit_exceeded', { max: maxFiles });\n // 잘린 첫 파일을 대표로 콜백에 전달 (없으면 무시)\n onUploadError?.(message, overflow[0] ?? selectedFiles[0]);\n }\n\n for (const file of filesToAdd) {\n // 크기 검증\n if (file.size > maxSize * 1024 * 1024) {\n onUploadError?.(\n `[${file.name}] 파일 크기(${formatFileSize(file.size)})가 최대 허용 크기(${maxSize}MB)를 초과합니다.`,\n file\n );\n continue;\n }\n\n // 확장자/MIME 타입 검증\n if (accept) {\n const ext = '.' + file.name.split('.').pop()?.toLowerCase();\n const acceptedTypes = accept.split(',').map((e) => e.trim().toLowerCase());\n const isAccepted = acceptedTypes.some((accepted) => {\n // MIME 타입 와일드카드 (예: image/*, video/*, audio/*)\n if (accepted.includes('/')) {\n if (accepted.endsWith('/*')) {\n const mimePrefix = accepted.slice(0, -2);\n return file.type.toLowerCase().startsWith(mimePrefix + '/');\n }\n // 정확한 MIME 타입 매칭 (예: image/jpeg)\n return file.type.toLowerCase() === accepted;\n }\n // 확장자 매칭 (예: .jpg, .png)\n return ext === accepted;\n });\n if (!isAccepted) {\n onUploadError?.(`[${file.name}] 허용되지 않는 파일 형식입니다. (허용: ${accept})`, file);\n continue;\n }\n }\n\n const pendingFile: PendingFile = {\n id: `pending-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n file,\n original_filename: file.name,\n mime_type: file.type,\n size: file.size,\n size_formatted: formatFileSize(file.size),\n status: 'pending',\n progress: 0,\n };\n\n // 이미지 미리보기 생성\n if (file.type.startsWith('image/')) {\n pendingFile.preview = URL.createObjectURL(file);\n }\n\n setPendingFiles((prev) => [...prev, pendingFile]);\n\n // 이미지인 경우 압축 처리\n if (file.type.startsWith('image/') && compressionOptions) {\n setPendingFiles((prev) =>\n prev.map((f) => (f.id === pendingFile.id ? { ...f, status: 'compressing' } : f))\n );\n\n try {\n const compressedBlob = await compressImage(file);\n setPendingFiles((prev) =>\n prev.map((f) =>\n f.id === pendingFile.id\n ? {\n ...f,\n compressedBlob,\n size: compressedBlob.size,\n size_formatted: formatFileSize(compressedBlob.size),\n status: 'pending',\n progress: 0,\n }\n : f\n )\n );\n } catch {\n setPendingFiles((prev) =>\n prev.map((f) =>\n f.id === pendingFile.id\n ? { ...f, status: 'error', error: '이미지 압축 실패' }\n : f\n )\n );\n }\n }\n }\n },\n [existingFiles.length, pendingFiles.length, maxFiles, maxSize, accept, compressionOptions, compressImage, onUploadError]\n );\n\n // 단일 파일 업로드\n const uploadSingleFile = useCallback(\n async (pendingFile: PendingFile): Promise => {\n const formData = new FormData();\n\n // 압축된 Blob 또는 원본 파일\n const fileToUpload = pendingFile.compressedBlob\n ? new File([pendingFile.compressedBlob], pendingFile.original_filename, {\n type: pendingFile.mime_type,\n })\n : pendingFile.file;\n\n formData.append('file', fileToUpload);\n\n if (attachmentableType) {\n formData.append('attachmentable_type', attachmentableType);\n }\n if (attachmentableId) {\n formData.append('attachmentable_id', String(attachmentableId));\n }\n formData.append('collection', collection);\n\n roleIds.forEach((roleId) => {\n formData.append('role_ids[]', String(roleId));\n });\n\n // 추가 업로드 파라미터 (예: temp_key)\n if (uploadParams) {\n Object.entries(uploadParams).forEach(([key, value]) => {\n formData.append(key, value);\n });\n }\n\n try {\n const response = await G7Core.api.post(endpoints.upload, formData, {\n headers: { 'Content-Type': 'multipart/form-data' },\n onUploadProgress: (progressEvent: { loaded: number; total?: number }) => {\n const progress = Math.round((progressEvent.loaded * 100) / (progressEvent.total ?? 1));\n setPendingFiles((prev) =>\n prev.map((f) => (f.id === pendingFile.id ? { ...f, progress } : f))\n );\n },\n });\n\n // ResponseHelper 이중 래핑 대응: response.data.data (래핑) 또는 response.data (비래핑)\n const attachment = response?.data?.data ?? response?.data;\n return attachment as Attachment;\n } catch (error: unknown) {\n // API 에러 응답에서 상세 메시지 추출\n const errorMessage = extractErrorMessage(error);\n throw new Error(errorMessage);\n }\n },\n [attachmentableType, attachmentableId, collection, roleIds, endpoints.upload]\n );\n\n // 모든 파일 업로드\n const handleUploadAll = useCallback(async (): Promise => {\n const filesToUpload = pendingFiles.filter(\n (f) => f.status === 'pending' || f.status === 'error'\n );\n\n if (filesToUpload.length === 0) {\n return [];\n }\n\n const uploadedAttachments: Attachment[] = [];\n // 드래그 순서 복원용: pending ID → 업로드된 hash 매핑\n const pendingToHashMap = new Map();\n const uploadQueue = [...filesToUpload];\n\n const processQueue = async () => {\n while (uploadQueue.length > 0 && activeUploadsRef.current < maxConcurrentUploads) {\n const pendingFile = uploadQueue.shift()!;\n activeUploadsRef.current++;\n\n setPendingFiles((prev) =>\n prev.map((f) => (f.id === pendingFile.id ? { ...f, status: 'uploading', progress: 0 } : f))\n );\n\n try {\n const attachment = await uploadSingleFile(pendingFile);\n if (attachment) {\n uploadedAttachments.push(attachment);\n // 드래그 순서 복원용: pending ID → 업로드된 hash 매핑\n pendingToHashMap.set(String(pendingFile.id), String(attachment.hash));\n // 세션 중 업로드된 파일 추적 (initialFiles 동기화 시 유지)\n uploadedFilesRef.current.set(attachment.id, attachment);\n setPendingFiles((prev) => prev.filter((f) => f.id !== pendingFile.id));\n setExistingFiles((prev) => [...prev, attachment]);\n\n // customOrder에 pending ID가 있으면 즉시 hash로 교체\n // → allItems useMemo가 올바른 순서로 E를 표시 (UI 플래시 방지)\n setCustomOrder((prev) => {\n if (prev.length === 0) return prev;\n const pendingId = String(pendingFile.id);\n const hasMatch = prev.some((id) => String(id) === pendingId);\n if (!hasMatch) return prev;\n return prev.map((id) => String(id) === pendingId ? String(attachment.hash) : id);\n });\n\n // 미리보기 URL 해제\n if (pendingFile.preview) {\n URL.revokeObjectURL(pendingFile.preview);\n }\n } else {\n // 업로드 API 성공이지만 응답 파싱 실패 → 에러 상태로 전환 ('uploading' 영구 잔류 방지)\n const invalidMsg = t('attachment.upload_response_invalid');\n setPendingFiles((prev) =>\n prev.map((f) =>\n f.id === pendingFile.id\n ? { ...f, status: 'error', error: invalidMsg }\n : f\n )\n );\n onUploadError?.(\n `[${pendingFile.original_filename}] ${invalidMsg}`,\n pendingFile.file\n );\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : '업로드 실패';\n setPendingFiles((prev) =>\n prev.map((f) =>\n f.id === pendingFile.id ? { ...f, status: 'error', error: errorMessage } : f\n )\n );\n onUploadError?.(`[${pendingFile.original_filename}] ${errorMessage}`, pendingFile.file);\n } finally {\n activeUploadsRef.current--;\n }\n }\n };\n\n // 병렬 업로드 시작\n const workers = Array(Math.min(maxConcurrentUploads, filesToUpload.length))\n .fill(null)\n .map(() => processQueue());\n\n await Promise.all(workers);\n\n if (uploadedAttachments.length > 0) {\n onUploadComplete?.(uploadedAttachments);\n\n // 편집 모드(reorder 엔드포인트 존재)에서 드래그 순서가 있는 경우에만 onReorder 호출\n // → form.images를 올바른 순서로 덮어쓰기 (onUploadComplete의 append 순서를 교정)\n // 복사/생성 모드에서는 호출하지 않음 (linkTempImages가 별도 처리하므로 중복 방지)\n // NOTE: customOrder의 pending ID→hash 교체는 processQueue 내에서 즉시 처리됨\n if (endpoints.reorder && customOrder.length > 0 && onReorder) {\n const allExisting = [...existingFiles, ...uploadedAttachments];\n\n // pending ID를 업로드된 hash로 교체 (이미 setCustomOrder로 갱신되었지만, 클로저 값 기준 재계산)\n const updatedOrder = customOrder.map((id) => {\n const hash = pendingToHashMap.get(String(id));\n return hash ?? id;\n });\n\n const orderMap = new Map(updatedOrder.map((id, idx) => [String(id), idx]));\n const ordered = [...allExisting]\n .sort((a, b) => {\n const aOrder = orderMap.get(String(a.hash)) ?? allExisting.length;\n const bOrder = orderMap.get(String(b.hash)) ?? allExisting.length;\n return aOrder - bOrder;\n })\n .map((item, idx) => ({ ...item, sort_order: idx, order: idx + 1 }));\n\n onReorder(ordered);\n }\n }\n\n return uploadedAttachments;\n }, [pendingFiles, maxConcurrentUploads, uploadSingleFile, onUploadComplete, onUploadError, customOrder, existingFiles, onReorder, endpoints.reorder]);\n\n // 업로드 트리거 이벤트 구독 (uploadTriggerEvent가 있는 경우)\n useEffect(() => {\n if (!uploadTriggerEvent) return;\n\n const unsubscribe = G7Core.componentEvent.on(uploadTriggerEvent, async () => {\n // 업로드할 파일이 있으면 업로드, 없으면 기존 파일 ID 반환\n const uploadedAttachments = await handleUploadAll();\n return {\n uploadedAttachments,\n existingFiles,\n allFiles: [...existingFiles, ...uploadedAttachments],\n };\n });\n\n return () => {\n unsubscribe();\n };\n }, [uploadTriggerEvent, handleUploadAll, existingFiles]);\n\n // autoUpload가 true이고 pendingFiles가 추가되면 자동 업로드\n useEffect(() => {\n if (autoUpload && pendingFiles.some((f) => f.status === 'pending')) {\n handleUploadAll();\n }\n }, [autoUpload, pendingFiles, handleUploadAll]);\n\n // 실제 삭제 실행 (기존 첨부파일)\n const executeRemoveAttachment = useCallback(\n async (item: Attachment) => {\n setIsDeleting(true);\n try {\n // id가 있는 경우만 서버 API 삭제 호출 (복사 모드 등 id 없는 이미지는 로컬 제거만)\n if (item.id && endpoints.delete) {\n const deleteUrl = endpoints.delete.replace(':id', String(item.id));\n await G7Core.api.delete(deleteUrl);\n }\n // 삭제 추적 — id와 hash 모두 기록 (복사 모드 이미지는 id 없이 hash만 존재)\n const itemKey = item.hash || item.id;\n if (item.id) {\n deletedIdsRef.current.add(item.id);\n uploadedFilesRef.current.delete(item.id);\n }\n if (item.hash) {\n deletedIdsRef.current.add(item.hash);\n }\n setExistingFiles((prev) => prev.filter((f) => (f.hash || f.id) !== itemKey));\n onRemove?.(item.hash || item.id);\n setConfirmDialogOpen(false);\n setItemToDelete(null);\n } catch {\n console.error('첨부파일 삭제 실패');\n } finally {\n setIsDeleting(false);\n }\n },\n [onRemove, endpoints.delete]\n );\n\n // 파일 삭제 핸들러 (확인 모달 또는 즉시 삭제)\n const handleRemove = useCallback(\n async (item: PendingFile | Attachment) => {\n if ('hash' in item) {\n // 기존 첨부파일\n if (confirmBeforeRemove) {\n // 확인 모달 표시\n setItemToDelete(item);\n setConfirmDialogOpen(true);\n } else {\n // 즉시 삭제\n await executeRemoveAttachment(item);\n }\n } else {\n // 대기 파일 삭제 (확인 없이 즉시)\n if (item.preview) {\n URL.revokeObjectURL(item.preview);\n }\n setPendingFiles((prev) => prev.filter((f) => f.id !== item.id));\n }\n },\n [confirmBeforeRemove, executeRemoveAttachment]\n );\n\n // 재시도 핸들러\n const handleRetry = useCallback((pendingFile: PendingFile) => {\n setPendingFiles((prev) =>\n prev.map((f) =>\n f.id === pendingFile.id ? { ...f, status: 'pending', error: undefined } : f\n )\n );\n }, []);\n\n // 순서 변경\n const handleDragEnd = useCallback(\n async (event: import('@dnd-kit/core').DragEndEvent) => {\n const { arrayMove } = await import('@dnd-kit/sortable');\n const { active, over } = event;\n if (!over || active.id === over.id) return;\n\n // customOrder 기반으로 시각 순서와 일치하는 allItems 계산\n // (raw [...existingFiles, ...pendingFiles] 는 시각 순서와 다를 수 있음)\n const combined = [...existingFiles, ...pendingFiles];\n let orderedItems: (Attachment | PendingFile)[];\n if (customOrder.length === 0) {\n orderedItems = combined;\n } else {\n const orderMap = new Map(customOrder.map((id, idx) => [String(id), idx]));\n orderedItems = [...combined].sort((a, b) => {\n const aKey = 'hash' in a ? String(a.hash) : String(a.id);\n const bKey = 'hash' in b ? String(b.hash) : String(b.id);\n return (orderMap.get(aKey) ?? combined.length) - (orderMap.get(bKey) ?? combined.length);\n });\n }\n\n const oldIndex = orderedItems.findIndex((item) =>\n 'hash' in item ? item.hash === active.id : item.id === active.id\n );\n const newIndex = orderedItems.findIndex((item) =>\n 'hash' in item ? item.hash === over.id : item.id === over.id\n );\n\n const reordered = arrayMove(orderedItems, oldIndex, newIndex);\n\n // 드래그 순서 보존 (기존/신규 파일 간 섞인 순서 유지)\n setCustomOrder(reordered.map((item) => 'hash' in item ? item.hash : item.id));\n\n // 분리\n const newExisting = reordered.filter((item): item is Attachment => 'hash' in item);\n const newPending = reordered.filter((item): item is PendingFile => !('hash' in item));\n\n // 순서 변경 플래그 설정 (initialFiles 동기화 방지)\n hasReorderedRef.current = true;\n\n setExistingFiles(newExisting);\n setPendingFiles(newPending);\n\n // sort_order/order 필드를 새 인덱스로 갱신 (form.images 동기화용)\n const reorderedFiles = newExisting.map((item, idx) => ({\n ...item,\n sort_order: idx,\n order: idx + 1,\n }));\n\n // 서버에 순서 변경 요청 (기존 파일 + reorder 엔드포인트가 설정된 경우만)\n if (newExisting.length > 0 && endpoints.reorder) {\n const orderData = newExisting.map((item, index) => ({\n id: item.id,\n order: index + 1,\n }));\n\n try {\n const response = await G7Core.api.patch(endpoints.reorder, { order: orderData });\n G7Core.toast.success(response.message);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : t('attachment.reorder_failed');\n G7Core.toast.error(message);\n }\n }\n\n // API 호출 성공/스킵 무관하게 항상 콜백 호출\n onReorder?.(reorderedFiles);\n },\n [existingFiles, pendingFiles, customOrder, endpoints.reorder, onReorder]\n );\n\n // 이미지 파일만 필터링 (갤러리용)\n const imageFiles = useMemo(\n () =>\n [...existingFiles, ...pendingFiles].filter((item) => {\n if ('is_image' in item) {\n // Attachment (기존 첨부파일) - is_image 필드 우선 사용\n return (item as Attachment).is_image;\n }\n // PendingFile (대기 파일) - mime_type으로 확인\n return item.mime_type?.startsWith('image/') ?? false;\n }),\n [existingFiles, pendingFiles]\n );\n\n // 갤러리 열기 (이미지 인덱스로)\n const handleOpenGallery = useCallback(\n (item: PendingFile | Attachment) => {\n // 클릭된 아이템의 인덱스를 imageFiles에서 찾기\n const imageIndex = imageFiles.findIndex((img) => {\n // 둘 다 Attachment인 경우 (hash로 비교)\n if ('hash' in item && 'hash' in img) {\n return img.hash === item.hash;\n }\n // 둘 다 PendingFile인 경우 (id로 비교)\n if ('id' in item && 'id' in img && !('hash' in item) && !('hash' in img)) {\n return img.id === item.id;\n }\n return false;\n });\n if (imageIndex !== -1) {\n // 갤러리를 열 때마다 key 증가 (강제 리마운트)\n galleryKeyRef.current += 1;\n setGalleryStartIndex(imageIndex);\n setGalleryOpen(true);\n }\n },\n [imageFiles]\n );\n\n // 기존 첨부파일 인증된 이미지 URL 로드 (갤러리용)\n useEffect(() => {\n let cancelled = false;\n\n const loadAuthenticatedUrls = async () => {\n // is_image 필드 사용 (imageFiles 필터와 일치)\n const existingImageFiles = existingFiles.filter((f) => f.is_image);\n\n // existingFiles에서 제거된 파일의 URL 정리\n const currentIds = new Set(existingImageFiles.map((f) => f.id));\n for (const [id, url] of authenticatedImageUrlsRef.current) {\n if (!currentIds.has(id)) {\n URL.revokeObjectURL(url);\n authenticatedImageUrlsRef.current.delete(id);\n }\n }\n\n for (const file of existingImageFiles) {\n if (cancelled) break;\n // ref 기반 has 체크 (stale closure 방지)\n if (authenticatedImageUrlsRef.current.has(file.id)) continue;\n\n try {\n const blob = await G7Core.api.get(file.download_url, {\n responseType: 'blob',\n });\n if (!cancelled && blob) {\n const objectUrl = URL.createObjectURL(blob);\n authenticatedImageUrlsRef.current.set(file.id, objectUrl);\n setAuthenticatedImageUrls(new Map(authenticatedImageUrlsRef.current));\n }\n } catch (error) {\n console.error('Failed to load authenticated image:', error);\n }\n }\n };\n\n loadAuthenticatedUrls();\n\n return () => {\n cancelled = true;\n };\n }, [existingFiles]);\n\n // 언마운트 시에만 모든 인증된 이미지 URL 해제\n useEffect(() => {\n return () => {\n authenticatedImageUrlsRef.current.forEach((url) => URL.revokeObjectURL(url));\n authenticatedImageUrlsRef.current.clear();\n };\n }, []);\n\n // 파일 다운로드 실행\n const handleDownload = useCallback(async (item: Attachment) => {\n const { executeImageDownload } = await import('../ImageGallery');\n await executeImageDownload({\n src: item.download_url,\n downloadUrl: item.download_url,\n filename: item.original_filename,\n downloadRequiresAuth: true,\n });\n }, []);\n\n // 계산된 값 (customOrder가 있으면 드래그 순서 유지, 없으면 기본 순서)\n const allItems = useMemo(() => {\n const combined = [...existingFiles, ...pendingFiles];\n if (customOrder.length === 0) return combined;\n\n const orderMap = new Map(customOrder.map((id, idx) => [String(id), idx]));\n return [...combined].sort((a, b) => {\n const aKey = 'hash' in a ? String(a.hash) : String(a.id);\n const bKey = 'hash' in b ? String(b.hash) : String(b.id);\n const aOrder = orderMap.get(aKey) ?? combined.length;\n const bOrder = orderMap.get(bKey) ?? combined.length;\n return aOrder - bOrder;\n });\n }, [existingFiles, pendingFiles, customOrder]);\n const totalCount = allItems.length;\n const hasFiles = totalCount > 0;\n const canAddMore = totalCount < maxFiles;\n\n // 초기화 함수들\n const clear = useCallback(() => setPendingFiles([]), []);\n const getPendingFiles = useCallback(() => pendingFiles, [pendingFiles]);\n\n return {\n // 상태\n existingFiles,\n pendingFiles,\n isDragOver,\n setIsDragOver,\n isDeleting,\n\n // 계산된 값\n totalCount,\n hasFiles,\n canAddMore,\n allItems,\n imageFiles,\n\n // 액션\n handleFiles,\n handleRemove,\n handleRetry,\n handleUploadAll,\n handleOpenGallery,\n handleDownload,\n handleDragEnd,\n\n // Input ref\n inputRef,\n\n // 갤러리 상태\n galleryOpen,\n setGalleryOpen,\n galleryStartIndex,\n galleryKeyRef,\n\n // 삭제 확인 모달 상태\n confirmDialogOpen,\n setConfirmDialogOpen,\n itemToDelete,\n executeRemoveAttachment,\n\n // 인증된 이미지 URL 캐시\n authenticatedImageUrls,\n\n // 초기화\n clear,\n getPendingFiles,\n };\n}\n\nexport default useFileUploader;","/**\n * FileDropZone 컴포넌트\n *\n * 파일을 드래그 앤 드롭하거나 클릭하여 선택할 수 있는 영역입니다.\n *\n * @module composite/FileUploader/FileDropZone\n */\n\nimport React from 'react';\n\nimport { Div } from '../../basic/Div';\nimport { P } from '../../basic/P';\nimport { I } from '../../basic/I';\n\nimport { t } from './utils';\n\nexport interface FileDropZoneProps {\n /** 드래그 오버 상태 */\n isDragOver: boolean;\n /** 추가 가능 여부 */\n canAddMore: boolean;\n /** 파일 처리 핸들러 */\n onFiles: (files: FileList) => void;\n /** 드래그 오버 상태 설정 */\n setIsDragOver: (value: boolean) => void;\n /** Input 요소 ref */\n inputRef: React.RefObject;\n /** 허용 확장자 */\n accept?: string;\n /** 최대 파일 수 */\n maxFiles: number;\n /** 최대 파일 크기 (MB) */\n maxSize: number;\n /** 자식 요소 */\n children?: React.ReactNode;\n}\n\nexport const FileDropZone: React.FC = ({\n isDragOver,\n canAddMore,\n onFiles,\n setIsDragOver,\n inputRef,\n accept,\n maxFiles,\n maxSize,\n children,\n}) => {\n return (\n {\n e.preventDefault();\n if (canAddMore) setIsDragOver(true);\n }}\n onDragLeave={() => setIsDragOver(false)}\n onDrop={(e) => {\n e.preventDefault();\n setIsDragOver(false);\n if (canAddMore) {\n onFiles(e.dataTransfer.files);\n }\n }}\n >\n e.target.files && onFiles(e.target.files)}\n className=\"hidden\"\n />\n\n {/* 파일이 없을 때: 빈 드롭존 */}\n {!children && (\n inputRef.current?.click()}\n >\n \n

\n {t('attachment.drop_or_click')}\n

\n

\n {t('attachment.upload_limit', { maxFiles, maxSize })}\n {accept && ` (${accept})`}\n

\n \n )}\n\n {/* 파일이 있을 때: 자식 요소 렌더링 */}\n {children}\n \n );\n};\n\nexport default FileDropZone;","import { useMemo, useLayoutEffect, useEffect, useRef, useCallback } from 'react';\n\nfunction useCombinedRefs() {\n for (var _len = arguments.length, refs = new Array(_len), _key = 0; _key < _len; _key++) {\n refs[_key] = arguments[_key];\n }\n\n return useMemo(() => node => {\n refs.forEach(ref => ref(node));\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n refs);\n}\n\n// https://github.com/facebook/react/blob/master/packages/shared/ExecutionEnvironment.js\nconst canUseDOM = typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined';\n\nfunction isWindow(element) {\n const elementString = Object.prototype.toString.call(element);\n return elementString === '[object Window]' || // In Electron context the Window object serializes to [object global]\n elementString === '[object global]';\n}\n\nfunction isNode(node) {\n return 'nodeType' in node;\n}\n\nfunction getWindow(target) {\n var _target$ownerDocument, _target$ownerDocument2;\n\n if (!target) {\n return window;\n }\n\n if (isWindow(target)) {\n return target;\n }\n\n if (!isNode(target)) {\n return window;\n }\n\n return (_target$ownerDocument = (_target$ownerDocument2 = target.ownerDocument) == null ? void 0 : _target$ownerDocument2.defaultView) != null ? _target$ownerDocument : window;\n}\n\nfunction isDocument(node) {\n const {\n Document\n } = getWindow(node);\n return node instanceof Document;\n}\n\nfunction isHTMLElement(node) {\n if (isWindow(node)) {\n return false;\n }\n\n return node instanceof getWindow(node).HTMLElement;\n}\n\nfunction isSVGElement(node) {\n return node instanceof getWindow(node).SVGElement;\n}\n\nfunction getOwnerDocument(target) {\n if (!target) {\n return document;\n }\n\n if (isWindow(target)) {\n return target.document;\n }\n\n if (!isNode(target)) {\n return document;\n }\n\n if (isDocument(target)) {\n return target;\n }\n\n if (isHTMLElement(target) || isSVGElement(target)) {\n return target.ownerDocument;\n }\n\n return document;\n}\n\n/**\r\n * A hook that resolves to useEffect on the server and useLayoutEffect on the client\r\n * @param callback {function} Callback function that is invoked when the dependencies of the hook change\r\n */\n\nconst useIsomorphicLayoutEffect = canUseDOM ? useLayoutEffect : useEffect;\n\nfunction useEvent(handler) {\n const handlerRef = useRef(handler);\n useIsomorphicLayoutEffect(() => {\n handlerRef.current = handler;\n });\n return useCallback(function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return handlerRef.current == null ? void 0 : handlerRef.current(...args);\n }, []);\n}\n\nfunction useInterval() {\n const intervalRef = useRef(null);\n const set = useCallback((listener, duration) => {\n intervalRef.current = setInterval(listener, duration);\n }, []);\n const clear = useCallback(() => {\n if (intervalRef.current !== null) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n }, []);\n return [set, clear];\n}\n\nfunction useLatestValue(value, dependencies) {\n if (dependencies === void 0) {\n dependencies = [value];\n }\n\n const valueRef = useRef(value);\n useIsomorphicLayoutEffect(() => {\n if (valueRef.current !== value) {\n valueRef.current = value;\n }\n }, dependencies);\n return valueRef;\n}\n\nfunction useLazyMemo(callback, dependencies) {\n const valueRef = useRef();\n return useMemo(() => {\n const newValue = callback(valueRef.current);\n valueRef.current = newValue;\n return newValue;\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n [...dependencies]);\n}\n\nfunction useNodeRef(onChange) {\n const onChangeHandler = useEvent(onChange);\n const node = useRef(null);\n const setNodeRef = useCallback(element => {\n if (element !== node.current) {\n onChangeHandler == null ? void 0 : onChangeHandler(element, node.current);\n }\n\n node.current = element;\n }, //eslint-disable-next-line\n []);\n return [node, setNodeRef];\n}\n\nfunction usePrevious(value) {\n const ref = useRef();\n useEffect(() => {\n ref.current = value;\n }, [value]);\n return ref.current;\n}\n\nlet ids = {};\nfunction useUniqueId(prefix, value) {\n return useMemo(() => {\n if (value) {\n return value;\n }\n\n const id = ids[prefix] == null ? 0 : ids[prefix] + 1;\n ids[prefix] = id;\n return prefix + \"-\" + id;\n }, [prefix, value]);\n}\n\nfunction createAdjustmentFn(modifier) {\n return function (object) {\n for (var _len = arguments.length, adjustments = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n adjustments[_key - 1] = arguments[_key];\n }\n\n return adjustments.reduce((accumulator, adjustment) => {\n const entries = Object.entries(adjustment);\n\n for (const [key, valueAdjustment] of entries) {\n const value = accumulator[key];\n\n if (value != null) {\n accumulator[key] = value + modifier * valueAdjustment;\n }\n }\n\n return accumulator;\n }, { ...object\n });\n };\n}\n\nconst add = /*#__PURE__*/createAdjustmentFn(1);\nconst subtract = /*#__PURE__*/createAdjustmentFn(-1);\n\nfunction hasViewportRelativeCoordinates(event) {\n return 'clientX' in event && 'clientY' in event;\n}\n\nfunction isKeyboardEvent(event) {\n if (!event) {\n return false;\n }\n\n const {\n KeyboardEvent\n } = getWindow(event.target);\n return KeyboardEvent && event instanceof KeyboardEvent;\n}\n\nfunction isTouchEvent(event) {\n if (!event) {\n return false;\n }\n\n const {\n TouchEvent\n } = getWindow(event.target);\n return TouchEvent && event instanceof TouchEvent;\n}\n\n/**\r\n * Returns the normalized x and y coordinates for mouse and touch events.\r\n */\n\nfunction getEventCoordinates(event) {\n if (isTouchEvent(event)) {\n if (event.touches && event.touches.length) {\n const {\n clientX: x,\n clientY: y\n } = event.touches[0];\n return {\n x,\n y\n };\n } else if (event.changedTouches && event.changedTouches.length) {\n const {\n clientX: x,\n clientY: y\n } = event.changedTouches[0];\n return {\n x,\n y\n };\n }\n }\n\n if (hasViewportRelativeCoordinates(event)) {\n return {\n x: event.clientX,\n y: event.clientY\n };\n }\n\n return null;\n}\n\nconst CSS = /*#__PURE__*/Object.freeze({\n Translate: {\n toString(transform) {\n if (!transform) {\n return;\n }\n\n const {\n x,\n y\n } = transform;\n return \"translate3d(\" + (x ? Math.round(x) : 0) + \"px, \" + (y ? Math.round(y) : 0) + \"px, 0)\";\n }\n\n },\n Scale: {\n toString(transform) {\n if (!transform) {\n return;\n }\n\n const {\n scaleX,\n scaleY\n } = transform;\n return \"scaleX(\" + scaleX + \") scaleY(\" + scaleY + \")\";\n }\n\n },\n Transform: {\n toString(transform) {\n if (!transform) {\n return;\n }\n\n return [CSS.Translate.toString(transform), CSS.Scale.toString(transform)].join(' ');\n }\n\n },\n Transition: {\n toString(_ref) {\n let {\n property,\n duration,\n easing\n } = _ref;\n return property + \" \" + duration + \"ms \" + easing;\n }\n\n }\n});\n\nconst SELECTOR = 'a,frame,iframe,input:not([type=hidden]):not(:disabled),select:not(:disabled),textarea:not(:disabled),button:not(:disabled),*[tabindex]';\nfunction findFirstFocusableNode(element) {\n if (element.matches(SELECTOR)) {\n return element;\n }\n\n return element.querySelector(SELECTOR);\n}\n\nexport { CSS, add, canUseDOM, findFirstFocusableNode, getEventCoordinates, getOwnerDocument, getWindow, hasViewportRelativeCoordinates, isDocument, isHTMLElement, isKeyboardEvent, isNode, isSVGElement, isTouchEvent, isWindow, subtract, useCombinedRefs, useEvent, useInterval, useIsomorphicLayoutEffect, useLatestValue, useLazyMemo, useNodeRef, usePrevious, useUniqueId };\n//# sourceMappingURL=utilities.esm.js.map\n","import React, { useState, useCallback } from 'react';\n\nconst hiddenStyles = {\n display: 'none'\n};\nfunction HiddenText(_ref) {\n let {\n id,\n value\n } = _ref;\n return React.createElement(\"div\", {\n id: id,\n style: hiddenStyles\n }, value);\n}\n\nfunction LiveRegion(_ref) {\n let {\n id,\n announcement,\n ariaLiveType = \"assertive\"\n } = _ref;\n // Hide element visually but keep it readable by screen readers\n const visuallyHidden = {\n position: 'fixed',\n top: 0,\n left: 0,\n width: 1,\n height: 1,\n margin: -1,\n border: 0,\n padding: 0,\n overflow: 'hidden',\n clip: 'rect(0 0 0 0)',\n clipPath: 'inset(100%)',\n whiteSpace: 'nowrap'\n };\n return React.createElement(\"div\", {\n id: id,\n style: visuallyHidden,\n role: \"status\",\n \"aria-live\": ariaLiveType,\n \"aria-atomic\": true\n }, announcement);\n}\n\nfunction useAnnouncement() {\n const [announcement, setAnnouncement] = useState('');\n const announce = useCallback(value => {\n if (value != null) {\n setAnnouncement(value);\n }\n }, []);\n return {\n announce,\n announcement\n };\n}\n\nexport { HiddenText, LiveRegion, useAnnouncement };\n//# sourceMappingURL=accessibility.esm.js.map\n","import React, { createContext, useContext, useEffect, useState, useCallback, useMemo, useRef, memo, useReducer, cloneElement, forwardRef } from 'react';\nimport { createPortal, unstable_batchedUpdates } from 'react-dom';\nimport { useUniqueId, getEventCoordinates, getWindow, isDocument, isHTMLElement, isSVGElement, canUseDOM, isWindow, isNode, getOwnerDocument, add, isKeyboardEvent, subtract, useLazyMemo, useInterval, usePrevious, useLatestValue, useEvent, useIsomorphicLayoutEffect, useNodeRef, findFirstFocusableNode, CSS } from '@dnd-kit/utilities';\nimport { useAnnouncement, HiddenText, LiveRegion } from '@dnd-kit/accessibility';\n\nconst DndMonitorContext = /*#__PURE__*/createContext(null);\n\nfunction useDndMonitor(listener) {\n const registerListener = useContext(DndMonitorContext);\n useEffect(() => {\n if (!registerListener) {\n throw new Error('useDndMonitor must be used within a children of ');\n }\n\n const unsubscribe = registerListener(listener);\n return unsubscribe;\n }, [listener, registerListener]);\n}\n\nfunction useDndMonitorProvider() {\n const [listeners] = useState(() => new Set());\n const registerListener = useCallback(listener => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n }, [listeners]);\n const dispatch = useCallback(_ref => {\n let {\n type,\n event\n } = _ref;\n listeners.forEach(listener => {\n var _listener$type;\n\n return (_listener$type = listener[type]) == null ? void 0 : _listener$type.call(listener, event);\n });\n }, [listeners]);\n return [dispatch, registerListener];\n}\n\nconst defaultScreenReaderInstructions = {\n draggable: \"\\n To pick up a draggable item, press the space bar.\\n While dragging, use the arrow keys to move the item.\\n Press space again to drop the item in its new position, or press escape to cancel.\\n \"\n};\nconst defaultAnnouncements = {\n onDragStart(_ref) {\n let {\n active\n } = _ref;\n return \"Picked up draggable item \" + active.id + \".\";\n },\n\n onDragOver(_ref2) {\n let {\n active,\n over\n } = _ref2;\n\n if (over) {\n return \"Draggable item \" + active.id + \" was moved over droppable area \" + over.id + \".\";\n }\n\n return \"Draggable item \" + active.id + \" is no longer over a droppable area.\";\n },\n\n onDragEnd(_ref3) {\n let {\n active,\n over\n } = _ref3;\n\n if (over) {\n return \"Draggable item \" + active.id + \" was dropped over droppable area \" + over.id;\n }\n\n return \"Draggable item \" + active.id + \" was dropped.\";\n },\n\n onDragCancel(_ref4) {\n let {\n active\n } = _ref4;\n return \"Dragging was cancelled. Draggable item \" + active.id + \" was dropped.\";\n }\n\n};\n\nfunction Accessibility(_ref) {\n let {\n announcements = defaultAnnouncements,\n container,\n hiddenTextDescribedById,\n screenReaderInstructions = defaultScreenReaderInstructions\n } = _ref;\n const {\n announce,\n announcement\n } = useAnnouncement();\n const liveRegionId = useUniqueId(\"DndLiveRegion\");\n const [mounted, setMounted] = useState(false);\n useEffect(() => {\n setMounted(true);\n }, []);\n useDndMonitor(useMemo(() => ({\n onDragStart(_ref2) {\n let {\n active\n } = _ref2;\n announce(announcements.onDragStart({\n active\n }));\n },\n\n onDragMove(_ref3) {\n let {\n active,\n over\n } = _ref3;\n\n if (announcements.onDragMove) {\n announce(announcements.onDragMove({\n active,\n over\n }));\n }\n },\n\n onDragOver(_ref4) {\n let {\n active,\n over\n } = _ref4;\n announce(announcements.onDragOver({\n active,\n over\n }));\n },\n\n onDragEnd(_ref5) {\n let {\n active,\n over\n } = _ref5;\n announce(announcements.onDragEnd({\n active,\n over\n }));\n },\n\n onDragCancel(_ref6) {\n let {\n active,\n over\n } = _ref6;\n announce(announcements.onDragCancel({\n active,\n over\n }));\n }\n\n }), [announce, announcements]));\n\n if (!mounted) {\n return null;\n }\n\n const markup = React.createElement(React.Fragment, null, React.createElement(HiddenText, {\n id: hiddenTextDescribedById,\n value: screenReaderInstructions.draggable\n }), React.createElement(LiveRegion, {\n id: liveRegionId,\n announcement: announcement\n }));\n return container ? createPortal(markup, container) : markup;\n}\n\nvar Action;\n\n(function (Action) {\n Action[\"DragStart\"] = \"dragStart\";\n Action[\"DragMove\"] = \"dragMove\";\n Action[\"DragEnd\"] = \"dragEnd\";\n Action[\"DragCancel\"] = \"dragCancel\";\n Action[\"DragOver\"] = \"dragOver\";\n Action[\"RegisterDroppable\"] = \"registerDroppable\";\n Action[\"SetDroppableDisabled\"] = \"setDroppableDisabled\";\n Action[\"UnregisterDroppable\"] = \"unregisterDroppable\";\n})(Action || (Action = {}));\n\nfunction noop() {}\n\nfunction useSensor(sensor, options) {\n return useMemo(() => ({\n sensor,\n options: options != null ? options : {}\n }), // eslint-disable-next-line react-hooks/exhaustive-deps\n [sensor, options]);\n}\n\nfunction useSensors() {\n for (var _len = arguments.length, sensors = new Array(_len), _key = 0; _key < _len; _key++) {\n sensors[_key] = arguments[_key];\n }\n\n return useMemo(() => [...sensors].filter(sensor => sensor != null), // eslint-disable-next-line react-hooks/exhaustive-deps\n [...sensors]);\n}\n\nconst defaultCoordinates = /*#__PURE__*/Object.freeze({\n x: 0,\n y: 0\n});\n\n/**\r\n * Returns the distance between two points\r\n */\nfunction distanceBetween(p1, p2) {\n return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2));\n}\n\nfunction getRelativeTransformOrigin(event, rect) {\n const eventCoordinates = getEventCoordinates(event);\n\n if (!eventCoordinates) {\n return '0 0';\n }\n\n const transformOrigin = {\n x: (eventCoordinates.x - rect.left) / rect.width * 100,\n y: (eventCoordinates.y - rect.top) / rect.height * 100\n };\n return transformOrigin.x + \"% \" + transformOrigin.y + \"%\";\n}\n\n/**\r\n * Sort collisions from smallest to greatest value\r\n */\nfunction sortCollisionsAsc(_ref, _ref2) {\n let {\n data: {\n value: a\n }\n } = _ref;\n let {\n data: {\n value: b\n }\n } = _ref2;\n return a - b;\n}\n/**\r\n * Sort collisions from greatest to smallest value\r\n */\n\nfunction sortCollisionsDesc(_ref3, _ref4) {\n let {\n data: {\n value: a\n }\n } = _ref3;\n let {\n data: {\n value: b\n }\n } = _ref4;\n return b - a;\n}\n/**\r\n * Returns the coordinates of the corners of a given rectangle:\r\n * [TopLeft {x, y}, TopRight {x, y}, BottomLeft {x, y}, BottomRight {x, y}]\r\n */\n\nfunction cornersOfRectangle(_ref5) {\n let {\n left,\n top,\n height,\n width\n } = _ref5;\n return [{\n x: left,\n y: top\n }, {\n x: left + width,\n y: top\n }, {\n x: left,\n y: top + height\n }, {\n x: left + width,\n y: top + height\n }];\n}\nfunction getFirstCollision(collisions, property) {\n if (!collisions || collisions.length === 0) {\n return null;\n }\n\n const [firstCollision] = collisions;\n return property ? firstCollision[property] : firstCollision;\n}\n\n/**\r\n * Returns the coordinates of the center of a given ClientRect\r\n */\n\nfunction centerOfRectangle(rect, left, top) {\n if (left === void 0) {\n left = rect.left;\n }\n\n if (top === void 0) {\n top = rect.top;\n }\n\n return {\n x: left + rect.width * 0.5,\n y: top + rect.height * 0.5\n };\n}\n/**\r\n * Returns the closest rectangles from an array of rectangles to the center of a given\r\n * rectangle.\r\n */\n\n\nconst closestCenter = _ref => {\n let {\n collisionRect,\n droppableRects,\n droppableContainers\n } = _ref;\n const centerRect = centerOfRectangle(collisionRect, collisionRect.left, collisionRect.top);\n const collisions = [];\n\n for (const droppableContainer of droppableContainers) {\n const {\n id\n } = droppableContainer;\n const rect = droppableRects.get(id);\n\n if (rect) {\n const distBetween = distanceBetween(centerOfRectangle(rect), centerRect);\n collisions.push({\n id,\n data: {\n droppableContainer,\n value: distBetween\n }\n });\n }\n }\n\n return collisions.sort(sortCollisionsAsc);\n};\n\n/**\r\n * Returns the closest rectangles from an array of rectangles to the corners of\r\n * another rectangle.\r\n */\n\nconst closestCorners = _ref => {\n let {\n collisionRect,\n droppableRects,\n droppableContainers\n } = _ref;\n const corners = cornersOfRectangle(collisionRect);\n const collisions = [];\n\n for (const droppableContainer of droppableContainers) {\n const {\n id\n } = droppableContainer;\n const rect = droppableRects.get(id);\n\n if (rect) {\n const rectCorners = cornersOfRectangle(rect);\n const distances = corners.reduce((accumulator, corner, index) => {\n return accumulator + distanceBetween(rectCorners[index], corner);\n }, 0);\n const effectiveDistance = Number((distances / 4).toFixed(4));\n collisions.push({\n id,\n data: {\n droppableContainer,\n value: effectiveDistance\n }\n });\n }\n }\n\n return collisions.sort(sortCollisionsAsc);\n};\n\n/**\r\n * Returns the intersecting rectangle area between two rectangles\r\n */\n\nfunction getIntersectionRatio(entry, target) {\n const top = Math.max(target.top, entry.top);\n const left = Math.max(target.left, entry.left);\n const right = Math.min(target.left + target.width, entry.left + entry.width);\n const bottom = Math.min(target.top + target.height, entry.top + entry.height);\n const width = right - left;\n const height = bottom - top;\n\n if (left < right && top < bottom) {\n const targetArea = target.width * target.height;\n const entryArea = entry.width * entry.height;\n const intersectionArea = width * height;\n const intersectionRatio = intersectionArea / (targetArea + entryArea - intersectionArea);\n return Number(intersectionRatio.toFixed(4));\n } // Rectangles do not overlap, or overlap has an area of zero (edge/corner overlap)\n\n\n return 0;\n}\n/**\r\n * Returns the rectangles that has the greatest intersection area with a given\r\n * rectangle in an array of rectangles.\r\n */\n\nconst rectIntersection = _ref => {\n let {\n collisionRect,\n droppableRects,\n droppableContainers\n } = _ref;\n const collisions = [];\n\n for (const droppableContainer of droppableContainers) {\n const {\n id\n } = droppableContainer;\n const rect = droppableRects.get(id);\n\n if (rect) {\n const intersectionRatio = getIntersectionRatio(rect, collisionRect);\n\n if (intersectionRatio > 0) {\n collisions.push({\n id,\n data: {\n droppableContainer,\n value: intersectionRatio\n }\n });\n }\n }\n }\n\n return collisions.sort(sortCollisionsDesc);\n};\n\n/**\r\n * Check if a given point is contained within a bounding rectangle\r\n */\n\nfunction isPointWithinRect(point, rect) {\n const {\n top,\n left,\n bottom,\n right\n } = rect;\n return top <= point.y && point.y <= bottom && left <= point.x && point.x <= right;\n}\n/**\r\n * Returns the rectangles that the pointer is hovering over\r\n */\n\n\nconst pointerWithin = _ref => {\n let {\n droppableContainers,\n droppableRects,\n pointerCoordinates\n } = _ref;\n\n if (!pointerCoordinates) {\n return [];\n }\n\n const collisions = [];\n\n for (const droppableContainer of droppableContainers) {\n const {\n id\n } = droppableContainer;\n const rect = droppableRects.get(id);\n\n if (rect && isPointWithinRect(pointerCoordinates, rect)) {\n /* There may be more than a single rectangle intersecting\r\n * with the pointer coordinates. In order to sort the\r\n * colliding rectangles, we measure the distance between\r\n * the pointer and the corners of the intersecting rectangle\r\n */\n const corners = cornersOfRectangle(rect);\n const distances = corners.reduce((accumulator, corner) => {\n return accumulator + distanceBetween(pointerCoordinates, corner);\n }, 0);\n const effectiveDistance = Number((distances / 4).toFixed(4));\n collisions.push({\n id,\n data: {\n droppableContainer,\n value: effectiveDistance\n }\n });\n }\n }\n\n return collisions.sort(sortCollisionsAsc);\n};\n\nfunction adjustScale(transform, rect1, rect2) {\n return { ...transform,\n scaleX: rect1 && rect2 ? rect1.width / rect2.width : 1,\n scaleY: rect1 && rect2 ? rect1.height / rect2.height : 1\n };\n}\n\nfunction getRectDelta(rect1, rect2) {\n return rect1 && rect2 ? {\n x: rect1.left - rect2.left,\n y: rect1.top - rect2.top\n } : defaultCoordinates;\n}\n\nfunction createRectAdjustmentFn(modifier) {\n return function adjustClientRect(rect) {\n for (var _len = arguments.length, adjustments = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n adjustments[_key - 1] = arguments[_key];\n }\n\n return adjustments.reduce((acc, adjustment) => ({ ...acc,\n top: acc.top + modifier * adjustment.y,\n bottom: acc.bottom + modifier * adjustment.y,\n left: acc.left + modifier * adjustment.x,\n right: acc.right + modifier * adjustment.x\n }), { ...rect\n });\n };\n}\nconst getAdjustedRect = /*#__PURE__*/createRectAdjustmentFn(1);\n\nfunction parseTransform(transform) {\n if (transform.startsWith('matrix3d(')) {\n const transformArray = transform.slice(9, -1).split(/, /);\n return {\n x: +transformArray[12],\n y: +transformArray[13],\n scaleX: +transformArray[0],\n scaleY: +transformArray[5]\n };\n } else if (transform.startsWith('matrix(')) {\n const transformArray = transform.slice(7, -1).split(/, /);\n return {\n x: +transformArray[4],\n y: +transformArray[5],\n scaleX: +transformArray[0],\n scaleY: +transformArray[3]\n };\n }\n\n return null;\n}\n\nfunction inverseTransform(rect, transform, transformOrigin) {\n const parsedTransform = parseTransform(transform);\n\n if (!parsedTransform) {\n return rect;\n }\n\n const {\n scaleX,\n scaleY,\n x: translateX,\n y: translateY\n } = parsedTransform;\n const x = rect.left - translateX - (1 - scaleX) * parseFloat(transformOrigin);\n const y = rect.top - translateY - (1 - scaleY) * parseFloat(transformOrigin.slice(transformOrigin.indexOf(' ') + 1));\n const w = scaleX ? rect.width / scaleX : rect.width;\n const h = scaleY ? rect.height / scaleY : rect.height;\n return {\n width: w,\n height: h,\n top: y,\n right: x + w,\n bottom: y + h,\n left: x\n };\n}\n\nconst defaultOptions = {\n ignoreTransform: false\n};\n/**\r\n * Returns the bounding client rect of an element relative to the viewport.\r\n */\n\nfunction getClientRect(element, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n let rect = element.getBoundingClientRect();\n\n if (options.ignoreTransform) {\n const {\n transform,\n transformOrigin\n } = getWindow(element).getComputedStyle(element);\n\n if (transform) {\n rect = inverseTransform(rect, transform, transformOrigin);\n }\n }\n\n const {\n top,\n left,\n width,\n height,\n bottom,\n right\n } = rect;\n return {\n top,\n left,\n width,\n height,\n bottom,\n right\n };\n}\n/**\r\n * Returns the bounding client rect of an element relative to the viewport.\r\n *\r\n * @remarks\r\n * The ClientRect returned by this method does not take into account transforms\r\n * applied to the element it measures.\r\n *\r\n */\n\nfunction getTransformAgnosticClientRect(element) {\n return getClientRect(element, {\n ignoreTransform: true\n });\n}\n\nfunction getWindowClientRect(element) {\n const width = element.innerWidth;\n const height = element.innerHeight;\n return {\n top: 0,\n left: 0,\n right: width,\n bottom: height,\n width,\n height\n };\n}\n\nfunction isFixed(node, computedStyle) {\n if (computedStyle === void 0) {\n computedStyle = getWindow(node).getComputedStyle(node);\n }\n\n return computedStyle.position === 'fixed';\n}\n\nfunction isScrollable(element, computedStyle) {\n if (computedStyle === void 0) {\n computedStyle = getWindow(element).getComputedStyle(element);\n }\n\n const overflowRegex = /(auto|scroll|overlay)/;\n const properties = ['overflow', 'overflowX', 'overflowY'];\n return properties.some(property => {\n const value = computedStyle[property];\n return typeof value === 'string' ? overflowRegex.test(value) : false;\n });\n}\n\nfunction getScrollableAncestors(element, limit) {\n const scrollParents = [];\n\n function findScrollableAncestors(node) {\n if (limit != null && scrollParents.length >= limit) {\n return scrollParents;\n }\n\n if (!node) {\n return scrollParents;\n }\n\n if (isDocument(node) && node.scrollingElement != null && !scrollParents.includes(node.scrollingElement)) {\n scrollParents.push(node.scrollingElement);\n return scrollParents;\n }\n\n if (!isHTMLElement(node) || isSVGElement(node)) {\n return scrollParents;\n }\n\n if (scrollParents.includes(node)) {\n return scrollParents;\n }\n\n const computedStyle = getWindow(element).getComputedStyle(node);\n\n if (node !== element) {\n if (isScrollable(node, computedStyle)) {\n scrollParents.push(node);\n }\n }\n\n if (isFixed(node, computedStyle)) {\n return scrollParents;\n }\n\n return findScrollableAncestors(node.parentNode);\n }\n\n if (!element) {\n return scrollParents;\n }\n\n return findScrollableAncestors(element);\n}\nfunction getFirstScrollableAncestor(node) {\n const [firstScrollableAncestor] = getScrollableAncestors(node, 1);\n return firstScrollableAncestor != null ? firstScrollableAncestor : null;\n}\n\nfunction getScrollableElement(element) {\n if (!canUseDOM || !element) {\n return null;\n }\n\n if (isWindow(element)) {\n return element;\n }\n\n if (!isNode(element)) {\n return null;\n }\n\n if (isDocument(element) || element === getOwnerDocument(element).scrollingElement) {\n return window;\n }\n\n if (isHTMLElement(element)) {\n return element;\n }\n\n return null;\n}\n\nfunction getScrollXCoordinate(element) {\n if (isWindow(element)) {\n return element.scrollX;\n }\n\n return element.scrollLeft;\n}\nfunction getScrollYCoordinate(element) {\n if (isWindow(element)) {\n return element.scrollY;\n }\n\n return element.scrollTop;\n}\nfunction getScrollCoordinates(element) {\n return {\n x: getScrollXCoordinate(element),\n y: getScrollYCoordinate(element)\n };\n}\n\nvar Direction;\n\n(function (Direction) {\n Direction[Direction[\"Forward\"] = 1] = \"Forward\";\n Direction[Direction[\"Backward\"] = -1] = \"Backward\";\n})(Direction || (Direction = {}));\n\nfunction isDocumentScrollingElement(element) {\n if (!canUseDOM || !element) {\n return false;\n }\n\n return element === document.scrollingElement;\n}\n\nfunction getScrollPosition(scrollingContainer) {\n const minScroll = {\n x: 0,\n y: 0\n };\n const dimensions = isDocumentScrollingElement(scrollingContainer) ? {\n height: window.innerHeight,\n width: window.innerWidth\n } : {\n height: scrollingContainer.clientHeight,\n width: scrollingContainer.clientWidth\n };\n const maxScroll = {\n x: scrollingContainer.scrollWidth - dimensions.width,\n y: scrollingContainer.scrollHeight - dimensions.height\n };\n const isTop = scrollingContainer.scrollTop <= minScroll.y;\n const isLeft = scrollingContainer.scrollLeft <= minScroll.x;\n const isBottom = scrollingContainer.scrollTop >= maxScroll.y;\n const isRight = scrollingContainer.scrollLeft >= maxScroll.x;\n return {\n isTop,\n isLeft,\n isBottom,\n isRight,\n maxScroll,\n minScroll\n };\n}\n\nconst defaultThreshold = {\n x: 0.2,\n y: 0.2\n};\nfunction getScrollDirectionAndSpeed(scrollContainer, scrollContainerRect, _ref, acceleration, thresholdPercentage) {\n let {\n top,\n left,\n right,\n bottom\n } = _ref;\n\n if (acceleration === void 0) {\n acceleration = 10;\n }\n\n if (thresholdPercentage === void 0) {\n thresholdPercentage = defaultThreshold;\n }\n\n const {\n isTop,\n isBottom,\n isLeft,\n isRight\n } = getScrollPosition(scrollContainer);\n const direction = {\n x: 0,\n y: 0\n };\n const speed = {\n x: 0,\n y: 0\n };\n const threshold = {\n height: scrollContainerRect.height * thresholdPercentage.y,\n width: scrollContainerRect.width * thresholdPercentage.x\n };\n\n if (!isTop && top <= scrollContainerRect.top + threshold.height) {\n // Scroll Up\n direction.y = Direction.Backward;\n speed.y = acceleration * Math.abs((scrollContainerRect.top + threshold.height - top) / threshold.height);\n } else if (!isBottom && bottom >= scrollContainerRect.bottom - threshold.height) {\n // Scroll Down\n direction.y = Direction.Forward;\n speed.y = acceleration * Math.abs((scrollContainerRect.bottom - threshold.height - bottom) / threshold.height);\n }\n\n if (!isRight && right >= scrollContainerRect.right - threshold.width) {\n // Scroll Right\n direction.x = Direction.Forward;\n speed.x = acceleration * Math.abs((scrollContainerRect.right - threshold.width - right) / threshold.width);\n } else if (!isLeft && left <= scrollContainerRect.left + threshold.width) {\n // Scroll Left\n direction.x = Direction.Backward;\n speed.x = acceleration * Math.abs((scrollContainerRect.left + threshold.width - left) / threshold.width);\n }\n\n return {\n direction,\n speed\n };\n}\n\nfunction getScrollElementRect(element) {\n if (element === document.scrollingElement) {\n const {\n innerWidth,\n innerHeight\n } = window;\n return {\n top: 0,\n left: 0,\n right: innerWidth,\n bottom: innerHeight,\n width: innerWidth,\n height: innerHeight\n };\n }\n\n const {\n top,\n left,\n right,\n bottom\n } = element.getBoundingClientRect();\n return {\n top,\n left,\n right,\n bottom,\n width: element.clientWidth,\n height: element.clientHeight\n };\n}\n\nfunction getScrollOffsets(scrollableAncestors) {\n return scrollableAncestors.reduce((acc, node) => {\n return add(acc, getScrollCoordinates(node));\n }, defaultCoordinates);\n}\nfunction getScrollXOffset(scrollableAncestors) {\n return scrollableAncestors.reduce((acc, node) => {\n return acc + getScrollXCoordinate(node);\n }, 0);\n}\nfunction getScrollYOffset(scrollableAncestors) {\n return scrollableAncestors.reduce((acc, node) => {\n return acc + getScrollYCoordinate(node);\n }, 0);\n}\n\nfunction scrollIntoViewIfNeeded(element, measure) {\n if (measure === void 0) {\n measure = getClientRect;\n }\n\n if (!element) {\n return;\n }\n\n const {\n top,\n left,\n bottom,\n right\n } = measure(element);\n const firstScrollableAncestor = getFirstScrollableAncestor(element);\n\n if (!firstScrollableAncestor) {\n return;\n }\n\n if (bottom <= 0 || right <= 0 || top >= window.innerHeight || left >= window.innerWidth) {\n element.scrollIntoView({\n block: 'center',\n inline: 'center'\n });\n }\n}\n\nconst properties = [['x', ['left', 'right'], getScrollXOffset], ['y', ['top', 'bottom'], getScrollYOffset]];\nclass Rect {\n constructor(rect, element) {\n this.rect = void 0;\n this.width = void 0;\n this.height = void 0;\n this.top = void 0;\n this.bottom = void 0;\n this.right = void 0;\n this.left = void 0;\n const scrollableAncestors = getScrollableAncestors(element);\n const scrollOffsets = getScrollOffsets(scrollableAncestors);\n this.rect = { ...rect\n };\n this.width = rect.width;\n this.height = rect.height;\n\n for (const [axis, keys, getScrollOffset] of properties) {\n for (const key of keys) {\n Object.defineProperty(this, key, {\n get: () => {\n const currentOffsets = getScrollOffset(scrollableAncestors);\n const scrollOffsetsDeltla = scrollOffsets[axis] - currentOffsets;\n return this.rect[key] + scrollOffsetsDeltla;\n },\n enumerable: true\n });\n }\n }\n\n Object.defineProperty(this, 'rect', {\n enumerable: false\n });\n }\n\n}\n\nclass Listeners {\n constructor(target) {\n this.target = void 0;\n this.listeners = [];\n\n this.removeAll = () => {\n this.listeners.forEach(listener => {\n var _this$target;\n\n return (_this$target = this.target) == null ? void 0 : _this$target.removeEventListener(...listener);\n });\n };\n\n this.target = target;\n }\n\n add(eventName, handler, options) {\n var _this$target2;\n\n (_this$target2 = this.target) == null ? void 0 : _this$target2.addEventListener(eventName, handler, options);\n this.listeners.push([eventName, handler, options]);\n }\n\n}\n\nfunction getEventListenerTarget(target) {\n // If the `event.target` element is removed from the document events will still be targeted\n // at it, and hence won't always bubble up to the window or document anymore.\n // If there is any risk of an element being removed while it is being dragged,\n // the best practice is to attach the event listeners directly to the target.\n // https://developer.mozilla.org/en-US/docs/Web/API/EventTarget\n const {\n EventTarget\n } = getWindow(target);\n return target instanceof EventTarget ? target : getOwnerDocument(target);\n}\n\nfunction hasExceededDistance(delta, measurement) {\n const dx = Math.abs(delta.x);\n const dy = Math.abs(delta.y);\n\n if (typeof measurement === 'number') {\n return Math.sqrt(dx ** 2 + dy ** 2) > measurement;\n }\n\n if ('x' in measurement && 'y' in measurement) {\n return dx > measurement.x && dy > measurement.y;\n }\n\n if ('x' in measurement) {\n return dx > measurement.x;\n }\n\n if ('y' in measurement) {\n return dy > measurement.y;\n }\n\n return false;\n}\n\nvar EventName;\n\n(function (EventName) {\n EventName[\"Click\"] = \"click\";\n EventName[\"DragStart\"] = \"dragstart\";\n EventName[\"Keydown\"] = \"keydown\";\n EventName[\"ContextMenu\"] = \"contextmenu\";\n EventName[\"Resize\"] = \"resize\";\n EventName[\"SelectionChange\"] = \"selectionchange\";\n EventName[\"VisibilityChange\"] = \"visibilitychange\";\n})(EventName || (EventName = {}));\n\nfunction preventDefault(event) {\n event.preventDefault();\n}\nfunction stopPropagation(event) {\n event.stopPropagation();\n}\n\nvar KeyboardCode;\n\n(function (KeyboardCode) {\n KeyboardCode[\"Space\"] = \"Space\";\n KeyboardCode[\"Down\"] = \"ArrowDown\";\n KeyboardCode[\"Right\"] = \"ArrowRight\";\n KeyboardCode[\"Left\"] = \"ArrowLeft\";\n KeyboardCode[\"Up\"] = \"ArrowUp\";\n KeyboardCode[\"Esc\"] = \"Escape\";\n KeyboardCode[\"Enter\"] = \"Enter\";\n KeyboardCode[\"Tab\"] = \"Tab\";\n})(KeyboardCode || (KeyboardCode = {}));\n\nconst defaultKeyboardCodes = {\n start: [KeyboardCode.Space, KeyboardCode.Enter],\n cancel: [KeyboardCode.Esc],\n end: [KeyboardCode.Space, KeyboardCode.Enter, KeyboardCode.Tab]\n};\nconst defaultKeyboardCoordinateGetter = (event, _ref) => {\n let {\n currentCoordinates\n } = _ref;\n\n switch (event.code) {\n case KeyboardCode.Right:\n return { ...currentCoordinates,\n x: currentCoordinates.x + 25\n };\n\n case KeyboardCode.Left:\n return { ...currentCoordinates,\n x: currentCoordinates.x - 25\n };\n\n case KeyboardCode.Down:\n return { ...currentCoordinates,\n y: currentCoordinates.y + 25\n };\n\n case KeyboardCode.Up:\n return { ...currentCoordinates,\n y: currentCoordinates.y - 25\n };\n }\n\n return undefined;\n};\n\nclass KeyboardSensor {\n constructor(props) {\n this.props = void 0;\n this.autoScrollEnabled = false;\n this.referenceCoordinates = void 0;\n this.listeners = void 0;\n this.windowListeners = void 0;\n this.props = props;\n const {\n event: {\n target\n }\n } = props;\n this.props = props;\n this.listeners = new Listeners(getOwnerDocument(target));\n this.windowListeners = new Listeners(getWindow(target));\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n this.attach();\n }\n\n attach() {\n this.handleStart();\n this.windowListeners.add(EventName.Resize, this.handleCancel);\n this.windowListeners.add(EventName.VisibilityChange, this.handleCancel);\n setTimeout(() => this.listeners.add(EventName.Keydown, this.handleKeyDown));\n }\n\n handleStart() {\n const {\n activeNode,\n onStart\n } = this.props;\n const node = activeNode.node.current;\n\n if (node) {\n scrollIntoViewIfNeeded(node);\n }\n\n onStart(defaultCoordinates);\n }\n\n handleKeyDown(event) {\n if (isKeyboardEvent(event)) {\n const {\n active,\n context,\n options\n } = this.props;\n const {\n keyboardCodes = defaultKeyboardCodes,\n coordinateGetter = defaultKeyboardCoordinateGetter,\n scrollBehavior = 'smooth'\n } = options;\n const {\n code\n } = event;\n\n if (keyboardCodes.end.includes(code)) {\n this.handleEnd(event);\n return;\n }\n\n if (keyboardCodes.cancel.includes(code)) {\n this.handleCancel(event);\n return;\n }\n\n const {\n collisionRect\n } = context.current;\n const currentCoordinates = collisionRect ? {\n x: collisionRect.left,\n y: collisionRect.top\n } : defaultCoordinates;\n\n if (!this.referenceCoordinates) {\n this.referenceCoordinates = currentCoordinates;\n }\n\n const newCoordinates = coordinateGetter(event, {\n active,\n context: context.current,\n currentCoordinates\n });\n\n if (newCoordinates) {\n const coordinatesDelta = subtract(newCoordinates, currentCoordinates);\n const scrollDelta = {\n x: 0,\n y: 0\n };\n const {\n scrollableAncestors\n } = context.current;\n\n for (const scrollContainer of scrollableAncestors) {\n const direction = event.code;\n const {\n isTop,\n isRight,\n isLeft,\n isBottom,\n maxScroll,\n minScroll\n } = getScrollPosition(scrollContainer);\n const scrollElementRect = getScrollElementRect(scrollContainer);\n const clampedCoordinates = {\n x: Math.min(direction === KeyboardCode.Right ? scrollElementRect.right - scrollElementRect.width / 2 : scrollElementRect.right, Math.max(direction === KeyboardCode.Right ? scrollElementRect.left : scrollElementRect.left + scrollElementRect.width / 2, newCoordinates.x)),\n y: Math.min(direction === KeyboardCode.Down ? scrollElementRect.bottom - scrollElementRect.height / 2 : scrollElementRect.bottom, Math.max(direction === KeyboardCode.Down ? scrollElementRect.top : scrollElementRect.top + scrollElementRect.height / 2, newCoordinates.y))\n };\n const canScrollX = direction === KeyboardCode.Right && !isRight || direction === KeyboardCode.Left && !isLeft;\n const canScrollY = direction === KeyboardCode.Down && !isBottom || direction === KeyboardCode.Up && !isTop;\n\n if (canScrollX && clampedCoordinates.x !== newCoordinates.x) {\n const newScrollCoordinates = scrollContainer.scrollLeft + coordinatesDelta.x;\n const canScrollToNewCoordinates = direction === KeyboardCode.Right && newScrollCoordinates <= maxScroll.x || direction === KeyboardCode.Left && newScrollCoordinates >= minScroll.x;\n\n if (canScrollToNewCoordinates && !coordinatesDelta.y) {\n // We don't need to update coordinates, the scroll adjustment alone will trigger\n // logic to auto-detect the new container we are over\n scrollContainer.scrollTo({\n left: newScrollCoordinates,\n behavior: scrollBehavior\n });\n return;\n }\n\n if (canScrollToNewCoordinates) {\n scrollDelta.x = scrollContainer.scrollLeft - newScrollCoordinates;\n } else {\n scrollDelta.x = direction === KeyboardCode.Right ? scrollContainer.scrollLeft - maxScroll.x : scrollContainer.scrollLeft - minScroll.x;\n }\n\n if (scrollDelta.x) {\n scrollContainer.scrollBy({\n left: -scrollDelta.x,\n behavior: scrollBehavior\n });\n }\n\n break;\n } else if (canScrollY && clampedCoordinates.y !== newCoordinates.y) {\n const newScrollCoordinates = scrollContainer.scrollTop + coordinatesDelta.y;\n const canScrollToNewCoordinates = direction === KeyboardCode.Down && newScrollCoordinates <= maxScroll.y || direction === KeyboardCode.Up && newScrollCoordinates >= minScroll.y;\n\n if (canScrollToNewCoordinates && !coordinatesDelta.x) {\n // We don't need to update coordinates, the scroll adjustment alone will trigger\n // logic to auto-detect the new container we are over\n scrollContainer.scrollTo({\n top: newScrollCoordinates,\n behavior: scrollBehavior\n });\n return;\n }\n\n if (canScrollToNewCoordinates) {\n scrollDelta.y = scrollContainer.scrollTop - newScrollCoordinates;\n } else {\n scrollDelta.y = direction === KeyboardCode.Down ? scrollContainer.scrollTop - maxScroll.y : scrollContainer.scrollTop - minScroll.y;\n }\n\n if (scrollDelta.y) {\n scrollContainer.scrollBy({\n top: -scrollDelta.y,\n behavior: scrollBehavior\n });\n }\n\n break;\n }\n }\n\n this.handleMove(event, add(subtract(newCoordinates, this.referenceCoordinates), scrollDelta));\n }\n }\n }\n\n handleMove(event, coordinates) {\n const {\n onMove\n } = this.props;\n event.preventDefault();\n onMove(coordinates);\n }\n\n handleEnd(event) {\n const {\n onEnd\n } = this.props;\n event.preventDefault();\n this.detach();\n onEnd();\n }\n\n handleCancel(event) {\n const {\n onCancel\n } = this.props;\n event.preventDefault();\n this.detach();\n onCancel();\n }\n\n detach() {\n this.listeners.removeAll();\n this.windowListeners.removeAll();\n }\n\n}\nKeyboardSensor.activators = [{\n eventName: 'onKeyDown',\n handler: (event, _ref, _ref2) => {\n let {\n keyboardCodes = defaultKeyboardCodes,\n onActivation\n } = _ref;\n let {\n active\n } = _ref2;\n const {\n code\n } = event.nativeEvent;\n\n if (keyboardCodes.start.includes(code)) {\n const activator = active.activatorNode.current;\n\n if (activator && event.target !== activator) {\n return false;\n }\n\n event.preventDefault();\n onActivation == null ? void 0 : onActivation({\n event: event.nativeEvent\n });\n return true;\n }\n\n return false;\n }\n}];\n\nfunction isDistanceConstraint(constraint) {\n return Boolean(constraint && 'distance' in constraint);\n}\n\nfunction isDelayConstraint(constraint) {\n return Boolean(constraint && 'delay' in constraint);\n}\n\nclass AbstractPointerSensor {\n constructor(props, events, listenerTarget) {\n var _getEventCoordinates;\n\n if (listenerTarget === void 0) {\n listenerTarget = getEventListenerTarget(props.event.target);\n }\n\n this.props = void 0;\n this.events = void 0;\n this.autoScrollEnabled = true;\n this.document = void 0;\n this.activated = false;\n this.initialCoordinates = void 0;\n this.timeoutId = null;\n this.listeners = void 0;\n this.documentListeners = void 0;\n this.windowListeners = void 0;\n this.props = props;\n this.events = events;\n const {\n event\n } = props;\n const {\n target\n } = event;\n this.props = props;\n this.events = events;\n this.document = getOwnerDocument(target);\n this.documentListeners = new Listeners(this.document);\n this.listeners = new Listeners(listenerTarget);\n this.windowListeners = new Listeners(getWindow(target));\n this.initialCoordinates = (_getEventCoordinates = getEventCoordinates(event)) != null ? _getEventCoordinates : defaultCoordinates;\n this.handleStart = this.handleStart.bind(this);\n this.handleMove = this.handleMove.bind(this);\n this.handleEnd = this.handleEnd.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n this.handleKeydown = this.handleKeydown.bind(this);\n this.removeTextSelection = this.removeTextSelection.bind(this);\n this.attach();\n }\n\n attach() {\n const {\n events,\n props: {\n options: {\n activationConstraint,\n bypassActivationConstraint\n }\n }\n } = this;\n this.listeners.add(events.move.name, this.handleMove, {\n passive: false\n });\n this.listeners.add(events.end.name, this.handleEnd);\n\n if (events.cancel) {\n this.listeners.add(events.cancel.name, this.handleCancel);\n }\n\n this.windowListeners.add(EventName.Resize, this.handleCancel);\n this.windowListeners.add(EventName.DragStart, preventDefault);\n this.windowListeners.add(EventName.VisibilityChange, this.handleCancel);\n this.windowListeners.add(EventName.ContextMenu, preventDefault);\n this.documentListeners.add(EventName.Keydown, this.handleKeydown);\n\n if (activationConstraint) {\n if (bypassActivationConstraint != null && bypassActivationConstraint({\n event: this.props.event,\n activeNode: this.props.activeNode,\n options: this.props.options\n })) {\n return this.handleStart();\n }\n\n if (isDelayConstraint(activationConstraint)) {\n this.timeoutId = setTimeout(this.handleStart, activationConstraint.delay);\n this.handlePending(activationConstraint);\n return;\n }\n\n if (isDistanceConstraint(activationConstraint)) {\n this.handlePending(activationConstraint);\n return;\n }\n }\n\n this.handleStart();\n }\n\n detach() {\n this.listeners.removeAll();\n this.windowListeners.removeAll(); // Wait until the next event loop before removing document listeners\n // This is necessary because we listen for `click` and `selection` events on the document\n\n setTimeout(this.documentListeners.removeAll, 50);\n\n if (this.timeoutId !== null) {\n clearTimeout(this.timeoutId);\n this.timeoutId = null;\n }\n }\n\n handlePending(constraint, offset) {\n const {\n active,\n onPending\n } = this.props;\n onPending(active, constraint, this.initialCoordinates, offset);\n }\n\n handleStart() {\n const {\n initialCoordinates\n } = this;\n const {\n onStart\n } = this.props;\n\n if (initialCoordinates) {\n this.activated = true; // Stop propagation of click events once activation constraints are met\n\n this.documentListeners.add(EventName.Click, stopPropagation, {\n capture: true\n }); // Remove any text selection from the document\n\n this.removeTextSelection(); // Prevent further text selection while dragging\n\n this.documentListeners.add(EventName.SelectionChange, this.removeTextSelection);\n onStart(initialCoordinates);\n }\n }\n\n handleMove(event) {\n var _getEventCoordinates2;\n\n const {\n activated,\n initialCoordinates,\n props\n } = this;\n const {\n onMove,\n options: {\n activationConstraint\n }\n } = props;\n\n if (!initialCoordinates) {\n return;\n }\n\n const coordinates = (_getEventCoordinates2 = getEventCoordinates(event)) != null ? _getEventCoordinates2 : defaultCoordinates;\n const delta = subtract(initialCoordinates, coordinates); // Constraint validation\n\n if (!activated && activationConstraint) {\n if (isDistanceConstraint(activationConstraint)) {\n if (activationConstraint.tolerance != null && hasExceededDistance(delta, activationConstraint.tolerance)) {\n return this.handleCancel();\n }\n\n if (hasExceededDistance(delta, activationConstraint.distance)) {\n return this.handleStart();\n }\n }\n\n if (isDelayConstraint(activationConstraint)) {\n if (hasExceededDistance(delta, activationConstraint.tolerance)) {\n return this.handleCancel();\n }\n }\n\n this.handlePending(activationConstraint, delta);\n return;\n }\n\n if (event.cancelable) {\n event.preventDefault();\n }\n\n onMove(coordinates);\n }\n\n handleEnd() {\n const {\n onAbort,\n onEnd\n } = this.props;\n this.detach();\n\n if (!this.activated) {\n onAbort(this.props.active);\n }\n\n onEnd();\n }\n\n handleCancel() {\n const {\n onAbort,\n onCancel\n } = this.props;\n this.detach();\n\n if (!this.activated) {\n onAbort(this.props.active);\n }\n\n onCancel();\n }\n\n handleKeydown(event) {\n if (event.code === KeyboardCode.Esc) {\n this.handleCancel();\n }\n }\n\n removeTextSelection() {\n var _this$document$getSel;\n\n (_this$document$getSel = this.document.getSelection()) == null ? void 0 : _this$document$getSel.removeAllRanges();\n }\n\n}\n\nconst events = {\n cancel: {\n name: 'pointercancel'\n },\n move: {\n name: 'pointermove'\n },\n end: {\n name: 'pointerup'\n }\n};\nclass PointerSensor extends AbstractPointerSensor {\n constructor(props) {\n const {\n event\n } = props; // Pointer events stop firing if the target is unmounted while dragging\n // Therefore we attach listeners to the owner document instead\n\n const listenerTarget = getOwnerDocument(event.target);\n super(props, events, listenerTarget);\n }\n\n}\nPointerSensor.activators = [{\n eventName: 'onPointerDown',\n handler: (_ref, _ref2) => {\n let {\n nativeEvent: event\n } = _ref;\n let {\n onActivation\n } = _ref2;\n\n if (!event.isPrimary || event.button !== 0) {\n return false;\n }\n\n onActivation == null ? void 0 : onActivation({\n event\n });\n return true;\n }\n}];\n\nconst events$1 = {\n move: {\n name: 'mousemove'\n },\n end: {\n name: 'mouseup'\n }\n};\nvar MouseButton;\n\n(function (MouseButton) {\n MouseButton[MouseButton[\"RightClick\"] = 2] = \"RightClick\";\n})(MouseButton || (MouseButton = {}));\n\nclass MouseSensor extends AbstractPointerSensor {\n constructor(props) {\n super(props, events$1, getOwnerDocument(props.event.target));\n }\n\n}\nMouseSensor.activators = [{\n eventName: 'onMouseDown',\n handler: (_ref, _ref2) => {\n let {\n nativeEvent: event\n } = _ref;\n let {\n onActivation\n } = _ref2;\n\n if (event.button === MouseButton.RightClick) {\n return false;\n }\n\n onActivation == null ? void 0 : onActivation({\n event\n });\n return true;\n }\n}];\n\nconst events$2 = {\n cancel: {\n name: 'touchcancel'\n },\n move: {\n name: 'touchmove'\n },\n end: {\n name: 'touchend'\n }\n};\nclass TouchSensor extends AbstractPointerSensor {\n constructor(props) {\n super(props, events$2);\n }\n\n static setup() {\n // Adding a non-capture and non-passive `touchmove` listener in order\n // to force `event.preventDefault()` calls to work in dynamically added\n // touchmove event handlers. This is required for iOS Safari.\n window.addEventListener(events$2.move.name, noop, {\n capture: false,\n passive: false\n });\n return function teardown() {\n window.removeEventListener(events$2.move.name, noop);\n }; // We create a new handler because the teardown function of another sensor\n // could remove our event listener if we use a referentially equal listener.\n\n function noop() {}\n }\n\n}\nTouchSensor.activators = [{\n eventName: 'onTouchStart',\n handler: (_ref, _ref2) => {\n let {\n nativeEvent: event\n } = _ref;\n let {\n onActivation\n } = _ref2;\n const {\n touches\n } = event;\n\n if (touches.length > 1) {\n return false;\n }\n\n onActivation == null ? void 0 : onActivation({\n event\n });\n return true;\n }\n}];\n\nvar AutoScrollActivator;\n\n(function (AutoScrollActivator) {\n AutoScrollActivator[AutoScrollActivator[\"Pointer\"] = 0] = \"Pointer\";\n AutoScrollActivator[AutoScrollActivator[\"DraggableRect\"] = 1] = \"DraggableRect\";\n})(AutoScrollActivator || (AutoScrollActivator = {}));\n\nvar TraversalOrder;\n\n(function (TraversalOrder) {\n TraversalOrder[TraversalOrder[\"TreeOrder\"] = 0] = \"TreeOrder\";\n TraversalOrder[TraversalOrder[\"ReversedTreeOrder\"] = 1] = \"ReversedTreeOrder\";\n})(TraversalOrder || (TraversalOrder = {}));\n\nfunction useAutoScroller(_ref) {\n let {\n acceleration,\n activator = AutoScrollActivator.Pointer,\n canScroll,\n draggingRect,\n enabled,\n interval = 5,\n order = TraversalOrder.TreeOrder,\n pointerCoordinates,\n scrollableAncestors,\n scrollableAncestorRects,\n delta,\n threshold\n } = _ref;\n const scrollIntent = useScrollIntent({\n delta,\n disabled: !enabled\n });\n const [setAutoScrollInterval, clearAutoScrollInterval] = useInterval();\n const scrollSpeed = useRef({\n x: 0,\n y: 0\n });\n const scrollDirection = useRef({\n x: 0,\n y: 0\n });\n const rect = useMemo(() => {\n switch (activator) {\n case AutoScrollActivator.Pointer:\n return pointerCoordinates ? {\n top: pointerCoordinates.y,\n bottom: pointerCoordinates.y,\n left: pointerCoordinates.x,\n right: pointerCoordinates.x\n } : null;\n\n case AutoScrollActivator.DraggableRect:\n return draggingRect;\n }\n }, [activator, draggingRect, pointerCoordinates]);\n const scrollContainerRef = useRef(null);\n const autoScroll = useCallback(() => {\n const scrollContainer = scrollContainerRef.current;\n\n if (!scrollContainer) {\n return;\n }\n\n const scrollLeft = scrollSpeed.current.x * scrollDirection.current.x;\n const scrollTop = scrollSpeed.current.y * scrollDirection.current.y;\n scrollContainer.scrollBy(scrollLeft, scrollTop);\n }, []);\n const sortedScrollableAncestors = useMemo(() => order === TraversalOrder.TreeOrder ? [...scrollableAncestors].reverse() : scrollableAncestors, [order, scrollableAncestors]);\n useEffect(() => {\n if (!enabled || !scrollableAncestors.length || !rect) {\n clearAutoScrollInterval();\n return;\n }\n\n for (const scrollContainer of sortedScrollableAncestors) {\n if ((canScroll == null ? void 0 : canScroll(scrollContainer)) === false) {\n continue;\n }\n\n const index = scrollableAncestors.indexOf(scrollContainer);\n const scrollContainerRect = scrollableAncestorRects[index];\n\n if (!scrollContainerRect) {\n continue;\n }\n\n const {\n direction,\n speed\n } = getScrollDirectionAndSpeed(scrollContainer, scrollContainerRect, rect, acceleration, threshold);\n\n for (const axis of ['x', 'y']) {\n if (!scrollIntent[axis][direction[axis]]) {\n speed[axis] = 0;\n direction[axis] = 0;\n }\n }\n\n if (speed.x > 0 || speed.y > 0) {\n clearAutoScrollInterval();\n scrollContainerRef.current = scrollContainer;\n setAutoScrollInterval(autoScroll, interval);\n scrollSpeed.current = speed;\n scrollDirection.current = direction;\n return;\n }\n }\n\n scrollSpeed.current = {\n x: 0,\n y: 0\n };\n scrollDirection.current = {\n x: 0,\n y: 0\n };\n clearAutoScrollInterval();\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n [acceleration, autoScroll, canScroll, clearAutoScrollInterval, enabled, interval, // eslint-disable-next-line react-hooks/exhaustive-deps\n JSON.stringify(rect), // eslint-disable-next-line react-hooks/exhaustive-deps\n JSON.stringify(scrollIntent), setAutoScrollInterval, scrollableAncestors, sortedScrollableAncestors, scrollableAncestorRects, // eslint-disable-next-line react-hooks/exhaustive-deps\n JSON.stringify(threshold)]);\n}\nconst defaultScrollIntent = {\n x: {\n [Direction.Backward]: false,\n [Direction.Forward]: false\n },\n y: {\n [Direction.Backward]: false,\n [Direction.Forward]: false\n }\n};\n\nfunction useScrollIntent(_ref2) {\n let {\n delta,\n disabled\n } = _ref2;\n const previousDelta = usePrevious(delta);\n return useLazyMemo(previousIntent => {\n if (disabled || !previousDelta || !previousIntent) {\n // Reset scroll intent tracking when auto-scrolling is disabled\n return defaultScrollIntent;\n }\n\n const direction = {\n x: Math.sign(delta.x - previousDelta.x),\n y: Math.sign(delta.y - previousDelta.y)\n }; // Keep track of the user intent to scroll in each direction for both axis\n\n return {\n x: {\n [Direction.Backward]: previousIntent.x[Direction.Backward] || direction.x === -1,\n [Direction.Forward]: previousIntent.x[Direction.Forward] || direction.x === 1\n },\n y: {\n [Direction.Backward]: previousIntent.y[Direction.Backward] || direction.y === -1,\n [Direction.Forward]: previousIntent.y[Direction.Forward] || direction.y === 1\n }\n };\n }, [disabled, delta, previousDelta]);\n}\n\nfunction useCachedNode(draggableNodes, id) {\n const draggableNode = id != null ? draggableNodes.get(id) : undefined;\n const node = draggableNode ? draggableNode.node.current : null;\n return useLazyMemo(cachedNode => {\n var _ref;\n\n if (id == null) {\n return null;\n } // In some cases, the draggable node can unmount while dragging\n // This is the case for virtualized lists. In those situations,\n // we fall back to the last known value for that node.\n\n\n return (_ref = node != null ? node : cachedNode) != null ? _ref : null;\n }, [node, id]);\n}\n\nfunction useCombineActivators(sensors, getSyntheticHandler) {\n return useMemo(() => sensors.reduce((accumulator, sensor) => {\n const {\n sensor: Sensor\n } = sensor;\n const sensorActivators = Sensor.activators.map(activator => ({\n eventName: activator.eventName,\n handler: getSyntheticHandler(activator.handler, sensor)\n }));\n return [...accumulator, ...sensorActivators];\n }, []), [sensors, getSyntheticHandler]);\n}\n\nvar MeasuringStrategy;\n\n(function (MeasuringStrategy) {\n MeasuringStrategy[MeasuringStrategy[\"Always\"] = 0] = \"Always\";\n MeasuringStrategy[MeasuringStrategy[\"BeforeDragging\"] = 1] = \"BeforeDragging\";\n MeasuringStrategy[MeasuringStrategy[\"WhileDragging\"] = 2] = \"WhileDragging\";\n})(MeasuringStrategy || (MeasuringStrategy = {}));\n\nvar MeasuringFrequency;\n\n(function (MeasuringFrequency) {\n MeasuringFrequency[\"Optimized\"] = \"optimized\";\n})(MeasuringFrequency || (MeasuringFrequency = {}));\n\nconst defaultValue = /*#__PURE__*/new Map();\nfunction useDroppableMeasuring(containers, _ref) {\n let {\n dragging,\n dependencies,\n config\n } = _ref;\n const [queue, setQueue] = useState(null);\n const {\n frequency,\n measure,\n strategy\n } = config;\n const containersRef = useRef(containers);\n const disabled = isDisabled();\n const disabledRef = useLatestValue(disabled);\n const measureDroppableContainers = useCallback(function (ids) {\n if (ids === void 0) {\n ids = [];\n }\n\n if (disabledRef.current) {\n return;\n }\n\n setQueue(value => {\n if (value === null) {\n return ids;\n }\n\n return value.concat(ids.filter(id => !value.includes(id)));\n });\n }, [disabledRef]);\n const timeoutId = useRef(null);\n const droppableRects = useLazyMemo(previousValue => {\n if (disabled && !dragging) {\n return defaultValue;\n }\n\n if (!previousValue || previousValue === defaultValue || containersRef.current !== containers || queue != null) {\n const map = new Map();\n\n for (let container of containers) {\n if (!container) {\n continue;\n }\n\n if (queue && queue.length > 0 && !queue.includes(container.id) && container.rect.current) {\n // This container does not need to be re-measured\n map.set(container.id, container.rect.current);\n continue;\n }\n\n const node = container.node.current;\n const rect = node ? new Rect(measure(node), node) : null;\n container.rect.current = rect;\n\n if (rect) {\n map.set(container.id, rect);\n }\n }\n\n return map;\n }\n\n return previousValue;\n }, [containers, queue, dragging, disabled, measure]);\n useEffect(() => {\n containersRef.current = containers;\n }, [containers]);\n useEffect(() => {\n if (disabled) {\n return;\n }\n\n measureDroppableContainers();\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n [dragging, disabled]);\n useEffect(() => {\n if (queue && queue.length > 0) {\n setQueue(null);\n }\n }, //eslint-disable-next-line react-hooks/exhaustive-deps\n [JSON.stringify(queue)]);\n useEffect(() => {\n if (disabled || typeof frequency !== 'number' || timeoutId.current !== null) {\n return;\n }\n\n timeoutId.current = setTimeout(() => {\n measureDroppableContainers();\n timeoutId.current = null;\n }, frequency);\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n [frequency, disabled, measureDroppableContainers, ...dependencies]);\n return {\n droppableRects,\n measureDroppableContainers,\n measuringScheduled: queue != null\n };\n\n function isDisabled() {\n switch (strategy) {\n case MeasuringStrategy.Always:\n return false;\n\n case MeasuringStrategy.BeforeDragging:\n return dragging;\n\n default:\n return !dragging;\n }\n }\n}\n\nfunction useInitialValue(value, computeFn) {\n return useLazyMemo(previousValue => {\n if (!value) {\n return null;\n }\n\n if (previousValue) {\n return previousValue;\n }\n\n return typeof computeFn === 'function' ? computeFn(value) : value;\n }, [computeFn, value]);\n}\n\nfunction useInitialRect(node, measure) {\n return useInitialValue(node, measure);\n}\n\n/**\r\n * Returns a new MutationObserver instance.\r\n * If `MutationObserver` is undefined in the execution environment, returns `undefined`.\r\n */\n\nfunction useMutationObserver(_ref) {\n let {\n callback,\n disabled\n } = _ref;\n const handleMutations = useEvent(callback);\n const mutationObserver = useMemo(() => {\n if (disabled || typeof window === 'undefined' || typeof window.MutationObserver === 'undefined') {\n return undefined;\n }\n\n const {\n MutationObserver\n } = window;\n return new MutationObserver(handleMutations);\n }, [handleMutations, disabled]);\n useEffect(() => {\n return () => mutationObserver == null ? void 0 : mutationObserver.disconnect();\n }, [mutationObserver]);\n return mutationObserver;\n}\n\n/**\r\n * Returns a new ResizeObserver instance bound to the `onResize` callback.\r\n * If `ResizeObserver` is undefined in the execution environment, returns `undefined`.\r\n */\n\nfunction useResizeObserver(_ref) {\n let {\n callback,\n disabled\n } = _ref;\n const handleResize = useEvent(callback);\n const resizeObserver = useMemo(() => {\n if (disabled || typeof window === 'undefined' || typeof window.ResizeObserver === 'undefined') {\n return undefined;\n }\n\n const {\n ResizeObserver\n } = window;\n return new ResizeObserver(handleResize);\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n [disabled]);\n useEffect(() => {\n return () => resizeObserver == null ? void 0 : resizeObserver.disconnect();\n }, [resizeObserver]);\n return resizeObserver;\n}\n\nfunction defaultMeasure(element) {\n return new Rect(getClientRect(element), element);\n}\n\nfunction useRect(element, measure, fallbackRect) {\n if (measure === void 0) {\n measure = defaultMeasure;\n }\n\n const [rect, setRect] = useState(null);\n\n function measureRect() {\n setRect(currentRect => {\n if (!element) {\n return null;\n }\n\n if (element.isConnected === false) {\n var _ref;\n\n // Fall back to last rect we measured if the element is\n // no longer connected to the DOM.\n return (_ref = currentRect != null ? currentRect : fallbackRect) != null ? _ref : null;\n }\n\n const newRect = measure(element);\n\n if (JSON.stringify(currentRect) === JSON.stringify(newRect)) {\n return currentRect;\n }\n\n return newRect;\n });\n }\n\n const mutationObserver = useMutationObserver({\n callback(records) {\n if (!element) {\n return;\n }\n\n for (const record of records) {\n const {\n type,\n target\n } = record;\n\n if (type === 'childList' && target instanceof HTMLElement && target.contains(element)) {\n measureRect();\n break;\n }\n }\n }\n\n });\n const resizeObserver = useResizeObserver({\n callback: measureRect\n });\n useIsomorphicLayoutEffect(() => {\n measureRect();\n\n if (element) {\n resizeObserver == null ? void 0 : resizeObserver.observe(element);\n mutationObserver == null ? void 0 : mutationObserver.observe(document.body, {\n childList: true,\n subtree: true\n });\n } else {\n resizeObserver == null ? void 0 : resizeObserver.disconnect();\n mutationObserver == null ? void 0 : mutationObserver.disconnect();\n }\n }, [element]);\n return rect;\n}\n\nfunction useRectDelta(rect) {\n const initialRect = useInitialValue(rect);\n return getRectDelta(rect, initialRect);\n}\n\nconst defaultValue$1 = [];\nfunction useScrollableAncestors(node) {\n const previousNode = useRef(node);\n const ancestors = useLazyMemo(previousValue => {\n if (!node) {\n return defaultValue$1;\n }\n\n if (previousValue && previousValue !== defaultValue$1 && node && previousNode.current && node.parentNode === previousNode.current.parentNode) {\n return previousValue;\n }\n\n return getScrollableAncestors(node);\n }, [node]);\n useEffect(() => {\n previousNode.current = node;\n }, [node]);\n return ancestors;\n}\n\nfunction useScrollOffsets(elements) {\n const [scrollCoordinates, setScrollCoordinates] = useState(null);\n const prevElements = useRef(elements); // To-do: Throttle the handleScroll callback\n\n const handleScroll = useCallback(event => {\n const scrollingElement = getScrollableElement(event.target);\n\n if (!scrollingElement) {\n return;\n }\n\n setScrollCoordinates(scrollCoordinates => {\n if (!scrollCoordinates) {\n return null;\n }\n\n scrollCoordinates.set(scrollingElement, getScrollCoordinates(scrollingElement));\n return new Map(scrollCoordinates);\n });\n }, []);\n useEffect(() => {\n const previousElements = prevElements.current;\n\n if (elements !== previousElements) {\n cleanup(previousElements);\n const entries = elements.map(element => {\n const scrollableElement = getScrollableElement(element);\n\n if (scrollableElement) {\n scrollableElement.addEventListener('scroll', handleScroll, {\n passive: true\n });\n return [scrollableElement, getScrollCoordinates(scrollableElement)];\n }\n\n return null;\n }).filter(entry => entry != null);\n setScrollCoordinates(entries.length ? new Map(entries) : null);\n prevElements.current = elements;\n }\n\n return () => {\n cleanup(elements);\n cleanup(previousElements);\n };\n\n function cleanup(elements) {\n elements.forEach(element => {\n const scrollableElement = getScrollableElement(element);\n scrollableElement == null ? void 0 : scrollableElement.removeEventListener('scroll', handleScroll);\n });\n }\n }, [handleScroll, elements]);\n return useMemo(() => {\n if (elements.length) {\n return scrollCoordinates ? Array.from(scrollCoordinates.values()).reduce((acc, coordinates) => add(acc, coordinates), defaultCoordinates) : getScrollOffsets(elements);\n }\n\n return defaultCoordinates;\n }, [elements, scrollCoordinates]);\n}\n\nfunction useScrollOffsetsDelta(scrollOffsets, dependencies) {\n if (dependencies === void 0) {\n dependencies = [];\n }\n\n const initialScrollOffsets = useRef(null);\n useEffect(() => {\n initialScrollOffsets.current = null;\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n dependencies);\n useEffect(() => {\n const hasScrollOffsets = scrollOffsets !== defaultCoordinates;\n\n if (hasScrollOffsets && !initialScrollOffsets.current) {\n initialScrollOffsets.current = scrollOffsets;\n }\n\n if (!hasScrollOffsets && initialScrollOffsets.current) {\n initialScrollOffsets.current = null;\n }\n }, [scrollOffsets]);\n return initialScrollOffsets.current ? subtract(scrollOffsets, initialScrollOffsets.current) : defaultCoordinates;\n}\n\nfunction useSensorSetup(sensors) {\n useEffect(() => {\n if (!canUseDOM) {\n return;\n }\n\n const teardownFns = sensors.map(_ref => {\n let {\n sensor\n } = _ref;\n return sensor.setup == null ? void 0 : sensor.setup();\n });\n return () => {\n for (const teardown of teardownFns) {\n teardown == null ? void 0 : teardown();\n }\n };\n }, // TO-DO: Sensors length could theoretically change which would not be a valid dependency\n // eslint-disable-next-line react-hooks/exhaustive-deps\n sensors.map(_ref2 => {\n let {\n sensor\n } = _ref2;\n return sensor;\n }));\n}\n\nfunction useSyntheticListeners(listeners, id) {\n return useMemo(() => {\n return listeners.reduce((acc, _ref) => {\n let {\n eventName,\n handler\n } = _ref;\n\n acc[eventName] = event => {\n handler(event, id);\n };\n\n return acc;\n }, {});\n }, [listeners, id]);\n}\n\nfunction useWindowRect(element) {\n return useMemo(() => element ? getWindowClientRect(element) : null, [element]);\n}\n\nconst defaultValue$2 = [];\nfunction useRects(elements, measure) {\n if (measure === void 0) {\n measure = getClientRect;\n }\n\n const [firstElement] = elements;\n const windowRect = useWindowRect(firstElement ? getWindow(firstElement) : null);\n const [rects, setRects] = useState(defaultValue$2);\n\n function measureRects() {\n setRects(() => {\n if (!elements.length) {\n return defaultValue$2;\n }\n\n return elements.map(element => isDocumentScrollingElement(element) ? windowRect : new Rect(measure(element), element));\n });\n }\n\n const resizeObserver = useResizeObserver({\n callback: measureRects\n });\n useIsomorphicLayoutEffect(() => {\n resizeObserver == null ? void 0 : resizeObserver.disconnect();\n measureRects();\n elements.forEach(element => resizeObserver == null ? void 0 : resizeObserver.observe(element));\n }, [elements]);\n return rects;\n}\n\nfunction getMeasurableNode(node) {\n if (!node) {\n return null;\n }\n\n if (node.children.length > 1) {\n return node;\n }\n\n const firstChild = node.children[0];\n return isHTMLElement(firstChild) ? firstChild : node;\n}\n\nfunction useDragOverlayMeasuring(_ref) {\n let {\n measure\n } = _ref;\n const [rect, setRect] = useState(null);\n const handleResize = useCallback(entries => {\n for (const {\n target\n } of entries) {\n if (isHTMLElement(target)) {\n setRect(rect => {\n const newRect = measure(target);\n return rect ? { ...rect,\n width: newRect.width,\n height: newRect.height\n } : newRect;\n });\n break;\n }\n }\n }, [measure]);\n const resizeObserver = useResizeObserver({\n callback: handleResize\n });\n const handleNodeChange = useCallback(element => {\n const node = getMeasurableNode(element);\n resizeObserver == null ? void 0 : resizeObserver.disconnect();\n\n if (node) {\n resizeObserver == null ? void 0 : resizeObserver.observe(node);\n }\n\n setRect(node ? measure(node) : null);\n }, [measure, resizeObserver]);\n const [nodeRef, setRef] = useNodeRef(handleNodeChange);\n return useMemo(() => ({\n nodeRef,\n rect,\n setRef\n }), [rect, nodeRef, setRef]);\n}\n\nconst defaultSensors = [{\n sensor: PointerSensor,\n options: {}\n}, {\n sensor: KeyboardSensor,\n options: {}\n}];\nconst defaultData = {\n current: {}\n};\nconst defaultMeasuringConfiguration = {\n draggable: {\n measure: getTransformAgnosticClientRect\n },\n droppable: {\n measure: getTransformAgnosticClientRect,\n strategy: MeasuringStrategy.WhileDragging,\n frequency: MeasuringFrequency.Optimized\n },\n dragOverlay: {\n measure: getClientRect\n }\n};\n\nclass DroppableContainersMap extends Map {\n get(id) {\n var _super$get;\n\n return id != null ? (_super$get = super.get(id)) != null ? _super$get : undefined : undefined;\n }\n\n toArray() {\n return Array.from(this.values());\n }\n\n getEnabled() {\n return this.toArray().filter(_ref => {\n let {\n disabled\n } = _ref;\n return !disabled;\n });\n }\n\n getNodeFor(id) {\n var _this$get$node$curren, _this$get;\n\n return (_this$get$node$curren = (_this$get = this.get(id)) == null ? void 0 : _this$get.node.current) != null ? _this$get$node$curren : undefined;\n }\n\n}\n\nconst defaultPublicContext = {\n activatorEvent: null,\n active: null,\n activeNode: null,\n activeNodeRect: null,\n collisions: null,\n containerNodeRect: null,\n draggableNodes: /*#__PURE__*/new Map(),\n droppableRects: /*#__PURE__*/new Map(),\n droppableContainers: /*#__PURE__*/new DroppableContainersMap(),\n over: null,\n dragOverlay: {\n nodeRef: {\n current: null\n },\n rect: null,\n setRef: noop\n },\n scrollableAncestors: [],\n scrollableAncestorRects: [],\n measuringConfiguration: defaultMeasuringConfiguration,\n measureDroppableContainers: noop,\n windowRect: null,\n measuringScheduled: false\n};\nconst defaultInternalContext = {\n activatorEvent: null,\n activators: [],\n active: null,\n activeNodeRect: null,\n ariaDescribedById: {\n draggable: ''\n },\n dispatch: noop,\n draggableNodes: /*#__PURE__*/new Map(),\n over: null,\n measureDroppableContainers: noop\n};\nconst InternalContext = /*#__PURE__*/createContext(defaultInternalContext);\nconst PublicContext = /*#__PURE__*/createContext(defaultPublicContext);\n\nfunction getInitialState() {\n return {\n draggable: {\n active: null,\n initialCoordinates: {\n x: 0,\n y: 0\n },\n nodes: new Map(),\n translate: {\n x: 0,\n y: 0\n }\n },\n droppable: {\n containers: new DroppableContainersMap()\n }\n };\n}\nfunction reducer(state, action) {\n switch (action.type) {\n case Action.DragStart:\n return { ...state,\n draggable: { ...state.draggable,\n initialCoordinates: action.initialCoordinates,\n active: action.active\n }\n };\n\n case Action.DragMove:\n if (state.draggable.active == null) {\n return state;\n }\n\n return { ...state,\n draggable: { ...state.draggable,\n translate: {\n x: action.coordinates.x - state.draggable.initialCoordinates.x,\n y: action.coordinates.y - state.draggable.initialCoordinates.y\n }\n }\n };\n\n case Action.DragEnd:\n case Action.DragCancel:\n return { ...state,\n draggable: { ...state.draggable,\n active: null,\n initialCoordinates: {\n x: 0,\n y: 0\n },\n translate: {\n x: 0,\n y: 0\n }\n }\n };\n\n case Action.RegisterDroppable:\n {\n const {\n element\n } = action;\n const {\n id\n } = element;\n const containers = new DroppableContainersMap(state.droppable.containers);\n containers.set(id, element);\n return { ...state,\n droppable: { ...state.droppable,\n containers\n }\n };\n }\n\n case Action.SetDroppableDisabled:\n {\n const {\n id,\n key,\n disabled\n } = action;\n const element = state.droppable.containers.get(id);\n\n if (!element || key !== element.key) {\n return state;\n }\n\n const containers = new DroppableContainersMap(state.droppable.containers);\n containers.set(id, { ...element,\n disabled\n });\n return { ...state,\n droppable: { ...state.droppable,\n containers\n }\n };\n }\n\n case Action.UnregisterDroppable:\n {\n const {\n id,\n key\n } = action;\n const element = state.droppable.containers.get(id);\n\n if (!element || key !== element.key) {\n return state;\n }\n\n const containers = new DroppableContainersMap(state.droppable.containers);\n containers.delete(id);\n return { ...state,\n droppable: { ...state.droppable,\n containers\n }\n };\n }\n\n default:\n {\n return state;\n }\n }\n}\n\nfunction RestoreFocus(_ref) {\n let {\n disabled\n } = _ref;\n const {\n active,\n activatorEvent,\n draggableNodes\n } = useContext(InternalContext);\n const previousActivatorEvent = usePrevious(activatorEvent);\n const previousActiveId = usePrevious(active == null ? void 0 : active.id); // Restore keyboard focus on the activator node\n\n useEffect(() => {\n if (disabled) {\n return;\n }\n\n if (!activatorEvent && previousActivatorEvent && previousActiveId != null) {\n if (!isKeyboardEvent(previousActivatorEvent)) {\n return;\n }\n\n if (document.activeElement === previousActivatorEvent.target) {\n // No need to restore focus\n return;\n }\n\n const draggableNode = draggableNodes.get(previousActiveId);\n\n if (!draggableNode) {\n return;\n }\n\n const {\n activatorNode,\n node\n } = draggableNode;\n\n if (!activatorNode.current && !node.current) {\n return;\n }\n\n requestAnimationFrame(() => {\n for (const element of [activatorNode.current, node.current]) {\n if (!element) {\n continue;\n }\n\n const focusableNode = findFirstFocusableNode(element);\n\n if (focusableNode) {\n focusableNode.focus();\n break;\n }\n }\n });\n }\n }, [activatorEvent, disabled, draggableNodes, previousActiveId, previousActivatorEvent]);\n return null;\n}\n\nfunction applyModifiers(modifiers, _ref) {\n let {\n transform,\n ...args\n } = _ref;\n return modifiers != null && modifiers.length ? modifiers.reduce((accumulator, modifier) => {\n return modifier({\n transform: accumulator,\n ...args\n });\n }, transform) : transform;\n}\n\nfunction useMeasuringConfiguration(config) {\n return useMemo(() => ({\n draggable: { ...defaultMeasuringConfiguration.draggable,\n ...(config == null ? void 0 : config.draggable)\n },\n droppable: { ...defaultMeasuringConfiguration.droppable,\n ...(config == null ? void 0 : config.droppable)\n },\n dragOverlay: { ...defaultMeasuringConfiguration.dragOverlay,\n ...(config == null ? void 0 : config.dragOverlay)\n }\n }), // eslint-disable-next-line react-hooks/exhaustive-deps\n [config == null ? void 0 : config.draggable, config == null ? void 0 : config.droppable, config == null ? void 0 : config.dragOverlay]);\n}\n\nfunction useLayoutShiftScrollCompensation(_ref) {\n let {\n activeNode,\n measure,\n initialRect,\n config = true\n } = _ref;\n const initialized = useRef(false);\n const {\n x,\n y\n } = typeof config === 'boolean' ? {\n x: config,\n y: config\n } : config;\n useIsomorphicLayoutEffect(() => {\n const disabled = !x && !y;\n\n if (disabled || !activeNode) {\n initialized.current = false;\n return;\n }\n\n if (initialized.current || !initialRect) {\n // Return early if layout shift scroll compensation was already attempted\n // or if there is no initialRect to compare to.\n return;\n } // Get the most up to date node ref for the active draggable\n\n\n const node = activeNode == null ? void 0 : activeNode.node.current;\n\n if (!node || node.isConnected === false) {\n // Return early if there is no attached node ref or if the node is\n // disconnected from the document.\n return;\n }\n\n const rect = measure(node);\n const rectDelta = getRectDelta(rect, initialRect);\n\n if (!x) {\n rectDelta.x = 0;\n }\n\n if (!y) {\n rectDelta.y = 0;\n } // Only perform layout shift scroll compensation once\n\n\n initialized.current = true;\n\n if (Math.abs(rectDelta.x) > 0 || Math.abs(rectDelta.y) > 0) {\n const firstScrollableAncestor = getFirstScrollableAncestor(node);\n\n if (firstScrollableAncestor) {\n firstScrollableAncestor.scrollBy({\n top: rectDelta.y,\n left: rectDelta.x\n });\n }\n }\n }, [activeNode, x, y, initialRect, measure]);\n}\n\nconst ActiveDraggableContext = /*#__PURE__*/createContext({ ...defaultCoordinates,\n scaleX: 1,\n scaleY: 1\n});\nvar Status;\n\n(function (Status) {\n Status[Status[\"Uninitialized\"] = 0] = \"Uninitialized\";\n Status[Status[\"Initializing\"] = 1] = \"Initializing\";\n Status[Status[\"Initialized\"] = 2] = \"Initialized\";\n})(Status || (Status = {}));\n\nconst DndContext = /*#__PURE__*/memo(function DndContext(_ref) {\n var _sensorContext$curren, _dragOverlay$nodeRef$, _dragOverlay$rect, _over$rect;\n\n let {\n id,\n accessibility,\n autoScroll = true,\n children,\n sensors = defaultSensors,\n collisionDetection = rectIntersection,\n measuring,\n modifiers,\n ...props\n } = _ref;\n const store = useReducer(reducer, undefined, getInitialState);\n const [state, dispatch] = store;\n const [dispatchMonitorEvent, registerMonitorListener] = useDndMonitorProvider();\n const [status, setStatus] = useState(Status.Uninitialized);\n const isInitialized = status === Status.Initialized;\n const {\n draggable: {\n active: activeId,\n nodes: draggableNodes,\n translate\n },\n droppable: {\n containers: droppableContainers\n }\n } = state;\n const node = activeId != null ? draggableNodes.get(activeId) : null;\n const activeRects = useRef({\n initial: null,\n translated: null\n });\n const active = useMemo(() => {\n var _node$data;\n\n return activeId != null ? {\n id: activeId,\n // It's possible for the active node to unmount while dragging\n data: (_node$data = node == null ? void 0 : node.data) != null ? _node$data : defaultData,\n rect: activeRects\n } : null;\n }, [activeId, node]);\n const activeRef = useRef(null);\n const [activeSensor, setActiveSensor] = useState(null);\n const [activatorEvent, setActivatorEvent] = useState(null);\n const latestProps = useLatestValue(props, Object.values(props));\n const draggableDescribedById = useUniqueId(\"DndDescribedBy\", id);\n const enabledDroppableContainers = useMemo(() => droppableContainers.getEnabled(), [droppableContainers]);\n const measuringConfiguration = useMeasuringConfiguration(measuring);\n const {\n droppableRects,\n measureDroppableContainers,\n measuringScheduled\n } = useDroppableMeasuring(enabledDroppableContainers, {\n dragging: isInitialized,\n dependencies: [translate.x, translate.y],\n config: measuringConfiguration.droppable\n });\n const activeNode = useCachedNode(draggableNodes, activeId);\n const activationCoordinates = useMemo(() => activatorEvent ? getEventCoordinates(activatorEvent) : null, [activatorEvent]);\n const autoScrollOptions = getAutoScrollerOptions();\n const initialActiveNodeRect = useInitialRect(activeNode, measuringConfiguration.draggable.measure);\n useLayoutShiftScrollCompensation({\n activeNode: activeId != null ? draggableNodes.get(activeId) : null,\n config: autoScrollOptions.layoutShiftCompensation,\n initialRect: initialActiveNodeRect,\n measure: measuringConfiguration.draggable.measure\n });\n const activeNodeRect = useRect(activeNode, measuringConfiguration.draggable.measure, initialActiveNodeRect);\n const containerNodeRect = useRect(activeNode ? activeNode.parentElement : null);\n const sensorContext = useRef({\n activatorEvent: null,\n active: null,\n activeNode,\n collisionRect: null,\n collisions: null,\n droppableRects,\n draggableNodes,\n draggingNode: null,\n draggingNodeRect: null,\n droppableContainers,\n over: null,\n scrollableAncestors: [],\n scrollAdjustedTranslate: null\n });\n const overNode = droppableContainers.getNodeFor((_sensorContext$curren = sensorContext.current.over) == null ? void 0 : _sensorContext$curren.id);\n const dragOverlay = useDragOverlayMeasuring({\n measure: measuringConfiguration.dragOverlay.measure\n }); // Use the rect of the drag overlay if it is mounted\n\n const draggingNode = (_dragOverlay$nodeRef$ = dragOverlay.nodeRef.current) != null ? _dragOverlay$nodeRef$ : activeNode;\n const draggingNodeRect = isInitialized ? (_dragOverlay$rect = dragOverlay.rect) != null ? _dragOverlay$rect : activeNodeRect : null;\n const usesDragOverlay = Boolean(dragOverlay.nodeRef.current && dragOverlay.rect); // The delta between the previous and new position of the draggable node\n // is only relevant when there is no drag overlay\n\n const nodeRectDelta = useRectDelta(usesDragOverlay ? null : activeNodeRect); // Get the window rect of the dragging node\n\n const windowRect = useWindowRect(draggingNode ? getWindow(draggingNode) : null); // Get scrollable ancestors of the dragging node\n\n const scrollableAncestors = useScrollableAncestors(isInitialized ? overNode != null ? overNode : activeNode : null);\n const scrollableAncestorRects = useRects(scrollableAncestors); // Apply modifiers\n\n const modifiedTranslate = applyModifiers(modifiers, {\n transform: {\n x: translate.x - nodeRectDelta.x,\n y: translate.y - nodeRectDelta.y,\n scaleX: 1,\n scaleY: 1\n },\n activatorEvent,\n active,\n activeNodeRect,\n containerNodeRect,\n draggingNodeRect,\n over: sensorContext.current.over,\n overlayNodeRect: dragOverlay.rect,\n scrollableAncestors,\n scrollableAncestorRects,\n windowRect\n });\n const pointerCoordinates = activationCoordinates ? add(activationCoordinates, translate) : null;\n const scrollOffsets = useScrollOffsets(scrollableAncestors); // Represents the scroll delta since dragging was initiated\n\n const scrollAdjustment = useScrollOffsetsDelta(scrollOffsets); // Represents the scroll delta since the last time the active node rect was measured\n\n const activeNodeScrollDelta = useScrollOffsetsDelta(scrollOffsets, [activeNodeRect]);\n const scrollAdjustedTranslate = add(modifiedTranslate, scrollAdjustment);\n const collisionRect = draggingNodeRect ? getAdjustedRect(draggingNodeRect, modifiedTranslate) : null;\n const collisions = active && collisionRect ? collisionDetection({\n active,\n collisionRect,\n droppableRects,\n droppableContainers: enabledDroppableContainers,\n pointerCoordinates\n }) : null;\n const overId = getFirstCollision(collisions, 'id');\n const [over, setOver] = useState(null); // When there is no drag overlay used, we need to account for the\n // window scroll delta\n\n const appliedTranslate = usesDragOverlay ? modifiedTranslate : add(modifiedTranslate, activeNodeScrollDelta);\n const transform = adjustScale(appliedTranslate, (_over$rect = over == null ? void 0 : over.rect) != null ? _over$rect : null, activeNodeRect);\n const activeSensorRef = useRef(null);\n const instantiateSensor = useCallback((event, _ref2) => {\n let {\n sensor: Sensor,\n options\n } = _ref2;\n\n if (activeRef.current == null) {\n return;\n }\n\n const activeNode = draggableNodes.get(activeRef.current);\n\n if (!activeNode) {\n return;\n }\n\n const activatorEvent = event.nativeEvent;\n const sensorInstance = new Sensor({\n active: activeRef.current,\n activeNode,\n event: activatorEvent,\n options,\n // Sensors need to be instantiated with refs for arguments that change over time\n // otherwise they are frozen in time with the stale arguments\n context: sensorContext,\n\n onAbort(id) {\n const draggableNode = draggableNodes.get(id);\n\n if (!draggableNode) {\n return;\n }\n\n const {\n onDragAbort\n } = latestProps.current;\n const event = {\n id\n };\n onDragAbort == null ? void 0 : onDragAbort(event);\n dispatchMonitorEvent({\n type: 'onDragAbort',\n event\n });\n },\n\n onPending(id, constraint, initialCoordinates, offset) {\n const draggableNode = draggableNodes.get(id);\n\n if (!draggableNode) {\n return;\n }\n\n const {\n onDragPending\n } = latestProps.current;\n const event = {\n id,\n constraint,\n initialCoordinates,\n offset\n };\n onDragPending == null ? void 0 : onDragPending(event);\n dispatchMonitorEvent({\n type: 'onDragPending',\n event\n });\n },\n\n onStart(initialCoordinates) {\n const id = activeRef.current;\n\n if (id == null) {\n return;\n }\n\n const draggableNode = draggableNodes.get(id);\n\n if (!draggableNode) {\n return;\n }\n\n const {\n onDragStart\n } = latestProps.current;\n const event = {\n activatorEvent,\n active: {\n id,\n data: draggableNode.data,\n rect: activeRects\n }\n };\n unstable_batchedUpdates(() => {\n onDragStart == null ? void 0 : onDragStart(event);\n setStatus(Status.Initializing);\n dispatch({\n type: Action.DragStart,\n initialCoordinates,\n active: id\n });\n dispatchMonitorEvent({\n type: 'onDragStart',\n event\n });\n setActiveSensor(activeSensorRef.current);\n setActivatorEvent(activatorEvent);\n });\n },\n\n onMove(coordinates) {\n dispatch({\n type: Action.DragMove,\n coordinates\n });\n },\n\n onEnd: createHandler(Action.DragEnd),\n onCancel: createHandler(Action.DragCancel)\n });\n activeSensorRef.current = sensorInstance;\n\n function createHandler(type) {\n return async function handler() {\n const {\n active,\n collisions,\n over,\n scrollAdjustedTranslate\n } = sensorContext.current;\n let event = null;\n\n if (active && scrollAdjustedTranslate) {\n const {\n cancelDrop\n } = latestProps.current;\n event = {\n activatorEvent,\n active: active,\n collisions,\n delta: scrollAdjustedTranslate,\n over\n };\n\n if (type === Action.DragEnd && typeof cancelDrop === 'function') {\n const shouldCancel = await Promise.resolve(cancelDrop(event));\n\n if (shouldCancel) {\n type = Action.DragCancel;\n }\n }\n }\n\n activeRef.current = null;\n unstable_batchedUpdates(() => {\n dispatch({\n type\n });\n setStatus(Status.Uninitialized);\n setOver(null);\n setActiveSensor(null);\n setActivatorEvent(null);\n activeSensorRef.current = null;\n const eventName = type === Action.DragEnd ? 'onDragEnd' : 'onDragCancel';\n\n if (event) {\n const handler = latestProps.current[eventName];\n handler == null ? void 0 : handler(event);\n dispatchMonitorEvent({\n type: eventName,\n event\n });\n }\n });\n };\n }\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n [draggableNodes]);\n const bindActivatorToSensorInstantiator = useCallback((handler, sensor) => {\n return (event, active) => {\n const nativeEvent = event.nativeEvent;\n const activeDraggableNode = draggableNodes.get(active);\n\n if ( // Another sensor is already instantiating\n activeRef.current !== null || // No active draggable\n !activeDraggableNode || // Event has already been captured\n nativeEvent.dndKit || nativeEvent.defaultPrevented) {\n return;\n }\n\n const activationContext = {\n active: activeDraggableNode\n };\n const shouldActivate = handler(event, sensor.options, activationContext);\n\n if (shouldActivate === true) {\n nativeEvent.dndKit = {\n capturedBy: sensor.sensor\n };\n activeRef.current = active;\n instantiateSensor(event, sensor);\n }\n };\n }, [draggableNodes, instantiateSensor]);\n const activators = useCombineActivators(sensors, bindActivatorToSensorInstantiator);\n useSensorSetup(sensors);\n useIsomorphicLayoutEffect(() => {\n if (activeNodeRect && status === Status.Initializing) {\n setStatus(Status.Initialized);\n }\n }, [activeNodeRect, status]);\n useEffect(() => {\n const {\n onDragMove\n } = latestProps.current;\n const {\n active,\n activatorEvent,\n collisions,\n over\n } = sensorContext.current;\n\n if (!active || !activatorEvent) {\n return;\n }\n\n const event = {\n active,\n activatorEvent,\n collisions,\n delta: {\n x: scrollAdjustedTranslate.x,\n y: scrollAdjustedTranslate.y\n },\n over\n };\n unstable_batchedUpdates(() => {\n onDragMove == null ? void 0 : onDragMove(event);\n dispatchMonitorEvent({\n type: 'onDragMove',\n event\n });\n });\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n [scrollAdjustedTranslate.x, scrollAdjustedTranslate.y]);\n useEffect(() => {\n const {\n active,\n activatorEvent,\n collisions,\n droppableContainers,\n scrollAdjustedTranslate\n } = sensorContext.current;\n\n if (!active || activeRef.current == null || !activatorEvent || !scrollAdjustedTranslate) {\n return;\n }\n\n const {\n onDragOver\n } = latestProps.current;\n const overContainer = droppableContainers.get(overId);\n const over = overContainer && overContainer.rect.current ? {\n id: overContainer.id,\n rect: overContainer.rect.current,\n data: overContainer.data,\n disabled: overContainer.disabled\n } : null;\n const event = {\n active,\n activatorEvent,\n collisions,\n delta: {\n x: scrollAdjustedTranslate.x,\n y: scrollAdjustedTranslate.y\n },\n over\n };\n unstable_batchedUpdates(() => {\n setOver(over);\n onDragOver == null ? void 0 : onDragOver(event);\n dispatchMonitorEvent({\n type: 'onDragOver',\n event\n });\n });\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n [overId]);\n useIsomorphicLayoutEffect(() => {\n sensorContext.current = {\n activatorEvent,\n active,\n activeNode,\n collisionRect,\n collisions,\n droppableRects,\n draggableNodes,\n draggingNode,\n draggingNodeRect,\n droppableContainers,\n over,\n scrollableAncestors,\n scrollAdjustedTranslate\n };\n activeRects.current = {\n initial: draggingNodeRect,\n translated: collisionRect\n };\n }, [active, activeNode, collisions, collisionRect, draggableNodes, draggingNode, draggingNodeRect, droppableRects, droppableContainers, over, scrollableAncestors, scrollAdjustedTranslate]);\n useAutoScroller({ ...autoScrollOptions,\n delta: translate,\n draggingRect: collisionRect,\n pointerCoordinates,\n scrollableAncestors,\n scrollableAncestorRects\n });\n const publicContext = useMemo(() => {\n const context = {\n active,\n activeNode,\n activeNodeRect,\n activatorEvent,\n collisions,\n containerNodeRect,\n dragOverlay,\n draggableNodes,\n droppableContainers,\n droppableRects,\n over,\n measureDroppableContainers,\n scrollableAncestors,\n scrollableAncestorRects,\n measuringConfiguration,\n measuringScheduled,\n windowRect\n };\n return context;\n }, [active, activeNode, activeNodeRect, activatorEvent, collisions, containerNodeRect, dragOverlay, draggableNodes, droppableContainers, droppableRects, over, measureDroppableContainers, scrollableAncestors, scrollableAncestorRects, measuringConfiguration, measuringScheduled, windowRect]);\n const internalContext = useMemo(() => {\n const context = {\n activatorEvent,\n activators,\n active,\n activeNodeRect,\n ariaDescribedById: {\n draggable: draggableDescribedById\n },\n dispatch,\n draggableNodes,\n over,\n measureDroppableContainers\n };\n return context;\n }, [activatorEvent, activators, active, activeNodeRect, dispatch, draggableDescribedById, draggableNodes, over, measureDroppableContainers]);\n return React.createElement(DndMonitorContext.Provider, {\n value: registerMonitorListener\n }, React.createElement(InternalContext.Provider, {\n value: internalContext\n }, React.createElement(PublicContext.Provider, {\n value: publicContext\n }, React.createElement(ActiveDraggableContext.Provider, {\n value: transform\n }, children)), React.createElement(RestoreFocus, {\n disabled: (accessibility == null ? void 0 : accessibility.restoreFocus) === false\n })), React.createElement(Accessibility, { ...accessibility,\n hiddenTextDescribedById: draggableDescribedById\n }));\n\n function getAutoScrollerOptions() {\n const activeSensorDisablesAutoscroll = (activeSensor == null ? void 0 : activeSensor.autoScrollEnabled) === false;\n const autoScrollGloballyDisabled = typeof autoScroll === 'object' ? autoScroll.enabled === false : autoScroll === false;\n const enabled = isInitialized && !activeSensorDisablesAutoscroll && !autoScrollGloballyDisabled;\n\n if (typeof autoScroll === 'object') {\n return { ...autoScroll,\n enabled\n };\n }\n\n return {\n enabled\n };\n }\n});\n\nconst NullContext = /*#__PURE__*/createContext(null);\nconst defaultRole = 'button';\nconst ID_PREFIX = 'Draggable';\nfunction useDraggable(_ref) {\n let {\n id,\n data,\n disabled = false,\n attributes\n } = _ref;\n const key = useUniqueId(ID_PREFIX);\n const {\n activators,\n activatorEvent,\n active,\n activeNodeRect,\n ariaDescribedById,\n draggableNodes,\n over\n } = useContext(InternalContext);\n const {\n role = defaultRole,\n roleDescription = 'draggable',\n tabIndex = 0\n } = attributes != null ? attributes : {};\n const isDragging = (active == null ? void 0 : active.id) === id;\n const transform = useContext(isDragging ? ActiveDraggableContext : NullContext);\n const [node, setNodeRef] = useNodeRef();\n const [activatorNode, setActivatorNodeRef] = useNodeRef();\n const listeners = useSyntheticListeners(activators, id);\n const dataRef = useLatestValue(data);\n useIsomorphicLayoutEffect(() => {\n draggableNodes.set(id, {\n id,\n key,\n node,\n activatorNode,\n data: dataRef\n });\n return () => {\n const node = draggableNodes.get(id);\n\n if (node && node.key === key) {\n draggableNodes.delete(id);\n }\n };\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n [draggableNodes, id]);\n const memoizedAttributes = useMemo(() => ({\n role,\n tabIndex,\n 'aria-disabled': disabled,\n 'aria-pressed': isDragging && role === defaultRole ? true : undefined,\n 'aria-roledescription': roleDescription,\n 'aria-describedby': ariaDescribedById.draggable\n }), [disabled, role, tabIndex, isDragging, roleDescription, ariaDescribedById.draggable]);\n return {\n active,\n activatorEvent,\n activeNodeRect,\n attributes: memoizedAttributes,\n isDragging,\n listeners: disabled ? undefined : listeners,\n node,\n over,\n setNodeRef,\n setActivatorNodeRef,\n transform\n };\n}\n\nfunction useDndContext() {\n return useContext(PublicContext);\n}\n\nconst ID_PREFIX$1 = 'Droppable';\nconst defaultResizeObserverConfig = {\n timeout: 25\n};\nfunction useDroppable(_ref) {\n let {\n data,\n disabled = false,\n id,\n resizeObserverConfig\n } = _ref;\n const key = useUniqueId(ID_PREFIX$1);\n const {\n active,\n dispatch,\n over,\n measureDroppableContainers\n } = useContext(InternalContext);\n const previous = useRef({\n disabled\n });\n const resizeObserverConnected = useRef(false);\n const rect = useRef(null);\n const callbackId = useRef(null);\n const {\n disabled: resizeObserverDisabled,\n updateMeasurementsFor,\n timeout: resizeObserverTimeout\n } = { ...defaultResizeObserverConfig,\n ...resizeObserverConfig\n };\n const ids = useLatestValue(updateMeasurementsFor != null ? updateMeasurementsFor : id);\n const handleResize = useCallback(() => {\n if (!resizeObserverConnected.current) {\n // ResizeObserver invokes the `handleResize` callback as soon as `observe` is called,\n // assuming the element is rendered and displayed.\n resizeObserverConnected.current = true;\n return;\n }\n\n if (callbackId.current != null) {\n clearTimeout(callbackId.current);\n }\n\n callbackId.current = setTimeout(() => {\n measureDroppableContainers(Array.isArray(ids.current) ? ids.current : [ids.current]);\n callbackId.current = null;\n }, resizeObserverTimeout);\n }, //eslint-disable-next-line react-hooks/exhaustive-deps\n [resizeObserverTimeout]);\n const resizeObserver = useResizeObserver({\n callback: handleResize,\n disabled: resizeObserverDisabled || !active\n });\n const handleNodeChange = useCallback((newElement, previousElement) => {\n if (!resizeObserver) {\n return;\n }\n\n if (previousElement) {\n resizeObserver.unobserve(previousElement);\n resizeObserverConnected.current = false;\n }\n\n if (newElement) {\n resizeObserver.observe(newElement);\n }\n }, [resizeObserver]);\n const [nodeRef, setNodeRef] = useNodeRef(handleNodeChange);\n const dataRef = useLatestValue(data);\n useEffect(() => {\n if (!resizeObserver || !nodeRef.current) {\n return;\n }\n\n resizeObserver.disconnect();\n resizeObserverConnected.current = false;\n resizeObserver.observe(nodeRef.current);\n }, [nodeRef, resizeObserver]);\n useEffect(() => {\n dispatch({\n type: Action.RegisterDroppable,\n element: {\n id,\n key,\n disabled,\n node: nodeRef,\n rect,\n data: dataRef\n }\n });\n return () => dispatch({\n type: Action.UnregisterDroppable,\n key,\n id\n });\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n [id]);\n useEffect(() => {\n if (disabled !== previous.current.disabled) {\n dispatch({\n type: Action.SetDroppableDisabled,\n id,\n key,\n disabled\n });\n previous.current.disabled = disabled;\n }\n }, [id, key, disabled, dispatch]);\n return {\n active,\n rect,\n isOver: (over == null ? void 0 : over.id) === id,\n node: nodeRef,\n over,\n setNodeRef\n };\n}\n\nfunction AnimationManager(_ref) {\n let {\n animation,\n children\n } = _ref;\n const [clonedChildren, setClonedChildren] = useState(null);\n const [element, setElement] = useState(null);\n const previousChildren = usePrevious(children);\n\n if (!children && !clonedChildren && previousChildren) {\n setClonedChildren(previousChildren);\n }\n\n useIsomorphicLayoutEffect(() => {\n if (!element) {\n return;\n }\n\n const key = clonedChildren == null ? void 0 : clonedChildren.key;\n const id = clonedChildren == null ? void 0 : clonedChildren.props.id;\n\n if (key == null || id == null) {\n setClonedChildren(null);\n return;\n }\n\n Promise.resolve(animation(id, element)).then(() => {\n setClonedChildren(null);\n });\n }, [animation, clonedChildren, element]);\n return React.createElement(React.Fragment, null, children, clonedChildren ? cloneElement(clonedChildren, {\n ref: setElement\n }) : null);\n}\n\nconst defaultTransform = {\n x: 0,\n y: 0,\n scaleX: 1,\n scaleY: 1\n};\nfunction NullifiedContextProvider(_ref) {\n let {\n children\n } = _ref;\n return React.createElement(InternalContext.Provider, {\n value: defaultInternalContext\n }, React.createElement(ActiveDraggableContext.Provider, {\n value: defaultTransform\n }, children));\n}\n\nconst baseStyles = {\n position: 'fixed',\n touchAction: 'none'\n};\n\nconst defaultTransition = activatorEvent => {\n const isKeyboardActivator = isKeyboardEvent(activatorEvent);\n return isKeyboardActivator ? 'transform 250ms ease' : undefined;\n};\n\nconst PositionedOverlay = /*#__PURE__*/forwardRef((_ref, ref) => {\n let {\n as,\n activatorEvent,\n adjustScale,\n children,\n className,\n rect,\n style,\n transform,\n transition = defaultTransition\n } = _ref;\n\n if (!rect) {\n return null;\n }\n\n const scaleAdjustedTransform = adjustScale ? transform : { ...transform,\n scaleX: 1,\n scaleY: 1\n };\n const styles = { ...baseStyles,\n width: rect.width,\n height: rect.height,\n top: rect.top,\n left: rect.left,\n transform: CSS.Transform.toString(scaleAdjustedTransform),\n transformOrigin: adjustScale && activatorEvent ? getRelativeTransformOrigin(activatorEvent, rect) : undefined,\n transition: typeof transition === 'function' ? transition(activatorEvent) : transition,\n ...style\n };\n return React.createElement(as, {\n className,\n style: styles,\n ref\n }, children);\n});\n\nconst defaultDropAnimationSideEffects = options => _ref => {\n let {\n active,\n dragOverlay\n } = _ref;\n const originalStyles = {};\n const {\n styles,\n className\n } = options;\n\n if (styles != null && styles.active) {\n for (const [key, value] of Object.entries(styles.active)) {\n if (value === undefined) {\n continue;\n }\n\n originalStyles[key] = active.node.style.getPropertyValue(key);\n active.node.style.setProperty(key, value);\n }\n }\n\n if (styles != null && styles.dragOverlay) {\n for (const [key, value] of Object.entries(styles.dragOverlay)) {\n if (value === undefined) {\n continue;\n }\n\n dragOverlay.node.style.setProperty(key, value);\n }\n }\n\n if (className != null && className.active) {\n active.node.classList.add(className.active);\n }\n\n if (className != null && className.dragOverlay) {\n dragOverlay.node.classList.add(className.dragOverlay);\n }\n\n return function cleanup() {\n for (const [key, value] of Object.entries(originalStyles)) {\n active.node.style.setProperty(key, value);\n }\n\n if (className != null && className.active) {\n active.node.classList.remove(className.active);\n }\n };\n};\n\nconst defaultKeyframeResolver = _ref2 => {\n let {\n transform: {\n initial,\n final\n }\n } = _ref2;\n return [{\n transform: CSS.Transform.toString(initial)\n }, {\n transform: CSS.Transform.toString(final)\n }];\n};\n\nconst defaultDropAnimationConfiguration = {\n duration: 250,\n easing: 'ease',\n keyframes: defaultKeyframeResolver,\n sideEffects: /*#__PURE__*/defaultDropAnimationSideEffects({\n styles: {\n active: {\n opacity: '0'\n }\n }\n })\n};\nfunction useDropAnimation(_ref3) {\n let {\n config,\n draggableNodes,\n droppableContainers,\n measuringConfiguration\n } = _ref3;\n return useEvent((id, node) => {\n if (config === null) {\n return;\n }\n\n const activeDraggable = draggableNodes.get(id);\n\n if (!activeDraggable) {\n return;\n }\n\n const activeNode = activeDraggable.node.current;\n\n if (!activeNode) {\n return;\n }\n\n const measurableNode = getMeasurableNode(node);\n\n if (!measurableNode) {\n return;\n }\n\n const {\n transform\n } = getWindow(node).getComputedStyle(node);\n const parsedTransform = parseTransform(transform);\n\n if (!parsedTransform) {\n return;\n }\n\n const animation = typeof config === 'function' ? config : createDefaultDropAnimation(config);\n scrollIntoViewIfNeeded(activeNode, measuringConfiguration.draggable.measure);\n return animation({\n active: {\n id,\n data: activeDraggable.data,\n node: activeNode,\n rect: measuringConfiguration.draggable.measure(activeNode)\n },\n draggableNodes,\n dragOverlay: {\n node,\n rect: measuringConfiguration.dragOverlay.measure(measurableNode)\n },\n droppableContainers,\n measuringConfiguration,\n transform: parsedTransform\n });\n });\n}\n\nfunction createDefaultDropAnimation(options) {\n const {\n duration,\n easing,\n sideEffects,\n keyframes\n } = { ...defaultDropAnimationConfiguration,\n ...options\n };\n return _ref4 => {\n let {\n active,\n dragOverlay,\n transform,\n ...rest\n } = _ref4;\n\n if (!duration) {\n // Do not animate if animation duration is zero.\n return;\n }\n\n const delta = {\n x: dragOverlay.rect.left - active.rect.left,\n y: dragOverlay.rect.top - active.rect.top\n };\n const scale = {\n scaleX: transform.scaleX !== 1 ? active.rect.width * transform.scaleX / dragOverlay.rect.width : 1,\n scaleY: transform.scaleY !== 1 ? active.rect.height * transform.scaleY / dragOverlay.rect.height : 1\n };\n const finalTransform = {\n x: transform.x - delta.x,\n y: transform.y - delta.y,\n ...scale\n };\n const animationKeyframes = keyframes({ ...rest,\n active,\n dragOverlay,\n transform: {\n initial: transform,\n final: finalTransform\n }\n });\n const [firstKeyframe] = animationKeyframes;\n const lastKeyframe = animationKeyframes[animationKeyframes.length - 1];\n\n if (JSON.stringify(firstKeyframe) === JSON.stringify(lastKeyframe)) {\n // The start and end keyframes are the same, infer that there is no animation needed.\n return;\n }\n\n const cleanup = sideEffects == null ? void 0 : sideEffects({\n active,\n dragOverlay,\n ...rest\n });\n const animation = dragOverlay.node.animate(animationKeyframes, {\n duration,\n easing,\n fill: 'forwards'\n });\n return new Promise(resolve => {\n animation.onfinish = () => {\n cleanup == null ? void 0 : cleanup();\n resolve();\n };\n });\n };\n}\n\nlet key = 0;\nfunction useKey(id) {\n return useMemo(() => {\n if (id == null) {\n return;\n }\n\n key++;\n return key;\n }, [id]);\n}\n\nconst DragOverlay = /*#__PURE__*/React.memo(_ref => {\n let {\n adjustScale = false,\n children,\n dropAnimation: dropAnimationConfig,\n style,\n transition,\n modifiers,\n wrapperElement = 'div',\n className,\n zIndex = 999\n } = _ref;\n const {\n activatorEvent,\n active,\n activeNodeRect,\n containerNodeRect,\n draggableNodes,\n droppableContainers,\n dragOverlay,\n over,\n measuringConfiguration,\n scrollableAncestors,\n scrollableAncestorRects,\n windowRect\n } = useDndContext();\n const transform = useContext(ActiveDraggableContext);\n const key = useKey(active == null ? void 0 : active.id);\n const modifiedTransform = applyModifiers(modifiers, {\n activatorEvent,\n active,\n activeNodeRect,\n containerNodeRect,\n draggingNodeRect: dragOverlay.rect,\n over,\n overlayNodeRect: dragOverlay.rect,\n scrollableAncestors,\n scrollableAncestorRects,\n transform,\n windowRect\n });\n const initialRect = useInitialValue(activeNodeRect);\n const dropAnimation = useDropAnimation({\n config: dropAnimationConfig,\n draggableNodes,\n droppableContainers,\n measuringConfiguration\n }); // We need to wait for the active node to be measured before connecting the drag overlay ref\n // otherwise collisions can be computed against a mispositioned drag overlay\n\n const ref = initialRect ? dragOverlay.setRef : undefined;\n return React.createElement(NullifiedContextProvider, null, React.createElement(AnimationManager, {\n animation: dropAnimation\n }, active && key ? React.createElement(PositionedOverlay, {\n key: key,\n id: active.id,\n ref: ref,\n as: wrapperElement,\n activatorEvent: activatorEvent,\n adjustScale: adjustScale,\n className: className,\n transition: transition,\n rect: initialRect,\n style: {\n zIndex,\n ...style\n },\n transform: modifiedTransform\n }, children) : null));\n});\n\nexport { AutoScrollActivator, DndContext, DragOverlay, KeyboardCode, KeyboardSensor, MeasuringFrequency, MeasuringStrategy, MouseSensor, PointerSensor, TouchSensor, TraversalOrder, applyModifiers, closestCenter, closestCorners, defaultAnnouncements, defaultCoordinates, defaultDropAnimationConfiguration as defaultDropAnimation, defaultDropAnimationSideEffects, defaultKeyboardCoordinateGetter, defaultScreenReaderInstructions, getClientRect, getFirstCollision, getScrollableAncestors, pointerWithin, rectIntersection, useDndContext, useDndMonitor, useDraggable, useDroppable, useSensor, useSensors };\n//# sourceMappingURL=core.esm.js.map\n","import React, { useMemo, useRef, useEffect, useState, useContext } from 'react';\nimport { useDndContext, getClientRect, useDroppable, useDraggable, closestCorners, getFirstCollision, getScrollableAncestors, KeyboardCode } from '@dnd-kit/core';\nimport { useUniqueId, useIsomorphicLayoutEffect, CSS, useCombinedRefs, isKeyboardEvent, subtract } from '@dnd-kit/utilities';\n\n/**\r\n * Move an array item to a different position. Returns a new array with the item moved to the new position.\r\n */\nfunction arrayMove(array, from, to) {\n const newArray = array.slice();\n newArray.splice(to < 0 ? newArray.length + to : to, 0, newArray.splice(from, 1)[0]);\n return newArray;\n}\n\n/**\r\n * Swap an array item to a different position. Returns a new array with the item swapped to the new position.\r\n */\nfunction arraySwap(array, from, to) {\n const newArray = array.slice();\n newArray[from] = array[to];\n newArray[to] = array[from];\n return newArray;\n}\n\nfunction getSortedRects(items, rects) {\n return items.reduce((accumulator, id, index) => {\n const rect = rects.get(id);\n\n if (rect) {\n accumulator[index] = rect;\n }\n\n return accumulator;\n }, Array(items.length));\n}\n\nfunction isValidIndex(index) {\n return index !== null && index >= 0;\n}\n\nfunction itemsEqual(a, b) {\n if (a === b) {\n return true;\n }\n\n if (a.length !== b.length) {\n return false;\n }\n\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction normalizeDisabled(disabled) {\n if (typeof disabled === 'boolean') {\n return {\n draggable: disabled,\n droppable: disabled\n };\n }\n\n return disabled;\n}\n\n// To-do: We should be calculating scale transformation\nconst defaultScale = {\n scaleX: 1,\n scaleY: 1\n};\nconst horizontalListSortingStrategy = _ref => {\n var _rects$activeIndex;\n\n let {\n rects,\n activeNodeRect: fallbackActiveRect,\n activeIndex,\n overIndex,\n index\n } = _ref;\n const activeNodeRect = (_rects$activeIndex = rects[activeIndex]) != null ? _rects$activeIndex : fallbackActiveRect;\n\n if (!activeNodeRect) {\n return null;\n }\n\n const itemGap = getItemGap(rects, index, activeIndex);\n\n if (index === activeIndex) {\n const newIndexRect = rects[overIndex];\n\n if (!newIndexRect) {\n return null;\n }\n\n return {\n x: activeIndex < overIndex ? newIndexRect.left + newIndexRect.width - (activeNodeRect.left + activeNodeRect.width) : newIndexRect.left - activeNodeRect.left,\n y: 0,\n ...defaultScale\n };\n }\n\n if (index > activeIndex && index <= overIndex) {\n return {\n x: -activeNodeRect.width - itemGap,\n y: 0,\n ...defaultScale\n };\n }\n\n if (index < activeIndex && index >= overIndex) {\n return {\n x: activeNodeRect.width + itemGap,\n y: 0,\n ...defaultScale\n };\n }\n\n return {\n x: 0,\n y: 0,\n ...defaultScale\n };\n};\n\nfunction getItemGap(rects, index, activeIndex) {\n const currentRect = rects[index];\n const previousRect = rects[index - 1];\n const nextRect = rects[index + 1];\n\n if (!currentRect || !previousRect && !nextRect) {\n return 0;\n }\n\n if (activeIndex < index) {\n return previousRect ? currentRect.left - (previousRect.left + previousRect.width) : nextRect.left - (currentRect.left + currentRect.width);\n }\n\n return nextRect ? nextRect.left - (currentRect.left + currentRect.width) : currentRect.left - (previousRect.left + previousRect.width);\n}\n\nconst rectSortingStrategy = _ref => {\n let {\n rects,\n activeIndex,\n overIndex,\n index\n } = _ref;\n const newRects = arrayMove(rects, overIndex, activeIndex);\n const oldRect = rects[index];\n const newRect = newRects[index];\n\n if (!newRect || !oldRect) {\n return null;\n }\n\n return {\n x: newRect.left - oldRect.left,\n y: newRect.top - oldRect.top,\n scaleX: newRect.width / oldRect.width,\n scaleY: newRect.height / oldRect.height\n };\n};\n\nconst rectSwappingStrategy = _ref => {\n let {\n activeIndex,\n index,\n rects,\n overIndex\n } = _ref;\n let oldRect;\n let newRect;\n\n if (index === activeIndex) {\n oldRect = rects[index];\n newRect = rects[overIndex];\n }\n\n if (index === overIndex) {\n oldRect = rects[index];\n newRect = rects[activeIndex];\n }\n\n if (!newRect || !oldRect) {\n return null;\n }\n\n return {\n x: newRect.left - oldRect.left,\n y: newRect.top - oldRect.top,\n scaleX: newRect.width / oldRect.width,\n scaleY: newRect.height / oldRect.height\n };\n};\n\n// To-do: We should be calculating scale transformation\nconst defaultScale$1 = {\n scaleX: 1,\n scaleY: 1\n};\nconst verticalListSortingStrategy = _ref => {\n var _rects$activeIndex;\n\n let {\n activeIndex,\n activeNodeRect: fallbackActiveRect,\n index,\n rects,\n overIndex\n } = _ref;\n const activeNodeRect = (_rects$activeIndex = rects[activeIndex]) != null ? _rects$activeIndex : fallbackActiveRect;\n\n if (!activeNodeRect) {\n return null;\n }\n\n if (index === activeIndex) {\n const overIndexRect = rects[overIndex];\n\n if (!overIndexRect) {\n return null;\n }\n\n return {\n x: 0,\n y: activeIndex < overIndex ? overIndexRect.top + overIndexRect.height - (activeNodeRect.top + activeNodeRect.height) : overIndexRect.top - activeNodeRect.top,\n ...defaultScale$1\n };\n }\n\n const itemGap = getItemGap$1(rects, index, activeIndex);\n\n if (index > activeIndex && index <= overIndex) {\n return {\n x: 0,\n y: -activeNodeRect.height - itemGap,\n ...defaultScale$1\n };\n }\n\n if (index < activeIndex && index >= overIndex) {\n return {\n x: 0,\n y: activeNodeRect.height + itemGap,\n ...defaultScale$1\n };\n }\n\n return {\n x: 0,\n y: 0,\n ...defaultScale$1\n };\n};\n\nfunction getItemGap$1(clientRects, index, activeIndex) {\n const currentRect = clientRects[index];\n const previousRect = clientRects[index - 1];\n const nextRect = clientRects[index + 1];\n\n if (!currentRect) {\n return 0;\n }\n\n if (activeIndex < index) {\n return previousRect ? currentRect.top - (previousRect.top + previousRect.height) : nextRect ? nextRect.top - (currentRect.top + currentRect.height) : 0;\n }\n\n return nextRect ? nextRect.top - (currentRect.top + currentRect.height) : previousRect ? currentRect.top - (previousRect.top + previousRect.height) : 0;\n}\n\nconst ID_PREFIX = 'Sortable';\nconst Context = /*#__PURE__*/React.createContext({\n activeIndex: -1,\n containerId: ID_PREFIX,\n disableTransforms: false,\n items: [],\n overIndex: -1,\n useDragOverlay: false,\n sortedRects: [],\n strategy: rectSortingStrategy,\n disabled: {\n draggable: false,\n droppable: false\n }\n});\nfunction SortableContext(_ref) {\n let {\n children,\n id,\n items: userDefinedItems,\n strategy = rectSortingStrategy,\n disabled: disabledProp = false\n } = _ref;\n const {\n active,\n dragOverlay,\n droppableRects,\n over,\n measureDroppableContainers\n } = useDndContext();\n const containerId = useUniqueId(ID_PREFIX, id);\n const useDragOverlay = Boolean(dragOverlay.rect !== null);\n const items = useMemo(() => userDefinedItems.map(item => typeof item === 'object' && 'id' in item ? item.id : item), [userDefinedItems]);\n const isDragging = active != null;\n const activeIndex = active ? items.indexOf(active.id) : -1;\n const overIndex = over ? items.indexOf(over.id) : -1;\n const previousItemsRef = useRef(items);\n const itemsHaveChanged = !itemsEqual(items, previousItemsRef.current);\n const disableTransforms = overIndex !== -1 && activeIndex === -1 || itemsHaveChanged;\n const disabled = normalizeDisabled(disabledProp);\n useIsomorphicLayoutEffect(() => {\n if (itemsHaveChanged && isDragging) {\n measureDroppableContainers(items);\n }\n }, [itemsHaveChanged, items, isDragging, measureDroppableContainers]);\n useEffect(() => {\n previousItemsRef.current = items;\n }, [items]);\n const contextValue = useMemo(() => ({\n activeIndex,\n containerId,\n disabled,\n disableTransforms,\n items,\n overIndex,\n useDragOverlay,\n sortedRects: getSortedRects(items, droppableRects),\n strategy\n }), // eslint-disable-next-line react-hooks/exhaustive-deps\n [activeIndex, containerId, disabled.draggable, disabled.droppable, disableTransforms, items, overIndex, droppableRects, useDragOverlay, strategy]);\n return React.createElement(Context.Provider, {\n value: contextValue\n }, children);\n}\n\nconst defaultNewIndexGetter = _ref => {\n let {\n id,\n items,\n activeIndex,\n overIndex\n } = _ref;\n return arrayMove(items, activeIndex, overIndex).indexOf(id);\n};\nconst defaultAnimateLayoutChanges = _ref2 => {\n let {\n containerId,\n isSorting,\n wasDragging,\n index,\n items,\n newIndex,\n previousItems,\n previousContainerId,\n transition\n } = _ref2;\n\n if (!transition || !wasDragging) {\n return false;\n }\n\n if (previousItems !== items && index === newIndex) {\n return false;\n }\n\n if (isSorting) {\n return true;\n }\n\n return newIndex !== index && containerId === previousContainerId;\n};\nconst defaultTransition = {\n duration: 200,\n easing: 'ease'\n};\nconst transitionProperty = 'transform';\nconst disabledTransition = /*#__PURE__*/CSS.Transition.toString({\n property: transitionProperty,\n duration: 0,\n easing: 'linear'\n});\nconst defaultAttributes = {\n roleDescription: 'sortable'\n};\n\n/*\r\n * When the index of an item changes while sorting,\r\n * we need to temporarily disable the transforms\r\n */\n\nfunction useDerivedTransform(_ref) {\n let {\n disabled,\n index,\n node,\n rect\n } = _ref;\n const [derivedTransform, setDerivedtransform] = useState(null);\n const previousIndex = useRef(index);\n useIsomorphicLayoutEffect(() => {\n if (!disabled && index !== previousIndex.current && node.current) {\n const initial = rect.current;\n\n if (initial) {\n const current = getClientRect(node.current, {\n ignoreTransform: true\n });\n const delta = {\n x: initial.left - current.left,\n y: initial.top - current.top,\n scaleX: initial.width / current.width,\n scaleY: initial.height / current.height\n };\n\n if (delta.x || delta.y) {\n setDerivedtransform(delta);\n }\n }\n }\n\n if (index !== previousIndex.current) {\n previousIndex.current = index;\n }\n }, [disabled, index, node, rect]);\n useEffect(() => {\n if (derivedTransform) {\n setDerivedtransform(null);\n }\n }, [derivedTransform]);\n return derivedTransform;\n}\n\nfunction useSortable(_ref) {\n let {\n animateLayoutChanges = defaultAnimateLayoutChanges,\n attributes: userDefinedAttributes,\n disabled: localDisabled,\n data: customData,\n getNewIndex = defaultNewIndexGetter,\n id,\n strategy: localStrategy,\n resizeObserverConfig,\n transition = defaultTransition\n } = _ref;\n const {\n items,\n containerId,\n activeIndex,\n disabled: globalDisabled,\n disableTransforms,\n sortedRects,\n overIndex,\n useDragOverlay,\n strategy: globalStrategy\n } = useContext(Context);\n const disabled = normalizeLocalDisabled(localDisabled, globalDisabled);\n const index = items.indexOf(id);\n const data = useMemo(() => ({\n sortable: {\n containerId,\n index,\n items\n },\n ...customData\n }), [containerId, customData, index, items]);\n const itemsAfterCurrentSortable = useMemo(() => items.slice(items.indexOf(id)), [items, id]);\n const {\n rect,\n node,\n isOver,\n setNodeRef: setDroppableNodeRef\n } = useDroppable({\n id,\n data,\n disabled: disabled.droppable,\n resizeObserverConfig: {\n updateMeasurementsFor: itemsAfterCurrentSortable,\n ...resizeObserverConfig\n }\n });\n const {\n active,\n activatorEvent,\n activeNodeRect,\n attributes,\n setNodeRef: setDraggableNodeRef,\n listeners,\n isDragging,\n over,\n setActivatorNodeRef,\n transform\n } = useDraggable({\n id,\n data,\n attributes: { ...defaultAttributes,\n ...userDefinedAttributes\n },\n disabled: disabled.draggable\n });\n const setNodeRef = useCombinedRefs(setDroppableNodeRef, setDraggableNodeRef);\n const isSorting = Boolean(active);\n const displaceItem = isSorting && !disableTransforms && isValidIndex(activeIndex) && isValidIndex(overIndex);\n const shouldDisplaceDragSource = !useDragOverlay && isDragging;\n const dragSourceDisplacement = shouldDisplaceDragSource && displaceItem ? transform : null;\n const strategy = localStrategy != null ? localStrategy : globalStrategy;\n const finalTransform = displaceItem ? dragSourceDisplacement != null ? dragSourceDisplacement : strategy({\n rects: sortedRects,\n activeNodeRect,\n activeIndex,\n overIndex,\n index\n }) : null;\n const newIndex = isValidIndex(activeIndex) && isValidIndex(overIndex) ? getNewIndex({\n id,\n items,\n activeIndex,\n overIndex\n }) : index;\n const activeId = active == null ? void 0 : active.id;\n const previous = useRef({\n activeId,\n items,\n newIndex,\n containerId\n });\n const itemsHaveChanged = items !== previous.current.items;\n const shouldAnimateLayoutChanges = animateLayoutChanges({\n active,\n containerId,\n isDragging,\n isSorting,\n id,\n index,\n items,\n newIndex: previous.current.newIndex,\n previousItems: previous.current.items,\n previousContainerId: previous.current.containerId,\n transition,\n wasDragging: previous.current.activeId != null\n });\n const derivedTransform = useDerivedTransform({\n disabled: !shouldAnimateLayoutChanges,\n index,\n node,\n rect\n });\n useEffect(() => {\n if (isSorting && previous.current.newIndex !== newIndex) {\n previous.current.newIndex = newIndex;\n }\n\n if (containerId !== previous.current.containerId) {\n previous.current.containerId = containerId;\n }\n\n if (items !== previous.current.items) {\n previous.current.items = items;\n }\n }, [isSorting, newIndex, containerId, items]);\n useEffect(() => {\n if (activeId === previous.current.activeId) {\n return;\n }\n\n if (activeId != null && previous.current.activeId == null) {\n previous.current.activeId = activeId;\n return;\n }\n\n const timeoutId = setTimeout(() => {\n previous.current.activeId = activeId;\n }, 50);\n return () => clearTimeout(timeoutId);\n }, [activeId]);\n return {\n active,\n activeIndex,\n attributes,\n data,\n rect,\n index,\n newIndex,\n items,\n isOver,\n isSorting,\n isDragging,\n listeners,\n node,\n overIndex,\n over,\n setNodeRef,\n setActivatorNodeRef,\n setDroppableNodeRef,\n setDraggableNodeRef,\n transform: derivedTransform != null ? derivedTransform : finalTransform,\n transition: getTransition()\n };\n\n function getTransition() {\n if ( // Temporarily disable transitions for a single frame to set up derived transforms\n derivedTransform || // Or to prevent items jumping to back to their \"new\" position when items change\n itemsHaveChanged && previous.current.newIndex === index) {\n return disabledTransition;\n }\n\n if (shouldDisplaceDragSource && !isKeyboardEvent(activatorEvent) || !transition) {\n return undefined;\n }\n\n if (isSorting || shouldAnimateLayoutChanges) {\n return CSS.Transition.toString({ ...transition,\n property: transitionProperty\n });\n }\n\n return undefined;\n }\n}\n\nfunction normalizeLocalDisabled(localDisabled, globalDisabled) {\n var _localDisabled$dragga, _localDisabled$droppa;\n\n if (typeof localDisabled === 'boolean') {\n return {\n draggable: localDisabled,\n // Backwards compatibility\n droppable: false\n };\n }\n\n return {\n draggable: (_localDisabled$dragga = localDisabled == null ? void 0 : localDisabled.draggable) != null ? _localDisabled$dragga : globalDisabled.draggable,\n droppable: (_localDisabled$droppa = localDisabled == null ? void 0 : localDisabled.droppable) != null ? _localDisabled$droppa : globalDisabled.droppable\n };\n}\n\nfunction hasSortableData(entry) {\n if (!entry) {\n return false;\n }\n\n const data = entry.data.current;\n\n if (data && 'sortable' in data && typeof data.sortable === 'object' && 'containerId' in data.sortable && 'items' in data.sortable && 'index' in data.sortable) {\n return true;\n }\n\n return false;\n}\n\nconst directions = [KeyboardCode.Down, KeyboardCode.Right, KeyboardCode.Up, KeyboardCode.Left];\nconst sortableKeyboardCoordinates = (event, _ref) => {\n let {\n context: {\n active,\n collisionRect,\n droppableRects,\n droppableContainers,\n over,\n scrollableAncestors\n }\n } = _ref;\n\n if (directions.includes(event.code)) {\n event.preventDefault();\n\n if (!active || !collisionRect) {\n return;\n }\n\n const filteredContainers = [];\n droppableContainers.getEnabled().forEach(entry => {\n if (!entry || entry != null && entry.disabled) {\n return;\n }\n\n const rect = droppableRects.get(entry.id);\n\n if (!rect) {\n return;\n }\n\n switch (event.code) {\n case KeyboardCode.Down:\n if (collisionRect.top < rect.top) {\n filteredContainers.push(entry);\n }\n\n break;\n\n case KeyboardCode.Up:\n if (collisionRect.top > rect.top) {\n filteredContainers.push(entry);\n }\n\n break;\n\n case KeyboardCode.Left:\n if (collisionRect.left > rect.left) {\n filteredContainers.push(entry);\n }\n\n break;\n\n case KeyboardCode.Right:\n if (collisionRect.left < rect.left) {\n filteredContainers.push(entry);\n }\n\n break;\n }\n });\n const collisions = closestCorners({\n active,\n collisionRect: collisionRect,\n droppableRects,\n droppableContainers: filteredContainers,\n pointerCoordinates: null\n });\n let closestId = getFirstCollision(collisions, 'id');\n\n if (closestId === (over == null ? void 0 : over.id) && collisions.length > 1) {\n closestId = collisions[1].id;\n }\n\n if (closestId != null) {\n const activeDroppable = droppableContainers.get(active.id);\n const newDroppable = droppableContainers.get(closestId);\n const newRect = newDroppable ? droppableRects.get(newDroppable.id) : null;\n const newNode = newDroppable == null ? void 0 : newDroppable.node.current;\n\n if (newNode && newRect && activeDroppable && newDroppable) {\n const newScrollAncestors = getScrollableAncestors(newNode);\n const hasDifferentScrollAncestors = newScrollAncestors.some((element, index) => scrollableAncestors[index] !== element);\n const hasSameContainer = isSameContainer(activeDroppable, newDroppable);\n const isAfterActive = isAfter(activeDroppable, newDroppable);\n const offset = hasDifferentScrollAncestors || !hasSameContainer ? {\n x: 0,\n y: 0\n } : {\n x: isAfterActive ? collisionRect.width - newRect.width : 0,\n y: isAfterActive ? collisionRect.height - newRect.height : 0\n };\n const rectCoordinates = {\n x: newRect.left,\n y: newRect.top\n };\n const newCoordinates = offset.x && offset.y ? rectCoordinates : subtract(rectCoordinates, offset);\n return newCoordinates;\n }\n }\n }\n\n return undefined;\n};\n\nfunction isSameContainer(a, b) {\n if (!hasSortableData(a) || !hasSortableData(b)) {\n return false;\n }\n\n return a.data.current.sortable.containerId === b.data.current.sortable.containerId;\n}\n\nfunction isAfter(a, b) {\n if (!hasSortableData(a) || !hasSortableData(b)) {\n return false;\n }\n\n if (!isSameContainer(a, b)) {\n return false;\n }\n\n return a.data.current.sortable.index < b.data.current.sortable.index;\n}\n\nexport { SortableContext, arrayMove, arraySwap, defaultAnimateLayoutChanges, defaultNewIndexGetter, hasSortableData, horizontalListSortingStrategy, rectSortingStrategy, rectSwappingStrategy, sortableKeyboardCoordinates, useSortable, verticalListSortingStrategy };\n//# sourceMappingURL=sortable.esm.js.map\n","/**\n * SortableThumbnailItem 컴포넌트\n *\n * 드래그 앤 드롭이 가능한 파일 썸네일 아이템입니다.\n *\n * @module composite/FileUploader/SortableThumbnailItem\n */\n\nimport React, { useState, useEffect } from 'react';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\n\nimport { Div } from '../../basic/Div';\nimport { Button } from '../../basic/Button';\nimport { Span } from '../../basic/Span';\nimport { P } from '../../basic/P';\nimport { I } from '../../basic/I';\nimport { Img } from '../../basic/Img';\n\nimport type { Attachment, PendingFile } from './types';\nimport { getFileIcon, t } from './utils';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst G7Core = (window as any).G7Core;\n\nexport interface SortableThumbnailItemProps {\n file: PendingFile | (Attachment & { status?: string });\n onRemove: () => void;\n onRetry?: () => void;\n /** 이미지 클릭 시 갤러리 열기 */\n onImageClick?: () => void;\n /** 비이미지 파일 클릭/다운로드 시 호출 */\n onDownload?: () => void;\n /** 대표 이미지 여부 */\n isPrimary?: boolean;\n /** 대표 이미지 설정 클릭 핸들러 */\n onPrimaryClick?: () => void;\n}\n\nexport const SortableThumbnailItem: React.FC = ({\n file,\n onRemove,\n onRetry,\n onImageClick,\n onDownload,\n isPrimary,\n onPrimaryClick,\n}) => {\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({\n id: 'hash' in file ? file.hash : file.id,\n });\n\n const style = {\n transform: CSS.Transform.toString(transform),\n transition,\n opacity: isDragging ? 0.5 : 1,\n };\n\n const isPending = 'status' in file && file.status !== undefined;\n const status = isPending ? (file as PendingFile).status : 'done';\n const isUploading = status === 'uploading';\n const isCompressing = status === 'compressing';\n const hasError = status === 'error';\n const progress = isPending ? (file as PendingFile).progress : 100;\n const preview = isPending ? (file as PendingFile).preview : undefined;\n // 기존 첨부파일: is_image 필드 우선 사용, 대기 파일: mime_type 확인\n const isImage = !isPending\n ? (file as Attachment).is_image\n : (file.mime_type?.startsWith('image/') ?? false);\n\n // 인증된 이미지 로딩을 위한 상태\n const [authenticatedImageUrl, setAuthenticatedImageUrl] = useState(undefined);\n const downloadUrl = !isPending && isImage ? (file as Attachment).download_url : undefined;\n\n // 기존 첨부파일의 경우 인증된 요청으로 이미지 로드\n useEffect(() => {\n if (!downloadUrl) {\n setAuthenticatedImageUrl(undefined);\n return;\n }\n\n let isMounted = true;\n let objectUrl: string | undefined;\n\n const loadAuthenticatedImage = async () => {\n try {\n const blob = await G7Core.api.get(downloadUrl, {\n responseType: 'blob',\n });\n if (isMounted && blob) {\n objectUrl = URL.createObjectURL(blob);\n setAuthenticatedImageUrl(objectUrl);\n }\n } catch (error) {\n console.error('Failed to load authenticated image:', error);\n }\n };\n\n loadAuthenticatedImage();\n\n return () => {\n isMounted = false;\n if (objectUrl) {\n URL.revokeObjectURL(objectUrl);\n }\n };\n }, [downloadUrl]);\n\n // 기존 첨부파일의 경우 인증된 URL 사용\n const existingImageUrl = authenticatedImageUrl;\n\n return (\n \n {/* 썸네일 영역 */}\n {\n // 업로드 중/압축 중이면 클릭 무시\n if (isUploading || isCompressing) return;\n\n if (isImage && onImageClick) {\n // 이미지는 갤러리 열기\n onImageClick();\n } else if (!isPending && onDownload) {\n // 비이미지 기존 파일은 다운로드\n onDownload();\n }\n }}\n >\n {/* 이미지 미리보기 */}\n {(preview || existingImageUrl) ? (\n \n ) : (\n /* 파일 아이콘 */\n \n )}\n\n {/* 업로드/압축 진행률 오버레이 */}\n {(isUploading || isCompressing) && (\n
\n
\n \n
\n {progress}%\n
\n )}\n\n {/* 에러 오버레이 */}\n {hasError && (\n
\n \n
\n )}\n\n {/* 대표 이미지 뱃지 */}\n {onPrimaryClick && (\n {\n e.stopPropagation();\n onPrimaryClick();\n }}\n className={`absolute top-1.5 left-1.5 z-10 p-1 rounded-full transition-colors ${\n isPrimary\n ? 'bg-yellow-500 text-white'\n : 'bg-gray-800/50 text-gray-300 hover:bg-yellow-500 hover:text-white opacity-0 group-hover:opacity-100'\n }`}\n title={isPrimary ? t('attachment.primary_image') : t('attachment.set_as_primary')}\n >\n \n \n )}\n\n {/* 호버 시 액션 버튼들 */}\n
\n {/* 드래그 핸들 */}\n e.stopPropagation()}\n >\n \n \n\n {/* 다운로드 버튼 (기존 첨부파일만) */}\n {!isPending && onDownload && (\n {\n e.stopPropagation();\n onDownload();\n }}\n className=\"p-1.5 bg-white/90 dark:bg-gray-800/90 rounded text-blue-500 hover:bg-white\"\n title={t('common.download')}\n >\n \n \n )}\n\n {/* 재시도 버튼 */}\n {hasError && onRetry && (\n {\n e.stopPropagation();\n onRetry();\n }}\n className=\"p-1.5 bg-white/90 dark:bg-gray-800/90 rounded text-orange-500 hover:bg-white\"\n title={t('common.retry')}\n >\n \n \n )}\n\n {/* 삭제 버튼 */}\n {\n e.stopPropagation();\n onRemove();\n }}\n disabled={isUploading || isCompressing}\n className=\"p-1.5 bg-white/90 dark:bg-gray-800/90 rounded text-red-500 hover:bg-white disabled:opacity-50\"\n title={t('common.delete')}\n >\n \n \n
\n \n\n {/* 파일 정보 */}\n {\n // 기존 첨부파일만 클릭 시 다운로드\n if (!isPending && onDownload) {\n onDownload();\n }\n }}\n >\n

\n {file.original_filename}\n

\n

\n {isPending ? (file as PendingFile).size_formatted : (file as Attachment).size_formatted}\n

\n \n \n );\n};\n\nexport default SortableThumbnailItem;","/**\n * FileList 컴포넌트\n *\n * 파일 목록을 정렬 가능한 그리드 형태로 표시합니다.\n *\n * @module composite/FileUploader/FileList\n */\n\nimport React from 'react';\nimport {\n DndContext,\n closestCenter,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n DragEndEvent,\n} from '@dnd-kit/core';\nimport {\n SortableContext,\n sortableKeyboardCoordinates,\n rectSortingStrategy,\n} from '@dnd-kit/sortable';\n\nimport { Div } from '../../basic/Div';\nimport { Span } from '../../basic/Span';\nimport { I } from '../../basic/I';\n\nimport { SortableThumbnailItem } from './SortableThumbnailItem';\nimport type { Attachment, PendingFile } from './types';\nimport { t } from './utils';\n\nexport interface FileListProps {\n /** 모든 파일 목록 (기존 + 대기) */\n allItems: (Attachment | PendingFile)[];\n /** 더 추가 가능 여부 */\n canAddMore: boolean;\n /** 총 파일 수 */\n totalCount: number;\n /** 최대 파일 수 */\n maxFiles: number;\n /** 최대 파일 크기 (MB) */\n maxSize: number;\n /** 허용 확장자 */\n accept?: string;\n /** 파일 삭제 핸들러 */\n onRemove: (item: PendingFile | Attachment) => void;\n /** 재시도 핸들러 */\n onRetry: (pendingFile: PendingFile) => void;\n /** 이미지 클릭 핸들러 */\n onImageClick: (item: PendingFile | Attachment) => void;\n /** 다운로드 핸들러 */\n onDownload: (item: Attachment) => void;\n /** 드래그 종료 핸들러 */\n onDragEnd: (event: DragEndEvent) => void;\n /** 추가 버튼 클릭 핸들러 */\n onAddClick: () => void;\n /** 대표 이미지 선택 기능 활성화 */\n enablePrimarySelection?: boolean;\n /** 현재 대표 이미지 식별자 (ID 또는 hash) */\n primaryFileId?: number | string | null;\n /** 대표 이미지 변경 핸들러 */\n onPrimaryChange?: (id: number | string | null) => void;\n}\n\nexport const FileList: React.FC = ({\n allItems,\n canAddMore,\n totalCount,\n maxFiles,\n maxSize,\n accept,\n onRemove,\n onRetry,\n onImageClick,\n onDownload,\n onDragEnd,\n onAddClick,\n enablePrimarySelection,\n primaryFileId,\n onPrimaryChange,\n}) => {\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 8 } }),\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates })\n );\n\n return (\n
\n \n ('hash' in item ? item.hash : item.id))}\n strategy={rectSortingStrategy}\n >\n
\n {/* 파일 썸네일들 */}\n {allItems.map((item) => {\n const isExisting = 'hash' in item;\n // 기존 첨부파일: is_image 필드 우선 사용, 대기 파일: mime_type 확인\n const isImage = isExisting\n ? (item as Attachment).is_image\n : (item.mime_type?.startsWith('image/') ?? false);\n\n return (\n onRemove(item)}\n onRetry={\n 'status' in item && item.status === 'error'\n ? () => onRetry(item as PendingFile)\n : undefined\n }\n onImageClick={\n isImage ? () => onImageClick(item) : undefined\n }\n onDownload={\n isExisting ? () => onDownload(item as Attachment) : undefined\n }\n isPrimary={enablePrimarySelection && isExisting && ((item as Attachment).hash || (item as Attachment).id) === primaryFileId}\n onPrimaryClick={\n enablePrimarySelection && isExisting\n ? () => onPrimaryChange?.((item as Attachment).hash || (item as Attachment).id)\n : undefined\n }\n />\n );\n })}\n\n {/* 추가 버튼 (더 추가할 수 있을 때만) */}\n {canAddMore && (\n \n \n {t('common.add')}\n
\n )}\n
\n \n
\n\n {/* 하단 정보 */}\n
\n {t('attachment.attached_count', { count: totalCount, max: maxFiles })}\n {t('attachment.max_size', { size: maxSize })}{accept && ` (${accept})`}\n
\n \n );\n};\n\nexport default FileList;","/**\n * FileUploader 컴포넌트\n *\n * 파일 업로드를 위한 통합 컴포넌트입니다.\n * - 드래그 앤 드롭 지원\n * - 이미지 압축\n * - 병렬 업로드\n * - 순서 변경\n * - 이미지 갤러리\n *\n * @module composite/FileUploader\n */\n\nimport { forwardRef, useImperativeHandle, useMemo, useRef, useCallback } from 'react';\n\nimport { Div } from '../../basic/Div';\nimport { ConfirmDialog } from '../ConfirmDialog';\nimport { ImageGallery, GalleryImage } from '../ImageGallery';\n\nimport { FileUploaderProvider } from './FileUploaderContext';\nimport { useFileUploader } from './useFileUploader';\nimport { FileDropZone } from './FileDropZone';\nimport { FileList } from './FileList';\nimport type { FileUploaderProps, FileUploaderRef, Attachment, PendingFile } from './types';\nimport { t } from './utils';\n\n/** 안정적인 빈 배열 참조 — 매 렌더마다 새 [] 생성 방지 (useEffect 무한 루프 방지) */\nconst EMPTY_FILES: Attachment[] = [];\nconst EMPTY_ROLE_IDS: number[] = [];\n\n// ========== Main Component ==========\n\nexport const FileUploader = forwardRef(\n (\n {\n uploadTriggerEvent,\n attachmentableType,\n attachmentableId,\n collection = 'default',\n maxFiles = 10,\n maxSize = 10,\n maxConcurrentUploads = 3,\n accept,\n imageCompression: compressionOptions,\n roleIds = EMPTY_ROLE_IDS,\n autoUpload = true,\n onFilesChange,\n onChange,\n onUploadComplete,\n onUploadError,\n onRemove,\n onReorder,\n initialFiles = EMPTY_FILES,\n className = '',\n confirmBeforeRemove = false,\n confirmRemoveTitle,\n confirmRemoveMessage,\n apiEndpoints,\n uploadParams,\n enablePrimarySelection = false,\n primaryFileId,\n onPrimaryChange,\n id,\n editorAttrs,\n },\n ref\n ) => {\n // API 엔드포인트 기본값 설정 (User 템플릿용 기본 경로)\n const endpoints = {\n upload: apiEndpoints?.upload ?? '/api/attachments',\n delete: apiEndpoints?.delete ?? '/api/attachments/:id',\n reorder: apiEndpoints?.reorder ?? '/api/attachments/reorder',\n };\n\n // onFilesChange 래퍼: ActionDispatcher 호환 형태로 변환\n // ActionDispatcher는 type: \"change\" → onChange prop으로 매핑하므로,\n // onChange가 설정될 수 있음. onFilesChange는 직접 props 전달 시 사용.\n // ref로 안정화: ActionDispatcher가 매 렌더마다 새 함수를 바인딩하므로\n // 직접 의존하면 useMemo/useEffect 무한 루프 발생. ref로 최신 참조만 유지.\n const callbackRef = useRef(onChange ?? onFilesChange);\n callbackRef.current = onChange ?? onFilesChange;\n\n const wrappedOnFilesChange = useCallback(\n (files: import('./types').PendingFile[]) => {\n const cb = callbackRef.current;\n if (!cb) return;\n // ActionDispatcher 호환: { target: { value: files } } 형태로 전달\n const syntheticEvent = {\n target: { value: files, files },\n preventDefault: () => {},\n stopPropagation: () => {},\n };\n cb(syntheticEvent as any);\n },\n [] // ref 기반이므로 의존성 불필요 — 안정적인 단일 참조\n );\n\n // 핵심 로직 훅 사용\n const uploader = useFileUploader({\n attachmentableType,\n attachmentableId,\n collection,\n maxFiles,\n maxSize,\n maxConcurrentUploads,\n accept,\n imageCompression: compressionOptions,\n roleIds,\n autoUpload,\n initialFiles,\n endpoints,\n onFilesChange: wrappedOnFilesChange,\n onUploadComplete,\n onUploadError,\n onRemove,\n onReorder,\n uploadTriggerEvent,\n confirmBeforeRemove,\n uploadParams,\n });\n\n // 컴포넌트 외부에서 호출 가능한 메서드 노출\n useImperativeHandle(ref, () => ({\n uploadAll: uploader.handleUploadAll,\n clear: uploader.clear,\n getPendingFiles: uploader.getPendingFiles,\n }));\n\n // 갤러리용 이미지 목록 생성\n const galleryImages: GalleryImage[] = useMemo(() => {\n return uploader.imageFiles.map((item) => {\n const isPending = !('hash' in item);\n const pendingItem = item as PendingFile;\n const attachmentItem = item as Attachment;\n\n if (isPending) {\n // 대기 중인 파일은 로컬 미리보기 사용\n return {\n src: pendingItem.preview || '',\n filename: pendingItem.original_filename,\n title: pendingItem.original_filename,\n downloadRequiresAuth: false,\n };\n } else {\n // 기존 첨부파일은 인증된 URL 또는 다운로드 URL 사용\n const cachedUrl = uploader.authenticatedImageUrls.get(attachmentItem.id);\n return {\n src: cachedUrl || attachmentItem.download_url,\n downloadUrl: attachmentItem.download_url,\n filename: attachmentItem.original_filename,\n title: attachmentItem.original_filename,\n downloadRequiresAuth: true,\n };\n }\n });\n }, [uploader.imageFiles, uploader.authenticatedImageUrls]);\n\n // Context 값 생성\n const contextValue = useMemo(() => ({\n // 상태\n existingFiles: uploader.existingFiles,\n pendingFiles: uploader.pendingFiles,\n isDragOver: uploader.isDragOver,\n isDeleting: uploader.isDeleting,\n\n // 설정\n maxFiles,\n maxSize,\n accept,\n endpoints,\n confirmBeforeRemove,\n\n // 계산된 값\n totalCount: uploader.totalCount,\n hasFiles: uploader.hasFiles,\n canAddMore: uploader.canAddMore,\n allItems: uploader.allItems,\n imageFiles: uploader.imageFiles,\n\n // 액션\n handleFiles: uploader.handleFiles,\n handleRemove: uploader.handleRemove,\n handleRetry: uploader.handleRetry,\n handleUploadAll: uploader.handleUploadAll,\n handleOpenGallery: uploader.handleOpenGallery,\n handleDownload: uploader.handleDownload,\n handleDragEnd: uploader.handleDragEnd,\n\n // 드래그 상태 설정\n setIsDragOver: uploader.setIsDragOver,\n\n // Input ref\n inputRef: uploader.inputRef,\n\n // 갤러리 상태\n galleryOpen: uploader.galleryOpen,\n setGalleryOpen: uploader.setGalleryOpen,\n galleryStartIndex: uploader.galleryStartIndex,\n galleryKeyRef: uploader.galleryKeyRef,\n\n // 삭제 확인 모달 상태\n confirmDialogOpen: uploader.confirmDialogOpen,\n setConfirmDialogOpen: uploader.setConfirmDialogOpen,\n itemToDelete: uploader.itemToDelete,\n executeRemoveAttachment: uploader.executeRemoveAttachment,\n\n // 인증된 이미지 URL 캐시\n authenticatedImageUrls: uploader.authenticatedImageUrls,\n }), [uploader, maxFiles, maxSize, accept, endpoints, confirmBeforeRemove]);\n\n return (\n \n
\n {/* 드롭존 + 파일 목록 통합 영역 */}\n \n {/* 파일이 있을 때만 FileList 렌더링 */}\n {uploader.hasFiles && (\n uploader.inputRef.current?.click()}\n enablePrimarySelection={enablePrimarySelection}\n primaryFileId={primaryFileId}\n onPrimaryChange={onPrimaryChange}\n />\n )}\n \n\n {/* 삭제 확인 모달 */}\n {confirmBeforeRemove && (\n {\n if (!uploader.isDeleting) {\n uploader.setConfirmDialogOpen(false);\n }\n }}\n title={confirmRemoveTitle ?? t('attachment.delete_confirm_title')}\n message={confirmRemoveMessage ?? t('attachment.delete_confirm_message')}\n confirmText={t('common.delete')}\n confirmButtonVariant=\"danger\"\n onConfirm={() => {\n if (uploader.itemToDelete) {\n uploader.executeRemoveAttachment(uploader.itemToDelete);\n }\n }}\n isLoading={uploader.isDeleting}\n loadingText={t('attachment.deleting')}\n />\n )}\n\n {/* 이미지 갤러리 라이트박스 */}\n {galleryImages.length > 0 && uploader.galleryOpen && (\n uploader.setGalleryOpen(false)}\n startIndex={uploader.galleryStartIndex}\n showDownload={true}\n />\n )}\n
\n
\n );\n }\n);\n\nFileUploader.displayName = 'FileUploader';\n\nexport default FileUploader;","/**\n * SocialLoginButtons 컴포넌트\n *\n * 소셜 로그인(OAuth) 버튼 그룹입니다.\n * Google, Naver, Kakao 등의 소셜 로그인을 지원합니다.\n */\n\nimport React from 'react';\nimport { Div } from '../basic/Div';\nimport { Button } from '../basic/Button';\nimport { Span } from '../basic/Span';\nimport type { EditorAttrs } from '../../types';\n\n/**\n * 소셜 로그인 아이콘 SVG 컴포넌트\n */\nconst SocialIcon: React.FC<{ provider: string; className?: string }> = ({ provider, className = 'w-5 h-5' }) => {\n switch (provider) {\n case 'google':\n return (\n \n \n \n \n \n \n );\n case 'naver':\n return (\n \n \n \n );\n case 'kakao':\n return (\n \n \n \n );\n case 'facebook':\n return (\n \n \n \n );\n case 'apple':\n return (\n \n \n \n );\n default:\n return null;\n }\n};\n\n/**\n * G7Core 번역 함수\n */\nconst t = (key: string, params?: Record) =>\n (window as any).G7Core?.t?.(key, params) ?? key;\n\ntype SocialProvider = 'google' | 'naver' | 'kakao' | 'facebook' | 'apple';\n\ninterface SocialLoginButtonsProps {\n /** 표시할 소셜 로그인 제공자 목록 */\n providers?: SocialProvider[];\n /** 로그인/회원가입 모드 */\n mode?: 'login' | 'register';\n /** 버튼 스타일 */\n variant?: 'full' | 'icon';\n /** 추가 CSS 클래스 */\n className?: string;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\ninterface ProviderConfig {\n id: SocialProvider;\n name: string;\n color: string;\n textColor: string;\n}\n\n/**\n * 소셜 로그인 제공자 설정\n */\nconst PROVIDER_CONFIGS: ProviderConfig[] = [\n {\n id: 'google',\n name: 'Google',\n color: 'bg-white dark:bg-gray-800',\n textColor: 'text-gray-700 dark:text-gray-300',\n },\n {\n id: 'naver',\n name: '네이버',\n color: 'bg-[#03C75A]',\n textColor: 'text-white',\n },\n {\n id: 'kakao',\n name: '카카오',\n color: 'bg-[#FEE500]',\n textColor: 'text-[#000000]/85',\n },\n {\n id: 'facebook',\n name: 'Facebook',\n color: 'bg-[#1877F2]',\n textColor: 'text-white',\n },\n {\n id: 'apple',\n name: 'Apple',\n color: 'bg-black dark:bg-white',\n textColor: 'text-white dark:text-black',\n },\n];\n\n/**\n * 소셜 로그인 버튼 그룹\n *\n * @example\n * ```tsx\n * \n * ```\n *\n * @example\n * ```json\n * // 레이아웃 JSON에서 사용\n * {\n * \"type\": \"composite\",\n * \"name\": \"SocialLoginButtons\",\n * \"props\": {\n * \"providers\": [\"google\", \"naver\", \"kakao\"],\n * \"mode\": \"register\"\n * }\n * }\n * ```\n */\nconst SocialLoginButtons: React.FC = ({\n providers = ['google', 'naver', 'kakao'],\n mode = 'login',\n variant = 'full',\n className = '',\n id,\n editorAttrs,\n}) => {\n const handleSocialLogin = (provider: SocialProvider) => {\n // OAuth 인증 URL로 리다이렉트\n const callbackUrl = encodeURIComponent(window.location.href);\n window.location.href = `/api/auth/${provider}?redirect=${callbackUrl}`;\n };\n\n const getButtonText = (providerName: string): string => {\n if (mode === 'register') {\n return t('auth.social.register_with', { provider: providerName });\n }\n return t('auth.social.login_with', { provider: providerName });\n };\n\n const filteredProviders = PROVIDER_CONFIGS.filter((config) =>\n providers.includes(config.id)\n );\n\n if (variant === 'icon') {\n return (\n
\n {filteredProviders.map((provider) => (\n handleSocialLogin(provider.id)}\n className={`w-12 h-12 flex items-center justify-center rounded-full ${provider.color} ${provider.textColor} border border-gray-200 dark:border-gray-700 hover:opacity-90 transition-opacity`}\n aria-label={getButtonText(provider.name)}\n >\n \n \n ))}\n
\n );\n }\n\n return (\n
\n {filteredProviders.map((provider) => (\n handleSocialLogin(provider.id)}\n className={`w-full flex items-center justify-center gap-3 px-4 py-3 rounded-lg font-medium border border-gray-200 dark:border-gray-700 ${provider.color} ${provider.textColor} hover:opacity-90 transition-opacity`}\n >\n \n {getButtonText(provider.name)}\n \n ))}\n
\n );\n};\n\nexport default SocialLoginButtons;\n","import React, { useEffect, useState, useCallback } from 'react';\nimport { Div } from '../basic/Div';\nimport { Span } from '../basic/Span';\nimport { Button } from '../basic/Button';\nimport { Icon } from '../basic/Icon';\nimport { IconName } from '../basic/IconTypes';\n\n/**\n * G7Core.t() 번역 함수 참조\n * 런타임에 G7Core.t를 접근하여 테스트 환경에서도 모킹이 적용되도록 함\n */\nconst getTranslation = (key: string, params?: Record) => {\n const G7Core = (window as any).G7Core;\n return G7Core?.t?.(key, params) ?? key;\n};\n\nexport type ToastType = 'success' | 'error' | 'warning' | 'info';\nexport type ToastPosition =\n | 'top-left'\n | 'top-center'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right';\n\nexport interface ToastItem {\n id: string | number;\n type: ToastType;\n message: string;\n /** 커스텀 아이콘 이름 (지정하지 않으면 타입별 기본 아이콘 사용) */\n icon?: string;\n /** 개별 토스트 자동 닫힘 시간 (ms) */\n duration?: number;\n}\n\nexport interface ToastProps {\n /** 토스트 배열 (전역 상태 _global.toasts) */\n toasts?: ToastItem[] | null;\n /** 토스트 표시 위치 */\n position?: ToastPosition;\n /** 기본 자동 닫힘 시간 (ms, 기본 3000) */\n duration?: number;\n /** 토스트 제거 콜백 (전역 상태 업데이트용) */\n onRemove?: (id: string | number) => void;\n}\n\n// 타입별 기본 아이콘 매핑\nconst defaultIconMap: Record = {\n success: IconName.CheckCircle,\n error: IconName.XCircle,\n warning: IconName.ExclamationTriangle,\n info: IconName.InfoCircle,\n};\n\n// 타입별 스타일 매핑\nconst typeStyleMap: Record = {\n success: {\n bg: 'bg-green-50 dark:bg-green-900/20 border-green-200 dark:border-green-800',\n text: 'text-green-800 dark:text-green-300',\n },\n error: {\n bg: 'bg-red-50 dark:bg-red-900/20 border-red-200 dark:border-red-800',\n text: 'text-red-800 dark:text-red-300',\n },\n warning: {\n bg: 'bg-yellow-50 dark:bg-yellow-900/20 border-yellow-200 dark:border-yellow-800',\n text: 'text-yellow-800 dark:text-yellow-300',\n },\n info: {\n bg: 'bg-blue-50 dark:bg-blue-900/20 border-blue-200 dark:border-blue-800',\n text: 'text-blue-800 dark:text-blue-300',\n },\n};\n\n// position별 스타일 매핑\nconst positionClassMap: Record = {\n 'top-left': 'top-4 left-4',\n 'top-center': 'top-4 left-1/2 -translate-x-1/2',\n 'top-right': 'top-4 right-4',\n 'bottom-left': 'bottom-4 left-4',\n 'bottom-center': 'bottom-4 left-1/2 -translate-x-1/2',\n 'bottom-right': 'bottom-4 right-4',\n};\n\n/**\n * Toast 컴포넌트\n *\n * 전역 상태(_global.toasts)를 구독하여 토스트 알림을 스택으로 표시하는 컴포넌트.\n * ActionDispatcher의 toast 핸들러와 연동됩니다.\n *\n * 기능:\n * - 다중 토스트 스택 지원\n * - 타입별 스타일 (success, error, warning, info)\n * - 커스텀 아이콘 지정 가능\n * - 개별 토스트 자동 닫힘 시간 설정\n * - 수동 닫기 버튼\n *\n * @example\n * // 레이아웃 JSON 사용 예시 (_user_base.json)\n * {\n * \"id\": \"global_toast\",\n * \"type\": \"composite\",\n * \"name\": \"Toast\",\n * \"props\": {\n * \"toasts\": \"{{_global.toasts}}\",\n * \"position\": \"bottom-center\",\n * \"duration\": 3000\n * }\n * }\n *\n * @example\n * // toast 핸들러 호출 예시 (레이아웃 JSON)\n * {\n * \"handler\": \"toast\",\n * \"params\": {\n * \"type\": \"success\",\n * \"message\": \"$t:common.save_success\",\n * \"icon\": \"check\",\n * \"duration\": 5000\n * }\n * }\n */\nexport const Toast: React.FC = ({\n toasts,\n position = 'bottom-center',\n duration = 3000,\n onRemove,\n}) => {\n // 내부적으로 표시할 토스트 상태 관리 (애니메이션용)\n const [visibleToasts, setVisibleToasts] = useState>(new Map());\n\n // 토스트 제거 핸들러\n const handleRemove = useCallback((id: string | number) => {\n // 먼저 숨김 애니메이션 시작\n setVisibleToasts(prev => {\n const next = new Map(prev);\n next.set(id, false);\n return next;\n });\n\n // 애니메이션 후 실제 제거\n setTimeout(() => {\n if (onRemove) {\n onRemove(id);\n } else {\n // onRemove가 없으면 G7Core.state.update를 통해 전역 상태 업데이트\n const G7Core = (window as any).G7Core;\n if (G7Core?.state?.update) {\n G7Core.state.update((prevState: Record) => {\n const currentToasts = Array.isArray(prevState.toasts) ? prevState.toasts : [];\n return {\n toasts: currentToasts.filter((t: ToastItem) => t.id !== id),\n };\n });\n }\n }\n }, 300);\n }, [onRemove]);\n\n // 새 토스트가 추가되면 visible 상태 설정 및 자동 제거 타이머 설정\n useEffect(() => {\n if (!toasts || toasts.length === 0) return;\n\n toasts.forEach(toast => {\n // 이미 처리된 토스트는 건너뜀\n if (visibleToasts.has(toast.id)) return;\n\n // visible 상태 추가\n setVisibleToasts(prev => {\n const next = new Map(prev);\n next.set(toast.id, true);\n return next;\n });\n\n // 자동 제거 타이머 설정\n const effectiveDuration = toast.duration || duration;\n if (effectiveDuration > 0) {\n setTimeout(() => {\n handleRemove(toast.id);\n }, effectiveDuration);\n }\n });\n }, [toasts, duration, handleRemove, visibleToasts]);\n\n // 토스트가 없으면 렌더링하지 않음\n if (!toasts || toasts.length === 0) {\n return null;\n }\n\n return (\n \n {toasts.map((toast) => (\n handleRemove(toast.id)}\n />\n ))}\n \n );\n};\n\ninterface ToastItemComponentProps {\n toast: ToastItem;\n position: ToastPosition;\n isVisible: boolean;\n onClose: () => void;\n}\n\nconst ToastItemComponent: React.FC = ({ toast, position, isVisible, onClose }) => {\n const typeStyle = typeStyleMap[toast.type] || typeStyleMap.info;\n\n // 아이콘 결정: 커스텀 아이콘 > 타입별 기본 아이콘\n const iconName = toast.icon\n ? (toast.icon as IconName)\n : defaultIconMap[toast.type];\n\n // position에 따라 숨김 애니메이션 방향 결정 (top → 위로, bottom → 아래로)\n const hideTranslate = position.startsWith('bottom') ? 'translate-y-2' : '-translate-y-2';\n\n return (\n \n \n \n {toast.message}\n \n \n \n \n \n );\n};\n\nexport default Toast;\n","import React, { useState, useEffect } from 'react';\nimport { Div } from '../basic/Div';\n\n// Logger 설정 (G7Core 초기화 전에도 동작하도록 폴백 포함)\nconst logger = ((window as any).G7Core?.createLogger?.('Comp:PageTransition')) ?? {\n log: (...args: unknown[]) => console.log('[Comp:PageTransition]', ...args),\n warn: (...args: unknown[]) => console.warn('[Comp:PageTransition]', ...args),\n error: (...args: unknown[]) => console.error('[Comp:PageTransition]', ...args),\n};\n\nexport interface PageTransitionIndicatorProps {\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * PageTransitionIndicator 컴포넌트\n *\n * TransitionManager의 isPending 상태를 구독하여 페이지 전환 시\n * 상단에 로딩 바를 표시합니다.\n *\n * @example\n * // 레이아웃 JSON 사용 예시\n * {\n * \"name\": \"PageTransitionIndicator\"\n * }\n */\nexport const PageTransitionIndicator: React.FC = ({\n className = '',\n style,\n}) => {\n const [isPending, setIsPending] = useState(false);\n\n useEffect(() => {\n // G7Core.TransitionManager 접근\n const transitionManager = (window as any).G7Core?.TransitionManager;\n\n if (!transitionManager) {\n logger.warn('TransitionManager를 찾을 수 없습니다.');\n return;\n }\n\n // 구독 및 초기 상태 설정\n setIsPending(transitionManager.getIsPending());\n\n const unsubscribe = transitionManager.subscribe((newIsPending: boolean) => {\n setIsPending(newIsPending);\n });\n\n // 정리 함수\n return unsubscribe;\n }, []);\n\n if (!isPending) {\n return null;\n }\n\n return (\n \n
\n \n
\n\n \n \n );\n};\n\nexport default PageTransitionIndicator;\n","import React, { useState, useEffect } from 'react';\nimport { Div } from '../basic/Div';\n\nconst logger = ((window as any).G7Core?.createLogger?.('Comp:PageTransitionBlur')) ?? {\n log: (...args: unknown[]) => console.log('[Comp:PageTransitionBlur]', ...args),\n warn: (...args: unknown[]) => console.warn('[Comp:PageTransitionBlur]', ...args),\n};\n\nexport interface PageTransitionBlurProps {\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * PageTransitionBlur 컴포넌트\n *\n * TransitionManager의 isPending 상태를 구독하여 페이지 전환 시\n * 전체 콘텐츠에 블러 오버레이를 표시합니다.\n * PageTransitionIndicator(z-50)보다 아래 레이어(z-40)에 위치합니다.\n *\n * @example\n * // 레이아웃 JSON 사용 예시\n * {\n * \"name\": \"PageTransitionBlur\"\n * }\n */\nexport const PageTransitionBlur: React.FC = ({\n className = '',\n style,\n}) => {\n const [isPending, setIsPending] = useState(false);\n\n useEffect(() => {\n const transitionManager = (window as any).G7Core?.TransitionManager;\n\n if (!transitionManager) {\n logger.warn('TransitionManager를 찾을 수 없습니다.');\n return;\n }\n\n setIsPending(transitionManager.getIsPending());\n\n const unsubscribe = transitionManager.subscribe((newIsPending: boolean) => {\n logger.log('isPending changed:', newIsPending);\n setIsPending(newIsPending);\n });\n\n return unsubscribe;\n }, []);\n\n if (!isPending) {\n return null;\n }\n\n return (\n \n );\n};\n\nexport default PageTransitionBlur;\n","import React from 'react';\n\n/**\n * 레이아웃 컴포넌트 정의 (엔진에서 전달하는 트리 구조)\n */\ninterface LayoutComponent {\n name?: string;\n type?: string;\n className?: string;\n props?: Record;\n children?: LayoutComponent[];\n iteration?: {\n source?: string;\n item_var?: string;\n index_var?: string;\n };\n if?: string;\n responsive?: {\n desktop?: { props?: Record };\n tablet?: { props?: Record };\n };\n}\n\n/**\n * 스켈레톤 컴포넌트 Props (엔진에서 전달)\n */\nexport interface PageSkeletonProps {\n /** 레이아웃 JSON의 components 배열 (전체 컴포넌트 트리) */\n components: LayoutComponent[];\n /** 스켈레톤 옵션 */\n options: {\n animation: 'pulse' | 'wave' | 'none';\n iteration_count: number;\n };\n}\n\n/** Tailwind 반응형 breakpoint (px) */\nconst TAILWIND_BREAKPOINTS: Record = {\n sm: 640, md: 768, lg: 1024, xl: 1280, '2xl': 1536,\n};\n\n/** CSS display 관련 클래스 (Tailwind) */\nconst DISPLAY_CLASSES = new Set([\n 'hidden', 'block', 'inline-block', 'inline', 'flex', 'inline-flex',\n 'grid', 'inline-grid', 'table', 'table-row', 'table-cell',\n 'contents', 'list-item', 'flow-root',\n]);\n\n/** 레이아웃 컨테이너 컴포넌트 이름 목록 (자식 순회) */\nconst LAYOUT_CONTAINERS = new Set([\n 'Div', 'Flex', 'Grid', 'Section', 'Article', 'Nav', 'Aside',\n 'Main', 'Header', 'Footer', 'Fragment', 'Form', 'Container',\n]);\n\n/** 텍스트 컴포넌트 → 스켈레톤 바로 치환 */\nconst TEXT_COMPONENTS = new Set([\n 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'P', 'Span', 'Label', 'A',\n 'Strong', 'Em', 'Small', 'Badge',\n]);\n\n/** 인풋 컴포넌트 → 스켈레톤 사각형으로 치환 */\nconst INPUT_COMPONENTS = new Set([\n 'Input', 'Textarea', 'Select', 'Checkbox', 'Radio', 'Toggle',\n 'DatePicker', 'TagInput', 'SearchBar',\n]);\n\n/** 미디어 컴포넌트 → 큰 사각형 */\nconst MEDIA_COMPONENTS = new Set([\n 'Img', 'Image', 'Avatar', 'AvatarUploader', 'ImageGallery',\n 'ProductImageViewer', 'FileUploader',\n]);\n\n/** 복합 컴포넌트 → 특화된 스켈레톤 */\nconst COMPOSITE_SKELETONS: Record React.ReactElement> = {\n DataGrid: (animClass, iterCount) => (\n
\n\n {/* 파일 정보 */}\n {\n // 기존 첨부파일만 클릭 시 다운로드\n if (!isPending && onDownload) {\n onDownload();\n }\n }}\n >\n

\n {file.original_filename}\n

\n

\n {isPending ? (file as PendingFile).size_formatted : (file as Attachment).size_formatted}\n

\n \n \n );\n};\n\nexport default SortableThumbnailItem;","/**\n * FileList 컴포넌트\n *\n * 파일 목록을 정렬 가능한 그리드 형태로 표시합니다.\n *\n * @module composite/FileUploader/FileList\n */\n\nimport React from 'react';\nimport {\n DndContext,\n closestCenter,\n KeyboardSensor,\n PointerSensor,\n useSensor,\n useSensors,\n DragEndEvent,\n} from '@dnd-kit/core';\nimport {\n SortableContext,\n sortableKeyboardCoordinates,\n rectSortingStrategy,\n} from '@dnd-kit/sortable';\n\nimport { Div } from '../../basic/Div';\nimport { Span } from '../../basic/Span';\nimport { I } from '../../basic/I';\n\nimport { SortableThumbnailItem } from './SortableThumbnailItem';\nimport type { Attachment, PendingFile } from './types';\nimport { t } from './utils';\n\nexport interface FileListProps {\n /** 모든 파일 목록 (기존 + 대기) */\n allItems: (Attachment | PendingFile)[];\n /** 더 추가 가능 여부 */\n canAddMore: boolean;\n /** 총 파일 수 */\n totalCount: number;\n /** 최대 파일 수 */\n maxFiles: number;\n /** 최대 파일 크기 (MB) */\n maxSize: number;\n /** 허용 확장자 */\n accept?: string;\n /** 파일 삭제 핸들러 */\n onRemove: (item: PendingFile | Attachment) => void;\n /** 재시도 핸들러 */\n onRetry: (pendingFile: PendingFile) => void;\n /** 이미지 클릭 핸들러 */\n onImageClick: (item: PendingFile | Attachment) => void;\n /** 다운로드 핸들러 */\n onDownload: (item: Attachment) => void;\n /** 드래그 종료 핸들러 */\n onDragEnd: (event: DragEndEvent) => void;\n /** 추가 버튼 클릭 핸들러 */\n onAddClick: () => void;\n /** 대표 이미지 선택 기능 활성화 */\n enablePrimarySelection?: boolean;\n /** 현재 대표 이미지 식별자 (ID 또는 hash) */\n primaryFileId?: number | string | null;\n /** 대표 이미지 변경 핸들러 */\n onPrimaryChange?: (id: number | string | null) => void;\n}\n\nexport const FileList: React.FC = ({\n allItems,\n canAddMore,\n totalCount,\n maxFiles,\n maxSize,\n accept,\n onRemove,\n onRetry,\n onImageClick,\n onDownload,\n onDragEnd,\n onAddClick,\n enablePrimarySelection,\n primaryFileId,\n onPrimaryChange,\n}) => {\n const sensors = useSensors(\n useSensor(PointerSensor, { activationConstraint: { distance: 8 } }),\n useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates })\n );\n\n return (\n
\n \n ('hash' in item ? item.hash : item.id))}\n strategy={rectSortingStrategy}\n >\n
\n {/* 파일 썸네일들 */}\n {allItems.map((item) => {\n const isExisting = 'hash' in item;\n // 기존 첨부파일: is_image 필드 우선 사용, 대기 파일: mime_type 확인\n const isImage = isExisting\n ? (item as Attachment).is_image\n : (item.mime_type?.startsWith('image/') ?? false);\n\n return (\n onRemove(item)}\n onRetry={\n 'status' in item && item.status === 'error'\n ? () => onRetry(item as PendingFile)\n : undefined\n }\n onImageClick={\n isImage ? () => onImageClick(item) : undefined\n }\n onDownload={\n isExisting ? () => onDownload(item as Attachment) : undefined\n }\n isPrimary={enablePrimarySelection && isExisting && ((item as Attachment).hash || (item as Attachment).id) === primaryFileId}\n onPrimaryClick={\n enablePrimarySelection && isExisting\n ? () => onPrimaryChange?.((item as Attachment).hash || (item as Attachment).id)\n : undefined\n }\n />\n );\n })}\n\n {/* 추가 버튼 (더 추가할 수 있을 때만) */}\n {canAddMore && (\n \n \n {t('common.add')}\n
\n )}\n
\n \n \n\n {/* 하단 정보 */}\n
\n {t('attachment.attached_count', { count: totalCount, max: maxFiles })}\n {t('attachment.max_size', { size: maxSize })}{accept && ` (${accept})`}\n
\n \n );\n};\n\nexport default FileList;","/**\n * FileUploader 컴포넌트\n *\n * 파일 업로드를 위한 통합 컴포넌트입니다.\n * - 드래그 앤 드롭 지원\n * - 이미지 압축\n * - 병렬 업로드\n * - 순서 변경\n * - 이미지 갤러리\n *\n * @module composite/FileUploader\n */\n\nimport { forwardRef, useImperativeHandle, useMemo, useRef, useCallback } from 'react';\n\nimport { Div } from '../../basic/Div';\nimport { ConfirmDialog } from '../ConfirmDialog';\nimport { ImageGallery, GalleryImage } from '../ImageGallery';\n\nimport { FileUploaderProvider } from './FileUploaderContext';\nimport { useFileUploader } from './useFileUploader';\nimport { FileDropZone } from './FileDropZone';\nimport { FileList } from './FileList';\nimport type { FileUploaderProps, FileUploaderRef, Attachment, PendingFile } from './types';\nimport { t } from './utils';\n\n/** 안정적인 빈 배열 참조 — 매 렌더마다 새 [] 생성 방지 (useEffect 무한 루프 방지) */\nconst EMPTY_FILES: Attachment[] = [];\nconst EMPTY_ROLE_IDS: number[] = [];\n\n// ========== Main Component ==========\n\nexport const FileUploader = forwardRef(\n (\n {\n uploadTriggerEvent,\n attachmentableType,\n attachmentableId,\n collection = 'default',\n maxFiles = 10,\n maxSize = 10,\n maxConcurrentUploads = 3,\n accept,\n imageCompression: compressionOptions,\n roleIds = EMPTY_ROLE_IDS,\n autoUpload = true,\n onFilesChange,\n onChange,\n onUploadComplete,\n onUploadError,\n onRemove,\n onReorder,\n initialFiles = EMPTY_FILES,\n className = '',\n confirmBeforeRemove = false,\n confirmRemoveTitle,\n confirmRemoveMessage,\n apiEndpoints,\n uploadParams,\n enablePrimarySelection = false,\n primaryFileId,\n onPrimaryChange,\n id,\n editorAttrs,\n },\n ref\n ) => {\n // API 엔드포인트 기본값 설정 (User 템플릿용 기본 경로)\n const endpoints = {\n upload: apiEndpoints?.upload ?? '/api/attachments',\n delete: apiEndpoints?.delete ?? '/api/attachments/:id',\n reorder: apiEndpoints?.reorder ?? '/api/attachments/reorder',\n };\n\n // onFilesChange 래퍼: ActionDispatcher 호환 형태로 변환\n // ActionDispatcher는 type: \"change\" → onChange prop으로 매핑하므로,\n // onChange가 설정될 수 있음. onFilesChange는 직접 props 전달 시 사용.\n // ref로 안정화: ActionDispatcher가 매 렌더마다 새 함수를 바인딩하므로\n // 직접 의존하면 useMemo/useEffect 무한 루프 발생. ref로 최신 참조만 유지.\n const callbackRef = useRef(onChange ?? onFilesChange);\n callbackRef.current = onChange ?? onFilesChange;\n\n const wrappedOnFilesChange = useCallback(\n (files: import('./types').PendingFile[]) => {\n const cb = callbackRef.current;\n if (!cb) return;\n // ActionDispatcher 호환: { target: { value: files } } 형태로 전달\n const syntheticEvent = {\n target: { value: files, files },\n preventDefault: () => {},\n stopPropagation: () => {},\n };\n cb(syntheticEvent as any);\n },\n [] // ref 기반이므로 의존성 불필요 — 안정적인 단일 참조\n );\n\n // 핵심 로직 훅 사용\n const uploader = useFileUploader({\n attachmentableType,\n attachmentableId,\n collection,\n maxFiles,\n maxSize,\n maxConcurrentUploads,\n accept,\n imageCompression: compressionOptions,\n roleIds,\n autoUpload,\n initialFiles,\n endpoints,\n onFilesChange: wrappedOnFilesChange,\n onUploadComplete,\n onUploadError,\n onRemove,\n onReorder,\n uploadTriggerEvent,\n confirmBeforeRemove,\n uploadParams,\n });\n\n // 컴포넌트 외부에서 호출 가능한 메서드 노출\n useImperativeHandle(ref, () => ({\n uploadAll: uploader.handleUploadAll,\n clear: uploader.clear,\n getPendingFiles: uploader.getPendingFiles,\n }));\n\n // 갤러리용 이미지 목록 생성\n const galleryImages: GalleryImage[] = useMemo(() => {\n return uploader.imageFiles.map((item) => {\n const isPending = !('hash' in item);\n const pendingItem = item as PendingFile;\n const attachmentItem = item as Attachment;\n\n if (isPending) {\n // 대기 중인 파일은 로컬 미리보기 사용\n return {\n src: pendingItem.preview || '',\n filename: pendingItem.original_filename,\n title: pendingItem.original_filename,\n downloadRequiresAuth: false,\n };\n } else {\n // 기존 첨부파일은 인증된 URL 또는 다운로드 URL 사용\n const cachedUrl = uploader.authenticatedImageUrls.get(attachmentItem.id);\n return {\n src: cachedUrl || attachmentItem.download_url,\n downloadUrl: attachmentItem.download_url,\n filename: attachmentItem.original_filename,\n title: attachmentItem.original_filename,\n downloadRequiresAuth: true,\n };\n }\n });\n }, [uploader.imageFiles, uploader.authenticatedImageUrls]);\n\n // Context 값 생성\n const contextValue = useMemo(() => ({\n // 상태\n existingFiles: uploader.existingFiles,\n pendingFiles: uploader.pendingFiles,\n isDragOver: uploader.isDragOver,\n isDeleting: uploader.isDeleting,\n\n // 설정\n maxFiles,\n maxSize,\n accept,\n endpoints,\n confirmBeforeRemove,\n\n // 계산된 값\n totalCount: uploader.totalCount,\n hasFiles: uploader.hasFiles,\n canAddMore: uploader.canAddMore,\n allItems: uploader.allItems,\n imageFiles: uploader.imageFiles,\n\n // 액션\n handleFiles: uploader.handleFiles,\n handleRemove: uploader.handleRemove,\n handleRetry: uploader.handleRetry,\n handleUploadAll: uploader.handleUploadAll,\n handleOpenGallery: uploader.handleOpenGallery,\n handleDownload: uploader.handleDownload,\n handleDragEnd: uploader.handleDragEnd,\n\n // 드래그 상태 설정\n setIsDragOver: uploader.setIsDragOver,\n\n // Input ref\n inputRef: uploader.inputRef,\n\n // 갤러리 상태\n galleryOpen: uploader.galleryOpen,\n setGalleryOpen: uploader.setGalleryOpen,\n galleryStartIndex: uploader.galleryStartIndex,\n galleryKeyRef: uploader.galleryKeyRef,\n\n // 삭제 확인 모달 상태\n confirmDialogOpen: uploader.confirmDialogOpen,\n setConfirmDialogOpen: uploader.setConfirmDialogOpen,\n itemToDelete: uploader.itemToDelete,\n executeRemoveAttachment: uploader.executeRemoveAttachment,\n\n // 인증된 이미지 URL 캐시\n authenticatedImageUrls: uploader.authenticatedImageUrls,\n }), [uploader, maxFiles, maxSize, accept, endpoints, confirmBeforeRemove]);\n\n return (\n \n
\n {/* 드롭존 + 파일 목록 통합 영역 */}\n \n {/* 파일이 있을 때만 FileList 렌더링 */}\n {uploader.hasFiles && (\n uploader.inputRef.current?.click()}\n enablePrimarySelection={enablePrimarySelection}\n primaryFileId={primaryFileId}\n onPrimaryChange={onPrimaryChange}\n />\n )}\n \n\n {/* 삭제 확인 모달 */}\n {confirmBeforeRemove && (\n {\n if (!uploader.isDeleting) {\n uploader.setConfirmDialogOpen(false);\n }\n }}\n title={confirmRemoveTitle ?? t('attachment.delete_confirm_title')}\n message={confirmRemoveMessage ?? t('attachment.delete_confirm_message')}\n confirmText={t('common.delete')}\n confirmButtonVariant=\"danger\"\n onConfirm={() => {\n if (uploader.itemToDelete) {\n uploader.executeRemoveAttachment(uploader.itemToDelete);\n }\n }}\n isLoading={uploader.isDeleting}\n loadingText={t('attachment.deleting')}\n />\n )}\n\n {/* 이미지 갤러리 라이트박스 */}\n {galleryImages.length > 0 && uploader.galleryOpen && (\n uploader.setGalleryOpen(false)}\n startIndex={uploader.galleryStartIndex}\n showDownload={true}\n />\n )}\n
\n
\n );\n }\n);\n\nFileUploader.displayName = 'FileUploader';\n\nexport default FileUploader;","/**\n * SocialLoginButtons 컴포넌트\n *\n * 소셜 로그인(OAuth) 버튼 그룹입니다.\n * Google, Naver, Kakao 등의 소셜 로그인을 지원합니다.\n */\n\nimport React from 'react';\nimport { Div } from '../basic/Div';\nimport { Button } from '../basic/Button';\nimport { Span } from '../basic/Span';\nimport type { EditorAttrs } from '../../types';\n\n/**\n * 소셜 로그인 아이콘 SVG 컴포넌트\n */\nconst SocialIcon: React.FC<{ provider: string; className?: string }> = ({ provider, className = 'w-5 h-5' }) => {\n switch (provider) {\n case 'google':\n return (\n \n \n \n \n \n \n );\n case 'naver':\n return (\n \n \n \n );\n case 'kakao':\n return (\n \n \n \n );\n case 'facebook':\n return (\n \n \n \n );\n case 'apple':\n return (\n \n \n \n );\n default:\n return null;\n }\n};\n\n/**\n * G7Core 번역 함수\n */\nconst t = (key: string, params?: Record) =>\n (window as any).G7Core?.t?.(key, params) ?? key;\n\ntype SocialProvider = 'google' | 'naver' | 'kakao' | 'facebook' | 'apple';\n\ninterface SocialLoginButtonsProps {\n /** 표시할 소셜 로그인 제공자 목록 */\n providers?: SocialProvider[];\n /** 로그인/회원가입 모드 */\n mode?: 'login' | 'register';\n /** 버튼 스타일 */\n variant?: 'full' | 'icon';\n /** 추가 CSS 클래스 */\n className?: string;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\ninterface ProviderConfig {\n id: SocialProvider;\n name: string;\n color: string;\n textColor: string;\n}\n\n/**\n * 소셜 로그인 제공자 설정\n */\nconst PROVIDER_CONFIGS: ProviderConfig[] = [\n {\n id: 'google',\n name: 'Google',\n color: 'bg-white dark:bg-gray-800',\n textColor: 'text-gray-700 dark:text-gray-300',\n },\n {\n id: 'naver',\n name: '네이버',\n color: 'bg-[#03C75A]',\n textColor: 'text-white',\n },\n {\n id: 'kakao',\n name: '카카오',\n color: 'bg-[#FEE500]',\n textColor: 'text-[#000000]/85',\n },\n {\n id: 'facebook',\n name: 'Facebook',\n color: 'bg-[#1877F2]',\n textColor: 'text-white',\n },\n {\n id: 'apple',\n name: 'Apple',\n color: 'bg-black dark:bg-white',\n textColor: 'text-white dark:text-black',\n },\n];\n\n/**\n * 소셜 로그인 버튼 그룹\n *\n * @example\n * ```tsx\n * \n * ```\n *\n * @example\n * ```json\n * // 레이아웃 JSON에서 사용\n * {\n * \"type\": \"composite\",\n * \"name\": \"SocialLoginButtons\",\n * \"props\": {\n * \"providers\": [\"google\", \"naver\", \"kakao\"],\n * \"mode\": \"register\"\n * }\n * }\n * ```\n */\nconst SocialLoginButtons: React.FC = ({\n providers = ['google', 'naver', 'kakao'],\n mode = 'login',\n variant = 'full',\n className = '',\n id,\n editorAttrs,\n}) => {\n const handleSocialLogin = (provider: SocialProvider) => {\n // OAuth 인증 URL로 리다이렉트\n const callbackUrl = encodeURIComponent(window.location.href);\n window.location.href = `/api/auth/${provider}?redirect=${callbackUrl}`;\n };\n\n const getButtonText = (providerName: string): string => {\n if (mode === 'register') {\n return t('auth.social.register_with', { provider: providerName });\n }\n return t('auth.social.login_with', { provider: providerName });\n };\n\n const filteredProviders = PROVIDER_CONFIGS.filter((config) =>\n providers.includes(config.id)\n );\n\n if (variant === 'icon') {\n return (\n
\n {filteredProviders.map((provider) => (\n handleSocialLogin(provider.id)}\n className={`w-12 h-12 flex items-center justify-center rounded-full ${provider.color} ${provider.textColor} border border-gray-200 dark:border-gray-700 hover:opacity-90 transition-opacity`}\n aria-label={getButtonText(provider.name)}\n >\n \n \n ))}\n
\n );\n }\n\n return (\n
\n {filteredProviders.map((provider) => (\n handleSocialLogin(provider.id)}\n className={`w-full flex items-center justify-center gap-3 px-4 py-3 rounded-lg font-medium border border-gray-200 dark:border-gray-700 ${provider.color} ${provider.textColor} hover:opacity-90 transition-opacity`}\n >\n \n {getButtonText(provider.name)}\n \n ))}\n
\n );\n};\n\nexport default SocialLoginButtons;\n","import React, { useEffect, useState, useCallback } from 'react';\nimport { Div } from '../basic/Div';\nimport { Span } from '../basic/Span';\nimport { Button } from '../basic/Button';\nimport { Icon } from '../basic/Icon';\nimport { IconName } from '../basic/IconTypes';\n\n/**\n * G7Core.t() 번역 함수 참조\n * 런타임에 G7Core.t를 접근하여 테스트 환경에서도 모킹이 적용되도록 함\n */\nconst getTranslation = (key: string, params?: Record) => {\n const G7Core = (window as any).G7Core;\n return G7Core?.t?.(key, params) ?? key;\n};\n\nexport type ToastType = 'success' | 'error' | 'warning' | 'info';\nexport type ToastPosition =\n | 'top-left'\n | 'top-center'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right';\n\nexport interface ToastItem {\n id: string | number;\n type: ToastType;\n message: string;\n /** 커스텀 아이콘 이름 (지정하지 않으면 타입별 기본 아이콘 사용) */\n icon?: string;\n /** 개별 토스트 자동 닫힘 시간 (ms) */\n duration?: number;\n}\n\nexport interface ToastProps {\n /** 토스트 배열 (전역 상태 _global.toasts) */\n toasts?: ToastItem[] | null;\n /** 토스트 표시 위치 */\n position?: ToastPosition;\n /** 기본 자동 닫힘 시간 (ms, 기본 3000) */\n duration?: number;\n /** 토스트 제거 콜백 (전역 상태 업데이트용) */\n onRemove?: (id: string | number) => void;\n}\n\n// 타입별 기본 아이콘 매핑\nconst defaultIconMap: Record = {\n success: IconName.CheckCircle,\n error: IconName.XCircle,\n warning: IconName.ExclamationTriangle,\n info: IconName.InfoCircle,\n};\n\n// 타입별 스타일 매핑\nconst typeStyleMap: Record = {\n success: {\n bg: 'bg-green-50 dark:bg-green-900/20 border-green-200 dark:border-green-800',\n text: 'text-green-800 dark:text-green-300',\n },\n error: {\n bg: 'bg-red-50 dark:bg-red-900/20 border-red-200 dark:border-red-800',\n text: 'text-red-800 dark:text-red-300',\n },\n warning: {\n bg: 'bg-yellow-50 dark:bg-yellow-900/20 border-yellow-200 dark:border-yellow-800',\n text: 'text-yellow-800 dark:text-yellow-300',\n },\n info: {\n bg: 'bg-blue-50 dark:bg-blue-900/20 border-blue-200 dark:border-blue-800',\n text: 'text-blue-800 dark:text-blue-300',\n },\n};\n\n// position별 스타일 매핑\nconst positionClassMap: Record = {\n 'top-left': 'top-4 left-4',\n 'top-center': 'top-4 left-1/2 -translate-x-1/2',\n 'top-right': 'top-4 right-4',\n 'bottom-left': 'bottom-4 left-4',\n 'bottom-center': 'bottom-4 left-1/2 -translate-x-1/2',\n 'bottom-right': 'bottom-4 right-4',\n};\n\n/**\n * Toast 컴포넌트\n *\n * 전역 상태(_global.toasts)를 구독하여 토스트 알림을 스택으로 표시하는 컴포넌트.\n * ActionDispatcher의 toast 핸들러와 연동됩니다.\n *\n * 기능:\n * - 다중 토스트 스택 지원\n * - 타입별 스타일 (success, error, warning, info)\n * - 커스텀 아이콘 지정 가능\n * - 개별 토스트 자동 닫힘 시간 설정\n * - 수동 닫기 버튼\n *\n * @example\n * // 레이아웃 JSON 사용 예시 (_user_base.json)\n * {\n * \"id\": \"global_toast\",\n * \"type\": \"composite\",\n * \"name\": \"Toast\",\n * \"props\": {\n * \"toasts\": \"{{_global.toasts}}\",\n * \"position\": \"bottom-center\",\n * \"duration\": 3000\n * }\n * }\n *\n * @example\n * // toast 핸들러 호출 예시 (레이아웃 JSON)\n * {\n * \"handler\": \"toast\",\n * \"params\": {\n * \"type\": \"success\",\n * \"message\": \"$t:common.save_success\",\n * \"icon\": \"check\",\n * \"duration\": 5000\n * }\n * }\n */\nexport const Toast: React.FC = ({\n toasts,\n position = 'bottom-center',\n duration = 3000,\n onRemove,\n}) => {\n // 내부적으로 표시할 토스트 상태 관리 (애니메이션용)\n const [visibleToasts, setVisibleToasts] = useState>(new Map());\n\n // 토스트 제거 핸들러\n const handleRemove = useCallback((id: string | number) => {\n // 먼저 숨김 애니메이션 시작\n setVisibleToasts(prev => {\n const next = new Map(prev);\n next.set(id, false);\n return next;\n });\n\n // 애니메이션 후 실제 제거\n setTimeout(() => {\n if (onRemove) {\n onRemove(id);\n } else {\n // onRemove가 없으면 G7Core.state.update를 통해 전역 상태 업데이트\n const G7Core = (window as any).G7Core;\n if (G7Core?.state?.update) {\n G7Core.state.update((prevState: Record) => {\n const currentToasts = Array.isArray(prevState.toasts) ? prevState.toasts : [];\n return {\n toasts: currentToasts.filter((t: ToastItem) => t.id !== id),\n };\n });\n }\n }\n }, 300);\n }, [onRemove]);\n\n // 새 토스트가 추가되면 visible 상태 설정 및 자동 제거 타이머 설정\n useEffect(() => {\n if (!toasts || toasts.length === 0) return;\n\n toasts.forEach(toast => {\n // 이미 처리된 토스트는 건너뜀\n if (visibleToasts.has(toast.id)) return;\n\n // visible 상태 추가\n setVisibleToasts(prev => {\n const next = new Map(prev);\n next.set(toast.id, true);\n return next;\n });\n\n // 자동 제거 타이머 설정\n const effectiveDuration = toast.duration || duration;\n if (effectiveDuration > 0) {\n setTimeout(() => {\n handleRemove(toast.id);\n }, effectiveDuration);\n }\n });\n }, [toasts, duration, handleRemove, visibleToasts]);\n\n // 토스트가 없으면 렌더링하지 않음\n if (!toasts || toasts.length === 0) {\n return null;\n }\n\n return (\n \n {toasts.map((toast) => (\n handleRemove(toast.id)}\n />\n ))}\n \n );\n};\n\ninterface ToastItemComponentProps {\n toast: ToastItem;\n position: ToastPosition;\n isVisible: boolean;\n onClose: () => void;\n}\n\nconst ToastItemComponent: React.FC = ({ toast, position, isVisible, onClose }) => {\n const typeStyle = typeStyleMap[toast.type] || typeStyleMap.info;\n\n // 아이콘 결정: 커스텀 아이콘 > 타입별 기본 아이콘\n const iconName = toast.icon\n ? (toast.icon as IconName)\n : defaultIconMap[toast.type];\n\n // position에 따라 숨김 애니메이션 방향 결정 (top → 위로, bottom → 아래로)\n const hideTranslate = position.startsWith('bottom') ? 'translate-y-2' : '-translate-y-2';\n\n return (\n \n \n \n {toast.message}\n \n \n \n \n \n );\n};\n\nexport default Toast;\n","import React, { useState, useEffect } from 'react';\nimport { Div } from '../basic/Div';\n\n// Logger 설정 (G7Core 초기화 전에도 동작하도록 폴백 포함)\nconst logger = ((window as any).G7Core?.createLogger?.('Comp:PageTransition')) ?? {\n log: (...args: unknown[]) => console.log('[Comp:PageTransition]', ...args),\n warn: (...args: unknown[]) => console.warn('[Comp:PageTransition]', ...args),\n error: (...args: unknown[]) => console.error('[Comp:PageTransition]', ...args),\n};\n\nexport interface PageTransitionIndicatorProps {\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * PageTransitionIndicator 컴포넌트\n *\n * TransitionManager의 isPending 상태를 구독하여 페이지 전환 시\n * 상단에 로딩 바를 표시합니다.\n *\n * @example\n * // 레이아웃 JSON 사용 예시\n * {\n * \"name\": \"PageTransitionIndicator\"\n * }\n */\nexport const PageTransitionIndicator: React.FC = ({\n className = '',\n style,\n}) => {\n const [isPending, setIsPending] = useState(false);\n\n useEffect(() => {\n // G7Core.TransitionManager 접근\n const transitionManager = (window as any).G7Core?.TransitionManager;\n\n if (!transitionManager) {\n logger.warn('TransitionManager를 찾을 수 없습니다.');\n return;\n }\n\n // 구독 및 초기 상태 설정\n setIsPending(transitionManager.getIsPending());\n\n const unsubscribe = transitionManager.subscribe((newIsPending: boolean) => {\n setIsPending(newIsPending);\n });\n\n // 정리 함수\n return unsubscribe;\n }, []);\n\n if (!isPending) {\n return null;\n }\n\n return (\n \n
\n \n
\n\n \n \n );\n};\n\nexport default PageTransitionIndicator;\n","import React, { useState, useEffect } from 'react';\nimport { Div } from '../basic/Div';\n\nconst logger = ((window as any).G7Core?.createLogger?.('Comp:PageTransitionBlur')) ?? {\n log: (...args: unknown[]) => console.log('[Comp:PageTransitionBlur]', ...args),\n warn: (...args: unknown[]) => console.warn('[Comp:PageTransitionBlur]', ...args),\n};\n\nexport interface PageTransitionBlurProps {\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * PageTransitionBlur 컴포넌트\n *\n * TransitionManager의 isPending 상태를 구독하여 페이지 전환 시\n * 전체 콘텐츠에 블러 오버레이를 표시합니다.\n * PageTransitionIndicator(z-50)보다 아래 레이어(z-40)에 위치합니다.\n *\n * @example\n * // 레이아웃 JSON 사용 예시\n * {\n * \"name\": \"PageTransitionBlur\"\n * }\n */\nexport const PageTransitionBlur: React.FC = ({\n className = '',\n style,\n}) => {\n const [isPending, setIsPending] = useState(false);\n\n useEffect(() => {\n const transitionManager = (window as any).G7Core?.TransitionManager;\n\n if (!transitionManager) {\n logger.warn('TransitionManager를 찾을 수 없습니다.');\n return;\n }\n\n setIsPending(transitionManager.getIsPending());\n\n const unsubscribe = transitionManager.subscribe((newIsPending: boolean) => {\n logger.log('isPending changed:', newIsPending);\n setIsPending(newIsPending);\n });\n\n return unsubscribe;\n }, []);\n\n if (!isPending) {\n return null;\n }\n\n return (\n \n );\n};\n\nexport default PageTransitionBlur;\n","import React from 'react';\n\n/**\n * 레이아웃 컴포넌트 정의 (엔진에서 전달하는 트리 구조)\n */\ninterface LayoutComponent {\n name?: string;\n type?: string;\n className?: string;\n props?: Record;\n children?: LayoutComponent[];\n iteration?: {\n source?: string;\n item_var?: string;\n index_var?: string;\n };\n if?: string;\n responsive?: {\n desktop?: { props?: Record };\n tablet?: { props?: Record };\n };\n}\n\n/**\n * 스켈레톤 컴포넌트 Props (엔진에서 전달)\n */\nexport interface PageSkeletonProps {\n /** 레이아웃 JSON의 components 배열 (전체 컴포넌트 트리) */\n components: LayoutComponent[];\n /** 스켈레톤 옵션 */\n options: {\n animation: 'pulse' | 'wave' | 'none';\n iteration_count: number;\n };\n}\n\n/** Tailwind 반응형 breakpoint (px) */\nconst TAILWIND_BREAKPOINTS: Record = {\n sm: 640, md: 768, lg: 1024, xl: 1280, '2xl': 1536,\n};\n\n/** CSS display 관련 클래스 (Tailwind) */\nconst DISPLAY_CLASSES = new Set([\n 'hidden', 'block', 'inline-block', 'inline', 'flex', 'inline-flex',\n 'grid', 'inline-grid', 'table', 'table-row', 'table-cell',\n 'contents', 'list-item', 'flow-root',\n]);\n\n/** 레이아웃 컨테이너 컴포넌트 이름 목록 (자식 순회) */\nconst LAYOUT_CONTAINERS = new Set([\n 'Div', 'Flex', 'Grid', 'Section', 'Article', 'Nav', 'Aside',\n 'Main', 'Header', 'Footer', 'Fragment', 'Form', 'Container',\n]);\n\n/** 텍스트 컴포넌트 → 스켈레톤 바로 치환 */\nconst TEXT_COMPONENTS = new Set([\n 'H1', 'H2', 'H3', 'H4', 'H5', 'H6', 'P', 'Span', 'Label', 'A',\n 'Strong', 'Em', 'Small', 'Badge',\n]);\n\n/** 인풋 컴포넌트 → 스켈레톤 사각형으로 치환 */\nconst INPUT_COMPONENTS = new Set([\n 'Input', 'Textarea', 'Select', 'Checkbox', 'Radio', 'Toggle',\n 'DatePicker', 'TagInput', 'SearchBar',\n]);\n\n/** 미디어 컴포넌트 → 큰 사각형 */\nconst MEDIA_COMPONENTS = new Set([\n 'Img', 'Image', 'Avatar', 'AvatarUploader', 'ImageGallery',\n 'ProductImageViewer', 'FileUploader',\n]);\n\n/** 복합 컴포넌트 → 특화된 스켈레톤 */\nconst COMPOSITE_SKELETONS: Record React.ReactElement> = {\n DataGrid: (animClass, iterCount) => (\n
\n );\n};\n\ninterface ToastItemProps {\n toast: ToastItem;\n position: ToastPosition;\n isVisible: boolean;\n onClose: () => void;\n}\n\nconst ToastItem: React.FC = ({ toast, position, isVisible, onClose }) => {\n const typeStyle = typeStyleMap[toast.type] || typeStyleMap.info;\n\n // 아이콘 결정: 커스텀 아이콘 > 타입별 기본 아이콘\n const iconName = toast.icon\n ? (toast.icon as IconName)\n : defaultIconMap[toast.type];\n\n // position에 따라 숨김 애니메이션 방향 결정 (top → 위로, bottom → 아래로)\n const hideTranslate = position.startsWith('bottom') ? 'translate-y-2' : '-translate-y-2';\n\n return (\n \n \n \n {toast.message}\n \n \n \n \n \n );\n};\n","import React from 'react';\nimport { Nav } from '../basic/Nav';\nimport { Div } from '../basic/Div';\nimport { A } from '../basic/A';\nimport { Span } from '../basic/Span';\nimport { Icon } from '../basic/Icon';\nimport { IconName } from '../basic/IconTypes';\nimport type { EditorAttrs } from '../../types';\n\nexport interface BreadcrumbItem {\n label: string;\n href?: string;\n onClick?: () => void;\n}\n\nexport interface BreadcrumbProps {\n items: BreadcrumbItem[];\n separator?: React.ReactNode;\n showHome?: boolean;\n homeHref?: string;\n maxItems?: number;\n className?: string;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * Breadcrumb 집합 컴포넌트\n *\n * 현재 페이지의 경로를 계층적으로 표시하는 내비게이션 컴포넌트.\n * separator 커스터마이징, showHome 옵션, maxItems로 중간 생략 기능 제공.\n *\n * 기본 컴포넌트 조합:\n * - Nav > Div > A(링크) + Span(구분자)\n *\n * @example\n * // 레이아웃 JSON 사용 예시\n * {\n * \"name\": \"Breadcrumb\",\n * \"props\": {\n * \"items\": [\n * {\"label\": \"대시보드\", \"href\": \"/admin\"},\n * {\"label\": \"사용자 관리\", \"href\": \"/admin/users\"},\n * {\"label\": \"사용자 목록\"}\n * ],\n * \"showHome\": true,\n * \"maxItems\": 4\n * }\n * }\n */\nexport const Breadcrumb: React.FC = ({\n items,\n separator = ,\n showHome = false,\n homeHref = '/',\n maxItems,\n className = '',\n id,\n editorAttrs,\n}) => {\n // Home 아이템 생성\n const homeItem: BreadcrumbItem = {\n label: 'Home',\n href: homeHref,\n };\n\n // 전체 아이템 배열 생성\n let allItems = showHome ? [homeItem, ...items] : items;\n\n // maxItems 적용 (중간 생략)\n let displayItems = allItems;\n let hasEllipsis = false;\n\n if (maxItems && allItems.length > maxItems) {\n hasEllipsis = true;\n const firstItems = allItems.slice(0, 1);\n const lastItems = allItems.slice(-(maxItems - 2));\n displayItems = [...firstItems, ...lastItems];\n }\n\n return (\n \n
\n {displayItems.map((item, index) => {\n const isLast = index === displayItems.length - 1;\n const isFirst = index === 0;\n\n return (\n \n {/* 중간 생략 표시 (첫 번째 아이템 다음) */}\n {hasEllipsis && isFirst && (\n <>\n \n \n {separator}\n \n ...\n {displayItems.length > 1 && (\n \n {separator}\n \n )}\n \n )}\n\n {/* 일반 아이템 */}\n {(!hasEllipsis || !isFirst) && (\n <>\n \n {!isLast && (\n \n {separator}\n \n )}\n \n )}\n \n );\n })}\n
\n \n );\n};\n\ninterface BreadcrumbLinkProps {\n item: BreadcrumbItem;\n isLast: boolean;\n}\n\nconst BreadcrumbLink: React.FC = ({ item, isLast }) => {\n if (isLast || (!item.href && !item.onClick)) {\n // 마지막 아이템이거나 링크가 없는 경우\n return (\n \n {item.label}\n \n );\n }\n\n if (item.onClick) {\n // onClick 핸들러가 있는 경우\n return (\n {\n e.preventDefault();\n item.onClick?.();\n }}\n className=\"text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-200 transition-colors\"\n >\n {item.label}\n
\n );\n }\n\n // 일반 링크\n return (\n \n {item.label}\n \n );\n};\n","import React from 'react';\nimport { Div } from '../basic/Div';\nimport { H2 } from '../basic/H2';\nimport { P } from '../basic/P';\nimport { Button } from '../basic/Button';\nimport { Icon } from '../basic/Icon';\nimport { Img } from '../basic/Img';\nimport { IconName } from '../basic/IconTypes';\nimport type { EditorAttrs } from '../../types';\n\nexport interface EmptyStateAction {\n label: string;\n onClick: () => void;\n variant?: 'primary' | 'secondary' | 'danger' | 'ghost';\n iconName?: IconName;\n}\n\nexport interface EmptyStateProps {\n title: string;\n description?: string;\n iconName?: IconName;\n illustrationSrc?: string;\n illustrationAlt?: string;\n actions?: EmptyStateAction[];\n className?: string;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * EmptyState 집합 컴포넌트\n *\n * 데이터가 없거나 검색 결과가 없을 때 표시하는 빈 상태 컴포넌트.\n * icon/illustration, title, description, actions 버튼 배열 지원.\n *\n * 기본 컴포넌트 조합:\n * - Div(컨테이너) > Icon/Img + H2(제목) + P(설명) + Div(액션) > Button[]\n *\n * @example\n * // 레이아웃 JSON 사용 예시\n * {\n * \"name\": \"EmptyState\",\n * \"props\": {\n * \"title\": \"검색 결과가 없습니다\",\n * \"description\": \"다른 검색어로 시도해보세요.\",\n * \"iconName\": \"Search\",\n * \"actions\": [\n * {\"label\": \"검색 초기화\", \"variant\": \"secondary\"}\n * ]\n * }\n * }\n */\nexport const EmptyState: React.FC = ({\n title,\n description,\n iconName,\n illustrationSrc,\n illustrationAlt = 'Empty state illustration',\n actions = [],\n className = '',\n id,\n editorAttrs,\n}) => {\n // 버튼 variant별 스타일 매핑\n const variantClassMap: Record<'primary' | 'secondary' | 'danger' | 'ghost', string> = {\n primary: 'bg-blue-600 text-white hover:bg-blue-700 focus:ring-blue-500',\n secondary: 'bg-gray-200 dark:bg-gray-700 text-gray-800 dark:text-gray-200 hover:bg-gray-300 dark:hover:bg-gray-600 focus:ring-gray-500',\n danger: 'bg-red-600 text-white hover:bg-red-700 focus:ring-red-500',\n ghost: 'bg-transparent text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 focus:ring-gray-500',\n };\n\n return (\n \n {/* Icon 또는 Illustration */}\n {illustrationSrc ? (\n \n ) : iconName ? (\n
\n \n
\n ) : null}\n\n {/* Title */}\n

\n {title}\n

\n\n {/* Description */}\n {description && (\n

\n {description}\n

\n )}\n\n {/* Actions */}\n {actions.length > 0 && (\n
\n {actions.map((action, index) => (\n \n {action.iconName && (\n \n )}\n {action.label}\n \n ))}\n
\n )}\n \n );\n};\n","import React from 'react';\nimport { Div } from '../basic/Div';\nimport { Span } from '../basic/Span';\nimport type { EditorAttrs } from '../../types';\n\n// G7Core.t() 번역 함수 참조\nconst t = (key: string, params?: Record) =>\n (window as any).G7Core?.t?.(key, params) ?? key;\n\nexport type SpinnerSize = 'sm' | 'md' | 'lg' | 'xl';\n\nexport interface LoadingSpinnerProps {\n id?: string;\n size?: SpinnerSize;\n color?: string;\n fullscreen?: boolean;\n text?: string;\n className?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * LoadingSpinner 집합 컴포넌트\n *\n * 로딩 상태를 시각적으로 표시하는 스피너 컴포넌트.\n * size, color, fullscreen 모드, text 라벨 옵션 제공.\n *\n * 기본 컴포넌트 조합:\n * - Div(컨테이너) > Div(스피너) + Span(텍스트, 옵션)\n *\n * @example\n * // 레이아웃 JSON 사용 예시\n * {\n * \"name\": \"LoadingSpinner\",\n * \"props\": {\n * \"size\": \"lg\",\n * \"text\": \"데이터를 불러오는 중...\",\n * \"fullscreen\": false\n * }\n * }\n */\nexport const LoadingSpinner: React.FC = ({\n id,\n size = 'md',\n color = 'text-blue-600',\n fullscreen = false,\n text,\n className = '',\n editorAttrs,\n}) => {\n // size별 스피너 크기 매핑\n const sizeClassMap: Record = {\n sm: 'w-4 h-4 border-2',\n md: 'w-8 h-8 border-2',\n lg: 'w-12 h-12 border-3',\n xl: 'w-16 h-16 border-4',\n };\n\n // size별 텍스트 크기 매핑\n const textSizeClassMap: Record = {\n sm: 'text-xs',\n md: 'text-sm',\n lg: 'text-base',\n xl: 'text-lg',\n };\n\n const spinnerContent = (\n
\n {/* Spinner */}\n \n\n {/* Text Label */}\n {text && (\n \n {text}\n \n )}\n
\n );\n\n if (fullscreen) {\n return (\n \n {spinnerContent}\n \n );\n }\n\n return (\n \n {spinnerContent}\n \n );\n};\n","import React, { useState, useEffect, useMemo, useCallback } from 'react';\nimport { Div } from '../basic/Div';\nimport { Img } from '../basic/Img';\nimport { Span } from '../basic/Span';\nimport { Button } from '../basic/Button';\nimport { I } from '../basic/I';\nimport type { EditorAttrs } from '../../types';\n\n// G7Core 전역 객체 접근 헬퍼\nconst G7Core = () => (window as any).G7Core;\n\n// G7Core.t() 번역 함수 참조\nconst t = (key: string, params?: Record) =>\n (window as any).G7Core?.t?.(key, params) ?? key;\n\n/**\n * 메뉴 아이템 인터페이스 (API 응답 구조)\n */\nexport interface MenuItem {\n id: string | number;\n name: string | { ko: string; en: string };\n slug: string;\n url?: string | null;\n icon?: string;\n children?: MenuItem[];\n is_active?: boolean;\n module_id?: number | null;\n}\n\n/**\n * AdminSidebar Props\n */\nexport interface AdminSidebarProps {\n logo?: string;\n logoAlt?: string;\n menu: MenuItem[];\n collapsed?: boolean;\n onToggleCollapse?: () => void;\n className?: string;\n /** 현재 로케일 (다국어 메뉴 이름 표시용). 미지정 시 G7Core.locale.current() 자동 사용 */\n currentLocale?: string;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * AdminSidebar 컴포넌트\n *\n * 관리자 사이드바 - 계층형 메뉴, 접기/펼치기 기능 제공\n *\n * @example\n * ```tsx\n * \n * ```\n */\nexport const AdminSidebar: React.FC = ({\n logo,\n logoAlt = 'Logo',\n menu = [],\n collapsed = false,\n onToggleCollapse,\n className = '',\n currentLocale: currentLocaleProp,\n id,\n editorAttrs,\n}) => {\n const [expandedItems, setExpandedItems] = useState>(new Set());\n const [locale, setLocale] = useState(currentLocaleProp || G7Core()?.locale?.current?.() || 'ko');\n const [currentPath, setCurrentPath] = useState(window.location.pathname);\n\n // 메뉴 트리에서 모든 URL 수집 (가장 구체적인 매칭 판별용)\n const allMenuUrls = useMemo(() => {\n const urls: string[] = [];\n const collect = (items: MenuItem[]) => {\n for (const item of items) {\n if (item.url) urls.push(item.url);\n if (item.children) collect(item.children);\n }\n };\n collect(menu);\n return urls;\n }, [menu]);\n\n // 주어진 경로에 가장 구체적으로 매칭되는 메뉴 URL 찾기\n const findBestMatch = useCallback((path: string): string | null => {\n let bestMatch: string | null = null;\n for (const url of allMenuUrls) {\n if (path === url || path.startsWith(url + '/')) {\n if (!bestMatch || url.length > bestMatch.length) {\n bestMatch = url;\n }\n }\n }\n return bestMatch;\n }, [allMenuUrls]);\n\n // G7Core 로케일 및 경로 변경 구독\n useEffect(() => {\n const g7core = G7Core();\n if (!g7core?.state?.subscribe) return;\n\n const unsubscribe = g7core.state.subscribe((state: any) => {\n const newLocale = state?._global?.locale || g7core?.locale?.current?.() || 'ko';\n setLocale(newLocale);\n\n // 현재 경로 업데이트\n const newPath = state?._global?.currentPath || window.location.pathname;\n setCurrentPath(newPath);\n });\n\n return unsubscribe;\n }, []);\n\n // 브라우저 뒤로가기/앞으로가기 감지\n useEffect(() => {\n const handlePopState = () => {\n setCurrentPath(window.location.pathname);\n };\n\n window.addEventListener('popstate', handlePopState);\n return () => window.removeEventListener('popstate', handlePopState);\n }, []);\n\n // currentLocale prop이 변경되면 우선 적용\n useEffect(() => {\n if (currentLocaleProp) {\n setLocale(currentLocaleProp);\n }\n }, [currentLocaleProp]);\n\n /**\n * 특정 경로가 메뉴 URL과 일치하는지 확인\n * 접두사 매칭 시 가장 구체적인(가장 긴) 매칭만 활성화 ()\n *\n * @param url 메뉴 URL\n * @param path 확인할 경로\n * @returns 일치 여부\n */\n const isPathActive = (url: string | null | undefined, path: string): boolean => {\n if (!url || typeof path !== 'string') return false;\n if (path === url) return true;\n if (path.startsWith(url + '/')) {\n return findBestMatch(path) === url;\n }\n return false;\n };\n\n /**\n * 활성 메뉴의 부모 ID들을 찾아 반환\n *\n * @param items 메뉴 아이템 배열\n * @param path 현재 경로\n * @returns 활성 부모 ID Set\n */\n const findActiveParentIds = (items: MenuItem[], path: string): Set => {\n const parents = new Set();\n\n const traverse = (menuItems: MenuItem[]): boolean => {\n for (const item of menuItems) {\n if (item.children && item.children.length > 0) {\n const hasActiveInChildren = traverse(item.children);\n if (hasActiveInChildren || isPathActive(item.url, path)) {\n parents.add(item.id);\n return true;\n }\n } else if (isPathActive(item.url, path)) {\n return true;\n }\n }\n return false;\n };\n\n traverse(items);\n return parents;\n };\n\n // 초기 로드 및 경로 변경 시 활성 메뉴의 부모를 자동 펼침\n useEffect(() => {\n if (menu.length > 0 && currentPath) {\n const activeParents = findActiveParentIds(menu, currentPath);\n if (activeParents.size > 0) {\n setExpandedItems((prev) => new Set([...prev, ...activeParents]));\n }\n }\n }, [currentPath, menu]);\n\n /**\n * 메뉴 URL이 현재 경로와 일치하는지 확인\n * 접두사 매칭 시 가장 구체적인 매칭만 활성화 ()\n *\n * @param url 메뉴 URL\n * @returns 활성 여부\n */\n const isActiveMenu = (url: string | null | undefined): boolean => {\n return isPathActive(url, currentPath);\n };\n\n /**\n * 하위 메뉴 중 활성 메뉴가 있는지 확인 (부모 메뉴 강조용)\n *\n * @param item 메뉴 아이템\n * @returns 하위에 활성 메뉴 존재 여부\n */\n const hasActiveChild = (item: MenuItem): boolean => {\n if (!item.children) return false;\n return item.children.some((child) => isActiveMenu(child.url) || hasActiveChild(child));\n };\n\n /**\n * 하위 메뉴 토글\n */\n const toggleExpand = (itemId: string | number) => {\n setExpandedItems((prev) => {\n const newSet = new Set(prev);\n if (newSet.has(itemId)) {\n newSet.delete(itemId);\n } else {\n newSet.add(itemId);\n }\n return newSet;\n });\n };\n\n /**\n * 다국어 name을 현재 로케일에 맞게 반환\n */\n const getMenuLabel = (name: string | { ko: string; en: string; [key: string]: string }): string => {\n if (typeof name === 'string') return name;\n // 현재 로케일에 맞는 이름 반환, fallback으로 en → 첫 번째 값\n return name[locale] || name.en || Object.values(name)[0] || '';\n };\n\n /**\n * 메뉴 네비게이션 핸들러\n * G7Core.dispatch가 있으면 SPA 방식으로, 없으면 전체 페이지 리로드\n * 모바일에서는 페이지 로드 완료 후 사이드바를 닫음\n */\n const handleNavigate = (event: React.MouseEvent, url: string) => {\n if (G7Core()?.dispatch) {\n // G7Core.dispatch가 있으면 SPA 방식 네비게이션\n event.preventDefault();\n\n // 페이지 전환 완료 후 사이드바 닫기\n G7Core().navigation?.onComplete(() => {\n G7Core().dispatch({\n handler: 'setState',\n params: {\n target: 'global',\n sidebarOpen: false,\n },\n });\n });\n\n G7Core().dispatch({\n handler: 'navigate',\n params: { path: url },\n });\n } else {\n // fallback: 전체 페이지 리로드\n window.location.href = url;\n }\n };\n\n /**\n * 메뉴 아이템 렌더링 (재귀)\n */\n const renderMenuItem = (item: MenuItem, level: number = 0, isLast: boolean = false): React.ReactNode => {\n const hasChildren = item.children && item.children.length > 0;\n const isExpanded = expandedItems.has(item.id);\n // padding-left 는 .admin-sidebar-item (px-3 → 12px) / .admin-sidebar-subitem\n // (pl-[30px]) 시맨틱 자산에 흡수됨.\n const label = getMenuLabel(item.name);\n const isSubItem = level > 0;\n\n // 활성 메뉴 판별\n const isActive = isActiveMenu(item.url);\n const hasActiveDescendant = hasActiveChild(item);\n\n // 스타일 클래스\n const baseClass = isSubItem ? 'admin-sidebar-subitem' : 'admin-sidebar-item';\n const activeClass = 'admin-sidebar-item-active';\n const activeParentClass = 'admin-sidebar-item-active-parent';\n const defaultClass = 'admin-sidebar-item-default';\n const disabledClass = 'admin-sidebar-item-disabled';\n\n return (\n
\n {/* 서브메뉴 트리라인 */}\n {isSubItem && (\n <>\n {/* 세로선 (마지막 아이템이 아닐 때만) */}\n {!isLast && (\n
\n )}\n {/* 커브드 연결선 */}\n
\n \n )}\n {/* 메뉴 아이템 */}\n {hasChildren && item.url ? (\n // 하위 메뉴 + URL 있는 경우: 텍스트 클릭 → 네비게이션, chevron 클릭 → 토글\n \n handleNavigate(event, item.url!)}\n className=\"flex items-center justify-start flex-1 min-w-0\"\n >\n {item.icon && (\n \n )}\n {!collapsed && {label}}\n \n {!collapsed && (\n
\n {item.module_id && (\n \n )}\n toggleExpand(item.id)}\n className=\"p-1 rounded hover:bg-gray-200 dark:hover:bg-gray-600\"\n aria-label={t(isExpanded ? 'common.collapse' : 'common.expand')}\n >\n \n \n
\n )}\n
\n ) : hasChildren ? (\n // 하위 메뉴만 있는 경우 (URL 없음): 전체 클릭 → 토글\n toggleExpand(item.id)}\n className={`\n ${baseClass}\n ${hasActiveDescendant ? activeParentClass : defaultClass}\n ${collapsed ? 'justify-center' : ''}\n `}\n >\n
\n {item.icon && (\n
\n \n
\n )}\n {!collapsed && {label}}\n
\n {!collapsed && (\n
\n {item.module_id && (\n \n )}\n \n
\n )}\n \n ) : item.url ? (\n // 하위 메뉴가 없고 URL이 있는 경우: 네비게이션 버튼\n handleNavigate(event, item.url!)}\n className={`\n ${baseClass}\n ${isActive ? activeClass : defaultClass}\n ${collapsed ? 'justify-center' : ''}\n text-left\n `}\n >\n
\n {item.icon && (\n
\n \n
\n )}\n {!collapsed && {label}}\n
\n {!collapsed && item.module_id && (\n \n )}\n \n ) : (\n // 하위 메뉴도 없고 URL도 없는 경우: 비활성 버튼\n \n
\n {item.icon && (\n
\n \n
\n )}\n {!collapsed && {label}}\n
\n {!collapsed && item.module_id && (\n \n )}\n \n )}\n\n {/* 하위 메뉴 */}\n {hasChildren && !collapsed && isExpanded && (\n
\n {item.children!.map((child, index) =>\n renderMenuItem(child, level + 1, index === item.children!.length - 1)\n )}\n
\n )}\n
\n );\n };\n\n return (\n
\n {/* 로고 영역 (선택적) */}\n {(logo || onToggleCollapse) && (\n
\n {logo && !collapsed && (\n \n )}\n {onToggleCollapse && (\n \n \n \n )}\n
\n )}\n\n {/* 메뉴 영역 */}\n
\n {menu.map((item, index) => renderMenuItem(item, 0, index === menu.length - 1))}\n
\n
\n );\n};\n","import React, { useState, useRef, useEffect } from 'react';\nimport { Div } from '../basic/Div';\nimport { Button } from '../basic/Button';\nimport { Img } from '../basic/Img';\nimport { Span } from '../basic/Span';\nimport { Icon } from '../basic/Icon';\nimport { IconName } from '../basic/IconTypes';\n\n// G7Core.t() 번역 함수 참조\nconst t = (key: string, params?: Record) =>\n (window as any).G7Core?.t?.(key, params) ?? key;\n\n/**\n * 사용자 정보 인터페이스\n */\nexport interface AdminUser {\n name: string;\n email: string;\n avatar?: string;\n role?: string;\n}\n\n/**\n * 알림 아이템 인터페이스\n */\nexport interface NotificationItem {\n id: string | number;\n title: string;\n message: string;\n time: string;\n read?: boolean;\n iconName?: IconName;\n onClick?: () => void;\n}\n\n/**\n * AdminHeader Props\n */\nexport interface AdminHeaderProps {\n user: AdminUser;\n notifications?: NotificationItem[];\n onNotificationClick?: (id: string | number) => void;\n onProfileClick?: () => void;\n onLogoutClick?: () => void;\n className?: string;\n}\n\n/**\n * AdminHeader 컴포넌트\n *\n * 관리자 헤더 - 사용자 프로필, 알림 센터\n *\n * @example\n * ```tsx\n * \n * ```\n */\nexport const AdminHeader: React.FC = ({\n user = { name: '', email: '' },\n notifications = [],\n onNotificationClick,\n onProfileClick,\n onLogoutClick,\n className = '',\n}) => {\n const [showNotifications, setShowNotifications] = useState(false);\n const [showProfileMenu, setShowProfileMenu] = useState(false);\n const notificationRef = useRef(null);\n const profileRef = useRef(null);\n\n const unreadCount = notifications.filter((n) => !n.read).length;\n\n /**\n * 외부 클릭 감지\n */\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n notificationRef.current &&\n !notificationRef.current.contains(event.target as Node)\n ) {\n setShowNotifications(false);\n }\n if (\n profileRef.current &&\n !profileRef.current.contains(event.target as Node)\n ) {\n setShowProfileMenu(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n return (\n \n {/* 알림 센터 */}\n
\n setShowNotifications(!showNotifications)}\n className=\"relative p-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-full transition-colors\"\n aria-label={t('common.notifications')}\n >\n \n {unreadCount > 0 && (\n \n {unreadCount > 9 ? '9+' : unreadCount}\n \n )}\n \n\n {/* 알림 드롭다운 */}\n {showNotifications && (\n
\n
\n {t('common.notifications')}\n
\n
\n {notifications.length === 0 ? (\n
\n {t('common.no_notifications')}\n
\n ) : (\n notifications.map((notification) => (\n {\n notification.onClick?.();\n onNotificationClick?.(notification.id);\n setShowNotifications(false);\n }}\n className={`\n w-full px-4 py-3 text-left hover:bg-gray-50 dark:hover:bg-gray-700 border-b border-gray-100 dark:border-gray-700 transition-colors\n ${!notification.read ? 'bg-blue-50 dark:bg-blue-900/20' : ''}\n `}\n >\n
\n {notification.iconName && (\n \n )}\n
\n
\n {notification.title}\n
\n
\n {notification.message}\n
\n
\n {notification.time}\n
\n
\n {!notification.read && (\n \n )}\n
\n \n ))\n )}\n
\n
\n )}\n
\n\n {/* 사용자 프로필 */}\n
\n setShowProfileMenu(!showProfileMenu)}\n className=\"flex items-center gap-3 px-3 py-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors\"\n >\n {user.avatar ? (\n \n ) : (\n
\n \n
\n )}\n
\n
{user.name}
\n {user.role && (\n
{user.role}
\n )}\n
\n \n \n\n {/* 프로필 드롭다운 */}\n {showProfileMenu && (\n
\n
\n
{user.name}
\n
{user.email}
\n
\n
\n {\n onProfileClick?.();\n setShowProfileMenu(false);\n }}\n className=\"w-full px-4 py-2 text-left hover:bg-gray-50 dark:hover:bg-gray-700 flex items-center gap-3 transition-colors text-gray-900 dark:text-white\"\n >\n \n {t('common.profile_settings')}\n \n {\n onLogoutClick?.();\n setShowProfileMenu(false);\n }}\n className=\"w-full px-4 py-2 text-left hover:bg-gray-50 dark:hover:bg-gray-700 flex items-center gap-3 text-red-600 dark:text-red-400 transition-colors\"\n >\n \n {t('common.logout')}\n \n
\n
\n )}\n
\n
\n );\n};\n","import React, { useState, useRef, useEffect, useCallback, useLayoutEffect } from 'react';\nimport { Div } from '../basic/Div';\nimport { Button } from '../basic/Button';\nimport { Span } from '../basic/Span';\nimport { Icon } from '../basic/Icon';\nimport { IconName } from '../basic/IconTypes';\nimport { Input } from '../basic/Input';\nimport type { EditorAttrs } from '../../types';\n\n/**\n * 알림 아이템 인터페이스\n */\nexport interface NotificationItem {\n id: string | number;\n title: string;\n message: string;\n time: string;\n read?: boolean;\n iconName?: IconName;\n data?: Record;\n onClick?: () => void;\n}\n\n/**\n * NotificationCenter Props\n */\nexport interface NotificationCenterProps {\n /** 알림 목록 */\n notifications?: NotificationItem[];\n /** 서버 기반 미읽음 알림 수 */\n unreadCount?: number;\n /** 추가 로드 가능 여부 */\n hasMore?: boolean;\n /** 로딩 상태 */\n loading?: boolean;\n /** 알림 제목 텍스트 */\n titleText?: string;\n /** 알림 없음 텍스트 */\n emptyText?: string;\n /** \"모두 읽음\" 버튼 텍스트 */\n markAllReadText?: string;\n /** \"모두 삭제\" 버튼 텍스트 */\n deleteAllText?: string;\n /** \"미읽음만\" 체크박스 텍스트 */\n unreadOnlyText?: string;\n /** \"미읽음만\" 체크박스 상태 */\n unreadOnly?: boolean;\n /** 알림 클릭 핸들러 (알림 전체 객체 전달) */\n onNotificationClick?: (notification: NotificationItem) => void;\n /** 드롭다운 닫힐 때 (뷰포트에 들어온 미읽음 알림 ID 목록) */\n onClose?: (visibleUnreadIds: (string | number)[]) => void;\n /** 추가 로드 요청 */\n onLoadMore?: () => void;\n /** 모두 읽음 처리 요청 */\n onMarkAllRead?: () => void;\n /** 모두 삭제 요청 */\n onDeleteAll?: () => void;\n /** 개별 알림 삭제 요청 (알림 전체 객체 전달) */\n onDelete?: (notification: NotificationItem) => void;\n /** \"미읽음만\" 체크박스 토글 */\n onUnreadOnlyToggle?: (checked: boolean) => void;\n /** 드롭다운 정렬 방향 — \"right\"(기본): 우측 정렬되어 좌측으로 확장 / \"left\": 좌측 정렬되어 우측으로 확장 */\n dropdownAlign?: 'left' | 'right';\n className?: string;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\n\n/**\n * NotificationCenter 컴포넌트\n *\n * 알림 센터 - 알림 목록 표시, 무한스크롤, 읽음 추적\n *\n * @example\n * ```tsx\n * \n * ```\n */\nexport const NotificationCenter: React.FC = ({\n notifications = [],\n unreadCount = 0,\n hasMore = false,\n loading = false,\n titleText = 'Notifications',\n emptyText = 'No notifications',\n markAllReadText = 'Mark all as read',\n deleteAllText = 'Delete all',\n unreadOnlyText = 'Unread only',\n unreadOnly = false,\n onNotificationClick,\n onClose,\n onLoadMore,\n onMarkAllRead,\n onDeleteAll,\n onDelete,\n onUnreadOnlyToggle,\n dropdownAlign = 'right',\n className = '',\n id,\n editorAttrs,\n}) => {\n const [showNotifications, setShowNotifications] = useState(false);\n const notificationRef = useRef(null);\n const dropdownRef = useRef(null);\n const scrollRef = useRef(null);\n const sentinelRef = useRef(null);\n const visibleUnreadIdsRef = useRef>(new Set());\n\n // 무한스크롤 관련 최신 값 참조 (observer 재등록 없이 최신 prop 접근)\n const onLoadMoreRef = useRef(onLoadMore);\n const hasMoreRef = useRef(hasMore);\n const loadingRef = useRef(loading);\n const notificationsCountRef = useRef(notifications.length);\n // 마지막 onLoadMore 발행 시점의 notifications.length — 동일 길이에서 중복 발행 가드\n const lastRequestedCountRef = useRef(-1);\n\n useEffect(() => {\n onLoadMoreRef.current = onLoadMore;\n hasMoreRef.current = hasMore;\n loadingRef.current = loading;\n notificationsCountRef.current = notifications.length;\n });\n\n /**\n * 무한스크롤 — IntersectionObserver\n *\n * observer는 드롭다운 열림/닫힘 전환 시에만 재등록한다.\n * 목록이 append되거나 loading/hasMore가 바뀌어도 observer를 새로 만들지 않으므로,\n * sentinel이 이미 뷰포트에 있는 상태에서 재등록 시 즉시 intersecting callback이\n * 중복 발행되던 문제를 방지한다.\n */\n useEffect(() => {\n if (!sentinelRef.current || !scrollRef.current || !showNotifications) return;\n\n // 드롭다운이 새로 열릴 때마다 중복 가드 초기화\n lastRequestedCountRef.current = -1;\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (!entry.isIntersecting) return;\n if (loadingRef.current || !hasMoreRef.current) return;\n // B안 가드: 같은 length에서 이미 한 번 발행했다면 skip\n if (lastRequestedCountRef.current === notificationsCountRef.current) return;\n lastRequestedCountRef.current = notificationsCountRef.current;\n onLoadMoreRef.current?.();\n },\n { root: scrollRef.current, threshold: 0.1 }\n );\n\n observer.observe(sentinelRef.current);\n return () => observer.disconnect();\n }, [showNotifications]);\n\n /**\n * 뷰포트 내 미읽음 알림 추적 — IntersectionObserver\n */\n useEffect(() => {\n if (!scrollRef.current || !showNotifications) return;\n\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n const id = entry.target.getAttribute('data-notification-id');\n const isUnread = entry.target.getAttribute('data-unread') === 'true';\n if (id && isUnread && entry.isIntersecting) {\n visibleUnreadIdsRef.current.add(id);\n }\n });\n },\n {\n root: scrollRef.current,\n threshold: 0.5,\n }\n );\n\n const items = scrollRef.current.querySelectorAll('[data-notification-id]');\n items.forEach((item) => observer.observe(item));\n\n return () => observer.disconnect();\n }, [showNotifications, notifications]);\n\n /**\n * 뱃지에 표시할 카운트 (handleClose 보다 먼저 선언 — deps 참조 순서)\n */\n const displayCount = unreadCount > 0 ? unreadCount : notifications.filter((n) => !n.read).length;\n\n /**\n * 드롭다운 닫기 — 뷰포트에 들어온 미읽음 알림 ID 전달\n *\n * 불필요한 read-batch 호출 방지:\n * 1) displayCount 가 0 이면 이미 모두 읽음/삭제 처리된 상태 → 전체 skip\n * 2) 뷰포트에 나타났던 ID 중 현재 notifications 기준 여전히 unread 인 것만 전달\n * (\"모두 읽음\" onSuccess 로 notifications 가 갱신되면 필터 결과가 빈 배열이 됨)\n */\n const handleClose = useCallback(() => {\n if (showNotifications) {\n if (displayCount > 0) {\n const unreadIds = Array.from(visibleUnreadIdsRef.current).filter((id) => {\n const n = notifications.find((item) => String(item.id) === String(id));\n return n && !n.read;\n });\n if (unreadIds.length > 0) {\n onClose?.(unreadIds);\n }\n }\n visibleUnreadIdsRef.current.clear();\n setShowNotifications(false);\n }\n }, [showNotifications, onClose, displayCount, notifications]);\n\n /**\n * 외부 클릭 감지 — 드롭다운이 열려 있을 때만 리스너 등록\n * (stale closure 방지: showNotifications 변경 시 리스너 재등록)\n * 주의: handleClose가 useCallback으로 선언된 이후에 위치해야 TDZ 위반 방지\n */\n useEffect(() => {\n if (!showNotifications) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n if (\n notificationRef.current &&\n !notificationRef.current.contains(event.target as Node)\n ) {\n handleClose();\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [showNotifications, handleClose]);\n\n /**\n * 드롭다운 토글\n */\n const handleToggle = useCallback(() => {\n if (showNotifications) {\n handleClose();\n } else {\n setShowNotifications(true);\n }\n }, [showNotifications, handleClose]);\n\n /**\n * 드롭다운 열릴 때 뷰포트 경계 검사 후 이탈량만큼 translateX 로 보정\n *\n * class 기반 left-0/right-0 전환은 부모 컨테이너 기준이라 부모가 뷰포트 가장자리에 있을 때\n * 여전히 이탈할 수 있다. 따라서 초기 렌더 후 드롭다운의 실제 뷰포트 좌표를 측정하여\n * 이탈한 픽셀만큼 반대 방향으로 이동시키는 방식을 사용한다.\n */\n useLayoutEffect(() => {\n const dropdown = dropdownRef.current;\n if (!showNotifications || !dropdown) return;\n\n // 측정 전 기존 transform 초기화 (재측정 시 누적 방지)\n dropdown.style.transform = '';\n const rect = dropdown.getBoundingClientRect();\n const vw = typeof window !== 'undefined' ? window.innerWidth : 0;\n\n // layout 미측정(jsdom 등)에서 rect 가 0 으로 반환되는 경우 보정 스킵\n if (rect.width === 0 && rect.height === 0) return;\n\n const margin = 8;\n let shift = 0;\n if (rect.right > vw - margin) {\n shift = -(rect.right - (vw - margin));\n } else if (rect.left < margin) {\n shift = margin - rect.left;\n }\n\n if (shift !== 0) {\n dropdown.style.transform = `translateX(${shift}px)`;\n }\n }, [showNotifications, dropdownAlign, notifications.length]);\n\n return (\n
\n \n \n {displayCount > 0 && (\n \n {displayCount > 99 ? '99+' : displayCount}\n \n )}\n \n\n {/* 알림 드롭다운 */}\n {showNotifications && (\n
\n
\n
\n {titleText}\n {onUnreadOnlyToggle && (\n onUnreadOnlyToggle(!unreadOnly)}\n >\n ) => {\n e.stopPropagation();\n onUnreadOnlyToggle(e.target.checked);\n }}\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n className=\"w-3.5 h-3.5 rounded border-gray-300 dark:border-gray-600 text-blue-600 dark:text-blue-400 focus:ring-blue-500 dark:focus:ring-blue-400 cursor-pointer\"\n />\n {unreadOnlyText}\n
\n )}\n
\n
\n {onMarkAllRead && displayCount > 0 && (\n {\n onMarkAllRead();\n visibleUnreadIdsRef.current.clear();\n }}\n className=\"text-xs text-blue-600 dark:text-blue-400 hover:text-blue-800 dark:hover:text-blue-300 hover:underline cursor-pointer\"\n >\n {markAllReadText}\n \n )}\n {onDeleteAll && notifications.length > 0 && (\n {\n // 드롭다운은 닫지 않음 — 확인 모달이 닫히면 다시 자연스럽게 노출되어야 하고,\n // 사용자가 모달 취소 시에도 컨텍스트 유지 (요구사항)\n onDeleteAll();\n }}\n className=\"text-xs text-red-600 dark:text-red-400 hover:text-red-800 dark:hover:text-red-300 hover:underline cursor-pointer\"\n >\n {deleteAllText}\n \n )}\n
\n
\n
\n {notifications.length === 0 && !loading ? (\n
\n {emptyText}\n
\n ) : (\n <>\n {notifications.map((notification) => {\n const isUnread = !notification.read;\n return (\n {\n notification.onClick?.();\n onNotificationClick?.(notification);\n setShowNotifications(false);\n }}\n className={`group flex items-start gap-3 px-4 py-3 text-left border-b border-gray-100 dark:border-gray-700 transition-colors cursor-pointer ${\n isUnread\n ? 'bg-blue-50/70 dark:bg-blue-900/20 hover:bg-blue-50 dark:hover:bg-blue-900/30'\n : 'bg-white dark:bg-gray-800 hover:bg-gray-50 dark:hover:bg-gray-700/50 opacity-70'\n }`}\n >\n {notification.iconName && (\n \n )}\n
\n \n {notification.title}\n
\n \n {notification.message}\n
\n
\n {notification.time}\n
\n
\n
\n {isUnread && (\n \n )}\n {onDelete && (\n {\n e.stopPropagation();\n onDelete(notification);\n }}\n className=\"p-1 text-gray-400 dark:text-gray-500 hover:text-red-600 dark:hover:text-red-400 rounded hover:bg-red-50 dark:hover:bg-red-900/20 cursor-pointer opacity-0 group-hover:opacity-100 transition-opacity\"\n aria-label=\"Delete notification\"\n >\n \n \n )}\n
\n \n );\n })}\n {/* 무한스크롤 sentinel */}\n {hasMore && (\n
\n {loading ? (\n ...\n ) : (\n \n )}\n
\n )}\n {loading && !hasMore && notifications.length > 0 && (\n
\n ...\n
\n )}\n \n )}\n \n \n )}\n \n );\n};\n","import React, { useState, useRef, useEffect } from 'react';\nimport { Div } from '../basic/Div';\nimport { Button } from '../basic/Button';\nimport { Img } from '../basic/Img';\nimport { Span } from '../basic/Span';\nimport { Icon } from '../basic/Icon';\nimport { IconName } from '../basic/IconTypes';\nimport type { EditorAttrs } from '../../types';\n\n// Logger 설정 (G7Core 초기화 전에도 동작하도록 폴백 포함)\nconst logger = ((window as any).G7Core?.createLogger?.('Comp:UserProfile')) ?? {\n log: (...args: unknown[]) => console.log('[Comp:UserProfile]', ...args),\n warn: (...args: unknown[]) => console.warn('[Comp:UserProfile]', ...args),\n error: (...args: unknown[]) => console.error('[Comp:UserProfile]', ...args),\n};\n\n/**\n * 사용자 정보 인터페이스\n */\nexport interface User {\n id: number | string;\n uuid?: string;\n name: string;\n email: string;\n avatar?: string;\n role?: string;\n}\n\n/**\n * UserProfile Props\n */\nexport interface UserProfileProps {\n user: User;\n /** 프로필 설정 텍스트 */\n profileText?: string;\n /** 로그아웃 텍스트 */\n logoutText?: string;\n /** 언어 설정 텍스트 */\n languageText?: string;\n /** 사용 가능한 언어 목록 */\n availableLocales?: string[];\n onProfileClick?: () => void;\n onLogoutClick?: () => void;\n className?: string;\n /** 로그아웃 API 엔드포인트 (기본값: /api/admin/auth/logout) */\n logoutEndpoint?: string;\n /** 로그아웃 후 리다이렉션 경로 (기본값: /admin/login) */\n redirectPath?: string;\n /** Chevron 아이콘 표시 여부 (기본값: true) */\n showChevron?: boolean;\n /** 드롭다운 열림 방향 (기본값: 'up') */\n dropdownDirection?: 'up' | 'down';\n /** 드롭다운만 표시 (버튼 영역 숨김, 외부 요소 클릭 트리거용) */\n dropdownOnly?: boolean;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * UserProfile 컴포넌트\n *\n * 사용자 프로필 표시 및 드롭다운 메뉴 제공\n *\n * @example\n * ```tsx\n * console.log('프로필 클릭')}\n * onLogoutClick={() => console.log('로그아웃')}\n * />\n * ```\n */\nexport const UserProfile: React.FC = ({\n user = { name: '', email: '' },\n profileText = 'Profile Settings',\n logoutText = 'Logout',\n // languageText / availableLocales: 언어가 헤더로 일원화되어 드롭다운에서 제거됨.\n // props 는 인터페이스에 유지(하위호환)하되 본문에서 사용하지 않으므로 destructure 생략.\n onProfileClick,\n onLogoutClick,\n className = '',\n logoutEndpoint = '/api/admin/auth/logout',\n redirectPath = '/admin/login',\n showChevron = true,\n dropdownDirection = 'up',\n dropdownOnly = false,\n id,\n editorAttrs,\n}) => {\n const [showProfileMenu, setShowProfileMenu] = useState(false);\n const [isLoggingOut, setIsLoggingOut] = useState(false);\n const profileRef = useRef(null);\n\n /**\n * 외부 클릭 감지\n */\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n profileRef.current &&\n !profileRef.current.contains(event.target as Node)\n ) {\n setShowProfileMenu(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n /**\n * 쿠키에서 XSRF 토큰 읽기\n */\n const getXsrfToken = (): string | null => {\n const value = `; ${document.cookie}`;\n const parts = value.split(`; XSRF-TOKEN=`);\n if (parts.length === 2) {\n return decodeURIComponent(parts.pop()?.split(';').shift() || '');\n }\n return null;\n };\n\n /**\n * 로컬 스토리지에서 Bearer 토큰 읽기\n */\n const getBearerToken = (): string | null => {\n return localStorage.getItem('auth_token');\n };\n\n /**\n * 로그아웃 처리\n */\n const handleLogout = async () => {\n if (isLoggingOut) return;\n\n try {\n setIsLoggingOut(true);\n setShowProfileMenu(false);\n\n // 커스텀 로그아웃 핸들러 실행\n if (onLogoutClick) {\n onLogoutClick();\n return;\n }\n\n // 토큰 가져오기\n const xsrfToken = getXsrfToken();\n const bearerToken = getBearerToken();\n\n // API 호출\n const response = await fetch(logoutEndpoint, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n ...(xsrfToken && { 'X-XSRF-TOKEN': xsrfToken }),\n ...(bearerToken && { Authorization: `Bearer ${bearerToken}` }),\n },\n credentials: 'include',\n });\n\n if (response.ok) {\n // 로그아웃 성공 - 로컬 스토리지에서 토큰 제거\n localStorage.removeItem('auth_token');\n // 로그인 페이지로 리다이렉션\n window.location.href = redirectPath;\n } else {\n logger.error('로그아웃 실패:', response.statusText);\n // 실패해도 토큰 제거 및 로그인 페이지로 이동 (토큰 만료 등의 경우)\n localStorage.removeItem('auth_token');\n window.location.href = redirectPath;\n }\n } catch (error) {\n logger.error('로그아웃 오류:', error);\n // 에러 발생 시에도 토큰 제거 및 로그인 페이지로 이동\n localStorage.removeItem('auth_token');\n window.location.href = redirectPath;\n } finally {\n setIsLoggingOut(false);\n }\n };\n\n return (\n
\n setShowProfileMenu(!showProfileMenu)}\n className={dropdownOnly\n ? \"w-full h-full opacity-0 cursor-pointer\"\n : \"flex items-center gap-2 px-3 py-2 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors w-full\"}\n >\n {!dropdownOnly && (\n <>\n {user.avatar ? (\n \n ) : (\n
\n \n
\n )}\n
\n
{user.name}
\n {user.role && (\n
{user.role}
\n )}\n
\n {showChevron && (\n \n )}\n \n )}\n \n\n {/* 프로필 드롭다운 */}\n {showProfileMenu && (\n
\n {\n setShowProfileMenu(false);\n (window as any).G7Core?.dispatch({\n handler: 'navigate',\n params: { path: `/admin/users/${user.uuid}` },\n });\n }}\n >\n
{user.name}
\n
{user.email}
\n
\n {/* 언어 선택은 헤더 독립 버튼으로 일원화(드롭다운에서 제거) — 유저 템플릿 패리티(H-T7).\n languageText/availableLocales props 는 하위호환을 위해 유지하되 더 이상 사용하지 않는다. */}\n
\n {\n setShowProfileMenu(false);\n if (onProfileClick) {\n onProfileClick();\n } else {\n // 기본 동작: 사용자 수정 페이지로 이동 (SPA 네비게이션)\n (window as any).G7Core?.dispatch({\n handler: 'navigate',\n params: { path: `/admin/users/${user.uuid}/edit` },\n });\n }\n }}\n className=\"w-full px-4 py-2 text-left hover:bg-gray-50 dark:hover:bg-gray-700 flex items-center justify-start gap-3 transition-colors\"\n >\n \n {profileText}\n \n \n \n {isLoggingOut ? 'Logging out...' : logoutText}\n \n
\n
\n )}\n \n );\n};\n","import React, { useState, useRef, useEffect } from 'react';\nimport { Div } from '../basic/Div';\nimport { Button } from '../basic/Button';\nimport { Icon } from '../basic/Icon';\nimport { IconName } from '../basic/IconTypes';\nimport { Span } from '../basic/Span';\nimport type { EditorAttrs } from '../../types';\n\n// Logger 설정 (G7Core 초기화 전에도 동작하도록 폴백 포함)\nconst logger = ((window as any).G7Core?.createLogger?.('Comp:LanguageSelector')) ?? {\n log: (...args: unknown[]) => console.log('[Comp:LanguageSelector]', ...args),\n warn: (...args: unknown[]) => console.warn('[Comp:LanguageSelector]', ...args),\n error: (...args: unknown[]) => console.error('[Comp:LanguageSelector]', ...args),\n};\n\n/**\n * 로케일 코드를 사람이 읽을 수 있는 이름으로 변환\n */\nconst getLocaleName = (locale: string): string => {\n // 활성 언어팩의 native_name 을 우선 사용 (LanguagePackServiceProvider 가 주입)\n const fromAppConfig = (window as any).G7Core?.state?.get?.('_global.appConfig.localeNames')?.[locale];\n if (fromAppConfig) {\n return fromAppConfig;\n }\n const fallback: Record = {\n ko: '한국어',\n en: 'English',\n ja: '日本語',\n zh: '中文',\n es: 'Español',\n fr: 'Français',\n de: 'Deutsch',\n };\n return fallback[locale] || locale;\n};\n\n/**\n * LanguageSelector Props\n */\nexport interface LanguageSelectorProps {\n /** 사용 가능한 언어 목록 (template.json의 locales에서 자동 바인딩) */\n availableLocales?: string[];\n /** 언어 설정 텍스트 */\n languageText?: string;\n /** 언어 변경 API 엔드포인트 */\n apiEndpoint?: string;\n /** 언어 변경 후 콜백 */\n onLanguageChange?: (locale: string) => void;\n /** 추가 CSS 클래스 */\n className?: string;\n /** 인라인 모드 (드롭다운 메뉴 내에서 사용) */\n inline?: boolean;\n /**\n * 독립 모드 버튼에 현재 선택 언어 코드를 globe 아이콘 옆에 표시한다.\n * 유저 템플릿 헤더 언어 버튼과 동일한 표기(아이콘 + 로케일 코드)를 위해 사용.\n */\n showCode?: boolean;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * LanguageSelector 컴포넌트\n *\n * 언어 전환 드롭다운 제공\n * - DB에 언어 설정 저장\n * - localStorage에 로케일 저장\n * - 새로고침 없이 UI 리렌더링\n *\n * @example\n * ```tsx\n * // 독립적으로 사용\n * \n *\n * // 인라인 모드 (다른 드롭다운 내에서 사용)\n * \n * ```\n */\nexport const LanguageSelector: React.FC = ({\n availableLocales = ['ko', 'en'],\n languageText = 'Language',\n apiEndpoint = '/api/admin/users/me/language',\n onLanguageChange,\n className = '',\n inline = false,\n showCode = false,\n id,\n editorAttrs,\n}) => {\n const [showMenu, setShowMenu] = useState(false);\n const [isChanging, setIsChanging] = useState(false);\n const [currentLocale, setCurrentLocale] = useState(() => {\n return localStorage.getItem('g7_locale') || 'ko';\n });\n const menuRef = useRef(null);\n\n /**\n * 외부 클릭 감지 (인라인 모드가 아닐 때만)\n */\n useEffect(() => {\n if (inline) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(event.target as Node)) {\n setShowMenu(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [inline]);\n\n /**\n * 쿠키에서 XSRF 토큰 읽기\n */\n const getXsrfToken = (): string | null => {\n const value = `; ${document.cookie}`;\n const parts = value.split(`; XSRF-TOKEN=`);\n if (parts.length === 2) {\n return decodeURIComponent(parts.pop()?.split(';').shift() || '');\n }\n return null;\n };\n\n /**\n * 로컬 스토리지에서 Bearer 토큰 읽기\n */\n const getBearerToken = (): string | null => {\n return localStorage.getItem('auth_token');\n };\n\n /**\n * 언어 변경 처리\n */\n const handleLanguageChange = async (locale: string) => {\n if (isChanging || locale === currentLocale) return;\n\n try {\n setIsChanging(true);\n\n const xsrfToken = getXsrfToken();\n const bearerToken = getBearerToken();\n\n // API 호출로 DB에 저장 (실패해도 UI는 변경)\n try {\n const response = await fetch(apiEndpoint, {\n method: 'PATCH',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n ...(xsrfToken && { 'X-XSRF-TOKEN': xsrfToken }),\n ...(bearerToken && { Authorization: `Bearer ${bearerToken}` }),\n },\n credentials: 'include',\n body: JSON.stringify({ language: locale }),\n });\n\n if (!response.ok) {\n logger.warn('언어 설정 저장 실패 (UI는 변경됨):', response.statusText);\n }\n } catch (apiError) {\n logger.warn('언어 설정 API 호출 실패 (UI는 변경됨):', apiError);\n }\n\n // UI 상태 업데이트\n setCurrentLocale(locale);\n setShowMenu(false);\n\n // 콜백 실행\n onLanguageChange?.(locale);\n\n // TemplateApp의 changeLocale 호출하여 UI 리렌더링\n if ((window as any).__templateApp) {\n await (window as any).__templateApp.changeLocale(locale);\n } else {\n logger.warn('TemplateApp not found, reloading page');\n window.location.reload();\n }\n } catch (error) {\n logger.error('언어 변경 오류:', error);\n } finally {\n setIsChanging(false);\n }\n };\n\n // 인라인 모드: 접기/펼치기 가능한 뱃지 방식\n if (inline) {\n return (\n
\n setShowMenu(!showMenu)}\n disabled={isChanging}\n className=\"w-full px-4 py-2 text-left hover:bg-gray-50 dark:hover:bg-gray-700 flex items-center gap-3 transition-colors\"\n >\n \n \n {languageText}\n \n \n {currentLocale.toUpperCase()}\n \n \n \n {showMenu && (\n
\n {availableLocales.map((locale) => (\n handleLanguageChange(locale)}\n disabled={isChanging}\n className={`\n px-3 py-1.5 text-sm font-medium rounded-md transition-colors\n ${\n currentLocale === locale\n ? 'bg-blue-600 text-white'\n : 'bg-gray-100 dark:bg-gray-700 text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-600'\n }\n ${isChanging ? 'opacity-50 cursor-not-allowed' : ''}\n `}\n >\n {getLocaleName(locale)}\n \n ))}\n
\n )}\n
\n );\n }\n\n // 독립 모드: 드롭다운 버튼과 메뉴\n return (\n
\n setShowMenu(!showMenu)}\n className={\n showCode\n ? 'flex items-center gap-1.5 px-2.5 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors cursor-pointer'\n : 'p-2 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-lg transition-colors'\n }\n aria-haspopup=\"listbox\"\n aria-expanded={showMenu}\n aria-label={languageText}\n >\n \n {showCode && (\n {currentLocale}\n )}\n {showCode && (\n \n )}\n \n\n {showMenu && (\n
\n
\n {availableLocales.map((locale) => (\n handleLanguageChange(locale)}\n disabled={isChanging}\n className={`\n w-full px-4 py-2 text-left hover:bg-gray-50 dark:hover:bg-gray-700 flex items-center gap-3 transition-colors\n ${currentLocale === locale ? 'bg-gray-50 dark:bg-gray-700' : ''}\n ${isChanging ? 'opacity-50 cursor-not-allowed' : ''}\n `}\n >\n \n {getLocaleName(locale)}\n \n {currentLocale === locale && (\n \n )}\n \n ))}\n
\n
\n )}\n
\n );\n};\n","import React, { useCallback } from 'react';\nimport { Div } from '../basic/Div';\nimport { A } from '../basic/A';\nimport { Span } from '../basic/Span';\nimport { Icon } from '../basic/Icon';\nimport { IconName } from '../basic/IconTypes';\nimport type { EditorAttrs } from '../../types';\n\n/**\n * 빠른 링크 인터페이스\n */\nexport interface QuickLink {\n id: string | number;\n label: string;\n url: string;\n iconName?: IconName;\n}\n\n/**\n * AdminFooter Props\n */\nexport interface AdminFooterProps {\n copyright?: string;\n version?: string;\n quickLinks?: QuickLink[];\n className?: string;\n copyrightModalId?: string;\n changelogModalId?: string;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * AdminFooter 컴포넌트\n *\n * 관리자 푸터 - 버전 정보, 빠른 링크\n *\n * @example\n * ```tsx\n * \n * ```\n */\nexport const AdminFooter: React.FC = ({\n copyright = '© 2026 G7',\n version,\n quickLinks = [],\n className = '',\n changelogModalId,\n copyrightModalId,\n id,\n editorAttrs,\n}) => {\n const handleVersionClick = useCallback(() => {\n if (changelogModalId) {\n const G7Core = (window as any).G7Core;\n\n G7Core?.dispatch?.({\n handler: 'sequence',\n actions: [\n {\n handler: 'apiCall',\n auth_required: true,\n target: '/api/admin/changelog',\n params: {\n method: 'GET',\n },\n onSuccess: [\n {\n handler: 'setState',\n params: {\n target: 'global',\n coreChangelogContent: '{{response.data.content}}',\n },\n },\n {\n handler: 'openModal',\n target: changelogModalId,\n },\n ],\n onError: [\n {\n handler: 'openModal',\n target: changelogModalId,\n },\n ],\n },\n ],\n });\n }\n }, [changelogModalId]);\n\n const handleCopyrightClick = useCallback(() => {\n if (copyrightModalId) {\n const G7Core = (window as any).G7Core;\n\n G7Core?.dispatch?.({\n handler: 'sequence',\n actions: [\n {\n handler: 'apiCall',\n auth_required: true,\n target: '/api/admin/license',\n params: {\n method: 'GET',\n },\n onSuccess: [\n {\n handler: 'setState',\n params: {\n target: 'global',\n coreLicenseContent: '{{response.data.content}}',\n },\n },\n {\n handler: 'openModal',\n target: copyrightModalId,\n },\n ],\n onError: [\n {\n handler: 'openModal',\n target: copyrightModalId,\n },\n ],\n },\n ],\n });\n }\n }, [copyrightModalId]);\n\n return (\n
\n
\n {/* 왼쪽: 저작권 및 버전 정보 */}\n
\n \n {copyright}\n \n {version && (\n <>\n •\n \n \n v{version}\n \n \n )}\n
\n\n {/* 오른쪽: 빠른 링크 */}\n {quickLinks.length > 0 && (\n
\n {quickLinks.map((link) => (\n \n {link.iconName && }\n {link.label}\n \n ))}\n
\n )}\n
\n
\n );\n};\n","import React from 'react';\nimport { Div } from '../basic/Div';\nimport { H1 } from '../basic/H1';\nimport { P } from '../basic/P';\nimport { Button } from '../basic/Button';\nimport { Icon } from '../basic/Icon';\nimport { IconName } from '../basic/IconTypes';\nimport { Breadcrumb, BreadcrumbItem } from './Breadcrumb';\nimport type { EditorAttrs } from '../../types';\n\n/**\n * 탭 아이템 인터페이스\n */\nexport interface TabItem {\n id: string | number;\n label: string;\n value: string;\n active?: boolean;\n badge?: string | number;\n}\n\n/**\n * 액션 버튼 인터페이스\n */\nexport interface ActionButton {\n id: string | number;\n label: string;\n onClick?: () => void;\n variant?: 'primary' | 'secondary' | 'danger' | 'ghost';\n iconName?: IconName;\n disabled?: boolean;\n}\n\n/**\n * PageHeader Props\n */\nexport interface PageHeaderProps {\n title: string;\n description?: string;\n breadcrumbItems?: BreadcrumbItem[];\n tabs?: TabItem[];\n onTabChange?: (value: string) => void;\n actions?: ActionButton[];\n className?: string;\n children?: React.ReactNode;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * PageHeader 컴포넌트\n *\n * 페이지 헤더 - admin_dashboard.json의 page_header 스타일과 동일\n * 배경색 없음, flex items-center justify-between mb-6 레이아웃\n *\n * @example\n * ```tsx\n * \n * ```\n */\nexport const PageHeader: React.FC = ({\n title,\n description,\n breadcrumbItems,\n tabs,\n onTabChange,\n actions,\n className = '',\n children,\n id,\n editorAttrs,\n}) => {\n /**\n * Variant별 버튼 스타일\n */\n const getButtonClasses = (variant: ActionButton['variant'] = 'secondary'): string => {\n const variantClasses: Record, string> = {\n primary: 'page-action-primary',\n secondary: 'page-action-secondary',\n danger: 'page-action-danger',\n ghost: 'page-action-ghost',\n };\n\n return variantClasses[variant];\n };\n\n return (\n
\n {/* 브레드크럼 - Breadcrumb 컴포넌트 재사용 */}\n {breadcrumbItems && breadcrumbItems.length > 0 && (\n
\n \n
\n )}\n\n {/* 제목 및 액션 버튼 - admin_dashboard.json 스타일 */}\n
\n
\n

{title}

\n {description && (\n

{description}

\n )}\n
\n\n {/* 액션 버튼 또는 children */}\n {children ? (\n
{children}
\n ) : actions && actions.length > 0 ? (\n
\n {actions.map((action) => (\n \n {action.iconName && (\n \n )}\n {action.variant !== 'ghost' && action.label && (\n
{action.label}
\n )}\n \n ))}\n
\n ) : null}\n
\n\n {/* 탭 네비게이션 */}\n {tabs && tabs.length > 0 && (\n
\n {tabs.map((tab) => (\n onTabChange?.(tab.value)}\n className={tab.active ? 'tab-btn-active' : 'tab-btn'}\n >\n
{tab.label}
\n {tab.badge !== undefined && (\n
\n {tab.badge}\n
\n )}\n \n ))}\n
\n )}\n
\n );\n};\n","import React from 'react';\nimport { Div } from '../basic/Div';\nimport { H2 } from '../basic/H2';\nimport { P } from '../basic/P';\nimport type { EditorAttrs } from '../../types';\n\n// G7Core 전역 객체의 스타일 헬퍼 접근\nconst G7Core = () => (window as any).G7Core;\n\nexport interface SectionHeaderProps {\n title?: string;\n description?: string;\n className?: string;\n style?: React.CSSProperties;\n children?: React.ReactNode;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * SectionHeader 집합 컴포넌트\n *\n * 페이지 내부의 섹션 (카드 / 탭 / 폼 그룹 등) 머리 부분을 표준화하는\n * 가벼운 헤더 시맨틱. 제목 (좌측) + 액션 자식 (우측) 의 균형 배치.\n *\n * PageHeader 와 다른 점:\n * - PageHeader 는 페이지 단위 머리 (제목 + description + actions array\n * + tabs + breadcrumb) 등 풍부한 구조.\n * - SectionHeader 는 카드/탭/폼 그룹 안의 섹션 머리 — 제목과 우측\n * children 슬롯만. 인라인 `flex items-center justify-between` 패턴\n * 중 \"제목 + 액션\" 묶음을 흡수.\n *\n * 기본 컴포넌트 조합: Div + H2 + P\n *\n * @example\n * // 레이아웃 JSON 사용 예시\n * {\n * \"name\": \"SectionHeader\",\n * \"props\": { \"title\": \"최근 활동\", \"className\": \"mb-4\" },\n * \"children\": [\n * { \"type\": \"basic\", \"name\": \"Button\", ... }\n * ]\n * }\n */\nexport const SectionHeader: React.FC = ({\n title,\n description,\n className = '',\n style,\n children,\n id,\n editorAttrs,\n}) => {\n const baseClasses = 'flex items-center justify-between';\n const mergedClassName =\n G7Core()?.style?.mergeClasses?.(baseClasses, className) ?? `${baseClasses} ${className}`;\n\n return (\n
\n
\n {title &&

{title}

}\n {description && (\n

{description}

\n )}\n
\n {children &&
{children}
}\n
\n );\n};\n","import React from 'react';\nimport { Div } from '../basic/Div';\nimport { Img } from '../basic/Img';\nimport { H3 } from '../basic/H3';\nimport { P } from '../basic/P';\nimport { Span } from '../basic/Span';\nimport { Button } from '../basic/Button';\nimport { Icon } from '../basic/Icon';\nimport { IconName } from '../basic/IconTypes';\nimport { StatusBadge, StatusType } from './StatusBadge';\nimport { ActionMenu, ActionMenuItem } from './ActionMenu';\nimport type { EditorAttrs } from '../../types';\n\n// G7Core.t() 번역 함수 참조\nconst t = (key: string, params?: Record) =>\n (window as any).G7Core?.t?.(key, params) ?? key;\n\n/**\n * 템플릿 상태\n */\nexport type TemplateStatus = 'active' | 'inactive' | 'pending' | 'error';\n\n/**\n * TemplateCard Props\n */\nexport interface TemplateCardProps {\n image?: string;\n imageAlt?: string;\n vendor: string;\n name: string;\n version: string;\n status: TemplateStatus;\n updateAvailable?: boolean;\n latestVersion?: string;\n dependencies?: string[];\n showLayoutEditButton?: boolean;\n actions?: ActionMenuItem[];\n onLayoutEditClick?: () => void;\n className?: string;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * TemplateCard 컴포넌트\n *\n * 템플릿 카드 - 상태 뱃지, 미리보기 이미지, 퀵 액션 버튼(ActionMenu) 포함\n *\n * @example\n * ```tsx\n * console.log('Edit layouts')}\n * actions={[\n * { id: 'info', label: '정보 보기', iconName: IconName.InfoCircle, onClick: () => {} },\n * { id: 'update', label: '업데이트', iconName: IconName.Download, onClick: () => {} },\n * { id: 'remove', label: '제거', iconName: IconName.Trash, variant: 'danger', onClick: () => {} }\n * ]}\n * />\n * ```\n */\nexport const TemplateCard: React.FC = ({\n image,\n imageAlt,\n vendor,\n name,\n version,\n status,\n updateAvailable = false,\n latestVersion,\n dependencies = [],\n showLayoutEditButton = false,\n actions = [],\n onLayoutEditClick,\n className = '',\n id,\n editorAttrs,\n}) => {\n /**\n * 상태를 StatusType으로 매핑\n */\n const getStatusType = (status: TemplateStatus): StatusType => {\n const statusMap: Record = {\n active: 'success',\n inactive: 'default',\n pending: 'pending',\n error: 'error',\n };\n return statusMap[status];\n };\n\n /**\n * 상태 라벨 (다국어 지원)\n */\n const getStatusLabel = (status: TemplateStatus): string => {\n const labelMap: Record = {\n active: t('common.status_active'),\n inactive: t('common.status_inactive'),\n pending: t('common.status_pending'),\n error: t('common.status_error'),\n };\n return labelMap[status];\n };\n\n return (\n \n {/* 미리보기 이미지 */}\n {image && (\n
\n \n {/* 상태 뱃지 (이미지 위) */}\n
\n \n
\n {/* 업데이트 가능 뱃지 */}\n {updateAvailable && (\n
\n \n \n {t('common.update_available')}\n \n
\n )}\n
\n )}\n\n {/* 카드 본문 */}\n
\n {/* 헤더: 템플릿 정보 + 액션 메뉴 */}\n
\n
\n

\n {vendor}/{name}\n

\n
\n v{version}\n {updateAvailable && latestVersion && (\n <>\n →\n v{latestVersion}\n \n )}\n
\n {/* 이미지가 없을 때 상태 뱃지 표시 */}\n {!image && (\n
\n \n
\n )}\n
\n\n {/* 액션 메뉴 (ActionMenu 컴포넌트 재사용) */}\n {actions.length > 0 && (\n \n )}\n
\n\n {/* 의존성 정보 */}\n {dependencies.length > 0 && (\n
\n

{t('common.dependencies')}:

\n
\n {dependencies.map((dep, index) => (\n \n {dep}\n \n ))}\n
\n
\n )}\n\n {/* 레이아웃 편집 버튼 */}\n {showLayoutEditButton && onLayoutEditClick && (\n \n \n {t('common.edit_layout')}\n \n )}\n
\n \n );\n};\n","// e2e:allow편집기 추가 직후 type 미지정 시 크래시(\"컴포넌트 로드 실패\") 결함#4 수정(typeConfig 폴백). 라이브 검증은 Chrome MCP T1~T7(에디터 추가/속성편집/저장200/reload영속/게스트 사용자화면 렌더)로 수행, 단위 회귀는 Alert.test.tsx 결함#4 describe.\nimport React from 'react';\nimport { Div } from '../basic/Div';\nimport { P } from '../basic/P';\nimport { Button } from '../basic/Button';\nimport { Icon } from '../basic/Icon';\nimport { IconName } from '../basic/IconTypes';\nimport type { EditorAttrs } from '../../types';\n\n/**\n * 알림 타입\n */\nexport type AlertType = 'info' | 'success' | 'warning' | 'error';\n\nexport interface AlertProps {\n /**\n * 알림 타입\n */\n type: AlertType;\n\n /**\n * 알림 메시지\n */\n message: string;\n\n /**\n * 닫기 버튼 표시 여부\n */\n dismissible?: boolean;\n\n /**\n * 닫기 버튼 클릭 시 콜백\n */\n onDismiss?: () => void;\n\n /**\n * 사용자 정의 클래스\n */\n className?: string;\n\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n /**\n * 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread)\n */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * Alert 알림 컴포넌트\n *\n * 알림 메시지를 표시하는 composite 컴포넌트입니다.\n * type에 따라 다른 색상과 아이콘을 표시하며 dismissible 옵션을 지원합니다.\n *\n * @example\n * // 정보 알림\n * \n *\n * // 성공 알림 (닫기 버튼 포함)\n * console.log('dismissed')}\n * />\n *\n * // 경고 알림\n * \n *\n * // 에러 알림\n * \n */\nexport const Alert: React.FC = ({\n type,\n message,\n dismissible = false,\n onDismiss,\n className = '',\n id,\n editorAttrs,\n}) => {\n // 타입별 시맨틱 클래스 및 아이콘 매핑\n const typeConfig = {\n info: {\n containerClass: 'alert-info',\n iconClass: 'alert-icon-info',\n textClass: 'alert-text-info',\n icon: IconName.InfoCircle,\n },\n success: {\n containerClass: 'alert-success',\n iconClass: 'alert-icon-success',\n textClass: 'alert-text-success',\n icon: IconName.CheckCircle,\n },\n warning: {\n containerClass: 'alert-warning',\n iconClass: 'alert-icon-warning',\n textClass: 'alert-text-warning',\n icon: IconName.ExclamationTriangle,\n },\n error: {\n containerClass: 'alert-error',\n iconClass: 'alert-icon-error',\n textClass: 'alert-text-error',\n icon: IconName.TimesCircle,\n },\n };\n\n // type 미지정/미지원 값일 때도 크래시하지 않도록 info 로 폴백한다(레이아웃 편집기에서\n // 컴포넌트를 추가한 직후 작성자가 type 을 지정하기 전 상태를 안전하게 렌더).\n const config = typeConfig[type] ?? typeConfig.info;\n\n return (\n \n {/* 아이콘 */}\n \n\n {/* 메시지 */}\n

\n {message}\n

\n\n {/* 닫기 버튼 (dismissible이 true일 때만 표시) */}\n {dismissible && (\n \n \n \n )}\n \n );\n};\n","import React from 'react';\nimport { Div } from '../basic/Div';\nimport { H2 } from '../basic/H2';\nimport { Button } from '../basic/Button';\nimport { Icon } from '../basic/Icon';\nimport { IconName } from '../basic/IconTypes';\n\nexport interface LayoutEditorHeaderProps {\n /**\n * 레이아웃 이름\n */\n layoutName: string;\n\n /**\n * 뒤로가기 버튼 클릭 시 콜백\n */\n onBack: () => void;\n\n /**\n * 미리보기 버튼 클릭 시 콜백\n */\n onPreview: () => void;\n\n /**\n * 저장 버튼 클릭 시 콜백\n */\n onSave: () => void;\n\n /**\n * 저장 중 상태 여부\n */\n isSaving?: boolean;\n\n /**\n * 사용자 정의 클래스\n */\n className?: string;\n}\n\n/**\n * LayoutEditorHeader 레이아웃 편집 헤더 컴포넌트\n *\n * 레이아웃 편집 화면의 헤더 영역을 구성하는 composite 컴포넌트입니다.\n * 뒤로가기, 제목, 미리보기, 저장 버튼을 포함합니다.\n *\n * @example\n * // 기본 사용\n * console.log('back')}\n * onPreview={() => console.log('preview')}\n * onSave={() => console.log('save')}\n * />\n *\n * // 저장 중 상태\n * console.log('back')}\n * onPreview={() => console.log('preview')}\n * onSave={() => console.log('save')}\n * isSaving={true}\n * />\n */\nexport const LayoutEditorHeader: React.FC = ({\n layoutName,\n onBack,\n onPreview,\n onSave,\n isSaving = false,\n className = '',\n}) => {\n // 컨테이너 클래스 조합\n const containerClasses = `\n flex items-center justify-between gap-4 p-4 bg-white dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700\n ${className}\n `.trim().replace(/\\s+/g, ' ');\n\n return (\n
\n {/* 좌측 영역: 뒤로가기 버튼 + 제목 */}\n
\n {/* 뒤로가기 버튼 */}\n \n \n \n\n {/* 제목 */}\n

\n {layoutName}\n

\n
\n\n {/* 우측 영역: 미리보기 버튼 + 저장 버튼 */}\n
\n {/* 미리보기 버튼 */}\n \n
\n \n 미리보기\n
\n \n\n {/* 저장 버튼 */}\n \n
\n \n {isSaving ? '저장 중...' : '저장'}\n
\n \n
\n
\n );\n};\n","import React from 'react';\nimport { Div } from '../basic/Div';\nimport { Ul } from '../basic/Ul';\nimport { Li } from '../basic/Li';\nimport { Span } from '../basic/Span';\n\nexport interface LayoutFileItem {\n /**\n * 파일 ID\n */\n id: string | number;\n\n /**\n * 파일명\n */\n name: string;\n\n /**\n * 최종 수정 시간\n */\n updated_at: string;\n}\n\nexport interface LayoutFileListProps {\n /**\n * 파일 목록\n */\n files: LayoutFileItem[];\n\n /**\n * 선택된 파일 ID\n */\n selectedId?: string | number;\n\n /**\n * 파일 선택 시 콜백\n */\n onSelect: (id: string | number) => void;\n\n /**\n * 사용자 정의 클래스\n */\n className?: string;\n}\n\n/**\n * LayoutFileList 레이아웃 파일 목록 컴포넌트\n *\n * 레이아웃 파일 목록을 표시하고 선택 기능을 제공하는 composite 컴포넌트입니다.\n * 선택된 파일은 하이라이트되며, 접근성을 위해 ARIA 속성을 지원합니다.\n *\n * @example\n * // 기본 사용\n * console.log('Selected:', id)}\n * />\n *\n * // 빈 목록\n * {}} />\n */\nexport const LayoutFileList: React.FC = ({\n files,\n selectedId,\n onSelect,\n className = '',\n}) => {\n /**\n * ISO 날짜 문자열을 포맷팅\n */\n const formatDate = (dateString: string): string => {\n try {\n const date = new Date(dateString);\n\n // Invalid Date 체크\n if (isNaN(date.getTime())) {\n return dateString;\n }\n\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n const hours = String(date.getHours()).padStart(2, '0');\n const minutes = String(date.getMinutes()).padStart(2, '0');\n\n return `${year}-${month}-${day} ${hours}:${minutes}`;\n } catch {\n return dateString;\n }\n };\n\n /**\n * 파일 항목 클릭 핸들러\n */\n const handleFileClick = (id: string | number) => {\n onSelect(id);\n };\n\n // 컨테이너 클래스\n const containerClasses = `\n w-full\n ${className}\n `.trim().replace(/\\s+/g, ' ');\n\n return (\n
\n {files.length === 0 ? (\n
\n 파일이 없습니다.\n
\n ) : (\n \n {files.map((file) => {\n const isSelected = file.id === selectedId;\n\n // 항목 클래스 조합\n const itemClasses = `\n flex items-center justify-between p-4 cursor-pointer\n transition-colors duration-150\n ${\n isSelected\n ? 'bg-blue-100 dark:bg-blue-900 border-l-4 border-blue-500'\n : 'hover:bg-gray-100 dark:hover:bg-gray-800'\n }\n `.trim().replace(/\\s+/g, ' ');\n\n // 파일명 클래스\n const nameClasses = `\n font-medium\n ${\n isSelected\n ? 'text-blue-900 dark:text-blue-100'\n : 'text-gray-900 dark:text-gray-100'\n }\n `.trim().replace(/\\s+/g, ' ');\n\n // 날짜 클래스\n const dateClasses = `\n text-sm\n ${\n isSelected\n ? 'text-blue-700 dark:text-blue-300'\n : 'text-gray-500 dark:text-gray-400'\n }\n `.trim().replace(/\\s+/g, ' ');\n\n return (\n handleFileClick(file.id)}\n role=\"option\"\n aria-selected={isSelected}\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleFileClick(file.id);\n }\n }}\n >\n
\n {file.name}\n \n {formatDate(file.updated_at)}\n \n
\n \n );\n })}\n \n )}\n
\n );\n};\n","function _arrayLikeToArray(r, a) {\n (null == a || a > r.length) && (a = r.length);\n for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];\n return n;\n}\nfunction _arrayWithHoles(r) {\n if (Array.isArray(r)) return r;\n}\nfunction _defineProperty(e, r, t) {\n return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: true,\n configurable: true,\n writable: true\n }) : e[r] = t, e;\n}\nfunction _iterableToArrayLimit(r, l) {\n var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n if (null != t) {\n var e,\n n,\n i,\n u,\n a = [],\n f = true,\n o = false;\n try {\n if (i = (t = t.call(r)).next, 0 === l) ; else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);\n } catch (r) {\n o = true, n = r;\n } finally {\n try {\n if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return;\n } finally {\n if (o) throw n;\n }\n }\n return a;\n }\n}\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nfunction ownKeys(e, r) {\n var t = Object.keys(e);\n if (Object.getOwnPropertySymbols) {\n var o = Object.getOwnPropertySymbols(e);\n r && (o = o.filter(function (r) {\n return Object.getOwnPropertyDescriptor(e, r).enumerable;\n })), t.push.apply(t, o);\n }\n return t;\n}\nfunction _objectSpread2(e) {\n for (var r = 1; r < arguments.length; r++) {\n var t = null != arguments[r] ? arguments[r] : {};\n r % 2 ? ownKeys(Object(t), true).forEach(function (r) {\n _defineProperty(e, r, t[r]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {\n Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n });\n }\n return e;\n}\nfunction _objectWithoutProperties(e, t) {\n if (null == e) return {};\n var o,\n r,\n i = _objectWithoutPropertiesLoose(e, t);\n if (Object.getOwnPropertySymbols) {\n var n = Object.getOwnPropertySymbols(e);\n for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]);\n }\n return i;\n}\nfunction _objectWithoutPropertiesLoose(r, e) {\n if (null == r) return {};\n var t = {};\n for (var n in r) if ({}.hasOwnProperty.call(r, n)) {\n if (-1 !== e.indexOf(n)) continue;\n t[n] = r[n];\n }\n return t;\n}\nfunction _slicedToArray(r, e) {\n return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest();\n}\nfunction _toPrimitive(t, r) {\n if (\"object\" != typeof t || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r);\n if (\"object\" != typeof i) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nfunction _toPropertyKey(t) {\n var i = _toPrimitive(t, \"string\");\n return \"symbol\" == typeof i ? i : i + \"\";\n}\nfunction _unsupportedIterableToArray(r, a) {\n if (r) {\n if (\"string\" == typeof r) return _arrayLikeToArray(r, a);\n var t = {}.toString.call(r).slice(8, -1);\n return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0;\n }\n}\n\nexport { _arrayLikeToArray as arrayLikeToArray, _arrayWithHoles as arrayWithHoles, _defineProperty as defineProperty, _iterableToArrayLimit as iterableToArrayLimit, _nonIterableRest as nonIterableRest, _objectSpread2 as objectSpread2, _objectWithoutProperties as objectWithoutProperties, _objectWithoutPropertiesLoose as objectWithoutPropertiesLoose, _slicedToArray as slicedToArray, _toPrimitive as toPrimitive, _toPropertyKey as toPropertyKey, _unsupportedIterableToArray as unsupportedIterableToArray };\n","function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\nfunction compose() {\n for (var _len = arguments.length, fns = new Array(_len), _key = 0; _key < _len; _key++) {\n fns[_key] = arguments[_key];\n }\n\n return function (x) {\n return fns.reduceRight(function (y, f) {\n return f(y);\n }, x);\n };\n}\n\nfunction curry(fn) {\n return function curried() {\n var _this = this;\n\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n return args.length >= fn.length ? fn.apply(this, args) : function () {\n for (var _len3 = arguments.length, nextArgs = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) {\n nextArgs[_key3] = arguments[_key3];\n }\n\n return curried.apply(_this, [].concat(args, nextArgs));\n };\n };\n}\n\nfunction isObject(value) {\n return {}.toString.call(value).includes('Object');\n}\n\nfunction isEmpty(obj) {\n return !Object.keys(obj).length;\n}\n\nfunction isFunction(value) {\n return typeof value === 'function';\n}\n\nfunction hasOwnProperty(object, property) {\n return Object.prototype.hasOwnProperty.call(object, property);\n}\n\nfunction validateChanges(initial, changes) {\n if (!isObject(changes)) errorHandler('changeType');\n if (Object.keys(changes).some(function (field) {\n return !hasOwnProperty(initial, field);\n })) errorHandler('changeField');\n return changes;\n}\n\nfunction validateSelector(selector) {\n if (!isFunction(selector)) errorHandler('selectorType');\n}\n\nfunction validateHandler(handler) {\n if (!(isFunction(handler) || isObject(handler))) errorHandler('handlerType');\n if (isObject(handler) && Object.values(handler).some(function (_handler) {\n return !isFunction(_handler);\n })) errorHandler('handlersType');\n}\n\nfunction validateInitial(initial) {\n if (!initial) errorHandler('initialIsRequired');\n if (!isObject(initial)) errorHandler('initialType');\n if (isEmpty(initial)) errorHandler('initialContent');\n}\n\nfunction throwError(errorMessages, type) {\n throw new Error(errorMessages[type] || errorMessages[\"default\"]);\n}\n\nvar errorMessages = {\n initialIsRequired: 'initial state is required',\n initialType: 'initial state should be an object',\n initialContent: 'initial state shouldn\\'t be an empty object',\n handlerType: 'handler should be an object or a function',\n handlersType: 'all handlers should be a functions',\n selectorType: 'selector should be a function',\n changeType: 'provided value of changes should be an object',\n changeField: 'it seams you want to change a field in the state which is not specified in the \"initial\" state',\n \"default\": 'an unknown error accured in `state-local` package'\n};\nvar errorHandler = curry(throwError)(errorMessages);\nvar validators = {\n changes: validateChanges,\n selector: validateSelector,\n handler: validateHandler,\n initial: validateInitial\n};\n\nfunction create(initial) {\n var handler = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n validators.initial(initial);\n validators.handler(handler);\n var state = {\n current: initial\n };\n var didUpdate = curry(didStateUpdate)(state, handler);\n var update = curry(updateState)(state);\n var validate = curry(validators.changes)(initial);\n var getChanges = curry(extractChanges)(state);\n\n function getState() {\n var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function (state) {\n return state;\n };\n validators.selector(selector);\n return selector(state.current);\n }\n\n function setState(causedChanges) {\n compose(didUpdate, update, validate, getChanges)(causedChanges);\n }\n\n return [getState, setState];\n}\n\nfunction extractChanges(state, causedChanges) {\n return isFunction(causedChanges) ? causedChanges(state.current) : causedChanges;\n}\n\nfunction updateState(state, changes) {\n state.current = _objectSpread2(_objectSpread2({}, state.current), changes);\n return changes;\n}\n\nfunction didStateUpdate(state, handler, changes) {\n isFunction(handler) ? handler(state.current) : Object.keys(changes).forEach(function (field) {\n var _handler$field;\n\n return (_handler$field = handler[field]) === null || _handler$field === void 0 ? void 0 : _handler$field.call(handler, state.current[field]);\n });\n return changes;\n}\n\nvar index = {\n create: create\n};\n\nexport default index;\n","var config = {\n paths: {\n vs: 'https://cdn.jsdelivr.net/npm/monaco-editor@0.54.0/min/vs'\n }\n};\n\nexport { config as default };\n","function curry(fn) {\n return function curried() {\n var _this = this;\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n return args.length >= fn.length ? fn.apply(this, args) : function () {\n for (var _len2 = arguments.length, nextArgs = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n nextArgs[_key2] = arguments[_key2];\n }\n return curried.apply(_this, [].concat(args, nextArgs));\n };\n };\n}\n\nexport { curry as default };\n","function isObject(value) {\n return {}.toString.call(value).includes('Object');\n}\n\nexport { isObject as default };\n","import curry from '../utils/curry.js';\nimport isObject from '../utils/isObject.js';\n\n/**\n * validates the configuration object and informs about deprecation\n * @param {Object} config - the configuration object \n * @return {Object} config - the validated configuration object\n */\nfunction validateConfig(config) {\n if (!config) errorHandler('configIsRequired');\n if (!isObject(config)) errorHandler('configType');\n if (config.urls) {\n informAboutDeprecation();\n return {\n paths: {\n vs: config.urls.monacoBase\n }\n };\n }\n return config;\n}\n\n/**\n * logs deprecation message\n */\nfunction informAboutDeprecation() {\n console.warn(errorMessages.deprecation);\n}\nfunction throwError(errorMessages, type) {\n throw new Error(errorMessages[type] || errorMessages[\"default\"]);\n}\nvar errorMessages = {\n configIsRequired: 'the configuration object is required',\n configType: 'the configuration object should be an object',\n \"default\": 'an unknown error accured in `@monaco-editor/loader` package',\n deprecation: \"Deprecation warning!\\n You are using deprecated way of configuration.\\n\\n Instead of using\\n monaco.config({ urls: { monacoBase: '...' } })\\n use\\n monaco.config({ paths: { vs: '...' } })\\n\\n For more please check the link https://github.com/suren-atoyan/monaco-loader#config\\n \"\n};\nvar errorHandler = curry(throwError)(errorMessages);\nvar validators = {\n config: validateConfig\n};\n\nexport { validators as default, errorHandler, errorMessages };\n","var compose = function compose() {\n for (var _len = arguments.length, fns = new Array(_len), _key = 0; _key < _len; _key++) {\n fns[_key] = arguments[_key];\n }\n return function (x) {\n return fns.reduceRight(function (y, f) {\n return f(y);\n }, x);\n };\n};\n\nexport { compose as default };\n","import { objectSpread2 as _objectSpread2 } from '../_virtual/_rollupPluginBabelHelpers.js';\n\nfunction merge(target, source) {\n Object.keys(source).forEach(function (key) {\n if (source[key] instanceof Object) {\n if (target[key]) {\n Object.assign(source[key], merge(target[key], source[key]));\n }\n }\n });\n return _objectSpread2(_objectSpread2({}, target), source);\n}\n\nexport { merge as default };\n","// The source (has been changed) is https://github.com/facebook/react/issues/5465#issuecomment-157888325\n\nvar CANCELATION_MESSAGE = {\n type: 'cancelation',\n msg: 'operation is manually canceled'\n};\nfunction makeCancelable(promise) {\n var hasCanceled_ = false;\n var wrappedPromise = new Promise(function (resolve, reject) {\n promise.then(function (val) {\n return hasCanceled_ ? reject(CANCELATION_MESSAGE) : resolve(val);\n });\n promise[\"catch\"](reject);\n });\n return wrappedPromise.cancel = function () {\n return hasCanceled_ = true;\n }, wrappedPromise;\n}\n\nexport { CANCELATION_MESSAGE, makeCancelable as default };\n","import { slicedToArray as _slicedToArray, objectWithoutProperties as _objectWithoutProperties } from '../_virtual/_rollupPluginBabelHelpers.js';\nimport state from 'state-local';\nimport config$1 from '../config/index.js';\nimport validators from '../validators/index.js';\nimport compose from '../utils/compose.js';\nimport merge from '../utils/deepMerge.js';\nimport makeCancelable from '../utils/makeCancelable.js';\n\nvar _excluded = [\"monaco\"];\n\n/** the local state of the module */\nvar _state$create = state.create({\n config: config$1,\n isInitialized: false,\n resolve: null,\n reject: null,\n monaco: null\n }),\n _state$create2 = _slicedToArray(_state$create, 2),\n getState = _state$create2[0],\n setState = _state$create2[1];\n\n/**\n * set the loader configuration\n * @param {Object} config - the configuration object\n */\nfunction config(globalConfig) {\n var _validators$config = validators.config(globalConfig),\n monaco = _validators$config.monaco,\n config = _objectWithoutProperties(_validators$config, _excluded);\n setState(function (state) {\n return {\n config: merge(state.config, config),\n monaco: monaco\n };\n });\n}\n\n/**\n * handles the initialization of the monaco-editor\n * @return {Promise} - returns an instance of monaco (with a cancelable promise)\n */\nfunction init() {\n var state = getState(function (_ref) {\n var monaco = _ref.monaco,\n isInitialized = _ref.isInitialized,\n resolve = _ref.resolve;\n return {\n monaco: monaco,\n isInitialized: isInitialized,\n resolve: resolve\n };\n });\n if (!state.isInitialized) {\n setState({\n isInitialized: true\n });\n if (state.monaco) {\n state.resolve(state.monaco);\n return makeCancelable(wrapperPromise);\n }\n if (window.monaco && window.monaco.editor) {\n storeMonacoInstance(window.monaco);\n state.resolve(window.monaco);\n return makeCancelable(wrapperPromise);\n }\n compose(injectScripts, getMonacoLoaderScript)(configureLoader);\n }\n return makeCancelable(wrapperPromise);\n}\n\n/**\n * injects provided scripts into the document.body\n * @param {Object} script - an HTML script element\n * @return {Object} - the injected HTML script element\n */\nfunction injectScripts(script) {\n return document.body.appendChild(script);\n}\n\n/**\n * creates an HTML script element with/without provided src\n * @param {string} [src] - the source path of the script\n * @return {Object} - the created HTML script element\n */\nfunction createScript(src) {\n var script = document.createElement('script');\n return src && (script.src = src), script;\n}\n\n/**\n * creates an HTML script element with the monaco loader src\n * @return {Object} - the created HTML script element\n */\nfunction getMonacoLoaderScript(configureLoader) {\n var state = getState(function (_ref2) {\n var config = _ref2.config,\n reject = _ref2.reject;\n return {\n config: config,\n reject: reject\n };\n });\n var loaderScript = createScript(\"\".concat(state.config.paths.vs, \"/loader.js\"));\n loaderScript.onload = function () {\n return configureLoader();\n };\n loaderScript.onerror = state.reject;\n return loaderScript;\n}\n\n/**\n * configures the monaco loader\n */\nfunction configureLoader() {\n var state = getState(function (_ref3) {\n var config = _ref3.config,\n resolve = _ref3.resolve,\n reject = _ref3.reject;\n return {\n config: config,\n resolve: resolve,\n reject: reject\n };\n });\n var require = window.require;\n require.config(state.config);\n require(['vs/editor/editor.main'], function (_ref4) {\n var monaco = _ref4.m;\n storeMonacoInstance(monaco);\n state.resolve(monaco);\n }, function (error) {\n state.reject(error);\n });\n}\n\n/**\n * store monaco instance in local state\n */\nfunction storeMonacoInstance(monaco) {\n if (!getState().monaco) {\n setState({\n monaco: monaco\n });\n }\n}\n\n/**\n * internal helper function\n * extracts stored monaco instance\n * @return {Object|null} - the monaco instance\n */\nfunction __getMonacoInstance() {\n return getState(function (_ref5) {\n var monaco = _ref5.monaco;\n return monaco;\n });\n}\nvar wrapperPromise = new Promise(function (resolve, reject) {\n return setState({\n resolve: resolve,\n reject: reject\n });\n});\nvar loader = {\n config: config,\n init: init,\n __getMonacoInstance: __getMonacoInstance\n};\n\nexport { loader as default };\n","import _t from\"@monaco-editor/loader\";import{memo as Te}from\"react\";import ke,{useState as re,useRef as S,useCallback as oe,useEffect as ne}from\"react\";import Se from\"@monaco-editor/loader\";import{memo as ye}from\"react\";import K from\"react\";var le={wrapper:{display:\"flex\",position:\"relative\",textAlign:\"initial\"},fullWidth:{width:\"100%\"},hide:{display:\"none\"}},v=le;import me from\"react\";var ae={container:{display:\"flex\",height:\"100%\",width:\"100%\",justifyContent:\"center\",alignItems:\"center\"}},Y=ae;function Me({children:e}){return me.createElement(\"div\",{style:Y.container},e)}var Z=Me;var $=Z;function Ee({width:e,height:r,isEditorReady:n,loading:t,_ref:a,className:m,wrapperProps:E}){return K.createElement(\"section\",{style:{...v.wrapper,width:e,height:r},...E},!n&&K.createElement($,null,t),K.createElement(\"div\",{ref:a,style:{...v.fullWidth,...!n&&v.hide},className:m}))}var ee=Ee;var H=ye(ee);import{useEffect as xe}from\"react\";function Ce(e){xe(e,[])}var k=Ce;import{useEffect as ge,useRef as Re}from\"react\";function he(e,r,n=!0){let t=Re(!0);ge(t.current||!n?()=>{t.current=!1}:e,r)}var l=he;function D(){}function h(e,r,n,t){return De(e,t)||be(e,r,n,t)}function De(e,r){return e.editor.getModel(te(e,r))}function be(e,r,n,t){return e.editor.createModel(r,n,t?te(e,t):void 0)}function te(e,r){return e.Uri.parse(r)}function Oe({original:e,modified:r,language:n,originalLanguage:t,modifiedLanguage:a,originalModelPath:m,modifiedModelPath:E,keepCurrentOriginalModel:g=!1,keepCurrentModifiedModel:N=!1,theme:x=\"light\",loading:P=\"Loading...\",options:y={},height:V=\"100%\",width:z=\"100%\",className:F,wrapperProps:j={},beforeMount:A=D,onMount:q=D}){let[M,O]=re(!1),[T,s]=re(!0),u=S(null),c=S(null),w=S(null),d=S(q),o=S(A),b=S(!1);k(()=>{let i=Se.init();return i.then(f=>(c.current=f)&&s(!1)).catch(f=>f?.type!==\"cancelation\"&&console.error(\"Monaco initialization: error:\",f)),()=>u.current?I():i.cancel()}),l(()=>{if(u.current&&c.current){let i=u.current.getOriginalEditor(),f=h(c.current,e||\"\",t||n||\"text\",m||\"\");f!==i.getModel()&&i.setModel(f)}},[m],M),l(()=>{if(u.current&&c.current){let i=u.current.getModifiedEditor(),f=h(c.current,r||\"\",a||n||\"text\",E||\"\");f!==i.getModel()&&i.setModel(f)}},[E],M),l(()=>{let i=u.current.getModifiedEditor();i.getOption(c.current.editor.EditorOption.readOnly)?i.setValue(r||\"\"):r!==i.getValue()&&(i.executeEdits(\"\",[{range:i.getModel().getFullModelRange(),text:r||\"\",forceMoveMarkers:!0}]),i.pushUndoStop())},[r],M),l(()=>{u.current?.getModel()?.original.setValue(e||\"\")},[e],M),l(()=>{let{original:i,modified:f}=u.current.getModel();c.current.editor.setModelLanguage(i,t||n||\"text\"),c.current.editor.setModelLanguage(f,a||n||\"text\")},[n,t,a],M),l(()=>{c.current?.editor.setTheme(x)},[x],M),l(()=>{u.current?.updateOptions(y)},[y],M);let L=oe(()=>{if(!c.current)return;o.current(c.current);let i=h(c.current,e||\"\",t||n||\"text\",m||\"\"),f=h(c.current,r||\"\",a||n||\"text\",E||\"\");u.current?.setModel({original:i,modified:f})},[n,r,a,e,t,m,E]),U=oe(()=>{!b.current&&w.current&&(u.current=c.current.editor.createDiffEditor(w.current,{automaticLayout:!0,...y}),L(),c.current?.editor.setTheme(x),O(!0),b.current=!0)},[y,x,L]);ne(()=>{M&&d.current(u.current,c.current)},[M]),ne(()=>{!T&&!M&&U()},[T,M,U]);function I(){let i=u.current?.getModel();g||i?.original?.dispose(),N||i?.modified?.dispose(),u.current?.dispose()}return ke.createElement(H,{width:z,height:V,isEditorReady:M,loading:P,_ref:w,className:F,wrapperProps:j})}var ie=Oe;var we=Te(ie);import{useState as Ie}from\"react\";import ce from\"@monaco-editor/loader\";function Pe(){let[e,r]=Ie(ce.__getMonacoInstance());return k(()=>{let n;return e||(n=ce.init(),n.then(t=>{r(t)})),()=>n?.cancel()}),e}var Le=Pe;import{memo as ze}from\"react\";import We,{useState as ue,useEffect as W,useRef as C,useCallback as _e}from\"react\";import Ne from\"@monaco-editor/loader\";import{useEffect as Ue,useRef as ve}from\"react\";function He(e){let r=ve();return Ue(()=>{r.current=e},[e]),r.current}var se=He;var _=new Map;function Ve({defaultValue:e,defaultLanguage:r,defaultPath:n,value:t,language:a,path:m,theme:E=\"light\",line:g,loading:N=\"Loading...\",options:x={},overrideServices:P={},saveViewState:y=!0,keepCurrentModel:V=!1,width:z=\"100%\",height:F=\"100%\",className:j,wrapperProps:A={},beforeMount:q=D,onMount:M=D,onChange:O,onValidate:T=D}){let[s,u]=ue(!1),[c,w]=ue(!0),d=C(null),o=C(null),b=C(null),L=C(M),U=C(q),I=C(),i=C(t),f=se(m),Q=C(!1),B=C(!1);k(()=>{let p=Ne.init();return p.then(R=>(d.current=R)&&w(!1)).catch(R=>R?.type!==\"cancelation\"&&console.error(\"Monaco initialization: error:\",R)),()=>o.current?pe():p.cancel()}),l(()=>{let p=h(d.current,e||t||\"\",r||a||\"\",m||n||\"\");p!==o.current?.getModel()&&(y&&_.set(f,o.current?.saveViewState()),o.current?.setModel(p),y&&o.current?.restoreViewState(_.get(m)))},[m],s),l(()=>{o.current?.updateOptions(x)},[x],s),l(()=>{!o.current||t===void 0||(o.current.getOption(d.current.editor.EditorOption.readOnly)?o.current.setValue(t):t!==o.current.getValue()&&(B.current=!0,o.current.executeEdits(\"\",[{range:o.current.getModel().getFullModelRange(),text:t,forceMoveMarkers:!0}]),o.current.pushUndoStop(),B.current=!1))},[t],s),l(()=>{let p=o.current?.getModel();p&&a&&d.current?.editor.setModelLanguage(p,a)},[a],s),l(()=>{g!==void 0&&o.current?.revealLine(g)},[g],s),l(()=>{d.current?.editor.setTheme(E)},[E],s);let X=_e(()=>{if(!(!b.current||!d.current)&&!Q.current){U.current(d.current);let p=m||n,R=h(d.current,t||e||\"\",r||a||\"\",p||\"\");o.current=d.current?.editor.create(b.current,{model:R,automaticLayout:!0,...x},P),y&&o.current.restoreViewState(_.get(p)),d.current.editor.setTheme(E),g!==void 0&&o.current.revealLine(g),u(!0),Q.current=!0}},[e,r,n,t,a,m,x,P,y,E,g]);W(()=>{s&&L.current(o.current,d.current)},[s]),W(()=>{!c&&!s&&X()},[c,s,X]),i.current=t,W(()=>{s&&O&&(I.current?.dispose(),I.current=o.current?.onDidChangeModelContent(p=>{B.current||O(o.current.getValue(),p)}))},[s,O]),W(()=>{if(s){let p=d.current.editor.onDidChangeMarkers(R=>{let G=o.current.getModel()?.uri;if(G&&R.find(J=>J.path===G.path)){let J=d.current.editor.getModelMarkers({resource:G});T?.(J)}});return()=>{p?.dispose()}}return()=>{}},[s,T]);function pe(){I.current?.dispose(),V?y&&_.set(m,o.current.saveViewState()):o.current.getModel()?.dispose(),o.current.dispose()}return We.createElement(H,{width:z,height:F,isEditorReady:s,loading:N,_ref:b,className:j,wrapperProps:A})}var fe=Ve;var de=ze(fe);var Ft=de;export{we as DiffEditor,de as Editor,Ft as default,_t as loader,Le as useMonaco};\n//# sourceMappingURL=index.mjs.map","import React, { useEffect, useRef } from 'react';\nimport Editor, { Monaco } from '@monaco-editor/react';\nimport * as monaco from 'monaco-editor';\n\nexport interface CodeEditorProps {\n value: string;\n onChange?: (event: { target: { value: string } }) => void;\n language?: string;\n height?: string;\n readOnly?: boolean;\n theme?: 'vs-dark' | 'vs-light';\n}\n\nexport const CodeEditor: React.FC = ({\n value,\n onChange,\n language = 'json',\n height = '100%',\n readOnly = false,\n theme = 'vs-dark',\n}) => {\n const editorRef = useRef(null);\n\n const handleEditorDidMount = (\n editor: monaco.editor.IStandaloneCodeEditor,\n monacoInstance: Monaco\n ) => {\n editorRef.current = editor;\n\n // JSON 스키마 검증 설정\n if (language === 'json') {\n monacoInstance.languages.json.jsonDefaults.setDiagnosticsOptions({\n validate: true,\n schemaValidation: 'error',\n allowComments: false,\n });\n }\n\n // 에디터 옵션 설정\n editor.updateOptions({\n readOnly,\n minimap: { enabled: false },\n scrollBeyondLastLine: false,\n fontSize: 14,\n lineNumbers: 'on',\n renderWhitespace: 'selection',\n automaticLayout: true,\n });\n };\n\n const handleChange = (value: string | undefined) => {\n if (onChange && value !== undefined) {\n // 엔진의 isCustomComponentEvent 경로로 처리되도록 { target: { value } } 패턴 사용\n onChange({ target: { value } });\n }\n };\n\n useEffect(() => {\n if (editorRef.current) {\n editorRef.current.updateOptions({ readOnly });\n }\n }, [readOnly]);\n\n return (\n
\n \n
\n );\n};\n","import React, { useCallback } from 'react';\nimport { Ul } from '../basic/Ul';\nimport { Li } from '../basic/Li';\nimport { Span } from '../basic/Span';\nimport { Div } from '../basic/Div';\n\nexport interface VersionItem {\n id: string | number;\n version: string;\n created_at: string;\n changes_summary: {\n added: number;\n removed: number;\n };\n}\n\nexport interface VersionListProps {\n versions: VersionItem[];\n selectedId?: string | number;\n onSelect?: (id: string | number) => void;\n}\n\nconst formatDate = (dateString: string): string => {\n const date = new Date(dateString);\n return new Intl.DateTimeFormat('ko-KR', {\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n }).format(date);\n};\n\ninterface VersionListItemProps {\n version: VersionItem;\n isSelected: boolean;\n onSelect?: (id: string | number) => void;\n}\n\nconst VersionListItem: React.FC = React.memo(({ version, isSelected, onSelect }) => {\n const handleClick = useCallback(() => {\n onSelect?.(version.id);\n }, [onSelect, version.id]);\n\n return (\n \n
\n
\n \n 버전 {version.version}\n \n \n {formatDate(version.created_at)}\n \n
\n\n
\n \n +{version.changes_summary.added}\n \n \n -{version.changes_summary.removed}\n \n
\n
\n \n );\n});\n\nVersionListItem.displayName = 'VersionListItem';\n\n/**\n * 레이아웃 버전 목록을 표시하는 컴포넌트\n * 각 버전의 변경 요약을 표시하고 선택 기능을 제공합니다.\n */\nexport const VersionList: React.FC = ({\n versions,\n selectedId,\n onSelect,\n}) => {\n if (versions.length === 0) {\n return (\n
\n 버전이 없습니다.\n
\n );\n }\n\n return (\n \n {versions.map((version) => (\n \n ))}\n \n );\n};\n","import React, { useState } from 'react';\nimport { Div } from '../basic/Div';\nimport { Button } from '../basic/Button';\nimport { VersionList, VersionItem } from './VersionList';\n\nexport interface LayoutHistoryPanelProps {\n /** 레이아웃 ID */\n layoutId: string | number;\n /** 버전 목록 */\n versions: VersionItem[];\n /** 버전 복원 콜백 */\n onRestore: (versionId: string | number) => void;\n}\n\n/**\n * 레이아웃 히스토리 패널 컴포넌트\n * 버전 목록을 표시하고 선택된 버전을 복원하는 기능을 제공합니다.\n */\nexport const LayoutHistoryPanel: React.FC = ({\n layoutId: _layoutId,\n versions,\n onRestore,\n}) => {\n const [selectedVersionId, setSelectedVersionId] = useState();\n\n const handleVersionSelect = (versionId: string | number): void => {\n setSelectedVersionId(versionId);\n };\n\n const handleRestore = (): void => {\n if (selectedVersionId !== undefined) {\n onRestore(selectedVersionId);\n }\n };\n\n const isRestoreDisabled = selectedVersionId === undefined;\n\n return (\n \n {/* 버전 목록 */}\n
\n \n
\n\n {/* 복원 버튼 */}\n
\n \n 복원\n \n
\n \n );\n};\n","import React, { useState, type FormEvent } from 'react';\nimport { Div } from '../basic/Div';\nimport { Form } from '../basic/Form';\nimport { Label } from '../basic/Label';\nimport { Input } from '../basic/Input';\nimport { Button } from '../basic/Button';\nimport { A } from '../basic/A';\nimport { P } from '../basic/P';\nimport { Svg } from '../basic/Svg';\n\n/**\n * LoginForm props 인터페이스\n */\nexport interface LoginFormProps {\n /** 이메일 라벨 텍스트 */\n emailLabel?: string;\n /** 비밀번호 라벨 텍스트 */\n passwordLabel?: string;\n /** 로그인 버튼 텍스트 */\n submitButtonText?: string;\n /** 처리 중 텍스트 */\n processingText?: string;\n /** 이메일 입력 필드 placeholder */\n emailPlaceholder?: string;\n /** 비밀번호 입력 필드 placeholder */\n passwordPlaceholder?: string;\n /** 비밀번호 찾기 텍스트 */\n forgotPasswordText?: string;\n /** 비밀번호 찾기 URL */\n forgotPasswordUrl?: string;\n /** 이메일 필수 입력 에러 메시지 */\n emailRequiredError?: string;\n /** 이메일 형식 에러 메시지 */\n emailInvalidError?: string;\n /** 비밀번호 필수 입력 에러 메시지 */\n passwordRequiredError?: string;\n /** 폼 제출 핸들러 */\n onSubmit?: (data: { email: string; password: string }) => void;\n /** 로딩 액션 맵 (ActionDispatcher에서 전달) */\n loadingActions?: Record;\n /** 외부에서 직접 로딩 상태 제어 */\n isLoading?: boolean;\n /** 외부에서 직접 비활성화 상태 제어 */\n disabled?: boolean;\n /** API 에러 메시지 (ActionDispatcher에서 전달) */\n apiError?: string;\n /** 커스텀 className */\n className?: string;\n /** 커스텀 스타일 */\n style?: React.CSSProperties;\n}\n\n/**\n * 에러 상태 인터페이스\n */\ninterface FormErrors {\n email?: string;\n password?: string;\n}\n\n/**\n * LoginForm 집합 컴포넌트\n *\n * 관리자 로그인 폼의 UI 및 상태 관리를 담당합니다.\n * - 이메일/비밀번호 입력 폼\n * - 유효성 검증\n * - 로딩 상태 표시\n * - 다크 모드 지원\n * - Laravel Sanctum API 통신\n */\nexport const LoginForm: React.FC = ({\n emailLabel = 'Email',\n passwordLabel = 'Password',\n submitButtonText = 'Sign In',\n processingText = 'Processing...',\n emailPlaceholder = 'Email',\n passwordPlaceholder = 'Password',\n forgotPasswordText = 'Forgot your password?',\n forgotPasswordUrl = '/admin/password/reset',\n emailRequiredError = 'Please enter your email.',\n emailInvalidError = 'Please enter a valid email address.',\n passwordRequiredError = 'Please enter your password.',\n onSubmit,\n loadingActions = {},\n isLoading: isLoadingProp = false,\n disabled: disabledProp = false,\n apiError: apiErrorProp = '',\n className = '',\n style,\n}) => {\n // 폼 상태 관리\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const [errors, setErrors] = useState({});\n\n // ActionDispatcher에서 전달된 apiError를 사용 (prop이 우선)\n const apiError = apiErrorProp;\n\n // loadingActions로부터 isLoading 계산\n // 외부 isLoading prop 또는 loadingActions 중 하나라도 true이면 로딩 중\n const isLoadingFromActions = Object.values(loadingActions).some((loading) => loading === true);\n const isLoading = isLoadingProp || isLoadingFromActions;\n const isDisabled = disabledProp || isLoading;\n\n /**\n * 유효성 검증\n */\n const validate = (): boolean => {\n const newErrors: FormErrors = {};\n\n // 이메일 검증 (RFC 5322 기반 더 엄격한 정규식)\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n\n if (!email || email.trim() === '') {\n newErrors.email = emailRequiredError;\n } else if (!emailRegex.test(email)) {\n newErrors.email = emailInvalidError;\n }\n\n // 비밀번호 검증\n if (!password || password.trim() === '') {\n newErrors.password = passwordRequiredError;\n }\n\n setErrors(newErrors);\n return Object.keys(newErrors).length === 0;\n };\n\n /**\n * 폼 제출 핸들러 래퍼\n *\n * ActionDispatcher의 핸들러를 실행하기 전에 클라이언트 검증을 수행합니다.\n */\n const handleSubmit = async (e: FormEvent): Promise => {\n // 유효성 검증\n if (!validate()) {\n e.preventDefault();\n return;\n }\n\n // 에러 초기화 (클라이언트 검증 에러만)\n setErrors({});\n\n // ActionDispatcher의 핸들러 실행 (onSubmit prop으로 전달됨)\n if (onSubmit) {\n // onSubmit은 ActionDispatcher.createHandler가 생성한 핸들러\n // 내부적으로 event.preventDefault(), FormData 추출, API 호출을 처리함\n // onError 핸들러에서 setError를 사용하면 apiError prop이 업데이트됨\n await (onSubmit as any)(e);\n } else {\n // onSubmit이 없으면 기본 동작 방지\n e.preventDefault();\n }\n };\n\n return (\n
\n
\n {/* API 에러 메시지 */}\n {apiError && (\n
\n

{apiError}

\n
\n )}\n\n {/* 이메일 입력 필드 */}\n
\n \n {emailLabel}\n \n setEmail(e.target.value)}\n placeholder={emailPlaceholder}\n disabled={isDisabled}\n className={`\n w-full px-4 py-3 rounded-lg border\n ${\n errors.email\n ? 'border-red-500 focus:border-red-500 focus:ring-red-500'\n : 'border-gray-300 dark:border-gray-600 focus:border-blue-500 focus:ring-blue-500'\n }\n bg-white dark:bg-gray-800\n text-gray-900 dark:text-white\n placeholder-gray-400 dark:placeholder-gray-500\n focus:outline-none focus:ring-2\n disabled:opacity-50 disabled:cursor-not-allowed\n transition-colors duration-200\n `}\n />\n {errors.email && (\n

\n {errors.email}\n

\n )}\n
\n\n {/* 비밀번호 입력 필드 */}\n
\n \n {passwordLabel}\n \n setPassword(e.target.value)}\n placeholder={passwordPlaceholder}\n disabled={isDisabled}\n className={`\n w-full px-4 py-3 rounded-lg border\n ${\n errors.password\n ? 'border-red-500 focus:border-red-500 focus:ring-red-500'\n : 'border-gray-300 dark:border-gray-600 focus:border-blue-500 focus:ring-blue-500'\n }\n bg-white dark:bg-gray-800\n text-gray-900 dark:text-white\n placeholder-gray-400 dark:placeholder-gray-500\n focus:outline-none focus:ring-2\n disabled:opacity-50 disabled:cursor-not-allowed\n transition-colors duration-200\n `}\n />\n {errors.password && (\n

\n {errors.password}\n

\n )}\n
\n\n {/* 비밀번호 찾기 링크 */}\n {forgotPasswordUrl && (\n
\n \n {forgotPasswordText}\n \n
\n )}\n\n {/* 제출 버튼 */}\n \n {isLoading ? (\n <>\n \n \n \n \n {processingText}\n \n ) : (\n submitButtonText\n )}\n \n \n
\n );\n};\n","import React, { useState, useEffect, useRef } from 'react';\nimport { Div } from '../basic/Div';\nimport { Button } from '../basic/Button';\nimport { Icon } from '../basic/Icon';\nimport { IconName } from '../basic/IconTypes';\nimport { Span } from '../basic/Span';\nimport type { EditorAttrs } from '../../types';\n\n/**\n * 테마 모드 타입\n */\nexport type ThemeMode = 'auto' | 'light' | 'dark';\n\n/**\n * ThemeToggle Props\n */\nexport interface ThemeToggleProps {\n /** 테마 변경 콜백 */\n onThemeChange?: (theme: ThemeMode) => void;\n /** 추가 CSS 클래스 */\n className?: string;\n /** 자동 모드 텍스트 (다국어 키 사용 권장) */\n autoText?: string;\n /** 라이트 모드 텍스트 (다국어 키 사용 권장) */\n lightText?: string;\n /** 다크 모드 텍스트 (다국어 키 사용 권장) */\n darkText?: string;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * ThemeToggle 컴포넌트\n *\n * 다크/라이트 모드 전환 버튼\n * - 3가지 모드: 자동(시스템 설정 따름), 라이트, 다크\n * - localStorage에 'g7_color_scheme' 키로 저장\n * - 시스템 prefers-color-scheme 감지 지원\n *\n * @example\n * ```json\n * {\n * \"type\": \"composite\",\n * \"name\": \"ThemeToggle\",\n * \"props\": {\n * \"autoText\": \"$t:admin.theme.auto\",\n * \"lightText\": \"$t:admin.theme.light\",\n * \"darkText\": \"$t:admin.theme.dark\"\n * }\n * }\n * ```\n */\n/**\n * 실제 적용될 테마 결정 (auto인 경우 시스템 설정 반영)\n */\nconst getEffectiveTheme = (mode: ThemeMode): 'light' | 'dark' => {\n if (mode === 'auto') {\n return window.matchMedia('(prefers-color-scheme: dark)').matches\n ? 'dark'\n : 'light';\n }\n return mode;\n};\n\n/**\n * 테마 적용\n */\nconst applyTheme = (mode: ThemeMode) => {\n const effectiveTheme = getEffectiveTheme(mode);\n document.documentElement.setAttribute('data-theme', effectiveTheme);\n\n // dark 클래스 토글 (Tailwind CSS dark: 모드 지원)\n if (effectiveTheme === 'dark') {\n document.documentElement.classList.add('dark');\n } else {\n document.documentElement.classList.remove('dark');\n }\n};\n\n/**\n * 초기 테마 로드 및 적용 (즉시 실행)\n */\nconst getInitialTheme = (): ThemeMode => {\n const savedTheme = localStorage.getItem('g7_color_scheme') as ThemeMode | null;\n if (savedTheme && ['auto', 'light', 'dark'].includes(savedTheme)) {\n return savedTheme;\n }\n return 'auto';\n};\n\nexport const ThemeToggle: React.FC = ({\n onThemeChange,\n className = '',\n autoText = 'System',\n lightText = 'Light',\n darkText = 'Dark',\n id,\n editorAttrs,\n}) => {\n // 초기 테마를 즉시 로드하고 적용\n const initialTheme = getInitialTheme();\n const [currentMode, setCurrentMode] = useState(initialTheme);\n const [showMenu, setShowMenu] = useState(false);\n const menuRef = useRef(null);\n\n /**\n * 컴포넌트 마운트 시 즉시 테마 적용\n */\n useEffect(() => {\n applyTheme(currentMode);\n }, []);\n\n /**\n * 시스템 테마 변경 감지\n */\n useEffect(() => {\n if (currentMode !== 'auto') return;\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const handleChange = () => {\n applyTheme('auto');\n };\n\n mediaQuery.addEventListener('change', handleChange);\n return () => mediaQuery.removeEventListener('change', handleChange);\n }, [currentMode]);\n\n /**\n * 외부 클릭 감지\n */\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(event.target as Node)) {\n setShowMenu(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n /**\n * 테마 변경 핸들러\n */\n const handleThemeChange = (mode: ThemeMode) => {\n setCurrentMode(mode);\n localStorage.setItem('g7_color_scheme', mode);\n applyTheme(mode);\n setShowMenu(false);\n onThemeChange?.(mode);\n };\n\n /**\n * 현재 표시할 아이콘 결정\n */\n const getCurrentIcon = (): IconName => {\n const effectiveTheme = getEffectiveTheme(currentMode);\n return effectiveTheme === 'dark' ? IconName.Moon : IconName.Sun;\n };\n\n return (\n
\n {/* 테마 토글 버튼 */}\n setShowMenu(!showMenu)}\n className=\"w-9 h-9 flex items-center justify-center hover:bg-gray-100 dark:hover:bg-gray-800 rounded-full transition-colors\"\n aria-label=\"Toggle theme\"\n >\n \n \n\n {/* 테마 선택 드롭다운 */}\n {showMenu && (\n
\n
\n {/* 자동 모드 */}\n handleThemeChange('auto')}\n className={`\n w-full px-4 py-2 text-left hover:bg-gray-50 dark:hover:bg-gray-700 flex items-center gap-3 transition-colors\n ${currentMode === 'auto' ? 'bg-gray-50 dark:bg-gray-700' : ''}\n `}\n >\n \n {autoText}\n {currentMode === 'auto' && (\n \n )}\n \n\n {/* 라이트 모드 */}\n handleThemeChange('light')}\n className={`\n w-full px-4 py-2 text-left hover:bg-gray-50 dark:hover:bg-gray-700 flex items-center gap-3 transition-colors\n ${currentMode === 'light' ? 'bg-gray-50 dark:bg-gray-700' : ''}\n `}\n >\n \n {lightText}\n {currentMode === 'light' && (\n \n )}\n \n\n {/* 다크 모드 */}\n handleThemeChange('dark')}\n className={`\n w-full px-4 py-2 text-left hover:bg-gray-50 dark:hover:bg-gray-700 flex items-center gap-3 transition-colors\n ${currentMode === 'dark' ? 'bg-gray-50 dark:bg-gray-700' : ''}\n `}\n >\n \n {darkText}\n {currentMode === 'dark' && (\n \n )}\n \n
\n
\n )}\n
\n );\n};\n","import React, { useState, useRef, useEffect, useMemo } from 'react';\nimport { Button } from '../basic/Button';\nimport { Div } from '../basic/Div';\nimport { Span } from '../basic/Span';\nimport { Icon } from '../basic/Icon';\nimport { IconName } from '../basic/IconTypes';\nimport { Checkbox } from '../basic/Checkbox';\nimport type { EditorAttrs } from '../../types';\n\n// Logger 설정 (G7Core 초기화 전에도 동작하도록 폴백 포함)\nconst logger = ((window as any).G7Core?.createLogger?.('Comp:ColumnSelector')) ?? {\n log: (...args: unknown[]) => console.log('[Comp:ColumnSelector]', ...args),\n warn: (...args: unknown[]) => console.warn('[Comp:ColumnSelector]', ...args),\n error: (...args: unknown[]) => console.error('[Comp:ColumnSelector]', ...args),\n};\n\n// G7Core.t() 번역 함수 참조\nconst t = (key: string, params?: Record) =>\n (window as any).G7Core?.t?.(key, params) ?? key;\n\n/**\n * 전역 window 타입 확장\n * 그누보드7 Core의 AuthManager에 접근하기 위한 타입 선언\n */\ndeclare global {\n interface Window {\n G7Core?: {\n AuthManager?: {\n getInstance: () => {\n getUser: () => { uuid: string; [key: string]: any } | null;\n };\n };\n };\n }\n}\n\nexport interface ColumnItem {\n field: string;\n header: string;\n required?: boolean;\n visible?: boolean;\n}\n\n// G7Core 전역 객체의 스타일 헬퍼 접근\nconst G7Core = () => (window as any).G7Core;\n\nexport interface ColumnSelectorProps {\n /** 컴포넌트 고유 ID (레이아웃 JSON의 id 값, localStorage 키 생성에 사용) */\n id?: string;\n columns: ColumnItem[];\n visibleColumns?: string[];\n onColumnVisibilityChange?: (visibleFields: string[]) => void;\n triggerLabel?: string;\n triggerIconName?: IconName;\n position?: 'left' | 'right';\n className?: string;\n style?: React.CSSProperties;\n requiredText?: string;\n /** 드롭다운 메뉴 상단 제목 */\n menuTitle?: string;\n /** 드롭다운 메뉴 상단 설명 */\n menuDescription?: string;\n /** 기본 표시 컬럼 (localStorage에 값이 없을 때 사용) */\n defaultColumns?: string[];\n /** 트리거 버튼에 적용할 추가 className (기존 스타일과 병합됨) */\n triggerClassName?: string;\n /** 라벨 Span에 적용할 추가 className (기존 스타일과 병합됨) */\n labelClassName?: string;\n /**\n * 동적 컬럼 배열 (v1.4.0+)\n *\n * 기존 columns 배열에 동적으로 병합될 컬럼들입니다.\n * dynamicColumnsInsertAfter가 지정된 경우 해당 필드 뒤에 삽입되고,\n * 그렇지 않으면 columns 배열 끝에 추가됩니다.\n */\n dynamicColumns?: ColumnItem[];\n /**\n * 동적 컬럼 삽입 위치를 지정하는 필드명\n * 해당 필드 뒤에 dynamicColumns가 삽입됩니다.\n * 지정하지 않으면 columns 끝에 추가됩니다.\n */\n dynamicColumnsInsertAfter?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * ColumnSelector 집합 컴포넌트\n *\n * 테이블 컬럼의 표시/숨김을 선택할 수 있는 드롭다운 컴포넌트입니다.\n * required 속성이 있는 컬럼은 항상 표시되며 비활성화됩니다.\n *\n * 기본 컴포넌트 조합: Button + Div + Span + Icon + Checkbox\n *\n * @example\n * // 레이아웃 JSON 사용 예시\n * {\n * \"name\": \"ColumnSelector\",\n * \"props\": {\n * \"columns\": [\n * {\"field\": \"id\", \"header\": \"$t:admin.users.columns.id\", \"required\": true},\n * {\"field\": \"name\", \"header\": \"$t:admin.users.columns.name\", \"required\": true},\n * {\"field\": \"email\", \"header\": \"$t:admin.users.columns.email\"},\n * {\"field\": \"status\", \"header\": \"$t:admin.users.columns.status\"}\n * ],\n * \"visibleColumns\": \"{{_local.visibleColumns}}\",\n * \"triggerLabel\": \"$t:common.column_selector\",\n * \"requiredText\": \"$t:common.required\"\n * },\n * \"actions\": [\n * {\n * \"event\": \"onColumnVisibilityChange\",\n * \"type\": \"change\",\n * \"handler\": \"setState\",\n * \"params\": {\n * \"target\": \"local\",\n * \"visibleColumns\": \"{{$args[0]}}\"\n * }\n * }\n * ]\n * }\n */\nexport const ColumnSelector: React.FC = ({\n id,\n columns,\n visibleColumns: externalVisibleColumns,\n onColumnVisibilityChange,\n triggerLabel,\n triggerIconName = IconName.Sliders,\n position = 'right',\n className = '',\n style,\n requiredText,\n menuTitle,\n menuDescription,\n defaultColumns,\n triggerClassName,\n labelClassName,\n dynamicColumns,\n dynamicColumnsInsertAfter,\n editorAttrs,\n}) => {\n // props로 전달된 값이 없으면 다국어 키 사용\n const resolvedTriggerLabel = triggerLabel ?? t('common.column_selector');\n const resolvedRequiredText = requiredText ?? t('common.required');\n\n // 동적 컬럼 병합\n // dynamicColumns가 있으면 columns에 병합하고, dynamicColumnsInsertAfter 위치에 삽입\n const mergedColumns = useMemo(() => {\n if (!dynamicColumns || !Array.isArray(dynamicColumns) || dynamicColumns.length === 0) {\n return columns;\n }\n\n // 삽입 위치 찾기\n if (dynamicColumnsInsertAfter) {\n const insertIndex = columns.findIndex((col) => col.field === dynamicColumnsInsertAfter);\n if (insertIndex !== -1) {\n return [\n ...columns.slice(0, insertIndex + 1),\n ...dynamicColumns,\n ...columns.slice(insertIndex + 1),\n ];\n }\n }\n\n // 삽입 위치가 없으면 끝에 추가\n return [...columns, ...dynamicColumns];\n }, [columns, dynamicColumns, dynamicColumnsInsertAfter]);\n\n const [isOpen, setIsOpen] = useState(false);\n const menuRef = useRef(null);\n const dropdownMenuRef = useRef(null);\n const [isInitialized, setIsInitialized] = useState(false);\n const [adjustedPosition, setAdjustedPosition] = useState<'left' | 'right'>(position);\n\n // 그누보드7 Core의 AuthManager를 통해 현재 로그인한 사용자 ID 가져오기\n // window.G7Core.AuthManager는 런타임에 G7 코어 엔진에서 제공됨\n const userId = useMemo(() => {\n try {\n const authManager = window.G7Core?.AuthManager?.getInstance();\n if (authManager) {\n const user = authManager.getUser();\n return user?.uuid;\n }\n return undefined;\n } catch {\n return undefined;\n }\n }, []);\n\n // localStorage 키 생성 (g7_columns_{id}_{userId} 형식)\n // id가 없으면 저장 기능 비활성화, userId가 없으면 공유 설정\n const storageKey = id\n ? `g7_columns_${id}${userId !== undefined ? `_${userId}` : ''}`\n : null;\n\n // localStorage에서 저장된 컬럼 설정 불러오기\n const getStoredColumns = (): string[] | null => {\n if (!storageKey) return null;\n try {\n const stored = localStorage.getItem(storageKey);\n if (stored) {\n const parsed = JSON.parse(stored);\n if (Array.isArray(parsed) && parsed.length > 0) {\n return parsed;\n }\n }\n } catch (error) {\n logger.warn('Failed to load from localStorage:', error);\n }\n return null;\n };\n\n // localStorage에 컬럼 설정 저장\n const saveToStorage = (cols: string[]) => {\n if (!storageKey) return;\n try {\n localStorage.setItem(storageKey, JSON.stringify(cols));\n } catch (error) {\n logger.warn('Failed to save to localStorage:', error);\n }\n };\n\n // 초기 컬럼 결정 (우선순위: localStorage > externalVisibleColumns > defaultColumns > 모든 컬럼)\n const getInitialColumns = (): string[] => {\n // 1. localStorage에서 불러오기\n const stored = getStoredColumns();\n if (stored) return stored;\n\n // 2. 외부에서 전달된 값\n if (externalVisibleColumns && externalVisibleColumns.length > 0) {\n return externalVisibleColumns;\n }\n\n // 3. 기본 컬럼 설정\n if (defaultColumns && defaultColumns.length > 0) {\n return defaultColumns;\n }\n\n // 4. visible !== false인 모든 컬럼\n return mergedColumns.filter((col) => col.visible !== false).map((col) => col.field);\n };\n\n // 표시할 컬럼 관리\n const [internalVisibleColumns, setInternalVisibleColumns] = useState(getInitialColumns);\n\n // 초기 로드 시 결정된 컬럼으로 부모 상태 동기화\n useEffect(() => {\n if (!isInitialized) {\n // 초기 컬럼 값으로 부모 상태 동기화 (localStorage 값 또는 defaultColumns)\n if (onColumnVisibilityChange && internalVisibleColumns.length > 0) {\n onColumnVisibilityChange(internalVisibleColumns);\n }\n setIsInitialized(true);\n }\n }, [isInitialized, onColumnVisibilityChange, internalVisibleColumns]);\n\n // 외부 visibleColumns가 변경되면 내부 상태 동기화 (단, localStorage 값이 우선)\n useEffect(() => {\n if (isInitialized && externalVisibleColumns && externalVisibleColumns.length > 0) {\n // localStorage에 저장된 값이 없을 때만 외부 값으로 동기화\n const stored = getStoredColumns();\n if (!stored) {\n setInternalVisibleColumns(externalVisibleColumns);\n }\n }\n }, [externalVisibleColumns, isInitialized]);\n\n // 동적 컬럼이 새로 추가될 때만 visibleColumns에 자동 포함\n // localStorage에 저장된 값이 있으면 사용자의 선택을 존중하고 자동 추가하지 않음\n const prevDynamicFieldsRef = useRef([]);\n const hasStoredColumnsRef = useRef(null);\n\n useEffect(() => {\n if (!isInitialized) return; // 초기화 전에는 실행하지 않음\n\n if (dynamicColumns && dynamicColumns.length > 0) {\n const currentDynamicFields = dynamicColumns.map((col) => col.field);\n\n // 최초 실행 시 localStorage 존재 여부 확인 및 prevDynamicFields 초기화\n if (hasStoredColumnsRef.current === null) {\n const stored = getStoredColumns();\n hasStoredColumnsRef.current = stored !== null;\n\n // localStorage에 저장된 값이 있으면 현재 동적 필드를 \"이미 알려진\" 것으로 기록\n // 이렇게 하면 페이지 새로고침 시 동적 컬럼이 다시 자동 추가되지 않음\n if (stored !== null) {\n prevDynamicFieldsRef.current = currentDynamicFields;\n return; // localStorage 값 존중, 자동 추가 안 함\n }\n }\n\n const prevDynamicFields = prevDynamicFieldsRef.current;\n\n // 새로 추가된 동적 필드만 찾기 (기존에 없던 필드)\n const trulyNewFields = currentDynamicFields.filter(\n (field) => !prevDynamicFields.includes(field)\n );\n\n // 새로운 동적 필드가 있을 때만 자동 추가\n if (trulyNewFields.length > 0) {\n const currentVisible = externalVisibleColumns && externalVisibleColumns.length > 0\n ? externalVisibleColumns\n : internalVisibleColumns;\n\n // 현재 visible에 없는 새 필드만 추가\n const fieldsToAdd = trulyNewFields.filter((field) => !currentVisible.includes(field));\n\n if (fieldsToAdd.length > 0) {\n const updatedVisible = [...currentVisible, ...fieldsToAdd];\n setInternalVisibleColumns(updatedVisible);\n saveToStorage(updatedVisible);\n onColumnVisibilityChange?.(updatedVisible);\n }\n }\n\n // 현재 동적 필드 목록 저장\n prevDynamicFieldsRef.current = currentDynamicFields;\n }\n }, [dynamicColumns, isInitialized]); // eslint-disable-line react-hooks/exhaustive-deps\n\n const visibleColumns = externalVisibleColumns && externalVisibleColumns.length > 0\n ? externalVisibleColumns\n : internalVisibleColumns;\n\n // 외부 클릭 감지\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n }\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isOpen]);\n\n // 드롭다운 메뉴가 화면을 벗어나는지 감지하고 위치 조정\n useEffect(() => {\n if (isOpen && dropdownMenuRef.current && menuRef.current) {\n const menuRect = dropdownMenuRef.current.getBoundingClientRect();\n const triggerRect = menuRef.current.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n\n // 메뉴 너비 (w-64 = 16rem = 256px)\n const menuWidth = menuRect.width || 256;\n\n if (position === 'right') {\n // right 위치: 메뉴가 버튼의 오른쪽 끝에서 왼쪽으로 펼쳐짐\n // 메뉴의 왼쪽 끝이 화면 왼쪽을 벗어나는지 확인\n const menuLeft = triggerRect.right - menuWidth;\n if (menuLeft < 0) {\n setAdjustedPosition('left');\n } else {\n setAdjustedPosition('right');\n }\n } else {\n // left 위치: 메뉴가 버튼의 왼쪽 끝에서 오른쪽으로 펼쳐짐\n // 메뉴의 오른쪽 끝이 화면 오른쪽을 벗어나는지 확인\n const menuRight = triggerRect.left + menuWidth;\n if (menuRight > viewportWidth) {\n setAdjustedPosition('right');\n } else {\n setAdjustedPosition('left');\n }\n }\n }\n }, [isOpen, position]);\n\n const handleColumnToggle = (field: string) => {\n const column = mergedColumns.find((col) => col.field === field);\n if (column?.required) return; // required 컬럼은 토글 불가\n\n const newVisibleColumns = visibleColumns.includes(field)\n ? visibleColumns.filter((f) => f !== field)\n : [...visibleColumns, field];\n\n setInternalVisibleColumns(newVisibleColumns);\n saveToStorage(newVisibleColumns);\n onColumnVisibilityChange?.(newVisibleColumns);\n };\n\n const positionClasses = adjustedPosition === 'left' ? 'left-0' : 'right-0';\n\n return (\n \n {/* 트리거 버튼 */}\n setIsOpen(!isOpen)}\n className={G7Core()?.style?.mergeClasses?.(\n 'flex items-center gap-2 px-3 py-2 bg-gray-100 dark:bg-gray-700 text-gray-700 dark:text-gray-300 rounded-lg hover:bg-gray-200 dark:hover:bg-gray-600 transition-colors',\n triggerClassName\n ) ?? `flex items-center gap-2 px-3 py-2 bg-gray-100 dark:bg-gray-700 text-gray-700 dark:text-gray-300 rounded-lg hover:bg-gray-200 dark:hover:bg-gray-600 transition-colors ${triggerClassName ?? ''}`}\n >\n \n {resolvedTriggerLabel && (\n \n {resolvedTriggerLabel}\n \n )}\n \n\n {/* 드롭다운 메뉴 */}\n {isOpen && (\n \n {/* 헤더 영역 */}\n {(menuTitle || menuDescription) && (\n
\n {menuTitle && (\n \n {menuTitle}\n \n )}\n {menuDescription && (\n \n {menuDescription}\n \n )}\n
\n )}\n
\n {mergedColumns.map((col) => {\n const isVisible = visibleColumns.includes(col.field);\n const isRequired = col.required === true;\n\n return (\n !isRequired && handleColumnToggle(col.field)}\n className={`flex items-center gap-2 px-3 py-2 rounded hover:bg-gray-50 dark:hover:bg-gray-700 ${\n isRequired ? 'cursor-default' : 'cursor-pointer'\n }`}\n >\n \n \n {col.header}\n \n {isRequired && resolvedRequiredText && (\n \n {resolvedRequiredText}\n \n )}\n
\n );\n })}\n \n \n )}\n \n );\n};","import React, { useState, useEffect } from 'react';\nimport { Div } from '../basic/Div';\n\n// Logger 설정 (G7Core 초기화 전에도 동작하도록 폴백 포함)\nconst logger = ((window as any).G7Core?.createLogger?.('Comp:PageTransition')) ?? {\n log: (...args: unknown[]) => console.log('[Comp:PageTransition]', ...args),\n warn: (...args: unknown[]) => console.warn('[Comp:PageTransition]', ...args),\n error: (...args: unknown[]) => console.error('[Comp:PageTransition]', ...args),\n};\n\nexport interface PageTransitionIndicatorProps {\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * PageTransitionIndicator 컴포넌트\n *\n * TransitionManager의 isPending 상태를 구독하여 페이지 전환 시\n * 상단에 로딩 바를 표시합니다.\n *\n * @example\n * // 레이아웃 JSON 사용 예시\n * {\n * \"name\": \"PageTransitionIndicator\"\n * }\n */\nexport const PageTransitionIndicator: React.FC = ({\n className = '',\n style,\n}) => {\n const [isPending, setIsPending] = useState(false);\n\n useEffect(() => {\n // G7Core.TransitionManager 접근\n const transitionManager = (window as any).G7Core?.TransitionManager;\n\n if (!transitionManager) {\n logger.warn('TransitionManager를 찾을 수 없습니다.');\n return;\n }\n\n // 구독 및 초기 상태 설정\n setIsPending(transitionManager.getIsPending());\n\n const unsubscribe = transitionManager.subscribe((newIsPending: boolean) => {\n setIsPending(newIsPending);\n });\n\n // 정리 함수\n return unsubscribe;\n }, []);\n\n if (!isPending) {\n return null;\n }\n\n return (\n \n
\n \n
\n\n \n \n );\n};\n","import React from 'react';\n\n/**\n * 페이지 로딩 컴포넌트 Props (엔진에서 전달)\n *\n * @since engine-v1.29.0\n */\nexport interface PageLoadingProps {\n options?: {\n text?: string;\n };\n}\n\nconst t = (key: string, params?: Record) =>\n (window as any).G7Core?.t?.(key, params) ?? key;\n\n/**\n * 어드민 페이지 로딩 인디케이터 컴포넌트\n *\n * `transition_overlay` 의 spinner 스타일에서 사용된다.\n * 엔진은 타겟 요소 내부에 빈 컨테이너만 삽입하며, 포지셔닝/배경/z-index/다크모드\n * 등 모든 비주얼 스타일은 이 컴포넌트가 결정한다. React 트리 외부에 렌더링되므로\n * 인라인 스타일을 사용한다.\n *\n * @since engine-v1.29.0\n */\nconst PageLoading: React.FC = ({ options }) => {\n const isDark = document.documentElement.classList.contains('dark');\n\n const bgColor = isDark ? 'rgb(17,24,39)' : 'rgb(249,250,251)';\n const spinnerColor = isDark ? '#6b7280' : '#9ca3af';\n const textColor = isDark ? '#9ca3af' : '#6b7280';\n\n return (\n \n \n \n {options?.text || t('nav.loading')}\n \n \n );\n};\n\nexport default PageLoading;\n","function _typeof(o) {\n \"@babel/helpers - typeof\";\n\n return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) {\n return typeof o;\n } : function (o) {\n return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o;\n }, _typeof(o);\n}\nexport { _typeof as default };","import _typeof from \"./typeof.js\";\nfunction toPrimitive(t, r) {\n if (\"object\" != _typeof(t) || !t) return t;\n var e = t[Symbol.toPrimitive];\n if (void 0 !== e) {\n var i = e.call(t, r || \"default\");\n if (\"object\" != _typeof(i)) return i;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }\n return (\"string\" === r ? String : Number)(t);\n}\nexport { toPrimitive as default };","import _typeof from \"./typeof.js\";\nimport toPrimitive from \"./toPrimitive.js\";\nfunction toPropertyKey(t) {\n var i = toPrimitive(t, \"string\");\n return \"symbol\" == _typeof(i) ? i : i + \"\";\n}\nexport { toPropertyKey as default };","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperty(e, r, t) {\n return (r = toPropertyKey(r)) in e ? Object.defineProperty(e, r, {\n value: t,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[r] = t, e;\n}\nexport { _defineProperty as default };","import defineProperty from \"./defineProperty.js\";\nfunction ownKeys(e, r) {\n var t = Object.keys(e);\n if (Object.getOwnPropertySymbols) {\n var o = Object.getOwnPropertySymbols(e);\n r && (o = o.filter(function (r) {\n return Object.getOwnPropertyDescriptor(e, r).enumerable;\n })), t.push.apply(t, o);\n }\n return t;\n}\nfunction _objectSpread2(e) {\n for (var r = 1; r < arguments.length; r++) {\n var t = null != arguments[r] ? arguments[r] : {};\n r % 2 ? ownKeys(Object(t), !0).forEach(function (r) {\n defineProperty(e, r, t[r]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) {\n Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r));\n });\n }\n return e;\n}\nexport { _objectSpread2 as default };","function _arrayWithHoles(r) {\n if (Array.isArray(r)) return r;\n}\nexport { _arrayWithHoles as default };","function _iterableToArrayLimit(r, l) {\n var t = null == r ? null : \"undefined\" != typeof Symbol && r[Symbol.iterator] || r[\"@@iterator\"];\n if (null != t) {\n var e,\n n,\n i,\n u,\n a = [],\n f = !0,\n o = !1;\n try {\n if (i = (t = t.call(r)).next, 0 === l) {\n if (Object(t) !== t) return;\n f = !1;\n } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0);\n } catch (r) {\n o = !0, n = r;\n } finally {\n try {\n if (!f && null != t[\"return\"] && (u = t[\"return\"](), Object(u) !== u)) return;\n } finally {\n if (o) throw n;\n }\n }\n return a;\n }\n}\nexport { _iterableToArrayLimit as default };","function _arrayLikeToArray(r, a) {\n (null == a || a > r.length) && (a = r.length);\n for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e];\n return n;\n}\nexport { _arrayLikeToArray as default };","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nfunction _unsupportedIterableToArray(r, a) {\n if (r) {\n if (\"string\" == typeof r) return arrayLikeToArray(r, a);\n var t = {}.toString.call(r).slice(8, -1);\n return \"Object\" === t && r.constructor && (t = r.constructor.name), \"Map\" === t || \"Set\" === t ? Array.from(r) : \"Arguments\" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? arrayLikeToArray(r, a) : void 0;\n }\n}\nexport { _unsupportedIterableToArray as default };","function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nexport { _nonIterableRest as default };","import arrayWithHoles from \"./arrayWithHoles.js\";\nimport iterableToArrayLimit from \"./iterableToArrayLimit.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableRest from \"./nonIterableRest.js\";\nfunction _slicedToArray(r, e) {\n return arrayWithHoles(r) || iterableToArrayLimit(r, e) || unsupportedIterableToArray(r, e) || nonIterableRest();\n}\nexport { _slicedToArray as default };","function _objectWithoutPropertiesLoose(r, e) {\n if (null == r) return {};\n var t = {};\n for (var n in r) if ({}.hasOwnProperty.call(r, n)) {\n if (-1 !== e.indexOf(n)) continue;\n t[n] = r[n];\n }\n return t;\n}\nexport { _objectWithoutPropertiesLoose as default };","import objectWithoutPropertiesLoose from \"./objectWithoutPropertiesLoose.js\";\nfunction _objectWithoutProperties(e, t) {\n if (null == e) return {};\n var o,\n r,\n i = objectWithoutPropertiesLoose(e, t);\n if (Object.getOwnPropertySymbols) {\n var n = Object.getOwnPropertySymbols(e);\n for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]);\n }\n return i;\n}\nexport { _objectWithoutProperties as default };","import _objectSpread from '@babel/runtime/helpers/esm/objectSpread2';\nimport _slicedToArray from '@babel/runtime/helpers/esm/slicedToArray';\nimport _objectWithoutProperties from '@babel/runtime/helpers/esm/objectWithoutProperties';\nimport { useState, useCallback } from 'react';\n\nvar _excluded = [\"defaultInputValue\", \"defaultMenuIsOpen\", \"defaultValue\", \"inputValue\", \"menuIsOpen\", \"onChange\", \"onInputChange\", \"onMenuClose\", \"onMenuOpen\", \"value\"];\nfunction useStateManager(_ref) {\n var _ref$defaultInputValu = _ref.defaultInputValue,\n defaultInputValue = _ref$defaultInputValu === void 0 ? '' : _ref$defaultInputValu,\n _ref$defaultMenuIsOpe = _ref.defaultMenuIsOpen,\n defaultMenuIsOpen = _ref$defaultMenuIsOpe === void 0 ? false : _ref$defaultMenuIsOpe,\n _ref$defaultValue = _ref.defaultValue,\n defaultValue = _ref$defaultValue === void 0 ? null : _ref$defaultValue,\n propsInputValue = _ref.inputValue,\n propsMenuIsOpen = _ref.menuIsOpen,\n propsOnChange = _ref.onChange,\n propsOnInputChange = _ref.onInputChange,\n propsOnMenuClose = _ref.onMenuClose,\n propsOnMenuOpen = _ref.onMenuOpen,\n propsValue = _ref.value,\n restSelectProps = _objectWithoutProperties(_ref, _excluded);\n var _useState = useState(propsInputValue !== undefined ? propsInputValue : defaultInputValue),\n _useState2 = _slicedToArray(_useState, 2),\n stateInputValue = _useState2[0],\n setStateInputValue = _useState2[1];\n var _useState3 = useState(propsMenuIsOpen !== undefined ? propsMenuIsOpen : defaultMenuIsOpen),\n _useState4 = _slicedToArray(_useState3, 2),\n stateMenuIsOpen = _useState4[0],\n setStateMenuIsOpen = _useState4[1];\n var _useState5 = useState(propsValue !== undefined ? propsValue : defaultValue),\n _useState6 = _slicedToArray(_useState5, 2),\n stateValue = _useState6[0],\n setStateValue = _useState6[1];\n var onChange = useCallback(function (value, actionMeta) {\n if (typeof propsOnChange === 'function') {\n propsOnChange(value, actionMeta);\n }\n setStateValue(value);\n }, [propsOnChange]);\n var onInputChange = useCallback(function (value, actionMeta) {\n var newValue;\n if (typeof propsOnInputChange === 'function') {\n newValue = propsOnInputChange(value, actionMeta);\n }\n setStateInputValue(newValue !== undefined ? newValue : value);\n }, [propsOnInputChange]);\n var onMenuOpen = useCallback(function () {\n if (typeof propsOnMenuOpen === 'function') {\n propsOnMenuOpen();\n }\n setStateMenuIsOpen(true);\n }, [propsOnMenuOpen]);\n var onMenuClose = useCallback(function () {\n if (typeof propsOnMenuClose === 'function') {\n propsOnMenuClose();\n }\n setStateMenuIsOpen(false);\n }, [propsOnMenuClose]);\n var inputValue = propsInputValue !== undefined ? propsInputValue : stateInputValue;\n var menuIsOpen = propsMenuIsOpen !== undefined ? propsMenuIsOpen : stateMenuIsOpen;\n var value = propsValue !== undefined ? propsValue : stateValue;\n return _objectSpread(_objectSpread({}, restSelectProps), {}, {\n inputValue: inputValue,\n menuIsOpen: menuIsOpen,\n onChange: onChange,\n onInputChange: onInputChange,\n onMenuClose: onMenuClose,\n onMenuOpen: onMenuOpen,\n value: value\n });\n}\n\nexport { useStateManager as u };\n","function _extends() {\n return _extends = Object.assign ? Object.assign.bind() : function (n) {\n for (var e = 1; e < arguments.length; e++) {\n var t = arguments[e];\n for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]);\n }\n return n;\n }, _extends.apply(null, arguments);\n}\nexport { _extends as default };","function _classCallCheck(a, n) {\n if (!(a instanceof n)) throw new TypeError(\"Cannot call a class as a function\");\n}\nexport { _classCallCheck as default };","import toPropertyKey from \"./toPropertyKey.js\";\nfunction _defineProperties(e, r) {\n for (var t = 0; t < r.length; t++) {\n var o = r[t];\n o.enumerable = o.enumerable || !1, o.configurable = !0, \"value\" in o && (o.writable = !0), Object.defineProperty(e, toPropertyKey(o.key), o);\n }\n}\nfunction _createClass(e, r, t) {\n return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, \"prototype\", {\n writable: !1\n }), e;\n}\nexport { _createClass as default };","function _setPrototypeOf(t, e) {\n return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) {\n return t.__proto__ = e, t;\n }, _setPrototypeOf(t, e);\n}\nexport { _setPrototypeOf as default };","import setPrototypeOf from \"./setPrototypeOf.js\";\nfunction _inherits(t, e) {\n if (\"function\" != typeof e && null !== e) throw new TypeError(\"Super expression must either be null or a function\");\n t.prototype = Object.create(e && e.prototype, {\n constructor: {\n value: t,\n writable: !0,\n configurable: !0\n }\n }), Object.defineProperty(t, \"prototype\", {\n writable: !1\n }), e && setPrototypeOf(t, e);\n}\nexport { _inherits as default };","function _getPrototypeOf(t) {\n return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) {\n return t.__proto__ || Object.getPrototypeOf(t);\n }, _getPrototypeOf(t);\n}\nexport { _getPrototypeOf as default };","function _isNativeReflectConstruct() {\n try {\n var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {}));\n } catch (t) {}\n return (_isNativeReflectConstruct = function _isNativeReflectConstruct() {\n return !!t;\n })();\n}\nexport { _isNativeReflectConstruct as default };","function _assertThisInitialized(e) {\n if (void 0 === e) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n return e;\n}\nexport { _assertThisInitialized as default };","import _typeof from \"./typeof.js\";\nimport assertThisInitialized from \"./assertThisInitialized.js\";\nfunction _possibleConstructorReturn(t, e) {\n if (e && (\"object\" == _typeof(e) || \"function\" == typeof e)) return e;\n if (void 0 !== e) throw new TypeError(\"Derived constructors may only return object or undefined\");\n return assertThisInitialized(t);\n}\nexport { _possibleConstructorReturn as default };","import getPrototypeOf from \"./getPrototypeOf.js\";\nimport isNativeReflectConstruct from \"./isNativeReflectConstruct.js\";\nimport possibleConstructorReturn from \"./possibleConstructorReturn.js\";\nfunction _createSuper(t) {\n var r = isNativeReflectConstruct();\n return function () {\n var e,\n o = getPrototypeOf(t);\n if (r) {\n var s = getPrototypeOf(this).constructor;\n e = Reflect.construct(o, arguments, s);\n } else e = o.apply(this, arguments);\n return possibleConstructorReturn(this, e);\n };\n}\nexport { _createSuper as default };","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nfunction _arrayWithoutHoles(r) {\n if (Array.isArray(r)) return arrayLikeToArray(r);\n}\nexport { _arrayWithoutHoles as default };","function _iterableToArray(r) {\n if (\"undefined\" != typeof Symbol && null != r[Symbol.iterator] || null != r[\"@@iterator\"]) return Array.from(r);\n}\nexport { _iterableToArray as default };","function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nexport { _nonIterableSpread as default };","import arrayWithoutHoles from \"./arrayWithoutHoles.js\";\nimport iterableToArray from \"./iterableToArray.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableSpread from \"./nonIterableSpread.js\";\nfunction _toConsumableArray(r) {\n return arrayWithoutHoles(r) || iterableToArray(r) || unsupportedIterableToArray(r) || nonIterableSpread();\n}\nexport { _toConsumableArray as default };","var isDevelopment = false;\n\n/*\n\nBased off glamor's StyleSheet, thanks Sunil ❤️\n\nhigh performance StyleSheet for css-in-js systems\n\n- uses multiple style tags behind the scenes for millions of rules\n- uses `insertRule` for appending in production for *much* faster performance\n\n// usage\n\nimport { StyleSheet } from '@emotion/sheet'\n\nlet styleSheet = new StyleSheet({ key: '', container: document.head })\n\nstyleSheet.insert('#box { border: 1px solid red; }')\n- appends a css rule into the stylesheet\n\nstyleSheet.flush()\n- empties the stylesheet of all its contents\n\n*/\n\nfunction sheetForTag(tag) {\n if (tag.sheet) {\n return tag.sheet;\n } // this weirdness brought to you by firefox\n\n /* istanbul ignore next */\n\n\n for (var i = 0; i < document.styleSheets.length; i++) {\n if (document.styleSheets[i].ownerNode === tag) {\n return document.styleSheets[i];\n }\n } // this function should always return with a value\n // TS can't understand it though so we make it stop complaining here\n\n\n return undefined;\n}\n\nfunction createStyleElement(options) {\n var tag = document.createElement('style');\n tag.setAttribute('data-emotion', options.key);\n\n if (options.nonce !== undefined) {\n tag.setAttribute('nonce', options.nonce);\n }\n\n tag.appendChild(document.createTextNode(''));\n tag.setAttribute('data-s', '');\n return tag;\n}\n\nvar StyleSheet = /*#__PURE__*/function () {\n // Using Node instead of HTMLElement since container may be a ShadowRoot\n function StyleSheet(options) {\n var _this = this;\n\n this._insertTag = function (tag) {\n var before;\n\n if (_this.tags.length === 0) {\n if (_this.insertionPoint) {\n before = _this.insertionPoint.nextSibling;\n } else if (_this.prepend) {\n before = _this.container.firstChild;\n } else {\n before = _this.before;\n }\n } else {\n before = _this.tags[_this.tags.length - 1].nextSibling;\n }\n\n _this.container.insertBefore(tag, before);\n\n _this.tags.push(tag);\n };\n\n this.isSpeedy = options.speedy === undefined ? !isDevelopment : options.speedy;\n this.tags = [];\n this.ctr = 0;\n this.nonce = options.nonce; // key is the value of the data-emotion attribute, it's used to identify different sheets\n\n this.key = options.key;\n this.container = options.container;\n this.prepend = options.prepend;\n this.insertionPoint = options.insertionPoint;\n this.before = null;\n }\n\n var _proto = StyleSheet.prototype;\n\n _proto.hydrate = function hydrate(nodes) {\n nodes.forEach(this._insertTag);\n };\n\n _proto.insert = function insert(rule) {\n // the max length is how many rules we have per style tag, it's 65000 in speedy mode\n // it's 1 in dev because we insert source maps that map a single rule to a location\n // and you can only have one source map per style tag\n if (this.ctr % (this.isSpeedy ? 65000 : 1) === 0) {\n this._insertTag(createStyleElement(this));\n }\n\n var tag = this.tags[this.tags.length - 1];\n\n if (this.isSpeedy) {\n var sheet = sheetForTag(tag);\n\n try {\n // this is the ultrafast version, works across browsers\n // the big drawback is that the css won't be editable in devtools\n sheet.insertRule(rule, sheet.cssRules.length);\n } catch (e) {\n }\n } else {\n tag.appendChild(document.createTextNode(rule));\n }\n\n this.ctr++;\n };\n\n _proto.flush = function flush() {\n this.tags.forEach(function (tag) {\n var _tag$parentNode;\n\n return (_tag$parentNode = tag.parentNode) == null ? void 0 : _tag$parentNode.removeChild(tag);\n });\n this.tags = [];\n this.ctr = 0;\n };\n\n return StyleSheet;\n}();\n\nexport { StyleSheet };\n","export var MS = '-ms-'\nexport var MOZ = '-moz-'\nexport var WEBKIT = '-webkit-'\n\nexport var COMMENT = 'comm'\nexport var RULESET = 'rule'\nexport var DECLARATION = 'decl'\n\nexport var PAGE = '@page'\nexport var MEDIA = '@media'\nexport var IMPORT = '@import'\nexport var CHARSET = '@charset'\nexport var VIEWPORT = '@viewport'\nexport var SUPPORTS = '@supports'\nexport var DOCUMENT = '@document'\nexport var NAMESPACE = '@namespace'\nexport var KEYFRAMES = '@keyframes'\nexport var FONT_FACE = '@font-face'\nexport var COUNTER_STYLE = '@counter-style'\nexport var FONT_FEATURE_VALUES = '@font-feature-values'\nexport var LAYER = '@layer'\n","/**\n * @param {number}\n * @return {number}\n */\nexport var abs = Math.abs\n\n/**\n * @param {number}\n * @return {string}\n */\nexport var from = String.fromCharCode\n\n/**\n * @param {object}\n * @return {object}\n */\nexport var assign = Object.assign\n\n/**\n * @param {string} value\n * @param {number} length\n * @return {number}\n */\nexport function hash (value, length) {\n\treturn charat(value, 0) ^ 45 ? (((((((length << 2) ^ charat(value, 0)) << 2) ^ charat(value, 1)) << 2) ^ charat(value, 2)) << 2) ^ charat(value, 3) : 0\n}\n\n/**\n * @param {string} value\n * @return {string}\n */\nexport function trim (value) {\n\treturn value.trim()\n}\n\n/**\n * @param {string} value\n * @param {RegExp} pattern\n * @return {string?}\n */\nexport function match (value, pattern) {\n\treturn (value = pattern.exec(value)) ? value[0] : value\n}\n\n/**\n * @param {string} value\n * @param {(string|RegExp)} pattern\n * @param {string} replacement\n * @return {string}\n */\nexport function replace (value, pattern, replacement) {\n\treturn value.replace(pattern, replacement)\n}\n\n/**\n * @param {string} value\n * @param {string} search\n * @return {number}\n */\nexport function indexof (value, search) {\n\treturn value.indexOf(search)\n}\n\n/**\n * @param {string} value\n * @param {number} index\n * @return {number}\n */\nexport function charat (value, index) {\n\treturn value.charCodeAt(index) | 0\n}\n\n/**\n * @param {string} value\n * @param {number} begin\n * @param {number} end\n * @return {string}\n */\nexport function substr (value, begin, end) {\n\treturn value.slice(begin, end)\n}\n\n/**\n * @param {string} value\n * @return {number}\n */\nexport function strlen (value) {\n\treturn value.length\n}\n\n/**\n * @param {any[]} value\n * @return {number}\n */\nexport function sizeof (value) {\n\treturn value.length\n}\n\n/**\n * @param {any} value\n * @param {any[]} array\n * @return {any}\n */\nexport function append (value, array) {\n\treturn array.push(value), value\n}\n\n/**\n * @param {string[]} array\n * @param {function} callback\n * @return {string}\n */\nexport function combine (array, callback) {\n\treturn array.map(callback).join('')\n}\n","import {from, trim, charat, strlen, substr, append, assign} from './Utility.js'\n\nexport var line = 1\nexport var column = 1\nexport var length = 0\nexport var position = 0\nexport var character = 0\nexport var characters = ''\n\n/**\n * @param {string} value\n * @param {object | null} root\n * @param {object | null} parent\n * @param {string} type\n * @param {string[] | string} props\n * @param {object[] | string} children\n * @param {number} length\n */\nexport function node (value, root, parent, type, props, children, length) {\n\treturn {value: value, root: root, parent: parent, type: type, props: props, children: children, line: line, column: column, length: length, return: ''}\n}\n\n/**\n * @param {object} root\n * @param {object} props\n * @return {object}\n */\nexport function copy (root, props) {\n\treturn assign(node('', null, null, '', null, null, 0), root, {length: -root.length}, props)\n}\n\n/**\n * @return {number}\n */\nexport function char () {\n\treturn character\n}\n\n/**\n * @return {number}\n */\nexport function prev () {\n\tcharacter = position > 0 ? charat(characters, --position) : 0\n\n\tif (column--, character === 10)\n\t\tcolumn = 1, line--\n\n\treturn character\n}\n\n/**\n * @return {number}\n */\nexport function next () {\n\tcharacter = position < length ? charat(characters, position++) : 0\n\n\tif (column++, character === 10)\n\t\tcolumn = 1, line++\n\n\treturn character\n}\n\n/**\n * @return {number}\n */\nexport function peek () {\n\treturn charat(characters, position)\n}\n\n/**\n * @return {number}\n */\nexport function caret () {\n\treturn position\n}\n\n/**\n * @param {number} begin\n * @param {number} end\n * @return {string}\n */\nexport function slice (begin, end) {\n\treturn substr(characters, begin, end)\n}\n\n/**\n * @param {number} type\n * @return {number}\n */\nexport function token (type) {\n\tswitch (type) {\n\t\t// \\0 \\t \\n \\r \\s whitespace token\n\t\tcase 0: case 9: case 10: case 13: case 32:\n\t\t\treturn 5\n\t\t// ! + , / > @ ~ isolate token\n\t\tcase 33: case 43: case 44: case 47: case 62: case 64: case 126:\n\t\t// ; { } breakpoint token\n\t\tcase 59: case 123: case 125:\n\t\t\treturn 4\n\t\t// : accompanied token\n\t\tcase 58:\n\t\t\treturn 3\n\t\t// \" ' ( [ opening delimit token\n\t\tcase 34: case 39: case 40: case 91:\n\t\t\treturn 2\n\t\t// ) ] closing delimit token\n\t\tcase 41: case 93:\n\t\t\treturn 1\n\t}\n\n\treturn 0\n}\n\n/**\n * @param {string} value\n * @return {any[]}\n */\nexport function alloc (value) {\n\treturn line = column = 1, length = strlen(characters = value), position = 0, []\n}\n\n/**\n * @param {any} value\n * @return {any}\n */\nexport function dealloc (value) {\n\treturn characters = '', value\n}\n\n/**\n * @param {number} type\n * @return {string}\n */\nexport function delimit (type) {\n\treturn trim(slice(position - 1, delimiter(type === 91 ? type + 2 : type === 40 ? type + 1 : type)))\n}\n\n/**\n * @param {string} value\n * @return {string[]}\n */\nexport function tokenize (value) {\n\treturn dealloc(tokenizer(alloc(value)))\n}\n\n/**\n * @param {number} type\n * @return {string}\n */\nexport function whitespace (type) {\n\twhile (character = peek())\n\t\tif (character < 33)\n\t\t\tnext()\n\t\telse\n\t\t\tbreak\n\n\treturn token(type) > 2 || token(character) > 3 ? '' : ' '\n}\n\n/**\n * @param {string[]} children\n * @return {string[]}\n */\nexport function tokenizer (children) {\n\twhile (next())\n\t\tswitch (token(character)) {\n\t\t\tcase 0: append(identifier(position - 1), children)\n\t\t\t\tbreak\n\t\t\tcase 2: append(delimit(character), children)\n\t\t\t\tbreak\n\t\t\tdefault: append(from(character), children)\n\t\t}\n\n\treturn children\n}\n\n/**\n * @param {number} index\n * @param {number} count\n * @return {string}\n */\nexport function escaping (index, count) {\n\twhile (--count && next())\n\t\t// not 0-9 A-F a-f\n\t\tif (character < 48 || character > 102 || (character > 57 && character < 65) || (character > 70 && character < 97))\n\t\t\tbreak\n\n\treturn slice(index, caret() + (count < 6 && peek() == 32 && next() == 32))\n}\n\n/**\n * @param {number} type\n * @return {number}\n */\nexport function delimiter (type) {\n\twhile (next())\n\t\tswitch (character) {\n\t\t\t// ] ) \" '\n\t\t\tcase type:\n\t\t\t\treturn position\n\t\t\t// \" '\n\t\t\tcase 34: case 39:\n\t\t\t\tif (type !== 34 && type !== 39)\n\t\t\t\t\tdelimiter(character)\n\t\t\t\tbreak\n\t\t\t// (\n\t\t\tcase 40:\n\t\t\t\tif (type === 41)\n\t\t\t\t\tdelimiter(type)\n\t\t\t\tbreak\n\t\t\t// \\\n\t\t\tcase 92:\n\t\t\t\tnext()\n\t\t\t\tbreak\n\t\t}\n\n\treturn position\n}\n\n/**\n * @param {number} type\n * @param {number} index\n * @return {number}\n */\nexport function commenter (type, index) {\n\twhile (next())\n\t\t// //\n\t\tif (type + character === 47 + 10)\n\t\t\tbreak\n\t\t// /*\n\t\telse if (type + character === 42 + 42 && peek() === 47)\n\t\t\tbreak\n\n\treturn '/*' + slice(index, position - 1) + '*' + from(type === 47 ? type : next())\n}\n\n/**\n * @param {number} index\n * @return {string}\n */\nexport function identifier (index) {\n\twhile (!token(peek()))\n\t\tnext()\n\n\treturn slice(index, position)\n}\n","import {COMMENT, RULESET, DECLARATION} from './Enum.js'\nimport {abs, charat, trim, from, sizeof, strlen, substr, append, replace, indexof} from './Utility.js'\nimport {node, char, prev, next, peek, caret, alloc, dealloc, delimit, whitespace, escaping, identifier, commenter} from './Tokenizer.js'\n\n/**\n * @param {string} value\n * @return {object[]}\n */\nexport function compile (value) {\n\treturn dealloc(parse('', null, null, null, [''], value = alloc(value), 0, [0], value))\n}\n\n/**\n * @param {string} value\n * @param {object} root\n * @param {object?} parent\n * @param {string[]} rule\n * @param {string[]} rules\n * @param {string[]} rulesets\n * @param {number[]} pseudo\n * @param {number[]} points\n * @param {string[]} declarations\n * @return {object}\n */\nexport function parse (value, root, parent, rule, rules, rulesets, pseudo, points, declarations) {\n\tvar index = 0\n\tvar offset = 0\n\tvar length = pseudo\n\tvar atrule = 0\n\tvar property = 0\n\tvar previous = 0\n\tvar variable = 1\n\tvar scanning = 1\n\tvar ampersand = 1\n\tvar character = 0\n\tvar type = ''\n\tvar props = rules\n\tvar children = rulesets\n\tvar reference = rule\n\tvar characters = type\n\n\twhile (scanning)\n\t\tswitch (previous = character, character = next()) {\n\t\t\t// (\n\t\t\tcase 40:\n\t\t\t\tif (previous != 108 && charat(characters, length - 1) == 58) {\n\t\t\t\t\tif (indexof(characters += replace(delimit(character), '&', '&\\f'), '&\\f') != -1)\n\t\t\t\t\t\tampersand = -1\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t// \" ' [\n\t\t\tcase 34: case 39: case 91:\n\t\t\t\tcharacters += delimit(character)\n\t\t\t\tbreak\n\t\t\t// \\t \\n \\r \\s\n\t\t\tcase 9: case 10: case 13: case 32:\n\t\t\t\tcharacters += whitespace(previous)\n\t\t\t\tbreak\n\t\t\t// \\\n\t\t\tcase 92:\n\t\t\t\tcharacters += escaping(caret() - 1, 7)\n\t\t\t\tcontinue\n\t\t\t// /\n\t\t\tcase 47:\n\t\t\t\tswitch (peek()) {\n\t\t\t\t\tcase 42: case 47:\n\t\t\t\t\t\tappend(comment(commenter(next(), caret()), root, parent), declarations)\n\t\t\t\t\t\tbreak\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tcharacters += '/'\n\t\t\t\t}\n\t\t\t\tbreak\n\t\t\t// {\n\t\t\tcase 123 * variable:\n\t\t\t\tpoints[index++] = strlen(characters) * ampersand\n\t\t\t// } ; \\0\n\t\t\tcase 125 * variable: case 59: case 0:\n\t\t\t\tswitch (character) {\n\t\t\t\t\t// \\0 }\n\t\t\t\t\tcase 0: case 125: scanning = 0\n\t\t\t\t\t// ;\n\t\t\t\t\tcase 59 + offset: if (ampersand == -1) characters = replace(characters, /\\f/g, '')\n\t\t\t\t\t\tif (property > 0 && (strlen(characters) - length))\n\t\t\t\t\t\t\tappend(property > 32 ? declaration(characters + ';', rule, parent, length - 1) : declaration(replace(characters, ' ', '') + ';', rule, parent, length - 2), declarations)\n\t\t\t\t\t\tbreak\n\t\t\t\t\t// @ ;\n\t\t\t\t\tcase 59: characters += ';'\n\t\t\t\t\t// { rule/at-rule\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tappend(reference = ruleset(characters, root, parent, index, offset, rules, points, type, props = [], children = [], length), rulesets)\n\n\t\t\t\t\t\tif (character === 123)\n\t\t\t\t\t\t\tif (offset === 0)\n\t\t\t\t\t\t\t\tparse(characters, root, reference, reference, props, rulesets, length, points, children)\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tswitch (atrule === 99 && charat(characters, 3) === 110 ? 100 : atrule) {\n\t\t\t\t\t\t\t\t\t// d l m s\n\t\t\t\t\t\t\t\t\tcase 100: case 108: case 109: case 115:\n\t\t\t\t\t\t\t\t\t\tparse(value, reference, reference, rule && append(ruleset(value, reference, reference, 0, 0, rules, points, type, rules, props = [], length), children), rules, children, length, points, rule ? props : children)\n\t\t\t\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\tparse(characters, reference, reference, reference, [''], children, 0, points, children)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tindex = offset = property = 0, variable = ampersand = 1, type = characters = '', length = pseudo\n\t\t\t\tbreak\n\t\t\t// :\n\t\t\tcase 58:\n\t\t\t\tlength = 1 + strlen(characters), property = previous\n\t\t\tdefault:\n\t\t\t\tif (variable < 1)\n\t\t\t\t\tif (character == 123)\n\t\t\t\t\t\t--variable\n\t\t\t\t\telse if (character == 125 && variable++ == 0 && prev() == 125)\n\t\t\t\t\t\tcontinue\n\n\t\t\t\tswitch (characters += from(character), character * variable) {\n\t\t\t\t\t// &\n\t\t\t\t\tcase 38:\n\t\t\t\t\t\tampersand = offset > 0 ? 1 : (characters += '\\f', -1)\n\t\t\t\t\t\tbreak\n\t\t\t\t\t// ,\n\t\t\t\t\tcase 44:\n\t\t\t\t\t\tpoints[index++] = (strlen(characters) - 1) * ampersand, ampersand = 1\n\t\t\t\t\t\tbreak\n\t\t\t\t\t// @\n\t\t\t\t\tcase 64:\n\t\t\t\t\t\t// -\n\t\t\t\t\t\tif (peek() === 45)\n\t\t\t\t\t\t\tcharacters += delimit(next())\n\n\t\t\t\t\t\tatrule = peek(), offset = length = strlen(type = characters += identifier(caret())), character++\n\t\t\t\t\t\tbreak\n\t\t\t\t\t// -\n\t\t\t\t\tcase 45:\n\t\t\t\t\t\tif (previous === 45 && strlen(characters) == 2)\n\t\t\t\t\t\t\tvariable = 0\n\t\t\t\t}\n\t\t}\n\n\treturn rulesets\n}\n\n/**\n * @param {string} value\n * @param {object} root\n * @param {object?} parent\n * @param {number} index\n * @param {number} offset\n * @param {string[]} rules\n * @param {number[]} points\n * @param {string} type\n * @param {string[]} props\n * @param {string[]} children\n * @param {number} length\n * @return {object}\n */\nexport function ruleset (value, root, parent, index, offset, rules, points, type, props, children, length) {\n\tvar post = offset - 1\n\tvar rule = offset === 0 ? rules : ['']\n\tvar size = sizeof(rule)\n\n\tfor (var i = 0, j = 0, k = 0; i < index; ++i)\n\t\tfor (var x = 0, y = substr(value, post + 1, post = abs(j = points[i])), z = value; x < size; ++x)\n\t\t\tif (z = trim(j > 0 ? rule[x] + ' ' + y : replace(y, /&\\f/g, rule[x])))\n\t\t\t\tprops[k++] = z\n\n\treturn node(value, root, parent, offset === 0 ? RULESET : type, props, children, length)\n}\n\n/**\n * @param {number} value\n * @param {object} root\n * @param {object?} parent\n * @return {object}\n */\nexport function comment (value, root, parent) {\n\treturn node(value, root, parent, COMMENT, from(char()), substr(value, 2, -2), 0)\n}\n\n/**\n * @param {string} value\n * @param {object} root\n * @param {object?} parent\n * @param {number} length\n * @return {object}\n */\nexport function declaration (value, root, parent, length) {\n\treturn node(value, root, parent, DECLARATION, substr(value, 0, length), substr(value, length + 1, -1), length)\n}\n","import {IMPORT, LAYER, COMMENT, RULESET, DECLARATION, KEYFRAMES} from './Enum.js'\nimport {strlen, sizeof} from './Utility.js'\n\n/**\n * @param {object[]} children\n * @param {function} callback\n * @return {string}\n */\nexport function serialize (children, callback) {\n\tvar output = ''\n\tvar length = sizeof(children)\n\n\tfor (var i = 0; i < length; i++)\n\t\toutput += callback(children[i], i, children, callback) || ''\n\n\treturn output\n}\n\n/**\n * @param {object} element\n * @param {number} index\n * @param {object[]} children\n * @param {function} callback\n * @return {string}\n */\nexport function stringify (element, index, children, callback) {\n\tswitch (element.type) {\n\t\tcase LAYER: if (element.children.length) break\n\t\tcase IMPORT: case DECLARATION: return element.return = element.return || element.value\n\t\tcase COMMENT: return ''\n\t\tcase KEYFRAMES: return element.return = element.value + '{' + serialize(element.children, callback) + '}'\n\t\tcase RULESET: element.value = element.props.join(',')\n\t}\n\n\treturn strlen(children = serialize(element.children, callback)) ? element.return = element.value + '{' + children + '}' : ''\n}\n","import {MS, MOZ, WEBKIT, RULESET, KEYFRAMES, DECLARATION} from './Enum.js'\nimport {match, charat, substr, strlen, sizeof, replace, combine} from './Utility.js'\nimport {copy, tokenize} from './Tokenizer.js'\nimport {serialize} from './Serializer.js'\nimport {prefix} from './Prefixer.js'\n\n/**\n * @param {function[]} collection\n * @return {function}\n */\nexport function middleware (collection) {\n\tvar length = sizeof(collection)\n\n\treturn function (element, index, children, callback) {\n\t\tvar output = ''\n\n\t\tfor (var i = 0; i < length; i++)\n\t\t\toutput += collection[i](element, index, children, callback) || ''\n\n\t\treturn output\n\t}\n}\n\n/**\n * @param {function} callback\n * @return {function}\n */\nexport function rulesheet (callback) {\n\treturn function (element) {\n\t\tif (!element.root)\n\t\t\tif (element = element.return)\n\t\t\t\tcallback(element)\n\t}\n}\n\n/**\n * @param {object} element\n * @param {number} index\n * @param {object[]} children\n * @param {function} callback\n */\nexport function prefixer (element, index, children, callback) {\n\tif (element.length > -1)\n\t\tif (!element.return)\n\t\t\tswitch (element.type) {\n\t\t\t\tcase DECLARATION: element.return = prefix(element.value, element.length, children)\n\t\t\t\t\treturn\n\t\t\t\tcase KEYFRAMES:\n\t\t\t\t\treturn serialize([copy(element, {value: replace(element.value, '@', '@' + WEBKIT)})], callback)\n\t\t\t\tcase RULESET:\n\t\t\t\t\tif (element.length)\n\t\t\t\t\t\treturn combine(element.props, function (value) {\n\t\t\t\t\t\t\tswitch (match(value, /(::plac\\w+|:read-\\w+)/)) {\n\t\t\t\t\t\t\t\t// :read-(only|write)\n\t\t\t\t\t\t\t\tcase ':read-only': case ':read-write':\n\t\t\t\t\t\t\t\t\treturn serialize([copy(element, {props: [replace(value, /:(read-\\w+)/, ':' + MOZ + '$1')]})], callback)\n\t\t\t\t\t\t\t\t// :placeholder\n\t\t\t\t\t\t\t\tcase '::placeholder':\n\t\t\t\t\t\t\t\t\treturn serialize([\n\t\t\t\t\t\t\t\t\t\tcopy(element, {props: [replace(value, /:(plac\\w+)/, ':' + WEBKIT + 'input-$1')]}),\n\t\t\t\t\t\t\t\t\t\tcopy(element, {props: [replace(value, /:(plac\\w+)/, ':' + MOZ + '$1')]}),\n\t\t\t\t\t\t\t\t\t\tcopy(element, {props: [replace(value, /:(plac\\w+)/, MS + 'input-$1')]})\n\t\t\t\t\t\t\t\t\t], callback)\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn ''\n\t\t\t\t\t\t})\n\t\t\t}\n}\n\n/**\n * @param {object} element\n * @param {number} index\n * @param {object[]} children\n */\nexport function namespace (element) {\n\tswitch (element.type) {\n\t\tcase RULESET:\n\t\t\telement.props = element.props.map(function (value) {\n\t\t\t\treturn combine(tokenize(value), function (value, index, children) {\n\t\t\t\t\tswitch (charat(value, 0)) {\n\t\t\t\t\t\t// \\f\n\t\t\t\t\t\tcase 12:\n\t\t\t\t\t\t\treturn substr(value, 1, strlen(value))\n\t\t\t\t\t\t// \\0 ( + > ~\n\t\t\t\t\t\tcase 0: case 40: case 43: case 62: case 126:\n\t\t\t\t\t\t\treturn value\n\t\t\t\t\t\t// :\n\t\t\t\t\t\tcase 58:\n\t\t\t\t\t\t\tif (children[++index] === 'global')\n\t\t\t\t\t\t\t\tchildren[index] = '', children[++index] = '\\f' + substr(children[index], index = 1, -1)\n\t\t\t\t\t\t// \\s\n\t\t\t\t\t\tcase 32:\n\t\t\t\t\t\t\treturn index === 1 ? '' : value\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tswitch (index) {\n\t\t\t\t\t\t\t\tcase 0: element = value\n\t\t\t\t\t\t\t\t\treturn sizeof(children) > 1 ? '' : value\n\t\t\t\t\t\t\t\tcase index = sizeof(children) - 1: case 2:\n\t\t\t\t\t\t\t\t\treturn index === 2 ? value + element + element : value + element\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\treturn value\n\t\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t})\n\t}\n}\n","function memoize(fn) {\n var cache = Object.create(null);\n return function (arg) {\n if (cache[arg] === undefined) cache[arg] = fn(arg);\n return cache[arg];\n };\n}\n\nexport { memoize as default };\n","import { StyleSheet } from '@emotion/sheet';\nimport { dealloc, alloc, next, token, from, peek, delimit, slice, position, RULESET, combine, match, serialize, copy, replace, WEBKIT, MOZ, MS, KEYFRAMES, DECLARATION, hash, charat, strlen, indexof, stringify, rulesheet, middleware, compile } from 'stylis';\nimport '@emotion/weak-memoize';\nimport '@emotion/memoize';\n\nvar identifierWithPointTracking = function identifierWithPointTracking(begin, points, index) {\n var previous = 0;\n var character = 0;\n\n while (true) {\n previous = character;\n character = peek(); // &\\f\n\n if (previous === 38 && character === 12) {\n points[index] = 1;\n }\n\n if (token(character)) {\n break;\n }\n\n next();\n }\n\n return slice(begin, position);\n};\n\nvar toRules = function toRules(parsed, points) {\n // pretend we've started with a comma\n var index = -1;\n var character = 44;\n\n do {\n switch (token(character)) {\n case 0:\n // &\\f\n if (character === 38 && peek() === 12) {\n // this is not 100% correct, we don't account for literal sequences here - like for example quoted strings\n // stylis inserts \\f after & to know when & where it should replace this sequence with the context selector\n // and when it should just concatenate the outer and inner selectors\n // it's very unlikely for this sequence to actually appear in a different context, so we just leverage this fact here\n points[index] = 1;\n }\n\n parsed[index] += identifierWithPointTracking(position - 1, points, index);\n break;\n\n case 2:\n parsed[index] += delimit(character);\n break;\n\n case 4:\n // comma\n if (character === 44) {\n // colon\n parsed[++index] = peek() === 58 ? '&\\f' : '';\n points[index] = parsed[index].length;\n break;\n }\n\n // fallthrough\n\n default:\n parsed[index] += from(character);\n }\n } while (character = next());\n\n return parsed;\n};\n\nvar getRules = function getRules(value, points) {\n return dealloc(toRules(alloc(value), points));\n}; // WeakSet would be more appropriate, but only WeakMap is supported in IE11\n\n\nvar fixedElements = /* #__PURE__ */new WeakMap();\nvar compat = function compat(element) {\n if (element.type !== 'rule' || !element.parent || // positive .length indicates that this rule contains pseudo\n // negative .length indicates that this rule has been already prefixed\n element.length < 1) {\n return;\n }\n\n var value = element.value;\n var parent = element.parent;\n var isImplicitRule = element.column === parent.column && element.line === parent.line;\n\n while (parent.type !== 'rule') {\n parent = parent.parent;\n if (!parent) return;\n } // short-circuit for the simplest case\n\n\n if (element.props.length === 1 && value.charCodeAt(0) !== 58\n /* colon */\n && !fixedElements.get(parent)) {\n return;\n } // if this is an implicitly inserted rule (the one eagerly inserted at the each new nested level)\n // then the props has already been manipulated beforehand as they that array is shared between it and its \"rule parent\"\n\n\n if (isImplicitRule) {\n return;\n }\n\n fixedElements.set(element, true);\n var points = [];\n var rules = getRules(value, points);\n var parentRules = parent.props;\n\n for (var i = 0, k = 0; i < rules.length; i++) {\n for (var j = 0; j < parentRules.length; j++, k++) {\n element.props[k] = points[i] ? rules[i].replace(/&\\f/g, parentRules[j]) : parentRules[j] + \" \" + rules[i];\n }\n }\n};\nvar removeLabel = function removeLabel(element) {\n if (element.type === 'decl') {\n var value = element.value;\n\n if ( // charcode for l\n value.charCodeAt(0) === 108 && // charcode for b\n value.charCodeAt(2) === 98) {\n // this ignores label\n element[\"return\"] = '';\n element.value = '';\n }\n }\n};\n\n/* eslint-disable no-fallthrough */\n\nfunction prefix(value, length) {\n switch (hash(value, length)) {\n // color-adjust\n case 5103:\n return WEBKIT + 'print-' + value + value;\n // animation, animation-(delay|direction|duration|fill-mode|iteration-count|name|play-state|timing-function)\n\n case 5737:\n case 4201:\n case 3177:\n case 3433:\n case 1641:\n case 4457:\n case 2921: // text-decoration, filter, clip-path, backface-visibility, column, box-decoration-break\n\n case 5572:\n case 6356:\n case 5844:\n case 3191:\n case 6645:\n case 3005: // mask, mask-image, mask-(mode|clip|size), mask-(repeat|origin), mask-position, mask-composite,\n\n case 6391:\n case 5879:\n case 5623:\n case 6135:\n case 4599:\n case 4855: // background-clip, columns, column-(count|fill|gap|rule|rule-color|rule-style|rule-width|span|width)\n\n case 4215:\n case 6389:\n case 5109:\n case 5365:\n case 5621:\n case 3829:\n return WEBKIT + value + value;\n // appearance, user-select, transform, hyphens, text-size-adjust\n\n case 5349:\n case 4246:\n case 4810:\n case 6968:\n case 2756:\n return WEBKIT + value + MOZ + value + MS + value + value;\n // flex, flex-direction\n\n case 6828:\n case 4268:\n return WEBKIT + value + MS + value + value;\n // order\n\n case 6165:\n return WEBKIT + value + MS + 'flex-' + value + value;\n // align-items\n\n case 5187:\n return WEBKIT + value + replace(value, /(\\w+).+(:[^]+)/, WEBKIT + 'box-$1$2' + MS + 'flex-$1$2') + value;\n // align-self\n\n case 5443:\n return WEBKIT + value + MS + 'flex-item-' + replace(value, /flex-|-self/, '') + value;\n // align-content\n\n case 4675:\n return WEBKIT + value + MS + 'flex-line-pack' + replace(value, /align-content|flex-|-self/, '') + value;\n // flex-shrink\n\n case 5548:\n return WEBKIT + value + MS + replace(value, 'shrink', 'negative') + value;\n // flex-basis\n\n case 5292:\n return WEBKIT + value + MS + replace(value, 'basis', 'preferred-size') + value;\n // flex-grow\n\n case 6060:\n return WEBKIT + 'box-' + replace(value, '-grow', '') + WEBKIT + value + MS + replace(value, 'grow', 'positive') + value;\n // transition\n\n case 4554:\n return WEBKIT + replace(value, /([^-])(transform)/g, '$1' + WEBKIT + '$2') + value;\n // cursor\n\n case 6187:\n return replace(replace(replace(value, /(zoom-|grab)/, WEBKIT + '$1'), /(image-set)/, WEBKIT + '$1'), value, '') + value;\n // background, background-image\n\n case 5495:\n case 3959:\n return replace(value, /(image-set\\([^]*)/, WEBKIT + '$1' + '$`$1');\n // justify-content\n\n case 4968:\n return replace(replace(value, /(.+:)(flex-)?(.*)/, WEBKIT + 'box-pack:$3' + MS + 'flex-pack:$3'), /s.+-b[^;]+/, 'justify') + WEBKIT + value + value;\n // (margin|padding)-inline-(start|end)\n\n case 4095:\n case 3583:\n case 4068:\n case 2532:\n return replace(value, /(.+)-inline(.+)/, WEBKIT + '$1$2') + value;\n // (min|max)?(width|height|inline-size|block-size)\n\n case 8116:\n case 7059:\n case 5753:\n case 5535:\n case 5445:\n case 5701:\n case 4933:\n case 4677:\n case 5533:\n case 5789:\n case 5021:\n case 4765:\n // stretch, max-content, min-content, fill-available\n if (strlen(value) - 1 - length > 6) switch (charat(value, length + 1)) {\n // (m)ax-content, (m)in-content\n case 109:\n // -\n if (charat(value, length + 4) !== 45) break;\n // (f)ill-available, (f)it-content\n\n case 102:\n return replace(value, /(.+:)(.+)-([^]+)/, '$1' + WEBKIT + '$2-$3' + '$1' + MOZ + (charat(value, length + 3) == 108 ? '$3' : '$2-$3')) + value;\n // (s)tretch\n\n case 115:\n return ~indexof(value, 'stretch') ? prefix(replace(value, 'stretch', 'fill-available'), length) + value : value;\n }\n break;\n // position: sticky\n\n case 4949:\n // (s)ticky?\n if (charat(value, length + 1) !== 115) break;\n // display: (flex|inline-flex)\n\n case 6444:\n switch (charat(value, strlen(value) - 3 - (~indexof(value, '!important') && 10))) {\n // stic(k)y\n case 107:\n return replace(value, ':', ':' + WEBKIT) + value;\n // (inline-)?fl(e)x\n\n case 101:\n return replace(value, /(.+:)([^;!]+)(;|!.+)?/, '$1' + WEBKIT + (charat(value, 14) === 45 ? 'inline-' : '') + 'box$3' + '$1' + WEBKIT + '$2$3' + '$1' + MS + '$2box$3') + value;\n }\n\n break;\n // writing-mode\n\n case 5936:\n switch (charat(value, length + 11)) {\n // vertical-l(r)\n case 114:\n return WEBKIT + value + MS + replace(value, /[svh]\\w+-[tblr]{2}/, 'tb') + value;\n // vertical-r(l)\n\n case 108:\n return WEBKIT + value + MS + replace(value, /[svh]\\w+-[tblr]{2}/, 'tb-rl') + value;\n // horizontal(-)tb\n\n case 45:\n return WEBKIT + value + MS + replace(value, /[svh]\\w+-[tblr]{2}/, 'lr') + value;\n }\n\n return WEBKIT + value + MS + value + value;\n }\n\n return value;\n}\n\nvar prefixer = function prefixer(element, index, children, callback) {\n if (element.length > -1) if (!element[\"return\"]) switch (element.type) {\n case DECLARATION:\n element[\"return\"] = prefix(element.value, element.length);\n break;\n\n case KEYFRAMES:\n return serialize([copy(element, {\n value: replace(element.value, '@', '@' + WEBKIT)\n })], callback);\n\n case RULESET:\n if (element.length) return combine(element.props, function (value) {\n switch (match(value, /(::plac\\w+|:read-\\w+)/)) {\n // :read-(only|write)\n case ':read-only':\n case ':read-write':\n return serialize([copy(element, {\n props: [replace(value, /:(read-\\w+)/, ':' + MOZ + '$1')]\n })], callback);\n // :placeholder\n\n case '::placeholder':\n return serialize([copy(element, {\n props: [replace(value, /:(plac\\w+)/, ':' + WEBKIT + 'input-$1')]\n }), copy(element, {\n props: [replace(value, /:(plac\\w+)/, ':' + MOZ + '$1')]\n }), copy(element, {\n props: [replace(value, /:(plac\\w+)/, MS + 'input-$1')]\n })], callback);\n }\n\n return '';\n });\n }\n};\n\nvar defaultStylisPlugins = [prefixer];\n\nvar createCache = function createCache(options) {\n var key = options.key;\n\n if (key === 'css') {\n var ssrStyles = document.querySelectorAll(\"style[data-emotion]:not([data-s])\"); // get SSRed styles out of the way of React's hydration\n // document.head is a safe place to move them to(though note document.head is not necessarily the last place they will be)\n // note this very very intentionally targets all style elements regardless of the key to ensure\n // that creating a cache works inside of render of a React component\n\n Array.prototype.forEach.call(ssrStyles, function (node) {\n // we want to only move elements which have a space in the data-emotion attribute value\n // because that indicates that it is an Emotion 11 server-side rendered style elements\n // while we will already ignore Emotion 11 client-side inserted styles because of the :not([data-s]) part in the selector\n // Emotion 10 client-side inserted styles did not have data-s (but importantly did not have a space in their data-emotion attributes)\n // so checking for the space ensures that loading Emotion 11 after Emotion 10 has inserted some styles\n // will not result in the Emotion 10 styles being destroyed\n var dataEmotionAttribute = node.getAttribute('data-emotion');\n\n if (dataEmotionAttribute.indexOf(' ') === -1) {\n return;\n }\n\n document.head.appendChild(node);\n node.setAttribute('data-s', '');\n });\n }\n\n var stylisPlugins = options.stylisPlugins || defaultStylisPlugins;\n\n var inserted = {};\n var container;\n var nodesToHydrate = [];\n\n {\n container = options.container || document.head;\n Array.prototype.forEach.call( // this means we will ignore elements which don't have a space in them which\n // means that the style elements we're looking at are only Emotion 11 server-rendered style elements\n document.querySelectorAll(\"style[data-emotion^=\\\"\" + key + \" \\\"]\"), function (node) {\n var attrib = node.getAttribute(\"data-emotion\").split(' ');\n\n for (var i = 1; i < attrib.length; i++) {\n inserted[attrib[i]] = true;\n }\n\n nodesToHydrate.push(node);\n });\n }\n\n var _insert;\n\n var omnipresentPlugins = [compat, removeLabel];\n\n {\n var currentSheet;\n var finalizingPlugins = [stringify, rulesheet(function (rule) {\n currentSheet.insert(rule);\n })];\n var serializer = middleware(omnipresentPlugins.concat(stylisPlugins, finalizingPlugins));\n\n var stylis = function stylis(styles) {\n return serialize(compile(styles), serializer);\n };\n\n _insert = function insert(selector, serialized, sheet, shouldCache) {\n currentSheet = sheet;\n\n stylis(selector ? selector + \"{\" + serialized.styles + \"}\" : serialized.styles);\n\n if (shouldCache) {\n cache.inserted[serialized.name] = true;\n }\n };\n }\n\n var cache = {\n key: key,\n sheet: new StyleSheet({\n key: key,\n container: container,\n nonce: options.nonce,\n speedy: options.speedy,\n prepend: options.prepend,\n insertionPoint: options.insertionPoint\n }),\n nonce: options.nonce,\n inserted: inserted,\n registered: {},\n insert: _insert\n };\n cache.sheet.hydrate(nodesToHydrate);\n return cache;\n};\n\nexport { createCache as default };\n","/** @license React v16.13.1\n * react-is.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';var b=\"function\"===typeof Symbol&&Symbol.for,c=b?Symbol.for(\"react.element\"):60103,d=b?Symbol.for(\"react.portal\"):60106,e=b?Symbol.for(\"react.fragment\"):60107,f=b?Symbol.for(\"react.strict_mode\"):60108,g=b?Symbol.for(\"react.profiler\"):60114,h=b?Symbol.for(\"react.provider\"):60109,k=b?Symbol.for(\"react.context\"):60110,l=b?Symbol.for(\"react.async_mode\"):60111,m=b?Symbol.for(\"react.concurrent_mode\"):60111,n=b?Symbol.for(\"react.forward_ref\"):60112,p=b?Symbol.for(\"react.suspense\"):60113,q=b?\nSymbol.for(\"react.suspense_list\"):60120,r=b?Symbol.for(\"react.memo\"):60115,t=b?Symbol.for(\"react.lazy\"):60116,v=b?Symbol.for(\"react.block\"):60121,w=b?Symbol.for(\"react.fundamental\"):60117,x=b?Symbol.for(\"react.responder\"):60118,y=b?Symbol.for(\"react.scope\"):60119;\nfunction z(a){if(\"object\"===typeof a&&null!==a){var u=a.$$typeof;switch(u){case c:switch(a=a.type,a){case l:case m:case e:case g:case f:case p:return a;default:switch(a=a&&a.$$typeof,a){case k:case n:case t:case r:case h:return a;default:return u}}case d:return u}}}function A(a){return z(a)===m}exports.AsyncMode=l;exports.ConcurrentMode=m;exports.ContextConsumer=k;exports.ContextProvider=h;exports.Element=c;exports.ForwardRef=n;exports.Fragment=e;exports.Lazy=t;exports.Memo=r;exports.Portal=d;\nexports.Profiler=g;exports.StrictMode=f;exports.Suspense=p;exports.isAsyncMode=function(a){return A(a)||z(a)===l};exports.isConcurrentMode=A;exports.isContextConsumer=function(a){return z(a)===k};exports.isContextProvider=function(a){return z(a)===h};exports.isElement=function(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===c};exports.isForwardRef=function(a){return z(a)===n};exports.isFragment=function(a){return z(a)===e};exports.isLazy=function(a){return z(a)===t};\nexports.isMemo=function(a){return z(a)===r};exports.isPortal=function(a){return z(a)===d};exports.isProfiler=function(a){return z(a)===g};exports.isStrictMode=function(a){return z(a)===f};exports.isSuspense=function(a){return z(a)===p};\nexports.isValidElementType=function(a){return\"string\"===typeof a||\"function\"===typeof a||a===e||a===m||a===g||a===f||a===p||a===q||\"object\"===typeof a&&null!==a&&(a.$$typeof===t||a.$$typeof===r||a.$$typeof===h||a.$$typeof===k||a.$$typeof===n||a.$$typeof===w||a.$$typeof===x||a.$$typeof===y||a.$$typeof===v)};exports.typeOf=z;\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-is.production.min.js');\n} else {\n module.exports = require('./cjs/react-is.development.js');\n}\n","'use strict';\n\nvar reactIs = require('react-is');\n\n/**\n * Copyright 2015, Yahoo! Inc.\n * Copyrights licensed under the New BSD License. See the accompanying LICENSE file for terms.\n */\nvar REACT_STATICS = {\n childContextTypes: true,\n contextType: true,\n contextTypes: true,\n defaultProps: true,\n displayName: true,\n getDefaultProps: true,\n getDerivedStateFromError: true,\n getDerivedStateFromProps: true,\n mixins: true,\n propTypes: true,\n type: true\n};\nvar KNOWN_STATICS = {\n name: true,\n length: true,\n prototype: true,\n caller: true,\n callee: true,\n arguments: true,\n arity: true\n};\nvar FORWARD_REF_STATICS = {\n '$$typeof': true,\n render: true,\n defaultProps: true,\n displayName: true,\n propTypes: true\n};\nvar MEMO_STATICS = {\n '$$typeof': true,\n compare: true,\n defaultProps: true,\n displayName: true,\n propTypes: true,\n type: true\n};\nvar TYPE_STATICS = {};\nTYPE_STATICS[reactIs.ForwardRef] = FORWARD_REF_STATICS;\nTYPE_STATICS[reactIs.Memo] = MEMO_STATICS;\n\nfunction getStatics(component) {\n // React v16.11 and below\n if (reactIs.isMemo(component)) {\n return MEMO_STATICS;\n } // React v16.12 and above\n\n\n return TYPE_STATICS[component['$$typeof']] || REACT_STATICS;\n}\n\nvar defineProperty = Object.defineProperty;\nvar getOwnPropertyNames = Object.getOwnPropertyNames;\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar getPrototypeOf = Object.getPrototypeOf;\nvar objectPrototype = Object.prototype;\nfunction hoistNonReactStatics(targetComponent, sourceComponent, blacklist) {\n if (typeof sourceComponent !== 'string') {\n // don't hoist over string (html) components\n if (objectPrototype) {\n var inheritedComponent = getPrototypeOf(sourceComponent);\n\n if (inheritedComponent && inheritedComponent !== objectPrototype) {\n hoistNonReactStatics(targetComponent, inheritedComponent, blacklist);\n }\n }\n\n var keys = getOwnPropertyNames(sourceComponent);\n\n if (getOwnPropertySymbols) {\n keys = keys.concat(getOwnPropertySymbols(sourceComponent));\n }\n\n var targetStatics = getStatics(targetComponent);\n var sourceStatics = getStatics(sourceComponent);\n\n for (var i = 0; i < keys.length; ++i) {\n var key = keys[i];\n\n if (!KNOWN_STATICS[key] && !(blacklist && blacklist[key]) && !(sourceStatics && sourceStatics[key]) && !(targetStatics && targetStatics[key])) {\n var descriptor = getOwnPropertyDescriptor(sourceComponent, key);\n\n try {\n // Avoid failures from read-only properties\n defineProperty(targetComponent, key, descriptor);\n } catch (e) {}\n }\n }\n }\n\n return targetComponent;\n}\n\nmodule.exports = hoistNonReactStatics;\n","var isBrowser = true;\n\nfunction getRegisteredStyles(registered, registeredStyles, classNames) {\n var rawClassName = '';\n classNames.split(' ').forEach(function (className) {\n if (registered[className] !== undefined) {\n registeredStyles.push(registered[className] + \";\");\n } else if (className) {\n rawClassName += className + \" \";\n }\n });\n return rawClassName;\n}\nvar registerStyles = function registerStyles(cache, serialized, isStringTag) {\n var className = cache.key + \"-\" + serialized.name;\n\n if ( // we only need to add the styles to the registered cache if the\n // class name could be used further down\n // the tree but if it's a string tag, we know it won't\n // so we don't have to add it to registered cache.\n // this improves memory usage since we can avoid storing the whole style string\n (isStringTag === false || // we need to always store it if we're in compat mode and\n // in node since emotion-server relies on whether a style is in\n // the registered cache to know whether a style is global or not\n // also, note that this check will be dead code eliminated in the browser\n isBrowser === false ) && cache.registered[className] === undefined) {\n cache.registered[className] = serialized.styles;\n }\n};\nvar insertStyles = function insertStyles(cache, serialized, isStringTag) {\n registerStyles(cache, serialized, isStringTag);\n var className = cache.key + \"-\" + serialized.name;\n\n if (cache.inserted[serialized.name] === undefined) {\n var current = serialized;\n\n do {\n cache.insert(serialized === current ? \".\" + className : '', current, cache.sheet, true);\n\n current = current.next;\n } while (current !== undefined);\n }\n};\n\nexport { getRegisteredStyles, insertStyles, registerStyles };\n","/* eslint-disable */\n// Inspired by https://github.com/garycourt/murmurhash-js\n// Ported from https://github.com/aappleby/smhasher/blob/61a0530f28277f2e850bfc39600ce61d02b518de/src/MurmurHash2.cpp#L37-L86\nfunction murmur2(str) {\n // 'm' and 'r' are mixing constants generated offline.\n // They're not really 'magic', they just happen to work well.\n // const m = 0x5bd1e995;\n // const r = 24;\n // Initialize the hash\n var h = 0; // Mix 4 bytes at a time into the hash\n\n var k,\n i = 0,\n len = str.length;\n\n for (; len >= 4; ++i, len -= 4) {\n k = str.charCodeAt(i) & 0xff | (str.charCodeAt(++i) & 0xff) << 8 | (str.charCodeAt(++i) & 0xff) << 16 | (str.charCodeAt(++i) & 0xff) << 24;\n k =\n /* Math.imul(k, m): */\n (k & 0xffff) * 0x5bd1e995 + ((k >>> 16) * 0xe995 << 16);\n k ^=\n /* k >>> r: */\n k >>> 24;\n h =\n /* Math.imul(k, m): */\n (k & 0xffff) * 0x5bd1e995 + ((k >>> 16) * 0xe995 << 16) ^\n /* Math.imul(h, m): */\n (h & 0xffff) * 0x5bd1e995 + ((h >>> 16) * 0xe995 << 16);\n } // Handle the last few bytes of the input array\n\n\n switch (len) {\n case 3:\n h ^= (str.charCodeAt(i + 2) & 0xff) << 16;\n\n case 2:\n h ^= (str.charCodeAt(i + 1) & 0xff) << 8;\n\n case 1:\n h ^= str.charCodeAt(i) & 0xff;\n h =\n /* Math.imul(h, m): */\n (h & 0xffff) * 0x5bd1e995 + ((h >>> 16) * 0xe995 << 16);\n } // Do a few final mixes of the hash to ensure the last few\n // bytes are well-incorporated.\n\n\n h ^= h >>> 13;\n h =\n /* Math.imul(h, m): */\n (h & 0xffff) * 0x5bd1e995 + ((h >>> 16) * 0xe995 << 16);\n return ((h ^ h >>> 15) >>> 0).toString(36);\n}\n\nexport { murmur2 as default };\n","var unitlessKeys = {\n animationIterationCount: 1,\n aspectRatio: 1,\n borderImageOutset: 1,\n borderImageSlice: 1,\n borderImageWidth: 1,\n boxFlex: 1,\n boxFlexGroup: 1,\n boxOrdinalGroup: 1,\n columnCount: 1,\n columns: 1,\n flex: 1,\n flexGrow: 1,\n flexPositive: 1,\n flexShrink: 1,\n flexNegative: 1,\n flexOrder: 1,\n gridRow: 1,\n gridRowEnd: 1,\n gridRowSpan: 1,\n gridRowStart: 1,\n gridColumn: 1,\n gridColumnEnd: 1,\n gridColumnSpan: 1,\n gridColumnStart: 1,\n msGridRow: 1,\n msGridRowSpan: 1,\n msGridColumn: 1,\n msGridColumnSpan: 1,\n fontWeight: 1,\n lineHeight: 1,\n opacity: 1,\n order: 1,\n orphans: 1,\n scale: 1,\n tabSize: 1,\n widows: 1,\n zIndex: 1,\n zoom: 1,\n WebkitLineClamp: 1,\n // SVG-related properties\n fillOpacity: 1,\n floodOpacity: 1,\n stopOpacity: 1,\n strokeDasharray: 1,\n strokeDashoffset: 1,\n strokeMiterlimit: 1,\n strokeOpacity: 1,\n strokeWidth: 1\n};\n\nexport { unitlessKeys as default };\n","import hashString from '@emotion/hash';\nimport unitless from '@emotion/unitless';\nimport memoize from '@emotion/memoize';\n\nvar isDevelopment = false;\n\nvar hyphenateRegex = /[A-Z]|^ms/g;\nvar animationRegex = /_EMO_([^_]+?)_([^]*?)_EMO_/g;\n\nvar isCustomProperty = function isCustomProperty(property) {\n return property.charCodeAt(1) === 45;\n};\n\nvar isProcessableValue = function isProcessableValue(value) {\n return value != null && typeof value !== 'boolean';\n};\n\nvar processStyleName = /* #__PURE__ */memoize(function (styleName) {\n return isCustomProperty(styleName) ? styleName : styleName.replace(hyphenateRegex, '-$&').toLowerCase();\n});\n\nvar processStyleValue = function processStyleValue(key, value) {\n switch (key) {\n case 'animation':\n case 'animationName':\n {\n if (typeof value === 'string') {\n return value.replace(animationRegex, function (match, p1, p2) {\n cursor = {\n name: p1,\n styles: p2,\n next: cursor\n };\n return p1;\n });\n }\n }\n }\n\n if (unitless[key] !== 1 && !isCustomProperty(key) && typeof value === 'number' && value !== 0) {\n return value + 'px';\n }\n\n return value;\n};\n\nvar noComponentSelectorMessage = 'Component selectors can only be used in conjunction with ' + '@emotion/babel-plugin, the swc Emotion plugin, or another Emotion-aware ' + 'compiler transform.';\n\nfunction handleInterpolation(mergedProps, registered, interpolation) {\n if (interpolation == null) {\n return '';\n }\n\n var componentSelector = interpolation;\n\n if (componentSelector.__emotion_styles !== undefined) {\n\n return componentSelector;\n }\n\n switch (typeof interpolation) {\n case 'boolean':\n {\n return '';\n }\n\n case 'object':\n {\n var keyframes = interpolation;\n\n if (keyframes.anim === 1) {\n cursor = {\n name: keyframes.name,\n styles: keyframes.styles,\n next: cursor\n };\n return keyframes.name;\n }\n\n var serializedStyles = interpolation;\n\n if (serializedStyles.styles !== undefined) {\n var next = serializedStyles.next;\n\n if (next !== undefined) {\n // not the most efficient thing ever but this is a pretty rare case\n // and there will be very few iterations of this generally\n while (next !== undefined) {\n cursor = {\n name: next.name,\n styles: next.styles,\n next: cursor\n };\n next = next.next;\n }\n }\n\n var styles = serializedStyles.styles + \";\";\n return styles;\n }\n\n return createStringFromObject(mergedProps, registered, interpolation);\n }\n\n case 'function':\n {\n if (mergedProps !== undefined) {\n var previousCursor = cursor;\n var result = interpolation(mergedProps);\n cursor = previousCursor;\n return handleInterpolation(mergedProps, registered, result);\n }\n\n break;\n }\n } // finalize string values (regular strings and functions interpolated into css calls)\n\n\n var asString = interpolation;\n\n if (registered == null) {\n return asString;\n }\n\n var cached = registered[asString];\n return cached !== undefined ? cached : asString;\n}\n\nfunction createStringFromObject(mergedProps, registered, obj) {\n var string = '';\n\n if (Array.isArray(obj)) {\n for (var i = 0; i < obj.length; i++) {\n string += handleInterpolation(mergedProps, registered, obj[i]) + \";\";\n }\n } else {\n for (var key in obj) {\n var value = obj[key];\n\n if (typeof value !== 'object') {\n var asString = value;\n\n if (registered != null && registered[asString] !== undefined) {\n string += key + \"{\" + registered[asString] + \"}\";\n } else if (isProcessableValue(asString)) {\n string += processStyleName(key) + \":\" + processStyleValue(key, asString) + \";\";\n }\n } else {\n if (key === 'NO_COMPONENT_SELECTOR' && isDevelopment) {\n throw new Error(noComponentSelectorMessage);\n }\n\n if (Array.isArray(value) && typeof value[0] === 'string' && (registered == null || registered[value[0]] === undefined)) {\n for (var _i = 0; _i < value.length; _i++) {\n if (isProcessableValue(value[_i])) {\n string += processStyleName(key) + \":\" + processStyleValue(key, value[_i]) + \";\";\n }\n }\n } else {\n var interpolated = handleInterpolation(mergedProps, registered, value);\n\n switch (key) {\n case 'animation':\n case 'animationName':\n {\n string += processStyleName(key) + \":\" + interpolated + \";\";\n break;\n }\n\n default:\n {\n\n string += key + \"{\" + interpolated + \"}\";\n }\n }\n }\n }\n }\n }\n\n return string;\n}\n\nvar labelPattern = /label:\\s*([^\\s;{]+)\\s*(;|$)/g; // this is the cursor for keyframes\n// keyframes are stored on the SerializedStyles object as a linked list\n\nvar cursor;\nfunction serializeStyles(args, registered, mergedProps) {\n if (args.length === 1 && typeof args[0] === 'object' && args[0] !== null && args[0].styles !== undefined) {\n return args[0];\n }\n\n var stringMode = true;\n var styles = '';\n cursor = undefined;\n var strings = args[0];\n\n if (strings == null || strings.raw === undefined) {\n stringMode = false;\n styles += handleInterpolation(mergedProps, registered, strings);\n } else {\n var asTemplateStringsArr = strings;\n\n styles += asTemplateStringsArr[0];\n } // we start at 1 since we've already handled the first arg\n\n\n for (var i = 1; i < args.length; i++) {\n styles += handleInterpolation(mergedProps, registered, args[i]);\n\n if (stringMode) {\n var templateStringsArr = strings;\n\n styles += templateStringsArr[i];\n }\n } // using a global regex with .exec is stateful so lastIndex has to be reset each time\n\n\n labelPattern.lastIndex = 0;\n var identifierName = '';\n var match; // https://esbench.com/bench/5b809c2cf2949800a0f61fb5\n\n while ((match = labelPattern.exec(styles)) !== null) {\n identifierName += '-' + match[1];\n }\n\n var name = hashString(styles) + identifierName;\n\n return {\n name: name,\n styles: styles,\n next: cursor\n };\n}\n\nexport { serializeStyles };\n","import * as React from 'react';\n\nvar syncFallback = function syncFallback(create) {\n return create();\n};\n\nvar useInsertionEffect = React['useInsertion' + 'Effect'] ? React['useInsertion' + 'Effect'] : false;\nvar useInsertionEffectAlwaysWithSyncFallback = useInsertionEffect || syncFallback;\nvar useInsertionEffectWithLayoutFallback = useInsertionEffect || React.useLayoutEffect;\n\nexport { useInsertionEffectAlwaysWithSyncFallback, useInsertionEffectWithLayoutFallback };\n","import * as React from 'react';\nimport { useContext, forwardRef } from 'react';\nimport createCache from '@emotion/cache';\nimport _extends from '@babel/runtime/helpers/esm/extends';\nimport weakMemoize from '@emotion/weak-memoize';\nimport hoistNonReactStatics from '../_isolated-hnrs/dist/emotion-react-_isolated-hnrs.browser.esm.js';\nimport { getRegisteredStyles, registerStyles, insertStyles } from '@emotion/utils';\nimport { serializeStyles } from '@emotion/serialize';\nimport { useInsertionEffectAlwaysWithSyncFallback } from '@emotion/use-insertion-effect-with-fallbacks';\n\nvar isDevelopment = false;\n\nvar EmotionCacheContext = /* #__PURE__ */React.createContext( // we're doing this to avoid preconstruct's dead code elimination in this one case\n// because this module is primarily intended for the browser and node\n// but it's also required in react native and similar environments sometimes\n// and we could have a special build just for that\n// but this is much easier and the native packages\n// might use a different theme context in the future anyway\ntypeof HTMLElement !== 'undefined' ? /* #__PURE__ */createCache({\n key: 'css'\n}) : null);\n\nvar CacheProvider = EmotionCacheContext.Provider;\nvar __unsafe_useEmotionCache = function useEmotionCache() {\n return useContext(EmotionCacheContext);\n};\n\nvar withEmotionCache = function withEmotionCache(func) {\n return /*#__PURE__*/forwardRef(function (props, ref) {\n // the cache will never be null in the browser\n var cache = useContext(EmotionCacheContext);\n return func(props, cache, ref);\n });\n};\n\nvar ThemeContext = /* #__PURE__ */React.createContext({});\n\nvar useTheme = function useTheme() {\n return React.useContext(ThemeContext);\n};\n\nvar getTheme = function getTheme(outerTheme, theme) {\n if (typeof theme === 'function') {\n var mergedTheme = theme(outerTheme);\n\n return mergedTheme;\n }\n\n return _extends({}, outerTheme, theme);\n};\n\nvar createCacheWithTheme = /* #__PURE__ */weakMemoize(function (outerTheme) {\n return weakMemoize(function (theme) {\n return getTheme(outerTheme, theme);\n });\n});\nvar ThemeProvider = function ThemeProvider(props) {\n var theme = React.useContext(ThemeContext);\n\n if (props.theme !== theme) {\n theme = createCacheWithTheme(theme)(props.theme);\n }\n\n return /*#__PURE__*/React.createElement(ThemeContext.Provider, {\n value: theme\n }, props.children);\n};\nfunction withTheme(Component) {\n var componentName = Component.displayName || Component.name || 'Component';\n var WithTheme = /*#__PURE__*/React.forwardRef(function render(props, ref) {\n var theme = React.useContext(ThemeContext);\n return /*#__PURE__*/React.createElement(Component, _extends({\n theme: theme,\n ref: ref\n }, props));\n });\n WithTheme.displayName = \"WithTheme(\" + componentName + \")\";\n return hoistNonReactStatics(WithTheme, Component);\n}\n\nvar hasOwn = {}.hasOwnProperty;\n\nvar typePropName = '__EMOTION_TYPE_PLEASE_DO_NOT_USE__';\nvar createEmotionProps = function createEmotionProps(type, props) {\n\n var newProps = {};\n\n for (var _key in props) {\n if (hasOwn.call(props, _key)) {\n newProps[_key] = props[_key];\n }\n }\n\n newProps[typePropName] = type; // Runtime labeling is an opt-in feature because:\n\n return newProps;\n};\n\nvar Insertion = function Insertion(_ref) {\n var cache = _ref.cache,\n serialized = _ref.serialized,\n isStringTag = _ref.isStringTag;\n registerStyles(cache, serialized, isStringTag);\n useInsertionEffectAlwaysWithSyncFallback(function () {\n return insertStyles(cache, serialized, isStringTag);\n });\n\n return null;\n};\n\nvar Emotion = /* #__PURE__ */withEmotionCache(function (props, cache, ref) {\n var cssProp = props.css; // so that using `css` from `emotion` and passing the result to the css prop works\n // not passing the registered cache to serializeStyles because it would\n // make certain babel optimisations not possible\n\n if (typeof cssProp === 'string' && cache.registered[cssProp] !== undefined) {\n cssProp = cache.registered[cssProp];\n }\n\n var WrappedComponent = props[typePropName];\n var registeredStyles = [cssProp];\n var className = '';\n\n if (typeof props.className === 'string') {\n className = getRegisteredStyles(cache.registered, registeredStyles, props.className);\n } else if (props.className != null) {\n className = props.className + \" \";\n }\n\n var serialized = serializeStyles(registeredStyles, undefined, React.useContext(ThemeContext));\n\n className += cache.key + \"-\" + serialized.name;\n var newProps = {};\n\n for (var _key2 in props) {\n if (hasOwn.call(props, _key2) && _key2 !== 'css' && _key2 !== typePropName && (!isDevelopment )) {\n newProps[_key2] = props[_key2];\n }\n }\n\n newProps.className = className;\n\n if (ref) {\n newProps.ref = ref;\n }\n\n return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Insertion, {\n cache: cache,\n serialized: serialized,\n isStringTag: typeof WrappedComponent === 'string'\n }), /*#__PURE__*/React.createElement(WrappedComponent, newProps));\n});\n\nvar Emotion$1 = Emotion;\n\nexport { CacheProvider as C, Emotion$1 as E, ThemeContext as T, __unsafe_useEmotionCache as _, ThemeProvider as a, withTheme as b, createEmotionProps as c, hasOwn as h, isDevelopment as i, useTheme as u, withEmotionCache as w };\n","import { h as hasOwn, E as Emotion, c as createEmotionProps, w as withEmotionCache, T as ThemeContext, i as isDevelopment } from './emotion-element-f0de968e.browser.esm.js';\nexport { C as CacheProvider, T as ThemeContext, a as ThemeProvider, _ as __unsafe_useEmotionCache, u as useTheme, w as withEmotionCache, b as withTheme } from './emotion-element-f0de968e.browser.esm.js';\nimport * as React from 'react';\nimport { insertStyles, registerStyles, getRegisteredStyles } from '@emotion/utils';\nimport { useInsertionEffectWithLayoutFallback, useInsertionEffectAlwaysWithSyncFallback } from '@emotion/use-insertion-effect-with-fallbacks';\nimport { serializeStyles } from '@emotion/serialize';\nimport '@emotion/cache';\nimport '@babel/runtime/helpers/extends';\nimport '@emotion/weak-memoize';\nimport '../_isolated-hnrs/dist/emotion-react-_isolated-hnrs.browser.esm.js';\nimport 'hoist-non-react-statics';\n\nvar jsx = function jsx(type, props) {\n // eslint-disable-next-line prefer-rest-params\n var args = arguments;\n\n if (props == null || !hasOwn.call(props, 'css')) {\n return React.createElement.apply(undefined, args);\n }\n\n var argsLength = args.length;\n var createElementArgArray = new Array(argsLength);\n createElementArgArray[0] = Emotion;\n createElementArgArray[1] = createEmotionProps(type, props);\n\n for (var i = 2; i < argsLength; i++) {\n createElementArgArray[i] = args[i];\n }\n\n return React.createElement.apply(null, createElementArgArray);\n};\n\n(function (_jsx) {\n var JSX;\n\n (function (_JSX) {})(JSX || (JSX = _jsx.JSX || (_jsx.JSX = {})));\n})(jsx || (jsx = {}));\n\n// initial render from browser, insertBefore context.sheet.tags[0] or if a style hasn't been inserted there yet, appendChild\n// initial client-side render from SSR, use place of hydrating tag\n\nvar Global = /* #__PURE__ */withEmotionCache(function (props, cache) {\n\n var styles = props.styles;\n var serialized = serializeStyles([styles], undefined, React.useContext(ThemeContext));\n // but it is based on a constant that will never change at runtime\n // it's effectively like having two implementations and switching them out\n // so it's not actually breaking anything\n\n\n var sheetRef = React.useRef();\n useInsertionEffectWithLayoutFallback(function () {\n var key = cache.key + \"-global\"; // use case of https://github.com/emotion-js/emotion/issues/2675\n\n var sheet = new cache.sheet.constructor({\n key: key,\n nonce: cache.sheet.nonce,\n container: cache.sheet.container,\n speedy: cache.sheet.isSpeedy\n });\n var rehydrating = false;\n var node = document.querySelector(\"style[data-emotion=\\\"\" + key + \" \" + serialized.name + \"\\\"]\");\n\n if (cache.sheet.tags.length) {\n sheet.before = cache.sheet.tags[0];\n }\n\n if (node !== null) {\n rehydrating = true; // clear the hash so this node won't be recognizable as rehydratable by other s\n\n node.setAttribute('data-emotion', key);\n sheet.hydrate([node]);\n }\n\n sheetRef.current = [sheet, rehydrating];\n return function () {\n sheet.flush();\n };\n }, [cache]);\n useInsertionEffectWithLayoutFallback(function () {\n var sheetRefCurrent = sheetRef.current;\n var sheet = sheetRefCurrent[0],\n rehydrating = sheetRefCurrent[1];\n\n if (rehydrating) {\n sheetRefCurrent[1] = false;\n return;\n }\n\n if (serialized.next !== undefined) {\n // insert keyframes\n insertStyles(cache, serialized.next, true);\n }\n\n if (sheet.tags.length) {\n // if this doesn't exist then it will be null so the style element will be appended\n var element = sheet.tags[sheet.tags.length - 1].nextElementSibling;\n sheet.before = element;\n sheet.flush();\n }\n\n cache.insert(\"\", serialized, sheet, false);\n }, [cache, serialized.name]);\n return null;\n});\n\nfunction css() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return serializeStyles(args);\n}\n\nfunction keyframes() {\n var insertable = css.apply(void 0, arguments);\n var name = \"animation-\" + insertable.name;\n return {\n name: name,\n styles: \"@keyframes \" + name + \"{\" + insertable.styles + \"}\",\n anim: 1,\n toString: function toString() {\n return \"_EMO_\" + this.name + \"_\" + this.styles + \"_EMO_\";\n }\n };\n}\n\nvar classnames = function classnames(args) {\n var len = args.length;\n var i = 0;\n var cls = '';\n\n for (; i < len; i++) {\n var arg = args[i];\n if (arg == null) continue;\n var toAdd = void 0;\n\n switch (typeof arg) {\n case 'boolean':\n break;\n\n case 'object':\n {\n if (Array.isArray(arg)) {\n toAdd = classnames(arg);\n } else {\n\n toAdd = '';\n\n for (var k in arg) {\n if (arg[k] && k) {\n toAdd && (toAdd += ' ');\n toAdd += k;\n }\n }\n }\n\n break;\n }\n\n default:\n {\n toAdd = arg;\n }\n }\n\n if (toAdd) {\n cls && (cls += ' ');\n cls += toAdd;\n }\n }\n\n return cls;\n};\n\nfunction merge(registered, css, className) {\n var registeredStyles = [];\n var rawClassName = getRegisteredStyles(registered, registeredStyles, className);\n\n if (registeredStyles.length < 2) {\n return className;\n }\n\n return rawClassName + css(registeredStyles);\n}\n\nvar Insertion = function Insertion(_ref) {\n var cache = _ref.cache,\n serializedArr = _ref.serializedArr;\n useInsertionEffectAlwaysWithSyncFallback(function () {\n\n for (var i = 0; i < serializedArr.length; i++) {\n insertStyles(cache, serializedArr[i], false);\n }\n });\n\n return null;\n};\n\nvar ClassNames = /* #__PURE__ */withEmotionCache(function (props, cache) {\n var hasRendered = false;\n var serializedArr = [];\n\n var css = function css() {\n if (hasRendered && isDevelopment) {\n throw new Error('css can only be used during render');\n }\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n var serialized = serializeStyles(args, cache.registered);\n serializedArr.push(serialized); // registration has to happen here as the result of this might get consumed by `cx`\n\n registerStyles(cache, serialized, false);\n return cache.key + \"-\" + serialized.name;\n };\n\n var cx = function cx() {\n if (hasRendered && isDevelopment) {\n throw new Error('cx can only be used during render');\n }\n\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n return merge(cache.registered, css, classnames(args));\n };\n\n var content = {\n css: css,\n cx: cx,\n theme: React.useContext(ThemeContext)\n };\n var ele = props.children(content);\n hasRendered = true;\n return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Insertion, {\n cache: cache,\n serializedArr: serializedArr\n }), ele);\n});\n\nexport { ClassNames, Global, jsx as createElement, css, jsx, keyframes };\n","function _taggedTemplateLiteral(e, t) {\n return t || (t = e.slice(0)), Object.freeze(Object.defineProperties(e, {\n raw: {\n value: Object.freeze(t)\n }\n }));\n}\nexport { _taggedTemplateLiteral as default };","/**\n * Custom positioning reference element.\n * @see https://floating-ui.com/docs/virtual-elements\n */\n\nconst sides = ['top', 'right', 'bottom', 'left'];\nconst alignments = ['start', 'end'];\nconst placements = /*#__PURE__*/sides.reduce((acc, side) => acc.concat(side, side + \"-\" + alignments[0], side + \"-\" + alignments[1]), []);\nconst min = Math.min;\nconst max = Math.max;\nconst round = Math.round;\nconst floor = Math.floor;\nconst createCoords = v => ({\n x: v,\n y: v\n});\nconst oppositeSideMap = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nconst oppositeAlignmentMap = {\n start: 'end',\n end: 'start'\n};\nfunction clamp(start, value, end) {\n return max(start, min(value, end));\n}\nfunction evaluate(value, param) {\n return typeof value === 'function' ? value(param) : value;\n}\nfunction getSide(placement) {\n return placement.split('-')[0];\n}\nfunction getAlignment(placement) {\n return placement.split('-')[1];\n}\nfunction getOppositeAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}\nfunction getAxisLength(axis) {\n return axis === 'y' ? 'height' : 'width';\n}\nconst yAxisSides = /*#__PURE__*/new Set(['top', 'bottom']);\nfunction getSideAxis(placement) {\n return yAxisSides.has(getSide(placement)) ? 'y' : 'x';\n}\nfunction getAlignmentAxis(placement) {\n return getOppositeAxis(getSideAxis(placement));\n}\nfunction getAlignmentSides(placement, rects, rtl) {\n if (rtl === void 0) {\n rtl = false;\n }\n const alignment = getAlignment(placement);\n const alignmentAxis = getAlignmentAxis(placement);\n const length = getAxisLength(alignmentAxis);\n let mainAlignmentSide = alignmentAxis === 'x' ? alignment === (rtl ? 'end' : 'start') ? 'right' : 'left' : alignment === 'start' ? 'bottom' : 'top';\n if (rects.reference[length] > rects.floating[length]) {\n mainAlignmentSide = getOppositePlacement(mainAlignmentSide);\n }\n return [mainAlignmentSide, getOppositePlacement(mainAlignmentSide)];\n}\nfunction getExpandedPlacements(placement) {\n const oppositePlacement = getOppositePlacement(placement);\n return [getOppositeAlignmentPlacement(placement), oppositePlacement, getOppositeAlignmentPlacement(oppositePlacement)];\n}\nfunction getOppositeAlignmentPlacement(placement) {\n return placement.replace(/start|end/g, alignment => oppositeAlignmentMap[alignment]);\n}\nconst lrPlacement = ['left', 'right'];\nconst rlPlacement = ['right', 'left'];\nconst tbPlacement = ['top', 'bottom'];\nconst btPlacement = ['bottom', 'top'];\nfunction getSideList(side, isStart, rtl) {\n switch (side) {\n case 'top':\n case 'bottom':\n if (rtl) return isStart ? rlPlacement : lrPlacement;\n return isStart ? lrPlacement : rlPlacement;\n case 'left':\n case 'right':\n return isStart ? tbPlacement : btPlacement;\n default:\n return [];\n }\n}\nfunction getOppositeAxisPlacements(placement, flipAlignment, direction, rtl) {\n const alignment = getAlignment(placement);\n let list = getSideList(getSide(placement), direction === 'start', rtl);\n if (alignment) {\n list = list.map(side => side + \"-\" + alignment);\n if (flipAlignment) {\n list = list.concat(list.map(getOppositeAlignmentPlacement));\n }\n }\n return list;\n}\nfunction getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, side => oppositeSideMap[side]);\n}\nfunction expandPaddingObject(padding) {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n ...padding\n };\n}\nfunction getPaddingObject(padding) {\n return typeof padding !== 'number' ? expandPaddingObject(padding) : {\n top: padding,\n right: padding,\n bottom: padding,\n left: padding\n };\n}\nfunction rectToClientRect(rect) {\n const {\n x,\n y,\n width,\n height\n } = rect;\n return {\n width,\n height,\n top: y,\n left: x,\n right: x + width,\n bottom: y + height,\n x,\n y\n };\n}\n\nexport { alignments, clamp, createCoords, evaluate, expandPaddingObject, floor, getAlignment, getAlignmentAxis, getAlignmentSides, getAxisLength, getExpandedPlacements, getOppositeAlignmentPlacement, getOppositeAxis, getOppositeAxisPlacements, getOppositePlacement, getPaddingObject, getSide, getSideAxis, max, min, placements, rectToClientRect, round, sides };\n","function hasWindow() {\n return typeof window !== 'undefined';\n}\nfunction getNodeName(node) {\n if (isNode(node)) {\n return (node.nodeName || '').toLowerCase();\n }\n // Mocked nodes in testing environments may not be instances of Node. By\n // returning `#document` an infinite loop won't occur.\n // https://github.com/floating-ui/floating-ui/issues/2317\n return '#document';\n}\nfunction getWindow(node) {\n var _node$ownerDocument;\n return (node == null || (_node$ownerDocument = node.ownerDocument) == null ? void 0 : _node$ownerDocument.defaultView) || window;\n}\nfunction getDocumentElement(node) {\n var _ref;\n return (_ref = (isNode(node) ? node.ownerDocument : node.document) || window.document) == null ? void 0 : _ref.documentElement;\n}\nfunction isNode(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof Node || value instanceof getWindow(value).Node;\n}\nfunction isElement(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof Element || value instanceof getWindow(value).Element;\n}\nfunction isHTMLElement(value) {\n if (!hasWindow()) {\n return false;\n }\n return value instanceof HTMLElement || value instanceof getWindow(value).HTMLElement;\n}\nfunction isShadowRoot(value) {\n if (!hasWindow() || typeof ShadowRoot === 'undefined') {\n return false;\n }\n return value instanceof ShadowRoot || value instanceof getWindow(value).ShadowRoot;\n}\nconst invalidOverflowDisplayValues = /*#__PURE__*/new Set(['inline', 'contents']);\nfunction isOverflowElement(element) {\n const {\n overflow,\n overflowX,\n overflowY,\n display\n } = getComputedStyle(element);\n return /auto|scroll|overlay|hidden|clip/.test(overflow + overflowY + overflowX) && !invalidOverflowDisplayValues.has(display);\n}\nconst tableElements = /*#__PURE__*/new Set(['table', 'td', 'th']);\nfunction isTableElement(element) {\n return tableElements.has(getNodeName(element));\n}\nconst topLayerSelectors = [':popover-open', ':modal'];\nfunction isTopLayer(element) {\n return topLayerSelectors.some(selector => {\n try {\n return element.matches(selector);\n } catch (_e) {\n return false;\n }\n });\n}\nconst transformProperties = ['transform', 'translate', 'scale', 'rotate', 'perspective'];\nconst willChangeValues = ['transform', 'translate', 'scale', 'rotate', 'perspective', 'filter'];\nconst containValues = ['paint', 'layout', 'strict', 'content'];\nfunction isContainingBlock(elementOrCss) {\n const webkit = isWebKit();\n const css = isElement(elementOrCss) ? getComputedStyle(elementOrCss) : elementOrCss;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n // https://drafts.csswg.org/css-transforms-2/#individual-transforms\n return transformProperties.some(value => css[value] ? css[value] !== 'none' : false) || (css.containerType ? css.containerType !== 'normal' : false) || !webkit && (css.backdropFilter ? css.backdropFilter !== 'none' : false) || !webkit && (css.filter ? css.filter !== 'none' : false) || willChangeValues.some(value => (css.willChange || '').includes(value)) || containValues.some(value => (css.contain || '').includes(value));\n}\nfunction getContainingBlock(element) {\n let currentNode = getParentNode(element);\n while (isHTMLElement(currentNode) && !isLastTraversableNode(currentNode)) {\n if (isContainingBlock(currentNode)) {\n return currentNode;\n } else if (isTopLayer(currentNode)) {\n return null;\n }\n currentNode = getParentNode(currentNode);\n }\n return null;\n}\nfunction isWebKit() {\n if (typeof CSS === 'undefined' || !CSS.supports) return false;\n return CSS.supports('-webkit-backdrop-filter', 'none');\n}\nconst lastTraversableNodeNames = /*#__PURE__*/new Set(['html', 'body', '#document']);\nfunction isLastTraversableNode(node) {\n return lastTraversableNodeNames.has(getNodeName(node));\n}\nfunction getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}\nfunction getNodeScroll(element) {\n if (isElement(element)) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n }\n return {\n scrollLeft: element.scrollX,\n scrollTop: element.scrollY\n };\n}\nfunction getParentNode(node) {\n if (getNodeName(node) === 'html') {\n return node;\n }\n const result =\n // Step into the shadow DOM of the parent of a slotted node.\n node.assignedSlot ||\n // DOM Element detected.\n node.parentNode ||\n // ShadowRoot detected.\n isShadowRoot(node) && node.host ||\n // Fallback.\n getDocumentElement(node);\n return isShadowRoot(result) ? result.host : result;\n}\nfunction getNearestOverflowAncestor(node) {\n const parentNode = getParentNode(node);\n if (isLastTraversableNode(parentNode)) {\n return node.ownerDocument ? node.ownerDocument.body : node.body;\n }\n if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n return parentNode;\n }\n return getNearestOverflowAncestor(parentNode);\n}\nfunction getOverflowAncestors(node, list, traverseIframes) {\n var _node$ownerDocument2;\n if (list === void 0) {\n list = [];\n }\n if (traverseIframes === void 0) {\n traverseIframes = true;\n }\n const scrollableAncestor = getNearestOverflowAncestor(node);\n const isBody = scrollableAncestor === ((_node$ownerDocument2 = node.ownerDocument) == null ? void 0 : _node$ownerDocument2.body);\n const win = getWindow(scrollableAncestor);\n if (isBody) {\n const frameElement = getFrameElement(win);\n return list.concat(win, win.visualViewport || [], isOverflowElement(scrollableAncestor) ? scrollableAncestor : [], frameElement && traverseIframes ? getOverflowAncestors(frameElement) : []);\n }\n return list.concat(scrollableAncestor, getOverflowAncestors(scrollableAncestor, [], traverseIframes));\n}\nfunction getFrameElement(win) {\n return win.parent && Object.getPrototypeOf(win.parent) ? win.frameElement : null;\n}\n\nexport { getComputedStyle, getContainingBlock, getDocumentElement, getFrameElement, getNearestOverflowAncestor, getNodeName, getNodeScroll, getOverflowAncestors, getParentNode, getWindow, isContainingBlock, isElement, isHTMLElement, isLastTraversableNode, isNode, isOverflowElement, isShadowRoot, isTableElement, isTopLayer, isWebKit };\n","import { rectToClientRect, arrow as arrow$1, autoPlacement as autoPlacement$1, detectOverflow as detectOverflow$1, flip as flip$1, hide as hide$1, inline as inline$1, limitShift as limitShift$1, offset as offset$1, shift as shift$1, size as size$1, computePosition as computePosition$1 } from '@floating-ui/core';\nimport { round, createCoords, max, min, floor } from '@floating-ui/utils';\nimport { getComputedStyle as getComputedStyle$1, isHTMLElement, isElement, getWindow, isWebKit, getFrameElement, getNodeScroll, getDocumentElement, isTopLayer, getNodeName, isOverflowElement, getOverflowAncestors, getParentNode, isLastTraversableNode, isContainingBlock, isTableElement, getContainingBlock } from '@floating-ui/utils/dom';\nexport { getOverflowAncestors } from '@floating-ui/utils/dom';\n\nfunction getCssDimensions(element) {\n const css = getComputedStyle$1(element);\n // In testing environments, the `width` and `height` properties are empty\n // strings for SVG elements, returning NaN. Fallback to `0` in this case.\n let width = parseFloat(css.width) || 0;\n let height = parseFloat(css.height) || 0;\n const hasOffset = isHTMLElement(element);\n const offsetWidth = hasOffset ? element.offsetWidth : width;\n const offsetHeight = hasOffset ? element.offsetHeight : height;\n const shouldFallback = round(width) !== offsetWidth || round(height) !== offsetHeight;\n if (shouldFallback) {\n width = offsetWidth;\n height = offsetHeight;\n }\n return {\n width,\n height,\n $: shouldFallback\n };\n}\n\nfunction unwrapElement(element) {\n return !isElement(element) ? element.contextElement : element;\n}\n\nfunction getScale(element) {\n const domElement = unwrapElement(element);\n if (!isHTMLElement(domElement)) {\n return createCoords(1);\n }\n const rect = domElement.getBoundingClientRect();\n const {\n width,\n height,\n $\n } = getCssDimensions(domElement);\n let x = ($ ? round(rect.width) : rect.width) / width;\n let y = ($ ? round(rect.height) : rect.height) / height;\n\n // 0, NaN, or Infinity should always fallback to 1.\n\n if (!x || !Number.isFinite(x)) {\n x = 1;\n }\n if (!y || !Number.isFinite(y)) {\n y = 1;\n }\n return {\n x,\n y\n };\n}\n\nconst noOffsets = /*#__PURE__*/createCoords(0);\nfunction getVisualOffsets(element) {\n const win = getWindow(element);\n if (!isWebKit() || !win.visualViewport) {\n return noOffsets;\n }\n return {\n x: win.visualViewport.offsetLeft,\n y: win.visualViewport.offsetTop\n };\n}\nfunction shouldAddVisualOffsets(element, isFixed, floatingOffsetParent) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n if (!floatingOffsetParent || isFixed && floatingOffsetParent !== getWindow(element)) {\n return false;\n }\n return isFixed;\n}\n\nfunction getBoundingClientRect(element, includeScale, isFixedStrategy, offsetParent) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n if (isFixedStrategy === void 0) {\n isFixedStrategy = false;\n }\n const clientRect = element.getBoundingClientRect();\n const domElement = unwrapElement(element);\n let scale = createCoords(1);\n if (includeScale) {\n if (offsetParent) {\n if (isElement(offsetParent)) {\n scale = getScale(offsetParent);\n }\n } else {\n scale = getScale(element);\n }\n }\n const visualOffsets = shouldAddVisualOffsets(domElement, isFixedStrategy, offsetParent) ? getVisualOffsets(domElement) : createCoords(0);\n let x = (clientRect.left + visualOffsets.x) / scale.x;\n let y = (clientRect.top + visualOffsets.y) / scale.y;\n let width = clientRect.width / scale.x;\n let height = clientRect.height / scale.y;\n if (domElement) {\n const win = getWindow(domElement);\n const offsetWin = offsetParent && isElement(offsetParent) ? getWindow(offsetParent) : offsetParent;\n let currentWin = win;\n let currentIFrame = getFrameElement(currentWin);\n while (currentIFrame && offsetParent && offsetWin !== currentWin) {\n const iframeScale = getScale(currentIFrame);\n const iframeRect = currentIFrame.getBoundingClientRect();\n const css = getComputedStyle$1(currentIFrame);\n const left = iframeRect.left + (currentIFrame.clientLeft + parseFloat(css.paddingLeft)) * iframeScale.x;\n const top = iframeRect.top + (currentIFrame.clientTop + parseFloat(css.paddingTop)) * iframeScale.y;\n x *= iframeScale.x;\n y *= iframeScale.y;\n width *= iframeScale.x;\n height *= iframeScale.y;\n x += left;\n y += top;\n currentWin = getWindow(currentIFrame);\n currentIFrame = getFrameElement(currentWin);\n }\n }\n return rectToClientRect({\n width,\n height,\n x,\n y\n });\n}\n\n// If has a CSS width greater than the viewport, then this will be\n// incorrect for RTL.\nfunction getWindowScrollBarX(element, rect) {\n const leftScroll = getNodeScroll(element).scrollLeft;\n if (!rect) {\n return getBoundingClientRect(getDocumentElement(element)).left + leftScroll;\n }\n return rect.left + leftScroll;\n}\n\nfunction getHTMLOffset(documentElement, scroll) {\n const htmlRect = documentElement.getBoundingClientRect();\n const x = htmlRect.left + scroll.scrollLeft - getWindowScrollBarX(documentElement, htmlRect);\n const y = htmlRect.top + scroll.scrollTop;\n return {\n x,\n y\n };\n}\n\nfunction convertOffsetParentRelativeRectToViewportRelativeRect(_ref) {\n let {\n elements,\n rect,\n offsetParent,\n strategy\n } = _ref;\n const isFixed = strategy === 'fixed';\n const documentElement = getDocumentElement(offsetParent);\n const topLayer = elements ? isTopLayer(elements.floating) : false;\n if (offsetParent === documentElement || topLayer && isFixed) {\n return rect;\n }\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n let scale = createCoords(1);\n const offsets = createCoords(0);\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isHTMLElement(offsetParent)) {\n const offsetRect = getBoundingClientRect(offsetParent);\n scale = getScale(offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n }\n }\n const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);\n return {\n width: rect.width * scale.x,\n height: rect.height * scale.y,\n x: rect.x * scale.x - scroll.scrollLeft * scale.x + offsets.x + htmlOffset.x,\n y: rect.y * scale.y - scroll.scrollTop * scale.y + offsets.y + htmlOffset.y\n };\n}\n\nfunction getClientRects(element) {\n return Array.from(element.getClientRects());\n}\n\n// Gets the entire size of the scrollable document area, even extending outside\n// of the `` and `` rect bounds if horizontally scrollable.\nfunction getDocumentRect(element) {\n const html = getDocumentElement(element);\n const scroll = getNodeScroll(element);\n const body = element.ownerDocument.body;\n const width = max(html.scrollWidth, html.clientWidth, body.scrollWidth, body.clientWidth);\n const height = max(html.scrollHeight, html.clientHeight, body.scrollHeight, body.clientHeight);\n let x = -scroll.scrollLeft + getWindowScrollBarX(element);\n const y = -scroll.scrollTop;\n if (getComputedStyle$1(body).direction === 'rtl') {\n x += max(html.clientWidth, body.clientWidth) - width;\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\n// Safety check: ensure the scrollbar space is reasonable in case this\n// calculation is affected by unusual styles.\n// Most scrollbars leave 15-18px of space.\nconst SCROLLBAR_MAX = 25;\nfunction getViewportRect(element, strategy) {\n const win = getWindow(element);\n const html = getDocumentElement(element);\n const visualViewport = win.visualViewport;\n let width = html.clientWidth;\n let height = html.clientHeight;\n let x = 0;\n let y = 0;\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height;\n const visualViewportBased = isWebKit();\n if (!visualViewportBased || visualViewportBased && strategy === 'fixed') {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n const windowScrollbarX = getWindowScrollBarX(html);\n // `overflow: hidden` + `scrollbar-gutter: stable` reduces the\n // visual width of the but this is not considered in the size\n // of `html.clientWidth`.\n if (windowScrollbarX <= 0) {\n const doc = html.ownerDocument;\n const body = doc.body;\n const bodyStyles = getComputedStyle(body);\n const bodyMarginInline = doc.compatMode === 'CSS1Compat' ? parseFloat(bodyStyles.marginLeft) + parseFloat(bodyStyles.marginRight) || 0 : 0;\n const clippingStableScrollbarWidth = Math.abs(html.clientWidth - body.clientWidth - bodyMarginInline);\n if (clippingStableScrollbarWidth <= SCROLLBAR_MAX) {\n width -= clippingStableScrollbarWidth;\n }\n } else if (windowScrollbarX <= SCROLLBAR_MAX) {\n // If the scrollbar is on the left, the width needs to be extended\n // by the scrollbar amount so there isn't extra space on the right.\n width += windowScrollbarX;\n }\n return {\n width,\n height,\n x,\n y\n };\n}\n\nconst absoluteOrFixed = /*#__PURE__*/new Set(['absolute', 'fixed']);\n// Returns the inner client rect, subtracting scrollbars if present.\nfunction getInnerBoundingClientRect(element, strategy) {\n const clientRect = getBoundingClientRect(element, true, strategy === 'fixed');\n const top = clientRect.top + element.clientTop;\n const left = clientRect.left + element.clientLeft;\n const scale = isHTMLElement(element) ? getScale(element) : createCoords(1);\n const width = element.clientWidth * scale.x;\n const height = element.clientHeight * scale.y;\n const x = left * scale.x;\n const y = top * scale.y;\n return {\n width,\n height,\n x,\n y\n };\n}\nfunction getClientRectFromClippingAncestor(element, clippingAncestor, strategy) {\n let rect;\n if (clippingAncestor === 'viewport') {\n rect = getViewportRect(element, strategy);\n } else if (clippingAncestor === 'document') {\n rect = getDocumentRect(getDocumentElement(element));\n } else if (isElement(clippingAncestor)) {\n rect = getInnerBoundingClientRect(clippingAncestor, strategy);\n } else {\n const visualOffsets = getVisualOffsets(element);\n rect = {\n x: clippingAncestor.x - visualOffsets.x,\n y: clippingAncestor.y - visualOffsets.y,\n width: clippingAncestor.width,\n height: clippingAncestor.height\n };\n }\n return rectToClientRect(rect);\n}\nfunction hasFixedPositionAncestor(element, stopNode) {\n const parentNode = getParentNode(element);\n if (parentNode === stopNode || !isElement(parentNode) || isLastTraversableNode(parentNode)) {\n return false;\n }\n return getComputedStyle$1(parentNode).position === 'fixed' || hasFixedPositionAncestor(parentNode, stopNode);\n}\n\n// A \"clipping ancestor\" is an `overflow` element with the characteristic of\n// clipping (or hiding) child elements. This returns all clipping ancestors\n// of the given element up the tree.\nfunction getClippingElementAncestors(element, cache) {\n const cachedResult = cache.get(element);\n if (cachedResult) {\n return cachedResult;\n }\n let result = getOverflowAncestors(element, [], false).filter(el => isElement(el) && getNodeName(el) !== 'body');\n let currentContainingBlockComputedStyle = null;\n const elementIsFixed = getComputedStyle$1(element).position === 'fixed';\n let currentNode = elementIsFixed ? getParentNode(element) : element;\n\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n while (isElement(currentNode) && !isLastTraversableNode(currentNode)) {\n const computedStyle = getComputedStyle$1(currentNode);\n const currentNodeIsContaining = isContainingBlock(currentNode);\n if (!currentNodeIsContaining && computedStyle.position === 'fixed') {\n currentContainingBlockComputedStyle = null;\n }\n const shouldDropCurrentNode = elementIsFixed ? !currentNodeIsContaining && !currentContainingBlockComputedStyle : !currentNodeIsContaining && computedStyle.position === 'static' && !!currentContainingBlockComputedStyle && absoluteOrFixed.has(currentContainingBlockComputedStyle.position) || isOverflowElement(currentNode) && !currentNodeIsContaining && hasFixedPositionAncestor(element, currentNode);\n if (shouldDropCurrentNode) {\n // Drop non-containing blocks.\n result = result.filter(ancestor => ancestor !== currentNode);\n } else {\n // Record last containing block for next iteration.\n currentContainingBlockComputedStyle = computedStyle;\n }\n currentNode = getParentNode(currentNode);\n }\n cache.set(element, result);\n return result;\n}\n\n// Gets the maximum area that the element is visible in due to any number of\n// clipping ancestors.\nfunction getClippingRect(_ref) {\n let {\n element,\n boundary,\n rootBoundary,\n strategy\n } = _ref;\n const elementClippingAncestors = boundary === 'clippingAncestors' ? isTopLayer(element) ? [] : getClippingElementAncestors(element, this._c) : [].concat(boundary);\n const clippingAncestors = [...elementClippingAncestors, rootBoundary];\n const firstClippingAncestor = clippingAncestors[0];\n const clippingRect = clippingAncestors.reduce((accRect, clippingAncestor) => {\n const rect = getClientRectFromClippingAncestor(element, clippingAncestor, strategy);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromClippingAncestor(element, firstClippingAncestor, strategy));\n return {\n width: clippingRect.right - clippingRect.left,\n height: clippingRect.bottom - clippingRect.top,\n x: clippingRect.left,\n y: clippingRect.top\n };\n}\n\nfunction getDimensions(element) {\n const {\n width,\n height\n } = getCssDimensions(element);\n return {\n width,\n height\n };\n}\n\nfunction getRectRelativeToOffsetParent(element, offsetParent, strategy) {\n const isOffsetParentAnElement = isHTMLElement(offsetParent);\n const documentElement = getDocumentElement(offsetParent);\n const isFixed = strategy === 'fixed';\n const rect = getBoundingClientRect(element, true, isFixed, offsetParent);\n let scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n const offsets = createCoords(0);\n\n // If the scrollbar appears on the left (e.g. RTL systems). Use\n // Firefox with layout.scrollbar.side = 3 in about:config to test this.\n function setLeftRTLScrollbarOffset() {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || isOverflowElement(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n if (isOffsetParentAnElement) {\n const offsetRect = getBoundingClientRect(offsetParent, true, isFixed, offsetParent);\n offsets.x = offsetRect.x + offsetParent.clientLeft;\n offsets.y = offsetRect.y + offsetParent.clientTop;\n } else if (documentElement) {\n setLeftRTLScrollbarOffset();\n }\n }\n if (isFixed && !isOffsetParentAnElement && documentElement) {\n setLeftRTLScrollbarOffset();\n }\n const htmlOffset = documentElement && !isOffsetParentAnElement && !isFixed ? getHTMLOffset(documentElement, scroll) : createCoords(0);\n const x = rect.left + scroll.scrollLeft - offsets.x - htmlOffset.x;\n const y = rect.top + scroll.scrollTop - offsets.y - htmlOffset.y;\n return {\n x,\n y,\n width: rect.width,\n height: rect.height\n };\n}\n\nfunction isStaticPositioned(element) {\n return getComputedStyle$1(element).position === 'static';\n}\n\nfunction getTrueOffsetParent(element, polyfill) {\n if (!isHTMLElement(element) || getComputedStyle$1(element).position === 'fixed') {\n return null;\n }\n if (polyfill) {\n return polyfill(element);\n }\n let rawOffsetParent = element.offsetParent;\n\n // Firefox returns the element as the offsetParent if it's non-static,\n // while Chrome and Safari return the element. The element must\n // be used to perform the correct calculations even if the element is\n // non-static.\n if (getDocumentElement(element) === rawOffsetParent) {\n rawOffsetParent = rawOffsetParent.ownerDocument.body;\n }\n return rawOffsetParent;\n}\n\n// Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\nfunction getOffsetParent(element, polyfill) {\n const win = getWindow(element);\n if (isTopLayer(element)) {\n return win;\n }\n if (!isHTMLElement(element)) {\n let svgOffsetParent = getParentNode(element);\n while (svgOffsetParent && !isLastTraversableNode(svgOffsetParent)) {\n if (isElement(svgOffsetParent) && !isStaticPositioned(svgOffsetParent)) {\n return svgOffsetParent;\n }\n svgOffsetParent = getParentNode(svgOffsetParent);\n }\n return win;\n }\n let offsetParent = getTrueOffsetParent(element, polyfill);\n while (offsetParent && isTableElement(offsetParent) && isStaticPositioned(offsetParent)) {\n offsetParent = getTrueOffsetParent(offsetParent, polyfill);\n }\n if (offsetParent && isLastTraversableNode(offsetParent) && isStaticPositioned(offsetParent) && !isContainingBlock(offsetParent)) {\n return win;\n }\n return offsetParent || getContainingBlock(element) || win;\n}\n\nconst getElementRects = async function (data) {\n const getOffsetParentFn = this.getOffsetParent || getOffsetParent;\n const getDimensionsFn = this.getDimensions;\n const floatingDimensions = await getDimensionsFn(data.floating);\n return {\n reference: getRectRelativeToOffsetParent(data.reference, await getOffsetParentFn(data.floating), data.strategy),\n floating: {\n x: 0,\n y: 0,\n width: floatingDimensions.width,\n height: floatingDimensions.height\n }\n };\n};\n\nfunction isRTL(element) {\n return getComputedStyle$1(element).direction === 'rtl';\n}\n\nconst platform = {\n convertOffsetParentRelativeRectToViewportRelativeRect,\n getDocumentElement,\n getClippingRect,\n getOffsetParent,\n getElementRects,\n getClientRects,\n getDimensions,\n getScale,\n isElement,\n isRTL\n};\n\nfunction rectsAreEqual(a, b) {\n return a.x === b.x && a.y === b.y && a.width === b.width && a.height === b.height;\n}\n\n// https://samthor.au/2021/observing-dom/\nfunction observeMove(element, onMove) {\n let io = null;\n let timeoutId;\n const root = getDocumentElement(element);\n function cleanup() {\n var _io;\n clearTimeout(timeoutId);\n (_io = io) == null || _io.disconnect();\n io = null;\n }\n function refresh(skip, threshold) {\n if (skip === void 0) {\n skip = false;\n }\n if (threshold === void 0) {\n threshold = 1;\n }\n cleanup();\n const elementRectForRootMargin = element.getBoundingClientRect();\n const {\n left,\n top,\n width,\n height\n } = elementRectForRootMargin;\n if (!skip) {\n onMove();\n }\n if (!width || !height) {\n return;\n }\n const insetTop = floor(top);\n const insetRight = floor(root.clientWidth - (left + width));\n const insetBottom = floor(root.clientHeight - (top + height));\n const insetLeft = floor(left);\n const rootMargin = -insetTop + \"px \" + -insetRight + \"px \" + -insetBottom + \"px \" + -insetLeft + \"px\";\n const options = {\n rootMargin,\n threshold: max(0, min(1, threshold)) || 1\n };\n let isFirstUpdate = true;\n function handleObserve(entries) {\n const ratio = entries[0].intersectionRatio;\n if (ratio !== threshold) {\n if (!isFirstUpdate) {\n return refresh();\n }\n if (!ratio) {\n // If the reference is clipped, the ratio is 0. Throttle the refresh\n // to prevent an infinite loop of updates.\n timeoutId = setTimeout(() => {\n refresh(false, 1e-7);\n }, 1000);\n } else {\n refresh(false, ratio);\n }\n }\n if (ratio === 1 && !rectsAreEqual(elementRectForRootMargin, element.getBoundingClientRect())) {\n // It's possible that even though the ratio is reported as 1, the\n // element is not actually fully within the IntersectionObserver's root\n // area anymore. This can happen under performance constraints. This may\n // be a bug in the browser's IntersectionObserver implementation. To\n // work around this, we compare the element's bounding rect now with\n // what it was at the time we created the IntersectionObserver. If they\n // are not equal then the element moved, so we refresh.\n refresh();\n }\n isFirstUpdate = false;\n }\n\n // Older browsers don't support a `document` as the root and will throw an\n // error.\n try {\n io = new IntersectionObserver(handleObserve, {\n ...options,\n // Handle
\n
\n
\n
\n
\n
\n
\n
\n
\n {Array.from({ length: iterCount }, (_, i) => (\n
\n
\n
\n
\n
\n
\n
\n
\n ))}\n
\n ),\n Pagination: (animClass) => (\n
\n {Array.from({ length: 5 }, (_, i) => (\n
\n ))}\n
\n ),\n Tabs: (animClass) => (\n
\n
\n {Array.from({ length: 3 }, (_, i) => (\n
\n ))}\n
\n
\n
\n ),\n TabNavigation: (animClass) => (\n
\n {Array.from({ length: 3 }, (_, i) => (\n
\n ))}\n
\n ),\n ProductCard: (animClass) => (\n
\n
\n
\n
\n
\n
\n
\n ),\n UserInfo: (animClass) => (\n
\n ),\n QuantitySelector: (animClass) => (\n
\n ),\n Header: (animClass) => (\n
\n
\n
\n
\n
\n
\n {Array.from({ length: 4 }, (_, i) => (\n
\n ))}\n
\n
\n
\n {Array.from({ length: 3 }, (_, i) => (\n
\n ))}\n
\n
\n
\n
\n ),\n Footer: (animClass) => (\n
\n
\n
\n
\n
\n
\n {Array.from({ length: 3 }, (_, i) => (\n
\n ))}\n
\n
\n
\n
\n
\n ),\n Modal: () => <>,\n Toast: () => <>,\n ConfirmDialog: () => <>,\n};\n\n/**\n * 조건부 분기 필터링 — 로딩/에러 상태 스킵, 콘텐츠 브랜치 선택\n *\n * 레이아웃 JSON에서 로딩/에러/콘텐츠 상태가 sibling으로 if 조건으로 분기되는 패턴이 일반적.\n * 스켈레톤은 \"데이터 로드 완료 후 실제 UI\" 형태를 보여줘야 하므로,\n * 로딩/에러 분기는 스킵하고 콘텐츠 분기(가장 풍부한 트리)만 렌더링.\n */\nfunction filterChildren(children: LayoutComponent[]): LayoutComponent[] {\n if (!children || children.length === 0) return [];\n\n const withIf = children.filter(c => c.if);\n const withoutIf = children.filter(c => !c.if);\n\n // if 조건 없는 컴포넌트가 있고, if 있는 것도 있는 경우\n // → if 없는 것은 항상 렌더, if 있는 것 중 부정 조건 스킵\n if (withoutIf.length > 0 && withIf.length > 0) {\n const positiveIf = withIf.filter(c => !isNegativeCondition(c.if!));\n // 긍정 조건 여러 개가 상호 배타적 값 분기(=== 'value')이면 richest만 선택\n // 예: type === 'basic', type === 'gallery', type === 'card'\n if (positiveIf.length > 1 && areMutuallyExclusiveBranches(positiveIf)) {\n return [...withoutIf, pickRichestBranch(positiveIf)];\n }\n return [...withoutIf, ...positiveIf];\n }\n\n // 모든 컴포넌트가 if 조건을 가진 경우 → 상호 배타적 분기\n // → 부정 조건 스킵 후, 나머지 중 가장 풍부한 브랜치 선택\n if (withIf.length > 1 && withoutIf.length === 0) {\n const positive = withIf.filter(c => !isNegativeCondition(c.if!));\n if (positive.length === 0) {\n // 모두 부정 조건 (로딩/에러 상태만) → 전체 스킵\n // 스켈레톤은 \"데이터 로드 완료 후 UI\"를 보여주므로 로딩/에러 분기 불필요\n return [];\n }\n if (positive.length === 1) return positive;\n // 긍정 조건 여러 개 → 가장 풍부한 것 선택\n return [pickRichestBranch(positive)];\n }\n\n return children;\n}\n\n/**\n * 부정 조건 판별 — 로딩/에러 상태를 나타내는 if 조건\n */\nfunction isNegativeCondition(ifExpr: string): boolean {\n const trimmed = ifExpr.replace(/^\\{\\{|\\}\\}$/g, '').trim();\n return trimmed.startsWith('!') ||\n /\\b(hasError|isError|isLoading|error|Error)\\b/.test(trimmed) ||\n // empty state 패턴: length === 0, total === 0, count === 0 등\n /===\\s*0\\s*(\\)|\\}|$)/.test(trimmed);\n}\n\n/**\n * 상호 배타적 값 분기 판별\n *\n * 여러 if 조건이 같은 변수에 대한 `=== 'value'` 패턴이면 상호 배타적.\n * 예: type === 'basic', type === 'gallery', type === 'card'\n * → 스켈레톤에서 하나만 선택해야 중복 렌더링 방지.\n */\nfunction areMutuallyExclusiveBranches(branches: LayoutComponent[]): boolean {\n if (branches.length < 2) return false;\n\n // 각 조건에서 \"expr === 'value'\" 패턴의 기본 표현식(expr) 추출\n const baseExpressions: string[] = [];\n for (const branch of branches) {\n const trimmed = (branch.if || '').replace(/^\\{\\{|\\}\\}$/g, '').trim();\n // === 'value' 또는 === \"value\" 패턴 찾기\n const match = trimmed.match(/^(.+?)\\s*===\\s*['\"]/);\n if (!match) {\n // || 로 연결된 복합 조건에서도 첫 번째 === 패턴 추출 (fallback 분기)\n const orMatch = trimmed.match(/(.+?)\\s*===\\s*['\"]/);\n if (!orMatch) return false;\n baseExpressions.push(orMatch[1].trim());\n } else {\n baseExpressions.push(match[1].trim());\n }\n }\n\n // 모든 분기가 같은 기본 표현식을 참조하면 상호 배타적\n const first = baseExpressions[0];\n return baseExpressions.every(expr => expr === first);\n}\n\n/**\n * 자손 수 기준 가장 풍부한 분기 선택\n */\nfunction pickRichestBranch(branches: LayoutComponent[]): LayoutComponent {\n return branches.reduce((best, curr) =>\n countDescendants(curr) > countDescendants(best) ? curr : best\n );\n}\n\n/**\n * 컴포넌트 트리의 총 자손 수 계산\n */\nfunction countDescendants(component: LayoutComponent): number {\n if (!component.children) return 0;\n return component.children.length +\n component.children.reduce((sum, child) => sum + countDescendants(child), 0);\n}\n\n/**\n * className 내 {{...}} 표현식 해석\n *\n * 레이아웃 JSON의 className에 {{expr ? 'classA' : 'classB'}} 같은 표현식이 포함될 수 있음.\n * 스켈레톤에서는 데이터가 없으므로 표현식을 평가할 수 없음.\n * → 삼항 연산자의 true 분기 값을 추출하여 적용 (기본값으로 사용).\n * → 단순 표현식(삼항 아닌 경우)은 제거.\n */\nfunction resolveExpressions(className: string): string {\n if (!className.includes('{{')) return className;\n\n return className.replace(/\\{\\{([^}]+)\\}\\}/g, (_, expr: string) => {\n // 삼항 연산자: condition ? 'value1' : 'value2' → value1 추출\n const ternaryMatch = expr.match(/\\?[\\s]*['\"]([^'\"]*)['\"]\\s*:\\s*['\"]/);\n if (ternaryMatch) {\n return ternaryMatch[1];\n }\n // 삼항 아닌 단순 표현식 → 제거\n return '';\n });\n}\n\n/**\n * 스켈레톤 렌더에 적합한 className 변환\n *\n * 1. {{...}} 표현식 해석 (삼항 → true 분기, 단순 표현식 → 제거)\n * 2. 레이아웃 구조 클래스(flex, grid, gap, padding, margin, max-width 등)는 원본 유지.\n * 3. 시각적 클래스(배경색, 텍스트색, 테두리, 그림자 등)는 제거.\n */\nfunction sanitizeClassName(className: string, name: string): string {\n if (!className) return '';\n\n // 시각적 클래스 제거 (표현식/반응형은 renderSkeletonNode에서 이미 해석됨)\n let sanitized = className;\n sanitized = sanitized\n .replace(/\\b(bg-\\S+|text-\\S+|border\\b|border-\\S+|shadow\\S*|ring-\\S+|outline-\\S+|divide-\\S+|opacity-\\S+|font-\\S+|tracking-\\S+|leading-\\S+|whitespace-\\S+|truncate|line-clamp-\\S+|underline|no-underline|decoration-\\S+|cursor-\\S+|hover:\\S+|focus:\\S+|active:\\S+|group-hover:\\S+|transition\\S*|duration-\\S+|ease-\\S+|animate-\\S+|dark:\\S+)\\b/g, '')\n .replace(/\\s{2,}/g, ' ')\n .trim();\n\n // Grid: 숫자 컬럼 수 유지 (arbitrary value [...]는 보존 — extractArbitraryGridCols에서 처리)\n if (name === 'Grid' || /\\bgrid-cols-\\d/.test(sanitized)) {\n sanitized = sanitized.replace(/\\bgrid-cols-(\\d+)/g, (_, val) => {\n const num = parseInt(val);\n return num > 4 ? `grid-cols-${Math.ceil(num / 2)}` : `grid-cols-${num}`;\n });\n }\n\n return sanitized;\n}\n\n/**\n * Flex/Grid 컴포넌트의 레이아웃 props를 Tailwind 클래스로 변환\n *\n * Flex, Grid 컴포넌트는 justify, align, gap 등을 별도 props로 받아\n * 실제 렌더 시 Tailwind 클래스로 변환한다.\n * 스켈레톤은 이 컴포넌트들을 plain
로 대체하므로,\n * props → Tailwind 변환을 여기서 수행하여 className에 병합해야 한다.\n *\n * @since engine-v1.17.0\n */\nfunction resolveLayoutProps(component: LayoutComponent): string {\n const { name, props } = component;\n if (!props || !name) return '';\n\n const classes: string[] = [];\n\n if (name === 'Flex') {\n classes.push('flex');\n\n const direction = props.direction || 'row';\n const directionMap: Record = {\n row: 'flex-row', 'row-reverse': 'flex-row-reverse',\n col: 'flex-col', 'col-reverse': 'flex-col-reverse',\n };\n if (directionMap[direction]) classes.push(directionMap[direction]);\n\n const justify = props.justify || 'start';\n const justifyMap: Record = {\n start: 'justify-start', end: 'justify-end', center: 'justify-center',\n between: 'justify-between', around: 'justify-around', evenly: 'justify-evenly',\n };\n if (justifyMap[justify]) classes.push(justifyMap[justify]);\n\n const align = props.align || 'stretch';\n const alignMap: Record = {\n start: 'items-start', end: 'items-end', center: 'items-center',\n baseline: 'items-baseline', stretch: 'items-stretch',\n };\n if (alignMap[align]) classes.push(alignMap[align]);\n\n const wrap = props.wrap || 'nowrap';\n const wrapMap: Record = {\n wrap: 'flex-wrap', nowrap: 'flex-nowrap', 'wrap-reverse': 'flex-wrap-reverse',\n };\n if (wrapMap[wrap]) classes.push(wrapMap[wrap]);\n\n if (props.gap && props.gap > 0) classes.push(`gap-${props.gap}`);\n }\n\n if (name === 'Grid') {\n classes.push('grid');\n\n const cols = props.cols || 1;\n classes.push(`grid-cols-${cols}`);\n\n if (props.responsive) {\n const r = props.responsive;\n if (r.sm) classes.push(`sm:grid-cols-${r.sm}`);\n if (r.md) classes.push(`md:grid-cols-${r.md}`);\n if (r.lg) classes.push(`lg:grid-cols-${r.lg}`);\n if (r.xl) classes.push(`xl:grid-cols-${r.xl}`);\n if (r['2xl']) classes.push(`2xl:grid-cols-${r['2xl']}`);\n }\n\n if (props.gap !== undefined && props.gap > 0) classes.push(`gap-${props.gap}`);\n if (props.rowGap !== undefined && props.rowGap > 0) classes.push(`gap-y-${props.rowGap}`);\n if (props.colGap !== undefined && props.colGap > 0) classes.push(`gap-x-${props.colGap}`);\n }\n\n return classes.join(' ');\n}\n\n/**\n * 애니메이션 클래스 결정\n */\nfunction getAnimationClass(animation: string): string {\n switch (animation) {\n case 'pulse':\n return 'animate-pulse';\n case 'wave':\n return 'animate-pulse'; // wave는 별도 CSS 필요, pulse로 폴백\n case 'none':\n return '';\n default:\n return 'animate-pulse';\n }\n}\n\n/**\n * 자식 컴포넌트 렌더링 (조건부 분기 필터링 적용)\n */\nfunction renderChildren(\n children: LayoutComponent[] | undefined,\n animClass: string,\n iterCount: number,\n width: number,\n): (React.ReactElement | null)[] {\n if (!children || children.length === 0) return [];\n const filtered = filterChildren(children);\n return filtered.map((child, i) =>\n renderSkeletonNode(child, animClass, iterCount, i, width)\n );\n}\n\n/**\n * 현재 뷰포트에 맞는 className 결정\n *\n * responsive 속성이 있으면 호출자가 전달한 viewport width 기준으로 적절한 className 선택.\n * - desktop (lg, 1024px+): responsive.desktop.props.className\n * - tablet (md, 768px+): responsive.tablet.props.className\n * - 기본: props.className\n *\n * @param width G7Core.useResponsive()로 구독한 viewport width (overrideWidth 반영)\n */\nfunction resolveClassName(component: LayoutComponent, width: number): string {\n const baseClassName = component.props?.className || component.className || '';\n\n if (!component.responsive) return baseClassName;\n\n if (width >= 1024 && component.responsive.desktop?.props?.className) {\n return component.responsive.desktop.props.className;\n }\n if (width >= 768 && component.responsive.tablet?.props?.className) {\n return component.responsive.tablet.props.className;\n }\n\n return baseClassName;\n}\n\n/**\n * Tailwind 반응형 display 클래스를 viewport 기준으로 해석\n *\n * 레이아웃 JSON의 className에 `hidden lg:grid`, `lg:hidden` 같은 Tailwind 반응형 패턴이 포함됨.\n * Tailwind은 빌드 시 CSS로 처리하지만, 스켈레톤은 런타임에서 JS로 해석해야 함.\n *\n * 동작:\n * 1. className에서 display 관련 클래스(hidden, flex, grid 등) + 반응형 접두사(lg:grid 등) 추출\n * 2. Tailwind cascade 규칙 적용: base → sm → md → lg → xl → 2xl 순서로 width에 맞는 display 결정\n * 3. hidden이면 컴포넌트 숨김, 아니면 해석된 display 클래스 + 나머지 클래스 반환\n *\n * @param width G7Core.useResponsive()로 구독한 viewport width (overrideWidth 반영)\n */\nfunction resolveResponsiveDisplay(className: string, width: number): { visible: boolean; className: string } {\n const tokens = className.split(/\\s+/).filter(Boolean);\n\n const displayEntries: Array<{ breakpoint: number; display: string }> = [];\n const otherClasses: string[] = [];\n\n for (const token of tokens) {\n // 반응형 접두사 + display 클래스: \"lg:grid\", \"sm:flex\", \"md:hidden\"\n const responsiveMatch = token.match(/^(sm|md|lg|xl|2xl):(.+)$/);\n if (responsiveMatch) {\n const [, prefix, cls] = responsiveMatch;\n if (DISPLAY_CLASSES.has(cls)) {\n displayEntries.push({\n breakpoint: TAILWIND_BREAKPOINTS[prefix] || 0,\n display: cls,\n });\n continue;\n }\n // 반응형 접두사지만 display가 아닌 클래스 (lg:gap-4 등) → 뷰포트 체크 후 포함\n if ((TAILWIND_BREAKPOINTS[prefix] || 0) <= width) {\n otherClasses.push(cls); // 접두사 제거하고 포함\n }\n continue;\n }\n\n // 기본(접두사 없는) display 클래스: \"hidden\", \"flex\", \"grid\"\n if (DISPLAY_CLASSES.has(token)) {\n displayEntries.push({ breakpoint: 0, display: token });\n continue;\n }\n\n otherClasses.push(token);\n }\n\n // display 클래스가 없으면 그대로 반환\n if (displayEntries.length === 0) {\n return { visible: true, className };\n }\n\n // breakpoint 오름차순 정렬 후 cascade 적용\n displayEntries.sort((a, b) => a.breakpoint - b.breakpoint);\n\n let effectiveDisplay = '';\n for (const entry of displayEntries) {\n if (entry.breakpoint <= width) {\n effectiveDisplay = entry.display;\n }\n }\n\n // 해당 뷰포트에 적용되는 display가 없으면 첫 번째(base) 사용\n if (!effectiveDisplay) {\n effectiveDisplay = displayEntries[0].display;\n }\n\n const visible = effectiveDisplay !== 'hidden';\n const resolvedClassName = visible\n ? [effectiveDisplay, ...otherClasses].join(' ')\n : '';\n\n return { visible, className: resolvedClassName };\n}\n\n/**\n * className에서 arbitrary grid-cols-[...] 값을 추출하여 inline style로 변환\n *\n * Tailwind의 arbitrary value `grid-cols-[60px_minmax(300px,1fr)_160px]`는\n * 빌드 시 동적 표현식({{...}}) 안에 있으면 purge되어 CSS에 포함되지 않음.\n * → inline style `gridTemplateColumns`로 변환하여 런타임에서 직접 적용.\n */\nfunction extractArbitraryGridCols(className: string): { className: string; style?: React.CSSProperties } {\n const match = className.match(/\\bgrid-cols-\\[([^\\]]+)\\]/);\n if (!match) return { className };\n\n const value = match[1].replace(/_/g, ' ');\n const cleanedClassName = className\n .replace(/\\bgrid-cols-\\[([^\\]]+)\\]/, '')\n .replace(/\\s{2,}/g, ' ')\n .trim();\n\n return {\n className: cleanedClassName,\n style: { gridTemplateColumns: value },\n };\n}\n\n/**\n * 단일 컴포넌트를 스켈레톤으로 변환\n */\nfunction renderSkeletonNode(\n component: LayoutComponent,\n animClass: string,\n iterCount: number,\n index: number,\n width: number,\n): React.ReactElement | null {\n const { name, children, iteration } = component;\n // 1. responsive 속성에서 뷰포트에 맞는 className 선택\n const rawClassName = resolveClassName(component, width);\n // 1.5. Flex/Grid 레이아웃 props → Tailwind 클래스 병합\n const layoutClasses = resolveLayoutProps(component);\n const mergedClassName = layoutClasses\n ? `${layoutClasses} ${rawClassName}`.trim()\n : rawClassName;\n // 2. {{...}} 표현식 해석 (삼항 → true 분기)\n const exprResolved = resolveExpressions(mergedClassName);\n // 3. Tailwind 반응형 display 클래스 해석 (hidden lg:grid → grid at desktop)\n const responsive = resolveResponsiveDisplay(exprResolved, width);\n\n if (!name) return null;\n\n // 현재 뷰포트에서 숨겨진 컴포넌트 → 스킵\n if (!responsive.visible) return null;\n\n const className = responsive.className;\n\n // iteration 블록: 기본 반복 횟수만큼 반복 생성\n if (iteration) {\n return (\n \n {Array.from({ length: iterCount }, (_, i) => (\n renderSkeletonNode(\n { ...component, iteration: undefined },\n animClass,\n iterCount,\n i,\n width,\n )\n ))}\n \n );\n }\n\n // 복합 컴포넌트 특화 스켈레톤\n if (COMPOSITE_SKELETONS[name]) {\n return (\n
\n {COMPOSITE_SKELETONS[name](animClass, iterCount)}\n
\n );\n }\n\n // 레이아웃 컨테이너: className 유지, 자식 재귀 순회\n if (LAYOUT_CONTAINERS.has(name)) {\n const sanitized = sanitizeClassName(className, name);\n\n // 자식 없는 leaf 컨테이너 → 스켈레톤 바로 표시\n if (!children || children.length === 0) {\n const hasDimension = /\\b(h-\\S|w-\\S)/.test(sanitized);\n const barClass = hasDimension\n ? `${sanitized} bg-gray-200 dark:bg-gray-700 rounded ${animClass}`\n : `${sanitized} h-3.5 w-full bg-gray-200 dark:bg-gray-700 rounded ${animClass}`.trim();\n return
;\n }\n\n // 자식 렌더링 (조건부 분기 필터링 적용)\n const renderedChildren = renderChildren(children, animClass, iterCount, width);\n const hasContent = renderedChildren.length > 0 && renderedChildren.some(c => c !== null);\n\n // 모든 자식이 필터링됨 (로딩/에러 wrapper 등) → 컨테이너 자체 스킵\n if (!hasContent) return null;\n\n // arbitrary grid-cols-[...] → inline style로 변환\n const gridResult = extractArbitraryGridCols(sanitized);\n\n return (\n
\n {renderedChildren}\n
\n );\n }\n\n // 비-컨테이너 컴포넌트: 원본 className에서 시각적 클래스(색상 등)를 제거\n // 스켈레톤 바의 색상은 고정(gray-200)이므로 원본 bg-red-500 등이 누출되면 안 됨\n const sanitizedLeafClass = sanitizeClassName(className, name);\n\n // 텍스트 컴포넌트: 회색 바\n if (TEXT_COMPONENTS.has(name)) {\n const heightMap: Record = {\n H1: 'h-7', H2: 'h-6', H3: 'h-5', H4: 'h-5', H5: 'h-4', H6: 'h-4',\n P: 'h-3.5', Span: 'h-3', Label: 'h-3', A: 'h-3.5',\n Badge: 'h-5 w-16',\n };\n const widthMap: Record = {\n H1: 'w-3/5', H2: 'w-2/5', H3: 'w-1/3', H4: 'w-1/3', H5: 'w-1/4', H6: 'w-1/4',\n P: 'w-full', Span: 'w-1/4', Label: 'w-1/4', A: 'w-1/3',\n Strong: 'w-1/5', Em: 'w-1/4', Small: 'w-1/5', Badge: 'w-16',\n };\n const height = heightMap[name] || 'h-3.5';\n const width = widthMap[name] || 'w-full';\n const spacing = name.startsWith('H') ? 'mb-2 mt-1' : 'mb-1.5';\n return (\n
\n );\n }\n\n // 인풋 컴포넌트: 사각형\n if (INPUT_COMPONENTS.has(name)) {\n if (name === 'Textarea') {\n return
;\n }\n if (name === 'Checkbox' || name === 'Radio' || name === 'Toggle') {\n return
;\n }\n return
;\n }\n\n // 미디어 컴포넌트: 큰 사각형\n if (MEDIA_COMPONENTS.has(name)) {\n if (name === 'Avatar' || name === 'AvatarUploader') {\n return
;\n }\n if (name === 'ProductImageViewer') {\n return
;\n }\n return
;\n }\n\n // Button: children이 있으면 래퍼(컨테이너)로 처리, 없으면 바\n if (name === 'Button') {\n if (children && children.length > 0) {\n const sanitized = sanitizeClassName(className, name);\n const renderedChildren = renderChildren(children, animClass, iterCount, width);\n const hasContent = renderedChildren.length > 0 && renderedChildren.some(c => c !== null);\n if (!hasContent) return null;\n // 원본 className에 border/rounded가 있으면 실제 버튼 형태 → 스켈레톤 경계 추가\n const hasBorderStyle = /\\b(border|rounded|px-\\d|py-\\d)/.test(rawClassName);\n const borderClass = hasBorderStyle\n ? 'border border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800/50 rounded-lg'\n : '';\n return (\n
\n {renderedChildren}\n
\n );\n }\n return
;\n }\n\n // Icon\n if (name === 'Icon') {\n return
;\n }\n\n // 기타: children이 있으면 컨테이너로, 없으면 범용 바\n if (children && children.length > 0) {\n return (\n
\n {renderChildren(children, animClass, iterCount, width)}\n
\n );\n }\n\n // 기본 폴백: 범용 스켈레톤 바\n return
;\n}\n\n/**\n * PageSkeleton — 단일 스켈레톤 렌더러 컴포넌트\n *\n * 엔진이 레이아웃 JSON의 컴포넌트 트리를 props로 전달하면,\n * 재귀적으로 순회하며 각 컴포넌트의 스켈레톤 플레이스홀더를 생성합니다.\n *\n * - 레이아웃 컨테이너(Div, Flex, Grid 등): className 유지, 자식 순회\n * - 텍스트 컴포넌트(H1~H6, P 등): 회색 바\n * - 인풋 컴포넌트(Input, Select 등): 사각형\n * - 미디어 컴포넌트(Img, Avatar 등): 큰 사각형\n * - 복합 컴포넌트(DataGrid, Tabs 등): 특화 스켈레톤\n * - iteration 블록: iteration_count 횟수만큼 반복\n * - 조건부 분기: 로딩/에러 상태 스킵, 콘텐츠 브랜치만 렌더\n *\n * @since engine-v1.24.0\n */\nexport const PageSkeleton: React.FC = ({ components, options }) => {\n const animClass = getAnimationClass(options.animation);\n\n // G7Core.useResponsive를 통해 viewport width 구독 (G7 표준 — 위지윅 overrideWidth 호환)\n const G7Core = (window as any).G7Core;\n const useResponsive = G7Core?.useResponsive;\n const responsiveValue = useResponsive?.();\n const width = responsiveValue\n ? responsiveValue.width\n : (typeof window !== 'undefined' ? window.innerWidth : 1024);\n\n return (\n \n {renderChildren(components, animClass, options.iteration_count, width)}\n
\n );\n};\n\nexport default PageSkeleton;\n","import React from 'react';\n\n/**\n * 페이지 로딩 컴포넌트 Props (엔진에서 전달)\n *\n * @since engine-v1.29.0\n */\nexport interface PageLoadingProps {\n options?: {\n text?: string;\n };\n}\n\n// G7Core.t() 번역 함수 참조\nconst t = (key: string, params?: Record) =>\n (window as any).G7Core?.t?.(key, params) ?? key;\n\n/**\n * 페이지 로딩 인디케이터 컴포넌트\n *\n * transition_overlay의 spinner 스타일에서 사용됩니다.\n * 엔진은 타겟 요소 내부에 빈 컨테이너만 삽입하며,\n * 포지셔닝/배경/z-index/다크모드 등 모든 비주얼 스타일은\n * 이 컴포넌트가 전적으로 결정합니다.\n *\n * React 트리 외부에 렌더링되므로 인라인 스타일 사용.\n *\n * @since engine-v1.29.0\n */\nconst PageLoading: React.FC = ({ options }) => {\n const isDark = document.documentElement.classList.contains('dark');\n\n const bgColor = isDark ? 'rgb(17,24,39)' : 'rgb(249,250,251)';\n const spinnerColor = isDark ? '#6b7280' : '#9ca3af';\n const textColor = isDark ? '#9ca3af' : '#6b7280';\n\n return (\n \n \n \n {options?.text || t('nav.loading')}\n \n
\n );\n};\n\nexport default PageLoading;\n","import React, { useMemo } from 'react';\nimport { Div } from '../basic/Div';\nimport { Button } from '../basic/Button';\nimport { Span } from '../basic/Span';\nimport type { EditorAttrs } from '../../types';\n\n// G7Core.t() 번역 함수 참조\nconst t = (key: string, params?: Record) =>\n (window as any).G7Core?.t?.(key, params) ?? key;\n\nexport interface PaginationProps {\n currentPage: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n maxVisiblePages?: number;\n showFirstLast?: boolean;\n className?: string;\n style?: React.CSSProperties;\n prevText?: string;\n nextText?: string;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n/**\n * 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread)\n */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * Pagination 집합 컴포넌트\n *\n * Button + Span 기본 컴포넌트를 조합하여 페이지네이션 UI를 구성합니다.\n * 페이지 번호 생성 알고리즘을 포함하며, 많은 페이지 수에 대해 효율적으로 렌더링합니다.\n *\n * @example\n * // 레이아웃 JSON 사용 예시\n * {\n * \"name\": \"Pagination\",\n * \"props\": {\n * \"currentPage\": \"{{pagination.current}}\",\n * \"totalPages\": \"{{pagination.total}}\",\n * \"maxVisiblePages\": 5,\n * \"showFirstLast\": true\n * }\n * }\n */\nexport const Pagination: React.FC = ({\n currentPage,\n totalPages,\n onPageChange,\n maxVisiblePages = 5,\n showFirstLast = true,\n className = '',\n style,\n prevText,\n nextText,\n id,\n editorAttrs,\n}) => {\n\n // 페이지 번호 생성 알고리즘\n const pageNumbers = useMemo(() => {\n const pages: (number | string)[] = [];\n\n if (totalPages <= maxVisiblePages + 2) {\n // 페이지가 적으면 모두 표시\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i);\n }\n } else {\n // 페이지가 많으면 축약 표시\n const halfVisible = Math.floor(maxVisiblePages / 2);\n\n let startPage = Math.max(2, currentPage - halfVisible);\n let endPage = Math.min(totalPages - 1, currentPage + halfVisible);\n\n // 시작 또는 끝 근처일 때 조정\n if (currentPage <= halfVisible + 1) {\n endPage = maxVisiblePages;\n } else if (currentPage >= totalPages - halfVisible) {\n startPage = totalPages - maxVisiblePages + 1;\n }\n\n // 첫 페이지\n pages.push(1);\n\n // 시작 생략 부호\n if (startPage > 2) {\n pages.push('...');\n }\n\n // 중간 페이지들\n for (let i = startPage; i <= endPage; i++) {\n pages.push(i);\n }\n\n // 끝 생략 부호\n if (endPage < totalPages - 1) {\n pages.push('...');\n }\n\n // 마지막 페이지\n if (totalPages > 1) {\n pages.push(totalPages);\n }\n }\n\n return pages;\n }, [currentPage, totalPages, maxVisiblePages]);\n\n const handlePageClick = (page: number) => {\n if (page < 1 || page > totalPages || page === currentPage) return;\n onPageChange(page);\n };\n\n const handlePrevious = () => {\n if (currentPage > 1) {\n onPageChange(currentPage - 1);\n }\n };\n\n const handleNext = () => {\n if (currentPage < totalPages) {\n onPageChange(currentPage + 1);\n }\n };\n\n return (\n \n {/* First Button */}\n {showFirstLast && (\n handlePageClick(1)}\n disabled={currentPage === 1}\n className=\"px-3 py-1 text-sm border border-gray-300 dark:border-gray-600 rounded hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-50 disabled:cursor-not-allowed text-gray-700 dark:text-gray-300 bg-white dark:bg-gray-800\"\n aria-label={t('common.first_page')}\n >\n «\n \n )}\n\n {/* Previous Button */}\n \n {prevText || <>‹}\n \n\n {/* Page Numbers */}\n
\n {pageNumbers.map((page, index) => {\n if (page === '...') {\n return (\n \n ...\n \n );\n }\n\n const pageNum = page as number;\n const isActive = pageNum === currentPage;\n\n return (\n handlePageClick(pageNum)}\n className={`px-3 py-1 text-sm border rounded ${\n isActive\n ? 'bg-blue-500 dark:bg-blue-600 text-white border-blue-500 dark:border-blue-600'\n : 'border-gray-300 dark:border-gray-600 hover:bg-gray-100 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300 bg-white dark:bg-gray-800'\n }`}\n aria-label={t('common.page_n', { n: pageNum })}\n aria-current={isActive ? 'page' : undefined}\n >\n {pageNum}\n \n );\n })}\n
\n\n {/* Next Button */}\n \n {nextText || <>›}\n \n\n {/* Last Button */}\n {showFirstLast && (\n handlePageClick(totalPages)}\n disabled={currentPage === totalPages}\n className=\"px-3 py-1 text-sm border border-gray-300 dark:border-gray-600 rounded hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-50 disabled:cursor-not-allowed text-gray-700 dark:text-gray-300 bg-white dark:bg-gray-800\"\n aria-label={t('common.last_page')}\n >\n »\n \n )}\n
\n );\n};\n","import React, { useState, useEffect } from 'react';\nimport { Form } from '../basic/Form';\nimport { Input } from '../basic/Input';\nimport { Button } from '../basic/Button';\nimport { Icon } from '../basic/Icon';\nimport { IconName } from '../basic/IconTypes';\nimport { Div } from '../basic/Div';\nimport { Span } from '../basic/Span';\nimport type { EditorAttrs } from '../../types';\n\n// G7Core.t() 번역 함수 참조\nconst t = (key: string, params?: Record) =>\n (window as any).G7Core?.t?.(key, params) ?? key;\n\nexport interface SearchSuggestion {\n id: string | number;\n text: string;\n}\n\nexport interface SearchBarProps {\n name?: string;\n placeholder?: string;\n value?: string;\n onChange?: (e: React.ChangeEvent) => void;\n onSubmit?: (e: React.FormEvent) => void;\n showButton?: boolean; // true: 검색 버튼 표시, false: 버튼 숨김 (기본값: false)\n suggestions?: SearchSuggestion[];\n onSuggestionClick?: (suggestion: SearchSuggestion) => void;\n showSuggestions?: boolean;\n className?: string;\n style?: React.CSSProperties;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n/**\n * 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread)\n */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * SearchBar 집합 컴포넌트\n *\n * 검색 입력 필드와 선택적 버튼을 제공하는 검색 바 컴포넌트입니다.\n * Enter 키를 누르면 항상 검색이 실행됩니다.\n *\n * 기본 컴포넌트 조합: Form + Input + Button + Icon + Div + Span\n *\n * @example\n * // 레이아웃 JSON 사용 예시 (버튼 없음)\n * {\n * \"name\": \"SearchBar\",\n * \"props\": {\n * \"placeholder\": \"검색어를 입력하세요\",\n * \"value\": \"{{query.search}}\",\n * \"showButton\": false\n * }\n * }\n *\n * @example\n * // 레이아웃 JSON 사용 예시 (버튼 있음)\n * {\n * \"name\": \"SearchBar\",\n * \"props\": {\n * \"placeholder\": \"검색어를 입력하세요\",\n * \"value\": \"{{query.search}}\",\n * \"showButton\": true\n * }\n * }\n */\nexport const SearchBar: React.FC = ({\n name = 'search',\n placeholder,\n value: controlledValue,\n onChange,\n onSubmit,\n showButton = false,\n suggestions = [],\n onSuggestionClick,\n showSuggestions = false,\n className = '',\n style,\n id,\n editorAttrs,\n}) => {\n // props로 전달된 값이 없으면 다국어 키 사용\n const resolvedPlaceholder = placeholder ?? t('common.search_placeholder');\n\n const [internalValue, setInternalValue] = useState('');\n const [isFocused, setIsFocused] = useState(false);\n const containerRef = React.useRef(null);\n const previousValueRef = React.useRef('');\n\n const value = controlledValue !== undefined ? controlledValue : internalValue;\n const shouldShowSuggestions = showSuggestions && isFocused && suggestions.length > 0 && value.length > 0;\n\n // controlledValue가 변경될 때 previousValueRef 동기화\n useEffect(() => {\n if (controlledValue !== undefined) {\n previousValueRef.current = controlledValue;\n }\n }, [controlledValue]);\n\n const handleChange = (e: React.ChangeEvent) => {\n const newValue = e.target.value;\n setInternalValue(newValue);\n onChange?.(e);\n\n // X 버튼으로 검색어를 지운 경우 감지\n // 이전 값이 있었는데 새 값이 빈 문자열이고, nativeEvent가 없는 경우 = X 버튼 클릭\n if (previousValueRef.current !== '' && newValue === '' && !(e.nativeEvent as any).inputType) {\n // X 버튼 클릭: 자동으로 검색 초기화\n setTimeout(() => {\n const formElement = containerRef.current?.querySelector('form');\n if (formElement) {\n formElement.requestSubmit();\n }\n }, 0);\n }\n\n previousValueRef.current = newValue;\n };\n\n const handleSuggestionClick = (suggestion: SearchSuggestion) => {\n setInternalValue(suggestion.text);\n const syntheticEvent = {\n target: { value: suggestion.text, name },\n } as React.ChangeEvent;\n onChange?.(syntheticEvent);\n onSuggestionClick?.(suggestion);\n setIsFocused(false);\n };\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n onSubmit?.(e);\n };\n\n return (\n
\n
\n
\n {/* Input wrapper */}\n
\n {/* 검색 아이콘 */}\n
\n \n
\n\n {/* 검색 입력 */}\n setIsFocused(true)}\n onBlur={() => setTimeout(() => setIsFocused(false), 200)}\n placeholder={resolvedPlaceholder}\n className=\"w-full pl-10 pr-4 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white text-sm\"\n />\n
\n\n {/* 검색 버튼 (showButton=true일 때만 표시) */}\n {showButton && (\n \n {t('common.search')}\n \n )}\n
\n
\n\n {/* 자동완성 제안 목록 */}\n {shouldShowSuggestions && (\n
\n {suggestions.map((suggestion) => (\n handleSuggestionClick(suggestion)}\n >\n
\n \n {suggestion.text}\n
\n
\n ))}\n
\n )}\n
\n );\n};\n","/**\n * AvatarUploader 컴포넌트\n *\n * 프로필 아바타 이미지 업로드를 위한 컴포넌트입니다.\n * - 원형 아바타 UI\n * - 파일 선택 시 즉시 업로드\n * - 업로드/삭제 API 지원\n * - 업로드 오류 표시\n * - 삭제 확인 다이얼로그\n *\n * @module composite/AvatarUploader\n */\n\nimport { useRef, useState, useCallback, useEffect } from 'react';\n\nimport { Div } from '../basic/Div';\nimport { Span } from '../basic/Span';\nimport { Button } from '../basic/Button';\nimport { Icon } from '../basic/Icon';\nimport { Label } from '../basic/Label';\nimport { Input } from '../basic/Input';\nimport { Img } from '../basic/Img';\nimport { Avatar } from './Avatar';\nimport type { EditorAttrs } from '../../types';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst G7Core = (window as any).G7Core;\n\nexport interface AvatarUploaderProps {\n /** 현재 아바타 URL */\n src?: string;\n /** 이미지 없을 때 표시할 텍스트 (이니셜) */\n fallbackText?: string;\n /** 아바타 크기 */\n size?: 'sm' | 'md' | 'lg' | 'xl' | '2xl';\n /** 업로드 API 엔드포인트 (기본: /api/me/avatar) */\n uploadEndpoint?: string;\n /** 삭제 API 엔드포인트 (기본: /api/me/avatar) */\n deleteEndpoint?: string;\n /** 업로드 성공 콜백 */\n onUploadSuccess?: (data: { avatar: string; attachment_id: number }) => void;\n /** 업로드 에러 콜백 */\n onUploadError?: (error: Error) => void;\n /** 삭제 성공 콜백 */\n onDeleteSuccess?: () => void;\n /** 삭제 에러 콜백 */\n onDeleteError?: (error: Error) => void;\n /** 삭제 버튼 표시 여부 */\n showDeleteButton?: boolean;\n /** 허용 파일 타입 (기본: image/*) */\n accept?: string;\n /** 최대 파일 크기 (MB, 기본: 5) */\n maxSize?: number;\n /** 추가 CSS 클래스 */\n className?: string;\n /** 업로드 버튼 텍스트 */\n uploadButtonText?: string;\n /** 삭제 버튼 텍스트 */\n deleteButtonText?: string;\n /** 읽기 전용 모드 */\n readOnly?: boolean;\n /** 삭제 확인 다이얼로그 표시 여부 (기본: true) */\n confirmDelete?: boolean;\n /** 삭제 확인 메시지 */\n deleteConfirmMessage?: string;\n /** 업로드 확인 다이얼로그 표시 여부 (기본: true) */\n confirmUpload?: boolean;\n /** 업로드 확인 메시지 */\n uploadConfirmMessage?: string;\n /** 업로드 성공 시 실행할 액션 배열 (G7Core.dispatch) */\n uploadSuccessActions?: Array>;\n /** 업로드 실패 시 실행할 액션 배열 */\n uploadErrorActions?: Array>;\n /** 삭제 성공 시 실행할 액션 배열 */\n deleteSuccessActions?: Array>;\n /** 삭제 실패 시 실행할 액션 배열 */\n deleteErrorActions?: Array>;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\n// AvatarUploader size를 Avatar size로 매핑\n// AvatarUploader는 프로필 편집용으로 더 큰 사이즈 사용\nconst avatarSizeMap: Record = {\n sm: 'md', // AvatarUploader sm → Avatar md (w-10, 40px)\n md: 'lg', // AvatarUploader md → Avatar lg (w-12, 48px)\n lg: 'xl', // AvatarUploader lg → Avatar xl (w-16, 64px)\n xl: '2xl', // AvatarUploader xl → Avatar 2xl (w-24, 96px)\n '2xl': '3xl', // AvatarUploader 2xl → Avatar 3xl (w-32, 128px)\n};\n\nexport function AvatarUploader({\n src,\n fallbackText = 'U',\n size = 'lg',\n uploadEndpoint = '/api/me/avatar',\n deleteEndpoint = '/api/me/avatar',\n onUploadSuccess,\n onUploadError,\n onDeleteSuccess,\n onDeleteError,\n showDeleteButton = true,\n accept = 'image/*',\n maxSize = 5,\n className = '',\n uploadButtonText,\n deleteButtonText,\n readOnly = false,\n confirmDelete = true,\n deleteConfirmMessage,\n confirmUpload = true,\n uploadConfirmMessage,\n uploadSuccessActions,\n uploadErrorActions,\n deleteSuccessActions,\n deleteErrorActions,\n id,\n editorAttrs,\n}: AvatarUploaderProps) {\n const inputRef = useRef(null);\n const [isUploading, setIsUploading] = useState(false);\n const [isDeleting, setIsDeleting] = useState(false);\n // undefined: 초기 상태(props 사용), null: 삭제됨, string: 새 이미지 URL\n const [localAvatarUrl, setLocalAvatarUrl] = useState(undefined);\n const [errorMessage, setErrorMessage] = useState(null);\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\n const [showUploadConfirm, setShowUploadConfirm] = useState(false);\n const [pendingFile, setPendingFile] = useState(null);\n const [previewUrl, setPreviewUrl] = useState(null);\n const inputId = useRef(`avatar-upload-${Math.random().toString(36).slice(2, 11)}`).current;\n\n // 파일 선택 시 미리보기 URL 생성\n useEffect(() => {\n if (pendingFile) {\n const url = URL.createObjectURL(pendingFile);\n setPreviewUrl(url);\n return () => URL.revokeObjectURL(url);\n } else {\n setPreviewUrl(null);\n }\n }, [pendingFile]);\n\n // 다국어 텍스트 가져오기\n const t = useCallback((key: string): string => {\n return G7Core?.t?.(key) ?? key;\n }, []);\n\n // CSRF 토큰 가져오기\n const getCsrfToken = useCallback((): string | null => {\n const match = document.cookie.match(/XSRF-TOKEN=([^;]+)/);\n if (match) {\n return decodeURIComponent(match[1]);\n }\n return null;\n }, []);\n\n // 인증 토큰 가져오기 (ApiClient에서 토큰 조회)\n const getAuthToken = useCallback((): string | null => {\n return G7Core?.api?.getToken?.() ?? null;\n }, []);\n\n // 실제 업로드 실행 함수\n const executeUpload = useCallback(async (file: File) => {\n setShowUploadConfirm(false);\n setPendingFile(null);\n setIsUploading(true);\n setErrorMessage(null);\n\n try {\n // FormData 생성\n const formData = new FormData();\n formData.append('avatar', file);\n\n // API 호출\n const csrfToken = getCsrfToken();\n const authToken = getAuthToken();\n const response = await fetch(uploadEndpoint, {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n ...(csrfToken && { 'X-XSRF-TOKEN': csrfToken }),\n ...(authToken && { Authorization: `Bearer ${authToken}` }),\n },\n credentials: 'include',\n body: formData,\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || t('attachment.upload_failed'));\n }\n\n const data = await response.json();\n const result = data.data || data;\n\n // 로컬 상태 즉시 업데이트 (빠른 피드백)\n if (result.avatar) {\n setLocalAvatarUrl(result.avatar);\n }\n\n onUploadSuccess?.(result);\n G7Core?.toast?.success?.(t('mypage.profile.avatar_uploaded'));\n\n // 액션 props가 있으면 dispatch, 없으면 기본 동작(user 리패치)\n if (uploadSuccessActions?.length) {\n uploadSuccessActions.forEach(action => G7Core?.dispatch?.(action));\n } else {\n G7Core?.refetchDataSource?.('user');\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n setErrorMessage(err.message);\n onUploadError?.(err);\n G7Core?.toast?.error?.(err.message);\n\n if (uploadErrorActions?.length) {\n uploadErrorActions.forEach(action => G7Core?.dispatch?.(action));\n }\n } finally {\n setIsUploading(false);\n // 입력 초기화 (같은 파일 재선택 가능)\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n }\n }, [uploadEndpoint, onUploadSuccess, onUploadError, getCsrfToken, getAuthToken, t]);\n\n // 파일 선택 핸들러\n const handleFileChange = useCallback(\n async (event: React.ChangeEvent) => {\n const file = event.target.files?.[0];\n if (!file) return;\n\n // 오류 상태 초기화\n setErrorMessage(null);\n\n // 파일 크기 검증\n const maxBytes = maxSize * 1024 * 1024;\n if (file.size > maxBytes) {\n const error = new Error(t('attachment.file_too_large').replace(':max', `${maxSize}MB`));\n setErrorMessage(error.message);\n onUploadError?.(error);\n G7Core?.toast?.error?.(error.message);\n return;\n }\n\n // 파일 타입 검증\n if (accept && !file.type.match(accept.replace('*', '.*'))) {\n const error = new Error(t('attachment.invalid_file_type'));\n setErrorMessage(error.message);\n onUploadError?.(error);\n G7Core?.toast?.error?.(error.message);\n return;\n }\n\n // 확인 다이얼로그 표시 또는 즉시 업로드\n if (confirmUpload) {\n setPendingFile(file);\n setShowUploadConfirm(true);\n } else {\n executeUpload(file);\n }\n },\n [maxSize, accept, onUploadError, confirmUpload, executeUpload, t]\n );\n\n // 삭제 실행 함수\n const executeDelete = useCallback(async () => {\n setShowDeleteConfirm(false);\n setIsDeleting(true);\n setErrorMessage(null);\n\n try {\n const csrfToken = getCsrfToken();\n const authToken = getAuthToken();\n const response = await fetch(deleteEndpoint, {\n method: 'DELETE',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n ...(csrfToken && { 'X-XSRF-TOKEN': csrfToken }),\n ...(authToken && { Authorization: `Bearer ${authToken}` }),\n },\n credentials: 'include',\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || t('attachment.delete_failed'));\n }\n\n // 로컬 상태 즉시 업데이트 (빠른 피드백)\n setLocalAvatarUrl(null);\n\n onDeleteSuccess?.();\n G7Core?.toast?.success?.(t('mypage.profile.avatar_deleted'));\n\n // 액션 props가 있으면 dispatch, 없으면 기본 동작(user 리패치)\n if (deleteSuccessActions?.length) {\n deleteSuccessActions.forEach(action => G7Core?.dispatch?.(action));\n } else {\n G7Core?.refetchDataSource?.('user');\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n setErrorMessage(err.message);\n onDeleteError?.(err);\n G7Core?.toast?.error?.(err.message);\n\n if (deleteErrorActions?.length) {\n deleteErrorActions.forEach(action => G7Core?.dispatch?.(action));\n }\n } finally {\n setIsDeleting(false);\n }\n }, [deleteEndpoint, onDeleteSuccess, onDeleteError, getCsrfToken, getAuthToken, t]);\n\n // 삭제 버튼 클릭 핸들러 (확인 다이얼로그 표시 또는 즉시 삭제)\n const handleDeleteClick = useCallback(() => {\n if (confirmDelete) {\n setShowDeleteConfirm(true);\n } else {\n executeDelete();\n }\n }, [confirmDelete, executeDelete]);\n\n // 삭제 취소\n const handleDeleteCancel = useCallback(() => {\n setShowDeleteConfirm(false);\n }, []);\n\n // 업로드 취소\n const handleUploadCancel = useCallback(() => {\n setShowUploadConfirm(false);\n setPendingFile(null);\n // 입력 초기화 (같은 파일 재선택 가능)\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n }, []);\n\n // 업로드 확인\n const handleUploadConfirm = useCallback(() => {\n if (pendingFile) {\n executeUpload(pendingFile);\n }\n }, [pendingFile, executeUpload]);\n\n // 로컬 상태 우선 사용: undefined면 props 사용, null이면 삭제됨, string이면 새 이미지\n const currentAvatarUrl = localAvatarUrl === undefined ? src : localAvatarUrl;\n const hasAvatar = !!currentAvatarUrl;\n\n // Avatar 컴포넌트에 전달할 사이즈\n const avatarSize = avatarSizeMap[size] || 'lg';\n\n // 현재 표시 모드 결정\n const isConfirmMode = showDeleteConfirm || showUploadConfirm;\n\n // 버튼 영역 렌더링\n const renderButtons = () => (\n
\n {/* 숨겨진 파일 입력 */}\n \n\n {/* 이미지 없을 때: 이미지 등록 버튼 */}\n {!hasAvatar && (\n \n {isUploading ? (\n \n ) : (\n \n )}\n {uploadButtonText || t('mypage.profile.register_avatar')}\n \n )}\n\n {/* 이미지 있을 때: 변경 + 삭제 버튼 */}\n {hasAvatar && (\n <>\n \n {isUploading ? (\n \n ) : (\n \n )}\n {uploadButtonText || t('common.change')}\n \n\n {showDeleteButton && (\n \n {isDeleting ? (\n \n ) : (\n \n )}\n {deleteButtonText || t('common.delete')}\n \n )}\n \n )}\n
\n );\n\n return (\n
\n {/* 아바타 이미지 - 업로드 확인 시 미리보기 표시 */}\n {showUploadConfirm && previewUrl ? (\n
\n \n
\n
\n ) : (\n \n )}\n\n {/* 버튼/확인 영역 */}\n {!readOnly && (\n
\n {/* 업로드 확인 박스 */}\n {showUploadConfirm && pendingFile && (\n
\n
\n \n \n {uploadConfirmMessage || t('mypage.profile.upload_avatar_confirm')}\n \n
\n
\n {pendingFile.name} ({(pendingFile.size / 1024 / 1024).toFixed(2)}MB)\n
\n
\n \n {isUploading ? (\n \n ) : (\n \n )}\n {t('common.confirm')}\n \n \n {t('common.cancel')}\n \n
\n
\n )}\n\n {/* 삭제 확인 박스 */}\n {showDeleteConfirm && (\n
\n
\n \n \n {deleteConfirmMessage || t('mypage.profile.delete_avatar_confirm')}\n \n
\n
\n \n {isDeleting ? (\n \n ) : (\n \n )}\n {t('common.delete')}\n \n \n {t('common.cancel')}\n \n
\n
\n )}\n\n {/* 기본 모드 - 버튼들 */}\n {!isConfirmMode && renderButtons()}\n
\n )}\n\n {/* 오류 메시지 표시 */}\n {errorMessage && !isConfirmMode && (\n
\n \n {errorMessage}\n
\n )}\n
\n );\n}\n\nexport default AvatarUploader;\n","/**\n * UserInfo 컴포넌트\n *\n * 게시글 작성자 정보를 표시하고 드롭다운 메뉴를 제공하는 통합 컴포넌트입니다.\n * - 작성자 이름, 서브텍스트 표시\n * - 클릭 시 드롭다운 메뉴 (회원인 경우)\n * - 비회원인 경우 배지 표시\n * - 탈퇴한 사용자인 경우 \"탈퇴한 사용자\" 텍스트 표시\n *\n * ## Props 우선순위\n * 명시적으로 전달한 props가 author에서 추출한 값보다 우선합니다.\n * - 이름: text > name > author.name\n * - 사용자 ID: userId > author.id\n * - 비회원 여부: isGuest > author.is_guest\n * - 탈퇴 여부: isWithdrawn || author.status === 'withdrawn'\n *\n * @example\n * // 레이아웃 JSON에서 사용 (author 객체 전달 - 권장)\n * {\n * \"type\": \"composite\",\n * \"name\": \"UserInfo\",\n * \"props\": {\n * \"author\": \"{{post.author}}\",\n * \"subText\": \"{{post.created_at | datetime}}\"\n * }\n * }\n *\n * @example\n * // author와 개별 props 혼합 사용 (개별 props가 우선)\n * {\n * \"type\": \"composite\",\n * \"name\": \"UserInfo\",\n * \"props\": {\n * \"author\": \"{{post.author}}\",\n * \"name\": \"관리자\",\n * \"subText\": \"{{post.created_at | datetime}}\"\n * }\n * }\n * // author.name이 \"홍길동\"이어도 \"관리자\"가 표시됨\n */\n\nimport React, { useState, useRef, useEffect, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Div } from '../basic/Div';\nimport { Button } from '../basic/Button';\nimport { Span } from '../basic/Span';\nimport { Icon } from '../basic/Icon';\nimport type { EditorAttrs } from '../../types';\n\n// G7Core 참조\nconst getG7Core = () => (window as any).G7Core;\n\n// G7Core.t() 번역 함수 참조\nconst t = (key: string, params?: Record) =>\n (window as any).G7Core?.t?.(key, params) ?? key;\n\n/**\n * 메뉴 항목 설정 인터페이스\n */\nexport interface MenuItemConfig {\n /** 메뉴 항목 식별자 */\n key: string;\n /** 표시 텍스트 */\n label: string;\n /** 아이콘 이름 (선택) */\n icon?: string;\n /** 이동 경로 ({{userId}} 치환 지원) */\n path?: string;\n /** 커스텀 클릭 핸들러 (선택) */\n onClick?: () => void;\n /** 표시 여부 (기본: true) */\n show?: boolean;\n}\n\n/**\n * Author 객체 인터페이스\n */\nexport interface AuthorInfo {\n /** 사용자 ID */\n id?: string | number;\n /** 사용자 UUID */\n uuid?: string;\n /** 사용자 이름 */\n name?: string;\n /** 아바타 URL */\n avatar?: string;\n /** 사용자 상태 */\n status?: 'active' | 'inactive' | 'blocked' | 'withdrawn';\n /** 비회원 여부 */\n is_guest?: boolean;\n}\n\nexport interface UserInfoProps {\n /**\n * 작성자 객체 (권장)\n * API 응답의 author 객체를 그대로 전달하면 됩니다.\n * 개별 props(name, userId 등)가 함께 전달되면 개별 props가 우선합니다.\n */\n author?: AuthorInfo;\n\n /**\n * 사용자 이름 (author.name보다 우선)\n */\n name?: string;\n\n /**\n * 사용자 ID (author.id보다 우선)\n */\n userId?: string | number;\n\n /**\n * 표시할 서브 텍스트 (날짜, 시간 등)\n */\n subText?: string;\n\n /**\n * 서브 텍스트의 title 속성 (tooltip용 원본 datetime)\n */\n subTextTitle?: string;\n\n /**\n * 비회원 여부 (author.is_guest보다 우선)\n * @default false\n */\n isGuest?: boolean;\n\n /**\n * 탈퇴한 사용자 여부 (author.status === 'withdrawn'과 OR 조건)\n * @default false\n */\n isWithdrawn?: boolean;\n\n /**\n * 드롭다운 표시 여부\n * @default true\n */\n showDropdown?: boolean;\n\n /**\n * 프로필 클릭 가능 여부 (드롭다운이 없을 때)\n * @default true\n */\n clickable?: boolean;\n\n /**\n * 사용자 프로필 경로 패턴\n * @default '/users/{userId}'\n */\n profilePath?: string;\n\n /**\n * 추가 className\n */\n className?: string;\n\n /**\n * 레이아웃 방향\n * @default 'vertical'\n */\n layout?: 'vertical' | 'horizontal';\n\n /**\n * 레이아웃 JSON에서 text 속성으로 전달되는 이름\n * name보다 우선순위가 높음\n */\n text?: string;\n\n /**\n * 이벤트 버블링 방지 여부\n * @default false\n */\n stopPropagation?: boolean;\n\n // 메뉴 커스터마이징\n /** 커스텀 메뉴 항목 (지정 시 기본 메뉴 대체) */\n menuItems?: MenuItemConfig[];\n /** 숨길 기본 메뉴 항목 키 배열 */\n hideMenuItems?: string[];\n /** 기본 메뉴에 추가할 항목 */\n appendMenuItems?: MenuItemConfig[];\n\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n/**\n * 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread)\n */\n editorAttrs?: EditorAttrs;\n}\n\n// 레이아웃별 컨테이너 클래스\nconst LAYOUT_CLASSES = {\n horizontal: 'flex items-center gap-1.5',\n vertical: 'flex flex-col items-start',\n} as const;\n\n// 기본 메뉴 항목 생성\nconst createDefaultMenuItems = (): MenuItemConfig[] => [\n {\n key: 'view_profile',\n label: t('userinfo.view_profile'),\n icon: 'user',\n path: '/users/{{userId}}',\n },\n {\n key: 'view_posts',\n label: t('userinfo.view_posts'),\n icon: 'file-lines',\n path: '/users/{{userId}}/posts',\n },\n];\n\n/**\n * 서브텍스트 렌더링 컴포넌트\n */\nconst SubText: React.FC<{ text?: string; title?: string }> = ({ text, title }) => {\n if (!text) return null;\n return (\n \n {text}\n \n );\n};\n\n/**\n * UserInfo 컴포넌트\n */\nexport const UserInfo: React.FC = ({\n author,\n name,\n userId,\n subText,\n subTextTitle,\n isGuest = false,\n isWithdrawn = false,\n showDropdown = true,\n clickable = true,\n profilePath = '/users/{userId}',\n className = '',\n layout = 'vertical',\n text,\n stopPropagation = false,\n menuItems,\n hideMenuItems = [],\n appendMenuItems = [],\n id,\n editorAttrs,\n}) => {\n // 명시적 props > author 추출값 순서로 결정\n const actualUserId = userId ?? author?.uuid;\n const actualIsGuest = isGuest || author?.is_guest || false;\n const actualIsWithdrawn = isWithdrawn || author?.status === 'withdrawn';\n\n // 이름 우선순위: text > name > author.name\n // 탈퇴한 사용자는 \"탈퇴한 사용자\" 텍스트 표시\n const actualName = actualIsWithdrawn\n ? t('userinfo.withdrawn_user')\n : (text ?? name ?? author?.name ?? '');\n\n // 드롭다운 상태\n const [showMenu, setShowMenu] = useState(false);\n const [menuPosition, setMenuPosition] = useState({ top: 0, left: 0 });\n const containerRef = useRef(null);\n const dropdownRef = useRef(null);\n const buttonRef = useRef(null);\n\n // 프로필 경로 생성\n const actualProfilePath = profilePath.replace('{userId}', String(actualUserId ?? ''));\n\n // 컨테이너 클래스\n const containerClass = `${LAYOUT_CLASSES[layout]} ${className}`;\n\n // 메뉴 외부 클릭 시 닫기 + 스크롤/리사이즈 시 닫기\n useEffect(() => {\n if (!showMenu) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node;\n const isInsideContainer = containerRef.current?.contains(target);\n const isInsideDropdown = dropdownRef.current?.contains(target);\n\n if (!isInsideContainer && !isInsideDropdown) {\n setShowMenu(false);\n }\n };\n\n const handleScrollOrResize = () => setShowMenu(false);\n\n document.addEventListener('mousedown', handleClickOutside);\n window.addEventListener('scroll', handleScrollOrResize, true);\n window.addEventListener('resize', handleScrollOrResize);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n window.removeEventListener('scroll', handleScrollOrResize, true);\n window.removeEventListener('resize', handleScrollOrResize);\n };\n }, [showMenu]);\n\n // 최종 메뉴 항목 계산\n const getMenuItems = useCallback((): MenuItemConfig[] => {\n // 커스텀 메뉴가 지정된 경우 그대로 사용\n if (menuItems && menuItems.length > 0) {\n return menuItems.filter((item) => item.show !== false);\n }\n\n // 기본 메뉴에서 숨길 항목 제거\n const defaultItems = createDefaultMenuItems();\n let items = defaultItems.filter(\n (item) => !hideMenuItems.includes(item.key) && item.show !== false\n );\n\n // 추가 항목 병합\n if (appendMenuItems && appendMenuItems.length > 0) {\n items = [...items, ...appendMenuItems.filter((item) => item.show !== false)];\n }\n\n return items;\n }, [menuItems, hideMenuItems, appendMenuItems]);\n\n // 드롭다운 위치 계산 (뷰포트 기준 fixed 위치 — Portal 사용)\n const updateMenuPosition = useCallback(() => {\n if (buttonRef.current) {\n const buttonRect = buttonRef.current.getBoundingClientRect();\n setMenuPosition({\n top: buttonRect.bottom + 4,\n left: buttonRect.left,\n });\n }\n }, []);\n\n // 메뉴 항목 클릭 핸들러\n const handleMenuItemClick = useCallback((item: MenuItemConfig, e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n setShowMenu(false);\n\n if (item.onClick) {\n item.onClick();\n } else if (item.path) {\n const path = item.path.replace(/\\{\\{userId\\}\\}/g, String(actualUserId ?? ''));\n const g7Core = getG7Core();\n if (g7Core?.navigate) {\n g7Core.navigate(path);\n } else {\n window.location.href = path;\n }\n }\n }, [actualUserId]);\n\n // 클릭 핸들러 (드롭다운 또는 프로필 이동)\n const handleClick = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n\n if (stopPropagation) {\n e.stopPropagation();\n }\n\n // 비회원이거나 userId가 없으면 아무 동작 안 함\n if (actualIsGuest || !actualUserId) {\n return;\n }\n\n // 드롭다운이 활성화된 경우\n if (showDropdown) {\n if (!showMenu) {\n updateMenuPosition();\n }\n setShowMenu((prev) => !prev);\n }\n // 드롭다운이 비활성화되고 클릭 가능한 경우\n else if (clickable) {\n getG7Core()?.navigate?.(actualProfilePath);\n }\n }, [stopPropagation, actualIsGuest, actualUserId, showDropdown, showMenu, updateMenuPosition, clickable, actualProfilePath]);\n\n // 비회원인 경우\n if (actualIsGuest || !actualUserId) {\n return (\n
\n
\n {actualName}\n \n {t('userinfo.guest_badge')}\n \n
\n \n
\n );\n }\n\n // 탈퇴한 사용자인 경우\n if (actualIsWithdrawn) {\n return (\n
\n \n {actualName}\n \n \n
\n );\n }\n\n // 회원인 경우\n const finalMenuItems = getMenuItems();\n // className에 text- 색상 클래스가 있으면 nameButtonClass의 기본 색상을 대체\n const hasCustomColor = /\\btext-\\S+/.test(className);\n const defaultColorClass = hasCustomColor ? '' : 'text-gray-900 dark:text-white';\n const nameButtonClass = (showDropdown || clickable)\n ? `${defaultColorClass} hover:text-blue-600 dark:hover:text-blue-400 cursor-pointer font-medium`.trim()\n : `${defaultColorClass} font-medium`.trim();\n\n return (\n
\n
\n \n {actualName}\n \n \n
\n\n {/* 드롭다운 메뉴 - Portal로 document.body에 fixed 배치 (overflow-hidden 부모 회피) */}\n {showDropdown && showMenu && finalMenuItems.length > 0 && createPortal(\n \n {finalMenuItems.map((item) => (\n handleMenuItemClick(item, e)}\n className=\"flex items-center justify-start gap-2 w-full text-left px-3 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 cursor-pointer\"\n data-testid={`menu-item-${item.key}`}\n >\n {item.icon && }\n {item.label}\n \n ))}\n
,\n document.body\n )}\n
\n );\n};\n","import React from 'react';\nimport { Nav } from '../basic/Nav';\nimport { Button } from '../basic/Button';\nimport { Icon } from '../basic/Icon';\nimport { IconName } from '../basic/IconTypes';\nimport { Div } from '../basic/Div';\nimport { Span } from '../basic/Span';\nimport { Select } from '../basic/Select';\nimport type { EditorAttrs } from '../../types';\n\nexport interface Tab {\n id: string | number;\n label: string;\n iconName?: IconName;\n disabled?: boolean;\n badge?: string | number;\n}\n\nexport interface TabNavigationProps {\n tabs: Tab[];\n activeTabId?: string | number;\n onTabChange?: (tabId: string | number) => void;\n variant?: 'default' | 'pills' | 'underline';\n className?: string;\n style?: React.CSSProperties;\n /** 숨길 탭 ID 목록 (동적 조건부 탭 노출용) */\n hiddenTabIds?: (string | number)[];\n /** 모바일 전환 임계값 (px). 기본값 768 — G7 ResponsiveContext mobile 프리셋과 동일 */\n mobileBreakpoint?: number;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n/**\n * 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread)\n */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * TabNavigation 집합 컴포넌트\n *\n * 탭 네비게이션을 제공하는 컴포넌트입니다.\n * 여러 탭을 전환할 수 있으며, 아이콘과 뱃지를 지원합니다.\n *\n * 반응형: G7Core.useResponsive() hook으로 화면 너비를 구독하여\n * mobileBreakpoint(기본 768px) 미만일 때 Select 드롭다운으로 자동 전환됩니다.\n * Tailwind hidden md:flex 분기를 사용하지 않으므로 위지윅 편집기의 디바이스 미리보기와도 호환됩니다.\n *\n * **주의**: 이 컴포넌트는 순수 네비게이션 UI만 제공하며,\n * 실제 탭 컨텐츠는 부모 컴포넌트에서 activeTabId를 기반으로 조건부 렌더링해야 합니다.\n *\n * 기본 컴포넌트 조합: Nav + Button + Icon + Div + Span + Select\n *\n * @example\n * // 레이아웃 JSON 사용 예시\n * {\n * \"name\": \"TabNavigation\",\n * \"props\": {\n * \"activeTabId\": 1,\n * \"tabs\": [\n * {\"id\": 1, \"label\": \"프로필\", \"iconName\": \"user\"},\n * {\"id\": 2, \"label\": \"설정\", \"iconName\": \"cog\", \"badge\": 3},\n * {\"id\": 3, \"label\": \"문의내역\", \"iconName\": \"comment\"}\n * ],\n * \"hiddenTabIds\": \"{{_global.modules?.['sirsoft-ecommerce']?.inquiry?.board_slug ? [] : ['inquiries']}}\"\n * }\n * }\n */\nexport const TabNavigation: React.FC = ({\n tabs,\n activeTabId,\n onTabChange,\n variant = 'underline',\n className = '',\n style,\n hiddenTabIds = [],\n mobileBreakpoint = 768,\n id,\n editorAttrs,\n}) => {\n // G7Core.useResponsive를 통해 반응형 상태 구독 (G7 표준)\n const G7Core = (window as any).G7Core;\n const useResponsive = G7Core?.useResponsive;\n const responsiveValue = useResponsive?.();\n const isMobile = responsiveValue\n ? responsiveValue.width < mobileBreakpoint\n : typeof window !== 'undefined' && window.innerWidth < mobileBreakpoint;\n\n const handleTabClick = (tab: Tab) => {\n if (!tab.disabled && tab.id !== activeTabId) {\n onTabChange?.(tab.id);\n }\n };\n\n const handleSelectChange = (\n e: React.ChangeEvent | { target: { value: string | number } }\n ) => {\n const selectedId = e.target.value;\n const numericId = Number(selectedId);\n const finalId =\n typeof selectedId === 'string' && selectedId !== '' && !Number.isNaN(numericId)\n ? numericId\n : selectedId;\n const selectedTab = tabs.find((tab) => String(tab.id) === String(finalId));\n if (selectedTab) {\n handleTabClick(selectedTab);\n }\n };\n\n const visibleTabs = hiddenTabIds.length > 0\n ? tabs.filter((tab) => !hiddenTabIds.includes(tab.id))\n : tabs;\n\n // 모바일: Select 드롭다운 단일 렌더\n // 데스크톱 분기와 동일하게 id/editorAttrs 를 루트에 spread 해야 레이아웃 편집기가\n // 모바일 디바이스 미리보기에서도 이 노드를 선택/측정할 수 있다(모든 렌더 분기 패리티 —\n // 누락 시 모바일 프리뷰에서 data-editor-* 가 사라져 캔버스에서 선택 불가).\n if (isMobile) {\n return (\n
\n ({\n value: String(tab.id),\n label: tab.badge !== undefined ? `${tab.label} (${tab.badge})` : tab.label,\n disabled: tab.disabled,\n }))}\n className=\"w-full\"\n />\n
\n );\n }\n\n const getTabClasses = (tab: Tab) => {\n const isActive = tab.id === activeTabId;\n const baseClasses =\n 'flex items-center gap-2 px-3 py-2 font-medium text-sm transition-all shrink-0 whitespace-nowrap';\n\n if (tab.disabled) {\n return `${baseClasses} opacity-50 cursor-not-allowed text-gray-400 dark:text-gray-600`;\n }\n\n switch (variant) {\n case 'pills':\n return isActive\n ? `${baseClasses} bg-blue-600 dark:bg-blue-500 text-white rounded-lg`\n : `${baseClasses} text-gray-600 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg`;\n\n case 'underline':\n return isActive\n ? `${baseClasses} text-gray-900 dark:text-white border-b-2 border-gray-900 dark:border-white`\n : `${baseClasses} text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-200 border-b-2 border-transparent hover:border-gray-300 dark:hover:border-gray-600`;\n\n case 'default':\n default:\n return isActive\n ? `${baseClasses} text-blue-600 dark:text-blue-400 bg-blue-50 dark:bg-blue-900/20 border-b-2 border-blue-600 dark:border-blue-400`\n : `${baseClasses} text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-200 hover:bg-gray-50 dark:hover:bg-gray-700 border-b-2 border-transparent`;\n }\n };\n\n const navClasses =\n variant === 'underline'\n ? 'flex gap-0 border-b border-gray-200 dark:border-gray-700'\n : 'flex gap-2';\n\n // 데스크톱: 탭 버튼 단일 렌더\n return (\n
\n \n
\n );\n};\n","// e2e:allow 편집기 ComponentRegistry 등록맵에 SlotContainer 추가(편집기 IIFE 번들 포함 — 헤더 통화 슬롯 렌더). 편집기 캔버스 렌더는 Chrome MCP 라이브 실측 + Vitest 로 검증. 사용자 사이트 런타임 무변경.\n/**\n * sirsoft-basic 템플릿 Composite 컴포넌트 등록\n *\n * 이 파일에서 모든 Composite 컴포넌트를 export합니다.\n * G7Core에서 자동으로 로드하여 레이아웃 JSON에서 사용할 수 있습니다.\n */\n\n// 레이아웃 컴포넌트\nexport { default as Header } from './Header';\nexport { default as Footer } from './Footer';\nexport { default as MobileNav } from './MobileNav';\nexport { NotificationCenter } from './NotificationCenter';\nexport type { NotificationCenterProps, NotificationItem } from './NotificationCenter';\n\n// 상품 관련 컴포넌트\nexport { default as ProductCard } from './ProductCard';\nexport { default as ImageGallery } from './ImageGallery';\nexport { default as ProductImageViewer } from './ProductImageViewer';\nexport { default as QuantitySelector } from './QuantitySelector';\n\n// 게시판 관련 컴포넌트\nexport { default as PostReactions } from './PostReactions';\nexport { default as RichTextEditor } from './RichTextEditor';\nexport { HtmlContent } from './HtmlContent';\nexport { HtmlEditor } from './HtmlEditor';\n\n// 콘텐츠 유틸리티\nexport { ExpandableContent } from './ExpandableContent';\n\n// 공통 컴포넌트\nexport { default as FileUploader } from './FileUploader';\nexport { ConfirmDialog } from './ConfirmDialog';\nexport { default as SocialLoginButtons } from './SocialLoginButtons';\nexport { default as Toast } from './Toast';\nexport { default as PageTransitionIndicator } from './PageTransitionIndicator';\nexport { default as PageTransitionBlur } from './PageTransitionBlur';\nexport { default as PageSkeleton } from './PageSkeleton';\nexport { default as PageLoading } from './PageLoading';\nexport { default as ThemeToggle } from './ThemeToggle';\nexport { Pagination } from './Pagination';\nexport { SearchBar } from './SearchBar';\nexport { Avatar } from './Avatar';\nexport { AvatarUploader } from './AvatarUploader';\nexport { UserInfo } from './UserInfo';\nexport { Modal } from './Modal';\nexport { TabNavigation } from './TabNavigation';\nexport { SlotContainer } from './SlotContainer';\n// AddressSearch는 별도 컴포넌트가 아닌 sirsoft-daum_postcode 플러그인의 extension_point 방식 사용\n\n/**\n * 컴포넌트 등록 맵\n *\n * G7Core 템플릿 엔진에서 레이아웃 JSON의 컴포넌트 이름을\n * 실제 컴포넌트로 매핑할 때 사용합니다.\n *\n * @example\n * // 레이아웃 JSON에서 사용\n * {\n * \"type\": \"composite\",\n * \"name\": \"Header\",\n * \"props\": { ... }\n * }\n */\nexport const compositeComponents = {\n // 레이아웃\n Header: () => import('./Header'),\n Footer: () => import('./Footer'),\n MobileNav: () => import('./MobileNav'),\n // 슬롯 컨테이너 — 모듈 주입 UI(헤더 통화 셀렉터 등)를 떙겨 렌더. 등록맵 누락 시\n // 편집기 캔버스 IIFE 번들에 포함되지 않아 \"Component not found in bundle\" 로 렌더 실패한다\n // (운영 사이트는 별도 등록 경로라 정상이나 편집기 미리보기에서만 슬롯이 통째로 비는 회귀).\n SlotContainer: () => import('./SlotContainer'),\n NotificationCenter: () => import('./NotificationCenter'),\n\n // 상품\n ProductCard: () => import('./ProductCard'),\n ImageGallery: () => import('./ImageGallery'),\n ProductImageViewer: () => import('./ProductImageViewer'),\n QuantitySelector: () => import('./QuantitySelector'),\n\n // 게시판\n PostReactions: () => import('./PostReactions'),\n RichTextEditor: () => import('./RichTextEditor'),\n HtmlContent: () => import('./HtmlContent'),\n HtmlEditor: () => import('./HtmlEditor'),\n\n // 콘텐츠 유틸리티\n ExpandableContent: () => import('./ExpandableContent'),\n\n // 공통\n FileUploader: () => import('./FileUploader'),\n ConfirmDialog: () => import('./ConfirmDialog'),\n SocialLoginButtons: () => import('./SocialLoginButtons'),\n Toast: () => import('./Toast'),\n PageTransitionIndicator: () => import('./PageTransitionIndicator'),\n PageTransitionBlur: () => import('./PageTransitionBlur'),\n PageSkeleton: () => import('./PageSkeleton'),\n PageLoading: () => import('./PageLoading'),\n ThemeToggle: () => import('./ThemeToggle'),\n Pagination: () => import('./Pagination'),\n SearchBar: () => import('./SearchBar'),\n Avatar: () => import('./Avatar'),\n AvatarUploader: () => import('./AvatarUploader'),\n UserInfo: () => import('./UserInfo'),\n Modal: () => import('./Modal'),\n TabNavigation: () => import('./TabNavigation'),\n // AddressSearch는 sirsoft-daum_postcode 플러그인의 extension_point 방식 사용\n};\n\n/**\n * 컴포넌트 타입 정의 (TypeScript 자동완성용)\n */\nexport type CompositeComponentName = keyof typeof compositeComponents;\n","import React from 'react';\nimport { Div } from '../basic/Div';\nimport type { EditorAttrs } from '../../types';\n\nexport interface ContainerProps {\n /**\n * DOM id 속성\n */\n id?: string;\n\n /**\n * 사용자 정의 클래스\n */\n className?: string;\n\n /**\n * 인라인 스타일\n */\n style?: React.CSSProperties;\n\n /**\n * 자식 요소\n */\n children?: React.ReactNode;\n\n /**\n * 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread)\n */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * Container 컴포넌트\n *\n * 단순한 div 래퍼입니다. id와 className을 지정할 수 있습니다.\n */\nexport const Container: React.FC = ({\n id,\n className,\n style,\n children,\n editorAttrs,\n}) => {\n return (\n
\n {children}\n
\n );\n};\n","import React from 'react';\nimport { Div } from '../basic/Div';\nimport type { EditorAttrs } from '../../types';\n\nexport interface GridProps {\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n\n /**\n * Grid 열 개수\n */\n cols?: number;\n\n /**\n * 반응형 열 개수 (브레이크포인트별)\n */\n responsive?: {\n sm?: number;\n md?: number;\n lg?: number;\n xl?: number;\n '2xl'?: number;\n };\n\n /**\n * Gap 크기 (Tailwind 스케일: 0, 1, 2, 3, 4, 5, 6, 8, 10, 12, 16, 20, 24)\n */\n gap?: number;\n\n /**\n * Row gap (행 간격)\n */\n rowGap?: number;\n\n /**\n * Column gap (열 간격)\n */\n colGap?: number;\n\n /**\n * 자동 행 크기 조정\n */\n autoRows?: 'auto' | 'min' | 'max' | 'fr';\n\n /**\n * 자동 열 크기 조정\n */\n autoCols?: 'auto' | 'min' | 'max' | 'fr';\n\n /**\n * Grid auto-flow 설정\n */\n flow?: 'row' | 'col' | 'dense' | 'row-dense' | 'col-dense';\n\n /**\n * 사용자 정의 클래스\n */\n className?: string;\n\n /**\n * 인라인 스타일\n */\n style?: React.CSSProperties;\n\n /**\n * 자식 요소\n */\n children?: React.ReactNode;\n\n /**\n * 클릭 이벤트 핸들러\n */\n onClick?: () => void;\n\n /**\n * 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread)\n */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * Grid 레이아웃 컴포넌트\n *\n * CSS Grid를 활용한 반응형 그리드 시스템을 제공합니다.\n * gap, span, auto-flow 등의 그리드 속성을 제어할 수 있습니다.\n *\n * @example\n * // 기본 3열 그리드\n * \n *
Item 1
\n *
Item 2
\n *
Item 3
\n *
\n *\n * @example\n * // 반응형 그리드\n * \n *
Item 1
\n *
Item 2
\n * \n */\nexport const Grid: React.FC = ({\n id,\n children,\n cols = 1,\n responsive,\n gap,\n rowGap,\n colGap,\n autoRows,\n autoCols,\n flow = 'row',\n className = '',\n style,\n onClick,\n editorAttrs,\n}) => {\n // Tailwind CSS 클래스 생성\n const classes: string[] = ['grid'];\n\n // Grid 열 개수\n if (cols) {\n classes.push(`grid-cols-${cols}`);\n }\n\n // 반응형 그리드\n if (responsive) {\n if (responsive.sm) classes.push(`sm:grid-cols-${responsive.sm}`);\n if (responsive.md) classes.push(`md:grid-cols-${responsive.md}`);\n if (responsive.lg) classes.push(`lg:grid-cols-${responsive.lg}`);\n if (responsive.xl) classes.push(`xl:grid-cols-${responsive.xl}`);\n if (responsive['2xl']) classes.push(`2xl:grid-cols-${responsive['2xl']}`);\n }\n\n // Gap\n if (gap !== undefined && gap > 0) {\n classes.push(`gap-${gap}`);\n }\n\n // Row gap\n if (rowGap !== undefined && rowGap > 0) {\n classes.push(`gap-y-${rowGap}`);\n }\n\n // Column gap\n if (colGap !== undefined && colGap > 0) {\n classes.push(`gap-x-${colGap}`);\n }\n\n // Auto rows\n if (autoRows) {\n const autoRowsMap: Record = {\n auto: 'auto-rows-auto',\n min: 'auto-rows-min',\n max: 'auto-rows-max',\n fr: 'auto-rows-fr',\n };\n classes.push(autoRowsMap[autoRows]);\n }\n\n // Auto columns\n if (autoCols) {\n const autoColsMap: Record = {\n auto: 'auto-cols-auto',\n min: 'auto-cols-min',\n max: 'auto-cols-max',\n fr: 'auto-cols-fr',\n };\n classes.push(autoColsMap[autoCols]);\n }\n\n // Grid flow\n const flowMap: Record = {\n row: 'grid-flow-row',\n col: 'grid-flow-col',\n dense: 'grid-flow-dense',\n 'row-dense': 'grid-flow-row-dense',\n 'col-dense': 'grid-flow-col-dense',\n };\n classes.push(flowMap[flow]);\n\n // 사용자 정의 클래스 추가\n if (className) {\n classes.push(className);\n }\n\n return (\n
\n {children}\n
\n );\n};\n","import React from 'react';\nimport { Div } from '../basic/Div';\nimport type { EditorAttrs } from '../../types';\n\nexport interface FlexProps {\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n\n /**\n * Flex 방향\n */\n direction?: 'row' | 'row-reverse' | 'col' | 'col-reverse';\n\n /**\n * Justify content (주축 정렬)\n */\n justify?: 'start' | 'end' | 'center' | 'between' | 'around' | 'evenly';\n\n /**\n * Align items (교차축 정렬)\n */\n align?: 'start' | 'end' | 'center' | 'baseline' | 'stretch';\n\n /**\n * Flex wrap 설정\n */\n wrap?: 'wrap' | 'nowrap' | 'wrap-reverse';\n\n /**\n * Gap 크기 (Tailwind 스케일: 0, 1, 2, 3, 4, 5, 6, 8, 10, 12, 16, 20, 24)\n */\n gap?: number;\n\n /**\n * Flex grow (자식 요소 확장)\n */\n grow?: boolean | number;\n\n /**\n * Flex shrink (자식 요소 축소)\n */\n shrink?: boolean | number;\n\n /**\n * 사용자 정의 클래스\n */\n className?: string;\n\n /**\n * 인라인 스타일\n */\n style?: React.CSSProperties;\n\n /**\n * 자식 요소\n */\n children?: React.ReactNode;\n\n /**\n * 클릭 이벤트 핸들러\n */\n onClick?: () => void;\n\n /**\n * 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread)\n */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * Flex 레이아웃 컴포넌트\n *\n * Flexbox를 활용한 유연한 레이아웃을 제공합니다.\n * justify, align, wrap 등의 옵션을 통해 다양한 정렬을 구현할 수 있습니다.\n *\n * @example\n * // 가로 정렬 (가운데 정렬)\n * \n *
Item 1
\n *
Item 2
\n *
\n *\n * @example\n * // 세로 정렬 (양 끝 정렬)\n * \n *
Top
\n *
Bottom
\n *
\n */\nexport const Flex: React.FC = ({\n id,\n children,\n direction = 'row',\n justify = 'start',\n align = 'stretch',\n wrap = 'nowrap',\n gap = 0,\n grow = false,\n shrink = true,\n className = '',\n style,\n onClick,\n editorAttrs,\n}) => {\n // Tailwind CSS 클래스 생성\n const classes: string[] = ['flex'];\n\n // Flex direction\n const directionMap: Record = {\n row: 'flex-row',\n 'row-reverse': 'flex-row-reverse',\n col: 'flex-col',\n 'col-reverse': 'flex-col-reverse',\n };\n classes.push(directionMap[direction]);\n\n // Flex wrap\n const wrapMap: Record = {\n wrap: 'flex-wrap',\n nowrap: 'flex-nowrap',\n 'wrap-reverse': 'flex-wrap-reverse',\n };\n classes.push(wrapMap[wrap]);\n\n // Justify content\n const justifyMap: Record = {\n start: 'justify-start',\n end: 'justify-end',\n center: 'justify-center',\n between: 'justify-between',\n around: 'justify-around',\n evenly: 'justify-evenly',\n };\n classes.push(justifyMap[justify]);\n\n // Align items\n const alignMap: Record = {\n start: 'items-start',\n end: 'items-end',\n center: 'items-center',\n baseline: 'items-baseline',\n stretch: 'items-stretch',\n };\n classes.push(alignMap[align]);\n\n // Gap\n if (gap > 0) {\n classes.push(`gap-${gap}`);\n }\n\n // Flex grow\n if (grow === true) {\n classes.push('flex-grow');\n } else if (typeof grow === 'number' && grow > 0) {\n classes.push(`flex-grow-${grow}`);\n }\n\n // Flex shrink\n if (shrink === false) {\n classes.push('shrink-0');\n } else if (shrink === true) {\n classes.push('flex-shrink');\n } else if (typeof shrink === 'number' && shrink > 0) {\n classes.push(`flex-shrink-${shrink}`);\n }\n\n // 사용자 정의 클래스 추가\n if (className) {\n classes.push(className);\n }\n\n return (\n
\n {children}\n
\n );\n};\n","import React from 'react';\nimport { Section as BaseSection } from '../basic/Section';\nimport { Div } from '../basic/Div';\nimport { H2 } from '../basic/H2';\nimport { P } from '../basic/P';\nimport type { EditorAttrs } from '../../types';\n\nexport interface SectionLayoutProps {\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n\n /**\n * 섹션 제목\n */\n title?: string;\n\n /**\n * 섹션 부제목\n */\n subtitle?: string;\n\n /**\n * 패딩 적용\n */\n padding?: 'none' | 'sm' | 'md' | 'lg' | 'xl';\n\n /**\n * 배경색\n */\n background?: 'none' | 'white' | 'gray' | 'primary' | 'secondary';\n\n /**\n * 최대 너비 제한\n */\n maxWidth?: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '4xl' | '6xl' | '7xl' | 'full';\n\n /**\n * 중앙 정렬 여부\n */\n centered?: boolean;\n\n /**\n * 경계선 표시\n */\n border?: boolean;\n\n /**\n * 그림자 효과\n */\n shadow?: 'none' | 'sm' | 'md' | 'lg' | 'xl';\n\n /**\n * 둥근 모서리\n */\n rounded?: boolean;\n\n /**\n * 사용자 정의 클래스\n */\n className?: string;\n\n /**\n * 인라인 스타일\n */\n style?: React.CSSProperties;\n\n /**\n * 자식 요소\n */\n children?: React.ReactNode;\n\n /**\n * 클릭 이벤트 핸들러\n */\n onClick?: () => void;\n\n /**\n * 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread)\n */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * Section 레이아웃 컴포넌트\n *\n * 시맨틱 구역 분할을 위한 섹션 컴포넌트입니다.\n * 제목, 패딩, 배경색 등 다양한 옵션을 제공합니다.\n *\n * @example\n * // 기본 섹션\n *
\n *

Content here

\n *
\n *\n * @example\n * // 제목이 있는 섹션\n * \n *

User details

\n * \n */\nexport const SectionLayout: React.FC = ({\n id,\n title,\n subtitle,\n children,\n padding = 'md',\n background = 'none',\n maxWidth,\n centered = false,\n border = false,\n shadow = 'none',\n rounded = false,\n className = '',\n style,\n onClick,\n editorAttrs,\n}) => {\n // Tailwind CSS 클래스 생성\n const classes: string[] = [];\n\n // 패딩\n const paddingMap: Record = {\n none: 'p-0',\n sm: 'p-2',\n md: 'p-4',\n lg: 'p-6',\n xl: 'p-8',\n }; \n classes.push(paddingMap[padding]);\n\n // 배경색\n const backgroundMap: Record = {\n none: '',\n white: 'bg-white dark:bg-gray-700',\n gray: 'bg-gray-50 dark:bg-gray-800',\n primary: 'bg-blue-50 dark:bg-blue-900/20',\n secondary: 'bg-gray-50 dark:bg-gray-800',\n };\n if (background !== 'none') {\n classes.push(backgroundMap[background]);\n }\n\n // 최대 너비\n if (maxWidth) {\n const maxWidthMap: Record = {\n sm: 'max-w-sm',\n md: 'max-w-md',\n lg: 'max-w-lg',\n xl: 'max-w-xl',\n '2xl': 'max-w-2xl',\n '4xl': 'max-w-4xl',\n '6xl': 'max-w-6xl',\n '7xl': 'max-w-7xl',\n full: 'max-w-full',\n };\n classes.push(maxWidthMap[maxWidth]);\n }\n\n // 중앙 정렬\n if (centered) {\n classes.push('mx-auto');\n }\n\n // 경계선\n if (border) {\n classes.push('border', 'border-gray-200', 'dark:border-gray-700');\n }\n\n // 그림자\n const shadowMap: Record = {\n none: '',\n sm: 'shadow-sm',\n md: 'shadow-md',\n lg: 'shadow-lg',\n xl: 'shadow-xl',\n };\n if (shadow !== 'none') {\n classes.push(shadowMap[shadow]);\n }\n\n // 둥근 모서리\n if (rounded) {\n classes.push('rounded-lg');\n }\n\n // 사용자 정의 클래스 추가\n if (className) {\n classes.push(className);\n }\n\n return (\n \n {/* 제목 영역 */}\n {(title || subtitle) && (\n
\n {title &&

{title}

}\n {subtitle &&

{subtitle}

}\n
\n )}\n\n {/* 콘텐츠 영역 */}\n {children}\n
\n );\n};\n","import React from 'react';\nimport { Div } from '../basic/Div';\nimport type { EditorAttrs } from '../../types';\n\nexport interface ThreeColumnLayoutProps {\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n\n /**\n * 왼쪽 영역 너비\n */\n leftWidth?: string;\n\n /**\n * 오른쪽 영역 너비\n */\n rightWidth?: string;\n\n /**\n * 왼쪽 슬롯 컨텐츠\n */\n leftSlot?: React.ReactNode;\n\n /**\n * 가운데 슬롯 컨텐츠\n */\n centerSlot?: React.ReactNode;\n\n /**\n * 오른쪽 슬롯 컨텐츠\n */\n rightSlot?: React.ReactNode;\n\n /**\n * 사용자 정의 클래스\n */\n className?: string;\n\n /**\n * 인라인 스타일\n */\n style?: React.CSSProperties;\n\n /**\n * 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread)\n */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * ThreeColumnLayout 레이아웃 컴포넌트\n *\n * 3단 레이아웃 구조를 제공하는 기본 layout 컴포넌트입니다.\n * leftWidth, rightWidth를 조절할 수 있으며 각 영역에 슬롯을 제공합니다.\n *\n * @example\n * Left Content
}\n * centerSlot={
Center Content
}\n * rightSlot={
Right Content
}\n * />\n */\nexport const ThreeColumnLayout: React.FC = ({\n id,\n leftWidth = '250px',\n rightWidth = '300px',\n leftSlot,\n centerSlot,\n rightSlot,\n className = '',\n style,\n editorAttrs,\n}) => {\n // 컨테이너 스타일\n const containerClasses = `flex flex-row w-full h-full ${className}`.trim();\n\n // 왼쪽 영역 스타일\n const leftStyle: React.CSSProperties = {\n width: leftWidth,\n flexShrink: 0,\n };\n\n // 가운데 영역 스타일 (남은 공간 차지)\n const centerStyle: React.CSSProperties = {\n flex: 1,\n minWidth: 0, // flex 아이템 오버플로우 방지\n };\n\n // 오른쪽 영역 스타일\n const rightStyle: React.CSSProperties = {\n width: rightWidth,\n flexShrink: 0,\n };\n\n return (\n
\n {/* 왼쪽 영역 */}\n
\n {leftSlot}\n
\n\n {/* 가운데 영역 */}\n
\n {centerSlot}\n
\n\n {/* 오른쪽 영역 */}\n
\n {rightSlot}\n
\n
\n );\n};\n","/**\n * 상품 옵션 선택 관련 핸들러\n *\n * 상품 상세 페이지에서 옵션 선택 및 수량 변경을 처리합니다.\n * DB의 option_groups (문자열 값 배열)과 options (ProductOption 레코드)를 사용합니다.\n *\n * G7Core ActionDispatcher는 커스텀 핸들러를 (action, context) 시그니처로 호출합니다.\n * - action.params: 레이아웃 JSON에서 정의한 params (resolveParams로 이미 해석됨)\n * - context.setState: 컴포넌트 상태 업데이트 함수\n *\n * ⚠️ sequence 내에서 setState 후 다음 액션의 context.data._local은 갱신되지 않음\n * (ActionDispatcher.handleSequence는 state만 동기화, data._local은 미갱신)\n * 따라서 이 핸들러는 newGroupName+newValue를 직접 받아서 currentSelection을 자체 구성합니다.\n */\n\n/**\n * 옵션 그룹 구조 (다국어 지원)\n * API 응답: { name: {ko: \"색상\", en: \"Color\"}, name_localized: \"색상\", values: [...], values_localized: [...] }\n */\ninterface OptionGroup {\n name: string | Record;\n name_localized?: string;\n values: string[] | Array>;\n values_localized?: string[];\n}\n\n/**\n * 옵션 값 항목 (다국어 지원 배열 형식)\n */\ninterface OptionValueItem {\n key: string | Record;\n value: string | Record;\n}\n\n/**\n * ProductOption 레코드\n * option_values: 배열 형식 (신규) 또는 객체 형식 (레거시)\n * option_values_localized: 현재 로케일 값 객체 (신규)\n */\ninterface ProductOptionRecord {\n id: number;\n option_code: string;\n option_values: OptionValueItem[] | Record;\n option_values_localized?: Record;\n option_name: string | Record;\n option_name_localized?: string;\n price_adjustment: number;\n selling_price: number;\n selling_price_formatted: string;\n list_price: number;\n list_price_formatted: string;\n multi_currency_selling_price?: Record;\n multi_currency_list_price?: Record;\n stock_quantity: number;\n is_active: boolean;\n}\n\n/**\n * 추가옵션 선택지 (PublicProductResource.additional_options[].values[])\n */\ninterface AdditionalOptionValue {\n id: number;\n name: string;\n price_adjustment: number;\n is_default: boolean;\n /** 직접입력 허용 — 이 선택지 선택 시 자유 텍스트 입력칸 노출(입력 필수) */\n allow_custom_text?: boolean;\n}\n\n/**\n * 추가옵션 그룹 (PublicProductResource.additional_options[])\n */\ninterface AdditionalOptionGroup {\n id: number;\n name: string;\n is_required: boolean;\n values: AdditionalOptionValue[];\n}\n\n/**\n * 블럭별 추가옵션 선택 상태 (additional_option_id → value_id)\n */\ntype AdditionalOptionSelections = Record;\n\ninterface SelectedItem {\n id: string;\n optionId: number;\n options: Record;\n optionValues: Record;\n quantity: number;\n stock: number;\n unitPrice: number;\n unitPriceFormatted: string;\n totalPrice: number;\n totalPriceFormatted: string;\n multiCurrencyUnitPrice?: Record;\n multiCurrencyTotalPrice?: Record;\n /** 블럭별 추가옵션 선택 (그룹ID → 선택지ID) */\n additionalOptionSelections?: AdditionalOptionSelections;\n /** 블럭별 추가옵션 직접입력 텍스트 (그룹ID → custom_text). allow_custom_text 선택지 한정 */\n additionalOptionCustomTexts?: Record;\n /** 블럭별 추가옵션 추가금 합계 (KRW 기준, 단위당) */\n additionalOptionsTotal?: number;\n}\n\ninterface AddSelectedItemParams {\n productId: number;\n optionGroups: OptionGroup[];\n options: ProductOptionRecord[];\n currentSelection: Record;\n selectedOptionItems: SelectedItem[];\n preferredCurrency: string;\n /** 상품 추가옵션 카탈로그 (기본 선택지 자동 적용용) */\n additionalOptionGroups?: AdditionalOptionGroup[];\n /** sequence 상태 동기화 우회: 방금 선택한 그룹명 */\n newGroupName?: string;\n /** sequence 상태 동기화 우회: 방금 선택한 값 */\n newValue?: string;\n}\n\ninterface UpdateQuantityParams {\n itemIndex: number;\n newQuantity: number;\n selectedOptionItems: SelectedItem[];\n preferredCurrency: string;\n}\n\ninterface SetBlockAdditionalOptionParams {\n itemIndex: number;\n additionalOptionId: number;\n valueId: number | string;\n /** 직접입력 텍스트 입력 시 전달 (value 선택 변경 시에는 미전달) */\n customText?: string;\n selectedOptionItems: SelectedItem[];\n additionalOptionGroups: AdditionalOptionGroup[];\n preferredCurrency: string;\n}\n\n/**\n * G7Core ActionContext (ActionDispatcher에서 전달)\n */\ninterface ActionContext {\n data?: any;\n event?: Event;\n state?: any;\n setState?: (updates: any) => void;\n}\n\n/**\n * G7Core ActionDefinition (커스텀 핸들러 첫 번째 인자)\n */\ninterface ActionDefinition {\n handler: string;\n params?: Record;\n target?: string;\n [key: string]: any;\n}\n\n/**\n * 통화별 포맷팅 설정\n */\nconst CURRENCY_CONFIGS: Record = {\n KRW: { locale: 'ko-KR', decimals: 0 },\n USD: { locale: 'en-US', decimals: 2 },\n JPY: { locale: 'ja-JP', decimals: 0 },\n CNY: { locale: 'zh-CN', decimals: 2 },\n EUR: { locale: 'de-DE', decimals: 2 },\n};\n\n/**\n * 숫자를 통화 형식으로 포맷팅\n */\nfunction formatPrice(amount: number, currencyCode: string = 'KRW'): string {\n if (!Number.isFinite(amount)) return '0';\n const config = CURRENCY_CONFIGS[currencyCode] || CURRENCY_CONFIGS.KRW;\n try {\n return new Intl.NumberFormat(config.locale, {\n style: 'currency',\n currency: currencyCode,\n minimumFractionDigits: config.decimals,\n maximumFractionDigits: config.decimals,\n }).format(amount);\n } catch {\n return amount.toLocaleString() + (currencyCode === 'KRW' ? '원' : '');\n }\n}\n\n/**\n * 다중 통화 총 가격 재계산\n *\n * 추가옵션 추가금(additionalUnitKrw)이 있으면 KRW 환율 기준으로 환산해 각 통화 단가에 가산한다.\n * 추가옵션은 공개 응답에 다통화 컬럼이 없으므로(plan §245) 기본통화(KRW) 단가 비율로 환산한다.\n *\n * @param unitPriceMap 옵션 단가 다통화 맵\n * @param quantity 수량\n * @param additionalUnitKrw 추가옵션 추가금 합계 (KRW 기준, 단위당). 기본 0.\n */\nfunction recalcMultiCurrencyTotal(\n unitPriceMap: Record | undefined,\n quantity: number,\n additionalUnitKrw: number = 0\n): Record | undefined {\n if (!unitPriceMap) return undefined;\n\n // KRW 단가를 환산 기준으로 사용 (옵션의 KRW 단가 대비 타통화 비율)\n const krwUnit = (unitPriceMap.KRW as any)?.value ?? (unitPriceMap.KRW as any)?.price ?? 0;\n\n const result: Record = {};\n for (const [code, data] of Object.entries(unitPriceMap)) {\n // API는 { price, formatted } 형태, 내부는 { value, formatted } 형태 — 둘 다 지원\n const unitValue = (data as any)?.value ?? (data as any)?.price ?? 0;\n // 추가금 통화 환산: KRW 기준 추가금 × (해당통화 단가 / KRW 단가). KRW 자신은 그대로.\n let additionalConverted = 0;\n if (additionalUnitKrw > 0) {\n if (code === 'KRW') {\n additionalConverted = additionalUnitKrw;\n } else if (krwUnit > 0) {\n additionalConverted = (additionalUnitKrw * unitValue) / krwUnit;\n }\n }\n const total = (unitValue + additionalConverted) * quantity;\n result[code] = {\n value: total,\n formatted: formatPrice(total, code),\n };\n }\n return result;\n}\n\n/**\n * 선택된 옵션 항목들의 통화별 합계 포맷 맵을 계산합니다.\n *\n * 레이아웃 \"총 금액\"은 표현식 컨텍스트에서 핸들러를 호출할 수 없으므로(엔진 제약),\n * 합계 금액을 통화별로 미리 포맷해 _local 에 노출한다 → 레이아웃은 단순 조회만 한다.\n * (선택 통화 KRW 고정 결함 D2 해소)\n *\n * @param items 선택된 옵션 항목 목록\n * @returns 통화코드 => { value, formatted } 합계 맵\n */\nfunction buildSelectedTotalMultiCurrency(\n items: SelectedItem[]\n): Record {\n const totals: Record = {};\n for (const item of items) {\n const mc = item?.multiCurrencyTotalPrice;\n if (mc) {\n for (const [code, data] of Object.entries(mc)) {\n const v = (data as any)?.value ?? (data as any)?.price ?? 0;\n totals[code] = (totals[code] ?? 0) + v;\n }\n }\n }\n const result: Record = {};\n for (const [code, value] of Object.entries(totals)) {\n result[code] = { value, formatted: formatPrice(value, code) };\n }\n return result;\n}\n\n/**\n * 블럭의 추가옵션 선택으로부터 추가금 합계(KRW, 단위당)를 계산한다.\n *\n * @param selections 블럭별 추가옵션 선택 (그룹ID → 선택지ID)\n * @param groups 상품 추가옵션 카탈로그\n * @returns 추가금 합계 (KRW)\n */\nfunction computeAdditionalOptionsTotal(\n selections: AdditionalOptionSelections | undefined,\n groups: AdditionalOptionGroup[] | undefined\n): number {\n if (!selections || !groups?.length) return 0;\n let total = 0;\n for (const group of groups) {\n const valueId = selections[group.id];\n if (valueId == null) continue;\n const value = group.values?.find(v => v.id === Number(valueId));\n if (value) total += value.price_adjustment ?? 0;\n }\n return total;\n}\n\n/**\n * 추가옵션 선택을 백엔드 입력 형식으로 변환한다.\n * additional_option_selections: [{ additional_option_id, value_id }]\n *\n * @param selections 블럭별 추가옵션 선택 (그룹ID → 선택지ID)\n * @param customTexts 블럭별 직접입력 텍스트 (그룹ID → custom_text)\n * @returns 백엔드 입력 배열\n */\nexport function toAdditionalOptionSelectionsPayload(\n selections: AdditionalOptionSelections | undefined,\n customTexts?: Record\n): Array<{ additional_option_id: number; value_id: number; custom_text?: string }> {\n if (!selections) return [];\n return Object.entries(selections)\n .filter(([, valueId]) => valueId != null)\n .map(([groupId, valueId]) => {\n const entry: { additional_option_id: number; value_id: number; custom_text?: string } = {\n additional_option_id: Number(groupId),\n value_id: Number(valueId),\n };\n const customText = customTexts?.[Number(groupId)];\n if (typeof customText === 'string' && customText.trim() !== '') {\n entry.custom_text = customText.trim();\n }\n return entry;\n });\n}\n\n/**\n * 옵션 그룹의 키 (name_localized 우선, 폴백으로 name)\n */\nfunction getGroupKey(group: OptionGroup): string {\n if (group.name_localized) return group.name_localized;\n if (typeof group.name === 'string') return group.name;\n return (group.name as Record)?.ko ?? '';\n}\n\n/**\n * option_values에서 특정 그룹 키의 값 추출\n * 배열 형식(신규)과 객체 형식(레거시) 모두 지원\n */\nfunction getOptionValueByGroupKey(\n optionValues: OptionValueItem[] | Record,\n optionValuesLocalized: Record | undefined,\n groupKey: string\n): string | undefined {\n // option_values_localized가 있으면 우선 사용\n if (optionValuesLocalized && groupKey in optionValuesLocalized) {\n return optionValuesLocalized[groupKey];\n }\n\n // 배열 형식 (신규)\n if (Array.isArray(optionValues)) {\n const item = optionValues.find(v => {\n if (typeof v.key === 'string') return v.key === groupKey;\n return (v.key as Record)?.ko === groupKey || Object.values(v.key).includes(groupKey);\n });\n if (item) {\n if (typeof item.value === 'string') return item.value;\n return (item.value as Record)?.ko ?? Object.values(item.value)[0];\n }\n return undefined;\n }\n\n // 객체 형식 (레거시)\n return optionValues[groupKey];\n}\n\n/**\n * option_values를 Record 형식으로 변환\n * SelectedItem.optionValues 저장용 (현재 로케일 값으로 변환)\n */\nfunction convertOptionValuesToRecord(\n optionValues: OptionValueItem[] | Record,\n optionValuesLocalized?: Record\n): Record {\n // option_values_localized가 있으면 우선 사용\n if (optionValuesLocalized) {\n return optionValuesLocalized;\n }\n\n // 이미 객체 형식이면 그대로 반환\n if (!Array.isArray(optionValues)) {\n return optionValues;\n }\n\n // 배열 형식을 객체로 변환\n const result: Record = {};\n for (const item of optionValues) {\n const key = typeof item.key === 'string'\n ? item.key\n : (item.key as Record)?.ko ?? Object.values(item.key)[0] ?? '';\n const value = typeof item.value === 'string'\n ? item.value\n : (item.value as Record)?.ko ?? Object.values(item.value)[0] ?? '';\n if (key) {\n result[key] = value;\n }\n }\n return result;\n}\n\n/**\n * 현재 선택된 값으로 매칭되는 ProductOption 찾기\n * name_localized를 키로 사용하여 선택값과 비교\n */\nfunction findMatchingOption(\n optionGroups: OptionGroup[],\n currentSelection: Record,\n options: ProductOptionRecord[]\n): ProductOptionRecord | undefined {\n return options.find(opt => {\n if (!opt?.option_values || !opt?.is_active) return false;\n return optionGroups.every(group => {\n const groupKey = getGroupKey(group);\n const selectedValue = currentSelection?.[groupKey];\n const optValue = getOptionValueByGroupKey(\n opt.option_values,\n opt.option_values_localized,\n groupKey\n );\n return optValue === selectedValue;\n });\n });\n}\n\n/**\n * 옵션 선택 완료 시 selectedItems에 추가\n *\n * 모든 옵션 그룹이 선택되면 매칭되는 ProductOption을 찾아 선택 목록에 추가합니다.\n * 동일한 옵션 조합이 이미 있으면 토스트 알림 + 선택 초기화합니다.\n *\n * ⚠️ sequence 내 setState 후 context.data._local이 갱신되지 않는 G7Core 한계 때문에\n * newGroupName + newValue를 직접 받아서 currentSelection을 자체 병합합니다.\n *\n * G7Core에서 (action: ActionDefinition, context: ActionContext) 시그니처로 호출됩니다.\n */\nexport function addSelectedItemIfCompleteHandler(\n action: ActionDefinition,\n context: ActionContext\n): void {\n const params = action.params as AddSelectedItemParams;\n if (!params) return;\n\n const { optionGroups, options, selectedOptionItems, preferredCurrency } = params;\n\n // sequence 내 setState 미반영 대응: newGroupName/newValue가 있으면 직접 병합\n let currentSelection: Record;\n if (params.newGroupName && params.newValue) {\n currentSelection = {\n ...(params.currentSelection ?? {}),\n [params.newGroupName]: params.newValue,\n };\n } else {\n currentSelection = params.currentSelection ?? {};\n }\n\n // 모든 옵션 그룹이 선택되었는지 확인 (name_localized 키 사용)\n const allSelected = optionGroups?.every(group => {\n const groupKey = getGroupKey(group);\n return currentSelection?.[groupKey];\n });\n if (!allSelected) return;\n\n // 매칭되는 ProductOption 찾기\n const matchedOption = findMatchingOption(optionGroups, currentSelection, options ?? []);\n if (!matchedOption) {\n context.setState?.({ currentSelection: {}, __mergeMode: 'shallow' });\n return;\n }\n\n // 옵션 키 (중복 확인용) - name_localized 키 사용\n const optionKey = optionGroups.map(g => currentSelection[getGroupKey(g)]).join('_');\n const items = selectedOptionItems ?? [];\n const existing = items.find(item => item.id === optionKey);\n\n if (existing) {\n // 이미 추가된 옵션 → 토스트 알림 + 선택 초기화\n const G7Core = (window as any).G7Core;\n G7Core?.toast?.warning?.(G7Core?.t?.('sirsoft-ecommerce.shop.already_added_option') ?? '이미 추가된 옵션입니다.');\n context.setState?.({ currentSelection: {}, __mergeMode: 'shallow' });\n return;\n }\n\n // 새 옵션 조합 추가\n const unitPrice = matchedOption.selling_price ?? 0;\n const optionLabels: Record = {};\n optionGroups.forEach(group => {\n const groupKey = getGroupKey(group);\n optionLabels[groupKey] = currentSelection[groupKey];\n });\n\n // 추가옵션 초기 선택: 필수(is_required) 그룹에 한해 기본 선택지(is_default)를 자동 적용한다.\n // 비필수 그룹은 \"선택하세요\" 미선택 상태를 유지해야 한다 — 추가옵션 선택지는 라디오 방식이라\n // 그룹당 1개가 항상 is_default 로 마킹되므로(관리자 폼이 첫 선택지를 기본으로 시드), 비필수까지\n // 자동 적용하면 사용자가 원치 않은 추가금/선택이 강제로 붙는다.\n const additionalOptionGroups = params.additionalOptionGroups ?? [];\n const additionalOptionSelections: AdditionalOptionSelections = {};\n for (const group of additionalOptionGroups) {\n if (!group.is_required) continue;\n const defaultValue = group.values?.find(v => v.is_default);\n if (defaultValue) additionalOptionSelections[group.id] = defaultValue.id;\n }\n const additionalOptionsTotal = computeAdditionalOptionsTotal(\n additionalOptionSelections,\n additionalOptionGroups\n );\n\n const blockUnitTotal = unitPrice + additionalOptionsTotal;\n\n const newItem: SelectedItem = {\n id: optionKey,\n optionId: matchedOption.id,\n options: optionLabels,\n optionValues: convertOptionValuesToRecord(\n matchedOption.option_values,\n matchedOption.option_values_localized\n ),\n quantity: 1,\n stock: matchedOption.stock_quantity ?? 999,\n unitPrice,\n unitPriceFormatted: formatPrice(unitPrice, preferredCurrency),\n totalPrice: blockUnitTotal,\n totalPriceFormatted: formatPrice(blockUnitTotal, preferredCurrency),\n multiCurrencyUnitPrice: matchedOption.multi_currency_selling_price,\n multiCurrencyTotalPrice: recalcMultiCurrencyTotal(\n matchedOption.multi_currency_selling_price as any,\n 1,\n additionalOptionsTotal\n ),\n additionalOptionSelections,\n additionalOptionsTotal,\n };\n\n const nextItems = [...items, newItem];\n context.setState?.({\n selectedOptionItems: nextItems,\n selectedTotalMultiCurrency: buildSelectedTotalMultiCurrency(nextItems),\n currentSelection: {},\n __mergeMode: 'shallow',\n });\n}\n\n/**\n * 선택된 상품의 수량 변경 및 가격 재계산\n *\n * G7Core에서 (action: ActionDefinition, context: ActionContext) 시그니처로 호출됩니다.\n */\nexport function updateSelectedItemQuantityHandler(\n action: ActionDefinition,\n context: ActionContext\n): void {\n const params = action.params as UpdateQuantityParams;\n if (!params) return;\n\n const { selectedOptionItems, preferredCurrency } = params;\n // $args[0]이 문자열로 전달될 수 있으므로 Number 변환\n const itemIndex = Number(params.itemIndex) || 0;\n const newQuantity = Number(params.newQuantity) || 1;\n\n const updatedItems = (selectedOptionItems ?? []).map((item, idx) => {\n if (idx !== itemIndex) return item;\n\n const unitPrice = item?.unitPrice ?? 0;\n const additionalOptionsTotal = item?.additionalOptionsTotal ?? 0;\n const totalPrice = (unitPrice + additionalOptionsTotal) * newQuantity;\n return {\n ...item,\n quantity: newQuantity,\n totalPrice,\n totalPriceFormatted: formatPrice(totalPrice, preferredCurrency),\n multiCurrencyTotalPrice: recalcMultiCurrencyTotal(\n item?.multiCurrencyUnitPrice,\n newQuantity,\n additionalOptionsTotal\n ),\n };\n });\n\n context.setState?.({\n selectedOptionItems: updatedItems,\n selectedTotalMultiCurrency: buildSelectedTotalMultiCurrency(updatedItems),\n });\n}\n\n/**\n * 블럭별 추가옵션 선택 변경 및 가격 재계산\n *\n * 특정 옵션 블럭의 추가옵션 그룹 선택을 갱신하고, 추가금 합계·소계·다통화를 재계산한다.\n * 가격 표시는 클라이언트 계산이며 결제금액 SSoT 는 서버(plan D13).\n *\n * G7Core에서 (action: ActionDefinition, context: ActionContext) 시그니처로 호출됩니다.\n */\nexport function setBlockAdditionalOptionHandler(\n action: ActionDefinition,\n context: ActionContext\n): void {\n const params = action.params as SetBlockAdditionalOptionParams;\n if (!params) return;\n\n const { selectedOptionItems, additionalOptionGroups, preferredCurrency } = params;\n const itemIndex = Number(params.itemIndex) || 0;\n const additionalOptionId = Number(params.additionalOptionId);\n // customText 키가 params 에 존재하면 직접입력 모드 (value 선택 변경 아님)\n const isCustomTextMode = Object.prototype.hasOwnProperty.call(params, 'customText');\n // 빈 문자열(플레이스홀더) 선택 시 해당 그룹 선택 해제\n const valueId = params.valueId === '' || params.valueId == null ? null : Number(params.valueId);\n\n const updatedItems = (selectedOptionItems ?? []).map((item, idx) => {\n if (idx !== itemIndex) return item;\n\n const selections: AdditionalOptionSelections = { ...(item.additionalOptionSelections ?? {}) };\n const customTexts: Record = { ...(item.additionalOptionCustomTexts ?? {}) };\n\n if (isCustomTextMode) {\n // 직접입력 모드: 텍스트만 갱신 (선택 value 는 유지)\n const text = String(params.customText ?? '');\n if (text.trim() === '') {\n delete customTexts[additionalOptionId];\n } else {\n customTexts[additionalOptionId] = text;\n }\n } else if (valueId == null) {\n // 그룹 선택 해제 → 선택·직접입력 모두 정리\n delete selections[additionalOptionId];\n delete customTexts[additionalOptionId];\n } else {\n selections[additionalOptionId] = valueId;\n // 새 선택지가 직접입력을 허용하지 않으면 기존 직접입력 텍스트 정리\n const group = (additionalOptionGroups ?? []).find((g) => g.id === additionalOptionId);\n const value = group?.values?.find((v) => v.id === valueId);\n if (!value?.allow_custom_text) {\n delete customTexts[additionalOptionId];\n }\n }\n\n const additionalOptionsTotal = computeAdditionalOptionsTotal(selections, additionalOptionGroups);\n const unitPrice = item?.unitPrice ?? 0;\n const quantity = item?.quantity ?? 1;\n const totalPrice = (unitPrice + additionalOptionsTotal) * quantity;\n\n return {\n ...item,\n additionalOptionSelections: selections,\n additionalOptionCustomTexts: customTexts,\n additionalOptionsTotal,\n totalPrice,\n totalPriceFormatted: formatPrice(totalPrice, preferredCurrency),\n multiCurrencyTotalPrice: recalcMultiCurrencyTotal(\n item?.multiCurrencyUnitPrice,\n quantity,\n additionalOptionsTotal\n ),\n };\n });\n\n context.setState?.({\n selectedOptionItems: updatedItems,\n selectedTotalMultiCurrency: buildSelectedTotalMultiCurrency(updatedItems),\n });\n}\n\n/**\n * 선택된 옵션 항목을 제거하고 통화별 합계를 재계산합니다.\n *\n * 레이아웃에서 filter 로 직접 제거하면 selectedTotalMultiCurrency(통화별 합계 포맷)를\n * 갱신할 수 없어(표현식은 핸들러 호출 불가) stale 합계가 남는다. 제거도 핸들러로 처리해\n * 합계 맵을 함께 재계산한다(D2).\n *\n * G7Core에서 (action: ActionDefinition, context: ActionContext) 시그니처로 호출됩니다.\n */\nexport function removeSelectedItemHandler(\n action: ActionDefinition,\n context: ActionContext\n): void {\n const params = action.params as { itemIndex?: number | string; selectedOptionItems?: SelectedItem[] };\n if (!params) return;\n\n const itemIndex = Number(params.itemIndex) || 0;\n const nextItems = (params.selectedOptionItems ?? []).filter((_, idx) => idx !== itemIndex);\n\n context.setState?.({\n selectedOptionItems: nextItems,\n selectedTotalMultiCurrency: buildSelectedTotalMultiCurrency(nextItems),\n });\n}\n\n/**\n * 옵션 없는 상품의 수량을 변경하고 통화별 총액 포맷 맵을 재계산합니다.\n *\n * 옵션 없는 상품 총액 = 단가 × 수량. 레이아웃 표현식은 핸들러를 호출할 수 없어\n * 통화별 포맷(소수점/기호)을 만들 수 없으므로, 수량 변경 시 통화별 총액 formatted 를\n * noOptionTotalMultiCurrency 에 미리 계산해 노출한다(KRW 고정 결함 D3 해소).\n *\n * @param action.params.newQuantity 변경 수량\n * @param action.params.multiCurrencyUnitPrice 단가 통화맵(product.multi_currency_selling_price)\n * G7Core에서 (action: ActionDefinition, context: ActionContext) 시그니처로 호출됩니다.\n */\nexport function updateNoOptionQuantityHandler(\n action: ActionDefinition,\n context: ActionContext\n): void {\n const params = action.params as {\n newQuantity?: number | string;\n multiCurrencyUnitPrice?: Record;\n };\n if (!params) return;\n\n const quantity = Math.max(1, Number(params.newQuantity) || 1);\n\n context.setState?.({\n noOptionQuantity: quantity,\n noOptionTotalMultiCurrency: recalcMultiCurrencyTotal(\n params.multiCurrencyUnitPrice as Record | undefined,\n quantity\n ),\n });\n}","/**\n * 장바구니 관련 핸들러\n *\n * 장바구니 페이지에서 상품 선택, 옵션 변경, 삭제 등을 처리합니다.\n *\n * 핸들러 시그니처: ActionDispatcher의 ActionHandler 형식을 따름\n * (action: ActionDefinition, context: ActionContext) => void | Promise\n *\n * G7Core API 사용:\n * - G7Core.state.setLocal() - 로컬 상태 설정\n * - G7Core.state.getLocal() - 로컬 상태 조회\n * - G7Core.toast?.show() - 토스트 표시\n * - G7Core.t() - 번역\n */\n\n// Logger 설정 (G7Core 초기화 전에도 동작하도록 폴백 포함)\nconst logger = ((window as any).G7Core?.createLogger?.('Handler:Cart')) ?? {\n log: (...args: unknown[]) => console.log('[Handler:Cart]', ...args),\n warn: (...args: unknown[]) => console.warn('[Handler:Cart]', ...args),\n error: (...args: unknown[]) => console.error('[Handler:Cart]', ...args),\n};\n\n/**\n * 로컬 상태 설정 헬퍼\n */\nfunction setLocalState(updates: Record): void {\n const G7Core = (window as any).G7Core;\n if (G7Core?.state?.setLocal) {\n G7Core.state.setLocal(updates);\n logger.log('Local state updated:', updates);\n } else {\n logger.warn('G7Core.state.setLocal not available');\n }\n}\n\n/**\n * 로컬 상태 조회 헬퍼\n */\nfunction getLocalState(): Record {\n const G7Core = (window as any).G7Core;\n return G7Core?.state?.getLocal?.() || {};\n}\n\n/**\n * 전역 상태 조회 헬퍼\n */\nfunction getGlobalState(): Record {\n const G7Core = (window as any).G7Core;\n return G7Core?.state?.get?.() || {};\n}\n\n/**\n * 토스트 표시 헬퍼\n */\nfunction showToast(message: string, type: 'success' | 'error' | 'warning' | 'info' = 'info'): void {\n const G7Core = (window as any).G7Core;\n if (G7Core?.toast?.show) {\n G7Core.toast.show(message, type);\n } else {\n logger.warn('G7Core.toast.show not available, message:', message);\n }\n}\n\n/**\n * 번역 헬퍼\n */\nfunction t(key: string): string {\n const G7Core = (window as any).G7Core;\n if (G7Core?.t) {\n return G7Core.t(key);\n }\n return key;\n}\n\n/**\n * 장바구니 데이터소스 재조회 헬퍼\n *\n * 선택된 상품 기준으로 계산 결과를 갱신합니다.\n * selected_ids 파라미터를 전달하여 선택된 아이템만 계산합니다.\n */\nfunction refetchCartItems(): void {\n const G7Core = (window as any).G7Core;\n if (G7Core?.dispatch) {\n const localState = getLocalState();\n const selectedItems = localState.selectedItems || [];\n\n G7Core.dispatch({\n handler: 'refetchDataSource',\n params: {\n dataSourceId: 'cartItems',\n },\n });\n logger.log('Refetching cartItems with selected_ids:', selectedItems);\n } else {\n logger.warn('G7Core.dispatch not available');\n }\n}\n\n/**\n * 장바구니 개별 상품 선택/해제\n *\n * 체크박스 상태 변경 시 selectedItems 배열을 업데이트하고,\n * 선택된 상품 기준으로 주문 계산을 다시 요청합니다.\n *\n * @param action 액션 정의 (params에 itemId, selectedItems 포함)\n * @param _context 액션 컨텍스트 (사용하지 않음)\n */\nexport function toggleCartItemSelectionHandler(\n action?: any,\n _context?: any\n): void {\n const { itemId, selectedItems } = action?.params || {};\n const currentSelected = selectedItems || [];\n\n let newSelected: number[];\n if (currentSelected.includes(itemId)) {\n // 이미 선택되어 있으면 제거\n newSelected = currentSelected.filter((id: number) => id !== itemId);\n } else {\n // 선택되어 있지 않으면 추가\n newSelected = [...currentSelected, itemId];\n }\n\n // 전체 선택 상태도 업데이트\n const globalState = getGlobalState();\n const allItems = globalState.cartItems?.data?.items || [];\n const allSelected = allItems.length > 0 && newSelected.length === allItems.length;\n\n setLocalState({\n selectedItems: newSelected,\n allSelected,\n selectedCount: newSelected.length,\n });\n\n // 선택 변경 후 계산 결과 갱신을 위해 데이터소스 재조회\n refetchCartItems();\n}\n\n/**\n * 장바구니 전체 선택/해제\n *\n * 전체 선택 체크박스 상태 변경 시 모든 상품을 선택하거나 해제하고,\n * 선택된 상품 기준으로 주문 계산을 다시 요청합니다.\n *\n * @param action 액션 정의 (params에 allItemIds, isSelected 포함)\n * @param _context 액션 컨텍스트 (사용하지 않음)\n */\nexport function selectAllCartItemsHandler(\n action?: any,\n _context?: any\n): void {\n const { allItemIds, isSelected } = action?.params || {};\n\n setLocalState({\n selectedItems: isSelected ? allItemIds : [],\n allSelected: isSelected,\n selectedCount: isSelected ? allItemIds.length : 0,\n });\n\n // 선택 변경 후 계산 결과 갱신을 위해 데이터소스 재조회\n refetchCartItems();\n}\n\n/**\n * 옵션 변경 모달에서 옵션 값 설정\n *\n * 옵션 선택 시 selectedOptions 상태를 업데이트합니다.\n *\n * @param action 액션 정의 (params에 optionName, optionValue 포함)\n * @param _context 액션 컨텍스트 (사용하지 않음)\n */\nexport function setCartOptionHandler(\n action?: any,\n _context?: any\n): void {\n const { optionName, optionValue } = action?.params || {};\n const localState = getLocalState();\n const currentOptions = localState.selectedOptions || {};\n\n setLocalState({\n selectedOptions: {\n ...currentOptions,\n [optionName]: optionValue,\n },\n });\n}\n\n/**\n * 삭제 확인 모달 열기\n *\n * 선택된 상품 삭제 버튼 클릭 시 삭제 확인 모달을 엽니다.\n *\n * @param action 액션 정의 (params에 targetIds 포함)\n * @param _context 액션 컨텍스트 (사용하지 않음)\n */\nexport function openCartDeleteModalHandler(\n action?: any,\n _context?: any\n): void {\n const { targetIds } = action?.params || {};\n\n if (!targetIds || targetIds.length === 0) {\n showToast(t('shop.cart.select_items_to_delete'), 'warning');\n return;\n }\n\n setLocalState({\n deleteModal: {\n visible: true,\n targetIds,\n },\n });\n}\n\n/**\n * 옵션 변경 모달 열기\n *\n * 상품 옵션 변경 버튼 클릭 시 옵션 변경 모달을 엽니다.\n *\n * @param action 액션 정의 (params에 targetItem 포함)\n * @param _context 액션 컨텍스트 (사용하지 않음)\n */\nexport function openCartOptionModalHandler(\n action?: any,\n _context?: any\n): void {\n const { targetItem } = action?.params || {};\n\n setLocalState({\n optionModal: {\n visible: true,\n targetItem,\n },\n selectedOptions: targetItem?.options || {},\n selectedQuantity: targetItem?.quantity,\n });\n}\n\n/**\n * 장바구니 아이템 선택 후 계산 갱신 요청\n *\n * 선택된 아이템이 변경되면 서버에 계산 요청을 보냅니다.\n *\n * @param action 액션 정의 (params에 selectedItems 포함)\n * @param _context 액션 컨텍스트 (사용하지 않음)\n */\nexport function recalculateCartHandler(\n action?: any,\n _context?: any\n): void {\n const { selectedItems } = action?.params || {};\n\n if (!selectedItems || selectedItems.length === 0) {\n setLocalState({ isCalculating: false });\n return;\n }\n\n setLocalState({ isCalculating: true });\n\n // 계산은 cartItems 데이터 소스 refetch로 처리됨\n // 추가 API 호출이 필요한 경우 여기서 처리\n}\n","/**\n * 장바구니 옵션 변경 관련 핸들러\n *\n * 장바구니 옵션 변경 모달에서 옵션 선택 및 매칭을 처리합니다.\n *\n * 핸들러 시그니처: ActionDispatcher의 ActionHandler 형식을 따름\n * (action: ActionDefinition, context: ActionContext) => void | Promise | any\n *\n * ⚠️ 중요: 커스텀 핸들러에서 dispatch({ target: 'local' })를 사용하면\n * 핸들러 실행 컨텍스트의 _local에 저장됩니다. iteration 내부에서 호출되면\n * 페이지 레벨 _local과 다른 스코프에 저장됩니다.\n *\n * 해결책: 핸들러가 결과를 반환하고, 레이아웃의 onSuccess에서 setState 실행\n */\n\n// Logger 설정 (G7Core 초기화 전에도 동작하도록 폴백 포함)\nconst logger = ((window as any).G7Core?.createLogger?.('Handler:CartOptionChange')) ?? {\n log: (...args: unknown[]) => console.log('[Handler:CartOptionChange]', ...args),\n warn: (...args: unknown[]) => console.warn('[Handler:CartOptionChange]', ...args),\n error: (...args: unknown[]) => console.error('[Handler:CartOptionChange]', ...args),\n};\n\n/**\n * 옵션 그룹 구조 (다국어 지원)\n * API 응답: { name: {ko: \"색상\", en: \"Color\"}, name_localized: \"색상\", values: [...], values_localized: [...] }\n */\ninterface OptionGroup {\n name: string | Record;\n name_localized?: string;\n values: string[] | Array>;\n values_localized?: string[];\n}\n\n/**\n * 옵션 값 항목 (다국어 지원 배열 형식)\n */\ninterface OptionValueItem {\n key: string | Record;\n value: string | Record;\n}\n\ninterface ProductOption {\n id: number;\n option_values: OptionValueItem[] | Record;\n option_values_localized?: Record;\n option_name: string | Record;\n option_name_localized?: string;\n selling_price_formatted: string;\n stock_quantity: number;\n}\n\ninterface InitCartOptionResult {\n selectedOptions: Record;\n matchedOption: ProductOption | null;\n}\n\n/**\n * 옵션 그룹의 키 (name_localized 우선, 폴백으로 name)\n */\nfunction getGroupKey(group: OptionGroup): string {\n if (group.name_localized) return group.name_localized;\n if (typeof group.name === 'string') return group.name;\n return (group.name as Record)?.ko ?? '';\n}\n\n/**\n * option_values에서 특정 그룹 키의 값 추출\n * 배열 형식(신규)과 객체 형식(레거시) 모두 지원\n */\nfunction getOptionValueByGroupKey(\n optionValues: OptionValueItem[] | Record,\n optionValuesLocalized: Record | undefined,\n groupKey: string\n): string | undefined {\n // option_values_localized가 있으면 우선 사용\n if (optionValuesLocalized && groupKey in optionValuesLocalized) {\n return optionValuesLocalized[groupKey];\n }\n\n // 배열 형식 (신규)\n if (Array.isArray(optionValues)) {\n const item = optionValues.find(v => {\n if (typeof v.key === 'string') return v.key === groupKey;\n return (v.key as Record)?.ko === groupKey || Object.values(v.key).includes(groupKey);\n });\n if (item) {\n if (typeof item.value === 'string') return item.value;\n return (item.value as Record)?.ko ?? Object.values(item.value)[0];\n }\n return undefined;\n }\n\n // 객체 형식 (레거시)\n return optionValues[groupKey];\n}\n\n/**\n * 선택된 옵션 조합에 맞는 product_option 찾기 (내부 함수)\n * name_localized를 키로 사용하여 선택값과 비교\n */\nfunction findMatchingOption(\n selectedOptions: Record,\n optionGroups: OptionGroup[],\n options: ProductOption[]\n): ProductOption | null {\n if (!selectedOptions || !optionGroups?.length) {\n return null;\n }\n\n // 모든 옵션 그룹이 선택되었는지 확인 (name_localized 키 사용)\n const allSelected = optionGroups.every((group) => {\n const groupKey = getGroupKey(group);\n return selectedOptions[groupKey];\n });\n if (!allSelected) {\n logger.log('Not all options selected yet');\n return null;\n }\n\n // 일치하는 옵션 조합 찾기\n const matched = options?.find((opt) =>\n optionGroups.every((group) => {\n const groupKey = getGroupKey(group);\n const optValue = getOptionValueByGroupKey(\n opt.option_values,\n opt.option_values_localized,\n groupKey\n );\n return optValue === selectedOptions[groupKey];\n })\n );\n\n return matched || null;\n}\n\n/**\n * 선택된 옵션 조합에 맞는 product_option 찾기\n *\n * 모든 옵션 그룹이 선택되면 일치하는 옵션 조합을 찾아 반환합니다.\n * selectedOptions 구조: { \"색상\": \"화이트\", \"사이즈\": \"S\" }\n *\n * @param action 액션 정의 (params에 selectedOptions, optionGroups, options 포함)\n * @returns { matchedOption: ProductOption | null }\n */\nexport function findMatchingOptionHandler(\n action?: any,\n _context?: any\n): { matchedOption: ProductOption | null } {\n const { selectedOptions, optionGroups, options } = action?.params || {};\n\n logger.log('findMatchingOption called:', { selectedOptions, optionGroups, optionsCount: options?.length });\n\n const matchedOption = findMatchingOption(selectedOptions, optionGroups, options);\n\n logger.log('Matched option:', matchedOption);\n\n // 결과 반환 - 레이아웃의 onSuccess에서 {{response.matchedOption}}으로 접근\n return { matchedOption };\n}\n\n/**\n * 현재 장바구니 아이템의 옵션을 초기 선택값으로 설정\n *\n * 모달이 열릴 때 현재 아이템의 옵션을 선택 상태로 초기화합니다.\n * currentOptionValues 구조: { \"색상\": \"블랙\", \"사이즈\": \"S\" }\n *\n * @param action 액션 정의 (params에 currentOptionValues, optionGroups, options 포함)\n * @returns { selectedOptions: Record, matchedOption: ProductOption | null }\n */\nexport function initCartOptionSelectionHandler(\n action?: any,\n _context?: any\n): InitCartOptionResult {\n const { currentOptionValues, optionGroups, options } = action?.params || {};\n\n logger.log('initCartOptionSelection called:', { currentOptionValues, optionGroups, optionsCount: options?.length });\n\n if (!optionGroups?.length || !currentOptionValues) {\n logger.log('No option groups or current values, returning empty');\n return { selectedOptions: {}, matchedOption: null };\n }\n\n // currentOptionValues를 그대로 selectedOptions로 사용\n // 둘 다 { \"색상\": \"블랙\", \"사이즈\": \"S\" } 형식 (name_localized 키 사용)\n const selectedOptions: Record = {};\n for (const group of optionGroups) {\n const groupKey = getGroupKey(group);\n const currentValue = currentOptionValues[groupKey];\n // values_localized가 있으면 우선 사용, 없으면 values 사용\n const valuesArray = group.values_localized ?? (\n Array.isArray(group.values)\n ? group.values.map((v: string | Record) => typeof v === 'string' ? v : (v as Record)?.ko ?? '')\n : []\n );\n if (currentValue && valuesArray.includes(currentValue)) {\n selectedOptions[groupKey] = currentValue;\n }\n }\n\n logger.log('Initial selectedOptions:', selectedOptions);\n\n // 매칭 옵션도 즉시 찾기\n const matchedOption = findMatchingOption(selectedOptions, optionGroups, options || []);\n\n logger.log('Matched option:', matchedOption);\n\n // 결과 반환 - 레이아웃의 onSuccess에서 {{response.selectedOptions}}, {{response.matchedOption}}으로 접근\n return { selectedOptions, matchedOption };\n}\n","/**\n * 로컬 스토리지 관련 핸들러\n *\n * 비로그인 사용자의 장바구니 키 등 클라이언트 스토리지 관리를 처리합니다.\n *\n * 핸들러 시그니처: ActionDispatcher의 ActionHandler 형식을 따름\n * (action: ActionDefinition, context: ActionContext) => void | Promise\n *\n * G7Core API 사용:\n * - G7Core.state.set() - 전역 상태 설정\n * - G7Core.state.get()._global?.currentUser - 현재 사용자 확인\n */\n\nconst CART_KEY_STORAGE_NAME = 'g7_cart_key';\nconst CART_KEY_API_ENDPOINT = '/api/modules/sirsoft-ecommerce/cart/key';\nconst GUEST_ORDER_TOKEN_STORAGE_NAME = 'g7_guest_order_token';\nconst GUEST_ORDER_NUMBER_STORAGE_NAME = 'g7_guest_order_number';\nconst GUEST_ORDER_EXPIRES_AT_STORAGE_NAME = 'g7_guest_order_expires_at';\n\n// Logger 설정 (G7Core 초기화 전에도 동작하도록 폴백 포함)\nconst logger = ((window as any).G7Core?.createLogger?.('Handler:Storage')) ?? {\n log: (...args: unknown[]) => console.log('[Handler:Storage]', ...args),\n warn: (...args: unknown[]) => console.warn('[Handler:Storage]', ...args),\n error: (...args: unknown[]) => console.error('[Handler:Storage]', ...args),\n};\n\n/**\n * 백엔드 API를 통해 Cart Key 발급\n *\n * @returns 발급된 cart_key 또는 null (실패 시)\n */\nasync function issueCartKeyFromApi(): Promise {\n try {\n const response = await fetch(CART_KEY_API_ENDPOINT, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n },\n });\n\n if (!response.ok) {\n logger.error('Failed to issue cartKey from API:', response.status);\n return null;\n }\n\n const data = await response.json();\n return data.data?.cart_key || null;\n } catch (error) {\n logger.error('Error issuing cartKey from API:', error);\n return null;\n }\n}\n\n/**\n * 전역 상태 설정 헬퍼\n */\nfunction setGlobalState(updates: Record): void {\n const G7Core = (window as any).G7Core;\n if (G7Core?.state?.set) {\n G7Core.state.set(updates);\n logger.log('Global state updated:', updates);\n } else {\n logger.warn('G7Core.state.set not available');\n }\n}\n\n/**\n * 현재 로그인 사용자 확인 헬퍼\n *\n * G7Config.user 또는 전역 상태에서 currentUser를 확인합니다.\n */\nfunction getCurrentUser(): any {\n try {\n // G7Config에서 사용자 정보 확인 (서버에서 주입)\n const g7Config = (window as any).G7Config;\n if (g7Config?.user) {\n return g7Config.user;\n }\n\n // 전역 상태에서 확인\n const G7Core = (window as any).G7Core;\n const globalState = G7Core?.state?.get?.() || {};\n return globalState.currentUser || null;\n } catch {\n return null;\n }\n}\n\n/**\n * 장바구니 키 초기화\n *\n * 비로그인 사용자의 장바구니를 식별하기 위한 키를 생성/로드합니다.\n * 이미 저장된 키가 있으면 로드하고, 없으면 백엔드 API를 통해 새로 발급합니다.\n *\n * ActionDispatcher 핸들러 형식: (action, context) => void | Promise\n *\n * @param _action 액션 정의 (사용하지 않음)\n * @param _context 액션 컨텍스트 (사용하지 않음)\n */\nexport async function initCartKeyHandler(\n _action?: any,\n _context?: any\n): Promise {\n // 로그인/비로그인 사용자 모두 cartKey 필요 (API 헤더에 포함)\n // localStorage에서 기존 cartKey 확인\n let cartKey: string | null = null;\n try {\n cartKey = localStorage.getItem(CART_KEY_STORAGE_NAME);\n } catch {\n // localStorage 접근 불가 시 무시\n }\n\n // 없으면 백엔드 API를 통해 새로 발급\n if (!cartKey) {\n cartKey = await issueCartKeyFromApi();\n\n if (cartKey) {\n try {\n localStorage.setItem(CART_KEY_STORAGE_NAME, cartKey);\n logger.log('New cartKey issued from API:', cartKey);\n } catch {\n // localStorage 저장 실패 시 무시\n }\n } else {\n logger.error('Failed to issue cartKey from API');\n }\n } else {\n logger.log('Existing cartKey loaded:', cartKey);\n }\n\n setGlobalState({ cartKey });\n}\n\n/**\n * 장바구니 키 가져오기\n *\n * 현재 저장된 장바구니 키를 반환합니다.\n *\n * @param _action 액션 정의 (사용하지 않음)\n * @param _context 액션 컨텍스트 (사용하지 않음)\n */\nexport function getCartKeyHandler(\n _action?: any,\n _context?: any\n): string | null {\n try {\n return localStorage.getItem(CART_KEY_STORAGE_NAME);\n } catch {\n return null;\n }\n}\n\n/**\n * 장바구니 키 삭제\n *\n * 로그인 시 게스트 장바구니 키를 삭제합니다 (서버에서 병합 후).\n *\n * @param _action 액션 정의 (사용하지 않음)\n * @param _context 액션 컨텍스트 (사용하지 않음)\n */\nexport function clearCartKeyHandler(\n _action?: any,\n _context?: any\n): void {\n try {\n localStorage.removeItem(CART_KEY_STORAGE_NAME);\n logger.log('cartKey removed from localStorage');\n } catch {\n // localStorage 접근 불가 시 무시\n }\n\n setGlobalState({ cartKey: null });\n}\n\n/**\n * 장바구니 키 새로 생성\n *\n * 기존 키를 삭제하고 백엔드 API를 통해 새로운 키를 발급합니다.\n *\n * @param _action 액션 정의 (사용하지 않음)\n * @param _context 액션 컨텍스트 (사용하지 않음)\n */\nexport async function regenerateCartKeyHandler(\n _action?: any,\n _context?: any\n): Promise {\n // 로그인된 사용자는 cartKey 불필요\n const currentUser = getCurrentUser();\n if (currentUser) {\n clearCartKeyHandler();\n return;\n }\n\n const newCartKey = await issueCartKeyFromApi();\n\n if (newCartKey) {\n try {\n localStorage.setItem(CART_KEY_STORAGE_NAME, newCartKey);\n logger.log('New cartKey regenerated from API:', newCartKey);\n } catch {\n // localStorage 저장 실패 시 무시\n }\n\n setGlobalState({ cartKey: newCartKey });\n } else {\n logger.error('Failed to regenerate cartKey from API');\n }\n}\n\n/**\n * 선호 통화 저장 (기존 loadPreferredCurrency.ts와 통합)\n *\n * @param action 액션 정의 (params에 key, value 포함)\n * @param _context 액션 컨텍스트 (사용하지 않음)\n */\nexport function saveToStorageHandler(\n action?: any,\n _context?: any\n): void {\n const { key, value } = action?.params || {};\n if (!key) {\n logger.warn('saveToStorage: key is required');\n return;\n }\n try {\n localStorage.setItem(key, value);\n logger.log('Saved to storage:', key, value);\n } catch {\n // localStorage 저장 실패 시 무시\n }\n}\n\n/**\n * 스토리지에서 값 로드\n *\n * @param action 액션 정의 (params에 key, defaultValue 포함)\n * @param _context 액션 컨텍스트 (사용하지 않음)\n */\nexport function loadFromStorageHandler(\n action?: any,\n _context?: any\n): string | null {\n const { key, defaultValue } = action?.params || {};\n if (!key) {\n logger.warn('loadFromStorage: key is required');\n return defaultValue || null;\n }\n try {\n return localStorage.getItem(key) || defaultValue || null;\n } catch {\n return defaultValue || null;\n }\n}\n\n/**\n * sessionStorage 의 비회원 주문 토큰을 모두 삭제합니다 (내부 헬퍼).\n *\n * 토큰/주문번호/만료시각 3개 키를 함께 비웁니다.\n */\nfunction clearGuestOrderTokenInternal(): void {\n try {\n sessionStorage.removeItem(GUEST_ORDER_TOKEN_STORAGE_NAME);\n sessionStorage.removeItem(GUEST_ORDER_NUMBER_STORAGE_NAME);\n sessionStorage.removeItem(GUEST_ORDER_EXPIRES_AT_STORAGE_NAME);\n } catch {\n // sessionStorage 접근 불가 시 무시\n }\n}\n\n/**\n * 비회원 주문 조회 토큰 초기화 (init_actions 전용)\n *\n * sessionStorage 의 g7_guest_order_token 을 읽어 `_global.guestOrderToken` 에 설정한다.\n * 표준 loadFromSessionStorage 핸들러는 `context.setState`(React 컴포넌트 state)를 호출해\n * `_local` 에만 영향을 주므로, `_global` 에 토큰을 설정하려면 `G7Core.state.set` 직접 호출이 필요하다.\n * `initCartKey` 와 동일한 패턴.\n *\n * 동작:\n * 1. sessionStorage 에서 토큰/만료시각 로드 (탭 종료 시 자동 소실 — 공유 PC 안전)\n * 2. 만료된 토큰은 자동 폐기 (3개 키 모두 제거)\n * 3. `_global.guestOrderToken` 에 토큰 또는 null 설정\n * 4. `_user_base.globalHeaders` 의 `X-Guest-Order-Token: {{_global.guestOrderToken}}` 패턴이\n * 토큰 있을 때만 `guest/orders/*` 호출에 헤더 자동 주입 (엔진이 null/빈값 자동 제외)\n *\n * @param _action 액션 정의 (사용하지 않음)\n * @param _context 액션 컨텍스트 (사용하지 않음)\n */\nexport function initGuestOrderTokenHandler(\n _action?: any,\n _context?: any\n): void {\n let token: string | null = null;\n let expiresAt: string | null = null;\n try {\n token = sessionStorage.getItem(GUEST_ORDER_TOKEN_STORAGE_NAME);\n expiresAt = sessionStorage.getItem(GUEST_ORDER_EXPIRES_AT_STORAGE_NAME);\n } catch {\n // sessionStorage 접근 불가 시 무시\n }\n\n // 만료된 토큰 자동 폐기 (백엔드도 동일 시각 기준으로 거부하지만 로컬에서 미리 정리)\n // expiresAt 이 invalid 포맷이면 getTime() 이 NaN → NaN <= now 비교가 false 라\n // 만료 인식이 안 되는 회귀를 방어한다. invalid 토큰도 명시적으로 폐기.\n let expired = false;\n if (token) {\n const expiryTs = expiresAt ? new Date(expiresAt).getTime() : NaN;\n if (isNaN(expiryTs) || expiryTs <= Date.now()) {\n clearGuestOrderTokenInternal();\n token = null;\n expired = true;\n }\n }\n\n if (token) {\n // sessionStorage 에 유효 토큰이 있으면 그 값으로 _global 동기화 (새로고침/재방문 경로)\n setGlobalState({ guestOrderToken: token });\n logger.log('Guest order token loaded from sessionStorage');\n return;\n }\n\n // sessionStorage 에 토큰이 없을 때, 직전 단계(verify onSuccess saveGuestOrderToken)가\n // 이미 _global.guestOrderToken 에 동기 set 해 둔 in-memory 토큰을 보존한다.\n // 조회 폼 verify→상세 SPA 전이에서 sessionStorage 쓰기가 제때 반영되지 않거나\n // (브라우저/프라이버시 모드) 비활성인 환경에서도, navigate 로 살아남은 _global 토큰으로\n // 상세 데이터소스가 X-Guest-Order-Token 을 주입할 수 있게 한다.\n // 단, 만료로 명시 폐기된 경우(expired)는 in-memory 토큰도 비운다.\n if (!expired) {\n const G7Core = (window as any).G7Core;\n const existing = G7Core?.state?.get?.('_global')?.guestOrderToken;\n if (typeof existing === 'string' && existing !== '') {\n logger.log('Guest order token preserved from in-memory _global (sessionStorage empty)');\n return;\n }\n }\n\n setGlobalState({ guestOrderToken: null });\n logger.log('No guest order token (visitor not authenticated)');\n}\n\n// 표시 통화(preferredCurrency) 초기화 핸들러는 이커머스 모듈로 이전되었다\n// (modules/_bundled/sirsoft-ecommerce/resources/js/handlers/initPreferredCurrency.ts).\n// \"통화 = 커머스 책임\" 원칙 — 레이아웃은 `sirsoft-ecommerce.initPreferredCurrency` 로 호출한다.\n\n/**\n * 비회원 주문 토큰을 sessionStorage 에 저장하고 _global 에 동기 set 합니다.\n *\n * 토큰/주문번호/만료시각 3개 키를 함께 저장하며, _global.guestOrderToken 도 즉시 갱신해\n * 직후 호출되는 navigate 의 globalHeaders 자동 주입이 동작하도록 한다.\n *\n * @param action params.token, params.orderNumber, params.expiresAt 필수\n * @param _context 액션 컨텍스트 (사용하지 않음)\n */\nexport function saveGuestOrderTokenHandler(\n action?: any,\n _context?: any\n): void {\n const { token, orderNumber, expiresAt } = action?.params || {};\n if (!token || !orderNumber || !expiresAt) {\n logger.warn('saveGuestOrderToken: token, orderNumber, expiresAt are required');\n return;\n }\n try {\n sessionStorage.setItem(GUEST_ORDER_TOKEN_STORAGE_NAME, token);\n sessionStorage.setItem(GUEST_ORDER_NUMBER_STORAGE_NAME, orderNumber);\n sessionStorage.setItem(GUEST_ORDER_EXPIRES_AT_STORAGE_NAME, expiresAt);\n } catch {\n // sessionStorage 접근 불가 시 무시 (private 모드 등) — _global 만 set 되어 현재 페이지는 동작\n }\n setGlobalState({ guestOrderToken: token });\n}\n\n/**\n * 비회원 주문 토큰을 sessionStorage 에서 삭제하고 _global 도 비웁니다.\n *\n * 비회원 주문 취소/구매확정/명시적 로그아웃 등 토큰 무효화 시점에서 호출.\n *\n * @param _action 액션 정의 (사용하지 않음)\n * @param _context 액션 컨텍스트 (사용하지 않음)\n */\nexport function clearGuestOrderTokenHandler(\n _action?: any,\n _context?: any\n): void {\n clearGuestOrderTokenInternal();\n setGlobalState({ guestOrderToken: null });\n}\n\n/**\n * 비회원 주문 조회 폼(guest_order_form) 진입 시 sessionStorage 의 비회원 주문 토큰을 초기화한다.\n *\n * 비회원 주문 조회 폼은 매번 새로 본인 확인을 거치는 게 표준 패턴(eBay/Best Buy/카페24/\n * 11번가/G마켓 등). 결제 직후 자동 verify 로 받은 토큰은 완료/상세 화면에서는 유효하지만,\n * 사용자가 헤더 '비회원 주문 조회' 메뉴 등을 통해 조회 폼에 도달했을 때는 의도가\n * \"다시 조회\" 이므로 토큰을 비워 폼이 정상 노출되도록 한다.\n *\n * 만료된 토큰도 같은 경로로 자연스럽게 정리된다.\n *\n * @param _action 액션 정의 (사용하지 않음)\n * @param _context 액션 컨텍스트 (사용하지 않음)\n */\nexport function clearGuestTokenOnEntryHandler(\n _action?: any,\n _context?: any\n): void {\n clearGuestOrderTokenInternal();\n setGlobalState({ guestOrderToken: null });\n}\n","/**\n * 다중 통화 가격 표시 핸들러\n *\n * 사용자가 선택한 통화에 맞는 가격 문자열을 반환합니다.\n */\n\nimport { HandlerContext } from '../types';\n\ninterface CurrencyPrice {\n value: number;\n formatted: string;\n}\n\ninterface Product {\n selling_price: number;\n selling_price_formatted: string;\n list_price?: number;\n list_price_formatted?: string;\n multi_currency_selling_price?: Record;\n multi_currency_list_price?: Record;\n [key: string]: unknown;\n}\n\ninterface GetDisplayPriceParams {\n product: Product;\n priceField: 'selling_price' | 'list_price';\n currencyCode?: string;\n}\n\n/**\n * 선호 통화에 맞는 가격을 반환합니다.\n *\n * @param params.product - 상품 객체\n * @param params.priceField - 가격 필드 ('selling_price' | 'list_price')\n * @param params.currencyCode - 통화 코드 (선택, 미지정 시 전역 설정 사용)\n * @param context - 핸들러 컨텍스트\n * @returns 포맷팅된 가격 문자열\n *\n * @example\n * // 레이아웃 JSON에서 사용\n * {\n * \"text\": \"{{handler('getDisplayPrice', { product: product.data, priceField: 'selling_price' })}}\"\n * }\n */\nexport function getDisplayPriceHandler(\n params: GetDisplayPriceParams,\n context: HandlerContext\n): string {\n const { product, priceField, currencyCode } = params;\n const preferredCurrency = currencyCode || context.getState('_global.preferredCurrency') || 'KRW';\n\n const multiCurrencyField = `multi_currency_${priceField}` as keyof Product;\n const multiCurrencyData = product[multiCurrencyField] as Record | undefined;\n\n if (multiCurrencyData && multiCurrencyData[preferredCurrency]) {\n return multiCurrencyData[preferredCurrency].formatted;\n }\n\n // 폴백: 기본 통화\n const formattedField = `${priceField}_formatted` as keyof Product;\n return (product[formattedField] as string) || String(product[priceField]);\n}\n","/**\n * 통화 포맷팅 핸들러\n *\n * 숫자 값을 통화 형식 문자열로 변환합니다.\n */\n\nimport { HandlerContext } from '../types';\n\ninterface FormatCurrencyParams {\n value: number;\n currencyCode?: string;\n locale?: string;\n}\n\ninterface CurrencyConfig {\n code: string;\n symbol: string;\n locale: string;\n decimals: number;\n}\n\n/**\n * 통화별 기본 설정\n */\nconst CURRENCY_CONFIGS: Record = {\n KRW: { code: 'KRW', symbol: '₩', locale: 'ko-KR', decimals: 0 },\n USD: { code: 'USD', symbol: '$', locale: 'en-US', decimals: 2 },\n JPY: { code: 'JPY', symbol: '¥', locale: 'ja-JP', decimals: 0 },\n CNY: { code: 'CNY', symbol: '¥', locale: 'zh-CN', decimals: 2 },\n EUR: { code: 'EUR', symbol: '€', locale: 'de-DE', decimals: 2 },\n};\n\n/**\n * 숫자 값을 통화 형식으로 포맷팅합니다.\n *\n * @param params.value - 포맷팅할 숫자 값\n * @param params.currencyCode - 통화 코드 (KRW, USD, JPY 등)\n * @param params.locale - 로케일 (선택, 미지정 시 통화 기본 로케일 사용)\n * @param context - 핸들러 컨텍스트\n * @returns 포맷팅된 통화 문자열\n *\n * @example\n * formatCurrencyHandler({ value: 10000, currencyCode: 'KRW' }, context)\n * // => \"₩10,000\" 또는 \"10,000원\"\n *\n * formatCurrencyHandler({ value: 99.99, currencyCode: 'USD' }, context)\n * // => \"$99.99\"\n */\nexport function formatCurrencyHandler(\n params: FormatCurrencyParams,\n context: HandlerContext\n): string {\n const { value, currencyCode, locale: customLocale } = params;\n const currency = currencyCode || context.getState('_global.preferredCurrency') || 'KRW';\n\n const config = CURRENCY_CONFIGS[currency] || CURRENCY_CONFIGS.KRW;\n const locale = customLocale || config.locale;\n\n try {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: config.code,\n minimumFractionDigits: config.decimals,\n maximumFractionDigits: config.decimals,\n }).format(value);\n } catch {\n // Intl 지원 안 되는 환경 폴백\n const formatted = value.toLocaleString(undefined, {\n minimumFractionDigits: config.decimals,\n maximumFractionDigits: config.decimals,\n });\n return `${config.symbol}${formatted}`;\n }\n}\n\n/**\n * 통화 심볼만 반환합니다.\n *\n * @param currencyCode - 통화 코드\n * @returns 통화 심볼\n */\nexport function getCurrencySymbol(currencyCode: string): string {\n return CURRENCY_CONFIGS[currencyCode]?.symbol || currencyCode;\n}\n","/**\n * 선호 통화 로드 핸들러\n *\n * localStorage에서 사용자가 선택한 통화 설정을 로드합니다.\n */\n\n// Logger 설정 (G7Core 초기화 전에도 동작하도록 폴백 포함)\nconst logger = ((window as any).G7Core?.createLogger?.('Handler:Currency')) ?? {\n log: (...args: unknown[]) => console.log('[Handler:Currency]', ...args),\n warn: (...args: unknown[]) => console.warn('[Handler:Currency]', ...args),\n error: (...args: unknown[]) => console.error('[Handler:Currency]', ...args),\n};\n\nimport { HandlerContext } from '../types';\n\nconst STORAGE_KEY = 'g7_preferred_currency';\nconst DEFAULT_CURRENCY = 'KRW';\n\ninterface LoadPreferredCurrencyParams {\n defaultCurrency?: string;\n}\n\n/**\n * localStorage에서 선호 통화를 로드하여 전역 상태에 설정합니다.\n *\n * @param params.defaultCurrency - 기본 통화 (선택, 기본값: 'KRW')\n * @param context - 핸들러 컨텍스트\n * @returns 로드된 통화 코드\n *\n * @example\n * // _user_base.json의 init_actions에서 사용\n * {\n * \"init_actions\": [\n * {\n * \"handler\": \"loadPreferredCurrency\",\n * \"params\": { \"defaultCurrency\": \"KRW\" }\n * }\n * ]\n * }\n */\nexport function loadPreferredCurrencyHandler(\n params: LoadPreferredCurrencyParams,\n context: HandlerContext\n): string {\n const { defaultCurrency = DEFAULT_CURRENCY } = params;\n\n let currency = defaultCurrency;\n\n try {\n if (typeof window !== 'undefined' && window.localStorage) {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored && isValidCurrency(stored)) {\n currency = stored;\n }\n }\n } catch {\n // localStorage 접근 불가 시 기본값 사용\n logger.warn('localStorage 접근 불가, 기본 통화 사용:', defaultCurrency);\n }\n\n // 전역 상태에 설정\n context.setState('global', { preferredCurrency: currency });\n\n return currency;\n}\n\n/**\n * 선호 통화를 localStorage에 저장합니다.\n *\n * @param currencyCode - 저장할 통화 코드\n * @param context - 핸들러 컨텍스트\n *\n * @example\n * // 통화 선택 드롭다운에서 사용\n * {\n * \"actions\": [\n * {\n * \"type\": \"click\",\n * \"handler\": \"savePreferredCurrency\",\n * \"params\": { \"currencyCode\": \"{{currency.code}}\" }\n * }\n * ]\n * }\n */\nexport function savePreferredCurrencyHandler(\n params: { currencyCode: string },\n context: HandlerContext\n): void {\n const { currencyCode } = params;\n\n if (!isValidCurrency(currencyCode)) {\n logger.warn('유효하지 않은 통화 코드:', currencyCode);\n return;\n }\n\n try {\n if (typeof window !== 'undefined' && window.localStorage) {\n localStorage.setItem(STORAGE_KEY, currencyCode);\n }\n } catch {\n logger.warn('localStorage 저장 실패');\n }\n\n // 전역 상태 업데이트\n context.setState('global', { preferredCurrency: currencyCode });\n}\n\n/**\n * 유효한 통화 코드 형식인지 확인합니다.\n *\n * 관리자가 추가/삭제하는 통화를 하드코딩 목록이 막지 않도록(A1-⑥), 고정 화이트리스트가 아니라\n * ISO 4217 형식(영문 대문자 3자리)으로 검증한다. 실제 노출 통화 제한은 셀렉터가 표시하는\n * _global.availableCurrencies(is_default || exchange_rate>0)가 담당한다.\n */\nfunction isValidCurrency(code: string): boolean {\n return typeof code === 'string' && /^[A-Z]{3}$/.test(code);\n}\n","/**\n * setTheme 핸들러\n *\n * 사용자가 선택한 테마(auto/light/dark)로 변경합니다.\n * localStorage에 g7_color_scheme 값을 저장하고 즉시 적용합니다.\n *\n * sirsoft-admin_basic 템플릿과 동일한 키를 사용하여 테마 설정을 공유합니다.\n */\n\n// Logger 설정 (G7Core 초기화 전에도 동작하도록 폴백 포함)\nconst logger = ((window as any).G7Core?.createLogger?.('Handler:SetTheme')) ?? {\n log: (...args: unknown[]) => console.log('[Handler:SetTheme]', ...args),\n warn: (...args: unknown[]) => console.warn('[Handler:SetTheme]', ...args),\n error: (...args: unknown[]) => console.error('[Handler:SetTheme]', ...args),\n};\n\n/**\n * 테마 모드 타입\n */\nexport type ThemeMode = 'auto' | 'light' | 'dark';\n\n/**\n * 유효한 테마 목록\n */\nconst VALID_THEMES: ThemeMode[] = ['auto', 'light', 'dark'];\n\n/**\n * localStorage 키 (admin 템플릿과 동일)\n */\nconst STORAGE_KEY = 'g7_color_scheme';\n\n/**\n * 실제 적용될 테마 결정 (auto인 경우 시스템 설정 반영)\n */\nconst getEffectiveTheme = (mode: ThemeMode): 'light' | 'dark' => {\n if (mode === 'auto') {\n return window.matchMedia('(prefers-color-scheme: dark)').matches\n ? 'dark'\n : 'light';\n }\n return mode;\n};\n\n/**\n * 테마 적용\n *\n * document.documentElement에 data-theme 속성과 dark 클래스를 설정합니다.\n */\nconst applyTheme = (mode: ThemeMode): void => {\n const effectiveTheme = getEffectiveTheme(mode);\n document.documentElement.setAttribute('data-theme', effectiveTheme);\n\n // dark 클래스 토글 (Tailwind CSS dark: 모드 지원)\n if (effectiveTheme === 'dark') {\n document.documentElement.classList.add('dark');\n } else {\n document.documentElement.classList.remove('dark');\n }\n};\n\n/**\n * 저장된 테마를 로드하여 적용합니다.\n *\n * 템플릿 초기화 시 호출되어 localStorage에 저장된 테마를 즉시 적용합니다.\n */\nexport function initTheme(): void {\n try {\n const savedTheme = localStorage.getItem(STORAGE_KEY) as ThemeMode | null;\n const theme = savedTheme && VALID_THEMES.includes(savedTheme) ? savedTheme : 'auto';\n applyTheme(theme);\n logger.log('Initial theme applied:', theme);\n } catch (error) {\n logger.warn('Failed to load initial theme:', error);\n applyTheme('auto');\n }\n}\n\n/**\n * initTheme 핸들러\n *\n * 레이아웃의 init_actions에서 호출되어 초기 테마를 적용합니다.\n * ActionDispatcher의 커스텀 핸들러 형식을 따릅니다.\n *\n * target 파라미터가 전달되면 해당 테마로 초기화합니다.\n * target이 없거나 유효하지 않으면 localStorage 또는 'auto'를 사용합니다.\n *\n * @param action 액션 정의 (target에 테마 값 포함 가능)\n * @param _context 액션 컨텍스트 (사용하지 않음)\n */\nexport async function initThemeHandler(\n action: any,\n _context?: any\n): Promise {\n // action.target이 바인딩 해결된 값으로 전달됨 (ActionDispatcher에서 resolveValue 호출)\n const targetTheme = action?.target;\n\n // target이 유효한 테마 값인 경우 해당 테마 적용\n if (targetTheme && typeof targetTheme === 'string' && VALID_THEMES.includes(targetTheme as ThemeMode)) {\n applyTheme(targetTheme as ThemeMode);\n return;\n }\n\n // target이 없거나 유효하지 않으면 기존 로직 (localStorage 또는 auto)\n initTheme();\n}\n\n/**\n * 테마 변경 핸들러\n *\n * ActionDispatcher는 handler(action, context) 형태로 호출합니다.\n * context 객체에는 { data, event, props, state, setState, navigate } 등이 포함됩니다.\n *\n * @param action 액션 정의\n * @param context 액션 컨텍스트 (ActionContext 타입)\n */\nexport async function setThemeHandler(\n action: any,\n _context?: any\n): Promise {\n // 1. 테마 값 추출\n let theme: string | undefined;\n\n // action.target이 바인딩 해결된 값으로 전달됨 (ActionDispatcher에서 resolveValue 호출)\n if (action?.target && typeof action.target === 'string' && !action.target.includes('{{')) {\n theme = action.target;\n }\n\n // 2. 유효성 검증\n if (!theme || typeof theme !== 'string') {\n logger.warn('Invalid theme:', theme);\n return;\n }\n\n if (!VALID_THEMES.includes(theme as ThemeMode)) {\n logger.warn('Unsupported theme:', theme);\n return;\n }\n\n const validTheme = theme as ThemeMode;\n\n // 3. localStorage에 저장\n try {\n localStorage.setItem(STORAGE_KEY, validTheme);\n } catch (error) {\n logger.error('Failed to save theme to localStorage:', error);\n return;\n }\n\n // 4. 테마 즉시 적용 (페이지 새로고침 없이)\n applyTheme(validTheme);\n\n logger.log('Theme changed to:', validTheme);\n}\n","/**\n * redirectToLoginWithReturn 핸들러\n *\n * 비로그인 회원전용 게시판/비밀글 진입 시 로그인 페이지로 보내되,\n * 현재 경로(pathname + querystring)를 redirect 파라미터로 보존한다.\n * 로그인 폼은 {{query.redirect ?? '/'}} 로 복원하므로(_login_form.json:155),\n * 로그인 성공 후 원래 위치로 복귀한다.\n *\n * 배경: 게시판 목록/상세 데이터소스 401(auth_mode: optional + 토큰 없음)은\n * 코어 ApiClient 자동가드를 우회하고 errorHandling 경로로 진입하는데,\n * 그 context 에는 route/query 가 없다(TemplateApp.ts setDefaultContext 는 navigate 만 주입).\n * 따라서 레이아웃 표현식으로는 현재 경로를 캡처할 수 없으므로, 핸들러가 window.location 을\n * 직접 읽어 우회한다(identityLauncher.ts 의 window.location.href 선례와 동일 패턴).\n *\n * window.location.pathname 은 항상 '/' 로 시작하는 same-origin path 이므로 외부 URL 주입이\n * 불가능하다(open redirect 안전).\n */\n\n// Logger 설정 (G7Core 초기화 전에도 동작하도록 폴백 포함)\nconst logger = ((window as any).G7Core?.createLogger?.('Handler:RedirectToLoginWithReturn')) ?? {\n log: (...args: unknown[]) => console.log('[Handler:RedirectToLoginWithReturn]', ...args),\n warn: (...args: unknown[]) => console.warn('[Handler:RedirectToLoginWithReturn]', ...args),\n error: (...args: unknown[]) => console.error('[Handler:RedirectToLoginWithReturn]', ...args),\n};\n\n/**\n * 로그인 페이지로 이동하되 현재 경로를 redirect 로 보존하는 핸들러\n *\n * ActionDispatcher 는 handler(action, context) 형태로 호출하지만(ActionDispatcher.ts),\n * 이 핸들러는 action/context 를 사용하지 않는다 — 현재 경로는 window.location 에서 직접 읽는다.\n *\n * @param _action 액션 정의 (미사용)\n * @param _context 액션 컨텍스트 (미사용)\n * @return Promise\n */\nexport async function redirectToLoginWithReturnHandler(\n _action?: any,\n _context?: any\n): Promise {\n const G7Core = (window as any).G7Core;\n\n if (!G7Core?.dispatch) {\n logger.error('G7Core.dispatch 가 초기화되지 않아 로그인 리다이렉트를 실행할 수 없습니다.');\n return;\n }\n\n // 핸들러는 표현식 화이트리스트 제약 밖 — window.location 직접 접근 가능.\n // pathname + search 로 현재 경로(쿼리스트링 포함)를 보존한다.\n const returnUrl = window.location.pathname + window.location.search;\n\n await G7Core.dispatch({\n handler: 'navigate',\n params: {\n path: '/login',\n // navigate 가 params.query 를 URLSearchParams 로 인코딩(ActionDispatcher.ts handleNavigate).\n // 로그인 폼은 {{query.redirect ?? '/'}} 로 복원(_login_form.json).\n query: { redirect: returnUrl },\n },\n });\n}\n","/**\n * downloadAttachment 핸들러\n *\n * 게시판 첨부파일을 토큰 동반 요청으로 다운로드한다 (이슈 #413 item 58b).\n *\n * 배경: 기존 다운로드는 레이아웃의 브라우저 직접 링크(GET)였다.\n * G7 은 Sanctum 토큰 전용 인증인데 네비게이션에는 Authorization 헤더(토큰)가 실리지 않아,\n * download_url 이 가리키는 optional.sanctum 라우트가 요청을 guest 로 통과시켰다.\n * 그 결과 회원이 받아도 서버의 Auth::id() 가 NULL 이 되어 활동이력(attachment.download)의\n * 행위자(user_id)가 비어 있었다(upload/board.update 는 정상이었다).\n *\n * 해소: 코어 ApiClient(G7Core.api.get)로 blob 요청을 보내면 Authorization 헤더가 자동 첨부되어\n * 토큰이 실린다. 받은 blob 을 objectURL 로 변환해 클릭으로 저장한다\n * (composite/ImageGallery.tsx 의 downloadAuthenticatedFile 과 동일 패턴).\n *\n * 비회원: 토큰이 없으므로 종전과 동일하게 user_id 가 NULL 로 남는다(현행 정책 유지).\n */\n\n// Logger 설정 (G7Core 초기화 전에도 동작하도록 폴백 포함)\nconst logger = (window as any).G7Core?.createLogger?.('Handler:DownloadAttachment') ?? {\n log: (...args: unknown[]) => console.log('[Handler:DownloadAttachment]', ...args),\n warn: (...args: unknown[]) => console.warn('[Handler:DownloadAttachment]', ...args),\n error: (...args: unknown[]) => console.error('[Handler:DownloadAttachment]', ...args),\n};\n\n/**\n * 첨부파일을 토큰 동반 요청으로 다운로드하는 핸들러\n *\n * ActionDispatcher 는 handler(action, context) 형태로 호출한다.\n * params 는 resolveParams 로 이미 표현식이 해석된 값을 받는다.\n *\n * @param action 액션 정의 (params.url=다운로드 URL, params.filename=저장 파일명)\n * @param _context 액션 컨텍스트 (미사용)\n * @return Promise\n */\nexport async function downloadAttachmentHandler(action?: any, _context?: any): Promise {\n const G7Core = (window as any).G7Core;\n const { url, filename } = action?.params || {};\n\n if (!url) {\n logger.warn('다운로드 URL 이 없어 요청을 건너뜁니다.');\n return;\n }\n\n if (!G7Core?.api?.get) {\n logger.error('G7Core.api.get 이 초기화되지 않아 다운로드를 실행할 수 없습니다.');\n return;\n }\n\n try {\n // 코어 ApiClient 경로 → Authorization(Bearer) 헤더 자동 첨부 → 회원 토큰이 실린다.\n const blob = await G7Core.api.get(url, { responseType: 'blob' });\n\n if (blob) {\n const objectUrl = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = objectUrl;\n link.download = filename || '';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(objectUrl);\n }\n } catch (error) {\n logger.error('첨부파일 다운로드 실패', error);\n G7Core?.toast?.error?.(G7Core?.t?.('common.download_failed') ?? 'Download failed');\n }\n}\n","/**\n * sirsoft-basic 템플릿 핸들러 등록\n *\n * 이 파일에서 모든 커스텀 핸들러를 export합니다.\n * G7Core에서 자동으로 로드하여 사용할 수 있습니다.\n */\n\n// 상품 옵션 관련 핸들러\nimport {\n addSelectedItemIfCompleteHandler,\n updateSelectedItemQuantityHandler,\n removeSelectedItemHandler,\n updateNoOptionQuantityHandler,\n setBlockAdditionalOptionHandler,\n} from './productOptions';\n\n// 장바구니 관련 핸들러\nimport {\n toggleCartItemSelectionHandler,\n selectAllCartItemsHandler,\n setCartOptionHandler,\n openCartDeleteModalHandler,\n openCartOptionModalHandler,\n recalculateCartHandler,\n} from './cartHandlers';\n\n// 장바구니 옵션 변경 관련 핸들러\nimport {\n findMatchingOptionHandler,\n initCartOptionSelectionHandler,\n} from './cartOptionChange';\n\n// 스토리지 관련 핸들러\nimport {\n initCartKeyHandler,\n getCartKeyHandler,\n clearCartKeyHandler,\n regenerateCartKeyHandler,\n saveToStorageHandler,\n loadFromStorageHandler,\n initGuestOrderTokenHandler,\n saveGuestOrderTokenHandler,\n clearGuestOrderTokenHandler,\n clearGuestTokenOnEntryHandler,\n} from './storageHandlers';\n\n// 다중 통화 관련 핸들러\nimport { getDisplayPriceHandler } from './getDisplayPrice';\nimport { formatCurrencyHandler, getCurrencySymbol } from './formatCurrency';\nimport {\n loadPreferredCurrencyHandler,\n savePreferredCurrencyHandler,\n} from './loadPreferredCurrency';\n\n// 테마 관련 핸들러\nimport { setThemeHandler, initThemeHandler } from './setThemeHandler';\n\n// 인증 리다이렉트 관련 핸들러\nimport { redirectToLoginWithReturnHandler } from './redirectToLoginWithReturn';\n\n// 게시판 첨부 다운로드 핸들러 (토큰 동반 → 활동이력 행위자 기록)\nimport { downloadAttachmentHandler } from './downloadAttachment';\n\n// 언어 관련 핸들러는 엔진 레벨(ActionDispatcher)에서 처리\n// setLocale 핸들러는 ActionDispatcher에 빌트인으로 등록되어 있음\n\n/**\n * sirsoft-basic 템플릿의 모든 커스텀 핸들러\n *\n * 네이밍 규칙: 'sirsoft-basic.[핸들러명]'\n *\n * @example\n * // 레이아웃 JSON에서 사용\n * {\n * \"handler\": \"custom\",\n * \"name\": \"addSelectedItemIfComplete\",\n * \"params\": { ... }\n * }\n *\n * // 또는 풀네임으로\n * {\n * \"handler\": \"sirsoft-basic.addSelectedItemIfComplete\",\n * \"params\": { ... }\n * }\n */\nexport const handlers = {\n // 상품 옵션\n 'sirsoft-basic.addSelectedItemIfComplete': addSelectedItemIfCompleteHandler,\n 'sirsoft-basic.updateSelectedItemQuantity': updateSelectedItemQuantityHandler,\n 'sirsoft-basic.removeSelectedItem': removeSelectedItemHandler,\n 'sirsoft-basic.updateNoOptionQuantity': updateNoOptionQuantityHandler,\n 'sirsoft-basic.setBlockAdditionalOption': setBlockAdditionalOptionHandler,\n\n // 다중 통화\n 'sirsoft-basic.getDisplayPrice': getDisplayPriceHandler,\n 'sirsoft-basic.formatCurrency': formatCurrencyHandler,\n 'sirsoft-basic.getCurrencySymbol': getCurrencySymbol,\n 'sirsoft-basic.loadPreferredCurrency': loadPreferredCurrencyHandler,\n 'sirsoft-basic.savePreferredCurrency': savePreferredCurrencyHandler,\n\n // 테마\n setTheme: setThemeHandler,\n initTheme: initThemeHandler,\n\n // 인증 리다이렉트 (비로그인 게시판/비밀글 진입 → /login?redirect=현재경로)\n redirectToLoginWithReturn: redirectToLoginWithReturnHandler,\n\n // 게시판 첨부 다운로드 (토큰 동반 → 활동이력 행위자 기록)\n downloadAttachment: downloadAttachmentHandler,\n\n // 언어: setLocale은 엔진 레벨(ActionDispatcher)에서 빌트인으로 처리\n\n // 장바구니\n toggleCartItemSelection: toggleCartItemSelectionHandler,\n selectAllCartItems: selectAllCartItemsHandler,\n setCartOption: setCartOptionHandler,\n openCartDeleteModal: openCartDeleteModalHandler,\n openCartOptionModal: openCartOptionModalHandler,\n recalculateCart: recalculateCartHandler,\n\n // 장바구니 옵션 변경\n findMatchingOption: findMatchingOptionHandler,\n initCartOptionSelection: initCartOptionSelectionHandler,\n\n // 스토리지\n initCartKey: initCartKeyHandler,\n getCartKey: getCartKeyHandler,\n clearCartKey: clearCartKeyHandler,\n regenerateCartKey: regenerateCartKeyHandler,\n saveToStorage: saveToStorageHandler,\n loadFromStorage: loadFromStorageHandler,\n initGuestOrderToken: initGuestOrderTokenHandler,\n saveGuestOrderToken: saveGuestOrderTokenHandler,\n clearGuestOrderToken: clearGuestOrderTokenHandler,\n clearGuestTokenOnEntry: clearGuestTokenOnEntryHandler,\n};\n\n/**\n * 핸들러 맵 (handlerMap alias)\n *\n * index.ts에서 import할 때 사용\n */\nexport const handlerMap = handlers;\n\n/**\n * 핸들러 타입 정의 (TypeScript 자동완성용)\n */\nexport type SirsoftBasicHandlers = typeof handlers;\n\n// 개별 핸들러 export (직접 import용)\nexport {\n addSelectedItemIfCompleteHandler,\n updateSelectedItemQuantityHandler,\n removeSelectedItemHandler,\n updateNoOptionQuantityHandler,\n setBlockAdditionalOptionHandler,\n getDisplayPriceHandler,\n formatCurrencyHandler,\n getCurrencySymbol,\n loadPreferredCurrencyHandler,\n savePreferredCurrencyHandler,\n setThemeHandler,\n initThemeHandler,\n // 인증 리다이렉트\n redirectToLoginWithReturnHandler,\n // 게시판 첨부 다운로드\n downloadAttachmentHandler,\n // setLocaleHandler는 엔진 레벨에서 처리하므로 제거됨\n // 장바구니\n toggleCartItemSelectionHandler,\n selectAllCartItemsHandler,\n setCartOptionHandler,\n openCartDeleteModalHandler,\n openCartOptionModalHandler,\n recalculateCartHandler,\n // 장바구니 옵션 변경\n findMatchingOptionHandler,\n initCartOptionSelectionHandler,\n // 스토리지\n initCartKeyHandler,\n getCartKeyHandler,\n clearCartKeyHandler,\n regenerateCartKeyHandler,\n saveToStorageHandler,\n loadFromStorageHandler,\n initGuestOrderTokenHandler,\n saveGuestOrderTokenHandler,\n clearGuestOrderTokenHandler,\n clearGuestTokenOnEntryHandler,\n};\n","/**\n * IDV Modal Launcher (sirsoft-basic)\n *\n * 코어 `IdentityGuardInterceptor` 가 428 응답을 가로채면 호출하는 launcher 입니다.\n *\n * 코어 진입점은 `window.G7Core.identity.*` 를 통해 사용 — 템플릿 IIFE 번들이 코어 모듈을\n * 중복 포함하면서 정적 클래스 상태가 분리되는 사고를 방지합니다 (다음 우편번호 / CKEditor5 와 동일 패턴).\n *\n * 동작 순서:\n * 1. `external_redirect` 분기 — 코어 helper `redirectExternally` 로 위임.\n * 2. `POST /api/identity/challenges` 로 challenge 시작 → `id, expires_at, render_hint, public_payload` 획득.\n * 3. `_global.identityChallenge` 네임스페이스에 verification payload + challenge 응답 병합.\n * 4. 카운트다운 `startInterval` 등록.\n * 5. `openModal: identity-challenge-modal` 디스패치.\n * 6. `createDeferred()` Promise 반환 — 모달이 `resolveIdentityChallenge` 핸들러로 결과 통보 시 resolve.\n *\n * 외부 IDV 플러그인(KCP/PortOne 등) 은 모달 파셜의 `identity_provider_ui:*` Extension Point 슬롯에\n * 자기 컴포넌트 + scripts 를 주입하여 launcher 변경 없이 자기 SDK 를 띄울 수 있습니다.\n */\n\nconst logger = ((window as any).G7Core?.createLogger?.('Template:sirsoft-basic:IdentityLauncher')) ?? {\n log: (...args: unknown[]) => console.log('[Template:sirsoft-basic:IdentityLauncher]', ...args),\n warn: (...args: unknown[]) => console.warn('[Template:sirsoft-basic:IdentityLauncher]', ...args),\n error: (...args: unknown[]) => console.error('[Template:sirsoft-basic:IdentityLauncher]', ...args),\n};\n\n/**\n * 코어가 launcher 에 전달하는 verification payload (런타임 형태).\n * 코어 타입 import 를 피하려고 로컬에 정의 — 실제 형식은 `resources/js/core/identity/types.ts` 와 동일.\n */\ninterface IdentityVerificationTarget {\n email?: string;\n phone?: string;\n}\n\ninterface VerificationPayload {\n policy_key: string;\n purpose: string;\n provider_id?: string | null;\n render_hint?: string | null;\n challenge_start_url?: string;\n redirect_url?: string;\n return_request?: { method: string; url: string; headers_echo?: string[] } | null;\n /** 흐름이 apiCall identity_target 으로 선언한 인증 대상 — 코어 인터셉터가 병합해 전달. */\n target?: IdentityVerificationTarget | null;\n}\n\n/**\n * launcher 가 코어에 돌려주는 결과 타입 (런타임 형태).\n */\ntype VerificationResult =\n | { status: 'verified'; token: string; providerData?: Record }\n | { status: 'pending'; pollUrl: string; pollIntervalMs?: number; expiresAt: string }\n | { status: 'cancelled' }\n | { status: 'failed'; failureCode: string; reason?: string };\n\n/**\n * 인증 대상(이메일·전화)을 결정합니다.\n *\n * 우선순위 (필드별 보충 머지 — email/phone 각각 첫 비어있지 않은 값 채택):\n * 1. `payload.target` — 흐름이 apiCall `identity_target` 으로 선언한 값 (범용 진입점, 비로그인 흐름의 핵심)\n * 2. 로그인 사용자 세션 (`currentUser` / `user` / `auth.user` 의 email·phone)\n * 3. (하위호환) signup/password_reset 폼 — `identity_target` 미선언 기존 레이아웃 대비\n *\n * 흐름별 폼 경로 하드코딩을 폐기하고 선언값을 1순위로 둠으로써, 주문/게시판/임의 액션 어떤 흐름이든\n * 레이아웃이 `identity_target` 만 선언하면 launcher 변경 없이 동작한다.\n *\n * 반환값은 launcher 에서 두 곳에 사용:\n * 1) 첫 POST /api/identity/challenges body 에 동봉\n * 2) `_global.identityChallenge.target` 에 저장 — 모달 재전송 액션이 같은 target 을 재사용\n *\n * @param payload 코어 인터셉터가 전달한 verification payload (target 병합 포함)\n * @returns 인증 대상 또는 null (email·phone 둘 다 없으면 — 로그인 사용자는 서버 세션 도출)\n */\nfunction resolveTarget(payload: VerificationPayload): IdentityVerificationTarget | null {\n const G7Core = (window as any).G7Core;\n const local = G7Core?.state?.getLocal?.() ?? {};\n const global = G7Core?.state?.getGlobal?.() ?? G7Core?.state?.get?.() ?? {};\n\n const pick = (...candidates: Array): string | undefined =>\n candidates.find((v): v is string => typeof v === 'string' && v.length > 0);\n\n const email = pick(\n payload.target?.email,\n global?.currentUser?.email,\n global?.user?.email,\n global?.auth?.user?.email,\n payload.purpose === 'signup' ? local?.registerForm?.email : undefined,\n payload.purpose === 'password_reset' ? local?.passwordResetForm?.email : undefined,\n payload.purpose === 'password_reset' ? local?.email : undefined,\n );\n\n const phone = pick(\n payload.target?.phone,\n global?.currentUser?.phone,\n global?.user?.phone,\n global?.auth?.user?.phone,\n );\n\n if (!email && !phone) {\n return null;\n }\n\n const target: IdentityVerificationTarget = {};\n if (email) target.email = email;\n if (phone) target.phone = phone;\n return target;\n}\n\n/**\n * Bearer 토큰을 안전하게 추출합니다 (있으면).\n */\nfunction getAuthHeader(): Record {\n const G7Core = (window as any).G7Core;\n const token = G7Core?.api?.getToken?.() ?? null;\n return token ? { Authorization: `Bearer ${token}` } : {};\n}\n\n/**\n * 현재 앱 언어를 Accept-Language 헤더로 추출합니다 (있으면).\n *\n * challenge POST 는 ApiClient 를 우회하는 raw fetch 라, ApiClient 가 모든 요청에\n * 부착하는 `Accept-Language: g7_locale`(ApiClient.ts) 을 여기서 동일하게 부착해야\n * 서버 SetLocale 이 사용자 화면 언어로 IDV 메일을 렌더한다. 누락 시 challenge 요청이\n * 브라우저 기본 언어로 전송되어 메일이 주문 화면 언어와 달라진다(비회원 결제 등).\n */\nfunction getLocaleHeader(): Record {\n try {\n const locale =\n typeof window !== 'undefined' ? window.localStorage?.getItem('g7_locale') : null;\n return locale ? { 'Accept-Language': locale } : {};\n } catch {\n return {};\n }\n}\n\ninterface ChallengeResponseData {\n id: string;\n expires_at: string;\n render_hint: string;\n public_payload?: Record;\n redirect_url?: string;\n /** 허용 최대 시도 횟수 — 0 은 무제한 (popup/SDK 형 provider). 코어 mail provider 는 환경설정값을 반영. */\n max_attempts?: number;\n}\n\n/**\n * `POST /api/identity/challenges` 로 challenge 를 시작합니다.\n *\n * @param payload verification payload\n * @param target launcher 본체에서 1회 계산한 인증 대상 (startChallenge 와 _global 저장이 동일 값 공유)\n */\nasync function startChallenge(\n payload: VerificationPayload,\n target: IdentityVerificationTarget | null,\n): Promise {\n const body: Record = { purpose: payload.purpose };\n if (payload.provider_id) body.provider_id = payload.provider_id;\n if (target) body.target = target;\n\n const url = payload.challenge_start_url || '/api/identity/challenges';\n const res = await fetch(url, {\n method: 'POST',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n ...getLocaleHeader(),\n ...getAuthHeader(),\n },\n body: JSON.stringify(body),\n });\n\n const json = await res.json().catch(() => null);\n if (!res.ok || !json?.success) {\n const msg = json?.message ?? `Challenge 시작 실패 (HTTP ${res.status})`;\n throw new Error(msg);\n }\n\n const data = json.data ?? json;\n return {\n id: data.id,\n expires_at: data.expires_at,\n render_hint: data.render_hint ?? payload.render_hint ?? 'text_code',\n public_payload: data.public_payload,\n redirect_url: data.redirect_url,\n max_attempts: typeof data.max_attempts === 'number' ? data.max_attempts : undefined,\n };\n}\n\n/**\n * sirsoft-basic 의 IDV launcher 본체.\n *\n * 테스트에서 직접 호출할 수 있도록 export (런타임 진입점은 registerSirsoftBasicIdentityLauncher).\n */\nexport async function sirsoftBasicIdentityLauncher(payload: VerificationPayload): Promise {\n const G7Core = (window as any).G7Core;\n const identity = G7Core?.identity;\n\n if (!G7Core?.dispatch || !G7Core?.state || !identity) {\n logger.error('G7Core 또는 G7Core.identity 가 초기화되지 않아 launcher 를 실행할 수 없습니다.');\n return { status: 'failed', failureCode: 'G7_NOT_READY' };\n }\n\n // (1) external_redirect 분기 — 모달 안 띄움\n if (payload.render_hint === 'external_redirect' || payload.redirect_url) {\n return identity.redirectExternally(payload);\n }\n\n // 인증 대상을 1회 계산 — startChallenge body 와 _global.identityChallenge.target 저장이 동일 값 공유\n // (모달 재전송이 같은 target 으로 challenge 재요청). 흐름 선언값(payload.target) 우선.\n const target = resolveTarget(payload);\n\n // (2) Challenge 시작\n let challenge: ChallengeResponseData;\n try {\n challenge = await startChallenge(payload, target);\n } catch (err) {\n logger.error('Challenge 시작 실패:', err);\n try {\n await G7Core.dispatch({\n handler: 'toast',\n params: {\n type: 'error',\n message: err instanceof Error ? err.message : '본인인증 시작에 실패했습니다.',\n },\n });\n } catch {\n /* ignore */\n }\n return {\n status: 'failed',\n failureCode: 'CHALLENGE_START_FAILED',\n reason: err instanceof Error ? err.message : String(err),\n };\n }\n\n // 응답에 redirect_url 이 있으면 외부 redirect 로 분기 (provider 가 link 대신 redirect 결정)\n if (challenge.redirect_url) {\n return identity.redirectExternally({\n ...payload,\n render_hint: 'external_redirect',\n redirect_url: challenge.redirect_url,\n });\n }\n\n // (3) _global.identityChallenge 네임스페이스 setup\n // 위에서 1회 계산한 target 을 재사용 — 모달 재전송 액션이 같은 target 으로 challenge 재요청 가능하게\n const expiresMs = challenge.expires_at ? new Date(challenge.expires_at).getTime() : 0;\n const remainingSeconds = expiresMs > 0 ? Math.max(0, Math.floor((expiresMs - Date.now()) / 1000)) : 0;\n\n // maxAttempts: 백엔드 응답값이 있으면 사용, 없으면 0(무제한 — popup/SDK 형 provider 의 기본).\n // 코어 mail provider 응답에는 환경설정의 max_attempts 가 정확히 반영되므로 화면 카운트도 정합.\n const maxAttempts = typeof challenge.max_attempts === 'number' ? challenge.max_attempts : 0;\n\n G7Core.state.set({\n identityChallenge: {\n policy_key: payload.policy_key,\n purpose: payload.purpose,\n provider_id: payload.provider_id ?? null,\n render_hint: challenge.render_hint,\n challenge_id: challenge.id,\n expires_at: challenge.expires_at,\n public_payload: challenge.public_payload ?? {},\n target: target ?? null,\n code: '',\n error: null,\n attempts: 0,\n maxAttempts,\n remainingSeconds,\n resendCooldown: 0,\n },\n });\n\n // (4) 카운트다운 타이머 — launcher 자체 setInterval 사용\n // startInterval 핸들러는 등록 시점의 dispatch context 를 클로저로 캡처하는데,\n // 직전의 G7Core.state.set 가 React 비동기 setState 라서 캡처된 context 의 _global 에는\n // identityChallenge 가 아직 없을 수 있음(stale). 그러면 매 tick 표현식에서 expires_at 가\n // undefined 로 평가되어 remainingSeconds 가 영원히 0 으로 남음. launcher 클로저에서\n // expiresMs 를 직접 보유하고 G7Core.state.set 만 매 초 호출하면 stale 경로를 우회.\n let currentExpiresMs = expiresMs;\n let resendCooldown = 0;\n const tickHandle = window.setInterval(() => {\n const remaining = currentExpiresMs > 0\n ? Math.max(0, Math.floor((currentExpiresMs - Date.now()) / 1000))\n : 0;\n resendCooldown = Math.max(0, resendCooldown - 1);\n G7Core.state.set({\n identityChallenge: {\n remainingSeconds: remaining,\n resendCooldown,\n },\n });\n }, 1000);\n\n // 모달 재전송 액션이 새 challenge 를 발급하면 expires_at 이 갱신되는데,\n // 그 시점에는 launcher 클로저의 currentExpiresMs 를 동기화해야 카운트다운이 새 만료시각을 따름.\n // G7Core.state.subscribe 로 _global.identityChallenge.expires_at 변경을 감지.\n let unsubscribe: (() => void) | null = null;\n try {\n unsubscribe = G7Core.state.subscribe?.((next: any) => {\n const updated = next?.identityChallenge?.expires_at;\n if (typeof updated === 'string') {\n const ms = new Date(updated).getTime();\n if (Number.isFinite(ms) && ms !== currentExpiresMs) {\n currentExpiresMs = ms;\n }\n }\n const cd = next?.identityChallenge?.resendCooldown;\n if (typeof cd === 'number' && cd > resendCooldown) {\n // 재전송 액션이 _global.identityChallenge.resendCooldown 을 30 으로 set 한 직후 동기화\n resendCooldown = cd;\n }\n }) ?? null;\n } catch {\n /* subscribe 미지원 환경 — 첫 만료시각 기준으로만 카운트다운 */\n }\n\n // (5) deferred Promise 생성 → 모달 open\n const deferred = identity.createDeferred() as Promise;\n try {\n await G7Core.dispatch({\n handler: 'openModal',\n target: 'identity-challenge-modal',\n });\n } catch (e) {\n logger.error('openModal 실패 — 풀페이지로 폴백:', e);\n window.clearInterval(tickHandle);\n unsubscribe?.();\n return identity.redirectExternally({\n ...payload,\n render_hint: 'external_redirect',\n redirect_url: `/identity/challenge?challenge_id=${encodeURIComponent(challenge.id)}&return=${encodeURIComponent(window.location.href)}`,\n });\n }\n\n // (6) 모달이 resolveIdentityChallenge 호출하면 deferred 가 resolve\n const result = await deferred;\n\n // 정리 — 카운트다운 중단 + subscribe 해제\n window.clearInterval(tickHandle);\n unsubscribe?.();\n\n return result;\n}\n\n/**\n * 부트스트랩 시 코어 인터셉터에 launcher 를 등록합니다.\n *\n * `initTemplate()` 의 핸들러 등록 직후에 호출 — `window.G7Core.identity.setLauncher` 를 사용해\n * 코어의 단일 IdentityGuardInterceptor 정적 클래스에 launcher 를 주입합니다.\n */\nexport function registerSirsoftBasicIdentityLauncher(): void {\n const identity = (window as any).G7Core?.identity;\n if (!identity?.setLauncher) {\n logger.warn(\n 'G7Core.identity 가 아직 초기화되지 않아 launcher 등록을 건너뜁니다. 코어 부트스트랩 순서를 확인하세요.'\n );\n return;\n }\n identity.setLauncher(sirsoftBasicIdentityLauncher);\n logger.log('IDV launcher registered (sirsoft-basic)');\n}\n","/**\n * IconPickerWidget.tsx — sirsoft-basic 템플릿 소유 아이콘 피커 위젯\n *\n * 레이아웃 편집기 [속성] 탭에서 아이콘명 prop(`Icon.name`/`IconButton.iconName` 등)을\n * **검색 가능한 그리드 드롭다운**으로 고른다. 값은 아이콘명 문자열(propValue 로\n * `node.props[propKey]` 기록).\n *\n * **소유 경계**: 아이콘 검색 그리드 UI 는 라이브러리(Font Awesome) 종속\n * 지식이므로 **템플릿이 소유**한다. 코어는 icon-picker 위젯을 제공하지 않으며, 본 위젯을\n * `G7Core.layoutEditor.registerWidget('icon-picker', ...)` 로 등록해 사용한다(코어 예약\n * 접수함이 편집기 로드 전 등록도 큐로 보존 → 편집기 로드 시 flush). 카탈로그(`control.icons`)\n * 도 템플릿 editor-spec 이 공급한다. 본 위젯은 Font Awesome 클래스(`fas fa-{value}`)로\n * 프리뷰를 직접 렌더한다(템플릿이 자기 라이브러리를 알기 때문).\n *\n * 카탈로그 미공급 시 자유입력(text) 폴백.\n */\n\nimport React from 'react';\n\n/** 코어 WidgetProps 와 호환되는 최소 형태 — 코어 타입 import 회피(IIFE 번들 분리 안전) */\ninterface IconCatalogEntry {\n value: string;\n label?: string;\n keywords?: string[];\n group?: string;\n preview?: { html?: string; className?: string };\n}\ninterface IconPickerWidgetProps {\n control: { icons?: unknown; iconColumns?: number; iconSearchPlaceholder?: string } & Record<\n string,\n unknown\n >;\n value: unknown;\n onChange: (value: unknown) => void;\n t: (key: string, params?: Record) => string;\n}\n\nfunction readCatalog(control: IconPickerWidgetProps['control']): IconCatalogEntry[] {\n const icons = control.icons;\n if (!Array.isArray(icons)) return [];\n return icons.filter(\n (e): e is IconCatalogEntry =>\n !!e && typeof e === 'object' && typeof (e as IconCatalogEntry).value === 'string',\n );\n}\n\nfunction entryLabel(entry: IconCatalogEntry, t: IconPickerWidgetProps['t']): string {\n const label = entry.label;\n if (typeof label === 'string') return label.startsWith('$t:') ? t(label.slice(3)) : label;\n return entry.value;\n}\n\nfunction matchesQuery(entry: IconCatalogEntry, label: string, q: string): boolean {\n if (q === '') return true;\n const needle = q.toLowerCase();\n if (entry.value.toLowerCase().includes(needle)) return true;\n if (label.toLowerCase().includes(needle)) return true;\n return (entry.keywords ?? []).some((k) => k.toLowerCase().includes(needle));\n}\n\n/** FA 프리뷰 — preview.html → preview.className → `fas fa-{value}` (FA 직접 렌더) → 텍스트 */\nfunction IconPreview({ entry }: { entry: IconCatalogEntry }): React.ReactElement {\n const preview = entry.preview;\n if (preview?.html) {\n return (\n \n );\n }\n if (preview?.className) {\n return ;\n }\n // 템플릿은 자기 라이브러리(Font Awesome)를 알므로 클래스 직접 합성.\n return ;\n}\n\nexport function IconPickerWidget({\n control,\n value,\n onChange,\n t,\n}: IconPickerWidgetProps): React.ReactElement {\n const catalog = readCatalog(control);\n const current = value === undefined || value === null ? '' : String(value);\n const columns = typeof control.iconColumns === 'number' ? control.iconColumns : 6;\n const searchPlaceholderKey = control.iconSearchPlaceholder;\n const searchPlaceholder =\n typeof searchPlaceholderKey === 'string' && searchPlaceholderKey.startsWith('$t:')\n ? t(searchPlaceholderKey.slice(3))\n : t('layout_editor.icon_picker.search_placeholder');\n\n const [query, setQuery] = React.useState('');\n\n // 카탈로그 미공급 → 자유입력 폴백.\n if (catalog.length === 0) {\n return (\n \n onChange(e.target.value === '' ? undefined : e.target.value)}\n style={inputStyle}\n />\n
\n );\n }\n\n const labelOf = (e: IconCatalogEntry): string => entryLabel(e, t);\n const filtered = catalog.filter((e) => matchesQuery(e, labelOf(e), query));\n\n return (\n \n setQuery(e.target.value)}\n style={inputStyle}\n />\n \n onChange(undefined)}\n aria-pressed={current === ''}\n style={current === '' ? cellSelected : cell}\n >\n —\n \n {filtered.map((entry) => {\n const selected = entry.value === current;\n return (\n onChange(entry.value)}\n style={selected ? cellSelected : cell}\n >\n \n \n );\n })}\n
\n {filtered.length === 0 && (\n
\n {t('layout_editor.icon_picker.no_results')}\n
\n )}\n
\n );\n}\n\nconst wrap: React.CSSProperties = { display: 'flex', flexDirection: 'column', gap: 6, width: '100%' };\nconst inputStyle: React.CSSProperties = { padding: '5px 8px', fontSize: 12, border: '1px solid #cbd5e1', borderRadius: 6, width: '100%' };\nconst grid: React.CSSProperties = { display: 'grid', gap: 4, maxHeight: 220, overflowY: 'auto', padding: 2 };\nconst cell: React.CSSProperties = { display: 'flex', alignItems: 'center', justifyContent: 'center', minHeight: 34, padding: 4, border: '1px solid #e2e8f0', borderRadius: 6, background: '#fff', cursor: 'pointer' };\nconst cellSelected: React.CSSProperties = { ...cell, border: '2px solid #2563eb', background: '#eff6ff' };\nconst previewBox: React.CSSProperties = { display: 'inline-flex', alignItems: 'center', justifyContent: 'center', fontSize: 16, lineHeight: 1 };\nconst previewText: React.CSSProperties = { fontSize: 10, color: '#475569', fontFamily: 'monospace', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', maxWidth: '100%' };\nconst emptyHint: React.CSSProperties = { fontSize: 11, color: '#94a3b8', fontStyle: 'italic', padding: '4px 2px' };\n","/**\n * registerEditorWidgets.ts — sirsoft-basic 편집기 커스텀 위젯 등록\n *\n * 템플릿 부트스트랩(initTemplate)에서 호출. `G7Core.layoutEditor` 는 코어 예약 접수함\n * (stub)이 메인 번들에서 항상 노출하므로, 편집기 셸 로드 전에 호출해도 등록이 큐에\n * 보존되었다가 편집기 로드 시 flush 된다(타이밍 안전).\n *\n * 등록 위젯:\n * - `icon-picker` — Font Awesome 검색 그리드(템플릿 소유 UI, 라이브러리 종속).\n */\n\nimport React from 'react';\nimport { IconPickerWidget } from './IconPickerWidget';\n\nconst logger = (window as any).G7Core?.createLogger?.('Template:sirsoft-basic:EditorWidgets') ?? {\n log: (...a: unknown[]) => console.log('[Template:sirsoft-basic:EditorWidgets]', ...a),\n warn: (...a: unknown[]) => console.warn('[Template:sirsoft-basic:EditorWidgets]', ...a),\n};\n\n/**\n * 편집기 커스텀 위젯을 코어 레지스트리에 등록한다. 멱등 — `G7Core.layoutEditor` 부재(코어\n * 미초기화)면 no-op(다음 호출에서 재시도하거나 stub 이 보존).\n */\nexport function registerSirsoftBasicEditorWidgets(): void {\n if (typeof window === 'undefined') return;\n const layoutEditor = (window as any).G7Core?.layoutEditor;\n if (!layoutEditor?.registerWidget) {\n logger.warn('G7Core.layoutEditor 미노출 — icon-picker 위젯 등록 보류');\n return;\n }\n // 코어 위젯 레지스트리는 React 컴포넌트를 받는다. WidgetProps 형태로 호출됨.\n layoutEditor.registerWidget('icon-picker', IconPickerWidget as React.ComponentType);\n logger.log(\"편집기 위젯 'icon-picker' 등록됨(Font Awesome 검색 그리드)\");\n}\n","// e2e:allow편집기 위젯(icon-picker) 등록을 module-load 시점으로 이동(결함#3, admin 동기 — 직접 하드로드 시 위젯 누락 해소). 단위 회귀는 registerEditorWidgets.test.ts(module-load 등록 + index.ts 최상위 호출 정적 가드).\n/**\n * Sirsoft Basic User Template\n *\n * 그누보드7 템플릿 엔진용 사용자 템플릿 컴포넌트 패키지\n * Nexibase 스타일 기반\n */\n\n// Logger 설정 (G7Core 초기화 전에도 동작하도록 폴백 포함)\nconst logger = ((window as any).G7Core?.createLogger?.('Template:sirsoft-basic')) ?? {\n log: (...args: unknown[]) => console.log('[Template:sirsoft-basic]', ...args),\n warn: (...args: unknown[]) => console.warn('[Template:sirsoft-basic]', ...args),\n error: (...args: unknown[]) => console.error('[Template:sirsoft-basic]', ...args),\n};\n\n// Styles\nimport './styles/main.css';\n\n// Basic Components (Header, Footer는 composite에서 사용하므로 여기서는 별도 이름으로 export)\nexport {\n Button,\n type ButtonProps,\n FileInput,\n type FileInputProps,\n Input,\n type InputProps,\n PasswordInput,\n type PasswordInputProps,\n type PasswordRule,\n defaultPasswordRules,\n availablePasswordRules,\n Textarea,\n type TextareaProps,\n Label,\n type LabelProps,\n Div,\n type DivProps,\n Span,\n type SpanProps,\n P,\n type PProps,\n Img,\n type ImgProps,\n H1,\n type H1Props,\n H2,\n type H2Props,\n H3,\n type H3Props,\n H4,\n type H4Props,\n Ul,\n type UlProps,\n Ol,\n type OlProps,\n Li,\n type LiProps,\n A,\n type AProps,\n Form,\n type FormProps,\n Select,\n type SelectProps,\n Option,\n type OptionProps,\n Optgroup,\n type OptgroupProps,\n Checkbox,\n type CheckboxProps,\n Table,\n type TableProps,\n Thead,\n type TheadProps,\n Tbody,\n type TbodyProps,\n Tr,\n type TrProps,\n Th,\n type ThProps,\n Td,\n type TdProps,\n Nav,\n type NavProps,\n Section,\n type SectionProps,\n Svg,\n type SvgProps,\n Icon,\n type IconProps,\n Code,\n type CodeProps,\n Hr,\n type HrProps,\n IconName,\n type IconStyle,\n type IconSize,\n} from './components/basic';\n\n// Composite Components\nexport * from './components/composite';\n\n// Layout Components\nexport * from './components/layout';\n\n// Template Metadata\nimport templateMetadata from '../template.json';\n\n// Handlers\nimport { handlerMap } from './handlers';\n\n// IDV Modal Launcher (engine-v1.46.0+)\nimport { registerSirsoftBasicIdentityLauncher } from './handlers/identityLauncher';\n\n// 레이아웃 편집기 커스텀 위젯(icon-picker 등) 등록\nimport { registerSirsoftBasicEditorWidgets } from './layout-editor/registerEditorWidgets';\n\n// handlerMap을 전역으로 노출 (로케일 변경 시 재등록용)\nif (typeof window !== 'undefined') {\n (window as any).G7TemplateHandlers = handlerMap;\n}\n\n/**\n * 템플릿 메타데이터 export\n *\n * template.json 파일의 내용을 번들에 포함시켜 API 호출 없이\n * 코어 엔진에서 직접 접근 가능하도록 합니다.\n */\nexport { templateMetadata };\n\n/**\n * 템플릿 초기화 함수\n *\n * 코어 엔진에 커스텀 핸들러를 등록합니다.\n */\nexport function initTemplate(): void {\n // ActionDispatcher가 로드될 때까지 대기 후 핸들러 등록\n if (typeof window !== 'undefined') {\n let retryCount = 0;\n const maxRetries = 50; // 최대 5초 대기 (50 * 100ms)\n\n const registerHandlers = () => {\n const actionDispatcher = (window as any).G7Core?.getActionDispatcher?.();\n\n if (actionDispatcher) {\n // handlerMap의 모든 핸들러를 자동으로 등록\n Object.entries(handlerMap).forEach(([name, handler]) => {\n actionDispatcher.registerHandler(name, handler);\n });\n\n logger.log(`${Object.keys(handlerMap).length} custom handler(s) registered:`, Object.keys(handlerMap));\n\n // IDV Modal Launcher 등록 (window.G7Core.identity.setLauncher 사용)\n registerSirsoftBasicIdentityLauncher();\n } else {\n retryCount++;\n if (retryCount <= maxRetries) {\n logger.warn(`ActionDispatcher not found, retrying... (${retryCount}/${maxRetries})`);\n setTimeout(registerHandlers, 100);\n } else {\n logger.error('Failed to register handlers: ActionDispatcher not available after maximum retries');\n }\n }\n };\n\n // window.load 이벤트 사용 (모든 리소스 로드 완료 후)\n if (document.readyState === 'complete') {\n registerHandlers();\n } else {\n window.addEventListener('load', registerHandlers);\n }\n }\n}\n\n// 레이아웃 편집기 커스텀 위젯(icon-picker) 등록 — 모듈 로드 시점에 즉시 실행한다.\n// ActionDispatcher 가용을 기다리는 `registerHandlers`(window.load\n// 게이트) 안에서 등록하면, 편집기 URL 을 직접 하드로드한 경로에서 등록이 편집기 셸 마운트보다\n// 늦어 icon-picker 위젯이 누락된다(\"Unsupported control\"). `G7Core.layoutEditor` 예약 접수함\n// (ready 큐 stub)은 편집기 로드 전 등록도 큐로 보존했다가 flush 하므로, 핸들러 등록 타이밍과\n// 무관하게 모듈 로드 시 즉시 등록하는 것이 진입 경로(SPA 전환 / 직접 로드)와 무관하게 결정적이다.\nregisterSirsoftBasicEditorWidgets();\n\n// 템플릿 초기화 자동 실행\ninitTemplate();\n"],"names":["G7Core","Button","forwardRef","children","variant","size","className","props","ref","baseClasses","mergedClassName","jsx","Div","React","Span","Svg","Input","label","error","onChange","onKeyPress","value","defaultValue","type","checked","defaultChecked","isCheckableType","isComposingRef","useRef","internalRef","useImperativeHandle","localValue","setLocalValue","useState","useEffect","handleCompositionStart","useCallback","handleCompositionEnd","e","currentValue","changeEvent","handleChange","newValue","handleKeyPress","loadingactions","formdata","validProps","inputProps","FileInput","accept","maxSize","onError","buttonText","placeholder","disabled","inputRef","fileName","setFileName","rootEditorProps","key","val","handleClick","file","errorMsg","handleClear","IconName","iconNameMap","Icon","name","iconStyle","color","spin","pulse","fixedWidth","ariaLabel","style","styleClassMap","rawName","mappedName","iconName","classes","accessibilityLabel","t","params","availablePasswordRules","param","types","defaultPasswordRules","parseRuleString","ruleString","paramStr","rule","PasswordInput","showToggle","showValidation","isConfirmField","confirmTarget","onMatchChange","onValidityChange","rules","enableRules","showRules","wrapperClassName","validationClassName","showPassword","setShowPassword","capsLockOn","setCapsLockOn","internalValue","setInternalValue","parsedRules","useMemo","ruleStr","parsed","displayRules","validationResults","acc","isMatch","isAllValid","v","failedRules","passed","handleToggle","prev","handleKeyEvent","editorRootProps","inputRestProps","k","jsxs","labelParams","Textarea","textareaRef","textareaValueProps","Label","P","Img","alt","H1","H2","H3","H4","Ul","Ol","Li","A","Form","logger","args","getLocaleName","locale","fromAppConfig","Select","options","searchable","searchPlaceholder","editorAttrs","isOpen","setIsOpen","searchTerm","setSearchTerm","dropdownPos","setDropdownPos","containerRef","buttonRef","searchInputRef","dropdownRef","normalizedOptions","selectedLabel","opt","visibleOptions","needle","timer","updateDropdownPos","rect","spaceBelow","openUpward","handleClickOutside","event","target","handleKeyDown","handleSelect","optionValue","hasCustomStyle","hasTextColor","baseButtonClass","rootDomProps","createPortal","option","isSelected","Option","Optgroup","Checkbox","Table","Thead","Tbody","Tr","Th","Td","Nav","Section","Code","Hr","Header","getEffectiveTheme","mode","applyTheme","effectiveTheme","getInitialTheme","savedTheme","ThemeToggle","onThemeChange","autoText","lightText","darkText","id","initialTheme","currentMode","setCurrentMode","showMenu","setShowMenu","menuRef","mediaQuery","handleThemeChange","getCurrentIcon","SIZE_CLASSES","BASE_CONTAINER_CLASSES","WITHDRAWN_CLASSES","INITIAL_BG_CLASSES","Avatar","author","avatar","text","isWithdrawn","isGuest","actualAvatar","actualName","actualIsWithdrawn","actualIsGuest","containerClasses","initialBgClass","renderContent","scopeSlotChildDef","componentDef","containerId","SlotContainer","slotId","emptyContent","slotComponents","setSlotComponents","forceUpdate","getSlotContext","directSlotContext","g7Core","updateSlotComponents","slotContext","getDynamicRenderer","DynamicRenderer","registration","dataContext","parentFormContext","getParentComponentContext","translationContext","scopedDef","NotificationCenter","notifications","unreadCount","hasMore","loading","titleText","emptyText","markAllReadText","deleteAllText","unreadOnlyText","unreadOnly","onNotificationClick","onClose","onLoadMore","onMarkAllRead","onDeleteAll","onDelete","onUnreadOnlyToggle","dropdownAlign","showNotifications","setShowNotifications","notificationRef","scrollRef","sentinelRef","visibleUnreadIdsRef","onLoadMoreRef","hasMoreRef","loadingRef","notificationsCountRef","lastRequestedCountRef","observer","entry","entries","isUnread","item","displayCount","n","handleClose","unreadIds","useLayoutEffect","dropdown","vw","margin","shift","Fragment","notification","navigate","path","logo","siteName","user","cartCount","notificationCount","boards","maxVisibleBoards","onMobileMenuOpen","availableLocales","currentLocale","shopBase","notificationHasMore","notificationLoading","notificationUnreadOnly","notificationTitleText","notificationEmptyText","notificationMarkAllReadText","notificationDeleteAllText","notificationUnreadOnlyText","onNotificationClose","onNotificationLoadMore","onNotificationMarkAllRead","onNotificationDeleteAll","onNotificationDelete","onNotificationUnreadOnlyToggle","searchQuery","setSearchQuery","showUserMenu","setShowUserMenu","showMoreBoards","setShowMoreBoards","showLangMenu","setShowLangMenu","dropdownPosition","setDropdownPosition","currentPath","setCurrentPath","userMenuRef","moreButtonRef","langMenuRef","useResponsive","responsiveValue","isMobile","handlePopState","originalPushState","isActiveRoute","exact","isShopActive","base","getNavButtonClass","isActive","baseClass","visibleBoards","hiddenBoards","handleSearch","handleLogout","handleLocaleChange","HeaderBasic","board","Footer","TABLET_BREAKPOINT","DESKTOP_BREAKPOINT","siteDescription","copyrightText","socialLinks","linkGroups","currentYear","width","isDesktop","gridColumns","defaultLinkGroups","groups","socialIconMap","FooterBasic","url","group","index","link","linkIndex","MobileNav","drawerRef","isPortable","handleEscape","handleOverlayClick","setPrototypeOf","isFrozen","getPrototypeOf","getOwnPropertyDescriptor","freeze","seal","create","apply","construct","x","func","thisArg","_len","_key","Func","_len2","_key2","arrayForEach","unapply","arrayLastIndexOf","arrayPop","arrayPush","arraySplice","stringToLowerCase","stringToString","stringMatch","stringReplace","stringIndexOf","stringTrim","objectHasOwnProperty","regExpTest","typeErrorCreate","unconstruct","_len3","_key3","_len4","_key4","addToSet","set","array","transformCaseFunc","l","element","lcElement","cleanArray","clone","object","newObject","property","lookupGetter","prop","desc","fallbackValue","html$1","svg$1","svgFilters","svgDisallowed","mathMl$1","mathMlDisallowed","html","svg","mathMl","xml","MUSTACHE_EXPR","ERB_EXPR","TMPLIT_EXPR","DATA_ATTR","ARIA_ATTR","IS_ALLOWED_URI","IS_SCRIPT_OR_DATA","ATTR_WHITESPACE","DOCTYPE_NAME","CUSTOM_ELEMENT","EXPRESSIONS","NODE_TYPE","getGlobal","_createTrustedTypesPolicy","trustedTypes","purifyHostElement","suffix","ATTR_NAME","policyName","scriptUrl","_createHooksMap","createDOMPurify","window","DOMPurify","root","document","originalDocument","currentScript","DocumentFragment","HTMLTemplateElement","Node","Element","NodeFilter","NamedNodeMap","HTMLFormElement","DOMParser","ElementPrototype","cloneNode","remove","getNextSibling","getChildNodes","getParentNode","template","trustedTypesPolicy","emptyHTML","implementation","createNodeIterator","createDocumentFragment","getElementsByTagName","importNode","hooks","IS_ALLOWED_URI$1","ALLOWED_TAGS","DEFAULT_ALLOWED_TAGS","ALLOWED_ATTR","DEFAULT_ALLOWED_ATTR","CUSTOM_ELEMENT_HANDLING","FORBID_TAGS","FORBID_ATTR","EXTRA_ELEMENT_HANDLING","ALLOW_ARIA_ATTR","ALLOW_DATA_ATTR","ALLOW_UNKNOWN_PROTOCOLS","ALLOW_SELF_CLOSE_IN_ATTR","SAFE_FOR_TEMPLATES","SAFE_FOR_XML","WHOLE_DOCUMENT","SET_CONFIG","FORCE_BODY","RETURN_DOM","RETURN_DOM_FRAGMENT","RETURN_TRUSTED_TYPE","SANITIZE_DOM","SANITIZE_NAMED_PROPS","SANITIZE_NAMED_PROPS_PREFIX","KEEP_CONTENT","IN_PLACE","USE_PROFILES","FORBID_CONTENTS","DEFAULT_FORBID_CONTENTS","DATA_URI_TAGS","DEFAULT_DATA_URI_TAGS","URI_SAFE_ATTRIBUTES","DEFAULT_URI_SAFE_ATTRIBUTES","MATHML_NAMESPACE","SVG_NAMESPACE","HTML_NAMESPACE","NAMESPACE","IS_EMPTY_INPUT","ALLOWED_NAMESPACES","DEFAULT_ALLOWED_NAMESPACES","MATHML_TEXT_INTEGRATION_POINTS","HTML_INTEGRATION_POINTS","COMMON_SVG_AND_HTML_ELEMENTS","PARSER_MEDIA_TYPE","SUPPORTED_PARSER_MEDIA_TYPES","DEFAULT_PARSER_MEDIA_TYPE","CONFIG","formElement","isRegexOrFunction","testValue","_parseConfig","cfg","ALL_SVG_TAGS","ALL_MATHML_TAGS","_checkValidNamespace","parent","tagName","parentTagName","_forceRemove","node","_removeAttribute","_initDocument","dirty","doc","leadingWhitespace","matches","dirtyPayload","body","_createNodeIterator","_isClobbered","_isNode","_executeHooks","currentNode","data","hook","_sanitizeElements","content","_isBasicCustomElement","parentNode","childNodes","childCount","i","childClone","expr","_isValidAttribute","lcTag","lcName","_sanitizeAttributes","attributes","hookEvent","attr","namespaceURI","attrValue","initValue","_sanitizeShadowDOM","fragment","shadowNode","shadowIterator","importedNode","returnNode","nodeIterator","serializedHTML","tag","entryPoint","hookFunction","purify","usePreferredCurrency","read","state","currency","setCurrency","subscribe","unsubscribe","getStarTypes","avg","rounded","pos","ProductCard","product","onClick","preferredCurrency","getPrice","field","multiCurrencyField","multiCurrencyData","formattedField","displayName","sellingPrice","listPrice","hasDiscount","isNotOnSale","labels","sanitizeHighlight","nameHighlighted","descriptionHtml","identifier","idx","MODULE_CAROUSEL","MODULE_CONTROLLER","MODULE_NAVIGATION","MODULE_NO_SCROLL","MODULE_PORTAL","MODULE_ROOT","MODULE_TOOLBAR","PLUGIN_COUNTER","PLUGIN_FULLSCREEN","PLUGIN_SLIDESHOW","PLUGIN_THUMBNAILS","PLUGIN_ZOOM","SLIDE_STATUS_LOADING","SLIDE_STATUS_PLAYING","SLIDE_STATUS_ERROR","SLIDE_STATUS_COMPLETE","SLIDE_STATUS_PLACEHOLDER","activeSlideStatus","status","ACTIVE_SLIDE_LOADING","ACTIVE_SLIDE_PLAYING","ACTIVE_SLIDE_ERROR","ACTIVE_SLIDE_COMPLETE","CLASS_FULLSIZE","CLASS_FLEX_CENTER","CLASS_NO_SCROLL","CLASS_NO_SCROLL_PADDING","CLASS_SLIDE","CLASS_SLIDE_WRAPPER","CLASS_SLIDE_WRAPPER_INTERACTIVE","ACTION_PREV","ACTION_NEXT","ACTION_SWIPE","ACTION_CLOSE","EVENT_ON_POINTER_DOWN","EVENT_ON_POINTER_MOVE","EVENT_ON_POINTER_UP","EVENT_ON_POINTER_LEAVE","EVENT_ON_POINTER_CANCEL","EVENT_ON_KEY_DOWN","EVENT_ON_KEY_UP","EVENT_ON_WHEEL","VK_ESCAPE","VK_ARROW_LEFT","VK_ARROW_RIGHT","ELEMENT_BUTTON","ELEMENT_ICON","IMAGE_FIT_CONTAIN","IMAGE_FIT_COVER","UNKNOWN_ACTION_TYPE","cssPrefix$3","clsx","cssClass","cssVar","composePrefix","prefix","makeComposePrefix","translateLabel","defaultLabel","_a","translateSlideCounter","slides","getSlideIndex","cleanup","cleaners","cleaner","makeUseContext","contextName","context","ctx","hasWindow","round","decimals","factor","isImageSlide","slide","isImageFitCover","image","imageFit","parseInt","parseLengthPercentage","input","computeSlideRect","containerRect","padding","paddingValue","paddingPixels","devicePixelRatio","slidesCount","hasSlides","getSlide","getSlideIfPresent","getSlideKey","addToolbarButton","toolbar","button","buttons","restToolbar","buttonWithKey","result","calculatePreload","carousel","minimum","isReact19","makeInertWhen","condition","reflow","LightboxDefaultProps","createModule","component","createNode","module","traverseNode","traverse","nodes","withPlugins","plugins","augmentations","config","contains","addParent","append","addChild","precede","addSibling","addModule","replace","augment","augmentation","plugin","A11yContext","useA11yContext","A11yContextProvider","focusWithin","setFocusWithin","autoPlaying","setAutoPlaying","onFocus","onBlur","trackAndDelegate","focusWithinValue","DocumentContext","useDocumentContext","DocumentContextProvider","nodeRef","getOwnerDocument","EventsContext","useEvents","EventsProvider","subscriptions","topic","callback","cb","LightboxPropsContext","useLightboxProps","LightboxPropsProvider","LightboxStateContext","useLightboxState","LightboxDispatchContext","useLightboxDispatch","reducer","action","increment","globalIndex","currentIndex","currentSlide","animation","LightboxStateProvider","dispatch","TimeoutsContext","useTimeouts","TimeoutsProvider","timeouts","tid","removeTimeout","fn","delay","IconButton","renderIcon","rest","styles","buttonLabel","svgIcon","icon","createIcon","glyph","createIconDisabled","CloseIcon","PreviousIcon","NextIcon","LoadingIcon","_","ErrorIcon","useMotionPreference","reduceMotion","setReduceMotion","_b","listener","currentTransformation","y","z","matcher","values","useAnimation","computeAnimation","snapshot","_c","keyframes","duration","easing","onfinish","err","currentSnapshot","useContainerRect","observerRef","setContainerRect","updateContainerRect","parse","useDelay","timeoutId","setTimeout","clearTimeout","useEventCallback","setRef","useForkRef","refA","refB","refValue","useLoseFocus","focus","focused","useRTL","isRTL","setIsRTL","useSensors","subscribers","notifySubscribers","registerSensors","subscribeSensors","listeners","el","useThrottle","lastCallbackTime","delayCallback","executeCallback","slidePrefix","slideImagePrefix","ImageSlide","offset","render","imageProps","onLoad","_d","_e","_f","_g","_h","setStatus","publish","imageRef","handleLoading","img","setImageRef","handleOnLoad","handleOnError","cover","nonInfinite","fallback","maxWidth","maxHeight","defaultStyle","srcSet","a","b","estimateActualWidth","sizes","imagePropsStyle","imagePropsClassName","restImageProps","LightboxRoot","trackFocusWithin","SwipeState","usePointerEvents","onPointerDown","onPointerMove","onPointerUp","Gesture","SWIPE_THRESHOLD","usePointerSwipe","disableSwipeNavigation","closeOnBackdropClick","isSwipeValid","containerWidth","swipeAnimationDuration","onSwipeStart","onSwipeProgress","onSwipeFinish","onSwipeCancel","pullUpEnabled","pullDownEnabled","onPullStart","onPullProgress","onPullFinish","onPullCancel","pointers","activePointer","startTime","gesture","clearPointer","currentPointers","p","addPointer","lookupPointer","pointerId","exceedsPullThreshold","threshold","pointer","currentOffset","isCurrentPointer","deltaX","deltaY","startGesture","newGesture","usePreventWheelDefaults","preventDefaultWheelX","preventDefaultWheelY","horizontal","useWheelSwipe","swipeState","intent","intentCleanup","resetCleanup","wheelInertia","wheelInertiaCleanup","cancelSwipeIntentCleanup","cancelSwipeResetCleanup","handleCleanup","handleCancelSwipe","currentSwipeOffset","onWheel","setWheelInertia","inertia","currentSwipeIntent","newSwipeOffset","cssContainerPrefix","ControllerContext","useController","Controller","controller","on","closeOnPullUp","closeOnPullDown","toolbarWidth","setToolbarWidth","setSwipeState","swipeOffset","pullOffset","pullOpacity","cleanupAnimationIncrement","cleanupSwipeOffset","cleanupPullOffset","setContainerRef","handleContainerRef","carouselRef","setCarouselRef","rtl","getLightboxProps","getLightboxState","next","close","setSwipeOffset","setPullOffset","offsetValue","preparePullAnimation","translate","pull","cancel","prepareAnimation","isAnimationPlaying","parsedSpacing","spacingValue","swipe","swipeDuration","swipeEasing","direction","count","newSwipeState","newSwipeAnimationDuration","elapsedTime","expectedTime","swipeParams","pullParams","focusOnMount","onViewCallback","ControllerModule","cssPrefix$2","cssSlidePrefix","CarouselSlide","slideRect","offscreen","renderSlide","rendered","Placeholder","Carousel","preload","items","CarouselModule","useNavigationState","prevDisabled","nextDisabled","useKeyboardNavigation","throttle","NavigationButton","Navigation","buttonPrev","buttonNext","iconPrev","iconNext","NavigationModule","noScroll","noScrollPadding","isHTMLElement","padScrollbar","computedValue","originalValue","NoScroll","getOwnerWindow","ownerWindow","documentElement","scrollbar","elements","clean","NoScrollModule","cssPrefix$1","setAttribute","attribute","previousValue","Portal","portal","mounted","setMounted","visible","setVisible","restoreFocus","animationDuration","handleEnter","handleRef","PortalModule","Root","RootModule","cssPrefix","Toolbar","buttonClose","iconClose","renderCloseButton","ToolbarModule","renderNode","child","mergeAnimation","defaultAnimation","defaultAnimationEasing","restDefaultAnimation","restAnimation","Lightbox","restProps","defaultCarousel","defaultRender","defaultToolbar","defaultController","defaultNoScroll","defaultOn","defaultSlides","defaultIndex","defaultPlugins","restDefaultProps","defaultZoomProps","validateMinZoom","minZoom","resolveZoomProps","zoom","useZoomAnimation","offsetX","offsetY","zoomWrapperRef","zoomAnimation","zoomAnimationStart","zoomAnimationDuration","playZoomAnimation","useZoomCallback","onZoomCallback","useZoomProps","useZoomImageRect","imageDimensions","imageRect","maxImageRect","maxZoomPixelRatio","height","maxZoom","distance","pointerA","pointerB","scaleZoom","delta","clamp","useZoomSensors","zoomIn","zoomOut","changeZoom","changeOffsets","activePointers","lastPointerDown","pinchZoom","keyboardMoveDistance","zoomInMultiplier","wheelZoomDistanceFactor","scrollToZoom","doubleTapDelay","doubleClickDelay","doubleClickMaxStops","pinchZoomDistanceFactor","pinchZoomV4","translateCoordinates","pageX","pageY","scrollX","scrollY","left","top","onKeyDown","metaKey","ctrlKey","meta","preventDefault","move","replacePointer","timeStamp","targetZoom","initialDistance","currentDistance","coordinate","cleanupSensors","useZoomState","setZoom","setOffsetX","setOffsetY","animate","currentSource","dx","dy","newZoom","newOffsetX","newOffsetY","maxOffsetX","maxOffsetY","rapid","handleControllerRectChange","ZoomControllerContext","useZoom","ZoomContextProvider","zoomWrapper","setZoomWrapper","zoomRef","ZoomInIcon","ZoomOutIcon","ZoomButton","onLoseFocus","wasEnabled","wasFocused","zoomInCallback","zoomOutCallback","zoomDisabled","ZoomButtonsGroup","zoomInRef","zoomOutRef","focusSibling","sibling","focusZoomIn","focusZoomOut","ZoomToolbarControl","isResponsiveImageSlide","current","source","ResponsiveImage","interactive","targetWidth","pixelDensity","handleResize","targetSource","handlePreload","currentPreload","ZoomWrapper","setImageDimensions","slideProps","Zoom","zoomProps","defaultCounterProps","resolveCounterProps","counter","CounterComponent","separator","legacyClassName","legacyRest","Counter","defaultSlideshowProps","resolveSlideshowProps","slideshow","SlideshowContext","useSlideshow","SlideshowContextProvider","finite","autoplay","wasPlaying","playing","setPlaying","scheduler","slideStatus","play","pause","cancelScheduler","scheduleNextSlide","onSlideshowStart","onSlideshowStop","PlayIcon","PauseIcon","SlideshowButton","focusListeners","Slideshow","defaultFullscreenProps","resolveFullscreenProps","fullscreen","FullscreenContext","useFullscreen","FullscreenContextProvider","fullscreenProps","auto","setDisabled","setFullscreen","wasFullscreen","ownerDocument","getFullscreenElement","fullscreenElement","enter","container","exit","onEnterFullscreen","onExitFullscreen","handleAutoFullscreen","EnterFullscreenIcon","ExitFullscreenIcon","FullscreenButton","Fullscreen","defaultThumbnailsProps","resolveThumbnailsProps","thumbnails","useThumbnailsProps","cssThumbnailPrefix","VideoThumbnailIcon","UnknownThumbnailIcon","renderThumbnail","customThumbnail","imageSlideProps","thumbnailIconClass","activePrefix","fadeInPrefix","fadeOutPrefix","placeholderPrefix","DELAY","DURATION","Thumbnail","fadeIn","fadeOut","active","onLoseFocusCallback","isHorizontal","position","boxSize","dimension","getThumbnailKey","thumbnail","poster","ThumbnailsTrack","track","border","borderStyle","borderColor","borderRadius","gap","vignette","handleControllerSwipe","animationOffset","trackRect","slideIndex","fadeAnimationDuration","ThumbnailsContext","useThumbnails","ThumbnailsContextProvider","hidden","thumbnailsIcon","ThumbnailsVisible","ThumbnailsHidden","ThumbnailsButton","show","hide","Thumbnails","thumbnailsProps","I","downloadAuthenticatedFile","filename","blob","objectUrl","downloadFile","executeImageDownload","downloadUrl","DownloadButton","onDownload","isDownloading","setIsDownloading","handleDownload","ImageGallery","images","startIndex","enableZoom","enableSlideshow","enableFullscreen","showCounter","showDownload","showThumbnails","setCurrentIndex","currentIndexRef","currentImage","previewImages","useImageGallery","setImages","setStartIndex","openGallery","galleryImages","closeGallery","getImageSrc","ProductImageViewer","selectedIndex","setSelectedIndex","galleryProps","QuantitySelector","min","max","handleDecrease","handleIncrease","handleInputChange","clampedValue","handleInputBlur","isMinDisabled","isMaxDisabled","REACTION_CONFIGS","PostReactions","reactions","userReaction","postId","onReact","sizeClasses","emojiSizes","getReactionCount","r","RichTextEditor","initialValue","imageUploadUrl","minHeight","editorRef","setContent","showCodeView","setShowCodeView","showLinkModal","setShowLinkModal","linkUrl","setLinkUrl","applyFormat","format","handleImageUpload","formData","response","handleFileSelect","insertLink","toolbarButtons","headingButtons","listButtons","btn","HtmlContent","isHtml","purifyConfig","actualContent","textClasses","defaultConfig","sanitizedHtml","match","before","href","after","HtmlEditor","isHtmlProp","onIsHtmlChange","rows","showHtmlModeToggle","contentClassName","htmlFieldName","readOnly","setIsHtml","localContent","setLocalContent","previewMode","setPreviewMode","handleContentChange","newContent","handleHtmlModeChange","isHtmlMode","handlePreviewModeToggle","ExpandableContent","expandText","collapseText","isExpanded","setIsExpanded","needsExpand","setNeedsExpand","contentRef","checkHeight","scrollHeight","toggleExpand","resolvedExpandText","resolvedCollapseText","Modal","title","iconClassName","closeOnOverlayClick","showCloseButton","closeOnEscape","shouldCloseOnBackdrop","modalRef","previousFocusRef","focusableElements","firstElement","lastElement","handleTab","zIndex","ConfirmDialog","message","confirmText","cancelText","onConfirm","onCancel","confirmButtonVariant","_cancelButtonVariant","_closeOnOverlay","isLoading","loadingText","resolvedConfirmText","resolvedCancelText","resolvedLoadingText","handleConfirm","handleCancel","confirmVariantClassMap","FileUploaderContext","createContext","FileUploaderProvider","useFileUploaderContext","useContext","_mergeNamespaces","copyExifWithoutOrientation","getApp1Segment","o","s","f","c","UZIP","u","h","d","g","m","w","E","F","B","U","C","Q","M","S","R","T","O","H","L","pushV","UPNG","decodeImage","_getBPP","_decompress","_inflate","_filterZero","_paeth","_IHDR","_copyTile","addErr","N","D","dither","_main","compressPNG","compress","_prepareDiff","_updateFrame","quantize","_filterLine","getKDtree","getNearest","planeDst","stats","estats","splitPixels","vecDot","set16","set32","seek","convert","CustomFile","CustomFileReader","getFilefromDataUrl","getDataUrlFromFile","loadImage","getBrowserName","approximateBelowMaximumCanvasSizeOfBrowser","getNewCanvasAndCtx","drawImageInCanvas","isIOS","drawFileInCanvas","$Try_2_Post","$Try_2_Catch","$Try_3_Catch","canvasToFile","$If_4","$If_5","$If_6","cleanupCanvasMemory","isAutoOrientationInBrowser","getExifOrientation","handleMaxWidthOrHeight","followExifOrientation","incProgress","setProgress","$If_2","$Loop_3","$Loop_3_exit","compressOnWebWorker","imageCompression","$Try_1_Catch","formatFileSize","bytes","units","extractErrorMessage","axiosError","firstError","getFileIcon","mimeType","useFileUploader","attachmentableType","attachmentableId","collection","maxFiles","maxConcurrentUploads","compressionOptions","roleIds","autoUpload","initialFiles","endpoints","onFilesChange","onUploadComplete","onUploadError","onRemove","onReorder","uploadTriggerEvent","confirmBeforeRemove","uploadParams","existingFiles","setExistingFiles","pendingFiles","setPendingFiles","isDragOver","setIsDragOver","activeUploadsRef","deletedIdsRef","uploadedFilesRef","confirmDialogOpen","setConfirmDialogOpen","itemToDelete","setItemToDelete","isDeleting","setIsDeleting","hasReorderedRef","customOrder","setCustomOrder","prevInitialFilesRef","galleryOpen","setGalleryOpen","galleryStartIndex","setGalleryStartIndex","galleryKeyRef","authenticatedImageUrls","setAuthenticatedImageUrls","authenticatedImageUrlsRef","stableInitialFiles","filteredFiles","initialIds","sessionUploaded","compressImage","compressionOpts","handleFiles","selectedFiles","totalCount","remainingSlots","filesToAdd","overflow","ext","accepted","mimePrefix","pendingFile","compressedBlob","uploadSingleFile","fileToUpload","roleId","progressEvent","progress","errorMessage","handleUploadAll","filesToUpload","uploadedAttachments","pendingToHashMap","uploadQueue","processQueue","attachment","pendingId","invalidMsg","workers","allExisting","updatedOrder","orderMap","ordered","aOrder","bOrder","executeRemoveAttachment","deleteUrl","itemKey","handleRemove","handleRetry","handleDragEnd","arrayMove","sortable_esm","over","combined","orderedItems","aKey","bKey","oldIndex","newIndex","reordered","newExisting","newPending","reorderedFiles","orderData","imageFiles","handleOpenGallery","imageIndex","cancelled","existingImageFiles","currentIds","ImageGallery$1","allItems","hasFiles","canAddMore","clear","getPendingFiles","FileDropZone","onFiles","useCombinedRefs","refs","canUseDOM","isWindow","elementString","isNode","getWindow","_target$ownerDocument","_target$ownerDocument2","isDocument","Document","isSVGElement","useIsomorphicLayoutEffect","useEvent","handler","handlerRef","useInterval","intervalRef","useLatestValue","dependencies","valueRef","useLazyMemo","useNodeRef","onChangeHandler","setNodeRef","usePrevious","ids","useUniqueId","createAdjustmentFn","modifier","adjustments","accumulator","adjustment","valueAdjustment","add","subtract","hasViewportRelativeCoordinates","isKeyboardEvent","KeyboardEvent","isTouchEvent","TouchEvent","getEventCoordinates","CSS","transform","scaleX","scaleY","_ref","SELECTOR","findFirstFocusableNode","hiddenStyles","HiddenText","LiveRegion","announcement","ariaLiveType","visuallyHidden","useAnnouncement","setAnnouncement","DndMonitorContext","useDndMonitor","registerListener","useDndMonitorProvider","_listener$type","defaultScreenReaderInstructions","defaultAnnouncements","_ref2","_ref3","_ref4","Accessibility","announcements","hiddenTextDescribedById","screenReaderInstructions","announce","liveRegionId","_ref5","_ref6","markup","Action","noop","useSensor","sensor","sensors","defaultCoordinates","distanceBetween","p1","p2","sortCollisionsAsc","sortCollisionsDesc","cornersOfRectangle","getFirstCollision","collisions","firstCollision","centerOfRectangle","closestCenter","collisionRect","droppableRects","droppableContainers","centerRect","droppableContainer","distBetween","closestCorners","corners","rectCorners","distances","corner","effectiveDistance","getIntersectionRatio","right","bottom","targetArea","entryArea","intersectionArea","intersectionRatio","rectIntersection","adjustScale","rect1","rect2","getRectDelta","createRectAdjustmentFn","getAdjustedRect","parseTransform","transformArray","inverseTransform","transformOrigin","parsedTransform","translateX","translateY","defaultOptions","getClientRect","getTransformAgnosticClientRect","getWindowClientRect","isFixed","computedStyle","isScrollable","overflowRegex","getScrollableAncestors","limit","scrollParents","findScrollableAncestors","getFirstScrollableAncestor","firstScrollableAncestor","getScrollableElement","getScrollXCoordinate","getScrollYCoordinate","getScrollCoordinates","Direction","isDocumentScrollingElement","getScrollPosition","scrollingContainer","minScroll","dimensions","maxScroll","isTop","isLeft","isBottom","isRight","defaultThreshold","getScrollDirectionAndSpeed","scrollContainer","scrollContainerRect","acceleration","thresholdPercentage","speed","getScrollElementRect","innerWidth","innerHeight","getScrollOffsets","scrollableAncestors","getScrollXOffset","getScrollYOffset","scrollIntoViewIfNeeded","measure","properties","Rect","scrollOffsets","axis","keys","getScrollOffset","currentOffsets","scrollOffsetsDeltla","Listeners","_this$target","eventName","_this$target2","getEventListenerTarget","EventTarget","hasExceededDistance","measurement","EventName","stopPropagation","KeyboardCode","defaultKeyboardCodes","defaultKeyboardCoordinateGetter","currentCoordinates","KeyboardSensor","activeNode","onStart","keyboardCodes","coordinateGetter","scrollBehavior","code","newCoordinates","coordinatesDelta","scrollDelta","scrollElementRect","clampedCoordinates","canScrollX","canScrollY","newScrollCoordinates","canScrollToNewCoordinates","coordinates","onMove","onEnd","onActivation","activator","isDistanceConstraint","constraint","isDelayConstraint","AbstractPointerSensor","events","listenerTarget","_getEventCoordinates","activationConstraint","bypassActivationConstraint","onPending","initialCoordinates","_getEventCoordinates2","activated","onAbort","_this$document$getSel","PointerSensor","events$1","MouseButton","MouseSensor","events$2","TouchSensor","touches","AutoScrollActivator","TraversalOrder","useAutoScroller","canScroll","draggingRect","enabled","interval","order","pointerCoordinates","scrollableAncestorRects","scrollIntent","useScrollIntent","setAutoScrollInterval","clearAutoScrollInterval","scrollSpeed","scrollDirection","scrollContainerRef","autoScroll","scrollLeft","scrollTop","sortedScrollableAncestors","defaultScrollIntent","previousDelta","previousIntent","useCachedNode","draggableNodes","draggableNode","cachedNode","useCombineActivators","getSyntheticHandler","Sensor","sensorActivators","MeasuringStrategy","MeasuringFrequency","useDroppableMeasuring","containers","dragging","queue","setQueue","frequency","strategy","containersRef","isDisabled","disabledRef","measureDroppableContainers","map","useInitialValue","computeFn","useInitialRect","useMutationObserver","handleMutations","mutationObserver","MutationObserver","useResizeObserver","resizeObserver","ResizeObserver","defaultMeasure","useRect","fallbackRect","setRect","measureRect","currentRect","newRect","records","record","useRectDelta","initialRect","defaultValue$1","useScrollableAncestors","previousNode","ancestors","useScrollOffsets","scrollCoordinates","setScrollCoordinates","prevElements","handleScroll","scrollingElement","previousElements","scrollableElement","useScrollOffsetsDelta","initialScrollOffsets","hasScrollOffsets","useSensorSetup","teardownFns","teardown","useSyntheticListeners","useWindowRect","defaultValue$2","useRects","windowRect","rects","setRects","measureRects","getMeasurableNode","firstChild","useDragOverlayMeasuring","handleNodeChange","defaultSensors","defaultData","defaultMeasuringConfiguration","DroppableContainersMap","_super$get","_this$get$node$curren","_this$get","defaultPublicContext","defaultInternalContext","InternalContext","PublicContext","getInitialState","RestoreFocus","activatorEvent","previousActivatorEvent","previousActiveId","activatorNode","focusableNode","applyModifiers","modifiers","useMeasuringConfiguration","useLayoutShiftScrollCompensation","initialized","rectDelta","ActiveDraggableContext","Status","DndContext","memo","_sensorContext$curren","_dragOverlay$nodeRef$","_dragOverlay$rect","_over$rect","accessibility","collisionDetection","measuring","store","useReducer","dispatchMonitorEvent","registerMonitorListener","isInitialized","activeId","activeRects","_node$data","activeRef","activeSensor","setActiveSensor","setActivatorEvent","latestProps","draggableDescribedById","enabledDroppableContainers","measuringConfiguration","measuringScheduled","activationCoordinates","autoScrollOptions","getAutoScrollerOptions","initialActiveNodeRect","activeNodeRect","containerNodeRect","sensorContext","overNode","dragOverlay","draggingNode","draggingNodeRect","usesDragOverlay","nodeRectDelta","modifiedTranslate","scrollAdjustment","activeNodeScrollDelta","scrollAdjustedTranslate","overId","setOver","appliedTranslate","activeSensorRef","instantiateSensor","sensorInstance","onDragAbort","onDragPending","onDragStart","unstable_batchedUpdates","createHandler","cancelDrop","bindActivatorToSensorInstantiator","nativeEvent","activeDraggableNode","activationContext","activators","onDragMove","onDragOver","overContainer","publicContext","internalContext","activeSensorDisablesAutoscroll","autoScrollGloballyDisabled","NullContext","defaultRole","ID_PREFIX","useDraggable","ariaDescribedById","role","roleDescription","tabIndex","isDragging","setActivatorNodeRef","dataRef","memoizedAttributes","useDndContext","ID_PREFIX$1","defaultResizeObserverConfig","useDroppable","resizeObserverConfig","previous","resizeObserverConnected","callbackId","resizeObserverDisabled","updateMeasurementsFor","resizeObserverTimeout","newElement","previousElement","from","to","newArray","getSortedRects","isValidIndex","itemsEqual","normalizeDisabled","rectSortingStrategy","activeIndex","overIndex","newRects","oldRect","Context","SortableContext","userDefinedItems","disabledProp","useDragOverlay","previousItemsRef","itemsHaveChanged","disableTransforms","contextValue","defaultNewIndexGetter","defaultAnimateLayoutChanges","isSorting","wasDragging","previousItems","previousContainerId","transition","defaultTransition","transitionProperty","disabledTransition","defaultAttributes","useDerivedTransform","derivedTransform","setDerivedtransform","previousIndex","initial","useSortable","animateLayoutChanges","userDefinedAttributes","localDisabled","customData","getNewIndex","localStrategy","globalDisabled","sortedRects","globalStrategy","normalizeLocalDisabled","itemsAfterCurrentSortable","isOver","setDroppableNodeRef","setDraggableNodeRef","displaceItem","shouldDisplaceDragSource","dragSourceDisplacement","finalTransform","shouldAnimateLayoutChanges","getTransition","_localDisabled$dragga","_localDisabled$droppa","hasSortableData","directions","sortableKeyboardCoordinates","filteredContainers","closestId","activeDroppable","newDroppable","newNode","hasDifferentScrollAncestors","hasSameContainer","isSameContainer","isAfterActive","isAfter","rectCoordinates","SortableThumbnailItem","onRetry","onImageClick","isPrimary","onPrimaryClick","isPending","isUploading","isCompressing","hasError","preview","isImage","authenticatedImageUrl","setAuthenticatedImageUrl","isMounted","existingImageUrl","FileList","onDragEnd","onAddClick","enablePrimarySelection","primaryFileId","onPrimaryChange","isExisting","EMPTY_FILES","EMPTY_ROLE_IDS","FileUploader","confirmRemoveTitle","confirmRemoveMessage","apiEndpoints","callbackRef","wrappedOnFilesChange","files","uploader","pendingItem","attachmentItem","SocialIcon","provider","PROVIDER_CONFIGS","SocialLoginButtons","providers","handleSocialLogin","callbackUrl","getButtonText","providerName","filteredProviders","getTranslation","defaultIconMap","typeStyleMap","positionClassMap","Toast","toasts","visibleToasts","setVisibleToasts","prevState","toast","effectiveDuration","ToastItemComponent","isVisible","typeStyle","hideTranslate","PageTransitionIndicator","setIsPending","transitionManager","newIsPending","PageTransitionBlur","TAILWIND_BREAKPOINTS","DISPLAY_CLASSES","LAYOUT_CONTAINERS","TEXT_COMPONENTS","INPUT_COMPONENTS","MEDIA_COMPONENTS","COMPOSITE_SKELETONS","animClass","iterCount","filterChildren","withIf","withoutIf","positiveIf","isNegativeCondition","areMutuallyExclusiveBranches","pickRichestBranch","positive","ifExpr","trimmed","branches","baseExpressions","branch","orMatch","first","best","curr","countDescendants","sum","resolveExpressions","ternaryMatch","sanitizeClassName","sanitized","num","resolveLayoutProps","directionMap","justify","justifyMap","align","alignMap","wrap","wrapMap","cols","getAnimationClass","renderChildren","renderSkeletonNode","resolveClassName","baseClassName","resolveResponsiveDisplay","tokens","displayEntries","otherClasses","token","responsiveMatch","cls","effectiveDisplay","resolvedClassName","extractArbitraryGridCols","iteration","rawClassName","layoutClasses","exprResolved","responsive","barClass","renderedChildren","gridResult","sanitizedLeafClass","heightMap","widthMap","spacing","borderClass","PageSkeleton","components","PageLoading","isDark","bgColor","spinnerColor","textColor","Pagination","currentPage","totalPages","onPageChange","maxVisiblePages","showFirstLast","prevText","nextText","pageNumbers","pages","halfVisible","startPage","endPage","handlePageClick","page","handlePrevious","handleNext","pageNum","SearchBar","controlledValue","onSubmit","showButton","suggestions","onSuggestionClick","showSuggestions","resolvedPlaceholder","isFocused","setIsFocused","previousValueRef","shouldShowSuggestions","handleSuggestionClick","suggestion","syntheticEvent","handleSubmit","avatarSizeMap","AvatarUploader","src","fallbackText","uploadEndpoint","deleteEndpoint","onUploadSuccess","onDeleteSuccess","onDeleteError","showDeleteButton","uploadButtonText","deleteButtonText","confirmDelete","deleteConfirmMessage","confirmUpload","uploadConfirmMessage","uploadSuccessActions","uploadErrorActions","deleteSuccessActions","deleteErrorActions","setIsUploading","localAvatarUrl","setLocalAvatarUrl","setErrorMessage","showDeleteConfirm","setShowDeleteConfirm","showUploadConfirm","setShowUploadConfirm","setPendingFile","previewUrl","setPreviewUrl","inputId","getCsrfToken","getAuthToken","executeUpload","csrfToken","authToken","errorData","handleFileChange","maxBytes","executeDelete","handleDeleteClick","handleDeleteCancel","handleUploadCancel","handleUploadConfirm","currentAvatarUrl","hasAvatar","avatarSize","isConfirmMode","renderButtons","getG7Core","LAYOUT_CLASSES","createDefaultMenuItems","SubText","UserInfo","userId","subText","subTextTitle","showDropdown","clickable","profilePath","layout","menuItems","hideMenuItems","appendMenuItems","actualUserId","menuPosition","setMenuPosition","actualProfilePath","containerClass","isInsideContainer","isInsideDropdown","handleScrollOrResize","getMenuItems","updateMenuPosition","buttonRect","handleMenuItemClick","finalMenuItems","defaultColorClass","nameButtonClass","TabNavigation","tabs","activeTabId","onTabChange","hiddenTabIds","mobileBreakpoint","handleTabClick","tab","handleSelectChange","selectedId","numericId","finalId","selectedTab","visibleTabs","getTabClasses","navClasses","compositeComponents","Header$1","Footer$1","MobileNav$1","SlotContainer$1","NotificationCenter$1","ProductCard$1","ProductImageViewer$1","QuantitySelector$1","PostReactions$1","RichTextEditor$1","HtmlContent$1","HtmlEditor$1","ExpandableContent$1","ConfirmDialog$1","SocialLoginButtons$1","Toast$1","PageTransitionIndicator$1","PageTransitionBlur$1","PageSkeleton$1","PageLoading$1","ThemeToggle$1","Pagination$1","SearchBar$1","Avatar$1","AvatarUploader$1","UserInfo$1","Modal$1","TabNavigation$1","Container","Grid","rowGap","colGap","autoRows","autoCols","flow","autoRowsMap","autoColsMap","flowMap","Flex","grow","shrink","SectionLayout","subtitle","background","centered","shadow","paddingMap","backgroundMap","maxWidthMap","shadowMap","BaseSection","ThreeColumnLayout","leftWidth","rightWidth","leftSlot","centerSlot","rightSlot","leftStyle","centerStyle","rightStyle","CURRENCY_CONFIGS","formatPrice","amount","currencyCode","recalcMultiCurrencyTotal","unitPriceMap","quantity","additionalUnitKrw","krwUnit","unitValue","additionalConverted","total","buildSelectedTotalMultiCurrency","totals","mc","computeAdditionalOptionsTotal","selections","valueId","getGroupKey","getOptionValueByGroupKey","optionValues","optionValuesLocalized","groupKey","convertOptionValuesToRecord","findMatchingOption","optionGroups","currentSelection","selectedValue","addSelectedItemIfCompleteHandler","selectedOptionItems","matchedOption","optionKey","unitPrice","optionLabels","additionalOptionGroups","additionalOptionSelections","additionalOptionsTotal","blockUnitTotal","newItem","nextItems","updateSelectedItemQuantityHandler","itemIndex","newQuantity","updatedItems","totalPrice","setBlockAdditionalOptionHandler","additionalOptionId","isCustomTextMode","customTexts","removeSelectedItemHandler","updateNoOptionQuantityHandler","setLocalState","updates","getLocalState","getGlobalState","showToast","refetchCartItems","selectedItems","toggleCartItemSelectionHandler","_context","itemId","currentSelected","newSelected","allSelected","selectAllCartItemsHandler","allItemIds","setCartOptionHandler","optionName","currentOptions","openCartDeleteModalHandler","targetIds","openCartOptionModalHandler","targetItem","recalculateCartHandler","selectedOptions","findMatchingOptionHandler","initCartOptionSelectionHandler","currentOptionValues","valuesArray","CART_KEY_STORAGE_NAME","CART_KEY_API_ENDPOINT","GUEST_ORDER_TOKEN_STORAGE_NAME","GUEST_ORDER_NUMBER_STORAGE_NAME","GUEST_ORDER_EXPIRES_AT_STORAGE_NAME","issueCartKeyFromApi","setGlobalState","getCurrentUser","g7Config","initCartKeyHandler","_action","cartKey","getCartKeyHandler","clearCartKeyHandler","regenerateCartKeyHandler","newCartKey","saveToStorageHandler","loadFromStorageHandler","clearGuestOrderTokenInternal","initGuestOrderTokenHandler","expiresAt","expired","expiryTs","existing","saveGuestOrderTokenHandler","orderNumber","clearGuestOrderTokenHandler","clearGuestTokenOnEntryHandler","getDisplayPriceHandler","priceField","formatCurrencyHandler","customLocale","formatted","getCurrencySymbol","STORAGE_KEY","DEFAULT_CURRENCY","loadPreferredCurrencyHandler","defaultCurrency","stored","isValidCurrency","savePreferredCurrencyHandler","VALID_THEMES","initTheme","theme","initThemeHandler","targetTheme","setThemeHandler","validTheme","redirectToLoginWithReturnHandler","returnUrl","downloadAttachmentHandler","handlerMap","resolveTarget","payload","local","global","pick","candidates","email","phone","getAuthHeader","getLocaleHeader","startChallenge","res","json","msg","sirsoftBasicIdentityLauncher","identity","challenge","expiresMs","remainingSeconds","maxAttempts","currentExpiresMs","resendCooldown","tickHandle","remaining","updated","ms","cd","deferred","registerSirsoftBasicIdentityLauncher","readCatalog","control","icons","entryLabel","matchesQuery","q","IconPreview","previewBox","IconPickerWidget","catalog","columns","searchPlaceholderKey","query","setQuery","inputStyle","labelOf","filtered","grid","cellSelected","cell","previewText","selected","emptyHint","registerSirsoftBasicEditorWidgets","layoutEditor","initTemplate","retryCount","maxRetries","registerHandlers","actionDispatcher"],"mappings":"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","x_google_ignoreList":[45,47,48,49,50,51,52,53,66,70,71,72,73]} \ No newline at end of file diff --git a/templates/_bundled/sirsoft-basic/layouts/_user_base.json b/templates/_bundled/sirsoft-basic/layouts/_user_base.json index 558767f7..556bff3a 100644 --- a/templates/_bundled/sirsoft-basic/layouts/_user_base.json +++ b/templates/_bundled/sirsoft-basic/layouts/_user_base.json @@ -625,104 +625,6 @@ } ] }, - { - "comment": "언어 선택(모바일) — 데스크톱 헤더와 동일하게 통화 옆 같은 줄에 노출(globe + 현재 로케일 코드). 비회원 포함 전체. setLocale 은 코어 빌트인.", - "id": "mobile_lang_selector_wrap", - "type": "basic", - "name": "Div", - "if": "{{$locales.length > 1}}", - "props": { "className": "relative" }, - "children": [ - { - "id": "mobile_lang_btn", - "type": "basic", - "name": "Button", - "props": { - "className": "flex items-center gap-1 px-2 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg cursor-pointer", - "aria-haspopup": "listbox", - "aria-expanded": "{{_global.mobileLangMenuOpen ?? false}}", - "aria-label": "$t:common.language" - }, - "actions": [ - { - "type": "click", - "handler": "setState", - "params": { "target": "global", "mobileLangMenuOpen": "{{!_global.mobileLangMenuOpen}}" } - } - ], - "children": [ - { "type": "basic", "name": "Icon", "size": "sm", "props": { "name": "globe" } }, - { "type": "basic", "name": "Span", "props": { "className": "font-medium uppercase" }, "text": "{{$locale}}" }, - { "type": "basic", "name": "Icon", "size": "xs", "props": { "name": "chevron-down" } } - ] - }, - { - "comment": "드롭다운 메뉴", - "id": "mobile_lang_menu", - "type": "basic", - "name": "Div", - "if": "{{_global.mobileLangMenuOpen}}", - "props": { - "className": "absolute right-0 top-full mt-2 w-40 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-lg z-50 py-1 overflow-hidden", - "role": "listbox" - }, - "children": [ - { - "type": "basic", - "name": "Div", - "iteration": { "source": "{{$locales}}", "item_var": "loc" }, - "children": [ - { - "type": "basic", - "name": "Button", - "props": { - "className": "{{loc === $locale ? 'bg-blue-50 dark:bg-blue-900/20 text-blue-600 dark:text-blue-400' : 'text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700'}} w-full px-4 py-2.5 text-left text-sm flex items-center gap-3 cursor-pointer", - "role": "option", - "aria-selected": "{{loc === $locale}}" - }, - "actions": [ - { - "type": "click", - "handler": "sequence", - "actions": [ - { "handler": "setLocale", "target": "{{loc}}" }, - { "handler": "setState", "params": { "target": "global", "mobileLangMenuOpen": false } } - ] - } - ], - "children": [ - { "type": "basic", "name": "Icon", "size": "sm", "props": { "name": "globe" } }, - { "type": "basic", "name": "Span", "props": { "className": "flex-1 font-medium" }, "text": "{{_global.appConfig?.localeNames?.[loc] ?? loc}}" }, - { "type": "basic", "name": "Icon", "size": "sm", "if": "{{loc === $locale}}", "props": { "name": "check" } } - ] - } - ] - } - ] - }, - { - "comment": "배경 클릭 시 닫기", - "id": "mobile_lang_backdrop", - "type": "basic", - "name": "Div", - "if": "{{_global.mobileLangMenuOpen}}", - "props": { "className": "fixed inset-0 z-40" }, - "actions": [ - { "type": "click", "handler": "setState", "params": { "target": "global", "mobileLangMenuOpen": false } } - ] - } - ] - }, - { - "comment": "통화 선택 — 이커머스 모듈이 'header_currency' 슬롯에 주입(layout_extensions). 헤더는 슬롯 이름만 알고 통화/모듈을 모름. 모듈 비활성 시 빈 슬롯 → 미렌더(인프라 자동 게이트). 데스크톱 Header.tsx 의 SlotContainer 와 동일 슬롯 공유(언어와 같은 줄).", - "id": "mobile_currency_selector_wrap", - "type": "composite", - "name": "SlotContainer", - "props": { - "slotId": "header_currency", - "className": "flex items-center" - } - }, { "comment": "사용자 아이콘 (로그인 시) / 로그인 버튼", "id": "mobile_user_btn", @@ -900,6 +802,71 @@ } ] }, + { + "comment": "언어/통화 선택 — 회원·비회원 공통. 헤더 우측 그룹에서 이동(모바일 오버플로 해소). 통화는 이커머스 모듈이 header_currency 슬롯에 주입하므로 SlotContainer 만 배치(모듈 비활성 시 자동 미렌더).", + "id": "mobile_drawer_prefs", + "type": "basic", + "name": "Div", + "props": { + "className": "px-4 pb-4 border-b border-gray-200 dark:border-gray-700 space-y-3" + }, + "children": [ + { + "comment": "언어 선택 (여러 언어 지원 시)", + "type": "basic", + "name": "Div", + "if": "{{$locales.length > 1}}", + "children": [ + { + "type": "basic", + "name": "Div", + "props": { + "className": "py-1 text-xs font-medium text-gray-500 dark:text-gray-400 uppercase" + }, + "text": "$t:common.language" + }, + { + "comment": "가로 나열 칩. iteration 은 반드시 Button 자신에 건다 — 엔진은 iteration 을 가진 노드를 항목 수만큼 복제하므로, flex 컨테이너에 걸면 컨테이너가 복제되어 칩이 세로로 쌓인다.", + "type": "basic", + "name": "Div", + "props": { + "className": "flex flex-wrap gap-2" + }, + "children": [ + { + "type": "basic", + "name": "Button", + "iteration": { "source": "{{$locales}}", "item_var": "loc" }, + "props": { + "type": "button", + "className": "{{loc === $locale ? 'bg-blue-50 dark:bg-blue-900/20 text-blue-600 dark:text-blue-400 border-blue-200 dark:border-blue-800' : 'text-gray-700 dark:text-gray-300 border-gray-200 dark:border-gray-600 hover:bg-gray-100 dark:hover:bg-gray-700'}} inline-flex items-center gap-1.5 px-3 py-1.5 text-sm border rounded-full cursor-pointer whitespace-nowrap", + "role": "option", + "aria-selected": "{{loc === $locale}}" + }, + "actions": [ + { "type": "click", "handler": "setLocale", "target": "{{loc}}" } + ], + "children": [ + { "type": "basic", "name": "Icon", "props": { "name": "globe", "size": "sm" } }, + { "type": "basic", "name": "Span", "text": "{{_global.appConfig?.localeNames?.[loc] ?? loc}}" } + ] + } + ] + } + ] + }, + { + "comment": "통화 선택 — 이커머스 모듈 주입 슬롯(헤더에서 이동). 모듈 미설치 시 빈 슬롯 → 렌더 영향 0. 헤더는 가로 flex 였으나 드로어는 세로 블록이므로 block 으로 둔다(flex items-center 면 주입 루트가 콘텐츠 폭으로 줄어 펼친 목록이 좁아짐). 주입 루트가 portable 에서 스스로 w-full 을 갖는다.", + "id": "mobile_drawer_currency_wrap", + "type": "composite", + "name": "SlotContainer", + "props": { + "slotId": "header_currency", + "className": "block" + } + } + ] + }, { "comment": "로그인된 사용자 정보 - 아코디언 토글", "type": "basic", @@ -1148,64 +1115,6 @@ } ] }, - { - "comment": "언어 선택 (여러 언어 지원 시)", - "type": "basic", - "name": "Div", - "if": "{{$locales.length > 1}}", - "props": { - "className": "mt-2 pt-2 border-t border-gray-200 dark:border-gray-600" - }, - "children": [ - { - "type": "basic", - "name": "Div", - "props": { - "className": "px-4 py-1 text-xs font-medium text-gray-500 dark:text-gray-400 uppercase" - }, - "text": "$t:common.language" - }, - { - "type": "basic", - "name": "Div", - "iteration": { - "source": "{{$locales}}", - "item_var": "loc" - }, - "children": [ - { - "type": "basic", - "name": "Button", - "props": { - "className": "{{loc === $locale ? 'bg-blue-50 dark:bg-blue-900/20 text-blue-600 dark:text-blue-400' : 'text-gray-700 dark:text-gray-300'}} w-full flex items-center justify-start gap-3 px-4 py-2 hover:bg-gray-200 dark:hover:bg-gray-600 cursor-pointer" - }, - "actions": [ - { - "type": "click", - "handler": "setLocale", - "target": "{{loc}}" - } - ], - "children": [ - { - "type": "basic", - "name": "Icon", - "props": { - "name": "globe", - "size": "sm" - } - }, - { - "type": "basic", - "name": "Span", - "text": "{{_global.appConfig?.localeNames?.[loc] ?? loc}}" - } - ] - } - ] - } - ] - }, { "comment": "로그아웃 버튼", "type": "basic", diff --git a/templates/_bundled/sirsoft-basic/layouts/partials/board/form/_post_form.json b/templates/_bundled/sirsoft-basic/layouts/partials/board/form/_post_form.json index 30bb4b3c..47ccd65b 100644 --- a/templates/_bundled/sirsoft-basic/layouts/partials/board/form/_post_form.json +++ b/templates/_bundled/sirsoft-basic/layouts/partials/board/form/_post_form.json @@ -371,7 +371,7 @@ "name": "Div", "if": "{{form_meta?.data && !_global.currentUser?.uuid && !route.id}}", "props": { - "className": "grid grid-cols-2 gap-4" + "className": "grid grid-cols-1 sm:grid-cols-2 gap-4" }, "children": [ { diff --git a/templates/_bundled/sirsoft-basic/layouts/partials/board/show/_comment_input.json b/templates/_bundled/sirsoft-basic/layouts/partials/board/show/_comment_input.json index f788909b..ea002bd2 100644 --- a/templates/_bundled/sirsoft-basic/layouts/partials/board/show/_comment_input.json +++ b/templates/_bundled/sirsoft-basic/layouts/partials/board/show/_comment_input.json @@ -40,7 +40,7 @@ "name": "Div", "if": "{{!_global.currentUser?.uuid}}", "props": { - "className": "flex gap-3" + "className": "flex flex-col sm:flex-row gap-3" }, "children": [ { diff --git a/templates/_bundled/sirsoft-basic/layouts/partials/board/show/_navigation.json b/templates/_bundled/sirsoft-basic/layouts/partials/board/show/_navigation.json index a12f0738..78a8b15b 100644 --- a/templates/_bundled/sirsoft-basic/layouts/partials/board/show/_navigation.json +++ b/templates/_bundled/sirsoft-basic/layouts/partials/board/show/_navigation.json @@ -9,13 +9,19 @@ "props": { "className": "flex items-center justify-between mb-6" }, + "responsive": { + "mobile": { + "comment": "모바일(0~767px)에서는 게시판명을 자기 줄로 올리고(order-first w-full) 아래 줄에 목록/이전글/다음글만 남긴다. 한 줄에 셋을 밀어넣으면 게시판명이 길수록 flex 가 좌우 버튼을 압착했다 (390px 실측: '이전글' 폭 5자 87px → 11자 73px → 21자 62px, chevron 과 텍스트가 겹침). 버튼 3개 고정폭 261px + 21자 제목 자연폭 323px = 584px 이므로 태블릿(768px+, 콘텐츠 735px)은 한 줄로 충분하다 — portable 이 아니라 mobile 로 한정한다.", + "props": { "className": "flex flex-wrap items-center justify-between gap-y-3 mb-6" } + } + }, "children": [ { - "comment": "목록으로 버튼 — 상세 URL 에 실린 목록 상태(category/search/page/del/filters)를 그대로 목록으로 복귀 (45-1)", + "comment": "목록으로 버튼 — 상세 URL 에 실린 목록 상태(category/search/page/del/filters)를 그대로 목록으로 복귀 (45-1). shrink-0: 게시판명이 길어도 눌리지 않는다.", "type": "basic", "name": "Button", "props": { - "className": "flex items-center gap-2 px-4 py-2 text-sm font-medium text-gray-700 dark:text-white bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-600 transition-all shadow-sm cursor-pointer" + "className": "shrink-0 flex items-center gap-2 px-4 py-2 text-sm font-medium text-gray-700 dark:text-white bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-100 dark:hover:bg-gray-600 transition-all shadow-sm cursor-pointer" }, "actions": [ { @@ -51,13 +57,20 @@ "props": { "className": "text-lg font-semibold text-gray-900 dark:text-white" }, + "responsive": { + "mobile": { + "comment": "order-first + w-full 로 첫 줄 전체를 차지. 이 노드가 형제를 압착하던 원인이므로 폭 경쟁에서 아예 빼낸다.", + "props": { "className": "order-first w-full text-center text-lg font-semibold text-gray-900 dark:text-white" } + } + }, "text": "{{post?.data?.board?.name ?? ''}}" }, { + "comment": "이전글/다음글 그룹. shrink-0: 게시판명이 길어도 눌리지 않는다.", "type": "basic", "name": "Div", "props": { - "className": "flex items-center gap-2" + "className": "shrink-0 flex items-center gap-2" }, "children": [ { diff --git a/templates/_bundled/sirsoft-basic/layouts/partials/mypage/addresses/_modal_address.json b/templates/_bundled/sirsoft-basic/layouts/partials/mypage/addresses/_modal_address.json index 0febdf4b..4940ca72 100644 --- a/templates/_bundled/sirsoft-basic/layouts/partials/mypage/addresses/_modal_address.json +++ b/templates/_bundled/sirsoft-basic/layouts/partials/mypage/addresses/_modal_address.json @@ -409,7 +409,7 @@ { "type": "basic", "name": "Div", - "props": { "className": "grid grid-cols-2 gap-2" }, + "props": { "className": "grid grid-cols-1 sm:grid-cols-2 gap-2" }, "children": [ { "type": "basic", diff --git a/templates/_bundled/sirsoft-basic/layouts/partials/mypage/orders/_modal_cancel.json b/templates/_bundled/sirsoft-basic/layouts/partials/mypage/orders/_modal_cancel.json index f7e4b77e..35ba7285 100644 --- a/templates/_bundled/sirsoft-basic/layouts/partials/mypage/orders/_modal_cancel.json +++ b/templates/_bundled/sirsoft-basic/layouts/partials/mypage/orders/_modal_cancel.json @@ -9,7 +9,6 @@ "id": "modal_cancel_order", "props": { "width": "750px", - "className": "max-w-full", "title": "$t:mypage.order_detail.cancel_modal.title" }, "actions": [ @@ -372,7 +371,7 @@ "name": "Div", "props": { "className": "grid grid-cols-3 gap-2 py-1.5 text-sm" }, "children": [ - { "type": "basic", "name": "Span", "props": { "className": "text-gray-600 dark:text-gray-400" }, "text": "$t:mypage.order_detail.cancel_modal.item_count" }, + { "type": "basic", "name": "Span", "props": { "className": "text-gray-600 dark:text-gray-400 break-keep" }, "text": "$t:mypage.order_detail.cancel_modal.item_count" }, { "type": "basic", "name": "Span", "props": { "className": "text-right text-gray-900 dark:text-white" }, "text": "{{(_local.refundEstimate?.original_snapshot?.item_count ?? 0)}}$t:mypage.order_detail.cancel_modal.count_unit" }, { "type": "basic", "name": "Span", "props": { "className": "text-right {{(_local.refundEstimate?.original_snapshot?.item_count ?? 0) !== (_local.refundEstimate?.recalculated_snapshot?.item_count ?? 0) ? 'text-red-600 dark:text-red-400 font-semibold' : 'text-gray-900 dark:text-white'}}" }, "text": "{{(_local.refundEstimate?.recalculated_snapshot?.item_count ?? 0)}}$t:mypage.order_detail.cancel_modal.count_unit" } ] @@ -383,7 +382,7 @@ "name": "Div", "props": { "className": "grid grid-cols-3 gap-2 py-1.5 text-sm" }, "children": [ - { "type": "basic", "name": "Span", "props": { "className": "text-gray-600 dark:text-gray-400" }, "text": "$t:mypage.order_detail.cancel_modal.list_price_amount" }, + { "type": "basic", "name": "Span", "props": { "className": "text-gray-600 dark:text-gray-400 break-keep" }, "text": "$t:mypage.order_detail.cancel_modal.list_price_amount" }, { "type": "basic", "name": "Div", @@ -440,7 +439,7 @@ "name": "Div", "props": { "className": "grid grid-cols-3 gap-2 py-1.5 text-sm" }, "children": [ - { "type": "basic", "name": "Span", "props": { "className": "text-gray-600 dark:text-gray-400" }, "text": "$t:mypage.order_detail.cancel_modal.subtotal_amount" }, + { "type": "basic", "name": "Span", "props": { "className": "text-gray-600 dark:text-gray-400 break-keep" }, "text": "$t:mypage.order_detail.cancel_modal.subtotal_amount" }, { "type": "basic", "name": "Div", @@ -502,7 +501,7 @@ "name": "Div", "props": { "className": "grid grid-cols-3 gap-2 text-sm" }, "children": [ - { "type": "basic", "name": "Span", "props": { "className": "text-gray-600 dark:text-gray-400" }, "text": "$t:mypage.order_detail.cancel_modal.product_coupon_discount" }, + { "type": "basic", "name": "Span", "props": { "className": "text-gray-600 dark:text-gray-400 break-keep" }, "text": "$t:mypage.order_detail.cancel_modal.product_coupon_discount" }, { "type": "basic", "name": "Span", "props": { "className": "text-right text-gray-900 dark:text-white" }, "text": "-{{_local.refundEstimate?.original_snapshot?.formatted?.total_product_coupon_discount_amount ?? (_local.refundEstimate?.original_snapshot?.total_product_coupon_discount_amount ?? 0).toLocaleString()}}" }, { "type": "basic", "name": "Span", "props": { "className": "text-right {{(_local.refundEstimate?.original_snapshot?.total_product_coupon_discount_amount ?? 0) !== (_local.refundEstimate?.recalculated_snapshot?.total_product_coupon_discount_amount ?? 0) ? 'text-red-600 dark:text-red-400 font-semibold' : 'text-gray-900 dark:text-white'}}" }, "text": "-{{_local.refundEstimate?.recalculated_snapshot?.formatted?.total_product_coupon_discount_amount ?? (_local.refundEstimate?.recalculated_snapshot?.total_product_coupon_discount_amount ?? 0).toLocaleString()}}" } ] @@ -528,7 +527,7 @@ "item_var": "pc", "index_var": "pcIdx" }, - "props": { "className": "text-xs text-gray-400 dark:text-gray-500" }, + "props": { "className": "text-xs text-gray-400 dark:text-gray-500 break-keep" }, "text": "{{pc.name}} -{{(pc.discount_amount ?? 0).toLocaleString()}}$t:common.currency_unit" } ] @@ -546,7 +545,7 @@ "item_var": "rpc", "index_var": "rpcIdx" }, - "props": { "className": "text-xs text-gray-400 dark:text-gray-500" }, + "props": { "className": "text-xs text-gray-400 dark:text-gray-500 break-keep" }, "text": "{{rpc.name}} -{{(rpc.discount_amount ?? 0).toLocaleString()}}$t:common.currency_unit" } ] @@ -566,7 +565,7 @@ "name": "Div", "props": { "className": "grid grid-cols-3 gap-2 text-sm" }, "children": [ - { "type": "basic", "name": "Span", "props": { "className": "text-gray-600 dark:text-gray-400" }, "text": "$t:mypage.order_detail.cancel_modal.order_coupon_discount" }, + { "type": "basic", "name": "Span", "props": { "className": "text-gray-600 dark:text-gray-400 break-keep" }, "text": "$t:mypage.order_detail.cancel_modal.order_coupon_discount" }, { "type": "basic", "name": "Span", "props": { "className": "text-right text-gray-900 dark:text-white" }, "text": "-{{_local.refundEstimate?.original_snapshot?.formatted?.total_order_coupon_discount_amount ?? (_local.refundEstimate?.original_snapshot?.total_order_coupon_discount_amount ?? 0).toLocaleString()}}" }, { "type": "basic", "name": "Span", "props": { "className": "text-right {{(_local.refundEstimate?.original_snapshot?.total_order_coupon_discount_amount ?? 0) !== (_local.refundEstimate?.recalculated_snapshot?.total_order_coupon_discount_amount ?? 0) ? 'text-red-600 dark:text-red-400 font-semibold' : 'text-gray-900 dark:text-white'}}" }, "text": "-{{_local.refundEstimate?.recalculated_snapshot?.formatted?.total_order_coupon_discount_amount ?? (_local.refundEstimate?.recalculated_snapshot?.total_order_coupon_discount_amount ?? 0).toLocaleString()}}" } ] @@ -592,7 +591,7 @@ "item_var": "oc", "index_var": "ocIdx" }, - "props": { "className": "text-xs text-gray-400 dark:text-gray-500" }, + "props": { "className": "text-xs text-gray-400 dark:text-gray-500 break-keep" }, "text": "{{oc.name}} -{{(oc.discount_amount ?? 0).toLocaleString()}}$t:common.currency_unit" } ] @@ -610,7 +609,7 @@ "item_var": "roc", "index_var": "rocIdx" }, - "props": { "className": "text-xs text-gray-400 dark:text-gray-500" }, + "props": { "className": "text-xs text-gray-400 dark:text-gray-500 break-keep" }, "text": "{{roc.name}} -{{(roc.discount_amount ?? 0).toLocaleString()}}$t:common.currency_unit" } ] @@ -625,7 +624,7 @@ "name": "Div", "props": { "className": "grid grid-cols-3 gap-2 py-1.5 text-sm" }, "children": [ - { "type": "basic", "name": "Span", "props": { "className": "text-gray-600 dark:text-gray-400" }, "text": "$t:mypage.order_detail.cancel_modal.code_discount" }, + { "type": "basic", "name": "Span", "props": { "className": "text-gray-600 dark:text-gray-400 break-keep" }, "text": "$t:mypage.order_detail.cancel_modal.code_discount" }, { "type": "basic", "name": "Span", "props": { "className": "text-right text-gray-900 dark:text-white" }, "text": "-{{_local.refundEstimate?.original_snapshot?.formatted?.total_code_discount_amount ?? (_local.refundEstimate?.original_snapshot?.total_code_discount_amount ?? 0).toLocaleString()}}" }, { "type": "basic", "name": "Span", "props": { "className": "text-right {{(_local.refundEstimate?.original_snapshot?.total_code_discount_amount ?? 0) !== (_local.refundEstimate?.recalculated_snapshot?.total_code_discount_amount ?? 0) ? 'text-red-600 dark:text-red-400 font-semibold' : 'text-gray-900 dark:text-white'}}" }, "text": "-{{_local.refundEstimate?.recalculated_snapshot?.formatted?.total_code_discount_amount ?? (_local.refundEstimate?.recalculated_snapshot?.total_code_discount_amount ?? 0).toLocaleString()}}" } ] @@ -641,7 +640,7 @@ "name": "Div", "props": { "className": "grid grid-cols-3 gap-2 text-sm" }, "children": [ - { "type": "basic", "name": "Span", "props": { "className": "text-gray-600 dark:text-gray-400" }, "text": "$t:mypage.order_detail.cancel_modal.shipping_coupon_discount" }, + { "type": "basic", "name": "Span", "props": { "className": "text-gray-600 dark:text-gray-400 break-keep" }, "text": "$t:mypage.order_detail.cancel_modal.shipping_coupon_discount" }, { "type": "basic", "name": "Span", "props": { "className": "text-right text-gray-900 dark:text-white" }, "text": "-{{_local.refundEstimate?.original_snapshot?.formatted?.shipping_discount_amount ?? (_local.refundEstimate?.original_snapshot?.shipping_discount_amount ?? 0).toLocaleString()}}" }, { "type": "basic", "name": "Span", "props": { "className": "text-right {{(_local.refundEstimate?.original_snapshot?.shipping_discount_amount ?? 0) !== (_local.refundEstimate?.recalculated_snapshot?.shipping_discount_amount ?? 0) ? 'text-red-600 dark:text-red-400 font-semibold' : 'text-gray-900 dark:text-white'}}" }, "text": "-{{_local.refundEstimate?.recalculated_snapshot?.formatted?.shipping_discount_amount ?? (_local.refundEstimate?.recalculated_snapshot?.shipping_discount_amount ?? 0).toLocaleString()}}" } ] @@ -667,7 +666,7 @@ "item_var": "sc", "index_var": "scIdx" }, - "props": { "className": "text-xs text-gray-400 dark:text-gray-500" }, + "props": { "className": "text-xs text-gray-400 dark:text-gray-500 break-keep" }, "text": "{{sc.name}} -{{(sc.discount_amount ?? 0).toLocaleString()}}$t:common.currency_unit" } ] @@ -685,7 +684,7 @@ "item_var": "rsc", "index_var": "rscIdx" }, - "props": { "className": "text-xs text-gray-400 dark:text-gray-500" }, + "props": { "className": "text-xs text-gray-400 dark:text-gray-500 break-keep" }, "text": "{{rsc.name}} -{{(rsc.discount_amount ?? 0).toLocaleString()}}$t:common.currency_unit" } ] @@ -700,7 +699,7 @@ "name": "Div", "props": { "className": "grid grid-cols-3 gap-2 py-1.5 text-sm" }, "children": [ - { "type": "basic", "name": "Span", "props": { "className": "text-gray-600 dark:text-gray-400" }, "text": "$t:mypage.order_detail.cancel_modal.base_shipping" }, + { "type": "basic", "name": "Span", "props": { "className": "text-gray-600 dark:text-gray-400 break-keep" }, "text": "$t:mypage.order_detail.cancel_modal.base_shipping" }, { "type": "basic", "name": "Span", "props": { "className": "text-right text-gray-900 dark:text-white" }, "text": "{{_local.refundEstimate?.original_snapshot?.formatted?.base_shipping_amount ?? (_local.refundEstimate?.original_snapshot?.base_shipping_amount ?? 0).toLocaleString()}}" }, { "type": "basic", "name": "Span", "props": { "className": "text-right {{(_local.refundEstimate?.original_snapshot?.base_shipping_amount ?? 0) !== (_local.refundEstimate?.recalculated_snapshot?.base_shipping_amount ?? 0) ? 'text-red-600 dark:text-red-400 font-semibold' : 'text-gray-900 dark:text-white'}}" }, "text": "{{_local.refundEstimate?.recalculated_snapshot?.formatted?.base_shipping_amount ?? (_local.refundEstimate?.recalculated_snapshot?.base_shipping_amount ?? 0).toLocaleString()}}" } ] @@ -711,7 +710,7 @@ "name": "Div", "props": { "className": "grid grid-cols-3 gap-2 py-1.5 text-sm" }, "children": [ - { "type": "basic", "name": "Span", "props": { "className": "text-gray-600 dark:text-gray-400" }, "text": "$t:mypage.order_detail.cancel_modal.extra_shipping" }, + { "type": "basic", "name": "Span", "props": { "className": "text-gray-600 dark:text-gray-400 break-keep" }, "text": "$t:mypage.order_detail.cancel_modal.extra_shipping" }, { "type": "basic", "name": "Span", "props": { "className": "text-right text-gray-900 dark:text-white" }, "text": "{{_local.refundEstimate?.original_snapshot?.formatted?.extra_shipping_amount ?? (_local.refundEstimate?.original_snapshot?.extra_shipping_amount ?? 0).toLocaleString()}}" }, { "type": "basic", "name": "Span", "props": { "className": "text-right {{(_local.refundEstimate?.original_snapshot?.extra_shipping_amount ?? 0) !== (_local.refundEstimate?.recalculated_snapshot?.extra_shipping_amount ?? 0) ? 'text-red-600 dark:text-red-400 font-semibold' : 'text-gray-900 dark:text-white'}}" }, "text": "{{_local.refundEstimate?.recalculated_snapshot?.formatted?.extra_shipping_amount ?? (_local.refundEstimate?.recalculated_snapshot?.extra_shipping_amount ?? 0).toLocaleString()}}" } ] @@ -722,7 +721,7 @@ "name": "Div", "props": { "className": "grid grid-cols-3 gap-2 py-1.5 text-sm" }, "children": [ - { "type": "basic", "name": "Span", "props": { "className": "text-gray-600 dark:text-gray-400" }, "text": "$t:mypage.order_detail.cancel_modal.points_used" }, + { "type": "basic", "name": "Span", "props": { "className": "text-gray-600 dark:text-gray-400 break-keep" }, "text": "$t:mypage.order_detail.cancel_modal.points_used" }, { "type": "basic", "name": "Span", "props": { "className": "text-right text-gray-900 dark:text-white" }, "text": "-{{_local.refundEstimate?.original_snapshot?.formatted?.total_points_used_amount ?? (_local.refundEstimate?.original_snapshot?.total_points_used_amount ?? 0).toLocaleString()}}" }, { "type": "basic", "name": "Span", "props": { "className": "text-right {{(_local.refundEstimate?.original_snapshot?.total_points_used_amount ?? 0) !== (_local.refundEstimate?.recalculated_snapshot?.total_points_used_amount ?? 0) ? 'text-red-600 dark:text-red-400 font-semibold' : 'text-gray-900 dark:text-white'}}" }, "text": "-{{_local.refundEstimate?.recalculated_snapshot?.formatted?.total_points_used_amount ?? (_local.refundEstimate?.recalculated_snapshot?.total_points_used_amount ?? 0).toLocaleString()}}" } ] @@ -733,7 +732,7 @@ "name": "Div", "props": { "className": "grid grid-cols-3 gap-2 py-1.5 text-sm" }, "children": [ - { "type": "basic", "name": "Span", "props": { "className": "text-gray-600 dark:text-gray-400" }, "text": "$t:mypage.order_detail.cancel_modal.taxable_amount" }, + { "type": "basic", "name": "Span", "props": { "className": "text-gray-600 dark:text-gray-400 break-keep" }, "text": "$t:mypage.order_detail.cancel_modal.taxable_amount" }, { "type": "basic", "name": "Span", "props": { "className": "text-right text-gray-900 dark:text-white" }, "text": "{{_local.refundEstimate?.original_snapshot?.formatted?.total_tax_amount ?? (_local.refundEstimate?.original_snapshot?.total_tax_amount ?? 0).toLocaleString()}}" }, { "type": "basic", "name": "Span", "props": { "className": "text-right {{(_local.refundEstimate?.original_snapshot?.total_tax_amount ?? 0) !== (_local.refundEstimate?.recalculated_snapshot?.total_tax_amount ?? 0) ? 'text-red-600 dark:text-red-400 font-semibold' : 'text-gray-900 dark:text-white'}}" }, "text": "{{_local.refundEstimate?.recalculated_snapshot?.formatted?.total_tax_amount ?? (_local.refundEstimate?.recalculated_snapshot?.total_tax_amount ?? 0).toLocaleString()}}" } ] @@ -744,7 +743,7 @@ "name": "Div", "props": { "className": "grid grid-cols-3 gap-2 py-1.5 text-sm" }, "children": [ - { "type": "basic", "name": "Span", "props": { "className": "text-gray-600 dark:text-gray-400" }, "text": "$t:mypage.order_detail.cancel_modal.vat_amount" }, + { "type": "basic", "name": "Span", "props": { "className": "text-gray-600 dark:text-gray-400 break-keep" }, "text": "$t:mypage.order_detail.cancel_modal.vat_amount" }, { "type": "basic", "name": "Span", "props": { "className": "text-right text-gray-900 dark:text-white" }, "text": "{{_local.refundEstimate?.original_snapshot?.formatted?.total_vat_amount ?? (_local.refundEstimate?.original_snapshot?.total_vat_amount ?? 0).toLocaleString()}}" }, { "type": "basic", "name": "Span", "props": { "className": "text-right {{(_local.refundEstimate?.original_snapshot?.total_vat_amount ?? 0) !== (_local.refundEstimate?.recalculated_snapshot?.total_vat_amount ?? 0) ? 'text-red-600 dark:text-red-400 font-semibold' : 'text-gray-900 dark:text-white'}}" }, "text": "{{_local.refundEstimate?.recalculated_snapshot?.formatted?.total_vat_amount ?? (_local.refundEstimate?.recalculated_snapshot?.total_vat_amount ?? 0).toLocaleString()}}" } ] @@ -812,7 +811,7 @@ "name": "Div", "props": { "className": "grid grid-cols-3 gap-2 py-1.5 text-sm" }, "children": [ - { "type": "basic", "name": "Span", "props": { "className": "text-gray-600 dark:text-gray-400" }, "text": "$t:mypage.order_detail.cancel_modal.earned_points" }, + { "type": "basic", "name": "Span", "props": { "className": "text-gray-600 dark:text-gray-400 break-keep" }, "text": "$t:mypage.order_detail.cancel_modal.earned_points" }, { "type": "basic", "name": "Span", "props": { "className": "text-right text-gray-900 dark:text-white" }, "text": "{{(_local.refundEstimate?.original_snapshot?.total_earned_points_amount ?? 0).toLocaleString()}}P" }, { "type": "basic", "name": "Span", "props": { "className": "text-right {{(_local.refundEstimate?.original_snapshot?.total_earned_points_amount ?? 0) !== (_local.refundEstimate?.recalculated_snapshot?.total_earned_points_amount ?? 0) ? 'text-red-600 dark:text-red-400 font-semibold' : 'text-gray-900 dark:text-white'}}" }, "text": "{{(_local.refundEstimate?.recalculated_snapshot?.total_earned_points_amount ?? 0).toLocaleString()}}P" } ] @@ -892,7 +891,7 @@ { "type": "basic", "name": "Span", - "props": { "className": "text-xs font-medium text-gray-600 dark:text-gray-400 block mb-1" }, + "props": { "className": "text-xs font-medium text-gray-600 dark:text-gray-400 block mb-1 break-keep" }, "text": "$t:mypage.order_detail.cancel_modal.restored_coupons_label" }, { @@ -905,8 +904,8 @@ }, "props": { "className": "flex justify-between text-xs py-0.5" }, "children": [ - { "type": "basic", "name": "Span", "props": { "className": "text-gray-600 dark:text-gray-400" }, "text": "{{coupon.coupon_name ?? ''}}" }, - { "type": "basic", "name": "Span", "props": { "className": "text-gray-700 dark:text-gray-300" }, "text": "{{(coupon.discount_amount ?? 0).toLocaleString()}}$t:common.currency_unit" } + { "type": "basic", "name": "Span", "props": { "className": "text-gray-600 dark:text-gray-400 break-keep" }, "text": "{{coupon.coupon_name ?? ''}}" }, + { "type": "basic", "name": "Span", "props": { "className": "text-gray-700 dark:text-gray-300 whitespace-nowrap" }, "text": "{{(coupon.discount_amount ?? 0).toLocaleString()}}$t:common.currency_unit" } ] }, { diff --git a/templates/_bundled/sirsoft-basic/layouts/partials/mypage/orders/_modal_confirm_purchase.json b/templates/_bundled/sirsoft-basic/layouts/partials/mypage/orders/_modal_confirm_purchase.json index 5e5d2078..67206af3 100644 --- a/templates/_bundled/sirsoft-basic/layouts/partials/mypage/orders/_modal_confirm_purchase.json +++ b/templates/_bundled/sirsoft-basic/layouts/partials/mypage/orders/_modal_confirm_purchase.json @@ -9,7 +9,6 @@ "id": "modal_confirm_purchase", "props": { "width": "480px", - "className": "max-w-full", "title": "$t:mypage.order_detail.confirm_modal.title" }, "children": [ @@ -77,7 +76,7 @@ { "type": "basic", "name": "Icon", - "props": { "name": "gift", "className": "w-4 h-4 text-blue-600 dark:text-blue-400" } + "props": { "name": "gift", "className": "text-base text-blue-600 dark:text-blue-400" } }, { "type": "basic", @@ -104,7 +103,7 @@ { "type": "basic", "name": "Icon", - "props": { "name": "triangle-exclamation", "className": "w-4 h-4 text-yellow-600 dark:text-yellow-400 flex-shrink-0 mt-0.5" } + "props": { "name": "triangle-exclamation", "className": "text-base text-yellow-600 dark:text-yellow-400 flex-shrink-0 mt-0.5" } }, { "type": "basic", diff --git a/templates/_bundled/sirsoft-basic/layouts/partials/mypage/orders/_modal_write_review.json b/templates/_bundled/sirsoft-basic/layouts/partials/mypage/orders/_modal_write_review.json index f679be51..55a77f3a 100644 --- a/templates/_bundled/sirsoft-basic/layouts/partials/mypage/orders/_modal_write_review.json +++ b/templates/_bundled/sirsoft-basic/layouts/partials/mypage/orders/_modal_write_review.json @@ -9,7 +9,6 @@ "id": "modal_write_review", "props": { "width": "560px", - "className": "max-w-full", "title": "$t:mypage.order_detail.review_modal.title" }, "children": [ diff --git a/templates/_bundled/sirsoft-basic/layouts/partials/shop/_modal_address_manage.json b/templates/_bundled/sirsoft-basic/layouts/partials/shop/_modal_address_manage.json index 8eb06a36..ddb65bf3 100644 --- a/templates/_bundled/sirsoft-basic/layouts/partials/shop/_modal_address_manage.json +++ b/templates/_bundled/sirsoft-basic/layouts/partials/shop/_modal_address_manage.json @@ -768,7 +768,7 @@ { "type": "basic", "name": "Div", - "props": { "className": "grid grid-cols-2 gap-2" }, + "props": { "className": "grid grid-cols-1 sm:grid-cols-2 gap-2" }, "children": [ { "type": "basic", diff --git a/templates/_bundled/sirsoft-basic/layouts/partials/shop/detail/_info_summary.json b/templates/_bundled/sirsoft-basic/layouts/partials/shop/detail/_info_summary.json index ab553ddb..f075e51c 100644 --- a/templates/_bundled/sirsoft-basic/layouts/partials/shop/detail/_info_summary.json +++ b/templates/_bundled/sirsoft-basic/layouts/partials/shop/detail/_info_summary.json @@ -70,10 +70,10 @@ "props": { "className": "border-t border-gray-200 dark:border-gray-700 pt-3 mt-3" }, "children": [ { - "comment": "쿠폰 배지 목록 (가로 스크롤)", + "comment": "쿠폰 배지 목록 (좁은 화면에서 여러 줄로 줄바꿈 — 칩 라벨 자체는 whitespace-nowrap 으로 한 줄 유지)", "type": "basic", "name": "Div", - "props": { "className": "flex items-center gap-2 overflow-x-auto pb-1" }, + "props": { "className": "flex flex-wrap items-center gap-2 pb-1" }, "children": [ { "type": "basic", @@ -101,6 +101,7 @@ { "type": "basic", "name": "Span", + "props": { "className": "whitespace-nowrap" }, "text": "{{dlCoupon.multi_currency_benefit_formatted?.[_global.preferredCurrency ?? 'KRW'] ?? dlCoupon.benefit_formatted}}" }, { diff --git a/templates/_bundled/sirsoft-basic/package-lock.json b/templates/_bundled/sirsoft-basic/package-lock.json index 7156c020..f93b6349 100644 --- a/templates/_bundled/sirsoft-basic/package-lock.json +++ b/templates/_bundled/sirsoft-basic/package-lock.json @@ -1,12 +1,12 @@ { "name": "sirsoft-basic", - "version": "1.0.1", + "version": "1.0.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "sirsoft-basic", - "version": "1.0.1", + "version": "1.0.2", "license": "MIT", "dependencies": { "@dnd-kit/core": "^6.3.1", diff --git a/templates/_bundled/sirsoft-basic/package.json b/templates/_bundled/sirsoft-basic/package.json index e2a065a7..822f2e37 100644 --- a/templates/_bundled/sirsoft-basic/package.json +++ b/templates/_bundled/sirsoft-basic/package.json @@ -1,6 +1,6 @@ { "name": "sirsoft-basic", - "version": "1.0.1", + "version": "1.0.2", "description": "Gnuboard7 Basic User Template Components - Nexibase Style", "type": "module", "main": "dist/components.js", diff --git a/templates/_bundled/sirsoft-basic/src/components/composite/Modal.tsx b/templates/_bundled/sirsoft-basic/src/components/composite/Modal.tsx index cdd64173..76fa6e33 100644 --- a/templates/_bundled/sirsoft-basic/src/components/composite/Modal.tsx +++ b/templates/_bundled/sirsoft-basic/src/components/composite/Modal.tsx @@ -177,7 +177,7 @@ export const Modal: React.FC = ({ {/* Modal Content */}
e.stopPropagation()} role="dialog" diff --git a/templates/_bundled/sirsoft-basic/template.json b/templates/_bundled/sirsoft-basic/template.json index 9ece8403..2c26b961 100644 --- a/templates/_bundled/sirsoft-basic/template.json +++ b/templates/_bundled/sirsoft-basic/template.json @@ -5,7 +5,7 @@ "ko": "Basic", "en": "Basic" }, - "version": "1.0.1", + "version": "1.0.2", "license": "MIT", "description": { "ko": "그누보드7 기본 사용자 템플릿", @@ -26,7 +26,7 @@ "dependencies": { "modules": { "sirsoft-board": ">=1.0.0", - "sirsoft-ecommerce": ">=1.0.0", + "sirsoft-ecommerce": ">=1.0.2", "sirsoft-page": ">=1.0.0" }, "plugins": { diff --git a/templates/_bundled/sirsoft-basic/tests/Playwright/playwright.config.ts b/templates/_bundled/sirsoft-basic/tests/Playwright/playwright.config.ts new file mode 100644 index 00000000..f21a49ce --- /dev/null +++ b/templates/_bundled/sirsoft-basic/tests/Playwright/playwright.config.ts @@ -0,0 +1,84 @@ +/** + * sirsoft-basic 템플릿 Playwright E2E 설정. + * + * 코어 `playwright.config.ts` 와 동일한 base URL 해석 우선순위를 따른다 — 활성 호스트가 + * 가변(개발자/CI/운영 환경별로 다른 도메인)이므로 하드코딩 회피. + * + * Base URL 해석: + * 1. PLAYWRIGHT_BASE_URL 환경변수 (CI/명시적 오버라이드) + * 2. .env (코어 루트) 의 APP_URL — 단 localhost 류는 fallback 부적합 + * 3. 그 외 — 명시 에러 + * + * 뷰포트는 각 spec 이 `page.setViewportSize()` 로 직접 지정한다(모바일 390/320px ↔ 데스크톱 + * 1280px 을 한 파일에서 교차 검증하므로, 프로젝트를 뷰포트별로 나누면 같은 테스트가 + * 중복 실행된다). + * + * 실행 예시: + * PowerShell — $env:PLAYWRIGHT_BASE_URL='https://example.com'; npx playwright test --config templates/_bundled/sirsoft-basic/tests/Playwright/playwright.config.ts + */ +import { defineConfig, devices } from '@playwright/test'; +import { readFileSync, existsSync } from 'node:fs'; +import { dirname, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const __dirname = dirname(fileURLToPath(import.meta.url)); + +/** + * .env 파일에서 키 하나를 읽습니다. + * + * @param filePath .env 파일 절대 경로 + * @param key 읽을 키 이름 + * @return 값 (없으면 null) + */ +function readEnvFile(filePath: string, key: string): string | null { + if (!existsSync(filePath)) return null; + const content = readFileSync(filePath, { encoding: 'utf-8' }); + const pattern = new RegExp(`^${key}=(.*)$`, 'm'); + const match = content.match(pattern); + if (!match) return null; + let value = match[1].trim(); + if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'"))) { + value = value.slice(1, -1); + } + return value || null; +} + +/** + * E2E base URL 을 해석합니다. + * + * @return base URL + * @throws Error 활성 호스트를 확정할 수 없을 때 + */ +function resolveBaseUrl(): string { + if (process.env.PLAYWRIGHT_BASE_URL) { + return process.env.PLAYWRIGHT_BASE_URL; + } + // 템플릿 디렉토리 기준 5단계 상위 = 코어 루트 (.env 위치) + const coreRoot = process.env.G7_ROOT || resolve(__dirname, '../../../../../'); + const appUrl = readEnvFile(resolve(coreRoot, '.env'), 'APP_URL'); + if (appUrl && !/^https?:\/\/localhost(:\d+)?\/?$/i.test(appUrl)) { + return appUrl; + } + throw new Error( + 'sirsoft-basic 템플릿 E2E base URL 미설정. PLAYWRIGHT_BASE_URL 환경변수를 지정하거나 코어 .env 의 APP_URL 을 활성 호스트로 설정하세요.' + ); +} + +export default defineConfig({ + testDir: './specs', + fullyParallel: true, + forbidOnly: !!process.env.CI, + retries: process.env.CI ? 2 : 0, + workers: process.env.CI ? 1 : undefined, + reporter: [ + ['html', { outputFolder: 'playwright-report', open: 'never' }], + ['list'], + ], + use: { + baseURL: resolveBaseUrl(), + trace: 'retain-on-failure', + screenshot: 'only-on-failure', + ignoreHTTPSErrors: true, + }, + projects: [{ name: 'chromium', use: { ...devices['Desktop Chrome'] } }], +}); diff --git a/templates/_bundled/sirsoft-basic/tests/Playwright/specs/board-navigation-long-name.spec.ts b/templates/_bundled/sirsoft-basic/tests/Playwright/specs/board-navigation-long-name.spec.ts new file mode 100644 index 00000000..c307b361 --- /dev/null +++ b/templates/_bundled/sirsoft-basic/tests/Playwright/specs/board-navigation-long-name.spec.ts @@ -0,0 +1,245 @@ +/** + * 게시글 상단 네비게이션 — 긴 게시판명이 좌우 버튼을 압착하지 않는지 검증. + * + * 배경 (390px 실측, `flex items-center justify-between` 한 줄에 목록/게시판명/이전글·다음글): + * - 게시판명 Span 이 `flex-shrink` 를 받아 남은 폭을 먹으면서 형제 버튼을 눌렀다. + * '이전글' 버튼 폭: 5자 '자유게시판' 87px → 11자 'API 문서 샘플 게시판' 73px + * → 21자 62px. 62px 에서는 chevron 아이콘과 텍스트가 겹친다. + * - `document.scrollWidth` 는 내내 뷰포트와 같아 오버플로 검사로는 잡히지 않는다. + * 버튼이 넘치는 게 아니라 *줄어드는* 회귀이므로 폭을 직접 재야 한다. + * + * 조치: + * - 목록 버튼과 이전/다음 그룹에 `shrink-0` → 게시판명 길이와 무관하게 고정폭 + * - 모바일(0~767px)에서 컨테이너 `flex-wrap` + 게시판명 `order-first w-full` + * → 게시판명이 첫 줄 전체를 차지하고 버튼은 아래 줄에서 폭 경쟁을 하지 않는다 + * - 태블릿 이상(768px+)은 한 줄 유지. 버튼 3개 고정폭 261px + 21자 제목 자연폭 323px + * = 584px < 콘텐츠 735px 이므로 줄바꿈이 필요 없다. + * + * 선택자 규율: + * - 버튼 라벨(`목록`/`이전글`)은 브라우저 로케일에 따라 영문으로 렌더된다(`Back to List`). + * 로케일 독립적인 Font Awesome 아이콘 클래스(`fa-list`/`fa-chevron-left`)로 찾는다. + * - 게시판명 자체는 시드 데이터에 따라 짧을 수 있으므로, 실제 게시판을 고르는 대신 + * 제목 노드에 최악 케이스 문자열을 주입해 재측정한다. 회귀는 레이아웃에 있지 + * 특정 게시판에 있지 않다. + */ +import { test, expect, type Page, type Locator } from '@playwright/test'; + +/** 기준선 게시판명 (5자, 자연폭 83px — 이 폭에서는 회귀 상태에서도 버튼이 안 눌린다) */ +const SHORT_BOARD_NAME = '자유게시판'; + +/** 최악 케이스 게시판명 (21자, 자연폭 323px) */ +const LONG_BOARD_NAME = '아주 긴 이름을 가진 커뮤니티 게시판입니다'; + +/** 상단 네비게이션 컨테이너 — 목록(fa-list) + 게시판명 + 이전/다음 그룹 */ +function navLocator(page: Page): Locator { + return page.locator('div.mb-6').filter({ has: page.locator('button i.fa-list') }).first(); +} + +/** + * 이전글/다음글이 모두 있는 게시글을 찾습니다. 시드 데이터에 의존하지 않도록 공개 API 로 탐색합니다. + * + * @param page Playwright 페이지 + * @return { slug, postId } 또는 조건을 만족하는 글이 없으면 null + */ +async function findPostWithBothNeighbors( + page: Page +): Promise<{ slug: string; postId: number } | null> { + return page.evaluate(async () => { + const boardsRes = await fetch('/api/modules/sirsoft-board/boards'); + const boards = (await boardsRes.json())?.data ?? []; + + for (const board of boards) { + if ((board.posts_count ?? 0) < 3) continue; + + const listRes = await fetch( + `/api/modules/sirsoft-board/boards/${board.slug}/posts?per_page=5` + ); + const posts = (await listRes.json())?.data?.data ?? []; + + for (const post of posts) { + const navRes = await fetch( + `/api/modules/sirsoft-board/boards/${board.slug}/posts/${post.id}/navigation` + ); + const nav = (await navRes.json())?.data; + if (nav?.prev?.id && nav?.next?.id) { + return { slug: board.slug as string, postId: post.id as number }; + } + } + } + return null; + }); +} + +/** + * 짧은 게시판명 → 긴 게시판명으로 바꾸며 기하를 측정합니다. + * + * 핵심 단언은 "긴 이름일 때의 버튼 폭 == 짧은 이름일 때의 버튼 폭" 이다. 절대 폭 하한만 + * 보면 시드 데이터의 게시판명 길이에 따라 단언이 무력해진다(짧은 이름 게시판에서는 + * 회귀 상태여도 버튼이 하한을 넘는다). 같은 페이지에서 두 상태를 재 차이를 본다. + * + * @param nav 네비게이션 컨테이너 로케이터 + * @param shortName 기준선으로 쓸 짧은 게시판명 + * @param longName 최악 케이스 게시판명 + * @return 짧은/긴 이름 각각의 flex 배치와 버튼 폭 + */ +async function measureShortVsLongName(nav: Locator, shortName: string, longName: string) { + return nav.evaluate( + (el: HTMLElement, { short, long }: { short: string; long: string }) => { + const title = el.children[1] as HTMLElement; + + const snapshot = () => ({ + flexWrap: getComputedStyle(el).flexWrap, + titleOrder: Number(getComputedStyle(title).order), + titleTop: Math.round(title.getBoundingClientRect().top), + titleWidth: Math.round(title.getBoundingClientRect().width), + firstButtonTop: Math.round((el.children[0] as HTMLElement).getBoundingClientRect().top), + containerWidth: Math.round(el.getBoundingClientRect().width), + viewportWidth: document.documentElement.clientWidth, + docOverflow: document.documentElement.scrollWidth - document.documentElement.clientWidth, + buttons: [...el.querySelectorAll('button')].map((b) => ({ + icon: b.querySelector('i')?.className ?? '', + width: Math.round(b.getBoundingClientRect().width), + left: Math.round(b.getBoundingClientRect().left), + right: Math.round(b.getBoundingClientRect().right), + })), + }); + + title.textContent = short; + const withShortName = snapshot(); + title.textContent = long; + const withLongName = snapshot(); + return { withShortName, withLongName }; + }, + { short: shortName, long: longName } + ); +} + +/** + * 이전글·다음글이 모두 있는 게시글로 이동하고 네비 컨테이너를 반환합니다. + * + * navigation API 가 이웃을 돌려줘도 화면에는 렌더되지 않을 수 있으므로(비밀글·권한 필터) + * 실제 버튼 3개가 보이는지까지 확인한다. + * + * @param page Playwright 페이지 + * @return 네비게이션 컨테이너 로케이터 (조건을 만족하는 글이 없으면 테스트 skip) + */ +async function gotoPostWithNeighbors(page: Page): Promise { + await page.goto('/'); + const target = await findPostWithBothNeighbors(page); + test.skip(target === null, '이전글·다음글이 모두 있는 게시글이 없다'); + + await page.goto(`/board/${target!.slug}/${target!.postId}`); + const nav = navLocator(page); + await expect(nav).toBeVisible({ timeout: 15_000 }); + + // 라벨은 브라우저 로케일에 따라 영문이 되므로 아이콘으로 확인한다 + await expect(nav.locator('button i.fa-chevron-left')).toBeVisible(); + await expect(nav.locator('button i.fa-chevron-right')).toBeVisible(); + await expect(nav.locator('button')).toHaveCount(3); + return nav; +} + +/** + * 게시판명 길이가 버튼 폭에 영향을 주지 않는지 단언합니다 (이 회귀의 본질). + * + * @param withShortName 짧은 이름일 때의 측정치 + * @param withLongName 긴 이름일 때의 측정치 + */ +function expectButtonsUnaffectedByBoardName( + withShortName: { buttons: Array<{ width: number }> }, + withLongName: { buttons: Array<{ width: number }> } +): void { + expect(withShortName.buttons).toHaveLength(3); + expect(withLongName.buttons).toHaveLength(3); + // 회귀 상태에서는 87 → 62px 로 줄었다. shrink-0 이면 두 값이 완전히 같다. + expect(withLongName.buttons.map((b) => b.width)).toEqual( + withShortName.buttons.map((b) => b.width) + ); +} + +test.describe('게시글 상단 네비 — 긴 게시판명', () => { + test('@smoke 모바일(390px)에서 이전글/다음글이 압착되지 않고 게시판명은 자기 줄을 갖는다', async ({ + page, + }) => { + await page.setViewportSize({ width: 390, height: 844 }); + const nav = await gotoPostWithNeighbors(page); + + const { withShortName, withLongName } = await measureShortVsLongName( + nav, + SHORT_BOARD_NAME, + LONG_BOARD_NAME + ); + + expectButtonsUnaffectedByBoardName(withShortName, withLongName); + + // 긴 이름에서도 세 버튼이 뷰포트 안에 온전히 들어온다 + for (const btn of withLongName.buttons) { + expect(btn.left).toBeGreaterThanOrEqual(-1); + expect(btn.right).toBeLessThanOrEqual(withLongName.viewportWidth + 1); + } + + // 게시판명이 첫 줄 전체(order-first w-full)를 차지하고 버튼 행보다 위에 있다 + expect(withLongName.flexWrap).toBe('wrap'); + expect(withLongName.titleOrder).toBeLessThan(0); + expect(withLongName.titleWidth).toBe(withLongName.containerWidth); + expect(withLongName.titleTop).toBeLessThan(withLongName.firstButtonTop); + + expect(withLongName.docOverflow).toBe(0); + }); + + test('320px 에서도 버튼 폭이 게시판명 길이와 무관하다', async ({ page }) => { + await page.setViewportSize({ width: 320, height: 844 }); + const nav = await gotoPostWithNeighbors(page); + + const { withShortName, withLongName } = await measureShortVsLongName( + nav, + SHORT_BOARD_NAME, + LONG_BOARD_NAME + ); + + expectButtonsUnaffectedByBoardName(withShortName, withLongName); + for (const btn of withLongName.buttons) { + expect(btn.left).toBeGreaterThanOrEqual(-1); + expect(btn.right).toBeLessThanOrEqual(withLongName.viewportWidth + 1); + } + expect(withLongName.flexWrap).toBe('wrap'); + expect(withLongName.docOverflow).toBe(0); + }); + + test('태블릿(768px)은 한 줄을 유지하면서도 버튼이 압착되지 않는다', async ({ page }) => { + await page.setViewportSize({ width: 768, height: 900 }); + const nav = await gotoPostWithNeighbors(page); + + const { withShortName, withLongName } = await measureShortVsLongName( + nav, + SHORT_BOARD_NAME, + LONG_BOARD_NAME + ); + + // 버튼 3개 고정폭 261px + 21자 제목 자연폭 323px = 584px < 콘텐츠 폭 → 줄바꿈 불필요 + expect(withLongName.flexWrap).toBe('nowrap'); + expect(withLongName.titleOrder).toBe(0); + expect(withLongName.titleWidth).toBeLessThan(withLongName.containerWidth); + expectButtonsUnaffectedByBoardName(withShortName, withLongName); + expect(withLongName.docOverflow).toBe(0); + }); + + test('데스크톱(1280px)은 기존 한 줄 레이아웃을 유지한다 (모바일 오버라이드 누출 없음)', async ({ + page, + }) => { + await page.setViewportSize({ width: 1280, height: 900 }); + const nav = await gotoPostWithNeighbors(page); + + const { withShortName, withLongName } = await measureShortVsLongName( + nav, + SHORT_BOARD_NAME, + LONG_BOARD_NAME + ); + + expect(withLongName.flexWrap).toBe('nowrap'); + expect(withLongName.titleOrder).toBe(0); + expect(withLongName.titleWidth).toBeLessThan(withLongName.containerWidth); + expectButtonsUnaffectedByBoardName(withShortName, withLongName); + expect(withLongName.docOverflow).toBe(0); + }); +}); diff --git a/templates/_bundled/sirsoft-basic/tests/Playwright/specs/mobile-viewport-overflow.spec.ts b/templates/_bundled/sirsoft-basic/tests/Playwright/specs/mobile-viewport-overflow.spec.ts new file mode 100644 index 00000000..10873065 --- /dev/null +++ b/templates/_bundled/sirsoft-basic/tests/Playwright/specs/mobile-viewport-overflow.spec.ts @@ -0,0 +1,214 @@ +/** + * sirsoft-basic 모바일 뷰포트 가로 오버플로 회귀 E2E. + * + * 배경 (390x844 실측): + * - 헤더 우측 그룹에 언어(71px)+통화(91px)가 있어 26개 라우트 중 24개에서 + * document.scrollWidth = 401px (뷰포트 390px 대비 +11px). + * 320px(iPhone SE)에서는 햄버거 버튼이 화면 밖으로 밀려 내비게이션 자체가 불가능했다. + * - 비회원 댓글폼: 아바타 76px 들여쓰기 + flex-1 입력 2개 → 문서 +81px 초과 + * - 상품상세 쿠폰 칩: 라벨에 whitespace-nowrap 이 없어 39px 폭에서 2줄로 줄바꿈 + * + * 조치: + * - 언어/통화를 모바일 드로어(mobile_drawer_prefs)로 이동, 가로 칩으로 나열 + * - 통화/배송국가 주입 조각은 responsive.portable 로 모바일에서만 펼친 칩 목록 + * - 데스크톱(≥1024px)은 기존 헤더 드롭다운 유지 + * + * 단위 테스트(Vitest)는 레이아웃 JSON 구조만 본다. 실제 브라우저 폭·줄 수·가시성은 + * 여기서만 검증된다 (위지윅 발행 회귀 #238 교훈). + */ +import { test, expect, type Page } from '@playwright/test'; + +/** 문서가 뷰포트보다 가로로 넘치는 px (0 이어야 정상) */ +async function docOverflow(page: Page): Promise { + return page.evaluate( + () => document.documentElement.scrollWidth - document.documentElement.clientWidth + ); +} + +/** + * 뷰포트를 벗어난 가시 요소 목록. + * + * 제외 대상 (자기 자신부터 조상까지 거슬러 올라가며 판정): + * - 숨김 요소(display/visibility/opacity) + * - 화면 밖으로 밀어둔 off-canvas 서브트리 — 닫힌 드로어(`translate-x-full`) + * - `position: fixed` 서브트리 — 문서 스크롤 폭에 기여하지 않는다. + * (예: PageTransitionIndicator 의 로딩 바는 translateX 애니메이션으로 한때 + * `right > VW` 가 되지만 fixed 라 문서를 넓히지 않는다) + * - 조상이 `overflow-x: hidden|clip` 으로 잘라내는 요소 + * + * 문서 전체 오버플로는 `docOverflow()` 가 별도로 본다. 이 함수는 "어떤 요소가 범인인가"를 + * 진단하기 위한 것이다. + */ +async function overflowingElements(page: Page): Promise> { + return page.evaluate(() => { + const VW = document.documentElement.clientWidth; + const isExcluded = (el: Element): boolean => { + let n: Element | null = el; + while (n && n !== document.documentElement) { + const cs = getComputedStyle(n); + if (cs.display === 'none' || cs.visibility === 'hidden' || parseFloat(cs.opacity) === 0) { + return true; + } + if (cs.position === 'fixed') return true; + if (n !== el && /hidden|clip/.test(cs.overflowX)) return true; + const r = n.getBoundingClientRect(); + if (r.width > 0 && (r.left >= VW - 1 || r.right <= 1)) return true; + n = n.parentElement; + } + return false; + }; + return [...document.body.querySelectorAll('*')] + .filter((el) => { + const r = el.getBoundingClientRect(); + if (!r.width || !r.height || isExcluded(el)) return false; + return r.right > VW + 1 || r.left < -1; + }) + .map((el) => ({ id: el.id, cls: String(el.className).slice(0, 60) })); + }); +} + +test.describe('모바일 헤더/드로어 (390px)', () => { + test('@smoke 홈에서 문서가 가로로 넘치지 않는다', async ({ page }) => { + await page.setViewportSize({ width: 390, height: 844 }); + await page.goto('/'); + await expect(page.locator('#mobile_menu_toggle')).toBeVisible({ timeout: 15_000 }); + + expect(await docOverflow(page)).toBe(0); + expect(await overflowingElements(page)).toEqual([]); + }); + + test('헤더 우측 그룹에 언어/통화 셀렉터가 없다', async ({ page }) => { + await page.setViewportSize({ width: 390, height: 844 }); + await page.goto('/'); + await expect(page.locator('#mobile_header_right')).toBeVisible({ timeout: 15_000 }); + + await expect(page.locator('#mobile_header_right #mobile_lang_selector_wrap')).toHaveCount(0); + await expect(page.locator('#mobile_header_right #mobile_currency_selector_wrap')).toHaveCount(0); + }); + + test('언어/통화는 드로어 안에 가로 칩으로 나열되고 비회원도 볼 수 있다', async ({ page }) => { + await page.setViewportSize({ width: 390, height: 844 }); + await page.goto('/'); + await page.locator('#mobile_menu_toggle').click(); + + const prefs = page.locator('#mobile_drawer_prefs'); + await expect(prefs).toBeVisible(); + + // 언어 칩: 여러 로케일이 한 줄에 나열 (iteration 이 Button 에 걸려 있어야 함) + const langChips = prefs.locator('button[role="option"]:not(#mobile_drawer_currency_wrap button)'); + expect(await langChips.count()).toBeGreaterThan(0); + + // 통화 슬롯: 이커머스 모듈 주입 + id 스코프 + const currencyRoot = page.locator('#mobile_drawer_currency_wrap [id^="ext_header_currency_selector"]'); + await expect(currencyRoot).toBeVisible(); + + // portable 오버라이드 — 트리거는 숨고 패널은 펼쳐진 정적 목록 + await expect(currencyRoot.locator('button[aria-haspopup="listbox"]')).toBeHidden(); + const panel = currencyRoot.locator('[role="listbox"]'); + await expect(panel).toBeVisible(); + await expect(panel).toHaveClass(/\bstatic\b/); + + // 모든 옵션이 칩(rounded-full) 이고 뷰포트를 넘지 않는다 + const chips = currencyRoot.locator('button[role="option"]'); + const n = await chips.count(); + expect(n).toBeGreaterThan(0); + for (let i = 0; i < n; i += 1) { + await expect(chips.nth(i)).toHaveClass(/rounded-full/); + } + expect(await docOverflow(page)).toBe(0); + }); + + test('320px 에서도 햄버거 버튼을 누를 수 있다 (내비게이션 접근성)', async ({ page }) => { + await page.setViewportSize({ width: 320, height: 844 }); + await page.goto('/'); + + const toggle = page.locator('#mobile_menu_toggle'); + // toBeInViewport 는 요소 존재를 기다리지 않는다(기본 5s 안에 하이드레이션이 끝나지 않으면 + // element(s) not found). 병렬 워커 부하에서 플레이키했으므로 먼저 가시성을 기다린다. + await expect(toggle).toBeVisible({ timeout: 15_000 }); + await expect(toggle).toBeInViewport(); + expect(await docOverflow(page)).toBe(0); + + await toggle.click(); + await expect(page.locator('#mobile_drawer_prefs')).toBeVisible(); + expect(await docOverflow(page)).toBe(0); + }); +}); + +test.describe('데스크톱 회귀 방지 (1280px)', () => { + test('헤더 통화 셀렉터는 여전히 absolute 드롭다운이다', async ({ page }) => { + await page.setViewportSize({ width: 1280, height: 900 }); + await page.goto('/'); + + const root = page.locator('#ext_header_currency_selector__header_currency_slot_desktop'); + const trigger = root.locator('button[aria-haspopup="listbox"]'); + await expect(trigger).toBeVisible({ timeout: 15_000 }); + + await trigger.click(); + const panel = root.locator('[role="listbox"]'); + await expect(panel).toBeVisible(); + await expect(panel).toHaveClass(/\babsolute\b/); + await expect(panel).toHaveClass(/\bz-50\b/); + + // 세로 목록 — 칩이 아니다 + const options = panel.locator('button[role="option"]'); + expect(await options.count()).toBeGreaterThan(0); + await expect(options.first()).not.toHaveClass(/rounded-full/); + + expect(await docOverflow(page)).toBe(0); + }); +}); + +test.describe('비회원 폼/칩 (390px)', () => { + test('게시판 글쓰기폼의 이름/비밀번호가 세로로 쌓인다', async ({ page }) => { + await page.setViewportSize({ width: 390, height: 844 }); + await page.goto('/board/free/write'); + + const pw = page.locator('input[type="password"]').first(); + await expect(pw).toBeVisible({ timeout: 15_000 }); + + // 압착(147px) 이 아니라 전체폭에 가까워야 한다 + const box = await pw.boundingBox(); + expect(box!.width).toBeGreaterThan(250); + expect(await docOverflow(page)).toBe(0); + }); + + test('상품 상세의 쿠폰 칩 라벨이 한 줄을 유지한다', async ({ page }) => { + await page.setViewportSize({ width: 390, height: 844 }); + await page.goto('/shop/products/105'); + + // 쿠폰 칩 라벨은 whitespace-nowrap Span. 상품에 다운로드 가능 쿠폰이 없으면 렌더되지 않는다. + const labels = page.locator('button span.whitespace-nowrap'); + await page.waitForLoadState('networkidle'); + const count = await labels.count(); + test.skip(count === 0, '이 상품에 다운로드 가능한 쿠폰이 없다'); + + for (let i = 0; i < count; i += 1) { + const lines = await labels.nth(i).evaluate((el) => { + const lh = parseFloat(getComputedStyle(el).lineHeight) || 16; + return Math.max(1, Math.round(el.getBoundingClientRect().height / lh)); + }); + expect(lines).toBe(1); + } + + // 칩 컨테이너는 가로 스크롤이 아니라 줄바꿈으로 흘린다. + // (컨테이너 > [ticket Icon, iteration Div ×N, 더보기 Button] > Button > Span 구조라 + // DOM 깊이가 가변적이므로 조상 체인을 올라가며 flex 컨테이너를 찾는다) + const containerInfo = await labels.first().evaluate((el) => { + // 칩 Button 자신도 inline-flex 이므로, wrap 을 켠 첫 조상(=칩 컨테이너)까지 올라간다 + let n: HTMLElement | null = el.parentElement; + while (n && n !== document.body) { + const cs = getComputedStyle(n); + if (cs.flexWrap === 'wrap') { + return { flexWrap: cs.flexWrap, overflowX: cs.overflowX }; + } + n = n.parentElement; + } + return null; + }); + expect(containerInfo).not.toBeNull(); + expect(containerInfo!.overflowX).not.toBe('auto'); + + expect(await docOverflow(page)).toBe(0); + }); +}); From 0ff4b674ac601eb51ec089f818f692044baeede6 Mon Sep 17 00:00:00 2001 From: HeuJung Date: Fri, 10 Jul 2026 10:18:49 +0900 Subject: [PATCH 2/6] =?UTF-8?q?fix(sirsoft-basic,=20sirsoft-admin=5Fbasic)?= =?UTF-8?q?:=20=EB=AA=A8=EB=B0=94=EC=9D=BC=20=EB=93=9C=EB=A1=9C=EC=96=B4?= =?UTF-8?q?=20=EC=84=A0=ED=98=B8=EC=84=A4=EC=A0=95=20=EC=95=84=EC=BD=94?= =?UTF-8?q?=EB=94=94=EC=96=B8=ED=99=94=20=EB=B0=8F=20=EB=B7=B0=ED=8F=AC?= =?UTF-8?q?=ED=8A=B8=20=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 모바일 헤더 우측 그룹이 420px 를 요구해 폰 뷰포트에서 통화 선택기가 잘렸다. 언어·통화·배송국가를 드로어로 옮겨 가로 칩으로 통일했으나, 이번엔 드로어가 세로로 길어져 정작 메뉴가 스크롤 밖으로 밀렸다. 언어와 통화·배송국가를 각각 독립 아코디언(기본 접힘)으로 바꾸고, 접힘 상태에서도 트리거에 현재 선택값을 요약 표기해 펼치지 않고 확인할 수 있게 했다. 언어는 템플릿이, 통화·배송국가는 이커머스 주입 조각이 각자 상태를 소유해 서로 간섭하지 않는다. 통화 패널은 새 플래그를 만들지 않고 데스크톱 드롭다운의 기존 토글을 재사용한다 — portable 오버라이드에서 if 를 생략하면 엔진이 base if 를 상속하므로 자동으로 기본 접힘이 된다. 이 과정에서 모바일로 펼칠 때 전체 화면 배경 오버레이가 드로어 클릭을 가로채는 결함을 함께 차단했다. 그 밖에 모달 좌우 여백, 주문 취소·일괄변경 팝업의 세로 스택 전환, 은행 관리 입력칸 축소, 쇼핑몰 환경설정·쿠폰·엑셀 다운로드 화면의 가로 넘침을 함께 해소했다. --- .../CHANGELOG.md | 6 + .../frontend/partial/editor.json | 4 +- .../language-pack.json | 2 +- .../_bundled/sirsoft-ecommerce/CHANGELOG.md | 11 +- .../header-currency-selector-admin.json | 128 ++++++- .../header-currency-selector-user.json | 57 +++- ...minHeaderCurrencySelectorPortable.test.tsx | 134 ++++++++ .../adminMobileViewportOverflow.test.tsx | 247 ++++++++++++++ .../layouts/shippingCountryLayouts.test.tsx | 41 ++- .../admin_ecommerce_excel_download_index.json | 45 +-- .../admin/admin_ecommerce_settings.json | 5 +- .../_modal_batch_change_confirm.json | 98 +++++- .../_modal_cancel_order.json | 104 +++++- .../_partial_issue_settings.json | 27 +- .../_bank_management_modal.json | 7 +- .../_tab_basic_info.json | 24 ++ .../_modal_extra_fee_template.json | 3 +- .../_bundled/sirsoft-admin_basic/CHANGELOG.md | 19 ++ .../admin-auth-setlocale-target.test.tsx | 77 +++++ .../admin-base-header-lang-currency.test.tsx | 158 +++++++-- .../admin-mobile-viewport-css.test.tsx | 59 ++++ .../editor-spec-sidebar-open-state.test.tsx | 67 ++++ .../dist/css/components.css | 2 +- .../dist/js/components.iife.js | 116 +++---- .../dist/js/components.iife.js.map | 2 +- .../dist/src/handlers/index.d.ts | 2 - .../dist/src/handlers/setLocaleHandler.d.ts | 16 - .../editor-spec/states.json | 23 ++ .../lang/partial/en/editor.json | 2 + .../lang/partial/ko/editor.json | 2 + .../layouts/_admin_base.json | 150 ++++++-- .../layouts/admin_forgot_password.json | 4 +- .../layouts/admin_login.json | 4 +- .../layouts/admin_reset_password.json | 4 +- .../sirsoft-admin_basic/package-lock.json | 4 +- .../_bundled/sirsoft-admin_basic/package.json | 2 +- .../src/components/composite/HtmlEditor.tsx | 3 +- .../composite/MultilingualInput.tsx | 3 +- .../__tests__/setLocaleHandler.test.ts | 286 ---------------- .../sirsoft-admin_basic/src/handlers/index.ts | 5 +- .../src/handlers/setLocaleHandler.ts | 70 ---- .../sirsoft-admin_basic/src/styles/main.css | 21 +- .../sirsoft-admin_basic/template.json | 2 +- .../fixtures/admin-template-auth.ts | 5 + .../admin/mobile-viewport-overflow.spec.ts | 323 ++++++++++++++++++ templates/_bundled/sirsoft-basic/CHANGELOG.md | 1 + .../layouts/currencySelector.test.tsx | 124 ++++++- .../sirsoft-basic/layouts/_user_base.json | 66 +++- .../specs/mobile-viewport-overflow.spec.ts | 92 ++++- 49 files changed, 2048 insertions(+), 609 deletions(-) create mode 100644 modules/_bundled/sirsoft-ecommerce/resources/js/__tests__/layouts/adminHeaderCurrencySelectorPortable.test.tsx create mode 100644 modules/_bundled/sirsoft-ecommerce/resources/js/__tests__/layouts/adminMobileViewportOverflow.test.tsx create mode 100644 templates/_bundled/sirsoft-admin_basic/__tests__/layouts/admin-auth-setlocale-target.test.tsx create mode 100644 templates/_bundled/sirsoft-admin_basic/__tests__/layouts/admin-mobile-viewport-css.test.tsx create mode 100644 templates/_bundled/sirsoft-admin_basic/__tests__/layouts/editor-spec-sidebar-open-state.test.tsx delete mode 100644 templates/_bundled/sirsoft-admin_basic/dist/src/handlers/setLocaleHandler.d.ts delete mode 100644 templates/_bundled/sirsoft-admin_basic/src/handlers/__tests__/setLocaleHandler.test.ts delete mode 100644 templates/_bundled/sirsoft-admin_basic/src/handlers/setLocaleHandler.ts create mode 100644 templates/_bundled/sirsoft-admin_basic/tests/Playwright/specs/admin/mobile-viewport-overflow.spec.ts diff --git a/lang-packs/_bundled/g7-template-sirsoft-admin_basic-ja/CHANGELOG.md b/lang-packs/_bundled/g7-template-sirsoft-admin_basic-ja/CHANGELOG.md index 32eb5df4..36adde52 100644 --- a/lang-packs/_bundled/g7-template-sirsoft-admin_basic-ja/CHANGELOG.md +++ b/lang-packs/_bundled/g7-template-sirsoft-admin_basic-ja/CHANGELOG.md @@ -4,6 +4,12 @@ 형식은 [Keep a Changelog](https://keepachangelog.com/ko/1.1.0/)를 따르며, [Semantic Versioning](https://semver.org/lang/ko/)을 준수합니다. +## [1.0.2] - 2026-07-10 + +### Added + +- 레이아웃 편집기의 페이지 상태 선택 항목(기본 / 모바일 메뉴 펼침) 일본어 번역 추가 — 관리자 베이스 레이아웃을 편집할 때 모바일 메뉴가 펼쳐진 상태를 미리 보며 편집할 수 있고, 그 선택지가 일본어 로케일에서도 올바르게 표시됩니다. + ## [1.0.1] - 2026-07-08 ### Added diff --git a/lang-packs/_bundled/g7-template-sirsoft-admin_basic-ja/frontend/partial/editor.json b/lang-packs/_bundled/g7-template-sirsoft-admin_basic-ja/frontend/partial/editor.json index 968f8074..68e0fe21 100644 --- a/lang-packs/_bundled/g7-template-sirsoft-admin_basic-ja/frontend/partial/editor.json +++ b/lang-packs/_bundled/g7-template-sirsoft-admin_basic-ja/frontend/partial/editor.json @@ -1393,7 +1393,9 @@ "page_detail_default": "基本", "page_detail_attachments_open": "添付を展開", "order_detail_default": "通常注文", - "order_detail_partially_cancelled": "部分キャンセル" + "order_detail_partially_cancelled": "部分キャンセル", + "admin_base_default": "基本", + "sidebar_open": "モバイルメニュー展開" }, "cell_border": { "side_all": "すべて", diff --git a/lang-packs/_bundled/g7-template-sirsoft-admin_basic-ja/language-pack.json b/lang-packs/_bundled/g7-template-sirsoft-admin_basic-ja/language-pack.json index fd8cc968..20e88edb 100644 --- a/lang-packs/_bundled/g7-template-sirsoft-admin_basic-ja/language-pack.json +++ b/lang-packs/_bundled/g7-template-sirsoft-admin_basic-ja/language-pack.json @@ -12,7 +12,7 @@ "en": "G7 template (sirsoft-admin_basic) Japanese language pack (bundled)", "ja": "G7 テンプレート (sirsoft-admin_basic) 日本語 言語パック(バンドル)" }, - "version": "1.0.1", + "version": "1.0.2", "license": "MIT", "scope": "template", "target_identifier": "sirsoft-admin_basic", diff --git a/modules/_bundled/sirsoft-ecommerce/CHANGELOG.md b/modules/_bundled/sirsoft-ecommerce/CHANGELOG.md index 080efa7d..57f3eb09 100644 --- a/modules/_bundled/sirsoft-ecommerce/CHANGELOG.md +++ b/modules/_bundled/sirsoft-ecommerce/CHANGELOG.md @@ -8,7 +8,16 @@ ### Changed -- 휴대폰·태블릿 화면에서 통화·배송국가 선택이 드롭다운 대신 항상 펼쳐진 가로 버튼으로 표시됩니다. 좁은 화면의 메뉴 안에서 드롭다운이 잘려 보이던 문제가 함께 해소됩니다. 데스크톱 화면의 드롭다운은 그대로입니다. +- 휴대폰·태블릿 화면에서 통화·배송국가 선택이 메뉴 안의 접었다 펼치는 항목으로 바뀌었습니다. 접혀 있을 때도 현재 선택된 통화와 배송국가가 함께 표시되어 펼치지 않아도 확인할 수 있고, 펼치면 가로 버튼으로 나열됩니다. 좁은 화면의 메뉴 안에서 드롭다운이 잘려 보이던 문제가 함께 해소됩니다. 데스크톱 화면의 드롭다운은 그대로입니다. 관리자 화면도 동일하게 적용됩니다. +- 휴대폰 화면에서 주문 취소·주문상태 일괄변경 팝업의 상품 목록이 표 대신 상품별 카드 형태로 표시됩니다. + +### Fixed + +- 쇼핑몰 환경설정의 은행 관리에서 은행코드를 입력해도 입력한 값이 보이지 않던 문제를 수정했습니다 — 좁은 화면에서 입력칸이 글자가 들어갈 수 없을 만큼 줄어들고 있었습니다. +- 휴대폰 화면에서 주문 취소·주문상태 일괄변경 팝업의 금액이 "249,000원" 대신 "249,000" / "원" 처럼 숫자 중간에서 잘려 보이던 문제를 수정했습니다. 금액은 앞으로도 숫자 중간에서 줄바꿈되지 않으며, "결제완료" 같은 상태 이름도 "결제완" / "료" 로 쪼개지지 않습니다. +- 휴대폰 화면에서 쇼핑몰 환경설정 화면이 좌우로 넘쳐 가로 스크롤이 생기던 문제를 수정했습니다 (이메일 입력 줄, 쇼핑몰 이름·종목 입력칸, 탭 영역). +- 휴대폰 화면에서 쿠폰 발급기간 입력칸과 엑셀 다운로드 기간 검색 입력칸이 화면 밖으로 넘치던 문제를 수정했습니다. +- 은행 관리·도서산간 배송비 팝업의 표가 좁은 화면에서 가로로 스크롤되도록 명시해, 앞으로 표가 잘려 보이지 않도록 했습니다. ## [1.0.1] - 2026-07-08 diff --git a/modules/_bundled/sirsoft-ecommerce/resources/extensions/header-currency-selector-admin.json b/modules/_bundled/sirsoft-ecommerce/resources/extensions/header-currency-selector-admin.json index 69277391..d258f85d 100644 --- a/modules/_bundled/sirsoft-ecommerce/resources/extensions/header-currency-selector-admin.json +++ b/modules/_bundled/sirsoft-ecommerce/resources/extensions/header-currency-selector-admin.json @@ -44,8 +44,15 @@ "name": "Div", "slot": "header_currency", "props": { "className": "relative {{(_global.availableCurrencies ?? []).length > 0 || ((_global.availableShippingCountries ?? []).length > 1 && _global.modules?.['sirsoft-ecommerce']?.shipping?.international_shipping_enabled === true) ? '' : 'hidden'}}" }, + "responsive": { + "portable": { + "comment": "portable 에서는 이 조각이 관리자 템플릿 모바일 드로어(admin_drawer_prefs, 세로 블록) 안에 렌더된다. 펼친 목록이 컨테이너 폭을 채우도록 w-full. hidden 게이트 표현식은 그대로 유지(props 얕은 머지가 아니라 className 통째 교체이므로 표현식을 복제해야 함).", + "props": { "className": "relative w-full {{(_global.availableCurrencies ?? []).length > 0 || ((_global.availableShippingCountries ?? []).length > 1 && _global.modules?.['sirsoft-ecommerce']?.shipping?.international_shipping_enabled === true) ? '' : 'hidden'}}" } + } + }, "children": [ { + "comment": "트리거 버튼 — 데스크톱은 absolute 드롭다운의 토글, portable(드로어 안)에서는 접기/펼치기 아코디언의 트리거. 두 경우 모두 같은 플래그(_local.showCurrencyDropdown)를 토글하므로 기본은 접힘이다. portable 에서는 드로어 폭을 꽉 채우는 행 형태(좌: '통화' 라벨, 우: 현재 통화·배송국가 요약 + chevron)로 바뀐다.", "type": "basic", "name": "Button", "props": { @@ -54,6 +61,55 @@ "aria-expanded": "{{_local.showCurrencyDropdown ?? false}}", "aria-label": "$t:sirsoft-ecommerce.common.currency_label" }, + "responsive": { + "portable": { + "comment": "드로어 안에서는 언어 아코디언 트리거와 동일한 형태 — children 을 통째 교체해 '통화' 라벨 + 현재값 요약 + chevron 으로 구성한다(엔진은 responsive.children 을 완전 교체한다).", + "props": { + "className": "w-full flex items-center justify-between py-1 cursor-pointer", + "aria-haspopup": "listbox", + "aria-expanded": "{{_local.showCurrencyDropdown ?? false}}", + "aria-label": "$t:sirsoft-ecommerce.common.currency_label" + }, + "children": [ + { + "type": "basic", + "name": "Span", + "props": { "className": "text-xs font-medium text-gray-500 dark:text-gray-400 uppercase" }, + "text": "$t:sirsoft-ecommerce.common.currency_label" + }, + { + "type": "basic", + "name": "Span", + "props": { "className": "flex items-center gap-1.5 text-sm text-gray-700 dark:text-gray-300" }, + "children": [ + { + "comment": "접힘 상태 요약 ① 현재 통화 코드", + "type": "basic", + "name": "Span", + "props": { "className": "font-medium" }, + "text": "{{_global.preferredCurrency ?? _global.modules?.['sirsoft-ecommerce']?.language_currency?.default_currency ?? 'KRW'}}" + }, + { + "comment": "접힘 상태 요약 ② 현재 배송국가명 (해외배송 활성 + 국가 2개 이상일 때만).", + "type": "basic", + "name": "Span", + "if": "{{(_global.availableShippingCountries ?? []).length > 1 && _global.modules?.['sirsoft-ecommerce']?.shipping?.international_shipping_enabled === true}}", + "props": { "className": "text-gray-500 dark:text-gray-400" }, + "text": "· {{(_global.availableShippingCountries ?? []).find(c => c.code === (_global.preferredShippingCountry ?? _global.modules?.['sirsoft-ecommerce']?.shipping?.default_country ?? 'KR'))?.name ?? (_global.preferredShippingCountry ?? 'KR')}}" + }, + { + "type": "basic", + "name": "Icon", + "props": { + "name": "chevron-down", + "className": "{{_local.showCurrencyDropdown ? 'rotate-180' : ''}} text-xs text-gray-400 dark:text-gray-500 transition-transform duration-200" + } + } + ] + } + ] + } + }, "children": [ { "comment": "트리거 배송국가 코드 (해외배송 활성 시) — 관리자 헤더는 flag 없이 코드 병기", @@ -76,7 +132,7 @@ ] }, { - "comment": "드롭다운 메뉴", + "comment": "드롭다운 메뉴 (통화 + 배송국가 2섹션). portable(0~1023px) 에서는 absolute 팝오버가 드로어 스크롤 경계에서 잘리므로 static 인라인 목록으로 전환한다. 표시 여부는 데스크톱과 동일하게 _local.showCurrencyDropdown 이 결정한다(responsive 에 if 를 두지 않으면 base if 를 그대로 상속) → 기본 접힘.", "type": "basic", "name": "Div", "if": "{{_local.showCurrencyDropdown}}", @@ -84,13 +140,34 @@ "className": "absolute right-0 top-full mt-2 w-44 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-lg z-50 py-1 overflow-hidden", "role": "listbox" }, + "responsive": { + "portable": { + "comment": "드로어 안에서는 패널이 곧 본문이므로 카드 크롬(테두리/배경/좌우 패딩)을 벗긴다. 크롬을 남기면 드로어 패딩 안에 패딩이 중첩되어 칩 가용폭이 199px 로 줄고, 같은 드로어의 언어 칩(224px)과 줄바꿈 위치가 어긋난다.", + "props": { + "className": "static w-full mt-2 bg-transparent border-0 shadow-none py-0", + "role": "listbox" + } + } + }, "children": [ { + "comment": "섹션 라벨 '통화'. portable 에서는 아코디언 트리거 행이 이미 '통화' 라벨을 달고 있어 중복이므로 숨긴다(배송국가 라벨은 두 번째 섹션을 구분해야 하므로 유지).", "type": "basic", "name": "Div", "props": { "className": "px-4 py-1.5 text-xs font-semibold text-gray-400 dark:text-gray-500 uppercase tracking-wide" }, + "responsive": { "portable": { "if": "{{false}}" } }, "text": "$t:sirsoft-ecommerce.common.currency_label" }, + { + "comment": "옵션 래퍼. portable 에서만 가로 칩 나열(flex-wrap). 데스크톱은 무클래스 블록이라 기존 세로 목록 그대로. iteration 은 아래 Div 자신에 걸려 있어 항목 수만큼 복제되므로, 복제본들이 이 래퍼의 flex item 이 된다.", + "type": "basic", + "name": "Div", + "responsive": { + "portable": { + "props": { "className": "flex flex-wrap gap-2 pb-1" } + } + }, + "children": [ { "type": "basic", "name": "Div", @@ -104,21 +181,33 @@ "role": "option", "aria-selected": "{{_global.preferredCurrency === currency.code}}" }, + "responsive": { + "portable": { + "props": { + "className": "inline-flex items-center gap-1.5 px-3 py-1.5 text-sm border rounded-full cursor-pointer whitespace-nowrap transition-colors {{_global.preferredCurrency === currency.code ? 'bg-blue-50 dark:bg-blue-900/20 text-blue-600 dark:text-blue-400 border-blue-200 dark:border-blue-800' : 'text-gray-700 dark:text-gray-300 border-gray-200 dark:border-gray-600 hover:bg-gray-100 dark:hover:bg-gray-700'}}", + "role": "option", + "aria-selected": "{{_global.preferredCurrency === currency.code}}" + } + } + }, "children": [ { "type": "basic", "name": "Span", "props": { "className": "text-base" }, "text": "{{currency.flag}}" }, { "type": "basic", "name": "Span", "props": { "className": "flex-1" }, + "responsive": { "portable": { "props": { "className": "" } } }, "children": [ { "type": "basic", "name": "Span", "props": { "className": "font-medium" }, "text": "{{currency.code}}" }, { "type": "basic", "name": "Span", "props": { "className": "text-gray-500 dark:text-gray-400 ml-1" }, "text": "({{currency.symbol}})" } ] }, { + "comment": "portable(칩 나열)에서는 선택 상태가 배경/테두리 색으로 이미 표현되고 aria-selected 로도 전달되므로, 칩 폭을 아끼려 체크 아이콘을 숨긴다.", "type": "basic", "name": "Icon", "if": "{{_global.preferredCurrency === currency.code}}", + "responsive": { "portable": { "if": "{{false}}" } }, "props": { "name": "check", "className": "text-base" } } ], @@ -135,6 +224,8 @@ ] } ] + } + ] }, { "comment": "── 구분선 ──", @@ -153,8 +244,19 @@ "type": "basic", "name": "Div", "props": { "className": "px-4 py-1.5 text-xs font-semibold text-gray-400 dark:text-gray-500 uppercase tracking-wide" }, + "responsive": { "portable": { "props": { "className": "py-1 text-xs font-medium text-gray-500 dark:text-gray-400 uppercase" } } }, "text": "$t:sirsoft-ecommerce.common.shipping_country_label" }, + { + "comment": "옵션 래퍼. portable 에서만 가로 칩 나열(flex-wrap). 데스크톱은 무클래스 블록.", + "type": "basic", + "name": "Div", + "responsive": { + "portable": { + "props": { "className": "flex flex-wrap gap-2 pb-1" } + } + }, + "children": [ { "type": "basic", "name": "Div", @@ -168,12 +270,29 @@ "role": "option", "aria-selected": "{{(_global.preferredShippingCountry ?? 'KR') === shipCountry.code}}" }, + "responsive": { + "portable": { + "props": { + "className": "inline-flex items-center gap-1.5 px-3 py-1.5 text-sm border rounded-full cursor-pointer whitespace-nowrap transition-colors {{(_global.preferredShippingCountry ?? 'KR') === shipCountry.code ? 'bg-blue-50 dark:bg-blue-900/20 text-blue-600 dark:text-blue-400 border-blue-200 dark:border-blue-800' : 'text-gray-700 dark:text-gray-300 border-gray-200 dark:border-gray-600 hover:bg-gray-100 dark:hover:bg-gray-700'}}", + "role": "option", + "aria-selected": "{{(_global.preferredShippingCountry ?? 'KR') === shipCountry.code}}" + } + } + }, "children": [ - { "type": "basic", "name": "Span", "props": { "className": "flex-1 font-medium" }, "text": "{{shipCountry.name ?? shipCountry.code}}" }, { + "type": "basic", + "name": "Span", + "props": { "className": "flex-1 font-medium" }, + "responsive": { "portable": { "props": { "className": "font-medium" } } }, + "text": "{{shipCountry.name ?? shipCountry.code}}" + }, + { + "comment": "portable(칩 나열)에서는 선택 상태를 배경/테두리 색 + aria-selected 로 전달하므로 체크 아이콘을 숨긴다.", "type": "basic", "name": "Icon", "if": "{{(_global.preferredShippingCountry ?? 'KR') === shipCountry.code}}", + "responsive": { "portable": { "if": "{{false}}" } }, "props": { "name": "check", "className": "text-base" } } ], @@ -191,15 +310,18 @@ } ] } + ] + } ] } ] }, { - "comment": "배경 클릭 시 닫기", + "comment": "배경 클릭 시 닫기 — 데스크톱 드롭다운 전용. portable 은 항상 펼친 칩 목록이라 백드롭이 불필요(있으면 화면 전체를 덮어 클릭을 가로챈다).", "type": "basic", "name": "Div", "if": "{{_local.showCurrencyDropdown}}", + "responsive": { "portable": { "if": "{{false}}" } }, "props": { "className": "fixed inset-0 z-40" }, "actions": [ { diff --git a/modules/_bundled/sirsoft-ecommerce/resources/extensions/header-currency-selector-user.json b/modules/_bundled/sirsoft-ecommerce/resources/extensions/header-currency-selector-user.json index 95967281..1e2dbf97 100644 --- a/modules/_bundled/sirsoft-ecommerce/resources/extensions/header-currency-selector-user.json +++ b/modules/_bundled/sirsoft-ecommerce/resources/extensions/header-currency-selector-user.json @@ -20,7 +20,7 @@ }, "children": [ { - "comment": "트리거 버튼 — 데스크톱 전용. 모바일/태블릿(portable)에서는 이 조각이 드로어(overflow-y-auto) 안에 렌더되어 absolute 드롭다운이 잘리므로, 트리거를 숨기고 패널을 항상 펼친다.", + "comment": "트리거 버튼 — 데스크톱은 absolute 드롭다운의 토글, portable(드로어 안)에서는 접기/펼치기 아코디언의 트리거. 두 경우 모두 같은 플래그(_local.showCurrencyDropdown)를 토글하므로 기본은 접힘이다. portable 에서는 드로어 폭을 꽉 채우는 행 형태(좌: '통화' 라벨, 우: 현재 통화·배송국가 요약 + chevron)로 바뀐다.", "type": "basic", "name": "Button", "props": { @@ -31,7 +31,51 @@ }, "responsive": { "portable": { - "props": { "className": "hidden" } + "comment": "드로어 안에서는 언어 아코디언 트리거와 동일한 형태 — children 을 통째 교체해 '통화' 라벨 + 현재값 요약 + chevron 으로 구성한다(엔진은 responsive.children 을 완전 교체한다).", + "props": { + "className": "w-full flex items-center justify-between py-1 cursor-pointer", + "aria-haspopup": "listbox", + "aria-expanded": "{{_local.showCurrencyDropdown ?? false}}", + "aria-label": "$t:sirsoft-ecommerce.common.currency_label" + }, + "children": [ + { + "type": "basic", + "name": "Span", + "props": { "className": "text-xs font-medium text-gray-500 dark:text-gray-400 uppercase" }, + "text": "$t:sirsoft-ecommerce.common.currency_label" + }, + { + "type": "basic", + "name": "Span", + "props": { "className": "flex items-center gap-1.5 text-sm text-gray-700 dark:text-gray-300" }, + "children": [ + { + "comment": "접힘 상태 요약 ① 현재 통화 코드", + "type": "basic", + "name": "Span", + "props": { "className": "font-medium" }, + "text": "{{_global.preferredCurrency ?? _global.defaultCurrency ?? 'KRW'}}" + }, + { + "comment": "접힘 상태 요약 ② 현재 배송국가명 (해외배송 활성 + 국가 2개 이상일 때만). 통화와 시각적으로 구분되도록 옅은 색.", + "type": "basic", + "name": "Span", + "if": "{{(_global.availableShippingCountries ?? []).length > 1 && _global.modules?.['sirsoft-ecommerce']?.shipping?.international_shipping_enabled === true}}", + "props": { "className": "text-gray-500 dark:text-gray-400" }, + "text": "· {{(_global.availableShippingCountries ?? []).find(c => c.code === (_global.preferredShippingCountry ?? _global.modules?.['sirsoft-ecommerce']?.shipping?.default_country ?? 'KR'))?.name ?? (_global.preferredShippingCountry ?? 'KR')}}" + }, + { + "type": "basic", + "name": "Icon", + "props": { + "name": "chevron-down", + "className": "{{_local.showCurrencyDropdown ? 'rotate-180' : ''}} text-xs text-gray-400 dark:text-gray-500 transition-transform duration-200" + } + } + ] + } + ] } }, "children": [ @@ -56,7 +100,7 @@ ] }, { - "comment": "드롭다운 메뉴 (통화 + 배송국가 2섹션). portable(0~1023px) 에서는 트리거 없이 항상 펼쳐진 정적 목록 — 드로어 스크롤 경계에서 absolute 패널이 잘리는 문제 회피.", + "comment": "드롭다운 메뉴 (통화 + 배송국가 2섹션). portable(0~1023px) 에서는 absolute 팝오버가 드로어 스크롤 경계에서 잘리므로 static 인라인 목록으로 전환한다. 표시 여부는 데스크톱과 동일하게 _local.showCurrencyDropdown 이 결정한다(responsive 에 if 를 두지 않으면 base if 를 그대로 상속) → 기본 접힘.", "type": "basic", "name": "Div", "if": "{{_local.showCurrencyDropdown}}", @@ -66,7 +110,6 @@ }, "responsive": { "portable": { - "if": "{{true}}", "props": { "className": "static w-full mt-2 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg py-1", "role": "listbox" @@ -81,10 +124,11 @@ "if": "{{(_global.availableCurrencies ?? []).length > 0}}", "children": [ { + "comment": "섹션 라벨 '통화'. portable 에서는 아코디언 트리거 행이 이미 '통화' 라벨을 달고 있어 중복이므로 숨긴다(배송국가 라벨은 두 번째 섹션을 구분해야 하므로 유지).", "type": "basic", "name": "Div", "props": { "className": "px-4 py-1.5 text-xs font-semibold text-gray-400 dark:text-gray-500 uppercase tracking-wide" }, - "responsive": { "portable": { "props": { "className": "px-3 py-1 text-xs font-medium text-gray-500 dark:text-gray-400 uppercase" } } }, + "responsive": { "portable": { "if": "{{false}}" } }, "text": "$t:sirsoft-ecommerce.common.currency_label" }, { @@ -298,10 +342,11 @@ ] }, { - "comment": "배경 클릭 시 닫기", + "comment": "배경 클릭 시 닫기 — 데스크톱 팝오버 전용. portable 에서는 패널이 드로어 안 인라인 아코디언이라 배경 개념이 없다. 여기서 if 를 끄지 않으면 모바일에서 펼치는 순간 fixed inset-0 오버레이가 드로어 전체를 덮어 모든 클릭을 가로챈다.", "type": "basic", "name": "Div", "if": "{{_local.showCurrencyDropdown}}", + "responsive": { "portable": { "if": "{{false}}" } }, "props": { "className": "fixed inset-0 z-40" }, "actions": [ { diff --git a/modules/_bundled/sirsoft-ecommerce/resources/js/__tests__/layouts/adminHeaderCurrencySelectorPortable.test.tsx b/modules/_bundled/sirsoft-ecommerce/resources/js/__tests__/layouts/adminHeaderCurrencySelectorPortable.test.tsx new file mode 100644 index 00000000..0d971302 --- /dev/null +++ b/modules/_bundled/sirsoft-ecommerce/resources/js/__tests__/layouts/adminHeaderCurrencySelectorPortable.test.tsx @@ -0,0 +1,134 @@ +/** + * @file adminHeaderCurrencySelectorPortable.test.tsx + * @description 관리자 헤더 통화/배송국가 주입 조각의 portable(모바일·태블릿) 칩 전환 회귀 테스트 + * + * 배경: 관리자 모바일 헤더 우측 그룹이 420px 를 요구해 폰 뷰포트에서 통화 셀렉터가 잘렸다. + * 템플릿이 통화 슬롯을 모바일 드로어(`admin_drawer_prefs`)로 옮겼고, 이 조각은 드로어 안에서 + * 접기/펼치기 아코디언(트리거 행 + static 가로 칩 목록)으로 렌더된다(사용자 조각 + * `header-currency-selector-user` 와 동일 사상). + * + * 접힘이 기본이며, 표시 여부는 데스크톱과 같은 `_local.showCurrencyDropdown` 이 결정한다 — + * portable 오버라이드에 `if` 를 두지 않으면 엔진이 base `if` 를 상속하기 때문(`override.if ?? baseDef.if`). + * 데스크톱(≥1024px)은 기존 absolute 드롭다운을 그대로 유지해야 한다. + * + * @vitest-environment jsdom + */ + +import { describe, it, expect } from 'vitest'; +import fs from 'node:fs'; +import path from 'node:path'; + +const fragmentPath = path.resolve( + __dirname, + '../../../extensions/header-currency-selector-admin.json', +); + +const fragment = JSON.parse(fs.readFileSync(fragmentPath, 'utf8')); +const root = fragment.injections[0].components[0]; +const [trigger, panel, backdrop] = root.children; + +describe('관리자 통화 주입 조각 — portable 칩 전환', () => { + it('데스크톱 기본 경로는 absolute 드롭다운을 유지한다 (회귀 방지)', () => { + expect(root.props.className).toContain('relative'); + expect(root.props.className).not.toContain('w-full'); + + expect(panel.props.className).toContain('absolute'); + expect(panel.props.className).toContain('z-50'); + expect(panel.props.className).toContain('w-44'); + expect(panel.if).toBe('{{_local.showCurrencyDropdown}}'); + }); + + it('portable 에서 루트가 w-full 이 되고 hidden 게이트 표현식이 보존된다', () => { + const cls = root.responsive.portable.props.className; + expect(cls).toContain('w-full'); + // props 는 얕은 머지가 아니라 className 통째 교체이므로 표현식을 복제해야 한다. + expect(cls).toContain('availableCurrencies'); + expect(cls).toContain('international_shipping_enabled'); + }); + + it('portable 트리거는 아코디언 행이 되고 접힘 상태 요약(통화·배송국가)을 노출한다', () => { + expect(trigger.name).toBe('Button'); + + const t = trigger.responsive.portable; + // 더 이상 숨기지 않는다 — 드로어 폭을 채우는 트리거 행 + expect(t.props.className).not.toBe('hidden'); + expect(t.props.className).toContain('w-full'); + expect(t.props.className).toContain('justify-between'); + // 얕은 머지가 아니라 통째 교체이므로 aria-* 를 오버라이드에도 명시 + expect(t.props['aria-expanded']).toBe('{{_local.showCurrencyDropdown ?? false}}'); + + // 접힘 상태에서 현재 값을 알 수 있어야 한다 + const summary = JSON.stringify(t.children); + expect(summary).toContain('preferredCurrency'); + expect(summary).toContain('preferredShippingCountry'); + expect(summary).toContain('chevron-down'); + expect(summary).toContain("{{_local.showCurrencyDropdown ? 'rotate-180' : ''}}"); + }); + + it('portable 패널도 _local.showCurrencyDropdown 으로 게이트된다 (기본 접힘)', () => { + const p = panel.responsive.portable; + // 핵심: `{{true}}` 로 강제하면 드로어에서 항상 펼쳐져 아코디언이 성립하지 않는다. + // if 를 생략해야 base if 를 상속한다. + expect(p.if).toBeUndefined(); + expect(p.props.className).toContain('static'); + expect(p.props.className).not.toContain('absolute'); + expect(p.props.className).not.toContain('z-50'); + // 얕은 머지라 role 을 재선언하지 않으면 유실된다. + expect(p.props.role).toBe('listbox'); + }); + + it('portable 백드롭은 렌더되지 않는다 (fixed inset-0 이 드로어 전체 클릭을 가로챈다)', () => { + expect(backdrop.props.className).toContain('fixed'); + expect(backdrop.responsive.portable.if).toBe('{{false}}'); + }); + + it('칩 래퍼는 정적이고 iteration 은 그 자식에 걸린다', () => { + // 엔진은 iteration 을 가진 노드를 항목 수만큼 복제한다. flex 컨테이너에 걸면 + // 컨테이너가 복제되어 칩이 세로로 쌓인다. + const wrappers = panel.children.filter( + (c: any) => c.responsive?.portable?.props?.className?.includes('flex-wrap'), + ); + // 통화 섹션 래퍼 1 + 배송국가 섹션 래퍼 1 + const shippingSection = panel.children.find( + (c: any) => c.comment?.includes('배송국가 섹션'), + ); + const shippingWrapper = shippingSection.children.find( + (c: any) => c.responsive?.portable?.props?.className?.includes('flex-wrap'), + ); + + expect(wrappers.length).toBe(1); // 통화 섹션은 panel 직계 + expect(shippingWrapper).toBeTruthy(); + + for (const wrapper of [wrappers[0], shippingWrapper]) { + expect(wrapper.iteration).toBeUndefined(); + const iterating = wrapper.children[0]; + expect(iterating.iteration).toBeTruthy(); + } + }); + + it('portable 옵션은 rounded-full 칩이고 체크 아이콘은 숨는다', () => { + const currencyWrapper = panel.children.find( + (c: any) => c.responsive?.portable?.props?.className?.includes('flex-wrap'), + ); + const button = currencyWrapper.children[0].children[0]; + + const chipCls = button.responsive.portable.props.className; + expect(chipCls).toContain('rounded-full'); + expect(chipCls).toContain('inline-flex'); + expect(chipCls).toContain('whitespace-nowrap'); + // 얕은 머지 — role/aria-selected 재선언 필수 + expect(button.responsive.portable.props.role).toBe('option'); + expect(button.responsive.portable.props['aria-selected']).toBeTruthy(); + + const check = button.children.find((c: any) => c.name === 'Icon'); + expect(check.responsive.portable.if).toBe('{{false}}'); + }); + + it('portable 패널은 드로어 안에서 카드 크롬을 벗는다 (언어 칩과 줄바꿈 정렬)', () => { + const cls = panel.responsive.portable.props.className; + // 크롬을 남기면 드로어 패딩 안에 패딩이 중첩되어 칩 가용폭이 줄고 언어 칩과 어긋난다. + expect(cls).toContain('bg-transparent'); + expect(cls).toContain('border-0'); + expect(cls).toContain('shadow-none'); + }); +}); diff --git a/modules/_bundled/sirsoft-ecommerce/resources/js/__tests__/layouts/adminMobileViewportOverflow.test.tsx b/modules/_bundled/sirsoft-ecommerce/resources/js/__tests__/layouts/adminMobileViewportOverflow.test.tsx new file mode 100644 index 00000000..9d0ff405 --- /dev/null +++ b/modules/_bundled/sirsoft-ecommerce/resources/js/__tests__/layouts/adminMobileViewportOverflow.test.tsx @@ -0,0 +1,247 @@ +/** + * @file adminMobileViewportOverflow.test.tsx + * @description 관리자 모바일 뷰포트 넘침/압착 회귀 테스트 (이커머스 소유분) + * + * 각 단언은 브라우저 실측(390px / 320px)으로 확인된 결함에 1:1 대응한다. + * 되돌리면 해당 결함이 그대로 재발하므로, 사유를 각 테스트에 남긴다. + * + * @vitest-environment jsdom + */ + +import { describe, it, expect } from 'vitest'; +import fs from 'node:fs'; +import path from 'node:path'; + +const layoutsDir = path.resolve(__dirname, '../../../layouts/admin'); + +const load = (rel: string): any => + JSON.parse(fs.readFileSync(path.resolve(layoutsDir, rel), 'utf8')); + +/** 트리 전체를 순회하며 술어를 만족하는 노드를 모은다. */ +function collect(node: any, pred: (n: any) => boolean, acc: any[] = []): any[] { + if (!node || typeof node !== 'object') return acc; + if (Array.isArray(node)) { + for (const n of node) collect(n, pred, acc); + return acc; + } + if (pred(node)) acc.push(node); + for (const v of Object.values(node)) { + if (v && typeof v === 'object') collect(v, pred, acc); + } + return acc; +} + +const cls = (n: any): string => { + const c = n?.props?.className; + return typeof c === 'string' ? c : ''; +}; + +describe('B1 — 모달 좌우 여백 (max-w-full 트랩)', () => { + // .modal-container 의 max-w-[calc(100vw-2rem)] 와 .max-w-full 은 명시도가 같고(0,1,0) + // 빌드 CSS 에서 .max-w-full 이 뒤에 정의되므로 승리한다. 레이아웃에서 max-w-full 을 + // 주면 clamp 가 무효화되어 모달이 화면 좌우에 붙는다(여백 0). + it.each([ + 'partials/admin_ecommerce_order_detail/_modal_cancel_order.json', + 'partials/admin_ecommerce_order_detail/_modal_batch_change_confirm.json', + ])('%s 는 max-w-full 을 갖지 않는다', (rel) => { + const raw = fs.readFileSync(path.resolve(layoutsDir, rel), 'utf8'); + expect(raw).not.toContain('max-w-full'); + }); +}); + +describe('B2 — 주문상세 모달 상품표 카드형 전환', () => { + it.each([ + ['_modal_cancel_order.json', 'partials/admin_ecommerce_order_detail/_modal_cancel_order.json'], + ['_modal_batch_change_confirm.json', 'partials/admin_ecommerce_order_detail/_modal_batch_change_confirm.json'], + ])('%s: grid-cols-12 행이 portable 에서 1열로 스택된다', (_n, rel) => { + const layout = load(rel); + const grids = collect(layout, (n) => cls(n).includes('grid-cols-12')); + + // 헤더 행 1 + 본문(iteration) 행 1 + expect(grids.length).toBe(2); + + const header = grids.find((g) => cls(g).includes('bg-gray-50')); + const body = grids.find((g) => !cls(g).includes('bg-gray-50')); + + // 카드형에서는 열 라벨 행이 의미 없다 → 미렌더 + expect(header.responsive?.portable?.if).toBe('{{false}}'); + + // 390px 에서 12열이면 1열 = 16.4px → `249,000원`(56px) 같은 토큰이 숫자 내부에서 쪼개진다. + expect(body.responsive?.portable?.props?.className).toContain('grid-cols-1'); + expect(body.responsive?.portable?.props?.className).not.toContain('grid-cols-12'); + }); + + it.each([ + 'partials/admin_ecommerce_order_detail/_modal_cancel_order.json', + 'partials/admin_ecommerce_order_detail/_modal_batch_change_confirm.json', + ])('%s: 모든 col-span 셀이 portable 에서 span 을 벗는다', (rel) => { + const layout = load(rel); + const spanCells = collect(layout, (n) => /col-span-\d+/.test(cls(n))); + expect(spanCells.length).toBeGreaterThan(0); + + for (const cell of spanCells) { + const portable = cell.responsive?.portable?.props?.className; + expect(portable).toBeDefined(); + // 1열 그리드에 col-span-5 가 남으면 암묵 열이 생겨 셀 폭이 들쭉날쭉해진다. + expect(portable).not.toMatch(/col-span-\d+/); + } + }); + + // 세로 스택으로 셀이 전폭(285px)이 되어 현재 데이터로는 절단이 없다(10억대 금액도 88px). + // 그러나 셀이 다시 좁아지면 즉시 재발하므로, 방어선을 코드에 선언해 둔다. + // 실측(16px 셀로 축소): + // - 금액 순수 토큰 + whitespace-nowrap → 1줄 유지, 숫자 내부 미분리 + // - `소계 249,000원`(한글+금액 혼합) + break-keep → `소계` / `249,000원` 2줄, 숫자 보존 + // (이 문자열에 nowrap 을 주면 셀을 65px 넘겨 더 나쁘다 — 그래서 break-keep) + it('금액(순수 숫자) 노드는 whitespace-nowrap 으로 숫자 내부 줄바꿈을 막는다', () => { + const cancel = load('partials/admin_ecommerce_order_detail/_modal_cancel_order.json'); + const batch = load('partials/admin_ecommerce_order_detail/_modal_batch_change_confirm.json'); + + const unitPrice = collect( + cancel, + (n) => typeof n.text === 'string' && n.text.includes('unit_price') && n.text.includes('원'), + )[0]; + expect(cls(unitPrice)).toContain('whitespace-nowrap'); + + const batchAmounts = collect( + batch, + (n) => typeof n.text === 'string' && /Number\(confirmItem\.(original_price|unit_price)\)/.test(n.text), + ); + expect(batchAmounts.length).toBe(2); + for (const node of batchAmounts) { + expect(cls(node)).toContain('whitespace-nowrap'); + } + }); + + it('한글 라벨 노드는 break-keep 으로 음절 경계 절단을 막는다', () => { + const cancel = load('partials/admin_ecommerce_order_detail/_modal_cancel_order.json'); + const batch = load('partials/admin_ecommerce_order_detail/_modal_batch_change_confirm.json'); + + // `소계 249,000원` — 한글 라벨 + 금액 혼합. nowrap 이 아니라 break-keep 이 정답. + const subtotal = collect( + cancel, + (n) => typeof n.text === 'string' && n.text.includes('product_subtotal'), + )[0]; + expect(cls(subtotal)).toContain('break-keep'); + expect(cls(subtotal)).not.toContain('whitespace-nowrap'); + + // 상태 배지 (`결제완료` → `결제완`/`료` 방지) + const cancelStatus = collect( + cancel, + (n) => typeof n.text === 'string' && n.text.includes('option_status_label'), + )[0]; + expect(cls(cancelStatus)).toContain('break-keep'); + + const batchStatus = collect( + batch, + (n) => typeof n.text === 'string' && n.text.includes('order.status.payment_complete'), + )[0]; + expect(cls(batchStatus)).toContain('break-keep'); + }); +}); + +describe('B3 — 은행 관리 모달', () => { + const rel = 'partials/admin_ecommerce_settings/_bank_management_modal.json'; + + it('은행코드 입력칸에 min-w-[80px] 하한이 있다', () => { + const layout = load(rel); + // 은행코드 input 은 code 오류 키를 참조하는 className 바인딩으로 식별한다. + const input = collect( + layout, + (n) => n.name === 'Input' && cls(n).includes("+ '.code'"), + )[0]; + + expect(input).toBeTruthy(); + // table-layout:auto + td{min-width:0} 이라 좁은 뷰포트에서 input 이 24px(=좌우 padding)로 + // 압착되어 텍스트 영역이 0px 이 된다. width 지정은 auto 레이아웃이 무시하므로 min-width 필요. + expect(cls(input)).toContain('min-w-[80px]'); + // 숫자 스케일 min-w-16 은 safelist 에 없어 CSS 가 생성되지 않는다(무효). + expect(cls(input)).not.toContain('min-w-16'); + }); + + it('표 래퍼가 overflow-x-auto 를 명시한다', () => { + const layout = load(rel); + const wrapper = collect(layout, (n) => cls(n).includes('max-h-96'))[0]; + expect(wrapper).toBeTruthy(); + // overflow-y 만 선언해도 computed 는 auto 가 되지만 암묵적 의존이다. + expect(cls(wrapper)).toContain('overflow-x-auto'); + }); +}); + +describe('C2 — 쿠폰 발급기간 입력 행', () => { + const rel = 'partials/admin_ecommerce_promotion_coupon_form/_partial_issue_settings.json'; + + it('portable 에서 행이 줄바꿈하고 datetime 입력이 전폭이 된다', () => { + const layout = load(rel); + const row = collect(layout, (n) => n.id === 'issue_period_range')[0]; + expect(row).toBeTruthy(); + // flex-center 는 nowrap. w-52(208px) 두 개가 좁은 뷰포트를 넘긴다. + expect(row.responsive.portable.props.className).toContain('flex-wrap'); + + const inputs = collect(row, (n) => n.name === 'Input'); + expect(inputs.length).toBe(2); + for (const i of inputs) { + expect(i.responsive.portable.props.className).toContain('w-full'); + expect(i.responsive.portable.props.className).not.toContain('w-52'); + } + }); +}); + +describe('C3 — 이커머스 환경설정 넘침', () => { + it('탭바는 sticky-tab-nav-responsive 를 쓴다 (단계적 패딩과 일치)', () => { + const layout = load('admin_ecommerce_settings.json'); + const nav = collect(layout, (n) => n.id === 'tab_navigation')[0]; + expect(nav).toBeTruthy(); + // 콘텐츠 래퍼가 p-4 sm:p-6 lg:p-8 이라 고정 24px 를 가정하는 sticky-tab-nav(-mx-6 px-6)는 + // 폰에서 좌우 8px 씩 과다 bleed 된다. + expect(nav.props.className).toBe('sticky-tab-nav-responsive'); + }); + + it('이메일 행이 portable 에서 줄바꿈한다 (rcaExcess 71px 의 진범)', () => { + const layout = load('partials/admin_ecommerce_settings/_tab_basic_info.json'); + const emailGroup = collect(layout, (n) => n.id === 'field_email')[0]; + expect(emailGroup).toBeTruthy(); + const row = collect(emailGroup, (n) => cls(n).startsWith('flex-center'))[0]; + expect(row.responsive.portable.props.className).toContain('flex-wrap'); + }); + + it('w-80 고정폭 입력은 mobile(0~767px) 에서만 전폭이 된다', () => { + const layout = load('partials/admin_ecommerce_settings/_tab_basic_info.json'); + const w80 = collect(layout, (n) => n.name === 'Input' && cls(n).includes('w-80')); + expect(w80.length).toBeGreaterThanOrEqual(2); + + const overridden = w80.filter((n) => n.responsive); + expect(overridden.length).toBe(2); // 쇼핑몰 이름 + 종목 + + for (const n of overridden) { + // 태블릿(768~1023px)은 w-80 이 넘치지 않으므로 portable 로 잡으면 불필요하게 늘어난다. + expect(n.responsive.mobile).toBeDefined(); + expect(n.responsive.portable).toBeUndefined(); + expect(n.responsive.mobile.props.className).toContain('w-full'); + } + }); +}); + +describe('C5 — 엑셀 다운로드 날짜 필터 행', () => { + it('부모가 flex-wrap 이어도 자식 행에 flex-wrap 이 필요하다', () => { + const layout = load('admin_ecommerce_excel_download_index.json'); + const parent = collect(layout, (n) => n.id === 'date_filter_row')[0]; + expect(parent).toBeTruthy(); + expect(cls(parent)).toContain('flex-wrap'); + + // 부모만 wrap 이면 nowrap 인 자식 행(입력 2개 × w-36)이 11px 넘친다. + const child = (parent.children ?? []).find((c: any) => cls(c).startsWith('flex-center')); + expect(child).toBeTruthy(); + expect(cls(child)).toContain('flex-wrap'); + }); +}); + +describe('C6 — 도서산간 템플릿 모달 표', () => { + it('표 컨테이너가 overflow-x-auto 를 명시한다', () => { + const layout = load('partials/admin_ecommerce_shipping_policy_form/_modal_extra_fee_template.json'); + const wrapper = collect(layout, (n) => n.id === 'template_list')[0]; + expect(wrapper).toBeTruthy(); + // 현재는 computed 가 우연히 auto 라 동작하지만, overflow-y-visible 로 바뀌면 즉시 표가 잘린다. + expect(cls(wrapper)).toContain('overflow-x-auto'); + }); +}); diff --git a/modules/_bundled/sirsoft-ecommerce/resources/js/__tests__/layouts/shippingCountryLayouts.test.tsx b/modules/_bundled/sirsoft-ecommerce/resources/js/__tests__/layouts/shippingCountryLayouts.test.tsx index b354a3f9..afb93f28 100644 --- a/modules/_bundled/sirsoft-ecommerce/resources/js/__tests__/layouts/shippingCountryLayouts.test.tsx +++ b/modules/_bundled/sirsoft-ecommerce/resources/js/__tests__/layouts/shippingCountryLayouts.test.tsx @@ -120,19 +120,38 @@ describe('header-currency-selector-user.json — 헤더 공용 셀렉터 2섹션 * 사용자 템플릿(sirsoft-basic)은 390px 뷰포트 오버플로(+11px) 해소를 위해 이 슬롯을 * 헤더 우측 그룹에서 모바일 드로어(overflow-y-auto + w-80)로 옮겼다. 드로어에서는 * absolute 드롭다운 패널이 스크롤 경계에서 잘리므로, 주입 노드 자체가 responsive.portable - * (0~1023px) 오버라이드로 "트리거 숨김 + 패널 항상 펼침(static)" 을 선언한다. + * (0~1023px) 오버라이드로 static 인라인 목록으로 전환한다. + * + * 표시 여부는 데스크톱과 동일하게 `_local.showCurrencyDropdown` 이 결정한다 — portable 에 + * `if` 를 두지 않으면 엔진이 base `if` 를 그대로 상속하므로(`override.if ?? baseDef.if`) + * 드로어에서도 기본 접힘이 되고, 트리거가 접기/펼치기 아코디언 역할을 한다. * * SlotContainer 는 주입 자식에게 variant/context prop 을 전달하지 않으므로 컨테이너별로 * 다르게 그릴 방법이 이것뿐이다. 데스크톱(≥1024px)은 기존 드롭다운을 그대로 유지한다. */ - it('트리거 버튼은 portable(0~1023px)에서 숨겨진다 (모바일 드로어 = 펼친 목록)', () => { + it('트리거 버튼은 portable 에서 아코디언 행이 되고 접힘 상태 요약(통화·배송국가)을 노출한다', () => { const trigger = walk(root, (n) => n.name === 'Button' && Array.isArray(n.actions) && n.actions.some((a: any) => a.handler === 'setState' && a.params?.showCurrencyDropdown !== undefined)); expect(trigger).toBeTruthy(); - expect(trigger.responsive?.portable?.props?.className).toBe('hidden'); + + const portable = trigger.responsive?.portable; + expect(portable).toBeTruthy(); + // 더 이상 숨기지 않는다 — 드로어 폭을 채우는 트리거 행 + expect(portable.props.className).not.toBe('hidden'); + expect(portable.props.className).toContain('w-full'); + expect(portable.props.className).toContain('justify-between'); + // 접근성: 얕은 머지가 아니라 통째 교체이므로 aria-* 를 오버라이드에도 명시 + expect(portable.props['aria-expanded']).toBe('{{_local.showCurrencyDropdown ?? false}}'); + + // 접힘 상태에서 현재 값을 알 수 있어야 한다 (요약 = 통화 + 배송국가) + const summary = JSON.stringify(portable.children); + expect(summary).toContain('preferredCurrency'); + expect(summary).toContain('preferredShippingCountry'); + expect(summary).toContain('chevron-down'); + expect(summary).toContain("{{_local.showCurrencyDropdown ? 'rotate-180' : ''}}"); }); - it('패널은 portable 에서 if 해제 + static 흐름 (데스크톱 absolute/z-50 은 보존)', () => { + it('패널은 portable 에서도 _local.showCurrencyDropdown 으로 게이트된다 (기본 접힘)', () => { const panel = (root.children ?? []).find( (n: any) => n.name === 'Div' && n.props?.role === 'listbox' ); @@ -143,10 +162,11 @@ describe('header-currency-selector-user.json — 헤더 공용 셀렉터 2섹션 expect(panel.props.className).toContain('absolute'); expect(panel.props.className).toContain('z-50'); - // portable 오버라이드 — 엔진은 override.if 로 base if 를 완전 교체한다 const portable = panel.responsive?.portable; expect(portable).toBeTruthy(); - expect(portable.if).toBe('{{true}}'); + // 핵심: portable 에 if 를 두지 않아야 base if 를 상속해 기본 접힘이 된다. + // `{{true}}` 로 강제하면 드로어에서 항상 펼쳐져 아코디언이 성립하지 않는다. + expect(portable.if).toBeUndefined(); expect(portable.props.className).toContain('static'); expect(portable.props.className).not.toContain('absolute'); expect(portable.props.className).not.toContain('z-50'); @@ -154,6 +174,15 @@ describe('header-currency-selector-user.json — 헤더 공용 셀렉터 2섹션 expect(portable.props.role).toBe('listbox'); }); + it('배경 클릭 오버레이는 portable 에서 꺼진다 (드로어 전체를 덮어 클릭을 가로채는 회귀 방지)', () => { + const backdrop = (root.children ?? []).find( + (n: any) => n.name === 'Div' && (n.props?.className ?? '').includes('fixed inset-0') + ); + expect(backdrop).toBeTruthy(); + expect(backdrop.if).toBe('{{_local.showCurrencyDropdown}}'); + expect(backdrop.responsive?.portable?.if).toBe('{{false}}'); + }); + /** * 모바일(portable)에서는 통화·배송국가를 세로 목록이 아니라 가로 나열 칩으로 그린다. * 세로 목록은 좁은 드로어에서 세로 공간을 과하게 먹는다. diff --git a/modules/_bundled/sirsoft-ecommerce/resources/layouts/admin/admin_ecommerce_excel_download_index.json b/modules/_bundled/sirsoft-ecommerce/resources/layouts/admin/admin_ecommerce_excel_download_index.json index 5ead3af5..3a0031f7 100644 --- a/modules/_bundled/sirsoft-ecommerce/resources/layouts/admin/admin_ecommerce_excel_download_index.json +++ b/modules/_bundled/sirsoft-ecommerce/resources/layouts/admin/admin_ecommerce_excel_download_index.json @@ -50,7 +50,7 @@ "name": "Icon", "props": { "name": "file-spreadsheet", - "className": "w-5 h-5 icon-muted" + "className": "text-xl icon-muted" } }, { @@ -157,7 +157,7 @@ "name": "Icon", "props": { "name": "refresh-cw", - "className": "w-4 h-4" + "className": "text-base" } }, { @@ -230,7 +230,7 @@ "name": "Icon", "props": { "name": "check-circle", - "className": "w-3 h-3" + "className": "text-xs" } }, { @@ -262,7 +262,7 @@ "name": "Icon", "props": { "name": "loader", - "className": "w-3 h-3" + "className": "text-xs" } }, { @@ -294,7 +294,7 @@ "name": "Icon", "props": { "name": "alert-circle", - "className": "w-3 h-3" + "className": "text-xs" } }, { @@ -326,7 +326,7 @@ "name": "Icon", "props": { "name": "file-text", - "className": "w-3 h-3" + "className": "text-xs" } }, { @@ -439,10 +439,11 @@ } }, { + "comment": "부모(date_filter_row)는 flex-wrap 이지만 이 행 자신은 nowrap 이라, 시작일~종료일(각 input w-36 = 144px)이 좁은 뷰포트에서 콘텐츠 영역을 11px 넘긴다. 자식에도 flex-wrap 을 준다.", "type": "basic", "name": "Div", "props": { - "className": "flex-center gap-2" + "className": "flex-center flex-wrap gap-2" }, "children": [ { @@ -457,7 +458,7 @@ "name": "Icon", "props": { "name": "calendar", - "className": "w-4 h-4 icon-muted" + "className": "text-base icon-muted" } }, { @@ -502,7 +503,7 @@ "name": "Icon", "props": { "name": "calendar", - "className": "w-4 h-4 icon-muted" + "className": "text-base icon-muted" } }, { @@ -781,7 +782,7 @@ "name": "Icon", "props": { "name": "check-circle", - "className": "w-3 h-3" + "className": "text-xs" } }, { @@ -994,7 +995,7 @@ "name": "Icon", "props": { "name": "check-circle", - "className": "w-3 h-3" + "className": "text-xs" } }, { @@ -1161,7 +1162,7 @@ "name": "Icon", "props": { "name": "loader", - "className": "w-3 h-3 animate-spin" + "className": "text-xs animate-spin" } }, { @@ -1299,7 +1300,7 @@ "name": "Icon", "props": { "name": "alert-circle", - "className": "w-3 h-3" + "className": "text-xs" } }, { @@ -1437,7 +1438,7 @@ "name": "Icon", "props": { "name": "file-text", - "className": "w-3 h-3" + "className": "text-xs" } }, { @@ -1581,7 +1582,7 @@ "name": "Icon", "props": { "name": "check-circle", - "className": "w-3 h-3" + "className": "text-xs" } }, { @@ -1789,7 +1790,7 @@ "name": "Icon", "props": { "name": "loader", - "className": "w-3 h-3 animate-spin" + "className": "text-xs animate-spin" } }, { @@ -1979,7 +1980,7 @@ "name": "Icon", "props": { "name": "alert-circle", - "className": "w-3 h-3" + "className": "text-xs" } }, { @@ -2169,7 +2170,7 @@ "name": "Icon", "props": { "name": "file-text", - "className": "w-3 h-3" + "className": "text-xs" } }, { @@ -2379,7 +2380,7 @@ "name": "Icon", "props": { "name": "chevrons-left", - "className": "w-4 h-4" + "className": "text-base" } } ] @@ -2398,7 +2399,7 @@ "name": "Icon", "props": { "name": "chevron-left", - "className": "w-4 h-4" + "className": "text-base" } } ] @@ -2434,7 +2435,7 @@ "name": "Icon", "props": { "name": "chevron-right", - "className": "w-4 h-4" + "className": "text-base" } } ] @@ -2452,7 +2453,7 @@ "name": "Icon", "props": { "name": "chevrons-right", - "className": "w-4 h-4" + "className": "text-base" } } ] diff --git a/modules/_bundled/sirsoft-ecommerce/resources/layouts/admin/admin_ecommerce_settings.json b/modules/_bundled/sirsoft-ecommerce/resources/layouts/admin/admin_ecommerce_settings.json index 4ab60a40..3c65cf33 100644 --- a/modules/_bundled/sirsoft-ecommerce/resources/layouts/admin/admin_ecommerce_settings.json +++ b/modules/_bundled/sirsoft-ecommerce/resources/layouts/admin/admin_ecommerce_settings.json @@ -268,6 +268,7 @@ ] }, { + "comment": "className 은 sticky-tab-nav-responsive 를 쓴다 — 이 화면의 콘텐츠 래퍼가 admin-page-content-responsive(p-4 sm:p-6 lg:p-8) 라 뷰포트마다 좌우 패딩이 다르기 때문. 고정 24px 를 가정하는 sticky-tab-nav(-mx-6 px-6)를 쓰면 폰(p-4=16px)에서 좌우로 8px 씩 과다 bleed 되어 콘텐츠 영역을 넘친다.", "id": "tab_navigation", "type": "composite", "name": "TabNavigation", @@ -316,7 +317,7 @@ ], "activeTabId": "{{_global.activeEcommerceSettingsTab || query.tab || 'basic_info'}}", "variant": "default", - "className": "sticky-tab-nav" + "className": "sticky-tab-nav-responsive" }, "actions": [ { @@ -380,7 +381,7 @@ "name": "Icon", "props": { "name": "triangle-exclamation", - "className": "w-5 h-5 text-red-600 dark:text-red-400 flex-shrink-0 mt-0.5" + "className": "text-xl text-red-600 dark:text-red-400 flex-shrink-0 mt-0.5" } }, { diff --git a/modules/_bundled/sirsoft-ecommerce/resources/layouts/admin/partials/admin_ecommerce_order_detail/_modal_batch_change_confirm.json b/modules/_bundled/sirsoft-ecommerce/resources/layouts/admin/partials/admin_ecommerce_order_detail/_modal_batch_change_confirm.json index 8e778d99..c51773b9 100644 --- a/modules/_bundled/sirsoft-ecommerce/resources/layouts/admin/partials/admin_ecommerce_order_detail/_modal_batch_change_confirm.json +++ b/modules/_bundled/sirsoft-ecommerce/resources/layouts/admin/partials/admin_ecommerce_order_detail/_modal_batch_change_confirm.json @@ -8,8 +8,7 @@ "name": "Modal", "props": { "title": "$t:sirsoft-ecommerce.admin.order.detail.modal.batch_change.title", - "width": "750px", - "className": "max-w-full" + "width": "750px" }, "children": [ { @@ -48,7 +47,14 @@ "props": { "className": "col-span-5" }, - "text": "$t:sirsoft-ecommerce.admin.order.detail.modal.batch_change.product_col" + "text": "$t:sirsoft-ecommerce.admin.order.detail.modal.batch_change.product_col", + "responsive": { + "portable": { + "props": { + "className": "" + } + } + } }, { "type": "basic", @@ -56,7 +62,14 @@ "props": { "className": "col-span-2 text-right" }, - "text": "$t:sirsoft-ecommerce.admin.order.detail.modal.batch_change.price_col" + "text": "$t:sirsoft-ecommerce.admin.order.detail.modal.batch_change.price_col", + "responsive": { + "portable": { + "props": { + "className": "text-left" + } + } + } }, { "type": "basic", @@ -64,7 +77,14 @@ "props": { "className": "col-span-2 text-center" }, - "text": "$t:sirsoft-ecommerce.admin.order.detail.modal.batch_change.change_quantity_col" + "text": "$t:sirsoft-ecommerce.admin.order.detail.modal.batch_change.change_quantity_col", + "responsive": { + "portable": { + "props": { + "className": "text-left" + } + } + } }, { "type": "basic", @@ -72,9 +92,21 @@ "props": { "className": "col-span-3 text-center" }, - "text": "$t:sirsoft-ecommerce.admin.order.detail.modal.batch_change.current_status_col" + "text": "$t:sirsoft-ecommerce.admin.order.detail.modal.batch_change.current_status_col", + "responsive": { + "portable": { + "props": { + "className": "text-left" + } + } + } } - ] + ], + "responsive": { + "portable": { + "if": "{{false}}" + } + } }, { "type": "basic", @@ -165,7 +197,14 @@ } ] } - ] + ], + "responsive": { + "portable": { + "props": { + "className": "flex-center gap-2 min-w-0" + } + } + } }, { "type": "basic", @@ -175,11 +214,12 @@ }, "children": [ { + "comment": "whitespace-nowrap — 금액은 순수 숫자 토큰이라 숫자 내부에서 절대 줄바꿈되지 않아야 한다(`1,249,000` → `1,249` / `,000`). portable 세로 스택으로 셀이 전폭이라 현재는 절단이 없으나, 셀이 다시 좁아지면 즉시 재발하므로 의도를 코드에 고정한다.", "type": "basic", "name": "P", "if": "{{confirmItem.original_price && Number(confirmItem.original_price) !== Number(confirmItem.unit_price)}}", "props": { - "className": "text-hint line-through" + "className": "text-hint line-through whitespace-nowrap" }, "text": "{{Number(confirmItem.original_price).toLocaleString()}}" }, @@ -187,11 +227,18 @@ "type": "basic", "name": "P", "props": { - "className": "text-sm font-medium text-gray-900 dark:text-gray-100" + "className": "text-sm font-medium text-gray-900 dark:text-gray-100 whitespace-nowrap" }, "text": "{{Number(confirmItem.unit_price).toLocaleString()}}" } - ] + ], + "responsive": { + "portable": { + "props": { + "className": "text-left" + } + } + } }, { "type": "basic", @@ -230,7 +277,14 @@ }, "text": "/ {{confirmItem.quantity}}" } - ] + ], + "responsive": { + "portable": { + "props": { + "className": "flex justify-start" + } + } + } }, { "type": "basic", @@ -243,13 +297,27 @@ "type": "basic", "name": "Span", "props": { - "className": "{{({'pending_order':'bg-gray-100 text-gray-800 dark:bg-gray-700 dark:text-gray-300','pending_payment':'bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-300','payment_complete':'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-300','shipping_hold':'bg-orange-100 text-orange-800 dark:bg-orange-900 dark:text-orange-300','preparing':'bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-300','shipping_ready':'bg-indigo-100 text-indigo-800 dark:bg-indigo-900 dark:text-indigo-300','shipping':'bg-purple-100 text-purple-800 dark:bg-purple-900 dark:text-purple-300','delivered':'bg-teal-100 text-teal-800 dark:bg-teal-900 dark:text-teal-300','cancelled':'bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-300','confirmed':'bg-emerald-100 text-emerald-800 dark:bg-emerald-900 dark:text-emerald-300'})[confirmItem.option_status] ?? 'bg-gray-100 text-gray-800 dark:bg-gray-700 dark:text-gray-300'}} inline-flex items-center px-2 py-0.5 rounded text-xs font-medium" + "className": "{{({'pending_order':'bg-gray-100 text-gray-800 dark:bg-gray-700 dark:text-gray-300','pending_payment':'bg-yellow-100 text-yellow-800 dark:bg-yellow-900 dark:text-yellow-300','payment_complete':'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-300','shipping_hold':'bg-orange-100 text-orange-800 dark:bg-orange-900 dark:text-orange-300','preparing':'bg-blue-100 text-blue-800 dark:bg-blue-900 dark:text-blue-300','shipping_ready':'bg-indigo-100 text-indigo-800 dark:bg-indigo-900 dark:text-indigo-300','shipping':'bg-purple-100 text-purple-800 dark:bg-purple-900 dark:text-purple-300','delivered':'bg-teal-100 text-teal-800 dark:bg-teal-900 dark:text-teal-300','cancelled':'bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-300','confirmed':'bg-emerald-100 text-emerald-800 dark:bg-emerald-900 dark:text-emerald-300'})[confirmItem.option_status] ?? 'bg-gray-100 text-gray-800 dark:bg-gray-700 dark:text-gray-300'}} inline-flex items-center px-2 py-0.5 rounded text-xs font-medium break-keep" }, "text": "{{({'pending_order':'$t:sirsoft-ecommerce.admin.order.status.waiting','pending_payment':'$t:sirsoft-ecommerce.admin.order.status.payment_pending','payment_complete':'$t:sirsoft-ecommerce.admin.order.status.payment_complete','shipping_hold':'$t:sirsoft-ecommerce.admin.order.status.shipping_hold','preparing':'$t:sirsoft-ecommerce.admin.order.status.preparing','shipping_ready':'$t:sirsoft-ecommerce.admin.order.status.shipping_ready','shipping':'$t:sirsoft-ecommerce.admin.order.status.shipping','delivered':'$t:sirsoft-ecommerce.admin.order.status.delivered','cancelled':'$t:sirsoft-ecommerce.admin.order.status.cancelled','confirmed':'$t:sirsoft-ecommerce.admin.order.status.confirmed'})[confirmItem.option_status] ?? confirmItem.option_status}}" } - ] + ], + "responsive": { + "portable": { + "props": { + "className": "flex justify-start" + } + } + } } - ] + ], + "responsive": { + "portable": { + "props": { + "className": "grid grid-cols-1 gap-2 px-3 py-2 items-center" + } + } + } } ] } diff --git a/modules/_bundled/sirsoft-ecommerce/resources/layouts/admin/partials/admin_ecommerce_order_detail/_modal_cancel_order.json b/modules/_bundled/sirsoft-ecommerce/resources/layouts/admin/partials/admin_ecommerce_order_detail/_modal_cancel_order.json index d3c81786..dab3bbe9 100644 --- a/modules/_bundled/sirsoft-ecommerce/resources/layouts/admin/partials/admin_ecommerce_order_detail/_modal_cancel_order.json +++ b/modules/_bundled/sirsoft-ecommerce/resources/layouts/admin/partials/admin_ecommerce_order_detail/_modal_cancel_order.json @@ -8,8 +8,7 @@ "name": "Modal", "props": { "title": "$t:sirsoft-ecommerce.admin.order.detail.modal.cancel.title", - "width": "1125px", - "className": "max-w-full" + "width": "1125px" }, "children": [ { @@ -154,7 +153,14 @@ "props": { "className": "col-span-5" }, - "text": "$t:sirsoft-ecommerce.admin.order.detail.modal.cancel.product_col" + "text": "$t:sirsoft-ecommerce.admin.order.detail.modal.cancel.product_col", + "responsive": { + "portable": { + "props": { + "className": "" + } + } + } }, { "type": "basic", @@ -162,7 +168,14 @@ "props": { "className": "col-span-2 text-right" }, - "text": "$t:sirsoft-ecommerce.admin.order.detail.modal.cancel.unit_price_col" + "text": "$t:sirsoft-ecommerce.admin.order.detail.modal.cancel.unit_price_col", + "responsive": { + "portable": { + "props": { + "className": "text-left" + } + } + } }, { "type": "basic", @@ -170,7 +183,14 @@ "props": { "className": "col-span-3 text-center" }, - "text": "$t:sirsoft-ecommerce.admin.order.detail.modal.cancel.cancel_quantity_col" + "text": "$t:sirsoft-ecommerce.admin.order.detail.modal.cancel.cancel_quantity_col", + "responsive": { + "portable": { + "props": { + "className": "text-left" + } + } + } }, { "type": "basic", @@ -178,9 +198,21 @@ "props": { "className": "col-span-2 text-center" }, - "text": "$t:sirsoft-ecommerce.admin.order.detail.modal.cancel.status_col" + "text": "$t:sirsoft-ecommerce.admin.order.detail.modal.cancel.status_col", + "responsive": { + "portable": { + "props": { + "className": "text-left" + } + } + } } - ] + ], + "responsive": { + "portable": { + "if": "{{false}}" + } + } }, { "comment": "취소 항목 반복", @@ -238,7 +270,14 @@ } ] } - ] + ], + "responsive": { + "portable": { + "props": { + "className": "flex-center gap-2" + } + } + } }, { "comment": "단가 + 소계", @@ -249,22 +288,31 @@ }, "children": [ { + "comment": "whitespace-nowrap — 금액 토큰은 숫자 내부에서 절대 줄바꿈되지 않아야 한다(`249,000원` → `249,000` / `원`). portable 세로 스택으로 셀이 전폭이라 현재는 절단이 없으나, 셀이 다시 좁아지면 즉시 재발하므로 의도를 코드에 고정한다.", "type": "basic", "name": "Span", "props": { - "className": "text-body" + "className": "text-body whitespace-nowrap" }, "text": "{{(cancelItem.unit_price ?? 0).toLocaleString()}}원 × {{cancelItem.quantity ?? 1}}" }, { + "comment": "break-keep + whitespace-nowrap 조합 대신 break-keep 만 — `소계`(한글 라벨) + 금액이 한 문자열이라 nowrap 을 주면 좁은 셀에서 넘친다. break-keep 은 어절 경계에서만 줄바꿈해 `소계` / `249,000원` 으로 끊고 숫자 내부는 보존한다.", "type": "basic", "name": "P", "props": { - "className": "text-tertiary" + "className": "text-tertiary break-keep" }, "text": "$t:sirsoft-ecommerce.admin.order.detail.modal.cancel.product_subtotal {{((cancelItem.unit_price ?? 0) * (cancelItem.quantity ?? 1)).toLocaleString()}}원" } - ] + ], + "responsive": { + "portable": { + "props": { + "className": "text-left" + } + } + } }, { "comment": "취소수량 입력", @@ -297,7 +345,14 @@ } ] } - ] + ], + "responsive": { + "portable": { + "props": { + "className": "flex justify-start" + } + } + } }, { "comment": "현재상태 Badge", @@ -310,13 +365,31 @@ }, "children": [ { + "comment": "break-keep — 한글 상태명(`결제완료`)이 음절 경계에서 `결제완`/`료` 로 쪼개지지 않게 어절 단위 줄바꿈을 강제한다. 현재 Badge 는 inline-flex 라 콘텐츠 폭으로 자라 줄바꿈이 없지만, 배지 폭이 제한되면 즉시 재발한다.", "type": "basic", "name": "Span", + "props": { + "className": "break-keep" + }, "text": "{{cancelItem.option_status_label ?? cancelItem.option_status ?? ''}}" } - ] + ], + "responsive": { + "portable": { + "props": { + "className": "" + } + } + } } - ] + ], + "responsive": { + "portable": { + "props": { + "className": "grid grid-cols-1 gap-2 px-3 py-2 border-t border-gray-100 dark:border-gray-700 items-center" + } + } + } } ] }, @@ -1675,8 +1748,7 @@ ] } ], - "props": { - } + "props": {} } ] } diff --git a/modules/_bundled/sirsoft-ecommerce/resources/layouts/admin/partials/admin_ecommerce_promotion_coupon_form/_partial_issue_settings.json b/modules/_bundled/sirsoft-ecommerce/resources/layouts/admin/partials/admin_ecommerce_promotion_coupon_form/_partial_issue_settings.json index bab9f421..7bb7c9ad 100644 --- a/modules/_bundled/sirsoft-ecommerce/resources/layouts/admin/partials/admin_ecommerce_promotion_coupon_form/_partial_issue_settings.json +++ b/modules/_bundled/sirsoft-ecommerce/resources/layouts/admin/partials/admin_ecommerce_promotion_coupon_form/_partial_issue_settings.json @@ -194,7 +194,7 @@ ] }, { - "comment": "기간설정 시: 시작일 ~ 종료일", + "comment": "기간설정 시: 시작일 ~ 종료일. flex-center 는 nowrap 이고 datetime-local 입력이 각 208px(w-52) 이라 좁은 뷰포트에서 행이 콘텐츠 영역을 넘친다 → portable 에서 줄바꿈 + 입력 전폭.", "id": "issue_period_range", "type": "basic", "name": "Div", @@ -202,6 +202,13 @@ "props": { "className": "flex-center gap-2" }, + "responsive": { + "portable": { + "props": { + "className": "flex-center flex-wrap gap-2" + } + } + }, "children": [ { "type": "basic", @@ -210,6 +217,15 @@ "type": "datetime-local", "name": "issue_from", "className": "input w-52" + }, + "responsive": { + "portable": { + "props": { + "type": "datetime-local", + "name": "issue_from", + "className": "input w-full" + } + } } }, { @@ -227,6 +243,15 @@ "type": "datetime-local", "name": "issue_to", "className": "input w-52" + }, + "responsive": { + "portable": { + "props": { + "type": "datetime-local", + "name": "issue_to", + "className": "input w-full" + } + } } } ] diff --git a/modules/_bundled/sirsoft-ecommerce/resources/layouts/admin/partials/admin_ecommerce_settings/_bank_management_modal.json b/modules/_bundled/sirsoft-ecommerce/resources/layouts/admin/partials/admin_ecommerce_settings/_bank_management_modal.json index 3139f488..0b2bd420 100644 --- a/modules/_bundled/sirsoft-ecommerce/resources/layouts/admin/partials/admin_ecommerce_settings/_bank_management_modal.json +++ b/modules/_bundled/sirsoft-ecommerce/resources/layouts/admin/partials/admin_ecommerce_settings/_bank_management_modal.json @@ -119,11 +119,11 @@ ] }, { - "comment": "은행 목록 테이블 (스크롤 영역)", + "comment": "은행 목록 테이블 (스크롤 영역). overflow-x-auto 명시 필수 — 좁은 뷰포트에서 표(413px)가 컨테이너(356px)를 넘는다. overflow-y 만 선언해도 CSS Overflow 명세상 다른 축이 visible 로 남을 수 없어 computed 값이 auto 가 되지만, 그 의존은 암묵적이다. 누군가 overflow-y-visible 로 바꾸는 순간 표가 잘리므로 의도를 코드에 고정한다.", "type": "basic", "name": "Div", "props": { - "className": "max-h-96 overflow-y-auto border border-gray-200 dark:border-gray-700 rounded-lg" + "className": "max-h-96 overflow-y-auto overflow-x-auto border border-gray-200 dark:border-gray-700 rounded-lg" }, "children": [ { @@ -207,13 +207,14 @@ }, "children": [ { + "comment": "min-w-[80px] 필수 — 표가 table-layout:auto 이고 td 의 min-width 가 0 이라, 좁은 뷰포트에서 은행명 열이 은행코드 열을 56px 로 압착하면 input 이 24px(= 좌우 padding 12+12)로 줄어 텍스트 영역이 0px 이 된다(입력한 값이 보이지 않음). width 지정은 auto 레이아웃이 무시하므로 하한(min-width)을 고정해야 한다. 숫자 스케일 min-w-16 등은 safelist 에 없어 CSS 가 생성되지 않으므로 쓰면 무효다.", "type": "basic", "name": "Input", "props": { "type": "text", "value": "{{bank.code ?? ''}}", "placeholder": "$t:sirsoft-ecommerce.admin.settings.order_settings.bank_management.code_placeholder", - "className": "{{$parent._local.bankModalErrors?.['banks.' + bank._idx + '.code'] ? 'input input-error' : 'input'}}", + "className": "{{$parent._local.bankModalErrors?.['banks.' + bank._idx + '.code'] ? 'input input-error min-w-[80px]' : 'input min-w-[80px]'}}", "disabled": "{{$parent._computed.isReadOnly}}" }, "actions": [ diff --git a/modules/_bundled/sirsoft-ecommerce/resources/layouts/admin/partials/admin_ecommerce_settings/_tab_basic_info.json b/modules/_bundled/sirsoft-ecommerce/resources/layouts/admin/partials/admin_ecommerce_settings/_tab_basic_info.json index ca5ae84c..e2c39841 100644 --- a/modules/_bundled/sirsoft-ecommerce/resources/layouts/admin/partials/admin_ecommerce_settings/_tab_basic_info.json +++ b/modules/_bundled/sirsoft-ecommerce/resources/layouts/admin/partials/admin_ecommerce_settings/_tab_basic_info.json @@ -74,6 +74,7 @@ ] }, { + "comment": "w-80(320px) 고정폭은 폰(<768px)의 콘텐츠 영역을 넘긴다(320px 뷰포트에서 32px 초과). 태블릿(768~1023px)은 넘치지 않으므로 portable 이 아니라 mobile(0~767px) 로 한정한다 — portable 로 잡으면 태블릿에서 입력칸이 불필요하게 늘어난다. className 오버라이드는 통째 교체라 에러 분기 표현식을 복제한다.", "type": "basic", "name": "Input", "props": { @@ -82,6 +83,13 @@ "placeholder": "$t:sirsoft-ecommerce.admin.settings.basic_info.shop_info.shop_name_placeholder", "className": "{{_local.errors?.['basic_info.shop_name'] ? 'input input-error w-80' : 'input w-80'}}", "disabled": "{{_computed.isReadOnly}}" + }, + "responsive": { + "mobile": { + "props": { + "className": "{{_local.errors?.['basic_info.shop_name'] ? 'input input-error w-full' : 'input w-full'}}" + } + } } }, { @@ -453,6 +461,7 @@ "text": "$t:sirsoft-ecommerce.admin.settings.basic_info.business_info.business_category" }, { + "comment": "w-80(320px) 고정폭은 폰(<768px)의 콘텐츠 영역을 넘긴다(320px 뷰포트에서 32px 초과). 태블릿(768~1023px)은 넘치지 않으므로 portable 이 아니라 mobile(0~767px) 로 한정한다 — portable 로 잡으면 태블릿에서 입력칸이 불필요하게 늘어난다. className 오버라이드는 통째 교체라 에러 분기 표현식을 복제한다.", "type": "basic", "name": "Input", "props": { @@ -461,6 +470,13 @@ "placeholder": "$t:sirsoft-ecommerce.admin.settings.basic_info.business_info.business_category_placeholder", "className": "{{_local.errors?.['basic_info.business_category'] ? 'input input-error w-80' : 'input w-80'}}", "disabled": "{{_computed.isReadOnly}}" + }, + "responsive": { + "mobile": { + "props": { + "className": "{{_local.errors?.['basic_info.business_category'] ? 'input input-error w-full' : 'input w-full'}}" + } + } } }, { @@ -778,11 +794,19 @@ "text": "$t:sirsoft-ecommerce.admin.settings.basic_info.business_info.email" }, { + "comment": "flex-center 는 nowrap 이고 자식이 고정폭(아이디 w-36 + @ + 도메인 입력 + '직접입력' 드롭다운 104px)이라 좁은 뷰포트에서 이 행이 콘텐츠 영역을 71px 넘긴다 → portable 에서 줄바꿈.", "type": "basic", "name": "Div", "props": { "className": "flex-center gap-2" }, + "responsive": { + "portable": { + "props": { + "className": "flex-center flex-wrap gap-2" + } + } + }, "children": [ { "type": "basic", diff --git a/modules/_bundled/sirsoft-ecommerce/resources/layouts/admin/partials/admin_ecommerce_shipping_policy_form/_modal_extra_fee_template.json b/modules/_bundled/sirsoft-ecommerce/resources/layouts/admin/partials/admin_ecommerce_shipping_policy_form/_modal_extra_fee_template.json index 93b3b81b..997d7caf 100644 --- a/modules/_bundled/sirsoft-ecommerce/resources/layouts/admin/partials/admin_ecommerce_shipping_policy_form/_modal_extra_fee_template.json +++ b/modules/_bundled/sirsoft-ecommerce/resources/layouts/admin/partials/admin_ecommerce_shipping_policy_form/_modal_extra_fee_template.json @@ -394,11 +394,12 @@ }, "children": [ { + "comment": "overflow-x-auto 명시 — 6열 표(615px)가 좁은 뷰포트 컨테이너를 넘는다. overflow-y 만 선언해도 CSS Overflow 명세상 다른 축이 visible 로 남을 수 없어 computed 가 auto 로 계산되지만 그 의존은 암묵적이다. 누군가 overflow-y-visible 로 바꾸면 즉시 표가 잘리므로 의도를 코드에 고정한다. 표는 whitespace-nowrap 이라 절단 없이 가로 스크롤된다(세로 스택 전환은 과잉 대응).", "id": "template_list", "type": "basic", "name": "Div", "props": { - "className": "max-h-96 overflow-y-auto" + "className": "max-h-96 overflow-y-auto overflow-x-auto" }, "actions": [ { diff --git a/templates/_bundled/sirsoft-admin_basic/CHANGELOG.md b/templates/_bundled/sirsoft-admin_basic/CHANGELOG.md index 4fadd3e7..59aebca2 100644 --- a/templates/_bundled/sirsoft-admin_basic/CHANGELOG.md +++ b/templates/_bundled/sirsoft-admin_basic/CHANGELOG.md @@ -4,6 +4,25 @@ 형식은 [Keep a Changelog](https://keepachangelog.com/ko/1.1.0/)를 따르며, [Semantic Versioning](https://semver.org/lang/ko/)을 준수합니다. +## [1.0.2] - 2026-07-09 + +### Added + +- 레이아웃 편집기에서 관리자 기본 레이아웃을 편집할 때 "모바일 메뉴 펼침" 상태를 선택할 수 있습니다 — 모바일 메뉴 안의 언어·통화·배송국가 버튼을 캔버스에서 바로 편집할 수 있습니다. + +### Changed + +- 모바일에서 언어·통화·배송국가 선택을 관리자 메뉴 안으로 옮기고, 사용자 화면과 동일하게 가로로 나열된 버튼 형태로 통일했습니다. 상단 헤더에는 테마 전환과 알림만 남습니다. +- 모바일 메뉴 안의 언어와 통화·배송국가가 각각 접었다 펼치는 항목으로 바뀌어, 메뉴를 열었을 때 곧바로 관리자 메뉴가 보입니다. 접혀 있을 때도 현재 선택된 언어와 통화·배송국가가 표시되므로 펼치지 않아도 확인할 수 있으며, 두 항목은 서로 독립적으로 여닫힙니다. + +### Fixed + +- 모바일에서 상단 헤더의 통화 선택 버튼이 화면 밖으로 잘려 보이던 문제를 수정했습니다. 화면이 좁을수록 심해져 320px 기기에서는 대부분이 가려졌습니다. +- 관리자 메뉴에서 언어를 선택해도 언어가 바뀌지 않던 문제를 수정했습니다. 로그인·비밀번호 찾기·비밀번호 재설정 화면의 언어 선택도 함께 정리했습니다. +- 좁은 화면에서 팝업 창이 화면 좌우에 빈틈 없이 붙어 보이던 문제를 수정했습니다 — 이제 양옆에 여백이 생깁니다. +- 좁은 화면에서 목록 아래 페이지 번호가 한 줄에 다 들어가지 않아 화면 밖으로 넘치던 문제를 수정했습니다 — 이제 여러 줄로 나뉘어 표시됩니다. +- 좁은 화면에서 다국어 입력란의 언어 탭(한국어·English·日本語)이 한 줄에 다 들어가지 않아 넘치던 문제를 수정했습니다. 상품·게시판·페이지 등 다국어 입력이 있는 모든 화면에 적용됩니다. + ## [1.0.1] - 2026-07-08 ### Added diff --git a/templates/_bundled/sirsoft-admin_basic/__tests__/layouts/admin-auth-setlocale-target.test.tsx b/templates/_bundled/sirsoft-admin_basic/__tests__/layouts/admin-auth-setlocale-target.test.tsx new file mode 100644 index 00000000..b52c1df5 --- /dev/null +++ b/templates/_bundled/sirsoft-admin_basic/__tests__/layouts/admin-auth-setlocale-target.test.tsx @@ -0,0 +1,77 @@ +/** + * @file admin-auth-setlocale-target.test.tsx + * @description 비인증 화면(로그인·비밀번호찾기·비밀번호재설정) 언어 선택기의 setLocale 액션 형태 회귀 테스트 + * + * 배경: 관리자 템플릿은 자체 `setLocaleHandler` 를 등록해 엔진 빌트인 `setLocale`(ActionDispatcher) + * 을 덮어쓰고 있었다. 그 사본에는 두 결함이 있었다. + * ① `\n \n {fileName || placeholder}\n \n {fileName && !disabled && (\n \n \n \n \n \n )}\n
\n );\n});\n\nFileInput.displayName = 'FileInput';","// e2e:allow basic Input 디폴트 시맨틱(.input/.checkbox/.radio) 머지 — 동작 무변, 외형 통일 시범. 패턴 확정 후 다음 사이클에 E2E spec 일괄 작성 예정.\nimport React, { useRef, useCallback, useState, useEffect, forwardRef, useImperativeHandle } from 'react';\n\nexport interface InputProps extends React.InputHTMLAttributes {\n label?: string;\n error?: string;\n}\n\n// 타입별 디폴트 시맨틱 클래스 (admin main.css 정의)\n// 호출처 className 은 뒤에 머지되어 덮어쓸 수 있음 (의미 토큰/override 모두 지원)\nconst resolveDefaultSemanticClass = (type: string): string => {\n if (type === 'checkbox') return 'checkbox';\n if (type === 'radio') return 'radio';\n return 'input';\n};\n\n// 호출처 className 에 이미 시맨틱 토큰이 포함된 경우 prepend 를 스킵하여\n// \"input input\" 같은 중복 발생을 방지. 기존 호출처가 명시적으로 시맨틱을 적던 패턴 호환.\nconst composeSemanticClassName = (type: string, className: string): string => {\n const semantic = resolveDefaultSemanticClass(type);\n if (!className) return semantic;\n const tokens = className.split(/\\s+/).filter(Boolean);\n if (tokens.includes(semantic)) return className;\n return `${semantic} ${className}`;\n};\n\n/**\n * 기본 입력 필드 컴포넌트\n *\n * IME(한글 등) 조합 중에는 외부 onChange 이벤트를 발생시키지 않습니다.\n * 내부 로컬 상태를 사용하여 입력을 처리하고, 조합이 완료되면 외부에 알립니다.\n *\n * forwardRef를 사용하여 외부에서 ref로 input 요소에 접근할 수 있습니다.\n * 예: indeterminate 상태 설정 시 ref.current.indeterminate = true\n */\nexport const Input = forwardRef(({\n label,\n error,\n className = '',\n onChange,\n onKeyPress,\n value,\n defaultValue,\n type = 'text',\n checked,\n defaultChecked,\n ...props\n}, ref) => {\n // radio/checkbox 타입인지 확인\n const isCheckableType = type === 'radio' || type === 'checkbox';\n\n // 디폴트 시맨틱 + 호출처 className 머지 (호출처가 의미 토큰만 명시해도 시맨틱은 자동 적용)\n // 호출처가 이미 시맨틱 토큰을 명시한 경우 중복 prepend 방지.\n const mergedClassName = composeSemanticClassName(type, className);\n\n // IME 조합 중인지 추적 (text input에만 필요)\n const isComposingRef = useRef(false);\n // input 요소 참조\n const internalRef = useRef(null);\n\n // 외부 ref와 내부 ref를 연결\n useImperativeHandle(ref, () => internalRef.current as HTMLInputElement);\n\n // 내부 로컬 값 (IME 조합 중에도 화면에 표시됨) - text input에만 사용\n const [localValue, setLocalValue] = useState(\n (value as string) ?? (defaultValue as string) ?? ''\n );\n\n // 외부 value prop이 변경되면 로컬 값도 동기화 (text input에만 적용)\n // 단, 사용자가 입력 중(포커스 상태)이면 동기화 건너뜀 (debounce 대기 중 stale value 플리커 방지)\n useEffect(() => {\n if (!isCheckableType && !isComposingRef.current && value !== undefined) {\n const isFocused = internalRef.current && document.activeElement === internalRef.current;\n if (isFocused) {\n return;\n }\n setLocalValue(value as string);\n }\n }, [value, isCheckableType]);\n\n const handleCompositionStart = useCallback(() => {\n isComposingRef.current = true;\n }, []);\n\n const handleCompositionEnd = useCallback(\n (e: React.CompositionEvent) => {\n isComposingRef.current = false;\n // 조합 완료 후 onChange 이벤트 발생\n if (onChange) {\n // 현재 input의 실제 값을 사용\n const currentValue = (e.target as HTMLInputElement).value;\n setLocalValue(currentValue);\n\n // 새로운 ChangeEvent 생성\n const changeEvent = new Event('change', { bubbles: true }) as unknown as React.ChangeEvent;\n Object.defineProperty(changeEvent, 'target', {\n writable: false,\n value: { value: currentValue },\n });\n Object.defineProperty(changeEvent, 'currentTarget', {\n writable: false,\n value: { value: currentValue },\n });\n\n onChange(changeEvent);\n }\n },\n [onChange]\n );\n\n const handleChange = useCallback(\n (e: React.ChangeEvent) => {\n const newValue = e.target.value;\n // 항상 로컬 값은 업데이트 (화면에 입력이 보이도록)\n setLocalValue(newValue);\n\n // IME 조합 중이면 외부 onChange를 호출하지 않음\n if (isComposingRef.current) {\n return;\n }\n if (onChange) {\n onChange(e);\n }\n },\n [onChange]\n );\n\n const handleKeyPress = useCallback(\n (e: React.KeyboardEvent) => {\n // IME 조합 중이면 keypress 무시 (Enter 등)\n if (isComposingRef.current) {\n return;\n }\n if (onKeyPress) {\n onKeyPress(e);\n }\n },\n [onKeyPress]\n );\n\n // HTML 표준 속성이 아닌 것들을 필터링 (템플릿 엔진 내부 속성)\n const { loadingactions, formdata, ...validProps } = props as any;\n\n // radio/checkbox: checked 속성 사용\n // text input: value 속성 사용 (IME 처리 포함)\n if (isCheckableType) {\n return (\n \n );\n }\n\n // text input: controlled/uncontrolled 구분\n const inputProps = value !== undefined\n ? { value: localValue }\n : { defaultValue };\n\n return (\n \n );\n});\n\n// displayName 설정 (React DevTools에서 컴포넌트 이름 표시)\nInput.displayName = 'Input';","// e2e:allow basic Textarea 디폴트 시맨틱(.textarea) 머지 — 외형만 변경, 동작 무변. 다음 사이클에 다른 composite 와 함께 E2E spec 일괄 작성 예정.\nimport React, { useRef, useCallback, useState, useEffect } from 'react';\n\nexport interface TextareaProps extends React.TextareaHTMLAttributes {\n label?: string;\n error?: string;\n}\n\n/**\n * 기본 텍스트 영역 컴포넌트\n *\n * IME(한글 등) 조합 중에는 외부 onChange 이벤트를 발생시키지 않습니다.\n * 내부 로컬 상태를 사용하여 입력을 처리하고, 조합이 완료되면 외부에 알립니다.\n */\nexport const Textarea: React.FC = ({\n label,\n error,\n className = '',\n onChange,\n value,\n defaultValue,\n ...props\n}) => {\n // IME 조합 중인지 추적\n const isComposingRef = useRef(false);\n // textarea 요소 참조\n const textareaRef = useRef(null);\n\n // 내부 로컬 값 (IME 조합 중에도 화면에 표시됨)\n const [localValue, setLocalValue] = useState(\n (value as string) ?? (defaultValue as string) ?? ''\n );\n\n // 외부 value prop이 변경되면 로컬 값도 동기화\n useEffect(() => {\n if (!isComposingRef.current && value !== undefined) {\n setLocalValue(value as string);\n }\n }, [value]);\n\n const handleCompositionStart = useCallback(() => {\n isComposingRef.current = true;\n }, []);\n\n const handleCompositionEnd = useCallback(\n (e: React.CompositionEvent) => {\n isComposingRef.current = false;\n // 조합 완료 후 onChange 이벤트 발생\n if (onChange) {\n // 현재 textarea의 실제 값을 사용\n const currentValue = (e.target as HTMLTextAreaElement).value;\n setLocalValue(currentValue);\n\n // 새로운 ChangeEvent 생성\n const changeEvent = new Event('change', { bubbles: true }) as unknown as React.ChangeEvent;\n Object.defineProperty(changeEvent, 'target', {\n writable: false,\n value: { value: currentValue },\n });\n Object.defineProperty(changeEvent, 'currentTarget', {\n writable: false,\n value: { value: currentValue },\n });\n\n onChange(changeEvent);\n }\n },\n [onChange]\n );\n\n const handleChange = useCallback(\n (e: React.ChangeEvent) => {\n const newValue = e.target.value;\n // 항상 로컬 값은 업데이트 (화면에 입력이 보이도록)\n setLocalValue(newValue);\n\n // IME 조합 중이면 외부 onChange를 호출하지 않음\n if (isComposingRef.current) {\n return;\n }\n if (onChange) {\n onChange(e);\n }\n },\n [onChange]\n );\n\n // HTML 표준 속성이 아닌 것들을 필터링 (템플릿 엔진 내부 속성)\n const { loadingactions, formdata, ...validProps } = props as any;\n\n // controlled/uncontrolled 구분\n const textareaValueProps = value !== undefined\n ? { value: localValue }\n : { defaultValue };\n\n // .textarea 시맨틱(admin main.css)을 디폴트로 머지 → 호출처가 className 미지정해도 표준 외형\n // 호출처가 이미 'textarea' 토큰을 명시한 경우 중복 prepend 방지.\n const textareaTokens = (className ?? '').split(/\\s+/).filter(Boolean);\n const mergedClassName = textareaTokens.includes('textarea')\n ? (className ?? '')\n : ['textarea', className].filter(Boolean).join(' ');\n\n return (\n \n );\n};\n","import React from 'react';\n\nexport interface LabelProps extends React.LabelHTMLAttributes {}\n\n/**\n * 기본 레이블 컴포넌트\n */\nexport const Label: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface DivProps extends React.HTMLAttributes {\n ref?: React.Ref;\n}\n\n/**\n * 기본 div 컴포넌트\n */\nexport const Div = React.forwardRef(({\n children,\n className = '',\n ...props\n}, ref) => {\n return (\n \n {children}\n
\n );\n});\n","import React from 'react';\n\nexport interface SpanProps extends React.HTMLAttributes {}\n\n/**\n * 기본 span 컴포넌트\n */\nexport const Span: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface PProps extends React.HTMLAttributes {}\n\n/**\n * 기본 p(단락) 컴포넌트\n */\nexport const P: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n

\n );\n};\n","import React from 'react';\n\nexport interface ImgProps extends React.ImgHTMLAttributes {}\n\n/**\n * 기본 이미지 컴포넌트\n */\nexport const Img: React.FC = ({\n className = '',\n alt = '',\n ...props\n}) => {\n return (\n \n );\n};\n","import React from 'react';\n\nexport interface H1Props extends React.HTMLAttributes {}\n\n/**\n * 기본 h1 제목 컴포넌트\n */\nexport const H1: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface H2Props extends React.HTMLAttributes {}\n\n/**\n * 기본 h2 제목 컴포넌트\n */\nexport const H2: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface H3Props extends React.HTMLAttributes {}\n\n/**\n * 기본 h3 제목 컴포넌트\n */\nexport const H3: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface H4Props extends React.HTMLAttributes {}\n\n/**\n * 기본 h4 제목 컴포넌트\n */\nexport const H4: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface UlProps extends React.HTMLAttributes {}\n\n/**\n * 기본 ul(순서없는 목록) 컴포넌트\n */\nexport const Ul: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface OlProps extends React.HTMLAttributes {}\n\n/**\n * 기본 ol(순서있는 목록) 컴포넌트\n */\nexport const Ol: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface LiProps extends React.LiHTMLAttributes {}\n\n/**\n * 기본 li(목록 항목) 컴포넌트\n */\nexport const Li: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface AProps extends React.AnchorHTMLAttributes {}\n\n/**\n * 기본 a(링크) 컴포넌트\n */\nexport const A: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n
\n );\n};\n","import React from 'react';\n\nexport interface FormProps extends React.FormHTMLAttributes {}\n\n/**\n * 기본 form 컴포넌트\n */\nexport const Form: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface SvgProps extends React.SVGAttributes {}\n\n/**\n * 기본 svg 컴포넌트\n */\nexport const Svg: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","// e2e:allow편집기 passthrough 결함#1 수정(커스텀 드롭다운 루트 data-editor-* spread). 라이브 검증은 Chrome MCP T1~T7 매트릭스(에디터 추가/선택/저장 200/reload/게스트 사용자화면)로 수행, 단위 회귀는 Select.test.tsx passthrough describe.\nimport React, { useMemo, useState, useRef, useEffect, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Div } from './Div';\nimport { Button } from './Button';\nimport { Span } from './Span';\nimport { Svg } from './Svg';\nimport { Input } from './Input';\n\n// Logger 설정 (G7Core 초기화 전에도 동작하도록 폴백 포함)\nconst logger = ((window as any).G7Core?.createLogger?.('Comp:Select')) ?? {\n log: (...args: unknown[]) => console.log('[Comp:Select]', ...args),\n warn: (...args: unknown[]) => console.warn('[Comp:Select]', ...args),\n error: (...args: unknown[]) => console.error('[Comp:Select]', ...args),\n};\n\nexport interface SelectOption {\n value: string | number;\n label: string;\n disabled?: boolean;\n}\n\nexport interface SelectProps extends Omit, 'onChange'> {\n label?: string;\n error?: string;\n options?: SelectOption[] | string[];\n onChange?: (e: React.ChangeEvent | { target: { value: string | number } }) => void;\n /** 드롭다운 내 검색 input 활성화 (engine-v1.40.0+) */\n searchable?: boolean;\n /** 검색 input placeholder */\n searchPlaceholder?: string;\n /**\n * 레이아웃 편집기 주입 속성 (편집 모드 전용). Select 는 커스텀 드롭다운 루트에\n * 개별 data-editor-* 키를 spread 해야 선택/편집이 닿는다(커스텀 루트\n * passthrough). basic 컴포넌트라 `{...props}` 로 DOM 표준 속성(id 등)도 함께 흐른다.\n */\n editorAttrs?: Record;\n}\n\n/**\n * 로케일 코드를 사람이 읽을 수 있는 이름으로 변환\n */\nfunction getLocaleName(locale: string): string {\n const fromAppConfig = (window as any).G7Core?.state?.get?.('_global.appConfig.localeNames')?.[locale];\n if (fromAppConfig) {\n return fromAppConfig;\n }\n const fallback: Record = {\n ko: '한국어',\n en: 'English',\n ja: '日本語',\n zh: '中文',\n es: 'Español',\n fr: 'Français',\n de: 'Deutsch',\n };\n return fallback[locale] || locale;\n}\n\n/**\n * 커스텀 Select 컴포넌트\n *\n * options prop을 사용하여 드롭다운 메뉴를 생성합니다.\n * 둥근 모서리, 그림자, 체크마크가 있는 커스텀 스타일을 지원합니다.\n */\nexport const Select: React.FC = ({\n children,\n label,\n error,\n options,\n className = '',\n value,\n onChange,\n disabled,\n searchable = false,\n searchPlaceholder,\n editorAttrs,\n ...props\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const [searchTerm, setSearchTerm] = useState('');\n const [dropdownPos, setDropdownPos] = useState<{ top?: number; bottom?: number; left: number; width: number } | null>(null);\n const containerRef = useRef(null);\n const buttonRef = useRef(null);\n const searchInputRef = useRef(null);\n const dropdownRef = useRef(null);\n\n // options를 SelectOption[] 형식으로 정규화\n const normalizedOptions = useMemo((): SelectOption[] | null => {\n if (!options) return null;\n\n // 배열이 아닌 경우 (바인딩 에러 또는 잘못된 prop)\n if (!Array.isArray(options)) {\n logger.warn('options prop is not an array:', options);\n return null;\n }\n\n // 빈 배열인 경우\n if (options.length === 0) return [];\n\n // string[] 배열인 경우\n if (typeof options[0] === 'string') {\n return (options as string[]).map((locale): SelectOption => ({\n value: locale,\n label: getLocaleName(locale),\n }));\n }\n\n // SelectOption[] 배열인 경우 (기존 동작)\n return options as SelectOption[];\n }, [options]);\n\n // 현재 선택된 옵션의 라벨 가져오기\n const selectedLabel = useMemo(() => {\n if (!normalizedOptions) return '';\n const selected = normalizedOptions.find(opt => String(opt.value) === String(value));\n return selected?.label || '';\n }, [normalizedOptions, value]);\n\n // searchable 모드에서 검색어로 필터링된 옵션\n const visibleOptions = useMemo((): SelectOption[] | null => {\n if (!normalizedOptions) return null;\n if (!searchable || searchTerm.trim() === '') return normalizedOptions;\n const needle = searchTerm.trim().toLowerCase();\n return normalizedOptions.filter(opt =>\n opt.label.toLowerCase().includes(needle) ||\n String(opt.value).toLowerCase().includes(needle)\n );\n }, [normalizedOptions, searchable, searchTerm]);\n\n // 드롭다운 열릴 때 검색어 초기화 및 input 포커스\n useEffect(() => {\n if (isOpen && searchable) {\n setSearchTerm('');\n // 다음 tick에 포커스 (DOM 렌더 이후)\n const timer = setTimeout(() => searchInputRef.current?.focus(), 0);\n return () => clearTimeout(timer);\n }\n if (!isOpen) {\n setSearchTerm('');\n }\n }, [isOpen, searchable]);\n\n /**\n * 드롭다운 위치 계산 (버튼 기준 fixed positioning)\n * Modal 등 overflow:hidden 컨테이너 내부에서도 정상 표시\n */\n const updateDropdownPos = useCallback(() => {\n if (!buttonRef.current) return;\n const rect = buttonRef.current.getBoundingClientRect();\n const spaceBelow = window.innerHeight - rect.bottom;\n const dropdownMaxH = 280; // max-h-60(240px) + search(~40px)\n // 아래 공간 부족 시 위로 열기\n const openUpward = spaceBelow < dropdownMaxH && rect.top > spaceBelow;\n if (openUpward) {\n setDropdownPos({\n bottom: window.innerHeight - rect.top + 4,\n left: rect.left,\n width: rect.width,\n });\n } else {\n setDropdownPos({\n top: rect.bottom + 4,\n left: rect.left,\n width: rect.width,\n });\n }\n }, []);\n\n // 드롭다운 열릴 때 위치 계산 + 스크롤/리사이즈 추적\n useEffect(() => {\n if (!isOpen) {\n setDropdownPos(null);\n return;\n }\n updateDropdownPos();\n window.addEventListener('scroll', updateDropdownPos, true);\n window.addEventListener('resize', updateDropdownPos);\n return () => {\n window.removeEventListener('scroll', updateDropdownPos, true);\n window.removeEventListener('resize', updateDropdownPos);\n };\n }, [isOpen, updateDropdownPos]);\n\n // 외부 클릭 시 드롭다운 닫기 (Portal 영역 포함)\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node;\n if (\n containerRef.current && !containerRef.current.contains(target) &&\n (!dropdownRef.current || !dropdownRef.current.contains(target))\n ) {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n }\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isOpen]);\n\n // ESC 키로 드롭다운 닫기\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && isOpen) {\n setIsOpen(false);\n buttonRef.current?.focus();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen]);\n\n const handleToggle = () => {\n if (!disabled) {\n setIsOpen(!isOpen);\n }\n };\n\n const handleSelect = (optionValue: string | number) => {\n if (onChange) {\n // ActionDispatcher가 이벤트를 인식할 수 있도록 preventDefault 메서드 포함\n const syntheticEvent = {\n target: { value: optionValue },\n preventDefault: () => {},\n stopPropagation: () => {},\n type: 'change',\n };\n onChange(syntheticEvent as any);\n }\n setIsOpen(false);\n buttonRef.current?.focus();\n };\n\n // options가 없으면 기본 select 사용 (children 지원)\n // .select 시맨틱(admin main.css)을 디폴트로 머지 → 호출처가 className 미지정해도 표준 외형\n // 호출처가 이미 'select' 토큰을 명시한 경우 중복 prepend 방지.\n if (!normalizedOptions) {\n const tokens = (className ?? '').split(/\\s+/).filter(Boolean);\n const mergedClassName = tokens.includes('select')\n ? (className ?? '')\n : ['select', className].filter(Boolean).join(' ');\n return (\n }\n disabled={disabled}\n {...editorAttrs}\n {...props}\n >\n {children}\n \n );\n }\n\n // 기본 스타일 (className이 없을 때 적용)\n // variant 접두사가 붙은 유틸(disabled:bg-, dark:bg-, hover:bg- 등)은 베이스 외형이 아니므로\n // hasCustomStyle/hasTextColor 판정에서 제외한다. 베이스 토큰만으로 커스텀 외형 여부를 판단해야\n // 호출처가 disabled:bg-gray-100 만 추가했을 때 기본 크기 클래스(w-full px-4 py-2.5)가 유실되지 않는다.\n const baseTokens = (className ?? '')\n .split(/\\s+/)\n .filter((t) => t && !t.includes(':')) // variant 접두사(`disabled:`, `dark:`, `hover:` 등) 토큰 제외\n .join(' ');\n const hasCustomStyle = baseTokens.includes('bg-');\n // 커스텀 스타일에 텍스트 색상이 없으면 기본 텍스트 색상 보충\n const hasTextColor = /text-(gray|red|blue|green|yellow|white|black|indigo|purple|pink|orange|amber|emerald|teal|cyan|slate)-\\d+|text-white|text-black/.test(baseTokens);\n const baseButtonClass = hasCustomStyle\n ? `${className}${hasTextColor ? '' : ' text-gray-700 dark:text-gray-200'}`\n : `w-full px-4 py-2.5 bg-gray-100 dark:bg-gray-700 border-0 rounded-xl text-sm text-gray-700 dark:text-gray-200 font-medium focus:ring-2 focus:ring-blue-500 focus:outline-none ${className}`;\n\n // props 는 SelectHTMLAttributes 기반이라 Div(HTMLDivElement) 에 직접 spread 시 타입 불일치.\n // 런타임 동작(편집기 data-editor-* / id 등 DOM 표준 속성 passthrough)은 동일하므로\n // DOM-safe 레코드로 캐스팅해 커스텀 드롭다운 루트에 전달한다.\n const rootDomProps = { ...editorAttrs, ...props } as Record;\n\n return (\n
\n \n {selectedLabel || '\\u00A0'}\n \n \n \n \n\n {isOpen && dropdownPos && createPortal(\n \n {searchable && (\n
\n ) => setSearchTerm(e.target.value)}\n placeholder={searchPlaceholder ?? 'Search...'}\n className=\"w-full px-3 py-2 bg-gray-100 dark:bg-gray-700 border-0 rounded-lg text-sm text-gray-700 dark:text-gray-200 placeholder-gray-400 dark:placeholder-gray-500 focus:ring-2 focus:ring-blue-500 focus:outline-none\"\n role=\"searchbox\"\n aria-label={searchPlaceholder ?? 'Search'}\n />\n
\n )}\n
\n {visibleOptions && visibleOptions.length === 0 && (\n
\n {searchTerm ? 'No results' : ''}\n
\n )}\n {(visibleOptions ?? []).map((option) => {\n const isSelected = String(option.value) === String(value);\n return (\n !option.disabled && handleSelect(option.value)}\n disabled={option.disabled}\n className={`w-full px-4 py-3 text-left text-sm flex items-center justify-between hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors ${\n isSelected ? 'text-blue-600 dark:text-blue-400 font-medium' : 'text-gray-700 dark:text-gray-200'\n } ${option.disabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer'}`}\n role=\"option\"\n aria-selected={isSelected}\n >\n {option.label}\n {isSelected && (\n \n \n \n )}\n \n );\n })}\n
\n
,\n document.body\n )}\n
\n );\n};\n","import React from 'react';\n\nexport interface OptionProps extends React.OptionHTMLAttributes {}\n\n/**\n * 기본 option 컴포넌트 (Select 내부에서 사용)\n */\nexport const Option: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface OptgroupProps extends React.OptgroupHTMLAttributes {}\n\n/**\n * 기본 optgroup 컴포넌트 (Select 내부에서 옵션 그룹화)\n */\nexport const Optgroup: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React, { forwardRef, useEffect, useRef } from 'react';\n\nexport interface CheckboxProps extends React.InputHTMLAttributes {\n label?: string;\n /**\n * indeterminate 상태 (부분 선택 상태)\n *\n * 부모-자식 체크박스 연동에서 일부 자식만 선택되었을 때 사용합니다.\n * HTML checkbox의 indeterminate 속성을 JavaScript로 설정합니다.\n */\n indeterminate?: boolean;\n}\n\n/**\n * 기본 체크박스 컴포넌트\n *\n * forwardRef를 사용하여 ref 전달을 지원합니다.\n * indeterminate prop을 통해 부분 선택 상태를 표시할 수 있습니다.\n */\nexport const Checkbox = forwardRef(\n ({ label, className = '', indeterminate = false, ...props }, ref) => {\n const internalRef = useRef(null);\n\n // 외부 ref와 내부 ref를 병합\n const combinedRef = (node: HTMLInputElement | null) => {\n internalRef.current = node;\n if (typeof ref === 'function') {\n ref(node);\n } else if (ref) {\n ref.current = node;\n }\n };\n\n // indeterminate 상태 설정 (DOM 속성이므로 JavaScript로 설정해야 함)\n useEffect(() => {\n if (internalRef.current) {\n internalRef.current.indeterminate = indeterminate;\n }\n }, [indeterminate]);\n\n return (\n \n );\n }\n);\n\nCheckbox.displayName = 'Checkbox';\n","import React from 'react';\n\nexport interface TableProps extends React.TableHTMLAttributes {}\n\n/**\n * 기본 table 컴포넌트\n */\nexport const Table: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface TheadProps extends React.HTMLAttributes {}\n\n/**\n * 기본 thead 컴포넌트\n */\nexport const Thead: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface TbodyProps extends React.HTMLAttributes {}\n\n/**\n * 기본 tbody 컴포넌트\n */\nexport const Tbody: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface TfootProps extends React.HTMLAttributes {}\n\n/**\n * 기본 tfoot 컴포넌트\n */\nexport const Tfoot: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface TrProps extends React.HTMLAttributes {}\n\n/**\n * 기본 tr(테이블 행) 컴포넌트\n */\nexport const Tr: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface ThProps extends React.ThHTMLAttributes {}\n\n/**\n * 기본 th(테이블 헤더 셀) 컴포넌트\n */\nexport const Th: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface TdProps extends React.TdHTMLAttributes {}\n\n/**\n * 기본 td(테이블 데이터 셀) 컴포넌트\n */\nexport const Td: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface NavProps extends React.HTMLAttributes {}\n\n/**\n * 기본 nav 컴포넌트\n */\nexport const Nav: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface SectionProps extends React.HTMLAttributes {}\n\n/**\n * 기본 section 컴포넌트\n */\nexport const Section: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\nimport { IconName, IconStyle, IconSize } from './IconTypes';\n\nexport interface IconProps extends Omit, 'style'> {\n /**\n * 아이콘 이름 (Font Awesome 클래스명 또는 IconName enum)\n *\n * @example\n * // 문자열로 직접 지정\n * \n *\n * // enum 사용 (타입 안전)\n * \n */\n name: string | IconName;\n\n /**\n * 아이콘 스타일 (Font Awesome 5/6)\n *\n * - solid: fas (기본값)\n * - regular: far\n * - light: fal\n * - duotone: fad\n * - brands: fab\n */\n iconStyle?: IconStyle;\n\n /**\n * CSS 스타일 객체 (HTML style 속성)\n */\n style?: React.CSSProperties;\n\n /**\n * 아이콘 크기\n *\n * @default 'md'\n */\n size?: IconSize;\n\n /**\n * 색상 (Tailwind 클래스 또는 CSS 색상)\n */\n color?: string;\n\n /**\n * 회전 애니메이션 활성화\n */\n spin?: boolean;\n\n /**\n * 펄스 애니메이션 활성화 (8단계 회전)\n */\n pulse?: boolean;\n\n /**\n * 고정 너비 (아이콘 정렬 시 유용)\n */\n fixedWidth?: boolean;\n\n /**\n * 접근성 레이블 (자동 생성 가능)\n */\n ariaLabel?: string;\n}\n\n/**\n * Font Awesome 아이콘 컴포넌트\n *\n * Font Awesome 5/6 버전과 호환되며 다양한 props를 지원합니다.\n *\n * @example\n * // 기본 사용\n * \n *\n * // enum 사용 (타입 안전)\n * \n *\n * // 스타일 및 크기 지정\n * \n *\n * // 애니메이션\n * \n * \n *\n * // 색상 지정\n * \n *\n * // 접근성\n * \n */\nexport const Icon: React.FC = ({\n name,\n iconStyle = 'solid',\n size,\n color,\n spin = false,\n pulse = false,\n fixedWidth = false,\n ariaLabel,\n className = '',\n style,\n ...props\n}) => {\n // Font Awesome 스타일 클래스 매핑\n const styleClassMap: Record = {\n solid: 'fas',\n regular: 'far',\n light: 'fal',\n duotone: 'fad',\n brands: 'fab',\n };\n\n // 스타일 접두사를 IconStyle로 변환하는 매핑\n const stylePrefixMap: Record = {\n 'fa-solid': 'solid',\n 'fa-regular': 'regular',\n 'fa-light': 'light',\n 'fa-duotone': 'duotone',\n 'fa-brands': 'brands',\n };\n\n const nameStr = typeof name === 'string' ? name : String(name);\n\n // \"fa-regular fa-pen-to-square\" 형식 파싱\n let resolvedStyle = iconStyle;\n let iconName = nameStr;\n\n // 스타일 접두사가 포함된 경우 파싱 (예: \"fa-regular fa-pen-to-square\")\n for (const [prefix, styleValue] of Object.entries(stylePrefixMap)) {\n if (nameStr.startsWith(prefix + ' ')) {\n resolvedStyle = styleValue;\n iconName = nameStr.substring(prefix.length + 1); // 스타일 접두사와 공백 제거\n break;\n }\n }\n\n // 아이콘 이름에서 'fa-' 접두사 제거 (이미 있으면)\n iconName = iconName.replace(/^fa-/, '');\n\n // 클래스 조합\n const classes = [\n styleClassMap[resolvedStyle],\n `fa-${iconName}`,\n size && `fa-${size}`,\n spin && 'fa-spin',\n pulse && 'fa-pulse',\n fixedWidth && 'fa-fw',\n color,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n // 접근성: ariaLabel이 없으면 name에서 생성\n const accessibilityLabel = ariaLabel || iconName.replace(/-/g, ' ');\n\n return (\n \n );\n};\n","import React from 'react';\nimport { Icon } from './Icon';\nimport { IconSize } from './IconTypes';\n\n/**\n * UnifiedIcon 크기 타입\n */\nexport type UnifiedIconSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * UnifiedIcon Props\n */\nexport interface UnifiedIconProps {\n /**\n * 아이콘 지정자\n *\n * @example\n * // Font Awesome (기본)\n * \"fa:cart-shopping\"\n * \"fa-solid fa-cart-shopping\"\n * \"cart-shopping\" // 접두사 없으면 FA 기본\n *\n * // 외부 SVG 파일\n * \"svg:/modules/my-module/assets/icon.svg\"\n *\n * // 이미지 파일\n * \"img:/images/custom-icon.png\"\n */\n icon: string;\n\n /**\n * 아이콘 크기\n * - xs: 12px (w-3 h-3)\n * - sm: 16px (w-4 h-4)\n * - md: 20px (w-5 h-5) - 기본값\n * - lg: 24px (w-6 h-6)\n * - xl: 32px (w-8 h-8)\n *\n * @default 'md'\n */\n size?: UnifiedIconSize;\n\n /**\n * 추가 CSS 클래스\n */\n className?: string;\n\n /**\n * 색상 (Tailwind 클래스)\n *\n * @example\n * \"text-blue-500\"\n * \"text-slate-600 dark:text-slate-300\"\n */\n color?: string;\n\n /**\n * 접근성 레이블\n */\n ariaLabel?: string;\n}\n\n/**\n * 크기별 Tailwind 클래스 매핑\n */\nconst sizeClassMap: Record = {\n xs: 'w-3 h-3', // 12px\n sm: 'w-4 h-4', // 16px\n md: 'w-5 h-5', // 20px\n lg: 'w-6 h-6', // 24px\n xl: 'w-8 h-8', // 32px\n};\n\n/**\n * Icon 컴포넌트용 크기 매핑 (Font Awesome size prop)\n */\nconst iconSizeMap: Record = {\n xs: 'xs',\n sm: 'sm',\n md: undefined, // 기본값\n lg: 'lg',\n xl: '2x',\n};\n\n/**\n * UnifiedIcon 컴포넌트\n *\n * 다양한 아이콘 소스(Font Awesome, SVG, 이미지)를 통합하여 렌더링하는 컴포넌트입니다.\n *\n * @example\n * // Font Awesome 아이콘 (기본)\n * \n * // 접두사 없으면 FA 기본\n *\n * // 외부 SVG 파일\n * \n *\n * // 이미지 파일\n * \n */\nexport const UnifiedIcon: React.FC = ({\n icon,\n size = 'md',\n className = '',\n color,\n ariaLabel,\n}) => {\n // 타입 파싱: \"type:value\" 형식 분리\n const colonIndex = icon.indexOf(':');\n\n // \"fa-solid fa-xxx\" 또는 \"fas fa-xxx\" 형식인 경우 Font Awesome으로 처리\n const isFontAwesomeClass =\n icon.startsWith('fa-') ||\n icon.startsWith('fas ') ||\n icon.startsWith('far ') ||\n icon.startsWith('fab ') ||\n icon.startsWith('fal ') ||\n icon.startsWith('fad ');\n\n let type: string;\n let name: string;\n\n if (isFontAwesomeClass) {\n // Font Awesome 클래스 형식\n type = 'fa';\n name = icon;\n } else if (colonIndex > 0) {\n // \"type:name\" 형식\n type = icon.substring(0, colonIndex);\n name = icon.substring(colonIndex + 1);\n } else {\n // 접두사 없음 = Font Awesome 기본\n type = 'fa';\n name = icon;\n }\n\n const sizeClass = sizeClassMap[size];\n const colorClass = color || '';\n\n switch (type) {\n case 'fa':\n // Font Awesome: Icon 컴포넌트 위임\n return (\n \n );\n\n case 'svg':\n // 외부 SVG 파일 (img 태그로 렌더링)\n return (\n \n );\n\n case 'img':\n // 이미지 파일\n return (\n \n );\n\n default:\n // 기본: Font Awesome\n return (\n \n );\n }\n};\n","import React from 'react';\n\nexport interface CodeProps extends React.HTMLAttributes {}\n\n/**\n * 기본 code 컴포넌트\n *\n * 인라인 코드 또는 코드 스니펫을 표시하기 위한 기본 컴포넌트입니다.\n * HTML 태그를 래핑합니다.\n */\nexport const Code: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface PreProps extends React.HTMLAttributes {}\n\n/**\n * 기본 pre 컴포넌트\n *\n * 서식이 지정된 텍스트를 표시하기 위한 기본 컴포넌트입니다.\n * HTML
 태그를 래핑합니다.\n */\nexport const Pre: React.FC = ({\n  children,\n  className = '',\n  ...props\n}) => {\n  return (\n    \n      {children}\n    
\n );\n};\n","import React from 'react';\n\nexport interface FragmentProps {\n children?: React.ReactNode;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * Fragment 기본 컴포넌트\n *\n * React.Fragment와 유사하게 DOM 요소를 추가하지 않고 children만 렌더링합니다.\n * iterator와 함께 사용하여 불필요한 wrapper div 없이 반복 렌더링할 때 유용합니다.\n *\n * @example\n * // 레이아웃 JSON 사용 예시\n * {\n * \"type\": \"basic\",\n * \"name\": \"Fragment\",\n * \"iterator\": {\n * \"source\": \"{{items}}\",\n * \"item\": \"item\"\n * },\n * \"children\": [\n * {\n * \"type\": \"basic\",\n * \"name\": \"Button\",\n * \"text\": \"{{item.label}}\"\n * }\n * ]\n * }\n */\nexport const Fragment: React.FC = ({ children }) => {\n return <>{children};\n};\n","import React from 'react';\n\nexport interface HrProps extends React.HTMLAttributes {}\n\n/**\n * 기본 hr(수평선) 컴포넌트\n */\nexport const Hr: React.FC = ({\n className = '',\n ...props\n}) => {\n return (\n \n );\n};\n","import React from 'react';\n\nexport interface IProps extends React.HTMLAttributes {\n className?: string;\n children?: React.ReactNode;\n style?: React.CSSProperties;\n}\n\n/**\n * I 기본 컴포넌트\n *\n * HTML 태그를 래핑한 기본 컴포넌트입니다.\n * 주로 아이콘 폰트 (FontAwesome 등)와 함께 사용됩니다.\n *\n * @example\n * ```tsx\n * \n * \n * ```\n */\nexport const I: React.FC = ({ className = '', children, style, ...props }) => {\n return (\n \n {children}\n \n );\n};","/**\n * Font Awesome 아이콘 스타일\n */\nexport type IconStyle = 'solid' | 'regular' | 'light' | 'duotone' | 'brands';\n\n/**\n * Font Awesome 아이콘 크기\n */\nexport type IconSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2x' | '3x' | '4x' | '5x';\n\n/**\n * 자주 사용되는 Font Awesome 아이콘 이름\n *\n * @example\n * // 사용 예시\n * \n * \n * \n */\nexport enum IconName {\n // 사용자 및 계정\n User = 'fa-user',\n Users = 'fa-users',\n UserCircle = 'fa-user-circle',\n UserPlus = 'fa-user-plus',\n UserMinus = 'fa-user-minus',\n UserShield = 'fa-user-shield',\n\n // 액션 아이콘\n Search = 'fa-search',\n Edit = 'fa-edit',\n Pencil = 'fa-pencil-alt',\n Trash = 'fa-trash',\n Save = 'fa-save',\n Plus = 'fa-plus',\n Minus = 'fa-minus',\n Check = 'fa-check',\n Times = 'fa-times',\n Download = 'fa-download',\n Upload = 'fa-upload',\n Copy = 'fa-copy',\n ExternalLink = 'fa-external-link-alt',\n\n // 네비게이션\n Home = 'fa-home',\n CaretRight = 'fa-caret-right',\n CaretDown = 'fa-caret-down',\n ChevronLeft = 'fa-chevron-left',\n ChevronRight = 'fa-chevron-right',\n ChevronUp = 'fa-chevron-up',\n ChevronDown = 'fa-chevron-down',\n AngleLeft = 'fa-angle-left',\n AngleRight = 'fa-angle-right',\n AngleUp = 'fa-angle-up',\n AngleDown = 'fa-angle-down',\n ArrowUp = 'fa-arrow-up',\n ArrowDown = 'fa-arrow-down',\n ArrowLeft = 'fa-arrow-left',\n ArrowRight = 'fa-arrow-right',\n Bars = 'fa-bars',\n EllipsisVertical = 'fa-ellipsis-v',\n EllipsisHorizontal = 'fa-ellipsis-h',\n\n // 상태 아이콘\n CheckCircle = 'fa-check-circle',\n TimesCircle = 'fa-times-circle',\n ExclamationCircle = 'fa-exclamation-circle',\n ExclamationTriangle = 'fa-exclamation-triangle',\n InfoCircle = 'fa-info-circle',\n QuestionCircle = 'fa-question-circle',\n XCircle = 'fa-times-circle',\n\n // 이커머스\n ShoppingCart = 'fa-shopping-cart',\n ShoppingBag = 'fa-shopping-bag',\n CreditCard = 'fa-credit-card',\n Tag = 'fa-tag',\n Tags = 'fa-tags',\n\n // 파일 및 문서\n File = 'fa-file',\n FileAlt = 'fa-file-alt',\n Folder = 'fa-folder',\n FolderOpen = 'fa-folder-open',\n\n // 통신\n Envelope = 'fa-envelope',\n Phone = 'fa-phone',\n Comment = 'fa-comment',\n Comments = 'fa-comments',\n\n // 설정\n Cog = 'fa-cog',\n Cogs = 'fa-cogs',\n Settings = 'fa-cog',\n Wrench = 'fa-wrench',\n Sliders = 'fa-sliders-h',\n\n // 미디어\n Image = 'fa-image',\n Images = 'fa-images',\n Video = 'fa-video',\n Camera = 'fa-camera',\n\n // 소셜\n Heart = 'fa-heart',\n Star = 'fa-star',\n ThumbsUp = 'fa-thumbs-up',\n ThumbsDown = 'fa-thumbs-down',\n Share = 'fa-share',\n\n // 시간\n Clock = 'fa-clock',\n Calendar = 'fa-calendar',\n CalendarAlt = 'fa-calendar-alt',\n\n // 기타\n Lock = 'fa-lock',\n Unlock = 'fa-unlock',\n Eye = 'fa-eye',\n EyeSlash = 'fa-eye-slash',\n Bell = 'fa-bell',\n Flag = 'fa-flag',\n Map = 'fa-map',\n MapMarker = 'fa-map-marker-alt',\n Globe = 'fa-globe',\n Link = 'fa-link',\n Unlink = 'fa-unlink',\n Sun = 'fa-sun',\n Moon = 'fa-moon',\n\n // 차트 및 통계\n ChartBar = 'fa-chart-bar',\n ChartLine = 'fa-chart-line',\n ChartPie = 'fa-chart-pie',\n ChartArea = 'fa-chart-area',\n\n // 스피너 (로딩)\n Spinner = 'fa-spinner',\n CircleNotch = 'fa-circle-notch',\n\n // 배지 아이콘\n CheckBadge = 'fa-badge-check',\n\n // 확장 시스템 (모듈/플러그인/템플릿)\n Cube = 'fa-cube',\n Cubes = 'fa-cubes',\n Plug = 'fa-plug',\n PuzzlePiece = 'fa-puzzle-piece',\n Palette = 'fa-palette',\n}\n\n/**\n * 문자열 아이콘 이름을 IconName enum으로 매핑합니다.\n * JSON 레이아웃에서 문자열로 아이콘 이름을 지정할 때 사용합니다.\n */\nexport const iconNameMap: Record = {\n // 사용자 및 계정\n 'user': IconName.User,\n 'users': IconName.Users,\n 'user-circle': IconName.UserCircle,\n 'user-plus': IconName.UserPlus,\n 'user-minus': IconName.UserMinus,\n 'user-shield': IconName.UserShield,\n\n // 액션 아이콘\n 'search': IconName.Search,\n 'edit': IconName.Edit,\n 'pencil': IconName.Pencil,\n 'trash': IconName.Trash,\n 'save': IconName.Save,\n 'plus': IconName.Plus,\n 'minus': IconName.Minus,\n 'check': IconName.Check,\n 'times': IconName.Times,\n 'download': IconName.Download,\n 'upload': IconName.Upload,\n 'copy': IconName.Copy,\n 'external-link': IconName.ExternalLink,\n\n // 네비게이션\n 'home': IconName.Home,\n 'caret-right': IconName.CaretRight,\n 'caret-down': IconName.CaretDown,\n 'chevron-left': IconName.ChevronLeft,\n 'chevron-right': IconName.ChevronRight,\n 'chevron-up': IconName.ChevronUp,\n 'chevron-down': IconName.ChevronDown,\n 'angle-left': IconName.AngleLeft,\n 'angle-right': IconName.AngleRight,\n 'angle-up': IconName.AngleUp,\n 'angle-down': IconName.AngleDown,\n 'arrow-up': IconName.ArrowUp,\n 'arrow-down': IconName.ArrowDown,\n 'arrow-left': IconName.ArrowLeft,\n 'arrow-right': IconName.ArrowRight,\n 'bars': IconName.Bars,\n 'ellipsis-vertical': IconName.EllipsisVertical,\n 'ellipsis-v': IconName.EllipsisVertical,\n 'ellipsis-horizontal': IconName.EllipsisHorizontal,\n 'ellipsis-h': IconName.EllipsisHorizontal,\n\n // 상태 아이콘\n 'check-circle': IconName.CheckCircle,\n 'times-circle': IconName.TimesCircle,\n 'x-circle': IconName.XCircle,\n 'exclamation-circle': IconName.ExclamationCircle,\n 'exclamation-triangle': IconName.ExclamationTriangle,\n 'info-circle': IconName.InfoCircle,\n 'question-circle': IconName.QuestionCircle,\n\n // 이커머스\n 'shopping-cart': IconName.ShoppingCart,\n 'shopping-bag': IconName.ShoppingBag,\n 'credit-card': IconName.CreditCard,\n 'tag': IconName.Tag,\n 'tags': IconName.Tags,\n\n // 파일 및 문서\n 'file': IconName.File,\n 'file-alt': IconName.FileAlt,\n 'folder': IconName.Folder,\n 'folder-open': IconName.FolderOpen,\n\n // 통신\n 'envelope': IconName.Envelope,\n 'phone': IconName.Phone,\n 'comment': IconName.Comment,\n 'comments': IconName.Comments,\n\n // 설정\n 'cog': IconName.Cog,\n 'cogs': IconName.Cogs,\n 'settings': IconName.Settings,\n 'wrench': IconName.Wrench,\n 'sliders': IconName.Sliders,\n\n // 미디어\n 'image': IconName.Image,\n 'images': IconName.Images,\n 'video': IconName.Video,\n 'camera': IconName.Camera,\n\n // 소셜\n 'heart': IconName.Heart,\n 'star': IconName.Star,\n 'thumbs-up': IconName.ThumbsUp,\n 'thumbs-down': IconName.ThumbsDown,\n 'share': IconName.Share,\n\n // 시간\n 'clock': IconName.Clock,\n 'calendar': IconName.Calendar,\n 'calendar-alt': IconName.CalendarAlt,\n\n // 기타\n 'lock': IconName.Lock,\n 'unlock': IconName.Unlock,\n 'eye': IconName.Eye,\n 'eye-slash': IconName.EyeSlash,\n 'bell': IconName.Bell,\n 'flag': IconName.Flag,\n 'map': IconName.Map,\n 'map-marker': IconName.MapMarker,\n 'globe': IconName.Globe,\n 'link': IconName.Link,\n 'unlink': IconName.Unlink,\n 'sun': IconName.Sun,\n 'moon': IconName.Moon,\n\n // 차트 및 통계\n 'chart-bar': IconName.ChartBar,\n 'chart-line': IconName.ChartLine,\n 'chart-pie': IconName.ChartPie,\n 'chart-area': IconName.ChartArea,\n\n // 스피너 (로딩)\n 'spinner': IconName.Spinner,\n 'circle-notch': IconName.CircleNotch,\n\n // 배지 아이콘\n 'check-badge': IconName.CheckBadge,\n 'badge-check': IconName.CheckBadge,\n\n // 확장 시스템 (모듈/플러그인/템플릿)\n 'cube': IconName.Cube,\n 'cubes': IconName.Cubes,\n 'plug': IconName.Plug,\n 'puzzle-piece': IconName.PuzzlePiece,\n 'palette': IconName.Palette,\n};\n","import React from 'react';\nimport { Div } from '../basic/Div';\nimport { H2 } from '../basic/H2';\nimport { P } from '../basic/P';\nimport { Img } from '../basic/Img';\nimport type { EditorAttrs } from '../../types';\n\nexport interface CardProps {\n title?: string;\n content?: string;\n imageUrl?: string;\n imageAlt?: string;\n className?: string;\n onClick?: () => void;\n style?: React.CSSProperties;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * Card 집합 컴포넌트\n *\n * 기본 컴포넌트를 조합하여 카드 UI를 구성합니다.\n * 레이아웃 JSON에서 title, content, imageUrl 등의 props만 전달하면\n * 내부적으로 Div, H2, P, Img 컴포넌트를 조합하여 완성된 카드를 렌더링합니다.\n *\n * @example\n * // 레이아웃 JSON 사용 예시\n * {\n * \"name\": \"Card\",\n * \"props\": {\n * \"title\": \"사용자 정보\",\n * \"content\": \"홍길동 (hong@example.com)\",\n * \"imageUrl\": \"/avatar.png\"\n * }\n * }\n */\nexport const Card: React.FC = ({\n title,\n content,\n imageUrl,\n imageAlt = '',\n className = '',\n onClick,\n style,\n id,\n editorAttrs,\n}) => {\n return (\n \n {imageUrl && (\n
\n \n
\n )}\n\n
\n {title && (\n

\n {title}\n

\n )}\n\n {content && (\n

\n {content}\n

\n )}\n
\n
\n );\n};\n","import React, { useState, useRef, useEffect, useCallback } from 'react';\nimport ReactDOM from 'react-dom';\nimport { Button } from '../basic/Button';\nimport { Div } from '../basic/Div';\nimport { Span } from '../basic/Span';\nimport { Icon } from '../basic/Icon';\nimport { IconName } from '../basic/IconTypes';\nimport type { EditorAttrs } from '../../types';\n\nexport interface ActionMenuItem {\n id: string | number;\n label?: string;\n iconName?: IconName;\n onClick?: () => void;\n disabled?: boolean;\n variant?: 'default' | 'danger';\n /** 구분선 여부 (true면 구분선으로 렌더링) */\n divider?: boolean;\n /** 행 데이터의 필드 경로로 disabled 여부를 결정 (값이 falsy면 disabled) */\n disabledField?: string;\n /** 조건부 표시 (false면 아이템 숨김, 엔진이 표현식 평가 후 boolean 전달) */\n if?: boolean;\n}\n\nexport interface ActionMenuProps {\n items: ActionMenuItem[];\n triggerLabel?: string;\n triggerIconName?: IconName;\n position?: 'left' | 'right';\n className?: string;\n style?: React.CSSProperties;\n /**\n * 커스텀 트리거 콘텐츠\n *\n * children이 제공되면 기본 Button 트리거 대신 children을 클릭 트리거로 사용합니다.\n * 레이아웃 JSON에서 ActionMenu의 children으로 정의한 컴포넌트가 트리거가 됩니다.\n */\n children?: React.ReactNode;\n /**\n * 메뉴 아이템 클릭 시 호출되는 콜백\n * JSON 레이아웃의 actions에서 onItemClick 이벤트로 바인딩됨\n *\n * @param itemId - 클릭된 아이템의 id\n * @param item - 클릭된 아이템 전체 객체\n */\n onItemClick?: (itemId: string | number, item: ActionMenuItem) => void;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * ActionMenu 집합 컴포넌트\n *\n * 드롭다운 형태의 액션 메뉴 컴포넌트입니다.\n * 트리거 버튼과 메뉴 아이템 목록을 제공합니다.\n *\n * 기본 컴포넌트 조합: Button + Div + Span + Icon\n *\n * @example\n * // 레이아웃 JSON 사용 예시\n * {\n * \"name\": \"ActionMenu\",\n * \"props\": {\n * \"triggerLabel\": \"작업\",\n * \"items\": [\n * {\"id\": 1, \"label\": \"수정\", \"iconName\": \"pencil\"},\n * {\"id\": 2, \"label\": \"삭제\", \"iconName\": \"trash\", \"variant\": \"danger\"}\n * ]\n * }\n * }\n */\nexport const ActionMenu: React.FC = ({\n items,\n triggerLabel = '작업',\n triggerIconName = IconName.EllipsisVertical,\n position = 'right',\n className = '',\n style,\n children,\n onItemClick,\n id,\n editorAttrs,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const [menuPosition, setMenuPosition] = useState({ top: 0, left: 0 });\n const triggerRef = useRef(null);\n const menuRef = useRef(null);\n\n // 메뉴 위치 계산\n const updateMenuPosition = useCallback(() => {\n if (!triggerRef.current) return;\n\n const rect = triggerRef.current.getBoundingClientRect();\n const menuWidth = 224; // w-56 = 14rem = 224px\n\n let left = position === 'right' ? rect.right - menuWidth : rect.left;\n const top = rect.bottom + 8; // mt-2 = 8px\n\n // 화면 왼쪽 경계 체크\n if (left < 8) {\n left = 8;\n }\n\n // 화면 오른쪽 경계 체크\n if (left + menuWidth > window.innerWidth - 8) {\n left = window.innerWidth - menuWidth - 8;\n }\n\n setMenuPosition({ top, left });\n }, [position]);\n\n // 메뉴 열릴 때 위치 계산\n useEffect(() => {\n if (isOpen) {\n updateMenuPosition();\n }\n }, [isOpen, updateMenuPosition]);\n\n // 스크롤/리사이즈 시 메뉴 닫기\n useEffect(() => {\n if (!isOpen) return;\n\n const handleScrollOrResize = () => {\n setIsOpen(false);\n };\n\n window.addEventListener('scroll', handleScrollOrResize, true);\n window.addEventListener('resize', handleScrollOrResize);\n\n return () => {\n window.removeEventListener('scroll', handleScrollOrResize, true);\n window.removeEventListener('resize', handleScrollOrResize);\n };\n }, [isOpen]);\n\n // 외부 클릭 감지\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node;\n const isClickInsideTrigger = triggerRef.current?.contains(target);\n const isClickInsideMenu = menuRef.current?.contains(target);\n\n if (!isClickInsideTrigger && !isClickInsideMenu) {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n }\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isOpen]);\n\n const handleItemClick = (item: ActionMenuItem) => {\n if (item.disabled) return;\n\n // 1. 개별 아이템의 onClick 콜백 호출 (우선)\n if (item.onClick) {\n item.onClick();\n }\n\n // 2. 통합 onItemClick 콜백 호출 (JSON 레이아웃 actions 바인딩)\n if (onItemClick) {\n onItemClick(item.id, item);\n }\n\n setIsOpen(false);\n };\n\n // Portal로 렌더링할 드롭다운 메뉴\n const dropdownMenu = isOpen\n ? ReactDOM.createPortal(\n \n {items.filter((item) => item.if !== false).map((item) => {\n // 구분선인 경우\n if (item.divider) {\n return (\n \n );\n }\n\n const variantClasses =\n item.variant === 'danger'\n ? 'text-red-600 dark:text-red-400 hover:bg-red-50 dark:hover:bg-red-900/20'\n : 'text-gray-700 dark:text-gray-300 hover:bg-gray-50 dark:hover:bg-gray-700';\n\n const disabledClasses = item.disabled\n ? 'opacity-50 cursor-not-allowed'\n : 'cursor-pointer';\n\n return (\n handleItemClick(item)}\n className={`flex items-center gap-3 px-4 py-3 transition-colors ${variantClasses} ${disabledClasses}`}\n >\n {item.iconName && (\n \n )}\n {item.label}\n
\n );\n })}\n
,\n document.body\n )\n : null;\n\n return (\n
\n {/* 트리거: children이 있으면 커스텀 트리거, 없으면 기본 Button */}\n {children ? (\n }\n onClick={() => setIsOpen(!isOpen)}\n className=\"cursor-pointer\"\n >\n {children}\n
\n ) : (\n }\n onClick={() => setIsOpen(!isOpen)}\n className=\"flex items-center gap-2 px-2 py-1 bg-transparent hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg transition-colors\"\n >\n {triggerLabel && (\n \n {triggerLabel}\n \n )}\n {triggerIconName && (\n \n )}\n \n )}\n\n {/* Portal로 렌더링되는 드롭다운 메뉴 */}\n {dropdownMenu}\n
\n );\n};\n","import React, { useMemo } from 'react';\nimport { Div } from '../basic/Div';\nimport { Button } from '../basic/Button';\nimport { Span } from '../basic/Span';\nimport type { EditorAttrs } from '../../types';\n\n// G7Core.t() 번역 함수 참조\nconst t = (key: string, params?: Record) =>\n (window as any).G7Core?.t?.(key, params) ?? key;\n\nexport interface PaginationProps {\n currentPage: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n maxVisiblePages?: number;\n showFirstLast?: boolean;\n className?: string;\n style?: React.CSSProperties;\n prevText?: string;\n nextText?: string;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * Pagination 집합 컴포넌트\n *\n * Button + Span 기본 컴포넌트를 조합하여 페이지네이션 UI를 구성합니다.\n * 페이지 번호 생성 알고리즘을 포함하며, 많은 페이지 수에 대해 효율적으로 렌더링합니다.\n *\n * @example\n * // 레이아웃 JSON 사용 예시\n * {\n * \"name\": \"Pagination\",\n * \"props\": {\n * \"currentPage\": \"{{pagination.current}}\",\n * \"totalPages\": \"{{pagination.total}}\",\n * \"maxVisiblePages\": 5,\n * \"showFirstLast\": true\n * }\n * }\n */\nexport const Pagination: React.FC = ({\n currentPage,\n totalPages,\n onPageChange,\n maxVisiblePages = 5,\n showFirstLast = true,\n className = '',\n style,\n prevText,\n nextText,\n id,\n editorAttrs,\n}) => {\n\n // 페이지 번호 생성 알고리즘\n const pageNumbers = useMemo(() => {\n const pages: (number | string)[] = [];\n\n if (totalPages <= maxVisiblePages + 2) {\n // 페이지가 적으면 모두 표시\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i);\n }\n } else {\n // 페이지가 많으면 축약 표시\n const halfVisible = Math.floor(maxVisiblePages / 2);\n\n let startPage = Math.max(2, currentPage - halfVisible);\n let endPage = Math.min(totalPages - 1, currentPage + halfVisible);\n\n // 시작 또는 끝 근처일 때 조정\n if (currentPage <= halfVisible + 1) {\n endPage = maxVisiblePages;\n } else if (currentPage >= totalPages - halfVisible) {\n startPage = totalPages - maxVisiblePages + 1;\n }\n\n // 첫 페이지\n pages.push(1);\n\n // 시작 생략 부호\n if (startPage > 2) {\n pages.push('...');\n }\n\n // 중간 페이지들\n for (let i = startPage; i <= endPage; i++) {\n pages.push(i);\n }\n\n // 끝 생략 부호\n if (endPage < totalPages - 1) {\n pages.push('...');\n }\n\n // 마지막 페이지\n if (totalPages > 1) {\n pages.push(totalPages);\n }\n }\n\n return pages;\n }, [currentPage, totalPages, maxVisiblePages]);\n\n const handlePageClick = (page: number) => {\n if (page < 1 || page > totalPages || page === currentPage) return;\n onPageChange(page);\n };\n\n const handlePrevious = () => {\n if (currentPage > 1) {\n onPageChange(currentPage - 1);\n }\n };\n\n const handleNext = () => {\n if (currentPage < totalPages) {\n onPageChange(currentPage + 1);\n }\n };\n\n return (\n \n {/* First Button */}\n {showFirstLast && (\n handlePageClick(1)}\n disabled={currentPage === 1}\n className=\"pagination-btn\"\n aria-label={t('common.first_page')}\n >\n «\n \n )}\n\n {/* Previous Button */}\n \n {prevText || <>‹}\n \n\n {/* Page Numbers */}\n
\n {pageNumbers.map((page, index) => {\n if (page === '...') {\n return (\n \n ...\n \n );\n }\n\n const pageNum = page as number;\n const isActive = pageNum === currentPage;\n\n return (\n handlePageClick(pageNum)}\n className={isActive ? 'pagination-btn-active' : 'pagination-btn'}\n aria-label={t('common.page_n', { n: pageNum })}\n aria-current={isActive ? 'page' : undefined}\n >\n {pageNum}\n \n );\n })}\n
\n\n {/* Next Button */}\n \n {nextText || <>›}\n \n\n {/* Last Button */}\n {showFirstLast && (\n handlePageClick(totalPages)}\n disabled={currentPage === totalPages}\n className=\"pagination-btn\"\n aria-label={t('common.last_page')}\n >\n »\n \n )}\n
\n );\n};\n","// e2e:allow 외형 시맨틱 통일 시범 작업 — 동작 변화 없음. 패턴 확정 후 다음 사이클에 E2E spec 일괄 작성 예정.\nimport React, { useState, useCallback, useMemo, useEffect, useRef } from 'react';\nimport { Input } from '../basic/Input';\nimport { Textarea } from '../basic/Textarea';\nimport { Button } from '../basic/Button';\nimport { Div } from '../basic/Div';\nimport { Span } from '../basic/Span';\nimport { Icon } from '../basic/Icon';\nimport type { EditorAttrs } from '../../types';\n\n// G7Core.t() 번역 함수 참조\nconst t = (key: string, params?: Record) =>\n (window as any).G7Core?.t?.(key, params) ?? key;\n\n// G7Core에서 지원 언어 목록 가져오기\nconst getSupportedLocales = (): string[] => {\n return (window as any).G7Core?.locale?.supported?.() ?? ['ko', 'en'];\n};\n\n// G7Core에서 현재 언어 가져오기\nconst getCurrentLocale = (): string => {\n return (window as any).G7Core?.locale?.current?.() ?? 'ko';\n};\n\n// 언어 코드로 언어명 가져오기 (다국어 키 사용)\nconst getLocaleNameByCode = (code: string): string => {\n // 다국어 키에서 언어명 가져오기 (common.language_ko, common.language_en 등)\n const translatedName = t(`common.language_${code}`);\n\n // 번역이 키 그대로 반환되면 (번역 없음) fallback 맵 사용\n if (translatedName === `common.language_${code}`) {\n const fallbackNames: Record = {\n ko: '한국어',\n en: 'English',\n ja: '日本語',\n zh: '中文',\n };\n return fallbackNames[code] || code.toUpperCase();\n }\n\n return translatedName;\n};\n\n// 시스템 언어 목록을 LocaleOption[]으로 변환\nconst getSystemLocaleOptions = (): LocaleOption[] => {\n const supportedLocales = getSupportedLocales();\n return supportedLocales.map(code => ({\n code,\n name: getLocaleNameByCode(code),\n nativeName: getLocaleNameByCode(code),\n }));\n};\n\nexport interface MultilingualValue {\n [locale: string]: string;\n}\n\nexport interface LocaleOption {\n code: string;\n name: string;\n nativeName?: string;\n}\n\nexport type MultilingualInputType = 'text' | 'textarea';\nexport type MultilingualInputLayout = 'inline' | 'tabs' | 'compact';\n\nexport interface MultilingualInputProps {\n /** 다국어 값 객체 */\n value?: MultilingualValue;\n /** 값 변경 콜백 */\n onChange?: (event: any) => void;\n /** 입력 타입 (text | textarea) */\n inputType?: MultilingualInputType;\n /** 레이아웃 타입 (inline: 모든 언어 수직 표시 | tabs: 탭 전환 방식 | compact: 탭과 입력이 한 줄) */\n layout?: MultilingualInputLayout;\n /** 사용 가능한 언어 목록 */\n availableLocales?: LocaleOption[];\n /** 기본 언어 코드 */\n defaultLocale?: string;\n /** 입력창 placeholder */\n placeholder?: string;\n /** 필수 입력 여부 */\n required?: boolean;\n /** 비활성화 여부 */\n disabled?: boolean;\n /** 최대 길이 */\n maxLength?: number;\n /** textarea 행 수 (inputType이 'textarea'일 때만 사용) */\n rows?: number;\n /** 추가 className */\n className?: string;\n /** input name */\n name?: string;\n /** 모바일에서 언어 코드로 표시 (기본값: false) */\n showCodeOnMobile?: boolean;\n /** 에러 메시지 (입력 필드에 적색 테두리 표시) */\n error?: string;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * 다국어 입력 컴포넌트\n *\n * 두 가지 레이아웃 모드를 지원합니다:\n * - inline (기본): 카드 형태로 모든 언어를 수직으로 쌓아서 표시\n * - tabs: 탭 방식으로 언어 전환 (카드 형태)\n */\nexport const MultilingualInput: React.FC = ({\n value = {},\n onChange,\n inputType = 'text',\n layout = 'inline',\n availableLocales,\n defaultLocale,\n placeholder = '',\n required = false,\n disabled = false,\n maxLength,\n rows = 4,\n className = '',\n name = 'multilingual_input',\n showCodeOnMobile = false,\n error,\n id,\n editorAttrs,\n}) => {\n\n // 에러 상태 여부\n const hasError = !!error;\n // G7Core에서 실제 사용할 언어 목록과 기본 언어 계산\n const actualAvailableLocales = useMemo(() => {\n return availableLocales ?? getSystemLocaleOptions();\n }, [availableLocales]);\n\n const actualDefaultLocale = useMemo(() => {\n return defaultLocale ?? getCurrentLocale();\n }, [defaultLocale]);\n\n // ── 로컬 상태 버퍼 (debounce 대기 중 사용자 입력값 보존) ──\n // props.value는 debounce가 fire된 후에야 갱신되므로,\n // locale 탭 전환 시 stale props.value로 렌더링되어 입력값이 유실됨.\n // localValue는 사용자 입력을 즉시 반영하고, props.value 갱신 시 동기화함.\n const localValueRef = useRef(value);\n const [localValue, setLocalValue] = useState(value);\n\n // props.value의 이전 내용을 추적 — 내용 기반 비교로 불필요한 동기화 방지\n const lastExternalValueRef = useRef(JSON.stringify(value));\n\n // props.value 외부 변경 시 로컬 상태 동기화\n // 동일 내용의 새 객체 참조(부모 rerender)는 무시하여 로컬 편집분 보존\n useEffect(() => {\n const valueStr = JSON.stringify(value);\n if (valueStr !== lastExternalValueRef.current) {\n lastExternalValueRef.current = valueStr;\n localValueRef.current = value;\n setLocalValue(value);\n }\n }, [value]);\n\n // 공통 onChange 호출 헬퍼\n const emitChange = useCallback((newValue: MultilingualValue, changedKeys?: string[]) => {\n const event: any = {\n target: {\n name,\n value: newValue,\n },\n };\n // _changedKeys: 엔진 디바운스 병합에서 stale closure로 인한 키 유실 방지\n if (changedKeys) {\n event._changedKeys = changedKeys;\n }\n onChange?.(event);\n }, [onChange, name]);\n\n // 활성화된 언어 탭 목록 (기본 언어는 항상 포함)\n const [activeLocales, setActiveLocales] = useState(() => {\n // tabs/compact 레이아웃일 때는 모든 지원 로케일을 표시\n if (layout === 'tabs' || layout === 'compact') {\n const supportedCodes = actualAvailableLocales.map(l => l.code);\n // 기본 언어를 맨 앞에 배치\n const sorted = [actualDefaultLocale, ...supportedCodes.filter(c => c !== actualDefaultLocale)];\n return sorted;\n }\n\n const valueKeys = Object.keys(value).filter(key => value[key] !== undefined);\n\n if (valueKeys.length === 0) {\n return [actualDefaultLocale];\n }\n\n // 기본 언어를 맨 앞에 배치\n const locales: string[] = [];\n\n // 1. 기본 언어가 있으면 맨 앞에 추가\n if (valueKeys.includes(actualDefaultLocale)) {\n locales.push(actualDefaultLocale);\n }\n\n // 2. 나머지 언어들 추가 (기본 언어 제외)\n valueKeys.forEach(key => {\n if (key !== actualDefaultLocale) {\n locales.push(key);\n }\n });\n\n return locales;\n });\n\n // 현재 선택된 언어 탭 (tabs 레이아웃용)\n const [currentLocale, setCurrentLocale] = useState(actualDefaultLocale);\n\n // 추가 가능한 언어 목록 (이미 활성화된 언어 제외)\n const addableLocales = useMemo(() => {\n return actualAvailableLocales.filter(locale => !activeLocales.includes(locale.code));\n }, [actualAvailableLocales, activeLocales]);\n\n // 언어 추가 드롭다운 표시 여부\n const [showAddMenu, setShowAddMenu] = useState(false);\n\n // value prop이 변경될 때 activeLocales 동기화\n useEffect(() => {\n // tabs/compact 레이아웃일 때는 항상 모든 지원 로케일 유지\n if (layout === 'tabs' || layout === 'compact') {\n const supportedCodes = actualAvailableLocales.map(l => l.code);\n const sorted = [actualDefaultLocale, ...supportedCodes.filter(c => c !== actualDefaultLocale)];\n const currentStr = activeLocales.join(',');\n const newStr = sorted.join(',');\n if (currentStr !== newStr) {\n setActiveLocales(sorted);\n }\n return;\n }\n\n const valueKeys = Object.keys(value).filter(key => value[key] !== undefined);\n\n // value가 비어있거나 모든 값이 빈 문자열이면 기본 언어만 표시\n if (valueKeys.length === 0) {\n setActiveLocales([actualDefaultLocale]);\n return;\n }\n\n // value에 있는 언어들로 activeLocales 구성\n // 기본 언어를 맨 앞에 배치\n const newLocales: string[] = [];\n\n // 1. 기본 언어가 있으면 맨 앞에 추가\n if (valueKeys.includes(actualDefaultLocale)) {\n newLocales.push(actualDefaultLocale);\n }\n\n // 2. 나머지 언어들 추가 (기본 언어 제외)\n valueKeys.forEach(key => {\n if (key !== actualDefaultLocale) {\n newLocales.push(key);\n }\n });\n\n // 순서를 유지하면서 비교하여 변경되었을 때만 업데이트\n const currentStr = activeLocales.join(',');\n const newStr = newLocales.join(',');\n\n if (currentStr !== newStr) {\n setActiveLocales(newLocales);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [value, actualDefaultLocale, layout, actualAvailableLocales]);\n\n // 언어 입력값 변경 핸들러\n // localValueRef 사용: debounce 대기 중에도 최신 입력값 기반으로 병합\n const handleInputChange = useCallback((locale: string, inputValue: string) => {\n const newValue = {\n ...localValueRef.current,\n [locale]: inputValue,\n };\n localValueRef.current = newValue;\n setLocalValue(newValue);\n emitChange(newValue, [locale]);\n }, [emitChange]);\n\n // 언어 탭 추가\n const handleAddLocale = useCallback((localeCode: string) => {\n setActiveLocales(prev => [...prev, localeCode]);\n setCurrentLocale(localeCode);\n setShowAddMenu(false);\n\n // 새 언어 필드를 빈 문자열로 초기화\n const newValue = {\n ...localValueRef.current,\n [localeCode]: '',\n };\n localValueRef.current = newValue;\n setLocalValue(newValue);\n emitChange(newValue);\n }, [emitChange]);\n\n // 언어 탭 제거\n const handleRemoveLocale = useCallback((localeCode: string) => {\n // 기본 언어는 제거 불가\n if (localeCode === actualDefaultLocale) return;\n\n setActiveLocales(prev => prev.filter(code => code !== localeCode));\n\n // 제거된 언어가 현재 선택된 언어면 기본 언어로 전환\n if (currentLocale === localeCode) {\n setCurrentLocale(actualDefaultLocale);\n }\n\n // value에서 해당 언어 제거\n const newValue = { ...localValueRef.current };\n delete newValue[localeCode];\n localValueRef.current = newValue;\n setLocalValue(newValue);\n emitChange(newValue);\n }, [currentLocale, actualDefaultLocale, emitChange]);\n\n // 언어명 표시\n const getLocaleName = useCallback((localeCode: string) => {\n const locale = actualAvailableLocales.find(l => l.code === localeCode);\n return locale?.nativeName || locale?.name || localeCode.toUpperCase();\n }, [actualAvailableLocales]);\n\n // 입력 필드가 채워져 있는지 확인\n const hasValue = useCallback((localeCode: string) => {\n return Boolean(localValue[localeCode]?.trim());\n }, [localValue]);\n\n // 언어 추가 버튼 렌더링 (Pill Badge 스타일)\n const renderAddLocaleButtonCompact = useCallback(() => {\n if (addableLocales.length === 0) return null;\n\n return (\n
\n setShowAddMenu(!showAddMenu)}\n disabled={disabled}\n >\n \n {t('common.add_language')}\n \n\n {showAddMenu && (\n
\n {addableLocales.map(locale => (\n handleAddLocale(locale.code)}\n >\n \n {locale.nativeName || locale.name}\n \n ))}\n
\n )}\n
\n );\n }, [addableLocales, showAddMenu, disabled, handleAddLocale]);\n\n // 입력 필드 렌더링 (라벨 위에 표시) - Pill Badge 스타일\n const renderInputFieldWithTopLabel = useCallback((localeCode: string, showAddButton: boolean = false) => {\n const inputSemanticClassName = hasError ? 'input input-error' : 'input';\n const textareaSemanticClassName = hasError ? 'textarea input-error' : 'textarea';\n const isDefault = localeCode === actualDefaultLocale;\n const localizedPlaceholder = `${placeholder}${placeholder ? ' (' : ''}${getLocaleName(localeCode)}${placeholder ? ')' : ''}`;\n\n return (\n
\n {/* 언어 배지 (Pill Badge 스타일) */}\n
\n \n {/* 다국어 아이콘 */}\n \n {getLocaleName(localeCode)}\n {isDefault && *}\n {/* 비기본 언어 삭제 버튼 - 배지 안에 */}\n {!isDefault && (\n handleRemoveLocale(localeCode)}\n disabled={disabled}\n >\n \n \n )}\n \n {/* 기본 언어 옆에 추가 버튼 */}\n {isDefault && showAddButton && renderAddLocaleButtonCompact()}\n
\n\n {/* 입력 필드 */}\n {inputType === 'textarea' ? (\n handleInputChange(localeCode, e.target.value)}\n placeholder={localizedPlaceholder}\n required={required && isDefault}\n disabled={disabled}\n maxLength={maxLength}\n rows={rows}\n className={`${textareaSemanticClassName} resize-vertical`}\n />\n ) : (\n handleInputChange(localeCode, e.target.value)}\n placeholder={localizedPlaceholder}\n required={required && isDefault}\n disabled={disabled}\n maxLength={maxLength}\n className={inputSemanticClassName}\n />\n )}\n
\n );\n }, [name, localValue, handleInputChange, placeholder, required, disabled, maxLength, rows, inputType, getLocaleName, actualDefaultLocale, handleRemoveLocale, renderAddLocaleButtonCompact, hasError]);\n\n // 입력 필드 렌더링 (라벨 없음 버전 - tabs용)\n const renderInputField = useCallback((localeCode: string) => {\n const inputSemanticClassName = hasError ? 'input input-error' : 'input';\n const textareaSemanticClassName = hasError ? 'textarea input-error' : 'textarea';\n const localizedPlaceholder = `${placeholder}${placeholder ? ' (' : ''}${getLocaleName(localeCode)}${placeholder ? ')' : ''}`;\n\n return (\n
\n {inputType === 'textarea' ? (\n handleInputChange(localeCode, e.target.value)}\n placeholder={localizedPlaceholder}\n required={required && localeCode === actualDefaultLocale}\n disabled={disabled}\n maxLength={maxLength}\n rows={rows}\n className={`${textareaSemanticClassName} resize-vertical`}\n />\n ) : (\n handleInputChange(localeCode, e.target.value)}\n placeholder={localizedPlaceholder}\n required={required && localeCode === actualDefaultLocale}\n disabled={disabled}\n maxLength={maxLength}\n className={inputSemanticClassName}\n />\n )}\n
\n );\n }, [name, localValue, handleInputChange, placeholder, required, disabled, maxLength, rows, inputType, actualDefaultLocale, getLocaleName, hasError]);\n\n // Inline 레이아웃 렌더링\n const renderInlineLayout = () => (\n
\n {/* 입력 필드들 */}\n
\n {activeLocales.map((localeCode, index) =>\n renderInputFieldWithTopLabel(localeCode, index === 0)\n )}\n
\n
\n );\n\n // Tabs 레이아웃 렌더링 - Pill Badge 스타일\n const renderTabsLayout = () => (\n
\n {/* 언어 탭들 + 추가 버튼 (Pill Badge 스타일) */}\n
\n {activeLocales.map(localeCode => (\n setCurrentLocale(localeCode)}\n >\n {/* 다국어 아이콘 */}\n \n {/* showCodeOnMobile: 모바일에서는 언어 코드, 데스크탑에서는 전체 언어명 표시 */}\n {showCodeOnMobile ? (\n <>\n {getLocaleName(localeCode)}\n {localeCode.toUpperCase()}\n \n ) : (\n getLocaleName(localeCode)\n )}\n {localeCode === actualDefaultLocale && (\n *\n )}\n {/* 입력 완료 표시 */}\n {hasValue(localeCode) && currentLocale !== localeCode && (\n \n )}\n {/* 삭제 버튼 (기본 언어 제외) - 배지 안에 */}\n {localeCode !== actualDefaultLocale && (\n {\n e.stopPropagation();\n handleRemoveLocale(localeCode);\n }}\n disabled={disabled}\n >\n \n \n )}\n \n ))}\n\n {/* 언어 추가 버튼 */}\n {renderAddLocaleButtonCompact()}\n
\n\n {/* 입력 필드 */}\n {activeLocales.map(localeCode => (\n \n {renderInputField(localeCode)}\n
\n ))}\n
\n );\n\n // Compact 레이아웃 렌더링 - 언어 선택과 입력 필드가 한 줄에 배치\n const renderCompactLayout = () => {\n const inputSemanticClassName = hasError ? 'input input-error' : 'input';\n const textareaSemanticClassName = hasError ? 'textarea input-error' : 'textarea';\n\n return (\n
\n
\n {/* 언어 선택 버튼들 - 컴팩트 스타일 */}\n
\n {activeLocales.map(localeCode => (\n setCurrentLocale(localeCode)}\n title={getLocaleName(localeCode)}\n >\n {localeCode.toUpperCase()}\n {localeCode === actualDefaultLocale && (\n *\n )}\n \n ))}\n
\n\n {/* 입력 필드 - flex-1로 나머지 공간 차지 */}\n
\n {inputType === 'textarea' ? (\n handleInputChange(currentLocale, e.target.value)}\n placeholder={placeholder}\n required={required && currentLocale === actualDefaultLocale}\n disabled={disabled}\n maxLength={maxLength}\n rows={rows}\n className={textareaSemanticClassName}\n />\n ) : (\n handleInputChange(currentLocale, e.target.value)}\n placeholder={placeholder}\n required={required && currentLocale === actualDefaultLocale}\n disabled={disabled}\n maxLength={maxLength}\n className={inputSemanticClassName}\n />\n )}\n
\n
\n
\n );\n };\n\n // 레이아웃에 따라 렌더링\n return (\n
\n {layout === 'compact' ? renderCompactLayout() : layout === 'tabs' ? renderTabsLayout() : renderInlineLayout()}\n {/* 에러 메시지 표시 */}\n {hasError && error && (\n \n {error}\n \n )}\n
\n );\n};\n\nMultilingualInput.displayName = 'MultilingualInput';\n","import React, { useState, useEffect } from 'react';\nimport type { EditorAttrs } from '../../types';\n\n/**\n * G7Core 전역 객체 접근 헬퍼\n * 런타임에 접근하여 테스트 환경에서도 모킹이 적용되도록 함\n */\nconst getG7Core = () => (window as any).G7Core;\n\nexport interface ToggleProps {\n /** 체크 상태 */\n checked?: boolean;\n /** 체크 상태 변경 콜백 (boolean 또는 ChangeEvent 받음) */\n onChange?: ((checked: boolean) => void) | ((e: React.ChangeEvent) => void);\n /** 비활성화 여부 */\n disabled?: boolean;\n /** 라벨 텍스트 */\n label?: string;\n /** 설명 텍스트 */\n description?: string;\n /** 토글 크기 */\n size?: 'sm' | 'md' | 'lg';\n /** 추가 className */\n className?: string;\n /** name 속성 */\n name?: string;\n /** 값 (checked의 대체) */\n value?: boolean;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * Toggle 스위치 컴포넌트\n *\n * Flowbite 스타일의 토글 스위치입니다.\n * 라이트/다크 모드를 모두 지원합니다.\n * 반응형으로 prop 변경을 추적합니다.\n */\nexport const Toggle: React.FC = ({\n checked: checkedProp,\n value: valueProp,\n onChange,\n disabled = false,\n label,\n description,\n size = 'md',\n className = '',\n name,\n id,\n editorAttrs,\n}) => {\n // 내부 상태로 관리\n const [checked, setChecked] = useState(() => checkedProp ?? valueProp ?? false);\n\n // prop 변경 시 내부 상태 동기화\n useEffect(() => {\n const newValue = checkedProp ?? valueProp ?? false;\n setChecked(newValue);\n }, [checkedProp, valueProp]);\n\n const handleChange = (e: React.ChangeEvent) => {\n const newChecked = e.target.checked;\n\n // 내부 상태 즉시 업데이트\n setChecked(newChecked);\n\n if (onChange && !disabled) {\n // 템플릿 엔진의 actions는 이벤트 객체를 받으므로 항상 이벤트로 전달\n (onChange as any)(e);\n }\n };\n\n // 크기별 클래스\n const sizeClasses = {\n sm: {\n track: 'w-9 h-5',\n thumb: 'after:h-4 after:w-4',\n },\n md: {\n track: 'w-11 h-6',\n thumb: 'after:h-5 after:w-5',\n },\n lg: {\n track: 'w-14 h-7',\n thumb: 'after:h-6 after:w-6',\n },\n };\n\n const currentSize = sizeClasses[size];\n\n const handleToggleClick = () => {\n if (!disabled) {\n const newChecked = !checked;\n setChecked(newChecked);\n if (onChange) {\n const G7Core = getG7Core();\n if (G7Core?.createChangeEvent) {\n (onChange as any)(G7Core.createChangeEvent({ checked: newChecked, name }));\n }\n }\n }\n };\n\n return (\n
\n {/* 토글 스위치 */}\n {\n e.preventDefault();\n e.stopPropagation();\n handleToggleClick();\n }}\n >\n \n
\n
\n\n {/* 라벨 (토글 옆) */}\n {label && (\n \n {label}\n \n )}\n\n {/* 디스크립션 (다음 줄) */}\n {description &&

{description}

}\n
\n );\n};\n","import React from 'react';\nimport { Span } from '../basic/Span';\nimport { Icon } from '../basic/Icon';\nimport { IconName } from '../basic/IconTypes';\nimport type { EditorAttrs } from '../../types';\n\nexport type StatusType = 'success' | 'warning' | 'error' | 'info' | 'pending' | 'default';\n\nexport interface StatusBadgeProps {\n status: StatusType;\n label?: string;\n showIcon?: boolean;\n iconName?: IconName;\n className?: string;\n style?: React.CSSProperties;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * StatusBadge 집합 컴포넌트\n *\n * 상태별 색상 매핑을 지원하는 뱃지 컴포넌트입니다.\n * 상태에 따라 색상과 아이콘이 자동으로 매핑됩니다.\n *\n * 기본 컴포넌트 조합: Span + Icon\n *\n * @example\n * // 레이아웃 JSON 사용 예시\n * {\n * \"name\": \"StatusBadge\",\n * \"props\": {\n * \"status\": \"success\",\n * \"label\": \"완료\",\n * \"showIcon\": true\n * }\n * }\n */\nexport const StatusBadge: React.FC = ({\n status,\n label,\n showIcon = true,\n iconName,\n className = '',\n style,\n id,\n editorAttrs,\n}) => {\n // 상태별 스타일 매핑\n const statusStyles: Record = {\n success: 'bg-green-50 dark:bg-green-900/20 text-green-700 dark:text-green-400 border-green-200 dark:border-green-800',\n warning: 'bg-yellow-50 dark:bg-yellow-900/20 text-yellow-700 dark:text-yellow-400 border-yellow-200 dark:border-yellow-800',\n error: 'bg-red-50 dark:bg-red-900/20 text-red-700 dark:text-red-400 border-red-200 dark:border-red-800',\n info: 'bg-blue-50 dark:bg-blue-900/20 text-blue-700 dark:text-blue-400 border-blue-200 dark:border-blue-800',\n pending: 'bg-gray-50 dark:bg-gray-700 text-gray-700 dark:text-gray-300 border-gray-200 dark:border-gray-600',\n default: 'bg-gray-50 dark:bg-gray-700 text-gray-600 dark:text-gray-400 border-gray-200 dark:border-gray-600',\n };\n\n // 상태별 기본 아이콘 매핑\n const statusIcons: Record = {\n success: IconName.CheckCircle,\n warning: IconName.ExclamationTriangle,\n error: IconName.XCircle,\n info: IconName.InfoCircle,\n pending: IconName.Clock,\n default: IconName.QuestionCircle,\n };\n\n // 상태별 기본 라벨 매핑\n const statusLabels: Record = {\n success: '성공',\n warning: '경고',\n error: '오류',\n info: '정보',\n pending: '대기 중',\n default: '기본',\n };\n\n const displayIcon = iconName || statusIcons[status];\n const displayLabel = label || statusLabels[status];\n const styleClasses = statusStyles[status];\n\n return (\n \n {showIcon && (\n \n )}\n {displayLabel}\n \n );\n};\n","import React from 'react';\nimport { Span } from '../basic/Span';\nimport type { EditorAttrs } from '../../types';\n\nexport interface BadgeProps {\n /** 색상명 직접 지정 (blue/green/red/gray/yellow/... ). variant 보다 우선 적용 */\n color?: string;\n /** 의미 기반 변형 (success/warning/danger/info/primary/secondary/text). 백엔드 Enum variant() 출력과 매핑 */\n variant?: string;\n text?: string;\n size?: 'sm' | 'md' | 'lg';\n className?: string;\n style?: React.CSSProperties;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\nconst colorStyles: Record = {\n blue: 'bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-300',\n green: 'bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-300',\n red: 'bg-red-100 text-red-800 dark:bg-red-900/30 dark:text-red-300',\n gray: 'bg-gray-100 text-gray-800 dark:bg-gray-700 dark:text-gray-300',\n yellow: 'bg-yellow-100 text-yellow-800 dark:bg-yellow-900/30 dark:text-yellow-300',\n purple: 'bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300',\n orange: 'bg-orange-100 text-orange-800 dark:bg-orange-900/30 dark:text-orange-300',\n teal: 'bg-teal-100 text-teal-800 dark:bg-teal-900/30 dark:text-teal-300',\n cyan: 'bg-cyan-100 text-cyan-800 dark:bg-cyan-900/30 dark:text-cyan-300',\n};\n\n/**\n * 의미 기반 variant → 색상명 매핑.\n *\n * 백엔드 Enum 의 variant() 메서드(success/warning/danger/info/primary/secondary 등)가\n * 반환하는 semantic 값을 Badge 색상으로 해석한다. StatusBadge 의 색상 규약과 일관.\n */\nconst variantToColor: Record = {\n success: 'green',\n warning: 'yellow',\n danger: 'red',\n error: 'red',\n info: 'blue',\n primary: 'blue',\n secondary: 'gray',\n text: 'gray',\n default: 'gray',\n};\n\nconst sizeStyles: Record = {\n sm: 'px-1.5 py-0.5 text-[10px]',\n md: 'px-2 py-0.5 text-xs',\n lg: 'px-2.5 py-1 text-sm',\n};\n\n/**\n * Badge 집합 컴포넌트\n *\n * 색상 기반의 라벨 뱃지입니다. 상태, 타입 등의 분류를 시각적으로 표현합니다.\n *\n * 기본 컴포넌트 조합: Span\n *\n * @example\n * // 레이아웃 JSON 사용 예시 — 색상 직접 지정\n * {\n * \"name\": \"Badge\",\n * \"props\": { \"color\": \"blue\", \"text\": \"활성\" }\n * }\n * @example\n * // 의미 기반 variant (백엔드 Enum variant() 출력 바인딩)\n * {\n * \"name\": \"Badge\",\n * \"props\": { \"variant\": \"{{row.option_status_variant}}\", \"text\": \"{{row.option_status_label}}\" }\n * }\n */\nexport const Badge: React.FC> = ({\n color,\n variant,\n text,\n size = 'md',\n className = '',\n style,\n children,\n id,\n editorAttrs,\n}) => {\n // 우선순위: color(명시적 색상명) > variant(의미 기반) > gray(기본)\n const resolvedColor = color || (variant ? variantToColor[variant] : undefined) || 'gray';\n const colorClass = colorStyles[resolvedColor] || colorStyles.gray;\n const sizeClass = sizeStyles[size] || sizeStyles.md;\n\n return (\n \n {text}\n {children}\n \n );\n};\n","/*! @license DOMPurify 3.1.7 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.1.7/LICENSE */\n\nconst {\n entries,\n setPrototypeOf,\n isFrozen,\n getPrototypeOf,\n getOwnPropertyDescriptor\n} = Object;\nlet {\n freeze,\n seal,\n create\n} = Object; // eslint-disable-line import/no-mutable-exports\nlet {\n apply,\n construct\n} = typeof Reflect !== 'undefined' && Reflect;\nif (!freeze) {\n freeze = function freeze(x) {\n return x;\n };\n}\nif (!seal) {\n seal = function seal(x) {\n return x;\n };\n}\nif (!apply) {\n apply = function apply(fun, thisValue, args) {\n return fun.apply(thisValue, args);\n };\n}\nif (!construct) {\n construct = function construct(Func, args) {\n return new Func(...args);\n };\n}\nconst arrayForEach = unapply(Array.prototype.forEach);\nconst arrayPop = unapply(Array.prototype.pop);\nconst arrayPush = unapply(Array.prototype.push);\nconst stringToLowerCase = unapply(String.prototype.toLowerCase);\nconst stringToString = unapply(String.prototype.toString);\nconst stringMatch = unapply(String.prototype.match);\nconst stringReplace = unapply(String.prototype.replace);\nconst stringIndexOf = unapply(String.prototype.indexOf);\nconst stringTrim = unapply(String.prototype.trim);\nconst objectHasOwnProperty = unapply(Object.prototype.hasOwnProperty);\nconst regExpTest = unapply(RegExp.prototype.test);\nconst typeErrorCreate = unconstruct(TypeError);\n\n/**\n * Creates a new function that calls the given function with a specified thisArg and arguments.\n *\n * @param {Function} func - The function to be wrapped and called.\n * @returns {Function} A new function that calls the given function with a specified thisArg and arguments.\n */\nfunction unapply(func) {\n return function (thisArg) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n return apply(func, thisArg, args);\n };\n}\n\n/**\n * Creates a new function that constructs an instance of the given constructor function with the provided arguments.\n *\n * @param {Function} func - The constructor function to be wrapped and called.\n * @returns {Function} A new function that constructs an instance of the given constructor function with the provided arguments.\n */\nfunction unconstruct(func) {\n return function () {\n for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n return construct(func, args);\n };\n}\n\n/**\n * Add properties to a lookup table\n *\n * @param {Object} set - The set to which elements will be added.\n * @param {Array} array - The array containing elements to be added to the set.\n * @param {Function} transformCaseFunc - An optional function to transform the case of each element before adding to the set.\n * @returns {Object} The modified set with added elements.\n */\nfunction addToSet(set, array) {\n let transformCaseFunc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : stringToLowerCase;\n if (setPrototypeOf) {\n // Make 'in' and truthy checks like Boolean(set.constructor)\n // independent of any properties defined on Object.prototype.\n // Prevent prototype setters from intercepting set as a this value.\n setPrototypeOf(set, null);\n }\n let l = array.length;\n while (l--) {\n let element = array[l];\n if (typeof element === 'string') {\n const lcElement = transformCaseFunc(element);\n if (lcElement !== element) {\n // Config presets (e.g. tags.js, attrs.js) are immutable.\n if (!isFrozen(array)) {\n array[l] = lcElement;\n }\n element = lcElement;\n }\n }\n set[element] = true;\n }\n return set;\n}\n\n/**\n * Clean up an array to harden against CSPP\n *\n * @param {Array} array - The array to be cleaned.\n * @returns {Array} The cleaned version of the array\n */\nfunction cleanArray(array) {\n for (let index = 0; index < array.length; index++) {\n const isPropertyExist = objectHasOwnProperty(array, index);\n if (!isPropertyExist) {\n array[index] = null;\n }\n }\n return array;\n}\n\n/**\n * Shallow clone an object\n *\n * @param {Object} object - The object to be cloned.\n * @returns {Object} A new object that copies the original.\n */\nfunction clone(object) {\n const newObject = create(null);\n for (const [property, value] of entries(object)) {\n const isPropertyExist = objectHasOwnProperty(object, property);\n if (isPropertyExist) {\n if (Array.isArray(value)) {\n newObject[property] = cleanArray(value);\n } else if (value && typeof value === 'object' && value.constructor === Object) {\n newObject[property] = clone(value);\n } else {\n newObject[property] = value;\n }\n }\n }\n return newObject;\n}\n\n/**\n * This method automatically checks if the prop is function or getter and behaves accordingly.\n *\n * @param {Object} object - The object to look up the getter function in its prototype chain.\n * @param {String} prop - The property name for which to find the getter function.\n * @returns {Function} The getter function found in the prototype chain or a fallback function.\n */\nfunction lookupGetter(object, prop) {\n while (object !== null) {\n const desc = getOwnPropertyDescriptor(object, prop);\n if (desc) {\n if (desc.get) {\n return unapply(desc.get);\n }\n if (typeof desc.value === 'function') {\n return unapply(desc.value);\n }\n }\n object = getPrototypeOf(object);\n }\n function fallbackValue() {\n return null;\n }\n return fallbackValue;\n}\n\nconst html$1 = freeze(['a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'big', 'blink', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'decorator', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'element', 'em', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meter', 'nav', 'nobr', 'ol', 'optgroup', 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'section', 'select', 'shadow', 'small', 'source', 'spacer', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr']);\n\n// SVG\nconst svg$1 = freeze(['svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'view', 'vkern']);\nconst svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']);\n\n// List of SVG elements that are disallowed by default.\n// We still need to know them so that we can do namespace\n// checks properly in case one wants to add them to\n// allow-list.\nconst svgDisallowed = freeze(['animate', 'color-profile', 'cursor', 'discard', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'foreignobject', 'hatch', 'hatchpath', 'mesh', 'meshgradient', 'meshpatch', 'meshrow', 'missing-glyph', 'script', 'set', 'solidcolor', 'unknown', 'use']);\nconst mathMl$1 = freeze(['math', 'menclose', 'merror', 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mspace', 'msqrt', 'mstyle', 'msub', 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover', 'mprescripts']);\n\n// Similarly to SVG, we want to know all MathML elements,\n// even those that we disallow by default.\nconst mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']);\nconst text = freeze(['#text']);\n\nconst html = freeze(['accept', 'action', 'align', 'alt', 'autocapitalize', 'autocomplete', 'autopictureinpicture', 'autoplay', 'background', 'bgcolor', 'border', 'capture', 'cellpadding', 'cellspacing', 'checked', 'cite', 'class', 'clear', 'color', 'cols', 'colspan', 'controls', 'controlslist', 'coords', 'crossorigin', 'datetime', 'decoding', 'default', 'dir', 'disabled', 'disablepictureinpicture', 'disableremoteplayback', 'download', 'draggable', 'enctype', 'enterkeyhint', 'face', 'for', 'headers', 'height', 'hidden', 'high', 'href', 'hreflang', 'id', 'inputmode', 'integrity', 'ismap', 'kind', 'label', 'lang', 'list', 'loading', 'loop', 'low', 'max', 'maxlength', 'media', 'method', 'min', 'minlength', 'multiple', 'muted', 'name', 'nonce', 'noshade', 'novalidate', 'nowrap', 'open', 'optimum', 'pattern', 'placeholder', 'playsinline', 'popover', 'popovertarget', 'popovertargetaction', 'poster', 'preload', 'pubdate', 'radiogroup', 'readonly', 'rel', 'required', 'rev', 'reversed', 'role', 'rows', 'rowspan', 'spellcheck', 'scope', 'selected', 'shape', 'size', 'sizes', 'span', 'srclang', 'start', 'src', 'srcset', 'step', 'style', 'summary', 'tabindex', 'title', 'translate', 'type', 'usemap', 'valign', 'value', 'width', 'wrap', 'xmlns', 'slot']);\nconst svg = freeze(['accent-height', 'accumulate', 'additive', 'alignment-baseline', 'amplitude', 'ascent', 'attributename', 'attributetype', 'azimuth', 'basefrequency', 'baseline-shift', 'begin', 'bias', 'by', 'class', 'clip', 'clippathunits', 'clip-path', 'clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cx', 'cy', 'd', 'dx', 'dy', 'diffuseconstant', 'direction', 'display', 'divisor', 'dur', 'edgemode', 'elevation', 'end', 'exponent', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'filterunits', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'glyphref', 'gradientunits', 'gradienttransform', 'height', 'href', 'id', 'image-rendering', 'in', 'in2', 'intercept', 'k', 'k1', 'k2', 'k3', 'k4', 'kerning', 'keypoints', 'keysplines', 'keytimes', 'lang', 'lengthadjust', 'letter-spacing', 'kernelmatrix', 'kernelunitlength', 'lighting-color', 'local', 'marker-end', 'marker-mid', 'marker-start', 'markerheight', 'markerunits', 'markerwidth', 'maskcontentunits', 'maskunits', 'max', 'mask', 'media', 'method', 'mode', 'min', 'name', 'numoctaves', 'offset', 'operator', 'opacity', 'order', 'orient', 'orientation', 'origin', 'overflow', 'paint-order', 'path', 'pathlength', 'patterncontentunits', 'patterntransform', 'patternunits', 'points', 'preservealpha', 'preserveaspectratio', 'primitiveunits', 'r', 'rx', 'ry', 'radius', 'refx', 'refy', 'repeatcount', 'repeatdur', 'restart', 'result', 'rotate', 'scale', 'seed', 'shape-rendering', 'slope', 'specularconstant', 'specularexponent', 'spreadmethod', 'startoffset', 'stddeviation', 'stitchtiles', 'stop-color', 'stop-opacity', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke', 'stroke-width', 'style', 'surfacescale', 'systemlanguage', 'tabindex', 'tablevalues', 'targetx', 'targety', 'transform', 'transform-origin', 'text-anchor', 'text-decoration', 'text-rendering', 'textlength', 'type', 'u1', 'u2', 'unicode', 'values', 'viewbox', 'visibility', 'version', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'width', 'word-spacing', 'wrap', 'writing-mode', 'xchannelselector', 'ychannelselector', 'x', 'x1', 'x2', 'xmlns', 'y', 'y1', 'y2', 'z', 'zoomandpan']);\nconst mathMl = freeze(['accent', 'accentunder', 'align', 'bevelled', 'close', 'columnsalign', 'columnlines', 'columnspan', 'denomalign', 'depth', 'dir', 'display', 'displaystyle', 'encoding', 'fence', 'frame', 'height', 'href', 'id', 'largeop', 'length', 'linethickness', 'lspace', 'lquote', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'maxsize', 'minsize', 'movablelimits', 'notation', 'numalign', 'open', 'rowalign', 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'rquote', 'scriptlevel', 'scriptminsize', 'scriptsizemultiplier', 'selection', 'separator', 'separators', 'stretchy', 'subscriptshift', 'supscriptshift', 'symmetric', 'voffset', 'width', 'xmlns']);\nconst xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']);\n\n// eslint-disable-next-line unicorn/better-regex\nconst MUSTACHE_EXPR = seal(/\\{\\{[\\w\\W]*|[\\w\\W]*\\}\\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode\nconst ERB_EXPR = seal(/<%[\\w\\W]*|[\\w\\W]*%>/gm);\nconst TMPLIT_EXPR = seal(/\\${[\\w\\W]*}/gm);\nconst DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]/); // eslint-disable-line no-useless-escape\nconst ARIA_ATTR = seal(/^aria-[\\-\\w]+$/); // eslint-disable-line no-useless-escape\nconst IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i // eslint-disable-line no-useless-escape\n);\nconst IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\nconst ATTR_WHITESPACE = seal(/[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g // eslint-disable-line no-control-regex\n);\nconst DOCTYPE_NAME = seal(/^html$/i);\nconst CUSTOM_ELEMENT = seal(/^[a-z][.\\w]*(-[.\\w]+)+$/i);\n\nvar EXPRESSIONS = /*#__PURE__*/Object.freeze({\n __proto__: null,\n MUSTACHE_EXPR: MUSTACHE_EXPR,\n ERB_EXPR: ERB_EXPR,\n TMPLIT_EXPR: TMPLIT_EXPR,\n DATA_ATTR: DATA_ATTR,\n ARIA_ATTR: ARIA_ATTR,\n IS_ALLOWED_URI: IS_ALLOWED_URI,\n IS_SCRIPT_OR_DATA: IS_SCRIPT_OR_DATA,\n ATTR_WHITESPACE: ATTR_WHITESPACE,\n DOCTYPE_NAME: DOCTYPE_NAME,\n CUSTOM_ELEMENT: CUSTOM_ELEMENT\n});\n\n// https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\nconst NODE_TYPE = {\n element: 1,\n attribute: 2,\n text: 3,\n cdataSection: 4,\n entityReference: 5,\n // Deprecated\n entityNode: 6,\n // Deprecated\n progressingInstruction: 7,\n comment: 8,\n document: 9,\n documentType: 10,\n documentFragment: 11,\n notation: 12 // Deprecated\n};\nconst getGlobal = function getGlobal() {\n return typeof window === 'undefined' ? null : window;\n};\n\n/**\n * Creates a no-op policy for internal use only.\n * Don't export this function outside this module!\n * @param {TrustedTypePolicyFactory} trustedTypes The policy factory.\n * @param {HTMLScriptElement} purifyHostElement The Script element used to load DOMPurify (to determine policy name suffix).\n * @return {TrustedTypePolicy} The policy created (or null, if Trusted Types\n * are not supported or creating the policy failed).\n */\nconst _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, purifyHostElement) {\n if (typeof trustedTypes !== 'object' || typeof trustedTypes.createPolicy !== 'function') {\n return null;\n }\n\n // Allow the callers to control the unique policy name\n // by adding a data-tt-policy-suffix to the script element with the DOMPurify.\n // Policy creation with duplicate names throws in Trusted Types.\n let suffix = null;\n const ATTR_NAME = 'data-tt-policy-suffix';\n if (purifyHostElement && purifyHostElement.hasAttribute(ATTR_NAME)) {\n suffix = purifyHostElement.getAttribute(ATTR_NAME);\n }\n const policyName = 'dompurify' + (suffix ? '#' + suffix : '');\n try {\n return trustedTypes.createPolicy(policyName, {\n createHTML(html) {\n return html;\n },\n createScriptURL(scriptUrl) {\n return scriptUrl;\n }\n });\n } catch (_) {\n // Policy creation failed (most likely another DOMPurify script has\n // already run). Skip creating the policy, as this will only cause errors\n // if TT are enforced.\n console.warn('TrustedTypes policy ' + policyName + ' could not be created.');\n return null;\n }\n};\nfunction createDOMPurify() {\n let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();\n const DOMPurify = root => createDOMPurify(root);\n\n /**\n * Version label, exposed for easier checks\n * if DOMPurify is up to date or not\n */\n DOMPurify.version = '3.1.7';\n\n /**\n * Array of elements that DOMPurify removed during sanitation.\n * Empty if nothing was removed.\n */\n DOMPurify.removed = [];\n if (!window || !window.document || window.document.nodeType !== NODE_TYPE.document) {\n // Not running in a browser, provide a factory function\n // so that you can pass your own Window\n DOMPurify.isSupported = false;\n return DOMPurify;\n }\n let {\n document\n } = window;\n const originalDocument = document;\n const currentScript = originalDocument.currentScript;\n const {\n DocumentFragment,\n HTMLTemplateElement,\n Node,\n Element,\n NodeFilter,\n NamedNodeMap = window.NamedNodeMap || window.MozNamedAttrMap,\n HTMLFormElement,\n DOMParser,\n trustedTypes\n } = window;\n const ElementPrototype = Element.prototype;\n const cloneNode = lookupGetter(ElementPrototype, 'cloneNode');\n const remove = lookupGetter(ElementPrototype, 'remove');\n const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');\n const getChildNodes = lookupGetter(ElementPrototype, 'childNodes');\n const getParentNode = lookupGetter(ElementPrototype, 'parentNode');\n\n // As per issue #47, the web-components registry is inherited by a\n // new document created via createHTMLDocument. As per the spec\n // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)\n // a new empty registry is used when creating a template contents owner\n // document, so we use that as our parent document to ensure nothing\n // is inherited.\n if (typeof HTMLTemplateElement === 'function') {\n const template = document.createElement('template');\n if (template.content && template.content.ownerDocument) {\n document = template.content.ownerDocument;\n }\n }\n let trustedTypesPolicy;\n let emptyHTML = '';\n const {\n implementation,\n createNodeIterator,\n createDocumentFragment,\n getElementsByTagName\n } = document;\n const {\n importNode\n } = originalDocument;\n let hooks = {};\n\n /**\n * Expose whether this browser supports running the full DOMPurify.\n */\n DOMPurify.isSupported = typeof entries === 'function' && typeof getParentNode === 'function' && implementation && implementation.createHTMLDocument !== undefined;\n const {\n MUSTACHE_EXPR,\n ERB_EXPR,\n TMPLIT_EXPR,\n DATA_ATTR,\n ARIA_ATTR,\n IS_SCRIPT_OR_DATA,\n ATTR_WHITESPACE,\n CUSTOM_ELEMENT\n } = EXPRESSIONS;\n let {\n IS_ALLOWED_URI: IS_ALLOWED_URI$1\n } = EXPRESSIONS;\n\n /**\n * We consider the elements and attributes below to be safe. Ideally\n * don't add any new ones but feel free to remove unwanted ones.\n */\n\n /* allowed element names */\n let ALLOWED_TAGS = null;\n const DEFAULT_ALLOWED_TAGS = addToSet({}, [...html$1, ...svg$1, ...svgFilters, ...mathMl$1, ...text]);\n\n /* Allowed attribute names */\n let ALLOWED_ATTR = null;\n const DEFAULT_ALLOWED_ATTR = addToSet({}, [...html, ...svg, ...mathMl, ...xml]);\n\n /*\n * Configure how DOMPUrify should handle custom elements and their attributes as well as customized built-in elements.\n * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)\n * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)\n * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.\n */\n let CUSTOM_ELEMENT_HANDLING = Object.seal(create(null, {\n tagNameCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n },\n attributeNameCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n },\n allowCustomizedBuiltInElements: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: false\n }\n }));\n\n /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */\n let FORBID_TAGS = null;\n\n /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */\n let FORBID_ATTR = null;\n\n /* Decide if ARIA attributes are okay */\n let ALLOW_ARIA_ATTR = true;\n\n /* Decide if custom data attributes are okay */\n let ALLOW_DATA_ATTR = true;\n\n /* Decide if unknown protocols are okay */\n let ALLOW_UNKNOWN_PROTOCOLS = false;\n\n /* Decide if self-closing tags in attributes are allowed.\n * Usually removed due to a mXSS issue in jQuery 3.0 */\n let ALLOW_SELF_CLOSE_IN_ATTR = true;\n\n /* Output should be safe for common template engines.\n * This means, DOMPurify removes data attributes, mustaches and ERB\n */\n let SAFE_FOR_TEMPLATES = false;\n\n /* Output should be safe even for XML used within HTML and alike.\n * This means, DOMPurify removes comments when containing risky content.\n */\n let SAFE_FOR_XML = true;\n\n /* Decide if document with ... should be returned */\n let WHOLE_DOCUMENT = false;\n\n /* Track whether config is already set on this instance of DOMPurify. */\n let SET_CONFIG = false;\n\n /* Decide if all elements (e.g. style, script) must be children of\n * document.body. By default, browsers might move them to document.head */\n let FORCE_BODY = false;\n\n /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported).\n * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead\n */\n let RETURN_DOM = false;\n\n /* Decide if a DOM `DocumentFragment` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported) */\n let RETURN_DOM_FRAGMENT = false;\n\n /* Try to return a Trusted Type object instead of a string, return a string in\n * case Trusted Types are not supported */\n let RETURN_TRUSTED_TYPE = false;\n\n /* Output should be free from DOM clobbering attacks?\n * This sanitizes markups named with colliding, clobberable built-in DOM APIs.\n */\n let SANITIZE_DOM = true;\n\n /* Achieve full DOM Clobbering protection by isolating the namespace of named\n * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.\n *\n * HTML/DOM spec rules that enable DOM Clobbering:\n * - Named Access on Window (§7.3.3)\n * - DOM Tree Accessors (§3.1.5)\n * - Form Element Parent-Child Relations (§4.10.3)\n * - Iframe srcdoc / Nested WindowProxies (§4.8.5)\n * - HTMLCollection (§4.2.10.2)\n *\n * Namespace isolation is implemented by prefixing `id` and `name` attributes\n * with a constant string, i.e., `user-content-`\n */\n let SANITIZE_NAMED_PROPS = false;\n const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';\n\n /* Keep element content when removing element? */\n let KEEP_CONTENT = true;\n\n /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead\n * of importing it into a new Document and returning a sanitized copy */\n let IN_PLACE = false;\n\n /* Allow usage of profiles like html, svg and mathMl */\n let USE_PROFILES = {};\n\n /* Tags to ignore content of when KEEP_CONTENT is true */\n let FORBID_CONTENTS = null;\n const DEFAULT_FORBID_CONTENTS = addToSet({}, ['annotation-xml', 'audio', 'colgroup', 'desc', 'foreignobject', 'head', 'iframe', 'math', 'mi', 'mn', 'mo', 'ms', 'mtext', 'noembed', 'noframes', 'noscript', 'plaintext', 'script', 'style', 'svg', 'template', 'thead', 'title', 'video', 'xmp']);\n\n /* Tags that are safe for data: URIs */\n let DATA_URI_TAGS = null;\n const DEFAULT_DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']);\n\n /* Attributes safe for values like \"javascript:\" */\n let URI_SAFE_ATTRIBUTES = null;\n const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'role', 'summary', 'title', 'value', 'style', 'xmlns']);\n const MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n /* Document namespace */\n let NAMESPACE = HTML_NAMESPACE;\n let IS_EMPTY_INPUT = false;\n\n /* Allowed XHTML+XML namespaces */\n let ALLOWED_NAMESPACES = null;\n const DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE], stringToString);\n\n /* Parsing of strict XHTML documents */\n let PARSER_MEDIA_TYPE = null;\n const SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html'];\n const DEFAULT_PARSER_MEDIA_TYPE = 'text/html';\n let transformCaseFunc = null;\n\n /* Keep a reference to config to pass to hooks */\n let CONFIG = null;\n\n /* Ideally, do not touch anything below this line */\n /* ______________________________________________ */\n\n const formElement = document.createElement('form');\n const isRegexOrFunction = function isRegexOrFunction(testValue) {\n return testValue instanceof RegExp || testValue instanceof Function;\n };\n\n /**\n * _parseConfig\n *\n * @param {Object} cfg optional config literal\n */\n // eslint-disable-next-line complexity\n const _parseConfig = function _parseConfig() {\n let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n if (CONFIG && CONFIG === cfg) {\n return;\n }\n\n /* Shield configuration object from tampering */\n if (!cfg || typeof cfg !== 'object') {\n cfg = {};\n }\n\n /* Shield configuration object from prototype pollution */\n cfg = clone(cfg);\n PARSER_MEDIA_TYPE =\n // eslint-disable-next-line unicorn/prefer-includes\n SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? DEFAULT_PARSER_MEDIA_TYPE : cfg.PARSER_MEDIA_TYPE;\n\n // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.\n transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? stringToString : stringToLowerCase;\n\n /* Set configuration parameters */\n ALLOWED_TAGS = objectHasOwnProperty(cfg, 'ALLOWED_TAGS') ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc) : DEFAULT_ALLOWED_TAGS;\n ALLOWED_ATTR = objectHasOwnProperty(cfg, 'ALLOWED_ATTR') ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc) : DEFAULT_ALLOWED_ATTR;\n ALLOWED_NAMESPACES = objectHasOwnProperty(cfg, 'ALLOWED_NAMESPACES') ? addToSet({}, cfg.ALLOWED_NAMESPACES, stringToString) : DEFAULT_ALLOWED_NAMESPACES;\n URI_SAFE_ATTRIBUTES = objectHasOwnProperty(cfg, 'ADD_URI_SAFE_ATTR') ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES),\n // eslint-disable-line indent\n cfg.ADD_URI_SAFE_ATTR,\n // eslint-disable-line indent\n transformCaseFunc // eslint-disable-line indent\n ) // eslint-disable-line indent\n : DEFAULT_URI_SAFE_ATTRIBUTES;\n DATA_URI_TAGS = objectHasOwnProperty(cfg, 'ADD_DATA_URI_TAGS') ? addToSet(clone(DEFAULT_DATA_URI_TAGS),\n // eslint-disable-line indent\n cfg.ADD_DATA_URI_TAGS,\n // eslint-disable-line indent\n transformCaseFunc // eslint-disable-line indent\n ) // eslint-disable-line indent\n : DEFAULT_DATA_URI_TAGS;\n FORBID_CONTENTS = objectHasOwnProperty(cfg, 'FORBID_CONTENTS') ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc) : DEFAULT_FORBID_CONTENTS;\n FORBID_TAGS = objectHasOwnProperty(cfg, 'FORBID_TAGS') ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc) : {};\n FORBID_ATTR = objectHasOwnProperty(cfg, 'FORBID_ATTR') ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc) : {};\n USE_PROFILES = objectHasOwnProperty(cfg, 'USE_PROFILES') ? cfg.USE_PROFILES : false;\n ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true\n ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true\n ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false\n ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; // Default true\n SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false\n SAFE_FOR_XML = cfg.SAFE_FOR_XML !== false; // Default true\n WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false\n RETURN_DOM = cfg.RETURN_DOM || false; // Default false\n RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false\n RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false\n FORCE_BODY = cfg.FORCE_BODY || false; // Default false\n SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true\n SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false\n KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true\n IN_PLACE = cfg.IN_PLACE || false; // Default false\n IS_ALLOWED_URI$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI;\n NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;\n CUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || {};\n if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)) {\n CUSTOM_ELEMENT_HANDLING.tagNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck;\n }\n if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)) {\n CUSTOM_ELEMENT_HANDLING.attributeNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck;\n }\n if (cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements === 'boolean') {\n CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements;\n }\n if (SAFE_FOR_TEMPLATES) {\n ALLOW_DATA_ATTR = false;\n }\n if (RETURN_DOM_FRAGMENT) {\n RETURN_DOM = true;\n }\n\n /* Parse profile info */\n if (USE_PROFILES) {\n ALLOWED_TAGS = addToSet({}, text);\n ALLOWED_ATTR = [];\n if (USE_PROFILES.html === true) {\n addToSet(ALLOWED_TAGS, html$1);\n addToSet(ALLOWED_ATTR, html);\n }\n if (USE_PROFILES.svg === true) {\n addToSet(ALLOWED_TAGS, svg$1);\n addToSet(ALLOWED_ATTR, svg);\n addToSet(ALLOWED_ATTR, xml);\n }\n if (USE_PROFILES.svgFilters === true) {\n addToSet(ALLOWED_TAGS, svgFilters);\n addToSet(ALLOWED_ATTR, svg);\n addToSet(ALLOWED_ATTR, xml);\n }\n if (USE_PROFILES.mathMl === true) {\n addToSet(ALLOWED_TAGS, mathMl$1);\n addToSet(ALLOWED_ATTR, mathMl);\n addToSet(ALLOWED_ATTR, xml);\n }\n }\n\n /* Merge configuration parameters */\n if (cfg.ADD_TAGS) {\n if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {\n ALLOWED_TAGS = clone(ALLOWED_TAGS);\n }\n addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);\n }\n if (cfg.ADD_ATTR) {\n if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {\n ALLOWED_ATTR = clone(ALLOWED_ATTR);\n }\n addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);\n }\n if (cfg.ADD_URI_SAFE_ATTR) {\n addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);\n }\n if (cfg.FORBID_CONTENTS) {\n if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n FORBID_CONTENTS = clone(FORBID_CONTENTS);\n }\n addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);\n }\n\n /* Add #text in case KEEP_CONTENT is set to true */\n if (KEEP_CONTENT) {\n ALLOWED_TAGS['#text'] = true;\n }\n\n /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */\n if (WHOLE_DOCUMENT) {\n addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);\n }\n\n /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */\n if (ALLOWED_TAGS.table) {\n addToSet(ALLOWED_TAGS, ['tbody']);\n delete FORBID_TAGS.tbody;\n }\n if (cfg.TRUSTED_TYPES_POLICY) {\n if (typeof cfg.TRUSTED_TYPES_POLICY.createHTML !== 'function') {\n throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createHTML\" hook.');\n }\n if (typeof cfg.TRUSTED_TYPES_POLICY.createScriptURL !== 'function') {\n throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createScriptURL\" hook.');\n }\n\n // Overwrite existing TrustedTypes policy.\n trustedTypesPolicy = cfg.TRUSTED_TYPES_POLICY;\n\n // Sign local variables required by `sanitize`.\n emptyHTML = trustedTypesPolicy.createHTML('');\n } else {\n // Uninitialized policy, attempt to initialize the internal dompurify policy.\n if (trustedTypesPolicy === undefined) {\n trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, currentScript);\n }\n\n // If creating the internal policy succeeded sign internal variables.\n if (trustedTypesPolicy !== null && typeof emptyHTML === 'string') {\n emptyHTML = trustedTypesPolicy.createHTML('');\n }\n }\n\n // Prevent further manipulation of configuration.\n // Not available in IE8, Safari 5, etc.\n if (freeze) {\n freeze(cfg);\n }\n CONFIG = cfg;\n };\n const MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']);\n const HTML_INTEGRATION_POINTS = addToSet({}, ['annotation-xml']);\n\n // Certain elements are allowed in both SVG and HTML\n // namespace. We need to specify them explicitly\n // so that they don't get erroneously deleted from\n // HTML namespace.\n const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ['title', 'style', 'font', 'a', 'script']);\n\n /* Keep track of all possible SVG and MathML tags\n * so that we can perform the namespace checks\n * correctly. */\n const ALL_SVG_TAGS = addToSet({}, [...svg$1, ...svgFilters, ...svgDisallowed]);\n const ALL_MATHML_TAGS = addToSet({}, [...mathMl$1, ...mathMlDisallowed]);\n\n /**\n * @param {Element} element a DOM element whose namespace is being checked\n * @returns {boolean} Return false if the element has a\n * namespace that a spec-compliant parser would never\n * return. Return true otherwise.\n */\n const _checkValidNamespace = function _checkValidNamespace(element) {\n let parent = getParentNode(element);\n\n // In JSDOM, if we're inside shadow DOM, then parentNode\n // can be null. We just simulate parent in this case.\n if (!parent || !parent.tagName) {\n parent = {\n namespaceURI: NAMESPACE,\n tagName: 'template'\n };\n }\n const tagName = stringToLowerCase(element.tagName);\n const parentTagName = stringToLowerCase(parent.tagName);\n if (!ALLOWED_NAMESPACES[element.namespaceURI]) {\n return false;\n }\n if (element.namespaceURI === SVG_NAMESPACE) {\n // The only way to switch from HTML namespace to SVG\n // is via . If it happens via any other tag, then\n // it should be killed.\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === 'svg';\n }\n\n // The only way to switch from MathML to SVG is via`\n // svg if parent is either or MathML\n // text integration points.\n if (parent.namespaceURI === MATHML_NAMESPACE) {\n return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);\n }\n\n // We only allow elements that are defined in SVG\n // spec. All others are disallowed in SVG namespace.\n return Boolean(ALL_SVG_TAGS[tagName]);\n }\n if (element.namespaceURI === MATHML_NAMESPACE) {\n // The only way to switch from HTML namespace to MathML\n // is via . If it happens via any other tag, then\n // it should be killed.\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === 'math';\n }\n\n // The only way to switch from SVG to MathML is via\n // and HTML integration points\n if (parent.namespaceURI === SVG_NAMESPACE) {\n return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];\n }\n\n // We only allow elements that are defined in MathML\n // spec. All others are disallowed in MathML namespace.\n return Boolean(ALL_MATHML_TAGS[tagName]);\n }\n if (element.namespaceURI === HTML_NAMESPACE) {\n // The only way to switch from SVG to HTML is via\n // HTML integration points, and from MathML to HTML\n // is via MathML text integration points\n if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {\n return false;\n }\n if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {\n return false;\n }\n\n // We disallow tags that are specific for MathML\n // or SVG and should never appear in HTML namespace\n return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);\n }\n\n // For XHTML and XML documents that support custom namespaces\n if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && ALLOWED_NAMESPACES[element.namespaceURI]) {\n return true;\n }\n\n // The code should never reach this place (this means\n // that the element somehow got namespace that is not\n // HTML, SVG, MathML or allowed via ALLOWED_NAMESPACES).\n // Return false just in case.\n return false;\n };\n\n /**\n * _forceRemove\n *\n * @param {Node} node a DOM node\n */\n const _forceRemove = function _forceRemove(node) {\n arrayPush(DOMPurify.removed, {\n element: node\n });\n try {\n // eslint-disable-next-line unicorn/prefer-dom-node-remove\n getParentNode(node).removeChild(node);\n } catch (_) {\n remove(node);\n }\n };\n\n /**\n * _removeAttribute\n *\n * @param {String} name an Attribute name\n * @param {Node} node a DOM node\n */\n const _removeAttribute = function _removeAttribute(name, node) {\n try {\n arrayPush(DOMPurify.removed, {\n attribute: node.getAttributeNode(name),\n from: node\n });\n } catch (_) {\n arrayPush(DOMPurify.removed, {\n attribute: null,\n from: node\n });\n }\n node.removeAttribute(name);\n\n // We void attribute values for unremovable \"is\"\" attributes\n if (name === 'is' && !ALLOWED_ATTR[name]) {\n if (RETURN_DOM || RETURN_DOM_FRAGMENT) {\n try {\n _forceRemove(node);\n } catch (_) {}\n } else {\n try {\n node.setAttribute(name, '');\n } catch (_) {}\n }\n }\n };\n\n /**\n * _initDocument\n *\n * @param {String} dirty a string of dirty markup\n * @return {Document} a DOM, filled with the dirty markup\n */\n const _initDocument = function _initDocument(dirty) {\n /* Create a HTML document */\n let doc = null;\n let leadingWhitespace = null;\n if (FORCE_BODY) {\n dirty = '' + dirty;\n } else {\n /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */\n const matches = stringMatch(dirty, /^[\\r\\n\\t ]+/);\n leadingWhitespace = matches && matches[0];\n }\n if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && NAMESPACE === HTML_NAMESPACE) {\n // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict)\n dirty = '' + dirty + '';\n }\n const dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty;\n /*\n * Use the DOMParser API by default, fallback later if needs be\n * DOMParser not work for svg when has multiple root element.\n */\n if (NAMESPACE === HTML_NAMESPACE) {\n try {\n doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);\n } catch (_) {}\n }\n\n /* Use createHTMLDocument in case DOMParser is not available */\n if (!doc || !doc.documentElement) {\n doc = implementation.createDocument(NAMESPACE, 'template', null);\n try {\n doc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload;\n } catch (_) {\n // Syntax error if dirtyPayload is invalid xml\n }\n }\n const body = doc.body || doc.documentElement;\n if (dirty && leadingWhitespace) {\n body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);\n }\n\n /* Work on whole document or just its body */\n if (NAMESPACE === HTML_NAMESPACE) {\n return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0];\n }\n return WHOLE_DOCUMENT ? doc.documentElement : body;\n };\n\n /**\n * Creates a NodeIterator object that you can use to traverse filtered lists of nodes or elements in a document.\n *\n * @param {Node} root The root element or node to start traversing on.\n * @return {NodeIterator} The created NodeIterator\n */\n const _createNodeIterator = function _createNodeIterator(root) {\n return createNodeIterator.call(root.ownerDocument || root, root,\n // eslint-disable-next-line no-bitwise\n NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT | NodeFilter.SHOW_PROCESSING_INSTRUCTION | NodeFilter.SHOW_CDATA_SECTION, null);\n };\n\n /**\n * _isClobbered\n *\n * @param {Node} elm element to check for clobbering attacks\n * @return {Boolean} true if clobbered, false if safe\n */\n const _isClobbered = function _isClobbered(elm) {\n return elm instanceof HTMLFormElement && (typeof elm.nodeName !== 'string' || typeof elm.textContent !== 'string' || typeof elm.removeChild !== 'function' || !(elm.attributes instanceof NamedNodeMap) || typeof elm.removeAttribute !== 'function' || typeof elm.setAttribute !== 'function' || typeof elm.namespaceURI !== 'string' || typeof elm.insertBefore !== 'function' || typeof elm.hasChildNodes !== 'function');\n };\n\n /**\n * Checks whether the given object is a DOM node.\n *\n * @param {Node} object object to check whether it's a DOM node\n * @return {Boolean} true is object is a DOM node\n */\n const _isNode = function _isNode(object) {\n return typeof Node === 'function' && object instanceof Node;\n };\n\n /**\n * _executeHook\n * Execute user configurable hooks\n *\n * @param {String} entryPoint Name of the hook's entry point\n * @param {Node} currentNode node to work on with the hook\n * @param {Object} data additional hook parameters\n */\n const _executeHook = function _executeHook(entryPoint, currentNode, data) {\n if (!hooks[entryPoint]) {\n return;\n }\n arrayForEach(hooks[entryPoint], hook => {\n hook.call(DOMPurify, currentNode, data, CONFIG);\n });\n };\n\n /**\n * _sanitizeElements\n *\n * @protect nodeName\n * @protect textContent\n * @protect removeChild\n *\n * @param {Node} currentNode to check for permission to exist\n * @return {Boolean} true if node was killed, false if left alive\n */\n const _sanitizeElements = function _sanitizeElements(currentNode) {\n let content = null;\n\n /* Execute a hook if present */\n _executeHook('beforeSanitizeElements', currentNode, null);\n\n /* Check if element is clobbered or can clobber */\n if (_isClobbered(currentNode)) {\n _forceRemove(currentNode);\n return true;\n }\n\n /* Now let's check the element's type and name */\n const tagName = transformCaseFunc(currentNode.nodeName);\n\n /* Execute a hook if present */\n _executeHook('uponSanitizeElement', currentNode, {\n tagName,\n allowedTags: ALLOWED_TAGS\n });\n\n /* Detect mXSS attempts abusing namespace confusion */\n if (currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && regExpTest(/<[/\\w]/g, currentNode.innerHTML) && regExpTest(/<[/\\w]/g, currentNode.textContent)) {\n _forceRemove(currentNode);\n return true;\n }\n\n /* Remove any occurrence of processing instructions */\n if (currentNode.nodeType === NODE_TYPE.progressingInstruction) {\n _forceRemove(currentNode);\n return true;\n }\n\n /* Remove any kind of possibly harmful comments */\n if (SAFE_FOR_XML && currentNode.nodeType === NODE_TYPE.comment && regExpTest(/<[/\\w]/g, currentNode.data)) {\n _forceRemove(currentNode);\n return true;\n }\n\n /* Remove element if anything forbids its presence */\n if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n /* Check if we have a custom element to handle */\n if (!FORBID_TAGS[tagName] && _isBasicCustomElement(tagName)) {\n if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) {\n return false;\n }\n if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) {\n return false;\n }\n }\n\n /* Keep content except for bad-listed elements */\n if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {\n const parentNode = getParentNode(currentNode) || currentNode.parentNode;\n const childNodes = getChildNodes(currentNode) || currentNode.childNodes;\n if (childNodes && parentNode) {\n const childCount = childNodes.length;\n for (let i = childCount - 1; i >= 0; --i) {\n const childClone = cloneNode(childNodes[i], true);\n childClone.__removalCount = (currentNode.__removalCount || 0) + 1;\n parentNode.insertBefore(childClone, getNextSibling(currentNode));\n }\n }\n }\n _forceRemove(currentNode);\n return true;\n }\n\n /* Check whether element has a valid namespace */\n if (currentNode instanceof Element && !_checkValidNamespace(currentNode)) {\n _forceRemove(currentNode);\n return true;\n }\n\n /* Make sure that older browsers don't get fallback-tag mXSS */\n if ((tagName === 'noscript' || tagName === 'noembed' || tagName === 'noframes') && regExpTest(/<\\/no(script|embed|frames)/i, currentNode.innerHTML)) {\n _forceRemove(currentNode);\n return true;\n }\n\n /* Sanitize element content to be template-safe */\n if (SAFE_FOR_TEMPLATES && currentNode.nodeType === NODE_TYPE.text) {\n /* Get the element's text content */\n content = currentNode.textContent;\n arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n content = stringReplace(content, expr, ' ');\n });\n if (currentNode.textContent !== content) {\n arrayPush(DOMPurify.removed, {\n element: currentNode.cloneNode()\n });\n currentNode.textContent = content;\n }\n }\n\n /* Execute a hook if present */\n _executeHook('afterSanitizeElements', currentNode, null);\n return false;\n };\n\n /**\n * _isValidAttribute\n *\n * @param {string} lcTag Lowercase tag name of containing element.\n * @param {string} lcName Lowercase attribute name.\n * @param {string} value Attribute value.\n * @return {Boolean} Returns true if `value` is valid, otherwise false.\n */\n // eslint-disable-next-line complexity\n const _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {\n /* Make sure attribute cannot clobber */\n if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) {\n return false;\n }\n\n /* Allow valid data-* attributes: At least one character after \"-\"\n (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)\n XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)\n We don't need to check the value; it's always URI safe. */\n if (ALLOW_DATA_ATTR && !FORBID_ATTR[lcName] && regExpTest(DATA_ATTR, lcName)) ; else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR, lcName)) ; else if (!ALLOWED_ATTR[lcName] || FORBID_ATTR[lcName]) {\n if (\n // First condition does a very basic check if a) it's basically a valid custom element tagname AND\n // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck\n _isBasicCustomElement(lcTag) && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag)) && (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName) || CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName)) ||\n // Alternative, second condition checks if it's an `is`-attribute, AND\n // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n lcName === 'is' && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(value))) ; else {\n return false;\n }\n /* Check value is safe. First, is attr inert? If so, is safe */\n } else if (URI_SAFE_ATTRIBUTES[lcName]) ; else if (regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if ((lcName === 'src' || lcName === 'xlink:href' || lcName === 'href') && lcTag !== 'script' && stringIndexOf(value, 'data:') === 0 && DATA_URI_TAGS[lcTag]) ; else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if (value) {\n return false;\n } else ;\n return true;\n };\n\n /**\n * _isBasicCustomElement\n * checks if at least one dash is included in tagName, and it's not the first char\n * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name\n *\n * @param {string} tagName name of the tag of the node to sanitize\n * @returns {boolean} Returns true if the tag name meets the basic criteria for a custom element, otherwise false.\n */\n const _isBasicCustomElement = function _isBasicCustomElement(tagName) {\n return tagName !== 'annotation-xml' && stringMatch(tagName, CUSTOM_ELEMENT);\n };\n\n /**\n * _sanitizeAttributes\n *\n * @protect attributes\n * @protect nodeName\n * @protect removeAttribute\n * @protect setAttribute\n *\n * @param {Node} currentNode to sanitize\n */\n const _sanitizeAttributes = function _sanitizeAttributes(currentNode) {\n /* Execute a hook if present */\n _executeHook('beforeSanitizeAttributes', currentNode, null);\n const {\n attributes\n } = currentNode;\n\n /* Check if we have attributes; if not we might have a text node */\n if (!attributes) {\n return;\n }\n const hookEvent = {\n attrName: '',\n attrValue: '',\n keepAttr: true,\n allowedAttributes: ALLOWED_ATTR\n };\n let l = attributes.length;\n\n /* Go backwards over all attributes; safely remove bad ones */\n while (l--) {\n const attr = attributes[l];\n const {\n name,\n namespaceURI,\n value: attrValue\n } = attr;\n const lcName = transformCaseFunc(name);\n let value = name === 'value' ? attrValue : stringTrim(attrValue);\n\n /* Execute a hook if present */\n hookEvent.attrName = lcName;\n hookEvent.attrValue = value;\n hookEvent.keepAttr = true;\n hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set\n _executeHook('uponSanitizeAttribute', currentNode, hookEvent);\n value = hookEvent.attrValue;\n\n /* Did the hooks approve of the attribute? */\n if (hookEvent.forceKeepAttr) {\n continue;\n }\n\n /* Remove attribute */\n _removeAttribute(name, currentNode);\n\n /* Did the hooks approve of the attribute? */\n if (!hookEvent.keepAttr) {\n continue;\n }\n\n /* Work around a security issue in jQuery 3.0 */\n if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(/\\/>/i, value)) {\n _removeAttribute(name, currentNode);\n continue;\n }\n\n /* Sanitize attribute content to be template-safe */\n if (SAFE_FOR_TEMPLATES) {\n arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n value = stringReplace(value, expr, ' ');\n });\n }\n\n /* Is `value` valid for this attribute? */\n const lcTag = transformCaseFunc(currentNode.nodeName);\n if (!_isValidAttribute(lcTag, lcName, value)) {\n continue;\n }\n\n /* Full DOM Clobbering protection via namespace isolation,\n * Prefix id and name attributes with `user-content-`\n */\n if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name')) {\n // Remove the attribute with this value\n _removeAttribute(name, currentNode);\n\n // Prefix the value and later re-create the attribute with the sanitized value\n value = SANITIZE_NAMED_PROPS_PREFIX + value;\n }\n\n /* Work around a security issue with comments inside attributes */\n if (SAFE_FOR_XML && regExpTest(/((--!?|])>)|<\\/(style|title)/i, value)) {\n _removeAttribute(name, currentNode);\n continue;\n }\n\n /* Handle attributes that require Trusted Types */\n if (trustedTypesPolicy && typeof trustedTypes === 'object' && typeof trustedTypes.getAttributeType === 'function') {\n if (namespaceURI) ; else {\n switch (trustedTypes.getAttributeType(lcTag, lcName)) {\n case 'TrustedHTML':\n {\n value = trustedTypesPolicy.createHTML(value);\n break;\n }\n case 'TrustedScriptURL':\n {\n value = trustedTypesPolicy.createScriptURL(value);\n break;\n }\n }\n }\n }\n\n /* Handle invalid data-* attribute set by try-catching it */\n try {\n if (namespaceURI) {\n currentNode.setAttributeNS(namespaceURI, name, value);\n } else {\n /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. \"x-schema\". */\n currentNode.setAttribute(name, value);\n }\n if (_isClobbered(currentNode)) {\n _forceRemove(currentNode);\n } else {\n arrayPop(DOMPurify.removed);\n }\n } catch (_) {}\n }\n\n /* Execute a hook if present */\n _executeHook('afterSanitizeAttributes', currentNode, null);\n };\n\n /**\n * _sanitizeShadowDOM\n *\n * @param {DocumentFragment} fragment to iterate over recursively\n */\n const _sanitizeShadowDOM = function _sanitizeShadowDOM(fragment) {\n let shadowNode = null;\n const shadowIterator = _createNodeIterator(fragment);\n\n /* Execute a hook if present */\n _executeHook('beforeSanitizeShadowDOM', fragment, null);\n while (shadowNode = shadowIterator.nextNode()) {\n /* Execute a hook if present */\n _executeHook('uponSanitizeShadowNode', shadowNode, null);\n\n /* Sanitize tags and elements */\n if (_sanitizeElements(shadowNode)) {\n continue;\n }\n\n /* Deep shadow DOM detected */\n if (shadowNode.content instanceof DocumentFragment) {\n _sanitizeShadowDOM(shadowNode.content);\n }\n\n /* Check attributes, sanitize if necessary */\n _sanitizeAttributes(shadowNode);\n }\n\n /* Execute a hook if present */\n _executeHook('afterSanitizeShadowDOM', fragment, null);\n };\n\n /**\n * Sanitize\n * Public method providing core sanitation functionality\n *\n * @param {String|Node} dirty string or DOM node\n * @param {Object} cfg object\n */\n // eslint-disable-next-line complexity\n DOMPurify.sanitize = function (dirty) {\n let cfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n let body = null;\n let importedNode = null;\n let currentNode = null;\n let returnNode = null;\n /* Make sure we have a string to sanitize.\n DO NOT return early, as this will return the wrong type if\n the user has requested a DOM object rather than a string */\n IS_EMPTY_INPUT = !dirty;\n if (IS_EMPTY_INPUT) {\n dirty = '';\n }\n\n /* Stringify, in case dirty is an object */\n if (typeof dirty !== 'string' && !_isNode(dirty)) {\n if (typeof dirty.toString === 'function') {\n dirty = dirty.toString();\n if (typeof dirty !== 'string') {\n throw typeErrorCreate('dirty is not a string, aborting');\n }\n } else {\n throw typeErrorCreate('toString is not a function');\n }\n }\n\n /* Return dirty HTML if DOMPurify cannot run */\n if (!DOMPurify.isSupported) {\n return dirty;\n }\n\n /* Assign config vars */\n if (!SET_CONFIG) {\n _parseConfig(cfg);\n }\n\n /* Clean up removed elements */\n DOMPurify.removed = [];\n\n /* Check if dirty is correctly typed for IN_PLACE */\n if (typeof dirty === 'string') {\n IN_PLACE = false;\n }\n if (IN_PLACE) {\n /* Do some early pre-sanitization to avoid unsafe root nodes */\n if (dirty.nodeName) {\n const tagName = transformCaseFunc(dirty.nodeName);\n if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place');\n }\n }\n } else if (dirty instanceof Node) {\n /* If dirty is a DOM element, append to an empty document to avoid\n elements being stripped by the parser */\n body = _initDocument('');\n importedNode = body.ownerDocument.importNode(dirty, true);\n if (importedNode.nodeType === NODE_TYPE.element && importedNode.nodeName === 'BODY') {\n /* Node is already a body, use as is */\n body = importedNode;\n } else if (importedNode.nodeName === 'HTML') {\n body = importedNode;\n } else {\n // eslint-disable-next-line unicorn/prefer-dom-node-append\n body.appendChild(importedNode);\n }\n } else {\n /* Exit directly if we have nothing to do */\n if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT &&\n // eslint-disable-next-line unicorn/prefer-includes\n dirty.indexOf('<') === -1) {\n return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(dirty) : dirty;\n }\n\n /* Initialize the document to work on */\n body = _initDocument(dirty);\n\n /* Check we have a DOM node from the data */\n if (!body) {\n return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : '';\n }\n }\n\n /* Remove first element node (ours) if FORCE_BODY is set */\n if (body && FORCE_BODY) {\n _forceRemove(body.firstChild);\n }\n\n /* Get node iterator */\n const nodeIterator = _createNodeIterator(IN_PLACE ? dirty : body);\n\n /* Now start iterating over the created document */\n while (currentNode = nodeIterator.nextNode()) {\n /* Sanitize tags and elements */\n if (_sanitizeElements(currentNode)) {\n continue;\n }\n\n /* Shadow DOM detected, sanitize it */\n if (currentNode.content instanceof DocumentFragment) {\n _sanitizeShadowDOM(currentNode.content);\n }\n\n /* Check attributes, sanitize if necessary */\n _sanitizeAttributes(currentNode);\n }\n\n /* If we sanitized `dirty` in-place, return it. */\n if (IN_PLACE) {\n return dirty;\n }\n\n /* Return sanitized string or DOM */\n if (RETURN_DOM) {\n if (RETURN_DOM_FRAGMENT) {\n returnNode = createDocumentFragment.call(body.ownerDocument);\n while (body.firstChild) {\n // eslint-disable-next-line unicorn/prefer-dom-node-append\n returnNode.appendChild(body.firstChild);\n }\n } else {\n returnNode = body;\n }\n if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmode) {\n /*\n AdoptNode() is not used because internal state is not reset\n (e.g. the past names map of a HTMLFormElement), this is safe\n in theory but we would rather not risk another attack vector.\n The state that is cloned by importNode() is explicitly defined\n by the specs.\n */\n returnNode = importNode.call(originalDocument, returnNode, true);\n }\n return returnNode;\n }\n let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;\n\n /* Serialize doctype if allowed */\n if (WHOLE_DOCUMENT && ALLOWED_TAGS['!doctype'] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) {\n serializedHTML = '\\n' + serializedHTML;\n }\n\n /* Sanitize final string template-safe */\n if (SAFE_FOR_TEMPLATES) {\n arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n serializedHTML = stringReplace(serializedHTML, expr, ' ');\n });\n }\n return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(serializedHTML) : serializedHTML;\n };\n\n /**\n * Public method to set the configuration once\n * setConfig\n *\n * @param {Object} cfg configuration object\n */\n DOMPurify.setConfig = function () {\n let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n _parseConfig(cfg);\n SET_CONFIG = true;\n };\n\n /**\n * Public method to remove the configuration\n * clearConfig\n *\n */\n DOMPurify.clearConfig = function () {\n CONFIG = null;\n SET_CONFIG = false;\n };\n\n /**\n * Public method to check if an attribute value is valid.\n * Uses last set config, if any. Otherwise, uses config defaults.\n * isValidAttribute\n *\n * @param {String} tag Tag name of containing element.\n * @param {String} attr Attribute name.\n * @param {String} value Attribute value.\n * @return {Boolean} Returns true if `value` is valid. Otherwise, returns false.\n */\n DOMPurify.isValidAttribute = function (tag, attr, value) {\n /* Initialize shared config vars if necessary. */\n if (!CONFIG) {\n _parseConfig({});\n }\n const lcTag = transformCaseFunc(tag);\n const lcName = transformCaseFunc(attr);\n return _isValidAttribute(lcTag, lcName, value);\n };\n\n /**\n * AddHook\n * Public method to add DOMPurify hooks\n *\n * @param {String} entryPoint entry point for the hook to add\n * @param {Function} hookFunction function to execute\n */\n DOMPurify.addHook = function (entryPoint, hookFunction) {\n if (typeof hookFunction !== 'function') {\n return;\n }\n hooks[entryPoint] = hooks[entryPoint] || [];\n arrayPush(hooks[entryPoint], hookFunction);\n };\n\n /**\n * RemoveHook\n * Public method to remove a DOMPurify hook at a given entryPoint\n * (pops it from the stack of hooks if more are present)\n *\n * @param {String} entryPoint entry point for the hook to remove\n * @return {Function} removed(popped) hook\n */\n DOMPurify.removeHook = function (entryPoint) {\n if (hooks[entryPoint]) {\n return arrayPop(hooks[entryPoint]);\n }\n };\n\n /**\n * RemoveHooks\n * Public method to remove all DOMPurify hooks at a given entryPoint\n *\n * @param {String} entryPoint entry point for the hooks to remove\n */\n DOMPurify.removeHooks = function (entryPoint) {\n if (hooks[entryPoint]) {\n hooks[entryPoint] = [];\n }\n };\n\n /**\n * RemoveAllHooks\n * Public method to remove all DOMPurify hooks\n */\n DOMPurify.removeAllHooks = function () {\n hooks = {};\n };\n return DOMPurify;\n}\nvar purify = createDOMPurify();\n\nexport { purify as default };\n//# sourceMappingURL=purify.es.mjs.map\n","import React, { useMemo } from 'react';\n// @ts-ignore - DOMPurify 타입 정의 없음\nimport DOMPurify from 'dompurify';\nimport { Div } from '../basic/Div';\nimport type { EditorAttrs } from '../../types';\n\nexport interface HtmlContentProps {\n /**\n * 콘텐츠 (HTML 또는 일반 텍스트)\n */\n content?: string;\n\n /**\n * 콘텐츠가 HTML 형식인지 여부\n * - true: HTML 렌더링 (DOMPurify 적용, prose 스타일)\n * - false: 일반 텍스트 (whitespace-pre-wrap으로 줄바꿈 보존)\n * @default true\n */\n isHtml?: boolean;\n\n /**\n * 사용자 정의 클래스\n */\n className?: string;\n\n /**\n * DOMPurify 설정 오버라이드 (isHtml=true일 때만 사용)\n */\n purifyConfig?: any;\n\n /**\n * 레이아웃 JSON에서 text 속성으로 전달되는 콘텐츠\n * content보다 우선순위가 높음\n */\n text?: string;\n\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * HtmlContent 콘텐츠 렌더링 컴포넌트\n *\n * HTML과 일반 텍스트를 안전하게 렌더링하는 범용 composite 컴포넌트입니다.\n * - isHtml=true: DOMPurify를 사용하여 XSS 공격 방지\n * - isHtml=false: 일반 텍스트로 렌더링 (줄바꿈 보존)\n *\n * @example\n * // HTML 렌더링 (기본값)\n * 안녕하세요

\" />\n *\n * // 일반 텍스트 렌더링\n * \n *\n * // 커스텀 클래스 적용\n * 게시글 내용

\"\n * className=\"prose dark:prose-invert\"\n * />\n *\n * // DOMPurify 설정 커스터마이징 (HTML 모드)\n * 내용

\"\n * purifyConfig={{ ALLOWED_TAGS: ['p', 'br', 'strong', 'em'] }}\n * />\n */\nexport const HtmlContent: React.FC = ({\n content,\n text,\n isHtml = true,\n className = '',\n purifyConfig,\n id,\n editorAttrs,\n}) => {\n // text prop이 우선순위가 높음 (레이아웃 JSON에서 사용)\n const actualContent = text ?? content ?? '';\n\n // 빈 값 처리\n if (!actualContent || actualContent.trim() === '') {\n return null;\n }\n\n // isHtml=false: 일반 텍스트 렌더링\n if (!isHtml) {\n const textClasses = `\n whitespace-pre-wrap\n text-gray-900 dark:text-gray-100\n font-sans\n ${className}\n `.trim().replace(/\\s+/g, ' ');\n\n return (\n
\n {actualContent}\n
\n );\n }\n\n // 기본 DOMPurify 설정 (FORBID 방식: 위험 태그/속성만 차단, 나머지 허용)\n const defaultConfig: any = {\n FORBID_TAGS: [\n // 스크립트 실행\n 'script', 'noscript',\n // 외부 콘텐츠 삽입\n 'iframe', 'frame', 'frameset', 'object', 'embed', 'applet', 'portal',\n // 폼 요소 (피싱 방지)\n 'form', 'input', 'textarea', 'select', 'button',\n // 메타/스타일 조작\n 'style', 'link', 'meta', 'base',\n // 구조 태그 주입\n 'body', 'head', 'html', 'title',\n // SVG/MathML (XSS 벡터)\n 'svg', 'math',\n // 미디어 이벤트 핸들러 (onerror, onloadstart)\n 'audio', 'video', 'source', 'track', 'canvas',\n // UI 오버레이/이벤트\n 'details', 'dialog',\n // HTML 파서 혼란/sanitizer 우회\n 'plaintext', 'xmp', 'listing',\n // 레거시/비표준\n 'marquee', 'noframes', 'noembed', 'template', 'slot',\n ],\n FORBID_ATTR: [\n 'onerror', 'onload', 'onclick', 'onmouseover', 'onfocus', 'onblur',\n 'ontoggle', 'oncanplay', 'onloadstart',\n 'formaction', 'xlink:href', 'action',\n ],\n ALLOW_DATA_ATTR: true,\n ADD_ATTR: ['target'],\n };\n\n // sanitize된 HTML을 메모이제이션\n const sanitizedHtml = useMemo(() => {\n const config = purifyConfig\n ? {\n ...defaultConfig,\n ...purifyConfig,\n // 보안 기본값은 항상 유지 (사용자 설정으로 덮어쓰기 방지)\n FORBID_TAGS: [...defaultConfig.FORBID_TAGS, ...(purifyConfig.FORBID_TAGS || [])],\n FORBID_ATTR: [...defaultConfig.FORBID_ATTR, ...(purifyConfig.FORBID_ATTR || [])],\n }\n : defaultConfig;\n const cleaned = DOMPurify.sanitize(actualContent, config) as unknown as string;\n\n // target=\"_blank\" 링크에 rel 속성 추가 (보안)\n return cleaned.replace(\n /]*?)href=[\"']([^\"']+)[\"']([^>]*?)>/gi,\n (match: string, before: string, href: string, after: string) => {\n if (href.startsWith('http://') || href.startsWith('https://')) {\n if (!match.includes('rel=')) {\n return `
`;\n }\n }\n return match;\n }\n );\n }, [actualContent, purifyConfig]);\n\n // 컨테이너 클래스 조합\n const containerClasses = `\n prose dark:prose-invert max-w-none\n prose-p:my-2\n prose-headings:font-bold prose-headings:mt-6 prose-headings:mb-4\n prose-h1:text-2xl prose-h2:text-xl prose-h3:text-lg\n prose-a:text-blue-600 dark:prose-a:text-blue-400\n prose-a:no-underline hover:prose-a:underline\n prose-blockquote:border-l-4 prose-blockquote:border-gray-300 dark:prose-blockquote:border-gray-600\n prose-blockquote:pl-4 prose-blockquote:italic\n prose-code:bg-gray-100 dark:prose-code:bg-gray-800\n prose-code:px-1 prose-code:py-0.5 prose-code:rounded\n prose-pre:bg-gray-100 dark:prose-pre:bg-gray-800\n prose-pre:p-4 prose-pre:rounded-lg prose-pre:overflow-x-auto\n [&_table]:w-full [&_table]:border-collapse [&_table]:border [&_table]:border-gray-300\n dark:[&_table]:border-gray-600\n [&_th]:border [&_th]:border-gray-300 [&_th]:px-4 [&_th]:py-2 [&_th]:bg-gray-100 [&_th]:text-left\n dark:[&_th]:border-gray-600 dark:[&_th]:bg-gray-800\n [&_td]:border [&_td]:border-gray-300 [&_td]:px-4 [&_td]:py-2\n dark:[&_td]:border-gray-600\n [&_tr:hover]:bg-gray-50 dark:[&_tr:hover]:bg-gray-700/50\n after:content-[''] after:block after:clear-both\n ${className}\n `.trim().replace(/\\s+/g, ' ');\n\n return (\n \n );\n};\n","import React, { useState, useMemo, useRef, useEffect, useCallback } from 'react';\nimport type { EditorAttrs } from '../../types';\nimport { Table } from '../basic/Table';\nimport { Thead } from '../basic/Thead';\nimport { Tbody } from '../basic/Tbody';\nimport { Tfoot } from '../basic/Tfoot';\nimport { Tr } from '../basic/Tr';\nimport { Th } from '../basic/Th';\nimport { Td } from '../basic/Td';\nimport { Button } from '../basic/Button';\nimport { Div } from '../basic/Div';\nimport { Span } from '../basic/Span';\nimport { Checkbox } from '../basic/Checkbox';\nimport { Icon } from '../basic/Icon';\nimport { IconName } from '../basic/IconTypes';\nimport { ActionMenu, ActionMenuItem } from './ActionMenu';\nimport { Pagination } from './Pagination';\nimport { P } from '../basic/P';\nimport { A } from '../basic/A';\nimport { Label } from '../basic/Label';\nimport { Input } from '../basic/Input';\nimport { H1 } from '../basic/H1';\nimport { H2 } from '../basic/H2';\nimport { H3 } from '../basic/H3';\nimport { H4 } from '../basic/H4';\nimport { Img } from '../basic/Img';\nimport { Select } from '../basic/Select';\nimport { Textarea } from '../basic/Textarea';\nimport { MultilingualInput } from './MultilingualInput';\nimport { Toggle } from './Toggle';\nimport { StatusBadge } from './StatusBadge';\nimport { Badge } from './Badge';\nimport { HtmlContent } from './HtmlContent';\n\n// Logger 설정 (G7Core 초기화 전에도 동작하도록 폴백 포함)\nconst logger = ((window as any).G7Core?.createLogger?.('Comp:DataGrid')) ?? {\n log: (...args: unknown[]) => console.log('[Comp:DataGrid]', ...args),\n warn: (...args: unknown[]) => console.warn('[Comp:DataGrid]', ...args),\n error: (...args: unknown[]) => console.error('[Comp:DataGrid]', ...args),\n};\n\n// G7Core.t() 번역 함수 참조\nconst t = (key: string, params?: Record) =>\n (window as any).G7Core?.t?.(key, params) ?? key;\n\n// cellChildren 및 expandChildren 렌더링을 위한 컴포넌트 맵\nconst componentMap: Record> = {\n // basic 컴포넌트\n Div,\n Span,\n Button,\n Icon,\n Checkbox,\n P,\n A,\n Label,\n Input,\n H1,\n H2,\n H3,\n H4,\n Img,\n Select,\n Textarea,\n // Table 관련 컴포넌트 (expandChildren에서 SubGrid 렌더링용)\n Table,\n Thead,\n Tbody,\n Tfoot,\n Tr,\n Th,\n Td,\n // composite 컴포넌트\n MultilingualInput,\n Toggle,\n StatusBadge,\n Badge,\n HtmlContent,\n ActionMenu,\n};\n\nexport interface DataGridCellChild {\n id?: string;\n type: 'basic' | 'composite';\n name: string;\n props?: Record;\n text?: string;\n children?: DataGridCellChild[];\n condition?: string;\n}\n\nexport interface DataGridColumn {\n field: string;\n header: string;\n width?: string;\n sortable?: boolean;\n hidden?: boolean;\n required?: boolean;\n render?: (value: any, row: any) => React.ReactNode;\n cellChildren?: DataGridCellChild[];\n}\n\n/**\n * 확장 행(Expandable Row)에 렌더링할 자식 컴포넌트 정의\n * 레이아웃 JSON에서 사용됩니다.\n */\nexport interface DataGridExpandChildren {\n id?: string;\n type: 'basic' | 'composite';\n name: string;\n props?: Record;\n text?: string;\n children?: DataGridExpandChildren[];\n iteration?: {\n source: string;\n item_var?: string;\n index_var?: string;\n };\n}\n\n/**\n * 서브 행(Sub Row)에 렌더링할 자식 컴포넌트 정의 (v1.6.0+)\n *\n * 각 데이터 행 아래에 추가 정보를 표시하는 병합된 행입니다.\n * expandable row와 달리 항상 표시되거나 조건부로 표시됩니다.\n * 모든 컬럼이 병합된 단일 셀로 렌더링됩니다.\n *\n * @example\n * // 배송비 요약 표시\n * {\n * \"subRowChildren\": [\n * {\n * \"type\": \"basic\",\n * \"name\": \"Span\",\n * \"props\": { \"className\": \"text-sm text-gray-500\" },\n * \"text\": \"{{row.fee_summary}}\"\n * }\n * ],\n * \"subRowCondition\": \"{{row.charge_policy !== 'free'}}\"\n * }\n */\nexport interface DataGridSubRowChildren {\n id?: string;\n type: 'basic' | 'composite';\n name: string;\n props?: Record;\n text?: string;\n children?: DataGridSubRowChildren[];\n condition?: string;\n}\n\n/**\n * 푸터 행(Footer Row)의 각 셀 정의 (v1.19.0+)\n *\n * 테이블 하단에 합계/요약 행을 표시합니다.\n * 각 셀은 특정 컬럼의 field에 매핑되거나, colSpan으로 여러 컬럼을 병합합니다.\n */\nexport interface DataGridFooterCell {\n /** 매핑할 컬럼 field명 (이 필드의 컬럼 위치에 셀 배치) */\n field?: string;\n /** 병합할 컬럼 수 (field 미지정 시 사용) */\n colSpan?: number;\n /** 셀 CSS 클래스 */\n className?: string;\n /** 셀 내부에 렌더링할 컴포넌트 (cellChildren과 동일 구조) */\n children?: DataGridCellChild[];\n /** 단순 텍스트 (children 미사용 시) */\n text?: string;\n}\n\nexport interface DataGridProps {\n /** DOM id (transition_overlay.target / overlay_target 으로 spinner mount 영역 지정용) */\n id?: string;\n columns: DataGridColumn[];\n data: any[];\n sortable?: boolean;\n pagination?: boolean;\n pageSize?: number;\n onRowClick?: (row: any) => void;\n className?: string;\n style?: React.CSSProperties;\n\n // 정렬 기능 (외부 제어)\n sortField?: string | null;\n sortDirection?: 'asc' | 'desc';\n onSortChange?: (field: string, direction: 'asc' | 'desc') => void;\n\n // 체크박스 선택 기능\n selectable?: boolean;\n selectedIds?: (string | number)[];\n onSelectionChange?: (ids: (string | number)[]) => void;\n idField?: string;\n\n // 컬럼 표시/숨김 기능\n showColumnSelector?: boolean;\n visibleColumns?: string[];\n onColumnVisibilityChange?: (fields: string[]) => void;\n\n // 반응형 카드 뷰\n responsiveBreakpoint?: number;\n cardRenderer?: (row: any, columns: DataGridColumn[]) => React.ReactNode;\n\n // 행 액션 메뉴\n rowActions?: ActionMenuItem[];\n onRowAction?: (actionId: string | number, row: any) => void;\n\n // 페이지네이션 항상 표시 옵션\n alwaysShowPagination?: boolean;\n\n // 서버 사이드 페이지네이션 (API에서 페이지네이션 처리 시)\n serverSidePagination?: boolean;\n serverCurrentPage?: number;\n serverTotalPages?: number;\n onPageChange?: (page: number) => void;\n\n // 다국어 지원 텍스트 (레이아웃 JSON에서 $t: 문법으로 전달)\n prevText?: string;\n nextText?: string;\n columnSelectorText?: string;\n emptyMessage?: string;\n actionsColumnHeader?: string;\n requiredText?: string;\n selectedCountText?: string;\n loadErrorMessage?: string;\n\n // 페이지네이션 옵션\n showFirstLast?: boolean;\n\n // 확장 행 (Expandable Row) 기능 - v1.3.0+\n expandable?: boolean;\n expandedRowIds?: (string | number)[];\n onExpandChange?: (ids: (string | number)[]) => void;\n expandChildren?: DataGridExpandChildren[];\n expandedRowRender?: (row: any) => React.ReactNode;\n expandColumnWidth?: string;\n expandIconExpanded?: IconName;\n expandIconCollapsed?: IconName;\n /** 행 단위 조건부 확장 필드명 — 해당 필드가 truthy인 행만 확장 가능 */\n expandConditionField?: string;\n\n /**\n * 동적 컬럼 배열 (v1.4.0+)\n *\n * 기존 columns 배열에 동적으로 병합될 컬럼들입니다.\n * insertAfterField가 지정된 경우 해당 필드 뒤에 삽입되고,\n * 그렇지 않으면 columns 배열 끝에 추가됩니다.\n *\n * 모듈 핸들러의 resultTo 패턴과 함께 사용하여\n * 환경설정 기반 동적 컬럼을 구현할 수 있습니다.\n *\n * @example\n * // 레이아웃 JSON에서 init_action으로 동적 컬럼 생성\n * {\n * \"handler\": \"sirsoft-ecommerce.buildProductColumns\",\n * \"params\": { ... },\n * \"resultTo\": { \"target\": \"_local\", \"key\": \"dynamicCols\" }\n * }\n *\n * // DataGrid에서 동적 컬럼 사용\n * {\n * \"name\": \"DataGrid\",\n * \"props\": {\n * \"columns\": [...],\n * \"dynamicColumns\": \"{{_local.dynamicCols}}\"\n * }\n * }\n */\n dynamicColumns?: DataGridColumn[];\n\n /**\n * 동적 컬럼 삽입 위치를 지정하는 필드명\n * 해당 필드 뒤에 dynamicColumns가 삽입됩니다.\n * 지정하지 않으면 columns 끝에 추가됩니다.\n */\n dynamicColumnsInsertAfter?: string;\n\n /**\n * expandChildren에 전달할 추가 컨텍스트 (v1.5.0+)\n *\n * expandChildren 렌더링 시 row 외에 추가로 전달할 데이터입니다.\n * 레이아웃 JSON에서 _local, _computed 값 등을 전달할 때 사용합니다.\n *\n * @example\n * {\n * \"name\": \"DataGrid\",\n * \"props\": {\n * \"expandContext\": {\n * \"optionColumns\": \"{{_local.optionColumns}}\",\n * \"currencies\": \"{{_computed.optionCurrencyColumns}}\"\n * }\n * }\n * }\n */\n expandContext?: Record;\n\n /**\n * 부모 컴포넌트 컨텍스트 (내부 사용)\n *\n * DynamicRenderer에서 전달되며, expandChildren 내부 액션에서\n * G7Core.state.setLocal()이 부모 상태를 업데이트할 수 있도록 합니다.\n */\n __componentContext?: { state?: any; setState?: (updates: any) => void };\n\n // 서브 행 (Sub Row) 기능 - v1.6.0+ (선택적)\n /**\n * 서브 행에 렌더링할 컴포넌트 정의\n *\n * 각 데이터 행 아래에 추가 정보를 표시합니다.\n * 모든 컬럼이 병합된 단일 셀로 렌더링됩니다.\n * 이 prop이 없거나 빈 배열이면 서브 행이 표시되지 않습니다.\n *\n * @example\n * // 배송비 요약을 서브 행으로 표시\n * {\n * \"subRowChildren\": [\n * {\n * \"type\": \"basic\",\n * \"name\": \"Span\",\n * \"props\": { \"className\": \"text-sm text-gray-500\" },\n * \"text\": \"배송비: {{row.fee_summary}}\"\n * }\n * ]\n * }\n */\n subRowChildren?: DataGridSubRowChildren[];\n\n /**\n * 서브 행 표시 조건 (선택적)\n *\n * JavaScript 표현식으로, true일 때만 서브 행이 표시됩니다.\n * row 객체에 접근할 수 있습니다.\n *\n * @example\n * \"{{row.charge_policy !== 'free'}}\" // 무료 배송이 아닐 때만 표시\n * \"{{row.fee_summary}}\" // fee_summary가 있을 때만 표시\n */\n subRowCondition?: string;\n\n /**\n * 서브 행 셀의 CSS 클래스 (선택적)\n *\n * @default \"px-6 py-2 bg-gray-50 dark:bg-gray-900\"\n */\n subRowClassName?: string;\n\n /**\n * 서브 행 렌더 함수 (선택적)\n *\n * subRowChildren 대신 함수로 서브 행 내용을 렌더링합니다.\n * TypeScript/React 코드에서 직접 사용할 때 유용합니다.\n */\n subRowRender?: (row: any) => React.ReactNode;\n\n /**\n * 푸터 행 셀 정의 (v1.19.0+)\n *\n * 테이블 하단에 합계/요약 행을 렌더링합니다.\n * 각 셀은 field로 컬럼 위치에 매핑하거나 colSpan으로 병합합니다.\n *\n * @example\n * {\n * \"footerCells\": [\n * { \"field\": \"product_info\", \"text\": \"합계\", \"className\": \"font-bold\" },\n * { \"field\": \"quantity\", \"text\": \"3개\" },\n * { \"field\": \"subtotal\", \"text\": \"690,000원\", \"className\": \"font-bold\" }\n * ]\n * }\n */\n footerCells?: DataGridFooterCell[];\n\n /**\n * 푸터 행 CSS 클래스 (선택적)\n *\n * @default \"bg-gray-50 dark:bg-gray-800/50 font-medium\"\n */\n footerClassName?: string;\n\n /**\n * 모바일 카드 뷰에서 푸터 렌더링용 컴포넌트 (선택적)\n *\n * 미지정 시 footerCells를 key-value 형태로 자동 렌더링합니다.\n */\n footerCardChildren?: DataGridCellChild[];\n\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * 셀 값을 안전하게 렌더링 가능한 형태로 변환합니다.\n * React에서 객체를 직접 렌더링하면 에러가 발생하므로 이를 방지합니다.\n *\n * @param value 렌더링할 값\n * @returns 렌더링 가능한 문자열 또는 원본 값\n */\nconst safeRenderValue = (value: any): React.ReactNode => {\n // null, undefined는 빈 문자열로\n if (value === null || value === undefined) {\n return '';\n }\n\n // 원시 타입은 그대로 반환\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n return String(value);\n }\n\n // 배열인 경우 각 요소를 안전하게 변환 후 조인\n if (Array.isArray(value)) {\n return value.map((v) => safeRenderValue(v)).join(', ');\n }\n\n // 객체인 경우 (React 노드 제외)\n if (typeof value === 'object') {\n // React 엘리먼트인 경우 그대로 반환\n if (React.isValidElement(value)) {\n return value;\n }\n\n // MissingValue나 빈 객체 처리 (Laravel의 $this->when() 반환값)\n if (Object.keys(value).length === 0) {\n return '';\n }\n\n // 일반 객체는 JSON 문자열로 변환 시도\n try {\n return JSON.stringify(value);\n } catch {\n logger.warn('객체를 문자열로 변환할 수 없습니다:', value);\n return '[Object]';\n }\n }\n\n // 그 외의 경우 문자열로 변환\n return String(value);\n};\n\n/**\n * subRow 컨테이너의 표시 조건을 평가합니다.\n * JSX 인라인 조건에서 사용되므로 엔진 위임 불가 — 직접 평가합니다.\n *\n * @param condition 조건 문자열 (예: \"{{row.charge_policy !== 'free'}}\")\n * @param row 현재 행 데이터\n * @returns 조건 평가 결과\n */\nconst evaluateSubRowCondition = (condition: string | undefined, row: any): boolean => {\n if (!condition) return true;\n\n // {{...}} 패턴 추출\n const match = condition.match(/^\\{\\{(.+)\\}\\}$/);\n if (!match) return true;\n\n const expr = match[1].trim();\n\n try {\n // row 컨텍스트에서 표현식 평가\n // eslint-disable-next-line no-new-func\n const evaluator = new Function('row', `return ${expr}`);\n return !!evaluator(row);\n } catch (error) {\n logger.warn('subRow 조건 평가 실패:', condition, error);\n return true;\n }\n};\n\n/**\n * cellChildren 배열을 React 요소로 렌더링합니다.\n *\n * G7Core.renderItemChildren을 사용하여 템플릿 엔진의 모든 표현식 처리 기능을 활용합니다.\n * condition 속성은 엔진의 evaluateRenderCondition에서 네이티브로 지원됩니다 (engine-v1.17.1).\n */\nconst renderCellChildren = (\n cellChildren: DataGridCellChild[],\n row: any,\n value: any,\n keyPrefix: string = '',\n componentContext?: { state?: any; setState?: (updates: any) => void }\n): React.ReactNode => {\n const G7Core = (window as any).G7Core;\n if (G7Core?.renderItemChildren) {\n const context = {\n row,\n value,\n $value: value,\n };\n\n return G7Core.renderItemChildren(\n cellChildren,\n context,\n componentMap,\n keyPrefix,\n componentContext ? { componentContext } : undefined\n );\n }\n\n logger.warn('G7Core.renderItemChildren을 사용할 수 없습니다.');\n return null;\n};\n\n/**\n * subRowChildren 배열을 React 요소로 렌더링합니다.\n *\n * @param subRowChildren 렌더링할 컴포넌트 정의 배열\n * @param row 현재 행 데이터\n * @param keyPrefix 키 접두사\n * @returns React 노드\n */\nconst renderSubRowChildren = (\n subRowChildren: DataGridSubRowChildren[],\n row: any,\n keyPrefix: string = '',\n componentContext?: { state?: any; setState?: (updates: any) => void }\n): React.ReactNode => {\n const G7Core = (window as any).G7Core;\n\n if (G7Core?.renderItemChildren) {\n const context = {\n row,\n $value: row,\n };\n\n return G7Core.renderItemChildren(\n subRowChildren,\n context,\n componentMap,\n keyPrefix,\n componentContext ? { componentContext } : undefined\n );\n }\n\n logger.warn('G7Core.renderItemChildren을 사용할 수 없습니다.');\n return null;\n};\n\n/**\n * DataGrid 집합 컴포넌트\n *\n * Table 기본 컴포넌트를 조합하여 데이터 그리드 UI를 구성합니다.\n * 정렬, 필터, 페이지네이션, 체크박스 선택, 컬럼 선택, 반응형 카드 뷰 기능을 포함합니다.\n *\n * @example\n * // 레이아웃 JSON 사용 예시\n * {\n * \"name\": \"DataGrid\",\n * \"props\": {\n * \"columns\": [\n * {\"field\": \"name\", \"header\": \"$t:admin.users.name\", \"sortable\": true, \"required\": true},\n * {\"field\": \"email\", \"header\": \"$t:admin.users.email\", \"required\": true}\n * ],\n * \"data\": \"{{users.data}}\",\n * \"sortable\": true,\n * \"pagination\": true,\n * \"pageSize\": 10,\n * \"selectable\": true,\n * \"showColumnSelector\": true,\n * \"prevText\": \"$t:common.prev\",\n * \"nextText\": \"$t:common.next\",\n * \"columnSelectorText\": \"$t:common.column_selector\",\n * \"emptyMessage\": \"$t:common.no_data\",\n * \"actionsColumnHeader\": \"$t:common.actions\",\n * \"requiredText\": \"$t:common.required\"\n * }\n * }\n */\nexport const DataGrid: React.FC = ({\n id,\n columns,\n data,\n sortable = true,\n pagination = false,\n pageSize = 10,\n onRowClick,\n className = '',\n style,\n // 정렬 (외부 제어)\n sortField: externalSortField,\n sortDirection: externalSortDirection,\n onSortChange,\n // 체크박스 선택\n selectable = false,\n selectedIds = [],\n onSelectionChange,\n idField = 'id',\n // 컬럼 표시/숨김\n showColumnSelector = false,\n visibleColumns: initialVisibleColumns,\n onColumnVisibilityChange,\n // 반응형\n responsiveBreakpoint = 768,\n cardRenderer,\n // 행 액션\n rowActions,\n onRowAction,\n // 페이지네이션 항상 표시\n alwaysShowPagination = false,\n // 서버 사이드 페이지네이션\n serverSidePagination = false,\n serverCurrentPage,\n serverTotalPages,\n onPageChange,\n // 다국어 텍스트\n prevText,\n nextText,\n columnSelectorText,\n emptyMessage,\n actionsColumnHeader,\n requiredText,\n selectedCountText,\n // 페이지네이션 옵션\n showFirstLast = true,\n // 확장 행 (Expandable Row)\n expandable = false,\n expandedRowIds: externalExpandedRowIds,\n onExpandChange,\n expandChildren,\n expandedRowRender,\n expandColumnWidth = '48px',\n expandIconExpanded = IconName.ChevronDown,\n expandIconCollapsed = IconName.ChevronRight,\n expandConditionField,\n // 동적 컬럼\n dynamicColumns,\n dynamicColumnsInsertAfter,\n // expandChildren 추가 컨텍스트\n expandContext,\n // 부모 컴포넌트 컨텍스트 (내부 사용)\n __componentContext,\n // 서브 행 (Sub Row) - 선택적\n subRowChildren,\n subRowCondition,\n subRowClassName = 'px-6 py-2 bg-gray-50 dark:bg-gray-900',\n subRowRender,\n // 푸터 행 (Footer Row) - v1.19.0+\n footerCells,\n footerClassName = 'bg-gray-50 dark:bg-gray-800/50 font-medium',\n footerCardChildren,\n editorAttrs,\n}) => {\n // props로 전달된 값이 없으면 undefined (Pagination이 기본 화살표 사용)\n const resolvedPrevText = prevText || undefined;\n const resolvedNextText = nextText || undefined;\n const resolvedColumnSelectorText = columnSelectorText ?? t('common.column_selector');\n const resolvedEmptyMessage = emptyMessage ?? t('common.no_data');\n const resolvedActionsColumnHeader = actionsColumnHeader ?? t('common.actions');\n const resolvedRequiredText = requiredText ?? t('common.required');\n const resolvedSelectedCountText = selectedCountText ?? t('common.selected_count');\n\n // G7Core.useControllableState 훅 참조 (Phase 2-2)\n const G7Core = (window as any).G7Core;\n const useControllableState = G7Core?.useControllableState as\n | ((\n controlledValue: T | undefined,\n defaultValue: T,\n onChange?: (value: T) => void,\n options?: { isEqual?: (a: T, b: T) => boolean }\n ) => [T, (value: T | ((prev: T) => T)) => void])\n | undefined;\n const shallowArrayEqual = G7Core?.shallowArrayEqual as\n | ((a: T[], b: T[]) => boolean)\n | undefined;\n\n // 정렬 상태 - useControllableState 적용\n // 외부 제어(externalSortField)가 있으면 Controlled, 없으면 Uncontrolled\n const [sortField, setSortField] = useControllableState\n ? useControllableState(externalSortField, null, (value: string | null) => {\n if (value !== null) {\n onSortChange?.(value, sortDirection);\n }\n })\n : [externalSortField ?? null, () => {}];\n\n const [sortDirection, setSortDirection] = useControllableState\n ? useControllableState<'asc' | 'desc'>(externalSortDirection, 'asc', (value: 'asc' | 'desc') => {\n if (sortField !== null) {\n onSortChange?.(sortField, value);\n }\n })\n : [externalSortDirection ?? 'asc', () => {}];\n\n const [currentPage, setCurrentPage] = useState(1);\n\n // 확장 행 상태 관리 - useControllableState 적용 (Phase 2-2)\n // 외부 제어(externalExpandedRowIds)가 있으면 Controlled, 없으면 Uncontrolled\n const [expandedRowIds, setExpandedRowIds] = useControllableState\n ? useControllableState<(string | number)[]>(\n externalExpandedRowIds,\n [],\n onExpandChange,\n { isEqual: shallowArrayEqual }\n )\n : [externalExpandedRowIds ?? [], () => {}];\n const [isColumnSelectorOpen, setIsColumnSelectorOpen] = useState(false);\n const columnSelectorRef = useRef(null);\n\n // G7Core.useResponsive를 통해 반응형 상태 구독\n // G7Core는 위에서 이미 선언됨 (Phase 2-2)\n const useResponsive = G7Core?.useResponsive;\n const responsiveValue = useResponsive?.();\n const isMobileView = responsiveValue\n ? responsiveValue.width < responsiveBreakpoint\n : typeof window !== 'undefined' && window.innerWidth < responsiveBreakpoint;\n\n // 동적 컬럼 병합\n // dynamicColumns가 있으면 columns에 병합하고, dynamicColumnsInsertAfter 위치에 삽입\n const mergedColumns = useMemo(() => {\n if (!dynamicColumns || !Array.isArray(dynamicColumns) || dynamicColumns.length === 0) {\n return columns;\n }\n\n // 삽입 위치 찾기\n if (dynamicColumnsInsertAfter) {\n const insertIndex = columns.findIndex((col) => col.field === dynamicColumnsInsertAfter);\n if (insertIndex !== -1) {\n return [\n ...columns.slice(0, insertIndex + 1),\n ...dynamicColumns,\n ...columns.slice(insertIndex + 1),\n ];\n }\n }\n\n // 삽입 위치가 없으면 끝에 추가\n return [...columns, ...dynamicColumns];\n }, [columns, dynamicColumns, dynamicColumnsInsertAfter]);\n\n // 표시할 컬럼 관리 (hidden 속성 기반 초기값 설정)\n // 참고: mergedColumns가 변경되면 useEffect에서 동기화됨\n const [visibleColumns, setVisibleColumns] = useState(() => {\n if (initialVisibleColumns && initialVisibleColumns.length > 0) return initialVisibleColumns;\n return columns.filter((col) => !col.hidden).map((col) => col.field);\n });\n\n // 외부 visibleColumns가 변경되면 내부 상태 동기화\n useEffect(() => {\n if (initialVisibleColumns && initialVisibleColumns.length > 0) {\n setVisibleColumns(initialVisibleColumns);\n }\n }, [initialVisibleColumns]);\n\n // columns prop이 변경되면 (다른 DataGrid = 다른 페이지) 내부 visibleColumns 리셋\n const prevColumnFieldsRef = useRef('');\n useEffect(() => {\n const currentFields = columns.map(col => col.field).join(',');\n if (prevColumnFieldsRef.current && currentFields !== prevColumnFieldsRef.current) {\n // columns가 변경되었고, 외부 visibleColumns가 없으면 새 columns 기준으로 리셋\n if (!initialVisibleColumns || initialVisibleColumns.length === 0) {\n setVisibleColumns(columns.filter(col => !col.hidden).map(col => col.field));\n }\n }\n prevColumnFieldsRef.current = currentFields;\n }, [columns, initialVisibleColumns]);\n\n // 동적 컬럼이 추가되면 visibleColumns에 자동으로 포함\n // 단, 외부에서 전달된 initialVisibleColumns가 있으면 그 값을 존중\n const prevDynamicFieldsRef = useRef([]);\n const hasInitialColumnsRef = useRef(null);\n\n useEffect(() => {\n if (dynamicColumns && dynamicColumns.length > 0) {\n const currentDynamicFields = dynamicColumns.map((col) => col.field);\n\n // 최초 실행 시 initialVisibleColumns 존재 여부 확인\n if (hasInitialColumnsRef.current === null) {\n hasInitialColumnsRef.current = initialVisibleColumns !== undefined && initialVisibleColumns.length > 0;\n\n // initialVisibleColumns가 있으면 현재 동적 필드를 \"이미 알려진\" 것으로 기록\n // 이렇게 하면 외부에서 관리하는 visibleColumns를 존중함\n if (hasInitialColumnsRef.current) {\n prevDynamicFieldsRef.current = currentDynamicFields;\n return; // 외부 visibleColumns 존중, 자동 추가 안 함\n }\n }\n\n const prevDynamicFields = prevDynamicFieldsRef.current;\n\n // 새로 추가된 동적 필드만 찾기 (기존에 없던 필드)\n const trulyNewFields = currentDynamicFields.filter(\n (field) => !prevDynamicFields.includes(field)\n );\n\n // 새로운 동적 필드가 있을 때만 자동 추가\n if (trulyNewFields.length > 0) {\n const fieldsToAdd = trulyNewFields.filter((field) => !visibleColumns.includes(field));\n if (fieldsToAdd.length > 0) {\n const updatedVisible = [...visibleColumns, ...fieldsToAdd];\n setVisibleColumns(updatedVisible);\n onColumnVisibilityChange?.(updatedVisible);\n }\n }\n\n // 현재 동적 필드 목록 저장\n prevDynamicFieldsRef.current = currentDynamicFields;\n }\n }, [dynamicColumns]); // visibleColumns 의존성 제외하여 무한 루프 방지\n\n // 데이터가 변경되면 첫 페이지로 리셋 (서버 사이드 페이지네이션이 아닐 때만)\n useEffect(() => {\n if (!serverSidePagination) {\n setCurrentPage(1);\n }\n }, [data, serverSidePagination]);\n\n // 컬럼 선택 메뉴 외부 클릭 감지\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (columnSelectorRef.current && !columnSelectorRef.current.contains(event.target as Node)) {\n setIsColumnSelectorOpen(false);\n }\n };\n\n if (isColumnSelectorOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n }\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [isColumnSelectorOpen]);\n\n // 표시할 컬럼 필터링 (mergedColumns에서 visibleColumns만 표시)\n // showColumnSelector가 false이고 외부 visibleColumns도 없으면 모든 비-hidden 컬럼 표시\n // (SPA 네비게이션 시 React 컴포넌트 재사용으로 이전 페이지의 visibleColumns가 남는 문제 방지)\n const displayColumns = useMemo(() => {\n if (!showColumnSelector && (!initialVisibleColumns || initialVisibleColumns.length === 0)) {\n return mergedColumns.filter((col) => !col.hidden);\n }\n return mergedColumns.filter((col) => visibleColumns.includes(col.field));\n }, [mergedColumns, visibleColumns, showColumnSelector, initialVisibleColumns]);\n\n // 정렬 처리\n // onSortChange 가 연결된 경우(controlled) 정렬 주체는 서버다. 헤더 클릭 →\n // onSortChange → 상위가 query 갱신 후 API 재요청 → 서버가 새 순서를 내려준다.\n // 이때 data 는 이미 서버가 정렬한 결과이므로 클라이언트가 다시 정렬하면 안 된다\n // (프론트는 서버가 내려준 순서를 그대로 출력한다). 특히 클라이언트 정렬은 null\n // 값 비교 시 항상 앞으로 밀어 서버 ORDER BY 순서를 훼손한다.\n // onSortChange 가 없는 경우(uncontrolled)에만 컴포넌트가 단독 정렬 주체로서\n // 전달받은 로컬 데이터를 클라이언트에서 정렬한다.\n const sortedData = useMemo(() => {\n if (!sortField || !sortable || !data) return data || [];\n if (onSortChange) return data;\n\n return [...data].sort((a, b) => {\n const aValue = a[sortField];\n const bValue = b[sortField];\n\n if (aValue === bValue) return 0;\n\n const comparison = aValue > bValue ? 1 : -1;\n return sortDirection === 'asc' ? comparison : -comparison;\n });\n }, [data, sortField, sortDirection, sortable, onSortChange]);\n\n // 페이지네이션 처리\n const paginatedData = useMemo(() => {\n // 서버 사이드 페이지네이션인 경우 데이터를 그대로 사용 (이미 서버에서 페이징됨)\n if (serverSidePagination) return sortedData;\n if (!pagination) return sortedData;\n\n const start = (currentPage - 1) * pageSize;\n const end = start + pageSize;\n return sortedData.slice(start, end);\n }, [sortedData, currentPage, pageSize, pagination, serverSidePagination]);\n\n // 서버 사이드 페이지네이션인 경우 서버에서 전달된 값 사용\n const effectiveCurrentPage = serverSidePagination ? (serverCurrentPage || 1) : currentPage;\n const effectiveTotalPages = serverSidePagination ? (serverTotalPages || 1) : Math.ceil((sortedData?.length || 0) / pageSize);\n\n // 페이지 변경 핸들러\n const handlePageChange = useCallback((page: number) => {\n if (serverSidePagination && onPageChange) {\n onPageChange(page);\n } else {\n setCurrentPage(page);\n }\n }, [serverSidePagination, onPageChange]);\n\n // 정렬 토글 (Phase 2-2: useControllableState로 단순화)\n const handleSort = (field: string) => {\n if (!sortable) return;\n\n const column = columns.find((col) => col.field === field);\n if (column?.sortable === false) return;\n\n const newDirection: 'asc' | 'desc' = sortField === field && sortDirection === 'asc' ? 'desc' : 'asc';\n\n // useControllableState 사용 시: setter가 onChange 콜백 자동 호출\n // 폴백 시: 직접 onSortChange 호출\n if (useControllableState) {\n setSortField(field);\n setSortDirection(newDirection);\n } else if (onSortChange) {\n onSortChange(field, newDirection);\n }\n };\n\n // 전체 선택 처리\n const handleSelectAll = useCallback(() => {\n if (!onSelectionChange || !paginatedData) return;\n\n const allIds = paginatedData.map((row) => row[idField]);\n const allSelected = allIds.every((id) => selectedIds.includes(id));\n\n if (allSelected) {\n onSelectionChange(selectedIds.filter((id) => !allIds.includes(id)));\n } else {\n const newSelectedIds = [...new Set([...selectedIds, ...allIds])];\n onSelectionChange(newSelectedIds);\n }\n }, [paginatedData, selectedIds, onSelectionChange, idField]);\n\n // 개별 선택 처리\n const handleSelectRow = useCallback(\n (rowId: string | number) => {\n if (!onSelectionChange) return;\n\n if (selectedIds.includes(rowId)) {\n onSelectionChange(selectedIds.filter((id) => id !== rowId));\n } else {\n onSelectionChange([...selectedIds, rowId]);\n }\n },\n [selectedIds, onSelectionChange]\n );\n\n // 컬럼 표시/숨김 토글\n const handleColumnToggle = useCallback(\n (field: string) => {\n const column = mergedColumns.find((col) => col.field === field);\n if (column?.required) return;\n\n const newVisibleColumns = visibleColumns.includes(field)\n ? visibleColumns.filter((f) => f !== field)\n : [...visibleColumns, field];\n\n setVisibleColumns(newVisibleColumns);\n onColumnVisibilityChange?.(newVisibleColumns);\n },\n [mergedColumns, visibleColumns, onColumnVisibilityChange]\n );\n\n // 행 액션 처리\n const handleRowAction = useCallback(\n (actionId: string | number, row: any) => {\n onRowAction?.(actionId, row);\n },\n [onRowAction]\n );\n\n /**\n * 행 데이터 기반으로 rowActions의 disabled 상태를 결정합니다.\n * disabledField가 지정된 경우 해당 경로의 값이 falsy면 disabled 처리합니다.\n */\n const resolveRowActions = useCallback(\n (row: any): ActionMenuItem[] => {\n if (!rowActions) return [];\n return rowActions.map((action) => {\n let isDisabled = action.disabled ?? false;\n if (action.disabledField && !isDisabled) {\n const parts = action.disabledField.split('.');\n let value: any = row;\n for (const part of parts) {\n value = value?.[part];\n }\n if (!value) {\n isDisabled = true;\n }\n }\n return {\n ...action,\n disabled: isDisabled,\n onClick: () => handleRowAction(action.id, row),\n };\n });\n },\n [rowActions, handleRowAction]\n );\n\n // 행 단위 확장 가능 여부 확인\n const isRowExpandable = useCallback(\n (row: any): boolean => {\n if (!expandConditionField) return true;\n const value = row[expandConditionField];\n return Array.isArray(value) ? value.length > 0 : !!value;\n },\n [expandConditionField]\n );\n\n // 확장 행 토글 처리\n // 확장 토글 (Phase 2-2: useControllableState로 단순화)\n const handleExpandToggle = useCallback(\n (rowId: string | number) => {\n const newExpandedIds = expandedRowIds.includes(rowId)\n ? expandedRowIds.filter((id: string | number) => id !== rowId)\n : [...expandedRowIds, rowId];\n\n // useControllableState 사용 시: setter가 onChange 콜백 자동 호출\n // 폴백 시: 직접 onExpandChange 호출\n if (useControllableState) {\n setExpandedRowIds(newExpandedIds);\n } else if (onExpandChange) {\n onExpandChange(newExpandedIds);\n }\n },\n [expandedRowIds, onExpandChange, useControllableState, setExpandedRowIds]\n );\n\n // 행이 확장되었는지 확인\n const isRowExpanded = useCallback(\n (rowId: string | number) => expandedRowIds.includes(rowId),\n [expandedRowIds]\n );\n\n // 확장 행 콘텐츠 렌더링 (Phase 2-1: G7Core.renderExpandContent API 사용으로 간소화)\n const renderExpandedContent = useCallback(\n (row: any) => {\n // expandedRowRender 함수가 제공된 경우 우선 사용\n if (expandedRowRender) {\n return expandedRowRender(row);\n }\n\n // expandChildren이 제공된 경우 G7Core.renderExpandContent 사용\n // 기존 ~80줄의 복잡한 로직이 renderExpandContent API 내부로 캡슐화됨\n // G7Core는 컴포넌트 시작 부분에서 이미 선언됨 (Phase 2-2)\n if (expandChildren && expandChildren.length > 0 && G7Core?.renderExpandContent) {\n return G7Core.renderExpandContent({\n children: expandChildren,\n row,\n expandContext,\n componentContext: __componentContext,\n componentMap,\n keyPrefix: `expand-${row[idField]}`,\n });\n }\n\n return null;\n },\n // __componentContext?.state를 의존성에 추가하여 상태 변경 시 확장 영역이 다시 렌더링되도록 함\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [expandedRowRender, expandChildren, idField, expandContext, __componentContext, __componentContext?.state]\n );\n\n // 전체 선택 상태 계산\n const isAllSelected = useMemo(() => {\n if (!paginatedData || paginatedData.length === 0) return false;\n return paginatedData.every((row) => selectedIds.includes(row[idField]));\n }, [paginatedData, selectedIds, idField]);\n\n const isIndeterminate = useMemo(() => {\n if (!paginatedData || paginatedData.length === 0) return false;\n const selectedCount = paginatedData.filter((row) => selectedIds.includes(row[idField])).length;\n return selectedCount > 0 && selectedCount < paginatedData.length;\n }, [paginatedData, selectedIds, idField]);\n\n // 기본 카드 렌더러\n const defaultCardRenderer = (row: any, cols: DataGridColumn[]) => {\n const rowId = row[idField];\n const expanded = isRowExpanded(rowId);\n\n return (\n
\n
\n {/* 확장 버튼 (카드 뷰) */}\n {expandable && isRowExpandable(row) && (\n handleExpandToggle(rowId)}\n className=\"p-1.5 rounded-md hover:bg-gray-100 dark:hover:bg-gray-600 transition-colors mr-2\"\n aria-label={expanded ? 'Collapse card' : 'Expand card'}\n >\n \n \n )}\n\n {selectable && (\n handleSelectRow(row[idField])}\n className=\"w-4 h-4 text-blue-600 border-gray-300 dark:border-gray-600 rounded mr-3 mt-1\"\n />\n )}\n
\n
\n {cols.map((col) => (\n
\n \n {col.header}\n \n
\n {col.cellChildren && col.cellChildren.length > 0\n ? renderCellChildren(col.cellChildren, row, row[col.field], `card-${row[idField]}-${col.field}`, __componentContext)\n : col.render\n ? col.render(row[col.field], row)\n : safeRenderValue(row[col.field])}\n
\n
\n ))}\n
\n
\n {rowActions && rowActions.length > 0 && (\n
\n \n
\n )}\n
\n\n {/* 확장된 콘텐츠 (카드 뷰) */}\n {expandable && expanded && isRowExpandable(row) && (\n
\n {renderExpandedContent(row)}\n
\n )}\n\n {/* 서브 행 콘텐츠 (카드 뷰) */}\n {(subRowChildren && subRowChildren.length > 0 || subRowRender) &&\n evaluateSubRowCondition(subRowCondition, row) && (\n
\n {subRowRender\n ? subRowRender(row)\n : renderSubRowChildren(subRowChildren!, row, `card-subrow-${rowId}`, __componentContext)}\n
\n )}\n
\n );\n };\n\n // 모바일 카드 뷰\n if (isMobileView) {\n return (\n
\n {/* 컬럼 선택 메뉴 */}\n {showColumnSelector && (\n
\n
\n setIsColumnSelectorOpen(!isColumnSelectorOpen)}\n className=\"flex items-center gap-2 px-4 py-2 bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700\"\n >\n \n \n {resolvedColumnSelectorText}\n \n \n\n {isColumnSelectorOpen && (\n
\n
\n {mergedColumns.map((col) => (\n !col.required && handleColumnToggle(col.field)}\n >\n {}}\n className=\"w-4 h-4 text-blue-600 border-gray-300 dark:border-gray-600 rounded\"\n />\n \n {col.header}\n {col.required && (\n \n ({resolvedRequiredText})\n \n )}\n \n
\n ))}\n
\n
\n )}\n
\n
\n )}\n\n {/* 선택된 항목 수 표시 */}\n {selectable && selectedIds.length > 0 && resolvedSelectedCountText && (\n
\n {resolvedSelectedCountText.replace('{count}', String(selectedIds.length))}\n
\n )}\n\n {/* 카드 목록 — body wrapper 에 `${id}__body` 부여 (pagination 제외 영역) */}\n
\n {paginatedData && paginatedData.length > 0 ? (\n paginatedData.map((row, index) => (\n
\n {cardRenderer\n ? cardRenderer(row, displayColumns)\n : defaultCardRenderer(row, displayColumns)}\n
\n ))\n ) : (\n
\n {resolvedEmptyMessage}\n
\n )}\n
\n\n {/* 푸터 (모바일 카드 뷰) - v1.19.0+ */}\n {footerCells && footerCells.length > 0 && paginatedData && paginatedData.length > 0 && (\n
\n {footerCardChildren && footerCardChildren.length > 0\n ? renderCellChildren(footerCardChildren, {}, null, 'footer-card', __componentContext)\n : (\n
\n {footerCells.filter(c => c.text || (c.children && c.children.length > 0)).map((cell, idx) => {\n const column = displayColumns.find(col => col.field === cell.field);\n return (\n
\n {column?.header || ''}\n \n {cell.children && cell.children.length > 0\n ? renderCellChildren(cell.children, {}, null, `footer-mobile-${idx}`, __componentContext)\n : cell.text || ''}\n \n
\n );\n })}\n
\n )\n }\n
\n )}\n\n {/* 페이지네이션 */}\n {pagination && (alwaysShowPagination || effectiveTotalPages > 1) && (\n
\n \n
\n )}\n
\n );\n }\n\n // 데스크톱 테이블 뷰\n return (\n
\n {/* 컬럼 선택 메뉴 */}\n {showColumnSelector && (\n
\n
\n setIsColumnSelectorOpen(!isColumnSelectorOpen)}\n className=\"flex items-center gap-2 px-4 py-2 bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-600 rounded-lg hover:bg-gray-50 dark:hover:bg-gray-700\"\n >\n \n \n {resolvedColumnSelectorText}\n \n \n\n {isColumnSelectorOpen && (\n
\n
\n {mergedColumns.map((col) => (\n !col.required && handleColumnToggle(col.field)}\n >\n {}}\n className=\"w-4 h-4 text-blue-600 border-gray-300 dark:border-gray-600 rounded\"\n />\n \n {col.header}\n {col.required && (\n \n ({resolvedRequiredText})\n \n )}\n \n
\n ))}\n
\n
\n )}\n
\n
\n )}\n\n {/* 선택된 항목 수 표시 */}\n {selectable && selectedIds.length > 0 && resolvedSelectedCountText && (\n
\n {resolvedSelectedCountText.replace('{count}', String(selectedIds.length))}\n
\n )}\n\n {/* 테이블 — body wrapper 에 `${id}__body` 부여 (pagination 제외 영역) */}\n
\n \n \n \n {/* 확장 버튼 컬럼 */}\n {expandable && (\n \n )}\n\n {/* 체크박스 컬럼 */}\n {selectable && (\n \n )}\n\n {/* 데이터 컬럼 */}\n {displayColumns.map((column) => (\n handleSort(column.field)}\n >\n {column.header}\n {sortField === column.field && (\n \n {sortDirection === 'asc' ? '↑' : '↓'}\n \n )}\n \n ))}\n\n {/* 액션 컬럼 */}\n {rowActions && rowActions.length > 0 && (\n \n )}\n \n \n \n {paginatedData && paginatedData.length > 0 ? (\n paginatedData.map((row, rowIndex) => {\n const rowId = row[idField] || rowIndex;\n const expanded = isRowExpanded(rowId);\n\n return (\n \n {/* 데이터 행 */}\n 0 ? 'border-t border-gray-200 dark:border-gray-700' : ''}`}\n onClick={() => onRowClick?.(row)}\n >\n {/* 확장 버튼 */}\n {expandable && (\n e.stopPropagation()}\n >\n {isRowExpandable(row) ? (\n handleExpandToggle(rowId)}\n className=\"p-1.5 rounded-md hover:bg-gray-100 dark:hover:bg-gray-600 transition-colors\"\n aria-label={expanded ? 'Collapse row' : 'Expand row'}\n >\n \n \n ) : null}\n \n )}\n\n {/* 체크박스 */}\n {selectable && (\n \n )}\n\n {/* 데이터 셀 */}\n {displayColumns.map((column) => (\n \n {column.cellChildren && column.cellChildren.length > 0\n ? renderCellChildren(column.cellChildren, row, row[column.field], `${row[idField]}-${column.field}`, __componentContext)\n : column.render\n ? column.render(row[column.field], row)\n : safeRenderValue(row[column.field])}\n \n ))}\n\n {/* 액션 메뉴 */}\n {rowActions && rowActions.length > 0 && (\n e.stopPropagation()}\n >\n \n \n )}\n \n\n {/* 확장된 행 콘텐츠 */}\n {expandable && expanded && isRowExpandable(row) && (\n \n 0 ? 1 : 0)\n }\n className=\"px-6 py-4\"\n >\n {renderExpandedContent(row)}\n \n \n )}\n\n {/* 서브 행 (Sub Row) - 배송비 요약 등 추가 정보 표시용 */}\n {(subRowChildren && subRowChildren.length > 0 || subRowRender) &&\n evaluateSubRowCondition(subRowCondition, row) && (\n \n 0 ? 1 : 0)\n }\n className={subRowClassName ? 'p-2' : subRowClassName || 'px-6 py-2 bg-gray-50 dark:bg-gray-900'}\n >\n {subRowClassName ? (\n
\n {subRowRender\n ? subRowRender(row)\n : renderSubRowChildren(subRowChildren!, row, `subrow-${rowId}`, __componentContext)}\n
\n ) : (\n subRowRender\n ? subRowRender(row)\n : renderSubRowChildren(subRowChildren!, row, `subrow-${rowId}`, __componentContext)\n )}\n \n
\n )}\n \n );\n })\n ) : (\n \n 0 ? 1 : 0)\n }\n className=\"px-6 py-8 text-center text-gray-500 dark:text-gray-400\"\n >\n {resolvedEmptyMessage}\n \n \n )}\n \n\n {/* 푸터 행 (Footer Row) - v1.19.0+ */}\n {footerCells && footerCells.length > 0 && paginatedData && paginatedData.length > 0 && (\n \n \n {/* 확장 버튼 컬럼 빈 셀 */}\n {expandable && \n );\n });\n })()}\n\n {/* 액션 컬럼 빈 셀 */}\n {rowActions && rowActions.length > 0 && \n \n )}\n
\n {/* 빈 헤더 - 확장 버튼용 */}\n \n {\n if (el) {\n el.indeterminate = isIndeterminate;\n }\n }}\n onChange={handleSelectAll}\n className=\"w-4 h-4 text-blue-600 border-gray-300 dark:border-gray-600 rounded\"\n />\n \n {resolvedActionsColumnHeader}\n
e.stopPropagation()}>\n handleSelectRow(row[idField])}\n className=\"w-4 h-4 text-blue-600 border-gray-300 dark:border-gray-600 rounded\"\n />\n
}\n\n {/* 체크박스 컬럼 빈 셀 */}\n {selectable && }\n\n {/* 푸터 셀 렌더링 */}\n {(() => {\n const footerFieldMap = new Map(\n footerCells.filter(c => c.field).map(c => [c.field!, c])\n );\n return displayColumns.map((column) => {\n const cell = footerFieldMap.get(column.field);\n if (!cell) {\n return ;\n }\n return (\n \n {cell.children && cell.children.length > 0\n ? renderCellChildren(cell.children, {}, null, `footer-${column.field}`, __componentContext)\n : cell.text || ''}\n }\n
\n
\n\n {/* 페이지네이션 */}\n {pagination && (alwaysShowPagination || effectiveTotalPages > 1) && (\n
\n \n
\n )}\n
\n );\n};\n","import React, { useMemo, useState, useCallback } from 'react';\nimport { Div } from '../basic/Div';\nimport { P } from '../basic/P';\nimport { ActionMenuItem } from './ActionMenu';\nimport { Pagination } from './Pagination';\nimport type { EditorAttrs } from '../../types';\n\n// Logger 설정 (G7Core 초기화 전에도 동작하도록 폴백 포함)\nconst logger = ((window as any).G7Core?.createLogger?.('Comp:CardGrid')) ?? {\n log: (...args: unknown[]) => console.log('[Comp:CardGrid]', ...args),\n warn: (...args: unknown[]) => console.warn('[Comp:CardGrid]', ...args),\n error: (...args: unknown[]) => console.error('[Comp:CardGrid]', ...args),\n};\n\n// G7Core.t() 번역 함수 참조\nconst t = (key: string, params?: Record) =>\n (window as any).G7Core?.t?.(key, params) ?? key;\n\n/**\n * CardGrid 셀 자식 요소 타입\n */\nexport interface CardGridCellChild {\n id?: string;\n type: 'basic' | 'composite';\n name: string;\n props?: Record;\n text?: string;\n children?: CardGridCellChild[];\n condition?: string;\n if?: string;\n iteration?: {\n source: string;\n item_var?: string;\n index_var?: string;\n };\n actions?: any[]; // JSON에서 정의된 actions 배열 (ActionMenu용)\n}\n\n/**\n * 카드 컬럼 정의 (DataGrid의 컬럼 패턴과 동일)\n */\nexport interface CardGridColumn {\n id: string;\n cellChildren?: CardGridCellChild[];\n}\n\n/**\n * CardGrid Props 인터페이스\n */\nexport interface CardGridProps {\n // 필수 props\n data?: any[];\n\n // 카드 컬럼 정의 (DataGrid의 columns 패턴)\n cardColumns?: CardGridColumn[];\n\n // 그리드 레이아웃\n gridColumns?: number;\n gap?: number;\n\n // 반응형 설정\n responsiveColumns?: {\n sm?: number;\n md?: number;\n lg?: number;\n xl?: number;\n };\n\n // 카드 스타일\n cardClassName?: string;\n\n // 행 ID 필드\n idField?: string;\n\n // 페이지네이션\n pagination?: boolean;\n pageSize?: number;\n serverSidePagination?: boolean;\n serverCurrentPage?: number;\n serverTotalPages?: number;\n alwaysShowPagination?: boolean;\n onPageChange?: (page: number) => void;\n\n // 행 액션 메뉴 (DataGrid 패턴)\n rowActions?: ActionMenuItem[];\n onRowAction?: (actionId: string | number, row: any) => void;\n\n // 기타\n className?: string;\n style?: React.CSSProperties;\n\n // 다국어 텍스트\n emptyMessage?: string;\n\n // 페이지네이션 정보\n paginationInfoText?: string;\n\n // 페이지네이션 텍스트 (다국어 지원)\n prevText?: string;\n nextText?: string;\n\n // 스켈레톤 관련 props\n showSkeleton?: boolean; // 스켈레톤 표시 여부 (기본값: true)\n skeletonCount?: number; // 스켈레톤 개수 (기본값: gridColumns)\n skeletonCellChildren?: CardGridCellChild[]; // 커스텀 스켈레톤 정의\n\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * G7Core에서 전체 컴포넌트 맵을 가져옵니다.\n * 템플릿에 등록된 모든 컴포넌트를 자동으로 사용할 수 있습니다.\n */\nconst getComponentMap = (): Record> => {\n const G7Core = (window as any).G7Core;\n return G7Core?.getComponentMap?.() || {};\n};\n\n/**\n * 조건 문자열을 평가합니다.\n * 복잡한 JavaScript 표현식도 지원합니다 (&&, ||, length 등)\n */\nconst evaluateCondition = (condition: string, row: any): boolean => {\n if (!condition) return true;\n\n const match = condition.match(/^\\{\\{(.+)\\}\\}$/);\n if (!match) return true;\n\n const expr = match[1].trim();\n\n // 디버깅: row 데이터와 표현식 확인\n logger.log('evaluateCondition:', { condition, expr, row, rowStatus: row?.status });\n\n // 복잡한 표현식 (&&, ||, length, > 등)이 포함된 경우 eval 사용\n if (/[&|<>=!]/.test(expr) || expr.includes('.length')) {\n try {\n // row 컨텍스트에서 표현식 평가\n // eslint-disable-next-line no-new-func\n const evaluator = new Function('row', `return ${expr}`);\n const result = !!evaluator(row);\n logger.log('evaluateCondition result:', result);\n return result;\n } catch (error) {\n logger.warn('evaluateCondition: 표현식 평가 실패:', expr, error);\n return false;\n }\n }\n\n // !row.field 패턴\n if (expr.startsWith('!row.')) {\n const field = expr.slice(5);\n return !row[field];\n }\n\n // row.field 패턴\n if (expr.startsWith('row.')) {\n const field = expr.slice(4);\n return !!row[field];\n }\n\n return true;\n};\n\n/**\n * ActionMenu의 actions를 처리하여 onClick 함수를 생성합니다.\n * rowActions prop이 있으면 우선 사용합니다 (DataGrid 패턴).\n */\nconst processActionMenuActions = (\n child: CardGridCellChild,\n row: any,\n context: Record,\n rowActions?: ActionMenuItem[],\n onRowActionHandler?: (actionId: string | number, row: any) => void\n): CardGridCellChild => {\n const G7Core = (window as any).G7Core;\n\n // ActionMenu인 경우\n if (child.name === 'ActionMenu') {\n // 1. rowActions prop이 있으면 우선 사용 (DataGrid 패턴)\n if (rowActions && rowActions.length > 0 && onRowActionHandler) {\n return {\n ...child,\n props: {\n ...child.props,\n items: rowActions.map((action) => ({\n ...action,\n onClick: () => onRowActionHandler(action.id, row),\n })),\n },\n };\n }\n\n // 2. actions 배열이 있는 경우 (기존 패턴)\n if (child.actions && Array.isArray(child.actions)) {\n const items = child.props?.items || [];\n const actionsMap = new Map(child.actions.map((action: any) => [action.id, action]));\n\n // items의 onClick을 실제 함수로 변환\n const processedItems = items.map((item: any) => {\n // onClick이 문자열(액션 ID)인 경우\n if (typeof item.onClick === 'string') {\n const actionId = item.onClick;\n const actionDef = actionsMap.get(actionId);\n\n if (actionDef && G7Core?.ActionDispatcher) {\n return {\n ...item,\n onClick: () => {\n // 액션 컨텍스트 생성 (row 데이터 포함)\n const actionContext = { ...context };\n G7Core.ActionDispatcher.dispatch(actionDef, actionContext);\n },\n };\n }\n }\n return item;\n });\n\n // 처리된 items로 child 복사본 반환\n return {\n ...child,\n props: {\n ...child.props,\n items: processedItems,\n },\n };\n }\n }\n\n // children이 있으면 재귀적으로 처리\n if (child.children && Array.isArray(child.children)) {\n return {\n ...child,\n children: child.children.map((c) => processActionMenuActions(c, row, context, rowActions, onRowActionHandler)),\n };\n }\n\n return child;\n};\n\n/**\n * cellChildren 배열을 React 요소로 렌더링합니다.\n * DataGrid의 renderCellChildren 패턴을 따릅니다.\n */\nconst renderCellChildren = (\n cellChildren: CardGridCellChild[],\n row: any,\n index: number,\n keyPrefix: string = '',\n rowActions?: ActionMenuItem[],\n onRowActionHandler?: (actionId: string | number, row: any) => void\n): React.ReactNode => {\n const G7Core = (window as any).G7Core;\n\n if (G7Core?.renderItemChildren) {\n // 조건부 렌더링 필터링 (condition 또는 if 속성 지원)\n // 참고: renderItemChildren도 자체적으로 if 조건을 평가하지만,\n // 여기서 미리 필터링하면 불필요한 렌더링을 줄일 수 있음\n const filteredChildren = cellChildren.filter((child) => {\n const conditionExpr = child.condition || child.if;\n if (!conditionExpr) return true;\n const result = evaluateCondition(conditionExpr, row);\n return result;\n });\n\n // 컨텍스트 생성\n const context = {\n row,\n $value: row,\n index,\n };\n\n // ActionMenu actions 전처리 (재귀적으로)\n const processedChildren = filteredChildren.map((child) =>\n processActionMenuActions(child, row, context, rowActions, onRowActionHandler)\n );\n\n try {\n // G7Core에서 전체 컴포넌트 맵 가져오기\n const componentMap = getComponentMap();\n\n // G7Core 템플릿 엔진으로 렌더링\n return G7Core.renderItemChildren(\n processedChildren,\n context,\n componentMap,\n keyPrefix\n );\n } catch (error) {\n return (\n
\n

컴포넌트 로드 실패

\n

[CardGrid] 데이터를 표시할 수 없습니다.

\n
\n );\n }\n }\n\n return null;\n};\n\n/**\n * 개별 CardGridCellChild에 대한 스켈레톤을 생성합니다.\n * 모든 컴포넌트에 대해 동일한 기본 스켈레톤을 생성하여 확장성을 보장합니다.\n *\n * @param child 스켈레톤을 생성할 child 요소\n * @param key React key\n * @returns 생성된 스켈레톤 React 노드\n */\nconst generateSkeletonForChild = (\n child: CardGridCellChild,\n key: string\n): React.ReactNode => {\n // Div만 특수 처리 (레이아웃 구조 유지)\n if (child.name === 'Div' && child.children && child.children.length > 0) {\n const childSkeletons = child.children\n .map((c, idx) => generateSkeletonForChild(c, `${key}-child-${idx}`))\n .filter(Boolean);\n\n return (\n
\n {childSkeletons}\n
\n );\n }\n\n // 모든 컴포넌트는 동일한 기본 스켈레톤 (확장성 보장)\n return
;\n};\n\n/**\n * cellChildren 배열에서 스켈레톤 UI를 자동 생성합니다.\n *\n * @param cellChildren 카드 컬럼의 cellChildren 배열\n * @param keyPrefix 고유 키 생성을 위한 접두사\n * @returns 생성된 스켈레톤 React 노드 (cellChildren이 없으면 null)\n */\nconst generateSkeletonFromCellChildren = (\n cellChildren: CardGridCellChild[],\n keyPrefix: string = 'skeleton'\n): React.ReactNode => {\n if (!cellChildren || cellChildren.length === 0) {\n return null;\n }\n\n return cellChildren\n .map((child, index) => {\n const key = `${keyPrefix}-${child.id || child.name}-${index}`;\n\n // 조건부 렌더링 요소는 제외\n if (child.condition || child.if) {\n return null;\n }\n\n // iteration이 있으면 1개만 표시\n if (child.iteration) {\n return generateSkeletonForChild(child, key);\n }\n\n // 일반 요소 처리\n return generateSkeletonForChild(child, key);\n })\n .filter(Boolean);\n};\n\n/**\n * CardGrid 집합 컴포넌트\n *\n * 카드 레이아웃으로 데이터를 표시하는 그리드 컴포넌트입니다.\n * DataGrid의 cellChildren 패턴을 사용하여 카드 내용을 JSON으로 정의할 수 있습니다.\n *\n * @example\n * // 레이아웃 JSON 사용 예시\n * {\n * \"type\": \"composite\",\n * \"name\": \"CardGrid\",\n * \"props\": {\n * \"data\": \"{{boards.data.data}}\",\n * \"columns\": 3,\n * \"gap\": 4,\n * \"pagination\": true,\n * \"pageSize\": 12,\n * \"cellChildren\": [\n * {\n * \"type\": \"basic\",\n * \"name\": \"Div\",\n * \"props\": {\n * \"className\": \"bg-white dark:bg-gray-800 rounded-lg p-6\"\n * },\n * \"children\": [\n * {\n * \"type\": \"basic\",\n * \"name\": \"H3\",\n * \"text\": \"{{row.name}}\"\n * }\n * ]\n * }\n * ]\n * }\n * }\n */\nexport const CardGrid: React.FC = ({\n data,\n cardColumns = [],\n gridColumns = 3,\n gap = 4,\n responsiveColumns,\n cardClassName = '',\n idField = 'id',\n pagination = true,\n pageSize = 12,\n serverSidePagination = false,\n serverCurrentPage,\n serverTotalPages,\n alwaysShowPagination = false,\n onPageChange,\n paginationInfoText,\n rowActions,\n onRowAction,\n className = '',\n style,\n emptyMessage,\n prevText,\n nextText,\n showSkeleton = true,\n skeletonCount,\n skeletonCellChildren,\n id,\n editorAttrs,\n}) => {\n // props로 전달된 값이 없으면 다국어 키 사용\n const resolvedEmptyMessage = emptyMessage ?? t('common.no_data');\n\n // cardColumns의 첫 번째 항목에서 cellChildren 추출\n const cellChildren = cardColumns[0]?.cellChildren || [];\n // 클라이언트 사이드 페이지네이션 상태\n const [currentPage, setCurrentPage] = useState(1);\n\n // 반응형 상태 구독 - cellChildren 내 responsive 속성 지원을 위해 필요\n // 화면 크기 변경 시 CardGrid가 리렌더링되어 renderItemChildren이 새로운 너비로 재실행됨\n // 훅 호출 자체가 리렌더링을 트리거하므로 반환값은 사용하지 않음 (void 처리)\n const G7Core = (window as any).G7Core;\n // eslint-disable-next-line react-hooks/rules-of-hooks\n G7Core?.useResponsive?.();\n\n // 서버/클라이언트 페이지 정보\n const effectiveCurrentPage = serverSidePagination ? (serverCurrentPage ?? 1) : currentPage;\n const effectiveTotalPages = serverSidePagination\n ? (serverTotalPages ?? 1)\n : Math.ceil((data?.length ?? 0) / pageSize);\n\n // 페이지 변경 핸들러\n const handlePageChange = (page: number) => {\n if (serverSidePagination) {\n onPageChange?.(page);\n } else {\n setCurrentPage(page);\n }\n };\n\n // 행 액션 처리 (DataGrid 패턴 + 템플릿 엔진 이벤트 연동)\n const handleRowAction = useCallback(\n (actionId: string | number, row: any) => {\n // prop으로 전달된 onRowAction 호출\n // DynamicRenderer의 actionDispatcher.bindActionsToProps가\n // 레이아웃 JSON의 actions 배열과 자동 연결함\n // onRowAction 호출 시 $args[0] = actionId, $args[1] = row로 전달됨\n onRowAction?.(actionId, row);\n },\n [onRowAction]\n );\n\n // 페이지네이션 적용된 데이터\n const paginatedData = useMemo(() => {\n if (!data) return [];\n if (!pagination) return data;\n if (serverSidePagination) return data;\n\n const startIndex = (currentPage - 1) * pageSize;\n const endIndex = startIndex + pageSize;\n return data.slice(startIndex, endIndex);\n }, [data, pagination, serverSidePagination, currentPage, pageSize]);\n\n // 반응형 그리드 클래스 생성\n const gridClasses = useMemo(() => {\n const classes = [];\n\n // 기본 (모바일)\n const smCols = responsiveColumns?.sm ?? 1;\n classes.push(`grid-cols-${smCols}`);\n\n // sm (640px+)\n if (responsiveColumns?.sm) {\n classes.push(`sm:grid-cols-${responsiveColumns.sm}`);\n }\n\n // md (768px+)\n const mdCols = responsiveColumns?.md ?? Math.min(gridColumns, 2);\n classes.push(`md:grid-cols-${mdCols}`);\n\n // lg (1024px+)\n const lgCols = responsiveColumns?.lg ?? gridColumns;\n classes.push(`lg:grid-cols-${lgCols}`);\n\n // xl (1280px+)\n if (responsiveColumns?.xl) {\n classes.push(`xl:grid-cols-${responsiveColumns.xl}`);\n }\n\n return classes.join(' ');\n }, [gridColumns, responsiveColumns]);\n\n // 스켈레톤 UI 생성 (useMemo로 최적화)\n const skeletonUI = useMemo(() => {\n if (!showSkeleton) {\n return null;\n }\n\n // 1. skeletonCellChildren이 있으면 우선 사용\n if (skeletonCellChildren && skeletonCellChildren.length > 0) {\n return generateSkeletonFromCellChildren(skeletonCellChildren, 'custom-skeleton');\n }\n\n // 2. cellChildren 기반 자동 생성\n if (cellChildren && cellChildren.length > 0) {\n return generateSkeletonFromCellChildren(cellChildren, 'auto-skeleton');\n }\n\n // 3. cellChildren도 없으면 null (빈 카드)\n return null;\n }, [showSkeleton, skeletonCellChildren, cellChildren]);\n\n // 로딩 상태 (data가 undefined/null)\n if (!data) {\n // showSkeleton이 false면 빈 화면\n if (!showSkeleton) {\n return null;\n }\n\n const effectiveSkeletonCount = skeletonCount ?? gridColumns;\n\n return (\n
\n {Array.from({ length: effectiveSkeletonCount }).map((_, index) => (\n \n {skeletonUI}\n
\n ))}\n
\n );\n }\n\n // 빈 데이터 상태\n if (paginatedData.length === 0) {\n return (\n
\n
\n

\n {resolvedEmptyMessage}\n

\n
\n
\n );\n }\n\n // 페이지네이션 표시 여부\n const showPagination =\n pagination &&\n (alwaysShowPagination || effectiveTotalPages > 1);\n\n return (\n
\n {/* 카드 그리드 */}\n
\n {paginatedData.map((row, index) => (\n
\n {renderCellChildren(cellChildren, row, index, `card-${index}`, rowActions, handleRowAction)}\n
\n ))}\n
\n\n {/* 페이지네이션 */}\n {showPagination && (\n
\n \n {/* 페이지네이션 정보 */}\n {paginationInfoText && (\n
\n {paginationInfoText}\n
\n )}\n
\n )}\n
\n );\n};","import React, { useEffect, useRef } from 'react';\nimport { Div } from '../basic/Div';\nimport { Button } from '../basic/Button';\n\n// G7Core.t() 번역 함수 참조\nconst t = (key: string, params?: Record) =>\n (window as any).G7Core?.t?.(key, params) ?? key;\n\nexport interface ModalProps {\n isOpen: boolean;\n onClose: () => void;\n title?: string;\n /** 타이틀 앞에 렌더링할 컴포넌트 배열 (레이아웃 JSON) */\n titlePrefix?: any[];\n /** 타이틀 뒤에 렌더링할 컴포넌트 배열 (레이아웃 JSON) */\n titleSuffix?: any[];\n /**\n * Backdrop(오버레이) 클릭 시 모달 닫기 여부\n * @default true\n */\n closeOnBackdropClick?: boolean;\n /**\n * closeOnOverlayClick 별칭 (레이아웃 JSON 호환)\n * @default true\n */\n closeOnOverlayClick?: boolean;\n /**\n * 헤더 닫기 버튼 표시 여부\n * @default true\n */\n showCloseButton?: boolean;\n /**\n * ESC 키로 모달 닫기 허용 여부\n * @default true\n */\n closeOnEscape?: boolean;\n children?: React.ReactNode;\n width?: string;\n className?: string;\n style?: React.CSSProperties;\n /** DynamicRenderer용 데이터 컨텍스트 (내부 사용) */\n __dataContext?: Record;\n /** DynamicRenderer용 번역 컨텍스트 (내부 사용) */\n __translationContext?: any;\n}\n\n/**\n * Modal 집합 컴포넌트\n *\n * Div + Button 기본 컴포넌트를 조합하여 모달 UI를 구성합니다.\n * ESC 키 닫기, 포커스 트랩, 오버레이 클릭 닫기 기능을 포함합니다.\n *\n * @example\n * // 레이아웃 JSON 사용 예시\n * {\n * \"name\": \"Modal\",\n * \"props\": {\n * \"isOpen\": \"{{modals.userEdit}}\",\n * \"title\": \"사용자 편집\",\n * \"width\": \"600px\"\n * },\n * \"children\": [...]\n * }\n */\nexport const Modal: React.FC = ({\n isOpen,\n onClose,\n title,\n titlePrefix,\n titleSuffix,\n closeOnBackdropClick = true,\n closeOnOverlayClick,\n showCloseButton = true,\n closeOnEscape = true,\n children,\n width = '500px',\n className = '',\n style,\n __dataContext,\n __translationContext,\n}) => {\n // closeOnOverlayClick 별칭 지원 (레이아웃 JSON 호환)\n const shouldCloseOnBackdrop = closeOnOverlayClick !== undefined\n ? closeOnOverlayClick\n : closeOnBackdropClick;\n const modalRef = useRef(null);\n const previousFocusRef = useRef(null);\n\n // ESC 키로 모달 닫기\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && isOpen && closeOnEscape) {\n onClose();\n }\n };\n\n if (isOpen && closeOnEscape) {\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }\n }, [isOpen, onClose, closeOnEscape]);\n\n // 포커스 트랩\n useEffect(() => {\n if (isOpen && modalRef.current) {\n // 모달 열릴 때 현재 포커스 저장\n previousFocusRef.current = document.activeElement as HTMLElement;\n\n // 모달 내부 포커스 가능한 요소들\n const focusableElements = modalRef.current.querySelectorAll(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n\n const firstElement = focusableElements[0] as HTMLElement;\n const lastElement = focusableElements[focusableElements.length - 1] as HTMLElement;\n\n // 첫 번째 요소에 포커스\n firstElement?.focus();\n\n // Tab 키 핸들러 (포커스 트랩)\n const handleTab = (event: KeyboardEvent) => {\n if (event.key !== 'Tab') return;\n\n if (event.shiftKey) {\n // Shift + Tab\n if (document.activeElement === firstElement) {\n event.preventDefault();\n lastElement?.focus();\n }\n } else {\n // Tab\n if (document.activeElement === lastElement) {\n event.preventDefault();\n firstElement?.focus();\n }\n }\n };\n\n document.addEventListener('keydown', handleTab);\n\n return () => {\n document.removeEventListener('keydown', handleTab);\n // 모달 닫힐 때 이전 포커스 복원\n previousFocusRef.current?.focus();\n };\n }\n }, [isOpen]);\n\n // body 스크롤 방지\n useEffect(() => {\n if (isOpen) {\n document.body.style.overflow = 'hidden';\n return () => {\n document.body.style.overflow = '';\n };\n }\n }, [isOpen]);\n\n if (!isOpen) return null;\n\n // z-index를 style에서 가져오거나 기본값 50 사용\n const zIndex = style?.zIndex ?? 50;\n\n // titlePrefix/titleSuffix 렌더링 헬퍼\n const renderTitleComponents = (components: any[] | undefined, keyPrefix: string) => {\n if (!components || components.length === 0) return null;\n\n const g7Core = (window as any).G7Core;\n if (!g7Core) return null;\n\n const DynamicRenderer = g7Core.getDynamicRenderer?.();\n if (!DynamicRenderer) return null;\n\n return components.map((componentDef, index) => (\n \n ));\n };\n\n return (\n \n {/* Overlay */}\n \n\n {/* Modal Content */}\n e.stopPropagation()}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? 'modal-title' : undefined}\n >\n {/* Header */}\n {(title || titlePrefix || titleSuffix || showCloseButton) && (\n
\n
\n {/* titlePrefix: 타이틀 앞에 렌더링 */}\n {renderTitleComponents(titlePrefix, 'title-prefix')}\n {title && (\n \n {title}\n
\n )}\n {/* titleSuffix: 타이틀 뒤에 렌더링 */}\n {renderTitleComponents(titleSuffix, 'title-suffix')}\n
\n {showCloseButton && (\n \n \n \n \n \n )}\n
\n )}\n\n {/* Body */}\n
\n {children}\n
\n
\n
\n );\n};\n","import React, { useState, useRef, useEffect } from 'react';\nimport { Div } from '../basic/Div';\nimport { Button } from '../basic/Button';\nimport type { EditorAttrs } from '../../types';\n\nexport interface DropdownItem {\n label: string;\n value: string;\n onClick?: () => void;\n disabled?: boolean;\n}\n\nexport interface DropdownProps {\n label: string;\n items: DropdownItem[];\n /** 아이템 클릭 시 호출되는 콜백. value 문자열을 전달합니다. */\n onItemClick?: (value: string, item: DropdownItem) => void;\n position?: 'bottom-left' | 'bottom-right' | 'top-left' | 'top-right';\n /** 드롭다운 스타일 변형 */\n variant?: 'default' | 'text';\n className?: string;\n style?: React.CSSProperties;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * Dropdown 집합 컴포넌트\n *\n * Button + Div 기본 컴포넌트를 조합하여 드롭다운 메뉴 UI를 구성합니다.\n * 키보드 네비게이션 (Arrow Up/Down, Enter, Escape) 지원, 외부 클릭 감지 기능을 포함합니다.\n *\n * @example\n * // 레이아웃 JSON 사용 예시\n * {\n * \"name\": \"Dropdown\",\n * \"props\": {\n * \"label\": \"작업\",\n * \"items\": [\n * {\"label\": \"수정\", \"value\": \"edit\"},\n * {\"label\": \"삭제\", \"value\": \"delete\"}\n * ]\n * }\n * }\n */\nexport const Dropdown: React.FC = ({\n label,\n items,\n onItemClick,\n position = 'bottom-left',\n variant = 'default',\n className = '',\n style,\n id,\n editorAttrs,\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const [focusedIndex, setFocusedIndex] = useState(-1);\n const dropdownRef = useRef(null);\n const menuRef = useRef(null);\n const [adjustedPosition, setAdjustedPosition] = useState(position);\n\n // 외부 클릭 감지\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n setFocusedIndex(-1);\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }\n }, [isOpen]);\n\n // 키보드 네비게이션\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (!isOpen) return;\n\n const enabledIndexes = items\n .map((item, index) => (!item.disabled ? index : -1))\n .filter((index) => index !== -1);\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n setFocusedIndex((prev) => {\n const currentEnabledIndex = enabledIndexes.indexOf(prev);\n const nextEnabledIndex = (currentEnabledIndex + 1) % enabledIndexes.length;\n return enabledIndexes[nextEnabledIndex];\n });\n break;\n\n case 'ArrowUp':\n event.preventDefault();\n setFocusedIndex((prev) => {\n const currentEnabledIndex = enabledIndexes.indexOf(prev);\n const prevEnabledIndex =\n currentEnabledIndex <= 0 ? enabledIndexes.length - 1 : currentEnabledIndex - 1;\n return enabledIndexes[prevEnabledIndex];\n });\n break;\n\n case 'Enter':\n event.preventDefault();\n if (focusedIndex >= 0 && !items[focusedIndex].disabled) {\n handleItemClick(items[focusedIndex]);\n }\n break;\n\n case 'Escape':\n event.preventDefault();\n setIsOpen(false);\n setFocusedIndex(-1);\n break;\n }\n };\n\n if (isOpen) {\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }\n }, [isOpen, focusedIndex, items]);\n\n // 드롭다운 메뉴가 화면을 벗어나는지 감지하고 위치 조정\n useEffect(() => {\n if (isOpen && menuRef.current && dropdownRef.current) {\n const menuRect = menuRef.current.getBoundingClientRect();\n const triggerRect = dropdownRef.current.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n const viewportHeight = window.innerHeight;\n\n // 메뉴 크기 (w-56 = 14rem = 224px)\n const menuWidth = menuRect.width || 224;\n const menuHeight = menuRect.height || 200;\n\n let newPosition = position;\n\n // 수평 위치 조정\n const isLeftAligned = position.includes('left');\n if (isLeftAligned) {\n // left 정렬: 메뉴가 버튼 왼쪽 끝에서 오른쪽으로 펼쳐짐\n const menuRight = triggerRect.left + menuWidth;\n if (menuRight > viewportWidth) {\n newPosition = newPosition.replace('left', 'right') as typeof position;\n }\n } else {\n // right 정렬: 메뉴가 버튼 오른쪽 끝에서 왼쪽으로 펼쳐짐\n const menuLeft = triggerRect.right - menuWidth;\n if (menuLeft < 0) {\n newPosition = newPosition.replace('right', 'left') as typeof position;\n }\n }\n\n // 수직 위치 조정\n const isTopAligned = position.includes('top');\n if (isTopAligned) {\n // top 정렬: 메뉴가 버튼 위로 펼쳐짐\n if (triggerRect.top - menuHeight < 0) {\n newPosition = newPosition.replace('top', 'bottom') as typeof position;\n }\n } else {\n // bottom 정렬: 메뉴가 버튼 아래로 펼쳐짐\n if (triggerRect.bottom + menuHeight > viewportHeight) {\n newPosition = newPosition.replace('bottom', 'top') as typeof position;\n }\n }\n\n setAdjustedPosition(newPosition);\n }\n }, [isOpen, position]);\n\n const handleItemClick = (item: DropdownItem) => {\n if (item.disabled) return;\n\n item.onClick?.();\n // value를 첫 번째 인자로 전달하여 switch 핸들러와 호환\n onItemClick?.(item.value, item);\n setIsOpen(false);\n setFocusedIndex(-1);\n };\n\n const positionClasses = {\n 'bottom-left': 'dropdown-menu-bottom-left',\n 'bottom-right': 'dropdown-menu-bottom-right',\n 'top-left': 'dropdown-menu-top-left',\n 'top-right': 'dropdown-menu-top-right',\n };\n\n return (\n \n {/* Trigger Button */}\n setIsOpen(!isOpen)}\n className={variant === 'text' ? 'dropdown-trigger-text' : 'dropdown-trigger'}\n aria-haspopup=\"true\"\n aria-expanded={isOpen}\n >\n {label}\n {variant !== 'text' && (\n \n \n \n )}\n \n\n {/* Dropdown Menu */}\n {isOpen && (\n \n
\n {items.map((item, index) => (\n handleItemClick(item)}\n onMouseEnter={() => !item.disabled && setFocusedIndex(index)}\n role=\"menuitem\"\n aria-disabled={item.disabled}\n tabIndex={item.disabled ? -1 : 0}\n >\n {item.label}\n
\n ))}\n
\n
\n )}\n
\n );\n};\n","// e2e:allow편집기 추가 직후 price 미지정 시 크래시(\"컴포넌트 로드 실패\") 결함#5 수정(price 폴백). 라이브 검증은 Chrome MCP T1~T7(에디터 추가/속성편집/저장200/reload영속/게스트 사용자화면 ₩55000 렌더)로 수행, 단위 회귀는 ProductCard.test.tsx 결함#5 describe.\nimport React from 'react';\nimport { Div } from '../basic/Div';\nimport { Img } from '../basic/Img';\nimport { H2 } from '../basic/H2';\nimport { H3 } from '../basic/H3';\nimport { P } from '../basic/P';\nimport { Span } from '../basic/Span';\nimport { Button } from '../basic/Button';\nimport type { EditorAttrs } from '../../types';\n\nexport interface ProductCardProps {\n imageUrl?: string;\n imageAlt?: string;\n title: string;\n subtitle?: string;\n description?: string;\n price: number;\n originalPrice?: number;\n discountRate?: number;\n currency?: string;\n buttonText?: string;\n onButtonClick?: () => void;\n className?: string;\n style?: React.CSSProperties;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * ProductCard 집합 컴포넌트\n *\n * 상품 정보를 표시하는 카드 컴포넌트입니다.\n * 이미지, 제목, 부제목, 설명, 가격, 할인율, 액션 버튼을 포함합니다.\n *\n * 기본 컴포넌트 조합: Div + Img + H2 + H3 + P + Span + Button\n *\n * @example\n * // 레이아웃 JSON 사용 예시\n * {\n * \"name\": \"ProductCard\",\n * \"props\": {\n * \"imageUrl\": \"/product.png\",\n * \"title\": \"프리미엄 제품\",\n * \"subtitle\": \"신제품\",\n * \"description\": \"최고급 소재로 제작된 프리미엄 제품입니다.\",\n * \"price\": 45000,\n * \"originalPrice\": 50000,\n * \"discountRate\": 10,\n * \"buttonText\": \"구매하기\"\n * }\n * }\n */\nexport const ProductCard: React.FC = ({\n imageUrl,\n imageAlt = '',\n title,\n subtitle,\n description,\n price,\n originalPrice,\n discountRate,\n currency = '₩',\n buttonText = '자세히 보기',\n onButtonClick,\n className = '',\n style,\n id,\n editorAttrs,\n}) => {\n const hasDiscount = discountRate && discountRate > 0;\n // price 미지정 시에도 크래시하지 않도록 0 으로 폴백한다(레이아웃 편집기에서 추가 직후\n // 작성자가 price 를 지정하기 전 상태를 안전하게 렌더).\n const formattedPrice = (price ?? 0).toLocaleString();\n const formattedOriginalPrice = originalPrice?.toLocaleString();\n\n return (\n \n {/* 상품 이미지 */}\n {imageUrl && (\n
\n \n {hasDiscount && (\n
\n -{discountRate}%\n
\n )}\n
\n )}\n\n {/* 상품 정보 */}\n
\n {/* 부제목 (태그/카테고리) */}\n {subtitle && (\n

\n {subtitle}\n

\n )}\n\n {/* 제목 */}\n

\n {title}\n

\n\n {/* 설명 */}\n {description && (\n

\n {description}\n

\n )}\n\n {/* 가격 정보 */}\n
\n \n {currency}{formattedPrice}\n \n {originalPrice && (\n \n {currency}{formattedOriginalPrice}\n \n )}\n
\n\n {/* 액션 버튼 */}\n {buttonText && (\n \n {buttonText}\n \n )}\n
\n
\n );\n};\n","import React from 'react';\nimport { Div } from '../basic/Div';\nimport { H3 } from '../basic/H3';\nimport { Span } from '../basic/Span';\nimport { P } from '../basic/P';\nimport { Icon } from '../basic/Icon';\nimport { IconName } from '../basic/IconTypes';\nimport type { EditorAttrs } from '../../types';\n\nexport interface StatCardProps {\n value: string | number;\n label: string;\n change?: number;\n changeLabel?: string;\n iconName?: IconName;\n trend?: 'up' | 'down' | 'neutral';\n className?: string;\n style?: React.CSSProperties;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * StatCard 집합 컴포넌트\n *\n * 통계 수치와 변화율을 시각화하는 카드 컴포넌트입니다.\n * 수치, 라벨, 변화율(증가/감소), 아이콘을 표시합니다.\n *\n * 기본 컴포넌트 조합: Div + H3 + Span + P + Icon\n *\n * @example\n * // 레이아웃 JSON 사용 예시\n * {\n * \"name\": \"StatCard\",\n * \"props\": {\n * \"value\": 12345,\n * \"label\": \"총 사용자\",\n * \"change\": 12.5,\n * \"changeLabel\": \"지난달 대비\",\n * \"iconName\": \"users\",\n * \"trend\": \"up\"\n * }\n * }\n */\nexport const StatCard: React.FC = ({\n value,\n label,\n change,\n changeLabel = '전월 대비',\n iconName,\n trend = 'neutral',\n className = '',\n style,\n id,\n editorAttrs,\n}) => {\n const isPositive = trend === 'up';\n const isNegative = trend === 'down';\n const changeValue = change !== undefined ? Math.abs(change) : 0;\n\n const trendClass = isPositive\n ? 'stats-trend-up'\n : isNegative\n ? 'stats-trend-down'\n : 'stats-trend-neutral';\n\n const trendIcon = isPositive ? IconName.ArrowUp : isNegative ? IconName.ArrowDown : undefined;\n\n return (\n \n {/* 헤더: 아이콘과 변화율 */}\n
\n {iconName && (\n
\n \n
\n )}\n\n {change !== undefined && (\n
\n {trendIcon && (\n \n )}\n \n {changeValue}%\n \n
\n )}\n
\n\n {/* 통계 수치 */}\n

\n {typeof value === 'number' ? value.toLocaleString() : value}\n

\n\n {/* 라벨 */}\n

\n {label}\n

\n\n {/* 변화율 설명 */}\n {change !== undefined && changeLabel && (\n
\n \n {changeLabel}\n \n
\n )}\n
\n );\n};\n","import React, { useState, useEffect } from 'react';\nimport { Form } from '../basic/Form';\nimport { Input } from '../basic/Input';\nimport { Button } from '../basic/Button';\nimport { Icon } from '../basic/Icon';\nimport { IconName } from '../basic/IconTypes';\nimport { Div } from '../basic/Div';\nimport { Span } from '../basic/Span';\nimport type { EditorAttrs } from '../../types';\n\n// G7Core 참조\nconst G7Core = () => (window as any).G7Core;\nconst t = (key: string, params?: Record) =>\n G7Core()?.t?.(key, params) ?? key;\n\nexport interface SearchSuggestion {\n id: string | number;\n text: string;\n}\n\nexport interface SearchBarProps {\n name?: string;\n placeholder?: string;\n value?: string;\n onChange?: (e: React.ChangeEvent) => void;\n onSubmit?: (e: React.FormEvent) => void;\n showButton?: boolean; // true: 검색 버튼 표시, false: 버튼 숨김 (기본값: false)\n suggestions?: SearchSuggestion[];\n onSuggestionClick?: (suggestion: SearchSuggestion) => void;\n showSuggestions?: boolean;\n className?: string; // 외부 className (w-full 등)은 G7Core.style.mergeClasses로 내부 기본 클래스를 오버라이드\n style?: React.CSSProperties;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * SearchBar 집합 컴포넌트\n *\n * 검색 입력 필드와 선택적 버튼을 제공하는 검색 바 컴포넌트입니다.\n * Enter 키를 누르면 항상 검색이 실행됩니다.\n *\n * 기본 컴포넌트 조합: Form + Input + Button + Icon + Div + Span\n *\n * @example\n * // 레이아웃 JSON 사용 예시 (버튼 없음)\n * {\n * \"name\": \"SearchBar\",\n * \"props\": {\n * \"placeholder\": \"검색어를 입력하세요\",\n * \"value\": \"{{query.search}}\",\n * \"showButton\": false\n * }\n * }\n *\n * @example\n * // 레이아웃 JSON 사용 예시 (버튼 있음)\n * {\n * \"name\": \"SearchBar\",\n * \"props\": {\n * \"placeholder\": \"검색어를 입력하세요\",\n * \"value\": \"{{query.search}}\",\n * \"showButton\": true\n * }\n * }\n *\n * @example\n * // 레이아웃 JSON 사용 예시 (전체 너비 - className으로 오버라이드)\n * {\n * \"name\": \"SearchBar\",\n * \"props\": {\n * \"placeholder\": \"검색어를 입력하세요\",\n * \"value\": \"{{query.search}}\",\n * \"className\": \"w-full\"\n * }\n * }\n */\nexport const SearchBar: React.FC = ({\n name = 'search',\n placeholder,\n value: controlledValue,\n onChange,\n onSubmit,\n showButton = false,\n suggestions = [],\n onSuggestionClick,\n showSuggestions = false,\n className = '',\n style,\n id,\n editorAttrs,\n}) => {\n // props로 전달된 값이 없으면 다국어 키 사용\n const resolvedPlaceholder = placeholder ?? t('common.search_placeholder');\n\n const [internalValue, setInternalValue] = useState('');\n const [isFocused, setIsFocused] = useState(false);\n const containerRef = React.useRef(null);\n const previousValueRef = React.useRef('');\n\n const value = controlledValue !== undefined ? controlledValue : internalValue;\n const shouldShowSuggestions = showSuggestions && isFocused && suggestions.length > 0 && value.length > 0;\n\n // 기본 Input 클래스 (w-64 포함)\n const baseInputClasses = 'w-64 pl-10 pr-4 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white text-sm';\n // 외부 className으로 기본 클래스 오버라이드 (예: w-full이 w-64를 대체)\n const inputClassName = G7Core()?.style?.mergeClasses?.(baseInputClasses, className) ?? `${baseInputClasses} ${className}`;\n\n // controlledValue가 변경될 때 previousValueRef 동기화\n useEffect(() => {\n if (controlledValue !== undefined) {\n previousValueRef.current = controlledValue;\n }\n }, [controlledValue]);\n\n const handleChange = (e: React.ChangeEvent) => {\n const newValue = e.target.value;\n setInternalValue(newValue);\n onChange?.(e);\n\n // X 버튼으로 검색어를 지운 경우 감지\n // 이전 값이 있었는데 새 값이 빈 문자열이고, nativeEvent가 없는 경우 = X 버튼 클릭\n if (previousValueRef.current !== '' && newValue === '' && !(e.nativeEvent as any).inputType) {\n // X 버튼 클릭: 자동으로 검색 초기화\n setTimeout(() => {\n const formElement = containerRef.current?.querySelector('form');\n if (formElement) {\n formElement.requestSubmit();\n }\n }, 0);\n }\n\n previousValueRef.current = newValue;\n };\n\n const handleSuggestionClick = (suggestion: SearchSuggestion) => {\n setInternalValue(suggestion.text);\n const syntheticEvent = {\n target: { value: suggestion.text, name },\n } as React.ChangeEvent;\n onChange?.(syntheticEvent);\n onSuggestionClick?.(suggestion);\n setIsFocused(false);\n };\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n onSubmit?.(e);\n };\n\n return (\n
\n
\n
\n {/* Input wrapper */}\n
\n {/* 검색 아이콘 */}\n
\n \n
\n\n {/* 검색 입력 */}\n setIsFocused(true)}\n onBlur={() => setTimeout(() => setIsFocused(false), 200)}\n placeholder={resolvedPlaceholder}\n className={inputClassName}\n />\n
\n\n {/* 검색 버튼 (showButton=true일 때만 표시) */}\n {showButton && (\n \n {t('common.search')}\n \n )}\n
\n
\n\n {/* 자동완성 제안 목록 */}\n {shouldShowSuggestions && (\n
\n {suggestions.map((suggestion) => (\n handleSuggestionClick(suggestion)}\n >\n
\n \n {suggestion.text}\n
\n
\n ))}\n
\n )}\n
\n );\n};\n","import React from 'react';\nimport { Div } from '../basic/Div';\nimport { Label } from '../basic/Label';\nimport { Select } from '../basic/Select';\nimport { Checkbox } from '../basic/Checkbox';\nimport { Span } from '../basic/Span';\nimport { Button } from '../basic/Button';\nimport type { EditorAttrs } from '../../types';\n\n// G7Core.t() 번역 함수 참조\nconst t = (key: string, params?: Record) =>\n (window as any).G7Core?.t?.(key, params) ?? key;\n\nexport interface FilterOption {\n id: string | number;\n label: string;\n value: string | number;\n}\n\nexport interface Filter {\n id: string;\n label: string;\n type: 'select' | 'checkbox';\n options: FilterOption[];\n value?: string | number | string[] | number[];\n}\n\nexport interface FilterGroupProps {\n title?: string;\n filters: Filter[];\n onChange?: (filterId: string, value: string | number | string[] | number[] | boolean) => void;\n onReset?: () => void;\n showResetButton?: boolean;\n className?: string;\n style?: React.CSSProperties;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * FilterGroup 집합 컴포넌트\n *\n * 다중 필터 조합을 지원하는 필터 그룹 컴포넌트입니다.\n * Select, Checkbox 타입의 필터들을 조합하여 표시합니다.\n *\n * 기본 컴포넌트 조합: Div + Label + Select + Checkbox + Span + Button\n *\n * @example\n * // 레이아웃 JSON 사용 예시\n * {\n * \"name\": \"FilterGroup\",\n * \"props\": {\n * \"title\": \"$t:common.filter\",\n * \"filters\": [\n * {\n * \"id\": \"category\",\n * \"label\": \"카테고리\",\n * \"type\": \"select\",\n * \"options\": [\n * {\"id\": 1, \"label\": \"전자기기\", \"value\": \"electronics\"},\n * {\"id\": 2, \"label\": \"의류\", \"value\": \"clothing\"}\n * ]\n * }\n * ]\n * }\n * }\n */\nexport const FilterGroup: React.FC = ({\n title,\n filters,\n onChange,\n onReset,\n showResetButton = true,\n className = '',\n style,\n id,\n editorAttrs,\n}) => {\n // props로 전달된 값이 없으면 다국어 키 사용\n const resolvedTitle = title ?? t('common.filter');\n\n const handleSelectChange = (filterId: string, value: string | number) => {\n onChange?.(filterId, value);\n };\n\n const handleCheckboxChange = (filterId: string, optionValue: string | number, checked: boolean) => {\n const filter = filters.find(f => f.id === filterId);\n if (!filter) return;\n\n const currentValues = Array.isArray(filter.value) ? filter.value : [];\n\n // 타입에 따라 분리하여 처리\n if (typeof optionValue === 'string') {\n const stringValues = currentValues.filter((v): v is string => typeof v === 'string');\n const newValues = checked\n ? [...stringValues, optionValue]\n : stringValues.filter(v => v !== optionValue);\n onChange?.(filterId, newValues);\n } else {\n const numberValues = currentValues.filter((v): v is number => typeof v === 'number');\n const newValues = checked\n ? [...numberValues, optionValue]\n : numberValues.filter(v => v !== optionValue);\n onChange?.(filterId, newValues);\n }\n };\n\n return (\n \n {/* 헤더 */}\n
\n \n {resolvedTitle}\n \n {showResetButton && onReset && (\n \n {t('common.reset')}\n \n )}\n
\n\n {/* 필터 목록 */}\n
\n {filters.map((filter) => (\n
\n \n\n {/* Select 타입 필터 */}\n {filter.type === 'select' && (\n handleSelectChange(filter.id, e.target.value)}\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 dark:focus:ring-blue-400 focus:border-blue-500 dark:focus:border-blue-400 bg-white dark:bg-gray-700 text-gray-900 dark:text-white\"\n >\n \n {filter.options.map((option) => (\n \n ))}\n \n )}\n\n {/* Checkbox 타입 필터 */}\n {filter.type === 'checkbox' && (\n
\n {filter.options.map((option) => {\n const isChecked = Array.isArray(filter.value)\n ? filter.value.some(v => v === option.value)\n : false;\n\n return (\n \n \n handleCheckboxChange(filter.id, option.value, e.target.checked)\n }\n className=\"w-4 h-4 text-blue-600 border-gray-300 dark:border-gray-600 rounded focus:ring-blue-500\"\n />\n \n {option.label}\n \n \n );\n })}\n
\n )}\n
\n ))}\n
\n
\n );\n};\n","import React from 'react';\nimport { Nav } from '../basic/Nav';\nimport { Button } from '../basic/Button';\nimport { Icon } from '../basic/Icon';\nimport { IconName } from '../basic/IconTypes';\nimport { Div } from '../basic/Div';\nimport { Span } from '../basic/Span';\nimport { Select } from '../basic/Select';\nimport type { EditorAttrs } from '../../types';\n\nexport interface Tab {\n id: string | number;\n label: string;\n iconName?: IconName;\n disabled?: boolean;\n badge?: string | number;\n}\n\nexport interface TabNavigationProps {\n tabs: Tab[];\n activeTabId?: string | number;\n onTabChange?: (tabId: string | number) => void;\n variant?: 'default' | 'pills' | 'underline';\n className?: string;\n style?: React.CSSProperties;\n /** 모바일 전환 임계값 (px). 기본값 768 — G7 ResponsiveContext mobile 프리셋과 동일 */\n mobileBreakpoint?: number;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * TabNavigation 집합 컴포넌트\n *\n * 탭 네비게이션을 제공하는 컴포넌트입니다.\n * 여러 탭을 전환할 수 있으며, 아이콘과 뱃지를 지원합니다.\n *\n * 반응형: G7Core.useResponsive() hook으로 화면 너비를 구독하여\n * mobileBreakpoint(기본 768px) 미만일 때 Select 드롭다운으로 자동 전환됩니다.\n * Tailwind hidden md:flex 분기를 사용하지 않으므로 위지윅 편집기의 디바이스 미리보기와도 호환됩니다.\n *\n * **주의**: 이 컴포넌트는 순수 네비게이션 UI만 제공하며,\n * 실제 탭 컨텐츠는 부모 컴포넌트에서 activeTabId를 기반으로 조건부 렌더링해야 합니다.\n *\n * 기본 컴포넌트 조합: Nav + Button + Icon + Div + Span + Select\n *\n * @example\n * // 레이아웃 JSON 사용 예시\n * {\n * \"name\": \"TabNavigation\",\n * \"props\": {\n * \"activeTabId\": 1,\n * \"tabs\": [\n * {\"id\": 1, \"label\": \"프로필\", \"iconName\": \"user\"},\n * {\"id\": 2, \"label\": \"설정\", \"iconName\": \"cog\", \"badge\": 3}\n * ]\n * }\n * }\n */\nexport const TabNavigation: React.FC = ({\n tabs,\n activeTabId,\n onTabChange,\n variant = 'default',\n className = '',\n style,\n mobileBreakpoint = 768,\n id,\n editorAttrs,\n}) => {\n // G7Core.useResponsive를 통해 반응형 상태 구독 (G7 표준)\n const G7Core = (window as any).G7Core;\n const useResponsive = G7Core?.useResponsive;\n const responsiveValue = useResponsive?.();\n const isMobile = responsiveValue\n ? responsiveValue.width < mobileBreakpoint\n : typeof window !== 'undefined' && window.innerWidth < mobileBreakpoint;\n\n const handleTabClick = (tab: Tab) => {\n if (!tab.disabled && tab.id !== activeTabId) {\n onTabChange?.(tab.id);\n }\n };\n\n const handleSelectChange = (\n e: React.ChangeEvent | { target: { value: string | number } }\n ) => {\n const selectedId = e.target.value;\n const numericId = Number(selectedId);\n const finalId =\n typeof selectedId === 'string' && selectedId !== '' && !Number.isNaN(numericId)\n ? numericId\n : selectedId;\n const selectedTab = tabs.find((tab) => String(tab.id) === String(finalId));\n if (selectedTab) {\n handleTabClick(selectedTab);\n }\n };\n\n // 모바일: Select 드롭다운 단일 렌더\n if (isMobile) {\n return (\n
\n ({\n value: String(tab.id),\n label: tab.badge !== undefined ? `${tab.label} (${tab.badge})` : tab.label,\n disabled: tab.disabled,\n }))}\n className=\"w-full\"\n />\n
\n );\n }\n\n const getTabClasses = (tab: Tab) => {\n const isActive = tab.id === activeTabId;\n\n if (tab.disabled) {\n return 'tab-btn-base tab-btn-disabled';\n }\n\n switch (variant) {\n case 'pills':\n return isActive ? 'tab-btn-base tab-btn-pills-active' : 'tab-btn-base tab-btn-pills';\n\n case 'underline':\n return isActive\n ? 'tab-btn-base tab-btn-underline-active'\n : 'tab-btn-base tab-btn-underline';\n\n case 'default':\n default:\n return isActive\n ? 'tab-btn-base tab-btn-default-active'\n : 'tab-btn-base tab-btn-default';\n }\n };\n\n const navClasses = variant === 'underline' ? 'tab-nav-underline' : 'tab-nav-default';\n\n // 레이아웃 편집기 인플레이스 오버레이용 탭별 측정 마커(편집 모드 전용).\n // 탭은 자식 노드가 아니라 `props.tabs` 배열이라 `data-editor-path` 가 없다. 편집기 코어가\n // 각 탭 헤더 박스를 측정해 인플레이스 오버레이(+추가/✕삭제/정렬)에 넘길 수 있도록, 각 탭\n // 버튼에 `data-editor-item-path=\"<자기 path>.props.tabs.\"` 를 부여한다. 런타임에는\n // editorAttrs 가 주입되지 않으므로(undefined) 본 마커도 렌더되지 않아 사용자 페이지 무영향.\n const editorNodePath = editorAttrs?.['data-editor-path'];\n\n // 데스크톱: 탭 버튼 단일 렌더\n return (\n \n {tabs.map((tab, tabIndex) => (\n handleTabClick(tab)}\n disabled={tab.disabled}\n className={getTabClasses(tab)}\n {...(editorNodePath\n ? { 'data-editor-item-path': `${editorNodePath}.props.tabs.${tabIndex}` }\n : {})}\n >\n {tab.iconName && (\n \n )}\n\n {tab.label}\n\n {tab.badge !== undefined && (\n
\n {tab.badge}\n
\n )}\n \n ))}\n \n );\n};\n","/**\n * scrollToSection 핸들러\n *\n * 특정 섹션으로 부드럽게 스크롤 이동합니다.\n * - Sticky 헤더를 고려한 offset 적용 지원\n * - React 조건부 렌더링 대응 (재시도 로직)\n * - 페이지/컨테이너 스크롤 자동 감지\n *\n * @param action 액션 정의 (params: targetId, offset, delay, scrollContainerId)\n * @param _context 액션 컨텍스트 (미사용)\n */\n\n// Logger 설정 (G7Core 초기화 전에도 동작하도록 폴백 포함)\nconst logger = ((window as any).G7Core?.createLogger?.('Handler:ScrollToSection')) ?? {\n log: (...args: unknown[]) => console.log('[Handler:ScrollToSection]', ...args),\n warn: (...args: unknown[]) => console.warn('[Handler:ScrollToSection]', ...args),\n error: (...args: unknown[]) => console.error('[Handler:ScrollToSection]', ...args),\n};\n\nexport async function scrollToSectionHandler(\n action: any,\n _context?: any\n): Promise {\n const params = action.params || {};\n const {\n targetId,\n offset = 120,\n delay = 100,\n scrollContainerId,\n } = params as {\n targetId?: string;\n offset?: number;\n delay?: number;\n scrollContainerId?: string;\n };\n\n if (!targetId) {\n logger.warn('targetId is required');\n return;\n }\n\n // 1. 대상 요소 찾기 (React 렌더링 대기 + 재시도)\n const element = await findElementWithRetry(targetId, delay);\n if (!element) {\n logger.warn(`Element not found: ${targetId}`);\n return;\n }\n\n // 2. 스크롤 컨테이너 결정 (명시적 지정 or 자동 검색 or window)\n const scrollContainer = findScrollContainer(element, scrollContainerId);\n\n // 3. 스크롤 위치 계산 및 실행\n const offsetPosition = calculateScrollPosition(element, scrollContainer, offset);\n performScroll(scrollContainer, offsetPosition);\n}\n\n/**\n * 요소를 찾을 때까지 재시도\n * React 조건부 렌더링으로 요소가 늦게 생성될 수 있음\n */\nasync function findElementWithRetry(\n targetId: string,\n initialDelay: number\n): Promise {\n await new Promise((resolve) => setTimeout(resolve, initialDelay));\n\n const maxRetries = 10;\n const retryInterval = 50;\n\n for (let i = 0; i < maxRetries; i++) {\n const element = document.getElementById(targetId);\n if (element) {\n // 요소 발견 후 추가 렌더링 대기\n await new Promise((resolve) => setTimeout(resolve, 50));\n return element;\n }\n await new Promise((resolve) => setTimeout(resolve, retryInterval));\n }\n\n return null;\n}\n\n/**\n * 실제 스크롤 컨테이너 찾기\n * 1. scrollContainerId 파라미터가 있으면 해당 요소 검증 후 사용\n * 2. scrollContainerId가 없거나 유효하지 않으면 부모 요소 중 스크롤 가능한 요소 검색\n * 3. 찾지 못하면 페이지 스크롤 사용 (window)\n */\nfunction findScrollContainer(\n element: HTMLElement,\n scrollContainerId?: string\n): HTMLElement | Window {\n // 1. 명시적으로 지정된 경우 - 검증 후 사용\n if (scrollContainerId) {\n const container = document.getElementById(scrollContainerId);\n if (container && isScrollable(container)) {\n return container;\n }\n logger.warn(\n `Container '${scrollContainerId}' ${container ? 'has no scroll' : 'not found'}, trying auto-detect`\n );\n }\n\n // 2. 부모 요소 중 스크롤 가능한 요소 검색 (최대 10단계)\n let currentElement = element.parentElement;\n let depth = 0;\n const maxDepth = 10;\n\n while (currentElement && currentElement !== document.body && depth < maxDepth) {\n if (isScrollable(currentElement)) {\n return currentElement;\n }\n currentElement = currentElement.parentElement;\n depth++;\n }\n\n // 3. 스크롤 컨테이너를 찾지 못했으면 window 사용\n return window;\n}\n\n/**\n * 요소가 스크롤 가능한지 확인\n */\nfunction isScrollable(element: HTMLElement): boolean {\n const computedStyle = window.getComputedStyle(element);\n return (\n (computedStyle.overflowY === 'auto' || computedStyle.overflowY === 'scroll') &&\n element.scrollHeight > element.clientHeight\n );\n}\n\n/**\n * 스크롤 위치 계산\n */\nfunction calculateScrollPosition(\n element: HTMLElement,\n scrollContainer: HTMLElement | Window,\n offset: number\n): number {\n if (scrollContainer === window || !('getBoundingClientRect' in scrollContainer)) {\n // Window 스크롤\n const viewportTop = element.getBoundingClientRect().top;\n const documentTop = viewportTop + window.pageYOffset;\n return documentTop - offset;\n } else {\n // 컨테이너 내부 스크롤\n const containerRect = scrollContainer.getBoundingClientRect();\n const elementRect = element.getBoundingClientRect();\n return scrollContainer.scrollTop + (elementRect.top - containerRect.top) - offset;\n }\n}\n\n/**\n * 스크롤 실행\n */\nfunction performScroll(\n scrollContainer: HTMLElement | Window,\n offsetPosition: number\n): void {\n if (scrollContainer === window || !('scrollTo' in scrollContainer)) {\n window.scrollTo({ top: offsetPosition, behavior: 'smooth' });\n } else {\n scrollContainer.scrollTo({ top: offsetPosition, behavior: 'smooth' });\n }\n}","import React, { useState, useEffect, useRef } from 'react';\nimport { Button } from '../basic/Button';\nimport { Div } from '../basic/Div';\nimport { Icon } from '../basic/Icon';\nimport { IconName } from '../basic/IconTypes';\nimport { Span } from '../basic/Span';\nimport { Select } from '../basic/Select';\nimport { scrollToSectionHandler } from '../../handlers/scrollToSectionHandler';\nimport type { EditorAttrs } from '../../types';\n\n// Logger 설정 (G7Core 초기화 전에도 동작하도록 폴백 포함)\nconst logger = ((window as any).G7Core?.createLogger?.('Comp:TabNavigation')) ?? {\n log: (...args: unknown[]) => console.log('[Comp:TabNavigation]', ...args),\n warn: (...args: unknown[]) => console.warn('[Comp:TabNavigation]', ...args),\n error: (...args: unknown[]) => console.error('[Comp:TabNavigation]', ...args),\n};\n\n/**\n * 탭 정의 인터페이스\n */\nexport interface Tab {\n id: string | number;\n label: string;\n /** 탭 아이콘 (Font Awesome 아이콘명) */\n iconName?: IconName;\n disabled?: boolean;\n /** 개별 탭의 스크롤 오프셋 (우선순위: 개별 > 공통 > 기본값) */\n scrollOffset?: number;\n /** 개별 탭의 스크롤 딜레이 (우선순위: 개별 > 공통 > 기본값) */\n scrollDelay?: number;\n /** 개별 탭 클릭 시 실행될 콜백 (우선순위: 개별 > 공통 > 기본) */\n onClick?: (tabId: string | number) => void;\n}\n\n/**\n * TabNavigationScroll Props\n */\nexport interface TabNavigationScrollProps {\n /** 탭 목록 */\n tabs: Tab[];\n /** 활성 탭 ID (초기값으로만 사용) */\n activeTabId?: string | number;\n /** 컨테이너 className */\n className?: string;\n /** 컨테이너 스타일 */\n style?: React.CSSProperties;\n /** Active 탭 className */\n activeClassName?: string;\n /** Inactive 탭 className */\n inactiveClassName?: string;\n /** 섹션 ID 접두사 */\n sectionIdPrefix?: string;\n /** 스크롤 오프셋 */\n scrollOffset?: number;\n /** 스크롤 딜레이 */\n scrollDelay?: number;\n /** 탭 변경 시 실행될 공통 콜백 (우선순위: 개별 탭 onClick > onTabChange > 기본) */\n onTabChange?: (tabId: string | number) => void;\n /** Scroll Spy 활성화 여부 (스크롤 시 자동으로 탭 활성화) */\n enableScrollSpy?: boolean;\n /** Scroll Spy 감지 오프셋 (기본값: 80) */\n scrollSpyOffset?: number;\n /** 스크롤 컨테이너 ID (IntersectionObserver root 및 scrollToSection 대상, 미지정 시 window) */\n scrollContainerId?: string;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * 탭 네비게이션 컴포넌트 (자동 스크롤 기능 내장)\n *\n * 특징:\n * - 내부 상태로 활성 탭 관리 (React useState)\n * - scrollToSectionHandler를 사용하여 자동 스크롤\n * - 탭 클릭 시 즉시 UI 업데이트 + 스크롤 이동\n * - 반응형: G7Core.useResponsive() hook으로 화면 너비를 구독하여 768px 미만 시\n * Select 드롭다운으로 자동 전환 (Tailwind hidden md:flex 분기 미사용 — 위지윅 미리보기 호환)\n *\n * @example\n * ```json\n * {\n * \"type\": \"composite\",\n * \"name\": \"TabNavigationScroll\",\n * \"props\": {\n * \"tabs\": [\n * {\"id\": \"basic\", \"label\": \"$t:admin.tabs.basic\"},\n * {\"id\": \"permissions\", \"label\": \"$t:admin.tabs.permissions\"}\n * ]\n * }\n * }\n * ```\n */\nexport const TabNavigationScroll: React.FC = ({\n tabs,\n activeTabId,\n className = 'bg-white dark:bg-gray-800 flex gap-2 border-b border-gray-200 dark:border-gray-700 px-6',\n style,\n activeClassName = 'tab-btn-base tab-btn-default-active',\n inactiveClassName = 'tab-btn-base tab-btn-default',\n sectionIdPrefix = 'tab_content_',\n scrollOffset = 120,\n scrollDelay = 100,\n onTabChange,\n enableScrollSpy = false,\n scrollSpyOffset = 80,\n scrollContainerId,\n id,\n editorAttrs,\n}) => {\n const [activeTab, setActiveTab] = useState(\n activeTabId ?? (tabs.length > 0 ? tabs[0].id : '')\n );\n\n // G7Core.useResponsive를 통해 반응형 상태 구독 (G7 표준)\n const G7Core = (window as any).G7Core;\n const useResponsive = G7Core?.useResponsive;\n const responsiveValue = useResponsive?.();\n const isMobile = responsiveValue\n ? responsiveValue.width < 768\n : typeof window !== 'undefined' && window.innerWidth < 768;\n\n // Scroll Spy 일시 중지를 위한 ref\n const isScrollingRef = useRef(false);\n const scrollTimeoutRef = useRef(null);\n\n /**\n * 탭 클릭 핸들러\n * 우선순위: 개별 탭 onClick > 공통 onTabChange > 기본 동작\n */\n const handleTabClick = (tab: Tab) => {\n // Scroll Spy 일시 중지\n if (enableScrollSpy) {\n isScrollingRef.current = true;\n if (scrollTimeoutRef.current) {\n clearTimeout(scrollTimeoutRef.current);\n }\n }\n\n // 우선순위 1: 개별 탭의 onClick이 있으면 실행\n if (tab.onClick) {\n tab.onClick(tab.id);\n // enableScrollSpy가 아니면 onClick에 전적으로 위임\n if (!enableScrollSpy) {\n return;\n }\n }\n // 우선순위 2: 공통 onTabChange가 있으면 실행\n else if (onTabChange) {\n onTabChange(tab.id);\n // enableScrollSpy가 아니면 onTabChange에 전적으로 위임\n if (!enableScrollSpy) {\n return;\n }\n }\n // 우선순위 3: 콜백이 없으면 내부 상태 업데이트\n else {\n setActiveTab(tab.id);\n }\n\n // 개별 탭 설정 우선, 없으면 공통 설정 사용\n const finalOffset = tab.scrollOffset ?? scrollOffset;\n const finalDelay = tab.scrollDelay ?? scrollDelay;\n\n scrollToSectionHandler(\n {\n params: {\n targetId: `${sectionIdPrefix}${tab.id}`,\n offset: finalOffset,\n delay: finalDelay,\n scrollContainerId,\n },\n },\n {}\n );\n\n // 스크롤 완료 후 Scroll Spy 재활성화 (딜레이 + 애니메이션 시간 고려)\n if (enableScrollSpy) {\n scrollTimeoutRef.current = setTimeout(() => {\n isScrollingRef.current = false;\n }, finalDelay + 500);\n }\n };\n\n /**\n * Scroll Spy 구현 (IntersectionObserver 사용)\n *\n * 짧은 섹션과 긴 섹션이 혼재된 경우를 고려한 알고리즘:\n * - 여러 섹션이 동시에 보일 경우, 가장 많이 보이는 섹션을 활성화\n * - intersectionRatio를 비교하여 최적의 섹션 선택\n * - 스크롤이 페이지 하단에 도달하면 마지막 탭 활성화 (짧은 마지막 섹션 대응)\n */\n useEffect(() => {\n if (!enableScrollSpy) {\n return;\n }\n\n const rootElement = scrollContainerId\n ? document.getElementById(scrollContainerId)\n : null;\n\n const observerOptions = {\n root: rootElement ?? null,\n // 상단 오프셋 + 하단 30% 여유 공간 (짧은 섹션도 감지 가능)\n rootMargin: `-${scrollSpyOffset}px 0px -30% 0px`,\n // 0.1 단위로 교차 비율 감지 (더 정밀한 감지)\n threshold: [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0],\n };\n\n // 현재 보이는 섹션들의 교차 비율을 저장\n const intersectingEntries = new Map();\n\n // 페이지 하단 도달 확인 헬퍼 함수 (scrollContainer 기준)\n const isAtBottom = () => {\n const container = rootElement;\n const scrollTop = container\n ? container.scrollTop\n : window.pageYOffset || document.documentElement.scrollTop;\n const scrollHeight = container\n ? container.scrollHeight\n : document.documentElement.scrollHeight;\n const clientHeight = container\n ? container.clientHeight\n : document.documentElement.clientHeight;\n // 10px 여유를 두고 하단 체크 (정확한 하단 감지)\n const atBottom = scrollTop + clientHeight >= scrollHeight - 10;\n\n // 디버깅 로그 (개발 환경에서만)\n if (process.env.NODE_ENV === 'development' && atBottom) {\n logger.log('Bottom reached:', {\n scrollTop,\n clientHeight,\n scrollHeight,\n remaining: scrollHeight - (scrollTop + clientHeight),\n });\n }\n\n return atBottom;\n };\n\n const observerCallback = (entries: IntersectionObserverEntry[]) => {\n // 수동 스크롤 중에는 Scroll Spy 비활성화\n if (isScrollingRef.current) {\n return;\n }\n\n // 교차 비율 업데이트\n entries.forEach((entry) => {\n const targetId = entry.target.id;\n if (entry.isIntersecting) {\n intersectingEntries.set(targetId, entry.intersectionRatio);\n } else {\n intersectingEntries.delete(targetId);\n }\n });\n\n // 가장 많이 보이는 섹션 찾기\n let maxRatio = 0;\n let mostVisibleId = '';\n\n intersectingEntries.forEach((ratio, id) => {\n if (ratio > maxRatio) {\n maxRatio = ratio;\n mostVisibleId = id;\n }\n });\n\n // 하단 도달 시 마지막 탭 활성화 (단, 마지막 섹션이 실제로 보이고 있을 때만)\n const lastTab = tabs[tabs.length - 1];\n const lastSectionId = `${sectionIdPrefix}${lastTab?.id}`;\n const isLastSectionVisible = intersectingEntries.has(lastSectionId);\n\n if (isAtBottom() && isLastSectionVisible && lastTab) {\n if (process.env.NODE_ENV === 'development') {\n logger.log('Activating last tab (bottom reached + last section visible):', lastTab.id);\n }\n setActiveTab(lastTab.id);\n return;\n }\n\n // 가장 많이 보이는 섹션의 탭 활성화\n if (mostVisibleId) {\n const tabId = mostVisibleId.replace(sectionIdPrefix, '');\n const numericTabId = Number(tabId);\n const finalTabId = isNaN(numericTabId) ? tabId : numericTabId;\n\n const tabExists = tabs.some((tab) => tab.id === finalTabId);\n if (tabExists) {\n setActiveTab(finalTabId);\n }\n }\n };\n\n // 스크롤 이벤트 핸들러 (현재는 IntersectionObserver가 모든 처리를 담당)\n const handleScroll = () => {\n // IntersectionObserver가 모든 탭 활성화를 처리하므로 여기서는 추가 동작 없음\n // 향후 필요시 추가 로직 구현 가능\n };\n\n const observer = new IntersectionObserver(observerCallback, observerOptions);\n\n // 모든 섹션 관찰 시작\n tabs.forEach((tab) => {\n const sectionElement = document.getElementById(`${sectionIdPrefix}${tab.id}`);\n if (sectionElement) {\n observer.observe(sectionElement);\n }\n });\n\n // 스크롤 이벤트 리스너 등록\n window.addEventListener('scroll', handleScroll, { passive: true });\n\n // Cleanup\n return () => {\n observer.disconnect();\n window.removeEventListener('scroll', handleScroll);\n if (scrollTimeoutRef.current) {\n clearTimeout(scrollTimeoutRef.current);\n }\n };\n }, [enableScrollSpy, tabs, sectionIdPrefix, scrollSpyOffset, scrollContainerId]);\n\n /**\n * Select 변경 핸들러 (모바일용)\n */\n const handleSelectChange = (\n e: React.ChangeEvent | { target: { value: string | number } }\n ) => {\n const selectedId = e.target.value;\n // 숫자형 ID 변환\n const numericId = Number(selectedId);\n const finalId = isNaN(numericId) ? selectedId : numericId;\n\n const selectedTab = tabs.find((tab) => tab.id === finalId);\n if (selectedTab) {\n handleTabClick(selectedTab);\n }\n };\n\n // 모바일: Select 드롭다운 단일 렌더\n if (isMobile) {\n return (\n
\n ({\n value: String(tab.id),\n label: tab.label,\n disabled: tab.disabled,\n }))}\n className=\"w-full\"\n />\n
\n );\n }\n\n // 데스크톱: 탭 버튼 단일 렌더\n return (\n
\n {tabs.map((tab) => (\n handleTabClick(tab)}\n >\n {tab.iconName && (\n \n )}\n {tab.label}\n \n ))}\n
\n );\n};\n","import React from 'react';\nimport { Button } from '../basic/Button';\nimport { Icon } from '../basic/Icon';\nimport { IconName } from '../basic/IconTypes';\nimport type { EditorAttrs } from '../../types';\n\n// G7Core 전역 객체의 스타일 헬퍼 접근\nconst G7Core = () => (window as any).G7Core;\n\nexport interface IconButtonProps {\n iconName: IconName;\n label?: string;\n onClick?: () => void;\n variant?: 'primary' | 'secondary' | 'danger' | 'ghost' | 'outline';\n size?: 'sm' | 'md' | 'lg';\n disabled?: boolean;\n className?: string;\n style?: React.CSSProperties;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * IconButton 집합 컴포넌트\n *\n * 아이콘이 포함된 버튼 컴포넌트입니다.\n * 아이콘만 표시하거나 라벨과 함께 표시할 수 있습니다.\n *\n * 기본 컴포넌트 조합: Button + Icon\n *\n * @example\n * // 레이아웃 JSON 사용 예시\n * {\n * \"name\": \"IconButton\",\n * \"props\": {\n * \"iconName\": \"plus\",\n * \"label\": \"추가\",\n * \"variant\": \"primary\",\n * \"size\": \"md\"\n * }\n * }\n */\nexport const IconButton: React.FC = ({\n iconName,\n label,\n onClick,\n variant = 'primary',\n size = 'md',\n disabled = false,\n className = '',\n style,\n id,\n editorAttrs,\n}) => {\n // 크기별 스타일 (라벨 없을 때는 정사각 고정 크기로 정렬을 보장)\n const sizeClasses = {\n sm: label ? 'px-3 py-1.5 text-sm' : 'w-8 h-8',\n md: label ? 'px-4 py-2 text-base' : 'w-10 h-10',\n lg: label ? 'px-5 py-2.5 text-lg' : 'w-12 h-12',\n };\n\n // 아이콘 크기\n const iconSizeClasses = {\n sm: 'w-4 h-4',\n md: 'w-5 h-5',\n lg: 'w-6 h-6',\n };\n\n // 변형별 스타일\n const variantClasses = {\n primary: 'bg-blue-600 hover:bg-blue-700 text-white border-transparent',\n secondary: 'bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600 text-gray-700 dark:text-gray-300 border-gray-300 dark:border-gray-600',\n danger: 'bg-red-600 hover:bg-red-700 text-white border-transparent',\n ghost: 'bg-transparent hover:bg-gray-100 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300 border-transparent',\n outline: 'bg-transparent hover:bg-gray-50 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300 border-gray-300 dark:border-gray-600',\n };\n\n const baseClasses = 'inline-flex items-center justify-center gap-2 font-medium rounded-lg border transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 dark:focus:ring-blue-400';\n const disabledClasses = disabled ? 'opacity-50 cursor-not-allowed' : '';\n\n // 모든 내부 클래스를 결합한 후 외부 className과 병합\n const internalClasses = `${baseClasses} ${sizeClasses[size]} ${variantClasses[variant]} ${disabledClasses}`;\n const mergedClassName = G7Core()?.style?.mergeClasses?.(internalClasses, className)\n ?? `${internalClasses} ${className}`;\n\n return (\n \n \n {label}\n \n );\n};\n","import React from 'react';\nimport { Modal } from './Modal';\nimport { Div } from '../basic/Div';\nimport { H2 } from '../basic/H2';\nimport { Button } from '../basic/Button';\nimport { Icon } from '../basic/Icon';\nimport { IconName } from '../basic/IconTypes';\n\n// G7Core.t() 번역 함수 참조\nconst t = (key: string, params?: Record) =>\n (window as any).G7Core?.t?.(key, params) ?? key;\n\nexport interface DialogAction {\n label: string;\n onClick: () => void;\n variant?: 'primary' | 'secondary' | 'danger' | 'ghost';\n iconName?: IconName;\n disabled?: boolean;\n}\n\nexport interface DialogProps {\n isOpen: boolean;\n onClose: () => void;\n title: string;\n content: React.ReactNode;\n actions?: DialogAction[];\n width?: string;\n closeOnOverlay?: boolean;\n showCloseButton?: boolean;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * Dialog 집합 컴포넌트\n *\n * Modal의 특화 버전으로 제목 + 본문 + 액션 영역 구조를 표준화한 컴포넌트.\n * Modal보다 더 구조화된 레이아웃 제공.\n *\n * 기본 컴포넌트 조합:\n * - Modal > Div(header) > H2(title) + Button(close)\n * - Div(body) > {content}\n * - Div(footer) > Button[](actions)\n *\n * @example\n * // 레이아웃 JSON 사용 예시\n * {\n * \"name\": \"Dialog\",\n * \"props\": {\n * \"isOpen\": \"{{dialogs.confirm}}\",\n * \"title\": \"확인\",\n * \"content\": \"정말 삭제하시겠습니까?\",\n * \"actions\": [\n * {\"label\": \"취소\", \"variant\": \"secondary\"},\n * {\"label\": \"삭제\", \"variant\": \"danger\"}\n * ]\n * }\n * }\n */\nexport const Dialog: React.FC = ({\n isOpen,\n onClose,\n title,\n content,\n actions = [],\n width = '500px',\n closeOnOverlay = true,\n showCloseButton = true,\n className = '',\n style,\n}) => {\n const handleOverlayClick = () => {\n if (closeOnOverlay) {\n onClose();\n }\n };\n\n // 버튼 variant별 스타일 매핑\n const variantClassMap: Record<'primary' | 'secondary' | 'danger' | 'ghost', string> = {\n primary: 'dialog-btn-primary',\n secondary: 'dialog-btn-secondary',\n danger: 'dialog-btn-danger',\n ghost: 'dialog-btn-ghost',\n };\n\n return (\n \n {/* Header */}\n
\n

\n {title}\n

\n {showCloseButton && (\n \n \n \n )}\n
\n\n {/* Body */}\n
\n {content}\n
\n\n {/* Footer (Actions) */}\n {actions.length > 0 && (\n
\n {actions.map((action, index) => (\n \n {action.iconName && (\n \n )}\n {action.label}\n \n ))}\n
\n )}\n \n );\n};\n","import React from 'react';\nimport { Modal } from './Modal';\nimport { Div } from '../basic/Div';\nimport { Button } from '../basic/Button';\nimport { P } from '../basic/P';\nimport { Span } from '../basic/Span';\nimport { Icon } from '../basic/Icon';\nimport { IconName } from '../basic/IconTypes';\n\n// G7Core.t() 번역 함수 참조\nconst t = (key: string, params?: Record) =>\n (window as any).G7Core?.t?.(key, params) ?? key;\n\nexport interface ConfirmDialogProps {\n isOpen: boolean;\n onClose: () => void;\n title: string;\n message: string | React.ReactNode;\n confirmText?: string;\n cancelText?: string;\n onConfirm: () => void;\n onCancel?: () => void;\n confirmButtonVariant?: 'primary' | 'secondary' | 'danger' | 'ghost';\n cancelButtonVariant?: 'primary' | 'secondary' | 'danger' | 'ghost';\n width?: string;\n closeOnOverlay?: boolean;\n /** 로딩 중 여부 (확인 버튼 비활성화 및 텍스트 변경) */\n isLoading?: boolean;\n /** 로딩 중 확인 버튼에 표시할 텍스트 */\n loadingText?: string;\n}\n\n/**\n * ConfirmDialog 집합 컴포넌트\n *\n * Modal 기반 확인/취소 다이얼로그 컴포넌트.\n * 사용자에게 확인을 요청하고 확인/취소 중 하나를 선택하도록 합니다.\n *\n * 기본 컴포넌트 조합:\n * - Modal > P(message) + Button(확인) + Button(취소)\n *\n * @example\n * // 레이아웃 JSON 사용 예시\n * {\n * \"name\": \"ConfirmDialog\",\n * \"props\": {\n * \"isOpen\": \"{{dialogs.deleteConfirm}}\",\n * \"title\": \"삭제 확인\",\n * \"message\": \"정말 이 항목을 삭제하시겠습니까?\",\n * \"confirmText\": \"삭제\",\n * \"cancelText\": \"$t:common.cancel\",\n * \"confirmButtonVariant\": \"danger\"\n * }\n * }\n */\nexport const ConfirmDialog: React.FC = ({\n isOpen,\n onClose,\n title,\n message,\n confirmText,\n cancelText,\n onConfirm,\n onCancel,\n confirmButtonVariant = 'primary',\n // cancelButtonVariant는 현재 고정 스타일 사용으로 미사용\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n cancelButtonVariant: _cancelButtonVariant = 'secondary',\n width = '500px',\n // closeOnOverlay는 Modal에서 처리하므로 미사용\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n closeOnOverlay: _closeOnOverlay = true,\n isLoading = false,\n loadingText,\n}) => {\n // props로 전달된 값이 없으면 다국어 키 사용\n const resolvedConfirmText = confirmText ?? t('common.confirm');\n const resolvedCancelText = cancelText ?? t('common.cancel');\n const resolvedLoadingText = loadingText ?? t('common.loading');\n\n const handleConfirm = () => {\n onConfirm();\n };\n\n const handleCancel = () => {\n // 로딩 중에는 취소 불가\n if (isLoading) return;\n onCancel?.();\n onClose();\n };\n\n const handleClose = () => {\n // 로딩 중에는 닫기 불가\n if (isLoading) return;\n onClose();\n };\n\n // 버튼 variant별 스타일 매핑\n const confirmVariantClassMap: Record<'primary' | 'secondary' | 'danger' | 'ghost', string> = {\n primary: 'bg-blue-600 text-white hover:bg-blue-700',\n secondary: 'bg-gray-200 dark:bg-gray-700 text-gray-800 dark:text-gray-200 hover:bg-gray-300 dark:hover:bg-gray-600',\n danger: 'bg-red-600 text-white hover:bg-red-700',\n ghost: 'bg-transparent text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700',\n };\n\n return (\n \n {/* 본문 */}\n
\n {typeof message === 'string' ? (\n

{message}

\n ) : (\n message\n )}\n
\n\n {/* 푸터 (버튼 영역) */}\n
\n {/* 취소 버튼 */}\n \n {resolvedCancelText}\n \n\n {/* 확인 버튼 */}\n \n {isLoading && (\n \n )}\n {isLoading ? resolvedLoadingText : resolvedConfirmText}\n \n
\n \n );\n};\n","import React from 'react';\nimport { Dialog, DialogAction } from './Dialog';\nimport { P } from '../basic/P';\n\n// G7Core.t() 번역 함수 참조\nconst t = (key: string, params?: Record) =>\n (window as any).G7Core?.t?.(key, params) ?? key;\n\nexport interface AlertDialogProps {\n isOpen: boolean;\n onClose: () => void;\n title: string;\n message: string | React.ReactNode;\n confirmText?: string;\n onConfirm?: () => void;\n confirmButtonVariant?: 'primary' | 'secondary' | 'danger' | 'ghost';\n width?: string;\n closeOnOverlay?: boolean;\n}\n\n/**\n * AlertDialog 집합 컴포넌트\n *\n * Dialog 기반 단일 확인 알림 다이얼로그 컴포넌트.\n * 사용자에게 정보를 전달하고 확인만 받습니다.\n *\n * 기본 컴포넌트 조합:\n * - Dialog > P(message) + Button(확인)\n *\n * @example\n * // 레이아웃 JSON 사용 예시\n * {\n * \"name\": \"AlertDialog\",\n * \"props\": {\n * \"isOpen\": \"{{dialogs.successAlert}}\",\n * \"title\": \"성공\",\n * \"message\": \"작업이 성공적으로 완료되었습니다.\",\n * \"confirmText\": \"$t:common.confirm\",\n * \"confirmButtonVariant\": \"primary\"\n * }\n * }\n */\nexport const AlertDialog: React.FC = ({\n isOpen,\n onClose,\n title,\n message,\n confirmText,\n onConfirm,\n confirmButtonVariant = 'primary',\n width = '500px',\n closeOnOverlay = true,\n}) => {\n // props로 전달된 값이 없으면 다국어 키 사용\n const resolvedConfirmText = confirmText ?? t('common.confirm');\n\n const handleConfirm = () => {\n onConfirm?.();\n onClose();\n };\n\n const actions: DialogAction[] = [\n {\n label: resolvedConfirmText,\n onClick: handleConfirm,\n variant: confirmButtonVariant,\n },\n ];\n\n // message가 문자열인 경우 P 컴포넌트로 래핑\n const content = typeof message === 'string' ? (\n

{message}

\n ) : (\n message\n );\n\n return (\n \n );\n};\n","import React, { useEffect, useState, useCallback } from 'react';\nimport { Div } from '../basic/Div';\nimport { Span } from '../basic/Span';\nimport { Button } from '../basic/Button';\nimport { Icon } from '../basic/Icon';\nimport { IconName } from '../basic/IconTypes';\n\n/**\n * G7Core.t() 번역 함수 참조\n * 런타임에 G7Core.t를 접근하여 테스트 환경에서도 모킹이 적용되도록 함\n */\nconst getTranslation = (key: string, params?: Record) => {\n const G7Core = (window as any).G7Core;\n return G7Core?.t?.(key, params) ?? key;\n};\n\nexport type ToastType = 'success' | 'error' | 'warning' | 'info';\nexport type ToastPosition =\n | 'top-left'\n | 'top-center'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-center'\n | 'bottom-right';\n\nexport interface ToastItem {\n id: string | number;\n type: ToastType;\n message: string;\n /** 커스텀 아이콘 이름 (지정하지 않으면 타입별 기본 아이콘 사용) */\n icon?: string;\n /** 개별 토스트 자동 닫힘 시간 (ms) */\n duration?: number;\n}\n\nexport interface ToastProps {\n /** 토스트 배열 (전역 상태 _global.toasts) */\n toasts?: ToastItem[] | null;\n /** 토스트 표시 위치 */\n position?: ToastPosition;\n /** 기본 자동 닫힘 시간 (ms, 기본 3000) */\n duration?: number;\n /** 토스트 제거 콜백 (전역 상태 업데이트용) */\n onRemove?: (id: string | number) => void;\n}\n\n// 타입별 기본 아이콘 매핑\nconst defaultIconMap: Record = {\n success: IconName.CheckCircle,\n error: IconName.XCircle,\n warning: IconName.ExclamationTriangle,\n info: IconName.InfoCircle,\n};\n\n// 타입별 스타일 매핑\nconst typeStyleMap: Record = {\n success: {\n bg: 'bg-green-50 dark:bg-green-900/20 border-green-200 dark:border-green-800',\n text: 'text-green-800 dark:text-green-300',\n },\n error: {\n bg: 'bg-red-50 dark:bg-red-900/20 border-red-200 dark:border-red-800',\n text: 'text-red-800 dark:text-red-300',\n },\n warning: {\n bg: 'bg-yellow-50 dark:bg-yellow-900/20 border-yellow-200 dark:border-yellow-800',\n text: 'text-yellow-800 dark:text-yellow-300',\n },\n info: {\n bg: 'bg-blue-50 dark:bg-blue-900/20 border-blue-200 dark:border-blue-800',\n text: 'text-blue-800 dark:text-blue-300',\n },\n};\n\n// position별 스타일 매핑\nconst positionClassMap: Record = {\n 'top-left': 'top-4 left-4',\n 'top-center': 'top-4 left-1/2 -translate-x-1/2',\n 'top-right': 'top-4 right-4',\n 'bottom-left': 'bottom-4 left-4',\n 'bottom-center': 'bottom-4 left-1/2 -translate-x-1/2',\n 'bottom-right': 'bottom-4 right-4',\n};\n\n/**\n * Toast 컴포넌트\n *\n * 전역 상태(_global.toasts)를 구독하여 토스트 알림을 스택으로 표시하는 컴포넌트.\n * ActionDispatcher의 toast 핸들러와 연동됩니다.\n *\n * 기능:\n * - 다중 토스트 스택 지원\n * - 타입별 스타일 (success, error, warning, info)\n * - 커스텀 아이콘 지정 가능\n * - 개별 토스트 자동 닫힘 시간 설정\n * - 수동 닫기 버튼\n *\n * @example\n * // 레이아웃 JSON 사용 예시 (_admin_base.json)\n * {\n * \"id\": \"global_toast\",\n * \"type\": \"composite\",\n * \"name\": \"Toast\",\n * \"props\": {\n * \"toasts\": \"{{_global.toasts}}\",\n * \"position\": \"bottom-center\",\n * \"duration\": 3000\n * }\n * }\n *\n * @example\n * // toast 핸들러 호출 예시 (레이아웃 JSON)\n * {\n * \"handler\": \"toast\",\n * \"params\": {\n * \"type\": \"success\",\n * \"message\": \"$t:admin.users.modals.bulk_activate_success\",\n * \"icon\": \"check\",\n * \"duration\": 5000\n * }\n * }\n */\nexport const Toast: React.FC = ({\n toasts,\n position = 'bottom-center',\n duration = 3000,\n onRemove,\n}) => {\n // 내부적으로 표시할 토스트 상태 관리 (애니메이션용)\n const [visibleToasts, setVisibleToasts] = useState>(new Map());\n\n // 토스트 제거 핸들러\n const handleRemove = useCallback((id: string | number) => {\n // 먼저 숨김 애니메이션 시작\n setVisibleToasts(prev => {\n const next = new Map(prev);\n next.set(id, false);\n return next;\n });\n\n // 애니메이션 후 실제 제거\n setTimeout(() => {\n if (onRemove) {\n onRemove(id);\n } else {\n // onRemove가 없으면 G7Core.state.update를 통해 전역 상태 업데이트\n const G7Core = (window as any).G7Core;\n if (G7Core?.state?.update) {\n G7Core.state.update((prevState: Record) => {\n const currentToasts = Array.isArray(prevState.toasts) ? prevState.toasts : [];\n return {\n toasts: currentToasts.filter((t: ToastItem) => t.id !== id),\n };\n });\n }\n }\n }, 300);\n }, [onRemove]);\n\n // 새 토스트가 추가되면 visible 상태 설정 및 자동 제거 타이머 설정\n useEffect(() => {\n if (!toasts || toasts.length === 0) return;\n\n toasts.forEach(toast => {\n // 이미 처리된 토스트는 건너뜀\n if (visibleToasts.has(toast.id)) return;\n\n // visible 상태 추가\n setVisibleToasts(prev => {\n const next = new Map(prev);\n next.set(toast.id, true);\n return next;\n });\n\n // 자동 제거 타이머 설정\n const effectiveDuration = toast.duration || duration;\n if (effectiveDuration > 0) {\n setTimeout(() => {\n handleRemove(toast.id);\n }, effectiveDuration);\n }\n });\n }, [toasts, duration, handleRemove, visibleToasts]);\n\n // 토스트가 없으면 렌더링하지 않음\n if (!toasts || toasts.length === 0) {\n return null;\n }\n\n return (\n \n {toasts.map((toast) => (\n handleRemove(toast.id)}\n />\n ))}\n
\n
\n
\n
\n
\n
\n
\n
\n
\n {Array.from({ length: iterCount }, (_, i) => (\n
\n
\n
\n
\n
\n
\n
\n
\n ))}\n
\n ),\n Pagination: (animClass) => (\n
\n {Array.from({ length: 5 }, (_, i) => (\n
\n ))}\n
\n ),\n Tabs: (animClass) => (\n
\n
\n {Array.from({ length: 3 }, (_, i) => (\n
\n ))}\n
\n
\n
\n ),\n TabNavigation: (animClass) => (\n
\n {Array.from({ length: 3 }, (_, i) => (\n
\n ))}\n
\n ),\n ProductCard: (animClass) => (\n
\n
\n
\n
\n
\n
\n
\n ),\n UserInfo: (animClass) => (\n
\n ),\n QuantitySelector: (animClass) => (\n
\n ),\n Header: (animClass) => (\n
\n
\n
\n
\n
\n
\n {Array.from({ length: 4 }, (_, i) => (\n
\n ))}\n
\n
\n
\n {Array.from({ length: 3 }, (_, i) => (\n
\n ))}\n
\n
\n
\n
\n ),\n Footer: (animClass) => (\n
\n
\n
\n
\n
\n
\n {Array.from({ length: 3 }, (_, i) => (\n
\n ))}\n
\n
\n
\n
\n
\n ),\n Modal: () => <>,\n Toast: () => <>,\n ConfirmDialog: () => <>,\n};\n\n/**\n * 조건부 분기 필터링 — 로딩/에러 상태 스킵, 콘텐츠 브랜치 선택\n *\n * 레이아웃 JSON에서 로딩/에러/콘텐츠 상태가 sibling으로 if 조건으로 분기되는 패턴이 일반적.\n * 스켈레톤은 \"데이터 로드 완료 후 실제 UI\" 형태를 보여줘야 하므로,\n * 로딩/에러 분기는 스킵하고 콘텐츠 분기(가장 풍부한 트리)만 렌더링.\n */\nfunction filterChildren(children: LayoutComponent[]): LayoutComponent[] {\n if (!children || children.length === 0) return [];\n\n const withIf = children.filter(c => c.if);\n const withoutIf = children.filter(c => !c.if);\n\n // if 조건 없는 컴포넌트가 있고, if 있는 것도 있는 경우\n // → if 없는 것은 항상 렌더, if 있는 것 중 부정 조건 스킵\n if (withoutIf.length > 0 && withIf.length > 0) {\n const positiveIf = withIf.filter(c => !isNegativeCondition(c.if!));\n // 긍정 조건 여러 개가 상호 배타적 값 분기(=== 'value')이면 richest만 선택\n // 예: type === 'basic', type === 'gallery', type === 'card'\n if (positiveIf.length > 1 && areMutuallyExclusiveBranches(positiveIf)) {\n return [...withoutIf, pickRichestBranch(positiveIf)];\n }\n return [...withoutIf, ...positiveIf];\n }\n\n // 모든 컴포넌트가 if 조건을 가진 경우 → 상호 배타적 분기\n // → 부정 조건 스킵 후, 나머지 중 가장 풍부한 브랜치 선택\n if (withIf.length > 1 && withoutIf.length === 0) {\n const positive = withIf.filter(c => !isNegativeCondition(c.if!));\n if (positive.length === 0) {\n // 모두 부정 조건 (로딩/에러 상태만) → 전체 스킵\n // 스켈레톤은 \"데이터 로드 완료 후 UI\"를 보여주므로 로딩/에러 분기 불필요\n return [];\n }\n if (positive.length === 1) return positive;\n // 긍정 조건 여러 개 → 가장 풍부한 것 선택\n return [pickRichestBranch(positive)];\n }\n\n return children;\n}\n\n/**\n * 부정 조건 판별 — 로딩/에러 상태를 나타내는 if 조건\n */\nfunction isNegativeCondition(ifExpr: string): boolean {\n const trimmed = ifExpr.replace(/^\\{\\{|\\}\\}$/g, '').trim();\n return trimmed.startsWith('!') ||\n /\\b(hasError|isError|isLoading|error|Error)\\b/.test(trimmed) ||\n // empty state 패턴: length === 0, total === 0, count === 0 등\n /===\\s*0\\s*(\\)|\\}|$)/.test(trimmed);\n}\n\n/**\n * 상호 배타적 값 분기 판별\n *\n * 여러 if 조건이 같은 변수에 대한 `=== 'value'` 패턴이면 상호 배타적.\n * 예: type === 'basic', type === 'gallery', type === 'card'\n * → 스켈레톤에서 하나만 선택해야 중복 렌더링 방지.\n */\nfunction areMutuallyExclusiveBranches(branches: LayoutComponent[]): boolean {\n if (branches.length < 2) return false;\n\n // 각 조건에서 \"expr === 'value'\" 패턴의 기본 표현식(expr) 추출\n const baseExpressions: string[] = [];\n for (const branch of branches) {\n const trimmed = (branch.if || '').replace(/^\\{\\{|\\}\\}$/g, '').trim();\n // === 'value' 또는 === \"value\" 패턴 찾기\n const match = trimmed.match(/^(.+?)\\s*===\\s*['\"]/);\n if (!match) {\n // || 로 연결된 복합 조건에서도 첫 번째 === 패턴 추출 (fallback 분기)\n const orMatch = trimmed.match(/(.+?)\\s*===\\s*['\"]/);\n if (!orMatch) return false;\n baseExpressions.push(orMatch[1].trim());\n } else {\n baseExpressions.push(match[1].trim());\n }\n }\n\n // 모든 분기가 같은 기본 표현식을 참조하면 상호 배타적\n const first = baseExpressions[0];\n return baseExpressions.every(expr => expr === first);\n}\n\n/**\n * 자손 수 기준 가장 풍부한 분기 선택\n */\nfunction pickRichestBranch(branches: LayoutComponent[]): LayoutComponent {\n return branches.reduce((best, curr) =>\n countDescendants(curr) > countDescendants(best) ? curr : best\n );\n}\n\n/**\n * 컴포넌트 트리의 총 자손 수 계산\n */\nfunction countDescendants(component: LayoutComponent): number {\n if (!component.children) return 0;\n return component.children.length +\n component.children.reduce((sum, child) => sum + countDescendants(child), 0);\n}\n\n/**\n * className 내 {{...}} 표현식 해석\n *\n * 레이아웃 JSON의 className에 {{expr ? 'classA' : 'classB'}} 같은 표현식이 포함될 수 있음.\n * 스켈레톤에서는 데이터가 없으므로 표현식을 평가할 수 없음.\n * → 삼항 연산자의 true 분기 값을 추출하여 적용 (기본값으로 사용).\n * → 단순 표현식(삼항 아닌 경우)은 제거.\n */\nfunction resolveExpressions(className: string): string {\n if (!className.includes('{{')) return className;\n\n return className.replace(/\\{\\{([^}]+)\\}\\}/g, (_, expr: string) => {\n // 삼항 연산자: condition ? 'value1' : 'value2' → value1 추출\n const ternaryMatch = expr.match(/\\?[\\s]*['\"]([^'\"]*)['\"]\\s*:\\s*['\"]/);\n if (ternaryMatch) {\n return ternaryMatch[1];\n }\n // 삼항 아닌 단순 표현식 → 제거\n return '';\n });\n}\n\n/**\n * 스켈레톤 렌더에 적합한 className 변환\n *\n * 1. {{...}} 표현식 해석 (삼항 → true 분기, 단순 표현식 → 제거)\n * 2. 레이아웃 구조 클래스(flex, grid, gap, padding, margin, max-width 등)는 원본 유지.\n * 3. 시각적 클래스(배경색, 텍스트색, 테두리, 그림자 등)는 제거.\n */\nfunction sanitizeClassName(className: string, name: string): string {\n if (!className) return '';\n\n // 시각적 클래스 제거 (표현식/반응형은 renderSkeletonNode에서 이미 해석됨)\n let sanitized = className;\n sanitized = sanitized\n .replace(/\\b(bg-\\S+|text-\\S+|border\\b|border-\\S+|shadow\\S*|ring-\\S+|outline-\\S+|divide-\\S+|opacity-\\S+|font-\\S+|tracking-\\S+|leading-\\S+|whitespace-\\S+|truncate|line-clamp-\\S+|underline|no-underline|decoration-\\S+|cursor-\\S+|hover:\\S+|focus:\\S+|active:\\S+|group-hover:\\S+|transition\\S*|duration-\\S+|ease-\\S+|animate-\\S+|dark:\\S+)\\b/g, '')\n .replace(/\\s{2,}/g, ' ')\n .trim();\n\n // Grid: 숫자 컬럼 수 유지 (arbitrary value [...]는 보존 — extractArbitraryGridCols에서 처리)\n if (name === 'Grid' || /\\bgrid-cols-\\d/.test(sanitized)) {\n sanitized = sanitized.replace(/\\bgrid-cols-(\\d+)/g, (_, val) => {\n const num = parseInt(val);\n return num > 4 ? `grid-cols-${Math.ceil(num / 2)}` : `grid-cols-${num}`;\n });\n }\n\n return sanitized;\n}\n\n/**\n * Flex/Grid 컴포넌트의 레이아웃 props를 Tailwind 클래스로 변환\n *\n * Flex, Grid 컴포넌트는 justify, align, gap 등을 별도 props로 받아\n * 실제 렌더 시 Tailwind 클래스로 변환한다.\n * 스켈레톤은 이 컴포넌트들을 plain
로 대체하므로,\n * props → Tailwind 변환을 여기서 수행하여 className에 병합해야 한다.\n *\n * @since engine-v1.17.0\n */\nfunction resolveLayoutProps(component: LayoutComponent): string {\n const { name, props } = component;\n if (!props || !name) return '';\n\n const classes: string[] = [];\n\n if (name === 'Flex') {\n classes.push('flex');\n\n const direction = props.direction || 'row';\n const directionMap: Record = {\n row: 'flex-row', 'row-reverse': 'flex-row-reverse',\n col: 'flex-col', 'col-reverse': 'flex-col-reverse',\n };\n if (directionMap[direction]) classes.push(directionMap[direction]);\n\n const justify = props.justify || 'start';\n const justifyMap: Record = {\n start: 'justify-start', end: 'justify-end', center: 'justify-center',\n between: 'justify-between', around: 'justify-around', evenly: 'justify-evenly',\n };\n if (justifyMap[justify]) classes.push(justifyMap[justify]);\n\n const align = props.align || 'stretch';\n const alignMap: Record = {\n start: 'items-start', end: 'items-end', center: 'items-center',\n baseline: 'items-baseline', stretch: 'items-stretch',\n };\n if (alignMap[align]) classes.push(alignMap[align]);\n\n const wrap = props.wrap || 'nowrap';\n const wrapMap: Record = {\n wrap: 'flex-wrap', nowrap: 'flex-nowrap', 'wrap-reverse': 'flex-wrap-reverse',\n };\n if (wrapMap[wrap]) classes.push(wrapMap[wrap]);\n\n if (props.gap && props.gap > 0) classes.push(`gap-${props.gap}`);\n }\n\n if (name === 'Grid') {\n classes.push('grid');\n\n const cols = props.cols || 1;\n classes.push(`grid-cols-${cols}`);\n\n if (props.responsive) {\n const r = props.responsive;\n if (r.sm) classes.push(`sm:grid-cols-${r.sm}`);\n if (r.md) classes.push(`md:grid-cols-${r.md}`);\n if (r.lg) classes.push(`lg:grid-cols-${r.lg}`);\n if (r.xl) classes.push(`xl:grid-cols-${r.xl}`);\n if (r['2xl']) classes.push(`2xl:grid-cols-${r['2xl']}`);\n }\n\n if (props.gap !== undefined && props.gap > 0) classes.push(`gap-${props.gap}`);\n if (props.rowGap !== undefined && props.rowGap > 0) classes.push(`gap-y-${props.rowGap}`);\n if (props.colGap !== undefined && props.colGap > 0) classes.push(`gap-x-${props.colGap}`);\n }\n\n return classes.join(' ');\n}\n\n/**\n * 애니메이션 클래스 결정\n */\nfunction getAnimationClass(animation: string): string {\n switch (animation) {\n case 'pulse':\n return 'animate-pulse';\n case 'wave':\n return 'animate-pulse'; // wave는 별도 CSS 필요, pulse로 폴백\n case 'none':\n return '';\n default:\n return 'animate-pulse';\n }\n}\n\n/**\n * 자식 컴포넌트 렌더링 (조건부 분기 필터링 적용)\n */\nfunction renderChildren(\n children: LayoutComponent[] | undefined,\n animClass: string,\n iterCount: number,\n width: number,\n): (React.ReactElement | null)[] {\n if (!children || children.length === 0) return [];\n const filtered = filterChildren(children);\n return filtered.map((child, i) =>\n renderSkeletonNode(child, animClass, iterCount, i, width)\n );\n}\n\n/**\n * 현재 뷰포트에 맞는 className 결정\n *\n * responsive 속성이 있으면 호출자가 전달한 viewport width 기준으로 적절한 className 선택.\n * - desktop (lg, 1024px+): responsive.desktop.props.className\n * - tablet (md, 768px+): responsive.tablet.props.className\n * - 기본: props.className\n *\n * @param width G7Core.useResponsive()로 구독한 viewport width (overrideWidth 반영)\n */\nfunction resolveClassName(component: LayoutComponent, width: number): string {\n const baseClassName = component.props?.className || component.className || '';\n\n if (!component.responsive) return baseClassName;\n\n if (width >= 1024 && component.responsive.desktop?.props?.className) {\n return component.responsive.desktop.props.className;\n }\n if (width >= 768 && component.responsive.tablet?.props?.className) {\n return component.responsive.tablet.props.className;\n }\n\n return baseClassName;\n}\n\n/**\n * Tailwind 반응형 display 클래스를 viewport 기준으로 해석\n *\n * 레이아웃 JSON의 className에 `hidden lg:grid`, `lg:hidden` 같은 Tailwind 반응형 패턴이 포함됨.\n * Tailwind은 빌드 시 CSS로 처리하지만, 스켈레톤은 런타임에서 JS로 해석해야 함.\n *\n * 동작:\n * 1. className에서 display 관련 클래스(hidden, flex, grid 등) + 반응형 접두사(lg:grid 등) 추출\n * 2. Tailwind cascade 규칙 적용: base → sm → md → lg → xl → 2xl 순서로 width에 맞는 display 결정\n * 3. hidden이면 컴포넌트 숨김, 아니면 해석된 display 클래스 + 나머지 클래스 반환\n *\n * @param width G7Core.useResponsive()로 구독한 viewport width (overrideWidth 반영)\n */\nfunction resolveResponsiveDisplay(className: string, width: number): { visible: boolean; className: string } {\n const tokens = className.split(/\\s+/).filter(Boolean);\n\n const displayEntries: Array<{ breakpoint: number; display: string }> = [];\n const otherClasses: string[] = [];\n\n for (const token of tokens) {\n // 반응형 접두사 + display 클래스: \"lg:grid\", \"sm:flex\", \"md:hidden\"\n const responsiveMatch = token.match(/^(sm|md|lg|xl|2xl):(.+)$/);\n if (responsiveMatch) {\n const [, prefix, cls] = responsiveMatch;\n if (DISPLAY_CLASSES.has(cls)) {\n displayEntries.push({\n breakpoint: TAILWIND_BREAKPOINTS[prefix] || 0,\n display: cls,\n });\n continue;\n }\n // 반응형 접두사지만 display가 아닌 클래스 (lg:gap-4 등) → 뷰포트 체크 후 포함\n if ((TAILWIND_BREAKPOINTS[prefix] || 0) <= width) {\n otherClasses.push(cls); // 접두사 제거하고 포함\n }\n continue;\n }\n\n // 기본(접두사 없는) display 클래스: \"hidden\", \"flex\", \"grid\"\n if (DISPLAY_CLASSES.has(token)) {\n displayEntries.push({ breakpoint: 0, display: token });\n continue;\n }\n\n otherClasses.push(token);\n }\n\n // display 클래스가 없으면 그대로 반환\n if (displayEntries.length === 0) {\n return { visible: true, className };\n }\n\n // breakpoint 오름차순 정렬 후 cascade 적용\n displayEntries.sort((a, b) => a.breakpoint - b.breakpoint);\n\n let effectiveDisplay = '';\n for (const entry of displayEntries) {\n if (entry.breakpoint <= width) {\n effectiveDisplay = entry.display;\n }\n }\n\n // 해당 뷰포트에 적용되는 display가 없으면 첫 번째(base) 사용\n if (!effectiveDisplay) {\n effectiveDisplay = displayEntries[0].display;\n }\n\n const visible = effectiveDisplay !== 'hidden';\n const resolvedClassName = visible\n ? [effectiveDisplay, ...otherClasses].join(' ')\n : '';\n\n return { visible, className: resolvedClassName };\n}\n\n/**\n * className에서 arbitrary grid-cols-[...] 값을 추출하여 inline style로 변환\n *\n * Tailwind의 arbitrary value `grid-cols-[60px_minmax(300px,1fr)_160px]`는\n * 빌드 시 동적 표현식({{...}}) 안에 있으면 purge되어 CSS에 포함되지 않음.\n * → inline style `gridTemplateColumns`로 변환하여 런타임에서 직접 적용.\n */\nfunction extractArbitraryGridCols(className: string): { className: string; style?: React.CSSProperties } {\n const match = className.match(/\\bgrid-cols-\\[([^\\]]+)\\]/);\n if (!match) return { className };\n\n const value = match[1].replace(/_/g, ' ');\n const cleanedClassName = className\n .replace(/\\bgrid-cols-\\[([^\\]]+)\\]/, '')\n .replace(/\\s{2,}/g, ' ')\n .trim();\n\n return {\n className: cleanedClassName,\n style: { gridTemplateColumns: value },\n };\n}\n\n/**\n * 단일 컴포넌트를 스켈레톤으로 변환\n */\nfunction renderSkeletonNode(\n component: LayoutComponent,\n animClass: string,\n iterCount: number,\n index: number,\n width: number,\n): React.ReactElement | null {\n const { name, children, iteration } = component;\n // 1. responsive 속성에서 뷰포트에 맞는 className 선택\n const rawClassName = resolveClassName(component, width);\n // 1.5. Flex/Grid 레이아웃 props → Tailwind 클래스 병합\n const layoutClasses = resolveLayoutProps(component);\n const mergedClassName = layoutClasses\n ? `${layoutClasses} ${rawClassName}`.trim()\n : rawClassName;\n // 2. {{...}} 표현식 해석 (삼항 → true 분기)\n const exprResolved = resolveExpressions(mergedClassName);\n // 3. Tailwind 반응형 display 클래스 해석 (hidden lg:grid → grid at desktop)\n const responsive = resolveResponsiveDisplay(exprResolved, width);\n\n if (!name) return null;\n\n // 현재 뷰포트에서 숨겨진 컴포넌트 → 스킵\n if (!responsive.visible) return null;\n\n const className = responsive.className;\n\n // iteration 블록: 기본 반복 횟수만큼 반복 생성\n if (iteration) {\n return (\n \n {Array.from({ length: iterCount }, (_, i) => (\n renderSkeletonNode(\n { ...component, iteration: undefined },\n animClass,\n iterCount,\n i,\n width,\n )\n ))}\n \n );\n }\n\n // 복합 컴포넌트 특화 스켈레톤\n if (COMPOSITE_SKELETONS[name]) {\n return (\n
\n {COMPOSITE_SKELETONS[name](animClass, iterCount)}\n
\n );\n }\n\n // 레이아웃 컨테이너: className 유지, 자식 재귀 순회\n if (LAYOUT_CONTAINERS.has(name)) {\n const sanitized = sanitizeClassName(className, name);\n\n // 자식 없는 leaf 컨테이너 → 스켈레톤 바로 표시\n if (!children || children.length === 0) {\n const hasDimension = /\\b(h-\\S|w-\\S)/.test(sanitized);\n const barClass = hasDimension\n ? `${sanitized} bg-gray-200 dark:bg-gray-700 rounded ${animClass}`\n : `${sanitized} h-3.5 w-full bg-gray-200 dark:bg-gray-700 rounded ${animClass}`.trim();\n return
;\n }\n\n // 자식 렌더링 (조건부 분기 필터링 적용)\n const renderedChildren = renderChildren(children, animClass, iterCount, width);\n const hasContent = renderedChildren.length > 0 && renderedChildren.some(c => c !== null);\n\n // 모든 자식이 필터링됨 (로딩/에러 wrapper 등) → 컨테이너 자체 스킵\n if (!hasContent) return null;\n\n // arbitrary grid-cols-[...] → inline style로 변환\n const gridResult = extractArbitraryGridCols(sanitized);\n\n return (\n
\n {renderedChildren}\n
\n );\n }\n\n // 비-컨테이너 컴포넌트: 원본 className에서 시각적 클래스(색상 등)를 제거\n // 스켈레톤 바의 색상은 고정(gray-200)이므로 원본 bg-red-500 등이 누출되면 안 됨\n const sanitizedLeafClass = sanitizeClassName(className, name);\n\n // 텍스트 컴포넌트: 회색 바\n if (TEXT_COMPONENTS.has(name)) {\n const heightMap: Record = {\n H1: 'h-7', H2: 'h-6', H3: 'h-5', H4: 'h-5', H5: 'h-4', H6: 'h-4',\n P: 'h-3.5', Span: 'h-3', Label: 'h-3', A: 'h-3.5',\n Badge: 'h-5 w-16',\n };\n const widthMap: Record = {\n H1: 'w-3/5', H2: 'w-2/5', H3: 'w-1/3', H4: 'w-1/3', H5: 'w-1/4', H6: 'w-1/4',\n P: 'w-full', Span: 'w-1/4', Label: 'w-1/4', A: 'w-1/3',\n Strong: 'w-1/5', Em: 'w-1/4', Small: 'w-1/5', Badge: 'w-16',\n };\n const height = heightMap[name] || 'h-3.5';\n const width = widthMap[name] || 'w-full';\n const spacing = name.startsWith('H') ? 'mb-2 mt-1' : 'mb-1.5';\n return (\n
\n );\n }\n\n // 인풋 컴포넌트: 사각형\n if (INPUT_COMPONENTS.has(name)) {\n if (name === 'Textarea') {\n return
;\n }\n if (name === 'Checkbox' || name === 'Radio' || name === 'Toggle') {\n return
;\n }\n return
;\n }\n\n // 미디어 컴포넌트: 큰 사각형\n if (MEDIA_COMPONENTS.has(name)) {\n if (name === 'Avatar' || name === 'AvatarUploader') {\n return
;\n }\n if (name === 'ProductImageViewer') {\n return
;\n }\n return
;\n }\n\n // Button: children이 있으면 래퍼(컨테이너)로 처리, 없으면 바\n if (name === 'Button') {\n if (children && children.length > 0) {\n const sanitized = sanitizeClassName(className, name);\n const renderedChildren = renderChildren(children, animClass, iterCount, width);\n const hasContent = renderedChildren.length > 0 && renderedChildren.some(c => c !== null);\n if (!hasContent) return null;\n // 원본 className에 border/rounded가 있으면 실제 버튼 형태 → 스켈레톤 경계 추가\n const hasBorderStyle = /\\b(border|rounded|px-\\d|py-\\d)/.test(rawClassName);\n const borderClass = hasBorderStyle\n ? 'border border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800/50 rounded-lg'\n : '';\n return (\n
\n {renderedChildren}\n
\n );\n }\n return
;\n }\n\n // Icon\n if (name === 'Icon') {\n return
;\n }\n\n // 기타: children이 있으면 컨테이너로, 없으면 범용 바\n if (children && children.length > 0) {\n return (\n
\n {renderChildren(children, animClass, iterCount, width)}\n
\n );\n }\n\n // 기본 폴백: 범용 스켈레톤 바\n return
;\n}\n\n/**\n * PageSkeleton — 단일 스켈레톤 렌더러 컴포넌트\n *\n * 엔진이 레이아웃 JSON의 컴포넌트 트리를 props로 전달하면,\n * 재귀적으로 순회하며 각 컴포넌트의 스켈레톤 플레이스홀더를 생성합니다.\n *\n * - 레이아웃 컨테이너(Div, Flex, Grid 등): className 유지, 자식 순회\n * - 텍스트 컴포넌트(H1~H6, P 등): 회색 바\n * - 인풋 컴포넌트(Input, Select 등): 사각형\n * - 미디어 컴포넌트(Img, Avatar 등): 큰 사각형\n * - 복합 컴포넌트(DataGrid, Tabs 등): 특화 스켈레톤\n * - iteration 블록: iteration_count 횟수만큼 반복\n * - 조건부 분기: 로딩/에러 상태 스킵, 콘텐츠 브랜치만 렌더\n *\n * @since engine-v1.24.0\n */\nexport const PageSkeleton: React.FC = ({ components, options }) => {\n const animClass = getAnimationClass(options.animation);\n\n // G7Core.useResponsive를 통해 viewport width 구독 (G7 표준 — 위지윅 overrideWidth 호환)\n const G7Core = (window as any).G7Core;\n const useResponsive = G7Core?.useResponsive;\n const responsiveValue = useResponsive?.();\n const width = responsiveValue\n ? responsiveValue.width\n : (typeof window !== 'undefined' ? window.innerWidth : 1024);\n\n return (\n \n {renderChildren(components, animClass, options.iteration_count, width)}\n
\n );\n};\n\nexport default PageSkeleton;\n","import React from 'react';\n\n/**\n * 페이지 로딩 컴포넌트 Props (엔진에서 전달)\n *\n * @since engine-v1.29.0\n */\nexport interface PageLoadingProps {\n options?: {\n text?: string;\n };\n}\n\n// G7Core.t() 번역 함수 참조\nconst t = (key: string, params?: Record) =>\n (window as any).G7Core?.t?.(key, params) ?? key;\n\n/**\n * 페이지 로딩 인디케이터 컴포넌트\n *\n * transition_overlay의 spinner 스타일에서 사용됩니다.\n * 엔진은 타겟 요소 내부에 빈 컨테이너만 삽입하며,\n * 포지셔닝/배경/z-index/다크모드 등 모든 비주얼 스타일은\n * 이 컴포넌트가 전적으로 결정합니다.\n *\n * React 트리 외부에 렌더링되므로 인라인 스타일 사용.\n *\n * @since engine-v1.29.0\n */\nconst PageLoading: React.FC = ({ options }) => {\n const isDark = document.documentElement.classList.contains('dark');\n\n const bgColor = isDark ? 'rgb(17,24,39)' : 'rgb(249,250,251)';\n const spinnerColor = isDark ? '#6b7280' : '#9ca3af';\n const textColor = isDark ? '#9ca3af' : '#6b7280';\n\n return (\n \n \n \n {options?.text || t('nav.loading')}\n \n
\n );\n};\n\nexport default PageLoading;\n","import React, { useMemo } from 'react';\nimport { Div } from '../basic/Div';\nimport { Button } from '../basic/Button';\nimport { Span } from '../basic/Span';\nimport type { EditorAttrs } from '../../types';\n\n// G7Core.t() 번역 함수 참조\nconst t = (key: string, params?: Record) =>\n (window as any).G7Core?.t?.(key, params) ?? key;\n\nexport interface PaginationProps {\n currentPage: number;\n totalPages: number;\n onPageChange: (page: number) => void;\n maxVisiblePages?: number;\n showFirstLast?: boolean;\n className?: string;\n style?: React.CSSProperties;\n prevText?: string;\n nextText?: string;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n/**\n * 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread)\n */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * Pagination 집합 컴포넌트\n *\n * Button + Span 기본 컴포넌트를 조합하여 페이지네이션 UI를 구성합니다.\n * 페이지 번호 생성 알고리즘을 포함하며, 많은 페이지 수에 대해 효율적으로 렌더링합니다.\n *\n * @example\n * // 레이아웃 JSON 사용 예시\n * {\n * \"name\": \"Pagination\",\n * \"props\": {\n * \"currentPage\": \"{{pagination.current}}\",\n * \"totalPages\": \"{{pagination.total}}\",\n * \"maxVisiblePages\": 5,\n * \"showFirstLast\": true\n * }\n * }\n */\nexport const Pagination: React.FC = ({\n currentPage,\n totalPages,\n onPageChange,\n maxVisiblePages = 5,\n showFirstLast = true,\n className = '',\n style,\n prevText,\n nextText,\n id,\n editorAttrs,\n}) => {\n\n // 페이지 번호 생성 알고리즘\n const pageNumbers = useMemo(() => {\n const pages: (number | string)[] = [];\n\n if (totalPages <= maxVisiblePages + 2) {\n // 페이지가 적으면 모두 표시\n for (let i = 1; i <= totalPages; i++) {\n pages.push(i);\n }\n } else {\n // 페이지가 많으면 축약 표시\n const halfVisible = Math.floor(maxVisiblePages / 2);\n\n let startPage = Math.max(2, currentPage - halfVisible);\n let endPage = Math.min(totalPages - 1, currentPage + halfVisible);\n\n // 시작 또는 끝 근처일 때 조정\n if (currentPage <= halfVisible + 1) {\n endPage = maxVisiblePages;\n } else if (currentPage >= totalPages - halfVisible) {\n startPage = totalPages - maxVisiblePages + 1;\n }\n\n // 첫 페이지\n pages.push(1);\n\n // 시작 생략 부호\n if (startPage > 2) {\n pages.push('...');\n }\n\n // 중간 페이지들\n for (let i = startPage; i <= endPage; i++) {\n pages.push(i);\n }\n\n // 끝 생략 부호\n if (endPage < totalPages - 1) {\n pages.push('...');\n }\n\n // 마지막 페이지\n if (totalPages > 1) {\n pages.push(totalPages);\n }\n }\n\n return pages;\n }, [currentPage, totalPages, maxVisiblePages]);\n\n const handlePageClick = (page: number) => {\n if (page < 1 || page > totalPages || page === currentPage) return;\n onPageChange(page);\n };\n\n const handlePrevious = () => {\n if (currentPage > 1) {\n onPageChange(currentPage - 1);\n }\n };\n\n const handleNext = () => {\n if (currentPage < totalPages) {\n onPageChange(currentPage + 1);\n }\n };\n\n return (\n \n {/* First Button */}\n {showFirstLast && (\n handlePageClick(1)}\n disabled={currentPage === 1}\n className=\"px-3 py-1 text-sm border border-gray-300 dark:border-gray-600 rounded hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-50 disabled:cursor-not-allowed text-gray-700 dark:text-gray-300 bg-white dark:bg-gray-800\"\n aria-label={t('common.first_page')}\n >\n «\n \n )}\n\n {/* Previous Button */}\n \n {prevText || <>‹}\n \n\n {/* Page Numbers */}\n
\n {pageNumbers.map((page, index) => {\n if (page === '...') {\n return (\n \n ...\n \n );\n }\n\n const pageNum = page as number;\n const isActive = pageNum === currentPage;\n\n return (\n handlePageClick(pageNum)}\n className={`px-3 py-1 text-sm border rounded ${\n isActive\n ? 'bg-blue-500 dark:bg-blue-600 text-white border-blue-500 dark:border-blue-600'\n : 'border-gray-300 dark:border-gray-600 hover:bg-gray-100 dark:hover:bg-gray-700 text-gray-700 dark:text-gray-300 bg-white dark:bg-gray-800'\n }`}\n aria-label={t('common.page_n', { n: pageNum })}\n aria-current={isActive ? 'page' : undefined}\n >\n {pageNum}\n \n );\n })}\n
\n\n {/* Next Button */}\n \n {nextText || <>›}\n \n\n {/* Last Button */}\n {showFirstLast && (\n handlePageClick(totalPages)}\n disabled={currentPage === totalPages}\n className=\"px-3 py-1 text-sm border border-gray-300 dark:border-gray-600 rounded hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-50 disabled:cursor-not-allowed text-gray-700 dark:text-gray-300 bg-white dark:bg-gray-800\"\n aria-label={t('common.last_page')}\n >\n »\n \n )}\n
\n );\n};\n","import React, { useState, useEffect } from 'react';\nimport { Form } from '../basic/Form';\nimport { Input } from '../basic/Input';\nimport { Button } from '../basic/Button';\nimport { Icon } from '../basic/Icon';\nimport { IconName } from '../basic/IconTypes';\nimport { Div } from '../basic/Div';\nimport { Span } from '../basic/Span';\nimport type { EditorAttrs } from '../../types';\n\n// G7Core.t() 번역 함수 참조\nconst t = (key: string, params?: Record) =>\n (window as any).G7Core?.t?.(key, params) ?? key;\n\nexport interface SearchSuggestion {\n id: string | number;\n text: string;\n}\n\nexport interface SearchBarProps {\n name?: string;\n placeholder?: string;\n value?: string;\n onChange?: (e: React.ChangeEvent) => void;\n onSubmit?: (e: React.FormEvent) => void;\n showButton?: boolean; // true: 검색 버튼 표시, false: 버튼 숨김 (기본값: false)\n suggestions?: SearchSuggestion[];\n onSuggestionClick?: (suggestion: SearchSuggestion) => void;\n showSuggestions?: boolean;\n className?: string;\n style?: React.CSSProperties;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n/**\n * 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread)\n */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * SearchBar 집합 컴포넌트\n *\n * 검색 입력 필드와 선택적 버튼을 제공하는 검색 바 컴포넌트입니다.\n * Enter 키를 누르면 항상 검색이 실행됩니다.\n *\n * 기본 컴포넌트 조합: Form + Input + Button + Icon + Div + Span\n *\n * @example\n * // 레이아웃 JSON 사용 예시 (버튼 없음)\n * {\n * \"name\": \"SearchBar\",\n * \"props\": {\n * \"placeholder\": \"검색어를 입력하세요\",\n * \"value\": \"{{query.search}}\",\n * \"showButton\": false\n * }\n * }\n *\n * @example\n * // 레이아웃 JSON 사용 예시 (버튼 있음)\n * {\n * \"name\": \"SearchBar\",\n * \"props\": {\n * \"placeholder\": \"검색어를 입력하세요\",\n * \"value\": \"{{query.search}}\",\n * \"showButton\": true\n * }\n * }\n */\nexport const SearchBar: React.FC = ({\n name = 'search',\n placeholder,\n value: controlledValue,\n onChange,\n onSubmit,\n showButton = false,\n suggestions = [],\n onSuggestionClick,\n showSuggestions = false,\n className = '',\n style,\n id,\n editorAttrs,\n}) => {\n // props로 전달된 값이 없으면 다국어 키 사용\n const resolvedPlaceholder = placeholder ?? t('common.search_placeholder');\n\n const [internalValue, setInternalValue] = useState('');\n const [isFocused, setIsFocused] = useState(false);\n const containerRef = React.useRef(null);\n const previousValueRef = React.useRef('');\n\n const value = controlledValue !== undefined ? controlledValue : internalValue;\n const shouldShowSuggestions = showSuggestions && isFocused && suggestions.length > 0 && value.length > 0;\n\n // controlledValue가 변경될 때 previousValueRef 동기화\n useEffect(() => {\n if (controlledValue !== undefined) {\n previousValueRef.current = controlledValue;\n }\n }, [controlledValue]);\n\n const handleChange = (e: React.ChangeEvent) => {\n const newValue = e.target.value;\n setInternalValue(newValue);\n onChange?.(e);\n\n // X 버튼으로 검색어를 지운 경우 감지\n // 이전 값이 있었는데 새 값이 빈 문자열이고, nativeEvent가 없는 경우 = X 버튼 클릭\n if (previousValueRef.current !== '' && newValue === '' && !(e.nativeEvent as any).inputType) {\n // X 버튼 클릭: 자동으로 검색 초기화\n setTimeout(() => {\n const formElement = containerRef.current?.querySelector('form');\n if (formElement) {\n formElement.requestSubmit();\n }\n }, 0);\n }\n\n previousValueRef.current = newValue;\n };\n\n const handleSuggestionClick = (suggestion: SearchSuggestion) => {\n setInternalValue(suggestion.text);\n const syntheticEvent = {\n target: { value: suggestion.text, name },\n } as React.ChangeEvent;\n onChange?.(syntheticEvent);\n onSuggestionClick?.(suggestion);\n setIsFocused(false);\n };\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n onSubmit?.(e);\n };\n\n return (\n
\n
\n
\n {/* Input wrapper */}\n
\n {/* 검색 아이콘 */}\n
\n \n
\n\n {/* 검색 입력 */}\n setIsFocused(true)}\n onBlur={() => setTimeout(() => setIsFocused(false), 200)}\n placeholder={resolvedPlaceholder}\n className=\"w-full pl-10 pr-4 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white text-sm\"\n />\n
\n\n {/* 검색 버튼 (showButton=true일 때만 표시) */}\n {showButton && (\n \n {t('common.search')}\n \n )}\n
\n
\n\n {/* 자동완성 제안 목록 */}\n {shouldShowSuggestions && (\n
\n {suggestions.map((suggestion) => (\n handleSuggestionClick(suggestion)}\n >\n
\n \n {suggestion.text}\n
\n
\n ))}\n
\n )}\n
\n );\n};\n","/**\n * AvatarUploader 컴포넌트\n *\n * 프로필 아바타 이미지 업로드를 위한 컴포넌트입니다.\n * - 원형 아바타 UI\n * - 파일 선택 시 즉시 업로드\n * - 업로드/삭제 API 지원\n * - 업로드 오류 표시\n * - 삭제 확인 다이얼로그\n *\n * @module composite/AvatarUploader\n */\n\nimport { useRef, useState, useCallback, useEffect } from 'react';\n\nimport { Div } from '../basic/Div';\nimport { Span } from '../basic/Span';\nimport { Button } from '../basic/Button';\nimport { Icon } from '../basic/Icon';\nimport { Label } from '../basic/Label';\nimport { Input } from '../basic/Input';\nimport { Img } from '../basic/Img';\nimport { Avatar } from './Avatar';\nimport type { EditorAttrs } from '../../types';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst G7Core = (window as any).G7Core;\n\nexport interface AvatarUploaderProps {\n /** 현재 아바타 URL */\n src?: string;\n /** 이미지 없을 때 표시할 텍스트 (이니셜) */\n fallbackText?: string;\n /** 아바타 크기 */\n size?: 'sm' | 'md' | 'lg' | 'xl' | '2xl';\n /** 업로드 API 엔드포인트 (기본: /api/me/avatar) */\n uploadEndpoint?: string;\n /** 삭제 API 엔드포인트 (기본: /api/me/avatar) */\n deleteEndpoint?: string;\n /** 업로드 성공 콜백 */\n onUploadSuccess?: (data: { avatar: string; attachment_id: number }) => void;\n /** 업로드 에러 콜백 */\n onUploadError?: (error: Error) => void;\n /** 삭제 성공 콜백 */\n onDeleteSuccess?: () => void;\n /** 삭제 에러 콜백 */\n onDeleteError?: (error: Error) => void;\n /** 삭제 버튼 표시 여부 */\n showDeleteButton?: boolean;\n /** 허용 파일 타입 (기본: image/*) */\n accept?: string;\n /** 최대 파일 크기 (MB, 기본: 5) */\n maxSize?: number;\n /** 추가 CSS 클래스 */\n className?: string;\n /** 업로드 버튼 텍스트 */\n uploadButtonText?: string;\n /** 삭제 버튼 텍스트 */\n deleteButtonText?: string;\n /** 읽기 전용 모드 */\n readOnly?: boolean;\n /** 삭제 확인 다이얼로그 표시 여부 (기본: true) */\n confirmDelete?: boolean;\n /** 삭제 확인 메시지 */\n deleteConfirmMessage?: string;\n /** 업로드 확인 다이얼로그 표시 여부 (기본: true) */\n confirmUpload?: boolean;\n /** 업로드 확인 메시지 */\n uploadConfirmMessage?: string;\n /** 업로드 성공 시 실행할 액션 배열 (G7Core.dispatch) */\n uploadSuccessActions?: Array>;\n /** 업로드 실패 시 실행할 액션 배열 */\n uploadErrorActions?: Array>;\n /** 삭제 성공 시 실행할 액션 배열 */\n deleteSuccessActions?: Array>;\n /** 삭제 실패 시 실행할 액션 배열 */\n deleteErrorActions?: Array>;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\n// AvatarUploader size를 Avatar size로 매핑\n// AvatarUploader는 프로필 편집용으로 더 큰 사이즈 사용\nconst avatarSizeMap: Record = {\n sm: 'md', // AvatarUploader sm → Avatar md (w-10, 40px)\n md: 'lg', // AvatarUploader md → Avatar lg (w-12, 48px)\n lg: 'xl', // AvatarUploader lg → Avatar xl (w-16, 64px)\n xl: '2xl', // AvatarUploader xl → Avatar 2xl (w-24, 96px)\n '2xl': '3xl', // AvatarUploader 2xl → Avatar 3xl (w-32, 128px)\n};\n\nexport function AvatarUploader({\n src,\n fallbackText = 'U',\n size = 'lg',\n uploadEndpoint = '/api/me/avatar',\n deleteEndpoint = '/api/me/avatar',\n onUploadSuccess,\n onUploadError,\n onDeleteSuccess,\n onDeleteError,\n showDeleteButton = true,\n accept = 'image/*',\n maxSize = 5,\n className = '',\n uploadButtonText,\n deleteButtonText,\n readOnly = false,\n confirmDelete = true,\n deleteConfirmMessage,\n confirmUpload = true,\n uploadConfirmMessage,\n uploadSuccessActions,\n uploadErrorActions,\n deleteSuccessActions,\n deleteErrorActions,\n id,\n editorAttrs,\n}: AvatarUploaderProps) {\n const inputRef = useRef(null);\n const [isUploading, setIsUploading] = useState(false);\n const [isDeleting, setIsDeleting] = useState(false);\n // undefined: 초기 상태(props 사용), null: 삭제됨, string: 새 이미지 URL\n const [localAvatarUrl, setLocalAvatarUrl] = useState(undefined);\n const [errorMessage, setErrorMessage] = useState(null);\n const [showDeleteConfirm, setShowDeleteConfirm] = useState(false);\n const [showUploadConfirm, setShowUploadConfirm] = useState(false);\n const [pendingFile, setPendingFile] = useState(null);\n const [previewUrl, setPreviewUrl] = useState(null);\n const inputId = useRef(`avatar-upload-${Math.random().toString(36).slice(2, 11)}`).current;\n\n // 파일 선택 시 미리보기 URL 생성\n useEffect(() => {\n if (pendingFile) {\n const url = URL.createObjectURL(pendingFile);\n setPreviewUrl(url);\n return () => URL.revokeObjectURL(url);\n } else {\n setPreviewUrl(null);\n }\n }, [pendingFile]);\n\n // 다국어 텍스트 가져오기\n const t = useCallback((key: string): string => {\n return G7Core?.t?.(key) ?? key;\n }, []);\n\n // CSRF 토큰 가져오기\n const getCsrfToken = useCallback((): string | null => {\n const match = document.cookie.match(/XSRF-TOKEN=([^;]+)/);\n if (match) {\n return decodeURIComponent(match[1]);\n }\n return null;\n }, []);\n\n // 인증 토큰 가져오기 (ApiClient에서 토큰 조회)\n const getAuthToken = useCallback((): string | null => {\n return G7Core?.api?.getToken?.() ?? null;\n }, []);\n\n // 실제 업로드 실행 함수\n const executeUpload = useCallback(async (file: File) => {\n setShowUploadConfirm(false);\n setPendingFile(null);\n setIsUploading(true);\n setErrorMessage(null);\n\n try {\n // FormData 생성\n const formData = new FormData();\n formData.append('avatar', file);\n\n // API 호출\n const csrfToken = getCsrfToken();\n const authToken = getAuthToken();\n const response = await fetch(uploadEndpoint, {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n ...(csrfToken && { 'X-XSRF-TOKEN': csrfToken }),\n ...(authToken && { Authorization: `Bearer ${authToken}` }),\n },\n credentials: 'include',\n body: formData,\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || t('attachment.upload_failed'));\n }\n\n const data = await response.json();\n const result = data.data || data;\n\n // 로컬 상태 즉시 업데이트 (빠른 피드백)\n if (result.avatar) {\n setLocalAvatarUrl(result.avatar);\n }\n\n onUploadSuccess?.(result);\n G7Core?.toast?.success?.(t('mypage.profile.avatar_uploaded'));\n\n // 액션 props가 있으면 dispatch, 없으면 기본 동작(user 리패치)\n if (uploadSuccessActions?.length) {\n uploadSuccessActions.forEach(action => G7Core?.dispatch?.(action));\n } else {\n G7Core?.refetchDataSource?.('user');\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n setErrorMessage(err.message);\n onUploadError?.(err);\n G7Core?.toast?.error?.(err.message);\n\n if (uploadErrorActions?.length) {\n uploadErrorActions.forEach(action => G7Core?.dispatch?.(action));\n }\n } finally {\n setIsUploading(false);\n // 입력 초기화 (같은 파일 재선택 가능)\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n }\n }, [uploadEndpoint, onUploadSuccess, onUploadError, getCsrfToken, getAuthToken, t]);\n\n // 파일 선택 핸들러\n const handleFileChange = useCallback(\n async (event: React.ChangeEvent) => {\n const file = event.target.files?.[0];\n if (!file) return;\n\n // 오류 상태 초기화\n setErrorMessage(null);\n\n // 파일 크기 검증\n const maxBytes = maxSize * 1024 * 1024;\n if (file.size > maxBytes) {\n const error = new Error(t('attachment.file_too_large').replace(':max', `${maxSize}MB`));\n setErrorMessage(error.message);\n onUploadError?.(error);\n G7Core?.toast?.error?.(error.message);\n return;\n }\n\n // 파일 타입 검증\n if (accept && !file.type.match(accept.replace('*', '.*'))) {\n const error = new Error(t('attachment.invalid_file_type'));\n setErrorMessage(error.message);\n onUploadError?.(error);\n G7Core?.toast?.error?.(error.message);\n return;\n }\n\n // 확인 다이얼로그 표시 또는 즉시 업로드\n if (confirmUpload) {\n setPendingFile(file);\n setShowUploadConfirm(true);\n } else {\n executeUpload(file);\n }\n },\n [maxSize, accept, onUploadError, confirmUpload, executeUpload, t]\n );\n\n // 삭제 실행 함수\n const executeDelete = useCallback(async () => {\n setShowDeleteConfirm(false);\n setIsDeleting(true);\n setErrorMessage(null);\n\n try {\n const csrfToken = getCsrfToken();\n const authToken = getAuthToken();\n const response = await fetch(deleteEndpoint, {\n method: 'DELETE',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n ...(csrfToken && { 'X-XSRF-TOKEN': csrfToken }),\n ...(authToken && { Authorization: `Bearer ${authToken}` }),\n },\n credentials: 'include',\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(errorData.message || t('attachment.delete_failed'));\n }\n\n // 로컬 상태 즉시 업데이트 (빠른 피드백)\n setLocalAvatarUrl(null);\n\n onDeleteSuccess?.();\n G7Core?.toast?.success?.(t('mypage.profile.avatar_deleted'));\n\n // 액션 props가 있으면 dispatch, 없으면 기본 동작(user 리패치)\n if (deleteSuccessActions?.length) {\n deleteSuccessActions.forEach(action => G7Core?.dispatch?.(action));\n } else {\n G7Core?.refetchDataSource?.('user');\n }\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n setErrorMessage(err.message);\n onDeleteError?.(err);\n G7Core?.toast?.error?.(err.message);\n\n if (deleteErrorActions?.length) {\n deleteErrorActions.forEach(action => G7Core?.dispatch?.(action));\n }\n } finally {\n setIsDeleting(false);\n }\n }, [deleteEndpoint, onDeleteSuccess, onDeleteError, getCsrfToken, getAuthToken, t]);\n\n // 삭제 버튼 클릭 핸들러 (확인 다이얼로그 표시 또는 즉시 삭제)\n const handleDeleteClick = useCallback(() => {\n if (confirmDelete) {\n setShowDeleteConfirm(true);\n } else {\n executeDelete();\n }\n }, [confirmDelete, executeDelete]);\n\n // 삭제 취소\n const handleDeleteCancel = useCallback(() => {\n setShowDeleteConfirm(false);\n }, []);\n\n // 업로드 취소\n const handleUploadCancel = useCallback(() => {\n setShowUploadConfirm(false);\n setPendingFile(null);\n // 입력 초기화 (같은 파일 재선택 가능)\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n }, []);\n\n // 업로드 확인\n const handleUploadConfirm = useCallback(() => {\n if (pendingFile) {\n executeUpload(pendingFile);\n }\n }, [pendingFile, executeUpload]);\n\n // 로컬 상태 우선 사용: undefined면 props 사용, null이면 삭제됨, string이면 새 이미지\n const currentAvatarUrl = localAvatarUrl === undefined ? src : localAvatarUrl;\n const hasAvatar = !!currentAvatarUrl;\n\n // Avatar 컴포넌트에 전달할 사이즈\n const avatarSize = avatarSizeMap[size] || 'lg';\n\n // 현재 표시 모드 결정\n const isConfirmMode = showDeleteConfirm || showUploadConfirm;\n\n // 버튼 영역 렌더링\n const renderButtons = () => (\n
\n {/* 숨겨진 파일 입력 */}\n \n\n {/* 이미지 없을 때: 이미지 등록 버튼 */}\n {!hasAvatar && (\n \n {isUploading ? (\n \n ) : (\n \n )}\n {uploadButtonText || t('mypage.profile.register_avatar')}\n \n )}\n\n {/* 이미지 있을 때: 변경 + 삭제 버튼 */}\n {hasAvatar && (\n <>\n \n {isUploading ? (\n \n ) : (\n \n )}\n {uploadButtonText || t('common.change')}\n \n\n {showDeleteButton && (\n \n {isDeleting ? (\n \n ) : (\n \n )}\n {deleteButtonText || t('common.delete')}\n \n )}\n \n )}\n
\n );\n\n return (\n
\n {/* 아바타 이미지 - 업로드 확인 시 미리보기 표시 */}\n {showUploadConfirm && previewUrl ? (\n
\n \n
\n
\n ) : (\n \n )}\n\n {/* 버튼/확인 영역 */}\n {!readOnly && (\n
\n {/* 업로드 확인 박스 */}\n {showUploadConfirm && pendingFile && (\n
\n
\n \n \n {uploadConfirmMessage || t('mypage.profile.upload_avatar_confirm')}\n \n
\n
\n {pendingFile.name} ({(pendingFile.size / 1024 / 1024).toFixed(2)}MB)\n
\n
\n \n {isUploading ? (\n \n ) : (\n \n )}\n {t('common.confirm')}\n \n \n {t('common.cancel')}\n \n
\n
\n )}\n\n {/* 삭제 확인 박스 */}\n {showDeleteConfirm && (\n
\n
\n \n \n {deleteConfirmMessage || t('mypage.profile.delete_avatar_confirm')}\n \n
\n
\n \n {isDeleting ? (\n \n ) : (\n \n )}\n {t('common.delete')}\n \n \n {t('common.cancel')}\n \n
\n
\n )}\n\n {/* 기본 모드 - 버튼들 */}\n {!isConfirmMode && renderButtons()}\n
\n )}\n\n {/* 오류 메시지 표시 */}\n {errorMessage && !isConfirmMode && (\n
\n \n {errorMessage}\n
\n )}\n
\n );\n}\n\nexport default AvatarUploader;\n","/**\n * UserInfo 컴포넌트\n *\n * 게시글 작성자 정보를 표시하고 드롭다운 메뉴를 제공하는 통합 컴포넌트입니다.\n * - 작성자 이름, 서브텍스트 표시\n * - 클릭 시 드롭다운 메뉴 (회원인 경우)\n * - 비회원인 경우 배지 표시\n * - 탈퇴한 사용자인 경우 \"탈퇴한 사용자\" 텍스트 표시\n *\n * ## Props 우선순위\n * 명시적으로 전달한 props가 author에서 추출한 값보다 우선합니다.\n * - 이름: text > name > author.name\n * - 사용자 ID: userId > author.id\n * - 비회원 여부: isGuest > author.is_guest\n * - 탈퇴 여부: isWithdrawn || author.status === 'withdrawn'\n *\n * @example\n * // 레이아웃 JSON에서 사용 (author 객체 전달 - 권장)\n * {\n * \"type\": \"composite\",\n * \"name\": \"UserInfo\",\n * \"props\": {\n * \"author\": \"{{post.author}}\",\n * \"subText\": \"{{post.created_at | datetime}}\"\n * }\n * }\n *\n * @example\n * // author와 개별 props 혼합 사용 (개별 props가 우선)\n * {\n * \"type\": \"composite\",\n * \"name\": \"UserInfo\",\n * \"props\": {\n * \"author\": \"{{post.author}}\",\n * \"name\": \"관리자\",\n * \"subText\": \"{{post.created_at | datetime}}\"\n * }\n * }\n * // author.name이 \"홍길동\"이어도 \"관리자\"가 표시됨\n */\n\nimport React, { useState, useRef, useEffect, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Div } from '../basic/Div';\nimport { Button } from '../basic/Button';\nimport { Span } from '../basic/Span';\nimport { Icon } from '../basic/Icon';\nimport type { EditorAttrs } from '../../types';\n\n// G7Core 참조\nconst getG7Core = () => (window as any).G7Core;\n\n// G7Core.t() 번역 함수 참조\nconst t = (key: string, params?: Record) =>\n (window as any).G7Core?.t?.(key, params) ?? key;\n\n/**\n * 메뉴 항목 설정 인터페이스\n */\nexport interface MenuItemConfig {\n /** 메뉴 항목 식별자 */\n key: string;\n /** 표시 텍스트 */\n label: string;\n /** 아이콘 이름 (선택) */\n icon?: string;\n /** 이동 경로 ({{userId}} 치환 지원) */\n path?: string;\n /** 커스텀 클릭 핸들러 (선택) */\n onClick?: () => void;\n /** 표시 여부 (기본: true) */\n show?: boolean;\n}\n\n/**\n * Author 객체 인터페이스\n */\nexport interface AuthorInfo {\n /** 사용자 ID */\n id?: string | number;\n /** 사용자 UUID */\n uuid?: string;\n /** 사용자 이름 */\n name?: string;\n /** 아바타 URL */\n avatar?: string;\n /** 사용자 상태 */\n status?: 'active' | 'inactive' | 'blocked' | 'withdrawn';\n /** 비회원 여부 */\n is_guest?: boolean;\n}\n\nexport interface UserInfoProps {\n /**\n * 작성자 객체 (권장)\n * API 응답의 author 객체를 그대로 전달하면 됩니다.\n * 개별 props(name, userId 등)가 함께 전달되면 개별 props가 우선합니다.\n */\n author?: AuthorInfo;\n\n /**\n * 사용자 이름 (author.name보다 우선)\n */\n name?: string;\n\n /**\n * 사용자 ID (author.id보다 우선)\n */\n userId?: string | number;\n\n /**\n * 표시할 서브 텍스트 (날짜, 시간 등)\n */\n subText?: string;\n\n /**\n * 서브 텍스트의 title 속성 (tooltip용 원본 datetime)\n */\n subTextTitle?: string;\n\n /**\n * 비회원 여부 (author.is_guest보다 우선)\n * @default false\n */\n isGuest?: boolean;\n\n /**\n * 탈퇴한 사용자 여부 (author.status === 'withdrawn'과 OR 조건)\n * @default false\n */\n isWithdrawn?: boolean;\n\n /**\n * 드롭다운 표시 여부\n * @default true\n */\n showDropdown?: boolean;\n\n /**\n * 프로필 클릭 가능 여부 (드롭다운이 없을 때)\n * @default true\n */\n clickable?: boolean;\n\n /**\n * 사용자 프로필 경로 패턴\n * @default '/users/{userId}'\n */\n profilePath?: string;\n\n /**\n * 추가 className\n */\n className?: string;\n\n /**\n * 레이아웃 방향\n * @default 'vertical'\n */\n layout?: 'vertical' | 'horizontal';\n\n /**\n * 레이아웃 JSON에서 text 속성으로 전달되는 이름\n * name보다 우선순위가 높음\n */\n text?: string;\n\n /**\n * 이벤트 버블링 방지 여부\n * @default false\n */\n stopPropagation?: boolean;\n\n // 메뉴 커스터마이징\n /** 커스텀 메뉴 항목 (지정 시 기본 메뉴 대체) */\n menuItems?: MenuItemConfig[];\n /** 숨길 기본 메뉴 항목 키 배열 */\n hideMenuItems?: string[];\n /** 기본 메뉴에 추가할 항목 */\n appendMenuItems?: MenuItemConfig[];\n\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n/**\n * 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread)\n */\n editorAttrs?: EditorAttrs;\n}\n\n// 레이아웃별 컨테이너 클래스\nconst LAYOUT_CLASSES = {\n horizontal: 'flex items-center gap-1.5',\n vertical: 'flex flex-col items-start',\n} as const;\n\n// 기본 메뉴 항목 생성\nconst createDefaultMenuItems = (): MenuItemConfig[] => [\n {\n key: 'view_profile',\n label: t('userinfo.view_profile'),\n icon: 'user',\n path: '/users/{{userId}}',\n },\n {\n key: 'view_posts',\n label: t('userinfo.view_posts'),\n icon: 'file-lines',\n path: '/users/{{userId}}/posts',\n },\n];\n\n/**\n * 서브텍스트 렌더링 컴포넌트\n */\nconst SubText: React.FC<{ text?: string; title?: string }> = ({ text, title }) => {\n if (!text) return null;\n return (\n \n {text}\n \n );\n};\n\n/**\n * UserInfo 컴포넌트\n */\nexport const UserInfo: React.FC = ({\n author,\n name,\n userId,\n subText,\n subTextTitle,\n isGuest = false,\n isWithdrawn = false,\n showDropdown = true,\n clickable = true,\n profilePath = '/users/{userId}',\n className = '',\n layout = 'vertical',\n text,\n stopPropagation = false,\n menuItems,\n hideMenuItems = [],\n appendMenuItems = [],\n id,\n editorAttrs,\n}) => {\n // 명시적 props > author 추출값 순서로 결정\n const actualUserId = userId ?? author?.uuid;\n const actualIsGuest = isGuest || author?.is_guest || false;\n const actualIsWithdrawn = isWithdrawn || author?.status === 'withdrawn';\n\n // 이름 우선순위: text > name > author.name\n // 탈퇴한 사용자는 \"탈퇴한 사용자\" 텍스트 표시\n const actualName = actualIsWithdrawn\n ? t('userinfo.withdrawn_user')\n : (text ?? name ?? author?.name ?? '');\n\n // 드롭다운 상태\n const [showMenu, setShowMenu] = useState(false);\n const [menuPosition, setMenuPosition] = useState({ top: 0, left: 0 });\n const containerRef = useRef(null);\n const dropdownRef = useRef(null);\n const buttonRef = useRef(null);\n\n // 프로필 경로 생성\n const actualProfilePath = profilePath.replace('{userId}', String(actualUserId ?? ''));\n\n // 컨테이너 클래스\n const containerClass = `${LAYOUT_CLASSES[layout]} ${className}`;\n\n // 메뉴 외부 클릭 시 닫기 + 스크롤/리사이즈 시 닫기\n useEffect(() => {\n if (!showMenu) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node;\n const isInsideContainer = containerRef.current?.contains(target);\n const isInsideDropdown = dropdownRef.current?.contains(target);\n\n if (!isInsideContainer && !isInsideDropdown) {\n setShowMenu(false);\n }\n };\n\n const handleScrollOrResize = () => setShowMenu(false);\n\n document.addEventListener('mousedown', handleClickOutside);\n window.addEventListener('scroll', handleScrollOrResize, true);\n window.addEventListener('resize', handleScrollOrResize);\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n window.removeEventListener('scroll', handleScrollOrResize, true);\n window.removeEventListener('resize', handleScrollOrResize);\n };\n }, [showMenu]);\n\n // 최종 메뉴 항목 계산\n const getMenuItems = useCallback((): MenuItemConfig[] => {\n // 커스텀 메뉴가 지정된 경우 그대로 사용\n if (menuItems && menuItems.length > 0) {\n return menuItems.filter((item) => item.show !== false);\n }\n\n // 기본 메뉴에서 숨길 항목 제거\n const defaultItems = createDefaultMenuItems();\n let items = defaultItems.filter(\n (item) => !hideMenuItems.includes(item.key) && item.show !== false\n );\n\n // 추가 항목 병합\n if (appendMenuItems && appendMenuItems.length > 0) {\n items = [...items, ...appendMenuItems.filter((item) => item.show !== false)];\n }\n\n return items;\n }, [menuItems, hideMenuItems, appendMenuItems]);\n\n // 드롭다운 위치 계산 (뷰포트 기준 fixed 위치 — Portal 사용)\n const updateMenuPosition = useCallback(() => {\n if (buttonRef.current) {\n const buttonRect = buttonRef.current.getBoundingClientRect();\n setMenuPosition({\n top: buttonRect.bottom + 4,\n left: buttonRect.left,\n });\n }\n }, []);\n\n // 메뉴 항목 클릭 핸들러\n const handleMenuItemClick = useCallback((item: MenuItemConfig, e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n setShowMenu(false);\n\n if (item.onClick) {\n item.onClick();\n } else if (item.path) {\n const path = item.path.replace(/\\{\\{userId\\}\\}/g, String(actualUserId ?? ''));\n const g7Core = getG7Core();\n if (g7Core?.navigate) {\n g7Core.navigate(path);\n } else {\n window.location.href = path;\n }\n }\n }, [actualUserId]);\n\n // 클릭 핸들러 (드롭다운 또는 프로필 이동)\n const handleClick = useCallback((e: React.MouseEvent) => {\n e.preventDefault();\n\n if (stopPropagation) {\n e.stopPropagation();\n }\n\n // 비회원이거나 userId가 없으면 아무 동작 안 함\n if (actualIsGuest || !actualUserId) {\n return;\n }\n\n // 드롭다운이 활성화된 경우\n if (showDropdown) {\n if (!showMenu) {\n updateMenuPosition();\n }\n setShowMenu((prev) => !prev);\n }\n // 드롭다운이 비활성화되고 클릭 가능한 경우\n else if (clickable) {\n getG7Core()?.navigate?.(actualProfilePath);\n }\n }, [stopPropagation, actualIsGuest, actualUserId, showDropdown, showMenu, updateMenuPosition, clickable, actualProfilePath]);\n\n // 비회원인 경우\n if (actualIsGuest || !actualUserId) {\n return (\n
\n
\n {actualName}\n \n {t('userinfo.guest_badge')}\n \n
\n \n
\n );\n }\n\n // 탈퇴한 사용자인 경우\n if (actualIsWithdrawn) {\n return (\n
\n \n {actualName}\n \n \n
\n );\n }\n\n // 회원인 경우\n const finalMenuItems = getMenuItems();\n // className에 text- 색상 클래스가 있으면 nameButtonClass의 기본 색상을 대체\n const hasCustomColor = /\\btext-\\S+/.test(className);\n const defaultColorClass = hasCustomColor ? '' : 'text-gray-900 dark:text-white';\n const nameButtonClass = (showDropdown || clickable)\n ? `${defaultColorClass} hover:text-blue-600 dark:hover:text-blue-400 cursor-pointer font-medium`.trim()\n : `${defaultColorClass} font-medium`.trim();\n\n return (\n
\n
\n \n {actualName}\n \n \n
\n\n {/* 드롭다운 메뉴 - Portal로 document.body에 fixed 배치 (overflow-hidden 부모 회피) */}\n {showDropdown && showMenu && finalMenuItems.length > 0 && createPortal(\n \n {finalMenuItems.map((item) => (\n handleMenuItemClick(item, e)}\n className=\"flex items-center justify-start gap-2 w-full text-left px-3 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 cursor-pointer\"\n data-testid={`menu-item-${item.key}`}\n >\n {item.icon && }\n {item.label}\n \n ))}\n
,\n document.body\n )}\n
\n );\n};\n","import React from 'react';\nimport { Nav } from '../basic/Nav';\nimport { Button } from '../basic/Button';\nimport { Icon } from '../basic/Icon';\nimport { IconName } from '../basic/IconTypes';\nimport { Div } from '../basic/Div';\nimport { Span } from '../basic/Span';\nimport { Select } from '../basic/Select';\nimport type { EditorAttrs } from '../../types';\n\nexport interface Tab {\n id: string | number;\n label: string;\n iconName?: IconName;\n disabled?: boolean;\n badge?: string | number;\n}\n\nexport interface TabNavigationProps {\n tabs: Tab[];\n activeTabId?: string | number;\n onTabChange?: (tabId: string | number) => void;\n variant?: 'default' | 'pills' | 'underline';\n className?: string;\n style?: React.CSSProperties;\n /** 숨길 탭 ID 목록 (동적 조건부 탭 노출용) */\n hiddenTabIds?: (string | number)[];\n /** 모바일 전환 임계값 (px). 기본값 768 — G7 ResponsiveContext mobile 프리셋과 동일 */\n mobileBreakpoint?: number;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n/**\n * 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread)\n */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * TabNavigation 집합 컴포넌트\n *\n * 탭 네비게이션을 제공하는 컴포넌트입니다.\n * 여러 탭을 전환할 수 있으며, 아이콘과 뱃지를 지원합니다.\n *\n * 반응형: G7Core.useResponsive() hook으로 화면 너비를 구독하여\n * mobileBreakpoint(기본 768px) 미만일 때 Select 드롭다운으로 자동 전환됩니다.\n * Tailwind hidden md:flex 분기를 사용하지 않으므로 위지윅 편집기의 디바이스 미리보기와도 호환됩니다.\n *\n * **주의**: 이 컴포넌트는 순수 네비게이션 UI만 제공하며,\n * 실제 탭 컨텐츠는 부모 컴포넌트에서 activeTabId를 기반으로 조건부 렌더링해야 합니다.\n *\n * 기본 컴포넌트 조합: Nav + Button + Icon + Div + Span + Select\n *\n * @example\n * // 레이아웃 JSON 사용 예시\n * {\n * \"name\": \"TabNavigation\",\n * \"props\": {\n * \"activeTabId\": 1,\n * \"tabs\": [\n * {\"id\": 1, \"label\": \"프로필\", \"iconName\": \"user\"},\n * {\"id\": 2, \"label\": \"설정\", \"iconName\": \"cog\", \"badge\": 3},\n * {\"id\": 3, \"label\": \"문의내역\", \"iconName\": \"comment\"}\n * ],\n * \"hiddenTabIds\": \"{{_global.modules?.['sirsoft-ecommerce']?.inquiry?.board_slug ? [] : ['inquiries']}}\"\n * }\n * }\n */\nexport const TabNavigation: React.FC = ({\n tabs,\n activeTabId,\n onTabChange,\n variant = 'underline',\n className = '',\n style,\n hiddenTabIds = [],\n mobileBreakpoint = 768,\n id,\n editorAttrs,\n}) => {\n // G7Core.useResponsive를 통해 반응형 상태 구독 (G7 표준)\n const G7Core = (window as any).G7Core;\n const useResponsive = G7Core?.useResponsive;\n const responsiveValue = useResponsive?.();\n const isMobile = responsiveValue\n ? responsiveValue.width < mobileBreakpoint\n : typeof window !== 'undefined' && window.innerWidth < mobileBreakpoint;\n\n const handleTabClick = (tab: Tab) => {\n if (!tab.disabled && tab.id !== activeTabId) {\n onTabChange?.(tab.id);\n }\n };\n\n const handleSelectChange = (\n e: React.ChangeEvent | { target: { value: string | number } }\n ) => {\n const selectedId = e.target.value;\n const numericId = Number(selectedId);\n const finalId =\n typeof selectedId === 'string' && selectedId !== '' && !Number.isNaN(numericId)\n ? numericId\n : selectedId;\n const selectedTab = tabs.find((tab) => String(tab.id) === String(finalId));\n if (selectedTab) {\n handleTabClick(selectedTab);\n }\n };\n\n const visibleTabs = hiddenTabIds.length > 0\n ? tabs.filter((tab) => !hiddenTabIds.includes(tab.id))\n : tabs;\n\n // 모바일: Select 드롭다운 단일 렌더\n // 데스크톱 분기와 동일하게 id/editorAttrs 를 루트에 spread 해야 레이아웃 편집기가\n // 모바일 디바이스 미리보기에서도 이 노드를 선택/측정할 수 있다(모든 렌더 분기 패리티 —\n // 누락 시 모바일 프리뷰에서 data-editor-* 가 사라져 캔버스에서 선택 불가).\n if (isMobile) {\n return (\n
\n ({\n value: String(tab.id),\n label: tab.badge !== undefined ? `${tab.label} (${tab.badge})` : tab.label,\n disabled: tab.disabled,\n }))}\n className=\"w-full\"\n />\n
\n );\n }\n\n const getTabClasses = (tab: Tab) => {\n const isActive = tab.id === activeTabId;\n const baseClasses =\n 'flex items-center gap-2 px-3 py-2 font-medium text-sm transition-all shrink-0 whitespace-nowrap';\n\n if (tab.disabled) {\n return `${baseClasses} opacity-50 cursor-not-allowed text-gray-400 dark:text-gray-600`;\n }\n\n switch (variant) {\n case 'pills':\n return isActive\n ? `${baseClasses} bg-blue-600 dark:bg-blue-500 text-white rounded-lg`\n : `${baseClasses} text-gray-600 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg`;\n\n case 'underline':\n return isActive\n ? `${baseClasses} text-gray-900 dark:text-white border-b-2 border-gray-900 dark:border-white`\n : `${baseClasses} text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-200 border-b-2 border-transparent hover:border-gray-300 dark:hover:border-gray-600`;\n\n case 'default':\n default:\n return isActive\n ? `${baseClasses} text-blue-600 dark:text-blue-400 bg-blue-50 dark:bg-blue-900/20 border-b-2 border-blue-600 dark:border-blue-400`\n : `${baseClasses} text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-200 hover:bg-gray-50 dark:hover:bg-gray-700 border-b-2 border-transparent`;\n }\n };\n\n const navClasses =\n variant === 'underline'\n ? 'flex gap-0 border-b border-gray-200 dark:border-gray-700'\n : 'flex gap-2';\n\n // 데스크톱: 탭 버튼 단일 렌더\n return (\n
\n \n
\n );\n};\n","// e2e:allow 편집기 ComponentRegistry 등록맵에 SlotContainer 추가(편집기 IIFE 번들 포함 — 헤더 통화 슬롯 렌더). 편집기 캔버스 렌더는 Chrome MCP 라이브 실측 + Vitest 로 검증. 사용자 사이트 런타임 무변경.\n/**\n * sirsoft-basic 템플릿 Composite 컴포넌트 등록\n *\n * 이 파일에서 모든 Composite 컴포넌트를 export합니다.\n * G7Core에서 자동으로 로드하여 레이아웃 JSON에서 사용할 수 있습니다.\n */\n\n// 레이아웃 컴포넌트\nexport { default as Header } from './Header';\nexport { default as Footer } from './Footer';\nexport { default as MobileNav } from './MobileNav';\nexport { NotificationCenter } from './NotificationCenter';\nexport type { NotificationCenterProps, NotificationItem } from './NotificationCenter';\n\n// 상품 관련 컴포넌트\nexport { default as ProductCard } from './ProductCard';\nexport { default as ImageGallery } from './ImageGallery';\nexport { default as ProductImageViewer } from './ProductImageViewer';\nexport { default as QuantitySelector } from './QuantitySelector';\n\n// 게시판 관련 컴포넌트\nexport { default as PostReactions } from './PostReactions';\nexport { default as RichTextEditor } from './RichTextEditor';\nexport { HtmlContent } from './HtmlContent';\nexport { HtmlEditor } from './HtmlEditor';\n\n// 콘텐츠 유틸리티\nexport { ExpandableContent } from './ExpandableContent';\n\n// 공통 컴포넌트\nexport { default as FileUploader } from './FileUploader';\nexport { ConfirmDialog } from './ConfirmDialog';\nexport { default as SocialLoginButtons } from './SocialLoginButtons';\nexport { default as Toast } from './Toast';\nexport { default as PageTransitionIndicator } from './PageTransitionIndicator';\nexport { default as PageTransitionBlur } from './PageTransitionBlur';\nexport { default as PageSkeleton } from './PageSkeleton';\nexport { default as PageLoading } from './PageLoading';\nexport { default as ThemeToggle } from './ThemeToggle';\nexport { Pagination } from './Pagination';\nexport { SearchBar } from './SearchBar';\nexport { Avatar } from './Avatar';\nexport { AvatarUploader } from './AvatarUploader';\nexport { UserInfo } from './UserInfo';\nexport { Modal } from './Modal';\nexport { TabNavigation } from './TabNavigation';\nexport { SlotContainer } from './SlotContainer';\n// AddressSearch는 별도 컴포넌트가 아닌 sirsoft-daum_postcode 플러그인의 extension_point 방식 사용\n\n/**\n * 컴포넌트 등록 맵\n *\n * G7Core 템플릿 엔진에서 레이아웃 JSON의 컴포넌트 이름을\n * 실제 컴포넌트로 매핑할 때 사용합니다.\n *\n * @example\n * // 레이아웃 JSON에서 사용\n * {\n * \"type\": \"composite\",\n * \"name\": \"Header\",\n * \"props\": { ... }\n * }\n */\nexport const compositeComponents = {\n // 레이아웃\n Header: () => import('./Header'),\n Footer: () => import('./Footer'),\n MobileNav: () => import('./MobileNav'),\n // 슬롯 컨테이너 — 모듈 주입 UI(헤더 통화 셀렉터 등)를 떙겨 렌더. 등록맵 누락 시\n // 편집기 캔버스 IIFE 번들에 포함되지 않아 \"Component not found in bundle\" 로 렌더 실패한다\n // (운영 사이트는 별도 등록 경로라 정상이나 편집기 미리보기에서만 슬롯이 통째로 비는 회귀).\n SlotContainer: () => import('./SlotContainer'),\n NotificationCenter: () => import('./NotificationCenter'),\n\n // 상품\n ProductCard: () => import('./ProductCard'),\n ImageGallery: () => import('./ImageGallery'),\n ProductImageViewer: () => import('./ProductImageViewer'),\n QuantitySelector: () => import('./QuantitySelector'),\n\n // 게시판\n PostReactions: () => import('./PostReactions'),\n RichTextEditor: () => import('./RichTextEditor'),\n HtmlContent: () => import('./HtmlContent'),\n HtmlEditor: () => import('./HtmlEditor'),\n\n // 콘텐츠 유틸리티\n ExpandableContent: () => import('./ExpandableContent'),\n\n // 공통\n FileUploader: () => import('./FileUploader'),\n ConfirmDialog: () => import('./ConfirmDialog'),\n SocialLoginButtons: () => import('./SocialLoginButtons'),\n Toast: () => import('./Toast'),\n PageTransitionIndicator: () => import('./PageTransitionIndicator'),\n PageTransitionBlur: () => import('./PageTransitionBlur'),\n PageSkeleton: () => import('./PageSkeleton'),\n PageLoading: () => import('./PageLoading'),\n ThemeToggle: () => import('./ThemeToggle'),\n Pagination: () => import('./Pagination'),\n SearchBar: () => import('./SearchBar'),\n Avatar: () => import('./Avatar'),\n AvatarUploader: () => import('./AvatarUploader'),\n UserInfo: () => import('./UserInfo'),\n Modal: () => import('./Modal'),\n TabNavigation: () => import('./TabNavigation'),\n // AddressSearch는 sirsoft-daum_postcode 플러그인의 extension_point 방식 사용\n};\n\n/**\n * 컴포넌트 타입 정의 (TypeScript 자동완성용)\n */\nexport type CompositeComponentName = keyof typeof compositeComponents;\n","import React from 'react';\nimport { Div } from '../basic/Div';\nimport type { EditorAttrs } from '../../types';\n\nexport interface ContainerProps {\n /**\n * DOM id 속성\n */\n id?: string;\n\n /**\n * 사용자 정의 클래스\n */\n className?: string;\n\n /**\n * 인라인 스타일\n */\n style?: React.CSSProperties;\n\n /**\n * 자식 요소\n */\n children?: React.ReactNode;\n\n /**\n * 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread)\n */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * Container 컴포넌트\n *\n * 단순한 div 래퍼입니다. id와 className을 지정할 수 있습니다.\n */\nexport const Container: React.FC = ({\n id,\n className,\n style,\n children,\n editorAttrs,\n}) => {\n return (\n
\n {children}\n
\n );\n};\n","import React from 'react';\nimport { Div } from '../basic/Div';\nimport type { EditorAttrs } from '../../types';\n\nexport interface GridProps {\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n\n /**\n * Grid 열 개수\n */\n cols?: number;\n\n /**\n * 반응형 열 개수 (브레이크포인트별)\n */\n responsive?: {\n sm?: number;\n md?: number;\n lg?: number;\n xl?: number;\n '2xl'?: number;\n };\n\n /**\n * Gap 크기 (Tailwind 스케일: 0, 1, 2, 3, 4, 5, 6, 8, 10, 12, 16, 20, 24)\n */\n gap?: number;\n\n /**\n * Row gap (행 간격)\n */\n rowGap?: number;\n\n /**\n * Column gap (열 간격)\n */\n colGap?: number;\n\n /**\n * 자동 행 크기 조정\n */\n autoRows?: 'auto' | 'min' | 'max' | 'fr';\n\n /**\n * 자동 열 크기 조정\n */\n autoCols?: 'auto' | 'min' | 'max' | 'fr';\n\n /**\n * Grid auto-flow 설정\n */\n flow?: 'row' | 'col' | 'dense' | 'row-dense' | 'col-dense';\n\n /**\n * 사용자 정의 클래스\n */\n className?: string;\n\n /**\n * 인라인 스타일\n */\n style?: React.CSSProperties;\n\n /**\n * 자식 요소\n */\n children?: React.ReactNode;\n\n /**\n * 클릭 이벤트 핸들러\n */\n onClick?: () => void;\n\n /**\n * 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread)\n */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * Grid 레이아웃 컴포넌트\n *\n * CSS Grid를 활용한 반응형 그리드 시스템을 제공합니다.\n * gap, span, auto-flow 등의 그리드 속성을 제어할 수 있습니다.\n *\n * @example\n * // 기본 3열 그리드\n * \n *
Item 1
\n *
Item 2
\n *
Item 3
\n *
\n *\n * @example\n * // 반응형 그리드\n * \n *
Item 1
\n *
Item 2
\n * \n */\nexport const Grid: React.FC = ({\n id,\n children,\n cols = 1,\n responsive,\n gap,\n rowGap,\n colGap,\n autoRows,\n autoCols,\n flow = 'row',\n className = '',\n style,\n onClick,\n editorAttrs,\n}) => {\n // Tailwind CSS 클래스 생성\n const classes: string[] = ['grid'];\n\n // Grid 열 개수\n if (cols) {\n classes.push(`grid-cols-${cols}`);\n }\n\n // 반응형 그리드\n if (responsive) {\n if (responsive.sm) classes.push(`sm:grid-cols-${responsive.sm}`);\n if (responsive.md) classes.push(`md:grid-cols-${responsive.md}`);\n if (responsive.lg) classes.push(`lg:grid-cols-${responsive.lg}`);\n if (responsive.xl) classes.push(`xl:grid-cols-${responsive.xl}`);\n if (responsive['2xl']) classes.push(`2xl:grid-cols-${responsive['2xl']}`);\n }\n\n // Gap\n if (gap !== undefined && gap > 0) {\n classes.push(`gap-${gap}`);\n }\n\n // Row gap\n if (rowGap !== undefined && rowGap > 0) {\n classes.push(`gap-y-${rowGap}`);\n }\n\n // Column gap\n if (colGap !== undefined && colGap > 0) {\n classes.push(`gap-x-${colGap}`);\n }\n\n // Auto rows\n if (autoRows) {\n const autoRowsMap: Record = {\n auto: 'auto-rows-auto',\n min: 'auto-rows-min',\n max: 'auto-rows-max',\n fr: 'auto-rows-fr',\n };\n classes.push(autoRowsMap[autoRows]);\n }\n\n // Auto columns\n if (autoCols) {\n const autoColsMap: Record = {\n auto: 'auto-cols-auto',\n min: 'auto-cols-min',\n max: 'auto-cols-max',\n fr: 'auto-cols-fr',\n };\n classes.push(autoColsMap[autoCols]);\n }\n\n // Grid flow\n const flowMap: Record = {\n row: 'grid-flow-row',\n col: 'grid-flow-col',\n dense: 'grid-flow-dense',\n 'row-dense': 'grid-flow-row-dense',\n 'col-dense': 'grid-flow-col-dense',\n };\n classes.push(flowMap[flow]);\n\n // 사용자 정의 클래스 추가\n if (className) {\n classes.push(className);\n }\n\n return (\n
\n {children}\n
\n );\n};\n","import React from 'react';\nimport { Div } from '../basic/Div';\nimport type { EditorAttrs } from '../../types';\n\nexport interface FlexProps {\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n\n /**\n * Flex 방향\n */\n direction?: 'row' | 'row-reverse' | 'col' | 'col-reverse';\n\n /**\n * Justify content (주축 정렬)\n */\n justify?: 'start' | 'end' | 'center' | 'between' | 'around' | 'evenly';\n\n /**\n * Align items (교차축 정렬)\n */\n align?: 'start' | 'end' | 'center' | 'baseline' | 'stretch';\n\n /**\n * Flex wrap 설정\n */\n wrap?: 'wrap' | 'nowrap' | 'wrap-reverse';\n\n /**\n * Gap 크기 (Tailwind 스케일: 0, 1, 2, 3, 4, 5, 6, 8, 10, 12, 16, 20, 24)\n */\n gap?: number;\n\n /**\n * Flex grow (자식 요소 확장)\n */\n grow?: boolean | number;\n\n /**\n * Flex shrink (자식 요소 축소)\n */\n shrink?: boolean | number;\n\n /**\n * 사용자 정의 클래스\n */\n className?: string;\n\n /**\n * 인라인 스타일\n */\n style?: React.CSSProperties;\n\n /**\n * 자식 요소\n */\n children?: React.ReactNode;\n\n /**\n * 클릭 이벤트 핸들러\n */\n onClick?: () => void;\n\n /**\n * 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread)\n */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * Flex 레이아웃 컴포넌트\n *\n * Flexbox를 활용한 유연한 레이아웃을 제공합니다.\n * justify, align, wrap 등의 옵션을 통해 다양한 정렬을 구현할 수 있습니다.\n *\n * @example\n * // 가로 정렬 (가운데 정렬)\n * \n *
Item 1
\n *
Item 2
\n *
\n *\n * @example\n * // 세로 정렬 (양 끝 정렬)\n * \n *
Top
\n *
Bottom
\n *
\n */\nexport const Flex: React.FC = ({\n id,\n children,\n direction = 'row',\n justify = 'start',\n align = 'stretch',\n wrap = 'nowrap',\n gap = 0,\n grow = false,\n shrink = true,\n className = '',\n style,\n onClick,\n editorAttrs,\n}) => {\n // Tailwind CSS 클래스 생성\n const classes: string[] = ['flex'];\n\n // Flex direction\n const directionMap: Record = {\n row: 'flex-row',\n 'row-reverse': 'flex-row-reverse',\n col: 'flex-col',\n 'col-reverse': 'flex-col-reverse',\n };\n classes.push(directionMap[direction]);\n\n // Flex wrap\n const wrapMap: Record = {\n wrap: 'flex-wrap',\n nowrap: 'flex-nowrap',\n 'wrap-reverse': 'flex-wrap-reverse',\n };\n classes.push(wrapMap[wrap]);\n\n // Justify content\n const justifyMap: Record = {\n start: 'justify-start',\n end: 'justify-end',\n center: 'justify-center',\n between: 'justify-between',\n around: 'justify-around',\n evenly: 'justify-evenly',\n };\n classes.push(justifyMap[justify]);\n\n // Align items\n const alignMap: Record = {\n start: 'items-start',\n end: 'items-end',\n center: 'items-center',\n baseline: 'items-baseline',\n stretch: 'items-stretch',\n };\n classes.push(alignMap[align]);\n\n // Gap\n if (gap > 0) {\n classes.push(`gap-${gap}`);\n }\n\n // Flex grow\n if (grow === true) {\n classes.push('flex-grow');\n } else if (typeof grow === 'number' && grow > 0) {\n classes.push(`flex-grow-${grow}`);\n }\n\n // Flex shrink\n if (shrink === false) {\n classes.push('shrink-0');\n } else if (shrink === true) {\n classes.push('flex-shrink');\n } else if (typeof shrink === 'number' && shrink > 0) {\n classes.push(`flex-shrink-${shrink}`);\n }\n\n // 사용자 정의 클래스 추가\n if (className) {\n classes.push(className);\n }\n\n return (\n
\n {children}\n
\n );\n};\n","import React from 'react';\nimport { Section as BaseSection } from '../basic/Section';\nimport { Div } from '../basic/Div';\nimport { H2 } from '../basic/H2';\nimport { P } from '../basic/P';\nimport type { EditorAttrs } from '../../types';\n\nexport interface SectionLayoutProps {\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n\n /**\n * 섹션 제목\n */\n title?: string;\n\n /**\n * 섹션 부제목\n */\n subtitle?: string;\n\n /**\n * 패딩 적용\n */\n padding?: 'none' | 'sm' | 'md' | 'lg' | 'xl';\n\n /**\n * 배경색\n */\n background?: 'none' | 'white' | 'gray' | 'primary' | 'secondary';\n\n /**\n * 최대 너비 제한\n */\n maxWidth?: 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '4xl' | '6xl' | '7xl' | 'full';\n\n /**\n * 중앙 정렬 여부\n */\n centered?: boolean;\n\n /**\n * 경계선 표시\n */\n border?: boolean;\n\n /**\n * 그림자 효과\n */\n shadow?: 'none' | 'sm' | 'md' | 'lg' | 'xl';\n\n /**\n * 둥근 모서리\n */\n rounded?: boolean;\n\n /**\n * 사용자 정의 클래스\n */\n className?: string;\n\n /**\n * 인라인 스타일\n */\n style?: React.CSSProperties;\n\n /**\n * 자식 요소\n */\n children?: React.ReactNode;\n\n /**\n * 클릭 이벤트 핸들러\n */\n onClick?: () => void;\n\n /**\n * 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread)\n */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * Section 레이아웃 컴포넌트\n *\n * 시맨틱 구역 분할을 위한 섹션 컴포넌트입니다.\n * 제목, 패딩, 배경색 등 다양한 옵션을 제공합니다.\n *\n * @example\n * // 기본 섹션\n *
\n *

Content here

\n *
\n *\n * @example\n * // 제목이 있는 섹션\n * \n *

User details

\n * \n */\nexport const SectionLayout: React.FC = ({\n id,\n title,\n subtitle,\n children,\n padding = 'md',\n background = 'none',\n maxWidth,\n centered = false,\n border = false,\n shadow = 'none',\n rounded = false,\n className = '',\n style,\n onClick,\n editorAttrs,\n}) => {\n // Tailwind CSS 클래스 생성\n const classes: string[] = [];\n\n // 패딩\n const paddingMap: Record = {\n none: 'p-0',\n sm: 'p-2',\n md: 'p-4',\n lg: 'p-6',\n xl: 'p-8',\n }; \n classes.push(paddingMap[padding]);\n\n // 배경색\n const backgroundMap: Record = {\n none: '',\n white: 'bg-white dark:bg-gray-700',\n gray: 'bg-gray-50 dark:bg-gray-800',\n primary: 'bg-blue-50 dark:bg-blue-900/20',\n secondary: 'bg-gray-50 dark:bg-gray-800',\n };\n if (background !== 'none') {\n classes.push(backgroundMap[background]);\n }\n\n // 최대 너비\n if (maxWidth) {\n const maxWidthMap: Record = {\n sm: 'max-w-sm',\n md: 'max-w-md',\n lg: 'max-w-lg',\n xl: 'max-w-xl',\n '2xl': 'max-w-2xl',\n '4xl': 'max-w-4xl',\n '6xl': 'max-w-6xl',\n '7xl': 'max-w-7xl',\n full: 'max-w-full',\n };\n classes.push(maxWidthMap[maxWidth]);\n }\n\n // 중앙 정렬\n if (centered) {\n classes.push('mx-auto');\n }\n\n // 경계선\n if (border) {\n classes.push('border', 'border-gray-200', 'dark:border-gray-700');\n }\n\n // 그림자\n const shadowMap: Record = {\n none: '',\n sm: 'shadow-sm',\n md: 'shadow-md',\n lg: 'shadow-lg',\n xl: 'shadow-xl',\n };\n if (shadow !== 'none') {\n classes.push(shadowMap[shadow]);\n }\n\n // 둥근 모서리\n if (rounded) {\n classes.push('rounded-lg');\n }\n\n // 사용자 정의 클래스 추가\n if (className) {\n classes.push(className);\n }\n\n return (\n \n {/* 제목 영역 */}\n {(title || subtitle) && (\n
\n {title &&

{title}

}\n {subtitle &&

{subtitle}

}\n
\n )}\n\n {/* 콘텐츠 영역 */}\n {children}\n
\n );\n};\n","import React from 'react';\nimport { Div } from '../basic/Div';\nimport type { EditorAttrs } from '../../types';\n\nexport interface ThreeColumnLayoutProps {\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n\n /**\n * 왼쪽 영역 너비\n */\n leftWidth?: string;\n\n /**\n * 오른쪽 영역 너비\n */\n rightWidth?: string;\n\n /**\n * 왼쪽 슬롯 컨텐츠\n */\n leftSlot?: React.ReactNode;\n\n /**\n * 가운데 슬롯 컨텐츠\n */\n centerSlot?: React.ReactNode;\n\n /**\n * 오른쪽 슬롯 컨텐츠\n */\n rightSlot?: React.ReactNode;\n\n /**\n * 사용자 정의 클래스\n */\n className?: string;\n\n /**\n * 인라인 스타일\n */\n style?: React.CSSProperties;\n\n /**\n * 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread)\n */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * ThreeColumnLayout 레이아웃 컴포넌트\n *\n * 3단 레이아웃 구조를 제공하는 기본 layout 컴포넌트입니다.\n * leftWidth, rightWidth를 조절할 수 있으며 각 영역에 슬롯을 제공합니다.\n *\n * @example\n * Left Content
}\n * centerSlot={
Center Content
}\n * rightSlot={
Right Content
}\n * />\n */\nexport const ThreeColumnLayout: React.FC = ({\n id,\n leftWidth = '250px',\n rightWidth = '300px',\n leftSlot,\n centerSlot,\n rightSlot,\n className = '',\n style,\n editorAttrs,\n}) => {\n // 컨테이너 스타일\n const containerClasses = `flex flex-row w-full h-full ${className}`.trim();\n\n // 왼쪽 영역 스타일\n const leftStyle: React.CSSProperties = {\n width: leftWidth,\n flexShrink: 0,\n };\n\n // 가운데 영역 스타일 (남은 공간 차지)\n const centerStyle: React.CSSProperties = {\n flex: 1,\n minWidth: 0, // flex 아이템 오버플로우 방지\n };\n\n // 오른쪽 영역 스타일\n const rightStyle: React.CSSProperties = {\n width: rightWidth,\n flexShrink: 0,\n };\n\n return (\n
\n {/* 왼쪽 영역 */}\n
\n {leftSlot}\n
\n\n {/* 가운데 영역 */}\n
\n {centerSlot}\n
\n\n {/* 오른쪽 영역 */}\n
\n {rightSlot}\n
\n
\n );\n};\n","/**\n * 상품 옵션 선택 관련 핸들러\n *\n * 상품 상세 페이지에서 옵션 선택 및 수량 변경을 처리합니다.\n * DB의 option_groups (문자열 값 배열)과 options (ProductOption 레코드)를 사용합니다.\n *\n * G7Core ActionDispatcher는 커스텀 핸들러를 (action, context) 시그니처로 호출합니다.\n * - action.params: 레이아웃 JSON에서 정의한 params (resolveParams로 이미 해석됨)\n * - context.setState: 컴포넌트 상태 업데이트 함수\n *\n * ⚠️ sequence 내에서 setState 후 다음 액션의 context.data._local은 갱신되지 않음\n * (ActionDispatcher.handleSequence는 state만 동기화, data._local은 미갱신)\n * 따라서 이 핸들러는 newGroupName+newValue를 직접 받아서 currentSelection을 자체 구성합니다.\n */\n\n/**\n * 옵션 그룹 구조 (다국어 지원)\n * API 응답: { name: {ko: \"색상\", en: \"Color\"}, name_localized: \"색상\", values: [...], values_localized: [...] }\n */\ninterface OptionGroup {\n name: string | Record;\n name_localized?: string;\n values: string[] | Array>;\n values_localized?: string[];\n}\n\n/**\n * 옵션 값 항목 (다국어 지원 배열 형식)\n */\ninterface OptionValueItem {\n key: string | Record;\n value: string | Record;\n}\n\n/**\n * ProductOption 레코드\n * option_values: 배열 형식 (신규) 또는 객체 형식 (레거시)\n * option_values_localized: 현재 로케일 값 객체 (신규)\n */\ninterface ProductOptionRecord {\n id: number;\n option_code: string;\n option_values: OptionValueItem[] | Record;\n option_values_localized?: Record;\n option_name: string | Record;\n option_name_localized?: string;\n price_adjustment: number;\n selling_price: number;\n selling_price_formatted: string;\n list_price: number;\n list_price_formatted: string;\n multi_currency_selling_price?: Record;\n multi_currency_list_price?: Record;\n stock_quantity: number;\n is_active: boolean;\n}\n\n/**\n * 추가옵션 선택지 (PublicProductResource.additional_options[].values[])\n */\ninterface AdditionalOptionValue {\n id: number;\n name: string;\n price_adjustment: number;\n is_default: boolean;\n /** 직접입력 허용 — 이 선택지 선택 시 자유 텍스트 입력칸 노출(입력 필수) */\n allow_custom_text?: boolean;\n}\n\n/**\n * 추가옵션 그룹 (PublicProductResource.additional_options[])\n */\ninterface AdditionalOptionGroup {\n id: number;\n name: string;\n is_required: boolean;\n values: AdditionalOptionValue[];\n}\n\n/**\n * 블럭별 추가옵션 선택 상태 (additional_option_id → value_id)\n */\ntype AdditionalOptionSelections = Record;\n\ninterface SelectedItem {\n id: string;\n optionId: number;\n options: Record;\n optionValues: Record;\n quantity: number;\n stock: number;\n unitPrice: number;\n unitPriceFormatted: string;\n totalPrice: number;\n totalPriceFormatted: string;\n multiCurrencyUnitPrice?: Record;\n multiCurrencyTotalPrice?: Record;\n /** 블럭별 추가옵션 선택 (그룹ID → 선택지ID) */\n additionalOptionSelections?: AdditionalOptionSelections;\n /** 블럭별 추가옵션 직접입력 텍스트 (그룹ID → custom_text). allow_custom_text 선택지 한정 */\n additionalOptionCustomTexts?: Record;\n /** 블럭별 추가옵션 추가금 합계 (KRW 기준, 단위당) */\n additionalOptionsTotal?: number;\n}\n\ninterface AddSelectedItemParams {\n productId: number;\n optionGroups: OptionGroup[];\n options: ProductOptionRecord[];\n currentSelection: Record;\n selectedOptionItems: SelectedItem[];\n preferredCurrency: string;\n /** 상품 추가옵션 카탈로그 (기본 선택지 자동 적용용) */\n additionalOptionGroups?: AdditionalOptionGroup[];\n /** sequence 상태 동기화 우회: 방금 선택한 그룹명 */\n newGroupName?: string;\n /** sequence 상태 동기화 우회: 방금 선택한 값 */\n newValue?: string;\n}\n\ninterface UpdateQuantityParams {\n itemIndex: number;\n newQuantity: number;\n selectedOptionItems: SelectedItem[];\n preferredCurrency: string;\n}\n\ninterface SetBlockAdditionalOptionParams {\n itemIndex: number;\n additionalOptionId: number;\n valueId: number | string;\n /** 직접입력 텍스트 입력 시 전달 (value 선택 변경 시에는 미전달) */\n customText?: string;\n selectedOptionItems: SelectedItem[];\n additionalOptionGroups: AdditionalOptionGroup[];\n preferredCurrency: string;\n}\n\n/**\n * G7Core ActionContext (ActionDispatcher에서 전달)\n */\ninterface ActionContext {\n data?: any;\n event?: Event;\n state?: any;\n setState?: (updates: any) => void;\n}\n\n/**\n * G7Core ActionDefinition (커스텀 핸들러 첫 번째 인자)\n */\ninterface ActionDefinition {\n handler: string;\n params?: Record;\n target?: string;\n [key: string]: any;\n}\n\n/**\n * 통화별 포맷팅 설정\n */\nconst CURRENCY_CONFIGS: Record = {\n KRW: { locale: 'ko-KR', decimals: 0 },\n USD: { locale: 'en-US', decimals: 2 },\n JPY: { locale: 'ja-JP', decimals: 0 },\n CNY: { locale: 'zh-CN', decimals: 2 },\n EUR: { locale: 'de-DE', decimals: 2 },\n};\n\n/**\n * 숫자를 통화 형식으로 포맷팅\n */\nfunction formatPrice(amount: number, currencyCode: string = 'KRW'): string {\n if (!Number.isFinite(amount)) return '0';\n const config = CURRENCY_CONFIGS[currencyCode] || CURRENCY_CONFIGS.KRW;\n try {\n return new Intl.NumberFormat(config.locale, {\n style: 'currency',\n currency: currencyCode,\n minimumFractionDigits: config.decimals,\n maximumFractionDigits: config.decimals,\n }).format(amount);\n } catch {\n return amount.toLocaleString() + (currencyCode === 'KRW' ? '원' : '');\n }\n}\n\n/**\n * 다중 통화 총 가격 재계산\n *\n * 추가옵션 추가금(additionalUnitKrw)이 있으면 KRW 환율 기준으로 환산해 각 통화 단가에 가산한다.\n * 추가옵션은 공개 응답에 다통화 컬럼이 없으므로(plan §245) 기본통화(KRW) 단가 비율로 환산한다.\n *\n * @param unitPriceMap 옵션 단가 다통화 맵\n * @param quantity 수량\n * @param additionalUnitKrw 추가옵션 추가금 합계 (KRW 기준, 단위당). 기본 0.\n */\nfunction recalcMultiCurrencyTotal(\n unitPriceMap: Record | undefined,\n quantity: number,\n additionalUnitKrw: number = 0\n): Record | undefined {\n if (!unitPriceMap) return undefined;\n\n // KRW 단가를 환산 기준으로 사용 (옵션의 KRW 단가 대비 타통화 비율)\n const krwUnit = (unitPriceMap.KRW as any)?.value ?? (unitPriceMap.KRW as any)?.price ?? 0;\n\n const result: Record = {};\n for (const [code, data] of Object.entries(unitPriceMap)) {\n // API는 { price, formatted } 형태, 내부는 { value, formatted } 형태 — 둘 다 지원\n const unitValue = (data as any)?.value ?? (data as any)?.price ?? 0;\n // 추가금 통화 환산: KRW 기준 추가금 × (해당통화 단가 / KRW 단가). KRW 자신은 그대로.\n let additionalConverted = 0;\n if (additionalUnitKrw > 0) {\n if (code === 'KRW') {\n additionalConverted = additionalUnitKrw;\n } else if (krwUnit > 0) {\n additionalConverted = (additionalUnitKrw * unitValue) / krwUnit;\n }\n }\n const total = (unitValue + additionalConverted) * quantity;\n result[code] = {\n value: total,\n formatted: formatPrice(total, code),\n };\n }\n return result;\n}\n\n/**\n * 선택된 옵션 항목들의 통화별 합계 포맷 맵을 계산합니다.\n *\n * 레이아웃 \"총 금액\"은 표현식 컨텍스트에서 핸들러를 호출할 수 없으므로(엔진 제약),\n * 합계 금액을 통화별로 미리 포맷해 _local 에 노출한다 → 레이아웃은 단순 조회만 한다.\n * (선택 통화 KRW 고정 결함 D2 해소)\n *\n * @param items 선택된 옵션 항목 목록\n * @returns 통화코드 => { value, formatted } 합계 맵\n */\nfunction buildSelectedTotalMultiCurrency(\n items: SelectedItem[]\n): Record {\n const totals: Record = {};\n for (const item of items) {\n const mc = item?.multiCurrencyTotalPrice;\n if (mc) {\n for (const [code, data] of Object.entries(mc)) {\n const v = (data as any)?.value ?? (data as any)?.price ?? 0;\n totals[code] = (totals[code] ?? 0) + v;\n }\n }\n }\n const result: Record = {};\n for (const [code, value] of Object.entries(totals)) {\n result[code] = { value, formatted: formatPrice(value, code) };\n }\n return result;\n}\n\n/**\n * 블럭의 추가옵션 선택으로부터 추가금 합계(KRW, 단위당)를 계산한다.\n *\n * @param selections 블럭별 추가옵션 선택 (그룹ID → 선택지ID)\n * @param groups 상품 추가옵션 카탈로그\n * @returns 추가금 합계 (KRW)\n */\nfunction computeAdditionalOptionsTotal(\n selections: AdditionalOptionSelections | undefined,\n groups: AdditionalOptionGroup[] | undefined\n): number {\n if (!selections || !groups?.length) return 0;\n let total = 0;\n for (const group of groups) {\n const valueId = selections[group.id];\n if (valueId == null) continue;\n const value = group.values?.find(v => v.id === Number(valueId));\n if (value) total += value.price_adjustment ?? 0;\n }\n return total;\n}\n\n/**\n * 추가옵션 선택을 백엔드 입력 형식으로 변환한다.\n * additional_option_selections: [{ additional_option_id, value_id }]\n *\n * @param selections 블럭별 추가옵션 선택 (그룹ID → 선택지ID)\n * @param customTexts 블럭별 직접입력 텍스트 (그룹ID → custom_text)\n * @returns 백엔드 입력 배열\n */\nexport function toAdditionalOptionSelectionsPayload(\n selections: AdditionalOptionSelections | undefined,\n customTexts?: Record\n): Array<{ additional_option_id: number; value_id: number; custom_text?: string }> {\n if (!selections) return [];\n return Object.entries(selections)\n .filter(([, valueId]) => valueId != null)\n .map(([groupId, valueId]) => {\n const entry: { additional_option_id: number; value_id: number; custom_text?: string } = {\n additional_option_id: Number(groupId),\n value_id: Number(valueId),\n };\n const customText = customTexts?.[Number(groupId)];\n if (typeof customText === 'string' && customText.trim() !== '') {\n entry.custom_text = customText.trim();\n }\n return entry;\n });\n}\n\n/**\n * 옵션 그룹의 키 (name_localized 우선, 폴백으로 name)\n */\nfunction getGroupKey(group: OptionGroup): string {\n if (group.name_localized) return group.name_localized;\n if (typeof group.name === 'string') return group.name;\n return (group.name as Record)?.ko ?? '';\n}\n\n/**\n * option_values에서 특정 그룹 키의 값 추출\n * 배열 형식(신규)과 객체 형식(레거시) 모두 지원\n */\nfunction getOptionValueByGroupKey(\n optionValues: OptionValueItem[] | Record,\n optionValuesLocalized: Record | undefined,\n groupKey: string\n): string | undefined {\n // option_values_localized가 있으면 우선 사용\n if (optionValuesLocalized && groupKey in optionValuesLocalized) {\n return optionValuesLocalized[groupKey];\n }\n\n // 배열 형식 (신규)\n if (Array.isArray(optionValues)) {\n const item = optionValues.find(v => {\n if (typeof v.key === 'string') return v.key === groupKey;\n return (v.key as Record)?.ko === groupKey || Object.values(v.key).includes(groupKey);\n });\n if (item) {\n if (typeof item.value === 'string') return item.value;\n return (item.value as Record)?.ko ?? Object.values(item.value)[0];\n }\n return undefined;\n }\n\n // 객체 형식 (레거시)\n return optionValues[groupKey];\n}\n\n/**\n * option_values를 Record 형식으로 변환\n * SelectedItem.optionValues 저장용 (현재 로케일 값으로 변환)\n */\nfunction convertOptionValuesToRecord(\n optionValues: OptionValueItem[] | Record,\n optionValuesLocalized?: Record\n): Record {\n // option_values_localized가 있으면 우선 사용\n if (optionValuesLocalized) {\n return optionValuesLocalized;\n }\n\n // 이미 객체 형식이면 그대로 반환\n if (!Array.isArray(optionValues)) {\n return optionValues;\n }\n\n // 배열 형식을 객체로 변환\n const result: Record = {};\n for (const item of optionValues) {\n const key = typeof item.key === 'string'\n ? item.key\n : (item.key as Record)?.ko ?? Object.values(item.key)[0] ?? '';\n const value = typeof item.value === 'string'\n ? item.value\n : (item.value as Record)?.ko ?? Object.values(item.value)[0] ?? '';\n if (key) {\n result[key] = value;\n }\n }\n return result;\n}\n\n/**\n * 현재 선택된 값으로 매칭되는 ProductOption 찾기\n * name_localized를 키로 사용하여 선택값과 비교\n */\nfunction findMatchingOption(\n optionGroups: OptionGroup[],\n currentSelection: Record,\n options: ProductOptionRecord[]\n): ProductOptionRecord | undefined {\n return options.find(opt => {\n if (!opt?.option_values || !opt?.is_active) return false;\n return optionGroups.every(group => {\n const groupKey = getGroupKey(group);\n const selectedValue = currentSelection?.[groupKey];\n const optValue = getOptionValueByGroupKey(\n opt.option_values,\n opt.option_values_localized,\n groupKey\n );\n return optValue === selectedValue;\n });\n });\n}\n\n/**\n * 옵션 선택 완료 시 selectedItems에 추가\n *\n * 모든 옵션 그룹이 선택되면 매칭되는 ProductOption을 찾아 선택 목록에 추가합니다.\n * 동일한 옵션 조합이 이미 있으면 토스트 알림 + 선택 초기화합니다.\n *\n * ⚠️ sequence 내 setState 후 context.data._local이 갱신되지 않는 G7Core 한계 때문에\n * newGroupName + newValue를 직접 받아서 currentSelection을 자체 병합합니다.\n *\n * G7Core에서 (action: ActionDefinition, context: ActionContext) 시그니처로 호출됩니다.\n */\nexport function addSelectedItemIfCompleteHandler(\n action: ActionDefinition,\n context: ActionContext\n): void {\n const params = action.params as AddSelectedItemParams;\n if (!params) return;\n\n const { optionGroups, options, selectedOptionItems, preferredCurrency } = params;\n\n // sequence 내 setState 미반영 대응: newGroupName/newValue가 있으면 직접 병합\n let currentSelection: Record;\n if (params.newGroupName && params.newValue) {\n currentSelection = {\n ...(params.currentSelection ?? {}),\n [params.newGroupName]: params.newValue,\n };\n } else {\n currentSelection = params.currentSelection ?? {};\n }\n\n // 모든 옵션 그룹이 선택되었는지 확인 (name_localized 키 사용)\n const allSelected = optionGroups?.every(group => {\n const groupKey = getGroupKey(group);\n return currentSelection?.[groupKey];\n });\n if (!allSelected) return;\n\n // 매칭되는 ProductOption 찾기\n const matchedOption = findMatchingOption(optionGroups, currentSelection, options ?? []);\n if (!matchedOption) {\n context.setState?.({ currentSelection: {}, __mergeMode: 'shallow' });\n return;\n }\n\n // 옵션 키 (중복 확인용) - name_localized 키 사용\n const optionKey = optionGroups.map(g => currentSelection[getGroupKey(g)]).join('_');\n const items = selectedOptionItems ?? [];\n const existing = items.find(item => item.id === optionKey);\n\n if (existing) {\n // 이미 추가된 옵션 → 토스트 알림 + 선택 초기화\n const G7Core = (window as any).G7Core;\n G7Core?.toast?.warning?.(G7Core?.t?.('sirsoft-ecommerce.shop.already_added_option') ?? '이미 추가된 옵션입니다.');\n context.setState?.({ currentSelection: {}, __mergeMode: 'shallow' });\n return;\n }\n\n // 새 옵션 조합 추가\n const unitPrice = matchedOption.selling_price ?? 0;\n const optionLabels: Record = {};\n optionGroups.forEach(group => {\n const groupKey = getGroupKey(group);\n optionLabels[groupKey] = currentSelection[groupKey];\n });\n\n // 추가옵션 초기 선택: 필수(is_required) 그룹에 한해 기본 선택지(is_default)를 자동 적용한다.\n // 비필수 그룹은 \"선택하세요\" 미선택 상태를 유지해야 한다 — 추가옵션 선택지는 라디오 방식이라\n // 그룹당 1개가 항상 is_default 로 마킹되므로(관리자 폼이 첫 선택지를 기본으로 시드), 비필수까지\n // 자동 적용하면 사용자가 원치 않은 추가금/선택이 강제로 붙는다.\n const additionalOptionGroups = params.additionalOptionGroups ?? [];\n const additionalOptionSelections: AdditionalOptionSelections = {};\n for (const group of additionalOptionGroups) {\n if (!group.is_required) continue;\n const defaultValue = group.values?.find(v => v.is_default);\n if (defaultValue) additionalOptionSelections[group.id] = defaultValue.id;\n }\n const additionalOptionsTotal = computeAdditionalOptionsTotal(\n additionalOptionSelections,\n additionalOptionGroups\n );\n\n const blockUnitTotal = unitPrice + additionalOptionsTotal;\n\n const newItem: SelectedItem = {\n id: optionKey,\n optionId: matchedOption.id,\n options: optionLabels,\n optionValues: convertOptionValuesToRecord(\n matchedOption.option_values,\n matchedOption.option_values_localized\n ),\n quantity: 1,\n stock: matchedOption.stock_quantity ?? 999,\n unitPrice,\n unitPriceFormatted: formatPrice(unitPrice, preferredCurrency),\n totalPrice: blockUnitTotal,\n totalPriceFormatted: formatPrice(blockUnitTotal, preferredCurrency),\n multiCurrencyUnitPrice: matchedOption.multi_currency_selling_price,\n multiCurrencyTotalPrice: recalcMultiCurrencyTotal(\n matchedOption.multi_currency_selling_price as any,\n 1,\n additionalOptionsTotal\n ),\n additionalOptionSelections,\n additionalOptionsTotal,\n };\n\n const nextItems = [...items, newItem];\n context.setState?.({\n selectedOptionItems: nextItems,\n selectedTotalMultiCurrency: buildSelectedTotalMultiCurrency(nextItems),\n currentSelection: {},\n __mergeMode: 'shallow',\n });\n}\n\n/**\n * 선택된 상품의 수량 변경 및 가격 재계산\n *\n * G7Core에서 (action: ActionDefinition, context: ActionContext) 시그니처로 호출됩니다.\n */\nexport function updateSelectedItemQuantityHandler(\n action: ActionDefinition,\n context: ActionContext\n): void {\n const params = action.params as UpdateQuantityParams;\n if (!params) return;\n\n const { selectedOptionItems, preferredCurrency } = params;\n // $args[0]이 문자열로 전달될 수 있으므로 Number 변환\n const itemIndex = Number(params.itemIndex) || 0;\n const newQuantity = Number(params.newQuantity) || 1;\n\n const updatedItems = (selectedOptionItems ?? []).map((item, idx) => {\n if (idx !== itemIndex) return item;\n\n const unitPrice = item?.unitPrice ?? 0;\n const additionalOptionsTotal = item?.additionalOptionsTotal ?? 0;\n const totalPrice = (unitPrice + additionalOptionsTotal) * newQuantity;\n return {\n ...item,\n quantity: newQuantity,\n totalPrice,\n totalPriceFormatted: formatPrice(totalPrice, preferredCurrency),\n multiCurrencyTotalPrice: recalcMultiCurrencyTotal(\n item?.multiCurrencyUnitPrice,\n newQuantity,\n additionalOptionsTotal\n ),\n };\n });\n\n context.setState?.({\n selectedOptionItems: updatedItems,\n selectedTotalMultiCurrency: buildSelectedTotalMultiCurrency(updatedItems),\n });\n}\n\n/**\n * 블럭별 추가옵션 선택 변경 및 가격 재계산\n *\n * 특정 옵션 블럭의 추가옵션 그룹 선택을 갱신하고, 추가금 합계·소계·다통화를 재계산한다.\n * 가격 표시는 클라이언트 계산이며 결제금액 SSoT 는 서버(plan D13).\n *\n * G7Core에서 (action: ActionDefinition, context: ActionContext) 시그니처로 호출됩니다.\n */\nexport function setBlockAdditionalOptionHandler(\n action: ActionDefinition,\n context: ActionContext\n): void {\n const params = action.params as SetBlockAdditionalOptionParams;\n if (!params) return;\n\n const { selectedOptionItems, additionalOptionGroups, preferredCurrency } = params;\n const itemIndex = Number(params.itemIndex) || 0;\n const additionalOptionId = Number(params.additionalOptionId);\n // customText 키가 params 에 존재하면 직접입력 모드 (value 선택 변경 아님)\n const isCustomTextMode = Object.prototype.hasOwnProperty.call(params, 'customText');\n // 빈 문자열(플레이스홀더) 선택 시 해당 그룹 선택 해제\n const valueId = params.valueId === '' || params.valueId == null ? null : Number(params.valueId);\n\n const updatedItems = (selectedOptionItems ?? []).map((item, idx) => {\n if (idx !== itemIndex) return item;\n\n const selections: AdditionalOptionSelections = { ...(item.additionalOptionSelections ?? {}) };\n const customTexts: Record = { ...(item.additionalOptionCustomTexts ?? {}) };\n\n if (isCustomTextMode) {\n // 직접입력 모드: 텍스트만 갱신 (선택 value 는 유지)\n const text = String(params.customText ?? '');\n if (text.trim() === '') {\n delete customTexts[additionalOptionId];\n } else {\n customTexts[additionalOptionId] = text;\n }\n } else if (valueId == null) {\n // 그룹 선택 해제 → 선택·직접입력 모두 정리\n delete selections[additionalOptionId];\n delete customTexts[additionalOptionId];\n } else {\n selections[additionalOptionId] = valueId;\n // 새 선택지가 직접입력을 허용하지 않으면 기존 직접입력 텍스트 정리\n const group = (additionalOptionGroups ?? []).find((g) => g.id === additionalOptionId);\n const value = group?.values?.find((v) => v.id === valueId);\n if (!value?.allow_custom_text) {\n delete customTexts[additionalOptionId];\n }\n }\n\n const additionalOptionsTotal = computeAdditionalOptionsTotal(selections, additionalOptionGroups);\n const unitPrice = item?.unitPrice ?? 0;\n const quantity = item?.quantity ?? 1;\n const totalPrice = (unitPrice + additionalOptionsTotal) * quantity;\n\n return {\n ...item,\n additionalOptionSelections: selections,\n additionalOptionCustomTexts: customTexts,\n additionalOptionsTotal,\n totalPrice,\n totalPriceFormatted: formatPrice(totalPrice, preferredCurrency),\n multiCurrencyTotalPrice: recalcMultiCurrencyTotal(\n item?.multiCurrencyUnitPrice,\n quantity,\n additionalOptionsTotal\n ),\n };\n });\n\n context.setState?.({\n selectedOptionItems: updatedItems,\n selectedTotalMultiCurrency: buildSelectedTotalMultiCurrency(updatedItems),\n });\n}\n\n/**\n * 선택된 옵션 항목을 제거하고 통화별 합계를 재계산합니다.\n *\n * 레이아웃에서 filter 로 직접 제거하면 selectedTotalMultiCurrency(통화별 합계 포맷)를\n * 갱신할 수 없어(표현식은 핸들러 호출 불가) stale 합계가 남는다. 제거도 핸들러로 처리해\n * 합계 맵을 함께 재계산한다(D2).\n *\n * G7Core에서 (action: ActionDefinition, context: ActionContext) 시그니처로 호출됩니다.\n */\nexport function removeSelectedItemHandler(\n action: ActionDefinition,\n context: ActionContext\n): void {\n const params = action.params as { itemIndex?: number | string; selectedOptionItems?: SelectedItem[] };\n if (!params) return;\n\n const itemIndex = Number(params.itemIndex) || 0;\n const nextItems = (params.selectedOptionItems ?? []).filter((_, idx) => idx !== itemIndex);\n\n context.setState?.({\n selectedOptionItems: nextItems,\n selectedTotalMultiCurrency: buildSelectedTotalMultiCurrency(nextItems),\n });\n}\n\n/**\n * 옵션 없는 상품의 수량을 변경하고 통화별 총액 포맷 맵을 재계산합니다.\n *\n * 옵션 없는 상품 총액 = 단가 × 수량. 레이아웃 표현식은 핸들러를 호출할 수 없어\n * 통화별 포맷(소수점/기호)을 만들 수 없으므로, 수량 변경 시 통화별 총액 formatted 를\n * noOptionTotalMultiCurrency 에 미리 계산해 노출한다(KRW 고정 결함 D3 해소).\n *\n * @param action.params.newQuantity 변경 수량\n * @param action.params.multiCurrencyUnitPrice 단가 통화맵(product.multi_currency_selling_price)\n * G7Core에서 (action: ActionDefinition, context: ActionContext) 시그니처로 호출됩니다.\n */\nexport function updateNoOptionQuantityHandler(\n action: ActionDefinition,\n context: ActionContext\n): void {\n const params = action.params as {\n newQuantity?: number | string;\n multiCurrencyUnitPrice?: Record;\n };\n if (!params) return;\n\n const quantity = Math.max(1, Number(params.newQuantity) || 1);\n\n context.setState?.({\n noOptionQuantity: quantity,\n noOptionTotalMultiCurrency: recalcMultiCurrencyTotal(\n params.multiCurrencyUnitPrice as Record | undefined,\n quantity\n ),\n });\n}","/**\n * 장바구니 관련 핸들러\n *\n * 장바구니 페이지에서 상품 선택, 옵션 변경, 삭제 등을 처리합니다.\n *\n * 핸들러 시그니처: ActionDispatcher의 ActionHandler 형식을 따름\n * (action: ActionDefinition, context: ActionContext) => void | Promise\n *\n * G7Core API 사용:\n * - G7Core.state.setLocal() - 로컬 상태 설정\n * - G7Core.state.getLocal() - 로컬 상태 조회\n * - G7Core.toast?.show() - 토스트 표시\n * - G7Core.t() - 번역\n */\n\n// Logger 설정 (G7Core 초기화 전에도 동작하도록 폴백 포함)\nconst logger = ((window as any).G7Core?.createLogger?.('Handler:Cart')) ?? {\n log: (...args: unknown[]) => console.log('[Handler:Cart]', ...args),\n warn: (...args: unknown[]) => console.warn('[Handler:Cart]', ...args),\n error: (...args: unknown[]) => console.error('[Handler:Cart]', ...args),\n};\n\n/**\n * 로컬 상태 설정 헬퍼\n */\nfunction setLocalState(updates: Record): void {\n const G7Core = (window as any).G7Core;\n if (G7Core?.state?.setLocal) {\n G7Core.state.setLocal(updates);\n logger.log('Local state updated:', updates);\n } else {\n logger.warn('G7Core.state.setLocal not available');\n }\n}\n\n/**\n * 로컬 상태 조회 헬퍼\n */\nfunction getLocalState(): Record {\n const G7Core = (window as any).G7Core;\n return G7Core?.state?.getLocal?.() || {};\n}\n\n/**\n * 전역 상태 조회 헬퍼\n */\nfunction getGlobalState(): Record {\n const G7Core = (window as any).G7Core;\n return G7Core?.state?.get?.() || {};\n}\n\n/**\n * 토스트 표시 헬퍼\n */\nfunction showToast(message: string, type: 'success' | 'error' | 'warning' | 'info' = 'info'): void {\n const G7Core = (window as any).G7Core;\n if (G7Core?.toast?.show) {\n G7Core.toast.show(message, type);\n } else {\n logger.warn('G7Core.toast.show not available, message:', message);\n }\n}\n\n/**\n * 번역 헬퍼\n */\nfunction t(key: string): string {\n const G7Core = (window as any).G7Core;\n if (G7Core?.t) {\n return G7Core.t(key);\n }\n return key;\n}\n\n/**\n * 장바구니 데이터소스 재조회 헬퍼\n *\n * 선택된 상품 기준으로 계산 결과를 갱신합니다.\n * selected_ids 파라미터를 전달하여 선택된 아이템만 계산합니다.\n */\nfunction refetchCartItems(): void {\n const G7Core = (window as any).G7Core;\n if (G7Core?.dispatch) {\n const localState = getLocalState();\n const selectedItems = localState.selectedItems || [];\n\n G7Core.dispatch({\n handler: 'refetchDataSource',\n params: {\n dataSourceId: 'cartItems',\n },\n });\n logger.log('Refetching cartItems with selected_ids:', selectedItems);\n } else {\n logger.warn('G7Core.dispatch not available');\n }\n}\n\n/**\n * 장바구니 개별 상품 선택/해제\n *\n * 체크박스 상태 변경 시 selectedItems 배열을 업데이트하고,\n * 선택된 상품 기준으로 주문 계산을 다시 요청합니다.\n *\n * @param action 액션 정의 (params에 itemId, selectedItems 포함)\n * @param _context 액션 컨텍스트 (사용하지 않음)\n */\nexport function toggleCartItemSelectionHandler(\n action?: any,\n _context?: any\n): void {\n const { itemId, selectedItems } = action?.params || {};\n const currentSelected = selectedItems || [];\n\n let newSelected: number[];\n if (currentSelected.includes(itemId)) {\n // 이미 선택되어 있으면 제거\n newSelected = currentSelected.filter((id: number) => id !== itemId);\n } else {\n // 선택되어 있지 않으면 추가\n newSelected = [...currentSelected, itemId];\n }\n\n // 전체 선택 상태도 업데이트\n const globalState = getGlobalState();\n const allItems = globalState.cartItems?.data?.items || [];\n const allSelected = allItems.length > 0 && newSelected.length === allItems.length;\n\n setLocalState({\n selectedItems: newSelected,\n allSelected,\n selectedCount: newSelected.length,\n });\n\n // 선택 변경 후 계산 결과 갱신을 위해 데이터소스 재조회\n refetchCartItems();\n}\n\n/**\n * 장바구니 전체 선택/해제\n *\n * 전체 선택 체크박스 상태 변경 시 모든 상품을 선택하거나 해제하고,\n * 선택된 상품 기준으로 주문 계산을 다시 요청합니다.\n *\n * @param action 액션 정의 (params에 allItemIds, isSelected 포함)\n * @param _context 액션 컨텍스트 (사용하지 않음)\n */\nexport function selectAllCartItemsHandler(\n action?: any,\n _context?: any\n): void {\n const { allItemIds, isSelected } = action?.params || {};\n\n setLocalState({\n selectedItems: isSelected ? allItemIds : [],\n allSelected: isSelected,\n selectedCount: isSelected ? allItemIds.length : 0,\n });\n\n // 선택 변경 후 계산 결과 갱신을 위해 데이터소스 재조회\n refetchCartItems();\n}\n\n/**\n * 옵션 변경 모달에서 옵션 값 설정\n *\n * 옵션 선택 시 selectedOptions 상태를 업데이트합니다.\n *\n * @param action 액션 정의 (params에 optionName, optionValue 포함)\n * @param _context 액션 컨텍스트 (사용하지 않음)\n */\nexport function setCartOptionHandler(\n action?: any,\n _context?: any\n): void {\n const { optionName, optionValue } = action?.params || {};\n const localState = getLocalState();\n const currentOptions = localState.selectedOptions || {};\n\n setLocalState({\n selectedOptions: {\n ...currentOptions,\n [optionName]: optionValue,\n },\n });\n}\n\n/**\n * 삭제 확인 모달 열기\n *\n * 선택된 상품 삭제 버튼 클릭 시 삭제 확인 모달을 엽니다.\n *\n * @param action 액션 정의 (params에 targetIds 포함)\n * @param _context 액션 컨텍스트 (사용하지 않음)\n */\nexport function openCartDeleteModalHandler(\n action?: any,\n _context?: any\n): void {\n const { targetIds } = action?.params || {};\n\n if (!targetIds || targetIds.length === 0) {\n showToast(t('shop.cart.select_items_to_delete'), 'warning');\n return;\n }\n\n setLocalState({\n deleteModal: {\n visible: true,\n targetIds,\n },\n });\n}\n\n/**\n * 옵션 변경 모달 열기\n *\n * 상품 옵션 변경 버튼 클릭 시 옵션 변경 모달을 엽니다.\n *\n * @param action 액션 정의 (params에 targetItem 포함)\n * @param _context 액션 컨텍스트 (사용하지 않음)\n */\nexport function openCartOptionModalHandler(\n action?: any,\n _context?: any\n): void {\n const { targetItem } = action?.params || {};\n\n setLocalState({\n optionModal: {\n visible: true,\n targetItem,\n },\n selectedOptions: targetItem?.options || {},\n selectedQuantity: targetItem?.quantity,\n });\n}\n\n/**\n * 장바구니 아이템 선택 후 계산 갱신 요청\n *\n * 선택된 아이템이 변경되면 서버에 계산 요청을 보냅니다.\n *\n * @param action 액션 정의 (params에 selectedItems 포함)\n * @param _context 액션 컨텍스트 (사용하지 않음)\n */\nexport function recalculateCartHandler(\n action?: any,\n _context?: any\n): void {\n const { selectedItems } = action?.params || {};\n\n if (!selectedItems || selectedItems.length === 0) {\n setLocalState({ isCalculating: false });\n return;\n }\n\n setLocalState({ isCalculating: true });\n\n // 계산은 cartItems 데이터 소스 refetch로 처리됨\n // 추가 API 호출이 필요한 경우 여기서 처리\n}\n","/**\n * 장바구니 옵션 변경 관련 핸들러\n *\n * 장바구니 옵션 변경 모달에서 옵션 선택 및 매칭을 처리합니다.\n *\n * 핸들러 시그니처: ActionDispatcher의 ActionHandler 형식을 따름\n * (action: ActionDefinition, context: ActionContext) => void | Promise | any\n *\n * ⚠️ 중요: 커스텀 핸들러에서 dispatch({ target: 'local' })를 사용하면\n * 핸들러 실행 컨텍스트의 _local에 저장됩니다. iteration 내부에서 호출되면\n * 페이지 레벨 _local과 다른 스코프에 저장됩니다.\n *\n * 해결책: 핸들러가 결과를 반환하고, 레이아웃의 onSuccess에서 setState 실행\n */\n\n// Logger 설정 (G7Core 초기화 전에도 동작하도록 폴백 포함)\nconst logger = ((window as any).G7Core?.createLogger?.('Handler:CartOptionChange')) ?? {\n log: (...args: unknown[]) => console.log('[Handler:CartOptionChange]', ...args),\n warn: (...args: unknown[]) => console.warn('[Handler:CartOptionChange]', ...args),\n error: (...args: unknown[]) => console.error('[Handler:CartOptionChange]', ...args),\n};\n\n/**\n * 옵션 그룹 구조 (다국어 지원)\n * API 응답: { name: {ko: \"색상\", en: \"Color\"}, name_localized: \"색상\", values: [...], values_localized: [...] }\n */\ninterface OptionGroup {\n name: string | Record;\n name_localized?: string;\n values: string[] | Array>;\n values_localized?: string[];\n}\n\n/**\n * 옵션 값 항목 (다국어 지원 배열 형식)\n */\ninterface OptionValueItem {\n key: string | Record;\n value: string | Record;\n}\n\ninterface ProductOption {\n id: number;\n option_values: OptionValueItem[] | Record;\n option_values_localized?: Record;\n option_name: string | Record;\n option_name_localized?: string;\n selling_price_formatted: string;\n stock_quantity: number;\n}\n\ninterface InitCartOptionResult {\n selectedOptions: Record;\n matchedOption: ProductOption | null;\n}\n\n/**\n * 옵션 그룹의 키 (name_localized 우선, 폴백으로 name)\n */\nfunction getGroupKey(group: OptionGroup): string {\n if (group.name_localized) return group.name_localized;\n if (typeof group.name === 'string') return group.name;\n return (group.name as Record)?.ko ?? '';\n}\n\n/**\n * option_values에서 특정 그룹 키의 값 추출\n * 배열 형식(신규)과 객체 형식(레거시) 모두 지원\n */\nfunction getOptionValueByGroupKey(\n optionValues: OptionValueItem[] | Record,\n optionValuesLocalized: Record | undefined,\n groupKey: string\n): string | undefined {\n // option_values_localized가 있으면 우선 사용\n if (optionValuesLocalized && groupKey in optionValuesLocalized) {\n return optionValuesLocalized[groupKey];\n }\n\n // 배열 형식 (신규)\n if (Array.isArray(optionValues)) {\n const item = optionValues.find(v => {\n if (typeof v.key === 'string') return v.key === groupKey;\n return (v.key as Record)?.ko === groupKey || Object.values(v.key).includes(groupKey);\n });\n if (item) {\n if (typeof item.value === 'string') return item.value;\n return (item.value as Record)?.ko ?? Object.values(item.value)[0];\n }\n return undefined;\n }\n\n // 객체 형식 (레거시)\n return optionValues[groupKey];\n}\n\n/**\n * 선택된 옵션 조합에 맞는 product_option 찾기 (내부 함수)\n * name_localized를 키로 사용하여 선택값과 비교\n */\nfunction findMatchingOption(\n selectedOptions: Record,\n optionGroups: OptionGroup[],\n options: ProductOption[]\n): ProductOption | null {\n if (!selectedOptions || !optionGroups?.length) {\n return null;\n }\n\n // 모든 옵션 그룹이 선택되었는지 확인 (name_localized 키 사용)\n const allSelected = optionGroups.every((group) => {\n const groupKey = getGroupKey(group);\n return selectedOptions[groupKey];\n });\n if (!allSelected) {\n logger.log('Not all options selected yet');\n return null;\n }\n\n // 일치하는 옵션 조합 찾기\n const matched = options?.find((opt) =>\n optionGroups.every((group) => {\n const groupKey = getGroupKey(group);\n const optValue = getOptionValueByGroupKey(\n opt.option_values,\n opt.option_values_localized,\n groupKey\n );\n return optValue === selectedOptions[groupKey];\n })\n );\n\n return matched || null;\n}\n\n/**\n * 선택된 옵션 조합에 맞는 product_option 찾기\n *\n * 모든 옵션 그룹이 선택되면 일치하는 옵션 조합을 찾아 반환합니다.\n * selectedOptions 구조: { \"색상\": \"화이트\", \"사이즈\": \"S\" }\n *\n * @param action 액션 정의 (params에 selectedOptions, optionGroups, options 포함)\n * @returns { matchedOption: ProductOption | null }\n */\nexport function findMatchingOptionHandler(\n action?: any,\n _context?: any\n): { matchedOption: ProductOption | null } {\n const { selectedOptions, optionGroups, options } = action?.params || {};\n\n logger.log('findMatchingOption called:', { selectedOptions, optionGroups, optionsCount: options?.length });\n\n const matchedOption = findMatchingOption(selectedOptions, optionGroups, options);\n\n logger.log('Matched option:', matchedOption);\n\n // 결과 반환 - 레이아웃의 onSuccess에서 {{response.matchedOption}}으로 접근\n return { matchedOption };\n}\n\n/**\n * 현재 장바구니 아이템의 옵션을 초기 선택값으로 설정\n *\n * 모달이 열릴 때 현재 아이템의 옵션을 선택 상태로 초기화합니다.\n * currentOptionValues 구조: { \"색상\": \"블랙\", \"사이즈\": \"S\" }\n *\n * @param action 액션 정의 (params에 currentOptionValues, optionGroups, options 포함)\n * @returns { selectedOptions: Record, matchedOption: ProductOption | null }\n */\nexport function initCartOptionSelectionHandler(\n action?: any,\n _context?: any\n): InitCartOptionResult {\n const { currentOptionValues, optionGroups, options } = action?.params || {};\n\n logger.log('initCartOptionSelection called:', { currentOptionValues, optionGroups, optionsCount: options?.length });\n\n if (!optionGroups?.length || !currentOptionValues) {\n logger.log('No option groups or current values, returning empty');\n return { selectedOptions: {}, matchedOption: null };\n }\n\n // currentOptionValues를 그대로 selectedOptions로 사용\n // 둘 다 { \"색상\": \"블랙\", \"사이즈\": \"S\" } 형식 (name_localized 키 사용)\n const selectedOptions: Record = {};\n for (const group of optionGroups) {\n const groupKey = getGroupKey(group);\n const currentValue = currentOptionValues[groupKey];\n // values_localized가 있으면 우선 사용, 없으면 values 사용\n const valuesArray = group.values_localized ?? (\n Array.isArray(group.values)\n ? group.values.map((v: string | Record) => typeof v === 'string' ? v : (v as Record)?.ko ?? '')\n : []\n );\n if (currentValue && valuesArray.includes(currentValue)) {\n selectedOptions[groupKey] = currentValue;\n }\n }\n\n logger.log('Initial selectedOptions:', selectedOptions);\n\n // 매칭 옵션도 즉시 찾기\n const matchedOption = findMatchingOption(selectedOptions, optionGroups, options || []);\n\n logger.log('Matched option:', matchedOption);\n\n // 결과 반환 - 레이아웃의 onSuccess에서 {{response.selectedOptions}}, {{response.matchedOption}}으로 접근\n return { selectedOptions, matchedOption };\n}\n","/**\n * 로컬 스토리지 관련 핸들러\n *\n * 비로그인 사용자의 장바구니 키 등 클라이언트 스토리지 관리를 처리합니다.\n *\n * 핸들러 시그니처: ActionDispatcher의 ActionHandler 형식을 따름\n * (action: ActionDefinition, context: ActionContext) => void | Promise\n *\n * G7Core API 사용:\n * - G7Core.state.set() - 전역 상태 설정\n * - G7Core.state.get()._global?.currentUser - 현재 사용자 확인\n */\n\nconst CART_KEY_STORAGE_NAME = 'g7_cart_key';\nconst CART_KEY_API_ENDPOINT = '/api/modules/sirsoft-ecommerce/cart/key';\nconst GUEST_ORDER_TOKEN_STORAGE_NAME = 'g7_guest_order_token';\nconst GUEST_ORDER_NUMBER_STORAGE_NAME = 'g7_guest_order_number';\nconst GUEST_ORDER_EXPIRES_AT_STORAGE_NAME = 'g7_guest_order_expires_at';\n\n// Logger 설정 (G7Core 초기화 전에도 동작하도록 폴백 포함)\nconst logger = ((window as any).G7Core?.createLogger?.('Handler:Storage')) ?? {\n log: (...args: unknown[]) => console.log('[Handler:Storage]', ...args),\n warn: (...args: unknown[]) => console.warn('[Handler:Storage]', ...args),\n error: (...args: unknown[]) => console.error('[Handler:Storage]', ...args),\n};\n\n/**\n * 백엔드 API를 통해 Cart Key 발급\n *\n * @returns 발급된 cart_key 또는 null (실패 시)\n */\nasync function issueCartKeyFromApi(): Promise {\n try {\n const response = await fetch(CART_KEY_API_ENDPOINT, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Accept': 'application/json',\n },\n });\n\n if (!response.ok) {\n logger.error('Failed to issue cartKey from API:', response.status);\n return null;\n }\n\n const data = await response.json();\n return data.data?.cart_key || null;\n } catch (error) {\n logger.error('Error issuing cartKey from API:', error);\n return null;\n }\n}\n\n/**\n * 전역 상태 설정 헬퍼\n */\nfunction setGlobalState(updates: Record): void {\n const G7Core = (window as any).G7Core;\n if (G7Core?.state?.set) {\n G7Core.state.set(updates);\n logger.log('Global state updated:', updates);\n } else {\n logger.warn('G7Core.state.set not available');\n }\n}\n\n/**\n * 현재 로그인 사용자 확인 헬퍼\n *\n * G7Config.user 또는 전역 상태에서 currentUser를 확인합니다.\n */\nfunction getCurrentUser(): any {\n try {\n // G7Config에서 사용자 정보 확인 (서버에서 주입)\n const g7Config = (window as any).G7Config;\n if (g7Config?.user) {\n return g7Config.user;\n }\n\n // 전역 상태에서 확인\n const G7Core = (window as any).G7Core;\n const globalState = G7Core?.state?.get?.() || {};\n return globalState.currentUser || null;\n } catch {\n return null;\n }\n}\n\n/**\n * 장바구니 키 초기화\n *\n * 비로그인 사용자의 장바구니를 식별하기 위한 키를 생성/로드합니다.\n * 이미 저장된 키가 있으면 로드하고, 없으면 백엔드 API를 통해 새로 발급합니다.\n *\n * ActionDispatcher 핸들러 형식: (action, context) => void | Promise\n *\n * @param _action 액션 정의 (사용하지 않음)\n * @param _context 액션 컨텍스트 (사용하지 않음)\n */\nexport async function initCartKeyHandler(\n _action?: any,\n _context?: any\n): Promise {\n // 로그인/비로그인 사용자 모두 cartKey 필요 (API 헤더에 포함)\n // localStorage에서 기존 cartKey 확인\n let cartKey: string | null = null;\n try {\n cartKey = localStorage.getItem(CART_KEY_STORAGE_NAME);\n } catch {\n // localStorage 접근 불가 시 무시\n }\n\n // 없으면 백엔드 API를 통해 새로 발급\n if (!cartKey) {\n cartKey = await issueCartKeyFromApi();\n\n if (cartKey) {\n try {\n localStorage.setItem(CART_KEY_STORAGE_NAME, cartKey);\n logger.log('New cartKey issued from API:', cartKey);\n } catch {\n // localStorage 저장 실패 시 무시\n }\n } else {\n logger.error('Failed to issue cartKey from API');\n }\n } else {\n logger.log('Existing cartKey loaded:', cartKey);\n }\n\n setGlobalState({ cartKey });\n}\n\n/**\n * 장바구니 키 가져오기\n *\n * 현재 저장된 장바구니 키를 반환합니다.\n *\n * @param _action 액션 정의 (사용하지 않음)\n * @param _context 액션 컨텍스트 (사용하지 않음)\n */\nexport function getCartKeyHandler(\n _action?: any,\n _context?: any\n): string | null {\n try {\n return localStorage.getItem(CART_KEY_STORAGE_NAME);\n } catch {\n return null;\n }\n}\n\n/**\n * 장바구니 키 삭제\n *\n * 로그인 시 게스트 장바구니 키를 삭제합니다 (서버에서 병합 후).\n *\n * @param _action 액션 정의 (사용하지 않음)\n * @param _context 액션 컨텍스트 (사용하지 않음)\n */\nexport function clearCartKeyHandler(\n _action?: any,\n _context?: any\n): void {\n try {\n localStorage.removeItem(CART_KEY_STORAGE_NAME);\n logger.log('cartKey removed from localStorage');\n } catch {\n // localStorage 접근 불가 시 무시\n }\n\n setGlobalState({ cartKey: null });\n}\n\n/**\n * 장바구니 키 새로 생성\n *\n * 기존 키를 삭제하고 백엔드 API를 통해 새로운 키를 발급합니다.\n *\n * @param _action 액션 정의 (사용하지 않음)\n * @param _context 액션 컨텍스트 (사용하지 않음)\n */\nexport async function regenerateCartKeyHandler(\n _action?: any,\n _context?: any\n): Promise {\n // 로그인된 사용자는 cartKey 불필요\n const currentUser = getCurrentUser();\n if (currentUser) {\n clearCartKeyHandler();\n return;\n }\n\n const newCartKey = await issueCartKeyFromApi();\n\n if (newCartKey) {\n try {\n localStorage.setItem(CART_KEY_STORAGE_NAME, newCartKey);\n logger.log('New cartKey regenerated from API:', newCartKey);\n } catch {\n // localStorage 저장 실패 시 무시\n }\n\n setGlobalState({ cartKey: newCartKey });\n } else {\n logger.error('Failed to regenerate cartKey from API');\n }\n}\n\n/**\n * 선호 통화 저장 (기존 loadPreferredCurrency.ts와 통합)\n *\n * @param action 액션 정의 (params에 key, value 포함)\n * @param _context 액션 컨텍스트 (사용하지 않음)\n */\nexport function saveToStorageHandler(\n action?: any,\n _context?: any\n): void {\n const { key, value } = action?.params || {};\n if (!key) {\n logger.warn('saveToStorage: key is required');\n return;\n }\n try {\n localStorage.setItem(key, value);\n logger.log('Saved to storage:', key, value);\n } catch {\n // localStorage 저장 실패 시 무시\n }\n}\n\n/**\n * 스토리지에서 값 로드\n *\n * @param action 액션 정의 (params에 key, defaultValue 포함)\n * @param _context 액션 컨텍스트 (사용하지 않음)\n */\nexport function loadFromStorageHandler(\n action?: any,\n _context?: any\n): string | null {\n const { key, defaultValue } = action?.params || {};\n if (!key) {\n logger.warn('loadFromStorage: key is required');\n return defaultValue || null;\n }\n try {\n return localStorage.getItem(key) || defaultValue || null;\n } catch {\n return defaultValue || null;\n }\n}\n\n/**\n * sessionStorage 의 비회원 주문 토큰을 모두 삭제합니다 (내부 헬퍼).\n *\n * 토큰/주문번호/만료시각 3개 키를 함께 비웁니다.\n */\nfunction clearGuestOrderTokenInternal(): void {\n try {\n sessionStorage.removeItem(GUEST_ORDER_TOKEN_STORAGE_NAME);\n sessionStorage.removeItem(GUEST_ORDER_NUMBER_STORAGE_NAME);\n sessionStorage.removeItem(GUEST_ORDER_EXPIRES_AT_STORAGE_NAME);\n } catch {\n // sessionStorage 접근 불가 시 무시\n }\n}\n\n/**\n * 비회원 주문 조회 토큰 초기화 (init_actions 전용)\n *\n * sessionStorage 의 g7_guest_order_token 을 읽어 `_global.guestOrderToken` 에 설정한다.\n * 표준 loadFromSessionStorage 핸들러는 `context.setState`(React 컴포넌트 state)를 호출해\n * `_local` 에만 영향을 주므로, `_global` 에 토큰을 설정하려면 `G7Core.state.set` 직접 호출이 필요하다.\n * `initCartKey` 와 동일한 패턴.\n *\n * 동작:\n * 1. sessionStorage 에서 토큰/만료시각 로드 (탭 종료 시 자동 소실 — 공유 PC 안전)\n * 2. 만료된 토큰은 자동 폐기 (3개 키 모두 제거)\n * 3. `_global.guestOrderToken` 에 토큰 또는 null 설정\n * 4. `_user_base.globalHeaders` 의 `X-Guest-Order-Token: {{_global.guestOrderToken}}` 패턴이\n * 토큰 있을 때만 `guest/orders/*` 호출에 헤더 자동 주입 (엔진이 null/빈값 자동 제외)\n *\n * @param _action 액션 정의 (사용하지 않음)\n * @param _context 액션 컨텍스트 (사용하지 않음)\n */\nexport function initGuestOrderTokenHandler(\n _action?: any,\n _context?: any\n): void {\n let token: string | null = null;\n let expiresAt: string | null = null;\n try {\n token = sessionStorage.getItem(GUEST_ORDER_TOKEN_STORAGE_NAME);\n expiresAt = sessionStorage.getItem(GUEST_ORDER_EXPIRES_AT_STORAGE_NAME);\n } catch {\n // sessionStorage 접근 불가 시 무시\n }\n\n // 만료된 토큰 자동 폐기 (백엔드도 동일 시각 기준으로 거부하지만 로컬에서 미리 정리)\n // expiresAt 이 invalid 포맷이면 getTime() 이 NaN → NaN <= now 비교가 false 라\n // 만료 인식이 안 되는 회귀를 방어한다. invalid 토큰도 명시적으로 폐기.\n let expired = false;\n if (token) {\n const expiryTs = expiresAt ? new Date(expiresAt).getTime() : NaN;\n if (isNaN(expiryTs) || expiryTs <= Date.now()) {\n clearGuestOrderTokenInternal();\n token = null;\n expired = true;\n }\n }\n\n if (token) {\n // sessionStorage 에 유효 토큰이 있으면 그 값으로 _global 동기화 (새로고침/재방문 경로)\n setGlobalState({ guestOrderToken: token });\n logger.log('Guest order token loaded from sessionStorage');\n return;\n }\n\n // sessionStorage 에 토큰이 없을 때, 직전 단계(verify onSuccess saveGuestOrderToken)가\n // 이미 _global.guestOrderToken 에 동기 set 해 둔 in-memory 토큰을 보존한다.\n // 조회 폼 verify→상세 SPA 전이에서 sessionStorage 쓰기가 제때 반영되지 않거나\n // (브라우저/프라이버시 모드) 비활성인 환경에서도, navigate 로 살아남은 _global 토큰으로\n // 상세 데이터소스가 X-Guest-Order-Token 을 주입할 수 있게 한다.\n // 단, 만료로 명시 폐기된 경우(expired)는 in-memory 토큰도 비운다.\n if (!expired) {\n const G7Core = (window as any).G7Core;\n const existing = G7Core?.state?.get?.('_global')?.guestOrderToken;\n if (typeof existing === 'string' && existing !== '') {\n logger.log('Guest order token preserved from in-memory _global (sessionStorage empty)');\n return;\n }\n }\n\n setGlobalState({ guestOrderToken: null });\n logger.log('No guest order token (visitor not authenticated)');\n}\n\n// 표시 통화(preferredCurrency) 초기화 핸들러는 이커머스 모듈로 이전되었다\n// (modules/_bundled/sirsoft-ecommerce/resources/js/handlers/initPreferredCurrency.ts).\n// \"통화 = 커머스 책임\" 원칙 — 레이아웃은 `sirsoft-ecommerce.initPreferredCurrency` 로 호출한다.\n\n/**\n * 비회원 주문 토큰을 sessionStorage 에 저장하고 _global 에 동기 set 합니다.\n *\n * 토큰/주문번호/만료시각 3개 키를 함께 저장하며, _global.guestOrderToken 도 즉시 갱신해\n * 직후 호출되는 navigate 의 globalHeaders 자동 주입이 동작하도록 한다.\n *\n * @param action params.token, params.orderNumber, params.expiresAt 필수\n * @param _context 액션 컨텍스트 (사용하지 않음)\n */\nexport function saveGuestOrderTokenHandler(\n action?: any,\n _context?: any\n): void {\n const { token, orderNumber, expiresAt } = action?.params || {};\n if (!token || !orderNumber || !expiresAt) {\n logger.warn('saveGuestOrderToken: token, orderNumber, expiresAt are required');\n return;\n }\n try {\n sessionStorage.setItem(GUEST_ORDER_TOKEN_STORAGE_NAME, token);\n sessionStorage.setItem(GUEST_ORDER_NUMBER_STORAGE_NAME, orderNumber);\n sessionStorage.setItem(GUEST_ORDER_EXPIRES_AT_STORAGE_NAME, expiresAt);\n } catch {\n // sessionStorage 접근 불가 시 무시 (private 모드 등) — _global 만 set 되어 현재 페이지는 동작\n }\n setGlobalState({ guestOrderToken: token });\n}\n\n/**\n * 비회원 주문 토큰을 sessionStorage 에서 삭제하고 _global 도 비웁니다.\n *\n * 비회원 주문 취소/구매확정/명시적 로그아웃 등 토큰 무효화 시점에서 호출.\n *\n * @param _action 액션 정의 (사용하지 않음)\n * @param _context 액션 컨텍스트 (사용하지 않음)\n */\nexport function clearGuestOrderTokenHandler(\n _action?: any,\n _context?: any\n): void {\n clearGuestOrderTokenInternal();\n setGlobalState({ guestOrderToken: null });\n}\n\n/**\n * 비회원 주문 조회 폼(guest_order_form) 진입 시 sessionStorage 의 비회원 주문 토큰을 초기화한다.\n *\n * 비회원 주문 조회 폼은 매번 새로 본인 확인을 거치는 게 표준 패턴(eBay/Best Buy/카페24/\n * 11번가/G마켓 등). 결제 직후 자동 verify 로 받은 토큰은 완료/상세 화면에서는 유효하지만,\n * 사용자가 헤더 '비회원 주문 조회' 메뉴 등을 통해 조회 폼에 도달했을 때는 의도가\n * \"다시 조회\" 이므로 토큰을 비워 폼이 정상 노출되도록 한다.\n *\n * 만료된 토큰도 같은 경로로 자연스럽게 정리된다.\n *\n * @param _action 액션 정의 (사용하지 않음)\n * @param _context 액션 컨텍스트 (사용하지 않음)\n */\nexport function clearGuestTokenOnEntryHandler(\n _action?: any,\n _context?: any\n): void {\n clearGuestOrderTokenInternal();\n setGlobalState({ guestOrderToken: null });\n}\n","/**\n * 다중 통화 가격 표시 핸들러\n *\n * 사용자가 선택한 통화에 맞는 가격 문자열을 반환합니다.\n */\n\nimport { HandlerContext } from '../types';\n\ninterface CurrencyPrice {\n value: number;\n formatted: string;\n}\n\ninterface Product {\n selling_price: number;\n selling_price_formatted: string;\n list_price?: number;\n list_price_formatted?: string;\n multi_currency_selling_price?: Record;\n multi_currency_list_price?: Record;\n [key: string]: unknown;\n}\n\ninterface GetDisplayPriceParams {\n product: Product;\n priceField: 'selling_price' | 'list_price';\n currencyCode?: string;\n}\n\n/**\n * 선호 통화에 맞는 가격을 반환합니다.\n *\n * @param params.product - 상품 객체\n * @param params.priceField - 가격 필드 ('selling_price' | 'list_price')\n * @param params.currencyCode - 통화 코드 (선택, 미지정 시 전역 설정 사용)\n * @param context - 핸들러 컨텍스트\n * @returns 포맷팅된 가격 문자열\n *\n * @example\n * // 레이아웃 JSON에서 사용\n * {\n * \"text\": \"{{handler('getDisplayPrice', { product: product.data, priceField: 'selling_price' })}}\"\n * }\n */\nexport function getDisplayPriceHandler(\n params: GetDisplayPriceParams,\n context: HandlerContext\n): string {\n const { product, priceField, currencyCode } = params;\n const preferredCurrency = currencyCode || context.getState('_global.preferredCurrency') || 'KRW';\n\n const multiCurrencyField = `multi_currency_${priceField}` as keyof Product;\n const multiCurrencyData = product[multiCurrencyField] as Record | undefined;\n\n if (multiCurrencyData && multiCurrencyData[preferredCurrency]) {\n return multiCurrencyData[preferredCurrency].formatted;\n }\n\n // 폴백: 기본 통화\n const formattedField = `${priceField}_formatted` as keyof Product;\n return (product[formattedField] as string) || String(product[priceField]);\n}\n","/**\n * 통화 포맷팅 핸들러\n *\n * 숫자 값을 통화 형식 문자열로 변환합니다.\n */\n\nimport { HandlerContext } from '../types';\n\ninterface FormatCurrencyParams {\n value: number;\n currencyCode?: string;\n locale?: string;\n}\n\ninterface CurrencyConfig {\n code: string;\n symbol: string;\n locale: string;\n decimals: number;\n}\n\n/**\n * 통화별 기본 설정\n */\nconst CURRENCY_CONFIGS: Record = {\n KRW: { code: 'KRW', symbol: '₩', locale: 'ko-KR', decimals: 0 },\n USD: { code: 'USD', symbol: '$', locale: 'en-US', decimals: 2 },\n JPY: { code: 'JPY', symbol: '¥', locale: 'ja-JP', decimals: 0 },\n CNY: { code: 'CNY', symbol: '¥', locale: 'zh-CN', decimals: 2 },\n EUR: { code: 'EUR', symbol: '€', locale: 'de-DE', decimals: 2 },\n};\n\n/**\n * 숫자 값을 통화 형식으로 포맷팅합니다.\n *\n * @param params.value - 포맷팅할 숫자 값\n * @param params.currencyCode - 통화 코드 (KRW, USD, JPY 등)\n * @param params.locale - 로케일 (선택, 미지정 시 통화 기본 로케일 사용)\n * @param context - 핸들러 컨텍스트\n * @returns 포맷팅된 통화 문자열\n *\n * @example\n * formatCurrencyHandler({ value: 10000, currencyCode: 'KRW' }, context)\n * // => \"₩10,000\" 또는 \"10,000원\"\n *\n * formatCurrencyHandler({ value: 99.99, currencyCode: 'USD' }, context)\n * // => \"$99.99\"\n */\nexport function formatCurrencyHandler(\n params: FormatCurrencyParams,\n context: HandlerContext\n): string {\n const { value, currencyCode, locale: customLocale } = params;\n const currency = currencyCode || context.getState('_global.preferredCurrency') || 'KRW';\n\n const config = CURRENCY_CONFIGS[currency] || CURRENCY_CONFIGS.KRW;\n const locale = customLocale || config.locale;\n\n try {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency: config.code,\n minimumFractionDigits: config.decimals,\n maximumFractionDigits: config.decimals,\n }).format(value);\n } catch {\n // Intl 지원 안 되는 환경 폴백\n const formatted = value.toLocaleString(undefined, {\n minimumFractionDigits: config.decimals,\n maximumFractionDigits: config.decimals,\n });\n return `${config.symbol}${formatted}`;\n }\n}\n\n/**\n * 통화 심볼만 반환합니다.\n *\n * @param currencyCode - 통화 코드\n * @returns 통화 심볼\n */\nexport function getCurrencySymbol(currencyCode: string): string {\n return CURRENCY_CONFIGS[currencyCode]?.symbol || currencyCode;\n}\n","/**\n * 선호 통화 로드 핸들러\n *\n * localStorage에서 사용자가 선택한 통화 설정을 로드합니다.\n */\n\n// Logger 설정 (G7Core 초기화 전에도 동작하도록 폴백 포함)\nconst logger = ((window as any).G7Core?.createLogger?.('Handler:Currency')) ?? {\n log: (...args: unknown[]) => console.log('[Handler:Currency]', ...args),\n warn: (...args: unknown[]) => console.warn('[Handler:Currency]', ...args),\n error: (...args: unknown[]) => console.error('[Handler:Currency]', ...args),\n};\n\nimport { HandlerContext } from '../types';\n\nconst STORAGE_KEY = 'g7_preferred_currency';\nconst DEFAULT_CURRENCY = 'KRW';\n\ninterface LoadPreferredCurrencyParams {\n defaultCurrency?: string;\n}\n\n/**\n * localStorage에서 선호 통화를 로드하여 전역 상태에 설정합니다.\n *\n * @param params.defaultCurrency - 기본 통화 (선택, 기본값: 'KRW')\n * @param context - 핸들러 컨텍스트\n * @returns 로드된 통화 코드\n *\n * @example\n * // _user_base.json의 init_actions에서 사용\n * {\n * \"init_actions\": [\n * {\n * \"handler\": \"loadPreferredCurrency\",\n * \"params\": { \"defaultCurrency\": \"KRW\" }\n * }\n * ]\n * }\n */\nexport function loadPreferredCurrencyHandler(\n params: LoadPreferredCurrencyParams,\n context: HandlerContext\n): string {\n const { defaultCurrency = DEFAULT_CURRENCY } = params;\n\n let currency = defaultCurrency;\n\n try {\n if (typeof window !== 'undefined' && window.localStorage) {\n const stored = localStorage.getItem(STORAGE_KEY);\n if (stored && isValidCurrency(stored)) {\n currency = stored;\n }\n }\n } catch {\n // localStorage 접근 불가 시 기본값 사용\n logger.warn('localStorage 접근 불가, 기본 통화 사용:', defaultCurrency);\n }\n\n // 전역 상태에 설정\n context.setState('global', { preferredCurrency: currency });\n\n return currency;\n}\n\n/**\n * 선호 통화를 localStorage에 저장합니다.\n *\n * @param currencyCode - 저장할 통화 코드\n * @param context - 핸들러 컨텍스트\n *\n * @example\n * // 통화 선택 드롭다운에서 사용\n * {\n * \"actions\": [\n * {\n * \"type\": \"click\",\n * \"handler\": \"savePreferredCurrency\",\n * \"params\": { \"currencyCode\": \"{{currency.code}}\" }\n * }\n * ]\n * }\n */\nexport function savePreferredCurrencyHandler(\n params: { currencyCode: string },\n context: HandlerContext\n): void {\n const { currencyCode } = params;\n\n if (!isValidCurrency(currencyCode)) {\n logger.warn('유효하지 않은 통화 코드:', currencyCode);\n return;\n }\n\n try {\n if (typeof window !== 'undefined' && window.localStorage) {\n localStorage.setItem(STORAGE_KEY, currencyCode);\n }\n } catch {\n logger.warn('localStorage 저장 실패');\n }\n\n // 전역 상태 업데이트\n context.setState('global', { preferredCurrency: currencyCode });\n}\n\n/**\n * 유효한 통화 코드 형식인지 확인합니다.\n *\n * 관리자가 추가/삭제하는 통화를 하드코딩 목록이 막지 않도록(A1-⑥), 고정 화이트리스트가 아니라\n * ISO 4217 형식(영문 대문자 3자리)으로 검증한다. 실제 노출 통화 제한은 셀렉터가 표시하는\n * _global.availableCurrencies(is_default || exchange_rate>0)가 담당한다.\n */\nfunction isValidCurrency(code: string): boolean {\n return typeof code === 'string' && /^[A-Z]{3}$/.test(code);\n}\n","/**\n * setTheme 핸들러\n *\n * 사용자가 선택한 테마(auto/light/dark)로 변경합니다.\n * localStorage에 g7_color_scheme 값을 저장하고 즉시 적용합니다.\n *\n * sirsoft-admin_basic 템플릿과 동일한 키를 사용하여 테마 설정을 공유합니다.\n */\n\n// Logger 설정 (G7Core 초기화 전에도 동작하도록 폴백 포함)\nconst logger = ((window as any).G7Core?.createLogger?.('Handler:SetTheme')) ?? {\n log: (...args: unknown[]) => console.log('[Handler:SetTheme]', ...args),\n warn: (...args: unknown[]) => console.warn('[Handler:SetTheme]', ...args),\n error: (...args: unknown[]) => console.error('[Handler:SetTheme]', ...args),\n};\n\n/**\n * 테마 모드 타입\n */\nexport type ThemeMode = 'auto' | 'light' | 'dark';\n\n/**\n * 유효한 테마 목록\n */\nconst VALID_THEMES: ThemeMode[] = ['auto', 'light', 'dark'];\n\n/**\n * localStorage 키 (admin 템플릿과 동일)\n */\nconst STORAGE_KEY = 'g7_color_scheme';\n\n/**\n * 실제 적용될 테마 결정 (auto인 경우 시스템 설정 반영)\n */\nconst getEffectiveTheme = (mode: ThemeMode): 'light' | 'dark' => {\n if (mode === 'auto') {\n return window.matchMedia('(prefers-color-scheme: dark)').matches\n ? 'dark'\n : 'light';\n }\n return mode;\n};\n\n/**\n * 테마 적용\n *\n * document.documentElement에 data-theme 속성과 dark 클래스를 설정합니다.\n */\nconst applyTheme = (mode: ThemeMode): void => {\n const effectiveTheme = getEffectiveTheme(mode);\n document.documentElement.setAttribute('data-theme', effectiveTheme);\n\n // dark 클래스 토글 (Tailwind CSS dark: 모드 지원)\n if (effectiveTheme === 'dark') {\n document.documentElement.classList.add('dark');\n } else {\n document.documentElement.classList.remove('dark');\n }\n};\n\n/**\n * 저장된 테마를 로드하여 적용합니다.\n *\n * 템플릿 초기화 시 호출되어 localStorage에 저장된 테마를 즉시 적용합니다.\n */\nexport function initTheme(): void {\n try {\n const savedTheme = localStorage.getItem(STORAGE_KEY) as ThemeMode | null;\n const theme = savedTheme && VALID_THEMES.includes(savedTheme) ? savedTheme : 'auto';\n applyTheme(theme);\n logger.log('Initial theme applied:', theme);\n } catch (error) {\n logger.warn('Failed to load initial theme:', error);\n applyTheme('auto');\n }\n}\n\n/**\n * initTheme 핸들러\n *\n * 레이아웃의 init_actions에서 호출되어 초기 테마를 적용합니다.\n * ActionDispatcher의 커스텀 핸들러 형식을 따릅니다.\n *\n * target 파라미터가 전달되면 해당 테마로 초기화합니다.\n * target이 없거나 유효하지 않으면 localStorage 또는 'auto'를 사용합니다.\n *\n * @param action 액션 정의 (target에 테마 값 포함 가능)\n * @param _context 액션 컨텍스트 (사용하지 않음)\n */\nexport async function initThemeHandler(\n action: any,\n _context?: any\n): Promise {\n // action.target이 바인딩 해결된 값으로 전달됨 (ActionDispatcher에서 resolveValue 호출)\n const targetTheme = action?.target;\n\n // target이 유효한 테마 값인 경우 해당 테마 적용\n if (targetTheme && typeof targetTheme === 'string' && VALID_THEMES.includes(targetTheme as ThemeMode)) {\n applyTheme(targetTheme as ThemeMode);\n return;\n }\n\n // target이 없거나 유효하지 않으면 기존 로직 (localStorage 또는 auto)\n initTheme();\n}\n\n/**\n * 테마 변경 핸들러\n *\n * ActionDispatcher는 handler(action, context) 형태로 호출합니다.\n * context 객체에는 { data, event, props, state, setState, navigate } 등이 포함됩니다.\n *\n * @param action 액션 정의\n * @param context 액션 컨텍스트 (ActionContext 타입)\n */\nexport async function setThemeHandler(\n action: any,\n _context?: any\n): Promise {\n // 1. 테마 값 추출\n let theme: string | undefined;\n\n // action.target이 바인딩 해결된 값으로 전달됨 (ActionDispatcher에서 resolveValue 호출)\n if (action?.target && typeof action.target === 'string' && !action.target.includes('{{')) {\n theme = action.target;\n }\n\n // 2. 유효성 검증\n if (!theme || typeof theme !== 'string') {\n logger.warn('Invalid theme:', theme);\n return;\n }\n\n if (!VALID_THEMES.includes(theme as ThemeMode)) {\n logger.warn('Unsupported theme:', theme);\n return;\n }\n\n const validTheme = theme as ThemeMode;\n\n // 3. localStorage에 저장\n try {\n localStorage.setItem(STORAGE_KEY, validTheme);\n } catch (error) {\n logger.error('Failed to save theme to localStorage:', error);\n return;\n }\n\n // 4. 테마 즉시 적용 (페이지 새로고침 없이)\n applyTheme(validTheme);\n\n logger.log('Theme changed to:', validTheme);\n}\n","/**\n * redirectToLoginWithReturn 핸들러\n *\n * 비로그인 회원전용 게시판/비밀글 진입 시 로그인 페이지로 보내되,\n * 현재 경로(pathname + querystring)를 redirect 파라미터로 보존한다.\n * 로그인 폼은 {{query.redirect ?? '/'}} 로 복원하므로(_login_form.json:155),\n * 로그인 성공 후 원래 위치로 복귀한다.\n *\n * 배경: 게시판 목록/상세 데이터소스 401(auth_mode: optional + 토큰 없음)은\n * 코어 ApiClient 자동가드를 우회하고 errorHandling 경로로 진입하는데,\n * 그 context 에는 route/query 가 없다(TemplateApp.ts setDefaultContext 는 navigate 만 주입).\n * 따라서 레이아웃 표현식으로는 현재 경로를 캡처할 수 없으므로, 핸들러가 window.location 을\n * 직접 읽어 우회한다(identityLauncher.ts 의 window.location.href 선례와 동일 패턴).\n *\n * window.location.pathname 은 항상 '/' 로 시작하는 same-origin path 이므로 외부 URL 주입이\n * 불가능하다(open redirect 안전).\n */\n\n// Logger 설정 (G7Core 초기화 전에도 동작하도록 폴백 포함)\nconst logger = ((window as any).G7Core?.createLogger?.('Handler:RedirectToLoginWithReturn')) ?? {\n log: (...args: unknown[]) => console.log('[Handler:RedirectToLoginWithReturn]', ...args),\n warn: (...args: unknown[]) => console.warn('[Handler:RedirectToLoginWithReturn]', ...args),\n error: (...args: unknown[]) => console.error('[Handler:RedirectToLoginWithReturn]', ...args),\n};\n\n/**\n * 로그인 페이지로 이동하되 현재 경로를 redirect 로 보존하는 핸들러\n *\n * ActionDispatcher 는 handler(action, context) 형태로 호출하지만(ActionDispatcher.ts),\n * 이 핸들러는 action/context 를 사용하지 않는다 — 현재 경로는 window.location 에서 직접 읽는다.\n *\n * @param _action 액션 정의 (미사용)\n * @param _context 액션 컨텍스트 (미사용)\n * @return Promise\n */\nexport async function redirectToLoginWithReturnHandler(\n _action?: any,\n _context?: any\n): Promise {\n const G7Core = (window as any).G7Core;\n\n if (!G7Core?.dispatch) {\n logger.error('G7Core.dispatch 가 초기화되지 않아 로그인 리다이렉트를 실행할 수 없습니다.');\n return;\n }\n\n // 핸들러는 표현식 화이트리스트 제약 밖 — window.location 직접 접근 가능.\n // pathname + search 로 현재 경로(쿼리스트링 포함)를 보존한다.\n const returnUrl = window.location.pathname + window.location.search;\n\n await G7Core.dispatch({\n handler: 'navigate',\n params: {\n path: '/login',\n // navigate 가 params.query 를 URLSearchParams 로 인코딩(ActionDispatcher.ts handleNavigate).\n // 로그인 폼은 {{query.redirect ?? '/'}} 로 복원(_login_form.json).\n query: { redirect: returnUrl },\n },\n });\n}\n","/**\n * downloadAttachment 핸들러\n *\n * 게시판 첨부파일을 토큰 동반 요청으로 다운로드한다 (이슈 #413 item 58b).\n *\n * 배경: 기존 다운로드는 레이아웃의 브라우저 직접 링크(GET)였다.\n * G7 은 Sanctum 토큰 전용 인증인데 네비게이션에는 Authorization 헤더(토큰)가 실리지 않아,\n * download_url 이 가리키는 optional.sanctum 라우트가 요청을 guest 로 통과시켰다.\n * 그 결과 회원이 받아도 서버의 Auth::id() 가 NULL 이 되어 활동이력(attachment.download)의\n * 행위자(user_id)가 비어 있었다(upload/board.update 는 정상이었다).\n *\n * 해소: 코어 ApiClient(G7Core.api.get)로 blob 요청을 보내면 Authorization 헤더가 자동 첨부되어\n * 토큰이 실린다. 받은 blob 을 objectURL 로 변환해 클릭으로 저장한다\n * (composite/ImageGallery.tsx 의 downloadAuthenticatedFile 과 동일 패턴).\n *\n * 비회원: 토큰이 없으므로 종전과 동일하게 user_id 가 NULL 로 남는다(현행 정책 유지).\n */\n\n// Logger 설정 (G7Core 초기화 전에도 동작하도록 폴백 포함)\nconst logger = (window as any).G7Core?.createLogger?.('Handler:DownloadAttachment') ?? {\n log: (...args: unknown[]) => console.log('[Handler:DownloadAttachment]', ...args),\n warn: (...args: unknown[]) => console.warn('[Handler:DownloadAttachment]', ...args),\n error: (...args: unknown[]) => console.error('[Handler:DownloadAttachment]', ...args),\n};\n\n/**\n * 첨부파일을 토큰 동반 요청으로 다운로드하는 핸들러\n *\n * ActionDispatcher 는 handler(action, context) 형태로 호출한다.\n * params 는 resolveParams 로 이미 표현식이 해석된 값을 받는다.\n *\n * @param action 액션 정의 (params.url=다운로드 URL, params.filename=저장 파일명)\n * @param _context 액션 컨텍스트 (미사용)\n * @return Promise\n */\nexport async function downloadAttachmentHandler(action?: any, _context?: any): Promise {\n const G7Core = (window as any).G7Core;\n const { url, filename } = action?.params || {};\n\n if (!url) {\n logger.warn('다운로드 URL 이 없어 요청을 건너뜁니다.');\n return;\n }\n\n if (!G7Core?.api?.get) {\n logger.error('G7Core.api.get 이 초기화되지 않아 다운로드를 실행할 수 없습니다.');\n return;\n }\n\n try {\n // 코어 ApiClient 경로 → Authorization(Bearer) 헤더 자동 첨부 → 회원 토큰이 실린다.\n const blob = await G7Core.api.get(url, { responseType: 'blob' });\n\n if (blob) {\n const objectUrl = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = objectUrl;\n link.download = filename || '';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(objectUrl);\n }\n } catch (error) {\n logger.error('첨부파일 다운로드 실패', error);\n G7Core?.toast?.error?.(G7Core?.t?.('common.download_failed') ?? 'Download failed');\n }\n}\n","/**\n * sirsoft-basic 템플릿 핸들러 등록\n *\n * 이 파일에서 모든 커스텀 핸들러를 export합니다.\n * G7Core에서 자동으로 로드하여 사용할 수 있습니다.\n */\n\n// 상품 옵션 관련 핸들러\nimport {\n addSelectedItemIfCompleteHandler,\n updateSelectedItemQuantityHandler,\n removeSelectedItemHandler,\n updateNoOptionQuantityHandler,\n setBlockAdditionalOptionHandler,\n} from './productOptions';\n\n// 장바구니 관련 핸들러\nimport {\n toggleCartItemSelectionHandler,\n selectAllCartItemsHandler,\n setCartOptionHandler,\n openCartDeleteModalHandler,\n openCartOptionModalHandler,\n recalculateCartHandler,\n} from './cartHandlers';\n\n// 장바구니 옵션 변경 관련 핸들러\nimport {\n findMatchingOptionHandler,\n initCartOptionSelectionHandler,\n} from './cartOptionChange';\n\n// 스토리지 관련 핸들러\nimport {\n initCartKeyHandler,\n getCartKeyHandler,\n clearCartKeyHandler,\n regenerateCartKeyHandler,\n saveToStorageHandler,\n loadFromStorageHandler,\n initGuestOrderTokenHandler,\n saveGuestOrderTokenHandler,\n clearGuestOrderTokenHandler,\n clearGuestTokenOnEntryHandler,\n} from './storageHandlers';\n\n// 다중 통화 관련 핸들러\nimport { getDisplayPriceHandler } from './getDisplayPrice';\nimport { formatCurrencyHandler, getCurrencySymbol } from './formatCurrency';\nimport {\n loadPreferredCurrencyHandler,\n savePreferredCurrencyHandler,\n} from './loadPreferredCurrency';\n\n// 테마 관련 핸들러\nimport { setThemeHandler, initThemeHandler } from './setThemeHandler';\n\n// 인증 리다이렉트 관련 핸들러\nimport { redirectToLoginWithReturnHandler } from './redirectToLoginWithReturn';\n\n// 게시판 첨부 다운로드 핸들러 (토큰 동반 → 활동이력 행위자 기록)\nimport { downloadAttachmentHandler } from './downloadAttachment';\n\n// 언어 관련 핸들러는 엔진 레벨(ActionDispatcher)에서 처리\n// setLocale 핸들러는 ActionDispatcher에 빌트인으로 등록되어 있음\n\n/**\n * sirsoft-basic 템플릿의 모든 커스텀 핸들러\n *\n * 네이밍 규칙: 'sirsoft-basic.[핸들러명]'\n *\n * @example\n * // 레이아웃 JSON에서 사용\n * {\n * \"handler\": \"custom\",\n * \"name\": \"addSelectedItemIfComplete\",\n * \"params\": { ... }\n * }\n *\n * // 또는 풀네임으로\n * {\n * \"handler\": \"sirsoft-basic.addSelectedItemIfComplete\",\n * \"params\": { ... }\n * }\n */\nexport const handlers = {\n // 상품 옵션\n 'sirsoft-basic.addSelectedItemIfComplete': addSelectedItemIfCompleteHandler,\n 'sirsoft-basic.updateSelectedItemQuantity': updateSelectedItemQuantityHandler,\n 'sirsoft-basic.removeSelectedItem': removeSelectedItemHandler,\n 'sirsoft-basic.updateNoOptionQuantity': updateNoOptionQuantityHandler,\n 'sirsoft-basic.setBlockAdditionalOption': setBlockAdditionalOptionHandler,\n\n // 다중 통화\n 'sirsoft-basic.getDisplayPrice': getDisplayPriceHandler,\n 'sirsoft-basic.formatCurrency': formatCurrencyHandler,\n 'sirsoft-basic.getCurrencySymbol': getCurrencySymbol,\n 'sirsoft-basic.loadPreferredCurrency': loadPreferredCurrencyHandler,\n 'sirsoft-basic.savePreferredCurrency': savePreferredCurrencyHandler,\n\n // 테마\n setTheme: setThemeHandler,\n initTheme: initThemeHandler,\n\n // 인증 리다이렉트 (비로그인 게시판/비밀글 진입 → /login?redirect=현재경로)\n redirectToLoginWithReturn: redirectToLoginWithReturnHandler,\n\n // 게시판 첨부 다운로드 (토큰 동반 → 활동이력 행위자 기록)\n downloadAttachment: downloadAttachmentHandler,\n\n // 언어: setLocale은 엔진 레벨(ActionDispatcher)에서 빌트인으로 처리\n\n // 장바구니\n toggleCartItemSelection: toggleCartItemSelectionHandler,\n selectAllCartItems: selectAllCartItemsHandler,\n setCartOption: setCartOptionHandler,\n openCartDeleteModal: openCartDeleteModalHandler,\n openCartOptionModal: openCartOptionModalHandler,\n recalculateCart: recalculateCartHandler,\n\n // 장바구니 옵션 변경\n findMatchingOption: findMatchingOptionHandler,\n initCartOptionSelection: initCartOptionSelectionHandler,\n\n // 스토리지\n initCartKey: initCartKeyHandler,\n getCartKey: getCartKeyHandler,\n clearCartKey: clearCartKeyHandler,\n regenerateCartKey: regenerateCartKeyHandler,\n saveToStorage: saveToStorageHandler,\n loadFromStorage: loadFromStorageHandler,\n initGuestOrderToken: initGuestOrderTokenHandler,\n saveGuestOrderToken: saveGuestOrderTokenHandler,\n clearGuestOrderToken: clearGuestOrderTokenHandler,\n clearGuestTokenOnEntry: clearGuestTokenOnEntryHandler,\n};\n\n/**\n * 핸들러 맵 (handlerMap alias)\n *\n * index.ts에서 import할 때 사용\n */\nexport const handlerMap = handlers;\n\n/**\n * 핸들러 타입 정의 (TypeScript 자동완성용)\n */\nexport type SirsoftBasicHandlers = typeof handlers;\n\n// 개별 핸들러 export (직접 import용)\nexport {\n addSelectedItemIfCompleteHandler,\n updateSelectedItemQuantityHandler,\n removeSelectedItemHandler,\n updateNoOptionQuantityHandler,\n setBlockAdditionalOptionHandler,\n getDisplayPriceHandler,\n formatCurrencyHandler,\n getCurrencySymbol,\n loadPreferredCurrencyHandler,\n savePreferredCurrencyHandler,\n setThemeHandler,\n initThemeHandler,\n // 인증 리다이렉트\n redirectToLoginWithReturnHandler,\n // 게시판 첨부 다운로드\n downloadAttachmentHandler,\n // setLocaleHandler는 엔진 레벨에서 처리하므로 제거됨\n // 장바구니\n toggleCartItemSelectionHandler,\n selectAllCartItemsHandler,\n setCartOptionHandler,\n openCartDeleteModalHandler,\n openCartOptionModalHandler,\n recalculateCartHandler,\n // 장바구니 옵션 변경\n findMatchingOptionHandler,\n initCartOptionSelectionHandler,\n // 스토리지\n initCartKeyHandler,\n getCartKeyHandler,\n clearCartKeyHandler,\n regenerateCartKeyHandler,\n saveToStorageHandler,\n loadFromStorageHandler,\n initGuestOrderTokenHandler,\n saveGuestOrderTokenHandler,\n clearGuestOrderTokenHandler,\n clearGuestTokenOnEntryHandler,\n};\n","/**\n * IDV Modal Launcher (sirsoft-basic)\n *\n * 코어 `IdentityGuardInterceptor` 가 428 응답을 가로채면 호출하는 launcher 입니다.\n *\n * 코어 진입점은 `window.G7Core.identity.*` 를 통해 사용 — 템플릿 IIFE 번들이 코어 모듈을\n * 중복 포함하면서 정적 클래스 상태가 분리되는 사고를 방지합니다 (다음 우편번호 / CKEditor5 와 동일 패턴).\n *\n * 동작 순서:\n * 1. `external_redirect` 분기 — 코어 helper `redirectExternally` 로 위임.\n * 2. `POST /api/identity/challenges` 로 challenge 시작 → `id, expires_at, render_hint, public_payload` 획득.\n * 3. `_global.identityChallenge` 네임스페이스에 verification payload + challenge 응답 병합.\n * 4. 카운트다운 `startInterval` 등록.\n * 5. `openModal: identity-challenge-modal` 디스패치.\n * 6. `createDeferred()` Promise 반환 — 모달이 `resolveIdentityChallenge` 핸들러로 결과 통보 시 resolve.\n *\n * 외부 IDV 플러그인(KCP/PortOne 등) 은 모달 파셜의 `identity_provider_ui:*` Extension Point 슬롯에\n * 자기 컴포넌트 + scripts 를 주입하여 launcher 변경 없이 자기 SDK 를 띄울 수 있습니다.\n */\n\nconst logger = ((window as any).G7Core?.createLogger?.('Template:sirsoft-basic:IdentityLauncher')) ?? {\n log: (...args: unknown[]) => console.log('[Template:sirsoft-basic:IdentityLauncher]', ...args),\n warn: (...args: unknown[]) => console.warn('[Template:sirsoft-basic:IdentityLauncher]', ...args),\n error: (...args: unknown[]) => console.error('[Template:sirsoft-basic:IdentityLauncher]', ...args),\n};\n\n/**\n * 코어가 launcher 에 전달하는 verification payload (런타임 형태).\n * 코어 타입 import 를 피하려고 로컬에 정의 — 실제 형식은 `resources/js/core/identity/types.ts` 와 동일.\n */\ninterface IdentityVerificationTarget {\n email?: string;\n phone?: string;\n}\n\ninterface VerificationPayload {\n policy_key: string;\n purpose: string;\n provider_id?: string | null;\n render_hint?: string | null;\n challenge_start_url?: string;\n redirect_url?: string;\n return_request?: { method: string; url: string; headers_echo?: string[] } | null;\n /** 흐름이 apiCall identity_target 으로 선언한 인증 대상 — 코어 인터셉터가 병합해 전달. */\n target?: IdentityVerificationTarget | null;\n}\n\n/**\n * launcher 가 코어에 돌려주는 결과 타입 (런타임 형태).\n */\ntype VerificationResult =\n | { status: 'verified'; token: string; providerData?: Record }\n | { status: 'pending'; pollUrl: string; pollIntervalMs?: number; expiresAt: string }\n | { status: 'cancelled' }\n | { status: 'failed'; failureCode: string; reason?: string };\n\n/**\n * 인증 대상(이메일·전화)을 결정합니다.\n *\n * 우선순위 (필드별 보충 머지 — email/phone 각각 첫 비어있지 않은 값 채택):\n * 1. `payload.target` — 흐름이 apiCall `identity_target` 으로 선언한 값 (범용 진입점, 비로그인 흐름의 핵심)\n * 2. 로그인 사용자 세션 (`currentUser` / `user` / `auth.user` 의 email·phone)\n * 3. (하위호환) signup/password_reset 폼 — `identity_target` 미선언 기존 레이아웃 대비\n *\n * 흐름별 폼 경로 하드코딩을 폐기하고 선언값을 1순위로 둠으로써, 주문/게시판/임의 액션 어떤 흐름이든\n * 레이아웃이 `identity_target` 만 선언하면 launcher 변경 없이 동작한다.\n *\n * 반환값은 launcher 에서 두 곳에 사용:\n * 1) 첫 POST /api/identity/challenges body 에 동봉\n * 2) `_global.identityChallenge.target` 에 저장 — 모달 재전송 액션이 같은 target 을 재사용\n *\n * @param payload 코어 인터셉터가 전달한 verification payload (target 병합 포함)\n * @returns 인증 대상 또는 null (email·phone 둘 다 없으면 — 로그인 사용자는 서버 세션 도출)\n */\nfunction resolveTarget(payload: VerificationPayload): IdentityVerificationTarget | null {\n const G7Core = (window as any).G7Core;\n const local = G7Core?.state?.getLocal?.() ?? {};\n const global = G7Core?.state?.getGlobal?.() ?? G7Core?.state?.get?.() ?? {};\n\n const pick = (...candidates: Array): string | undefined =>\n candidates.find((v): v is string => typeof v === 'string' && v.length > 0);\n\n const email = pick(\n payload.target?.email,\n global?.currentUser?.email,\n global?.user?.email,\n global?.auth?.user?.email,\n payload.purpose === 'signup' ? local?.registerForm?.email : undefined,\n payload.purpose === 'password_reset' ? local?.passwordResetForm?.email : undefined,\n payload.purpose === 'password_reset' ? local?.email : undefined,\n );\n\n const phone = pick(\n payload.target?.phone,\n global?.currentUser?.phone,\n global?.user?.phone,\n global?.auth?.user?.phone,\n );\n\n if (!email && !phone) {\n return null;\n }\n\n const target: IdentityVerificationTarget = {};\n if (email) target.email = email;\n if (phone) target.phone = phone;\n return target;\n}\n\n/**\n * Bearer 토큰을 안전하게 추출합니다 (있으면).\n */\nfunction getAuthHeader(): Record {\n const G7Core = (window as any).G7Core;\n const token = G7Core?.api?.getToken?.() ?? null;\n return token ? { Authorization: `Bearer ${token}` } : {};\n}\n\n/**\n * 현재 앱 언어를 Accept-Language 헤더로 추출합니다 (있으면).\n *\n * challenge POST 는 ApiClient 를 우회하는 raw fetch 라, ApiClient 가 모든 요청에\n * 부착하는 `Accept-Language: g7_locale`(ApiClient.ts) 을 여기서 동일하게 부착해야\n * 서버 SetLocale 이 사용자 화면 언어로 IDV 메일을 렌더한다. 누락 시 challenge 요청이\n * 브라우저 기본 언어로 전송되어 메일이 주문 화면 언어와 달라진다(비회원 결제 등).\n */\nfunction getLocaleHeader(): Record {\n try {\n const locale =\n typeof window !== 'undefined' ? window.localStorage?.getItem('g7_locale') : null;\n return locale ? { 'Accept-Language': locale } : {};\n } catch {\n return {};\n }\n}\n\ninterface ChallengeResponseData {\n id: string;\n expires_at: string;\n render_hint: string;\n public_payload?: Record;\n redirect_url?: string;\n /** 허용 최대 시도 횟수 — 0 은 무제한 (popup/SDK 형 provider). 코어 mail provider 는 환경설정값을 반영. */\n max_attempts?: number;\n}\n\n/**\n * `POST /api/identity/challenges` 로 challenge 를 시작합니다.\n *\n * @param payload verification payload\n * @param target launcher 본체에서 1회 계산한 인증 대상 (startChallenge 와 _global 저장이 동일 값 공유)\n */\nasync function startChallenge(\n payload: VerificationPayload,\n target: IdentityVerificationTarget | null,\n): Promise {\n const body: Record = { purpose: payload.purpose };\n if (payload.provider_id) body.provider_id = payload.provider_id;\n if (target) body.target = target;\n\n const url = payload.challenge_start_url || '/api/identity/challenges';\n const res = await fetch(url, {\n method: 'POST',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n ...getLocaleHeader(),\n ...getAuthHeader(),\n },\n body: JSON.stringify(body),\n });\n\n const json = await res.json().catch(() => null);\n if (!res.ok || !json?.success) {\n const msg = json?.message ?? `Challenge 시작 실패 (HTTP ${res.status})`;\n throw new Error(msg);\n }\n\n const data = json.data ?? json;\n return {\n id: data.id,\n expires_at: data.expires_at,\n render_hint: data.render_hint ?? payload.render_hint ?? 'text_code',\n public_payload: data.public_payload,\n redirect_url: data.redirect_url,\n max_attempts: typeof data.max_attempts === 'number' ? data.max_attempts : undefined,\n };\n}\n\n/**\n * sirsoft-basic 의 IDV launcher 본체.\n *\n * 테스트에서 직접 호출할 수 있도록 export (런타임 진입점은 registerSirsoftBasicIdentityLauncher).\n */\nexport async function sirsoftBasicIdentityLauncher(payload: VerificationPayload): Promise {\n const G7Core = (window as any).G7Core;\n const identity = G7Core?.identity;\n\n if (!G7Core?.dispatch || !G7Core?.state || !identity) {\n logger.error('G7Core 또는 G7Core.identity 가 초기화되지 않아 launcher 를 실행할 수 없습니다.');\n return { status: 'failed', failureCode: 'G7_NOT_READY' };\n }\n\n // (1) external_redirect 분기 — 모달 안 띄움\n if (payload.render_hint === 'external_redirect' || payload.redirect_url) {\n return identity.redirectExternally(payload);\n }\n\n // 인증 대상을 1회 계산 — startChallenge body 와 _global.identityChallenge.target 저장이 동일 값 공유\n // (모달 재전송이 같은 target 으로 challenge 재요청). 흐름 선언값(payload.target) 우선.\n const target = resolveTarget(payload);\n\n // (2) Challenge 시작\n let challenge: ChallengeResponseData;\n try {\n challenge = await startChallenge(payload, target);\n } catch (err) {\n logger.error('Challenge 시작 실패:', err);\n try {\n await G7Core.dispatch({\n handler: 'toast',\n params: {\n type: 'error',\n message: err instanceof Error ? err.message : '본인인증 시작에 실패했습니다.',\n },\n });\n } catch {\n /* ignore */\n }\n return {\n status: 'failed',\n failureCode: 'CHALLENGE_START_FAILED',\n reason: err instanceof Error ? err.message : String(err),\n };\n }\n\n // 응답에 redirect_url 이 있으면 외부 redirect 로 분기 (provider 가 link 대신 redirect 결정)\n if (challenge.redirect_url) {\n return identity.redirectExternally({\n ...payload,\n render_hint: 'external_redirect',\n redirect_url: challenge.redirect_url,\n });\n }\n\n // (3) _global.identityChallenge 네임스페이스 setup\n // 위에서 1회 계산한 target 을 재사용 — 모달 재전송 액션이 같은 target 으로 challenge 재요청 가능하게\n const expiresMs = challenge.expires_at ? new Date(challenge.expires_at).getTime() : 0;\n const remainingSeconds = expiresMs > 0 ? Math.max(0, Math.floor((expiresMs - Date.now()) / 1000)) : 0;\n\n // maxAttempts: 백엔드 응답값이 있으면 사용, 없으면 0(무제한 — popup/SDK 형 provider 의 기본).\n // 코어 mail provider 응답에는 환경설정의 max_attempts 가 정확히 반영되므로 화면 카운트도 정합.\n const maxAttempts = typeof challenge.max_attempts === 'number' ? challenge.max_attempts : 0;\n\n G7Core.state.set({\n identityChallenge: {\n policy_key: payload.policy_key,\n purpose: payload.purpose,\n provider_id: payload.provider_id ?? null,\n render_hint: challenge.render_hint,\n challenge_id: challenge.id,\n expires_at: challenge.expires_at,\n public_payload: challenge.public_payload ?? {},\n target: target ?? null,\n code: '',\n error: null,\n attempts: 0,\n maxAttempts,\n remainingSeconds,\n resendCooldown: 0,\n },\n });\n\n // (4) 카운트다운 타이머 — launcher 자체 setInterval 사용\n // startInterval 핸들러는 등록 시점의 dispatch context 를 클로저로 캡처하는데,\n // 직전의 G7Core.state.set 가 React 비동기 setState 라서 캡처된 context 의 _global 에는\n // identityChallenge 가 아직 없을 수 있음(stale). 그러면 매 tick 표현식에서 expires_at 가\n // undefined 로 평가되어 remainingSeconds 가 영원히 0 으로 남음. launcher 클로저에서\n // expiresMs 를 직접 보유하고 G7Core.state.set 만 매 초 호출하면 stale 경로를 우회.\n let currentExpiresMs = expiresMs;\n let resendCooldown = 0;\n const tickHandle = window.setInterval(() => {\n const remaining = currentExpiresMs > 0\n ? Math.max(0, Math.floor((currentExpiresMs - Date.now()) / 1000))\n : 0;\n resendCooldown = Math.max(0, resendCooldown - 1);\n G7Core.state.set({\n identityChallenge: {\n remainingSeconds: remaining,\n resendCooldown,\n },\n });\n }, 1000);\n\n // 모달 재전송 액션이 새 challenge 를 발급하면 expires_at 이 갱신되는데,\n // 그 시점에는 launcher 클로저의 currentExpiresMs 를 동기화해야 카운트다운이 새 만료시각을 따름.\n // G7Core.state.subscribe 로 _global.identityChallenge.expires_at 변경을 감지.\n let unsubscribe: (() => void) | null = null;\n try {\n unsubscribe = G7Core.state.subscribe?.((next: any) => {\n const updated = next?.identityChallenge?.expires_at;\n if (typeof updated === 'string') {\n const ms = new Date(updated).getTime();\n if (Number.isFinite(ms) && ms !== currentExpiresMs) {\n currentExpiresMs = ms;\n }\n }\n const cd = next?.identityChallenge?.resendCooldown;\n if (typeof cd === 'number' && cd > resendCooldown) {\n // 재전송 액션이 _global.identityChallenge.resendCooldown 을 30 으로 set 한 직후 동기화\n resendCooldown = cd;\n }\n }) ?? null;\n } catch {\n /* subscribe 미지원 환경 — 첫 만료시각 기준으로만 카운트다운 */\n }\n\n // (5) deferred Promise 생성 → 모달 open\n const deferred = identity.createDeferred() as Promise;\n try {\n await G7Core.dispatch({\n handler: 'openModal',\n target: 'identity-challenge-modal',\n });\n } catch (e) {\n logger.error('openModal 실패 — 풀페이지로 폴백:', e);\n window.clearInterval(tickHandle);\n unsubscribe?.();\n return identity.redirectExternally({\n ...payload,\n render_hint: 'external_redirect',\n redirect_url: `/identity/challenge?challenge_id=${encodeURIComponent(challenge.id)}&return=${encodeURIComponent(window.location.href)}`,\n });\n }\n\n // (6) 모달이 resolveIdentityChallenge 호출하면 deferred 가 resolve\n const result = await deferred;\n\n // 정리 — 카운트다운 중단 + subscribe 해제\n window.clearInterval(tickHandle);\n unsubscribe?.();\n\n return result;\n}\n\n/**\n * 부트스트랩 시 코어 인터셉터에 launcher 를 등록합니다.\n *\n * `initTemplate()` 의 핸들러 등록 직후에 호출 — `window.G7Core.identity.setLauncher` 를 사용해\n * 코어의 단일 IdentityGuardInterceptor 정적 클래스에 launcher 를 주입합니다.\n */\nexport function registerSirsoftBasicIdentityLauncher(): void {\n const identity = (window as any).G7Core?.identity;\n if (!identity?.setLauncher) {\n logger.warn(\n 'G7Core.identity 가 아직 초기화되지 않아 launcher 등록을 건너뜁니다. 코어 부트스트랩 순서를 확인하세요.'\n );\n return;\n }\n identity.setLauncher(sirsoftBasicIdentityLauncher);\n logger.log('IDV launcher registered (sirsoft-basic)');\n}\n","/**\n * IconPickerWidget.tsx — sirsoft-basic 템플릿 소유 아이콘 피커 위젯\n *\n * 레이아웃 편집기 [속성] 탭에서 아이콘명 prop(`Icon.name`/`IconButton.iconName` 등)을\n * **검색 가능한 그리드 드롭다운**으로 고른다. 값은 아이콘명 문자열(propValue 로\n * `node.props[propKey]` 기록).\n *\n * **소유 경계**: 아이콘 검색 그리드 UI 는 라이브러리(Font Awesome) 종속\n * 지식이므로 **템플릿이 소유**한다. 코어는 icon-picker 위젯을 제공하지 않으며, 본 위젯을\n * `G7Core.layoutEditor.registerWidget('icon-picker', ...)` 로 등록해 사용한다(코어 예약\n * 접수함이 편집기 로드 전 등록도 큐로 보존 → 편집기 로드 시 flush). 카탈로그(`control.icons`)\n * 도 템플릿 editor-spec 이 공급한다. 본 위젯은 Font Awesome 클래스(`fas fa-{value}`)로\n * 프리뷰를 직접 렌더한다(템플릿이 자기 라이브러리를 알기 때문).\n *\n * 카탈로그 미공급 시 자유입력(text) 폴백.\n */\n\nimport React from 'react';\n\n/** 코어 WidgetProps 와 호환되는 최소 형태 — 코어 타입 import 회피(IIFE 번들 분리 안전) */\ninterface IconCatalogEntry {\n value: string;\n label?: string;\n keywords?: string[];\n group?: string;\n preview?: { html?: string; className?: string };\n}\ninterface IconPickerWidgetProps {\n control: { icons?: unknown; iconColumns?: number; iconSearchPlaceholder?: string } & Record<\n string,\n unknown\n >;\n value: unknown;\n onChange: (value: unknown) => void;\n t: (key: string, params?: Record) => string;\n}\n\nfunction readCatalog(control: IconPickerWidgetProps['control']): IconCatalogEntry[] {\n const icons = control.icons;\n if (!Array.isArray(icons)) return [];\n return icons.filter(\n (e): e is IconCatalogEntry =>\n !!e && typeof e === 'object' && typeof (e as IconCatalogEntry).value === 'string',\n );\n}\n\nfunction entryLabel(entry: IconCatalogEntry, t: IconPickerWidgetProps['t']): string {\n const label = entry.label;\n if (typeof label === 'string') return label.startsWith('$t:') ? t(label.slice(3)) : label;\n return entry.value;\n}\n\nfunction matchesQuery(entry: IconCatalogEntry, label: string, q: string): boolean {\n if (q === '') return true;\n const needle = q.toLowerCase();\n if (entry.value.toLowerCase().includes(needle)) return true;\n if (label.toLowerCase().includes(needle)) return true;\n return (entry.keywords ?? []).some((k) => k.toLowerCase().includes(needle));\n}\n\n/** FA 프리뷰 — preview.html → preview.className → `fas fa-{value}` (FA 직접 렌더) → 텍스트 */\nfunction IconPreview({ entry }: { entry: IconCatalogEntry }): React.ReactElement {\n const preview = entry.preview;\n if (preview?.html) {\n return (\n \n );\n }\n if (preview?.className) {\n return ;\n }\n // 템플릿은 자기 라이브러리(Font Awesome)를 알므로 클래스 직접 합성.\n return ;\n}\n\nexport function IconPickerWidget({\n control,\n value,\n onChange,\n t,\n}: IconPickerWidgetProps): React.ReactElement {\n const catalog = readCatalog(control);\n const current = value === undefined || value === null ? '' : String(value);\n const columns = typeof control.iconColumns === 'number' ? control.iconColumns : 6;\n const searchPlaceholderKey = control.iconSearchPlaceholder;\n const searchPlaceholder =\n typeof searchPlaceholderKey === 'string' && searchPlaceholderKey.startsWith('$t:')\n ? t(searchPlaceholderKey.slice(3))\n : t('layout_editor.icon_picker.search_placeholder');\n\n const [query, setQuery] = React.useState('');\n\n // 카탈로그 미공급 → 자유입력 폴백.\n if (catalog.length === 0) {\n return (\n \n onChange(e.target.value === '' ? undefined : e.target.value)}\n style={inputStyle}\n />\n
\n );\n }\n\n const labelOf = (e: IconCatalogEntry): string => entryLabel(e, t);\n const filtered = catalog.filter((e) => matchesQuery(e, labelOf(e), query));\n\n return (\n \n setQuery(e.target.value)}\n style={inputStyle}\n />\n \n onChange(undefined)}\n aria-pressed={current === ''}\n style={current === '' ? cellSelected : cell}\n >\n —\n \n {filtered.map((entry) => {\n const selected = entry.value === current;\n return (\n onChange(entry.value)}\n style={selected ? cellSelected : cell}\n >\n \n \n );\n })}\n
\n {filtered.length === 0 && (\n
\n {t('layout_editor.icon_picker.no_results')}\n
\n )}\n
\n );\n}\n\nconst wrap: React.CSSProperties = { display: 'flex', flexDirection: 'column', gap: 6, width: '100%' };\nconst inputStyle: React.CSSProperties = { padding: '5px 8px', fontSize: 12, border: '1px solid #cbd5e1', borderRadius: 6, width: '100%' };\nconst grid: React.CSSProperties = { display: 'grid', gap: 4, maxHeight: 220, overflowY: 'auto', padding: 2 };\nconst cell: React.CSSProperties = { display: 'flex', alignItems: 'center', justifyContent: 'center', minHeight: 34, padding: 4, border: '1px solid #e2e8f0', borderRadius: 6, background: '#fff', cursor: 'pointer' };\nconst cellSelected: React.CSSProperties = { ...cell, border: '2px solid #2563eb', background: '#eff6ff' };\nconst previewBox: React.CSSProperties = { display: 'inline-flex', alignItems: 'center', justifyContent: 'center', fontSize: 16, lineHeight: 1 };\nconst previewText: React.CSSProperties = { fontSize: 10, color: '#475569', fontFamily: 'monospace', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap', maxWidth: '100%' };\nconst emptyHint: React.CSSProperties = { fontSize: 11, color: '#94a3b8', fontStyle: 'italic', padding: '4px 2px' };\n","/**\n * registerEditorWidgets.ts — sirsoft-basic 편집기 커스텀 위젯 등록\n *\n * 템플릿 부트스트랩(initTemplate)에서 호출. `G7Core.layoutEditor` 는 코어 예약 접수함\n * (stub)이 메인 번들에서 항상 노출하므로, 편집기 셸 로드 전에 호출해도 등록이 큐에\n * 보존되었다가 편집기 로드 시 flush 된다(타이밍 안전).\n *\n * 등록 위젯:\n * - `icon-picker` — Font Awesome 검색 그리드(템플릿 소유 UI, 라이브러리 종속).\n */\n\nimport React from 'react';\nimport { IconPickerWidget } from './IconPickerWidget';\n\nconst logger = (window as any).G7Core?.createLogger?.('Template:sirsoft-basic:EditorWidgets') ?? {\n log: (...a: unknown[]) => console.log('[Template:sirsoft-basic:EditorWidgets]', ...a),\n warn: (...a: unknown[]) => console.warn('[Template:sirsoft-basic:EditorWidgets]', ...a),\n};\n\n/**\n * 편집기 커스텀 위젯을 코어 레지스트리에 등록한다. 멱등 — `G7Core.layoutEditor` 부재(코어\n * 미초기화)면 no-op(다음 호출에서 재시도하거나 stub 이 보존).\n */\nexport function registerSirsoftBasicEditorWidgets(): void {\n if (typeof window === 'undefined') return;\n const layoutEditor = (window as any).G7Core?.layoutEditor;\n if (!layoutEditor?.registerWidget) {\n logger.warn('G7Core.layoutEditor 미노출 — icon-picker 위젯 등록 보류');\n return;\n }\n // 코어 위젯 레지스트리는 React 컴포넌트를 받는다. WidgetProps 형태로 호출됨.\n layoutEditor.registerWidget('icon-picker', IconPickerWidget as React.ComponentType);\n logger.log(\"편집기 위젯 'icon-picker' 등록됨(Font Awesome 검색 그리드)\");\n}\n","// e2e:allow편집기 위젯(icon-picker) 등록을 module-load 시점으로 이동(결함#3, admin 동기 — 직접 하드로드 시 위젯 누락 해소). 단위 회귀는 registerEditorWidgets.test.ts(module-load 등록 + index.ts 최상위 호출 정적 가드).\n/**\n * Sirsoft Basic User Template\n *\n * 그누보드7 템플릿 엔진용 사용자 템플릿 컴포넌트 패키지\n * Nexibase 스타일 기반\n */\n\n// Logger 설정 (G7Core 초기화 전에도 동작하도록 폴백 포함)\nconst logger = ((window as any).G7Core?.createLogger?.('Template:sirsoft-basic')) ?? {\n log: (...args: unknown[]) => console.log('[Template:sirsoft-basic]', ...args),\n warn: (...args: unknown[]) => console.warn('[Template:sirsoft-basic]', ...args),\n error: (...args: unknown[]) => console.error('[Template:sirsoft-basic]', ...args),\n};\n\n// Styles\nimport './styles/main.css';\n\n// Basic Components (Header, Footer는 composite에서 사용하므로 여기서는 별도 이름으로 export)\nexport {\n Button,\n type ButtonProps,\n FileInput,\n type FileInputProps,\n Input,\n type InputProps,\n PasswordInput,\n type PasswordInputProps,\n type PasswordRule,\n defaultPasswordRules,\n availablePasswordRules,\n Textarea,\n type TextareaProps,\n Label,\n type LabelProps,\n Div,\n type DivProps,\n Span,\n type SpanProps,\n P,\n type PProps,\n Img,\n type ImgProps,\n H1,\n type H1Props,\n H2,\n type H2Props,\n H3,\n type H3Props,\n H4,\n type H4Props,\n Ul,\n type UlProps,\n Ol,\n type OlProps,\n Li,\n type LiProps,\n A,\n type AProps,\n Form,\n type FormProps,\n Select,\n type SelectProps,\n Option,\n type OptionProps,\n Optgroup,\n type OptgroupProps,\n Checkbox,\n type CheckboxProps,\n Table,\n type TableProps,\n Thead,\n type TheadProps,\n Tbody,\n type TbodyProps,\n Tr,\n type TrProps,\n Th,\n type ThProps,\n Td,\n type TdProps,\n Nav,\n type NavProps,\n Section,\n type SectionProps,\n Svg,\n type SvgProps,\n Icon,\n type IconProps,\n Code,\n type CodeProps,\n Hr,\n type HrProps,\n IconName,\n type IconStyle,\n type IconSize,\n} from './components/basic';\n\n// Composite Components\nexport * from './components/composite';\n\n// Layout Components\nexport * from './components/layout';\n\n// Template Metadata\nimport templateMetadata from '../template.json';\n\n// Handlers\nimport { handlerMap } from './handlers';\n\n// IDV Modal Launcher (engine-v1.46.0+)\nimport { registerSirsoftBasicIdentityLauncher } from './handlers/identityLauncher';\n\n// 레이아웃 편집기 커스텀 위젯(icon-picker 등) 등록\nimport { registerSirsoftBasicEditorWidgets } from './layout-editor/registerEditorWidgets';\n\n// handlerMap을 전역으로 노출 (로케일 변경 시 재등록용)\nif (typeof window !== 'undefined') {\n (window as any).G7TemplateHandlers = handlerMap;\n}\n\n/**\n * 템플릿 메타데이터 export\n *\n * template.json 파일의 내용을 번들에 포함시켜 API 호출 없이\n * 코어 엔진에서 직접 접근 가능하도록 합니다.\n */\nexport { templateMetadata };\n\n/**\n * 템플릿 초기화 함수\n *\n * 코어 엔진에 커스텀 핸들러를 등록합니다.\n */\nexport function initTemplate(): void {\n // ActionDispatcher가 로드될 때까지 대기 후 핸들러 등록\n if (typeof window !== 'undefined') {\n let retryCount = 0;\n const maxRetries = 50; // 최대 5초 대기 (50 * 100ms)\n\n const registerHandlers = () => {\n const actionDispatcher = (window as any).G7Core?.getActionDispatcher?.();\n\n if (actionDispatcher) {\n // handlerMap의 모든 핸들러를 자동으로 등록\n Object.entries(handlerMap).forEach(([name, handler]) => {\n actionDispatcher.registerHandler(name, handler);\n });\n\n logger.log(`${Object.keys(handlerMap).length} custom handler(s) registered:`, Object.keys(handlerMap));\n\n // IDV Modal Launcher 등록 (window.G7Core.identity.setLauncher 사용)\n registerSirsoftBasicIdentityLauncher();\n } else {\n retryCount++;\n if (retryCount <= maxRetries) {\n logger.warn(`ActionDispatcher not found, retrying... (${retryCount}/${maxRetries})`);\n setTimeout(registerHandlers, 100);\n } else {\n logger.error('Failed to register handlers: ActionDispatcher not available after maximum retries');\n }\n }\n };\n\n // window.load 이벤트 사용 (모든 리소스 로드 완료 후)\n if (document.readyState === 'complete') {\n registerHandlers();\n } else {\n window.addEventListener('load', registerHandlers);\n }\n }\n}\n\n// 레이아웃 편집기 커스텀 위젯(icon-picker) 등록 — 모듈 로드 시점에 즉시 실행한다.\n// ActionDispatcher 가용을 기다리는 `registerHandlers`(window.load\n// 게이트) 안에서 등록하면, 편집기 URL 을 직접 하드로드한 경로에서 등록이 편집기 셸 마운트보다\n// 늦어 icon-picker 위젯이 누락된다(\"Unsupported control\"). `G7Core.layoutEditor` 예약 접수함\n// (ready 큐 stub)은 편집기 로드 전 등록도 큐로 보존했다가 flush 하므로, 핸들러 등록 타이밍과\n// 무관하게 모듈 로드 시 즉시 등록하는 것이 진입 경로(SPA 전환 / 직접 로드)와 무관하게 결정적이다.\nregisterSirsoftBasicEditorWidgets();\n\n// 템플릿 초기화 자동 실행\ninitTemplate();\n"],"names":["G7Core","Button","forwardRef","children","variant","size","className","props","ref","baseClasses","mergedClassName","jsx","Div","React","Span","Svg","Input","label","error","onChange","onKeyPress","value","defaultValue","type","checked","defaultChecked","isCheckableType","isComposingRef","useRef","internalRef","useImperativeHandle","localValue","setLocalValue","useState","useEffect","handleCompositionStart","useCallback","handleCompositionEnd","e","currentValue","changeEvent","handleChange","newValue","handleKeyPress","loadingactions","formdata","validProps","inputProps","FileInput","accept","maxSize","onError","buttonText","placeholder","disabled","inputRef","fileName","setFileName","rootEditorProps","key","val","handleClick","file","errorMsg","handleClear","IconName","iconNameMap","Icon","name","iconStyle","color","spin","pulse","fixedWidth","ariaLabel","style","styleClassMap","rawName","mappedName","iconName","classes","accessibilityLabel","t","params","availablePasswordRules","param","types","defaultPasswordRules","parseRuleString","ruleString","paramStr","rule","PasswordInput","showToggle","showValidation","isConfirmField","confirmTarget","onMatchChange","onValidityChange","rules","enableRules","showRules","wrapperClassName","validationClassName","showPassword","setShowPassword","capsLockOn","setCapsLockOn","internalValue","setInternalValue","parsedRules","useMemo","ruleStr","parsed","displayRules","validationResults","acc","isMatch","isAllValid","v","failedRules","passed","handleToggle","prev","handleKeyEvent","editorRootProps","inputRestProps","k","jsxs","labelParams","Textarea","textareaRef","textareaValueProps","Label","P","Img","alt","H1","H2","H3","H4","Ul","Ol","Li","A","Form","logger","args","getLocaleName","locale","fromAppConfig","Select","options","searchable","searchPlaceholder","editorAttrs","isOpen","setIsOpen","searchTerm","setSearchTerm","dropdownPos","setDropdownPos","containerRef","buttonRef","searchInputRef","dropdownRef","normalizedOptions","selectedLabel","opt","visibleOptions","needle","timer","updateDropdownPos","rect","spaceBelow","openUpward","handleClickOutside","event","target","handleKeyDown","handleSelect","optionValue","hasCustomStyle","hasTextColor","baseButtonClass","rootDomProps","createPortal","option","isSelected","Option","Optgroup","Checkbox","Table","Thead","Tbody","Tr","Th","Td","Nav","Section","Code","Hr","Header","getEffectiveTheme","mode","applyTheme","effectiveTheme","getInitialTheme","savedTheme","ThemeToggle","onThemeChange","autoText","lightText","darkText","id","initialTheme","currentMode","setCurrentMode","showMenu","setShowMenu","menuRef","mediaQuery","handleThemeChange","getCurrentIcon","SIZE_CLASSES","BASE_CONTAINER_CLASSES","WITHDRAWN_CLASSES","INITIAL_BG_CLASSES","Avatar","author","avatar","text","isWithdrawn","isGuest","actualAvatar","actualName","actualIsWithdrawn","actualIsGuest","containerClasses","initialBgClass","renderContent","scopeSlotChildDef","componentDef","containerId","SlotContainer","slotId","emptyContent","slotComponents","setSlotComponents","forceUpdate","getSlotContext","directSlotContext","g7Core","updateSlotComponents","slotContext","getDynamicRenderer","DynamicRenderer","registration","dataContext","parentFormContext","getParentComponentContext","translationContext","scopedDef","NotificationCenter","notifications","unreadCount","hasMore","loading","titleText","emptyText","markAllReadText","deleteAllText","unreadOnlyText","unreadOnly","onNotificationClick","onClose","onLoadMore","onMarkAllRead","onDeleteAll","onDelete","onUnreadOnlyToggle","dropdownAlign","showNotifications","setShowNotifications","notificationRef","scrollRef","sentinelRef","visibleUnreadIdsRef","onLoadMoreRef","hasMoreRef","loadingRef","notificationsCountRef","lastRequestedCountRef","observer","entry","entries","isUnread","item","displayCount","n","handleClose","unreadIds","useLayoutEffect","dropdown","vw","margin","shift","Fragment","notification","navigate","path","logo","siteName","user","cartCount","notificationCount","boards","maxVisibleBoards","onMobileMenuOpen","availableLocales","currentLocale","shopBase","notificationHasMore","notificationLoading","notificationUnreadOnly","notificationTitleText","notificationEmptyText","notificationMarkAllReadText","notificationDeleteAllText","notificationUnreadOnlyText","onNotificationClose","onNotificationLoadMore","onNotificationMarkAllRead","onNotificationDeleteAll","onNotificationDelete","onNotificationUnreadOnlyToggle","searchQuery","setSearchQuery","showUserMenu","setShowUserMenu","showMoreBoards","setShowMoreBoards","showLangMenu","setShowLangMenu","dropdownPosition","setDropdownPosition","currentPath","setCurrentPath","userMenuRef","moreButtonRef","langMenuRef","useResponsive","responsiveValue","isMobile","handlePopState","originalPushState","isActiveRoute","exact","isShopActive","base","getNavButtonClass","isActive","baseClass","visibleBoards","hiddenBoards","handleSearch","handleLogout","handleLocaleChange","HeaderBasic","board","Footer","TABLET_BREAKPOINT","DESKTOP_BREAKPOINT","siteDescription","copyrightText","socialLinks","linkGroups","currentYear","width","isDesktop","gridColumns","defaultLinkGroups","groups","socialIconMap","FooterBasic","url","group","index","link","linkIndex","MobileNav","drawerRef","isPortable","handleEscape","handleOverlayClick","setPrototypeOf","isFrozen","getPrototypeOf","getOwnPropertyDescriptor","freeze","seal","create","apply","construct","x","func","thisArg","_len","_key","Func","_len2","_key2","arrayForEach","unapply","arrayLastIndexOf","arrayPop","arrayPush","arraySplice","stringToLowerCase","stringToString","stringMatch","stringReplace","stringIndexOf","stringTrim","objectHasOwnProperty","regExpTest","typeErrorCreate","unconstruct","_len3","_key3","_len4","_key4","addToSet","set","array","transformCaseFunc","l","element","lcElement","cleanArray","clone","object","newObject","property","lookupGetter","prop","desc","fallbackValue","html$1","svg$1","svgFilters","svgDisallowed","mathMl$1","mathMlDisallowed","html","svg","mathMl","xml","MUSTACHE_EXPR","ERB_EXPR","TMPLIT_EXPR","DATA_ATTR","ARIA_ATTR","IS_ALLOWED_URI","IS_SCRIPT_OR_DATA","ATTR_WHITESPACE","DOCTYPE_NAME","CUSTOM_ELEMENT","EXPRESSIONS","NODE_TYPE","getGlobal","_createTrustedTypesPolicy","trustedTypes","purifyHostElement","suffix","ATTR_NAME","policyName","scriptUrl","_createHooksMap","createDOMPurify","window","DOMPurify","root","document","originalDocument","currentScript","DocumentFragment","HTMLTemplateElement","Node","Element","NodeFilter","NamedNodeMap","HTMLFormElement","DOMParser","ElementPrototype","cloneNode","remove","getNextSibling","getChildNodes","getParentNode","template","trustedTypesPolicy","emptyHTML","implementation","createNodeIterator","createDocumentFragment","getElementsByTagName","importNode","hooks","IS_ALLOWED_URI$1","ALLOWED_TAGS","DEFAULT_ALLOWED_TAGS","ALLOWED_ATTR","DEFAULT_ALLOWED_ATTR","CUSTOM_ELEMENT_HANDLING","FORBID_TAGS","FORBID_ATTR","EXTRA_ELEMENT_HANDLING","ALLOW_ARIA_ATTR","ALLOW_DATA_ATTR","ALLOW_UNKNOWN_PROTOCOLS","ALLOW_SELF_CLOSE_IN_ATTR","SAFE_FOR_TEMPLATES","SAFE_FOR_XML","WHOLE_DOCUMENT","SET_CONFIG","FORCE_BODY","RETURN_DOM","RETURN_DOM_FRAGMENT","RETURN_TRUSTED_TYPE","SANITIZE_DOM","SANITIZE_NAMED_PROPS","SANITIZE_NAMED_PROPS_PREFIX","KEEP_CONTENT","IN_PLACE","USE_PROFILES","FORBID_CONTENTS","DEFAULT_FORBID_CONTENTS","DATA_URI_TAGS","DEFAULT_DATA_URI_TAGS","URI_SAFE_ATTRIBUTES","DEFAULT_URI_SAFE_ATTRIBUTES","MATHML_NAMESPACE","SVG_NAMESPACE","HTML_NAMESPACE","NAMESPACE","IS_EMPTY_INPUT","ALLOWED_NAMESPACES","DEFAULT_ALLOWED_NAMESPACES","MATHML_TEXT_INTEGRATION_POINTS","HTML_INTEGRATION_POINTS","COMMON_SVG_AND_HTML_ELEMENTS","PARSER_MEDIA_TYPE","SUPPORTED_PARSER_MEDIA_TYPES","DEFAULT_PARSER_MEDIA_TYPE","CONFIG","formElement","isRegexOrFunction","testValue","_parseConfig","cfg","ALL_SVG_TAGS","ALL_MATHML_TAGS","_checkValidNamespace","parent","tagName","parentTagName","_forceRemove","node","_removeAttribute","_initDocument","dirty","doc","leadingWhitespace","matches","dirtyPayload","body","_createNodeIterator","_isClobbered","_isNode","_executeHooks","currentNode","data","hook","_sanitizeElements","content","_isBasicCustomElement","parentNode","childNodes","childCount","i","childClone","expr","_isValidAttribute","lcTag","lcName","_sanitizeAttributes","attributes","hookEvent","attr","namespaceURI","attrValue","initValue","_sanitizeShadowDOM","fragment","shadowNode","shadowIterator","importedNode","returnNode","nodeIterator","serializedHTML","tag","entryPoint","hookFunction","purify","usePreferredCurrency","read","state","currency","setCurrency","subscribe","unsubscribe","getStarTypes","avg","rounded","pos","ProductCard","product","onClick","preferredCurrency","getPrice","field","multiCurrencyField","multiCurrencyData","formattedField","displayName","sellingPrice","listPrice","hasDiscount","isNotOnSale","labels","sanitizeHighlight","nameHighlighted","descriptionHtml","identifier","idx","MODULE_CAROUSEL","MODULE_CONTROLLER","MODULE_NAVIGATION","MODULE_NO_SCROLL","MODULE_PORTAL","MODULE_ROOT","MODULE_TOOLBAR","PLUGIN_COUNTER","PLUGIN_FULLSCREEN","PLUGIN_SLIDESHOW","PLUGIN_THUMBNAILS","PLUGIN_ZOOM","SLIDE_STATUS_LOADING","SLIDE_STATUS_PLAYING","SLIDE_STATUS_ERROR","SLIDE_STATUS_COMPLETE","SLIDE_STATUS_PLACEHOLDER","activeSlideStatus","status","ACTIVE_SLIDE_LOADING","ACTIVE_SLIDE_PLAYING","ACTIVE_SLIDE_ERROR","ACTIVE_SLIDE_COMPLETE","CLASS_FULLSIZE","CLASS_FLEX_CENTER","CLASS_NO_SCROLL","CLASS_NO_SCROLL_PADDING","CLASS_SLIDE","CLASS_SLIDE_WRAPPER","CLASS_SLIDE_WRAPPER_INTERACTIVE","ACTION_PREV","ACTION_NEXT","ACTION_SWIPE","ACTION_CLOSE","EVENT_ON_POINTER_DOWN","EVENT_ON_POINTER_MOVE","EVENT_ON_POINTER_UP","EVENT_ON_POINTER_LEAVE","EVENT_ON_POINTER_CANCEL","EVENT_ON_KEY_DOWN","EVENT_ON_KEY_UP","EVENT_ON_WHEEL","VK_ESCAPE","VK_ARROW_LEFT","VK_ARROW_RIGHT","ELEMENT_BUTTON","ELEMENT_ICON","IMAGE_FIT_CONTAIN","IMAGE_FIT_COVER","UNKNOWN_ACTION_TYPE","cssPrefix$3","clsx","cssClass","cssVar","composePrefix","prefix","makeComposePrefix","translateLabel","defaultLabel","_a","translateSlideCounter","slides","getSlideIndex","cleanup","cleaners","cleaner","makeUseContext","contextName","context","ctx","hasWindow","round","decimals","factor","isImageSlide","slide","isImageFitCover","image","imageFit","parseInt","parseLengthPercentage","input","computeSlideRect","containerRect","padding","paddingValue","paddingPixels","devicePixelRatio","slidesCount","hasSlides","getSlide","getSlideIfPresent","getSlideKey","addToolbarButton","toolbar","button","buttons","restToolbar","buttonWithKey","result","calculatePreload","carousel","minimum","isReact19","makeInertWhen","condition","reflow","LightboxDefaultProps","createModule","component","createNode","module","traverseNode","traverse","nodes","withPlugins","plugins","augmentations","config","contains","addParent","append","addChild","precede","addSibling","addModule","replace","augment","augmentation","plugin","A11yContext","useA11yContext","A11yContextProvider","focusWithin","setFocusWithin","autoPlaying","setAutoPlaying","onFocus","onBlur","trackAndDelegate","focusWithinValue","DocumentContext","useDocumentContext","DocumentContextProvider","nodeRef","getOwnerDocument","EventsContext","useEvents","EventsProvider","subscriptions","topic","callback","cb","LightboxPropsContext","useLightboxProps","LightboxPropsProvider","LightboxStateContext","useLightboxState","LightboxDispatchContext","useLightboxDispatch","reducer","action","increment","globalIndex","currentIndex","currentSlide","animation","LightboxStateProvider","dispatch","TimeoutsContext","useTimeouts","TimeoutsProvider","timeouts","tid","removeTimeout","fn","delay","IconButton","renderIcon","rest","styles","buttonLabel","svgIcon","icon","createIcon","glyph","createIconDisabled","CloseIcon","PreviousIcon","NextIcon","LoadingIcon","_","ErrorIcon","useMotionPreference","reduceMotion","setReduceMotion","_b","listener","currentTransformation","y","z","matcher","values","useAnimation","computeAnimation","snapshot","_c","keyframes","duration","easing","onfinish","err","currentSnapshot","useContainerRect","observerRef","setContainerRect","updateContainerRect","parse","useDelay","timeoutId","setTimeout","clearTimeout","useEventCallback","setRef","useForkRef","refA","refB","refValue","useLoseFocus","focus","focused","useRTL","isRTL","setIsRTL","useSensors","subscribers","notifySubscribers","registerSensors","subscribeSensors","listeners","el","useThrottle","lastCallbackTime","delayCallback","executeCallback","slidePrefix","slideImagePrefix","ImageSlide","offset","render","imageProps","onLoad","_d","_e","_f","_g","_h","setStatus","publish","imageRef","handleLoading","img","setImageRef","handleOnLoad","handleOnError","cover","nonInfinite","fallback","maxWidth","maxHeight","defaultStyle","srcSet","a","b","estimateActualWidth","sizes","imagePropsStyle","imagePropsClassName","restImageProps","LightboxRoot","trackFocusWithin","SwipeState","usePointerEvents","onPointerDown","onPointerMove","onPointerUp","Gesture","SWIPE_THRESHOLD","usePointerSwipe","disableSwipeNavigation","closeOnBackdropClick","isSwipeValid","containerWidth","swipeAnimationDuration","onSwipeStart","onSwipeProgress","onSwipeFinish","onSwipeCancel","pullUpEnabled","pullDownEnabled","onPullStart","onPullProgress","onPullFinish","onPullCancel","pointers","activePointer","startTime","gesture","clearPointer","currentPointers","p","addPointer","lookupPointer","pointerId","exceedsPullThreshold","threshold","pointer","currentOffset","isCurrentPointer","deltaX","deltaY","startGesture","newGesture","usePreventWheelDefaults","preventDefaultWheelX","preventDefaultWheelY","horizontal","useWheelSwipe","swipeState","intent","intentCleanup","resetCleanup","wheelInertia","wheelInertiaCleanup","cancelSwipeIntentCleanup","cancelSwipeResetCleanup","handleCleanup","handleCancelSwipe","currentSwipeOffset","onWheel","setWheelInertia","inertia","currentSwipeIntent","newSwipeOffset","cssContainerPrefix","ControllerContext","useController","Controller","controller","on","closeOnPullUp","closeOnPullDown","toolbarWidth","setToolbarWidth","setSwipeState","swipeOffset","pullOffset","pullOpacity","cleanupAnimationIncrement","cleanupSwipeOffset","cleanupPullOffset","setContainerRef","handleContainerRef","carouselRef","setCarouselRef","rtl","getLightboxProps","getLightboxState","next","close","setSwipeOffset","setPullOffset","offsetValue","preparePullAnimation","translate","pull","cancel","prepareAnimation","isAnimationPlaying","parsedSpacing","spacingValue","swipe","swipeDuration","swipeEasing","direction","count","newSwipeState","newSwipeAnimationDuration","elapsedTime","expectedTime","swipeParams","pullParams","focusOnMount","onViewCallback","ControllerModule","cssPrefix$2","cssSlidePrefix","CarouselSlide","slideRect","offscreen","renderSlide","rendered","Placeholder","Carousel","preload","items","CarouselModule","useNavigationState","prevDisabled","nextDisabled","useKeyboardNavigation","throttle","NavigationButton","Navigation","buttonPrev","buttonNext","iconPrev","iconNext","NavigationModule","noScroll","noScrollPadding","isHTMLElement","padScrollbar","computedValue","originalValue","NoScroll","getOwnerWindow","ownerWindow","documentElement","scrollbar","elements","clean","NoScrollModule","cssPrefix$1","setAttribute","attribute","previousValue","Portal","portal","mounted","setMounted","visible","setVisible","restoreFocus","animationDuration","handleEnter","handleRef","PortalModule","Root","RootModule","cssPrefix","Toolbar","buttonClose","iconClose","renderCloseButton","ToolbarModule","renderNode","child","mergeAnimation","defaultAnimation","defaultAnimationEasing","restDefaultAnimation","restAnimation","Lightbox","restProps","defaultCarousel","defaultRender","defaultToolbar","defaultController","defaultNoScroll","defaultOn","defaultSlides","defaultIndex","defaultPlugins","restDefaultProps","defaultZoomProps","validateMinZoom","minZoom","resolveZoomProps","zoom","useZoomAnimation","offsetX","offsetY","zoomWrapperRef","zoomAnimation","zoomAnimationStart","zoomAnimationDuration","playZoomAnimation","useZoomCallback","onZoomCallback","useZoomProps","useZoomImageRect","imageDimensions","imageRect","maxImageRect","maxZoomPixelRatio","height","maxZoom","distance","pointerA","pointerB","scaleZoom","delta","clamp","useZoomSensors","zoomIn","zoomOut","changeZoom","changeOffsets","activePointers","lastPointerDown","pinchZoom","keyboardMoveDistance","zoomInMultiplier","wheelZoomDistanceFactor","scrollToZoom","doubleTapDelay","doubleClickDelay","doubleClickMaxStops","pinchZoomDistanceFactor","pinchZoomV4","translateCoordinates","pageX","pageY","scrollX","scrollY","left","top","onKeyDown","metaKey","ctrlKey","meta","preventDefault","move","replacePointer","timeStamp","targetZoom","initialDistance","currentDistance","coordinate","cleanupSensors","useZoomState","setZoom","setOffsetX","setOffsetY","animate","currentSource","dx","dy","newZoom","newOffsetX","newOffsetY","maxOffsetX","maxOffsetY","rapid","handleControllerRectChange","ZoomControllerContext","useZoom","ZoomContextProvider","zoomWrapper","setZoomWrapper","zoomRef","ZoomInIcon","ZoomOutIcon","ZoomButton","onLoseFocus","wasEnabled","wasFocused","zoomInCallback","zoomOutCallback","zoomDisabled","ZoomButtonsGroup","zoomInRef","zoomOutRef","focusSibling","sibling","focusZoomIn","focusZoomOut","ZoomToolbarControl","isResponsiveImageSlide","current","source","ResponsiveImage","interactive","targetWidth","pixelDensity","handleResize","targetSource","handlePreload","currentPreload","ZoomWrapper","setImageDimensions","slideProps","Zoom","zoomProps","defaultCounterProps","resolveCounterProps","counter","CounterComponent","separator","legacyClassName","legacyRest","Counter","defaultSlideshowProps","resolveSlideshowProps","slideshow","SlideshowContext","useSlideshow","SlideshowContextProvider","finite","autoplay","wasPlaying","playing","setPlaying","scheduler","slideStatus","play","pause","cancelScheduler","scheduleNextSlide","onSlideshowStart","onSlideshowStop","PlayIcon","PauseIcon","SlideshowButton","focusListeners","Slideshow","defaultFullscreenProps","resolveFullscreenProps","fullscreen","FullscreenContext","useFullscreen","FullscreenContextProvider","fullscreenProps","auto","setDisabled","setFullscreen","wasFullscreen","ownerDocument","getFullscreenElement","fullscreenElement","enter","container","exit","onEnterFullscreen","onExitFullscreen","handleAutoFullscreen","EnterFullscreenIcon","ExitFullscreenIcon","FullscreenButton","Fullscreen","defaultThumbnailsProps","resolveThumbnailsProps","thumbnails","useThumbnailsProps","cssThumbnailPrefix","VideoThumbnailIcon","UnknownThumbnailIcon","renderThumbnail","customThumbnail","imageSlideProps","thumbnailIconClass","activePrefix","fadeInPrefix","fadeOutPrefix","placeholderPrefix","DELAY","DURATION","Thumbnail","fadeIn","fadeOut","active","onLoseFocusCallback","isHorizontal","position","boxSize","dimension","getThumbnailKey","thumbnail","poster","ThumbnailsTrack","track","border","borderStyle","borderColor","borderRadius","gap","vignette","handleControllerSwipe","animationOffset","trackRect","slideIndex","fadeAnimationDuration","ThumbnailsContext","useThumbnails","ThumbnailsContextProvider","hidden","thumbnailsIcon","ThumbnailsVisible","ThumbnailsHidden","ThumbnailsButton","show","hide","Thumbnails","thumbnailsProps","I","downloadAuthenticatedFile","filename","blob","objectUrl","downloadFile","executeImageDownload","downloadUrl","DownloadButton","onDownload","isDownloading","setIsDownloading","handleDownload","ImageGallery","images","startIndex","enableZoom","enableSlideshow","enableFullscreen","showCounter","showDownload","showThumbnails","setCurrentIndex","currentIndexRef","currentImage","previewImages","useImageGallery","setImages","setStartIndex","openGallery","galleryImages","closeGallery","getImageSrc","ProductImageViewer","selectedIndex","setSelectedIndex","galleryProps","QuantitySelector","min","max","handleDecrease","handleIncrease","handleInputChange","clampedValue","handleInputBlur","isMinDisabled","isMaxDisabled","REACTION_CONFIGS","PostReactions","reactions","userReaction","postId","onReact","sizeClasses","emojiSizes","getReactionCount","r","RichTextEditor","initialValue","imageUploadUrl","minHeight","editorRef","setContent","showCodeView","setShowCodeView","showLinkModal","setShowLinkModal","linkUrl","setLinkUrl","applyFormat","format","handleImageUpload","formData","response","handleFileSelect","insertLink","toolbarButtons","headingButtons","listButtons","btn","HtmlContent","isHtml","purifyConfig","actualContent","textClasses","defaultConfig","sanitizedHtml","match","before","href","after","HtmlEditor","isHtmlProp","onIsHtmlChange","rows","showHtmlModeToggle","contentClassName","htmlFieldName","readOnly","setIsHtml","localContent","setLocalContent","previewMode","setPreviewMode","handleContentChange","newContent","handleHtmlModeChange","isHtmlMode","handlePreviewModeToggle","ExpandableContent","expandText","collapseText","isExpanded","setIsExpanded","needsExpand","setNeedsExpand","contentRef","checkHeight","scrollHeight","toggleExpand","resolvedExpandText","resolvedCollapseText","Modal","title","iconClassName","closeOnOverlayClick","showCloseButton","closeOnEscape","shouldCloseOnBackdrop","modalRef","previousFocusRef","focusableElements","firstElement","lastElement","handleTab","zIndex","ConfirmDialog","message","confirmText","cancelText","onConfirm","onCancel","confirmButtonVariant","_cancelButtonVariant","_closeOnOverlay","isLoading","loadingText","resolvedConfirmText","resolvedCancelText","resolvedLoadingText","handleConfirm","handleCancel","confirmVariantClassMap","FileUploaderContext","createContext","FileUploaderProvider","useFileUploaderContext","useContext","_mergeNamespaces","copyExifWithoutOrientation","getApp1Segment","o","s","f","c","UZIP","u","h","d","g","m","w","E","F","B","U","C","Q","M","S","R","T","O","H","L","pushV","UPNG","decodeImage","_getBPP","_decompress","_inflate","_filterZero","_paeth","_IHDR","_copyTile","addErr","N","D","dither","_main","compressPNG","compress","_prepareDiff","_updateFrame","quantize","_filterLine","getKDtree","getNearest","planeDst","stats","estats","splitPixels","vecDot","set16","set32","seek","convert","CustomFile","CustomFileReader","getFilefromDataUrl","getDataUrlFromFile","loadImage","getBrowserName","approximateBelowMaximumCanvasSizeOfBrowser","getNewCanvasAndCtx","drawImageInCanvas","isIOS","drawFileInCanvas","$Try_2_Post","$Try_2_Catch","$Try_3_Catch","canvasToFile","$If_4","$If_5","$If_6","cleanupCanvasMemory","isAutoOrientationInBrowser","getExifOrientation","handleMaxWidthOrHeight","followExifOrientation","incProgress","setProgress","$If_2","$Loop_3","$Loop_3_exit","compressOnWebWorker","imageCompression","$Try_1_Catch","formatFileSize","bytes","units","extractErrorMessage","axiosError","firstError","getFileIcon","mimeType","useFileUploader","attachmentableType","attachmentableId","collection","maxFiles","maxConcurrentUploads","compressionOptions","roleIds","autoUpload","initialFiles","endpoints","onFilesChange","onUploadComplete","onUploadError","onRemove","onReorder","uploadTriggerEvent","confirmBeforeRemove","uploadParams","existingFiles","setExistingFiles","pendingFiles","setPendingFiles","isDragOver","setIsDragOver","activeUploadsRef","deletedIdsRef","uploadedFilesRef","confirmDialogOpen","setConfirmDialogOpen","itemToDelete","setItemToDelete","isDeleting","setIsDeleting","hasReorderedRef","customOrder","setCustomOrder","prevInitialFilesRef","galleryOpen","setGalleryOpen","galleryStartIndex","setGalleryStartIndex","galleryKeyRef","authenticatedImageUrls","setAuthenticatedImageUrls","authenticatedImageUrlsRef","stableInitialFiles","filteredFiles","initialIds","sessionUploaded","compressImage","compressionOpts","handleFiles","selectedFiles","totalCount","remainingSlots","filesToAdd","overflow","ext","accepted","mimePrefix","pendingFile","compressedBlob","uploadSingleFile","fileToUpload","roleId","progressEvent","progress","errorMessage","handleUploadAll","filesToUpload","uploadedAttachments","pendingToHashMap","uploadQueue","processQueue","attachment","pendingId","invalidMsg","workers","allExisting","updatedOrder","orderMap","ordered","aOrder","bOrder","executeRemoveAttachment","deleteUrl","itemKey","handleRemove","handleRetry","handleDragEnd","arrayMove","sortable_esm","over","combined","orderedItems","aKey","bKey","oldIndex","newIndex","reordered","newExisting","newPending","reorderedFiles","orderData","imageFiles","handleOpenGallery","imageIndex","cancelled","existingImageFiles","currentIds","ImageGallery$1","allItems","hasFiles","canAddMore","clear","getPendingFiles","FileDropZone","onFiles","useCombinedRefs","refs","canUseDOM","isWindow","elementString","isNode","getWindow","_target$ownerDocument","_target$ownerDocument2","isDocument","Document","isSVGElement","useIsomorphicLayoutEffect","useEvent","handler","handlerRef","useInterval","intervalRef","useLatestValue","dependencies","valueRef","useLazyMemo","useNodeRef","onChangeHandler","setNodeRef","usePrevious","ids","useUniqueId","createAdjustmentFn","modifier","adjustments","accumulator","adjustment","valueAdjustment","add","subtract","hasViewportRelativeCoordinates","isKeyboardEvent","KeyboardEvent","isTouchEvent","TouchEvent","getEventCoordinates","CSS","transform","scaleX","scaleY","_ref","SELECTOR","findFirstFocusableNode","hiddenStyles","HiddenText","LiveRegion","announcement","ariaLiveType","visuallyHidden","useAnnouncement","setAnnouncement","DndMonitorContext","useDndMonitor","registerListener","useDndMonitorProvider","_listener$type","defaultScreenReaderInstructions","defaultAnnouncements","_ref2","_ref3","_ref4","Accessibility","announcements","hiddenTextDescribedById","screenReaderInstructions","announce","liveRegionId","_ref5","_ref6","markup","Action","noop","useSensor","sensor","sensors","defaultCoordinates","distanceBetween","p1","p2","sortCollisionsAsc","sortCollisionsDesc","cornersOfRectangle","getFirstCollision","collisions","firstCollision","centerOfRectangle","closestCenter","collisionRect","droppableRects","droppableContainers","centerRect","droppableContainer","distBetween","closestCorners","corners","rectCorners","distances","corner","effectiveDistance","getIntersectionRatio","right","bottom","targetArea","entryArea","intersectionArea","intersectionRatio","rectIntersection","adjustScale","rect1","rect2","getRectDelta","createRectAdjustmentFn","getAdjustedRect","parseTransform","transformArray","inverseTransform","transformOrigin","parsedTransform","translateX","translateY","defaultOptions","getClientRect","getTransformAgnosticClientRect","getWindowClientRect","isFixed","computedStyle","isScrollable","overflowRegex","getScrollableAncestors","limit","scrollParents","findScrollableAncestors","getFirstScrollableAncestor","firstScrollableAncestor","getScrollableElement","getScrollXCoordinate","getScrollYCoordinate","getScrollCoordinates","Direction","isDocumentScrollingElement","getScrollPosition","scrollingContainer","minScroll","dimensions","maxScroll","isTop","isLeft","isBottom","isRight","defaultThreshold","getScrollDirectionAndSpeed","scrollContainer","scrollContainerRect","acceleration","thresholdPercentage","speed","getScrollElementRect","innerWidth","innerHeight","getScrollOffsets","scrollableAncestors","getScrollXOffset","getScrollYOffset","scrollIntoViewIfNeeded","measure","properties","Rect","scrollOffsets","axis","keys","getScrollOffset","currentOffsets","scrollOffsetsDeltla","Listeners","_this$target","eventName","_this$target2","getEventListenerTarget","EventTarget","hasExceededDistance","measurement","EventName","stopPropagation","KeyboardCode","defaultKeyboardCodes","defaultKeyboardCoordinateGetter","currentCoordinates","KeyboardSensor","activeNode","onStart","keyboardCodes","coordinateGetter","scrollBehavior","code","newCoordinates","coordinatesDelta","scrollDelta","scrollElementRect","clampedCoordinates","canScrollX","canScrollY","newScrollCoordinates","canScrollToNewCoordinates","coordinates","onMove","onEnd","onActivation","activator","isDistanceConstraint","constraint","isDelayConstraint","AbstractPointerSensor","events","listenerTarget","_getEventCoordinates","activationConstraint","bypassActivationConstraint","onPending","initialCoordinates","_getEventCoordinates2","activated","onAbort","_this$document$getSel","PointerSensor","events$1","MouseButton","MouseSensor","events$2","TouchSensor","touches","AutoScrollActivator","TraversalOrder","useAutoScroller","canScroll","draggingRect","enabled","interval","order","pointerCoordinates","scrollableAncestorRects","scrollIntent","useScrollIntent","setAutoScrollInterval","clearAutoScrollInterval","scrollSpeed","scrollDirection","scrollContainerRef","autoScroll","scrollLeft","scrollTop","sortedScrollableAncestors","defaultScrollIntent","previousDelta","previousIntent","useCachedNode","draggableNodes","draggableNode","cachedNode","useCombineActivators","getSyntheticHandler","Sensor","sensorActivators","MeasuringStrategy","MeasuringFrequency","useDroppableMeasuring","containers","dragging","queue","setQueue","frequency","strategy","containersRef","isDisabled","disabledRef","measureDroppableContainers","map","useInitialValue","computeFn","useInitialRect","useMutationObserver","handleMutations","mutationObserver","MutationObserver","useResizeObserver","resizeObserver","ResizeObserver","defaultMeasure","useRect","fallbackRect","setRect","measureRect","currentRect","newRect","records","record","useRectDelta","initialRect","defaultValue$1","useScrollableAncestors","previousNode","ancestors","useScrollOffsets","scrollCoordinates","setScrollCoordinates","prevElements","handleScroll","scrollingElement","previousElements","scrollableElement","useScrollOffsetsDelta","initialScrollOffsets","hasScrollOffsets","useSensorSetup","teardownFns","teardown","useSyntheticListeners","useWindowRect","defaultValue$2","useRects","windowRect","rects","setRects","measureRects","getMeasurableNode","firstChild","useDragOverlayMeasuring","handleNodeChange","defaultSensors","defaultData","defaultMeasuringConfiguration","DroppableContainersMap","_super$get","_this$get$node$curren","_this$get","defaultPublicContext","defaultInternalContext","InternalContext","PublicContext","getInitialState","RestoreFocus","activatorEvent","previousActivatorEvent","previousActiveId","activatorNode","focusableNode","applyModifiers","modifiers","useMeasuringConfiguration","useLayoutShiftScrollCompensation","initialized","rectDelta","ActiveDraggableContext","Status","DndContext","memo","_sensorContext$curren","_dragOverlay$nodeRef$","_dragOverlay$rect","_over$rect","accessibility","collisionDetection","measuring","store","useReducer","dispatchMonitorEvent","registerMonitorListener","isInitialized","activeId","activeRects","_node$data","activeRef","activeSensor","setActiveSensor","setActivatorEvent","latestProps","draggableDescribedById","enabledDroppableContainers","measuringConfiguration","measuringScheduled","activationCoordinates","autoScrollOptions","getAutoScrollerOptions","initialActiveNodeRect","activeNodeRect","containerNodeRect","sensorContext","overNode","dragOverlay","draggingNode","draggingNodeRect","usesDragOverlay","nodeRectDelta","modifiedTranslate","scrollAdjustment","activeNodeScrollDelta","scrollAdjustedTranslate","overId","setOver","appliedTranslate","activeSensorRef","instantiateSensor","sensorInstance","onDragAbort","onDragPending","onDragStart","unstable_batchedUpdates","createHandler","cancelDrop","bindActivatorToSensorInstantiator","nativeEvent","activeDraggableNode","activationContext","activators","onDragMove","onDragOver","overContainer","publicContext","internalContext","activeSensorDisablesAutoscroll","autoScrollGloballyDisabled","NullContext","defaultRole","ID_PREFIX","useDraggable","ariaDescribedById","role","roleDescription","tabIndex","isDragging","setActivatorNodeRef","dataRef","memoizedAttributes","useDndContext","ID_PREFIX$1","defaultResizeObserverConfig","useDroppable","resizeObserverConfig","previous","resizeObserverConnected","callbackId","resizeObserverDisabled","updateMeasurementsFor","resizeObserverTimeout","newElement","previousElement","from","to","newArray","getSortedRects","isValidIndex","itemsEqual","normalizeDisabled","rectSortingStrategy","activeIndex","overIndex","newRects","oldRect","Context","SortableContext","userDefinedItems","disabledProp","useDragOverlay","previousItemsRef","itemsHaveChanged","disableTransforms","contextValue","defaultNewIndexGetter","defaultAnimateLayoutChanges","isSorting","wasDragging","previousItems","previousContainerId","transition","defaultTransition","transitionProperty","disabledTransition","defaultAttributes","useDerivedTransform","derivedTransform","setDerivedtransform","previousIndex","initial","useSortable","animateLayoutChanges","userDefinedAttributes","localDisabled","customData","getNewIndex","localStrategy","globalDisabled","sortedRects","globalStrategy","normalizeLocalDisabled","itemsAfterCurrentSortable","isOver","setDroppableNodeRef","setDraggableNodeRef","displaceItem","shouldDisplaceDragSource","dragSourceDisplacement","finalTransform","shouldAnimateLayoutChanges","getTransition","_localDisabled$dragga","_localDisabled$droppa","hasSortableData","directions","sortableKeyboardCoordinates","filteredContainers","closestId","activeDroppable","newDroppable","newNode","hasDifferentScrollAncestors","hasSameContainer","isSameContainer","isAfterActive","isAfter","rectCoordinates","SortableThumbnailItem","onRetry","onImageClick","isPrimary","onPrimaryClick","isPending","isUploading","isCompressing","hasError","preview","isImage","authenticatedImageUrl","setAuthenticatedImageUrl","isMounted","existingImageUrl","FileList","onDragEnd","onAddClick","enablePrimarySelection","primaryFileId","onPrimaryChange","isExisting","EMPTY_FILES","EMPTY_ROLE_IDS","FileUploader","confirmRemoveTitle","confirmRemoveMessage","apiEndpoints","callbackRef","wrappedOnFilesChange","files","uploader","pendingItem","attachmentItem","SocialIcon","provider","PROVIDER_CONFIGS","SocialLoginButtons","providers","handleSocialLogin","callbackUrl","getButtonText","providerName","filteredProviders","getTranslation","defaultIconMap","typeStyleMap","positionClassMap","Toast","toasts","visibleToasts","setVisibleToasts","prevState","toast","effectiveDuration","ToastItemComponent","isVisible","typeStyle","hideTranslate","PageTransitionIndicator","setIsPending","transitionManager","newIsPending","PageTransitionBlur","TAILWIND_BREAKPOINTS","DISPLAY_CLASSES","LAYOUT_CONTAINERS","TEXT_COMPONENTS","INPUT_COMPONENTS","MEDIA_COMPONENTS","COMPOSITE_SKELETONS","animClass","iterCount","filterChildren","withIf","withoutIf","positiveIf","isNegativeCondition","areMutuallyExclusiveBranches","pickRichestBranch","positive","ifExpr","trimmed","branches","baseExpressions","branch","orMatch","first","best","curr","countDescendants","sum","resolveExpressions","ternaryMatch","sanitizeClassName","sanitized","num","resolveLayoutProps","directionMap","justify","justifyMap","align","alignMap","wrap","wrapMap","cols","getAnimationClass","renderChildren","renderSkeletonNode","resolveClassName","baseClassName","resolveResponsiveDisplay","tokens","displayEntries","otherClasses","token","responsiveMatch","cls","effectiveDisplay","resolvedClassName","extractArbitraryGridCols","iteration","rawClassName","layoutClasses","exprResolved","responsive","barClass","renderedChildren","gridResult","sanitizedLeafClass","heightMap","widthMap","spacing","borderClass","PageSkeleton","components","PageLoading","isDark","bgColor","spinnerColor","textColor","Pagination","currentPage","totalPages","onPageChange","maxVisiblePages","showFirstLast","prevText","nextText","pageNumbers","pages","halfVisible","startPage","endPage","handlePageClick","page","handlePrevious","handleNext","pageNum","SearchBar","controlledValue","onSubmit","showButton","suggestions","onSuggestionClick","showSuggestions","resolvedPlaceholder","isFocused","setIsFocused","previousValueRef","shouldShowSuggestions","handleSuggestionClick","suggestion","syntheticEvent","handleSubmit","avatarSizeMap","AvatarUploader","src","fallbackText","uploadEndpoint","deleteEndpoint","onUploadSuccess","onDeleteSuccess","onDeleteError","showDeleteButton","uploadButtonText","deleteButtonText","confirmDelete","deleteConfirmMessage","confirmUpload","uploadConfirmMessage","uploadSuccessActions","uploadErrorActions","deleteSuccessActions","deleteErrorActions","setIsUploading","localAvatarUrl","setLocalAvatarUrl","setErrorMessage","showDeleteConfirm","setShowDeleteConfirm","showUploadConfirm","setShowUploadConfirm","setPendingFile","previewUrl","setPreviewUrl","inputId","getCsrfToken","getAuthToken","executeUpload","csrfToken","authToken","errorData","handleFileChange","maxBytes","executeDelete","handleDeleteClick","handleDeleteCancel","handleUploadCancel","handleUploadConfirm","currentAvatarUrl","hasAvatar","avatarSize","isConfirmMode","renderButtons","getG7Core","LAYOUT_CLASSES","createDefaultMenuItems","SubText","UserInfo","userId","subText","subTextTitle","showDropdown","clickable","profilePath","layout","menuItems","hideMenuItems","appendMenuItems","actualUserId","menuPosition","setMenuPosition","actualProfilePath","containerClass","isInsideContainer","isInsideDropdown","handleScrollOrResize","getMenuItems","updateMenuPosition","buttonRect","handleMenuItemClick","finalMenuItems","defaultColorClass","nameButtonClass","TabNavigation","tabs","activeTabId","onTabChange","hiddenTabIds","mobileBreakpoint","handleTabClick","tab","handleSelectChange","selectedId","numericId","finalId","selectedTab","visibleTabs","getTabClasses","navClasses","compositeComponents","Header$1","Footer$1","MobileNav$1","SlotContainer$1","NotificationCenter$1","ProductCard$1","ProductImageViewer$1","QuantitySelector$1","PostReactions$1","RichTextEditor$1","HtmlContent$1","HtmlEditor$1","ExpandableContent$1","ConfirmDialog$1","SocialLoginButtons$1","Toast$1","PageTransitionIndicator$1","PageTransitionBlur$1","PageSkeleton$1","PageLoading$1","ThemeToggle$1","Pagination$1","SearchBar$1","Avatar$1","AvatarUploader$1","UserInfo$1","Modal$1","TabNavigation$1","Container","Grid","rowGap","colGap","autoRows","autoCols","flow","autoRowsMap","autoColsMap","flowMap","Flex","grow","shrink","SectionLayout","subtitle","background","centered","shadow","paddingMap","backgroundMap","maxWidthMap","shadowMap","BaseSection","ThreeColumnLayout","leftWidth","rightWidth","leftSlot","centerSlot","rightSlot","leftStyle","centerStyle","rightStyle","CURRENCY_CONFIGS","formatPrice","amount","currencyCode","recalcMultiCurrencyTotal","unitPriceMap","quantity","additionalUnitKrw","krwUnit","unitValue","additionalConverted","total","buildSelectedTotalMultiCurrency","totals","mc","computeAdditionalOptionsTotal","selections","valueId","getGroupKey","getOptionValueByGroupKey","optionValues","optionValuesLocalized","groupKey","convertOptionValuesToRecord","findMatchingOption","optionGroups","currentSelection","selectedValue","addSelectedItemIfCompleteHandler","selectedOptionItems","matchedOption","optionKey","unitPrice","optionLabels","additionalOptionGroups","additionalOptionSelections","additionalOptionsTotal","blockUnitTotal","newItem","nextItems","updateSelectedItemQuantityHandler","itemIndex","newQuantity","updatedItems","totalPrice","setBlockAdditionalOptionHandler","additionalOptionId","isCustomTextMode","customTexts","removeSelectedItemHandler","updateNoOptionQuantityHandler","setLocalState","updates","getLocalState","getGlobalState","showToast","refetchCartItems","selectedItems","toggleCartItemSelectionHandler","_context","itemId","currentSelected","newSelected","allSelected","selectAllCartItemsHandler","allItemIds","setCartOptionHandler","optionName","currentOptions","openCartDeleteModalHandler","targetIds","openCartOptionModalHandler","targetItem","recalculateCartHandler","selectedOptions","findMatchingOptionHandler","initCartOptionSelectionHandler","currentOptionValues","valuesArray","CART_KEY_STORAGE_NAME","CART_KEY_API_ENDPOINT","GUEST_ORDER_TOKEN_STORAGE_NAME","GUEST_ORDER_NUMBER_STORAGE_NAME","GUEST_ORDER_EXPIRES_AT_STORAGE_NAME","issueCartKeyFromApi","setGlobalState","getCurrentUser","g7Config","initCartKeyHandler","_action","cartKey","getCartKeyHandler","clearCartKeyHandler","regenerateCartKeyHandler","newCartKey","saveToStorageHandler","loadFromStorageHandler","clearGuestOrderTokenInternal","initGuestOrderTokenHandler","expiresAt","expired","expiryTs","existing","saveGuestOrderTokenHandler","orderNumber","clearGuestOrderTokenHandler","clearGuestTokenOnEntryHandler","getDisplayPriceHandler","priceField","formatCurrencyHandler","customLocale","formatted","getCurrencySymbol","STORAGE_KEY","DEFAULT_CURRENCY","loadPreferredCurrencyHandler","defaultCurrency","stored","isValidCurrency","savePreferredCurrencyHandler","VALID_THEMES","initTheme","theme","initThemeHandler","targetTheme","setThemeHandler","validTheme","redirectToLoginWithReturnHandler","returnUrl","downloadAttachmentHandler","handlerMap","resolveTarget","payload","local","global","pick","candidates","email","phone","getAuthHeader","getLocaleHeader","startChallenge","res","json","msg","sirsoftBasicIdentityLauncher","identity","challenge","expiresMs","remainingSeconds","maxAttempts","currentExpiresMs","resendCooldown","tickHandle","remaining","updated","ms","cd","deferred","registerSirsoftBasicIdentityLauncher","readCatalog","control","icons","entryLabel","matchesQuery","q","IconPreview","previewBox","IconPickerWidget","catalog","columns","searchPlaceholderKey","query","setQuery","inputStyle","labelOf","filtered","grid","cellSelected","cell","previewText","selected","emptyHint","registerSirsoftBasicEditorWidgets","layoutEditor","initTemplate","retryCount","maxRetries","registerHandlers","actionDispatcher"],"mappings":"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","x_google_ignoreList":[45,47,48,49,50,51,52,53,66,70,71,72,73]} \ No newline at end of file +{"version":3,"file":"components.iife.js","sources":["../../src/components/basic/Button.tsx","../../src/components/basic/Div.tsx","../../src/components/basic/Span.tsx","../../src/components/basic/Svg.tsx","../../src/components/basic/Input.tsx","../../src/components/basic/FileInput.tsx","../../src/components/basic/IconTypes.ts","../../src/components/basic/Icon.tsx","../../src/components/basic/PasswordInput.tsx","../../src/components/basic/Textarea.tsx","../../src/components/basic/Label.tsx","../../src/components/basic/P.tsx","../../src/components/basic/Img.tsx","../../src/components/basic/H1.tsx","../../src/components/basic/H2.tsx","../../src/components/basic/H3.tsx","../../src/components/basic/H4.tsx","../../src/components/basic/Ul.tsx","../../src/components/basic/Ol.tsx","../../src/components/basic/Li.tsx","../../src/components/basic/A.tsx","../../src/components/basic/Form.tsx","../../src/components/basic/Select.tsx","../../src/components/basic/Option.tsx","../../src/components/basic/Optgroup.tsx","../../src/components/basic/Checkbox.tsx","../../src/components/basic/Table.tsx","../../src/components/basic/Thead.tsx","../../src/components/basic/Tbody.tsx","../../src/components/basic/Tr.tsx","../../src/components/basic/Th.tsx","../../src/components/basic/Td.tsx","../../src/components/basic/Nav.tsx","../../src/components/basic/Section.tsx","../../src/components/basic/Code.tsx","../../src/components/basic/Hr.tsx","../../src/components/basic/Header.tsx","../../src/components/composite/ThemeToggle.tsx","../../src/components/composite/Avatar.tsx","../../src/components/composite/SlotContainer.tsx","../../src/components/composite/NotificationCenter.tsx","../../src/components/composite/Header.tsx","../../src/components/basic/Footer.tsx","../../src/components/composite/Footer.tsx","../../src/components/composite/MobileNav.tsx","../../node_modules/dompurify/dist/purify.es.mjs","../../src/components/composite/ProductCard.tsx","../../node_modules/yet-another-react-lightbox/dist/types.js","../../node_modules/yet-another-react-lightbox/dist/index.js","../../node_modules/yet-another-react-lightbox/dist/plugins/zoom/index.js","../../node_modules/yet-another-react-lightbox/dist/plugins/counter/index.js","../../node_modules/yet-another-react-lightbox/dist/plugins/slideshow/index.js","../../node_modules/yet-another-react-lightbox/dist/plugins/fullscreen/index.js","../../node_modules/yet-another-react-lightbox/dist/plugins/thumbnails/index.js","../../src/components/basic/I.tsx","../../src/components/composite/ImageGallery.tsx","../../src/components/composite/ProductImageViewer.tsx","../../src/components/composite/QuantitySelector.tsx","../../src/components/composite/PostReactions.tsx","../../src/components/composite/RichTextEditor.tsx","../../src/components/composite/HtmlContent.tsx","../../src/components/composite/HtmlEditor.tsx","../../src/components/composite/ExpandableContent.tsx","../../src/components/composite/Modal.tsx","../../src/components/composite/ConfirmDialog.tsx","../../src/components/composite/FileUploader/FileUploaderContext.tsx","../../node_modules/browser-image-compression/dist/browser-image-compression.mjs","../../src/components/composite/FileUploader/utils.ts","../../src/components/composite/FileUploader/useFileUploader.ts","../../src/components/composite/FileUploader/FileDropZone.tsx","../../node_modules/@dnd-kit/utilities/dist/utilities.esm.js","../../node_modules/@dnd-kit/accessibility/dist/accessibility.esm.js","../../node_modules/@dnd-kit/core/dist/core.esm.js","../../node_modules/@dnd-kit/sortable/dist/sortable.esm.js","../../src/components/composite/FileUploader/SortableThumbnailItem.tsx","../../src/components/composite/FileUploader/FileList.tsx","../../src/components/composite/FileUploader/FileUploader.tsx","../../src/components/composite/SocialLoginButtons.tsx","../../src/components/composite/Toast.tsx","../../src/components/composite/PageTransitionIndicator.tsx","../../src/components/composite/PageTransitionBlur.tsx","../../src/components/composite/PageSkeleton.tsx","../../src/components/composite/PageLoading.tsx","../../src/components/composite/Pagination.tsx","../../src/components/composite/SearchBar.tsx","../../src/components/composite/AvatarUploader.tsx","../../src/components/composite/UserInfo.tsx","../../src/components/composite/TabNavigation.tsx","../../src/components/composite/index.ts","../../src/components/layout/Container.tsx","../../src/components/layout/Grid.tsx","../../src/components/layout/Flex.tsx","../../src/components/layout/SectionLayout.tsx","../../src/components/layout/ThreeColumnLayout.tsx","../../src/handlers/productOptions.ts","../../src/handlers/cartHandlers.ts","../../src/handlers/cartOptionChange.ts","../../src/handlers/storageHandlers.ts","../../src/handlers/getDisplayPrice.ts","../../src/handlers/formatCurrency.ts","../../src/handlers/loadPreferredCurrency.ts","../../src/handlers/setThemeHandler.ts","../../src/handlers/redirectToLoginWithReturn.ts","../../src/handlers/downloadAttachment.ts","../../src/handlers/index.ts","../../src/handlers/identityLauncher.ts","../../src/layout-editor/IconPickerWidget.tsx","../../src/layout-editor/registerEditorWidgets.ts","../../src/index.ts"],"sourcesContent":["import React, { forwardRef } from 'react';\n\n// G7Core 전역 객체의 스타일 헬퍼 접근\nconst G7Core = () => (window as any).G7Core;\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes {\n variant?: 'primary' | 'secondary' | 'danger' | 'success';\n size?: 'sm' | 'md' | 'lg';\n}\n\n/**\n * 기본 버튼 컴포넌트\n */\nexport const Button = forwardRef(({\n children,\n variant = 'primary',\n size = 'md',\n className = '',\n ...props\n}, ref) => {\n const baseClasses = 'inline-flex items-center justify-center';\n\n // G7Core.style.mergeClasses를 사용하여 충돌하는 Tailwind 클래스 병합\n const mergedClassName = G7Core()?.style?.mergeClasses?.(baseClasses, className)\n ?? `${baseClasses} ${className}`;\n\n return (\n \n {children}\n \n );\n});\n\nButton.displayName = 'Button';\n","import React from 'react';\n\nexport interface DivProps extends React.HTMLAttributes {\n ref?: React.Ref;\n}\n\n/**\n * 기본 div 컴포넌트\n */\nexport const Div = React.forwardRef(({\n children,\n className = '',\n ...props\n}, ref) => {\n return (\n \n {children}\n
\n );\n});\n","import React from 'react';\n\nexport interface SpanProps extends React.HTMLAttributes {}\n\n/**\n * 기본 span 컴포넌트\n */\nexport const Span: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface SvgProps extends React.SVGAttributes {}\n\n/**\n * 기본 svg 컴포넌트\n */\nexport const Svg: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React, { useRef, useCallback, useState, useEffect, forwardRef, useImperativeHandle } from 'react';\n\nexport interface InputProps extends React.InputHTMLAttributes {\n label?: string;\n error?: string;\n}\n\n/**\n * 기본 입력 필드 컴포넌트\n *\n * IME(한글 등) 조합 중에는 외부 onChange 이벤트를 발생시키지 않습니다.\n * 내부 로컬 상태를 사용하여 입력을 처리하고, 조합이 완료되면 외부에 알립니다.\n *\n * forwardRef를 사용하여 외부에서 ref로 input 요소에 접근할 수 있습니다.\n * 예: indeterminate 상태 설정 시 ref.current.indeterminate = true\n */\nexport const Input = forwardRef(({\n label,\n error,\n className = '',\n onChange,\n onKeyPress,\n value,\n defaultValue,\n type = 'text',\n checked,\n defaultChecked,\n ...props\n}, ref) => {\n // radio/checkbox 타입인지 확인\n const isCheckableType = type === 'radio' || type === 'checkbox';\n\n // IME 조합 중인지 추적 (text input에만 필요)\n const isComposingRef = useRef(false);\n // input 요소 참조\n const internalRef = useRef(null);\n\n // 외부 ref와 내부 ref를 연결\n useImperativeHandle(ref, () => internalRef.current as HTMLInputElement);\n\n // 내부 로컬 값 (IME 조합 중에도 화면에 표시됨) - text input에만 사용\n const [localValue, setLocalValue] = useState(\n (value as string) ?? (defaultValue as string) ?? ''\n );\n\n // 외부 value prop이 변경되면 로컬 값도 동기화 (text input에만 적용)\n useEffect(() => {\n if (!isCheckableType && !isComposingRef.current && value !== undefined) {\n setLocalValue(value as string);\n }\n }, [value, isCheckableType]);\n\n const handleCompositionStart = useCallback(() => {\n isComposingRef.current = true;\n }, []);\n\n const handleCompositionEnd = useCallback(\n (e: React.CompositionEvent) => {\n isComposingRef.current = false;\n // 조합 완료 후 onChange 이벤트 발생\n if (onChange) {\n // 현재 input의 실제 값을 사용\n const currentValue = (e.target as HTMLInputElement).value;\n setLocalValue(currentValue);\n\n // 새로운 ChangeEvent 생성\n const changeEvent = new Event('change', { bubbles: true }) as unknown as React.ChangeEvent;\n Object.defineProperty(changeEvent, 'target', {\n writable: false,\n value: { value: currentValue },\n });\n Object.defineProperty(changeEvent, 'currentTarget', {\n writable: false,\n value: { value: currentValue },\n });\n\n onChange(changeEvent);\n }\n },\n [onChange]\n );\n\n const handleChange = useCallback(\n (e: React.ChangeEvent) => {\n const newValue = e.target.value;\n // 항상 로컬 값은 업데이트 (화면에 입력이 보이도록)\n setLocalValue(newValue);\n\n // IME 조합 중이면 외부 onChange를 호출하지 않음\n if (isComposingRef.current) {\n return;\n }\n if (onChange) {\n onChange(e);\n }\n },\n [onChange]\n );\n\n const handleKeyPress = useCallback(\n (e: React.KeyboardEvent) => {\n // IME 조합 중이면 keypress 무시 (Enter 등)\n if (isComposingRef.current) {\n return;\n }\n if (onKeyPress) {\n onKeyPress(e);\n }\n },\n [onKeyPress]\n );\n\n // HTML 표준 속성이 아닌 것들을 필터링 (템플릿 엔진 내부 속성)\n const { loadingactions, formdata, ...validProps } = props as any;\n\n // radio/checkbox: checked 속성 사용\n // text input: value 속성 사용 (IME 처리 포함)\n if (isCheckableType) {\n return (\n \n );\n }\n\n // text input: controlled/uncontrolled 구분\n const inputProps = value !== undefined\n ? { value: localValue }\n : { defaultValue };\n\n return (\n \n );\n});\n\n// displayName 설정 (React DevTools에서 컴포넌트 이름 표시)\nInput.displayName = 'Input';","// e2e:allow편집기 passthrough 결함#2 수정(admin 동기, data-editor-*/id 를 시각적 루트 Div 로 라우팅). 단위 회귀는 FileInput.test.tsx passthrough describe.\nimport React, { forwardRef, useRef, useCallback, useState } from 'react';\nimport { Div } from './Div';\nimport { Span } from './Span';\nimport { Svg } from './Svg';\nimport { Input } from './Input';\nimport { Button } from './Button';\n\nexport interface FileInputProps extends Omit, 'type' | 'onChange' | 'onError'> {\n /** 허용되는 파일 확장자 (예: \".zip,.pdf\") */\n accept?: string;\n /** 최대 파일 크기 (MB) */\n maxSize?: number;\n /** 파일 선택 시 콜백 */\n onChange?: (file: File | null) => void;\n /** 에러 발생 시 콜백 */\n onError?: (error: string) => void;\n /** 버튼 텍스트 */\n buttonText?: string;\n /** 빈 상태 텍스트 */\n placeholder?: string;\n}\n\n/**\n * 파일 업로드 입력 컴포넌트\n *\n * ZIP 파일 등의 파일 업로드를 처리하며, 파일 크기 검증을 지원합니다.\n */\nexport const FileInput = forwardRef(({\n accept,\n maxSize,\n onChange,\n onError,\n buttonText = 'Browse',\n placeholder = 'No file selected',\n className = '',\n disabled,\n ...props\n}, ref) => {\n const internalRef = useRef(null);\n const inputRef = (ref as React.RefObject) || internalRef;\n const [fileName, setFileName] = useState('');\n\n // 레이아웃 편집기 식별 표식(data-editor-*) 과 DOM id 는 시각적 루트(
)에 부착해야\n // 캔버스에서 선택/편집이 닿는다. basic 컴포넌트라 DynamicRenderer 가 개별 data-editor-*\n // 키를 props 로 주입하는데, 숨겨진 는 0×0 이라 식별 표식이 닿아도\n // 선택 불가. 식별/표식 키만 분리해 루트로 보낸다.\n const rootEditorProps: Record = {};\n const inputProps: Record = {};\n Object.entries(props as Record).forEach(([key, val]) => {\n if (key.startsWith('data-editor-') || key === 'id' || key === 'onMouseMove' || key === 'onMouseLeave') {\n rootEditorProps[key] = val;\n } else {\n inputProps[key] = val;\n }\n });\n\n const handleClick = useCallback(() => {\n if (!disabled && inputRef.current) {\n inputRef.current.click();\n }\n }, [disabled, inputRef]);\n\n const handleChange = useCallback((e: React.ChangeEvent) => {\n const file = e.target.files?.[0] || null;\n\n if (!file) {\n setFileName('');\n onChange?.(null);\n return;\n }\n\n // 파일 크기 검증 (MB 단위)\n if (maxSize && file.size > maxSize * 1024 * 1024) {\n const errorMsg = `File size exceeds ${maxSize}MB limit`;\n onError?.(errorMsg);\n // 입력 초기화\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n setFileName('');\n return;\n }\n\n setFileName(file.name);\n onChange?.(file);\n }, [maxSize, onChange, onError, inputRef]);\n\n const handleClear = useCallback((e: React.MouseEvent) => {\n e.stopPropagation();\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n setFileName('');\n onChange?.(null);\n }, [onChange, inputRef]);\n\n return (\n
\n \n \n {buttonText}\n \n \n {fileName || placeholder}\n \n {fileName && !disabled && (\n \n \n \n \n \n )}\n
\n );\n});\n\nFileInput.displayName = 'FileInput';\n","/**\n * Font Awesome 아이콘 스타일\n */\nexport type IconStyle = 'solid' | 'regular' | 'light' | 'duotone' | 'brands';\n\n/**\n * Font Awesome 아이콘 크기\n */\nexport type IconSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2x' | '3x' | '4x' | '5x';\n\n/**\n * 자주 사용되는 Font Awesome 아이콘 이름\n *\n * @example\n * // 사용 예시\n * \n * \n * \n */\nexport enum IconName {\n // 사용자 및 계정\n User = 'fa-user',\n Users = 'fa-users',\n UserCircle = 'fa-user-circle',\n UserPlus = 'fa-user-plus',\n UserMinus = 'fa-user-minus',\n UserShield = 'fa-user-shield',\n\n // 액션 아이콘\n Search = 'fa-search',\n Edit = 'fa-edit',\n Pencil = 'fa-pencil-alt',\n Trash = 'fa-trash',\n Save = 'fa-save',\n Plus = 'fa-plus',\n Minus = 'fa-minus',\n Check = 'fa-check',\n Times = 'fa-times',\n Download = 'fa-download',\n Upload = 'fa-upload',\n Copy = 'fa-copy',\n ExternalLink = 'fa-external-link-alt',\n\n // 네비게이션\n Home = 'fa-home',\n ChevronLeft = 'fa-chevron-left',\n ChevronRight = 'fa-chevron-right',\n ChevronUp = 'fa-chevron-up',\n ChevronDown = 'fa-chevron-down',\n AngleLeft = 'fa-angle-left',\n AngleRight = 'fa-angle-right',\n AngleUp = 'fa-angle-up',\n AngleDown = 'fa-angle-down',\n ArrowUp = 'fa-arrow-up',\n ArrowDown = 'fa-arrow-down',\n ArrowLeft = 'fa-arrow-left',\n ArrowRight = 'fa-arrow-right',\n Bars = 'fa-bars',\n EllipsisVertical = 'fa-ellipsis-v',\n EllipsisHorizontal = 'fa-ellipsis-h',\n\n // 상태 아이콘\n CheckCircle = 'fa-check-circle',\n TimesCircle = 'fa-times-circle',\n ExclamationCircle = 'fa-exclamation-circle',\n ExclamationTriangle = 'fa-exclamation-triangle',\n InfoCircle = 'fa-info-circle',\n QuestionCircle = 'fa-question-circle',\n XCircle = 'fa-times-circle',\n\n // 이커머스\n ShoppingCart = 'fa-shopping-cart',\n ShoppingBag = 'fa-shopping-bag',\n CreditCard = 'fa-credit-card',\n Tag = 'fa-tag',\n Tags = 'fa-tags',\n\n // 파일 및 문서\n File = 'fa-file',\n FileAlt = 'fa-file-alt',\n Folder = 'fa-folder',\n FolderOpen = 'fa-folder-open',\n\n // 통신\n Envelope = 'fa-envelope',\n Phone = 'fa-phone',\n Comment = 'fa-comment',\n Comments = 'fa-comments',\n\n // 설정\n Cog = 'fa-cog',\n Cogs = 'fa-cogs',\n Settings = 'fa-cog',\n Wrench = 'fa-wrench',\n Sliders = 'fa-sliders-h',\n\n // 미디어\n Image = 'fa-image',\n Images = 'fa-images',\n Video = 'fa-video',\n Camera = 'fa-camera',\n\n // 소셜\n Heart = 'fa-heart',\n Star = 'fa-star',\n ThumbsUp = 'fa-thumbs-up',\n ThumbsDown = 'fa-thumbs-down',\n Share = 'fa-share',\n\n // 시간\n Clock = 'fa-clock',\n Calendar = 'fa-calendar',\n CalendarAlt = 'fa-calendar-alt',\n\n // 기타\n Lock = 'fa-lock',\n Unlock = 'fa-unlock',\n Eye = 'fa-eye',\n EyeSlash = 'fa-eye-slash',\n Bell = 'fa-bell',\n Flag = 'fa-flag',\n Map = 'fa-map',\n MapMarker = 'fa-map-marker-alt',\n Globe = 'fa-globe',\n Link = 'fa-link',\n Unlink = 'fa-unlink',\n Sun = 'fa-sun',\n Moon = 'fa-moon',\n\n // 차트 및 통계\n ChartBar = 'fa-chart-bar',\n ChartLine = 'fa-chart-line',\n ChartPie = 'fa-chart-pie',\n ChartArea = 'fa-chart-area',\n\n // 스피너 (로딩)\n Spinner = 'fa-spinner',\n CircleNotch = 'fa-circle-notch',\n\n // 배지 아이콘\n CheckBadge = 'fa-badge-check',\n\n // 알림 관련\n BellSlash = 'fa-bell-slash',\n\n // 문서/책 관련\n BookOpen = 'fa-book-open',\n\n // 건물/주소 관련\n Building = 'fa-building',\n\n // 파일 관련\n FileCircleCheck = 'fa-file-circle-check',\n\n // 마법 관련\n WandMagicSparkles = 'fa-wand-magic-sparkles',\n\n // 사용자 관련\n UserXmark = 'fa-user-xmark',\n\n // 확장 시스템 (모듈/플러그인)\n Cube = 'fa-cube',\n Cubes = 'fa-cubes',\n Plug = 'fa-plug',\n PuzzlePiece = 'fa-puzzle-piece',\n\n // 추가 아이콘 (Lucide 호환)\n Fire = 'fa-fire',\n CommentDots = 'fa-comment-dots',\n DollarSign = 'fa-dollar-sign',\n Bars2 = 'fa-bars',\n X = 'fa-times',\n List = 'fa-list',\n ThLarge = 'fa-th-large',\n Inbox = 'fa-inbox',\n Box = 'fa-box',\n PaperPlane = 'fa-paper-plane',\n FileText = 'fa-file-alt',\n Paperclip = 'fa-paperclip',\n Truck = 'fa-truck',\n Sync = 'fa-sync',\n RotateLeft = 'fa-rotate-left',\n MapPin = 'fa-map-marker-alt',\n HelpCircle = 'fa-question-circle',\n}\n\n/**\n * 문자열 아이콘 이름을 IconName enum으로 매핑합니다.\n * JSON 레이아웃에서 문자열로 아이콘 이름을 지정할 때 사용합니다.\n */\nexport const iconNameMap: Record = {\n // 사용자 및 계정\n 'user': IconName.User,\n 'users': IconName.Users,\n 'user-circle': IconName.UserCircle,\n 'user-plus': IconName.UserPlus,\n 'user-minus': IconName.UserMinus,\n 'user-shield': IconName.UserShield,\n\n // 액션 아이콘\n 'search': IconName.Search,\n 'edit': IconName.Edit,\n 'pencil': IconName.Pencil,\n 'trash': IconName.Trash,\n 'save': IconName.Save,\n 'plus': IconName.Plus,\n 'minus': IconName.Minus,\n 'check': IconName.Check,\n 'times': IconName.Times,\n 'download': IconName.Download,\n 'upload': IconName.Upload,\n 'copy': IconName.Copy,\n 'external-link': IconName.ExternalLink,\n\n // 네비게이션\n 'home': IconName.Home,\n 'chevron-left': IconName.ChevronLeft,\n 'chevron-right': IconName.ChevronRight,\n 'chevron-up': IconName.ChevronUp,\n 'chevron-down': IconName.ChevronDown,\n 'angle-left': IconName.AngleLeft,\n 'angle-right': IconName.AngleRight,\n 'angle-up': IconName.AngleUp,\n 'angle-down': IconName.AngleDown,\n 'arrow-up': IconName.ArrowUp,\n 'arrow-down': IconName.ArrowDown,\n 'arrow-left': IconName.ArrowLeft,\n 'arrow-right': IconName.ArrowRight,\n 'bars': IconName.Bars,\n 'ellipsis-vertical': IconName.EllipsisVertical,\n 'ellipsis-v': IconName.EllipsisVertical,\n 'ellipsis-horizontal': IconName.EllipsisHorizontal,\n 'ellipsis-h': IconName.EllipsisHorizontal,\n\n // 상태 아이콘\n 'check-circle': IconName.CheckCircle,\n 'times-circle': IconName.TimesCircle,\n 'x-circle': IconName.XCircle,\n 'exclamation-circle': IconName.ExclamationCircle,\n 'exclamation-triangle': IconName.ExclamationTriangle,\n 'info-circle': IconName.InfoCircle,\n 'question-circle': IconName.QuestionCircle,\n\n // 이커머스\n 'shopping-cart': IconName.ShoppingCart,\n 'shopping-bag': IconName.ShoppingBag,\n 'credit-card': IconName.CreditCard,\n 'tag': IconName.Tag,\n 'tags': IconName.Tags,\n\n // 파일 및 문서\n 'file': IconName.File,\n 'file-alt': IconName.FileAlt,\n 'folder': IconName.Folder,\n 'folder-open': IconName.FolderOpen,\n\n // 통신\n 'envelope': IconName.Envelope,\n 'phone': IconName.Phone,\n 'comment': IconName.Comment,\n 'comments': IconName.Comments,\n\n // 설정\n 'cog': IconName.Cog,\n 'cogs': IconName.Cogs,\n 'settings': IconName.Settings,\n 'wrench': IconName.Wrench,\n 'sliders': IconName.Sliders,\n\n // 미디어\n 'image': IconName.Image,\n 'images': IconName.Images,\n 'video': IconName.Video,\n 'camera': IconName.Camera,\n\n // 소셜\n 'heart': IconName.Heart,\n 'star': IconName.Star,\n 'thumbs-up': IconName.ThumbsUp,\n 'thumbs-down': IconName.ThumbsDown,\n 'share': IconName.Share,\n\n // 시간\n 'clock': IconName.Clock,\n 'calendar': IconName.Calendar,\n 'calendar-alt': IconName.CalendarAlt,\n\n // 기타\n 'lock': IconName.Lock,\n 'unlock': IconName.Unlock,\n 'eye': IconName.Eye,\n 'eye-slash': IconName.EyeSlash,\n 'bell': IconName.Bell,\n 'flag': IconName.Flag,\n 'map': IconName.Map,\n 'map-marker': IconName.MapMarker,\n 'globe': IconName.Globe,\n 'link': IconName.Link,\n 'unlink': IconName.Unlink,\n 'sun': IconName.Sun,\n 'moon': IconName.Moon,\n\n // 차트 및 통계\n 'chart-bar': IconName.ChartBar,\n 'chart-line': IconName.ChartLine,\n 'chart-pie': IconName.ChartPie,\n 'chart-area': IconName.ChartArea,\n\n // 스피너 (로딩)\n 'spinner': IconName.Spinner,\n 'circle-notch': IconName.CircleNotch,\n\n // 배지 아이콘\n 'check-badge': IconName.CheckBadge,\n 'badge-check': IconName.CheckBadge,\n\n // 확장 시스템 (모듈/플러그인)\n 'cube': IconName.Cube,\n 'cubes': IconName.Cubes,\n 'plug': IconName.Plug,\n 'puzzle-piece': IconName.PuzzlePiece,\n\n // Lucide 호환 아이콘 매핑\n 'flame': IconName.Fire,\n 'fire': IconName.Fire,\n 'message-square': IconName.CommentDots,\n 'dollar-sign': IconName.DollarSign,\n 'menu': IconName.Bars,\n 'x': IconName.X,\n 'list': IconName.List,\n 'layout-grid': IconName.ThLarge,\n 'th-large': IconName.ThLarge,\n 'grid': IconName.ThLarge,\n 'inbox': IconName.Inbox,\n 'package': IconName.Box,\n 'box': IconName.Box,\n 'send': IconName.PaperPlane,\n 'paper-plane': IconName.PaperPlane,\n 'file-text': IconName.FileText,\n 'paperclip': IconName.Paperclip,\n 'truck': IconName.Truck,\n 'refresh-cw': IconName.Sync,\n 'sync': IconName.Sync,\n 'undo-2': IconName.RotateLeft,\n 'rotate-left': IconName.RotateLeft,\n 'map-pin': IconName.MapPin,\n 'help-circle': IconName.HelpCircle,\n\n // 추가 Lucide 호환 아이콘 매핑\n 'alert-triangle': IconName.ExclamationTriangle,\n 'bell-off': IconName.BellSlash,\n 'book-open': IconName.BookOpen,\n 'building': IconName.Building,\n 'edit-2': IconName.Edit,\n 'edit-3': IconName.Edit,\n 'file-check': IconName.FileCircleCheck,\n 'mail': IconName.Envelope,\n 'sparkles': IconName.WandMagicSparkles,\n 'trash-2': IconName.Trash,\n 'user-x': IconName.UserXmark,\n};\n","import React from 'react';\nimport { IconName, IconStyle, IconSize, iconNameMap } from './IconTypes';\n\nexport interface IconProps extends Omit, 'style'> {\n /**\n * 아이콘 이름 (Font Awesome 클래스명 또는 IconName enum)\n *\n * @example\n * // 문자열로 직접 지정\n * \n *\n * // enum 사용 (타입 안전)\n * \n */\n name: string | IconName;\n\n /**\n * 아이콘 스타일 (Font Awesome 5/6)\n *\n * - solid: fas (기본값)\n * - regular: far\n * - light: fal\n * - duotone: fad\n * - brands: fab\n */\n iconStyle?: IconStyle;\n\n /**\n * CSS 스타일 객체 (HTML style 속성)\n */\n style?: React.CSSProperties;\n\n /**\n * 아이콘 크기\n *\n * @default 'md'\n */\n size?: IconSize;\n\n /**\n * 색상 (Tailwind 클래스 또는 CSS 색상)\n */\n color?: string;\n\n /**\n * 회전 애니메이션 활성화\n */\n spin?: boolean;\n\n /**\n * 펄스 애니메이션 활성화 (8단계 회전)\n */\n pulse?: boolean;\n\n /**\n * 고정 너비 (아이콘 정렬 시 유용)\n */\n fixedWidth?: boolean;\n\n /**\n * 접근성 레이블 (자동 생성 가능)\n */\n ariaLabel?: string;\n}\n\n/**\n * Font Awesome 아이콘 컴포넌트\n *\n * Font Awesome 5/6 버전과 호환되며 다양한 props를 지원합니다.\n *\n * @example\n * // 기본 사용\n * \n *\n * // enum 사용 (타입 안전)\n * \n *\n * // 스타일 및 크기 지정\n * \n *\n * // 애니메이션\n * \n * \n *\n * // 색상 지정\n * \n *\n * // 접근성\n * \n */\nexport const Icon: React.FC = ({\n name,\n iconStyle = 'solid',\n size,\n color,\n spin = false,\n pulse = false,\n fixedWidth = false,\n ariaLabel,\n className = '',\n style,\n ...props\n}) => {\n // Font Awesome 스타일 클래스 매핑\n const styleClassMap: Record = {\n solid: 'fas',\n regular: 'far',\n light: 'fal',\n duotone: 'fad',\n brands: 'fab',\n };\n\n // 아이콘 이름 처리: iconNameMap을 사용하여 Lucide 스타일 이름을 FontAwesome으로 변환\n const rawName = typeof name === 'string' ? name : String(name);\n const mappedName = iconNameMap[rawName];\n // 매핑된 이름이 있으면 사용, 없으면 원본 사용 후 'fa-' 접두사 제거\n const iconName = mappedName\n ? String(mappedName).replace(/^fa-/, '')\n : rawName.replace(/^fa-/, '');\n\n // 클래스 조합\n const classes = [\n styleClassMap[iconStyle],\n `fa-${iconName}`,\n size && `fa-${size}`,\n spin && 'fa-spin',\n pulse && 'fa-pulse',\n fixedWidth && 'fa-fw',\n color,\n className,\n ]\n .filter(Boolean)\n .join(' ');\n\n // 접근성: ariaLabel이 없으면 name에서 생성\n const accessibilityLabel = ariaLabel || iconName.replace(/-/g, ' ');\n\n return (\n \n );\n};\n","import React, { useState, useCallback, forwardRef, useImperativeHandle, useRef, useEffect, useMemo } from 'react';\nimport { Icon } from './Icon';\n\n// G7Core.t() 번역 함수 참조\nconst t = (key: string, params?: Record) =>\n (window as unknown as { G7Core?: { t?: (key: string, params?: Record) => string } })\n .G7Core?.t?.(key, params) ?? key;\n\n/**\n * 비밀번호 검증 규칙 정의\n */\nexport interface PasswordRule {\n /** 규칙 식별자 */\n key: string;\n /** 규칙 설명 (다국어 키) */\n labelKey: string;\n /** 검증 함수 (param은 규칙별 설정값) */\n validate: (value: string, param?: number) => boolean;\n /** 기본 파라미터 값 */\n defaultParam?: number;\n}\n\n/**\n * 사용 가능한 모든 비밀번호 검증 규칙\n *\n * JSON 레이아웃에서 enableRules prop으로 키를 지정하여 선택적으로 활성화\n * 파라미터가 있는 규칙은 \"규칙명:값\" 형식으로 지정 (예: \"minLength:12\")\n */\nexport const availablePasswordRules: Record = {\n minLength: {\n key: 'minLength',\n labelKey: 'auth.password_input.rules.minLength',\n defaultParam: 6,\n validate: (value: string, param = 6) => value.length >= param,\n },\n maxLength: {\n key: 'maxLength',\n labelKey: 'auth.password_input.rules.maxLength',\n defaultParam: 20,\n validate: (value: string, param = 20) => value.length <= param,\n },\n hasUppercase: {\n key: 'hasUppercase',\n labelKey: 'auth.password_input.rules.hasUppercase',\n validate: (value: string) => /[A-Z]/.test(value),\n },\n hasLowercase: {\n key: 'hasLowercase',\n labelKey: 'auth.password_input.rules.hasLowercase',\n validate: (value: string) => /[a-z]/.test(value),\n },\n hasNumber: {\n key: 'hasNumber',\n labelKey: 'auth.password_input.rules.hasNumber',\n validate: (value: string) => /[0-9]/.test(value),\n },\n hasSpecial: {\n key: 'hasSpecial',\n labelKey: 'auth.password_input.rules.hasSpecial',\n validate: (value: string) => /[!@#$%^&*(),.?\":{}|<>]/.test(value),\n },\n noSpaces: {\n key: 'noSpaces',\n labelKey: 'auth.password_input.rules.noSpaces',\n validate: (value: string) => !/\\s/.test(value),\n },\n minTypes: {\n key: 'minTypes',\n labelKey: 'auth.password_input.rules.minTypes',\n defaultParam: 3,\n validate: (value: string, param = 3) => {\n let types = 0;\n if (/[A-Z]/.test(value)) types++;\n if (/[a-z]/.test(value)) types++;\n if (/[0-9]/.test(value)) types++;\n if (/[!@#$%^&*(),.?\":{}|<>]/.test(value)) types++;\n return types >= param;\n },\n },\n};\n\n/**\n * 기본 비밀번호 검증 규칙\n *\n * 백엔드 검증 규칙(RegisterRequest.php)과 동일:\n * - password: required|string|min:6|confirmed\n */\nexport const defaultPasswordRules: PasswordRule[] = [\n availablePasswordRules.minLength,\n];\n\n/**\n * 파싱된 규칙 (규칙 + 파라미터)\n */\ninterface ParsedRule {\n rule: PasswordRule;\n param?: number;\n}\n\n/**\n * enableRules 문자열을 파싱하여 규칙과 파라미터를 추출\n * 예: \"minLength:12\" → { rule: minLengthRule, param: 12 }\n * 예: \"hasUppercase\" → { rule: hasUppercaseRule, param: undefined }\n *\n * @param ruleString 규칙 문자열 (예: \"minLength:12\" 또는 \"hasUppercase\")\n * @returns 파싱된 규칙 또는 null (규칙이 존재하지 않는 경우)\n */\nfunction parseRuleString(ruleString: string): ParsedRule | null {\n const [key, paramStr] = ruleString.split(':');\n const rule = availablePasswordRules[key];\n if (!rule) return null;\n\n const param = paramStr ? parseInt(paramStr, 10) : rule.defaultParam;\n return { rule, param: isNaN(param as number) ? rule.defaultParam : param };\n}\n\n/**\n * PasswordInput에서 사용하지 않는 HTML 속성 목록\n * (그누보드7 템플릿 엔진에서 전달되는 커스텀 속성)\n */\ninterface NonStandardProps {\n loadingactions?: unknown;\n formdata?: unknown;\n}\n\nexport interface PasswordInputProps extends Omit, 'type'> {\n /** 레이블 텍스트 */\n label?: string;\n /** 에러 메시지 */\n error?: string;\n /** 비밀번호 보기/숨기기 버튼 표시 */\n showToggle?: boolean;\n /** 비밀번호 조건 검증 표시 */\n showValidation?: boolean;\n /** 비밀번호 확인 모드 (확인 필드로 사용) */\n isConfirmField?: boolean;\n /** 비밀번호 확인 대상 값 (isConfirmField가 true일 때 필요) */\n confirmTarget?: string;\n /** 비밀번호 확인 일치 여부 콜백 */\n onMatchChange?: (isMatch: boolean) => void;\n /** 비밀번호 유효성 변경 콜백 */\n onValidityChange?: (isValid: boolean, failedRules: string[]) => void;\n /** 커스텀 비밀번호 규칙 (기본 규칙 대체, 코드에서만 사용) */\n rules?: PasswordRule[];\n /**\n * 활성화할 규칙 키 목록 (JSON 레이아웃에서 사용)\n * 사용 가능: minLength, maxLength, hasUppercase, hasLowercase, hasNumber, hasSpecial, noSpaces, minTypes\n * 파라미터 지정: \"규칙명:값\" 형식 (예: \"minLength:12\", \"minTypes:3\")\n * 예: [\"minLength:12\", \"hasUppercase\", \"hasSpecial\"]\n */\n enableRules?: string[];\n /** 표시할 규칙 키 목록 (지정하지 않으면 전체 표시) */\n showRules?: string[];\n /** 입력 필드 wrapper 클래스 */\n wrapperClassName?: string;\n /** 검증 결과 표시 영역 클래스 */\n validationClassName?: string;\n}\n\n/**\n * 비밀번호 입력 컴포넌트\n *\n * 비밀번호 보기/숨기기 토글, 실시간 조건 검증, 비밀번호 확인 기능을 제공합니다.\n *\n * @example\n * // 기본 사용 (보기/숨기기만)\n * \n *\n * @example\n * // 조건 검증 표시\n * console.log(isValid, failed)}\n * />\n *\n * @example\n * // 비밀번호 확인 필드\n * console.log(isMatch)}\n * />\n */\nexport const PasswordInput = forwardRef(\n (\n {\n label,\n error,\n showToggle = true,\n showValidation = false,\n isConfirmField = false,\n confirmTarget,\n onMatchChange,\n onValidityChange,\n rules,\n enableRules,\n showRules,\n wrapperClassName = '',\n validationClassName = '',\n className = '',\n onChange,\n value,\n defaultValue,\n disabled,\n ...props\n },\n ref\n ) => {\n const internalRef = useRef(null);\n useImperativeHandle(ref, () => internalRef.current as HTMLInputElement);\n\n // 비밀번호 보기/숨기기 상태\n const [showPassword, setShowPassword] = useState(false);\n\n // CapsLock 활성화 상태\n const [capsLockOn, setCapsLockOn] = useState(false);\n\n // 내부 값 상태 (controlled/uncontrolled 지원)\n const [internalValue, setInternalValue] = useState(\n (value as string) ?? (defaultValue as string) ?? ''\n );\n\n // 외부 value가 변경되면 동기화\n useEffect(() => {\n if (value !== undefined) {\n setInternalValue(value as string);\n }\n }, [value]);\n\n // 사용할 규칙 결정: rules > enableRules > defaultPasswordRules\n const parsedRules = useMemo((): ParsedRule[] => {\n // 1. rules prop이 있으면 그대로 사용 (코드에서 직접 전달, 기본 파라미터 적용)\n if (rules && rules.length > 0) {\n return rules.map((rule) => ({ rule, param: rule.defaultParam }));\n }\n\n // 2. enableRules가 있으면 파싱하여 규칙과 파라미터 추출\n if (enableRules && enableRules.length > 0) {\n return enableRules\n .map((ruleStr) => parseRuleString(ruleStr))\n .filter((parsed): parsed is ParsedRule => parsed !== null);\n }\n\n // 3. 기본 규칙 사용\n return defaultPasswordRules.map((rule) => ({ rule, param: rule.defaultParam }));\n }, [rules, enableRules]);\n\n // 표시할 규칙 필터링\n const displayRules = useMemo(() => {\n if (!showRules || showRules.length === 0) return parsedRules;\n return parsedRules.filter((parsed) => showRules.includes(parsed.rule.key));\n }, [parsedRules, showRules]);\n\n // 비밀번호 규칙 검증 결과\n const validationResults = useMemo(() => {\n if (!showValidation || isConfirmField) return {};\n return displayRules.reduce((acc, { rule, param }) => {\n acc[rule.key] = rule.validate(internalValue, param);\n return acc;\n }, {} as Record);\n }, [internalValue, displayRules, showValidation, isConfirmField]);\n\n // 비밀번호 확인 일치 여부\n const isMatch = useMemo(() => {\n if (!isConfirmField || confirmTarget === undefined) return true;\n return internalValue === confirmTarget && internalValue.length > 0;\n }, [isConfirmField, internalValue, confirmTarget]);\n\n // 전체 유효성 (모든 규칙 통과)\n const isAllValid = useMemo(() => {\n if (!showValidation) return true;\n return Object.values(validationResults).every((v) => v);\n }, [validationResults, showValidation]);\n\n // 유효성 변경 콜백\n useEffect(() => {\n if (onValidityChange && showValidation && !isConfirmField) {\n const failedRules = Object.entries(validationResults)\n .filter(([, passed]) => !passed)\n .map(([key]) => key);\n onValidityChange(isAllValid, failedRules);\n }\n }, [isAllValid, validationResults, onValidityChange, showValidation, isConfirmField]);\n\n // 비밀번호 확인 일치 콜백\n useEffect(() => {\n if (onMatchChange && isConfirmField) {\n onMatchChange(isMatch);\n }\n }, [isMatch, onMatchChange, isConfirmField]);\n\n // 비밀번호 보기/숨기기 토글\n const handleToggle = useCallback(() => {\n setShowPassword((prev) => !prev);\n }, []);\n\n // 입력값 변경 처리\n const handleChange = useCallback(\n (e: React.ChangeEvent) => {\n const newValue = e.target.value;\n setInternalValue(newValue);\n if (onChange) {\n onChange(e);\n }\n },\n [onChange]\n );\n\n // CapsLock 상태 감지\n const handleKeyEvent = useCallback(\n (e: React.KeyboardEvent) => {\n setCapsLockOn(e.getModifierState('CapsLock'));\n },\n []\n );\n\n // HTML 표준 속성이 아닌 것들을 필터링 (타입 안전성 개선)\n const { loadingactions, formdata, ...validProps } = props as typeof props & NonStandardProps;\n\n // 레이아웃 편집기 표식/핸들러(data-editor-*, onMouseMove/Leave 등)는 시각적\n // 루트(wrapper div)에 부착해야 캔버스 선택/드래그가 컴포넌트 전체를 잡는다.\n // 내부 input 에만 spread 하면 선택 박스가 input 으로 한정되고 error/검증/토글이\n // 선택 영역 밖이 된다.\n const editorRootProps: Record = {};\n const inputRestProps: Record = {};\n for (const [k, v] of Object.entries(validProps as Record)) {\n if (k.startsWith('data-editor-') || k === 'onMouseMove' || k === 'onMouseLeave') {\n editorRootProps[k] = v;\n } else {\n inputRestProps[k] = v;\n }\n }\n\n return (\n
\n {/* 입력 필드 wrapper */}\n
\n \n\n {/* 비밀번호 보기/숨기기 버튼 */}\n {showToggle && (\n \n \n \n )}\n
\n\n {/* CapsLock 경고 */}\n {capsLockOn && !showPassword && (\n
\n \n {t('auth.password_input.caps_lock_on')}\n
\n )}\n\n {/* 비밀번호 확인 일치/불일치 표시 */}\n {isConfirmField && confirmTarget !== undefined && internalValue.length > 0 && (\n \n \n {isMatch ? t('auth.password_input.match') : t('auth.password_input.mismatch')}\n
\n )}\n\n {/* 비밀번호 조건 검증 표시 */}\n {showValidation && !isConfirmField && internalValue.length > 0 && (\n
\n {displayRules.map(({ rule, param }) => {\n const passed = validationResults[rule.key];\n // 파라미터가 있는 규칙은 라벨에 파라미터 값 전달\n const labelParams = param !== undefined ? { count: param } : undefined;\n return (\n \n \n {t(rule.labelKey, labelParams)}\n
\n );\n })}\n
\n )}\n\n {/* 에러 메시지 */}\n {error && (\n

{error}

\n )}\n
\n );\n }\n);\n\nPasswordInput.displayName = 'PasswordInput';\n","import React, { useRef, useCallback, useState, useEffect } from 'react';\n\nexport interface TextareaProps extends React.TextareaHTMLAttributes {\n label?: string;\n error?: string;\n}\n\n/**\n * 기본 텍스트 영역 컴포넌트\n *\n * IME(한글 등) 조합 중에는 외부 onChange 이벤트를 발생시키지 않습니다.\n * 내부 로컬 상태를 사용하여 입력을 처리하고, 조합이 완료되면 외부에 알립니다.\n */\nexport const Textarea: React.FC = ({\n label,\n error,\n className = '',\n onChange,\n value,\n defaultValue,\n ...props\n}) => {\n // IME 조합 중인지 추적\n const isComposingRef = useRef(false);\n // textarea 요소 참조\n const textareaRef = useRef(null);\n\n // 내부 로컬 값 (IME 조합 중에도 화면에 표시됨)\n const [localValue, setLocalValue] = useState(\n (value as string) ?? (defaultValue as string) ?? ''\n );\n\n // 외부 value prop이 변경되면 로컬 값도 동기화\n useEffect(() => {\n if (!isComposingRef.current && value !== undefined) {\n setLocalValue(value as string);\n }\n }, [value]);\n\n const handleCompositionStart = useCallback(() => {\n isComposingRef.current = true;\n }, []);\n\n const handleCompositionEnd = useCallback(\n (e: React.CompositionEvent) => {\n isComposingRef.current = false;\n // 조합 완료 후 onChange 이벤트 발생\n if (onChange) {\n // 현재 textarea의 실제 값을 사용\n const currentValue = (e.target as HTMLTextAreaElement).value;\n setLocalValue(currentValue);\n\n // 새로운 ChangeEvent 생성\n const changeEvent = new Event('change', { bubbles: true }) as unknown as React.ChangeEvent;\n Object.defineProperty(changeEvent, 'target', {\n writable: false,\n value: { value: currentValue },\n });\n Object.defineProperty(changeEvent, 'currentTarget', {\n writable: false,\n value: { value: currentValue },\n });\n\n onChange(changeEvent);\n }\n },\n [onChange]\n );\n\n const handleChange = useCallback(\n (e: React.ChangeEvent) => {\n const newValue = e.target.value;\n // 항상 로컬 값은 업데이트 (화면에 입력이 보이도록)\n setLocalValue(newValue);\n\n // IME 조합 중이면 외부 onChange를 호출하지 않음\n if (isComposingRef.current) {\n return;\n }\n if (onChange) {\n onChange(e);\n }\n },\n [onChange]\n );\n\n // HTML 표준 속성이 아닌 것들을 필터링 (템플릿 엔진 내부 속성)\n const { loadingactions, formdata, ...validProps } = props as any;\n\n // controlled/uncontrolled 구분\n const textareaValueProps = value !== undefined\n ? { value: localValue }\n : { defaultValue };\n\n return (\n \n );\n};\n","import React from 'react';\n\nexport interface LabelProps extends React.LabelHTMLAttributes {}\n\n/**\n * 기본 레이블 컴포넌트\n */\nexport const Label: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface PProps extends React.HTMLAttributes {}\n\n/**\n * 기본 p(단락) 컴포넌트\n */\nexport const P: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n

\n );\n};\n","import React from 'react';\n\nexport interface ImgProps extends React.ImgHTMLAttributes {}\n\n/**\n * 기본 이미지 컴포넌트\n */\nexport const Img: React.FC = ({\n className = '',\n alt = '',\n ...props\n}) => {\n return (\n \n );\n};\n","import React from 'react';\n\nexport interface H1Props extends React.HTMLAttributes {}\n\n/**\n * 기본 h1 제목 컴포넌트\n */\nexport const H1: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface H2Props extends React.HTMLAttributes {}\n\n/**\n * 기본 h2 제목 컴포넌트\n */\nexport const H2: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface H3Props extends React.HTMLAttributes {}\n\n/**\n * 기본 h3 제목 컴포넌트\n */\nexport const H3: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface H4Props extends React.HTMLAttributes {}\n\n/**\n * 기본 h4 제목 컴포넌트\n */\nexport const H4: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface UlProps extends React.HTMLAttributes {}\n\n/**\n * 기본 ul(순서없는 목록) 컴포넌트\n */\nexport const Ul: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface OlProps extends React.HTMLAttributes {}\n\n/**\n * 기본 ol(순서있는 목록) 컴포넌트\n */\nexport const Ol: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface LiProps extends React.LiHTMLAttributes {}\n\n/**\n * 기본 li(목록 항목) 컴포넌트\n */\nexport const Li: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface AProps extends React.AnchorHTMLAttributes {}\n\n/**\n * 기본 a(링크) 컴포넌트\n */\nexport const A: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n
\n );\n};\n","import React from 'react';\n\nexport interface FormProps extends React.FormHTMLAttributes {}\n\n/**\n * 기본 form 컴포넌트\n */\nexport const Form: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","// e2e:allow커스텀 드롭다운 루트 props spread 타입 안전 캐스팅(admin 동기). 단위 회귀는 Select.test.tsx.\nimport React, { useMemo, useState, useRef, useEffect, useCallback } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Div } from './Div';\nimport { Button } from './Button';\nimport { Span } from './Span';\nimport { Svg } from './Svg';\nimport { Input } from './Input';\n\n// Logger 설정 (G7Core 초기화 전에도 동작하도록 폴백 포함)\nconst logger = ((window as any).G7Core?.createLogger?.('Comp:Select')) ?? {\n log: (...args: unknown[]) => console.log('[Comp:Select]', ...args),\n warn: (...args: unknown[]) => console.warn('[Comp:Select]', ...args),\n error: (...args: unknown[]) => console.error('[Comp:Select]', ...args),\n};\n\nexport interface SelectOption {\n value: string | number;\n label: string;\n disabled?: boolean;\n}\n\nexport interface SelectProps extends Omit, 'onChange'> {\n label?: string;\n error?: string;\n options?: SelectOption[] | string[];\n onChange?: (e: React.ChangeEvent | { target: { value: string | number } }) => void;\n /** 드롭다운 내 검색 input 활성화 (engine-v1.40.0+) */\n searchable?: boolean;\n /** 검색 input placeholder */\n searchPlaceholder?: string;\n /**\n * 레이아웃 편집기 주입 속성 (편집 모드 전용). Select 는 커스텀 드롭다운 루트에\n * 개별 data-editor-* 키를 spread 해야 선택/편집이 닿는다(커스텀 루트\n * passthrough). basic 컴포넌트라 `{...props}` 로 DOM 표준 속성(id 등)도 함께 흐른다.\n */\n editorAttrs?: Record;\n}\n\n/**\n * 로케일 코드를 사람이 읽을 수 있는 이름으로 변환\n */\nfunction getLocaleName(locale: string): string {\n const fromAppConfig = (window as any).G7Core?.state?.get?.('_global.appConfig.localeNames')?.[locale];\n if (fromAppConfig) {\n return fromAppConfig;\n }\n const fallback: Record = {\n ko: '한국어',\n en: 'English',\n ja: '日本語',\n zh: '中文',\n es: 'Español',\n fr: 'Français',\n de: 'Deutsch',\n };\n return fallback[locale] || locale;\n}\n\n/**\n * 커스텀 Select 컴포넌트\n *\n * options prop을 사용하여 드롭다운 메뉴를 생성합니다.\n * 둥근 모서리, 그림자, 체크마크가 있는 커스텀 스타일을 지원합니다.\n */\nexport const Select: React.FC = ({\n children,\n label,\n error,\n options,\n className = '',\n value,\n onChange,\n disabled,\n searchable = false,\n searchPlaceholder,\n editorAttrs,\n ...props\n}) => {\n const [isOpen, setIsOpen] = useState(false);\n const [searchTerm, setSearchTerm] = useState('');\n const [dropdownPos, setDropdownPos] = useState<{ top?: number; bottom?: number; left: number; width: number } | null>(null);\n const containerRef = useRef(null);\n const buttonRef = useRef(null);\n const searchInputRef = useRef(null);\n const dropdownRef = useRef(null);\n\n // options를 SelectOption[] 형식으로 정규화\n const normalizedOptions = useMemo((): SelectOption[] | null => {\n if (!options) return null;\n\n // 배열이 아닌 경우 (바인딩 에러 또는 잘못된 prop)\n if (!Array.isArray(options)) {\n logger.warn('options prop is not an array:', options);\n return null;\n }\n\n // 빈 배열인 경우\n if (options.length === 0) return [];\n\n // string[] 배열인 경우\n if (typeof options[0] === 'string') {\n return (options as string[]).map((locale): SelectOption => ({\n value: locale,\n label: getLocaleName(locale),\n }));\n }\n\n // SelectOption[] 배열인 경우 (기존 동작)\n return options as SelectOption[];\n }, [options]);\n\n // 현재 선택된 옵션의 라벨 가져오기\n const selectedLabel = useMemo(() => {\n if (!normalizedOptions) return '';\n const selected = normalizedOptions.find(opt => String(opt.value) === String(value));\n return selected?.label || '';\n }, [normalizedOptions, value]);\n\n // searchable 모드에서 검색어로 필터링된 옵션\n const visibleOptions = useMemo((): SelectOption[] | null => {\n if (!normalizedOptions) return null;\n if (!searchable || searchTerm.trim() === '') return normalizedOptions;\n const needle = searchTerm.trim().toLowerCase();\n return normalizedOptions.filter(opt =>\n opt.label.toLowerCase().includes(needle) ||\n String(opt.value).toLowerCase().includes(needle)\n );\n }, [normalizedOptions, searchable, searchTerm]);\n\n // 드롭다운 열릴 때 검색어 초기화 및 input 포커스\n useEffect(() => {\n if (isOpen && searchable) {\n setSearchTerm('');\n // 다음 tick에 포커스 (DOM 렌더 이후)\n const timer = setTimeout(() => searchInputRef.current?.focus(), 0);\n return () => clearTimeout(timer);\n }\n if (!isOpen) {\n setSearchTerm('');\n }\n }, [isOpen, searchable]);\n\n /**\n * 드롭다운 위치 계산 (버튼 기준 fixed positioning)\n * Modal 등 overflow:hidden 컨테이너 내부에서도 정상 표시\n */\n const updateDropdownPos = useCallback(() => {\n if (!buttonRef.current) return;\n const rect = buttonRef.current.getBoundingClientRect();\n const spaceBelow = window.innerHeight - rect.bottom;\n const dropdownMaxH = 280; // max-h-60(240px) + search(~40px)\n // 아래 공간 부족 시 위로 열기\n const openUpward = spaceBelow < dropdownMaxH && rect.top > spaceBelow;\n if (openUpward) {\n setDropdownPos({\n bottom: window.innerHeight - rect.top + 4,\n left: rect.left,\n width: rect.width,\n });\n } else {\n setDropdownPos({\n top: rect.bottom + 4,\n left: rect.left,\n width: rect.width,\n });\n }\n }, []);\n\n // 드롭다운 열릴 때 위치 계산 + 스크롤/리사이즈 추적\n useEffect(() => {\n if (!isOpen) {\n setDropdownPos(null);\n return;\n }\n updateDropdownPos();\n window.addEventListener('scroll', updateDropdownPos, true);\n window.addEventListener('resize', updateDropdownPos);\n return () => {\n window.removeEventListener('scroll', updateDropdownPos, true);\n window.removeEventListener('resize', updateDropdownPos);\n };\n }, [isOpen, updateDropdownPos]);\n\n // 외부 클릭 시 드롭다운 닫기 (Portal 영역 포함)\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node;\n if (\n containerRef.current && !containerRef.current.contains(target) &&\n (!dropdownRef.current || !dropdownRef.current.contains(target))\n ) {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener('mousedown', handleClickOutside);\n }\n\n return () => {\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [isOpen]);\n\n // ESC 키로 드롭다운 닫기\n useEffect(() => {\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && isOpen) {\n setIsOpen(false);\n buttonRef.current?.focus();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen]);\n\n const handleToggle = () => {\n if (!disabled) {\n setIsOpen(!isOpen);\n }\n };\n\n const handleSelect = (optionValue: string | number) => {\n if (onChange) {\n // ActionDispatcher가 이벤트를 인식할 수 있도록 preventDefault 메서드 포함\n const syntheticEvent = {\n target: { value: optionValue },\n preventDefault: () => {},\n stopPropagation: () => {},\n type: 'change',\n };\n onChange(syntheticEvent as any);\n }\n setIsOpen(false);\n buttonRef.current?.focus();\n };\n\n // options가 없으면 기본 select 사용 (children 지원)\n if (!normalizedOptions) {\n return (\n }\n disabled={disabled}\n {...editorAttrs}\n {...props}\n >\n {children}\n \n );\n }\n\n // 기본 스타일 (className이 없을 때 적용)\n const hasCustomStyle = className && className.includes('bg-');\n // 커스텀 스타일에 텍스트 색상이 없으면 기본 텍스트 색상 보충\n const hasTextColor = className && /text-(gray|red|blue|green|yellow|white|black|indigo|purple|pink|orange|amber|emerald|teal|cyan|slate)-\\d+|text-white|text-black/.test(className);\n const baseButtonClass = hasCustomStyle\n ? `${className}${hasTextColor ? '' : ' text-gray-700 dark:text-gray-200'}`\n : `w-full px-4 py-2.5 bg-gray-100 dark:bg-gray-700 border-0 rounded-xl text-gray-700 dark:text-gray-200 font-medium focus:ring-2 focus:ring-blue-500 focus:outline-none ${className}`;\n\n // props 는 SelectHTMLAttributes 기반이라 Div(HTMLDivElement) 에 직접 spread 시 타입 불일치.\n // 런타임 동작(편집기 data-editor-* / id 등 DOM 표준 속성 passthrough)은 동일하므로\n // DOM-safe 레코드로 캐스팅해 커스텀 드롭다운 루트에 전달한다.\n const rootDomProps = { ...editorAttrs, ...props } as Record;\n\n return (\n
\n \n {selectedLabel || '\\u00A0'}\n \n \n \n \n\n {isOpen && dropdownPos && createPortal(\n \n {searchable && (\n
\n ) => setSearchTerm(e.target.value)}\n placeholder={searchPlaceholder ?? 'Search...'}\n className=\"w-full px-3 py-2 bg-gray-100 dark:bg-gray-700 border-0 rounded-lg text-sm text-gray-700 dark:text-gray-200 placeholder-gray-400 dark:placeholder-gray-500 focus:ring-2 focus:ring-blue-500 focus:outline-none\"\n role=\"searchbox\"\n aria-label={searchPlaceholder ?? 'Search'}\n />\n
\n )}\n
\n {visibleOptions && visibleOptions.length === 0 && (\n
\n {searchTerm ? 'No results' : ''}\n
\n )}\n {(visibleOptions ?? []).map((option) => {\n const isSelected = String(option.value) === String(value);\n return (\n !option.disabled && handleSelect(option.value)}\n disabled={option.disabled}\n className={`w-full px-4 py-3 text-left flex items-center justify-between hover:bg-gray-100 dark:hover:bg-gray-700 transition-colors ${\n isSelected ? 'text-blue-600 dark:text-blue-400 font-medium' : 'text-gray-700 dark:text-gray-200'\n } ${option.disabled ? 'opacity-50 cursor-not-allowed' : 'cursor-pointer'}`}\n role=\"option\"\n aria-selected={isSelected}\n >\n {option.label}\n {isSelected && (\n \n \n \n )}\n \n );\n })}\n
\n
,\n document.body\n )}\n
\n );\n};\n","import React from 'react';\n\nexport interface OptionProps extends React.OptionHTMLAttributes {}\n\n/**\n * 기본 option 컴포넌트 (Select 내부에서 사용)\n */\nexport const Option: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface OptgroupProps extends React.OptgroupHTMLAttributes {}\n\n/**\n * 기본 optgroup 컴포넌트 (Select 내부에서 옵션 그룹화)\n */\nexport const Optgroup: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React, { forwardRef } from 'react';\n\nexport interface CheckboxProps extends React.InputHTMLAttributes {\n label?: string;\n}\n\n/**\n * 기본 체크박스 컴포넌트\n *\n * forwardRef를 사용하여 ref 전달을 지원합니다.\n * indeterminate 상태 등을 설정할 때 ref가 필요합니다.\n */\nexport const Checkbox = forwardRef(\n ({ label, className = '', ...props }, ref) => {\n return (\n \n );\n }\n);\n\nCheckbox.displayName = 'Checkbox';\n","import React from 'react';\n\nexport interface TableProps extends React.TableHTMLAttributes {}\n\n/**\n * 기본 table 컴포넌트\n */\nexport const Table: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface TheadProps extends React.HTMLAttributes {}\n\n/**\n * 기본 thead 컴포넌트\n */\nexport const Thead: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface TbodyProps extends React.HTMLAttributes {}\n\n/**\n * 기본 tbody 컴포넌트\n */\nexport const Tbody: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface TrProps extends React.HTMLAttributes {}\n\n/**\n * 기본 tr(테이블 행) 컴포넌트\n */\nexport const Tr: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface ThProps extends React.ThHTMLAttributes {}\n\n/**\n * 기본 th(테이블 헤더 셀) 컴포넌트\n */\nexport const Th: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface TdProps extends React.TdHTMLAttributes {}\n\n/**\n * 기본 td(테이블 데이터 셀) 컴포넌트\n */\nexport const Td: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React, { forwardRef } from 'react';\n\nexport interface NavProps extends React.HTMLAttributes {}\n\n/**\n * 기본 nav 컴포넌트\n */\nexport const Nav = forwardRef(\n ({ children, className = '', ...props }, ref) => {\n return (\n \n {children}\n \n );\n }\n);\n\nNav.displayName = 'Nav';\n","import React from 'react';\n\nexport interface SectionProps extends React.HTMLAttributes {}\n\n/**\n * 기본 section 컴포넌트\n */\nexport const Section: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface CodeProps extends React.HTMLAttributes {}\n\n/**\n * 기본 code 컴포넌트\n *\n * 인라인 코드 또는 코드 스니펫을 표시하기 위한 기본 컴포넌트입니다.\n * HTML 태그를 래핑합니다.\n */\nexport const Code: React.FC = ({\n children,\n className = '',\n ...props\n}) => {\n return (\n \n {children}\n \n );\n};\n","import React from 'react';\n\nexport interface HrProps extends React.HTMLAttributes {\n ref?: React.Ref;\n}\n\n/**\n * 기본 hr (수평선) 컴포넌트\n */\nexport const Hr = React.forwardRef(({\n className = '',\n ...props\n}, ref) => {\n return (\n \n );\n});\n","import React from 'react';\n\nexport interface HeaderProps extends React.HTMLAttributes {\n ref?: React.Ref;\n}\n\n/**\n * 기본 header 컴포넌트\n */\nexport const Header = React.forwardRef(({\n children,\n className = '',\n ...props\n}, ref) => {\n return (\n \n {children}\n \n );\n});\n","import React, { useState, useEffect, useRef } from 'react';\nimport { Div } from '../basic/Div';\nimport { Button } from '../basic/Button';\nimport { Icon } from '../basic/Icon';\nimport { IconName } from '../basic/IconTypes';\nimport { Span } from '../basic/Span';\nimport type { EditorAttrs } from '../../types';\n\n/**\n * 테마 모드 타입\n */\nexport type ThemeMode = 'auto' | 'light' | 'dark';\n\n/**\n * ThemeToggle Props\n */\nexport interface ThemeToggleProps {\n /** 테마 변경 콜백 */\n onThemeChange?: (theme: ThemeMode) => void;\n /** 추가 CSS 클래스 */\n className?: string;\n /** 자동 모드 텍스트 (다국어 키 사용 권장) */\n autoText?: string;\n /** 라이트 모드 텍스트 (다국어 키 사용 권장) */\n lightText?: string;\n /** 다크 모드 텍스트 (다국어 키 사용 권장) */\n darkText?: string;\n /** DOM id 속성 (레이아웃 편집기 코어 일괄 ID) */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * ThemeToggle 컴포넌트\n *\n * 다크/라이트 모드 전환 버튼\n * - 3가지 모드: 자동(시스템 설정 따름), 라이트, 다크\n * - localStorage에 'g7_color_scheme' 키로 저장 (admin 템플릿과 동일)\n * - 시스템 prefers-color-scheme 감지 지원\n *\n * @example\n * ```json\n * {\n * \"type\": \"composite\",\n * \"name\": \"ThemeToggle\",\n * \"props\": {\n * \"autoText\": \"$t:common.theme.auto\",\n * \"lightText\": \"$t:common.theme.light\",\n * \"darkText\": \"$t:common.theme.dark\"\n * }\n * }\n * ```\n */\n\n/**\n * 실제 적용될 테마 결정 (auto인 경우 시스템 설정 반영)\n */\nconst getEffectiveTheme = (mode: ThemeMode): 'light' | 'dark' => {\n if (mode === 'auto') {\n return window.matchMedia('(prefers-color-scheme: dark)').matches\n ? 'dark'\n : 'light';\n }\n return mode;\n};\n\n/**\n * 테마 적용\n */\nconst applyTheme = (mode: ThemeMode) => {\n const effectiveTheme = getEffectiveTheme(mode);\n document.documentElement.setAttribute('data-theme', effectiveTheme);\n\n // dark 클래스 토글 (Tailwind CSS dark: 모드 지원)\n if (effectiveTheme === 'dark') {\n document.documentElement.classList.add('dark');\n } else {\n document.documentElement.classList.remove('dark');\n }\n};\n\n/**\n * 초기 테마 로드 및 적용 (즉시 실행)\n * admin 템플릿과 동일한 localStorage 키 사용: 'g7_color_scheme'\n */\nconst getInitialTheme = (): ThemeMode => {\n const savedTheme = localStorage.getItem('g7_color_scheme') as ThemeMode | null;\n if (savedTheme && ['auto', 'light', 'dark'].includes(savedTheme)) {\n return savedTheme;\n }\n return 'auto';\n};\n\nexport const ThemeToggle: React.FC = ({\n onThemeChange,\n className = '',\n autoText = 'System',\n lightText = 'Light',\n darkText = 'Dark',\n id,\n editorAttrs,\n}) => {\n // 초기 테마를 즉시 로드하고 적용\n const initialTheme = getInitialTheme();\n const [currentMode, setCurrentMode] = useState(initialTheme);\n const [showMenu, setShowMenu] = useState(false);\n const menuRef = useRef(null);\n\n /**\n * 컴포넌트 마운트 시 즉시 테마 적용\n */\n useEffect(() => {\n applyTheme(currentMode);\n }, []);\n\n /**\n * 시스템 테마 변경 감지\n */\n useEffect(() => {\n if (currentMode !== 'auto') return;\n\n const mediaQuery = window.matchMedia('(prefers-color-scheme: dark)');\n const handleChange = () => {\n applyTheme('auto');\n };\n\n mediaQuery.addEventListener('change', handleChange);\n return () => mediaQuery.removeEventListener('change', handleChange);\n }, [currentMode]);\n\n /**\n * 외부 클릭 감지\n */\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(event.target as Node)) {\n setShowMenu(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n /**\n * 테마 변경 핸들러\n * admin 템플릿과 동일한 localStorage 키 사용: 'g7_color_scheme'\n */\n const handleThemeChange = (mode: ThemeMode) => {\n setCurrentMode(mode);\n localStorage.setItem('g7_color_scheme', mode);\n applyTheme(mode);\n setShowMenu(false);\n onThemeChange?.(mode);\n };\n\n /**\n * 현재 표시할 아이콘 결정\n */\n const getCurrentIcon = (): IconName => {\n const effectiveTheme = getEffectiveTheme(currentMode);\n return effectiveTheme === 'dark' ? IconName.Moon : IconName.Sun;\n };\n\n return (\n
\n {/* 테마 토글 버튼 */}\n setShowMenu(!showMenu)}\n className=\"p-2 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-lg transition-colors text-gray-600 dark:text-gray-400\"\n aria-label=\"Toggle theme\"\n >\n \n \n\n {/* 테마 선택 드롭다운 */}\n {showMenu && (\n
\n
\n {/* 자동 모드 */}\n handleThemeChange('auto')}\n className={`\n w-full px-4 py-2 text-left hover:bg-gray-50 dark:hover:bg-gray-700 flex items-center gap-3 transition-colors\n ${currentMode === 'auto' ? 'bg-gray-50 dark:bg-gray-700' : ''}\n `}\n >\n \n {autoText}\n {currentMode === 'auto' && (\n \n )}\n \n\n {/* 라이트 모드 */}\n handleThemeChange('light')}\n className={`\n w-full px-4 py-2 text-left hover:bg-gray-50 dark:hover:bg-gray-700 flex items-center gap-3 transition-colors\n ${currentMode === 'light' ? 'bg-gray-50 dark:bg-gray-700' : ''}\n `}\n >\n \n {lightText}\n {currentMode === 'light' && (\n \n )}\n \n\n {/* 다크 모드 */}\n handleThemeChange('dark')}\n className={`\n w-full px-4 py-2 text-left hover:bg-gray-50 dark:hover:bg-gray-700 flex items-center gap-3 transition-colors\n ${currentMode === 'dark' ? 'bg-gray-50 dark:bg-gray-700' : ''}\n `}\n >\n \n {darkText}\n {currentMode === 'dark' && (\n \n )}\n \n
\n
\n )}\n
\n );\n};\n\nexport default ThemeToggle;\n","import React, { useMemo } from 'react';\nimport { Div } from '../basic/Div';\nimport { Img } from '../basic/Img';\nimport { Icon } from '../basic/Icon';\nimport type { EditorAttrs } from '../../types';\n\n/**\n * 아바타 크기 타입\n */\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl' | '5xl';\n\n/**\n * 사이즈별 Tailwind 클래스 매핑\n * - 크기 (w/h) + 텍스트 크기 (이니셜용)\n */\nconst SIZE_CLASSES: Record = {\n xs: 'w-6 h-6 text-xs', // 24px\n sm: 'w-8 h-8 text-sm', // 32px\n md: 'w-10 h-10 text-base', // 40px\n lg: 'w-12 h-12 text-lg', // 48px\n xl: 'w-16 h-16 text-xl', // 64px\n '2xl': 'w-24 h-24 text-2xl', // 96px\n '3xl': 'w-32 h-32 text-3xl', // 128px\n '4xl': 'w-40 h-40 text-4xl', // 160px\n '5xl': 'w-48 h-48 text-5xl', // 192px\n} as const;\n\n/**\n * 기본 컨테이너 스타일 (공통)\n */\nconst BASE_CONTAINER_CLASSES = 'rounded-full overflow-hidden flex-shrink-0 border border-gray-200 dark:border-gray-700';\n\n/**\n * 탈퇴 사용자 스타일\n */\nconst WITHDRAWN_CLASSES = 'grayscale opacity-50';\n\n/**\n * 이니셜 배경 스타일\n */\nconst INITIAL_BG_CLASSES = {\n normal: 'bg-gradient-to-br from-blue-500 to-purple-600',\n withdrawn: 'bg-gray-300 dark:bg-gray-600',\n guest: 'bg-gray-200 dark:bg-gray-700',\n} as const;\n\n/**\n * Author 객체 인터페이스\n */\nexport interface AuthorInfo {\n /** 사용자 ID */\n id?: string | number;\n /** 사용자 이름 */\n name?: string;\n /** 아바타 URL */\n avatar?: string;\n /** 사용자 상태 */\n status?: 'active' | 'inactive' | 'blocked' | 'withdrawn';\n /** 비회원 여부 */\n is_guest?: boolean;\n}\n\nexport interface AvatarProps {\n /**\n * 작성자 객체 (권장)\n * API 응답의 author 객체를 그대로 전달하면 됩니다.\n * 개별 props(name, avatar 등)가 함께 전달되면 개별 props가 우선합니다.\n */\n author?: AuthorInfo;\n /** 사용자 이름 (author.name보다 우선) */\n name?: string;\n /** 아바타 이미지 URL (author.avatar보다 우선) */\n avatar?: string;\n /** 사이즈 @default 'md' */\n size?: AvatarSize;\n /** 추가 className */\n className?: string;\n /** 레이아웃 JSON text 속성 (name보다 우선) */\n text?: string;\n /** 탈퇴한 사용자 여부 (author.status === 'withdrawn'과 OR 조건) @default false */\n isWithdrawn?: boolean;\n /** 비회원 여부 (author.is_guest보다 우선) @default false */\n isGuest?: boolean;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n/**\n * 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread)\n */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * Avatar 컴포넌트\n *\n * 사용자 아바타를 표시하는 재사용 가능한 composite 컴포넌트입니다.\n * - 아바타 이미지가 있으면 이미지 표시\n * - 이미지가 없으면 이름의 첫 글자(이니셜) 표시\n * - 비회원: 연한 회색 배경 + 사람 실루엣 아이콘\n * - 탈퇴한 사용자: 회색 빈 원 (그레이스케일 + 투명도)\n *\n * ## Props 우선순위\n * 명시적으로 전달한 props가 author에서 추출한 값보다 우선합니다.\n * - 이름: text > name > author.name\n * - 아바타: avatar > author.avatar\n * - 비회원 여부: isGuest > author.is_guest\n * - 탈퇴 여부: isWithdrawn || author.status === 'withdrawn'\n *\n * @example\n * // 레이아웃 JSON에서 사용 (author 객체 전달 - 권장)\n * {\n * \"type\": \"composite\",\n * \"name\": \"Avatar\",\n * \"props\": {\n * \"author\": \"{{post.author}}\",\n * \"size\": \"md\"\n * }\n * }\n *\n * @example\n * // author와 개별 props 혼합 사용 (개별 props가 우선)\n * {\n * \"type\": \"composite\",\n * \"name\": \"Avatar\",\n * \"props\": {\n * \"author\": \"{{post.author}}\",\n * \"avatar\": \"/images/custom-avatar.png\",\n * \"size\": \"md\"\n * }\n * }\n * // author.avatar가 있어도 \"/images/custom-avatar.png\"이 표시됨\n */\nexport const Avatar: React.FC = ({\n author,\n name,\n avatar,\n size = 'md',\n className = '',\n text,\n isWithdrawn = false,\n isGuest = false,\n id,\n editorAttrs,\n}) => {\n // 명시적 props > author 추출값 순서로 결정\n const actualAvatar = avatar ?? author?.avatar;\n const actualName = text ?? name ?? author?.name ?? '?';\n const actualIsWithdrawn = isWithdrawn || author?.status === 'withdrawn';\n const actualIsGuest = isGuest || author?.is_guest || false;\n\n // 컨테이너 클래스 메모이제이션\n const containerClasses = useMemo(() => {\n const sizeClass = SIZE_CLASSES[size] || SIZE_CLASSES.md;\n const withdrawnClass = actualIsWithdrawn ? WITHDRAWN_CLASSES : '';\n\n return [sizeClass, BASE_CONTAINER_CLASSES, withdrawnClass, className]\n .filter(Boolean)\n .join(' ');\n }, [size, actualIsWithdrawn, className]);\n\n // 이니셜 배경 클래스\n const initialBgClass = actualIsGuest\n ? INITIAL_BG_CLASSES.guest\n : actualIsWithdrawn\n ? INITIAL_BG_CLASSES.withdrawn\n : INITIAL_BG_CLASSES.normal;\n\n // 비회원: 사람 실루엣 아이콘 (연한 회색), 탈퇴 사용자: 사람 실루엣 아이콘 (진한 회색), 일반: 이니셜\n const renderContent = () => {\n if (actualIsGuest) {\n return (\n
\n \n
\n );\n }\n if (actualIsWithdrawn) {\n return (\n
\n \n
\n );\n }\n return (\n
\n {actualName.charAt(0).toUpperCase()}\n
\n );\n };\n\n return (\n
\n {actualAvatar && !actualIsGuest && !actualIsWithdrawn ? (\n \n ) : (\n renderContent()\n )}\n
\n );\n};\n","/**\n * SlotContainer.tsx\n *\n * 동적 슬롯에 등록된 컴포넌트들을 렌더링하는 컨테이너 컴포넌트\n *\n * SlotContainer는 SlotContext에서 지정된 슬롯 ID에 등록된 모든 컴포넌트를 수집하고,\n * slotOrder 기준으로 정렬하여 렌더링합니다.\n *\n * 통짜 TSX 컴포넌트(예: Header)가 레이아웃 JSON 노드(`\"slot\": \"...\"`)로 주입된 UI를\n * 떙겨 쓰는 코어 슬롯 시스템의 소비 측 컴포넌트입니다. 빈 슬롯이면 null 을 렌더하므로\n * \"모듈 활성 시에만 노출\"이 확장 주입 인프라로 자동 충족됩니다(헤더는 주입 모듈을 모름).\n *\n * @module SlotContainer\n *\n * @example\n * ```json\n * {\n * \"type\": \"composite\",\n * \"name\": \"SlotContainer\",\n * \"props\": {\n * \"slotId\": \"header_currency\",\n * \"className\": \"flex items-center\"\n * }\n * }\n * ```\n */\n\nimport React, { useEffect, useState, useCallback } from 'react';\nimport { Div } from '../basic/Div';\n\n// Logger 설정 (G7Core 초기화 전에도 동작하도록 폴백 포함)\nconst logger = ((window as any).G7Core?.createLogger?.('Comp:SlotContainer')) ?? {\n log: (...args: unknown[]) => console.log('[Comp:SlotContainer]', ...args),\n warn: (...args: unknown[]) => console.warn('[Comp:SlotContainer]', ...args),\n error: (...args: unknown[]) => console.error('[Comp:SlotContainer]', ...args),\n};\n\n/**\n * 슬롯에 주입된 컴포넌트의 root id 를 컨테이너 id 로 스코프해 고유화한다.\n *\n * 같은 슬롯 컴포넌트가 여러 SlotContainer(예: 헤더 데스크톱/모바일)에서 렌더되면 주입\n * 컴포넌트의 정적 root id 가 컨테이너마다 같은 값으로 중복 출력되어 HTML id 유일성을\n * 위반한다. 컨테이너 고유 id 가 있고 컴포넌트가 root id 를 가지면 `{id}__{containerId}`\n * 로 스코프한다. 둘 중 하나라도 없으면 원본 그대로(무영향).\n *\n * @param componentDef 주입 컴포넌트 정의\n * @param containerId 이 SlotContainer 의 DOM id (없으면 스코프 안 함)\n * @returns 스코프된(또는 원본) 컴포넌트 정의\n */\nexport function scopeSlotChildDef(\n componentDef: T,\n containerId: string | undefined,\n): T {\n if (\n containerId &&\n componentDef &&\n typeof componentDef.id === 'string' &&\n componentDef.id.length > 0\n ) {\n return { ...componentDef, id: `${componentDef.id}__${containerId}` };\n }\n return componentDef;\n}\n\n/**\n * SlotContainer Props\n */\nexport interface SlotContainerProps {\n /**\n * 슬롯 ID\n *\n * 이 슬롯에 등록된 컴포넌트들을 렌더링합니다.\n */\n slotId: string;\n\n /**\n * 컨테이너 CSS 클래스\n */\n className?: string;\n\n /**\n * 빈 슬롯일 때 표시할 내용\n */\n emptyContent?: React.ReactNode;\n\n /**\n * 인라인 스타일\n */\n style?: React.CSSProperties;\n\n /**\n * 컴포넌트 ID (DOM id)\n */\n id?: string;\n\n /**\n * 자식 컴포넌트 (children을 통한 fallback 또는 slot 컴포넌트가 아닌 정적 컨텐츠)\n */\n children?: React.ReactNode;\n}\n\n/**\n * SlotRegistration 타입 (SlotContext에서 정의된 것과 호환)\n */\ninterface SlotRegistration {\n componentDef: any;\n dataContext: Record;\n order: number;\n parentFormContext: any;\n getParentComponentContext: () => { state: Record; setState: (updates: any) => void };\n translationContext: any;\n registrationKey: string;\n}\n\n/**\n * SlotContext 값 타입\n */\ninterface SlotContextValue {\n getSlotComponents: (slotId: string) => SlotRegistration[];\n subscribeToSlot: (slotId: string, callback: () => void) => () => void;\n isEnabled: boolean;\n}\n\n/**\n * SlotContainer 컴포넌트\n *\n * SlotContext에서 지정된 슬롯 ID에 등록된 컴포넌트들을 수집하여 렌더링합니다.\n * 컴포넌트는 slotOrder 기준으로 정렬됩니다.\n *\n * 이 컴포넌트는 SlotContext를 사용하므로 SlotProvider 내부에서만 동작합니다.\n * SlotProvider는 DynamicRenderer의 루트에서 자동으로 래핑됩니다.\n *\n * @param props SlotContainerProps\n */\nexport const SlotContainer: React.FC = ({\n slotId,\n className = '',\n emptyContent,\n style,\n id,\n children,\n}) => {\n const [slotComponents, setSlotComponents] = useState([]);\n const [, forceUpdate] = useState({});\n\n // SlotContext 가져오기 (window.__slotContextValue 또는 G7Core.getSlotContext() 사용)\n const getSlotContext = useCallback((): SlotContextValue | null => {\n const directSlotContext = (window as any).__slotContextValue;\n if (directSlotContext) {\n return directSlotContext;\n }\n\n const g7Core = (window as any).G7Core;\n if (!g7Core) return null;\n\n const slotContext = g7Core.getSlotContext?.();\n return slotContext || null;\n }, []);\n\n // 슬롯 컴포넌트 업데이트 함수\n const updateSlotComponents = useCallback(() => {\n const slotContext = getSlotContext();\n if (slotContext && slotContext.isEnabled) {\n setSlotComponents(slotContext.getSlotComponents(slotId));\n }\n }, [slotId, getSlotContext]);\n\n // 슬롯 구독 및 업데이트\n useEffect(() => {\n const slotContext = getSlotContext();\n\n if (!slotContext || !slotContext.isEnabled) {\n return;\n }\n\n updateSlotComponents();\n\n const unsubscribe = slotContext.subscribeToSlot(slotId, () => {\n updateSlotComponents();\n forceUpdate({});\n });\n\n return unsubscribe;\n }, [slotId, getSlotContext, updateSlotComponents]);\n\n // G7Core에서 DynamicRenderer 가져오기\n const getDynamicRenderer = useCallback(() => {\n const g7Core = (window as any).G7Core;\n if (!g7Core) return null;\n\n return g7Core.getDynamicRenderer?.();\n }, []);\n\n // 빈 슬롯 처리\n if (slotComponents.length === 0) {\n if (emptyContent) {\n return (\n
\n {emptyContent}\n
\n );\n }\n\n if (children) {\n return (\n
\n {children}\n
\n );\n }\n\n return null;\n }\n\n const DynamicRenderer = getDynamicRenderer();\n const g7Core = (window as any).G7Core;\n\n if (!DynamicRenderer || !g7Core) {\n logger.error('G7Core or DynamicRenderer not available');\n return null;\n }\n\n return (\n
\n {slotComponents.map((registration) => {\n const {\n componentDef,\n dataContext,\n parentFormContext,\n getParentComponentContext,\n translationContext,\n } = registration;\n\n // 같은 슬롯 컴포넌트가 여러 SlotContainer(헤더 데스크톱/모바일)에서 렌더될 때\n // 주입 컴포넌트 root id 를 컨테이너 id 로 스코프해 HTML id 중복을 막는다.\n const scopedDef = scopeSlotChildDef(componentDef, id);\n\n return (\n \n );\n })}\n {children}\n
\n );\n};\n\nexport default SlotContainer;\n","import React, { useState, useRef, useEffect, useCallback, useLayoutEffect } from 'react';\nimport { Div } from '../basic/Div';\nimport { Button } from '../basic/Button';\nimport { Span } from '../basic/Span';\nimport { Icon } from '../basic/Icon';\nimport { IconName } from '../basic/IconTypes';\nimport { Input } from '../basic/Input';\nimport type { EditorAttrs } from '../../types';\n\n/**\n * 알림 아이템 인터페이스\n */\nexport interface NotificationItem {\n id: string | number;\n title: string;\n message: string;\n time: string;\n read?: boolean;\n iconName?: IconName;\n data?: Record;\n onClick?: () => void;\n}\n\n/**\n * NotificationCenter Props\n */\nexport interface NotificationCenterProps {\n /** 알림 목록 */\n notifications?: NotificationItem[];\n /** 서버 기반 미읽음 알림 수 */\n unreadCount?: number;\n /** 추가 로드 가능 여부 */\n hasMore?: boolean;\n /** 로딩 상태 */\n loading?: boolean;\n /** 알림 제목 텍스트 */\n titleText?: string;\n /** 알림 없음 텍스트 */\n emptyText?: string;\n /** \"모두 읽음\" 버튼 텍스트 */\n markAllReadText?: string;\n /** \"모두 삭제\" 버튼 텍스트 */\n deleteAllText?: string;\n /** \"미읽음만\" 체크박스 텍스트 */\n unreadOnlyText?: string;\n /** \"미읽음만\" 체크박스 상태 */\n unreadOnly?: boolean;\n /** 알림 클릭 핸들러 (알림 전체 객체 전달) */\n onNotificationClick?: (notification: NotificationItem) => void;\n /** 드롭다운 닫힐 때 (뷰포트에 들어온 미읽음 알림 ID 목록) */\n onClose?: (visibleUnreadIds: (string | number)[]) => void;\n /** 추가 로드 요청 */\n onLoadMore?: () => void;\n /** 모두 읽음 처리 요청 */\n onMarkAllRead?: () => void;\n /** 모두 삭제 요청 */\n onDeleteAll?: () => void;\n /** 개별 알림 삭제 요청 (알림 전체 객체 전달) */\n onDelete?: (notification: NotificationItem) => void;\n /** \"미읽음만\" 체크박스 토글 */\n onUnreadOnlyToggle?: (checked: boolean) => void;\n /** 드롭다운 정렬 방향 — \"right\"(기본): 우측 정렬되어 좌측으로 확장 / \"left\": 좌측 정렬되어 우측으로 확장 */\n dropdownAlign?: 'left' | 'right';\n className?: string;\n /** DOM id 속성 (레이아웃 편집기 코어 일괄 ID) */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * NotificationCenter 컴포넌트 (User)\n *\n * 알림 센터 - 알림 목록 표시, 무한스크롤, 읽음 추적.\n * sirsoft-admin_basic의 NotificationCenter와 동일 API/동작을 제공한다.\n *\n * @example\n * ```tsx\n * \n * ```\n */\nexport const NotificationCenter: React.FC = ({\n notifications = [],\n unreadCount = 0,\n hasMore = false,\n loading = false,\n titleText = '알림',\n emptyText = '알림이 없습니다.',\n markAllReadText = '모두 읽음',\n deleteAllText = '모두 삭제',\n unreadOnlyText = '안 읽은 알림만',\n unreadOnly = false,\n onNotificationClick,\n onClose,\n onLoadMore,\n onMarkAllRead,\n onDeleteAll,\n onDelete,\n onUnreadOnlyToggle,\n dropdownAlign = 'right',\n className = '',\n id,\n editorAttrs,\n}) => {\n const [showNotifications, setShowNotifications] = useState(false);\n const notificationRef = useRef(null);\n const dropdownRef = useRef(null);\n const scrollRef = useRef(null);\n const sentinelRef = useRef(null);\n const visibleUnreadIdsRef = useRef>(new Set());\n\n // 무한스크롤 관련 최신 값 참조 (observer 재등록 없이 최신 prop 접근)\n const onLoadMoreRef = useRef(onLoadMore);\n const hasMoreRef = useRef(hasMore);\n const loadingRef = useRef(loading);\n const notificationsCountRef = useRef(notifications.length);\n // 마지막 onLoadMore 발행 시점의 notifications.length — 동일 길이에서 중복 발행 가드\n const lastRequestedCountRef = useRef(-1);\n\n useEffect(() => {\n onLoadMoreRef.current = onLoadMore;\n hasMoreRef.current = hasMore;\n loadingRef.current = loading;\n notificationsCountRef.current = notifications.length;\n });\n\n /**\n * 무한스크롤 — IntersectionObserver\n *\n * observer는 드롭다운 열림/닫힘 전환 시에만 재등록한다.\n * 목록이 append되거나 loading/hasMore가 바뀌어도 observer를 새로 만들지 않으므로,\n * sentinel이 이미 뷰포트에 있는 상태에서 재등록 시 즉시 intersecting callback이\n * 중복 발행되던 문제를 방지한다.\n */\n useEffect(() => {\n if (!sentinelRef.current || !scrollRef.current || !showNotifications) return;\n\n // 드롭다운이 새로 열릴 때마다 중복 가드 초기화\n lastRequestedCountRef.current = -1;\n\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (!entry.isIntersecting) return;\n if (loadingRef.current || !hasMoreRef.current) return;\n // B안 가드: 같은 length에서 이미 한 번 발행했다면 skip\n if (lastRequestedCountRef.current === notificationsCountRef.current) return;\n lastRequestedCountRef.current = notificationsCountRef.current;\n onLoadMoreRef.current?.();\n },\n { root: scrollRef.current, threshold: 0.1 }\n );\n\n observer.observe(sentinelRef.current);\n return () => observer.disconnect();\n }, [showNotifications]);\n\n /**\n * 뷰포트 내 미읽음 알림 추적 — IntersectionObserver\n */\n useEffect(() => {\n if (!scrollRef.current || !showNotifications) return;\n\n const observer = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n const id = entry.target.getAttribute('data-notification-id');\n const isUnread = entry.target.getAttribute('data-unread') === 'true';\n if (id && isUnread && entry.isIntersecting) {\n visibleUnreadIdsRef.current.add(id);\n }\n });\n },\n {\n root: scrollRef.current,\n threshold: 0.5,\n }\n );\n\n const items = scrollRef.current.querySelectorAll('[data-notification-id]');\n items.forEach((item) => observer.observe(item));\n\n return () => observer.disconnect();\n }, [showNotifications, notifications]);\n\n /**\n * 뱃지에 표시할 카운트 (handleClose 보다 먼저 선언 — deps 참조 순서)\n */\n const displayCount = unreadCount > 0 ? unreadCount : notifications.filter((n) => !n.read).length;\n\n /**\n * 드롭다운 닫기 — 뷰포트에 들어온 미읽음 알림 ID 전달\n *\n * 불필요한 read-batch 호출 방지:\n * 1) displayCount 가 0 이면 이미 모두 읽음/삭제 처리된 상태 → 전체 skip\n * 2) 뷰포트에 나타났던 ID 중 현재 notifications 기준 여전히 unread 인 것만 전달\n * (\"모두 읽음\" onSuccess 로 notifications 가 갱신되면 필터 결과가 빈 배열이 됨)\n */\n const handleClose = useCallback(() => {\n if (showNotifications) {\n if (displayCount > 0) {\n const unreadIds = Array.from(visibleUnreadIdsRef.current).filter((id) => {\n const n = notifications.find((item) => String(item.id) === String(id));\n return n && !n.read;\n });\n if (unreadIds.length > 0) {\n onClose?.(unreadIds);\n }\n }\n visibleUnreadIdsRef.current.clear();\n setShowNotifications(false);\n }\n }, [showNotifications, onClose, displayCount, notifications]);\n\n /**\n * 외부 클릭 감지 — 드롭다운이 열려 있을 때만 리스너 등록\n * (stale closure 방지: showNotifications 변경 시 리스너 재등록)\n * 주의: handleClose가 useCallback으로 선언된 이후에 위치해야 TDZ 위반 방지\n */\n useEffect(() => {\n if (!showNotifications) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n if (\n notificationRef.current &&\n !notificationRef.current.contains(event.target as Node)\n ) {\n handleClose();\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, [showNotifications, handleClose]);\n\n /**\n * 드롭다운 토글\n */\n const handleToggle = useCallback(() => {\n if (showNotifications) {\n handleClose();\n } else {\n setShowNotifications(true);\n }\n }, [showNotifications, handleClose]);\n\n /**\n * 드롭다운 열릴 때 뷰포트 경계 검사 후 이탈량만큼 translateX 로 보정\n *\n * class 기반 left-0/right-0 전환은 부모 컨테이너 기준이라 부모가 뷰포트 가장자리에 있을 때\n * 여전히 이탈할 수 있다. 따라서 초기 렌더 후 드롭다운의 실제 뷰포트 좌표를 측정하여\n * 이탈한 픽셀만큼 반대 방향으로 이동시키는 방식을 사용한다.\n */\n useLayoutEffect(() => {\n const dropdown = dropdownRef.current;\n if (!showNotifications || !dropdown) return;\n\n // 측정 전 기존 transform 초기화 (재측정 시 누적 방지)\n dropdown.style.transform = '';\n const rect = dropdown.getBoundingClientRect();\n const vw = typeof window !== 'undefined' ? window.innerWidth : 0;\n\n // layout 미측정(jsdom 등)에서 rect 가 0 으로 반환되는 경우 보정 스킵\n if (rect.width === 0 && rect.height === 0) return;\n\n const margin = 8;\n let shift = 0;\n if (rect.right > vw - margin) {\n shift = -(rect.right - (vw - margin));\n } else if (rect.left < margin) {\n shift = margin - rect.left;\n }\n\n if (shift !== 0) {\n dropdown.style.transform = `translateX(${shift}px)`;\n }\n }, [showNotifications, dropdownAlign, notifications.length]);\n\n return (\n
\n \n \n {displayCount > 0 && (\n \n {displayCount > 99 ? '99+' : displayCount}\n \n )}\n \n\n {/* 알림 드롭다운 */}\n {showNotifications && (\n
\n
\n
\n {titleText}\n {onUnreadOnlyToggle && (\n onUnreadOnlyToggle(!unreadOnly)}\n >\n ) => {\n e.stopPropagation();\n onUnreadOnlyToggle(e.target.checked);\n }}\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n className=\"w-3.5 h-3.5 rounded border-gray-300 dark:border-gray-600 text-blue-600 dark:text-blue-400 focus:ring-blue-500 dark:focus:ring-blue-400 cursor-pointer\"\n />\n {unreadOnlyText}\n
\n )}\n
\n
\n {onMarkAllRead && displayCount > 0 && (\n {\n onMarkAllRead();\n visibleUnreadIdsRef.current.clear();\n }}\n className=\"text-xs text-blue-600 dark:text-blue-400 hover:text-blue-800 dark:hover:text-blue-300 hover:underline cursor-pointer\"\n >\n {markAllReadText}\n \n )}\n {onDeleteAll && notifications.length > 0 && (\n {\n // 드롭다운은 닫지 않음 — 확인 모달이 닫히면 다시 자연스럽게 노출되어야 하고,\n // 사용자가 모달 취소 시에도 컨텍스트 유지 (요구사항)\n onDeleteAll();\n }}\n className=\"text-xs text-red-600 dark:text-red-400 hover:text-red-800 dark:hover:text-red-300 hover:underline cursor-pointer\"\n >\n {deleteAllText}\n \n )}\n
\n
\n
\n {notifications.length === 0 && !loading ? (\n
\n {emptyText}\n
\n ) : (\n <>\n {notifications.map((notification) => {\n const isUnread = !notification.read;\n return (\n {\n notification.onClick?.();\n onNotificationClick?.(notification);\n setShowNotifications(false);\n }}\n className={`group flex items-start gap-3 px-4 py-3 text-left border-b border-gray-100 dark:border-gray-700 transition-colors cursor-pointer ${\n isUnread\n ? 'bg-blue-50/70 dark:bg-blue-900/20 hover:bg-blue-50 dark:hover:bg-blue-900/30'\n : 'bg-white dark:bg-gray-800 hover:bg-gray-50 dark:hover:bg-gray-700/50 opacity-70'\n }`}\n >\n {notification.iconName && (\n \n )}\n
\n \n {notification.title}\n
\n \n {notification.message}\n
\n
\n {notification.time}\n
\n
\n
\n {isUnread && (\n \n )}\n {onDelete && (\n {\n e.stopPropagation();\n onDelete(notification);\n }}\n className=\"p-1 text-gray-400 dark:text-gray-500 hover:text-red-600 dark:hover:text-red-400 rounded hover:bg-red-50 dark:hover:bg-red-900/20 cursor-pointer opacity-0 group-hover:opacity-100 transition-opacity\"\n aria-label=\"Delete notification\"\n >\n \n \n )}\n
\n
\n );\n })}\n {/* 무한스크롤 sentinel */}\n {hasMore && (\n
\n {loading ? (\n ...\n ) : (\n \n )}\n
\n )}\n {loading && !hasMore && notifications.length > 0 && (\n
\n ...\n
\n )}\n \n )}\n
\n
\n )}\n
\n );\n};\n\nexport default NotificationCenter;\n","/**\n * Header 컴포넌트\n *\n * 사이트 상단 헤더 컴포넌트입니다.\n * 로고, 검색바, 네비게이션, 사용자 메뉴, 장바구니, 알림을 포함합니다.\n *\n * @see 화면 구성:\n * ┌─────────────────────────────────────────────────────────────────┐\n * │ [Logo] [검색바................] [🔔] [🛒(3)] [👤 닉네임 ▼] │\n * ├─────────────────────────────────────────────────────────────────┤\n * │ [홈] [🔥인기] [🛒쇼핑] [자유게시판] [질문답변] [갤러리] [더보기▼] │\n * └─────────────────────────────────────────────────────────────────┘\n */\n\nimport React, { useState, useRef, useEffect } from 'react';\n\n// 기본 컴포넌트 import\nimport { Div } from '../basic/Div';\nimport { Button } from '../basic/Button';\nimport { Input } from '../basic/Input';\nimport { Span } from '../basic/Span';\nimport { Img } from '../basic/Img';\nimport { Icon } from '../basic/Icon';\nimport { Form } from '../basic/Form';\nimport { Nav } from '../basic/Nav';\nimport { Header as HeaderBasic } from '../basic/Header';\nimport { Hr } from '../basic/Hr';\nimport { A } from '../basic/A';\n\n// ThemeToggle 컴포넌트 import\nimport { ThemeToggle } from './ThemeToggle';\n\n// Avatar 컴포넌트 import\nimport { Avatar } from './Avatar';\n\n// SlotContainer — 헤더 통화 등 모듈 주입 UI 를 떙겨 렌더 (헤더는 주입 모듈을 모름)\nimport { SlotContainer } from './SlotContainer';\n\n// NotificationCenter 컴포넌트 import\nimport { NotificationCenter, type NotificationItem } from './NotificationCenter';\n\n// G7Core.t() 번역 함수 참조\nconst t = (key: string, params?: Record) =>\n (window as any).G7Core?.t?.(key, params) ?? key;\n\n// G7Core.dispatch() navigate 헬퍼\nconst navigate = (path: string) => {\n (window as any).G7Core?.dispatch?.({\n handler: 'navigate',\n params: { path },\n });\n};\n\ninterface Board {\n id: number;\n name: string;\n slug: string;\n icon?: string;\n}\n\ninterface User {\n uuid: string;\n name: string;\n avatar?: string;\n is_admin?: boolean;\n}\n\ninterface HeaderProps {\n /** 사이트 로고 URL */\n logo?: string;\n /** 사이트 이름 */\n siteName?: string;\n /** 현재 로그인된 사용자 */\n user?: User | null;\n /** 장바구니 아이템 수 */\n cartCount?: number;\n /** 읽지 않은 알림 수 */\n notificationCount?: number;\n /** 게시판 목록 */\n boards?: Board[];\n /** 탭에 표시할 최대 게시판 수 */\n maxVisibleBoards?: number;\n /** 모바일 메뉴 열기 콜백 */\n onMobileMenuOpen?: () => void;\n /** 사용 가능한 언어 목록 */\n availableLocales?: string[];\n /** 현재 언어 */\n currentLocale?: string;\n /** 쇼핑몰 기본 경로 (예: \"/shop\", \"/\") */\n shopBase?: string;\n /** 추가 CSS 클래스 */\n className?: string;\n /** 레이아웃 편집기 식별 속성(data-editor-*) — 시각적 루트에 spread */\n editorAttrs?: Record;\n\n // ===== 알림센터 드롭다운 Props =====\n /** 알림 목록 (NotificationCenter에 전달) */\n notifications?: NotificationItem[];\n /** 더 불러올 페이지 존재 여부 */\n notificationHasMore?: boolean;\n /** 알림 로딩 상태 */\n notificationLoading?: boolean;\n /** \"안 읽은 알림만\" 필터 상태 */\n notificationUnreadOnly?: boolean;\n /** 알림 드롭다운 제목 */\n notificationTitleText?: string;\n /** 알림 없음 텍스트 */\n notificationEmptyText?: string;\n /** \"모두 읽음\" 텍스트 */\n notificationMarkAllReadText?: string;\n /** \"모두 삭제\" 텍스트 */\n notificationDeleteAllText?: string;\n /** \"안 읽은 알림만\" 체크박스 텍스트 */\n notificationUnreadOnlyText?: string;\n /** 알림 드롭다운 닫힐 때 (뷰포트에 보인 미읽음 ID 배열 전달) */\n onNotificationClose?: (visibleUnreadIds: (string | number)[]) => void;\n /** 개별 알림 클릭 */\n onNotificationClick?: (notification: NotificationItem) => void;\n /** 무한 스크롤: 추가 로드 */\n onNotificationLoadMore?: () => void;\n /** \"모두 읽음\" 처리 */\n onNotificationMarkAllRead?: () => void;\n /** \"모두 삭제\" 요청 (모달 오픈) */\n onNotificationDeleteAll?: () => void;\n /** 개별 알림 삭제 */\n onNotificationDelete?: (notification: NotificationItem) => void;\n /** \"안 읽은 알림만\" 체크박스 토글 */\n onNotificationUnreadOnlyToggle?: (checked: boolean) => void;\n}\n\n/**\n * 사이트 헤더 컴포넌트\n *\n * @example\n * ```json\n * // 레이아웃 JSON에서 사용\n * {\n * \"type\": \"composite\",\n * \"name\": \"Header\",\n * \"props\": {\n * \"logo\": \"{{_global.settings.site_logo}}\",\n * \"siteName\": \"{{_global.settings.site_name}}\",\n * \"user\": \"{{_global.currentUser}}\",\n * \"cartCount\": \"{{_global.cartCount}}\",\n * \"notificationCount\": \"{{_global.notificationCount}}\",\n * \"boards\": \"{{boards.data}}\",\n * \"maxVisibleBoards\": 5\n * }\n * }\n * ```\n */\nconst Header: React.FC = ({\n logo,\n siteName = '그누보드7',\n user,\n cartCount = 0,\n notificationCount = 0,\n boards = [],\n maxVisibleBoards = 5,\n onMobileMenuOpen,\n availableLocales = [],\n currentLocale = 'ko',\n shopBase = '/shop',\n className = '',\n editorAttrs,\n // 알림센터\n notifications = [],\n notificationHasMore = false,\n notificationLoading = false,\n notificationUnreadOnly = false,\n notificationTitleText,\n notificationEmptyText,\n notificationMarkAllReadText,\n notificationDeleteAllText,\n notificationUnreadOnlyText,\n onNotificationClose,\n onNotificationClick,\n onNotificationLoadMore,\n onNotificationMarkAllRead,\n onNotificationDeleteAll,\n onNotificationDelete,\n onNotificationUnreadOnlyToggle,\n}) => {\n const [searchQuery, setSearchQuery] = useState('');\n const [showUserMenu, setShowUserMenu] = useState(false);\n const [showMoreBoards, setShowMoreBoards] = useState(false);\n const [showLangMenu, setShowLangMenu] = useState(false);\n const [dropdownPosition, setDropdownPosition] = useState<{ top: number; left: number }>({ top: 0, left: 0 });\n const [currentPath, setCurrentPath] = useState(window.location.pathname);\n const userMenuRef = useRef(null);\n const moreButtonRef = useRef(null);\n const langMenuRef = useRef(null);\n\n // G7Core.useResponsive를 통해 반응형 상태 구독 (G7 표준 — 위지윅 overrideWidth 호환)\n const G7Core = (window as any).G7Core;\n const useResponsive = G7Core?.useResponsive;\n const responsiveValue = useResponsive?.();\n const isMobile = responsiveValue\n ? responsiveValue.width < 768\n : typeof window !== 'undefined' && window.innerWidth < 768;\n\n // 경로 변경 감지 (SPA 네비게이션 대응)\n useEffect(() => {\n const handlePopState = () => setCurrentPath(window.location.pathname);\n window.addEventListener('popstate', handlePopState);\n\n // G7Core의 navigate 이벤트 감지\n const originalPushState = history.pushState;\n history.pushState = function(...args) {\n originalPushState.apply(this, args);\n setCurrentPath(window.location.pathname);\n };\n\n return () => {\n window.removeEventListener('popstate', handlePopState);\n history.pushState = originalPushState;\n };\n }, []);\n\n // 경로 매칭 헬퍼 함수\n const isActiveRoute = (path: string, exact = false): boolean => {\n if (exact) {\n return currentPath === path;\n }\n return currentPath === path || currentPath.startsWith(path + '/');\n };\n\n // 쇼핑 관련 경로 체크 (products, cart, checkout, category 등)\n const isShopActive = (): boolean => {\n const base = shopBase === '/' ? '' : shopBase;\n return currentPath.startsWith(`${base}/products`) ||\n currentPath.startsWith(`${base}/cart`) ||\n currentPath.startsWith(`${base}/checkout`) ||\n currentPath.startsWith(`${base}/category`);\n };\n\n // 네비게이션 버튼 스타일\n const getNavButtonClass = (isActive: boolean): string => {\n const baseClass = 'px-3 py-2 text-sm font-medium whitespace-nowrap cursor-pointer rounded-lg transition-colors';\n if (isActive) {\n return `${baseClass} bg-gray-900 text-white dark:bg-white dark:text-gray-900`;\n }\n return `${baseClass} text-gray-700 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white hover:bg-gray-100 dark:hover:bg-gray-800`;\n };\n\n // 메뉴 외부 클릭 시 닫기\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (userMenuRef.current && !userMenuRef.current.contains(event.target as Node)) {\n setShowUserMenu(false);\n }\n if (moreButtonRef.current && !moreButtonRef.current.contains(event.target as Node)) {\n setShowMoreBoards(false);\n }\n if (langMenuRef.current && !langMenuRef.current.contains(event.target as Node)) {\n setShowLangMenu(false);\n }\n };\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n const visibleBoards = boards.slice(0, maxVisibleBoards);\n const hiddenBoards = boards.slice(maxVisibleBoards);\n\n const handleSearch = (e: React.FormEvent) => {\n e.preventDefault();\n if (searchQuery.trim()) {\n navigate(`/search?q=${encodeURIComponent(searchQuery)}`);\n }\n };\n\n const handleLogout = async () => {\n // G7Core.dispatch를 사용하여 logout 핸들러 호출\n // AuthManager가 토큰 삭제, 상태 초기화, 리다이렉트를 처리\n (window as any).G7Core?.dispatch?.({\n handler: 'logout',\n });\n };\n\n // 언어 변경 핸들러 — 헤더 독립 언어 버튼(코어 기능)에서 호출. setLocale 은 비회원도 동작.\n const handleLocaleChange = (locale: string) => {\n (window as any).G7Core?.dispatch?.({\n handler: 'setLocale',\n target: locale,\n });\n setShowLangMenu(false);\n };\n\n // 로케일 코드 → 표시명 (활성 언어팩 native_name 우선, 폴백 사전)\n const getLocaleName = (locale: string): string =>\n (window as any).G7Core?.state?.get?.('_global.appConfig.localeNames')?.[locale] ??\n (locale === 'ko' ? '한국어' : locale === 'en' ? 'English' : locale === 'ja' ? '日本語' : locale === 'zh' ? '中文' : locale === 'es' ? 'Español' : locale === 'fr' ? 'Français' : locale === 'de' ? 'Deutsch' : locale.toUpperCase());\n\n return (\n )}\n className={`sticky top-0 z-50 bg-white dark:bg-gray-900 border-b border-gray-200 dark:border-gray-800 ${className}`}\n >\n {/* 상단 바 */}\n \n
\n
\n {/* 로고 */}\n \n\n {/* 검색바 (데스크톱 전용) */}\n {!isMobile && (\n
\n
\n setSearchQuery(e.target.value)}\n placeholder={t('common.search_placeholder')}\n className=\"w-full px-4 py-2 pl-10 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 text-gray-900 dark:text-white focus:ring-2 focus:ring-blue-500 focus:border-blue-500\"\n />\n \n
\n
\n )}\n\n {/* 우측 액션 버튼들 */}\n
\n {/* 다크모드 전환 */}\n \n\n {/* 알림센터 드롭다운 — 로그인 사용자에게만 노출 */}\n {user?.uuid && (\n \n )}\n\n {/* 장바구니 */}\n \n\n {/* 언어 선택 — 헤더 독립 버튼(코어 기능, 비회원 포함 전체 노출). 공간 절약 위해 아이콘+로케일 코드만.\n 언어는 항상 존재(이커머스 무관) → 템플릿 헤더 내장. */}\n {availableLocales && availableLocales.length > 1 && (\n
\n setShowLangMenu(!showLangMenu)}\n className=\"flex items-center gap-1.5 px-2.5 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg cursor-pointer transition-colors\"\n aria-haspopup=\"listbox\"\n aria-expanded={showLangMenu}\n aria-label={t('common.language')}\n >\n \n {currentLocale}\n \n \n {showLangMenu && (\n \n {availableLocales.map((locale) => {\n const isActive = locale === currentLocale;\n return (\n handleLocaleChange(locale)}\n className={`w-full px-4 py-2.5 text-left text-sm flex items-center gap-3 cursor-pointer transition-colors ${\n isActive\n ? 'bg-blue-50 dark:bg-blue-900/20 text-blue-600 dark:text-blue-400'\n : 'text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700'\n }`}\n >\n \n {getLocaleName(locale)}\n {isActive && }\n \n );\n })}\n
\n )}\n
\n )}\n\n {/* 통화 선택 — 이커머스 모듈이 'header_currency' 슬롯에 주입(layout_extensions).\n 헤더는 슬롯 이름만 알고 통화/모듈을 모름. 모듈 비활성 시 빈 슬롯 → 미렌더(인프라 자동 게이트).\n id 지정 필수 — 같은 슬롯이 모바일 헤더 SlotContainer 와 동시 렌더되므로 주입 컴포넌트\n root id 가 컨테이너별로 스코프되도록(SlotContainer 가 id 로 자식 root id 를 고유화) 한다. */}\n \n\n {/* 사용자 메뉴 */}\n {user?.uuid ? (\n
\n setShowUserMenu(!showUserMenu)}\n className=\"flex items-center gap-2 p-2 text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white\"\n >\n \n {user.name}\n \n \n\n {/* 드롭다운 메뉴 */}\n {showUserMenu && (\n
\n {/* 사용자 정보 헤더 */}\n
\n
\n \n
\n
{user.name}
\n
{t('common.member')}
\n
\n
\n
\n\n {/* 메뉴 항목 */}\n
\n {/* 관리자 메뉴 (is_admin일 때만 표시) - 하이퍼링크로 전체 페이지 새로고침 */}\n {user.is_admin && (\n <>\n \n \n {t('common.admin_menu')}\n \n
\n \n )}\n \n \n \n
\n\n {/* 언어 선택은 헤더 독립 버튼으로 일원화(드롭다운에서 제거) — 비회원도 헤더에서 전환 가능 */}\n\n
\n \n \n {t('auth.logout')}\n \n
\n )}\n
\n ) : (\n
\n {/* 주문조회 — 로그인 페이지로 진입. 회원은 로그인 후 redirect 파라미터로 마이페이지 주문 내역으로 이동, 비회원은 로그인 페이지의 '비회원 주문 조회' 링크로 폼 진입. 로그아웃된 회원이 비회원 페이지에서 막다른 길에 빠지는 케이스를 차단한다. */}\n navigate('/login?redirect=/mypage/orders')}\n className=\"px-2.5 py-2 text-sm font-medium text-gray-700 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white cursor-pointer\"\n >\n {t('shop.guest_order_form.nav_link')}\n \n navigate('/login')}\n className=\"px-2.5 py-2 text-sm font-medium text-gray-700 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white cursor-pointer\"\n >\n {t('auth.login')}\n \n navigate('/register')}\n className=\"ml-1 px-3 py-2 text-sm font-medium text-white bg-emerald-500 rounded-lg hover:bg-emerald-600 cursor-pointer\"\n >\n {t('auth.register_link')}\n \n
\n )}\n\n {/* 모바일 햄버거 메뉴 (모바일 전용) */}\n {isMobile && (\n \n \n \n )}\n
\n
\n\n {/* 탭 네비게이션 (데스크톱 전용) */}\n {!isMobile && (\n
\n \n )}\n \n );\n};\n\nexport default Header;\n","import React from 'react';\n\nexport interface FooterProps extends React.HTMLAttributes {\n ref?: React.Ref;\n}\n\n/**\n * 기본 footer 컴포넌트\n */\nexport const Footer = React.forwardRef(({\n children,\n className = '',\n ...props\n}, ref) => {\n return (\n \n {children}\n \n );\n});\n","/**\n * Footer 컴포넌트\n *\n * 사이트 하단 푸터 컴포넌트입니다.\n * 사이트 정보, 링크 그룹, 소셜 링크, 저작권 표시를 포함합니다.\n *\n * @see 화면 구성:\n * ┌─────────────────────────────────────────────────────────────────┐\n * │ [사이트명] │\n * │ 함께 성장하는 커뮤니티 │\n * ├────────────┬────────────┬────────────┬────────────────────────────┤\n * │ 커뮤니티 │ 정보 │ 정책 │ [GitHub] [Twitter] [Discord]│\n * ├─────────────────────────────────────────────────────────────────┤\n * │ © 2026 사이트명. All rights reserved. Made with ❤️ │\n * └─────────────────────────────────────────────────────────────────┘\n */\n\nimport React from 'react';\n\n// 기본 컴포넌트 import\nimport { Div } from '../basic/Div';\nimport { A } from '../basic/A';\nimport { Button } from '../basic/Button';\nimport { H3 } from '../basic/H3';\nimport { H4 } from '../basic/H4';\nimport { P } from '../basic/P';\nimport { Ul } from '../basic/Ul';\nimport { Li } from '../basic/Li';\nimport { Footer as FooterBasic } from '../basic/Footer';\nimport { Icon } from '../basic/Icon';\n\n// G7Core.t() 번역 함수 참조\nconst t = (key: string, params?: Record) =>\n (window as any).G7Core?.t?.(key, params) ?? key;\n\n// G7 표준 반응형 breakpoint — 모바일(< 768) / 데스크톱(>= 1024).\n// 레이아웃 편집기 프리뷰 호환을 위해 Tailwind md:/lg:/sm: 미디어쿼리 대신\n// G7Core.useResponsive() width 기반 분기 사용 (편집 가능 템플릿은 G7 표준\n// responsive 만 허용 — viewport 미디어쿼리는 프리뷰 overrideWidth 를 무시).\nconst TABLET_BREAKPOINT = 768;\nconst DESKTOP_BREAKPOINT = 1024;\n\n// G7Core.dispatch() navigate 헬퍼\nconst navigate = (path: string) => {\n (window as any).G7Core?.dispatch?.({\n handler: 'navigate',\n params: { path },\n });\n};\n\ninterface SocialLinks {\n github?: string;\n twitter?: string;\n discord?: string;\n facebook?: string;\n instagram?: string;\n}\n\ninterface FooterLink {\n label: string;\n href: string;\n}\n\ninterface FooterLinkGroup {\n title: string;\n links: FooterLink[];\n}\n\ninterface FooterProps {\n /** 사이트 이름 */\n siteName?: string;\n /** 사이트 설명 */\n siteDescription?: string;\n /** 저작권 텍스트 */\n copyrightText?: string;\n /** 소셜 미디어 링크 */\n socialLinks?: SocialLinks;\n /** 링크 그룹 (미지정 시 기본값 사용) */\n linkGroups?: FooterLinkGroup[];\n /** 추가 CSS 클래스 */\n className?: string;\n /** 레이아웃 편집기 식별 속성(data-editor-*) — 시각적 루트에 spread */\n editorAttrs?: Record;\n}\n\n/**\n * 사이트 푸터 컴포넌트\n *\n * @example\n * ```json\n * // 레이아웃 JSON에서 사용\n * {\n * \"type\": \"composite\",\n * \"name\": \"Footer\",\n * \"props\": {\n * \"siteName\": \"{{_global.settings.site_name}}\",\n * \"siteDescription\": \"{{_global.settings.site_description}}\",\n * \"copyrightText\": \"{{_global.settings.copyright_text}}\",\n * \"socialLinks\": {\n * \"github\": \"https://github.com/...\",\n * \"twitter\": \"https://twitter.com/...\",\n * \"discord\": \"https://discord.gg/...\"\n * }\n * }\n * }\n * ```\n */\nconst Footer: React.FC = ({\n siteName = '그누보드7',\n siteDescription,\n copyrightText,\n socialLinks = {},\n linkGroups,\n className = '',\n editorAttrs,\n}) => {\n const currentYear = new Date().getFullYear();\n\n // G7 표준 반응형 — useResponsive() 로 프리뷰 overrideWidth 수신 (편집기 디바이스\n // 전환에 정상 반응). hook 미주입 시 window.innerWidth fallback.\n const G7Core = (window as any).G7Core;\n const useResponsive = G7Core?.useResponsive as (() => { width: number }) | undefined;\n const responsiveValue = useResponsive?.();\n const width =\n responsiveValue?.width ??\n (typeof window !== 'undefined' ? window.innerWidth : DESKTOP_BREAKPOINT);\n const isMobile = width < TABLET_BREAKPOINT;\n const isDesktop = width >= DESKTOP_BREAKPOINT;\n // 링크 그룹 그리드 컬럼 — 모바일 1열 / 태블릿 2열 / 데스크톱 5열.\n const gridColumns = isMobile ? 1 : isDesktop ? 5 : 2;\n\n // 기본 링크 그룹\n const defaultLinkGroups: FooterLinkGroup[] = [\n {\n title: t('footer.community'),\n links: [\n { label: t('nav.home'), href: '/' },\n { label: t('nav.popular'), href: '/boards/popular' },\n { label: t('footer.all_boards'), href: '/boards' },\n ],\n },\n {\n title: t('footer.info'),\n links: [\n { label: t('footer.about'), href: '/page/about' },\n { label: t('footer.faq'), href: '/page/faq' },\n { label: t('footer.contact'), href: '/page/contact' },\n ],\n },\n {\n title: t('footer.policy'),\n links: [\n { label: t('footer.terms'), href: '/page/terms' },\n { label: t('footer.privacy'), href: '/page/privacy' },\n { label: t('footer.refund'), href: '/page/refund' },\n ],\n },\n ];\n\n const groups = linkGroups || defaultLinkGroups;\n\n // 소셜 아이콘 이름 매핑\n const socialIconMap: Record = {\n github: 'github',\n twitter: 'twitter',\n discord: 'discord',\n facebook: 'facebook',\n instagram: 'instagram',\n };\n\n return (\n )}\n className={`bg-gray-50 dark:bg-gray-900 border-t border-gray-200 dark:border-gray-800 ${className}`}\n >\n
\n \n {/* 사이트 정보 — 데스크톱(5열)에서만 2칸 차지 */}\n \n\n {/* 링크 그룹 */}\n {groups.map((group, index) => (\n
\n

\n {group.title}\n

\n
    \n {group.links.map((link, linkIndex) => (\n
  • \n navigate(link.href)}\n className=\"text-sm text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white cursor-pointer\"\n >\n {link.label}\n \n
  • \n ))}\n
\n
\n ))}\n
\n\n {/* 저작권 */}\n \n

\n {copyrightText || `© ${currentYear} ${siteName}. All rights reserved.`}\n

\n

\n {t('footer.powered_by')}\n

\n
\n
\n \n );\n};\n\nexport default Footer;\n","/**\n * MobileNav 컴포넌트\n *\n * 모바일 환경에서 표시되는 슬라이드 드로어 네비게이션입니다.\n * 햄버거 메뉴 클릭 시 좌측에서 슬라이드하며 나타납니다.\n */\n\nimport React, { useEffect, useRef } from 'react';\nimport { Div } from '../basic/Div';\nimport { Button } from '../basic/Button';\nimport { Span } from '../basic/Span';\nimport { P } from '../basic/P';\nimport { Icon } from '../basic/Icon';\nimport { Img } from '../basic/Img';\nimport { Nav } from '../basic/Nav';\nimport { Ul } from '../basic/Ul';\nimport { Li } from '../basic/Li';\n\n/**\n * G7Core 번역 함수\n */\nconst t = (key: string, params?: Record) =>\n (window as any).G7Core?.t?.(key, params) ?? key;\n\n/**\n * G7Core navigate 헬퍼\n */\nconst navigate = (path: string) => {\n (window as any).G7Core?.dispatch?.({\n handler: 'navigate',\n params: { path },\n });\n};\n\ninterface Board {\n id: number;\n name: string;\n slug: string;\n icon?: string;\n}\n\ninterface User {\n id: number;\n name: string;\n avatar?: string;\n}\n\ninterface MobileNavProps {\n /** 드로어 열림 상태 */\n isOpen: boolean;\n /** 닫기 콜백 */\n onClose: () => void;\n /** 사이트 로고 URL */\n logo?: string;\n /** 사이트 이름 */\n siteName?: string;\n /** 현재 로그인된 사용자 */\n user?: User | null;\n /** 게시판 목록 */\n boards?: Board[];\n /** 장바구니 아이템 수 */\n cartCount?: number;\n}\n\n/**\n * 모바일 네비게이션 드로어\n *\n * @example\n * ```tsx\n * const [isOpen, setIsOpen] = useState(false);\n *\n * setIsOpen(false)}\n * user={currentUser}\n * boards={boards}\n * />\n * ```\n */\nconst MobileNav: React.FC = ({\n isOpen,\n onClose,\n logo,\n siteName = '그누보드7',\n user,\n boards = [],\n cartCount = 0,\n}) => {\n const drawerRef = useRef(null);\n\n // G7Core.useResponsive를 통해 반응형 상태 구독 (G7 표준 — 위지윅 overrideWidth 호환)\n const G7Core = (window as any).G7Core;\n const useResponsive = G7Core?.useResponsive;\n const responsiveValue = useResponsive?.();\n // lg 미만(< 1024px)에서만 드로어 노출 — 데스크톱은 Header의 탭 nav 사용\n const isPortable = responsiveValue\n ? responsiveValue.width < 1024\n : typeof window !== 'undefined' && window.innerWidth < 1024;\n\n // ESC 키로 닫기\n useEffect(() => {\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n onClose();\n }\n };\n\n if (isOpen) {\n document.addEventListener('keydown', handleEscape);\n document.body.style.overflow = 'hidden';\n }\n\n return () => {\n document.removeEventListener('keydown', handleEscape);\n document.body.style.overflow = '';\n };\n }, [isOpen, onClose]);\n\n // 오버레이 클릭으로 닫기\n const handleOverlayClick = (e: React.MouseEvent) => {\n if (e.target === e.currentTarget) {\n onClose();\n }\n };\n\n if (!isOpen) return null;\n // 데스크톱(lg+)에서는 모바일 드로어 자체를 노출하지 않음 (위지윅 overrideWidth 호환)\n if (!isPortable) return null;\n\n return (\n \n {/* 오버레이 */}\n
\n\n {/* 드로어 */}\n \n {/* 헤더 */}\n
\n \n \n \n \n
\n\n {/* 사용자 정보 */}\n {user ? (\n
\n
\n {user.avatar ? (\n {user.name}\n ) : (\n
\n {(user.name || 'U').charAt(0).toUpperCase()}\n
\n )}\n
\n

{user.name}

\n \n
\n
\n
\n ) : (\n
\n
\n { onClose(); navigate('/login'); }}\n className=\"flex-1 py-2 text-center text-sm font-medium text-white bg-gray-900 dark:bg-white dark:text-gray-900 rounded-lg cursor-pointer\"\n >\n {t('auth.login')}\n \n { onClose(); navigate('/register'); }}\n className=\"flex-1 py-2 text-center text-sm font-medium text-gray-700 dark:text-gray-300 border border-gray-300 dark:border-gray-600 rounded-lg cursor-pointer\"\n >\n {t('auth.register')}\n \n
\n
\n )}\n\n {/* 메뉴 */}\n \n\n {/* 하단 링크 */}\n
\n
\n \n \n \n
\n
\n
\n
\n );\n};\n\nexport default MobileNav;\n","/*! @license DOMPurify 3.3.1 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.3.1/LICENSE */\n\nconst {\n entries,\n setPrototypeOf,\n isFrozen,\n getPrototypeOf,\n getOwnPropertyDescriptor\n} = Object;\nlet {\n freeze,\n seal,\n create\n} = Object; // eslint-disable-line import/no-mutable-exports\nlet {\n apply,\n construct\n} = typeof Reflect !== 'undefined' && Reflect;\nif (!freeze) {\n freeze = function freeze(x) {\n return x;\n };\n}\nif (!seal) {\n seal = function seal(x) {\n return x;\n };\n}\nif (!apply) {\n apply = function apply(func, thisArg) {\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return func.apply(thisArg, args);\n };\n}\nif (!construct) {\n construct = function construct(Func) {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n return new Func(...args);\n };\n}\nconst arrayForEach = unapply(Array.prototype.forEach);\nconst arrayLastIndexOf = unapply(Array.prototype.lastIndexOf);\nconst arrayPop = unapply(Array.prototype.pop);\nconst arrayPush = unapply(Array.prototype.push);\nconst arraySplice = unapply(Array.prototype.splice);\nconst stringToLowerCase = unapply(String.prototype.toLowerCase);\nconst stringToString = unapply(String.prototype.toString);\nconst stringMatch = unapply(String.prototype.match);\nconst stringReplace = unapply(String.prototype.replace);\nconst stringIndexOf = unapply(String.prototype.indexOf);\nconst stringTrim = unapply(String.prototype.trim);\nconst objectHasOwnProperty = unapply(Object.prototype.hasOwnProperty);\nconst regExpTest = unapply(RegExp.prototype.test);\nconst typeErrorCreate = unconstruct(TypeError);\n/**\n * Creates a new function that calls the given function with a specified thisArg and arguments.\n *\n * @param func - The function to be wrapped and called.\n * @returns A new function that calls the given function with a specified thisArg and arguments.\n */\nfunction unapply(func) {\n return function (thisArg) {\n if (thisArg instanceof RegExp) {\n thisArg.lastIndex = 0;\n }\n for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n args[_key3 - 1] = arguments[_key3];\n }\n return apply(func, thisArg, args);\n };\n}\n/**\n * Creates a new function that constructs an instance of the given constructor function with the provided arguments.\n *\n * @param func - The constructor function to be wrapped and called.\n * @returns A new function that constructs an instance of the given constructor function with the provided arguments.\n */\nfunction unconstruct(Func) {\n return function () {\n for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n args[_key4] = arguments[_key4];\n }\n return construct(Func, args);\n };\n}\n/**\n * Add properties to a lookup table\n *\n * @param set - The set to which elements will be added.\n * @param array - The array containing elements to be added to the set.\n * @param transformCaseFunc - An optional function to transform the case of each element before adding to the set.\n * @returns The modified set with added elements.\n */\nfunction addToSet(set, array) {\n let transformCaseFunc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : stringToLowerCase;\n if (setPrototypeOf) {\n // Make 'in' and truthy checks like Boolean(set.constructor)\n // independent of any properties defined on Object.prototype.\n // Prevent prototype setters from intercepting set as a this value.\n setPrototypeOf(set, null);\n }\n let l = array.length;\n while (l--) {\n let element = array[l];\n if (typeof element === 'string') {\n const lcElement = transformCaseFunc(element);\n if (lcElement !== element) {\n // Config presets (e.g. tags.js, attrs.js) are immutable.\n if (!isFrozen(array)) {\n array[l] = lcElement;\n }\n element = lcElement;\n }\n }\n set[element] = true;\n }\n return set;\n}\n/**\n * Clean up an array to harden against CSPP\n *\n * @param array - The array to be cleaned.\n * @returns The cleaned version of the array\n */\nfunction cleanArray(array) {\n for (let index = 0; index < array.length; index++) {\n const isPropertyExist = objectHasOwnProperty(array, index);\n if (!isPropertyExist) {\n array[index] = null;\n }\n }\n return array;\n}\n/**\n * Shallow clone an object\n *\n * @param object - The object to be cloned.\n * @returns A new object that copies the original.\n */\nfunction clone(object) {\n const newObject = create(null);\n for (const [property, value] of entries(object)) {\n const isPropertyExist = objectHasOwnProperty(object, property);\n if (isPropertyExist) {\n if (Array.isArray(value)) {\n newObject[property] = cleanArray(value);\n } else if (value && typeof value === 'object' && value.constructor === Object) {\n newObject[property] = clone(value);\n } else {\n newObject[property] = value;\n }\n }\n }\n return newObject;\n}\n/**\n * This method automatically checks if the prop is function or getter and behaves accordingly.\n *\n * @param object - The object to look up the getter function in its prototype chain.\n * @param prop - The property name for which to find the getter function.\n * @returns The getter function found in the prototype chain or a fallback function.\n */\nfunction lookupGetter(object, prop) {\n while (object !== null) {\n const desc = getOwnPropertyDescriptor(object, prop);\n if (desc) {\n if (desc.get) {\n return unapply(desc.get);\n }\n if (typeof desc.value === 'function') {\n return unapply(desc.value);\n }\n }\n object = getPrototypeOf(object);\n }\n function fallbackValue() {\n return null;\n }\n return fallbackValue;\n}\n\nconst html$1 = freeze(['a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'big', 'blink', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'decorator', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'element', 'em', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meter', 'nav', 'nobr', 'ol', 'optgroup', 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'search', 'section', 'select', 'shadow', 'slot', 'small', 'source', 'spacer', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr']);\nconst svg$1 = freeze(['svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'enterkeyhint', 'exportparts', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'inputmode', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'part', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'view', 'vkern']);\nconst svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']);\n// List of SVG elements that are disallowed by default.\n// We still need to know them so that we can do namespace\n// checks properly in case one wants to add them to\n// allow-list.\nconst svgDisallowed = freeze(['animate', 'color-profile', 'cursor', 'discard', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'foreignobject', 'hatch', 'hatchpath', 'mesh', 'meshgradient', 'meshpatch', 'meshrow', 'missing-glyph', 'script', 'set', 'solidcolor', 'unknown', 'use']);\nconst mathMl$1 = freeze(['math', 'menclose', 'merror', 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mspace', 'msqrt', 'mstyle', 'msub', 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover', 'mprescripts']);\n// Similarly to SVG, we want to know all MathML elements,\n// even those that we disallow by default.\nconst mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']);\nconst text = freeze(['#text']);\n\nconst html = freeze(['accept', 'action', 'align', 'alt', 'autocapitalize', 'autocomplete', 'autopictureinpicture', 'autoplay', 'background', 'bgcolor', 'border', 'capture', 'cellpadding', 'cellspacing', 'checked', 'cite', 'class', 'clear', 'color', 'cols', 'colspan', 'controls', 'controlslist', 'coords', 'crossorigin', 'datetime', 'decoding', 'default', 'dir', 'disabled', 'disablepictureinpicture', 'disableremoteplayback', 'download', 'draggable', 'enctype', 'enterkeyhint', 'exportparts', 'face', 'for', 'headers', 'height', 'hidden', 'high', 'href', 'hreflang', 'id', 'inert', 'inputmode', 'integrity', 'ismap', 'kind', 'label', 'lang', 'list', 'loading', 'loop', 'low', 'max', 'maxlength', 'media', 'method', 'min', 'minlength', 'multiple', 'muted', 'name', 'nonce', 'noshade', 'novalidate', 'nowrap', 'open', 'optimum', 'part', 'pattern', 'placeholder', 'playsinline', 'popover', 'popovertarget', 'popovertargetaction', 'poster', 'preload', 'pubdate', 'radiogroup', 'readonly', 'rel', 'required', 'rev', 'reversed', 'role', 'rows', 'rowspan', 'spellcheck', 'scope', 'selected', 'shape', 'size', 'sizes', 'slot', 'span', 'srclang', 'start', 'src', 'srcset', 'step', 'style', 'summary', 'tabindex', 'title', 'translate', 'type', 'usemap', 'valign', 'value', 'width', 'wrap', 'xmlns', 'slot']);\nconst svg = freeze(['accent-height', 'accumulate', 'additive', 'alignment-baseline', 'amplitude', 'ascent', 'attributename', 'attributetype', 'azimuth', 'basefrequency', 'baseline-shift', 'begin', 'bias', 'by', 'class', 'clip', 'clippathunits', 'clip-path', 'clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cx', 'cy', 'd', 'dx', 'dy', 'diffuseconstant', 'direction', 'display', 'divisor', 'dur', 'edgemode', 'elevation', 'end', 'exponent', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'filterunits', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'glyphref', 'gradientunits', 'gradienttransform', 'height', 'href', 'id', 'image-rendering', 'in', 'in2', 'intercept', 'k', 'k1', 'k2', 'k3', 'k4', 'kerning', 'keypoints', 'keysplines', 'keytimes', 'lang', 'lengthadjust', 'letter-spacing', 'kernelmatrix', 'kernelunitlength', 'lighting-color', 'local', 'marker-end', 'marker-mid', 'marker-start', 'markerheight', 'markerunits', 'markerwidth', 'maskcontentunits', 'maskunits', 'max', 'mask', 'mask-type', 'media', 'method', 'mode', 'min', 'name', 'numoctaves', 'offset', 'operator', 'opacity', 'order', 'orient', 'orientation', 'origin', 'overflow', 'paint-order', 'path', 'pathlength', 'patterncontentunits', 'patterntransform', 'patternunits', 'points', 'preservealpha', 'preserveaspectratio', 'primitiveunits', 'r', 'rx', 'ry', 'radius', 'refx', 'refy', 'repeatcount', 'repeatdur', 'restart', 'result', 'rotate', 'scale', 'seed', 'shape-rendering', 'slope', 'specularconstant', 'specularexponent', 'spreadmethod', 'startoffset', 'stddeviation', 'stitchtiles', 'stop-color', 'stop-opacity', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke', 'stroke-width', 'style', 'surfacescale', 'systemlanguage', 'tabindex', 'tablevalues', 'targetx', 'targety', 'transform', 'transform-origin', 'text-anchor', 'text-decoration', 'text-rendering', 'textlength', 'type', 'u1', 'u2', 'unicode', 'values', 'viewbox', 'visibility', 'version', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'width', 'word-spacing', 'wrap', 'writing-mode', 'xchannelselector', 'ychannelselector', 'x', 'x1', 'x2', 'xmlns', 'y', 'y1', 'y2', 'z', 'zoomandpan']);\nconst mathMl = freeze(['accent', 'accentunder', 'align', 'bevelled', 'close', 'columnsalign', 'columnlines', 'columnspan', 'denomalign', 'depth', 'dir', 'display', 'displaystyle', 'encoding', 'fence', 'frame', 'height', 'href', 'id', 'largeop', 'length', 'linethickness', 'lspace', 'lquote', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'maxsize', 'minsize', 'movablelimits', 'notation', 'numalign', 'open', 'rowalign', 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'rquote', 'scriptlevel', 'scriptminsize', 'scriptsizemultiplier', 'selection', 'separator', 'separators', 'stretchy', 'subscriptshift', 'supscriptshift', 'symmetric', 'voffset', 'width', 'xmlns']);\nconst xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']);\n\n// eslint-disable-next-line unicorn/better-regex\nconst MUSTACHE_EXPR = seal(/\\{\\{[\\w\\W]*|[\\w\\W]*\\}\\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode\nconst ERB_EXPR = seal(/<%[\\w\\W]*|[\\w\\W]*%>/gm);\nconst TMPLIT_EXPR = seal(/\\$\\{[\\w\\W]*/gm); // eslint-disable-line unicorn/better-regex\nconst DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]+$/); // eslint-disable-line no-useless-escape\nconst ARIA_ATTR = seal(/^aria-[\\-\\w]+$/); // eslint-disable-line no-useless-escape\nconst IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i // eslint-disable-line no-useless-escape\n);\nconst IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\nconst ATTR_WHITESPACE = seal(/[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g // eslint-disable-line no-control-regex\n);\nconst DOCTYPE_NAME = seal(/^html$/i);\nconst CUSTOM_ELEMENT = seal(/^[a-z][.\\w]*(-[.\\w]+)+$/i);\n\nvar EXPRESSIONS = /*#__PURE__*/Object.freeze({\n __proto__: null,\n ARIA_ATTR: ARIA_ATTR,\n ATTR_WHITESPACE: ATTR_WHITESPACE,\n CUSTOM_ELEMENT: CUSTOM_ELEMENT,\n DATA_ATTR: DATA_ATTR,\n DOCTYPE_NAME: DOCTYPE_NAME,\n ERB_EXPR: ERB_EXPR,\n IS_ALLOWED_URI: IS_ALLOWED_URI,\n IS_SCRIPT_OR_DATA: IS_SCRIPT_OR_DATA,\n MUSTACHE_EXPR: MUSTACHE_EXPR,\n TMPLIT_EXPR: TMPLIT_EXPR\n});\n\n/* eslint-disable @typescript-eslint/indent */\n// https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\nconst NODE_TYPE = {\n element: 1,\n attribute: 2,\n text: 3,\n cdataSection: 4,\n entityReference: 5,\n // Deprecated\n entityNode: 6,\n // Deprecated\n progressingInstruction: 7,\n comment: 8,\n document: 9,\n documentType: 10,\n documentFragment: 11,\n notation: 12 // Deprecated\n};\nconst getGlobal = function getGlobal() {\n return typeof window === 'undefined' ? null : window;\n};\n/**\n * Creates a no-op policy for internal use only.\n * Don't export this function outside this module!\n * @param trustedTypes The policy factory.\n * @param purifyHostElement The Script element used to load DOMPurify (to determine policy name suffix).\n * @return The policy created (or null, if Trusted Types\n * are not supported or creating the policy failed).\n */\nconst _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, purifyHostElement) {\n if (typeof trustedTypes !== 'object' || typeof trustedTypes.createPolicy !== 'function') {\n return null;\n }\n // Allow the callers to control the unique policy name\n // by adding a data-tt-policy-suffix to the script element with the DOMPurify.\n // Policy creation with duplicate names throws in Trusted Types.\n let suffix = null;\n const ATTR_NAME = 'data-tt-policy-suffix';\n if (purifyHostElement && purifyHostElement.hasAttribute(ATTR_NAME)) {\n suffix = purifyHostElement.getAttribute(ATTR_NAME);\n }\n const policyName = 'dompurify' + (suffix ? '#' + suffix : '');\n try {\n return trustedTypes.createPolicy(policyName, {\n createHTML(html) {\n return html;\n },\n createScriptURL(scriptUrl) {\n return scriptUrl;\n }\n });\n } catch (_) {\n // Policy creation failed (most likely another DOMPurify script has\n // already run). Skip creating the policy, as this will only cause errors\n // if TT are enforced.\n console.warn('TrustedTypes policy ' + policyName + ' could not be created.');\n return null;\n }\n};\nconst _createHooksMap = function _createHooksMap() {\n return {\n afterSanitizeAttributes: [],\n afterSanitizeElements: [],\n afterSanitizeShadowDOM: [],\n beforeSanitizeAttributes: [],\n beforeSanitizeElements: [],\n beforeSanitizeShadowDOM: [],\n uponSanitizeAttribute: [],\n uponSanitizeElement: [],\n uponSanitizeShadowNode: []\n };\n};\nfunction createDOMPurify() {\n let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();\n const DOMPurify = root => createDOMPurify(root);\n DOMPurify.version = '3.3.1';\n DOMPurify.removed = [];\n if (!window || !window.document || window.document.nodeType !== NODE_TYPE.document || !window.Element) {\n // Not running in a browser, provide a factory function\n // so that you can pass your own Window\n DOMPurify.isSupported = false;\n return DOMPurify;\n }\n let {\n document\n } = window;\n const originalDocument = document;\n const currentScript = originalDocument.currentScript;\n const {\n DocumentFragment,\n HTMLTemplateElement,\n Node,\n Element,\n NodeFilter,\n NamedNodeMap = window.NamedNodeMap || window.MozNamedAttrMap,\n HTMLFormElement,\n DOMParser,\n trustedTypes\n } = window;\n const ElementPrototype = Element.prototype;\n const cloneNode = lookupGetter(ElementPrototype, 'cloneNode');\n const remove = lookupGetter(ElementPrototype, 'remove');\n const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');\n const getChildNodes = lookupGetter(ElementPrototype, 'childNodes');\n const getParentNode = lookupGetter(ElementPrototype, 'parentNode');\n // As per issue #47, the web-components registry is inherited by a\n // new document created via createHTMLDocument. As per the spec\n // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)\n // a new empty registry is used when creating a template contents owner\n // document, so we use that as our parent document to ensure nothing\n // is inherited.\n if (typeof HTMLTemplateElement === 'function') {\n const template = document.createElement('template');\n if (template.content && template.content.ownerDocument) {\n document = template.content.ownerDocument;\n }\n }\n let trustedTypesPolicy;\n let emptyHTML = '';\n const {\n implementation,\n createNodeIterator,\n createDocumentFragment,\n getElementsByTagName\n } = document;\n const {\n importNode\n } = originalDocument;\n let hooks = _createHooksMap();\n /**\n * Expose whether this browser supports running the full DOMPurify.\n */\n DOMPurify.isSupported = typeof entries === 'function' && typeof getParentNode === 'function' && implementation && implementation.createHTMLDocument !== undefined;\n const {\n MUSTACHE_EXPR,\n ERB_EXPR,\n TMPLIT_EXPR,\n DATA_ATTR,\n ARIA_ATTR,\n IS_SCRIPT_OR_DATA,\n ATTR_WHITESPACE,\n CUSTOM_ELEMENT\n } = EXPRESSIONS;\n let {\n IS_ALLOWED_URI: IS_ALLOWED_URI$1\n } = EXPRESSIONS;\n /**\n * We consider the elements and attributes below to be safe. Ideally\n * don't add any new ones but feel free to remove unwanted ones.\n */\n /* allowed element names */\n let ALLOWED_TAGS = null;\n const DEFAULT_ALLOWED_TAGS = addToSet({}, [...html$1, ...svg$1, ...svgFilters, ...mathMl$1, ...text]);\n /* Allowed attribute names */\n let ALLOWED_ATTR = null;\n const DEFAULT_ALLOWED_ATTR = addToSet({}, [...html, ...svg, ...mathMl, ...xml]);\n /*\n * Configure how DOMPurify should handle custom elements and their attributes as well as customized built-in elements.\n * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)\n * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)\n * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.\n */\n let CUSTOM_ELEMENT_HANDLING = Object.seal(create(null, {\n tagNameCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n },\n attributeNameCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n },\n allowCustomizedBuiltInElements: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: false\n }\n }));\n /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */\n let FORBID_TAGS = null;\n /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */\n let FORBID_ATTR = null;\n /* Config object to store ADD_TAGS/ADD_ATTR functions (when used as functions) */\n const EXTRA_ELEMENT_HANDLING = Object.seal(create(null, {\n tagCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n },\n attributeCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n }\n }));\n /* Decide if ARIA attributes are okay */\n let ALLOW_ARIA_ATTR = true;\n /* Decide if custom data attributes are okay */\n let ALLOW_DATA_ATTR = true;\n /* Decide if unknown protocols are okay */\n let ALLOW_UNKNOWN_PROTOCOLS = false;\n /* Decide if self-closing tags in attributes are allowed.\n * Usually removed due to a mXSS issue in jQuery 3.0 */\n let ALLOW_SELF_CLOSE_IN_ATTR = true;\n /* Output should be safe for common template engines.\n * This means, DOMPurify removes data attributes, mustaches and ERB\n */\n let SAFE_FOR_TEMPLATES = false;\n /* Output should be safe even for XML used within HTML and alike.\n * This means, DOMPurify removes comments when containing risky content.\n */\n let SAFE_FOR_XML = true;\n /* Decide if document with ... should be returned */\n let WHOLE_DOCUMENT = false;\n /* Track whether config is already set on this instance of DOMPurify. */\n let SET_CONFIG = false;\n /* Decide if all elements (e.g. style, script) must be children of\n * document.body. By default, browsers might move them to document.head */\n let FORCE_BODY = false;\n /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported).\n * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead\n */\n let RETURN_DOM = false;\n /* Decide if a DOM `DocumentFragment` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported) */\n let RETURN_DOM_FRAGMENT = false;\n /* Try to return a Trusted Type object instead of a string, return a string in\n * case Trusted Types are not supported */\n let RETURN_TRUSTED_TYPE = false;\n /* Output should be free from DOM clobbering attacks?\n * This sanitizes markups named with colliding, clobberable built-in DOM APIs.\n */\n let SANITIZE_DOM = true;\n /* Achieve full DOM Clobbering protection by isolating the namespace of named\n * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.\n *\n * HTML/DOM spec rules that enable DOM Clobbering:\n * - Named Access on Window (§7.3.3)\n * - DOM Tree Accessors (§3.1.5)\n * - Form Element Parent-Child Relations (§4.10.3)\n * - Iframe srcdoc / Nested WindowProxies (§4.8.5)\n * - HTMLCollection (§4.2.10.2)\n *\n * Namespace isolation is implemented by prefixing `id` and `name` attributes\n * with a constant string, i.e., `user-content-`\n */\n let SANITIZE_NAMED_PROPS = false;\n const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';\n /* Keep element content when removing element? */\n let KEEP_CONTENT = true;\n /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead\n * of importing it into a new Document and returning a sanitized copy */\n let IN_PLACE = false;\n /* Allow usage of profiles like html, svg and mathMl */\n let USE_PROFILES = {};\n /* Tags to ignore content of when KEEP_CONTENT is true */\n let FORBID_CONTENTS = null;\n const DEFAULT_FORBID_CONTENTS = addToSet({}, ['annotation-xml', 'audio', 'colgroup', 'desc', 'foreignobject', 'head', 'iframe', 'math', 'mi', 'mn', 'mo', 'ms', 'mtext', 'noembed', 'noframes', 'noscript', 'plaintext', 'script', 'style', 'svg', 'template', 'thead', 'title', 'video', 'xmp']);\n /* Tags that are safe for data: URIs */\n let DATA_URI_TAGS = null;\n const DEFAULT_DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']);\n /* Attributes safe for values like \"javascript:\" */\n let URI_SAFE_ATTRIBUTES = null;\n const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'role', 'summary', 'title', 'value', 'style', 'xmlns']);\n const MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n /* Document namespace */\n let NAMESPACE = HTML_NAMESPACE;\n let IS_EMPTY_INPUT = false;\n /* Allowed XHTML+XML namespaces */\n let ALLOWED_NAMESPACES = null;\n const DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE], stringToString);\n let MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']);\n let HTML_INTEGRATION_POINTS = addToSet({}, ['annotation-xml']);\n // Certain elements are allowed in both SVG and HTML\n // namespace. We need to specify them explicitly\n // so that they don't get erroneously deleted from\n // HTML namespace.\n const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ['title', 'style', 'font', 'a', 'script']);\n /* Parsing of strict XHTML documents */\n let PARSER_MEDIA_TYPE = null;\n const SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html'];\n const DEFAULT_PARSER_MEDIA_TYPE = 'text/html';\n let transformCaseFunc = null;\n /* Keep a reference to config to pass to hooks */\n let CONFIG = null;\n /* Ideally, do not touch anything below this line */\n /* ______________________________________________ */\n const formElement = document.createElement('form');\n const isRegexOrFunction = function isRegexOrFunction(testValue) {\n return testValue instanceof RegExp || testValue instanceof Function;\n };\n /**\n * _parseConfig\n *\n * @param cfg optional config literal\n */\n // eslint-disable-next-line complexity\n const _parseConfig = function _parseConfig() {\n let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n if (CONFIG && CONFIG === cfg) {\n return;\n }\n /* Shield configuration object from tampering */\n if (!cfg || typeof cfg !== 'object') {\n cfg = {};\n }\n /* Shield configuration object from prototype pollution */\n cfg = clone(cfg);\n PARSER_MEDIA_TYPE =\n // eslint-disable-next-line unicorn/prefer-includes\n SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? DEFAULT_PARSER_MEDIA_TYPE : cfg.PARSER_MEDIA_TYPE;\n // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.\n transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? stringToString : stringToLowerCase;\n /* Set configuration parameters */\n ALLOWED_TAGS = objectHasOwnProperty(cfg, 'ALLOWED_TAGS') ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc) : DEFAULT_ALLOWED_TAGS;\n ALLOWED_ATTR = objectHasOwnProperty(cfg, 'ALLOWED_ATTR') ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc) : DEFAULT_ALLOWED_ATTR;\n ALLOWED_NAMESPACES = objectHasOwnProperty(cfg, 'ALLOWED_NAMESPACES') ? addToSet({}, cfg.ALLOWED_NAMESPACES, stringToString) : DEFAULT_ALLOWED_NAMESPACES;\n URI_SAFE_ATTRIBUTES = objectHasOwnProperty(cfg, 'ADD_URI_SAFE_ATTR') ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES), cfg.ADD_URI_SAFE_ATTR, transformCaseFunc) : DEFAULT_URI_SAFE_ATTRIBUTES;\n DATA_URI_TAGS = objectHasOwnProperty(cfg, 'ADD_DATA_URI_TAGS') ? addToSet(clone(DEFAULT_DATA_URI_TAGS), cfg.ADD_DATA_URI_TAGS, transformCaseFunc) : DEFAULT_DATA_URI_TAGS;\n FORBID_CONTENTS = objectHasOwnProperty(cfg, 'FORBID_CONTENTS') ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc) : DEFAULT_FORBID_CONTENTS;\n FORBID_TAGS = objectHasOwnProperty(cfg, 'FORBID_TAGS') ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc) : clone({});\n FORBID_ATTR = objectHasOwnProperty(cfg, 'FORBID_ATTR') ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc) : clone({});\n USE_PROFILES = objectHasOwnProperty(cfg, 'USE_PROFILES') ? cfg.USE_PROFILES : false;\n ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true\n ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true\n ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false\n ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; // Default true\n SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false\n SAFE_FOR_XML = cfg.SAFE_FOR_XML !== false; // Default true\n WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false\n RETURN_DOM = cfg.RETURN_DOM || false; // Default false\n RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false\n RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false\n FORCE_BODY = cfg.FORCE_BODY || false; // Default false\n SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true\n SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false\n KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true\n IN_PLACE = cfg.IN_PLACE || false; // Default false\n IS_ALLOWED_URI$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI;\n NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;\n MATHML_TEXT_INTEGRATION_POINTS = cfg.MATHML_TEXT_INTEGRATION_POINTS || MATHML_TEXT_INTEGRATION_POINTS;\n HTML_INTEGRATION_POINTS = cfg.HTML_INTEGRATION_POINTS || HTML_INTEGRATION_POINTS;\n CUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || {};\n if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)) {\n CUSTOM_ELEMENT_HANDLING.tagNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck;\n }\n if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)) {\n CUSTOM_ELEMENT_HANDLING.attributeNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck;\n }\n if (cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements === 'boolean') {\n CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements;\n }\n if (SAFE_FOR_TEMPLATES) {\n ALLOW_DATA_ATTR = false;\n }\n if (RETURN_DOM_FRAGMENT) {\n RETURN_DOM = true;\n }\n /* Parse profile info */\n if (USE_PROFILES) {\n ALLOWED_TAGS = addToSet({}, text);\n ALLOWED_ATTR = [];\n if (USE_PROFILES.html === true) {\n addToSet(ALLOWED_TAGS, html$1);\n addToSet(ALLOWED_ATTR, html);\n }\n if (USE_PROFILES.svg === true) {\n addToSet(ALLOWED_TAGS, svg$1);\n addToSet(ALLOWED_ATTR, svg);\n addToSet(ALLOWED_ATTR, xml);\n }\n if (USE_PROFILES.svgFilters === true) {\n addToSet(ALLOWED_TAGS, svgFilters);\n addToSet(ALLOWED_ATTR, svg);\n addToSet(ALLOWED_ATTR, xml);\n }\n if (USE_PROFILES.mathMl === true) {\n addToSet(ALLOWED_TAGS, mathMl$1);\n addToSet(ALLOWED_ATTR, mathMl);\n addToSet(ALLOWED_ATTR, xml);\n }\n }\n /* Merge configuration parameters */\n if (cfg.ADD_TAGS) {\n if (typeof cfg.ADD_TAGS === 'function') {\n EXTRA_ELEMENT_HANDLING.tagCheck = cfg.ADD_TAGS;\n } else {\n if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {\n ALLOWED_TAGS = clone(ALLOWED_TAGS);\n }\n addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);\n }\n }\n if (cfg.ADD_ATTR) {\n if (typeof cfg.ADD_ATTR === 'function') {\n EXTRA_ELEMENT_HANDLING.attributeCheck = cfg.ADD_ATTR;\n } else {\n if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {\n ALLOWED_ATTR = clone(ALLOWED_ATTR);\n }\n addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);\n }\n }\n if (cfg.ADD_URI_SAFE_ATTR) {\n addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);\n }\n if (cfg.FORBID_CONTENTS) {\n if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n FORBID_CONTENTS = clone(FORBID_CONTENTS);\n }\n addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);\n }\n if (cfg.ADD_FORBID_CONTENTS) {\n if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n FORBID_CONTENTS = clone(FORBID_CONTENTS);\n }\n addToSet(FORBID_CONTENTS, cfg.ADD_FORBID_CONTENTS, transformCaseFunc);\n }\n /* Add #text in case KEEP_CONTENT is set to true */\n if (KEEP_CONTENT) {\n ALLOWED_TAGS['#text'] = true;\n }\n /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */\n if (WHOLE_DOCUMENT) {\n addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);\n }\n /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */\n if (ALLOWED_TAGS.table) {\n addToSet(ALLOWED_TAGS, ['tbody']);\n delete FORBID_TAGS.tbody;\n }\n if (cfg.TRUSTED_TYPES_POLICY) {\n if (typeof cfg.TRUSTED_TYPES_POLICY.createHTML !== 'function') {\n throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createHTML\" hook.');\n }\n if (typeof cfg.TRUSTED_TYPES_POLICY.createScriptURL !== 'function') {\n throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createScriptURL\" hook.');\n }\n // Overwrite existing TrustedTypes policy.\n trustedTypesPolicy = cfg.TRUSTED_TYPES_POLICY;\n // Sign local variables required by `sanitize`.\n emptyHTML = trustedTypesPolicy.createHTML('');\n } else {\n // Uninitialized policy, attempt to initialize the internal dompurify policy.\n if (trustedTypesPolicy === undefined) {\n trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, currentScript);\n }\n // If creating the internal policy succeeded sign internal variables.\n if (trustedTypesPolicy !== null && typeof emptyHTML === 'string') {\n emptyHTML = trustedTypesPolicy.createHTML('');\n }\n }\n // Prevent further manipulation of configuration.\n // Not available in IE8, Safari 5, etc.\n if (freeze) {\n freeze(cfg);\n }\n CONFIG = cfg;\n };\n /* Keep track of all possible SVG and MathML tags\n * so that we can perform the namespace checks\n * correctly. */\n const ALL_SVG_TAGS = addToSet({}, [...svg$1, ...svgFilters, ...svgDisallowed]);\n const ALL_MATHML_TAGS = addToSet({}, [...mathMl$1, ...mathMlDisallowed]);\n /**\n * @param element a DOM element whose namespace is being checked\n * @returns Return false if the element has a\n * namespace that a spec-compliant parser would never\n * return. Return true otherwise.\n */\n const _checkValidNamespace = function _checkValidNamespace(element) {\n let parent = getParentNode(element);\n // In JSDOM, if we're inside shadow DOM, then parentNode\n // can be null. We just simulate parent in this case.\n if (!parent || !parent.tagName) {\n parent = {\n namespaceURI: NAMESPACE,\n tagName: 'template'\n };\n }\n const tagName = stringToLowerCase(element.tagName);\n const parentTagName = stringToLowerCase(parent.tagName);\n if (!ALLOWED_NAMESPACES[element.namespaceURI]) {\n return false;\n }\n if (element.namespaceURI === SVG_NAMESPACE) {\n // The only way to switch from HTML namespace to SVG\n // is via . If it happens via any other tag, then\n // it should be killed.\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === 'svg';\n }\n // The only way to switch from MathML to SVG is via`\n // svg if parent is either or MathML\n // text integration points.\n if (parent.namespaceURI === MATHML_NAMESPACE) {\n return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);\n }\n // We only allow elements that are defined in SVG\n // spec. All others are disallowed in SVG namespace.\n return Boolean(ALL_SVG_TAGS[tagName]);\n }\n if (element.namespaceURI === MATHML_NAMESPACE) {\n // The only way to switch from HTML namespace to MathML\n // is via . If it happens via any other tag, then\n // it should be killed.\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === 'math';\n }\n // The only way to switch from SVG to MathML is via\n // and HTML integration points\n if (parent.namespaceURI === SVG_NAMESPACE) {\n return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];\n }\n // We only allow elements that are defined in MathML\n // spec. All others are disallowed in MathML namespace.\n return Boolean(ALL_MATHML_TAGS[tagName]);\n }\n if (element.namespaceURI === HTML_NAMESPACE) {\n // The only way to switch from SVG to HTML is via\n // HTML integration points, and from MathML to HTML\n // is via MathML text integration points\n if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {\n return false;\n }\n if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {\n return false;\n }\n // We disallow tags that are specific for MathML\n // or SVG and should never appear in HTML namespace\n return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);\n }\n // For XHTML and XML documents that support custom namespaces\n if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && ALLOWED_NAMESPACES[element.namespaceURI]) {\n return true;\n }\n // The code should never reach this place (this means\n // that the element somehow got namespace that is not\n // HTML, SVG, MathML or allowed via ALLOWED_NAMESPACES).\n // Return false just in case.\n return false;\n };\n /**\n * _forceRemove\n *\n * @param node a DOM node\n */\n const _forceRemove = function _forceRemove(node) {\n arrayPush(DOMPurify.removed, {\n element: node\n });\n try {\n // eslint-disable-next-line unicorn/prefer-dom-node-remove\n getParentNode(node).removeChild(node);\n } catch (_) {\n remove(node);\n }\n };\n /**\n * _removeAttribute\n *\n * @param name an Attribute name\n * @param element a DOM node\n */\n const _removeAttribute = function _removeAttribute(name, element) {\n try {\n arrayPush(DOMPurify.removed, {\n attribute: element.getAttributeNode(name),\n from: element\n });\n } catch (_) {\n arrayPush(DOMPurify.removed, {\n attribute: null,\n from: element\n });\n }\n element.removeAttribute(name);\n // We void attribute values for unremovable \"is\" attributes\n if (name === 'is') {\n if (RETURN_DOM || RETURN_DOM_FRAGMENT) {\n try {\n _forceRemove(element);\n } catch (_) {}\n } else {\n try {\n element.setAttribute(name, '');\n } catch (_) {}\n }\n }\n };\n /**\n * _initDocument\n *\n * @param dirty - a string of dirty markup\n * @return a DOM, filled with the dirty markup\n */\n const _initDocument = function _initDocument(dirty) {\n /* Create a HTML document */\n let doc = null;\n let leadingWhitespace = null;\n if (FORCE_BODY) {\n dirty = '' + dirty;\n } else {\n /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */\n const matches = stringMatch(dirty, /^[\\r\\n\\t ]+/);\n leadingWhitespace = matches && matches[0];\n }\n if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && NAMESPACE === HTML_NAMESPACE) {\n // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict)\n dirty = '' + dirty + '';\n }\n const dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty;\n /*\n * Use the DOMParser API by default, fallback later if needs be\n * DOMParser not work for svg when has multiple root element.\n */\n if (NAMESPACE === HTML_NAMESPACE) {\n try {\n doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);\n } catch (_) {}\n }\n /* Use createHTMLDocument in case DOMParser is not available */\n if (!doc || !doc.documentElement) {\n doc = implementation.createDocument(NAMESPACE, 'template', null);\n try {\n doc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload;\n } catch (_) {\n // Syntax error if dirtyPayload is invalid xml\n }\n }\n const body = doc.body || doc.documentElement;\n if (dirty && leadingWhitespace) {\n body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);\n }\n /* Work on whole document or just its body */\n if (NAMESPACE === HTML_NAMESPACE) {\n return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0];\n }\n return WHOLE_DOCUMENT ? doc.documentElement : body;\n };\n /**\n * Creates a NodeIterator object that you can use to traverse filtered lists of nodes or elements in a document.\n *\n * @param root The root element or node to start traversing on.\n * @return The created NodeIterator\n */\n const _createNodeIterator = function _createNodeIterator(root) {\n return createNodeIterator.call(root.ownerDocument || root, root,\n // eslint-disable-next-line no-bitwise\n NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT | NodeFilter.SHOW_PROCESSING_INSTRUCTION | NodeFilter.SHOW_CDATA_SECTION, null);\n };\n /**\n * _isClobbered\n *\n * @param element element to check for clobbering attacks\n * @return true if clobbered, false if safe\n */\n const _isClobbered = function _isClobbered(element) {\n return element instanceof HTMLFormElement && (typeof element.nodeName !== 'string' || typeof element.textContent !== 'string' || typeof element.removeChild !== 'function' || !(element.attributes instanceof NamedNodeMap) || typeof element.removeAttribute !== 'function' || typeof element.setAttribute !== 'function' || typeof element.namespaceURI !== 'string' || typeof element.insertBefore !== 'function' || typeof element.hasChildNodes !== 'function');\n };\n /**\n * Checks whether the given object is a DOM node.\n *\n * @param value object to check whether it's a DOM node\n * @return true is object is a DOM node\n */\n const _isNode = function _isNode(value) {\n return typeof Node === 'function' && value instanceof Node;\n };\n function _executeHooks(hooks, currentNode, data) {\n arrayForEach(hooks, hook => {\n hook.call(DOMPurify, currentNode, data, CONFIG);\n });\n }\n /**\n * _sanitizeElements\n *\n * @protect nodeName\n * @protect textContent\n * @protect removeChild\n * @param currentNode to check for permission to exist\n * @return true if node was killed, false if left alive\n */\n const _sanitizeElements = function _sanitizeElements(currentNode) {\n let content = null;\n /* Execute a hook if present */\n _executeHooks(hooks.beforeSanitizeElements, currentNode, null);\n /* Check if element is clobbered or can clobber */\n if (_isClobbered(currentNode)) {\n _forceRemove(currentNode);\n return true;\n }\n /* Now let's check the element's type and name */\n const tagName = transformCaseFunc(currentNode.nodeName);\n /* Execute a hook if present */\n _executeHooks(hooks.uponSanitizeElement, currentNode, {\n tagName,\n allowedTags: ALLOWED_TAGS\n });\n /* Detect mXSS attempts abusing namespace confusion */\n if (SAFE_FOR_XML && currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && regExpTest(/<[/\\w!]/g, currentNode.innerHTML) && regExpTest(/<[/\\w!]/g, currentNode.textContent)) {\n _forceRemove(currentNode);\n return true;\n }\n /* Remove any occurrence of processing instructions */\n if (currentNode.nodeType === NODE_TYPE.progressingInstruction) {\n _forceRemove(currentNode);\n return true;\n }\n /* Remove any kind of possibly harmful comments */\n if (SAFE_FOR_XML && currentNode.nodeType === NODE_TYPE.comment && regExpTest(/<[/\\w]/g, currentNode.data)) {\n _forceRemove(currentNode);\n return true;\n }\n /* Remove element if anything forbids its presence */\n if (!(EXTRA_ELEMENT_HANDLING.tagCheck instanceof Function && EXTRA_ELEMENT_HANDLING.tagCheck(tagName)) && (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName])) {\n /* Check if we have a custom element to handle */\n if (!FORBID_TAGS[tagName] && _isBasicCustomElement(tagName)) {\n if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) {\n return false;\n }\n if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) {\n return false;\n }\n }\n /* Keep content except for bad-listed elements */\n if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {\n const parentNode = getParentNode(currentNode) || currentNode.parentNode;\n const childNodes = getChildNodes(currentNode) || currentNode.childNodes;\n if (childNodes && parentNode) {\n const childCount = childNodes.length;\n for (let i = childCount - 1; i >= 0; --i) {\n const childClone = cloneNode(childNodes[i], true);\n childClone.__removalCount = (currentNode.__removalCount || 0) + 1;\n parentNode.insertBefore(childClone, getNextSibling(currentNode));\n }\n }\n }\n _forceRemove(currentNode);\n return true;\n }\n /* Check whether element has a valid namespace */\n if (currentNode instanceof Element && !_checkValidNamespace(currentNode)) {\n _forceRemove(currentNode);\n return true;\n }\n /* Make sure that older browsers don't get fallback-tag mXSS */\n if ((tagName === 'noscript' || tagName === 'noembed' || tagName === 'noframes') && regExpTest(/<\\/no(script|embed|frames)/i, currentNode.innerHTML)) {\n _forceRemove(currentNode);\n return true;\n }\n /* Sanitize element content to be template-safe */\n if (SAFE_FOR_TEMPLATES && currentNode.nodeType === NODE_TYPE.text) {\n /* Get the element's text content */\n content = currentNode.textContent;\n arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n content = stringReplace(content, expr, ' ');\n });\n if (currentNode.textContent !== content) {\n arrayPush(DOMPurify.removed, {\n element: currentNode.cloneNode()\n });\n currentNode.textContent = content;\n }\n }\n /* Execute a hook if present */\n _executeHooks(hooks.afterSanitizeElements, currentNode, null);\n return false;\n };\n /**\n * _isValidAttribute\n *\n * @param lcTag Lowercase tag name of containing element.\n * @param lcName Lowercase attribute name.\n * @param value Attribute value.\n * @return Returns true if `value` is valid, otherwise false.\n */\n // eslint-disable-next-line complexity\n const _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {\n /* Make sure attribute cannot clobber */\n if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) {\n return false;\n }\n /* Allow valid data-* attributes: At least one character after \"-\"\n (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)\n XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)\n We don't need to check the value; it's always URI safe. */\n if (ALLOW_DATA_ATTR && !FORBID_ATTR[lcName] && regExpTest(DATA_ATTR, lcName)) ; else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR, lcName)) ; else if (EXTRA_ELEMENT_HANDLING.attributeCheck instanceof Function && EXTRA_ELEMENT_HANDLING.attributeCheck(lcName, lcTag)) ; else if (!ALLOWED_ATTR[lcName] || FORBID_ATTR[lcName]) {\n if (\n // First condition does a very basic check if a) it's basically a valid custom element tagname AND\n // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck\n _isBasicCustomElement(lcTag) && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag)) && (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName) || CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName, lcTag)) ||\n // Alternative, second condition checks if it's an `is`-attribute, AND\n // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n lcName === 'is' && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(value))) ; else {\n return false;\n }\n /* Check value is safe. First, is attr inert? If so, is safe */\n } else if (URI_SAFE_ATTRIBUTES[lcName]) ; else if (regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if ((lcName === 'src' || lcName === 'xlink:href' || lcName === 'href') && lcTag !== 'script' && stringIndexOf(value, 'data:') === 0 && DATA_URI_TAGS[lcTag]) ; else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if (value) {\n return false;\n } else ;\n return true;\n };\n /**\n * _isBasicCustomElement\n * checks if at least one dash is included in tagName, and it's not the first char\n * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name\n *\n * @param tagName name of the tag of the node to sanitize\n * @returns Returns true if the tag name meets the basic criteria for a custom element, otherwise false.\n */\n const _isBasicCustomElement = function _isBasicCustomElement(tagName) {\n return tagName !== 'annotation-xml' && stringMatch(tagName, CUSTOM_ELEMENT);\n };\n /**\n * _sanitizeAttributes\n *\n * @protect attributes\n * @protect nodeName\n * @protect removeAttribute\n * @protect setAttribute\n *\n * @param currentNode to sanitize\n */\n const _sanitizeAttributes = function _sanitizeAttributes(currentNode) {\n /* Execute a hook if present */\n _executeHooks(hooks.beforeSanitizeAttributes, currentNode, null);\n const {\n attributes\n } = currentNode;\n /* Check if we have attributes; if not we might have a text node */\n if (!attributes || _isClobbered(currentNode)) {\n return;\n }\n const hookEvent = {\n attrName: '',\n attrValue: '',\n keepAttr: true,\n allowedAttributes: ALLOWED_ATTR,\n forceKeepAttr: undefined\n };\n let l = attributes.length;\n /* Go backwards over all attributes; safely remove bad ones */\n while (l--) {\n const attr = attributes[l];\n const {\n name,\n namespaceURI,\n value: attrValue\n } = attr;\n const lcName = transformCaseFunc(name);\n const initValue = attrValue;\n let value = name === 'value' ? initValue : stringTrim(initValue);\n /* Execute a hook if present */\n hookEvent.attrName = lcName;\n hookEvent.attrValue = value;\n hookEvent.keepAttr = true;\n hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set\n _executeHooks(hooks.uponSanitizeAttribute, currentNode, hookEvent);\n value = hookEvent.attrValue;\n /* Full DOM Clobbering protection via namespace isolation,\n * Prefix id and name attributes with `user-content-`\n */\n if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name')) {\n // Remove the attribute with this value\n _removeAttribute(name, currentNode);\n // Prefix the value and later re-create the attribute with the sanitized value\n value = SANITIZE_NAMED_PROPS_PREFIX + value;\n }\n /* Work around a security issue with comments inside attributes */\n if (SAFE_FOR_XML && regExpTest(/((--!?|])>)|<\\/(style|title|textarea)/i, value)) {\n _removeAttribute(name, currentNode);\n continue;\n }\n /* Make sure we cannot easily use animated hrefs, even if animations are allowed */\n if (lcName === 'attributename' && stringMatch(value, 'href')) {\n _removeAttribute(name, currentNode);\n continue;\n }\n /* Did the hooks approve of the attribute? */\n if (hookEvent.forceKeepAttr) {\n continue;\n }\n /* Did the hooks approve of the attribute? */\n if (!hookEvent.keepAttr) {\n _removeAttribute(name, currentNode);\n continue;\n }\n /* Work around a security issue in jQuery 3.0 */\n if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(/\\/>/i, value)) {\n _removeAttribute(name, currentNode);\n continue;\n }\n /* Sanitize attribute content to be template-safe */\n if (SAFE_FOR_TEMPLATES) {\n arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n value = stringReplace(value, expr, ' ');\n });\n }\n /* Is `value` valid for this attribute? */\n const lcTag = transformCaseFunc(currentNode.nodeName);\n if (!_isValidAttribute(lcTag, lcName, value)) {\n _removeAttribute(name, currentNode);\n continue;\n }\n /* Handle attributes that require Trusted Types */\n if (trustedTypesPolicy && typeof trustedTypes === 'object' && typeof trustedTypes.getAttributeType === 'function') {\n if (namespaceURI) ; else {\n switch (trustedTypes.getAttributeType(lcTag, lcName)) {\n case 'TrustedHTML':\n {\n value = trustedTypesPolicy.createHTML(value);\n break;\n }\n case 'TrustedScriptURL':\n {\n value = trustedTypesPolicy.createScriptURL(value);\n break;\n }\n }\n }\n }\n /* Handle invalid data-* attribute set by try-catching it */\n if (value !== initValue) {\n try {\n if (namespaceURI) {\n currentNode.setAttributeNS(namespaceURI, name, value);\n } else {\n /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. \"x-schema\". */\n currentNode.setAttribute(name, value);\n }\n if (_isClobbered(currentNode)) {\n _forceRemove(currentNode);\n } else {\n arrayPop(DOMPurify.removed);\n }\n } catch (_) {\n _removeAttribute(name, currentNode);\n }\n }\n }\n /* Execute a hook if present */\n _executeHooks(hooks.afterSanitizeAttributes, currentNode, null);\n };\n /**\n * _sanitizeShadowDOM\n *\n * @param fragment to iterate over recursively\n */\n const _sanitizeShadowDOM = function _sanitizeShadowDOM(fragment) {\n let shadowNode = null;\n const shadowIterator = _createNodeIterator(fragment);\n /* Execute a hook if present */\n _executeHooks(hooks.beforeSanitizeShadowDOM, fragment, null);\n while (shadowNode = shadowIterator.nextNode()) {\n /* Execute a hook if present */\n _executeHooks(hooks.uponSanitizeShadowNode, shadowNode, null);\n /* Sanitize tags and elements */\n _sanitizeElements(shadowNode);\n /* Check attributes next */\n _sanitizeAttributes(shadowNode);\n /* Deep shadow DOM detected */\n if (shadowNode.content instanceof DocumentFragment) {\n _sanitizeShadowDOM(shadowNode.content);\n }\n }\n /* Execute a hook if present */\n _executeHooks(hooks.afterSanitizeShadowDOM, fragment, null);\n };\n // eslint-disable-next-line complexity\n DOMPurify.sanitize = function (dirty) {\n let cfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n let body = null;\n let importedNode = null;\n let currentNode = null;\n let returnNode = null;\n /* Make sure we have a string to sanitize.\n DO NOT return early, as this will return the wrong type if\n the user has requested a DOM object rather than a string */\n IS_EMPTY_INPUT = !dirty;\n if (IS_EMPTY_INPUT) {\n dirty = '';\n }\n /* Stringify, in case dirty is an object */\n if (typeof dirty !== 'string' && !_isNode(dirty)) {\n if (typeof dirty.toString === 'function') {\n dirty = dirty.toString();\n if (typeof dirty !== 'string') {\n throw typeErrorCreate('dirty is not a string, aborting');\n }\n } else {\n throw typeErrorCreate('toString is not a function');\n }\n }\n /* Return dirty HTML if DOMPurify cannot run */\n if (!DOMPurify.isSupported) {\n return dirty;\n }\n /* Assign config vars */\n if (!SET_CONFIG) {\n _parseConfig(cfg);\n }\n /* Clean up removed elements */\n DOMPurify.removed = [];\n /* Check if dirty is correctly typed for IN_PLACE */\n if (typeof dirty === 'string') {\n IN_PLACE = false;\n }\n if (IN_PLACE) {\n /* Do some early pre-sanitization to avoid unsafe root nodes */\n if (dirty.nodeName) {\n const tagName = transformCaseFunc(dirty.nodeName);\n if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place');\n }\n }\n } else if (dirty instanceof Node) {\n /* If dirty is a DOM element, append to an empty document to avoid\n elements being stripped by the parser */\n body = _initDocument('');\n importedNode = body.ownerDocument.importNode(dirty, true);\n if (importedNode.nodeType === NODE_TYPE.element && importedNode.nodeName === 'BODY') {\n /* Node is already a body, use as is */\n body = importedNode;\n } else if (importedNode.nodeName === 'HTML') {\n body = importedNode;\n } else {\n // eslint-disable-next-line unicorn/prefer-dom-node-append\n body.appendChild(importedNode);\n }\n } else {\n /* Exit directly if we have nothing to do */\n if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT &&\n // eslint-disable-next-line unicorn/prefer-includes\n dirty.indexOf('<') === -1) {\n return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(dirty) : dirty;\n }\n /* Initialize the document to work on */\n body = _initDocument(dirty);\n /* Check we have a DOM node from the data */\n if (!body) {\n return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : '';\n }\n }\n /* Remove first element node (ours) if FORCE_BODY is set */\n if (body && FORCE_BODY) {\n _forceRemove(body.firstChild);\n }\n /* Get node iterator */\n const nodeIterator = _createNodeIterator(IN_PLACE ? dirty : body);\n /* Now start iterating over the created document */\n while (currentNode = nodeIterator.nextNode()) {\n /* Sanitize tags and elements */\n _sanitizeElements(currentNode);\n /* Check attributes next */\n _sanitizeAttributes(currentNode);\n /* Shadow DOM detected, sanitize it */\n if (currentNode.content instanceof DocumentFragment) {\n _sanitizeShadowDOM(currentNode.content);\n }\n }\n /* If we sanitized `dirty` in-place, return it. */\n if (IN_PLACE) {\n return dirty;\n }\n /* Return sanitized string or DOM */\n if (RETURN_DOM) {\n if (RETURN_DOM_FRAGMENT) {\n returnNode = createDocumentFragment.call(body.ownerDocument);\n while (body.firstChild) {\n // eslint-disable-next-line unicorn/prefer-dom-node-append\n returnNode.appendChild(body.firstChild);\n }\n } else {\n returnNode = body;\n }\n if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmode) {\n /*\n AdoptNode() is not used because internal state is not reset\n (e.g. the past names map of a HTMLFormElement), this is safe\n in theory but we would rather not risk another attack vector.\n The state that is cloned by importNode() is explicitly defined\n by the specs.\n */\n returnNode = importNode.call(originalDocument, returnNode, true);\n }\n return returnNode;\n }\n let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;\n /* Serialize doctype if allowed */\n if (WHOLE_DOCUMENT && ALLOWED_TAGS['!doctype'] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) {\n serializedHTML = '\\n' + serializedHTML;\n }\n /* Sanitize final string template-safe */\n if (SAFE_FOR_TEMPLATES) {\n arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n serializedHTML = stringReplace(serializedHTML, expr, ' ');\n });\n }\n return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(serializedHTML) : serializedHTML;\n };\n DOMPurify.setConfig = function () {\n let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n _parseConfig(cfg);\n SET_CONFIG = true;\n };\n DOMPurify.clearConfig = function () {\n CONFIG = null;\n SET_CONFIG = false;\n };\n DOMPurify.isValidAttribute = function (tag, attr, value) {\n /* Initialize shared config vars if necessary. */\n if (!CONFIG) {\n _parseConfig({});\n }\n const lcTag = transformCaseFunc(tag);\n const lcName = transformCaseFunc(attr);\n return _isValidAttribute(lcTag, lcName, value);\n };\n DOMPurify.addHook = function (entryPoint, hookFunction) {\n if (typeof hookFunction !== 'function') {\n return;\n }\n arrayPush(hooks[entryPoint], hookFunction);\n };\n DOMPurify.removeHook = function (entryPoint, hookFunction) {\n if (hookFunction !== undefined) {\n const index = arrayLastIndexOf(hooks[entryPoint], hookFunction);\n return index === -1 ? undefined : arraySplice(hooks[entryPoint], index, 1)[0];\n }\n return arrayPop(hooks[entryPoint]);\n };\n DOMPurify.removeHooks = function (entryPoint) {\n hooks[entryPoint] = [];\n };\n DOMPurify.removeAllHooks = function () {\n hooks = _createHooksMap();\n };\n return DOMPurify;\n}\nvar purify = createDOMPurify();\n\nexport { purify as default };\n//# sourceMappingURL=purify.es.mjs.map\n","/**\n * ProductCard 컴포넌트\n *\n * 상품 목록에서 개별 상품을 표시하는 카드 컴포넌트입니다.\n * 다중 통화를 지원하며, 할인율 뱃지를 표시합니다.\n */\n\nimport React, { useEffect, useState } from 'react';\n\n// @ts-ignore - DOMPurify 타입 정의 없음\nimport DOMPurify from 'dompurify';\n\n// 기본 컴포넌트 import\nimport { Div } from '../basic/Div';\nimport { Button } from '../basic/Button';\nimport { Span } from '../basic/Span';\nimport { H3 } from '../basic/H3';\nimport { Img } from '../basic/Img';\nimport type { EditorAttrs } from '../../types';\n\n/**\n * 선호 통화를 전역 상태에서 읽고, 변경을 구독하는 훅.\n *\n * 회귀 배경: 종전 `G7Core.state.get('preferredCurrency')` 는 key 를 무시하고\n * _global 전체 객체를 반환해(G7CoreGlobals: get: () => getGlobalState()) 통화 코드가\n * 아닌 객체가 들어가 multi_currency 조회가 항상 KRW 폴백되었고, 단발 get 이라 헤더에서\n * 통화를 바꿔도 카드가 리렌더되지 않았다(상품 리스트/검색/캐러셀 KRW 고정 결함).\n * → 전체 객체에서 `.preferredCurrency` 키로 접근 + state.subscribe 로 리렌더한다.\n *\n * @returns 현재 선호 통화 코드(미설정 시 'KRW')\n */\nconst usePreferredCurrency = (): string => {\n const read = (): string => {\n const state = (window as any).G7Core?.state?.get?.();\n return (state && state.preferredCurrency) || 'KRW';\n };\n const [currency, setCurrency] = useState(read);\n\n useEffect(() => {\n const subscribe = (window as any).G7Core?.state?.subscribe;\n // 구독 시점과 마운트 사이 변경분 보정\n setCurrency(read());\n if (typeof subscribe !== 'function') return;\n const unsubscribe = subscribe((state: Record) => {\n setCurrency((state && state.preferredCurrency) || 'KRW');\n });\n return typeof unsubscribe === 'function' ? unsubscribe : undefined;\n }, []);\n\n return currency;\n};\n\n// G7Core.dispatch() navigate 헬퍼\nconst navigate = (path: string) => {\n (window as any).G7Core?.dispatch?.({\n handler: 'navigate',\n params: { path },\n });\n};\n\ninterface CurrencyPrice {\n value: number;\n formatted: string;\n}\n\ninterface ProductLabel {\n name: string;\n color: string;\n}\n\ninterface ProductCardProps {\n product: {\n id: number;\n /** 상품코드 — 상세 페이지 링크 식별자 (product_code 기준 라우팅). 없으면 id 로 폴백 */\n product_code?: string;\n name?: string | Record;\n name_localized?: string;\n thumbnail_url: string;\n primary_category?: string;\n selling_price: number;\n selling_price_formatted: string;\n list_price?: number;\n list_price_formatted?: string;\n discount_rate?: number;\n multi_currency_selling_price?: Record;\n multi_currency_list_price?: Record;\n /** 검색 하이라이트된 상품명 (HTML) */\n name_highlighted?: string;\n /** 검색 하이라이트된 설명 (HTML) */\n description_highlighted?: string;\n /** 짧은 설명 */\n short_description?: string;\n /** 판매 상태 (on_sale, sold_out, suspended, coming_soon) */\n sales_status?: string;\n /** 판매 상태 번역 라벨 */\n sales_status_label?: string;\n /** 브랜드명 */\n brand_name?: string;\n /** 상품 라벨/뱃지 목록 */\n labels?: ProductLabel[];\n /** 평균 별점 (0.0 ~ 5.0, 소수점 1자리) */\n rating_avg?: number;\n /** 전시중 리뷰 수 */\n review_count?: number;\n };\n /** 클릭 시 호출되는 콜백 */\n onClick?: (productId: number) => void;\n /** 쇼핑몰 base 경로 (예: '/shop', '/store', '/') */\n shopBase?: string;\n /** 추가 CSS 클래스 */\n className?: string;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n/**\n * 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread)\n */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * 상품 카드 컴포넌트\n *\n * @example\n * ```tsx\n * \n * ```\n *\n * @example\n * ```json\n * // 레이아웃 JSON에서 사용\n * {\n * \"type\": \"composite\",\n * \"name\": \"ProductCard\",\n * \"props\": { \"product\": \"{{product}}\" }\n * }\n * ```\n */\n/**\n * rating_avg(0~5)를 0.5 단위로 반올림하여 별 아이콘 배열을 반환합니다.\n * 반환값: 5개 원소, 각각 'full' | 'half' | 'empty'\n */\nconst getStarTypes = (avg: number): Array<'full' | 'half' | 'empty'> => {\n const rounded = Math.round(avg * 2) / 2; // 0.5 단위 반올림\n return [1, 2, 3, 4, 5].map((pos) => {\n if (rounded >= pos) return 'full';\n if (rounded >= pos - 0.5) return 'half';\n return 'empty';\n });\n};\n\nconst ProductCard: React.FC = ({\n product,\n onClick,\n shopBase = '/shop',\n className = '',\n id,\n editorAttrs,\n}) => {\n const preferredCurrency = usePreferredCurrency();\n\n /**\n * 다중 통화 가격을 가져옵니다.\n * 선호 통화가 없으면 기본 포맷 가격을 반환합니다.\n */\n const getPrice = (field: 'selling_price' | 'list_price'): string | undefined => {\n const multiCurrencyField = `multi_currency_${field}` as keyof typeof product;\n const multiCurrencyData = product[multiCurrencyField] as Record | undefined;\n\n if (multiCurrencyData && multiCurrencyData[preferredCurrency]) {\n return multiCurrencyData[preferredCurrency].formatted;\n }\n\n const formattedField = `${field}_formatted` as keyof typeof product;\n return product[formattedField] as string | undefined;\n };\n\n const displayName = product.name_localized\n ?? (typeof product.name === 'string' ? product.name : '')\n ?? '';\n const sellingPrice = getPrice('selling_price');\n const listPrice = getPrice('list_price');\n const hasDiscount = product.discount_rate && product.discount_rate > 0;\n const isNotOnSale = product.sales_status && product.sales_status !== 'on_sale';\n const labels = product.labels ?? [];\n\n /**\n * HTML 하이라이트가 있으면 sanitize하여 반환합니다.\n * mark 태그만 허용하여 XSS를 방지합니다.\n */\n const sanitizeHighlight = (html: string): string => {\n return DOMPurify.sanitize(html, {\n ALLOWED_TAGS: ['mark'],\n ALLOWED_ATTR: [],\n }) as unknown as string;\n };\n\n const nameHighlighted = product.name_highlighted;\n const descriptionHtml = product.description_highlighted ?? product.short_description;\n\n const handleClick = () => {\n if (onClick) {\n onClick(product.id);\n } else {\n const base = shopBase === '/' ? '' : shopBase;\n // 상세 페이지는 product_code 기준 라우팅. code 미제공 시 id 로 폴백(하위호환).\n const identifier = product.product_code ?? product.id;\n navigate(`${base}/products/${identifier}`);\n }\n };\n\n return (\n \n {/* 이미지 영역 */}\n
\n {/* 상품 이미지 */}\n \n\n {/* 판매 상태 오버레이 */}\n {isNotOnSale && (\n
\n \n {product.sales_status_label ?? product.sales_status}\n \n
\n )}\n\n {/* 할인율 뱃지 (좌상단) - 품절/판매중단 시 숨김 */}\n {hasDiscount && product.sales_status !== 'sold_out' && product.sales_status !== 'suspended' && (\n \n {product.discount_rate}%\n \n )}\n\n {/* 상품 라벨/뱃지 (우하단) */}\n {labels.length > 0 && (\n
\n {labels.map((label, idx) => (\n \n {label.name}\n \n ))}\n
\n )}\n
\n\n {/* 상품 정보 */}\n
\n {/* 카테고리 및 브랜드 */}\n
\n {product.primary_category && (\n \n {product.primary_category}\n \n )}\n {product.brand_name && (\n \n {product.brand_name}\n \n )}\n
\n\n {/* 상품명 */}\n {nameHighlighted ? (\n \n ) : (\n

\n {displayName}\n

\n )}\n\n {/* 상품 설명 (검색 결과 등에서 표시) */}\n {descriptionHtml && (\n \n )}\n\n {/* 별점 영역 */}\n
\n {getStarTypes(product.rating_avg ?? 0).map((type, idx) => (\n \n {type === 'full' && }\n {type === 'half' && }\n {type === 'empty' && }\n \n ))}\n \n {(product.rating_avg ?? 0).toFixed(1)}\n \n \n ({product.review_count ?? 0})\n \n
\n\n {/* 가격 영역 */}\n
\n \n {sellingPrice}\n \n {listPrice && hasDiscount && (\n \n {listPrice}\n \n )}\n
\n
\n \n );\n};\n\nexport default ProductCard;\n","const MODULE_CAROUSEL = \"carousel\";\nconst MODULE_CONTROLLER = \"controller\";\nconst MODULE_NAVIGATION = \"navigation\";\nconst MODULE_NO_SCROLL = \"no-scroll\";\nconst MODULE_PORTAL = \"portal\";\nconst MODULE_ROOT = \"root\";\nconst MODULE_TOOLBAR = \"toolbar\";\nconst PLUGIN_CAPTIONS = \"captions\";\nconst PLUGIN_COUNTER = \"counter\";\nconst PLUGIN_DOWNLOAD = \"download\";\nconst PLUGIN_FULLSCREEN = \"fullscreen\";\nconst PLUGIN_INLINE = \"inline\";\nconst PLUGIN_SHARE = \"share\";\nconst PLUGIN_SLIDESHOW = \"slideshow\";\nconst PLUGIN_THUMBNAILS = \"thumbnails\";\nconst PLUGIN_ZOOM = \"zoom\";\nconst SLIDE_STATUS_LOADING = \"loading\";\nconst SLIDE_STATUS_PLAYING = \"playing\";\nconst SLIDE_STATUS_ERROR = \"error\";\nconst SLIDE_STATUS_COMPLETE = \"complete\";\nconst SLIDE_STATUS_PLACEHOLDER = \"placeholder\";\nconst activeSlideStatus = (status) => `active-slide-${status}`;\nconst ACTIVE_SLIDE_LOADING = activeSlideStatus(SLIDE_STATUS_LOADING);\nconst ACTIVE_SLIDE_PLAYING = activeSlideStatus(SLIDE_STATUS_PLAYING);\nconst ACTIVE_SLIDE_ERROR = activeSlideStatus(SLIDE_STATUS_ERROR);\nconst ACTIVE_SLIDE_COMPLETE = activeSlideStatus(SLIDE_STATUS_COMPLETE);\nconst CLASS_FULLSIZE = \"fullsize\";\nconst CLASS_FLEX_CENTER = \"flex_center\";\nconst CLASS_NO_SCROLL = \"no_scroll\";\nconst CLASS_NO_SCROLL_PADDING = \"no_scroll_padding\";\nconst CLASS_SLIDE = \"slide\";\nconst CLASS_SLIDE_WRAPPER = \"slide_wrapper\";\nconst CLASS_SLIDE_WRAPPER_INTERACTIVE = \"slide_wrapper_interactive\";\nconst ACTION_PREV = \"prev\";\nconst ACTION_NEXT = \"next\";\nconst ACTION_SWIPE = \"swipe\";\nconst ACTION_CLOSE = \"close\";\nconst EVENT_ON_POINTER_DOWN = \"onPointerDown\";\nconst EVENT_ON_POINTER_MOVE = \"onPointerMove\";\nconst EVENT_ON_POINTER_UP = \"onPointerUp\";\nconst EVENT_ON_POINTER_LEAVE = \"onPointerLeave\";\nconst EVENT_ON_POINTER_CANCEL = \"onPointerCancel\";\nconst EVENT_ON_KEY_DOWN = \"onKeyDown\";\nconst EVENT_ON_KEY_UP = \"onKeyUp\";\nconst EVENT_ON_WHEEL = \"onWheel\";\nconst VK_ESCAPE = \"Escape\";\nconst VK_ARROW_LEFT = \"ArrowLeft\";\nconst VK_ARROW_RIGHT = \"ArrowRight\";\nconst ELEMENT_BUTTON = \"button\";\nconst ELEMENT_ICON = \"icon\";\nconst IMAGE_FIT_CONTAIN = \"contain\";\nconst IMAGE_FIT_COVER = \"cover\";\nconst UNKNOWN_ACTION_TYPE = \"Unknown action type\";\n\nexport { ACTION_CLOSE, ACTION_NEXT, ACTION_PREV, ACTION_SWIPE, ACTIVE_SLIDE_COMPLETE, ACTIVE_SLIDE_ERROR, ACTIVE_SLIDE_LOADING, ACTIVE_SLIDE_PLAYING, CLASS_FLEX_CENTER, CLASS_FULLSIZE, CLASS_NO_SCROLL, CLASS_NO_SCROLL_PADDING, CLASS_SLIDE, CLASS_SLIDE_WRAPPER, CLASS_SLIDE_WRAPPER_INTERACTIVE, ELEMENT_BUTTON, ELEMENT_ICON, EVENT_ON_KEY_DOWN, EVENT_ON_KEY_UP, EVENT_ON_POINTER_CANCEL, EVENT_ON_POINTER_DOWN, EVENT_ON_POINTER_LEAVE, EVENT_ON_POINTER_MOVE, EVENT_ON_POINTER_UP, EVENT_ON_WHEEL, IMAGE_FIT_CONTAIN, IMAGE_FIT_COVER, MODULE_CAROUSEL, MODULE_CONTROLLER, MODULE_NAVIGATION, MODULE_NO_SCROLL, MODULE_PORTAL, MODULE_ROOT, MODULE_TOOLBAR, PLUGIN_CAPTIONS, PLUGIN_COUNTER, PLUGIN_DOWNLOAD, PLUGIN_FULLSCREEN, PLUGIN_INLINE, PLUGIN_SHARE, PLUGIN_SLIDESHOW, PLUGIN_THUMBNAILS, PLUGIN_ZOOM, SLIDE_STATUS_COMPLETE, SLIDE_STATUS_ERROR, SLIDE_STATUS_LOADING, SLIDE_STATUS_PLACEHOLDER, SLIDE_STATUS_PLAYING, UNKNOWN_ACTION_TYPE, VK_ARROW_LEFT, VK_ARROW_RIGHT, VK_ESCAPE, activeSlideStatus };\n","\"use client\";\nimport * as React from 'react';\nimport { IMAGE_FIT_COVER, IMAGE_FIT_CONTAIN, ACTION_CLOSE, MODULE_CONTROLLER, UNKNOWN_ACTION_TYPE, ELEMENT_BUTTON, ELEMENT_ICON, EVENT_ON_WHEEL, EVENT_ON_KEY_UP, EVENT_ON_KEY_DOWN, EVENT_ON_POINTER_CANCEL, EVENT_ON_POINTER_LEAVE, EVENT_ON_POINTER_UP, EVENT_ON_POINTER_MOVE, EVENT_ON_POINTER_DOWN, SLIDE_STATUS_LOADING, activeSlideStatus, SLIDE_STATUS_COMPLETE, SLIDE_STATUS_ERROR, SLIDE_STATUS_PLACEHOLDER, CLASS_SLIDE, CLASS_SLIDE_WRAPPER, ACTION_PREV, ACTION_NEXT, ACTION_SWIPE, MODULE_PORTAL, CLASS_FLEX_CENTER, MODULE_CAROUSEL, VK_ARROW_RIGHT, VK_ARROW_LEFT, VK_ESCAPE, MODULE_NAVIGATION, CLASS_NO_SCROLL, CLASS_NO_SCROLL_PADDING, MODULE_NO_SCROLL, MODULE_ROOT, MODULE_TOOLBAR } from './types.js';\nimport { createPortal } from 'react-dom';\nexport { ACTIVE_SLIDE_COMPLETE, ACTIVE_SLIDE_ERROR, ACTIVE_SLIDE_LOADING, ACTIVE_SLIDE_PLAYING, CLASS_FULLSIZE, CLASS_SLIDE_WRAPPER_INTERACTIVE, PLUGIN_CAPTIONS, PLUGIN_COUNTER, PLUGIN_DOWNLOAD, PLUGIN_FULLSCREEN, PLUGIN_INLINE, PLUGIN_SHARE, PLUGIN_SLIDESHOW, PLUGIN_THUMBNAILS, PLUGIN_ZOOM, SLIDE_STATUS_PLAYING } from './types.js';\n\nconst cssPrefix$3 = \"yarl__\";\nfunction clsx(...classes) {\n return [...classes].filter(Boolean).join(\" \");\n}\nfunction cssClass(name) {\n return `${cssPrefix$3}${name}`;\n}\nfunction cssVar(name) {\n return `--${cssPrefix$3}${name}`;\n}\nfunction composePrefix(base, prefix) {\n return `${base}${prefix ? `_${prefix}` : \"\"}`;\n}\nfunction makeComposePrefix(base) {\n return (prefix) => composePrefix(base, prefix);\n}\nfunction translateLabel(labels, defaultLabel) {\n var _a;\n return (_a = labels === null || labels === void 0 ? void 0 : labels[defaultLabel]) !== null && _a !== void 0 ? _a : defaultLabel;\n}\nfunction label(labels, defaultLabel) {\n return translateLabel(labels, defaultLabel);\n}\nfunction translateSlideCounter(labels, slides, index) {\n return translateLabel(labels, \"{index} of {total}\")\n .replace(/\\{index}/g, `${getSlideIndex(index, slides.length) + 1}`)\n .replace(/\\{total}/g, `${slides.length}`);\n}\nfunction cleanup(...cleaners) {\n return () => {\n cleaners.forEach((cleaner) => {\n cleaner();\n });\n };\n}\nfunction makeUseContext(name, contextName, context) {\n return () => {\n const ctx = React.useContext(context);\n if (!ctx) {\n throw new Error(`${name} must be used within a ${contextName}.Provider`);\n }\n return ctx;\n };\n}\nfunction hasWindow() {\n return typeof window !== \"undefined\";\n}\nfunction round(value, decimals = 0) {\n const factor = 10 ** decimals;\n return Math.round((value + Number.EPSILON) * factor) / factor;\n}\nfunction isImageSlide(slide) {\n return slide.type === undefined || slide.type === \"image\";\n}\nfunction isImageFitCover(image, imageFit) {\n return image.imageFit === IMAGE_FIT_COVER || (image.imageFit !== IMAGE_FIT_CONTAIN && imageFit === IMAGE_FIT_COVER);\n}\nfunction parseInt(value) {\n return typeof value === \"string\" ? Number.parseInt(value, 10) : value;\n}\nfunction parseLengthPercentage(input) {\n if (typeof input === \"number\") {\n return { pixel: input };\n }\n if (typeof input === \"string\") {\n const value = parseInt(input);\n return input.endsWith(\"%\") ? { percent: value } : { pixel: value };\n }\n return { pixel: 0 };\n}\nfunction computeSlideRect(containerRect, padding) {\n const paddingValue = parseLengthPercentage(padding);\n const paddingPixels = paddingValue.percent !== undefined ? (containerRect.width / 100) * paddingValue.percent : paddingValue.pixel;\n return {\n width: Math.max(containerRect.width - 2 * paddingPixels, 0),\n height: Math.max(containerRect.height - 2 * paddingPixels, 0),\n };\n}\nfunction devicePixelRatio() {\n return (hasWindow() ? window === null || window === void 0 ? void 0 : window.devicePixelRatio : undefined) || 1;\n}\nfunction getSlideIndex(index, slidesCount) {\n return slidesCount > 0 ? ((index % slidesCount) + slidesCount) % slidesCount : 0;\n}\nfunction hasSlides(slides) {\n return slides.length > 0;\n}\nfunction getSlide(slides, index) {\n return slides[getSlideIndex(index, slides.length)];\n}\nfunction getSlideIfPresent(slides, index) {\n return hasSlides(slides) ? getSlide(slides, index) : undefined;\n}\nfunction getSlideKey(slide) {\n return isImageSlide(slide) ? slide.src : undefined;\n}\nfunction addToolbarButton(toolbar, key, button) {\n if (!button)\n return toolbar;\n const { buttons, ...restToolbar } = toolbar;\n const index = buttons.findIndex((item) => item === key);\n const buttonWithKey = React.isValidElement(button) ? React.cloneElement(button, { key }, null) : button;\n if (index >= 0) {\n const result = [...buttons];\n result.splice(index, 1, buttonWithKey);\n return { buttons: result, ...restToolbar };\n }\n return { buttons: [buttonWithKey, ...buttons], ...restToolbar };\n}\nfunction stopNavigationEventsPropagation() {\n const stopPropagation = (event) => {\n event.stopPropagation();\n };\n return { onPointerDown: stopPropagation, onKeyDown: stopPropagation, onWheel: stopPropagation };\n}\nfunction calculatePreload(carousel, slides, minimum = 0) {\n return Math.min(carousel.preload, Math.max(carousel.finite ? slides.length - 1 : Math.floor(slides.length / 2), minimum));\n}\nconst isReact19 = Number(React.version.split(\".\")[0]) >= 19;\nfunction makeInertWhen(condition) {\n const legacyValue = condition ? \"\" : undefined;\n return { inert: isReact19 ? condition : legacyValue };\n}\nfunction reflow(node) {\n node.scrollTop;\n}\n\nconst LightboxDefaultProps = {\n open: false,\n close: () => { },\n index: 0,\n slides: [],\n render: {},\n plugins: [],\n toolbar: { buttons: [ACTION_CLOSE] },\n labels: {},\n animation: {\n fade: 250,\n swipe: 500,\n easing: {\n fade: \"ease\",\n swipe: \"ease-out\",\n navigation: \"ease-in-out\",\n },\n },\n carousel: {\n finite: false,\n preload: 2,\n padding: \"16px\",\n spacing: \"30%\",\n imageFit: IMAGE_FIT_CONTAIN,\n imageProps: {},\n },\n controller: {\n ref: null,\n focus: true,\n aria: false,\n touchAction: \"none\",\n closeOnPullUp: false,\n closeOnPullDown: false,\n closeOnBackdropClick: false,\n preventDefaultWheelX: true,\n preventDefaultWheelY: false,\n disableSwipeNavigation: false,\n },\n portal: {},\n noScroll: {\n disabled: false,\n },\n on: {},\n styles: {},\n className: \"\",\n};\n\nfunction createModule(name, component) {\n return { name, component };\n}\nfunction createNode(module, children) {\n return { module, children };\n}\nfunction traverseNode(node, target, apply) {\n if (node.module.name === target) {\n return apply(node);\n }\n if (node.children) {\n return [\n createNode(node.module, node.children.flatMap((n) => { var _a; return (_a = traverseNode(n, target, apply)) !== null && _a !== void 0 ? _a : []; })),\n ];\n }\n return [node];\n}\nfunction traverse(nodes, target, apply) {\n return nodes.flatMap((node) => { var _a; return (_a = traverseNode(node, target, apply)) !== null && _a !== void 0 ? _a : []; });\n}\nfunction withPlugins(root, plugins = [], augmentations = []) {\n let config = root;\n const contains = (target) => {\n const nodes = [...config];\n while (nodes.length > 0) {\n const node = nodes.pop();\n if ((node === null || node === void 0 ? void 0 : node.module.name) === target)\n return true;\n if (node === null || node === void 0 ? void 0 : node.children)\n nodes.push(...node.children);\n }\n return false;\n };\n const addParent = (target, module) => {\n if (target === \"\") {\n config = [createNode(module, config)];\n return;\n }\n config = traverse(config, target, (node) => [createNode(module, [node])]);\n };\n const append = (target, module) => {\n config = traverse(config, target, (node) => [createNode(node.module, [createNode(module, node.children)])]);\n };\n const addChild = (target, module, precede) => {\n config = traverse(config, target, (node) => {\n var _a;\n return [\n createNode(node.module, [\n ...(precede ? [createNode(module)] : []),\n ...((_a = node.children) !== null && _a !== void 0 ? _a : []),\n ...(!precede ? [createNode(module)] : []),\n ]),\n ];\n });\n };\n const addSibling = (target, module, precede) => {\n config = traverse(config, target, (node) => [\n ...(precede ? [createNode(module)] : []),\n node,\n ...(!precede ? [createNode(module)] : []),\n ]);\n };\n const addModule = (module) => {\n append(MODULE_CONTROLLER, module);\n };\n const replace = (target, module) => {\n config = traverse(config, target, (node) => [createNode(module, node.children)]);\n };\n const remove = (target) => {\n config = traverse(config, target, (node) => node.children);\n };\n const augment = (augmentation) => {\n augmentations.push(augmentation);\n };\n plugins.forEach((plugin) => {\n plugin({\n contains,\n addParent,\n append,\n addChild,\n addSibling,\n addModule,\n replace,\n remove,\n augment,\n });\n });\n return {\n config,\n augmentation: (props) => augmentations.reduce((acc, augmentation) => augmentation(acc), props),\n };\n}\n\nconst A11yContext = React.createContext(null);\nconst useA11yContext = makeUseContext(\"useA11yContext\", \"A11yContext\", A11yContext);\nfunction A11yContextProvider({ children }) {\n const [focusWithin, setFocusWithin] = React.useState(false);\n const [autoPlaying, setAutoPlaying] = React.useState(false);\n const context = React.useMemo(() => {\n const trackFocusWithin = (onFocus, onBlur) => {\n const trackAndDelegate = (focusWithinValue) => (event) => {\n var _a;\n if (!event.currentTarget.contains(event.relatedTarget)) {\n setFocusWithin(focusWithinValue);\n }\n (_a = (focusWithinValue ? onFocus : onBlur)) === null || _a === void 0 ? void 0 : _a(event);\n };\n return {\n onFocus: trackAndDelegate(true),\n onBlur: trackAndDelegate(false),\n };\n };\n return { focusWithin, trackFocusWithin, autoPlaying, setAutoPlaying };\n }, [focusWithin, autoPlaying]);\n return React.createElement(A11yContext.Provider, { value: context }, children);\n}\n\nconst DocumentContext = React.createContext(null);\nconst useDocumentContext = makeUseContext(\"useDocument\", \"DocumentContext\", DocumentContext);\nfunction DocumentContextProvider({ nodeRef, children }) {\n const context = React.useMemo(() => {\n const getOwnerDocument = (node) => { var _a; return ((_a = (node || nodeRef.current)) === null || _a === void 0 ? void 0 : _a.ownerDocument) || document; };\n const getOwnerWindow = (node) => { var _a; return ((_a = getOwnerDocument(node)) === null || _a === void 0 ? void 0 : _a.defaultView) || window; };\n return { getOwnerDocument, getOwnerWindow };\n }, [nodeRef]);\n return React.createElement(DocumentContext.Provider, { value: context }, children);\n}\n\nconst EventsContext = React.createContext(null);\nconst useEvents = makeUseContext(\"useEvents\", \"EventsContext\", EventsContext);\nfunction EventsProvider({ children }) {\n const [subscriptions] = React.useState({});\n React.useEffect(() => () => {\n Object.keys(subscriptions).forEach((topic) => delete subscriptions[topic]);\n }, [subscriptions]);\n const context = React.useMemo(() => {\n const unsubscribe = (topic, callback) => {\n var _a;\n (_a = subscriptions[topic]) === null || _a === void 0 ? void 0 : _a.splice(0, subscriptions[topic].length, ...subscriptions[topic].filter((cb) => cb !== callback));\n };\n const subscribe = (topic, callback) => {\n if (!subscriptions[topic]) {\n subscriptions[topic] = [];\n }\n subscriptions[topic].push(callback);\n return () => unsubscribe(topic, callback);\n };\n const publish = (...[topic, event]) => {\n var _a;\n (_a = subscriptions[topic]) === null || _a === void 0 ? void 0 : _a.forEach((callback) => callback(event));\n };\n return { publish, subscribe, unsubscribe };\n }, [subscriptions]);\n return React.createElement(EventsContext.Provider, { value: context }, children);\n}\n\nconst LightboxPropsContext = React.createContext(null);\nconst useLightboxProps = makeUseContext(\"useLightboxProps\", \"LightboxPropsContext\", LightboxPropsContext);\nfunction LightboxPropsProvider({ children, ...props }) {\n return React.createElement(LightboxPropsContext.Provider, { value: props }, children);\n}\n\nconst LightboxStateContext = React.createContext(null);\nconst useLightboxState = makeUseContext(\"useLightboxState\", \"LightboxStateContext\", LightboxStateContext);\nconst LightboxDispatchContext = React.createContext(null);\nconst useLightboxDispatch = makeUseContext(\"useLightboxDispatch\", \"LightboxDispatchContext\", LightboxDispatchContext);\nfunction reducer(state, action) {\n switch (action.type) {\n case \"swipe\": {\n const { slides } = state;\n const increment = (action === null || action === void 0 ? void 0 : action.increment) || 0;\n const globalIndex = state.globalIndex + increment;\n const currentIndex = getSlideIndex(globalIndex, slides.length);\n const currentSlide = getSlideIfPresent(slides, currentIndex);\n const animation = increment || action.duration !== undefined\n ? {\n increment,\n duration: action.duration,\n easing: action.easing,\n }\n : undefined;\n return { slides, currentIndex, globalIndex, currentSlide, animation };\n }\n case \"update\":\n if (action.slides !== state.slides || action.index !== state.currentIndex) {\n return {\n slides: action.slides,\n currentIndex: action.index,\n globalIndex: action.index,\n currentSlide: getSlideIfPresent(action.slides, action.index),\n };\n }\n return state;\n default:\n throw new Error(UNKNOWN_ACTION_TYPE);\n }\n}\nfunction LightboxStateProvider({ slides, index, children }) {\n const [state, dispatch] = React.useReducer(reducer, {\n slides,\n currentIndex: index,\n globalIndex: index,\n currentSlide: getSlideIfPresent(slides, index),\n });\n React.useEffect(() => {\n dispatch({ type: \"update\", slides, index });\n }, [slides, index]);\n const context = React.useMemo(() => ({ ...state, state, dispatch }), [state, dispatch]);\n return (React.createElement(LightboxDispatchContext.Provider, { value: dispatch },\n React.createElement(LightboxStateContext.Provider, { value: context }, children)));\n}\n\nconst TimeoutsContext = React.createContext(null);\nconst useTimeouts = makeUseContext(\"useTimeouts\", \"TimeoutsContext\", TimeoutsContext);\nfunction TimeoutsProvider({ children }) {\n const [timeouts] = React.useState([]);\n React.useEffect(() => () => {\n timeouts.forEach((tid) => window.clearTimeout(tid));\n timeouts.splice(0, timeouts.length);\n }, [timeouts]);\n const context = React.useMemo(() => {\n const removeTimeout = (id) => {\n timeouts.splice(0, timeouts.length, ...timeouts.filter((tid) => tid !== id));\n };\n const setTimeout = (fn, delay) => {\n const id = window.setTimeout(() => {\n removeTimeout(id);\n fn();\n }, delay);\n timeouts.push(id);\n return id;\n };\n const clearTimeout = (id) => {\n if (id !== undefined) {\n removeTimeout(id);\n window.clearTimeout(id);\n }\n };\n return { setTimeout, clearTimeout };\n }, [timeouts]);\n return React.createElement(TimeoutsContext.Provider, { value: context }, children);\n}\n\nconst IconButton = React.forwardRef(function IconButton({ label, className, icon: Icon, renderIcon, onClick, style, ...rest }, ref) {\n const { styles, labels } = useLightboxProps();\n const buttonLabel = translateLabel(labels, label);\n return (React.createElement(\"button\", { ref: ref, type: \"button\", title: buttonLabel, \"aria-label\": buttonLabel, className: clsx(cssClass(ELEMENT_BUTTON), className), onClick: onClick, style: { ...style, ...styles.button }, ...rest }, renderIcon ? renderIcon() : React.createElement(Icon, { className: cssClass(ELEMENT_ICON), style: styles.icon })));\n});\n\nfunction svgIcon(name, children) {\n const icon = (props) => (React.createElement(\"svg\", { xmlns: \"http://www.w3.org/2000/svg\", viewBox: \"0 0 24 24\", width: \"24\", height: \"24\", \"aria-hidden\": \"true\", focusable: \"false\", ...props }, children));\n icon.displayName = name;\n return icon;\n}\nfunction createIcon(name, glyph) {\n return svgIcon(name, React.createElement(\"g\", { fill: \"currentColor\" },\n React.createElement(\"path\", { d: \"M0 0h24v24H0z\", fill: \"none\" }),\n glyph));\n}\nfunction createIconDisabled(name, glyph) {\n return svgIcon(name, React.createElement(React.Fragment, null,\n React.createElement(\"defs\", null,\n React.createElement(\"mask\", { id: \"strike\" },\n React.createElement(\"path\", { d: \"M0 0h24v24H0z\", fill: \"white\" }),\n React.createElement(\"path\", { d: \"M0 0L24 24\", stroke: \"black\", strokeWidth: 4 }))),\n React.createElement(\"path\", { d: \"M0.70707 2.121320L21.878680 23.292883\", stroke: \"currentColor\", strokeWidth: 2 }),\n React.createElement(\"g\", { fill: \"currentColor\", mask: \"url(#strike)\" },\n React.createElement(\"path\", { d: \"M0 0h24v24H0z\", fill: \"none\" }),\n glyph)));\n}\nconst CloseIcon = createIcon(\"Close\", React.createElement(\"path\", { d: \"M19 6.41L17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z\" }));\nconst PreviousIcon = createIcon(\"Previous\", React.createElement(\"path\", { d: \"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z\" }));\nconst NextIcon = createIcon(\"Next\", React.createElement(\"path\", { d: \"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z\" }));\nconst LoadingIcon = createIcon(\"Loading\", React.createElement(React.Fragment, null, Array.from({ length: 8 }).map((_, index, array) => (React.createElement(\"line\", { key: index, x1: \"12\", y1: \"6.5\", x2: \"12\", y2: \"1.8\", strokeLinecap: \"round\", strokeWidth: \"2.6\", stroke: \"currentColor\", strokeOpacity: (1 / array.length) * (index + 1), transform: `rotate(${(360 / array.length) * index}, 12, 12)` })))));\nconst ErrorIcon = createIcon(\"Error\", React.createElement(\"path\", { d: \"M21.9,21.9l-8.49-8.49l0,0L3.59,3.59l0,0L2.1,2.1L0.69,3.51L3,5.83V19c0,1.1,0.9,2,2,2h13.17l2.31,2.31L21.9,21.9z M5,18 l3.5-4.5l2.5,3.01L12.17,15l3,3H5z M21,18.17L5.83,3H19c1.1,0,2,0.9,2,2V18.17z\" }));\n\nconst useLayoutEffect = hasWindow() ? React.useLayoutEffect : React.useEffect;\n\nfunction useMotionPreference() {\n const [reduceMotion, setReduceMotion] = React.useState(false);\n React.useEffect(() => {\n var _a, _b;\n const mediaQuery = (_a = window.matchMedia) === null || _a === void 0 ? void 0 : _a.call(window, \"(prefers-reduced-motion: reduce)\");\n setReduceMotion(mediaQuery === null || mediaQuery === void 0 ? void 0 : mediaQuery.matches);\n const listener = (event) => setReduceMotion(event.matches);\n (_b = mediaQuery === null || mediaQuery === void 0 ? void 0 : mediaQuery.addEventListener) === null || _b === void 0 ? void 0 : _b.call(mediaQuery, \"change\", listener);\n return () => { var _a; return (_a = mediaQuery === null || mediaQuery === void 0 ? void 0 : mediaQuery.removeEventListener) === null || _a === void 0 ? void 0 : _a.call(mediaQuery, \"change\", listener); };\n }, []);\n return reduceMotion;\n}\n\nfunction currentTransformation(node) {\n let x = 0;\n let y = 0;\n let z = 0;\n const matrix = window.getComputedStyle(node).transform;\n const matcher = matrix.match(/matrix.*\\((.+)\\)/);\n if (matcher) {\n const values = matcher[1].split(\",\").map(parseInt);\n if (values.length === 6) {\n x = values[4];\n y = values[5];\n }\n else if (values.length === 16) {\n x = values[12];\n y = values[13];\n z = values[14];\n }\n }\n return { x, y, z };\n}\nfunction useAnimation(nodeRef, computeAnimation) {\n const snapshot = React.useRef(undefined);\n const animation = React.useRef(undefined);\n const reduceMotion = useMotionPreference();\n useLayoutEffect(() => {\n var _a, _b, _c;\n if (nodeRef.current && snapshot.current !== undefined && !reduceMotion) {\n const { keyframes, duration, easing, onfinish } = computeAnimation(snapshot.current, nodeRef.current.getBoundingClientRect(), currentTransformation(nodeRef.current)) || {};\n if (keyframes && duration) {\n (_a = animation.current) === null || _a === void 0 ? void 0 : _a.cancel();\n animation.current = undefined;\n try {\n animation.current = (_c = (_b = nodeRef.current).animate) === null || _c === void 0 ? void 0 : _c.call(_b, keyframes, { duration, easing });\n }\n catch (err) {\n console.error(err);\n }\n if (animation.current) {\n animation.current.onfinish = () => {\n animation.current = undefined;\n onfinish === null || onfinish === void 0 ? void 0 : onfinish();\n };\n }\n }\n }\n snapshot.current = undefined;\n });\n return {\n prepareAnimation: (currentSnapshot) => {\n snapshot.current = currentSnapshot;\n },\n isAnimationPlaying: () => { var _a; return ((_a = animation.current) === null || _a === void 0 ? void 0 : _a.playState) === \"running\"; },\n };\n}\n\nfunction useContainerRect() {\n const containerRef = React.useRef(null);\n const observerRef = React.useRef(undefined);\n const [containerRect, setContainerRect] = React.useState();\n const setContainerRef = React.useCallback((node) => {\n containerRef.current = node;\n if (observerRef.current) {\n observerRef.current.disconnect();\n observerRef.current = undefined;\n }\n const updateContainerRect = () => {\n if (node) {\n const styles = window.getComputedStyle(node);\n const parse = (value) => parseFloat(value) || 0;\n setContainerRect({\n width: Math.round(node.clientWidth - parse(styles.paddingLeft) - parse(styles.paddingRight)),\n height: Math.round(node.clientHeight - parse(styles.paddingTop) - parse(styles.paddingBottom)),\n });\n }\n else {\n setContainerRect(undefined);\n }\n };\n updateContainerRect();\n if (node && typeof ResizeObserver !== \"undefined\") {\n observerRef.current = new ResizeObserver(updateContainerRect);\n observerRef.current.observe(node);\n }\n }, []);\n return { setContainerRef, containerRef, containerRect };\n}\n\nfunction useDelay() {\n const timeoutId = React.useRef(undefined);\n const { setTimeout, clearTimeout } = useTimeouts();\n return React.useCallback((callback, delay) => {\n clearTimeout(timeoutId.current);\n timeoutId.current = setTimeout(callback, delay > 0 ? delay : 0);\n }, [setTimeout, clearTimeout]);\n}\n\nfunction useEventCallback(fn) {\n const ref = React.useRef(fn);\n useLayoutEffect(() => {\n ref.current = fn;\n });\n return React.useCallback((...args) => { var _a; return (_a = ref.current) === null || _a === void 0 ? void 0 : _a.call(ref, ...args); }, []);\n}\n\nfunction setRef(ref, value) {\n if (typeof ref === \"function\") {\n ref(value);\n }\n else if (ref) {\n ref.current = value;\n }\n}\nfunction useForkRef(refA, refB) {\n return React.useMemo(() => refA == null && refB == null\n ? null\n : (refValue) => {\n setRef(refA, refValue);\n setRef(refB, refValue);\n }, [refA, refB]);\n}\n\nfunction useLoseFocus(focus, disabled = false) {\n const focused = React.useRef(false);\n useLayoutEffect(() => {\n if (disabled && focused.current) {\n focused.current = false;\n focus();\n }\n }, [disabled, focus]);\n const onFocus = React.useCallback(() => {\n focused.current = true;\n }, []);\n const onBlur = React.useCallback(() => {\n focused.current = false;\n }, []);\n return { onFocus, onBlur };\n}\n\nfunction useRTL() {\n const [isRTL, setIsRTL] = React.useState(false);\n useLayoutEffect(() => {\n setIsRTL(window.getComputedStyle(window.document.documentElement).direction === \"rtl\");\n }, []);\n return isRTL;\n}\n\nfunction useSensors() {\n const [subscribers] = React.useState({});\n const notifySubscribers = React.useCallback((type, event) => {\n var _a;\n (_a = subscribers[type]) === null || _a === void 0 ? void 0 : _a.forEach((listener) => {\n if (!event.isPropagationStopped())\n listener(event);\n });\n }, [subscribers]);\n const registerSensors = React.useMemo(() => ({\n onPointerDown: (event) => notifySubscribers(EVENT_ON_POINTER_DOWN, event),\n onPointerMove: (event) => notifySubscribers(EVENT_ON_POINTER_MOVE, event),\n onPointerUp: (event) => notifySubscribers(EVENT_ON_POINTER_UP, event),\n onPointerLeave: (event) => notifySubscribers(EVENT_ON_POINTER_LEAVE, event),\n onPointerCancel: (event) => notifySubscribers(EVENT_ON_POINTER_CANCEL, event),\n onKeyDown: (event) => notifySubscribers(EVENT_ON_KEY_DOWN, event),\n onKeyUp: (event) => notifySubscribers(EVENT_ON_KEY_UP, event),\n onWheel: (event) => notifySubscribers(EVENT_ON_WHEEL, event),\n }), [notifySubscribers]);\n const subscribeSensors = React.useCallback((type, callback) => {\n if (!subscribers[type]) {\n subscribers[type] = [];\n }\n subscribers[type].unshift(callback);\n return () => {\n const listeners = subscribers[type];\n if (listeners) {\n listeners.splice(0, listeners.length, ...listeners.filter((el) => el !== callback));\n }\n };\n }, [subscribers]);\n return { registerSensors, subscribeSensors };\n}\n\nfunction useThrottle(callback, delay) {\n const lastCallbackTime = React.useRef(0);\n const delayCallback = useDelay();\n const executeCallback = useEventCallback((...args) => {\n lastCallbackTime.current = Date.now();\n callback(args);\n });\n return React.useCallback((...args) => {\n delayCallback(() => {\n executeCallback(args);\n }, delay - (Date.now() - lastCallbackTime.current));\n }, [delay, executeCallback, delayCallback]);\n}\n\nconst slidePrefix = makeComposePrefix(\"slide\");\nconst slideImagePrefix = makeComposePrefix(\"slide_image\");\nfunction ImageSlide({ slide: image, offset, render, rect, imageFit, imageProps, onClick, onLoad, onError, style, }) {\n var _a, _b, _c, _d, _e, _f, _g, _h;\n const [status, setStatus] = React.useState(SLIDE_STATUS_LOADING);\n const { publish } = useEvents();\n const { setTimeout } = useTimeouts();\n const imageRef = React.useRef(null);\n React.useEffect(() => {\n if (offset === 0) {\n publish(activeSlideStatus(status));\n }\n }, [offset, status, publish]);\n const handleLoading = useEventCallback((img) => {\n (\"decode\" in img ? img.decode() : Promise.resolve())\n .catch(() => { })\n .then(() => {\n if (!img.parentNode) {\n return;\n }\n setStatus(SLIDE_STATUS_COMPLETE);\n setTimeout(() => {\n onLoad === null || onLoad === void 0 ? void 0 : onLoad(img);\n }, 0);\n });\n });\n const setImageRef = React.useCallback((img) => {\n imageRef.current = img;\n if (img === null || img === void 0 ? void 0 : img.complete) {\n handleLoading(img);\n }\n }, [handleLoading]);\n const handleOnLoad = React.useCallback((event) => {\n handleLoading(event.currentTarget);\n }, [handleLoading]);\n const handleOnError = useEventCallback(() => {\n setStatus(SLIDE_STATUS_ERROR);\n onError === null || onError === void 0 ? void 0 : onError();\n });\n const cover = isImageFitCover(image, imageFit);\n const nonInfinite = (value, fallback) => (Number.isFinite(value) ? value : fallback);\n const maxWidth = nonInfinite(Math.max(...((_b = (_a = image.srcSet) === null || _a === void 0 ? void 0 : _a.map((x) => x.width)) !== null && _b !== void 0 ? _b : []).concat(image.width ? [image.width] : []).filter(Boolean)), ((_c = imageRef.current) === null || _c === void 0 ? void 0 : _c.naturalWidth) || 0);\n const maxHeight = nonInfinite(Math.max(...((_e = (_d = image.srcSet) === null || _d === void 0 ? void 0 : _d.map((x) => x.height)) !== null && _e !== void 0 ? _e : []).concat(image.height ? [image.height] : []).filter(Boolean)), ((_f = imageRef.current) === null || _f === void 0 ? void 0 : _f.naturalHeight) || 0);\n const defaultStyle = maxWidth && maxHeight\n ? {\n maxWidth: `min(${maxWidth}px, 100%)`,\n maxHeight: `min(${maxHeight}px, 100%)`,\n }\n : {\n maxWidth: \"100%\",\n maxHeight: \"100%\",\n };\n const srcSet = (_g = image.srcSet) === null || _g === void 0 ? void 0 : _g.sort((a, b) => a.width - b.width).map((item) => `${item.src} ${item.width}w`).join(\", \");\n const estimateActualWidth = () => rect && !cover && image.width && image.height ? (rect.height / image.height) * image.width : Number.MAX_VALUE;\n const sizes = srcSet && rect && hasWindow() ? `${Math.round(Math.min(estimateActualWidth(), rect.width))}px` : undefined;\n const { style: imagePropsStyle, className: imagePropsClassName, ...restImageProps } = imageProps || {};\n return (React.createElement(React.Fragment, null,\n React.createElement(\"img\", { ref: setImageRef, onLoad: handleOnLoad, onError: handleOnError, onClick: onClick, draggable: false, className: clsx(cssClass(slideImagePrefix()), cover && cssClass(slideImagePrefix(\"cover\")), status !== SLIDE_STATUS_COMPLETE && cssClass(slideImagePrefix(\"loading\")), imagePropsClassName), style: { ...defaultStyle, ...style, ...imagePropsStyle }, ...restImageProps, alt: (_h = image.alt) !== null && _h !== void 0 ? _h : \"\", sizes: sizes, srcSet: srcSet, src: image.src }),\n status !== SLIDE_STATUS_COMPLETE && (React.createElement(\"div\", { className: cssClass(slidePrefix(SLIDE_STATUS_PLACEHOLDER)) },\n status === SLIDE_STATUS_LOADING &&\n ((render === null || render === void 0 ? void 0 : render.iconLoading) ? (render.iconLoading()) : (React.createElement(LoadingIcon, { className: clsx(cssClass(ELEMENT_ICON), cssClass(slidePrefix(SLIDE_STATUS_LOADING))) }))),\n status === SLIDE_STATUS_ERROR &&\n ((render === null || render === void 0 ? void 0 : render.iconError) ? (render.iconError()) : (React.createElement(ErrorIcon, { className: clsx(cssClass(ELEMENT_ICON), cssClass(slidePrefix(SLIDE_STATUS_ERROR))) })))))));\n}\n\nconst LightboxRoot = React.forwardRef(function LightboxRoot({ className, children, onFocus, onBlur, ...rest }, ref) {\n const nodeRef = React.useRef(null);\n const { trackFocusWithin } = useA11yContext();\n return (React.createElement(DocumentContextProvider, { nodeRef: nodeRef },\n React.createElement(\"div\", { ref: useForkRef(ref, nodeRef), className: clsx(cssClass(\"root\"), className), ...trackFocusWithin(onFocus, onBlur), ...rest }, children)));\n});\n\nvar SwipeState;\n(function (SwipeState) {\n SwipeState[SwipeState[\"NONE\"] = 0] = \"NONE\";\n SwipeState[SwipeState[\"SWIPE\"] = 1] = \"SWIPE\";\n SwipeState[SwipeState[\"PULL\"] = 2] = \"PULL\";\n SwipeState[SwipeState[\"ANIMATION\"] = 3] = \"ANIMATION\";\n})(SwipeState || (SwipeState = {}));\n\nfunction usePointerEvents(subscribeSensors, onPointerDown, onPointerMove, onPointerUp, disabled) {\n React.useEffect(() => !disabled\n ? cleanup(subscribeSensors(EVENT_ON_POINTER_DOWN, onPointerDown), subscribeSensors(EVENT_ON_POINTER_MOVE, onPointerMove), subscribeSensors(EVENT_ON_POINTER_UP, onPointerUp), subscribeSensors(EVENT_ON_POINTER_LEAVE, onPointerUp), subscribeSensors(EVENT_ON_POINTER_CANCEL, onPointerUp))\n : () => { }, [subscribeSensors, onPointerDown, onPointerMove, onPointerUp, disabled]);\n}\n\nvar Gesture;\n(function (Gesture) {\n Gesture[Gesture[\"NONE\"] = 0] = \"NONE\";\n Gesture[Gesture[\"SWIPE\"] = 1] = \"SWIPE\";\n Gesture[Gesture[\"PULL\"] = 2] = \"PULL\";\n})(Gesture || (Gesture = {}));\nconst SWIPE_THRESHOLD = 30;\nfunction usePointerSwipe({ disableSwipeNavigation, closeOnBackdropClick }, subscribeSensors, isSwipeValid, containerWidth, swipeAnimationDuration, onSwipeStart, onSwipeProgress, onSwipeFinish, onSwipeCancel, pullUpEnabled, pullDownEnabled, onPullStart, onPullProgress, onPullFinish, onPullCancel, onClose) {\n const offset = React.useRef(0);\n const pointers = React.useRef([]);\n const activePointer = React.useRef(undefined);\n const startTime = React.useRef(0);\n const gesture = React.useRef(Gesture.NONE);\n const clearPointer = React.useCallback((event) => {\n if (activePointer.current === event.pointerId) {\n activePointer.current = undefined;\n gesture.current = Gesture.NONE;\n }\n const currentPointers = pointers.current;\n currentPointers.splice(0, currentPointers.length, ...currentPointers.filter((p) => p.pointerId !== event.pointerId));\n }, []);\n const addPointer = React.useCallback((event) => {\n clearPointer(event);\n event.persist();\n pointers.current.push(event);\n }, [clearPointer]);\n const lookupPointer = React.useCallback((event) => pointers.current.find(({ pointerId }) => event.pointerId === pointerId), []);\n const onPointerDown = useEventCallback((event) => {\n addPointer(event);\n });\n const exceedsPullThreshold = (value, threshold) => (pullDownEnabled && value > threshold) || (pullUpEnabled && value < -threshold);\n const onPointerUp = useEventCallback((event) => {\n const pointer = lookupPointer(event);\n if (pointer) {\n if (activePointer.current === event.pointerId) {\n const duration = Date.now() - startTime.current;\n const currentOffset = offset.current;\n if (gesture.current === Gesture.SWIPE) {\n if (Math.abs(currentOffset) > 0.3 * containerWidth ||\n (Math.abs(currentOffset) > 5 && duration < swipeAnimationDuration)) {\n onSwipeFinish(currentOffset, duration);\n }\n else {\n onSwipeCancel(currentOffset);\n }\n }\n else if (gesture.current === Gesture.PULL) {\n if (exceedsPullThreshold(currentOffset, 2 * SWIPE_THRESHOLD)) {\n onPullFinish(currentOffset, duration);\n }\n else {\n onPullCancel(currentOffset);\n }\n }\n offset.current = 0;\n gesture.current = Gesture.NONE;\n }\n else {\n const { target } = event;\n if (closeOnBackdropClick &&\n target instanceof HTMLElement &&\n target === pointer.target &&\n (target.classList.contains(cssClass(CLASS_SLIDE)) || target.classList.contains(cssClass(CLASS_SLIDE_WRAPPER)))) {\n onClose();\n }\n }\n }\n clearPointer(event);\n });\n const onPointerMove = useEventCallback((event) => {\n const pointer = lookupPointer(event);\n if (pointer) {\n const isCurrentPointer = activePointer.current === event.pointerId;\n if (event.buttons === 0) {\n if (isCurrentPointer && offset.current !== 0) {\n onPointerUp(event);\n }\n else {\n clearPointer(pointer);\n }\n return;\n }\n const deltaX = event.clientX - pointer.clientX;\n const deltaY = event.clientY - pointer.clientY;\n if (activePointer.current === undefined) {\n const startGesture = (newGesture) => {\n addPointer(event);\n activePointer.current = event.pointerId;\n startTime.current = Date.now();\n gesture.current = newGesture;\n };\n if (Math.abs(deltaX) > Math.abs(deltaY) && Math.abs(deltaX) > SWIPE_THRESHOLD && isSwipeValid(deltaX)) {\n if (!disableSwipeNavigation) {\n startGesture(Gesture.SWIPE);\n onSwipeStart();\n }\n }\n else if (Math.abs(deltaY) > Math.abs(deltaX) && exceedsPullThreshold(deltaY, SWIPE_THRESHOLD)) {\n startGesture(Gesture.PULL);\n onPullStart();\n }\n }\n else if (isCurrentPointer) {\n if (gesture.current === Gesture.SWIPE) {\n offset.current = deltaX;\n onSwipeProgress(deltaX);\n }\n else if (gesture.current === Gesture.PULL) {\n offset.current = deltaY;\n onPullProgress(deltaY);\n }\n }\n }\n });\n usePointerEvents(subscribeSensors, onPointerDown, onPointerMove, onPointerUp);\n}\n\nfunction usePreventWheelDefaults({ preventDefaultWheelX, preventDefaultWheelY, }) {\n const ref = React.useRef(null);\n const listener = useEventCallback((event) => {\n const horizontal = Math.abs(event.deltaX) > Math.abs(event.deltaY);\n if ((horizontal && preventDefaultWheelX) || (!horizontal && preventDefaultWheelY) || event.ctrlKey) {\n event.preventDefault();\n }\n });\n return React.useCallback((node) => {\n var _a;\n if (node) {\n node.addEventListener(\"wheel\", listener, { passive: false });\n }\n else {\n (_a = ref.current) === null || _a === void 0 ? void 0 : _a.removeEventListener(\"wheel\", listener);\n }\n ref.current = node;\n }, [listener]);\n}\n\nfunction useWheelSwipe(swipeState, subscribeSensors, isSwipeValid, containerWidth, swipeAnimationDuration, onSwipeStart, onSwipeProgress, onSwipeFinish, onSwipeCancel) {\n const offset = React.useRef(0);\n const intent = React.useRef(0);\n const intentCleanup = React.useRef(undefined);\n const resetCleanup = React.useRef(undefined);\n const wheelInertia = React.useRef(0);\n const wheelInertiaCleanup = React.useRef(undefined);\n const startTime = React.useRef(0);\n const { setTimeout, clearTimeout } = useTimeouts();\n const cancelSwipeIntentCleanup = React.useCallback(() => {\n if (intentCleanup.current) {\n clearTimeout(intentCleanup.current);\n intentCleanup.current = undefined;\n }\n }, [clearTimeout]);\n const cancelSwipeResetCleanup = React.useCallback(() => {\n if (resetCleanup.current) {\n clearTimeout(resetCleanup.current);\n resetCleanup.current = undefined;\n }\n }, [clearTimeout]);\n const handleCleanup = useEventCallback(() => {\n if (swipeState !== SwipeState.SWIPE) {\n offset.current = 0;\n startTime.current = 0;\n cancelSwipeIntentCleanup();\n cancelSwipeResetCleanup();\n }\n });\n React.useEffect(handleCleanup, [swipeState, handleCleanup]);\n const handleCancelSwipe = useEventCallback((currentSwipeOffset) => {\n resetCleanup.current = undefined;\n if (offset.current === currentSwipeOffset) {\n onSwipeCancel(offset.current);\n }\n });\n const onWheel = useEventCallback((event) => {\n if (event.ctrlKey) {\n return;\n }\n if (Math.abs(event.deltaY) > Math.abs(event.deltaX)) {\n return;\n }\n const setWheelInertia = (inertia) => {\n wheelInertia.current = inertia;\n clearTimeout(wheelInertiaCleanup.current);\n wheelInertiaCleanup.current =\n inertia > 0\n ? setTimeout(() => {\n wheelInertia.current = 0;\n wheelInertiaCleanup.current = undefined;\n }, 300)\n : undefined;\n };\n if (swipeState === SwipeState.NONE) {\n if (Math.abs(event.deltaX) <= 1.2 * Math.abs(wheelInertia.current)) {\n setWheelInertia(event.deltaX);\n return;\n }\n if (!isSwipeValid(-event.deltaX)) {\n return;\n }\n intent.current += event.deltaX;\n cancelSwipeIntentCleanup();\n if (Math.abs(intent.current) > 30) {\n intent.current = 0;\n setWheelInertia(0);\n startTime.current = Date.now();\n onSwipeStart();\n }\n else {\n const currentSwipeIntent = intent.current;\n intentCleanup.current = setTimeout(() => {\n intentCleanup.current = undefined;\n if (currentSwipeIntent === intent.current) {\n intent.current = 0;\n }\n }, swipeAnimationDuration);\n }\n }\n else if (swipeState === SwipeState.SWIPE) {\n let newSwipeOffset = offset.current - event.deltaX;\n newSwipeOffset = Math.min(Math.abs(newSwipeOffset), containerWidth) * Math.sign(newSwipeOffset);\n offset.current = newSwipeOffset;\n onSwipeProgress(newSwipeOffset);\n cancelSwipeResetCleanup();\n if (Math.abs(newSwipeOffset) > 0.2 * containerWidth) {\n setWheelInertia(event.deltaX);\n onSwipeFinish(newSwipeOffset, Date.now() - startTime.current);\n return;\n }\n resetCleanup.current = setTimeout(() => handleCancelSwipe(newSwipeOffset), 2 * swipeAnimationDuration);\n }\n else {\n setWheelInertia(event.deltaX);\n }\n });\n React.useEffect(() => subscribeSensors(EVENT_ON_WHEEL, onWheel), [subscribeSensors, onWheel]);\n}\n\nconst cssContainerPrefix = makeComposePrefix(\"container\");\nconst ControllerContext = React.createContext(null);\nconst useController = makeUseContext(\"useController\", \"ControllerContext\", ControllerContext);\nfunction Controller({ children, ...props }) {\n var _a;\n const { carousel, animation, controller, on, styles, render } = props;\n const { closeOnPullUp, closeOnPullDown, preventDefaultWheelX, preventDefaultWheelY } = controller;\n const [toolbarWidth, setToolbarWidth] = React.useState();\n const state = useLightboxState();\n const dispatch = useLightboxDispatch();\n const [swipeState, setSwipeState] = React.useState(SwipeState.NONE);\n const swipeOffset = React.useRef(0);\n const pullOffset = React.useRef(0);\n const pullOpacity = React.useRef(1);\n const { registerSensors, subscribeSensors } = useSensors();\n const { subscribe, publish } = useEvents();\n const cleanupAnimationIncrement = useDelay();\n const cleanupSwipeOffset = useDelay();\n const cleanupPullOffset = useDelay();\n const { containerRef, setContainerRef, containerRect } = useContainerRect();\n const handleContainerRef = useForkRef(usePreventWheelDefaults({ preventDefaultWheelX, preventDefaultWheelY }), setContainerRef);\n const carouselRef = React.useRef(null);\n const setCarouselRef = useForkRef(carouselRef, undefined);\n const { getOwnerDocument } = useDocumentContext();\n const isRTL = useRTL();\n const rtl = (value) => (isRTL ? -1 : 1) * (typeof value === \"number\" ? value : 1);\n const focus = useEventCallback(() => { var _a; return (_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.focus(); });\n const getLightboxProps = useEventCallback(() => props);\n const getLightboxState = useEventCallback(() => state);\n const prev = React.useCallback((params) => publish(ACTION_PREV, params), [publish]);\n const next = React.useCallback((params) => publish(ACTION_NEXT, params), [publish]);\n const close = React.useCallback(() => publish(ACTION_CLOSE), [publish]);\n const isSwipeValid = (offset) => !(carousel.finite &&\n ((rtl(offset) > 0 && state.currentIndex === 0) ||\n (rtl(offset) < 0 && state.currentIndex === state.slides.length - 1)));\n const setSwipeOffset = (offset) => {\n var _a;\n swipeOffset.current = offset;\n (_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.style.setProperty(cssVar(\"swipe_offset\"), `${Math.round(offset)}px`);\n };\n const setPullOffset = (offset) => {\n var _a, _b;\n pullOffset.current = offset;\n pullOpacity.current = (() => {\n const threshold = 60;\n const minOpacity = 0.5;\n const offsetValue = (() => {\n if (closeOnPullDown && offset > 0)\n return offset;\n if (closeOnPullUp && offset < 0)\n return -offset;\n return 0;\n })();\n return Math.min(Math.max(round(1 - (offsetValue / threshold) * (1 - minOpacity), 2), minOpacity), 1);\n })();\n (_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.style.setProperty(cssVar(\"pull_offset\"), `${Math.round(offset)}px`);\n (_b = containerRef.current) === null || _b === void 0 ? void 0 : _b.style.setProperty(cssVar(\"pull_opacity\"), `${pullOpacity.current}`);\n };\n const { prepareAnimation: preparePullAnimation } = useAnimation(carouselRef, (snapshot, rect, translate) => {\n if (carouselRef.current && containerRect) {\n return {\n keyframes: [\n {\n transform: `translate(0, ${snapshot.rect.y - rect.y + translate.y}px)`,\n opacity: snapshot.opacity,\n },\n { transform: \"translate(0, 0)\", opacity: 1 },\n ],\n duration: snapshot.duration,\n easing: animation.easing.fade,\n };\n }\n return undefined;\n });\n const pull = (offset, cancel) => {\n if (closeOnPullUp || closeOnPullDown) {\n setPullOffset(offset);\n let duration = 0;\n if (carouselRef.current) {\n duration = animation.fade * (cancel ? 2 : 1);\n preparePullAnimation({\n rect: carouselRef.current.getBoundingClientRect(),\n opacity: pullOpacity.current,\n duration,\n });\n }\n cleanupPullOffset(() => {\n setPullOffset(0);\n setSwipeState(SwipeState.NONE);\n }, duration);\n setSwipeState(SwipeState.ANIMATION);\n if (!cancel) {\n close();\n }\n }\n };\n const { prepareAnimation, isAnimationPlaying } = useAnimation(carouselRef, (snapshot, rect, translate) => {\n var _a;\n if (carouselRef.current && containerRect && ((_a = state.animation) === null || _a === void 0 ? void 0 : _a.duration)) {\n const parsedSpacing = parseLengthPercentage(carousel.spacing);\n const spacingValue = (parsedSpacing.percent ? (parsedSpacing.percent * containerRect.width) / 100 : parsedSpacing.pixel) || 0;\n return {\n keyframes: [\n {\n transform: `translate(${rtl(state.globalIndex - snapshot.index) * (containerRect.width + spacingValue) +\n snapshot.rect.x -\n rect.x +\n translate.x}px, 0)`,\n },\n { transform: \"translate(0, 0)\" },\n ],\n duration: state.animation.duration,\n easing: state.animation.easing,\n };\n }\n return undefined;\n });\n const swipe = useEventCallback((action) => {\n var _a, _b;\n const currentSwipeOffset = action.offset || 0;\n const swipeDuration = !currentSwipeOffset ? ((_a = animation.navigation) !== null && _a !== void 0 ? _a : animation.swipe) : animation.swipe;\n const swipeEasing = !currentSwipeOffset && !isAnimationPlaying() ? animation.easing.navigation : animation.easing.swipe;\n let { direction } = action;\n const count = (_b = action.count) !== null && _b !== void 0 ? _b : 1;\n let newSwipeState = SwipeState.ANIMATION;\n let newSwipeAnimationDuration = swipeDuration * count;\n if (!direction) {\n const containerWidth = containerRect === null || containerRect === void 0 ? void 0 : containerRect.width;\n const elapsedTime = action.duration || 0;\n const expectedTime = containerWidth\n ? (swipeDuration / containerWidth) * Math.abs(currentSwipeOffset)\n : swipeDuration;\n if (count !== 0) {\n if (elapsedTime < expectedTime) {\n newSwipeAnimationDuration =\n (newSwipeAnimationDuration / expectedTime) * Math.max(elapsedTime, expectedTime / 5);\n }\n else if (containerWidth) {\n newSwipeAnimationDuration =\n (swipeDuration / containerWidth) * (containerWidth - Math.abs(currentSwipeOffset));\n }\n direction = rtl(currentSwipeOffset) > 0 ? ACTION_PREV : ACTION_NEXT;\n }\n else {\n newSwipeAnimationDuration = swipeDuration / 2;\n }\n }\n let increment = 0;\n if (direction === ACTION_PREV) {\n if (isSwipeValid(rtl(1))) {\n increment = -count;\n }\n else {\n newSwipeState = SwipeState.NONE;\n newSwipeAnimationDuration = swipeDuration;\n }\n }\n else if (direction === ACTION_NEXT) {\n if (isSwipeValid(rtl(-1))) {\n increment = count;\n }\n else {\n newSwipeState = SwipeState.NONE;\n newSwipeAnimationDuration = swipeDuration;\n }\n }\n newSwipeAnimationDuration = Math.round(newSwipeAnimationDuration);\n cleanupSwipeOffset(() => {\n setSwipeOffset(0);\n setSwipeState(SwipeState.NONE);\n }, newSwipeAnimationDuration);\n if (carouselRef.current) {\n prepareAnimation({\n rect: carouselRef.current.getBoundingClientRect(),\n index: state.globalIndex,\n });\n }\n setSwipeState(newSwipeState);\n publish(ACTION_SWIPE, {\n type: \"swipe\",\n increment,\n duration: newSwipeAnimationDuration,\n easing: swipeEasing,\n });\n });\n React.useEffect(() => {\n var _a, _b;\n if (((_a = state.animation) === null || _a === void 0 ? void 0 : _a.increment) && ((_b = state.animation) === null || _b === void 0 ? void 0 : _b.duration)) {\n cleanupAnimationIncrement(() => dispatch({ type: \"swipe\", increment: 0 }), state.animation.duration);\n }\n }, [state.animation, dispatch, cleanupAnimationIncrement]);\n const swipeParams = [\n subscribeSensors,\n isSwipeValid,\n (containerRect === null || containerRect === void 0 ? void 0 : containerRect.width) || 0,\n animation.swipe,\n () => setSwipeState(SwipeState.SWIPE),\n (offset) => setSwipeOffset(offset),\n (offset, duration) => swipe({ offset, duration, count: 1 }),\n (offset) => swipe({ offset, count: 0 }),\n ];\n const pullParams = [\n () => {\n if (closeOnPullDown) {\n setSwipeState(SwipeState.PULL);\n }\n },\n (offset) => setPullOffset(offset),\n (offset) => pull(offset),\n (offset) => pull(offset, true),\n ];\n usePointerSwipe(controller, ...swipeParams, closeOnPullUp, closeOnPullDown, ...pullParams, close);\n useWheelSwipe(swipeState, ...swipeParams);\n const focusOnMount = useEventCallback(() => {\n if (controller.focus &&\n getOwnerDocument().querySelector(`.${cssClass(MODULE_PORTAL)} .${cssClass(cssContainerPrefix())}`)) {\n focus();\n }\n });\n React.useEffect(focusOnMount, [focusOnMount]);\n const onViewCallback = useEventCallback(() => {\n var _a;\n (_a = on.view) === null || _a === void 0 ? void 0 : _a.call(on, { index: state.currentIndex });\n });\n React.useEffect(onViewCallback, [state.globalIndex, onViewCallback]);\n React.useEffect(() => cleanup(subscribe(ACTION_PREV, (action) => swipe({ direction: ACTION_PREV, ...action })), subscribe(ACTION_NEXT, (action) => swipe({ direction: ACTION_NEXT, ...action })), subscribe(ACTION_SWIPE, (action) => dispatch(action))), [subscribe, swipe, dispatch]);\n const context = React.useMemo(() => ({\n prev,\n next,\n close,\n focus,\n slideRect: containerRect ? computeSlideRect(containerRect, carousel.padding) : { width: 0, height: 0 },\n containerRect: containerRect || { width: 0, height: 0 },\n subscribeSensors,\n containerRef,\n setCarouselRef,\n toolbarWidth,\n setToolbarWidth,\n }), [\n prev,\n next,\n close,\n focus,\n subscribeSensors,\n containerRect,\n containerRef,\n setCarouselRef,\n toolbarWidth,\n setToolbarWidth,\n carousel.padding,\n ]);\n React.useImperativeHandle(controller.ref, () => ({\n prev,\n next,\n close,\n focus,\n getLightboxProps,\n getLightboxState,\n }), [prev, next, close, focus, getLightboxProps, getLightboxState]);\n return (React.createElement(\"div\", { ref: handleContainerRef, className: clsx(cssClass(cssContainerPrefix()), cssClass(CLASS_FLEX_CENTER)), style: {\n ...(swipeState === SwipeState.SWIPE\n ? { [cssVar(\"swipe_offset\")]: `${Math.round(swipeOffset.current)}px` }\n : null),\n ...(swipeState === SwipeState.PULL\n ? {\n [cssVar(\"pull_offset\")]: `${Math.round(pullOffset.current)}px`,\n [cssVar(\"pull_opacity\")]: `${pullOpacity.current}`,\n }\n : null),\n ...(controller.touchAction !== \"none\" ? { [cssVar(\"controller_touch_action\")]: controller.touchAction } : null),\n ...styles.container,\n }, tabIndex: -1, ...registerSensors }, containerRect && (React.createElement(ControllerContext.Provider, { value: context },\n children, (_a = render.controls) === null || _a === void 0 ? void 0 :\n _a.call(render)))));\n}\nconst ControllerModule = createModule(MODULE_CONTROLLER, Controller);\n\nfunction cssPrefix$2(value) {\n return composePrefix(MODULE_CAROUSEL, value);\n}\nfunction cssSlidePrefix(value) {\n return composePrefix(CLASS_SLIDE, value);\n}\nfunction CarouselSlide({ slide, offset }) {\n const containerRef = React.useRef(null);\n const { currentIndex, slides } = useLightboxState();\n const { slideRect, focus } = useController();\n const { render, carousel: { imageFit, imageProps }, on: { click: onClick }, styles: { slide: style }, labels, } = useLightboxProps();\n const { getOwnerDocument } = useDocumentContext();\n const offscreen = offset !== 0;\n React.useEffect(() => {\n var _a;\n if (offscreen && ((_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.contains(getOwnerDocument().activeElement))) {\n focus();\n }\n }, [offscreen, focus, getOwnerDocument]);\n const renderSlide = () => {\n var _a, _b, _c, _d;\n let rendered = (_a = render.slide) === null || _a === void 0 ? void 0 : _a.call(render, { slide, offset, rect: slideRect });\n if (!rendered && isImageSlide(slide)) {\n rendered = (React.createElement(ImageSlide, { slide: slide, offset: offset, render: render, rect: slideRect, imageFit: imageFit, imageProps: imageProps, onClick: !offscreen ? () => onClick === null || onClick === void 0 ? void 0 : onClick({ index: currentIndex }) : undefined }));\n }\n return rendered ? (React.createElement(React.Fragment, null, (_b = render.slideHeader) === null || _b === void 0 ? void 0 :\n _b.call(render, { slide }),\n ((_c = render.slideContainer) !== null && _c !== void 0 ? _c : (({ children }) => children))({ slide, children: rendered }), (_d = render.slideFooter) === null || _d === void 0 ? void 0 :\n _d.call(render, { slide }))) : null;\n };\n return (React.createElement(\"div\", { ref: containerRef, className: clsx(cssClass(cssSlidePrefix()), !offscreen && cssClass(cssSlidePrefix(\"current\")), cssClass(CLASS_FLEX_CENTER)), ...makeInertWhen(offscreen), style: style, role: \"group\", \"aria-roledescription\": translateLabel(labels, \"Slide\"), \"aria-label\": translateSlideCounter(labels, slides, currentIndex + offset) }, renderSlide()));\n}\nfunction Placeholder() {\n const style = useLightboxProps().styles.slide;\n return React.createElement(\"div\", { className: cssClass(CLASS_SLIDE), style: style });\n}\nfunction Carousel({ carousel, labels }) {\n const { slides, currentIndex, globalIndex } = useLightboxState();\n const { setCarouselRef } = useController();\n const { autoPlaying, focusWithin } = useA11yContext();\n const spacingValue = parseLengthPercentage(carousel.spacing);\n const paddingValue = parseLengthPercentage(carousel.padding);\n const preload = calculatePreload(carousel, slides, 1);\n const items = [];\n if (hasSlides(slides)) {\n for (let index = currentIndex - preload; index <= currentIndex + preload; index += 1) {\n const slide = getSlide(slides, index);\n const key = globalIndex - currentIndex + index;\n const placeholder = carousel.finite && (index < 0 || index > slides.length - 1);\n items.push(!placeholder\n ? {\n key: [`${key}`, getSlideKey(slide)].filter(Boolean).join(\"|\"),\n offset: index - currentIndex,\n slide,\n }\n : { key });\n }\n }\n return (React.createElement(\"div\", { ref: setCarouselRef, className: clsx(cssClass(cssPrefix$2()), items.length > 0 && cssClass(cssPrefix$2(\"with_slides\"))), style: {\n [`${cssVar(cssPrefix$2(\"slides_count\"))}`]: items.length,\n [`${cssVar(cssPrefix$2(\"spacing_px\"))}`]: spacingValue.pixel || 0,\n [`${cssVar(cssPrefix$2(\"spacing_percent\"))}`]: spacingValue.percent || 0,\n [`${cssVar(cssPrefix$2(\"padding_px\"))}`]: paddingValue.pixel || 0,\n [`${cssVar(cssPrefix$2(\"padding_percent\"))}`]: paddingValue.percent || 0,\n }, role: \"region\", \"aria-live\": autoPlaying && !focusWithin ? \"off\" : \"polite\", \"aria-roledescription\": translateLabel(labels, \"Carousel\"), \"aria-label\": translateLabel(labels, \"Photo gallery\") }, items.map(({ key, slide, offset }) => slide ? React.createElement(CarouselSlide, { key: key, slide: slide, offset: offset }) : React.createElement(Placeholder, { key: key }))));\n}\nconst CarouselModule = createModule(MODULE_CAROUSEL, Carousel);\n\nfunction useNavigationState() {\n const { carousel } = useLightboxProps();\n const { slides, currentIndex } = useLightboxState();\n const prevDisabled = slides.length === 0 || (carousel.finite && currentIndex === 0);\n const nextDisabled = slides.length === 0 || (carousel.finite && currentIndex === slides.length - 1);\n return { prevDisabled, nextDisabled };\n}\n\nfunction useKeyboardNavigation(subscribeSensors) {\n var _a;\n const isRTL = useRTL();\n const { publish } = useEvents();\n const { animation } = useLightboxProps();\n const { prevDisabled, nextDisabled } = useNavigationState();\n const throttle = ((_a = animation.navigation) !== null && _a !== void 0 ? _a : animation.swipe) / 2;\n const prev = useThrottle(() => publish(ACTION_PREV), throttle);\n const next = useThrottle(() => publish(ACTION_NEXT), throttle);\n const handleKeyDown = useEventCallback((event) => {\n switch (event.key) {\n case VK_ESCAPE:\n publish(ACTION_CLOSE);\n break;\n case VK_ARROW_LEFT:\n if (!(isRTL ? nextDisabled : prevDisabled))\n (isRTL ? next : prev)();\n break;\n case VK_ARROW_RIGHT:\n if (!(isRTL ? prevDisabled : nextDisabled))\n (isRTL ? prev : next)();\n break;\n default:\n }\n });\n React.useEffect(() => subscribeSensors(EVENT_ON_KEY_DOWN, handleKeyDown), [subscribeSensors, handleKeyDown]);\n}\n\nfunction NavigationButton({ label, icon, renderIcon, action, onClick, disabled, style }) {\n return (React.createElement(IconButton, { label: label, icon: icon, renderIcon: renderIcon, className: cssClass(`navigation_${action}`), disabled: disabled, onClick: onClick, style: style, ...useLoseFocus(useController().focus, disabled) }));\n}\nfunction Navigation({ render: { buttonPrev, buttonNext, iconPrev, iconNext }, styles }) {\n const { prev, next, subscribeSensors } = useController();\n const { prevDisabled, nextDisabled } = useNavigationState();\n useKeyboardNavigation(subscribeSensors);\n return (React.createElement(React.Fragment, null,\n buttonPrev ? (buttonPrev()) : (React.createElement(NavigationButton, { label: \"Previous\", action: ACTION_PREV, icon: PreviousIcon, renderIcon: iconPrev, style: styles.navigationPrev, disabled: prevDisabled, onClick: prev })),\n buttonNext ? (buttonNext()) : (React.createElement(NavigationButton, { label: \"Next\", action: ACTION_NEXT, icon: NextIcon, renderIcon: iconNext, style: styles.navigationNext, disabled: nextDisabled, onClick: next }))));\n}\nconst NavigationModule = createModule(MODULE_NAVIGATION, Navigation);\n\nconst noScroll = cssClass(CLASS_NO_SCROLL);\nconst noScrollPadding = cssClass(CLASS_NO_SCROLL_PADDING);\nfunction isHTMLElement(element) {\n return \"style\" in element;\n}\nfunction padScrollbar(element, padding, rtl) {\n const styles = window.getComputedStyle(element);\n const property = rtl ? \"padding-left\" : \"padding-right\";\n const computedValue = rtl ? styles.paddingLeft : styles.paddingRight;\n const originalValue = element.style.getPropertyValue(property);\n element.style.setProperty(property, `${(parseInt(computedValue) || 0) + padding}px`);\n return () => {\n if (originalValue) {\n element.style.setProperty(property, originalValue);\n }\n else {\n element.style.removeProperty(property);\n }\n };\n}\nfunction NoScroll({ noScroll: { disabled }, children }) {\n const rtl = useRTL();\n const { getOwnerDocument, getOwnerWindow } = useDocumentContext();\n React.useEffect(() => {\n if (disabled)\n return () => { };\n const cleanup = [];\n const ownerWindow = getOwnerWindow();\n const { body, documentElement } = getOwnerDocument();\n const scrollbar = Math.round(ownerWindow.innerWidth - documentElement.clientWidth);\n if (scrollbar > 0) {\n cleanup.push(padScrollbar(body, scrollbar, rtl));\n const elements = body.getElementsByTagName(\"*\");\n for (let i = 0; i < elements.length; i += 1) {\n const element = elements[i];\n if (isHTMLElement(element) &&\n ownerWindow.getComputedStyle(element).getPropertyValue(\"position\") === \"fixed\" &&\n !element.classList.contains(noScrollPadding)) {\n cleanup.push(padScrollbar(element, scrollbar, rtl));\n }\n }\n }\n body.classList.add(noScroll);\n return () => {\n body.classList.remove(noScroll);\n cleanup.forEach((clean) => clean());\n };\n }, [rtl, disabled, getOwnerDocument, getOwnerWindow]);\n return React.createElement(React.Fragment, null, children);\n}\nconst NoScrollModule = createModule(MODULE_NO_SCROLL, NoScroll);\n\nfunction cssPrefix$1(value) {\n return composePrefix(MODULE_PORTAL, value);\n}\nfunction setAttribute(element, attribute, value) {\n const previousValue = element.getAttribute(attribute);\n element.setAttribute(attribute, value);\n return () => {\n if (previousValue) {\n element.setAttribute(attribute, previousValue);\n }\n else {\n element.removeAttribute(attribute);\n }\n };\n}\nfunction Portal({ children, animation, styles, className, on, portal, close, labels }) {\n const [mounted, setMounted] = React.useState(false);\n const [visible, setVisible] = React.useState(false);\n const cleanup = React.useRef([]);\n const restoreFocus = React.useRef(null);\n const { setTimeout } = useTimeouts();\n const { subscribe } = useEvents();\n const reduceMotion = useMotionPreference();\n const animationDuration = !reduceMotion ? animation.fade : 0;\n React.useEffect(() => {\n setMounted(true);\n return () => {\n setMounted(false);\n setVisible(false);\n };\n }, []);\n const handleCleanup = useEventCallback(() => {\n cleanup.current.forEach((clean) => clean());\n cleanup.current = [];\n });\n const handleClose = useEventCallback(() => {\n var _a;\n setVisible(false);\n handleCleanup();\n (_a = on.exiting) === null || _a === void 0 ? void 0 : _a.call(on);\n setTimeout(() => {\n var _a;\n (_a = on.exited) === null || _a === void 0 ? void 0 : _a.call(on);\n close();\n }, animationDuration);\n });\n React.useEffect(() => subscribe(ACTION_CLOSE, handleClose), [subscribe, handleClose]);\n const handleEnter = useEventCallback((node) => {\n var _a, _b, _c;\n reflow(node);\n setVisible(true);\n (_a = on.entering) === null || _a === void 0 ? void 0 : _a.call(on);\n const elements = (_c = (_b = node.parentNode) === null || _b === void 0 ? void 0 : _b.children) !== null && _c !== void 0 ? _c : [];\n for (let i = 0; i < elements.length; i += 1) {\n const element = elements[i];\n if ([\"TEMPLATE\", \"SCRIPT\", \"STYLE\"].indexOf(element.tagName) === -1 && element !== node) {\n cleanup.current.push(setAttribute(element, \"inert\", \"\"));\n cleanup.current.push(setAttribute(element, \"aria-hidden\", \"true\"));\n }\n }\n cleanup.current.push(() => {\n var _a, _b;\n (_b = (_a = restoreFocus.current) === null || _a === void 0 ? void 0 : _a.focus) === null || _b === void 0 ? void 0 : _b.call(_a);\n });\n setTimeout(() => {\n var _a;\n (_a = on.entered) === null || _a === void 0 ? void 0 : _a.call(on);\n }, animationDuration);\n });\n const handleRef = React.useCallback((node) => {\n if (node) {\n handleEnter(node);\n }\n else {\n handleCleanup();\n }\n }, [handleEnter, handleCleanup]);\n return mounted\n ? createPortal(React.createElement(LightboxRoot, { ref: handleRef, className: clsx(className, cssClass(cssPrefix$1()), cssClass(CLASS_NO_SCROLL_PADDING), visible && cssClass(cssPrefix$1(\"open\"))), \"aria-modal\": true, role: \"dialog\", \"aria-label\": translateLabel(labels, \"Lightbox\"), style: {\n ...(animation.fade !== LightboxDefaultProps.animation.fade\n ? { [cssVar(\"fade_animation_duration\")]: `${animationDuration}ms` }\n : null),\n ...(animation.easing.fade !== LightboxDefaultProps.animation.easing.fade\n ? { [cssVar(\"fade_animation_timing_function\")]: animation.easing.fade }\n : null),\n ...styles.root,\n }, onFocus: (event) => {\n if (!restoreFocus.current) {\n restoreFocus.current = event.relatedTarget;\n }\n } }, children), portal.root || document.body)\n : null;\n}\nconst PortalModule = createModule(MODULE_PORTAL, Portal);\n\nfunction Root({ children }) {\n return React.createElement(React.Fragment, null, children);\n}\nconst RootModule = createModule(MODULE_ROOT, Root);\n\nfunction cssPrefix(value) {\n return composePrefix(MODULE_TOOLBAR, value);\n}\nfunction Toolbar({ toolbar: { buttons }, render: { buttonClose, iconClose }, styles }) {\n const { close, setToolbarWidth } = useController();\n const { setContainerRef, containerRect } = useContainerRect();\n useLayoutEffect(() => {\n setToolbarWidth(containerRect === null || containerRect === void 0 ? void 0 : containerRect.width);\n }, [setToolbarWidth, containerRect === null || containerRect === void 0 ? void 0 : containerRect.width]);\n const renderCloseButton = () => {\n if (buttonClose)\n return buttonClose();\n return React.createElement(IconButton, { key: ACTION_CLOSE, label: \"Close\", icon: CloseIcon, renderIcon: iconClose, onClick: close });\n };\n return (React.createElement(\"div\", { ref: setContainerRef, style: styles.toolbar, className: cssClass(cssPrefix()) }, buttons === null || buttons === void 0 ? void 0 : buttons.map((button) => (button === ACTION_CLOSE ? renderCloseButton() : button))));\n}\nconst ToolbarModule = createModule(MODULE_TOOLBAR, Toolbar);\n\nfunction renderNode(node, props) {\n var _a;\n return React.createElement(node.module.component, { key: node.module.name, ...props }, (_a = node.children) === null || _a === void 0 ? void 0 : _a.map((child) => renderNode(child, props)));\n}\nfunction mergeAnimation(defaultAnimation, animation = {}) {\n const { easing: defaultAnimationEasing, ...restDefaultAnimation } = defaultAnimation;\n const { easing, ...restAnimation } = animation;\n return {\n easing: { ...defaultAnimationEasing, ...easing },\n ...restDefaultAnimation,\n ...restAnimation,\n };\n}\nfunction Lightbox({ carousel, animation, render, toolbar, controller, noScroll, on, plugins, slides, index, ...restProps }) {\n const { animation: defaultAnimation, carousel: defaultCarousel, render: defaultRender, toolbar: defaultToolbar, controller: defaultController, noScroll: defaultNoScroll, on: defaultOn, slides: defaultSlides, index: defaultIndex, plugins: defaultPlugins, ...restDefaultProps } = LightboxDefaultProps;\n const { config, augmentation } = withPlugins([\n createNode(PortalModule, [\n createNode(NoScrollModule, [\n createNode(ControllerModule, [\n createNode(CarouselModule),\n createNode(ToolbarModule),\n createNode(NavigationModule),\n ]),\n ]),\n ]),\n ], plugins || defaultPlugins);\n const props = augmentation({\n animation: mergeAnimation(defaultAnimation, animation),\n carousel: { ...defaultCarousel, ...carousel },\n render: { ...defaultRender, ...render },\n toolbar: { ...defaultToolbar, ...toolbar },\n controller: { ...defaultController, ...controller },\n noScroll: { ...defaultNoScroll, ...noScroll },\n on: { ...defaultOn, ...on },\n ...restDefaultProps,\n ...restProps,\n });\n if (!props.open)\n return null;\n return (React.createElement(LightboxPropsProvider, { ...props },\n React.createElement(LightboxStateProvider, { slides: slides || defaultSlides, index: parseInt(index || defaultIndex) },\n React.createElement(TimeoutsProvider, null,\n React.createElement(EventsProvider, null,\n React.createElement(A11yContextProvider, null, renderNode(createNode(RootModule, config), props)))))));\n}\n\nexport { A11yContext, A11yContextProvider, ACTION_CLOSE, ACTION_NEXT, ACTION_PREV, ACTION_SWIPE, CLASS_FLEX_CENTER, CLASS_NO_SCROLL, CLASS_NO_SCROLL_PADDING, CLASS_SLIDE, CLASS_SLIDE_WRAPPER, Carousel, CarouselModule, CloseIcon, Controller, ControllerContext, ControllerModule, DocumentContext, DocumentContextProvider, ELEMENT_BUTTON, ELEMENT_ICON, EVENT_ON_KEY_DOWN, EVENT_ON_KEY_UP, EVENT_ON_POINTER_CANCEL, EVENT_ON_POINTER_DOWN, EVENT_ON_POINTER_LEAVE, EVENT_ON_POINTER_MOVE, EVENT_ON_POINTER_UP, EVENT_ON_WHEEL, ErrorIcon, EventsContext, EventsProvider, IMAGE_FIT_CONTAIN, IMAGE_FIT_COVER, IconButton, ImageSlide, Lightbox, LightboxDefaultProps, LightboxDispatchContext, LightboxPropsContext, LightboxPropsProvider, LightboxRoot, LightboxStateContext, LightboxStateProvider, LoadingIcon, MODULE_CAROUSEL, MODULE_CONTROLLER, MODULE_NAVIGATION, MODULE_NO_SCROLL, MODULE_PORTAL, MODULE_ROOT, MODULE_TOOLBAR, Navigation, NavigationButton, NavigationModule, NextIcon, NoScroll, NoScrollModule, Portal, PortalModule, PreviousIcon, Root, RootModule, SLIDE_STATUS_COMPLETE, SLIDE_STATUS_ERROR, SLIDE_STATUS_LOADING, SLIDE_STATUS_PLACEHOLDER, SwipeState, TimeoutsContext, TimeoutsProvider, Toolbar, ToolbarModule, UNKNOWN_ACTION_TYPE, VK_ARROW_LEFT, VK_ARROW_RIGHT, VK_ESCAPE, activeSlideStatus, addToolbarButton, calculatePreload, cleanup, clsx, composePrefix, computeSlideRect, createIcon, createIconDisabled, createModule, createNode, cssClass, cssVar, Lightbox as default, devicePixelRatio, getSlide, getSlideIfPresent, getSlideIndex, getSlideKey, hasSlides, hasWindow, isImageFitCover, isImageSlide, label, makeComposePrefix, makeInertWhen, makeUseContext, parseInt, parseLengthPercentage, reflow, round, setRef, stopNavigationEventsPropagation, translateLabel, translateSlideCounter, useA11yContext, useAnimation, useContainerRect, useController, useDelay, useDocumentContext, useEventCallback, useEvents, useForkRef, useKeyboardNavigation, useLayoutEffect, useLightboxDispatch, useLightboxProps, useLightboxState, useLoseFocus, useMotionPreference, useNavigationState, usePointerEvents, usePointerSwipe, usePreventWheelDefaults, useRTL, useSensors, useThrottle, useTimeouts, useWheelSwipe, withPlugins };","import * as React from 'react';\nimport { useLightboxProps, useMotionPreference, useEventCallback, useLayoutEffect, useLightboxState, isImageSlide, isImageFitCover, round, useDocumentContext, useController, usePointerEvents, cleanup, makeUseContext, createIcon, IconButton, devicePixelRatio, ImageSlide, clsx, cssClass, addToolbarButton, createModule } from '../../index.js';\nimport { EVENT_ON_KEY_DOWN, EVENT_ON_WHEEL, UNKNOWN_ACTION_TYPE, CLASS_FULLSIZE, CLASS_FLEX_CENTER, CLASS_SLIDE_WRAPPER, CLASS_SLIDE_WRAPPER_INTERACTIVE, PLUGIN_ZOOM } from '../../types.js';\n\nconst defaultZoomProps = {\n minZoom: 1,\n maxZoomPixelRatio: 1,\n zoomInMultiplier: 2,\n doubleTapDelay: 300,\n doubleClickDelay: 500,\n doubleClickMaxStops: 2,\n keyboardMoveDistance: 50,\n wheelZoomDistanceFactor: 100,\n pinchZoomDistanceFactor: 100,\n pinchZoomV4: false,\n scrollToZoom: false,\n};\nfunction validateMinZoom(minZoom) {\n return Math.min(Math.max(minZoom, Number.EPSILON), 1);\n}\nfunction resolveZoomProps(zoom) {\n const { minZoom, ...rest } = { ...defaultZoomProps, ...zoom };\n return { minZoom: validateMinZoom(minZoom), ...rest };\n}\n\nfunction useZoomAnimation(zoom, offsetX, offsetY, zoomWrapperRef) {\n const zoomAnimation = React.useRef(undefined);\n const zoomAnimationStart = React.useRef(undefined);\n const { zoom: zoomAnimationDuration } = useLightboxProps().animation;\n const reduceMotion = useMotionPreference();\n const playZoomAnimation = useEventCallback(() => {\n var _a, _b, _c;\n (_a = zoomAnimation.current) === null || _a === void 0 ? void 0 : _a.cancel();\n zoomAnimation.current = undefined;\n if (zoomAnimationStart.current && (zoomWrapperRef === null || zoomWrapperRef === void 0 ? void 0 : zoomWrapperRef.current)) {\n try {\n zoomAnimation.current = (_c = (_b = zoomWrapperRef.current).animate) === null || _c === void 0 ? void 0 : _c.call(_b, [\n { transform: zoomAnimationStart.current },\n { transform: `scale(${zoom}) translateX(${offsetX}px) translateY(${offsetY}px)` },\n ], {\n duration: !reduceMotion ? (zoomAnimationDuration !== null && zoomAnimationDuration !== void 0 ? zoomAnimationDuration : 500) : 0,\n easing: zoomAnimation.current ? \"ease-out\" : \"ease-in-out\",\n });\n }\n catch (err) {\n console.error(err);\n }\n zoomAnimationStart.current = undefined;\n if (zoomAnimation.current) {\n zoomAnimation.current.onfinish = () => {\n zoomAnimation.current = undefined;\n };\n }\n }\n });\n useLayoutEffect(playZoomAnimation, [zoom, offsetX, offsetY, playZoomAnimation]);\n return React.useCallback(() => {\n zoomAnimationStart.current = (zoomWrapperRef === null || zoomWrapperRef === void 0 ? void 0 : zoomWrapperRef.current)\n ? window.getComputedStyle(zoomWrapperRef.current).transform\n : undefined;\n }, [zoomWrapperRef]);\n}\n\nfunction useZoomCallback(zoom, disabled) {\n const { on } = useLightboxProps();\n const onZoomCallback = useEventCallback(() => {\n var _a;\n if (!disabled) {\n (_a = on.zoom) === null || _a === void 0 ? void 0 : _a.call(on, { zoom });\n }\n });\n React.useEffect(onZoomCallback, [zoom, onZoomCallback]);\n}\n\nfunction useZoomProps() {\n const { zoom } = useLightboxProps();\n return resolveZoomProps(zoom);\n}\n\nfunction useZoomImageRect(slideRect, imageDimensions) {\n var _a, _b;\n let imageRect = { width: 0, height: 0 };\n let maxImageRect = { width: 0, height: 0 };\n const { currentSlide } = useLightboxState();\n const { imageFit } = useLightboxProps().carousel;\n const { maxZoomPixelRatio } = useZoomProps();\n if (slideRect && currentSlide) {\n const slide = { ...currentSlide, ...imageDimensions };\n if (isImageSlide(slide)) {\n const cover = isImageFitCover(slide, imageFit);\n const width = Math.max(...(((_a = slide.srcSet) === null || _a === void 0 ? void 0 : _a.map((x) => x.width)) || []).concat(slide.width ? [slide.width] : []));\n const height = Math.max(...(((_b = slide.srcSet) === null || _b === void 0 ? void 0 : _b.map((x) => x.height)) || []).concat(slide.height ? [slide.height] : []));\n if (width > 0 && height > 0 && slideRect.width > 0 && slideRect.height > 0) {\n maxImageRect = cover\n ? {\n width: Math.round(Math.min(width, (slideRect.width / slideRect.height) * height)),\n height: Math.round(Math.min(height, (slideRect.height / slideRect.width) * width)),\n }\n : { width, height };\n maxImageRect = {\n width: maxImageRect.width * maxZoomPixelRatio,\n height: maxImageRect.height * maxZoomPixelRatio,\n };\n imageRect = cover\n ? {\n width: Math.min(slideRect.width, maxImageRect.width, width),\n height: Math.min(slideRect.height, maxImageRect.height, height),\n }\n : {\n width: Math.round(Math.min(slideRect.width, (slideRect.height / height) * width, width)),\n height: Math.round(Math.min(slideRect.height, (slideRect.width / width) * height, height)),\n };\n }\n }\n }\n const maxZoom = imageRect.width ? Math.max(round(maxImageRect.width / imageRect.width, 5), 1) : 1;\n return { imageRect, maxZoom };\n}\n\nfunction distance(pointerA, pointerB) {\n return Math.hypot(pointerA.clientX - pointerB.clientX, pointerA.clientY - pointerB.clientY);\n}\nfunction scaleZoom(value, delta, factor = 100, clamp = 2) {\n return value * Math.min(1 + Math.abs(delta / factor), clamp) ** Math.sign(delta);\n}\nfunction useZoomSensors(zoom, minZoom, maxZoom, disabled, zoomIn, zoomOut, changeZoom, changeOffsets, zoomWrapperRef) {\n const activePointers = React.useRef([]);\n const lastPointerDown = React.useRef(0);\n const pinchZoom = React.useRef(undefined);\n const { globalIndex } = useLightboxState();\n const { getOwnerWindow } = useDocumentContext();\n const { containerRef, subscribeSensors } = useController();\n const { keyboardMoveDistance, zoomInMultiplier, wheelZoomDistanceFactor, scrollToZoom, doubleTapDelay, doubleClickDelay, doubleClickMaxStops, pinchZoomDistanceFactor, pinchZoomV4, } = useZoomProps();\n const translateCoordinates = React.useCallback((event) => {\n if (containerRef.current) {\n const { pageX, pageY } = event;\n const { scrollX, scrollY } = getOwnerWindow();\n const { left, top, width, height } = containerRef.current.getBoundingClientRect();\n return [pageX - left - scrollX - width / 2, pageY - top - scrollY - height / 2];\n }\n return [];\n }, [containerRef, getOwnerWindow]);\n const onKeyDown = useEventCallback((event) => {\n const { key, metaKey, ctrlKey } = event;\n const meta = metaKey || ctrlKey;\n const preventDefault = () => {\n event.preventDefault();\n event.stopPropagation();\n };\n if (zoom > 1) {\n const move = (deltaX, deltaY) => {\n preventDefault();\n changeOffsets(deltaX, deltaY);\n };\n if (key === \"ArrowDown\") {\n move(0, keyboardMoveDistance);\n }\n else if (key === \"ArrowUp\") {\n move(0, -keyboardMoveDistance);\n }\n else if (key === \"ArrowLeft\") {\n move(-keyboardMoveDistance, 0);\n }\n else if (key === \"ArrowRight\") {\n move(keyboardMoveDistance, 0);\n }\n }\n if (key === \"+\" || (meta && key === \"=\")) {\n preventDefault();\n zoomIn();\n }\n else if (key === \"-\" || (meta && key === \"_\")) {\n preventDefault();\n zoomOut();\n }\n else if (meta && key === \"0\") {\n preventDefault();\n changeZoom(1);\n }\n });\n const onWheel = useEventCallback((event) => {\n if (event.ctrlKey || scrollToZoom) {\n if (Math.abs(event.deltaY) > Math.abs(event.deltaX)) {\n event.stopPropagation();\n changeZoom(scaleZoom(zoom, -event.deltaY, wheelZoomDistanceFactor), true, ...translateCoordinates(event));\n return;\n }\n }\n if (zoom > 1) {\n event.stopPropagation();\n if (!scrollToZoom) {\n changeOffsets(event.deltaX, event.deltaY);\n }\n }\n });\n const clearPointer = React.useCallback((event) => {\n const pointers = activePointers.current;\n pointers.splice(0, pointers.length, ...pointers.filter((p) => p.pointerId !== event.pointerId));\n }, []);\n const replacePointer = React.useCallback((event) => {\n clearPointer(event);\n event.persist();\n activePointers.current.push(event);\n }, [clearPointer]);\n const onPointerDown = useEventCallback((event) => {\n var _a;\n const pointers = activePointers.current;\n if ((event.pointerType === \"mouse\" && event.buttons > 1) ||\n !((_a = zoomWrapperRef === null || zoomWrapperRef === void 0 ? void 0 : zoomWrapperRef.current) === null || _a === void 0 ? void 0 : _a.contains(event.target))) {\n return;\n }\n if (zoom > 1) {\n event.stopPropagation();\n }\n const { timeStamp } = event;\n if (pointers.length === 0 &&\n timeStamp - lastPointerDown.current < (event.pointerType === \"touch\" ? doubleTapDelay : doubleClickDelay)) {\n lastPointerDown.current = 0;\n const targetZoom = zoom >= 1\n ? zoom !== maxZoom\n ? zoom * Math.max(maxZoom ** (1 / doubleClickMaxStops), zoomInMultiplier)\n : 1\n : zoom !== minZoom\n ? zoom / Math.max(minZoom ** (-1 / doubleClickMaxStops), zoomInMultiplier)\n : 1;\n changeZoom(targetZoom, false, ...translateCoordinates(event));\n }\n else {\n lastPointerDown.current = timeStamp;\n }\n replacePointer(event);\n if (pointers.length === 2) {\n const initialDistance = distance(pointers[0], pointers[1]);\n pinchZoom.current = {\n previousDistance: initialDistance,\n initialDistance: Math.max(initialDistance, 1),\n initialZoom: zoom,\n };\n }\n });\n const onPointerMove = useEventCallback((event) => {\n const pointers = activePointers.current;\n const activePointer = pointers.find((p) => p.pointerId === event.pointerId);\n if (pointers.length === 2 && pinchZoom.current) {\n event.stopPropagation();\n replacePointer(event);\n const currentDistance = distance(pointers[0], pointers[1]);\n const targetZoom = pinchZoomV4\n ? (pinchZoom.current.initialZoom / pinchZoom.current.initialDistance) * currentDistance\n : scaleZoom(zoom, currentDistance - pinchZoom.current.previousDistance, pinchZoomDistanceFactor);\n changeZoom(targetZoom, true, ...pointers\n .map((x) => translateCoordinates(x))\n .reduce((acc, coordinate) => coordinate.map((x, i) => acc[i] + x / 2)));\n pinchZoom.current.previousDistance = currentDistance;\n return;\n }\n if (zoom > 1) {\n event.stopPropagation();\n if (activePointer) {\n if (pointers.length === 1) {\n changeOffsets((activePointer.clientX - event.clientX) / zoom, (activePointer.clientY - event.clientY) / zoom);\n }\n replacePointer(event);\n }\n }\n });\n const onPointerUp = React.useCallback((event) => {\n const pointers = activePointers.current;\n if (pointers.length === 2 && pointers.find((p) => p.pointerId === event.pointerId)) {\n pinchZoom.current = undefined;\n }\n clearPointer(event);\n }, [clearPointer]);\n const cleanupSensors = React.useCallback(() => {\n const pointers = activePointers.current;\n pointers.splice(0, pointers.length);\n lastPointerDown.current = 0;\n pinchZoom.current = undefined;\n }, []);\n usePointerEvents(subscribeSensors, onPointerDown, onPointerMove, onPointerUp, disabled);\n React.useEffect(cleanupSensors, [globalIndex, cleanupSensors]);\n React.useEffect(() => {\n if (!disabled) {\n return cleanup(cleanupSensors, subscribeSensors(EVENT_ON_KEY_DOWN, onKeyDown), subscribeSensors(EVENT_ON_WHEEL, onWheel));\n }\n return () => { };\n }, [disabled, subscribeSensors, cleanupSensors, onKeyDown, onWheel]);\n}\n\nfunction useZoomState(imageRect, maxZoom, zoomWrapperRef) {\n const [zoom, setZoom] = React.useState(1);\n const [offsetX, setOffsetX] = React.useState(0);\n const [offsetY, setOffsetY] = React.useState(0);\n const animate = useZoomAnimation(zoom, offsetX, offsetY, zoomWrapperRef);\n const { currentSlide, globalIndex } = useLightboxState();\n const { containerRect, slideRect } = useController();\n const { minZoom, zoomInMultiplier } = useZoomProps();\n const currentSource = currentSlide && isImageSlide(currentSlide) ? currentSlide.src : undefined;\n const disabled = !currentSource || !(zoomWrapperRef === null || zoomWrapperRef === void 0 ? void 0 : zoomWrapperRef.current);\n useLayoutEffect(() => {\n setZoom(1);\n setOffsetX(0);\n setOffsetY(0);\n }, [globalIndex, currentSource]);\n const changeOffsets = React.useCallback((dx, dy, targetZoom) => {\n const newZoom = targetZoom || zoom;\n const newOffsetX = offsetX - (dx || 0);\n const newOffsetY = offsetY - (dy || 0);\n const maxOffsetX = (imageRect.width * newZoom - slideRect.width) / 2 / newZoom;\n const maxOffsetY = (imageRect.height * newZoom - slideRect.height) / 2 / newZoom;\n setOffsetX(Math.min(Math.abs(newOffsetX), Math.max(maxOffsetX, 0)) * Math.sign(newOffsetX));\n setOffsetY(Math.min(Math.abs(newOffsetY), Math.max(maxOffsetY, 0)) * Math.sign(newOffsetY));\n }, [zoom, offsetX, offsetY, slideRect, imageRect.width, imageRect.height]);\n const changeZoom = React.useCallback((targetZoom, rapid, dx, dy) => {\n const newZoom = round(targetZoom + 0.01 < maxZoom ? (targetZoom - 0.01 > minZoom ? targetZoom : minZoom) : maxZoom, 5);\n if (!rapid) {\n animate();\n }\n changeOffsets(dx ? dx * (1 / zoom - 1 / newZoom) : 0, dy ? dy * (1 / zoom - 1 / newZoom) : 0, newZoom);\n setZoom(newZoom);\n }, [zoom, minZoom, maxZoom, changeOffsets, animate]);\n const handleControllerRectChange = useEventCallback(() => {\n if (zoom > 1) {\n if (zoom > maxZoom) {\n changeZoom(maxZoom, true);\n }\n changeOffsets();\n }\n });\n useLayoutEffect(handleControllerRectChange, [containerRect.width, containerRect.height, handleControllerRectChange]);\n const zoomIn = React.useCallback(() => {\n const targetZoom = zoom * zoomInMultiplier;\n changeZoom(zoom < 1 && targetZoom > 1 ? 1 : targetZoom);\n }, [zoom, zoomInMultiplier, changeZoom]);\n const zoomOut = React.useCallback(() => {\n const targetZoom = zoom / zoomInMultiplier;\n changeZoom(zoom > 1 && targetZoom < 1 ? 1 : targetZoom);\n }, [zoom, zoomInMultiplier, changeZoom]);\n return { zoom, offsetX, offsetY, disabled, changeOffsets, changeZoom, zoomIn, zoomOut };\n}\n\nconst ZoomControllerContext = React.createContext(null);\nconst useZoom = makeUseContext(\"useZoom\", \"ZoomControllerContext\", ZoomControllerContext);\nfunction ZoomContextProvider({ children }) {\n const [zoomWrapper, setZoomWrapper] = React.useState();\n const { slideRect } = useController();\n const { ref, minZoom } = useZoomProps();\n const { imageRect, maxZoom } = useZoomImageRect(slideRect, zoomWrapper === null || zoomWrapper === void 0 ? void 0 : zoomWrapper.imageDimensions);\n const { zoom, offsetX, offsetY, disabled, changeZoom, changeOffsets, zoomIn, zoomOut } = useZoomState(imageRect, maxZoom, zoomWrapper === null || zoomWrapper === void 0 ? void 0 : zoomWrapper.zoomWrapperRef);\n useZoomCallback(zoom, disabled);\n useZoomSensors(zoom, minZoom, maxZoom, disabled, zoomIn, zoomOut, changeZoom, changeOffsets, zoomWrapper === null || zoomWrapper === void 0 ? void 0 : zoomWrapper.zoomWrapperRef);\n const zoomRef = React.useMemo(() => ({ zoom, minZoom, maxZoom, offsetX, offsetY, disabled, zoomIn, zoomOut, changeZoom }), [zoom, minZoom, maxZoom, offsetX, offsetY, disabled, zoomIn, zoomOut, changeZoom]);\n React.useImperativeHandle(ref, () => zoomRef, [zoomRef]);\n const context = React.useMemo(() => ({ ...zoomRef, setZoomWrapper }), [zoomRef, setZoomWrapper]);\n return React.createElement(ZoomControllerContext.Provider, { value: context }, children);\n}\n\nconst ZoomInIcon = createIcon(\"ZoomIn\", React.createElement(React.Fragment, null,\n React.createElement(\"path\", { d: \"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\" }),\n React.createElement(\"path\", { d: \"M12 10h-2v2H9v-2H7V9h2V7h1v2h2v1z\" })));\nconst ZoomOutIcon = createIcon(\"ZoomOut\", React.createElement(\"path\", { d: \"M15.5 14h-.79l-.28-.27C15.41 12.59 16 11.11 16 9.5 16 5.91 13.09 3 9.5 3S3 5.91 3 9.5 5.91 16 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14zM7 9h5v1H7z\" }));\nconst ZoomButton = React.forwardRef(function ZoomButton({ zoomIn, onLoseFocus }, ref) {\n const wasEnabled = React.useRef(false);\n const wasFocused = React.useRef(false);\n const { zoom, minZoom, maxZoom, zoomIn: zoomInCallback, zoomOut: zoomOutCallback, disabled: zoomDisabled, } = useZoom();\n const { render } = useLightboxProps();\n const disabled = zoomDisabled || (zoomIn ? zoom >= maxZoom : zoom <= minZoom);\n React.useEffect(() => {\n if (disabled && wasEnabled.current && wasFocused.current) {\n onLoseFocus();\n }\n if (!disabled) {\n wasEnabled.current = true;\n }\n }, [disabled, onLoseFocus]);\n return (React.createElement(IconButton, { ref: ref, disabled: disabled, label: zoomIn ? \"Zoom in\" : \"Zoom out\", icon: zoomIn ? ZoomInIcon : ZoomOutIcon, renderIcon: zoomIn ? render.iconZoomIn : render.iconZoomOut, onClick: zoomIn ? zoomInCallback : zoomOutCallback, onFocus: () => {\n wasFocused.current = true;\n }, onBlur: () => {\n wasFocused.current = false;\n } }));\n});\n\nfunction ZoomButtonsGroup() {\n const zoomInRef = React.useRef(null);\n const zoomOutRef = React.useRef(null);\n const { focus } = useController();\n const focusSibling = React.useCallback((sibling) => {\n var _a, _b;\n if (!((_a = sibling.current) === null || _a === void 0 ? void 0 : _a.disabled)) {\n (_b = sibling.current) === null || _b === void 0 ? void 0 : _b.focus();\n }\n else {\n focus();\n }\n }, [focus]);\n const focusZoomIn = React.useCallback(() => focusSibling(zoomInRef), [focusSibling]);\n const focusZoomOut = React.useCallback(() => focusSibling(zoomOutRef), [focusSibling]);\n return (React.createElement(React.Fragment, null,\n React.createElement(ZoomButton, { zoomIn: true, ref: zoomInRef, onLoseFocus: focusZoomOut }),\n React.createElement(ZoomButton, { ref: zoomOutRef, onLoseFocus: focusZoomIn })));\n}\n\nfunction ZoomToolbarControl() {\n const { render } = useLightboxProps();\n const zoomRef = useZoom();\n if (render.buttonZoom) {\n return React.createElement(React.Fragment, null, render.buttonZoom(zoomRef));\n }\n return React.createElement(ZoomButtonsGroup, null);\n}\n\nfunction isResponsiveImageSlide(slide) {\n var _a;\n return (((_a = slide.srcSet) === null || _a === void 0 ? void 0 : _a.length) || 0) > 0;\n}\nfunction reducer({ current, preload }, { type, source }) {\n switch (type) {\n case \"fetch\":\n if (!current) {\n return { current: source };\n }\n return { current, preload: source };\n case \"done\":\n if (source === preload) {\n return { current: source };\n }\n return { current, preload };\n default:\n throw new Error(UNKNOWN_ACTION_TYPE);\n }\n}\nfunction ResponsiveImage(props) {\n var _a, _b;\n const [{ current, preload }, dispatch] = React.useReducer(reducer, {});\n const { slide: image, rect, imageFit, render, interactive } = props;\n const srcSet = image.srcSet.sort((a, b) => a.width - b.width);\n const width = (_a = image.width) !== null && _a !== void 0 ? _a : srcSet[srcSet.length - 1].width;\n const height = (_b = image.height) !== null && _b !== void 0 ? _b : srcSet[srcSet.length - 1].height;\n const cover = isImageFitCover(image, imageFit);\n const maxWidth = Math.max(...srcSet.map((x) => x.width));\n const targetWidth = Math.min((cover ? Math.max : Math.min)(rect.width, width * (rect.height / height)), maxWidth);\n const pixelDensity = devicePixelRatio();\n const handleResize = useEventCallback(() => {\n var _a;\n const targetSource = (_a = srcSet.find((x) => x.width >= targetWidth * pixelDensity)) !== null && _a !== void 0 ? _a : srcSet[srcSet.length - 1];\n if (!current || srcSet.findIndex((x) => x.src === current) < srcSet.findIndex((x) => x === targetSource)) {\n dispatch({ type: \"fetch\", source: targetSource.src });\n }\n });\n useLayoutEffect(handleResize, [rect.width, rect.height, pixelDensity, handleResize]);\n const handlePreload = useEventCallback((currentPreload) => dispatch({ type: \"done\", source: currentPreload }));\n const style = {\n WebkitTransform: !interactive ? \"translateZ(0)\" : \"initial\",\n };\n if (!cover) {\n Object.assign(style, rect.width / rect.height < width / height ? { width: \"100%\", height: \"auto\" } : { width: \"auto\", height: \"100%\" });\n }\n return (React.createElement(React.Fragment, null,\n preload && preload !== current && (React.createElement(ImageSlide, { key: \"preload\", ...props, offset: undefined, slide: { ...image, src: preload, srcSet: undefined }, style: { position: \"absolute\", visibility: \"hidden\", ...style }, onLoad: () => handlePreload(preload), render: {\n ...render,\n iconLoading: () => null,\n iconError: () => null,\n } })),\n current && (React.createElement(ImageSlide, { key: \"current\", ...props, slide: { ...image, src: current, srcSet: undefined }, style: style }))));\n}\n\nfunction ZoomWrapper({ render, slide, offset, rect }) {\n var _a;\n const [imageDimensions, setImageDimensions] = React.useState();\n const zoomWrapperRef = React.useRef(null);\n const { zoom, maxZoom, offsetX, offsetY, setZoomWrapper } = useZoom();\n const interactive = zoom > 1;\n const { carousel, on } = useLightboxProps();\n const { currentIndex } = useLightboxState();\n useLayoutEffect(() => {\n if (offset === 0) {\n setZoomWrapper({ zoomWrapperRef, imageDimensions });\n return () => setZoomWrapper(undefined);\n }\n return () => { };\n }, [offset, imageDimensions, setZoomWrapper]);\n let rendered = (_a = render.slide) === null || _a === void 0 ? void 0 : _a.call(render, { slide, offset, rect, zoom, maxZoom });\n if (!rendered && isImageSlide(slide)) {\n const slideProps = {\n slide,\n offset,\n rect,\n render,\n imageFit: carousel.imageFit,\n imageProps: carousel.imageProps,\n onClick: offset === 0 ? () => { var _a; return (_a = on.click) === null || _a === void 0 ? void 0 : _a.call(on, { index: currentIndex }); } : undefined,\n };\n rendered = isResponsiveImageSlide(slide) ? (React.createElement(ResponsiveImage, { ...slideProps, slide: slide, interactive: interactive, rect: offset === 0 ? { width: rect.width * zoom, height: rect.height * zoom } : rect })) : (React.createElement(ImageSlide, { onLoad: (img) => setImageDimensions({ width: img.naturalWidth, height: img.naturalHeight }), ...slideProps }));\n }\n if (!rendered)\n return null;\n return (React.createElement(\"div\", { ref: zoomWrapperRef, className: clsx(cssClass(CLASS_FULLSIZE), cssClass(CLASS_FLEX_CENTER), cssClass(CLASS_SLIDE_WRAPPER), interactive && cssClass(CLASS_SLIDE_WRAPPER_INTERACTIVE)), style: offset === 0 ? { transform: `scale(${zoom}) translateX(${offsetX}px) translateY(${offsetY}px)` } : undefined }, rendered));\n}\n\nconst Zoom = ({ augment, addModule }) => {\n augment(({ zoom: zoomProps, toolbar, render, controller, ...restProps }) => {\n const zoom = resolveZoomProps(zoomProps);\n return {\n zoom,\n toolbar: addToolbarButton(toolbar, PLUGIN_ZOOM, React.createElement(ZoomToolbarControl, null)),\n render: {\n ...render,\n slide: (props) => { var _a; return isImageSlide(props.slide) ? React.createElement(ZoomWrapper, { render: render, ...props }) : (_a = render.slide) === null || _a === void 0 ? void 0 : _a.call(render, props); },\n },\n controller: { ...controller, preventDefaultWheelY: zoom.scrollToZoom },\n ...restProps,\n };\n });\n addModule(createModule(PLUGIN_ZOOM, ZoomContextProvider));\n};\n\nexport { Zoom as default };\n","import * as React from 'react';\nimport { useLightboxState, clsx, cssClass, createModule } from '../../index.js';\nimport { MODULE_CONTROLLER, PLUGIN_COUNTER } from '../../types.js';\n\nconst defaultCounterProps = {\n separator: \"/\",\n container: {},\n};\nconst resolveCounterProps = (counter) => ({\n ...defaultCounterProps,\n ...counter,\n});\n\nfunction CounterComponent({ counter }) {\n const { slides, currentIndex } = useLightboxState();\n const { separator, container: { className, ...rest }, className: legacyClassName, ...legacyRest } = resolveCounterProps(counter);\n if (slides.length === 0)\n return null;\n return (React.createElement(\"div\", { className: clsx(cssClass(\"counter\"), className || legacyClassName), ...legacyRest, ...rest, \"aria-hidden\": true },\n currentIndex + 1,\n \" \",\n separator,\n \" \",\n slides.length));\n}\nfunction Counter({ augment, addChild }) {\n augment(({ counter, ...restProps }) => ({\n counter: resolveCounterProps(counter),\n ...restProps,\n }));\n addChild(MODULE_CONTROLLER, createModule(PLUGIN_COUNTER, CounterComponent));\n}\n\nexport { Counter as default };\n","import * as React from 'react';\nimport { makeUseContext, useLightboxState, useTimeouts, useEvents, useController, useA11yContext, useEventCallback, cleanup, createIcon, useLightboxProps, useLoseFocus, IconButton, addToolbarButton, createModule } from '../../index.js';\nimport { SLIDE_STATUS_LOADING, SLIDE_STATUS_PLAYING, ACTIVE_SLIDE_LOADING, ACTIVE_SLIDE_PLAYING, ACTIVE_SLIDE_ERROR, SLIDE_STATUS_ERROR, ACTIVE_SLIDE_COMPLETE, SLIDE_STATUS_COMPLETE, PLUGIN_SLIDESHOW } from '../../types.js';\n\nconst defaultSlideshowProps = {\n autoplay: false,\n delay: 3000,\n ref: null,\n};\nconst resolveSlideshowProps = (slideshow) => ({\n ...defaultSlideshowProps,\n ...slideshow,\n});\n\nconst SlideshowContext = React.createContext(null);\nconst useSlideshow = makeUseContext(\"useSlideshow\", \"SlideshowContext\", SlideshowContext);\nfunction SlideshowContextProvider({ slideshow, carousel: { finite }, on, children }) {\n const { autoplay, delay, ref } = resolveSlideshowProps(slideshow);\n const wasPlaying = React.useRef(autoplay);\n const [playing, setPlaying] = React.useState(autoplay);\n const scheduler = React.useRef(undefined);\n const slideStatus = React.useRef(undefined);\n const { slides, currentIndex } = useLightboxState();\n const { setTimeout, clearTimeout } = useTimeouts();\n const { subscribe } = useEvents();\n const { next } = useController();\n const { setAutoPlaying } = useA11yContext();\n React.useEffect(() => setAutoPlaying(playing), [playing, setAutoPlaying]);\n const disabled = slides.length === 0 || (finite && currentIndex === slides.length - 1);\n const play = React.useCallback(() => {\n if (!playing && !disabled) {\n setPlaying(true);\n }\n }, [playing, disabled]);\n const pause = React.useCallback(() => {\n if (playing) {\n setPlaying(false);\n }\n }, [playing]);\n const cancelScheduler = React.useCallback(() => {\n clearTimeout(scheduler.current);\n scheduler.current = undefined;\n }, [clearTimeout]);\n const scheduleNextSlide = useEventCallback(() => {\n cancelScheduler();\n if (!playing ||\n disabled ||\n slideStatus.current === SLIDE_STATUS_LOADING ||\n slideStatus.current === SLIDE_STATUS_PLAYING) {\n return;\n }\n scheduler.current = setTimeout(() => {\n if (playing) {\n slideStatus.current = undefined;\n next();\n }\n }, delay);\n });\n React.useEffect(scheduleNextSlide, [currentIndex, playing, scheduleNextSlide]);\n React.useEffect(() => {\n if (playing && disabled) {\n setPlaying(false);\n }\n }, [currentIndex, playing, disabled]);\n const onSlideshowStart = useEventCallback(() => { var _a; return (_a = on.slideshowStart) === null || _a === void 0 ? void 0 : _a.call(on); });\n const onSlideshowStop = useEventCallback(() => { var _a; return (_a = on.slideshowStop) === null || _a === void 0 ? void 0 : _a.call(on); });\n React.useEffect(() => {\n if (playing) {\n onSlideshowStart();\n }\n else if (wasPlaying.current) {\n onSlideshowStop();\n }\n wasPlaying.current = playing;\n }, [playing, onSlideshowStart, onSlideshowStop]);\n React.useEffect(() => cleanup(cancelScheduler, subscribe(ACTIVE_SLIDE_LOADING, () => {\n slideStatus.current = SLIDE_STATUS_LOADING;\n cancelScheduler();\n }), subscribe(ACTIVE_SLIDE_PLAYING, () => {\n slideStatus.current = SLIDE_STATUS_PLAYING;\n cancelScheduler();\n }), subscribe(ACTIVE_SLIDE_ERROR, () => {\n slideStatus.current = SLIDE_STATUS_ERROR;\n scheduleNextSlide();\n }), subscribe(ACTIVE_SLIDE_COMPLETE, () => {\n slideStatus.current = SLIDE_STATUS_COMPLETE;\n scheduleNextSlide();\n })), [subscribe, cancelScheduler, scheduleNextSlide]);\n const context = React.useMemo(() => ({ playing, disabled, play, pause }), [playing, disabled, play, pause]);\n React.useImperativeHandle(ref, () => context, [context]);\n return React.createElement(SlideshowContext.Provider, { value: context }, children);\n}\n\nconst PlayIcon = createIcon(\"Play\", React.createElement(\"path\", { d: \"M8 5v14l11-7z\" }));\nconst PauseIcon = createIcon(\"Pause\", React.createElement(\"path\", { d: \"M6 19h4V5H6v14zm8-14v14h4V5h-4z\" }));\nfunction SlideshowButton() {\n const { playing, disabled, play, pause } = useSlideshow();\n const { render } = useLightboxProps();\n const focusListeners = useLoseFocus(useController().focus, disabled);\n if (render.buttonSlideshow) {\n return React.createElement(React.Fragment, null, render.buttonSlideshow({ playing, disabled, play, pause }));\n }\n return (React.createElement(IconButton, { label: playing ? \"Pause\" : \"Play\", icon: playing ? PauseIcon : PlayIcon, renderIcon: playing ? render.iconSlideshowPause : render.iconSlideshowPlay, onClick: playing ? pause : play, disabled: disabled, ...focusListeners }));\n}\n\nfunction Slideshow({ augment, addModule }) {\n augment(({ slideshow, toolbar, ...restProps }) => ({\n toolbar: addToolbarButton(toolbar, PLUGIN_SLIDESHOW, React.createElement(SlideshowButton, null)),\n slideshow: resolveSlideshowProps(slideshow),\n ...restProps,\n }));\n addModule(createModule(PLUGIN_SLIDESHOW, SlideshowContextProvider));\n}\n\nexport { Slideshow as default };\n","import * as React from 'react';\nimport { makeUseContext, useDocumentContext, useLayoutEffect, cleanup, useEventCallback, clsx, cssClass, createIcon, useLightboxProps, IconButton, addToolbarButton, createModule } from '../../index.js';\nimport { PLUGIN_FULLSCREEN, CLASS_FULLSIZE, PLUGIN_THUMBNAILS, MODULE_CONTROLLER } from '../../types.js';\n\nconst defaultFullscreenProps = {\n auto: false,\n ref: null,\n};\nconst resolveFullscreenProps = (fullscreen) => ({\n ...defaultFullscreenProps,\n ...fullscreen,\n});\n\nconst FullscreenContext = React.createContext(null);\nconst useFullscreen = makeUseContext(\"useFullscreen\", \"FullscreenContext\", FullscreenContext);\nfunction FullscreenContextProvider({ fullscreen: fullscreenProps, on, children }) {\n const { auto, ref } = resolveFullscreenProps(fullscreenProps);\n const containerRef = React.useRef(null);\n const [disabled, setDisabled] = React.useState();\n const [fullscreen, setFullscreen] = React.useState(false);\n const wasFullscreen = React.useRef(false);\n const { getOwnerDocument } = useDocumentContext();\n useLayoutEffect(() => {\n var _a, _b, _c, _d;\n const ownerDocument = getOwnerDocument();\n setDisabled(!((_d = (_c = (_b = (_a = ownerDocument.fullscreenEnabled) !== null && _a !== void 0 ? _a : ownerDocument.webkitFullscreenEnabled) !== null && _b !== void 0 ? _b : ownerDocument.mozFullScreenEnabled) !== null && _c !== void 0 ? _c : ownerDocument.msFullscreenEnabled) !== null && _d !== void 0 ? _d : false));\n }, [getOwnerDocument]);\n const getFullscreenElement = React.useCallback(() => {\n var _a;\n const ownerDocument = getOwnerDocument();\n const fullscreenElement = ownerDocument.fullscreenElement ||\n ownerDocument.webkitFullscreenElement ||\n ownerDocument.mozFullScreenElement ||\n ownerDocument.msFullscreenElement;\n return ((_a = fullscreenElement === null || fullscreenElement === void 0 ? void 0 : fullscreenElement.shadowRoot) === null || _a === void 0 ? void 0 : _a.fullscreenElement) || fullscreenElement;\n }, [getOwnerDocument]);\n const enter = React.useCallback(() => {\n const container = containerRef.current;\n try {\n if (container.requestFullscreen) {\n container.requestFullscreen().catch(() => { });\n }\n else if (container.webkitRequestFullscreen) {\n container.webkitRequestFullscreen();\n }\n else if (container.mozRequestFullScreen) {\n container.mozRequestFullScreen();\n }\n else if (container.msRequestFullscreen) {\n container.msRequestFullscreen();\n }\n }\n catch (_) {\n }\n }, []);\n const exit = React.useCallback(() => {\n if (!getFullscreenElement())\n return;\n const ownerDocument = getOwnerDocument();\n try {\n if (ownerDocument.exitFullscreen) {\n ownerDocument.exitFullscreen().catch(() => { });\n }\n else if (ownerDocument.webkitExitFullscreen) {\n ownerDocument.webkitExitFullscreen();\n }\n else if (ownerDocument.mozCancelFullScreen) {\n ownerDocument.mozCancelFullScreen();\n }\n else if (ownerDocument.msExitFullscreen) {\n ownerDocument.msExitFullscreen();\n }\n }\n catch (_) {\n }\n }, [getFullscreenElement, getOwnerDocument]);\n React.useEffect(() => {\n const ownerDocument = getOwnerDocument();\n const listener = () => {\n setFullscreen(getFullscreenElement() === containerRef.current);\n };\n return cleanup(...[\"fullscreenchange\", \"webkitfullscreenchange\", \"mozfullscreenchange\", \"MSFullscreenChange\"].map((event) => {\n ownerDocument.addEventListener(event, listener);\n return () => ownerDocument.removeEventListener(event, listener);\n }));\n }, [getFullscreenElement, getOwnerDocument]);\n const onEnterFullscreen = useEventCallback(() => { var _a; return (_a = on.enterFullscreen) === null || _a === void 0 ? void 0 : _a.call(on); });\n const onExitFullscreen = useEventCallback(() => { var _a; return (_a = on.exitFullscreen) === null || _a === void 0 ? void 0 : _a.call(on); });\n React.useEffect(() => {\n if (fullscreen) {\n wasFullscreen.current = true;\n }\n if (wasFullscreen.current) {\n (fullscreen ? onEnterFullscreen : onExitFullscreen)();\n }\n }, [fullscreen, onEnterFullscreen, onExitFullscreen]);\n const handleAutoFullscreen = useEventCallback(() => {\n var _a;\n (_a = (auto ? enter : null)) === null || _a === void 0 ? void 0 : _a();\n return exit;\n });\n React.useEffect(handleAutoFullscreen, [handleAutoFullscreen]);\n const context = React.useMemo(() => ({ fullscreen, disabled, enter, exit }), [fullscreen, disabled, enter, exit]);\n React.useImperativeHandle(ref, () => context, [context]);\n return (React.createElement(\"div\", { ref: containerRef, className: clsx(cssClass(PLUGIN_FULLSCREEN), cssClass(CLASS_FULLSIZE)) },\n React.createElement(FullscreenContext.Provider, { value: context }, children)));\n}\n\nconst EnterFullscreenIcon = createIcon(\"EnterFullscreen\", React.createElement(\"path\", { d: \"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z\" }));\nconst ExitFullscreenIcon = createIcon(\"ExitFullscreen\", React.createElement(\"path\", { d: \"M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z\" }));\nfunction FullscreenButton() {\n var _a;\n const { fullscreen, disabled, enter, exit } = useFullscreen();\n const { render } = useLightboxProps();\n if (disabled)\n return null;\n if (render.buttonFullscreen) {\n return React.createElement(React.Fragment, null, (_a = render.buttonFullscreen) === null || _a === void 0 ? void 0 : _a.call(render, { fullscreen, disabled, enter, exit }));\n }\n return (React.createElement(IconButton, { disabled: disabled, label: fullscreen ? \"Exit Fullscreen\" : \"Enter Fullscreen\", icon: fullscreen ? ExitFullscreenIcon : EnterFullscreenIcon, renderIcon: fullscreen ? render.iconExitFullscreen : render.iconEnterFullscreen, onClick: fullscreen ? exit : enter }));\n}\n\nfunction Fullscreen({ augment, contains, addParent }) {\n augment(({ fullscreen, toolbar, ...restProps }) => ({\n toolbar: addToolbarButton(toolbar, PLUGIN_FULLSCREEN, React.createElement(FullscreenButton, null)),\n fullscreen: resolveFullscreenProps(fullscreen),\n ...restProps,\n }));\n addParent(contains(PLUGIN_THUMBNAILS) ? PLUGIN_THUMBNAILS : MODULE_CONTROLLER, createModule(PLUGIN_FULLSCREEN, FullscreenContextProvider));\n}\n\nexport { Fullscreen as default };\n","import * as React from 'react';\nimport { useLightboxProps, composePrefix, createIcon, ImageSlide, isImageSlide, cssClass, makeComposePrefix, useLightboxState, useDocumentContext, useEventCallback, translateSlideCounter, cssVar, clsx, getSlideKey, useRTL, useEvents, useSensors, useKeyboardNavigation, useAnimation, cleanup, calculatePreload, hasSlides, getSlide, translateLabel, makeUseContext, LightboxPropsProvider, createIconDisabled, IconButton, addToolbarButton, createModule } from '../../index.js';\nimport { PLUGIN_THUMBNAILS, ELEMENT_ICON, CLASS_FLEX_CENTER, ACTION_SWIPE, ACTION_NEXT, ACTION_PREV, PLUGIN_FULLSCREEN, MODULE_CONTROLLER } from '../../types.js';\n\nconst defaultThumbnailsProps = {\n ref: null,\n position: \"bottom\",\n width: 120,\n height: 80,\n border: 1,\n borderRadius: 4,\n padding: 4,\n gap: 16,\n imageFit: \"contain\",\n vignette: true,\n hidden: false,\n showToggle: false,\n};\nconst resolveThumbnailsProps = (thumbnails) => ({\n ...defaultThumbnailsProps,\n ...thumbnails,\n});\nfunction useThumbnailsProps() {\n const { thumbnails } = useLightboxProps();\n return resolveThumbnailsProps(thumbnails);\n}\n\nconst cssPrefix = (value) => composePrefix(PLUGIN_THUMBNAILS, value);\nconst cssThumbnailPrefix = (value) => cssPrefix(composePrefix(\"thumbnail\", value));\n\nconst VideoThumbnailIcon = createIcon(\"VideoThumbnail\", React.createElement(\"path\", { d: \"M10 16.5l6-4.5-6-4.5v9zM12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z\" }));\nconst UnknownThumbnailIcon = createIcon(\"UnknownThumbnail\", React.createElement(\"path\", { d: \"M23 18V6c0-1.1-.9-2-2-2H3c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h18c1.1 0 2-.9 2-2zM8.5 12.5l2.5 3.01L14.5 11l4.5 6H5l3.5-4.5z\" }));\nfunction renderThumbnail({ slide, render, rect, imageFit }) {\n var _a;\n const customThumbnail = (_a = render.thumbnail) === null || _a === void 0 ? void 0 : _a.call(render, { slide, render, rect, imageFit });\n if (customThumbnail) {\n return customThumbnail;\n }\n const imageSlideProps = { render, rect, imageFit };\n if (slide.thumbnail) {\n return React.createElement(ImageSlide, { slide: { src: slide.thumbnail }, ...imageSlideProps });\n }\n if (isImageSlide(slide)) {\n return React.createElement(ImageSlide, { slide: slide, ...imageSlideProps });\n }\n const thumbnailIconClass = cssClass(cssThumbnailPrefix(ELEMENT_ICON));\n if (slide.type === \"video\") {\n return (React.createElement(React.Fragment, null,\n slide.poster && React.createElement(ImageSlide, { slide: { src: slide.poster }, ...imageSlideProps }),\n React.createElement(VideoThumbnailIcon, { className: thumbnailIconClass })));\n }\n return React.createElement(UnknownThumbnailIcon, { className: thumbnailIconClass });\n}\nconst activePrefix = makeComposePrefix(\"active\");\nconst fadeInPrefix = makeComposePrefix(\"fadein\");\nconst fadeOutPrefix = makeComposePrefix(\"fadeout\");\nconst placeholderPrefix = makeComposePrefix(\"placeholder\");\nconst DELAY = \"delay\";\nconst DURATION = \"duration\";\nfunction Thumbnail({ slide, index, onClick, fadeIn, fadeOut, placeholder, onLoseFocus }) {\n const ref = React.useRef(null);\n const { render, styles, labels } = useLightboxProps();\n const { slides, globalIndex } = useLightboxState();\n const { getOwnerDocument } = useDocumentContext();\n const { width, height, imageFit } = useThumbnailsProps();\n const rect = { width, height };\n const active = index === globalIndex;\n const onLoseFocusCallback = useEventCallback(onLoseFocus);\n React.useEffect(() => {\n if (fadeOut && getOwnerDocument().activeElement === ref.current) {\n onLoseFocusCallback();\n }\n }, [fadeOut, onLoseFocusCallback, getOwnerDocument]);\n return (React.createElement(\"button\", { ref: ref, type: \"button\", className: clsx(cssClass(CLASS_FLEX_CENTER), cssClass(cssThumbnailPrefix()), active && cssClass(cssThumbnailPrefix(activePrefix())), fadeIn && cssClass(cssThumbnailPrefix(fadeInPrefix())), fadeOut && cssClass(cssThumbnailPrefix(fadeOutPrefix())), placeholder && cssClass(cssThumbnailPrefix(placeholderPrefix()))), style: {\n ...(fadeIn\n ? {\n [cssVar(cssThumbnailPrefix(fadeInPrefix(DURATION)))]: `${fadeIn.duration}ms`,\n [cssVar(cssThumbnailPrefix(fadeInPrefix(DELAY)))]: `${fadeIn.delay}ms`,\n }\n : null),\n ...(fadeOut\n ? {\n [cssVar(cssThumbnailPrefix(fadeOutPrefix(DURATION)))]: `${fadeOut.duration}ms`,\n [cssVar(cssThumbnailPrefix(fadeOutPrefix(DELAY)))]: `${fadeOut.delay}ms`,\n }\n : null),\n ...styles.thumbnail,\n }, onClick: onClick, \"aria-current\": active ? true : undefined, \"aria-label\": translateSlideCounter(labels, slides, index) }, slide && renderThumbnail({ slide, render, rect, imageFit })));\n}\n\nfunction isHorizontal(position) {\n return [\"top\", \"bottom\"].includes(position);\n}\nfunction boxSize(thumbnails, dimension) {\n return dimension + 2 * (thumbnails.border + thumbnails.padding) + thumbnails.gap;\n}\nfunction getThumbnailKey(slide) {\n const { thumbnail, poster } = slide || { thumbnail: \"placeholder\" };\n return ((typeof thumbnail === \"string\" && thumbnail) ||\n (typeof poster === \"string\" && poster) ||\n (slide && getSlideKey(slide)) ||\n undefined);\n}\nfunction ThumbnailsTrack({ visible, containerRef }) {\n const track = React.useRef(null);\n const isRTL = useRTL();\n const { publish, subscribe } = useEvents();\n const { carousel, styles, labels } = useLightboxProps();\n const { slides, globalIndex, animation } = useLightboxState();\n const { registerSensors, subscribeSensors } = useSensors();\n useKeyboardNavigation(subscribeSensors);\n const thumbnails = useThumbnailsProps();\n const { position, width, height, border, borderStyle, borderColor, borderRadius, padding, gap, vignette } = thumbnails;\n const offset = ((animation === null || animation === void 0 ? void 0 : animation.duration) !== undefined && (animation === null || animation === void 0 ? void 0 : animation.increment)) || 0;\n const animationDuration = (animation === null || animation === void 0 ? void 0 : animation.duration) || 0;\n const { prepareAnimation } = useAnimation(track, (snapshot) => ({\n keyframes: isHorizontal(position)\n ? [\n {\n transform: `translateX(${(isRTL ? -1 : 1) * boxSize(thumbnails, width) * offset + snapshot}px)`,\n },\n { transform: \"translateX(0)\" },\n ]\n : [\n {\n transform: `translateY(${boxSize(thumbnails, height) * offset + snapshot}px)`,\n },\n { transform: \"translateY(0)\" },\n ],\n duration: animationDuration,\n easing: animation === null || animation === void 0 ? void 0 : animation.easing,\n }));\n const handleControllerSwipe = useEventCallback(() => {\n let animationOffset = 0;\n if (containerRef.current && track.current) {\n const containerRect = containerRef.current.getBoundingClientRect();\n const trackRect = track.current.getBoundingClientRect();\n animationOffset = isHorizontal(position)\n ? trackRect.left - containerRect.left - (containerRect.width - trackRect.width) / 2\n : trackRect.top - containerRect.top - (containerRect.height - trackRect.height) / 2;\n }\n prepareAnimation(animationOffset);\n });\n React.useEffect(() => cleanup(subscribe(ACTION_SWIPE, handleControllerSwipe)), [subscribe, handleControllerSwipe]);\n const preload = calculatePreload(carousel, slides);\n const items = [];\n if (hasSlides(slides)) {\n for (let index = globalIndex - preload - Math.abs(offset); index <= globalIndex + preload + Math.abs(offset); index += 1) {\n const placeholder = (carousel.finite && (index < 0 || index > slides.length - 1)) ||\n (offset < 0 && index < globalIndex - preload) ||\n (offset > 0 && index > globalIndex + preload);\n const slide = !placeholder ? getSlide(slides, index) : null;\n const key = [`${index}`, getThumbnailKey(slide)].filter(Boolean).join(\"|\");\n items.push({ key, index, slide });\n }\n }\n const handleClick = (slideIndex) => () => {\n if (slideIndex > globalIndex) {\n publish(ACTION_NEXT, { count: slideIndex - globalIndex });\n }\n else if (slideIndex < globalIndex) {\n publish(ACTION_PREV, { count: globalIndex - slideIndex });\n }\n };\n return (React.createElement(\"div\", { className: clsx(cssClass(cssPrefix(\"container\")), cssClass(CLASS_FLEX_CENTER)), style: {\n ...(!visible ? { display: \"none\" } : null),\n ...(width !== defaultThumbnailsProps.width ? { [cssVar(cssThumbnailPrefix(\"width\"))]: `${width}px` } : null),\n ...(height !== defaultThumbnailsProps.height\n ? { [cssVar(cssThumbnailPrefix(\"height\"))]: `${height}px` }\n : null),\n ...(border !== defaultThumbnailsProps.border\n ? { [cssVar(cssThumbnailPrefix(\"border\"))]: `${border}px` }\n : null),\n ...(borderStyle ? { [cssVar(cssThumbnailPrefix(\"border_style\"))]: borderStyle } : null),\n ...(borderColor ? { [cssVar(cssThumbnailPrefix(\"border_color\"))]: borderColor } : null),\n ...(borderRadius !== defaultThumbnailsProps.borderRadius\n ? { [cssVar(cssThumbnailPrefix(\"border_radius\"))]: `${borderRadius}px` }\n : null),\n ...(padding !== defaultThumbnailsProps.padding\n ? { [cssVar(cssThumbnailPrefix(\"padding\"))]: `${padding}px` }\n : null),\n ...(gap !== defaultThumbnailsProps.gap ? { [cssVar(cssThumbnailPrefix(\"gap\"))]: `${gap}px` } : null),\n ...styles.thumbnailsContainer,\n } },\n React.createElement(\"nav\", { ref: track, style: styles.thumbnailsTrack, className: clsx(cssClass(cssPrefix(\"track\")), cssClass(CLASS_FLEX_CENTER)), \"aria-label\": translateLabel(labels, \"Thumbnails\"), tabIndex: -1, ...registerSensors }, items.map(({ key, index, slide }) => {\n const fadeAnimationDuration = animationDuration / Math.abs(offset || 1);\n const fadeIn = (offset > 0 && index > globalIndex + preload - offset && index <= globalIndex + preload) ||\n (offset < 0 && index < globalIndex - preload - offset && index >= globalIndex - preload)\n ? {\n duration: fadeAnimationDuration,\n delay: ((offset > 0 ? index - (globalIndex + preload - offset) : globalIndex - preload - offset - index) -\n 1) *\n fadeAnimationDuration,\n }\n : undefined;\n const fadeOut = (offset > 0 && index < globalIndex - preload) || (offset < 0 && index > globalIndex + preload)\n ? {\n duration: fadeAnimationDuration,\n delay: (offset > 0\n ? offset - (globalIndex - preload - index)\n : -offset - (index - (globalIndex + preload))) * fadeAnimationDuration,\n }\n : undefined;\n return (React.createElement(Thumbnail, { key: key, index: index, slide: slide, fadeIn: fadeIn, fadeOut: fadeOut, placeholder: !slide, onClick: handleClick(index), onLoseFocus: () => { var _a; return (_a = track.current) === null || _a === void 0 ? void 0 : _a.focus(); } }));\n })),\n vignette && React.createElement(\"div\", { className: cssClass(cssPrefix(\"vignette\")) })));\n}\n\nconst ThumbnailsContext = React.createContext(null);\nconst useThumbnails = makeUseContext(\"useThumbnails\", \"ThumbnailsContext\", ThumbnailsContext);\nfunction ThumbnailsContextProvider({ children, ...props }) {\n const { ref, position, hidden } = resolveThumbnailsProps(props.thumbnails);\n const [visible, setVisible] = React.useState(!hidden);\n const containerRef = React.useRef(null);\n const context = React.useMemo(() => ({\n visible,\n show: () => setVisible(true),\n hide: () => setVisible(false),\n }), [visible]);\n React.useImperativeHandle(ref, () => context, [context]);\n return (React.createElement(LightboxPropsProvider, { ...props },\n React.createElement(ThumbnailsContext.Provider, { value: context },\n React.createElement(\"div\", { ref: containerRef, className: clsx(cssClass(cssPrefix()), cssClass(cssPrefix(`${position}`))) },\n [\"start\", \"top\"].includes(position) && React.createElement(ThumbnailsTrack, { containerRef: containerRef, visible: visible }),\n React.createElement(\"div\", { className: cssClass(cssPrefix(\"wrapper\")) }, children),\n [\"end\", \"bottom\"].includes(position) && React.createElement(ThumbnailsTrack, { containerRef: containerRef, visible: visible })))));\n}\n\nconst thumbnailsIcon = () => (React.createElement(React.Fragment, null,\n React.createElement(\"path\", { strokeWidth: 2, stroke: \"currentColor\", strokeLinejoin: \"round\", fill: \"none\", d: \"M3 5l18 0l0 14l-18 0l0-14z\" }),\n React.createElement(\"path\", { d: \"M5 14h4v3h-4zM10 14h4v3h-4zM15 14h4v3h-4z\" })));\nconst ThumbnailsVisible = createIcon(\"ThumbnailsVisible\", thumbnailsIcon());\nconst ThumbnailsHidden = createIconDisabled(\"ThumbnailsHidden\", thumbnailsIcon());\nfunction ThumbnailsButton() {\n const { visible, show, hide } = useThumbnails();\n const { render } = useLightboxProps();\n if (render.buttonThumbnails) {\n return React.createElement(React.Fragment, null, render.buttonThumbnails({ visible, show, hide }));\n }\n return (React.createElement(IconButton, { label: visible ? \"Hide thumbnails\" : \"Show thumbnails\", icon: visible ? ThumbnailsVisible : ThumbnailsHidden, renderIcon: visible ? render.iconThumbnailsVisible : render.iconThumbnailsHidden, onClick: visible ? hide : show }));\n}\n\nfunction Thumbnails({ augment, contains, append, addParent }) {\n augment(({ thumbnails: thumbnailsProps, toolbar, ...restProps }) => {\n const thumbnails = resolveThumbnailsProps(thumbnailsProps);\n return {\n toolbar: addToolbarButton(toolbar, PLUGIN_THUMBNAILS, thumbnails.showToggle ? React.createElement(ThumbnailsButton, null) : null),\n thumbnails,\n ...restProps,\n };\n });\n const module = createModule(PLUGIN_THUMBNAILS, ThumbnailsContextProvider);\n if (contains(PLUGIN_FULLSCREEN)) {\n append(PLUGIN_FULLSCREEN, module);\n }\n else {\n addParent(MODULE_CONTROLLER, module);\n }\n}\n\nexport { Thumbnails as default };\n","import React from 'react';\n\nexport interface IProps extends React.HTMLAttributes {\n className?: string;\n children?: React.ReactNode;\n style?: React.CSSProperties;\n}\n\n/**\n * I 기본 컴포넌트\n *\n * HTML 태그를 래핑한 기본 컴포넌트입니다.\n * 주로 아이콘 폰트 (FontAwesome 등)와 함께 사용됩니다.\n *\n * @example\n * ```tsx\n * \n * \n * ```\n */\nexport const I: React.FC = ({ className = '', children, style, ...props }) => {\n return (\n \n {children}\n \n );\n};","/**\n * ImageGallery 컴포넌트\n *\n * yet-another-react-lightbox 기반 이미지 갤러리 컴포넌트입니다.\n * 줌, 슬라이드쇼, 전체화면, 다운로드 기능을 지원합니다.\n *\n * @module composite/ImageGallery\n */\n\nimport React, { useState, useCallback, useEffect, useRef } from 'react';\nimport Lightbox, { Slide } from 'yet-another-react-lightbox';\nimport Zoom from 'yet-another-react-lightbox/plugins/zoom';\nimport Counter from 'yet-another-react-lightbox/plugins/counter';\nimport Slideshow from 'yet-another-react-lightbox/plugins/slideshow';\nimport Fullscreen from 'yet-another-react-lightbox/plugins/fullscreen';\nimport Thumbnails from 'yet-another-react-lightbox/plugins/thumbnails';\nimport 'yet-another-react-lightbox/styles.css';\nimport 'yet-another-react-lightbox/plugins/counter.css';\nimport 'yet-another-react-lightbox/plugins/thumbnails.css';\n\nimport { Button } from '../basic/Button';\nimport { I } from '../basic/I';\nimport { Div } from '../basic/Div';\nimport { Img } from '../basic/Img';\nimport type { EditorAttrs } from '../../types';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst G7Core = (window as any).G7Core;\n\n// G7Core.t() 번역 함수 참조\nconst t = (key: string, params?: Record) =>\n G7Core?.t?.(key, params) ?? key;\n\n// ========== Types ==========\n\nexport interface GalleryImage {\n /** 이미지 표시용 URL (라이트박스에서 보여줄 이미지) */\n src: string;\n /** 다운로드용 URL (src와 다를 수 있음, 없으면 src 사용) */\n downloadUrl?: string;\n /** 이미지 제목/캡션 */\n title?: string;\n /** 이미지 설명 */\n description?: string;\n /** 썸네일 URL (없으면 src 사용) */\n thumbnail?: string;\n /** 원본 파일명 (다운로드 시 사용) */\n filename?: string;\n /** 다운로드 시 인증된 요청이 필요한지 여부 (기본값: false) */\n downloadRequiresAuth?: boolean;\n}\n\nexport interface ImageGalleryProps {\n /** 갤러리에 표시할 이미지 배열 */\n images: GalleryImage[];\n /** 라이트박스 열기 여부 */\n isOpen: boolean;\n /** 라이트박스 닫기 콜백 */\n onClose: () => void;\n /** 시작 인덱스 (기본값: 0) */\n startIndex?: number;\n /** 줌 기능 활성화 (기본값: true) */\n enableZoom?: boolean;\n /** 슬라이드쇼 기능 활성화 (기본값: false) */\n enableSlideshow?: boolean;\n /** 전체화면 기능 활성화 (기본값: true) */\n enableFullscreen?: boolean;\n /** 이미지 카운터 표시 (기본값: true) */\n showCounter?: boolean;\n /** 다운로드 버튼 표시 (기본값: true) */\n showDownload?: boolean;\n /** 썸네일 네비게이션 표시 (기본값: true) */\n showThumbnails?: boolean;\n /** 커스텀 다운로드 핸들러 (제공 시 기본 다운로드 로직 대신 실행) */\n onDownload?: (image: GalleryImage, index: number) => void;\n /**\n * 레이아웃 편집기 주입 속성 (편집 모드 전용).\n * 본 컴포넌트는 서드파티 Lightbox 모달(`createPortal` 로 body 렌더)이라 런타임에는\n * 인라인 DOM 이 없다. 편집 모드(editorAttrs 존재)에서는 캔버스 선택·속성 편집이\n * 가능하도록 인라인 placeholder(이미지 썸네일 그리드)를 대신 렌더하고 거기에\n * editorAttrs·id 를 부착한다. 런타임(editorAttrs 미주입)은 종전 Lightbox 동작 그대로.\n *\n */\n editorAttrs?: EditorAttrs;\n\n /** DOM id 속성 (레이아웃 편집기 코어 일괄 ID — 편집 placeholder 루트에 부착) */\n id?: string;\n}\n\n// ========== Helper Functions ==========\n\n/**\n * 인증된 이미지 다운로드 (Blob으로 변환 후 다운로드)\n */\nconst downloadAuthenticatedFile = async (url: string, filename: string): Promise => {\n try {\n const blob = await G7Core.api.get(url, {\n responseType: 'blob',\n });\n\n if (blob) {\n const objectUrl = URL.createObjectURL(blob);\n const link = document.createElement('a');\n link.href = objectUrl;\n link.download = filename;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(objectUrl);\n }\n } catch (error) {\n console.error('Failed to download file:', error);\n G7Core?.toast?.error?.(t('common.download_failed'));\n }\n};\n\n/**\n * 일반 파일 다운로드\n */\nconst downloadFile = (url: string, filename: string): void => {\n const link = document.createElement('a');\n link.href = url;\n link.download = filename;\n link.target = '_blank';\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n};\n\n/**\n * 이미지 다운로드 실행\n */\nexport const executeImageDownload = async (image: GalleryImage): Promise => {\n const downloadUrl = image.downloadUrl || image.src;\n const filename = image.filename || image.title || 'image';\n\n if (image.downloadRequiresAuth) {\n await downloadAuthenticatedFile(downloadUrl, filename);\n } else {\n downloadFile(downloadUrl, filename);\n }\n};\n\n// ========== Custom Download Button Component ==========\n\ninterface DownloadButtonProps {\n image: GalleryImage;\n index: number;\n onDownload?: (image: GalleryImage, index: number) => void;\n}\n\nconst DownloadButton: React.FC = ({ image, index, onDownload }) => {\n const [isDownloading, setIsDownloading] = useState(false);\n\n const handleDownload = async (e: React.MouseEvent) => {\n e.stopPropagation();\n\n if (onDownload) {\n onDownload(image, index);\n return;\n }\n\n setIsDownloading(true);\n try {\n await executeImageDownload(image);\n } finally {\n setIsDownloading(false);\n }\n };\n\n return (\n \n {isDownloading ? (\n \n ) : (\n \n )}\n \n );\n};\n\n// ========== Main Component ==========\n\nexport const ImageGallery: React.FC = ({\n images,\n isOpen,\n onClose,\n startIndex = 0,\n enableZoom = true,\n enableSlideshow = false,\n enableFullscreen = true,\n showCounter = true,\n showDownload = true,\n showThumbnails = true,\n onDownload,\n editorAttrs,\n id,\n}) => {\n // 현재 슬라이드 인덱스 (다운로드 버튼용)\n const [currentIndex, setCurrentIndex] = useState(startIndex);\n // 최신 인덱스를 ref로 추적 (클로저 문제 방지)\n const currentIndexRef = useRef(startIndex);\n\n // 이미지를 라이트박스 슬라이드 형식으로 변환 (썸네일 포함)\n const slides: Slide[] = images.map((image) => ({\n src: image.src,\n title: image.title,\n description: image.description,\n }));\n\n // 활성화할 플러그인 목록\n const plugins = [];\n if (enableZoom) plugins.push(Zoom);\n if (enableSlideshow) plugins.push(Slideshow);\n if (enableFullscreen) plugins.push(Fullscreen);\n if (showCounter) plugins.push(Counter);\n if (showThumbnails) plugins.push(Thumbnails);\n\n // 현재 이미지\n const currentImage = images[currentIndex];\n\n // currentIndex가 변경되면 ref도 업데이트\n useEffect(() => {\n currentIndexRef.current = currentIndex;\n }, [currentIndex]);\n\n // 편집 모드(편집기 캔버스) — Lightbox 모달은 인라인 DOM 이 없어 선택·편집 불가.\n // editorAttrs 가 주입되면 인라인 placeholder(썸네일 그리드)를 대신 렌더해\n // 캔버스에서 선택·속성 편집이 가능하게 한다. 런타임(editorAttrs 미주입)은 미진입.\n // (Hooks 규칙 — 모든 hook 호출 이후에 분기 return)\n if (editorAttrs) {\n const previewImages = (images ?? []).slice(0, 4);\n return (\n \n {previewImages.length > 0 ? (\n previewImages.map((image, index) => (\n \n ))\n ) : (\n
\n \n {t('editor.component.image_gallery')}\n
\n )}\n
\n );\n }\n\n return (\n {\n if (index !== currentIndexRef.current) {\n setCurrentIndex(index);\n }\n },\n }}\n zoom={{\n maxZoomPixelRatio: 3,\n zoomInMultiplier: 2,\n doubleTapDelay: 300,\n doubleClickDelay: 300,\n doubleClickMaxStops: 2,\n keyboardMoveDistance: 50,\n wheelZoomDistanceFactor: 100,\n pinchZoomDistanceFactor: 100,\n scrollToZoom: true,\n }}\n carousel={{\n finite: true,\n preload: 2,\n padding: '16px',\n spacing: '30%',\n }}\n animation={{\n fade: 250,\n swipe: 500,\n easing: {\n fade: 'ease',\n swipe: 'ease-out',\n navigation: 'ease-in-out',\n },\n }}\n controller={{\n closeOnBackdropClick: true,\n closeOnPullDown: true,\n closeOnPullUp: true,\n }}\n thumbnails={{\n position: 'bottom',\n width: 120,\n height: 80,\n border: 2,\n borderRadius: 4,\n padding: 4,\n gap: 16,\n showToggle: false,\n vignette: true,\n }}\n toolbar={{\n buttons: [\n showDownload && currentImage && (\n \n ),\n 'close',\n ].filter(Boolean),\n }}\n styles={{\n container: {\n backgroundColor: 'rgba(0, 0, 0, 0.9)',\n },\n }}\n />\n );\n};\n\n// ========== Utility Hook ==========\n\n/**\n * ImageGallery를 쉽게 사용하기 위한 커스텀 훅\n *\n * @example\n * const { openGallery, galleryProps } = useImageGallery();\n *\n * // 이미지 클릭 시\n * openGallery(images, 0)} />\n *\n * // 컴포넌트 렌더링\n * \n */\nexport const useImageGallery = () => {\n const [isOpen, setIsOpen] = useState(false);\n const [images, setImages] = useState([]);\n const [startIndex, setStartIndex] = useState(0);\n\n const openGallery = useCallback((galleryImages: GalleryImage[], index = 0) => {\n setImages(galleryImages);\n setStartIndex(index);\n setIsOpen(true);\n }, []);\n\n const closeGallery = useCallback(() => {\n setIsOpen(false);\n }, []);\n\n return {\n isOpen,\n openGallery,\n closeGallery,\n galleryProps: {\n images,\n isOpen,\n onClose: closeGallery,\n startIndex,\n },\n };\n};\n\nImageGallery.displayName = 'ImageGallery';\n\nexport default ImageGallery;\n","/**\n * ProductImageViewer 컴포넌트\n *\n * 상품 상세 페이지용 이미지 뷰어입니다.\n * 메인 이미지 + 썸네일 리스트 + 라이트박스(ImageGallery) 연동을 지원합니다.\n *\n * @module composite/ProductImageViewer\n */\n\nimport React, { useState, useMemo } from 'react';\nimport { Div } from '../basic/Div';\nimport { Img } from '../basic/Img';\nimport { Button } from '../basic/Button';\nimport { Icon } from '../basic/Icon';\nimport { ImageGallery, useImageGallery, GalleryImage } from './ImageGallery';\nimport type { EditorAttrs } from '../../types';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst G7Core = (window as any).G7Core;\n\nconst t = (key: string, params?: Record) =>\n G7Core?.t?.(key, params) ?? key;\n\n// ========== Types ==========\n\nexport interface ProductImage {\n /** 이미지 ID */\n id: number;\n /** 외부 URL (CDN 등, nullable) */\n url: string | null;\n /** API 서빙 URL (항상 존재) */\n download_url: string;\n /** 현재 로케일 대체 텍스트 */\n alt_text_current?: string;\n /** 대표 이미지 여부 */\n is_thumbnail?: boolean;\n /** 정렬 순서 */\n sort_order?: number;\n}\n\nexport interface ProductImageViewerProps {\n /** 상품 이미지 배열 (API 응답 그대로) */\n images: ProductImage[];\n /** 커스텀 클래스 */\n className?: string;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\n// ========== Helper ==========\n\n/**\n * 이미지 표시용 URL 반환 (url 우선, 없으면 download_url)\n */\nconst getImageSrc = (image: ProductImage): string => {\n return image.url ?? image.download_url;\n};\n\n// ========== Main Component ==========\n\nexport const ProductImageViewer: React.FC = ({\n images = [],\n className = '',\n id,\n editorAttrs,\n}) => {\n const [selectedIndex, setSelectedIndex] = useState(0);\n const { openGallery, galleryProps } = useImageGallery();\n\n // 이미지를 ImageGallery용 형식으로 변환\n const galleryImages: GalleryImage[] = useMemo(\n () =>\n images.map((img) => ({\n src: getImageSrc(img),\n title: img.alt_text_current ?? '',\n thumbnail: getImageSrc(img),\n downloadUrl: img.download_url,\n filename: img.alt_text_current ?? `image-${img.id}`,\n })),\n [images],\n );\n\n // 이미지 없음\n if (!images || images.length === 0) {\n return (\n \n
\n \n
{t('shop.no_image')}
\n
\n
\n );\n }\n\n const currentImage = images[selectedIndex] ?? images[0];\n\n return (\n
\n {/* 메인 이미지 */}\n
\n openGallery(galleryImages, selectedIndex)}\n aria-label={t('shop.view_image')}\n >\n \n \n
\n\n {/* 썸네일 리스트 (2개 이상일 때만) */}\n {images.length > 1 && (\n
\n {images.map((img, index) => (\n setSelectedIndex(index)}\n aria-label={img.alt_text_current ?? `${t('shop.image')} ${index + 1}`}\n >\n \n \n ))}\n
\n )}\n\n {/* 라이트박스 */}\n \n
\n );\n};\n\nProductImageViewer.displayName = 'ProductImageViewer';\n\nexport default ProductImageViewer;\n","/**\n * QuantitySelector 컴포넌트\n *\n * 수량 선택을 위한 +/- 버튼 컴포넌트입니다.\n * 상품 상세 페이지, 장바구니 등에서 사용됩니다.\n */\n\nimport React from 'react';\nimport { Div } from '../basic/Div';\nimport { Button } from '../basic/Button';\nimport { Input } from '../basic/Input';\nimport { Icon } from '../basic/Icon';\nimport type { EditorAttrs } from '../../types';\n\ninterface QuantitySelectorProps {\n /** 현재 수량 */\n value: number;\n /** 최소 수량 */\n min?: number;\n /** 최대 수량 */\n max?: number;\n /** 수량 변경 콜백 */\n onChange: (value: number) => void;\n /** 컴포넌트 크기 */\n size?: 'sm' | 'md' | 'lg';\n /** 비활성화 여부 */\n disabled?: boolean;\n /** 추가 CSS 클래스 */\n className?: string;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n/**\n * 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread)\n */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * 수량 선택 컴포넌트\n *\n * @example\n * ```tsx\n * const [quantity, setQuantity] = useState(1);\n *\n * \n * ```\n *\n * @example\n * ```json\n * // 레이아웃 JSON에서 사용\n * {\n * \"type\": \"composite\",\n * \"name\": \"QuantitySelector\",\n * \"props\": {\n * \"value\": \"{{item.quantity}}\",\n * \"min\": 1,\n * \"max\": \"{{item.stock}}\",\n * \"size\": \"sm\"\n * },\n * \"actions\": [{\n * \"event\": \"onChange\",\n * \"type\": \"change\",\n * \"handler\": \"updateQuantity\",\n * \"params\": { \"itemId\": \"{{item.id}}\", \"quantity\": \"{{$args[0]}}\" }\n * }]\n * }\n * ```\n */\nconst QuantitySelector: React.FC = ({\n value,\n min = 1,\n max = 999,\n onChange,\n size = 'md',\n disabled = false,\n className = '',\n id,\n editorAttrs,\n}) => {\n const sizeClasses = {\n sm: {\n container: 'h-8',\n button: 'w-8 h-8 text-sm',\n input: 'w-10 text-sm',\n },\n md: {\n container: 'h-10',\n button: 'w-10 h-10',\n input: 'w-14',\n },\n lg: {\n container: 'h-12',\n button: 'w-12 h-12 text-lg',\n input: 'w-16 text-lg',\n },\n };\n\n const classes = sizeClasses[size];\n\n const handleDecrease = () => {\n if (value > min && !disabled) {\n onChange(value - 1);\n }\n };\n\n const handleIncrease = () => {\n if (value < max && !disabled) {\n onChange(value + 1);\n }\n };\n\n const handleInputChange = (e: React.ChangeEvent) => {\n const newValue = parseInt(e.target.value, 10);\n if (!isNaN(newValue)) {\n const clampedValue = Math.max(min, Math.min(max, newValue));\n onChange(clampedValue);\n }\n };\n\n const handleInputBlur = (e: React.FocusEvent) => {\n const newValue = parseInt(e.target.value, 10);\n if (isNaN(newValue) || newValue < min) {\n onChange(min);\n } else if (newValue > max) {\n onChange(max);\n }\n };\n\n const isMinDisabled = disabled || value <= min;\n const isMaxDisabled = disabled || value >= max;\n\n return (\n \n {/* 감소 버튼 */}\n \n \n \n\n {/* 수량 입력 */}\n \n\n {/* 증가 버튼 */}\n \n \n \n
\n );\n};\n\nexport default QuantitySelector;\n","/**\n * PostReactions 컴포넌트\n *\n * 게시글에 대한 리액션(이모지) 버튼 그룹입니다.\n * 좋아요, 웃겨요, 동의해요, 감사해요, 놀라워요 5종 리액션을 지원합니다.\n */\n\nimport React from 'react';\nimport { Div } from '../basic/Div';\nimport { Button } from '../basic/Button';\nimport { Span } from '../basic/Span';\nimport type { EditorAttrs } from '../../types';\n\n// Logger 설정 (G7Core 초기화 전에도 동작하도록 폴백 포함)\nconst logger = ((window as any).G7Core?.createLogger?.('Comp:PostReactions')) ?? {\n log: (...args: unknown[]) => console.log('[Comp:PostReactions]', ...args),\n warn: (...args: unknown[]) => console.warn('[Comp:PostReactions]', ...args),\n error: (...args: unknown[]) => console.error('[Comp:PostReactions]', ...args),\n};\n\n/**\n * G7Core 번역 함수\n */\nconst t = (key: string, params?: Record) =>\n (window as any).G7Core?.t?.(key, params) ?? key;\n\ntype ReactionType = 'like' | 'funny' | 'agree' | 'thanks' | 'wow';\n\ninterface ReactionCount {\n type: ReactionType;\n count: number;\n}\n\ninterface PostReactionsProps {\n /** 각 리액션별 카운트 */\n reactions: ReactionCount[];\n /** 현재 사용자의 리액션 (없으면 null) */\n userReaction?: ReactionType | null;\n /** 게시글 ID */\n postId: number;\n /** 리액션 클릭 콜백 */\n onReact?: (type: ReactionType) => void;\n /** 컴포넌트 크기 */\n size?: 'sm' | 'md' | 'lg';\n /** 추가 CSS 클래스 */\n className?: string;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n /** 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread) */\n editorAttrs?: EditorAttrs;\n}\n\ninterface ReactionConfig {\n type: ReactionType;\n emoji: string;\n labelKey: string;\n activeColor: string;\n}\n\n/**\n * 리액션 설정\n */\nconst REACTION_CONFIGS: ReactionConfig[] = [\n { type: 'like', emoji: '👍', labelKey: 'board.reactions.like', activeColor: 'bg-blue-100 dark:bg-blue-900/30 text-blue-600 dark:text-blue-400' },\n { type: 'funny', emoji: '😂', labelKey: 'board.reactions.funny', activeColor: 'bg-yellow-100 dark:bg-yellow-900/30 text-yellow-600 dark:text-yellow-400' },\n { type: 'agree', emoji: '👌', labelKey: 'board.reactions.agree', activeColor: 'bg-green-100 dark:bg-green-900/30 text-green-600 dark:text-green-400' },\n { type: 'thanks', emoji: '🙏', labelKey: 'board.reactions.thanks', activeColor: 'bg-purple-100 dark:bg-purple-900/30 text-purple-600 dark:text-purple-400' },\n { type: 'wow', emoji: '😮', labelKey: 'board.reactions.wow', activeColor: 'bg-orange-100 dark:bg-orange-900/30 text-orange-600 dark:text-orange-400' },\n];\n\n/**\n * 게시글 리액션 컴포넌트\n *\n * @example\n * ```tsx\n * handleReact(type)}\n * />\n * ```\n *\n * @example\n * ```json\n * // 레이아웃 JSON에서 사용\n * {\n * \"type\": \"composite\",\n * \"name\": \"PostReactions\",\n * \"props\": {\n * \"reactions\": \"{{post.data.reactions}}\",\n * \"userReaction\": \"{{post.data.user_reaction}}\",\n * \"postId\": \"{{post.data.id}}\"\n * }\n * }\n * ```\n */\nconst PostReactions: React.FC = ({\n reactions,\n userReaction,\n postId,\n onReact,\n size = 'md',\n className = '',\n id,\n editorAttrs,\n}) => {\n const sizeClasses = {\n sm: 'px-2 py-1 text-xs gap-1',\n md: 'px-3 py-1.5 text-sm gap-1.5',\n lg: 'px-4 py-2 text-base gap-2',\n };\n\n const emojiSizes = {\n sm: 'text-sm',\n md: 'text-base',\n lg: 'text-lg',\n };\n\n const getReactionCount = (type: ReactionType): number => {\n const reaction = reactions.find((r) => r.type === type);\n return reaction?.count ?? 0;\n };\n\n const handleClick = async (type: ReactionType) => {\n if (onReact) {\n onReact(type);\n return;\n }\n\n // 기본 API 호출\n try {\n const response = await fetch(`/api/posts/${postId}/reactions`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ type }),\n credentials: 'include',\n });\n\n if (!response.ok) {\n throw new Error('리액션 처리 실패');\n }\n\n // 성공 시 페이지 새로고침 또는 상태 업데이트\n window.location.reload();\n } catch (error) {\n logger.error('리액션 오류:', error);\n }\n };\n\n return (\n
\n {REACTION_CONFIGS.map((config) => {\n const count = getReactionCount(config.type);\n const isActive = userReaction === config.type;\n\n return (\n handleClick(config.type)}\n className={`\n inline-flex items-center rounded-full border transition-colors\n ${sizeClasses[size]}\n ${isActive\n ? `${config.activeColor} border-transparent`\n : 'border-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700'\n }\n `}\n title={t(config.labelKey)}\n >\n {config.emoji}\n {t(config.labelKey)}\n {count > 0 && (\n {count}\n )}\n \n );\n })}\n
\n );\n};\n\nexport default PostReactions;\n","/**\n * RichTextEditor 컴포넌트\n *\n * 게시글 작성을 위한 리치 텍스트 에디터입니다.\n * TipTap 또는 Quill 등의 외부 라이브러리를 래핑합니다.\n *\n * @note 실제 구현 시 TipTap, Quill, CKEditor 등 선택하여 래핑\n */\n\nimport React, { useEffect, useRef, useState } from 'react';\nimport { Div } from '../basic/Div';\n\n// Logger 설정 (G7Core 초기화 전에도 동작하도록 폴백 포함)\nconst logger = ((window as any).G7Core?.createLogger?.('Comp:RichTextEditor')) ?? {\n log: (...args: unknown[]) => console.log('[Comp:RichTextEditor]', ...args),\n warn: (...args: unknown[]) => console.warn('[Comp:RichTextEditor]', ...args),\n error: (...args: unknown[]) => console.error('[Comp:RichTextEditor]', ...args),\n};\nimport { Button } from '../basic/Button';\nimport { Input } from '../basic/Input';\nimport { Textarea } from '../basic/Textarea';\nimport { H3 } from '../basic/H3';\nimport { Label } from '../basic/Label';\nimport type { EditorAttrs } from '../../types';\n\n// G7Core.t() 번역 함수 참조\nconst t = (key: string, params?: Record) =>\n (window as any).G7Core?.t?.(key, params) ?? key;\n\ninterface RichTextEditorProps {\n /** 필드 이름 */\n name: string;\n /** 초기 HTML 값 */\n initialValue?: string;\n /** 플레이스홀더 */\n placeholder?: string;\n /** 값 변경 콜백 */\n onChange?: (html: string) => void;\n /** 이미지 업로드 URL */\n imageUploadUrl?: string;\n /** 최소 높이 */\n minHeight?: string;\n /** 비활성화 여부 */\n disabled?: boolean;\n /** 추가 CSS 클래스 */\n className?: string;\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n/**\n * 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread)\n */\n editorAttrs?: EditorAttrs;\n}\n\ntype FormatType =\n | 'bold'\n | 'italic'\n | 'underline'\n | 'strike'\n | 'code'\n | 'h1'\n | 'h2'\n | 'h3'\n | 'bulletList'\n | 'orderedList'\n | 'blockquote'\n | 'link'\n | 'image';\n\n/**\n * 리치 텍스트 에디터 컴포넌트\n *\n * @example\n * ```tsx\n * setContent(html)}\n * />\n * ```\n *\n * @example\n * ```json\n * // 레이아웃 JSON에서 사용\n * {\n * \"type\": \"composite\",\n * \"name\": \"RichTextEditor\",\n * \"props\": {\n * \"name\": \"content\",\n * \"placeholder\": \"$t:board.form.content_placeholder\",\n * \"initialValue\": \"{{post.data?.content ?? ''}}\"\n * }\n * }\n * ```\n */\nconst RichTextEditor: React.FC = ({\n name,\n initialValue = '',\n placeholder,\n onChange,\n imageUploadUrl = '/api/upload/image',\n minHeight = '300px',\n disabled = false,\n className = '',\n id,\n editorAttrs,\n}) => {\n const editorRef = useRef(null);\n const [content, setContent] = useState(initialValue);\n const [showCodeView, setShowCodeView] = useState(false);\n const [showLinkModal, setShowLinkModal] = useState(false);\n const [linkUrl, setLinkUrl] = useState('');\n\n // 에디터 초기화 (실제 구현 시 TipTap/Quill 초기화)\n useEffect(() => {\n // 초기값 설정 (dangerouslySetInnerHTML 대신 직접 설정)\n if (editorRef.current && !editorRef.current.innerHTML) {\n editorRef.current.innerHTML = initialValue;\n }\n }, [initialValue]);\n\n // 값 변경 시 콜백 호출\n useEffect(() => {\n if (onChange) {\n onChange(content);\n }\n }, [content, onChange]);\n\n // 포맷 적용 (실제 구현 시 에디터 API 사용)\n const applyFormat = (format: FormatType) => {\n // TODO: 에디터 라이브러리의 포맷 API 호출\n logger.log('Apply format:', format);\n };\n\n // 이미지 업로드\n const handleImageUpload = async (file: File) => {\n const formData = new FormData();\n formData.append('file', file);\n\n try {\n const response = await fetch(imageUploadUrl, {\n method: 'POST',\n body: formData,\n credentials: 'include',\n });\n\n if (!response.ok) throw new Error('업로드 실패');\n\n const data = await response.json();\n // TODO: 에디터에 이미지 삽입\n logger.log('Image uploaded:', data.url);\n } catch (error) {\n logger.error('이미지 업로드 오류:', error);\n }\n };\n\n // 파일 선택 핸들러\n const handleFileSelect = (e: React.ChangeEvent) => {\n const file = e.target.files?.[0];\n if (file) {\n handleImageUpload(file);\n }\n };\n\n // 링크 삽입\n const insertLink = () => {\n if (linkUrl) {\n // TODO: 에디터에 링크 삽입\n logger.log('Insert link:', linkUrl);\n setShowLinkModal(false);\n setLinkUrl('');\n }\n };\n\n const toolbarButtons: { format: FormatType; icon: React.ReactNode; title: string }[] = [\n { format: 'bold', icon: 'B', title: t('editor.toolbar.bold') },\n { format: 'italic', icon: 'I', title: t('editor.toolbar.italic') },\n { format: 'underline', icon: 'U', title: t('editor.toolbar.underline') },\n { format: 'strike', icon: 'S', title: t('editor.toolbar.strike') },\n { format: 'code', icon: '', title: t('editor.toolbar.code') },\n ];\n\n const headingButtons: { format: FormatType; label: string }[] = [\n { format: 'h1', label: 'H1' },\n { format: 'h2', label: 'H2' },\n { format: 'h3', label: 'H3' },\n ];\n\n const listButtons: { format: FormatType; icon: string; title: string }[] = [\n { format: 'bulletList', icon: '•', title: t('editor.toolbar.bullet_list') },\n { format: 'orderedList', icon: '1.', title: t('editor.toolbar.ordered_list') },\n { format: 'blockquote', icon: '❝', title: t('editor.toolbar.blockquote') },\n ];\n\n return (\n
\n {/* 툴바 */}\n
\n {/* 텍스트 포맷 */}\n
\n {toolbarButtons.map((btn) => (\n applyFormat(btn.format)}\n disabled={disabled}\n className=\"w-8 h-8 flex items-center justify-center text-sm font-medium text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 rounded disabled:opacity-50\"\n title={btn.title}\n >\n {btn.icon}\n \n ))}\n
\n\n {/* 제목 */}\n
\n {headingButtons.map((btn) => (\n applyFormat(btn.format)}\n disabled={disabled}\n className=\"px-2 h-8 text-sm font-medium text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 rounded disabled:opacity-50\"\n >\n {btn.label}\n \n ))}\n
\n\n {/* 리스트 */}\n
\n {listButtons.map((btn) => (\n applyFormat(btn.format)}\n disabled={disabled}\n className=\"w-8 h-8 flex items-center justify-center text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 rounded disabled:opacity-50\"\n title={btn.title}\n >\n {btn.icon}\n \n ))}\n
\n\n {/* 미디어 */}\n
\n setShowLinkModal(true)}\n disabled={disabled}\n className=\"w-8 h-8 flex items-center justify-center text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 rounded disabled:opacity-50\"\n title={t('editor.toolbar.link')}\n >\n 🔗\n \n \n
\n\n {/* 코드 보기 토글 */}\n setShowCodeView(!showCodeView)}\n disabled={disabled}\n className={`px-2 h-8 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-200 dark:hover:bg-gray-700 rounded disabled:opacity-50 ${\n showCodeView ? 'bg-gray-200 dark:bg-gray-700' : ''\n }`}\n >\n {''}\n {t('editor.toolbar.code_view')}\n \n
\n\n {/* 에디터 영역 */}\n {showCodeView ? (\n setContent(e.target.value)}\n placeholder={placeholder}\n disabled={disabled}\n className=\"w-full p-4 bg-gray-900 text-gray-100 font-mono text-sm focus:outline-none resize-none\"\n style={{ minHeight }}\n />\n ) : (\n setContent(e.currentTarget.innerHTML)}\n className=\"p-4 bg-white dark:bg-gray-900 text-gray-900 dark:text-white focus:outline-none prose dark:prose-invert max-w-none\"\n style={{ minHeight }}\n data-placeholder={placeholder}\n />\n )}\n\n {/* 숨겨진 input (폼 전송용) */}\n \n\n {/* 링크 모달 */}\n {showLinkModal && (\n
\n
\n

\n {t('editor.link_modal.title')}\n

\n setLinkUrl(e.target.value)}\n placeholder=\"https://example.com\"\n className=\"w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-700 text-gray-900 dark:text-white mb-4\"\n />\n
\n {\n setShowLinkModal(false);\n setLinkUrl('');\n }}\n className=\"px-4 py-2 text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg\"\n >\n {t('common.cancel')}\n \n \n {t('editor.link_modal.insert')}\n \n
\n
\n
\n )}\n
\n );\n};\n\nexport default RichTextEditor;\n","import React, { useMemo } from 'react';\n// @ts-ignore - DOMPurify 타입 정의 없음\nimport DOMPurify from 'dompurify';\nimport { Div } from '../basic/Div';\nimport type { EditorAttrs } from '../../types';\n\nexport interface HtmlContentProps {\n /**\n * 콘텐츠 (HTML 또는 일반 텍스트)\n */\n content?: string;\n\n /**\n * 콘텐츠가 HTML 형식인지 여부\n * - true: HTML 렌더링 (DOMPurify 적용, prose 스타일)\n * - false: 일반 텍스트 (whitespace-pre-wrap으로 줄바꿈 보존)\n * @default true\n */\n isHtml?: boolean;\n\n /**\n * 사용자 정의 클래스\n */\n className?: string;\n\n /**\n * DOMPurify 설정 오버라이드 (isHtml=true일 때만 사용)\n */\n purifyConfig?: any;\n\n /**\n * 레이아웃 JSON에서 text 속성으로 전달되는 콘텐츠\n * content보다 우선순위가 높음\n */\n text?: string;\n\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n/**\n * 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread)\n */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * HtmlContent 콘텐츠 렌더링 컴포넌트\n *\n * HTML과 일반 텍스트를 안전하게 렌더링하는 범용 composite 컴포넌트입니다.\n * - isHtml=true: DOMPurify를 사용하여 XSS 공격 방지\n * - isHtml=false: 일반 텍스트로 렌더링 (줄바꿈 보존)\n *\n * @example\n * // HTML 렌더링 (기본값)\n * 안녕하세요

\" />\n *\n * // 일반 텍스트 렌더링\n * \n *\n * // 커스텀 클래스 적용\n * 게시글 내용

\"\n * className=\"prose dark:prose-invert\"\n * />\n *\n * // DOMPurify 설정 커스터마이징 (HTML 모드)\n * 내용

\"\n * purifyConfig={{ ALLOWED_TAGS: ['p', 'br', 'strong', 'em'] }}\n * />\n */\nexport const HtmlContent: React.FC = ({\n content,\n text,\n isHtml = true,\n className = '',\n purifyConfig,\n id,\n editorAttrs,\n}) => {\n // text prop이 우선순위가 높음 (레이아웃 JSON에서 사용)\n const actualContent = text ?? content ?? '';\n\n // 빈 값 처리\n if (!actualContent || actualContent.trim() === '') {\n return null;\n }\n\n // isHtml=false: 일반 텍스트 렌더링\n if (!isHtml) {\n const textClasses = `\n whitespace-pre-wrap\n text-gray-900 dark:text-gray-100\n font-sans\n ${className}\n `.trim().replace(/\\s+/g, ' ');\n\n return (\n
\n {actualContent}\n
\n );\n }\n\n // 기본 DOMPurify 설정 (FORBID 방식: 위험 태그/속성만 차단, 나머지 허용)\n const defaultConfig: any = {\n FORBID_TAGS: [\n // 스크립트 실행\n 'script', 'noscript',\n // 외부 콘텐츠 삽입\n 'iframe', 'frame', 'frameset', 'object', 'embed', 'applet', 'portal',\n // 폼 요소 (피싱 방지)\n 'form', 'input', 'textarea', 'select', 'button',\n // 메타/스타일 조작\n 'style', 'link', 'meta', 'base',\n // 구조 태그 주입\n 'body', 'head', 'html', 'title',\n // SVG/MathML (XSS 벡터)\n 'svg', 'math',\n // 미디어 이벤트 핸들러 (onerror, onloadstart)\n 'audio', 'video', 'source', 'track', 'canvas',\n // UI 오버레이/이벤트\n 'details', 'dialog',\n // HTML 파서 혼란/sanitizer 우회\n 'plaintext', 'xmp', 'listing',\n // 레거시/비표준\n 'marquee', 'noframes', 'noembed', 'template', 'slot',\n ],\n FORBID_ATTR: [\n 'onerror', 'onload', 'onclick', 'onmouseover', 'onfocus', 'onblur',\n 'ontoggle', 'oncanplay', 'onloadstart',\n 'formaction', 'xlink:href', 'action',\n ],\n ALLOW_DATA_ATTR: true,\n ADD_ATTR: ['target'],\n };\n\n // sanitize된 HTML을 메모이제이션\n const sanitizedHtml = useMemo(() => {\n const config = purifyConfig\n ? {\n ...defaultConfig,\n ...purifyConfig,\n // 보안 기본값은 항상 유지 (사용자 설정으로 덮어쓰기 방지)\n FORBID_TAGS: [...defaultConfig.FORBID_TAGS, ...(purifyConfig.FORBID_TAGS || [])],\n FORBID_ATTR: [...defaultConfig.FORBID_ATTR, ...(purifyConfig.FORBID_ATTR || [])],\n }\n : defaultConfig;\n const cleaned = DOMPurify.sanitize(actualContent, config) as unknown as string;\n\n // target=\"_blank\" 링크에 rel 속성 추가 (보안)\n return cleaned.replace(\n /]*?)href=[\"']([^\"']+)[\"']([^>]*?)>/gi,\n (match: string, before: string, href: string, after: string) => {\n if (href.startsWith('http://') || href.startsWith('https://')) {\n if (!match.includes('rel=')) {\n return ``;\n }\n }\n return match;\n }\n );\n }, [actualContent, purifyConfig]);\n\n // 컨테이너 클래스 조합\n const containerClasses = `\n prose dark:prose-invert max-w-none\n prose-p:my-2\n prose-headings:font-bold prose-headings:mt-6 prose-headings:mb-4\n prose-h1:text-2xl prose-h2:text-xl prose-h3:text-lg\n prose-a:text-blue-600 dark:prose-a:text-blue-400\n prose-a:no-underline hover:prose-a:underline\n prose-blockquote:border-l-4 prose-blockquote:border-gray-300 dark:prose-blockquote:border-gray-600\n prose-blockquote:pl-4 prose-blockquote:italic\n prose-code:bg-gray-100 dark:prose-code:bg-gray-800\n prose-code:px-1 prose-code:py-0.5 prose-code:rounded\n prose-pre:bg-gray-100 dark:prose-pre:bg-gray-800\n prose-pre:p-4 prose-pre:rounded-lg prose-pre:overflow-x-auto\n [&_table]:w-full [&_table]:border-collapse [&_table]:border [&_table]:border-gray-300\n dark:[&_table]:border-gray-600\n [&_th]:border [&_th]:border-gray-300 [&_th]:px-4 [&_th]:py-2 [&_th]:bg-gray-100 [&_th]:text-left\n dark:[&_th]:border-gray-600 dark:[&_th]:bg-gray-800\n [&_td]:border [&_td]:border-gray-300 [&_td]:px-4 [&_td]:py-2\n dark:[&_td]:border-gray-600\n [&_tr:hover]:bg-gray-50 dark:[&_tr:hover]:bg-gray-700/50\n after:content-[''] after:block after:clear-both\n ${className}\n `.trim().replace(/\\s+/g, ' ');\n\n return (\n \n );\n};\n","import React, { useCallback, useState } from 'react';\nimport { Div } from '../basic/Div';\nimport { Label } from '../basic/Label';\nimport { Button } from '../basic/Button';\nimport { Textarea } from '../basic/Textarea';\nimport { Input } from '../basic/Input';\nimport { HtmlContent } from './HtmlContent';\nimport type { EditorAttrs } from '../../types';\n\n// G7Core 참조\nconst G7Core = () => (window as any).G7Core;\n\n// G7Core.t() 번역 함수 참조\nconst t = (key: string, params?: Record) =>\n G7Core()?.t?.(key, params) ?? key;\n\nexport interface HtmlEditorProps {\n /**\n * 콘텐츠 값\n */\n content?: string;\n\n /**\n * 콘텐츠 변경 콜백\n * Form 자동 바인딩을 위해 이벤트 객체 형식으로 전달\n */\n onChange?: (event: { target: { name: string; value: string } }) => void;\n\n /**\n * HTML 모드 여부 (미리보기 버튼 표시 조건)\n * 자동 바인딩된 값을 Layout JSON에서 전달받아 사용\n */\n isHtml?: boolean;\n\n /**\n * HTML 모드 변경 콜백\n * Form 자동 바인딩을 위해 이벤트 객체 형식으로 전달\n */\n onIsHtmlChange?: (event: { target: { name: string; checked: boolean } }) => void;\n\n /**\n * Textarea 행 수\n * @default 15\n */\n rows?: number;\n\n /**\n * placeholder 텍스트\n */\n placeholder?: string;\n\n /**\n * 라벨 텍스트\n */\n label?: string;\n\n /**\n * HTML 모드 체크박스 표시 여부\n * @default true\n */\n showHtmlModeToggle?: boolean;\n\n /**\n * HtmlContent 렌더링 시 적용할 클래스\n */\n contentClassName?: string;\n\n /**\n * DOMPurify 설정 (HTML 모드)\n */\n purifyConfig?: any;\n\n /**\n * 추가 className\n */\n className?: string;\n\n /**\n * 콘텐츠 필드 name 속성\n * @default 'content'\n */\n name?: string;\n\n /**\n * HTML 모드 체크박스 name 속성\n * @default 'content_mode'\n */\n htmlFieldName?: string;\n\n /**\n * 읽기 전용 모드\n */\n readOnly?: boolean;\n\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n/**\n * 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread)\n */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * HtmlEditor 컴포넌트\n *\n * HTML과 일반 텍스트를 편집할 수 있는 범용 에디터 컴포넌트입니다.\n * - HTML 모드 체크박스는 자동 바인딩됩니다 (htmlFieldName prop 사용)\n * - HTML 모드에서는 편집/미리보기 토글 가능 (내부 상태 관리)\n * - 일반 텍스트 모드에서는 Textarea만 표시\n *\n * @example\n * // Layout JSON에서 사용 (자동 바인딩)\n * {\n * \"type\": \"composite\",\n * \"name\": \"HtmlEditor\",\n * \"props\": {\n * \"content\": \"{{_local.form?.content}}\",\n * \"name\": \"content\",\n * \"htmlFieldName\": \"content_mode\"\n * }\n * }\n */\nexport const HtmlEditor: React.FC = ({\n content = '',\n onChange,\n isHtml: isHtmlProp = false,\n onIsHtmlChange,\n rows = 15,\n placeholder = '',\n label,\n showHtmlModeToggle = true,\n contentClassName = '',\n purifyConfig,\n className = '',\n name = 'content',\n htmlFieldName = 'content_mode',\n readOnly = false,\n id,\n editorAttrs,\n}) => {\n // HTML 모드 내부 상태 (Toggle과 동기화)\n const [isHtml, setIsHtml] = useState(isHtmlProp);\n\n // 콘텐츠 내부 상태 (입력값 즉시 반영용)\n const [localContent, setLocalContent] = useState(content);\n\n // 미리보기 모드 내부 상태 (컴포넌트 자체에서 관리)\n const [previewMode, setPreviewMode] = useState(false);\n\n // Props 변경 시 내부 상태 동기화\n React.useEffect(() => {\n setIsHtml(isHtmlProp);\n }, [isHtmlProp]);\n\n // content prop 변경 시 로컬 상태 동기화\n React.useEffect(() => {\n setLocalContent(content);\n }, [content]);\n\n // 콘텐츠 변경 핸들러\n const handleContentChange = useCallback((e: React.ChangeEvent) => {\n const newContent = e.target.value;\n\n // 로컬 상태 즉시 업데이트 (입력 반응성)\n setLocalContent(newContent);\n\n // Props 콜백 호출 (G7Core.createChangeEvent 사용으로 ActionDispatcher 호환성 확보)\n if (onChange) {\n const event = G7Core()?.createChangeEvent?.({ value: newContent, name, type: 'textarea' })\n ?? { target: { name, value: newContent } };\n onChange(event);\n }\n }, [onChange, name]);\n\n // HTML 모드 변경 핸들러\n const handleHtmlModeChange = useCallback((e: React.ChangeEvent) => {\n const isHtmlMode = e.target.checked;\n\n // 로컬 상태 즉시 업데이트 (미리보기 버튼 표시용)\n setIsHtml(isHtmlMode);\n\n // HTML 모드 비활성화 시 미리보기 모드도 함께 비활성화\n if (!isHtmlMode) {\n setPreviewMode(false);\n }\n\n // Props 콜백 호출 (G7Core.createChangeEvent 사용으로 ActionDispatcher 호환성 확보)\n if (onIsHtmlChange) {\n const event = G7Core()?.createChangeEvent?.({ checked: isHtmlMode, name: htmlFieldName, type: 'checkbox' })\n ?? { target: { name: htmlFieldName, checked: isHtmlMode } };\n onIsHtmlChange(event);\n }\n }, [onIsHtmlChange, htmlFieldName]);\n\n // 미리보기 모드 토글 핸들러 (내부 상태만 변경)\n const handlePreviewModeToggle = useCallback(() => {\n setPreviewMode(prev => !prev);\n }, []);\n\n return (\n
\n {/* 라벨 및 HTML 모드 토글 */}\n
\n\n {label && (\n \n )}\n\n
\n {/* 미리보기 버튼 (HTML 모드일 때만 표시) */}\n {isHtml && !readOnly && (\n \n {previewMode ? t('common.preview_off') : t('common.preview')}\n \n )}\n\n {showHtmlModeToggle && (\n \n )}\n
\n
\n\n {/* 콘텐츠 편집 영역 */}\n {!previewMode && (\n \n )}\n\n {/* 미리보기 영역 (미리보기 모드일 때만) */}\n {previewMode && (\n
\n \n
\n )}\n\n
\n );\n};\n","import React, { useState, useRef, useEffect, useCallback } from 'react';\nimport { Div } from '../basic/Div';\nimport { Button } from '../basic/Button';\nimport { Span } from '../basic/Span';\nimport { Icon } from '../basic/Icon';\nimport type { EditorAttrs } from '../../types';\n\n/**\n * G7Core 다국어 헬퍼\n *\n * @param key 다국어 키\n * @return 번역된 문자열\n */\nconst t = (key: string): string =>\n (window as any).G7Core?.t?.(key) ?? key;\n\nexport interface ExpandableContentProps {\n /**\n * 접힌 상태의 최대 높이 (px)\n * @default 500\n */\n maxHeight?: number;\n\n /**\n * 펼치기 버튼 텍스트\n */\n expandText?: string;\n\n /**\n * 접기 버튼 텍스트\n */\n collapseText?: string;\n\n /**\n * 사용자 정의 클래스\n */\n className?: string;\n\n /**\n * children 렌더링\n */\n children?: React.ReactNode;\n\n /**\n * DOM id 속성 (레이아웃 편집기 코어 일괄 ID)\n */\n id?: string;\n/**\n * 레이아웃 편집기 주입 속성 (편집 모드 전용, 루트에 spread)\n */\n editorAttrs?: EditorAttrs;\n}\n\n/**\n * ExpandableContent 컴포넌트\n *\n * 콘텐츠가 maxHeight를 초과하면 그라데이션 오버레이와 펼치기/접기 버튼을 표시합니다.\n * 콘텐츠가 짧으면 버튼/그라데이션 없이 전체 콘텐츠를 그대로 표시합니다.\n *\n * @example\n * // 레이아웃 JSON에서 사용\n * {\n * \"type\": \"composite\",\n * \"name\": \"ExpandableContent\",\n * \"props\": { \"maxHeight\": 500 },\n * \"children\": [\n * {\n * \"type\": \"composite\",\n * \"name\": \"HtmlContent\",\n * \"props\": { \"content\": \"{{product.data?.description_localized ?? ''}}\" }\n * }\n * ]\n * }\n */\nexport const ExpandableContent: React.FC = ({\n maxHeight = 500,\n expandText,\n collapseText,\n className = '',\n children,\n id,\n editorAttrs,\n}) => {\n const [isExpanded, setIsExpanded] = useState(false);\n const [needsExpand, setNeedsExpand] = useState(false);\n const contentRef = useRef(null);\n\n /**\n * 콘텐츠 높이를 측정하여 펼치기 버튼 필요 여부를 결정합니다.\n */\n const checkHeight = useCallback(() => {\n if (contentRef.current) {\n const scrollHeight = contentRef.current.scrollHeight;\n setNeedsExpand(scrollHeight > maxHeight);\n }\n }, [maxHeight]);\n\n useEffect(() => {\n checkHeight();\n\n // 이미지 로드 후 높이 재측정\n const container = contentRef.current;\n if (!container) return;\n\n const images = container.querySelectorAll('img');\n images.forEach((img) => {\n if (!img.complete) {\n img.addEventListener('load', checkHeight);\n }\n });\n\n // ResizeObserver로 동적 콘텐츠 변경 감지\n let observer: ResizeObserver | null = null;\n if (typeof ResizeObserver !== 'undefined') {\n observer = new ResizeObserver(checkHeight);\n observer.observe(container);\n }\n\n return () => {\n images.forEach((img) => {\n img.removeEventListener('load', checkHeight);\n });\n observer?.disconnect();\n };\n }, [checkHeight, children]);\n\n const toggleExpand = () => {\n setIsExpanded((prev) => !prev);\n };\n\n const resolvedExpandText = expandText || t('sirsoft-ecommerce.shop.product.expand_detail');\n const resolvedCollapseText = collapseText || t('sirsoft-ecommerce.shop.product.collapse_detail');\n\n return (\n
\n {/* 콘텐츠 컨테이너 */}\n
\n \n {children}\n
\n\n {/* 그라데이션 오버레이 */}\n {!isExpanded && needsExpand && (\n
\n )}\n
\n\n {/* 펼치기/접기 버튼 (전체 너비 바 스타일) */}\n {needsExpand && (\n \n \n {isExpanded ? resolvedCollapseText : resolvedExpandText}\n \n \n \n )}\n
\n );\n};\n\nexport default ExpandableContent;\n","import React, { useEffect, useRef } from 'react';\nimport { Div } from '../basic/Div';\nimport { Button } from '../basic/Button';\nimport { Icon } from '../basic/Icon';\n\n// G7Core.t() 번역 함수 참조\nconst t = (key: string, params?: Record) =>\n (window as any).G7Core?.t?.(key, params) ?? key;\n\nexport interface ModalProps {\n isOpen: boolean;\n onClose: () => void;\n title?: string;\n /**\n * 타이틀 옆에 표시할 아이콘 이름 (Font Awesome)\n * @example \"lock\", \"trash\", \"warning\"\n */\n icon?: string;\n /**\n * 아이콘 색상 클래스 (Tailwind)\n * @default \"text-gray-500\"\n */\n iconClassName?: string;\n /**\n * Backdrop(오버레이) 클릭 시 모달 닫기 여부\n * @default true\n */\n closeOnBackdropClick?: boolean;\n /**\n * closeOnOverlayClick 별칭 (레이아웃 JSON 호환)\n * @default true\n */\n closeOnOverlayClick?: boolean;\n /**\n * 헤더 닫기 버튼 표시 여부\n * @default true\n */\n showCloseButton?: boolean;\n /**\n * ESC 키로 모달 닫기 허용 여부\n * @default true\n */\n closeOnEscape?: boolean;\n children?: React.ReactNode;\n width?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\n/**\n * Modal 집합 컴포넌트\n *\n * Div + Button 기본 컴포넌트를 조합하여 모달 UI를 구성합니다.\n * ESC 키 닫기, 포커스 트랩, 오버레이 클릭 닫기 기능을 포함합니다.\n *\n * @example\n * // 레이아웃 JSON 사용 예시\n * {\n * \"name\": \"Modal\",\n * \"props\": {\n * \"isOpen\": \"{{modals.userEdit}}\",\n * \"title\": \"사용자 편집\",\n * \"width\": \"600px\"\n * },\n * \"children\": [...]\n * }\n */\nexport const Modal: React.FC = ({\n isOpen,\n onClose,\n title,\n icon,\n iconClassName = 'text-gray-500 dark:text-gray-400',\n closeOnBackdropClick = true,\n closeOnOverlayClick,\n showCloseButton = true,\n closeOnEscape = true,\n children,\n width = '500px',\n className = '',\n style,\n}) => {\n // closeOnOverlayClick 별칭 지원 (레이아웃 JSON 호환)\n const shouldCloseOnBackdrop = closeOnOverlayClick !== undefined\n ? closeOnOverlayClick\n : closeOnBackdropClick;\n const modalRef = useRef(null);\n const previousFocusRef = useRef(null);\n\n // ESC 키로 모달 닫기\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && isOpen && closeOnEscape) {\n onClose();\n }\n };\n\n if (isOpen && closeOnEscape) {\n document.addEventListener('keydown', handleEscape);\n return () => document.removeEventListener('keydown', handleEscape);\n }\n }, [isOpen, onClose, closeOnEscape]);\n\n // 포커스 트랩\n useEffect(() => {\n if (isOpen && modalRef.current) {\n // 모달 열릴 때 현재 포커스 저장\n previousFocusRef.current = document.activeElement as HTMLElement;\n\n // 모달 내부 포커스 가능한 요소들\n const focusableElements = modalRef.current.querySelectorAll(\n 'button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'\n );\n\n const firstElement = focusableElements[0] as HTMLElement;\n const lastElement = focusableElements[focusableElements.length - 1] as HTMLElement;\n\n // 첫 번째 요소에 포커스\n firstElement?.focus();\n\n // Tab 키 핸들러 (포커스 트랩)\n const handleTab = (event: KeyboardEvent) => {\n if (event.key !== 'Tab') return;\n\n if (event.shiftKey) {\n // Shift + Tab\n if (document.activeElement === firstElement) {\n event.preventDefault();\n lastElement?.focus();\n }\n } else {\n // Tab\n if (document.activeElement === lastElement) {\n event.preventDefault();\n firstElement?.focus();\n }\n }\n };\n\n document.addEventListener('keydown', handleTab);\n\n return () => {\n document.removeEventListener('keydown', handleTab);\n // 모달 닫힐 때 이전 포커스 복원\n previousFocusRef.current?.focus();\n };\n }\n }, [isOpen]);\n\n // body 스크롤 방지\n useEffect(() => {\n if (isOpen) {\n document.body.style.overflow = 'hidden';\n return () => {\n document.body.style.overflow = '';\n };\n }\n }, [isOpen]);\n\n if (!isOpen) return null;\n\n // z-index를 style에서 가져오거나 기본값 50 사용\n const zIndex = style?.zIndex ?? 50;\n\n return (\n \n {/* Overlay */}\n \n\n {/* Modal Content */}\n e.stopPropagation()}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={title ? 'modal-title' : undefined}\n >\n {/* Header */}\n {(title || icon || showCloseButton) && (\n
\n {(title || icon) && (\n \n {icon && }\n {title}\n
\n )}\n {showCloseButton && (\n \n \n \n \n \n )}\n
\n )}\n\n {/* Body */}\n
\n {children}\n
\n
\n
\n );\n};\n","import React from 'react';\nimport { Modal } from './Modal';\nimport { Div } from '../basic/Div';\nimport { Button } from '../basic/Button';\nimport { P } from '../basic/P';\nimport { Span } from '../basic/Span';\nimport { I } from '../basic/I';\n\n// G7Core.t() 번역 함수 참조\nconst t = (key: string, params?: Record) =>\n (window as any).G7Core?.t?.(key, params) ?? key;\n\nexport interface ConfirmDialogProps {\n isOpen: boolean;\n onClose: () => void;\n title: string;\n message: string | React.ReactNode;\n confirmText?: string;\n cancelText?: string;\n onConfirm: () => void;\n onCancel?: () => void;\n confirmButtonVariant?: 'primary' | 'secondary' | 'danger' | 'ghost';\n cancelButtonVariant?: 'primary' | 'secondary' | 'danger' | 'ghost';\n width?: string;\n closeOnOverlay?: boolean;\n /** 로딩 중 여부 (확인 버튼 비활성화 및 텍스트 변경) */\n isLoading?: boolean;\n /** 로딩 중 확인 버튼에 표시할 텍스트 */\n loadingText?: string;\n}\n\n/**\n * ConfirmDialog 집합 컴포넌트\n *\n * Modal 기반 확인/취소 다이얼로그 컴포넌트.\n * 사용자에게 확인을 요청하고 확인/취소 중 하나를 선택하도록 합니다.\n *\n * 기본 컴포넌트 조합:\n * - Modal > P(message) + Button(확인) + Button(취소)\n *\n * @example\n * // 레이아웃 JSON 사용 예시\n * {\n * \"name\": \"ConfirmDialog\",\n * \"props\": {\n * \"isOpen\": \"{{dialogs.deleteConfirm}}\",\n * \"title\": \"삭제 확인\",\n * \"message\": \"정말 이 항목을 삭제하시겠습니까?\",\n * \"confirmText\": \"삭제\",\n * \"cancelText\": \"$t:common.cancel\",\n * \"confirmButtonVariant\": \"danger\"\n * }\n * }\n */\nexport const ConfirmDialog: React.FC = ({\n isOpen,\n onClose,\n title,\n message,\n confirmText,\n cancelText,\n onConfirm,\n onCancel,\n confirmButtonVariant = 'primary',\n // cancelButtonVariant는 현재 고정 스타일 사용으로 미사용\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n cancelButtonVariant: _cancelButtonVariant = 'secondary',\n width = '500px',\n // closeOnOverlay는 Modal에서 처리하므로 미사용\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n closeOnOverlay: _closeOnOverlay = true,\n isLoading = false,\n loadingText,\n}) => {\n // props로 전달된 값이 없으면 다국어 키 사용\n const resolvedConfirmText = confirmText ?? t('common.confirm');\n const resolvedCancelText = cancelText ?? t('common.cancel');\n const resolvedLoadingText = loadingText ?? t('common.loading');\n\n const handleConfirm = () => {\n onConfirm();\n };\n\n const handleCancel = () => {\n // 로딩 중에는 취소 불가\n if (isLoading) return;\n onCancel?.();\n onClose();\n };\n\n const handleClose = () => {\n // 로딩 중에는 닫기 불가\n if (isLoading) return;\n onClose();\n };\n\n // 버튼 variant별 스타일 매핑\n const confirmVariantClassMap: Record<'primary' | 'secondary' | 'danger' | 'ghost', string> = {\n primary: 'bg-blue-600 text-white hover:bg-blue-700',\n secondary: 'bg-gray-200 dark:bg-gray-700 text-gray-800 dark:text-gray-200 hover:bg-gray-300 dark:hover:bg-gray-600',\n danger: 'bg-red-600 text-white hover:bg-red-700',\n ghost: 'bg-transparent text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700',\n };\n\n return (\n \n {/* 본문 */}\n
\n {typeof message === 'string' ? (\n

{message}

\n ) : (\n message\n )}\n
\n\n {/* 푸터 (버튼 영역) */}\n
\n {/* 취소 버튼 */}\n \n {resolvedCancelText}\n \n\n {/* 확인 버튼 */}\n \n {isLoading && (\n \n )}\n {isLoading ? resolvedLoadingText : resolvedConfirmText}\n \n
\n \n );\n};\n","/**\n * FileUploader Context\n *\n * 파일 업로더의 상태와 액션을 공유하는 Context입니다.\n *\n * @module composite/FileUploader/FileUploaderContext\n */\n\nimport React, { createContext, useContext } from 'react';\nimport type { Attachment, PendingFile, ApiEndpoints } from './types';\n\n// ========== Context Types ==========\n\nexport interface FileUploaderContextValue {\n // 상태\n existingFiles: Attachment[];\n pendingFiles: PendingFile[];\n isDragOver: boolean;\n isDeleting: boolean;\n\n // 설정\n maxFiles: number;\n maxSize: number;\n accept?: string;\n endpoints: ApiEndpoints;\n confirmBeforeRemove: boolean;\n\n // 계산된 값\n totalCount: number;\n hasFiles: boolean;\n canAddMore: boolean;\n allItems: (Attachment | PendingFile)[];\n imageFiles: (Attachment | PendingFile)[];\n\n // 액션\n handleFiles: (files: FileList) => Promise;\n handleRemove: (item: PendingFile | Attachment) => Promise;\n handleRetry: (pendingFile: PendingFile) => void;\n handleUploadAll: () => Promise;\n handleOpenGallery: (item: PendingFile | Attachment) => void;\n handleDownload: (item: Attachment) => Promise;\n handleDragEnd: (event: import('@dnd-kit/core').DragEndEvent) => Promise;\n\n // 드래그 상태 설정\n setIsDragOver: (value: boolean) => void;\n\n // Input ref\n inputRef: React.RefObject;\n\n // 갤러리 상태\n galleryOpen: boolean;\n setGalleryOpen: (value: boolean) => void;\n galleryStartIndex: number;\n galleryKeyRef: React.MutableRefObject;\n\n // 삭제 확인 모달 상태\n confirmDialogOpen: boolean;\n setConfirmDialogOpen: (value: boolean) => void;\n itemToDelete: Attachment | null;\n executeRemoveAttachment: (item: Attachment) => Promise;\n\n // 인증된 이미지 URL 캐시\n authenticatedImageUrls: Map;\n}\n\n// ========== Context ==========\n\nconst FileUploaderContext = createContext(null);\n\n/**\n * FileUploader Context Provider\n */\nexport const FileUploaderProvider: React.FC<{\n value: FileUploaderContextValue;\n children: React.ReactNode;\n}> = ({ value, children }) => {\n return (\n \n {children}\n \n );\n};\n\n/**\n * FileUploader Context 사용 훅\n */\nexport const useFileUploaderContext = (): FileUploaderContextValue => {\n const context = useContext(FileUploaderContext);\n if (!context) {\n throw new Error('useFileUploaderContext must be used within FileUploaderProvider');\n }\n return context;\n};\n\nexport default FileUploaderContext;","/**\n * Browser Image Compression\n * v2.0.2\n * by Donald \n * https://github.com/Donaldcwl/browser-image-compression\n */\n\nfunction _mergeNamespaces(e,t){return t.forEach((function(t){t&&\"string\"!=typeof t&&!Array.isArray(t)&&Object.keys(t).forEach((function(r){if(\"default\"!==r&&!(r in e)){var i=Object.getOwnPropertyDescriptor(t,r);Object.defineProperty(e,r,i.get?i:{enumerable:!0,get:function(){return t[r]}})}}))})),Object.freeze(e)}function copyExifWithoutOrientation(e,t){return new Promise((function(r,i){let o;return getApp1Segment(e).then((function(e){try{return o=e,r(new Blob([t.slice(0,2),o,t.slice(2)],{type:\"image/jpeg\"}))}catch(e){return i(e)}}),i)}))}const getApp1Segment=e=>new Promise(((t,r)=>{const i=new FileReader;i.addEventListener(\"load\",(({target:{result:e}})=>{const i=new DataView(e);let o=0;if(65496!==i.getUint16(o))return r(\"not a valid JPEG\");for(o+=2;;){const a=i.getUint16(o);if(65498===a)break;const s=i.getUint16(o+2);if(65505===a&&1165519206===i.getUint32(o+4)){const a=o+10;let f;switch(i.getUint16(a)){case 18761:f=!0;break;case 19789:f=!1;break;default:return r(\"TIFF header contains invalid endian\")}if(42!==i.getUint16(a+2,f))return r(\"TIFF header contains invalid version\");const l=i.getUint32(a+4,f),c=a+l+2+12*i.getUint16(a+l,f);for(let e=a+l+2;e>>24&255,i[r+1]=o>>>16&255,i[r+2]=o>>>8&255,i[r+3]=o>>>0&255,new Uint8Array(i.buffer,0,r+4)},UZIP.deflateRaw=function(e,t){null==t&&(t={level:6});var r=new Uint8Array(50+Math.floor(1.1*e.length)),i=UZIP.F.deflateRaw(e,r,i,t.level);return new Uint8Array(r.buffer,0,i)},UZIP.encode=function(e,t){null==t&&(t=!1);var r=0,i=UZIP.bin.writeUint,o=UZIP.bin.writeUshort,a={};for(var s in e){var f=!UZIP._noNeed(s)&&!t,l=e[s],c=UZIP.crc.crc(l,0,l.length);a[s]={cpr:f,usize:l.length,crc:c,file:f?UZIP.deflateRaw(l):l}}for(var s in a)r+=a[s].file.length+30+46+2*UZIP.bin.sizeUTF8(s);r+=22;var u=new Uint8Array(r),h=0,d=[];for(var s in a){var A=a[s];d.push(h),h=UZIP._writeHeader(u,h,s,A,0)}var g=0,p=h;for(var s in a){A=a[s];d.push(h),h=UZIP._writeHeader(u,h,s,A,1,d[g++])}var m=h-p;return i(u,h,101010256),h+=4,o(u,h+=4,g),o(u,h+=2,g),i(u,h+=2,m),i(u,h+=4,p),h+=4,h+=2,u.buffer},UZIP._noNeed=function(e){var t=e.split(\".\").pop().toLowerCase();return-1!=\"png,jpg,jpeg,zip\".indexOf(t)},UZIP._writeHeader=function(e,t,r,i,o,a){var s=UZIP.bin.writeUint,f=UZIP.bin.writeUshort,l=i.file;return s(e,t,0==o?67324752:33639248),t+=4,1==o&&(t+=2),f(e,t,20),f(e,t+=2,0),f(e,t+=2,i.cpr?8:0),s(e,t+=2,0),s(e,t+=4,i.crc),s(e,t+=4,l.length),s(e,t+=4,i.usize),f(e,t+=4,UZIP.bin.sizeUTF8(r)),f(e,t+=2,0),t+=2,1==o&&(t+=2,t+=2,s(e,t+=6,a),t+=4),t+=UZIP.bin.writeUTF8(e,t,r),0==o&&(e.set(l,t),t+=l.length),t},UZIP.crc={table:function(){for(var e=new Uint32Array(256),t=0;t<256;t++){for(var r=t,i=0;i<8;i++)1&r?r=3988292384^r>>>1:r>>>=1;e[t]=r}return e}(),update:function(e,t,r,i){for(var o=0;o>>8;return e},crc:function(e,t,r){return 4294967295^UZIP.crc.update(4294967295,e,t,r)}},UZIP.adler=function(e,t,r){for(var i=1,o=0,a=t,s=t+r;a>8&255},readUint:function(e,t){return 16777216*e[t+3]+(e[t+2]<<16|e[t+1]<<8|e[t])},writeUint:function(e,t,r){e[t]=255&r,e[t+1]=r>>8&255,e[t+2]=r>>16&255,e[t+3]=r>>24&255},readASCII:function(e,t,r){for(var i=\"\",o=0;o>6,e[t+o+1]=128|s>>0&63,o+=2;else if(0==(4294901760&s))e[t+o]=224|s>>12,e[t+o+1]=128|s>>6&63,e[t+o+2]=128|s>>0&63,o+=3;else{if(0!=(4292870144&s))throw\"e\";e[t+o]=240|s>>18,e[t+o+1]=128|s>>12&63,e[t+o+2]=128|s>>6&63,e[t+o+3]=128|s>>0&63,o+=4}}return o},sizeUTF8:function(e){for(var t=e.length,r=0,i=0;i>>3}var d=a.lits,A=a.strt,g=a.prev,p=0,m=0,w=0,v=0,b=0,y=0;for(h>2&&(A[y=UZIP.F._hash(e,0)]=0),l=0;l14e3||m>26697)&&h-l>100&&(u>>16,B=65535&F;if(0!=F){B=65535&F;var U=s(_=F>>>16,a.of0);a.lhst[257+U]++;var C=s(B,a.df0);a.dhst[C]++,v+=a.exb[U]+a.dxb[C],d[p]=_<<23|l-u,d[p+1]=B<<16|U<<8|C,p+=2,u=l+_}else a.lhst[e[l]]++;m++}}for(w==l&&0!=e.length||(u>>3},UZIP.F._bestMatch=function(e,t,r,i,o,a){var s=32767&t,f=r[s],l=s-f+32768&32767;if(f==s||i!=UZIP.F._hash(e,t-l))return 0;for(var c=0,u=0,h=Math.min(32767,t);l<=h&&0!=--a&&f!=s;){if(0==c||e[t+c]==e[t+c-l]){var d=UZIP.F._howLong(e,t,l);if(d>c){if(u=l,(c=d)>=o)break;l+2A&&(A=m,f=p)}}}l+=(s=f)-(f=r[s])+32768&32767}return c<<16|u},UZIP.F._howLong=function(e,t,r){if(e[t]!=e[t-r]||e[t+1]!=e[t+1-r]||e[t+2]!=e[t+2-r])return 0;var i=t,o=Math.min(e.length,t+258);for(t+=3;t>>23,T=M+(8388607&S);M>16,H=O>>8&255,L=255&O;y(f,l=UZIP.F._writeLit(257+H,C,f,l),R-v.of0[H]),l+=v.exb[H],b(f,l=UZIP.F._writeLit(L,I,f,l),P-v.df0[L]),l+=v.dxb[L],M+=R}}l=UZIP.F._writeLit(256,C,f,l)}return l},UZIP.F._copyExact=function(e,t,r,i,o){var a=o>>>3;return i[a]=r,i[a+1]=r>>>8,i[a+2]=255-i[a],i[a+3]=255-i[a+1],a+=4,i.set(new Uint8Array(e.buffer,t,r),a),o+(r+4<<3)},UZIP.F.getTrees=function(){for(var e=UZIP.F.U,t=UZIP.F._hufTree(e.lhst,e.ltree,15),r=UZIP.F._hufTree(e.dhst,e.dtree,15),i=[],o=UZIP.F._lenCodes(e.ltree,i),a=[],s=UZIP.F._lenCodes(e.dtree,a),f=0;f4&&0==e.itree[1+(e.ordr[c-1]<<1)];)c--;return[t,r,l,o,s,c,i,a]},UZIP.F.getSecond=function(e){for(var t=[],r=0;r>1)+\",\");return t},UZIP.F.contSize=function(e,t){for(var r=0,i=0;i15&&(UZIP.F._putsE(r,i,s,f),i+=f)}return i},UZIP.F._lenCodes=function(e,t){for(var r=e.length;2!=r&&0==e[r-1];)r-=2;for(var i=0;i>>1,138))<11?t.push(17,c-3):t.push(18,c-11),i+=2*c-2}else if(o==f&&a==o&&s==o){for(l=i+5;l+2>>1,6);t.push(16,c-3),i+=2*c-2}else t.push(o,0)}return r>>>1},UZIP.F._hufTree=function(e,t,r){var i=[],o=e.length,a=t.length,s=0;for(s=0;sr&&(UZIP.F.restrictDepth(l,r,p),p=r),s=0;st;i++){var s=e[i].d;e[i].d=t,a+=o-(1<>>=r-t;a>0;){(s=e[i].d)=0;i--)e[i].d==t&&a<0&&(e[i].d--,a++);0!=a&&console.log(\"debt left\")},UZIP.F._goodIndex=function(e,t){var r=0;return t[16|r]<=e&&(r|=16),t[8|r]<=e&&(r|=8),t[4|r]<=e&&(r|=4),t[2|r]<=e&&(r|=2),t[1|r]<=e&&(r|=1),r},UZIP.F._writeLit=function(e,t,r,i){return UZIP.F._putsF(r,i,t[e<<1]),i+t[1+(e<<1)]},UZIP.F.inflate=function(e,t){var r=Uint8Array;if(3==e[0]&&0==e[1])return t||new r(0);var i=UZIP.F,o=i._bitsF,a=i._bitsE,s=i._decodeTiny,f=i.makeCodes,l=i.codes2map,c=i._get17,u=i.U,h=null==t;h&&(t=new r(e.length>>>2<<3));for(var d,A,g=0,p=0,m=0,w=0,v=0,b=0,y=0,E=0,F=0;0==g;)if(g=o(e,F,1),p=o(e,F+1,2),F+=3,0!=p){if(h&&(t=UZIP.F._check(t,E+(1<<17))),1==p&&(d=u.flmap,A=u.fdmap,b=511,y=31),2==p){m=a(e,F,5)+257,w=a(e,F+5,5)+1,v=a(e,F+10,4)+4,F+=14;for(var _=0;_<38;_+=2)u.itree[_]=0,u.itree[_+1]=0;var B=1;for(_=0;_B&&(B=U)}F+=3*v,f(u.itree,B),l(u.itree,B,u.imap),d=u.lmap,A=u.dmap,F=s(u.imap,(1<>>4;if(M>>>8==0)t[E++]=M;else{if(256==M)break;var x=E+M-254;if(M>264){var S=u.ldef[M-257];x=E+(S>>>3)+a(e,F,7&S),F+=7&S}var R=A[c(e,F)&y];F+=15&R;var T=R>>>4,O=u.ddef[T],P=(O>>>4)+o(e,F,15&O);for(F+=15&O,h&&(t=UZIP.F._check(t,E+(1<<17)));E>>3),L=e[H-4]|e[H-3]<<8;h&&(t=UZIP.F._check(t,E+L)),t.set(new r(e.buffer,e.byteOffset+H,L),E),F=H+L<<3,E+=L}return t.length==E?t:t.slice(0,E)},UZIP.F._check=function(e,t){var r=e.length;if(t<=r)return e;var i=new Uint8Array(Math.max(r<<1,t));return i.set(e,0),i},UZIP.F._decodeTiny=function(e,t,r,i,o,a){for(var s=UZIP.F._bitsE,f=UZIP.F._get17,l=0;l>>4;if(u<=15)a[l]=u,l++;else{var h=0,d=0;16==u?(d=3+s(i,o,2),o+=2,h=a[l-1]):17==u?(d=3+s(i,o,3),o+=3):18==u&&(d=11+s(i,o,7),o+=7);for(var A=l+d;l>>1;ao&&(o=f),a++}for(;a>1,f=e[a+1],l=s<<4|f,c=t-f,u=e[a]<>>15-t]=l,u++}},UZIP.F.revCodes=function(e,t){for(var r=UZIP.F.U.rev15,i=15-t,o=0;o>>i}},UZIP.F._putsE=function(e,t,r){r<<=7&t;var i=t>>>3;e[i]|=r,e[i+1]|=r>>>8},UZIP.F._putsF=function(e,t,r){r<<=7&t;var i=t>>>3;e[i]|=r,e[i+1]|=r>>>8,e[i+2]|=r>>>16},UZIP.F._bitsE=function(e,t,r){return(e[t>>>3]|e[1+(t>>>3)]<<8)>>>(7&t)&(1<>>3]|e[1+(t>>>3)]<<8|e[2+(t>>>3)]<<16)>>>(7&t)&(1<>>3]|e[1+(t>>>3)]<<8|e[2+(t>>>3)]<<16)>>>(7&t)},UZIP.F._get25=function(e,t){return(e[t>>>3]|e[1+(t>>>3)]<<8|e[2+(t>>>3)]<<16|e[3+(t>>>3)]<<24)>>>(7&t)},UZIP.F.U=(r=Uint16Array,i=Uint32Array,{next_code:new r(16),bl_count:new r(16),ordr:[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],of0:[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,999,999,999],exb:[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0],ldef:new r(32),df0:[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,65535,65535],dxb:[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0],ddef:new i(32),flmap:new r(512),fltree:[],fdmap:new r(32),fdtree:[],lmap:new r(32768),ltree:[],ttree:[],dmap:new r(32768),dtree:[],imap:new r(512),itree:[],rev15:new r(32768),lhst:new i(286),dhst:new i(30),ihst:new i(19),lits:new i(15e3),strt:new r(65536),prev:new r(32768)}),function(){for(var e=UZIP.F.U,t=0;t<32768;t++){var r=t;r=(4278255360&(r=(4042322160&(r=(3435973836&(r=(2863311530&r)>>>1|(1431655765&r)<<1))>>>2|(858993459&r)<<2))>>>4|(252645135&r)<<4))>>>8|(16711935&r)<<8,e.rev15[t]=(r>>>16|r<<16)>>>17}function pushV(e,t,r){for(;0!=t--;)e.push(0,r)}for(t=0;t<32;t++)e.ldef[t]=e.of0[t]<<3|e.exb[t],e.ddef[t]=e.df0[t]<<4|e.dxb[t];pushV(e.fltree,144,8),pushV(e.fltree,112,9),pushV(e.fltree,24,7),pushV(e.fltree,8,8),UZIP.F.makeCodes(e.fltree,9),UZIP.F.codes2map(e.fltree,9,e.flmap),UZIP.F.revCodes(e.fltree,9),pushV(e.fdtree,32,5),UZIP.F.makeCodes(e.fdtree,5),UZIP.F.codes2map(e.fdtree,5,e.fdmap),UZIP.F.revCodes(e.fdtree,5),pushV(e.itree,19,0),pushV(e.ltree,286,0),pushV(e.dtree,30,0),pushV(e.ttree,320,0)}()}();var UZIP=_mergeNamespaces({__proto__:null,default:e},[e]);const UPNG=function(){var e={nextZero(e,t){for(;0!=e[t];)t++;return t},readUshort:(e,t)=>e[t]<<8|e[t+1],writeUshort(e,t,r){e[t]=r>>8&255,e[t+1]=255&r},readUint:(e,t)=>16777216*e[t]+(e[t+1]<<16|e[t+2]<<8|e[t+3]),writeUint(e,t,r){e[t]=r>>24&255,e[t+1]=r>>16&255,e[t+2]=r>>8&255,e[t+3]=255&r},readASCII(e,t,r){let i=\"\";for(let o=0;oe.length<2?`0${e}`:e,readUTF8(t,r,i){let o,a=\"\";for(let o=0;o>3)]>>7-((7&A)<<0)&1);l[m]=e[y],l[m+1]=e[y+1],l[m+2]=e[y+2],l[m+3]=E>2)]>>6-((3&A)<<1)&3);l[m]=e[y],l[m+1]=e[y+1],l[m+2]=e[y+2],l[m+3]=E>1)]>>4-((1&A)<<2)&15);l[m]=e[y],l[m+1]=e[y+1],l[m+2]=e[y+2],l[m+3]=E>>3)]>>>7-(7&B)&1))==255*p?0:255;c[i+B]=U<<24|F<<16|F<<8|F}else if(2==h)for(B=0;B>>2)]>>>6-((3&B)<<1)&3))==85*p?0:255;c[i+B]=U<<24|F<<16|F<<8|F}else if(4==h)for(B=0;B>>1)]>>>4-((1&B)<<2)&15))==17*p?0:255;c[i+B]=U<<24|F<<16|F<<8|F}else if(8==h)for(B=0;B>3,s=Math.ceil(r*o/8),f=new Uint8Array(i*s);let l=0;const c=[0,0,4,0,2,0,1],u=[0,4,0,2,0,1,0],h=[8,8,8,4,4,2,2],d=[8,8,4,4,2,2,1];let A=0;for(;A<7;){const p=h[A],m=d[A];let w=0,v=0,b=c[A];for(;b>3])>>7-(7&i)&1,f[_*s+(t>>3)]|=g<<7-((7&t)<<0);if(2==o)g=(g=e[i>>3])>>6-(7&i)&3,f[_*s+(t>>2)]|=g<<6-((3&t)<<1);if(4==o)g=(g=e[i>>3])>>4-(7&i)&15,f[_*s+(t>>1)]|=g<<4-((1&t)<<2);if(o>=8){const r=_*s+t*a;for(let t=0;t>3)+t]}i+=o,t+=m}F++,_+=p}w*v!=0&&(l+=v*(1+E)),A+=1}return f}(r,e)),r}function _inflate(e,r){return t(new Uint8Array(e.buffer,2,e.length-6),r)}var t=function(){const e={H:{}};return e.H.N=function(t,r){const i=Uint8Array;let o,a,s=0,f=0,l=0,c=0,u=0,h=0,d=0,A=0,g=0;if(3==t[0]&&0==t[1])return r||new i(0);const p=e.H,m=p.b,w=p.e,v=p.R,b=p.n,y=p.A,E=p.Z,F=p.m,_=null==r;for(_&&(r=new i(t.length>>>2<<5));0==s;)if(s=m(t,g,1),f=m(t,g+1,2),g+=3,0!=f){if(_&&(r=e.H.W(r,A+(1<<17))),1==f&&(o=F.J,a=F.h,h=511,d=31),2==f){l=w(t,g,5)+257,c=w(t,g+5,5)+1,u=w(t,g+10,4)+4,g+=14;let e=1;for(var B=0;B<38;B+=2)F.Q[B]=0,F.Q[B+1]=0;for(B=0;Be&&(e=r)}g+=3*u,b(F.Q,e),y(F.Q,e,F.u),o=F.w,a=F.d,g=v(F.u,(1<>>4;if(i>>>8==0)r[A++]=i;else{if(256==i)break;{let e=A+i-254;if(i>264){const r=F.q[i-257];e=A+(r>>>3)+w(t,g,7&r),g+=7&r}const o=a[E(t,g)&d];g+=15&o;const s=o>>>4,f=F.c[s],l=(f>>>4)+m(t,g,15&f);for(g+=15&f;A>>3),a=t[o-4]|t[o-3]<<8;_&&(r=e.H.W(r,A+a)),r.set(new i(t.buffer,t.byteOffset+o,a),A),g=o+a<<3,A+=a}return r.length==A?r:r.slice(0,A)},e.H.W=function(e,t){const r=e.length;if(t<=r)return e;const i=new Uint8Array(r<<1);return i.set(e,0),i},e.H.R=function(t,r,i,o,a,s){const f=e.H.e,l=e.H.Z;let c=0;for(;c>>4;if(i<=15)s[c]=i,c++;else{let e=0,t=0;16==i?(t=3+f(o,a,2),a+=2,e=s[c-1]):17==i?(t=3+f(o,a,3),a+=3):18==i&&(t=11+f(o,a,7),a+=7);const r=c+t;for(;c>>1;for(;ao&&(o=r),a++}for(;a>1,s=t[e+1],f=o<<4|s,l=r-s;let c=t[e]<>>15-r]=f,c++}}},e.H.l=function(t,r){const i=e.H.m.r,o=15-r;for(let e=0;e>>o}},e.H.M=function(e,t,r){r<<=7&t;const i=t>>>3;e[i]|=r,e[i+1]|=r>>>8},e.H.I=function(e,t,r){r<<=7&t;const i=t>>>3;e[i]|=r,e[i+1]|=r>>>8,e[i+2]|=r>>>16},e.H.e=function(e,t,r){return(e[t>>>3]|e[1+(t>>>3)]<<8)>>>(7&t)&(1<>>3]|e[1+(t>>>3)]<<8|e[2+(t>>>3)]<<16)>>>(7&t)&(1<>>3]|e[1+(t>>>3)]<<8|e[2+(t>>>3)]<<16)>>>(7&t)},e.H.i=function(e,t){return(e[t>>>3]|e[1+(t>>>3)]<<8|e[2+(t>>>3)]<<16|e[3+(t>>>3)]<<24)>>>(7&t)},e.H.m=function(){const e=Uint16Array,t=Uint32Array;return{K:new e(16),j:new e(16),X:[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],S:[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,999,999,999],T:[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0],q:new e(32),p:[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,65535,65535],z:[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0],c:new t(32),J:new e(512),_:[],h:new e(32),$:[],w:new e(32768),C:[],v:[],d:new e(32768),D:[],u:new e(512),Q:[],r:new e(32768),s:new t(286),Y:new t(30),a:new t(19),t:new t(15e3),k:new e(65536),g:new e(32768)}}(),function(){const t=e.H.m;for(var r=0;r<32768;r++){let e=r;e=(2863311530&e)>>>1|(1431655765&e)<<1,e=(3435973836&e)>>>2|(858993459&e)<<2,e=(4042322160&e)>>>4|(252645135&e)<<4,e=(4278255360&e)>>>8|(16711935&e)<<8,t.r[r]=(e>>>16|e<<16)>>>17}function n(e,t,r){for(;0!=t--;)e.push(0,r)}for(r=0;r<32;r++)t.q[r]=t.S[r]<<3|t.T[r],t.c[r]=t.p[r]<<4|t.z[r];n(t._,144,8),n(t._,112,9),n(t._,24,7),n(t._,8,8),e.H.n(t._,9),e.H.A(t._,9,t.J),e.H.l(t._,9),n(t.$,32,5),e.H.n(t.$,5),e.H.A(t.$,5,t.h),e.H.l(t.$,5),n(t.Q,19,0),n(t.C,286,0),n(t.D,30,0),n(t.v,320,0)}(),e.H.N}();function _getBPP(e){return[1,null,3,1,2,null,4][e.ctype]*e.depth}function _filterZero(e,t,r,i,o){let a=_getBPP(t);const s=Math.ceil(i*a/8);let f,l;a=Math.ceil(a/8);let c=e[r],u=0;if(c>1&&(e[r]=[0,0,1][c-2]),3==c)for(u=a;u>>1)&255;for(let t=0;t>>1);for(;u>>1)}else{for(;u=0&&f>=0?(h=r*t+a<<2,d=(f+r)*o+s+a<<2):(h=(-f+r)*t-s+a<<2,d=r*o+a<<2),0==l)i[d]=e[h],i[d+1]=e[h+1],i[d+2]=e[h+2],i[d+3]=e[h+3];else if(1==l){var A=e[h+3]*(1/255),g=e[h]*A,p=e[h+1]*A,m=e[h+2]*A,w=i[d+3]*(1/255),v=i[d]*w,b=i[d+1]*w,y=i[d+2]*w;const t=1-A,r=A+w*t,o=0==r?0:1/r;i[d+3]=255*r,i[d+0]=(g+v*t)*o,i[d+1]=(p+b*t)*o,i[d+2]=(m+y*t)*o}else if(2==l){A=e[h+3],g=e[h],p=e[h+1],m=e[h+2],w=i[d+3],v=i[d],b=i[d+1],y=i[d+2];A==w&&g==v&&p==b&&m==y?(i[d]=0,i[d+1]=0,i[d+2]=0,i[d+3]=0):(i[d]=g,i[d+1]=p,i[d+2]=m,i[d+3]=A)}else if(3==l){A=e[h+3],g=e[h],p=e[h+1],m=e[h+2],w=i[d+3],v=i[d],b=i[d+1],y=i[d+2];if(A==w&&g==v&&p==b&&m==y)continue;if(A<220&&w>20)return!1}return!0}return{decode:function decode(r){const i=new Uint8Array(r);let o=8;const a=e,s=a.readUshort,f=a.readUint,l={tabs:{},frames:[]},c=new Uint8Array(i.length);let u,h=0,d=0;const A=[137,80,78,71,13,10,26,10];for(var g=0;g<8;g++)if(i[g]!=A[g])throw\"The input is not a PNG file!\";for(;o>>1:r>>>=1;e[t]=r}return e}(),update(e,t,r,o){for(let a=0;a>>8;return e},crc:(e,t,r)=>4294967295^i.update(4294967295,e,t,r)};function addErr(e,t,r,i){t[r]+=e[0]*i>>4,t[r+1]+=e[1]*i>>4,t[r+2]+=e[2]*i>>4,t[r+3]+=e[3]*i>>4}function N(e){return Math.max(0,Math.min(255,e))}function D(e,t){const r=e[0]-t[0],i=e[1]-t[1],o=e[2]-t[2],a=e[3]-t[3];return r*r+i*i+o*o+a*a}function dither(e,t,r,i,o,a,s){null==s&&(s=1);const f=i.length,l=[];for(var c=0;c>>0&255,e>>>8&255,e>>>16&255,e>>>24&255])}for(c=0;c>2]=u,A[c>>2]=i[u]}}function _main(e,r,o,a,s){null==s&&(s={});const{crc:f}=i,l=t.writeUint,c=t.writeUshort,u=t.writeASCII;let h=8;const d=e.frames.length>1;let A,g=!1,p=33+(d?20:0);if(null!=s.sRGB&&(p+=13),null!=s.pHYs&&(p+=21),null!=s.iCCP&&(A=pako.deflate(s.iCCP),p+=21+A.length+4),3==e.ctype){for(var m=e.plte.length,w=0;w>>24!=255&&(g=!0);p+=8+3*m+4+(g?8+1*m+4:0)}for(var v=0;v>>8&255,a=r>>>16&255;b[h+t+0]=i,b[h+t+1]=o,b[h+t+2]=a}if(h+=3*m,l(b,h,f(b,h-3*m-4,3*m+4)),h+=4,g){l(b,h,m),h+=4,u(b,h,\"tRNS\"),h+=4;for(w=0;w>>24&255;h+=m,l(b,h,f(b,h-m-4,m+4)),h+=4}}let E=0;for(v=0;vc&&(c=t),eh&&(h=e))}-1==c&&(s=f=c=h=0),a&&(1==(1&s)&&s--,1==(1&f)&&f--);const v=(c-s+1)*(h-f+1);v>2,e>>2);F.push(_);const t=new Uint8Array(r.abuf,i,e);h&&dither(B.img,B.rect.width,B.rect.height,E,t,_),B.img.set(t),i+=e}}else for(p=0;pU&&t==e[w-U])_[w]=_[w-U];else{let e=y[t];if(null==e&&(y[t]=e=E.length,E.push(t),E.length>=300))break;_[w]=e}}}const C=E.length;C<=256&&0==u&&(A=C<=2?1:C<=4?2:C<=16?4:8,A=Math.max(A,c));for(p=0;p>1)]|=o[e+Q]<<4-4*(1&Q);else if(2==A)for(Q=0;Q>2)]|=o[e+Q]<<6-2*(3&Q);else if(1==A)for(Q=0;Q>3)]|=o[e+Q]<<7-1*(7&Q)}t=I,d=3,i=1}else if(0==v&&1==b.length){I=new Uint8Array(U*e*3);const o=U*e;for(w=0;ww&&(w=i),fv&&(v=f))}-1==w&&(p=m=w=v=0),f&&(1==(1&p)&&p--,1==(1&m)&&m--),s={x:p,y:m,width:w-p+1,height:v-m+1};const b=o[a];b.rect=s,b.blend=1,b.img=new Uint8Array(s.width*s.height*4),0==o[a-1].dispose?(e(u,r,i,b.img,s.width,s.height,-s.x,-s.y,0),_prepareDiff(A,r,i,b.img,s)):e(A,r,i,b.img,s.width,s.height,-s.x,-s.y,0)}function _prepareDiff(t,r,i,o,a){e(t,r,i,o,a.width,a.height,-a.x,-a.y,2)}function _filterZero(e,t,r,i,o,a,s){const f=[];let l,c=[0,1,2,3,4];-1!=a?c=[a]:(t*i>5e5||1==r)&&(c=[0]),s&&(l={level:0});const u=UZIP;for(var h=0;h>1)+256&255;if(4==s)for(c=a;c>1)&255;for(c=a;c>1)&255}if(4==s){for(c=0;c>2);let u;if(r.length<2e7)for(var h=0;h>2]=u.ind,o[h>>2]=u.est.rgba}else for(h=0;h>2]=u.ind,o[h>>2]=u.est.rgba}return{abuf:i.buffer,inds:c,plte:f}}function getKDtree(e,t,r){null==r&&(r=1e-4);const i=new Uint32Array(e.buffer),o={i0:0,i1:e.length,bst:null,est:null,tdst:0,left:null,right:null};o.bst=stats(e,o.i0,o.i1),o.est=estats(o.bst);const a=[o];for(;a.lengtht&&(t=a[s].est.L,o=s);if(t=l||f.i1<=l){f.est.L=0;continue}const c={i0:f.i0,i1:l,bst:null,est:null,tdst:0,left:null,right:null};c.bst=stats(e,c.i0,c.i1),c.est=estats(c.bst);const u={i0:l,i1:f.i1,bst:null,est:null,tdst:0,left:null,right:null};u.bst={R:[],m:[],N:f.bst.N-c.bst.N};for(s=0;s<16;s++)u.bst.R[s]=f.bst.R[s]-c.bst.R[s];for(s=0;s<4;s++)u.bst.m[s]=f.bst.m[s]-c.bst.m[s];u.est=estats(u.bst),f.left=c,f.right=u,a[o]=c,a.push(u)}a.sort(((e,t)=>t.bst.N-e.bst.N));for(s=0;s0&&(s=e.right,f=e.left);const l=getNearest(s,t,r,i,o);if(l.tdst<=a*a)return l;const c=getNearest(f,t,r,i,o);return c.tdsta;)i-=4;if(r>=i)break;const s=t[r>>2];t[r>>2]=t[i>>2],t[i>>2]=s,r+=4,i-=4}for(;vecDot(e,r,o)>a;)r-=4;return r+4}function vecDot(e,t,r){return e[t]*r[0]+e[t+1]*r[1]+e[t+2]*r[2]+e[t+3]*r[3]}function stats(e,t,r){const i=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],o=[0,0,0,0],a=r-t>>2;for(let a=t;a>>0}}var o={multVec:(e,t)=>[e[0]*t[0]+e[1]*t[1]+e[2]*t[2]+e[3]*t[3],e[4]*t[0]+e[5]*t[1]+e[6]*t[2]+e[7]*t[3],e[8]*t[0]+e[9]*t[1]+e[10]*t[2]+e[11]*t[3],e[12]*t[0]+e[13]*t[1]+e[14]*t[2]+e[15]*t[3]],dot:(e,t)=>e[0]*t[0]+e[1]*t[1]+e[2]*t[2]+e[3]*t[3],sml:(e,t)=>[e*t[0],e*t[1],e*t[2],e*t[3]]};UPNG.encode=function encode(e,t,r,i,o,a,s){null==i&&(i=0),null==s&&(s=!1);const f=compress(e,t,r,i,[!1,!1,!1,0,s,!1]);return compressPNG(f,-1),_main(f,t,r,o,a)},UPNG.encodeLL=function encodeLL(e,t,r,i,o,a,s,f){const l={ctype:0+(1==i?0:2)+(0==o?0:4),depth:a,frames:[]},c=(i+o)*a,u=c*t;for(let i=0;i>>0),set16(1),set16(32),set32(3),set32(c),set32(2835),set32(2835),seek(8),set32(16711680),set32(65280),set32(255),set32(4278190080),set32(1466527264),function convert(){for(;b0;){for(w=122+b*l,g=0;g>>24,d.setUint32(w+g,p<<8|m),g+=4;b++}E{t(new Blob([e],{type:\"image/bmp\"}))}))},_dly:9};var i={CHROME:\"CHROME\",FIREFOX:\"FIREFOX\",DESKTOP_SAFARI:\"DESKTOP_SAFARI\",IE:\"IE\",IOS:\"IOS\",ETC:\"ETC\"},o={[i.CHROME]:16384,[i.FIREFOX]:11180,[i.DESKTOP_SAFARI]:16384,[i.IE]:8192,[i.IOS]:4096,[i.ETC]:8192};const a=\"undefined\"!=typeof window,s=\"undefined\"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope,f=a&&window.cordova&&window.cordova.require&&window.cordova.require(\"cordova/modulemapper\"),CustomFile=(a||s)&&(f&&f.getOriginalSymbol(window,\"File\")||\"undefined\"!=typeof File&&File),CustomFileReader=(a||s)&&(f&&f.getOriginalSymbol(window,\"FileReader\")||\"undefined\"!=typeof FileReader&&FileReader);function getFilefromDataUrl(e,t,r=Date.now()){return new Promise((i=>{const o=e.split(\",\"),a=o[0].match(/:(.*?);/)[1],s=globalThis.atob(o[1]);let f=s.length;const l=new Uint8Array(f);for(;f--;)l[f]=s.charCodeAt(f);const c=new Blob([l],{type:a});c.name=t,c.lastModified=r,i(c)}))}function getDataUrlFromFile(e){return new Promise(((t,r)=>{const i=new CustomFileReader;i.onload=()=>t(i.result),i.onerror=e=>r(e),i.readAsDataURL(e)}))}function loadImage(e){return new Promise(((t,r)=>{const i=new Image;i.onload=()=>t(i),i.onerror=e=>r(e),i.src=e}))}function getBrowserName(){if(void 0!==getBrowserName.cachedResult)return getBrowserName.cachedResult;let e=i.ETC;const{userAgent:t}=navigator;return/Chrom(e|ium)/i.test(t)?e=i.CHROME:/iP(ad|od|hone)/i.test(t)&&/WebKit/i.test(t)?e=i.IOS:/Safari/i.test(t)?e=i.DESKTOP_SAFARI:/Firefox/i.test(t)?e=i.FIREFOX:(/MSIE/i.test(t)||!0==!!document.documentMode)&&(e=i.IE),getBrowserName.cachedResult=e,getBrowserName.cachedResult}function approximateBelowMaximumCanvasSizeOfBrowser(e,t){const r=getBrowserName(),i=o[r];let a=e,s=t,f=a*s;const l=a>s?s/a:a/s;for(;f>i*i;){const e=(i+a)/2,t=(i+s)/2;er.toBlob(e,t))).then(function(e){try{return l=e,l.name=i,l.lastModified=o,$If_5.call(this)}catch(e){return f(e)}}.bind(this),f);{if(\"function\"==typeof OffscreenCanvas&&e instanceof OffscreenCanvas)return e.convertToBlob({type:t,quality:a}).then(function(e){try{return l=e,l.name=i,l.lastModified=o,$If_6.call(this)}catch(e){return f(e)}}.bind(this),f);{let d;return d=e.toDataURL(t,a),getFilefromDataUrl(d,i,o).then(function(e){try{return l=e,$If_6.call(this)}catch(e){return f(e)}}.bind(this),f)}function $If_6(){return $If_5.call(this)}}function $If_5(){return $If_4.call(this)}}function $If_4(){return s(l)}}))}function cleanupCanvasMemory(e){e.width=0,e.height=0}function isAutoOrientationInBrowser(){return new Promise((function(e,t){let r,i,o,a,s;return void 0!==isAutoOrientationInBrowser.cachedResult?e(isAutoOrientationInBrowser.cachedResult):(r=\"data:image/jpeg;base64,/9j/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAYAAAAAAAD/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/AABEIAAEAAgMBEQACEQEDEQH/xABKAAEAAAAAAAAAAAAAAAAAAAALEAEAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAAAAAAAEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwA/8H//2Q==\",getFilefromDataUrl(\"data:image/jpeg;base64,/9j/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAYAAAAAAAD/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/AABEIAAEAAgMBEQACEQEDEQH/xABKAAEAAAAAAAAAAAAAAAAAAAALEAEAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAAAAAAAEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwA/8H//2Q==\",\"test.jpg\",Date.now()).then((function(r){try{return i=r,drawFileInCanvas(i).then((function(r){try{return o=r[1],canvasToFile(o,i.type,i.name,i.lastModified).then((function(r){try{return a=r,cleanupCanvasMemory(o),drawFileInCanvas(a).then((function(r){try{return s=r[0],isAutoOrientationInBrowser.cachedResult=1===s.width&&2===s.height,e(isAutoOrientationInBrowser.cachedResult)}catch(e){return t(e)}}),t)}catch(e){return t(e)}}),t)}catch(e){return t(e)}}),t)}catch(e){return t(e)}}),t))}))}function getExifOrientation(e){return new Promise(((t,r)=>{const i=new CustomFileReader;i.onload=e=>{const r=new DataView(e.target.result);if(65496!=r.getUint16(0,!1))return t(-2);const i=r.byteLength;let o=2;for(;or(e),i.readAsArrayBuffer(e)}))}function handleMaxWidthOrHeight(e,t){const{width:r}=e,{height:i}=e,{maxWidthOrHeight:o}=t;let a,s=e;return isFinite(o)&&(r>o||i>o)&&([s,a]=getNewCanvasAndCtx(r,i),r>i?(s.width=o,s.height=i/r*o):(s.width=r/i*o,s.height=o),a.drawImage(e,0,0,s.width,s.height),cleanupCanvasMemory(e)),s}function followExifOrientation(e,t){const{width:r}=e,{height:i}=e,[o,a]=getNewCanvasAndCtx(r,i);switch(t>4&&t<9?(o.width=i,o.height=r):(o.width=r,o.height=i),t){case 2:a.transform(-1,0,0,1,r,0);break;case 3:a.transform(-1,0,0,-1,r,i);break;case 4:a.transform(1,0,0,-1,0,i);break;case 5:a.transform(0,1,1,0,0,0);break;case 6:a.transform(0,1,-1,0,i,0);break;case 7:a.transform(0,-1,-1,0,i,r);break;case 8:a.transform(0,-1,1,0,0,r)}return a.drawImage(e,0,0,r,i),cleanupCanvasMemory(e),o}function compress(e,t,r=0){return new Promise((function(i,o){let a,s,f,l,c,u,h,d,A,g,p,m,w,v,b,y,E,F,_,B;function incProgress(e=5){if(t.signal&&t.signal.aborted)throw t.signal.reason;a+=e,t.onProgress(Math.min(a,100))}function setProgress(e){if(t.signal&&t.signal.aborted)throw t.signal.reason;a=Math.min(Math.max(e,a),100),t.onProgress(a)}return a=r,s=t.maxIteration||10,f=1024*t.maxSizeMB*1024,incProgress(),drawFileInCanvas(e,t).then(function(r){try{return[,l]=r,incProgress(),c=handleMaxWidthOrHeight(l,t),incProgress(),new Promise((function(r,i){var o;if(!(o=t.exifOrientation))return getExifOrientation(e).then(function(e){try{return o=e,$If_2.call(this)}catch(e){return i(e)}}.bind(this),i);function $If_2(){return r(o)}return $If_2.call(this)})).then(function(r){try{return u=r,incProgress(),isAutoOrientationInBrowser().then(function(r){try{return h=r?c:followExifOrientation(c,u),incProgress(),d=t.initialQuality||1,A=t.fileType||e.type,canvasToFile(h,A,e.name,e.lastModified,d).then(function(r){try{{if(g=r,incProgress(),p=g.size>f,m=g.size>e.size,!p&&!m)return setProgress(100),i(g);var a;function $Loop_3(){if(s--&&(b>f||b>w)){let t,r;return t=B?.95*_.width:_.width,r=B?.95*_.height:_.height,[E,F]=getNewCanvasAndCtx(t,r),F.drawImage(_,0,0,t,r),d*=\"image/png\"===A?.85:.95,canvasToFile(E,A,e.name,e.lastModified,d).then((function(e){try{return y=e,cleanupCanvasMemory(_),_=E,b=y.size,setProgress(Math.min(99,Math.floor((v-b)/(v-f)*100))),$Loop_3}catch(e){return o(e)}}),o)}return[1]}return w=e.size,v=g.size,b=v,_=h,B=!t.alwaysKeepResolution&&p,(a=function(e){for(;e;){if(e.then)return void e.then(a,o);try{if(e.pop){if(e.length)return e.pop()?$Loop_3_exit.call(this):e;e=$Loop_3}else e=e.call(this)}catch(e){return o(e)}}}.bind(this))($Loop_3);function $Loop_3_exit(){return cleanupCanvasMemory(_),cleanupCanvasMemory(E),cleanupCanvasMemory(c),cleanupCanvasMemory(h),cleanupCanvasMemory(l),setProgress(100),i(y)}}}catch(u){return o(u)}}.bind(this),o)}catch(e){return o(e)}}.bind(this),o)}catch(e){return o(e)}}.bind(this),o)}catch(e){return o(e)}}.bind(this),o)}))}const l=\"\\nlet scriptImported = false\\nself.addEventListener('message', async (e) => {\\n const { file, id, imageCompressionLibUrl, options } = e.data\\n options.onProgress = (progress) => self.postMessage({ progress, id })\\n try {\\n if (!scriptImported) {\\n // console.log('[worker] importScripts', imageCompressionLibUrl)\\n self.importScripts(imageCompressionLibUrl)\\n scriptImported = true\\n }\\n // console.log('[worker] self', self)\\n const compressedFile = await imageCompression(file, options)\\n self.postMessage({ file: compressedFile, id })\\n } catch (e) {\\n // console.error('[worker] error', e)\\n self.postMessage({ error: e.message + '\\\\n' + e.stack, id })\\n }\\n})\\n\";let c;function compressOnWebWorker(e,t){return new Promise(((r,i)=>{c||(c=function createWorkerScriptURL(e){const t=[];return\"function\"==typeof e?t.push(`(${e})()`):t.push(e),URL.createObjectURL(new Blob(t))}(l));const o=new Worker(c);o.addEventListener(\"message\",(function handler(e){if(t.signal&&t.signal.aborted)o.terminate();else if(void 0===e.data.progress){if(e.data.error)return i(new Error(e.data.error)),void o.terminate();r(e.data.file),o.terminate()}else t.onProgress(e.data.progress)})),o.addEventListener(\"error\",i),t.signal&&t.signal.addEventListener(\"abort\",(()=>{i(t.signal.reason),o.terminate()})),o.postMessage({file:e,imageCompressionLibUrl:t.libURL,options:{...t,onProgress:void 0,signal:void 0}})}))}function imageCompression(e,t){return new Promise((function(r,i){let o,a,s,f,l,c;if(o={...t},s=0,({onProgress:f}=o),o.maxSizeMB=o.maxSizeMB||Number.POSITIVE_INFINITY,l=\"boolean\"!=typeof o.useWebWorker||o.useWebWorker,delete o.useWebWorker,o.onProgress=e=>{s=e,\"function\"==typeof f&&f(s)},!(e instanceof Blob||e instanceof CustomFile))return i(new Error(\"The file given is not an instance of Blob or File\"));if(!/^image/.test(e.type))return i(new Error(\"The file given is not an image\"));if(c=\"undefined\"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope,!l||\"function\"!=typeof Worker||c)return compress(e,o).then(function(e){try{return a=e,$If_4.call(this)}catch(e){return i(e)}}.bind(this),i);var u=function(){try{return $If_4.call(this)}catch(e){return i(e)}}.bind(this),$Try_1_Catch=function(t){try{return compress(e,o).then((function(e){try{return a=e,u()}catch(e){return i(e)}}),i)}catch(e){return i(e)}};try{return o.libURL=o.libURL||\"https://cdn.jsdelivr.net/npm/browser-image-compression@2.0.2/dist/browser-image-compression.js\",compressOnWebWorker(e,o).then((function(e){try{return a=e,u()}catch(e){return $Try_1_Catch()}}),$Try_1_Catch)}catch(e){$Try_1_Catch()}function $If_4(){try{a.name=e.name,a.lastModified=e.lastModified}catch(e){}try{o.preserveExif&&\"image/jpeg\"===e.type&&(!o.fileType||o.fileType&&o.fileType===e.type)&&(a=copyExifWithoutOrientation(e,a))}catch(e){}return r(a)}}))}imageCompression.getDataUrlFromFile=getDataUrlFromFile,imageCompression.getFilefromDataUrl=getFilefromDataUrl,imageCompression.loadImage=loadImage,imageCompression.drawImageInCanvas=drawImageInCanvas,imageCompression.drawFileInCanvas=drawFileInCanvas,imageCompression.canvasToFile=canvasToFile,imageCompression.getExifOrientation=getExifOrientation,imageCompression.handleMaxWidthOrHeight=handleMaxWidthOrHeight,imageCompression.followExifOrientation=followExifOrientation,imageCompression.cleanupCanvasMemory=cleanupCanvasMemory,imageCompression.isAutoOrientationInBrowser=isAutoOrientationInBrowser,imageCompression.approximateBelowMaximumCanvasSizeOfBrowser=approximateBelowMaximumCanvasSizeOfBrowser,imageCompression.copyExifWithoutOrientation=copyExifWithoutOrientation,imageCompression.getBrowserName=getBrowserName,imageCompression.version=\"2.0.2\";export{imageCompression as default};\n//# sourceMappingURL=browser-image-compression.mjs.map\n","/**\n * FileUploader 유틸리티 함수\n *\n * @module composite/FileUploader/utils\n */\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst G7Core = (window as any).G7Core;\n\n/**\n * 파일 크기를 읽기 쉬운 형식으로 변환합니다.\n */\nexport const formatFileSize = (bytes: number): string => {\n const units = ['B', 'KB', 'MB', 'GB'];\n let i = 0;\n let size = bytes;\n while (size >= 1024 && i < units.length - 1) {\n size /= 1024;\n i++;\n }\n return `${size.toFixed(2)} ${units[i]}`;\n};\n\n/**\n * API 에러 응답에서 상세 메시지를 추출합니다.\n */\nexport const extractErrorMessage = (error: unknown): string => {\n // Axios 에러 응답 구조 처리\n if (error && typeof error === 'object') {\n const axiosError = error as {\n response?: {\n data?: {\n message?: string;\n errors?: Record;\n };\n };\n message?: string;\n };\n\n // API 응답의 message 필드\n if (axiosError.response?.data?.message) {\n return axiosError.response.data.message;\n }\n\n // Laravel validation 에러 (errors 객체의 첫 번째 메시지)\n if (axiosError.response?.data?.errors) {\n const firstError = Object.values(axiosError.response.data.errors)[0];\n if (Array.isArray(firstError) && firstError[0]) {\n return firstError[0];\n }\n }\n\n // 일반 에러 메시지\n if (axiosError.message) {\n return axiosError.message;\n }\n }\n\n // Error 인스턴스\n if (error instanceof Error) {\n return error.message;\n }\n\n return '업로드 실패';\n};\n\n/**\n * MIME 타입에 따른 Font Awesome 아이콘 클래스를 반환합니다.\n */\nexport const getFileIcon = (mimeType: string): string => {\n if (!mimeType) return 'fa-file';\n if (mimeType.startsWith('image/')) return 'fa-file-image';\n if (mimeType.startsWith('video/')) return 'fa-file-video';\n if (mimeType.startsWith('audio/')) return 'fa-file-audio';\n if (mimeType === 'application/pdf') return 'fa-file-pdf';\n if (mimeType.includes('word') || mimeType.includes('document')) return 'fa-file-word';\n if (mimeType.includes('excel') || mimeType.includes('spreadsheet')) return 'fa-file-excel';\n if (mimeType.includes('zip') || mimeType.includes('compressed')) return 'fa-file-zipper';\n return 'fa-file';\n};\n\n/**\n * G7Core.t() 번역 함수 참조\n */\nexport const t = (key: string, params?: Record) =>\n G7Core?.t?.(key, params) ?? key;","/**\n * useFileUploader Hook\n *\n * FileUploader의 핵심 로직을 담당하는 훅입니다.\n * - 파일 추가/삭제/업로드\n * - 이미지 압축\n * - 병렬 업로드 큐\n * - 순서 변경\n *\n * @module composite/FileUploader/useFileUploader\n */\n\nimport { useState, useCallback, useRef, useEffect, useMemo } from 'react';\nimport imageCompression from 'browser-image-compression';\n\nimport type { Attachment, PendingFile, FileUploaderProps, ApiEndpoints } from './types';\nimport { formatFileSize, extractErrorMessage, t } from './utils';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst G7Core = (window as any).G7Core;\n\nexport interface UseFileUploaderOptions {\n attachmentableType?: string;\n attachmentableId?: number;\n collection: string;\n maxFiles: number;\n maxSize: number;\n maxConcurrentUploads: number;\n accept?: string;\n imageCompression?: FileUploaderProps['imageCompression'];\n roleIds: number[];\n autoUpload: boolean;\n initialFiles: Attachment[];\n endpoints: ApiEndpoints;\n onFilesChange?: (files: PendingFile[]) => void;\n onUploadComplete?: (attachments: Attachment[]) => void;\n onUploadError?: (error: string, file: File) => void;\n onRemove?: (id: number | string) => void;\n onReorder?: (files: Attachment[]) => void;\n uploadTriggerEvent?: string;\n confirmBeforeRemove: boolean;\n uploadParams?: Record;\n}\n\nexport interface UseFileUploaderReturn {\n // 상태\n existingFiles: Attachment[];\n pendingFiles: PendingFile[];\n isDragOver: boolean;\n setIsDragOver: (value: boolean) => void;\n isDeleting: boolean;\n\n // 계산된 값\n totalCount: number;\n hasFiles: boolean;\n canAddMore: boolean;\n allItems: (Attachment | PendingFile)[];\n imageFiles: (Attachment | PendingFile)[];\n\n // 액션\n handleFiles: (files: FileList) => Promise;\n handleRemove: (item: PendingFile | Attachment) => Promise;\n handleRetry: (pendingFile: PendingFile) => void;\n handleUploadAll: () => Promise;\n handleOpenGallery: (item: PendingFile | Attachment) => void;\n handleDownload: (item: Attachment) => Promise;\n handleDragEnd: (event: import('@dnd-kit/core').DragEndEvent) => Promise;\n\n // Input ref\n inputRef: React.RefObject;\n\n // 갤러리 상태\n galleryOpen: boolean;\n setGalleryOpen: (value: boolean) => void;\n galleryStartIndex: number;\n galleryKeyRef: React.MutableRefObject;\n\n // 삭제 확인 모달 상태\n confirmDialogOpen: boolean;\n setConfirmDialogOpen: (value: boolean) => void;\n itemToDelete: Attachment | null;\n executeRemoveAttachment: (item: Attachment) => Promise;\n\n // 인증된 이미지 URL 캐시\n authenticatedImageUrls: Map;\n\n // 초기화\n clear: () => void;\n getPendingFiles: () => PendingFile[];\n}\n\nexport function useFileUploader(options: UseFileUploaderOptions): UseFileUploaderReturn {\n const {\n attachmentableType,\n attachmentableId,\n collection,\n maxFiles,\n maxSize,\n maxConcurrentUploads,\n accept,\n imageCompression: compressionOptions,\n roleIds,\n autoUpload,\n initialFiles,\n endpoints,\n onFilesChange,\n onUploadComplete,\n onUploadError,\n onRemove,\n onReorder,\n uploadTriggerEvent,\n confirmBeforeRemove,\n uploadParams,\n } = options;\n\n // 상태\n const [existingFiles, setExistingFiles] = useState(initialFiles);\n const [pendingFiles, setPendingFiles] = useState([]);\n const [isDragOver, setIsDragOver] = useState(false);\n const inputRef = useRef(null);\n const activeUploadsRef = useRef(0);\n // 삭제된 파일 ID 또는 hash를 추적하여 initialFiles 동기화 시 제외\n const deletedIdsRef = useRef>(new Set());\n // 세션 중 업로드된 파일을 추적하여 initialFiles 동기화 시 유지\n const uploadedFilesRef = useRef>(new Map());\n\n // 삭제 확인 모달 상태\n const [confirmDialogOpen, setConfirmDialogOpen] = useState(false);\n const [itemToDelete, setItemToDelete] = useState(null);\n const [isDeleting, setIsDeleting] = useState(false);\n // 순서가 변경되었는지 추적 (변경 후에는 initialFiles 동기화 무시)\n const hasReorderedRef = useRef(false);\n // 드래그 순서 유지: 기존/신규 파일 간 섞인 순서를 보존하기 위한 ID 배열\n const [customOrder, setCustomOrder] = useState<(string | number)[]>([]);\n // initialFiles 참조 안정성 — 외부에서 매 렌더마다 새 배열이 전달되는 경우 방어\n const prevInitialFilesRef = useRef(initialFiles);\n\n // 이미지 갤러리 상태\n const [galleryOpen, setGalleryOpen] = useState(false);\n const [galleryStartIndex, setGalleryStartIndex] = useState(0);\n // 갤러리 리마운트용 key (열릴 때마다 증가)\n const galleryKeyRef = useRef(0);\n // 인증된 이미지 URL 캐시 (기존 첨부파일용)\n const [authenticatedImageUrls, setAuthenticatedImageUrls] = useState>(new Map());\n // ref로 URL 캐시 추적 (stale closure 방지 — cleanup/has 체크에서 항상 최신 참조)\n const authenticatedImageUrlsRef = useRef>(new Map());\n\n // 대기 파일 변경 시 콜백\n useEffect(() => {\n onFilesChange?.(pendingFiles);\n }, [pendingFiles, onFilesChange]);\n\n // initialFiles 참조 안정화 — 매 렌더마다 새 배열이 전달되어도 내용이 같으면 무시\n const stableInitialFiles = useMemo(() => {\n const prev = prevInitialFilesRef.current;\n // 동일 참조면 즉시 반환\n if (prev === initialFiles) return prev;\n // 길이가 다르면 실제 변경\n if (prev.length !== initialFiles.length) {\n prevInitialFilesRef.current = initialFiles;\n return initialFiles;\n }\n // 빈 배열끼리는 항상 동일 (가장 흔한 케이스 — 무한 루프 방지)\n if (prev.length === 0 && initialFiles.length === 0) return prev;\n // ID 기반 얕은 비교\n const changed = initialFiles.some((f, i) => f.id !== prev[i]?.id);\n if (changed) {\n prevInitialFilesRef.current = initialFiles;\n return initialFiles;\n }\n return prev;\n }, [initialFiles]);\n\n // initialFiles prop 변경 시 existingFiles 동기화 (삭제/순서변경된 경우 제외)\n useEffect(() => {\n // 순서가 변경된 후에는 initialFiles 동기화를 무시\n if (hasReorderedRef.current) {\n return;\n }\n const filteredFiles = stableInitialFiles.filter(\n (file) => !deletedIdsRef.current.has(file.id) && (!file.hash || !deletedIdsRef.current.has(file.hash))\n );\n\n // 세션 중 업로드된 파일 병합 (initialFiles에 없는 것만 추가)\n const initialIds = new Set(filteredFiles.map((f) => f.id));\n const sessionUploaded = Array.from(uploadedFilesRef.current.values()).filter(\n (f) => !initialIds.has(f.id) && !deletedIdsRef.current.has(f.id)\n );\n\n setExistingFiles([...filteredFiles, ...sessionUploaded]);\n }, [stableInitialFiles]);\n\n // 이미지 압축\n const compressImage = useCallback(\n async (file: File): Promise => {\n const compressionOpts = {\n maxSizeMB: compressionOptions?.maxSizeMB ?? 1,\n maxWidthOrHeight: compressionOptions?.maxWidthOrHeight ?? 1920,\n useWebWorker: true,\n };\n return await imageCompression(file, compressionOpts);\n },\n [compressionOptions]\n );\n\n // 파일 추가 처리\n const handleFiles = useCallback(\n async (selectedFiles: FileList) => {\n const totalCount = existingFiles.length + pendingFiles.length;\n const remainingSlots = Math.max(0, maxFiles - totalCount);\n const filesToAdd = Array.from(selectedFiles).slice(0, remainingSlots);\n\n // 개수 상한 초과분은 조용히 절단하지 않고 안내 (개수 초과 silent 무시 방지)\n if (selectedFiles.length > remainingSlots) {\n const overflow = Array.from(selectedFiles).slice(remainingSlots);\n const message = t('attachment.upload_limit_exceeded', { max: maxFiles });\n // 잘린 첫 파일을 대표로 콜백에 전달 (없으면 무시)\n onUploadError?.(message, overflow[0] ?? selectedFiles[0]);\n }\n\n for (const file of filesToAdd) {\n // 크기 검증\n if (file.size > maxSize * 1024 * 1024) {\n onUploadError?.(\n `[${file.name}] 파일 크기(${formatFileSize(file.size)})가 최대 허용 크기(${maxSize}MB)를 초과합니다.`,\n file\n );\n continue;\n }\n\n // 확장자/MIME 타입 검증\n if (accept) {\n const ext = '.' + file.name.split('.').pop()?.toLowerCase();\n const acceptedTypes = accept.split(',').map((e) => e.trim().toLowerCase());\n const isAccepted = acceptedTypes.some((accepted) => {\n // MIME 타입 와일드카드 (예: image/*, video/*, audio/*)\n if (accepted.includes('/')) {\n if (accepted.endsWith('/*')) {\n const mimePrefix = accepted.slice(0, -2);\n return file.type.toLowerCase().startsWith(mimePrefix + '/');\n }\n // 정확한 MIME 타입 매칭 (예: image/jpeg)\n return file.type.toLowerCase() === accepted;\n }\n // 확장자 매칭 (예: .jpg, .png)\n return ext === accepted;\n });\n if (!isAccepted) {\n onUploadError?.(`[${file.name}] 허용되지 않는 파일 형식입니다. (허용: ${accept})`, file);\n continue;\n }\n }\n\n const pendingFile: PendingFile = {\n id: `pending-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`,\n file,\n original_filename: file.name,\n mime_type: file.type,\n size: file.size,\n size_formatted: formatFileSize(file.size),\n status: 'pending',\n progress: 0,\n };\n\n // 이미지 미리보기 생성\n if (file.type.startsWith('image/')) {\n pendingFile.preview = URL.createObjectURL(file);\n }\n\n setPendingFiles((prev) => [...prev, pendingFile]);\n\n // 이미지인 경우 압축 처리\n if (file.type.startsWith('image/') && compressionOptions) {\n setPendingFiles((prev) =>\n prev.map((f) => (f.id === pendingFile.id ? { ...f, status: 'compressing' } : f))\n );\n\n try {\n const compressedBlob = await compressImage(file);\n setPendingFiles((prev) =>\n prev.map((f) =>\n f.id === pendingFile.id\n ? {\n ...f,\n compressedBlob,\n size: compressedBlob.size,\n size_formatted: formatFileSize(compressedBlob.size),\n status: 'pending',\n progress: 0,\n }\n : f\n )\n );\n } catch {\n setPendingFiles((prev) =>\n prev.map((f) =>\n f.id === pendingFile.id\n ? { ...f, status: 'error', error: '이미지 압축 실패' }\n : f\n )\n );\n }\n }\n }\n },\n [existingFiles.length, pendingFiles.length, maxFiles, maxSize, accept, compressionOptions, compressImage, onUploadError]\n );\n\n // 단일 파일 업로드\n const uploadSingleFile = useCallback(\n async (pendingFile: PendingFile): Promise => {\n const formData = new FormData();\n\n // 압축된 Blob 또는 원본 파일\n const fileToUpload = pendingFile.compressedBlob\n ? new File([pendingFile.compressedBlob], pendingFile.original_filename, {\n type: pendingFile.mime_type,\n })\n : pendingFile.file;\n\n formData.append('file', fileToUpload);\n\n if (attachmentableType) {\n formData.append('attachmentable_type', attachmentableType);\n }\n if (attachmentableId) {\n formData.append('attachmentable_id', String(attachmentableId));\n }\n formData.append('collection', collection);\n\n roleIds.forEach((roleId) => {\n formData.append('role_ids[]', String(roleId));\n });\n\n // 추가 업로드 파라미터 (예: temp_key)\n if (uploadParams) {\n Object.entries(uploadParams).forEach(([key, value]) => {\n formData.append(key, value);\n });\n }\n\n try {\n const response = await G7Core.api.post(endpoints.upload, formData, {\n headers: { 'Content-Type': 'multipart/form-data' },\n onUploadProgress: (progressEvent: { loaded: number; total?: number }) => {\n const progress = Math.round((progressEvent.loaded * 100) / (progressEvent.total ?? 1));\n setPendingFiles((prev) =>\n prev.map((f) => (f.id === pendingFile.id ? { ...f, progress } : f))\n );\n },\n });\n\n // ResponseHelper 이중 래핑 대응: response.data.data (래핑) 또는 response.data (비래핑)\n const attachment = response?.data?.data ?? response?.data;\n return attachment as Attachment;\n } catch (error: unknown) {\n // API 에러 응답에서 상세 메시지 추출\n const errorMessage = extractErrorMessage(error);\n throw new Error(errorMessage);\n }\n },\n [attachmentableType, attachmentableId, collection, roleIds, endpoints.upload]\n );\n\n // 모든 파일 업로드\n const handleUploadAll = useCallback(async (): Promise => {\n const filesToUpload = pendingFiles.filter(\n (f) => f.status === 'pending' || f.status === 'error'\n );\n\n if (filesToUpload.length === 0) {\n return [];\n }\n\n const uploadedAttachments: Attachment[] = [];\n // 드래그 순서 복원용: pending ID → 업로드된 hash 매핑\n const pendingToHashMap = new Map();\n const uploadQueue = [...filesToUpload];\n\n const processQueue = async () => {\n while (uploadQueue.length > 0 && activeUploadsRef.current < maxConcurrentUploads) {\n const pendingFile = uploadQueue.shift()!;\n activeUploadsRef.current++;\n\n setPendingFiles((prev) =>\n prev.map((f) => (f.id === pendingFile.id ? { ...f, status: 'uploading', progress: 0 } : f))\n );\n\n try {\n const attachment = await uploadSingleFile(pendingFile);\n if (attachment) {\n uploadedAttachments.push(attachment);\n // 드래그 순서 복원용: pending ID → 업로드된 hash 매핑\n pendingToHashMap.set(String(pendingFile.id), String(attachment.hash));\n // 세션 중 업로드된 파일 추적 (initialFiles 동기화 시 유지)\n uploadedFilesRef.current.set(attachment.id, attachment);\n setPendingFiles((prev) => prev.filter((f) => f.id !== pendingFile.id));\n setExistingFiles((prev) => [...prev, attachment]);\n\n // customOrder에 pending ID가 있으면 즉시 hash로 교체\n // → allItems useMemo가 올바른 순서로 E를 표시 (UI 플래시 방지)\n setCustomOrder((prev) => {\n if (prev.length === 0) return prev;\n const pendingId = String(pendingFile.id);\n const hasMatch = prev.some((id) => String(id) === pendingId);\n if (!hasMatch) return prev;\n return prev.map((id) => String(id) === pendingId ? String(attachment.hash) : id);\n });\n\n // 미리보기 URL 해제\n if (pendingFile.preview) {\n URL.revokeObjectURL(pendingFile.preview);\n }\n } else {\n // 업로드 API 성공이지만 응답 파싱 실패 → 에러 상태로 전환 ('uploading' 영구 잔류 방지)\n const invalidMsg = t('attachment.upload_response_invalid');\n setPendingFiles((prev) =>\n prev.map((f) =>\n f.id === pendingFile.id\n ? { ...f, status: 'error', error: invalidMsg }\n : f\n )\n );\n onUploadError?.(\n `[${pendingFile.original_filename}] ${invalidMsg}`,\n pendingFile.file\n );\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : '업로드 실패';\n setPendingFiles((prev) =>\n prev.map((f) =>\n f.id === pendingFile.id ? { ...f, status: 'error', error: errorMessage } : f\n )\n );\n onUploadError?.(`[${pendingFile.original_filename}] ${errorMessage}`, pendingFile.file);\n } finally {\n activeUploadsRef.current--;\n }\n }\n };\n\n // 병렬 업로드 시작\n const workers = Array(Math.min(maxConcurrentUploads, filesToUpload.length))\n .fill(null)\n .map(() => processQueue());\n\n await Promise.all(workers);\n\n if (uploadedAttachments.length > 0) {\n onUploadComplete?.(uploadedAttachments);\n\n // 편집 모드(reorder 엔드포인트 존재)에서 드래그 순서가 있는 경우에만 onReorder 호출\n // → form.images를 올바른 순서로 덮어쓰기 (onUploadComplete의 append 순서를 교정)\n // 복사/생성 모드에서는 호출하지 않음 (linkTempImages가 별도 처리하므로 중복 방지)\n // NOTE: customOrder의 pending ID→hash 교체는 processQueue 내에서 즉시 처리됨\n if (endpoints.reorder && customOrder.length > 0 && onReorder) {\n const allExisting = [...existingFiles, ...uploadedAttachments];\n\n // pending ID를 업로드된 hash로 교체 (이미 setCustomOrder로 갱신되었지만, 클로저 값 기준 재계산)\n const updatedOrder = customOrder.map((id) => {\n const hash = pendingToHashMap.get(String(id));\n return hash ?? id;\n });\n\n const orderMap = new Map(updatedOrder.map((id, idx) => [String(id), idx]));\n const ordered = [...allExisting]\n .sort((a, b) => {\n const aOrder = orderMap.get(String(a.hash)) ?? allExisting.length;\n const bOrder = orderMap.get(String(b.hash)) ?? allExisting.length;\n return aOrder - bOrder;\n })\n .map((item, idx) => ({ ...item, sort_order: idx, order: idx + 1 }));\n\n onReorder(ordered);\n }\n }\n\n return uploadedAttachments;\n }, [pendingFiles, maxConcurrentUploads, uploadSingleFile, onUploadComplete, onUploadError, customOrder, existingFiles, onReorder, endpoints.reorder]);\n\n // 업로드 트리거 이벤트 구독 (uploadTriggerEvent가 있는 경우)\n useEffect(() => {\n if (!uploadTriggerEvent) return;\n\n const unsubscribe = G7Core.componentEvent.on(uploadTriggerEvent, async () => {\n // 업로드할 파일이 있으면 업로드, 없으면 기존 파일 ID 반환\n const uploadedAttachments = await handleUploadAll();\n return {\n uploadedAttachments,\n existingFiles,\n allFiles: [...existingFiles, ...uploadedAttachments],\n };\n });\n\n return () => {\n unsubscribe();\n };\n }, [uploadTriggerEvent, handleUploadAll, existingFiles]);\n\n // autoUpload가 true이고 pendingFiles가 추가되면 자동 업로드\n useEffect(() => {\n if (autoUpload && pendingFiles.some((f) => f.status === 'pending')) {\n handleUploadAll();\n }\n }, [autoUpload, pendingFiles, handleUploadAll]);\n\n // 실제 삭제 실행 (기존 첨부파일)\n const executeRemoveAttachment = useCallback(\n async (item: Attachment) => {\n setIsDeleting(true);\n try {\n // id가 있는 경우만 서버 API 삭제 호출 (복사 모드 등 id 없는 이미지는 로컬 제거만)\n if (item.id && endpoints.delete) {\n const deleteUrl = endpoints.delete.replace(':id', String(item.id));\n await G7Core.api.delete(deleteUrl);\n }\n // 삭제 추적 — id와 hash 모두 기록 (복사 모드 이미지는 id 없이 hash만 존재)\n const itemKey = item.hash || item.id;\n if (item.id) {\n deletedIdsRef.current.add(item.id);\n uploadedFilesRef.current.delete(item.id);\n }\n if (item.hash) {\n deletedIdsRef.current.add(item.hash);\n }\n setExistingFiles((prev) => prev.filter((f) => (f.hash || f.id) !== itemKey));\n onRemove?.(item.hash || item.id);\n setConfirmDialogOpen(false);\n setItemToDelete(null);\n } catch {\n console.error('첨부파일 삭제 실패');\n } finally {\n setIsDeleting(false);\n }\n },\n [onRemove, endpoints.delete]\n );\n\n // 파일 삭제 핸들러 (확인 모달 또는 즉시 삭제)\n const handleRemove = useCallback(\n async (item: PendingFile | Attachment) => {\n if ('hash' in item) {\n // 기존 첨부파일\n if (confirmBeforeRemove) {\n // 확인 모달 표시\n setItemToDelete(item);\n setConfirmDialogOpen(true);\n } else {\n // 즉시 삭제\n await executeRemoveAttachment(item);\n }\n } else {\n // 대기 파일 삭제 (확인 없이 즉시)\n if (item.preview) {\n URL.revokeObjectURL(item.preview);\n }\n setPendingFiles((prev) => prev.filter((f) => f.id !== item.id));\n }\n },\n [confirmBeforeRemove, executeRemoveAttachment]\n );\n\n // 재시도 핸들러\n const handleRetry = useCallback((pendingFile: PendingFile) => {\n setPendingFiles((prev) =>\n prev.map((f) =>\n f.id === pendingFile.id ? { ...f, status: 'pending', error: undefined } : f\n )\n );\n }, []);\n\n // 순서 변경\n const handleDragEnd = useCallback(\n async (event: import('@dnd-kit/core').DragEndEvent) => {\n const { arrayMove } = await import('@dnd-kit/sortable');\n const { active, over } = event;\n if (!over || active.id === over.id) return;\n\n // customOrder 기반으로 시각 순서와 일치하는 allItems 계산\n // (raw [...existingFiles, ...pendingFiles] 는 시각 순서와 다를 수 있음)\n const combined = [...existingFiles, ...pendingFiles];\n let orderedItems: (Attachment | PendingFile)[];\n if (customOrder.length === 0) {\n orderedItems = combined;\n } else {\n const orderMap = new Map(customOrder.map((id, idx) => [String(id), idx]));\n orderedItems = [...combined].sort((a, b) => {\n const aKey = 'hash' in a ? String(a.hash) : String(a.id);\n const bKey = 'hash' in b ? String(b.hash) : String(b.id);\n return (orderMap.get(aKey) ?? combined.length) - (orderMap.get(bKey) ?? combined.length);\n });\n }\n\n const oldIndex = orderedItems.findIndex((item) =>\n 'hash' in item ? item.hash === active.id : item.id === active.id\n );\n const newIndex = orderedItems.findIndex((item) =>\n 'hash' in item ? item.hash === over.id : item.id === over.id\n );\n\n const reordered = arrayMove(orderedItems, oldIndex, newIndex);\n\n // 드래그 순서 보존 (기존/신규 파일 간 섞인 순서 유지)\n setCustomOrder(reordered.map((item) => 'hash' in item ? item.hash : item.id));\n\n // 분리\n const newExisting = reordered.filter((item): item is Attachment => 'hash' in item);\n const newPending = reordered.filter((item): item is PendingFile => !('hash' in item));\n\n // 순서 변경 플래그 설정 (initialFiles 동기화 방지)\n hasReorderedRef.current = true;\n\n setExistingFiles(newExisting);\n setPendingFiles(newPending);\n\n // sort_order/order 필드를 새 인덱스로 갱신 (form.images 동기화용)\n const reorderedFiles = newExisting.map((item, idx) => ({\n ...item,\n sort_order: idx,\n order: idx + 1,\n }));\n\n // 서버에 순서 변경 요청 (기존 파일 + reorder 엔드포인트가 설정된 경우만)\n if (newExisting.length > 0 && endpoints.reorder) {\n const orderData = newExisting.map((item, index) => ({\n id: item.id,\n order: index + 1,\n }));\n\n try {\n const response = await G7Core.api.patch(endpoints.reorder, { order: orderData });\n G7Core.toast.success(response.message);\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : t('attachment.reorder_failed');\n G7Core.toast.error(message);\n }\n }\n\n // API 호출 성공/스킵 무관하게 항상 콜백 호출\n onReorder?.(reorderedFiles);\n },\n [existingFiles, pendingFiles, customOrder, endpoints.reorder, onReorder]\n );\n\n // 이미지 파일만 필터링 (갤러리용)\n const imageFiles = useMemo(\n () =>\n [...existingFiles, ...pendingFiles].filter((item) => {\n if ('is_image' in item) {\n // Attachment (기존 첨부파일) - is_image 필드 우선 사용\n return (item as Attachment).is_image;\n }\n // PendingFile (대기 파일) - mime_type으로 확인\n return item.mime_type?.startsWith('image/') ?? false;\n }),\n [existingFiles, pendingFiles]\n );\n\n // 갤러리 열기 (이미지 인덱스로)\n const handleOpenGallery = useCallback(\n (item: PendingFile | Attachment) => {\n // 클릭된 아이템의 인덱스를 imageFiles에서 찾기\n const imageIndex = imageFiles.findIndex((img) => {\n // 둘 다 Attachment인 경우 (hash로 비교)\n if ('hash' in item && 'hash' in img) {\n return img.hash === item.hash;\n }\n // 둘 다 PendingFile인 경우 (id로 비교)\n if ('id' in item && 'id' in img && !('hash' in item) && !('hash' in img)) {\n return img.id === item.id;\n }\n return false;\n });\n if (imageIndex !== -1) {\n // 갤러리를 열 때마다 key 증가 (강제 리마운트)\n galleryKeyRef.current += 1;\n setGalleryStartIndex(imageIndex);\n setGalleryOpen(true);\n }\n },\n [imageFiles]\n );\n\n // 기존 첨부파일 인증된 이미지 URL 로드 (갤러리용)\n useEffect(() => {\n let cancelled = false;\n\n const loadAuthenticatedUrls = async () => {\n // is_image 필드 사용 (imageFiles 필터와 일치)\n const existingImageFiles = existingFiles.filter((f) => f.is_image);\n\n // existingFiles에서 제거된 파일의 URL 정리\n const currentIds = new Set(existingImageFiles.map((f) => f.id));\n for (const [id, url] of authenticatedImageUrlsRef.current) {\n if (!currentIds.has(id)) {\n URL.revokeObjectURL(url);\n authenticatedImageUrlsRef.current.delete(id);\n }\n }\n\n for (const file of existingImageFiles) {\n if (cancelled) break;\n // ref 기반 has 체크 (stale closure 방지)\n if (authenticatedImageUrlsRef.current.has(file.id)) continue;\n\n try {\n const blob = await G7Core.api.get(file.download_url, {\n responseType: 'blob',\n });\n if (!cancelled && blob) {\n const objectUrl = URL.createObjectURL(blob);\n authenticatedImageUrlsRef.current.set(file.id, objectUrl);\n setAuthenticatedImageUrls(new Map(authenticatedImageUrlsRef.current));\n }\n } catch (error) {\n console.error('Failed to load authenticated image:', error);\n }\n }\n };\n\n loadAuthenticatedUrls();\n\n return () => {\n cancelled = true;\n };\n }, [existingFiles]);\n\n // 언마운트 시에만 모든 인증된 이미지 URL 해제\n useEffect(() => {\n return () => {\n authenticatedImageUrlsRef.current.forEach((url) => URL.revokeObjectURL(url));\n authenticatedImageUrlsRef.current.clear();\n };\n }, []);\n\n // 파일 다운로드 실행\n const handleDownload = useCallback(async (item: Attachment) => {\n const { executeImageDownload } = await import('../ImageGallery');\n await executeImageDownload({\n src: item.download_url,\n downloadUrl: item.download_url,\n filename: item.original_filename,\n downloadRequiresAuth: true,\n });\n }, []);\n\n // 계산된 값 (customOrder가 있으면 드래그 순서 유지, 없으면 기본 순서)\n const allItems = useMemo(() => {\n const combined = [...existingFiles, ...pendingFiles];\n if (customOrder.length === 0) return combined;\n\n const orderMap = new Map(customOrder.map((id, idx) => [String(id), idx]));\n return [...combined].sort((a, b) => {\n const aKey = 'hash' in a ? String(a.hash) : String(a.id);\n const bKey = 'hash' in b ? String(b.hash) : String(b.id);\n const aOrder = orderMap.get(aKey) ?? combined.length;\n const bOrder = orderMap.get(bKey) ?? combined.length;\n return aOrder - bOrder;\n });\n }, [existingFiles, pendingFiles, customOrder]);\n const totalCount = allItems.length;\n const hasFiles = totalCount > 0;\n const canAddMore = totalCount < maxFiles;\n\n // 초기화 함수들\n const clear = useCallback(() => setPendingFiles([]), []);\n const getPendingFiles = useCallback(() => pendingFiles, [pendingFiles]);\n\n return {\n // 상태\n existingFiles,\n pendingFiles,\n isDragOver,\n setIsDragOver,\n isDeleting,\n\n // 계산된 값\n totalCount,\n hasFiles,\n canAddMore,\n allItems,\n imageFiles,\n\n // 액션\n handleFiles,\n handleRemove,\n handleRetry,\n handleUploadAll,\n handleOpenGallery,\n handleDownload,\n handleDragEnd,\n\n // Input ref\n inputRef,\n\n // 갤러리 상태\n galleryOpen,\n setGalleryOpen,\n galleryStartIndex,\n galleryKeyRef,\n\n // 삭제 확인 모달 상태\n confirmDialogOpen,\n setConfirmDialogOpen,\n itemToDelete,\n executeRemoveAttachment,\n\n // 인증된 이미지 URL 캐시\n authenticatedImageUrls,\n\n // 초기화\n clear,\n getPendingFiles,\n };\n}\n\nexport default useFileUploader;","/**\n * FileDropZone 컴포넌트\n *\n * 파일을 드래그 앤 드롭하거나 클릭하여 선택할 수 있는 영역입니다.\n *\n * @module composite/FileUploader/FileDropZone\n */\n\nimport React from 'react';\n\nimport { Div } from '../../basic/Div';\nimport { P } from '../../basic/P';\nimport { I } from '../../basic/I';\n\nimport { t } from './utils';\n\nexport interface FileDropZoneProps {\n /** 드래그 오버 상태 */\n isDragOver: boolean;\n /** 추가 가능 여부 */\n canAddMore: boolean;\n /** 파일 처리 핸들러 */\n onFiles: (files: FileList) => void;\n /** 드래그 오버 상태 설정 */\n setIsDragOver: (value: boolean) => void;\n /** Input 요소 ref */\n inputRef: React.RefObject;\n /** 허용 확장자 */\n accept?: string;\n /** 최대 파일 수 */\n maxFiles: number;\n /** 최대 파일 크기 (MB) */\n maxSize: number;\n /** 자식 요소 */\n children?: React.ReactNode;\n}\n\nexport const FileDropZone: React.FC = ({\n isDragOver,\n canAddMore,\n onFiles,\n setIsDragOver,\n inputRef,\n accept,\n maxFiles,\n maxSize,\n children,\n}) => {\n return (\n {\n e.preventDefault();\n if (canAddMore) setIsDragOver(true);\n }}\n onDragLeave={() => setIsDragOver(false)}\n onDrop={(e) => {\n e.preventDefault();\n setIsDragOver(false);\n if (canAddMore) {\n onFiles(e.dataTransfer.files);\n }\n }}\n >\n e.target.files && onFiles(e.target.files)}\n className=\"hidden\"\n />\n\n {/* 파일이 없을 때: 빈 드롭존 */}\n {!children && (\n inputRef.current?.click()}\n >\n \n

\n {t('attachment.drop_or_click')}\n

\n

\n {t('attachment.upload_limit', { maxFiles, maxSize })}\n {accept && ` (${accept})`}\n

\n
\n )}\n\n {/* 파일이 있을 때: 자식 요소 렌더링 */}\n {children}\n
\n );\n};\n\nexport default FileDropZone;","import { useMemo, useLayoutEffect, useEffect, useRef, useCallback } from 'react';\n\nfunction useCombinedRefs() {\n for (var _len = arguments.length, refs = new Array(_len), _key = 0; _key < _len; _key++) {\n refs[_key] = arguments[_key];\n }\n\n return useMemo(() => node => {\n refs.forEach(ref => ref(node));\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n refs);\n}\n\n// https://github.com/facebook/react/blob/master/packages/shared/ExecutionEnvironment.js\nconst canUseDOM = typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined';\n\nfunction isWindow(element) {\n const elementString = Object.prototype.toString.call(element);\n return elementString === '[object Window]' || // In Electron context the Window object serializes to [object global]\n elementString === '[object global]';\n}\n\nfunction isNode(node) {\n return 'nodeType' in node;\n}\n\nfunction getWindow(target) {\n var _target$ownerDocument, _target$ownerDocument2;\n\n if (!target) {\n return window;\n }\n\n if (isWindow(target)) {\n return target;\n }\n\n if (!isNode(target)) {\n return window;\n }\n\n return (_target$ownerDocument = (_target$ownerDocument2 = target.ownerDocument) == null ? void 0 : _target$ownerDocument2.defaultView) != null ? _target$ownerDocument : window;\n}\n\nfunction isDocument(node) {\n const {\n Document\n } = getWindow(node);\n return node instanceof Document;\n}\n\nfunction isHTMLElement(node) {\n if (isWindow(node)) {\n return false;\n }\n\n return node instanceof getWindow(node).HTMLElement;\n}\n\nfunction isSVGElement(node) {\n return node instanceof getWindow(node).SVGElement;\n}\n\nfunction getOwnerDocument(target) {\n if (!target) {\n return document;\n }\n\n if (isWindow(target)) {\n return target.document;\n }\n\n if (!isNode(target)) {\n return document;\n }\n\n if (isDocument(target)) {\n return target;\n }\n\n if (isHTMLElement(target) || isSVGElement(target)) {\n return target.ownerDocument;\n }\n\n return document;\n}\n\n/**\r\n * A hook that resolves to useEffect on the server and useLayoutEffect on the client\r\n * @param callback {function} Callback function that is invoked when the dependencies of the hook change\r\n */\n\nconst useIsomorphicLayoutEffect = canUseDOM ? useLayoutEffect : useEffect;\n\nfunction useEvent(handler) {\n const handlerRef = useRef(handler);\n useIsomorphicLayoutEffect(() => {\n handlerRef.current = handler;\n });\n return useCallback(function () {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return handlerRef.current == null ? void 0 : handlerRef.current(...args);\n }, []);\n}\n\nfunction useInterval() {\n const intervalRef = useRef(null);\n const set = useCallback((listener, duration) => {\n intervalRef.current = setInterval(listener, duration);\n }, []);\n const clear = useCallback(() => {\n if (intervalRef.current !== null) {\n clearInterval(intervalRef.current);\n intervalRef.current = null;\n }\n }, []);\n return [set, clear];\n}\n\nfunction useLatestValue(value, dependencies) {\n if (dependencies === void 0) {\n dependencies = [value];\n }\n\n const valueRef = useRef(value);\n useIsomorphicLayoutEffect(() => {\n if (valueRef.current !== value) {\n valueRef.current = value;\n }\n }, dependencies);\n return valueRef;\n}\n\nfunction useLazyMemo(callback, dependencies) {\n const valueRef = useRef();\n return useMemo(() => {\n const newValue = callback(valueRef.current);\n valueRef.current = newValue;\n return newValue;\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n [...dependencies]);\n}\n\nfunction useNodeRef(onChange) {\n const onChangeHandler = useEvent(onChange);\n const node = useRef(null);\n const setNodeRef = useCallback(element => {\n if (element !== node.current) {\n onChangeHandler == null ? void 0 : onChangeHandler(element, node.current);\n }\n\n node.current = element;\n }, //eslint-disable-next-line\n []);\n return [node, setNodeRef];\n}\n\nfunction usePrevious(value) {\n const ref = useRef();\n useEffect(() => {\n ref.current = value;\n }, [value]);\n return ref.current;\n}\n\nlet ids = {};\nfunction useUniqueId(prefix, value) {\n return useMemo(() => {\n if (value) {\n return value;\n }\n\n const id = ids[prefix] == null ? 0 : ids[prefix] + 1;\n ids[prefix] = id;\n return prefix + \"-\" + id;\n }, [prefix, value]);\n}\n\nfunction createAdjustmentFn(modifier) {\n return function (object) {\n for (var _len = arguments.length, adjustments = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n adjustments[_key - 1] = arguments[_key];\n }\n\n return adjustments.reduce((accumulator, adjustment) => {\n const entries = Object.entries(adjustment);\n\n for (const [key, valueAdjustment] of entries) {\n const value = accumulator[key];\n\n if (value != null) {\n accumulator[key] = value + modifier * valueAdjustment;\n }\n }\n\n return accumulator;\n }, { ...object\n });\n };\n}\n\nconst add = /*#__PURE__*/createAdjustmentFn(1);\nconst subtract = /*#__PURE__*/createAdjustmentFn(-1);\n\nfunction hasViewportRelativeCoordinates(event) {\n return 'clientX' in event && 'clientY' in event;\n}\n\nfunction isKeyboardEvent(event) {\n if (!event) {\n return false;\n }\n\n const {\n KeyboardEvent\n } = getWindow(event.target);\n return KeyboardEvent && event instanceof KeyboardEvent;\n}\n\nfunction isTouchEvent(event) {\n if (!event) {\n return false;\n }\n\n const {\n TouchEvent\n } = getWindow(event.target);\n return TouchEvent && event instanceof TouchEvent;\n}\n\n/**\r\n * Returns the normalized x and y coordinates for mouse and touch events.\r\n */\n\nfunction getEventCoordinates(event) {\n if (isTouchEvent(event)) {\n if (event.touches && event.touches.length) {\n const {\n clientX: x,\n clientY: y\n } = event.touches[0];\n return {\n x,\n y\n };\n } else if (event.changedTouches && event.changedTouches.length) {\n const {\n clientX: x,\n clientY: y\n } = event.changedTouches[0];\n return {\n x,\n y\n };\n }\n }\n\n if (hasViewportRelativeCoordinates(event)) {\n return {\n x: event.clientX,\n y: event.clientY\n };\n }\n\n return null;\n}\n\nconst CSS = /*#__PURE__*/Object.freeze({\n Translate: {\n toString(transform) {\n if (!transform) {\n return;\n }\n\n const {\n x,\n y\n } = transform;\n return \"translate3d(\" + (x ? Math.round(x) : 0) + \"px, \" + (y ? Math.round(y) : 0) + \"px, 0)\";\n }\n\n },\n Scale: {\n toString(transform) {\n if (!transform) {\n return;\n }\n\n const {\n scaleX,\n scaleY\n } = transform;\n return \"scaleX(\" + scaleX + \") scaleY(\" + scaleY + \")\";\n }\n\n },\n Transform: {\n toString(transform) {\n if (!transform) {\n return;\n }\n\n return [CSS.Translate.toString(transform), CSS.Scale.toString(transform)].join(' ');\n }\n\n },\n Transition: {\n toString(_ref) {\n let {\n property,\n duration,\n easing\n } = _ref;\n return property + \" \" + duration + \"ms \" + easing;\n }\n\n }\n});\n\nconst SELECTOR = 'a,frame,iframe,input:not([type=hidden]):not(:disabled),select:not(:disabled),textarea:not(:disabled),button:not(:disabled),*[tabindex]';\nfunction findFirstFocusableNode(element) {\n if (element.matches(SELECTOR)) {\n return element;\n }\n\n return element.querySelector(SELECTOR);\n}\n\nexport { CSS, add, canUseDOM, findFirstFocusableNode, getEventCoordinates, getOwnerDocument, getWindow, hasViewportRelativeCoordinates, isDocument, isHTMLElement, isKeyboardEvent, isNode, isSVGElement, isTouchEvent, isWindow, subtract, useCombinedRefs, useEvent, useInterval, useIsomorphicLayoutEffect, useLatestValue, useLazyMemo, useNodeRef, usePrevious, useUniqueId };\n//# sourceMappingURL=utilities.esm.js.map\n","import React, { useState, useCallback } from 'react';\n\nconst hiddenStyles = {\n display: 'none'\n};\nfunction HiddenText(_ref) {\n let {\n id,\n value\n } = _ref;\n return React.createElement(\"div\", {\n id: id,\n style: hiddenStyles\n }, value);\n}\n\nfunction LiveRegion(_ref) {\n let {\n id,\n announcement,\n ariaLiveType = \"assertive\"\n } = _ref;\n // Hide element visually but keep it readable by screen readers\n const visuallyHidden = {\n position: 'fixed',\n top: 0,\n left: 0,\n width: 1,\n height: 1,\n margin: -1,\n border: 0,\n padding: 0,\n overflow: 'hidden',\n clip: 'rect(0 0 0 0)',\n clipPath: 'inset(100%)',\n whiteSpace: 'nowrap'\n };\n return React.createElement(\"div\", {\n id: id,\n style: visuallyHidden,\n role: \"status\",\n \"aria-live\": ariaLiveType,\n \"aria-atomic\": true\n }, announcement);\n}\n\nfunction useAnnouncement() {\n const [announcement, setAnnouncement] = useState('');\n const announce = useCallback(value => {\n if (value != null) {\n setAnnouncement(value);\n }\n }, []);\n return {\n announce,\n announcement\n };\n}\n\nexport { HiddenText, LiveRegion, useAnnouncement };\n//# sourceMappingURL=accessibility.esm.js.map\n","import React, { createContext, useContext, useEffect, useState, useCallback, useMemo, useRef, memo, useReducer, cloneElement, forwardRef } from 'react';\nimport { createPortal, unstable_batchedUpdates } from 'react-dom';\nimport { useUniqueId, getEventCoordinates, getWindow, isDocument, isHTMLElement, isSVGElement, canUseDOM, isWindow, isNode, getOwnerDocument, add, isKeyboardEvent, subtract, useLazyMemo, useInterval, usePrevious, useLatestValue, useEvent, useIsomorphicLayoutEffect, useNodeRef, findFirstFocusableNode, CSS } from '@dnd-kit/utilities';\nimport { useAnnouncement, HiddenText, LiveRegion } from '@dnd-kit/accessibility';\n\nconst DndMonitorContext = /*#__PURE__*/createContext(null);\n\nfunction useDndMonitor(listener) {\n const registerListener = useContext(DndMonitorContext);\n useEffect(() => {\n if (!registerListener) {\n throw new Error('useDndMonitor must be used within a children of ');\n }\n\n const unsubscribe = registerListener(listener);\n return unsubscribe;\n }, [listener, registerListener]);\n}\n\nfunction useDndMonitorProvider() {\n const [listeners] = useState(() => new Set());\n const registerListener = useCallback(listener => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n }, [listeners]);\n const dispatch = useCallback(_ref => {\n let {\n type,\n event\n } = _ref;\n listeners.forEach(listener => {\n var _listener$type;\n\n return (_listener$type = listener[type]) == null ? void 0 : _listener$type.call(listener, event);\n });\n }, [listeners]);\n return [dispatch, registerListener];\n}\n\nconst defaultScreenReaderInstructions = {\n draggable: \"\\n To pick up a draggable item, press the space bar.\\n While dragging, use the arrow keys to move the item.\\n Press space again to drop the item in its new position, or press escape to cancel.\\n \"\n};\nconst defaultAnnouncements = {\n onDragStart(_ref) {\n let {\n active\n } = _ref;\n return \"Picked up draggable item \" + active.id + \".\";\n },\n\n onDragOver(_ref2) {\n let {\n active,\n over\n } = _ref2;\n\n if (over) {\n return \"Draggable item \" + active.id + \" was moved over droppable area \" + over.id + \".\";\n }\n\n return \"Draggable item \" + active.id + \" is no longer over a droppable area.\";\n },\n\n onDragEnd(_ref3) {\n let {\n active,\n over\n } = _ref3;\n\n if (over) {\n return \"Draggable item \" + active.id + \" was dropped over droppable area \" + over.id;\n }\n\n return \"Draggable item \" + active.id + \" was dropped.\";\n },\n\n onDragCancel(_ref4) {\n let {\n active\n } = _ref4;\n return \"Dragging was cancelled. Draggable item \" + active.id + \" was dropped.\";\n }\n\n};\n\nfunction Accessibility(_ref) {\n let {\n announcements = defaultAnnouncements,\n container,\n hiddenTextDescribedById,\n screenReaderInstructions = defaultScreenReaderInstructions\n } = _ref;\n const {\n announce,\n announcement\n } = useAnnouncement();\n const liveRegionId = useUniqueId(\"DndLiveRegion\");\n const [mounted, setMounted] = useState(false);\n useEffect(() => {\n setMounted(true);\n }, []);\n useDndMonitor(useMemo(() => ({\n onDragStart(_ref2) {\n let {\n active\n } = _ref2;\n announce(announcements.onDragStart({\n active\n }));\n },\n\n onDragMove(_ref3) {\n let {\n active,\n over\n } = _ref3;\n\n if (announcements.onDragMove) {\n announce(announcements.onDragMove({\n active,\n over\n }));\n }\n },\n\n onDragOver(_ref4) {\n let {\n active,\n over\n } = _ref4;\n announce(announcements.onDragOver({\n active,\n over\n }));\n },\n\n onDragEnd(_ref5) {\n let {\n active,\n over\n } = _ref5;\n announce(announcements.onDragEnd({\n active,\n over\n }));\n },\n\n onDragCancel(_ref6) {\n let {\n active,\n over\n } = _ref6;\n announce(announcements.onDragCancel({\n active,\n over\n }));\n }\n\n }), [announce, announcements]));\n\n if (!mounted) {\n return null;\n }\n\n const markup = React.createElement(React.Fragment, null, React.createElement(HiddenText, {\n id: hiddenTextDescribedById,\n value: screenReaderInstructions.draggable\n }), React.createElement(LiveRegion, {\n id: liveRegionId,\n announcement: announcement\n }));\n return container ? createPortal(markup, container) : markup;\n}\n\nvar Action;\n\n(function (Action) {\n Action[\"DragStart\"] = \"dragStart\";\n Action[\"DragMove\"] = \"dragMove\";\n Action[\"DragEnd\"] = \"dragEnd\";\n Action[\"DragCancel\"] = \"dragCancel\";\n Action[\"DragOver\"] = \"dragOver\";\n Action[\"RegisterDroppable\"] = \"registerDroppable\";\n Action[\"SetDroppableDisabled\"] = \"setDroppableDisabled\";\n Action[\"UnregisterDroppable\"] = \"unregisterDroppable\";\n})(Action || (Action = {}));\n\nfunction noop() {}\n\nfunction useSensor(sensor, options) {\n return useMemo(() => ({\n sensor,\n options: options != null ? options : {}\n }), // eslint-disable-next-line react-hooks/exhaustive-deps\n [sensor, options]);\n}\n\nfunction useSensors() {\n for (var _len = arguments.length, sensors = new Array(_len), _key = 0; _key < _len; _key++) {\n sensors[_key] = arguments[_key];\n }\n\n return useMemo(() => [...sensors].filter(sensor => sensor != null), // eslint-disable-next-line react-hooks/exhaustive-deps\n [...sensors]);\n}\n\nconst defaultCoordinates = /*#__PURE__*/Object.freeze({\n x: 0,\n y: 0\n});\n\n/**\r\n * Returns the distance between two points\r\n */\nfunction distanceBetween(p1, p2) {\n return Math.sqrt(Math.pow(p1.x - p2.x, 2) + Math.pow(p1.y - p2.y, 2));\n}\n\nfunction getRelativeTransformOrigin(event, rect) {\n const eventCoordinates = getEventCoordinates(event);\n\n if (!eventCoordinates) {\n return '0 0';\n }\n\n const transformOrigin = {\n x: (eventCoordinates.x - rect.left) / rect.width * 100,\n y: (eventCoordinates.y - rect.top) / rect.height * 100\n };\n return transformOrigin.x + \"% \" + transformOrigin.y + \"%\";\n}\n\n/**\r\n * Sort collisions from smallest to greatest value\r\n */\nfunction sortCollisionsAsc(_ref, _ref2) {\n let {\n data: {\n value: a\n }\n } = _ref;\n let {\n data: {\n value: b\n }\n } = _ref2;\n return a - b;\n}\n/**\r\n * Sort collisions from greatest to smallest value\r\n */\n\nfunction sortCollisionsDesc(_ref3, _ref4) {\n let {\n data: {\n value: a\n }\n } = _ref3;\n let {\n data: {\n value: b\n }\n } = _ref4;\n return b - a;\n}\n/**\r\n * Returns the coordinates of the corners of a given rectangle:\r\n * [TopLeft {x, y}, TopRight {x, y}, BottomLeft {x, y}, BottomRight {x, y}]\r\n */\n\nfunction cornersOfRectangle(_ref5) {\n let {\n left,\n top,\n height,\n width\n } = _ref5;\n return [{\n x: left,\n y: top\n }, {\n x: left + width,\n y: top\n }, {\n x: left,\n y: top + height\n }, {\n x: left + width,\n y: top + height\n }];\n}\nfunction getFirstCollision(collisions, property) {\n if (!collisions || collisions.length === 0) {\n return null;\n }\n\n const [firstCollision] = collisions;\n return property ? firstCollision[property] : firstCollision;\n}\n\n/**\r\n * Returns the coordinates of the center of a given ClientRect\r\n */\n\nfunction centerOfRectangle(rect, left, top) {\n if (left === void 0) {\n left = rect.left;\n }\n\n if (top === void 0) {\n top = rect.top;\n }\n\n return {\n x: left + rect.width * 0.5,\n y: top + rect.height * 0.5\n };\n}\n/**\r\n * Returns the closest rectangles from an array of rectangles to the center of a given\r\n * rectangle.\r\n */\n\n\nconst closestCenter = _ref => {\n let {\n collisionRect,\n droppableRects,\n droppableContainers\n } = _ref;\n const centerRect = centerOfRectangle(collisionRect, collisionRect.left, collisionRect.top);\n const collisions = [];\n\n for (const droppableContainer of droppableContainers) {\n const {\n id\n } = droppableContainer;\n const rect = droppableRects.get(id);\n\n if (rect) {\n const distBetween = distanceBetween(centerOfRectangle(rect), centerRect);\n collisions.push({\n id,\n data: {\n droppableContainer,\n value: distBetween\n }\n });\n }\n }\n\n return collisions.sort(sortCollisionsAsc);\n};\n\n/**\r\n * Returns the closest rectangles from an array of rectangles to the corners of\r\n * another rectangle.\r\n */\n\nconst closestCorners = _ref => {\n let {\n collisionRect,\n droppableRects,\n droppableContainers\n } = _ref;\n const corners = cornersOfRectangle(collisionRect);\n const collisions = [];\n\n for (const droppableContainer of droppableContainers) {\n const {\n id\n } = droppableContainer;\n const rect = droppableRects.get(id);\n\n if (rect) {\n const rectCorners = cornersOfRectangle(rect);\n const distances = corners.reduce((accumulator, corner, index) => {\n return accumulator + distanceBetween(rectCorners[index], corner);\n }, 0);\n const effectiveDistance = Number((distances / 4).toFixed(4));\n collisions.push({\n id,\n data: {\n droppableContainer,\n value: effectiveDistance\n }\n });\n }\n }\n\n return collisions.sort(sortCollisionsAsc);\n};\n\n/**\r\n * Returns the intersecting rectangle area between two rectangles\r\n */\n\nfunction getIntersectionRatio(entry, target) {\n const top = Math.max(target.top, entry.top);\n const left = Math.max(target.left, entry.left);\n const right = Math.min(target.left + target.width, entry.left + entry.width);\n const bottom = Math.min(target.top + target.height, entry.top + entry.height);\n const width = right - left;\n const height = bottom - top;\n\n if (left < right && top < bottom) {\n const targetArea = target.width * target.height;\n const entryArea = entry.width * entry.height;\n const intersectionArea = width * height;\n const intersectionRatio = intersectionArea / (targetArea + entryArea - intersectionArea);\n return Number(intersectionRatio.toFixed(4));\n } // Rectangles do not overlap, or overlap has an area of zero (edge/corner overlap)\n\n\n return 0;\n}\n/**\r\n * Returns the rectangles that has the greatest intersection area with a given\r\n * rectangle in an array of rectangles.\r\n */\n\nconst rectIntersection = _ref => {\n let {\n collisionRect,\n droppableRects,\n droppableContainers\n } = _ref;\n const collisions = [];\n\n for (const droppableContainer of droppableContainers) {\n const {\n id\n } = droppableContainer;\n const rect = droppableRects.get(id);\n\n if (rect) {\n const intersectionRatio = getIntersectionRatio(rect, collisionRect);\n\n if (intersectionRatio > 0) {\n collisions.push({\n id,\n data: {\n droppableContainer,\n value: intersectionRatio\n }\n });\n }\n }\n }\n\n return collisions.sort(sortCollisionsDesc);\n};\n\n/**\r\n * Check if a given point is contained within a bounding rectangle\r\n */\n\nfunction isPointWithinRect(point, rect) {\n const {\n top,\n left,\n bottom,\n right\n } = rect;\n return top <= point.y && point.y <= bottom && left <= point.x && point.x <= right;\n}\n/**\r\n * Returns the rectangles that the pointer is hovering over\r\n */\n\n\nconst pointerWithin = _ref => {\n let {\n droppableContainers,\n droppableRects,\n pointerCoordinates\n } = _ref;\n\n if (!pointerCoordinates) {\n return [];\n }\n\n const collisions = [];\n\n for (const droppableContainer of droppableContainers) {\n const {\n id\n } = droppableContainer;\n const rect = droppableRects.get(id);\n\n if (rect && isPointWithinRect(pointerCoordinates, rect)) {\n /* There may be more than a single rectangle intersecting\r\n * with the pointer coordinates. In order to sort the\r\n * colliding rectangles, we measure the distance between\r\n * the pointer and the corners of the intersecting rectangle\r\n */\n const corners = cornersOfRectangle(rect);\n const distances = corners.reduce((accumulator, corner) => {\n return accumulator + distanceBetween(pointerCoordinates, corner);\n }, 0);\n const effectiveDistance = Number((distances / 4).toFixed(4));\n collisions.push({\n id,\n data: {\n droppableContainer,\n value: effectiveDistance\n }\n });\n }\n }\n\n return collisions.sort(sortCollisionsAsc);\n};\n\nfunction adjustScale(transform, rect1, rect2) {\n return { ...transform,\n scaleX: rect1 && rect2 ? rect1.width / rect2.width : 1,\n scaleY: rect1 && rect2 ? rect1.height / rect2.height : 1\n };\n}\n\nfunction getRectDelta(rect1, rect2) {\n return rect1 && rect2 ? {\n x: rect1.left - rect2.left,\n y: rect1.top - rect2.top\n } : defaultCoordinates;\n}\n\nfunction createRectAdjustmentFn(modifier) {\n return function adjustClientRect(rect) {\n for (var _len = arguments.length, adjustments = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n adjustments[_key - 1] = arguments[_key];\n }\n\n return adjustments.reduce((acc, adjustment) => ({ ...acc,\n top: acc.top + modifier * adjustment.y,\n bottom: acc.bottom + modifier * adjustment.y,\n left: acc.left + modifier * adjustment.x,\n right: acc.right + modifier * adjustment.x\n }), { ...rect\n });\n };\n}\nconst getAdjustedRect = /*#__PURE__*/createRectAdjustmentFn(1);\n\nfunction parseTransform(transform) {\n if (transform.startsWith('matrix3d(')) {\n const transformArray = transform.slice(9, -1).split(/, /);\n return {\n x: +transformArray[12],\n y: +transformArray[13],\n scaleX: +transformArray[0],\n scaleY: +transformArray[5]\n };\n } else if (transform.startsWith('matrix(')) {\n const transformArray = transform.slice(7, -1).split(/, /);\n return {\n x: +transformArray[4],\n y: +transformArray[5],\n scaleX: +transformArray[0],\n scaleY: +transformArray[3]\n };\n }\n\n return null;\n}\n\nfunction inverseTransform(rect, transform, transformOrigin) {\n const parsedTransform = parseTransform(transform);\n\n if (!parsedTransform) {\n return rect;\n }\n\n const {\n scaleX,\n scaleY,\n x: translateX,\n y: translateY\n } = parsedTransform;\n const x = rect.left - translateX - (1 - scaleX) * parseFloat(transformOrigin);\n const y = rect.top - translateY - (1 - scaleY) * parseFloat(transformOrigin.slice(transformOrigin.indexOf(' ') + 1));\n const w = scaleX ? rect.width / scaleX : rect.width;\n const h = scaleY ? rect.height / scaleY : rect.height;\n return {\n width: w,\n height: h,\n top: y,\n right: x + w,\n bottom: y + h,\n left: x\n };\n}\n\nconst defaultOptions = {\n ignoreTransform: false\n};\n/**\r\n * Returns the bounding client rect of an element relative to the viewport.\r\n */\n\nfunction getClientRect(element, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n let rect = element.getBoundingClientRect();\n\n if (options.ignoreTransform) {\n const {\n transform,\n transformOrigin\n } = getWindow(element).getComputedStyle(element);\n\n if (transform) {\n rect = inverseTransform(rect, transform, transformOrigin);\n }\n }\n\n const {\n top,\n left,\n width,\n height,\n bottom,\n right\n } = rect;\n return {\n top,\n left,\n width,\n height,\n bottom,\n right\n };\n}\n/**\r\n * Returns the bounding client rect of an element relative to the viewport.\r\n *\r\n * @remarks\r\n * The ClientRect returned by this method does not take into account transforms\r\n * applied to the element it measures.\r\n *\r\n */\n\nfunction getTransformAgnosticClientRect(element) {\n return getClientRect(element, {\n ignoreTransform: true\n });\n}\n\nfunction getWindowClientRect(element) {\n const width = element.innerWidth;\n const height = element.innerHeight;\n return {\n top: 0,\n left: 0,\n right: width,\n bottom: height,\n width,\n height\n };\n}\n\nfunction isFixed(node, computedStyle) {\n if (computedStyle === void 0) {\n computedStyle = getWindow(node).getComputedStyle(node);\n }\n\n return computedStyle.position === 'fixed';\n}\n\nfunction isScrollable(element, computedStyle) {\n if (computedStyle === void 0) {\n computedStyle = getWindow(element).getComputedStyle(element);\n }\n\n const overflowRegex = /(auto|scroll|overlay)/;\n const properties = ['overflow', 'overflowX', 'overflowY'];\n return properties.some(property => {\n const value = computedStyle[property];\n return typeof value === 'string' ? overflowRegex.test(value) : false;\n });\n}\n\nfunction getScrollableAncestors(element, limit) {\n const scrollParents = [];\n\n function findScrollableAncestors(node) {\n if (limit != null && scrollParents.length >= limit) {\n return scrollParents;\n }\n\n if (!node) {\n return scrollParents;\n }\n\n if (isDocument(node) && node.scrollingElement != null && !scrollParents.includes(node.scrollingElement)) {\n scrollParents.push(node.scrollingElement);\n return scrollParents;\n }\n\n if (!isHTMLElement(node) || isSVGElement(node)) {\n return scrollParents;\n }\n\n if (scrollParents.includes(node)) {\n return scrollParents;\n }\n\n const computedStyle = getWindow(element).getComputedStyle(node);\n\n if (node !== element) {\n if (isScrollable(node, computedStyle)) {\n scrollParents.push(node);\n }\n }\n\n if (isFixed(node, computedStyle)) {\n return scrollParents;\n }\n\n return findScrollableAncestors(node.parentNode);\n }\n\n if (!element) {\n return scrollParents;\n }\n\n return findScrollableAncestors(element);\n}\nfunction getFirstScrollableAncestor(node) {\n const [firstScrollableAncestor] = getScrollableAncestors(node, 1);\n return firstScrollableAncestor != null ? firstScrollableAncestor : null;\n}\n\nfunction getScrollableElement(element) {\n if (!canUseDOM || !element) {\n return null;\n }\n\n if (isWindow(element)) {\n return element;\n }\n\n if (!isNode(element)) {\n return null;\n }\n\n if (isDocument(element) || element === getOwnerDocument(element).scrollingElement) {\n return window;\n }\n\n if (isHTMLElement(element)) {\n return element;\n }\n\n return null;\n}\n\nfunction getScrollXCoordinate(element) {\n if (isWindow(element)) {\n return element.scrollX;\n }\n\n return element.scrollLeft;\n}\nfunction getScrollYCoordinate(element) {\n if (isWindow(element)) {\n return element.scrollY;\n }\n\n return element.scrollTop;\n}\nfunction getScrollCoordinates(element) {\n return {\n x: getScrollXCoordinate(element),\n y: getScrollYCoordinate(element)\n };\n}\n\nvar Direction;\n\n(function (Direction) {\n Direction[Direction[\"Forward\"] = 1] = \"Forward\";\n Direction[Direction[\"Backward\"] = -1] = \"Backward\";\n})(Direction || (Direction = {}));\n\nfunction isDocumentScrollingElement(element) {\n if (!canUseDOM || !element) {\n return false;\n }\n\n return element === document.scrollingElement;\n}\n\nfunction getScrollPosition(scrollingContainer) {\n const minScroll = {\n x: 0,\n y: 0\n };\n const dimensions = isDocumentScrollingElement(scrollingContainer) ? {\n height: window.innerHeight,\n width: window.innerWidth\n } : {\n height: scrollingContainer.clientHeight,\n width: scrollingContainer.clientWidth\n };\n const maxScroll = {\n x: scrollingContainer.scrollWidth - dimensions.width,\n y: scrollingContainer.scrollHeight - dimensions.height\n };\n const isTop = scrollingContainer.scrollTop <= minScroll.y;\n const isLeft = scrollingContainer.scrollLeft <= minScroll.x;\n const isBottom = scrollingContainer.scrollTop >= maxScroll.y;\n const isRight = scrollingContainer.scrollLeft >= maxScroll.x;\n return {\n isTop,\n isLeft,\n isBottom,\n isRight,\n maxScroll,\n minScroll\n };\n}\n\nconst defaultThreshold = {\n x: 0.2,\n y: 0.2\n};\nfunction getScrollDirectionAndSpeed(scrollContainer, scrollContainerRect, _ref, acceleration, thresholdPercentage) {\n let {\n top,\n left,\n right,\n bottom\n } = _ref;\n\n if (acceleration === void 0) {\n acceleration = 10;\n }\n\n if (thresholdPercentage === void 0) {\n thresholdPercentage = defaultThreshold;\n }\n\n const {\n isTop,\n isBottom,\n isLeft,\n isRight\n } = getScrollPosition(scrollContainer);\n const direction = {\n x: 0,\n y: 0\n };\n const speed = {\n x: 0,\n y: 0\n };\n const threshold = {\n height: scrollContainerRect.height * thresholdPercentage.y,\n width: scrollContainerRect.width * thresholdPercentage.x\n };\n\n if (!isTop && top <= scrollContainerRect.top + threshold.height) {\n // Scroll Up\n direction.y = Direction.Backward;\n speed.y = acceleration * Math.abs((scrollContainerRect.top + threshold.height - top) / threshold.height);\n } else if (!isBottom && bottom >= scrollContainerRect.bottom - threshold.height) {\n // Scroll Down\n direction.y = Direction.Forward;\n speed.y = acceleration * Math.abs((scrollContainerRect.bottom - threshold.height - bottom) / threshold.height);\n }\n\n if (!isRight && right >= scrollContainerRect.right - threshold.width) {\n // Scroll Right\n direction.x = Direction.Forward;\n speed.x = acceleration * Math.abs((scrollContainerRect.right - threshold.width - right) / threshold.width);\n } else if (!isLeft && left <= scrollContainerRect.left + threshold.width) {\n // Scroll Left\n direction.x = Direction.Backward;\n speed.x = acceleration * Math.abs((scrollContainerRect.left + threshold.width - left) / threshold.width);\n }\n\n return {\n direction,\n speed\n };\n}\n\nfunction getScrollElementRect(element) {\n if (element === document.scrollingElement) {\n const {\n innerWidth,\n innerHeight\n } = window;\n return {\n top: 0,\n left: 0,\n right: innerWidth,\n bottom: innerHeight,\n width: innerWidth,\n height: innerHeight\n };\n }\n\n const {\n top,\n left,\n right,\n bottom\n } = element.getBoundingClientRect();\n return {\n top,\n left,\n right,\n bottom,\n width: element.clientWidth,\n height: element.clientHeight\n };\n}\n\nfunction getScrollOffsets(scrollableAncestors) {\n return scrollableAncestors.reduce((acc, node) => {\n return add(acc, getScrollCoordinates(node));\n }, defaultCoordinates);\n}\nfunction getScrollXOffset(scrollableAncestors) {\n return scrollableAncestors.reduce((acc, node) => {\n return acc + getScrollXCoordinate(node);\n }, 0);\n}\nfunction getScrollYOffset(scrollableAncestors) {\n return scrollableAncestors.reduce((acc, node) => {\n return acc + getScrollYCoordinate(node);\n }, 0);\n}\n\nfunction scrollIntoViewIfNeeded(element, measure) {\n if (measure === void 0) {\n measure = getClientRect;\n }\n\n if (!element) {\n return;\n }\n\n const {\n top,\n left,\n bottom,\n right\n } = measure(element);\n const firstScrollableAncestor = getFirstScrollableAncestor(element);\n\n if (!firstScrollableAncestor) {\n return;\n }\n\n if (bottom <= 0 || right <= 0 || top >= window.innerHeight || left >= window.innerWidth) {\n element.scrollIntoView({\n block: 'center',\n inline: 'center'\n });\n }\n}\n\nconst properties = [['x', ['left', 'right'], getScrollXOffset], ['y', ['top', 'bottom'], getScrollYOffset]];\nclass Rect {\n constructor(rect, element) {\n this.rect = void 0;\n this.width = void 0;\n this.height = void 0;\n this.top = void 0;\n this.bottom = void 0;\n this.right = void 0;\n this.left = void 0;\n const scrollableAncestors = getScrollableAncestors(element);\n const scrollOffsets = getScrollOffsets(scrollableAncestors);\n this.rect = { ...rect\n };\n this.width = rect.width;\n this.height = rect.height;\n\n for (const [axis, keys, getScrollOffset] of properties) {\n for (const key of keys) {\n Object.defineProperty(this, key, {\n get: () => {\n const currentOffsets = getScrollOffset(scrollableAncestors);\n const scrollOffsetsDeltla = scrollOffsets[axis] - currentOffsets;\n return this.rect[key] + scrollOffsetsDeltla;\n },\n enumerable: true\n });\n }\n }\n\n Object.defineProperty(this, 'rect', {\n enumerable: false\n });\n }\n\n}\n\nclass Listeners {\n constructor(target) {\n this.target = void 0;\n this.listeners = [];\n\n this.removeAll = () => {\n this.listeners.forEach(listener => {\n var _this$target;\n\n return (_this$target = this.target) == null ? void 0 : _this$target.removeEventListener(...listener);\n });\n };\n\n this.target = target;\n }\n\n add(eventName, handler, options) {\n var _this$target2;\n\n (_this$target2 = this.target) == null ? void 0 : _this$target2.addEventListener(eventName, handler, options);\n this.listeners.push([eventName, handler, options]);\n }\n\n}\n\nfunction getEventListenerTarget(target) {\n // If the `event.target` element is removed from the document events will still be targeted\n // at it, and hence won't always bubble up to the window or document anymore.\n // If there is any risk of an element being removed while it is being dragged,\n // the best practice is to attach the event listeners directly to the target.\n // https://developer.mozilla.org/en-US/docs/Web/API/EventTarget\n const {\n EventTarget\n } = getWindow(target);\n return target instanceof EventTarget ? target : getOwnerDocument(target);\n}\n\nfunction hasExceededDistance(delta, measurement) {\n const dx = Math.abs(delta.x);\n const dy = Math.abs(delta.y);\n\n if (typeof measurement === 'number') {\n return Math.sqrt(dx ** 2 + dy ** 2) > measurement;\n }\n\n if ('x' in measurement && 'y' in measurement) {\n return dx > measurement.x && dy > measurement.y;\n }\n\n if ('x' in measurement) {\n return dx > measurement.x;\n }\n\n if ('y' in measurement) {\n return dy > measurement.y;\n }\n\n return false;\n}\n\nvar EventName;\n\n(function (EventName) {\n EventName[\"Click\"] = \"click\";\n EventName[\"DragStart\"] = \"dragstart\";\n EventName[\"Keydown\"] = \"keydown\";\n EventName[\"ContextMenu\"] = \"contextmenu\";\n EventName[\"Resize\"] = \"resize\";\n EventName[\"SelectionChange\"] = \"selectionchange\";\n EventName[\"VisibilityChange\"] = \"visibilitychange\";\n})(EventName || (EventName = {}));\n\nfunction preventDefault(event) {\n event.preventDefault();\n}\nfunction stopPropagation(event) {\n event.stopPropagation();\n}\n\nvar KeyboardCode;\n\n(function (KeyboardCode) {\n KeyboardCode[\"Space\"] = \"Space\";\n KeyboardCode[\"Down\"] = \"ArrowDown\";\n KeyboardCode[\"Right\"] = \"ArrowRight\";\n KeyboardCode[\"Left\"] = \"ArrowLeft\";\n KeyboardCode[\"Up\"] = \"ArrowUp\";\n KeyboardCode[\"Esc\"] = \"Escape\";\n KeyboardCode[\"Enter\"] = \"Enter\";\n KeyboardCode[\"Tab\"] = \"Tab\";\n})(KeyboardCode || (KeyboardCode = {}));\n\nconst defaultKeyboardCodes = {\n start: [KeyboardCode.Space, KeyboardCode.Enter],\n cancel: [KeyboardCode.Esc],\n end: [KeyboardCode.Space, KeyboardCode.Enter, KeyboardCode.Tab]\n};\nconst defaultKeyboardCoordinateGetter = (event, _ref) => {\n let {\n currentCoordinates\n } = _ref;\n\n switch (event.code) {\n case KeyboardCode.Right:\n return { ...currentCoordinates,\n x: currentCoordinates.x + 25\n };\n\n case KeyboardCode.Left:\n return { ...currentCoordinates,\n x: currentCoordinates.x - 25\n };\n\n case KeyboardCode.Down:\n return { ...currentCoordinates,\n y: currentCoordinates.y + 25\n };\n\n case KeyboardCode.Up:\n return { ...currentCoordinates,\n y: currentCoordinates.y - 25\n };\n }\n\n return undefined;\n};\n\nclass KeyboardSensor {\n constructor(props) {\n this.props = void 0;\n this.autoScrollEnabled = false;\n this.referenceCoordinates = void 0;\n this.listeners = void 0;\n this.windowListeners = void 0;\n this.props = props;\n const {\n event: {\n target\n }\n } = props;\n this.props = props;\n this.listeners = new Listeners(getOwnerDocument(target));\n this.windowListeners = new Listeners(getWindow(target));\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n this.attach();\n }\n\n attach() {\n this.handleStart();\n this.windowListeners.add(EventName.Resize, this.handleCancel);\n this.windowListeners.add(EventName.VisibilityChange, this.handleCancel);\n setTimeout(() => this.listeners.add(EventName.Keydown, this.handleKeyDown));\n }\n\n handleStart() {\n const {\n activeNode,\n onStart\n } = this.props;\n const node = activeNode.node.current;\n\n if (node) {\n scrollIntoViewIfNeeded(node);\n }\n\n onStart(defaultCoordinates);\n }\n\n handleKeyDown(event) {\n if (isKeyboardEvent(event)) {\n const {\n active,\n context,\n options\n } = this.props;\n const {\n keyboardCodes = defaultKeyboardCodes,\n coordinateGetter = defaultKeyboardCoordinateGetter,\n scrollBehavior = 'smooth'\n } = options;\n const {\n code\n } = event;\n\n if (keyboardCodes.end.includes(code)) {\n this.handleEnd(event);\n return;\n }\n\n if (keyboardCodes.cancel.includes(code)) {\n this.handleCancel(event);\n return;\n }\n\n const {\n collisionRect\n } = context.current;\n const currentCoordinates = collisionRect ? {\n x: collisionRect.left,\n y: collisionRect.top\n } : defaultCoordinates;\n\n if (!this.referenceCoordinates) {\n this.referenceCoordinates = currentCoordinates;\n }\n\n const newCoordinates = coordinateGetter(event, {\n active,\n context: context.current,\n currentCoordinates\n });\n\n if (newCoordinates) {\n const coordinatesDelta = subtract(newCoordinates, currentCoordinates);\n const scrollDelta = {\n x: 0,\n y: 0\n };\n const {\n scrollableAncestors\n } = context.current;\n\n for (const scrollContainer of scrollableAncestors) {\n const direction = event.code;\n const {\n isTop,\n isRight,\n isLeft,\n isBottom,\n maxScroll,\n minScroll\n } = getScrollPosition(scrollContainer);\n const scrollElementRect = getScrollElementRect(scrollContainer);\n const clampedCoordinates = {\n x: Math.min(direction === KeyboardCode.Right ? scrollElementRect.right - scrollElementRect.width / 2 : scrollElementRect.right, Math.max(direction === KeyboardCode.Right ? scrollElementRect.left : scrollElementRect.left + scrollElementRect.width / 2, newCoordinates.x)),\n y: Math.min(direction === KeyboardCode.Down ? scrollElementRect.bottom - scrollElementRect.height / 2 : scrollElementRect.bottom, Math.max(direction === KeyboardCode.Down ? scrollElementRect.top : scrollElementRect.top + scrollElementRect.height / 2, newCoordinates.y))\n };\n const canScrollX = direction === KeyboardCode.Right && !isRight || direction === KeyboardCode.Left && !isLeft;\n const canScrollY = direction === KeyboardCode.Down && !isBottom || direction === KeyboardCode.Up && !isTop;\n\n if (canScrollX && clampedCoordinates.x !== newCoordinates.x) {\n const newScrollCoordinates = scrollContainer.scrollLeft + coordinatesDelta.x;\n const canScrollToNewCoordinates = direction === KeyboardCode.Right && newScrollCoordinates <= maxScroll.x || direction === KeyboardCode.Left && newScrollCoordinates >= minScroll.x;\n\n if (canScrollToNewCoordinates && !coordinatesDelta.y) {\n // We don't need to update coordinates, the scroll adjustment alone will trigger\n // logic to auto-detect the new container we are over\n scrollContainer.scrollTo({\n left: newScrollCoordinates,\n behavior: scrollBehavior\n });\n return;\n }\n\n if (canScrollToNewCoordinates) {\n scrollDelta.x = scrollContainer.scrollLeft - newScrollCoordinates;\n } else {\n scrollDelta.x = direction === KeyboardCode.Right ? scrollContainer.scrollLeft - maxScroll.x : scrollContainer.scrollLeft - minScroll.x;\n }\n\n if (scrollDelta.x) {\n scrollContainer.scrollBy({\n left: -scrollDelta.x,\n behavior: scrollBehavior\n });\n }\n\n break;\n } else if (canScrollY && clampedCoordinates.y !== newCoordinates.y) {\n const newScrollCoordinates = scrollContainer.scrollTop + coordinatesDelta.y;\n const canScrollToNewCoordinates = direction === KeyboardCode.Down && newScrollCoordinates <= maxScroll.y || direction === KeyboardCode.Up && newScrollCoordinates >= minScroll.y;\n\n if (canScrollToNewCoordinates && !coordinatesDelta.x) {\n // We don't need to update coordinates, the scroll adjustment alone will trigger\n // logic to auto-detect the new container we are over\n scrollContainer.scrollTo({\n top: newScrollCoordinates,\n behavior: scrollBehavior\n });\n return;\n }\n\n if (canScrollToNewCoordinates) {\n scrollDelta.y = scrollContainer.scrollTop - newScrollCoordinates;\n } else {\n scrollDelta.y = direction === KeyboardCode.Down ? scrollContainer.scrollTop - maxScroll.y : scrollContainer.scrollTop - minScroll.y;\n }\n\n if (scrollDelta.y) {\n scrollContainer.scrollBy({\n top: -scrollDelta.y,\n behavior: scrollBehavior\n });\n }\n\n break;\n }\n }\n\n this.handleMove(event, add(subtract(newCoordinates, this.referenceCoordinates), scrollDelta));\n }\n }\n }\n\n handleMove(event, coordinates) {\n const {\n onMove\n } = this.props;\n event.preventDefault();\n onMove(coordinates);\n }\n\n handleEnd(event) {\n const {\n onEnd\n } = this.props;\n event.preventDefault();\n this.detach();\n onEnd();\n }\n\n handleCancel(event) {\n const {\n onCancel\n } = this.props;\n event.preventDefault();\n this.detach();\n onCancel();\n }\n\n detach() {\n this.listeners.removeAll();\n this.windowListeners.removeAll();\n }\n\n}\nKeyboardSensor.activators = [{\n eventName: 'onKeyDown',\n handler: (event, _ref, _ref2) => {\n let {\n keyboardCodes = defaultKeyboardCodes,\n onActivation\n } = _ref;\n let {\n active\n } = _ref2;\n const {\n code\n } = event.nativeEvent;\n\n if (keyboardCodes.start.includes(code)) {\n const activator = active.activatorNode.current;\n\n if (activator && event.target !== activator) {\n return false;\n }\n\n event.preventDefault();\n onActivation == null ? void 0 : onActivation({\n event: event.nativeEvent\n });\n return true;\n }\n\n return false;\n }\n}];\n\nfunction isDistanceConstraint(constraint) {\n return Boolean(constraint && 'distance' in constraint);\n}\n\nfunction isDelayConstraint(constraint) {\n return Boolean(constraint && 'delay' in constraint);\n}\n\nclass AbstractPointerSensor {\n constructor(props, events, listenerTarget) {\n var _getEventCoordinates;\n\n if (listenerTarget === void 0) {\n listenerTarget = getEventListenerTarget(props.event.target);\n }\n\n this.props = void 0;\n this.events = void 0;\n this.autoScrollEnabled = true;\n this.document = void 0;\n this.activated = false;\n this.initialCoordinates = void 0;\n this.timeoutId = null;\n this.listeners = void 0;\n this.documentListeners = void 0;\n this.windowListeners = void 0;\n this.props = props;\n this.events = events;\n const {\n event\n } = props;\n const {\n target\n } = event;\n this.props = props;\n this.events = events;\n this.document = getOwnerDocument(target);\n this.documentListeners = new Listeners(this.document);\n this.listeners = new Listeners(listenerTarget);\n this.windowListeners = new Listeners(getWindow(target));\n this.initialCoordinates = (_getEventCoordinates = getEventCoordinates(event)) != null ? _getEventCoordinates : defaultCoordinates;\n this.handleStart = this.handleStart.bind(this);\n this.handleMove = this.handleMove.bind(this);\n this.handleEnd = this.handleEnd.bind(this);\n this.handleCancel = this.handleCancel.bind(this);\n this.handleKeydown = this.handleKeydown.bind(this);\n this.removeTextSelection = this.removeTextSelection.bind(this);\n this.attach();\n }\n\n attach() {\n const {\n events,\n props: {\n options: {\n activationConstraint,\n bypassActivationConstraint\n }\n }\n } = this;\n this.listeners.add(events.move.name, this.handleMove, {\n passive: false\n });\n this.listeners.add(events.end.name, this.handleEnd);\n\n if (events.cancel) {\n this.listeners.add(events.cancel.name, this.handleCancel);\n }\n\n this.windowListeners.add(EventName.Resize, this.handleCancel);\n this.windowListeners.add(EventName.DragStart, preventDefault);\n this.windowListeners.add(EventName.VisibilityChange, this.handleCancel);\n this.windowListeners.add(EventName.ContextMenu, preventDefault);\n this.documentListeners.add(EventName.Keydown, this.handleKeydown);\n\n if (activationConstraint) {\n if (bypassActivationConstraint != null && bypassActivationConstraint({\n event: this.props.event,\n activeNode: this.props.activeNode,\n options: this.props.options\n })) {\n return this.handleStart();\n }\n\n if (isDelayConstraint(activationConstraint)) {\n this.timeoutId = setTimeout(this.handleStart, activationConstraint.delay);\n this.handlePending(activationConstraint);\n return;\n }\n\n if (isDistanceConstraint(activationConstraint)) {\n this.handlePending(activationConstraint);\n return;\n }\n }\n\n this.handleStart();\n }\n\n detach() {\n this.listeners.removeAll();\n this.windowListeners.removeAll(); // Wait until the next event loop before removing document listeners\n // This is necessary because we listen for `click` and `selection` events on the document\n\n setTimeout(this.documentListeners.removeAll, 50);\n\n if (this.timeoutId !== null) {\n clearTimeout(this.timeoutId);\n this.timeoutId = null;\n }\n }\n\n handlePending(constraint, offset) {\n const {\n active,\n onPending\n } = this.props;\n onPending(active, constraint, this.initialCoordinates, offset);\n }\n\n handleStart() {\n const {\n initialCoordinates\n } = this;\n const {\n onStart\n } = this.props;\n\n if (initialCoordinates) {\n this.activated = true; // Stop propagation of click events once activation constraints are met\n\n this.documentListeners.add(EventName.Click, stopPropagation, {\n capture: true\n }); // Remove any text selection from the document\n\n this.removeTextSelection(); // Prevent further text selection while dragging\n\n this.documentListeners.add(EventName.SelectionChange, this.removeTextSelection);\n onStart(initialCoordinates);\n }\n }\n\n handleMove(event) {\n var _getEventCoordinates2;\n\n const {\n activated,\n initialCoordinates,\n props\n } = this;\n const {\n onMove,\n options: {\n activationConstraint\n }\n } = props;\n\n if (!initialCoordinates) {\n return;\n }\n\n const coordinates = (_getEventCoordinates2 = getEventCoordinates(event)) != null ? _getEventCoordinates2 : defaultCoordinates;\n const delta = subtract(initialCoordinates, coordinates); // Constraint validation\n\n if (!activated && activationConstraint) {\n if (isDistanceConstraint(activationConstraint)) {\n if (activationConstraint.tolerance != null && hasExceededDistance(delta, activationConstraint.tolerance)) {\n return this.handleCancel();\n }\n\n if (hasExceededDistance(delta, activationConstraint.distance)) {\n return this.handleStart();\n }\n }\n\n if (isDelayConstraint(activationConstraint)) {\n if (hasExceededDistance(delta, activationConstraint.tolerance)) {\n return this.handleCancel();\n }\n }\n\n this.handlePending(activationConstraint, delta);\n return;\n }\n\n if (event.cancelable) {\n event.preventDefault();\n }\n\n onMove(coordinates);\n }\n\n handleEnd() {\n const {\n onAbort,\n onEnd\n } = this.props;\n this.detach();\n\n if (!this.activated) {\n onAbort(this.props.active);\n }\n\n onEnd();\n }\n\n handleCancel() {\n const {\n onAbort,\n onCancel\n } = this.props;\n this.detach();\n\n if (!this.activated) {\n onAbort(this.props.active);\n }\n\n onCancel();\n }\n\n handleKeydown(event) {\n if (event.code === KeyboardCode.Esc) {\n this.handleCancel();\n }\n }\n\n removeTextSelection() {\n var _this$document$getSel;\n\n (_this$document$getSel = this.document.getSelection()) == null ? void 0 : _this$document$getSel.removeAllRanges();\n }\n\n}\n\nconst events = {\n cancel: {\n name: 'pointercancel'\n },\n move: {\n name: 'pointermove'\n },\n end: {\n name: 'pointerup'\n }\n};\nclass PointerSensor extends AbstractPointerSensor {\n constructor(props) {\n const {\n event\n } = props; // Pointer events stop firing if the target is unmounted while dragging\n // Therefore we attach listeners to the owner document instead\n\n const listenerTarget = getOwnerDocument(event.target);\n super(props, events, listenerTarget);\n }\n\n}\nPointerSensor.activators = [{\n eventName: 'onPointerDown',\n handler: (_ref, _ref2) => {\n let {\n nativeEvent: event\n } = _ref;\n let {\n onActivation\n } = _ref2;\n\n if (!event.isPrimary || event.button !== 0) {\n return false;\n }\n\n onActivation == null ? void 0 : onActivation({\n event\n });\n return true;\n }\n}];\n\nconst events$1 = {\n move: {\n name: 'mousemove'\n },\n end: {\n name: 'mouseup'\n }\n};\nvar MouseButton;\n\n(function (MouseButton) {\n MouseButton[MouseButton[\"RightClick\"] = 2] = \"RightClick\";\n})(MouseButton || (MouseButton = {}));\n\nclass MouseSensor extends AbstractPointerSensor {\n constructor(props) {\n super(props, events$1, getOwnerDocument(props.event.target));\n }\n\n}\nMouseSensor.activators = [{\n eventName: 'onMouseDown',\n handler: (_ref, _ref2) => {\n let {\n nativeEvent: event\n } = _ref;\n let {\n onActivation\n } = _ref2;\n\n if (event.button === MouseButton.RightClick) {\n return false;\n }\n\n onActivation == null ? void 0 : onActivation({\n event\n });\n return true;\n }\n}];\n\nconst events$2 = {\n cancel: {\n name: 'touchcancel'\n },\n move: {\n name: 'touchmove'\n },\n end: {\n name: 'touchend'\n }\n};\nclass TouchSensor extends AbstractPointerSensor {\n constructor(props) {\n super(props, events$2);\n }\n\n static setup() {\n // Adding a non-capture and non-passive `touchmove` listener in order\n // to force `event.preventDefault()` calls to work in dynamically added\n // touchmove event handlers. This is required for iOS Safari.\n window.addEventListener(events$2.move.name, noop, {\n capture: false,\n passive: false\n });\n return function teardown() {\n window.removeEventListener(events$2.move.name, noop);\n }; // We create a new handler because the teardown function of another sensor\n // could remove our event listener if we use a referentially equal listener.\n\n function noop() {}\n }\n\n}\nTouchSensor.activators = [{\n eventName: 'onTouchStart',\n handler: (_ref, _ref2) => {\n let {\n nativeEvent: event\n } = _ref;\n let {\n onActivation\n } = _ref2;\n const {\n touches\n } = event;\n\n if (touches.length > 1) {\n return false;\n }\n\n onActivation == null ? void 0 : onActivation({\n event\n });\n return true;\n }\n}];\n\nvar AutoScrollActivator;\n\n(function (AutoScrollActivator) {\n AutoScrollActivator[AutoScrollActivator[\"Pointer\"] = 0] = \"Pointer\";\n AutoScrollActivator[AutoScrollActivator[\"DraggableRect\"] = 1] = \"DraggableRect\";\n})(AutoScrollActivator || (AutoScrollActivator = {}));\n\nvar TraversalOrder;\n\n(function (TraversalOrder) {\n TraversalOrder[TraversalOrder[\"TreeOrder\"] = 0] = \"TreeOrder\";\n TraversalOrder[TraversalOrder[\"ReversedTreeOrder\"] = 1] = \"ReversedTreeOrder\";\n})(TraversalOrder || (TraversalOrder = {}));\n\nfunction useAutoScroller(_ref) {\n let {\n acceleration,\n activator = AutoScrollActivator.Pointer,\n canScroll,\n draggingRect,\n enabled,\n interval = 5,\n order = TraversalOrder.TreeOrder,\n pointerCoordinates,\n scrollableAncestors,\n scrollableAncestorRects,\n delta,\n threshold\n } = _ref;\n const scrollIntent = useScrollIntent({\n delta,\n disabled: !enabled\n });\n const [setAutoScrollInterval, clearAutoScrollInterval] = useInterval();\n const scrollSpeed = useRef({\n x: 0,\n y: 0\n });\n const scrollDirection = useRef({\n x: 0,\n y: 0\n });\n const rect = useMemo(() => {\n switch (activator) {\n case AutoScrollActivator.Pointer:\n return pointerCoordinates ? {\n top: pointerCoordinates.y,\n bottom: pointerCoordinates.y,\n left: pointerCoordinates.x,\n right: pointerCoordinates.x\n } : null;\n\n case AutoScrollActivator.DraggableRect:\n return draggingRect;\n }\n }, [activator, draggingRect, pointerCoordinates]);\n const scrollContainerRef = useRef(null);\n const autoScroll = useCallback(() => {\n const scrollContainer = scrollContainerRef.current;\n\n if (!scrollContainer) {\n return;\n }\n\n const scrollLeft = scrollSpeed.current.x * scrollDirection.current.x;\n const scrollTop = scrollSpeed.current.y * scrollDirection.current.y;\n scrollContainer.scrollBy(scrollLeft, scrollTop);\n }, []);\n const sortedScrollableAncestors = useMemo(() => order === TraversalOrder.TreeOrder ? [...scrollableAncestors].reverse() : scrollableAncestors, [order, scrollableAncestors]);\n useEffect(() => {\n if (!enabled || !scrollableAncestors.length || !rect) {\n clearAutoScrollInterval();\n return;\n }\n\n for (const scrollContainer of sortedScrollableAncestors) {\n if ((canScroll == null ? void 0 : canScroll(scrollContainer)) === false) {\n continue;\n }\n\n const index = scrollableAncestors.indexOf(scrollContainer);\n const scrollContainerRect = scrollableAncestorRects[index];\n\n if (!scrollContainerRect) {\n continue;\n }\n\n const {\n direction,\n speed\n } = getScrollDirectionAndSpeed(scrollContainer, scrollContainerRect, rect, acceleration, threshold);\n\n for (const axis of ['x', 'y']) {\n if (!scrollIntent[axis][direction[axis]]) {\n speed[axis] = 0;\n direction[axis] = 0;\n }\n }\n\n if (speed.x > 0 || speed.y > 0) {\n clearAutoScrollInterval();\n scrollContainerRef.current = scrollContainer;\n setAutoScrollInterval(autoScroll, interval);\n scrollSpeed.current = speed;\n scrollDirection.current = direction;\n return;\n }\n }\n\n scrollSpeed.current = {\n x: 0,\n y: 0\n };\n scrollDirection.current = {\n x: 0,\n y: 0\n };\n clearAutoScrollInterval();\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n [acceleration, autoScroll, canScroll, clearAutoScrollInterval, enabled, interval, // eslint-disable-next-line react-hooks/exhaustive-deps\n JSON.stringify(rect), // eslint-disable-next-line react-hooks/exhaustive-deps\n JSON.stringify(scrollIntent), setAutoScrollInterval, scrollableAncestors, sortedScrollableAncestors, scrollableAncestorRects, // eslint-disable-next-line react-hooks/exhaustive-deps\n JSON.stringify(threshold)]);\n}\nconst defaultScrollIntent = {\n x: {\n [Direction.Backward]: false,\n [Direction.Forward]: false\n },\n y: {\n [Direction.Backward]: false,\n [Direction.Forward]: false\n }\n};\n\nfunction useScrollIntent(_ref2) {\n let {\n delta,\n disabled\n } = _ref2;\n const previousDelta = usePrevious(delta);\n return useLazyMemo(previousIntent => {\n if (disabled || !previousDelta || !previousIntent) {\n // Reset scroll intent tracking when auto-scrolling is disabled\n return defaultScrollIntent;\n }\n\n const direction = {\n x: Math.sign(delta.x - previousDelta.x),\n y: Math.sign(delta.y - previousDelta.y)\n }; // Keep track of the user intent to scroll in each direction for both axis\n\n return {\n x: {\n [Direction.Backward]: previousIntent.x[Direction.Backward] || direction.x === -1,\n [Direction.Forward]: previousIntent.x[Direction.Forward] || direction.x === 1\n },\n y: {\n [Direction.Backward]: previousIntent.y[Direction.Backward] || direction.y === -1,\n [Direction.Forward]: previousIntent.y[Direction.Forward] || direction.y === 1\n }\n };\n }, [disabled, delta, previousDelta]);\n}\n\nfunction useCachedNode(draggableNodes, id) {\n const draggableNode = id != null ? draggableNodes.get(id) : undefined;\n const node = draggableNode ? draggableNode.node.current : null;\n return useLazyMemo(cachedNode => {\n var _ref;\n\n if (id == null) {\n return null;\n } // In some cases, the draggable node can unmount while dragging\n // This is the case for virtualized lists. In those situations,\n // we fall back to the last known value for that node.\n\n\n return (_ref = node != null ? node : cachedNode) != null ? _ref : null;\n }, [node, id]);\n}\n\nfunction useCombineActivators(sensors, getSyntheticHandler) {\n return useMemo(() => sensors.reduce((accumulator, sensor) => {\n const {\n sensor: Sensor\n } = sensor;\n const sensorActivators = Sensor.activators.map(activator => ({\n eventName: activator.eventName,\n handler: getSyntheticHandler(activator.handler, sensor)\n }));\n return [...accumulator, ...sensorActivators];\n }, []), [sensors, getSyntheticHandler]);\n}\n\nvar MeasuringStrategy;\n\n(function (MeasuringStrategy) {\n MeasuringStrategy[MeasuringStrategy[\"Always\"] = 0] = \"Always\";\n MeasuringStrategy[MeasuringStrategy[\"BeforeDragging\"] = 1] = \"BeforeDragging\";\n MeasuringStrategy[MeasuringStrategy[\"WhileDragging\"] = 2] = \"WhileDragging\";\n})(MeasuringStrategy || (MeasuringStrategy = {}));\n\nvar MeasuringFrequency;\n\n(function (MeasuringFrequency) {\n MeasuringFrequency[\"Optimized\"] = \"optimized\";\n})(MeasuringFrequency || (MeasuringFrequency = {}));\n\nconst defaultValue = /*#__PURE__*/new Map();\nfunction useDroppableMeasuring(containers, _ref) {\n let {\n dragging,\n dependencies,\n config\n } = _ref;\n const [queue, setQueue] = useState(null);\n const {\n frequency,\n measure,\n strategy\n } = config;\n const containersRef = useRef(containers);\n const disabled = isDisabled();\n const disabledRef = useLatestValue(disabled);\n const measureDroppableContainers = useCallback(function (ids) {\n if (ids === void 0) {\n ids = [];\n }\n\n if (disabledRef.current) {\n return;\n }\n\n setQueue(value => {\n if (value === null) {\n return ids;\n }\n\n return value.concat(ids.filter(id => !value.includes(id)));\n });\n }, [disabledRef]);\n const timeoutId = useRef(null);\n const droppableRects = useLazyMemo(previousValue => {\n if (disabled && !dragging) {\n return defaultValue;\n }\n\n if (!previousValue || previousValue === defaultValue || containersRef.current !== containers || queue != null) {\n const map = new Map();\n\n for (let container of containers) {\n if (!container) {\n continue;\n }\n\n if (queue && queue.length > 0 && !queue.includes(container.id) && container.rect.current) {\n // This container does not need to be re-measured\n map.set(container.id, container.rect.current);\n continue;\n }\n\n const node = container.node.current;\n const rect = node ? new Rect(measure(node), node) : null;\n container.rect.current = rect;\n\n if (rect) {\n map.set(container.id, rect);\n }\n }\n\n return map;\n }\n\n return previousValue;\n }, [containers, queue, dragging, disabled, measure]);\n useEffect(() => {\n containersRef.current = containers;\n }, [containers]);\n useEffect(() => {\n if (disabled) {\n return;\n }\n\n measureDroppableContainers();\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n [dragging, disabled]);\n useEffect(() => {\n if (queue && queue.length > 0) {\n setQueue(null);\n }\n }, //eslint-disable-next-line react-hooks/exhaustive-deps\n [JSON.stringify(queue)]);\n useEffect(() => {\n if (disabled || typeof frequency !== 'number' || timeoutId.current !== null) {\n return;\n }\n\n timeoutId.current = setTimeout(() => {\n measureDroppableContainers();\n timeoutId.current = null;\n }, frequency);\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n [frequency, disabled, measureDroppableContainers, ...dependencies]);\n return {\n droppableRects,\n measureDroppableContainers,\n measuringScheduled: queue != null\n };\n\n function isDisabled() {\n switch (strategy) {\n case MeasuringStrategy.Always:\n return false;\n\n case MeasuringStrategy.BeforeDragging:\n return dragging;\n\n default:\n return !dragging;\n }\n }\n}\n\nfunction useInitialValue(value, computeFn) {\n return useLazyMemo(previousValue => {\n if (!value) {\n return null;\n }\n\n if (previousValue) {\n return previousValue;\n }\n\n return typeof computeFn === 'function' ? computeFn(value) : value;\n }, [computeFn, value]);\n}\n\nfunction useInitialRect(node, measure) {\n return useInitialValue(node, measure);\n}\n\n/**\r\n * Returns a new MutationObserver instance.\r\n * If `MutationObserver` is undefined in the execution environment, returns `undefined`.\r\n */\n\nfunction useMutationObserver(_ref) {\n let {\n callback,\n disabled\n } = _ref;\n const handleMutations = useEvent(callback);\n const mutationObserver = useMemo(() => {\n if (disabled || typeof window === 'undefined' || typeof window.MutationObserver === 'undefined') {\n return undefined;\n }\n\n const {\n MutationObserver\n } = window;\n return new MutationObserver(handleMutations);\n }, [handleMutations, disabled]);\n useEffect(() => {\n return () => mutationObserver == null ? void 0 : mutationObserver.disconnect();\n }, [mutationObserver]);\n return mutationObserver;\n}\n\n/**\r\n * Returns a new ResizeObserver instance bound to the `onResize` callback.\r\n * If `ResizeObserver` is undefined in the execution environment, returns `undefined`.\r\n */\n\nfunction useResizeObserver(_ref) {\n let {\n callback,\n disabled\n } = _ref;\n const handleResize = useEvent(callback);\n const resizeObserver = useMemo(() => {\n if (disabled || typeof window === 'undefined' || typeof window.ResizeObserver === 'undefined') {\n return undefined;\n }\n\n const {\n ResizeObserver\n } = window;\n return new ResizeObserver(handleResize);\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n [disabled]);\n useEffect(() => {\n return () => resizeObserver == null ? void 0 : resizeObserver.disconnect();\n }, [resizeObserver]);\n return resizeObserver;\n}\n\nfunction defaultMeasure(element) {\n return new Rect(getClientRect(element), element);\n}\n\nfunction useRect(element, measure, fallbackRect) {\n if (measure === void 0) {\n measure = defaultMeasure;\n }\n\n const [rect, setRect] = useState(null);\n\n function measureRect() {\n setRect(currentRect => {\n if (!element) {\n return null;\n }\n\n if (element.isConnected === false) {\n var _ref;\n\n // Fall back to last rect we measured if the element is\n // no longer connected to the DOM.\n return (_ref = currentRect != null ? currentRect : fallbackRect) != null ? _ref : null;\n }\n\n const newRect = measure(element);\n\n if (JSON.stringify(currentRect) === JSON.stringify(newRect)) {\n return currentRect;\n }\n\n return newRect;\n });\n }\n\n const mutationObserver = useMutationObserver({\n callback(records) {\n if (!element) {\n return;\n }\n\n for (const record of records) {\n const {\n type,\n target\n } = record;\n\n if (type === 'childList' && target instanceof HTMLElement && target.contains(element)) {\n measureRect();\n break;\n }\n }\n }\n\n });\n const resizeObserver = useResizeObserver({\n callback: measureRect\n });\n useIsomorphicLayoutEffect(() => {\n measureRect();\n\n if (element) {\n resizeObserver == null ? void 0 : resizeObserver.observe(element);\n mutationObserver == null ? void 0 : mutationObserver.observe(document.body, {\n childList: true,\n subtree: true\n });\n } else {\n resizeObserver == null ? void 0 : resizeObserver.disconnect();\n mutationObserver == null ? void 0 : mutationObserver.disconnect();\n }\n }, [element]);\n return rect;\n}\n\nfunction useRectDelta(rect) {\n const initialRect = useInitialValue(rect);\n return getRectDelta(rect, initialRect);\n}\n\nconst defaultValue$1 = [];\nfunction useScrollableAncestors(node) {\n const previousNode = useRef(node);\n const ancestors = useLazyMemo(previousValue => {\n if (!node) {\n return defaultValue$1;\n }\n\n if (previousValue && previousValue !== defaultValue$1 && node && previousNode.current && node.parentNode === previousNode.current.parentNode) {\n return previousValue;\n }\n\n return getScrollableAncestors(node);\n }, [node]);\n useEffect(() => {\n previousNode.current = node;\n }, [node]);\n return ancestors;\n}\n\nfunction useScrollOffsets(elements) {\n const [scrollCoordinates, setScrollCoordinates] = useState(null);\n const prevElements = useRef(elements); // To-do: Throttle the handleScroll callback\n\n const handleScroll = useCallback(event => {\n const scrollingElement = getScrollableElement(event.target);\n\n if (!scrollingElement) {\n return;\n }\n\n setScrollCoordinates(scrollCoordinates => {\n if (!scrollCoordinates) {\n return null;\n }\n\n scrollCoordinates.set(scrollingElement, getScrollCoordinates(scrollingElement));\n return new Map(scrollCoordinates);\n });\n }, []);\n useEffect(() => {\n const previousElements = prevElements.current;\n\n if (elements !== previousElements) {\n cleanup(previousElements);\n const entries = elements.map(element => {\n const scrollableElement = getScrollableElement(element);\n\n if (scrollableElement) {\n scrollableElement.addEventListener('scroll', handleScroll, {\n passive: true\n });\n return [scrollableElement, getScrollCoordinates(scrollableElement)];\n }\n\n return null;\n }).filter(entry => entry != null);\n setScrollCoordinates(entries.length ? new Map(entries) : null);\n prevElements.current = elements;\n }\n\n return () => {\n cleanup(elements);\n cleanup(previousElements);\n };\n\n function cleanup(elements) {\n elements.forEach(element => {\n const scrollableElement = getScrollableElement(element);\n scrollableElement == null ? void 0 : scrollableElement.removeEventListener('scroll', handleScroll);\n });\n }\n }, [handleScroll, elements]);\n return useMemo(() => {\n if (elements.length) {\n return scrollCoordinates ? Array.from(scrollCoordinates.values()).reduce((acc, coordinates) => add(acc, coordinates), defaultCoordinates) : getScrollOffsets(elements);\n }\n\n return defaultCoordinates;\n }, [elements, scrollCoordinates]);\n}\n\nfunction useScrollOffsetsDelta(scrollOffsets, dependencies) {\n if (dependencies === void 0) {\n dependencies = [];\n }\n\n const initialScrollOffsets = useRef(null);\n useEffect(() => {\n initialScrollOffsets.current = null;\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n dependencies);\n useEffect(() => {\n const hasScrollOffsets = scrollOffsets !== defaultCoordinates;\n\n if (hasScrollOffsets && !initialScrollOffsets.current) {\n initialScrollOffsets.current = scrollOffsets;\n }\n\n if (!hasScrollOffsets && initialScrollOffsets.current) {\n initialScrollOffsets.current = null;\n }\n }, [scrollOffsets]);\n return initialScrollOffsets.current ? subtract(scrollOffsets, initialScrollOffsets.current) : defaultCoordinates;\n}\n\nfunction useSensorSetup(sensors) {\n useEffect(() => {\n if (!canUseDOM) {\n return;\n }\n\n const teardownFns = sensors.map(_ref => {\n let {\n sensor\n } = _ref;\n return sensor.setup == null ? void 0 : sensor.setup();\n });\n return () => {\n for (const teardown of teardownFns) {\n teardown == null ? void 0 : teardown();\n }\n };\n }, // TO-DO: Sensors length could theoretically change which would not be a valid dependency\n // eslint-disable-next-line react-hooks/exhaustive-deps\n sensors.map(_ref2 => {\n let {\n sensor\n } = _ref2;\n return sensor;\n }));\n}\n\nfunction useSyntheticListeners(listeners, id) {\n return useMemo(() => {\n return listeners.reduce((acc, _ref) => {\n let {\n eventName,\n handler\n } = _ref;\n\n acc[eventName] = event => {\n handler(event, id);\n };\n\n return acc;\n }, {});\n }, [listeners, id]);\n}\n\nfunction useWindowRect(element) {\n return useMemo(() => element ? getWindowClientRect(element) : null, [element]);\n}\n\nconst defaultValue$2 = [];\nfunction useRects(elements, measure) {\n if (measure === void 0) {\n measure = getClientRect;\n }\n\n const [firstElement] = elements;\n const windowRect = useWindowRect(firstElement ? getWindow(firstElement) : null);\n const [rects, setRects] = useState(defaultValue$2);\n\n function measureRects() {\n setRects(() => {\n if (!elements.length) {\n return defaultValue$2;\n }\n\n return elements.map(element => isDocumentScrollingElement(element) ? windowRect : new Rect(measure(element), element));\n });\n }\n\n const resizeObserver = useResizeObserver({\n callback: measureRects\n });\n useIsomorphicLayoutEffect(() => {\n resizeObserver == null ? void 0 : resizeObserver.disconnect();\n measureRects();\n elements.forEach(element => resizeObserver == null ? void 0 : resizeObserver.observe(element));\n }, [elements]);\n return rects;\n}\n\nfunction getMeasurableNode(node) {\n if (!node) {\n return null;\n }\n\n if (node.children.length > 1) {\n return node;\n }\n\n const firstChild = node.children[0];\n return isHTMLElement(firstChild) ? firstChild : node;\n}\n\nfunction useDragOverlayMeasuring(_ref) {\n let {\n measure\n } = _ref;\n const [rect, setRect] = useState(null);\n const handleResize = useCallback(entries => {\n for (const {\n target\n } of entries) {\n if (isHTMLElement(target)) {\n setRect(rect => {\n const newRect = measure(target);\n return rect ? { ...rect,\n width: newRect.width,\n height: newRect.height\n } : newRect;\n });\n break;\n }\n }\n }, [measure]);\n const resizeObserver = useResizeObserver({\n callback: handleResize\n });\n const handleNodeChange = useCallback(element => {\n const node = getMeasurableNode(element);\n resizeObserver == null ? void 0 : resizeObserver.disconnect();\n\n if (node) {\n resizeObserver == null ? void 0 : resizeObserver.observe(node);\n }\n\n setRect(node ? measure(node) : null);\n }, [measure, resizeObserver]);\n const [nodeRef, setRef] = useNodeRef(handleNodeChange);\n return useMemo(() => ({\n nodeRef,\n rect,\n setRef\n }), [rect, nodeRef, setRef]);\n}\n\nconst defaultSensors = [{\n sensor: PointerSensor,\n options: {}\n}, {\n sensor: KeyboardSensor,\n options: {}\n}];\nconst defaultData = {\n current: {}\n};\nconst defaultMeasuringConfiguration = {\n draggable: {\n measure: getTransformAgnosticClientRect\n },\n droppable: {\n measure: getTransformAgnosticClientRect,\n strategy: MeasuringStrategy.WhileDragging,\n frequency: MeasuringFrequency.Optimized\n },\n dragOverlay: {\n measure: getClientRect\n }\n};\n\nclass DroppableContainersMap extends Map {\n get(id) {\n var _super$get;\n\n return id != null ? (_super$get = super.get(id)) != null ? _super$get : undefined : undefined;\n }\n\n toArray() {\n return Array.from(this.values());\n }\n\n getEnabled() {\n return this.toArray().filter(_ref => {\n let {\n disabled\n } = _ref;\n return !disabled;\n });\n }\n\n getNodeFor(id) {\n var _this$get$node$curren, _this$get;\n\n return (_this$get$node$curren = (_this$get = this.get(id)) == null ? void 0 : _this$get.node.current) != null ? _this$get$node$curren : undefined;\n }\n\n}\n\nconst defaultPublicContext = {\n activatorEvent: null,\n active: null,\n activeNode: null,\n activeNodeRect: null,\n collisions: null,\n containerNodeRect: null,\n draggableNodes: /*#__PURE__*/new Map(),\n droppableRects: /*#__PURE__*/new Map(),\n droppableContainers: /*#__PURE__*/new DroppableContainersMap(),\n over: null,\n dragOverlay: {\n nodeRef: {\n current: null\n },\n rect: null,\n setRef: noop\n },\n scrollableAncestors: [],\n scrollableAncestorRects: [],\n measuringConfiguration: defaultMeasuringConfiguration,\n measureDroppableContainers: noop,\n windowRect: null,\n measuringScheduled: false\n};\nconst defaultInternalContext = {\n activatorEvent: null,\n activators: [],\n active: null,\n activeNodeRect: null,\n ariaDescribedById: {\n draggable: ''\n },\n dispatch: noop,\n draggableNodes: /*#__PURE__*/new Map(),\n over: null,\n measureDroppableContainers: noop\n};\nconst InternalContext = /*#__PURE__*/createContext(defaultInternalContext);\nconst PublicContext = /*#__PURE__*/createContext(defaultPublicContext);\n\nfunction getInitialState() {\n return {\n draggable: {\n active: null,\n initialCoordinates: {\n x: 0,\n y: 0\n },\n nodes: new Map(),\n translate: {\n x: 0,\n y: 0\n }\n },\n droppable: {\n containers: new DroppableContainersMap()\n }\n };\n}\nfunction reducer(state, action) {\n switch (action.type) {\n case Action.DragStart:\n return { ...state,\n draggable: { ...state.draggable,\n initialCoordinates: action.initialCoordinates,\n active: action.active\n }\n };\n\n case Action.DragMove:\n if (state.draggable.active == null) {\n return state;\n }\n\n return { ...state,\n draggable: { ...state.draggable,\n translate: {\n x: action.coordinates.x - state.draggable.initialCoordinates.x,\n y: action.coordinates.y - state.draggable.initialCoordinates.y\n }\n }\n };\n\n case Action.DragEnd:\n case Action.DragCancel:\n return { ...state,\n draggable: { ...state.draggable,\n active: null,\n initialCoordinates: {\n x: 0,\n y: 0\n },\n translate: {\n x: 0,\n y: 0\n }\n }\n };\n\n case Action.RegisterDroppable:\n {\n const {\n element\n } = action;\n const {\n id\n } = element;\n const containers = new DroppableContainersMap(state.droppable.containers);\n containers.set(id, element);\n return { ...state,\n droppable: { ...state.droppable,\n containers\n }\n };\n }\n\n case Action.SetDroppableDisabled:\n {\n const {\n id,\n key,\n disabled\n } = action;\n const element = state.droppable.containers.get(id);\n\n if (!element || key !== element.key) {\n return state;\n }\n\n const containers = new DroppableContainersMap(state.droppable.containers);\n containers.set(id, { ...element,\n disabled\n });\n return { ...state,\n droppable: { ...state.droppable,\n containers\n }\n };\n }\n\n case Action.UnregisterDroppable:\n {\n const {\n id,\n key\n } = action;\n const element = state.droppable.containers.get(id);\n\n if (!element || key !== element.key) {\n return state;\n }\n\n const containers = new DroppableContainersMap(state.droppable.containers);\n containers.delete(id);\n return { ...state,\n droppable: { ...state.droppable,\n containers\n }\n };\n }\n\n default:\n {\n return state;\n }\n }\n}\n\nfunction RestoreFocus(_ref) {\n let {\n disabled\n } = _ref;\n const {\n active,\n activatorEvent,\n draggableNodes\n } = useContext(InternalContext);\n const previousActivatorEvent = usePrevious(activatorEvent);\n const previousActiveId = usePrevious(active == null ? void 0 : active.id); // Restore keyboard focus on the activator node\n\n useEffect(() => {\n if (disabled) {\n return;\n }\n\n if (!activatorEvent && previousActivatorEvent && previousActiveId != null) {\n if (!isKeyboardEvent(previousActivatorEvent)) {\n return;\n }\n\n if (document.activeElement === previousActivatorEvent.target) {\n // No need to restore focus\n return;\n }\n\n const draggableNode = draggableNodes.get(previousActiveId);\n\n if (!draggableNode) {\n return;\n }\n\n const {\n activatorNode,\n node\n } = draggableNode;\n\n if (!activatorNode.current && !node.current) {\n return;\n }\n\n requestAnimationFrame(() => {\n for (const element of [activatorNode.current, node.current]) {\n if (!element) {\n continue;\n }\n\n const focusableNode = findFirstFocusableNode(element);\n\n if (focusableNode) {\n focusableNode.focus();\n break;\n }\n }\n });\n }\n }, [activatorEvent, disabled, draggableNodes, previousActiveId, previousActivatorEvent]);\n return null;\n}\n\nfunction applyModifiers(modifiers, _ref) {\n let {\n transform,\n ...args\n } = _ref;\n return modifiers != null && modifiers.length ? modifiers.reduce((accumulator, modifier) => {\n return modifier({\n transform: accumulator,\n ...args\n });\n }, transform) : transform;\n}\n\nfunction useMeasuringConfiguration(config) {\n return useMemo(() => ({\n draggable: { ...defaultMeasuringConfiguration.draggable,\n ...(config == null ? void 0 : config.draggable)\n },\n droppable: { ...defaultMeasuringConfiguration.droppable,\n ...(config == null ? void 0 : config.droppable)\n },\n dragOverlay: { ...defaultMeasuringConfiguration.dragOverlay,\n ...(config == null ? void 0 : config.dragOverlay)\n }\n }), // eslint-disable-next-line react-hooks/exhaustive-deps\n [config == null ? void 0 : config.draggable, config == null ? void 0 : config.droppable, config == null ? void 0 : config.dragOverlay]);\n}\n\nfunction useLayoutShiftScrollCompensation(_ref) {\n let {\n activeNode,\n measure,\n initialRect,\n config = true\n } = _ref;\n const initialized = useRef(false);\n const {\n x,\n y\n } = typeof config === 'boolean' ? {\n x: config,\n y: config\n } : config;\n useIsomorphicLayoutEffect(() => {\n const disabled = !x && !y;\n\n if (disabled || !activeNode) {\n initialized.current = false;\n return;\n }\n\n if (initialized.current || !initialRect) {\n // Return early if layout shift scroll compensation was already attempted\n // or if there is no initialRect to compare to.\n return;\n } // Get the most up to date node ref for the active draggable\n\n\n const node = activeNode == null ? void 0 : activeNode.node.current;\n\n if (!node || node.isConnected === false) {\n // Return early if there is no attached node ref or if the node is\n // disconnected from the document.\n return;\n }\n\n const rect = measure(node);\n const rectDelta = getRectDelta(rect, initialRect);\n\n if (!x) {\n rectDelta.x = 0;\n }\n\n if (!y) {\n rectDelta.y = 0;\n } // Only perform layout shift scroll compensation once\n\n\n initialized.current = true;\n\n if (Math.abs(rectDelta.x) > 0 || Math.abs(rectDelta.y) > 0) {\n const firstScrollableAncestor = getFirstScrollableAncestor(node);\n\n if (firstScrollableAncestor) {\n firstScrollableAncestor.scrollBy({\n top: rectDelta.y,\n left: rectDelta.x\n });\n }\n }\n }, [activeNode, x, y, initialRect, measure]);\n}\n\nconst ActiveDraggableContext = /*#__PURE__*/createContext({ ...defaultCoordinates,\n scaleX: 1,\n scaleY: 1\n});\nvar Status;\n\n(function (Status) {\n Status[Status[\"Uninitialized\"] = 0] = \"Uninitialized\";\n Status[Status[\"Initializing\"] = 1] = \"Initializing\";\n Status[Status[\"Initialized\"] = 2] = \"Initialized\";\n})(Status || (Status = {}));\n\nconst DndContext = /*#__PURE__*/memo(function DndContext(_ref) {\n var _sensorContext$curren, _dragOverlay$nodeRef$, _dragOverlay$rect, _over$rect;\n\n let {\n id,\n accessibility,\n autoScroll = true,\n children,\n sensors = defaultSensors,\n collisionDetection = rectIntersection,\n measuring,\n modifiers,\n ...props\n } = _ref;\n const store = useReducer(reducer, undefined, getInitialState);\n const [state, dispatch] = store;\n const [dispatchMonitorEvent, registerMonitorListener] = useDndMonitorProvider();\n const [status, setStatus] = useState(Status.Uninitialized);\n const isInitialized = status === Status.Initialized;\n const {\n draggable: {\n active: activeId,\n nodes: draggableNodes,\n translate\n },\n droppable: {\n containers: droppableContainers\n }\n } = state;\n const node = activeId != null ? draggableNodes.get(activeId) : null;\n const activeRects = useRef({\n initial: null,\n translated: null\n });\n const active = useMemo(() => {\n var _node$data;\n\n return activeId != null ? {\n id: activeId,\n // It's possible for the active node to unmount while dragging\n data: (_node$data = node == null ? void 0 : node.data) != null ? _node$data : defaultData,\n rect: activeRects\n } : null;\n }, [activeId, node]);\n const activeRef = useRef(null);\n const [activeSensor, setActiveSensor] = useState(null);\n const [activatorEvent, setActivatorEvent] = useState(null);\n const latestProps = useLatestValue(props, Object.values(props));\n const draggableDescribedById = useUniqueId(\"DndDescribedBy\", id);\n const enabledDroppableContainers = useMemo(() => droppableContainers.getEnabled(), [droppableContainers]);\n const measuringConfiguration = useMeasuringConfiguration(measuring);\n const {\n droppableRects,\n measureDroppableContainers,\n measuringScheduled\n } = useDroppableMeasuring(enabledDroppableContainers, {\n dragging: isInitialized,\n dependencies: [translate.x, translate.y],\n config: measuringConfiguration.droppable\n });\n const activeNode = useCachedNode(draggableNodes, activeId);\n const activationCoordinates = useMemo(() => activatorEvent ? getEventCoordinates(activatorEvent) : null, [activatorEvent]);\n const autoScrollOptions = getAutoScrollerOptions();\n const initialActiveNodeRect = useInitialRect(activeNode, measuringConfiguration.draggable.measure);\n useLayoutShiftScrollCompensation({\n activeNode: activeId != null ? draggableNodes.get(activeId) : null,\n config: autoScrollOptions.layoutShiftCompensation,\n initialRect: initialActiveNodeRect,\n measure: measuringConfiguration.draggable.measure\n });\n const activeNodeRect = useRect(activeNode, measuringConfiguration.draggable.measure, initialActiveNodeRect);\n const containerNodeRect = useRect(activeNode ? activeNode.parentElement : null);\n const sensorContext = useRef({\n activatorEvent: null,\n active: null,\n activeNode,\n collisionRect: null,\n collisions: null,\n droppableRects,\n draggableNodes,\n draggingNode: null,\n draggingNodeRect: null,\n droppableContainers,\n over: null,\n scrollableAncestors: [],\n scrollAdjustedTranslate: null\n });\n const overNode = droppableContainers.getNodeFor((_sensorContext$curren = sensorContext.current.over) == null ? void 0 : _sensorContext$curren.id);\n const dragOverlay = useDragOverlayMeasuring({\n measure: measuringConfiguration.dragOverlay.measure\n }); // Use the rect of the drag overlay if it is mounted\n\n const draggingNode = (_dragOverlay$nodeRef$ = dragOverlay.nodeRef.current) != null ? _dragOverlay$nodeRef$ : activeNode;\n const draggingNodeRect = isInitialized ? (_dragOverlay$rect = dragOverlay.rect) != null ? _dragOverlay$rect : activeNodeRect : null;\n const usesDragOverlay = Boolean(dragOverlay.nodeRef.current && dragOverlay.rect); // The delta between the previous and new position of the draggable node\n // is only relevant when there is no drag overlay\n\n const nodeRectDelta = useRectDelta(usesDragOverlay ? null : activeNodeRect); // Get the window rect of the dragging node\n\n const windowRect = useWindowRect(draggingNode ? getWindow(draggingNode) : null); // Get scrollable ancestors of the dragging node\n\n const scrollableAncestors = useScrollableAncestors(isInitialized ? overNode != null ? overNode : activeNode : null);\n const scrollableAncestorRects = useRects(scrollableAncestors); // Apply modifiers\n\n const modifiedTranslate = applyModifiers(modifiers, {\n transform: {\n x: translate.x - nodeRectDelta.x,\n y: translate.y - nodeRectDelta.y,\n scaleX: 1,\n scaleY: 1\n },\n activatorEvent,\n active,\n activeNodeRect,\n containerNodeRect,\n draggingNodeRect,\n over: sensorContext.current.over,\n overlayNodeRect: dragOverlay.rect,\n scrollableAncestors,\n scrollableAncestorRects,\n windowRect\n });\n const pointerCoordinates = activationCoordinates ? add(activationCoordinates, translate) : null;\n const scrollOffsets = useScrollOffsets(scrollableAncestors); // Represents the scroll delta since dragging was initiated\n\n const scrollAdjustment = useScrollOffsetsDelta(scrollOffsets); // Represents the scroll delta since the last time the active node rect was measured\n\n const activeNodeScrollDelta = useScrollOffsetsDelta(scrollOffsets, [activeNodeRect]);\n const scrollAdjustedTranslate = add(modifiedTranslate, scrollAdjustment);\n const collisionRect = draggingNodeRect ? getAdjustedRect(draggingNodeRect, modifiedTranslate) : null;\n const collisions = active && collisionRect ? collisionDetection({\n active,\n collisionRect,\n droppableRects,\n droppableContainers: enabledDroppableContainers,\n pointerCoordinates\n }) : null;\n const overId = getFirstCollision(collisions, 'id');\n const [over, setOver] = useState(null); // When there is no drag overlay used, we need to account for the\n // window scroll delta\n\n const appliedTranslate = usesDragOverlay ? modifiedTranslate : add(modifiedTranslate, activeNodeScrollDelta);\n const transform = adjustScale(appliedTranslate, (_over$rect = over == null ? void 0 : over.rect) != null ? _over$rect : null, activeNodeRect);\n const activeSensorRef = useRef(null);\n const instantiateSensor = useCallback((event, _ref2) => {\n let {\n sensor: Sensor,\n options\n } = _ref2;\n\n if (activeRef.current == null) {\n return;\n }\n\n const activeNode = draggableNodes.get(activeRef.current);\n\n if (!activeNode) {\n return;\n }\n\n const activatorEvent = event.nativeEvent;\n const sensorInstance = new Sensor({\n active: activeRef.current,\n activeNode,\n event: activatorEvent,\n options,\n // Sensors need to be instantiated with refs for arguments that change over time\n // otherwise they are frozen in time with the stale arguments\n context: sensorContext,\n\n onAbort(id) {\n const draggableNode = draggableNodes.get(id);\n\n if (!draggableNode) {\n return;\n }\n\n const {\n onDragAbort\n } = latestProps.current;\n const event = {\n id\n };\n onDragAbort == null ? void 0 : onDragAbort(event);\n dispatchMonitorEvent({\n type: 'onDragAbort',\n event\n });\n },\n\n onPending(id, constraint, initialCoordinates, offset) {\n const draggableNode = draggableNodes.get(id);\n\n if (!draggableNode) {\n return;\n }\n\n const {\n onDragPending\n } = latestProps.current;\n const event = {\n id,\n constraint,\n initialCoordinates,\n offset\n };\n onDragPending == null ? void 0 : onDragPending(event);\n dispatchMonitorEvent({\n type: 'onDragPending',\n event\n });\n },\n\n onStart(initialCoordinates) {\n const id = activeRef.current;\n\n if (id == null) {\n return;\n }\n\n const draggableNode = draggableNodes.get(id);\n\n if (!draggableNode) {\n return;\n }\n\n const {\n onDragStart\n } = latestProps.current;\n const event = {\n activatorEvent,\n active: {\n id,\n data: draggableNode.data,\n rect: activeRects\n }\n };\n unstable_batchedUpdates(() => {\n onDragStart == null ? void 0 : onDragStart(event);\n setStatus(Status.Initializing);\n dispatch({\n type: Action.DragStart,\n initialCoordinates,\n active: id\n });\n dispatchMonitorEvent({\n type: 'onDragStart',\n event\n });\n setActiveSensor(activeSensorRef.current);\n setActivatorEvent(activatorEvent);\n });\n },\n\n onMove(coordinates) {\n dispatch({\n type: Action.DragMove,\n coordinates\n });\n },\n\n onEnd: createHandler(Action.DragEnd),\n onCancel: createHandler(Action.DragCancel)\n });\n activeSensorRef.current = sensorInstance;\n\n function createHandler(type) {\n return async function handler() {\n const {\n active,\n collisions,\n over,\n scrollAdjustedTranslate\n } = sensorContext.current;\n let event = null;\n\n if (active && scrollAdjustedTranslate) {\n const {\n cancelDrop\n } = latestProps.current;\n event = {\n activatorEvent,\n active: active,\n collisions,\n delta: scrollAdjustedTranslate,\n over\n };\n\n if (type === Action.DragEnd && typeof cancelDrop === 'function') {\n const shouldCancel = await Promise.resolve(cancelDrop(event));\n\n if (shouldCancel) {\n type = Action.DragCancel;\n }\n }\n }\n\n activeRef.current = null;\n unstable_batchedUpdates(() => {\n dispatch({\n type\n });\n setStatus(Status.Uninitialized);\n setOver(null);\n setActiveSensor(null);\n setActivatorEvent(null);\n activeSensorRef.current = null;\n const eventName = type === Action.DragEnd ? 'onDragEnd' : 'onDragCancel';\n\n if (event) {\n const handler = latestProps.current[eventName];\n handler == null ? void 0 : handler(event);\n dispatchMonitorEvent({\n type: eventName,\n event\n });\n }\n });\n };\n }\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n [draggableNodes]);\n const bindActivatorToSensorInstantiator = useCallback((handler, sensor) => {\n return (event, active) => {\n const nativeEvent = event.nativeEvent;\n const activeDraggableNode = draggableNodes.get(active);\n\n if ( // Another sensor is already instantiating\n activeRef.current !== null || // No active draggable\n !activeDraggableNode || // Event has already been captured\n nativeEvent.dndKit || nativeEvent.defaultPrevented) {\n return;\n }\n\n const activationContext = {\n active: activeDraggableNode\n };\n const shouldActivate = handler(event, sensor.options, activationContext);\n\n if (shouldActivate === true) {\n nativeEvent.dndKit = {\n capturedBy: sensor.sensor\n };\n activeRef.current = active;\n instantiateSensor(event, sensor);\n }\n };\n }, [draggableNodes, instantiateSensor]);\n const activators = useCombineActivators(sensors, bindActivatorToSensorInstantiator);\n useSensorSetup(sensors);\n useIsomorphicLayoutEffect(() => {\n if (activeNodeRect && status === Status.Initializing) {\n setStatus(Status.Initialized);\n }\n }, [activeNodeRect, status]);\n useEffect(() => {\n const {\n onDragMove\n } = latestProps.current;\n const {\n active,\n activatorEvent,\n collisions,\n over\n } = sensorContext.current;\n\n if (!active || !activatorEvent) {\n return;\n }\n\n const event = {\n active,\n activatorEvent,\n collisions,\n delta: {\n x: scrollAdjustedTranslate.x,\n y: scrollAdjustedTranslate.y\n },\n over\n };\n unstable_batchedUpdates(() => {\n onDragMove == null ? void 0 : onDragMove(event);\n dispatchMonitorEvent({\n type: 'onDragMove',\n event\n });\n });\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n [scrollAdjustedTranslate.x, scrollAdjustedTranslate.y]);\n useEffect(() => {\n const {\n active,\n activatorEvent,\n collisions,\n droppableContainers,\n scrollAdjustedTranslate\n } = sensorContext.current;\n\n if (!active || activeRef.current == null || !activatorEvent || !scrollAdjustedTranslate) {\n return;\n }\n\n const {\n onDragOver\n } = latestProps.current;\n const overContainer = droppableContainers.get(overId);\n const over = overContainer && overContainer.rect.current ? {\n id: overContainer.id,\n rect: overContainer.rect.current,\n data: overContainer.data,\n disabled: overContainer.disabled\n } : null;\n const event = {\n active,\n activatorEvent,\n collisions,\n delta: {\n x: scrollAdjustedTranslate.x,\n y: scrollAdjustedTranslate.y\n },\n over\n };\n unstable_batchedUpdates(() => {\n setOver(over);\n onDragOver == null ? void 0 : onDragOver(event);\n dispatchMonitorEvent({\n type: 'onDragOver',\n event\n });\n });\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n [overId]);\n useIsomorphicLayoutEffect(() => {\n sensorContext.current = {\n activatorEvent,\n active,\n activeNode,\n collisionRect,\n collisions,\n droppableRects,\n draggableNodes,\n draggingNode,\n draggingNodeRect,\n droppableContainers,\n over,\n scrollableAncestors,\n scrollAdjustedTranslate\n };\n activeRects.current = {\n initial: draggingNodeRect,\n translated: collisionRect\n };\n }, [active, activeNode, collisions, collisionRect, draggableNodes, draggingNode, draggingNodeRect, droppableRects, droppableContainers, over, scrollableAncestors, scrollAdjustedTranslate]);\n useAutoScroller({ ...autoScrollOptions,\n delta: translate,\n draggingRect: collisionRect,\n pointerCoordinates,\n scrollableAncestors,\n scrollableAncestorRects\n });\n const publicContext = useMemo(() => {\n const context = {\n active,\n activeNode,\n activeNodeRect,\n activatorEvent,\n collisions,\n containerNodeRect,\n dragOverlay,\n draggableNodes,\n droppableContainers,\n droppableRects,\n over,\n measureDroppableContainers,\n scrollableAncestors,\n scrollableAncestorRects,\n measuringConfiguration,\n measuringScheduled,\n windowRect\n };\n return context;\n }, [active, activeNode, activeNodeRect, activatorEvent, collisions, containerNodeRect, dragOverlay, draggableNodes, droppableContainers, droppableRects, over, measureDroppableContainers, scrollableAncestors, scrollableAncestorRects, measuringConfiguration, measuringScheduled, windowRect]);\n const internalContext = useMemo(() => {\n const context = {\n activatorEvent,\n activators,\n active,\n activeNodeRect,\n ariaDescribedById: {\n draggable: draggableDescribedById\n },\n dispatch,\n draggableNodes,\n over,\n measureDroppableContainers\n };\n return context;\n }, [activatorEvent, activators, active, activeNodeRect, dispatch, draggableDescribedById, draggableNodes, over, measureDroppableContainers]);\n return React.createElement(DndMonitorContext.Provider, {\n value: registerMonitorListener\n }, React.createElement(InternalContext.Provider, {\n value: internalContext\n }, React.createElement(PublicContext.Provider, {\n value: publicContext\n }, React.createElement(ActiveDraggableContext.Provider, {\n value: transform\n }, children)), React.createElement(RestoreFocus, {\n disabled: (accessibility == null ? void 0 : accessibility.restoreFocus) === false\n })), React.createElement(Accessibility, { ...accessibility,\n hiddenTextDescribedById: draggableDescribedById\n }));\n\n function getAutoScrollerOptions() {\n const activeSensorDisablesAutoscroll = (activeSensor == null ? void 0 : activeSensor.autoScrollEnabled) === false;\n const autoScrollGloballyDisabled = typeof autoScroll === 'object' ? autoScroll.enabled === false : autoScroll === false;\n const enabled = isInitialized && !activeSensorDisablesAutoscroll && !autoScrollGloballyDisabled;\n\n if (typeof autoScroll === 'object') {\n return { ...autoScroll,\n enabled\n };\n }\n\n return {\n enabled\n };\n }\n});\n\nconst NullContext = /*#__PURE__*/createContext(null);\nconst defaultRole = 'button';\nconst ID_PREFIX = 'Draggable';\nfunction useDraggable(_ref) {\n let {\n id,\n data,\n disabled = false,\n attributes\n } = _ref;\n const key = useUniqueId(ID_PREFIX);\n const {\n activators,\n activatorEvent,\n active,\n activeNodeRect,\n ariaDescribedById,\n draggableNodes,\n over\n } = useContext(InternalContext);\n const {\n role = defaultRole,\n roleDescription = 'draggable',\n tabIndex = 0\n } = attributes != null ? attributes : {};\n const isDragging = (active == null ? void 0 : active.id) === id;\n const transform = useContext(isDragging ? ActiveDraggableContext : NullContext);\n const [node, setNodeRef] = useNodeRef();\n const [activatorNode, setActivatorNodeRef] = useNodeRef();\n const listeners = useSyntheticListeners(activators, id);\n const dataRef = useLatestValue(data);\n useIsomorphicLayoutEffect(() => {\n draggableNodes.set(id, {\n id,\n key,\n node,\n activatorNode,\n data: dataRef\n });\n return () => {\n const node = draggableNodes.get(id);\n\n if (node && node.key === key) {\n draggableNodes.delete(id);\n }\n };\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n [draggableNodes, id]);\n const memoizedAttributes = useMemo(() => ({\n role,\n tabIndex,\n 'aria-disabled': disabled,\n 'aria-pressed': isDragging && role === defaultRole ? true : undefined,\n 'aria-roledescription': roleDescription,\n 'aria-describedby': ariaDescribedById.draggable\n }), [disabled, role, tabIndex, isDragging, roleDescription, ariaDescribedById.draggable]);\n return {\n active,\n activatorEvent,\n activeNodeRect,\n attributes: memoizedAttributes,\n isDragging,\n listeners: disabled ? undefined : listeners,\n node,\n over,\n setNodeRef,\n setActivatorNodeRef,\n transform\n };\n}\n\nfunction useDndContext() {\n return useContext(PublicContext);\n}\n\nconst ID_PREFIX$1 = 'Droppable';\nconst defaultResizeObserverConfig = {\n timeout: 25\n};\nfunction useDroppable(_ref) {\n let {\n data,\n disabled = false,\n id,\n resizeObserverConfig\n } = _ref;\n const key = useUniqueId(ID_PREFIX$1);\n const {\n active,\n dispatch,\n over,\n measureDroppableContainers\n } = useContext(InternalContext);\n const previous = useRef({\n disabled\n });\n const resizeObserverConnected = useRef(false);\n const rect = useRef(null);\n const callbackId = useRef(null);\n const {\n disabled: resizeObserverDisabled,\n updateMeasurementsFor,\n timeout: resizeObserverTimeout\n } = { ...defaultResizeObserverConfig,\n ...resizeObserverConfig\n };\n const ids = useLatestValue(updateMeasurementsFor != null ? updateMeasurementsFor : id);\n const handleResize = useCallback(() => {\n if (!resizeObserverConnected.current) {\n // ResizeObserver invokes the `handleResize` callback as soon as `observe` is called,\n // assuming the element is rendered and displayed.\n resizeObserverConnected.current = true;\n return;\n }\n\n if (callbackId.current != null) {\n clearTimeout(callbackId.current);\n }\n\n callbackId.current = setTimeout(() => {\n measureDroppableContainers(Array.isArray(ids.current) ? ids.current : [ids.current]);\n callbackId.current = null;\n }, resizeObserverTimeout);\n }, //eslint-disable-next-line react-hooks/exhaustive-deps\n [resizeObserverTimeout]);\n const resizeObserver = useResizeObserver({\n callback: handleResize,\n disabled: resizeObserverDisabled || !active\n });\n const handleNodeChange = useCallback((newElement, previousElement) => {\n if (!resizeObserver) {\n return;\n }\n\n if (previousElement) {\n resizeObserver.unobserve(previousElement);\n resizeObserverConnected.current = false;\n }\n\n if (newElement) {\n resizeObserver.observe(newElement);\n }\n }, [resizeObserver]);\n const [nodeRef, setNodeRef] = useNodeRef(handleNodeChange);\n const dataRef = useLatestValue(data);\n useEffect(() => {\n if (!resizeObserver || !nodeRef.current) {\n return;\n }\n\n resizeObserver.disconnect();\n resizeObserverConnected.current = false;\n resizeObserver.observe(nodeRef.current);\n }, [nodeRef, resizeObserver]);\n useEffect(() => {\n dispatch({\n type: Action.RegisterDroppable,\n element: {\n id,\n key,\n disabled,\n node: nodeRef,\n rect,\n data: dataRef\n }\n });\n return () => dispatch({\n type: Action.UnregisterDroppable,\n key,\n id\n });\n }, // eslint-disable-next-line react-hooks/exhaustive-deps\n [id]);\n useEffect(() => {\n if (disabled !== previous.current.disabled) {\n dispatch({\n type: Action.SetDroppableDisabled,\n id,\n key,\n disabled\n });\n previous.current.disabled = disabled;\n }\n }, [id, key, disabled, dispatch]);\n return {\n active,\n rect,\n isOver: (over == null ? void 0 : over.id) === id,\n node: nodeRef,\n over,\n setNodeRef\n };\n}\n\nfunction AnimationManager(_ref) {\n let {\n animation,\n children\n } = _ref;\n const [clonedChildren, setClonedChildren] = useState(null);\n const [element, setElement] = useState(null);\n const previousChildren = usePrevious(children);\n\n if (!children && !clonedChildren && previousChildren) {\n setClonedChildren(previousChildren);\n }\n\n useIsomorphicLayoutEffect(() => {\n if (!element) {\n return;\n }\n\n const key = clonedChildren == null ? void 0 : clonedChildren.key;\n const id = clonedChildren == null ? void 0 : clonedChildren.props.id;\n\n if (key == null || id == null) {\n setClonedChildren(null);\n return;\n }\n\n Promise.resolve(animation(id, element)).then(() => {\n setClonedChildren(null);\n });\n }, [animation, clonedChildren, element]);\n return React.createElement(React.Fragment, null, children, clonedChildren ? cloneElement(clonedChildren, {\n ref: setElement\n }) : null);\n}\n\nconst defaultTransform = {\n x: 0,\n y: 0,\n scaleX: 1,\n scaleY: 1\n};\nfunction NullifiedContextProvider(_ref) {\n let {\n children\n } = _ref;\n return React.createElement(InternalContext.Provider, {\n value: defaultInternalContext\n }, React.createElement(ActiveDraggableContext.Provider, {\n value: defaultTransform\n }, children));\n}\n\nconst baseStyles = {\n position: 'fixed',\n touchAction: 'none'\n};\n\nconst defaultTransition = activatorEvent => {\n const isKeyboardActivator = isKeyboardEvent(activatorEvent);\n return isKeyboardActivator ? 'transform 250ms ease' : undefined;\n};\n\nconst PositionedOverlay = /*#__PURE__*/forwardRef((_ref, ref) => {\n let {\n as,\n activatorEvent,\n adjustScale,\n children,\n className,\n rect,\n style,\n transform,\n transition = defaultTransition\n } = _ref;\n\n if (!rect) {\n return null;\n }\n\n const scaleAdjustedTransform = adjustScale ? transform : { ...transform,\n scaleX: 1,\n scaleY: 1\n };\n const styles = { ...baseStyles,\n width: rect.width,\n height: rect.height,\n top: rect.top,\n left: rect.left,\n transform: CSS.Transform.toString(scaleAdjustedTransform),\n transformOrigin: adjustScale && activatorEvent ? getRelativeTransformOrigin(activatorEvent, rect) : undefined,\n transition: typeof transition === 'function' ? transition(activatorEvent) : transition,\n ...style\n };\n return React.createElement(as, {\n className,\n style: styles,\n ref\n }, children);\n});\n\nconst defaultDropAnimationSideEffects = options => _ref => {\n let {\n active,\n dragOverlay\n } = _ref;\n const originalStyles = {};\n const {\n styles,\n className\n } = options;\n\n if (styles != null && styles.active) {\n for (const [key, value] of Object.entries(styles.active)) {\n if (value === undefined) {\n continue;\n }\n\n originalStyles[key] = active.node.style.getPropertyValue(key);\n active.node.style.setProperty(key, value);\n }\n }\n\n if (styles != null && styles.dragOverlay) {\n for (const [key, value] of Object.entries(styles.dragOverlay)) {\n if (value === undefined) {\n continue;\n }\n\n dragOverlay.node.style.setProperty(key, value);\n }\n }\n\n if (className != null && className.active) {\n active.node.classList.add(className.active);\n }\n\n if (className != null && className.dragOverlay) {\n dragOverlay.node.classList.add(className.dragOverlay);\n }\n\n return function cleanup() {\n for (const [key, value] of Object.entries(originalStyles)) {\n active.node.style.setProperty(key, value);\n }\n\n if (className != null && className.active) {\n active.node.classList.remove(className.active);\n }\n };\n};\n\nconst defaultKeyframeResolver = _ref2 => {\n let {\n transform: {\n initial,\n final\n }\n } = _ref2;\n return [{\n transform: CSS.Transform.toString(initial)\n }, {\n transform: CSS.Transform.toString(final)\n }];\n};\n\nconst defaultDropAnimationConfiguration = {\n duration: 250,\n easing: 'ease',\n keyframes: defaultKeyframeResolver,\n sideEffects: /*#__PURE__*/defaultDropAnimationSideEffects({\n styles: {\n active: {\n opacity: '0'\n }\n }\n })\n};\nfunction useDropAnimation(_ref3) {\n let {\n config,\n draggableNodes,\n droppableContainers,\n measuringConfiguration\n } = _ref3;\n return useEvent((id, node) => {\n if (config === null) {\n return;\n }\n\n const activeDraggable = draggableNodes.get(id);\n\n if (!activeDraggable) {\n return;\n }\n\n const activeNode = activeDraggable.node.current;\n\n if (!activeNode) {\n return;\n }\n\n const measurableNode = getMeasurableNode(node);\n\n if (!measurableNode) {\n return;\n }\n\n const {\n transform\n } = getWindow(node).getComputedStyle(node);\n const parsedTransform = parseTransform(transform);\n\n if (!parsedTransform) {\n return;\n }\n\n const animation = typeof config === 'function' ? config : createDefaultDropAnimation(config);\n scrollIntoViewIfNeeded(activeNode, measuringConfiguration.draggable.measure);\n return animation({\n active: {\n id,\n data: activeDraggable.data,\n node: activeNode,\n rect: measuringConfiguration.draggable.measure(activeNode)\n },\n draggableNodes,\n dragOverlay: {\n node,\n rect: measuringConfiguration.dragOverlay.measure(measurableNode)\n },\n droppableContainers,\n measuringConfiguration,\n transform: parsedTransform\n });\n });\n}\n\nfunction createDefaultDropAnimation(options) {\n const {\n duration,\n easing,\n sideEffects,\n keyframes\n } = { ...defaultDropAnimationConfiguration,\n ...options\n };\n return _ref4 => {\n let {\n active,\n dragOverlay,\n transform,\n ...rest\n } = _ref4;\n\n if (!duration) {\n // Do not animate if animation duration is zero.\n return;\n }\n\n const delta = {\n x: dragOverlay.rect.left - active.rect.left,\n y: dragOverlay.rect.top - active.rect.top\n };\n const scale = {\n scaleX: transform.scaleX !== 1 ? active.rect.width * transform.scaleX / dragOverlay.rect.width : 1,\n scaleY: transform.scaleY !== 1 ? active.rect.height * transform.scaleY / dragOverlay.rect.height : 1\n };\n const finalTransform = {\n x: transform.x - delta.x,\n y: transform.y - delta.y,\n ...scale\n };\n const animationKeyframes = keyframes({ ...rest,\n active,\n dragOverlay,\n transform: {\n initial: transform,\n final: finalTransform\n }\n });\n const [firstKeyframe] = animationKeyframes;\n const lastKeyframe = animationKeyframes[animationKeyframes.length - 1];\n\n if (JSON.stringify(firstKeyframe) === JSON.stringify(lastKeyframe)) {\n // The start and end keyframes are the same, infer that there is no animation needed.\n return;\n }\n\n const cleanup = sideEffects == null ? void 0 : sideEffects({\n active,\n dragOverlay,\n ...rest\n });\n const animation = dragOverlay.node.animate(animationKeyframes, {\n duration,\n easing,\n fill: 'forwards'\n });\n return new Promise(resolve => {\n animation.onfinish = () => {\n cleanup == null ? void 0 : cleanup();\n resolve();\n };\n });\n };\n}\n\nlet key = 0;\nfunction useKey(id) {\n return useMemo(() => {\n if (id == null) {\n return;\n }\n\n key++;\n return key;\n }, [id]);\n}\n\nconst DragOverlay = /*#__PURE__*/React.memo(_ref => {\n let {\n adjustScale = false,\n children,\n dropAnimation: dropAnimationConfig,\n style,\n transition,\n modifiers,\n wrapperElement = 'div',\n className,\n zIndex = 999\n } = _ref;\n const {\n activatorEvent,\n active,\n activeNodeRect,\n containerNodeRect,\n draggableNodes,\n droppableContainers,\n dragOverlay,\n over,\n measuringConfiguration,\n scrollableAncestors,\n scrollableAncestorRects,\n windowRect\n } = useDndContext();\n const transform = useContext(ActiveDraggableContext);\n const key = useKey(active == null ? void 0 : active.id);\n const modifiedTransform = applyModifiers(modifiers, {\n activatorEvent,\n active,\n activeNodeRect,\n containerNodeRect,\n draggingNodeRect: dragOverlay.rect,\n over,\n overlayNodeRect: dragOverlay.rect,\n scrollableAncestors,\n scrollableAncestorRects,\n transform,\n windowRect\n });\n const initialRect = useInitialValue(activeNodeRect);\n const dropAnimation = useDropAnimation({\n config: dropAnimationConfig,\n draggableNodes,\n droppableContainers,\n measuringConfiguration\n }); // We need to wait for the active node to be measured before connecting the drag overlay ref\n // otherwise collisions can be computed against a mispositioned drag overlay\n\n const ref = initialRect ? dragOverlay.setRef : undefined;\n return React.createElement(NullifiedContextProvider, null, React.createElement(AnimationManager, {\n animation: dropAnimation\n }, active && key ? React.createElement(PositionedOverlay, {\n key: key,\n id: active.id,\n ref: ref,\n as: wrapperElement,\n activatorEvent: activatorEvent,\n adjustScale: adjustScale,\n className: className,\n transition: transition,\n rect: initialRect,\n style: {\n zIndex,\n ...style\n },\n transform: modifiedTransform\n }, children) : null));\n});\n\nexport { AutoScrollActivator, DndContext, DragOverlay, KeyboardCode, KeyboardSensor, MeasuringFrequency, MeasuringStrategy, MouseSensor, PointerSensor, TouchSensor, TraversalOrder, applyModifiers, closestCenter, closestCorners, defaultAnnouncements, defaultCoordinates, defaultDropAnimationConfiguration as defaultDropAnimation, defaultDropAnimationSideEffects, defaultKeyboardCoordinateGetter, defaultScreenReaderInstructions, getClientRect, getFirstCollision, getScrollableAncestors, pointerWithin, rectIntersection, useDndContext, useDndMonitor, useDraggable, useDroppable, useSensor, useSensors };\n//# sourceMappingURL=core.esm.js.map\n","import React, { useMemo, useRef, useEffect, useState, useContext } from 'react';\nimport { useDndContext, getClientRect, useDroppable, useDraggable, closestCorners, getFirstCollision, getScrollableAncestors, KeyboardCode } from '@dnd-kit/core';\nimport { useUniqueId, useIsomorphicLayoutEffect, CSS, useCombinedRefs, isKeyboardEvent, subtract } from '@dnd-kit/utilities';\n\n/**\r\n * Move an array item to a different position. Returns a new array with the item moved to the new position.\r\n */\nfunction arrayMove(array, from, to) {\n const newArray = array.slice();\n newArray.splice(to < 0 ? newArray.length + to : to, 0, newArray.splice(from, 1)[0]);\n return newArray;\n}\n\n/**\r\n * Swap an array item to a different position. Returns a new array with the item swapped to the new position.\r\n */\nfunction arraySwap(array, from, to) {\n const newArray = array.slice();\n newArray[from] = array[to];\n newArray[to] = array[from];\n return newArray;\n}\n\nfunction getSortedRects(items, rects) {\n return items.reduce((accumulator, id, index) => {\n const rect = rects.get(id);\n\n if (rect) {\n accumulator[index] = rect;\n }\n\n return accumulator;\n }, Array(items.length));\n}\n\nfunction isValidIndex(index) {\n return index !== null && index >= 0;\n}\n\nfunction itemsEqual(a, b) {\n if (a === b) {\n return true;\n }\n\n if (a.length !== b.length) {\n return false;\n }\n\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n\n return true;\n}\n\nfunction normalizeDisabled(disabled) {\n if (typeof disabled === 'boolean') {\n return {\n draggable: disabled,\n droppable: disabled\n };\n }\n\n return disabled;\n}\n\n// To-do: We should be calculating scale transformation\nconst defaultScale = {\n scaleX: 1,\n scaleY: 1\n};\nconst horizontalListSortingStrategy = _ref => {\n var _rects$activeIndex;\n\n let {\n rects,\n activeNodeRect: fallbackActiveRect,\n activeIndex,\n overIndex,\n index\n } = _ref;\n const activeNodeRect = (_rects$activeIndex = rects[activeIndex]) != null ? _rects$activeIndex : fallbackActiveRect;\n\n if (!activeNodeRect) {\n return null;\n }\n\n const itemGap = getItemGap(rects, index, activeIndex);\n\n if (index === activeIndex) {\n const newIndexRect = rects[overIndex];\n\n if (!newIndexRect) {\n return null;\n }\n\n return {\n x: activeIndex < overIndex ? newIndexRect.left + newIndexRect.width - (activeNodeRect.left + activeNodeRect.width) : newIndexRect.left - activeNodeRect.left,\n y: 0,\n ...defaultScale\n };\n }\n\n if (index > activeIndex && index <= overIndex) {\n return {\n x: -activeNodeRect.width - itemGap,\n y: 0,\n ...defaultScale\n };\n }\n\n if (index < activeIndex && index >= overIndex) {\n return {\n x: activeNodeRect.width + itemGap,\n y: 0,\n ...defaultScale\n };\n }\n\n return {\n x: 0,\n y: 0,\n ...defaultScale\n };\n};\n\nfunction getItemGap(rects, index, activeIndex) {\n const currentRect = rects[index];\n const previousRect = rects[index - 1];\n const nextRect = rects[index + 1];\n\n if (!currentRect || !previousRect && !nextRect) {\n return 0;\n }\n\n if (activeIndex < index) {\n return previousRect ? currentRect.left - (previousRect.left + previousRect.width) : nextRect.left - (currentRect.left + currentRect.width);\n }\n\n return nextRect ? nextRect.left - (currentRect.left + currentRect.width) : currentRect.left - (previousRect.left + previousRect.width);\n}\n\nconst rectSortingStrategy = _ref => {\n let {\n rects,\n activeIndex,\n overIndex,\n index\n } = _ref;\n const newRects = arrayMove(rects, overIndex, activeIndex);\n const oldRect = rects[index];\n const newRect = newRects[index];\n\n if (!newRect || !oldRect) {\n return null;\n }\n\n return {\n x: newRect.left - oldRect.left,\n y: newRect.top - oldRect.top,\n scaleX: newRect.width / oldRect.width,\n scaleY: newRect.height / oldRect.height\n };\n};\n\nconst rectSwappingStrategy = _ref => {\n let {\n activeIndex,\n index,\n rects,\n overIndex\n } = _ref;\n let oldRect;\n let newRect;\n\n if (index === activeIndex) {\n oldRect = rects[index];\n newRect = rects[overIndex];\n }\n\n if (index === overIndex) {\n oldRect = rects[index];\n newRect = rects[activeIndex];\n }\n\n if (!newRect || !oldRect) {\n return null;\n }\n\n return {\n x: newRect.left - oldRect.left,\n y: newRect.top - oldRect.top,\n scaleX: newRect.width / oldRect.width,\n scaleY: newRect.height / oldRect.height\n };\n};\n\n// To-do: We should be calculating scale transformation\nconst defaultScale$1 = {\n scaleX: 1,\n scaleY: 1\n};\nconst verticalListSortingStrategy = _ref => {\n var _rects$activeIndex;\n\n let {\n activeIndex,\n activeNodeRect: fallbackActiveRect,\n index,\n rects,\n overIndex\n } = _ref;\n const activeNodeRect = (_rects$activeIndex = rects[activeIndex]) != null ? _rects$activeIndex : fallbackActiveRect;\n\n if (!activeNodeRect) {\n return null;\n }\n\n if (index === activeIndex) {\n const overIndexRect = rects[overIndex];\n\n if (!overIndexRect) {\n return null;\n }\n\n return {\n x: 0,\n y: activeIndex < overIndex ? overIndexRect.top + overIndexRect.height - (activeNodeRect.top + activeNodeRect.height) : overIndexRect.top - activeNodeRect.top,\n ...defaultScale$1\n };\n }\n\n const itemGap = getItemGap$1(rects, index, activeIndex);\n\n if (index > activeIndex && index <= overIndex) {\n return {\n x: 0,\n y: -activeNodeRect.height - itemGap,\n ...defaultScale$1\n };\n }\n\n if (index < activeIndex && index >= overIndex) {\n return {\n x: 0,\n y: activeNodeRect.height + itemGap,\n ...defaultScale$1\n };\n }\n\n return {\n x: 0,\n y: 0,\n ...defaultScale$1\n };\n};\n\nfunction getItemGap$1(clientRects, index, activeIndex) {\n const currentRect = clientRects[index];\n const previousRect = clientRects[index - 1];\n const nextRect = clientRects[index + 1];\n\n if (!currentRect) {\n return 0;\n }\n\n if (activeIndex < index) {\n return previousRect ? currentRect.top - (previousRect.top + previousRect.height) : nextRect ? nextRect.top - (currentRect.top + currentRect.height) : 0;\n }\n\n return nextRect ? nextRect.top - (currentRect.top + currentRect.height) : previousRect ? currentRect.top - (previousRect.top + previousRect.height) : 0;\n}\n\nconst ID_PREFIX = 'Sortable';\nconst Context = /*#__PURE__*/React.createContext({\n activeIndex: -1,\n containerId: ID_PREFIX,\n disableTransforms: false,\n items: [],\n overIndex: -1,\n useDragOverlay: false,\n sortedRects: [],\n strategy: rectSortingStrategy,\n disabled: {\n draggable: false,\n droppable: false\n }\n});\nfunction SortableContext(_ref) {\n let {\n children,\n id,\n items: userDefinedItems,\n strategy = rectSortingStrategy,\n disabled: disabledProp = false\n } = _ref;\n const {\n active,\n dragOverlay,\n droppableRects,\n over,\n measureDroppableContainers\n } = useDndContext();\n const containerId = useUniqueId(ID_PREFIX, id);\n const useDragOverlay = Boolean(dragOverlay.rect !== null);\n const items = useMemo(() => userDefinedItems.map(item => typeof item === 'object' && 'id' in item ? item.id : item), [userDefinedItems]);\n const isDragging = active != null;\n const activeIndex = active ? items.indexOf(active.id) : -1;\n const overIndex = over ? items.indexOf(over.id) : -1;\n const previousItemsRef = useRef(items);\n const itemsHaveChanged = !itemsEqual(items, previousItemsRef.current);\n const disableTransforms = overIndex !== -1 && activeIndex === -1 || itemsHaveChanged;\n const disabled = normalizeDisabled(disabledProp);\n useIsomorphicLayoutEffect(() => {\n if (itemsHaveChanged && isDragging) {\n measureDroppableContainers(items);\n }\n }, [itemsHaveChanged, items, isDragging, measureDroppableContainers]);\n useEffect(() => {\n previousItemsRef.current = items;\n }, [items]);\n const contextValue = useMemo(() => ({\n activeIndex,\n containerId,\n disabled,\n disableTransforms,\n items,\n overIndex,\n useDragOverlay,\n sortedRects: getSortedRects(items, droppableRects),\n strategy\n }), // eslint-disable-next-line react-hooks/exhaustive-deps\n [activeIndex, containerId, disabled.draggable, disabled.droppable, disableTransforms, items, overIndex, droppableRects, useDragOverlay, strategy]);\n return React.createElement(Context.Provider, {\n value: contextValue\n }, children);\n}\n\nconst defaultNewIndexGetter = _ref => {\n let {\n id,\n items,\n activeIndex,\n overIndex\n } = _ref;\n return arrayMove(items, activeIndex, overIndex).indexOf(id);\n};\nconst defaultAnimateLayoutChanges = _ref2 => {\n let {\n containerId,\n isSorting,\n wasDragging,\n index,\n items,\n newIndex,\n previousItems,\n previousContainerId,\n transition\n } = _ref2;\n\n if (!transition || !wasDragging) {\n return false;\n }\n\n if (previousItems !== items && index === newIndex) {\n return false;\n }\n\n if (isSorting) {\n return true;\n }\n\n return newIndex !== index && containerId === previousContainerId;\n};\nconst defaultTransition = {\n duration: 200,\n easing: 'ease'\n};\nconst transitionProperty = 'transform';\nconst disabledTransition = /*#__PURE__*/CSS.Transition.toString({\n property: transitionProperty,\n duration: 0,\n easing: 'linear'\n});\nconst defaultAttributes = {\n roleDescription: 'sortable'\n};\n\n/*\r\n * When the index of an item changes while sorting,\r\n * we need to temporarily disable the transforms\r\n */\n\nfunction useDerivedTransform(_ref) {\n let {\n disabled,\n index,\n node,\n rect\n } = _ref;\n const [derivedTransform, setDerivedtransform] = useState(null);\n const previousIndex = useRef(index);\n useIsomorphicLayoutEffect(() => {\n if (!disabled && index !== previousIndex.current && node.current) {\n const initial = rect.current;\n\n if (initial) {\n const current = getClientRect(node.current, {\n ignoreTransform: true\n });\n const delta = {\n x: initial.left - current.left,\n y: initial.top - current.top,\n scaleX: initial.width / current.width,\n scaleY: initial.height / current.height\n };\n\n if (delta.x || delta.y) {\n setDerivedtransform(delta);\n }\n }\n }\n\n if (index !== previousIndex.current) {\n previousIndex.current = index;\n }\n }, [disabled, index, node, rect]);\n useEffect(() => {\n if (derivedTransform) {\n setDerivedtransform(null);\n }\n }, [derivedTransform]);\n return derivedTransform;\n}\n\nfunction useSortable(_ref) {\n let {\n animateLayoutChanges = defaultAnimateLayoutChanges,\n attributes: userDefinedAttributes,\n disabled: localDisabled,\n data: customData,\n getNewIndex = defaultNewIndexGetter,\n id,\n strategy: localStrategy,\n resizeObserverConfig,\n transition = defaultTransition\n } = _ref;\n const {\n items,\n containerId,\n activeIndex,\n disabled: globalDisabled,\n disableTransforms,\n sortedRects,\n overIndex,\n useDragOverlay,\n strategy: globalStrategy\n } = useContext(Context);\n const disabled = normalizeLocalDisabled(localDisabled, globalDisabled);\n const index = items.indexOf(id);\n const data = useMemo(() => ({\n sortable: {\n containerId,\n index,\n items\n },\n ...customData\n }), [containerId, customData, index, items]);\n const itemsAfterCurrentSortable = useMemo(() => items.slice(items.indexOf(id)), [items, id]);\n const {\n rect,\n node,\n isOver,\n setNodeRef: setDroppableNodeRef\n } = useDroppable({\n id,\n data,\n disabled: disabled.droppable,\n resizeObserverConfig: {\n updateMeasurementsFor: itemsAfterCurrentSortable,\n ...resizeObserverConfig\n }\n });\n const {\n active,\n activatorEvent,\n activeNodeRect,\n attributes,\n setNodeRef: setDraggableNodeRef,\n listeners,\n isDragging,\n over,\n setActivatorNodeRef,\n transform\n } = useDraggable({\n id,\n data,\n attributes: { ...defaultAttributes,\n ...userDefinedAttributes\n },\n disabled: disabled.draggable\n });\n const setNodeRef = useCombinedRefs(setDroppableNodeRef, setDraggableNodeRef);\n const isSorting = Boolean(active);\n const displaceItem = isSorting && !disableTransforms && isValidIndex(activeIndex) && isValidIndex(overIndex);\n const shouldDisplaceDragSource = !useDragOverlay && isDragging;\n const dragSourceDisplacement = shouldDisplaceDragSource && displaceItem ? transform : null;\n const strategy = localStrategy != null ? localStrategy : globalStrategy;\n const finalTransform = displaceItem ? dragSourceDisplacement != null ? dragSourceDisplacement : strategy({\n rects: sortedRects,\n activeNodeRect,\n activeIndex,\n overIndex,\n index\n }) : null;\n const newIndex = isValidIndex(activeIndex) && isValidIndex(overIndex) ? getNewIndex({\n id,\n items,\n activeIndex,\n overIndex\n }) : index;\n const activeId = active == null ? void 0 : active.id;\n const previous = useRef({\n activeId,\n items,\n newIndex,\n containerId\n });\n const itemsHaveChanged = items !== previous.current.items;\n const shouldAnimateLayoutChanges = animateLayoutChanges({\n active,\n containerId,\n isDragging,\n isSorting,\n id,\n index,\n items,\n newIndex: previous.current.newIndex,\n previousItems: previous.current.items,\n previousContainerId: previous.current.containerId,\n transition,\n wasDragging: previous.current.activeId != null\n });\n const derivedTransform = useDerivedTransform({\n disabled: !shouldAnimateLayoutChanges,\n index,\n node,\n rect\n });\n useEffect(() => {\n if (isSorting && previous.current.newIndex !== newIndex) {\n previous.current.newIndex = newIndex;\n }\n\n if (containerId !== previous.current.containerId) {\n previous.current.containerId = containerId;\n }\n\n if (items !== previous.current.items) {\n previous.current.items = items;\n }\n }, [isSorting, newIndex, containerId, items]);\n useEffect(() => {\n if (activeId === previous.current.activeId) {\n return;\n }\n\n if (activeId != null && previous.current.activeId == null) {\n previous.current.activeId = activeId;\n return;\n }\n\n const timeoutId = setTimeout(() => {\n previous.current.activeId = activeId;\n }, 50);\n return () => clearTimeout(timeoutId);\n }, [activeId]);\n return {\n active,\n activeIndex,\n attributes,\n data,\n rect,\n index,\n newIndex,\n items,\n isOver,\n isSorting,\n isDragging,\n listeners,\n node,\n overIndex,\n over,\n setNodeRef,\n setActivatorNodeRef,\n setDroppableNodeRef,\n setDraggableNodeRef,\n transform: derivedTransform != null ? derivedTransform : finalTransform,\n transition: getTransition()\n };\n\n function getTransition() {\n if ( // Temporarily disable transitions for a single frame to set up derived transforms\n derivedTransform || // Or to prevent items jumping to back to their \"new\" position when items change\n itemsHaveChanged && previous.current.newIndex === index) {\n return disabledTransition;\n }\n\n if (shouldDisplaceDragSource && !isKeyboardEvent(activatorEvent) || !transition) {\n return undefined;\n }\n\n if (isSorting || shouldAnimateLayoutChanges) {\n return CSS.Transition.toString({ ...transition,\n property: transitionProperty\n });\n }\n\n return undefined;\n }\n}\n\nfunction normalizeLocalDisabled(localDisabled, globalDisabled) {\n var _localDisabled$dragga, _localDisabled$droppa;\n\n if (typeof localDisabled === 'boolean') {\n return {\n draggable: localDisabled,\n // Backwards compatibility\n droppable: false\n };\n }\n\n return {\n draggable: (_localDisabled$dragga = localDisabled == null ? void 0 : localDisabled.draggable) != null ? _localDisabled$dragga : globalDisabled.draggable,\n droppable: (_localDisabled$droppa = localDisabled == null ? void 0 : localDisabled.droppable) != null ? _localDisabled$droppa : globalDisabled.droppable\n };\n}\n\nfunction hasSortableData(entry) {\n if (!entry) {\n return false;\n }\n\n const data = entry.data.current;\n\n if (data && 'sortable' in data && typeof data.sortable === 'object' && 'containerId' in data.sortable && 'items' in data.sortable && 'index' in data.sortable) {\n return true;\n }\n\n return false;\n}\n\nconst directions = [KeyboardCode.Down, KeyboardCode.Right, KeyboardCode.Up, KeyboardCode.Left];\nconst sortableKeyboardCoordinates = (event, _ref) => {\n let {\n context: {\n active,\n collisionRect,\n droppableRects,\n droppableContainers,\n over,\n scrollableAncestors\n }\n } = _ref;\n\n if (directions.includes(event.code)) {\n event.preventDefault();\n\n if (!active || !collisionRect) {\n return;\n }\n\n const filteredContainers = [];\n droppableContainers.getEnabled().forEach(entry => {\n if (!entry || entry != null && entry.disabled) {\n return;\n }\n\n const rect = droppableRects.get(entry.id);\n\n if (!rect) {\n return;\n }\n\n switch (event.code) {\n case KeyboardCode.Down:\n if (collisionRect.top < rect.top) {\n filteredContainers.push(entry);\n }\n\n break;\n\n case KeyboardCode.Up:\n if (collisionRect.top > rect.top) {\n filteredContainers.push(entry);\n }\n\n break;\n\n case KeyboardCode.Left:\n if (collisionRect.left > rect.left) {\n filteredContainers.push(entry);\n }\n\n break;\n\n case KeyboardCode.Right:\n if (collisionRect.left < rect.left) {\n filteredContainers.push(entry);\n }\n\n break;\n }\n });\n const collisions = closestCorners({\n active,\n collisionRect: collisionRect,\n droppableRects,\n droppableContainers: filteredContainers,\n pointerCoordinates: null\n });\n let closestId = getFirstCollision(collisions, 'id');\n\n if (closestId === (over == null ? void 0 : over.id) && collisions.length > 1) {\n closestId = collisions[1].id;\n }\n\n if (closestId != null) {\n const activeDroppable = droppableContainers.get(active.id);\n const newDroppable = droppableContainers.get(closestId);\n const newRect = newDroppable ? droppableRects.get(newDroppable.id) : null;\n const newNode = newDroppable == null ? void 0 : newDroppable.node.current;\n\n if (newNode && newRect && activeDroppable && newDroppable) {\n const newScrollAncestors = getScrollableAncestors(newNode);\n const hasDifferentScrollAncestors = newScrollAncestors.some((element, index) => scrollableAncestors[index] !== element);\n const hasSameContainer = isSameContainer(activeDroppable, newDroppable);\n const isAfterActive = isAfter(activeDroppable, newDroppable);\n const offset = hasDifferentScrollAncestors || !hasSameContainer ? {\n x: 0,\n y: 0\n } : {\n x: isAfterActive ? collisionRect.width - newRect.width : 0,\n y: isAfterActive ? collisionRect.height - newRect.height : 0\n };\n const rectCoordinates = {\n x: newRect.left,\n y: newRect.top\n };\n const newCoordinates = offset.x && offset.y ? rectCoordinates : subtract(rectCoordinates, offset);\n return newCoordinates;\n }\n }\n }\n\n return undefined;\n};\n\nfunction isSameContainer(a, b) {\n if (!hasSortableData(a) || !hasSortableData(b)) {\n return false;\n }\n\n return a.data.current.sortable.containerId === b.data.current.sortable.containerId;\n}\n\nfunction isAfter(a, b) {\n if (!hasSortableData(a) || !hasSortableData(b)) {\n return false;\n }\n\n if (!isSameContainer(a, b)) {\n return false;\n }\n\n return a.data.current.sortable.index < b.data.current.sortable.index;\n}\n\nexport { SortableContext, arrayMove, arraySwap, defaultAnimateLayoutChanges, defaultNewIndexGetter, hasSortableData, horizontalListSortingStrategy, rectSortingStrategy, rectSwappingStrategy, sortableKeyboardCoordinates, useSortable, verticalListSortingStrategy };\n//# sourceMappingURL=sortable.esm.js.map\n","/**\n * SortableThumbnailItem 컴포넌트\n *\n * 드래그 앤 드롭이 가능한 파일 썸네일 아이템입니다.\n *\n * @module composite/FileUploader/SortableThumbnailItem\n */\n\nimport React, { useState, useEffect } from 'react';\nimport { useSortable } from '@dnd-kit/sortable';\nimport { CSS } from '@dnd-kit/utilities';\n\nimport { Div } from '../../basic/Div';\nimport { Button } from '../../basic/Button';\nimport { Span } from '../../basic/Span';\nimport { P } from '../../basic/P';\nimport { I } from '../../basic/I';\nimport { Img } from '../../basic/Img';\n\nimport type { Attachment, PendingFile } from './types';\nimport { getFileIcon, t } from './utils';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst G7Core = (window as any).G7Core;\n\nexport interface SortableThumbnailItemProps {\n file: PendingFile | (Attachment & { status?: string });\n onRemove: () => void;\n onRetry?: () => void;\n /** 이미지 클릭 시 갤러리 열기 */\n onImageClick?: () => void;\n /** 비이미지 파일 클릭/다운로드 시 호출 */\n onDownload?: () => void;\n /** 대표 이미지 여부 */\n isPrimary?: boolean;\n /** 대표 이미지 설정 클릭 핸들러 */\n onPrimaryClick?: () => void;\n}\n\nexport const SortableThumbnailItem: React.FC = ({\n file,\n onRemove,\n onRetry,\n onImageClick,\n onDownload,\n isPrimary,\n onPrimaryClick,\n}) => {\n const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({\n id: 'hash' in file ? file.hash : file.id,\n });\n\n const style = {\n transform: CSS.Transform.toString(transform),\n transition,\n opacity: isDragging ? 0.5 : 1,\n };\n\n const isPending = 'status' in file && file.status !== undefined;\n const status = isPending ? (file as PendingFile).status : 'done';\n const isUploading = status === 'uploading';\n const isCompressing = status === 'compressing';\n const hasError = status === 'error';\n const progress = isPending ? (file as PendingFile).progress : 100;\n const preview = isPending ? (file as PendingFile).preview : undefined;\n // 기존 첨부파일: is_image 필드 우선 사용, 대기 파일: mime_type 확인\n const isImage = !isPending\n ? (file as Attachment).is_image\n : (file.mime_type?.startsWith('image/') ?? false);\n\n // 인증된 이미지 로딩을 위한 상태\n const [authenticatedImageUrl, setAuthenticatedImageUrl] = useState(undefined);\n const downloadUrl = !isPending && isImage ? (file as Attachment).download_url : undefined;\n\n // 기존 첨부파일의 경우 인증된 요청으로 이미지 로드\n useEffect(() => {\n if (!downloadUrl) {\n setAuthenticatedImageUrl(undefined);\n return;\n }\n\n let isMounted = true;\n let objectUrl: string | undefined;\n\n const loadAuthenticatedImage = async () => {\n try {\n const blob = await G7Core.api.get(downloadUrl, {\n responseType: 'blob',\n });\n if (isMounted && blob) {\n objectUrl = URL.createObjectURL(blob);\n setAuthenticatedImageUrl(objectUrl);\n }\n } catch (error) {\n console.error('Failed to load authenticated image:', error);\n }\n };\n\n loadAuthenticatedImage();\n\n return () => {\n isMounted = false;\n if (objectUrl) {\n URL.revokeObjectURL(objectUrl);\n }\n };\n }, [downloadUrl]);\n\n // 기존 첨부파일의 경우 인증된 URL 사용\n const existingImageUrl = authenticatedImageUrl;\n\n return (\n \n {/* 썸네일 영역 */}\n {\n // 업로드 중/압축 중이면 클릭 무시\n if (isUploading || isCompressing) return;\n\n if (isImage && onImageClick) {\n // 이미지는 갤러리 열기\n onImageClick();\n } else if (!isPending && onDownload) {\n // 비이미지 기존 파일은 다운로드\n onDownload();\n }\n }}\n >\n {/* 이미지 미리보기 */}\n {(preview || existingImageUrl) ? (\n \n ) : (\n /* 파일 아이콘 */\n \n )}\n\n {/* 업로드/압축 진행률 오버레이 */}\n {(isUploading || isCompressing) && (\n
\n
\n \n
\n {progress}%\n
\n )}\n\n {/* 에러 오버레이 */}\n {hasError && (\n
\n \n
\n )}\n\n {/* 대표 이미지 뱃지 */}\n {onPrimaryClick && (\n {\n e.stopPropagation();\n onPrimaryClick();\n }}\n className={`absolute top-1.5 left-1.5 z-10 p-1 rounded-full transition-colors ${\n isPrimary\n ? 'bg-yellow-500 text-white'\n : 'bg-gray-800/50 text-gray-300 hover:bg-yellow-500 hover:text-white opacity-0 group-hover:opacity-100'\n }`}\n title={isPrimary ? t('attachment.primary_image') : t('attachment.set_as_primary')}\n >\n \n \n )}\n\n {/* 호버 시 액션 버튼들 */}\n
\n {/* 드래그 핸들 */}\n e.stopPropagation()}\n >\n \n \n\n {/* 다운로드 버튼 (기존 첨부파일만) */}\n {!isPending && onDownload && (\n {\n e.stopPropagation();\n onDownload();\n }}\n className=\"p-1.5 bg-white/90 dark:bg-gray-800/90 rounded text-blue-500 hover:bg-white\"\n title={t('common.download')}\n >\n \n \n )}\n\n {/* 재시도 버튼 */}\n {hasError && onRetry && (\n {\n e.stopPropagation();\n onRetry();\n }}\n className=\"p-1.5 bg-white/90 dark:bg-gray-800/90 rounded text-orange-500 hover:bg-white\"\n title={t('common.retry')}\n >\n \n \n )}\n\n {/* 삭제 버튼 */}\n {\n e.stopPropagation();\n onRemove();\n }}\n disabled={isUploading || isCompressing}\n className=\"p-1.5 bg-white/90 dark:bg-gray-800/90 rounded text-red-500 hover:bg-white disabled:opacity-50\"\n title={t('common.delete')}\n >\n \n \n
\n