@vmscloud/moz-ui-grid-vue 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,40 @@
1
+ import { Meta, StoryObj } from '@storybook/vue3';
2
+ import { default as MozGrid } from '../MozGrid.vue';
3
+ /**
4
+ * 900행 피벗 — 표시 행이 뷰포트보다 훨씬 긴 피벗 그리드.
5
+ *
6
+ * ## 왜 이 크기인가
7
+ *
8
+ * 기존 피벗 스토리는 행이 한 화면에 다 들어오거나(`Grid/MozGrid > Basic`) 반대로
9
+ * 수십만~5백만 행이라(`Large Pivot`, `Performance/LargeData`) 성능 측정용에 가깝다.
10
+ * 그 사이가 비어 있어서, **"가상 스크롤이 실제로 돌지만 눈으로 전수 확인은 가능한"**
11
+ * 크기의 피벗을 따로 둔다.
12
+ *
13
+ * 이 크기에서만 드러나는 것들이 있다.
14
+ *
15
+ * - 화면에 렌더된 행과 실제 표시 행 수가 크게 벌어진다 → 뷰포트 밖 행을 읽어야 하는
16
+ * 기능(선택 집계·복사·내보내기)이 화면에 보이는 것만 처리하고 있지 않은지.
17
+ * - 행 헤더 병합(지점)이 스크롤 경계를 여러 번 가로지른다 → 스크롤 중 병합 셀 렌더/선택.
18
+ * - 스크롤을 한참 내린 뒤의 N번째 행에서 재현되는 결함. 첫 화면만 보면 놓친다.
19
+ *
20
+ * ## 구성
21
+ *
22
+ * | | |
23
+ * |---|---|
24
+ * | 원본 행 | 3,600 (지점 300 × 제품 3 × 분기 4) |
25
+ * | 피벗 표시 행 | **900** (지점 × 제품) |
26
+ * | 값 컬럼 | 4 (분기별 매출 합계) |
27
+ *
28
+ * 값은 난수가 아니라 인덱스로 만든 고정값이다 — 스토리를 다시 열어도 같은 숫자가
29
+ * 나와야 "이 셀이 이 값이어야 한다"를 근거로 말할 수 있다.
30
+ */
31
+ declare const meta: Meta<typeof MozGrid>;
32
+ export default meta;
33
+ type Story = StoryObj<typeof MozGrid>;
34
+ /**
35
+ * 지점 × 제품 = 900행, 분기 4열.
36
+ *
37
+ * 스크롤을 끝까지 내리면 `지점 300 / 전자` 가 마지막 행이다. 지점 열은 제품 3행마다
38
+ * 세로 병합되므로, 스크롤 경계에서 병합 셀이 끊기지 않는지도 함께 보인다.
39
+ */
40
+ export declare const Rows900: Story;
@@ -0,0 +1,118 @@
1
+ import { Meta, StoryObj } from '@storybook/vue3';
2
+ /**
3
+ * 피벗 lazy proxy × 외부 deep-reactive 충돌 (ITSM-2026-002533)
4
+ *
5
+ * ✅ **이 결함은 수정되었다.** 이 스토리는 이제 **회귀 감시용**이다 — 모든 버튼이 초록(정상)
6
+ * 이어야 한다. 하나라도 빨강(❌)이 나오면 `createLazyPivotRow` 의 보호가 되돌아간 것이다.
7
+ *
8
+ * 수정 커밋 기준 실측(Storybook 실브라우저): ①②③ 및 래퍼 경유 A~D 전부 `region 5/5`,
9
+ * `product 25/25` 정상. 수정 전에는 ②·C·D 에서 `0/25`(전부 빈 셀)였다.
10
+ *
11
+ * ---
12
+ * ### 증상 (수정 전)
13
+ *
14
+ * 피벗 모드에서 **행 필드(rowHeader) 셀만** 비어 보이고 값 셀은 정상. 가로로 스크롤하면
15
+ * 그제서야 값이 나타난다.
16
+ *
17
+ * ### 원인
18
+ *
19
+ * `createLazyPivotRow`(moz-ui-grid-core `processor/pivotUtils.ts`)의 `get` trap 종단이
20
+ * 모르는 키를 **무조건 `pivotRow.values` 에게 되물었다**:
21
+ *
22
+ * ```ts
23
+ * return values[prop]; // ← 수정 전: 선언하지 않은 키까지 위임
24
+ * ```
25
+ *
26
+ * grid 가 Vue deep reactive 안에 들어가면 `pivotRow.values` 도 reactive proxy 가 된다.
27
+ * 그 상태에서 Vue 가 행 객체에게 내부 예약 키를 물으면 lazy proxy 가 `values` 의 답을
28
+ * 그대로 돌려준다:
29
+ *
30
+ * ```
31
+ * lazyRow['__v_isReactive'] → values['__v_isReactive'] → true (거짓 자백)
32
+ * lazyRow['__v_raw'] → values['__v_raw'] → values 원본
33
+ * ⇒ Vue 는 "이 행은 이미 reactive 고 원본은 values 다" 라 판단해 행을 values 로 교체
34
+ * ```
35
+ *
36
+ * `values` 에는 **rowHeaders(=행 필드)와 `__nodeId` 가 없다.** 그래서 그 컬럼만
37
+ * `undefined` 가 되어 빈 셀이 된다. 값 컬럼은 `values` 안에 있으니 멀쩡했다 — 이것이
38
+ * "행 필드만 비는" 이유다.
39
+ *
40
+ * **가로 스크롤에서 살아나던 이유**: 행 필드는 `pinned:'left'` 라 최초 1회 칠해진 뒤
41
+ * `Row.renderCells` 의 Fast-Path(`meta.value === value`)에 걸려 재렌더를 건너뛴다. 가로
42
+ * 스크롤은 `renderedLeft`/`renderedWidth` 를 바꿔 그 조건을 깨므로 다시 칠해졌다.
43
+ *
44
+ * ### 수정 (core)
45
+ *
46
+ * ```ts
47
+ * if (Object.prototype.hasOwnProperty.call(values, prop)) return values[prop];
48
+ * return undefined; // 선언한 키 집합 밖은 스스로 undefined 로 답한다
49
+ * ```
50
+ *
51
+ * `ownKeys` trap 이 `Object.keys`(own+enumerable) 기준이라 이 술어와 정확히 동치다.
52
+ * **특정 프레임워크의 마커 이름에 의존하지 않으므로** Vue·MobX·Solid 어디서도 안전하다.
53
+ * 같은 커밋에서 `set`/`deleteProperty` trap 부재로 기존 키 덮어쓰기가 유실되던 별개
54
+ * 결함도 함께 고쳤다.
55
+ *
56
+ * ### 소비처 영향: 없음
57
+ *
58
+ * 공개 API·설정·타입 변경 없음. 소비처가 고칠 것은 없다. 다만 grid 인스턴스를 deep
59
+ * reactive 에 보관하는 것은 여전히 권장되지 않는다(행마다 불필요한 reactive 변환 비용).
60
+ * `shallowRef`/`markRaw` 사용을 권한다.
61
+ *
62
+ * ⚠️ **콘솔 경고는 신뢰할 수 없었다.** 구 `warnReactiveWrapOnce` 는 `receiver !== proxy` 로
63
+ * 감지했는데, 행 객체가 이미 `values` 로 치환된 뒤에는 lazy proxy 를 아예 거치지 않아
64
+ * 경고가 **한 번도 안 뜬 채** 증상이 났다. 이 수정에서 해당 감지 로직은 제거되었다
65
+ * (보호가 구조적으로 보장되므로 경고 자체가 불필요해졌다).
66
+ *
67
+ * ---
68
+ * ### 사용법 (회귀 감시)
69
+ * 1. `[① raw 인스턴스로 생성]` — 정상이어야 한다.
70
+ * 2. `[② reactive(grid) 로 생성]` — **정상이어야 한다** (수정 전 재현 지점).
71
+ * 3. `[③ 가로 스크롤 흔들기]` — 정상 유지.
72
+ */
73
+ declare const meta: Meta;
74
+ export default meta;
75
+ type Story = StoryObj;
76
+ export declare const RowFieldCellsGoBlank: Story;
77
+ /**
78
+ * **소비처 실제 패턴 재현** — 스마트리포트 `SmartReportComponentMozPivot.vue`
79
+ *
80
+ * 실측으로 확인한 재현 조건은 `reactive(grid)` 를 직접 부르는 것이 아니라,
81
+ * **`@ready` 로 받은 인스턴스를 deep `ref` 에 보관하고 그 참조로 API 를 부르는 것**이다.
82
+ *
83
+ * ```ts
84
+ * // plugin-systems/smart-report/.../SmartReportComponentMozPivot.vue:433
85
+ * const gridInstance = ref<any>(null); // ← deep ref (shallowRef 아님)
86
+ * const onReady = (grid: any) => { gridInstance.value = grid; };
87
+ * // 이후 ConfigManager/pivotConfigModule 등이 gridInstance.value 로 API 호출
88
+ * ```
89
+ *
90
+ * `ref()` 는 대입되는 객체를 `reactive()` 로 변환하므로 `gridInstance.value` 는 프록시다.
91
+ * 같은 파일이 `mozGridRef` 도 `ref` 로 잡고 `defineExpose` 로 외부에 노출하므로
92
+ * 상위 컴포넌트(DataInterface/ConfigManager)에서도 같은 프록시 경로를 탄다.
93
+ *
94
+ * ### [사실] 실측 — 수정 전 코드 기준 (jsdom, 30행 피벗)
95
+ *
96
+ * | 보관 방식 | `isReactive` | 초기 렌더 | `api.refresh()` 후 |
97
+ * |---|---|---|---|
98
+ * | `shallowRef(grid)` | false | region 3/3, product 15/15 | **3/3, 15/15** 정상 |
99
+ * | **`ref(grid)`** (스마트리포트) | **true** | region 3/3, product 15/15 | **0/3, 0/15** ❌ |
100
+ *
101
+ * **초기 렌더는 정상이고 재렌더에서 무너진다** — 제보의 "메뉴 진입 시 데이터가 표현되지
102
+ * 않는다" 및 "가로 스크롤하면 나온다" 와 일치한다.
103
+ *
104
+ * 레포의 다른 스토리들이 이 결함을 못 잡았던 이유도 여기 있다 — 전부 `shallowRef` 를
105
+ * 쓴다(`grep 'coreConfig = ' src/stories/` 기준 전건). 소비처만 `ref` 였다.
106
+ *
107
+ * ### 수정 후
108
+ *
109
+ * 두 방식 모두 `region 3/3, product 15/15` 정상. 소비처가 코드를 고칠 필요는 없다.
110
+ * 다만 `shallowRef` 가 여전히 권장된다 — 행마다 불필요한 reactive 변환 비용이 없다.
111
+ *
112
+ * ### 사용법 (회귀 감시)
113
+ * 1. `[A] ref 에 보관만` — 정상.
114
+ * 2. `[B] rx.loadData + rx.refresh` — 정상.
115
+ * 3. `[C] rx.refresh() 단독` — **정상이어야 한다** (수정 전 재현 지점).
116
+ * 4. `[D] rx.sort()` — **정상이어야 한다** (수정 전 재현 지점).
117
+ */
118
+ export declare const ViaMozGridWrapper: Story;
@@ -0,0 +1,6 @@
1
+ import { Meta, StoryObj } from '@storybook/vue3';
2
+ import { default as MozGrid } from '../MozGrid.vue';
3
+ declare const meta: Meta<typeof MozGrid>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof MozGrid>;
6
+ export declare const Disabled: Story;
@@ -0,0 +1,57 @@
1
+ import { Meta, StoryObj } from '@storybook/vue3';
2
+ import { default as MozGrid } from '../MozGrid.vue';
3
+ /**
4
+ * 행 그룹 집계 — `rowGroupConfig.aggregates` 와 레벨별 `scope` (ITSM-2026-002417).
5
+ *
6
+ * ─────────────────────────────────────────────────────────────────────────────
7
+ * 설정 모양
8
+ * ─────────────────────────────────────────────────────────────────────────────
9
+ * ```ts
10
+ * rowGroupConfig: {
11
+ * columns: ['department', 'team'],
12
+ * aggregates: [
13
+ * { column: 'salary', func: 'sum', scope: ['department'] },
14
+ * { column: 'salary', func: 'avg', scope: ['department', 'team'] },
15
+ * { column: 'id', func: 'count' },
16
+ * ],
17
+ * }
18
+ * ```
19
+ *
20
+ * - **항목 하나 = 그룹행의 한 자리.** 같은 컬럼에 함수가 여럿 필요하면 항목을 여럿 둔다.
21
+ * - `func` 는 **항상 명시**한다. (구 `subtotals` 는 컬럼 id 만 담고 함수를 필드의
22
+ * `aggregate` 에서 빌려왔는데, 없으면 조용히 `'sum'` 으로 떨어져 문자열 컬럼에
23
+ * 이상한 값이 나왔다.)
24
+ * - `scope` 는 **그룹 컬럼 id 경로**다. 배열 인덱스가 아니라 경로인 이유는 사용자가
25
+ * 그룹 기준을 재정렬해도 설정이 컬럼을 따라가야 하기 때문이다. 생략하면 전 레벨.
26
+ *
27
+ * ─────────────────────────────────────────────────────────────────────────────
28
+ * 확인할 것
29
+ * ─────────────────────────────────────────────────────────────────────────────
30
+ * 1. **부서(1단계) 그룹행** — `급여 (Sum)` 과 `ID (Count)` 가 보인다. `Avg` 는 없다.
31
+ * 2. **팀(2단계) 그룹행** — `급여 (Avg)` 와 `ID (Count)` 가 보인다. `Sum` 은 없다.
32
+ * → `scope` 가 표시 위치만 고르는 게 아니라 **집계 단위**를 정한다.
33
+ * 같은 `salary` 라도 부서 레벨은 부서별 합계, 팀 레벨은 팀별 평균이다.
34
+ * 3. **`scope` 없는 항목**(`id` 의 `count`)은 두 레벨 **모두**에 나타난다.
35
+ * 4. 그룹을 접었다 펴도 각 레벨의 집계가 그대로 유지된다.
36
+ */
37
+ declare const meta: Meta<typeof MozGrid>;
38
+ export default meta;
39
+ type Story = StoryObj<typeof MozGrid>;
40
+ /** 부서 → 팀 2단 그룹. 레벨마다 다른 집계를 건다. */
41
+ export declare const LevelScopedAggregates: Story;
42
+ /**
43
+ * 초기 접힘 상태 — `defaultExpandLevel` / `defaultCollapsed`.
44
+ *
45
+ * `TreeConfig` 의 같은 이름 옵션과 대칭이다. 통합 전에는 선언만 있고 **읽는 코드가 0건**인
46
+ * 죽은 옵션이었다(트리에서는 동작해서 되는 줄 알기 쉬웠다).
47
+ *
48
+ * ### 확인할 것
49
+ * 1. 처음 렌더에서 **부서 + 팀 그룹행까지** 펼쳐져 보인다(`defaultExpandLevel: 1`).
50
+ * 팀 아래 데이터 행은 접혀 있다.
51
+ * 2. 팀을 펼치면 사원 데이터 행이 나온다.
52
+ * 3. 펼친 뒤 정렬·필터를 걸어도 **사용자가 펼친 상태가 유지된다**
53
+ * (초기 상태는 첫 렌더/설정 변경 시에만 적용된다).
54
+ *
55
+ * `defaultExpandLevel: 0` 이면 부서만, `defaultCollapsed: true` 면 전 레벨이 접힌다(이쪽이 우선).
56
+ */
57
+ export declare const InitiallyCollapsed: Story;
@@ -0,0 +1,9 @@
1
+ import { Meta, StoryObj } from '@storybook/vue3';
2
+ import { default as MozGrid } from '../MozGrid.vue';
3
+ declare const meta: Meta<typeof MozGrid>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof MozGrid>;
6
+ /** 기존 story ID(grid-rowgroupdisabled--disabled)를 유지한다. */
7
+ export declare const Disabled: Story;
8
+ export declare const LayoutDisabled: Story;
9
+ export declare const FormatDisabled: Story;
@@ -0,0 +1,7 @@
1
+ import { Meta, StoryObj } from '@storybook/vue3';
2
+ import { default as MozGrid } from '../MozGrid.vue';
3
+ declare const meta: Meta<typeof MozGrid>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof MozGrid>;
6
+ /** 기본 OFF. 컬럼 옵션 → 집계 → Footer 표시를 켜서 확인한다. */
7
+ export declare const DefaultOff: Story;
@@ -41,25 +41,25 @@ export declare function generateTreeData(): ({
41
41
  department: string;
42
42
  salary: number;
43
43
  })[];
44
- /** 피벗 스토리용 사용 가능한 필드 정의 */
44
+ /**
45
+ * 피벗 스토리용 사용 가능한 필드 정의 — **원본 컬럼 목록(카탈로그)**.
46
+ *
47
+ * 🚨 여기에는 배치 결과를 넣지 않는다. `{ field:'sales', aggregate:'sum', header:'매출 합계' }`
48
+ * 같은 항목은 "매출을 합계로 **배치한** 결과"이지 원본에 있는 컬럼이 아니다. 카탈로그에
49
+ * 섞이면 좌측 소스 필드 목록에 같은 field 가 여러 번 나오는데, 카탈로그 항목에는 배치 id 가
50
+ * 없어(그건 배치의 정체성이다) 그 항목들을 서로 구분할 수 없다.
51
+ * 집계 배치는 스토리의 `valueFields` 에 선언한다(예: MozGrid.stories 의 LargePivot).
52
+ *
53
+ * 항목은 `generateSalesData` 가 만드는 키와 1:1 이다.
54
+ */
45
55
  export declare const salesAvailableFields: ({
46
56
  field: string;
47
57
  header: string;
48
58
  dataType: "number";
49
- aggregate?: undefined;
50
- width?: undefined;
51
59
  } | {
52
60
  field: string;
53
61
  header: string;
54
62
  dataType: "string";
55
- aggregate?: undefined;
56
- width?: undefined;
57
- } | {
58
- field: string;
59
- aggregate: string;
60
- header: string;
61
- width: number;
62
- dataType: "number";
63
63
  })[];
64
64
  export declare function generateSalesData(count?: number): {
65
65
  id: number;
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- .mzc-toast-container{position:fixed;top:16px;right:16px;z-index:var(--mzc-z-toast, 2500);display:flex;flex-direction:column;gap:8px;pointer-events:none}.mzc-toast{pointer-events:auto;min-width:200px;max-width:420px;padding:10px 14px;border-radius:6px;border:1px solid var(--mzc-border, #bbc6d9);border-left-width:4px;background:var(--mzc-bg, #fff);color:var(--mzc-fg, #1f2937);font-size:13px;line-height:1.4;box-shadow:0 4px 12px #0000001f;cursor:pointer;animation:mzc-toast-in .16s ease-out}.mzc-toast--success{border-left-color:var(--mzc-toast-success, #22a06b)}.mzc-toast--error{border-left-color:var(--mzc-toast-error, #dc5a5a)}.mzc-toast--warning{border-left-color:var(--mzc-toast-warning, #e39b1b)}.mzc-toast--info{border-left-color:var(--mzc-accent, #3b82f6)}@keyframes mzc-toast-in{0%{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:translateY(0)}}.ps-theme-light{--ps-primary-color: #4568e0;--ps-bg-color: #ffffff;--ps-border-color: rgb(187, 198, 217);--ps-pinned-border-color: rgb(108, 128, 170);--ps-header-bg: rgb(222, 224, 239);--ps-header-text: rgb(67, 76, 96);--ps-cell-text: rgb(67, 76, 96);--ps-cell-readonly: rgb(244, 244, 249);--ps-row-hover-bg: #f0f7ff;--ps-row-selected-bg: rgba(69, 104, 224, .2);--ps-row-alt-bg: rgb(248, 248, 253);--ps-shadow-color: rgba(0, 0, 0, .1);--ps-cell-selected-bg: rgba(69, 104, 224, .16);--ps-cell-selected-border-color: rgba(69, 104, 224, .6);--ps-selection-overlay-border-color: rgba(69, 104, 224, 1);--ps-selection-overlay-border-width: 2px;--ps-text-secondary: #666;--ps-text-muted: #999;--ps-scrollbar-thumb: #bbc6d9;--ps-scrollbar-thumb-hover: #bbc6d9;--ps-overlay-bg: #fff;--ps-overlay-border: #d0d5dd;--ps-overlay-shadow: 0 4px 16px rgba(0, 0, 0, .12);--ps-overlay-separator: #e5e7eb;--ps-overlay-hover-bg: #f0f4ff;--ps-overlay-accent: #4a7cff;--ps-overlay-text: #374151;--ps-overlay-text-strong: #111827;--ps-overlay-text-muted: #9ca3af;--ps-overlay-btn-hover-bg: #f3f4f6;--ps-overlay-danger: #ef4444;--ps-overlay-danger-bg: #fef2f2;--ps-loading-bg: rgba(255, 255, 255, .8);--ps-group-row-hover-bg: #e3f2fd;--ps-master-detail-row-bg: #fafafa;--ps-dirty-added-color: #4caf50;--ps-dirty-added-bg: rgba(76, 175, 80, .08);--ps-dirty-modified-color: #ffc107;--ps-dirty-modified-bg: rgba(255, 193, 7, .08);--ps-dirty-modified-cell-bg: rgba(255, 193, 7, .2);--ps-dirty-deleted-color: #f44336;--ps-dirty-deleted-bg: rgba(244, 67, 54, .08);--ps-dirty-reordered-color: #7b1fa2;--ps-dirty-reordered-bg: rgba(123, 31, 162, .07);--ps-validation-error-color: #e53935;--ps-validation-error-bg: rgba(229, 57, 53, .06);--ps-subtotal-bg: #d6def8;--ps-subtotal-hover-bg: #d6def8;--ps-grandtotal-bg: #d6def8;--ps-grandtotal-hover-bg: #d6def8;--ps-column-subtotal-bg: #d6def8;--ps-statusbar-bg: #f8f9fa;--ps-statusbar-border: #e0e0e0;--ps-statusbar-spinner-border: #c0c8d4;--ps-checkbox-border: #98a2b3;--ps-checkbox-checked: #3b82f6;--ps-sunday-color: #ef4444;--ps-saturday-color: #3b82f6;--ps-header-height: 36px;--ps-row-height: 36px;--ps-scrollbar-width: 8px;--ps-cell-padding: 0 var(--ps-cell-padding-side);--ps-cell-padding-side: 10px;--ps-border-width: 1px;--ps-group-indent: 0px;--ps-font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--ps-font-size: 13px;--ps-header-font-weight: 500;--ps-cell-flash-up-bg: rgba(22, 160, 133, .4);--ps-cell-flash-down-bg: rgba(231, 76, 60, .4);--ps-cell-flash-neutral-bg: rgba(241, 196, 15, .4);--ps-cell-flash-duration: .5s;--ps-cell-fade-duration: 1s}.ps-theme-dark{--ps-primary-color: #4568e0;--ps-bg-color: #1e1e1e;--ps-border-color: #3c3c3c;--ps-pinned-border-color: #6e6e6e;--ps-header-bg: #2d2d2d;--ps-header-text: #e0e0e0;--ps-cell-text: #d4d4d4;--ps-cell-readonly: #2a2a2e;--ps-row-hover-bg: #2a2d2e;--ps-row-selected-bg: rgba(69, 104, 224, .2);--ps-row-alt-bg: #252526;--ps-shadow-color: rgba(0, 0, 0, .3);--ps-cell-selected-bg: rgba(69, 104, 224, .16);--ps-cell-selected-border-color: rgba(69, 104, 224, 1);--ps-selection-overlay-border-color: rgba(69, 104, 224, 1);--ps-selection-overlay-border-width: 2px;--ps-text-secondary: #9ca3af;--ps-text-muted: #666;--ps-scrollbar-thumb: #555;--ps-scrollbar-thumb-hover: #777;--ps-overlay-bg: #1e2330;--ps-overlay-border: #2d3446;--ps-overlay-shadow: 0 4px 16px rgba(0, 0, 0, .4);--ps-overlay-separator: #2d3446;--ps-overlay-hover-bg: #2a3142;--ps-overlay-accent: #6b9aff;--ps-overlay-text: #d1d5db;--ps-overlay-text-strong: #e5e7eb;--ps-overlay-text-muted: #6b7280;--ps-overlay-btn-hover-bg: #2a3142;--ps-overlay-danger: #f87171;--ps-overlay-danger-bg: rgba(239, 68, 68, .1);--ps-loading-bg: rgba(0, 0, 0, .5);--ps-group-row-hover-bg: #094771;--ps-master-detail-row-bg: #1e1e1e;--ps-dirty-added-color: #4caf50;--ps-dirty-added-bg: rgba(76, 175, 80, .15);--ps-dirty-modified-color: #ffc107;--ps-dirty-modified-bg: rgba(255, 193, 7, .15);--ps-dirty-modified-cell-bg: rgba(255, 193, 7, .25);--ps-dirty-deleted-color: #f44336;--ps-dirty-deleted-bg: rgba(244, 67, 54, .15);--ps-dirty-reordered-color: #7b1fa2;--ps-dirty-reordered-bg: rgba(123, 31, 162, .1);--ps-validation-error-color: #ef5350;--ps-validation-error-bg: rgba(239, 83, 80, .1);--ps-subtotal-bg: #2a3441;--ps-subtotal-hover-bg: #343f4f;--ps-grandtotal-bg: #1e2631;--ps-grandtotal-hover-bg: #283040;--ps-column-subtotal-bg: #2a3441;--ps-statusbar-bg: #1a1f2e;--ps-statusbar-border: #2d3446;--ps-statusbar-spinner-border: #3d4556;--ps-checkbox-border: #667085;--ps-checkbox-checked: #3b82f6;--ps-sunday-color: #f87171;--ps-saturday-color: #60a5fa;--ps-header-height: 36px;--ps-row-height: 36px;--ps-scrollbar-width: 10px;--ps-cell-padding: 0 var(--ps-cell-padding-side);--ps-cell-padding-side: 10px;--ps-border-width: 1px;--ps-group-indent: 0px;--ps-font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--ps-font-size: 13px;--ps-header-font-weight: 500;--ps-cell-flash-up-bg: rgba(22, 160, 133, .4);--ps-cell-flash-down-bg: rgba(231, 76, 60, .4);--ps-cell-flash-neutral-bg: rgba(241, 196, 15, .4);--ps-cell-flash-duration: .5s;--ps-cell-fade-duration: 1s}.ps-grid-container.ps-selection-row,.ps-grid-container.ps-selection-range{--ps-row-selected-bg: var(--ps-cell-selected-bg)}.ps-grid-container{height:100%;position:relative;display:flex;flex-direction:column;isolation:isolate;overflow:hidden;background:var(--ps-bg-color);font-family:var(--ps-font-family);font-size:var(--ps-font-size);color:var(--ps-cell-text);box-sizing:border-box;outline:none}.ps-grid-container *,.ps-grid-container *:before,.ps-grid-container *:after{box-sizing:border-box}.ps-main-area{flex:1;display:flex;flex-direction:row;overflow:hidden;min-height:0}.ps-content-wrapper{flex:1;display:flex;flex-direction:column;overflow:hidden;min-width:0}.ps-scroll-area-x{flex-shrink:0;display:flex;flex-direction:row;background:var(--ps-bg-color)}.ps-header{flex-shrink:0;background:var(--ps-header-bg);overflow-x:auto;overflow-y:hidden;z-index:10000}.ps-header::-webkit-scrollbar{display:none}.ps-header{-ms-overflow-style:none;scrollbar-width:none}.ps-header-row{display:flex;height:var(--ps-header-height);width:var(--ps-total-width, 100%);position:relative;background:var(--ps-header-bg)}.ps-row .ps-cells-center .ps-cell.ps-group-indent-cell{padding-left:calc(var(--ps-group-indent, 0px) + var(--ps-cell-padding-side))}.ps-header-cell{position:absolute;top:0;display:flex;align-items:center;padding:var(--ps-cell-padding);font-weight:var(--ps-header-font-weight);color:var(--ps-header-text);border-right:var(--ps-border-width) solid var(--ps-border-color);border-bottom:1px solid var(--ps-border-color);-webkit-user-select:none;user-select:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;height:100%;box-sizing:border-box}.ps-header-cell .ps-header-text{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ps-pivot-header-text{min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:center}.ps-resize-handle{position:absolute;top:0;right:0;width:6px;height:100%;cursor:col-resize;background:transparent;z-index:1}.ps-resize-handle:hover{background:var(--ps-primary-color)}.ps-sort-icon{flex-shrink:0;margin-left:4px;opacity:.6}.ps-header-cell.ps-sorted .ps-sort-icon{opacity:1}.ps-header-cell.ps-sort-asc .ps-sort-icon:before{content:"▲"}.ps-header-cell.ps-sort-desc .ps-sort-icon:before{content:"▼"}.ps-sort-icon[data-sort-seq]:after{content:attr(data-sort-seq);font-size:9px;margin-left:1px;opacity:.7;vertical-align:super}.ps-filter-icon{flex-shrink:0;margin-left:4px;opacity:.6}.ps-header-cell.ps-filtered .ps-filter-icon{opacity:1}.ps-header-cell.ps-filtered .ps-filter-icon:before{content:"f"}.ps-body{flex:1;position:relative;overflow:hidden;display:flex;flex-direction:column}.ps-scroll-wrapper{flex:1;position:relative;overflow:hidden}.ps-scroll-proxy-y{flex-shrink:0;overflow-y:auto;overflow-x:hidden;z-index:5;background:var(--ps-bg-color)}.ps-scroll-proxy-y::-webkit-scrollbar{width:var(--ps-scrollbar-width)}.ps-scroll-proxy-y::-webkit-scrollbar-track{background:var(--ps-bg-color)}.ps-scroll-proxy-y::-webkit-scrollbar-thumb{background:var(--ps-scrollbar-thumb)}.ps-scroll-proxy-y::-webkit-scrollbar-thumb:hover{background:var(--ps-scrollbar-thumb-hover)}.ps-scroll-spacer-y{width:1px}.ps-scroll-proxy-x{flex:1;overflow-x:auto;overflow-y:hidden;z-index:5;background:var(--ps-bg-color)}.ps-scroll-proxy-x::-webkit-scrollbar{height:var(--ps-scrollbar-width)}.ps-scroll-proxy-x::-webkit-scrollbar-track{background:var(--ps-bg-color)}.ps-scroll-proxy-x::-webkit-scrollbar-thumb{background:var(--ps-scrollbar-thumb)}.ps-scroll-proxy-x::-webkit-scrollbar-thumb:hover{background:var(--ps-scrollbar-thumb-hover)}.ps-scroll-spacer-x{display:block;height:1px}.ps-scroll-corner{flex-shrink:0;width:var(--ps-scrollbar-width);background:var(--ps-bg-color)}.ps-viewport{position:absolute;top:0;left:0;right:0;bottom:0;overflow-x:auto;overflow-y:auto}.ps-viewport::-webkit-scrollbar{width:0;height:0;display:none}.ps-viewport{-ms-overflow-style:none;scrollbar-width:none}.ps-row-container{position:relative;width:var(--ps-total-width, 100%)}.ps-row{position:absolute;left:0;display:flex;height:var(--ps-row-height);width:var(--ps-total-width, 100%);will-change:transform;contain:layout style}.ps-cells-left,.ps-cells-center,.ps-cells-right{position:relative;height:100%;flex-shrink:0}.ps-cells-left{position:sticky;left:0;z-index:2;background:inherit;width:var(--ps-left-total-width, 0px);height:100%}.ps-cells-right{position:sticky;right:0;z-index:2;background:inherit;width:var(--ps-right-total-width, 0px);height:100%}.ps-cells-center{position:relative;width:var(--ps-center-total-width, 0px);height:100%}.ps-cell{position:absolute;top:0;display:flex;align-items:center;height:100%;padding:var(--ps-cell-padding);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;background:var(--ps-bg-color);border-right:var(--ps-border-width) solid var(--ps-border-color);border-bottom:var(--ps-border-width) solid var(--ps-border-color);contain:strict;box-sizing:border-box}.ps-cell-content{width:100%;display:inline-block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ps-dynamic-row-heights .ps-cell{contain:content;height:auto;min-height:100%}.ps-cell.ps-editing{overflow:visible;outline:2px solid var(--ps-primary-color);outline-offset:-2px}.ps-cell.ps-editing input,.ps-cell.ps-editing select,.ps-cell.ps-editing textarea{flex:1;min-width:0;align-self:stretch;padding:0;margin:0;border:none;outline:none;font-family:inherit;font-size:inherit;background:transparent;color:var(--ps-cell-text);box-sizing:border-box}.ps-cell.ps-editing input[type=number]::-webkit-inner-spin-button,.ps-cell.ps-editing input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.ps-cell.ps-editing input[type=number]{-moz-appearance:textfield;-webkit-appearance:textfield;appearance:textfield}.ps-cell.ps-cell-readonly{background:var(--ps-cell-readonly);color:var(--ps-cell-text)}.ps-empty-state{display:flex;align-items:center;justify-content:center;height:100%;color:var(--ps-text-muted);font-size:16px}.ps-loading{position:absolute;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;background:var(--ps-loading-bg);z-index:20000}.ps-loading-spinner{width:32px;height:32px;border:3px solid var(--ps-border-color);border-top-color:var(--ps-primary-color);border-radius:50%;animation:ps-spin .8s linear infinite}@keyframes ps-spin{to{transform:rotate(360deg)}}.ps-pinned-top,.ps-pinned-bottom{flex-shrink:0;background:var(--ps-bg-color)}.ps-pinned-row{display:flex;background:var(--ps-bg-color);width:var(--ps-total-width, 100%);position:relative}.ps-pinned-row .ps-cells-left,.ps-pinned-row .ps-cells-center,.ps-pinned-row .ps-cells-right{position:relative;height:100%;flex-shrink:0}.ps-pinned-row .ps-cells-left{position:sticky;left:0;z-index:2;background:var(--ps-bg-color);width:var(--ps-left-total-width, 0px)}.ps-pinned-row .ps-cells-center{position:relative;width:var(--ps-center-total-width, 0px)}.ps-pinned-row .ps-cells-right{position:sticky;right:0;z-index:2;background:var(--ps-bg-color);width:var(--ps-right-total-width, 0px)}.ps-grid-container.ps-has-top-pinned .ps-pinned-top:after{content:"";position:absolute;bottom:0;left:0;right:0;height:0;border-bottom:1px solid var(--ps-pinned-border-color);z-index:3;pointer-events:none}.ps-grid-container.ps-has-bottom-pinned .ps-pinned-bottom:before{content:"";position:absolute;top:0;left:0;right:0;height:0;border-top:1px solid var(--ps-pinned-border-color);z-index:3;pointer-events:none}.ps-grid-container.ps-has-left-pinned .ps-row>.ps-cells-left>.ps-cell:last-child,.ps-grid-container.ps-has-left-pinned .ps-pinned-row>.ps-cells-left>.ps-cell:last-child,.ps-grid-container.ps-has-left-pinned .ps-header-row>.ps-cells-left>.ps-header-cell:last-child{border-right-color:var(--ps-pinned-border-color)}.ps-grid-container.ps-has-right-pinned .ps-row>.ps-cells-right>.ps-cell:nth-child(1),.ps-grid-container.ps-has-right-pinned .ps-pinned-row>.ps-cells-right>.ps-cell:nth-child(1),.ps-grid-container.ps-has-right-pinned .ps-header-row>.ps-cells-right>.ps-header-cell:nth-child(1){border-left:1px solid var(--ps-pinned-border-color)}.ps-pivot-header-left:after{content:"";position:absolute;top:0;right:0;width:0;height:100%;border-right:1px solid var(--ps-pinned-border-color);z-index:3;pointer-events:none}.ps-row.ps-selected .ps-cell,.ps-row.ps-selected .ps-cell.ps-cell-merged-anchor,.ps-cell.ps-merge-float.ps-cell-row-selected{box-shadow:inset 0 0 0 9999px var(--ps-row-selected-bg)}.ps-row .ps-cell.ps-cell-selected,.ps-merge-overlay .ps-merge-float.ps-cell-selected{border-right-color:var(--ps-cell-selected-border-color);border-bottom-color:var(--ps-cell-selected-border-color)}.ps-selection-overlay{position:absolute;top:0;left:0;display:flex;width:var(--ps-total-width, 100%);height:0;pointer-events:none;z-index:7}.ps-selection-overlay .ps-cells-left,.ps-selection-overlay .ps-cells-center,.ps-selection-overlay .ps-cells-right{height:0;background:transparent;box-shadow:none;pointer-events:none}.ps-selection-overlay-region{position:absolute;border:var(--ps-selection-overlay-border-width, 1px) solid var(--ps-selection-overlay-border-color);box-sizing:border-box;pointer-events:none;box-shadow:inset 0 0 0 9999px var(--ps-cell-selected-bg)}.ps-body.ps-dragging,.ps-body.ps-dragging *{cursor:crosshair;-webkit-user-select:none;user-select:none}.ps-row.ps-row-added{background-color:var(--ps-dirty-added-bg)}.ps-row.ps-row-added:after{content:"";height:100%;border-left:3px solid var(--ps-dirty-added-color);position:absolute}.ps-row.ps-row-added .ps-cell{background-color:var(--ps-dirty-added-bg)}.ps-row.ps-row-modified{background-color:var(--ps-dirty-modified-bg)}.ps-row.ps-row-modified:after{content:"";height:100%;border-left:3px solid var(--ps-dirty-modified-color);position:absolute}.ps-row.ps-row-modified .ps-cell{background-color:var(--ps-dirty-modified-bg)}.ps-row .ps-cell.ps-cell-modified{background-color:var(--ps-dirty-modified-cell-bg)}.ps-row.ps-row-deleted{background-color:var(--ps-dirty-deleted-bg);opacity:.6}.ps-row.ps-row-deleted:after{content:"";height:100%;border-left:3px solid var(--ps-dirty-deleted-color);position:absolute}.ps-row.ps-row-deleted .ps-cell{background-color:var(--ps-dirty-deleted-bg);text-decoration:line-through;color:var(--ps-text-muted)}.ps-row.ps-row-readonly .ps-cell{background-color:var(--ps-cell-readonly);cursor:not-allowed}.ps-row.ps-selected.ps-row-readonly .ps-cell{box-shadow:inset 0 0 0 9999px var(--ps-row-selected-bg)}.ps-row.ps-row-reordered:after{content:"";position:absolute;left:0;top:0;height:100%;width:3px;background:var(--ps-dirty-reordered-color);pointer-events:none}.ps-row.ps-row-reordered .ps-cell{background-color:var(--ps-dirty-reordered-bg)}.ps-row.ps-row-dragging{opacity:.4;transition:opacity 80ms ease-out}.ps-row.ps-row-drop-target:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;z-index:5;background-color:#3b82f62e;box-shadow:inset 0 0 0 2px #3b82f6d9;transition:background-color 80ms ease-out,box-shadow 80ms ease-out}.ps-row.ps-row-drop-target-invalid:before{background-color:#ef44442e;box-shadow:inset 0 0 0 2px #ef4444d9}.ps-drag-handle{cursor:grab;color:var(--ps-text-muted);font-size:14px;-webkit-user-select:none;user-select:none;line-height:1}.ps-drag-handle:hover{color:var(--ps-text-secondary)}.ps-drag-handle:active{cursor:grabbing}.ps-sort-active .ps-drag-handle{cursor:not-allowed;opacity:.4}.ps-row-drop-indicator{position:absolute;left:0;height:2px;background:var(--ps-primary-color);pointer-events:none;z-index:100;transition:top .05s ease}.ps-drag-ghost{position:fixed;z-index:10000;padding:4px 12px;background:var(--ps-bg-color);border:1px solid var(--ps-primary-color);border-radius:4px;box-shadow:0 2px 8px var(--ps-shadow-color);font-size:12px;color:var(--ps-cell-text);pointer-events:none;opacity:.9}.ps-drag-ghost.ps-drag-ghost-multi{box-shadow:4px 4px 0 -1px var(--ps-bg-color),4px 4px 0 0 var(--ps-primary-color),8px 8px 0 -1px var(--ps-bg-color),8px 8px 0 0 var(--ps-primary-color),0 2px 8px var(--ps-shadow-color);font-weight:600}.ps-drag-ghost.ps-drag-ghost-multi-large{box-shadow:4px 4px 0 -1px var(--ps-bg-color),4px 4px 0 0 var(--ps-primary-color),0 2px 8px var(--ps-shadow-color)}.ps-row-drop-indicator.invalid{background:#f44336;height:3px}.ps-row-drop-indicator.invalid[data-reason]:after{content:attr(data-reason);position:absolute;top:-22px;left:8px;background:#f44336;color:#fff;padding:2px 8px;border-radius:4px;font-size:11px;white-space:nowrap;box-shadow:0 2px 4px #0003}body.ps-cross-grid-invalid,body.ps-cross-grid-invalid *{cursor:no-drop!important}.ps-row.ps-selected.ps-row-added .ps-cell{box-shadow:inset 0 0 0 9999px var(--ps-row-selected-bg)}.ps-row.ps-row-added .ps-cell.ps-cell-selected{box-shadow:inset 0 0 0 9999px var(--ps-cell-selected-bg)}.ps-row.ps-selected.ps-row-modified .ps-cell{box-shadow:inset 0 0 0 9999px var(--ps-row-selected-bg)}.ps-row.ps-row-modified .ps-cell.ps-cell-selected{box-shadow:inset 0 0 0 9999px var(--ps-cell-selected-bg)}.ps-row.ps-selected.ps-row-deleted .ps-cell{box-shadow:inset 0 0 0 9999px var(--ps-row-selected-bg)}.ps-row.ps-row-deleted .ps-cell.ps-cell-selected{box-shadow:inset 0 0 0 9999px var(--ps-cell-selected-bg)}.ps-row.ps-selected.ps-row-reordered .ps-cell{box-shadow:inset 0 0 0 9999px var(--ps-row-selected-bg)}.ps-row.ps-row-reordered .ps-cell.ps-cell-selected{box-shadow:inset 0 0 0 9999px var(--ps-cell-selected-bg)}.ps-cell-flash-up{background-color:var(--ps-cell-flash-up-bg)!important;transition:none}.ps-cell-flash-down{background-color:var(--ps-cell-flash-down-bg)!important;transition:none}.ps-cell-flash-neutral{background-color:var(--ps-cell-flash-neutral-bg)!important;transition:none}.ps-cell-flash-fade{transition:background-color var(--ps-cell-fade-duration, 1s) ease-out;background-color:transparent!important}.ps-row.ps-group-row{background:linear-gradient(to right,var(--ps-row-alt-bg),var(--ps-bg-color));border-bottom:1px solid var(--ps-border-color);border-right:1px solid var(--ps-border-color);cursor:pointer;-webkit-user-select:none;user-select:none;width:var(--ps-total-width, 100%)}.ps-row.ps-group-row .ps-cells-center{position:relative}.ps-row.ps-group-row .ps-cell{border-bottom:none}.ps-row.ps-group-row .ps-cells-center .ps-cell{background:transparent}.ps-row.ps-group-row .ps-cells-left .ps-cell,.ps-row.ps-group-row .ps-cells-right .ps-cell{background:var(--ps-row-alt-bg)}.ps-cell.ps-merge-float.ps-group-banner-float{background:linear-gradient(to right,var(--ps-row-alt-bg),var(--ps-bg-color));border-right:var(--ps-border-width) solid var(--ps-border-color);border-bottom:var(--ps-border-width) solid var(--ps-border-color);pointer-events:none;white-space:nowrap;color:var(--ps-cell-text)}.ps-cell.ps-merge-float.ps-group-banner-float.ps-group-banner-hover{background:linear-gradient(to right,var(--ps-group-row-hover-bg),var(--ps-bg-color))}.ps-row.ps-group-row:hover .ps-cells-left .ps-cell,.ps-row.ps-group-row:hover .ps-cells-right .ps-cell,.ps-row.ps-group-row:hover .ps-cells-center .ps-cell.ps-group-standalone-cell{background:var(--ps-group-row-hover-bg)}.ps-group-expand,.ps-group-collapse{margin-right:8px;color:var(--ps-cell-text)}.ps-group-label{font-weight:500}.ps-group-label strong{color:var(--ps-primary-color)}.ps-group-aggregates{font-size:13px;margin-left:16px;color:var(--ps-text-secondary, #666)}.ps-group-aggregate{color:var(--ps-header-text);margin-right:12px}.ps-row.ps-group-row .ps-cells-center .ps-cell.ps-group-standalone-cell{background:var(--ps-row-alt-bg);z-index:1}.ps-master-detail-row{border-bottom:1px solid var(--ps-border-color);background:var(--ps-master-detail-row-bg)}.ps-master-detail-row .ps-cells-center{display:block;padding:12px 16px;overflow:hidden}.ps-tree-expand,.ps-tree-collapse,.ps-master-detail-expand,.ps-master-detail-collapse,.ps-group-expand,.ps-group-collapse,.ps-pivot-expand,.ps-pivot-collapse,.ps-column-group-expand,.ps-column-group-collapse,.ps-pivotcol-expand,.ps-pivotcol-collapse{border:none;background:none;padding:0;font:inherit;outline:inherit;display:inline-block;width:16px;text-align:center;font-size:10px;cursor:pointer;-webkit-user-select:none;user-select:none;color:var(--ps-text-secondary);transition:color .15s;flex-shrink:0;margin-right:4px}.ps-tree-expand:after,.ps-master-detail-expand:after,.ps-group-expand:after,.ps-pivot-expand:after,.ps-column-group-expand:after,.ps-pivotcol-expand:after{content:"▼"}.ps-tree-collapse:after,.ps-master-detail-collapse:after,.ps-group-collapse:after,.ps-pivot-collapse:after,.ps-column-group-collapse:after,.ps-pivotcol-collapse:after{content:"▶"}.ps-tree-expand:hover,.ps-tree-collapse:hover,.ps-master-detail-expand:hover,.ps-master-detail-collapse:hover,.ps-group-expand:hover,.ps-group-collapse:hover,.ps-pivot-expand:hover,.ps-pivot-collapse:hover,.ps-column-group-expand:hover,.ps-column-group-collapse:hover,.ps-pivotcol-expand:hover,.ps-pivotcol-collapse:hover{color:var(--ps-primary-color)}.ps-column-group-expand,.ps-column-group-collapse,.ps-pivotcol-expand,.ps-pivotcol-collapse{margin-right:0;margin-left:4px}.ps-row.ps-pivot-expandable .ps-cell:first-child .ps-cell-content{display:flex;align-items:center}.ps-multi-row-header{position:relative}.ps-multi-row-header-grid{position:relative;background:var(--ps-header-bg)}.ps-multirow-container{position:relative}.ps-multi-row-cell{position:absolute;box-sizing:border-box;contain:strict;display:flex;align-items:center;padding:var(--ps-cell-padding);background:var(--ps-bg-color);border-right:var(--ps-border-width) solid var(--ps-border-color);border-bottom:1px dashed var(--ps-border-color);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;-webkit-user-select:none;user-select:none}.ps-multi-row-cell.ps-last-row{border-bottom:1px solid var(--ps-border-color)}.ps-multi-row-cell.ps-first-column{border-left:none}.ps-multirow-container .ps-multi-row-cell.ps-first-column{padding-left:calc(var(--ps-group-indent, 0px) + 12px)}.ps-multi-row-cell.ps-rowspan{z-index:2;background:var(--ps-bg-color);border-right:var(--ps-border-width) solid var(--ps-border-color)}.ps-multi-row-header-grid .ps-multi-row-cell.ps-rowspan{background:var(--ps-header-bg)}.ps-multi-row-header-grid .ps-header-cell{background:var(--ps-header-bg);font-weight:var(--ps-header-font-weight);color:var(--ps-header-text);border-bottom:1px solid var(--ps-border-color)}.ps-multirow-container.ps-selected .ps-multi-row-cell{box-shadow:inset 0 0 0 9999px var(--ps-row-selected-bg)}:where(.ps-row.ps-row-alt) .ps-cell:where(:not(.ps-cell-merged-anchor):not(.ps-cell-readonly)){background:var(--ps-row-alt-bg)}.ps-mode-pivot .ps-row:not(.ps-row-subtotal):not(.ps-row-grandtotal):not(.ps-group-row) .ps-cells-left .ps-cell,.ps-mode-pivot .ps-merge-overlay .ps-cells-left .ps-cell.ps-merge-float{font-weight:500}.ps-row.ps-row-subtotal{background-color:var(--ps-subtotal-bg)}.ps-row.ps-row-subtotal .ps-cell:not(.ps-cell-merged-anchor){background-color:var(--ps-subtotal-bg);font-weight:600}.ps-row.ps-row-subtotal:hover .ps-cell:not(.ps-cell-merged-anchor){background-color:var(--ps-subtotal-hover-bg)}.ps-row.ps-row-grandtotal{background-color:var(--ps-grandtotal-bg)}.ps-row.ps-row-grandtotal .ps-cell:not(.ps-cell-merged-anchor){background-color:var(--ps-grandtotal-bg);font-weight:700}.ps-row.ps-row-grandtotal:hover .ps-cell:not(.ps-cell-merged-anchor){background-color:var(--ps-grandtotal-hover-bg)}.ps-cell.ps-cell-column-subtotal{background-color:var(--ps-column-subtotal-bg);font-weight:600}.ps-cell.ps-cell-column-grandtotal{background-color:var(--ps-grandtotal-bg);font-weight:700}.ps-outline-group-row{font-weight:600}.ps-outline-grandtotal-row{font-weight:700}.ps-row.ps-row-has-merge-anchor .ps-cells-left,.ps-row.ps-row-has-merge-anchor .ps-cells-right{z-index:3}.ps-cell.ps-cell-merged-anchor{display:flex;align-items:center;background:var(--ps-bg-color);z-index:1;overflow:hidden;border:var(--ps-border-width) solid var(--ps-border-color);border-top:none;border-left:none;box-sizing:border-box}.ps-dynamic-row-heights .ps-cell.ps-cell-merged-anchor{min-height:unset;overflow:visible}.ps-cell.ps-cell-merged-hidden{pointer-events:none;border-color:transparent}.ps-merge-overlay{position:absolute;top:0;left:0;display:flex;width:var(--ps-total-width, 100%);height:0;pointer-events:none;z-index:6}.ps-merge-overlay .ps-cells-left,.ps-merge-overlay .ps-cells-center,.ps-merge-overlay .ps-cells-right{height:0;background:transparent;box-shadow:none;pointer-events:none}.ps-cell.ps-merge-float{position:absolute;display:flex;align-items:center;background:var(--ps-bg-color);overflow:hidden;border:var(--ps-border-width) solid var(--ps-border-color);border-top:none;border-left:none;box-sizing:border-box;pointer-events:auto;cursor:default;user-select:none;-webkit-user-select:none}.ps-row .ps-cell.ps-cell-invalid{border-bottom:2px solid var(--ps-validation-error-color)}.ps-cell.ps-cell-invalid:after{content:"";position:absolute;right:0;bottom:0;width:0;height:0;border-style:solid;border-width:0 0 6px 6px;border-color:transparent transparent var(--ps-validation-error-color) transparent}.ps-theme-dark .ps-row .ps-cell.ps-cell-invalid{background-color:var(--ps-validation-error-bg);box-shadow:inset 2px 0 0 0 var(--ps-validation-error-color)}.ps-cell.ps-editing .ps-editor-invalid{border-color:var(--ps-validation-error-color);background-color:var(--ps-validation-error-bg)}.ps-cell-content>input.ps-cell-checkbox-input{margin:0;width:14px;height:14px;vertical-align:middle;cursor:pointer;pointer-events:none;accent-color:var(--ps-checkbox-checked)}.ps-cell[data-column-id=__drag_handle__]{padding:0;background:var(--ps-header-bg)}.ps-cell[data-column-id=__drag_handle__] .ps-cell-content{display:flex;justify-content:center}.ps-header-cell[data-column-id=__drag_handle__]{padding:0;background:var(--ps-header-bg)}.ps-cell[data-column-id=_rowHeader]{padding:var(--ps-cell-padding);cursor:pointer;-webkit-user-select:none;user-select:none;background:var(--ps-header-bg);border-right:1px solid var(--ps-border-color)}.ps-cell[data-column-id=_rowHeader] .ps-cell-content{display:flex;align-items:center;justify-content:center}.ps-header-cell[data-column-id=_rowHeader]{padding:0;background:var(--ps-header-bg)}.ps-cell-content>input.ps-row-header-checkbox-input{margin:0;width:14px;height:14px;cursor:pointer;accent-color:var(--ps-checkbox-checked)}.ps-dropdown-overlay{background:var(--ps-overlay-bg);border:1px solid var(--ps-overlay-border);border-radius:6px;box-shadow:var(--ps-overlay-shadow);overflow:hidden;display:flex;flex-direction:column}.ps-dropdown-search{padding:8px 10px;border:none;border-bottom:1px solid var(--ps-overlay-separator);font-size:13px;outline:none;width:100%;box-sizing:border-box;background:var(--ps-overlay-bg);color:var(--ps-overlay-text-strong)}.ps-dropdown-search:focus{border-bottom-color:var(--ps-overlay-accent)}.ps-dropdown-list{overflow-y:auto;max-height:250px}.ps-dropdown-item{padding:7px 10px;font-size:13px;cursor:pointer;display:flex;align-items:center;transition:background .1s}.ps-dropdown-item:hover,.ps-dropdown-item.focused{background:var(--ps-overlay-hover-bg)}.ps-dropdown-item.selected{font-weight:600;color:var(--ps-overlay-accent)}.ps-dropdown-item.selected:after{content:"";margin-left:auto;width:12px;height:12px;background-color:currentColor;-webkit-mask:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12' fill='none'><path d='M2.5 6.5L5 9L9.5 3.5' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/></svg>") no-repeat center / 12px 12px;mask:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12' fill='none'><path d='M2.5 6.5L5 9L9.5 3.5' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/></svg>") no-repeat center / 12px 12px}.ps-dropdown-empty{padding:12px 10px;font-size:13px;color:var(--ps-overlay-text-muted);text-align:center}.ps-multiselect-overlay{background:var(--ps-overlay-bg);border:1px solid var(--ps-overlay-border);border-radius:6px;box-shadow:var(--ps-overlay-shadow);overflow:hidden;display:flex;flex-direction:column}.ps-multiselect-search{padding:8px 10px;border:none;border-bottom:1px solid var(--ps-overlay-separator);font-size:13px;outline:none;width:100%;box-sizing:border-box;background:var(--ps-overlay-bg);color:var(--ps-overlay-text-strong)}.ps-multiselect-search:focus{border-bottom-color:var(--ps-overlay-accent)}.ps-multiselect-toggle-all{display:flex;align-items:center;gap:8px;padding:6px 10px;border-bottom:1px solid var(--ps-overlay-separator);cursor:pointer;font-size:12px;color:var(--ps-overlay-text-muted);-webkit-user-select:none;user-select:none}.ps-multiselect-toggle-all:hover{background:var(--ps-overlay-hover-bg)}.ps-multiselect-toggle-checkbox{margin:0;cursor:pointer;pointer-events:none;accent-color:var(--ps-overlay-accent)}.ps-multiselect-list{overflow-y:auto;max-height:220px}.ps-multiselect-item{padding:6px 10px;font-size:13px;cursor:pointer;display:flex;align-items:center;gap:8px;transition:background .1s}.ps-multiselect-item:hover,.ps-multiselect-item.focused{background:var(--ps-overlay-hover-bg)}.ps-multiselect-item.checked{color:var(--ps-overlay-accent)}.ps-multiselect-checkbox{margin:0;flex-shrink:0;cursor:pointer;pointer-events:none;accent-color:var(--ps-overlay-accent)}.ps-multiselect-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ps-multiselect-empty{padding:12px 10px;font-size:13px;color:var(--ps-overlay-text-muted);text-align:center}.ps-datepicker-overlay{background:var(--ps-overlay-bg);border:1px solid var(--ps-overlay-border);border-radius:8px;box-shadow:var(--ps-overlay-shadow);padding:12px;width:260px;-webkit-user-select:none;user-select:none}.ps-datepicker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}.ps-datepicker-nav{background:none;border:none;cursor:pointer;font-size:14px;padding:4px 8px;border-radius:4px;color:var(--ps-overlay-text);transition:background .15s}.ps-datepicker-nav:hover{background:var(--ps-overlay-btn-hover-bg)}.ps-datepicker-title{font-size:14px;font-weight:600;color:var(--ps-overlay-text-strong)}.ps-datepicker-daynames{display:grid;grid-template-columns:repeat(7,1fr);text-align:center;margin-bottom:4px}.ps-datepicker-dayname{font-size:11px;color:var(--ps-overlay-text-muted);padding:4px 0;font-weight:500}.ps-datepicker-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.ps-datepicker-day{display:flex;align-items:center;justify-content:center;width:32px;height:32px;font-size:13px;border-radius:50%;cursor:pointer;transition:background .1s;color:var(--ps-overlay-text)}.ps-datepicker-day:hover{background:var(--ps-overlay-hover-bg)}.ps-datepicker-day.today{border:1px solid var(--ps-overlay-accent);font-weight:600}.ps-datepicker-day.selected{background:var(--ps-overlay-accent);color:#fff;font-weight:600}.ps-datepicker-day.selected:hover{background:var(--ps-primary-color)}.ps-datepicker-day.sunday{color:var(--ps-sunday-color)}.ps-datepicker-day.saturday{color:var(--ps-saturday-color)}.ps-datepicker-day.selected.sunday,.ps-datepicker-day.selected.saturday{color:#fff}.ps-datepicker-day-empty{cursor:default}.ps-datepicker-day-empty:hover{background:transparent}.ps-datepicker-footer{display:flex;justify-content:space-between;margin-top:10px;padding-top:8px;border-top:1px solid var(--ps-overlay-separator)}.ps-datepicker-btn{background:none;border:1px solid var(--ps-overlay-border);border-radius:4px;padding:4px 12px;font-size:12px;cursor:pointer;color:var(--ps-overlay-text);transition:all .15s}.ps-datepicker-btn:hover{background:var(--ps-overlay-hover-bg);border-color:var(--ps-overlay-accent);color:var(--ps-overlay-accent)}.ps-datepicker-btn-clear:hover{background:var(--ps-overlay-danger-bg);border-color:var(--ps-overlay-danger);color:var(--ps-overlay-danger)}.ps-valuelist{display:flex;flex-direction:column;font-size:var(--ps-font-size, 12px);color:var(--ps-text-color, #333);background:var(--ps-bg-color, #fff)}.ps-valuelist-head{padding:6px 8px;background:var(--ps-bg-color, #fff);border-bottom:1px solid var(--ps-border-color, #e0e0e0)}.ps-valuelist-search{width:100%;box-sizing:border-box;height:26px;padding:0 8px;font-size:inherit;font-family:inherit;color:inherit;background:var(--ps-input-bg, #fff);border:1px solid var(--ps-border-color, #e0e0e0);border-radius:3px;outline:none}.ps-valuelist-search:focus{border-color:var(--ps-primary-color, #4568e0)}.ps-valuelist-toolbar{display:flex;align-items:center;justify-content:space-between;background:var(--ps-bg-color, #fff);border-bottom:1px solid var(--ps-border-color, #e0e0e0)}.ps-valuelist-picked-only{display:flex;align-items:center;gap:6px;margin-left:auto;padding:6px 10px;cursor:pointer;-webkit-user-select:none;user-select:none}.ps-valuelist-picked-only input{margin:0;cursor:pointer}.ps-valuelist-picked-only-label{font-size:12px;color:var(--ps-text-secondary, #666)}.ps-valuelist-all{display:flex;align-items:center;gap:6px;padding:6px 10px;background:var(--ps-bg-color, #fff);cursor:pointer;-webkit-user-select:none;user-select:none}.ps-valuelist-all input{margin:0;cursor:pointer}.ps-valuelist-viewport{overflow-y:auto;overflow-x:hidden;position:relative;background:var(--ps-bg-color, #fff)}.ps-valuelist-spacer{position:relative;width:100%}.ps-valuelist-item{display:flex;align-items:center;gap:6px;height:28px;padding:0 10px;box-sizing:border-box;cursor:pointer;-webkit-user-select:none;user-select:none}.ps-valuelist-item:hover{background:var(--ps-hover-bg, rgba(0, 0, 0, .04))}.ps-valuelist-item input{margin:0;flex-shrink:0;cursor:pointer}.ps-valuelist-item-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ps-valuelist-item.is-picked{background:var(--ps-picked-bg, rgba(69, 104, 224, .06));box-shadow:inset 2px 0 0 0 var(--ps-accent, #4568e0)}.ps-valuelist-item.is-picked:hover{background:var(--ps-picked-hover-bg, rgba(69, 104, 224, .12))}.ps-valuelist-item.is-pinned-last{box-shadow:inset 2px 0 0 0 var(--ps-accent, #4568e0),inset 0 -1px 0 0 var(--ps-pinned-divider, rgba(0, 0, 0, .12))}.ps-valuelist-notice{padding:6px 10px;font-size:11px;line-height:1.4;color:var(--ps-warning-text, #8a6d3b);background:var(--ps-warning-bg, #fcf8e3);border-top:1px solid var(--ps-border-color, #e0e0e0)}.ps-valuelist-state{padding:24px 10px;text-align:center;color:var(--ps-text-muted, #8998b5)}.ps-theme-excel{--ps-primary-color: #217346;--ps-bg-color: #ffffff;--ps-border-color: #d4d4d4;--ps-pinned-border-color: #b0b0b0;--ps-header-bg: #f3f3f3;--ps-header-text: #333333;--ps-cell-text: #333333;--ps-cell-readonly: #f9f9f9;--ps-row-hover-bg: #e8f3ed;--ps-row-selected-bg: rgba(33, 115, 70, .15);--ps-row-alt-bg: #fafafa;--ps-shadow-color: rgba(0, 0, 0, .08);--ps-cell-selected-bg: rgba(33, 115, 70, .18);--ps-cell-selected-border-color: #217346;--ps-selection-overlay-border-color: #217346;--ps-selection-overlay-border-width: 2px;--ps-text-secondary: #595959;--ps-text-muted: #888888;--ps-scrollbar-thumb: #c0c0c0;--ps-scrollbar-thumb-hover: #a0a0a0;--ps-overlay-bg: #ffffff;--ps-overlay-border: #c8c8c8;--ps-overlay-shadow: 0 2px 8px rgba(0, 0, 0, .15);--ps-overlay-separator: #e8e8e8;--ps-overlay-hover-bg: #f1f7f4;--ps-overlay-accent: #217346;--ps-overlay-text: #333333;--ps-overlay-text-strong: #1a1a1a;--ps-overlay-text-muted: #888888;--ps-overlay-btn-hover-bg: #f0f0f0;--ps-overlay-danger: #c5221f;--ps-overlay-danger-bg: #fef0f0;--ps-loading-bg: rgba(255, 255, 255, .8);--ps-group-row-hover-bg: #e0eee6;--ps-master-detail-row-bg: #fafafa;--ps-dirty-added-color: #2e7d32;--ps-dirty-added-bg: rgba(46, 125, 50, .08);--ps-dirty-modified-color: #f57c00;--ps-dirty-modified-bg: rgba(245, 124, 0, .08);--ps-dirty-modified-cell-bg: rgba(245, 124, 0, .18);--ps-dirty-deleted-color: #c5221f;--ps-dirty-deleted-bg: rgba(197, 34, 31, .08);--ps-dirty-reordered-color: #6a1b9a;--ps-dirty-reordered-bg: rgba(106, 27, 154, .07);--ps-validation-error-color: #c5221f;--ps-validation-error-bg: rgba(197, 34, 31, .06);--ps-subtotal-bg: #e8e8e8;--ps-subtotal-hover-bg: #e0e0e0;--ps-grandtotal-bg: #d8d8d8;--ps-grandtotal-hover-bg: #d0d0d0;--ps-column-subtotal-bg: #e8e8e8;--ps-statusbar-bg: #217346;--ps-statusbar-border: #1a5c38;--ps-statusbar-spinner-border: #4a9970;--ps-checkbox-border: #888888;--ps-checkbox-checked: #217346;--ps-sunday-color: #c5221f;--ps-saturday-color: #1a73e8;--ps-header-height: 36px;--ps-row-height: 36px;--ps-scrollbar-width: 14px;--ps-cell-padding: 0 var(--ps-cell-padding-side);--ps-cell-padding-side: 8px;--ps-border-width: 1px;--ps-group-indent: 0px;--ps-font-family: Calibri, "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;--ps-font-size: 13px;--ps-header-font-weight: 600;--ps-cell-flash-up-bg: rgba(33, 115, 70, .4);--ps-cell-flash-down-bg: rgba(197, 34, 31, .4);--ps-cell-flash-neutral-bg: rgba(245, 124, 0, .4);--ps-cell-flash-duration: .5s;--ps-cell-fade-duration: 1s}.ps-theme-sheets{--ps-primary-color: #1a73e8;--ps-bg-color: #ffffff;--ps-border-color: #e0e0e0;--ps-pinned-border-color: #c0c0c0;--ps-header-bg: #f8f9fa;--ps-header-text: #5f6368;--ps-cell-text: #202124;--ps-cell-readonly: #f1f3f4;--ps-row-hover-bg: #f1f3f4;--ps-row-selected-bg: rgba(26, 115, 232, .12);--ps-row-alt-bg: #fafbfc;--ps-shadow-color: rgba(60, 64, 67, .1);--ps-cell-selected-bg: rgba(26, 115, 232, .16);--ps-cell-selected-border-color: #1a73e8;--ps-selection-overlay-border-color: #1a73e8;--ps-selection-overlay-border-width: 1px;--ps-text-secondary: #5f6368;--ps-text-muted: #80868b;--ps-scrollbar-thumb: #dadce0;--ps-scrollbar-thumb-hover: #bdc1c6;--ps-overlay-bg: #ffffff;--ps-overlay-border: #dadce0;--ps-overlay-shadow: 0 4px 12px rgba(60, 64, 67, .15);--ps-overlay-separator: #e8eaed;--ps-overlay-hover-bg: #f1f3f4;--ps-overlay-accent: #1a73e8;--ps-overlay-text: #3c4043;--ps-overlay-text-strong: #202124;--ps-overlay-text-muted: #80868b;--ps-overlay-btn-hover-bg: #f1f3f4;--ps-overlay-danger: #d93025;--ps-overlay-danger-bg: #fce8e6;--ps-loading-bg: rgba(255, 255, 255, .85);--ps-group-row-hover-bg: #e8f0fe;--ps-master-detail-row-bg: #f8f9fa;--ps-dirty-added-color: #1e8e3e;--ps-dirty-added-bg: rgba(30, 142, 62, .08);--ps-dirty-modified-color: #f9ab00;--ps-dirty-modified-bg: rgba(249, 171, 0, .08);--ps-dirty-modified-cell-bg: rgba(249, 171, 0, .2);--ps-dirty-deleted-color: #d93025;--ps-dirty-deleted-bg: rgba(217, 48, 37, .08);--ps-dirty-reordered-color: #9334e6;--ps-dirty-reordered-bg: rgba(147, 52, 230, .07);--ps-validation-error-color: #d93025;--ps-validation-error-bg: rgba(217, 48, 37, .06);--ps-subtotal-bg: #e8f0fe;--ps-subtotal-hover-bg: #d2e3fc;--ps-grandtotal-bg: #d2e3fc;--ps-grandtotal-hover-bg: #aecbfa;--ps-column-subtotal-bg: #e8f0fe;--ps-statusbar-bg: #f8f9fa;--ps-statusbar-border: #dadce0;--ps-statusbar-spinner-border: #c0c8d4;--ps-checkbox-border: #80868b;--ps-checkbox-checked: #1a73e8;--ps-sunday-color: #d93025;--ps-saturday-color: #1a73e8;--ps-header-height: 36px;--ps-row-height: 36px;--ps-scrollbar-width: 12px;--ps-cell-padding: 0 var(--ps-cell-padding-side);--ps-cell-padding-side: 12px;--ps-border-width: 1px;--ps-group-indent: 0px;--ps-font-family: "Google Sans", Roboto, Arial, sans-serif;--ps-font-size: 13px;--ps-header-font-weight: 500;--ps-cell-flash-up-bg: rgba(30, 142, 62, .35);--ps-cell-flash-down-bg: rgba(217, 48, 37, .35);--ps-cell-flash-neutral-bg: rgba(249, 171, 0, .35);--ps-cell-flash-duration: .5s;--ps-cell-fade-duration: 1s}.ps-theme-material{--ps-primary-color: #3f51b5;--ps-bg-color: #ffffff;--ps-border-color: #e0e0e0;--ps-pinned-border-color: #bdbdbd;--ps-header-bg: #ffffff;--ps-header-text: rgba(0, 0, 0, .87);--ps-cell-text: rgba(0, 0, 0, .87);--ps-cell-readonly: #f5f5f5;--ps-row-hover-bg: rgba(63, 81, 181, .04);--ps-row-selected-bg: rgba(63, 81, 181, .08);--ps-row-alt-bg: #fafafa;--ps-shadow-color: rgba(0, 0, 0, .12);--ps-cell-selected-bg: rgba(63, 81, 181, .16);--ps-cell-selected-border-color: #3f51b5;--ps-selection-overlay-border-color: #3f51b5;--ps-selection-overlay-border-width: 1px;--ps-text-secondary: rgba(0, 0, 0, .6);--ps-text-muted: rgba(0, 0, 0, .38);--ps-scrollbar-thumb: #bdbdbd;--ps-scrollbar-thumb-hover: #9e9e9e;--ps-overlay-bg: #ffffff;--ps-overlay-border: rgba(0, 0, 0, .12);--ps-overlay-shadow: 0 5px 5px -3px rgba(0, 0, 0, .2), 0 8px 10px 1px rgba(0, 0, 0, .14), 0 3px 14px 2px rgba(0, 0, 0, .12);--ps-overlay-separator: rgba(0, 0, 0, .12);--ps-overlay-hover-bg: rgba(63, 81, 181, .08);--ps-overlay-accent: #3f51b5;--ps-overlay-text: rgba(0, 0, 0, .87);--ps-overlay-text-strong: rgba(0, 0, 0, 1);--ps-overlay-text-muted: rgba(0, 0, 0, .6);--ps-overlay-btn-hover-bg: rgba(0, 0, 0, .04);--ps-overlay-danger: #f44336;--ps-overlay-danger-bg: #ffebee;--ps-loading-bg: rgba(255, 255, 255, .85);--ps-group-row-hover-bg: rgba(63, 81, 181, .08);--ps-master-detail-row-bg: #fafafa;--ps-dirty-added-color: #43a047;--ps-dirty-added-bg: rgba(67, 160, 71, .08);--ps-dirty-modified-color: #fb8c00;--ps-dirty-modified-bg: rgba(251, 140, 0, .08);--ps-dirty-modified-cell-bg: rgba(251, 140, 0, .2);--ps-dirty-deleted-color: #e53935;--ps-dirty-deleted-bg: rgba(229, 57, 53, .08);--ps-dirty-reordered-color: #8e24aa;--ps-dirty-reordered-bg: rgba(142, 36, 170, .07);--ps-validation-error-color: #f44336;--ps-validation-error-bg: rgba(244, 67, 54, .06);--ps-subtotal-bg: #e8eaf6;--ps-subtotal-hover-bg: #c5cae9;--ps-grandtotal-bg: #c5cae9;--ps-grandtotal-hover-bg: #9fa8da;--ps-column-subtotal-bg: #e8eaf6;--ps-statusbar-bg: #fafafa;--ps-statusbar-border: #e0e0e0;--ps-statusbar-spinner-border: #c0c8d4;--ps-checkbox-border: rgba(0, 0, 0, .54);--ps-checkbox-checked: #3f51b5;--ps-sunday-color: #f44336;--ps-saturday-color: #2196f3;--ps-header-height: 36px;--ps-row-height: 36px;--ps-scrollbar-width: 12px;--ps-cell-padding: 0 var(--ps-cell-padding-side);--ps-cell-padding-side: 16px;--ps-border-width: 1px;--ps-group-indent: 0px;--ps-font-family: Roboto, "Helvetica Neue", Arial, sans-serif;--ps-font-size: 14px;--ps-header-font-weight: 500;--ps-cell-flash-up-bg: rgba(67, 160, 71, .4);--ps-cell-flash-down-bg: rgba(229, 57, 53, .4);--ps-cell-flash-neutral-bg: rgba(251, 140, 0, .4);--ps-cell-flash-duration: .5s;--ps-cell-fade-duration: 1s}.ps-header-cell.ps-dragging{opacity:.5}.ps-drop-indicator{position:absolute;top:0;bottom:0;width:3px;background:var(--ps-primary-color);z-index:20000;pointer-events:none}.ps-status-bar{display:flex;justify-content:space-between;align-items:center;height:16px;padding:0 8px;background-color:var(--ps-statusbar-bg);border-top:1px solid var(--ps-statusbar-border);font-size:11px;color:var(--ps-text-secondary);flex-shrink:0;-webkit-user-select:none;user-select:none}.ps-status-bar__timing{display:flex;gap:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ps-status-bar__aggregates{flex:1;text-align:right;padding-right:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ps-status-bar__row-count{white-space:nowrap;margin-left:auto}.ps-status-bar__activity{display:none;align-items:center;gap:4px;padding:0 8px 0 0;white-space:nowrap}.ps-status-bar__spinner{display:inline-block;width:10px;height:10px;border:1.5px solid var(--ps-statusbar-spinner-border);border-top-color:var(--ps-primary-color);border-radius:50%;animation:ps-spin .7s linear infinite;flex-shrink:0}.ps-status-bar__activity-label{font-size:11px;color:var(--ps-primary-color);font-weight:500}.mzc-client-excel-body{height:100%;display:flex;flex-direction:column}.mzc-client-excel-options{display:flex;gap:8px;padding:0 0 12px;justify-content:space-between;align-items:flex-end}.mzc-client-excel-options .mzc-client-excel-option{display:flex;align-items:center;gap:8px;font-size:12px}.mzc-client-excel-options .mzc-client-excel-option--grow{flex:1}.mzc-client-excel-options .mzc-client-excel-option__label{color:var(--mzc-fg-muted, #6a7184);font-weight:500;min-width:56px}.mzc-client-excel-dropzone{flex:1;min-height:220px;background-color:var(--mzc-dropzone-bg, #f8f8fd);border:1px dashed var(--mzc-accent, #4568e0);display:flex;align-items:center;justify-content:center;flex-direction:column;gap:10px;font-size:13px;cursor:pointer}.mzc-client-excel-dropzone>*{pointer-events:none}.mzc-client-excel-dropzone.is-active{border-style:solid}.mzc-client-excel-dropzone__text{text-align:center;color:var(--mzc-fg-muted, #6a7184);font-weight:400}.mzc-client-excel-dropzone__line{display:block}.mzc-client-excel-dropzone__accent{color:var(--mzc-accent, #4568e0)}.mzc-client-excel-dropzone__error{color:var(--mzc-toast-error, #dc5a5a)}.mzc-client-excel-popup .mzc-popup-footer .mzc-btn{min-width:80px}.moz-grid-chrome[data-v-eac44841]{overflow:hidden}
1
+ .mzc-toast-container{position:fixed;top:16px;right:16px;z-index:var(--mzc-z-toast, 2500);display:flex;flex-direction:column;gap:8px;pointer-events:none}.mzc-toast{pointer-events:auto;min-width:200px;max-width:420px;padding:10px 14px;border-radius:6px;border:1px solid var(--mzc-border, #bbc6d9);border-left-width:4px;background:var(--mzc-bg, #fff);color:var(--mzc-fg, #1f2937);font-size:13px;line-height:1.4;box-shadow:0 4px 12px #0000001f;cursor:pointer;animation:mzc-toast-in .16s ease-out}.mzc-toast--success{border-left-color:var(--mzc-toast-success, #22a06b)}.mzc-toast--error{border-left-color:var(--mzc-toast-error, #dc5a5a)}.mzc-toast--warning{border-left-color:var(--mzc-toast-warning, #e39b1b)}.mzc-toast--info{border-left-color:var(--mzc-accent, #3b82f6)}@keyframes mzc-toast-in{0%{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:translateY(0)}}.ps-theme-light{--ps-primary-color: #4568e0;--ps-bg-color: #ffffff;--ps-border-color: rgb(187, 198, 217);--ps-pinned-border-color: rgb(108, 128, 170);--ps-header-bg: rgb(222, 224, 239);--ps-header-text: rgb(67, 76, 96);--ps-cell-text: rgb(67, 76, 96);--ps-cell-readonly: rgb(244, 244, 249);--ps-row-hover-bg: #f0f7ff;--ps-row-selected-bg: rgba(69, 104, 224, .2);--ps-row-alt-bg: rgb(248, 248, 253);--ps-shadow-color: rgba(0, 0, 0, .1);--ps-cell-selected-bg: rgba(69, 104, 224, .16);--ps-cell-selected-border-color: rgba(69, 104, 224, .6);--ps-selection-overlay-border-color: rgba(69, 104, 224, 1);--ps-selection-overlay-border-width: 2px;--ps-text-secondary: #666;--ps-text-muted: #999;--ps-scrollbar-thumb: #bbc6d9;--ps-scrollbar-thumb-hover: #bbc6d9;--ps-overlay-bg: #fff;--ps-overlay-border: #d0d5dd;--ps-overlay-shadow: 0 4px 16px rgba(0, 0, 0, .12);--ps-overlay-separator: #e5e7eb;--ps-overlay-hover-bg: #f0f4ff;--ps-overlay-accent: #4a7cff;--ps-overlay-text: #374151;--ps-overlay-text-strong: #111827;--ps-overlay-text-muted: #9ca3af;--ps-overlay-btn-hover-bg: #f3f4f6;--ps-overlay-danger: #ef4444;--ps-overlay-danger-bg: #fef2f2;--ps-loading-bg: rgba(255, 255, 255, .8);--ps-group-row-hover-bg: #e3f2fd;--ps-master-detail-row-bg: #fafafa;--ps-dirty-added-color: #4caf50;--ps-dirty-added-bg: rgba(76, 175, 80, .08);--ps-dirty-modified-color: #ffc107;--ps-dirty-modified-bg: rgba(255, 193, 7, .08);--ps-dirty-modified-cell-bg: rgba(255, 193, 7, .2);--ps-dirty-deleted-color: #f44336;--ps-dirty-deleted-bg: rgba(244, 67, 54, .08);--ps-dirty-reordered-color: #7b1fa2;--ps-dirty-reordered-bg: rgba(123, 31, 162, .07);--ps-validation-error-color: #e53935;--ps-validation-error-bg: rgba(229, 57, 53, .06);--ps-subtotal-bg: #d6def8;--ps-subtotal-hover-bg: #d6def8;--ps-grandtotal-bg: #d6def8;--ps-grandtotal-hover-bg: #d6def8;--ps-column-subtotal-bg: #d6def8;--ps-statusbar-bg: #f8f9fa;--ps-statusbar-border: #e0e0e0;--ps-statusbar-spinner-border: #c0c8d4;--ps-checkbox-border: #98a2b3;--ps-checkbox-checked: #3b82f6;--ps-sunday-color: #ef4444;--ps-saturday-color: #3b82f6;--ps-header-height: 36px;--ps-row-height: 36px;--ps-scrollbar-width: 8px;--ps-cell-padding: 0 var(--ps-cell-padding-side);--ps-cell-padding-side: 10px;--ps-border-width: 1px;--ps-group-indent: 0px;--ps-font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--ps-font-size: 13px;--ps-header-font-weight: 500;--ps-cell-flash-up-bg: rgba(22, 160, 133, .4);--ps-cell-flash-down-bg: rgba(231, 76, 60, .4);--ps-cell-flash-neutral-bg: rgba(241, 196, 15, .4);--ps-cell-flash-duration: .5s;--ps-cell-fade-duration: 1s}.ps-theme-dark{--ps-primary-color: #4568e0;--ps-bg-color: #1e1e1e;--ps-border-color: #3c3c3c;--ps-pinned-border-color: #6e6e6e;--ps-header-bg: #2d2d2d;--ps-header-text: #e0e0e0;--ps-cell-text: #d4d4d4;--ps-cell-readonly: #2a2a2e;--ps-row-hover-bg: #2a2d2e;--ps-row-selected-bg: rgba(69, 104, 224, .2);--ps-row-alt-bg: #252526;--ps-shadow-color: rgba(0, 0, 0, .3);--ps-cell-selected-bg: rgba(69, 104, 224, .16);--ps-cell-selected-border-color: rgba(69, 104, 224, 1);--ps-selection-overlay-border-color: rgba(69, 104, 224, 1);--ps-selection-overlay-border-width: 2px;--ps-text-secondary: #9ca3af;--ps-text-muted: #666;--ps-scrollbar-thumb: #555;--ps-scrollbar-thumb-hover: #777;--ps-overlay-bg: #1e2330;--ps-overlay-border: #2d3446;--ps-overlay-shadow: 0 4px 16px rgba(0, 0, 0, .4);--ps-overlay-separator: #2d3446;--ps-overlay-hover-bg: #2a3142;--ps-overlay-accent: #6b9aff;--ps-overlay-text: #d1d5db;--ps-overlay-text-strong: #e5e7eb;--ps-overlay-text-muted: #6b7280;--ps-overlay-btn-hover-bg: #2a3142;--ps-overlay-danger: #f87171;--ps-overlay-danger-bg: rgba(239, 68, 68, .1);--ps-loading-bg: rgba(0, 0, 0, .5);--ps-group-row-hover-bg: #094771;--ps-master-detail-row-bg: #1e1e1e;--ps-dirty-added-color: #4caf50;--ps-dirty-added-bg: rgba(76, 175, 80, .15);--ps-dirty-modified-color: #ffc107;--ps-dirty-modified-bg: rgba(255, 193, 7, .15);--ps-dirty-modified-cell-bg: rgba(255, 193, 7, .25);--ps-dirty-deleted-color: #f44336;--ps-dirty-deleted-bg: rgba(244, 67, 54, .15);--ps-dirty-reordered-color: #7b1fa2;--ps-dirty-reordered-bg: rgba(123, 31, 162, .1);--ps-validation-error-color: #ef5350;--ps-validation-error-bg: rgba(239, 83, 80, .1);--ps-subtotal-bg: #2a3441;--ps-subtotal-hover-bg: #343f4f;--ps-grandtotal-bg: #1e2631;--ps-grandtotal-hover-bg: #283040;--ps-column-subtotal-bg: #2a3441;--ps-statusbar-bg: #1a1f2e;--ps-statusbar-border: #2d3446;--ps-statusbar-spinner-border: #3d4556;--ps-checkbox-border: #667085;--ps-checkbox-checked: #3b82f6;--ps-sunday-color: #f87171;--ps-saturday-color: #60a5fa;--ps-header-height: 36px;--ps-row-height: 36px;--ps-scrollbar-width: 10px;--ps-cell-padding: 0 var(--ps-cell-padding-side);--ps-cell-padding-side: 10px;--ps-border-width: 1px;--ps-group-indent: 0px;--ps-font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;--ps-font-size: 13px;--ps-header-font-weight: 500;--ps-cell-flash-up-bg: rgba(22, 160, 133, .4);--ps-cell-flash-down-bg: rgba(231, 76, 60, .4);--ps-cell-flash-neutral-bg: rgba(241, 196, 15, .4);--ps-cell-flash-duration: .5s;--ps-cell-fade-duration: 1s}.ps-grid-container.ps-selection-row,.ps-grid-container.ps-selection-range{--ps-row-selected-bg: var(--ps-cell-selected-bg)}.ps-grid-container{height:100%;position:relative;display:flex;flex-direction:column;isolation:isolate;overflow:hidden;background:var(--ps-bg-color);font-family:var(--ps-font-family);font-size:var(--ps-font-size);color:var(--ps-cell-text);box-sizing:border-box;outline:none}.ps-grid-container *,.ps-grid-container *:before,.ps-grid-container *:after{box-sizing:border-box}.ps-main-area{flex:1;display:flex;flex-direction:row;overflow:hidden;min-height:0}.ps-content-wrapper{flex:1;display:flex;flex-direction:column;overflow:hidden;min-width:0}.ps-scroll-area-x{flex-shrink:0;display:flex;flex-direction:row;background:var(--ps-bg-color)}.ps-header{flex-shrink:0;background:var(--ps-header-bg);overflow-x:auto;overflow-y:hidden;z-index:10000}.ps-header::-webkit-scrollbar{display:none}.ps-header{-ms-overflow-style:none;scrollbar-width:none}.ps-header-row{display:flex;height:var(--ps-header-height);width:var(--ps-total-width, 100%);position:relative;background:var(--ps-header-bg)}.ps-row .ps-cells-center .ps-cell.ps-group-indent-cell{padding-left:calc(var(--ps-group-indent, 0px) + var(--ps-cell-padding-side))}.ps-header-cell{position:absolute;top:0;display:flex;align-items:center;padding:var(--ps-cell-padding);font-weight:var(--ps-header-font-weight);color:var(--ps-header-text);border-right:var(--ps-border-width) solid var(--ps-border-color);border-bottom:1px solid var(--ps-border-color);-webkit-user-select:none;user-select:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;height:100%;box-sizing:border-box}.ps-header-cell .ps-header-text{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ps-pivot-header-text{min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:center}.ps-resize-handle{position:absolute;top:0;right:0;width:6px;height:100%;cursor:col-resize;background:transparent;z-index:1}.ps-resize-handle:hover{background:var(--ps-primary-color)}.ps-sort-icon{flex-shrink:0;margin-left:4px;opacity:.6}.ps-header-cell.ps-sorted .ps-sort-icon{opacity:1}.ps-header-cell.ps-sort-asc .ps-sort-icon:before{content:"▲"}.ps-header-cell.ps-sort-desc .ps-sort-icon:before{content:"▼"}.ps-sort-icon[data-sort-seq]:after{content:attr(data-sort-seq);font-size:9px;margin-left:1px;opacity:.7;vertical-align:super}.ps-filter-icon{flex-shrink:0;margin-left:4px;opacity:.6}.ps-header-cell.ps-filtered .ps-filter-icon{opacity:1}.ps-header-cell.ps-filtered .ps-filter-icon:before{content:"f"}.ps-body{flex:1;position:relative;overflow:hidden;display:flex;flex-direction:column}.ps-scroll-wrapper{flex:1;position:relative;overflow:hidden}.ps-scroll-proxy-y{flex-shrink:0;overflow-y:auto;overflow-x:hidden;z-index:5;background:var(--ps-bg-color)}.ps-scroll-proxy-y::-webkit-scrollbar{width:var(--ps-scrollbar-width)}.ps-scroll-proxy-y::-webkit-scrollbar-track{background:var(--ps-bg-color)}.ps-scroll-proxy-y::-webkit-scrollbar-thumb{background:var(--ps-scrollbar-thumb)}.ps-scroll-proxy-y::-webkit-scrollbar-thumb:hover{background:var(--ps-scrollbar-thumb-hover)}.ps-scroll-spacer-y{width:1px}.ps-scroll-proxy-x{flex:1;overflow-x:auto;overflow-y:hidden;z-index:5;background:var(--ps-bg-color)}.ps-scroll-proxy-x::-webkit-scrollbar{height:var(--ps-scrollbar-width)}.ps-scroll-proxy-x::-webkit-scrollbar-track{background:var(--ps-bg-color)}.ps-scroll-proxy-x::-webkit-scrollbar-thumb{background:var(--ps-scrollbar-thumb)}.ps-scroll-proxy-x::-webkit-scrollbar-thumb:hover{background:var(--ps-scrollbar-thumb-hover)}.ps-scroll-spacer-x{display:block;height:1px}.ps-scroll-corner{flex-shrink:0;width:var(--ps-scrollbar-width);background:var(--ps-bg-color)}.ps-viewport{position:absolute;top:0;left:0;right:0;bottom:0;overflow-x:auto;overflow-y:auto}.ps-viewport::-webkit-scrollbar{width:0;height:0;display:none}.ps-viewport{-ms-overflow-style:none;scrollbar-width:none}.ps-row-container{position:relative;width:var(--ps-total-width, 100%)}.ps-row{position:absolute;left:0;display:flex;height:var(--ps-row-height);width:var(--ps-total-width, 100%);will-change:transform;contain:layout style}.ps-cells-left,.ps-cells-center,.ps-cells-right{position:relative;height:100%;flex-shrink:0}.ps-cells-left{position:sticky;left:0;z-index:2;background:inherit;width:var(--ps-left-total-width, 0px);height:100%}.ps-cells-right{position:sticky;right:0;z-index:2;background:inherit;width:var(--ps-right-total-width, 0px);height:100%}.ps-cells-center{position:relative;width:var(--ps-center-total-width, 0px);height:100%}.ps-cell{position:absolute;top:0;display:flex;align-items:center;height:100%;padding:var(--ps-cell-padding);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;background:var(--ps-bg-color);border-right:var(--ps-border-width) solid var(--ps-border-color);border-bottom:var(--ps-border-width) solid var(--ps-border-color);contain:strict;box-sizing:border-box}.ps-cell-content{width:100%;display:inline-block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ps-dynamic-row-heights .ps-cell{contain:content;height:auto;min-height:100%}.ps-cell.ps-editing{overflow:visible;outline:2px solid var(--ps-primary-color);outline-offset:-2px}.ps-cell.ps-editing input,.ps-cell.ps-editing select,.ps-cell.ps-editing textarea{flex:1;min-width:0;align-self:stretch;padding:0;margin:0;border:none;outline:none;font-family:inherit;font-size:inherit;background:transparent;color:var(--ps-cell-text);box-sizing:border-box}.ps-cell.ps-editing input[type=number]::-webkit-inner-spin-button,.ps-cell.ps-editing input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.ps-cell.ps-editing input[type=number]{-moz-appearance:textfield;-webkit-appearance:textfield;appearance:textfield}.ps-cell.ps-cell-readonly{background:var(--ps-cell-readonly);color:var(--ps-cell-text)}.ps-empty-state{display:flex;align-items:center;justify-content:center;height:100%;color:var(--ps-text-muted);font-size:16px}.ps-loading{position:absolute;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;background:var(--ps-loading-bg);z-index:20000}.ps-loading-spinner{width:32px;height:32px;border:3px solid var(--ps-border-color);border-top-color:var(--ps-primary-color);border-radius:50%;animation:ps-spin .8s linear infinite}@keyframes ps-spin{to{transform:rotate(360deg)}}.ps-pinned-top,.ps-pinned-bottom{flex-shrink:0;background:var(--ps-bg-color)}.ps-pinned-row{display:flex;background:var(--ps-bg-color);width:var(--ps-total-width, 100%);position:relative}.ps-pinned-row .ps-cells-left,.ps-pinned-row .ps-cells-center,.ps-pinned-row .ps-cells-right{position:relative;height:100%;flex-shrink:0}.ps-pinned-row .ps-cells-left{position:sticky;left:0;z-index:2;background:var(--ps-bg-color);width:var(--ps-left-total-width, 0px)}.ps-pinned-row .ps-cells-center{position:relative;width:var(--ps-center-total-width, 0px)}.ps-pinned-row .ps-cells-right{position:sticky;right:0;z-index:2;background:var(--ps-bg-color);width:var(--ps-right-total-width, 0px)}.ps-column-group-row>.ps-cells-left>.ps-header-cell,.ps-column-group-row>.ps-cells-right>.ps-header-cell{background:var(--ps-header-bg)}.ps-grid-container.ps-has-top-pinned .ps-pinned-top:after{content:"";position:absolute;bottom:0;left:0;right:0;height:0;border-bottom:1px solid var(--ps-pinned-border-color);z-index:3;pointer-events:none}.ps-grid-container.ps-has-bottom-pinned .ps-pinned-bottom:before{content:"";position:absolute;top:0;left:0;right:0;height:0;border-top:1px solid var(--ps-pinned-border-color);z-index:3;pointer-events:none}.ps-grid-container.ps-has-left-pinned .ps-row>.ps-cells-left>.ps-cell:last-child,.ps-grid-container.ps-has-left-pinned .ps-pinned-row>.ps-cells-left>.ps-cell:last-child,.ps-grid-container.ps-has-left-pinned .ps-header-row>.ps-cells-left>.ps-header-cell:last-child{border-right-color:var(--ps-pinned-border-color)}.ps-grid-container.ps-has-right-pinned .ps-row>.ps-cells-right>.ps-cell:nth-child(1),.ps-grid-container.ps-has-right-pinned .ps-pinned-row>.ps-cells-right>.ps-cell:nth-child(1),.ps-grid-container.ps-has-right-pinned .ps-header-row>.ps-cells-right>.ps-header-cell:nth-child(1){border-left:1px solid var(--ps-pinned-border-color)}.ps-pivot-header-left:after{content:"";position:absolute;top:0;right:0;width:0;height:100%;border-right:1px solid var(--ps-pinned-border-color);z-index:3;pointer-events:none}.ps-row.ps-selected .ps-cell,.ps-row.ps-selected .ps-cell.ps-cell-merged-anchor,.ps-cell.ps-merge-float.ps-cell-row-selected{box-shadow:inset 0 0 0 9999px var(--ps-row-selected-bg)}.ps-row .ps-cell.ps-cell-selected,.ps-merge-overlay .ps-merge-float.ps-cell-selected{border-right-color:var(--ps-cell-selected-border-color);border-bottom-color:var(--ps-cell-selected-border-color)}.ps-selection-overlay{position:absolute;top:0;left:0;display:flex;width:var(--ps-total-width, 100%);height:0;pointer-events:none;z-index:7}.ps-selection-overlay .ps-cells-left,.ps-selection-overlay .ps-cells-center,.ps-selection-overlay .ps-cells-right{height:0;background:transparent;box-shadow:none;pointer-events:none}.ps-selection-overlay-region{position:absolute;border:var(--ps-selection-overlay-border-width, 1px) solid var(--ps-selection-overlay-border-color);box-sizing:border-box;pointer-events:none;box-shadow:inset 0 0 0 9999px var(--ps-cell-selected-bg)}.ps-body.ps-dragging,.ps-body.ps-dragging *{cursor:crosshair;-webkit-user-select:none;user-select:none}.ps-row.ps-row-added{background-color:var(--ps-dirty-added-bg)}.ps-row.ps-row-added:after{content:"";height:100%;border-left:3px solid var(--ps-dirty-added-color);position:absolute}.ps-row.ps-row-added .ps-cell{background-color:var(--ps-dirty-added-bg)}.ps-row.ps-row-modified{background-color:var(--ps-dirty-modified-bg)}.ps-row.ps-row-modified:after{content:"";height:100%;border-left:3px solid var(--ps-dirty-modified-color);position:absolute}.ps-row.ps-row-modified .ps-cell{background-color:var(--ps-dirty-modified-bg)}.ps-row .ps-cell.ps-cell-modified{background-color:var(--ps-dirty-modified-cell-bg)}.ps-row.ps-row-deleted{background-color:var(--ps-dirty-deleted-bg);opacity:.6}.ps-row.ps-row-deleted:after{content:"";height:100%;border-left:3px solid var(--ps-dirty-deleted-color);position:absolute}.ps-row.ps-row-deleted .ps-cell{background-color:var(--ps-dirty-deleted-bg);text-decoration:line-through;color:var(--ps-text-muted)}.ps-row.ps-row-readonly .ps-cell{background-color:var(--ps-cell-readonly);cursor:not-allowed}.ps-row.ps-selected.ps-row-readonly .ps-cell{box-shadow:inset 0 0 0 9999px var(--ps-row-selected-bg)}.ps-row.ps-row-reordered:after{content:"";position:absolute;left:0;top:0;height:100%;width:3px;background:var(--ps-dirty-reordered-color);pointer-events:none}.ps-row.ps-row-reordered .ps-cell{background-color:var(--ps-dirty-reordered-bg)}.ps-row.ps-row-dragging{opacity:.4;transition:opacity 80ms ease-out}.ps-row.ps-row-drop-target:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;z-index:5;background-color:#3b82f62e;box-shadow:inset 0 0 0 2px #3b82f6d9;transition:background-color 80ms ease-out,box-shadow 80ms ease-out}.ps-row.ps-row-drop-target-invalid:before{background-color:#ef44442e;box-shadow:inset 0 0 0 2px #ef4444d9}.ps-drag-handle{cursor:grab;color:var(--ps-text-muted);font-size:14px;-webkit-user-select:none;user-select:none;line-height:1}.ps-drag-handle:hover{color:var(--ps-text-secondary)}.ps-drag-handle:active{cursor:grabbing}.ps-sort-active .ps-drag-handle{cursor:not-allowed;opacity:.4}.ps-row-drop-indicator{position:absolute;left:0;height:2px;background:var(--ps-primary-color);pointer-events:none;z-index:100;transition:top .05s ease}.ps-drag-ghost{position:fixed;z-index:10000;padding:4px 12px;background:var(--ps-bg-color);border:1px solid var(--ps-primary-color);border-radius:4px;box-shadow:0 2px 8px var(--ps-shadow-color);font-size:12px;color:var(--ps-cell-text);pointer-events:none;opacity:.9}.ps-drag-ghost.ps-drag-ghost-multi{box-shadow:4px 4px 0 -1px var(--ps-bg-color),4px 4px 0 0 var(--ps-primary-color),8px 8px 0 -1px var(--ps-bg-color),8px 8px 0 0 var(--ps-primary-color),0 2px 8px var(--ps-shadow-color);font-weight:600}.ps-drag-ghost.ps-drag-ghost-multi-large{box-shadow:4px 4px 0 -1px var(--ps-bg-color),4px 4px 0 0 var(--ps-primary-color),0 2px 8px var(--ps-shadow-color)}.ps-row-drop-indicator.invalid{background:#f44336;height:3px}.ps-row-drop-indicator.invalid[data-reason]:after{content:attr(data-reason);position:absolute;top:-22px;left:8px;background:#f44336;color:#fff;padding:2px 8px;border-radius:4px;font-size:11px;white-space:nowrap;box-shadow:0 2px 4px #0003}body.ps-cross-grid-invalid,body.ps-cross-grid-invalid *{cursor:no-drop!important}.ps-row.ps-selected.ps-row-added .ps-cell{box-shadow:inset 0 0 0 9999px var(--ps-row-selected-bg)}.ps-row.ps-row-added .ps-cell.ps-cell-selected{box-shadow:inset 0 0 0 9999px var(--ps-cell-selected-bg)}.ps-row.ps-selected.ps-row-modified .ps-cell{box-shadow:inset 0 0 0 9999px var(--ps-row-selected-bg)}.ps-row.ps-row-modified .ps-cell.ps-cell-selected{box-shadow:inset 0 0 0 9999px var(--ps-cell-selected-bg)}.ps-row.ps-selected.ps-row-deleted .ps-cell{box-shadow:inset 0 0 0 9999px var(--ps-row-selected-bg)}.ps-row.ps-row-deleted .ps-cell.ps-cell-selected{box-shadow:inset 0 0 0 9999px var(--ps-cell-selected-bg)}.ps-row.ps-selected.ps-row-reordered .ps-cell{box-shadow:inset 0 0 0 9999px var(--ps-row-selected-bg)}.ps-row.ps-row-reordered .ps-cell.ps-cell-selected{box-shadow:inset 0 0 0 9999px var(--ps-cell-selected-bg)}.ps-cell-flash-up{background-color:var(--ps-cell-flash-up-bg)!important;transition:none}.ps-cell-flash-down{background-color:var(--ps-cell-flash-down-bg)!important;transition:none}.ps-cell-flash-neutral{background-color:var(--ps-cell-flash-neutral-bg)!important;transition:none}.ps-cell-flash-fade{transition:background-color var(--ps-cell-fade-duration, 1s) ease-out;background-color:transparent!important}.ps-row.ps-group-row{background:linear-gradient(to right,var(--ps-row-alt-bg),var(--ps-bg-color));border-bottom:1px solid var(--ps-border-color);border-right:1px solid var(--ps-border-color);cursor:pointer;-webkit-user-select:none;user-select:none;width:var(--ps-total-width, 100%)}.ps-row.ps-group-row .ps-cells-center{position:relative}.ps-row.ps-group-row .ps-cell{border-bottom:none}.ps-row.ps-group-row .ps-cells-center .ps-cell{background:transparent}.ps-row.ps-group-row .ps-cells-left .ps-cell,.ps-row.ps-group-row .ps-cells-right .ps-cell{background:var(--ps-row-alt-bg)}.ps-cell.ps-merge-float.ps-group-banner-float{background:linear-gradient(to right,var(--ps-row-alt-bg),var(--ps-bg-color));border-right:var(--ps-border-width) solid var(--ps-border-color);border-bottom:var(--ps-border-width) solid var(--ps-border-color);pointer-events:none;white-space:nowrap;color:var(--ps-cell-text)}.ps-cell.ps-merge-float.ps-group-banner-float.ps-group-banner-hover{background:linear-gradient(to right,var(--ps-group-row-hover-bg),var(--ps-bg-color))}.ps-row.ps-group-row:hover .ps-cells-left .ps-cell,.ps-row.ps-group-row:hover .ps-cells-right .ps-cell,.ps-row.ps-group-row:hover .ps-cells-center .ps-cell.ps-group-standalone-cell{background:var(--ps-group-row-hover-bg)}.ps-group-expand,.ps-group-collapse{margin-right:8px;color:var(--ps-cell-text)}.ps-group-label{font-weight:500}.ps-group-label strong{color:var(--ps-primary-color)}.ps-group-aggregates{font-size:13px;margin-left:16px;color:var(--ps-text-secondary, #666)}.ps-group-aggregate{color:var(--ps-header-text);margin-right:12px}.ps-row.ps-group-row .ps-cells-center .ps-cell.ps-group-standalone-cell{background:var(--ps-row-alt-bg);z-index:1}.ps-master-detail-row{border-bottom:1px solid var(--ps-border-color);background:var(--ps-master-detail-row-bg)}.ps-master-detail-row .ps-cells-center{display:block;padding:12px 16px;overflow:hidden}.ps-tree-expand,.ps-tree-collapse,.ps-master-detail-expand,.ps-master-detail-collapse,.ps-group-expand,.ps-group-collapse,.ps-pivot-expand,.ps-pivot-collapse,.ps-column-group-expand,.ps-column-group-collapse,.ps-pivotcol-expand,.ps-pivotcol-collapse{border:none;background:none;padding:0;font:inherit;outline:inherit;display:inline-block;width:16px;text-align:center;font-size:10px;cursor:pointer;-webkit-user-select:none;user-select:none;color:var(--ps-text-secondary);transition:color .15s;flex-shrink:0;margin-right:4px}.ps-tree-expand:after,.ps-master-detail-expand:after,.ps-group-expand:after,.ps-pivot-expand:after,.ps-column-group-expand:after,.ps-pivotcol-expand:after{content:"▼"}.ps-tree-collapse:after,.ps-master-detail-collapse:after,.ps-group-collapse:after,.ps-pivot-collapse:after,.ps-column-group-collapse:after,.ps-pivotcol-collapse:after{content:"▶"}.ps-tree-expand:hover,.ps-tree-collapse:hover,.ps-master-detail-expand:hover,.ps-master-detail-collapse:hover,.ps-group-expand:hover,.ps-group-collapse:hover,.ps-pivot-expand:hover,.ps-pivot-collapse:hover,.ps-column-group-expand:hover,.ps-column-group-collapse:hover,.ps-pivotcol-expand:hover,.ps-pivotcol-collapse:hover{color:var(--ps-primary-color)}.ps-column-group-expand,.ps-column-group-collapse,.ps-pivotcol-expand,.ps-pivotcol-collapse{margin-right:0;margin-left:4px}.ps-row.ps-pivot-expandable .ps-cell:first-child .ps-cell-content{display:flex;align-items:center}.ps-multi-row-header{position:relative}.ps-multi-row-header-grid{position:relative;background:var(--ps-header-bg)}.ps-multirow-container{position:relative}.ps-multi-row-cell{position:absolute;box-sizing:border-box;contain:strict;display:flex;align-items:center;padding:var(--ps-cell-padding);background:var(--ps-bg-color);border-right:var(--ps-border-width) solid var(--ps-border-color);border-bottom:1px dashed var(--ps-border-color);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;-webkit-user-select:none;user-select:none}.ps-multi-row-cell.ps-last-row{border-bottom:1px solid var(--ps-border-color)}.ps-multi-row-cell.ps-first-column{border-left:none}.ps-multirow-container .ps-multi-row-cell.ps-first-column{padding-left:calc(var(--ps-group-indent, 0px) + 12px)}.ps-multi-row-cell.ps-rowspan{z-index:2;background:var(--ps-bg-color);border-right:var(--ps-border-width) solid var(--ps-border-color)}.ps-multi-row-header-grid .ps-multi-row-cell.ps-rowspan{background:var(--ps-header-bg)}.ps-multi-row-header-grid .ps-header-cell{background:var(--ps-header-bg);font-weight:var(--ps-header-font-weight);color:var(--ps-header-text);border-bottom:1px solid var(--ps-border-color)}.ps-multirow-container.ps-selected .ps-multi-row-cell{box-shadow:inset 0 0 0 9999px var(--ps-row-selected-bg)}:where(.ps-row.ps-row-alt) .ps-cell:where(:not(.ps-cell-merged-anchor):not(.ps-cell-readonly)){background:var(--ps-row-alt-bg)}.ps-mode-pivot .ps-row:not(.ps-row-subtotal):not(.ps-row-grandtotal):not(.ps-group-row) .ps-cells-left .ps-cell,.ps-mode-pivot .ps-merge-overlay .ps-cells-left .ps-cell.ps-merge-float{font-weight:500}.ps-row.ps-row-subtotal{background-color:var(--ps-subtotal-bg)}.ps-row.ps-row-subtotal .ps-cell:not(.ps-cell-merged-anchor){background-color:var(--ps-subtotal-bg);font-weight:600}.ps-row.ps-row-subtotal:hover .ps-cell:not(.ps-cell-merged-anchor){background-color:var(--ps-subtotal-hover-bg)}.ps-row.ps-row-grandtotal{background-color:var(--ps-grandtotal-bg)}.ps-row.ps-row-grandtotal .ps-cell:not(.ps-cell-merged-anchor){background-color:var(--ps-grandtotal-bg);font-weight:700}.ps-row.ps-row-grandtotal:hover .ps-cell:not(.ps-cell-merged-anchor){background-color:var(--ps-grandtotal-hover-bg)}.ps-cell.ps-cell-column-subtotal{background-color:var(--ps-column-subtotal-bg);font-weight:600}.ps-cell.ps-cell-column-grandtotal{background-color:var(--ps-grandtotal-bg);font-weight:700}.ps-outline-group-row{font-weight:600}.ps-outline-grandtotal-row{font-weight:700}.ps-row.ps-row-has-merge-anchor .ps-cells-left,.ps-row.ps-row-has-merge-anchor .ps-cells-right{z-index:3}.ps-cell.ps-cell-merged-anchor{display:flex;align-items:center;background:var(--ps-bg-color);z-index:1;overflow:hidden;border:var(--ps-border-width) solid var(--ps-border-color);border-top:none;border-left:none;box-sizing:border-box}.ps-dynamic-row-heights .ps-cell.ps-cell-merged-anchor{min-height:unset;overflow:visible}.ps-cell.ps-cell-merged-hidden{pointer-events:none;border-color:transparent}.ps-merge-overlay{position:absolute;top:0;left:0;display:flex;width:var(--ps-total-width, 100%);height:0;pointer-events:none;z-index:6}.ps-merge-overlay .ps-cells-left,.ps-merge-overlay .ps-cells-center,.ps-merge-overlay .ps-cells-right{height:0;background:transparent;box-shadow:none;pointer-events:none}.ps-cell.ps-merge-float{position:absolute;display:flex;align-items:center;background:var(--ps-bg-color);overflow:hidden;border:var(--ps-border-width) solid var(--ps-border-color);border-top:none;border-left:none;box-sizing:border-box;pointer-events:auto;cursor:default;user-select:none;-webkit-user-select:none}.ps-row .ps-cell.ps-cell-invalid{border-bottom:2px solid var(--ps-validation-error-color)}.ps-cell.ps-cell-invalid:after{content:"";position:absolute;right:0;bottom:0;width:0;height:0;border-style:solid;border-width:0 0 6px 6px;border-color:transparent transparent var(--ps-validation-error-color) transparent}.ps-theme-dark .ps-row .ps-cell.ps-cell-invalid{background-color:var(--ps-validation-error-bg);box-shadow:inset 2px 0 0 0 var(--ps-validation-error-color)}.ps-cell.ps-editing .ps-editor-invalid{border-color:var(--ps-validation-error-color);background-color:var(--ps-validation-error-bg)}.ps-cell-content>input.ps-cell-checkbox-input{margin:0;width:14px;height:14px;vertical-align:middle;cursor:pointer;pointer-events:none;accent-color:var(--ps-checkbox-checked)}.ps-cell[data-column-id=__drag_handle__]{padding:0;background:var(--ps-header-bg)}.ps-cell[data-column-id=__drag_handle__] .ps-cell-content{display:flex;justify-content:center}.ps-header-cell[data-column-id=__drag_handle__]{padding:0;background:var(--ps-header-bg)}.ps-cell[data-column-id=_rowHeader]{padding:var(--ps-cell-padding);cursor:pointer;-webkit-user-select:none;user-select:none;background:var(--ps-header-bg);border-right:1px solid var(--ps-border-color)}.ps-cell[data-column-id=_rowHeader] .ps-cell-content{display:flex;align-items:center;justify-content:center}.ps-header-cell[data-column-id=_rowHeader]{padding:0;background:var(--ps-header-bg)}.ps-cell-content>input.ps-row-header-checkbox-input{margin:0;width:14px;height:14px;cursor:pointer;accent-color:var(--ps-checkbox-checked)}.ps-dropdown-overlay{background:var(--ps-overlay-bg);border:1px solid var(--ps-overlay-border);border-radius:6px;box-shadow:var(--ps-overlay-shadow);overflow:hidden;display:flex;flex-direction:column}.ps-dropdown-search{padding:8px 10px;border:none;border-bottom:1px solid var(--ps-overlay-separator);font-size:13px;outline:none;width:100%;box-sizing:border-box;background:var(--ps-overlay-bg);color:var(--ps-overlay-text-strong)}.ps-dropdown-search:focus{border-bottom-color:var(--ps-overlay-accent)}.ps-dropdown-list{overflow-y:auto;max-height:250px}.ps-dropdown-item{padding:7px 10px;font-size:13px;cursor:pointer;display:flex;align-items:center;transition:background .1s}.ps-dropdown-item:hover,.ps-dropdown-item.focused{background:var(--ps-overlay-hover-bg)}.ps-dropdown-item.selected{font-weight:600;color:var(--ps-overlay-accent)}.ps-dropdown-item.selected:after{content:"";margin-left:auto;width:12px;height:12px;background-color:currentColor;-webkit-mask:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12' fill='none'><path d='M2.5 6.5L5 9L9.5 3.5' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/></svg>") no-repeat center / 12px 12px;mask:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12' fill='none'><path d='M2.5 6.5L5 9L9.5 3.5' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/></svg>") no-repeat center / 12px 12px}.ps-dropdown-empty{padding:12px 10px;font-size:13px;color:var(--ps-overlay-text-muted);text-align:center}.ps-multiselect-overlay{background:var(--ps-overlay-bg);border:1px solid var(--ps-overlay-border);border-radius:6px;box-shadow:var(--ps-overlay-shadow);overflow:hidden;display:flex;flex-direction:column}.ps-multiselect-search{padding:8px 10px;border:none;border-bottom:1px solid var(--ps-overlay-separator);font-size:13px;outline:none;width:100%;box-sizing:border-box;background:var(--ps-overlay-bg);color:var(--ps-overlay-text-strong)}.ps-multiselect-search:focus{border-bottom-color:var(--ps-overlay-accent)}.ps-multiselect-toggle-all{display:flex;align-items:center;gap:8px;padding:6px 10px;border-bottom:1px solid var(--ps-overlay-separator);cursor:pointer;font-size:12px;color:var(--ps-overlay-text-muted);-webkit-user-select:none;user-select:none}.ps-multiselect-toggle-all:hover{background:var(--ps-overlay-hover-bg)}.ps-multiselect-toggle-checkbox{margin:0;cursor:pointer;pointer-events:none;accent-color:var(--ps-overlay-accent)}.ps-multiselect-list{overflow-y:auto;max-height:220px}.ps-multiselect-item{padding:6px 10px;font-size:13px;cursor:pointer;display:flex;align-items:center;gap:8px;transition:background .1s}.ps-multiselect-item:hover,.ps-multiselect-item.focused{background:var(--ps-overlay-hover-bg)}.ps-multiselect-item.checked{color:var(--ps-overlay-accent)}.ps-multiselect-checkbox{margin:0;flex-shrink:0;cursor:pointer;pointer-events:none;accent-color:var(--ps-overlay-accent)}.ps-multiselect-label{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ps-multiselect-empty{padding:12px 10px;font-size:13px;color:var(--ps-overlay-text-muted);text-align:center}.ps-datepicker-overlay{background:var(--ps-overlay-bg);border:1px solid var(--ps-overlay-border);border-radius:8px;box-shadow:var(--ps-overlay-shadow);padding:12px;width:260px;-webkit-user-select:none;user-select:none}.ps-datepicker-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:10px}.ps-datepicker-nav{background:none;border:none;cursor:pointer;font-size:14px;padding:4px 8px;border-radius:4px;color:var(--ps-overlay-text);transition:background .15s}.ps-datepicker-nav:hover{background:var(--ps-overlay-btn-hover-bg)}.ps-datepicker-title{font-size:14px;font-weight:600;color:var(--ps-overlay-text-strong)}.ps-datepicker-daynames{display:grid;grid-template-columns:repeat(7,1fr);text-align:center;margin-bottom:4px}.ps-datepicker-dayname{font-size:11px;color:var(--ps-overlay-text-muted);padding:4px 0;font-weight:500}.ps-datepicker-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}.ps-datepicker-day{display:flex;align-items:center;justify-content:center;width:32px;height:32px;font-size:13px;border-radius:50%;cursor:pointer;transition:background .1s;color:var(--ps-overlay-text)}.ps-datepicker-day:hover{background:var(--ps-overlay-hover-bg)}.ps-datepicker-day.today{border:1px solid var(--ps-overlay-accent);font-weight:600}.ps-datepicker-day.selected{background:var(--ps-overlay-accent);color:#fff;font-weight:600}.ps-datepicker-day.selected:hover{background:var(--ps-primary-color)}.ps-datepicker-day.sunday{color:var(--ps-sunday-color)}.ps-datepicker-day.saturday{color:var(--ps-saturday-color)}.ps-datepicker-day.selected.sunday,.ps-datepicker-day.selected.saturday{color:#fff}.ps-datepicker-day-empty{cursor:default}.ps-datepicker-day-empty:hover{background:transparent}.ps-datepicker-footer{display:flex;justify-content:space-between;margin-top:10px;padding-top:8px;border-top:1px solid var(--ps-overlay-separator)}.ps-datepicker-btn{background:none;border:1px solid var(--ps-overlay-border);border-radius:4px;padding:4px 12px;font-size:12px;cursor:pointer;color:var(--ps-overlay-text);transition:all .15s}.ps-datepicker-btn:hover{background:var(--ps-overlay-hover-bg);border-color:var(--ps-overlay-accent);color:var(--ps-overlay-accent)}.ps-datepicker-btn-clear:hover{background:var(--ps-overlay-danger-bg);border-color:var(--ps-overlay-danger);color:var(--ps-overlay-danger)}.ps-valuelist{display:flex;flex-direction:column;font-size:var(--ps-font-size, 12px);color:var(--ps-text-color, #333);background:var(--ps-bg-color, #fff)}.ps-valuelist-head{padding:6px 8px;background:var(--ps-bg-color, #fff);border-bottom:1px solid var(--ps-border-color, #e0e0e0)}.ps-valuelist-search{width:100%;box-sizing:border-box;height:26px;padding:0 8px;font-size:inherit;font-family:inherit;color:inherit;background:var(--ps-input-bg, #fff);border:1px solid var(--ps-border-color, #e0e0e0);border-radius:3px;outline:none}.ps-valuelist-search:focus{border-color:var(--ps-primary-color, #4568e0)}.ps-valuelist-modebar{display:flex;gap:2px;padding:6px 8px;background:var(--ps-bg-color, #fff);border-bottom:1px solid var(--ps-border-color, #e0e0e0)}.ps-valuelist-mode-btn{flex:1 1 0;height:22px;padding:0 8px;font-size:11px;font-family:inherit;line-height:1;color:var(--ps-text-secondary, #666);background:var(--ps-segment-bg, rgba(69, 104, 224, .08));border:none;border-radius:3px;cursor:pointer;-webkit-user-select:none;user-select:none}.ps-valuelist-mode-btn:hover:not(.is-active){color:var(--ps-accent, #4568e0)}.ps-valuelist-mode-btn.is-active{color:#fff;background:var(--ps-accent, #4568e0)}.ps-valuelist-toolbar{display:flex;align-items:center;justify-content:space-between;background:var(--ps-bg-color, #fff);border-bottom:1px solid var(--ps-border-color, #e0e0e0)}.ps-valuelist-picked-only{display:flex;align-items:center;gap:6px;margin-left:auto;padding:6px 10px;cursor:pointer;-webkit-user-select:none;user-select:none}.ps-valuelist-picked-only input{margin:0;cursor:pointer}.ps-valuelist-picked-only-label{font-size:12px;color:var(--ps-text-secondary, #666)}.ps-valuelist-all{display:flex;align-items:center;gap:6px;padding:6px 10px;background:var(--ps-bg-color, #fff);cursor:pointer;-webkit-user-select:none;user-select:none}.ps-valuelist-all input{margin:0;cursor:pointer}.ps-valuelist-viewport{overflow-y:auto;overflow-x:hidden;position:relative;background:var(--ps-bg-color, #fff)}.ps-valuelist-spacer{position:relative;width:100%}.ps-valuelist-item{display:flex;align-items:center;gap:6px;height:28px;padding:0 10px;box-sizing:border-box;cursor:pointer;-webkit-user-select:none;user-select:none}.ps-valuelist-item:hover{background:var(--ps-hover-bg, rgba(0, 0, 0, .04))}.ps-valuelist-item input{margin:0;flex-shrink:0;cursor:pointer}.ps-valuelist-item-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ps-valuelist-only{display:none;flex-shrink:0;margin-left:auto;padding:0;height:15px;line-height:12px;font-size:11px;font-family:inherit;color:var(--ps-text-secondary, #666);background:transparent;border:none;word-break:keep-all;cursor:pointer}.ps-valuelist-item:hover .ps-valuelist-only,.ps-valuelist-item:focus-within .ps-valuelist-only{display:block}.ps-valuelist-only:hover{color:var(--ps-accent, #4568e0)}.ps-valuelist-only:focus-visible{outline:1px solid var(--ps-accent, #4568e0);outline-offset:1px;border-radius:2px}.ps-valuelist-item.is-picked{background:var(--ps-picked-bg, rgba(69, 104, 224, .06));box-shadow:inset 2px 0 0 0 var(--ps-accent, #4568e0)}.ps-valuelist-item.is-picked:hover{background:var(--ps-picked-hover-bg, rgba(69, 104, 224, .12))}.ps-valuelist-item.is-pinned-last{box-shadow:inset 2px 0 0 0 var(--ps-accent, #4568e0),inset 0 -1px 0 0 var(--ps-pinned-divider, rgba(0, 0, 0, .12))}.ps-valuelist-notice{padding:6px 10px;font-size:11px;line-height:1.4;color:var(--ps-warning-text, #8a6d3b);background:var(--ps-warning-bg, #fcf8e3);border-top:1px solid var(--ps-border-color, #e0e0e0)}.ps-valuelist-state{padding:24px 10px;text-align:center;color:var(--ps-text-muted, #8998b5)}.ps-theme-excel{--ps-primary-color: #217346;--ps-bg-color: #ffffff;--ps-border-color: #d4d4d4;--ps-pinned-border-color: #b0b0b0;--ps-header-bg: #f3f3f3;--ps-header-text: #333333;--ps-cell-text: #333333;--ps-cell-readonly: #f9f9f9;--ps-row-hover-bg: #e8f3ed;--ps-row-selected-bg: rgba(33, 115, 70, .15);--ps-row-alt-bg: #fafafa;--ps-shadow-color: rgba(0, 0, 0, .08);--ps-cell-selected-bg: rgba(33, 115, 70, .18);--ps-cell-selected-border-color: #217346;--ps-selection-overlay-border-color: #217346;--ps-selection-overlay-border-width: 2px;--ps-text-secondary: #595959;--ps-text-muted: #888888;--ps-scrollbar-thumb: #c0c0c0;--ps-scrollbar-thumb-hover: #a0a0a0;--ps-overlay-bg: #ffffff;--ps-overlay-border: #c8c8c8;--ps-overlay-shadow: 0 2px 8px rgba(0, 0, 0, .15);--ps-overlay-separator: #e8e8e8;--ps-overlay-hover-bg: #f1f7f4;--ps-overlay-accent: #217346;--ps-overlay-text: #333333;--ps-overlay-text-strong: #1a1a1a;--ps-overlay-text-muted: #888888;--ps-overlay-btn-hover-bg: #f0f0f0;--ps-overlay-danger: #c5221f;--ps-overlay-danger-bg: #fef0f0;--ps-loading-bg: rgba(255, 255, 255, .8);--ps-group-row-hover-bg: #e0eee6;--ps-master-detail-row-bg: #fafafa;--ps-dirty-added-color: #2e7d32;--ps-dirty-added-bg: rgba(46, 125, 50, .08);--ps-dirty-modified-color: #f57c00;--ps-dirty-modified-bg: rgba(245, 124, 0, .08);--ps-dirty-modified-cell-bg: rgba(245, 124, 0, .18);--ps-dirty-deleted-color: #c5221f;--ps-dirty-deleted-bg: rgba(197, 34, 31, .08);--ps-dirty-reordered-color: #6a1b9a;--ps-dirty-reordered-bg: rgba(106, 27, 154, .07);--ps-validation-error-color: #c5221f;--ps-validation-error-bg: rgba(197, 34, 31, .06);--ps-subtotal-bg: #e8e8e8;--ps-subtotal-hover-bg: #e0e0e0;--ps-grandtotal-bg: #d8d8d8;--ps-grandtotal-hover-bg: #d0d0d0;--ps-column-subtotal-bg: #e8e8e8;--ps-statusbar-bg: #217346;--ps-statusbar-border: #1a5c38;--ps-statusbar-spinner-border: #4a9970;--ps-checkbox-border: #888888;--ps-checkbox-checked: #217346;--ps-sunday-color: #c5221f;--ps-saturday-color: #1a73e8;--ps-header-height: 36px;--ps-row-height: 36px;--ps-scrollbar-width: 14px;--ps-cell-padding: 0 var(--ps-cell-padding-side);--ps-cell-padding-side: 8px;--ps-border-width: 1px;--ps-group-indent: 0px;--ps-font-family: Calibri, "Segoe UI", Tahoma, Geneva, Verdana, sans-serif;--ps-font-size: 13px;--ps-header-font-weight: 600;--ps-cell-flash-up-bg: rgba(33, 115, 70, .4);--ps-cell-flash-down-bg: rgba(197, 34, 31, .4);--ps-cell-flash-neutral-bg: rgba(245, 124, 0, .4);--ps-cell-flash-duration: .5s;--ps-cell-fade-duration: 1s}.ps-theme-sheets{--ps-primary-color: #1a73e8;--ps-bg-color: #ffffff;--ps-border-color: #e0e0e0;--ps-pinned-border-color: #c0c0c0;--ps-header-bg: #f8f9fa;--ps-header-text: #5f6368;--ps-cell-text: #202124;--ps-cell-readonly: #f1f3f4;--ps-row-hover-bg: #f1f3f4;--ps-row-selected-bg: rgba(26, 115, 232, .12);--ps-row-alt-bg: #fafbfc;--ps-shadow-color: rgba(60, 64, 67, .1);--ps-cell-selected-bg: rgba(26, 115, 232, .16);--ps-cell-selected-border-color: #1a73e8;--ps-selection-overlay-border-color: #1a73e8;--ps-selection-overlay-border-width: 1px;--ps-text-secondary: #5f6368;--ps-text-muted: #80868b;--ps-scrollbar-thumb: #dadce0;--ps-scrollbar-thumb-hover: #bdc1c6;--ps-overlay-bg: #ffffff;--ps-overlay-border: #dadce0;--ps-overlay-shadow: 0 4px 12px rgba(60, 64, 67, .15);--ps-overlay-separator: #e8eaed;--ps-overlay-hover-bg: #f1f3f4;--ps-overlay-accent: #1a73e8;--ps-overlay-text: #3c4043;--ps-overlay-text-strong: #202124;--ps-overlay-text-muted: #80868b;--ps-overlay-btn-hover-bg: #f1f3f4;--ps-overlay-danger: #d93025;--ps-overlay-danger-bg: #fce8e6;--ps-loading-bg: rgba(255, 255, 255, .85);--ps-group-row-hover-bg: #e8f0fe;--ps-master-detail-row-bg: #f8f9fa;--ps-dirty-added-color: #1e8e3e;--ps-dirty-added-bg: rgba(30, 142, 62, .08);--ps-dirty-modified-color: #f9ab00;--ps-dirty-modified-bg: rgba(249, 171, 0, .08);--ps-dirty-modified-cell-bg: rgba(249, 171, 0, .2);--ps-dirty-deleted-color: #d93025;--ps-dirty-deleted-bg: rgba(217, 48, 37, .08);--ps-dirty-reordered-color: #9334e6;--ps-dirty-reordered-bg: rgba(147, 52, 230, .07);--ps-validation-error-color: #d93025;--ps-validation-error-bg: rgba(217, 48, 37, .06);--ps-subtotal-bg: #e8f0fe;--ps-subtotal-hover-bg: #d2e3fc;--ps-grandtotal-bg: #d2e3fc;--ps-grandtotal-hover-bg: #aecbfa;--ps-column-subtotal-bg: #e8f0fe;--ps-statusbar-bg: #f8f9fa;--ps-statusbar-border: #dadce0;--ps-statusbar-spinner-border: #c0c8d4;--ps-checkbox-border: #80868b;--ps-checkbox-checked: #1a73e8;--ps-sunday-color: #d93025;--ps-saturday-color: #1a73e8;--ps-header-height: 36px;--ps-row-height: 36px;--ps-scrollbar-width: 12px;--ps-cell-padding: 0 var(--ps-cell-padding-side);--ps-cell-padding-side: 12px;--ps-border-width: 1px;--ps-group-indent: 0px;--ps-font-family: "Google Sans", Roboto, Arial, sans-serif;--ps-font-size: 13px;--ps-header-font-weight: 500;--ps-cell-flash-up-bg: rgba(30, 142, 62, .35);--ps-cell-flash-down-bg: rgba(217, 48, 37, .35);--ps-cell-flash-neutral-bg: rgba(249, 171, 0, .35);--ps-cell-flash-duration: .5s;--ps-cell-fade-duration: 1s}.ps-theme-material{--ps-primary-color: #3f51b5;--ps-bg-color: #ffffff;--ps-border-color: #e0e0e0;--ps-pinned-border-color: #bdbdbd;--ps-header-bg: #ffffff;--ps-header-text: rgba(0, 0, 0, .87);--ps-cell-text: rgba(0, 0, 0, .87);--ps-cell-readonly: #f5f5f5;--ps-row-hover-bg: rgba(63, 81, 181, .04);--ps-row-selected-bg: rgba(63, 81, 181, .08);--ps-row-alt-bg: #fafafa;--ps-shadow-color: rgba(0, 0, 0, .12);--ps-cell-selected-bg: rgba(63, 81, 181, .16);--ps-cell-selected-border-color: #3f51b5;--ps-selection-overlay-border-color: #3f51b5;--ps-selection-overlay-border-width: 1px;--ps-text-secondary: rgba(0, 0, 0, .6);--ps-text-muted: rgba(0, 0, 0, .38);--ps-scrollbar-thumb: #bdbdbd;--ps-scrollbar-thumb-hover: #9e9e9e;--ps-overlay-bg: #ffffff;--ps-overlay-border: rgba(0, 0, 0, .12);--ps-overlay-shadow: 0 5px 5px -3px rgba(0, 0, 0, .2), 0 8px 10px 1px rgba(0, 0, 0, .14), 0 3px 14px 2px rgba(0, 0, 0, .12);--ps-overlay-separator: rgba(0, 0, 0, .12);--ps-overlay-hover-bg: rgba(63, 81, 181, .08);--ps-overlay-accent: #3f51b5;--ps-overlay-text: rgba(0, 0, 0, .87);--ps-overlay-text-strong: rgba(0, 0, 0, 1);--ps-overlay-text-muted: rgba(0, 0, 0, .6);--ps-overlay-btn-hover-bg: rgba(0, 0, 0, .04);--ps-overlay-danger: #f44336;--ps-overlay-danger-bg: #ffebee;--ps-loading-bg: rgba(255, 255, 255, .85);--ps-group-row-hover-bg: rgba(63, 81, 181, .08);--ps-master-detail-row-bg: #fafafa;--ps-dirty-added-color: #43a047;--ps-dirty-added-bg: rgba(67, 160, 71, .08);--ps-dirty-modified-color: #fb8c00;--ps-dirty-modified-bg: rgba(251, 140, 0, .08);--ps-dirty-modified-cell-bg: rgba(251, 140, 0, .2);--ps-dirty-deleted-color: #e53935;--ps-dirty-deleted-bg: rgba(229, 57, 53, .08);--ps-dirty-reordered-color: #8e24aa;--ps-dirty-reordered-bg: rgba(142, 36, 170, .07);--ps-validation-error-color: #f44336;--ps-validation-error-bg: rgba(244, 67, 54, .06);--ps-subtotal-bg: #e8eaf6;--ps-subtotal-hover-bg: #c5cae9;--ps-grandtotal-bg: #c5cae9;--ps-grandtotal-hover-bg: #9fa8da;--ps-column-subtotal-bg: #e8eaf6;--ps-statusbar-bg: #fafafa;--ps-statusbar-border: #e0e0e0;--ps-statusbar-spinner-border: #c0c8d4;--ps-checkbox-border: rgba(0, 0, 0, .54);--ps-checkbox-checked: #3f51b5;--ps-sunday-color: #f44336;--ps-saturday-color: #2196f3;--ps-header-height: 36px;--ps-row-height: 36px;--ps-scrollbar-width: 12px;--ps-cell-padding: 0 var(--ps-cell-padding-side);--ps-cell-padding-side: 16px;--ps-border-width: 1px;--ps-group-indent: 0px;--ps-font-family: Roboto, "Helvetica Neue", Arial, sans-serif;--ps-font-size: 14px;--ps-header-font-weight: 500;--ps-cell-flash-up-bg: rgba(67, 160, 71, .4);--ps-cell-flash-down-bg: rgba(229, 57, 53, .4);--ps-cell-flash-neutral-bg: rgba(251, 140, 0, .4);--ps-cell-flash-duration: .5s;--ps-cell-fade-duration: 1s}.ps-header-cell.ps-dragging{opacity:.5}.ps-drop-indicator{position:absolute;top:0;bottom:0;width:3px;background:var(--ps-primary-color);z-index:20000;pointer-events:none}.ps-status-bar{display:flex;justify-content:space-between;align-items:center;height:16px;padding:0 8px;background-color:var(--ps-statusbar-bg);border-top:1px solid var(--ps-statusbar-border);font-size:11px;color:var(--ps-text-secondary);flex-shrink:0;-webkit-user-select:none;user-select:none}.ps-status-bar__timing{display:flex;gap:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ps-status-bar__aggregates{flex:1;text-align:right;padding-right:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ps-status-bar__row-count{white-space:nowrap;margin-left:auto}.ps-status-bar__activity{display:none;align-items:center;gap:4px;padding:0 8px 0 0;white-space:nowrap}.ps-status-bar__spinner{display:inline-block;width:10px;height:10px;border:1.5px solid var(--ps-statusbar-spinner-border);border-top-color:var(--ps-primary-color);border-radius:50%;animation:ps-spin .7s linear infinite;flex-shrink:0}.ps-status-bar__activity-label{font-size:11px;color:var(--ps-primary-color);font-weight:500}.mzc-client-excel-body{height:100%;display:flex;flex-direction:column}.mzc-client-excel-options{display:flex;gap:8px;padding:0 0 12px;justify-content:space-between;align-items:flex-end}.mzc-client-excel-options .mzc-client-excel-option{display:flex;align-items:center;gap:8px;font-size:12px}.mzc-client-excel-options .mzc-client-excel-option--grow{flex:1}.mzc-client-excel-options .mzc-client-excel-option__label{color:var(--mzc-fg-muted, #6a7184);font-weight:500;min-width:56px}.mzc-client-excel-dropzone{flex:1;min-height:220px;background-color:var(--mzc-dropzone-bg, #f8f8fd);border:1px dashed var(--mzc-accent, #4568e0);display:flex;align-items:center;justify-content:center;flex-direction:column;gap:10px;font-size:13px;cursor:pointer}.mzc-client-excel-dropzone>*{pointer-events:none}.mzc-client-excel-dropzone.is-active{border-style:solid}.mzc-client-excel-dropzone__text{text-align:center;color:var(--mzc-fg-muted, #6a7184);font-weight:400}.mzc-client-excel-dropzone__line{display:block}.mzc-client-excel-dropzone__accent{color:var(--mzc-accent, #4568e0)}.mzc-client-excel-dropzone__error{color:var(--mzc-toast-error, #dc5a5a)}.mzc-client-excel-popup .mzc-popup-footer .mzc-btn{min-width:80px}.moz-grid-chrome[data-v-326c95dd]{overflow:hidden}
@@ -1,4 +1,4 @@
1
- import { FieldDef, PureSheetEventType, PivotRowField, PivotColumnField, PivotValueField, FormatRowCallback, PartialTranslationMap, GroupConfig, ColumnGroupDef, RowHeaderConfig, FieldRowTemplate, LoaderConfig, RowSelectionConfig, CellSelectionConfig, UndoStack } from '../../../moz-ui-grid-core/src/index.ts';
1
+ import { FieldDef, PureSheetEventType, PivotRowField, PivotColumnField, PivotValueField, FormatRowCallback, PartialTranslationMap, RowGroupConfig, ColumnGroupDef, RowHeaderConfig, FieldRowTemplate, LoaderConfig, RowSelectionConfig, CellSelectionConfig, UndoStack } from '../../../moz-ui-grid-core/src/index.ts';
2
2
  import { IContextMenuConfig } from './toolbar';
3
3
  /**
4
4
  * MozGridVueCore Props
@@ -95,7 +95,7 @@ export interface MozGridVueCoreProps {
95
95
  /** 행 높이 변경 감지 임계값 */
96
96
  rowHeightChangeThreshold?: number;
97
97
  /** 그룹화 설정 (flat 모드 전용) */
98
- group?: GroupConfig;
98
+ group?: RowGroupConfig;
99
99
  /** 컬럼 그룹 — 다단계 헤더 (flat 모드 전용, 구 headerGroups) */
100
100
  columnGroups?: ColumnGroupDef[];
101
101
  /** Multi-Row 레이아웃 (flat 모드 전용) */
@@ -171,6 +171,15 @@ export interface MozGridVueEmits {
171
171
  /** Props → PureSheetConfig 변환에 사용하는 키 목록 */
172
172
  export declare const CONFIG_PROP_KEYS: readonly ["keyFields", "theme", "rowHeight", "headerHeight", "showHeader", "resizableColumns", "reorderableColumns", "showRowHeader", "rowHeader", "rowSelection", "cellSelection", "cellSelectionImpliesRows", "editable", "tooltipMode", "alternatingRows", "autoFitColumns", "dynamicRowHeights", "reorderableRows", "locale", "engine", "useWorker", "loader", "preventKeyEdit", "showStatusBar", "showDragHandleColumn", "undoStack", "formatRow", "translations", "rowStyle", "headerStyle", "rowHeightChangeThreshold"];
173
173
  /** flat 모드 전용 Props 키 목록 (pivot 모드에서는 제외) */
174
- export declare const FLAT_ONLY_PROP_KEYS: readonly ["group", "columnGroups", "rowTemplate"];
174
+ export declare const FLAT_ONLY_PROP_KEYS: readonly ["columnGroups", "rowTemplate"];
175
+ /**
176
+ * flat 전용 prop 중 **core 설정 키 이름이 다른 것** — `prop 이름 → core 설정 키`.
177
+ *
178
+ * legacy `group` prop 은 소비처 표면이라 이름을 유지하되, core 설정 키는
179
+ * `rowGroupConfig`(`treeConfig`/`masterDetailConfig` 와 같은 규약)로 옮겨졌다.
180
+ */
181
+ export declare const FLAT_ONLY_PROP_KEY_MAP: {
182
+ readonly group: "rowGroupConfig";
183
+ };
175
184
  /** emit으로 브릿지할 PureSheet 이벤트 목록 */
176
185
  export declare const BRIDGED_EVENTS: PureSheetEventType[];
@@ -39,7 +39,7 @@ export interface ISortDef {
39
39
  /** 오름차순 여부 */
40
40
  ascending: boolean;
41
41
  /** 피벗 값 기반 정렬 (GrandTotal 기준 값 필드 ID) */
42
- byValue?: string;
42
+ by?: string;
43
43
  }
44
44
  /** 조건부 스타일 규칙 */
45
45
  export interface ICustomCellDef {
@@ -668,8 +668,8 @@ const collapsedRows = grid.pivot.getCollapsedRowNodes();
668
668
  // ── 피벗 정렬/필터 (viewState 단일 채널 — field-level sort 옵션 없음) ──
669
669
  // 라벨 기준 정렬
670
670
  await grid.sort([{ id: 'region', direction: 'asc', sequence: 1 }]);
671
- // 값(집계) 기준 정렬 — byValue 로 집계 값 기준 정렬
672
- await grid.sort([{ id: 'region', direction: 'desc', sequence: 1, byValue: 'sales' }]);
671
+ // 값(집계) 기준 정렬 — by 로 집계 값 기준 정렬
672
+ await grid.sort([{ id: 'region', direction: 'desc', sequence: 1, by: 'sales' }]);
673
673
 
674
674
  // 차원(행/열 필드) 필터 → core 가 자동으로 pre(소스 축소 후 재집계)로 분류
675
675
  await grid.filter([{ id: 'region', operator: 'eq', filterValue: '서울', sequence: 1 }]);