diff --git a/lang-packs/_bundled/g7-module-sirsoft-page-ja/CHANGELOG.md b/lang-packs/_bundled/g7-module-sirsoft-page-ja/CHANGELOG.md index fd9e9712..68a94869 100644 --- a/lang-packs/_bundled/g7-module-sirsoft-page-ja/CHANGELOG.md +++ b/lang-packs/_bundled/g7-module-sirsoft-page-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.1] - 2026-07-06 + +### Added + +- 페이지 버전 이력의 변경 필드명 라벨 일본어 번역 추가 (`versions.field_labels.*`) — 버전 이력의 "변경내역" 항목이 일본어 로케일에서 필드 키 대신 자연스러운 라벨로 표시됩니다. + ## [1.0.0] - 2026-07-01 ### Added diff --git a/lang-packs/_bundled/g7-module-sirsoft-page-ja/backend/ja/validation.php b/lang-packs/_bundled/g7-module-sirsoft-page-ja/backend/ja/validation.php index 3e6bb2d0..a83cc4ed 100644 --- a/lang-packs/_bundled/g7-module-sirsoft-page-ja/backend/ja/validation.php +++ b/lang-packs/_bundled/g7-module-sirsoft-page-ja/backend/ja/validation.php @@ -62,4 +62,7 @@ return [ 'array' => '順序情報の形式が正しくありません。', ], ], + 'attributes' => [ + 'search' => '検索ワード', + ], ]; diff --git a/lang-packs/_bundled/g7-module-sirsoft-page-ja/frontend/partial/admin.json b/lang-packs/_bundled/g7-module-sirsoft-page-ja/frontend/partial/admin.json index 28467117..5feca74c 100644 --- a/lang-packs/_bundled/g7-module-sirsoft-page-ja/frontend/partial/admin.json +++ b/lang-packs/_bundled/g7-module-sirsoft-page-ja/frontend/partial/admin.json @@ -160,7 +160,13 @@ "changed_fields": "変更: {{fields}}", "restored_from": "v{{version}}から復元", "restore_guide": "表示ボタンをクリックすると、内容を確認して復元できます。添付ファイルはバージョン管理に含まれていません。", - "preview_modal_editor_label": "バージョンプレビュー" + "preview_modal_editor_label": "バージョンプレビュー", + "field_labels": { + "title": "タイトル", + "content": "内容", + "seo_meta": "SEO情報", + "content_mode": "編集モード" + } } } } diff --git a/lang-packs/_bundled/g7-module-sirsoft-page-ja/language-pack.json b/lang-packs/_bundled/g7-module-sirsoft-page-ja/language-pack.json index 61aba8ec..0120a528 100644 --- a/lang-packs/_bundled/g7-module-sirsoft-page-ja/language-pack.json +++ b/lang-packs/_bundled/g7-module-sirsoft-page-ja/language-pack.json @@ -12,7 +12,7 @@ "en": "G7 module (sirsoft-page) Japanese language pack (bundled)", "ja": "G7 モジュール (sirsoft-page) 日本語 言語パック(バンドル)" }, - "version": "1.0.0", + "version": "1.0.1", "license": "MIT", "scope": "module", "target_identifier": "sirsoft-page", 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 0f9d9b78..58157976 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.1] - 2026-07-06 + +### Changed + +- 첨부 개수 초과 안내 문구(`attachment.upload_limit_exceeded`)를 이미지 전용 표현에서 일반 파일에도 맞는 범용 표현으로 갱신했습니다 — 한국어/영어 원문 변경에 맞춰 일본어 번역을 동기화했습니다. + ## [1.0.0] - 2026-07-01 ### Added diff --git a/lang-packs/_bundled/g7-template-sirsoft-admin_basic-ja/frontend/partial/attachment.json b/lang-packs/_bundled/g7-template-sirsoft-admin_basic-ja/frontend/partial/attachment.json index 3e147e71..6a893879 100644 --- a/lang-packs/_bundled/g7-template-sirsoft-admin_basic-ja/frontend/partial/attachment.json +++ b/lang-packs/_bundled/g7-template-sirsoft-admin_basic-ja/frontend/partial/attachment.json @@ -7,11 +7,11 @@ "deleting": "削除中...", "drop_or_click": "ファイルをドラッグするか、クリックしてアップロード", "upload_limit": "最大{{maxFiles}}個、1個あたり{{maxSize}}MB", + "upload_limit_exceeded": "最大{{max}}個まで添付できます。", "attached_count": "{{count}}/{{max}}個添付済み", "max_size": "最大{{size}}MB", "drag_to_reorder": "ドラッグして順序を変更", "reorder_failed": "順序変更に失敗しました。", "primary_image": "メイン画像", - "set_as_primary": "メイン画像に設定", - "upload_limit_exceeded": "画像は最大{{max}}枚までアップロードできます。" + "set_as_primary": "メイン画像に設定" } 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 bad42048..fd8cc968 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.0", + "version": "1.0.1", "license": "MIT", "scope": "template", "target_identifier": "sirsoft-admin_basic", diff --git a/lang-packs/_bundled/g7-template-sirsoft-basic-ja/CHANGELOG.md b/lang-packs/_bundled/g7-template-sirsoft-basic-ja/CHANGELOG.md index 7a17b2de..35c00761 100644 --- a/lang-packs/_bundled/g7-template-sirsoft-basic-ja/CHANGELOG.md +++ b/lang-packs/_bundled/g7-template-sirsoft-basic-ja/CHANGELOG.md @@ -4,6 +4,13 @@ 형식은 [Keep a Changelog](https://keepachangelog.com/ko/1.1.0/)를 따르며, [Semantic Versioning](https://semver.org/lang/ko/)을 준수합니다. +## [1.0.1] - 2026-07-06 + +### Added + +- 미발행 페이지 관리자 미리보기 안내 배너(`user.page.preview_banner`) 일본어 번역 추가 — 관리자가 발행 전 페이지를 사용자 화면에서 미리 볼 때의 안내 문구가 일본어 로케일에서 자연스럽게 표시됩니다. +- 첨부 개수 초과 안내 문구(`attachment.upload_limit_exceeded`) 일본어 번역 추가 — 게시글 첨부를 허용 개수보다 많이 선택했을 때의 안내가 일본어 로케일에서 자연스럽게 표시됩니다. + ## [1.0.0] - 2026-07-01 ### Added diff --git a/lang-packs/_bundled/g7-template-sirsoft-basic-ja/frontend/partial/attachment.json b/lang-packs/_bundled/g7-template-sirsoft-basic-ja/frontend/partial/attachment.json index 9a548a11..55e8985b 100644 --- a/lang-packs/_bundled/g7-template-sirsoft-basic-ja/frontend/partial/attachment.json +++ b/lang-packs/_bundled/g7-template-sirsoft-basic-ja/frontend/partial/attachment.json @@ -9,5 +9,6 @@ "reorder_failed": "ファイルの順序変更に失敗しました", "drag_to_reorder": "ドラッグして順序を変更", "primary_image": "代表画像", - "set_as_primary": "代表画像に設定" + "set_as_primary": "代表画像に設定", + "upload_limit_exceeded": "最大{{max}}個まで添付できます。" } diff --git a/lang-packs/_bundled/g7-template-sirsoft-basic-ja/frontend/partial/user.json b/lang-packs/_bundled/g7-template-sirsoft-basic-ja/frontend/partial/user.json index 242d47d7..2213ce25 100644 --- a/lang-packs/_bundled/g7-template-sirsoft-basic-ja/frontend/partial/user.json +++ b/lang-packs/_bundled/g7-template-sirsoft-basic-ja/frontend/partial/user.json @@ -51,7 +51,8 @@ "published_at": "公開日", "create_page": "ページ作成", "attachments": "添付ファイル", - "download": "ダウンロード" + "download": "ダウンロード", + "preview_banner": "未公開ページをプレビュー中です" }, "mypage": { "page_title": "マイページ", diff --git a/lang-packs/_bundled/g7-template-sirsoft-basic-ja/language-pack.json b/lang-packs/_bundled/g7-template-sirsoft-basic-ja/language-pack.json index 06e3c95a..c79774c2 100644 --- a/lang-packs/_bundled/g7-template-sirsoft-basic-ja/language-pack.json +++ b/lang-packs/_bundled/g7-template-sirsoft-basic-ja/language-pack.json @@ -12,7 +12,7 @@ "en": "G7 template (sirsoft-basic) Japanese language pack (bundled)", "ja": "G7 テンプレート (sirsoft-basic) 日本語 言語パック(バンドル)" }, - "version": "1.0.0", + "version": "1.0.1", "license": "MIT", "scope": "template", "target_identifier": "sirsoft-basic", diff --git a/modules/_bundled/sirsoft-page/CHANGELOG.md b/modules/_bundled/sirsoft-page/CHANGELOG.md index a0a155e7..3658727c 100644 --- a/modules/_bundled/sirsoft-page/CHANGELOG.md +++ b/modules/_bundled/sirsoft-page/CHANGELOG.md @@ -4,6 +4,31 @@ 형식은 [Keep a Changelog](https://keepachangelog.com/ko/1.1.0/)를 따르며, [Semantic Versioning](https://semver.org/lang/ko/)을 준수합니다. +## [1.0.1] - 2026-07-06 + +### Fixed + +- 페이지를 삭제한 뒤 같은 슬러그(주소)로 새 페이지를 다시 만들 수 있도록 수정했습니다. 이전에는 삭제한 페이지의 슬러그가 남아 "이미 사용 중"으로 표시되어 동일 주소로 페이지를 다시 만들 수 없었습니다. +- 페이지 등록 / 수정 화면에서 첨부파일을 한 번에 여러 개 올릴 때, 올린 순서대로 첨부가 저장되도록 정리했습니다. 이전에는 여러 파일을 동시에 올릴 때 순서가 뒤섞여 저장되는 경우가 있었습니다. 저장된 첨부의 순서 변경은 수정 화면에서 드래그로 즉시 반영됩니다. +- 페이지를 수정하다가 새 페이지 등록 화면으로 이동했을 때, 직전 페이지의 첨부파일·제목·슬러그와 "사용 가능한 슬러그입니다" 안내가 등록 화면에 그대로 남아 보이던 문제를 수정했습니다. +- 새 페이지 등록 화면에서 슬러그를 입력하기 전 주소 미리보기가 "/page/{{slug}}" 처럼 표시되던 문제를 수정했습니다. 이제 입력 전에는 "/page/example" 로 보이고, 입력하면 입력한 주소로 즉시 바뀝니다. +- 관리자 페이지 상세 화면에서 첨부 이미지 미리보기(썸네일)가 표시되지 않고 다운로드 버튼도 보이지 않던 문제를 수정했습니다. 이제 발행 여부와 관계없이 썸네일이 표시되고, 다운로드 버튼으로 첨부파일을 내려받을 수 있습니다. 미발행 페이지의 첨부파일 다운로드는 페이지 조회 권한이 있는 관리자에게만 허용되며, 비로그인 사용자와 일반 회원에게는 이전과 동일하게 차단됩니다. +- 사용자 페이지 화면의 첨부파일 목록에서도 이미지 첨부는 썸네일로 미리 볼 수 있도록 했습니다. 이전에는 이미지도 파일 아이콘으로만 표시되었습니다. +- 페이지를 수정·삭제하거나 이전 버전으로 복원한 직후 해당 페이지 상세 화면의 검색엔진용 캐시가 즉시 갱신되도록 수정했습니다. 이전에는 일부 캐시가 갱신되지 않아 변경 전 내용이 검색엔진에 남는 경우가 있었습니다. +- 페이지 목록에서 여러 페이지를 한 번에 발행 / 미발행할 때 활동 이력에 발행 여부가 기록되지 않던 문제를 수정했습니다. 이제 일괄 처리에서도 페이지별로 발행 / 미발행 기록이 남습니다. +- 페이지 관리 목록에서 검색 조건 '전체'로 슬러그를 검색해도 결과가 나오지 않던 문제를 수정했습니다 — '전체'는 제목과 슬러그를 함께 검색하고, '제목'을 고르면 제목만 검색됩니다. +- 페이지 관리 목록의 페이지당 표시 개수 기본값이 화면 표시(20건)와 실제 조회(15건) 간에 어긋나던 문제를 수정했습니다 — 기본값을 20건으로 통일했습니다. +- 페이지 관리 목록에서 아주 긴 검색어를 입력하면 오류 화면이 뜨던 문제를 수정했습니다 — 검색어 길이를 100자로 제한해 안내 메시지로 처리합니다. +- 페이지 상세의 버전 이력에서 "변경내역" 항목이 `title`·`content` 같은 영문 필드명으로 표시되던 문제를 수정했습니다 — 이제 "제목", "내용", "SEO 정보" 처럼 알아보기 쉬운 이름으로 표시됩니다. +- 관리자가 발행 전 페이지를 사용자 화면에서 미리 확인할 수 있게 되었습니다. 미리보기 화면에는 미발행 상태임을 알리는 안내가 표시되며, 비로그인 사용자와 일반 회원에게는 이전과 동일하게 노출되지 않습니다. +- 페이지 첨부파일을 올릴 때 허용 용량을 초과하거나 허용되지 않은 형식의 파일을 선택하면 안내 메시지가 표시됩니다 — 이전에는 업로드가 조용히 막히기만 하고 이유를 알 수 없었습니다. +- 모바일 화면의 페이지 목록에서 검색어를 입력하고 검색해도 검색이 적용되지 않고 전체 목록이 그대로 나오던 문제를 수정했습니다. 이제 모바일에서도 입력한 검색어로 정상 검색됩니다. +- 페이지 등록 / 수정 화면에서 취소를 눌렀을 때 이동 위치가 일정하지 않던 문제를 수정했습니다 — 수정 화면에서는 해당 페이지 상세로, 새 페이지 등록 화면에서는 목록으로 돌아갑니다. + +### Changed + +- 페이지 관리 화면(목록·상세·등록/수정)의 버튼·선택 상자·카드 여백 등 전반적인 구성을 다른 관리 화면과 통일해 정돈했습니다. 상세 화면의 첨부파일 목록은 처음부터 펼쳐져 보이고, 어두운 화면(다크 모드)에서 첨부 항목과 카드가 더 또렷하게 구분됩니다. + ## [1.0.0] - 2026-07-01 ### Changed diff --git a/modules/_bundled/sirsoft-page/composer.json b/modules/_bundled/sirsoft-page/composer.json index 3e51bf9b..bb65c272 100644 --- a/modules/_bundled/sirsoft-page/composer.json +++ b/modules/_bundled/sirsoft-page/composer.json @@ -2,7 +2,7 @@ "name": "modules/sirsoft-page", "description": "Page module for Gnuboard7", "type": "library", - "version": "1.0.0", + "version": "1.0.1", "license": "MIT", "autoload": { "psr-4": { diff --git a/modules/_bundled/sirsoft-page/database/migrations/2026_06_29_000001_drop_soft_deletes_from_pages_table.php b/modules/_bundled/sirsoft-page/database/migrations/2026_06_29_000001_drop_soft_deletes_from_pages_table.php new file mode 100644 index 00000000..5f4a2957 --- /dev/null +++ b/modules/_bundled/sirsoft-page/database/migrations/2026_06_29_000001_drop_soft_deletes_from_pages_table.php @@ -0,0 +1,44 @@ +whereNotNull('deleted_at')->delete(); + + Schema::table('pages', function (Blueprint $table) { + // 소프트 삭제 컬럼 제거 (페이지는 물리 삭제 방식으로 전환) + $table->dropSoftDeletes(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + if (! Schema::hasTable('pages') || Schema::hasColumn('pages', 'deleted_at')) { + return; + } + + Schema::table('pages', function (Blueprint $table) { + // 소프트 삭제 컬럼 복원 + $table->softDeletes(); + }); + } +}; diff --git a/modules/_bundled/sirsoft-page/database/migrations/2026_06_29_000002_drop_soft_deletes_from_page_attachments_table.php b/modules/_bundled/sirsoft-page/database/migrations/2026_06_29_000002_drop_soft_deletes_from_page_attachments_table.php new file mode 100644 index 00000000..2f5c0cec --- /dev/null +++ b/modules/_bundled/sirsoft-page/database/migrations/2026_06_29_000002_drop_soft_deletes_from_page_attachments_table.php @@ -0,0 +1,47 @@ +whereNotNull('deleted_at')->delete(); + + Schema::table('page_attachments', function (Blueprint $table) { + // deleted_at 인덱스 제거 (소프트 삭제 미사용으로 불필요) + $table->dropIndex(['deleted_at']); + // 소프트 삭제 컬럼 제거 (첨부는 물리 삭제 방식으로 전환) + $table->dropSoftDeletes(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + if (! Schema::hasTable('page_attachments') || Schema::hasColumn('page_attachments', 'deleted_at')) { + return; + } + + Schema::table('page_attachments', function (Blueprint $table) { + // 소프트 삭제 컬럼 복원 + $table->softDeletes()->comment('소프트 삭제 일시'); + // deleted_at 인덱스 복원 + $table->index('deleted_at'); + }); + } +}; diff --git a/modules/_bundled/sirsoft-page/module.json b/modules/_bundled/sirsoft-page/module.json index 2922e1ec..93be60e8 100644 --- a/modules/_bundled/sirsoft-page/module.json +++ b/modules/_bundled/sirsoft-page/module.json @@ -5,7 +5,7 @@ "ko": "페이지", "en": "Page" }, - "version": "1.0.0", + "version": "1.0.1", "license": "MIT", "description": { "ko": "정적 페이지(정보/정책/안내) 관리 모듈", diff --git a/modules/_bundled/sirsoft-page/package-lock.json b/modules/_bundled/sirsoft-page/package-lock.json index 2a139189..79e30c54 100644 --- a/modules/_bundled/sirsoft-page/package-lock.json +++ b/modules/_bundled/sirsoft-page/package-lock.json @@ -1,12 +1,12 @@ { "name": "@g7/sirsoft-page", - "version": "1.0.0", + "version": "1.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@g7/sirsoft-page", - "version": "1.0.0", + "version": "1.0.1", "devDependencies": { "jsdom": "^27.4.0", "typescript": "^5.3.3", diff --git a/modules/_bundled/sirsoft-page/package.json b/modules/_bundled/sirsoft-page/package.json index 1d5186a2..34d516e4 100644 --- a/modules/_bundled/sirsoft-page/package.json +++ b/modules/_bundled/sirsoft-page/package.json @@ -1,6 +1,6 @@ { "name": "@g7/sirsoft-page", - "version": "1.0.0", + "version": "1.0.1", "description": "그누보드7 페이지 모듈 프론트엔드 에셋", "private": true, "type": "module", diff --git a/modules/_bundled/sirsoft-page/resources/js/__tests__/layouts/admin-page-detail-attachment-download.test.tsx b/modules/_bundled/sirsoft-page/resources/js/__tests__/layouts/admin-page-detail-attachment-download.test.tsx new file mode 100644 index 00000000..f42ebe5b --- /dev/null +++ b/modules/_bundled/sirsoft-page/resources/js/__tests__/layouts/admin-page-detail-attachment-download.test.tsx @@ -0,0 +1,89 @@ +/** + * @file admin-page-detail-attachment-download.test.tsx + * @description 관리자 페이지 상세 첨부 카드가 토큰 동반 핸들러로 다운로드하고, 다운로드 아이콘이 + * 유효한 Font Awesome 이름을 쓰는지 회귀 (별건: 관리자 상세 첨부 썸네일·다운로드 미노출). + * + * 검증 방식: 레이아웃 JSON 트리 직접 분석 (DOM 비의존). + * + * 결함 A: 첨부 카드(id: "attachment_card")가 브라우저 직접 + * 링크였다. 커밋 d48c684 로 download_url 이 auth:sanctum 보호 admin 라우트가 되어 + * 네비게이션에 토큰이 실리지 않아 401 로 깨졌다. + * 결함 B: 다운로드 아이콘 name="arrow-down-tray"(Heroicons)는 FA 에 없어 조용히 미렌더. + * + * 수정: 카드를 Div + actions:[{click → downloadAttachment}] 로 전환(토큰 동반), + * 아이콘 name 을 유효한 FA 이름 "download" 로 교체. + * + * @scenario surface=admin_page_detail + * @effects download_card_uses_handler_not_anchor + * @effects download_icon_valid_fa_name + */ + +import { describe, it, expect } from 'vitest'; + +import adminPageDetail from '../../../layouts/admin/admin_page_detail.json'; + +type Node = Record & { children?: unknown; actions?: unknown }; + +function collectNodes(node: unknown, predicate: (n: Node) => boolean): Node[] { + const result: Node[] = []; + const walk = (cur: unknown): void => { + if (Array.isArray(cur)) { + cur.forEach(walk); + return; + } + if (cur && typeof cur === 'object') { + const obj = cur as Node; + if (predicate(obj)) { + result.push(obj); + } + Object.values(obj).forEach(walk); + } + }; + walk(node); + return result; +} + +// Heroicons 계열 이름(FA 미존재) — 조용히 미렌더 회귀 차단용 블랙리스트 +const HEROICON_NAMES = ['arrow-down-tray', 'arrow-up-tray', 'arrow-down-circle']; + +describe('별건 — 관리자 페이지 상세 첨부 다운로드 카드', () => { + it('첨부 카드는 직접 링크가 아니다 (토큰 미동반 401 회귀 차단)', () => { + const cards = collectNodes(adminPageDetail, (n) => typeof n.id === 'string' && n.id.startsWith('attachment_card')); + expect(cards.length).toBeGreaterThan(0); + + for (const card of cards) { + const props = (card.props ?? {}) as Record; + const isAnchorHref = card.name === 'A' && typeof props.href === 'string'; + expect(isAnchorHref).toBe(false); + } + }); + + it('첨부 카드는 click 액션으로 downloadAttachment 핸들러를 호출한다', () => { + const cards = collectNodes(adminPageDetail, (n) => typeof n.id === 'string' && n.id.startsWith('attachment_card')); + const card = cards[0]; + + const actions = (card.actions ?? []) as Array>; + const clickAction = actions.find((a) => a.type === 'click'); + + expect(clickAction).toBeDefined(); + expect(clickAction?.handler).toBe('downloadAttachment'); + + const params = (clickAction?.params ?? {}) as Record; + expect(params.url).toContain('download_url'); + expect(params.filename).toContain('original_filename'); + }); + + it('다운로드 아이콘은 유효한 Font Awesome 이름을 쓴다 (arrow-down-tray 미렌더 회귀 차단)', () => { + const icons = collectNodes(adminPageDetail, (n) => n.name === 'Icon'); + const iconNames = icons + .map((n) => (n.props as Record | undefined)?.name) + .filter((v): v is string => typeof v === 'string'); + + for (const blacklisted of HEROICON_NAMES) { + expect(iconNames).not.toContain(blacklisted); + } + + // 다운로드 아이콘이 실제로 존재하고 FA 유효 이름("download")을 쓴다 + expect(iconNames).toContain('download'); + }); +}); diff --git a/modules/_bundled/sirsoft-page/resources/js/__tests__/layouts/admin-page-layouts.test.ts b/modules/_bundled/sirsoft-page/resources/js/__tests__/layouts/admin-page-layouts.test.ts index f5e07c92..b7afa8bd 100644 --- a/modules/_bundled/sirsoft-page/resources/js/__tests__/layouts/admin-page-layouts.test.ts +++ b/modules/_bundled/sirsoft-page/resources/js/__tests__/layouts/admin-page-layouts.test.ts @@ -291,6 +291,120 @@ describe('admin_page_list.json', () => { expect(findById(adminPageList, 'published_true')).toBeNull(); expect(findById(adminPageList, 'published_false')).toBeNull(); }); + + // ─── F2: 모바일 검색 저장/읽기 저장소 정합 ─── + + /** + * responsive.portable 등 반응형 오버라이드 내부까지 순회하며 id 로 노드를 찾는다. + * (모바일 검색 요소는 search_row 의 responsive.portable.children 안에 중첩됨) + */ + function findByIdDeep(node: any, id: string): any | null { + if (!node || typeof node !== 'object') return null; + if (node.id === id) return node; + for (const child of node.children ?? []) { + const f = findByIdDeep(child, id); + if (f) return f; + } + if (node.slots) { + for (const sc of Object.values(node.slots)) { + if (Array.isArray(sc)) for (const c of sc) { const f = findByIdDeep(c, id); if (f) return f; } + } + } + for (const modal of node.modals ?? []) { const f = findByIdDeep(modal, id); if (f) return f; } + // 반응형 오버라이드 순회 + if (node.responsive) { + for (const bp of Object.values(node.responsive) as any[]) { + for (const c of bp?.children ?? []) { const f = findByIdDeep(c, id); if (f) return f; } + } + } + return null; + } + + it('[F2] 모바일 검색필드 select 의 change setState 가 target:global 을 쓰지 않음 (읽기는 _local 이므로 저장도 _local 이어야 검색 동작)', () => { + // 회귀 배경(실측): 모바일 select/input 이 target:"global" 로 _global.searchQuery 에 저장하는데, + // 검색 버튼·value 바인딩은 {{_local.searchQuery}} 를 읽음 → 검색 버튼이 항상 빈 값 전송 → + // 모바일에서 검색이 전혀 걸리지 않음(전체 목록 그대로). 데스크톱은 target 없이 _local 에 저장해 정상. + const select = findByIdDeep(adminPageList, 'mobile_search_field_select'); + expect(select).not.toBeNull(); + const changeAction = (select.actions ?? []).find((a: any) => a.type === 'change'); + expect(changeAction?.handler).toBe('setState'); + expect(changeAction?.params?.target).not.toBe('global'); + }); + + it('[F2] 모바일 검색 input 의 change setState 가 target:global 을 쓰지 않음 (데스크톱과 동일하게 _local 저장)', () => { + const input = findByIdDeep(adminPageList, 'mobile_search_input'); + expect(input).not.toBeNull(); + const changeAction = (input.actions ?? []).find((a: any) => a.type === 'change'); + expect(changeAction?.handler).toBe('setState'); + expect(changeAction?.params?.target).not.toBe('global'); + // 저장 키는 searchQuery 유지 + expect(changeAction?.params).toHaveProperty('searchQuery'); + }); + + it('[F2] 데스크톱 검색 select/input 은 이미 target:global 을 쓰지 않음 (정상 기준선 — 회귀 대조군)', () => { + const dField = findById(adminPageList, 'search_field_select'); + const dInput = findById(adminPageList, 'search_input'); + const fieldChange = (dField.actions ?? []).find((a: any) => a.type === 'change'); + const inputChange = (dInput.actions ?? []).find((a: any) => a.type === 'change'); + expect(fieldChange?.params?.target).not.toBe('global'); + expect(inputChange?.params?.target).not.toBe('global'); + }); + + // ─── C1·C2·C5: 시맨틱 클래스 정리 ─── + + it('[C1] 검색바 안 필드 셀렉트는 pill(select-composite), 툴바 발행/정렬/개수는 테두리(border+bg-white) — 이커머스 목록 관행', () => { + // 관행(이커머스 shipping_policy/order/product 목록): 검색바 내부 필드 셀렉트 = pill, + // 목록 툴바의 필터/정렬/개수 셀렉트 = 테두리(bg-white border). 위치에 따라 외형이 다름. + const searchField = findById(adminPageList, 'search_field_select'); + expect(searchField.props.className).toContain('select-composite'); + + for (const id of ['published_filter_select', 'sort_select', 'per_page_select']) { + const sel = findById(adminPageList, id); + expect(sel, id).not.toBeNull(); + // 툴바 셀렉트는 테두리 형태 — select-composite(pill) 아님 + expect(sel.props.className, id).not.toContain('select-composite'); + expect(sel.props.className, id).toContain('border'); + expect(sel.props.className, id).toContain('bg-white'); + } + }); + + it('[C2] 검색 버튼(데스크톱/모바일)이 btn btn-primary 를 사용하고 bg-gray-800 하드코딩을 쓰지 않음', () => { + // 표준(이커머스 주문/상품 목록): 검색·필터 적용 버튼 = btn btn-primary(파랑). + const dBtn = findById(adminPageList, 'search_button'); + const mBtn = findByIdDeep(adminPageList, 'mobile_search_button'); + expect(dBtn.props.className).toContain('btn btn-primary'); + expect(dBtn.props.className).not.toContain('bg-gray-800'); + expect(mBtn.props.className).toContain('btn btn-primary'); + expect(mBtn.props.className).toContain('w-full'); + expect(mBtn.props.className).not.toContain('bg-gray-800'); + }); + + it('[C2] 등록 버튼이 btn btn-primary 를 사용하고 bg-blue-600 하드코딩을 쓰지 않음', () => { + const addBtn = findById(adminPageList, 'add_page_button'); + expect(addBtn.props.className).toContain('btn btn-primary'); + expect(addBtn.props.className).not.toContain('bg-blue-600'); + }); + + it('[C5] 목록 모달 버튼에 하드코딩 색상(bg-green-600/gray-600/red-600/bg-white...border) 이 남아있지 않음', () => { + const modalsStr = JSON.stringify((adminPageList as any).modals ?? []); + expect(modalsStr).not.toContain('bg-green-600'); + expect(modalsStr).not.toContain('bg-gray-600'); + expect(modalsStr).not.toContain('bg-red-600'); + // 취소 버튼 하드코딩 패턴(bg-white...border) 제거 확인 + expect(modalsStr).not.toContain('bg-white dark:bg-gray-800 text-gray-700'); + // 시맨틱 btn 계열 사용 확인 (취소=secondary, 삭제=danger, 그 외 확인=primary) + expect(modalsStr).toContain('btn btn-secondary'); + expect(modalsStr).toContain('btn btn-primary'); + expect(modalsStr).toContain('btn btn-danger'); + }); + + it('[C5] 모달 버튼에 flex-center gap-* 접두사가 없음 (btn 자체가 inline-flex 정렬 — 취소/확인 크기 정합)', () => { + // 회귀 배경: btn 은 이미 inline-flex items-center justify-center gap-2 를 포함. + // 위에 flex-center(=flex items-center)를 덧붙이면 inline-flex→flex 로 덮어써 버튼 폭이 + // 늘어나 취소/확인 버튼 크기가 어긋남(PO 지적: 닫기≠복원). btn 만 남겨 정합. + const modalsStr = JSON.stringify((adminPageList as any).modals ?? []); + expect(modalsStr).not.toMatch(/flex-center gap-[\d.]+ btn/); + }); }); // ───────────────────────────────────────────── @@ -568,6 +682,157 @@ describe('admin_page_form.json', () => { expect(emptyDivWrapper, id).toBeUndefined(); } }); + + // ─── 수정→등록 SPA 전환 시 폼/첨부 잔존 차단 ─── + + it('FileUploader initialFiles 가 _local.form.attachments 에 바인딩됨 (등록 모드 전환 시 빈 배열로 동기화되어 이전 첨부 잔존 차단)', () => { + // 회귀 배경: pageData?.data?.attachments 바인딩은 등록 모드에서 pageData 가 없어 + // initialFiles 참조가 불변 → FileUploader 동기화 useEffect 미발화 → 이전 첨부 잔존. + // _local.form.attachments 바인딩은 init_actions 의 form 초기화로 참조가 바뀌어 동기화 트리거. + const uploaders = findComponentsByName(adminPageForm, 'FileUploader'); + expect(uploaders.length).toBeGreaterThan(0); + expect(uploaders[0].props.initialFiles).toContain('_local.form'); + expect(uploaders[0].props.initialFiles).toContain('attachments'); + expect(uploaders[0].props.initialFiles).not.toContain('pageData'); + }); + + it('생성 모드 init_actions 가 form 을 null 로 비운 뒤 빈 기본값으로 초기화함 (수정→등록 전환 시 이전 form 잔존 차단)', () => { + const initActions = (adminPageForm as any).init_actions as any[]; + // 생성 모드(if !route?.id) 의 form 관련 setState 액션들 + const createFormActions = initActions.filter( + (a) => a.if && a.if.includes('!route?.id') && a.params?.target === 'local' && 'form' in (a.params ?? {}), + ); + // form: null 로 먼저 비우는 액션 + const nullReset = createFormActions.find((a) => a.params.form === null); + expect(nullReset, 'form=null 리셋 액션').toBeDefined(); + // form: {기본값} 으로 채우는 액션 (attachments: [] 포함) + const defaultInit = createFormActions.find( + (a) => a.params.form && typeof a.params.form === 'object' && Array.isArray(a.params.form.attachments), + ); + expect(defaultInit, 'form 기본값 초기화 액션').toBeDefined(); + expect(defaultInit.params.form.attachments).toEqual([]); + }); + + it('생성 모드 init_actions 가 슬러그 검증 상태(slugChecked/slugAvailable)를 false 로 리셋함 (이전 "사용 가능" 메시지 잔존 차단)', () => { + const initActions = (adminPageForm as any).init_actions as any[]; + const slugReset = initActions.find( + (a) => + a.if && + a.if.includes('!route?.id') && + a.params?.slugChecked === false && + a.params?.slugAvailable === false, + ); + expect(slugReset).toBeDefined(); + }); + + it('slug_hint URL 미리보기가 빈 슬러그일 때 || fallback 으로 example 치환됨 ({{slug}} 미치환 회귀 차단)', () => { + // 회귀 배경: ?? 'example' 은 빈 문자열('')을 통과시켜 다국어 파라미터가 빈 값이 되고 + // {{slug}} 가 치환되지 않은 채 노출됨. || 'example' 로 빈 문자열도 fallback 처리. + const slugField = findById(adminPageForm, 'slug_field'); + const hintSpan = (slugField.children ?? []).find( + (c: any) => typeof c.text === 'string' && c.text.includes('slug_hint'), + ); + expect(hintSpan).toBeDefined(); + expect(hintSpan.text).toContain("|| 'example'"); + expect(hintSpan.text).not.toContain("?? 'example'"); + }); + + // ─── 첨부 순서 — form.attachments 동기화 (이커머스 패턴) ─── + + it('FileUploader 에 onUploadComplete/onReorder/onRemove 액션이 form.attachments 를 동기화함', () => { + const uploaders = findComponentsByName(adminPageForm, 'FileUploader'); + const actions = uploaders[0].actions ?? []; + const events = actions.map((a: any) => a.event); + expect(events).toContain('onUploadComplete'); + expect(events).toContain('onReorder'); + expect(events).toContain('onRemove'); + // onReorder 가 form.attachments 를 최종 순서로 덮어씀 + const onReorder = actions.find((a: any) => a.event === 'onReorder'); + expect(onReorder.handler).toBe('setState'); + expect(onReorder.params['form.attachments']).toContain('$args[0]'); + }); + + // ─── 첨부 검증 실패 안내 (용량/확장자/개수 초과 toast) ─── + + it('FileUploader 에 onUploadError → toast 액션이 있어 검증 실패를 사용자에게 안내함', () => { + // 회귀 배경: onUploadError 핸들러 부재로 용량/확장자/개수 초과 시 백엔드/클라이언트 + // 차단은 되나 toast 안내가 없어 사용자가 이유를 알 수 없었음. + const uploaders = findComponentsByName(adminPageForm, 'FileUploader'); + const actions = uploaders[0].actions ?? []; + const onUploadError = actions.find((a: any) => a.event === 'onUploadError'); + expect(onUploadError, 'onUploadError 액션').toBeDefined(); + expect(onUploadError.handler).toBe('toast'); + expect(onUploadError.params.type).toBe('error'); + // 훅이 만든 에러 메시지 문자열($args[0])을 그대로 표시 + expect(onUploadError.params.message).toContain('$args[0]'); + }); + + it('FileUploader reorder 엔드포인트가 수정 모드(route.id)에서만 활성화됨 (생성 모드는 temp 첨부라 reorder 불가)', () => { + const uploaders = findComponentsByName(adminPageForm, 'FileUploader'); + expect(uploaders[0].props.apiEndpoints.reorder).toContain('route?.id'); + }); + + // ─── UI 검토 M1·M6 회귀 차단 ─── + + it('[M1-a] 검증에러 제목 클래스가 공백으로 분리됨 (font-medium + text-danger-soft, 병합 클래스 금지)', () => { + // 회귀 배경: "font-mediumtext-danger-soft" 처럼 공백 없이 붙으면 두 클래스 모두 무효 + // → 빌드 CSS 에 해당 클래스 부재 → 빨간색/굵기 미적용. + const errorBox = findById(adminPageForm, 'error_message_box'); + expect(errorBox).not.toBeNull(); + const boxStr = JSON.stringify(errorBox); + // 병합된 무효 클래스가 없어야 함 + expect(boxStr).not.toContain('font-mediumtext-danger-soft'); + // 제목 H3 은 두 클래스를 공백으로 분리해서 보유 + const heading = findComponentsByName(errorBox, 'H3')[0]; + expect(heading).toBeDefined(); + const cls = heading.props.className ?? ''; + expect(cls).toContain('font-medium'); + expect(cls).toContain('text-danger-soft'); + }); + + it('[M1-b] 에러 박스에 하단 여백(mb-*)이 있어 아래 카드와 붙지 않음', () => { + // 회귀 배경: alert-danger 자산에 margin-bottom 없음 → 바로 아래 admin-card 와 딱 붙음. + // 같은 폼의 read_only_banner 는 mb-6 으로 간격을 주므로 에러 박스도 통일. + const errorBox = findById(adminPageForm, 'error_message_box'); + expect(errorBox).not.toBeNull(); + expect(errorBox.props.className).toContain('alert-danger'); + expect(errorBox.props.className).toMatch(/\bmb-\d/); + }); + + it('[C4] 저장 버튼이 btn btn-primary 시맨틱 클래스를 쓰고 saving 시 색을 바꾸지 않음 (board/ecommerce norm)', () => { + // 회귀 배경: saving 시 bg-blue-400 로 색을 바꾸던 하드코딩(다크모드 미지원) → btn-primary 고정. + // 저장중 표현은 색이 아니라 disabled + spinner 아이콘 + 라벨 토글로. + const saveBtn = findById(adminPageForm, 'footer_save_button'); + expect(saveBtn).not.toBeNull(); + const cls = saveBtn.props.className ?? ''; + expect(cls).toContain('btn btn-primary'); + // saving 조건부 색 변경(bg-blue-400/bg-blue-600) 제거 + expect(cls).not.toContain('bg-blue-400'); + expect(cls).not.toContain('bg-blue-600'); + // disabled 는 saving 으로 유지 + expect(saveBtn.props.disabled).toContain('saving'); + // spinner 아이콘이 saving 시 표시됨 + const spinner = findComponentsByName(saveBtn, 'Icon').find( + (i: any) => i.props?.name === 'spinner', + ); + expect(spinner).toBeDefined(); + expect(spinner.if).toContain('saving'); + }); + + it('[M6] 취소 버튼이 navigateBack 이 아니라 navigate 로 목록/상세를 명시함', () => { + // 회귀 배경: navigateBack(history.back)은 직전 위치(다른 메뉴)로 튀거나 직접 진입 시 멈춤. + // 수정 모드는 상세(/admin/pages/{id}), 등록 모드는 목록(/admin/pages) 으로 명시 이동. + const cancelBtn = findById(adminPageForm, 'footer_cancel_button'); + expect(cancelBtn).not.toBeNull(); + const action = (cancelBtn.actions ?? []).find((a: any) => a.type === 'click'); + expect(action).toBeDefined(); + expect(action.handler).toBe('navigate'); + expect(action.handler).not.toBe('navigateBack'); + // route.id 분기로 수정=상세 / 등록=목록 + const path = action.params?.path ?? ''; + expect(path).toContain('/admin/pages'); + expect(path).toContain('route'); + }); }); // ───────────────────────────────────────────── @@ -717,4 +982,213 @@ describe('admin_page_detail.json', () => { // $locale 로 fallback 하는 표현식이 존재해야 함 (탭 + 콘텐츠 표현식) expect(layoutStr).toMatch(/_local\.lang \?\? \$locale/); }); + + // ─── 변경내역 필드명 다국어 매핑 ─── + + /** + * 버전 이력 테이블의 변경내역(changes_summary) 컬럼에서 + * changed_fields 를 표시하는 cellChild 를 찾는다. + */ + function findChangedFieldsCell(): any { + const grids = findComponentsByName(adminPageDetail, 'DataGrid'); + const col = grids[0]?.props?.columns?.find((c: any) => c.field === 'changes_summary'); + expect(col, 'changes_summary 컬럼').toBeDefined(); + // changed_fields 길이 > 0 조건을 가진 cellChild (라벨 표시 셀) + return (col.cellChildren ?? []).find( + (cc: any) => + typeof cc.if === 'string' && + cc.if.includes('changed_fields?.length > 0'), + ); + } + + it('변경내역 셀이 changed_fields 를 raw 영문 식별자로 그대로 join 하지 않음 (제목/내용 다국어 매핑)', () => { + const cell = findChangedFieldsCell(); + expect(cell, 'changed_fields 표시 셀').toBeDefined(); + // 회귀 차단: 영문 식별자 배열을 그대로 join 하면 화면에 title, content 노출 + expect(cell.text).not.toMatch(/changed_fields\?\.join\(', '\)\s*\?\?\s*'-'/); + }); + + it('변경내역 셀이 field_labels 다국어 키로 각 필드를 변환함 ($t 매핑)', () => { + const cell = findChangedFieldsCell(); + expect(cell, 'changed_fields 표시 셀').toBeDefined(); + const cellStr = JSON.stringify(cell); + // field_labels 키 경로 + $t 함수 변환 사용 + expect(cellStr).toContain('field_labels'); + expect(cellStr).toContain('$t'); + }); + + it('field_labels 4종(title/content/seo_meta/content_mode) 키 경로를 참조함 (PageService compareFields 정합)', () => { + const cell = findChangedFieldsCell(); + const cellStr = JSON.stringify(cell); + // 동적 키 prefix 가 versions.field_labels 를 가리킴 + expect(cellStr).toContain('sirsoft-page.admin.page.detail.versions.field_labels'); + }); + + // ─── UI 검토 M2·M3·M4·M5 회귀 차단 ─── + + it('[M5] onError 메시지 바인딩이 $error 가 아닌 error 컨텍스트 변수를 사용함 (엔진 onError context 키는 error)', () => { + // 회귀 배경: 엔진은 onError 콜백 컨텍스트를 `error` 키로 제공(ActionDispatcher). + // `$error` 는 undefined → message 표현식이 항상 fallback 문구로 떨어져 + // 서버가 준 실제 실패 사유가 사용자에게 노출되지 않음. 목록 모달은 이미 error.* 사용. + const layoutStr = JSON.stringify(adminPageDetail); + expect(layoutStr).not.toContain('$error'); + // 삭제/복원 실패 onError 는 error.message fallback 패턴을 사용해야 함 + expect(layoutStr).toContain('error.message'); + }); + + it('[M3] 첨부 카드 hover 배경이 다크모드 기본 상태에 색을 박지 않음 (admin-card 배경과 중복 방지)', () => { + // 회귀 배경: "hover:bg-gray-50 dark:bg-gray-800 dark:hover:bg-gray-700/50" 는 + // 다크모드에서 hover 가 아닌 기본 상태에 bg-gray-800 을 상시 적용 → admin-card 배경과 중복. + const attachmentsSection = findById(adminPageDetail, 'attachments_section'); + const cards = findComponentsByName(attachmentsSection, 'Div').filter( + (n: any) => typeof n.props?.className === 'string' && n.props.className.includes('hover:bg-gray-50'), + ); + expect(cards.length).toBeGreaterThan(0); + for (const card of cards) { + // 기본 상태 다크 배경 토큰(dark:bg-gray-800) 을 hover 카드에서 제거 + expect(card.props.className).not.toContain('dark:bg-gray-800'); + } + }); + + it('[토글] 첨부 목록이 기본 열림 상태 (showAttachments ?? true) — 토글/아이콘/본문 3곳 일관', () => { + // PO 요청: 첨부 목록이 처음부터 펼쳐져 보이도록. + const section = findById(adminPageDetail, 'attachments_section'); + const sectionStr = JSON.stringify(section); + // 기본 열림: (_local.showAttachments ?? true) 패턴 사용 (fallback true) + expect(sectionStr).toContain('_local.showAttachments ?? true'); + // 이전 fallback 없는 raw 참조가 본문 if / 아이콘에 남지 않아야 함 + // (토글 액션의 !(...) 는 유지되므로 정확 매칭으로 raw if 만 차단) + const listNode = findById(section, 'attachments_list_{{att_idx}}') + ?? (section.children ?? []).find((c: any) => typeof c.if === 'string' && c.if.includes('showAttachments')); + expect(listNode).toBeDefined(); + expect(listNode.if).toContain('showAttachments ?? true'); + }); + + it('[메타카드] info_grid 가 grid-2col-responsive (모바일 1열 → PC 2열) 를 사용함', () => { + // PO 결정: 메타 4항목(작성자/발행일시/생성일/수정일)을 PC 2열·모바일 1열로. + const infoGrid = findById(adminPageDetail, 'info_grid'); + expect(infoGrid).not.toBeNull(); + expect(infoGrid.props.className).toContain('grid-2col-responsive'); + // 세로 나열 원인이던 panel-header-row 단독 사용 금지 + expect(infoGrid.props.className).not.toBe('panel-header-row'); + }); + + it('[헤더통일 A] 카드 섹션 헤더가 card-title + px-6/panel-header 미사용 (admin-card 패딩만 의존, 이중여백·구분선 제거)', () => { + // 조사 결과 board/ecommerce norm = admin-card > card-title (헤더에 px-6/panel-header 없음). + // 회귀 배경: admin-card 자체 p-4 위에 헤더가 px-6(24px)+panel-header(border-b)를 더해 + // 헤더 앞 여백이 16+24=40px 로 이중 적용되고 구분선이 어색하게 뜸(PO 지적). + const headerIds = ['content_header', 'seo_header', 'versions_header']; + for (const id of headerIds) { + const header = findById(adminPageDetail, id); + expect(header, id).not.toBeNull(); + const cls = header.props?.className ?? ''; + expect(cls, id).not.toContain('px-6'); + expect(cls, id).not.toContain('panel-header'); + const titleSpan = findComponentsByName(header, 'Span').find( + (s: any) => typeof s.text === 'string' && s.text.startsWith('$t:'), + ); + expect(titleSpan, id).toBeDefined(); + expect(titleSpan.props?.className, id).toContain('card-title'); + expect(titleSpan.props?.className, id).not.toContain('text-body font-medium'); + } + }); + + it('[헤더통일 A] 첨부 헤더가 paperclip 제거 + card-title + px-6/panel-header 미사용', () => { + const header = findById(adminPageDetail, 'attachments_header'); + expect(header).not.toBeNull(); + const cls = header.props?.className ?? ''; + expect(cls).not.toContain('px-6'); + expect(cls).not.toContain('panel-header'); + // paperclip 아이콘 미존재 + const icons = findComponentsByName(header, 'Icon'); + const paperclip = icons.find((i: any) => i.props?.name === 'paperclip'); + expect(paperclip).toBeUndefined(); + // 제목 텍스트가 card-title + const titleSpan = findComponentsByName(header, 'Span').find( + (s: any) => typeof s.text === 'string' && s.text.includes('attachments'), + ); + expect(titleSpan).toBeDefined(); + expect(titleSpan.props?.className).toContain('card-title'); + }); + + it('[헤더통일 A] info_header / info_grid 도 px-6 미사용 (admin-card 패딩만 의존)', () => { + const infoHeader = findById(adminPageDetail, 'info_header'); + const infoGrid = findById(adminPageDetail, 'info_grid'); + expect(infoHeader).not.toBeNull(); + expect(infoGrid).not.toBeNull(); + expect(infoHeader.props.className).not.toContain('px-6'); + expect(infoGrid.props.className).not.toContain('px-6'); + }); + + it('[C3] 상세 헤더 수정/삭제 버튼이 btn 시맨틱 클래스 사용 (하드코딩 bg-blue/red 제거, 다크모드 자산 내장)', () => { + // 회귀 배경: 헤더 수정/삭제 버튼이 bg-blue-600 / bg-red-600 하드코딩(다크모드 미지원). + // board/ecommerce norm = btn btn-primary / btn btn-danger (뒤로 버튼은 이미 btn btn-secondary). + const editBtn = findById(adminPageDetail, 'header_edit_button'); + const deleteBtn = findById(adminPageDetail, 'header_delete_button'); + expect(editBtn).not.toBeNull(); + expect(deleteBtn).not.toBeNull(); + // 데스크톱 className 이 btn 시맨틱, 하드코딩 색 제거 + expect(editBtn.props.className).toContain('btn btn-primary'); + expect(editBtn.props.className).not.toContain('bg-blue-600'); + expect(deleteBtn.props.className).toContain('btn btn-danger'); + expect(deleteBtn.props.className).not.toContain('bg-red-600'); + // 모바일 responsive 오버라이드에도 하드코딩 색이 남지 않아야 함 + expect(JSON.stringify(editBtn.responsive ?? {})).not.toContain('bg-blue-600'); + expect(JSON.stringify(deleteBtn.responsive ?? {})).not.toContain('bg-red-600'); + }); + + it('[C3] 삭제/복원 모달 확정 버튼이 btn 시맨틱 클래스 사용 (하드코딩 색 제거)', () => { + // deletePageModal 삭제 확정 = btn btn-danger, restore/preview 복원 = btn btn-primary + const deleteModal = (adminPageDetail as any).modals?.find((m: any) => m.id === 'deletePageModal'); + const restoreModal = (adminPageDetail as any).modals?.find((m: any) => m.id === 'restoreVersionModal'); + expect(deleteModal).toBeDefined(); + expect(restoreModal).toBeDefined(); + // 확정 버튼들에 하드코딩 solid 색 미사용 + expect(JSON.stringify(deleteModal)).not.toContain('bg-red-600'); + expect(JSON.stringify(restoreModal)).not.toContain('bg-blue-600'); + }); + + it('[버전여백] 버전 이력 안내문(restore_guide)이 하단 여백을 갖고 좌우 마진(mx-6) 미사용 (카드 패딩에 위임)', () => { + // 회귀 배경: 헤더 → 안내문 → 표가 여백 없이 딱 붙음 → mb-4 부여. + // 추가: mx-6(좌우 24px)은 admin-card p-4 위에 이중 적용되어 안내문 양옆이 과하게 들어감 → 제거. + const section = findById(adminPageDetail, 'versions_section'); + expect(section).not.toBeNull(); + const guideBox = (section.children ?? []).find( + (c: any) => JSON.stringify(c).includes('restore_guide'), + ); + expect(guideBox).toBeDefined(); + const cls = guideBox.props?.className ?? ''; + // 하단 여백 유지 + expect(cls).toMatch(/\bmb-\d/); + // 좌우 마진(mx-*) 미사용 — 카드 폭에 맞게 + expect(cls).not.toMatch(/\bmx-\d/); + }); + + it('[첨부구분] 각 첨부 항목이 자체 border-b 로 구분됨 (divide-y 는 iteration 자식에 미적용 → 항목별 하단 구분선)', () => { + // 회귀 배경: 리스트 컨테이너의 divide-y 는 iteration 항목이 wrapper 로 감싸져 + // 직접 형제가 되지 못해 border-top 이 렌더되지 않음(childCount=1, MCP 실측). + // → 각 항목(attachment_card)에 직접 border-b 를 부여해 항목 구분. + const card = findById(adminPageDetail, 'attachment_card_{{att_idx}}'); + expect(card).not.toBeNull(); + const cls = card.props?.className ?? ''; + expect(cls).toContain('border-b'); + expect(cls).toContain('border-gray-200'); + expect(cls).toContain('dark:border-gray-700'); + }); + + it('[언어탭 반응형] 표시언어 영역이 flex-wrap + 힌트가 모바일에서 줄바꿈(w-full) (좁은 화면 탭 글자 깨짐 방지)', () => { + // 회귀 배경: 표시언어 라벨/탭/힌트가 flex 한 줄에 배치되어 모바일(390px)에서 + // 공간 부족으로 탭 버튼 글자가 세로로 깨짐. 컨테이너 flex-wrap + 힌트 모바일 w-full 로 줄바꿈. + const container = findById(adminPageDetail, 'unified_lang_tabs'); + expect(container).not.toBeNull(); + expect(container.props.className).toContain('flex-wrap'); + // 힌트 Span 이 모바일 responsive 로 전체폭(줄바꿈) 처리 + const hint = findComponentsByName(container, 'Span').find( + (s: any) => typeof s.text === 'string' && s.text.includes('display_language_hint'), + ); + expect(hint).toBeDefined(); + const portableCls = hint.responsive?.portable?.props?.className ?? ''; + expect(portableCls).toContain('w-full'); + }); + }); diff --git a/modules/_bundled/sirsoft-page/resources/lang/partial/en/admin.json b/modules/_bundled/sirsoft-page/resources/lang/partial/en/admin.json index 2409756e..86a0d325 100644 --- a/modules/_bundled/sirsoft-page/resources/lang/partial/en/admin.json +++ b/modules/_bundled/sirsoft-page/resources/lang/partial/en/admin.json @@ -160,7 +160,13 @@ "initial": "Initial", "changed_fields": "Changed: {{fields}}", "restored_from": "Restored from v{{version}}", - "restore_guide": "Click View to check contents and restore. Attachments are not included in version management." + "restore_guide": "Click View to check contents and restore. Attachments are not included in version management.", + "field_labels": { + "title": "Title", + "content": "Content", + "seo_meta": "SEO", + "content_mode": "Edit Mode" + } } } } diff --git a/modules/_bundled/sirsoft-page/resources/lang/partial/ko/admin.json b/modules/_bundled/sirsoft-page/resources/lang/partial/ko/admin.json index 9a74af08..9a12470a 100644 --- a/modules/_bundled/sirsoft-page/resources/lang/partial/ko/admin.json +++ b/modules/_bundled/sirsoft-page/resources/lang/partial/ko/admin.json @@ -160,7 +160,13 @@ "initial": "최초 생성", "changed_fields": "변경: {{fields}}", "restored_from": "v{{version}}에서 복원", - "restore_guide": "보기 버튼을 클릭하면 내용을 확인하고 복원할 수 있습니다. 첨부파일은 버전 관리에 포함되지 않습니다." + "restore_guide": "보기 버튼을 클릭하면 내용을 확인하고 복원할 수 있습니다. 첨부파일은 버전 관리에 포함되지 않습니다.", + "field_labels": { + "title": "제목", + "content": "내용", + "seo_meta": "SEO 정보", + "content_mode": "편집 모드" + } } } } diff --git a/modules/_bundled/sirsoft-page/resources/layouts/admin/admin_page_detail.json b/modules/_bundled/sirsoft-page/resources/layouts/admin/admin_page_detail.json index 51f5b0dc..990e9324 100644 --- a/modules/_bundled/sirsoft-page/resources/layouts/admin/admin_page_detail.json +++ b/modules/_bundled/sirsoft-page/resources/layouts/admin/admin_page_detail.json @@ -93,7 +93,7 @@ "type": "basic", "name": "Button", "props": { - "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", + "className": "btn btn-secondary", "disabled": "{{_global.isDeletingPage}}" }, "actions": [ @@ -114,7 +114,7 @@ "type": "basic", "name": "Button", "props": { - "className": "flex-center gap-2 px-4 py-2 bg-red-600 text-white rounded-lg hover:bg-red-700 disabled:opacity-50 disabled:cursor-not-allowed", + "className": "btn btn-danger", "disabled": "{{_global.isDeletingPage || page?.data?.abilities?.can_delete !== true}}" }, "actions": [ @@ -174,7 +174,7 @@ "handler": "toast", "params": { "type": "error", - "message": "{{$error.message ?? '$t:sirsoft-page.admin.page.errors.delete_failed'}}" + "message": "{{error.message ?? '$t:sirsoft-page.admin.page.errors.delete_failed'}}" } } ] @@ -249,7 +249,7 @@ "type": "basic", "name": "Button", "props": { - "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", + "className": "btn btn-secondary", "disabled": "{{_global.isRestoringVersion}}" }, "actions": [ @@ -270,7 +270,7 @@ "type": "basic", "name": "Button", "props": { - "className": "flex-center gap-2 px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed", + "className": "btn btn-primary", "disabled": "{{_global.isRestoringVersion || page?.data?.abilities?.can_update !== true}}" }, "actions": [ @@ -335,7 +335,7 @@ "handler": "toast", "params": { "type": "error", - "message": "{{$error.message ?? '$t:sirsoft-page.admin.page.errors.restore_failed'}}" + "message": "{{error.message ?? '$t:sirsoft-page.admin.page.errors.restore_failed'}}" } } ] @@ -554,7 +554,7 @@ "name": "Button", "props": { "type": "button", - "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" + "className": "btn btn-secondary" }, "actions": [ { @@ -577,7 +577,7 @@ "props": { "type": "button", "disabled": "{{page?.data?.abilities?.can_update !== true}}", - "className": "inline-flex items-center gap-1.5 px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed" + "className": "btn btn-primary" }, "actions": [ { @@ -648,14 +648,7 @@ "type": "basic", "name": "Button", "props": { - "className": "flex-center gap-2 btn btn-secondary" - }, - "responsive": { - "mobile": { - "props": { - "className": "flex-center justify-center p-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 transition-colors" - } - } + "className": "btn btn-secondary" }, "actions": [ { @@ -691,14 +684,7 @@ "name": "Button", "props": { "disabled": "{{page?.data?.abilities?.can_update !== true}}", - "className": "flex-center gap-2 px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 font-medium transition-colors disabled:opacity-50 disabled:cursor-not-allowed" - }, - "responsive": { - "mobile": { - "props": { - "className": "flex-center justify-center p-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors disabled:opacity-50 disabled:cursor-not-allowed" - } - } + "className": "btn btn-primary" }, "actions": [ { @@ -734,14 +720,7 @@ "name": "Button", "props": { "disabled": "{{page?.data?.abilities?.can_delete !== true}}", - "className": "flex-center gap-2 px-4 py-2 bg-red-600 text-white rounded-lg hover:bg-red-700 font-medium transition-colors disabled:opacity-50 disabled:cursor-not-allowed" - }, - "responsive": { - "mobile": { - "props": { - "className": "flex-center justify-center p-2 bg-red-600 text-white rounded-lg hover:bg-red-700 transition-colors disabled:opacity-50 disabled:cursor-not-allowed" - } - } + "className": "btn btn-danger" }, "actions": [ { @@ -788,7 +767,7 @@ "name": "Div", "if": "{{page?.data}}", "props": { - "className": "flex-center gap-3 mb-4 px-3 py-2 bg-gray-50 dark:bg-gray-700/50 rounded-lg" + "className": "flex-center flex-wrap gap-3 mb-4 px-3 py-2 bg-gray-50 dark:bg-gray-700/50 rounded-lg" }, "children": [ { @@ -829,7 +808,7 @@ }, "props": { "type": "button", - "className": "{{(_local.lang ?? $locale) === loc ? 'px-3 py-1 text-xs font-medium text-white bg-blue-600 rounded' : 'px-3 py-1 text-xs font-medium text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-200 rounded'}}" + "className": "{{(_local.lang ?? $locale) === loc ? 'px-3 py-1 text-xs font-medium text-white bg-blue-600 dark:bg-blue-500 rounded' : 'px-3 py-1 text-xs font-medium text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-gray-200 rounded'}}" }, "actions": [ { @@ -857,6 +836,13 @@ "props": { "className": "text-hint ml-auto italic" }, + "responsive": { + "portable": { + "props": { + "className": "text-hint w-full italic" + } + } + }, "text": "$t:sirsoft-page.admin.page.detail.display_language_hint" } ] @@ -875,14 +861,14 @@ "type": "basic", "name": "Div", "props": { - "className": "grid-2col px-6 py-4 sm:grid-cols-4" + "className": "flex flex-col gap-3 pb-4" }, "children": [ { "type": "basic", "name": "Div", "props": { - "className": "flex-center flex-wrap gap-3 mb-3" + "className": "flex-center flex-wrap gap-3" }, "children": [ { @@ -934,7 +920,7 @@ "handler": "toast", "params": { "type": "error", - "message": "{{$error.message ?? '$t:sirsoft-page.admin.page.errors.publish_change_failed'}}" + "message": "{{error.message ?? '$t:sirsoft-page.admin.page.errors.publish_change_failed'}}" } } ] @@ -989,7 +975,7 @@ "handler": "toast", "params": { "type": "error", - "message": "{{$error.message ?? '$t:sirsoft-page.admin.page.errors.publish_change_failed'}}" + "message": "{{error.message ?? '$t:sirsoft-page.admin.page.errors.publish_change_failed'}}" } } ] @@ -1073,18 +1059,21 @@ "type": "basic", "name": "Div", "props": { - "className": "panel-header-row" + "className": "grid-2col-responsive pt-4 border-t border-gray-200 dark:border-gray-700" }, "children": [ { "type": "basic", "name": "Div", + "props": { + "className": "flex items-baseline gap-3" + }, "children": [ { "type": "basic", "name": "Span", "props": { - "className": "text-table-header" + "className": "text-table-header shrink-0 w-20" }, "text": "$t:sirsoft-page.admin.page.detail.info.creator" }, @@ -1092,7 +1081,7 @@ "type": "basic", "name": "P", "props": { - "className": "text-primary mt-1 text-sm" + "className": "text-primary text-sm" }, "text": "{{page?.data?.creator?.name ?? '-'}}" } @@ -1101,12 +1090,15 @@ { "type": "basic", "name": "Div", + "props": { + "className": "flex items-baseline gap-3" + }, "children": [ { "type": "basic", "name": "Span", "props": { - "className": "text-table-header" + "className": "text-table-header shrink-0 w-20" }, "text": "$t:sirsoft-page.admin.page.detail.info.published_at" }, @@ -1114,7 +1106,7 @@ "type": "basic", "name": "P", "props": { - "className": "text-primary mt-1 text-sm" + "className": "text-primary text-sm" }, "text": "{{page?.data?.published_at ?? '-'}}" } @@ -1123,12 +1115,15 @@ { "type": "basic", "name": "Div", + "props": { + "className": "flex items-baseline gap-3" + }, "children": [ { "type": "basic", "name": "Span", "props": { - "className": "text-table-header" + "className": "text-table-header shrink-0 w-20" }, "text": "$t:sirsoft-page.admin.page.detail.info.created_at" }, @@ -1136,7 +1131,7 @@ "type": "basic", "name": "P", "props": { - "className": "text-primary mt-1 text-sm" + "className": "text-primary text-sm" }, "text": "{{page?.data?.created_at ?? '-'}}" } @@ -1145,12 +1140,15 @@ { "type": "basic", "name": "Div", + "props": { + "className": "flex items-baseline gap-3" + }, "children": [ { "type": "basic", "name": "Span", "props": { - "className": "text-table-header" + "className": "text-table-header shrink-0 w-20" }, "text": "$t:sirsoft-page.admin.page.detail.info.updated_at" }, @@ -1158,7 +1156,7 @@ "type": "basic", "name": "P", "props": { - "className": "text-primary mt-1 text-sm" + "className": "text-primary text-sm" }, "text": "{{page?.data?.updated_at ?? '-'}}" } @@ -1182,7 +1180,7 @@ "type": "basic", "name": "Div", "props": { - "className": "px-6 panel-header flex-between cursor-pointer select-none" + "className": "flex-between cursor-pointer select-none" }, "actions": [ { @@ -1199,7 +1197,7 @@ "type": "basic", "name": "Span", "props": { - "className": "text-body font-medium" + "className": "card-title" }, "text": "$t:sirsoft-page.admin.page.detail.tabs.preview" }, @@ -1261,7 +1259,7 @@ "type": "basic", "name": "Div", "props": { - "className": "px-6 panel-header flex-between cursor-pointer" + "className": "flex-between cursor-pointer" }, "actions": [ { @@ -1269,54 +1267,34 @@ "handler": "setState", "params": { "target": "local", - "showAttachments": "{{!_local.showAttachments}}" + "showAttachments": "{{!(_local.showAttachments ?? true)}}" } } ], "children": [ { "type": "basic", - "name": "Div", + "name": "Span", "props": { - "className": "flex-center gap-2" + "className": "card-title" }, - "children": [ - { - "type": "basic", - "name": "Icon", - "props": { - "name": "paperclip", - "className": "text-gray-500 dark:text-gray-400" - } - }, - { - "type": "basic", - "name": "Span", - "props": { - "className": "text-primary text-sm font-semibold" - }, - "text": "$t:sirsoft-page.admin.page.detail.attachments|count={{(page?.data?.attachments ?? []).length}}" - } - ] + "text": "$t:sirsoft-page.admin.page.detail.attachments|count={{(page?.data?.attachments ?? []).length}}" }, { "type": "basic", "name": "Icon", "props": { - "name": "{{_local.showAttachments ? 'chevron-up' : 'chevron-down'}}", + "name": "{{(_local.showAttachments ?? true) ? 'chevron-up' : 'chevron-down'}}", "className": "text-gray-400 dark:text-gray-500" } } ] }, { - "id": "attachments_list", + "id": "attachments_list_{{att_idx}}", "type": "basic", "name": "Div", - "if": "{{_local.showAttachments}}", - "props": { - "className": "divide-y divide-gray-100 dark:divide-gray-700" - }, + "if": "{{_local.showAttachments ?? true}}", "iteration": { "source": "page?.data?.attachments ?? []", "item_var": "attachment_item", @@ -1324,13 +1302,22 @@ }, "children": [ { - "id": "attachment_card", + "id": "attachment_card_{{att_idx}}", "type": "basic", - "name": "A", + "name": "Div", "props": { - "href": "{{attachment_item?.download_url}}", - "className": "flex-center group gap-3 px-4 py-2.5 hover:bg-gray-50 dark:bg-gray-800 dark:hover:bg-gray-700/50 transition-colors cursor-pointer no-underline" + "className": "flex-center group gap-3 px-4 py-2.5 border-b border-gray-200 dark:border-gray-700 hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors cursor-pointer" }, + "actions": [ + { + "type": "click", + "handler": "downloadAttachment", + "params": { + "url": "{{attachment_item?.download_url}}", + "filename": "{{attachment_item?.original_filename}}" + } + } + ], "children": [ { "comment": "이미지 썸네일 (이미지 파일인 경우)", @@ -1400,7 +1387,7 @@ "type": "basic", "name": "Icon", "props": { - "name": "arrow-down-tray", + "name": "download", "className": "text-gray-400 dark:text-gray-500 group-hover:text-blue-500 dark:text-blue-400 dark:group-hover:text-blue-400 transition-colors" } } @@ -1424,14 +1411,14 @@ "type": "basic", "name": "Div", "props": { - "className": "px-6 panel-header" + "className": "pb-4" }, "children": [ { "type": "basic", "name": "Span", "props": { - "className": "text-body font-medium" + "className": "card-title" }, "text": "$t:sirsoft-page.admin.page.form.seo.title" } @@ -1532,14 +1519,14 @@ "type": "basic", "name": "Div", "props": { - "className": "px-6 panel-header" + "className": "pb-4" }, "children": [ { "type": "basic", "name": "Span", "props": { - "className": "text-body font-medium" + "className": "card-title" }, "text": "$t:sirsoft-page.admin.page.detail.tabs.versions" } @@ -1549,7 +1536,7 @@ "type": "basic", "name": "Div", "props": { - "className": "px-6 py-2 flex-center gap-2 text-info-soft bg-blue-50 dark:bg-blue-900/20" + "className": "mb-4 px-4 py-2.5 flex-center gap-2 rounded-md text-info-soft bg-blue-50 dark:bg-blue-900/20" }, "children": [ { @@ -1665,7 +1652,7 @@ "props": { "className": "text-sm text-gray-600 dark:text-gray-400" }, - "text": "{{row.changes_summary?.changed_fields?.join(', ') ?? '-'}}" + "text": "{{row.changes_summary?.changed_fields?.map(f => $t('sirsoft-page.admin.page.detail.versions.field_labels.' + f)).join(', ') ?? '-'}}" }, { "type": "basic", diff --git a/modules/_bundled/sirsoft-page/resources/layouts/admin/admin_page_form.json b/modules/_bundled/sirsoft-page/resources/layouts/admin/admin_page_form.json index d597c925..3731b629 100644 --- a/modules/_bundled/sirsoft-page/resources/layouts/admin/admin_page_form.json +++ b/modules/_bundled/sirsoft-page/resources/layouts/admin/admin_page_form.json @@ -44,16 +44,35 @@ ], "init_actions": [ { - "comment": "생성 모드에서 폼 기본값 초기화 (published는 Select fallback과 동기화)", + "comment": "생성 모드: 직전 페이지(수정)에서 같은 레이아웃을 재사용하므로 _local.form 잔존을 먼저 제거 (form=null → deep merge 가 객체 대신 null 로 덮어써 이전 id/title/attachments 완전 삭제)", + "if": "{{!route?.id}}", + "handler": "setState", + "params": { + "target": "local", + "form": null + } + }, + { + "comment": "생성 모드에서 폼 기본값 초기화 (published는 Select fallback과 동기화). 수정→등록 전환 시 이전 슬러그 검증 상태(slugChecked/slugAvailable 등)도 함께 리셋", "if": "{{!route?.id}}", "handler": "setState", "params": { "target": "local", "form": { "slug": "{{query.slug ?? ''}}", + "title": {}, + "content": null, "published": false, - "content_mode": "html" - } + "content_mode": "html", + "seo_meta": null, + "attachments": [] + }, + "slugChecked": false, + "slugAvailable": false, + "slugChecking": false, + "slugError": null, + "errors": null, + "hasChanges": false } }, { @@ -102,7 +121,7 @@ "name": "Div", "if": "{{_local.errors && Object.keys(_local.errors).length > 0}}", "props": { - "className": "alert-danger" + "className": "alert-danger mb-6" }, "children": [ { @@ -128,7 +147,7 @@ "type": "basic", "name": "H3", "props": { - "className": "text-sm font-mediumtext-danger-soft" + "className": "text-sm font-medium text-danger-soft" }, "text": "$t:sirsoft-page.admin.page.form.validation_error" }, @@ -406,7 +425,7 @@ "props": { "className": "form-hint block" }, - "text": "$t:sirsoft-page.admin.page.form.fields.slug_hint|slug={{_local.form?.slug ?? 'example'}}" + "text": "$t:sirsoft-page.admin.page.form.fields.slug_hint|slug={{_local.form?.slug || 'example'}}" }, { "type": "basic", @@ -693,7 +712,7 @@ "maxFiles": 5, "maxSize": 10, "accept": ".jpg,.jpeg,.png,.gif,.webp,.pdf,.zip", - "initialFiles": "{{pageData?.data?.attachments ?? []}}", + "initialFiles": "{{_local.form?.attachments ?? []}}", "autoUpload": false, "uploadTriggerEvent": "upload:page_attachments", "disabled": "{{_computed.isReadOnly}}", @@ -707,9 +726,47 @@ "apiEndpoints": { "upload": "/api/modules/sirsoft-page/admin/attachments", "delete": "/api/modules/sirsoft-page/admin/attachments/:id", - "reorder": "/api/modules/sirsoft-page/admin/attachments/reorder" + "reorder": "{{route?.id ? '/api/modules/sirsoft-page/admin/attachments/reorder' : ''}}" } - } + }, + "actions": [ + { + "comment": "업로드 완료 시 form.attachments 에 누적 (수정 모드만 - 생성 모드는 저장 시 temp_key 로 연결)", + "event": "onUploadComplete", + "handler": "setState", + "params": { + "target": "local", + "form.attachments": "{{route?.id ? [...(_local.form?.attachments ?? []), ...($args[0] ?? [])] : (_local.form?.attachments ?? [])}}" + } + }, + { + "comment": "드래그 순서 변경 시 form.attachments 를 최종 순서로 덮어쓰기 (이커머스 상품 이미지와 동일 패턴)", + "event": "onReorder", + "handler": "setState", + "params": { + "target": "local", + "form.attachments": "{{$args[0] ?? []}}" + } + }, + { + "comment": "첨부 삭제 시 form.attachments 에서 제거", + "event": "onRemove", + "handler": "setState", + "params": { + "target": "local", + "form.attachments": "{{(_local.form?.attachments ?? []).filter(item => (item.hash || item.id) !== $args[0])}}" + } + }, + { + "comment": "업로드 검증 실패(용량/확장자/개수 초과 등) 시 사용자에게 toast 안내", + "event": "onUploadError", + "handler": "toast", + "params": { + "type": "error", + "message": "{{$args[0]}}" + } + } + ] } ] }, @@ -904,7 +961,10 @@ "actions": [ { "type": "click", - "handler": "navigateBack" + "handler": "navigate", + "params": { + "path": "{{route?.id ? '/admin/pages/' + route.id : '/admin/pages'}}" + } } ], "children": [ @@ -923,7 +983,7 @@ "props": { "type": "button", "disabled": "{{_local.saving}}", - "className": "{{_local.saving ? 'px-4 py-2 bg-blue-400 text-white rounded-lg font-medium cursor-not-allowed' : 'px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 font-medium transition-colors'}}" + "className": "btn btn-primary flex-center gap-1.5 disabled:opacity-50 disabled:cursor-not-allowed" }, "actions": [ { @@ -966,7 +1026,7 @@ } }, { - "comment": "FileUploader 업로드 트리거", + "comment": "FileUploader 업로드 트리거 (대기 중인 첨부를 temp_key 로 업로드 → 저장 시 백엔드가 연결)", "handler": "emitEvent", "params": { "event": "upload:page_attachments" @@ -1026,6 +1086,15 @@ } ], "children": [ + { + "type": "basic", + "name": "Icon", + "if": "{{_local.saving}}", + "props": { + "name": "spinner", + "className": "spinner-sm" + } + }, { "type": "basic", "name": "Span", diff --git a/modules/_bundled/sirsoft-page/resources/layouts/admin/admin_page_list.json b/modules/_bundled/sirsoft-page/resources/layouts/admin/admin_page_list.json index caf5aa8f..33dc05d0 100644 --- a/modules/_bundled/sirsoft-page/resources/layouts/admin/admin_page_list.json +++ b/modules/_bundled/sirsoft-page/resources/layouts/admin/admin_page_list.json @@ -121,7 +121,7 @@ "name": "Icon", "props": { "name": "refresh", - "className": "w-5 h-5" + "size": "sm" } } ] @@ -131,7 +131,7 @@ "type": "basic", "name": "Button", "props": { - "className": "flex-center gap-2 px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 font-medium transition-colors disabled:opacity-50 disabled:cursor-not-allowed", + "className": "btn btn-primary", "disabled": "{{pages?.data?.abilities?.can_create !== true}}" }, "actions": [ @@ -149,7 +149,7 @@ "name": "Icon", "props": { "name": "plus", - "className": "w-5 h-5" + "size": "sm" } }, { @@ -250,7 +250,7 @@ "type": "basic", "name": "Button", "props": { - "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" + "className": "btn btn-primary" }, "actions": [ { @@ -323,7 +323,6 @@ "type": "change", "handler": "setState", "params": { - "target": "global", "searchField": "{{$event.target.value}}" } } @@ -344,7 +343,6 @@ "type": "change", "handler": "setState", "params": { - "target": "global", "searchQuery": "{{$event.target.value}}" } }, @@ -373,7 +371,7 @@ "type": "basic", "name": "Button", "props": { - "className": "w-full px-4 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" + "className": "btn btn-primary w-full" }, "actions": [ { @@ -442,7 +440,7 @@ "name": "Select", "props": { "value": "{{query.published ?? ''}}", - "className": "px-3 py-2 bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg text-gray-700 dark:text-gray-200 text-sm focus:ring-2 focus:ring-blue-500 dark:focus:ring-blue-400", + "className": "w-32 px-3 py-2 bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg text-sm", "options": [ { "label": "$t:sirsoft-page.admin.page.published_filter.all", @@ -480,7 +478,7 @@ "name": "Select", "props": { "value": "{{query.sort_by ? (query.sort_by + '_' + (query.sort_order || 'desc')) : 'created_at_desc'}}", - "className": "px-3 py-2 bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg text-gray-700 dark:text-gray-200 text-sm focus:ring-2 focus:ring-blue-500 dark:focus:ring-blue-400", + "className": "w-32 px-3 py-2 bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg text-sm", "options": [ { "label": "$t:sirsoft-page.admin.page.sort.created_at_desc", @@ -523,7 +521,7 @@ "name": "Select", "props": { "value": "{{query.per_page || '20'}}", - "className": "px-3 py-2 bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg text-gray-700 dark:text-gray-200 text-sm focus:ring-2 focus:ring-blue-500 dark:focus:ring-blue-400", + "className": "w-20 px-3 py-2 bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg text-sm", "options": [ { "label": "$t:sirsoft-page.admin.page.per_page|count=10", @@ -902,7 +900,7 @@ "name": "Button", "props": { "type": "button", - "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", + "className": "btn btn-secondary", "disabled": "{{_global.isBulkPublishing}}" }, "actions": [ @@ -924,7 +922,7 @@ "name": "Button", "props": { "type": "button", - "className": "flex-center gap-2 px-4 py-2 bg-green-600 text-white rounded-lg hover:bg-green-700 disabled:opacity-50 disabled:cursor-not-allowed", + "className": "btn btn-primary", "disabled": "{{_global.isBulkPublishing}}" }, "actions": [ @@ -1063,7 +1061,7 @@ "name": "Button", "props": { "type": "button", - "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", + "className": "btn btn-secondary", "disabled": "{{_global.isBulkPublishing}}" }, "actions": [ @@ -1085,7 +1083,7 @@ "name": "Button", "props": { "type": "button", - "className": "flex-center gap-2 px-4 py-2 bg-gray-600 text-white rounded-lg hover:bg-gray-700 disabled:opacity-50 disabled:cursor-not-allowed", + "className": "btn btn-primary", "disabled": "{{_global.isBulkPublishing}}" }, "actions": [ @@ -1223,7 +1221,7 @@ "type": "basic", "name": "Button", "props": { - "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", + "className": "btn btn-secondary", "disabled": "{{_global.isDeletingPage}}" }, "actions": [ @@ -1244,7 +1242,7 @@ "type": "basic", "name": "Button", "props": { - "className": "flex-center gap-2 px-4 py-2 bg-red-600 text-white rounded-lg hover:bg-red-700 disabled:opacity-50 disabled:cursor-not-allowed", + "className": "btn btn-danger", "disabled": "{{_global.isDeletingPage}}" }, "actions": [ diff --git a/modules/_bundled/sirsoft-page/src/Console/Commands/PlaywrightSeedPage.php b/modules/_bundled/sirsoft-page/src/Console/Commands/PlaywrightSeedPage.php new file mode 100644 index 00000000..ccebf538 --- /dev/null +++ b/modules/_bundled/sirsoft-page/src/Console/Commands/PlaywrightSeedPage.php @@ -0,0 +1,139 @@ +error('CLI 전용 커맨드입니다.'); + + return self::FAILURE; + } + + // ② 명시 옵트인 + if (env('G7_PLAYWRIGHT_BYPASS') !== '1') { + $this->error('G7_PLAYWRIGHT_BYPASS=1 환경변수가 필요합니다.'); + + return self::FAILURE; + } + + // ③ APP_DEBUG 강제 — SettingsServiceProvider 의 bypass 분기가 settings JSON 덮어쓰기 차단 상태 + Config::set('app.debug', true); + + $attachmentsPerPage = max(1, (int) $this->option('attachments')); + + $result = DB::transaction(function () use ($attachmentsPerPage) { + // 재실행 멱등: 고정 슬러그 페이지 물리 삭제 (첨부는 FK 로 함께 정리) + Page::whereIn('slug', [self::UNPUBLISHED_SLUG, self::PUBLISHED_SLUG])->get() + ->each(function (Page $page) { + PageAttachment::where('page_id', $page->id)->delete(); + $page->delete(); + }); + + $author = User::factory()->create(); + + $unpublished = Page::factory()->create([ + 'slug' => self::UNPUBLISHED_SLUG, + 'title' => ['ko' => '미발행 미리보기 대상', 'en' => 'Unpublished Preview Target'], + 'content' => ['ko' => '

미발행 본문

', 'en' => '

Unpublished body

'], + 'published' => false, + 'published_at' => null, + 'created_by' => $author->id, + 'updated_by' => $author->id, + ]); + + $published = Page::factory()->published()->create([ + 'slug' => self::PUBLISHED_SLUG, + 'title' => ['ko' => '발행 대조군', 'en' => 'Published Control'], + 'content' => ['ko' => '

발행 본문

', 'en' => '

Published body

'], + 'created_by' => $author->id, + 'updated_by' => $author->id, + ]); + + $attachmentIds = []; + foreach ([$unpublished, $published] as $page) { + for ($i = 1; $i <= $attachmentsPerPage; $i++) { + // 첫 첨부는 이미지(미리보기 URL 생성 대상), 나머지는 일반 파일 + $factory = PageAttachment::factory(); + $factory = $i === 1 ? $factory->image() : $factory; + + $attachment = $factory->create([ + 'page_id' => $page->id, + 'order' => $i, + 'created_by' => $author->id, + ]); + $attachmentIds[] = $attachment->id; + } + } + + return [ + 'unpublished_slug' => self::UNPUBLISHED_SLUG, + 'published_slug' => self::PUBLISHED_SLUG, + 'unpublished_id' => $unpublished->id, + 'published_id' => $published->id, + 'attachment_ids' => $attachmentIds, + ]; + }); + + if ($this->option('json')) { + $this->line(json_encode($result, JSON_UNESCAPED_UNICODE)); + } else { + $this->info('페이지 시드 완료: 미발행='.self::UNPUBLISHED_SLUG.' / 발행='.self::PUBLISHED_SLUG); + } + + return self::SUCCESS; + } +} diff --git a/modules/_bundled/sirsoft-page/src/Http/Controllers/Admin/PageAttachmentController.php b/modules/_bundled/sirsoft-page/src/Http/Controllers/Admin/PageAttachmentController.php index ec7602d4..472a177d 100644 --- a/modules/_bundled/sirsoft-page/src/Http/Controllers/Admin/PageAttachmentController.php +++ b/modules/_bundled/sirsoft-page/src/Http/Controllers/Admin/PageAttachmentController.php @@ -3,17 +3,18 @@ namespace Modules\Sirsoft\Page\Http\Controllers\Admin; use App\Http\Controllers\Api\Base\AdminBaseController; +use Illuminate\Database\Eloquent\ModelNotFoundException; use Illuminate\Http\JsonResponse; use Modules\Sirsoft\Page\Http\Requests\ReorderPageAttachmentsRequest; use Modules\Sirsoft\Page\Http\Requests\UploadPageAttachmentRequest; use Modules\Sirsoft\Page\Http\Resources\PageAttachmentResource; use Modules\Sirsoft\Page\Services\PageAttachmentService; -use Symfony\Component\HttpFoundation\StreamedResponse; /** * 관리자 페이지 첨부파일 컨트롤러 * - * 페이지 첨부파일 업로드/삭제/다운로드/순서변경을 처리합니다. + * 페이지 첨부파일 업로드/삭제/순서변경을 처리합니다. + * 파일 서빙(다운로드/미리보기)은 공개 hash 라우트(PublicPageAttachmentController)로 단일화됨. */ class PageAttachmentController extends AdminBaseController { @@ -71,7 +72,7 @@ class PageAttachmentController extends AdminBaseController } return $this->success('sirsoft-page::messages.attachment.delete_success'); - } catch (\Illuminate\Database\Eloquent\ModelNotFoundException $e) { + } catch (ModelNotFoundException $e) { return $this->notFound('sirsoft-page::messages.attachment.not_found'); } catch (\Exception $e) { return $this->error('sirsoft-page::messages.attachment.delete_failed', 500, $e->getMessage()); @@ -99,40 +100,4 @@ class PageAttachmentController extends AdminBaseController return $this->error('sirsoft-page::messages.attachment.reorder_failed', 500, $e->getMessage()); } } - - /** - * 첨부파일을 다운로드합니다 (해시 기반). - * - * @param string $hash 첨부파일 해시 (12자) - * @return StreamedResponse|JsonResponse 파일 스트리밍 응답 또는 오류 - */ - public function download(string $hash): StreamedResponse|JsonResponse - { - $attachment = $this->attachmentService->getByHash($hash); - if (! $attachment) { - return $this->notFound('sirsoft-page::messages.attachment.not_found'); - } - - $response = $this->attachmentService->download($attachment); - - return $response ?: $this->error('sirsoft-page::messages.attachment.file_not_found', 404); - } - - /** - * 이미지 첨부파일을 미리봅니다 (해시 기반, inline). - * - * @param string $hash 첨부파일 해시 (12자) - * @return StreamedResponse|JsonResponse 파일 스트리밍 응답 또는 오류 - */ - public function preview(string $hash): StreamedResponse|JsonResponse - { - $attachment = $this->attachmentService->getByHash($hash); - if (! $attachment) { - return $this->notFound('sirsoft-page::messages.attachment.not_found'); - } - - $response = $this->attachmentService->preview($attachment); - - return $response ?: $this->error('sirsoft-page::messages.attachment.file_not_found', 404); - } } diff --git a/modules/_bundled/sirsoft-page/src/Http/Controllers/Admin/PageController.php b/modules/_bundled/sirsoft-page/src/Http/Controllers/Admin/PageController.php index ead898eb..27cfbb68 100644 --- a/modules/_bundled/sirsoft-page/src/Http/Controllers/Admin/PageController.php +++ b/modules/_bundled/sirsoft-page/src/Http/Controllers/Admin/PageController.php @@ -44,7 +44,7 @@ class PageController extends AdminBaseController { try { $validated = $request->validated(); - $perPage = $validated['per_page'] ?? 15; + $perPage = $validated['per_page'] ?? 20; $pages = $this->pageService->getPages( array_filter($validated, fn ($v) => $v !== null), $perPage @@ -212,9 +212,12 @@ class PageController extends AdminBaseController $validated = $request->validated(); $count = $this->pageService->bulkChangePublishStatus($validated['ids'], $validated['published']); - return $this->success('sirsoft-page::messages.page.bulk_publish_success', [ - 'count' => $count, - ]); + return $this->success( + 'sirsoft-page::messages.page.bulk_publish_success', + ['count' => $count], + 200, + ['count' => $count], + ); } catch (\Exception $e) { return $this->error('sirsoft-page::messages.page.bulk_publish_failed', 500, $e->getMessage()); } diff --git a/modules/_bundled/sirsoft-page/src/Http/Controllers/User/PublicPageAttachmentController.php b/modules/_bundled/sirsoft-page/src/Http/Controllers/User/PublicPageAttachmentController.php index 86bd6c47..15970557 100644 --- a/modules/_bundled/sirsoft-page/src/Http/Controllers/User/PublicPageAttachmentController.php +++ b/modules/_bundled/sirsoft-page/src/Http/Controllers/User/PublicPageAttachmentController.php @@ -2,15 +2,20 @@ namespace Modules\Sirsoft\Page\Http\Controllers\User; +use App\Enums\PermissionType; use App\Http\Controllers\Api\Base\PublicBaseController; use Illuminate\Http\JsonResponse; +use Illuminate\Http\Request; use Modules\Sirsoft\Page\Services\PageAttachmentService; use Symfony\Component\HttpFoundation\StreamedResponse; /** * 공개 페이지 첨부파일 컨트롤러 * - * 발행된 페이지의 첨부파일 다운로드를 처리합니다. + * 첨부파일 서빙(다운로드/미리보기)을 처리합니다. 썸네일 ·다운로드는 브라우저 직접 + * GET 이라 토큰을 실을 수 없으므로 공개 hash 라우트로 단일화합니다. + * - 미리보기(썸네일): 공개 서빙 (미발행 콘텐츠도 hash 보유 시 조회 가능 — 트레이드오프 수용) + * - 다운로드: 발행 첨부는 누구나, 미발행 첨부는 pages.read 관리자만 (파일 보호) */ class PublicPageAttachmentController extends PublicBaseController { @@ -21,20 +26,29 @@ class PublicPageAttachmentController extends PublicBaseController /** * 첨부파일을 다운로드합니다 (해시 기반). * - * 발행된 페이지의 첨부파일만 다운로드 가능합니다. + * 발행된 페이지의 첨부는 누구나, 미발행 페이지의 첨부는 페이지 조회 권한 + * (sirsoft-page.pages.read) 관리자만 다운로드할 수 있습니다. * + * @param Request $request HTTP 요청 객체 (다운로드 권한 판정용) * @param string $hash 첨부파일 해시 (12자) * @return StreamedResponse|JsonResponse 파일 스트리밍 응답 또는 오류 */ - public function download(string $hash): StreamedResponse|JsonResponse + // audit:allow controller-base-request-injection reason: GET 파일 서빙. 인증 사용자만 read-only 참조($request->user())해 미발행 첨부 다운로드 권한을 판정. 검증할 body 없음(hash 는 라우트 파라미터) + public function download(Request $request, string $hash): StreamedResponse|JsonResponse { $attachment = $this->attachmentService->getByHash($hash); if (! $attachment) { return $this->notFound('sirsoft-page::messages.attachment.not_found'); } - // 발행된 페이지의 첨부파일만 다운로드 가능 - if (! $attachment->page || ! $attachment->page->published) { + // 미발행 페이지의 첨부는 페이지 조회 권한 관리자만 다운로드 가능 + $published = $attachment->page && $attachment->page->published; + $canReadUnpublished = $request->user()?->hasPermission( + 'sirsoft-page.pages.read', + PermissionType::Admin + ) ?? false; + + if (! $published && ! $canReadUnpublished) { return $this->notFound('sirsoft-page::messages.attachment.not_found'); } @@ -46,7 +60,9 @@ class PublicPageAttachmentController extends PublicBaseController /** * 이미지 첨부파일을 미리봅니다 (해시 기반, inline). * - * 발행된 페이지의 이미지 첨부파일만 미리보기 가능합니다. + * 썸네일 는 토큰을 실을 수 없으므로 발행/미발행 무관 공개 서빙합니다. + * 미발행 콘텐츠의 썸네일은 hash 를 보유해야만 조회 가능하며(비추측성), 파일 + * 다운로드는 download() 의 권한 게이트로 보호됩니다. * * @param string $hash 첨부파일 해시 (12자) * @return StreamedResponse|JsonResponse 파일 스트리밍 응답 또는 오류 @@ -58,11 +74,6 @@ class PublicPageAttachmentController extends PublicBaseController return $this->notFound('sirsoft-page::messages.attachment.not_found'); } - // 발행된 페이지의 첨부파일만 미리보기 가능 - if (! $attachment->page || ! $attachment->page->published) { - return $this->notFound('sirsoft-page::messages.attachment.not_found'); - } - $response = $this->attachmentService->preview($attachment); return $response ?: $this->error('sirsoft-page::messages.attachment.file_not_found', 404); diff --git a/modules/_bundled/sirsoft-page/src/Http/Controllers/User/PublicPageController.php b/modules/_bundled/sirsoft-page/src/Http/Controllers/User/PublicPageController.php index 14cdd91d..0eea990e 100644 --- a/modules/_bundled/sirsoft-page/src/Http/Controllers/User/PublicPageController.php +++ b/modules/_bundled/sirsoft-page/src/Http/Controllers/User/PublicPageController.php @@ -2,8 +2,10 @@ namespace Modules\Sirsoft\Page\Http\Controllers\User; +use App\Enums\PermissionType; use App\Http\Controllers\Api\Base\PublicBaseController; use Illuminate\Http\JsonResponse; +use Illuminate\Http\Request; use Modules\Sirsoft\Page\Http\Resources\PublicPageResource; use Modules\Sirsoft\Page\Services\PageService; @@ -29,13 +31,22 @@ class PublicPageController extends PublicBaseController /** * 슬러그로 발행된 페이지를 조회합니다. * + * 페이지 조회 권한(sirsoft-page.pages.read)을 가진 관리자는 미발행 페이지도 + * 사용자 화면에서 미리볼 수 있습니다(비로그인·일반 회원은 미발행 시 404 유지). + * + * @param Request $request HTTP 요청 * @param string $slug 페이지 슬러그 * @return JsonResponse 페이지 상세 응답 */ - public function show(string $slug): JsonResponse + // audit:allow controller-base-request-injection reason: GET 상세 조회. 인증 사용자만 read-only 참조($request->user())해 미리보기 권한 판정. 검증할 body 없음(slug 는 라우트 파라미터) + public function show(Request $request, string $slug): JsonResponse { try { - $page = $this->pageService->getPublishedPageBySlug($slug); + $user = $request->user(); + $canPreview = $user + && $user->hasPermission('sirsoft-page.pages.read', PermissionType::Admin); + + $page = $this->pageService->getPublishedPageBySlug($slug, $canPreview); if (! $page) { return $this->notFound('sirsoft-page::messages.page.not_found'); @@ -43,9 +54,11 @@ class PublicPageController extends PublicBaseController $page->load('attachments'); + $isPreview = $canPreview && ! $page->published; + return $this->successWithResource( 'sirsoft-page::messages.page.fetch_success', - new PublicPageResource($page) + (new PublicPageResource($page))->withPreview($isPreview) ); } catch (\Exception $e) { return $this->error('sirsoft-page::messages.page.fetch_failed', 500, $e->getMessage()); diff --git a/modules/_bundled/sirsoft-page/src/Http/Requests/PageListRequest.php b/modules/_bundled/sirsoft-page/src/Http/Requests/PageListRequest.php index 11375e40..b8fac237 100644 --- a/modules/_bundled/sirsoft-page/src/Http/Requests/PageListRequest.php +++ b/modules/_bundled/sirsoft-page/src/Http/Requests/PageListRequest.php @@ -11,6 +11,8 @@ class PageListRequest extends FormRequest { /** * 권한 체크는 라우트의 permission 미들웨어에서 수행됩니다. + * + * @return bool 항상 true (실제 인가는 미들웨어 담당) */ public function authorize(): bool { @@ -26,11 +28,13 @@ class PageListRequest extends FormRequest { return [ 'published' => ['nullable', 'boolean'], - 'search' => ['nullable', 'string', 'max:255'], + // 공백 없는 긴 한글(약 140자+)은 FULLTEXT phrase 토큰 한도를 초과해 + // 'Too many words in a FTS phrase'(191) → 500 을 유발하므로 100자로 제한한다. + 'search' => ['nullable', 'string', 'max:100'], 'search_field' => ['nullable', 'string', 'in:all,title,slug'], 'filters' => ['nullable', 'array'], 'filters.*.field' => ['nullable', 'string', 'in:all,title,slug'], - 'filters.*.value' => ['nullable', 'string', 'max:255'], + 'filters.*.value' => ['nullable', 'string', 'max:100'], 'filters.*.operator' => ['nullable', 'string', 'in:like,eq,starts_with,ends_with'], 'per_page' => ['nullable', 'integer', 'min:1', 'max:100'], 'page' => ['nullable', 'integer', 'min:1'], @@ -57,4 +61,20 @@ class PageListRequest extends FormRequest 'sort_order.in' => __('sirsoft-page::validation.sort_order.in'), ]; } + + /** + * 검증 오류에 사용할 사용자 친화적 필드명 + * + * 레이아웃은 검색어를 filters[0][value] 로 전송하므로, 내부 필드명이 그대로 + * 노출되지 않도록 '검색어' 로 매핑한다. (search 파라미터 경로도 동일하게 통일) + * + * @return array + */ + public function attributes(): array + { + return [ + 'search' => __('sirsoft-page::validation.attributes.search'), + 'filters.*.value' => __('sirsoft-page::validation.attributes.search'), + ]; + } } diff --git a/modules/_bundled/sirsoft-page/src/Http/Requests/StorePageRequest.php b/modules/_bundled/sirsoft-page/src/Http/Requests/StorePageRequest.php index 44c0a519..1970479f 100644 --- a/modules/_bundled/sirsoft-page/src/Http/Requests/StorePageRequest.php +++ b/modules/_bundled/sirsoft-page/src/Http/Requests/StorePageRequest.php @@ -15,6 +15,8 @@ class StorePageRequest extends FormRequest { /** * 권한 체크는 라우트의 permission 미들웨어에서 수행됩니다. + * + * @return bool 항상 true (권한은 미들웨어 체인에서 검증) */ public function authorize(): bool { diff --git a/modules/_bundled/sirsoft-page/src/Http/Requests/UpdatePageRequest.php b/modules/_bundled/sirsoft-page/src/Http/Requests/UpdatePageRequest.php index d5254cf8..48ee14eb 100644 --- a/modules/_bundled/sirsoft-page/src/Http/Requests/UpdatePageRequest.php +++ b/modules/_bundled/sirsoft-page/src/Http/Requests/UpdatePageRequest.php @@ -15,6 +15,8 @@ class UpdatePageRequest extends FormRequest { /** * 권한 체크는 라우트의 permission 미들웨어에서 수행됩니다. + * + * @return bool 항상 true (권한은 미들웨어 체인에서 검증) */ public function authorize(): bool { diff --git a/modules/_bundled/sirsoft-page/src/Http/Resources/PageAttachmentResource.php b/modules/_bundled/sirsoft-page/src/Http/Resources/PageAttachmentResource.php index 0fa10807..69005827 100644 --- a/modules/_bundled/sirsoft-page/src/Http/Resources/PageAttachmentResource.php +++ b/modules/_bundled/sirsoft-page/src/Http/Resources/PageAttachmentResource.php @@ -4,12 +4,27 @@ namespace Modules\Sirsoft\Page\Http\Resources; use App\Http\Resources\BaseApiResource; use Illuminate\Http\Request; +use Illuminate\Support\Collection; +use Modules\Sirsoft\Page\Models\PageAttachment; /** * 페이지 첨부파일 API 리소스 */ class PageAttachmentResource extends BaseApiResource { + /** + * 첨부파일 목록을 리소스 배열로 변환합니다. + * + * @param iterable|null $attachments 첨부파일 목록 + * @return array + */ + public static function collectionFor($attachments): array + { + return Collection::make($attachments ?? []) + ->map(fn ($attachment) => new self($attachment)) + ->all(); + } + /** * 리소스를 배열로 변환합니다. * @@ -27,8 +42,8 @@ class PageAttachmentResource extends BaseApiResource 'collection' => $this->collection, 'order' => $this->order, 'is_image' => $this->isImage(), - 'download_url' => $this->download_url, - 'preview_url' => $this->preview_url, + 'download_url' => $this->resource->downloadUrl(), + 'preview_url' => $this->resource->previewUrl(), 'created_at' => $this->created_at ? $this->formatDateTimeStringForUser($this->created_at) : null, diff --git a/modules/_bundled/sirsoft-page/src/Http/Resources/PageResource.php b/modules/_bundled/sirsoft-page/src/Http/Resources/PageResource.php index 12f92b0a..fa24f200 100644 --- a/modules/_bundled/sirsoft-page/src/Http/Resources/PageResource.php +++ b/modules/_bundled/sirsoft-page/src/Http/Resources/PageResource.php @@ -38,7 +38,10 @@ class PageResource extends BaseApiResource 'uuid' => $this->updater->uuid, 'name' => $this->updater->name, ]), - 'attachments' => PageAttachmentResource::collection($this->whenLoaded('attachments')), + 'attachments' => $this->whenLoaded( + 'attachments', + fn () => PageAttachmentResource::collectionFor($this->attachments) + ), ...$this->formatTimestamps(), ...$this->resourceMeta($request), ]; diff --git a/modules/_bundled/sirsoft-page/src/Http/Resources/PublicPageResource.php b/modules/_bundled/sirsoft-page/src/Http/Resources/PublicPageResource.php index 69c6433f..d6320dad 100644 --- a/modules/_bundled/sirsoft-page/src/Http/Resources/PublicPageResource.php +++ b/modules/_bundled/sirsoft-page/src/Http/Resources/PublicPageResource.php @@ -13,6 +13,27 @@ use Illuminate\Http\Request; */ class PublicPageResource extends BaseApiResource { + /** + * 미발행 페이지 관리자 미리보기 여부. + * + * true 이면 첨부 URL을 발행 가드가 없는 'admin' 컨텍스트로 생성하여 + * 관리자가 미발행 페이지의 첨부까지 미리볼 수 있도록 합니다. + */ + protected bool $preview = false; + + /** + * 미리보기(미발행 관리자 조회) 여부를 설정합니다. + * + * @param bool $preview 미리보기 여부 + * @return $this + */ + public function withPreview(bool $preview): self + { + $this->preview = $preview; + + return $this; + } + /** * 리소스를 배열로 변환합니다. * @@ -32,12 +53,16 @@ class PublicPageResource extends BaseApiResource ? ($this->content[$locale] ?? $this->content[$fallback] ?? (! empty($this->content) ? array_values($this->content)[0] : '')) : (string) ($this->content ?? ''), 'content_mode' => $this->content_mode ?? 'html', + 'is_preview' => $this->preview, 'published_at' => $this->published_at ? $this->formatDateTimeStringForUser($this->published_at) : null, 'seo_meta' => $this->seo_meta, 'current_version' => $this->current_version, - 'attachments' => PageAttachmentResource::collection($this->whenLoaded('attachments')), + 'attachments' => $this->whenLoaded( + 'attachments', + fn () => PageAttachmentResource::collectionFor($this->attachments) + ), 'created_at' => $this->created_at ? $this->formatDateTimeStringForUser($this->created_at) : null, diff --git a/modules/_bundled/sirsoft-page/src/Listeners/SeoPageCacheListener.php b/modules/_bundled/sirsoft-page/src/Listeners/SeoPageCacheListener.php index 2747c8f5..41d4d060 100644 --- a/modules/_bundled/sirsoft-page/src/Listeners/SeoPageCacheListener.php +++ b/modules/_bundled/sirsoft-page/src/Listeners/SeoPageCacheListener.php @@ -35,6 +35,11 @@ class SeoPageCacheListener implements HookListenerInterface 'method' => 'onPageChange', 'priority' => 20, ], + // 버전 복원도 콘텐츠(title/content/seo_meta) 변경이므로 수정과 동일하게 무효화 + 'sirsoft-page.page.after_restore' => [ + 'method' => 'onPageChange', + 'priority' => 20, + ], ]; } @@ -62,9 +67,9 @@ class SeoPageCacheListener implements HookListenerInterface try { $cache = app(SeoCacheManagerInterface::class); - // 페이지 상세 URL 캐시 무효화 + // 페이지 상세 URL 캐시 무효화 (공개 URL은 단수형 /page/{slug}) if ($page && isset($page->slug)) { - $cache->invalidateByUrl("*/pages/{$page->slug}"); + $cache->invalidateByUrl("*/page/{$page->slug}"); } // 페이지 상세 레이아웃 캐시 무효화 diff --git a/modules/_bundled/sirsoft-page/src/Models/Page.php b/modules/_bundled/sirsoft-page/src/Models/Page.php index 863f39de..f00a4d5b 100644 --- a/modules/_bundled/sirsoft-page/src/Models/Page.php +++ b/modules/_bundled/sirsoft-page/src/Models/Page.php @@ -11,7 +11,6 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\HasMany; -use Illuminate\Database\Eloquent\SoftDeletes; use Laravel\Scout\Searchable; use Modules\Sirsoft\Page\Database\Factories\PageFactory; @@ -19,7 +18,6 @@ class Page extends Model implements FulltextSearchable { use HasFactory; use Searchable; - use SoftDeletes; /** @var array 활동 로그 추적 필드 */ public static array $activityLogFields = [ diff --git a/modules/_bundled/sirsoft-page/src/Models/PageAttachment.php b/modules/_bundled/sirsoft-page/src/Models/PageAttachment.php index 46ae7632..7f7cb1b7 100644 --- a/modules/_bundled/sirsoft-page/src/Models/PageAttachment.php +++ b/modules/_bundled/sirsoft-page/src/Models/PageAttachment.php @@ -6,13 +6,11 @@ use App\Models\User; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsTo; -use Illuminate\Database\Eloquent\SoftDeletes; use Modules\Sirsoft\Page\Database\Factories\PageAttachmentFactory; class PageAttachment extends Model { use HasFactory; - use SoftDeletes; /** * 팩토리 클래스를 반환합니다. @@ -124,21 +122,45 @@ class PageAttachment extends Model } /** - * 다운로드 URL을 반환합니다. + * 다운로드 URL을 반환합니다 (공개 hash 라우트). * * @return string 다운로드 URL */ public function getDownloadUrlAttribute(): string { - return '/api/modules/sirsoft-page/pages/attachment/'.$this->hash; + return $this->downloadUrl(); } /** - * 이미지 미리보기 URL을 반환합니다. + * 이미지 미리보기 URL을 반환합니다 (공개 hash 라우트). * * @return string|null 미리보기 URL (이미지가 아니면 null) */ public function getPreviewUrlAttribute(): ?string + { + return $this->previewUrl(); + } + + /** + * 다운로드 URL을 반환합니다. + * + * 썸네일 ·다운로드는 브라우저 직접 GET 이라 토큰을 실을 수 없으므로, + * 게시판·이커머스 표준과 동일하게 공개 hash 라우트로 단일화한다. + * 미발행 콘텐츠 다운로드 차단은 공개 라우트 내부의 권한 게이트가 담당한다. + * + * @return string 다운로드 URL + */ + public function downloadUrl(): string + { + return '/api/modules/sirsoft-page/pages/attachment/'.$this->hash; + } + + /** + * 이미지 미리보기 URL을 반환합니다 (공개 hash 라우트). + * + * @return string|null 미리보기 URL (이미지가 아니면 null) + */ + public function previewUrl(): ?string { if (! $this->isImage()) { return null; diff --git a/modules/_bundled/sirsoft-page/src/Providers/PageServiceProvider.php b/modules/_bundled/sirsoft-page/src/Providers/PageServiceProvider.php index 29252e18..b50de7e5 100644 --- a/modules/_bundled/sirsoft-page/src/Providers/PageServiceProvider.php +++ b/modules/_bundled/sirsoft-page/src/Providers/PageServiceProvider.php @@ -3,12 +3,15 @@ namespace Modules\Sirsoft\Page\Providers; use App\Extension\BaseModuleServiceProvider; +use App\Seo\SitemapGenerator; +use Modules\Sirsoft\Page\Console\Commands\PlaywrightSeedPage; use Modules\Sirsoft\Page\Repositories\Contracts\PageAttachmentRepositoryInterface; use Modules\Sirsoft\Page\Repositories\Contracts\PageRepositoryInterface; use Modules\Sirsoft\Page\Repositories\Contracts\PageVersionRepositoryInterface; use Modules\Sirsoft\Page\Repositories\PageAttachmentRepository; use Modules\Sirsoft\Page\Repositories\PageRepository; use Modules\Sirsoft\Page\Repositories\PageVersionRepository; +use Modules\Sirsoft\Page\Seo\PageSitemapContributor; use Modules\Sirsoft\Page\Services\PageAttachmentService; /** @@ -20,8 +23,6 @@ class PageServiceProvider extends BaseModuleServiceProvider { /** * 모듈 식별자 - * - * @var string */ protected string $moduleIdentifier = 'sirsoft-page'; @@ -47,18 +48,23 @@ class PageServiceProvider extends BaseModuleServiceProvider /** * 서비스 부트스트랩 - * - * @return void */ public function boot(): void { parent::boot(); + // Artisan 커맨드 등록 (콘솔 환경에서만) + if ($this->app->runningInConsole()) { + $this->commands([ + PlaywrightSeedPage::class, + ]); + } + // Sitemap 기여자 등록 $this->app->booted(function () { - if ($this->app->bound(\App\Seo\SitemapGenerator::class)) { - $this->app->make(\App\Seo\SitemapGenerator::class)->registerContributor( - new \Modules\Sirsoft\Page\Seo\PageSitemapContributor() + if ($this->app->bound(SitemapGenerator::class)) { + $this->app->make(SitemapGenerator::class)->registerContributor( + new PageSitemapContributor ); } }); diff --git a/modules/_bundled/sirsoft-page/src/Repositories/Contracts/PageRepositoryInterface.php b/modules/_bundled/sirsoft-page/src/Repositories/Contracts/PageRepositoryInterface.php index 0450f7a0..9abd3586 100644 --- a/modules/_bundled/sirsoft-page/src/Repositories/Contracts/PageRepositoryInterface.php +++ b/modules/_bundled/sirsoft-page/src/Repositories/Contracts/PageRepositoryInterface.php @@ -17,7 +17,7 @@ interface PageRepositoryInterface * @param int $perPage 페이지당 항목 수 * @return LengthAwarePaginator 페이지 목록 */ - public function paginate(array $filters = [], int $perPage = 15): LengthAwarePaginator; + public function paginate(array $filters = [], int $perPage = 20): LengthAwarePaginator; /** * ID로 페이지를 조회합니다. @@ -97,13 +97,4 @@ interface PageRepositoryInterface * @return int 일치하는 페이지 수 */ public function countByKeyword(string $keyword): int; - - /** - * 여러 페이지의 발행 상태를 일괄 변경합니다. - * - * @param array $ids 페이지 ID 목록 - * @param array $data 업데이트할 데이터 (published, updated_by 등) - * @return int 변경된 페이지 수 - */ - public function bulkUpdatePublished(array $ids, array $data): int; } diff --git a/modules/_bundled/sirsoft-page/src/Repositories/PageRepository.php b/modules/_bundled/sirsoft-page/src/Repositories/PageRepository.php index 58094387..ac937438 100644 --- a/modules/_bundled/sirsoft-page/src/Repositories/PageRepository.php +++ b/modules/_bundled/sirsoft-page/src/Repositories/PageRepository.php @@ -5,7 +5,9 @@ namespace Modules\Sirsoft\Page\Repositories; use App\Helpers\PermissionHelper; use App\Repositories\Concerns\HasMultipleSearchFilters; use App\Search\Engines\DatabaseFulltextEngine; +use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Collection; +use Illuminate\Database\Eloquent\ModelNotFoundException; use Illuminate\Pagination\LengthAwarePaginator; use Modules\Sirsoft\Page\Models\Page; use Modules\Sirsoft\Page\Repositories\Contracts\PageRepositoryInterface; @@ -26,35 +28,17 @@ class PageRepository implements PageRepositoryInterface * @param int $perPage 페이지당 항목 수 * @return LengthAwarePaginator 페이지 목록 */ - public function paginate(array $filters = [], int $perPage = 15): LengthAwarePaginator + public function paginate(array $filters = [], int $perPage = 20): LengthAwarePaginator { // filters 배열에서 search/search_field 변환 $filters = $this->normalizeSearchFilters($filters); - // FULLTEXT 대상 검색인 경우 Scout 사용 - if (! empty($filters['search'])) { - $searchField = $filters['search_field'] ?? 'all'; - - if (in_array($searchField, ['all', 'title'])) { - return Page::search($filters['search']) - ->query(function ($query) use ($filters) { - $query->with(['creator', 'updater']); - - // 권한 스코프 필터링 - PermissionHelper::applyPermissionScope($query, 'sirsoft-page.pages.read'); - - // 발행 상태 필터 - if (isset($filters['published']) && $filters['published'] !== '') { - $query->where('published', (bool) $filters['published']); - } - - // 정렬 - $this->applySorting($query, $filters); - }) - ->paginate($perPage); - } - } - + // 검색 필드(title/slug/all)별로 대상 컬럼을 정확히 분리하기 위해 + // 모든 검색을 applyFilters 통합 쿼리로 처리한다. + // - title: 제목만 (Scout searchableColumns 는 title+content 를 함께 검색하므로 사용하지 않음) + // - slug : 슬러그만 + // - all : 제목 + 슬러그 (본문 content 은 검색 대상 아님 — UI '제목 또는 슬러그로 검색') + // (Scout 콜백에 slug orWhere 를 넣으면 total 카운트가 부풀려지는 회귀가 있어 #225 에서 제거됨) $query = Page::with(['creator', 'updater']); // 권한 스코프 필터링 @@ -94,7 +78,7 @@ class PageRepository implements PageRepositoryInterface * @param int $id 페이지 ID * @return Page 페이지 모델 * - * @throws \Illuminate\Database\Eloquent\ModelNotFoundException + * @throws ModelNotFoundException */ public function findOrFail(int $id): Page { @@ -202,9 +186,8 @@ class PageRepository implements PageRepositoryInterface * (Scout 엔진은 indexing 및 다른 검색에서 계속 사용됨). * * @param string $keyword 검색 키워드 - * @return \Illuminate\Database\Eloquent\Builder */ - private function buildKeywordQuery(string $keyword): \Illuminate\Database\Eloquent\Builder + private function buildKeywordQuery(string $keyword): Builder { return Page::query() ->published() @@ -218,7 +201,7 @@ class PageRepository implements PageRepositoryInterface /** * 쿼리에 정렬을 적용합니다. * - * @param \Illuminate\Database\Eloquent\Builder $query 쿼리 빌더 + * @param Builder $query 쿼리 빌더 * @param array $filters 필터 조건 (sort_by, sort_order 포함) */ private function applySorting($query, array $filters): void @@ -236,7 +219,7 @@ class PageRepository implements PageRepositoryInterface /** * 쿼리에 필터를 적용합니다. * - * @param \Illuminate\Database\Eloquent\Builder $query 쿼리 빌더 + * @param Builder $query 쿼리 빌더 * @param array $filters 필터 조건 */ private function applyFilters($query, array $filters): void @@ -255,12 +238,12 @@ class PageRepository implements PageRepositoryInterface $query->where('slug', 'like', "%{$keyword}%"); } elseif ($searchField === 'title') { $query->where(function ($q) use ($keyword) { - $this->applyTitleKeywordSearch($q, $keyword, titleOnly: true); + $this->applyTitleKeywordSearch($q, $keyword, includeSlug: false); }); } else { - // all: slug + title 통합 검색 + // all: 제목 + 슬러그 통합 검색 (본문 content 은 검색 대상 아님 — UI '제목 또는 슬러그로 검색') $query->where(function ($q) use ($keyword) { - $this->applyTitleKeywordSearch($q, $keyword); + $this->applyTitleKeywordSearch($q, $keyword, includeSlug: true); }); } } @@ -269,36 +252,21 @@ class PageRepository implements PageRepositoryInterface /** * 제목(JSON) + 슬러그 키워드 검색을 쿼리에 적용합니다. * - * title은 {"ko": "...", "en": "..."} 형태의 JSON 컬럼이므로 - * JSON_UNQUOTE + LIKE 방식으로 각 로케일 값을 검색합니다. + * title은 {"ko": "...", "en": "..."} 형태의 JSON 컬럼이므로 FULLTEXT 로 검색한다. + * 검색 대상은 제목·슬러그이며 본문(content)은 포함하지 않는다 + * (검색 UI 안내 '제목 또는 슬러그로 검색' 및 검색 필드 옵션 전체/제목/슬러그와 일치). * - * @param \Illuminate\Database\Eloquent\Builder $query 쿼리 빌더 + * @param Builder $query 쿼리 빌더 * @param string $keyword 검색 키워드 - * @param bool $titleOnly 제목만 검색 여부 (false 시 slug도 포함) + * @param bool $includeSlug 슬러그도 함께 검색할지 여부 (전체 검색 시 true) */ - private function applyTitleKeywordSearch($query, string $keyword, bool $titleOnly = false): void + private function applyTitleKeywordSearch($query, string $keyword, bool $includeSlug = false): void { - if (! $titleOnly) { + if ($includeSlug) { $query->where('slug', 'like', "%{$keyword}%"); } DatabaseFulltextEngine::whereFulltext($query, 'title', $keyword, 'or'); - - if (! $titleOnly) { - DatabaseFulltextEngine::whereFulltext($query, 'content', $keyword, 'or'); - } - } - - /** - * 여러 페이지의 발행 상태를 일괄 변경합니다. - * - * @param array $ids 페이지 ID 목록 - * @param array $data 업데이트할 데이터 (published, updated_by 등) - * @return int 변경된 페이지 수 - */ - public function bulkUpdatePublished(array $ids, array $data): int - { - return Page::whereIn('id', $ids)->update($data); } /** diff --git a/modules/_bundled/sirsoft-page/src/Services/PageAttachmentService.php b/modules/_bundled/sirsoft-page/src/Services/PageAttachmentService.php index bbd936c8..23a40eea 100644 --- a/modules/_bundled/sirsoft-page/src/Services/PageAttachmentService.php +++ b/modules/_bundled/sirsoft-page/src/Services/PageAttachmentService.php @@ -92,6 +92,9 @@ class PageAttachmentService /** * 임시 첨부파일을 페이지에 연결하고 파일을 이동합니다. * + * getByTempKey 가 order(업로드 시점 부여) 순으로 반환하므로, 그 순서대로 + * order 를 1..N 으로 재부여한다 (이커머스 ProductImageService::linkTempImages 와 동일). + * * @param string $tempKey 임시 키 * @param int $pageId 연결할 페이지 ID * @return int 연결된 첨부파일 수 @@ -101,7 +104,7 @@ class PageAttachmentService $tempAttachments = $this->attachmentRepository->getByTempKey($tempKey); $linkedCount = 0; - foreach ($tempAttachments as $attachment) { + foreach ($tempAttachments as $index => $attachment) { // 최종 경로 생성 $newPath = date('Y/m/d').'/'.$attachment->stored_filename; @@ -112,12 +115,14 @@ class PageAttachmentService $this->storage->delete('attachments', $attachment->path); } - // DB 업데이트: page_id 설정, temp_key 제거, path 변경 + // DB 업데이트: page_id 설정, temp_key 제거, path 변경, order 재배치 (조회 순서 = 업로드 순서) $this->attachmentRepository->update($attachment, [ 'page_id' => $pageId, 'temp_key' => null, 'path' => $newPath, + 'order' => $index + 1, ]); + $linkedCount++; } diff --git a/modules/_bundled/sirsoft-page/src/Services/PageService.php b/modules/_bundled/sirsoft-page/src/Services/PageService.php index 84800288..05de6c11 100644 --- a/modules/_bundled/sirsoft-page/src/Services/PageService.php +++ b/modules/_bundled/sirsoft-page/src/Services/PageService.php @@ -4,10 +4,13 @@ namespace Modules\Sirsoft\Page\Services; use App\Extension\HookManager; use App\Helpers\PermissionHelper; +use Illuminate\Database\Eloquent\Collection; +use Illuminate\Database\Eloquent\ModelNotFoundException; use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; use Modules\Sirsoft\Page\Models\Page; +use Modules\Sirsoft\Page\Models\PageVersion; use Modules\Sirsoft\Page\Repositories\Contracts\PageRepositoryInterface; use Modules\Sirsoft\Page\Repositories\Contracts\PageVersionRepositoryInterface; use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException; @@ -32,7 +35,7 @@ class PageService * @param int $perPage 페이지당 항목 수 * @return LengthAwarePaginator 페이지 목록 */ - public function getPages(array $filters = [], int $perPage = 15): LengthAwarePaginator + public function getPages(array $filters = [], int $perPage = 20): LengthAwarePaginator { $filters = HookManager::applyFilters('sirsoft-page.page.filter_list_query', $filters); @@ -72,9 +75,12 @@ class PageService // 버전 1 스냅샷 저장 $this->saveVersionSnapshot($page, $userId); - // temp_key 첨부파일 연결 및 파일 이동 + // temp_key 첨부파일 연결 및 파일 이동 (업로드 순서대로 order 부여) if (! empty($data['temp_key'])) { - $this->pageAttachmentService->linkTempAttachmentsWithMove($data['temp_key'], $page->id); + $this->pageAttachmentService->linkTempAttachmentsWithMove( + $data['temp_key'], + $page->id + ); } HookManager::doAction('sirsoft-page.page.after_create', $page, $data); @@ -122,9 +128,12 @@ class PageService // 버전 스냅샷 저장 $this->saveVersionSnapshot($page, $userId); - // temp_key 첨부파일 연결 및 파일 이동 + // temp_key 첨부파일 연결 및 파일 이동 (업로드 순서대로 order 부여) if (! empty($data['temp_key'])) { - $this->pageAttachmentService->linkTempAttachmentsWithMove($data['temp_key'], $page->id); + $this->pageAttachmentService->linkTempAttachmentsWithMove( + $data['temp_key'], + $page->id + ); } HookManager::doAction('sirsoft-page.page.after_update', $page, $data, $snapshot); @@ -205,16 +214,40 @@ class PageService */ public function bulkChangePublishStatus(array $ids, bool $published): int { - $updateData = [ - 'published' => $published, - 'updated_by' => Auth::id(), - ]; - - if ($published) { - $updateData['published_at'] = now(); + if (empty($ids)) { + return 0; } - return $this->pageRepository->bulkUpdatePublished($ids, $updateData); + return DB::transaction(function () use ($ids, $published) { + $userId = Auth::id(); + $count = 0; + + foreach ($ids as $id) { + // 존재하지 않는 페이지가 섞이면 예외 → 트랜잭션 전체 롤백 (all-or-nothing) + $page = $this->pageRepository->findOrFail((int) $id); + + HookManager::doAction('sirsoft-page.page.before_publish', $page, $published); + + $updateData = [ + 'published' => $published, + 'updated_by' => $userId, + ]; + + // 발행 시 published_at 갱신 + if ($published) { + $updateData['published_at'] = now(); + } + + $page = $this->pageRepository->update($page, $updateData); + + // 페이지별 after_publish 발화 → 활동로그 per-item 기록 + HookManager::doAction('sirsoft-page.page.after_publish', $page, $published); + + $count++; + } + + return $count; + }); } /** @@ -270,7 +303,7 @@ class PageService * @param int $id 페이지 ID * @return Page 페이지 모델 * - * @throws \Illuminate\Database\Eloquent\ModelNotFoundException + * @throws ModelNotFoundException */ public function getPage(int $id): Page { @@ -286,23 +319,32 @@ class PageService /** * 슬러그로 발행된 페이지를 조회합니다. * + * $allowUnpublished 가 true 이면 미발행 페이지도 반환합니다. 관리자 미리보기 + * (사용자 화면에서 발행 전 페이지 확인)를 위한 것으로, 권한 판정은 호출부(컨트롤러)가 + * 담당하고 이 메서드는 허용 여부만 플래그로 전달받습니다. + * * @param string $slug 페이지 슬러그 - * @return Page|null 발행된 페이지 모델 또는 null + * @param bool $allowUnpublished 미발행 페이지 반환 허용 여부 (관리자 미리보기) + * @return Page|null 페이지 모델 또는 null */ - public function getPublishedPageBySlug(string $slug): ?Page + public function getPublishedPageBySlug(string $slug, bool $allowUnpublished = false): ?Page { $page = $this->pageRepository->findBySlug($slug); - return ($page && $page->published) ? $page : null; + if (! $page) { + return null; + } + + return ($page->published || $allowUnpublished) ? $page : null; } /** * 페이지 버전 이력을 조회합니다. * * @param Page $page 페이지 모델 - * @return \Illuminate\Database\Eloquent\Collection 버전 목록 (최신순) + * @return Collection 버전 목록 (최신순) */ - public function getVersions(Page $page): \Illuminate\Database\Eloquent\Collection + public function getVersions(Page $page): Collection { return $this->pageVersionRepository->getVersionsByPage($page); } @@ -311,11 +353,11 @@ class PageService * 버전 ID로 페이지 버전을 조회합니다. * * @param int $versionId 버전 ID - * @return \Modules\Sirsoft\Page\Models\PageVersion 버전 모델 + * @return PageVersion 버전 모델 * - * @throws \Illuminate\Database\Eloquent\ModelNotFoundException + * @throws ModelNotFoundException */ - public function getVersion(int $versionId): \Modules\Sirsoft\Page\Models\PageVersion + public function getVersion(int $versionId): PageVersion { return $this->pageVersionRepository->findOrFail($versionId); } @@ -339,7 +381,7 @@ class PageService * @param string $orderBy 정렬 컬럼 * @param string $direction 정렬 방향 (asc, desc) * @param int $limit 조회할 최대 항목 수 - * @return array{total: int, items: \Illuminate\Database\Eloquent\Collection} + * @return array{total: int, items: Collection} */ public function searchByKeyword(string $keyword, string $orderBy = 'created_at', string $direction = 'desc', int $limit = 10): array { diff --git a/modules/_bundled/sirsoft-page/src/lang/en/validation.php b/modules/_bundled/sirsoft-page/src/lang/en/validation.php index 23cd1bbc..6862cfdb 100644 --- a/modules/_bundled/sirsoft-page/src/lang/en/validation.php +++ b/modules/_bundled/sirsoft-page/src/lang/en/validation.php @@ -59,6 +59,11 @@ return [ 'max' => 'The search query must not exceed :max characters.', ], + // user-friendly attribute names shown in validation errors + 'attributes' => [ + 'search' => 'search query', + ], + // search_field validation messages 'search_field' => [ 'in' => 'The search field must be one of: all, title, slug.', diff --git a/modules/_bundled/sirsoft-page/src/lang/ko/validation.php b/modules/_bundled/sirsoft-page/src/lang/ko/validation.php index d043dedb..defdd4b4 100644 --- a/modules/_bundled/sirsoft-page/src/lang/ko/validation.php +++ b/modules/_bundled/sirsoft-page/src/lang/ko/validation.php @@ -59,6 +59,11 @@ return [ 'max' => '검색어는 최대 :max자까지 입력 가능합니다.', ], + // 검증 오류에 표시할 사용자 친화적 필드명 + 'attributes' => [ + 'search' => '검색어', + ], + // search_field 검증 메시지 'search_field' => [ 'in' => '검색 필드는 all, title, slug 중 하나여야 합니다.', diff --git a/modules/_bundled/sirsoft-page/src/routes/api.php b/modules/_bundled/sirsoft-page/src/routes/api.php index 2d543b3a..789afd0e 100644 --- a/modules/_bundled/sirsoft-page/src/routes/api.php +++ b/modules/_bundled/sirsoft-page/src/routes/api.php @@ -105,18 +105,6 @@ Route::prefix('admin/attachments')->middleware(['auth:sanctum', 'throttle:600,1' ->middleware('permission:admin,sirsoft-page.pages.update') ->name('reorder'); - // 첨부파일 다운로드 (해시 기반) - Route::get('/download/{hash}', [PageAttachmentController::class, 'download']) - ->middleware('permission:admin,sirsoft-page.pages.read') - ->where('hash', '[a-zA-Z0-9]{12}') - ->name('download'); - - // 첨부파일 이미지 미리보기 (해시 기반, inline) - Route::get('/preview/{hash}', [PageAttachmentController::class, 'preview']) - ->middleware('permission:admin,sirsoft-page.pages.read') - ->where('hash', '[a-zA-Z0-9]{12}') - ->name('preview'); - // 첨부파일 삭제 Route::delete('/{id}', [PageAttachmentController::class, 'destroy']) ->middleware('permission:admin,sirsoft-page.pages.update') @@ -134,12 +122,12 @@ Route::prefix('admin/attachments')->middleware(['auth:sanctum', 'throttle:600,1' */ // optional.sanctum: Bearer 토큰이 있으면 인증, 없으면 guest로 통과 Route::prefix('pages')->middleware(['optional.sanctum', 'throttle:600,1'])->name('pages.')->group(function () { - // 공개 첨부파일 다운로드 (해시 기반) - /{slug} 보다 먼저 등록 + // 첨부 다운로드 (해시 기반, 발행 상태에 따라 컨트롤러에서 접근 제어) - /{slug} 보다 먼저 등록 Route::get('/attachment/{hash}', [PublicPageAttachmentController::class, 'download']) ->where('hash', '[a-zA-Z0-9]{12}') ->name('attachment.download'); - // 공개 첨부파일 이미지 미리보기 (해시 기반, inline) + // 첨부 이미지 미리보기 (공개 - 토큰 없는 직접 GET 을 위해 권한 체크 없이 이미지만 제공) Route::get('/attachment/{hash}/preview', [PublicPageAttachmentController::class, 'preview']) ->where('hash', '[a-zA-Z0-9]{12}') ->name('attachment.preview'); diff --git a/modules/_bundled/sirsoft-page/tests/Feature/Admin/PageAttachmentControllerTest.php b/modules/_bundled/sirsoft-page/tests/Feature/Admin/PageAttachmentControllerTest.php index 0c92732a..b5c06188 100644 --- a/modules/_bundled/sirsoft-page/tests/Feature/Admin/PageAttachmentControllerTest.php +++ b/modules/_bundled/sirsoft-page/tests/Feature/Admin/PageAttachmentControllerTest.php @@ -174,7 +174,7 @@ class PageAttachmentControllerTest extends FeatureTestCase $response->assertStatus(200) ->assertJsonPath('success', true); - $this->assertSoftDeleted('page_attachments', ['id' => $attachment->id]); + $this->assertDatabaseMissing('page_attachments', ['id' => $attachment->id]); } /** @@ -258,29 +258,9 @@ class PageAttachmentControllerTest extends FeatureTestCase ->assertJsonValidationErrors(['order']); } - // ─── 다운로드/미리보기 ───────────────────────────── - - /** - * 존재하지 않는 해시로 다운로드 시 404를 반환하는지 확인 - */ - public function test_download_nonexistent_hash_returns_404(): void - { - $response = $this->actingAs($this->adminUser) - ->getJson('/api/modules/sirsoft-page/admin/attachments/download/abcdefghijkl'); - - $response->assertStatus(404); - } - - /** - * 존재하지 않는 해시로 미리보기 시 404를 반환하는지 확인 - */ - public function test_preview_nonexistent_hash_returns_404(): void - { - $response = $this->actingAs($this->adminUser) - ->getJson('/api/modules/sirsoft-page/admin/attachments/preview/abcdefghijkl'); - - $response->assertStatus(404); - } + // 첨부 다운로드/미리보기는 공개 hash 라우트(pages/attachment/*)로 단일화되어 + // 관리자 전용 preview/download 라우트가 제거됨. 해당 서빙 경로 테스트는 + // PublicPageControllerTest 의 preview/download 매트릭스로 이관. // ─── 인증 차단 ───────────────────────────────────── diff --git a/modules/_bundled/sirsoft-page/tests/Feature/Admin/PageControllerTest.php b/modules/_bundled/sirsoft-page/tests/Feature/Admin/PageControllerTest.php index ce42bb81..125b6162 100644 --- a/modules/_bundled/sirsoft-page/tests/Feature/Admin/PageControllerTest.php +++ b/modules/_bundled/sirsoft-page/tests/Feature/Admin/PageControllerTest.php @@ -11,26 +11,12 @@ use App\Helpers\PermissionHelper; use App\Models\Permission; use App\Models\Role; use App\Models\User; -use App\Search\Engines\DatabaseFulltextEngine; -use Laravel\Scout\EngineManager; +use App\Seo\Contracts\SeoCacheManagerInterface; use Modules\Sirsoft\Page\Models\Page; +use Modules\Sirsoft\Page\Models\PageAttachment; use Modules\Sirsoft\Page\Models\PageVersion; use Modules\Sirsoft\Page\Tests\FeatureTestCase; -/** - * LIKE fallback 전용 Scout 엔진 - * - * MySQL FULLTEXT는 트랜잭션 내 미커밋 데이터를 인덱싱하지 않으므로, - * 테스트에서 Scout 파이프라인 전체를 검증하기 위해 LIKE fallback을 강제합니다. - */ -class LikeFallbackEngine extends DatabaseFulltextEngine -{ - public static function supportsFulltext(): bool - { - return false; - } -} - /** * 관리자 페이지 관리 API 테스트 * @@ -122,12 +108,13 @@ class PageControllerTest extends FeatureTestCase /** * 검색어로 목록을 조회할 수 있는지 확인 + * + * 검색 동작은 슬러그(LIKE) 매칭으로 검증한다 — 슬러그 검색은 InnoDB FULLTEXT 가 + * 트랜잭션 내 미커밋 데이터를 보장하지 않는 가시성 문제와 무관하게 안정적이다. + * (제목/본문 FULLTEXT 컬럼 범위 분리는 test_admin_search_title_excludes_content 가 담당) */ public function test_admin_can_search_pages(): void { - // Scout 엔진을 LIKE fallback으로 교체 (트랜잭션 호환) - $this->swapScoutEngineToLikeFallback(); - Page::factory()->create([ 'slug' => 'test-search-target', 'title' => ['ko' => '검색대상페이지', 'en' => 'Search Target'], @@ -135,11 +122,158 @@ class PageControllerTest extends FeatureTestCase 'updated_by' => $this->adminUser->id, ]); + // 전체(all) 검색에 슬러그 토큰을 넣으면 결과에 포함되어야 한다 $response = $this->actingAs($this->adminUser) - ->getJson('/api/modules/sirsoft-page/admin/pages?search=검색대상'); + ->getJson('/api/modules/sirsoft-page/admin/pages?search=search-target&search_field=all'); $response->assertStatus(200); - $this->assertGreaterThanOrEqual(1, $response->json('data.meta.total')); + $slugs = collect($response->json('data.data'))->pluck('slug')->all(); + $this->assertContains('test-search-target', $slugs); + } + + /** + * 검색조건 '전체'(all)로 슬러그를 검색하면 결과에 포함되는지 확인 + * + * 회귀: 기존에는 all 검색이 Scout(제목·본문 FULLTEXT) 경로로만 처리되어 + * 슬러그가 검색 범위에서 누락됨. all 검색에도 슬러그 LIKE 가 포함되어야 한다. + * + * 슬러그 매칭은 LIKE 기반이라 테스트 트랜잭션의 미커밋 데이터도 검증 가능하다. + * (제목·본문 FULLTEXT 매칭은 별도 title 단독 검색 테스트가 담당) + */ + public function test_admin_search_all_includes_slug(): void + { + // 제목/본문에 없는 고유 슬러그 토큰 (운영 시더 데이터와 충돌 회피) + Page::factory()->create([ + 'slug' => 'test-zzslugonly-target', + 'title' => ['ko' => '제목없음표제', 'en' => 'Heading Only'], + 'content' => ['ko' => '본문내용', 'en' => 'Body'], + 'created_by' => $this->adminUser->id, + 'updated_by' => $this->adminUser->id, + ]); + + // search_field 미지정 = all. 제목/본문에 없는 슬러그 토큰으로 검색 + $response = $this->actingAs($this->adminUser) + ->getJson('/api/modules/sirsoft-page/admin/pages?search=zzslugonly'); + + $response->assertStatus(200); + $slugs = collect($response->json('data.data'))->pluck('slug')->all(); + $this->assertContains('test-zzslugonly-target', $slugs); + } + + /** + * '전체'(all) 검색 결과의 total 이 실제 행 수와 일치하는지 확인 (#225 회귀 가드) + * + * 과거 Scout 콜백 내 orWhere('slug') 가 total 카운트를 부풀렸던 회귀(#225)를 + * all 검색 통합 후에도 재발하지 않는지 검증한다. + * 고유 슬러그 토큰으로 결과를 1건으로 한정해 total ↔ 행 수 정합을 본다. + */ + public function test_admin_search_all_total_matches_rows(): void + { + Page::factory()->create([ + 'slug' => 'test-zztotalguard-one', + 'title' => ['ko' => '집계가드대상', 'en' => 'Count Guard'], + 'created_by' => $this->adminUser->id, + 'updated_by' => $this->adminUser->id, + ]); + + $response = $this->actingAs($this->adminUser) + ->getJson('/api/modules/sirsoft-page/admin/pages?search=zztotalguard'); + + $response->assertStatus(200); + $total = $response->json('data.meta.total'); + $rowCount = count($response->json('data.data')); + // 단일 페이지 결과: total 과 실제 반환 행 수가 일치해야 함 (부풀림 없음) + $this->assertSame(1, $total); + $this->assertSame(1, $rowCount); + } + + /** + * per_page 미지정 시 기본값이 20 인지 확인 + * + * 회귀: 백엔드 기본값이 15 였으나 프론트 셀렉트는 20 을 표시해 + * '표시 20 / 실제 조회 15' 불일치 발생. 양쪽을 20 으로 통일한다. + */ + public function test_admin_list_default_per_page_is_20(): void + { + $response = $this->actingAs($this->adminUser) + ->getJson('/api/modules/sirsoft-page/admin/pages'); + + $response->assertStatus(200); + $this->assertSame(20, $response->json('data.meta.per_page')); + } + + /** + * 본문(content)에만 있는 단어는 제목/전체 검색 어느 쪽에서도 검색되지 않는지 확인 (E4) + * + * 검색 대상은 제목·슬러그이며 본문은 포함하지 않는다 (UI '제목 또는 슬러그로 검색', + * 검색 필드 옵션 전체/제목/슬러그와 일치). '제목'뿐 아니라 '전체' 검색도 본문을 제외한다. + * + * 검증 범위: '본문 단어가 검색에 누출되지 않음'(항상 0건이라 트랜잭션 FULLTEXT 가시성과 무관하게 안정적). + */ + public function test_admin_search_excludes_content(): void + { + Page::factory()->create([ + 'slug' => 'test-content-scope', + 'title' => ['ko' => '제목쪽고유단어', 'en' => 'Heading'], + 'content' => ['ko' => '본문쪽고유단어', 'en' => 'Body'], + 'created_by' => $this->adminUser->id, + 'updated_by' => $this->adminUser->id, + ]); + + // 본문에만 있는 단어는 '제목' 검색에서 0건 + $this->actingAs($this->adminUser) + ->getJson('/api/modules/sirsoft-page/admin/pages?search=본문쪽고유단어&search_field=title') + ->assertStatus(200) + ->assertJsonPath('data.meta.total', 0); + + // 본문에만 있는 단어는 '전체' 검색에서도 0건 (본문은 검색 대상 아님) + $this->actingAs($this->adminUser) + ->getJson('/api/modules/sirsoft-page/admin/pages?search=본문쪽고유단어&search_field=all') + ->assertStatus(200) + ->assertJsonPath('data.meta.total', 0); + } + + /** + * 검색조건 '전체'(all)는 제목 외에 슬러그도 검색해 title 보다 넓은 범위인지 확인 (E4 대조) + * + * '전체' 검색 = 제목 + 슬러그. title 검색이 제목만 보더라도, all 검색은 슬러그까지 포함해야 한다. + */ + public function test_admin_search_all_wider_than_title(): void + { + Page::factory()->create([ + 'slug' => 'test-allscope-zzslugword', + 'title' => ['ko' => '무관한제목', 'en' => 'x'], + 'content' => ['ko' => '본문', 'en' => 'y'], + 'created_by' => $this->adminUser->id, + 'updated_by' => $this->adminUser->id, + ]); + + // all 검색: 슬러그 토큰으로 잡혀야 함 (제목엔 없음) + $all = $this->actingAs($this->adminUser) + ->getJson('/api/modules/sirsoft-page/admin/pages?search=zzslugword&search_field=all'); + $all->assertStatus(200); + $this->assertGreaterThanOrEqual(1, $all->json('data.meta.total')); + + // title 검색: 같은 슬러그 토큰은 제목에 없으므로 0건 (범위가 좁음을 대조) + $title = $this->actingAs($this->adminUser) + ->getJson('/api/modules/sirsoft-page/admin/pages?search=zzslugword&search_field=title'); + $title->assertStatus(200); + $this->assertSame(0, $title->json('data.meta.total')); + } + + /** + * 검색어가 최대 길이를 초과하면 500 이 아닌 422 검증 오류를 반환하는지 확인 (E5) + * + * 회귀: 공백 없는 긴 한글(140자+)이 FULLTEXT phrase 토큰 한도를 초과해 + * 'Too many words in a FTS phrase'(191) → 500 을 유발했다. + * search max 를 100 으로 제한해 긴 입력을 422 로 사전 차단한다. + */ + public function test_admin_search_too_long_returns_422(): void + { + // 레이아웃이 실제로 쓰는 filters[0][value] 경로로 긴 검색어 전송 → 500 이 아닌 422 + $this->actingAs($this->adminUser) + ->getJson('/api/modules/sirsoft-page/admin/pages?filters[0][field]=all&filters[0][value]='.str_repeat('가', 200)) + ->assertStatus(422); } // ─── 상세 조회 (show) ────────────────────────────── @@ -180,6 +314,77 @@ class PageControllerTest extends FeatureTestCase $response->assertStatus(404); } + /** + * 관리자 상세 조회 시 첨부 URL이 공개 hash 라우트를 가리키는지 확인 + * + * 썸네일 ·다운로드는 토큰을 실을 수 없어 인증 라우트에 물리면 401 로 깨진다. + * 게시판·이커머스 표준과 동일하게 공개 hash 라우트로 단일화하고, 미발행 콘텐츠 + * 다운로드 차단은 공개 라우트 내부의 권한 게이트가 담당한다. + */ + public function test_admin_show_returns_public_attachment_urls(): void + { + $page = Page::factory()->create([ + 'slug' => 'test-admin-attach-url', + 'published' => false, + 'created_by' => $this->adminUser->id, + 'updated_by' => $this->adminUser->id, + ]); + $attachment = PageAttachment::factory()->image()->create([ + 'page_id' => $page->id, + 'hash' => 'abc123def456', + 'created_by' => $this->adminUser->id, + ]); + + $response = $this->actingAs($this->adminUser) + ->getJson("/api/modules/sirsoft-page/admin/pages/{$page->id}"); + + $response->assertStatus(200); + $att = $response->json('data.attachments.0'); + $this->assertSame( + "/api/modules/sirsoft-page/pages/attachment/{$attachment->hash}/preview", + $att['preview_url'] + ); + $this->assertSame( + "/api/modules/sirsoft-page/pages/attachment/{$attachment->hash}", + $att['download_url'] + ); + } + + /** + * 공개 상세 조회 시 첨부 URL이 공개 라우트를 유지하는지 확인 + * + * 공개 응답에 admin URL(발행 가드 없음)이 섞이면 미발행 첨부가 + * 노출되는 보안 회귀가 된다. 공개 응답은 공개 라우트만 반환해야 한다. + */ + public function test_public_show_returns_public_attachment_urls(): void + { + $page = Page::factory()->create([ + 'slug' => 'test-public-attach-url', + 'published' => true, + 'published_at' => now(), + 'created_by' => $this->adminUser->id, + 'updated_by' => $this->adminUser->id, + ]); + $attachment = PageAttachment::factory()->image()->create([ + 'page_id' => $page->id, + 'hash' => 'pub123def456', + 'created_by' => $this->adminUser->id, + ]); + + $response = $this->getJson("/api/modules/sirsoft-page/pages/{$page->slug}"); + + $response->assertStatus(200); + $att = $response->json('data.attachments.0'); + $this->assertSame( + "/api/modules/sirsoft-page/pages/attachment/{$attachment->hash}/preview", + $att['preview_url'] + ); + $this->assertSame( + "/api/modules/sirsoft-page/pages/attachment/{$attachment->hash}", + $att['download_url'] + ); + } + // ─── 생성 (store) ────────────────────────────────── /** @@ -383,7 +588,7 @@ class PageControllerTest extends FeatureTestCase $response->assertStatus(200); $this->assertDatabaseHas('pages', ['id' => $page->id, 'slug' => 'test-slug-new']); - $this->assertDatabaseMissing('pages', ['slug' => 'test-slug-old', 'deleted_at' => null]); + $this->assertDatabaseMissing('pages', ['slug' => 'test-slug-old']); } /** @@ -593,7 +798,7 @@ class PageControllerTest extends FeatureTestCase // ─── 삭제 (destroy) ──────────────────────────────── /** - * 페이지를 삭제(소프트 삭제)할 수 있는지 확인 + * 페이지를 삭제(물리 삭제)할 수 있는지 확인 */ public function test_admin_can_delete_page(): void { @@ -609,8 +814,8 @@ class PageControllerTest extends FeatureTestCase $response->assertStatus(200) ->assertJsonPath('success', true); - // 소프트 삭제 확인 - $this->assertSoftDeleted('pages', ['id' => $page->id]); + // 물리 삭제 확인 (soft delete 미사용 — 행이 실제로 제거됨) + $this->assertDatabaseMissing('pages', ['id' => $page->id]); } /** @@ -624,6 +829,117 @@ class PageControllerTest extends FeatureTestCase $response->assertStatus(404); } + /** + * 페이지 삭제 후 동일 슬러그로 재생성할 수 있는지 확인 (회귀) + * + * soft delete 시절에는 삭제된 페이지의 slug 가 잔존하여 동일 slug 재생성 시 + * Rule::unique 가 422 를 반환했다. hard delete 전환으로 재생성이 성공해야 한다. + */ + public function test_can_recreate_page_with_same_slug_after_delete(): void + { + $slug = 'test-reuse-slug'; + + // 1) 최초 생성 + $first = $this->actingAs($this->adminUser) + ->postJson('/api/modules/sirsoft-page/admin/pages', [ + 'slug' => $slug, + 'title' => ['ko' => '원본 페이지', 'en' => 'Original'], + 'content' => ['ko' => '본문', 'en' => 'Content'], + 'content_mode' => 'html', + ]); + $first->assertStatus(201); + $firstId = $first->json('data.id'); + + // 2) 삭제 + $this->actingAs($this->adminUser) + ->deleteJson("/api/modules/sirsoft-page/admin/pages/{$firstId}") + ->assertStatus(200); + + $this->assertDatabaseMissing('pages', ['id' => $firstId]); + + // 3) 동일 slug 로 재생성 — 성공해야 함 + $second = $this->actingAs($this->adminUser) + ->postJson('/api/modules/sirsoft-page/admin/pages', [ + 'slug' => $slug, + 'title' => ['ko' => '재생성 페이지', 'en' => 'Recreated'], + 'content' => ['ko' => '본문', 'en' => 'Content'], + 'content_mode' => 'html', + ]); + + $second->assertStatus(201) + ->assertJsonPath('data.slug', $slug); + } + + /** + * 페이지 삭제 후 슬러그 중복 체크와 생성 검증 결과가 일치하는지 확인 (회귀) + * + * 삭제 후 check-slug 는 "사용 가능", 생성도 성공해야 한다 (두 경로 정합). + */ + public function test_check_slug_and_create_are_consistent_after_delete(): void + { + $slug = 'test-consistent-slug'; + + $first = $this->actingAs($this->adminUser) + ->postJson('/api/modules/sirsoft-page/admin/pages', [ + 'slug' => $slug, + 'title' => ['ko' => '원본', 'en' => 'Original'], + 'content_mode' => 'html', + ]); + $first->assertStatus(201); + $firstId = $first->json('data.id'); + + $this->actingAs($this->adminUser) + ->deleteJson("/api/modules/sirsoft-page/admin/pages/{$firstId}") + ->assertStatus(200); + + // check-slug 는 사용 가능(exists=false)으로 응답 + $check = $this->actingAs($this->adminUser) + ->postJson('/api/modules/sirsoft-page/admin/pages/check-slug', [ + 'slug' => $slug, + ]); + $check->assertStatus(200) + ->assertJsonPath('data.exists', false); + + // 생성도 성공 (check-slug 와 동일 결론) + $create = $this->actingAs($this->adminUser) + ->postJson('/api/modules/sirsoft-page/admin/pages', [ + 'slug' => $slug, + 'title' => ['ko' => '재생성', 'en' => 'Recreated'], + 'content_mode' => 'html', + ]); + $create->assertStatus(201); + } + + /** + * 첨부가 있는 페이지를 물리 삭제해도 삭제 흐름(첨부 정리 + 활동로그 기록)이 정상 완료되는지 확인 + * + * 활동로그 리스너는 삭제되는 페이지를 loggable 로 참조한다. hard delete 후 loggable 행이 + * 사라지더라도 삭제 응답이 200 이고 페이지/첨부 행이 모두 물리 삭제되어야 한다. + */ + public function test_deleting_page_with_attachment_completes_without_error(): void + { + $page = Page::factory()->create([ + 'slug' => 'test-delete-with-attach', + 'created_by' => $this->adminUser->id, + 'updated_by' => $this->adminUser->id, + ]); + + $attachment = PageAttachment::factory()->create([ + 'page_id' => $page->id, + 'created_by' => $this->adminUser->id, + ]); + + $response = $this->actingAs($this->adminUser) + ->deleteJson("/api/modules/sirsoft-page/admin/pages/{$page->id}"); + + $response->assertStatus(200) + ->assertJsonPath('success', true); + + // 페이지 + 첨부 모두 물리 삭제 + $this->assertDatabaseMissing('pages', ['id' => $page->id]); + $this->assertDatabaseMissing('page_attachments', ['id' => $attachment->id]); + } + // ─── 발행 토글 (publish) ─────────────────────────── /** @@ -699,6 +1015,11 @@ class PageControllerTest extends FeatureTestCase ->assertJsonPath('success', true) ->assertJsonPath('data.count', 3); + // 성공 메시지의 :count 플레이스홀더가 실제 건수로 치환되는지 확인 (회귀) + $message = $response->json('message'); + $this->assertStringNotContainsString(':count', $message, '메시지에 :count 플레이스홀더가 치환되지 않고 남았습니다.'); + $this->assertStringContainsString('3', $message, '메시지에 변경 건수(3)가 포함되어야 합니다.'); + // DB 확인 foreach ($ids as $id) { $this->assertDatabaseHas('pages', ['id' => $id, 'published' => true]); @@ -831,7 +1152,7 @@ class PageControllerTest extends FeatureTestCase ]); $response = $this->actingAs($this->adminUser) - ->getJson('/api/modules/sirsoft-page/admin/pages?' . http_build_query([ + ->getJson('/api/modules/sirsoft-page/admin/pages?'.http_build_query([ 'filters' => [ ['field' => 'slug', 'value' => 'filters-target', 'operator' => 'like'], ], @@ -977,6 +1298,102 @@ class PageControllerTest extends FeatureTestCase $this->assertEquals(3, $page->current_version); // 복원 후 버전 증가 } + /** + * 버전 복원 시 페이지 상세 SEO 캐시가 무효화되는지 확인 + * + * 복원은 title/content/seo_meta 를 이전 버전으로 되돌리므로 수정과 동일하게 + * 검색봇용 SEO 캐시를 갱신해야 한다. 복원 전 상세 URL 캐시를 적재한 뒤 복원하면 + * after_restore 훅 → SeoPageCacheListener 가 해당 캐시를 무효화해야 한다. + * (회귀 배경: after_restore 미구독으로 복원 후에도 봇에 복원 전 버전이 잔존) + */ + public function test_restore_version_invalidates_page_detail_seo_cache(): void + { + $page = Page::factory()->create([ + 'slug' => 'restore-seo-cache', + 'title' => ['ko' => '현재 제목', 'en' => 'Current Title'], + 'current_version' => 2, + 'created_by' => $this->adminUser->id, + 'updated_by' => $this->adminUser->id, + ]); + + $version1 = PageVersion::create([ + 'page_id' => $page->id, + 'version' => 1, + 'title' => ['ko' => '원래 제목', 'en' => 'Original Title'], + 'content' => ['ko' => '원래 내용', 'en' => 'Original Content'], + 'content_mode' => 'html', + 'created_by' => $this->adminUser->id, + ]); + + PageVersion::create([ + 'page_id' => $page->id, + 'version' => 2, + 'title' => ['ko' => '현재 제목', 'en' => 'Current Title'], + 'content' => ['ko' => '현재 내용', 'en' => 'Current Content'], + 'content_mode' => 'html', + 'created_by' => $this->adminUser->id, + ]); + + // 복원 전 페이지 상세 URL 캐시 적재 (봇 응답 캐시 시뮬레이션) + $cache = app(SeoCacheManagerInterface::class); + $cache->put("/page/{$page->slug}", 'ko', '현재 내용'); + $this->assertContains("/page/{$page->slug}", $cache->getCachedUrls()); + + $response = $this->actingAs($this->adminUser) + ->postJson("/api/modules/sirsoft-page/admin/pages/{$page->id}/versions/{$version1->id}/restore"); + + $response->assertStatus(200); + + // 복원 후 상세 캐시가 무효화되어 봇이 새로 렌더한다 + $this->assertNotContains("/page/{$page->slug}", $cache->getCachedUrls()); + } + + /** + * 버전 복원 후 새 버전이 생성되고 기존 버전 이력이 모두 보존되는지 확인 (검수항목 3·4) + * + * 복원은 다음 버전 번호로 새 스냅샷을 만들며, 복원 대상을 포함한 기존 버전 이력을 + * 삭제하지 않고 그대로 보존해야 한다. + */ + public function test_restore_version_creates_new_version_and_preserves_history(): void + { + $page = Page::factory()->create([ + 'slug' => 'restore-history-preserved', + 'title' => ['ko' => '현재 제목', 'en' => 'Current Title'], + 'current_version' => 2, + 'created_by' => $this->adminUser->id, + 'updated_by' => $this->adminUser->id, + ]); + + $version1 = PageVersion::create([ + 'page_id' => $page->id, + 'version' => 1, + 'title' => ['ko' => '원래 제목', 'en' => 'Original Title'], + 'content' => ['ko' => '원래 내용', 'en' => 'Original Content'], + 'content_mode' => 'html', + 'created_by' => $this->adminUser->id, + ]); + + PageVersion::create([ + 'page_id' => $page->id, + 'version' => 2, + 'title' => ['ko' => '현재 제목', 'en' => 'Current Title'], + 'content' => ['ko' => '현재 내용', 'en' => 'Current Content'], + 'content_mode' => 'html', + 'created_by' => $this->adminUser->id, + ]); + + $this->actingAs($this->adminUser) + ->postJson("/api/modules/sirsoft-page/admin/pages/{$page->id}/versions/{$version1->id}/restore") + ->assertStatus(200); + + // 기존 버전 1·2 는 보존되고, 복원으로 버전 3 이 새로 생성되어 총 3건 + $versions = PageVersion::where('page_id', $page->id)->orderBy('version')->get(); + $this->assertCount(3, $versions); + $this->assertEquals([1, 2, 3], $versions->pluck('version')->all()); + // 복원 대상(버전 1) 레코드가 삭제되지 않고 남아 있다 + $this->assertNotNull(PageVersion::find($version1->id)); + } + // ─── 인증/권한 차단 ──────────────────────────────── /** @@ -1052,7 +1469,7 @@ class PageControllerTest extends FeatureTestCase { // 별도 역할을 생성하여 read 권한만 부여 (admin 역할과 분리) $readOnlyRole = Role::create([ - 'identifier' => 'test_page_read_only_' . uniqid(), + 'identifier' => 'test_page_read_only_'.uniqid(), 'name' => ['ko' => '읽기전용', 'en' => 'Read Only'], 'is_active' => true, ]); @@ -1324,25 +1741,4 @@ class PageControllerTest extends FeatureTestCase return $user; } - - /** - * Scout 엔진을 LIKE fallback 모드로 교체합니다. - * - * MySQL FULLTEXT는 트랜잭션 내 미커밋 데이터를 검색하지 못하므로, - * Scout 파이프라인 전체(Model::search → EngineManager → performSearch → 쿼리)를 - * 검증하기 위해 LIKE fallback 엔진으로 교체합니다. - * - * @return void - */ - private function swapScoutEngineToLikeFallback(): void - { - $manager = $this->app->make(EngineManager::class); - $manager->extend('mysql-fulltext', fn () => new LikeFallbackEngine()); - - // EngineManager 캐시된 드라이버 인스턴스 초기화 - $reflection = new \ReflectionClass($manager); - $property = $reflection->getProperty('drivers'); - $property->setAccessible(true); - $property->setValue($manager, []); - } } diff --git a/modules/_bundled/sirsoft-page/tests/Feature/Repositories/PageRepositorySearchTest.php b/modules/_bundled/sirsoft-page/tests/Feature/Repositories/PageRepositorySearchTest.php index 57c3b709..6ca03668 100644 --- a/modules/_bundled/sirsoft-page/tests/Feature/Repositories/PageRepositorySearchTest.php +++ b/modules/_bundled/sirsoft-page/tests/Feature/Repositories/PageRepositorySearchTest.php @@ -68,7 +68,7 @@ class PageRepositorySearchTest extends TestCase */ protected function tearDown(): void { - Page::query()->withTrashed()->forceDelete(); + Page::query()->forceDelete(); if (isset($this->user)) { User::where('id', $this->user->id)->delete(); diff --git a/modules/_bundled/sirsoft-page/tests/Feature/User/PublicPageControllerTest.php b/modules/_bundled/sirsoft-page/tests/Feature/User/PublicPageControllerTest.php index 58554e26..0fd947eb 100644 --- a/modules/_bundled/sirsoft-page/tests/Feature/User/PublicPageControllerTest.php +++ b/modules/_bundled/sirsoft-page/tests/Feature/User/PublicPageControllerTest.php @@ -9,7 +9,9 @@ use App\Contracts\Extension\StorageInterface; use Mockery; use Modules\Sirsoft\Page\Models\Page; use Modules\Sirsoft\Page\Models\PageAttachment; +use Modules\Sirsoft\Page\Services\PageAttachmentService; use Modules\Sirsoft\Page\Tests\FeatureTestCase; +use Symfony\Component\HttpFoundation\StreamedResponse; /** * 공개 페이지 API 테스트 @@ -37,8 +39,18 @@ class PublicPageControllerTest extends FeatureTestCase $storageMock->shouldReceive('deleteDirectory')->andReturn(true); $storageMock->shouldReceive('getDisk')->andReturn('local'); $storageMock->shouldReceive('url')->andReturn(null); - $storageMock->shouldReceive('response')->andReturn(null); + // 파일 서빙(다운로드/미리보기)은 200 스트리밍 응답을 반환 — 권한 게이트 검증용 + $storageMock->shouldReceive('response')->andReturnUsing( + fn () => new StreamedResponse(fn () => print ('file content'), 200) + ); $this->app->instance(StorageInterface::class, $storageMock); + + // PageAttachmentService 는 contextual binding 으로 모듈 도메인 Storage 를 받으므로 + // (AbstractExtensionServiceProvider::$storageServices), 전역 instance 만으로는 + // 오버라이드되지 않는다. 해당 서비스에도 mock 을 명시적으로 주입한다. + $this->app->when(PageAttachmentService::class) + ->needs(StorageInterface::class) + ->give(fn () => $storageMock); } /** @@ -107,6 +119,152 @@ class PublicPageControllerTest extends FeatureTestCase $response->assertStatus(404); } + // ─── 미발행 페이지 관리자 미리보기 ──────── + + /** + * 페이지 조회 권한(pages.read) 관리자는 미발행 페이지를 미리볼 수 있는지 확인 + */ + public function test_admin_with_read_permission_can_preview_unpublished_page(): void + { + $admin = $this->createAdminUser(['sirsoft-page.pages.read']); + + Page::factory()->create([ + 'slug' => 'test-draft-preview', + 'published' => false, + 'created_by' => $admin->id, + 'updated_by' => $admin->id, + ]); + + $response = $this->actingAs($admin) + ->getJson('/api/modules/sirsoft-page/pages/test-draft-preview'); + + $response->assertStatus(200) + ->assertJsonPath('success', true) + ->assertJsonPath('data.slug', 'test-draft-preview') + ->assertJsonPath('data.is_preview', true); + } + + /** + * 미발행 미리보기 응답의 첨부 URL이 공개 hash 라우트인지 확인 + * + * 썸네일 ·다운로드는 브라우저 직접 GET 이라 토큰을 실을 수 없어 인증 라우트로 + * 두면 401 로 깨진다. 게시판·이커머스 표준과 동일하게 공개 hash 라우트로 단일화하고, + * 미발행 콘텐츠 보안은 다운로드 권한 게이트(공개 라우트 내부)로 담당한다. + */ + public function test_admin_preview_unpublished_page_attachments_use_public_url(): void + { + $admin = $this->createAdminUser(['sirsoft-page.pages.read']); + + $page = Page::factory()->create([ + 'slug' => 'test-draft-preview-attach', + 'published' => false, + 'created_by' => $admin->id, + 'updated_by' => $admin->id, + ]); + + // 이미지 첨부 — preview_url 은 이미지에만 생성되므로 image mime 사용 + PageAttachment::create([ + 'page_id' => $page->id, + 'original_filename' => 'draft.png', + 'stored_filename' => 'stored-draft.png', + 'disk' => 'local', + 'path' => 'test/draft.png', + 'mime_type' => 'image/png', + 'size' => 1024, + 'collection' => 'attachments', + 'order' => 1, + 'created_by' => $admin->id, + ]); + + $response = $this->actingAs($admin) + ->getJson('/api/modules/sirsoft-page/pages/test-draft-preview-attach'); + + $response->assertStatus(200); + $downloadUrl = $response->json('data.attachments.0.download_url'); + $previewUrl = $response->json('data.attachments.0.preview_url'); + $this->assertStringContainsString('/pages/attachment/', $downloadUrl); + $this->assertStringContainsString('/pages/attachment/', $previewUrl); + $this->assertStringNotContainsString('/admin/attachments/', $downloadUrl); + $this->assertStringNotContainsString('/admin/attachments/', $previewUrl); + } + + /** + * 페이지 권한이 없는 일반 회원은 미발행 페이지를 미리볼 수 없음(404) + */ + public function test_non_admin_user_cannot_preview_unpublished_page(): void + { + $author = $this->createAdminUser([]); + $member = $this->createUser(); + + Page::factory()->create([ + 'slug' => 'test-draft-member', + 'published' => false, + 'created_by' => $author->id, + 'updated_by' => $author->id, + ]); + + $response = $this->actingAs($member) + ->getJson('/api/modules/sirsoft-page/pages/test-draft-member'); + + $response->assertStatus(404); + } + + /** + * pages.read 권한이 없는 관리자(다른 모듈 admin)는 미발행 페이지를 미리볼 수 없음(404) + */ + public function test_admin_without_pages_read_cannot_preview_unpublished_page(): void + { + // sirsoft-page.pages.read 가 아닌 다른 admin 권한만 보유 + $otherAdmin = $this->createAdminUser(['sirsoft-other.things.read']); + + Page::factory()->create([ + 'slug' => 'test-draft-other-admin', + 'published' => false, + 'created_by' => $otherAdmin->id, + 'updated_by' => $otherAdmin->id, + ]); + + $response = $this->actingAs($otherAdmin) + ->getJson('/api/modules/sirsoft-page/pages/test-draft-other-admin'); + + $response->assertStatus(404); + } + + /** + * 발행된 페이지의 첨부 URL은 관리자 요청이어도 공개용 라우트를 유지하는지 확인 + */ + public function test_published_page_attachments_use_public_url_even_for_admin(): void + { + $admin = $this->createAdminUser(['sirsoft-page.pages.read']); + + $page = Page::factory()->published()->create([ + 'slug' => 'test-published-admin-attach', + 'created_by' => $admin->id, + 'updated_by' => $admin->id, + ]); + + PageAttachment::create([ + 'page_id' => $page->id, + 'original_filename' => 'public.pdf', + 'stored_filename' => 'stored-public.pdf', + 'disk' => 'local', + 'path' => 'test/public.pdf', + 'mime_type' => 'application/pdf', + 'size' => 1024, + 'collection' => 'attachments', + 'order' => 1, + 'created_by' => $admin->id, + ]); + + $response = $this->actingAs($admin) + ->getJson('/api/modules/sirsoft-page/pages/test-published-admin-attach'); + + $response->assertStatus(200) + ->assertJsonPath('data.is_preview', false); + $downloadUrl = $response->json('data.attachments.0.download_url'); + $this->assertStringContainsString('/pages/attachment/', $downloadUrl); + } + /** * 발행된 페이지 조회 시 첨부파일 목록이 포함되는지 확인 */ @@ -133,7 +291,7 @@ class PublicPageControllerTest extends FeatureTestCase 'created_by' => $admin->id, ]); - $response = $this->getJson("/api/modules/sirsoft-page/pages/test-page-with-attach"); + $response = $this->getJson('/api/modules/sirsoft-page/pages/test-page-with-attach'); $response->assertStatus(200) ->assertJsonStructure([ @@ -199,4 +357,204 @@ class PublicPageControllerTest extends FeatureTestCase $response->assertStatus(404); } + + // ─── 썸네일(preview) 공개 서빙 매트릭스 (별건: 관리자 상세 썸네일 401 회귀) ─── + + /** + * 미발행 페이지의 이미지 첨부 미리보기(썸네일)는 비로그인이어도 200을 반환한다. + * + * 썸네일 는 토큰을 실을 수 없으므로 공개 hash 서빙으로 둔다. + * 보안은 hash 비추측성 + 파일 다운로드 권한 게이트가 담당한다(트레이드오프 수용). + */ + public function test_public_preview_unpublished_image_returns_200_for_guest(): void + { + $admin = $this->createAdminUser([]); + + $page = Page::factory()->create([ + 'slug' => 'test-draft-preview-guest', + 'published' => false, + 'created_by' => $admin->id, + 'updated_by' => $admin->id, + ]); + + $attachment = PageAttachment::create([ + 'page_id' => $page->id, + 'original_filename' => 'draft.png', + 'stored_filename' => 'stored-draft.png', + 'disk' => 'local', + 'path' => 'test/draft.png', + 'mime_type' => 'image/png', + 'size' => 1024, + 'collection' => 'attachments', + 'order' => 1, + 'created_by' => $admin->id, + ]); + + $response = $this->getJson("/api/modules/sirsoft-page/pages/attachment/{$attachment->hash}/preview"); + + $response->assertStatus(200); + } + + /** + * 발행 페이지의 이미지 첨부 미리보기(썸네일)는 200을 반환한다. + */ + public function test_public_preview_published_image_returns_200(): void + { + $admin = $this->createAdminUser([]); + + $page = Page::factory()->published()->create([ + 'slug' => 'test-pub-preview', + 'created_by' => $admin->id, + 'updated_by' => $admin->id, + ]); + + $attachment = PageAttachment::create([ + 'page_id' => $page->id, + 'original_filename' => 'pub.png', + 'stored_filename' => 'stored-pub.png', + 'disk' => 'local', + 'path' => 'test/pub.png', + 'mime_type' => 'image/png', + 'size' => 1024, + 'collection' => 'attachments', + 'order' => 1, + 'created_by' => $admin->id, + ]); + + $response = $this->getJson("/api/modules/sirsoft-page/pages/attachment/{$attachment->hash}/preview"); + + $response->assertStatus(200); + } + + // ─── 다운로드 권한 게이트 매트릭스 (별건: 관리자 상세 다운로드 401 회귀) ─── + + /** + * 미발행 페이지 첨부 다운로드는 비로그인에게 404로 차단된다. + */ + public function test_download_unpublished_attachment_blocked_for_guest(): void + { + $admin = $this->createAdminUser([]); + + $page = Page::factory()->create([ + 'slug' => 'test-dl-guest', + 'published' => false, + 'created_by' => $admin->id, + 'updated_by' => $admin->id, + ]); + + $attachment = PageAttachment::create([ + 'page_id' => $page->id, + 'original_filename' => 'secret.pdf', + 'stored_filename' => 'stored-secret.pdf', + 'disk' => 'local', + 'path' => 'test/secret.pdf', + 'mime_type' => 'application/pdf', + 'size' => 1024, + 'collection' => 'attachments', + 'order' => 1, + 'created_by' => $admin->id, + ]); + + $response = $this->getJson("/api/modules/sirsoft-page/pages/attachment/{$attachment->hash}"); + + $response->assertStatus(404); + } + + /** + * 미발행 페이지 첨부 다운로드는 권한 없는 일반 회원에게 404로 차단된다. + */ + public function test_download_unpublished_attachment_blocked_for_member(): void + { + $admin = $this->createAdminUser([]); + $member = $this->createUser(); + + $page = Page::factory()->create([ + 'slug' => 'test-dl-member', + 'published' => false, + 'created_by' => $admin->id, + 'updated_by' => $admin->id, + ]); + + $attachment = PageAttachment::create([ + 'page_id' => $page->id, + 'original_filename' => 'secret.pdf', + 'stored_filename' => 'stored-secret.pdf', + 'disk' => 'local', + 'path' => 'test/secret.pdf', + 'mime_type' => 'application/pdf', + 'size' => 1024, + 'collection' => 'attachments', + 'order' => 1, + 'created_by' => $admin->id, + ]); + + $response = $this->actingAs($member) + ->getJson("/api/modules/sirsoft-page/pages/attachment/{$attachment->hash}"); + + $response->assertStatus(404); + } + + /** + * 미발행 페이지 첨부 다운로드는 pages.read 권한 관리자에게 200(스트리밍)을 허용한다. + */ + public function test_download_unpublished_attachment_allowed_for_admin_with_read(): void + { + $admin = $this->createAdminUser(['sirsoft-page.pages.read']); + + $page = Page::factory()->create([ + 'slug' => 'test-dl-admin', + 'published' => false, + 'created_by' => $admin->id, + 'updated_by' => $admin->id, + ]); + + $attachment = PageAttachment::create([ + 'page_id' => $page->id, + 'original_filename' => 'draft.pdf', + 'stored_filename' => 'stored-draft.pdf', + 'disk' => 'local', + 'path' => 'test/draft.pdf', + 'mime_type' => 'application/pdf', + 'size' => 1024, + 'collection' => 'attachments', + 'order' => 1, + 'created_by' => $admin->id, + ]); + + $response = $this->actingAs($admin) + ->get("/api/modules/sirsoft-page/pages/attachment/{$attachment->hash}"); + + $response->assertStatus(200); + } + + /** + * 발행 페이지 첨부 다운로드는 누구나 200(스트리밍)을 허용한다. + */ + public function test_download_published_attachment_allowed_for_guest(): void + { + $admin = $this->createAdminUser([]); + + $page = Page::factory()->published()->create([ + 'slug' => 'test-dl-pub', + 'created_by' => $admin->id, + 'updated_by' => $admin->id, + ]); + + $attachment = PageAttachment::create([ + 'page_id' => $page->id, + 'original_filename' => 'pub.pdf', + 'stored_filename' => 'stored-pub.pdf', + 'disk' => 'local', + 'path' => 'test/pub.pdf', + 'mime_type' => 'application/pdf', + 'size' => 1024, + 'collection' => 'attachments', + 'order' => 1, + 'created_by' => $admin->id, + ]); + + $response = $this->get("/api/modules/sirsoft-page/pages/attachment/{$attachment->hash}"); + + $response->assertStatus(200); + } } diff --git a/modules/_bundled/sirsoft-page/tests/Playwright/fixtures/page-auth.ts b/modules/_bundled/sirsoft-page/tests/Playwright/fixtures/page-auth.ts new file mode 100644 index 00000000..4eb9d964 --- /dev/null +++ b/modules/_bundled/sirsoft-page/tests/Playwright/fixtures/page-auth.ts @@ -0,0 +1,54 @@ +/** + * 페이지 모듈 권한 fixture. + * + * 코어 `tests/Playwright/fixtures/auth.ts` 의 헬퍼(issueToken / authenticatePage)를 재사용하되, + * 모듈 권한 토큰 fixture 를 자체적으로 정의한다. 권한 식별자는 임의 string 이므로 코어 + * PlaywrightIssueToken 커맨드가 그대로 동작한다 (Permission::firstOrCreate 가 자동 생성). + * + * 권한 식별자 (module src 정의): + * sirsoft-page.pages.read / create / update / delete + * + * 활성화 절차 (페이지 모듈 후속 작업 세션): + * 1. 대상 화면 컴포넌트에 data-testid 보강 (각 spec docblock 의 "활성화 절차" 참조) + * 2. 해당 spec 의 test.describe.skip → test.describe 변경 + */ +import { test as base } from '@playwright/test'; +// 6단계 상위 = 코어 루트의 fixtures/auth.ts +// (modules/_bundled/sirsoft-page/tests/Playwright/fixtures → 코어 루트) +import { issueToken, authenticatePage } from '../../../../../../tests/Playwright/fixtures/auth'; + +type PageAuthFixtures = { + /** 페이지 조회 권한 토큰 (목록/상세 조회 검증용) */ + pageReadToken: string; + /** 페이지 조회 + 생성 권한 토큰 (등록 폼 검증용) */ + pageCreateToken: string; + /** 페이지 조회 + 수정 권한 토큰 (수정 폼/첨부/버전 검증용) */ + pageManageToken: string; + /** 권한 없는 일반 사용자 토큰 (메뉴/화면 미노출 검증용) */ + noPermissionToken: string; +}; + +export const test = base.extend({ + pageReadToken: async ({}, use) => { + await use(issueToken('sirsoft-page.pages.read')); + }, + pageCreateToken: async ({}, use) => { + await use(issueToken('sirsoft-page.pages.read', 'sirsoft-page.pages.create')); + }, + pageManageToken: async ({}, use) => { + await use( + issueToken( + 'sirsoft-page.pages.read', + 'sirsoft-page.pages.create', + 'sirsoft-page.pages.update' + ) + ); + }, + noPermissionToken: async ({}, use) => { + // 빈 권한 — 인증만 통과, 어떤 모듈 권한도 없음 + await use(issueToken()); + }, +}); + +export { authenticatePage }; +export { expect } from '@playwright/test'; diff --git a/modules/_bundled/sirsoft-page/tests/Playwright/fixtures/page-seed.ts b/modules/_bundled/sirsoft-page/tests/Playwright/fixtures/page-seed.ts new file mode 100644 index 00000000..a24010e8 --- /dev/null +++ b/modules/_bundled/sirsoft-page/tests/Playwright/fixtures/page-seed.ts @@ -0,0 +1,53 @@ +/** + * 페이지 모듈 도메인 시드 fixture (stub). + * + * `playwright:seed-page` artisan 커맨드를 호출하여 도메인 데이터(페이지 + 첨부)를 발급받는다. + * 본 stub 은 시드 커맨드가 LogicException 을 throw 하도록 구성되어 있어(시그니처/보안 가드만 구현) + * 실제 사용 전에는 대상 spec 이 test.describe.skip 로 비활성화되어야 한다. + * + * 활성화 절차 (페이지 모듈 후속 작업 세션): + * 1. PlaywrightSeedPage 의 handle() 본문을 LogicException 에서 실제 시드 로직으로 교체 + * (Page 모델 + 첨부 Factory 재사용, 업로드 순서 검증용 첨부 N건 포함) + * 2. 본 fixture 를 사용하는 spec 의 test.describe.skip 표기 제거 + * 3. teardown 시 cleanup 커맨드(예: playwright:cleanup-page) 호출 추가 권장 + */ +import { test as base } from '@playwright/test'; +import { execSync } from 'node:child_process'; +import { dirname, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +// ESM 환경(package.json "type": "module")에서는 __dirname 미정의 → import.meta.url 로 재구성. +const __dirname = dirname(fileURLToPath(import.meta.url)); + +type SeedFixtures = { + /** 시드된 페이지 도메인 데이터 (고정 슬러그 미발행/발행 페이지 + 첨부 ID 배열) */ + seededPage: { + unpublished_slug: string; + published_slug: string; + unpublished_id: number; + published_id: number; + attachment_ids: number[]; + }; +}; + +export const test = base.extend({ + seededPage: async ({}, use) => { + // 6단계 상위 = 코어 루트 (artisan 실행 cwd) + const coreRoot = process.env.G7_ROOT || resolve(__dirname, '../../../../../../'); + const out = execSync('php artisan playwright:seed-page --attachments=2 --json', { + cwd: coreRoot, + encoding: 'utf-8', + env: { + ...process.env, + G7_PLAYWRIGHT_BYPASS: '1', + }, + }); + // artisan 출력에 경고 등이 섞일 수 있으므로 마지막 JSON 라인만 파싱 + const jsonLine = out.trim().split(/\r?\n/).filter((l) => l.trim().startsWith('{')).pop() ?? '{}'; + const seed = JSON.parse(jsonLine); + await use(seed); + // TODO: teardown 시 cleanup 커맨드 호출 + }, +}); + +export { expect } from '@playwright/test'; diff --git a/modules/_bundled/sirsoft-page/tests/Playwright/playwright.config.ts b/modules/_bundled/sirsoft-page/tests/Playwright/playwright.config.ts new file mode 100644 index 00000000..8215cff8 --- /dev/null +++ b/modules/_bundled/sirsoft-page/tests/Playwright/playwright.config.ts @@ -0,0 +1,74 @@ +/** + * 페이지 모듈 Playwright E2E 설정. + * + * 코어 `playwright.config.ts` 및 이커머스 모듈 설정과 동일한 base URL 해석 우선순위를 따른다 — + * 모듈도 활성 호스트가 가변(개발자/CI/PO 환경별로 다른 도메인)이므로 하드코딩 회피. + * + * Base URL 해석: + * 1. PLAYWRIGHT_BASE_URL 환경변수 (CI/명시적 오버라이드) + * 2. .env (코어 루트) 의 APP_URL — 단 localhost 류는 fallback 부적합 + * 3. 그 외 — 명시 에러 + * + * 실행 예시: + * PowerShell — $env:PLAYWRIGHT_BASE_URL='https://g7.dev'; npm run test:e2e + * Bash — PLAYWRIGHT_BASE_URL=https://g7.dev npm run test:e2e + * + * 모듈은 코어 fixture 의 `issueToken` / `authenticatePage` 헬퍼를 재사용 — 권한 식별자는 + * `sirsoft-page.*` 등 임의 string. 시드는 모듈 자체 artisan 커맨드(playwright:seed-page) 호출. + */ +import { defineConfig, devices } from '@playwright/test'; +import { readFileSync, existsSync } from 'node:fs'; +import { dirname, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +// ESM 환경(package.json "type": "module")에서는 __dirname 이 정의되지 않으므로 +// import.meta.url 로 재구성한다. +const __dirname = dirname(fileURLToPath(import.meta.url)); + +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; +} + +function resolveBaseUrl(): string { + if (process.env.PLAYWRIGHT_BASE_URL) { + return process.env.PLAYWRIGHT_BASE_URL; + } + // 모듈 디렉토리 기준 5단계 상위 = 코어 루트 (.env 위치) + // (modules/_bundled/sirsoft-page/tests/Playwright → 코어 루트) + 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( + '페이지 모듈 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/modules/_bundled/sirsoft-page/tests/Playwright/specs/admin/page-attachment-order.spec.ts b/modules/_bundled/sirsoft-page/tests/Playwright/specs/admin/page-attachment-order.spec.ts new file mode 100644 index 00000000..b12e2307 --- /dev/null +++ b/modules/_bundled/sirsoft-page/tests/Playwright/specs/admin/page-attachment-order.spec.ts @@ -0,0 +1,63 @@ +/** + * 페이지 첨부 다중 업로드 순서 / 드래그 재정렬 → form.attachments 동기화 + * (placeholder — data-testid 보강 후 활성화). + * + * @scenario upload_count=single, upload_count=multiple, form_mode=create, form_mode=edit + * @effects temp_attachments_linked_in_upload_order_1_to_n, + * edit_mode_drag_persists_via_reorder_api + * + * e2e:allow 다중 업로드 시 첨부가 올린 순서대로 저장되고(생성 모드 temp_key 연결), + * 수정 모드 드래그 재정렬이 reorder API 로 즉시 저장되어 form.attachments 에 반영되는 + * 동작을 백엔드 Feature/Unit 테스트와 레이아웃 렌더 테스트가 커버한다. 본 placeholder + * spec(test.describe.skip)은 data-testid 보강 후 활성화된다. + * - 생성 모드 업로드 순서 1..N 재부여: PageAttachmentServiceTest (unit) + * - onUploadComplete/onReorder/onRemove → form.attachments 동기화: + * admin-page-layouts.test.ts > "첨부 순서 — form.attachments 동기화" (레이아웃 렌더) + * 브라우저 실제 드래그 인터랙션의 순서 영속만 본 spec 이 확인한다. + * + * 본 spec 은 다음 사전 작업 완료 후 활성화한다 (data-testid 보강): + * 1. FileUploader 첨부 아이템에 data-testid="page-attachment-item" (순서 assert 용) + * 2. 첨부 아이템 드래그 핸들에 data-testid="page-attachment-drag-handle" + * 3. seededPage fixture(playwright:seed-page) 실 시드 로직 구현 (첨부 N건 order 1..N) + * 4. test.describe.skip → test.describe 변경 + * + * 매트릭스(시나리오 매니페스트 page-attachment-order-and-seo-cache.yaml 의 upload_count × form_mode 와 1:1): + * - create × multiple: 업로드(조회) 순서대로 저장 후 목록 순서 유지 + * - edit × multiple: 드래그로 순서 변경 후 재조회 시 변경 순서 영속 + */ +import { mergeTests } from '@playwright/test'; +import { test as authTest, expect, authenticatePage } from '../../fixtures/page-auth'; +import { test as seedTest } from '../../fixtures/page-seed'; + +const test = mergeTests(authTest, seedTest); + +const CREATE_URL = '/admin/pages/create'; +const EDIT_URL = '/admin/pages/1/edit'; + +test.describe.skip('페이지 첨부 순서 동기화 (placeholder — data-testid 보강 후 활성화)', () => { + test('등록 폼에서 여러 첨부를 올리면 올린 순서대로 목록에 표시된다', async ({ + page, + pageCreateToken, + }) => { + await authenticatePage(page, pageCreateToken); + await page.goto(CREATE_URL); + + // (data-testid 보강 후) 파일 3건을 순차 업로드하고 목록 순서가 업로드 순서와 일치하는지 확인 + await expect(page.getByTestId('page-attachment-item')).toHaveCount(3); + }); + + test('수정 폼에서 첨부를 드래그로 재정렬하면 변경된 순서가 영속된다', async ({ + page, + pageManageToken, + seededPage, + }) => { + await authenticatePage(page, pageManageToken); + await page.goto(EDIT_URL); + + const items = page.getByTestId('page-attachment-item'); + await expect(items).toHaveCount(seededPage.attachmentIds.length); + + // (data-testid 보강 후) 첫 아이템을 마지막으로 드래그 → reorder API 발화 → 재조회 시 순서 영속 + // 드래그 인터랙션 + 재조회 후 순서 assert 는 활성화 시 구현 + }); +}); \ No newline at end of file diff --git a/modules/_bundled/sirsoft-page/tests/Playwright/specs/admin/page-form-cancel-navigation.spec.ts b/modules/_bundled/sirsoft-page/tests/Playwright/specs/admin/page-form-cancel-navigation.spec.ts new file mode 100644 index 00000000..b1bca0be --- /dev/null +++ b/modules/_bundled/sirsoft-page/tests/Playwright/specs/admin/page-form-cancel-navigation.spec.ts @@ -0,0 +1,58 @@ +/** + * 페이지 폼 취소 버튼 이동 경로 — 수정 모드는 상세로, 등록 모드는 목록으로 + * (placeholder — data-testid 보강 후 활성화). + * + * @scenario form_mode=create, form_mode=edit + * @effects cancel_in_edit_mode_navigates_to_detail, + * cancel_in_create_mode_navigates_to_list + * + * e2e:allow 취소 버튼이 navigateBack(history.back)이던 회귀 — 직전 위치(다른 관리 메뉴)로 + * 튀거나 URL 직접 진입 시 멈추던 문제를, navigate + route.id 분기(수정=상세 /admin/pages/{id}, + * 등록=목록 /admin/pages)로 교체했다. + * 레이아웃 렌더링 테스트(admin-page-layouts.test.ts > "[M6] 취소 버튼이 navigateBack 이 아니라 + * navigate 로 목록/상세를 명시함")가 핸들러가 navigateBack 이 아니라 navigate 이고 path 표현식이 + * route.id 분기를 가짐을 구조적으로 회귀 차단한다. 본 placeholder spec(test.describe.skip)은 + * 취소 버튼에 data-testid 보강 후 활성화되어 실제 라우트 이동(직접 진입 → 취소 → 목록/상세)을 확인한다. + * + * 본 spec 은 다음 사전 작업 완료 후 활성화한다: + * 1. 취소 버튼(footer_cancel_button)에 data-testid="page-form-cancel" + * 2. seededPage fixture(playwright:seed-page) 실 시드 로직 구현 + * 3. test.describe.skip → test.describe 변경 + * + * 매트릭스(시나리오 매니페스트 form_mode axis 와 1:1): + * - edit 모드 직접 진입 → 취소 → /admin/pages/{id} (상세) + * - create 모드 직접 진입 → 취소 → /admin/pages (목록) + */ +import { test, expect, authenticatePage } from '../../fixtures/page-auth'; + +const EDIT_URL = '/admin/pages/1/edit'; +const CREATE_URL = '/admin/pages/create'; + +test.describe.skip('페이지 폼 취소 이동 경로 (placeholder — data-testid 보강 후 활성화)', () => { + test('수정 폼에 직접 진입 후 취소하면 해당 페이지 상세로 이동한다', async ({ + page, + pageManageToken, + }) => { + await authenticatePage(page, pageManageToken); + + // URL 직접 진입 (직전 history 없음 — navigateBack 이면 목록/상세로 못 감) + await page.goto(EDIT_URL); + await page.getByTestId('page-form-cancel').click(); + + // 수정 모드 → 상세로 이동 + await expect(page).toHaveURL(new RegExp('/admin/pages/1$')); + }); + + test('등록 폼에 직접 진입 후 취소하면 목록으로 이동한다', async ({ + page, + pageCreateToken, + }) => { + await authenticatePage(page, pageCreateToken); + + await page.goto(CREATE_URL); + await page.getByTestId('page-form-cancel').click(); + + // 등록 모드 → 목록으로 이동 + await expect(page).toHaveURL(new RegExp('/admin/pages$')); + }); +}); diff --git a/modules/_bundled/sirsoft-page/tests/Playwright/specs/admin/page-form-reset-on-route-switch.spec.ts b/modules/_bundled/sirsoft-page/tests/Playwright/specs/admin/page-form-reset-on-route-switch.spec.ts new file mode 100644 index 00000000..725d0e94 --- /dev/null +++ b/modules/_bundled/sirsoft-page/tests/Playwright/specs/admin/page-form-reset-on-route-switch.spec.ts @@ -0,0 +1,82 @@ +/** + * 페이지 수정→등록 라우트 전환 시 폼/첨부/검증상태 잔존 차단 + 슬러그 미리보기 fallback + * (placeholder — data-testid 보강 후 활성화). + * + * @scenario form_mode=create, form_mode=edit + * @effects create_form_clears_stale_attachments_via_form_attachments_binding, + * create_form_clears_stale_title_slug_and_slug_check_state, + * slug_hint_url_preview_falls_back_to_example_on_empty_slug + * + * e2e:allow 수정→등록 SPA 라우트 전환 시 이전 페이지의 제목/슬러그/첨부/검증상태가 등록 폼에 + * 잔존하던 회귀와, 빈 슬러그에서 미리보기가 "/page/{{slug}}" 처럼 미치환되던 회귀를 + * 레이아웃 렌더 테스트가 구조적으로 차단한다. 본 placeholder spec(test.describe.skip)은 + * data-testid 보강 후 활성화된다. + * 레이아웃 렌더링 테스트(admin-page-layouts.test.ts > "수정→등록 SPA 전환 시 폼/첨부 잔존 차단")가 + * (1) 생성 모드 init_actions 가 _local.form 을 null→빈 기본값으로 초기화해 이전 + * id/title/slug/attachments 참조를 끊고, + * (2) FileUploader initialFiles 가 _local.form.attachments 에 바인딩되며, + * (3) slug_hint 가 빈 슬러그('')에서 || 'example' fallback 으로 {{slug}} 미치환을 차단함을 + * 구조적으로 회귀 차단한다. 브라우저 실 전환(라우트 A→B)의 리마운트 동작만 본 spec 이 확인한다. + * + * 본 spec 은 다음 사전 작업 완료 후 활성화한다 (data-testid 보강): + * 1. 페이지 제목 입력에 data-testid="page-title-input" + * 2. 슬러그 입력에 data-testid="page-slug-input" + * 3. 슬러그 URL 미리보기 텍스트에 data-testid="page-slug-hint" + * 4. 첨부 목록 컨테이너/아이템에 data-testid="page-attachment-item" + * 5. seededPage fixture(playwright:seed-page) 실 시드 로직 구현 + * 6. test.describe.skip → test.describe 변경 + * + * 매트릭스(시나리오 매니페스트 page-attachment-order-and-seo-cache.yaml 의 form_mode axis 와 1:1): + * - edit→create 전환: 이전 제목/슬러그/첨부가 등록 폼에 비워진 상태로 진입 + * - create 진입 직후: 슬러그 미입력 상태에서 미리보기가 "/page/example" + * - create 에서 슬러그 입력: 미리보기가 입력값으로 즉시 치환 + */ +import { test, expect, authenticatePage } from '../../fixtures/page-auth'; + +const EDIT_URL = '/admin/pages/1/edit'; +const CREATE_URL = '/admin/pages/create'; + +test.describe.skip('페이지 수정→등록 전환 잔존 차단 (placeholder — data-testid 보강 후 활성화)', () => { + test('수정 폼에서 등록 폼으로 전환하면 이전 제목/슬러그/첨부가 잔존하지 않는다', async ({ + page, + pageManageToken, + }) => { + await authenticatePage(page, pageManageToken); + + // 1) 수정 폼 진입 — 기존 페이지의 제목/슬러그/첨부가 채워진 상태 + await page.goto(EDIT_URL); + await expect(page.getByTestId('page-title-input')).not.toHaveValue(''); + + // 2) 등록 폼으로 SPA 전환 (같은 layout_name 재사용 경로) + await page.getByTestId('page-nav-create').click(); + await expect(page).toHaveURL(new RegExp('/admin/pages/create$')); + + // 3) 이전 값이 잔존하지 않아야 함 + await expect(page.getByTestId('page-title-input')).toHaveValue(''); + await expect(page.getByTestId('page-slug-input')).toHaveValue(''); + await expect(page.getByTestId('page-attachment-item')).toHaveCount(0); + }); + + test('등록 폼 진입 직후 슬러그 미입력이면 미리보기가 /page/example 로 표시된다', async ({ + page, + pageCreateToken, + }) => { + await authenticatePage(page, pageCreateToken); + await page.goto(CREATE_URL); + + // 빈 슬러그에서 {{slug}} 미치환이 아니라 example fallback + await expect(page.getByTestId('page-slug-hint')).toContainText('/page/example'); + await expect(page.getByTestId('page-slug-hint')).not.toContainText('{{slug}}'); + }); + + test('등록 폼에서 슬러그를 입력하면 미리보기가 입력값으로 즉시 치환된다', async ({ + page, + pageCreateToken, + }) => { + await authenticatePage(page, pageCreateToken); + await page.goto(CREATE_URL); + + await page.getByTestId('page-slug-input').fill('my-new-page'); + await expect(page.getByTestId('page-slug-hint')).toContainText('/page/my-new-page'); + }); +}); \ No newline at end of file diff --git a/modules/_bundled/sirsoft-page/tests/Playwright/specs/admin/page-version-changed-fields-i18n.spec.ts b/modules/_bundled/sirsoft-page/tests/Playwright/specs/admin/page-version-changed-fields-i18n.spec.ts new file mode 100644 index 00000000..29581c77 --- /dev/null +++ b/modules/_bundled/sirsoft-page/tests/Playwright/specs/admin/page-version-changed-fields-i18n.spec.ts @@ -0,0 +1,42 @@ +/** + * 페이지 상세 버전 이력의 변경 필드명 다국어 라벨 렌더 + * (placeholder — data-testid 보강 후 활성화). + * + * @scenario page_change=update + * @effects page_version_changed_fields_render_localized_labels + * + * e2e:allow 페이지 상세의 버전 이력 "변경 항목" 이 필드 키(title/slug/content 등) 원문 대신 + * 다국어 라벨로 표시되는 동작을 레이아웃 렌더 테스트가 구조적으로 커버한다. 본 + * placeholder spec(test.describe.skip)은 data-testid 보강 후 활성화된다. + * 레이아웃 렌더링 테스트(admin-page-layouts.test.ts > "변경내역 필드명 다국어 매핑")가 + * changes_summary.changed_fields 를 + * $t('sirsoft-page.admin.page.detail.versions.field_labels.') 로 매핑함을 + * 구조적으로 회귀 차단한다. 브라우저 실제 로케일 렌더만 본 spec 이 확인한다. + * + * 본 spec 은 다음 사전 작업 완료 후 활성화한다 (data-testid 보강): + * 1. 버전 이력 행의 변경 항목 셀에 data-testid="page-version-changed-fields" + * 2. seededPage fixture(playwright:seed-page) 실 시드 로직 구현 (버전 이력 있는 페이지) + * 3. test.describe.skip → test.describe 변경 + * + * 매트릭스(시나리오 매니페스트 page-attachment-order-and-seo-cache.yaml 의 page_change=update 와 1:1): + * - update 후 상세 진입: 변경 항목이 필드 키 원문이 아닌 다국어 라벨로 표시 + */ +import { test, expect, authenticatePage } from '../../fixtures/page-auth'; + +const DETAIL_URL = '/admin/pages/1'; + +test.describe.skip('페이지 버전 변경 필드 다국어 라벨 (placeholder — data-testid 보강 후 활성화)', () => { + test('버전 이력의 변경 항목이 필드 키 원문 대신 다국어 라벨로 표시된다', async ({ + page, + pageReadToken, + }) => { + await authenticatePage(page, pageReadToken); + await page.goto(DETAIL_URL); + + const changedFields = page.getByTestId('page-version-changed-fields').first(); + // 필드 키 원문(title/slug/content)이 그대로 노출되지 않아야 함 + await expect(changedFields).not.toHaveText(/\b(title|slug|content)\b/); + // 다국어 라벨(예: 제목/주소/내용)로 렌더 — 활성화 시 구체 라벨 assert + await expect(changedFields).not.toHaveText(''); + }); +}); \ No newline at end of file diff --git a/modules/_bundled/sirsoft-page/tests/Playwright/specs/user/unpublished-admin-preview.spec.ts b/modules/_bundled/sirsoft-page/tests/Playwright/specs/user/unpublished-admin-preview.spec.ts new file mode 100644 index 00000000..d5f78bf4 --- /dev/null +++ b/modules/_bundled/sirsoft-page/tests/Playwright/specs/user/unpublished-admin-preview.spec.ts @@ -0,0 +1,94 @@ +/** + * 미발행 페이지 관리자 미리보기. + * + * @scenario viewer=guest, viewer=member, viewer=other_admin, viewer=page_reader, published=published, published=unpublished + * @effects page_reader_admin_previews_unpublished_page_with_200, + * preview_banner_renders_when_is_preview_true, + * preview_banner_hidden_for_published_or_guest, + * guest_gets_404_for_unpublished_page, + * member_gets_404_for_unpublished_page + * + * 정책: 페이지 조회 권한(sirsoft-page.pages.read) 보유 관리자만 사용자 화면(/page/{slug})에서 + * 미발행 페이지를 미리볼 수 있고, 이때 "미발행 페이지 미리보기 중" 배너가 노출된다. + * 비로그인·일반 회원·페이지 권한 없는 관리자는 미발행 페이지에서 404(페이지를 찾을 수 없습니다) 를 본다. + * 발행 페이지는 누구에게나 배너 없이 노출된다. + * + * DOM 식별: 레이아웃 노드 id 는 HTML id 로 렌더되지 않으므로(콘텐츠 노드는 id 속성 미출력) + * 사용자에게 보이는 텍스트로 식별한다(getByText 는 콘텐츠 비동기 렌더를 auto-wait). + * - 미리보기 배너: "미발행 페이지 미리보기 중입니다" + * - not-found: "페이지를 찾을 수 없습니다" + * - 시드 페이지 제목: 미발행="미발행 미리보기 대상" / 발행="발행 대조군" + * + * 시드: playwright:seed-page 가 고정 슬러그를 발급한다. + * - 미발행: test-e2e-unpublished-preview (제목 "미발행 미리보기 대상") + * - 발행: test-e2e-published-preview (제목 "발행 대조군") + */ +import { mergeTests } from '@playwright/test'; +import { test as authTest, expect, authenticatePage } from '../../fixtures/page-auth'; +import { test as seedTest } from '../../fixtures/page-seed'; + +const test = mergeTests(authTest, seedTest); + +const UNPUBLISHED_URL = '/page/test-e2e-unpublished-preview'; +const PUBLISHED_URL = '/page/test-e2e-published-preview'; + +// 앱 locale(ko/en)에 무관하게 매칭 — 실행 환경 기본 locale 이 EN 일 수 있다. +// 제목은 seed 가 넣은 고정 문자열이라 locale 무관. +const PREVIEW_BANNER_TEXT = /미발행 페이지 미리보기 중입니다|Previewing an unpublished page/; +const NOT_FOUND_TEXT = /페이지를 찾을 수 없습니다|Page Not Found/; +const UNPUBLISHED_TITLE = '미발행 미리보기 대상'; +const PUBLISHED_TITLE = '발행 대조군'; + +test.describe('미발행 페이지 관리자 미리보기', () => { + test('페이지 조회 권한 관리자는 미발행 페이지를 미리보고 배너가 노출된다', async ({ + page, + pageReadToken, + seededPage, + }) => { + expect(seededPage.unpublished_slug).toBe('test-e2e-unpublished-preview'); + + await authenticatePage(page, pageReadToken); + await page.goto(UNPUBLISHED_URL); + + // 미발행이지만 권한자라 본문 노출 + 미리보기 배너 노출 + await expect(page.getByRole('heading', { name: UNPUBLISHED_TITLE })).toBeVisible({ timeout: 30_000 }); + await expect(page.getByText(PREVIEW_BANNER_TEXT)).toBeVisible(); + await expect(page.getByText(NOT_FOUND_TEXT)).toHaveCount(0); + }); + + test('비로그인 사용자는 미발행 페이지에서 not-found 를 본다', async ({ page, seededPage }) => { + expect(seededPage.unpublished_slug).toBe('test-e2e-unpublished-preview'); + + // 인증 없음(게스트) + await page.goto(UNPUBLISHED_URL); + + await expect(page.getByRole('heading', { name: NOT_FOUND_TEXT })).toBeVisible({ timeout: 30_000 }); + await expect(page.getByText(PREVIEW_BANNER_TEXT)).toHaveCount(0); + }); + + /* + * "권한 없는 로그인 사용자 / pages.read 없는 다른 모듈 관리자 → 404" 케이스는 E2E 로 + * 재현 불가하여 PHPUnit 이 담당한다. 근거: PlaywrightIssueToken.makeAdminUser 는 발급 유저를 + * 무조건 코어 `admin` 롤에 부여하는데, 활성 DB 의 admin 롤은 시드로 sirsoft-page.pages.read 를 + * 포함한 전체 권한(131개)을 이미 보유한다. 따라서 issueToken() 으로는 "페이지 권한이 없는 유저" + * 를 만들 수 없다(항상 pages.read 를 상속). 해당 게이트 분기는 아래 PHPUnit 이 격리 검증한다: + * - PublicPageControllerTest::test_non_admin_user_cannot_preview_unpublished_page + * - PublicPageControllerTest::test_admin_without_pages_read_cannot_preview_unpublished_page + * (createAdminUser 는 admin 롤에 명시 권한만 syncWithoutDetaching 하여 격리 가능) + */ + + test('발행된 페이지는 배너 없이 노출된다 (관리자 포함)', async ({ + page, + pageReadToken, + seededPage, + }) => { + expect(seededPage.published_slug).toBe('test-e2e-published-preview'); + + await authenticatePage(page, pageReadToken); + await page.goto(PUBLISHED_URL); + + await expect(page.getByRole('heading', { name: PUBLISHED_TITLE })).toBeVisible({ timeout: 30_000 }); + // 발행 페이지는 is_preview=false → 배너 미노출 + await expect(page.getByText(PREVIEW_BANNER_TEXT)).toHaveCount(0); + }); +}); \ No newline at end of file diff --git a/modules/_bundled/sirsoft-page/tests/Unit/Listeners/SeoPageCacheListenerTest.php b/modules/_bundled/sirsoft-page/tests/Unit/Listeners/SeoPageCacheListenerTest.php index 4860437c..1db416af 100644 --- a/modules/_bundled/sirsoft-page/tests/Unit/Listeners/SeoPageCacheListenerTest.php +++ b/modules/_bundled/sirsoft-page/tests/Unit/Listeners/SeoPageCacheListenerTest.php @@ -40,14 +40,18 @@ class SeoPageCacheListenerTest extends ModuleTestCase $this->assertArrayHasKey('sirsoft-page.page.after_create', $hooks); $this->assertArrayHasKey('sirsoft-page.page.after_update', $hooks); $this->assertArrayHasKey('sirsoft-page.page.after_delete', $hooks); + // 버전 복원도 SEO 캐시 무효화가 필요하다 (복원 후 봇에 복원 전 버전 잔존 회귀 방지) + $this->assertArrayHasKey('sirsoft-page.page.after_restore', $hooks); $this->assertEquals('onPageChange', $hooks['sirsoft-page.page.after_create']['method']); $this->assertEquals('onPageChange', $hooks['sirsoft-page.page.after_update']['method']); $this->assertEquals('onPageChange', $hooks['sirsoft-page.page.after_delete']['method']); + $this->assertEquals('onPageChange', $hooks['sirsoft-page.page.after_restore']['method']); $this->assertEquals(20, $hooks['sirsoft-page.page.after_create']['priority']); $this->assertEquals(20, $hooks['sirsoft-page.page.after_update']['priority']); $this->assertEquals(20, $hooks['sirsoft-page.page.after_delete']['priority']); + $this->assertEquals(20, $hooks['sirsoft-page.page.after_restore']['priority']); } // ─── onPageChange: 캐시 무효화 상태 검증 ────────────── @@ -135,6 +139,29 @@ class SeoPageCacheListenerTest extends ModuleTestCase $this->listener->onPageChange($page); } + /** + * onPageChange 호출 시 페이지 상세 URL 캐시가 URL 패턴으로 무효화되는지 확인합니다. + * + * 페이지 공개 URL은 단수형 /page/{slug} 이다 (PageSitemapContributor, SearchPagesListener 동일). + * 레이아웃 태그 없이 put()으로 캐시된 항목은 invalidateByLayout('page/show')로는 지워지지 않으므로, + * invalidateByUrl 의 와일드카드 패턴이 실제 URL(/page/{slug})과 일치해야만 무효화된다. + * + * 회귀 배경: 기존 패턴은 복수형 "*​/pages/{slug}" 라서 실제 단수형 URL과 매칭되지 않아 + * 레이아웃 태그가 없는 페이지 상세 캐시가 영구히 남았다. + */ + public function test_on_page_change_invalidates_page_detail_url_by_pattern(): void + { + $page = (object) ['id' => 6, 'slug' => 'pattern-page']; + + // 레이아웃 태그 없이 페이지 상세 URL 캐시 (URL 패턴 매칭으로만 무효화 가능) + $this->cache->put('/page/pattern-page', 'ko', 'detail'); + $this->assertContains('/page/pattern-page', $this->cache->getCachedUrls()); + + $this->listener->onPageChange($page); + + $this->assertNotContains('/page/pattern-page', $this->cache->getCachedUrls()); + } + // ─── handle (인터페이스 준수) ─────────────────────────── /** diff --git a/modules/_bundled/sirsoft-page/tests/Unit/Services/PageAttachmentServiceTest.php b/modules/_bundled/sirsoft-page/tests/Unit/Services/PageAttachmentServiceTest.php index 61a54acf..20fa5fa2 100644 --- a/modules/_bundled/sirsoft-page/tests/Unit/Services/PageAttachmentServiceTest.php +++ b/modules/_bundled/sirsoft-page/tests/Unit/Services/PageAttachmentServiceTest.php @@ -157,12 +157,40 @@ class PageAttachmentServiceTest extends ModuleTestCase $this->assertNull($tempAttachment->temp_key); } + /** + * 연결 시 업로드(조회) 순서대로 order가 1..N 재부여되는지 확인 + * + * 이커머스 ProductImageService::linkTempImages 와 동일하게, getByTempKey 가 + * order 순으로 반환한 순서대로 order 를 1,2,3 으로 재배치한다. (생성 모드의 + * 드래그 재정렬은 미지원 — 업로드 순서가 SSoT, 재정렬은 수정 모드 reorder API) + */ + public function test_link_reassigns_order_by_upload_sequence(): void + { + $page = Page::factory()->create([ + 'slug' => 'test-svc-link-order', + 'created_by' => $this->adminUser->id, + 'updated_by' => $this->adminUser->id, + ]); + + // 임시 첨부 3개 업로드 (order 는 업로드 시점에 1,2,3 순차 부여됨) + $a = $this->service->upload(UploadedFile::fake()->create('a.pdf', 100, 'application/pdf'), null, 'attachments', 'order-key'); + $b = $this->service->upload(UploadedFile::fake()->create('b.pdf', 100, 'application/pdf'), null, 'attachments', 'order-key'); + $c = $this->service->upload(UploadedFile::fake()->create('c.pdf', 100, 'application/pdf'), null, 'attachments', 'order-key'); + + $this->service->linkTempAttachmentsWithMove('order-key', $page->id); + + // 연결 후 업로드(조회) 순서대로 order 1,2,3 재부여 + $this->assertEquals(1, $a->fresh()->order); + $this->assertEquals(2, $b->fresh()->order); + $this->assertEquals(3, $c->fresh()->order); + } + // ─── deleteAttachment ────────────────────────────── /** * 첨부파일을 삭제할 수 있는지 확인 */ - public function test_delete_attachment_soft_deletes(): void + public function test_delete_attachment_hard_deletes(): void { $page = Page::factory()->create([ 'slug' => 'test-svc-del-attach', @@ -176,7 +204,7 @@ class PageAttachmentServiceTest extends ModuleTestCase $result = $this->service->deleteAttachment($attachment); $this->assertTrue($result); - $this->assertSoftDeleted('page_attachments', ['id' => $attachment->id]); + $this->assertDatabaseMissing('page_attachments', ['id' => $attachment->id]); } // ─── reorder ─────────────────────────────────────── diff --git a/modules/_bundled/sirsoft-page/tests/Unit/Services/PageServiceTest.php b/modules/_bundled/sirsoft-page/tests/Unit/Services/PageServiceTest.php index d9966f4d..6ee8ca29 100644 --- a/modules/_bundled/sirsoft-page/tests/Unit/Services/PageServiceTest.php +++ b/modules/_bundled/sirsoft-page/tests/Unit/Services/PageServiceTest.php @@ -4,6 +4,7 @@ namespace Modules\Sirsoft\Page\Tests\Unit\Services; use App\Enums\PermissionType; use App\Enums\ScopeType; +use App\Extension\HookManager; use App\Helpers\PermissionHelper; use App\Models\Permission; use App\Models\Role; @@ -144,16 +145,16 @@ class PageServiceTest extends ModuleTestCase // ─── deletePage ──────────────────────────────────── /** - * 페이지를 소프트 삭제할 수 있는지 확인 + * 페이지를 물리 삭제할 수 있는지 확인 */ - public function test_delete_page_soft_deletes(): void + public function test_delete_page_hard_deletes(): void { $page = $this->createTestPage('test-svc-delete'); $result = $this->service->deletePage($page); $this->assertTrue($result); - $this->assertSoftDeleted('pages', ['id' => $page->id]); + $this->assertDatabaseMissing('pages', ['id' => $page->id]); } // ─── changePublishStatus ─────────────────────────── @@ -206,6 +207,105 @@ class PageServiceTest extends ModuleTestCase ); $this->assertEquals(3, $count); + + // 일괄 발행 후 published/published_at 가 실제 갱신되는지 확인 + foreach ($pages as $page) { + $this->assertDatabaseHas('pages', [ + 'id' => $page->id, + 'published' => true, + ]); + } + } + + /** + * 일괄 발행 시 after_publish 훅이 페이지 수만큼 발화되는지 확인 (회귀) + * + * 일괄변경 경로가 after_publish 훅을 발화하지 않으면 활동로그가 기록되지 않는다. + * 단일 발행(changePublishStatus)과 동일하게 페이지별(per-item) 발화를 보장한다. + */ + public function test_bulk_change_publish_status_fires_after_publish_hook_per_page(): void + { + $pages = Page::factory()->count(3)->create([ + 'published' => false, + 'created_by' => $this->adminUser->id, + 'updated_by' => $this->adminUser->id, + ]); + + $firedPageIds = []; + $firedPublishedFlags = []; + HookManager::addAction( + 'sirsoft-page.page.after_publish', + function (Page $page, bool $published) use (&$firedPageIds, &$firedPublishedFlags) { + $firedPageIds[] = $page->id; + $firedPublishedFlags[] = $published; + } + ); + + $this->service->bulkChangePublishStatus($pages->pluck('id')->toArray(), true); + + // 페이지 수만큼 발화 + 각 페이지 id 가 1회씩 + $this->assertCount(3, $firedPageIds); + $this->assertEqualsCanonicalizing( + $pages->pluck('id')->toArray(), + $firedPageIds + ); + // 발행 인자가 모두 true + $this->assertSame([true, true, true], $firedPublishedFlags); + } + + /** + * 일괄 미발행 시 after_publish 훅이 published=false 로 발화되는지 확인 (회귀) + */ + public function test_bulk_change_publish_status_fires_unpublish_hook_per_page(): void + { + $pages = Page::factory()->published()->count(3)->create([ + 'created_by' => $this->adminUser->id, + 'updated_by' => $this->adminUser->id, + ]); + + $firedPublishedFlags = []; + HookManager::addAction( + 'sirsoft-page.page.after_publish', + function (Page $page, bool $published) use (&$firedPublishedFlags) { + $firedPublishedFlags[] = $published; + } + ); + + $this->service->bulkChangePublishStatus($pages->pluck('id')->toArray(), false); + + $this->assertSame([false, false, false], $firedPublishedFlags); + } + + /** + * 일괄 처리 도중 한 건이라도 실패하면 전체 롤백되는지 확인 (회귀) + * + * all-or-nothing: 존재하지 않는 id 가 섞이면 정상 페이지도 발행되지 않아야 한다. + */ + public function test_bulk_change_publish_status_rolls_back_on_failure(): void + { + $pages = Page::factory()->count(2)->create([ + 'published' => false, + 'created_by' => $this->adminUser->id, + 'updated_by' => $this->adminUser->id, + ]); + + $ids = $pages->pluck('id')->toArray(); + $ids[] = 999999; // 존재하지 않는 페이지 id + + try { + $this->service->bulkChangePublishStatus($ids, true); + $this->fail('존재하지 않는 페이지 id 포함 시 예외가 발생해야 한다.'); + } catch (\Throwable $e) { + // 예외 발생 기대 + } + + // 정상 페이지 2건도 발행되지 않아야 함 (전체 롤백) + foreach ($pages as $page) { + $this->assertDatabaseHas('pages', [ + 'id' => $page->id, + 'published' => false, + ]); + } } // ─── restoreVersion ──────────────────────────────── @@ -301,6 +401,35 @@ class PageServiceTest extends ModuleTestCase $this->assertNull($page); } + /** + * allowUnpublished=true 이면 미발행 페이지도 반환하는지 확인 (미리보기) + */ + public function test_get_published_page_by_slug_returns_draft_when_preview_allowed(): void + { + Page::factory()->create([ + 'slug' => 'test-svc-draft-preview', + 'published' => false, + 'created_by' => $this->adminUser->id, + 'updated_by' => $this->adminUser->id, + ]); + + $page = $this->service->getPublishedPageBySlug('test-svc-draft-preview', true); + + $this->assertNotNull($page); + $this->assertEquals('test-svc-draft-preview', $page->slug); + $this->assertFalse((bool) $page->published); + } + + /** + * allowUnpublished=true 여도 존재하지 않는 슬러그는 null 을 반환하는지 확인 + */ + public function test_get_published_page_by_slug_returns_null_for_missing_even_when_preview_allowed(): void + { + $page = $this->service->getPublishedPageBySlug('test-svc-no-such-slug', true); + + $this->assertNull($page); + } + // ─── scope 검증 (AccessDeniedHttpException) ──── /** diff --git a/modules/_bundled/sirsoft-page/tests/scenarios/page-attachment-order-and-seo-cache.yaml b/modules/_bundled/sirsoft-page/tests/scenarios/page-attachment-order-and-seo-cache.yaml new file mode 100644 index 00000000..3a243bf9 --- /dev/null +++ b/modules/_bundled/sirsoft-page/tests/scenarios/page-attachment-order-and-seo-cache.yaml @@ -0,0 +1,110 @@ +# audit:allow test-scenario-coverage reason: | +# 본 매니페스트는 서로 독립적인 5개 페이지 검수 결함(첨부 URL 컨텍스트 6-1 / 첨부 순서 6-2 / +# 수정→등록 폼 잔존 7 / SEO 캐시 무효화 12-2 / 버전 변경 필드 다국어 라벨 13)을 한 회귀 +# 매트릭스로 묶어 기록한다. 축(url_context/form_mode/upload_count/page_change/cached_entry)은 +# 결함별로 서로 무관해 full cross product(48케이스)에 "public × delete × multiple" 같은 +# 무의미 조합이 다수 포함되므로 docblock @scenario 전수 마킹이 부적합하다. +# 실제 회귀 가드는 test_files 의 통과 테스트가 결함별로 담당한다: +# 6-1 → PageControllerTest(Feature) / 6-2 → PageAttachmentServiceTest(Unit) + +# admin-page-layouts.test.ts(레이아웃 렌더) / 7(폼 잔존) → admin-page-layouts.test.ts / +# 12-2 → SeoPageCacheListenerTest(Unit) / 13 → admin-page-layouts.test.ts / +# 7(검증 안내 toast) → admin-page-layouts.test.ts(onUploadError→toast 핸들러 존재) + +# FileUploaderLimit.test.ts(개수 초과 발화). upload_validation 축은 용량/확장자/개수/정상 +# 4값이나 용량·확장자는 컴포넌트 기존 검증이라 레이아웃 핸들러 존재로, 개수는 훅 단위로 커버. +# E2E: 페이지 모듈에 Playwright 인프라를 이커머스와 동일 패턴으로 신설(config + page-auth/ +# page-seed fixture + playwright:seed-page stub)하고 spec 3건을 form_mode/upload_count/ +# page_change axis 와 1:1 매핑해 등록했으며, 대상 화면 data-testid 보강 전까지 skip placeholder +# 로 운용한다(이커머스 product-seo-input-debounce 와 동일 운용). +feature: 페이지 첨부 컨텍스트 URL / 다중 업로드 최종 순서 저장 / 페이지 변경 시 SEO 캐시 무효화 / 수정→등록 폼 잔존 차단 / 버전 변경 필드 다국어 라벨 + +description: | + 페이지 검수 오류 회귀를 한 매트릭스로 묶어 보장한다. + + 6-1 (첨부 URL — 공개 hash 단일화): + - 관리자/공개 화면 모두 공개 hash 라우트(/pages/attachment/{hash}[/preview])를 사용한다. + - 썸네일 ·다운로드
는 토큰을 실을 수 없어 인증 라우트에 물리면 401 로 깨진다. + 게시판·이커머스 표준과 동일하게 공개 hash 라우트로 단일화하고, 미발행 첨부 파일 다운로드 + 차단은 공개 라우트 내부 권한 게이트가 담당한다. (별건 page-attachment-serving.yaml 이 SSoT.) + + 6-2 (다중 업로드 / 첨부 순서 — 이커머스 상품 이미지와 동일 패턴): + - 생성 모드: temp_key 로 업로드된 첨부를 저장 시 업로드(조회) 순서대로 order 1..N 재부여 + (linkTempAttachmentsWithMove). 드래그 재정렬은 생성 모드에서 미지원 — 업로드 순서가 SSoT. + - 수정 모드: 드래그 시 즉시 reorder API(PATCH /attachments/reorder)로 순서를 저장하고, + onReorder 가 form.attachments 를 최종 순서로 동기화. + - 저장 body 는 _local.form + temp_key (이커머스 image_temp_key 와 동일). 별도 attachment_order + 페이로드/코어 emitEvent 결과 의존 없음. + - 등록 폼 잔존 버그: 수정→등록 라우트 전환은 같은 layout_name 이라 _local·컴포넌트가 보존된다. + FileUploader 의 initialFiles 를 pageData?.data?.attachments(등록 모드 absent → 참조 불변) 대신 + _local.form.attachments 에 바인딩하고, init_actions 에서 생성 모드 form 을 null→빈 기본값으로 + 초기화하여 참조를 바꿈으로써 동기화 useEffect 가 발화해 이전 첨부/제목/슬러그/검증상태가 비워진다. + slug_hint URL 미리보기는 빈 슬러그('')에서 || 'example' fallback 으로 {{slug}} 미치환을 차단. + (공용 FileUploader 컴포넌트·코어 템플릿 엔진 무수정 — 레이아웃 바인딩/init_actions 만 변경) + + 12-2 (SEO 캐시 무효화): + - 페이지 생성/수정/삭제 시 페이지 상세 SEO 캐시가 즉시 갱신돼야 한다. + - 공개 URL 은 단수형 /page/{slug} (PageSitemapContributor, SearchPagesListener 동일). + - 이전 패턴은 복수형 */pages/{slug} 라 실제 URL 과 매칭되지 않아, 레이아웃 태그 없이 + put() 으로 캐시된 상세 캐시가 영구히 남았다 → */page/{slug} 로 정정. + + 13 (버전 변경 필드 다국어 라벨): + - 페이지 상세 버전 이력의 "변경 항목" 이 필드 키(title/slug/content 등) 원문 대신 다국어 + 라벨로 표시돼야 한다. + - changes_summary.changed_fields 를 + $t('sirsoft-page.admin.page.detail.versions.field_labels.') 로 매핑. + + 14 (버전 복원 후 SEO 캐시 무효화): + - 특정 버전으로 복원하면 title/content/seo_meta 가 이전 버전으로 되돌아가므로, 수정과 + 동일하게 페이지 상세 SEO 캐시가 즉시 갱신돼야 한다. + - 회귀: SeoPageCacheListener 가 after_restore 를 미구독해 복원 후에도 봇에 복원 전 버전이 + 잔존 → after_restore 를 onPageChange 로 구독 추가(수정/삭제와 동일 무효화 정책). + +axes: + url_context: [public] + form_mode: [create, edit] + upload_count: [single, multiple] + page_change: [create, update, delete, restore] + cached_entry: [layout_tagged, url_only] + upload_validation: [size_exceeded, ext_not_allowed, count_exceeded, valid] + +effects: + - admin_detail_and_public_both_return_public_hash_url + - temp_attachments_linked_in_upload_order_1_to_n + - edit_mode_drag_persists_via_reorder_api + - create_form_clears_stale_attachments_via_form_attachments_binding + - create_form_clears_stale_title_slug_and_slug_check_state + - slug_hint_url_preview_falls_back_to_example_on_empty_slug + - page_change_invalidates_page_detail_url_by_singular_pattern + - page_change_invalidates_url_only_cached_detail_without_layout_tag + - page_change_invalidates_page_show_layout_cache + - page_change_invalidates_home_and_search_and_sitemap_cache + - page_restore_invalidates_page_detail_seo_cache + - page_restore_creates_new_version_and_preserves_history + - page_version_changed_fields_render_localized_labels + - attachment_size_or_ext_rejection_shows_error_toast + - attachment_count_exceeded_shows_error_toast_and_truncates + - valid_attachment_upload_shows_no_error_toast + +test_files: + - modules/_bundled/sirsoft-page/tests/Unit/Services/PageAttachmentServiceTest.php + - modules/_bundled/sirsoft-page/tests/Feature/Admin/PageControllerTest.php + - modules/_bundled/sirsoft-page/tests/Unit/Listeners/SeoPageCacheListenerTest.php + - modules/_bundled/sirsoft-page/resources/js/__tests__/layouts/admin-page-layouts.test.ts + - templates/_bundled/sirsoft-basic/src/components/composite/__tests__/FileUploaderLimit.test.ts + - modules/_bundled/sirsoft-page/tests/Playwright/specs/admin/page-form-reset-on-route-switch.spec.ts + - modules/_bundled/sirsoft-page/tests/Playwright/specs/admin/page-attachment-order.spec.ts + - modules/_bundled/sirsoft-page/tests/Playwright/specs/admin/page-version-changed-fields-i18n.spec.ts + +notes: | + 6-2 는 이커머스 상품 이미지(FileUploader + temp_key 연결 + reorder API)와 동일한 검증된 + 패턴으로 정렬했다. 생성 모드 업로드 순서 연결은 PageAttachmentServiceTest, 수정 모드 reorder 와 + 잔존 버그(라우트 전환 시 key 리마운트)는 admin_page_form 레이아웃 렌더 테스트로 확인. + 6-1 은 백엔드 Feature 테스트, 12-2 는 리스너 unit 테스트, 13 은 레이아웃 렌더 테스트로 커버. + 14 는 리스너 unit 테스트(after_restore 구독 단언) + Admin Feature 테스트(복원 엔드포인트 → + 상세 SEO 캐시 무효화 + 새 버전 생성·이력 보존)로 커버. + + E2E: 페이지 모듈에 Playwright 인프라(playwright.config.ts + page-auth/page-seed fixture + + playwright:seed-page stub 커맨드)를 이커머스와 동일 패턴으로 신설했다. spec 3건은 + form_mode / upload_count / page_change axis 와 1:1 매핑되며, 대상 화면에 data-testid 가 + 아직 없어 test.describe.skip placeholder 로 등록(각 spec docblock 에 활성화 절차 명시). + 실제 회귀 가드는 위 단위/Feature/레이아웃 렌더 테스트가 담당하고, spec 은 data-testid 보강 + + seed 로직 구현 후 활성화된다 (이커머스 product-seo-input-debounce 등과 동일 운용). diff --git a/modules/_bundled/sirsoft-page/tests/scenarios/page-attachment-serving.yaml b/modules/_bundled/sirsoft-page/tests/scenarios/page-attachment-serving.yaml new file mode 100644 index 00000000..3283efb3 --- /dev/null +++ b/modules/_bundled/sirsoft-page/tests/scenarios/page-attachment-serving.yaml @@ -0,0 +1,75 @@ +# audit:allow test-scenario-coverage reason: | +# 본 매니페스트는 첨부 서빙(preview 썸네일 / download 파일) 별건 결함의 serving_type × +# published × viewer cross product 를 기록한다. preview 는 모든 조합에서 공개 서빙(200), +# download 는 published=200 무조건 / unpublished 는 page_reader admin 만 200·나머지 404 로 +# 비대칭이다. 실제 회귀 가드는 test_files 의 Feature/레이아웃 테스트가 담당하므로 docblock +# @scenario 전수 마킹 대신 통과 테스트로 커버한다. +# E2E: 관리자 상세(admin_page_detail) 썸네일·다운로드는 페이지 모듈 Playwright 인프라 +# 보강 전까지 test.describe.skip placeholder 로 운용한다(기존 admin spec 3건과 동일 운용). +feature: 페이지 첨부 서빙 (썸네일 공개 hash 서빙 + 다운로드 권한 게이트) + +description: | + 별건(관리자 상세 첨부 썸네일·다운로드 미노출): 커밋 d48c684 가 관리자 화면 첨부 URL 을 + auth:sanctum 보호 admin 라우트로 바꿔, 토큰을 실을 수 없는 / 브라우저 직접 GET 이 + 발행/미발행 무관 401 로 깨지던 회귀를 수정한다. 게시판·이커머스 표준으로 정렬. + + 서빙 정책: + - preview(썸네일): 공개 hash 서빙. 는 인증 수단이 없어 모든 모듈이 공개로 둔다. + 보안은 hash(12자 랜덤) 비추측성 + 미발행 페이지 미노출에 의존. 발행/미발행 무관 200. + - download(파일): 권한 게이트. 발행 첨부는 누구나 200, 미발행 첨부는 + sirsoft-page.pages.read(admin) 보유자만 200, 그 외(비로그인/일반회원/무권한 admin) 404. + + 구현: + - PageAttachment::downloadUrl()/previewUrl() — 공개 hash URL 단일화(admin 분기 제거). + - PageAttachmentResource — urlContext/withContext 컨텍스트 인프라 제거(공개 URL 고정). + - PublicPageAttachmentController::preview — published 가드 제거(공개 서빙). + - PublicPageAttachmentController::download — Request 주입 + + published || user()?->hasPermission('sirsoft-page.pages.read', admin) 게이트. + - admin 첨부 preview/download 라우트·컨트롤러 메서드 제거(공개 라우트로 단일화 후 데드코드). + - admin_page_detail.json / page/show.json — 다운로드 → downloadAttachment 핸들러 + (토큰 fetch → blob) 전환. admin 다운로드 아이콘 arrow-down-tray(Heroicons·FA미존재) → download. + - page/show.json — 이미지 첨부는 preview_url 썸네일(, is_image 가드)로 표시(관리자 상세와 + 일관). 일반 파일은 파일 아이콘 유지. preview_url 이 공개 서빙이 되었으므로 백엔드 변경 불요. + + 수용된 트레이드오프: + - 썸네일 공개 → hash 보유 시 비로그인도 미발행 이미지 썸네일 조회 가능. 파일 다운로드는 + 권한으로 보호. 게시판·이커머스와 동일 수위(PO 수용). + +axes: + serving_type: [preview, download] + published: [published, unpublished] + viewer: [guest, member, page_reader_admin] + +effects: + - preview_published_returns_200_for_any_viewer + - preview_unpublished_returns_200_for_guest + - preview_nonexistent_hash_returns_404 + - download_published_returns_200_for_guest + - download_unpublished_blocked_404_for_guest + - download_unpublished_blocked_404_for_member + - download_unpublished_allowed_200_for_page_reader_admin + - attachment_urls_are_public_hash_route_even_for_admin_detail + - download_card_uses_downloadAttachment_handler_not_anchor + - download_icon_uses_valid_fa_name_not_heroicon + - user_page_image_attachment_renders_preview_thumbnail + - user_page_non_image_attachment_renders_file_icon + +test_files: + - modules/_bundled/sirsoft-page/tests/Feature/User/PublicPageControllerTest.php + - modules/_bundled/sirsoft-page/tests/Feature/Admin/PageControllerTest.php + - modules/_bundled/sirsoft-page/resources/js/__tests__/layouts/admin-page-detail-attachment-download.test.tsx + - templates/_bundled/sirsoft-basic/__tests__/layouts/page-attachment-download-handler.test.tsx + +notes: | + 회귀 가드 담당: + - preview/download × published × viewer 게이트 → PublicPageControllerTest(Feature). + - 관리자 상세 응답 첨부 URL 이 공개 hash 라우트인지 → PageControllerTest(Feature). + - admin_page_detail 다운로드 카드가 downloadAttachment 핸들러 + 아이콘 name=download → + admin-page-detail-attachment-download.test.tsx(레이아웃 렌더). + - page/show 다운로드가 downloadAttachment 핸들러 + 이미지 첨부 preview_url 썸네일(is_image 가드) + → page-attachment-download-handler.test.tsx. + + E2E: 관리자 상세 썸네일·다운로드 브라우저 검증은 Chrome MCP 실측으로 대체 확인 + (id=96 미발행 썸네일 3건 200 + 다운로드 아이콘 4건 렌더 + 다운로드 토큰동반 200, + genuinely unpublished(page_id=10) guest download 404 / preview 200). 페이지 모듈 + Playwright 인프라 보강 전까지 전용 spec 은 미작성(기존 admin spec 3건과 동일 운용). diff --git a/modules/_bundled/sirsoft-page/tests/scenarios/page-unpublished-admin-preview.yaml b/modules/_bundled/sirsoft-page/tests/scenarios/page-unpublished-admin-preview.yaml new file mode 100644 index 00000000..66ee4eb1 --- /dev/null +++ b/modules/_bundled/sirsoft-page/tests/scenarios/page-unpublished-admin-preview.yaml @@ -0,0 +1,67 @@ +# audit:allow test-scenario-coverage reason: | +# 본 매니페스트는 미발행 페이지 관리자 미리보기 단일 결함의 권한 × 발행상태 +# cross product 를 기록한다. viewer(guest/member/other_admin/page_reader) × published +# (published/unpublished) 8케이스 중 "미리보기 허용" 은 page_reader × unpublished 단 1조합이며, +# 나머지는 기존 동작(발행=200 공개 / 미발행=404) 유지다. 실제 회귀 가드는 test_files 의 +# Feature/Unit/레이아웃 테스트가 결함별로 담당하므로 docblock @scenario 전수 마킹 대신 +# 통과 테스트로 커버한다. +# E2E: 사용자 화면 미리보기 spec 은 페이지 모듈 Playwright 인프라(page-auth/page-seed fixture) +# 를 재사용하되, playwright:seed-page 시드 로직 + 대상 화면 data-testid 보강 전까지 +# test.describe.skip placeholder 로 운용한다(기존 admin spec 3건과 동일 운용). +feature: 미발행 페이지 관리자 미리보기 (권한자만 사용자 화면 노출 + 미리보기 배너 + 첨부 admin URL) + +description: | + 미발행 페이지는 관리자여도 사용자 화면(/page/{slug})에 접근할 수 없던 결함을 수정한다. + + 게이트 정책: + - 비로그인·일반 회원: 미발행 페이지 → 404 유지 (비공개). + - 페이지 조회 권한(sirsoft-page.pages.read, admin) 보유자: 미발행 페이지 → 200 미리보기. + - pages.read 없는 다른 모듈 admin: 404 (최소권한 — 관리자 상세 라우트와 동일 게이트). + - 발행 페이지: 모두 200 (기존 동작 무변경). + + 구현: + - PageService::getPublishedPageBySlug($slug, $allowUnpublished) — 허용 플래그로 미발행 반환. + - PublicPageController::show — optional.sanctum 로 인증된 사용자의 hasPermission(pages.read, admin) + 판정 후 플래그 전달. 권한 판정은 컨트롤러, Service 는 플래그만 수신(게시판 PostController 패턴). + - PublicPageResource::withPreview — is_preview 노출. (첨부 URL 컨텍스트 분기는 별건 + page-attachment-serving.yaml 에서 공개 hash 라우트로 단일화되어 제거됨.) + - page/show.json(sirsoft-basic) — is_preview=true 일 때 "미발행 페이지 미리보기 중" 배너 노출. + + 안전: + - SEO 캐시 오염 없음: 봇(게스트)은 미발행에 여전히 404 → 미리보기 콘텐츠가 봇 캐시에 안 들어감. + - 정보 노출 최소: published 전체가 아닌 is_preview(bool)만 추가 노출. + - 미발행 첨부 파일 다운로드 보호: 첨부 서빙은 공개 hash 라우트지만 다운로드는 권한 게이트로 + 미발행+비권한자를 404 차단(별건 page-attachment-serving.yaml). + +axes: + viewer: [guest, member, other_admin, page_reader] + published: [published, unpublished] + +effects: + - guest_sees_published_page + - guest_gets_404_for_unpublished_page + - member_gets_404_for_unpublished_page + - other_admin_without_pages_read_gets_404_for_unpublished_page + - page_reader_admin_previews_unpublished_page_with_200 + - preview_response_exposes_is_preview_true_only_for_unpublished_preview + - preview_attachments_use_public_hash_url + - published_page_attachments_use_public_hash_url_even_for_admin + - preview_banner_renders_when_is_preview_true + - preview_banner_hidden_for_published_or_guest + +test_files: + - modules/_bundled/sirsoft-page/tests/Feature/User/PublicPageControllerTest.php + - modules/_bundled/sirsoft-page/tests/Unit/Services/PageServiceTest.php + - templates/_bundled/sirsoft-basic/__tests__/layouts/page-show-preview-banner.test.tsx + - modules/_bundled/sirsoft-page/tests/Playwright/specs/user/unpublished-admin-preview.spec.ts + +notes: | + 회귀 가드 담당: + - 게이트(권한 4변종 × 발행상태) + is_preview 노출 + 첨부 컨텍스트 URL → PublicPageControllerTest(Feature). + - getPublishedPageBySlug 플래그 동작 격리 → PageServiceTest(Unit). + - 배너 if=is_preview 의존 + 다국어 키 + 위치 → page-show-preview-banner.test.tsx(레이아웃 렌더). + + E2E: 사용자 화면 미리보기 spec(unpublished-admin-preview.spec.ts)은 페이지 모듈 Playwright + 인프라(page-auth fixture 재사용, page-seed fixture)를 사용한다. playwright:seed-page 시드 로직과 + 대상 화면 data-testid 보강 전까지 test.describe.skip placeholder 로 등록하며(기존 admin spec 3건과 + 동일 운용), 실제 회귀 가드는 위 Feature/Unit/레이아웃 렌더 테스트가 담당한다. diff --git a/templates/_bundled/sirsoft-admin_basic/CHANGELOG.md b/templates/_bundled/sirsoft-admin_basic/CHANGELOG.md index 3a8b7adf..913eab99 100644 --- a/templates/_bundled/sirsoft-admin_basic/CHANGELOG.md +++ b/templates/_bundled/sirsoft-admin_basic/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.1] - 2026-07-06 + +### Changed + +- 첨부파일을 허용 개수보다 많이 선택했을 때의 안내 문구를 "이미지는 최대 N장까지…"에서 "최대 N개까지 첨부할 수 있습니다"로 바꿔, 이미지뿐 아니라 문서 등 일반 파일을 올리는 화면에서도 자연스럽게 표시되도록 했습니다. + ## [1.0.0] - 2026-07-01 ### Added diff --git a/templates/_bundled/sirsoft-admin_basic/lang/partial/en/attachment.json b/templates/_bundled/sirsoft-admin_basic/lang/partial/en/attachment.json index f0d99bd0..2d7702d6 100644 --- a/templates/_bundled/sirsoft-admin_basic/lang/partial/en/attachment.json +++ b/templates/_bundled/sirsoft-admin_basic/lang/partial/en/attachment.json @@ -7,7 +7,7 @@ "deleting": "Deleting...", "drop_or_click": "Drag and drop files or click to upload", "upload_limit": "Max {{maxFiles}} files, {{maxSize}}MB each", - "upload_limit_exceeded": "You can upload up to {{max}} images.", + "upload_limit_exceeded": "You can attach up to {{max}} files.", "attached_count": "{{count}}/{{max}} attached", "max_size": "Max {{size}}MB", "drag_to_reorder": "Drag to reorder", diff --git a/templates/_bundled/sirsoft-admin_basic/lang/partial/ko/attachment.json b/templates/_bundled/sirsoft-admin_basic/lang/partial/ko/attachment.json index cd179e01..90db89d7 100644 --- a/templates/_bundled/sirsoft-admin_basic/lang/partial/ko/attachment.json +++ b/templates/_bundled/sirsoft-admin_basic/lang/partial/ko/attachment.json @@ -7,7 +7,7 @@ "deleting": "삭제하는 중...", "drop_or_click": "파일을 드래그하거나 클릭하여 업로드", "upload_limit": "최대 {{maxFiles}}개, 개당 {{maxSize}}MB", - "upload_limit_exceeded": "이미지는 최대 {{max}}장까지 업로드할 수 있습니다.", + "upload_limit_exceeded": "최대 {{max}}개까지 첨부할 수 있습니다.", "attached_count": "{{count}}/{{max}}개 첨부됨", "max_size": "최대 {{size}}MB", "drag_to_reorder": "드래그하여 순서 변경", diff --git a/templates/_bundled/sirsoft-admin_basic/package-lock.json b/templates/_bundled/sirsoft-admin_basic/package-lock.json index 9550233f..fc2eb7a6 100644 --- a/templates/_bundled/sirsoft-admin_basic/package-lock.json +++ b/templates/_bundled/sirsoft-admin_basic/package-lock.json @@ -1,5920 +1,5920 @@ { - "name": "sirsoft-admin_basic", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "sirsoft-admin_basic", - "version": "1.0.0", - "license": "MIT", - "dependencies": { - "@dnd-kit/core": "^6.3.1", - "@dnd-kit/sortable": "^10.0.0", - "@dnd-kit/utilities": "^3.2.2", - "@fortawesome/fontawesome-free": "^7.1.0", - "@monaco-editor/react": "^4.7.0", - "browser-image-compression": "^2.0.2", - "chart.js": "^4.5.1", - "flag-icons": "^7.5.0", - "react-chartjs-2": "^5.3.1", - "react-select": "^5.10.2", - "yet-another-react-lightbox": "^3.27.0" - }, - "devDependencies": { - "@tailwindcss/postcss": "^4.2.2", - "@tailwindcss/vite": "^4.0.0", - "@testing-library/jest-dom": "^6.9.1", - "@testing-library/react": "^16.3.0", - "@testing-library/user-event": "^14.6.1", - "@types/react": "^19.0.0", - "@types/react-dom": "^19.0.0", - "@vitejs/plugin-react": "^5.1.0", - "axe-core": "^4.11.0", - "happy-dom": "^20.0.10", - "jsdom": "^28.1.0", - "tailwindcss": "^4.0.0", - "typescript": "^5.7.0", - "vite": "^7.0.4", - "vite-plugin-dts": "^4.5.4", - "vitest": "^4.0.6", - "vitest-axe": "^0.1.0" - }, - "peerDependencies": { - "react": "^19.0.0", - "react-dom": "^19.0.0" - } - }, - "node_modules/@acemir/cssom": { - "version": "0.9.31", - "resolved": "https://registry.npmjs.org/@acemir/cssom/-/cssom-0.9.31.tgz", - "integrity": "sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@adobe/css-tools": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz", - "integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@asamuzakjp/css-color": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.0.1.tgz", - "integrity": "sha512-2SZFvqMyvboVV1d15lMf7XiI3m7SDqXUuKaTymJYLN6dSGadqp+fVojqJlVoMlbZnlTmu3S0TLwLTJpvBMO1Aw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@csstools/css-calc": "^3.1.1", - "@csstools/css-color-parser": "^4.0.2", - "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-tokenizer": "^4.0.0", - "lru-cache": "^11.2.6" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { - "version": "11.2.6", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", - "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@asamuzakjp/dom-selector": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-6.8.1.tgz", - "integrity": "sha512-MvRz1nCqW0fsy8Qz4dnLIvhOlMzqDVBabZx6lH+YywFDdjXhMY37SmpV1XFX3JzG5GWHn63j6HX6QPr3lZXHvQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@asamuzakjp/nwsapi": "^2.3.9", - "bidi-js": "^1.0.3", - "css-tree": "^3.1.0", - "is-potential-custom-element-name": "^1.0.1", - "lru-cache": "^11.2.6" - } - }, - "node_modules/@asamuzakjp/dom-selector/node_modules/lru-cache": { - "version": "11.2.6", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", - "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@asamuzakjp/nwsapi": { - "version": "2.3.9", - "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz", - "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", - "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", - "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.4", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", - "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.5", - "@babel/types": "^7.28.5", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.28.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", - "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", - "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.5" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", - "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", - "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.28.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", - "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", - "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.5", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.5", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.5", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", - "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bramus/specificity": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz", - "integrity": "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==", - "dev": true, - "license": "MIT", - "dependencies": { - "css-tree": "^3.0.0" - }, - "bin": { - "specificity": "bin/cli.js" - } - }, - "node_modules/@csstools/color-helpers": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.0.2.tgz", - "integrity": "sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" + "name": "sirsoft-admin_basic", + "version": "1.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "sirsoft-admin_basic", + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "@dnd-kit/core": "^6.3.1", + "@dnd-kit/sortable": "^10.0.0", + "@dnd-kit/utilities": "^3.2.2", + "@fortawesome/fontawesome-free": "^7.1.0", + "@monaco-editor/react": "^4.7.0", + "browser-image-compression": "^2.0.2", + "chart.js": "^4.5.1", + "flag-icons": "^7.5.0", + "react-chartjs-2": "^5.3.1", + "react-select": "^5.10.2", + "yet-another-react-lightbox": "^3.27.0" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4.2.2", + "@tailwindcss/vite": "^4.0.0", + "@testing-library/jest-dom": "^6.9.1", + "@testing-library/react": "^16.3.0", + "@testing-library/user-event": "^14.6.1", + "@types/react": "^19.0.0", + "@types/react-dom": "^19.0.0", + "@vitejs/plugin-react": "^5.1.0", + "axe-core": "^4.11.0", + "happy-dom": "^20.0.10", + "jsdom": "^28.1.0", + "tailwindcss": "^4.0.0", + "typescript": "^5.7.0", + "vite": "^7.0.4", + "vite-plugin-dts": "^4.5.4", + "vitest": "^4.0.6", + "vitest-axe": "^0.1.0" + }, + "peerDependencies": { + "react": "^19.0.0", + "react-dom": "^19.0.0" + } }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "node_modules/@acemir/cssom": { + "version": "0.9.31", + "resolved": "https://registry.npmjs.org/@acemir/cssom/-/cssom-0.9.31.tgz", + "integrity": "sha512-ZnR3GSaH+/vJ0YlHau21FjfLYjMpYVIzTD8M8vIEQvIGxeOXyXdzCI140rrCY862p/C/BbzWsjc1dgnM9mkoTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@adobe/css-tools": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.4.tgz", + "integrity": "sha512-Elp+iwUx5rN5+Y8xLt5/GRoG20WGoDCQ/1Fb+1LiGtvwbDavuSk0jhD/eZdckHAuzcDzccnkv+rEjyWfRx18gg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@asamuzakjp/css-color": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.0.1.tgz", + "integrity": "sha512-2SZFvqMyvboVV1d15lMf7XiI3m7SDqXUuKaTymJYLN6dSGadqp+fVojqJlVoMlbZnlTmu3S0TLwLTJpvBMO1Aw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@csstools/css-calc": "^3.1.1", + "@csstools/css-color-parser": "^4.0.2", + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0", + "lru-cache": "^11.2.6" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { + "version": "11.2.6", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", + "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@asamuzakjp/dom-selector": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-6.8.1.tgz", + "integrity": "sha512-MvRz1nCqW0fsy8Qz4dnLIvhOlMzqDVBabZx6lH+YywFDdjXhMY37SmpV1XFX3JzG5GWHn63j6HX6QPr3lZXHvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/nwsapi": "^2.3.9", + "bidi-js": "^1.0.3", + "css-tree": "^3.1.0", + "is-potential-custom-element-name": "^1.0.1", + "lru-cache": "^11.2.6" + } + }, + "node_modules/@asamuzakjp/dom-selector/node_modules/lru-cache": { + "version": "11.2.6", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", + "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@asamuzakjp/nwsapi": { + "version": "2.3.9", + "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz", + "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz", + "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bramus/specificity": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz", + "integrity": "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "^3.0.0" + }, + "bin": { + "specificity": "bin/cli.js" + } + }, + "node_modules/@csstools/color-helpers": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.0.2.tgz", + "integrity": "sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@csstools/css-calc": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.1.1.tgz", + "integrity": "sha512-HJ26Z/vmsZQqs/o3a6bgKslXGFAungXGbinULZO3eMsOyNJHeBBZfup5FiZInOghgoM4Hwnmw+OgbJCNg1wwUQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-color-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.0.2.tgz", + "integrity": "sha512-0GEfbBLmTFf0dJlpsNU7zwxRIH0/BGEMuXLTCvFYxuL1tNhqzTbtnFICyJLTNK4a+RechKP75e7w42ClXSnJQw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/color-helpers": "^6.0.2", + "@csstools/css-calc": "^3.1.1" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^4.0.0", + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", + "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^4.0.0" + } + }, + "node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.0.tgz", + "integrity": "sha512-H4tuz2nhWgNKLt1inYpoVCfbJbMwX/lQKp3g69rrrIMIYlFD9+zTykOKhNR8uGrAmbS/kT9n6hTFkmDkxLgeTA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0" + }, + "node_modules/@csstools/css-tokenizer": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", + "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/@dnd-kit/accessibility": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.1.tgz", + "integrity": "sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@dnd-kit/core": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.3.1.tgz", + "integrity": "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==", + "license": "MIT", + "dependencies": { + "@dnd-kit/accessibility": "^3.1.1", + "@dnd-kit/utilities": "^3.2.2", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@dnd-kit/sortable": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@dnd-kit/sortable/-/sortable-10.0.0.tgz", + "integrity": "sha512-+xqhmIIzvAYMGfBYYnbKuNicfSsk4RksY2XdmJhT+HAC01nix6fHCztU68jooFiMUB01Ky3F0FyOvhG/BZrWkg==", + "license": "MIT", + "dependencies": { + "@dnd-kit/utilities": "^3.2.2", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "@dnd-kit/core": "^6.3.0", + "react": ">=16.8.0" + } + }, + "node_modules/@dnd-kit/utilities": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@dnd-kit/utilities/-/utilities-3.2.2.tgz", + "integrity": "sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.3.3", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/@emotion/babel-plugin/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", + "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==" + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==" + }, + "node_modules/@emotion/react": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", + "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.2", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==" + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", + "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@exodus/bytes": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.0.tgz", + "integrity": "sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@noble/hashes": "^1.8.0 || ^2.0.0" + }, + "peerDependenciesMeta": { + "@noble/hashes": { + "optional": true + } + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", + "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", + "dependencies": { + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", + "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", + "dependencies": { + "@floating-ui/core": "^1.7.3", + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==" + }, + "node_modules/@fortawesome/fontawesome-free": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-7.1.0.tgz", + "integrity": "sha512-+WxNld5ZCJHvPQCr/GnzCTVREyStrAJjisUPtUxG5ngDA8TMlPnKp6dddlTpai4+1GNmltAeuk1hJEkBohwZYA==", + "license": "(CC-BY-4.0 AND OFL-1.1 AND MIT)", + "engines": { + "node": ">=6" + } + }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@kurkle/color": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", + "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", + "license": "MIT" + }, + "node_modules/@microsoft/api-extractor": { + "version": "7.54.0", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.54.0.tgz", + "integrity": "sha512-t0SEcbVUPy4yAVykPafTNWktBg728X6p9t8qCuGDsYr1/lz2VQFihYDP2CnBFSArP5vwJPcvxktoKVSqH326cA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@microsoft/api-extractor-model": "7.31.3", + "@microsoft/tsdoc": "~0.15.1", + "@microsoft/tsdoc-config": "~0.17.1", + "@rushstack/node-core-library": "5.18.0", + "@rushstack/rig-package": "0.6.0", + "@rushstack/terminal": "0.19.3", + "@rushstack/ts-command-line": "5.1.3", + "diff": "~8.0.2", + "lodash": "~4.17.15", + "minimatch": "10.0.3", + "resolve": "~1.22.1", + "semver": "~7.5.4", + "source-map": "~0.6.1", + "typescript": "5.8.2" + }, + "bin": { + "api-extractor": "bin/api-extractor" + } + }, + "node_modules/@microsoft/api-extractor-model": { + "version": "7.31.3", + "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.31.3.tgz", + "integrity": "sha512-dv4quQI46p0U03TCEpasUf6JrJL3qjMN7JUAobsPElxBv4xayYYvWW9aPpfYV+Jx6hqUcVaLVOeV7+5hxsyoFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@microsoft/tsdoc": "~0.15.1", + "@microsoft/tsdoc-config": "~0.17.1", + "@rushstack/node-core-library": "5.18.0" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/typescript": { + "version": "5.8.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", + "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/@microsoft/api-extractor/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/@microsoft/tsdoc": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz", + "integrity": "sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@microsoft/tsdoc-config": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.17.1.tgz", + "integrity": "sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@microsoft/tsdoc": "0.15.1", + "ajv": "~8.12.0", + "jju": "~1.4.0", + "resolve": "~1.22.2" + } + }, + "node_modules/@monaco-editor/loader": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.6.1.tgz", + "integrity": "sha512-w3tEnj9HYEC73wtjdpR089AqkUPskFRcdkxsiSFt3SoUc3OHpmu+leP94CXBm4mHfefmhsdfI0ZQu6qJ0wgtPg==", + "license": "MIT", + "dependencies": { + "state-local": "^1.0.6" + } + }, + "node_modules/@monaco-editor/react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.7.0.tgz", + "integrity": "sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==", + "license": "MIT", + "dependencies": { + "@monaco-editor/loader": "^1.5.0" + }, + "peerDependencies": { + "monaco-editor": ">= 0.25.0 < 1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.43", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.43.tgz", + "integrity": "sha512-5Uxg7fQUCmfhax7FJke2+8B6cqgeUJUD9o2uXIKXhD+mG0mL6NObmVoi9wXEU1tY89mZKgAYA6fTbftx3q2ZPQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/pluginutils/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.5.tgz", + "integrity": "sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.5.tgz", + "integrity": "sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.5.tgz", + "integrity": "sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.5.tgz", + "integrity": "sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.5.tgz", + "integrity": "sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.5.tgz", + "integrity": "sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.5.tgz", + "integrity": "sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.5.tgz", + "integrity": "sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.5.tgz", + "integrity": "sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.5.tgz", + "integrity": "sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.5.tgz", + "integrity": "sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.5.tgz", + "integrity": "sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.5.tgz", + "integrity": "sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.5.tgz", + "integrity": "sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.5.tgz", + "integrity": "sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.5.tgz", + "integrity": "sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.5.tgz", + "integrity": "sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.5.tgz", + "integrity": "sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.5.tgz", + "integrity": "sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.5.tgz", + "integrity": "sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.5.tgz", + "integrity": "sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.5.tgz", + "integrity": "sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rushstack/node-core-library": { + "version": "5.18.0", + "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.18.0.tgz", + "integrity": "sha512-XDebtBdw5S3SuZIt+Ra2NieT8kQ3D2Ow1HxhDQ/2soinswnOu9e7S69VSwTOLlQnx5mpWbONu+5JJjDxMAb6Fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "~8.13.0", + "ajv-draft-04": "~1.0.0", + "ajv-formats": "~3.0.1", + "fs-extra": "~11.3.0", + "import-lazy": "~4.0.0", + "jju": "~1.4.0", + "resolve": "~1.22.1", + "semver": "~7.5.4" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/node-core-library/node_modules/ajv": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", + "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.4.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@rushstack/node-core-library/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true, + "license": "ISC" + }, + "node_modules/@rushstack/problem-matcher": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@rushstack/problem-matcher/-/problem-matcher-0.1.1.tgz", + "integrity": "sha512-Fm5XtS7+G8HLcJHCWpES5VmeMyjAKaWeyZU5qPzZC+22mPlJzAsOxymHiWIfuirtPckX3aptWws+K2d0BzniJA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/rig-package": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.6.0.tgz", + "integrity": "sha512-ZQmfzsLE2+Y91GF15c65L/slMRVhF6Hycq04D4TwtdGaUAbIXXg9c5pKA5KFU7M4QMaihoobp9JJYpYcaY3zOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve": "~1.22.1", + "strip-json-comments": "~3.1.1" + } + }, + "node_modules/@rushstack/terminal": { + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.19.3.tgz", + "integrity": "sha512-0P8G18gK9STyO+CNBvkKPnWGMxESxecTYqOcikHOVIHXa9uAuTK+Fw8TJq2Gng1w7W6wTC9uPX6hGNvrMll2wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rushstack/node-core-library": "5.18.0", + "@rushstack/problem-matcher": "0.1.1", + "supports-color": "~8.1.1" + }, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@rushstack/ts-command-line": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-5.1.3.tgz", + "integrity": "sha512-Kdv0k/BnnxIYFlMVC1IxrIS0oGQd4T4b7vKfx52Y2+wk2WZSDFIvedr7JrhenzSlm3ou5KwtoTGTGd5nbODRug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rushstack/terminal": "0.19.3", + "@types/argparse": "1.0.38", + "argparse": "~1.0.9", + "string-argv": "~0.3.1" + } + }, + "node_modules/@standard-schema/spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", + "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.17.tgz", + "integrity": "sha512-csIkHIgLb3JisEFQ0vxr2Y57GUNYh447C8xzwj89U/8fdW8LhProdxvnVH6U8M2Y73QKiTIH+LWbK3V2BBZsAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.1", + "lightningcss": "1.30.2", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.17" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.17.tgz", + "integrity": "sha512-F0F7d01fmkQhsTjXezGBLdrl1KresJTcI3DB8EkScCldyKp3Msz4hub4uyYaVnk88BAS1g5DQjjF6F5qczheLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.17", + "@tailwindcss/oxide-darwin-arm64": "4.1.17", + "@tailwindcss/oxide-darwin-x64": "4.1.17", + "@tailwindcss/oxide-freebsd-x64": "4.1.17", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.17", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.17", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.17", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.17", + "@tailwindcss/oxide-linux-x64-musl": "4.1.17", + "@tailwindcss/oxide-wasm32-wasi": "4.1.17", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.17", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.17" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.17.tgz", + "integrity": "sha512-BMqpkJHgOZ5z78qqiGE6ZIRExyaHyuxjgrJ6eBO5+hfrfGkuya0lYfw8fRHG77gdTjWkNWEEm+qeG2cDMxArLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.17.tgz", + "integrity": "sha512-EquyumkQweUBNk1zGEU/wfZo2qkp/nQKRZM8bUYO0J+Lums5+wl2CcG1f9BgAjn/u9pJzdYddHWBiFXJTcxmOg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.17.tgz", + "integrity": "sha512-gdhEPLzke2Pog8s12oADwYu0IAw04Y2tlmgVzIN0+046ytcgx8uZmCzEg4VcQh+AHKiS7xaL8kGo/QTiNEGRog==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.17.tgz", + "integrity": "sha512-hxGS81KskMxML9DXsaXT1H0DyA+ZBIbyG/sSAjWNe2EDl7TkPOBI42GBV3u38itzGUOmFfCzk1iAjDXds8Oh0g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.17.tgz", + "integrity": "sha512-k7jWk5E3ldAdw0cNglhjSgv501u7yrMf8oeZ0cElhxU6Y2o7f8yqelOp3fhf7evjIS6ujTI3U8pKUXV2I4iXHQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.17.tgz", + "integrity": "sha512-HVDOm/mxK6+TbARwdW17WrgDYEGzmoYayrCgmLEw7FxTPLcp/glBisuyWkFz/jb7ZfiAXAXUACfyItn+nTgsdQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.17.tgz", + "integrity": "sha512-HvZLfGr42i5anKtIeQzxdkw/wPqIbpeZqe7vd3V9vI3RQxe3xU1fLjss0TjyhxWcBaipk7NYwSrwTwK1hJARMg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.17.tgz", + "integrity": "sha512-M3XZuORCGB7VPOEDH+nzpJ21XPvK5PyjlkSFkFziNHGLc5d6g3di2McAAblmaSUNl8IOmzYwLx9NsE7bplNkwQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.17.tgz", + "integrity": "sha512-k7f+pf9eXLEey4pBlw+8dgfJHY4PZ5qOUFDyNf7SI6lHjQ9Zt7+NcscjpwdCEbYi6FI5c2KDTDWyf2iHcCSyyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.17.tgz", + "integrity": "sha512-cEytGqSSoy7zK4JRWiTCx43FsKP/zGr0CsuMawhH67ONlH+T79VteQeJQRO/X7L0juEUA8ZyuYikcRBf0vsxhg==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.6.0", + "@emnapi/runtime": "^1.6.0", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.0.7", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.6.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.6.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "1.0.7", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.5.0", + "@emnapi/runtime": "^1.5.0", + "@tybys/wasm-util": "^0.10.1" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": { + "version": "2.8.1", + "dev": true, + "inBundle": true, + "license": "0BSD", + "optional": true + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.17.tgz", + "integrity": "sha512-JU5AHr7gKbZlOGvMdb4722/0aYbU+tN6lv1kONx0JK2cGsh7g148zVWLM0IKR3NeKLv+L90chBVYcJ8uJWbC9A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.17.tgz", + "integrity": "sha512-SKWM4waLuqx0IH+FMDUw6R66Hu4OuTALFgnleKbqhgGU30DY20NORZMZUKgLRjQXNN2TLzKvh48QXTig4h4bGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.2.2.tgz", + "integrity": "sha512-n4goKQbW8RVXIbNKRB/45LzyUqN451deQK0nzIeauVEqjlI49slUlgKYJM2QyUzap/PcpnS7kzSUmPb1sCRvYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.2.2", + "@tailwindcss/oxide": "4.2.2", + "postcss": "^8.5.6", + "tailwindcss": "4.2.2" + } + }, + "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/node": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.2.tgz", + "integrity": "sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.5", + "enhanced-resolve": "^5.19.0", + "jiti": "^2.6.1", + "lightningcss": "1.32.0", + "magic-string": "^0.30.21", + "source-map-js": "^1.2.1", + "tailwindcss": "4.2.2" + } + }, + "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/oxide": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.2.tgz", + "integrity": "sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 20" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.2.2", + "@tailwindcss/oxide-darwin-arm64": "4.2.2", + "@tailwindcss/oxide-darwin-x64": "4.2.2", + "@tailwindcss/oxide-freebsd-x64": "4.2.2", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.2", + "@tailwindcss/oxide-linux-arm64-gnu": "4.2.2", + "@tailwindcss/oxide-linux-arm64-musl": "4.2.2", + "@tailwindcss/oxide-linux-x64-gnu": "4.2.2", + "@tailwindcss/oxide-linux-x64-musl": "4.2.2", + "@tailwindcss/oxide-wasm32-wasi": "4.2.2", + "@tailwindcss/oxide-win32-arm64-msvc": "4.2.2", + "@tailwindcss/oxide-win32-x64-msvc": "4.2.2" + } + }, + "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.2.tgz", + "integrity": "sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.2.tgz", + "integrity": "sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.2.tgz", + "integrity": "sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.2.tgz", + "integrity": "sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.2.tgz", + "integrity": "sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.2.tgz", + "integrity": "sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.2.tgz", + "integrity": "sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.2.tgz", + "integrity": "sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.2.tgz", + "integrity": "sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.2.tgz", + "integrity": "sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.8.1", + "@emnapi/runtime": "^1.8.1", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.1.1", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.8.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.8.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "dev": true, + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": { + "version": "2.8.1", + "dev": true, + "inBundle": true, + "license": "0BSD", + "optional": true + }, + "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.2.tgz", + "integrity": "sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.2.tgz", + "integrity": "sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/postcss/node_modules/lightningcss": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" + } + }, + "node_modules/@tailwindcss/postcss/node_modules/lightningcss-android-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/postcss/node_modules/lightningcss-darwin-arm64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/postcss/node_modules/lightningcss-darwin-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/postcss/node_modules/lightningcss-freebsd-x64": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/postcss/node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/postcss/node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/postcss/node_modules/lightningcss-linux-arm64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/postcss/node_modules/lightningcss-linux-x64-gnu": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/postcss/node_modules/lightningcss-linux-x64-musl": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/postcss/node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/postcss/node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@tailwindcss/postcss/node_modules/tailwindcss": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.2.tgz", + "integrity": "sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tailwindcss/vite": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.17.tgz", + "integrity": "sha512-4+9w8ZHOiGnpcGI6z1TVVfWaX/koK7fKeSYF3qlYg2xpBtbteP2ddBxiarL+HVgfSJGeK5RIxRQmKm4rTJJAwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@tailwindcss/node": "4.1.17", + "@tailwindcss/oxide": "4.1.17", + "tailwindcss": "4.1.17" + }, + "peerDependencies": { + "vite": "^5.2.0 || ^6 || ^7" + } + }, + "node_modules/@testing-library/dom": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", + "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "picocolors": "1.1.1", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", + "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@adobe/css-tools": "^4.4.0", + "aria-query": "^5.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.6.3", + "picocolors": "^1.1.1", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=14", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", + "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@testing-library/react": { + "version": "16.3.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.0.tgz", + "integrity": "sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@testing-library/dom": "^10.0.0", + "@types/react": "^18.0.0 || ^19.0.0", + "@types/react-dom": "^18.0.0 || ^19.0.0", + "react": "^18.0.0 || ^19.0.0", + "react-dom": "^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } + }, + "node_modules/@testing-library/user-event": { + "version": "14.6.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", + "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@types/argparse": { + "version": "1.0.38", + "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", + "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.24.tgz", + "integrity": "sha512-FE5u0ezmi6y9OZEzlJfg37mqqf6ZDSF2V/NLjUyGrR9uTZ7Sb9F7bLNZ03S4XVUNRWGA7Ck4c1kK+YnuWjl+DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" + }, + "node_modules/@types/react": { + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.2.tgz", + "integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==", + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.2.tgz", + "integrity": "sha512-9KQPoO6mZCi7jcIStSnlOWn2nEF3mNmyr3rIAsGnAbQKYbRLyqmeSc39EVgtxXVia+LMT8j3knZLAZAh+xLmrw==", + "devOptional": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.12", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", + "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", + "peerDependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/whatwg-mimetype": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/whatwg-mimetype/-/whatwg-mimetype-3.0.2.tgz", + "integrity": "sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitejs/plugin-react": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.0.tgz", + "integrity": "sha512-4LuWrg7EKWgQaMJfnN+wcmbAW+VSsCmqGohftWjuct47bv8uE4n/nPpq4XjJPsxgq00GGG5J8dvBczp8uxScew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.4", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.43", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.18.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/@vitest/expect": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.6.tgz", + "integrity": "sha512-5j8UUlBVhOjhj4lR2Nt9sEV8b4WtbcYh8vnfhTNA2Kn5+smtevzjNq+xlBuVhnFGXiyPPNzGrOVvmyHWkS5QGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@standard-schema/spec": "^1.0.0", + "@types/chai": "^5.2.2", + "@vitest/spy": "4.0.6", + "@vitest/utils": "4.0.6", + "chai": "^6.0.1", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.6.tgz", + "integrity": "sha512-3COEIew5HqdzBFEYN9+u0dT3i/NCwppLnO1HkjGfAP1Vs3vti1Hxm/MvcbC4DAn3Szo1M7M3otiAaT83jvqIjA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "4.0.6", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.19" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.6.tgz", + "integrity": "sha512-4vptgNkLIA1W1Nn5X4x8rLJBzPiJwnPc+awKtfBE5hNMVsoAl/JCCPPzNrbf+L4NKgklsis5Yp2gYa+XAS442g==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.6.tgz", + "integrity": "sha512-trPk5qpd7Jj+AiLZbV/e+KiiaGXZ8ECsRxtnPnCrJr9OW2mLB72Cb824IXgxVz/mVU3Aj4VebY+tDTPn++j1Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "4.0.6", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.6.tgz", + "integrity": "sha512-PaYLt7n2YzuvxhulDDu6c9EosiRuIE+FI2ECKs6yvHyhoga+2TBWI8dwBjs+IeuQaMtZTfioa9tj3uZb7nev1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.6", + "magic-string": "^0.30.19", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.6.tgz", + "integrity": "sha512-g9jTUYPV1LtRPRCQfhbMintW7BTQz1n6WXYQYRQ25qkyffA4bjVXjkROokZnv7t07OqfaFKw1lPzqKGk1hmNuQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.6.tgz", + "integrity": "sha512-bG43VS3iYKrMIZXBo+y8Pti0O7uNju3KvNn6DrQWhQQKcLavMB+0NZfO1/QBAEbq0MaQ3QjNsnnXlGQvsh0Z6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "4.0.6", + "tinyrainbow": "^3.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.23", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.23.tgz", + "integrity": "sha512-hEEd5ET/oSmBC6pi1j6NaNYRWoAiDhINbT8rmwtINugR39loROSlufGdYMF9TaKGfz+ViGs1Idi3mAhnuPcoGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.23" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.23", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.23.tgz", + "integrity": "sha512-Z1Uc8IB57Lm6k7q6KIDu/p+JWtf3xsXJqAX/5r18hYOTpJyBn0KXUR8oTJ4WFYOcDzWC9n3IflGgHowx6U6z9Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.23", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.23.tgz", + "integrity": "sha512-lAB5zJghWxVPqfcStmAP1ZqQacMpe90UrP5RJ3arDyrhy4aCUQqmxPPLB2PWDKugvylmO41ljK7vZ+t6INMTag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.23", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.24", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.24.tgz", + "integrity": "sha512-eDl5H57AOpNakGNAkFDH+y7kTqrQpJkZFXhWZQGyx/5Wh7B1uQYvcWkvZi11BDhscPgj8N7XV3oRwiPnx1Vrig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@vue/shared": "3.5.24", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-core/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.24", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.24.tgz", + "integrity": "sha512-1QHGAvs53gXkWdd3ZMGYuvQFXHW4ksKWPG8HP8/2BscrbZ0brw183q2oNWjMrSWImYLHxHrx1ItBQr50I/q2zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.24", + "@vue/shared": "3.5.24" + } + }, + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", + "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", + "dev": true, + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/@vue/language-core": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.0.tgz", + "integrity": "sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "~2.4.11", + "@vue/compiler-dom": "^3.5.0", + "@vue/compiler-vue2": "^2.7.16", + "@vue/shared": "^3.5.0", + "alien-signals": "^0.4.9", + "minimatch": "^9.0.3", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/language-core/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.24", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.24.tgz", + "integrity": "sha512-9cwHL2EsJBdi8NY22pngYYWzkTDhld6fAD6jlaeloNGciNSJL6bLpbxVgXl96X00Jtc6YWQv96YA/0sxex/k1A==", + "dev": true, + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-draft-04": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", + "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "ajv": "^8.5.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/alien-signals": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-0.4.14.tgz", + "integrity": "sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/axe-core": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.0.tgz", + "integrity": "sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.23", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.23.tgz", + "integrity": "sha512-616V5YX4bepJFzNyOfce5Fa8fDJMfoxzOIzDCZwaGL8MKVpFrXqfNUoIpRn9YMI5pXf/VKgzjB4htFMsFKKdiQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/bidi-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", + "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "require-from-string": "^2.0.2" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/browser-image-compression": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/browser-image-compression/-/browser-image-compression-2.0.2.tgz", + "integrity": "sha512-pBLlQyUf6yB8SmmngrcOw3EoS4RpQ1BcylI3T9Yqn7+4nrQTXJD4sJDe5ODnJdrvNMaio5OicFo75rDyJD2Ucw==", + "license": "MIT", + "dependencies": { + "uzip": "0.20201231.0" + } + }, + "node_modules/browserslist": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.27.0.tgz", + "integrity": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.8.19", + "caniuse-lite": "^1.0.30001751", + "electron-to-chromium": "^1.5.238", + "node-releases": "^2.0.26", + "update-browserslist-db": "^1.1.4" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001753", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001753.tgz", + "integrity": "sha512-Bj5H35MD/ebaOV4iDLqPEtiliTN29qkGtEHCwawWn4cYm+bPJM2NsaP30vtZcnERClMzp52J4+aw2UNbK4o+zw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chai": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.0.tgz", + "integrity": "sha512-aUTnJc/JipRzJrNADXVvpVqi6CO0dn3nx4EVPxijri+fj3LUUDyZQOgVeW54Ob3Y1Xh9Iz8f+CgaCl8v0mn9bA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/chalk": { + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", + "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chart.js": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.1.tgz", + "integrity": "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==", + "license": "MIT", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=8" + } + }, + "node_modules/compare-versions": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", + "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", + "dev": true, + "license": "MIT" + }, + "node_modules/confbox": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", + "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cosmiconfig/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/css-tree": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cssstyle": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-6.2.0.tgz", + "integrity": "sha512-Fm5NvhYathRnXNVndkUsCCuR63DCLVVwGOOwQw782coXFi5HhkXdu289l59HlXZBawsyNccXfWRYvLzcDCdDig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@asamuzakjp/css-color": "^5.0.1", + "@csstools/css-syntax-patches-for-csstree": "^1.0.28", + "css-tree": "^3.1.0", + "lru-cache": "^11.2.6" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/cssstyle/node_modules/lru-cache": { + "version": "11.2.6", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", + "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/data-urls": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-7.0.0.tgz", + "integrity": "sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^16.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/data-urls/node_modules/whatwg-mimetype": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", + "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", + "dev": true, + "license": "MIT" + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/diff": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz", + "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "license": "MIT" + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/dompurify": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.7.tgz", + "integrity": "sha512-VaTstWtsneJY8xzy7DekmYWEOZcmzIe3Qb3zPd4STve1OBTa+e+WmS1ITQec1fZYXI3HCsOZZiSMpG6oxoWMWQ==", + "license": "(MPL-2.0 OR Apache-2.0)", + "peer": true + }, + "node_modules/electron-to-chromium": { + "version": "1.5.244", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.244.tgz", + "integrity": "sha512-OszpBN7xZX4vWMPJwB9illkN/znA8M36GQqQxi6MNy9axWxhOfJyZZJtSLQCpEFLHP2xK33BiWx9aIuIEXVCcw==", + "dev": true, + "license": "ISC" + }, + "node_modules/enhanced-resolve": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", + "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/expect-type": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz", + "integrity": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/exsolve": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.7.tgz", + "integrity": "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, + "node_modules/flag-icons": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/flag-icons/-/flag-icons-7.5.0.tgz", + "integrity": "sha512-kd+MNXviFIg5hijH766tt+3x76ele1AXlo4zDdCxIvqWZhKt4T83bOtxUOOMlTx/EcFdUMH5yvQgYlFh1EqqFg==", + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", + "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/happy-dom": { + "version": "20.0.10", + "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-20.0.10.tgz", + "integrity": "sha512-6umCCHcjQrhP5oXhrHQQvLB0bwb1UzHAHdsXy+FjtKoYjUhmNZsQL8NivwM1vDvNEChJabVrUYxUnp/ZdYmy2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "^20.0.0", + "@types/whatwg-mimetype": "^3.0.2", + "whatwg-mimetype": "^3.0.0" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoist-non-react-statics/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/html-encoding-sniffer": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", + "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.6.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/jju": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", + "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/jsdom": { + "version": "28.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-28.1.0.tgz", + "integrity": "sha512-0+MoQNYyr2rBHqO1xilltfDjV9G7ymYGlAUazgcDLQaUf8JDHbuGwsxN6U9qWaElZ4w1B2r7yEGIL3GdeW3Rug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@acemir/cssom": "^0.9.31", + "@asamuzakjp/dom-selector": "^6.8.1", + "@bramus/specificity": "^2.4.2", + "@exodus/bytes": "^1.11.0", + "cssstyle": "^6.0.1", + "data-urls": "^7.0.0", + "decimal.js": "^10.6.0", + "html-encoding-sniffer": "^6.0.0", + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.6", + "is-potential-custom-element-name": "^1.0.1", + "parse5": "^8.0.0", + "saxes": "^6.0.0", + "symbol-tree": "^3.2.4", + "tough-cookie": "^6.0.0", + "undici": "^7.21.0", + "w3c-xmlserializer": "^5.0.0", + "webidl-conversions": "^8.0.1", + "whatwg-mimetype": "^5.0.0", + "whatwg-url": "^16.0.0", + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "canvas": "^3.0.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/whatwg-mimetype": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", + "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", + "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lightningcss": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", + "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.30.2", + "lightningcss-darwin-arm64": "1.30.2", + "lightningcss-darwin-x64": "1.30.2", + "lightningcss-freebsd-x64": "1.30.2", + "lightningcss-linux-arm-gnueabihf": "1.30.2", + "lightningcss-linux-arm64-gnu": "1.30.2", + "lightningcss-linux-arm64-musl": "1.30.2", + "lightningcss-linux-x64-gnu": "1.30.2", + "lightningcss-linux-x64-musl": "1.30.2", + "lightningcss-win32-arm64-msvc": "1.30.2", + "lightningcss-win32-x64-msvc": "1.30.2" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", + "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", + "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", + "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", + "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", + "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", + "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", + "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", + "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", + "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", + "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/local-pkg": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.2.tgz", + "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/marked": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-14.0.0.tgz", + "integrity": "sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==", + "license": "MIT", + "peer": true, + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mdn-data": { + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "10.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", + "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mlly": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", + "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.15.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.1" + } + }, + "node_modules/mlly/node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/mlly/node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/monaco-editor": { + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.54.0.tgz", + "integrity": "sha512-hx45SEUoLatgWxHKCmlLJH81xBo0uXP4sRkESUpmDQevfi+e7K1VuiSprK6UpQ8u4zOcKNiH0pMvHvlMWA/4cw==", + "license": "MIT", + "peer": true, + "dependencies": { + "dompurify": "3.1.7", + "marked": "14.0.0" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.27", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", + "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", + "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", + "dev": true, + "license": "MIT", + "dependencies": { + "entities": "^6.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", + "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-chartjs-2": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-5.3.1.tgz", + "integrity": "sha512-h5IPXKg9EXpjoBzUfyWJvllMjG2mQ4EiuHQFhms/AjUm0XSZHhyRy2xVmLXHKrtcdrPO4mnGqRtYoD0vp95A0A==", + "license": "MIT", + "peerDependencies": { + "chart.js": "^4.1.1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz", + "integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.0" + } + }, + "node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT", + "peer": true + }, + "node_modules/react-refresh": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", + "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-select": { + "version": "5.10.2", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.10.2.tgz", + "integrity": "sha512-Z33nHdEFWq9tfnfVXaiM12rbJmk+QjFEztWLtmXqQhz6Al4UZZ9xc0wiatmGtUOCCnHN0WizL3tCMYRENX4rVQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.0", + "@emotion/cache": "^11.4.0", + "@emotion/react": "^11.8.1", + "@floating-ui/dom": "^1.0.1", + "@types/react-transition-group": "^4.4.0", + "memoize-one": "^6.0.0", + "prop-types": "^15.6.0", + "react-transition-group": "^4.3.0", + "use-isomorphic-layout-effect": "^1.2.0" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/rollup": { + "version": "4.52.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.5.tgz", + "integrity": "sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.52.5", + "@rollup/rollup-android-arm64": "4.52.5", + "@rollup/rollup-darwin-arm64": "4.52.5", + "@rollup/rollup-darwin-x64": "4.52.5", + "@rollup/rollup-freebsd-arm64": "4.52.5", + "@rollup/rollup-freebsd-x64": "4.52.5", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.5", + "@rollup/rollup-linux-arm-musleabihf": "4.52.5", + "@rollup/rollup-linux-arm64-gnu": "4.52.5", + "@rollup/rollup-linux-arm64-musl": "4.52.5", + "@rollup/rollup-linux-loong64-gnu": "4.52.5", + "@rollup/rollup-linux-ppc64-gnu": "4.52.5", + "@rollup/rollup-linux-riscv64-gnu": "4.52.5", + "@rollup/rollup-linux-riscv64-musl": "4.52.5", + "@rollup/rollup-linux-s390x-gnu": "4.52.5", + "@rollup/rollup-linux-x64-gnu": "4.52.5", + "@rollup/rollup-linux-x64-musl": "4.52.5", + "@rollup/rollup-openharmony-arm64": "4.52.5", + "@rollup/rollup-win32-arm64-msvc": "4.52.5", + "@rollup/rollup-win32-ia32-msvc": "4.52.5", + "@rollup/rollup-win32-x64-gnu": "4.52.5", + "@rollup/rollup-win32-x64-msvc": "4.52.5", + "fsevents": "~2.3.2" + } + }, + "node_modules/saxes": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", + "dev": true, + "license": "ISC", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=v12.22.7" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT", + "peer": true + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, + "node_modules/state-local": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", + "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==", + "license": "MIT" + }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-argv": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tailwindcss": { + "version": "4.1.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.17.tgz", + "integrity": "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyrainbow": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", + "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tldts": { + "version": "7.0.25", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.25.tgz", + "integrity": "sha512-keinCnPbwXEUG3ilrWQZU+CqcTTzHq9m2HhoUP2l7Xmi8l1LuijAXLpAJ5zRW+ifKTNscs4NdCkfkDCBYm352w==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^7.0.25" + }, + "bin": { + "tldts": "bin/cli.js" + } + }, + "node_modules/tldts-core": { + "version": "7.0.25", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.25.tgz", + "integrity": "sha512-ZjCZK0rppSBu7rjHYDYsEaMOIbbT+nWF57hKkv4IUmZWBNrBWBOjIElc0mKRgLM8bm7x/BBlof6t2gi/Oq/Asw==", + "dev": true, + "license": "MIT" + }, + "node_modules/tough-cookie": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", + "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tldts": "^7.0.5" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tr46": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", + "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", + "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", + "dev": true, + "license": "MIT" + }, + "node_modules/undici": { + "version": "7.24.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.0.tgz", + "integrity": "sha512-jxytwMHhsbdpBXxLAcuu0fzlQeXCNnWdDyRHpvWsUl8vd98UwYdl9YTyn8/HcpcJPC3pwUveefsa3zTxyD/ERg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", + "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-isomorphic-layout-effect": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.1.tgz", + "integrity": "sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/uzip": { + "version": "0.20201231.0", + "resolved": "https://registry.npmjs.org/uzip/-/uzip-0.20201231.0.tgz", + "integrity": "sha512-OZeJfZP+R0z9D6TmBgLq2LHzSSptGMGDGigGiEe0pr8UBe/7fdflgHlHBNDASTXB5jnFuxHpNaJywSg8YFeGng==", + "license": "MIT" + }, + "node_modules/vite": { + "version": "7.1.12", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.12.tgz", + "integrity": "sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-plugin-dts": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-4.5.4.tgz", + "integrity": "sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@microsoft/api-extractor": "^7.50.1", + "@rollup/pluginutils": "^5.1.4", + "@volar/typescript": "^2.4.11", + "@vue/language-core": "2.2.0", + "compare-versions": "^6.1.1", + "debug": "^4.4.0", + "kolorist": "^1.8.0", + "local-pkg": "^1.0.0", + "magic-string": "^0.30.17" + }, + "peerDependencies": { + "typescript": "*", + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vitest": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.6.tgz", + "integrity": "sha512-gR7INfiVRwnEOkCk47faros/9McCZMp5LM+OMNWGLaDBSvJxIzwjgNFufkuePBNaesGRnLmNfW+ddbUJRZn0nQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "4.0.6", + "@vitest/mocker": "4.0.6", + "@vitest/pretty-format": "4.0.6", + "@vitest/runner": "4.0.6", + "@vitest/snapshot": "4.0.6", + "@vitest/spy": "4.0.6", + "@vitest/utils": "4.0.6", + "debug": "^4.4.3", + "es-module-lexer": "^1.7.0", + "expect-type": "^1.2.2", + "magic-string": "^0.30.19", + "pathe": "^2.0.3", + "picomatch": "^4.0.3", + "std-env": "^3.9.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.15", + "tinyrainbow": "^3.0.3", + "vite": "^6.0.0 || ^7.0.0", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^20.0.0 || ^22.0.0 || >=24.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/debug": "^4.1.12", + "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", + "@vitest/browser-playwright": "4.0.6", + "@vitest/browser-preview": "4.0.6", + "@vitest/browser-webdriverio": "4.0.6", + "@vitest/ui": "4.0.6", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/debug": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser-playwright": { + "optional": true + }, + "@vitest/browser-preview": { + "optional": true + }, + "@vitest/browser-webdriverio": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vitest-axe": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/vitest-axe/-/vitest-axe-0.1.0.tgz", + "integrity": "sha512-jvtXxeQPg8R/2ANTY8QicA5pvvdRP4F0FsVUAHANJ46YCDASie/cuhlSzu0DGcLmZvGBSBNsNuK3HqfaeknyvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "aria-query": "^5.0.0", + "axe-core": "^4.4.2", + "chalk": "^5.0.1", + "dom-accessibility-api": "^0.5.14", + "lodash-es": "^4.17.21", + "redent": "^3.0.0" + }, + "peerDependencies": { + "vitest": ">=0.16.0" + } + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/w3c-xmlserializer": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", + "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "xml-name-validator": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/webidl-conversions": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", + "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=20" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.1.tgz", + "integrity": "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@exodus/bytes": "^1.11.0", + "tr46": "^6.0.0", + "webidl-conversions": "^8.0.1" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + } + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/xml-name-validator": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", + "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true, + "license": "MIT" + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yet-another-react-lightbox": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/yet-another-react-lightbox/-/yet-another-react-lightbox-3.27.0.tgz", + "integrity": "sha512-SV4U0s7vZfwNWPOqyEP81VyquBu/7m9mVJhKEAgWTWUpsIRD6FFLn5+9RvJ4N0wMrxr7v517GzUNqoDPC2EdHg==", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "@types/react": "^16 || ^17 || ^18 || ^19", + "@types/react-dom": "^16 || ^17 || ^18 || ^19", + "react": "^16.8.0 || ^17 || ^18 || ^19", + "react-dom": "^16.8.0 || ^17 || ^18 || ^19" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + } + } } - ], - "license": "MIT-0", - "engines": { - "node": ">=20.19.0" - } - }, - "node_modules/@csstools/css-calc": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.1.1.tgz", - "integrity": "sha512-HJ26Z/vmsZQqs/o3a6bgKslXGFAungXGbinULZO3eMsOyNJHeBBZfup5FiZInOghgoM4Hwnmw+OgbJCNg1wwUQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-tokenizer": "^4.0.0" - } - }, - "node_modules/@csstools/css-color-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.0.2.tgz", - "integrity": "sha512-0GEfbBLmTFf0dJlpsNU7zwxRIH0/BGEMuXLTCvFYxuL1tNhqzTbtnFICyJLTNK4a+RechKP75e7w42ClXSnJQw==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "dependencies": { - "@csstools/color-helpers": "^6.0.2", - "@csstools/css-calc": "^3.1.1" - }, - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "@csstools/css-parser-algorithms": "^4.0.0", - "@csstools/css-tokenizer": "^4.0.0" - } - }, - "node_modules/@csstools/css-parser-algorithms": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz", - "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "@csstools/css-tokenizer": "^4.0.0" - } - }, - "node_modules/@csstools/css-syntax-patches-for-csstree": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.0.tgz", - "integrity": "sha512-H4tuz2nhWgNKLt1inYpoVCfbJbMwX/lQKp3g69rrrIMIYlFD9+zTykOKhNR8uGrAmbS/kT9n6hTFkmDkxLgeTA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0" - }, - "node_modules/@csstools/css-tokenizer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", - "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT", - "engines": { - "node": ">=20.19.0" - } - }, - "node_modules/@dnd-kit/accessibility": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.1.tgz", - "integrity": "sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@dnd-kit/core": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.3.1.tgz", - "integrity": "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==", - "license": "MIT", - "dependencies": { - "@dnd-kit/accessibility": "^3.1.1", - "@dnd-kit/utilities": "^3.2.2", - "tslib": "^2.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@dnd-kit/sortable": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@dnd-kit/sortable/-/sortable-10.0.0.tgz", - "integrity": "sha512-+xqhmIIzvAYMGfBYYnbKuNicfSsk4RksY2XdmJhT+HAC01nix6fHCztU68jooFiMUB01Ky3F0FyOvhG/BZrWkg==", - "license": "MIT", - "dependencies": { - "@dnd-kit/utilities": "^3.2.2", - "tslib": "^2.0.0" - }, - "peerDependencies": { - "@dnd-kit/core": "^6.3.0", - "react": ">=16.8.0" - } - }, - "node_modules/@dnd-kit/utilities": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/@dnd-kit/utilities/-/utilities-3.2.2.tgz", - "integrity": "sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.0" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@emotion/babel-plugin": { - "version": "11.13.5", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", - "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", - "dependencies": { - "@babel/helper-module-imports": "^7.16.7", - "@babel/runtime": "^7.18.3", - "@emotion/hash": "^0.9.2", - "@emotion/memoize": "^0.9.0", - "@emotion/serialize": "^1.3.3", - "babel-plugin-macros": "^3.1.0", - "convert-source-map": "^1.5.0", - "escape-string-regexp": "^4.0.0", - "find-root": "^1.1.0", - "source-map": "^0.5.7", - "stylis": "4.2.0" - } - }, - "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" - }, - "node_modules/@emotion/babel-plugin/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/@emotion/cache": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", - "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", - "dependencies": { - "@emotion/memoize": "^0.9.0", - "@emotion/sheet": "^1.4.0", - "@emotion/utils": "^1.4.2", - "@emotion/weak-memoize": "^0.4.0", - "stylis": "4.2.0" - } - }, - "node_modules/@emotion/hash": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", - "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==" - }, - "node_modules/@emotion/memoize": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", - "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==" - }, - "node_modules/@emotion/react": { - "version": "11.14.0", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", - "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", - "dependencies": { - "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.13.5", - "@emotion/cache": "^11.14.0", - "@emotion/serialize": "^1.3.3", - "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", - "@emotion/utils": "^1.4.2", - "@emotion/weak-memoize": "^0.4.0", - "hoist-non-react-statics": "^3.3.1" - }, - "peerDependencies": { - "react": ">=16.8.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@emotion/serialize": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", - "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", - "dependencies": { - "@emotion/hash": "^0.9.2", - "@emotion/memoize": "^0.9.0", - "@emotion/unitless": "^0.10.0", - "@emotion/utils": "^1.4.2", - "csstype": "^3.0.2" - } - }, - "node_modules/@emotion/sheet": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", - "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==" - }, - "node_modules/@emotion/unitless": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", - "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==" - }, - "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", - "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", - "peerDependencies": { - "react": ">=16.8.0" - } - }, - "node_modules/@emotion/utils": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", - "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==" - }, - "node_modules/@emotion/weak-memoize": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", - "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==" - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", - "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", - "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", - "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", - "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", - "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", - "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", - "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", - "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", - "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", - "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", - "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", - "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", - "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", - "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", - "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", - "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", - "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", - "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", - "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", - "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", - "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", - "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", - "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", - "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", - "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", - "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@exodus/bytes": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.0.tgz", - "integrity": "sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - }, - "peerDependencies": { - "@noble/hashes": "^1.8.0 || ^2.0.0" - }, - "peerDependenciesMeta": { - "@noble/hashes": { - "optional": true - } - } - }, - "node_modules/@floating-ui/core": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", - "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", - "dependencies": { - "@floating-ui/utils": "^0.2.10" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", - "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", - "dependencies": { - "@floating-ui/core": "^1.7.3", - "@floating-ui/utils": "^0.2.10" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", - "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==" - }, - "node_modules/@fortawesome/fontawesome-free": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-7.1.0.tgz", - "integrity": "sha512-+WxNld5ZCJHvPQCr/GnzCTVREyStrAJjisUPtUxG5ngDA8TMlPnKp6dddlTpai4+1GNmltAeuk1hJEkBohwZYA==", - "license": "(CC-BY-4.0 AND OFL-1.1 AND MIT)", - "engines": { - "node": ">=6" - } - }, - "node_modules/@isaacs/balanced-match": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/brace-expansion": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", - "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@isaacs/balanced-match": "^4.0.1" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", - "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@kurkle/color": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", - "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", - "license": "MIT" - }, - "node_modules/@microsoft/api-extractor": { - "version": "7.54.0", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.54.0.tgz", - "integrity": "sha512-t0SEcbVUPy4yAVykPafTNWktBg728X6p9t8qCuGDsYr1/lz2VQFihYDP2CnBFSArP5vwJPcvxktoKVSqH326cA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@microsoft/api-extractor-model": "7.31.3", - "@microsoft/tsdoc": "~0.15.1", - "@microsoft/tsdoc-config": "~0.17.1", - "@rushstack/node-core-library": "5.18.0", - "@rushstack/rig-package": "0.6.0", - "@rushstack/terminal": "0.19.3", - "@rushstack/ts-command-line": "5.1.3", - "diff": "~8.0.2", - "lodash": "~4.17.15", - "minimatch": "10.0.3", - "resolve": "~1.22.1", - "semver": "~7.5.4", - "source-map": "~0.6.1", - "typescript": "5.8.2" - }, - "bin": { - "api-extractor": "bin/api-extractor" - } - }, - "node_modules/@microsoft/api-extractor-model": { - "version": "7.31.3", - "resolved": "https://registry.npmjs.org/@microsoft/api-extractor-model/-/api-extractor-model-7.31.3.tgz", - "integrity": "sha512-dv4quQI46p0U03TCEpasUf6JrJL3qjMN7JUAobsPElxBv4xayYYvWW9aPpfYV+Jx6hqUcVaLVOeV7+5hxsyoFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@microsoft/tsdoc": "~0.15.1", - "@microsoft/tsdoc-config": "~0.17.1", - "@rushstack/node-core-library": "5.18.0" - } - }, - "node_modules/@microsoft/api-extractor/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@microsoft/api-extractor/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@microsoft/api-extractor/node_modules/typescript": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.2.tgz", - "integrity": "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/@microsoft/api-extractor/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/@microsoft/tsdoc": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc/-/tsdoc-0.15.1.tgz", - "integrity": "sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@microsoft/tsdoc-config": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/@microsoft/tsdoc-config/-/tsdoc-config-0.17.1.tgz", - "integrity": "sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@microsoft/tsdoc": "0.15.1", - "ajv": "~8.12.0", - "jju": "~1.4.0", - "resolve": "~1.22.2" - } - }, - "node_modules/@monaco-editor/loader": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.6.1.tgz", - "integrity": "sha512-w3tEnj9HYEC73wtjdpR089AqkUPskFRcdkxsiSFt3SoUc3OHpmu+leP94CXBm4mHfefmhsdfI0ZQu6qJ0wgtPg==", - "license": "MIT", - "dependencies": { - "state-local": "^1.0.6" - } - }, - "node_modules/@monaco-editor/react": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.7.0.tgz", - "integrity": "sha512-cyzXQCtO47ydzxpQtCGSQGOC8Gk3ZUeBXFAxD+CWXYFo5OqZyZUonFl0DwUlTyAfRHntBfw2p3w4s9R6oe1eCA==", - "license": "MIT", - "dependencies": { - "@monaco-editor/loader": "^1.5.0" - }, - "peerDependencies": { - "monaco-editor": ">= 0.25.0 < 1", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.0-beta.43", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.43.tgz", - "integrity": "sha512-5Uxg7fQUCmfhax7FJke2+8B6cqgeUJUD9o2uXIKXhD+mG0mL6NObmVoi9wXEU1tY89mZKgAYA6fTbftx3q2ZPQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/pluginutils": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", - "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.5.tgz", - "integrity": "sha512-8c1vW4ocv3UOMp9K+gToY5zL2XiiVw3k7f1ksf4yO1FlDFQ1C2u72iACFnSOceJFsWskc2WZNqeRhFRPzv+wtQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.5.tgz", - "integrity": "sha512-mQGfsIEFcu21mvqkEKKu2dYmtuSZOBMmAl5CFlPGLY94Vlcm+zWApK7F/eocsNzp8tKmbeBP8yXyAbx0XHsFNA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.5.tgz", - "integrity": "sha512-takF3CR71mCAGA+v794QUZ0b6ZSrgJkArC+gUiG6LB6TQty9T0Mqh3m2ImRBOxS2IeYBo4lKWIieSvnEk2OQWA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.5.tgz", - "integrity": "sha512-W901Pla8Ya95WpxDn//VF9K9u2JbocwV/v75TE0YIHNTbhqUTv9w4VuQ9MaWlNOkkEfFwkdNhXgcLqPSmHy0fA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.5.tgz", - "integrity": "sha512-QofO7i7JycsYOWxe0GFqhLmF6l1TqBswJMvICnRUjqCx8b47MTo46W8AoeQwiokAx3zVryVnxtBMcGcnX12LvA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.5.tgz", - "integrity": "sha512-jr21b/99ew8ujZubPo9skbrItHEIE50WdV86cdSoRkKtmWa+DDr6fu2c/xyRT0F/WazZpam6kk7IHBerSL7LDQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.5.tgz", - "integrity": "sha512-PsNAbcyv9CcecAUagQefwX8fQn9LQ4nZkpDboBOttmyffnInRy8R8dSg6hxxl2Re5QhHBf6FYIDhIj5v982ATQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.5.tgz", - "integrity": "sha512-Fw4tysRutyQc/wwkmcyoqFtJhh0u31K+Q6jYjeicsGJJ7bbEq8LwPWV/w0cnzOqR2m694/Af6hpFayLJZkG2VQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.5.tgz", - "integrity": "sha512-a+3wVnAYdQClOTlyapKmyI6BLPAFYs0JM8HRpgYZQO02rMR09ZcV9LbQB+NL6sljzG38869YqThrRnfPMCDtZg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.5.tgz", - "integrity": "sha512-AvttBOMwO9Pcuuf7m9PkC1PUIKsfaAJ4AYhy944qeTJgQOqJYJ9oVl2nYgY7Rk0mkbsuOpCAYSs6wLYB2Xiw0Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.5.tgz", - "integrity": "sha512-DkDk8pmXQV2wVrF6oq5tONK6UHLz/XcEVow4JTTerdeV1uqPeHxwcg7aFsfnSm9L+OO8WJsWotKM2JJPMWrQtA==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.5.tgz", - "integrity": "sha512-W/b9ZN/U9+hPQVvlGwjzi+Wy4xdoH2I8EjaCkMvzpI7wJUs8sWJ03Rq96jRnHkSrcHTpQe8h5Tg3ZzUPGauvAw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.5.tgz", - "integrity": "sha512-sjQLr9BW7R/ZiXnQiWPkErNfLMkkWIoCz7YMn27HldKsADEKa5WYdobaa1hmN6slu9oWQbB6/jFpJ+P2IkVrmw==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.5.tgz", - "integrity": "sha512-hq3jU/kGyjXWTvAh2awn8oHroCbrPm8JqM7RUpKjalIRWWXE01CQOf/tUNWNHjmbMHg/hmNCwc/Pz3k1T/j/Lg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.5.tgz", - "integrity": "sha512-gn8kHOrku8D4NGHMK1Y7NA7INQTRdVOntt1OCYypZPRt6skGbddska44K8iocdpxHTMMNui5oH4elPH4QOLrFQ==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.5.tgz", - "integrity": "sha512-hXGLYpdhiNElzN770+H2nlx+jRog8TyynpTVzdlc6bndktjKWyZyiCsuDAlpd+j+W+WNqfcyAWz9HxxIGfZm1Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.5.tgz", - "integrity": "sha512-arCGIcuNKjBoKAXD+y7XomR9gY6Mw7HnFBv5Rw7wQRvwYLR7gBAgV7Mb2QTyjXfTveBNFAtPt46/36vV9STLNg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.5.tgz", - "integrity": "sha512-QoFqB6+/9Rly/RiPjaomPLmR/13cgkIGfA40LHly9zcH1S0bN2HVFYk3a1eAyHQyjs3ZJYlXvIGtcCs5tko9Cw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.5.tgz", - "integrity": "sha512-w0cDWVR6MlTstla1cIfOGyl8+qb93FlAVutcor14Gf5Md5ap5ySfQ7R9S/NjNaMLSFdUnKGEasmVnu3lCMqB7w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.5.tgz", - "integrity": "sha512-Aufdpzp7DpOTULJCuvzqcItSGDH73pF3ko/f+ckJhxQyHtp67rHw3HMNxoIdDMUITJESNE6a8uh4Lo4SLouOUg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.5.tgz", - "integrity": "sha512-UGBUGPFp1vkj6p8wCRraqNhqwX/4kNQPS57BCFc8wYh0g94iVIW33wJtQAx3G7vrjjNtRaxiMUylM0ktp/TRSQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.5.tgz", - "integrity": "sha512-TAcgQh2sSkykPRWLrdyy2AiceMckNf5loITqXxFI5VuQjS5tSuw3WlwdN8qv8vzjLAUTvYaH/mVjSFpbkFbpTg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rushstack/node-core-library": { - "version": "5.18.0", - "resolved": "https://registry.npmjs.org/@rushstack/node-core-library/-/node-core-library-5.18.0.tgz", - "integrity": "sha512-XDebtBdw5S3SuZIt+Ra2NieT8kQ3D2Ow1HxhDQ/2soinswnOu9e7S69VSwTOLlQnx5mpWbONu+5JJjDxMAb6Fw==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "~8.13.0", - "ajv-draft-04": "~1.0.0", - "ajv-formats": "~3.0.1", - "fs-extra": "~11.3.0", - "import-lazy": "~4.0.0", - "jju": "~1.4.0", - "resolve": "~1.22.1", - "semver": "~7.5.4" - }, - "peerDependencies": { - "@types/node": "*" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@rushstack/node-core-library/node_modules/ajv": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.13.0.tgz", - "integrity": "sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@rushstack/node-core-library/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@rushstack/node-core-library/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@rushstack/node-core-library/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/@rushstack/problem-matcher": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@rushstack/problem-matcher/-/problem-matcher-0.1.1.tgz", - "integrity": "sha512-Fm5XtS7+G8HLcJHCWpES5VmeMyjAKaWeyZU5qPzZC+22mPlJzAsOxymHiWIfuirtPckX3aptWws+K2d0BzniJA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/node": "*" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@rushstack/rig-package": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@rushstack/rig-package/-/rig-package-0.6.0.tgz", - "integrity": "sha512-ZQmfzsLE2+Y91GF15c65L/slMRVhF6Hycq04D4TwtdGaUAbIXXg9c5pKA5KFU7M4QMaihoobp9JJYpYcaY3zOw==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve": "~1.22.1", - "strip-json-comments": "~3.1.1" - } - }, - "node_modules/@rushstack/terminal": { - "version": "0.19.3", - "resolved": "https://registry.npmjs.org/@rushstack/terminal/-/terminal-0.19.3.tgz", - "integrity": "sha512-0P8G18gK9STyO+CNBvkKPnWGMxESxecTYqOcikHOVIHXa9uAuTK+Fw8TJq2Gng1w7W6wTC9uPX6hGNvrMll2wA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rushstack/node-core-library": "5.18.0", - "@rushstack/problem-matcher": "0.1.1", - "supports-color": "~8.1.1" - }, - "peerDependencies": { - "@types/node": "*" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@rushstack/ts-command-line": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@rushstack/ts-command-line/-/ts-command-line-5.1.3.tgz", - "integrity": "sha512-Kdv0k/BnnxIYFlMVC1IxrIS0oGQd4T4b7vKfx52Y2+wk2WZSDFIvedr7JrhenzSlm3ou5KwtoTGTGd5nbODRug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@rushstack/terminal": "0.19.3", - "@types/argparse": "1.0.38", - "argparse": "~1.0.9", - "string-argv": "~0.3.1" - } - }, - "node_modules/@standard-schema/spec": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", - "integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tailwindcss/node": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.17.tgz", - "integrity": "sha512-csIkHIgLb3JisEFQ0vxr2Y57GUNYh447C8xzwj89U/8fdW8LhProdxvnVH6U8M2Y73QKiTIH+LWbK3V2BBZsAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/remapping": "^2.3.4", - "enhanced-resolve": "^5.18.3", - "jiti": "^2.6.1", - "lightningcss": "1.30.2", - "magic-string": "^0.30.21", - "source-map-js": "^1.2.1", - "tailwindcss": "4.1.17" - } - }, - "node_modules/@tailwindcss/oxide": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.17.tgz", - "integrity": "sha512-F0F7d01fmkQhsTjXezGBLdrl1KresJTcI3DB8EkScCldyKp3Msz4hub4uyYaVnk88BAS1g5DQjjF6F5qczheLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.1.17", - "@tailwindcss/oxide-darwin-arm64": "4.1.17", - "@tailwindcss/oxide-darwin-x64": "4.1.17", - "@tailwindcss/oxide-freebsd-x64": "4.1.17", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.17", - "@tailwindcss/oxide-linux-arm64-gnu": "4.1.17", - "@tailwindcss/oxide-linux-arm64-musl": "4.1.17", - "@tailwindcss/oxide-linux-x64-gnu": "4.1.17", - "@tailwindcss/oxide-linux-x64-musl": "4.1.17", - "@tailwindcss/oxide-wasm32-wasi": "4.1.17", - "@tailwindcss/oxide-win32-arm64-msvc": "4.1.17", - "@tailwindcss/oxide-win32-x64-msvc": "4.1.17" - } - }, - "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.17.tgz", - "integrity": "sha512-BMqpkJHgOZ5z78qqiGE6ZIRExyaHyuxjgrJ6eBO5+hfrfGkuya0lYfw8fRHG77gdTjWkNWEEm+qeG2cDMxArLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.17.tgz", - "integrity": "sha512-EquyumkQweUBNk1zGEU/wfZo2qkp/nQKRZM8bUYO0J+Lums5+wl2CcG1f9BgAjn/u9pJzdYddHWBiFXJTcxmOg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.17.tgz", - "integrity": "sha512-gdhEPLzke2Pog8s12oADwYu0IAw04Y2tlmgVzIN0+046ytcgx8uZmCzEg4VcQh+AHKiS7xaL8kGo/QTiNEGRog==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.17.tgz", - "integrity": "sha512-hxGS81KskMxML9DXsaXT1H0DyA+ZBIbyG/sSAjWNe2EDl7TkPOBI42GBV3u38itzGUOmFfCzk1iAjDXds8Oh0g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.17.tgz", - "integrity": "sha512-k7jWk5E3ldAdw0cNglhjSgv501u7yrMf8oeZ0cElhxU6Y2o7f8yqelOp3fhf7evjIS6ujTI3U8pKUXV2I4iXHQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.17.tgz", - "integrity": "sha512-HVDOm/mxK6+TbARwdW17WrgDYEGzmoYayrCgmLEw7FxTPLcp/glBisuyWkFz/jb7ZfiAXAXUACfyItn+nTgsdQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.17.tgz", - "integrity": "sha512-HvZLfGr42i5anKtIeQzxdkw/wPqIbpeZqe7vd3V9vI3RQxe3xU1fLjss0TjyhxWcBaipk7NYwSrwTwK1hJARMg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.17.tgz", - "integrity": "sha512-M3XZuORCGB7VPOEDH+nzpJ21XPvK5PyjlkSFkFziNHGLc5d6g3di2McAAblmaSUNl8IOmzYwLx9NsE7bplNkwQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.17.tgz", - "integrity": "sha512-k7f+pf9eXLEey4pBlw+8dgfJHY4PZ5qOUFDyNf7SI6lHjQ9Zt7+NcscjpwdCEbYi6FI5c2KDTDWyf2iHcCSyyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.17.tgz", - "integrity": "sha512-cEytGqSSoy7zK4JRWiTCx43FsKP/zGr0CsuMawhH67ONlH+T79VteQeJQRO/X7L0juEUA8ZyuYikcRBf0vsxhg==", - "bundleDependencies": [ - "@napi-rs/wasm-runtime", - "@emnapi/core", - "@emnapi/runtime", - "@tybys/wasm-util", - "@emnapi/wasi-threads", - "tslib" - ], - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.6.0", - "@emnapi/runtime": "^1.6.0", - "@emnapi/wasi-threads": "^1.1.0", - "@napi-rs/wasm-runtime": "^1.0.7", - "@tybys/wasm-util": "^0.10.1", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": { - "version": "1.6.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.1.0", - "tslib": "^2.4.0" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": { - "version": "1.6.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { - "version": "1.0.7", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.5.0", - "@emnapi/runtime": "^1.5.0", - "@tybys/wasm-util": "^0.10.1" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": { - "version": "0.10.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": { - "version": "2.8.1", - "dev": true, - "inBundle": true, - "license": "0BSD", - "optional": true - }, - "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.17.tgz", - "integrity": "sha512-JU5AHr7gKbZlOGvMdb4722/0aYbU+tN6lv1kONx0JK2cGsh7g148zVWLM0IKR3NeKLv+L90chBVYcJ8uJWbC9A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.17.tgz", - "integrity": "sha512-SKWM4waLuqx0IH+FMDUw6R66Hu4OuTALFgnleKbqhgGU30DY20NORZMZUKgLRjQXNN2TLzKvh48QXTig4h4bGw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/postcss": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.2.2.tgz", - "integrity": "sha512-n4goKQbW8RVXIbNKRB/45LzyUqN451deQK0nzIeauVEqjlI49slUlgKYJM2QyUzap/PcpnS7kzSUmPb1sCRvYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "@tailwindcss/node": "4.2.2", - "@tailwindcss/oxide": "4.2.2", - "postcss": "^8.5.6", - "tailwindcss": "4.2.2" - } - }, - "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/node": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.2.tgz", - "integrity": "sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/remapping": "^2.3.5", - "enhanced-resolve": "^5.19.0", - "jiti": "^2.6.1", - "lightningcss": "1.32.0", - "magic-string": "^0.30.21", - "source-map-js": "^1.2.1", - "tailwindcss": "4.2.2" - } - }, - "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/oxide": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.2.2.tgz", - "integrity": "sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 20" - }, - "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.2.2", - "@tailwindcss/oxide-darwin-arm64": "4.2.2", - "@tailwindcss/oxide-darwin-x64": "4.2.2", - "@tailwindcss/oxide-freebsd-x64": "4.2.2", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.2.2", - "@tailwindcss/oxide-linux-arm64-gnu": "4.2.2", - "@tailwindcss/oxide-linux-arm64-musl": "4.2.2", - "@tailwindcss/oxide-linux-x64-gnu": "4.2.2", - "@tailwindcss/oxide-linux-x64-musl": "4.2.2", - "@tailwindcss/oxide-wasm32-wasi": "4.2.2", - "@tailwindcss/oxide-win32-arm64-msvc": "4.2.2", - "@tailwindcss/oxide-win32-x64-msvc": "4.2.2" - } - }, - "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.2.2.tgz", - "integrity": "sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.2.2.tgz", - "integrity": "sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.2.2.tgz", - "integrity": "sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.2.2.tgz", - "integrity": "sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.2.2.tgz", - "integrity": "sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.2.2.tgz", - "integrity": "sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.2.2.tgz", - "integrity": "sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.2.2.tgz", - "integrity": "sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.2.2.tgz", - "integrity": "sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.2.2.tgz", - "integrity": "sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==", - "bundleDependencies": [ - "@napi-rs/wasm-runtime", - "@emnapi/core", - "@emnapi/runtime", - "@tybys/wasm-util", - "@emnapi/wasi-threads", - "tslib" - ], - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.8.1", - "@emnapi/runtime": "^1.8.1", - "@emnapi/wasi-threads": "^1.1.0", - "@napi-rs/wasm-runtime": "^1.1.1", - "@tybys/wasm-util": "^0.10.1", - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": { - "version": "1.8.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.1.0", - "tslib": "^2.4.0" - } - }, - "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": { - "version": "1.8.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": { - "version": "1.1.0", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1", - "@tybys/wasm-util": "^0.10.1" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - } - }, - "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": { - "version": "0.10.1", - "dev": true, - "inBundle": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": { - "version": "2.8.1", - "dev": true, - "inBundle": true, - "license": "0BSD", - "optional": true - }, - "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.2.tgz", - "integrity": "sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/postcss/node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.2.2.tgz", - "integrity": "sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/postcss/node_modules/lightningcss": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", - "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.32.0", - "lightningcss-darwin-arm64": "1.32.0", - "lightningcss-darwin-x64": "1.32.0", - "lightningcss-freebsd-x64": "1.32.0", - "lightningcss-linux-arm-gnueabihf": "1.32.0", - "lightningcss-linux-arm64-gnu": "1.32.0", - "lightningcss-linux-arm64-musl": "1.32.0", - "lightningcss-linux-x64-gnu": "1.32.0", - "lightningcss-linux-x64-musl": "1.32.0", - "lightningcss-win32-arm64-msvc": "1.32.0", - "lightningcss-win32-x64-msvc": "1.32.0" - } - }, - "node_modules/@tailwindcss/postcss/node_modules/lightningcss-android-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", - "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@tailwindcss/postcss/node_modules/lightningcss-darwin-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", - "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@tailwindcss/postcss/node_modules/lightningcss-darwin-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", - "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@tailwindcss/postcss/node_modules/lightningcss-freebsd-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", - "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@tailwindcss/postcss/node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", - "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@tailwindcss/postcss/node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", - "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@tailwindcss/postcss/node_modules/lightningcss-linux-arm64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", - "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@tailwindcss/postcss/node_modules/lightningcss-linux-x64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", - "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@tailwindcss/postcss/node_modules/lightningcss-linux-x64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", - "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@tailwindcss/postcss/node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", - "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@tailwindcss/postcss/node_modules/lightningcss-win32-x64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", - "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@tailwindcss/postcss/node_modules/tailwindcss": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.2.tgz", - "integrity": "sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tailwindcss/vite": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.17.tgz", - "integrity": "sha512-4+9w8ZHOiGnpcGI6z1TVVfWaX/koK7fKeSYF3qlYg2xpBtbteP2ddBxiarL+HVgfSJGeK5RIxRQmKm4rTJJAwA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@tailwindcss/node": "4.1.17", - "@tailwindcss/oxide": "4.1.17", - "tailwindcss": "4.1.17" - }, - "peerDependencies": { - "vite": "^5.2.0 || ^6 || ^7" - } - }, - "node_modules/@testing-library/dom": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", - "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/code-frame": "^7.10.4", - "@babel/runtime": "^7.12.5", - "@types/aria-query": "^5.0.1", - "aria-query": "5.3.0", - "dom-accessibility-api": "^0.5.9", - "lz-string": "^1.5.0", - "picocolors": "1.1.1", - "pretty-format": "^27.0.2" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/@testing-library/jest-dom": { - "version": "6.9.1", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz", - "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@adobe/css-tools": "^4.4.0", - "aria-query": "^5.0.0", - "css.escape": "^1.5.1", - "dom-accessibility-api": "^0.6.3", - "picocolors": "^1.1.1", - "redent": "^3.0.0" - }, - "engines": { - "node": ">=14", - "npm": ">=6", - "yarn": ">=1" - } - }, - "node_modules/@testing-library/jest-dom/node_modules/dom-accessibility-api": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz", - "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@testing-library/react": { - "version": "16.3.0", - "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-16.3.0.tgz", - "integrity": "sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@testing-library/dom": "^10.0.0", - "@types/react": "^18.0.0 || ^19.0.0", - "@types/react-dom": "^18.0.0 || ^19.0.0", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@testing-library/user-event": { - "version": "14.6.1", - "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", - "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12", - "npm": ">=6" - }, - "peerDependencies": { - "@testing-library/dom": ">=7.21.4" - } - }, - "node_modules/@types/argparse": { - "version": "1.0.38", - "resolved": "https://registry.npmjs.org/@types/argparse/-/argparse-1.0.38.tgz", - "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/aria-query": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", - "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } - }, - "node_modules/@types/chai": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", - "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/deep-eql": "*", - "assertion-error": "^2.0.1" - } - }, - "node_modules/@types/deep-eql": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", - "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "20.19.24", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.24.tgz", - "integrity": "sha512-FE5u0ezmi6y9OZEzlJfg37mqqf6ZDSF2V/NLjUyGrR9uTZ7Sb9F7bLNZ03S4XVUNRWGA7Ck4c1kK+YnuWjl+DA==", - "dev": true, - "license": "MIT", - "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/parse-json": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", - "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" - }, - "node_modules/@types/react": { - "version": "19.2.2", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.2.tgz", - "integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==", - "license": "MIT", - "dependencies": { - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "19.2.2", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.2.tgz", - "integrity": "sha512-9KQPoO6mZCi7jcIStSnlOWn2nEF3mNmyr3rIAsGnAbQKYbRLyqmeSc39EVgtxXVia+LMT8j3knZLAZAh+xLmrw==", - "devOptional": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.2.0" - } - }, - "node_modules/@types/react-transition-group": { - "version": "4.4.12", - "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", - "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", - "peerDependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/whatwg-mimetype": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/whatwg-mimetype/-/whatwg-mimetype-3.0.2.tgz", - "integrity": "sha512-c2AKvDT8ToxLIOUlN51gTiHXflsfIFisS4pO7pDPoKouJCESkhZnEy623gwP9laCy5lnLDAw1vAzu2vM2YLOrA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vitejs/plugin-react": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.0.tgz", - "integrity": "sha512-4LuWrg7EKWgQaMJfnN+wcmbAW+VSsCmqGohftWjuct47bv8uE4n/nPpq4XjJPsxgq00GGG5J8dvBczp8uxScew==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.28.4", - "@babel/plugin-transform-react-jsx-self": "^7.27.1", - "@babel/plugin-transform-react-jsx-source": "^7.27.1", - "@rolldown/pluginutils": "1.0.0-beta.43", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.18.0" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" - } - }, - "node_modules/@vitest/expect": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.0.6.tgz", - "integrity": "sha512-5j8UUlBVhOjhj4lR2Nt9sEV8b4WtbcYh8vnfhTNA2Kn5+smtevzjNq+xlBuVhnFGXiyPPNzGrOVvmyHWkS5QGg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@standard-schema/spec": "^1.0.0", - "@types/chai": "^5.2.2", - "@vitest/spy": "4.0.6", - "@vitest/utils": "4.0.6", - "chai": "^6.0.1", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/mocker": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.0.6.tgz", - "integrity": "sha512-3COEIew5HqdzBFEYN9+u0dT3i/NCwppLnO1HkjGfAP1Vs3vti1Hxm/MvcbC4DAn3Szo1M7M3otiAaT83jvqIjA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/spy": "4.0.6", - "estree-walker": "^3.0.3", - "magic-string": "^0.30.19" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "msw": "^2.4.9", - "vite": "^6.0.0 || ^7.0.0-0" - }, - "peerDependenciesMeta": { - "msw": { - "optional": true - }, - "vite": { - "optional": true - } - } - }, - "node_modules/@vitest/pretty-format": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.0.6.tgz", - "integrity": "sha512-4vptgNkLIA1W1Nn5X4x8rLJBzPiJwnPc+awKtfBE5hNMVsoAl/JCCPPzNrbf+L4NKgklsis5Yp2gYa+XAS442g==", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.0.6.tgz", - "integrity": "sha512-trPk5qpd7Jj+AiLZbV/e+KiiaGXZ8ECsRxtnPnCrJr9OW2mLB72Cb824IXgxVz/mVU3Aj4VebY+tDTPn++j1Og==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "4.0.6", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/snapshot": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.0.6.tgz", - "integrity": "sha512-PaYLt7n2YzuvxhulDDu6c9EosiRuIE+FI2ECKs6yvHyhoga+2TBWI8dwBjs+IeuQaMtZTfioa9tj3uZb7nev1g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.6", - "magic-string": "^0.30.19", - "pathe": "^2.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/spy": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.0.6.tgz", - "integrity": "sha512-g9jTUYPV1LtRPRCQfhbMintW7BTQz1n6WXYQYRQ25qkyffA4bjVXjkROokZnv7t07OqfaFKw1lPzqKGk1hmNuQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.0.6.tgz", - "integrity": "sha512-bG43VS3iYKrMIZXBo+y8Pti0O7uNju3KvNn6DrQWhQQKcLavMB+0NZfO1/QBAEbq0MaQ3QjNsnnXlGQvsh0Z6A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "4.0.6", - "tinyrainbow": "^3.0.3" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@volar/language-core": { - "version": "2.4.23", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.23.tgz", - "integrity": "sha512-hEEd5ET/oSmBC6pi1j6NaNYRWoAiDhINbT8rmwtINugR39loROSlufGdYMF9TaKGfz+ViGs1Idi3mAhnuPcoGQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/source-map": "2.4.23" - } - }, - "node_modules/@volar/source-map": { - "version": "2.4.23", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.23.tgz", - "integrity": "sha512-Z1Uc8IB57Lm6k7q6KIDu/p+JWtf3xsXJqAX/5r18hYOTpJyBn0KXUR8oTJ4WFYOcDzWC9n3IflGgHowx6U6z9Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@volar/typescript": { - "version": "2.4.23", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.23.tgz", - "integrity": "sha512-lAB5zJghWxVPqfcStmAP1ZqQacMpe90UrP5RJ3arDyrhy4aCUQqmxPPLB2PWDKugvylmO41ljK7vZ+t6INMTag==", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/language-core": "2.4.23", - "path-browserify": "^1.0.1", - "vscode-uri": "^3.0.8" - } - }, - "node_modules/@vue/compiler-core": { - "version": "3.5.24", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.24.tgz", - "integrity": "sha512-eDl5H57AOpNakGNAkFDH+y7kTqrQpJkZFXhWZQGyx/5Wh7B1uQYvcWkvZi11BDhscPgj8N7XV3oRwiPnx1Vrig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.5", - "@vue/shared": "3.5.24", - "entities": "^4.5.0", - "estree-walker": "^2.0.2", - "source-map-js": "^1.2.1" - } - }, - "node_modules/@vue/compiler-core/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@vue/compiler-dom": { - "version": "3.5.24", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.24.tgz", - "integrity": "sha512-1QHGAvs53gXkWdd3ZMGYuvQFXHW4ksKWPG8HP8/2BscrbZ0brw183q2oNWjMrSWImYLHxHrx1ItBQr50I/q2zw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vue/compiler-core": "3.5.24", - "@vue/shared": "3.5.24" - } - }, - "node_modules/@vue/compiler-vue2": { - "version": "2.7.16", - "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", - "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", - "dev": true, - "license": "MIT", - "dependencies": { - "de-indent": "^1.0.2", - "he": "^1.2.0" - } - }, - "node_modules/@vue/language-core": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.0.tgz", - "integrity": "sha512-O1ZZFaaBGkKbsRfnVH1ifOK1/1BUkyK+3SQsfnh6PmMmD4qJcTU8godCeA96jjDRTL6zgnK7YzCHfaUlH2r0Mw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@volar/language-core": "~2.4.11", - "@vue/compiler-dom": "^3.5.0", - "@vue/compiler-vue2": "^2.7.16", - "@vue/shared": "^3.5.0", - "alien-signals": "^0.4.9", - "minimatch": "^9.0.3", - "muggle-string": "^0.4.1", - "path-browserify": "^1.0.1" - }, - "peerDependencies": { - "typescript": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@vue/language-core/node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@vue/shared": { - "version": "3.5.24", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.24.tgz", - "integrity": "sha512-9cwHL2EsJBdi8NY22pngYYWzkTDhld6fAD6jlaeloNGciNSJL6bLpbxVgXl96X00Jtc6YWQv96YA/0sxex/k1A==", - "dev": true, - "license": "MIT" - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/agent-base": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", - "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14" - } - }, - "node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-draft-04": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ajv-draft-04/-/ajv-draft-04-1.0.0.tgz", - "integrity": "sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "ajv": "^8.5.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/alien-signals": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-0.4.14.tgz", - "integrity": "sha512-itUAVzhczTmP2U5yX67xVpsbbOiquusbWVyA9N+sy6+r6YVbFkahXvNCeEPWEOMhwDYwbVbGHFkVL03N9I5g+Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/aria-query": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", - "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/axe-core": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.0.tgz", - "integrity": "sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ==", - "dev": true, - "license": "MPL-2.0", - "engines": { - "node": ">=4" - } - }, - "node_modules/babel-plugin-macros": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", - "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", - "dependencies": { - "@babel/runtime": "^7.12.5", - "cosmiconfig": "^7.0.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10", - "npm": ">=6" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/baseline-browser-mapping": { - "version": "2.8.23", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.23.tgz", - "integrity": "sha512-616V5YX4bepJFzNyOfce5Fa8fDJMfoxzOIzDCZwaGL8MKVpFrXqfNUoIpRn9YMI5pXf/VKgzjB4htFMsFKKdiQ==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.js" - } - }, - "node_modules/bidi-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz", - "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==", - "dev": true, - "license": "MIT", - "dependencies": { - "require-from-string": "^2.0.2" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/browser-image-compression": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/browser-image-compression/-/browser-image-compression-2.0.2.tgz", - "integrity": "sha512-pBLlQyUf6yB8SmmngrcOw3EoS4RpQ1BcylI3T9Yqn7+4nrQTXJD4sJDe5ODnJdrvNMaio5OicFo75rDyJD2Ucw==", - "license": "MIT", - "dependencies": { - "uzip": "0.20201231.0" - } - }, - "node_modules/browserslist": { - "version": "4.27.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.27.0.tgz", - "integrity": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.8.19", - "caniuse-lite": "^1.0.30001751", - "electron-to-chromium": "^1.5.238", - "node-releases": "^2.0.26", - "update-browserslist-db": "^1.1.4" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001753", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001753.tgz", - "integrity": "sha512-Bj5H35MD/ebaOV4iDLqPEtiliTN29qkGtEHCwawWn4cYm+bPJM2NsaP30vtZcnERClMzp52J4+aw2UNbK4o+zw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chai": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.0.tgz", - "integrity": "sha512-aUTnJc/JipRzJrNADXVvpVqi6CO0dn3nx4EVPxijri+fj3LUUDyZQOgVeW54Ob3Y1Xh9Iz8f+CgaCl8v0mn9bA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chart.js": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.5.1.tgz", - "integrity": "sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==", - "license": "MIT", - "dependencies": { - "@kurkle/color": "^0.3.0" - }, - "engines": { - "pnpm": ">=8" - } - }, - "node_modules/compare-versions": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-6.1.1.tgz", - "integrity": "sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==", - "dev": true, - "license": "MIT" - }, - "node_modules/confbox": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz", - "integrity": "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cosmiconfig": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", - "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", - "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cosmiconfig/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "engines": { - "node": ">= 6" - } - }, - "node_modules/css-tree": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", - "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", - "dev": true, - "license": "MIT", - "dependencies": { - "mdn-data": "2.27.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" - } - }, - "node_modules/css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cssstyle": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-6.2.0.tgz", - "integrity": "sha512-Fm5NvhYathRnXNVndkUsCCuR63DCLVVwGOOwQw782coXFi5HhkXdu289l59HlXZBawsyNccXfWRYvLzcDCdDig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@asamuzakjp/css-color": "^5.0.1", - "@csstools/css-syntax-patches-for-csstree": "^1.0.28", - "css-tree": "^3.1.0", - "lru-cache": "^11.2.6" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/cssstyle/node_modules/lru-cache": { - "version": "11.2.6", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", - "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "license": "MIT" - }, - "node_modules/data-urls": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-7.0.0.tgz", - "integrity": "sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==", - "dev": true, - "license": "MIT", - "dependencies": { - "whatwg-mimetype": "^5.0.0", - "whatwg-url": "^16.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/data-urls/node_modules/whatwg-mimetype": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", - "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - } - }, - "node_modules/de-indent": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", - "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", - "dev": true, - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decimal.js": { - "version": "10.6.0", - "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz", - "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==", - "dev": true, - "license": "MIT" - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/diff": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-8.0.2.tgz", - "integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dom-accessibility-api": { - "version": "0.5.16", - "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", - "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", - "dev": true, - "license": "MIT" - }, - "node_modules/dom-helpers": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", - "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", - "dependencies": { - "@babel/runtime": "^7.8.7", - "csstype": "^3.0.2" - } - }, - "node_modules/dompurify": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.7.tgz", - "integrity": "sha512-VaTstWtsneJY8xzy7DekmYWEOZcmzIe3Qb3zPd4STve1OBTa+e+WmS1ITQec1fZYXI3HCsOZZiSMpG6oxoWMWQ==", - "license": "(MPL-2.0 OR Apache-2.0)", - "peer": true - }, - "node_modules/electron-to-chromium": { - "version": "1.5.244", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.244.tgz", - "integrity": "sha512-OszpBN7xZX4vWMPJwB9illkN/znA8M36GQqQxi6MNy9axWxhOfJyZZJtSLQCpEFLHP2xK33BiWx9aIuIEXVCcw==", - "dev": true, - "license": "ISC" - }, - "node_modules/enhanced-resolve": { - "version": "5.20.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", - "integrity": "sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.3.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/error-ex": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", - "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/es-module-lexer": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", - "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/esbuild": { - "version": "0.25.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", - "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.12", - "@esbuild/android-arm": "0.25.12", - "@esbuild/android-arm64": "0.25.12", - "@esbuild/android-x64": "0.25.12", - "@esbuild/darwin-arm64": "0.25.12", - "@esbuild/darwin-x64": "0.25.12", - "@esbuild/freebsd-arm64": "0.25.12", - "@esbuild/freebsd-x64": "0.25.12", - "@esbuild/linux-arm": "0.25.12", - "@esbuild/linux-arm64": "0.25.12", - "@esbuild/linux-ia32": "0.25.12", - "@esbuild/linux-loong64": "0.25.12", - "@esbuild/linux-mips64el": "0.25.12", - "@esbuild/linux-ppc64": "0.25.12", - "@esbuild/linux-riscv64": "0.25.12", - "@esbuild/linux-s390x": "0.25.12", - "@esbuild/linux-x64": "0.25.12", - "@esbuild/netbsd-arm64": "0.25.12", - "@esbuild/netbsd-x64": "0.25.12", - "@esbuild/openbsd-arm64": "0.25.12", - "@esbuild/openbsd-x64": "0.25.12", - "@esbuild/openharmony-arm64": "0.25.12", - "@esbuild/sunos-x64": "0.25.12", - "@esbuild/win32-arm64": "0.25.12", - "@esbuild/win32-ia32": "0.25.12", - "@esbuild/win32-x64": "0.25.12" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/expect-type": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz", - "integrity": "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/exsolve": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.7.tgz", - "integrity": "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/find-root": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", - "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" - }, - "node_modules/flag-icons": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/flag-icons/-/flag-icons-7.5.0.tgz", - "integrity": "sha512-kd+MNXviFIg5hijH766tt+3x76ele1AXlo4zDdCxIvqWZhKt4T83bOtxUOOMlTx/EcFdUMH5yvQgYlFh1EqqFg==", - "license": "MIT" - }, - "node_modules/fs-extra": { - "version": "11.3.2", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.2.tgz", - "integrity": "sha512-Xr9F6z6up6Ws+NjzMCZc6WXg2YFRlrLP9NQDO3VQrWrfiojdhS56TzueT88ze0uBdCTwEIhQ3ptnmKeWGFAe0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/happy-dom": { - "version": "20.0.10", - "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-20.0.10.tgz", - "integrity": "sha512-6umCCHcjQrhP5oXhrHQQvLB0bwb1UzHAHdsXy+FjtKoYjUhmNZsQL8NivwM1vDvNEChJabVrUYxUnp/ZdYmy2g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "^20.0.0", - "@types/whatwg-mimetype": "^3.0.2", - "whatwg-mimetype": "^3.0.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "dependencies": { - "react-is": "^16.7.0" - } - }, - "node_modules/hoist-non-react-statics/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/html-encoding-sniffer": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", - "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@exodus/bytes": "^1.6.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", - "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" - }, - "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", - "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/jiti": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", - "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", - "dev": true, - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/jju": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", - "integrity": "sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==", - "dev": true, - "license": "MIT" - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "license": "MIT" - }, - "node_modules/jsdom": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-28.1.0.tgz", - "integrity": "sha512-0+MoQNYyr2rBHqO1xilltfDjV9G7ymYGlAUazgcDLQaUf8JDHbuGwsxN6U9qWaElZ4w1B2r7yEGIL3GdeW3Rug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@acemir/cssom": "^0.9.31", - "@asamuzakjp/dom-selector": "^6.8.1", - "@bramus/specificity": "^2.4.2", - "@exodus/bytes": "^1.11.0", - "cssstyle": "^6.0.1", - "data-urls": "^7.0.0", - "decimal.js": "^10.6.0", - "html-encoding-sniffer": "^6.0.0", - "http-proxy-agent": "^7.0.2", - "https-proxy-agent": "^7.0.6", - "is-potential-custom-element-name": "^1.0.1", - "parse5": "^8.0.0", - "saxes": "^6.0.0", - "symbol-tree": "^3.2.4", - "tough-cookie": "^6.0.0", - "undici": "^7.21.0", - "w3c-xmlserializer": "^5.0.0", - "webidl-conversions": "^8.0.1", - "whatwg-mimetype": "^5.0.0", - "whatwg-url": "^16.0.0", - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - }, - "peerDependencies": { - "canvas": "^3.0.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } - } - }, - "node_modules/jsdom/node_modules/whatwg-mimetype": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz", - "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonfile": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz", - "integrity": "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg==", - "dev": true, - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/kolorist": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", - "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lightningcss": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", - "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.30.2", - "lightningcss-darwin-arm64": "1.30.2", - "lightningcss-darwin-x64": "1.30.2", - "lightningcss-freebsd-x64": "1.30.2", - "lightningcss-linux-arm-gnueabihf": "1.30.2", - "lightningcss-linux-arm64-gnu": "1.30.2", - "lightningcss-linux-arm64-musl": "1.30.2", - "lightningcss-linux-x64-gnu": "1.30.2", - "lightningcss-linux-x64-musl": "1.30.2", - "lightningcss-win32-arm64-msvc": "1.30.2", - "lightningcss-win32-x64-msvc": "1.30.2" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", - "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", - "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", - "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", - "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", - "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", - "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", - "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", - "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", - "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", - "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", - "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" - }, - "node_modules/local-pkg": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.2.tgz", - "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==", - "dev": true, - "license": "MIT", - "dependencies": { - "mlly": "^1.7.4", - "pkg-types": "^2.3.0", - "quansync": "^0.2.11" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "dev": true, - "license": "MIT" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/lz-string": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", - "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", - "dev": true, - "license": "MIT", - "peer": true, - "bin": { - "lz-string": "bin/bin.js" - } - }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/marked": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-14.0.0.tgz", - "integrity": "sha512-uIj4+faQ+MgHgwUW1l2PsPglZLOLOT1uErt06dAPtx2kjteLAkbsd/0FiYg/MGS+i7ZKLb7w2WClxHkzOOuryQ==", - "license": "MIT", - "peer": true, - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/mdn-data": { - "version": "2.27.1", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", - "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/memoize-one": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", - "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" - }, - "node_modules/min-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", - "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/minimatch": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz", - "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==", - "dev": true, - "license": "ISC", - "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/mlly": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", - "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.15.0", - "pathe": "^2.0.3", - "pkg-types": "^1.3.1", - "ufo": "^1.6.1" - } - }, - "node_modules/mlly/node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/mlly/node_modules/pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" - } - }, - "node_modules/monaco-editor": { - "version": "0.54.0", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.54.0.tgz", - "integrity": "sha512-hx45SEUoLatgWxHKCmlLJH81xBo0uXP4sRkESUpmDQevfi+e7K1VuiSprK6UpQ8u4zOcKNiH0pMvHvlMWA/4cw==", - "license": "MIT", - "peer": true, - "dependencies": { - "dompurify": "3.1.7", - "marked": "14.0.0" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/muggle-string": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", - "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parse5": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.0.tgz", - "integrity": "sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA==", - "dev": true, - "license": "MIT", - "dependencies": { - "entities": "^6.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5/node_modules/entities": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", - "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "engines": { - "node": ">=8" - } - }, - "node_modules/pathe": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-types": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", - "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", - "dev": true, - "license": "MIT", - "dependencies": { - "confbox": "^0.2.2", - "exsolve": "^1.0.7", - "pathe": "^2.0.3" - } - }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/pretty-format": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", - "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^17.0.1" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - } - }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/quansync": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", - "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/antfu" - }, - { - "type": "individual", - "url": "https://github.com/sponsors/sxzz" - } - ], - "license": "MIT" - }, - "node_modules/react": { - "version": "19.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", - "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", - "license": "MIT", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-chartjs-2": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-5.3.1.tgz", - "integrity": "sha512-h5IPXKg9EXpjoBzUfyWJvllMjG2mQ4EiuHQFhms/AjUm0XSZHhyRy2xVmLXHKrtcdrPO4mnGqRtYoD0vp95A0A==", - "license": "MIT", - "peerDependencies": { - "chart.js": "^4.1.1", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/react-dom": { - "version": "19.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz", - "integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "scheduler": "^0.27.0" - }, - "peerDependencies": { - "react": "^19.2.0" - } - }, - "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/react-refresh": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz", - "integrity": "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-select": { - "version": "5.10.2", - "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.10.2.tgz", - "integrity": "sha512-Z33nHdEFWq9tfnfVXaiM12rbJmk+QjFEztWLtmXqQhz6Al4UZZ9xc0wiatmGtUOCCnHN0WizL3tCMYRENX4rVQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.0", - "@emotion/cache": "^11.4.0", - "@emotion/react": "^11.8.1", - "@floating-ui/dom": "^1.0.1", - "@types/react-transition-group": "^4.4.0", - "memoize-one": "^6.0.0", - "prop-types": "^15.6.0", - "react-transition-group": "^4.3.0", - "use-isomorphic-layout-effect": "^1.2.0" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/react-transition-group": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", - "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", - "dependencies": { - "@babel/runtime": "^7.5.5", - "dom-helpers": "^5.0.1", - "loose-envify": "^1.4.0", - "prop-types": "^15.6.2" - }, - "peerDependencies": { - "react": ">=16.6.0", - "react-dom": ">=16.6.0" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", - "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "indent-string": "^4.0.0", - "strip-indent": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", - "license": "MIT", - "dependencies": { - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "engines": { - "node": ">=4" - } - }, - "node_modules/rollup": { - "version": "4.52.5", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.5.tgz", - "integrity": "sha512-3GuObel8h7Kqdjt0gxkEzaifHTqLVW56Y/bjN7PSQtkKr0w3V/QYSdt6QWYtd7A1xUtYQigtdUfgj1RvWVtorw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.8" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.52.5", - "@rollup/rollup-android-arm64": "4.52.5", - "@rollup/rollup-darwin-arm64": "4.52.5", - "@rollup/rollup-darwin-x64": "4.52.5", - "@rollup/rollup-freebsd-arm64": "4.52.5", - "@rollup/rollup-freebsd-x64": "4.52.5", - "@rollup/rollup-linux-arm-gnueabihf": "4.52.5", - "@rollup/rollup-linux-arm-musleabihf": "4.52.5", - "@rollup/rollup-linux-arm64-gnu": "4.52.5", - "@rollup/rollup-linux-arm64-musl": "4.52.5", - "@rollup/rollup-linux-loong64-gnu": "4.52.5", - "@rollup/rollup-linux-ppc64-gnu": "4.52.5", - "@rollup/rollup-linux-riscv64-gnu": "4.52.5", - "@rollup/rollup-linux-riscv64-musl": "4.52.5", - "@rollup/rollup-linux-s390x-gnu": "4.52.5", - "@rollup/rollup-linux-x64-gnu": "4.52.5", - "@rollup/rollup-linux-x64-musl": "4.52.5", - "@rollup/rollup-openharmony-arm64": "4.52.5", - "@rollup/rollup-win32-arm64-msvc": "4.52.5", - "@rollup/rollup-win32-ia32-msvc": "4.52.5", - "@rollup/rollup-win32-x64-gnu": "4.52.5", - "@rollup/rollup-win32-x64-msvc": "4.52.5", - "fsevents": "~2.3.2" - } - }, - "node_modules/saxes": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", - "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", - "dev": true, - "license": "ISC", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, - "node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT", - "peer": true - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true, - "license": "ISC" - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true, - "license": "MIT" - }, - "node_modules/state-local": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", - "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==", - "license": "MIT" - }, - "node_modules/std-env": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", - "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", - "dev": true, - "license": "MIT" - }, - "node_modules/string-argv": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", - "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.6.19" - } - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", - "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/stylis": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", - "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" - }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", - "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", - "dev": true, - "license": "MIT" - }, - "node_modules/tailwindcss": { - "version": "4.1.17", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.17.tgz", - "integrity": "sha512-j9Ee2YjuQqYT9bbRTfTZht9W/ytp5H+jJpZKiYdP/bpnXARAuELt9ofP0lPnmHjbga7SNQIxdTAXCmtKVYjN+Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/tapable": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", - "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/tinybench": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", - "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyexec": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.3" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyrainbow": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.0.3.tgz", - "integrity": "sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tldts": { - "version": "7.0.25", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.25.tgz", - "integrity": "sha512-keinCnPbwXEUG3ilrWQZU+CqcTTzHq9m2HhoUP2l7Xmi8l1LuijAXLpAJ5zRW+ifKTNscs4NdCkfkDCBYm352w==", - "dev": true, - "license": "MIT", - "dependencies": { - "tldts-core": "^7.0.25" - }, - "bin": { - "tldts": "bin/cli.js" - } - }, - "node_modules/tldts-core": { - "version": "7.0.25", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.25.tgz", - "integrity": "sha512-ZjCZK0rppSBu7rjHYDYsEaMOIbbT+nWF57hKkv4IUmZWBNrBWBOjIElc0mKRgLM8bm7x/BBlof6t2gi/Oq/Asw==", - "dev": true, - "license": "MIT" - }, - "node_modules/tough-cookie": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", - "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tldts": "^7.0.5" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/tr46": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz", - "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/ufo": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.1.tgz", - "integrity": "sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==", - "dev": true, - "license": "MIT" - }, - "node_modules/undici": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.0.tgz", - "integrity": "sha512-jxytwMHhsbdpBXxLAcuu0fzlQeXCNnWdDyRHpvWsUl8vd98UwYdl9YTyn8/HcpcJPC3pwUveefsa3zTxyD/ERg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20.18.1" - } - }, - "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", - "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/use-isomorphic-layout-effect": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.2.1.tgz", - "integrity": "sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/uzip": { - "version": "0.20201231.0", - "resolved": "https://registry.npmjs.org/uzip/-/uzip-0.20201231.0.tgz", - "integrity": "sha512-OZeJfZP+R0z9D6TmBgLq2LHzSSptGMGDGigGiEe0pr8UBe/7fdflgHlHBNDASTXB5jnFuxHpNaJywSg8YFeGng==", - "license": "MIT" - }, - "node_modules/vite": { - "version": "7.1.12", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.12.tgz", - "integrity": "sha512-ZWyE8YXEXqJrrSLvYgrRP7p62OziLW7xI5HYGWFzOvupfAlrLvURSzv/FyGyy0eidogEM3ujU+kUG1zuHgb6Ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.5.0", - "picomatch": "^4.0.3", - "postcss": "^8.5.6", - "rollup": "^4.43.0", - "tinyglobby": "^0.2.15" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^20.19.0 || >=22.12.0", - "jiti": ">=1.21.0", - "less": "^4.0.0", - "lightningcss": "^1.21.0", - "sass": "^1.70.0", - "sass-embedded": "^1.70.0", - "stylus": ">=0.54.8", - "sugarss": "^5.0.0", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/vite-plugin-dts": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-4.5.4.tgz", - "integrity": "sha512-d4sOM8M/8z7vRXHHq/ebbblfaxENjogAAekcfcDCCwAyvGqnPrc7f4NZbvItS+g4WTgerW0xDwSz5qz11JT3vg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@microsoft/api-extractor": "^7.50.1", - "@rollup/pluginutils": "^5.1.4", - "@volar/typescript": "^2.4.11", - "@vue/language-core": "2.2.0", - "compare-versions": "^6.1.1", - "debug": "^4.4.0", - "kolorist": "^1.8.0", - "local-pkg": "^1.0.0", - "magic-string": "^0.30.17" - }, - "peerDependencies": { - "typescript": "*", - "vite": "*" - }, - "peerDependenciesMeta": { - "vite": { - "optional": true - } - } - }, - "node_modules/vitest": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.0.6.tgz", - "integrity": "sha512-gR7INfiVRwnEOkCk47faros/9McCZMp5LM+OMNWGLaDBSvJxIzwjgNFufkuePBNaesGRnLmNfW+ddbUJRZn0nQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/expect": "4.0.6", - "@vitest/mocker": "4.0.6", - "@vitest/pretty-format": "4.0.6", - "@vitest/runner": "4.0.6", - "@vitest/snapshot": "4.0.6", - "@vitest/spy": "4.0.6", - "@vitest/utils": "4.0.6", - "debug": "^4.4.3", - "es-module-lexer": "^1.7.0", - "expect-type": "^1.2.2", - "magic-string": "^0.30.19", - "pathe": "^2.0.3", - "picomatch": "^4.0.3", - "std-env": "^3.9.0", - "tinybench": "^2.9.0", - "tinyexec": "^0.3.2", - "tinyglobby": "^0.2.15", - "tinyrainbow": "^3.0.3", - "vite": "^6.0.0 || ^7.0.0", - "why-is-node-running": "^2.3.0" - }, - "bin": { - "vitest": "vitest.mjs" - }, - "engines": { - "node": "^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - }, - "peerDependencies": { - "@edge-runtime/vm": "*", - "@types/debug": "^4.1.12", - "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.0.6", - "@vitest/browser-preview": "4.0.6", - "@vitest/browser-webdriverio": "4.0.6", - "@vitest/ui": "4.0.6", - "happy-dom": "*", - "jsdom": "*" - }, - "peerDependenciesMeta": { - "@edge-runtime/vm": { - "optional": true - }, - "@types/debug": { - "optional": true - }, - "@types/node": { - "optional": true - }, - "@vitest/browser-playwright": { - "optional": true - }, - "@vitest/browser-preview": { - "optional": true - }, - "@vitest/browser-webdriverio": { - "optional": true - }, - "@vitest/ui": { - "optional": true - }, - "happy-dom": { - "optional": true - }, - "jsdom": { - "optional": true - } - } - }, - "node_modules/vitest-axe": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/vitest-axe/-/vitest-axe-0.1.0.tgz", - "integrity": "sha512-jvtXxeQPg8R/2ANTY8QicA5pvvdRP4F0FsVUAHANJ46YCDASie/cuhlSzu0DGcLmZvGBSBNsNuK3HqfaeknyvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "aria-query": "^5.0.0", - "axe-core": "^4.4.2", - "chalk": "^5.0.1", - "dom-accessibility-api": "^0.5.14", - "lodash-es": "^4.17.21", - "redent": "^3.0.0" - }, - "peerDependencies": { - "vitest": ">=0.16.0" - } - }, - "node_modules/vscode-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", - "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/w3c-xmlserializer": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz", - "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/webidl-conversions": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz", - "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=20" - } - }, - "node_modules/whatwg-mimetype": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", - "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "16.0.1", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.1.tgz", - "integrity": "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@exodus/bytes": "^1.11.0", - "tr46": "^6.0.0", - "webidl-conversions": "^8.0.1" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, - "bin": { - "why-is-node-running": "cli.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/xml-name-validator": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz", - "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", - "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", - "dev": true, - "license": "MIT" - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/yet-another-react-lightbox": { - "version": "3.27.0", - "resolved": "https://registry.npmjs.org/yet-another-react-lightbox/-/yet-another-react-lightbox-3.27.0.tgz", - "integrity": "sha512-SV4U0s7vZfwNWPOqyEP81VyquBu/7m9mVJhKEAgWTWUpsIRD6FFLn5+9RvJ4N0wMrxr7v517GzUNqoDPC2EdHg==", - "license": "MIT", - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "@types/react": "^16 || ^17 || ^18 || ^19", - "@types/react-dom": "^16 || ^17 || ^18 || ^19", - "react": "^16.8.0 || ^17 || ^18 || ^19", - "react-dom": "^16.8.0 || ^17 || ^18 || ^19" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } } - } } diff --git a/templates/_bundled/sirsoft-admin_basic/package.json b/templates/_bundled/sirsoft-admin_basic/package.json index 25215bf5..6074490e 100644 --- a/templates/_bundled/sirsoft-admin_basic/package.json +++ b/templates/_bundled/sirsoft-admin_basic/package.json @@ -1,6 +1,6 @@ { "name": "sirsoft-admin_basic", - "version": "1.0.0", + "version": "1.0.1", "description": "Gnuboard7 Basic Admin Template Components", "type": "module", "main": "dist/components.js", diff --git a/templates/_bundled/sirsoft-admin_basic/template.json b/templates/_bundled/sirsoft-admin_basic/template.json index cc08e62e..c9b533ee 100644 --- a/templates/_bundled/sirsoft-admin_basic/template.json +++ b/templates/_bundled/sirsoft-admin_basic/template.json @@ -5,7 +5,7 @@ "ko": "Admin Basic", "en": "Admin Basic" }, - "version": "1.0.0", + "version": "1.0.1", "license": "MIT", "description": { "ko": "그누보드7 기본 관리자 템플릿", diff --git a/templates/_bundled/sirsoft-basic/CHANGELOG.md b/templates/_bundled/sirsoft-basic/CHANGELOG.md index 0cc20ef7..74e80093 100644 --- a/templates/_bundled/sirsoft-basic/CHANGELOG.md +++ b/templates/_bundled/sirsoft-basic/CHANGELOG.md @@ -4,6 +4,16 @@ 형식은 [Keep a Changelog](https://keepachangelog.com/ko/1.1.0/)를 따르며, [Semantic Versioning](https://semver.org/lang/ko/)을 준수합니다. +## [1.0.1] - 2026-07-06 + +### Added + +- 관리자가 발행 전 페이지를 사용자 화면에서 미리 볼 때, 미발행 상태임을 알리는 안내 표시를 추가했습니다. + +### Fixed + +- 게시글 첨부파일을 허용 개수보다 많이 선택하면, 초과분이 아무 안내 없이 사라지지 않고 "최대 N개까지 첨부할 수 있습니다" 안내 메시지가 표시됩니다. + ## [1.0.0] - 2026-07-01 ### Added diff --git a/templates/_bundled/sirsoft-basic/__tests__/layouts/page-attachment-download-handler.test.tsx b/templates/_bundled/sirsoft-basic/__tests__/layouts/page-attachment-download-handler.test.tsx new file mode 100644 index 00000000..1fc4d595 --- /dev/null +++ b/templates/_bundled/sirsoft-basic/__tests__/layouts/page-attachment-download-handler.test.tsx @@ -0,0 +1,111 @@ +/** + * @file page-attachment-download-handler.test.tsx + * @description 사용자 페이지 상세(page/show)의 첨부 다운로드가 토큰 동반 핸들러로 전환됐는지 회귀 + * (별건: 관리자 상세 첨부 썸네일·다운로드 미노출 — 사용자 화면도 동일 표준으로 정렬). + * + * 검증 방식: 레이아웃 JSON 트리 직접 분석 (DOM 비의존). + * + * 결함: 다운로드가 브라우저 직접 링크였다. + * download_url 은 권한 게이트(미발행)를 가진 공개 라우트이며, 네비게이션에는 + * 토큰이 실리지 않아 권한 관리자의 미발행 첨부 다운로드가 404 로 막혔다. + * + * 수정: 다운로드 버튼을 downloadAttachment 핸들러(토큰 동반 fetch → blob)로 전환. + * + * @scenario surface=page_show + * @effects download_uses_handler_not_anchor + */ + +import { describe, it, expect } from 'vitest'; + +import pageShow from '../../layouts/page/show.json'; + +type Node = Record & { children?: unknown; actions?: unknown }; + +function collectNodes(node: unknown, predicate: (n: Node) => boolean): Node[] { + const result: Node[] = []; + const walk = (cur: unknown): void => { + if (Array.isArray(cur)) { + cur.forEach(walk); + return; + } + if (cur && typeof cur === 'object') { + const obj = cur as Node; + if (predicate(obj)) { + result.push(obj); + } + Object.values(obj).forEach(walk); + } + }; + walk(node); + return result; +} + +describe('별건 — 사용자 페이지 상세(page/show) 첨부 다운로드 핸들러 전환', () => { + it('첨부 다운로드는 download_url 을 가리키는 직접 링크가 아니다', () => { + const anchors = collectNodes( + pageShow, + (n) => + n.name === 'A' && + typeof (n.props as Record | undefined)?.href === 'string' && + String((n.props as Record).href).includes('download_url'), + ); + + expect(anchors.length).toBe(0); + }); + + it('첨부 다운로드는 downloadAttachment 핸들러 click 액션을 사용한다', () => { + const handlerActions = collectNodes(pageShow, (n) => { + const actions = (n.actions ?? []) as Array>; + return ( + Array.isArray(actions) && + actions.some((a) => a.type === 'click' && a.handler === 'downloadAttachment') + ); + }); + + expect(handlerActions.length).toBeGreaterThan(0); + + const node = handlerActions[0]; + const actions = (node.actions ?? []) as Array>; + const clickAction = actions.find( + (a) => a.type === 'click' && a.handler === 'downloadAttachment', + ); + const params = (clickAction?.params ?? {}) as Record; + expect(params.url).toContain('download_url'); + expect(params.filename).toContain('original_filename'); + }); +}); + +describe('별건 — 사용자 페이지 상세(page/show) 이미지 첨부 썸네일', () => { + it('이미지 첨부는 preview_url 을 src 로 하는 썸네일을 렌더한다', () => { + const thumbs = collectNodes(pageShow, (n) => { + const props = (n.props ?? {}) as Record; + return ( + n.name === 'Img' && + typeof props.src === 'string' && + String(props.src).includes('att_item') && + String(props.src).includes('preview_url') + ); + }); + + expect(thumbs.length).toBeGreaterThan(0); + }); + + it('썸네일은 is_image 조건으로만 렌더된다 (일반 파일은 아이콘)', () => { + // preview_url 를 감싸는 노드는 is_image 참일 때만 렌더되어야 한다 + const guarded = collectNodes(pageShow, (n) => { + const ifCond = typeof n.if === 'string' ? (n.if as string) : ''; + const hasImgChild = + collectNodes(n.children, (c) => { + const props = (c.props ?? {}) as Record; + return ( + c.name === 'Img' && + typeof props.src === 'string' && + String(props.src).includes('preview_url') + ); + }).length > 0; + return hasImgChild && ifCond.includes('att_item') && ifCond.includes('is_image'); + }); + + expect(guarded.length).toBeGreaterThan(0); + }); +}); diff --git a/templates/_bundled/sirsoft-basic/__tests__/layouts/page-show-preview-banner.test.tsx b/templates/_bundled/sirsoft-basic/__tests__/layouts/page-show-preview-banner.test.tsx new file mode 100644 index 00000000..07981a11 --- /dev/null +++ b/templates/_bundled/sirsoft-basic/__tests__/layouts/page-show-preview-banner.test.tsx @@ -0,0 +1,79 @@ +/** + * @file page-show-preview-banner.test.tsx + * @description 미발행 페이지 관리자 미리보기 배너 (이슈 #424-15) + * + * 정책: 페이지 조회 권한 관리자가 사용자 화면에서 미발행 페이지를 미리볼 때, + * 상단에 "미발행 페이지 미리보기 중" 안내 배너를 노출한다. 백엔드(PublicPageResource)가 + * 미발행+권한자 응답에만 is_preview=true 를 내려주므로, 배너의 if 는 그 값에 의존한다. + * 발행 페이지·게스트 응답은 is_preview=false → 배너 미노출. + * + * 검증 방식: 실제 page/show.json 레이아웃 트리 직접 분석 (DOM 비의존). + * - 배너 블록이 존재하고 if 가 page.data.is_preview 에 의존하는지 고정 + * - 배너 문구가 다국어 키($t:user.page.preview_banner)로 렌더되는지 고정 + */ + +import { describe, it, expect } from 'vitest'; + +import pageShow from '../../layouts/page/show.json'; + +type Node = Record & { children?: unknown }; + +/** + * 트리를 재귀 순회하며 조건을 만족하는 모든 노드를 수집한다. + */ +function collectNodes(node: unknown, predicate: (n: Node) => boolean): Node[] { + const result: Node[] = []; + const walk = (cur: unknown): void => { + if (Array.isArray(cur)) { + cur.forEach(walk); + return; + } + if (cur && typeof cur === 'object') { + const obj = cur as Node; + if (predicate(obj)) { + result.push(obj); + } + Object.values(obj).forEach(walk); + } + }; + walk(node); + return result; +} + +/** + * id 로 노드를 찾는다. + */ +function findById(root: unknown, id: string): Node | undefined { + return collectNodes(root, (n) => n.id === id)[0]; +} + +describe('이슈 #424-15 — 미발행 페이지 미리보기 배너 (page/show.json)', () => { + it('미리보기 배너 블록(page_preview_banner)이 존재한다', () => { + const banner = findById(pageShow, 'page_preview_banner'); + expect(banner).toBeDefined(); + }); + + it('배너의 if 가 page.data.is_preview 에 의존한다 (발행/게스트는 미노출)', () => { + const banner = findById(pageShow, 'page_preview_banner'); + expect(typeof banner?.if).toBe('string'); + expect(banner?.if as string).toContain('is_preview'); + // 단일 바인딩 형태 {{...}} 여야 엔진이 식으로 평가 (CLAUDE.md if 규칙) + expect((banner?.if as string).trim()).toMatch(/^\{\{.*\}\}$/); + }); + + it('배너 문구가 다국어 키로 렌더된다 (하드코딩 금지)', () => { + const banner = findById(pageShow, 'page_preview_banner'); + const spans = collectNodes(banner, (n) => n.name === 'Span' && typeof n.text === 'string'); + const texts = spans.map((s) => s.text as string); + expect(texts).toContain('$t:user.page.preview_banner'); + }); + + it('배너가 본문 카드(page_content_card) 내부, 제목 영역보다 앞에 위치한다', () => { + const card = findById(pageShow, 'page_content_card'); + expect(card).toBeDefined(); + const children = card?.children as Node[]; + expect(Array.isArray(children)).toBe(true); + // 첫 자식이 미리보기 배너여야 함 (제목/발행일보다 위) + expect(children[0]?.id).toBe('page_preview_banner'); + }); +}); diff --git a/templates/_bundled/sirsoft-basic/dist/css/components.css b/templates/_bundled/sirsoft-basic/dist/css/components.css index 63e26ca5..de777887 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-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:0deg}.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;pointer-events:auto;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);-webkit-user-select:none;-moz-user-select:none;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)}[dir=rtl] .yarl__counter{left:var(--yarl__counter_rtl_left,unset);right:var(--yarl__counter_rtl_right,0)}.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 35367b90..9c5a4843 100644 --- a/templates/_bundled/sirsoft-basic/dist/js/components.iife.js +++ b/templates/_bundled/sirsoft-basic/dist/js/components.iife.js @@ -1,23 +1,24 @@ -var SirsoftBasic=(function(J,d,k,Jt){"use strict";function Mc(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const r in e)if(r!=="default"){const n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:()=>e[r]})}}return t.default=e,Object.freeze(t)}const T=Mc(k),Oc=()=>window.G7Core,Q=k.forwardRef(({children:e,variant:t="primary",size:r="md",className:n="",...o},a)=>{const s="inline-flex items-center justify-center",l=Oc()?.style?.mergeClasses?.(s,n)??`${s} ${n}`;return d.jsx("button",{ref:a,className:l,...o,children:e})});Q.displayName="Button";const W=k.forwardRef(({children:e,className:t="",...r},n)=>d.jsx("div",{ref:n,className:t,...r,children:e})),te=({children:e,className:t="",...r})=>d.jsx("span",{className:t,...r,children:e}),fn=({children:e,className:t="",...r})=>d.jsx("svg",{className:t,...r,children:e}),xt=k.forwardRef(({label:e,error:t,className:r="",onChange:n,onKeyPress:o,value:a,defaultValue:s,type:l="text",checked:g,defaultChecked:h,...c},i)=>{const u=l==="radio"||l==="checkbox",f=k.useRef(!1),p=k.useRef(null);k.useImperativeHandle(i,()=>p.current);const[m,w]=k.useState(a??s??"");k.useEffect(()=>{!u&&!f.current&&a!==void 0&&w(a)},[a,u]);const x=k.useCallback(()=>{f.current=!0},[]),A=k.useCallback(y=>{if(f.current=!1,n){const N=y.target.value;w(N);const M=new Event("change",{bubbles:!0});Object.defineProperty(M,"target",{writable:!1,value:{value:N}}),Object.defineProperty(M,"currentTarget",{writable:!1,value:{value:N}}),n(M)}},[n]),v=k.useCallback(y=>{const N=y.target.value;w(N),!f.current&&n&&n(y)},[n]),E=k.useCallback(y=>{f.current||o&&o(y)},[o]),{loadingactions:O,formdata:_,...I}=c;if(u)return d.jsx("input",{ref:p,type:l,className:r,onChange:n,checked:g,defaultChecked:h,value:a,...I});const C=a!==void 0?{value:m}:{defaultValue:s};return d.jsx("input",{ref:p,type:l,className:r,onChange:v,onKeyPress:E,onCompositionStart:x,onCompositionEnd:A,...C,...I})});xt.displayName="Input";const Ga=k.forwardRef(({accept:e,maxSize:t,onChange:r,onError:n,buttonText:o="Browse",placeholder:a="No file selected",className:s="",disabled:l,...g},h)=>{const c=k.useRef(null),i=h||c,[u,f]=k.useState(""),p={},m={};Object.entries(g).forEach(([v,E])=>{v.startsWith("data-editor-")||v==="id"||v==="onMouseMove"||v==="onMouseLeave"?p[v]=E:m[v]=E});const w=k.useCallback(()=>{!l&&i.current&&i.current.click()},[l,i]),x=k.useCallback(v=>{const E=v.target.files?.[0]||null;if(!E){f(""),r?.(null);return}if(t&&E.size>t*1024*1024){const O=`File size exceeds ${t}MB limit`;n?.(O),i.current&&(i.current.value=""),f("");return}f(E.name),r?.(E)},[t,r,n,i]),A=k.useCallback(v=>{v.stopPropagation(),i.current&&(i.current.value=""),f(""),r?.(null)},[r,i]);return d.jsxs(W,{className:`flex items-center gap-2 ${s}`,...p,children:[d.jsx(xt,{ref:i,type:"file",accept:e,onChange:x,disabled:l,className:"hidden",...m}),d.jsx(Q,{type:"button",onClick:w,disabled:l,className:"px-4 py-2 bg-gray-100 dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-md text-sm font-medium text-gray-700 dark:text-gray-200 hover:bg-gray-200 dark:hover:bg-gray-600 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 disabled:opacity-50 disabled:cursor-not-allowed",children:o}),d.jsx(te,{className:"flex-1 text-sm text-gray-600 dark:text-gray-400 truncate",children:u||a}),u&&!l&&d.jsx(Q,{type:"button",onClick:A,className:"p-1 text-gray-400 hover:text-gray-600 dark:hover:text-gray-200","aria-label":"Clear file",children:d.jsx(fn,{className:"w-4 h-4",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"})})})]})});Ga.displayName="FileInput";var Je=(e=>(e.User="fa-user",e.Users="fa-users",e.UserCircle="fa-user-circle",e.UserPlus="fa-user-plus",e.UserMinus="fa-user-minus",e.UserShield="fa-user-shield",e.Search="fa-search",e.Edit="fa-edit",e.Pencil="fa-pencil-alt",e.Trash="fa-trash",e.Save="fa-save",e.Plus="fa-plus",e.Minus="fa-minus",e.Check="fa-check",e.Times="fa-times",e.Download="fa-download",e.Upload="fa-upload",e.Copy="fa-copy",e.ExternalLink="fa-external-link-alt",e.Home="fa-home",e.ChevronLeft="fa-chevron-left",e.ChevronRight="fa-chevron-right",e.ChevronUp="fa-chevron-up",e.ChevronDown="fa-chevron-down",e.AngleLeft="fa-angle-left",e.AngleRight="fa-angle-right",e.AngleUp="fa-angle-up",e.AngleDown="fa-angle-down",e.ArrowUp="fa-arrow-up",e.ArrowDown="fa-arrow-down",e.ArrowLeft="fa-arrow-left",e.ArrowRight="fa-arrow-right",e.Bars="fa-bars",e.EllipsisVertical="fa-ellipsis-v",e.EllipsisHorizontal="fa-ellipsis-h",e.CheckCircle="fa-check-circle",e.TimesCircle="fa-times-circle",e.ExclamationCircle="fa-exclamation-circle",e.ExclamationTriangle="fa-exclamation-triangle",e.InfoCircle="fa-info-circle",e.QuestionCircle="fa-question-circle",e.XCircle="fa-times-circle",e.ShoppingCart="fa-shopping-cart",e.ShoppingBag="fa-shopping-bag",e.CreditCard="fa-credit-card",e.Tag="fa-tag",e.Tags="fa-tags",e.File="fa-file",e.FileAlt="fa-file-alt",e.Folder="fa-folder",e.FolderOpen="fa-folder-open",e.Envelope="fa-envelope",e.Phone="fa-phone",e.Comment="fa-comment",e.Comments="fa-comments",e.Cog="fa-cog",e.Cogs="fa-cogs",e.Settings="fa-cog",e.Wrench="fa-wrench",e.Sliders="fa-sliders-h",e.Image="fa-image",e.Images="fa-images",e.Video="fa-video",e.Camera="fa-camera",e.Heart="fa-heart",e.Star="fa-star",e.ThumbsUp="fa-thumbs-up",e.ThumbsDown="fa-thumbs-down",e.Share="fa-share",e.Clock="fa-clock",e.Calendar="fa-calendar",e.CalendarAlt="fa-calendar-alt",e.Lock="fa-lock",e.Unlock="fa-unlock",e.Eye="fa-eye",e.EyeSlash="fa-eye-slash",e.Bell="fa-bell",e.Flag="fa-flag",e.Map="fa-map",e.MapMarker="fa-map-marker-alt",e.Globe="fa-globe",e.Link="fa-link",e.Unlink="fa-unlink",e.Sun="fa-sun",e.Moon="fa-moon",e.ChartBar="fa-chart-bar",e.ChartLine="fa-chart-line",e.ChartPie="fa-chart-pie",e.ChartArea="fa-chart-area",e.Spinner="fa-spinner",e.CircleNotch="fa-circle-notch",e.CheckBadge="fa-badge-check",e.BellSlash="fa-bell-slash",e.BookOpen="fa-book-open",e.Building="fa-building",e.FileCircleCheck="fa-file-circle-check",e.WandMagicSparkles="fa-wand-magic-sparkles",e.UserXmark="fa-user-xmark",e.Cube="fa-cube",e.Cubes="fa-cubes",e.Plug="fa-plug",e.PuzzlePiece="fa-puzzle-piece",e.Fire="fa-fire",e.CommentDots="fa-comment-dots",e.DollarSign="fa-dollar-sign",e.Bars2="fa-bars",e.X="fa-times",e.List="fa-list",e.ThLarge="fa-th-large",e.Inbox="fa-inbox",e.Box="fa-box",e.PaperPlane="fa-paper-plane",e.FileText="fa-file-alt",e.Paperclip="fa-paperclip",e.Truck="fa-truck",e.Sync="fa-sync",e.RotateLeft="fa-rotate-left",e.MapPin="fa-map-marker-alt",e.HelpCircle="fa-question-circle",e))(Je||{});const Ic={user:"fa-user",users:"fa-users","user-circle":"fa-user-circle","user-plus":"fa-user-plus","user-minus":"fa-user-minus","user-shield":"fa-user-shield",search:"fa-search",edit:"fa-edit",pencil:"fa-pencil-alt",trash:"fa-trash",save:"fa-save",plus:"fa-plus",minus:"fa-minus",check:"fa-check",times:"fa-times",download:"fa-download",upload:"fa-upload",copy:"fa-copy","external-link":"fa-external-link-alt",home:"fa-home","chevron-left":"fa-chevron-left","chevron-right":"fa-chevron-right","chevron-up":"fa-chevron-up","chevron-down":"fa-chevron-down","angle-left":"fa-angle-left","angle-right":"fa-angle-right","angle-up":"fa-angle-up","angle-down":"fa-angle-down","arrow-up":"fa-arrow-up","arrow-down":"fa-arrow-down","arrow-left":"fa-arrow-left","arrow-right":"fa-arrow-right",bars:"fa-bars","ellipsis-vertical":"fa-ellipsis-v","ellipsis-v":"fa-ellipsis-v","ellipsis-horizontal":"fa-ellipsis-h","ellipsis-h":"fa-ellipsis-h","check-circle":"fa-check-circle","times-circle":"fa-times-circle","x-circle":"fa-times-circle","exclamation-circle":"fa-exclamation-circle","exclamation-triangle":"fa-exclamation-triangle","info-circle":"fa-info-circle","question-circle":"fa-question-circle","shopping-cart":"fa-shopping-cart","shopping-bag":"fa-shopping-bag","credit-card":"fa-credit-card",tag:"fa-tag",tags:"fa-tags",file:"fa-file","file-alt":"fa-file-alt",folder:"fa-folder","folder-open":"fa-folder-open",envelope:"fa-envelope",phone:"fa-phone",comment:"fa-comment",comments:"fa-comments",cog:"fa-cog",cogs:"fa-cogs",settings:"fa-cog",wrench:"fa-wrench",sliders:"fa-sliders-h",image:"fa-image",images:"fa-images",video:"fa-video",camera:"fa-camera",heart:"fa-heart",star:"fa-star","thumbs-up":"fa-thumbs-up","thumbs-down":"fa-thumbs-down",share:"fa-share",clock:"fa-clock",calendar:"fa-calendar","calendar-alt":"fa-calendar-alt",lock:"fa-lock",unlock:"fa-unlock",eye:"fa-eye","eye-slash":"fa-eye-slash",bell:"fa-bell",flag:"fa-flag",map:"fa-map","map-marker":"fa-map-marker-alt",globe:"fa-globe",link:"fa-link",unlink:"fa-unlink",sun:"fa-sun",moon:"fa-moon","chart-bar":"fa-chart-bar","chart-line":"fa-chart-line","chart-pie":"fa-chart-pie","chart-area":"fa-chart-area",spinner:"fa-spinner","circle-notch":"fa-circle-notch","check-badge":"fa-badge-check","badge-check":"fa-badge-check",cube:"fa-cube",cubes:"fa-cubes",plug:"fa-plug","puzzle-piece":"fa-puzzle-piece",flame:"fa-fire",fire:"fa-fire","message-square":"fa-comment-dots","dollar-sign":"fa-dollar-sign",menu:"fa-bars",x:"fa-times",list:"fa-list","layout-grid":"fa-th-large","th-large":"fa-th-large",grid:"fa-th-large",inbox:"fa-inbox",package:"fa-box",box:"fa-box",send:"fa-paper-plane","paper-plane":"fa-paper-plane","file-text":"fa-file-alt",paperclip:"fa-paperclip",truck:"fa-truck","refresh-cw":"fa-sync",sync:"fa-sync","undo-2":"fa-rotate-left","rotate-left":"fa-rotate-left","map-pin":"fa-map-marker-alt","help-circle":"fa-question-circle","alert-triangle":"fa-exclamation-triangle","bell-off":"fa-bell-slash","book-open":"fa-book-open",building:"fa-building","edit-2":"fa-edit","edit-3":"fa-edit","file-check":"fa-file-circle-check",mail:"fa-envelope",sparkles:"fa-wand-magic-sparkles","trash-2":"fa-trash","user-x":"fa-user-xmark"},ce=({name:e,iconStyle:t="solid",size:r,color:n,spin:o=!1,pulse:a=!1,fixedWidth:s=!1,ariaLabel:l,className:g="",style:h,...c})=>{const i={solid:"fas",regular:"far",light:"fal",duotone:"fad",brands:"fab"},u=typeof e=="string"?e:String(e),f=Ic[u],p=f?String(f).replace(/^fa-/,""):u.replace(/^fa-/,""),m=[i[t],`fa-${p}`,r&&`fa-${r}`,o&&"fa-spin",a&&"fa-pulse",s&&"fa-fw",n,g].filter(Boolean).join(" "),w=l||p.replace(/-/g," ");return d.jsx("i",{className:m,style:h,"aria-label":w,role:"img",...c})},br=(e,t)=>window.G7Core?.t?.(e,t)??e,ro={minLength:{key:"minLength",labelKey:"auth.password_input.rules.minLength",defaultParam:6,validate:(e,t=6)=>e.length>=t},maxLength:{key:"maxLength",labelKey:"auth.password_input.rules.maxLength",defaultParam:20,validate:(e,t=20)=>e.length<=t},hasUppercase:{key:"hasUppercase",labelKey:"auth.password_input.rules.hasUppercase",validate:e=>/[A-Z]/.test(e)},hasLowercase:{key:"hasLowercase",labelKey:"auth.password_input.rules.hasLowercase",validate:e=>/[a-z]/.test(e)},hasNumber:{key:"hasNumber",labelKey:"auth.password_input.rules.hasNumber",validate:e=>/[0-9]/.test(e)},hasSpecial:{key:"hasSpecial",labelKey:"auth.password_input.rules.hasSpecial",validate:e=>/[!@#$%^&*(),.?":{}|<>]/.test(e)},noSpaces:{key:"noSpaces",labelKey:"auth.password_input.rules.noSpaces",validate:e=>!/\s/.test(e)},minTypes:{key:"minTypes",labelKey:"auth.password_input.rules.minTypes",defaultParam:3,validate:(e,t=3)=>{let r=0;return/[A-Z]/.test(e)&&r++,/[a-z]/.test(e)&&r++,/[0-9]/.test(e)&&r++,/[!@#$%^&*(),.?":{}|<>]/.test(e)&&r++,r>=t}}},ja=[ro.minLength];function Dc(e){const[t,r]=e.split(":"),n=ro[t];if(!n)return null;const o=r?parseInt(r,10):n.defaultParam;return{rule:n,param:isNaN(o)?n.defaultParam:o}}const Ba=k.forwardRef(({label:e,error:t,showToggle:r=!0,showValidation:n=!1,isConfirmField:o=!1,confirmTarget:a,onMatchChange:s,onValidityChange:l,rules:g,enableRules:h,showRules:c,wrapperClassName:i="",validationClassName:u="",className:f="",onChange:p,value:m,defaultValue:w,disabled:x,...A},v)=>{const E=k.useRef(null);k.useImperativeHandle(v,()=>E.current);const[O,_]=k.useState(!1),[I,C]=k.useState(!1),[y,N]=k.useState(m??w??"");k.useEffect(()=>{m!==void 0&&N(m)},[m]);const M=k.useMemo(()=>g&&g.length>0?g.map(j=>({rule:j,param:j.defaultParam})):h&&h.length>0?h.map(j=>Dc(j)).filter(j=>j!==null):ja.map(j=>({rule:j,param:j.defaultParam})),[g,h]),P=k.useMemo(()=>!c||c.length===0?M:M.filter(j=>c.includes(j.rule.key)),[M,c]),D=k.useMemo(()=>!n||o?{}:P.reduce((j,{rule:H,param:q})=>(j[H.key]=H.validate(y,q),j),{}),[y,P,n,o]),L=k.useMemo(()=>!o||a===void 0?!0:y===a&&y.length>0,[o,y,a]),$=k.useMemo(()=>n?Object.values(D).every(j=>j):!0,[D,n]);k.useEffect(()=>{if(l&&n&&!o){const j=Object.entries(D).filter(([,H])=>!H).map(([H])=>H);l($,j)}},[$,D,l,n,o]),k.useEffect(()=>{s&&o&&s(L)},[L,s,o]);const S=k.useCallback(()=>{_(j=>!j)},[]),b=k.useCallback(j=>{const H=j.target.value;N(H),p&&p(j)},[p]),U=k.useCallback(j=>{C(j.getModifierState("CapsLock"))},[]),{loadingactions:F,formdata:G,...Y}=A,B={},V={};for(const[j,H]of Object.entries(Y))j.startsWith("data-editor-")||j==="onMouseMove"||j==="onMouseLeave"?B[j]=H:V[j]=H;return d.jsxs("div",{className:`relative ${i}`,...B,children:[d.jsxs("div",{className:"relative",children:[d.jsx("input",{ref:E,type:O?"text":"password",className:`${f} ${r?"pr-10":""}`,value:m!==void 0?m:void 0,defaultValue:m===void 0?w:void 0,onChange:b,onKeyDown:U,onKeyUp:U,disabled:x,...V}),r&&d.jsx("button",{type:"button",onClick:S,disabled:x,className:"absolute right-2 top-1/2 -translate-y-1/2 p-1 text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200 disabled:opacity-50 disabled:cursor-not-allowed dark:disabled:opacity-50","aria-label":br(O?"auth.password_input.hide":"auth.password_input.show"),children:d.jsx(ce,{name:O?"eye-slash":"eye",className:"w-5 h-5"})})]}),I&&!O&&d.jsxs("div",{className:"mt-2 flex items-center gap-1.5 text-sm text-yellow-600 dark:text-yellow-400",children:[d.jsx(ce,{name:"triangle-exclamation",className:"w-4 h-4"}),d.jsx("span",{children:br("auth.password_input.caps_lock_on")})]}),o&&a!==void 0&&y.length>0&&d.jsxs("div",{className:`mt-2 flex items-center gap-1.5 text-sm ${L?"text-green-600 dark:text-green-400":"text-red-600 dark:text-red-400"}`,children:[d.jsx(ce,{name:L?"check-circle":"xmark-circle",className:"w-4 h-4"}),d.jsx("span",{children:br(L?"auth.password_input.match":"auth.password_input.mismatch")})]}),n&&!o&&y.length>0&&d.jsx("div",{className:`mt-2 space-y-1 ${u}`,children:P.map(({rule:j,param:H})=>{const q=D[j.key],ue=H!==void 0?{count:H}:void 0;return d.jsxs("div",{className:`flex items-center gap-1.5 text-sm ${q?"text-green-600 dark:text-green-400":"text-gray-500 dark:text-gray-400"}`,children:[d.jsx(ce,{name:q?"check-circle":"circle",className:"w-4 h-4"}),d.jsx("span",{children:br(j.labelKey,ue)})]},j.key)})}),t&&d.jsx("p",{className:"mt-1 text-sm text-red-600 dark:text-red-400",children:t})]})});Ba.displayName="PasswordInput";const no=({label:e,error:t,className:r="",onChange:n,value:o,defaultValue:a,...s})=>{const l=k.useRef(!1),g=k.useRef(null),[h,c]=k.useState(o??a??"");k.useEffect(()=>{!l.current&&o!==void 0&&c(o)},[o]);const i=k.useCallback(()=>{l.current=!0},[]),u=k.useCallback(A=>{if(l.current=!1,n){const v=A.target.value;c(v);const E=new Event("change",{bubbles:!0});Object.defineProperty(E,"target",{writable:!1,value:{value:v}}),Object.defineProperty(E,"currentTarget",{writable:!1,value:{value:v}}),n(E)}},[n]),f=k.useCallback(A=>{const v=A.target.value;c(v),!l.current&&n&&n(A)},[n]),{loadingactions:p,formdata:m,...w}=s,x=o!==void 0?{value:h}:{defaultValue:a};return d.jsx("textarea",{ref:g,className:r,onChange:f,onCompositionStart:i,onCompositionEnd:u,...x,...w})},yr=({children:e,className:t="",...r})=>d.jsx("label",{className:t,...r,children:e}),Dt=({children:e,className:t="",...r})=>d.jsx("p",{className:t,...r,children:e}),Lt=({className:e="",alt:t="",...r})=>d.jsx("img",{className:e,alt:t,...r}),Lc=({children:e,className:t="",...r})=>d.jsx("h1",{className:t,...r,children:e}),Wa=({children:e,className:t="",...r})=>d.jsx("h2",{className:t,...r,children:e}),gn=({children:e,className:t="",...r})=>d.jsx("h3",{className:t,...r,children:e}),Ka=({children:e,className:t="",...r})=>d.jsx("h4",{className:t,...r,children:e}),oo=({children:e,className:t="",...r})=>d.jsx("ul",{className:t,...r,children:e}),Pc=({children:e,className:t="",...r})=>d.jsx("ol",{className:t,...r,children:e}),Xt=({children:e,className:t="",...r})=>d.jsx("li",{className:t,...r,children:e}),ao=({children:e,className:t="",...r})=>d.jsx("a",{className:t,...r,children:e}),so=({children:e,className:t="",...r})=>d.jsx("form",{className:t,...r,children:e}),Fc=window.G7Core?.createLogger?.("Comp:Select")??{log:(...e)=>console.log("[Comp:Select]",...e),warn:(...e)=>console.warn("[Comp:Select]",...e),error:(...e)=>console.error("[Comp:Select]",...e)};function Uc(e){const t=window.G7Core?.state?.get?.("_global.appConfig.localeNames")?.[e];return t||{ko:"한국어",en:"English",ja:"日本語",zh:"中文",es:"Español",fr:"Français",de:"Deutsch"}[e]||e}const Va=({children:e,label:t,error:r,options:n,className:o="",value:a,onChange:s,disabled:l,searchable:g=!1,searchPlaceholder:h,editorAttrs:c,...i})=>{const[u,f]=k.useState(!1),[p,m]=k.useState(""),[w,x]=k.useState(null),A=k.useRef(null),v=k.useRef(null),E=k.useRef(null),O=k.useRef(null),_=k.useMemo(()=>n?Array.isArray(n)?n.length===0?[]:typeof n[0]=="string"?n.map(S=>({value:S,label:Uc(S)})):n:(Fc.warn("options prop is not an array:",n),null):null,[n]),I=k.useMemo(()=>_&&_.find(b=>String(b.value)===String(a))?.label||"",[_,a]),C=k.useMemo(()=>{if(!_)return null;if(!g||p.trim()==="")return _;const S=p.trim().toLowerCase();return _.filter(b=>b.label.toLowerCase().includes(S)||String(b.value).toLowerCase().includes(S))},[_,g,p]);k.useEffect(()=>{if(u&&g){m("");const S=setTimeout(()=>E.current?.focus(),0);return()=>clearTimeout(S)}u||m("")},[u,g]);const y=k.useCallback(()=>{if(!v.current)return;const S=v.current.getBoundingClientRect(),b=window.innerHeight-S.bottom,F=b<280&&S.top>b;x(F?{bottom:window.innerHeight-S.top+4,left:S.left,width:S.width}:{top:S.bottom+4,left:S.left,width:S.width})},[]);k.useEffect(()=>{if(!u){x(null);return}return y(),window.addEventListener("scroll",y,!0),window.addEventListener("resize",y),()=>{window.removeEventListener("scroll",y,!0),window.removeEventListener("resize",y)}},[u,y]),k.useEffect(()=>{const S=b=>{const U=b.target;A.current&&!A.current.contains(U)&&(!O.current||!O.current.contains(U))&&f(!1)};return u&&document.addEventListener("mousedown",S),()=>{document.removeEventListener("mousedown",S)}},[u]),k.useEffect(()=>{const S=b=>{b.key==="Escape"&&u&&(f(!1),v.current?.focus())};return document.addEventListener("keydown",S),()=>document.removeEventListener("keydown",S)},[u]);const N=()=>{l||f(!u)},M=S=>{s&&s({target:{value:S},preventDefault:()=>{},stopPropagation:()=>{},type:"change"}),f(!1),v.current?.focus()};if(!_)return d.jsx("select",{className:o,value:a,onChange:s,disabled:l,...c,...i,children:e});const P=o&&o.includes("bg-"),D=o&&/text-(gray|red|blue|green|yellow|white|black|indigo|purple|pink|orange|amber|emerald|teal|cyan|slate)-\d+|text-white|text-black/.test(o),L=P?`${o}${D?"":" text-gray-700 dark:text-gray-200"}`:`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 ${o}`,$={...c,...i};return d.jsxs(W,{ref:A,className:"relative",...$,children:[d.jsxs(Q,{ref:v,type:"button",onClick:N,disabled:l,className:`${L} flex items-center justify-between gap-2 text-left cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed`,"aria-haspopup":"listbox","aria-expanded":u,children:[d.jsx(te,{className:"truncate",children:I||" "}),d.jsx(fn,{className:`w-4 h-4 flex-shrink-0 transition-transform duration-200 ${u?"rotate-180":""}`,fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:d.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M19 9l-7 7-7-7"})})]}),u&&w&&Jt.createPortal(d.jsxs(W,{ref:O,className:"fixed z-[9999] bg-white dark:bg-gray-800 rounded-2xl shadow-lg border border-gray-200 dark:border-gray-600 overflow-hidden",style:{top:w.top,bottom:w.bottom,left:w.left,width:w.width},role:"listbox",children:[g&&d.jsx(W,{className:"p-2 border-b border-gray-200 dark:border-gray-600",children:d.jsx(xt,{ref:E,type:"text",value:p,onChange:S=>m(S.target.value),placeholder:h??"Search...",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",role:"searchbox","aria-label":h??"Search"})}),d.jsxs(W,{className:"py-2 max-h-60 overflow-auto",children:[C&&C.length===0&&d.jsx(W,{className:"px-4 py-3 text-sm text-gray-500 dark:text-gray-400 text-center",children:p?"No results":""}),(C??[]).map(S=>{const b=String(S.value)===String(a);return d.jsxs(Q,{type:"button",onClick:()=>!S.disabled&&M(S.value),disabled:S.disabled,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 ${b?"text-blue-600 dark:text-blue-400 font-medium":"text-gray-700 dark:text-gray-200"} ${S.disabled?"opacity-50 cursor-not-allowed":"cursor-pointer"}`,role:"option","aria-selected":b,children:[d.jsx(te,{children:S.label}),b&&d.jsx(fn,{className:"w-5 h-5 text-blue-600 dark:text-blue-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:d.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M5 13l4 4L19 7"})})]},S.value)})]})]}),document.body)]})},$c=({children:e,className:t="",...r})=>d.jsx("option",{className:t,...r,children:e}),zc=({children:e,className:t="",...r})=>d.jsx("optgroup",{className:t,...r,children:e}),Ya=k.forwardRef(({label:e,className:t="",...r},n)=>d.jsx("input",{ref:n,type:"checkbox",className:t,...r}));Ya.displayName="Checkbox";const Hc=({children:e,className:t="",...r})=>d.jsx("table",{className:t,...r,children:e}),Gc=({children:e,className:t="",...r})=>d.jsx("thead",{className:t,...r,children:e}),jc=({children:e,className:t="",...r})=>d.jsx("tbody",{className:t,...r,children:e}),Bc=({children:e,className:t="",...r})=>d.jsx("tr",{className:t,...r,children:e}),Wc=({children:e,className:t="",...r})=>d.jsx("th",{className:t,...r,children:e}),Kc=({children:e,className:t="",...r})=>d.jsx("td",{className:t,...r,children:e}),Ur=k.forwardRef(({children:e,className:t="",...r},n)=>d.jsx("nav",{ref:n,className:t,...r,children:e}));Ur.displayName="Nav";const Xa=({children:e,className:t="",...r})=>d.jsx("section",{className:t,...r,children:e}),Vc=({children:e,className:t="",...r})=>d.jsx("code",{className:t,...r,children:e}),lo=k.forwardRef(({className:e="",...t},r)=>d.jsx("hr",{ref:r,className:e,...t})),Yc=k.forwardRef(({children:e,className:t="",...r},n)=>d.jsx("header",{ref:n,className:t,...r,children:e})),qa=e=>e==="auto"?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":e,io=e=>{const t=qa(e);document.documentElement.setAttribute("data-theme",t),t==="dark"?document.documentElement.classList.add("dark"):document.documentElement.classList.remove("dark")},Xc=()=>{const e=localStorage.getItem("g7_color_scheme");return e&&["auto","light","dark"].includes(e)?e:"auto"},hn=({onThemeChange:e,className:t="",autoText:r="System",lightText:n="Light",darkText:o="Dark",id:a,editorAttrs:s})=>{const l=Xc(),[g,h]=k.useState(l),[c,i]=k.useState(!1),u=k.useRef(null);k.useEffect(()=>{io(g)},[]),k.useEffect(()=>{if(g!=="auto")return;const m=window.matchMedia("(prefers-color-scheme: dark)"),w=()=>{io("auto")};return m.addEventListener("change",w),()=>m.removeEventListener("change",w)},[g]),k.useEffect(()=>{const m=w=>{u.current&&!u.current.contains(w.target)&&i(!1)};return document.addEventListener("mousedown",m),()=>document.removeEventListener("mousedown",m)},[]);const f=m=>{h(m),localStorage.setItem("g7_color_scheme",m),io(m),i(!1),e?.(m)},p=()=>qa(g)==="dark"?Je.Moon:Je.Sun;return d.jsxs(W,{ref:u,className:`relative ${t}`,id:a,...s,children:[d.jsx(Q,{onClick:()=>i(!c),className:"p-2 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-lg transition-colors text-gray-600 dark:text-gray-400","aria-label":"Toggle theme",children:d.jsx(ce,{name:p(),className:"w-5 h-5"})}),c&&d.jsx(W,{className:"absolute right-0 mt-2 w-48 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-lg z-50",children:d.jsxs(W,{className:"py-2",children:[d.jsxs(Q,{onClick:()=>f("auto"),className:` +var SirsoftBasic=(function(J,d,C,Rt){"use strict";function Gc(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const r in e)if(r!=="default"){const n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:()=>e[r]})}}return t.default=e,Object.freeze(t)}const E=Gc(C),jc=()=>window.G7Core,Q=C.forwardRef(({children:e,variant:t="primary",size:r="md",className:n="",...o},a)=>{const s="inline-flex items-center justify-center",l=jc()?.style?.mergeClasses?.(s,n)??`${s} ${n}`;return d.jsx("button",{ref:a,className:l,...o,children:e})});Q.displayName="Button";const W=C.forwardRef(({children:e,className:t="",...r},n)=>d.jsx("div",{ref:n,className:t,...r,children:e})),re=({children:e,className:t="",...r})=>d.jsx("span",{className:t,...r,children:e}),mn=({children:e,className:t="",...r})=>d.jsx("svg",{className:t,...r,children:e}),_t=C.forwardRef(({label:e,error:t,className:r="",onChange:n,onKeyPress:o,value:a,defaultValue:s,type:l="text",checked:f,defaultChecked:h,...c},i)=>{const u=l==="radio"||l==="checkbox",g=C.useRef(!1),p=C.useRef(null);C.useImperativeHandle(i,()=>p.current);const[m,v]=C.useState(a??s??"");C.useEffect(()=>{!u&&!g.current&&a!==void 0&&v(a)},[a,u]);const x=C.useCallback(()=>{g.current=!0},[]),M=C.useCallback(y=>{if(g.current=!1,n){const N=y.target.value;v(N);const D=new Event("change",{bubbles:!0});Object.defineProperty(D,"target",{writable:!1,value:{value:N}}),Object.defineProperty(D,"currentTarget",{writable:!1,value:{value:N}}),n(D)}},[n]),w=C.useCallback(y=>{const N=y.target.value;v(N),!g.current&&n&&n(y)},[n]),T=C.useCallback(y=>{g.current||o&&o(y)},[o]),{loadingactions:A,formdata:_,...I}=c;if(u)return d.jsx("input",{ref:p,type:l,className:r,onChange:n,checked:f,defaultChecked:h,value:a,...I});const k=a!==void 0?{value:m}:{defaultValue:s};return d.jsx("input",{ref:p,type:l,className:r,onChange:w,onKeyPress:T,onCompositionStart:x,onCompositionEnd:M,...k,...I})});_t.displayName="Input";const Va=C.forwardRef(({accept:e,maxSize:t,onChange:r,onError:n,buttonText:o="Browse",placeholder:a="No file selected",className:s="",disabled:l,...f},h)=>{const c=C.useRef(null),i=h||c,[u,g]=C.useState(""),p={},m={};Object.entries(f).forEach(([w,T])=>{w.startsWith("data-editor-")||w==="id"||w==="onMouseMove"||w==="onMouseLeave"?p[w]=T:m[w]=T});const v=C.useCallback(()=>{!l&&i.current&&i.current.click()},[l,i]),x=C.useCallback(w=>{const T=w.target.files?.[0]||null;if(!T){g(""),r?.(null);return}if(t&&T.size>t*1024*1024){const A=`File size exceeds ${t}MB limit`;n?.(A),i.current&&(i.current.value=""),g("");return}g(T.name),r?.(T)},[t,r,n,i]),M=C.useCallback(w=>{w.stopPropagation(),i.current&&(i.current.value=""),g(""),r?.(null)},[r,i]);return d.jsxs(W,{className:`flex items-center gap-2 ${s}`,...p,children:[d.jsx(_t,{ref:i,type:"file",accept:e,onChange:x,disabled:l,className:"hidden",...m}),d.jsx(Q,{type:"button",onClick:v,disabled:l,className:"px-4 py-2 bg-gray-100 dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-md text-sm font-medium text-gray-700 dark:text-gray-200 hover:bg-gray-200 dark:hover:bg-gray-600 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500 disabled:opacity-50 disabled:cursor-not-allowed",children:o}),d.jsx(re,{className:"flex-1 text-sm text-gray-600 dark:text-gray-400 truncate",children:u||a}),u&&!l&&d.jsx(Q,{type:"button",onClick:M,className:"p-1 text-gray-400 hover:text-gray-600 dark:hover:text-gray-200","aria-label":"Clear file",children:d.jsx(mn,{className:"w-4 h-4",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"})})})]})});Va.displayName="FileInput";var Re=(e=>(e.User="fa-user",e.Users="fa-users",e.UserCircle="fa-user-circle",e.UserPlus="fa-user-plus",e.UserMinus="fa-user-minus",e.UserShield="fa-user-shield",e.Search="fa-search",e.Edit="fa-edit",e.Pencil="fa-pencil-alt",e.Trash="fa-trash",e.Save="fa-save",e.Plus="fa-plus",e.Minus="fa-minus",e.Check="fa-check",e.Times="fa-times",e.Download="fa-download",e.Upload="fa-upload",e.Copy="fa-copy",e.ExternalLink="fa-external-link-alt",e.Home="fa-home",e.ChevronLeft="fa-chevron-left",e.ChevronRight="fa-chevron-right",e.ChevronUp="fa-chevron-up",e.ChevronDown="fa-chevron-down",e.AngleLeft="fa-angle-left",e.AngleRight="fa-angle-right",e.AngleUp="fa-angle-up",e.AngleDown="fa-angle-down",e.ArrowUp="fa-arrow-up",e.ArrowDown="fa-arrow-down",e.ArrowLeft="fa-arrow-left",e.ArrowRight="fa-arrow-right",e.Bars="fa-bars",e.EllipsisVertical="fa-ellipsis-v",e.EllipsisHorizontal="fa-ellipsis-h",e.CheckCircle="fa-check-circle",e.TimesCircle="fa-times-circle",e.ExclamationCircle="fa-exclamation-circle",e.ExclamationTriangle="fa-exclamation-triangle",e.InfoCircle="fa-info-circle",e.QuestionCircle="fa-question-circle",e.XCircle="fa-times-circle",e.ShoppingCart="fa-shopping-cart",e.ShoppingBag="fa-shopping-bag",e.CreditCard="fa-credit-card",e.Tag="fa-tag",e.Tags="fa-tags",e.File="fa-file",e.FileAlt="fa-file-alt",e.Folder="fa-folder",e.FolderOpen="fa-folder-open",e.Envelope="fa-envelope",e.Phone="fa-phone",e.Comment="fa-comment",e.Comments="fa-comments",e.Cog="fa-cog",e.Cogs="fa-cogs",e.Settings="fa-cog",e.Wrench="fa-wrench",e.Sliders="fa-sliders-h",e.Image="fa-image",e.Images="fa-images",e.Video="fa-video",e.Camera="fa-camera",e.Heart="fa-heart",e.Star="fa-star",e.ThumbsUp="fa-thumbs-up",e.ThumbsDown="fa-thumbs-down",e.Share="fa-share",e.Clock="fa-clock",e.Calendar="fa-calendar",e.CalendarAlt="fa-calendar-alt",e.Lock="fa-lock",e.Unlock="fa-unlock",e.Eye="fa-eye",e.EyeSlash="fa-eye-slash",e.Bell="fa-bell",e.Flag="fa-flag",e.Map="fa-map",e.MapMarker="fa-map-marker-alt",e.Globe="fa-globe",e.Link="fa-link",e.Unlink="fa-unlink",e.Sun="fa-sun",e.Moon="fa-moon",e.ChartBar="fa-chart-bar",e.ChartLine="fa-chart-line",e.ChartPie="fa-chart-pie",e.ChartArea="fa-chart-area",e.Spinner="fa-spinner",e.CircleNotch="fa-circle-notch",e.CheckBadge="fa-badge-check",e.BellSlash="fa-bell-slash",e.BookOpen="fa-book-open",e.Building="fa-building",e.FileCircleCheck="fa-file-circle-check",e.WandMagicSparkles="fa-wand-magic-sparkles",e.UserXmark="fa-user-xmark",e.Cube="fa-cube",e.Cubes="fa-cubes",e.Plug="fa-plug",e.PuzzlePiece="fa-puzzle-piece",e.Fire="fa-fire",e.CommentDots="fa-comment-dots",e.DollarSign="fa-dollar-sign",e.Bars2="fa-bars",e.X="fa-times",e.List="fa-list",e.ThLarge="fa-th-large",e.Inbox="fa-inbox",e.Box="fa-box",e.PaperPlane="fa-paper-plane",e.FileText="fa-file-alt",e.Paperclip="fa-paperclip",e.Truck="fa-truck",e.Sync="fa-sync",e.RotateLeft="fa-rotate-left",e.MapPin="fa-map-marker-alt",e.HelpCircle="fa-question-circle",e))(Re||{});const Bc={user:"fa-user",users:"fa-users","user-circle":"fa-user-circle","user-plus":"fa-user-plus","user-minus":"fa-user-minus","user-shield":"fa-user-shield",search:"fa-search",edit:"fa-edit",pencil:"fa-pencil-alt",trash:"fa-trash",save:"fa-save",plus:"fa-plus",minus:"fa-minus",check:"fa-check",times:"fa-times",download:"fa-download",upload:"fa-upload",copy:"fa-copy","external-link":"fa-external-link-alt",home:"fa-home","chevron-left":"fa-chevron-left","chevron-right":"fa-chevron-right","chevron-up":"fa-chevron-up","chevron-down":"fa-chevron-down","angle-left":"fa-angle-left","angle-right":"fa-angle-right","angle-up":"fa-angle-up","angle-down":"fa-angle-down","arrow-up":"fa-arrow-up","arrow-down":"fa-arrow-down","arrow-left":"fa-arrow-left","arrow-right":"fa-arrow-right",bars:"fa-bars","ellipsis-vertical":"fa-ellipsis-v","ellipsis-v":"fa-ellipsis-v","ellipsis-horizontal":"fa-ellipsis-h","ellipsis-h":"fa-ellipsis-h","check-circle":"fa-check-circle","times-circle":"fa-times-circle","x-circle":"fa-times-circle","exclamation-circle":"fa-exclamation-circle","exclamation-triangle":"fa-exclamation-triangle","info-circle":"fa-info-circle","question-circle":"fa-question-circle","shopping-cart":"fa-shopping-cart","shopping-bag":"fa-shopping-bag","credit-card":"fa-credit-card",tag:"fa-tag",tags:"fa-tags",file:"fa-file","file-alt":"fa-file-alt",folder:"fa-folder","folder-open":"fa-folder-open",envelope:"fa-envelope",phone:"fa-phone",comment:"fa-comment",comments:"fa-comments",cog:"fa-cog",cogs:"fa-cogs",settings:"fa-cog",wrench:"fa-wrench",sliders:"fa-sliders-h",image:"fa-image",images:"fa-images",video:"fa-video",camera:"fa-camera",heart:"fa-heart",star:"fa-star","thumbs-up":"fa-thumbs-up","thumbs-down":"fa-thumbs-down",share:"fa-share",clock:"fa-clock",calendar:"fa-calendar","calendar-alt":"fa-calendar-alt",lock:"fa-lock",unlock:"fa-unlock",eye:"fa-eye","eye-slash":"fa-eye-slash",bell:"fa-bell",flag:"fa-flag",map:"fa-map","map-marker":"fa-map-marker-alt",globe:"fa-globe",link:"fa-link",unlink:"fa-unlink",sun:"fa-sun",moon:"fa-moon","chart-bar":"fa-chart-bar","chart-line":"fa-chart-line","chart-pie":"fa-chart-pie","chart-area":"fa-chart-area",spinner:"fa-spinner","circle-notch":"fa-circle-notch","check-badge":"fa-badge-check","badge-check":"fa-badge-check",cube:"fa-cube",cubes:"fa-cubes",plug:"fa-plug","puzzle-piece":"fa-puzzle-piece",flame:"fa-fire",fire:"fa-fire","message-square":"fa-comment-dots","dollar-sign":"fa-dollar-sign",menu:"fa-bars",x:"fa-times",list:"fa-list","layout-grid":"fa-th-large","th-large":"fa-th-large",grid:"fa-th-large",inbox:"fa-inbox",package:"fa-box",box:"fa-box",send:"fa-paper-plane","paper-plane":"fa-paper-plane","file-text":"fa-file-alt",paperclip:"fa-paperclip",truck:"fa-truck","refresh-cw":"fa-sync",sync:"fa-sync","undo-2":"fa-rotate-left","rotate-left":"fa-rotate-left","map-pin":"fa-map-marker-alt","help-circle":"fa-question-circle","alert-triangle":"fa-exclamation-triangle","bell-off":"fa-bell-slash","book-open":"fa-book-open",building:"fa-building","edit-2":"fa-edit","edit-3":"fa-edit","file-check":"fa-file-circle-check",mail:"fa-envelope",sparkles:"fa-wand-magic-sparkles","trash-2":"fa-trash","user-x":"fa-user-xmark"},fe=({name:e,iconStyle:t="solid",size:r,color:n,spin:o=!1,pulse:a=!1,fixedWidth:s=!1,ariaLabel:l,className:f="",style:h,...c})=>{const i={solid:"fas",regular:"far",light:"fal",duotone:"fad",brands:"fab"},u=typeof e=="string"?e:String(e),g=Bc[u],p=g?String(g).replace(/^fa-/,""):u.replace(/^fa-/,""),m=[i[t],`fa-${p}`,r&&`fa-${r}`,o&&"fa-spin",a&&"fa-pulse",s&&"fa-fw",n,f].filter(Boolean).join(" "),v=l||p.replace(/-/g," ");return d.jsx("i",{className:m,style:h,"aria-label":v,role:"img",...c})},yr=(e,t)=>window.G7Core?.t?.(e,t)??e,so={minLength:{key:"minLength",labelKey:"auth.password_input.rules.minLength",defaultParam:6,validate:(e,t=6)=>e.length>=t},maxLength:{key:"maxLength",labelKey:"auth.password_input.rules.maxLength",defaultParam:20,validate:(e,t=20)=>e.length<=t},hasUppercase:{key:"hasUppercase",labelKey:"auth.password_input.rules.hasUppercase",validate:e=>/[A-Z]/.test(e)},hasLowercase:{key:"hasLowercase",labelKey:"auth.password_input.rules.hasLowercase",validate:e=>/[a-z]/.test(e)},hasNumber:{key:"hasNumber",labelKey:"auth.password_input.rules.hasNumber",validate:e=>/[0-9]/.test(e)},hasSpecial:{key:"hasSpecial",labelKey:"auth.password_input.rules.hasSpecial",validate:e=>/[!@#$%^&*(),.?":{}|<>]/.test(e)},noSpaces:{key:"noSpaces",labelKey:"auth.password_input.rules.noSpaces",validate:e=>!/\s/.test(e)},minTypes:{key:"minTypes",labelKey:"auth.password_input.rules.minTypes",defaultParam:3,validate:(e,t=3)=>{let r=0;return/[A-Z]/.test(e)&&r++,/[a-z]/.test(e)&&r++,/[0-9]/.test(e)&&r++,/[!@#$%^&*(),.?":{}|<>]/.test(e)&&r++,r>=t}}},Ya=[so.minLength];function Wc(e){const[t,r]=e.split(":"),n=so[t];if(!n)return null;const o=r?parseInt(r,10):n.defaultParam;return{rule:n,param:isNaN(o)?n.defaultParam:o}}const Xa=C.forwardRef(({label:e,error:t,showToggle:r=!0,showValidation:n=!1,isConfirmField:o=!1,confirmTarget:a,onMatchChange:s,onValidityChange:l,rules:f,enableRules:h,showRules:c,wrapperClassName:i="",validationClassName:u="",className:g="",onChange:p,value:m,defaultValue:v,disabled:x,...M},w)=>{const T=C.useRef(null);C.useImperativeHandle(w,()=>T.current);const[A,_]=C.useState(!1),[I,k]=C.useState(!1),[y,N]=C.useState(m??v??"");C.useEffect(()=>{m!==void 0&&N(m)},[m]);const D=C.useMemo(()=>f&&f.length>0?f.map(j=>({rule:j,param:j.defaultParam})):h&&h.length>0?h.map(j=>Wc(j)).filter(j=>j!==null):Ya.map(j=>({rule:j,param:j.defaultParam})),[f,h]),P=C.useMemo(()=>!c||c.length===0?D:D.filter(j=>c.includes(j.rule.key)),[D,c]),O=C.useMemo(()=>!n||o?{}:P.reduce((j,{rule:H,param:q})=>(j[H.key]=H.validate(y,q),j),{}),[y,P,n,o]),L=C.useMemo(()=>!o||a===void 0?!0:y===a&&y.length>0,[o,y,a]),$=C.useMemo(()=>n?Object.values(O).every(j=>j):!0,[O,n]);C.useEffect(()=>{if(l&&n&&!o){const j=Object.entries(O).filter(([,H])=>!H).map(([H])=>H);l($,j)}},[$,O,l,n,o]),C.useEffect(()=>{s&&o&&s(L)},[L,s,o]);const S=C.useCallback(()=>{_(j=>!j)},[]),b=C.useCallback(j=>{const H=j.target.value;N(H),p&&p(j)},[p]),z=C.useCallback(j=>{k(j.getModifierState("CapsLock"))},[]),{loadingactions:U,formdata:G,...Y}=M,B={},V={};for(const[j,H]of Object.entries(Y))j.startsWith("data-editor-")||j==="onMouseMove"||j==="onMouseLeave"?B[j]=H:V[j]=H;return d.jsxs("div",{className:`relative ${i}`,...B,children:[d.jsxs("div",{className:"relative",children:[d.jsx("input",{ref:T,type:A?"text":"password",className:`${g} ${r?"pr-10":""}`,value:m!==void 0?m:void 0,defaultValue:m===void 0?v:void 0,onChange:b,onKeyDown:z,onKeyUp:z,disabled:x,...V}),r&&d.jsx("button",{type:"button",onClick:S,disabled:x,className:"absolute right-2 top-1/2 -translate-y-1/2 p-1 text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200 disabled:opacity-50 disabled:cursor-not-allowed dark:disabled:opacity-50","aria-label":yr(A?"auth.password_input.hide":"auth.password_input.show"),children:d.jsx(fe,{name:A?"eye-slash":"eye",className:"w-5 h-5"})})]}),I&&!A&&d.jsxs("div",{className:"mt-2 flex items-center gap-1.5 text-sm text-yellow-600 dark:text-yellow-400",children:[d.jsx(fe,{name:"triangle-exclamation",className:"w-4 h-4"}),d.jsx("span",{children:yr("auth.password_input.caps_lock_on")})]}),o&&a!==void 0&&y.length>0&&d.jsxs("div",{className:`mt-2 flex items-center gap-1.5 text-sm ${L?"text-green-600 dark:text-green-400":"text-red-600 dark:text-red-400"}`,children:[d.jsx(fe,{name:L?"check-circle":"xmark-circle",className:"w-4 h-4"}),d.jsx("span",{children:yr(L?"auth.password_input.match":"auth.password_input.mismatch")})]}),n&&!o&&y.length>0&&d.jsx("div",{className:`mt-2 space-y-1 ${u}`,children:P.map(({rule:j,param:H})=>{const q=O[j.key],ee=H!==void 0?{count:H}:void 0;return d.jsxs("div",{className:`flex items-center gap-1.5 text-sm ${q?"text-green-600 dark:text-green-400":"text-gray-500 dark:text-gray-400"}`,children:[d.jsx(fe,{name:q?"check-circle":"circle",className:"w-4 h-4"}),d.jsx("span",{children:yr(j.labelKey,ee)})]},j.key)})}),t&&d.jsx("p",{className:"mt-1 text-sm text-red-600 dark:text-red-400",children:t})]})});Xa.displayName="PasswordInput";const lo=({label:e,error:t,className:r="",onChange:n,value:o,defaultValue:a,...s})=>{const l=C.useRef(!1),f=C.useRef(null),[h,c]=C.useState(o??a??"");C.useEffect(()=>{!l.current&&o!==void 0&&c(o)},[o]);const i=C.useCallback(()=>{l.current=!0},[]),u=C.useCallback(M=>{if(l.current=!1,n){const w=M.target.value;c(w);const T=new Event("change",{bubbles:!0});Object.defineProperty(T,"target",{writable:!1,value:{value:w}}),Object.defineProperty(T,"currentTarget",{writable:!1,value:{value:w}}),n(T)}},[n]),g=C.useCallback(M=>{const w=M.target.value;c(w),!l.current&&n&&n(M)},[n]),{loadingactions:p,formdata:m,...v}=s,x=o!==void 0?{value:h}:{defaultValue:a};return d.jsx("textarea",{ref:f,className:r,onChange:g,onCompositionStart:i,onCompositionEnd:u,...x,...v})},vr=({children:e,className:t="",...r})=>d.jsx("label",{className:t,...r,children:e}),zt=({children:e,className:t="",...r})=>d.jsx("p",{className:t,...r,children:e}),Ht=({className:e="",alt:t="",...r})=>d.jsx("img",{className:e,alt:t,...r}),Kc=({children:e,className:t="",...r})=>d.jsx("h1",{className:t,...r,children:e}),Za=({children:e,className:t="",...r})=>d.jsx("h2",{className:t,...r,children:e}),bn=({children:e,className:t="",...r})=>d.jsx("h3",{className:t,...r,children:e}),qa=({children:e,className:t="",...r})=>d.jsx("h4",{className:t,...r,children:e}),io=({children:e,className:t="",...r})=>d.jsx("ul",{className:t,...r,children:e}),Vc=({children:e,className:t="",...r})=>d.jsx("ol",{className:t,...r,children:e}),Qt=({children:e,className:t="",...r})=>d.jsx("li",{className:t,...r,children:e}),co=({children:e,className:t="",...r})=>d.jsx("a",{className:t,...r,children:e}),uo=({children:e,className:t="",...r})=>d.jsx("form",{className:t,...r,children:e}),Yc=window.G7Core?.createLogger?.("Comp:Select")??{log:(...e)=>console.log("[Comp:Select]",...e),warn:(...e)=>console.warn("[Comp:Select]",...e),error:(...e)=>console.error("[Comp:Select]",...e)};function Xc(e){const t=window.G7Core?.state?.get?.("_global.appConfig.localeNames")?.[e];return t||{ko:"한국어",en:"English",ja:"日本語",zh:"中文",es:"Español",fr:"Français",de:"Deutsch"}[e]||e}const Qa=({children:e,label:t,error:r,options:n,className:o="",value:a,onChange:s,disabled:l,searchable:f=!1,searchPlaceholder:h,editorAttrs:c,...i})=>{const[u,g]=C.useState(!1),[p,m]=C.useState(""),[v,x]=C.useState(null),M=C.useRef(null),w=C.useRef(null),T=C.useRef(null),A=C.useRef(null),_=C.useMemo(()=>n?Array.isArray(n)?n.length===0?[]:typeof n[0]=="string"?n.map(S=>({value:S,label:Xc(S)})):n:(Yc.warn("options prop is not an array:",n),null):null,[n]),I=C.useMemo(()=>_&&_.find(b=>String(b.value)===String(a))?.label||"",[_,a]),k=C.useMemo(()=>{if(!_)return null;if(!f||p.trim()==="")return _;const S=p.trim().toLowerCase();return _.filter(b=>b.label.toLowerCase().includes(S)||String(b.value).toLowerCase().includes(S))},[_,f,p]);C.useEffect(()=>{if(u&&f){m("");const S=setTimeout(()=>T.current?.focus(),0);return()=>clearTimeout(S)}u||m("")},[u,f]);const y=C.useCallback(()=>{if(!w.current)return;const S=w.current.getBoundingClientRect(),b=window.innerHeight-S.bottom,U=b<280&&S.top>b;x(U?{bottom:window.innerHeight-S.top+4,left:S.left,width:S.width}:{top:S.bottom+4,left:S.left,width:S.width})},[]);C.useEffect(()=>{if(!u){x(null);return}return y(),window.addEventListener("scroll",y,!0),window.addEventListener("resize",y),()=>{window.removeEventListener("scroll",y,!0),window.removeEventListener("resize",y)}},[u,y]),C.useEffect(()=>{const S=b=>{const z=b.target;M.current&&!M.current.contains(z)&&(!A.current||!A.current.contains(z))&&g(!1)};return u&&document.addEventListener("mousedown",S),()=>{document.removeEventListener("mousedown",S)}},[u]),C.useEffect(()=>{const S=b=>{b.key==="Escape"&&u&&(g(!1),w.current?.focus())};return document.addEventListener("keydown",S),()=>document.removeEventListener("keydown",S)},[u]);const N=()=>{l||g(!u)},D=S=>{s&&s({target:{value:S},preventDefault:()=>{},stopPropagation:()=>{},type:"change"}),g(!1),w.current?.focus()};if(!_)return d.jsx("select",{className:o,value:a,onChange:s,disabled:l,...c,...i,children:e});const P=o&&o.includes("bg-"),O=o&&/text-(gray|red|blue|green|yellow|white|black|indigo|purple|pink|orange|amber|emerald|teal|cyan|slate)-\d+|text-white|text-black/.test(o),L=P?`${o}${O?"":" text-gray-700 dark:text-gray-200"}`:`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 ${o}`,$={...c,...i};return d.jsxs(W,{ref:M,className:"relative",...$,children:[d.jsxs(Q,{ref:w,type:"button",onClick:N,disabled:l,className:`${L} flex items-center justify-between gap-2 text-left cursor-pointer disabled:opacity-50 disabled:cursor-not-allowed`,"aria-haspopup":"listbox","aria-expanded":u,children:[d.jsx(re,{className:"truncate",children:I||" "}),d.jsx(mn,{className:`w-4 h-4 flex-shrink-0 transition-transform duration-200 ${u?"rotate-180":""}`,fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:d.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M19 9l-7 7-7-7"})})]}),u&&v&&Rt.createPortal(d.jsxs(W,{ref:A,className:"fixed z-[9999] bg-white dark:bg-gray-800 rounded-2xl shadow-lg border border-gray-200 dark:border-gray-600 overflow-hidden",style:{top:v.top,bottom:v.bottom,left:v.left,width:v.width},role:"listbox",children:[f&&d.jsx(W,{className:"p-2 border-b border-gray-200 dark:border-gray-600",children:d.jsx(_t,{ref:T,type:"text",value:p,onChange:S=>m(S.target.value),placeholder:h??"Search...",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",role:"searchbox","aria-label":h??"Search"})}),d.jsxs(W,{className:"py-2 max-h-60 overflow-auto",children:[k&&k.length===0&&d.jsx(W,{className:"px-4 py-3 text-sm text-gray-500 dark:text-gray-400 text-center",children:p?"No results":""}),(k??[]).map(S=>{const b=String(S.value)===String(a);return d.jsxs(Q,{type:"button",onClick:()=>!S.disabled&&D(S.value),disabled:S.disabled,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 ${b?"text-blue-600 dark:text-blue-400 font-medium":"text-gray-700 dark:text-gray-200"} ${S.disabled?"opacity-50 cursor-not-allowed":"cursor-pointer"}`,role:"option","aria-selected":b,children:[d.jsx(re,{children:S.label}),b&&d.jsx(mn,{className:"w-5 h-5 text-blue-600 dark:text-blue-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:d.jsx("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M5 13l4 4L19 7"})})]},S.value)})]})]}),document.body)]})},Zc=({children:e,className:t="",...r})=>d.jsx("option",{className:t,...r,children:e}),qc=({children:e,className:t="",...r})=>d.jsx("optgroup",{className:t,...r,children:e}),Ja=C.forwardRef(({label:e,className:t="",...r},n)=>d.jsx("input",{ref:n,type:"checkbox",className:t,...r}));Ja.displayName="Checkbox";const Qc=({children:e,className:t="",...r})=>d.jsx("table",{className:t,...r,children:e}),Jc=({children:e,className:t="",...r})=>d.jsx("thead",{className:t,...r,children:e}),Rc=({children:e,className:t="",...r})=>d.jsx("tbody",{className:t,...r,children:e}),ed=({children:e,className:t="",...r})=>d.jsx("tr",{className:t,...r,children:e}),td=({children:e,className:t="",...r})=>d.jsx("th",{className:t,...r,children:e}),rd=({children:e,className:t="",...r})=>d.jsx("td",{className:t,...r,children:e}),Wr=C.forwardRef(({children:e,className:t="",...r},n)=>d.jsx("nav",{ref:n,className:t,...r,children:e}));Wr.displayName="Nav";const Ra=({children:e,className:t="",...r})=>d.jsx("section",{className:t,...r,children:e}),nd=({children:e,className:t="",...r})=>d.jsx("code",{className:t,...r,children:e}),fo=C.forwardRef(({className:e="",...t},r)=>d.jsx("hr",{ref:r,className:e,...t})),od=C.forwardRef(({children:e,className:t="",...r},n)=>d.jsx("header",{ref:n,className:t,...r,children:e})),es=e=>e==="auto"?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":e,go=e=>{const t=es(e);document.documentElement.setAttribute("data-theme",t),t==="dark"?document.documentElement.classList.add("dark"):document.documentElement.classList.remove("dark")},ad=()=>{const e=localStorage.getItem("g7_color_scheme");return e&&["auto","light","dark"].includes(e)?e:"auto"},yn=({onThemeChange:e,className:t="",autoText:r="System",lightText:n="Light",darkText:o="Dark",id:a,editorAttrs:s})=>{const l=ad(),[f,h]=C.useState(l),[c,i]=C.useState(!1),u=C.useRef(null);C.useEffect(()=>{go(f)},[]),C.useEffect(()=>{if(f!=="auto")return;const m=window.matchMedia("(prefers-color-scheme: dark)"),v=()=>{go("auto")};return m.addEventListener("change",v),()=>m.removeEventListener("change",v)},[f]),C.useEffect(()=>{const m=v=>{u.current&&!u.current.contains(v.target)&&i(!1)};return document.addEventListener("mousedown",m),()=>document.removeEventListener("mousedown",m)},[]);const g=m=>{h(m),localStorage.setItem("g7_color_scheme",m),go(m),i(!1),e?.(m)},p=()=>es(f)==="dark"?Re.Moon:Re.Sun;return d.jsxs(W,{ref:u,className:`relative ${t}`,id:a,...s,children:[d.jsx(Q,{onClick:()=>i(!c),className:"p-2 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-lg transition-colors text-gray-600 dark:text-gray-400","aria-label":"Toggle theme",children:d.jsx(fe,{name:p(),className:"w-5 h-5"})}),c&&d.jsx(W,{className:"absolute right-0 mt-2 w-48 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-lg z-50",children:d.jsxs(W,{className:"py-2",children:[d.jsxs(Q,{onClick:()=>g("auto"),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 - ${g==="auto"?"bg-gray-50 dark:bg-gray-700":""} - `,children:[d.jsx(ce,{name:Je.Settings,className:"w-5 h-5 text-gray-600 dark:text-gray-400"}),d.jsx(te,{className:"flex-1 text-left text-gray-900 dark:text-white",children:r}),g==="auto"&&d.jsx(ce,{name:Je.Check,className:"w-4 h-4 text-blue-600 dark:text-blue-400 ml-auto"})]}),d.jsxs(Q,{onClick:()=>f("light"),className:` + ${f==="auto"?"bg-gray-50 dark:bg-gray-700":""} + `,children:[d.jsx(fe,{name:Re.Settings,className:"w-5 h-5 text-gray-600 dark:text-gray-400"}),d.jsx(re,{className:"flex-1 text-left text-gray-900 dark:text-white",children:r}),f==="auto"&&d.jsx(fe,{name:Re.Check,className:"w-4 h-4 text-blue-600 dark:text-blue-400 ml-auto"})]}),d.jsxs(Q,{onClick:()=>g("light"),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 - ${g==="light"?"bg-gray-50 dark:bg-gray-700":""} - `,children:[d.jsx(ce,{name:Je.Sun,className:"w-5 h-5 text-gray-600 dark:text-gray-400"}),d.jsx(te,{className:"flex-1 text-left text-gray-900 dark:text-white",children:n}),g==="light"&&d.jsx(ce,{name:Je.Check,className:"w-4 h-4 text-blue-600 dark:text-blue-400 ml-auto"})]}),d.jsxs(Q,{onClick:()=>f("dark"),className:` + ${f==="light"?"bg-gray-50 dark:bg-gray-700":""} + `,children:[d.jsx(fe,{name:Re.Sun,className:"w-5 h-5 text-gray-600 dark:text-gray-400"}),d.jsx(re,{className:"flex-1 text-left text-gray-900 dark:text-white",children:n}),f==="light"&&d.jsx(fe,{name:Re.Check,className:"w-4 h-4 text-blue-600 dark:text-blue-400 ml-auto"})]}),d.jsxs(Q,{onClick:()=>g("dark"),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 - ${g==="dark"?"bg-gray-50 dark:bg-gray-700":""} - `,children:[d.jsx(ce,{name:Je.Moon,className:"w-5 h-5 text-gray-600 dark:text-gray-400"}),d.jsx(te,{className:"flex-1 text-left text-gray-900 dark:text-white",children:o}),g==="dark"&&d.jsx(ce,{name:Je.Check,className:"w-4 h-4 text-blue-600 dark:text-blue-400 ml-auto"})]})]})})]})},qc=Object.freeze(Object.defineProperty({__proto__:null,ThemeToggle:hn,default:hn},Symbol.toStringTag,{value:"Module"})),Za={xs:"w-6 h-6 text-xs",sm:"w-8 h-8 text-sm",md:"w-10 h-10 text-base",lg:"w-12 h-12 text-lg",xl:"w-16 h-16 text-xl","2xl":"w-24 h-24 text-2xl","3xl":"w-32 h-32 text-3xl","4xl":"w-40 h-40 text-4xl","5xl":"w-48 h-48 text-5xl"},Zc="rounded-full overflow-hidden flex-shrink-0 border border-gray-200 dark:border-gray-700",Qc="grayscale opacity-50",co={normal:"bg-gradient-to-br from-blue-500 to-purple-600",withdrawn:"bg-gray-300 dark:bg-gray-600",guest:"bg-gray-200 dark:bg-gray-700"},$r=({author:e,name:t,avatar:r,size:n="md",className:o="",text:a,isWithdrawn:s=!1,isGuest:l=!1,id:g,editorAttrs:h})=>{const c=r??e?.avatar,i=a??t??e?.name??"?",u=s||e?.status==="withdrawn",f=l||e?.is_guest||!1,p=k.useMemo(()=>[Za[n]||Za.md,Zc,u?Qc:"",o].filter(Boolean).join(" "),[n,u,o]),m=f?co.guest:u?co.withdrawn:co.normal,w=()=>f?d.jsx(W,{className:`w-full h-full flex items-center justify-center ${m}`,children:d.jsx(ce,{name:"user",className:"text-gray-400 dark:text-gray-500"})}):u?d.jsx(W,{className:`w-full h-full flex items-center justify-center ${m}`,children:d.jsx(ce,{name:"user",className:"text-gray-500 dark:text-gray-400"})}):d.jsx(W,{className:`w-full h-full flex items-center justify-center text-white font-semibold ${m}`,children:i.charAt(0).toUpperCase()});return d.jsx(W,{className:p,id:g,...h,children:c&&!f&&!u?d.jsx(Lt,{src:c,alt:i,className:"w-full h-full object-cover"}):w()})},Jc=Object.freeze(Object.defineProperty({__proto__:null,Avatar:$r},Symbol.toStringTag,{value:"Module"})),Rc=window.G7Core?.createLogger?.("Comp:SlotContainer")??{log:(...e)=>console.log("[Comp:SlotContainer]",...e),warn:(...e)=>console.warn("[Comp:SlotContainer]",...e),error:(...e)=>console.error("[Comp:SlotContainer]",...e)};function Qa(e,t){return t&&e&&typeof e.id=="string"&&e.id.length>0?{...e,id:`${e.id}__${t}`}:e}const pn=({slotId:e,className:t="",emptyContent:r,style:n,id:o,children:a})=>{const[s,l]=k.useState([]),[,g]=k.useState({}),h=k.useCallback(()=>{const p=window.__slotContextValue;if(p)return p;const m=window.G7Core;return m&&m.getSlotContext?.()||null},[]),c=k.useCallback(()=>{const p=h();p&&p.isEnabled&&l(p.getSlotComponents(e))},[e,h]);k.useEffect(()=>{const p=h();return!p||!p.isEnabled?void 0:(c(),p.subscribeToSlot(e,()=>{c(),g({})}))},[e,h,c]);const i=k.useCallback(()=>{const p=window.G7Core;return p?p.getDynamicRenderer?.():null},[]);if(s.length===0)return r?d.jsx(W,{className:t,style:n,id:o,children:r}):a?d.jsx(W,{className:t,style:n,id:o,children:a}):null;const u=i(),f=window.G7Core;return!u||!f?(Rc.error("G7Core or DynamicRenderer not available"),null):d.jsxs(W,{className:t,style:n,id:o,children:[s.map(p=>{const{componentDef:m,dataContext:w,parentFormContext:x,getParentComponentContext:A,translationContext:v}=p,E=Qa(m,o);return d.jsx(u,{componentDef:E,dataContext:w,translationContext:v,registry:f.getComponentRegistry(),bindingEngine:f.getDataBindingEngine(),translationEngine:f.getTranslationEngine(),actionDispatcher:f.getActionDispatcher(),parentComponentContext:A?.(),parentFormContextProp:x,isRootRenderer:!1},E.id||`slot-${e}-${p.order}`)}),a]})},ed=Object.freeze(Object.defineProperty({__proto__:null,SlotContainer:pn,default:pn,scopeSlotChildDef:Qa},Symbol.toStringTag,{value:"Module"})),mn=({notifications:e=[],unreadCount:t=0,hasMore:r=!1,loading:n=!1,titleText:o="알림",emptyText:a="알림이 없습니다.",markAllReadText:s="모두 읽음",deleteAllText:l="모두 삭제",unreadOnlyText:g="안 읽은 알림만",unreadOnly:h=!1,onNotificationClick:c,onClose:i,onLoadMore:u,onMarkAllRead:f,onDeleteAll:p,onDelete:m,onUnreadOnlyToggle:w,dropdownAlign:x="right",className:A="",id:v,editorAttrs:E})=>{const[O,_]=k.useState(!1),I=k.useRef(null),C=k.useRef(null),y=k.useRef(null),N=k.useRef(null),M=k.useRef(new Set),P=k.useRef(u),D=k.useRef(r),L=k.useRef(n),$=k.useRef(e.length),S=k.useRef(-1);k.useEffect(()=>{P.current=u,D.current=r,L.current=n,$.current=e.length}),k.useEffect(()=>{if(!N.current||!y.current||!O)return;S.current=-1;const G=new IntersectionObserver(([Y])=>{Y.isIntersecting&&(L.current||!D.current||S.current!==$.current&&(S.current=$.current,P.current?.()))},{root:y.current,threshold:.1});return G.observe(N.current),()=>G.disconnect()},[O]),k.useEffect(()=>{if(!y.current||!O)return;const G=new IntersectionObserver(B=>{B.forEach(V=>{const j=V.target.getAttribute("data-notification-id"),H=V.target.getAttribute("data-unread")==="true";j&&H&&V.isIntersecting&&M.current.add(j)})},{root:y.current,threshold:.5});return y.current.querySelectorAll("[data-notification-id]").forEach(B=>G.observe(B)),()=>G.disconnect()},[O,e]);const b=t>0?t:e.filter(G=>!G.read).length,U=k.useCallback(()=>{if(O){if(b>0){const G=Array.from(M.current).filter(Y=>{const B=e.find(V=>String(V.id)===String(Y));return B&&!B.read});G.length>0&&i?.(G)}M.current.clear(),_(!1)}},[O,i,b,e]);k.useEffect(()=>{if(!O)return;const G=Y=>{I.current&&!I.current.contains(Y.target)&&U()};return document.addEventListener("mousedown",G),()=>document.removeEventListener("mousedown",G)},[O,U]);const F=k.useCallback(()=>{O?U():_(!0)},[O,U]);return k.useLayoutEffect(()=>{const G=C.current;if(!O||!G)return;G.style.transform="";const Y=G.getBoundingClientRect(),B=typeof window<"u"?window.innerWidth:0;if(Y.width===0&&Y.height===0)return;const V=8;let j=0;Y.right>B-V?j=-(Y.right-(B-V)):Y.left0&&d.jsx(te,{className:"absolute -top-1 -right-1 w-5 h-5 flex items-center justify-center text-xs font-bold text-white bg-red-500 dark:bg-red-600 rounded-full",children:b>99?"99+":b})]}),O&&d.jsxs(W,{ref:C,className:`absolute ${x==="left"?"left-0":"right-0"} mt-2 w-80 max-w-[calc(100vw-1rem)] bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-lg z-50`,children:[d.jsxs(W,{className:"px-4 py-3 border-b border-gray-200 dark:border-gray-700 flex items-center justify-between gap-2",children:[d.jsxs(W,{className:"flex items-center gap-3 min-w-0",children:[d.jsx(te,{className:"font-semibold text-gray-900 dark:text-white",children:o}),w&&d.jsxs(W,{className:"flex items-center gap-1.5 cursor-pointer select-none",onClick:()=>w(!h),children:[d.jsx(xt,{type:"checkbox",checked:h,onChange:G=>{G.stopPropagation(),w(G.target.checked)},onClick:G=>G.stopPropagation(),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"}),d.jsx(te,{className:"text-xs text-gray-600 dark:text-gray-400",children:g})]})]}),d.jsxs(W,{className:"flex items-center gap-3 flex-shrink-0",children:[f&&b>0&&d.jsx(Q,{onClick:()=>{f(),M.current.clear()},className:"text-xs text-blue-600 dark:text-blue-400 hover:text-blue-800 dark:hover:text-blue-300 hover:underline cursor-pointer",children:s}),p&&e.length>0&&d.jsx(Q,{onClick:()=>{p()},className:"text-xs text-red-600 dark:text-red-400 hover:text-red-800 dark:hover:text-red-300 hover:underline cursor-pointer",children:l})]})]}),d.jsx(W,{ref:y,className:"max-h-96 overflow-y-auto",children:e.length===0&&!n?d.jsx(W,{className:"px-4 py-8 text-center text-gray-500 dark:text-gray-400",children:d.jsx(te,{children:a})}):d.jsxs(d.Fragment,{children:[e.map(G=>{const Y=!G.read;return d.jsxs(W,{"data-notification-id":G.id,"data-unread":Y?"true":"false",onClick:()=>{G.onClick?.(),c?.(G),_(!1)},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 ${Y?"bg-blue-50/70 dark:bg-blue-900/20 hover:bg-blue-50 dark:hover:bg-blue-900/30":"bg-white dark:bg-gray-800 hover:bg-gray-50 dark:hover:bg-gray-700/50 opacity-70"}`,children:[G.iconName&&d.jsx(ce,{name:G.iconName,className:`w-5 h-5 mt-0.5 flex-shrink-0 ${Y?"text-blue-600 dark:text-blue-400":"text-gray-400 dark:text-gray-500"}`}),d.jsxs(W,{className:"flex-1 min-w-0",children:[d.jsx(W,{className:`text-sm truncate ${Y?"font-semibold text-gray-900 dark:text-white":"font-normal text-gray-600 dark:text-gray-400"}`,children:G.title}),d.jsx(W,{className:`text-sm mt-1 line-clamp-2 ${Y?"text-gray-700 dark:text-gray-300":"text-gray-500 dark:text-gray-500"}`,children:G.message}),d.jsx(W,{className:"text-gray-400 dark:text-gray-500 text-xs mt-1 font-mono",children:G.time})]}),d.jsxs(W,{className:"flex flex-col items-center gap-2 flex-shrink-0",children:[Y&&d.jsx(te,{className:"w-2 h-2 bg-blue-500 dark:bg-blue-400 rounded-full mt-1.5"}),m&&d.jsx(Q,{onClick:B=>{B.stopPropagation(),m(G)},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","aria-label":"Delete notification",children:d.jsx(ce,{name:Je.Trash,className:"w-4 h-4"})})]})]},G.id)}),r&&d.jsx(W,{ref:N,className:"px-4 py-3 text-center",children:n?d.jsx(te,{className:"text-sm text-gray-400 dark:text-gray-500",children:"..."}):d.jsx(te,{className:"text-sm text-gray-400 dark:text-gray-500"})}),n&&!r&&e.length>0&&d.jsx(W,{className:"px-4 py-2 text-center",children:d.jsx(te,{className:"text-sm text-gray-400 dark:text-gray-500",children:"..."})})]})})]})]})},td=Object.freeze(Object.defineProperty({__proto__:null,NotificationCenter:mn,default:mn},Symbol.toStringTag,{value:"Module"})),Xe=(e,t)=>window.G7Core?.t?.(e,t)??e,pt=e=>{window.G7Core?.dispatch?.({handler:"navigate",params:{path:e}})},Ja=({logo:e,siteName:t="그누보드7",user:r,cartCount:n=0,notificationCount:o=0,boards:a=[],maxVisibleBoards:s=5,onMobileMenuOpen:l,availableLocales:g=[],currentLocale:h="ko",shopBase:c="/shop",className:i="",editorAttrs:u,notifications:f=[],notificationHasMore:p=!1,notificationLoading:m=!1,notificationUnreadOnly:w=!1,notificationTitleText:x,notificationEmptyText:A,notificationMarkAllReadText:v,notificationDeleteAllText:E,notificationUnreadOnlyText:O,onNotificationClose:_,onNotificationClick:I,onNotificationLoadMore:C,onNotificationMarkAllRead:y,onNotificationDeleteAll:N,onNotificationDelete:M,onNotificationUnreadOnlyToggle:P})=>{const[D,L]=k.useState(""),[$,S]=k.useState(!1),[b,U]=k.useState(!1),[F,G]=k.useState(!1),[Y,B]=k.useState({top:0,left:0}),[V,j]=k.useState(window.location.pathname),H=k.useRef(null),q=k.useRef(null),ue=k.useRef(null),fe=window.G7Core?.useResponsive,R=fe?.(),ke=R?R.width<768:typeof window<"u"&&window.innerWidth<768;k.useEffect(()=>{const K=()=>j(window.location.pathname);window.addEventListener("popstate",K);const re=history.pushState;return history.pushState=function(...ne){re.apply(this,ne),j(window.location.pathname)},()=>{window.removeEventListener("popstate",K),history.pushState=re}},[]);const me=(K,re=!1)=>re?V===K:V===K||V.startsWith(K+"/"),Ge=()=>{const K=c==="/"?"":c;return V.startsWith(`${K}/products`)||V.startsWith(`${K}/cart`)||V.startsWith(`${K}/checkout`)||V.startsWith(`${K}/category`)},De=K=>{const re="px-3 py-2 text-sm font-medium whitespace-nowrap cursor-pointer rounded-lg transition-colors";return K?`${re} bg-gray-900 text-white dark:bg-white dark:text-gray-900`:`${re} text-gray-700 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white hover:bg-gray-100 dark:hover:bg-gray-800`};k.useEffect(()=>{const K=re=>{H.current&&!H.current.contains(re.target)&&S(!1),q.current&&!q.current.contains(re.target)&&U(!1),ue.current&&!ue.current.contains(re.target)&&G(!1)};return document.addEventListener("mousedown",K),()=>document.removeEventListener("mousedown",K)},[]);const ye=a.slice(0,s),Me=a.slice(s),Ce=K=>{K.preventDefault(),D.trim()&&pt(`/search?q=${encodeURIComponent(D)}`)},we=async()=>{window.G7Core?.dispatch?.({handler:"logout"})},Ue=K=>{window.G7Core?.dispatch?.({handler:"setLocale",target:K}),G(!1)},Le=K=>window.G7Core?.state?.get?.("_global.appConfig.localeNames")?.[K]??(K==="ko"?"한국어":K==="en"?"English":K==="ja"?"日本語":K==="zh"?"中文":K==="es"?"Español":K==="fr"?"Français":K==="de"?"Deutsch":K.toUpperCase());return d.jsxs(Yc,{...u??{},className:`sticky top-0 z-50 bg-white dark:bg-gray-900 border-b border-gray-200 dark:border-gray-800 ${i}`,children:[d.jsx(W,{className:"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8",children:d.jsxs(W,{className:"flex items-center justify-between h-16",children:[d.jsx(Q,{onClick:()=>pt("/"),className:"flex items-center gap-2 flex-shrink-0 cursor-pointer",children:e?d.jsx(Lt,{src:e,alt:t,className:"h-8"}):d.jsx(te,{className:"text-xl font-bold text-gray-900 dark:text-white",children:t})}),!ke&&d.jsx(so,{onSubmit:Ce,className:"flex flex-1 max-w-lg mx-8",children:d.jsxs(W,{className:"relative w-full",children:[d.jsx(xt,{type:"text",value:D,onChange:K=>L(K.target.value),placeholder:Xe("common.search_placeholder"),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"}),d.jsx(ce,{name:"search",className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-gray-400 dark:text-gray-500"})]})}),d.jsxs(W,{className:"flex items-center gap-2",children:[d.jsx(hn,{autoText:Xe("common.theme.auto"),lightText:Xe("common.theme.light"),darkText:Xe("common.theme.dark")}),r?.uuid&&d.jsx(mn,{notifications:f,unreadCount:o,hasMore:p,loading:m,unreadOnly:w,titleText:x??Xe("mypage.notifications.title"),emptyText:A??Xe("mypage.notifications.empty"),markAllReadText:v??Xe("mypage.notifications.mark_all_read"),deleteAllText:E??Xe("mypage.notifications.delete_all"),unreadOnlyText:O??Xe("mypage.notifications.unread_only"),onClose:_,onNotificationClick:I,onLoadMore:C,onMarkAllRead:y,onDeleteAll:N,onDelete:M,onUnreadOnlyToggle:P,dropdownAlign:"right"}),d.jsxs(Q,{onClick:()=>pt(`${c}/cart`),className:"relative p-2 text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white cursor-pointer",children:[d.jsx(ce,{name:"shopping-cart",className:"w-5 h-5"}),n>0&&d.jsx(te,{className:"absolute -top-1 -right-1 w-5 h-5 flex items-center justify-center text-xs bg-blue-500 text-white rounded-full",children:n>99?"99+":n})]}),g&&g.length>1&&d.jsxs(W,{ref:ue,className:"relative",children:[d.jsxs(Q,{onClick:()=>G(!F),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","aria-haspopup":"listbox","aria-expanded":F,"aria-label":Xe("common.language"),children:[d.jsx(ce,{name:"globe",className:"w-4 h-4"}),d.jsx(te,{className:"font-medium uppercase",children:h}),d.jsx(ce,{name:"chevron-down",className:"w-3 h-3"})]}),F&&d.jsx(W,{role:"listbox",className:"absolute right-0 mt-2 w-44 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-lg py-1 z-50 overflow-hidden",children:g.map(K=>{const re=K===h;return d.jsxs(Q,{role:"option","aria-selected":re,onClick:()=>Ue(K),className:`w-full px-4 py-2.5 text-left text-sm flex items-center gap-3 cursor-pointer transition-colors ${re?"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"}`,children:[d.jsx(ce,{name:"globe",className:"w-4 h-4"}),d.jsx(te,{className:"flex-1 font-medium",children:Le(K)}),re&&d.jsx(ce,{name:"check",className:"w-4 h-4"})]},K)})})]}),d.jsx(pn,{slotId:"header_currency",id:"header_currency_slot_desktop",className:"flex items-center"}),r?.uuid?d.jsxs(W,{ref:H,className:"relative",children:[d.jsxs(Q,{onClick:()=>S(!$),className:"flex items-center gap-2 p-2 text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white",children:[d.jsx($r,{avatar:r.avatar,name:r.name,size:"sm"}),d.jsx(te,{className:"hidden sm:inline text-sm font-medium",children:r.name}),d.jsx(ce,{name:"chevron-down",className:"w-4 h-4"})]}),$&&d.jsxs(W,{className:"absolute right-0 mt-2 w-56 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-lg py-1 z-50",children:[d.jsx(W,{className:"px-4 py-3 border-b border-gray-200 dark:border-gray-700",children:d.jsxs(W,{className:"flex items-center gap-3",children:[d.jsx($r,{avatar:r.avatar,name:r.name,size:"md"}),d.jsxs(W,{children:[d.jsx(W,{className:"text-sm font-medium text-gray-900 dark:text-white",children:r.name}),d.jsx(W,{className:"text-xs text-gray-500 dark:text-gray-400",children:Xe("common.member")})]})]})}),d.jsxs(W,{className:"py-1",children:[r.is_admin&&d.jsxs(d.Fragment,{children:[d.jsxs(ao,{href:"/admin",className:"block w-full text-left px-4 py-2 text-sm text-blue-600 dark:text-blue-400 hover:bg-gray-100 dark:hover:bg-gray-700 cursor-pointer font-medium",children:[d.jsx(ce,{name:"settings",className:"inline w-4 h-4 mr-2"}),Xe("common.admin_menu")]}),d.jsx(lo,{className:"my-1 border-gray-200 dark:border-gray-700"})]}),d.jsxs(Q,{onClick:()=>{pt("/mypage"),S(!1)},className:"block w-full text-left px-4 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 cursor-pointer",children:[d.jsx(ce,{name:"user",className:"inline w-4 h-4 mr-2"}),Xe("common.mypage")]}),d.jsxs(Q,{onClick:()=>{pt("/mypage/orders"),S(!1)},className:"block w-full text-left px-4 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 cursor-pointer",children:[d.jsx(ce,{name:"shopping-bag",className:"inline w-4 h-4 mr-2"}),Xe("mypage.tabs.orders")]}),d.jsxs(Q,{onClick:()=>{pt("/mypage/wishlist"),S(!1)},className:"block w-full text-left px-4 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 cursor-pointer",children:[d.jsx(ce,{name:"heart",className:"inline w-4 h-4 mr-2"}),Xe("mypage.tabs.wishlist")]})]}),d.jsx(lo,{className:"my-1 border-gray-200 dark:border-gray-700"}),d.jsxs(Q,{onClick:we,className:"block w-full text-left px-4 py-2 text-sm text-red-600 dark:text-red-400 hover:bg-gray-100 dark:hover:bg-gray-700 cursor-pointer",children:[d.jsx(ce,{name:"log-out",className:"inline w-4 h-4 mr-2"}),Xe("auth.logout")]})]})]}):d.jsxs(W,{className:"flex items-center gap-1.5",children:[d.jsx(Q,{onClick:()=>pt("/login?redirect=/mypage/orders"),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",children:Xe("shop.guest_order_form.nav_link")}),d.jsx(Q,{onClick:()=>pt("/login"),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",children:Xe("auth.login")}),d.jsx(Q,{onClick:()=>pt("/register"),className:"ml-1 px-3 py-2 text-sm font-medium text-white bg-emerald-500 rounded-lg hover:bg-emerald-600 cursor-pointer",children:Xe("auth.register_link")})]}),ke&&d.jsx(Q,{onClick:l,className:"p-2 text-gray-600 dark:text-gray-400",children:d.jsx(ce,{name:"menu",className:"w-6 h-6"})})]})]})}),!ke&&d.jsx(Ur,{className:"border-t border-gray-200 dark:border-gray-800",children:d.jsx(W,{className:"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8",children:d.jsxs(W,{className:"flex items-center gap-1 h-12 overflow-x-auto",children:[d.jsx(Q,{onClick:()=>pt("/"),className:De(me("/",!0)),"data-testid":"nav-home",children:Xe("nav.home")}),d.jsxs(Q,{onClick:()=>pt("/boards/popular"),className:`flex items-center gap-1 ${De(me("/boards/popular"))}`,"data-testid":"nav-popular",children:[d.jsx(te,{className:"text-orange-500",children:"🔥"}),Xe("nav.popular")]}),d.jsxs(Q,{onClick:()=>pt(`${c==="/"?"":c}/products`),className:`flex items-center gap-1 ${De(Ge())}`,"data-testid":"nav-shop",children:[d.jsx(te,{children:"🛒"}),Xe("nav.shop")]}),ye.map(K=>d.jsxs(Q,{onClick:()=>pt(`/board/${K.slug}`),className:De(me(`/board/${K.slug}`)),children:[K.icon&&d.jsx(te,{className:"mr-1",children:K.icon}),K.name]},K.id)),Me.length>0&&d.jsxs(W,{ref:q,className:"relative",children:[d.jsxs(Q,{onClick:()=>{if(!b&&q.current){const K=q.current.getBoundingClientRect();B({top:K.bottom+4,left:K.left})}U(!b)},className:"flex items-center gap-1 px-3 py-2 text-sm font-medium text-gray-700 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white",children:[Xe("nav.more"),d.jsx(ce,{name:"chevron-down",className:"w-4 h-4"})]}),b&&d.jsx(W,{className:"fixed w-48 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-lg py-1 z-50",style:{top:`${Y.top}px`,left:`${Y.left}px`},children:Me.map(K=>{const re=me(`/board/${K.slug}`);return d.jsxs(Q,{onClick:()=>{pt(`/board/${K.slug}`),U(!1)},className:`block w-full text-left px-4 py-2 text-sm cursor-pointer ${re?"bg-gray-900 text-white dark:bg-white dark:text-gray-900":"text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700"}`,children:[K.icon&&d.jsx(te,{className:"mr-1",children:K.icon}),K.name]},K.id)})})]})]})})})]})},rd=Object.freeze(Object.defineProperty({__proto__:null,default:Ja},Symbol.toStringTag,{value:"Module"})),nd=k.forwardRef(({children:e,className:t="",...r},n)=>d.jsx("footer",{ref:n,className:t,...r,children:e})),kt=(e,t)=>window.G7Core?.t?.(e,t)??e,od=768,Ra=1024,ad=e=>{window.G7Core?.dispatch?.({handler:"navigate",params:{path:e}})},es=({siteName:e="그누보드7",siteDescription:t,copyrightText:r,socialLinks:n={},linkGroups:o,className:a="",editorAttrs:s})=>{const l=new Date().getFullYear(),h=window.G7Core?.useResponsive,i=h?.()?.width??(typeof window<"u"?window.innerWidth:Ra),u=i=Ra,p=u?1:f?5:2,m=[{title:kt("footer.community"),links:[{label:kt("nav.home"),href:"/"},{label:kt("nav.popular"),href:"/boards/popular"},{label:kt("footer.all_boards"),href:"/boards"}]},{title:kt("footer.info"),links:[{label:kt("footer.about"),href:"/page/about"},{label:kt("footer.faq"),href:"/page/faq"},{label:kt("footer.contact"),href:"/page/contact"}]},{title:kt("footer.policy"),links:[{label:kt("footer.terms"),href:"/page/terms"},{label:kt("footer.privacy"),href:"/page/privacy"},{label:kt("footer.refund"),href:"/page/refund"}]}],w=o||m,x={github:"github",twitter:"twitter",discord:"discord",facebook:"facebook",instagram:"instagram"};return d.jsx(nd,{...s??{},className:`bg-gray-50 dark:bg-gray-900 border-t border-gray-200 dark:border-gray-800 ${a}`,children:d.jsxs(W,{className:"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12",children:[d.jsxs(W,{className:"grid gap-8",style:{gridTemplateColumns:`repeat(${p}, minmax(0, 1fr))`},children:[d.jsxs(W,{style:f?{gridColumn:"span 2 / span 2"}:void 0,children:[d.jsx(gn,{className:"text-lg font-bold text-gray-900 dark:text-white",children:e}),t&&d.jsx(Dt,{className:"mt-2 text-sm text-gray-600 dark:text-gray-400",children:t}),d.jsx(W,{className:"mt-4 flex items-center gap-4",children:Object.entries(n).map(([A,v])=>v?d.jsx(ao,{href:v,target:"_blank",rel:"noopener noreferrer",className:"text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200","aria-label":A,children:d.jsx(ce,{name:x[A],className:"w-5 h-5"})},A):null)})]}),w.map((A,v)=>d.jsxs(W,{children:[d.jsx(Ka,{className:"text-sm font-semibold text-gray-900 dark:text-white uppercase tracking-wider",children:A.title}),d.jsx(oo,{className:"mt-4 space-y-2",children:A.links.map((E,O)=>d.jsx(Xt,{children:d.jsx(Q,{onClick:()=>ad(E.href),className:"text-sm text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white cursor-pointer",children:E.label})},O))})]},v))]}),d.jsxs(W,{className:"mt-8 pt-8 border-t border-gray-200 dark:border-gray-800 flex justify-between items-center gap-4",style:{flexDirection:u?"column":"row"},children:[d.jsx(Dt,{className:"text-sm text-gray-500 dark:text-gray-400",children:r||`© ${l} ${e}. All rights reserved.`}),d.jsx(Dt,{className:"text-sm text-gray-500 dark:text-gray-400",children:kt("footer.powered_by")})]})]})})},sd=Object.freeze(Object.defineProperty({__proto__:null,default:es},Symbol.toStringTag,{value:"Module"})),Pt=(e,t)=>window.G7Core?.t?.(e,t)??e,Tt=e=>{window.G7Core?.dispatch?.({handler:"navigate",params:{path:e}})},ts=({isOpen:e,onClose:t,logo:r,siteName:n="그누보드7",user:o,boards:a=[],cartCount:s=0})=>{const l=k.useRef(null),h=window.G7Core?.useResponsive,c=h?.(),i=c?c.width<1024:typeof window<"u"&&window.innerWidth<1024;k.useEffect(()=>{const f=p=>{p.key==="Escape"&&t()};return e&&(document.addEventListener("keydown",f),document.body.style.overflow="hidden"),()=>{document.removeEventListener("keydown",f),document.body.style.overflow=""}},[e,t]);const u=f=>{f.target===f.currentTarget&&t()};return!e||!i?null:d.jsxs(W,{className:"fixed inset-0 z-50",onClick:u,children:[d.jsx(W,{className:"fixed inset-0 bg-black/50 transition-opacity"}),d.jsxs(W,{ref:l,className:`fixed inset-y-0 left-0 w-80 max-w-[85vw] bg-white dark:bg-gray-900 shadow-xl transform transition-transform duration-300 ${e?"translate-x-0":"-translate-x-full"}`,children:[d.jsxs(W,{className:"flex items-center justify-between p-4 border-b border-gray-200 dark:border-gray-800",children:[d.jsx(Q,{onClick:()=>{t(),Tt("/")},className:"flex items-center gap-2 cursor-pointer",children:r?d.jsx(Lt,{src:r,alt:n,className:"h-8"}):d.jsx(te,{className:"text-xl font-bold text-gray-900 dark:text-white",children:n})}),d.jsx(Q,{onClick:t,className:"p-2 text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200","aria-label":"메뉴 닫기",children:d.jsx(ce,{name:"x",className:"w-6 h-6"})})]}),o?d.jsx(W,{className:"p-4 border-b border-gray-200 dark:border-gray-800",children:d.jsxs(W,{className:"flex items-center gap-3",children:[o.avatar?d.jsx(Lt,{src:o.avatar,alt:o.name,className:"w-12 h-12 rounded-full"}):d.jsx(W,{className:"w-12 h-12 rounded-full bg-blue-500 flex items-center justify-center text-white text-lg font-medium",children:(o.name||"U").charAt(0).toUpperCase()}),d.jsxs(W,{children:[d.jsx(Dt,{className:"font-medium text-gray-900 dark:text-white",children:o.name}),d.jsx(Q,{onClick:()=>{t(),Tt("/mypage")},className:"text-sm text-blue-600 dark:text-blue-400 hover:underline cursor-pointer",children:Pt("common.mypage")})]})]})}):d.jsx(W,{className:"p-4 border-b border-gray-200 dark:border-gray-800",children:d.jsxs(W,{className:"flex gap-2",children:[d.jsx(Q,{onClick:()=>{t(),Tt("/login")},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",children:Pt("auth.login")}),d.jsx(Q,{onClick:()=>{t(),Tt("/register")},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",children:Pt("auth.register")})]})}),d.jsx(Ur,{className:"p-4 overflow-y-auto max-h-[calc(100vh-200px)]",children:d.jsxs(oo,{className:"space-y-1",children:[d.jsx(Xt,{children:d.jsxs(Q,{onClick:()=>{t(),Tt("/")},className:"flex items-center gap-3 px-3 py-2 w-full text-left text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-lg cursor-pointer",children:[d.jsx(ce,{name:"home",className:"w-5 h-5"}),Pt("nav.home")]})}),d.jsx(Xt,{children:d.jsxs(Q,{onClick:()=>{t(),Tt("/popular")},className:"flex items-center gap-3 px-3 py-2 w-full text-left text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-lg cursor-pointer",children:[d.jsx(te,{className:"text-orange-500",children:"🔥"}),Pt("nav.popular")]})}),d.jsx(Xt,{children:d.jsxs(Q,{onClick:()=>{t(),Tt("/shop")},className:"flex items-center gap-3 px-3 py-2 w-full text-left text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-lg cursor-pointer",children:[d.jsx(te,{children:"🛒"}),Pt("nav.shop")]})}),d.jsx(Xt,{children:d.jsxs(Q,{onClick:()=>{t(),Tt("/cart")},className:"flex items-center gap-3 px-3 py-2 w-full text-left text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-lg cursor-pointer",children:[d.jsx(ce,{name:"shopping-cart",className:"w-5 h-5"}),Pt("nav.cart"),s>0&&d.jsx(te,{className:"ml-auto px-2 py-0.5 text-xs bg-blue-500 text-white rounded-full",children:s})]})}),d.jsx(Xt,{className:"my-4 border-t border-gray-200 dark:border-gray-800"}),d.jsx(Xt,{className:"px-3 py-2 text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wider",children:Pt("nav.boards")}),a.map(f=>d.jsx(Xt,{children:d.jsxs(Q,{onClick:()=>{t(),Tt(`/board/${f.slug}`)},className:"flex items-center gap-3 px-3 py-2 w-full text-left text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-lg cursor-pointer",children:[f.icon&&d.jsx(te,{children:f.icon}),f.name]})},f.id))]})}),d.jsx(W,{className:"absolute bottom-0 left-0 right-0 p-4 border-t border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-900",children:d.jsxs(W,{className:"flex items-center justify-between text-sm text-gray-500 dark:text-gray-400",children:[d.jsx(Q,{onClick:()=>{t(),Tt("/about")},className:"hover:text-gray-700 dark:hover:text-gray-200 cursor-pointer",children:Pt("footer.about")}),d.jsx(Q,{onClick:()=>{t(),Tt("/terms")},className:"hover:text-gray-700 dark:hover:text-gray-200 cursor-pointer",children:Pt("footer.terms")}),d.jsx(Q,{onClick:()=>{t(),Tt("/privacy")},className:"hover:text-gray-700 dark:hover:text-gray-200 cursor-pointer",children:Pt("footer.privacy")})]})})]})]})},ld=Object.freeze(Object.defineProperty({__proto__:null,default:ts},Symbol.toStringTag,{value:"Module"}));const{entries:rs,setPrototypeOf:ns,isFrozen:id,getPrototypeOf:cd,getOwnPropertyDescriptor:dd}=Object;let{freeze:ft,seal:Nt,create:uo}=Object,{apply:fo,construct:go}=typeof Reflect<"u"&&Reflect;ft||(ft=function(t){return t}),Nt||(Nt=function(t){return t}),fo||(fo=function(t,r){for(var n=arguments.length,o=new Array(n>2?n-2:0),a=2;a1?r-1:0),o=1;o1?r-1:0),o=1;o2&&arguments[2]!==void 0?arguments[2]:yn;ns&&ns(e,null);let n=t.length;for(;n--;){let o=t[n];if(typeof o=="string"){const a=r(o);a!==o&&(id(t)||(t[n]=a),o=a)}e[o]=!0}return e}function md(e){for(let t=0;t/gm),xd=Nt(/\$\{[\w\W]*/gm),kd=Nt(/^data-[\-\w.\u00B7-\uFFFF]+$/),Cd=Nt(/^aria-[\-\w]+$/),cs=Nt(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),Sd=Nt(/^(?:\w+script|data):/i),_d=Nt(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),ds=Nt(/^html$/i),Ed=Nt(/^[a-z][.\w]*(-[.\w]+)+$/i);var us=Object.freeze({__proto__:null,ARIA_ATTR:Cd,ATTR_WHITESPACE:_d,CUSTOM_ELEMENT:Ed,DATA_ATTR:kd,DOCTYPE_NAME:ds,ERB_EXPR:wd,IS_ALLOWED_URI:cs,IS_SCRIPT_OR_DATA:Sd,MUSTACHE_EXPR:vd,TMPLIT_EXPR:xd});const Br={element:1,text:3,progressingInstruction:7,comment:8,document:9},Td=function(){return typeof window>"u"?null:window},Nd=function(t,r){if(typeof t!="object"||typeof t.createPolicy!="function")return null;let n=null;const o="data-tt-policy-suffix";r&&r.hasAttribute(o)&&(n=r.getAttribute(o));const a="dompurify"+(n?"#"+n:"");try{return t.createPolicy(a,{createHTML(s){return s},createScriptURL(s){return s}})}catch{return console.warn("TrustedTypes policy "+a+" could not be created."),null}},fs=function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}};function gs(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:Td();const t=ge=>gs(ge);if(t.version="3.3.1",t.removed=[],!e||!e.document||e.document.nodeType!==Br.document||!e.Element)return t.isSupported=!1,t;let{document:r}=e;const n=r,o=n.currentScript,{DocumentFragment:a,HTMLTemplateElement:s,Node:l,Element:g,NodeFilter:h,NamedNodeMap:c=e.NamedNodeMap||e.MozNamedAttrMap,HTMLFormElement:i,DOMParser:u,trustedTypes:f}=e,p=g.prototype,m=jr(p,"cloneNode"),w=jr(p,"remove"),x=jr(p,"nextSibling"),A=jr(p,"childNodes"),v=jr(p,"parentNode");if(typeof s=="function"){const ge=r.createElement("template");ge.content&&ge.content.ownerDocument&&(r=ge.content.ownerDocument)}let E,O="";const{implementation:_,createNodeIterator:I,createDocumentFragment:C,getElementsByTagName:y}=r,{importNode:N}=n;let M=fs();t.isSupported=typeof rs=="function"&&typeof v=="function"&&_&&_.createHTMLDocument!==void 0;const{MUSTACHE_EXPR:P,ERB_EXPR:D,TMPLIT_EXPR:L,DATA_ATTR:$,ARIA_ATTR:S,IS_SCRIPT_OR_DATA:b,ATTR_WHITESPACE:U,CUSTOM_ELEMENT:F}=us;let{IS_ALLOWED_URI:G}=us,Y=null;const B=Ae({},[...as,...mo,...bo,...yo,...ss]);let V=null;const j=Ae({},[...ls,...vo,...is,...vn]);let H=Object.seal(uo(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),q=null,ue=null;const ee=Object.seal(uo(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}}));let fe=!0,R=!0,ke=!1,me=!0,Ge=!1,De=!0,ye=!1,Me=!1,Ce=!1,we=!1,Ue=!1,Le=!1,K=!0,re=!1;const ne="user-content-";let oe=!0,be=!1,xe={},He=null;const Pe=Ae({},["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"]);let Ke=null;const Oe=Ae({},["audio","video","img","source","image","track"]);let X=null;const ae=Ae({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),de="http://www.w3.org/1998/Math/MathML",le="http://www.w3.org/2000/svg",se="http://www.w3.org/1999/xhtml";let Ne=se,ve=!1,Se=null;const _e=Ae({},[de,le,se],ho);let $e=Ae({},["mi","mo","mn","ms","mtext"]),je=Ae({},["annotation-xml"]);const Ee=Ae({},["title","style","font","a","script"]);let he=null;const Te=["application/xhtml+xml","text/html"],Ve="text/html";let Fe=null,Be=null;const Ze=r.createElement("form"),qt=function(z){return z instanceof RegExp||z instanceof Function},qe=function(){let z=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(!(Be&&Be===z)){if((!z||typeof z!="object")&&(z={}),z=Kt(z),he=Te.indexOf(z.PARSER_MEDIA_TYPE)===-1?Ve:z.PARSER_MEDIA_TYPE,Fe=he==="application/xhtml+xml"?ho:yn,Y=Ft(z,"ALLOWED_TAGS")?Ae({},z.ALLOWED_TAGS,Fe):B,V=Ft(z,"ALLOWED_ATTR")?Ae({},z.ALLOWED_ATTR,Fe):j,Se=Ft(z,"ALLOWED_NAMESPACES")?Ae({},z.ALLOWED_NAMESPACES,ho):_e,X=Ft(z,"ADD_URI_SAFE_ATTR")?Ae(Kt(ae),z.ADD_URI_SAFE_ATTR,Fe):ae,Ke=Ft(z,"ADD_DATA_URI_TAGS")?Ae(Kt(Oe),z.ADD_DATA_URI_TAGS,Fe):Oe,He=Ft(z,"FORBID_CONTENTS")?Ae({},z.FORBID_CONTENTS,Fe):Pe,q=Ft(z,"FORBID_TAGS")?Ae({},z.FORBID_TAGS,Fe):Kt({}),ue=Ft(z,"FORBID_ATTR")?Ae({},z.FORBID_ATTR,Fe):Kt({}),xe=Ft(z,"USE_PROFILES")?z.USE_PROFILES:!1,fe=z.ALLOW_ARIA_ATTR!==!1,R=z.ALLOW_DATA_ATTR!==!1,ke=z.ALLOW_UNKNOWN_PROTOCOLS||!1,me=z.ALLOW_SELF_CLOSE_IN_ATTR!==!1,Ge=z.SAFE_FOR_TEMPLATES||!1,De=z.SAFE_FOR_XML!==!1,ye=z.WHOLE_DOCUMENT||!1,we=z.RETURN_DOM||!1,Ue=z.RETURN_DOM_FRAGMENT||!1,Le=z.RETURN_TRUSTED_TYPE||!1,Ce=z.FORCE_BODY||!1,K=z.SANITIZE_DOM!==!1,re=z.SANITIZE_NAMED_PROPS||!1,oe=z.KEEP_CONTENT!==!1,be=z.IN_PLACE||!1,G=z.ALLOWED_URI_REGEXP||cs,Ne=z.NAMESPACE||se,$e=z.MATHML_TEXT_INTEGRATION_POINTS||$e,je=z.HTML_INTEGRATION_POINTS||je,H=z.CUSTOM_ELEMENT_HANDLING||{},z.CUSTOM_ELEMENT_HANDLING&&qt(z.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(H.tagNameCheck=z.CUSTOM_ELEMENT_HANDLING.tagNameCheck),z.CUSTOM_ELEMENT_HANDLING&&qt(z.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(H.attributeNameCheck=z.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),z.CUSTOM_ELEMENT_HANDLING&&typeof z.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements=="boolean"&&(H.allowCustomizedBuiltInElements=z.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),Ge&&(R=!1),Ue&&(we=!0),xe&&(Y=Ae({},ss),V=[],xe.html===!0&&(Ae(Y,as),Ae(V,ls)),xe.svg===!0&&(Ae(Y,mo),Ae(V,vo),Ae(V,vn)),xe.svgFilters===!0&&(Ae(Y,bo),Ae(V,vo),Ae(V,vn)),xe.mathMl===!0&&(Ae(Y,yo),Ae(V,is),Ae(V,vn))),z.ADD_TAGS&&(typeof z.ADD_TAGS=="function"?ee.tagCheck=z.ADD_TAGS:(Y===B&&(Y=Kt(Y)),Ae(Y,z.ADD_TAGS,Fe))),z.ADD_ATTR&&(typeof z.ADD_ATTR=="function"?ee.attributeCheck=z.ADD_ATTR:(V===j&&(V=Kt(V)),Ae(V,z.ADD_ATTR,Fe))),z.ADD_URI_SAFE_ATTR&&Ae(X,z.ADD_URI_SAFE_ATTR,Fe),z.FORBID_CONTENTS&&(He===Pe&&(He=Kt(He)),Ae(He,z.FORBID_CONTENTS,Fe)),z.ADD_FORBID_CONTENTS&&(He===Pe&&(He=Kt(He)),Ae(He,z.ADD_FORBID_CONTENTS,Fe)),oe&&(Y["#text"]=!0),ye&&Ae(Y,["html","head","body"]),Y.table&&(Ae(Y,["tbody"]),delete q.tbody),z.TRUSTED_TYPES_POLICY){if(typeof z.TRUSTED_TYPES_POLICY.createHTML!="function")throw Gr('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if(typeof z.TRUSTED_TYPES_POLICY.createScriptURL!="function")throw Gr('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');E=z.TRUSTED_TYPES_POLICY,O=E.createHTML("")}else E===void 0&&(E=Nd(f,o)),E!==null&&typeof O=="string"&&(O=E.createHTML(""));ft&&ft(z),Be=z}},jt=Ae({},[...mo,...bo,...bd]),_t=Ae({},[...yo,...yd]),Bt=function(z){let Z=v(z);(!Z||!Z.tagName)&&(Z={namespaceURI:Ne,tagName:"template"});const ie=yn(z.tagName),Ye=yn(Z.tagName);return Se[z.namespaceURI]?z.namespaceURI===le?Z.namespaceURI===se?ie==="svg":Z.namespaceURI===de?ie==="svg"&&(Ye==="annotation-xml"||$e[Ye]):!!jt[ie]:z.namespaceURI===de?Z.namespaceURI===se?ie==="math":Z.namespaceURI===le?ie==="math"&&je[Ye]:!!_t[ie]:z.namespaceURI===se?Z.namespaceURI===le&&!je[Ye]||Z.namespaceURI===de&&!$e[Ye]?!1:!_t[ie]&&(Ee[ie]||!jt[ie]):!!(he==="application/xhtml+xml"&&Se[z.namespaceURI]):!1},dt=function(z){zr(t.removed,{element:z});try{v(z).removeChild(z)}catch{w(z)}},Et=function(z,Z){try{zr(t.removed,{attribute:Z.getAttributeNode(z),from:Z})}catch{zr(t.removed,{attribute:null,from:Z})}if(Z.removeAttribute(z),z==="is")if(we||Ue)try{dt(Z)}catch{}else try{Z.setAttribute(z,"")}catch{}},Wt=function(z){let Z=null,ie=null;if(Ce)z=""+z;else{const Qe=po(z,/^[\r\n\t ]+/);ie=Qe&&Qe[0]}he==="application/xhtml+xml"&&Ne===se&&(z=''+z+"");const Ye=E?E.createHTML(z):z;if(Ne===se)try{Z=new u().parseFromString(Ye,he)}catch{}if(!Z||!Z.documentElement){Z=_.createDocument(Ne,"template",null);try{Z.documentElement.innerHTML=ve?O:Ye}catch{}}const ut=Z.body||Z.documentElement;return z&&ie&&ut.insertBefore(r.createTextNode(ie),ut.childNodes[0]||null),Ne===se?y.call(Z,ye?"html":"body")[0]:ye?Z.documentElement:ut},nr=function(z){return I.call(z.ownerDocument||z,z,h.SHOW_ELEMENT|h.SHOW_COMMENT|h.SHOW_TEXT|h.SHOW_PROCESSING_INSTRUCTION|h.SHOW_CDATA_SECTION,null)},mr=function(z){return z instanceof i&&(typeof z.nodeName!="string"||typeof z.textContent!="string"||typeof z.removeChild!="function"||!(z.attributes instanceof c)||typeof z.removeAttribute!="function"||typeof z.setAttribute!="function"||typeof z.namespaceURI!="string"||typeof z.insertBefore!="function"||typeof z.hasChildNodes!="function")},Cc=function(z){return typeof l=="function"&&z instanceof l};function Zt(ge,z,Z){bn(ge,ie=>{ie.call(t,z,Z,Be)})}const Sc=function(z){let Z=null;if(Zt(M.beforeSanitizeElements,z,null),mr(z))return dt(z),!0;const ie=Fe(z.nodeName);if(Zt(M.uponSanitizeElement,z,{tagName:ie,allowedTags:Y}),De&&z.hasChildNodes()&&!Cc(z.firstElementChild)&>(/<[/\w!]/g,z.innerHTML)&>(/<[/\w!]/g,z.textContent)||z.nodeType===Br.progressingInstruction||De&&z.nodeType===Br.comment&>(/<[/\w]/g,z.data))return dt(z),!0;if(!(ee.tagCheck instanceof Function&&ee.tagCheck(ie))&&(!Y[ie]||q[ie])){if(!q[ie]&&Ec(ie)&&(H.tagNameCheck instanceof RegExp&>(H.tagNameCheck,ie)||H.tagNameCheck instanceof Function&&H.tagNameCheck(ie)))return!1;if(oe&&!He[ie]){const Ye=v(z)||z.parentNode,ut=A(z)||z.childNodes;if(ut&&Ye){const Qe=ut.length;for(let wt=Qe-1;wt>=0;--wt){const Qt=m(ut[wt],!0);Qt.__removalCount=(z.__removalCount||0)+1,Ye.insertBefore(Qt,x(z))}}}return dt(z),!0}return z instanceof g&&!Bt(z)||(ie==="noscript"||ie==="noembed"||ie==="noframes")&>(/<\/no(script|embed|frames)/i,z.innerHTML)?(dt(z),!0):(Ge&&z.nodeType===Br.text&&(Z=z.textContent,bn([P,D,L],Ye=>{Z=Hr(Z,Ye," ")}),z.textContent!==Z&&(zr(t.removed,{element:z.cloneNode()}),z.textContent=Z)),Zt(M.afterSanitizeElements,z,null),!1)},_c=function(z,Z,ie){if(K&&(Z==="id"||Z==="name")&&(ie in r||ie in Ze))return!1;if(!(R&&!ue[Z]&>($,Z))){if(!(fe&>(S,Z))){if(!(ee.attributeCheck instanceof Function&&ee.attributeCheck(Z,z))){if(!V[Z]||ue[Z]){if(!(Ec(z)&&(H.tagNameCheck instanceof RegExp&>(H.tagNameCheck,z)||H.tagNameCheck instanceof Function&&H.tagNameCheck(z))&&(H.attributeNameCheck instanceof RegExp&>(H.attributeNameCheck,Z)||H.attributeNameCheck instanceof Function&&H.attributeNameCheck(Z,z))||Z==="is"&&H.allowCustomizedBuiltInElements&&(H.tagNameCheck instanceof RegExp&>(H.tagNameCheck,ie)||H.tagNameCheck instanceof Function&&H.tagNameCheck(ie))))return!1}else if(!X[Z]){if(!gt(G,Hr(ie,U,""))){if(!((Z==="src"||Z==="xlink:href"||Z==="href")&&z!=="script"&&gd(ie,"data:")===0&&Ke[z])){if(!(ke&&!gt(b,Hr(ie,U,"")))){if(ie)return!1}}}}}}}return!0},Ec=function(z){return z!=="annotation-xml"&&po(z,F)},Tc=function(z){Zt(M.beforeSanitizeAttributes,z,null);const{attributes:Z}=z;if(!Z||mr(z))return;const ie={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:V,forceKeepAttr:void 0};let Ye=Z.length;for(;Ye--;){const ut=Z[Ye],{name:Qe,namespaceURI:wt,value:Qt}=ut,Fr=Fe(Qe),Ha=Qt;let st=Qe==="value"?Ha:hd(Ha);if(ie.attrName=Fr,ie.attrValue=st,ie.keepAttr=!0,ie.forceKeepAttr=void 0,Zt(M.uponSanitizeAttribute,z,ie),st=ie.attrValue,re&&(Fr==="id"||Fr==="name")&&(Et(Qe,z),st=ne+st),De&>(/((--!?|])>)|<\/(style|title|textarea)/i,st)){Et(Qe,z);continue}if(Fr==="attributename"&&po(st,"href")){Et(Qe,z);continue}if(ie.forceKeepAttr)continue;if(!ie.keepAttr){Et(Qe,z);continue}if(!me&>(/\/>/i,st)){Et(Qe,z);continue}Ge&&bn([P,D,L],Ac=>{st=Hr(st,Ac," ")});const Nc=Fe(z.nodeName);if(!_c(Nc,Fr,st)){Et(Qe,z);continue}if(E&&typeof f=="object"&&typeof f.getAttributeType=="function"&&!wt)switch(f.getAttributeType(Nc,Fr)){case"TrustedHTML":{st=E.createHTML(st);break}case"TrustedScriptURL":{st=E.createScriptURL(st);break}}if(st!==Ha)try{wt?z.setAttributeNS(wt,Qe,st):z.setAttribute(Qe,st),mr(z)?dt(z):os(t.removed)}catch{Et(Qe,z)}}Zt(M.afterSanitizeAttributes,z,null)},Pp=function ge(z){let Z=null;const ie=nr(z);for(Zt(M.beforeSanitizeShadowDOM,z,null);Z=ie.nextNode();)Zt(M.uponSanitizeShadowNode,Z,null),Sc(Z),Tc(Z),Z.content instanceof a&&ge(Z.content);Zt(M.afterSanitizeShadowDOM,z,null)};return t.sanitize=function(ge){let z=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},Z=null,ie=null,Ye=null,ut=null;if(ve=!ge,ve&&(ge=""),typeof ge!="string"&&!Cc(ge))if(typeof ge.toString=="function"){if(ge=ge.toString(),typeof ge!="string")throw Gr("dirty is not a string, aborting")}else throw Gr("toString is not a function");if(!t.isSupported)return ge;if(Me||qe(z),t.removed=[],typeof ge=="string"&&(be=!1),be){if(ge.nodeName){const Qt=Fe(ge.nodeName);if(!Y[Qt]||q[Qt])throw Gr("root node is forbidden and cannot be sanitized in-place")}}else if(ge instanceof l)Z=Wt(""),ie=Z.ownerDocument.importNode(ge,!0),ie.nodeType===Br.element&&ie.nodeName==="BODY"||ie.nodeName==="HTML"?Z=ie:Z.appendChild(ie);else{if(!we&&!Ge&&!ye&&ge.indexOf("<")===-1)return E&&Le?E.createHTML(ge):ge;if(Z=Wt(ge),!Z)return we?null:Le?O:""}Z&&Ce&&dt(Z.firstChild);const Qe=nr(be?ge:Z);for(;Ye=Qe.nextNode();)Sc(Ye),Tc(Ye),Ye.content instanceof a&&Pp(Ye.content);if(be)return ge;if(we){if(Ue)for(ut=C.call(Z.ownerDocument);Z.firstChild;)ut.appendChild(Z.firstChild);else ut=Z;return(V.shadowroot||V.shadowrootmode)&&(ut=N.call(n,ut,!0)),ut}let wt=ye?Z.outerHTML:Z.innerHTML;return ye&&Y["!doctype"]&&Z.ownerDocument&&Z.ownerDocument.doctype&&Z.ownerDocument.doctype.name&>(ds,Z.ownerDocument.doctype.name)&&(wt=" -`+wt),Ge&&bn([P,D,L],Qt=>{wt=Hr(wt,Qt," ")}),E&&Le?E.createHTML(wt):wt},t.setConfig=function(){let ge=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};qe(ge),Me=!0},t.clearConfig=function(){Be=null,Me=!1},t.isValidAttribute=function(ge,z,Z){Be||qe({});const ie=Fe(ge),Ye=Fe(z);return _c(ie,Ye,Z)},t.addHook=function(ge,z){typeof z=="function"&&zr(M[ge],z)},t.removeHook=function(ge,z){if(z!==void 0){const Z=ud(M[ge],z);return Z===-1?void 0:fd(M[ge],Z,1)[0]}return os(M[ge])},t.removeHooks=function(ge){M[ge]=[]},t.removeAllHooks=function(){M=fs()},t}var hs=gs();const Ad=()=>{const e=()=>{const n=window.G7Core?.state?.get?.();return n&&n.preferredCurrency||"KRW"},[t,r]=k.useState(e);return k.useEffect(()=>{const n=window.G7Core?.state?.subscribe;if(r(e()),typeof n!="function")return;const o=n(a=>{r(a&&a.preferredCurrency||"KRW")});return typeof o=="function"?o:void 0},[]),t},Md=e=>{window.G7Core?.dispatch?.({handler:"navigate",params:{path:e}})},Od=e=>{const t=Math.round(e*2)/2;return[1,2,3,4,5].map(r=>t>=r?"full":t>=r-.5?"half":"empty")},ps=({product:e,onClick:t,shopBase:r="/shop",className:n="",id:o,editorAttrs:a})=>{const s=Ad(),l=A=>{const v=`multi_currency_${A}`,E=e[v];if(E&&E[s])return E[s].formatted;const O=`${A}_formatted`;return e[O]},g=e.name_localized??(typeof e.name=="string"?e.name:"")??"",h=l("selling_price"),c=l("list_price"),i=e.discount_rate&&e.discount_rate>0,u=e.sales_status&&e.sales_status!=="on_sale",f=e.labels??[],p=A=>hs.sanitize(A,{ALLOWED_TAGS:["mark"],ALLOWED_ATTR:[]}),m=e.name_highlighted,w=e.description_highlighted??e.short_description,x=()=>{t?t(e.id):Md(`${r==="/"?"":r}/products/${e.id}`)};return d.jsxs(Q,{onClick:x,className:`block w-full text-left group bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 overflow-hidden hover:shadow-lg transition-shadow cursor-pointer ${n}`,id:o,...a,children:[d.jsxs(W,{className:"relative aspect-square overflow-hidden bg-gray-100 dark:bg-gray-700",children:[d.jsx(Lt,{src:e.thumbnail_url,alt:g,className:"w-full h-full object-cover group-hover:scale-105 transition-transform duration-200",loading:"lazy"}),u&&d.jsx(W,{className:"absolute inset-0 bg-black/50 flex items-center justify-center",children:d.jsx(te,{className:`text-lg font-bold ${e.sales_status==="sold_out"?"text-red-300":e.sales_status==="suspended"?"text-amber-300":"text-blue-300"}`,style:{textShadow:"0 1px 4px rgba(0,0,0,0.6)"},children:e.sales_status_label??e.sales_status})}),i&&e.sales_status!=="sold_out"&&e.sales_status!=="suspended"&&d.jsxs(te,{className:"absolute top-2 left-2 px-2 py-1 bg-red-500 text-white text-xs font-bold rounded",children:[e.discount_rate,"%"]}),f.length>0&&d.jsx(W,{className:"absolute bottom-2 right-2 flex gap-1 flex-wrap justify-end",children:f.map((A,v)=>d.jsx(te,{className:"text-xs text-white font-medium px-1.5 py-0.5 rounded",style:{backgroundColor:A.color||"#6b7280"},children:A.name},v))})]}),d.jsxs(W,{className:"p-4",children:[d.jsxs(W,{className:"flex items-center gap-1.5 flex-wrap",children:[e.primary_category&&d.jsx(te,{className:"inline-block text-xs font-medium text-blue-600 dark:text-blue-400 bg-blue-50 dark:bg-blue-900/30 px-2 py-0.5 rounded",children:e.primary_category}),e.brand_name&&d.jsx(te,{className:"text-xs text-gray-500 dark:text-gray-400",children:e.brand_name})]}),m?d.jsx(W,{className:"mt-1 font-medium text-gray-900 dark:text-white line-clamp-1 [&_mark]:bg-yellow-200 [&_mark]:dark:bg-yellow-500/40 [&_mark]:px-0.5 [&_mark]:rounded",dangerouslySetInnerHTML:{__html:p(m)}}):d.jsx(gn,{className:"mt-1 font-medium text-gray-900 dark:text-white line-clamp-1",children:g}),w&&d.jsx(W,{className:"mt-1 text-sm text-gray-600 dark:text-gray-400 line-clamp-2 [&_mark]:bg-yellow-200 [&_mark]:dark:bg-yellow-500/40 [&_mark]:px-0.5 [&_mark]:rounded",dangerouslySetInnerHTML:{__html:p(w)}}),d.jsxs(W,{className:"mt-1.5 flex items-center gap-1",children:[Od(e.rating_avg??0).map((A,v)=>d.jsxs(te,{className:`text-xs ${A==="empty"?"text-gray-300 dark:text-gray-600":"text-yellow-400"}`,children:[A==="full"&&d.jsx("i",{className:"fa-solid fa-star"}),A==="half"&&d.jsx("i",{className:"fa-solid fa-star-half-stroke"}),A==="empty"&&d.jsx("i",{className:"fa-regular fa-star"})]},v)),d.jsx(te,{className:"text-xs text-gray-600 dark:text-gray-400 ml-0.5",children:(e.rating_avg??0).toFixed(1)}),d.jsxs(te,{className:"text-xs text-gray-400 dark:text-gray-500",children:["(",e.review_count??0,")"]})]}),d.jsxs(W,{className:"mt-2 flex items-baseline gap-2",children:[d.jsx(te,{className:"font-bold text-gray-900 dark:text-white",children:h}),c&&i&&d.jsx(te,{className:"text-sm text-gray-500 dark:text-gray-400 line-through",children:c})]})]})]})},Id=Object.freeze(Object.defineProperty({__proto__:null,default:ps},Symbol.toStringTag,{value:"Module"})),ms="carousel",Wr="controller",Dd="navigation",Ld="no-scroll",wo="portal",Pd="root",bs="toolbar",Fd="counter",Kr="fullscreen",ys="slideshow",Vr="thumbnails",vs="zoom",vr="loading",xo="playing",Yr="error",Xr="complete",Ud="placeholder",qr=e=>`active-slide-${e}`,$d=qr(vr),zd=qr(xo),Hd=qr(Yr),Gd=qr(Xr),ws="fullsize",wr="flex_center",jd="no_scroll",xs="no_scroll_padding",ko="slide",ks="slide_wrapper",Bd="slide_wrapper_interactive",Rt="prev",er="next",Co="swipe",xr="close",Cs="onPointerDown",Ss="onPointerMove",_s="onPointerUp",Es="onPointerLeave",Ts="onPointerCancel",So="onKeyDown",Wd="onKeyUp",_o="onWheel",Kd="Escape",Vd="ArrowLeft",Yd="ArrowRight",Xd="button",wn="icon",Ns="contain",As="cover",Ms="Unknown action type",Os="yarl__";function lt(...e){return[...e].filter(Boolean).join(" ")}function pe(e){return`${Os}${e}`}function We(e){return`--${Os}${e}`}function or(e,t){return`${e}${t?`_${t}`:""}`}function ar(e){return t=>or(e,t)}function sr(e,t){var r;return(r=e?.[t])!==null&&r!==void 0?r:t}function Is(e,t,r){return sr(e,"{index} of {total}").replace(/\{index}/g,`${Ao(r,t.length)+1}`).replace(/\{total}/g,`${t.length}`)}function kr(...e){return()=>{e.forEach(t=>{t()})}}function At(e,t,r){return()=>{const n=T.useContext(r);if(!n)throw new Error(`${e} must be used within a ${t}.Provider`);return n}}function Eo(){return typeof window<"u"}function To(e,t=0){const r=10**t;return Math.round((e+Number.EPSILON)*r)/r}function lr(e){return e.type===void 0||e.type==="image"}function No(e,t){return e.imageFit===As||e.imageFit!==Ns&&t===As}function xn(e){return typeof e=="string"?Number.parseInt(e,10):e}function kn(e){if(typeof e=="number")return{pixel:e};if(typeof e=="string"){const t=xn(e);return e.endsWith("%")?{percent:t}:{pixel:t}}return{pixel:0}}function qd(e,t){const r=kn(t),n=r.percent!==void 0?e.width/100*r.percent:r.pixel;return{width:Math.max(e.width-2*n,0),height:Math.max(e.height-2*n,0)}}function Zd(){return(Eo()?window?.devicePixelRatio:void 0)||1}function Ao(e,t){return t>0?(e%t+t)%t:0}function Mo(e){return e.length>0}function Oo(e,t){return e[Ao(t,e.length)]}function Io(e,t){return Mo(e)?Oo(e,t):void 0}function Ds(e){return lr(e)?e.src:void 0}function Cn(e,t,r){if(!r)return e;const{buttons:n,...o}=e,a=n.findIndex(l=>l===t),s=T.isValidElement(r)?T.cloneElement(r,{key:t},null):r;if(a>=0){const l=[...n];return l.splice(a,1,s),{buttons:l,...o}}return{buttons:[s,...n],...o}}function Ls(e,t,r=0){return Math.min(e.preload,Math.max(e.finite?t.length-1:Math.floor(t.length/2),r))}const Qd=Number(T.version.split(".")[0])>=19;function Jd(e){return{inert:Qd?e:e?"":void 0}}function Rd(e){e.scrollTop}const Do={open:!1,close:()=>{},index:0,slides:[],render:{},plugins:[],toolbar:{buttons:[xr]},labels:{},animation:{fade:250,swipe:500,easing:{fade:"ease",swipe:"ease-out",navigation:"ease-in-out"}},carousel:{finite:!1,preload:2,padding:"16px",spacing:"30%",imageFit:Ns,imageProps:{}},controller:{ref:null,focus:!0,aria:!1,touchAction:"none",closeOnPullUp:!1,closeOnPullDown:!1,closeOnBackdropClick:!1,preventDefaultWheelX:!0,preventDefaultWheelY:!1,disableSwipeNavigation:!1},portal:{},noScroll:{disabled:!1},on:{},styles:{},className:""};function Mt(e,t){return{name:e,component:t}}function et(e,t){return{module:e,children:t}}function Ps(e,t,r){return e.module.name===t?r(e):e.children?[et(e.module,e.children.flatMap(n=>{var o;return(o=Ps(n,t,r))!==null&&o!==void 0?o:[]}))]:[e]}function Cr(e,t,r){return e.flatMap(n=>{var o;return(o=Ps(n,t,r))!==null&&o!==void 0?o:[]})}function eu(e,t=[],r=[]){let n=e;const o=f=>{const p=[...n];for(;p.length>0;){const m=p.pop();if(m?.module.name===f)return!0;m?.children&&p.push(...m.children)}return!1},a=(f,p)=>{if(f===""){n=[et(p,n)];return}n=Cr(n,f,m=>[et(p,[m])])},s=(f,p)=>{n=Cr(n,f,m=>[et(m.module,[et(p,m.children)])])},l=(f,p,m)=>{n=Cr(n,f,w=>{var x;return[et(w.module,[...m?[et(p)]:[],...(x=w.children)!==null&&x!==void 0?x:[],...m?[]:[et(p)]])]})},g=(f,p,m)=>{n=Cr(n,f,w=>[...m?[et(p)]:[],w,...m?[]:[et(p)]])},h=f=>{s(Wr,f)},c=(f,p)=>{n=Cr(n,f,m=>[et(p,m.children)])},i=f=>{n=Cr(n,f,p=>p.children)},u=f=>{r.push(f)};return t.forEach(f=>{f({contains:o,addParent:a,append:s,addChild:l,addSibling:g,addModule:h,replace:c,remove:i,augment:u})}),{config:n,augmentation:f=>r.reduce((p,m)=>m(p),f)}}const Fs=T.createContext(null),Lo=At("useA11yContext","A11yContext",Fs);function tu({children:e}){const[t,r]=T.useState(!1),[n,o]=T.useState(!1),a=T.useMemo(()=>({focusWithin:t,trackFocusWithin:(l,g)=>{const h=c=>i=>{var u;i.currentTarget.contains(i.relatedTarget)||r(c),(u=c?l:g)===null||u===void 0||u(i)};return{onFocus:h(!0),onBlur:h(!1)}},autoPlaying:n,setAutoPlaying:o}),[t,n]);return T.createElement(Fs.Provider,{value:a},e)}const Us=T.createContext(null),Sr=At("useDocument","DocumentContext",Us);function ru({nodeRef:e,children:t}){const r=T.useMemo(()=>{const n=a=>{var s;return((s=a||e.current)===null||s===void 0?void 0:s.ownerDocument)||document};return{getOwnerDocument:n,getOwnerWindow:a=>{var s;return((s=n(a))===null||s===void 0?void 0:s.defaultView)||window}}},[e]);return T.createElement(Us.Provider,{value:r},t)}const $s=T.createContext(null),_r=At("useEvents","EventsContext",$s);function nu({children:e}){const[t]=T.useState({});T.useEffect(()=>()=>{Object.keys(t).forEach(n=>delete t[n])},[t]);const r=T.useMemo(()=>{const n=(s,l)=>{var g;(g=t[s])===null||g===void 0||g.splice(0,t[s].length,...t[s].filter(h=>h!==l))};return{publish:(...[s,l])=>{var g;(g=t[s])===null||g===void 0||g.forEach(h=>h(l))},subscribe:(s,l)=>(t[s]||(t[s]=[]),t[s].push(l),()=>n(s,l)),unsubscribe:n}},[t]);return T.createElement($s.Provider,{value:r},e)}const zs=T.createContext(null),tt=At("useLightboxProps","LightboxPropsContext",zs);function Hs({children:e,...t}){return T.createElement(zs.Provider,{value:t},e)}const Gs=T.createContext(null),Ot=At("useLightboxState","LightboxStateContext",Gs),js=T.createContext(null),ou=At("useLightboxDispatch","LightboxDispatchContext",js);function au(e,t){switch(t.type){case"swipe":{const{slides:r}=e,n=t?.increment||0,o=e.globalIndex+n,a=Ao(o,r.length),s=Io(r,a),l=n||t.duration!==void 0?{increment:n,duration:t.duration,easing:t.easing}:void 0;return{slides:r,currentIndex:a,globalIndex:o,currentSlide:s,animation:l}}case"update":return t.slides!==e.slides||t.index!==e.currentIndex?{slides:t.slides,currentIndex:t.index,globalIndex:t.index,currentSlide:Io(t.slides,t.index)}:e;default:throw new Error(Ms)}}function su({slides:e,index:t,children:r}){const[n,o]=T.useReducer(au,{slides:e,currentIndex:t,globalIndex:t,currentSlide:Io(e,t)});T.useEffect(()=>{o({type:"update",slides:e,index:t})},[e,t]);const a=T.useMemo(()=>({...n,state:n,dispatch:o}),[n,o]);return T.createElement(js.Provider,{value:o},T.createElement(Gs.Provider,{value:a},r))}const Bs=T.createContext(null),Zr=At("useTimeouts","TimeoutsContext",Bs);function lu({children:e}){const[t]=T.useState([]);T.useEffect(()=>()=>{t.forEach(n=>window.clearTimeout(n)),t.splice(0,t.length)},[t]);const r=T.useMemo(()=>{const n=s=>{t.splice(0,t.length,...t.filter(l=>l!==s))};return{setTimeout:(s,l)=>{const g=window.setTimeout(()=>{n(g),s()},l);return t.push(g),g},clearTimeout:s=>{s!==void 0&&(n(s),window.clearTimeout(s))}}},[t]);return T.createElement(Bs.Provider,{value:r},e)}const Er=T.forwardRef(function({label:t,className:r,icon:n,renderIcon:o,onClick:a,style:s,...l},g){const{styles:h,labels:c}=tt(),i=sr(c,t);return T.createElement("button",{ref:g,type:"button",title:i,"aria-label":i,className:lt(pe(Xd),r),onClick:a,style:{...s,...h.button},...l},o?o():T.createElement(n,{className:pe(wn),style:h.icon}))});function Ws(e,t){const r=n=>T.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",width:"24",height:"24","aria-hidden":"true",focusable:"false",...n},t);return r.displayName=e,r}function mt(e,t){return Ws(e,T.createElement("g",{fill:"currentColor"},T.createElement("path",{d:"M0 0h24v24H0z",fill:"none"}),t))}function iu(e,t){return Ws(e,T.createElement(T.Fragment,null,T.createElement("defs",null,T.createElement("mask",{id:"strike"},T.createElement("path",{d:"M0 0h24v24H0z",fill:"white"}),T.createElement("path",{d:"M0 0L24 24",stroke:"black",strokeWidth:4}))),T.createElement("path",{d:"M0.70707 2.121320L21.878680 23.292883",stroke:"currentColor",strokeWidth:2}),T.createElement("g",{fill:"currentColor",mask:"url(#strike)"},T.createElement("path",{d:"M0 0h24v24H0z",fill:"none"}),t)))}const cu=mt("Close",T.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"})),du=mt("Previous",T.createElement("path",{d:"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"})),uu=mt("Next",T.createElement("path",{d:"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"})),fu=mt("Loading",T.createElement(T.Fragment,null,Array.from({length:8}).map((e,t,r)=>T.createElement("line",{key:t,x1:"12",y1:"6.5",x2:"12",y2:"1.8",strokeLinecap:"round",strokeWidth:"2.6",stroke:"currentColor",strokeOpacity:1/r.length*(t+1),transform:`rotate(${360/r.length*t}, 12, 12)`})))),gu=mt("Error",T.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"})),Ut=Eo()?T.useLayoutEffect:T.useEffect;function Po(){const[e,t]=T.useState(!1);return T.useEffect(()=>{var r,n;const o=(r=window.matchMedia)===null||r===void 0?void 0:r.call(window,"(prefers-reduced-motion: reduce)");t(o?.matches);const a=s=>t(s.matches);return(n=o?.addEventListener)===null||n===void 0||n.call(o,"change",a),()=>{var s;return(s=o?.removeEventListener)===null||s===void 0?void 0:s.call(o,"change",a)}},[]),e}function hu(e){let t=0,r=0,n=0;const a=window.getComputedStyle(e).transform.match(/matrix.*\((.+)\)/);if(a){const s=a[1].split(",").map(xn);s.length===6?(t=s[4],r=s[5]):s.length===16&&(t=s[12],r=s[13],n=s[14])}return{x:t,y:r,z:n}}function Fo(e,t){const r=T.useRef(void 0),n=T.useRef(void 0),o=Po();return Ut(()=>{var a,s,l;if(e.current&&r.current!==void 0&&!o){const{keyframes:g,duration:h,easing:c,onfinish:i}=t(r.current,e.current.getBoundingClientRect(),hu(e.current))||{};if(g&&h){(a=n.current)===null||a===void 0||a.cancel(),n.current=void 0;try{n.current=(l=(s=e.current).animate)===null||l===void 0?void 0:l.call(s,g,{duration:h,easing:c})}catch(u){console.error(u)}n.current&&(n.current.onfinish=()=>{n.current=void 0,i?.()})}}r.current=void 0}),{prepareAnimation:a=>{r.current=a},isAnimationPlaying:()=>{var a;return((a=n.current)===null||a===void 0?void 0:a.playState)==="running"}}}function Ks(){const e=T.useRef(null),t=T.useRef(void 0),[r,n]=T.useState();return{setContainerRef:T.useCallback(a=>{e.current=a,t.current&&(t.current.disconnect(),t.current=void 0);const s=()=>{if(a){const l=window.getComputedStyle(a),g=h=>parseFloat(h)||0;n({width:Math.round(a.clientWidth-g(l.paddingLeft)-g(l.paddingRight)),height:Math.round(a.clientHeight-g(l.paddingTop)-g(l.paddingBottom))})}else n(void 0)};s(),a&&typeof ResizeObserver<"u"&&(t.current=new ResizeObserver(s),t.current.observe(a))},[]),containerRef:e,containerRect:r}}function Sn(){const e=T.useRef(void 0),{setTimeout:t,clearTimeout:r}=Zr();return T.useCallback((n,o)=>{r(e.current),e.current=t(n,o>0?o:0)},[t,r])}function Ie(e){const t=T.useRef(e);return Ut(()=>{t.current=e}),T.useCallback((...r)=>{var n;return(n=t.current)===null||n===void 0?void 0:n.call(t,...r)},[])}function Vs(e,t){typeof e=="function"?e(t):e&&(e.current=t)}function Uo(e,t){return T.useMemo(()=>e==null&&t==null?null:r=>{Vs(e,r),Vs(t,r)},[e,t])}function Ys(e,t=!1){const r=T.useRef(!1);Ut(()=>{t&&r.current&&(r.current=!1,e())},[t,e]);const n=T.useCallback(()=>{r.current=!0},[]),o=T.useCallback(()=>{r.current=!1},[]);return{onFocus:n,onBlur:o}}function _n(){const[e,t]=T.useState(!1);return Ut(()=>{t(window.getComputedStyle(window.document.documentElement).direction==="rtl")},[]),e}function Xs(){const[e]=T.useState({}),t=T.useCallback((o,a)=>{var s;(s=e[o])===null||s===void 0||s.forEach(l=>{a.isPropagationStopped()||l(a)})},[e]),r=T.useMemo(()=>({onPointerDown:o=>t(Cs,o),onPointerMove:o=>t(Ss,o),onPointerUp:o=>t(_s,o),onPointerLeave:o=>t(Es,o),onPointerCancel:o=>t(Ts,o),onKeyDown:o=>t(So,o),onKeyUp:o=>t(Wd,o),onWheel:o=>t(_o,o)}),[t]),n=T.useCallback((o,a)=>(e[o]||(e[o]=[]),e[o].unshift(a),()=>{const s=e[o];s&&s.splice(0,s.length,...s.filter(l=>l!==a))}),[e]);return{registerSensors:r,subscribeSensors:n}}function qs(e,t){const r=T.useRef(0),n=Sn(),o=Ie((...a)=>{r.current=Date.now(),e(a)});return T.useCallback((...a)=>{n(()=>{o(a)},t-(Date.now()-r.current))},[t,o,n])}const $o=ar("slide"),zo=ar("slide_image");function ir({slide:e,offset:t,render:r,rect:n,imageFit:o,imageProps:a,onClick:s,onLoad:l,onError:g,style:h}){var c,i,u,f,p,m,w,x;const[A,v]=T.useState(vr),{publish:E}=_r(),{setTimeout:O}=Zr(),_=T.useRef(null);T.useEffect(()=>{t===0&&E(qr(A))},[t,A,E]);const I=Ie(B=>{("decode"in B?B.decode():Promise.resolve()).catch(()=>{}).then(()=>{B.parentNode&&(v(Xr),O(()=>{l?.(B)},0))})}),C=T.useCallback(B=>{_.current=B,B?.complete&&I(B)},[I]),y=T.useCallback(B=>{I(B.currentTarget)},[I]),N=Ie(()=>{v(Yr),g?.()}),M=No(e,o),P=(B,V)=>Number.isFinite(B)?B:V,D=P(Math.max(...((i=(c=e.srcSet)===null||c===void 0?void 0:c.map(B=>B.width))!==null&&i!==void 0?i:[]).concat(e.width?[e.width]:[]).filter(Boolean)),((u=_.current)===null||u===void 0?void 0:u.naturalWidth)||0),L=P(Math.max(...((p=(f=e.srcSet)===null||f===void 0?void 0:f.map(B=>B.height))!==null&&p!==void 0?p:[]).concat(e.height?[e.height]:[]).filter(Boolean)),((m=_.current)===null||m===void 0?void 0:m.naturalHeight)||0),$=D&&L?{maxWidth:`min(${D}px, 100%)`,maxHeight:`min(${L}px, 100%)`}:{maxWidth:"100%",maxHeight:"100%"},S=(w=e.srcSet)===null||w===void 0?void 0:w.sort((B,V)=>B.width-V.width).map(B=>`${B.src} ${B.width}w`).join(", "),b=()=>n&&!M&&e.width&&e.height?n.height/e.height*e.width:Number.MAX_VALUE,U=S&&n&&Eo()?`${Math.round(Math.min(b(),n.width))}px`:void 0,{style:F,className:G,...Y}=a||{};return T.createElement(T.Fragment,null,T.createElement("img",{ref:C,onLoad:y,onError:N,onClick:s,draggable:!1,className:lt(pe(zo()),M&&pe(zo("cover")),A!==Xr&&pe(zo("loading")),G),style:{...$,...h,...F},...Y,alt:(x=e.alt)!==null&&x!==void 0?x:"",sizes:U,srcSet:S,src:e.src}),A!==Xr&&T.createElement("div",{className:pe($o(Ud))},A===vr&&(r?.iconLoading?r.iconLoading():T.createElement(fu,{className:lt(pe(wn),pe($o(vr)))})),A===Yr&&(r?.iconError?r.iconError():T.createElement(gu,{className:lt(pe(wn),pe($o(Yr)))}))))}const pu=T.forwardRef(function({className:t,children:r,onFocus:n,onBlur:o,...a},s){const l=T.useRef(null),{trackFocusWithin:g}=Lo();return T.createElement(ru,{nodeRef:l},T.createElement("div",{ref:Uo(s,l),className:lt(pe("root"),t),...g(n,o),...a},r))});var it;(function(e){e[e.NONE=0]="NONE",e[e.SWIPE=1]="SWIPE",e[e.PULL=2]="PULL",e[e.ANIMATION=3]="ANIMATION"})(it||(it={}));function Zs(e,t,r,n,o){T.useEffect(()=>o?()=>{}:kr(e(Cs,t),e(Ss,r),e(_s,n),e(Es,n),e(Ts,n)),[e,t,r,n,o])}var $t;(function(e){e[e.NONE=0]="NONE",e[e.SWIPE=1]="SWIPE",e[e.PULL=2]="PULL"})($t||($t={}));const Ho=30;function mu({disableSwipeNavigation:e,closeOnBackdropClick:t},r,n,o,a,s,l,g,h,c,i,u,f,p,m,w){const x=T.useRef(0),A=T.useRef([]),v=T.useRef(void 0),E=T.useRef(0),O=T.useRef($t.NONE),_=T.useCallback(D=>{v.current===D.pointerId&&(v.current=void 0,O.current=$t.NONE);const L=A.current;L.splice(0,L.length,...L.filter($=>$.pointerId!==D.pointerId))},[]),I=T.useCallback(D=>{_(D),D.persist(),A.current.push(D)},[_]),C=T.useCallback(D=>A.current.find(({pointerId:L})=>D.pointerId===L),[]),y=Ie(D=>{I(D)}),N=(D,L)=>i&&D>L||c&&D<-L,M=Ie(D=>{const L=C(D);if(L)if(v.current===D.pointerId){const $=Date.now()-E.current,S=x.current;O.current===$t.SWIPE?Math.abs(S)>.3*o||Math.abs(S)>5&&${const L=C(D);if(L){const $=v.current===D.pointerId;if(D.buttons===0){$&&x.current!==0?M(D):_(L);return}const S=D.clientX-L.clientX,b=D.clientY-L.clientY;if(v.current===void 0){const U=F=>{I(D),v.current=D.pointerId,E.current=Date.now(),O.current=F};Math.abs(S)>Math.abs(b)&&Math.abs(S)>Ho&&n(S)?e||(U($t.SWIPE),s()):Math.abs(b)>Math.abs(S)&&N(b,Ho)&&(U($t.PULL),u())}else $&&(O.current===$t.SWIPE?(x.current=S,l(S)):O.current===$t.PULL&&(x.current=b,f(b)))}});Zs(r,y,P,M)}function bu({preventDefaultWheelX:e,preventDefaultWheelY:t}){const r=T.useRef(null),n=Ie(o=>{const a=Math.abs(o.deltaX)>Math.abs(o.deltaY);(a&&e||!a&&t||o.ctrlKey)&&o.preventDefault()});return T.useCallback(o=>{var a;o?o.addEventListener("wheel",n,{passive:!1}):(a=r.current)===null||a===void 0||a.removeEventListener("wheel",n),r.current=o},[n])}function yu(e,t,r,n,o,a,s,l,g){const h=T.useRef(0),c=T.useRef(0),i=T.useRef(void 0),u=T.useRef(void 0),f=T.useRef(0),p=T.useRef(void 0),m=T.useRef(0),{setTimeout:w,clearTimeout:x}=Zr(),A=T.useCallback(()=>{i.current&&(x(i.current),i.current=void 0)},[x]),v=T.useCallback(()=>{u.current&&(x(u.current),u.current=void 0)},[x]),E=Ie(()=>{e!==it.SWIPE&&(h.current=0,m.current=0,A(),v())});T.useEffect(E,[e,E]);const O=Ie(I=>{u.current=void 0,h.current===I&&g(h.current)}),_=Ie(I=>{if(I.ctrlKey||Math.abs(I.deltaY)>Math.abs(I.deltaX))return;const C=y=>{f.current=y,x(p.current),p.current=y>0?w(()=>{f.current=0,p.current=void 0},300):void 0};if(e===it.NONE){if(Math.abs(I.deltaX)<=1.2*Math.abs(f.current)){C(I.deltaX);return}if(!r(-I.deltaX))return;if(c.current+=I.deltaX,A(),Math.abs(c.current)>30)c.current=0,C(0),m.current=Date.now(),a();else{const y=c.current;i.current=w(()=>{i.current=void 0,y===c.current&&(c.current=0)},o)}}else if(e===it.SWIPE){let y=h.current-I.deltaX;if(y=Math.min(Math.abs(y),n)*Math.sign(y),h.current=y,s(y),v(),Math.abs(y)>.2*n){C(I.deltaX),l(y,Date.now()-m.current);return}u.current=w(()=>O(y),2*o)}else C(I.deltaX)});T.useEffect(()=>t(_o,_),[t,_])}const Qs=ar("container"),Js=T.createContext(null),zt=At("useController","ControllerContext",Js);function vu({children:e,...t}){var r;const{carousel:n,animation:o,controller:a,on:s,styles:l,render:g}=t,{closeOnPullUp:h,closeOnPullDown:c,preventDefaultWheelX:i,preventDefaultWheelY:u}=a,[f,p]=T.useState(),m=Ot(),w=ou(),[x,A]=T.useState(it.NONE),v=T.useRef(0),E=T.useRef(0),O=T.useRef(1),{registerSensors:_,subscribeSensors:I}=Xs(),{subscribe:C,publish:y}=_r(),N=Sn(),M=Sn(),P=Sn(),{containerRef:D,setContainerRef:L,containerRect:$}=Ks(),S=Uo(bu({preventDefaultWheelX:i,preventDefaultWheelY:u}),L),b=T.useRef(null),U=Uo(b,void 0),{getOwnerDocument:F}=Sr(),G=_n(),Y=K=>(G?-1:1)*(typeof K=="number"?K:1),B=Ie(()=>{var K;return(K=D.current)===null||K===void 0?void 0:K.focus()}),V=Ie(()=>t),j=Ie(()=>m),H=T.useCallback(K=>y(Rt,K),[y]),q=T.useCallback(K=>y(er,K),[y]),ue=T.useCallback(()=>y(xr),[y]),ee=K=>!(n.finite&&(Y(K)>0&&m.currentIndex===0||Y(K)<0&&m.currentIndex===m.slides.length-1)),fe=K=>{var re;v.current=K,(re=D.current)===null||re===void 0||re.style.setProperty(We("swipe_offset"),`${Math.round(K)}px`)},R=K=>{var re,ne;E.current=K,O.current=(()=>{const xe=c&&K>0?K:h&&K<0?-K:0;return Math.min(Math.max(To(1-xe/60*(1-.5),2),.5),1)})(),(re=D.current)===null||re===void 0||re.style.setProperty(We("pull_offset"),`${Math.round(K)}px`),(ne=D.current)===null||ne===void 0||ne.style.setProperty(We("pull_opacity"),`${O.current}`)},{prepareAnimation:ke}=Fo(b,(K,re,ne)=>{if(b.current&&$)return{keyframes:[{transform:`translate(0, ${K.rect.y-re.y+ne.y}px)`,opacity:K.opacity},{transform:"translate(0, 0)",opacity:1}],duration:K.duration,easing:o.easing.fade}}),me=(K,re)=>{if(h||c){R(K);let ne=0;b.current&&(ne=o.fade*(re?2:1),ke({rect:b.current.getBoundingClientRect(),opacity:O.current,duration:ne})),P(()=>{R(0),A(it.NONE)},ne),A(it.ANIMATION),re||ue()}},{prepareAnimation:Ge,isAnimationPlaying:De}=Fo(b,(K,re,ne)=>{var oe;if(b.current&&$&&(!((oe=m.animation)===null||oe===void 0)&&oe.duration)){const be=kn(n.spacing),xe=(be.percent?be.percent*$.width/100:be.pixel)||0;return{keyframes:[{transform:`translate(${Y(m.globalIndex-K.index)*($.width+xe)+K.rect.x-re.x+ne.x}px, 0)`},{transform:"translate(0, 0)"}],duration:m.animation.duration,easing:m.animation.easing}}}),ye=Ie(K=>{var re,ne;const oe=K.offset||0,be=oe?o.swipe:(re=o.navigation)!==null&&re!==void 0?re:o.swipe,xe=!oe&&!De()?o.easing.navigation:o.easing.swipe;let{direction:He}=K;const Pe=(ne=K.count)!==null&&ne!==void 0?ne:1;let Ke=it.ANIMATION,Oe=be*Pe;if(!He){const ae=$?.width,de=K.duration||0,le=ae?be/ae*Math.abs(oe):be;Pe!==0?(de0?Rt:er):Oe=be/2}let X=0;He===Rt?ee(Y(1))?X=-Pe:(Ke=it.NONE,Oe=be):He===er&&(ee(Y(-1))?X=Pe:(Ke=it.NONE,Oe=be)),Oe=Math.round(Oe),M(()=>{fe(0),A(it.NONE)},Oe),b.current&&Ge({rect:b.current.getBoundingClientRect(),index:m.globalIndex}),A(Ke),y(Co,{type:"swipe",increment:X,duration:Oe,easing:xe})});T.useEffect(()=>{var K,re;!((K=m.animation)===null||K===void 0)&&K.increment&&(!((re=m.animation)===null||re===void 0)&&re.duration)&&N(()=>w({type:"swipe",increment:0}),m.animation.duration)},[m.animation,w,N]);const Me=[I,ee,$?.width||0,o.swipe,()=>A(it.SWIPE),K=>fe(K),(K,re)=>ye({offset:K,duration:re,count:1}),K=>ye({offset:K,count:0})],Ce=[()=>{c&&A(it.PULL)},K=>R(K),K=>me(K),K=>me(K,!0)];mu(a,...Me,h,c,...Ce,ue),yu(x,...Me);const we=Ie(()=>{a.focus&&F().querySelector(`.${pe(wo)} .${pe(Qs())}`)&&B()});T.useEffect(we,[we]);const Ue=Ie(()=>{var K;(K=s.view)===null||K===void 0||K.call(s,{index:m.currentIndex})});T.useEffect(Ue,[m.globalIndex,Ue]),T.useEffect(()=>kr(C(Rt,K=>ye({direction:Rt,...K})),C(er,K=>ye({direction:er,...K})),C(Co,K=>w(K))),[C,ye,w]);const Le=T.useMemo(()=>({prev:H,next:q,close:ue,focus:B,slideRect:$?qd($,n.padding):{width:0,height:0},containerRect:$||{width:0,height:0},subscribeSensors:I,containerRef:D,setCarouselRef:U,toolbarWidth:f,setToolbarWidth:p}),[H,q,ue,B,I,$,D,U,f,p,n.padding]);return T.useImperativeHandle(a.ref,()=>({prev:H,next:q,close:ue,focus:B,getLightboxProps:V,getLightboxState:j}),[H,q,ue,B,V,j]),T.createElement("div",{ref:S,className:lt(pe(Qs()),pe(wr)),style:{...x===it.SWIPE?{[We("swipe_offset")]:`${Math.round(v.current)}px`}:null,...x===it.PULL?{[We("pull_offset")]:`${Math.round(E.current)}px`,[We("pull_opacity")]:`${O.current}`}:null,...a.touchAction!=="none"?{[We("controller_touch_action")]:a.touchAction}:null,...l.container},tabIndex:-1,..._},$&&T.createElement(Js.Provider,{value:Le},e,(r=g.controls)===null||r===void 0?void 0:r.call(g)))}const wu=Mt(Wr,vu);function cr(e){return or(ms,e)}function Rs(e){return or(ko,e)}function xu({slide:e,offset:t}){const r=T.useRef(null),{currentIndex:n,slides:o}=Ot(),{slideRect:a,focus:s}=zt(),{render:l,carousel:{imageFit:g,imageProps:h},on:{click:c},styles:{slide:i},labels:u}=tt(),{getOwnerDocument:f}=Sr(),p=t!==0;T.useEffect(()=>{var w;p&&(!((w=r.current)===null||w===void 0)&&w.contains(f().activeElement))&&s()},[p,s,f]);const m=()=>{var w,x,A,v;let E=(w=l.slide)===null||w===void 0?void 0:w.call(l,{slide:e,offset:t,rect:a});return!E&&lr(e)&&(E=T.createElement(ir,{slide:e,offset:t,render:l,rect:a,imageFit:g,imageProps:h,onClick:p?void 0:()=>c?.({index:n})})),E?T.createElement(T.Fragment,null,(x=l.slideHeader)===null||x===void 0?void 0:x.call(l,{slide:e}),((A=l.slideContainer)!==null&&A!==void 0?A:(({children:O})=>O))({slide:e,children:E}),(v=l.slideFooter)===null||v===void 0?void 0:v.call(l,{slide:e})):null};return T.createElement("div",{ref:r,className:lt(pe(Rs()),!p&&pe(Rs("current")),pe(wr)),...Jd(p),style:i,role:"group","aria-roledescription":sr(u,"Slide"),"aria-label":Is(u,o,n+t)},m())}function ku(){const e=tt().styles.slide;return T.createElement("div",{className:pe(ko),style:e})}function Cu({carousel:e,labels:t}){const{slides:r,currentIndex:n,globalIndex:o}=Ot(),{setCarouselRef:a}=zt(),{autoPlaying:s,focusWithin:l}=Lo(),g=kn(e.spacing),h=kn(e.padding),c=Ls(e,r,1),i=[];if(Mo(r))for(let u=n-c;u<=n+c;u+=1){const f=Oo(r,u),p=o-n+u,m=e.finite&&(u<0||u>r.length-1);i.push(m?{key:p}:{key:[`${p}`,Ds(f)].filter(Boolean).join("|"),offset:u-n,slide:f})}return T.createElement("div",{ref:a,className:lt(pe(cr()),i.length>0&&pe(cr("with_slides"))),style:{[`${We(cr("slides_count"))}`]:i.length,[`${We(cr("spacing_px"))}`]:g.pixel||0,[`${We(cr("spacing_percent"))}`]:g.percent||0,[`${We(cr("padding_px"))}`]:h.pixel||0,[`${We(cr("padding_percent"))}`]:h.percent||0},role:"region","aria-live":s&&!l?"off":"polite","aria-roledescription":sr(t,"Carousel"),"aria-label":sr(t,"Photo gallery")},i.map(({key:u,slide:f,offset:p})=>f?T.createElement(xu,{key:u,slide:f,offset:p}):T.createElement(ku,{key:u})))}const Su=Mt(ms,Cu);function el(){const{carousel:e}=tt(),{slides:t,currentIndex:r}=Ot(),n=t.length===0||e.finite&&r===0,o=t.length===0||e.finite&&r===t.length-1;return{prevDisabled:n,nextDisabled:o}}function tl(e){var t;const r=_n(),{publish:n}=_r(),{animation:o}=tt(),{prevDisabled:a,nextDisabled:s}=el(),l=((t=o.navigation)!==null&&t!==void 0?t:o.swipe)/2,g=qs(()=>n(Rt),l),h=qs(()=>n(er),l),c=Ie(i=>{switch(i.key){case Kd:n(xr);break;case Vd:(r?s:a)||(r?h:g)();break;case Yd:(r?a:s)||(r?g:h)();break}});T.useEffect(()=>e(So,c),[e,c])}function rl({label:e,icon:t,renderIcon:r,action:n,onClick:o,disabled:a,style:s}){return T.createElement(Er,{label:e,icon:t,renderIcon:r,className:pe(`navigation_${n}`),disabled:a,onClick:o,style:s,...Ys(zt().focus,a)})}function _u({render:{buttonPrev:e,buttonNext:t,iconPrev:r,iconNext:n},styles:o}){const{prev:a,next:s,subscribeSensors:l}=zt(),{prevDisabled:g,nextDisabled:h}=el();return tl(l),T.createElement(T.Fragment,null,e?e():T.createElement(rl,{label:"Previous",action:Rt,icon:du,renderIcon:r,style:o.navigationPrev,disabled:g,onClick:a}),t?t():T.createElement(rl,{label:"Next",action:er,icon:uu,renderIcon:n,style:o.navigationNext,disabled:h,onClick:s}))}const Eu=Mt(Dd,_u),nl=pe(jd),Tu=pe(xs);function Nu(e){return"style"in e}function ol(e,t,r){const n=window.getComputedStyle(e),o=r?"padding-left":"padding-right",a=r?n.paddingLeft:n.paddingRight,s=e.style.getPropertyValue(o);return e.style.setProperty(o,`${(xn(a)||0)+t}px`),()=>{s?e.style.setProperty(o,s):e.style.removeProperty(o)}}function Au({noScroll:{disabled:e},children:t}){const r=_n(),{getOwnerDocument:n,getOwnerWindow:o}=Sr();return T.useEffect(()=>{if(e)return()=>{};const a=[],s=o(),{body:l,documentElement:g}=n(),h=Math.round(s.innerWidth-g.clientWidth);if(h>0){a.push(ol(l,h,r));const c=l.getElementsByTagName("*");for(let i=0;i{l.classList.remove(nl),a.forEach(c=>c())}},[r,e,n,o]),T.createElement(T.Fragment,null,t)}const Mu=Mt(Ld,Au);function al(e){return or(wo,e)}function sl(e,t,r){const n=e.getAttribute(t);return e.setAttribute(t,r),()=>{n?e.setAttribute(t,n):e.removeAttribute(t)}}function Ou({children:e,animation:t,styles:r,className:n,on:o,portal:a,close:s,labels:l}){const[g,h]=T.useState(!1),[c,i]=T.useState(!1),u=T.useRef([]),f=T.useRef(null),{setTimeout:p}=Zr(),{subscribe:m}=_r(),x=Po()?0:t.fade;T.useEffect(()=>(h(!0),()=>{h(!1),i(!1)}),[]);const A=Ie(()=>{u.current.forEach(_=>_()),u.current=[]}),v=Ie(()=>{var _;i(!1),A(),(_=o.exiting)===null||_===void 0||_.call(o),p(()=>{var I;(I=o.exited)===null||I===void 0||I.call(o),s()},x)});T.useEffect(()=>m(xr,v),[m,v]);const E=Ie(_=>{var I,C,y;Rd(_),i(!0),(I=o.entering)===null||I===void 0||I.call(o);const N=(y=(C=_.parentNode)===null||C===void 0?void 0:C.children)!==null&&y!==void 0?y:[];for(let M=0;M{var M,P;(P=(M=f.current)===null||M===void 0?void 0:M.focus)===null||P===void 0||P.call(M)}),p(()=>{var M;(M=o.entered)===null||M===void 0||M.call(o)},x)}),O=T.useCallback(_=>{_?E(_):A()},[E,A]);return g?Jt.createPortal(T.createElement(pu,{ref:O,className:lt(n,pe(al()),pe(xs),c&&pe(al("open"))),"aria-modal":!0,role:"dialog","aria-label":sr(l,"Lightbox"),style:{...t.fade!==Do.animation.fade?{[We("fade_animation_duration")]:`${x}ms`}:null,...t.easing.fade!==Do.animation.easing.fade?{[We("fade_animation_timing_function")]:t.easing.fade}:null,...r.root},onFocus:_=>{f.current||(f.current=_.relatedTarget)}},e),a.root||document.body):null}const Iu=Mt(wo,Ou);function Du({children:e}){return T.createElement(T.Fragment,null,e)}const Lu=Mt(Pd,Du);function Pu(e){return or(bs,e)}function Fu({toolbar:{buttons:e},render:{buttonClose:t,iconClose:r},styles:n}){const{close:o,setToolbarWidth:a}=zt(),{setContainerRef:s,containerRect:l}=Ks();Ut(()=>{a(l?.width)},[a,l?.width]);const g=()=>t?t():T.createElement(Er,{key:xr,label:"Close",icon:cu,renderIcon:r,onClick:o});return T.createElement("div",{ref:s,style:n.toolbar,className:pe(Pu())},e?.map(h=>h===xr?g():h))}const Uu=Mt(bs,Fu);function ll(e,t){var r;return T.createElement(e.module.component,{key:e.module.name,...t},(r=e.children)===null||r===void 0?void 0:r.map(n=>ll(n,t)))}function $u(e,t={}){const{easing:r,...n}=e,{easing:o,...a}=t;return{easing:{...r,...o},...n,...a}}function zu({carousel:e,animation:t,render:r,toolbar:n,controller:o,noScroll:a,on:s,plugins:l,slides:g,index:h,...c}){const{animation:i,carousel:u,render:f,toolbar:p,controller:m,noScroll:w,on:x,slides:A,index:v,plugins:E,...O}=Do,{config:_,augmentation:I}=eu([et(Iu,[et(Mu,[et(wu,[et(Su),et(Uu),et(Eu)])])])],l||E),C=I({animation:$u(i,t),carousel:{...u,...e},render:{...f,...r},toolbar:{...p,...n},controller:{...m,...o},noScroll:{...w,...a},on:{...x,...s},...O,...c});return C.open?T.createElement(Hs,{...C},T.createElement(su,{slides:g||A,index:xn(h||v)},T.createElement(lu,null,T.createElement(nu,null,T.createElement(tu,null,ll(et(Lu,_),C)))))):null}const Hu={minZoom:1,maxZoomPixelRatio:1,zoomInMultiplier:2,doubleTapDelay:300,doubleClickDelay:500,doubleClickMaxStops:2,keyboardMoveDistance:50,wheelZoomDistanceFactor:100,pinchZoomDistanceFactor:100,pinchZoomV4:!1,scrollToZoom:!1};function Gu(e){return Math.min(Math.max(e,Number.EPSILON),1)}function il(e){const{minZoom:t,...r}={...Hu,...e};return{minZoom:Gu(t),...r}}function ju(e,t,r,n){const o=T.useRef(void 0),a=T.useRef(void 0),{zoom:s}=tt().animation,l=Po(),g=Ie(()=>{var h,c,i;if((h=o.current)===null||h===void 0||h.cancel(),o.current=void 0,a.current&&n?.current){try{o.current=(i=(c=n.current).animate)===null||i===void 0?void 0:i.call(c,[{transform:a.current},{transform:`scale(${e}) translateX(${t}px) translateY(${r}px)`}],{duration:l?0:s??500,easing:o.current?"ease-out":"ease-in-out"})}catch(u){console.error(u)}a.current=void 0,o.current&&(o.current.onfinish=()=>{o.current=void 0})}});return Ut(g,[e,t,r,g]),T.useCallback(()=>{a.current=n?.current?window.getComputedStyle(n.current).transform:void 0},[n])}function Bu(e,t){const{on:r}=tt(),n=Ie(()=>{var o;t||(o=r.zoom)===null||o===void 0||o.call(r,{zoom:e})});T.useEffect(n,[e,n])}function En(){const{zoom:e}=tt();return il(e)}function Wu(e,t){var r,n;let o={width:0,height:0},a={width:0,height:0};const{currentSlide:s}=Ot(),{imageFit:l}=tt().carousel,{maxZoomPixelRatio:g}=En();if(e&&s){const c={...s,...t};if(lr(c)){const i=No(c,l),u=Math.max(...(((r=c.srcSet)===null||r===void 0?void 0:r.map(p=>p.width))||[]).concat(c.width?[c.width]:[])),f=Math.max(...(((n=c.srcSet)===null||n===void 0?void 0:n.map(p=>p.height))||[]).concat(c.height?[c.height]:[]));u>0&&f>0&&e.width>0&&e.height>0&&(a=i?{width:Math.round(Math.min(u,e.width/e.height*f)),height:Math.round(Math.min(f,e.height/e.width*u))}:{width:u,height:f},a={width:a.width*g,height:a.height*g},o=i?{width:Math.min(e.width,a.width,u),height:Math.min(e.height,a.height,f)}:{width:Math.round(Math.min(e.width,e.height/f*u,u)),height:Math.round(Math.min(e.height,e.width/u*f,f))})}}const h=o.width?Math.max(To(a.width/o.width,5),1):1;return{imageRect:o,maxZoom:h}}function cl(e,t){return Math.hypot(e.clientX-t.clientX,e.clientY-t.clientY)}function dl(e,t,r=100,n=2){return e*Math.min(1+Math.abs(t/r),n)**Math.sign(t)}function Ku(e,t,r,n,o,a,s,l,g){const h=T.useRef([]),c=T.useRef(0),i=T.useRef(void 0),{globalIndex:u}=Ot(),{getOwnerWindow:f}=Sr(),{containerRef:p,subscribeSensors:m}=zt(),{keyboardMoveDistance:w,zoomInMultiplier:x,wheelZoomDistanceFactor:A,scrollToZoom:v,doubleTapDelay:E,doubleClickDelay:O,doubleClickMaxStops:_,pinchZoomDistanceFactor:I,pinchZoomV4:C}=En(),y=T.useCallback(U=>{if(p.current){const{pageX:F,pageY:G}=U,{scrollX:Y,scrollY:B}=f(),{left:V,top:j,width:H,height:q}=p.current.getBoundingClientRect();return[F-V-Y-H/2,G-j-B-q/2]}return[]},[p,f]),N=Ie(U=>{const{key:F,metaKey:G,ctrlKey:Y}=U,B=G||Y,V=()=>{U.preventDefault(),U.stopPropagation()};if(e>1){const j=(H,q)=>{V(),l(H,q)};F==="ArrowDown"?j(0,w):F==="ArrowUp"?j(0,-w):F==="ArrowLeft"?j(-w,0):F==="ArrowRight"&&j(w,0)}F==="+"||B&&F==="="?(V(),o()):F==="-"||B&&F==="_"?(V(),a()):B&&F==="0"&&(V(),s(1))}),M=Ie(U=>{if((U.ctrlKey||v)&&Math.abs(U.deltaY)>Math.abs(U.deltaX)){U.stopPropagation(),s(dl(e,-U.deltaY,A),!0,...y(U));return}e>1&&(U.stopPropagation(),v||l(U.deltaX,U.deltaY))}),P=T.useCallback(U=>{const F=h.current;F.splice(0,F.length,...F.filter(G=>G.pointerId!==U.pointerId))},[]),D=T.useCallback(U=>{P(U),U.persist(),h.current.push(U)},[P]),L=Ie(U=>{var F;const G=h.current;if(U.pointerType==="mouse"&&U.buttons>1||!(!((F=g?.current)===null||F===void 0)&&F.contains(U.target)))return;e>1&&U.stopPropagation();const{timeStamp:Y}=U;if(G.length===0&&Y-c.current<(U.pointerType==="touch"?E:O)){c.current=0;const B=e>=1?e!==r?e*Math.max(r**(1/_),x):1:e!==t?e/Math.max(t**(-1/_),x):1;s(B,!1,...y(U))}else c.current=Y;if(D(U),G.length===2){const B=cl(G[0],G[1]);i.current={previousDistance:B,initialDistance:Math.max(B,1),initialZoom:e}}}),$=Ie(U=>{const F=h.current,G=F.find(Y=>Y.pointerId===U.pointerId);if(F.length===2&&i.current){U.stopPropagation(),D(U);const Y=cl(F[0],F[1]),B=C?i.current.initialZoom/i.current.initialDistance*Y:dl(e,Y-i.current.previousDistance,I);s(B,!0,...F.map(V=>y(V)).reduce((V,j)=>j.map((H,q)=>V[q]+H/2))),i.current.previousDistance=Y;return}e>1&&(U.stopPropagation(),G&&(F.length===1&&l((G.clientX-U.clientX)/e,(G.clientY-U.clientY)/e),D(U)))}),S=T.useCallback(U=>{const F=h.current;F.length===2&&F.find(G=>G.pointerId===U.pointerId)&&(i.current=void 0),P(U)},[P]),b=T.useCallback(()=>{const U=h.current;U.splice(0,U.length),c.current=0,i.current=void 0},[]);Zs(m,L,$,S,n),T.useEffect(b,[u,b]),T.useEffect(()=>n?()=>{}:kr(b,m(So,N),m(_o,M)),[n,m,b,N,M])}function Vu(e,t,r){const[n,o]=T.useState(1),[a,s]=T.useState(0),[l,g]=T.useState(0),h=ju(n,a,l,r),{currentSlide:c,globalIndex:i}=Ot(),{containerRect:u,slideRect:f}=zt(),{minZoom:p,zoomInMultiplier:m}=En(),w=c&&lr(c)?c.src:void 0,x=!w||!r?.current;Ut(()=>{o(1),s(0),g(0)},[i,w]);const A=T.useCallback((I,C,y)=>{const N=y||n,M=a-(I||0),P=l-(C||0),D=(e.width*N-f.width)/2/N,L=(e.height*N-f.height)/2/N;s(Math.min(Math.abs(M),Math.max(D,0))*Math.sign(M)),g(Math.min(Math.abs(P),Math.max(L,0))*Math.sign(P))},[n,a,l,f,e.width,e.height]),v=T.useCallback((I,C,y,N)=>{const M=To(I+.01p?I:p:t,5);C||h(),A(y?y*(1/n-1/M):0,N?N*(1/n-1/M):0,M),o(M)},[n,p,t,A,h]),E=Ie(()=>{n>1&&(n>t&&v(t,!0),A())});Ut(E,[u.width,u.height,E]);const O=T.useCallback(()=>{const I=n*m;v(n<1&&I>1?1:I)},[n,m,v]),_=T.useCallback(()=>{const I=n/m;v(n>1&&I<1?1:I)},[n,m,v]);return{zoom:n,offsetX:a,offsetY:l,disabled:x,changeOffsets:A,changeZoom:v,zoomIn:O,zoomOut:_}}const ul=T.createContext(null),Go=At("useZoom","ZoomControllerContext",ul);function Yu({children:e}){const[t,r]=T.useState(),{slideRect:n}=zt(),{ref:o,minZoom:a}=En(),{imageRect:s,maxZoom:l}=Wu(n,t?.imageDimensions),{zoom:g,offsetX:h,offsetY:c,disabled:i,changeZoom:u,changeOffsets:f,zoomIn:p,zoomOut:m}=Vu(s,l,t?.zoomWrapperRef);Bu(g,i),Ku(g,a,l,i,p,m,u,f,t?.zoomWrapperRef);const w=T.useMemo(()=>({zoom:g,minZoom:a,maxZoom:l,offsetX:h,offsetY:c,disabled:i,zoomIn:p,zoomOut:m,changeZoom:u}),[g,a,l,h,c,i,p,m,u]);T.useImperativeHandle(o,()=>w,[w]);const x=T.useMemo(()=>({...w,setZoomWrapper:r}),[w,r]);return T.createElement(ul.Provider,{value:x},e)}const Xu=mt("ZoomIn",T.createElement(T.Fragment,null,T.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"}),T.createElement("path",{d:"M12 10h-2v2H9v-2H7V9h2V7h1v2h2v1z"}))),qu=mt("ZoomOut",T.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"})),fl=T.forwardRef(function({zoomIn:t,onLoseFocus:r},n){const o=T.useRef(!1),a=T.useRef(!1),{zoom:s,minZoom:l,maxZoom:g,zoomIn:h,zoomOut:c,disabled:i}=Go(),{render:u}=tt(),f=i||(t?s>=g:s<=l);return T.useEffect(()=>{f&&o.current&&a.current&&r(),f||(o.current=!0)},[f,r]),T.createElement(Er,{ref:n,disabled:f,label:t?"Zoom in":"Zoom out",icon:t?Xu:qu,renderIcon:t?u.iconZoomIn:u.iconZoomOut,onClick:t?h:c,onFocus:()=>{a.current=!0},onBlur:()=>{a.current=!1}})});function Zu(){const e=T.useRef(null),t=T.useRef(null),{focus:r}=zt(),n=T.useCallback(s=>{var l,g;!((l=s.current)===null||l===void 0)&&l.disabled?r():(g=s.current)===null||g===void 0||g.focus()},[r]),o=T.useCallback(()=>n(e),[n]),a=T.useCallback(()=>n(t),[n]);return T.createElement(T.Fragment,null,T.createElement(fl,{zoomIn:!0,ref:e,onLoseFocus:a}),T.createElement(fl,{ref:t,onLoseFocus:o}))}function Qu(){const{render:e}=tt(),t=Go();return e.buttonZoom?T.createElement(T.Fragment,null,e.buttonZoom(t)):T.createElement(Zu,null)}function Ju(e){var t;return(((t=e.srcSet)===null||t===void 0?void 0:t.length)||0)>0}function Ru({current:e,preload:t},{type:r,source:n}){switch(r){case"fetch":return e?{current:e,preload:n}:{current:n};case"done":return n===t?{current:n}:{current:e,preload:t};default:throw new Error(Ms)}}function ef(e){var t,r;const[{current:n,preload:o},a]=T.useReducer(Ru,{}),{slide:s,rect:l,imageFit:g,render:h,interactive:c}=e,i=s.srcSet.sort((O,_)=>O.width-_.width),u=(t=s.width)!==null&&t!==void 0?t:i[i.length-1].width,f=(r=s.height)!==null&&r!==void 0?r:i[i.length-1].height,p=No(s,g),m=Math.max(...i.map(O=>O.width)),w=Math.min((p?Math.max:Math.min)(l.width,u*(l.height/f)),m),x=Zd(),A=Ie(()=>{var O;const _=(O=i.find(I=>I.width>=w*x))!==null&&O!==void 0?O:i[i.length-1];(!n||i.findIndex(I=>I.src===n)I===_))&&a({type:"fetch",source:_.src})});Ut(A,[l.width,l.height,x,A]);const v=Ie(O=>a({type:"done",source:O})),E={WebkitTransform:c?"initial":"translateZ(0)"};return p||Object.assign(E,l.width/l.heightv(o),render:{...h,iconLoading:()=>null,iconError:()=>null}}),n&&T.createElement(ir,{key:"current",...e,slide:{...s,src:n,srcSet:void 0},style:E}))}function tf({render:e,slide:t,offset:r,rect:n}){var o;const[a,s]=T.useState(),l=T.useRef(null),{zoom:g,maxZoom:h,offsetX:c,offsetY:i,setZoomWrapper:u}=Go(),f=g>1,{carousel:p,on:m}=tt(),{currentIndex:w}=Ot();Ut(()=>r===0?(u({zoomWrapperRef:l,imageDimensions:a}),()=>u(void 0)):()=>{},[r,a,u]);let x=(o=e.slide)===null||o===void 0?void 0:o.call(e,{slide:t,offset:r,rect:n,zoom:g,maxZoom:h});if(!x&&lr(t)){const A={slide:t,offset:r,rect:n,render:e,imageFit:p.imageFit,imageProps:p.imageProps,onClick:r===0?()=>{var v;return(v=m.click)===null||v===void 0?void 0:v.call(m,{index:w})}:void 0};x=Ju(t)?T.createElement(ef,{...A,slide:t,interactive:f,rect:r===0?{width:n.width*g,height:n.height*g}:n}):T.createElement(ir,{onLoad:v=>s({width:v.naturalWidth,height:v.naturalHeight}),...A})}return x?T.createElement("div",{ref:l,className:lt(pe(ws),pe(wr),pe(ks),f&&pe(Bd)),style:r===0?{transform:`scale(${g}) translateX(${c}px) translateY(${i}px)`}:void 0},x):null}const rf=({augment:e,addModule:t})=>{e(({zoom:r,toolbar:n,render:o,controller:a,...s})=>{const l=il(r);return{zoom:l,toolbar:Cn(n,vs,T.createElement(Qu,null)),render:{...o,slide:g=>{var h;return lr(g.slide)?T.createElement(tf,{render:o,...g}):(h=o.slide)===null||h===void 0?void 0:h.call(o,g)}},controller:{...a,preventDefaultWheelY:l.scrollToZoom},...s}}),t(Mt(vs,Yu))},nf={separator:"/",container:{}},gl=e=>({...nf,...e});function of({counter:e}){const{slides:t,currentIndex:r}=Ot(),{separator:n,container:{className:o,...a},className:s,...l}=gl(e);return t.length===0?null:T.createElement("div",{className:lt(pe("counter"),o||s),...l,...a,"aria-hidden":!0},r+1," ",n," ",t.length)}function af({augment:e,addChild:t}){e(({counter:r,...n})=>({counter:gl(r),...n})),t(Wr,Mt(Fd,of))}const sf={autoplay:!1,delay:3e3,ref:null},hl=e=>({...sf,...e}),pl=T.createContext(null),lf=At("useSlideshow","SlideshowContext",pl);function cf({slideshow:e,carousel:{finite:t},on:r,children:n}){const{autoplay:o,delay:a,ref:s}=hl(e),l=T.useRef(o),[g,h]=T.useState(o),c=T.useRef(void 0),i=T.useRef(void 0),{slides:u,currentIndex:f}=Ot(),{setTimeout:p,clearTimeout:m}=Zr(),{subscribe:w}=_r(),{next:x}=zt(),{setAutoPlaying:A}=Lo();T.useEffect(()=>A(g),[g,A]);const v=u.length===0||t&&f===u.length-1,E=T.useCallback(()=>{!g&&!v&&h(!0)},[g,v]),O=T.useCallback(()=>{g&&h(!1)},[g]),_=T.useCallback(()=>{m(c.current),c.current=void 0},[m]),I=Ie(()=>{_(),!(!g||v||i.current===vr||i.current===xo)&&(c.current=p(()=>{g&&(i.current=void 0,x())},a))});T.useEffect(I,[f,g,I]),T.useEffect(()=>{g&&v&&h(!1)},[f,g,v]);const C=Ie(()=>{var M;return(M=r.slideshowStart)===null||M===void 0?void 0:M.call(r)}),y=Ie(()=>{var M;return(M=r.slideshowStop)===null||M===void 0?void 0:M.call(r)});T.useEffect(()=>{g?C():l.current&&y(),l.current=g},[g,C,y]),T.useEffect(()=>kr(_,w($d,()=>{i.current=vr,_()}),w(zd,()=>{i.current=xo,_()}),w(Hd,()=>{i.current=Yr,I()}),w(Gd,()=>{i.current=Xr,I()})),[w,_,I]);const N=T.useMemo(()=>({playing:g,disabled:v,play:E,pause:O}),[g,v,E,O]);return T.useImperativeHandle(s,()=>N,[N]),T.createElement(pl.Provider,{value:N},n)}const df=mt("Play",T.createElement("path",{d:"M8 5v14l11-7z"})),uf=mt("Pause",T.createElement("path",{d:"M6 19h4V5H6v14zm8-14v14h4V5h-4z"}));function ff(){const{playing:e,disabled:t,play:r,pause:n}=lf(),{render:o}=tt(),a=Ys(zt().focus,t);return o.buttonSlideshow?T.createElement(T.Fragment,null,o.buttonSlideshow({playing:e,disabled:t,play:r,pause:n})):T.createElement(Er,{label:e?"Pause":"Play",icon:e?uf:df,renderIcon:e?o.iconSlideshowPause:o.iconSlideshowPlay,onClick:e?n:r,disabled:t,...a})}function gf({augment:e,addModule:t}){e(({slideshow:r,toolbar:n,...o})=>({toolbar:Cn(n,ys,T.createElement(ff,null)),slideshow:hl(r),...o})),t(Mt(ys,cf))}const hf={auto:!1,ref:null},ml=e=>({...hf,...e}),bl=T.createContext(null),pf=At("useFullscreen","FullscreenContext",bl);function mf({fullscreen:e,on:t,children:r}){const{auto:n,ref:o}=ml(e),a=T.useRef(null),[s,l]=T.useState(),[g,h]=T.useState(!1),c=T.useRef(!1),{getOwnerDocument:i}=Sr();Ut(()=>{var v,E,O,_;const I=i();l(!((_=(O=(E=(v=I.fullscreenEnabled)!==null&&v!==void 0?v:I.webkitFullscreenEnabled)!==null&&E!==void 0?E:I.mozFullScreenEnabled)!==null&&O!==void 0?O:I.msFullscreenEnabled)!==null&&_!==void 0&&_))},[i]);const u=T.useCallback(()=>{var v;const E=i(),O=E.fullscreenElement||E.webkitFullscreenElement||E.mozFullScreenElement||E.msFullscreenElement;return((v=O?.shadowRoot)===null||v===void 0?void 0:v.fullscreenElement)||O},[i]),f=T.useCallback(()=>{const v=a.current;try{v.requestFullscreen?v.requestFullscreen().catch(()=>{}):v.webkitRequestFullscreen?v.webkitRequestFullscreen():v.mozRequestFullScreen?v.mozRequestFullScreen():v.msRequestFullscreen&&v.msRequestFullscreen()}catch{}},[]),p=T.useCallback(()=>{if(!u())return;const v=i();try{v.exitFullscreen?v.exitFullscreen().catch(()=>{}):v.webkitExitFullscreen?v.webkitExitFullscreen():v.mozCancelFullScreen?v.mozCancelFullScreen():v.msExitFullscreen&&v.msExitFullscreen()}catch{}},[u,i]);T.useEffect(()=>{const v=i(),E=()=>{h(u()===a.current)};return kr(...["fullscreenchange","webkitfullscreenchange","mozfullscreenchange","MSFullscreenChange"].map(O=>(v.addEventListener(O,E),()=>v.removeEventListener(O,E))))},[u,i]);const m=Ie(()=>{var v;return(v=t.enterFullscreen)===null||v===void 0?void 0:v.call(t)}),w=Ie(()=>{var v;return(v=t.exitFullscreen)===null||v===void 0?void 0:v.call(t)});T.useEffect(()=>{g&&(c.current=!0),c.current&&(g?m:w)()},[g,m,w]);const x=Ie(()=>{var v;return(v=n?f:null)===null||v===void 0||v(),p});T.useEffect(x,[x]);const A=T.useMemo(()=>({fullscreen:g,disabled:s,enter:f,exit:p}),[g,s,f,p]);return T.useImperativeHandle(o,()=>A,[A]),T.createElement("div",{ref:a,className:lt(pe(Kr),pe(ws))},T.createElement(bl.Provider,{value:A},r))}const bf=mt("EnterFullscreen",T.createElement("path",{d:"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"})),yf=mt("ExitFullscreen",T.createElement("path",{d:"M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z"}));function vf(){var e;const{fullscreen:t,disabled:r,enter:n,exit:o}=pf(),{render:a}=tt();return r?null:a.buttonFullscreen?T.createElement(T.Fragment,null,(e=a.buttonFullscreen)===null||e===void 0?void 0:e.call(a,{fullscreen:t,disabled:r,enter:n,exit:o})):T.createElement(Er,{disabled:r,label:t?"Exit Fullscreen":"Enter Fullscreen",icon:t?yf:bf,renderIcon:t?a.iconExitFullscreen:a.iconEnterFullscreen,onClick:t?o:n})}function wf({augment:e,contains:t,addParent:r}){e(({fullscreen:n,toolbar:o,...a})=>({toolbar:Cn(o,Kr,T.createElement(vf,null)),fullscreen:ml(n),...a})),r(t(Vr)?Vr:Wr,Mt(Kr,mf))}const dr={ref:null,position:"bottom",width:120,height:80,border:1,borderRadius:4,padding:4,gap:16,imageFit:"contain",vignette:!0,hidden:!1,showToggle:!1},jo=e=>({...dr,...e});function yl(){const{thumbnails:e}=tt();return jo(e)}const ur=e=>or(Vr,e),rt=e=>ur(or("thumbnail",e)),xf=mt("VideoThumbnail",T.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"})),kf=mt("UnknownThumbnail",T.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"}));function Cf({slide:e,render:t,rect:r,imageFit:n}){var o;const a=(o=t.thumbnail)===null||o===void 0?void 0:o.call(t,{slide:e,render:t,rect:r,imageFit:n});if(a)return a;const s={render:t,rect:r,imageFit:n};if(e.thumbnail)return T.createElement(ir,{slide:{src:e.thumbnail},...s});if(lr(e))return T.createElement(ir,{slide:e,...s});const l=pe(rt(wn));return e.type==="video"?T.createElement(T.Fragment,null,e.poster&&T.createElement(ir,{slide:{src:e.poster},...s}),T.createElement(xf,{className:l})):T.createElement(kf,{className:l})}const Sf=ar("active"),Bo=ar("fadein"),Wo=ar("fadeout"),_f=ar("placeholder"),vl="delay",wl="duration";function Ef({slide:e,index:t,onClick:r,fadeIn:n,fadeOut:o,placeholder:a,onLoseFocus:s}){const l=T.useRef(null),{render:g,styles:h,labels:c}=tt(),{slides:i,globalIndex:u}=Ot(),{getOwnerDocument:f}=Sr(),{width:p,height:m,imageFit:w}=yl(),x={width:p,height:m},A=t===u,v=Ie(s);return T.useEffect(()=>{o&&f().activeElement===l.current&&v()},[o,v,f]),T.createElement("button",{ref:l,type:"button",className:lt(pe(wr),pe(rt()),A&&pe(rt(Sf())),n&&pe(rt(Bo())),o&&pe(rt(Wo())),a&&pe(rt(_f()))),style:{...n?{[We(rt(Bo(wl)))]:`${n.duration}ms`,[We(rt(Bo(vl)))]:`${n.delay}ms`}:null,...o?{[We(rt(Wo(wl)))]:`${o.duration}ms`,[We(rt(Wo(vl)))]:`${o.delay}ms`}:null,...h.thumbnail},onClick:r,"aria-current":A?!0:void 0,"aria-label":Is(c,i,t)},e&&Cf({slide:e,render:g,rect:x,imageFit:w}))}function xl(e){return["top","bottom"].includes(e)}function kl(e,t){return t+2*(e.border+e.padding)+e.gap}function Tf(e){const{thumbnail:t,poster:r}=e||{thumbnail:"placeholder"};return typeof t=="string"&&t||typeof r=="string"&&r||e&&Ds(e)||void 0}function Cl({visible:e,containerRef:t}){const r=T.useRef(null),n=_n(),{publish:o,subscribe:a}=_r(),{carousel:s,styles:l,labels:g}=tt(),{slides:h,globalIndex:c,animation:i}=Ot(),{registerSensors:u,subscribeSensors:f}=Xs();tl(f);const p=yl(),{position:m,width:w,height:x,border:A,borderStyle:v,borderColor:E,borderRadius:O,padding:_,gap:I,vignette:C}=p,y=i?.duration!==void 0&&i?.increment||0,N=i?.duration||0,{prepareAnimation:M}=Fo(r,S=>({keyframes:xl(m)?[{transform:`translateX(${(n?-1:1)*kl(p,w)*y+S}px)`},{transform:"translateX(0)"}]:[{transform:`translateY(${kl(p,x)*y+S}px)`},{transform:"translateY(0)"}],duration:N,easing:i?.easing})),P=Ie(()=>{let S=0;if(t.current&&r.current){const b=t.current.getBoundingClientRect(),U=r.current.getBoundingClientRect();S=xl(m)?U.left-b.left-(b.width-U.width)/2:U.top-b.top-(b.height-U.height)/2}M(S)});T.useEffect(()=>kr(a(Co,P)),[a,P]);const D=Ls(s,h),L=[];if(Mo(h))for(let S=c-D-Math.abs(y);S<=c+D+Math.abs(y);S+=1){const U=s.finite&&(S<0||S>h.length-1)||y<0&&S0&&S>c+D?null:Oo(h,S),F=[`${S}`,Tf(U)].filter(Boolean).join("|");L.push({key:F,index:S,slide:U})}const $=S=>()=>{S>c?o(er,{count:S-c}):S{const F=N/Math.abs(y||1),G=y>0&&b>c+D-y&&b<=c+D||y<0&&b=c-D?{duration:F,delay:((y>0?b-(c+D-y):c-D-y-b)-1)*F}:void 0,Y=y>0&&bc+D?{duration:F,delay:(y>0?y-(c-D-b):-y-(b-(c+D)))*F}:void 0;return T.createElement(Ef,{key:S,index:b,slide:U,fadeIn:G,fadeOut:Y,placeholder:!U,onClick:$(b),onLoseFocus:()=>{var B;return(B=r.current)===null||B===void 0?void 0:B.focus()}})})),C&&T.createElement("div",{className:pe(ur("vignette"))}))}const Sl=T.createContext(null),Nf=At("useThumbnails","ThumbnailsContext",Sl);function Af({children:e,...t}){const{ref:r,position:n,hidden:o}=jo(t.thumbnails),[a,s]=T.useState(!o),l=T.useRef(null),g=T.useMemo(()=>({visible:a,show:()=>s(!0),hide:()=>s(!1)}),[a]);return T.useImperativeHandle(r,()=>g,[g]),T.createElement(Hs,{...t},T.createElement(Sl.Provider,{value:g},T.createElement("div",{ref:l,className:lt(pe(ur()),pe(ur(`${n}`)))},["start","top"].includes(n)&&T.createElement(Cl,{containerRef:l,visible:a}),T.createElement("div",{className:pe(ur("wrapper"))},e),["end","bottom"].includes(n)&&T.createElement(Cl,{containerRef:l,visible:a}))))}const _l=()=>T.createElement(T.Fragment,null,T.createElement("path",{strokeWidth:2,stroke:"currentColor",strokeLinejoin:"round",fill:"none",d:"M3 5l18 0l0 14l-18 0l0-14z"}),T.createElement("path",{d:"M5 14h4v3h-4zM10 14h4v3h-4zM15 14h4v3h-4z"})),Mf=mt("ThumbnailsVisible",_l()),Of=iu("ThumbnailsHidden",_l());function If(){const{visible:e,show:t,hide:r}=Nf(),{render:n}=tt();return n.buttonThumbnails?T.createElement(T.Fragment,null,n.buttonThumbnails({visible:e,show:t,hide:r})):T.createElement(Er,{label:e?"Hide thumbnails":"Show thumbnails",icon:e?Mf:Of,renderIcon:e?n.iconThumbnailsVisible:n.iconThumbnailsHidden,onClick:e?r:t})}function Df({augment:e,contains:t,append:r,addParent:n}){e(({thumbnails:a,toolbar:s,...l})=>{const g=jo(a);return{toolbar:Cn(s,Vr,g.showToggle?T.createElement(If,null):null),thumbnails:g,...l}});const o=Mt(Vr,Af);t(Kr)?r(Kr,o):n(Wr,o)}const Ct=({className:e="",children:t,style:r,...n})=>d.jsx("i",{className:e,style:r,...n,children:t}),Ko=window.G7Core,Tn=(e,t)=>Ko?.t?.(e,t)??e,Lf=async(e,t)=>{try{const r=await Ko.api.get(e,{responseType:"blob"});if(r){const n=URL.createObjectURL(r),o=document.createElement("a");o.href=n,o.download=t,document.body.appendChild(o),o.click(),document.body.removeChild(o),URL.revokeObjectURL(n)}}catch(r){console.error("Failed to download file:",r),Ko?.toast?.error?.(Tn("common.download_failed"))}},Pf=(e,t)=>{const r=document.createElement("a");r.href=e,r.download=t,r.target="_blank",document.body.appendChild(r),r.click(),document.body.removeChild(r)},El=async e=>{const t=e.downloadUrl||e.src,r=e.filename||e.title||"image";e.downloadRequiresAuth?await Lf(t,r):Pf(t,r)},Ff=({image:e,index:t,onDownload:r})=>{const[n,o]=k.useState(!1),a=async s=>{if(s.stopPropagation(),r){r(e,t);return}o(!0);try{await El(e)}finally{o(!1)}};return d.jsx(Q,{type:"button",onClick:a,disabled:n,className:"yarl__button flex items-center justify-center","aria-label":Tn("common.download"),title:Tn("common.download"),children:n?d.jsx(Ct,{className:"fa-solid fa-spinner fa-spin text-white"}):d.jsx(Ct,{className:"fa-solid fa-download text-white"})})},Tr=({images:e,isOpen:t,onClose:r,startIndex:n=0,enableZoom:o=!0,enableSlideshow:a=!1,enableFullscreen:s=!0,showCounter:l=!0,showDownload:g=!0,showThumbnails:h=!0,onDownload:c,editorAttrs:i,id:u})=>{const[f,p]=k.useState(n),m=k.useRef(n),w=e.map(v=>({src:v.src,title:v.title,description:v.description})),x=[];o&&x.push(rf),a&&x.push(gf),s&&x.push(wf),l&&x.push(af),h&&x.push(Df);const A=e[f];if(k.useEffect(()=>{m.current=f},[f]),i){const v=(e??[]).slice(0,4);return d.jsx(W,{id:u,className:"grid grid-cols-2 gap-2 p-3 rounded-lg border border-dashed border-gray-300 dark:border-gray-600 bg-gray-50 dark:bg-gray-800",...i,children:v.length>0?v.map((E,O)=>d.jsx(Lt,{src:E.thumbnail||E.src,alt:E.title||"",className:"w-full aspect-square object-cover rounded bg-gray-200 dark:bg-gray-700"},O)):d.jsxs(W,{className:"col-span-2 flex items-center justify-center py-6 text-sm text-gray-400 dark:text-gray-500",children:[d.jsx(Ct,{className:"fa-regular fa-images mr-2"}),Tn("editor.component.image_gallery")]})})}return d.jsx(zu,{open:t,close:r,slides:w,index:f,plugins:x,on:{view:({index:v})=>{v!==m.current&&p(v)}},zoom:{maxZoomPixelRatio:3,zoomInMultiplier:2,doubleTapDelay:300,doubleClickDelay:300,doubleClickMaxStops:2,keyboardMoveDistance:50,wheelZoomDistanceFactor:100,pinchZoomDistanceFactor:100,scrollToZoom:!0},carousel:{finite:!0,preload:2,padding:"16px",spacing:"30%"},animation:{fade:250,swipe:500,easing:{fade:"ease",swipe:"ease-out",navigation:"ease-in-out"}},controller:{closeOnBackdropClick:!0,closeOnPullDown:!0,closeOnPullUp:!0},thumbnails:{position:"bottom",width:120,height:80,border:2,borderRadius:4,padding:4,gap:16,showToggle:!1,vignette:!0},toolbar:{buttons:[g&&A&&d.jsx(Ff,{image:A,index:f,onDownload:c},"download"),"close"].filter(Boolean)},styles:{container:{backgroundColor:"rgba(0, 0, 0, 0.9)"}}})},Tl=()=>{const[e,t]=k.useState(!1),[r,n]=k.useState([]),[o,a]=k.useState(0),s=k.useCallback((g,h=0)=>{n(g),a(h),t(!0)},[]),l=k.useCallback(()=>{t(!1)},[]);return{isOpen:e,openGallery:s,closeGallery:l,galleryProps:{images:r,isOpen:e,onClose:l,startIndex:o}}};Tr.displayName="ImageGallery";const Nl=Object.freeze(Object.defineProperty({__proto__:null,ImageGallery:Tr,default:Tr,executeImageDownload:El,useImageGallery:Tl},Symbol.toStringTag,{value:"Module"})),Uf=window.G7Core,Vo=(e,t)=>Uf?.t?.(e,t)??e,Nn=e=>e.url??e.download_url,An=({images:e=[],className:t="",id:r,editorAttrs:n})=>{const[o,a]=k.useState(0),{openGallery:s,galleryProps:l}=Tl(),g=k.useMemo(()=>e.map(c=>({src:Nn(c),title:c.alt_text_current??"",thumbnail:Nn(c),downloadUrl:c.download_url,filename:c.alt_text_current??`image-${c.id}`})),[e]);if(!e||e.length===0)return d.jsx(W,{className:`flex items-center justify-center bg-gray-100 dark:bg-gray-700 rounded-lg aspect-square ${t}`,id:r,...n,children:d.jsxs(W,{className:"text-center text-gray-400 dark:text-gray-500",children:[d.jsx(ce,{name:"image",size:"3x",className:"mb-3 opacity-50"}),d.jsx(W,{className:"text-sm",children:Vo("shop.no_image")})]})});const h=e[o]??e[0];return d.jsxs(W,{id:r,className:t,...n,children:[d.jsx(W,{className:"relative overflow-hidden rounded-lg bg-gray-100 dark:bg-gray-700 aspect-square mb-3",children:d.jsx(Q,{type:"button",className:"w-full h-full cursor-zoom-in block",onClick:()=>s(g,o),"aria-label":Vo("shop.view_image"),children:d.jsx(Lt,{src:Nn(h),alt:h.alt_text_current??"",className:"w-full h-full object-contain"})})}),e.length>1&&d.jsx(W,{className:"flex gap-2 overflow-x-auto pb-1",children:e.map((c,i)=>d.jsx(Q,{type:"button",className:`flex-shrink-0 w-16 h-16 rounded-md overflow-hidden border-2 transition-colors cursor-pointer ${i===o?"border-gray-900 dark:border-white":"border-gray-200 dark:border-gray-600 hover:border-gray-400 dark:hover:border-gray-400"}`,onClick:()=>a(i),"aria-label":c.alt_text_current??`${Vo("shop.image")} ${i+1}`,children:d.jsx(Lt,{src:Nn(c),alt:c.alt_text_current??"",className:"w-full h-full object-cover"})},c.id))}),d.jsx(Tr,{...l})]})};An.displayName="ProductImageViewer";const $f=Object.freeze(Object.defineProperty({__proto__:null,ProductImageViewer:An,default:An},Symbol.toStringTag,{value:"Module"})),Al=({value:e,min:t=1,max:r=999,onChange:n,size:o="md",disabled:a=!1,className:s="",id:l,editorAttrs:g})=>{const c={sm:{container:"h-8",button:"w-8 h-8 text-sm",input:"w-10 text-sm"},md:{container:"h-10",button:"w-10 h-10",input:"w-14"},lg:{container:"h-12",button:"w-12 h-12 text-lg",input:"w-16 text-lg"}}[o],i=()=>{e>t&&!a&&n(e-1)},u=()=>{e{const A=parseInt(x.target.value,10);if(!isNaN(A)){const v=Math.max(t,Math.min(r,A));n(v)}},p=x=>{const A=parseInt(x.target.value,10);isNaN(A)||Ar&&n(r)},m=a||e<=t,w=a||e>=r;return d.jsxs(W,{className:`inline-flex items-center border border-gray-300 dark:border-gray-600 rounded-lg ${c.container} ${s}`,id:l,...g,children:[d.jsx(Q,{type:"button",onClick:i,disabled:m,className:`${c.button} flex items-center justify-center text-gray-600 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-50 disabled:cursor-not-allowed rounded-l-lg transition-colors`,"aria-label":"수량 감소",children:d.jsx(ce,{name:"minus",className:"w-4 h-4"})}),d.jsx(xt,{type:"number",value:e,onChange:f,onBlur:p,min:t,max:r,disabled:a,className:`${c.input} text-center border-x border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-800 text-gray-900 dark:text-white focus:outline-none disabled:opacity-50 disabled:cursor-not-allowed [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none`,"aria-label":"수량"}),d.jsx(Q,{type:"button",onClick:u,disabled:w,className:`${c.button} flex items-center justify-center text-gray-600 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-50 disabled:cursor-not-allowed rounded-r-lg transition-colors`,"aria-label":"수량 증가",children:d.jsx(ce,{name:"plus",className:"w-4 h-4"})})]})},zf=Object.freeze(Object.defineProperty({__proto__:null,default:Al},Symbol.toStringTag,{value:"Module"})),Hf=window.G7Core?.createLogger?.("Comp:PostReactions")??{log:(...e)=>console.log("[Comp:PostReactions]",...e),warn:(...e)=>console.warn("[Comp:PostReactions]",...e),error:(...e)=>console.error("[Comp:PostReactions]",...e)},Ml=(e,t)=>window.G7Core?.t?.(e,t)??e,Gf=[{type:"like",emoji:"👍",labelKey:"board.reactions.like",activeColor:"bg-blue-100 dark:bg-blue-900/30 text-blue-600 dark:text-blue-400"},{type:"funny",emoji:"😂",labelKey:"board.reactions.funny",activeColor:"bg-yellow-100 dark:bg-yellow-900/30 text-yellow-600 dark:text-yellow-400"},{type:"agree",emoji:"👌",labelKey:"board.reactions.agree",activeColor:"bg-green-100 dark:bg-green-900/30 text-green-600 dark:text-green-400"},{type:"thanks",emoji:"🙏",labelKey:"board.reactions.thanks",activeColor:"bg-purple-100 dark:bg-purple-900/30 text-purple-600 dark:text-purple-400"},{type:"wow",emoji:"😮",labelKey:"board.reactions.wow",activeColor:"bg-orange-100 dark:bg-orange-900/30 text-orange-600 dark:text-orange-400"}],Ol=({reactions:e,userReaction:t,postId:r,onReact:n,size:o="md",className:a="",id:s,editorAttrs:l})=>{const g={sm:"px-2 py-1 text-xs gap-1",md:"px-3 py-1.5 text-sm gap-1.5",lg:"px-4 py-2 text-base gap-2"},h={sm:"text-sm",md:"text-base",lg:"text-lg"},c=u=>e.find(p=>p.type===u)?.count??0,i=async u=>{if(n){n(u);return}try{if(!(await fetch(`/api/posts/${r}/reactions`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({type:u}),credentials:"include"})).ok)throw new Error("리액션 처리 실패");window.location.reload()}catch(f){Hf.error("리액션 오류:",f)}};return d.jsx(W,{className:`flex flex-wrap gap-2 ${a}`,id:s,...l,children:Gf.map(u=>{const f=c(u.type),p=t===u.type;return d.jsxs(Q,{onClick:()=>i(u.type),className:` + ${f==="dark"?"bg-gray-50 dark:bg-gray-700":""} + `,children:[d.jsx(fe,{name:Re.Moon,className:"w-5 h-5 text-gray-600 dark:text-gray-400"}),d.jsx(re,{className:"flex-1 text-left text-gray-900 dark:text-white",children:o}),f==="dark"&&d.jsx(fe,{name:Re.Check,className:"w-4 h-4 text-blue-600 dark:text-blue-400 ml-auto"})]})]})})]})},sd=Object.freeze(Object.defineProperty({__proto__:null,ThemeToggle:yn,default:yn},Symbol.toStringTag,{value:"Module"})),ts={xs:"w-6 h-6 text-xs",sm:"w-8 h-8 text-sm",md:"w-10 h-10 text-base",lg:"w-12 h-12 text-lg",xl:"w-16 h-16 text-xl","2xl":"w-24 h-24 text-2xl","3xl":"w-32 h-32 text-3xl","4xl":"w-40 h-40 text-4xl","5xl":"w-48 h-48 text-5xl"},ld="rounded-full overflow-hidden flex-shrink-0 border border-gray-200 dark:border-gray-700",id="grayscale opacity-50",ho={normal:"bg-gradient-to-br from-blue-500 to-purple-600",withdrawn:"bg-gray-300 dark:bg-gray-600",guest:"bg-gray-200 dark:bg-gray-700"},Kr=({author:e,name:t,avatar:r,size:n="md",className:o="",text:a,isWithdrawn:s=!1,isGuest:l=!1,id:f,editorAttrs:h})=>{const c=r??e?.avatar,i=a??t??e?.name??"?",u=s||e?.status==="withdrawn",g=l||e?.is_guest||!1,p=C.useMemo(()=>[ts[n]||ts.md,ld,u?id:"",o].filter(Boolean).join(" "),[n,u,o]),m=g?ho.guest:u?ho.withdrawn:ho.normal,v=()=>g?d.jsx(W,{className:`w-full h-full flex items-center justify-center ${m}`,children:d.jsx(fe,{name:"user",className:"text-gray-400 dark:text-gray-500"})}):u?d.jsx(W,{className:`w-full h-full flex items-center justify-center ${m}`,children:d.jsx(fe,{name:"user",className:"text-gray-500 dark:text-gray-400"})}):d.jsx(W,{className:`w-full h-full flex items-center justify-center text-white font-semibold ${m}`,children:i.charAt(0).toUpperCase()});return d.jsx(W,{className:p,id:f,...h,children:c&&!g&&!u?d.jsx(Ht,{src:c,alt:i,className:"w-full h-full object-cover"}):v()})},cd=Object.freeze(Object.defineProperty({__proto__:null,Avatar:Kr},Symbol.toStringTag,{value:"Module"})),dd=window.G7Core?.createLogger?.("Comp:SlotContainer")??{log:(...e)=>console.log("[Comp:SlotContainer]",...e),warn:(...e)=>console.warn("[Comp:SlotContainer]",...e),error:(...e)=>console.error("[Comp:SlotContainer]",...e)};function rs(e,t){return t&&e&&typeof e.id=="string"&&e.id.length>0?{...e,id:`${e.id}__${t}`}:e}const vn=({slotId:e,className:t="",emptyContent:r,style:n,id:o,children:a})=>{const[s,l]=C.useState([]),[,f]=C.useState({}),h=C.useCallback(()=>{const p=window.__slotContextValue;if(p)return p;const m=window.G7Core;return m&&m.getSlotContext?.()||null},[]),c=C.useCallback(()=>{const p=h();p&&p.isEnabled&&l(p.getSlotComponents(e))},[e,h]);C.useEffect(()=>{const p=h();return!p||!p.isEnabled?void 0:(c(),p.subscribeToSlot(e,()=>{c(),f({})}))},[e,h,c]);const i=C.useCallback(()=>{const p=window.G7Core;return p?p.getDynamicRenderer?.():null},[]);if(s.length===0)return r?d.jsx(W,{className:t,style:n,id:o,children:r}):a?d.jsx(W,{className:t,style:n,id:o,children:a}):null;const u=i(),g=window.G7Core;return!u||!g?(dd.error("G7Core or DynamicRenderer not available"),null):d.jsxs(W,{className:t,style:n,id:o,children:[s.map(p=>{const{componentDef:m,dataContext:v,parentFormContext:x,getParentComponentContext:M,translationContext:w}=p,T=rs(m,o);return d.jsx(u,{componentDef:T,dataContext:v,translationContext:w,registry:g.getComponentRegistry(),bindingEngine:g.getDataBindingEngine(),translationEngine:g.getTranslationEngine(),actionDispatcher:g.getActionDispatcher(),parentComponentContext:M?.(),parentFormContextProp:x,isRootRenderer:!1},T.id||`slot-${e}-${p.order}`)}),a]})},ud=Object.freeze(Object.defineProperty({__proto__:null,SlotContainer:vn,default:vn,scopeSlotChildDef:rs},Symbol.toStringTag,{value:"Module"})),wn=({notifications:e=[],unreadCount:t=0,hasMore:r=!1,loading:n=!1,titleText:o="알림",emptyText:a="알림이 없습니다.",markAllReadText:s="모두 읽음",deleteAllText:l="모두 삭제",unreadOnlyText:f="안 읽은 알림만",unreadOnly:h=!1,onNotificationClick:c,onClose:i,onLoadMore:u,onMarkAllRead:g,onDeleteAll:p,onDelete:m,onUnreadOnlyToggle:v,dropdownAlign:x="right",className:M="",id:w,editorAttrs:T})=>{const[A,_]=C.useState(!1),I=C.useRef(null),k=C.useRef(null),y=C.useRef(null),N=C.useRef(null),D=C.useRef(new Set),P=C.useRef(u),O=C.useRef(r),L=C.useRef(n),$=C.useRef(e.length),S=C.useRef(-1);C.useEffect(()=>{P.current=u,O.current=r,L.current=n,$.current=e.length}),C.useEffect(()=>{if(!N.current||!y.current||!A)return;S.current=-1;const G=new IntersectionObserver(([Y])=>{Y.isIntersecting&&(L.current||!O.current||S.current!==$.current&&(S.current=$.current,P.current?.()))},{root:y.current,threshold:.1});return G.observe(N.current),()=>G.disconnect()},[A]),C.useEffect(()=>{if(!y.current||!A)return;const G=new IntersectionObserver(B=>{B.forEach(V=>{const j=V.target.getAttribute("data-notification-id"),H=V.target.getAttribute("data-unread")==="true";j&&H&&V.isIntersecting&&D.current.add(j)})},{root:y.current,threshold:.5});return y.current.querySelectorAll("[data-notification-id]").forEach(B=>G.observe(B)),()=>G.disconnect()},[A,e]);const b=t>0?t:e.filter(G=>!G.read).length,z=C.useCallback(()=>{if(A){if(b>0){const G=Array.from(D.current).filter(Y=>{const B=e.find(V=>String(V.id)===String(Y));return B&&!B.read});G.length>0&&i?.(G)}D.current.clear(),_(!1)}},[A,i,b,e]);C.useEffect(()=>{if(!A)return;const G=Y=>{I.current&&!I.current.contains(Y.target)&&z()};return document.addEventListener("mousedown",G),()=>document.removeEventListener("mousedown",G)},[A,z]);const U=C.useCallback(()=>{A?z():_(!0)},[A,z]);return C.useLayoutEffect(()=>{const G=k.current;if(!A||!G)return;G.style.transform="";const Y=G.getBoundingClientRect(),B=typeof window<"u"?window.innerWidth:0;if(Y.width===0&&Y.height===0)return;const V=8;let j=0;Y.right>B-V?j=-(Y.right-(B-V)):Y.left0&&d.jsx(re,{className:"absolute -top-1 -right-1 w-5 h-5 flex items-center justify-center text-xs font-bold text-white bg-red-500 dark:bg-red-600 rounded-full",children:b>99?"99+":b})]}),A&&d.jsxs(W,{ref:k,className:`absolute ${x==="left"?"left-0":"right-0"} mt-2 w-80 max-w-[calc(100vw-1rem)] bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-lg z-50`,children:[d.jsxs(W,{className:"px-4 py-3 border-b border-gray-200 dark:border-gray-700 flex items-center justify-between gap-2",children:[d.jsxs(W,{className:"flex items-center gap-3 min-w-0",children:[d.jsx(re,{className:"font-semibold text-gray-900 dark:text-white",children:o}),v&&d.jsxs(W,{className:"flex items-center gap-1.5 cursor-pointer select-none",onClick:()=>v(!h),children:[d.jsx(_t,{type:"checkbox",checked:h,onChange:G=>{G.stopPropagation(),v(G.target.checked)},onClick:G=>G.stopPropagation(),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"}),d.jsx(re,{className:"text-xs text-gray-600 dark:text-gray-400",children:f})]})]}),d.jsxs(W,{className:"flex items-center gap-3 flex-shrink-0",children:[g&&b>0&&d.jsx(Q,{onClick:()=>{g(),D.current.clear()},className:"text-xs text-blue-600 dark:text-blue-400 hover:text-blue-800 dark:hover:text-blue-300 hover:underline cursor-pointer",children:s}),p&&e.length>0&&d.jsx(Q,{onClick:()=>{p()},className:"text-xs text-red-600 dark:text-red-400 hover:text-red-800 dark:hover:text-red-300 hover:underline cursor-pointer",children:l})]})]}),d.jsx(W,{ref:y,className:"max-h-96 overflow-y-auto",children:e.length===0&&!n?d.jsx(W,{className:"px-4 py-8 text-center text-gray-500 dark:text-gray-400",children:d.jsx(re,{children:a})}):d.jsxs(d.Fragment,{children:[e.map(G=>{const Y=!G.read;return d.jsxs(W,{"data-notification-id":G.id,"data-unread":Y?"true":"false",onClick:()=>{G.onClick?.(),c?.(G),_(!1)},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 ${Y?"bg-blue-50/70 dark:bg-blue-900/20 hover:bg-blue-50 dark:hover:bg-blue-900/30":"bg-white dark:bg-gray-800 hover:bg-gray-50 dark:hover:bg-gray-700/50 opacity-70"}`,children:[G.iconName&&d.jsx(fe,{name:G.iconName,className:`w-5 h-5 mt-0.5 flex-shrink-0 ${Y?"text-blue-600 dark:text-blue-400":"text-gray-400 dark:text-gray-500"}`}),d.jsxs(W,{className:"flex-1 min-w-0",children:[d.jsx(W,{className:`text-sm truncate ${Y?"font-semibold text-gray-900 dark:text-white":"font-normal text-gray-600 dark:text-gray-400"}`,children:G.title}),d.jsx(W,{className:`text-sm mt-1 line-clamp-2 ${Y?"text-gray-700 dark:text-gray-300":"text-gray-500 dark:text-gray-500"}`,children:G.message}),d.jsx(W,{className:"text-gray-400 dark:text-gray-500 text-xs mt-1 font-mono",children:G.time})]}),d.jsxs(W,{className:"flex flex-col items-center gap-2 flex-shrink-0",children:[Y&&d.jsx(re,{className:"w-2 h-2 bg-blue-500 dark:bg-blue-400 rounded-full mt-1.5"}),m&&d.jsx(Q,{onClick:B=>{B.stopPropagation(),m(G)},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","aria-label":"Delete notification",children:d.jsx(fe,{name:Re.Trash,className:"w-4 h-4"})})]})]},G.id)}),r&&d.jsx(W,{ref:N,className:"px-4 py-3 text-center",children:n?d.jsx(re,{className:"text-sm text-gray-400 dark:text-gray-500",children:"..."}):d.jsx(re,{className:"text-sm text-gray-400 dark:text-gray-500"})}),n&&!r&&e.length>0&&d.jsx(W,{className:"px-4 py-2 text-center",children:d.jsx(re,{className:"text-sm text-gray-400 dark:text-gray-500",children:"..."})})]})})]})]})},fd=Object.freeze(Object.defineProperty({__proto__:null,NotificationCenter:wn,default:wn},Symbol.toStringTag,{value:"Module"})),Xe=(e,t)=>window.G7Core?.t?.(e,t)??e,bt=e=>{window.G7Core?.dispatch?.({handler:"navigate",params:{path:e}})},ns=({logo:e,siteName:t="그누보드7",user:r,cartCount:n=0,notificationCount:o=0,boards:a=[],maxVisibleBoards:s=5,onMobileMenuOpen:l,availableLocales:f=[],currentLocale:h="ko",shopBase:c="/shop",className:i="",editorAttrs:u,notifications:g=[],notificationHasMore:p=!1,notificationLoading:m=!1,notificationUnreadOnly:v=!1,notificationTitleText:x,notificationEmptyText:M,notificationMarkAllReadText:w,notificationDeleteAllText:T,notificationUnreadOnlyText:A,onNotificationClose:_,onNotificationClick:I,onNotificationLoadMore:k,onNotificationMarkAllRead:y,onNotificationDeleteAll:N,onNotificationDelete:D,onNotificationUnreadOnlyToggle:P})=>{const[O,L]=C.useState(""),[$,S]=C.useState(!1),[b,z]=C.useState(!1),[U,G]=C.useState(!1),[Y,B]=C.useState({top:0,left:0}),[V,j]=C.useState(window.location.pathname),H=C.useRef(null),q=C.useRef(null),ee=C.useRef(null),ce=window.G7Core?.useResponsive,R=ce?.(),_e=R?R.width<768:typeof window<"u"&&window.innerWidth<768;C.useEffect(()=>{const K=()=>j(window.location.pathname);window.addEventListener("popstate",K);const te=history.pushState;return history.pushState=function(...oe){te.apply(this,oe),j(window.location.pathname)},()=>{window.removeEventListener("popstate",K),history.pushState=te}},[]);const me=(K,te=!1)=>te?V===K:V===K||V.startsWith(K+"/"),Be=()=>{const K=c==="/"?"":c;return V.startsWith(`${K}/products`)||V.startsWith(`${K}/cart`)||V.startsWith(`${K}/checkout`)||V.startsWith(`${K}/category`)},$e=K=>{const te="px-3 py-2 text-sm font-medium whitespace-nowrap cursor-pointer rounded-lg transition-colors";return K?`${te} bg-gray-900 text-white dark:bg-white dark:text-gray-900`:`${te} text-gray-700 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white hover:bg-gray-100 dark:hover:bg-gray-800`};C.useEffect(()=>{const K=te=>{H.current&&!H.current.contains(te.target)&&S(!1),q.current&&!q.current.contains(te.target)&&z(!1),ee.current&&!ee.current.contains(te.target)&&G(!1)};return document.addEventListener("mousedown",K),()=>document.removeEventListener("mousedown",K)},[]);const ye=a.slice(0,s),Ne=a.slice(s),we=K=>{K.preventDefault(),O.trim()&&bt(`/search?q=${encodeURIComponent(O)}`)},ke=async()=>{window.G7Core?.dispatch?.({handler:"logout"})},Ue=K=>{window.G7Core?.dispatch?.({handler:"setLocale",target:K}),G(!1)},Oe=K=>window.G7Core?.state?.get?.("_global.appConfig.localeNames")?.[K]??(K==="ko"?"한국어":K==="en"?"English":K==="ja"?"日本語":K==="zh"?"中文":K==="es"?"Español":K==="fr"?"Français":K==="de"?"Deutsch":K.toUpperCase());return d.jsxs(od,{...u??{},className:`sticky top-0 z-50 bg-white dark:bg-gray-900 border-b border-gray-200 dark:border-gray-800 ${i}`,children:[d.jsx(W,{className:"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8",children:d.jsxs(W,{className:"flex items-center justify-between h-16",children:[d.jsx(Q,{onClick:()=>bt("/"),className:"flex items-center gap-2 flex-shrink-0 cursor-pointer",children:e?d.jsx(Ht,{src:e,alt:t,className:"h-8"}):d.jsx(re,{className:"text-xl font-bold text-gray-900 dark:text-white",children:t})}),!_e&&d.jsx(uo,{onSubmit:we,className:"flex flex-1 max-w-lg mx-8",children:d.jsxs(W,{className:"relative w-full",children:[d.jsx(_t,{type:"text",value:O,onChange:K=>L(K.target.value),placeholder:Xe("common.search_placeholder"),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"}),d.jsx(fe,{name:"search",className:"absolute left-3 top-1/2 -translate-y-1/2 w-4 h-4 text-gray-400 dark:text-gray-500"})]})}),d.jsxs(W,{className:"flex items-center gap-2",children:[d.jsx(yn,{autoText:Xe("common.theme.auto"),lightText:Xe("common.theme.light"),darkText:Xe("common.theme.dark")}),r?.uuid&&d.jsx(wn,{notifications:g,unreadCount:o,hasMore:p,loading:m,unreadOnly:v,titleText:x??Xe("mypage.notifications.title"),emptyText:M??Xe("mypage.notifications.empty"),markAllReadText:w??Xe("mypage.notifications.mark_all_read"),deleteAllText:T??Xe("mypage.notifications.delete_all"),unreadOnlyText:A??Xe("mypage.notifications.unread_only"),onClose:_,onNotificationClick:I,onLoadMore:k,onMarkAllRead:y,onDeleteAll:N,onDelete:D,onUnreadOnlyToggle:P,dropdownAlign:"right"}),d.jsxs(Q,{onClick:()=>bt(`${c}/cart`),className:"relative p-2 text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white cursor-pointer",children:[d.jsx(fe,{name:"shopping-cart",className:"w-5 h-5"}),n>0&&d.jsx(re,{className:"absolute -top-1 -right-1 w-5 h-5 flex items-center justify-center text-xs bg-blue-500 text-white rounded-full",children:n>99?"99+":n})]}),f&&f.length>1&&d.jsxs(W,{ref:ee,className:"relative",children:[d.jsxs(Q,{onClick:()=>G(!U),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","aria-haspopup":"listbox","aria-expanded":U,"aria-label":Xe("common.language"),children:[d.jsx(fe,{name:"globe",className:"w-4 h-4"}),d.jsx(re,{className:"font-medium uppercase",children:h}),d.jsx(fe,{name:"chevron-down",className:"w-3 h-3"})]}),U&&d.jsx(W,{role:"listbox",className:"absolute right-0 mt-2 w-44 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-lg py-1 z-50 overflow-hidden",children:f.map(K=>{const te=K===h;return d.jsxs(Q,{role:"option","aria-selected":te,onClick:()=>Ue(K),className:`w-full px-4 py-2.5 text-left text-sm flex items-center gap-3 cursor-pointer transition-colors ${te?"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"}`,children:[d.jsx(fe,{name:"globe",className:"w-4 h-4"}),d.jsx(re,{className:"flex-1 font-medium",children:Oe(K)}),te&&d.jsx(fe,{name:"check",className:"w-4 h-4"})]},K)})})]}),d.jsx(vn,{slotId:"header_currency",id:"header_currency_slot_desktop",className:"flex items-center"}),r?.uuid?d.jsxs(W,{ref:H,className:"relative",children:[d.jsxs(Q,{onClick:()=>S(!$),className:"flex items-center gap-2 p-2 text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white",children:[d.jsx(Kr,{avatar:r.avatar,name:r.name,size:"sm"}),d.jsx(re,{className:"hidden sm:inline text-sm font-medium",children:r.name}),d.jsx(fe,{name:"chevron-down",className:"w-4 h-4"})]}),$&&d.jsxs(W,{className:"absolute right-0 mt-2 w-56 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-lg py-1 z-50",children:[d.jsx(W,{className:"px-4 py-3 border-b border-gray-200 dark:border-gray-700",children:d.jsxs(W,{className:"flex items-center gap-3",children:[d.jsx(Kr,{avatar:r.avatar,name:r.name,size:"md"}),d.jsxs(W,{children:[d.jsx(W,{className:"text-sm font-medium text-gray-900 dark:text-white",children:r.name}),d.jsx(W,{className:"text-xs text-gray-500 dark:text-gray-400",children:Xe("common.member")})]})]})}),d.jsxs(W,{className:"py-1",children:[r.is_admin&&d.jsxs(d.Fragment,{children:[d.jsxs(co,{href:"/admin",className:"block w-full text-left px-4 py-2 text-sm text-blue-600 dark:text-blue-400 hover:bg-gray-100 dark:hover:bg-gray-700 cursor-pointer font-medium",children:[d.jsx(fe,{name:"settings",className:"inline w-4 h-4 mr-2"}),Xe("common.admin_menu")]}),d.jsx(fo,{className:"my-1 border-gray-200 dark:border-gray-700"})]}),d.jsxs(Q,{onClick:()=>{bt("/mypage"),S(!1)},className:"block w-full text-left px-4 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 cursor-pointer",children:[d.jsx(fe,{name:"user",className:"inline w-4 h-4 mr-2"}),Xe("common.mypage")]}),d.jsxs(Q,{onClick:()=>{bt("/mypage/orders"),S(!1)},className:"block w-full text-left px-4 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 cursor-pointer",children:[d.jsx(fe,{name:"shopping-bag",className:"inline w-4 h-4 mr-2"}),Xe("mypage.tabs.orders")]}),d.jsxs(Q,{onClick:()=>{bt("/mypage/wishlist"),S(!1)},className:"block w-full text-left px-4 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 cursor-pointer",children:[d.jsx(fe,{name:"heart",className:"inline w-4 h-4 mr-2"}),Xe("mypage.tabs.wishlist")]})]}),d.jsx(fo,{className:"my-1 border-gray-200 dark:border-gray-700"}),d.jsxs(Q,{onClick:ke,className:"block w-full text-left px-4 py-2 text-sm text-red-600 dark:text-red-400 hover:bg-gray-100 dark:hover:bg-gray-700 cursor-pointer",children:[d.jsx(fe,{name:"log-out",className:"inline w-4 h-4 mr-2"}),Xe("auth.logout")]})]})]}):d.jsxs(W,{className:"flex items-center gap-1.5",children:[d.jsx(Q,{onClick:()=>bt("/login?redirect=/mypage/orders"),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",children:Xe("shop.guest_order_form.nav_link")}),d.jsx(Q,{onClick:()=>bt("/login"),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",children:Xe("auth.login")}),d.jsx(Q,{onClick:()=>bt("/register"),className:"ml-1 px-3 py-2 text-sm font-medium text-white bg-emerald-500 rounded-lg hover:bg-emerald-600 cursor-pointer",children:Xe("auth.register_link")})]}),_e&&d.jsx(Q,{onClick:l,className:"p-2 text-gray-600 dark:text-gray-400",children:d.jsx(fe,{name:"menu",className:"w-6 h-6"})})]})]})}),!_e&&d.jsx(Wr,{className:"border-t border-gray-200 dark:border-gray-800",children:d.jsx(W,{className:"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8",children:d.jsxs(W,{className:"flex items-center gap-1 h-12 overflow-x-auto",children:[d.jsx(Q,{onClick:()=>bt("/"),className:$e(me("/",!0)),"data-testid":"nav-home",children:Xe("nav.home")}),d.jsxs(Q,{onClick:()=>bt("/boards/popular"),className:`flex items-center gap-1 ${$e(me("/boards/popular"))}`,"data-testid":"nav-popular",children:[d.jsx(re,{className:"text-orange-500",children:"🔥"}),Xe("nav.popular")]}),d.jsxs(Q,{onClick:()=>bt(`${c==="/"?"":c}/products`),className:`flex items-center gap-1 ${$e(Be())}`,"data-testid":"nav-shop",children:[d.jsx(re,{children:"🛒"}),Xe("nav.shop")]}),ye.map(K=>d.jsxs(Q,{onClick:()=>bt(`/board/${K.slug}`),className:$e(me(`/board/${K.slug}`)),children:[K.icon&&d.jsx(re,{className:"mr-1",children:K.icon}),K.name]},K.id)),Ne.length>0&&d.jsxs(W,{ref:q,className:"relative",children:[d.jsxs(Q,{onClick:()=>{if(!b&&q.current){const K=q.current.getBoundingClientRect();B({top:K.bottom+4,left:K.left})}z(!b)},className:"flex items-center gap-1 px-3 py-2 text-sm font-medium text-gray-700 dark:text-gray-300 hover:text-gray-900 dark:hover:text-white",children:[Xe("nav.more"),d.jsx(fe,{name:"chevron-down",className:"w-4 h-4"})]}),b&&d.jsx(W,{className:"fixed w-48 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-lg py-1 z-50",style:{top:`${Y.top}px`,left:`${Y.left}px`},children:Ne.map(K=>{const te=me(`/board/${K.slug}`);return d.jsxs(Q,{onClick:()=>{bt(`/board/${K.slug}`),z(!1)},className:`block w-full text-left px-4 py-2 text-sm cursor-pointer ${te?"bg-gray-900 text-white dark:bg-white dark:text-gray-900":"text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700"}`,children:[K.icon&&d.jsx(re,{className:"mr-1",children:K.icon}),K.name]},K.id)})})]})]})})})]})},gd=Object.freeze(Object.defineProperty({__proto__:null,default:ns},Symbol.toStringTag,{value:"Module"})),hd=C.forwardRef(({children:e,className:t="",...r},n)=>d.jsx("footer",{ref:n,className:t,...r,children:e})),Et=(e,t)=>window.G7Core?.t?.(e,t)??e,pd=768,os=1024,md=e=>{window.G7Core?.dispatch?.({handler:"navigate",params:{path:e}})},as=({siteName:e="그누보드7",siteDescription:t,copyrightText:r,socialLinks:n={},linkGroups:o,className:a="",editorAttrs:s})=>{const l=new Date().getFullYear(),h=window.G7Core?.useResponsive,i=h?.()?.width??(typeof window<"u"?window.innerWidth:os),u=i=os,p=u?1:g?5:2,m=[{title:Et("footer.community"),links:[{label:Et("nav.home"),href:"/"},{label:Et("nav.popular"),href:"/boards/popular"},{label:Et("footer.all_boards"),href:"/boards"}]},{title:Et("footer.info"),links:[{label:Et("footer.about"),href:"/page/about"},{label:Et("footer.faq"),href:"/page/faq"},{label:Et("footer.contact"),href:"/page/contact"}]},{title:Et("footer.policy"),links:[{label:Et("footer.terms"),href:"/page/terms"},{label:Et("footer.privacy"),href:"/page/privacy"},{label:Et("footer.refund"),href:"/page/refund"}]}],v=o||m,x={github:"github",twitter:"twitter",discord:"discord",facebook:"facebook",instagram:"instagram"};return d.jsx(hd,{...s??{},className:`bg-gray-50 dark:bg-gray-900 border-t border-gray-200 dark:border-gray-800 ${a}`,children:d.jsxs(W,{className:"max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12",children:[d.jsxs(W,{className:"grid gap-8",style:{gridTemplateColumns:`repeat(${p}, minmax(0, 1fr))`},children:[d.jsxs(W,{style:g?{gridColumn:"span 2 / span 2"}:void 0,children:[d.jsx(bn,{className:"text-lg font-bold text-gray-900 dark:text-white",children:e}),t&&d.jsx(zt,{className:"mt-2 text-sm text-gray-600 dark:text-gray-400",children:t}),d.jsx(W,{className:"mt-4 flex items-center gap-4",children:Object.entries(n).map(([M,w])=>w?d.jsx(co,{href:w,target:"_blank",rel:"noopener noreferrer",className:"text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200","aria-label":M,children:d.jsx(fe,{name:x[M],className:"w-5 h-5"})},M):null)})]}),v.map((M,w)=>d.jsxs(W,{children:[d.jsx(qa,{className:"text-sm font-semibold text-gray-900 dark:text-white uppercase tracking-wider",children:M.title}),d.jsx(io,{className:"mt-4 space-y-2",children:M.links.map((T,A)=>d.jsx(Qt,{children:d.jsx(Q,{onClick:()=>md(T.href),className:"text-sm text-gray-600 dark:text-gray-400 hover:text-gray-900 dark:hover:text-white cursor-pointer",children:T.label})},A))})]},w))]}),d.jsxs(W,{className:"mt-8 pt-8 border-t border-gray-200 dark:border-gray-800 flex justify-between items-center gap-4",style:{flexDirection:u?"column":"row"},children:[d.jsx(zt,{className:"text-sm text-gray-500 dark:text-gray-400",children:r||`© ${l} ${e}. All rights reserved.`}),d.jsx(zt,{className:"text-sm text-gray-500 dark:text-gray-400",children:Et("footer.powered_by")})]})]})})},bd=Object.freeze(Object.defineProperty({__proto__:null,default:as},Symbol.toStringTag,{value:"Module"})),Gt=(e,t)=>window.G7Core?.t?.(e,t)??e,It=e=>{window.G7Core?.dispatch?.({handler:"navigate",params:{path:e}})},ss=({isOpen:e,onClose:t,logo:r,siteName:n="그누보드7",user:o,boards:a=[],cartCount:s=0})=>{const l=C.useRef(null),h=window.G7Core?.useResponsive,c=h?.(),i=c?c.width<1024:typeof window<"u"&&window.innerWidth<1024;C.useEffect(()=>{const g=p=>{p.key==="Escape"&&t()};return e&&(document.addEventListener("keydown",g),document.body.style.overflow="hidden"),()=>{document.removeEventListener("keydown",g),document.body.style.overflow=""}},[e,t]);const u=g=>{g.target===g.currentTarget&&t()};return!e||!i?null:d.jsxs(W,{className:"fixed inset-0 z-50",onClick:u,children:[d.jsx(W,{className:"fixed inset-0 bg-black/50 transition-opacity"}),d.jsxs(W,{ref:l,className:`fixed inset-y-0 left-0 w-80 max-w-[85vw] bg-white dark:bg-gray-900 shadow-xl transform transition-transform duration-300 ${e?"translate-x-0":"-translate-x-full"}`,children:[d.jsxs(W,{className:"flex items-center justify-between p-4 border-b border-gray-200 dark:border-gray-800",children:[d.jsx(Q,{onClick:()=>{t(),It("/")},className:"flex items-center gap-2 cursor-pointer",children:r?d.jsx(Ht,{src:r,alt:n,className:"h-8"}):d.jsx(re,{className:"text-xl font-bold text-gray-900 dark:text-white",children:n})}),d.jsx(Q,{onClick:t,className:"p-2 text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200","aria-label":"메뉴 닫기",children:d.jsx(fe,{name:"x",className:"w-6 h-6"})})]}),o?d.jsx(W,{className:"p-4 border-b border-gray-200 dark:border-gray-800",children:d.jsxs(W,{className:"flex items-center gap-3",children:[o.avatar?d.jsx(Ht,{src:o.avatar,alt:o.name,className:"w-12 h-12 rounded-full"}):d.jsx(W,{className:"w-12 h-12 rounded-full bg-blue-500 flex items-center justify-center text-white text-lg font-medium",children:(o.name||"U").charAt(0).toUpperCase()}),d.jsxs(W,{children:[d.jsx(zt,{className:"font-medium text-gray-900 dark:text-white",children:o.name}),d.jsx(Q,{onClick:()=>{t(),It("/mypage")},className:"text-sm text-blue-600 dark:text-blue-400 hover:underline cursor-pointer",children:Gt("common.mypage")})]})]})}):d.jsx(W,{className:"p-4 border-b border-gray-200 dark:border-gray-800",children:d.jsxs(W,{className:"flex gap-2",children:[d.jsx(Q,{onClick:()=>{t(),It("/login")},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",children:Gt("auth.login")}),d.jsx(Q,{onClick:()=>{t(),It("/register")},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",children:Gt("auth.register")})]})}),d.jsx(Wr,{className:"p-4 overflow-y-auto max-h-[calc(100vh-200px)]",children:d.jsxs(io,{className:"space-y-1",children:[d.jsx(Qt,{children:d.jsxs(Q,{onClick:()=>{t(),It("/")},className:"flex items-center gap-3 px-3 py-2 w-full text-left text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-lg cursor-pointer",children:[d.jsx(fe,{name:"home",className:"w-5 h-5"}),Gt("nav.home")]})}),d.jsx(Qt,{children:d.jsxs(Q,{onClick:()=>{t(),It("/popular")},className:"flex items-center gap-3 px-3 py-2 w-full text-left text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-lg cursor-pointer",children:[d.jsx(re,{className:"text-orange-500",children:"🔥"}),Gt("nav.popular")]})}),d.jsx(Qt,{children:d.jsxs(Q,{onClick:()=>{t(),It("/shop")},className:"flex items-center gap-3 px-3 py-2 w-full text-left text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-lg cursor-pointer",children:[d.jsx(re,{children:"🛒"}),Gt("nav.shop")]})}),d.jsx(Qt,{children:d.jsxs(Q,{onClick:()=>{t(),It("/cart")},className:"flex items-center gap-3 px-3 py-2 w-full text-left text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-lg cursor-pointer",children:[d.jsx(fe,{name:"shopping-cart",className:"w-5 h-5"}),Gt("nav.cart"),s>0&&d.jsx(re,{className:"ml-auto px-2 py-0.5 text-xs bg-blue-500 text-white rounded-full",children:s})]})}),d.jsx(Qt,{className:"my-4 border-t border-gray-200 dark:border-gray-800"}),d.jsx(Qt,{className:"px-3 py-2 text-xs font-semibold text-gray-500 dark:text-gray-400 uppercase tracking-wider",children:Gt("nav.boards")}),a.map(g=>d.jsx(Qt,{children:d.jsxs(Q,{onClick:()=>{t(),It(`/board/${g.slug}`)},className:"flex items-center gap-3 px-3 py-2 w-full text-left text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-800 rounded-lg cursor-pointer",children:[g.icon&&d.jsx(re,{children:g.icon}),g.name]})},g.id))]})}),d.jsx(W,{className:"absolute bottom-0 left-0 right-0 p-4 border-t border-gray-200 dark:border-gray-800 bg-white dark:bg-gray-900",children:d.jsxs(W,{className:"flex items-center justify-between text-sm text-gray-500 dark:text-gray-400",children:[d.jsx(Q,{onClick:()=>{t(),It("/about")},className:"hover:text-gray-700 dark:hover:text-gray-200 cursor-pointer",children:Gt("footer.about")}),d.jsx(Q,{onClick:()=>{t(),It("/terms")},className:"hover:text-gray-700 dark:hover:text-gray-200 cursor-pointer",children:Gt("footer.terms")}),d.jsx(Q,{onClick:()=>{t(),It("/privacy")},className:"hover:text-gray-700 dark:hover:text-gray-200 cursor-pointer",children:Gt("footer.privacy")})]})})]})]})},yd=Object.freeze(Object.defineProperty({__proto__:null,default:ss},Symbol.toStringTag,{value:"Module"}));function ls(e,t){(t==null||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r2?n-2:0),a=2;a1?r-1:0),o=1;o"u"?null:qe(BigInt.prototype.toString),ps=typeof Symbol>"u"?null:qe(Symbol.prototype.toString),Ze=qe(Object.prototype.hasOwnProperty),Yr=qe(Object.prototype.toString),dt=qe(RegExp.prototype.test),xn=Id(TypeError);function qe(e){return function(t){t instanceof RegExp&&(t.lastIndex=0);for(var r=arguments.length,n=new Array(r>1?r-1:0),o=1;o2&&arguments[2]!==void 0?arguments[2]:Vr;if(cs&&cs(e,null),!mt(t))return e;let n=t.length;for(;n--;){let o=t[n];if(typeof o=="string"){const a=r(o);a!==o&&(Sd(t)||(t[n]=a),o=a)}e[o]=!0}return e}function Dd(e){for(let t=0;t/g),Hd=Dt(/\${[\w\W]*/g),Gd=Dt(/^data-[\-\w.\u00B7-\uFFFF]+$/),jd=Dt(/^aria-[\-\w]+$/),ws=Dt(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),Bd=Dt(/^(?:\w+script|data):/i),Wd=Dt(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),Kd=Dt(/^html$/i),Vd=Dt(/^[a-z][.\w]*(-[.\w]+)+$/i),_r={element:1,text:3,progressingInstruction:7,comment:8,document:9},Yd=function(){return typeof window>"u"?null:window},Xd=function(t,r){if(typeof t!="object"||typeof t.createPolicy!="function")return null;let n=null;const o="data-tt-policy-suffix";r&&r.hasAttribute(o)&&(n=r.getAttribute(o));const a="dompurify"+(n?"#"+n:"");try{return t.createPolicy(a,{createHTML(s){return s},createScriptURL(s){return s}})}catch{return console.warn("TrustedTypes policy "+a+" could not be created."),null}},xs=function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}};function ks(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:Yd();const t=he=>ks(he);if(t.version="3.4.3",t.removed=[],!e||!e.document||e.document.nodeType!==_r.document||!e.Element)return t.isSupported=!1,t;let r=e.document;const n=r,o=n.currentScript,a=e.DocumentFragment,s=e.HTMLTemplateElement,l=e.Node,f=e.Element,h=e.NodeFilter,c=e.NamedNodeMap,i=c===void 0?e.NamedNodeMap||e.MozNamedAttrMap:c,u=e.HTMLFormElement,g=e.DOMParser,p=e.trustedTypes,m=f.prototype,v=Sr(m,"cloneNode"),x=Sr(m,"remove"),M=Sr(m,"nextSibling"),w=Sr(m,"childNodes"),T=Sr(m,"parentNode");if(typeof s=="function"){const he=r.createElement("template");he.content&&he.content.ownerDocument&&(r=he.content.ownerDocument)}let A,_="";const I=r,k=I.implementation,y=I.createNodeIterator,N=I.createDocumentFragment,D=I.getElementsByTagName,P=n.importNode;let O=xs();t.isSupported=typeof is=="function"&&typeof T=="function"&&k&&k.createHTMLDocument!==void 0;const L=Ud,$=zd,S=Hd,b=Gd,z=jd,U=Bd,G=Wd,Y=Vd;let B=ws,V=null;const j=Ee({},[...ms,...yo,...vo,...wo,...bs]);let H=null;const q=Ee({},[...ys,...xo,...vs,...kn]);let ee=Object.seal(wr(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),ne=null,ce=null;const R=Object.seal(wr(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}}));let _e=!0,me=!0,Be=!1,$e=!0,ye=!1,Ne=!0,we=!1,ke=!1,Ue=!1,Oe=!1,K=!1,te=!1,oe=!0,le=!1;const ve="user-content-";let Te=!0,We=!1,Ae={},He=null;const Ie=Ee({},["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"]);let X=null;const se=Ee({},["audio","video","img","source","image","track"]);let de=null;const ue=Ee({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),ie="http://www.w3.org/1998/Math/MathML",De="http://www.w3.org/2000/svg",ge="http://www.w3.org/1999/xhtml";let xe=ge,Ce=!1,ze=null;const Ke=Ee({},[ie,De,ge],bo);let Se=Ee({},["mi","mo","mn","ms","mtext"]),be=Ee({},["annotation-xml"]);const Me=Ee({},["title","style","font","a","script"]);let je=null;const rt=["application/xhtml+xml","text/html"],Ye="text/html";let Pe=null,Mt=null;const nt=r.createElement("form"),Yt=function(F){return F instanceof RegExp||F instanceof Function},Ct=function(){let F=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(Mt&&Mt===F)return;(!F||typeof F!="object")&&(F={}),F=yt(F),je=rt.indexOf(F.PARSER_MEDIA_TYPE)===-1?Ye:F.PARSER_MEDIA_TYPE,Pe=je==="application/xhtml+xml"?bo:Vr,V=Ze(F,"ALLOWED_TAGS")&&mt(F.ALLOWED_TAGS)?Ee({},F.ALLOWED_TAGS,Pe):j,H=Ze(F,"ALLOWED_ATTR")&&mt(F.ALLOWED_ATTR)?Ee({},F.ALLOWED_ATTR,Pe):q,ze=Ze(F,"ALLOWED_NAMESPACES")&&mt(F.ALLOWED_NAMESPACES)?Ee({},F.ALLOWED_NAMESPACES,bo):Ke,de=Ze(F,"ADD_URI_SAFE_ATTR")&&mt(F.ADD_URI_SAFE_ATTR)?Ee(yt(ue),F.ADD_URI_SAFE_ATTR,Pe):ue,X=Ze(F,"ADD_DATA_URI_TAGS")&&mt(F.ADD_DATA_URI_TAGS)?Ee(yt(se),F.ADD_DATA_URI_TAGS,Pe):se,He=Ze(F,"FORBID_CONTENTS")&&mt(F.FORBID_CONTENTS)?Ee({},F.FORBID_CONTENTS,Pe):Ie,ne=Ze(F,"FORBID_TAGS")&&mt(F.FORBID_TAGS)?Ee({},F.FORBID_TAGS,Pe):yt({}),ce=Ze(F,"FORBID_ATTR")&&mt(F.FORBID_ATTR)?Ee({},F.FORBID_ATTR,Pe):yt({}),Ae=Ze(F,"USE_PROFILES")?F.USE_PROFILES&&typeof F.USE_PROFILES=="object"?yt(F.USE_PROFILES):F.USE_PROFILES:!1,_e=F.ALLOW_ARIA_ATTR!==!1,me=F.ALLOW_DATA_ATTR!==!1,Be=F.ALLOW_UNKNOWN_PROTOCOLS||!1,$e=F.ALLOW_SELF_CLOSE_IN_ATTR!==!1,ye=F.SAFE_FOR_TEMPLATES||!1,Ne=F.SAFE_FOR_XML!==!1,we=F.WHOLE_DOCUMENT||!1,Oe=F.RETURN_DOM||!1,K=F.RETURN_DOM_FRAGMENT||!1,te=F.RETURN_TRUSTED_TYPE||!1,Ue=F.FORCE_BODY||!1,oe=F.SANITIZE_DOM!==!1,le=F.SANITIZE_NAMED_PROPS||!1,Te=F.KEEP_CONTENT!==!1,We=F.IN_PLACE||!1,B=Pd(F.ALLOWED_URI_REGEXP)?F.ALLOWED_URI_REGEXP:ws,xe=typeof F.NAMESPACE=="string"?F.NAMESPACE:ge,Se=Ze(F,"MATHML_TEXT_INTEGRATION_POINTS")&&F.MATHML_TEXT_INTEGRATION_POINTS&&typeof F.MATHML_TEXT_INTEGRATION_POINTS=="object"?yt(F.MATHML_TEXT_INTEGRATION_POINTS):Ee({},["mi","mo","mn","ms","mtext"]),be=Ze(F,"HTML_INTEGRATION_POINTS")&&F.HTML_INTEGRATION_POINTS&&typeof F.HTML_INTEGRATION_POINTS=="object"?yt(F.HTML_INTEGRATION_POINTS):Ee({},["annotation-xml"]);const Z=Ze(F,"CUSTOM_ELEMENT_HANDLING")&&F.CUSTOM_ELEMENT_HANDLING&&typeof F.CUSTOM_ELEMENT_HANDLING=="object"?yt(F.CUSTOM_ELEMENT_HANDLING):wr(null);if(ee=wr(null),Ze(Z,"tagNameCheck")&&Yt(Z.tagNameCheck)&&(ee.tagNameCheck=Z.tagNameCheck),Ze(Z,"attributeNameCheck")&&Yt(Z.attributeNameCheck)&&(ee.attributeNameCheck=Z.attributeNameCheck),Ze(Z,"allowCustomizedBuiltInElements")&&typeof Z.allowCustomizedBuiltInElements=="boolean"&&(ee.allowCustomizedBuiltInElements=Z.allowCustomizedBuiltInElements),ye&&(me=!1),K&&(Oe=!0),Ae&&(V=Ee({},bs),H=wr(null),Ae.html===!0&&(Ee(V,ms),Ee(H,ys)),Ae.svg===!0&&(Ee(V,yo),Ee(H,xo),Ee(H,kn)),Ae.svgFilters===!0&&(Ee(V,vo),Ee(H,xo),Ee(H,kn)),Ae.mathMl===!0&&(Ee(V,wo),Ee(H,vs),Ee(H,kn))),R.tagCheck=null,R.attributeCheck=null,Ze(F,"ADD_TAGS")&&(typeof F.ADD_TAGS=="function"?R.tagCheck=F.ADD_TAGS:mt(F.ADD_TAGS)&&(V===j&&(V=yt(V)),Ee(V,F.ADD_TAGS,Pe))),Ze(F,"ADD_ATTR")&&(typeof F.ADD_ATTR=="function"?R.attributeCheck=F.ADD_ATTR:mt(F.ADD_ATTR)&&(H===q&&(H=yt(H)),Ee(H,F.ADD_ATTR,Pe))),Ze(F,"ADD_URI_SAFE_ATTR")&&mt(F.ADD_URI_SAFE_ATTR)&&Ee(de,F.ADD_URI_SAFE_ATTR,Pe),Ze(F,"FORBID_CONTENTS")&&mt(F.FORBID_CONTENTS)&&(He===Ie&&(He=yt(He)),Ee(He,F.FORBID_CONTENTS,Pe)),Ze(F,"ADD_FORBID_CONTENTS")&&mt(F.ADD_FORBID_CONTENTS)&&(He===Ie&&(He=yt(He)),Ee(He,F.ADD_FORBID_CONTENTS,Pe)),Te&&(V["#text"]=!0),we&&Ee(V,["html","head","body"]),V.table&&(Ee(V,["tbody"]),delete ne.tbody),F.TRUSTED_TYPES_POLICY){if(typeof F.TRUSTED_TYPES_POLICY.createHTML!="function")throw xn('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if(typeof F.TRUSTED_TYPES_POLICY.createScriptURL!="function")throw xn('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');A=F.TRUSTED_TYPES_POLICY,_=A.createHTML("")}else A===void 0&&(A=Xd(p,o)),A!==null&&typeof _=="string"&&(_=A.createHTML(""));pt&&pt(F),Mt=F},$t=Ee({},[...yo,...vo,...Fd]),ar=Ee({},[...wo,...$d]),br=function(F){let Z=T(F);(!Z||!Z.tagName)&&(Z={namespaceURI:xe,tagName:"template"});const ae=Vr(F.tagName),Ge=Vr(Z.tagName);return ze[F.namespaceURI]?F.namespaceURI===De?Z.namespaceURI===ge?ae==="svg":Z.namespaceURI===ie?ae==="svg"&&(Ge==="annotation-xml"||Se[Ge]):!!$t[ae]:F.namespaceURI===ie?Z.namespaceURI===ge?ae==="math":Z.namespaceURI===De?ae==="math"&&be[Ge]:!!ar[ae]:F.namespaceURI===ge?Z.namespaceURI===De&&!be[Ge]||Z.namespaceURI===ie&&!Se[Ge]?!1:!ar[ae]&&(Me[ae]||!$t[ae]):!!(je==="application/xhtml+xml"&&ze[F.namespaceURI]):!1},Qe=function(F){kr(t.removed,{element:F});try{T(F).removeChild(F)}catch{x(F)}},Ot=function(F,Z){try{kr(t.removed,{attribute:Z.getAttributeNode(F),from:Z})}catch{kr(t.removed,{attribute:null,from:Z})}if(Z.removeAttribute(F),F==="is")if(Oe||K)try{Qe(Z)}catch{}else try{Z.setAttribute(F,"")}catch{}},Br=function(F){let Z=null,ae=null;if(Ue)F=""+F;else{const Je=fs(F,/^[\r\n\t ]+/);ae=Je&&Je[0]}je==="application/xhtml+xml"&&xe===ge&&(F=''+F+"");const Ge=A?A.createHTML(F):F;if(xe===ge)try{Z=new g().parseFromString(Ge,je)}catch{}if(!Z||!Z.documentElement){Z=k.createDocument(xe,"template",null);try{Z.documentElement.innerHTML=Ce?_:Ge}catch{}}const it=Z.body||Z.documentElement;return F&&ae&&it.insertBefore(r.createTextNode(ae),it.childNodes[0]||null),xe===ge?D.call(Z,we?"html":"body")[0]:we?Z.documentElement:it},Lc=function(F){return y.call(F.ownerDocument||F,F,h.SHOW_ELEMENT|h.SHOW_COMMENT|h.SHOW_TEXT|h.SHOW_PROCESSING_INSTRUCTION|h.SHOW_CDATA_SECTION,null)},ja=function(F){return F instanceof u&&(typeof F.nodeName!="string"||typeof F.textContent!="string"||typeof F.removeChild!="function"||!(F.attributes instanceof i)||typeof F.removeAttribute!="function"||typeof F.setAttribute!="function"||typeof F.namespaceURI!="string"||typeof F.insertBefore!="function"||typeof F.hasChildNodes!="function")},Ba=function(F){return typeof l=="function"&&F instanceof l};function Jt(he,F,Z){xr(he,ae=>{ae.call(t,F,Z,Mt)})}const Pc=function(F){let Z=null;if(Jt(O.beforeSanitizeElements,F,null),ja(F))return Qe(F),!0;const ae=Pe(F.nodeName);if(Jt(O.uponSanitizeElement,F,{tagName:ae,allowedTags:V}),Ne&&F.hasChildNodes()&&!Ba(F.firstElementChild)&&dt(/<[/\w!]/g,F.innerHTML)&&dt(/<[/\w!]/g,F.textContent)||Ne&&F.namespaceURI===ge&&ae==="style"&&Ba(F.firstElementChild)||F.nodeType===_r.progressingInstruction||Ne&&F.nodeType===_r.comment&&dt(/<[/\w]/g,F.data))return Qe(F),!0;if(ne[ae]||!(R.tagCheck instanceof Function&&R.tagCheck(ae))&&!V[ae]){if(!ne[ae]&&$c(ae)&&(ee.tagNameCheck instanceof RegExp&&dt(ee.tagNameCheck,ae)||ee.tagNameCheck instanceof Function&&ee.tagNameCheck(ae)))return!1;if(Te&&!He[ae]){const Ge=T(F)||F.parentNode,it=w(F)||F.childNodes;if(it&&Ge){const Je=it.length;for(let St=Je-1;St>=0;--St){const Ut=v(it[St],!0);Ge.insertBefore(Ut,M(F))}}}return Qe(F),!0}return F instanceof f&&!br(F)||(ae==="noscript"||ae==="noembed"||ae==="noframes")&&dt(/<\/no(script|embed|frames)/i,F.innerHTML)?(Qe(F),!0):(ye&&F.nodeType===_r.text&&(Z=F.textContent,xr([L,$,S],Ge=>{Z=Cr(Z,Ge," ")}),F.textContent!==Z&&(kr(t.removed,{element:F.cloneNode()}),F.textContent=Z)),Jt(O.afterSanitizeElements,F,null),!1)},Fc=function(F,Z,ae){if(ce[Z]||oe&&(Z==="id"||Z==="name")&&(ae in r||ae in nt))return!1;const Ge=H[Z]||R.attributeCheck instanceof Function&&R.attributeCheck(Z,F);if(!(me&&!ce[Z]&&dt(b,Z))){if(!(_e&&dt(z,Z))){if(!Ge||ce[Z]){if(!($c(F)&&(ee.tagNameCheck instanceof RegExp&&dt(ee.tagNameCheck,F)||ee.tagNameCheck instanceof Function&&ee.tagNameCheck(F))&&(ee.attributeNameCheck instanceof RegExp&&dt(ee.attributeNameCheck,Z)||ee.attributeNameCheck instanceof Function&&ee.attributeNameCheck(Z,F))||Z==="is"&&ee.allowCustomizedBuiltInElements&&(ee.tagNameCheck instanceof RegExp&&dt(ee.tagNameCheck,ae)||ee.tagNameCheck instanceof Function&&ee.tagNameCheck(ae))))return!1}else if(!de[Z]){if(!dt(B,Cr(ae,G,""))){if(!((Z==="src"||Z==="xlink:href"||Z==="href")&&F!=="script"&&gs(ae,"data:")===0&&X[F])){if(!(Be&&!dt(U,Cr(ae,G,"")))){if(ae)return!1}}}}}}return!0},nm=Ee({},["annotation-xml","color-profile","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","missing-glyph"]),$c=function(F){return!nm[Vr(F)]&&dt(Y,F)},Uc=function(F){Jt(O.beforeSanitizeAttributes,F,null);const Z=F.attributes;if(!Z||ja(F))return;const ae={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:H,forceKeepAttr:void 0};let Ge=Z.length;for(;Ge--;){const it=Z[Ge],Je=it.name,St=it.namespaceURI,Ut=it.value,Xt=Pe(Je),Ka=Ut;let ct=Je==="value"?Ka:Ad(Ka);if(ae.attrName=Xt,ae.attrValue=ct,ae.keepAttr=!0,ae.forceKeepAttr=void 0,Jt(O.uponSanitizeAttribute,F,ae),ct=ae.attrValue,le&&(Xt==="id"||Xt==="name")&&gs(ct,ve)!==0&&(Ot(Je,F),ct=ve+ct),Ne&&dt(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i,ct)){Ot(Je,F);continue}if(Xt==="attributename"&&fs(ct,"href")){Ot(Je,F);continue}if(ae.forceKeepAttr)continue;if(!ae.keepAttr){Ot(Je,F);continue}if(!$e&&dt(/\/>/i,ct)){Ot(Je,F);continue}ye&&xr([L,$,S],Hc=>{ct=Cr(ct,Hc," ")});const zc=Pe(F.nodeName);if(!Fc(zc,Xt,ct)){Ot(Je,F);continue}if(A&&typeof p=="object"&&typeof p.getAttributeType=="function"&&!St)switch(p.getAttributeType(zc,Xt)){case"TrustedHTML":{ct=A.createHTML(ct);break}case"TrustedScriptURL":{ct=A.createScriptURL(ct);break}}if(ct!==Ka)try{St?F.setAttributeNS(St,Je,ct):F.setAttribute(Je,ct),ja(F)?Qe(F):us(t.removed)}catch{Ot(Je,F)}}Jt(O.afterSanitizeAttributes,F,null)},Wa=function(F){let Z=null;const ae=Lc(F);for(Jt(O.beforeSanitizeShadowDOM,F,null);Z=ae.nextNode();)Jt(O.uponSanitizeShadowNode,Z,null),Pc(Z),Uc(Z),Z.content instanceof a&&Wa(Z.content);Jt(O.afterSanitizeShadowDOM,F,null)},ao=function(F){if(F.nodeType===_r.element&&F.shadowRoot instanceof a){const Ge=F.shadowRoot;ao(Ge),Wa(Ge)}const Z=F.childNodes;if(!Z)return;const ae=[];xr(Z,Ge=>{kr(ae,Ge)});for(const Ge of ae)ao(Ge)};return t.sanitize=function(he){let F=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},Z=null,ae=null,Ge=null,it=null;if(Ce=!he,Ce&&(he=""),typeof he!="string"&&!Ba(he)&&(he=Ld(he),typeof he!="string"))throw xn("dirty is not a string, aborting");if(!t.isSupported)return he;if(ke||Ct(F),t.removed=[],typeof he=="string"&&(We=!1),We){const Ut=he.nodeName;if(typeof Ut=="string"){const Xt=Pe(Ut);if(!V[Xt]||ne[Xt])throw xn("root node is forbidden and cannot be sanitized in-place")}ao(he)}else if(he instanceof l)Z=Br(""),ae=Z.ownerDocument.importNode(he,!0),ae.nodeType===_r.element&&ae.nodeName==="BODY"||ae.nodeName==="HTML"?Z=ae:Z.appendChild(ae),ao(ae);else{if(!Oe&&!ye&&!we&&he.indexOf("<")===-1)return A&&te?A.createHTML(he):he;if(Z=Br(he),!Z)return Oe?null:te?_:""}Z&&Ue&&Qe(Z.firstChild);const Je=Lc(We?he:Z);for(;Ge=Je.nextNode();)Pc(Ge),Uc(Ge),Ge.content instanceof a&&Wa(Ge.content);if(We)return he;if(Oe){if(ye){Z.normalize();let Ut=Z.innerHTML;xr([L,$,S],Xt=>{Ut=Cr(Ut,Xt," ")}),Z.innerHTML=Ut}if(K)for(it=N.call(Z.ownerDocument);Z.firstChild;)it.appendChild(Z.firstChild);else it=Z;return(H.shadowroot||H.shadowrootmode)&&(it=P.call(n,it,!0)),it}let St=we?Z.outerHTML:Z.innerHTML;return we&&V["!doctype"]&&Z.ownerDocument&&Z.ownerDocument.doctype&&Z.ownerDocument.doctype.name&&dt(Kd,Z.ownerDocument.doctype.name)&&(St=" +`+St),ye&&xr([L,$,S],Ut=>{St=Cr(St,Ut," ")}),A&&te?A.createHTML(St):St},t.setConfig=function(){let he=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};Ct(he),ke=!0},t.clearConfig=function(){Mt=null,ke=!1},t.isValidAttribute=function(he,F,Z){Mt||Ct({});const ae=Pe(he),Ge=Pe(F);return Fc(ae,Ge,Z)},t.addHook=function(he,F){typeof F=="function"&&kr(O[he],F)},t.removeHook=function(he,F){if(F!==void 0){const Z=Td(O[he],F);return Z===-1?void 0:Nd(O[he],Z,1)[0]}return us(O[he])},t.removeHooks=function(he){O[he]=[]},t.removeAllHooks=function(){O=xs()},t}var Cs=ks();const Zd=()=>{const e=()=>{const n=window.G7Core?.state?.get?.();return n&&n.preferredCurrency||"KRW"},[t,r]=C.useState(e);return C.useEffect(()=>{const n=window.G7Core?.state?.subscribe;if(r(e()),typeof n!="function")return;const o=n(a=>{r(a&&a.preferredCurrency||"KRW")});return typeof o=="function"?o:void 0},[]),t},qd=e=>{window.G7Core?.dispatch?.({handler:"navigate",params:{path:e}})},Qd=e=>{const t=Math.round(e*2)/2;return[1,2,3,4,5].map(r=>t>=r?"full":t>=r-.5?"half":"empty")},Ss=({product:e,onClick:t,shopBase:r="/shop",className:n="",id:o,editorAttrs:a})=>{const s=Zd(),l=M=>{const w=`multi_currency_${M}`,T=e[w];if(T&&T[s])return T[s].formatted;const A=`${M}_formatted`;return e[A]},f=e.name_localized??(typeof e.name=="string"?e.name:"")??"",h=l("selling_price"),c=l("list_price"),i=e.discount_rate&&e.discount_rate>0,u=e.sales_status&&e.sales_status!=="on_sale",g=e.labels??[],p=M=>Cs.sanitize(M,{ALLOWED_TAGS:["mark"],ALLOWED_ATTR:[]}),m=e.name_highlighted,v=e.description_highlighted??e.short_description,x=()=>{t?t(e.id):qd(`${r==="/"?"":r}/products/${e.id}`)};return d.jsxs(Q,{onClick:x,className:`block w-full text-left group bg-white dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 overflow-hidden hover:shadow-lg transition-shadow cursor-pointer ${n}`,id:o,...a,children:[d.jsxs(W,{className:"relative aspect-square overflow-hidden bg-gray-100 dark:bg-gray-700",children:[d.jsx(Ht,{src:e.thumbnail_url,alt:f,className:"w-full h-full object-cover group-hover:scale-105 transition-transform duration-200",loading:"lazy"}),u&&d.jsx(W,{className:"absolute inset-0 bg-black/50 flex items-center justify-center",children:d.jsx(re,{className:`text-lg font-bold ${e.sales_status==="sold_out"?"text-red-300":e.sales_status==="suspended"?"text-amber-300":"text-blue-300"}`,style:{textShadow:"0 1px 4px rgba(0,0,0,0.6)"},children:e.sales_status_label??e.sales_status})}),i&&e.sales_status!=="sold_out"&&e.sales_status!=="suspended"&&d.jsxs(re,{className:"absolute top-2 left-2 px-2 py-1 bg-red-500 text-white text-xs font-bold rounded",children:[e.discount_rate,"%"]}),g.length>0&&d.jsx(W,{className:"absolute bottom-2 right-2 flex gap-1 flex-wrap justify-end",children:g.map((M,w)=>d.jsx(re,{className:"text-xs text-white font-medium px-1.5 py-0.5 rounded",style:{backgroundColor:M.color||"#6b7280"},children:M.name},w))})]}),d.jsxs(W,{className:"p-4",children:[d.jsxs(W,{className:"flex items-center gap-1.5 flex-wrap",children:[e.primary_category&&d.jsx(re,{className:"inline-block text-xs font-medium text-blue-600 dark:text-blue-400 bg-blue-50 dark:bg-blue-900/30 px-2 py-0.5 rounded",children:e.primary_category}),e.brand_name&&d.jsx(re,{className:"text-xs text-gray-500 dark:text-gray-400",children:e.brand_name})]}),m?d.jsx(W,{className:"mt-1 font-medium text-gray-900 dark:text-white line-clamp-1 [&_mark]:bg-yellow-200 [&_mark]:dark:bg-yellow-500/40 [&_mark]:px-0.5 [&_mark]:rounded",dangerouslySetInnerHTML:{__html:p(m)}}):d.jsx(bn,{className:"mt-1 font-medium text-gray-900 dark:text-white line-clamp-1",children:f}),v&&d.jsx(W,{className:"mt-1 text-sm text-gray-600 dark:text-gray-400 line-clamp-2 [&_mark]:bg-yellow-200 [&_mark]:dark:bg-yellow-500/40 [&_mark]:px-0.5 [&_mark]:rounded",dangerouslySetInnerHTML:{__html:p(v)}}),d.jsxs(W,{className:"mt-1.5 flex items-center gap-1",children:[Qd(e.rating_avg??0).map((M,w)=>d.jsxs(re,{className:`text-xs ${M==="empty"?"text-gray-300 dark:text-gray-600":"text-yellow-400"}`,children:[M==="full"&&d.jsx("i",{className:"fa-solid fa-star"}),M==="half"&&d.jsx("i",{className:"fa-solid fa-star-half-stroke"}),M==="empty"&&d.jsx("i",{className:"fa-regular fa-star"})]},w)),d.jsx(re,{className:"text-xs text-gray-600 dark:text-gray-400 ml-0.5",children:(e.rating_avg??0).toFixed(1)}),d.jsxs(re,{className:"text-xs text-gray-400 dark:text-gray-500",children:["(",e.review_count??0,")"]})]}),d.jsxs(W,{className:"mt-2 flex items-baseline gap-2",children:[d.jsx(re,{className:"font-bold text-gray-900 dark:text-white",children:h}),c&&i&&d.jsx(re,{className:"text-sm text-gray-500 dark:text-gray-400 line-through",children:c})]})]})]})},Jd=Object.freeze(Object.defineProperty({__proto__:null,default:Ss},Symbol.toStringTag,{value:"Module"})),_s="carousel",Xr="controller",Rd="navigation",eu="no-scroll",ko="portal",tu="root",Es="toolbar",ru="counter",Zr="fullscreen",Ts="slideshow",qr="thumbnails",Ns="zoom",Er="loading",Co="playing",Qr="error",Jr="complete",nu="placeholder",Rr=e=>`active-slide-${e}`,ou=Rr(Er),au=Rr(Co),su=Rr(Qr),lu=Rr(Jr),As="fullsize",Tr="flex_center",iu="no_scroll",Ms="no_scroll_padding",So="slide",Os="slide_wrapper",cu="slide_wrapper_interactive",er="prev",tr="next",_o="swipe",Nr="close",Is="onPointerDown",Ds="onPointerMove",Ls="onPointerUp",Ps="onPointerLeave",Fs="onPointerCancel",Eo="onKeyDown",du="onKeyUp",To="onWheel",uu="Escape",fu="ArrowLeft",gu="ArrowRight",hu="button",Cn="icon",$s="contain",Us="cover",zs="Unknown action type",Hs="yarl__";function ft(...e){return e.filter(Boolean).join(" ")}function pe(e){return`${Hs}${e}`}function Ve(e){return`--${Hs}${e}`}function sr(e,t){return`${e}${t?`_${t}`:""}`}function lr(e){return t=>sr(e,t)}function ir(e,t){var r;return(r=e?.[t])!==null&&r!==void 0?r:t}function Gs(e,t,r){return ir(e,"{index} of {total}").replace(/\{index}/g,`${Oo(r,t.length)+1}`).replace(/\{total}/g,`${t.length}`)}function Ar(...e){return()=>{e.forEach(t=>{t()})}}function Tt(e,t,r){return()=>{const n=E.useContext(r);if(!n)throw new Error(`${e} must be used within a ${t}.Provider`);return n}}function No(){return typeof window<"u"}function Ao(e,t=0){const r=10**t;return Math.round((e+Number.EPSILON)*r)/r}function rr(e){return e.type===void 0||e.type==="image"}function Mo(e,t){return e.imageFit===Us||e.imageFit!==$s&&t===Us}function Sn(e){return typeof e=="string"?Number.parseInt(e,10):e}function _n(e){if(typeof e=="number")return{pixel:e};if(typeof e=="string"){const t=Sn(e);return e.endsWith("%")?{percent:t}:{pixel:t}}return{pixel:0}}function pu(e,t){const r=_n(t),n=r.percent!==void 0?e.width/100*r.percent:r.pixel;return{width:Math.max(e.width-2*n,0),height:Math.max(e.height-2*n,0)}}function mu(){return(No()?window?.devicePixelRatio:void 0)||1}function Oo(e,t){return t>0?(e%t+t)%t:0}function Io(e){return e.length>0}function Do(e,t){return e[Oo(t,e.length)]}function Lo(e,t){return Io(e)?Do(e,t):void 0}function js(e){return rr(e)?e.src:void 0}function En(e,t,r){if(!r)return e;const{buttons:n,...o}=e,a=n.findIndex(l=>l===t),s=E.isValidElement(r)?E.cloneElement(r,{key:t},null):r;if(a>=0){const l=[...n];return l.splice(a,1,s),{buttons:l,...o}}return{buttons:[s,...n],...o}}function Bs(e,t,r=0){return Math.min(e.preload,Math.max(e.finite?t.length-1:Math.floor(t.length/2),r))}const bu=Number(E.version.split(".")[0])>=19;function yu(e){return{inert:bu?e:e?"":void 0}}function vu(e){e.scrollTop}const Po={open:!1,close:()=>{},index:0,slides:[],render:{},plugins:[],toolbar:{buttons:[Nr]},labels:{},animation:{fade:250,swipe:500,easing:{fade:"ease",swipe:"ease-out",navigation:"ease-in-out"}},carousel:{finite:!1,preload:2,padding:"16px",spacing:"30%",imageFit:$s,imageProps:{}},controller:{ref:null,focus:!0,aria:!1,touchAction:"none",closeOnPullUp:!1,closeOnPullDown:!1,closeOnBackdropClick:!1,closeOnEscape:!0,preventDefaultWheelX:!0,preventDefaultWheelY:!1,disableSwipeNavigation:!1},portal:{},noScroll:{disabled:!1},on:{},styles:{},className:""};function Lt(e,t){return{name:e,component:t}}function ot(e,t){return{module:e,children:t}}function Ws(e,t,r){return e.module.name===t?r(e):e.children?[ot(e.module,e.children.flatMap(n=>{var o;return(o=Ws(n,t,r))!==null&&o!==void 0?o:[]}))]:[e]}function Mr(e,t,r){return e.flatMap(n=>{var o;return(o=Ws(n,t,r))!==null&&o!==void 0?o:[]})}function wu(e,t=[],r=[]){let n=e;const o=g=>{const p=[...n];for(;p.length>0;){const m=p.pop();if(m?.module.name===g)return!0;m?.children&&p.push(...m.children)}return!1},a=(g,p)=>{if(g===""){n=[ot(p,n)];return}n=Mr(n,g,m=>[ot(p,[m])])},s=(g,p)=>{n=Mr(n,g,m=>[ot(m.module,[ot(p,m.children)])])},l=(g,p,m)=>{n=Mr(n,g,v=>{var x;return[ot(v.module,[...m?[ot(p)]:[],...(x=v.children)!==null&&x!==void 0?x:[],...m?[]:[ot(p)]])]})},f=(g,p,m)=>{n=Mr(n,g,v=>[...m?[ot(p)]:[],v,...m?[]:[ot(p)]])},h=g=>{s(Xr,g)},c=(g,p)=>{n=Mr(n,g,m=>[ot(p,m.children)])},i=g=>{n=Mr(n,g,p=>p.children)},u=g=>{r.push(g)};return t.forEach(g=>{g({contains:o,addParent:a,append:s,addChild:l,addSibling:f,addModule:h,replace:c,remove:i,augment:u})}),{config:n,augmentation:g=>r.reduce((p,m)=>m(p),g)}}const Ks=E.createContext(null),Fo=Tt("useA11yContext","A11yContext",Ks);function xu({children:e}){const[t,r]=E.useState(!1),[n,o]=E.useState(!1),a=E.useMemo(()=>({focusWithin:t,trackFocusWithin:(l,f)=>{const h=c=>i=>{var u;i.currentTarget.contains(i.relatedTarget)||r(c),(u=c?l:f)===null||u===void 0||u(i)};return{onFocus:h(!0),onBlur:h(!1)}},autoPlaying:n,setAutoPlaying:o}),[t,n]);return E.createElement(Ks.Provider,{value:a},e)}const Vs=E.createContext(null),Or=Tt("useDocument","DocumentContext",Vs);function ku({nodeRef:e,children:t}){const r=E.useMemo(()=>{const n=a=>{var s;return((s=a||e.current)===null||s===void 0?void 0:s.ownerDocument)||document};return{getOwnerDocument:n,getOwnerWindow:a=>{var s;return((s=n(a))===null||s===void 0?void 0:s.defaultView)||window}}},[e]);return E.createElement(Vs.Provider,{value:r},t)}const Ys=E.createContext(null),Ir=Tt("useEvents","EventsContext",Ys);function Cu({children:e}){const[t]=E.useState({});E.useEffect(()=>()=>{Object.keys(t).forEach(n=>delete t[n])},[t]);const r=E.useMemo(()=>{const n=(s,l)=>{var f;(f=t[s])===null||f===void 0||f.splice(0,t[s].length,...t[s].filter(h=>h!==l))};return{publish:(...[s,l])=>{var f;(f=t[s])===null||f===void 0||f.forEach(h=>h(l))},subscribe:(s,l)=>(t[s]||(t[s]=[]),t[s].push(l),()=>n(s,l)),unsubscribe:n}},[t]);return E.createElement(Ys.Provider,{value:r},e)}const Xs=E.createContext(null),at=Tt("useLightboxProps","LightboxPropsContext",Xs);function Zs({children:e,...t}){return E.createElement(Xs.Provider,{value:t},e)}const qs=E.createContext(null),Pt=Tt("useLightboxState","LightboxStateContext",qs),Qs=E.createContext(null),Su=Tt("useLightboxDispatch","LightboxDispatchContext",Qs);function _u(e,t){switch(t.type){case"swipe":{const{slides:r}=e,n=t?.increment||0,o=e.globalIndex+n,a=Oo(o,r.length),s=Lo(r,a),l=n||t.duration!==void 0?{increment:n,duration:t.duration,easing:t.easing}:void 0;return{slides:r,currentIndex:a,globalIndex:o,currentSlide:s,animation:l}}case"update":return t.slides!==e.slides||t.index!==e.currentIndex?{slides:t.slides,currentIndex:t.index,globalIndex:t.index,currentSlide:Lo(t.slides,t.index)}:e;default:throw new Error(zs)}}function Eu({slides:e,index:t,children:r}){const[n,o]=E.useReducer(_u,{slides:e,currentIndex:t,globalIndex:t,currentSlide:Lo(e,t)}),[a,s]=E.useState(e),[l,f]=E.useState(t);(e!==a||t!==l)&&(s(e),f(t),o({type:"update",slides:e,index:t}));const h=E.useMemo(()=>({...n,state:n,dispatch:o}),[n,o]);return E.createElement(Qs.Provider,{value:o},E.createElement(qs.Provider,{value:h},r))}const Js=E.createContext(null),Tu=Tt("useRTLContext","RTLContext",Js);function Nu({isRTL:e,children:t}){const r=E.useMemo(()=>({isRTL:e}),[e]);return E.createElement(Js.Provider,{value:r},t)}const Rs=E.createContext(null),en=Tt("useTimeouts","TimeoutsContext",Rs);function Au({children:e}){const[t]=E.useState([]);E.useEffect(()=>()=>{t.forEach(n=>window.clearTimeout(n)),t.splice(0,t.length)},[t]);const r=E.useMemo(()=>{const n=s=>{t.splice(0,t.length,...t.filter(l=>l!==s))};return{setTimeout:(s,l)=>{const f=window.setTimeout(()=>{n(f),s()},l);return t.push(f),f},clearTimeout:s=>{s!==void 0&&(n(s),window.clearTimeout(s))}}},[t]);return E.createElement(Rs.Provider,{value:r},e)}const Dr=E.forwardRef(function({label:t,className:r,icon:n,renderIcon:o,onClick:a,style:s,...l},f){const{styles:h,labels:c}=at(),i=ir(c,t);return E.createElement("button",{ref:f,type:"button",title:i,"aria-label":i,className:ft(pe(hu),r),onClick:a,style:{...s,...h.button},...l},o?o():E.createElement(n,{className:pe(Cn),style:h.icon}))});function el(e,t){const r=n=>E.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",width:"24",height:"24","aria-hidden":"true",focusable:"false",...n},t);return r.displayName=e,r}function vt(e,t){return el(e,E.createElement("g",{fill:"currentColor"},E.createElement("path",{d:"M0 0h24v24H0z",fill:"none"}),t))}function Mu(e,t){return el(e,E.createElement(E.Fragment,null,E.createElement("defs",null,E.createElement("mask",{id:"strike"},E.createElement("path",{d:"M0 0h24v24H0z",fill:"white"}),E.createElement("path",{d:"M0 0L24 24",stroke:"black",strokeWidth:4}))),E.createElement("path",{d:"M0.70707 2.121320L21.878680 23.292883",stroke:"currentColor",strokeWidth:2}),E.createElement("g",{fill:"currentColor",mask:"url(#strike)"},E.createElement("path",{d:"M0 0h24v24H0z",fill:"none"}),t)))}const Ou=vt("Close",E.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"})),Iu=vt("Previous",E.createElement("path",{d:"M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"})),Du=vt("Next",E.createElement("path",{d:"M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"})),Lu=vt("Loading",E.createElement(E.Fragment,null,Array.from({length:8}).map((e,t,r)=>E.createElement("line",{key:t,x1:"12",y1:"6.5",x2:"12",y2:"1.8",strokeLinecap:"round",strokeWidth:"2.6",stroke:"currentColor",strokeOpacity:1/r.length*(t+1),transform:`rotate(${360/r.length*t}, 12, 12)`})))),Pu=vt("Error",E.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"})),jt=No()?E.useLayoutEffect:E.useEffect;function $o(){const[e,t]=E.useState(!1);return E.useEffect(()=>{var r,n;const o=(r=window.matchMedia)===null||r===void 0?void 0:r.call(window,"(prefers-reduced-motion: reduce)");t(o?.matches);const a=s=>t(s.matches);return(n=o?.addEventListener)===null||n===void 0||n.call(o,"change",a),()=>{var s;return(s=o?.removeEventListener)===null||s===void 0?void 0:s.call(o,"change",a)}},[]),e}function Fu(e){let t=0,r=0,n=0;const a=window.getComputedStyle(e).transform.match(/matrix.*\((.+)\)/);if(a){const s=a[1].split(",").map(Sn);s.length===6?(t=s[4],r=s[5]):s.length===16&&(t=s[12],r=s[13],n=s[14])}return{x:t,y:r,z:n}}function Uo(e,t){const r=E.useRef(void 0),n=E.useRef(void 0),o=$o();return jt(()=>{var a,s,l;if(e.current&&r.current!==void 0&&!o){const{keyframes:f,duration:h,easing:c,onfinish:i}=t(r.current,e.current.getBoundingClientRect(),Fu(e.current))||{};if(f&&h){(a=n.current)===null||a===void 0||a.cancel(),n.current=void 0;try{n.current=(l=(s=e.current).animate)===null||l===void 0?void 0:l.call(s,f,{duration:h,easing:c})}catch(u){console.error(u)}n.current&&(n.current.onfinish=()=>{n.current=void 0,i?.()})}}r.current=void 0}),{prepareAnimation:a=>{r.current=a},isAnimationPlaying:()=>{var a;return((a=n.current)===null||a===void 0?void 0:a.playState)==="running"}}}function tl(){const e=E.useRef(null),t=E.useRef(void 0),[r,n]=E.useState();return{setContainerRef:E.useCallback(a=>{e.current=a,t.current&&(t.current.disconnect(),t.current=void 0);const s=()=>{if(a){const l=window.getComputedStyle(a),f=h=>parseFloat(h)||0;n({width:Math.round(a.clientWidth-f(l.paddingLeft)-f(l.paddingRight)),height:Math.round(a.clientHeight-f(l.paddingTop)-f(l.paddingBottom))})}else n(void 0)};s(),a&&typeof ResizeObserver<"u"&&(t.current=new ResizeObserver(s),t.current.observe(a))},[]),containerRef:e,containerRect:r}}function Tn(){const e=E.useRef(void 0),{setTimeout:t,clearTimeout:r}=en();return E.useCallback((n,o)=>{r(e.current),e.current=t(n,o>0?o:0)},[t,r])}function Le(e){const t=E.useRef(e);return jt(()=>{t.current=e}),E.useCallback((...r)=>{var n;return(n=t.current)===null||n===void 0?void 0:n.call(t,...r)},[])}function rl(e,t){typeof e=="function"?e(t):e&&(e.current=t)}function zo(e,t){return E.useMemo(()=>e==null&&t==null?null:r=>{rl(e,r),rl(t,r)},[e,t])}function nl(e,t=!1){const r=E.useRef(!1);jt(()=>{t&&r.current&&(r.current=!1,e())},[t,e]);const n=E.useCallback(()=>{r.current=!0},[]),o=E.useCallback(()=>{r.current=!1},[]);return{onFocus:n,onBlur:o}}function Nn(){return Tu().isRTL}function ol(){const[e]=E.useState({}),t=E.useCallback((o,a)=>{var s;(s=e[o])===null||s===void 0||s.forEach(l=>{a.isPropagationStopped()||l(a)})},[e]),r=E.useMemo(()=>({onPointerDown:o=>t(Is,o),onPointerMove:o=>t(Ds,o),onPointerUp:o=>t(Ls,o),onPointerLeave:o=>t(Ps,o),onPointerCancel:o=>t(Fs,o),onKeyDown:o=>t(Eo,o),onKeyUp:o=>t(du,o),onWheel:o=>t(To,o)}),[t]),n=E.useCallback((o,a)=>(e[o]||(e[o]=[]),e[o].unshift(a),()=>{const s=e[o];s&&s.splice(0,s.length,...s.filter(l=>l!==a))}),[e]);return{registerSensors:r,subscribeSensors:n}}function al(e,t){const r=E.useRef(0),n=Tn(),o=Le((...a)=>{r.current=Date.now(),e(a)});return E.useCallback((...a)=>{n(()=>{o(a)},t-(Date.now()-r.current))},[t,o,n])}const Ho=lr("slide"),Go=lr("slide_image");function cr({slide:e,offset:t,render:r,rect:n,imageFit:o,imageProps:a,onClick:s,onLoad:l,onError:f,style:h}){var c,i,u,g,p,m,v,x;const[M,w]=E.useState(Er),{publish:T}=Ir(),{setTimeout:A}=en(),_=E.useRef(null);E.useEffect(()=>{t===0&&T(Rr(M))},[t,M,T]);const I=Le(B=>{("decode"in B?B.decode():Promise.resolve()).catch(()=>{}).then(()=>{B.parentNode&&(w(Jr),A(()=>{l?.(B)},0))})}),k=E.useCallback(B=>{_.current=B,B?.complete&&I(B)},[I]),y=E.useCallback(B=>{I(B.currentTarget)},[I]),N=Le(()=>{w(Qr),f?.()}),D=Mo(e,o),P=(B,V)=>Number.isFinite(B)?B:V,O=P(Math.max(...((i=(c=e.srcSet)===null||c===void 0?void 0:c.map(B=>B.width))!==null&&i!==void 0?i:[]).concat(e.width?[e.width]:[]).filter(Boolean)),((u=_.current)===null||u===void 0?void 0:u.naturalWidth)||0),L=P(Math.max(...((p=(g=e.srcSet)===null||g===void 0?void 0:g.map(B=>B.height))!==null&&p!==void 0?p:[]).concat(e.height?[e.height]:[]).filter(Boolean)),((m=_.current)===null||m===void 0?void 0:m.naturalHeight)||0),$=O&&L?{maxWidth:`min(${O}px, 100%)`,maxHeight:`min(${L}px, 100%)`}:{maxWidth:"100%",maxHeight:"100%"},S=(v=e.srcSet)===null||v===void 0?void 0:v.slice().sort((B,V)=>B.width-V.width).map(B=>`${B.src} ${B.width}w`).join(", "),b=()=>n&&!D&&e.width&&e.height?n.height/e.height*e.width:Number.MAX_VALUE,z=S&&n&&No()?`${Math.round(Math.min(b(),n.width))}px`:void 0,{style:U,className:G,...Y}=(typeof a=="function"?a(e):a)||{};return E.createElement(E.Fragment,null,E.createElement("img",{ref:k,onLoad:y,onError:N,onClick:s,draggable:!1,className:ft(pe(Go()),D&&pe(Go("cover")),M!==Jr&&pe(Go("loading")),G),style:{...$,...h,...U},...Y,alt:(x=e.alt)!==null&&x!==void 0?x:"",sizes:z,srcSet:S,src:e.src}),M!==Jr&&E.createElement("div",{className:pe(Ho(nu))},M===Er&&(r?.iconLoading?r.iconLoading():E.createElement(Lu,{className:ft(pe(Cn),pe(Ho(Er)))})),M===Qr&&(r?.iconError?r.iconError():E.createElement(Pu,{className:ft(pe(Cn),pe(Ho(Qr)))}))))}const $u=E.forwardRef(function({className:t,children:r,onFocus:n,onBlur:o,...a},s){const l=E.useRef(null),[f,h]=E.useState(!1),{trackFocusWithin:c}=Fo(),i=Le(()=>{if(l.current){const u=window.getComputedStyle(l.current).direction==="rtl";u!==f&&h(u)}});return E.useEffect(i),E.createElement(ku,{nodeRef:l},E.createElement(Nu,{isRTL:f},E.createElement("div",{ref:zo(s,l),className:ft(pe("root"),t),...c(n,o),...a},r)))});var gt;(function(e){e[e.NONE=0]="NONE",e[e.SWIPE=1]="SWIPE",e[e.PULL=2]="PULL",e[e.ANIMATION=3]="ANIMATION"})(gt||(gt={}));function sl(e,t,r,n,o){E.useEffect(()=>o?()=>{}:Ar(e(Is,t),e(Ds,r),e(Ls,n),e(Ps,n),e(Fs,n)),[e,t,r,n,o])}var Bt;(function(e){e[e.NONE=0]="NONE",e[e.SWIPE=1]="SWIPE",e[e.PULL=2]="PULL"})(Bt||(Bt={}));const jo=30;function Uu({disableSwipeNavigation:e,closeOnBackdropClick:t},r,n,o,a,s,l,f,h,c,i,u,g,p,m,v){const x=E.useRef(0),M=E.useRef([]),w=E.useRef(void 0),T=E.useRef(0),A=E.useRef(Bt.NONE),_=E.useCallback(O=>{w.current===O.pointerId&&(w.current=void 0,A.current=Bt.NONE);const L=M.current;L.splice(0,L.length,...L.filter($=>$.pointerId!==O.pointerId))},[]),I=E.useCallback(O=>{_(O),O.persist(),M.current.push(O)},[_]),k=E.useCallback(O=>M.current.find(({pointerId:L})=>O.pointerId===L),[]),y=Le(O=>{I(O)}),N=(O,L)=>i&&O>L||c&&O<-L,D=Le(O=>{const L=k(O);if(L)if(w.current===O.pointerId){const $=Date.now()-T.current,S=x.current;A.current===Bt.SWIPE?Math.abs(S)>.3*o||Math.abs(S)>5&&${const L=k(O);if(L){const $=w.current===O.pointerId;if(O.buttons===0){$&&x.current!==0?D(O):_(L);return}const S=O.clientX-L.clientX,b=O.clientY-L.clientY;if(w.current===void 0){const z=U=>{I(O),w.current=O.pointerId,T.current=Date.now(),A.current=U};Math.abs(S)>Math.abs(b)&&Math.abs(S)>jo&&n(S)?e||(z(Bt.SWIPE),s()):Math.abs(b)>Math.abs(S)&&N(b,jo)&&(z(Bt.PULL),u())}else $&&(A.current===Bt.SWIPE?(x.current=S,l(S)):A.current===Bt.PULL&&(x.current=b,g(b)))}});sl(r,y,P,D)}function zu({preventDefaultWheelX:e,preventDefaultWheelY:t}){const r=E.useRef(null),n=Le(o=>{const a=Math.abs(o.deltaX)>Math.abs(o.deltaY);(a&&e||!a&&t||o.ctrlKey)&&o.preventDefault()});return E.useCallback(o=>{var a;o?o.addEventListener("wheel",n,{passive:!1}):(a=r.current)===null||a===void 0||a.removeEventListener("wheel",n),r.current=o},[n])}function Hu(e,t,r,n,o,a,s,l,f){const h=E.useRef(0),c=E.useRef(0),i=E.useRef(void 0),u=E.useRef(void 0),g=E.useRef(0),p=E.useRef(void 0),m=E.useRef(0),{setTimeout:v,clearTimeout:x}=en(),M=E.useCallback(()=>{i.current&&(x(i.current),i.current=void 0)},[x]),w=E.useCallback(()=>{u.current&&(x(u.current),u.current=void 0)},[x]),T=Le(()=>{e!==gt.SWIPE&&(h.current=0,m.current=0,M(),w())});E.useEffect(T,[e,T]);const A=Le(I=>{u.current=void 0,h.current===I&&f(h.current)}),_=Le(I=>{if(I.ctrlKey||Math.abs(I.deltaY)>Math.abs(I.deltaX))return;const k=y=>{g.current=y,x(p.current),p.current=y>0?v(()=>{g.current=0,p.current=void 0},300):void 0};if(e===gt.NONE){if(Math.abs(I.deltaX)<=1.2*Math.abs(g.current)){k(I.deltaX);return}if(!r(-I.deltaX))return;if(c.current+=I.deltaX,M(),Math.abs(c.current)>30)c.current=0,k(0),m.current=Date.now(),a();else{const y=c.current;i.current=v(()=>{i.current=void 0,y===c.current&&(c.current=0)},o)}}else if(e===gt.SWIPE){let y=h.current-I.deltaX;if(y=Math.min(Math.abs(y),n)*Math.sign(y),h.current=y,s(y),w(),Math.abs(y)>.2*n){k(I.deltaX),l(y,Date.now()-m.current);return}u.current=v(()=>A(y),2*o)}else k(I.deltaX)});E.useEffect(()=>t(To,_),[t,_])}const ll=lr("container"),il=E.createContext(null),Wt=Tt("useController","ControllerContext",il);function Gu({children:e,...t}){var r;const{carousel:n,animation:o,controller:a,on:s,styles:l,render:f}=t,{closeOnPullUp:h,closeOnPullDown:c,preventDefaultWheelX:i,preventDefaultWheelY:u}=a,[g,p]=E.useState(),m=Pt(),v=Su(),[x,M]=E.useState(gt.NONE),w=E.useRef(0),T=E.useRef(0),A=E.useRef(1),{registerSensors:_,subscribeSensors:I}=ol(),{subscribe:k,publish:y}=Ir(),N=Tn(),D=Tn(),P=Tn(),{containerRef:O,setContainerRef:L,containerRect:$}=tl(),S=zo(zu({preventDefaultWheelX:i,preventDefaultWheelY:u}),L),b=E.useRef(null),z=zo(b,void 0),{getOwnerDocument:U}=Or(),G=Nn(),Y=K=>(G?-1:1)*(typeof K=="number"?K:1),B=Le(()=>{var K;return(K=O.current)===null||K===void 0?void 0:K.focus()}),V=Le(()=>t),j=Le(()=>m),H=E.useCallback(K=>y(er,K),[y]),q=E.useCallback(K=>y(tr,K),[y]),ee=E.useCallback(()=>y(Nr),[y]),ne=K=>!(n.finite&&(Y(K)>0&&m.currentIndex===0||Y(K)<0&&m.currentIndex===m.slides.length-1)),ce=K=>{var te;w.current=K,(te=O.current)===null||te===void 0||te.style.setProperty(Ve("swipe_offset"),`${Math.round(K)}px`)},R=K=>{var te,oe;T.current=K,A.current=(()=>{const Te=c&&K>0?K:h&&K<0?-K:0;return Math.min(Math.max(Ao(1-Te/60*(1-.5),2),.5),1)})(),(te=O.current)===null||te===void 0||te.style.setProperty(Ve("pull_offset"),`${Math.round(K)}px`),(oe=O.current)===null||oe===void 0||oe.style.setProperty(Ve("pull_opacity"),`${A.current}`)},{prepareAnimation:_e}=Uo(b,(K,te,oe)=>{if(b.current&&$)return{keyframes:[{transform:`translate(0, ${K.rect.y-te.y+oe.y}px)`,opacity:K.opacity},{transform:"translate(0, 0)",opacity:1}],duration:K.duration,easing:o.easing.fade}}),me=(K,te)=>{if(h||c){R(K);let oe=0;b.current&&(oe=o.fade*(te?2:1),_e({rect:b.current.getBoundingClientRect(),opacity:A.current,duration:oe})),P(()=>{R(0),M(gt.NONE)},oe),M(gt.ANIMATION),te||ee()}},{prepareAnimation:Be,isAnimationPlaying:$e}=Uo(b,(K,te,oe)=>{var le;if(b.current&&$&&(!((le=m.animation)===null||le===void 0)&&le.duration)){const ve=_n(n.spacing),Te=(ve.percent?ve.percent*$.width/100:ve.pixel)||0;return{keyframes:[{transform:`translate(${Y(m.globalIndex-K.index)*($.width+Te)+K.rect.x-te.x+oe.x}px, 0)`},{transform:"translate(0, 0)"}],duration:m.animation.duration,easing:m.animation.easing}}}),ye=Le(K=>{var te,oe;const le=K.offset||0,ve=le?o.swipe:(te=o.navigation)!==null&&te!==void 0?te:o.swipe,Te=!le&&!$e()?o.easing.navigation:o.easing.swipe;let{direction:We}=K;const Ae=(oe=K.count)!==null&&oe!==void 0?oe:1;let He=gt.ANIMATION,Ie=ve*Ae;if(!We){const se=$?.width,de=K.duration||0,ue=se?ve/se*Math.abs(le):ve;Ae!==0?(de0?er:tr):Ie=ve/2}let X=0;We===er?ne(Y(1))?X=-Ae:(He=gt.NONE,Ie=ve):We===tr&&(ne(Y(-1))?X=Ae:(He=gt.NONE,Ie=ve)),Ie=Math.round(Ie),D(()=>{ce(0),M(gt.NONE)},Ie),b.current&&Be({rect:b.current.getBoundingClientRect(),index:m.globalIndex}),M(He),y(_o,{type:"swipe",increment:X,duration:Ie,easing:Te})});E.useEffect(()=>{var K,te;!((K=m.animation)===null||K===void 0)&&K.increment&&(!((te=m.animation)===null||te===void 0)&&te.duration)&&N(()=>v({type:"swipe",increment:0}),m.animation.duration)},[m.animation,v,N]);const Ne=[I,ne,$?.width||0,o.swipe,()=>M(gt.SWIPE),K=>ce(K),(K,te)=>ye({offset:K,duration:te,count:1}),K=>ye({offset:K,count:0})],we=[()=>{c&&M(gt.PULL)},K=>R(K),K=>me(K),K=>me(K,!0)];Uu(a,...Ne,h,c,...we,ee),Hu(x,...Ne);const ke=Le(()=>{a.focus&&U().querySelector(`.${pe(ko)} .${pe(ll())}`)&&B()});E.useEffect(ke,[ke]);const Ue=Le(()=>{var K;(K=s.view)===null||K===void 0||K.call(s,{index:m.currentIndex})});E.useEffect(Ue,[m.globalIndex,Ue]),E.useEffect(()=>Ar(k(er,K=>ye({direction:er,...K})),k(tr,K=>ye({direction:tr,...K})),k(_o,K=>v(K))),[k,ye,v]);const Oe=E.useMemo(()=>({prev:H,next:q,close:ee,focus:B,slideRect:$?pu($,n.padding):{width:0,height:0},containerRect:$||{width:0,height:0},subscribeSensors:I,containerRef:O,setCarouselRef:z,toolbarWidth:g,setToolbarWidth:p}),[H,q,ee,B,I,$,O,z,g,p,n.padding]);return E.useImperativeHandle(a.ref,()=>({prev:H,next:q,close:ee,focus:B,getLightboxProps:V,getLightboxState:j}),[H,q,ee,B,V,j]),E.createElement("div",{ref:S,className:ft(pe(ll()),pe(Tr)),style:{...x===gt.SWIPE?{[Ve("swipe_offset")]:`${Math.round(w.current)}px`}:null,...x===gt.PULL?{[Ve("pull_offset")]:`${Math.round(T.current)}px`,[Ve("pull_opacity")]:`${A.current}`}:null,...a.touchAction!=="none"?{[Ve("controller_touch_action")]:a.touchAction}:null,...l.container},tabIndex:-1,..._},$&&E.createElement(il.Provider,{value:Oe},e,(r=f.controls)===null||r===void 0?void 0:r.call(f)))}const ju=Lt(Xr,Gu);function dr(e){return sr(_s,e)}function cl(e){return sr(So,e)}function Bu({slide:e,offset:t}){const r=E.useRef(null),{currentIndex:n,slides:o}=Pt(),{slideRect:a,focus:s}=Wt(),{render:l,carousel:{imageFit:f,imageProps:h},on:{click:c},styles:{slide:i},labels:u}=at(),{getOwnerDocument:g}=Or(),p=t!==0;E.useEffect(()=>{var v;p&&(!((v=r.current)===null||v===void 0)&&v.contains(g().activeElement))&&s()},[p,s,g]);const m=()=>{var v,x,M,w;let T=(v=l.slide)===null||v===void 0?void 0:v.call(l,{slide:e,offset:t,rect:a});return!T&&rr(e)&&(T=E.createElement(cr,{slide:e,offset:t,render:l,rect:a,imageFit:f,imageProps:h,onClick:p?void 0:()=>c?.({index:n})})),T?E.createElement(E.Fragment,null,(x=l.slideHeader)===null||x===void 0?void 0:x.call(l,{slide:e}),((M=l.slideContainer)!==null&&M!==void 0?M:(({children:A})=>A))({slide:e,children:T}),(w=l.slideFooter)===null||w===void 0?void 0:w.call(l,{slide:e})):null};return E.createElement("div",{ref:r,className:ft(pe(cl()),!p&&pe(cl("current")),pe(Tr)),...yu(p),style:i,role:"group","aria-roledescription":ir(u,"Slide"),"aria-label":Gs(u,o,n+t)},m())}function Wu(){const e=at().styles.slide;return E.createElement("div",{className:pe(So),style:e})}function Ku({carousel:e,labels:t}){const{slides:r,currentIndex:n,globalIndex:o}=Pt(),{setCarouselRef:a}=Wt(),{autoPlaying:s,focusWithin:l}=Fo(),f=_n(e.spacing),h=_n(e.padding),c=Bs(e,r,1),i=[];if(Io(r))for(let u=n-c;u<=n+c;u+=1){const g=Do(r,u),p=o-n+u,m=e.finite&&(u<0||u>r.length-1);i.push(m?{key:p}:{key:[`${p}`,js(g)].filter(Boolean).join("|"),offset:u-n,slide:g})}return E.createElement("div",{ref:a,className:ft(pe(dr()),i.length>0&&pe(dr("with_slides"))),style:{[`${Ve(dr("slides_count"))}`]:i.length,[`${Ve(dr("spacing_px"))}`]:f.pixel||0,[`${Ve(dr("spacing_percent"))}`]:f.percent||0,[`${Ve(dr("padding_px"))}`]:h.pixel||0,[`${Ve(dr("padding_percent"))}`]:h.percent||0},role:"region","aria-live":s&&!l?"off":"polite","aria-roledescription":ir(t,"Carousel"),"aria-label":ir(t,"Photo gallery")},i.map(({key:u,slide:g,offset:p})=>g?E.createElement(Bu,{key:u,slide:g,offset:p}):E.createElement(Wu,{key:u})))}const Vu=Lt(_s,Ku);function dl(){const{carousel:e}=at(),{slides:t,currentIndex:r}=Pt(),n=t.length===0||e.finite&&r===0,o=t.length===0||e.finite&&r===t.length-1;return{prevDisabled:n,nextDisabled:o}}function ul(e){var t;const r=Nn(),{publish:n}=Ir(),{animation:o,controller:a}=at(),{prevDisabled:s,nextDisabled:l}=dl(),f=((t=o.navigation)!==null&&t!==void 0?t:o.swipe)/2,h=al(()=>n(er),f),c=al(()=>n(tr),f),i=Le(u=>{switch(u.key){case uu:if(!a.closeOnEscape)return;n(Nr);break;case fu:(r?l:s)||(r?c:h)();break;case gu:(r?s:l)||(r?h:c)();break;default:return}u.stopPropagation()});E.useEffect(()=>e(Eo,i),[e,i])}function fl({label:e,icon:t,renderIcon:r,action:n,onClick:o,disabled:a,style:s}){return E.createElement(Dr,{label:e,icon:t,renderIcon:r,className:pe(`navigation_${n}`),disabled:a,onClick:o,style:s,...nl(Wt().focus,a)})}function Yu({render:{buttonPrev:e,buttonNext:t,iconPrev:r,iconNext:n},styles:o}){const{prev:a,next:s,subscribeSensors:l}=Wt(),{prevDisabled:f,nextDisabled:h}=dl();return ul(l),E.createElement(E.Fragment,null,e?e():E.createElement(fl,{label:"Previous",action:er,icon:Iu,renderIcon:r,style:o.navigationPrev,disabled:f,onClick:a}),t?t():E.createElement(fl,{label:"Next",action:tr,icon:Du,renderIcon:n,style:o.navigationNext,disabled:h,onClick:s}))}const Xu=Lt(Rd,Yu),gl=pe(iu),Zu=pe(Ms);function qu(e){return"style"in e}function hl(e,t,r){const n=window.getComputedStyle(e),o=r?"padding-left":"padding-right",a=r?n.paddingLeft:n.paddingRight,s=e.style.getPropertyValue(o);return e.style.setProperty(o,`${(Sn(a)||0)+t}px`),()=>{s?e.style.setProperty(o,s):e.style.removeProperty(o)}}function Qu({noScroll:{disabled:e},children:t}){const r=Nn(),{getOwnerDocument:n,getOwnerWindow:o}=Or();return E.useEffect(()=>{if(e)return()=>{};const a=[],s=o(),{body:l,documentElement:f}=n(),h=Math.round(s.innerWidth-f.clientWidth);if(h>0){a.push(hl(l,h,r));const c=l.getElementsByTagName("*");for(let i=0;i{l.classList.remove(gl),a.forEach(c=>c())}},[r,e,n,o]),E.createElement(E.Fragment,null,t)}const Ju=Lt(eu,Qu);function pl(e){return sr(ko,e)}function ml(e,t,r){const n=e.getAttribute(t);return e.setAttribute(t,r),()=>{n?e.setAttribute(t,n):e.removeAttribute(t)}}function Ru({portal:{root:e,container:{className:t,style:r,...n}={}},animation:o,styles:a,className:s,on:l,close:f,labels:h,children:c}){const[i,u]=E.useState(!1),[g,p]=E.useState(!1),m=E.useRef([]),v=E.useRef(null),{setTimeout:x}=en(),{subscribe:M}=Ir(),T=$o()?0:o.fade;E.useEffect(()=>(u(!0),()=>{u(!1),p(!1)}),[]);const A=Le(()=>{m.current.forEach(y=>y()),m.current=[]}),_=Le(()=>{var y;p(!1),A(),(y=l.exiting)===null||y===void 0||y.call(l),x(()=>{var N;(N=l.exited)===null||N===void 0||N.call(l),f()},T)});E.useEffect(()=>M(Nr,_),[M,_]);const I=Le(y=>{var N,D,P;vu(y),p(!0),(N=l.entering)===null||N===void 0||N.call(l);const O=(P=(D=y.parentNode)===null||D===void 0?void 0:D.children)!==null&&P!==void 0?P:[];for(let L=0;L{var L,$;($=(L=v.current)===null||L===void 0?void 0:L.focus)===null||$===void 0||$.call(L)}),x(()=>{var L;(L=l.entered)===null||L===void 0||L.call(l)},T)}),k=E.useCallback(y=>{y?I(y):A()},[I,A]);return i?Rt.createPortal(E.createElement($u,{ref:k,className:ft(s,t,pe(pl()),pe(Ms),g&&pe(pl("open"))),"aria-modal":!0,role:"dialog","aria-label":ir(h,"Lightbox"),style:{...o.fade!==Po.animation.fade?{[Ve("fade_animation_duration")]:`${T}ms`}:null,...o.easing.fade!==Po.animation.easing.fade?{[Ve("fade_animation_timing_function")]:o.easing.fade}:null,...a.root,...r},onFocus:y=>{v.current||(v.current=y.relatedTarget)},...n},c),(typeof e=="function"?e():e)||document.body):null}const ef=Lt(ko,Ru);function tf({children:e}){return E.createElement(E.Fragment,null,e)}const rf=Lt(tu,tf);function nf(e){return sr(Es,e)}function of({toolbar:{buttons:e},render:{buttonClose:t,iconClose:r},styles:n}){const{close:o,setToolbarWidth:a}=Wt(),{setContainerRef:s,containerRect:l}=tl();jt(()=>{a(l?.width)},[a,l?.width]);const f=()=>t?t():E.createElement(Dr,{key:Nr,label:"Close",icon:Ou,renderIcon:r,onClick:o});return E.createElement("div",{ref:s,style:n.toolbar,className:pe(nf())},e?.map(h=>h===Nr?f():h))}const af=Lt(Es,of);function bl(e,t){var r;return E.createElement(e.module.component,{key:e.module.name,...t},(r=e.children)===null||r===void 0?void 0:r.map(n=>bl(n,t)))}function sf(e,t={}){const{easing:r,...n}=e,{easing:o,...a}=t;return{easing:{...r,...o},...n,...a}}function lf({carousel:e,animation:t,render:r,toolbar:n,controller:o,noScroll:a,on:s,plugins:l,slides:f,index:h,...c}){const{animation:i,carousel:u,render:g,toolbar:p,controller:m,noScroll:v,on:x,slides:M,index:w,plugins:T,...A}=Po,{config:_,augmentation:I}=wu([ot(ef,[ot(Ju,[ot(ju,[ot(Vu),ot(af),ot(Xu)])])])],l||T),k=I({animation:sf(i,t),carousel:{...u,...e},render:{...g,...r},toolbar:{...p,...n},controller:{...m,...o},noScroll:{...v,...a},on:{...x,...s},...A,...c});return k.open?E.createElement(Zs,{...k},E.createElement(Eu,{slides:f||M,index:Sn(h||w)},E.createElement(Au,null,E.createElement(Cu,null,E.createElement(xu,null,bl(ot(rf,_),k)))))):null}const yl={minZoom:1,maxZoomPixelRatio:1,zoomInMultiplier:2,doubleTapDelay:300,doubleClickDelay:500,doubleClickMaxStops:2,keyboardMoveDistance:50,wheelZoomDistanceFactor:100,pinchZoomDistanceFactor:100,pinchZoomV4:!1,scrollToZoom:!1,maxZoom:8};function cf(e){return Math.min(Math.max(e,Number.EPSILON),1)}function vl(e){const{minZoom:t,...r}={...yl,...e};return{minZoom:cf(t),...r}}function df(e,t,r,n){const o=E.useRef(void 0),a=E.useRef(void 0),{zoom:s}=at().animation,l=$o(),f=Le(()=>{var h,c,i;if((h=o.current)===null||h===void 0||h.cancel(),o.current=void 0,a.current&&n?.current){try{o.current=(i=(c=n.current).animate)===null||i===void 0?void 0:i.call(c,[{transform:a.current},{transform:`scale(${e}) translateX(${t}px) translateY(${r}px)`}],{duration:l?0:s??500,easing:o.current?"ease-out":"ease-in-out"})}catch(u){console.error(u)}a.current=void 0,o.current&&(o.current.onfinish=()=>{o.current=void 0})}});return jt(f,[e,t,r,f]),E.useCallback(()=>{a.current=n?.current?window.getComputedStyle(n.current).transform:void 0},[n])}function uf(e,t){const{on:r}=at(),n=Le(()=>{var o;t||(o=r.zoom)===null||o===void 0||o.call(r,{zoom:e})});E.useEffect(n,[e,n])}function An(){const{zoom:e}=at();return vl(e)}function ff(e,t){var r;const n=typeof e=="function"?(r=e(t))!==null&&r!==void 0?r:yl.maxZoom:e;return Math.max(n,1)}function gf(e,t){var r,n;let o={width:0,height:0},a={width:0,height:0};const{currentSlide:s}=Pt(),{imageFit:l}=at().carousel,{maxZoomPixelRatio:f,maxZoom:h}=An();if(e&&s){const i={...s,...t};if(rr(i)){const u=Mo(i,l),g=Math.max(...(((r=i.srcSet)===null||r===void 0?void 0:r.map(m=>m.width))||[]).concat(i.width?[i.width]:[])),p=Math.max(...(((n=i.srcSet)===null||n===void 0?void 0:n.map(m=>m.height))||[]).concat(i.height?[i.height]:[]));g>0&&p>0&&e.width>0&&e.height>0&&(a=u?{width:Math.round(Math.min(g,e.width/e.height*p)),height:Math.round(Math.min(p,e.height/e.width*g))}:{width:g,height:p},a={width:a.width*f,height:a.height*f},o=u?{width:Math.min(e.width,a.width,g),height:Math.min(e.height,a.height,p)}:{width:Math.round(Math.min(e.width,e.height/p*g,g)),height:Math.round(Math.min(e.height,e.width/g*p,p))})}else e.width>0&&e.height>0&&(t&&t.width>0&&t.height>0?o={width:Math.min(e.width,t.width),height:Math.min(e.height,t.height)}:o={width:e.width,height:e.height})}const c=s&&o.width?rr(s)?Math.max(Ao(a.width/o.width,5),1):ff(h,s):1;return{imageRect:o,maxZoom:c}}function wl(e,t){return Math.hypot(e.clientX-t.clientX,e.clientY-t.clientY)}function xl(e,t,r=100,n=2){return e*Math.min(1+Math.abs(t/r),n)**Math.sign(t)}function hf(e,t,r,n,o,a,s,l,f){const h=E.useRef([]),c=E.useRef(0),i=E.useRef(void 0),{globalIndex:u}=Pt(),{getOwnerWindow:g}=Or(),{containerRef:p,subscribeSensors:m}=Wt(),{keyboardMoveDistance:v,zoomInMultiplier:x,wheelZoomDistanceFactor:M,scrollToZoom:w,doubleTapDelay:T,doubleClickDelay:A,doubleClickMaxStops:_,pinchZoomDistanceFactor:I,pinchZoomV4:k}=An(),y=E.useCallback(z=>{if(p.current){const{pageX:U,pageY:G}=z,{scrollX:Y,scrollY:B}=g(),{left:V,top:j,width:H,height:q}=p.current.getBoundingClientRect();return[U-V-Y-H/2,G-j-B-q/2]}return[]},[p,g]),N=Le(z=>{const{key:U,metaKey:G,ctrlKey:Y}=z,B=G||Y,V=()=>{z.preventDefault(),z.stopPropagation()};if(e>1){const j=(H,q)=>{V(),l(H,q)};U==="ArrowDown"?j(0,v):U==="ArrowUp"?j(0,-v):U==="ArrowLeft"?j(-v,0):U==="ArrowRight"&&j(v,0)}U==="+"||B&&U==="="?(V(),o()):U==="-"||B&&U==="_"?(V(),a()):B&&U==="0"&&(V(),s(1))}),D=Le(z=>{if((z.ctrlKey||w)&&Math.abs(z.deltaY)>Math.abs(z.deltaX)){z.stopPropagation(),s(xl(e,-z.deltaY,M),!0,...y(z));return}e>1&&(z.stopPropagation(),w||l(z.deltaX,z.deltaY))}),P=E.useCallback(z=>{const U=h.current;U.splice(0,U.length,...U.filter(G=>G.pointerId!==z.pointerId))},[]),O=E.useCallback(z=>{P(z),z.persist(),h.current.push(z)},[P]),L=Le(z=>{var U;const G=h.current;if(z.pointerType==="mouse"&&z.buttons>1||!(!((U=f?.current)===null||U===void 0)&&U.contains(z.target)))return;e>1&&z.stopPropagation();const{timeStamp:Y}=z;if(G.length===0&&Y-c.current<(z.pointerType==="touch"?T:A)){c.current=0;const B=e>=1?e!==r?e*Math.max(r**(1/_),x):1:e!==t?e/Math.max(t**(-1/_),x):1;s(B,!1,...y(z))}else c.current=Y;if(O(z),G.length===2){const B=wl(G[0],G[1]);i.current={previousDistance:B,initialDistance:Math.max(B,1),initialZoom:e}}}),$=Le(z=>{const U=h.current,G=U.find(Y=>Y.pointerId===z.pointerId);if(U.length===2&&i.current){z.stopPropagation(),O(z);const Y=wl(U[0],U[1]),B=k?i.current.initialZoom/i.current.initialDistance*Y:xl(e,Y-i.current.previousDistance,I);s(B,!0,...U.map(V=>y(V)).reduce((V,j)=>j.map((H,q)=>V[q]+H/2))),i.current.previousDistance=Y;return}e>1&&(z.stopPropagation(),G&&(U.length===1&&l((G.clientX-z.clientX)/e,(G.clientY-z.clientY)/e),O(z)))}),S=E.useCallback(z=>{const U=h.current;U.length===2&&U.find(G=>G.pointerId===z.pointerId)&&(i.current=void 0),P(z)},[P]),b=E.useCallback(()=>{const z=h.current;z.splice(0,z.length),c.current=0,i.current=void 0},[]);sl(m,L,$,S,n),E.useEffect(b,[u,b]),E.useEffect(()=>n?()=>{}:Ar(b,m(Eo,N),m(To,D)),[n,m,b,N,D])}function pf(e,t,r){const[n,o]=E.useState(1),[a,s]=E.useState(0),[l,f]=E.useState(0),h=df(n,a,l,r),{currentSlide:c,globalIndex:i}=Pt(),{containerRect:u,slideRect:g}=Wt(),{minZoom:p,zoomInMultiplier:m}=An(),v=c&&rr(c)?c.src:void 0,x=!r?.current;jt(()=>{o(1),s(0),f(0)},[i,v]);const M=E.useCallback((I,k,y)=>{const N=y||n,D=a-(I||0),P=l-(k||0),O=(e.width*N-g.width)/2/N,L=(e.height*N-g.height)/2/N;s(Math.min(Math.abs(D),Math.max(O,0))*Math.sign(D)),f(Math.min(Math.abs(P),Math.max(L,0))*Math.sign(P))},[n,a,l,g,e.width,e.height]),w=E.useCallback((I,k,y,N)=>{const D=Ao(I+.01p?I:p:t,5);k||h(),M(y?y*(1/n-1/D):0,N?N*(1/n-1/D):0,D),o(D)},[n,p,t,M,h]),T=Le(()=>{n>1&&(n>t&&w(t,!0),M())});jt(T,[u.width,u.height,T]);const A=E.useCallback(()=>{const I=n*m;w(n<1&&I>1?1:I)},[n,m,w]),_=E.useCallback(()=>{const I=n/m;w(n>1&&I<1?1:I)},[n,m,w]);return{zoom:n,offsetX:a,offsetY:l,disabled:x,changeOffsets:M,changeZoom:w,zoomIn:A,zoomOut:_}}const kl=E.createContext(null),Bo=Tt("useZoom","ZoomControllerContext",kl);function mf({children:e}){const[t,r]=E.useState(),{slideRect:n}=Wt(),{ref:o,minZoom:a}=An(),{imageRect:s,maxZoom:l}=gf(n,t?.imageDimensions),{zoom:f,offsetX:h,offsetY:c,disabled:i,changeZoom:u,changeOffsets:g,zoomIn:p,zoomOut:m}=pf(s,l,t?.zoomWrapperRef);uf(f,i),hf(f,a,l,i,p,m,u,g,t?.zoomWrapperRef);const v=E.useMemo(()=>({zoom:f,minZoom:a,maxZoom:l,offsetX:h,offsetY:c,disabled:i,zoomIn:p,zoomOut:m,changeZoom:u}),[f,a,l,h,c,i,p,m,u]);E.useImperativeHandle(o,()=>v,[v]);const x=E.useMemo(()=>({...v,setZoomWrapper:r}),[v,r]);return E.createElement(kl.Provider,{value:x},e)}const bf=vt("ZoomIn",E.createElement(E.Fragment,null,E.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"}),E.createElement("path",{d:"M12 10h-2v2H9v-2H7V9h2V7h1v2h2v1z"}))),yf=vt("ZoomOut",E.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"})),Cl=E.forwardRef(function({zoomIn:t,onLoseFocus:r},n){const o=E.useRef(!1),a=E.useRef(!1),{zoom:s,minZoom:l,maxZoom:f,zoomIn:h,zoomOut:c,disabled:i}=Bo(),{render:u}=at(),g=i||(t?s>=f:s<=l);return E.useEffect(()=>{g&&o.current&&a.current&&r(),g||(o.current=!0)},[g,r]),E.createElement(Dr,{ref:n,disabled:g,label:t?"Zoom in":"Zoom out",icon:t?bf:yf,renderIcon:t?u.iconZoomIn:u.iconZoomOut,onClick:t?h:c,onFocus:()=>{a.current=!0},onBlur:()=>{a.current=!1}})});function vf(){const e=E.useRef(null),t=E.useRef(null),{focus:r}=Wt(),n=E.useCallback(s=>{var l,f;!((l=s.current)===null||l===void 0)&&l.disabled?r():(f=s.current)===null||f===void 0||f.focus()},[r]),o=E.useCallback(()=>n(e),[n]),a=E.useCallback(()=>n(t),[n]);return E.createElement(E.Fragment,null,E.createElement(Cl,{zoomIn:!0,ref:e,onLoseFocus:a}),E.createElement(Cl,{ref:t,onLoseFocus:o}))}function wf(){const{render:e}=at(),t=Bo();return e.buttonZoom?E.createElement(E.Fragment,null,e.buttonZoom(t)):E.createElement(vf,null)}function xf(e){var t;return(((t=e.srcSet)===null||t===void 0?void 0:t.length)||0)>0}function kf({current:e,preload:t},{type:r,source:n}){switch(r){case"fetch":return e?{current:e,preload:n}:{current:n};case"done":return n===t?{current:n}:{current:e,preload:t};default:throw new Error(zs)}}function Cf(e){var t,r;const[{current:n,preload:o},a]=E.useReducer(kf,{}),{slide:s,rect:l,imageFit:f,render:h,interactive:c}=e,i=s.srcSet.sort((A,_)=>A.width-_.width),u=(t=s.width)!==null&&t!==void 0?t:i[i.length-1].width,g=(r=s.height)!==null&&r!==void 0?r:i[i.length-1].height,p=Mo(s,f),m=Math.max(...i.map(A=>A.width)),v=Math.min((p?Math.max:Math.min)(l.width,u*(l.height/g)),m),x=mu(),M=Le(()=>{var A;const _=(A=i.find(I=>I.width>=v*x))!==null&&A!==void 0?A:i[i.length-1];(!n||i.findIndex(I=>I.src===n)I===_))&&a({type:"fetch",source:_.src})});jt(M,[l.width,l.height,x,M]);const w=Le(A=>a({type:"done",source:A})),T={WebkitTransform:c?"initial":"translateZ(0)"};return p||Object.assign(T,l.width/l.heightw(o),render:{...h,iconLoading:()=>null,iconError:()=>null}}),n&&E.createElement(cr,{key:"current",...e,slide:{...s,src:n,srcSet:void 0},style:T}))}function Sf({render:e,slide:t,offset:r,rect:n}){var o;const[a,s]=E.useState(),l=E.useRef(null),f=rr(t),{zoom:h,maxZoom:c,offsetX:i,offsetY:u,setZoomWrapper:g}=Bo(),p=h>1,{carousel:m,on:v}=at(),{currentIndex:x}=Pt();jt(()=>{if(r!==0||f||!l.current)return()=>{};const w=()=>{const A=l.current;if(!A)return;let _=0,I=0;for(const k of A.children)k instanceof HTMLElement&&(_=Math.max(_,k.offsetWidth),I=Math.max(I,k.offsetHeight));s(k=>k&&k.width===_&&k.height===I?k:{width:_,height:I})};if(w(),typeof ResizeObserver>"u")return()=>{};const T=new ResizeObserver(w);for(const A of l.current.children)T.observe(A);return()=>T.disconnect()},[r,f,n]),jt(()=>r===0?(g({zoomWrapperRef:l,imageDimensions:a}),()=>g(void 0)):()=>{},[r,a,g]);let M=(o=e.slide)===null||o===void 0?void 0:o.call(e,{slide:t,offset:r,rect:n,zoom:h,maxZoom:c});if(!M&&f){const w={slide:t,offset:r,rect:n,render:e,imageFit:m.imageFit,imageProps:m.imageProps,onClick:r===0?()=>{var T;return(T=v.click)===null||T===void 0?void 0:T.call(v,{index:x})}:void 0};M=xf(t)?E.createElement(Cf,{...w,slide:t,interactive:p,rect:r===0?{width:n.width*h,height:n.height*h}:n}):E.createElement(cr,{onLoad:T=>s({width:T.naturalWidth,height:T.naturalHeight}),...w})}return M?E.createElement("div",{ref:l,className:ft(pe(As),pe(Tr),pe(Os),p&&pe(cu)),style:r===0?{transform:`scale(${h}) translateX(${i}px) translateY(${u}px)`}:void 0},M):null}const _f=({augment:e,addModule:t})=>{e(({zoom:r,toolbar:n,render:o,controller:a,...s})=>{const l=vl(r);return{zoom:l,toolbar:En(n,Ns,E.createElement(wf,null)),render:{...o,slide:f=>{var h,c;return rr(f.slide)||f.slide.type!=null&&(!((h=l.supports)===null||h===void 0)&&h.includes(f.slide.type))?E.createElement(Sf,{render:o,...f}):(c=o.slide)===null||c===void 0?void 0:c.call(o,f)}},controller:{...a,preventDefaultWheelY:l.scrollToZoom},...s}}),t(Lt(Ns,mf))},Ef={separator:"/",container:{}},Sl=e=>({...Ef,...e});function Tf({counter:e}){const{slides:t,currentIndex:r}=Pt(),{separator:n,container:{className:o,...a},className:s,...l}=Sl(e);return t.length===0?null:E.createElement("div",{className:ft(pe("counter"),o||s),...l,...a,"aria-hidden":!0},r+1," ",n," ",t.length)}function Nf({augment:e,addChild:t}){e(({counter:r,...n})=>({counter:Sl(r),...n})),t(Xr,Lt(ru,Tf))}const Af={autoplay:!1,delay:3e3,ref:null},_l=e=>({...Af,...e}),El=E.createContext(null),Mf=Tt("useSlideshow","SlideshowContext",El);function Of({slideshow:e,carousel:{finite:t},on:r,children:n}){const{autoplay:o,delay:a,ref:s}=_l(e),l=E.useRef(o),[f,h]=E.useState(o),c=E.useRef(void 0),i=E.useRef(void 0),{slides:u,currentIndex:g}=Pt(),{setTimeout:p,clearTimeout:m}=en(),{subscribe:v}=Ir(),{next:x}=Wt(),{setAutoPlaying:M}=Fo();E.useEffect(()=>M(f),[f,M]);const w=u.length===0||t&&g===u.length-1,T=E.useCallback(()=>{!f&&!w&&h(!0)},[f,w]),A=E.useCallback(()=>{f&&h(!1)},[f]),_=E.useCallback(()=>{m(c.current),c.current=void 0},[m]),I=Le(()=>{_(),!(!f||w||i.current===Er||i.current===Co)&&(c.current=p(()=>{f&&(i.current=void 0,x())},a))});E.useEffect(I,[g,f,I]),E.useEffect(()=>{f&&w&&h(!1)},[g,f,w]);const k=Le(()=>{var D;return(D=r.slideshowStart)===null||D===void 0?void 0:D.call(r)}),y=Le(()=>{var D;return(D=r.slideshowStop)===null||D===void 0?void 0:D.call(r)});E.useEffect(()=>{f?k():l.current&&y(),l.current=f},[f,k,y]),E.useEffect(()=>Ar(_,v(ou,()=>{i.current=Er,_()}),v(au,()=>{i.current=Co,_()}),v(su,()=>{i.current=Qr,I()}),v(lu,()=>{i.current=Jr,I()})),[v,_,I]);const N=E.useMemo(()=>({playing:f,disabled:w,play:T,pause:A}),[f,w,T,A]);return E.useImperativeHandle(s,()=>N,[N]),E.createElement(El.Provider,{value:N},n)}const If=vt("Play",E.createElement("path",{d:"M8 5v14l11-7z"})),Df=vt("Pause",E.createElement("path",{d:"M6 19h4V5H6v14zm8-14v14h4V5h-4z"}));function Lf(){const{playing:e,disabled:t,play:r,pause:n}=Mf(),{render:o}=at(),a=nl(Wt().focus,t);return o.buttonSlideshow?E.createElement(E.Fragment,null,o.buttonSlideshow({playing:e,disabled:t,play:r,pause:n})):E.createElement(Dr,{label:e?"Pause":"Play",icon:e?Df:If,renderIcon:e?o.iconSlideshowPause:o.iconSlideshowPlay,onClick:e?n:r,disabled:t,...a})}function Pf({augment:e,addModule:t}){e(({slideshow:r,toolbar:n,...o})=>({toolbar:En(n,Ts,E.createElement(Lf,null)),slideshow:_l(r),...o})),t(Lt(Ts,Of))}const Ff={auto:!1,ref:null},Tl=e=>({...Ff,...e}),Nl=E.createContext(null),$f=Tt("useFullscreen","FullscreenContext",Nl);function Uf({fullscreen:e,on:t,children:r}){const{auto:n,ref:o}=Tl(e),a=E.useRef(null),[s,l]=E.useState(),[f,h]=E.useState(!1),c=E.useRef(!1),{getOwnerDocument:i}=Or();jt(()=>{var w,T,A,_;const I=i();l(!((_=(A=(T=(w=I.fullscreenEnabled)!==null&&w!==void 0?w:I.webkitFullscreenEnabled)!==null&&T!==void 0?T:I.mozFullScreenEnabled)!==null&&A!==void 0?A:I.msFullscreenEnabled)!==null&&_!==void 0&&_))},[i]);const u=E.useCallback(()=>{var w;const T=i(),A=T.fullscreenElement||T.webkitFullscreenElement||T.mozFullScreenElement||T.msFullscreenElement;return((w=A?.shadowRoot)===null||w===void 0?void 0:w.fullscreenElement)||A},[i]),g=E.useCallback(()=>{const w=a.current;try{w.requestFullscreen?w.requestFullscreen().catch(()=>{}):w.webkitRequestFullscreen?w.webkitRequestFullscreen():w.mozRequestFullScreen?w.mozRequestFullScreen():w.msRequestFullscreen&&w.msRequestFullscreen()}catch{}},[]),p=E.useCallback(()=>{if(!u())return;const w=i();try{w.exitFullscreen?w.exitFullscreen().catch(()=>{}):w.webkitExitFullscreen?w.webkitExitFullscreen():w.mozCancelFullScreen?w.mozCancelFullScreen():w.msExitFullscreen&&w.msExitFullscreen()}catch{}},[u,i]);E.useEffect(()=>{const w=i(),T=()=>{h(u()===a.current)};return Ar(...["fullscreenchange","webkitfullscreenchange","mozfullscreenchange","MSFullscreenChange"].map(A=>(w.addEventListener(A,T),()=>w.removeEventListener(A,T))))},[u,i]);const m=Le(()=>{var w;return(w=t.enterFullscreen)===null||w===void 0?void 0:w.call(t)}),v=Le(()=>{var w;return(w=t.exitFullscreen)===null||w===void 0?void 0:w.call(t)});E.useEffect(()=>{f&&(c.current=!0),c.current&&(f?m:v)()},[f,m,v]);const x=Le(()=>{var w;return(w=n?g:null)===null||w===void 0||w(),p});E.useEffect(x,[x]);const M=E.useMemo(()=>({fullscreen:f,disabled:s,enter:g,exit:p}),[f,s,g,p]);return E.useImperativeHandle(o,()=>M,[M]),E.createElement("div",{ref:a,className:ft(pe(Zr),pe(As))},E.createElement(Nl.Provider,{value:M},r))}const zf=vt("EnterFullscreen",E.createElement("path",{d:"M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"})),Hf=vt("ExitFullscreen",E.createElement("path",{d:"M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z"}));function Gf(){var e;const{fullscreen:t,disabled:r,enter:n,exit:o}=$f(),{render:a}=at();return r?null:a.buttonFullscreen?E.createElement(E.Fragment,null,(e=a.buttonFullscreen)===null||e===void 0?void 0:e.call(a,{fullscreen:t,disabled:r,enter:n,exit:o})):E.createElement(Dr,{disabled:r,label:t?"Exit Fullscreen":"Enter Fullscreen",icon:t?Hf:zf,renderIcon:t?a.iconExitFullscreen:a.iconEnterFullscreen,onClick:t?o:n})}function jf({augment:e,contains:t,addParent:r}){e(({fullscreen:n,toolbar:o,...a})=>({toolbar:En(o,Zr,E.createElement(Gf,null)),fullscreen:Tl(n),...a})),r(t(qr)?qr:Xr,Lt(Zr,Uf))}const ur={ref:null,position:"bottom",width:120,height:80,border:1,borderRadius:4,padding:4,gap:16,imageFit:"contain",vignette:!0,hidden:!1,showToggle:!1},Wo=e=>({...ur,...e});function Al(){const{thumbnails:e}=at();return Wo(e)}const fr=e=>sr(qr,e),st=e=>fr(sr("thumbnail",e)),Bf=vt("VideoThumbnail",E.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"})),Wf=vt("UnknownThumbnail",E.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"}));function Kf({slide:e,render:t,rect:r,imageFit:n}){var o;const a=(o=t.thumbnail)===null||o===void 0?void 0:o.call(t,{slide:e,render:t,rect:r,imageFit:n});if(a)return a;const s={render:t,rect:r,imageFit:n};if(e.thumbnail)return E.createElement(cr,{slide:{src:e.thumbnail},...s});if(rr(e))return E.createElement(cr,{slide:e,...s});const l=pe(st(Cn));return e.type==="video"?E.createElement(E.Fragment,null,e.poster&&E.createElement(cr,{slide:{src:e.poster},...s}),E.createElement(Bf,{className:l})):E.createElement(Wf,{className:l})}const Vf=lr("active"),Ko=lr("fadein"),Vo=lr("fadeout"),Yf=lr("placeholder"),Ml="delay",Ol="duration";function Xf({slide:e,index:t,onClick:r,fadeIn:n,fadeOut:o,placeholder:a,onLoseFocus:s}){const l=E.useRef(null),{render:f,styles:h,labels:c}=at(),{slides:i,globalIndex:u}=Pt(),{getOwnerDocument:g}=Or(),{width:p,height:m,imageFit:v}=Al(),x={width:p,height:m},M=t===u,w=Le(s);return E.useEffect(()=>{o&&g().activeElement===l.current&&w()},[o,w,g]),E.createElement("button",{ref:l,type:"button",className:ft(pe(Tr),pe(st()),M&&pe(st(Vf())),n&&pe(st(Ko())),o&&pe(st(Vo())),a&&pe(st(Yf()))),style:{...n?{[Ve(st(Ko(Ol)))]:`${n.duration}ms`,[Ve(st(Ko(Ml)))]:`${n.delay}ms`}:null,...o?{[Ve(st(Vo(Ol)))]:`${o.duration}ms`,[Ve(st(Vo(Ml)))]:`${o.delay}ms`}:null,...h.thumbnail},onClick:r,"aria-current":M?!0:void 0,"aria-label":Gs(c,i,t)},e&&Kf({slide:e,render:f,rect:x,imageFit:v}))}function Il(e){return["top","bottom"].includes(e)}function Dl(e,t){return t+2*(e.border+e.padding)+e.gap}function Zf(e){const{thumbnail:t,poster:r}=e||{thumbnail:"placeholder"};return typeof t=="string"&&t||typeof r=="string"&&r||e&&js(e)||void 0}function Ll({visible:e,containerRef:t}){const r=E.useRef(null),n=Nn(),{publish:o,subscribe:a}=Ir(),{carousel:s,styles:l,labels:f}=at(),{slides:h,globalIndex:c,animation:i}=Pt(),{registerSensors:u,subscribeSensors:g}=ol();ul(g);const p=Al(),{position:m,width:v,height:x,border:M,borderStyle:w,borderColor:T,borderRadius:A,padding:_,gap:I,vignette:k}=p,y=i?.duration!==void 0&&i?.increment||0,N=i?.duration||0,{prepareAnimation:D}=Uo(r,S=>({keyframes:Il(m)?[{transform:`translateX(${(n?-1:1)*Dl(p,v)*y+S}px)`},{transform:"translateX(0)"}]:[{transform:`translateY(${Dl(p,x)*y+S}px)`},{transform:"translateY(0)"}],duration:N,easing:i?.easing})),P=Le(()=>{let S=0;if(t.current&&r.current){const b=t.current.getBoundingClientRect(),z=r.current.getBoundingClientRect();S=Il(m)?z.left-b.left-(b.width-z.width)/2:z.top-b.top-(b.height-z.height)/2}D(S)});E.useEffect(()=>Ar(a(_o,P)),[a,P]);const O=Bs(s,h),L=[];if(Io(h))for(let S=c-O-Math.abs(y);S<=c+O+Math.abs(y);S+=1){const z=s.finite&&(S<0||S>h.length-1)||y<0&&S0&&S>c+O?null:Do(h,S),U=[`${S}`,Zf(z)].filter(Boolean).join("|");L.push({key:U,index:S,slide:z})}const $=S=>()=>{S>c?o(tr,{count:S-c}):S{const U=N/Math.abs(y||1),G=y>0&&b>c+O-y&&b<=c+O||y<0&&b=c-O?{duration:U,delay:((y>0?b-(c+O-y):c-O-y-b)-1)*U}:void 0,Y=y>0&&bc+O?{duration:U,delay:(y>0?y-(c-O-b):-y-(b-(c+O)))*U}:void 0;return E.createElement(Xf,{key:S,index:b,slide:z,fadeIn:G,fadeOut:Y,placeholder:!z,onClick:$(b),onLoseFocus:()=>{var B;return(B=r.current)===null||B===void 0?void 0:B.focus()}})})),k&&E.createElement("div",{className:pe(fr("vignette"))}))}const Pl=E.createContext(null),qf=Tt("useThumbnails","ThumbnailsContext",Pl);function Qf({children:e,...t}){const{ref:r,position:n,hidden:o}=Wo(t.thumbnails),[a,s]=E.useState(!o),l=E.useRef(null),f=E.useMemo(()=>({visible:a,show:()=>s(!0),hide:()=>s(!1)}),[a]);return E.useImperativeHandle(r,()=>f,[f]),E.createElement(Zs,{...t},E.createElement(Pl.Provider,{value:f},E.createElement("div",{ref:l,className:ft(pe(fr()),pe(fr(`${n}`)))},["start","top"].includes(n)&&E.createElement(Ll,{containerRef:l,visible:a}),E.createElement("div",{className:pe(fr("wrapper"))},e),["end","bottom"].includes(n)&&E.createElement(Ll,{containerRef:l,visible:a}))))}const Fl=()=>E.createElement(E.Fragment,null,E.createElement("path",{strokeWidth:2,stroke:"currentColor",strokeLinejoin:"round",fill:"none",d:"M3 5l18 0l0 14l-18 0l0-14z"}),E.createElement("path",{d:"M5 14h4v3h-4zM10 14h4v3h-4zM15 14h4v3h-4z"})),Jf=vt("ThumbnailsVisible",Fl()),Rf=Mu("ThumbnailsHidden",Fl());function eg(){const{visible:e,show:t,hide:r}=qf(),{render:n}=at();return n.buttonThumbnails?E.createElement(E.Fragment,null,n.buttonThumbnails({visible:e,show:t,hide:r})):E.createElement(Dr,{label:e?"Hide thumbnails":"Show thumbnails",icon:e?Jf:Rf,renderIcon:e?n.iconThumbnailsVisible:n.iconThumbnailsHidden,onClick:e?r:t})}function tg({augment:e,contains:t,append:r,addParent:n}){e(({thumbnails:a,toolbar:s,...l})=>{const f=Wo(a);return{toolbar:En(s,qr,f.showToggle?E.createElement(eg,null):null),thumbnails:f,...l}});const o=Lt(qr,Qf);t(Zr)?r(Zr,o):n(Xr,o)}const Nt=({className:e="",children:t,style:r,...n})=>d.jsx("i",{className:e,style:r,...n,children:t}),Yo=window.G7Core,Mn=(e,t)=>Yo?.t?.(e,t)??e,rg=async(e,t)=>{try{const r=await Yo.api.get(e,{responseType:"blob"});if(r){const n=URL.createObjectURL(r),o=document.createElement("a");o.href=n,o.download=t,document.body.appendChild(o),o.click(),document.body.removeChild(o),URL.revokeObjectURL(n)}}catch(r){console.error("Failed to download file:",r),Yo?.toast?.error?.(Mn("common.download_failed"))}},ng=(e,t)=>{const r=document.createElement("a");r.href=e,r.download=t,r.target="_blank",document.body.appendChild(r),r.click(),document.body.removeChild(r)},$l=async e=>{const t=e.downloadUrl||e.src,r=e.filename||e.title||"image";e.downloadRequiresAuth?await rg(t,r):ng(t,r)},og=({image:e,index:t,onDownload:r})=>{const[n,o]=C.useState(!1),a=async s=>{if(s.stopPropagation(),r){r(e,t);return}o(!0);try{await $l(e)}finally{o(!1)}};return d.jsx(Q,{type:"button",onClick:a,disabled:n,className:"yarl__button flex items-center justify-center","aria-label":Mn("common.download"),title:Mn("common.download"),children:n?d.jsx(Nt,{className:"fa-solid fa-spinner fa-spin text-white"}):d.jsx(Nt,{className:"fa-solid fa-download text-white"})})},Lr=({images:e,isOpen:t,onClose:r,startIndex:n=0,enableZoom:o=!0,enableSlideshow:a=!1,enableFullscreen:s=!0,showCounter:l=!0,showDownload:f=!0,showThumbnails:h=!0,onDownload:c,editorAttrs:i,id:u})=>{const[g,p]=C.useState(n),m=C.useRef(n),v=e.map(w=>({src:w.src,title:w.title,description:w.description})),x=[];o&&x.push(_f),a&&x.push(Pf),s&&x.push(jf),l&&x.push(Nf),h&&x.push(tg);const M=e[g];if(C.useEffect(()=>{m.current=g},[g]),i){const w=(e??[]).slice(0,4);return d.jsx(W,{id:u,className:"grid grid-cols-2 gap-2 p-3 rounded-lg border border-dashed border-gray-300 dark:border-gray-600 bg-gray-50 dark:bg-gray-800",...i,children:w.length>0?w.map((T,A)=>d.jsx(Ht,{src:T.thumbnail||T.src,alt:T.title||"",className:"w-full aspect-square object-cover rounded bg-gray-200 dark:bg-gray-700"},A)):d.jsxs(W,{className:"col-span-2 flex items-center justify-center py-6 text-sm text-gray-400 dark:text-gray-500",children:[d.jsx(Nt,{className:"fa-regular fa-images mr-2"}),Mn("editor.component.image_gallery")]})})}return d.jsx(lf,{open:t,close:r,slides:v,index:g,plugins:x,on:{view:({index:w})=>{w!==m.current&&p(w)}},zoom:{maxZoomPixelRatio:3,zoomInMultiplier:2,doubleTapDelay:300,doubleClickDelay:300,doubleClickMaxStops:2,keyboardMoveDistance:50,wheelZoomDistanceFactor:100,pinchZoomDistanceFactor:100,scrollToZoom:!0},carousel:{finite:!0,preload:2,padding:"16px",spacing:"30%"},animation:{fade:250,swipe:500,easing:{fade:"ease",swipe:"ease-out",navigation:"ease-in-out"}},controller:{closeOnBackdropClick:!0,closeOnPullDown:!0,closeOnPullUp:!0},thumbnails:{position:"bottom",width:120,height:80,border:2,borderRadius:4,padding:4,gap:16,showToggle:!1,vignette:!0},toolbar:{buttons:[f&&M&&d.jsx(og,{image:M,index:g,onDownload:c},"download"),"close"].filter(Boolean)},styles:{container:{backgroundColor:"rgba(0, 0, 0, 0.9)"}}})},Ul=()=>{const[e,t]=C.useState(!1),[r,n]=C.useState([]),[o,a]=C.useState(0),s=C.useCallback((f,h=0)=>{n(f),a(h),t(!0)},[]),l=C.useCallback(()=>{t(!1)},[]);return{isOpen:e,openGallery:s,closeGallery:l,galleryProps:{images:r,isOpen:e,onClose:l,startIndex:o}}};Lr.displayName="ImageGallery";const zl=Object.freeze(Object.defineProperty({__proto__:null,ImageGallery:Lr,default:Lr,executeImageDownload:$l,useImageGallery:Ul},Symbol.toStringTag,{value:"Module"})),ag=window.G7Core,Xo=(e,t)=>ag?.t?.(e,t)??e,On=e=>e.url??e.download_url,In=({images:e=[],className:t="",id:r,editorAttrs:n})=>{const[o,a]=C.useState(0),{openGallery:s,galleryProps:l}=Ul(),f=C.useMemo(()=>e.map(c=>({src:On(c),title:c.alt_text_current??"",thumbnail:On(c),downloadUrl:c.download_url,filename:c.alt_text_current??`image-${c.id}`})),[e]);if(!e||e.length===0)return d.jsx(W,{className:`flex items-center justify-center bg-gray-100 dark:bg-gray-700 rounded-lg aspect-square ${t}`,id:r,...n,children:d.jsxs(W,{className:"text-center text-gray-400 dark:text-gray-500",children:[d.jsx(fe,{name:"image",size:"3x",className:"mb-3 opacity-50"}),d.jsx(W,{className:"text-sm",children:Xo("shop.no_image")})]})});const h=e[o]??e[0];return d.jsxs(W,{id:r,className:t,...n,children:[d.jsx(W,{className:"relative overflow-hidden rounded-lg bg-gray-100 dark:bg-gray-700 aspect-square mb-3",children:d.jsx(Q,{type:"button",className:"w-full h-full cursor-zoom-in block",onClick:()=>s(f,o),"aria-label":Xo("shop.view_image"),children:d.jsx(Ht,{src:On(h),alt:h.alt_text_current??"",className:"w-full h-full object-contain"})})}),e.length>1&&d.jsx(W,{className:"flex gap-2 overflow-x-auto pb-1",children:e.map((c,i)=>d.jsx(Q,{type:"button",className:`flex-shrink-0 w-16 h-16 rounded-md overflow-hidden border-2 transition-colors cursor-pointer ${i===o?"border-gray-900 dark:border-white":"border-gray-200 dark:border-gray-600 hover:border-gray-400 dark:hover:border-gray-400"}`,onClick:()=>a(i),"aria-label":c.alt_text_current??`${Xo("shop.image")} ${i+1}`,children:d.jsx(Ht,{src:On(c),alt:c.alt_text_current??"",className:"w-full h-full object-cover"})},c.id))}),d.jsx(Lr,{...l})]})};In.displayName="ProductImageViewer";const sg=Object.freeze(Object.defineProperty({__proto__:null,ProductImageViewer:In,default:In},Symbol.toStringTag,{value:"Module"})),Hl=({value:e,min:t=1,max:r=999,onChange:n,size:o="md",disabled:a=!1,className:s="",id:l,editorAttrs:f})=>{const c={sm:{container:"h-8",button:"w-8 h-8 text-sm",input:"w-10 text-sm"},md:{container:"h-10",button:"w-10 h-10",input:"w-14"},lg:{container:"h-12",button:"w-12 h-12 text-lg",input:"w-16 text-lg"}}[o],i=()=>{e>t&&!a&&n(e-1)},u=()=>{e{const M=parseInt(x.target.value,10);if(!isNaN(M)){const w=Math.max(t,Math.min(r,M));n(w)}},p=x=>{const M=parseInt(x.target.value,10);isNaN(M)||Mr&&n(r)},m=a||e<=t,v=a||e>=r;return d.jsxs(W,{className:`inline-flex items-center border border-gray-300 dark:border-gray-600 rounded-lg ${c.container} ${s}`,id:l,...f,children:[d.jsx(Q,{type:"button",onClick:i,disabled:m,className:`${c.button} flex items-center justify-center text-gray-600 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-50 disabled:cursor-not-allowed rounded-l-lg transition-colors`,"aria-label":"수량 감소",children:d.jsx(fe,{name:"minus",className:"w-4 h-4"})}),d.jsx(_t,{type:"number",value:e,onChange:g,onBlur:p,min:t,max:r,disabled:a,className:`${c.input} text-center border-x border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-800 text-gray-900 dark:text-white focus:outline-none disabled:opacity-50 disabled:cursor-not-allowed [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none`,"aria-label":"수량"}),d.jsx(Q,{type:"button",onClick:u,disabled:v,className:`${c.button} flex items-center justify-center text-gray-600 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 disabled:opacity-50 disabled:cursor-not-allowed rounded-r-lg transition-colors`,"aria-label":"수량 증가",children:d.jsx(fe,{name:"plus",className:"w-4 h-4"})})]})},lg=Object.freeze(Object.defineProperty({__proto__:null,default:Hl},Symbol.toStringTag,{value:"Module"})),ig=window.G7Core?.createLogger?.("Comp:PostReactions")??{log:(...e)=>console.log("[Comp:PostReactions]",...e),warn:(...e)=>console.warn("[Comp:PostReactions]",...e),error:(...e)=>console.error("[Comp:PostReactions]",...e)},Gl=(e,t)=>window.G7Core?.t?.(e,t)??e,cg=[{type:"like",emoji:"👍",labelKey:"board.reactions.like",activeColor:"bg-blue-100 dark:bg-blue-900/30 text-blue-600 dark:text-blue-400"},{type:"funny",emoji:"😂",labelKey:"board.reactions.funny",activeColor:"bg-yellow-100 dark:bg-yellow-900/30 text-yellow-600 dark:text-yellow-400"},{type:"agree",emoji:"👌",labelKey:"board.reactions.agree",activeColor:"bg-green-100 dark:bg-green-900/30 text-green-600 dark:text-green-400"},{type:"thanks",emoji:"🙏",labelKey:"board.reactions.thanks",activeColor:"bg-purple-100 dark:bg-purple-900/30 text-purple-600 dark:text-purple-400"},{type:"wow",emoji:"😮",labelKey:"board.reactions.wow",activeColor:"bg-orange-100 dark:bg-orange-900/30 text-orange-600 dark:text-orange-400"}],jl=({reactions:e,userReaction:t,postId:r,onReact:n,size:o="md",className:a="",id:s,editorAttrs:l})=>{const f={sm:"px-2 py-1 text-xs gap-1",md:"px-3 py-1.5 text-sm gap-1.5",lg:"px-4 py-2 text-base gap-2"},h={sm:"text-sm",md:"text-base",lg:"text-lg"},c=u=>e.find(p=>p.type===u)?.count??0,i=async u=>{if(n){n(u);return}try{if(!(await fetch(`/api/posts/${r}/reactions`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({type:u}),credentials:"include"})).ok)throw new Error("리액션 처리 실패");window.location.reload()}catch(g){ig.error("리액션 오류:",g)}};return d.jsx(W,{className:`flex flex-wrap gap-2 ${a}`,id:s,...l,children:cg.map(u=>{const g=c(u.type),p=t===u.type;return d.jsxs(Q,{onClick:()=>i(u.type),className:` inline-flex items-center rounded-full border transition-colors - ${g[o]} + ${f[o]} ${p?`${u.activeColor} border-transparent`:"border-gray-300 dark:border-gray-600 text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700"} - `,title:Ml(u.labelKey),children:[d.jsx(te,{className:h[o],children:u.emoji}),d.jsx(te,{children:Ml(u.labelKey)}),f>0&&d.jsx(te,{className:"font-medium",children:f})]},u.type)})})},jf=Object.freeze(Object.defineProperty({__proto__:null,default:Ol},Symbol.toStringTag,{value:"Module"})),Mn=window.G7Core?.createLogger?.("Comp:RichTextEditor")??{log:(...e)=>console.log("[Comp:RichTextEditor]",...e),warn:(...e)=>console.warn("[Comp:RichTextEditor]",...e),error:(...e)=>console.error("[Comp:RichTextEditor]",...e)},St=(e,t)=>window.G7Core?.t?.(e,t)??e,Il=({name:e,initialValue:t="",placeholder:r,onChange:n,imageUploadUrl:o="/api/upload/image",minHeight:a="300px",disabled:s=!1,className:l="",id:g,editorAttrs:h})=>{const c=k.useRef(null),[i,u]=k.useState(t),[f,p]=k.useState(!1),[m,w]=k.useState(!1),[x,A]=k.useState("");k.useEffect(()=>{c.current&&!c.current.innerHTML&&(c.current.innerHTML=t)},[t]),k.useEffect(()=>{n&&n(i)},[i,n]);const v=N=>{Mn.log("Apply format:",N)},E=async N=>{const M=new FormData;M.append("file",N);try{const P=await fetch(o,{method:"POST",body:M,credentials:"include"});if(!P.ok)throw new Error("업로드 실패");const D=await P.json();Mn.log("Image uploaded:",D.url)}catch(P){Mn.error("이미지 업로드 오류:",P)}},O=N=>{const M=N.target.files?.[0];M&&E(M)},_=()=>{x&&(Mn.log("Insert link:",x),w(!1),A(""))},I=[{format:"bold",icon:"B",title:St("editor.toolbar.bold")},{format:"italic",icon:"I",title:St("editor.toolbar.italic")},{format:"underline",icon:"U",title:St("editor.toolbar.underline")},{format:"strike",icon:"S",title:St("editor.toolbar.strike")},{format:"code",icon:"",title:St("editor.toolbar.code")}],C=[{format:"h1",label:"H1"},{format:"h2",label:"H2"},{format:"h3",label:"H3"}],y=[{format:"bulletList",icon:"•",title:St("editor.toolbar.bullet_list")},{format:"orderedList",icon:"1.",title:St("editor.toolbar.ordered_list")},{format:"blockquote",icon:"❝",title:St("editor.toolbar.blockquote")}];return d.jsxs(W,{className:`border border-gray-300 dark:border-gray-600 rounded-lg overflow-hidden ${l}`,id:g,...h,children:[d.jsxs(W,{className:"flex flex-wrap items-center gap-1 p-2 bg-gray-50 dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700",children:[d.jsx(W,{className:"flex items-center gap-1 pr-2 border-r border-gray-200 dark:border-gray-700",children:I.map(N=>d.jsx(Q,{type:"button",onClick:()=>v(N.format),disabled:s,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",title:N.title,children:N.icon},N.format))}),d.jsx(W,{className:"flex items-center gap-1 pr-2 border-r border-gray-200 dark:border-gray-700",children:C.map(N=>d.jsx(Q,{type:"button",onClick:()=>v(N.format),disabled:s,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",children:N.label},N.format))}),d.jsx(W,{className:"flex items-center gap-1 pr-2 border-r border-gray-200 dark:border-gray-700",children:y.map(N=>d.jsx(Q,{type:"button",onClick:()=>v(N.format),disabled:s,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",title:N.title,children:N.icon},N.format))}),d.jsxs(W,{className:"flex items-center gap-1 pr-2 border-r border-gray-200 dark:border-gray-700",children:[d.jsx(Q,{type:"button",onClick:()=>w(!0),disabled:s,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",title:St("editor.toolbar.link"),children:"🔗"}),d.jsxs(yr,{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 cursor-pointer",children:["🖼",d.jsx(xt,{type:"file",accept:"image/*",onChange:O,disabled:s,className:"hidden"})]})]}),d.jsxs(Q,{type:"button",onClick:()=>p(!f),disabled:s,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 ${f?"bg-gray-200 dark:bg-gray-700":""}`,children:["",St("editor.toolbar.code_view")]})]}),f?d.jsx(no,{value:i,onChange:N=>u(N.target.value),placeholder:r,disabled:s,className:"w-full p-4 bg-gray-900 text-gray-100 font-mono text-sm focus:outline-none resize-none",style:{minHeight:a}}):d.jsx(W,{ref:c,contentEditable:!s,onInput:N=>u(N.currentTarget.innerHTML),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",style:{minHeight:a},"data-placeholder":r}),d.jsx(xt,{type:"hidden",name:e,value:i}),m&&d.jsx(W,{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/50",children:d.jsxs(W,{className:"bg-white dark:bg-gray-800 rounded-lg p-6 w-96",children:[d.jsx(gn,{className:"text-lg font-medium text-gray-900 dark:text-white mb-4",children:St("editor.link_modal.title")}),d.jsx(xt,{type:"url",value:x,onChange:N=>A(N.target.value),placeholder:"https://example.com",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"}),d.jsxs(W,{className:"flex justify-end gap-2",children:[d.jsx(Q,{type:"button",onClick:()=>{w(!1),A("")},className:"px-4 py-2 text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg",children:St("common.cancel")}),d.jsx(Q,{type:"button",onClick:_,className:"px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700",children:St("editor.link_modal.insert")})]})]})})]})},Bf=Object.freeze(Object.defineProperty({__proto__:null,default:Il},Symbol.toStringTag,{value:"Module"})),Yo=({content:e,text:t,isHtml:r=!0,className:n="",purifyConfig:o,id:a,editorAttrs:s})=>{const l=t??e??"";if(!l||l.trim()==="")return null;if(!r){const i=` + `,title:Gl(u.labelKey),children:[d.jsx(re,{className:h[o],children:u.emoji}),d.jsx(re,{children:Gl(u.labelKey)}),g>0&&d.jsx(re,{className:"font-medium",children:g})]},u.type)})})},dg=Object.freeze(Object.defineProperty({__proto__:null,default:jl},Symbol.toStringTag,{value:"Module"})),Dn=window.G7Core?.createLogger?.("Comp:RichTextEditor")??{log:(...e)=>console.log("[Comp:RichTextEditor]",...e),warn:(...e)=>console.warn("[Comp:RichTextEditor]",...e),error:(...e)=>console.error("[Comp:RichTextEditor]",...e)},At=(e,t)=>window.G7Core?.t?.(e,t)??e,Bl=({name:e,initialValue:t="",placeholder:r,onChange:n,imageUploadUrl:o="/api/upload/image",minHeight:a="300px",disabled:s=!1,className:l="",id:f,editorAttrs:h})=>{const c=C.useRef(null),[i,u]=C.useState(t),[g,p]=C.useState(!1),[m,v]=C.useState(!1),[x,M]=C.useState("");C.useEffect(()=>{c.current&&!c.current.innerHTML&&(c.current.innerHTML=t)},[t]),C.useEffect(()=>{n&&n(i)},[i,n]);const w=N=>{Dn.log("Apply format:",N)},T=async N=>{const D=new FormData;D.append("file",N);try{const P=await fetch(o,{method:"POST",body:D,credentials:"include"});if(!P.ok)throw new Error("업로드 실패");const O=await P.json();Dn.log("Image uploaded:",O.url)}catch(P){Dn.error("이미지 업로드 오류:",P)}},A=N=>{const D=N.target.files?.[0];D&&T(D)},_=()=>{x&&(Dn.log("Insert link:",x),v(!1),M(""))},I=[{format:"bold",icon:"B",title:At("editor.toolbar.bold")},{format:"italic",icon:"I",title:At("editor.toolbar.italic")},{format:"underline",icon:"U",title:At("editor.toolbar.underline")},{format:"strike",icon:"S",title:At("editor.toolbar.strike")},{format:"code",icon:"",title:At("editor.toolbar.code")}],k=[{format:"h1",label:"H1"},{format:"h2",label:"H2"},{format:"h3",label:"H3"}],y=[{format:"bulletList",icon:"•",title:At("editor.toolbar.bullet_list")},{format:"orderedList",icon:"1.",title:At("editor.toolbar.ordered_list")},{format:"blockquote",icon:"❝",title:At("editor.toolbar.blockquote")}];return d.jsxs(W,{className:`border border-gray-300 dark:border-gray-600 rounded-lg overflow-hidden ${l}`,id:f,...h,children:[d.jsxs(W,{className:"flex flex-wrap items-center gap-1 p-2 bg-gray-50 dark:bg-gray-800 border-b border-gray-200 dark:border-gray-700",children:[d.jsx(W,{className:"flex items-center gap-1 pr-2 border-r border-gray-200 dark:border-gray-700",children:I.map(N=>d.jsx(Q,{type:"button",onClick:()=>w(N.format),disabled:s,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",title:N.title,children:N.icon},N.format))}),d.jsx(W,{className:"flex items-center gap-1 pr-2 border-r border-gray-200 dark:border-gray-700",children:k.map(N=>d.jsx(Q,{type:"button",onClick:()=>w(N.format),disabled:s,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",children:N.label},N.format))}),d.jsx(W,{className:"flex items-center gap-1 pr-2 border-r border-gray-200 dark:border-gray-700",children:y.map(N=>d.jsx(Q,{type:"button",onClick:()=>w(N.format),disabled:s,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",title:N.title,children:N.icon},N.format))}),d.jsxs(W,{className:"flex items-center gap-1 pr-2 border-r border-gray-200 dark:border-gray-700",children:[d.jsx(Q,{type:"button",onClick:()=>v(!0),disabled:s,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",title:At("editor.toolbar.link"),children:"🔗"}),d.jsxs(vr,{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 cursor-pointer",children:["🖼",d.jsx(_t,{type:"file",accept:"image/*",onChange:A,disabled:s,className:"hidden"})]})]}),d.jsxs(Q,{type:"button",onClick:()=>p(!g),disabled:s,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 ${g?"bg-gray-200 dark:bg-gray-700":""}`,children:["",At("editor.toolbar.code_view")]})]}),g?d.jsx(lo,{value:i,onChange:N=>u(N.target.value),placeholder:r,disabled:s,className:"w-full p-4 bg-gray-900 text-gray-100 font-mono text-sm focus:outline-none resize-none",style:{minHeight:a}}):d.jsx(W,{ref:c,contentEditable:!s,onInput:N=>u(N.currentTarget.innerHTML),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",style:{minHeight:a},"data-placeholder":r}),d.jsx(_t,{type:"hidden",name:e,value:i}),m&&d.jsx(W,{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/50",children:d.jsxs(W,{className:"bg-white dark:bg-gray-800 rounded-lg p-6 w-96",children:[d.jsx(bn,{className:"text-lg font-medium text-gray-900 dark:text-white mb-4",children:At("editor.link_modal.title")}),d.jsx(_t,{type:"url",value:x,onChange:N=>M(N.target.value),placeholder:"https://example.com",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"}),d.jsxs(W,{className:"flex justify-end gap-2",children:[d.jsx(Q,{type:"button",onClick:()=>{v(!1),M("")},className:"px-4 py-2 text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg",children:At("common.cancel")}),d.jsx(Q,{type:"button",onClick:_,className:"px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700",children:At("editor.link_modal.insert")})]})]})})]})},ug=Object.freeze(Object.defineProperty({__proto__:null,default:Bl},Symbol.toStringTag,{value:"Module"})),Zo=({content:e,text:t,isHtml:r=!0,className:n="",purifyConfig:o,id:a,editorAttrs:s})=>{const l=t??e??"";if(!l||l.trim()==="")return null;if(!r){const i=` whitespace-pre-wrap text-gray-900 dark:text-gray-100 font-sans ${n} - `.trim().replace(/\s+/g," ");return d.jsx(W,{className:i,id:a,...s,children:l})}const g={FORBID_TAGS:["script","noscript","iframe","frame","frameset","object","embed","applet","portal","form","input","textarea","select","button","style","link","meta","base","body","head","html","title","svg","math","audio","video","source","track","canvas","details","dialog","plaintext","xmp","listing","marquee","noframes","noembed","template","slot"],FORBID_ATTR:["onerror","onload","onclick","onmouseover","onfocus","onblur","ontoggle","oncanplay","onloadstart","formaction","xlink:href","action"],ALLOW_DATA_ATTR:!0,ADD_ATTR:["target"]},h=k.useMemo(()=>{const i=o?{...g,...o,FORBID_TAGS:[...g.FORBID_TAGS,...o.FORBID_TAGS||[]],FORBID_ATTR:[...g.FORBID_ATTR,...o.FORBID_ATTR||[]]}:g;return hs.sanitize(l,i).replace(/]*?)href=["']([^"']+)["']([^>]*?)>/gi,(f,p,m,w)=>(m.startsWith("http://")||m.startsWith("https://"))&&!f.includes("rel=")?``:f)},[l,o]),c=` + `.trim().replace(/\s+/g," ");return d.jsx(W,{className:i,id:a,...s,children:l})}const f={FORBID_TAGS:["script","noscript","iframe","frame","frameset","object","embed","applet","portal","form","input","textarea","select","button","style","link","meta","base","body","head","html","title","svg","math","audio","video","source","track","canvas","details","dialog","plaintext","xmp","listing","marquee","noframes","noembed","template","slot"],FORBID_ATTR:["onerror","onload","onclick","onmouseover","onfocus","onblur","ontoggle","oncanplay","onloadstart","formaction","xlink:href","action"],ALLOW_DATA_ATTR:!0,ADD_ATTR:["target"]},h=C.useMemo(()=>{const i=o?{...f,...o,FORBID_TAGS:[...f.FORBID_TAGS,...o.FORBID_TAGS||[]],FORBID_ATTR:[...f.FORBID_ATTR,...o.FORBID_ATTR||[]]}:f;return Cs.sanitize(l,i).replace(/]*?)href=["']([^"']+)["']([^>]*?)>/gi,(g,p,m,v)=>(m.startsWith("http://")||m.startsWith("https://"))&&!g.includes("rel=")?``:g)},[l,o]),c=` prose dark:prose-invert max-w-none prose-p:my-2 prose-headings:font-bold prose-headings:mt-6 prose-headings:mb-4 @@ -39,7 +40,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(ce,{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(ce,{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;jTe&&(Te=Ze),BeVe&&(Ve=Be));Te==-1&&(Ee=he=Te=Ve=0),K&&((1&Ee)==1&&Ee--,(1&he)==1&&he--);const Fe=(Te-Ee+1)*(Ve-he+1);Fe<_e&&(_e=Fe,Se=$e,ae=Ee,de=he,le=Te-Ee+1,se=Ve-he+1)}xe=new Uint8Array(Ce[oe-1-Se]),Se==1&&(ne[oe-1].dispose=2),be=new Uint8Array(le*se*4),e(xe,we,Ue,be,le,se,-ae,-de,0),Ne=e(Oe,we,Ue,be,le,se,-ae,-de,3)?1:0,Ne==1?u(Oe,we,Ue,be,{x:ae,y:de,width:le,height:se}):e(Oe,we,Ue,be,le,se,-ae,-de,0)}else be=Oe.slice(0);ne.push({rect:{x:ae,y:de,width:le,height:se},img:be,blend:Ne,dispose:0})}if(Le)for(oe=0;oe>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})},fg=Object.freeze(Object.defineProperty({__proto__:null,HtmlContent:Zo},Symbol.toStringTag,{value:"Module"})),qo=()=>window.G7Core,Qo=(e,t)=>qo()?.t?.(e,t)??e,Wl=({content:e="",onChange:t,isHtml:r=!1,onIsHtmlChange:n,rows:o=15,placeholder:a="",label:s,showHtmlModeToggle:l=!0,contentClassName:f="",purifyConfig:h,className:c="",name:i="content",htmlFieldName:u="content_mode",readOnly:g=!1,id:p,editorAttrs:m})=>{const[v,x]=C.useState(r),[M,w]=C.useState(e),[T,A]=C.useState(!1);C.useEffect(()=>{x(r)},[r]),C.useEffect(()=>{w(e)},[e]);const _=C.useCallback(y=>{const N=y.target.value;if(w(N),t){const D=qo()?.createChangeEvent?.({value:N,name:i,type:"textarea"})??{target:{name:i,value:N}};t(D)}},[t,i]),I=C.useCallback(y=>{const N=y.target.checked;if(x(N),N||A(!1),n){const D=qo()?.createChangeEvent?.({checked:N,name:u,type:"checkbox"})??{target:{name:u,checked:N}};n(D)}},[n,u]),k=C.useCallback(()=>{A(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(vr,{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:[v&&!g&&d.jsx(Q,{type:"button",onClick:k,className:`px-3 py-1.5 text-xs font-bold rounded-lg focus:outline-none focus:ring-2 ${T?"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(T?"common.preview_off":"common.preview")}),l&&d.jsxs(vr,{className:"flex items-center gap-2 p-2 cursor-pointer",children:[d.jsx(_t,{type:"checkbox",name:u,checked:v,onChange:I,disabled:g,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")})]})]})]}),!T&&d.jsx(lo,{name:i,value:M,onChange:_,placeholder:a,rows:o,readOnly:g,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 ${v?"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"}`}),T&&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(Zo,{content:M,isHtml:!0,className:f||"prose dark:prose-invert max-w-none text-gray-900 dark:text-gray-100",purifyConfig:h})})]})},gg=Object.freeze(Object.defineProperty({__proto__:null,HtmlEditor:Wl},Symbol.toStringTag,{value:"Module"})),Kl=e=>window.G7Core?.t?.(e)??e,Jo=({maxHeight:e=500,expandText:t,collapseText:r,className:n="",children:o,id:a,editorAttrs:s})=>{const[l,f]=C.useState(!1),[h,c]=C.useState(!1),i=C.useRef(null),u=C.useCallback(()=>{if(i.current){const v=i.current.scrollHeight;c(v>e)}},[e]);C.useEffect(()=>{u();const v=i.current;if(!v)return;const x=v.querySelectorAll("img");x.forEach(w=>{w.complete||w.addEventListener("load",u)});let M=null;return typeof ResizeObserver<"u"&&(M=new ResizeObserver(u),M.observe(v)),()=>{x.forEach(w=>{w.removeEventListener("load",u)}),M?.disconnect()}},[u,o]);const g=()=>{f(v=>!v)},p=t||Kl("sirsoft-ecommerce.shop.product.expand_detail"),m=r||Kl("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:g,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(re,{className:"text-sm font-semibold text-gray-600 dark:text-gray-400",children:l?m:p}),d.jsx(fe,{name:l?"chevron-up":"chevron-down",size:"sm"})]})]})},hg=Object.freeze(Object.defineProperty({__proto__:null,ExpandableContent:Jo,default:Jo},Symbol.toStringTag,{value:"Module"})),pg=(e,t)=>window.G7Core?.t?.(e,t)??e,Ro=({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:f=!0,children:h,width:c="500px",className:i="",style:u})=>{const g=s!==void 0?s:a,p=C.useRef(null),m=C.useRef(null);if(C.useEffect(()=>{const x=M=>{M.key==="Escape"&&e&&f&&t()};if(e&&f)return document.addEventListener("keydown",x),()=>document.removeEventListener("keydown",x)},[e,t,f]),C.useEffect(()=>{if(e&&p.current){m.current=document.activeElement;const x=p.current.querySelectorAll('button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'),M=x[0],w=x[x.length-1];M?.focus();const T=A=>{A.key==="Tab"&&(A.shiftKey?document.activeElement===M&&(A.preventDefault(),w?.focus()):document.activeElement===w&&(A.preventDefault(),M?.focus()))};return document.addEventListener("keydown",T),()=>{document.removeEventListener("keydown",T),m.current?.focus()}}},[e]),C.useEffect(()=>{if(e)return document.body.style.overflow="hidden",()=>{document.body.style.overflow=""}},[e]),!e)return null;const v=u?.zIndex??50;return d.jsxs(W,{className:"fixed inset-0 flex items-center justify-center",style:{zIndex:v},onClick:g?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(fe,{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":pg("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})]})]})},mg=Object.freeze(Object.defineProperty({__proto__:null,Modal:Ro},Symbol.toStringTag,{value:"Module"})),ea=(e,t)=>window.G7Core?.t?.(e,t)??e,ta=({isOpen:e,onClose:t,title:r,message:n,confirmText:o,cancelText:a,onConfirm:s,onCancel:l,confirmButtonVariant:f="primary",cancelButtonVariant:h="secondary",width:c="500px",closeOnOverlay:i=!0,isLoading:u=!1,loadingText:g})=>{const p=o??ea("common.confirm"),m=a??ea("common.cancel"),v=g??ea("common.loading"),x=()=>{s()},M=()=>{u||(l?.(),t())},w=()=>{u||t()},T={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(Ro,{isOpen:e,onClose:w,title:r,width:c,children:[d.jsx(W,{className:"py-2",children:typeof n=="string"?d.jsx(zt,{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:M,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(re,{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 ${T[f]}`,children:[u&&d.jsx(Nt,{className:"fa-solid fa-spinner w-4 h-4 animate-spin"}),d.jsx(re,{children:u?v:p})]})]})]})},bg=Object.freeze(Object.defineProperty({__proto__:null,ConfirmDialog:ta},Symbol.toStringTag,{value:"Module"})),Vl=C.createContext(null),Yl=({value:e,children:t})=>d.jsx(Vl.Provider,{value:e,children:t}),yg=()=>{const e=C.useContext(Vl);if(!e)throw new Error("useFileUploaderContext must be used within FileUploaderProvider");return e};function vg(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 Xl(e,t){return new Promise((function(r,n){let o;return wg(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 wg=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 f=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 g=h+i+2;g>>24&255,l[s+1]=f>>>16&255,l[s+2]=f>>>8&255,l[s+3]=f>>>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,f=n.bin.writeUshort,h={};for(var c in o){var i=!n._noNeed(c)&&!a,u=o[c],g=n.crc.crc(u,0,u.length);h[c]={cpr:i,usize:u.length,crc:g,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,v=[];for(var c in h){var x=h[c];v.push(m),m=n._writeHeader(p,m,c,x,0)}var M=0,w=m;for(var c in h)x=h[c],v.push(m),m=n._writeHeader(p,m,c,x,1,v[M++]);var T=m-w;return l(p,m,101010256),m+=4,f(p,m+=4,M),f(p,m+=2,M),l(p,m+=2,T),l(p,m+=4,w),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,f,h){var c=n.bin.writeUint,i=n.bin.writeUshort,u=l.file;return c(o,a,f==0?67324752:33639248),a+=4,f==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,f==1&&(a+=2,a+=2,c(o,a+=6,h),a+=4),a+=n.bin.writeUTF8(o,a,s),f==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 f=0;f>>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,f=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="",f=0;f>6,o[a+f+1]=128|c>>0&63,f+=2;else if((4294901760&c)==0)o[a+f]=224|c>>12,o[a+f+1]=128|c>>6&63,o[a+f+2]=128|c>>0&63,f+=3;else{if((4292870144&c)!=0)throw"e";o[a+f]=240|c>>18,o[a+f+1]=128|c>>12&63,o[a+f+2]=128|c>>6&63,o[a+f+3]=128|c>>0&63,f+=4}}return f},sizeUTF8:function(o){for(var a=o.length,s=0,l=0;l>>3}var v=h.lits,x=h.strt,M=h.prev,w=0,T=0,A=0,_=0,I=0,k=0;for(m>2&&(x[k=n.F._hash(o,0)]=0),u=0;u14e3||T>26697)&&m-u>100&&(p>>16,P=65535&N;if(N!=0){P=65535&N;var O=c(D=N>>>16,h.of0);h.lhst[257+O]++;var L=c(P,h.df0);h.dhst[L]++,_+=h.exb[O]+h.dxb[L],v[w]=D<<23|u-p,v[w+1]=P<<16|O<<8|L,w+=2,p=u+D}else h.lhst[o[u]]++;T++}}for(A==u&&o.length!=0||(p>>3},n.F._bestMatch=function(o,a,s,l,f,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 g=0,p=0,m=Math.min(32767,a);u<=m&&--h!=0&&i!=c;){if(g==0||o[a+g]==o[a+g-u]){var v=n.F._howLong(o,a,u);if(v>g){if(p=u,(g=v)>=f)break;u+2x&&(x=T,i=w)}}}u+=(c=i)-(i=s[c])+32768&32767}return g<<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,f=Math.min(o.length,a+258);for(a+=3;a>>23,Y=b+(8388607&U);b>16,j=B>>8&255,H=255&B;k(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,f){var h=f>>>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),f+(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=[],f=n.F._lenCodes(o.ltree,l),h=[],c=n.F._lenCodes(o.dtree,h),i=0;i4&&o.itree[1+(o.ordr[g-1]<<1)]==0;)g--;return[a,s,u,f,c,g,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,g-3):a.push(18,g-11),l+=2*g-2}else if(f==i&&h==f&&c==f){for(u=l+5;u+2>>1,6);a.push(16,g-3),l+=2*g-2}else a.push(f,0)}return s>>>1},n.F._hufTree=function(o,a,s){var l=[],f=o.length,h=a.length,c=0;for(c=0;cs&&(n.F.restrictDepth(u,s,w),w=s),c=0;ca;l++){var c=o[l].d;o[l].d=a,h+=f-(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,f=l._bitsF,h=l._bitsE,c=l._decodeTiny,i=l.makeCodes,u=l.codes2map,g=l._get17,p=l.U,m=a==null;m&&(a=new s(o.length>>>2<<3));for(var v,x,M=0,w=0,T=0,A=0,_=0,I=0,k=0,y=0,N=0;M==0;)if(M=f(o,N,1),w=f(o,N+1,2),N+=3,w!=0){if(m&&(a=n.F._check(a,y+131072)),w==1&&(v=p.flmap,x=p.fdmap,I=511,k=31),w==2){T=h(o,N,5)+257,A=h(o,N+5,5)+1,_=h(o,N+10,4)+4,N+=14;for(var D=0;D<38;D+=2)p.itree[D]=0,p.itree[D+1]=0;var P=1;for(D=0;D<_;D++){var O=h(o,N+3*D,3);p.itree[1+(p.ordr[D]<<1)]=O,O>P&&(P=O)}N+=3*_,i(p.itree,P),u(p.itree,P,p.imap),v=p.lmap,x=p.dmap,N=c(p.imap,(1<>>4;if(!(b>>>8))a[y++]=b;else{if(b==256)break;var z=y+b-254;if(b>264){var U=p.ldef[b-257];z=y+(U>>>3)+h(o,N,7&U),N+=7&U}var G=x[g(o,N)&k];N+=15&G;var Y=G>>>4,B=p.ddef[Y],V=(B>>>4)+f(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,f,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,v=0;p==16?(v=3+c(l,f,2),f+=2,m=h[u-1]):p==17?(v=3+c(l,f,3),f+=3):p==18&&(v=11+c(l,f,7),f+=7);for(var x=u+v;u>>1;hf&&(f=i),h++}for(;h>1,i=o[h+1],u=c<<4|i,g=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,f=0;f>>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(f,h,c){for(;h--!=0;)f.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 kg=vg({__proto__:null,default:Ln},[Ln]);const Kt=(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 g="";for(let p=0;pc.length<2?`0${c}`:c,readUTF8(c,i,u){let g,p="";for(let m=0;m>3)]>>7-((7&_)<<0)&1);x[y]=U[O],x[y+1]=U[O+1],x[y+2]=U[O+2],x[y+3]=L>2)]>>6-((3&_)<<1)&3),x[y]=U[O],x[y+1]=U[O+1],x[y+2]=U[O+2],x[y+3]=L>1)]>>4-((1&_)<<2)&15),x[y]=U[O],x[y+1]=U[O+1],x[y+2]=U[O+2],x[y+3]=L>>3)]>>>7-(7&b)&1))==255*k?0:255;M[G+b]=z<<24|$<<16|$<<8|$}else if(T==2)for(b=0;b>>2)]>>>6-((3&b)<<1)&3))==85*k?0:255,M[G+b]=z<<24|$<<16|$<<8|$;else if(T==4)for(b=0;b>>1)]>>>4-((1&b)<<2)&15))==17*k?0:255,M[G+b]=z<<24|$<<16|$<<8|$;else if(T==8)for(b=0;b>3,k=Math.ceil(T*_/8),y=new Uint8Array(A*k);let N=0;const D=[0,0,4,0,2,0,1],P=[0,4,0,2,0,1,0],O=[8,8,8,4,4,2,2],L=[8,8,4,4,2,2,1];let $=0;for(;$<7;){const b=O[$],z=L[$];let U=0,G=0,Y=D[$];for(;Y>3])>>7-(7&ee)&1,y[H*k+(q>>3)]|=S<<7-((7&q)<<0)),_==2&&(S=(S=M[ee>>3])>>6-(7&ee)&3,y[H*k+(q>>2)]|=S<<6-((3&q)<<1)),_==4&&(S=(S=M[ee>>3])>>4-(7&ee)&15,y[H*k+(q>>1)]|=S<<4-((1&q)<<2)),_>=8){const ne=H*k+q*I;for(let ce=0;ce>3)+ce]}ee+=_,q+=z}j++,H+=b}U*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 g=Uint8Array;let p,m,v=0,x=0,M=0,w=0,T=0,A=0,_=0,I=0,k=0;if(i[0]==3&&i[1]==0)return u||new g(0);const y=c.H,N=y.b,D=y.e,P=y.R,O=y.n,L=y.A,$=y.Z,S=y.m,b=u==null;for(b&&(u=new g(i.length>>>2<<5));v==0;)if(v=N(i,k,1),x=N(i,k+1,2),k+=3,x!=0){if(b&&(u=c.H.W(u,I+(1<<17))),x==1&&(p=S.J,m=S.h,A=511,_=31),x==2){M=D(i,k,5)+257,w=D(i,k+5,5)+1,T=D(i,k+10,4)+4,k+=14;let U=1;for(var z=0;z<38;z+=2)S.Q[z]=0,S.Q[z+1]=0;for(z=0;zU&&(U=B)}k+=3*T,O(S.Q,U),L(S.Q,U,S.u),p=S.w,m=S.d,k=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)+D(i,k,7&q),k+=7&q}const B=m[$(i,k)&_];k+=15&B;const V=B>>>4,j=S.c[V],H=(j>>>4)+N(i,k,15&j);for(k+=15&j;I>>3),G=i[U-4]|i[U-3]<<8;b&&(u=c.H.W(u,I+G)),u.set(new g(i.buffer,i.byteOffset+U,G),I),k=U+G<<3,I+=G}return u.length==I?u:u.slice(0,I)},c.H.W=function(i,u){const g=i.length;if(u<=g)return i;const p=new Uint8Array(g<<1);return p.set(i,0),p},c.H.R=function(i,u,g,p,m,v){const x=c.H.e,M=c.H.Z;let w=0;for(;w>>4;if(A<=15)v[w]=A,w++;else{let _=0,I=0;A==16?(I=3+x(p,m,2),m+=2,_=v[w-1]):A==17?(I=3+x(p,m,3),m+=3):A==18&&(I=11+x(p,m,7),m+=7);const k=w+I;for(;w>>1;for(;vm&&(m=M),v++}for(;v>1,M=i[v+1],w=x<<4|M,T=u-M;let A=i[v]<>>15-u]=w,A++}},c.H.l=function(i,u){const g=c.H.m.r,p=15-u;for(let m=0;m>>p}},c.H.M=function(i,u,g){g<<=7&u;const p=u>>>3;i[p]|=g,i[p+1]|=g>>>8},c.H.I=function(i,u,g){g<<=7&u;const p=u>>>3;i[p]|=g,i[p+1]|=g>>>8,i[p+2]|=g>>>16},c.H.e=function(i,u,g){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 g(p,m,v){for(;m--!=0;)p.push(0,v)}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];g(i._,144,8),g(i._,112,9),g(i._,24,7),g(i._,8,8),c.H.n(i._,9),c.H.A(i._,9,i.J),c.H.l(i._,9),g(i.$,32,5),c.H.n(i.$,5),c.H.A(i.$,5,i.h),c.H.l(i.$,5),g(i.Q,19,0),g(i.C,286,0),g(i.D,30,0),g(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,g,p){let m=a(i);const v=Math.ceil(g*m/8);let x,M;m=Math.ceil(m/8);let w=c[u],T=0;if(w>1&&(c[u]=[0,0,1][w-2]),w==3)for(T=m;T>>1)&255;for(let A=0;A>>1);for(;T>>1)}else{for(;T=0&&x>=0?(A=$*i+S<<2,_=(x+$)*p+v+S<<2):(A=(-x+$)*i-v+S<<2,_=$*p+S<<2),M==0)g[_]=c[A],g[_+1]=c[A+1],g[_+2]=c[A+2],g[_+3]=c[A+3];else if(M==1){var I=c[A+3]*.00392156862745098,k=c[A]*I,y=c[A+1]*I,N=c[A+2]*I,D=g[_+3]*(1/255),P=g[_]*D,O=g[_+1]*D,L=g[_+2]*D;const b=1-I,z=I+D*b,U=z==0?0:1/z;g[_+3]=255*z,g[_+0]=(k+P*b)*U,g[_+1]=(y+O*b)*U,g[_+2]=(N+L*b)*U}else if(M==2)I=c[A+3],k=c[A],y=c[A+1],N=c[A+2],D=g[_+3],P=g[_],O=g[_+1],L=g[_+2],I==D&&k==P&&y==O&&N==L?(g[_]=0,g[_+1]=0,g[_+2]=0,g[_+3]=0):(g[_]=k,g[_+1]=y,g[_+2]=N,g[_+3]=I);else if(M==3){if(I=c[A+3],k=c[A],y=c[A+1],N=c[A+2],D=g[_+3],P=g[_],O=g[_+1],L=g[_+2],I==D&&k==P&&y==O&&N==L)continue;if(I<220&&D>20)return!1}return!0}return{decode:function(i){const u=new Uint8Array(i);let g=8;const p=e,m=p.readUshort,v=p.readUint,x={tabs:{},frames:[]},M=new Uint8Array(u.length);let w,T=0,A=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(;g>>1:N>>>=1;k[y]=N}return k})(),update(k,y,N,D){for(let P=0;P>>8;return k},crc:(k,y,N)=>4294967295^n.update(4294967295,k,y,N)};function o(k,y,N,D){y[N]+=k[0]*D>>4,y[N+1]+=k[1]*D>>4,y[N+2]+=k[2]*D>>4,y[N+3]+=k[3]*D>>4}function a(k){return Math.max(0,Math.min(255,k))}function s(k,y){const N=k[0]-y[0],D=k[1]-y[1],P=k[2]-y[2],O=k[3]-y[3];return N*N+D*D+P*P+O*O}function l(k,y,N,D,P,O,L){L==null&&(L=1);const $=D.length,S=[];for(var b=0;b<$;b++){const H=D[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 z=0,U=0;U<$;U++){var G=s(S[b],S[U]);U!=b&&G>2]=z,Y[b>>2]=D[z]}}function f(k,y,N,D,P){P==null&&(P={});const{crc:O}=n,L=t.writeUint,$=t.writeUshort,S=t.writeASCII;let b=8;const z=k.frames.length>1;let U,G=!1,Y=33+(z?20:0);if(P.sRGB!=null&&(Y+=13),P.pHYs!=null&&(Y+=21),P.iCCP!=null&&(U=pako.deflate(P.iCCP),Y+=21+U.length+4),k.ctype==3){for(var B=k.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,Be=R>>>16&255;H[b+ce+0]=_e,H[b+ce+1]=me,H[b+ce+2]=Be}if(b+=3*B,L(H,b,O(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,O(H,b-B-4,B+4)),b+=4}}let ee=0;for(j=0;jMe&&(Me=Pe),Yeje&&(je=Ye));Me==-1&&(Se=be=Me=je=0),K&&((1&Se)==1&&Se--,(1&be)==1&&be--);const rt=(Me-Se+1)*(je-be+1);rt>2,Oe>>2);ce.push(R);const K=new Uint8Array(ke.abuf,Ue,Oe);z&&l(_e.img,_e.rect.width,_e.rect.height,ne,K,R),_e.img.set(K),Ue+=Oe}}else for(B=0;Bme&&we==Ne[j-me])R[j]=R[j-me];else{let ke=ee[we];if(ke==null&&(ee[we]=ke=ne.length,ne.push(we),ne.length>=300))break;R[j]=ke}}}const Be=ne.length;for(Be<=256&&b==0&&(G=Be<=2?1:Be<=4?2:Be<=16?4:8,G=Math.max(G,S)),B=0;B>1)]|=Oe[te+ye]<<4-4*(1&ye);else if(G==2)for(ye=0;ye>2)]|=Oe[te+ye]<<6-2*(3&ye);else if(G==1)for(ye=0;ye>3)]|=Oe[te+ye]<<7-1*(7&ye)}we=$e,U=3,Ue=1}else if(H==0&&q.length==1){$e=new Uint8Array(me*Ne*3);const Oe=me*Ne;for(j=0;jj&&(j=ce),RH&&(H=R))}j==-1&&(B=V=j=H=0),L&&((1&B)==1&&B--,(1&V)==1&&V--),O={x:B,y:V,width:j-B+1,height:H-V+1};const q=D[P];q.rect=O,q.blend=1,q.img=new Uint8Array(O.width*O.height*4),D[P-1].dispose==0?(e(b,y,N,q.img,O.width,O.height,-O.x,-O.y,0),u(G,y,N,q.img,O)):e(G,y,N,q.img,O.width,O.height,-O.x,-O.y,0)}function u(k,y,N,D,P){e(k,y,N,D,P.width,P.height,-P.x,-P.y,2)}function g(k,y,N,D,P,O,L){const $=[];let S,b=[0,1,2,3,4];O!=-1?b=[O]:(y*D>5e5||N==1)&&(b=[0]),L&&(S={level:0});const z=kg;for(var U=0;U>1)+256&255;if(O==4)for(S=P;S>1)&255;for(S=P;S>1)&255}if(O==4){for(S=0;S>2);let z;if(N.length<2e7)for(var U=0;U>2]=z.ind,P[U>>2]=z.est.rgba;else for(U=0;U>2]=z.ind,P[U>>2]=z.est.rgba}return{abuf:D.buffer,inds:b,plte:$}}function v(k,y,N){N==null&&(N=1e-4);const D=new Uint32Array(k.buffer),P={i0:0,i1:k.length,bst:null,est:null,tdst:0,left:null,right:null};P.bst=A(k,P.i0,P.i1),P.est=_(P.bst);const O=[P];for(;O.length$&&($=O[L].est.L,S=L);if($=z||b.i1<=z){b.est.L=0;continue}const U={i0:b.i0,i1:z,bst:null,est:null,tdst:0,left:null,right:null};U.bst=A(k,U.i0,U.i1),U.est=_(U.bst);const G={i0:z,i1:b.i1,bst:null,est:null,tdst:0,left:null,right:null};for(G.bst={R:[],m:[],N:b.bst.N-U.bst.N},L=0;L<16;L++)G.bst.R[L]=b.bst.R[L]-U.bst.R[L];for(L=0;L<4;L++)G.bst.m[L]=b.bst.m[L]-U.bst.m[L];G.est=_(G.bst),b.left=U,b.right=G,O[S]=U,O.push(G)}for(O.sort((($,S)=>S.bst.N-$.bst.N)),L=0;L0&&(L=k.right,$=k.left);const S=x(L,y,N,D,P);if(S.tdst<=O*O)return S;const b=x($,y,N,D,P);return b.tdstO;)D-=4;if(N>=D)break;const L=y[N>>2];y[N>>2]=y[D>>2],y[D>>2]=L,N+=4,D-=4}for(;T(k,N,P)>O;)N-=4;return N+4}function T(k,y,N){return k[y]*N[0]+k[y+1]*N[1]+k[y+2]*N[2]+k[y+3]*N[3]}function A(k,y,N){const D=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],P=[0,0,0,0],O=N-y>>2;for(let L=y;L>>0}}var I={multVec:(k,y)=>[k[0]*y[0]+k[1]*y[1]+k[2]*y[2]+k[3]*y[3],k[4]*y[0]+k[5]*y[1]+k[6]*y[2]+k[7]*y[3],k[8]*y[0]+k[9]*y[1]+k[10]*y[2]+k[11]*y[3],k[12]*y[0]+k[13]*y[1]+k[14]*y[2]+k[15]*y[3]],dot:(k,y)=>k[0]*y[0]+k[1]*y[1]+k[2]*y[2]+k[3]*y[3],sml:(k,y)=>[k*y[0],k*y[1],k*y[2],k*y[3]]};Kt.encode=function(y,N,D,P,O,L,$){P==null&&(P=0),$==null&&($=!1);const S=c(y,N,D,P,[!1,!1,!1,0,$,!1]);return h(S,-1),f(S,N,D,O,L)},Kt.encodeLL=function(y,N,D,P,O,L,$,S){const b={ctype:0+(P==1?0:2)+(O==0?0:4),depth:L,frames:[]},z=(P+O)*L,U=z*N;for(let G=0;G>>0),A(1),A(32),_(3),_(f),_(2835),_(2835),I(8),_(16711680),_(65280),_(255),_(4278190080),_(1466527264),(function k(){for(;M0;){for(v=122+M*l,g=0;g>>24,i.setUint32(v+g,p<<8|m),g+=4;M++}T{t(new Blob([r],{type:"image/bmp"}))}))},_dly:9};var wt={CHROME:"CHROME",FIREFOX:"FIREFOX",DESKTOP_SAFARI:"DESKTOP_SAFARI",IE:"IE",IOS:"IOS",ETC:"ETC"},Cg={[wt.CHROME]:16384,[wt.FIREFOX]:11180,[wt.DESKTOP_SAFARI]:16384,[wt.IE]:8192,[wt.IOS]:4096,[wt.ETC]:8192};const ra=typeof window<"u",ql=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope,Pn=ra&&window.cordova&&window.cordova.require&&window.cordova.require("cordova/modulemapper"),Sg=(ra||ql)&&(Pn&&Pn.getOriginalSymbol(window,"File")||typeof File<"u"&&File),Ql=(ra||ql)&&(Pn&&Pn.getOriginalSymbol(window,"FileReader")||typeof FileReader<"u"&&FileReader);function na(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 f=new Uint8Array(l);for(;l--;)f[l]=s.charCodeAt(l);const h=new Blob([f],{type:a});h.name=t,h.lastModified=r,n(h)}))}function Jl(e){return new Promise(((t,r)=>{const n=new Ql;n.onload=()=>t(n.result),n.onerror=o=>r(o),n.readAsDataURL(e)}))}function Rl(e){return new Promise(((t,r)=>{const n=new Image;n.onload=()=>t(n),n.onerror=o=>r(o),n.src=e}))}function gr(){if(gr.cachedResult!==void 0)return gr.cachedResult;let e=wt.ETC;const{userAgent:t}=navigator;return/Chrom(e|ium)/i.test(t)?e=wt.CHROME:/iP(ad|od|hone)/i.test(t)&&/WebKit/i.test(t)?e=wt.IOS:/Safari/i.test(t)?e=wt.DESKTOP_SAFARI:/Firefox/i.test(t)?e=wt.FIREFOX:(/MSIE/i.test(t)||document.documentMode)&&(e=wt.IE),gr.cachedResult=e,gr.cachedResult}function ei(e,t){const r=gr(),n=Cg[r];let o=e,a=t,s=o*a;const l=o>a?a/o:o/a;for(;s>n*n;){const f=(n+o)/2,h=(n+a)/2;fZl.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),na(i,r,n).then(function(u){try{return l=u,c.call(this)}catch(g){return s(g)}}.bind(this),s)}}}function f(){return a(l)}}))}function Zt(e){e.width=0,e.height=0}function Pr(){return new Promise((function(e,t){let r,n,o,a;return Pr.cachedResult!==void 0?e(Pr.cachedResult):na("data:image/jpeg;base64,/9j/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAYAAAAAAAD/2wCEAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAf/AABEIAAEAAgMBEQACEQEDEQH/xABKAAEAAAAAAAAAAAAAAAAAAAALEAEAAAAAAAAAAAAAAAAAAAAAAQEAAAAAAAAAAAAAAAAAAAAAEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwA/8H//2Q==","test.jpg",Date.now()).then((function(s){try{return r=s,Un(r).then((function(l){try{return n=l[1],zn(n,r.type,r.name,r.lastModified).then((function(f){try{return o=f,Zt(n),Un(o).then((function(h){try{return a=h[0],Pr.cachedResult=a.width===1&&a.height===2,e(Pr.cachedResult)}catch(c){return t(c)}}),t)}catch(h){return t(h)}}),t)}catch(f){return t(f)}}),t)}catch(l){return t(l)}}),t)}))}function ri(e){return new Promise(((t,r)=>{const n=new Ql;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 ni(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]=Fn(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),Zt(e)),s}function oi(e,t){const{width:r}=e,{height:n}=e,[o,a]=Fn(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),Zt(e),o}function ai(e,t,r=0){return new Promise((function(n,o){let a,s,l,f,h,c,i,u,g,p,m,v,x,M,w,T,A,_,I,k;function y(D=5){if(t.signal&&t.signal.aborted)throw t.signal.reason;a+=D,t.onProgress(Math.min(a,100))}function N(D){if(t.signal&&t.signal.aborted)throw t.signal.reason;a=Math.min(Math.max(D,a),100),t.onProgress(a)}return a=r,s=t.maxIteration||10,l=1024*t.maxSizeMB*1024,y(),Un(e,t).then(function(D){try{return[,f]=D,y(),h=ni(f,t),y(),new Promise((function(P,O){var L;if(!(L=t.exifOrientation))return ri(e).then(function(S){try{return L=S,$.call(this)}catch(b){return O(b)}}.bind(this),O);function $(){return P(L)}return $.call(this)})).then(function(P){try{return c=P,y(),Pr().then(function(O){try{return i=O?h:oi(h,c),y(),u=t.initialQuality||1,g=t.fileType||e.type,zn(i,g,e.name,e.lastModified,u).then(function(L){try{{let S=function(){if(s--&&(w>l||w>x)){let z,U;return z=k?.95*I.width:I.width,U=k?.95*I.height:I.height,[A,_]=Fn(z,U),_.drawImage(I,0,0,z,U),u*=g==="image/png"?.85:.95,zn(A,g,e.name,e.lastModified,u).then((function(G){try{return T=G,Zt(I),I=A,w=T.size,N(Math.min(99,Math.floor((M-w)/(M-l)*100))),S}catch(Y){return o(Y)}}),o)}return[1]},b=function(){return Zt(I),Zt(A),Zt(h),Zt(i),Zt(f),N(100),n(T)};if(p=L,y(),m=p.size>l,v=p.size>e.size,!m&&!v)return N(100),n(p);var $;return x=e.size,M=p.size,w=M,I=i,k=!t.alwaysKeepResolution&&m,($=function(z){for(;z;){if(z.then)return void z.then($,o);try{if(z.pop){if(z.length)return z.pop()?b.call(this):z;z=S}else z=z.call(this)}catch(U){return o(U)}}}.bind(this))(S)}}catch(S){return o(S)}}.bind(this),o)}catch(L){return o(L)}}.bind(this),o)}catch(O){return o(O)}}.bind(this),o)}catch(P){return o(P)}}.bind(this),o)}))}const _g=` let scriptImported = false self.addEventListener('message', async (e) => { const { file, id, imageCompressionLibUrl, options } = e.data @@ -58,20 +59,20 @@ self.addEventListener('message', async (e) => { self.postMessage({ error: e.message + '\\n' + e.stack, id }) } }) -`;let ra;function og(e,t){return new Promise(((r,n)=>{ra||(ra=(function(s){const l=[];return l.push(s),URL.createObjectURL(new Blob(l))})(ng));const o=new Worker(ra);o.addEventListener("message",(function(s){if(t.signal&&t.signal.aborted)o.terminate();else if(s.data.progress===void 0){if(s.data.error)return n(new Error(s.data.error)),void o.terminate();r(s.data.file),o.terminate()}else t.onProgress(s.data.progress)})),o.addEventListener("error",n),t.signal&&t.signal.addEventListener("abort",(()=>{n(t.signal.reason),o.terminate()})),o.postMessage({file:e,imageCompressionLibUrl:t.libURL,options:{...t,onProgress:void 0,signal:void 0}})}))}function ct(e,t){return new Promise((function(r,n){let o,a,s,l,g,h;if(o={...t},s=0,{onProgress:l}=o,o.maxSizeMB=o.maxSizeMB||Number.POSITIVE_INFINITY,g=typeof o.useWebWorker!="boolean"||o.useWebWorker,delete o.useWebWorker,o.onProgress=f=>{s=f,typeof l=="function"&&l(s)},!(e instanceof Blob||e instanceof rg))return n(new Error("The file given is not an instance of Blob or File"));if(!/^image/.test(e.type))return n(new Error("The file given is not an image"));if(h=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope,!g||typeof Worker!="function"||h)return Xl(e,o).then(function(f){try{return a=f,u.call(this)}catch(p){return n(p)}}.bind(this),n);var c=function(){try{return u.call(this)}catch(f){return n(f)}}.bind(this),i=function(f){try{return Xl(e,o).then((function(p){try{return a=p,c()}catch(m){return n(m)}}),n)}catch(p){return n(p)}};try{return o.libURL=o.libURL||"https://cdn.jsdelivr.net/npm/browser-image-compression@2.0.2/dist/browser-image-compression.js",og(e,o).then((function(f){try{return a=f,c()}catch{return i()}}),i)}catch{i()}function u(){try{a.name=e.name,a.lastModified=e.lastModified}catch{}try{o.preserveExif&&e.type==="image/jpeg"&&(!o.fileType||o.fileType&&o.fileType===e.type)&&(a=Ul(e,a))}catch{}return r(a)}}))}ct.getDataUrlFromFile=Gl,ct.getFilefromDataUrl=ta,ct.loadImage=jl,ct.drawImageInCanvas=Wl,ct.drawFileInCanvas=Pn,ct.canvasToFile=Fn,ct.getExifOrientation=Kl,ct.handleMaxWidthOrHeight=Vl,ct.followExifOrientation=Yl,ct.cleanupCanvasMemory=Vt,ct.isAutoOrientationInBrowser=Nr,ct.approximateBelowMaximumCanvasSizeOfBrowser=Bl,ct.copyExifWithoutOrientation=Ul,ct.getBrowserName=fr,ct.version="2.0.2";const ag=window.G7Core,Un=e=>{const t=["B","KB","MB","GB"];let r=0,n=e;for(;n>=1024&&r{if(e&&typeof e=="object"){const t=e;if(t.response?.data?.message)return t.response.data.message;if(t.response?.data?.errors){const r=Object.values(t.response.data.errors)[0];if(Array.isArray(r)&&r[0])return r[0]}if(t.message)return t.message}return e instanceof Error?e.message:"업로드 실패"},Zl=e=>e?e.startsWith("image/")?"fa-file-image":e.startsWith("video/")?"fa-file-video":e.startsWith("audio/")?"fa-file-audio":e==="application/pdf"?"fa-file-pdf":e.includes("word")||e.includes("document")?"fa-file-word":e.includes("excel")||e.includes("spreadsheet")?"fa-file-excel":e.includes("zip")||e.includes("compressed")?"fa-file-zipper":"fa-file":"fa-file",nt=(e,t)=>ag?.t?.(e,t)??e,gr=window.G7Core;function Ql(e){const{attachmentableType:t,attachmentableId:r,collection:n,maxFiles:o,maxSize:a,maxConcurrentUploads:s,accept:l,imageCompression:g,roleIds:h,autoUpload:c,initialFiles:i,endpoints:u,onFilesChange:f,onUploadComplete:p,onUploadError:m,onRemove:w,onReorder:x,uploadTriggerEvent:A,confirmBeforeRemove:v,uploadParams:E}=e,[O,_]=k.useState(i),[I,C]=k.useState([]),[y,N]=k.useState(!1),M=k.useRef(null),P=k.useRef(0),D=k.useRef(new Set),L=k.useRef(new Map),[$,S]=k.useState(!1),[b,U]=k.useState(null),[F,G]=k.useState(!1),Y=k.useRef(!1),[B,V]=k.useState([]),j=k.useRef(i),[H,q]=k.useState(!1),[ue,ee]=k.useState(0),fe=k.useRef(0),[R,ke]=k.useState(new Map),me=k.useRef(new Map);k.useEffect(()=>{f?.(I)},[I,f]);const Ge=k.useMemo(()=>{const X=j.current;return X===i?X:X.length!==i.length?(j.current=i,i):X.length===0&&i.length===0?X:i.some((de,le)=>de.id!==X[le]?.id)?(j.current=i,i):X},[i]);k.useEffect(()=>{if(Y.current)return;const X=Ge.filter(le=>!D.current.has(le.id)&&(!le.hash||!D.current.has(le.hash))),ae=new Set(X.map(le=>le.id)),de=Array.from(L.current.values()).filter(le=>!ae.has(le.id)&&!D.current.has(le.id));_([...X,...de])},[Ge]);const De=k.useCallback(async X=>{const ae={maxSizeMB:g?.maxSizeMB??1,maxWidthOrHeight:g?.maxWidthOrHeight??1920,useWebWorker:!0};return await ct(X,ae)},[g]),ye=k.useCallback(async X=>{const ae=O.length+I.length,de=o-ae,le=Array.from(X).slice(0,de);for(const se of le){if(se.size>a*1024*1024){m?.(`[${se.name}] 파일 크기(${Un(se.size)})가 최대 허용 크기(${a}MB)를 초과합니다.`,se);continue}if(l){const ve="."+se.name.split(".").pop()?.toLowerCase();if(!l.split(",").map($e=>$e.trim().toLowerCase()).some($e=>{if($e.includes("/")){if($e.endsWith("/*")){const je=$e.slice(0,-2);return se.type.toLowerCase().startsWith(je+"/")}return se.type.toLowerCase()===$e}return ve===$e})){m?.(`[${se.name}] 허용되지 않는 파일 형식입니다. (허용: ${l})`,se);continue}}const Ne={id:`pending-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,file:se,original_filename:se.name,mime_type:se.type,size:se.size,size_formatted:Un(se.size),status:"pending",progress:0};if(se.type.startsWith("image/")&&(Ne.preview=URL.createObjectURL(se)),C(ve=>[...ve,Ne]),se.type.startsWith("image/")&&g){C(ve=>ve.map(Se=>Se.id===Ne.id?{...Se,status:"compressing"}:Se));try{const ve=await De(se);C(Se=>Se.map(_e=>_e.id===Ne.id?{..._e,compressedBlob:ve,size:ve.size,size_formatted:Un(ve.size),status:"pending",progress:0}:_e))}catch{C(ve=>ve.map(Se=>Se.id===Ne.id?{...Se,status:"error",error:"이미지 압축 실패"}:Se))}}}},[O.length,I.length,o,a,l,g,De,m]),Me=k.useCallback(async X=>{const ae=new FormData,de=X.compressedBlob?new File([X.compressedBlob],X.original_filename,{type:X.mime_type}):X.file;ae.append("file",de),t&&ae.append("attachmentable_type",t),r&&ae.append("attachmentable_id",String(r)),ae.append("collection",n),h.forEach(le=>{ae.append("role_ids[]",String(le))}),E&&Object.entries(E).forEach(([le,se])=>{ae.append(le,se)});try{const le=await gr.api.post(u.upload,ae,{headers:{"Content-Type":"multipart/form-data"},onUploadProgress:Ne=>{const ve=Math.round(Ne.loaded*100/(Ne.total??1));C(Se=>Se.map(_e=>_e.id===X.id?{..._e,progress:ve}:_e))}});return le?.data?.data??le?.data}catch(le){const se=ql(le);throw new Error(se)}},[t,r,n,h,u.upload]),Ce=k.useCallback(async()=>{const X=I.filter(ve=>ve.status==="pending"||ve.status==="error");if(X.length===0)return[];const ae=[],de=new Map,le=[...X],se=async()=>{for(;le.length>0&&P.currentSe.map(_e=>_e.id===ve.id?{..._e,status:"uploading",progress:0}:_e));try{const Se=await Me(ve);if(Se)ae.push(Se),de.set(String(ve.id),String(Se.hash)),L.current.set(Se.id,Se),C(_e=>_e.filter($e=>$e.id!==ve.id)),_(_e=>[..._e,Se]),V(_e=>{if(_e.length===0)return _e;const $e=String(ve.id);return _e.some(Ee=>String(Ee)===$e)?_e.map(Ee=>String(Ee)===$e?String(Se.hash):Ee):_e}),ve.preview&&URL.revokeObjectURL(ve.preview);else{const _e=nt("attachment.upload_response_invalid");C($e=>$e.map(je=>je.id===ve.id?{...je,status:"error",error:_e}:je)),m?.(`[${ve.original_filename}] ${_e}`,ve.file)}}catch(Se){const _e=Se instanceof Error?Se.message:"업로드 실패";C($e=>$e.map(je=>je.id===ve.id?{...je,status:"error",error:_e}:je)),m?.(`[${ve.original_filename}] ${_e}`,ve.file)}finally{P.current--}}},Ne=Array(Math.min(s,X.length)).fill(null).map(()=>se());if(await Promise.all(Ne),ae.length>0&&(p?.(ae),u.reorder&&B.length>0&&x)){const ve=[...O,...ae],Se=B.map(je=>de.get(String(je))??je),_e=new Map(Se.map((je,Ee)=>[String(je),Ee])),$e=[...ve].sort((je,Ee)=>{const he=_e.get(String(je.hash))??ve.length,Te=_e.get(String(Ee.hash))??ve.length;return he-Te}).map((je,Ee)=>({...je,sort_order:Ee,order:Ee+1}));x($e)}return ae},[I,s,Me,p,m,B,O,x,u.reorder]);k.useEffect(()=>{if(!A)return;const X=gr.componentEvent.on(A,async()=>{const ae=await Ce();return{uploadedAttachments:ae,existingFiles:O,allFiles:[...O,...ae]}});return()=>{X()}},[A,Ce,O]),k.useEffect(()=>{c&&I.some(X=>X.status==="pending")&&Ce()},[c,I,Ce]);const we=k.useCallback(async X=>{G(!0);try{if(X.id&&u.delete){const de=u.delete.replace(":id",String(X.id));await gr.api.delete(de)}const ae=X.hash||X.id;X.id&&(D.current.add(X.id),L.current.delete(X.id)),X.hash&&D.current.add(X.hash),_(de=>de.filter(le=>(le.hash||le.id)!==ae)),w?.(X.hash||X.id),S(!1),U(null)}catch{console.error("첨부파일 삭제 실패")}finally{G(!1)}},[w,u.delete]),Ue=k.useCallback(async X=>{"hash"in X?v?(U(X),S(!0)):await we(X):(X.preview&&URL.revokeObjectURL(X.preview),C(ae=>ae.filter(de=>de.id!==X.id)))},[v,we]),Le=k.useCallback(X=>{C(ae=>ae.map(de=>de.id===X.id?{...de,status:"pending",error:void 0}:de))},[]),K=k.useCallback(async X=>{const{arrayMove:ae}=await Promise.resolve().then(()=>Hh),{active:de,over:le}=X;if(!le||de.id===le.id)return;const se=[...O,...I];let Ne;if(B.length===0)Ne=se;else{const he=new Map(B.map((Te,Ve)=>[String(Te),Ve]));Ne=[...se].sort((Te,Ve)=>{const Fe="hash"in Te?String(Te.hash):String(Te.id),Be="hash"in Ve?String(Ve.hash):String(Ve.id);return(he.get(Fe)??se.length)-(he.get(Be)??se.length)})}const ve=Ne.findIndex(he=>"hash"in he?he.hash===de.id:he.id===de.id),Se=Ne.findIndex(he=>"hash"in he?he.hash===le.id:he.id===le.id),_e=ae(Ne,ve,Se);V(_e.map(he=>"hash"in he?he.hash:he.id));const $e=_e.filter(he=>"hash"in he),je=_e.filter(he=>!("hash"in he));Y.current=!0,_($e),C(je);const Ee=$e.map((he,Te)=>({...he,sort_order:Te,order:Te+1}));if($e.length>0&&u.reorder){const he=$e.map((Te,Ve)=>({id:Te.id,order:Ve+1}));try{const Te=await gr.api.patch(u.reorder,{order:he});gr.toast.success(Te.message)}catch(Te){const Ve=Te instanceof Error?Te.message:nt("attachment.reorder_failed");gr.toast.error(Ve)}}x?.(Ee)},[O,I,B,u.reorder,x]),re=k.useMemo(()=>[...O,...I].filter(X=>"is_image"in X?X.is_image:X.mime_type?.startsWith("image/")??!1),[O,I]),ne=k.useCallback(X=>{const ae=re.findIndex(de=>"hash"in X&&"hash"in de?de.hash===X.hash:"id"in X&&"id"in de&&!("hash"in X)&&!("hash"in de)?de.id===X.id:!1);ae!==-1&&(fe.current+=1,ee(ae),q(!0))},[re]);k.useEffect(()=>{let X=!1;return(async()=>{const de=O.filter(se=>se.is_image),le=new Set(de.map(se=>se.id));for(const[se,Ne]of me.current)le.has(se)||(URL.revokeObjectURL(Ne),me.current.delete(se));for(const se of de){if(X)break;if(!me.current.has(se.id))try{const Ne=await gr.api.get(se.download_url,{responseType:"blob"});if(!X&&Ne){const ve=URL.createObjectURL(Ne);me.current.set(se.id,ve),ke(new Map(me.current))}}catch(Ne){console.error("Failed to load authenticated image:",Ne)}}})(),()=>{X=!0}},[O]),k.useEffect(()=>()=>{me.current.forEach(X=>URL.revokeObjectURL(X)),me.current.clear()},[]);const oe=k.useCallback(async X=>{const{executeImageDownload:ae}=await Promise.resolve().then(()=>Nl);await ae({src:X.download_url,downloadUrl:X.download_url,filename:X.original_filename,downloadRequiresAuth:!0})},[]),be=k.useMemo(()=>{const X=[...O,...I];if(B.length===0)return X;const ae=new Map(B.map((de,le)=>[String(de),le]));return[...X].sort((de,le)=>{const se="hash"in de?String(de.hash):String(de.id),Ne="hash"in le?String(le.hash):String(le.id),ve=ae.get(se)??X.length,Se=ae.get(Ne)??X.length;return ve-Se})},[O,I,B]),xe=be.length,He=xe>0,Pe=xeC([]),[]),Oe=k.useCallback(()=>I,[I]);return{existingFiles:O,pendingFiles:I,isDragOver:y,setIsDragOver:N,isDeleting:F,totalCount:xe,hasFiles:He,canAddMore:Pe,allItems:be,imageFiles:re,handleFiles:ye,handleRemove:Ue,handleRetry:Le,handleUploadAll:Ce,handleOpenGallery:ne,handleDownload:oe,handleDragEnd:K,inputRef:M,galleryOpen:H,setGalleryOpen:q,galleryStartIndex:ue,galleryKeyRef:fe,confirmDialogOpen:$,setConfirmDialogOpen:S,itemToDelete:b,executeRemoveAttachment:we,authenticatedImageUrls:R,clear:Ke,getPendingFiles:Oe}}const Jl=({isDragOver:e,canAddMore:t,onFiles:r,setIsDragOver:n,inputRef:o,accept:a,maxFiles:s,maxSize:l,children:g})=>d.jsxs(W,{className:` +`;let oa;function Eg(e,t){return new Promise(((r,n)=>{oa||(oa=(function(s){const l=[];return l.push(s),URL.createObjectURL(new Blob(l))})(_g));const o=new Worker(oa);o.addEventListener("message",(function(s){if(t.signal&&t.signal.aborted)o.terminate();else if(s.data.progress===void 0){if(s.data.error)return n(new Error(s.data.error)),void o.terminate();r(s.data.file),o.terminate()}else t.onProgress(s.data.progress)})),o.addEventListener("error",n),t.signal&&t.signal.addEventListener("abort",(()=>{n(t.signal.reason),o.terminate()})),o.postMessage({file:e,imageCompressionLibUrl:t.libURL,options:{...t,onProgress:void 0,signal:void 0}})}))}function ht(e,t){return new Promise((function(r,n){let o,a,s,l,f,h;if(o={...t},s=0,{onProgress:l}=o,o.maxSizeMB=o.maxSizeMB||Number.POSITIVE_INFINITY,f=typeof o.useWebWorker!="boolean"||o.useWebWorker,delete o.useWebWorker,o.onProgress=g=>{s=g,typeof l=="function"&&l(s)},!(e instanceof Blob||e instanceof Sg))return n(new Error("The file given is not an instance of Blob or File"));if(!/^image/.test(e.type))return n(new Error("The file given is not an image"));if(h=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope,!f||typeof Worker!="function"||h)return ai(e,o).then(function(g){try{return a=g,u.call(this)}catch(p){return n(p)}}.bind(this),n);var c=function(){try{return u.call(this)}catch(g){return n(g)}}.bind(this),i=function(g){try{return ai(e,o).then((function(p){try{return a=p,c()}catch(m){return n(m)}}),n)}catch(p){return n(p)}};try{return o.libURL=o.libURL||"https://cdn.jsdelivr.net/npm/browser-image-compression@2.0.2/dist/browser-image-compression.js",Eg(e,o).then((function(g){try{return a=g,c()}catch{return i()}}),i)}catch{i()}function u(){try{a.name=e.name,a.lastModified=e.lastModified}catch{}try{o.preserveExif&&e.type==="image/jpeg"&&(!o.fileType||o.fileType&&o.fileType===e.type)&&(a=Xl(e,a))}catch{}return r(a)}}))}ht.getDataUrlFromFile=Jl,ht.getFilefromDataUrl=na,ht.loadImage=Rl,ht.drawImageInCanvas=ti,ht.drawFileInCanvas=Un,ht.canvasToFile=zn,ht.getExifOrientation=ri,ht.handleMaxWidthOrHeight=ni,ht.followExifOrientation=oi,ht.cleanupCanvasMemory=Zt,ht.isAutoOrientationInBrowser=Pr,ht.approximateBelowMaximumCanvasSizeOfBrowser=ei,ht.copyExifWithoutOrientation=Xl,ht.getBrowserName=gr,ht.version="2.0.2";const Tg=window.G7Core,Hn=e=>{const t=["B","KB","MB","GB"];let r=0,n=e;for(;n>=1024&&r{if(e&&typeof e=="object"){const t=e;if(t.response?.data?.message)return t.response.data.message;if(t.response?.data?.errors){const r=Object.values(t.response.data.errors)[0];if(Array.isArray(r)&&r[0])return r[0]}if(t.message)return t.message}return e instanceof Error?e.message:"업로드 실패"},li=e=>e?e.startsWith("image/")?"fa-file-image":e.startsWith("video/")?"fa-file-video":e.startsWith("audio/")?"fa-file-audio":e==="application/pdf"?"fa-file-pdf":e.includes("word")||e.includes("document")?"fa-file-word":e.includes("excel")||e.includes("spreadsheet")?"fa-file-excel":e.includes("zip")||e.includes("compressed")?"fa-file-zipper":"fa-file":"fa-file",et=(e,t)=>Tg?.t?.(e,t)??e,hr=window.G7Core;function ii(e){const{attachmentableType:t,attachmentableId:r,collection:n,maxFiles:o,maxSize:a,maxConcurrentUploads:s,accept:l,imageCompression:f,roleIds:h,autoUpload:c,initialFiles:i,endpoints:u,onFilesChange:g,onUploadComplete:p,onUploadError:m,onRemove:v,onReorder:x,uploadTriggerEvent:M,confirmBeforeRemove:w,uploadParams:T}=e,[A,_]=C.useState(i),[I,k]=C.useState([]),[y,N]=C.useState(!1),D=C.useRef(null),P=C.useRef(0),O=C.useRef(new Set),L=C.useRef(new Map),[$,S]=C.useState(!1),[b,z]=C.useState(null),[U,G]=C.useState(!1),Y=C.useRef(!1),[B,V]=C.useState([]),j=C.useRef(i),[H,q]=C.useState(!1),[ee,ne]=C.useState(0),ce=C.useRef(0),[R,_e]=C.useState(new Map),me=C.useRef(new Map);C.useEffect(()=>{g?.(I)},[I,g]);const Be=C.useMemo(()=>{const X=j.current;return X===i?X:X.length!==i.length?(j.current=i,i):X.length===0&&i.length===0?X:i.some((de,ue)=>de.id!==X[ue]?.id)?(j.current=i,i):X},[i]);C.useEffect(()=>{if(Y.current)return;const X=Be.filter(ue=>!O.current.has(ue.id)&&(!ue.hash||!O.current.has(ue.hash))),se=new Set(X.map(ue=>ue.id)),de=Array.from(L.current.values()).filter(ue=>!se.has(ue.id)&&!O.current.has(ue.id));_([...X,...de])},[Be]);const $e=C.useCallback(async X=>{const se={maxSizeMB:f?.maxSizeMB??1,maxWidthOrHeight:f?.maxWidthOrHeight??1920,useWebWorker:!0};return await ht(X,se)},[f]),ye=C.useCallback(async X=>{const se=A.length+I.length,de=Math.max(0,o-se),ue=Array.from(X).slice(0,de);if(X.length>de){const ie=Array.from(X).slice(de),De=et("attachment.upload_limit_exceeded",{max:o});m?.(De,ie[0]??X[0])}for(const ie of ue){if(ie.size>a*1024*1024){m?.(`[${ie.name}] 파일 크기(${Hn(ie.size)})가 최대 허용 크기(${a}MB)를 초과합니다.`,ie);continue}if(l){const ge="."+ie.name.split(".").pop()?.toLowerCase();if(!l.split(",").map(ze=>ze.trim().toLowerCase()).some(ze=>{if(ze.includes("/")){if(ze.endsWith("/*")){const Ke=ze.slice(0,-2);return ie.type.toLowerCase().startsWith(Ke+"/")}return ie.type.toLowerCase()===ze}return ge===ze})){m?.(`[${ie.name}] 허용되지 않는 파일 형식입니다. (허용: ${l})`,ie);continue}}const De={id:`pending-${Date.now()}-${Math.random().toString(36).substr(2,9)}`,file:ie,original_filename:ie.name,mime_type:ie.type,size:ie.size,size_formatted:Hn(ie.size),status:"pending",progress:0};if(ie.type.startsWith("image/")&&(De.preview=URL.createObjectURL(ie)),k(ge=>[...ge,De]),ie.type.startsWith("image/")&&f){k(ge=>ge.map(xe=>xe.id===De.id?{...xe,status:"compressing"}:xe));try{const ge=await $e(ie);k(xe=>xe.map(Ce=>Ce.id===De.id?{...Ce,compressedBlob:ge,size:ge.size,size_formatted:Hn(ge.size),status:"pending",progress:0}:Ce))}catch{k(ge=>ge.map(xe=>xe.id===De.id?{...xe,status:"error",error:"이미지 압축 실패"}:xe))}}}},[A.length,I.length,o,a,l,f,$e,m]),Ne=C.useCallback(async X=>{const se=new FormData,de=X.compressedBlob?new File([X.compressedBlob],X.original_filename,{type:X.mime_type}):X.file;se.append("file",de),t&&se.append("attachmentable_type",t),r&&se.append("attachmentable_id",String(r)),se.append("collection",n),h.forEach(ue=>{se.append("role_ids[]",String(ue))}),T&&Object.entries(T).forEach(([ue,ie])=>{se.append(ue,ie)});try{const ue=await hr.api.post(u.upload,se,{headers:{"Content-Type":"multipart/form-data"},onUploadProgress:De=>{const ge=Math.round(De.loaded*100/(De.total??1));k(xe=>xe.map(Ce=>Ce.id===X.id?{...Ce,progress:ge}:Ce))}});return ue?.data?.data??ue?.data}catch(ue){const ie=si(ue);throw new Error(ie)}},[t,r,n,h,u.upload]),we=C.useCallback(async()=>{const X=I.filter(ge=>ge.status==="pending"||ge.status==="error");if(X.length===0)return[];const se=[],de=new Map,ue=[...X],ie=async()=>{for(;ue.length>0&&P.currentxe.map(Ce=>Ce.id===ge.id?{...Ce,status:"uploading",progress:0}:Ce));try{const xe=await Ne(ge);if(xe)se.push(xe),de.set(String(ge.id),String(xe.hash)),L.current.set(xe.id,xe),k(Ce=>Ce.filter(ze=>ze.id!==ge.id)),_(Ce=>[...Ce,xe]),V(Ce=>{if(Ce.length===0)return Ce;const ze=String(ge.id);return Ce.some(Se=>String(Se)===ze)?Ce.map(Se=>String(Se)===ze?String(xe.hash):Se):Ce}),ge.preview&&URL.revokeObjectURL(ge.preview);else{const Ce=et("attachment.upload_response_invalid");k(ze=>ze.map(Ke=>Ke.id===ge.id?{...Ke,status:"error",error:Ce}:Ke)),m?.(`[${ge.original_filename}] ${Ce}`,ge.file)}}catch(xe){const Ce=xe instanceof Error?xe.message:"업로드 실패";k(ze=>ze.map(Ke=>Ke.id===ge.id?{...Ke,status:"error",error:Ce}:Ke)),m?.(`[${ge.original_filename}] ${Ce}`,ge.file)}finally{P.current--}}},De=Array(Math.min(s,X.length)).fill(null).map(()=>ie());if(await Promise.all(De),se.length>0&&(p?.(se),u.reorder&&B.length>0&&x)){const ge=[...A,...se],xe=B.map(Ke=>de.get(String(Ke))??Ke),Ce=new Map(xe.map((Ke,Se)=>[String(Ke),Se])),ze=[...ge].sort((Ke,Se)=>{const be=Ce.get(String(Ke.hash))??ge.length,Me=Ce.get(String(Se.hash))??ge.length;return be-Me}).map((Ke,Se)=>({...Ke,sort_order:Se,order:Se+1}));x(ze)}return se},[I,s,Ne,p,m,B,A,x,u.reorder]);C.useEffect(()=>{if(!M)return;const X=hr.componentEvent.on(M,async()=>{const se=await we();return{uploadedAttachments:se,existingFiles:A,allFiles:[...A,...se]}});return()=>{X()}},[M,we,A]),C.useEffect(()=>{c&&I.some(X=>X.status==="pending")&&we()},[c,I,we]);const ke=C.useCallback(async X=>{G(!0);try{if(X.id&&u.delete){const de=u.delete.replace(":id",String(X.id));await hr.api.delete(de)}const se=X.hash||X.id;X.id&&(O.current.add(X.id),L.current.delete(X.id)),X.hash&&O.current.add(X.hash),_(de=>de.filter(ue=>(ue.hash||ue.id)!==se)),v?.(X.hash||X.id),S(!1),z(null)}catch{console.error("첨부파일 삭제 실패")}finally{G(!1)}},[v,u.delete]),Ue=C.useCallback(async X=>{"hash"in X?w?(z(X),S(!0)):await ke(X):(X.preview&&URL.revokeObjectURL(X.preview),k(se=>se.filter(de=>de.id!==X.id)))},[w,ke]),Oe=C.useCallback(X=>{k(se=>se.map(de=>de.id===X.id?{...de,status:"pending",error:void 0}:de))},[]),K=C.useCallback(async X=>{const{arrayMove:se}=await Promise.resolve().then(()=>i0),{active:de,over:ue}=X;if(!ue||de.id===ue.id)return;const ie=[...A,...I];let De;if(B.length===0)De=ie;else{const be=new Map(B.map((Me,je)=>[String(Me),je]));De=[...ie].sort((Me,je)=>{const rt="hash"in Me?String(Me.hash):String(Me.id),Ye="hash"in je?String(je.hash):String(je.id);return(be.get(rt)??ie.length)-(be.get(Ye)??ie.length)})}const ge=De.findIndex(be=>"hash"in be?be.hash===de.id:be.id===de.id),xe=De.findIndex(be=>"hash"in be?be.hash===ue.id:be.id===ue.id),Ce=se(De,ge,xe);V(Ce.map(be=>"hash"in be?be.hash:be.id));const ze=Ce.filter(be=>"hash"in be),Ke=Ce.filter(be=>!("hash"in be));Y.current=!0,_(ze),k(Ke);const Se=ze.map((be,Me)=>({...be,sort_order:Me,order:Me+1}));if(ze.length>0&&u.reorder){const be=ze.map((Me,je)=>({id:Me.id,order:je+1}));try{const Me=await hr.api.patch(u.reorder,{order:be});hr.toast.success(Me.message)}catch(Me){const je=Me instanceof Error?Me.message:et("attachment.reorder_failed");hr.toast.error(je)}}x?.(Se)},[A,I,B,u.reorder,x]),te=C.useMemo(()=>[...A,...I].filter(X=>"is_image"in X?X.is_image:X.mime_type?.startsWith("image/")??!1),[A,I]),oe=C.useCallback(X=>{const se=te.findIndex(de=>"hash"in X&&"hash"in de?de.hash===X.hash:"id"in X&&"id"in de&&!("hash"in X)&&!("hash"in de)?de.id===X.id:!1);se!==-1&&(ce.current+=1,ne(se),q(!0))},[te]);C.useEffect(()=>{let X=!1;return(async()=>{const de=A.filter(ie=>ie.is_image),ue=new Set(de.map(ie=>ie.id));for(const[ie,De]of me.current)ue.has(ie)||(URL.revokeObjectURL(De),me.current.delete(ie));for(const ie of de){if(X)break;if(!me.current.has(ie.id))try{const De=await hr.api.get(ie.download_url,{responseType:"blob"});if(!X&&De){const ge=URL.createObjectURL(De);me.current.set(ie.id,ge),_e(new Map(me.current))}}catch(De){console.error("Failed to load authenticated image:",De)}}})(),()=>{X=!0}},[A]),C.useEffect(()=>()=>{me.current.forEach(X=>URL.revokeObjectURL(X)),me.current.clear()},[]);const le=C.useCallback(async X=>{const{executeImageDownload:se}=await Promise.resolve().then(()=>zl);await se({src:X.download_url,downloadUrl:X.download_url,filename:X.original_filename,downloadRequiresAuth:!0})},[]),ve=C.useMemo(()=>{const X=[...A,...I];if(B.length===0)return X;const se=new Map(B.map((de,ue)=>[String(de),ue]));return[...X].sort((de,ue)=>{const ie="hash"in de?String(de.hash):String(de.id),De="hash"in ue?String(ue.hash):String(ue.id),ge=se.get(ie)??X.length,xe=se.get(De)??X.length;return ge-xe})},[A,I,B]),Te=ve.length,We=Te>0,Ae=Tek([]),[]),Ie=C.useCallback(()=>I,[I]);return{existingFiles:A,pendingFiles:I,isDragOver:y,setIsDragOver:N,isDeleting:U,totalCount:Te,hasFiles:We,canAddMore:Ae,allItems:ve,imageFiles:te,handleFiles:ye,handleRemove:Ue,handleRetry:Oe,handleUploadAll:we,handleOpenGallery:oe,handleDownload:le,handleDragEnd:K,inputRef:D,galleryOpen:H,setGalleryOpen:q,galleryStartIndex:ee,galleryKeyRef:ce,confirmDialogOpen:$,setConfirmDialogOpen:S,itemToDelete:b,executeRemoveAttachment:ke,authenticatedImageUrls:R,clear:He,getPendingFiles:Ie}}const ci=({isDragOver:e,canAddMore:t,onFiles:r,setIsDragOver:n,inputRef:o,accept:a,maxFiles:s,maxSize:l,children:f})=>d.jsxs(W,{className:` relative border-2 border-dashed rounded-lg transition-colors ${e?"border-blue-500 bg-blue-50 dark:bg-blue-900/20":"border-gray-300 dark:border-gray-600"} - `,onDragOver:h=>{h.preventDefault(),t&&n(!0)},onDragLeave:()=>n(!1),onDrop:h=>{h.preventDefault(),n(!1),t&&r(h.dataTransfer.files)},children:[d.jsx("input",{ref:o,type:"file",multiple:!0,accept:a,onChange:h=>h.target.files&&r(h.target.files),className:"hidden"}),!g&&d.jsxs(W,{className:"p-8 text-center cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800/50 transition-colors",onClick:()=>o.current?.click(),children:[d.jsx(Ct,{className:"fa-solid fa-cloud-arrow-up text-4xl text-gray-400 dark:text-gray-500 mb-4"}),d.jsx(Dt,{className:"text-sm text-gray-600 dark:text-gray-400",children:nt("attachment.drop_or_click")}),d.jsxs(Dt,{className:"text-xs text-gray-500 dark:text-gray-500 mt-2",children:[nt("attachment.upload_limit",{maxFiles:s,maxSize:l}),a&&` (${a})`]})]}),g]});function sg(){for(var e=arguments.length,t=new Array(e),r=0;rn=>{t.forEach(o=>o(n))},t)}const $n=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u";function Ar(e){const t=Object.prototype.toString.call(e);return t==="[object Window]"||t==="[object global]"}function na(e){return"nodeType"in e}function yt(e){var t,r;return e?Ar(e)?e:na(e)&&(t=(r=e.ownerDocument)==null?void 0:r.defaultView)!=null?t:window:window}function oa(e){const{Document:t}=yt(e);return e instanceof t}function Qr(e){return Ar(e)?!1:e instanceof yt(e).HTMLElement}function Rl(e){return e instanceof yt(e).SVGElement}function Mr(e){return e?Ar(e)?e.document:na(e)?oa(e)?e:Qr(e)||Rl(e)?e.ownerDocument:document:document:document}const Yt=$n?k.useLayoutEffect:k.useEffect;function aa(e){const t=k.useRef(e);return Yt(()=>{t.current=e}),k.useCallback(function(){for(var r=arguments.length,n=new Array(r),o=0;o{e.current=setInterval(n,o)},[]),r=k.useCallback(()=>{e.current!==null&&(clearInterval(e.current),e.current=null)},[]);return[t,r]}function Jr(e,t){t===void 0&&(t=[e]);const r=k.useRef(e);return Yt(()=>{r.current!==e&&(r.current=e)},t),r}function Rr(e,t){const r=k.useRef();return k.useMemo(()=>{const n=e(r.current);return r.current=n,n},[...t])}function zn(e){const t=aa(e),r=k.useRef(null),n=k.useCallback(o=>{o!==r.current&&t?.(o,r.current),r.current=o},[]);return[r,n]}function sa(e){const t=k.useRef();return k.useEffect(()=>{t.current=e},[e]),t.current}let la={};function en(e,t){return k.useMemo(()=>{if(t)return t;const r=la[e]==null?0:la[e]+1;return la[e]=r,e+"-"+r},[e,t])}function ei(e){return function(t){for(var r=arguments.length,n=new Array(r>1?r-1:0),o=1;o{const l=Object.entries(s);for(const[g,h]of l){const c=a[g];c!=null&&(a[g]=c+e*h)}return a},{...t})}}const Or=ei(1),tn=ei(-1);function ig(e){return"clientX"in e&&"clientY"in e}function ia(e){if(!e)return!1;const{KeyboardEvent:t}=yt(e.target);return t&&e instanceof t}function cg(e){if(!e)return!1;const{TouchEvent:t}=yt(e.target);return t&&e instanceof t}function ca(e){if(cg(e)){if(e.touches&&e.touches.length){const{clientX:t,clientY:r}=e.touches[0];return{x:t,y:r}}else if(e.changedTouches&&e.changedTouches.length){const{clientX:t,clientY:r}=e.changedTouches[0];return{x:t,y:r}}}return ig(e)?{x:e.clientX,y:e.clientY}:null}const rn=Object.freeze({Translate:{toString(e){if(!e)return;const{x:t,y:r}=e;return"translate3d("+(t?Math.round(t):0)+"px, "+(r?Math.round(r):0)+"px, 0)"}},Scale:{toString(e){if(!e)return;const{scaleX:t,scaleY:r}=e;return"scaleX("+t+") scaleY("+r+")"}},Transform:{toString(e){if(e)return[rn.Translate.toString(e),rn.Scale.toString(e)].join(" ")}},Transition:{toString(e){let{property:t,duration:r,easing:n}=e;return t+" "+r+"ms "+n}}}),ti="a,frame,iframe,input:not([type=hidden]):not(:disabled),select:not(:disabled),textarea:not(:disabled),button:not(:disabled),*[tabindex]";function dg(e){return e.matches(ti)?e:e.querySelector(ti)}const ug={display:"none"};function fg(e){let{id:t,value:r}=e;return k.createElement("div",{id:t,style:ug},r)}function gg(e){let{id:t,announcement:r,ariaLiveType:n="assertive"}=e;const o={position:"fixed",top:0,left:0,width:1,height:1,margin:-1,border:0,padding:0,overflow:"hidden",clip:"rect(0 0 0 0)",clipPath:"inset(100%)",whiteSpace:"nowrap"};return k.createElement("div",{id:t,style:o,role:"status","aria-live":n,"aria-atomic":!0},r)}function hg(){const[e,t]=k.useState("");return{announce:k.useCallback(n=>{n!=null&&t(n)},[]),announcement:e}}const ri=k.createContext(null);function pg(e){const t=k.useContext(ri);k.useEffect(()=>{if(!t)throw new Error("useDndMonitor must be used within a children of ");return t(e)},[e,t])}function mg(){const[e]=k.useState(()=>new Set),t=k.useCallback(n=>(e.add(n),()=>e.delete(n)),[e]);return[k.useCallback(n=>{let{type:o,event:a}=n;e.forEach(s=>{var l;return(l=s[o])==null?void 0:l.call(s,a)})},[e]),t]}const bg={draggable:` + `,onDragOver:h=>{h.preventDefault(),t&&n(!0)},onDragLeave:()=>n(!1),onDrop:h=>{h.preventDefault(),n(!1),t&&r(h.dataTransfer.files)},children:[d.jsx("input",{ref:o,type:"file",multiple:!0,accept:a,onChange:h=>h.target.files&&r(h.target.files),className:"hidden"}),!f&&d.jsxs(W,{className:"p-8 text-center cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-800/50 transition-colors",onClick:()=>o.current?.click(),children:[d.jsx(Nt,{className:"fa-solid fa-cloud-arrow-up text-4xl text-gray-400 dark:text-gray-500 mb-4"}),d.jsx(zt,{className:"text-sm text-gray-600 dark:text-gray-400",children:et("attachment.drop_or_click")}),d.jsxs(zt,{className:"text-xs text-gray-500 dark:text-gray-500 mt-2",children:[et("attachment.upload_limit",{maxFiles:s,maxSize:l}),a&&` (${a})`]})]}),f]});function Ng(){for(var e=arguments.length,t=new Array(e),r=0;rn=>{t.forEach(o=>o(n))},t)}const Gn=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u";function Fr(e){const t=Object.prototype.toString.call(e);return t==="[object Window]"||t==="[object global]"}function aa(e){return"nodeType"in e}function xt(e){var t,r;return e?Fr(e)?e:aa(e)&&(t=(r=e.ownerDocument)==null?void 0:r.defaultView)!=null?t:window:window}function sa(e){const{Document:t}=xt(e);return e instanceof t}function tn(e){return Fr(e)?!1:e instanceof xt(e).HTMLElement}function di(e){return e instanceof xt(e).SVGElement}function $r(e){return e?Fr(e)?e.document:aa(e)?sa(e)?e:tn(e)||di(e)?e.ownerDocument:document:document:document}const qt=Gn?C.useLayoutEffect:C.useEffect;function la(e){const t=C.useRef(e);return qt(()=>{t.current=e}),C.useCallback(function(){for(var r=arguments.length,n=new Array(r),o=0;o{e.current=setInterval(n,o)},[]),r=C.useCallback(()=>{e.current!==null&&(clearInterval(e.current),e.current=null)},[]);return[t,r]}function rn(e,t){t===void 0&&(t=[e]);const r=C.useRef(e);return qt(()=>{r.current!==e&&(r.current=e)},t),r}function nn(e,t){const r=C.useRef();return C.useMemo(()=>{const n=e(r.current);return r.current=n,n},[...t])}function jn(e){const t=la(e),r=C.useRef(null),n=C.useCallback(o=>{o!==r.current&&t?.(o,r.current),r.current=o},[]);return[r,n]}function ia(e){const t=C.useRef();return C.useEffect(()=>{t.current=e},[e]),t.current}let ca={};function on(e,t){return C.useMemo(()=>{if(t)return t;const r=ca[e]==null?0:ca[e]+1;return ca[e]=r,e+"-"+r},[e,t])}function ui(e){return function(t){for(var r=arguments.length,n=new Array(r>1?r-1:0),o=1;o{const l=Object.entries(s);for(const[f,h]of l){const c=a[f];c!=null&&(a[f]=c+e*h)}return a},{...t})}}const Ur=ui(1),an=ui(-1);function Mg(e){return"clientX"in e&&"clientY"in e}function da(e){if(!e)return!1;const{KeyboardEvent:t}=xt(e.target);return t&&e instanceof t}function Og(e){if(!e)return!1;const{TouchEvent:t}=xt(e.target);return t&&e instanceof t}function ua(e){if(Og(e)){if(e.touches&&e.touches.length){const{clientX:t,clientY:r}=e.touches[0];return{x:t,y:r}}else if(e.changedTouches&&e.changedTouches.length){const{clientX:t,clientY:r}=e.changedTouches[0];return{x:t,y:r}}}return Mg(e)?{x:e.clientX,y:e.clientY}:null}const sn=Object.freeze({Translate:{toString(e){if(!e)return;const{x:t,y:r}=e;return"translate3d("+(t?Math.round(t):0)+"px, "+(r?Math.round(r):0)+"px, 0)"}},Scale:{toString(e){if(!e)return;const{scaleX:t,scaleY:r}=e;return"scaleX("+t+") scaleY("+r+")"}},Transform:{toString(e){if(e)return[sn.Translate.toString(e),sn.Scale.toString(e)].join(" ")}},Transition:{toString(e){let{property:t,duration:r,easing:n}=e;return t+" "+r+"ms "+n}}}),fi="a,frame,iframe,input:not([type=hidden]):not(:disabled),select:not(:disabled),textarea:not(:disabled),button:not(:disabled),*[tabindex]";function Ig(e){return e.matches(fi)?e:e.querySelector(fi)}const Dg={display:"none"};function Lg(e){let{id:t,value:r}=e;return C.createElement("div",{id:t,style:Dg},r)}function Pg(e){let{id:t,announcement:r,ariaLiveType:n="assertive"}=e;const o={position:"fixed",top:0,left:0,width:1,height:1,margin:-1,border:0,padding:0,overflow:"hidden",clip:"rect(0 0 0 0)",clipPath:"inset(100%)",whiteSpace:"nowrap"};return C.createElement("div",{id:t,style:o,role:"status","aria-live":n,"aria-atomic":!0},r)}function Fg(){const[e,t]=C.useState("");return{announce:C.useCallback(n=>{n!=null&&t(n)},[]),announcement:e}}const gi=C.createContext(null);function $g(e){const t=C.useContext(gi);C.useEffect(()=>{if(!t)throw new Error("useDndMonitor must be used within a children of ");return t(e)},[e,t])}function Ug(){const[e]=C.useState(()=>new Set),t=C.useCallback(n=>(e.add(n),()=>e.delete(n)),[e]);return[C.useCallback(n=>{let{type:o,event:a}=n;e.forEach(s=>{var l;return(l=s[o])==null?void 0:l.call(s,a)})},[e]),t]}const zg={draggable:` To pick up a draggable item, press the space bar. While dragging, use the arrow keys to move the item. Press space again to drop the item in its new position, or press escape to cancel. - `},yg={onDragStart(e){let{active:t}=e;return"Picked up draggable item "+t.id+"."},onDragOver(e){let{active:t,over:r}=e;return r?"Draggable item "+t.id+" was moved over droppable area "+r.id+".":"Draggable item "+t.id+" is no longer over a droppable area."},onDragEnd(e){let{active:t,over:r}=e;return r?"Draggable item "+t.id+" was dropped over droppable area "+r.id:"Draggable item "+t.id+" was dropped."},onDragCancel(e){let{active:t}=e;return"Dragging was cancelled. Draggable item "+t.id+" was dropped."}};function vg(e){let{announcements:t=yg,container:r,hiddenTextDescribedById:n,screenReaderInstructions:o=bg}=e;const{announce:a,announcement:s}=hg(),l=en("DndLiveRegion"),[g,h]=k.useState(!1);if(k.useEffect(()=>{h(!0)},[]),pg(k.useMemo(()=>({onDragStart(i){let{active:u}=i;a(t.onDragStart({active:u}))},onDragMove(i){let{active:u,over:f}=i;t.onDragMove&&a(t.onDragMove({active:u,over:f}))},onDragOver(i){let{active:u,over:f}=i;a(t.onDragOver({active:u,over:f}))},onDragEnd(i){let{active:u,over:f}=i;a(t.onDragEnd({active:u,over:f}))},onDragCancel(i){let{active:u,over:f}=i;a(t.onDragCancel({active:u,over:f}))}}),[a,t])),!g)return null;const c=k.createElement(k.Fragment,null,k.createElement(fg,{id:n,value:o.draggable}),k.createElement(gg,{id:l,announcement:s}));return r?Jt.createPortal(c,r):c}var Re;(function(e){e.DragStart="dragStart",e.DragMove="dragMove",e.DragEnd="dragEnd",e.DragCancel="dragCancel",e.DragOver="dragOver",e.RegisterDroppable="registerDroppable",e.SetDroppableDisabled="setDroppableDisabled",e.UnregisterDroppable="unregisterDroppable"})(Re||(Re={}));function Hn(){}function ni(e,t){return k.useMemo(()=>({sensor:e,options:t??{}}),[e,t])}function wg(){for(var e=arguments.length,t=new Array(e),r=0;r[...t].filter(n=>n!=null),[...t])}const Gt=Object.freeze({x:0,y:0});function oi(e,t){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))}function ai(e,t){let{data:{value:r}}=e,{data:{value:n}}=t;return r-n}function xg(e,t){let{data:{value:r}}=e,{data:{value:n}}=t;return n-r}function si(e){let{left:t,top:r,height:n,width:o}=e;return[{x:t,y:r},{x:t+o,y:r},{x:t,y:r+n},{x:t+o,y:r+n}]}function li(e,t){if(!e||e.length===0)return null;const[r]=e;return r[t]}function ii(e,t,r){return t===void 0&&(t=e.left),r===void 0&&(r=e.top),{x:t+e.width*.5,y:r+e.height*.5}}const kg=e=>{let{collisionRect:t,droppableRects:r,droppableContainers:n}=e;const o=ii(t,t.left,t.top),a=[];for(const s of n){const{id:l}=s,g=r.get(l);if(g){const h=oi(ii(g),o);a.push({id:l,data:{droppableContainer:s,value:h}})}}return a.sort(ai)},Cg=e=>{let{collisionRect:t,droppableRects:r,droppableContainers:n}=e;const o=si(t),a=[];for(const s of n){const{id:l}=s,g=r.get(l);if(g){const h=si(g),c=o.reduce((u,f,p)=>u+oi(h[p],f),0),i=Number((c/4).toFixed(4));a.push({id:l,data:{droppableContainer:s,value:i}})}}return a.sort(ai)};function Sg(e,t){const r=Math.max(t.top,e.top),n=Math.max(t.left,e.left),o=Math.min(t.left+t.width,e.left+e.width),a=Math.min(t.top+t.height,e.top+e.height),s=o-n,l=a-r;if(n{let{collisionRect:t,droppableRects:r,droppableContainers:n}=e;const o=[];for(const a of n){const{id:s}=a,l=r.get(s);if(l){const g=Sg(l,t);g>0&&o.push({id:s,data:{droppableContainer:a,value:g}})}}return o.sort(xg)};function Eg(e,t,r){return{...e,scaleX:t&&r?t.width/r.width:1,scaleY:t&&r?t.height/r.height:1}}function ci(e,t){return e&&t?{x:e.left-t.left,y:e.top-t.top}:Gt}function Tg(e){return function(r){for(var n=arguments.length,o=new Array(n>1?n-1:0),a=1;a({...s,top:s.top+e*l.y,bottom:s.bottom+e*l.y,left:s.left+e*l.x,right:s.right+e*l.x}),{...r})}}const Ng=Tg(1);function Ag(e){if(e.startsWith("matrix3d(")){const t=e.slice(9,-1).split(/, /);return{x:+t[12],y:+t[13],scaleX:+t[0],scaleY:+t[5]}}else if(e.startsWith("matrix(")){const t=e.slice(7,-1).split(/, /);return{x:+t[4],y:+t[5],scaleX:+t[0],scaleY:+t[3]}}return null}function Mg(e,t,r){const n=Ag(t);if(!n)return e;const{scaleX:o,scaleY:a,x:s,y:l}=n,g=e.left-s-(1-o)*parseFloat(r),h=e.top-l-(1-a)*parseFloat(r.slice(r.indexOf(" ")+1)),c=o?e.width/o:e.width,i=a?e.height/a:e.height;return{width:c,height:i,top:h,right:g+c,bottom:h+i,left:g}}const Og={ignoreTransform:!1};function Ir(e,t){t===void 0&&(t=Og);let r=e.getBoundingClientRect();if(t.ignoreTransform){const{transform:h,transformOrigin:c}=yt(e).getComputedStyle(e);h&&(r=Mg(r,h,c))}const{top:n,left:o,width:a,height:s,bottom:l,right:g}=r;return{top:n,left:o,width:a,height:s,bottom:l,right:g}}function di(e){return Ir(e,{ignoreTransform:!0})}function Ig(e){const t=e.innerWidth,r=e.innerHeight;return{top:0,left:0,right:t,bottom:r,width:t,height:r}}function Dg(e,t){return t===void 0&&(t=yt(e).getComputedStyle(e)),t.position==="fixed"}function Lg(e,t){t===void 0&&(t=yt(e).getComputedStyle(e));const r=/(auto|scroll|overlay)/;return["overflow","overflowX","overflowY"].some(o=>{const a=t[o];return typeof a=="string"?r.test(a):!1})}function Gn(e,t){const r=[];function n(o){if(t!=null&&r.length>=t||!o)return r;if(oa(o)&&o.scrollingElement!=null&&!r.includes(o.scrollingElement))return r.push(o.scrollingElement),r;if(!Qr(o)||Rl(o)||r.includes(o))return r;const a=yt(e).getComputedStyle(o);return o!==e&&Lg(o,a)&&r.push(o),Dg(o,a)?r:n(o.parentNode)}return e?n(e):r}function ui(e){const[t]=Gn(e,1);return t??null}function da(e){return!$n||!e?null:Ar(e)?e:na(e)?oa(e)||e===Mr(e).scrollingElement?window:Qr(e)?e:null:null}function fi(e){return Ar(e)?e.scrollX:e.scrollLeft}function gi(e){return Ar(e)?e.scrollY:e.scrollTop}function ua(e){return{x:fi(e),y:gi(e)}}var ot;(function(e){e[e.Forward=1]="Forward",e[e.Backward=-1]="Backward"})(ot||(ot={}));function hi(e){return!$n||!e?!1:e===document.scrollingElement}function pi(e){const t={x:0,y:0},r=hi(e)?{height:window.innerHeight,width:window.innerWidth}:{height:e.clientHeight,width:e.clientWidth},n={x:e.scrollWidth-r.width,y:e.scrollHeight-r.height},o=e.scrollTop<=t.y,a=e.scrollLeft<=t.x,s=e.scrollTop>=n.y,l=e.scrollLeft>=n.x;return{isTop:o,isLeft:a,isBottom:s,isRight:l,maxScroll:n,minScroll:t}}const Pg={x:.2,y:.2};function Fg(e,t,r,n,o){let{top:a,left:s,right:l,bottom:g}=r;n===void 0&&(n=10),o===void 0&&(o=Pg);const{isTop:h,isBottom:c,isLeft:i,isRight:u}=pi(e),f={x:0,y:0},p={x:0,y:0},m={height:t.height*o.y,width:t.width*o.x};return!h&&a<=t.top+m.height?(f.y=ot.Backward,p.y=n*Math.abs((t.top+m.height-a)/m.height)):!c&&g>=t.bottom-m.height&&(f.y=ot.Forward,p.y=n*Math.abs((t.bottom-m.height-g)/m.height)),!u&&l>=t.right-m.width?(f.x=ot.Forward,p.x=n*Math.abs((t.right-m.width-l)/m.width)):!i&&s<=t.left+m.width&&(f.x=ot.Backward,p.x=n*Math.abs((t.left+m.width-s)/m.width)),{direction:f,speed:p}}function Ug(e){if(e===document.scrollingElement){const{innerWidth:a,innerHeight:s}=window;return{top:0,left:0,right:a,bottom:s,width:a,height:s}}const{top:t,left:r,right:n,bottom:o}=e.getBoundingClientRect();return{top:t,left:r,right:n,bottom:o,width:e.clientWidth,height:e.clientHeight}}function mi(e){return e.reduce((t,r)=>Or(t,ua(r)),Gt)}function $g(e){return e.reduce((t,r)=>t+fi(r),0)}function zg(e){return e.reduce((t,r)=>t+gi(r),0)}function Hg(e,t){if(t===void 0&&(t=Ir),!e)return;const{top:r,left:n,bottom:o,right:a}=t(e);ui(e)&&(o<=0||a<=0||r>=window.innerHeight||n>=window.innerWidth)&&e.scrollIntoView({block:"center",inline:"center"})}const Gg=[["x",["left","right"],$g],["y",["top","bottom"],zg]];class fa{constructor(t,r){this.rect=void 0,this.width=void 0,this.height=void 0,this.top=void 0,this.bottom=void 0,this.right=void 0,this.left=void 0;const n=Gn(r),o=mi(n);this.rect={...t},this.width=t.width,this.height=t.height;for(const[a,s,l]of Gg)for(const g of s)Object.defineProperty(this,g,{get:()=>{const h=l(n),c=o[a]-h;return this.rect[g]+c},enumerable:!0});Object.defineProperty(this,"rect",{enumerable:!1})}}class nn{constructor(t){this.target=void 0,this.listeners=[],this.removeAll=()=>{this.listeners.forEach(r=>{var n;return(n=this.target)==null?void 0:n.removeEventListener(...r)})},this.target=t}add(t,r,n){var o;(o=this.target)==null||o.addEventListener(t,r,n),this.listeners.push([t,r,n])}}function jg(e){const{EventTarget:t}=yt(e);return e instanceof t?e:Mr(e)}function ga(e,t){const r=Math.abs(e.x),n=Math.abs(e.y);return typeof t=="number"?Math.sqrt(r**2+n**2)>t:"x"in t&&"y"in t?r>t.x&&n>t.y:"x"in t?r>t.x:"y"in t?n>t.y:!1}var It;(function(e){e.Click="click",e.DragStart="dragstart",e.Keydown="keydown",e.ContextMenu="contextmenu",e.Resize="resize",e.SelectionChange="selectionchange",e.VisibilityChange="visibilitychange"})(It||(It={}));function bi(e){e.preventDefault()}function Bg(e){e.stopPropagation()}var ze;(function(e){e.Space="Space",e.Down="ArrowDown",e.Right="ArrowRight",e.Left="ArrowLeft",e.Up="ArrowUp",e.Esc="Escape",e.Enter="Enter",e.Tab="Tab"})(ze||(ze={}));const yi={start:[ze.Space,ze.Enter],cancel:[ze.Esc],end:[ze.Space,ze.Enter,ze.Tab]},Wg=(e,t)=>{let{currentCoordinates:r}=t;switch(e.code){case ze.Right:return{...r,x:r.x+25};case ze.Left:return{...r,x:r.x-25};case ze.Down:return{...r,y:r.y+25};case ze.Up:return{...r,y:r.y-25}}};class ha{constructor(t){this.props=void 0,this.autoScrollEnabled=!1,this.referenceCoordinates=void 0,this.listeners=void 0,this.windowListeners=void 0,this.props=t;const{event:{target:r}}=t;this.props=t,this.listeners=new nn(Mr(r)),this.windowListeners=new nn(yt(r)),this.handleKeyDown=this.handleKeyDown.bind(this),this.handleCancel=this.handleCancel.bind(this),this.attach()}attach(){this.handleStart(),this.windowListeners.add(It.Resize,this.handleCancel),this.windowListeners.add(It.VisibilityChange,this.handleCancel),setTimeout(()=>this.listeners.add(It.Keydown,this.handleKeyDown))}handleStart(){const{activeNode:t,onStart:r}=this.props,n=t.node.current;n&&Hg(n),r(Gt)}handleKeyDown(t){if(ia(t)){const{active:r,context:n,options:o}=this.props,{keyboardCodes:a=yi,coordinateGetter:s=Wg,scrollBehavior:l="smooth"}=o,{code:g}=t;if(a.end.includes(g)){this.handleEnd(t);return}if(a.cancel.includes(g)){this.handleCancel(t);return}const{collisionRect:h}=n.current,c=h?{x:h.left,y:h.top}:Gt;this.referenceCoordinates||(this.referenceCoordinates=c);const i=s(t,{active:r,context:n.current,currentCoordinates:c});if(i){const u=tn(i,c),f={x:0,y:0},{scrollableAncestors:p}=n.current;for(const m of p){const w=t.code,{isTop:x,isRight:A,isLeft:v,isBottom:E,maxScroll:O,minScroll:_}=pi(m),I=Ug(m),C={x:Math.min(w===ze.Right?I.right-I.width/2:I.right,Math.max(w===ze.Right?I.left:I.left+I.width/2,i.x)),y:Math.min(w===ze.Down?I.bottom-I.height/2:I.bottom,Math.max(w===ze.Down?I.top:I.top+I.height/2,i.y))},y=w===ze.Right&&!A||w===ze.Left&&!v,N=w===ze.Down&&!E||w===ze.Up&&!x;if(y&&C.x!==i.x){const M=m.scrollLeft+u.x,P=w===ze.Right&&M<=O.x||w===ze.Left&&M>=_.x;if(P&&!u.y){m.scrollTo({left:M,behavior:l});return}P?f.x=m.scrollLeft-M:f.x=w===ze.Right?m.scrollLeft-O.x:m.scrollLeft-_.x,f.x&&m.scrollBy({left:-f.x,behavior:l});break}else if(N&&C.y!==i.y){const M=m.scrollTop+u.y,P=w===ze.Down&&M<=O.y||w===ze.Up&&M>=_.y;if(P&&!u.x){m.scrollTo({top:M,behavior:l});return}P?f.y=m.scrollTop-M:f.y=w===ze.Down?m.scrollTop-O.y:m.scrollTop-_.y,f.y&&m.scrollBy({top:-f.y,behavior:l});break}}this.handleMove(t,Or(tn(i,this.referenceCoordinates),f))}}}handleMove(t,r){const{onMove:n}=this.props;t.preventDefault(),n(r)}handleEnd(t){const{onEnd:r}=this.props;t.preventDefault(),this.detach(),r()}handleCancel(t){const{onCancel:r}=this.props;t.preventDefault(),this.detach(),r()}detach(){this.listeners.removeAll(),this.windowListeners.removeAll()}}ha.activators=[{eventName:"onKeyDown",handler:(e,t,r)=>{let{keyboardCodes:n=yi,onActivation:o}=t,{active:a}=r;const{code:s}=e.nativeEvent;if(n.start.includes(s)){const l=a.activatorNode.current;return l&&e.target!==l?!1:(e.preventDefault(),o?.({event:e.nativeEvent}),!0)}return!1}}];function vi(e){return!!(e&&"distance"in e)}function wi(e){return!!(e&&"delay"in e)}class pa{constructor(t,r,n){var o;n===void 0&&(n=jg(t.event.target)),this.props=void 0,this.events=void 0,this.autoScrollEnabled=!0,this.document=void 0,this.activated=!1,this.initialCoordinates=void 0,this.timeoutId=null,this.listeners=void 0,this.documentListeners=void 0,this.windowListeners=void 0,this.props=t,this.events=r;const{event:a}=t,{target:s}=a;this.props=t,this.events=r,this.document=Mr(s),this.documentListeners=new nn(this.document),this.listeners=new nn(n),this.windowListeners=new nn(yt(s)),this.initialCoordinates=(o=ca(a))!=null?o:Gt,this.handleStart=this.handleStart.bind(this),this.handleMove=this.handleMove.bind(this),this.handleEnd=this.handleEnd.bind(this),this.handleCancel=this.handleCancel.bind(this),this.handleKeydown=this.handleKeydown.bind(this),this.removeTextSelection=this.removeTextSelection.bind(this),this.attach()}attach(){const{events:t,props:{options:{activationConstraint:r,bypassActivationConstraint:n}}}=this;if(this.listeners.add(t.move.name,this.handleMove,{passive:!1}),this.listeners.add(t.end.name,this.handleEnd),t.cancel&&this.listeners.add(t.cancel.name,this.handleCancel),this.windowListeners.add(It.Resize,this.handleCancel),this.windowListeners.add(It.DragStart,bi),this.windowListeners.add(It.VisibilityChange,this.handleCancel),this.windowListeners.add(It.ContextMenu,bi),this.documentListeners.add(It.Keydown,this.handleKeydown),r){if(n!=null&&n({event:this.props.event,activeNode:this.props.activeNode,options:this.props.options}))return this.handleStart();if(wi(r)){this.timeoutId=setTimeout(this.handleStart,r.delay),this.handlePending(r);return}if(vi(r)){this.handlePending(r);return}}this.handleStart()}detach(){this.listeners.removeAll(),this.windowListeners.removeAll(),setTimeout(this.documentListeners.removeAll,50),this.timeoutId!==null&&(clearTimeout(this.timeoutId),this.timeoutId=null)}handlePending(t,r){const{active:n,onPending:o}=this.props;o(n,t,this.initialCoordinates,r)}handleStart(){const{initialCoordinates:t}=this,{onStart:r}=this.props;t&&(this.activated=!0,this.documentListeners.add(It.Click,Bg,{capture:!0}),this.removeTextSelection(),this.documentListeners.add(It.SelectionChange,this.removeTextSelection),r(t))}handleMove(t){var r;const{activated:n,initialCoordinates:o,props:a}=this,{onMove:s,options:{activationConstraint:l}}=a;if(!o)return;const g=(r=ca(t))!=null?r:Gt,h=tn(o,g);if(!n&&l){if(vi(l)){if(l.tolerance!=null&&ga(h,l.tolerance))return this.handleCancel();if(ga(h,l.distance))return this.handleStart()}if(wi(l)&&ga(h,l.tolerance))return this.handleCancel();this.handlePending(l,h);return}t.cancelable&&t.preventDefault(),s(g)}handleEnd(){const{onAbort:t,onEnd:r}=this.props;this.detach(),this.activated||t(this.props.active),r()}handleCancel(){const{onAbort:t,onCancel:r}=this.props;this.detach(),this.activated||t(this.props.active),r()}handleKeydown(t){t.code===ze.Esc&&this.handleCancel()}removeTextSelection(){var t;(t=this.document.getSelection())==null||t.removeAllRanges()}}const Kg={cancel:{name:"pointercancel"},move:{name:"pointermove"},end:{name:"pointerup"}};class ma extends pa{constructor(t){const{event:r}=t,n=Mr(r.target);super(t,Kg,n)}}ma.activators=[{eventName:"onPointerDown",handler:(e,t)=>{let{nativeEvent:r}=e,{onActivation:n}=t;return!r.isPrimary||r.button!==0?!1:(n?.({event:r}),!0)}}];const Vg={move:{name:"mousemove"},end:{name:"mouseup"}};var ba;(function(e){e[e.RightClick=2]="RightClick"})(ba||(ba={}));class Yg extends pa{constructor(t){super(t,Vg,Mr(t.event.target))}}Yg.activators=[{eventName:"onMouseDown",handler:(e,t)=>{let{nativeEvent:r}=e,{onActivation:n}=t;return r.button===ba.RightClick?!1:(n?.({event:r}),!0)}}];const ya={cancel:{name:"touchcancel"},move:{name:"touchmove"},end:{name:"touchend"}};class Xg extends pa{constructor(t){super(t,ya)}static setup(){return window.addEventListener(ya.move.name,t,{capture:!1,passive:!1}),function(){window.removeEventListener(ya.move.name,t)};function t(){}}}Xg.activators=[{eventName:"onTouchStart",handler:(e,t)=>{let{nativeEvent:r}=e,{onActivation:n}=t;const{touches:o}=r;return o.length>1?!1:(n?.({event:r}),!0)}}];var on;(function(e){e[e.Pointer=0]="Pointer",e[e.DraggableRect=1]="DraggableRect"})(on||(on={}));var jn;(function(e){e[e.TreeOrder=0]="TreeOrder",e[e.ReversedTreeOrder=1]="ReversedTreeOrder"})(jn||(jn={}));function qg(e){let{acceleration:t,activator:r=on.Pointer,canScroll:n,draggingRect:o,enabled:a,interval:s=5,order:l=jn.TreeOrder,pointerCoordinates:g,scrollableAncestors:h,scrollableAncestorRects:c,delta:i,threshold:u}=e;const f=Qg({delta:i,disabled:!a}),[p,m]=lg(),w=k.useRef({x:0,y:0}),x=k.useRef({x:0,y:0}),A=k.useMemo(()=>{switch(r){case on.Pointer:return g?{top:g.y,bottom:g.y,left:g.x,right:g.x}:null;case on.DraggableRect:return o}},[r,o,g]),v=k.useRef(null),E=k.useCallback(()=>{const _=v.current;if(!_)return;const I=w.current.x*x.current.x,C=w.current.y*x.current.y;_.scrollBy(I,C)},[]),O=k.useMemo(()=>l===jn.TreeOrder?[...h].reverse():h,[l,h]);k.useEffect(()=>{if(!a||!h.length||!A){m();return}for(const _ of O){if(n?.(_)===!1)continue;const I=h.indexOf(_),C=c[I];if(!C)continue;const{direction:y,speed:N}=Fg(_,C,A,t,u);for(const M of["x","y"])f[M][y[M]]||(N[M]=0,y[M]=0);if(N.x>0||N.y>0){m(),v.current=_,p(E,s),w.current=N,x.current=y;return}}w.current={x:0,y:0},x.current={x:0,y:0},m()},[t,E,n,m,a,s,JSON.stringify(A),JSON.stringify(f),p,h,O,c,JSON.stringify(u)])}const Zg={x:{[ot.Backward]:!1,[ot.Forward]:!1},y:{[ot.Backward]:!1,[ot.Forward]:!1}};function Qg(e){let{delta:t,disabled:r}=e;const n=sa(t);return Rr(o=>{if(r||!n||!o)return Zg;const a={x:Math.sign(t.x-n.x),y:Math.sign(t.y-n.y)};return{x:{[ot.Backward]:o.x[ot.Backward]||a.x===-1,[ot.Forward]:o.x[ot.Forward]||a.x===1},y:{[ot.Backward]:o.y[ot.Backward]||a.y===-1,[ot.Forward]:o.y[ot.Forward]||a.y===1}}},[r,t,n])}function Jg(e,t){const r=t!=null?e.get(t):void 0,n=r?r.node.current:null;return Rr(o=>{var a;return t==null?null:(a=n??o)!=null?a:null},[n,t])}function Rg(e,t){return k.useMemo(()=>e.reduce((r,n)=>{const{sensor:o}=n,a=o.activators.map(s=>({eventName:s.eventName,handler:t(s.handler,n)}));return[...r,...a]},[]),[e,t])}var an;(function(e){e[e.Always=0]="Always",e[e.BeforeDragging=1]="BeforeDragging",e[e.WhileDragging=2]="WhileDragging"})(an||(an={}));var va;(function(e){e.Optimized="optimized"})(va||(va={}));const xi=new Map;function eh(e,t){let{dragging:r,dependencies:n,config:o}=t;const[a,s]=k.useState(null),{frequency:l,measure:g,strategy:h}=o,c=k.useRef(e),i=w(),u=Jr(i),f=k.useCallback(function(x){x===void 0&&(x=[]),!u.current&&s(A=>A===null?x:A.concat(x.filter(v=>!A.includes(v))))},[u]),p=k.useRef(null),m=Rr(x=>{if(i&&!r)return xi;if(!x||x===xi||c.current!==e||a!=null){const A=new Map;for(let v of e){if(!v)continue;if(a&&a.length>0&&!a.includes(v.id)&&v.rect.current){A.set(v.id,v.rect.current);continue}const E=v.node.current,O=E?new fa(g(E),E):null;v.rect.current=O,O&&A.set(v.id,O)}return A}return x},[e,a,r,i,g]);return k.useEffect(()=>{c.current=e},[e]),k.useEffect(()=>{i||f()},[r,i]),k.useEffect(()=>{a&&a.length>0&&s(null)},[JSON.stringify(a)]),k.useEffect(()=>{i||typeof l!="number"||p.current!==null||(p.current=setTimeout(()=>{f(),p.current=null},l))},[l,i,f,...n]),{droppableRects:m,measureDroppableContainers:f,measuringScheduled:a!=null};function w(){switch(h){case an.Always:return!1;case an.BeforeDragging:return r;default:return!r}}}function ki(e,t){return Rr(r=>e?r||(typeof t=="function"?t(e):e):null,[t,e])}function th(e,t){return ki(e,t)}function rh(e){let{callback:t,disabled:r}=e;const n=aa(t),o=k.useMemo(()=>{if(r||typeof window>"u"||typeof window.MutationObserver>"u")return;const{MutationObserver:a}=window;return new a(n)},[n,r]);return k.useEffect(()=>()=>o?.disconnect(),[o]),o}function Bn(e){let{callback:t,disabled:r}=e;const n=aa(t),o=k.useMemo(()=>{if(r||typeof window>"u"||typeof window.ResizeObserver>"u")return;const{ResizeObserver:a}=window;return new a(n)},[r]);return k.useEffect(()=>()=>o?.disconnect(),[o]),o}function nh(e){return new fa(Ir(e),e)}function Ci(e,t,r){t===void 0&&(t=nh);const[n,o]=k.useState(null);function a(){o(g=>{if(!e)return null;if(e.isConnected===!1){var h;return(h=g??r)!=null?h:null}const c=t(e);return JSON.stringify(g)===JSON.stringify(c)?g:c})}const s=rh({callback(g){if(e)for(const h of g){const{type:c,target:i}=h;if(c==="childList"&&i instanceof HTMLElement&&i.contains(e)){a();break}}}}),l=Bn({callback:a});return Yt(()=>{a(),e?(l?.observe(e),s?.observe(document.body,{childList:!0,subtree:!0})):(l?.disconnect(),s?.disconnect())},[e]),n}function oh(e){const t=ki(e);return ci(e,t)}const Si=[];function ah(e){const t=k.useRef(e),r=Rr(n=>e?n&&n!==Si&&e&&t.current&&e.parentNode===t.current.parentNode?n:Gn(e):Si,[e]);return k.useEffect(()=>{t.current=e},[e]),r}function sh(e){const[t,r]=k.useState(null),n=k.useRef(e),o=k.useCallback(a=>{const s=da(a.target);s&&r(l=>l?(l.set(s,ua(s)),new Map(l)):null)},[]);return k.useEffect(()=>{const a=n.current;if(e!==a){s(a);const l=e.map(g=>{const h=da(g);return h?(h.addEventListener("scroll",o,{passive:!0}),[h,ua(h)]):null}).filter(g=>g!=null);r(l.length?new Map(l):null),n.current=e}return()=>{s(e),s(a)};function s(l){l.forEach(g=>{const h=da(g);h?.removeEventListener("scroll",o)})}},[o,e]),k.useMemo(()=>e.length?t?Array.from(t.values()).reduce((a,s)=>Or(a,s),Gt):mi(e):Gt,[e,t])}function _i(e,t){t===void 0&&(t=[]);const r=k.useRef(null);return k.useEffect(()=>{r.current=null},t),k.useEffect(()=>{const n=e!==Gt;n&&!r.current&&(r.current=e),!n&&r.current&&(r.current=null)},[e]),r.current?tn(e,r.current):Gt}function lh(e){k.useEffect(()=>{if(!$n)return;const t=e.map(r=>{let{sensor:n}=r;return n.setup==null?void 0:n.setup()});return()=>{for(const r of t)r?.()}},e.map(t=>{let{sensor:r}=t;return r}))}function ih(e,t){return k.useMemo(()=>e.reduce((r,n)=>{let{eventName:o,handler:a}=n;return r[o]=s=>{a(s,t)},r},{}),[e,t])}function Ei(e){return k.useMemo(()=>e?Ig(e):null,[e])}const Ti=[];function ch(e,t){t===void 0&&(t=Ir);const[r]=e,n=Ei(r?yt(r):null),[o,a]=k.useState(Ti);function s(){a(()=>e.length?e.map(g=>hi(g)?n:new fa(t(g),g)):Ti)}const l=Bn({callback:s});return Yt(()=>{l?.disconnect(),s(),e.forEach(g=>l?.observe(g))},[e]),o}function dh(e){if(!e)return null;if(e.children.length>1)return e;const t=e.children[0];return Qr(t)?t:e}function uh(e){let{measure:t}=e;const[r,n]=k.useState(null),o=k.useCallback(h=>{for(const{target:c}of h)if(Qr(c)){n(i=>{const u=t(c);return i?{...i,width:u.width,height:u.height}:u});break}},[t]),a=Bn({callback:o}),s=k.useCallback(h=>{const c=dh(h);a?.disconnect(),c&&a?.observe(c),n(c?t(c):null)},[t,a]),[l,g]=zn(s);return k.useMemo(()=>({nodeRef:l,rect:r,setRef:g}),[r,l,g])}const fh=[{sensor:ma,options:{}},{sensor:ha,options:{}}],gh={current:{}},Wn={draggable:{measure:di},droppable:{measure:di,strategy:an.WhileDragging,frequency:va.Optimized},dragOverlay:{measure:Ir}};class sn extends Map{get(t){var r;return t!=null&&(r=super.get(t))!=null?r:void 0}toArray(){return Array.from(this.values())}getEnabled(){return this.toArray().filter(t=>{let{disabled:r}=t;return!r})}getNodeFor(t){var r,n;return(r=(n=this.get(t))==null?void 0:n.node.current)!=null?r:void 0}}const hh={activatorEvent:null,active:null,activeNode:null,activeNodeRect:null,collisions:null,containerNodeRect:null,draggableNodes:new Map,droppableRects:new Map,droppableContainers:new sn,over:null,dragOverlay:{nodeRef:{current:null},rect:null,setRef:Hn},scrollableAncestors:[],scrollableAncestorRects:[],measuringConfiguration:Wn,measureDroppableContainers:Hn,windowRect:null,measuringScheduled:!1},ph={activatorEvent:null,activators:[],active:null,activeNodeRect:null,ariaDescribedById:{draggable:""},dispatch:Hn,draggableNodes:new Map,over:null,measureDroppableContainers:Hn},Kn=k.createContext(ph),Ni=k.createContext(hh);function mh(){return{draggable:{active:null,initialCoordinates:{x:0,y:0},nodes:new Map,translate:{x:0,y:0}},droppable:{containers:new sn}}}function bh(e,t){switch(t.type){case Re.DragStart:return{...e,draggable:{...e.draggable,initialCoordinates:t.initialCoordinates,active:t.active}};case Re.DragMove:return e.draggable.active==null?e:{...e,draggable:{...e.draggable,translate:{x:t.coordinates.x-e.draggable.initialCoordinates.x,y:t.coordinates.y-e.draggable.initialCoordinates.y}}};case Re.DragEnd:case Re.DragCancel:return{...e,draggable:{...e.draggable,active:null,initialCoordinates:{x:0,y:0},translate:{x:0,y:0}}};case Re.RegisterDroppable:{const{element:r}=t,{id:n}=r,o=new sn(e.droppable.containers);return o.set(n,r),{...e,droppable:{...e.droppable,containers:o}}}case Re.SetDroppableDisabled:{const{id:r,key:n,disabled:o}=t,a=e.droppable.containers.get(r);if(!a||n!==a.key)return e;const s=new sn(e.droppable.containers);return s.set(r,{...a,disabled:o}),{...e,droppable:{...e.droppable,containers:s}}}case Re.UnregisterDroppable:{const{id:r,key:n}=t,o=e.droppable.containers.get(r);if(!o||n!==o.key)return e;const a=new sn(e.droppable.containers);return a.delete(r),{...e,droppable:{...e.droppable,containers:a}}}default:return e}}function yh(e){let{disabled:t}=e;const{active:r,activatorEvent:n,draggableNodes:o}=k.useContext(Kn),a=sa(n),s=sa(r?.id);return k.useEffect(()=>{if(!t&&!n&&a&&s!=null){if(!ia(a)||document.activeElement===a.target)return;const l=o.get(s);if(!l)return;const{activatorNode:g,node:h}=l;if(!g.current&&!h.current)return;requestAnimationFrame(()=>{for(const c of[g.current,h.current]){if(!c)continue;const i=dg(c);if(i){i.focus();break}}})}},[n,t,o,s,a]),null}function vh(e,t){let{transform:r,...n}=t;return e!=null&&e.length?e.reduce((o,a)=>a({transform:o,...n}),r):r}function wh(e){return k.useMemo(()=>({draggable:{...Wn.draggable,...e?.draggable},droppable:{...Wn.droppable,...e?.droppable},dragOverlay:{...Wn.dragOverlay,...e?.dragOverlay}}),[e?.draggable,e?.droppable,e?.dragOverlay])}function xh(e){let{activeNode:t,measure:r,initialRect:n,config:o=!0}=e;const a=k.useRef(!1),{x:s,y:l}=typeof o=="boolean"?{x:o,y:o}:o;Yt(()=>{if(!s&&!l||!t){a.current=!1;return}if(a.current||!n)return;const h=t?.node.current;if(!h||h.isConnected===!1)return;const c=r(h),i=ci(c,n);if(s||(i.x=0),l||(i.y=0),a.current=!0,Math.abs(i.x)>0||Math.abs(i.y)>0){const u=ui(h);u&&u.scrollBy({top:i.y,left:i.x})}},[t,s,l,n,r])}const Ai=k.createContext({...Gt,scaleX:1,scaleY:1});var tr;(function(e){e[e.Uninitialized=0]="Uninitialized",e[e.Initializing=1]="Initializing",e[e.Initialized=2]="Initialized"})(tr||(tr={}));const kh=k.memo(function(t){var r,n,o,a;let{id:s,accessibility:l,autoScroll:g=!0,children:h,sensors:c=fh,collisionDetection:i=_g,measuring:u,modifiers:f,...p}=t;const m=k.useReducer(bh,void 0,mh),[w,x]=m,[A,v]=mg(),[E,O]=k.useState(tr.Uninitialized),_=E===tr.Initialized,{draggable:{active:I,nodes:C,translate:y},droppable:{containers:N}}=w,M=I!=null?C.get(I):null,P=k.useRef({initial:null,translated:null}),D=k.useMemo(()=>{var Ee;return I!=null?{id:I,data:(Ee=M?.data)!=null?Ee:gh,rect:P}:null},[I,M]),L=k.useRef(null),[$,S]=k.useState(null),[b,U]=k.useState(null),F=Jr(p,Object.values(p)),G=en("DndDescribedBy",s),Y=k.useMemo(()=>N.getEnabled(),[N]),B=wh(u),{droppableRects:V,measureDroppableContainers:j,measuringScheduled:H}=eh(Y,{dragging:_,dependencies:[y.x,y.y],config:B.droppable}),q=Jg(C,I),ue=k.useMemo(()=>b?ca(b):null,[b]),ee=je(),fe=th(q,B.draggable.measure);xh({activeNode:I!=null?C.get(I):null,config:ee.layoutShiftCompensation,initialRect:fe,measure:B.draggable.measure});const R=Ci(q,B.draggable.measure,fe),ke=Ci(q?q.parentElement:null),me=k.useRef({activatorEvent:null,active:null,activeNode:q,collisionRect:null,collisions:null,droppableRects:V,draggableNodes:C,draggingNode:null,draggingNodeRect:null,droppableContainers:N,over:null,scrollableAncestors:[],scrollAdjustedTranslate:null}),Ge=N.getNodeFor((r=me.current.over)==null?void 0:r.id),De=uh({measure:B.dragOverlay.measure}),ye=(n=De.nodeRef.current)!=null?n:q,Me=_?(o=De.rect)!=null?o:R:null,Ce=!!(De.nodeRef.current&&De.rect),we=oh(Ce?null:R),Ue=Ei(ye?yt(ye):null),Le=ah(_?Ge??q:null),K=ch(Le),re=vh(f,{transform:{x:y.x-we.x,y:y.y-we.y,scaleX:1,scaleY:1},activatorEvent:b,active:D,activeNodeRect:R,containerNodeRect:ke,draggingNodeRect:Me,over:me.current.over,overlayNodeRect:De.rect,scrollableAncestors:Le,scrollableAncestorRects:K,windowRect:Ue}),ne=ue?Or(ue,y):null,oe=sh(Le),be=_i(oe),xe=_i(oe,[R]),He=Or(re,be),Pe=Me?Ng(Me,re):null,Ke=D&&Pe?i({active:D,collisionRect:Pe,droppableRects:V,droppableContainers:Y,pointerCoordinates:ne}):null,Oe=li(Ke,"id"),[X,ae]=k.useState(null),de=Ce?re:Or(re,xe),le=Eg(de,(a=X?.rect)!=null?a:null,R),se=k.useRef(null),Ne=k.useCallback((Ee,he)=>{let{sensor:Te,options:Ve}=he;if(L.current==null)return;const Fe=C.get(L.current);if(!Fe)return;const Be=Ee.nativeEvent,Ze=new Te({active:L.current,activeNode:Fe,event:Be,options:Ve,context:me,onAbort(qe){if(!C.get(qe))return;const{onDragAbort:_t}=F.current,Bt={id:qe};_t?.(Bt),A({type:"onDragAbort",event:Bt})},onPending(qe,jt,_t,Bt){if(!C.get(qe))return;const{onDragPending:Et}=F.current,Wt={id:qe,constraint:jt,initialCoordinates:_t,offset:Bt};Et?.(Wt),A({type:"onDragPending",event:Wt})},onStart(qe){const jt=L.current;if(jt==null)return;const _t=C.get(jt);if(!_t)return;const{onDragStart:Bt}=F.current,dt={activatorEvent:Be,active:{id:jt,data:_t.data,rect:P}};Jt.unstable_batchedUpdates(()=>{Bt?.(dt),O(tr.Initializing),x({type:Re.DragStart,initialCoordinates:qe,active:jt}),A({type:"onDragStart",event:dt}),S(se.current),U(Be)})},onMove(qe){x({type:Re.DragMove,coordinates:qe})},onEnd:qt(Re.DragEnd),onCancel:qt(Re.DragCancel)});se.current=Ze;function qt(qe){return async function(){const{active:_t,collisions:Bt,over:dt,scrollAdjustedTranslate:Et}=me.current;let Wt=null;if(_t&&Et){const{cancelDrop:nr}=F.current;Wt={activatorEvent:Be,active:_t,collisions:Bt,delta:Et,over:dt},qe===Re.DragEnd&&typeof nr=="function"&&await Promise.resolve(nr(Wt))&&(qe=Re.DragCancel)}L.current=null,Jt.unstable_batchedUpdates(()=>{x({type:qe}),O(tr.Uninitialized),ae(null),S(null),U(null),se.current=null;const nr=qe===Re.DragEnd?"onDragEnd":"onDragCancel";if(Wt){const mr=F.current[nr];mr?.(Wt),A({type:nr,event:Wt})}})}}},[C]),ve=k.useCallback((Ee,he)=>(Te,Ve)=>{const Fe=Te.nativeEvent,Be=C.get(Ve);if(L.current!==null||!Be||Fe.dndKit||Fe.defaultPrevented)return;const Ze={active:Be};Ee(Te,he.options,Ze)===!0&&(Fe.dndKit={capturedBy:he.sensor},L.current=Ve,Ne(Te,he))},[C,Ne]),Se=Rg(c,ve);lh(c),Yt(()=>{R&&E===tr.Initializing&&O(tr.Initialized)},[R,E]),k.useEffect(()=>{const{onDragMove:Ee}=F.current,{active:he,activatorEvent:Te,collisions:Ve,over:Fe}=me.current;if(!he||!Te)return;const Be={active:he,activatorEvent:Te,collisions:Ve,delta:{x:He.x,y:He.y},over:Fe};Jt.unstable_batchedUpdates(()=>{Ee?.(Be),A({type:"onDragMove",event:Be})})},[He.x,He.y]),k.useEffect(()=>{const{active:Ee,activatorEvent:he,collisions:Te,droppableContainers:Ve,scrollAdjustedTranslate:Fe}=me.current;if(!Ee||L.current==null||!he||!Fe)return;const{onDragOver:Be}=F.current,Ze=Ve.get(Oe),qt=Ze&&Ze.rect.current?{id:Ze.id,rect:Ze.rect.current,data:Ze.data,disabled:Ze.disabled}:null,qe={active:Ee,activatorEvent:he,collisions:Te,delta:{x:Fe.x,y:Fe.y},over:qt};Jt.unstable_batchedUpdates(()=>{ae(qt),Be?.(qe),A({type:"onDragOver",event:qe})})},[Oe]),Yt(()=>{me.current={activatorEvent:b,active:D,activeNode:q,collisionRect:Pe,collisions:Ke,droppableRects:V,draggableNodes:C,draggingNode:ye,draggingNodeRect:Me,droppableContainers:N,over:X,scrollableAncestors:Le,scrollAdjustedTranslate:He},P.current={initial:Me,translated:Pe}},[D,q,Ke,Pe,C,ye,Me,V,N,X,Le,He]),qg({...ee,delta:y,draggingRect:Pe,pointerCoordinates:ne,scrollableAncestors:Le,scrollableAncestorRects:K});const _e=k.useMemo(()=>({active:D,activeNode:q,activeNodeRect:R,activatorEvent:b,collisions:Ke,containerNodeRect:ke,dragOverlay:De,draggableNodes:C,droppableContainers:N,droppableRects:V,over:X,measureDroppableContainers:j,scrollableAncestors:Le,scrollableAncestorRects:K,measuringConfiguration:B,measuringScheduled:H,windowRect:Ue}),[D,q,R,b,Ke,ke,De,C,N,V,X,j,Le,K,B,H,Ue]),$e=k.useMemo(()=>({activatorEvent:b,activators:Se,active:D,activeNodeRect:R,ariaDescribedById:{draggable:G},dispatch:x,draggableNodes:C,over:X,measureDroppableContainers:j}),[b,Se,D,R,x,G,C,X,j]);return k.createElement(ri.Provider,{value:v},k.createElement(Kn.Provider,{value:$e},k.createElement(Ni.Provider,{value:_e},k.createElement(Ai.Provider,{value:le},h)),k.createElement(yh,{disabled:l?.restoreFocus===!1})),k.createElement(vg,{...l,hiddenTextDescribedById:G}));function je(){const Ee=$?.autoScrollEnabled===!1,he=typeof g=="object"?g.enabled===!1:g===!1,Te=_&&!Ee&&!he;return typeof g=="object"?{...g,enabled:Te}:{enabled:Te}}}),Ch=k.createContext(null),Mi="button",Sh="Draggable";function _h(e){let{id:t,data:r,disabled:n=!1,attributes:o}=e;const a=en(Sh),{activators:s,activatorEvent:l,active:g,activeNodeRect:h,ariaDescribedById:c,draggableNodes:i,over:u}=k.useContext(Kn),{role:f=Mi,roleDescription:p="draggable",tabIndex:m=0}=o??{},w=g?.id===t,x=k.useContext(w?Ai:Ch),[A,v]=zn(),[E,O]=zn(),_=ih(s,t),I=Jr(r);Yt(()=>(i.set(t,{id:t,key:a,node:A,activatorNode:E,data:I}),()=>{const y=i.get(t);y&&y.key===a&&i.delete(t)}),[i,t]);const C=k.useMemo(()=>({role:f,tabIndex:m,"aria-disabled":n,"aria-pressed":w&&f===Mi?!0:void 0,"aria-roledescription":p,"aria-describedby":c.draggable}),[n,f,m,w,p,c.draggable]);return{active:g,activatorEvent:l,activeNodeRect:h,attributes:C,isDragging:w,listeners:n?void 0:_,node:A,over:u,setNodeRef:v,setActivatorNodeRef:O,transform:x}}function Eh(){return k.useContext(Ni)}const Th="Droppable",Nh={timeout:25};function Ah(e){let{data:t,disabled:r=!1,id:n,resizeObserverConfig:o}=e;const a=en(Th),{active:s,dispatch:l,over:g,measureDroppableContainers:h}=k.useContext(Kn),c=k.useRef({disabled:r}),i=k.useRef(!1),u=k.useRef(null),f=k.useRef(null),{disabled:p,updateMeasurementsFor:m,timeout:w}={...Nh,...o},x=Jr(m??n),A=k.useCallback(()=>{if(!i.current){i.current=!0;return}f.current!=null&&clearTimeout(f.current),f.current=setTimeout(()=>{h(Array.isArray(x.current)?x.current:[x.current]),f.current=null},w)},[w]),v=Bn({callback:A,disabled:p||!s}),E=k.useCallback((C,y)=>{v&&(y&&(v.unobserve(y),i.current=!1),C&&v.observe(C))},[v]),[O,_]=zn(E),I=Jr(t);return k.useEffect(()=>{!v||!O.current||(v.disconnect(),i.current=!1,v.observe(O.current))},[O,v]),k.useEffect(()=>(l({type:Re.RegisterDroppable,element:{id:n,key:a,disabled:r,node:O,rect:u,data:I}}),()=>l({type:Re.UnregisterDroppable,key:a,id:n})),[n]),k.useEffect(()=>{r!==c.current.disabled&&(l({type:Re.SetDroppableDisabled,id:n,key:a,disabled:r}),c.current.disabled=r)},[n,a,r,l]),{active:s,rect:u,isOver:g?.id===n,node:O,over:g,setNodeRef:_}}function wa(e,t,r){const n=e.slice();return n.splice(r<0?n.length+r:r,0,n.splice(t,1)[0]),n}function Mh(e,t){return e.reduce((r,n,o)=>{const a=t.get(n);return a&&(r[o]=a),r},Array(e.length))}function Vn(e){return e!==null&&e>=0}function Oh(e,t){if(e===t)return!0;if(e.length!==t.length)return!1;for(let r=0;r{let{rects:t,activeIndex:r,overIndex:n,index:o}=e;const a=wa(t,n,r),s=t[o],l=a[o];return!l||!s?null:{x:l.left-s.left,y:l.top-s.top,scaleX:l.width/s.width,scaleY:l.height/s.height}},Oi="Sortable",Ii=k.createContext({activeIndex:-1,containerId:Oi,disableTransforms:!1,items:[],overIndex:-1,useDragOverlay:!1,sortedRects:[],strategy:Yn,disabled:{draggable:!1,droppable:!1}});function Di(e){let{children:t,id:r,items:n,strategy:o=Yn,disabled:a=!1}=e;const{active:s,dragOverlay:l,droppableRects:g,over:h,measureDroppableContainers:c}=Eh(),i=en(Oi,r),u=l.rect!==null,f=k.useMemo(()=>n.map(_=>typeof _=="object"&&"id"in _?_.id:_),[n]),p=s!=null,m=s?f.indexOf(s.id):-1,w=h?f.indexOf(h.id):-1,x=k.useRef(f),A=!Oh(f,x.current),v=w!==-1&&m===-1||A,E=Ih(a);Yt(()=>{A&&p&&c(f)},[A,f,p,c]),k.useEffect(()=>{x.current=f},[f]);const O=k.useMemo(()=>({activeIndex:m,containerId:i,disabled:E,disableTransforms:v,items:f,overIndex:w,useDragOverlay:u,sortedRects:Mh(f,g),strategy:o}),[m,i,E.draggable,E.droppable,v,f,w,g,u,o]);return k.createElement(Ii.Provider,{value:O},t)}const Li=e=>{let{id:t,items:r,activeIndex:n,overIndex:o}=e;return wa(r,n,o).indexOf(t)},Pi=e=>{let{containerId:t,isSorting:r,wasDragging:n,index:o,items:a,newIndex:s,previousItems:l,previousContainerId:g,transition:h}=e;return!h||!n||l!==a&&o===s?!1:r?!0:s!==o&&t===g},Dh={duration:200,easing:"ease"},Fi="transform",Lh=rn.Transition.toString({property:Fi,duration:0,easing:"linear"}),Ph={roleDescription:"sortable"};function Fh(e){let{disabled:t,index:r,node:n,rect:o}=e;const[a,s]=k.useState(null),l=k.useRef(r);return Yt(()=>{if(!t&&r!==l.current&&n.current){const g=o.current;if(g){const h=Ir(n.current,{ignoreTransform:!0}),c={x:g.left-h.left,y:g.top-h.top,scaleX:g.width/h.width,scaleY:g.height/h.height};(c.x||c.y)&&s(c)}}r!==l.current&&(l.current=r)},[t,r,n,o]),k.useEffect(()=>{a&&s(null)},[a]),a}function Ui(e){let{animateLayoutChanges:t=Pi,attributes:r,disabled:n,data:o,getNewIndex:a=Li,id:s,strategy:l,resizeObserverConfig:g,transition:h=Dh}=e;const{items:c,containerId:i,activeIndex:u,disabled:f,disableTransforms:p,sortedRects:m,overIndex:w,useDragOverlay:x,strategy:A}=k.useContext(Ii),v=Uh(n,f),E=c.indexOf(s),O=k.useMemo(()=>({sortable:{containerId:i,index:E,items:c},...o}),[i,o,E,c]),_=k.useMemo(()=>c.slice(c.indexOf(s)),[c,s]),{rect:I,node:C,isOver:y,setNodeRef:N}=Ah({id:s,data:O,disabled:v.droppable,resizeObserverConfig:{updateMeasurementsFor:_,...g}}),{active:M,activatorEvent:P,activeNodeRect:D,attributes:L,setNodeRef:$,listeners:S,isDragging:b,over:U,setActivatorNodeRef:F,transform:G}=_h({id:s,data:O,attributes:{...Ph,...r},disabled:v.draggable}),Y=sg(N,$),B=!!M,V=B&&!p&&Vn(u)&&Vn(w),j=!x&&b,H=j&&V?G:null,ue=V?H??(l??A)({rects:m,activeNodeRect:D,activeIndex:u,overIndex:w,index:E}):null,ee=Vn(u)&&Vn(w)?a({id:s,items:c,activeIndex:u,overIndex:w}):E,fe=M?.id,R=k.useRef({activeId:fe,items:c,newIndex:ee,containerId:i}),ke=c!==R.current.items,me=t({active:M,containerId:i,isDragging:b,isSorting:B,id:s,index:E,items:c,newIndex:R.current.newIndex,previousItems:R.current.items,previousContainerId:R.current.containerId,transition:h,wasDragging:R.current.activeId!=null}),Ge=Fh({disabled:!me,index:E,node:C,rect:I});return k.useEffect(()=>{B&&R.current.newIndex!==ee&&(R.current.newIndex=ee),i!==R.current.containerId&&(R.current.containerId=i),c!==R.current.items&&(R.current.items=c)},[B,ee,i,c]),k.useEffect(()=>{if(fe===R.current.activeId)return;if(fe!=null&&R.current.activeId==null){R.current.activeId=fe;return}const ye=setTimeout(()=>{R.current.activeId=fe},50);return()=>clearTimeout(ye)},[fe]),{active:M,activeIndex:u,attributes:L,data:O,rect:I,index:E,newIndex:ee,items:c,isOver:y,isSorting:B,isDragging:b,listeners:S,node:C,overIndex:w,over:U,setNodeRef:Y,setActivatorNodeRef:F,setDroppableNodeRef:N,setDraggableNodeRef:$,transform:Ge??ue,transition:De()};function De(){if(Ge||ke&&R.current.newIndex===E)return Lh;if(!(j&&!ia(P)||!h)&&(B||me))return rn.Transition.toString({...h,property:Fi})}}function Uh(e,t){var r,n;return typeof e=="boolean"?{draggable:e,droppable:!1}:{draggable:(r=e?.draggable)!=null?r:t.draggable,droppable:(n=e?.droppable)!=null?n:t.droppable}}function ln(e){if(!e)return!1;const t=e.data.current;return!!(t&&"sortable"in t&&typeof t.sortable=="object"&&"containerId"in t.sortable&&"items"in t.sortable&&"index"in t.sortable)}const $h=[ze.Down,ze.Right,ze.Up,ze.Left],$i=(e,t)=>{let{context:{active:r,collisionRect:n,droppableRects:o,droppableContainers:a,over:s,scrollableAncestors:l}}=t;if($h.includes(e.code)){if(e.preventDefault(),!r||!n)return;const g=[];a.getEnabled().forEach(i=>{if(!i||i!=null&&i.disabled)return;const u=o.get(i.id);if(u)switch(e.code){case ze.Down:n.topu.top&&g.push(i);break;case ze.Left:n.left>u.left&&g.push(i);break;case ze.Right:n.left1&&(c=h[1].id),c!=null){const i=a.get(r.id),u=a.get(c),f=u?o.get(u.id):null,p=u?.node.current;if(p&&f&&i&&u){const w=Gn(p).some((_,I)=>l[I]!==_),x=zi(i,u),A=zh(i,u),v=w||!x?{x:0,y:0}:{x:A?n.width-f.width:0,y:A?n.height-f.height:0},E={x:f.left,y:f.top};return v.x&&v.y?E:tn(E,v)}}}};function zi(e,t){return!ln(e)||!ln(t)?!1:e.data.current.sortable.containerId===t.data.current.sortable.containerId}function zh(e,t){return!ln(e)||!ln(t)||!zi(e,t)?!1:e.data.current.sortable.index{const{attributes:l,listeners:g,setNodeRef:h,transform:c,transition:i,isDragging:u}=Ui({id:"hash"in e?e.hash:e.id}),f={transform:rn.Transform.toString(c),transition:i,opacity:u?.5:1},p="status"in e&&e.status!==void 0,m=p?e.status:"done",w=m==="uploading",x=m==="compressing",A=m==="error",v=p?e.progress:100,E=p?e.preview:void 0,O=p?e.mime_type?.startsWith("image/")??!1:e.is_image,[_,I]=k.useState(void 0),C=!p&&O?e.download_url:void 0;k.useEffect(()=>{if(!C){I(void 0);return}let N=!0,M;return(async()=>{try{const D=await Gh.api.get(C,{responseType:"blob"});N&&D&&(M=URL.createObjectURL(D),I(M))}catch(D){console.error("Failed to load authenticated image:",D)}})(),()=>{N=!1,M&&URL.revokeObjectURL(M)}},[C]);const y=_;return d.jsxs(W,{ref:h,style:f,className:"relative group bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden",children:[d.jsxs(W,{className:`aspect-square w-full flex items-center justify-center bg-gray-50 dark:bg-gray-900 relative ${O||!p?"cursor-pointer":""}`,onClick:()=>{w||x||(O&&n?n():!p&&o&&o())},children:[E||y?d.jsx(Lt,{src:E||y,alt:e.original_filename,className:"w-full h-full object-cover"}):d.jsx(Ct,{className:`fa-solid ${Zl(e.mime_type)} text-4xl text-gray-400 dark:text-gray-500`}),(w||x)&&d.jsxs(W,{className:"absolute inset-0 bg-black/50 flex flex-col items-center justify-center",children:[d.jsx(W,{className:"w-3/4 h-2 bg-gray-700 rounded-full overflow-hidden",children:d.jsx(W,{className:"h-full bg-blue-500 transition-all",style:{width:`${v}%`}})}),d.jsxs(te,{className:"text-white text-xs mt-1",children:[v,"%"]})]}),A&&d.jsx(W,{className:"absolute inset-0 bg-red-500/50 flex items-center justify-center",children:d.jsx(Ct,{className:"fa-solid fa-exclamation-triangle text-2xl text-white"})}),s&&d.jsx(Q,{type:"button",onClick:N=>{N.stopPropagation(),s()},className:`absolute top-1.5 left-1.5 z-10 p-1 rounded-full transition-colors ${a?"bg-yellow-500 text-white":"bg-gray-800/50 text-gray-300 hover:bg-yellow-500 hover:text-white opacity-0 group-hover:opacity-100"}`,title:nt(a?"attachment.primary_image":"attachment.set_as_primary"),children:d.jsx(Ct,{className:"fa-solid fa-star text-xs"})}),d.jsxs(W,{className:"absolute inset-0 bg-black/0 group-hover:bg-black/40 transition-colors flex items-start justify-end p-1 gap-1 opacity-0 group-hover:opacity-100",children:[d.jsx(Q,{type:"button",...l,...g,className:"p-1.5 bg-white/90 dark:bg-gray-800/90 rounded text-gray-600 dark:text-gray-300 hover:bg-white cursor-grab active:cursor-grabbing",title:nt("attachment.drag_to_reorder"),onClick:N=>N.stopPropagation(),children:d.jsx(Ct,{className:"fa-solid fa-grip-vertical text-sm"})}),!p&&o&&d.jsx(Q,{type:"button",onClick:N=>{N.stopPropagation(),o()},className:"p-1.5 bg-white/90 dark:bg-gray-800/90 rounded text-blue-500 hover:bg-white",title:nt("common.download"),children:d.jsx(Ct,{className:"fa-solid fa-download text-sm"})}),A&&r&&d.jsx(Q,{type:"button",onClick:N=>{N.stopPropagation(),r()},className:"p-1.5 bg-white/90 dark:bg-gray-800/90 rounded text-orange-500 hover:bg-white",title:nt("common.retry"),children:d.jsx(Ct,{className:"fa-solid fa-arrow-rotate-right text-sm"})}),d.jsx(Q,{type:"button",onClick:N=>{N.stopPropagation(),t()},disabled:w||x,className:"p-1.5 bg-white/90 dark:bg-gray-800/90 rounded text-red-500 hover:bg-white disabled:opacity-50",title:nt("common.delete"),children:d.jsx(Ct,{className:"fa-solid fa-times text-sm"})})]})]}),d.jsxs(W,{className:`p-2 ${!p&&o?"cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-700":""}`,onClick:()=>{!p&&o&&o()},children:[d.jsx(Dt,{className:"text-xs font-medium text-gray-900 dark:text-white truncate",title:e.original_filename,children:e.original_filename}),d.jsx(Dt,{className:"text-xs text-gray-500 dark:text-gray-400",children:e.size_formatted})]})]})},Gi=({allItems:e,canAddMore:t,totalCount:r,maxFiles:n,maxSize:o,accept:a,onRemove:s,onRetry:l,onImageClick:g,onDownload:h,onDragEnd:c,onAddClick:i,enablePrimarySelection:u,primaryFileId:f,onPrimaryChange:p})=>{const m=wg(ni(ma,{activationConstraint:{distance:8}}),ni(ha,{coordinateGetter:$i}));return d.jsxs(W,{className:"p-3",children:[d.jsx(kh,{sensors:m,collisionDetection:kg,onDragEnd:c,children:d.jsx(Di,{items:e.map(w=>"hash"in w?w.hash:w.id),strategy:Yn,children:d.jsxs(W,{className:"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-3",children:[e.map(w=>{const x="hash"in w,A=x?w.is_image:w.mime_type?.startsWith("image/")??!1;return d.jsx(Hi,{file:w,onRemove:()=>s(w),onRetry:"status"in w&&w.status==="error"?()=>l(w):void 0,onImageClick:A?()=>g(w):void 0,onDownload:x?()=>h(w):void 0,isPrimary:u&&x&&(w.hash||w.id)===f,onPrimaryClick:u&&x?()=>p?.(w.hash||w.id):void 0},x?w.hash:w.id)}),t&&d.jsxs(W,{className:"aspect-square flex flex-col items-center justify-center border-2 border-dashed border-gray-300 dark:border-gray-600 rounded-lg cursor-pointer hover:border-gray-400 dark:hover:border-gray-500 hover:bg-gray-50 dark:hover:bg-gray-800/50 transition-colors",onClick:i,children:[d.jsx(Ct,{className:"fa-solid fa-plus text-2xl text-gray-400 dark:text-gray-500 mb-1"}),d.jsx(te,{className:"text-xs text-gray-500 dark:text-gray-400",children:nt("common.add")})]})]})})}),d.jsxs(W,{className:"mt-3 pt-3 border-t border-gray-200 dark:border-gray-700 flex justify-between items-center text-xs text-gray-500 dark:text-gray-400",children:[d.jsx(te,{children:nt("attachment.attached_count",{count:r,max:n})}),d.jsxs(te,{children:[nt("attachment.max_size",{size:o}),a&&` (${a})`]})]})]})},jh=[],Bh=[],Xn=k.forwardRef(({uploadTriggerEvent:e,attachmentableType:t,attachmentableId:r,collection:n="default",maxFiles:o=10,maxSize:a=10,maxConcurrentUploads:s=3,accept:l,imageCompression:g,roleIds:h=Bh,autoUpload:c=!0,onFilesChange:i,onChange:u,onUploadComplete:f,onUploadError:p,onRemove:m,onReorder:w,initialFiles:x=jh,className:A="",confirmBeforeRemove:v=!1,confirmRemoveTitle:E,confirmRemoveMessage:O,apiEndpoints:_,uploadParams:I,enablePrimarySelection:C=!1,primaryFileId:y,onPrimaryChange:N,id:M,editorAttrs:P},D)=>{const L={upload:_?.upload??"/api/attachments",delete:_?.delete??"/api/attachments/:id",reorder:_?.reorder??"/api/attachments/reorder"},$=k.useRef(u??i);$.current=u??i;const S=k.useCallback(G=>{const Y=$.current;if(!Y)return;Y({target:{value:G,files:G},preventDefault:()=>{},stopPropagation:()=>{}})},[]),b=Ql({attachmentableType:t,attachmentableId:r,collection:n,maxFiles:o,maxSize:a,maxConcurrentUploads:s,accept:l,imageCompression:g,roleIds:h,autoUpload:c,initialFiles:x,endpoints:L,onFilesChange:S,onUploadComplete:f,onUploadError:p,onRemove:m,onReorder:w,uploadTriggerEvent:e,confirmBeforeRemove:v,uploadParams:I});k.useImperativeHandle(D,()=>({uploadAll:b.handleUploadAll,clear:b.clear,getPendingFiles:b.getPendingFiles}));const U=k.useMemo(()=>b.imageFiles.map(G=>{const Y=!("hash"in G),B=G,V=G;return Y?{src:B.preview||"",filename:B.original_filename,title:B.original_filename,downloadRequiresAuth:!1}:{src:b.authenticatedImageUrls.get(V.id)||V.download_url,downloadUrl:V.download_url,filename:V.original_filename,title:V.original_filename,downloadRequiresAuth:!0}}),[b.imageFiles,b.authenticatedImageUrls]),F=k.useMemo(()=>({existingFiles:b.existingFiles,pendingFiles:b.pendingFiles,isDragOver:b.isDragOver,isDeleting:b.isDeleting,maxFiles:o,maxSize:a,accept:l,endpoints:L,confirmBeforeRemove:v,totalCount:b.totalCount,hasFiles:b.hasFiles,canAddMore:b.canAddMore,allItems:b.allItems,imageFiles:b.imageFiles,handleFiles:b.handleFiles,handleRemove:b.handleRemove,handleRetry:b.handleRetry,handleUploadAll:b.handleUploadAll,handleOpenGallery:b.handleOpenGallery,handleDownload:b.handleDownload,handleDragEnd:b.handleDragEnd,setIsDragOver:b.setIsDragOver,inputRef:b.inputRef,galleryOpen:b.galleryOpen,setGalleryOpen:b.setGalleryOpen,galleryStartIndex:b.galleryStartIndex,galleryKeyRef:b.galleryKeyRef,confirmDialogOpen:b.confirmDialogOpen,setConfirmDialogOpen:b.setConfirmDialogOpen,itemToDelete:b.itemToDelete,executeRemoveAttachment:b.executeRemoveAttachment,authenticatedImageUrls:b.authenticatedImageUrls}),[b,o,a,l,L,v]);return d.jsx(Fl,{value:F,children:d.jsxs(W,{id:M,className:A,...P,children:[d.jsx(Jl,{isDragOver:b.isDragOver,canAddMore:b.canAddMore,onFiles:b.handleFiles,setIsDragOver:b.setIsDragOver,inputRef:b.inputRef,accept:l,maxFiles:o,maxSize:a,children:b.hasFiles&&d.jsx(Gi,{allItems:b.allItems,canAddMore:b.canAddMore,totalCount:b.totalCount,maxFiles:o,maxSize:a,accept:l,onRemove:b.handleRemove,onRetry:b.handleRetry,onImageClick:b.handleOpenGallery,onDownload:b.handleDownload,onDragEnd:b.handleDragEnd,onAddClick:()=>b.inputRef.current?.click(),enablePrimarySelection:C,primaryFileId:y,onPrimaryChange:N})}),v&&d.jsx(Ro,{isOpen:b.confirmDialogOpen,onClose:()=>{b.isDeleting||b.setConfirmDialogOpen(!1)},title:E??nt("attachment.delete_confirm_title"),message:O??nt("attachment.delete_confirm_message"),confirmText:nt("common.delete"),confirmButtonVariant:"danger",onConfirm:()=>{b.itemToDelete&&b.executeRemoveAttachment(b.itemToDelete)},isLoading:b.isDeleting,loadingText:nt("attachment.deleting")}),U.length>0&&b.galleryOpen&&d.jsx(Tr,{images:U,isOpen:!0,onClose:()=>b.setGalleryOpen(!1),startIndex:b.galleryStartIndex,showDownload:!0},`gallery-${b.galleryKeyRef.current}`)]})})});Xn.displayName="FileUploader";const Wh=Object.freeze(Object.defineProperty({__proto__:null,FileDropZone:Jl,FileList:Gi,FileUploader:Xn,FileUploaderProvider:Fl,SortableThumbnailItem:Hi,default:Xn,extractErrorMessage:ql,fileUploaderT:nt,formatFileSize:Un,getFileIcon:Zl,useFileUploader:Ql,useFileUploaderContext:Zf},Symbol.toStringTag,{value:"Module"})),ji=({provider:e,className:t="w-5 h-5"})=>{switch(e){case"google":return d.jsxs("svg",{className:t,viewBox:"0 0 24 24",children:[d.jsx("path",{fill:"#4285F4",d:"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z"}),d.jsx("path",{fill:"#34A853",d:"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z"}),d.jsx("path",{fill:"#FBBC05",d:"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z"}),d.jsx("path",{fill:"#EA4335",d:"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z"})]});case"naver":return d.jsx("svg",{className:t,viewBox:"0 0 24 24",children:d.jsx("path",{fill:"currentColor",d:"M16.273 12.845L7.376 0H0v24h7.727V11.155L16.624 24H24V0h-7.727z"})});case"kakao":return d.jsx("svg",{className:t,viewBox:"0 0 24 24",children:d.jsx("path",{fill:"currentColor",d:"M12 3c5.799 0 10.5 3.664 10.5 8.185 0 4.52-4.701 8.184-10.5 8.184a13.5 13.5 0 0 1-1.727-.11l-4.408 2.883c-.501.265-.678.236-.472-.413l.892-3.678c-2.88-1.46-4.785-3.99-4.785-6.866C1.5 6.665 6.201 3 12 3zm5.519 8.625h-.634v2.916h-.97v-2.916h-.633v-.848h2.237v.848zm-3.294 2.916h-.97V10.77h.97v3.771zm-1.97 0h-.97v-2.77l-.658 1.53h-.629l-.665-1.53v2.77h-.97V10.77h1.13l.822 1.912.814-1.912h1.126v3.771zm-4.49 0h-.97V10.77h.97v3.771z"})});case"facebook":return d.jsx("svg",{className:t,viewBox:"0 0 24 24",children:d.jsx("path",{fill:"currentColor",d:"M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z"})});case"apple":return d.jsx("svg",{className:t,viewBox:"0 0 24 24",children:d.jsx("path",{fill:"currentColor",d:"M12.152 6.896c-.948 0-2.415-1.078-3.96-1.04-2.04.027-3.91 1.183-4.961 3.014-2.117 3.675-.546 9.103 1.519 12.09 1.013 1.454 2.208 3.09 3.792 3.039 1.52-.065 2.09-.987 3.935-.987 1.831 0 2.35.987 3.96.948 1.637-.026 2.676-1.48 3.676-2.948 1.156-1.688 1.636-3.325 1.662-3.415-.039-.013-3.182-1.221-3.22-4.857-.026-3.04 2.48-4.494 2.597-4.559-1.429-2.09-3.623-2.324-4.39-2.376-2-.156-3.675 1.09-4.61 1.09zM15.53 3.83c.843-1.012 1.4-2.427 1.245-3.83-1.207.052-2.662.805-3.532 1.818-.78.896-1.454 2.338-1.273 3.714 1.338.104 2.715-.688 3.559-1.701"})});default:return null}},Bi=(e,t)=>window.G7Core?.t?.(e,t)??e,Kh=[{id:"google",name:"Google",color:"bg-white dark:bg-gray-800",textColor:"text-gray-700 dark:text-gray-300"},{id:"naver",name:"네이버",color:"bg-[#03C75A]",textColor:"text-white"},{id:"kakao",name:"카카오",color:"bg-[#FEE500]",textColor:"text-[#000000]/85"},{id:"facebook",name:"Facebook",color:"bg-[#1877F2]",textColor:"text-white"},{id:"apple",name:"Apple",color:"bg-black dark:bg-white",textColor:"text-white dark:text-black"}],Wi=({providers:e=["google","naver","kakao"],mode:t="login",variant:r="full",className:n="",id:o,editorAttrs:a})=>{const s=h=>{const c=encodeURIComponent(window.location.href);window.location.href=`/api/auth/${h}?redirect=${c}`},l=h=>t==="register"?Bi("auth.social.register_with",{provider:h}):Bi("auth.social.login_with",{provider:h}),g=Kh.filter(h=>e.includes(h.id));return r==="icon"?d.jsx(W,{className:`flex justify-center gap-4 ${n}`,id:o,...a,children:g.map(h=>d.jsx(Q,{onClick:()=>s(h.id),className:`w-12 h-12 flex items-center justify-center rounded-full ${h.color} ${h.textColor} border border-gray-200 dark:border-gray-700 hover:opacity-90 transition-opacity`,"aria-label":l(h.name),children:d.jsx(ji,{provider:h.id,className:"w-5 h-5"})},h.id))}):d.jsx(W,{className:`space-y-3 ${n}`,id:o,...a,children:g.map(h=>d.jsxs(Q,{onClick:()=>s(h.id),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 ${h.color} ${h.textColor} hover:opacity-90 transition-opacity`,children:[d.jsx(ji,{provider:h.id,className:"w-5 h-5"}),d.jsx(te,{children:l(h.name)})]},h.id))})},Vh=Object.freeze(Object.defineProperty({__proto__:null,default:Wi},Symbol.toStringTag,{value:"Module"})),Yh=(e,t)=>window.G7Core?.t?.(e,t)??e,Xh={success:Je.CheckCircle,error:Je.XCircle,warning:Je.ExclamationTriangle,info:Je.InfoCircle},Ki={success:{bg:"bg-green-50 dark:bg-green-900/20 border-green-200 dark:border-green-800",text:"text-green-800 dark:text-green-300"},error:{bg:"bg-red-50 dark:bg-red-900/20 border-red-200 dark:border-red-800",text:"text-red-800 dark:text-red-300"},warning:{bg:"bg-yellow-50 dark:bg-yellow-900/20 border-yellow-200 dark:border-yellow-800",text:"text-yellow-800 dark:text-yellow-300"},info:{bg:"bg-blue-50 dark:bg-blue-900/20 border-blue-200 dark:border-blue-800",text:"text-blue-800 dark:text-blue-300"}},qh={"top-left":"top-4 left-4","top-center":"top-4 left-1/2 -translate-x-1/2","top-right":"top-4 right-4","bottom-left":"bottom-4 left-4","bottom-center":"bottom-4 left-1/2 -translate-x-1/2","bottom-right":"bottom-4 right-4"},xa=({toasts:e,position:t="bottom-center",duration:r=3e3,onRemove:n})=>{const[o,a]=k.useState(new Map),s=k.useCallback(l=>{a(g=>{const h=new Map(g);return h.set(l,!1),h}),setTimeout(()=>{if(n)n(l);else{const g=window.G7Core;g?.state?.update&&g.state.update(h=>({toasts:(Array.isArray(h.toasts)?h.toasts:[]).filter(i=>i.id!==l)}))}},300)},[n]);return k.useEffect(()=>{!e||e.length===0||e.forEach(l=>{if(o.has(l.id))return;a(h=>{const c=new Map(h);return c.set(l.id,!0),c});const g=l.duration||r;g>0&&setTimeout(()=>{s(l.id)},g)})},[e,r,s,o]),!e||e.length===0?null:d.jsx(W,{className:`fixed z-[9999] flex flex-col gap-2 ${qh[t]}`,"aria-live":"polite","aria-atomic":"true",children:e.map(l=>d.jsx(Zh,{toast:l,position:t,isVisible:o.get(l.id)??!0,onClose:()=>s(l.id)},l.id))})},Zh=({toast:e,position:t,isVisible:r,onClose:n})=>{const o=Ki[e.type]||Ki.info,a=e.icon?e.icon:Xh[e.type],s=t.startsWith("bottom")?"translate-y-2":"-translate-y-2";return d.jsxs(W,{className:` + `},Hg={onDragStart(e){let{active:t}=e;return"Picked up draggable item "+t.id+"."},onDragOver(e){let{active:t,over:r}=e;return r?"Draggable item "+t.id+" was moved over droppable area "+r.id+".":"Draggable item "+t.id+" is no longer over a droppable area."},onDragEnd(e){let{active:t,over:r}=e;return r?"Draggable item "+t.id+" was dropped over droppable area "+r.id:"Draggable item "+t.id+" was dropped."},onDragCancel(e){let{active:t}=e;return"Dragging was cancelled. Draggable item "+t.id+" was dropped."}};function Gg(e){let{announcements:t=Hg,container:r,hiddenTextDescribedById:n,screenReaderInstructions:o=zg}=e;const{announce:a,announcement:s}=Fg(),l=on("DndLiveRegion"),[f,h]=C.useState(!1);if(C.useEffect(()=>{h(!0)},[]),$g(C.useMemo(()=>({onDragStart(i){let{active:u}=i;a(t.onDragStart({active:u}))},onDragMove(i){let{active:u,over:g}=i;t.onDragMove&&a(t.onDragMove({active:u,over:g}))},onDragOver(i){let{active:u,over:g}=i;a(t.onDragOver({active:u,over:g}))},onDragEnd(i){let{active:u,over:g}=i;a(t.onDragEnd({active:u,over:g}))},onDragCancel(i){let{active:u,over:g}=i;a(t.onDragCancel({active:u,over:g}))}}),[a,t])),!f)return null;const c=C.createElement(C.Fragment,null,C.createElement(Lg,{id:n,value:o.draggable}),C.createElement(Pg,{id:l,announcement:s}));return r?Rt.createPortal(c,r):c}var tt;(function(e){e.DragStart="dragStart",e.DragMove="dragMove",e.DragEnd="dragEnd",e.DragCancel="dragCancel",e.DragOver="dragOver",e.RegisterDroppable="registerDroppable",e.SetDroppableDisabled="setDroppableDisabled",e.UnregisterDroppable="unregisterDroppable"})(tt||(tt={}));function Bn(){}function hi(e,t){return C.useMemo(()=>({sensor:e,options:t??{}}),[e,t])}function jg(){for(var e=arguments.length,t=new Array(e),r=0;r[...t].filter(n=>n!=null),[...t])}const Vt=Object.freeze({x:0,y:0});function pi(e,t){return Math.sqrt(Math.pow(e.x-t.x,2)+Math.pow(e.y-t.y,2))}function mi(e,t){let{data:{value:r}}=e,{data:{value:n}}=t;return r-n}function Bg(e,t){let{data:{value:r}}=e,{data:{value:n}}=t;return n-r}function bi(e){let{left:t,top:r,height:n,width:o}=e;return[{x:t,y:r},{x:t+o,y:r},{x:t,y:r+n},{x:t+o,y:r+n}]}function yi(e,t){if(!e||e.length===0)return null;const[r]=e;return r[t]}function vi(e,t,r){return t===void 0&&(t=e.left),r===void 0&&(r=e.top),{x:t+e.width*.5,y:r+e.height*.5}}const Wg=e=>{let{collisionRect:t,droppableRects:r,droppableContainers:n}=e;const o=vi(t,t.left,t.top),a=[];for(const s of n){const{id:l}=s,f=r.get(l);if(f){const h=pi(vi(f),o);a.push({id:l,data:{droppableContainer:s,value:h}})}}return a.sort(mi)},Kg=e=>{let{collisionRect:t,droppableRects:r,droppableContainers:n}=e;const o=bi(t),a=[];for(const s of n){const{id:l}=s,f=r.get(l);if(f){const h=bi(f),c=o.reduce((u,g,p)=>u+pi(h[p],g),0),i=Number((c/4).toFixed(4));a.push({id:l,data:{droppableContainer:s,value:i}})}}return a.sort(mi)};function Vg(e,t){const r=Math.max(t.top,e.top),n=Math.max(t.left,e.left),o=Math.min(t.left+t.width,e.left+e.width),a=Math.min(t.top+t.height,e.top+e.height),s=o-n,l=a-r;if(n{let{collisionRect:t,droppableRects:r,droppableContainers:n}=e;const o=[];for(const a of n){const{id:s}=a,l=r.get(s);if(l){const f=Vg(l,t);f>0&&o.push({id:s,data:{droppableContainer:a,value:f}})}}return o.sort(Bg)};function Xg(e,t,r){return{...e,scaleX:t&&r?t.width/r.width:1,scaleY:t&&r?t.height/r.height:1}}function wi(e,t){return e&&t?{x:e.left-t.left,y:e.top-t.top}:Vt}function Zg(e){return function(r){for(var n=arguments.length,o=new Array(n>1?n-1:0),a=1;a({...s,top:s.top+e*l.y,bottom:s.bottom+e*l.y,left:s.left+e*l.x,right:s.right+e*l.x}),{...r})}}const qg=Zg(1);function Qg(e){if(e.startsWith("matrix3d(")){const t=e.slice(9,-1).split(/, /);return{x:+t[12],y:+t[13],scaleX:+t[0],scaleY:+t[5]}}else if(e.startsWith("matrix(")){const t=e.slice(7,-1).split(/, /);return{x:+t[4],y:+t[5],scaleX:+t[0],scaleY:+t[3]}}return null}function Jg(e,t,r){const n=Qg(t);if(!n)return e;const{scaleX:o,scaleY:a,x:s,y:l}=n,f=e.left-s-(1-o)*parseFloat(r),h=e.top-l-(1-a)*parseFloat(r.slice(r.indexOf(" ")+1)),c=o?e.width/o:e.width,i=a?e.height/a:e.height;return{width:c,height:i,top:h,right:f+c,bottom:h+i,left:f}}const Rg={ignoreTransform:!1};function zr(e,t){t===void 0&&(t=Rg);let r=e.getBoundingClientRect();if(t.ignoreTransform){const{transform:h,transformOrigin:c}=xt(e).getComputedStyle(e);h&&(r=Jg(r,h,c))}const{top:n,left:o,width:a,height:s,bottom:l,right:f}=r;return{top:n,left:o,width:a,height:s,bottom:l,right:f}}function xi(e){return zr(e,{ignoreTransform:!0})}function eh(e){const t=e.innerWidth,r=e.innerHeight;return{top:0,left:0,right:t,bottom:r,width:t,height:r}}function th(e,t){return t===void 0&&(t=xt(e).getComputedStyle(e)),t.position==="fixed"}function rh(e,t){t===void 0&&(t=xt(e).getComputedStyle(e));const r=/(auto|scroll|overlay)/;return["overflow","overflowX","overflowY"].some(o=>{const a=t[o];return typeof a=="string"?r.test(a):!1})}function Wn(e,t){const r=[];function n(o){if(t!=null&&r.length>=t||!o)return r;if(sa(o)&&o.scrollingElement!=null&&!r.includes(o.scrollingElement))return r.push(o.scrollingElement),r;if(!tn(o)||di(o)||r.includes(o))return r;const a=xt(e).getComputedStyle(o);return o!==e&&rh(o,a)&&r.push(o),th(o,a)?r:n(o.parentNode)}return e?n(e):r}function ki(e){const[t]=Wn(e,1);return t??null}function fa(e){return!Gn||!e?null:Fr(e)?e:aa(e)?sa(e)||e===$r(e).scrollingElement?window:tn(e)?e:null:null}function Ci(e){return Fr(e)?e.scrollX:e.scrollLeft}function Si(e){return Fr(e)?e.scrollY:e.scrollTop}function ga(e){return{x:Ci(e),y:Si(e)}}var lt;(function(e){e[e.Forward=1]="Forward",e[e.Backward=-1]="Backward"})(lt||(lt={}));function _i(e){return!Gn||!e?!1:e===document.scrollingElement}function Ei(e){const t={x:0,y:0},r=_i(e)?{height:window.innerHeight,width:window.innerWidth}:{height:e.clientHeight,width:e.clientWidth},n={x:e.scrollWidth-r.width,y:e.scrollHeight-r.height},o=e.scrollTop<=t.y,a=e.scrollLeft<=t.x,s=e.scrollTop>=n.y,l=e.scrollLeft>=n.x;return{isTop:o,isLeft:a,isBottom:s,isRight:l,maxScroll:n,minScroll:t}}const nh={x:.2,y:.2};function oh(e,t,r,n,o){let{top:a,left:s,right:l,bottom:f}=r;n===void 0&&(n=10),o===void 0&&(o=nh);const{isTop:h,isBottom:c,isLeft:i,isRight:u}=Ei(e),g={x:0,y:0},p={x:0,y:0},m={height:t.height*o.y,width:t.width*o.x};return!h&&a<=t.top+m.height?(g.y=lt.Backward,p.y=n*Math.abs((t.top+m.height-a)/m.height)):!c&&f>=t.bottom-m.height&&(g.y=lt.Forward,p.y=n*Math.abs((t.bottom-m.height-f)/m.height)),!u&&l>=t.right-m.width?(g.x=lt.Forward,p.x=n*Math.abs((t.right-m.width-l)/m.width)):!i&&s<=t.left+m.width&&(g.x=lt.Backward,p.x=n*Math.abs((t.left+m.width-s)/m.width)),{direction:g,speed:p}}function ah(e){if(e===document.scrollingElement){const{innerWidth:a,innerHeight:s}=window;return{top:0,left:0,right:a,bottom:s,width:a,height:s}}const{top:t,left:r,right:n,bottom:o}=e.getBoundingClientRect();return{top:t,left:r,right:n,bottom:o,width:e.clientWidth,height:e.clientHeight}}function Ti(e){return e.reduce((t,r)=>Ur(t,ga(r)),Vt)}function sh(e){return e.reduce((t,r)=>t+Ci(r),0)}function lh(e){return e.reduce((t,r)=>t+Si(r),0)}function ih(e,t){if(t===void 0&&(t=zr),!e)return;const{top:r,left:n,bottom:o,right:a}=t(e);ki(e)&&(o<=0||a<=0||r>=window.innerHeight||n>=window.innerWidth)&&e.scrollIntoView({block:"center",inline:"center"})}const ch=[["x",["left","right"],sh],["y",["top","bottom"],lh]];class ha{constructor(t,r){this.rect=void 0,this.width=void 0,this.height=void 0,this.top=void 0,this.bottom=void 0,this.right=void 0,this.left=void 0;const n=Wn(r),o=Ti(n);this.rect={...t},this.width=t.width,this.height=t.height;for(const[a,s,l]of ch)for(const f of s)Object.defineProperty(this,f,{get:()=>{const h=l(n),c=o[a]-h;return this.rect[f]+c},enumerable:!0});Object.defineProperty(this,"rect",{enumerable:!1})}}class ln{constructor(t){this.target=void 0,this.listeners=[],this.removeAll=()=>{this.listeners.forEach(r=>{var n;return(n=this.target)==null?void 0:n.removeEventListener(...r)})},this.target=t}add(t,r,n){var o;(o=this.target)==null||o.addEventListener(t,r,n),this.listeners.push([t,r,n])}}function dh(e){const{EventTarget:t}=xt(e);return e instanceof t?e:$r(e)}function pa(e,t){const r=Math.abs(e.x),n=Math.abs(e.y);return typeof t=="number"?Math.sqrt(r**2+n**2)>t:"x"in t&&"y"in t?r>t.x&&n>t.y:"x"in t?r>t.x:"y"in t?n>t.y:!1}var Ft;(function(e){e.Click="click",e.DragStart="dragstart",e.Keydown="keydown",e.ContextMenu="contextmenu",e.Resize="resize",e.SelectionChange="selectionchange",e.VisibilityChange="visibilitychange"})(Ft||(Ft={}));function Ni(e){e.preventDefault()}function uh(e){e.stopPropagation()}var Fe;(function(e){e.Space="Space",e.Down="ArrowDown",e.Right="ArrowRight",e.Left="ArrowLeft",e.Up="ArrowUp",e.Esc="Escape",e.Enter="Enter",e.Tab="Tab"})(Fe||(Fe={}));const Ai={start:[Fe.Space,Fe.Enter],cancel:[Fe.Esc],end:[Fe.Space,Fe.Enter,Fe.Tab]},fh=(e,t)=>{let{currentCoordinates:r}=t;switch(e.code){case Fe.Right:return{...r,x:r.x+25};case Fe.Left:return{...r,x:r.x-25};case Fe.Down:return{...r,y:r.y+25};case Fe.Up:return{...r,y:r.y-25}}};class ma{constructor(t){this.props=void 0,this.autoScrollEnabled=!1,this.referenceCoordinates=void 0,this.listeners=void 0,this.windowListeners=void 0,this.props=t;const{event:{target:r}}=t;this.props=t,this.listeners=new ln($r(r)),this.windowListeners=new ln(xt(r)),this.handleKeyDown=this.handleKeyDown.bind(this),this.handleCancel=this.handleCancel.bind(this),this.attach()}attach(){this.handleStart(),this.windowListeners.add(Ft.Resize,this.handleCancel),this.windowListeners.add(Ft.VisibilityChange,this.handleCancel),setTimeout(()=>this.listeners.add(Ft.Keydown,this.handleKeyDown))}handleStart(){const{activeNode:t,onStart:r}=this.props,n=t.node.current;n&&ih(n),r(Vt)}handleKeyDown(t){if(da(t)){const{active:r,context:n,options:o}=this.props,{keyboardCodes:a=Ai,coordinateGetter:s=fh,scrollBehavior:l="smooth"}=o,{code:f}=t;if(a.end.includes(f)){this.handleEnd(t);return}if(a.cancel.includes(f)){this.handleCancel(t);return}const{collisionRect:h}=n.current,c=h?{x:h.left,y:h.top}:Vt;this.referenceCoordinates||(this.referenceCoordinates=c);const i=s(t,{active:r,context:n.current,currentCoordinates:c});if(i){const u=an(i,c),g={x:0,y:0},{scrollableAncestors:p}=n.current;for(const m of p){const v=t.code,{isTop:x,isRight:M,isLeft:w,isBottom:T,maxScroll:A,minScroll:_}=Ei(m),I=ah(m),k={x:Math.min(v===Fe.Right?I.right-I.width/2:I.right,Math.max(v===Fe.Right?I.left:I.left+I.width/2,i.x)),y:Math.min(v===Fe.Down?I.bottom-I.height/2:I.bottom,Math.max(v===Fe.Down?I.top:I.top+I.height/2,i.y))},y=v===Fe.Right&&!M||v===Fe.Left&&!w,N=v===Fe.Down&&!T||v===Fe.Up&&!x;if(y&&k.x!==i.x){const D=m.scrollLeft+u.x,P=v===Fe.Right&&D<=A.x||v===Fe.Left&&D>=_.x;if(P&&!u.y){m.scrollTo({left:D,behavior:l});return}P?g.x=m.scrollLeft-D:g.x=v===Fe.Right?m.scrollLeft-A.x:m.scrollLeft-_.x,g.x&&m.scrollBy({left:-g.x,behavior:l});break}else if(N&&k.y!==i.y){const D=m.scrollTop+u.y,P=v===Fe.Down&&D<=A.y||v===Fe.Up&&D>=_.y;if(P&&!u.x){m.scrollTo({top:D,behavior:l});return}P?g.y=m.scrollTop-D:g.y=v===Fe.Down?m.scrollTop-A.y:m.scrollTop-_.y,g.y&&m.scrollBy({top:-g.y,behavior:l});break}}this.handleMove(t,Ur(an(i,this.referenceCoordinates),g))}}}handleMove(t,r){const{onMove:n}=this.props;t.preventDefault(),n(r)}handleEnd(t){const{onEnd:r}=this.props;t.preventDefault(),this.detach(),r()}handleCancel(t){const{onCancel:r}=this.props;t.preventDefault(),this.detach(),r()}detach(){this.listeners.removeAll(),this.windowListeners.removeAll()}}ma.activators=[{eventName:"onKeyDown",handler:(e,t,r)=>{let{keyboardCodes:n=Ai,onActivation:o}=t,{active:a}=r;const{code:s}=e.nativeEvent;if(n.start.includes(s)){const l=a.activatorNode.current;return l&&e.target!==l?!1:(e.preventDefault(),o?.({event:e.nativeEvent}),!0)}return!1}}];function Mi(e){return!!(e&&"distance"in e)}function Oi(e){return!!(e&&"delay"in e)}class ba{constructor(t,r,n){var o;n===void 0&&(n=dh(t.event.target)),this.props=void 0,this.events=void 0,this.autoScrollEnabled=!0,this.document=void 0,this.activated=!1,this.initialCoordinates=void 0,this.timeoutId=null,this.listeners=void 0,this.documentListeners=void 0,this.windowListeners=void 0,this.props=t,this.events=r;const{event:a}=t,{target:s}=a;this.props=t,this.events=r,this.document=$r(s),this.documentListeners=new ln(this.document),this.listeners=new ln(n),this.windowListeners=new ln(xt(s)),this.initialCoordinates=(o=ua(a))!=null?o:Vt,this.handleStart=this.handleStart.bind(this),this.handleMove=this.handleMove.bind(this),this.handleEnd=this.handleEnd.bind(this),this.handleCancel=this.handleCancel.bind(this),this.handleKeydown=this.handleKeydown.bind(this),this.removeTextSelection=this.removeTextSelection.bind(this),this.attach()}attach(){const{events:t,props:{options:{activationConstraint:r,bypassActivationConstraint:n}}}=this;if(this.listeners.add(t.move.name,this.handleMove,{passive:!1}),this.listeners.add(t.end.name,this.handleEnd),t.cancel&&this.listeners.add(t.cancel.name,this.handleCancel),this.windowListeners.add(Ft.Resize,this.handleCancel),this.windowListeners.add(Ft.DragStart,Ni),this.windowListeners.add(Ft.VisibilityChange,this.handleCancel),this.windowListeners.add(Ft.ContextMenu,Ni),this.documentListeners.add(Ft.Keydown,this.handleKeydown),r){if(n!=null&&n({event:this.props.event,activeNode:this.props.activeNode,options:this.props.options}))return this.handleStart();if(Oi(r)){this.timeoutId=setTimeout(this.handleStart,r.delay),this.handlePending(r);return}if(Mi(r)){this.handlePending(r);return}}this.handleStart()}detach(){this.listeners.removeAll(),this.windowListeners.removeAll(),setTimeout(this.documentListeners.removeAll,50),this.timeoutId!==null&&(clearTimeout(this.timeoutId),this.timeoutId=null)}handlePending(t,r){const{active:n,onPending:o}=this.props;o(n,t,this.initialCoordinates,r)}handleStart(){const{initialCoordinates:t}=this,{onStart:r}=this.props;t&&(this.activated=!0,this.documentListeners.add(Ft.Click,uh,{capture:!0}),this.removeTextSelection(),this.documentListeners.add(Ft.SelectionChange,this.removeTextSelection),r(t))}handleMove(t){var r;const{activated:n,initialCoordinates:o,props:a}=this,{onMove:s,options:{activationConstraint:l}}=a;if(!o)return;const f=(r=ua(t))!=null?r:Vt,h=an(o,f);if(!n&&l){if(Mi(l)){if(l.tolerance!=null&&pa(h,l.tolerance))return this.handleCancel();if(pa(h,l.distance))return this.handleStart()}if(Oi(l)&&pa(h,l.tolerance))return this.handleCancel();this.handlePending(l,h);return}t.cancelable&&t.preventDefault(),s(f)}handleEnd(){const{onAbort:t,onEnd:r}=this.props;this.detach(),this.activated||t(this.props.active),r()}handleCancel(){const{onAbort:t,onCancel:r}=this.props;this.detach(),this.activated||t(this.props.active),r()}handleKeydown(t){t.code===Fe.Esc&&this.handleCancel()}removeTextSelection(){var t;(t=this.document.getSelection())==null||t.removeAllRanges()}}const gh={cancel:{name:"pointercancel"},move:{name:"pointermove"},end:{name:"pointerup"}};class ya extends ba{constructor(t){const{event:r}=t,n=$r(r.target);super(t,gh,n)}}ya.activators=[{eventName:"onPointerDown",handler:(e,t)=>{let{nativeEvent:r}=e,{onActivation:n}=t;return!r.isPrimary||r.button!==0?!1:(n?.({event:r}),!0)}}];const hh={move:{name:"mousemove"},end:{name:"mouseup"}};var va;(function(e){e[e.RightClick=2]="RightClick"})(va||(va={}));class ph extends ba{constructor(t){super(t,hh,$r(t.event.target))}}ph.activators=[{eventName:"onMouseDown",handler:(e,t)=>{let{nativeEvent:r}=e,{onActivation:n}=t;return r.button===va.RightClick?!1:(n?.({event:r}),!0)}}];const wa={cancel:{name:"touchcancel"},move:{name:"touchmove"},end:{name:"touchend"}};class mh extends ba{constructor(t){super(t,wa)}static setup(){return window.addEventListener(wa.move.name,t,{capture:!1,passive:!1}),function(){window.removeEventListener(wa.move.name,t)};function t(){}}}mh.activators=[{eventName:"onTouchStart",handler:(e,t)=>{let{nativeEvent:r}=e,{onActivation:n}=t;const{touches:o}=r;return o.length>1?!1:(n?.({event:r}),!0)}}];var cn;(function(e){e[e.Pointer=0]="Pointer",e[e.DraggableRect=1]="DraggableRect"})(cn||(cn={}));var Kn;(function(e){e[e.TreeOrder=0]="TreeOrder",e[e.ReversedTreeOrder=1]="ReversedTreeOrder"})(Kn||(Kn={}));function bh(e){let{acceleration:t,activator:r=cn.Pointer,canScroll:n,draggingRect:o,enabled:a,interval:s=5,order:l=Kn.TreeOrder,pointerCoordinates:f,scrollableAncestors:h,scrollableAncestorRects:c,delta:i,threshold:u}=e;const g=vh({delta:i,disabled:!a}),[p,m]=Ag(),v=C.useRef({x:0,y:0}),x=C.useRef({x:0,y:0}),M=C.useMemo(()=>{switch(r){case cn.Pointer:return f?{top:f.y,bottom:f.y,left:f.x,right:f.x}:null;case cn.DraggableRect:return o}},[r,o,f]),w=C.useRef(null),T=C.useCallback(()=>{const _=w.current;if(!_)return;const I=v.current.x*x.current.x,k=v.current.y*x.current.y;_.scrollBy(I,k)},[]),A=C.useMemo(()=>l===Kn.TreeOrder?[...h].reverse():h,[l,h]);C.useEffect(()=>{if(!a||!h.length||!M){m();return}for(const _ of A){if(n?.(_)===!1)continue;const I=h.indexOf(_),k=c[I];if(!k)continue;const{direction:y,speed:N}=oh(_,k,M,t,u);for(const D of["x","y"])g[D][y[D]]||(N[D]=0,y[D]=0);if(N.x>0||N.y>0){m(),w.current=_,p(T,s),v.current=N,x.current=y;return}}v.current={x:0,y:0},x.current={x:0,y:0},m()},[t,T,n,m,a,s,JSON.stringify(M),JSON.stringify(g),p,h,A,c,JSON.stringify(u)])}const yh={x:{[lt.Backward]:!1,[lt.Forward]:!1},y:{[lt.Backward]:!1,[lt.Forward]:!1}};function vh(e){let{delta:t,disabled:r}=e;const n=ia(t);return nn(o=>{if(r||!n||!o)return yh;const a={x:Math.sign(t.x-n.x),y:Math.sign(t.y-n.y)};return{x:{[lt.Backward]:o.x[lt.Backward]||a.x===-1,[lt.Forward]:o.x[lt.Forward]||a.x===1},y:{[lt.Backward]:o.y[lt.Backward]||a.y===-1,[lt.Forward]:o.y[lt.Forward]||a.y===1}}},[r,t,n])}function wh(e,t){const r=t!=null?e.get(t):void 0,n=r?r.node.current:null;return nn(o=>{var a;return t==null?null:(a=n??o)!=null?a:null},[n,t])}function xh(e,t){return C.useMemo(()=>e.reduce((r,n)=>{const{sensor:o}=n,a=o.activators.map(s=>({eventName:s.eventName,handler:t(s.handler,n)}));return[...r,...a]},[]),[e,t])}var dn;(function(e){e[e.Always=0]="Always",e[e.BeforeDragging=1]="BeforeDragging",e[e.WhileDragging=2]="WhileDragging"})(dn||(dn={}));var xa;(function(e){e.Optimized="optimized"})(xa||(xa={}));const Ii=new Map;function kh(e,t){let{dragging:r,dependencies:n,config:o}=t;const[a,s]=C.useState(null),{frequency:l,measure:f,strategy:h}=o,c=C.useRef(e),i=v(),u=rn(i),g=C.useCallback(function(x){x===void 0&&(x=[]),!u.current&&s(M=>M===null?x:M.concat(x.filter(w=>!M.includes(w))))},[u]),p=C.useRef(null),m=nn(x=>{if(i&&!r)return Ii;if(!x||x===Ii||c.current!==e||a!=null){const M=new Map;for(let w of e){if(!w)continue;if(a&&a.length>0&&!a.includes(w.id)&&w.rect.current){M.set(w.id,w.rect.current);continue}const T=w.node.current,A=T?new ha(f(T),T):null;w.rect.current=A,A&&M.set(w.id,A)}return M}return x},[e,a,r,i,f]);return C.useEffect(()=>{c.current=e},[e]),C.useEffect(()=>{i||g()},[r,i]),C.useEffect(()=>{a&&a.length>0&&s(null)},[JSON.stringify(a)]),C.useEffect(()=>{i||typeof l!="number"||p.current!==null||(p.current=setTimeout(()=>{g(),p.current=null},l))},[l,i,g,...n]),{droppableRects:m,measureDroppableContainers:g,measuringScheduled:a!=null};function v(){switch(h){case dn.Always:return!1;case dn.BeforeDragging:return r;default:return!r}}}function Di(e,t){return nn(r=>e?r||(typeof t=="function"?t(e):e):null,[t,e])}function Ch(e,t){return Di(e,t)}function Sh(e){let{callback:t,disabled:r}=e;const n=la(t),o=C.useMemo(()=>{if(r||typeof window>"u"||typeof window.MutationObserver>"u")return;const{MutationObserver:a}=window;return new a(n)},[n,r]);return C.useEffect(()=>()=>o?.disconnect(),[o]),o}function Vn(e){let{callback:t,disabled:r}=e;const n=la(t),o=C.useMemo(()=>{if(r||typeof window>"u"||typeof window.ResizeObserver>"u")return;const{ResizeObserver:a}=window;return new a(n)},[r]);return C.useEffect(()=>()=>o?.disconnect(),[o]),o}function _h(e){return new ha(zr(e),e)}function Li(e,t,r){t===void 0&&(t=_h);const[n,o]=C.useState(null);function a(){o(f=>{if(!e)return null;if(e.isConnected===!1){var h;return(h=f??r)!=null?h:null}const c=t(e);return JSON.stringify(f)===JSON.stringify(c)?f:c})}const s=Sh({callback(f){if(e)for(const h of f){const{type:c,target:i}=h;if(c==="childList"&&i instanceof HTMLElement&&i.contains(e)){a();break}}}}),l=Vn({callback:a});return qt(()=>{a(),e?(l?.observe(e),s?.observe(document.body,{childList:!0,subtree:!0})):(l?.disconnect(),s?.disconnect())},[e]),n}function Eh(e){const t=Di(e);return wi(e,t)}const Pi=[];function Th(e){const t=C.useRef(e),r=nn(n=>e?n&&n!==Pi&&e&&t.current&&e.parentNode===t.current.parentNode?n:Wn(e):Pi,[e]);return C.useEffect(()=>{t.current=e},[e]),r}function Nh(e){const[t,r]=C.useState(null),n=C.useRef(e),o=C.useCallback(a=>{const s=fa(a.target);s&&r(l=>l?(l.set(s,ga(s)),new Map(l)):null)},[]);return C.useEffect(()=>{const a=n.current;if(e!==a){s(a);const l=e.map(f=>{const h=fa(f);return h?(h.addEventListener("scroll",o,{passive:!0}),[h,ga(h)]):null}).filter(f=>f!=null);r(l.length?new Map(l):null),n.current=e}return()=>{s(e),s(a)};function s(l){l.forEach(f=>{const h=fa(f);h?.removeEventListener("scroll",o)})}},[o,e]),C.useMemo(()=>e.length?t?Array.from(t.values()).reduce((a,s)=>Ur(a,s),Vt):Ti(e):Vt,[e,t])}function Fi(e,t){t===void 0&&(t=[]);const r=C.useRef(null);return C.useEffect(()=>{r.current=null},t),C.useEffect(()=>{const n=e!==Vt;n&&!r.current&&(r.current=e),!n&&r.current&&(r.current=null)},[e]),r.current?an(e,r.current):Vt}function Ah(e){C.useEffect(()=>{if(!Gn)return;const t=e.map(r=>{let{sensor:n}=r;return n.setup==null?void 0:n.setup()});return()=>{for(const r of t)r?.()}},e.map(t=>{let{sensor:r}=t;return r}))}function Mh(e,t){return C.useMemo(()=>e.reduce((r,n)=>{let{eventName:o,handler:a}=n;return r[o]=s=>{a(s,t)},r},{}),[e,t])}function $i(e){return C.useMemo(()=>e?eh(e):null,[e])}const Ui=[];function Oh(e,t){t===void 0&&(t=zr);const[r]=e,n=$i(r?xt(r):null),[o,a]=C.useState(Ui);function s(){a(()=>e.length?e.map(f=>_i(f)?n:new ha(t(f),f)):Ui)}const l=Vn({callback:s});return qt(()=>{l?.disconnect(),s(),e.forEach(f=>l?.observe(f))},[e]),o}function Ih(e){if(!e)return null;if(e.children.length>1)return e;const t=e.children[0];return tn(t)?t:e}function Dh(e){let{measure:t}=e;const[r,n]=C.useState(null),o=C.useCallback(h=>{for(const{target:c}of h)if(tn(c)){n(i=>{const u=t(c);return i?{...i,width:u.width,height:u.height}:u});break}},[t]),a=Vn({callback:o}),s=C.useCallback(h=>{const c=Ih(h);a?.disconnect(),c&&a?.observe(c),n(c?t(c):null)},[t,a]),[l,f]=jn(s);return C.useMemo(()=>({nodeRef:l,rect:r,setRef:f}),[r,l,f])}const Lh=[{sensor:ya,options:{}},{sensor:ma,options:{}}],Ph={current:{}},Yn={draggable:{measure:xi},droppable:{measure:xi,strategy:dn.WhileDragging,frequency:xa.Optimized},dragOverlay:{measure:zr}};class un extends Map{get(t){var r;return t!=null&&(r=super.get(t))!=null?r:void 0}toArray(){return Array.from(this.values())}getEnabled(){return this.toArray().filter(t=>{let{disabled:r}=t;return!r})}getNodeFor(t){var r,n;return(r=(n=this.get(t))==null?void 0:n.node.current)!=null?r:void 0}}const Fh={activatorEvent:null,active:null,activeNode:null,activeNodeRect:null,collisions:null,containerNodeRect:null,draggableNodes:new Map,droppableRects:new Map,droppableContainers:new un,over:null,dragOverlay:{nodeRef:{current:null},rect:null,setRef:Bn},scrollableAncestors:[],scrollableAncestorRects:[],measuringConfiguration:Yn,measureDroppableContainers:Bn,windowRect:null,measuringScheduled:!1},$h={activatorEvent:null,activators:[],active:null,activeNodeRect:null,ariaDescribedById:{draggable:""},dispatch:Bn,draggableNodes:new Map,over:null,measureDroppableContainers:Bn},Xn=C.createContext($h),zi=C.createContext(Fh);function Uh(){return{draggable:{active:null,initialCoordinates:{x:0,y:0},nodes:new Map,translate:{x:0,y:0}},droppable:{containers:new un}}}function zh(e,t){switch(t.type){case tt.DragStart:return{...e,draggable:{...e.draggable,initialCoordinates:t.initialCoordinates,active:t.active}};case tt.DragMove:return e.draggable.active==null?e:{...e,draggable:{...e.draggable,translate:{x:t.coordinates.x-e.draggable.initialCoordinates.x,y:t.coordinates.y-e.draggable.initialCoordinates.y}}};case tt.DragEnd:case tt.DragCancel:return{...e,draggable:{...e.draggable,active:null,initialCoordinates:{x:0,y:0},translate:{x:0,y:0}}};case tt.RegisterDroppable:{const{element:r}=t,{id:n}=r,o=new un(e.droppable.containers);return o.set(n,r),{...e,droppable:{...e.droppable,containers:o}}}case tt.SetDroppableDisabled:{const{id:r,key:n,disabled:o}=t,a=e.droppable.containers.get(r);if(!a||n!==a.key)return e;const s=new un(e.droppable.containers);return s.set(r,{...a,disabled:o}),{...e,droppable:{...e.droppable,containers:s}}}case tt.UnregisterDroppable:{const{id:r,key:n}=t,o=e.droppable.containers.get(r);if(!o||n!==o.key)return e;const a=new un(e.droppable.containers);return a.delete(r),{...e,droppable:{...e.droppable,containers:a}}}default:return e}}function Hh(e){let{disabled:t}=e;const{active:r,activatorEvent:n,draggableNodes:o}=C.useContext(Xn),a=ia(n),s=ia(r?.id);return C.useEffect(()=>{if(!t&&!n&&a&&s!=null){if(!da(a)||document.activeElement===a.target)return;const l=o.get(s);if(!l)return;const{activatorNode:f,node:h}=l;if(!f.current&&!h.current)return;requestAnimationFrame(()=>{for(const c of[f.current,h.current]){if(!c)continue;const i=Ig(c);if(i){i.focus();break}}})}},[n,t,o,s,a]),null}function Gh(e,t){let{transform:r,...n}=t;return e!=null&&e.length?e.reduce((o,a)=>a({transform:o,...n}),r):r}function jh(e){return C.useMemo(()=>({draggable:{...Yn.draggable,...e?.draggable},droppable:{...Yn.droppable,...e?.droppable},dragOverlay:{...Yn.dragOverlay,...e?.dragOverlay}}),[e?.draggable,e?.droppable,e?.dragOverlay])}function Bh(e){let{activeNode:t,measure:r,initialRect:n,config:o=!0}=e;const a=C.useRef(!1),{x:s,y:l}=typeof o=="boolean"?{x:o,y:o}:o;qt(()=>{if(!s&&!l||!t){a.current=!1;return}if(a.current||!n)return;const h=t?.node.current;if(!h||h.isConnected===!1)return;const c=r(h),i=wi(c,n);if(s||(i.x=0),l||(i.y=0),a.current=!0,Math.abs(i.x)>0||Math.abs(i.y)>0){const u=ki(h);u&&u.scrollBy({top:i.y,left:i.x})}},[t,s,l,n,r])}const Hi=C.createContext({...Vt,scaleX:1,scaleY:1});var nr;(function(e){e[e.Uninitialized=0]="Uninitialized",e[e.Initializing=1]="Initializing",e[e.Initialized=2]="Initialized"})(nr||(nr={}));const Wh=C.memo(function(t){var r,n,o,a;let{id:s,accessibility:l,autoScroll:f=!0,children:h,sensors:c=Lh,collisionDetection:i=Yg,measuring:u,modifiers:g,...p}=t;const m=C.useReducer(zh,void 0,Uh),[v,x]=m,[M,w]=Ug(),[T,A]=C.useState(nr.Uninitialized),_=T===nr.Initialized,{draggable:{active:I,nodes:k,translate:y},droppable:{containers:N}}=v,D=I!=null?k.get(I):null,P=C.useRef({initial:null,translated:null}),O=C.useMemo(()=>{var Se;return I!=null?{id:I,data:(Se=D?.data)!=null?Se:Ph,rect:P}:null},[I,D]),L=C.useRef(null),[$,S]=C.useState(null),[b,z]=C.useState(null),U=rn(p,Object.values(p)),G=on("DndDescribedBy",s),Y=C.useMemo(()=>N.getEnabled(),[N]),B=jh(u),{droppableRects:V,measureDroppableContainers:j,measuringScheduled:H}=kh(Y,{dragging:_,dependencies:[y.x,y.y],config:B.droppable}),q=wh(k,I),ee=C.useMemo(()=>b?ua(b):null,[b]),ne=Ke(),ce=Ch(q,B.draggable.measure);Bh({activeNode:I!=null?k.get(I):null,config:ne.layoutShiftCompensation,initialRect:ce,measure:B.draggable.measure});const R=Li(q,B.draggable.measure,ce),_e=Li(q?q.parentElement:null),me=C.useRef({activatorEvent:null,active:null,activeNode:q,collisionRect:null,collisions:null,droppableRects:V,draggableNodes:k,draggingNode:null,draggingNodeRect:null,droppableContainers:N,over:null,scrollableAncestors:[],scrollAdjustedTranslate:null}),Be=N.getNodeFor((r=me.current.over)==null?void 0:r.id),$e=Dh({measure:B.dragOverlay.measure}),ye=(n=$e.nodeRef.current)!=null?n:q,Ne=_?(o=$e.rect)!=null?o:R:null,we=!!($e.nodeRef.current&&$e.rect),ke=Eh(we?null:R),Ue=$i(ye?xt(ye):null),Oe=Th(_?Be??q:null),K=Oh(Oe),te=Gh(g,{transform:{x:y.x-ke.x,y:y.y-ke.y,scaleX:1,scaleY:1},activatorEvent:b,active:O,activeNodeRect:R,containerNodeRect:_e,draggingNodeRect:Ne,over:me.current.over,overlayNodeRect:$e.rect,scrollableAncestors:Oe,scrollableAncestorRects:K,windowRect:Ue}),oe=ee?Ur(ee,y):null,le=Nh(Oe),ve=Fi(le),Te=Fi(le,[R]),We=Ur(te,ve),Ae=Ne?qg(Ne,te):null,He=O&&Ae?i({active:O,collisionRect:Ae,droppableRects:V,droppableContainers:Y,pointerCoordinates:oe}):null,Ie=yi(He,"id"),[X,se]=C.useState(null),de=we?te:Ur(te,Te),ue=Xg(de,(a=X?.rect)!=null?a:null,R),ie=C.useRef(null),De=C.useCallback((Se,be)=>{let{sensor:Me,options:je}=be;if(L.current==null)return;const rt=k.get(L.current);if(!rt)return;const Ye=Se.nativeEvent,Pe=new Me({active:L.current,activeNode:rt,event:Ye,options:je,context:me,onAbort(nt){if(!k.get(nt))return;const{onDragAbort:Ct}=U.current,$t={id:nt};Ct?.($t),M({type:"onDragAbort",event:$t})},onPending(nt,Yt,Ct,$t){if(!k.get(nt))return;const{onDragPending:br}=U.current,Qe={id:nt,constraint:Yt,initialCoordinates:Ct,offset:$t};br?.(Qe),M({type:"onDragPending",event:Qe})},onStart(nt){const Yt=L.current;if(Yt==null)return;const Ct=k.get(Yt);if(!Ct)return;const{onDragStart:$t}=U.current,ar={activatorEvent:Ye,active:{id:Yt,data:Ct.data,rect:P}};Rt.unstable_batchedUpdates(()=>{$t?.(ar),A(nr.Initializing),x({type:tt.DragStart,initialCoordinates:nt,active:Yt}),M({type:"onDragStart",event:ar}),S(ie.current),z(Ye)})},onMove(nt){x({type:tt.DragMove,coordinates:nt})},onEnd:Mt(tt.DragEnd),onCancel:Mt(tt.DragCancel)});ie.current=Pe;function Mt(nt){return async function(){const{active:Ct,collisions:$t,over:ar,scrollAdjustedTranslate:br}=me.current;let Qe=null;if(Ct&&br){const{cancelDrop:Ot}=U.current;Qe={activatorEvent:Ye,active:Ct,collisions:$t,delta:br,over:ar},nt===tt.DragEnd&&typeof Ot=="function"&&await Promise.resolve(Ot(Qe))&&(nt=tt.DragCancel)}L.current=null,Rt.unstable_batchedUpdates(()=>{x({type:nt}),A(nr.Uninitialized),se(null),S(null),z(null),ie.current=null;const Ot=nt===tt.DragEnd?"onDragEnd":"onDragCancel";if(Qe){const Br=U.current[Ot];Br?.(Qe),M({type:Ot,event:Qe})}})}}},[k]),ge=C.useCallback((Se,be)=>(Me,je)=>{const rt=Me.nativeEvent,Ye=k.get(je);if(L.current!==null||!Ye||rt.dndKit||rt.defaultPrevented)return;const Pe={active:Ye};Se(Me,be.options,Pe)===!0&&(rt.dndKit={capturedBy:be.sensor},L.current=je,De(Me,be))},[k,De]),xe=xh(c,ge);Ah(c),qt(()=>{R&&T===nr.Initializing&&A(nr.Initialized)},[R,T]),C.useEffect(()=>{const{onDragMove:Se}=U.current,{active:be,activatorEvent:Me,collisions:je,over:rt}=me.current;if(!be||!Me)return;const Ye={active:be,activatorEvent:Me,collisions:je,delta:{x:We.x,y:We.y},over:rt};Rt.unstable_batchedUpdates(()=>{Se?.(Ye),M({type:"onDragMove",event:Ye})})},[We.x,We.y]),C.useEffect(()=>{const{active:Se,activatorEvent:be,collisions:Me,droppableContainers:je,scrollAdjustedTranslate:rt}=me.current;if(!Se||L.current==null||!be||!rt)return;const{onDragOver:Ye}=U.current,Pe=je.get(Ie),Mt=Pe&&Pe.rect.current?{id:Pe.id,rect:Pe.rect.current,data:Pe.data,disabled:Pe.disabled}:null,nt={active:Se,activatorEvent:be,collisions:Me,delta:{x:rt.x,y:rt.y},over:Mt};Rt.unstable_batchedUpdates(()=>{se(Mt),Ye?.(nt),M({type:"onDragOver",event:nt})})},[Ie]),qt(()=>{me.current={activatorEvent:b,active:O,activeNode:q,collisionRect:Ae,collisions:He,droppableRects:V,draggableNodes:k,draggingNode:ye,draggingNodeRect:Ne,droppableContainers:N,over:X,scrollableAncestors:Oe,scrollAdjustedTranslate:We},P.current={initial:Ne,translated:Ae}},[O,q,He,Ae,k,ye,Ne,V,N,X,Oe,We]),bh({...ne,delta:y,draggingRect:Ae,pointerCoordinates:oe,scrollableAncestors:Oe,scrollableAncestorRects:K});const Ce=C.useMemo(()=>({active:O,activeNode:q,activeNodeRect:R,activatorEvent:b,collisions:He,containerNodeRect:_e,dragOverlay:$e,draggableNodes:k,droppableContainers:N,droppableRects:V,over:X,measureDroppableContainers:j,scrollableAncestors:Oe,scrollableAncestorRects:K,measuringConfiguration:B,measuringScheduled:H,windowRect:Ue}),[O,q,R,b,He,_e,$e,k,N,V,X,j,Oe,K,B,H,Ue]),ze=C.useMemo(()=>({activatorEvent:b,activators:xe,active:O,activeNodeRect:R,ariaDescribedById:{draggable:G},dispatch:x,draggableNodes:k,over:X,measureDroppableContainers:j}),[b,xe,O,R,x,G,k,X,j]);return C.createElement(gi.Provider,{value:w},C.createElement(Xn.Provider,{value:ze},C.createElement(zi.Provider,{value:Ce},C.createElement(Hi.Provider,{value:ue},h)),C.createElement(Hh,{disabled:l?.restoreFocus===!1})),C.createElement(Gg,{...l,hiddenTextDescribedById:G}));function Ke(){const Se=$?.autoScrollEnabled===!1,be=typeof f=="object"?f.enabled===!1:f===!1,Me=_&&!Se&&!be;return typeof f=="object"?{...f,enabled:Me}:{enabled:Me}}}),Kh=C.createContext(null),Gi="button",Vh="Draggable";function Yh(e){let{id:t,data:r,disabled:n=!1,attributes:o}=e;const a=on(Vh),{activators:s,activatorEvent:l,active:f,activeNodeRect:h,ariaDescribedById:c,draggableNodes:i,over:u}=C.useContext(Xn),{role:g=Gi,roleDescription:p="draggable",tabIndex:m=0}=o??{},v=f?.id===t,x=C.useContext(v?Hi:Kh),[M,w]=jn(),[T,A]=jn(),_=Mh(s,t),I=rn(r);qt(()=>(i.set(t,{id:t,key:a,node:M,activatorNode:T,data:I}),()=>{const y=i.get(t);y&&y.key===a&&i.delete(t)}),[i,t]);const k=C.useMemo(()=>({role:g,tabIndex:m,"aria-disabled":n,"aria-pressed":v&&g===Gi?!0:void 0,"aria-roledescription":p,"aria-describedby":c.draggable}),[n,g,m,v,p,c.draggable]);return{active:f,activatorEvent:l,activeNodeRect:h,attributes:k,isDragging:v,listeners:n?void 0:_,node:M,over:u,setNodeRef:w,setActivatorNodeRef:A,transform:x}}function Xh(){return C.useContext(zi)}const Zh="Droppable",qh={timeout:25};function Qh(e){let{data:t,disabled:r=!1,id:n,resizeObserverConfig:o}=e;const a=on(Zh),{active:s,dispatch:l,over:f,measureDroppableContainers:h}=C.useContext(Xn),c=C.useRef({disabled:r}),i=C.useRef(!1),u=C.useRef(null),g=C.useRef(null),{disabled:p,updateMeasurementsFor:m,timeout:v}={...qh,...o},x=rn(m??n),M=C.useCallback(()=>{if(!i.current){i.current=!0;return}g.current!=null&&clearTimeout(g.current),g.current=setTimeout(()=>{h(Array.isArray(x.current)?x.current:[x.current]),g.current=null},v)},[v]),w=Vn({callback:M,disabled:p||!s}),T=C.useCallback((k,y)=>{w&&(y&&(w.unobserve(y),i.current=!1),k&&w.observe(k))},[w]),[A,_]=jn(T),I=rn(t);return C.useEffect(()=>{!w||!A.current||(w.disconnect(),i.current=!1,w.observe(A.current))},[A,w]),C.useEffect(()=>(l({type:tt.RegisterDroppable,element:{id:n,key:a,disabled:r,node:A,rect:u,data:I}}),()=>l({type:tt.UnregisterDroppable,key:a,id:n})),[n]),C.useEffect(()=>{r!==c.current.disabled&&(l({type:tt.SetDroppableDisabled,id:n,key:a,disabled:r}),c.current.disabled=r)},[n,a,r,l]),{active:s,rect:u,isOver:f?.id===n,node:A,over:f,setNodeRef:_}}function ka(e,t,r){const n=e.slice();return n.splice(r<0?n.length+r:r,0,n.splice(t,1)[0]),n}function Jh(e,t){return e.reduce((r,n,o)=>{const a=t.get(n);return a&&(r[o]=a),r},Array(e.length))}function Zn(e){return e!==null&&e>=0}function Rh(e,t){if(e===t)return!0;if(e.length!==t.length)return!1;for(let r=0;r{let{rects:t,activeIndex:r,overIndex:n,index:o}=e;const a=ka(t,n,r),s=t[o],l=a[o];return!l||!s?null:{x:l.left-s.left,y:l.top-s.top,scaleX:l.width/s.width,scaleY:l.height/s.height}},ji="Sortable",Bi=C.createContext({activeIndex:-1,containerId:ji,disableTransforms:!1,items:[],overIndex:-1,useDragOverlay:!1,sortedRects:[],strategy:qn,disabled:{draggable:!1,droppable:!1}});function Wi(e){let{children:t,id:r,items:n,strategy:o=qn,disabled:a=!1}=e;const{active:s,dragOverlay:l,droppableRects:f,over:h,measureDroppableContainers:c}=Xh(),i=on(ji,r),u=l.rect!==null,g=C.useMemo(()=>n.map(_=>typeof _=="object"&&"id"in _?_.id:_),[n]),p=s!=null,m=s?g.indexOf(s.id):-1,v=h?g.indexOf(h.id):-1,x=C.useRef(g),M=!Rh(g,x.current),w=v!==-1&&m===-1||M,T=e0(a);qt(()=>{M&&p&&c(g)},[M,g,p,c]),C.useEffect(()=>{x.current=g},[g]);const A=C.useMemo(()=>({activeIndex:m,containerId:i,disabled:T,disableTransforms:w,items:g,overIndex:v,useDragOverlay:u,sortedRects:Jh(g,f),strategy:o}),[m,i,T.draggable,T.droppable,w,g,v,f,u,o]);return C.createElement(Bi.Provider,{value:A},t)}const Ki=e=>{let{id:t,items:r,activeIndex:n,overIndex:o}=e;return ka(r,n,o).indexOf(t)},Vi=e=>{let{containerId:t,isSorting:r,wasDragging:n,index:o,items:a,newIndex:s,previousItems:l,previousContainerId:f,transition:h}=e;return!h||!n||l!==a&&o===s?!1:r?!0:s!==o&&t===f},t0={duration:200,easing:"ease"},Yi="transform",r0=sn.Transition.toString({property:Yi,duration:0,easing:"linear"}),n0={roleDescription:"sortable"};function o0(e){let{disabled:t,index:r,node:n,rect:o}=e;const[a,s]=C.useState(null),l=C.useRef(r);return qt(()=>{if(!t&&r!==l.current&&n.current){const f=o.current;if(f){const h=zr(n.current,{ignoreTransform:!0}),c={x:f.left-h.left,y:f.top-h.top,scaleX:f.width/h.width,scaleY:f.height/h.height};(c.x||c.y)&&s(c)}}r!==l.current&&(l.current=r)},[t,r,n,o]),C.useEffect(()=>{a&&s(null)},[a]),a}function Xi(e){let{animateLayoutChanges:t=Vi,attributes:r,disabled:n,data:o,getNewIndex:a=Ki,id:s,strategy:l,resizeObserverConfig:f,transition:h=t0}=e;const{items:c,containerId:i,activeIndex:u,disabled:g,disableTransforms:p,sortedRects:m,overIndex:v,useDragOverlay:x,strategy:M}=C.useContext(Bi),w=a0(n,g),T=c.indexOf(s),A=C.useMemo(()=>({sortable:{containerId:i,index:T,items:c},...o}),[i,o,T,c]),_=C.useMemo(()=>c.slice(c.indexOf(s)),[c,s]),{rect:I,node:k,isOver:y,setNodeRef:N}=Qh({id:s,data:A,disabled:w.droppable,resizeObserverConfig:{updateMeasurementsFor:_,...f}}),{active:D,activatorEvent:P,activeNodeRect:O,attributes:L,setNodeRef:$,listeners:S,isDragging:b,over:z,setActivatorNodeRef:U,transform:G}=Yh({id:s,data:A,attributes:{...n0,...r},disabled:w.draggable}),Y=Ng(N,$),B=!!D,V=B&&!p&&Zn(u)&&Zn(v),j=!x&&b,H=j&&V?G:null,ee=V?H??(l??M)({rects:m,activeNodeRect:O,activeIndex:u,overIndex:v,index:T}):null,ne=Zn(u)&&Zn(v)?a({id:s,items:c,activeIndex:u,overIndex:v}):T,ce=D?.id,R=C.useRef({activeId:ce,items:c,newIndex:ne,containerId:i}),_e=c!==R.current.items,me=t({active:D,containerId:i,isDragging:b,isSorting:B,id:s,index:T,items:c,newIndex:R.current.newIndex,previousItems:R.current.items,previousContainerId:R.current.containerId,transition:h,wasDragging:R.current.activeId!=null}),Be=o0({disabled:!me,index:T,node:k,rect:I});return C.useEffect(()=>{B&&R.current.newIndex!==ne&&(R.current.newIndex=ne),i!==R.current.containerId&&(R.current.containerId=i),c!==R.current.items&&(R.current.items=c)},[B,ne,i,c]),C.useEffect(()=>{if(ce===R.current.activeId)return;if(ce!=null&&R.current.activeId==null){R.current.activeId=ce;return}const ye=setTimeout(()=>{R.current.activeId=ce},50);return()=>clearTimeout(ye)},[ce]),{active:D,activeIndex:u,attributes:L,data:A,rect:I,index:T,newIndex:ne,items:c,isOver:y,isSorting:B,isDragging:b,listeners:S,node:k,overIndex:v,over:z,setNodeRef:Y,setActivatorNodeRef:U,setDroppableNodeRef:N,setDraggableNodeRef:$,transform:Be??ee,transition:$e()};function $e(){if(Be||_e&&R.current.newIndex===T)return r0;if(!(j&&!da(P)||!h)&&(B||me))return sn.Transition.toString({...h,property:Yi})}}function a0(e,t){var r,n;return typeof e=="boolean"?{draggable:e,droppable:!1}:{draggable:(r=e?.draggable)!=null?r:t.draggable,droppable:(n=e?.droppable)!=null?n:t.droppable}}function fn(e){if(!e)return!1;const t=e.data.current;return!!(t&&"sortable"in t&&typeof t.sortable=="object"&&"containerId"in t.sortable&&"items"in t.sortable&&"index"in t.sortable)}const s0=[Fe.Down,Fe.Right,Fe.Up,Fe.Left],Zi=(e,t)=>{let{context:{active:r,collisionRect:n,droppableRects:o,droppableContainers:a,over:s,scrollableAncestors:l}}=t;if(s0.includes(e.code)){if(e.preventDefault(),!r||!n)return;const f=[];a.getEnabled().forEach(i=>{if(!i||i!=null&&i.disabled)return;const u=o.get(i.id);if(u)switch(e.code){case Fe.Down:n.topu.top&&f.push(i);break;case Fe.Left:n.left>u.left&&f.push(i);break;case Fe.Right:n.left1&&(c=h[1].id),c!=null){const i=a.get(r.id),u=a.get(c),g=u?o.get(u.id):null,p=u?.node.current;if(p&&g&&i&&u){const v=Wn(p).some((_,I)=>l[I]!==_),x=qi(i,u),M=l0(i,u),w=v||!x?{x:0,y:0}:{x:M?n.width-g.width:0,y:M?n.height-g.height:0},T={x:g.left,y:g.top};return w.x&&w.y?T:an(T,w)}}}};function qi(e,t){return!fn(e)||!fn(t)?!1:e.data.current.sortable.containerId===t.data.current.sortable.containerId}function l0(e,t){return!fn(e)||!fn(t)||!qi(e,t)?!1:e.data.current.sortable.index{const{attributes:l,listeners:f,setNodeRef:h,transform:c,transition:i,isDragging:u}=Xi({id:"hash"in e?e.hash:e.id}),g={transform:sn.Transform.toString(c),transition:i,opacity:u?.5:1},p="status"in e&&e.status!==void 0,m=p?e.status:"done",v=m==="uploading",x=m==="compressing",M=m==="error",w=p?e.progress:100,T=p?e.preview:void 0,A=p?e.mime_type?.startsWith("image/")??!1:e.is_image,[_,I]=C.useState(void 0),k=!p&&A?e.download_url:void 0;C.useEffect(()=>{if(!k){I(void 0);return}let N=!0,D;return(async()=>{try{const O=await c0.api.get(k,{responseType:"blob"});N&&O&&(D=URL.createObjectURL(O),I(D))}catch(O){console.error("Failed to load authenticated image:",O)}})(),()=>{N=!1,D&&URL.revokeObjectURL(D)}},[k]);const y=_;return d.jsxs(W,{ref:h,style:g,className:"relative group bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg overflow-hidden",children:[d.jsxs(W,{className:`aspect-square w-full flex items-center justify-center bg-gray-50 dark:bg-gray-900 relative ${A||!p?"cursor-pointer":""}`,onClick:()=>{v||x||(A&&n?n():!p&&o&&o())},children:[T||y?d.jsx(Ht,{src:T||y,alt:e.original_filename,className:"w-full h-full object-cover"}):d.jsx(Nt,{className:`fa-solid ${li(e.mime_type)} text-4xl text-gray-400 dark:text-gray-500`}),(v||x)&&d.jsxs(W,{className:"absolute inset-0 bg-black/50 flex flex-col items-center justify-center",children:[d.jsx(W,{className:"w-3/4 h-2 bg-gray-700 rounded-full overflow-hidden",children:d.jsx(W,{className:"h-full bg-blue-500 transition-all",style:{width:`${w}%`}})}),d.jsxs(re,{className:"text-white text-xs mt-1",children:[w,"%"]})]}),M&&d.jsx(W,{className:"absolute inset-0 bg-red-500/50 flex items-center justify-center",children:d.jsx(Nt,{className:"fa-solid fa-exclamation-triangle text-2xl text-white"})}),s&&d.jsx(Q,{type:"button",onClick:N=>{N.stopPropagation(),s()},className:`absolute top-1.5 left-1.5 z-10 p-1 rounded-full transition-colors ${a?"bg-yellow-500 text-white":"bg-gray-800/50 text-gray-300 hover:bg-yellow-500 hover:text-white opacity-0 group-hover:opacity-100"}`,title:et(a?"attachment.primary_image":"attachment.set_as_primary"),children:d.jsx(Nt,{className:"fa-solid fa-star text-xs"})}),d.jsxs(W,{className:"absolute inset-0 bg-black/0 group-hover:bg-black/40 transition-colors flex items-start justify-end p-1 gap-1 opacity-0 group-hover:opacity-100",children:[d.jsx(Q,{type:"button",...l,...f,className:"p-1.5 bg-white/90 dark:bg-gray-800/90 rounded text-gray-600 dark:text-gray-300 hover:bg-white cursor-grab active:cursor-grabbing",title:et("attachment.drag_to_reorder"),onClick:N=>N.stopPropagation(),children:d.jsx(Nt,{className:"fa-solid fa-grip-vertical text-sm"})}),!p&&o&&d.jsx(Q,{type:"button",onClick:N=>{N.stopPropagation(),o()},className:"p-1.5 bg-white/90 dark:bg-gray-800/90 rounded text-blue-500 hover:bg-white",title:et("common.download"),children:d.jsx(Nt,{className:"fa-solid fa-download text-sm"})}),M&&r&&d.jsx(Q,{type:"button",onClick:N=>{N.stopPropagation(),r()},className:"p-1.5 bg-white/90 dark:bg-gray-800/90 rounded text-orange-500 hover:bg-white",title:et("common.retry"),children:d.jsx(Nt,{className:"fa-solid fa-arrow-rotate-right text-sm"})}),d.jsx(Q,{type:"button",onClick:N=>{N.stopPropagation(),t()},disabled:v||x,className:"p-1.5 bg-white/90 dark:bg-gray-800/90 rounded text-red-500 hover:bg-white disabled:opacity-50",title:et("common.delete"),children:d.jsx(Nt,{className:"fa-solid fa-times text-sm"})})]})]}),d.jsxs(W,{className:`p-2 ${!p&&o?"cursor-pointer hover:bg-gray-50 dark:hover:bg-gray-700":""}`,onClick:()=>{!p&&o&&o()},children:[d.jsx(zt,{className:"text-xs font-medium text-gray-900 dark:text-white truncate",title:e.original_filename,children:e.original_filename}),d.jsx(zt,{className:"text-xs text-gray-500 dark:text-gray-400",children:e.size_formatted})]})]})},Ji=({allItems:e,canAddMore:t,totalCount:r,maxFiles:n,maxSize:o,accept:a,onRemove:s,onRetry:l,onImageClick:f,onDownload:h,onDragEnd:c,onAddClick:i,enablePrimarySelection:u,primaryFileId:g,onPrimaryChange:p})=>{const m=jg(hi(ya,{activationConstraint:{distance:8}}),hi(ma,{coordinateGetter:Zi}));return d.jsxs(W,{className:"p-3",children:[d.jsx(Wh,{sensors:m,collisionDetection:Wg,onDragEnd:c,children:d.jsx(Wi,{items:e.map(v=>"hash"in v?v.hash:v.id),strategy:qn,children:d.jsxs(W,{className:"grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 gap-3",children:[e.map(v=>{const x="hash"in v,M=x?v.is_image:v.mime_type?.startsWith("image/")??!1;return d.jsx(Qi,{file:v,onRemove:()=>s(v),onRetry:"status"in v&&v.status==="error"?()=>l(v):void 0,onImageClick:M?()=>f(v):void 0,onDownload:x?()=>h(v):void 0,isPrimary:u&&x&&(v.hash||v.id)===g,onPrimaryClick:u&&x?()=>p?.(v.hash||v.id):void 0},x?v.hash:v.id)}),t&&d.jsxs(W,{className:"aspect-square flex flex-col items-center justify-center border-2 border-dashed border-gray-300 dark:border-gray-600 rounded-lg cursor-pointer hover:border-gray-400 dark:hover:border-gray-500 hover:bg-gray-50 dark:hover:bg-gray-800/50 transition-colors",onClick:i,children:[d.jsx(Nt,{className:"fa-solid fa-plus text-2xl text-gray-400 dark:text-gray-500 mb-1"}),d.jsx(re,{className:"text-xs text-gray-500 dark:text-gray-400",children:et("common.add")})]})]})})}),d.jsxs(W,{className:"mt-3 pt-3 border-t border-gray-200 dark:border-gray-700 flex justify-between items-center text-xs text-gray-500 dark:text-gray-400",children:[d.jsx(re,{children:et("attachment.attached_count",{count:r,max:n})}),d.jsxs(re,{children:[et("attachment.max_size",{size:o}),a&&` (${a})`]})]})]})},d0=[],u0=[],Qn=C.forwardRef(({uploadTriggerEvent:e,attachmentableType:t,attachmentableId:r,collection:n="default",maxFiles:o=10,maxSize:a=10,maxConcurrentUploads:s=3,accept:l,imageCompression:f,roleIds:h=u0,autoUpload:c=!0,onFilesChange:i,onChange:u,onUploadComplete:g,onUploadError:p,onRemove:m,onReorder:v,initialFiles:x=d0,className:M="",confirmBeforeRemove:w=!1,confirmRemoveTitle:T,confirmRemoveMessage:A,apiEndpoints:_,uploadParams:I,enablePrimarySelection:k=!1,primaryFileId:y,onPrimaryChange:N,id:D,editorAttrs:P},O)=>{const L={upload:_?.upload??"/api/attachments",delete:_?.delete??"/api/attachments/:id",reorder:_?.reorder??"/api/attachments/reorder"},$=C.useRef(u??i);$.current=u??i;const S=C.useCallback(G=>{const Y=$.current;if(!Y)return;Y({target:{value:G,files:G},preventDefault:()=>{},stopPropagation:()=>{}})},[]),b=ii({attachmentableType:t,attachmentableId:r,collection:n,maxFiles:o,maxSize:a,maxConcurrentUploads:s,accept:l,imageCompression:f,roleIds:h,autoUpload:c,initialFiles:x,endpoints:L,onFilesChange:S,onUploadComplete:g,onUploadError:p,onRemove:m,onReorder:v,uploadTriggerEvent:e,confirmBeforeRemove:w,uploadParams:I});C.useImperativeHandle(O,()=>({uploadAll:b.handleUploadAll,clear:b.clear,getPendingFiles:b.getPendingFiles}));const z=C.useMemo(()=>b.imageFiles.map(G=>{const Y=!("hash"in G),B=G,V=G;return Y?{src:B.preview||"",filename:B.original_filename,title:B.original_filename,downloadRequiresAuth:!1}:{src:b.authenticatedImageUrls.get(V.id)||V.download_url,downloadUrl:V.download_url,filename:V.original_filename,title:V.original_filename,downloadRequiresAuth:!0}}),[b.imageFiles,b.authenticatedImageUrls]),U=C.useMemo(()=>({existingFiles:b.existingFiles,pendingFiles:b.pendingFiles,isDragOver:b.isDragOver,isDeleting:b.isDeleting,maxFiles:o,maxSize:a,accept:l,endpoints:L,confirmBeforeRemove:w,totalCount:b.totalCount,hasFiles:b.hasFiles,canAddMore:b.canAddMore,allItems:b.allItems,imageFiles:b.imageFiles,handleFiles:b.handleFiles,handleRemove:b.handleRemove,handleRetry:b.handleRetry,handleUploadAll:b.handleUploadAll,handleOpenGallery:b.handleOpenGallery,handleDownload:b.handleDownload,handleDragEnd:b.handleDragEnd,setIsDragOver:b.setIsDragOver,inputRef:b.inputRef,galleryOpen:b.galleryOpen,setGalleryOpen:b.setGalleryOpen,galleryStartIndex:b.galleryStartIndex,galleryKeyRef:b.galleryKeyRef,confirmDialogOpen:b.confirmDialogOpen,setConfirmDialogOpen:b.setConfirmDialogOpen,itemToDelete:b.itemToDelete,executeRemoveAttachment:b.executeRemoveAttachment,authenticatedImageUrls:b.authenticatedImageUrls}),[b,o,a,l,L,w]);return d.jsx(Yl,{value:U,children:d.jsxs(W,{id:D,className:M,...P,children:[d.jsx(ci,{isDragOver:b.isDragOver,canAddMore:b.canAddMore,onFiles:b.handleFiles,setIsDragOver:b.setIsDragOver,inputRef:b.inputRef,accept:l,maxFiles:o,maxSize:a,children:b.hasFiles&&d.jsx(Ji,{allItems:b.allItems,canAddMore:b.canAddMore,totalCount:b.totalCount,maxFiles:o,maxSize:a,accept:l,onRemove:b.handleRemove,onRetry:b.handleRetry,onImageClick:b.handleOpenGallery,onDownload:b.handleDownload,onDragEnd:b.handleDragEnd,onAddClick:()=>b.inputRef.current?.click(),enablePrimarySelection:k,primaryFileId:y,onPrimaryChange:N})}),w&&d.jsx(ta,{isOpen:b.confirmDialogOpen,onClose:()=>{b.isDeleting||b.setConfirmDialogOpen(!1)},title:T??et("attachment.delete_confirm_title"),message:A??et("attachment.delete_confirm_message"),confirmText:et("common.delete"),confirmButtonVariant:"danger",onConfirm:()=>{b.itemToDelete&&b.executeRemoveAttachment(b.itemToDelete)},isLoading:b.isDeleting,loadingText:et("attachment.deleting")}),z.length>0&&b.galleryOpen&&d.jsx(Lr,{images:z,isOpen:!0,onClose:()=>b.setGalleryOpen(!1),startIndex:b.galleryStartIndex,showDownload:!0},`gallery-${b.galleryKeyRef.current}`)]})})});Qn.displayName="FileUploader";const f0=Object.freeze(Object.defineProperty({__proto__:null,FileDropZone:ci,FileList:Ji,FileUploader:Qn,FileUploaderProvider:Yl,SortableThumbnailItem:Qi,default:Qn,extractErrorMessage:si,fileUploaderT:et,formatFileSize:Hn,getFileIcon:li,useFileUploader:ii,useFileUploaderContext:yg},Symbol.toStringTag,{value:"Module"})),Ri=({provider:e,className:t="w-5 h-5"})=>{switch(e){case"google":return d.jsxs("svg",{className:t,viewBox:"0 0 24 24",children:[d.jsx("path",{fill:"#4285F4",d:"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z"}),d.jsx("path",{fill:"#34A853",d:"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z"}),d.jsx("path",{fill:"#FBBC05",d:"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z"}),d.jsx("path",{fill:"#EA4335",d:"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z"})]});case"naver":return d.jsx("svg",{className:t,viewBox:"0 0 24 24",children:d.jsx("path",{fill:"currentColor",d:"M16.273 12.845L7.376 0H0v24h7.727V11.155L16.624 24H24V0h-7.727z"})});case"kakao":return d.jsx("svg",{className:t,viewBox:"0 0 24 24",children:d.jsx("path",{fill:"currentColor",d:"M12 3c5.799 0 10.5 3.664 10.5 8.185 0 4.52-4.701 8.184-10.5 8.184a13.5 13.5 0 0 1-1.727-.11l-4.408 2.883c-.501.265-.678.236-.472-.413l.892-3.678c-2.88-1.46-4.785-3.99-4.785-6.866C1.5 6.665 6.201 3 12 3zm5.519 8.625h-.634v2.916h-.97v-2.916h-.633v-.848h2.237v.848zm-3.294 2.916h-.97V10.77h.97v3.771zm-1.97 0h-.97v-2.77l-.658 1.53h-.629l-.665-1.53v2.77h-.97V10.77h1.13l.822 1.912.814-1.912h1.126v3.771zm-4.49 0h-.97V10.77h.97v3.771z"})});case"facebook":return d.jsx("svg",{className:t,viewBox:"0 0 24 24",children:d.jsx("path",{fill:"currentColor",d:"M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z"})});case"apple":return d.jsx("svg",{className:t,viewBox:"0 0 24 24",children:d.jsx("path",{fill:"currentColor",d:"M12.152 6.896c-.948 0-2.415-1.078-3.96-1.04-2.04.027-3.91 1.183-4.961 3.014-2.117 3.675-.546 9.103 1.519 12.09 1.013 1.454 2.208 3.09 3.792 3.039 1.52-.065 2.09-.987 3.935-.987 1.831 0 2.35.987 3.96.948 1.637-.026 2.676-1.48 3.676-2.948 1.156-1.688 1.636-3.325 1.662-3.415-.039-.013-3.182-1.221-3.22-4.857-.026-3.04 2.48-4.494 2.597-4.559-1.429-2.09-3.623-2.324-4.39-2.376-2-.156-3.675 1.09-4.61 1.09zM15.53 3.83c.843-1.012 1.4-2.427 1.245-3.83-1.207.052-2.662.805-3.532 1.818-.78.896-1.454 2.338-1.273 3.714 1.338.104 2.715-.688 3.559-1.701"})});default:return null}},ec=(e,t)=>window.G7Core?.t?.(e,t)??e,g0=[{id:"google",name:"Google",color:"bg-white dark:bg-gray-800",textColor:"text-gray-700 dark:text-gray-300"},{id:"naver",name:"네이버",color:"bg-[#03C75A]",textColor:"text-white"},{id:"kakao",name:"카카오",color:"bg-[#FEE500]",textColor:"text-[#000000]/85"},{id:"facebook",name:"Facebook",color:"bg-[#1877F2]",textColor:"text-white"},{id:"apple",name:"Apple",color:"bg-black dark:bg-white",textColor:"text-white dark:text-black"}],tc=({providers:e=["google","naver","kakao"],mode:t="login",variant:r="full",className:n="",id:o,editorAttrs:a})=>{const s=h=>{const c=encodeURIComponent(window.location.href);window.location.href=`/api/auth/${h}?redirect=${c}`},l=h=>t==="register"?ec("auth.social.register_with",{provider:h}):ec("auth.social.login_with",{provider:h}),f=g0.filter(h=>e.includes(h.id));return r==="icon"?d.jsx(W,{className:`flex justify-center gap-4 ${n}`,id:o,...a,children:f.map(h=>d.jsx(Q,{onClick:()=>s(h.id),className:`w-12 h-12 flex items-center justify-center rounded-full ${h.color} ${h.textColor} border border-gray-200 dark:border-gray-700 hover:opacity-90 transition-opacity`,"aria-label":l(h.name),children:d.jsx(Ri,{provider:h.id,className:"w-5 h-5"})},h.id))}):d.jsx(W,{className:`space-y-3 ${n}`,id:o,...a,children:f.map(h=>d.jsxs(Q,{onClick:()=>s(h.id),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 ${h.color} ${h.textColor} hover:opacity-90 transition-opacity`,children:[d.jsx(Ri,{provider:h.id,className:"w-5 h-5"}),d.jsx(re,{children:l(h.name)})]},h.id))})},h0=Object.freeze(Object.defineProperty({__proto__:null,default:tc},Symbol.toStringTag,{value:"Module"})),p0=(e,t)=>window.G7Core?.t?.(e,t)??e,m0={success:Re.CheckCircle,error:Re.XCircle,warning:Re.ExclamationTriangle,info:Re.InfoCircle},rc={success:{bg:"bg-green-50 dark:bg-green-900/20 border-green-200 dark:border-green-800",text:"text-green-800 dark:text-green-300"},error:{bg:"bg-red-50 dark:bg-red-900/20 border-red-200 dark:border-red-800",text:"text-red-800 dark:text-red-300"},warning:{bg:"bg-yellow-50 dark:bg-yellow-900/20 border-yellow-200 dark:border-yellow-800",text:"text-yellow-800 dark:text-yellow-300"},info:{bg:"bg-blue-50 dark:bg-blue-900/20 border-blue-200 dark:border-blue-800",text:"text-blue-800 dark:text-blue-300"}},b0={"top-left":"top-4 left-4","top-center":"top-4 left-1/2 -translate-x-1/2","top-right":"top-4 right-4","bottom-left":"bottom-4 left-4","bottom-center":"bottom-4 left-1/2 -translate-x-1/2","bottom-right":"bottom-4 right-4"},Ca=({toasts:e,position:t="bottom-center",duration:r=3e3,onRemove:n})=>{const[o,a]=C.useState(new Map),s=C.useCallback(l=>{a(f=>{const h=new Map(f);return h.set(l,!1),h}),setTimeout(()=>{if(n)n(l);else{const f=window.G7Core;f?.state?.update&&f.state.update(h=>({toasts:(Array.isArray(h.toasts)?h.toasts:[]).filter(i=>i.id!==l)}))}},300)},[n]);return C.useEffect(()=>{!e||e.length===0||e.forEach(l=>{if(o.has(l.id))return;a(h=>{const c=new Map(h);return c.set(l.id,!0),c});const f=l.duration||r;f>0&&setTimeout(()=>{s(l.id)},f)})},[e,r,s,o]),!e||e.length===0?null:d.jsx(W,{className:`fixed z-[9999] flex flex-col gap-2 ${b0[t]}`,"aria-live":"polite","aria-atomic":"true",children:e.map(l=>d.jsx(y0,{toast:l,position:t,isVisible:o.get(l.id)??!0,onClose:()=>s(l.id)},l.id))})},y0=({toast:e,position:t,isVisible:r,onClose:n})=>{const o=rc[e.type]||rc.info,a=e.icon?e.icon:m0[e.type],s=t.startsWith("bottom")?"translate-y-2":"-translate-y-2";return d.jsxs(W,{className:` flex items-center gap-3 p-4 rounded-lg border shadow-lg min-w-[300px] max-w-md transition-all duration-300 ${o.bg} ${r?"opacity-100 translate-y-0":`opacity-0 ${s}`} - `,role:"alert",children:[d.jsx(ce,{name:a,className:`w-5 h-5 flex-shrink-0 ${o.text}`}),d.jsx(te,{className:`flex-1 text-sm font-medium ${o.text}`,children:e.message}),d.jsx(Q,{onClick:n,className:`flex-shrink-0 p-1 rounded hover:bg-black/10 dark:hover:bg-white/10 ${o.text} focus:outline-none`,"aria-label":Yh("common.close"),children:d.jsx(ce,{name:Je.Times,className:"w-4 h-4"})})]})},Qh=Object.freeze(Object.defineProperty({__proto__:null,Toast:xa,default:xa},Symbol.toStringTag,{value:"Module"})),Jh=window.G7Core?.createLogger?.("Comp:PageTransition")??{log:(...e)=>console.log("[Comp:PageTransition]",...e),warn:(...e)=>console.warn("[Comp:PageTransition]",...e),error:(...e)=>console.error("[Comp:PageTransition]",...e)},ka=({className:e="",style:t})=>{const[r,n]=k.useState(!1);return k.useEffect(()=>{const o=window.G7Core?.TransitionManager;if(!o){Jh.warn("TransitionManager를 찾을 수 없습니다.");return}return n(o.getIsPending()),o.subscribe(s=>{n(s)})},[]),r?d.jsxs(W,{className:`fixed top-0 left-0 right-0 z-50 ${e}`,style:t,role:"progressbar","aria-label":"페이지 로딩 중",children:[d.jsx(W,{className:"h-1 bg-gradient-to-r from-blue-500 via-blue-600 to-blue-500 animate-pulse",children:d.jsx(W,{className:"h-full bg-blue-700 animate-[loading_1.5s_ease-in-out_infinite]",style:{width:"30%",animation:"loading 1.5s ease-in-out infinite"}})}),d.jsx("style",{children:` + `,role:"alert",children:[d.jsx(fe,{name:a,className:`w-5 h-5 flex-shrink-0 ${o.text}`}),d.jsx(re,{className:`flex-1 text-sm font-medium ${o.text}`,children:e.message}),d.jsx(Q,{onClick:n,className:`flex-shrink-0 p-1 rounded hover:bg-black/10 dark:hover:bg-white/10 ${o.text} focus:outline-none`,"aria-label":p0("common.close"),children:d.jsx(fe,{name:Re.Times,className:"w-4 h-4"})})]})},v0=Object.freeze(Object.defineProperty({__proto__:null,Toast:Ca,default:Ca},Symbol.toStringTag,{value:"Module"})),w0=window.G7Core?.createLogger?.("Comp:PageTransition")??{log:(...e)=>console.log("[Comp:PageTransition]",...e),warn:(...e)=>console.warn("[Comp:PageTransition]",...e),error:(...e)=>console.error("[Comp:PageTransition]",...e)},Sa=({className:e="",style:t})=>{const[r,n]=C.useState(!1);return C.useEffect(()=>{const o=window.G7Core?.TransitionManager;if(!o){w0.warn("TransitionManager를 찾을 수 없습니다.");return}return n(o.getIsPending()),o.subscribe(s=>{n(s)})},[]),r?d.jsxs(W,{className:`fixed top-0 left-0 right-0 z-50 ${e}`,style:t,role:"progressbar","aria-label":"페이지 로딩 중",children:[d.jsx(W,{className:"h-1 bg-gradient-to-r from-blue-500 via-blue-600 to-blue-500 animate-pulse",children:d.jsx(W,{className:"h-full bg-blue-700 animate-[loading_1.5s_ease-in-out_infinite]",style:{width:"30%",animation:"loading 1.5s ease-in-out infinite"}})}),d.jsx("style",{children:` @keyframes loading { 0% { transform: translateX(-100%); @@ -83,5 +84,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(ce,{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(ce,{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 ne=URL.createObjectURL(V);return q(ne),()=>URL.revokeObjectURL(ne)}else q(null)},[V]);const ee=k.useCallback(ne=>vt?.t?.(ne)??ne,[]),fe=k.useCallback(()=>{const ne=document.cookie.match(/XSRF-TOKEN=([^;]+)/);return ne?decodeURIComponent(ne[1]):null},[]),R=k.useCallback(()=>vt?.api?.getToken?.()??null,[]),ke=k.useCallback(async ne=>{B(!1),j(null),P(!0),U(null);try{const oe=new FormData;oe.append("avatar",ne);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:oe});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(oe){const be=oe instanceof Error?oe:new Error(String(oe));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 ne=>{const oe=ne.target.files?.[0];if(!oe)return;U(null);const be=i*1024*1024;if(oe.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&&!oe.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(oe),B(!0)):ke(oe)},[i,c,s,A,ke,ee]),Ge=k.useCallback(async()=>{G(!1),L(!0),U(null);try{const ne=fe(),oe=R(),be=await fetch(o,{method:"DELETE",headers:{Accept:"application/json","Content-Type":"application/json",...ne&&{"X-XSRF-TOKEN":ne},...oe&&{Authorization:`Bearer ${oe}`}},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(ne){const oe=ne instanceof Error?ne:new Error(String(ne));U(oe.message),g?.(oe),vt?.toast?.error?.(oe.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(ce,{name:"spinner",size:"sm",className:"animate-spin"}):d.jsx(ce,{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(ce,{name:"spinner",size:"sm",className:"animate-spin"}):d.jsx(ce,{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(ce,{name:"spinner",size:"sm",className:"animate-spin"}):d.jsx(ce,{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(ce,{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(ce,{name:"spinner",size:"sm",className:"animate-spin"}):d.jsx(ce,{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(ce,{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(ce,{name:"spinner",size:"sm",className:"animate-spin"}):d.jsx(ce,{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(ce,{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(ce,{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(ce,{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.0-beta.6",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-beta.8",dependencies:{modules:{"sirsoft-board":">=1.0.0-beta.4","sirsoft-ecommerce":">=1.0.0-beta.5","sirsoft-page":">=1.0.0-beta.3"},plugins:{"sirsoft-daum_postcode":">=1.0.0-beta.2"}},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=ce,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},x0=Object.freeze(Object.defineProperty({__proto__:null,PageTransitionIndicator:Sa,default:Sa},Symbol.toStringTag,{value:"Module"})),nc=window.G7Core?.createLogger?.("Comp:PageTransitionBlur")??{log:(...e)=>console.log("[Comp:PageTransitionBlur]",...e),warn:(...e)=>console.warn("[Comp:PageTransitionBlur]",...e)},_a=({className:e="",style:t})=>{const[r,n]=C.useState(!1);return C.useEffect(()=>{const o=window.G7Core?.TransitionManager;if(!o){nc.warn("TransitionManager를 찾을 수 없습니다.");return}return n(o.getIsPending()),o.subscribe(s=>{nc.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},k0=Object.freeze(Object.defineProperty({__proto__:null,PageTransitionBlur:_a,default:_a},Symbol.toStringTag,{value:"Module"})),oc={sm:640,md:768,lg:1024,xl:1280,"2xl":1536},ac=new Set(["hidden","block","inline-block","inline","flex","inline-flex","grid","inline-grid","table","table-row","table-cell","contents","list-item","flow-root"]),C0=new Set(["Div","Flex","Grid","Section","Article","Nav","Aside","Main","Header","Footer","Fragment","Form","Container"]),S0=new Set(["H1","H2","H3","H4","H5","H6","P","Span","Label","A","Strong","Em","Small","Badge"]),_0=new Set(["Input","Textarea","Select","Checkbox","Radio","Toggle","DatePicker","TagInput","SearchBar"]),E0=new Set(["Img","Image","Avatar","AvatarUploader","ImageGallery","ProductImageViewer","FileUploader"]),sc={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 T0(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=>!lc(o.if));return n.length>1&&N0(n)?[...r,ic(n)]:[...r,...n]}if(t.length>1&&r.length===0){const n=t.filter(o=>!lc(o.if));return n.length===0?[]:n.length===1?n:[ic(n)]}return e}function lc(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 N0(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 ic(e){return e.reduce((t,r)=>Ea(r)>Ea(t)?r:t)}function Ea(e){return e.children?e.children.length+e.children.reduce((t,r)=>t+Ea(r),0):0}function A0(e){return e.includes("{{")?e.replace(/\{\{([^}]+)\}\}/g,(t,r)=>{const n=r.match(/\?[\s]*['"]([^'"]*)['"]\s*:\s*['"]/);return n?n[1]:""}):e}function Ta(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 M0(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 f=r.align||"stretch",h={start:"items-start",end:"items-end",center:"items-center",baseline:"items-baseline",stretch:"items-stretch"};h[f]&&n.push(h[f]);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 O0(e){switch(e){case"pulse":return"animate-pulse";case"wave":return"animate-pulse";case"none":return"";default:return"animate-pulse"}}function Jn(e,t,r,n){return!e||e.length===0?[]:T0(e).map((a,s)=>cc(a,t,r,s,n))}function I0(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 D0(e,t){const r=e.split(/\s+/).filter(Boolean),n=[],o=[];for(const f of r){const h=f.match(/^(sm|md|lg|xl|2xl):(.+)$/);if(h){const[,c,i]=h;if(ac.has(i)){n.push({breakpoint:oc[c]||0,display:i});continue}(oc[c]||0)<=t&&o.push(i);continue}if(ac.has(f)){n.push({breakpoint:0,display:f});continue}o.push(f)}if(n.length===0)return{visible:!0,className:e};n.sort((f,h)=>f.breakpoint-h.breakpoint);let a="";for(const f of n)f.breakpoint<=t&&(a=f.display);a||(a=n[0].display);const s=a!=="hidden",l=s?[a,...o].join(" "):"";return{visible:s,className:l}}function L0(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 cc(e,t,r,n,o){const{name:a,children:s,iteration:l}=e,f=I0(e,o),h=M0(e),c=h?`${h} ${f}`.trim():f,i=A0(c),u=D0(i,o);if(!a||!u.visible)return null;const g=u.className;if(l)return d.jsx(C.Fragment,{children:Array.from({length:r},(m,v)=>cc({...e,iteration:void 0},t,r,v,o))},n);if(sc[a])return d.jsx("div",{className:g,children:sc[a](t,r)},n);if(C0.has(a)){const m=Ta(g,a);if(!s||s.length===0){const T=/\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:T},n)}const v=Jn(s,t,r,o);if(!(v.length>0&&v.some(w=>w!==null)))return null;const M=L0(m);return d.jsx("div",{className:M.className,style:M.style,children:v},n)}const p=Ta(g,a);if(S0.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"},v={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",M=v[a]||"w-full",w=a.startsWith("H")?"mb-2 mt-1":"mb-1.5";return d.jsx("div",{className:`${x} ${M} bg-gray-200 dark:bg-gray-700 rounded ${t} ${w} ${p}`.trim()},n)}if(_0.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(E0.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=Ta(g,a),v=Jn(s,t,r,o);if(!(v.length>0&&v.some(T=>T!==null)))return null;const w=/\b(border|rounded|px-\d|py-\d)/.test(f)?"border border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800/50 rounded-lg":"";return d.jsx("div",{className:`${m} ${w}`.trim(),children:v},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:Jn(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 Na=({components:e,options:t})=>{const r=O0(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:Jn(e,r,t.iteration_count,s)})},P0=Object.freeze(Object.defineProperty({__proto__:null,PageSkeleton:Na,default:Na},Symbol.toStringTag,{value:"Module"})),F0=(e,t)=>window.G7Core?.t?.(e,t)??e,dc=({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||F0("nav.loading")})]})},$0=Object.freeze(Object.defineProperty({__proto__:null,default:dc},Symbol.toStringTag,{value:"Module"})),Hr=(e,t)=>window.G7Core?.t?.(e,t)??e,uc=({currentPage:e,totalPages:t,onPageChange:r,maxVisiblePages:n=5,showFirstLast:o=!0,className:a="",style:s,prevText:l,nextText:f,id:h,editorAttrs:c})=>{const i=C.useMemo(()=>{const m=[];if(t<=n+2)for(let v=1;v<=t;v++)m.push(v);else{const v=Math.floor(n/2);let x=Math.max(2,e-v),M=Math.min(t-1,e+v);e<=v+1?M=n:e>=t-v&&(x=t-n+1),m.push(1),x>2&&m.push("...");for(let w=x;w<=M;w++)m.push(w);M1&&m.push(t)}return m},[e,t,n]),u=m=>{m<1||m>t||m===e||r(m)},g=()=>{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":Hr("common.first_page"),children:"«"}),d.jsx(Q,{onClick:g,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":Hr("common.prev_page"),children:l||d.jsx(d.Fragment,{children:"‹"})}),d.jsx(W,{className:"flex items-center gap-1",children:i.map((m,v)=>{if(m==="...")return d.jsx(re,{className:"px-3 py-1 text-sm text-gray-500 dark:text-gray-400",children:"..."},`ellipsis-${v}`);const x=m,M=x===e;return d.jsx(Q,{onClick:()=>u(x),className:`px-3 py-1 text-sm border rounded ${M?"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":Hr("common.page_n",{n:x}),"aria-current":M?"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":Hr("common.next_page"),children:f||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":Hr("common.last_page"),children:"»"})]})},U0=Object.freeze(Object.defineProperty({__proto__:null,Pagination:uc},Symbol.toStringTag,{value:"Module"})),fc=(e,t)=>window.G7Core?.t?.(e,t)??e,gc=({name:e="search",placeholder:t,value:r,onChange:n,onSubmit:o,showButton:a=!1,suggestions:s=[],onSuggestionClick:l,showSuggestions:f=!1,className:h="",style:c,id:i,editorAttrs:u})=>{const g=t??fc("common.search_placeholder"),[p,m]=C.useState(""),[v,x]=C.useState(!1),M=C.useRef(null),w=C.useRef(""),T=r!==void 0?r:p,A=f&&v&&s.length>0&&T.length>0;C.useEffect(()=>{r!==void 0&&(w.current=r)},[r]);const _=y=>{const N=y.target.value;m(N),n?.(y),w.current!==""&&N===""&&!y.nativeEvent.inputType&&setTimeout(()=>{const D=M.current?.querySelector("form");D&&D.requestSubmit()},0),w.current=N},I=y=>{m(y.text);const N={target:{value:y.text,name:e}};n?.(N),l?.(y),x(!1)},k=y=>{y.preventDefault(),o?.(y)};return d.jsxs(W,{ref:M,className:`relative ${h}`,style:c,id:i,...u,children:[d.jsx(uo,{onSubmit:k,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(fe,{name:Re.Search,className:"w-5 h-5 text-gray-400 dark:text-gray-500"})}),d.jsx(_t,{type:"search",name:e,value:T,onChange:_,onFocus:()=>x(!0),onBlur:()=>setTimeout(()=>x(!1),200),placeholder:g,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:fc("common.search")})]})}),A&&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(fe,{name:Re.Search,className:"w-4 h-4 text-gray-400 dark:text-gray-500"}),d.jsx(re,{className:"text-sm text-gray-700 dark:text-gray-300",children:y.text})]})},y.id))})]})},z0=Object.freeze(Object.defineProperty({__proto__:null,SearchBar:gc},Symbol.toStringTag,{value:"Module"})),kt=window.G7Core,H0={sm:"md",md:"lg",lg:"xl",xl:"2xl","2xl":"3xl"};function Aa({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:f,showDeleteButton:h=!0,accept:c="image/*",maxSize:i=5,className:u="",uploadButtonText:g,deleteButtonText:p,readOnly:m=!1,confirmDelete:v=!0,deleteConfirmMessage:x,confirmUpload:M=!0,uploadConfirmMessage:w,uploadSuccessActions:T,uploadErrorActions:A,deleteSuccessActions:_,deleteErrorActions:I,id:k,editorAttrs:y}){const N=C.useRef(null),[D,P]=C.useState(!1),[O,L]=C.useState(!1),[$,S]=C.useState(void 0),[b,z]=C.useState(null),[U,G]=C.useState(!1),[Y,B]=C.useState(!1),[V,j]=C.useState(null),[H,q]=C.useState(null),ee=C.useRef(`avatar-upload-${Math.random().toString(36).slice(2,11)}`).current;C.useEffect(()=>{if(V){const oe=URL.createObjectURL(V);return q(oe),()=>URL.revokeObjectURL(oe)}else q(null)},[V]);const ne=C.useCallback(oe=>kt?.t?.(oe)??oe,[]),ce=C.useCallback(()=>{const oe=document.cookie.match(/XSRF-TOKEN=([^;]+)/);return oe?decodeURIComponent(oe[1]):null},[]),R=C.useCallback(()=>kt?.api?.getToken?.()??null,[]),_e=C.useCallback(async oe=>{B(!1),j(null),P(!0),z(null);try{const le=new FormData;le.append("avatar",oe);const ve=ce(),Te=R(),We=await fetch(n,{method:"POST",headers:{Accept:"application/json",...ve&&{"X-XSRF-TOKEN":ve},...Te&&{Authorization:`Bearer ${Te}`}},credentials:"include",body:le});if(!We.ok){const Ie=await We.json().catch(()=>({}));throw new Error(Ie.message||ne("attachment.upload_failed"))}const Ae=await We.json(),He=Ae.data||Ae;He.avatar&&S(He.avatar),a?.(He),kt?.toast?.success?.(ne("mypage.profile.avatar_uploaded")),T?.length?T.forEach(Ie=>kt?.dispatch?.(Ie)):kt?.refetchDataSource?.("user")}catch(le){const ve=le instanceof Error?le:new Error(String(le));z(ve.message),s?.(ve),kt?.toast?.error?.(ve.message),A?.length&&A.forEach(Te=>kt?.dispatch?.(Te))}finally{P(!1),N.current&&(N.current.value="")}},[n,a,s,ce,R,ne]),me=C.useCallback(async oe=>{const le=oe.target.files?.[0];if(!le)return;z(null);const ve=i*1024*1024;if(le.size>ve){const Te=new Error(ne("attachment.file_too_large").replace(":max",`${i}MB`));z(Te.message),s?.(Te),kt?.toast?.error?.(Te.message);return}if(c&&!le.type.match(c.replace("*",".*"))){const Te=new Error(ne("attachment.invalid_file_type"));z(Te.message),s?.(Te),kt?.toast?.error?.(Te.message);return}M?(j(le),B(!0)):_e(le)},[i,c,s,M,_e,ne]),Be=C.useCallback(async()=>{G(!1),L(!0),z(null);try{const oe=ce(),le=R(),ve=await fetch(o,{method:"DELETE",headers:{Accept:"application/json","Content-Type":"application/json",...oe&&{"X-XSRF-TOKEN":oe},...le&&{Authorization:`Bearer ${le}`}},credentials:"include"});if(!ve.ok){const Te=await ve.json().catch(()=>({}));throw new Error(Te.message||ne("attachment.delete_failed"))}S(null),l?.(),kt?.toast?.success?.(ne("mypage.profile.avatar_deleted")),_?.length?_.forEach(Te=>kt?.dispatch?.(Te)):kt?.refetchDataSource?.("user")}catch(oe){const le=oe instanceof Error?oe:new Error(String(oe));z(le.message),f?.(le),kt?.toast?.error?.(le.message),I?.length&&I.forEach(ve=>kt?.dispatch?.(ve))}finally{L(!1)}},[o,l,f,ce,R,ne]),$e=C.useCallback(()=>{v?G(!0):Be()},[v,Be]),ye=C.useCallback(()=>{G(!1)},[]),Ne=C.useCallback(()=>{B(!1),j(null),N.current&&(N.current.value="")},[]),we=C.useCallback(()=>{V&&_e(V)},[V,_e]),ke=$===void 0?e:$,Ue=!!ke,Oe=H0[r]||"lg",K=U||Y,te=()=>d.jsxs(W,{className:"flex items-center justify-center gap-2",children:[d.jsx(_t,{ref:N,id:ee,type:"file",accept:c,className:"hidden",onChange:me,disabled:D}),!Ue&&d.jsxs(vr,{htmlFor:ee,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 ${D?"opacity-50 cursor-not-allowed":""}`,children:[D?d.jsx(fe,{name:"spinner",size:"sm",className:"animate-spin"}):d.jsx(fe,{name:"image",size:"sm"}),d.jsx(re,{children:g||ne("mypage.profile.register_avatar")})]}),Ue&&d.jsxs(d.Fragment,{children:[d.jsxs(vr,{htmlFor:ee,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 ${D?"opacity-50 cursor-not-allowed":""}`,children:[D?d.jsx(fe,{name:"spinner",size:"sm",className:"animate-spin"}):d.jsx(fe,{name:"upload",size:"sm"}),d.jsx(re,{children:g||ne("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:$e,disabled:O,children:[O?d.jsx(fe,{name:"spinner",size:"sm",className:"animate-spin"}):d.jsx(fe,{name:"trash-2",size:"sm"}),d.jsx(re,{children:p||ne("common.delete")})]})]})]});return d.jsxs(W,{className:`flex flex-col items-center gap-3 ${u}`,id:k,...y,children:[Y&&H?d.jsxs(W,{className:"relative",children:[d.jsx(Ht,{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(Kr,{avatar:ke||void 0,name:t,size:Oe}),!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(fe,{name:"upload",size:"sm",className:"text-blue-600 dark:text-blue-400 shrink-0"}),d.jsx(re,{className:"text-sm font-medium text-blue-800 dark:text-blue-300",children:w||ne("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:we,disabled:D,children:[D?d.jsx(fe,{name:"spinner",size:"sm",className:"animate-spin"}):d.jsx(fe,{name:"check",size:"sm"}),d.jsx(re,{children:ne("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:Ne,children:d.jsx(re,{children:ne("common.cancel")})})]})]}),U&&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(fe,{name:"alert-triangle",size:"sm",className:"text-red-600 dark:text-red-400 shrink-0"}),d.jsx(re,{className:"text-sm font-medium text-red-800 dark:text-red-300",children:x||ne("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:Be,disabled:O,children:[O?d.jsx(fe,{name:"spinner",size:"sm",className:"animate-spin"}):d.jsx(fe,{name:"trash-2",size:"sm"}),d.jsx(re,{children:ne("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(re,{children:ne("common.cancel")})})]})]}),!K&&te()]}),b&&!K&&d.jsxs(W,{className:"flex items-center gap-2 text-sm text-red-600 dark:text-red-400",children:[d.jsx(fe,{name:"alert-circle",size:"sm"}),d.jsx(re,{children:b})]})]})}const G0=Object.freeze(Object.defineProperty({__proto__:null,AvatarUploader:Aa,default:Aa},Symbol.toStringTag,{value:"Module"})),hc=()=>window.G7Core,Rn=(e,t)=>window.G7Core?.t?.(e,t)??e,pc={horizontal:"flex items-center gap-1.5",vertical:"flex flex-col items-start"},j0=()=>[{key:"view_profile",label:Rn("userinfo.view_profile"),icon:"user",path:"/users/{{userId}}"},{key:"view_posts",label:Rn("userinfo.view_posts"),icon:"file-lines",path:"/users/{{userId}}/posts"}],Ma=({text:e,title:t})=>e?d.jsx(re,{className:"text-sm text-gray-500 dark:text-gray-400",title:t,children:e}):null,mc=({author:e,name:t,userId:r,subText:n,subTextTitle:o,isGuest:a=!1,isWithdrawn:s=!1,showDropdown:l=!0,clickable:f=!0,profilePath:h="/users/{userId}",className:c="",layout:i="vertical",text:u,stopPropagation:g=!1,menuItems:p,hideMenuItems:m=[],appendMenuItems:v=[],id:x,editorAttrs:M})=>{const w=r??e?.uuid,T=a||e?.is_guest||!1,A=s||e?.status==="withdrawn",_=A?Rn("userinfo.withdrawn_user"):u??t??e?.name??"",[I,k]=C.useState(!1),[y,N]=C.useState({top:0,left:0}),D=C.useRef(null),P=C.useRef(null),O=C.useRef(null),L=h.replace("{userId}",String(w??"")),$=`${pc[i]} ${c}`;C.useEffect(()=>{if(!I)return;const j=q=>{const ee=q.target,ne=D.current?.contains(ee),ce=P.current?.contains(ee);!ne&&!ce&&k(!1)},H=()=>k(!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=C.useCallback(()=>{if(p&&p.length>0)return p.filter(q=>q.show!==!1);let H=j0().filter(q=>!m.includes(q.key)&&q.show!==!1);return v&&v.length>0&&(H=[...H,...v.filter(q=>q.show!==!1)]),H},[p,m,v]),b=C.useCallback(()=>{if(O.current){const j=O.current.getBoundingClientRect();N({top:j.bottom+4,left:j.left})}},[]),z=C.useCallback((j,H)=>{if(H.stopPropagation(),H.preventDefault(),k(!1),j.onClick)j.onClick();else if(j.path){const q=j.path.replace(/\{\{userId\}\}/g,String(w??"")),ee=hc();ee?.navigate?ee.navigate(q):window.location.href=q}},[w]),U=C.useCallback(j=>{j.preventDefault(),g&&j.stopPropagation(),!(T||!w)&&(l?(I||b(),k(H=>!H)):f&&hc()?.navigate?.(L))},[g,T,w,l,I,b,f,L]);if(T||!w)return d.jsxs(W,{className:$,id:x,...M,children:[d.jsxs(W,{className:"flex items-center gap-1.5 text-gray-400 dark:text-gray-500",children:[d.jsx(re,{children:_}),d.jsx(re,{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:Rn("userinfo.guest_badge")})]}),d.jsx(Ma,{text:n,title:o})]});if(A)return d.jsxs(W,{className:$,id:x,...M,children:[d.jsx(re,{className:"text-gray-400 dark:text-gray-500 line-through",children:_}),d.jsx(Ma,{text:n,title:o})]});const G=S(),B=/\btext-\S+/.test(c)?"":"text-gray-900 dark:text-white",V=l||f?`${B} hover:text-blue-600 dark:hover:text-blue-400 cursor-pointer font-medium`.trim():`${B} font-medium`.trim();return d.jsxs(W,{ref:D,className:`relative inline-block ${c}`,id:x,...M,children:[d.jsxs(W,{className:pc[i],children:[d.jsx(Q,{ref:O,onClick:U,className:V,children:_}),d.jsx(Ma,{text:n,title:o})]}),l&&I&&G.length>0&&Rt.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=>z(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(fe,{name:j.icon,className:"w-4 h-4"}),d.jsx(re,{children:j.label})]},j.key))}),document.body)]})},B0=Object.freeze(Object.defineProperty({__proto__:null,UserInfo:mc},Symbol.toStringTag,{value:"Module"})),bc=({tabs:e,activeTabId:t,onTabChange:r,variant:n="underline",className:o="",style:a,hiddenTabIds:s=[],mobileBreakpoint:l=768,id:f,editorAttrs:h})=>{const i=window.G7Core?.useResponsive,u=i?.(),g=u?u.width{!w.disabled&&w.id!==t&&r?.(w.id)},m=w=>{const T=w.target.value,A=Number(T),_=typeof T=="string"&&T!==""&&!Number.isNaN(A)?A:T,I=e.find(k=>String(k.id)===String(_));I&&p(I)},v=s.length>0?e.filter(w=>!s.includes(w.id)):e;if(g)return d.jsx(W,{className:`relative ${o}`,style:a,id:f,...h,children:d.jsx(Qa,{value:t!==void 0?String(t):"",onChange:m,options:v.map(w=>({value:String(w.id),label:w.badge!==void 0?`${w.label} (${w.badge})`:w.label,disabled:w.disabled})),className:"w-full"})});const x=w=>{const T=w.id===t,A="flex items-center gap-2 px-3 py-2 font-medium text-sm transition-all shrink-0 whitespace-nowrap";if(w.disabled)return`${A} opacity-50 cursor-not-allowed text-gray-400 dark:text-gray-600`;switch(n){case"pills":return T?`${A} bg-blue-600 dark:bg-blue-500 text-white rounded-lg`:`${A} text-gray-600 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-lg`;case"underline":return T?`${A} text-gray-900 dark:text-white border-b-2 border-gray-900 dark:border-white`:`${A} 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 T?`${A} 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`:`${A} 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`}},M=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:f,...h,children:d.jsx(Wr,{className:M,children:v.map(w=>d.jsxs(Q,{type:"button",onClick:()=>p(w),disabled:w.disabled,className:x(w),children:[w.iconName&&d.jsx(fe,{name:w.iconName,size:"sm"}),d.jsx(re,{children:w.label}),w.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(re,{children:w.badge})})]},w.id))})})},W0=Object.freeze(Object.defineProperty({__proto__:null,TabNavigation:bc},Symbol.toStringTag,{value:"Module"})),K0={Header:()=>Promise.resolve().then(()=>gd),Footer:()=>Promise.resolve().then(()=>bd),MobileNav:()=>Promise.resolve().then(()=>yd),SlotContainer:()=>Promise.resolve().then(()=>ud),NotificationCenter:()=>Promise.resolve().then(()=>fd),ProductCard:()=>Promise.resolve().then(()=>Jd),ImageGallery:()=>Promise.resolve().then(()=>zl),ProductImageViewer:()=>Promise.resolve().then(()=>sg),QuantitySelector:()=>Promise.resolve().then(()=>lg),PostReactions:()=>Promise.resolve().then(()=>dg),RichTextEditor:()=>Promise.resolve().then(()=>ug),HtmlContent:()=>Promise.resolve().then(()=>fg),HtmlEditor:()=>Promise.resolve().then(()=>gg),ExpandableContent:()=>Promise.resolve().then(()=>hg),FileUploader:()=>Promise.resolve().then(()=>f0),ConfirmDialog:()=>Promise.resolve().then(()=>bg),SocialLoginButtons:()=>Promise.resolve().then(()=>h0),Toast:()=>Promise.resolve().then(()=>v0),PageTransitionIndicator:()=>Promise.resolve().then(()=>x0),PageTransitionBlur:()=>Promise.resolve().then(()=>k0),PageSkeleton:()=>Promise.resolve().then(()=>P0),PageLoading:()=>Promise.resolve().then(()=>$0),ThemeToggle:()=>Promise.resolve().then(()=>sd),Pagination:()=>Promise.resolve().then(()=>U0),SearchBar:()=>Promise.resolve().then(()=>z0),Avatar:()=>Promise.resolve().then(()=>cd),AvatarUploader:()=>Promise.resolve().then(()=>G0),UserInfo:()=>Promise.resolve().then(()=>B0),Modal:()=>Promise.resolve().then(()=>mg),TabNavigation:()=>Promise.resolve().then(()=>W0)},V0=({id:e,className:t,style:r,children:n,editorAttrs:o})=>d.jsx(W,{id:e,className:t,style:r,...o,children:n}),Y0=({id:e,children:t,cols:r=1,responsive:n,gap:o,rowGap:a,colGap:s,autoRows:l,autoCols:f,flow:h="row",className:c="",style:i,onClick:u,editorAttrs:g})=>{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 v={auto:"auto-rows-auto",min:"auto-rows-min",max:"auto-rows-max",fr:"auto-rows-fr"};p.push(v[l])}if(f){const v={auto:"auto-cols-auto",min:"auto-cols-min",max:"auto-cols-max",fr:"auto-cols-fr"};p.push(v[f])}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,...g,children:t})},X0=({id:e,children:t,direction:r="row",justify:n="start",align:o="stretch",wrap:a="nowrap",gap:s=0,grow:l=!1,shrink:f=!0,className:h="",style:c,onClick:i,editorAttrs:u})=>{const g=["flex"],p={row:"flex-row","row-reverse":"flex-row-reverse",col:"flex-col","col-reverse":"flex-col-reverse"};g.push(p[r]);const m={wrap:"flex-wrap",nowrap:"flex-nowrap","wrap-reverse":"flex-wrap-reverse"};g.push(m[a]);const v={start:"justify-start",end:"justify-end",center:"justify-center",between:"justify-between",around:"justify-around",evenly:"justify-evenly"};g.push(v[n]);const x={start:"items-start",end:"items-end",center:"items-center",baseline:"items-baseline",stretch:"items-stretch"};return g.push(x[o]),s>0&&g.push(`gap-${s}`),l===!0?g.push("flex-grow"):typeof l=="number"&&l>0&&g.push(`flex-grow-${l}`),f===!1?g.push("shrink-0"):f===!0?g.push("flex-shrink"):typeof f=="number"&&f>0&&g.push(`flex-shrink-${f}`),h&&g.push(h),d.jsx(W,{id:e,className:g.join(" "),style:c,onClick:i,...u,children:t})},Z0=({id:e,title:t,subtitle:r,children:n,padding:o="md",background:a="none",maxWidth:s,centered:l=!1,border:f=!1,shadow:h="none",rounded:c=!1,className:i="",style:u,onClick:g,editorAttrs:p})=>{const m=[],v={none:"p-0",sm:"p-2",md:"p-4",lg:"p-6",xl:"p-8"};m.push(v[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 w={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(w[s])}l&&m.push("mx-auto"),f&&m.push("border","border-gray-200","dark:border-gray-700");const M={none:"",sm:"shadow-sm",md:"shadow-md",lg:"shadow-lg",xl:"shadow-xl"};return h!=="none"&&m.push(M[h]),c&&m.push("rounded-lg"),i&&m.push(i),d.jsxs(Ra,{id:e,className:m.join(" "),style:u,onClick:g,...p,children:[(t||r)&&d.jsxs(W,{className:"mb-4",children:[t&&d.jsx(Za,{className:"text-2xl font-bold text-gray-900 dark:text-white",children:t}),r&&d.jsx(zt,{className:"mt-1 text-sm text-gray-600 dark:text-gray-400",children:r})]}),n]})},q0=({id:e,leftWidth:t="250px",rightWidth:r="300px",leftSlot:n,centerSlot:o,rightSlot:a,className:s="",style:l,editorAttrs:f})=>{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,...f,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})]})},Q0={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"}]},yc={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 Gr(e,t="KRW"){if(!Number.isFinite(e))return"0";const r=yc[t]||yc.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 eo(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 f=0;r>0&&(a==="KRW"?f=r:n>0&&(f=r*l/n));const h=(l+f)*t;o[a]={value:h,formatted:Gr(h,a)}}return o}function to(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:Gr(o,n)};return r}function vc(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 ro(e){return e.name_localized?e.name_localized:typeof e.name=="string"?e.name:e.name?.ko??""}function J0(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 R0(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 ep(e,t,r){return r.find(n=>!n?.option_values||!n?.is_active?!1:e.every(o=>{const a=ro(o),s=t?.[a];return J0(n.option_values,n.option_values_localized,a)===s}))}function tp(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(A=>{const _=ro(A);return l?.[_]}))return;const h=ep(n,l,o??[]);if(!h){t.setState?.({currentSelection:{},__mergeMode:"shallow"});return}const c=n.map(A=>l[ro(A)]).join("_"),i=a??[];if(i.find(A=>A.id===c)){const A=window.G7Core;A?.toast?.warning?.(A?.t?.("sirsoft-ecommerce.shop.already_added_option")??"이미 추가된 옵션입니다."),t.setState?.({currentSelection:{},__mergeMode:"shallow"});return}const g=h.selling_price??0,p={};n.forEach(A=>{const _=ro(A);p[_]=l[_]});const m=r.additionalOptionGroups??[],v={};for(const A of m){if(!A.is_required)continue;const _=A.values?.find(I=>I.is_default);_&&(v[A.id]=_.id)}const x=vc(v,m),M=g+x,w={id:c,optionId:h.id,options:p,optionValues:R0(h.option_values,h.option_values_localized),quantity:1,stock:h.stock_quantity??999,unitPrice:g,unitPriceFormatted:Gr(g,s),totalPrice:M,totalPriceFormatted:Gr(M,s),multiCurrencyUnitPrice:h.multi_currency_selling_price,multiCurrencyTotalPrice:eo(h.multi_currency_selling_price,1,x),additionalOptionSelections:v,additionalOptionsTotal:x},T=[...i,w];t.setState?.({selectedOptionItems:T,selectedTotalMultiCurrency:to(T),currentSelection:{},__mergeMode:"shallow"})}function rp(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((f,h)=>{if(h!==a)return f;const c=f?.unitPrice??0,i=f?.additionalOptionsTotal??0,u=(c+i)*s;return{...f,quantity:s,totalPrice:u,totalPriceFormatted:Gr(u,o),multiCurrencyTotalPrice:eo(f?.multiCurrencyUnitPrice,s,i)}});t.setState?.({selectedOptionItems:l,selectedTotalMultiCurrency:to(l)})}function np(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),f=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 g={...i.additionalOptionSelections??{}},p={...i.additionalOptionCustomTexts??{}};if(f){const w=String(r.customText??"");w.trim()===""?delete p[l]:p[l]=w}else h==null?(delete g[l],delete p[l]):(g[l]=h,(o??[]).find(A=>A.id===l)?.values?.find(A=>A.id===h)?.allow_custom_text||delete p[l]);const m=vc(g,o),v=i?.unitPrice??0,x=i?.quantity??1,M=(v+m)*x;return{...i,additionalOptionSelections:g,additionalOptionCustomTexts:p,additionalOptionsTotal:m,totalPrice:M,totalPriceFormatted:Gr(M,a),multiCurrencyTotalPrice:eo(i?.multiCurrencyUnitPrice,x,m)}});t.setState?.({selectedOptionItems:c,selectedTotalMultiCurrency:to(c)})}function op(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:to(o)})}function ap(e,t){const r=e.params;if(!r)return;const n=Math.max(1,Number(r.newQuantity)||1);t.setState?.({noOptionQuantity:n,noOptionTotalMultiCurrency:eo(r.multiCurrencyUnitPrice,n)})}const gn=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 pr(e){const t=window.G7Core;t?.state?.setLocal?(t.state.setLocal(e),gn.log("Local state updated:",e)):gn.warn("G7Core.state.setLocal not available")}function wc(){return window.G7Core?.state?.getLocal?.()||{}}function sp(){return window.G7Core?.state?.get?.()||{}}function lp(e,t="info"){const r=window.G7Core;r?.toast?.show?r.toast.show(e,t):gn.warn("G7Core.toast.show not available, message:",e)}function ip(e){const t=window.G7Core;return t?.t?t.t(e):e}function xc(){const e=window.G7Core;if(e?.dispatch){const r=wc().selectedItems||[];e.dispatch({handler:"refetchDataSource",params:{dataSourceId:"cartItems"}}),gn.log("Refetching cartItems with selected_ids:",r)}else gn.warn("G7Core.dispatch not available")}function cp(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=sp().cartItems?.data?.items||[],f=l.length>0&&a.length===l.length;pr({selectedItems:a,allSelected:f,selectedCount:a.length}),xc()}function dp(e,t){const{allItemIds:r,isSelected:n}=e?.params||{};pr({selectedItems:n?r:[],allSelected:n,selectedCount:n?r.length:0}),xc()}function up(e,t){const{optionName:r,optionValue:n}=e?.params||{},a=wc().selectedOptions||{};pr({selectedOptions:{...a,[r]:n}})}function fp(e,t){const{targetIds:r}=e?.params||{};if(!r||r.length===0){lp(ip("shop.cart.select_items_to_delete"),"warning");return}pr({deleteModal:{visible:!0,targetIds:r}})}function gp(e,t){const{targetItem:r}=e?.params||{};pr({optionModal:{visible:!0,targetItem:r},selectedOptions:r?.options||{},selectedQuantity:r?.quantity})}function hp(e,t){const{selectedItems:r}=e?.params||{};if(!r||r.length===0){pr({isCalculating:!1});return}pr({isCalculating:!0})}const mr=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 Oa(e){return e.name_localized?e.name_localized:typeof e.name=="string"?e.name:e.name?.ko??""}function pp(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 kc(e,t,r){return!e||!t?.length?null:t.every(a=>{const s=Oa(a);return e[s]})?r?.find(a=>t.every(s=>{const l=Oa(s);return pp(a.option_values,a.option_values_localized,l)===e[l]}))||null:(mr.log("Not all options selected yet"),null)}function mp(e,t){const{selectedOptions:r,optionGroups:n,options:o}=e?.params||{};mr.log("findMatchingOption called:",{selectedOptions:r,optionGroups:n,optionsCount:o?.length});const a=kc(r,n,o);return mr.log("Matched option:",a),{matchedOption:a}}function bp(e,t){const{currentOptionValues:r,optionGroups:n,options:o}=e?.params||{};if(mr.log("initCartOptionSelection called:",{currentOptionValues:r,optionGroups:n,optionsCount:o?.length}),!n?.length||!r)return mr.log("No option groups or current values, returning empty"),{selectedOptions:{},matchedOption:null};const a={};for(const l of n){const f=Oa(l),h=r[f],c=l.values_localized??(Array.isArray(l.values)?l.values.map(i=>typeof i=="string"?i:i?.ko??""):[]);h&&c.includes(h)&&(a[f]=h)}mr.log("Initial selectedOptions:",a);const s=kc(a,n,o||[]);return mr.log("Matched option:",s),{selectedOptions:a,matchedOption:s}}const hn="g7_cart_key",yp="/api/modules/sirsoft-ecommerce/cart/key",Ia="g7_guest_order_token",Cc="g7_guest_order_number",Da="g7_guest_order_expires_at",ut=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 Sc(){try{const e=await fetch(yp,{method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"}});return e.ok?(await e.json()).data?.cart_key||null:(ut.error("Failed to issue cartKey from API:",e.status),null)}catch(e){return ut.error("Error issuing cartKey from API:",e),null}}function or(e){const t=window.G7Core;t?.state?.set?(t.state.set(e),ut.log("Global state updated:",e)):ut.warn("G7Core.state.set not available")}function vp(){try{const e=window.G7Config;return e?.user?e.user:(window.G7Core?.state?.get?.()||{}).currentUser||null}catch{return null}}async function wp(e,t){let r=null;try{r=localStorage.getItem(hn)}catch{}if(r)ut.log("Existing cartKey loaded:",r);else if(r=await Sc(),r)try{localStorage.setItem(hn,r),ut.log("New cartKey issued from API:",r)}catch{}else ut.error("Failed to issue cartKey from API");or({cartKey:r})}function xp(e,t){try{return localStorage.getItem(hn)}catch{return null}}function _c(e,t){try{localStorage.removeItem(hn),ut.log("cartKey removed from localStorage")}catch{}or({cartKey:null})}async function kp(e,t){if(vp()){_c();return}const n=await Sc();if(n){try{localStorage.setItem(hn,n),ut.log("New cartKey regenerated from API:",n)}catch{}or({cartKey:n})}else ut.error("Failed to regenerate cartKey from API")}function Cp(e,t){const{key:r,value:n}=e?.params||{};if(!r){ut.warn("saveToStorage: key is required");return}try{localStorage.setItem(r,n),ut.log("Saved to storage:",r,n)}catch{}}function Sp(e,t){const{key:r,defaultValue:n}=e?.params||{};if(!r)return ut.warn("loadFromStorage: key is required"),n||null;try{return localStorage.getItem(r)||n||null}catch{return n||null}}function La(){try{sessionStorage.removeItem(Ia),sessionStorage.removeItem(Cc),sessionStorage.removeItem(Da)}catch{}}function _p(e,t){let r=null,n=null;try{r=sessionStorage.getItem(Ia),n=sessionStorage.getItem(Da)}catch{}let o=!1;if(r){const a=n?new Date(n).getTime():NaN;(isNaN(a)||a<=Date.now())&&(La(),r=null,o=!0)}if(r){or({guestOrderToken:r}),ut.log("Guest order token loaded from sessionStorage");return}if(!o){const s=window.G7Core?.state?.get?.("_global")?.guestOrderToken;if(typeof s=="string"&&s!==""){ut.log("Guest order token preserved from in-memory _global (sessionStorage empty)");return}}or({guestOrderToken:null}),ut.log("No guest order token (visitor not authenticated)")}function Ep(e,t){const{token:r,orderNumber:n,expiresAt:o}=e?.params||{};if(!r||!n||!o){ut.warn("saveGuestOrderToken: token, orderNumber, expiresAt are required");return}try{sessionStorage.setItem(Ia,r),sessionStorage.setItem(Cc,n),sessionStorage.setItem(Da,o)}catch{}or({guestOrderToken:r})}function Tp(e,t){La(),or({guestOrderToken:null})}function Np(e,t){La(),or({guestOrderToken:null})}function Ap(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 f=`${n}_formatted`;return r[f]||String(r[n])}const Pa={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 Mp(e,t){const{value:r,currencyCode:n,locale:o}=e,a=n||t.getState("_global.preferredCurrency")||"KRW",s=Pa[a]||Pa.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 f=r.toLocaleString(void 0,{minimumFractionDigits:s.decimals,maximumFractionDigits:s.decimals});return`${s.symbol}${f}`}}function Op(e){return Pa[e]?.symbol||e}const Fa=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)},Ec="g7_preferred_currency",Ip="KRW";function Dp(e,t){const{defaultCurrency:r=Ip}=e;let n=r;try{if(typeof window<"u"&&window.localStorage){const o=localStorage.getItem(Ec);o&&Tc(o)&&(n=o)}}catch{Fa.warn("localStorage 접근 불가, 기본 통화 사용:",r)}return t.setState("global",{preferredCurrency:n}),n}function Lp(e,t){const{currencyCode:r}=e;if(!Tc(r)){Fa.warn("유효하지 않은 통화 코드:",r);return}try{typeof window<"u"&&window.localStorage&&localStorage.setItem(Ec,r)}catch{Fa.warn("localStorage 저장 실패")}t.setState("global",{preferredCurrency:r})}function Tc(e){return typeof e=="string"&&/^[A-Z]{3}$/.test(e)}const jr=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)},$a=["auto","light","dark"],Nc="g7_color_scheme",Pp=e=>e==="auto"?window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light":e,no=e=>{const t=Pp(e);document.documentElement.setAttribute("data-theme",t),t==="dark"?document.documentElement.classList.add("dark"):document.documentElement.classList.remove("dark")};function Fp(){try{const e=localStorage.getItem(Nc),t=e&&$a.includes(e)?e:"auto";no(t),jr.log("Initial theme applied:",t)}catch(e){jr.warn("Failed to load initial theme:",e),no("auto")}}async function $p(e,t){const r=e?.target;if(r&&typeof r=="string"&&$a.includes(r)){no(r);return}Fp()}async function Up(e,t){let r;if(e?.target&&typeof e.target=="string"&&!e.target.includes("{{")&&(r=e.target),!r||typeof r!="string"){jr.warn("Invalid theme:",r);return}if(!$a.includes(r)){jr.warn("Unsupported theme:",r);return}const n=r;try{localStorage.setItem(Nc,n)}catch(o){jr.error("Failed to save theme to localStorage:",o);return}no(n),jr.log("Theme changed to:",n)}const zp=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 Hp(e,t){const r=window.G7Core;if(!r?.dispatch){zp.error("G7Core.dispatch 가 초기화되지 않아 로그인 리다이렉트를 실행할 수 없습니다.");return}const n=window.location.pathname+window.location.search;await r.dispatch({handler:"navigate",params:{path:"/login",query:{redirect:n}}})}const Ua=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 Gp(e,t){const r=window.G7Core,{url:n,filename:o}=e?.params||{};if(!n){Ua.warn("다운로드 URL 이 없어 요청을 건너뜁니다.");return}if(!r?.api?.get){Ua.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){Ua.error("첨부파일 다운로드 실패",a),r?.toast?.error?.(r?.t?.("common.download_failed")??"Download failed")}}const oo={"sirsoft-basic.addSelectedItemIfComplete":tp,"sirsoft-basic.updateSelectedItemQuantity":rp,"sirsoft-basic.removeSelectedItem":op,"sirsoft-basic.updateNoOptionQuantity":ap,"sirsoft-basic.setBlockAdditionalOption":np,"sirsoft-basic.getDisplayPrice":Ap,"sirsoft-basic.formatCurrency":Mp,"sirsoft-basic.getCurrencySymbol":Op,"sirsoft-basic.loadPreferredCurrency":Dp,"sirsoft-basic.savePreferredCurrency":Lp,setTheme:Up,initTheme:$p,redirectToLoginWithReturn:Hp,downloadAttachment:Gp,toggleCartItemSelection:cp,selectAllCartItems:dp,setCartOption:up,openCartDeleteModal:fp,openCartOptionModal:gp,recalculateCart:hp,findMatchingOption:mp,initCartOptionSelection:bp,initCartKey:wp,getCartKey:xp,clearCartKey:_c,regenerateCartKey:kp,saveToStorage:Cp,loadFromStorage:Sp,initGuestOrderToken:_p,saveGuestOrderToken:Ep,clearGuestOrderToken:Tp,clearGuestTokenOnEntry:Np},pn=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 jp(e){const t=window.G7Core,r=t?.state?.getLocal?.()??{},n=t?.state?.getGlobal?.()??t?.state?.get?.()??{},o=(...f)=>f.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 Bp(){const t=window.G7Core?.api?.getToken?.()??null;return t?{Authorization:`Bearer ${t}`}:{}}function Wp(){try{const e=typeof window<"u"?window.localStorage?.getItem("g7_locale"):null;return e?{"Accept-Language":e}:{}}catch{return{}}}async function Kp(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",...Wp(),...Bp()},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 Vp(e){const t=window.G7Core,r=t?.identity;if(!t?.dispatch||!t?.state||!r)return pn.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=jp(e);let o;try{o=await Kp(e,n)}catch(p){pn.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 f=a,h=0;const c=window.setInterval(()=>{const p=f>0?Math.max(0,Math.floor((f-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!==f&&(f=x)}const v=p?.identityChallenge?.resendCooldown;typeof v=="number"&&v>h&&(h=v)})??null}catch{}const u=r.createDeferred();try{await t.dispatch({handler:"openModal",target:"identity-challenge-modal"})}catch(p){return pn.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 g=await u;return window.clearInterval(c),i?.(),g}function Yp(){const e=window.G7Core?.identity;if(!e?.setLauncher){pn.warn("G7Core.identity 가 아직 초기화되지 않아 launcher 등록을 건너뜁니다. 코어 부트스트랩 순서를 확인하세요.");return}e.setLauncher(Vp),pn.log("IDV launcher registered (sirsoft-basic)")}function Xp(e){const t=e.icons;return Array.isArray(t)?t.filter(r=>!!r&&typeof r=="object"&&typeof r.value=="string"):[]}function Zp(e,t){const r=e.label;return typeof r=="string"?r.startsWith("$t:")?t(r.slice(3)):r:e.value}function qp(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 Qp({entry:e}){const t=e.preview;return t?.html?d.jsx("span",{className:"g7le-icon-preview",dangerouslySetInnerHTML:{__html:t.html},style:Ha}):t?.className?d.jsx("span",{className:`g7le-icon-preview ${t.className}`,style:Ha}):d.jsx("i",{className:`fas fa-${e.value}`,style:Ha,"aria-hidden":"true"})}function Jp({control:e,value:t,onChange:r,t:n}){const o=Xp(e),a=t==null?"":String(t),s=typeof e.iconColumns=="number"?e.iconColumns:6,l=e.iconSearchPlaceholder,f=typeof l=="string"&&l.startsWith("$t:")?n(l.slice(3)):n("layout_editor.icon_picker.search_placeholder"),[h,c]=C.useState("");if(o.length===0)return d.jsx("div",{className:"g7le-widget g7le-widget--icon-picker","data-testid":"g7le-widget-icon-picker",style:Ac,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:g=>r(g.target.value===""?void 0:g.target.value),style:Mc})});const i=g=>Zp(g,n),u=o.filter(g=>qp(g,i(g),h));return d.jsxs("div",{className:"g7le-widget g7le-widget--icon-picker","data-testid":"g7le-widget-icon-picker",style:Ac,children:[d.jsx("input",{type:"text",className:"g7le-widget g7le-widget--icon-search","data-testid":"g7le-widget-icon-picker-search",value:h,placeholder:f,onChange:g=>c(g.target.value),style:Mc}),d.jsxs("div",{className:"g7le-icon-grid","data-testid":"g7le-widget-icon-picker-grid",style:{...Rp,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===""?Oc:za,children:d.jsx("span",{style:em,children:"—"})}),u.map(g=>{const p=g.value===a;return d.jsx("button",{type:"button","data-testid":`g7le-icon-cell-${g.value}`,title:i(g),"aria-pressed":p,onClick:()=>r(g.value),style:p?Oc:za,children:d.jsx(Qp,{entry:g})},g.value)})]}),u.length===0&&d.jsx("div",{"data-testid":"g7le-widget-icon-picker-empty",style:tm,children:n("layout_editor.icon_picker.no_results")})]})}const Ac={display:"flex",flexDirection:"column",gap:6,width:"100%"},Mc={padding:"5px 8px",fontSize:12,border:"1px solid #cbd5e1",borderRadius:6,width:"100%"},Rp={display:"grid",gap:4,maxHeight:220,overflowY:"auto",padding:2},za={display:"flex",alignItems:"center",justifyContent:"center",minHeight:34,padding:4,border:"1px solid #e2e8f0",borderRadius:6,background:"#fff",cursor:"pointer"},Oc={...za,border:"2px solid #2563eb",background:"#eff6ff"},Ha={display:"inline-flex",alignItems:"center",justifyContent:"center",fontSize:16,lineHeight:1},em={fontSize:10,color:"#475569",fontFamily:"monospace",overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",maxWidth:"100%"},tm={fontSize:11,color:"#94a3b8",fontStyle:"italic",padding:"4px 2px"},Ic=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 rm(){if(typeof window>"u")return;const e=window.G7Core?.layoutEditor;if(!e?.registerWidget){Ic.warn("G7Core.layoutEditor 미노출 — icon-picker 위젯 등록 보류");return}e.registerWidget("icon-picker",Jp),Ic.log("편집기 위젯 'icon-picker' 등록됨(Font Awesome 검색 그리드)")}const Ga=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=oo);function Dc(){if(typeof window<"u"){let e=0;const t=50,r=()=>{const n=window.G7Core?.getActionDispatcher?.();n?(Object.entries(oo).forEach(([o,a])=>{n.registerHandler(o,a)}),Ga.log(`${Object.keys(oo).length} custom handler(s) registered:`,Object.keys(oo)),Yp()):(e++,e<=t?(Ga.warn(`ActionDispatcher not found, retrying... (${e}/${t})`),setTimeout(r,100)):Ga.error("Failed to register handlers: ActionDispatcher not available after maximum retries"))};document.readyState==="complete"?r():window.addEventListener("load",r)}}return rm(),Dc(),J.A=co,J.Avatar=Kr,J.AvatarUploader=Aa,J.Button=Q,J.Checkbox=Ja,J.Code=nd,J.ConfirmDialog=ta,J.Container=V0,J.Div=W,J.ExpandableContent=Jo,J.FileInput=Va,J.FileUploader=Qn,J.Flex=X0,J.Footer=as,J.Form=uo,J.Grid=Y0,J.H1=Kc,J.H2=Za,J.H3=bn,J.H4=qa,J.Header=ns,J.Hr=fo,J.HtmlContent=Zo,J.HtmlEditor=Wl,J.Icon=fe,J.IconName=Re,J.ImageGallery=Lr,J.Img=Ht,J.Input=_t,J.Label=vr,J.Li=Qt,J.MobileNav=ss,J.Modal=Ro,J.Nav=Wr,J.NotificationCenter=wn,J.Ol=Vc,J.Optgroup=qc,J.Option=Zc,J.P=zt,J.PageLoading=dc,J.PageSkeleton=Na,J.PageTransitionBlur=_a,J.PageTransitionIndicator=Sa,J.Pagination=uc,J.PasswordInput=Xa,J.PostReactions=jl,J.ProductCard=Ss,J.ProductImageViewer=In,J.QuantitySelector=Hl,J.RichTextEditor=Bl,J.SearchBar=gc,J.Section=Ra,J.SectionLayout=Z0,J.Select=Qa,J.SlotContainer=vn,J.SocialLoginButtons=tc,J.Span=re,J.Svg=mn,J.TabNavigation=bc,J.Table=Qc,J.Tbody=Rc,J.Td=rd,J.Textarea=lo,J.Th=td,J.Thead=Jc,J.ThemeToggle=yn,J.ThreeColumnLayout=q0,J.Toast=Ca,J.Tr=ed,J.Ul=io,J.UserInfo=mc,J.availablePasswordRules=so,J.compositeComponents=K0,J.defaultPasswordRules=Ya,J.initTemplate=Dc,J.templateMetadata=Q0,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 d1e8fc9b..5c18e76e 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 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 navigate(`${base}/products/${product.id}`);\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 = maxFiles - totalCount;\n const filesToAdd = Array.from(selectedFiles).slice(0, remainingSlots);\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
\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","_arrayLikeToArray","r","a","_arrayWithHoles","_iterableToArrayLimit","l","i","u","o","_nonIterableRest","_slicedToArray","_unsupportedIterableToArray","setPrototypeOf","isFrozen","getPrototypeOf","getOwnPropertyDescriptor","freeze","seal","create","_ref","apply","construct","x","func","thisArg","_len","_key","Func","_len2","_key2","arrayForEach","unapply","arrayLastIndexOf","arrayPop","arrayPush","arraySplice","arrayIsArray","stringToLowerCase","stringToString","stringMatch","stringReplace","stringIndexOf","stringTrim","numberToString","booleanToString","bigintToString","symbolToString","objectHasOwnProperty","objectToString","regExpTest","typeErrorCreate","unconstruct","_len3","_key3","_len4","_key4","addToSet","set","array","transformCaseFunc","element","lcElement","cleanArray","clone","object","newObject","_ref2","_ref3","property","stringifyValue","valueAsRecord","valueToString","lookupGetter","stringified","prop","desc","fallbackValue","isRegex","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","NODE_TYPE","getGlobal","_createTrustedTypesPolicy","trustedTypes","purifyHostElement","suffix","ATTR_NAME","policyName","scriptUrl","_createHooksMap","createDOMPurify","window","DOMPurify","root","document","originalDocument","currentScript","DocumentFragment","HTMLTemplateElement","Node","Element","NodeFilter","_window$NamedNodeMap","NamedNodeMap","HTMLFormElement","DOMParser","ElementPrototype","cloneNode","remove","getNextSibling","getChildNodes","getParentNode","template","trustedTypesPolicy","emptyHTML","_document","implementation","createNodeIterator","createDocumentFragment","getElementsByTagName","importNode","hooks","MUSTACHE_EXPR$1","ERB_EXPR$1","TMPLIT_EXPR$1","DATA_ATTR$1","ARIA_ATTR$1","IS_SCRIPT_OR_DATA$1","ATTR_WHITESPACE$1","CUSTOM_ELEMENT$1","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","customElementHandling","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","childClone","expr","_isValidAttribute","lcTag","lcName","nameIsPermitted","RESERVED_CUSTOM_ELEMENT_NAMES","_sanitizeAttributes","attributes","hookEvent","attr","namespaceURI","attrValue","initValue","_sanitizeShadowDOM2","fragment","shadowNode","shadowIterator","_sanitizeAttachedShadowRoots2","sr","snapshot","child","importedNode","returnNode","nn","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","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","prevSlides","setPrevSlides","prevIndex","setPrevIndex","RTLContext","useRTLContext","RTLContextProvider","isRTL","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","_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","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","b","estimateActualWidth","sizes","imagePropsStyle","imagePropsClassName","restImageProps","LightboxRoot","setIsRTL","trackFocusWithin","detectRTL","rtl","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","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","containerClassName","containerStyle","containerRest","mounted","setMounted","visible","setVisible","restoreFocus","animationDuration","handleEnter","handleRef","PortalModule","Root","RootModule","cssPrefix","Toolbar","buttonClose","iconClose","renderCloseButton","ToolbarModule","renderNode","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","resolveMaxZoom","maxZoom","resolved","useZoomImageRect","imageDimensions","imageRect","maxImageRect","maxZoomPixelRatio","maxZoomInProps","height","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","isImage","measure","wrapper","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","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","s","f","c","UZIP","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","SELECTOR","findFirstFocusableNode","hiddenStyles","HiddenText","LiveRegion","announcement","ariaLiveType","visuallyHidden","useAnnouncement","setAnnouncement","DndMonitorContext","useDndMonitor","registerListener","useDndMonitorProvider","_listener$type","defaultScreenReaderInstructions","defaultAnnouncements","_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","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","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/lang/partial/en/attachment.json b/templates/_bundled/sirsoft-basic/lang/partial/en/attachment.json index 555e5069..cf7fbba0 100644 --- a/templates/_bundled/sirsoft-basic/lang/partial/en/attachment.json +++ b/templates/_bundled/sirsoft-basic/lang/partial/en/attachment.json @@ -5,6 +5,7 @@ "delete_confirm_message": "Are you sure you want to delete this file?", "deleting": "Deleting...", "attached_count": "{{count}}/{{max}} attached", + "upload_limit_exceeded": "You can attach up to {{max}} files.", "max_size": "Max {{size}}MB", "reorder_failed": "Failed to reorder files", "drag_to_reorder": "Drag to reorder", diff --git a/templates/_bundled/sirsoft-basic/lang/partial/en/user.json b/templates/_bundled/sirsoft-basic/lang/partial/en/user.json index 0974e432..80253786 100644 --- a/templates/_bundled/sirsoft-basic/lang/partial/en/user.json +++ b/templates/_bundled/sirsoft-basic/lang/partial/en/user.json @@ -51,7 +51,8 @@ "published_at": "Published", "create_page": "Create Page", "attachments": "Attachments", - "download": "Download" + "download": "Download", + "preview_banner": "Previewing an unpublished page" }, "mypage": { "page_title": "My Page", diff --git a/templates/_bundled/sirsoft-basic/lang/partial/ko/attachment.json b/templates/_bundled/sirsoft-basic/lang/partial/ko/attachment.json index 83a46eca..4cbd01de 100644 --- a/templates/_bundled/sirsoft-basic/lang/partial/ko/attachment.json +++ b/templates/_bundled/sirsoft-basic/lang/partial/ko/attachment.json @@ -5,6 +5,7 @@ "delete_confirm_message": "이 파일을 삭제하시겠습니까?", "deleting": "삭제 중...", "attached_count": "{{count}}/{{max}}개 첨부됨", + "upload_limit_exceeded": "최대 {{max}}개까지 첨부할 수 있습니다.", "max_size": "최대 {{size}}MB", "reorder_failed": "파일 순서 변경에 실패했습니다", "drag_to_reorder": "드래그하여 순서 변경", diff --git a/templates/_bundled/sirsoft-basic/lang/partial/ko/user.json b/templates/_bundled/sirsoft-basic/lang/partial/ko/user.json index 084284a5..0a0366be 100644 --- a/templates/_bundled/sirsoft-basic/lang/partial/ko/user.json +++ b/templates/_bundled/sirsoft-basic/lang/partial/ko/user.json @@ -51,7 +51,8 @@ "published_at": "발행일", "create_page": "페이지 생성", "attachments": "첨부파일", - "download": "다운로드" + "download": "다운로드", + "preview_banner": "미발행 페이지 미리보기 중입니다" }, "mypage": { "page_title": "마이페이지", diff --git a/templates/_bundled/sirsoft-basic/layouts/page/show.json b/templates/_bundled/sirsoft-basic/layouts/page/show.json index 4e9234b9..0aaa25ce 100644 --- a/templates/_bundled/sirsoft-basic/layouts/page/show.json +++ b/templates/_bundled/sirsoft-basic/layouts/page/show.json @@ -80,6 +80,30 @@ } }, "children": [ + { + "id": "page_preview_banner", + "type": "basic", + "name": "Div", + "if": "{{page?.data?.is_preview}}", + "props": { + "className": "flex items-center gap-2 mb-4 px-4 py-3 rounded-md bg-amber-100 dark:bg-amber-900/30 text-amber-800 dark:text-amber-400 text-sm" + }, + "children": [ + { + "type": "basic", + "name": "Icon", + "props": { + "name": "eye", + "className": "text-amber-600 dark:text-amber-400 text-sm" + } + }, + { + "type": "basic", + "name": "Span", + "text": "$t:user.page.preview_banner" + } + ] + }, { "type": "basic", "name": "Div", @@ -252,10 +276,32 @@ }, "children": [ { + "comment": "이미지 썸네일 (이미지 파일인 경우) - preview_url 공개 서빙", + "type": "basic", + "name": "Div", + "if": "{{att_item.is_image}}", + "props": { + "className": "flex-shrink-0 w-10 h-10 rounded overflow-hidden bg-gray-100 dark:bg-gray-800" + }, + "children": [ + { + "type": "basic", + "name": "Img", + "props": { + "src": "{{att_item.preview_url}}", + "alt": "{{att_item.original_filename}}", + "className": "w-full h-full object-cover" + } + } + ] + }, + { + "comment": "파일 아이콘 (일반 파일인 경우)", "type": "basic", "name": "Icon", + "if": "{{!att_item.is_image}}", "props": { - "name": "{{att_item.is_image ? 'image' : 'file'}}", + "name": "file", "className": "text-gray-400 text-sm flex-shrink-0" } }, @@ -271,11 +317,21 @@ }, { "type": "basic", - "name": "A", + "name": "Button", "props": { - "href": "{{att_item.download_url}}", - "className": "flex items-center gap-1.5 px-3 py-1.5 text-sm text-blue-600 dark:text-blue-400 hover:underline flex-shrink-0 no-underline" + "type": "button", + "className": "flex items-center gap-1.5 px-3 py-1.5 text-sm text-blue-600 dark:text-blue-400 hover:underline flex-shrink-0 bg-transparent border-0 cursor-pointer" }, + "actions": [ + { + "type": "click", + "handler": "downloadAttachment", + "params": { + "url": "{{att_item.download_url}}", + "filename": "{{att_item.original_filename}}" + } + } + ], "children": [ { "type": "basic", diff --git a/templates/_bundled/sirsoft-basic/package-lock.json b/templates/_bundled/sirsoft-basic/package-lock.json index 79da9e6f..7156c020 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.0", + "version": "1.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "sirsoft-basic", - "version": "1.0.0", + "version": "1.0.1", "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 e0f6dea7..e2a065a7 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.0", + "version": "1.0.1", "description": "Gnuboard7 Basic User Template Components - Nexibase Style", "type": "module", "main": "dist/components.js", diff --git a/templates/_bundled/sirsoft-basic/src/components/composite/FileUploader/useFileUploader.ts b/templates/_bundled/sirsoft-basic/src/components/composite/FileUploader/useFileUploader.ts index 57b1f40e..e4aec392 100644 --- a/templates/_bundled/sirsoft-basic/src/components/composite/FileUploader/useFileUploader.ts +++ b/templates/_bundled/sirsoft-basic/src/components/composite/FileUploader/useFileUploader.ts @@ -207,9 +207,17 @@ export function useFileUploader(options: UseFileUploaderOptions): UseFileUploade const handleFiles = useCallback( async (selectedFiles: FileList) => { const totalCount = existingFiles.length + pendingFiles.length; - const remainingSlots = maxFiles - totalCount; + const remainingSlots = Math.max(0, maxFiles - totalCount); const filesToAdd = Array.from(selectedFiles).slice(0, remainingSlots); + // 개수 상한 초과분은 조용히 절단하지 않고 안내 (개수 초과 silent 무시 방지) + if (selectedFiles.length > remainingSlots) { + const overflow = Array.from(selectedFiles).slice(remainingSlots); + const message = t('attachment.upload_limit_exceeded', { max: maxFiles }); + // 잘린 첫 파일을 대표로 콜백에 전달 (없으면 무시) + onUploadError?.(message, overflow[0] ?? selectedFiles[0]); + } + for (const file of filesToAdd) { // 크기 검증 if (file.size > maxSize * 1024 * 1024) { diff --git a/templates/_bundled/sirsoft-basic/src/components/composite/__tests__/FileUploaderLimit.test.ts b/templates/_bundled/sirsoft-basic/src/components/composite/__tests__/FileUploaderLimit.test.ts new file mode 100644 index 00000000..1d4a0612 --- /dev/null +++ b/templates/_bundled/sirsoft-basic/src/components/composite/__tests__/FileUploaderLimit.test.ts @@ -0,0 +1,135 @@ +/** + * FileUploader 개수 상한 초과 안내 테스트 + * + * maxFiles 를 초과해 파일을 선택하면 초과분을 조용히 버리지 않고 + * onUploadError 콜백으로 안내한다. (admin_basic 과 동일 동작 — 공통 문구) + * + * @vitest-environment jsdom + * @module composite/__tests__/FileUploaderLimit.test + */ + +import { describe, it, expect, vi, beforeEach } from 'vitest'; +import { act, renderHook } from '@testing-library/react'; +import { useFileUploader } from '../FileUploader/useFileUploader'; +import type { Attachment } from '../FileUploader/types'; + +// G7Core 모킹 (useFileUploader 가 모듈 스코프에서 window.G7Core 를 캐싱하므로 +// 새 객체로 교체하지 않고 기존 객체에 프로퍼티를 직접 추가) +beforeEach(() => { + const listeners = new Map>(); + + if (!(window as any).G7Core) { + (window as any).G7Core = {}; + } + const g7 = (window as any).G7Core; + + g7.componentEvent = { + on: vi.fn((event: string, callback: Function) => { + if (!listeners.has(event)) { + listeners.set(event, new Set()); + } + listeners.get(event)!.add(callback); + return () => { + listeners.get(event)?.delete(callback); + }; + }), + emit: vi.fn(), + }; + g7.createLogger = vi.fn(() => ({ + log: vi.fn(), + warn: vi.fn(), + error: vi.fn(), + })); +}); + +vi.mock('browser-image-compression', () => ({ + default: vi.fn((file: File) => Promise.resolve(file)), +})); + +URL.createObjectURL = vi.fn(() => 'blob:mock-url'); +URL.revokeObjectURL = vi.fn(); + +describe('FileUploader - 개수 상한 초과 안내 (useFileUploader 훅)', () => { + const defaultEndpoints = { + upload: '/api/attachments', + delete: '/api/attachments/:id', + reorder: '/api/attachments/reorder', + }; + + const STABLE_EMPTY_FILES: Attachment[] = []; + const STABLE_EMPTY_ROLE_IDS: number[] = []; + + function makeFileList(files: File[]): FileList { + return { + ...files, + length: files.length, + item: (i: number) => files[i] ?? null, + } as unknown as FileList; + } + + it('maxFiles 초과 시 onUploadError 로 안내하고 상한까지만 추가한다', async () => { + const onUploadError = vi.fn(); + + const { result } = renderHook(() => + useFileUploader({ + collection: 'test', + maxFiles: 2, + maxSize: 10, + maxConcurrentUploads: 3, + roleIds: STABLE_EMPTY_ROLE_IDS, + autoUpload: false, + initialFiles: STABLE_EMPTY_FILES, + confirmBeforeRemove: false, + onUploadError, + endpoints: defaultEndpoints, + }) + ); + + // 상한(2)보다 많은 3개 선택 + const files = [ + new File(['1'], 'a.png', { type: 'image/png' }), + new File(['2'], 'b.png', { type: 'image/png' }), + new File(['3'], 'c.png', { type: 'image/png' }), + ]; + + await act(async () => { + await result.current.handleFiles(makeFileList(files)); + }); + + // 초과 안내 콜백 1회 (조용히 버리지 않음) + expect(onUploadError).toHaveBeenCalledTimes(1); + // 상한까지만 추가 (2개) + expect(result.current.pendingFiles).toHaveLength(2); + }); + + it('상한 이내로 선택하면 onUploadError 를 발화하지 않는다 (오발화 없음)', async () => { + const onUploadError = vi.fn(); + + const { result } = renderHook(() => + useFileUploader({ + collection: 'test', + maxFiles: 5, + maxSize: 10, + maxConcurrentUploads: 3, + roleIds: STABLE_EMPTY_ROLE_IDS, + autoUpload: false, + initialFiles: STABLE_EMPTY_FILES, + confirmBeforeRemove: false, + onUploadError, + endpoints: defaultEndpoints, + }) + ); + + const files = [ + new File(['1'], 'a.png', { type: 'image/png' }), + new File(['2'], 'b.png', { type: 'image/png' }), + ]; + + await act(async () => { + await result.current.handleFiles(makeFileList(files)); + }); + + expect(onUploadError).not.toHaveBeenCalled(); + expect(result.current.pendingFiles).toHaveLength(2); + }); +}); diff --git a/templates/_bundled/sirsoft-basic/template.json b/templates/_bundled/sirsoft-basic/template.json index 4f7acf10..9ece8403 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.0", + "version": "1.0.1", "license": "MIT", "description": { "ko": "그누보드7 기본 사용자 템플릿",
\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// 게시판 첨부 다운로드 핸들러 (토큰 동반 → 활동이력 행위자 기록, #413 item 58b)\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 // 게시판 첨부 다운로드 (토큰 동반 → 활동이력 행위자 기록, #413 item 58b)\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","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","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.4.3 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.4.3/LICENSE */\n\nfunction _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 _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 _slicedToArray(r, e) {\n return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest();\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\nconst entries = Object.entries,\n setPrototypeOf = Object.setPrototypeOf,\n isFrozen = Object.isFrozen,\n getPrototypeOf = Object.getPrototypeOf,\n getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nlet freeze = Object.freeze,\n seal = Object.seal,\n create = Object.create; // eslint-disable-line import/no-mutable-exports\nlet _ref = typeof Reflect !== 'undefined' && Reflect,\n apply = _ref.apply,\n construct = _ref.construct;\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 arrayIsArray = Array.isArray;\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 numberToString = unapply(Number.prototype.toString);\nconst booleanToString = unapply(Boolean.prototype.toString);\nconst bigintToString = typeof BigInt === 'undefined' ? null : unapply(BigInt.prototype.toString);\nconst symbolToString = typeof Symbol === 'undefined' ? null : unapply(Symbol.prototype.toString);\nconst objectHasOwnProperty = unapply(Object.prototype.hasOwnProperty);\nconst objectToString = unapply(Object.prototype.toString);\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 if (!arrayIsArray(array)) {\n return set;\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 _ref2 of entries(object)) {\n var _ref3 = _slicedToArray(_ref2, 2);\n const property = _ref3[0];\n const value = _ref3[1];\n const isPropertyExist = objectHasOwnProperty(object, property);\n if (isPropertyExist) {\n if (arrayIsArray(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 * Convert non-node values into strings without depending on direct property access.\n *\n * @param value - The value to stringify.\n * @returns A string representation of the provided value.\n */\nfunction stringifyValue(value) {\n switch (typeof value) {\n case 'string':\n {\n return value;\n }\n case 'number':\n {\n return numberToString(value);\n }\n case 'boolean':\n {\n return booleanToString(value);\n }\n case 'bigint':\n {\n return bigintToString ? bigintToString(value) : '0';\n }\n case 'symbol':\n {\n return symbolToString ? symbolToString(value) : 'Symbol()';\n }\n case 'undefined':\n {\n return objectToString(value);\n }\n case 'function':\n case 'object':\n {\n if (value === null) {\n return objectToString(value);\n }\n const valueAsRecord = value;\n const valueToString = lookupGetter(valueAsRecord, 'toString');\n if (typeof valueToString === 'function') {\n const stringified = valueToString(valueAsRecord);\n return typeof stringified === 'string' ? stringified : objectToString(stringified);\n }\n return objectToString(value);\n }\n default:\n {\n return objectToString(value);\n }\n }\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}\nfunction isRegex(value) {\n try {\n regExpTest(value, '');\n return true;\n } catch (_unused) {\n return false;\n }\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']);\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', 'columnalign', 'columnlines', 'columnspacing', 'columnspan', 'denomalign', 'depth', 'dir', 'display', 'displaystyle', 'encoding', 'fence', 'frame', 'height', 'href', 'id', 'largeop', 'length', 'linethickness', 'lquote', 'lspace', '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\nconst MUSTACHE_EXPR = seal(/{{[\\w\\W]*|^[\\w\\W]*}}/g);\nconst ERB_EXPR = seal(/<%[\\w\\W]*|^[\\w\\W]*%>/g);\nconst TMPLIT_EXPR = seal(/\\${[\\w\\W]*/g);\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\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 text: 3,\n // Deprecated\n progressingInstruction: 7,\n comment: 8,\n document: 9};\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.4.3';\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 document = window.document;\n const originalDocument = document;\n const currentScript = originalDocument.currentScript;\n const DocumentFragment = window.DocumentFragment,\n HTMLTemplateElement = window.HTMLTemplateElement,\n Node = window.Node,\n Element = window.Element,\n NodeFilter = window.NodeFilter,\n _window$NamedNodeMap = window.NamedNodeMap,\n NamedNodeMap = _window$NamedNodeMap === void 0 ? window.NamedNodeMap || window.MozNamedAttrMap : _window$NamedNodeMap,\n HTMLFormElement = window.HTMLFormElement,\n DOMParser = window.DOMParser,\n trustedTypes = window.trustedTypes;\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 _document = document,\n implementation = _document.implementation,\n createNodeIterator = _document.createNodeIterator,\n createDocumentFragment = _document.createDocumentFragment,\n getElementsByTagName = _document.getElementsByTagName;\n const importNode = originalDocument.importNode;\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 MUSTACHE_EXPR$1 = MUSTACHE_EXPR,\n ERB_EXPR$1 = ERB_EXPR,\n TMPLIT_EXPR$1 = TMPLIT_EXPR,\n DATA_ATTR$1 = DATA_ATTR,\n ARIA_ATTR$1 = ARIA_ATTR,\n IS_SCRIPT_OR_DATA$1 = IS_SCRIPT_OR_DATA,\n ATTR_WHITESPACE$1 = ATTR_WHITESPACE,\n CUSTOM_ELEMENT$1 = CUSTOM_ELEMENT;\n let IS_ALLOWED_URI$1 = IS_ALLOWED_URI;\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') && arrayIsArray(cfg.ALLOWED_TAGS) ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc) : DEFAULT_ALLOWED_TAGS;\n ALLOWED_ATTR = objectHasOwnProperty(cfg, 'ALLOWED_ATTR') && arrayIsArray(cfg.ALLOWED_ATTR) ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc) : DEFAULT_ALLOWED_ATTR;\n ALLOWED_NAMESPACES = objectHasOwnProperty(cfg, 'ALLOWED_NAMESPACES') && arrayIsArray(cfg.ALLOWED_NAMESPACES) ? addToSet({}, cfg.ALLOWED_NAMESPACES, stringToString) : DEFAULT_ALLOWED_NAMESPACES;\n URI_SAFE_ATTRIBUTES = objectHasOwnProperty(cfg, 'ADD_URI_SAFE_ATTR') && arrayIsArray(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') && arrayIsArray(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') && arrayIsArray(cfg.FORBID_CONTENTS) ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc) : DEFAULT_FORBID_CONTENTS;\n FORBID_TAGS = objectHasOwnProperty(cfg, 'FORBID_TAGS') && arrayIsArray(cfg.FORBID_TAGS) ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc) : clone({});\n FORBID_ATTR = objectHasOwnProperty(cfg, 'FORBID_ATTR') && arrayIsArray(cfg.FORBID_ATTR) ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc) : clone({});\n USE_PROFILES = objectHasOwnProperty(cfg, 'USE_PROFILES') ? cfg.USE_PROFILES && typeof cfg.USE_PROFILES === 'object' ? clone(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 = isRegex(cfg.ALLOWED_URI_REGEXP) ? cfg.ALLOWED_URI_REGEXP : IS_ALLOWED_URI; // Default regexp\n NAMESPACE = typeof cfg.NAMESPACE === 'string' ? cfg.NAMESPACE : HTML_NAMESPACE; // Default HTML namespace\n MATHML_TEXT_INTEGRATION_POINTS = objectHasOwnProperty(cfg, 'MATHML_TEXT_INTEGRATION_POINTS') && cfg.MATHML_TEXT_INTEGRATION_POINTS && typeof cfg.MATHML_TEXT_INTEGRATION_POINTS === 'object' ? clone(cfg.MATHML_TEXT_INTEGRATION_POINTS) : addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']); // Default built-in map\n HTML_INTEGRATION_POINTS = objectHasOwnProperty(cfg, 'HTML_INTEGRATION_POINTS') && cfg.HTML_INTEGRATION_POINTS && typeof cfg.HTML_INTEGRATION_POINTS === 'object' ? clone(cfg.HTML_INTEGRATION_POINTS) : addToSet({}, ['annotation-xml']); // Default built-in map\n const customElementHandling = objectHasOwnProperty(cfg, 'CUSTOM_ELEMENT_HANDLING') && cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING === 'object' ? clone(cfg.CUSTOM_ELEMENT_HANDLING) : create(null);\n CUSTOM_ELEMENT_HANDLING = create(null);\n if (objectHasOwnProperty(customElementHandling, 'tagNameCheck') && isRegexOrFunction(customElementHandling.tagNameCheck)) {\n CUSTOM_ELEMENT_HANDLING.tagNameCheck = customElementHandling.tagNameCheck; // Default undefined\n }\n if (objectHasOwnProperty(customElementHandling, 'attributeNameCheck') && isRegexOrFunction(customElementHandling.attributeNameCheck)) {\n CUSTOM_ELEMENT_HANDLING.attributeNameCheck = customElementHandling.attributeNameCheck; // Default undefined\n }\n if (objectHasOwnProperty(customElementHandling, 'allowCustomizedBuiltInElements') && typeof customElementHandling.allowCustomizedBuiltInElements === 'boolean') {\n CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = customElementHandling.allowCustomizedBuiltInElements; // Default undefined\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 = create(null);\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 /* Always reset function-based ADD_TAGS / ADD_ATTR checks to prevent\n * leaking across calls when switching from function to array config */\n EXTRA_ELEMENT_HANDLING.tagCheck = null;\n EXTRA_ELEMENT_HANDLING.attributeCheck = null;\n /* Merge configuration parameters */\n if (objectHasOwnProperty(cfg, 'ADD_TAGS')) {\n if (typeof cfg.ADD_TAGS === 'function') {\n EXTRA_ELEMENT_HANDLING.tagCheck = cfg.ADD_TAGS;\n } else if (arrayIsArray(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 }\n if (objectHasOwnProperty(cfg, 'ADD_ATTR')) {\n if (typeof cfg.ADD_ATTR === 'function') {\n EXTRA_ELEMENT_HANDLING.attributeCheck = cfg.ADD_ATTR;\n } else if (arrayIsArray(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 }\n if (objectHasOwnProperty(cfg, 'ADD_URI_SAFE_ATTR') && arrayIsArray(cfg.ADD_URI_SAFE_ATTR)) {\n addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);\n }\n if (objectHasOwnProperty(cfg, 'FORBID_CONTENTS') && arrayIsArray(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 (objectHasOwnProperty(cfg, 'ADD_FORBID_CONTENTS') && arrayIsArray(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 risky CSS construction leading to mXSS */\n if (SAFE_FOR_XML && currentNode.namespaceURI === HTML_NAMESPACE && tagName === 'style' && _isNode(currentNode.firstElementChild)) {\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 (FORBID_TAGS[tagName] || !(EXTRA_ELEMENT_HANDLING.tagCheck instanceof Function && EXTRA_ELEMENT_HANDLING.tagCheck(tagName)) && !ALLOWED_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 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$1, ERB_EXPR$1, TMPLIT_EXPR$1], 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 /* FORBID_ATTR must always win, even if ADD_ATTR predicate would allow it */\n if (FORBID_ATTR[lcName]) {\n return false;\n }\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 const nameIsPermitted = ALLOWED_ATTR[lcName] || EXTRA_ELEMENT_HANDLING.attributeCheck instanceof Function && EXTRA_ELEMENT_HANDLING.attributeCheck(lcName, lcTag);\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$1, lcName)) ; else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR$1, lcName)) ; else if (!nameIsPermitted || 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$1, ''))) ; 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$1, stringReplace(value, ATTR_WHITESPACE$1, ''))) ; else if (value) {\n return false;\n } else ;\n return true;\n };\n /* Names the HTML spec reserves from valid-custom-element-name; these must\n * never be treated as basic custom elements even when a permissive\n * CUSTOM_ELEMENT_HANDLING.tagNameCheck is configured. */\n const RESERVED_CUSTOM_ELEMENT_NAMES = addToSet({}, ['annotation-xml', 'color-profile', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'missing-glyph']);\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 !RESERVED_CUSTOM_ELEMENT_NAMES[stringToLowerCase(tagName)] && regExpTest(CUSTOM_ELEMENT$1, tagName);\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 attributes = currentNode.attributes;\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 name = attr.name,\n namespaceURI = attr.namespaceURI,\n attrValue = attr.value;\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') && stringIndexOf(value, SANITIZE_NAMED_PROPS_PREFIX) !== 0) {\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 // Else: already prefixed, leave the attribute alone — the prefix is\n // itself the clobbering protection, and re-applying it is incorrect.\n /* Work around a security issue with comments inside attributes */\n if (SAFE_FOR_XML && regExpTest(/((--!?|])>)|<\\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/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$1, ERB_EXPR$1, TMPLIT_EXPR$1], 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 _sanitizeShadowDOM2 = 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 _sanitizeShadowDOM2(shadowNode.content);\n }\n }\n /* Execute a hook if present */\n _executeHooks(hooks.afterSanitizeShadowDOM, fragment, null);\n };\n /**\n * _sanitizeAttachedShadowRoots\n *\n * Walks `root` and feeds every attached shadow root we encounter into\n * the existing _sanitizeShadowDOM pipeline. The default node iterator\n * does not descend into shadow trees, so nodes inside an attached\n * shadow root would otherwise be skipped entirely.\n *\n * Two real input paths put attached shadow roots in front of us:\n * 1. IN_PLACE on a DOM node that already has shadow roots attached.\n * 2. DOM-node input where importNode(dirty, true) deep-clones the\n * shadow root because it was created with `clonable: true`.\n *\n * This pass runs once, up front, so the main iteration loop (and the\n * existing _sanitizeShadowDOM template-content recursion) stay\n * untouched — string-input paths are not affected.\n *\n * @param root the subtree root to walk for attached shadow roots\n */\n const _sanitizeAttachedShadowRoots2 = function _sanitizeAttachedShadowRoots(root) {\n if (root.nodeType === NODE_TYPE.element && root.shadowRoot instanceof DocumentFragment) {\n const sr = root.shadowRoot;\n // Recurse first so that nested shadow roots are reached even if\n // _sanitizeShadowDOM removes hosts at this level.\n _sanitizeAttachedShadowRoots2(sr);\n _sanitizeShadowDOM2(sr);\n }\n // Snapshot children before recursing. Sanitization of one subtree\n // (e.g. via an uponSanitizeShadowNode hook) may detach siblings,\n // and naive nextSibling traversal would silently skip the rest of\n // the list once a node is detached.\n const childNodes = root.childNodes;\n if (!childNodes) {\n return;\n }\n const snapshot = [];\n arrayForEach(childNodes, child => {\n arrayPush(snapshot, child);\n });\n for (const child of snapshot) {\n _sanitizeAttachedShadowRoots2(child);\n }\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 dirty = stringifyValue(dirty);\n if (typeof dirty !== 'string') {\n throw typeErrorCreate('dirty is not a string, aborting');\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 const nn = dirty.nodeName;\n if (typeof nn === 'string') {\n const tagName = transformCaseFunc(nn);\n if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place');\n }\n }\n /* Sanitize attached shadow roots before the main iterator runs.\n The iterator does not descend into shadow trees. */\n _sanitizeAttachedShadowRoots2(dirty);\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 /* Clonable shadow roots are deep-cloned by importNode(); sanitize\n them before the main iterator runs, since the iterator does not\n descend into shadow trees. */\n _sanitizeAttachedShadowRoots2(importedNode);\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 _sanitizeShadowDOM2(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 (SAFE_FOR_TEMPLATES) {\n body.normalize();\n let html = body.innerHTML;\n arrayForEach([MUSTACHE_EXPR$1, ERB_EXPR$1, TMPLIT_EXPR$1], expr => {\n html = stringReplace(html, expr, ' ');\n });\n body.innerHTML = html;\n }\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$1, ERB_EXPR$1, TMPLIT_EXPR$1], 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 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 navigate(`${base}/products/${product.id}`);\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 closeOnEscape: true,\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 const [prevSlides, setPrevSlides] = React.useState(slides);\n const [prevIndex, setPrevIndex] = React.useState(index);\n if (slides !== prevSlides || index !== prevIndex) {\n setPrevSlides(slides);\n setPrevIndex(index);\n dispatch({ type: \"update\", slides, index });\n }\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 RTLContext = React.createContext(null);\nconst useRTLContext = makeUseContext(\"useRTLContext\", \"RTLContext\", RTLContext);\nfunction RTLContextProvider({ isRTL, children }) {\n const context = React.useMemo(() => ({ isRTL }), [isRTL]);\n return React.createElement(RTLContext.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 return useRTLContext().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.slice().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 } = (typeof imageProps === \"function\" ? imageProps(image) : 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 [isRTL, setIsRTL] = React.useState(false);\n const { trackFocusWithin } = useA11yContext();\n const detectRTL = useEventCallback(() => {\n if (nodeRef.current) {\n const rtl = window.getComputedStyle(nodeRef.current).direction === \"rtl\";\n if (rtl !== isRTL) {\n setIsRTL(rtl);\n }\n }\n });\n React.useEffect(detectRTL);\n return (React.createElement(DocumentContextProvider, { nodeRef: nodeRef },\n React.createElement(RTLContextProvider, { isRTL: isRTL },\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, controller } = 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 if (!controller.closeOnEscape)\n return;\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 return;\n }\n event.stopPropagation();\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({ portal: { root, container: { className: containerClassName, style: containerStyle, ...containerRest } = {} }, animation, styles, className, on, close, labels, children, }) {\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, containerClassName, 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 ...containerStyle,\n }, onFocus: (event) => {\n if (!restoreFocus.current) {\n restoreFocus.current = event.relatedTarget;\n }\n }, ...containerRest }, children), (typeof root === \"function\" ? root() : 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, RTLContext, RTLContextProvider, 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, useRTLContext, 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 maxZoom: 8,\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 resolveMaxZoom(maxZoom, slide) {\n var _a;\n const resolved = typeof maxZoom === \"function\" ? ((_a = maxZoom(slide)) !== null && _a !== void 0 ? _a : defaultZoomProps.maxZoom) : maxZoom;\n return Math.max(resolved, 1);\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, maxZoom: maxZoomInProps } = 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 else if (slideRect.width > 0 && slideRect.height > 0) {\n if (imageDimensions && imageDimensions.width > 0 && imageDimensions.height > 0) {\n imageRect = {\n width: Math.min(slideRect.width, imageDimensions.width),\n height: Math.min(slideRect.height, imageDimensions.height),\n };\n }\n else {\n imageRect = { width: slideRect.width, height: slideRect.height };\n }\n }\n }\n const maxZoom = currentSlide && imageRect.width\n ? isImageSlide(currentSlide)\n ? Math.max(round(maxImageRect.width / imageRect.width, 5), 1)\n : resolveMaxZoom(maxZoomInProps, currentSlide)\n : 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 = !(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 isImage = isImageSlide(slide);\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 || isImage || !zoomWrapperRef.current)\n return () => { };\n const measure = () => {\n const wrapper = zoomWrapperRef.current;\n if (!wrapper)\n return;\n let width = 0;\n let height = 0;\n for (const child of wrapper.children) {\n if (child instanceof HTMLElement) {\n width = Math.max(width, child.offsetWidth);\n height = Math.max(height, child.offsetHeight);\n }\n }\n setImageDimensions((prev) => (prev && prev.width === width && prev.height === height ? prev : { width, height }));\n };\n measure();\n if (typeof ResizeObserver === \"undefined\")\n return () => { };\n const observer = new ResizeObserver(measure);\n for (const child of zoomWrapperRef.current.children) {\n observer.observe(child);\n }\n return () => observer.disconnect();\n }, [offset, isImage, rect]);\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 && isImage) {\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) => {\n var _a, _b;\n return isImageSlide(props.slide) || (props.slide.type != null && ((_a = zoom.supports) === null || _a === void 0 ? void 0 : _a.includes(props.slide.type))) ? (React.createElement(ZoomWrapper, { render: render, ...props })) : ((_b = render.slide) === null || _b === void 0 ? void 0 : _b.call(render, props));\n },\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