@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.
- package/dist/MozGrid.vue.d.ts +5 -0
- package/dist/compat/MozGridVue.vue.d.ts +32 -2
- package/dist/compat/MozPivotVue.vue.d.ts +32 -2
- package/dist/index.cjs +9 -9
- package/dist/index.d.ts +1 -1
- package/dist/index.js +17 -2
- package/dist/stories/FieldId.stories.d.ts +1 -1
- package/dist/stories/FooterAggregateDiagnosis.stories.d.ts +17 -0
- package/dist/stories/FooterAggregatePivot.stories.d.ts +37 -0
- package/dist/stories/MergedCellCopy.stories.d.ts +58 -0
- package/dist/stories/Pivot900Rows.stories.d.ts +40 -0
- package/dist/stories/PivotReactiveProxy.stories.d.ts +118 -0
- package/dist/stories/PivotSettingsPermissions.stories.d.ts +6 -0
- package/dist/stories/RowGroupAggregates.stories.d.ts +57 -0
- package/dist/stories/RowGroupDisabled.stories.d.ts +9 -0
- package/dist/stories/SummaryFooter.stories.d.ts +7 -0
- package/dist/stories/_helpers/sampleData.d.ts +11 -11
- package/dist/style.css +1 -1
- package/dist/types/props.d.ts +12 -3
- package/dist/types/toolbar.d.ts +1 -1
- package/docs/manual/examples.md +2 -2
- package/docs/manual/reference.md +120 -5
- package/docs/manual/reference_vue.md +6 -2
- package/package.json +3 -3
|
@@ -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,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}
|
package/dist/types/props.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FieldDef, PureSheetEventType, PivotRowField, PivotColumnField, PivotValueField, FormatRowCallback, PartialTranslationMap,
|
|
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?:
|
|
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 ["
|
|
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[];
|
package/dist/types/toolbar.d.ts
CHANGED
package/docs/manual/examples.md
CHANGED
|
@@ -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
|
-
// 값(집계) 기준 정렬 —
|
|
672
|
-
await grid.sort([{ id: 'region', direction: 'desc', sequence: 1,
|
|
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 }]);
|