rowvia 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.md +228 -0
  2. package/dist/rowvia.css +1 -0
  3. package/dist/rowvia.es.js +8962 -0
  4. package/dist/rowvia.umd.cjs +37 -0
  5. package/dist/types/api.d.ts +6 -0
  6. package/dist/types/components/detailDialog.d.ts +13 -0
  7. package/dist/types/core/clientSideRowModel.d.ts +116 -0
  8. package/dist/types/core/columnModel.d.ts +95 -0
  9. package/dist/types/core/eventService.d.ts +11 -0
  10. package/dist/types/core/formulaEngine.d.ts +42 -0
  11. package/dist/types/core/localeText.d.ts +15 -0
  12. package/dist/types/core/remoteRowModels.d.ts +170 -0
  13. package/dist/types/core/rowNode.d.ts +51 -0
  14. package/dist/types/core/utils.d.ts +38 -0
  15. package/dist/types/core/valueService.d.ts +14 -0
  16. package/dist/types/features/chartService.d.ts +49 -0
  17. package/dist/types/features/columnMenu.d.ts +9 -0
  18. package/dist/types/features/contextMenu.d.ts +27 -0
  19. package/dist/types/features/editService.d.ts +62 -0
  20. package/dist/types/features/exportService.d.ts +39 -0
  21. package/dist/types/features/filterGui.d.ts +19 -0
  22. package/dist/types/features/filterService.d.ts +36 -0
  23. package/dist/types/features/findService.d.ts +27 -0
  24. package/dist/types/features/formulaEditor.d.ts +11 -0
  25. package/dist/types/features/notesService.d.ts +23 -0
  26. package/dist/types/features/overlays.d.ts +14 -0
  27. package/dist/types/features/paginationService.d.ts +32 -0
  28. package/dist/types/features/pdfWriter.d.ts +24 -0
  29. package/dist/types/features/popupService.d.ts +15 -0
  30. package/dist/types/features/rangeSelection.d.ts +43 -0
  31. package/dist/types/features/rowDragService.d.ts +25 -0
  32. package/dist/types/features/rowGroupPanel.d.ts +10 -0
  33. package/dist/types/features/selectionService.d.ts +34 -0
  34. package/dist/types/features/sideBar.d.ts +29 -0
  35. package/dist/types/features/sortService.d.ts +12 -0
  36. package/dist/types/features/statusBar.d.ts +14 -0
  37. package/dist/types/features/undoRedoService.d.ts +40 -0
  38. package/dist/types/features/xlsxReader.d.ts +7 -0
  39. package/dist/types/features/xlsxWriter.d.ts +10 -0
  40. package/dist/types/gantt/component.d.ts +25 -0
  41. package/dist/types/gantt/data.d.ts +31 -0
  42. package/dist/types/gantt/filterSort.d.ts +50 -0
  43. package/dist/types/gantt/ganttChart.d.ts +122 -0
  44. package/dist/types/gantt/index.d.ts +5 -0
  45. package/dist/types/gantt/locale.d.ts +10 -0
  46. package/dist/types/grid.d.ts +168 -0
  47. package/dist/types/index.d.ts +28 -0
  48. package/dist/types/personnel/component.d.ts +20 -0
  49. package/dist/types/personnel/index.d.ts +3 -0
  50. package/dist/types/personnel/model.d.ts +31 -0
  51. package/dist/types/render/cellRenderers.d.ts +30 -0
  52. package/dist/types/render/headerView.d.ts +64 -0
  53. package/dist/types/render/rowRenderer.d.ts +190 -0
  54. package/dist/types/render/stickyGroupRows.d.ts +21 -0
  55. package/dist/types/types.d.ts +889 -0
  56. package/package.json +47 -0
package/README.md ADDED
@@ -0,0 +1,228 @@
1
+ # Rowvia
2
+
3
+ Rowvia 是基于 TypeScript 和原生 DOM 的数据表格、甘特图与人员排期组件库,运行时不依赖第三方库。表格 API 参考 AG Grid 的命名和使用方式,提供 `createGrid`、`GridOptions`、`GridApi` 和 `ColumnApi`。
4
+
5
+ 当前版本为 `0.1.0`,提供 npm 包入口、样式和 TypeScript 类型声明。当前实现覆盖多种表格交互,但不保证与 AG Grid 完整兼容,也不包含其全部 Enterprise 能力。
6
+
7
+ ## 主要能力
8
+
9
+ - **数据表格**:行虚拟化、排序、筛选、分页、编辑、分组聚合、树形数据、主从表、透视、公式计算、图表及文件导入导出。
10
+ - **甘特图**:树形任务表格与 Canvas 时间线联动,支持排期拖动、时长调整、里程碑、依赖箭头和负责人选择。
11
+ - **人员排期**:按人员展示任务,重叠排期自动分行,支持拖动、调整起止日期、未排期项编辑和视图保存。
12
+ - **独立接入**:三个组件都从库入口导出;甘特图与人员排期支持同页多实例,并提供销毁方法。
13
+ - **主题和本地化**:CSS 变量主题,以及表格 `localeText` 文案覆盖。
14
+
15
+ 性能演示包含 100,000 行 × 100 列场景。相关浏览器验证记录见 [演示验证说明](docs/DEMO-VERIFICATION.md);这不代表所有设备和业务数据都具有相同表现。
16
+
17
+ ## 本地开发
18
+
19
+ 需要可运行 Vite、TypeScript 和 jsdom 的 Node.js 环境。
20
+
21
+ ```bash
22
+ npm install
23
+ npm run dev # 默认地址:http://localhost:5199
24
+ npm run typecheck # 检查组件库、演示和构建配置的类型
25
+ npm test # 表格回归测试,以及甘特图和人员排期集成测试
26
+ npm run build # 构建全部演示、组件库和类型声明
27
+ ```
28
+
29
+ 也可使用 `pnpm install`。项目通过 `pnpm-workspace.yaml` 中的 `allowBuilds` 配置允许 esbuild 的安装脚本执行。
30
+
31
+ | 演示 | 地址 |
32
+ | --- | --- |
33
+ | 首页与能力目录 | `/` |
34
+ | 大数据量表格 | `/demos/performance/index.html` |
35
+ | 金融行情 | `/demos/finance/index.html` |
36
+ | 人员组织树 | `/demos/hr/index.html` |
37
+ | 库存与主从表 | `/demos/inventory/index.html` |
38
+ | 服务端行模型 | `/demos/server-side/index.html` |
39
+ | 甘特图 | `/demos/gantt/index.html` |
40
+ | 人员排期 | `/demos/personnel/index.html` |
41
+
42
+ 演示使用本地数据,不连接业务后端。
43
+
44
+ ## 安装与构建产物
45
+
46
+ 通过 npm 安装:
47
+
48
+ ```bash
49
+ npm install rowvia
50
+ ```
51
+
52
+ 需要使用本地源码时,可先构建并打包,再在业务项目中安装生成的压缩包:
53
+
54
+ ```bash
55
+ # 在本仓库中执行
56
+ npm run build:lib
57
+ npm pack
58
+
59
+ # 在业务项目中执行,将路径替换为实际文件位置
60
+ npm install /path/to/rowvia-0.1.0.tgz
61
+ ```
62
+
63
+ | 产物 | 用途 |
64
+ | --- | --- |
65
+ | `dist/rowvia.es.js` | ESM 入口,供 `import` 使用 |
66
+ | `dist/rowvia.umd.cjs` | CommonJS / UMD 入口;浏览器全局变量为 `Rowvia` |
67
+ | `dist/rowvia.css` | 表格、甘特图和人员排期的样式 |
68
+ | `dist/types/` | TypeScript 类型声明 |
69
+ | `dist-demos/` | 可独立部署的静态演示页面,不包含在 npm 包中 |
70
+
71
+ 业务项目统一通过 `rowvia/style.css` 引入样式。组件需要浏览器 DOM;挂载容器应具有明确高度。
72
+
73
+ ## 表格接入
74
+
75
+ ```html
76
+ <div id="grid" style="height: 600px"></div>
77
+ ```
78
+
79
+ ```ts
80
+ import { createGrid } from 'rowvia';
81
+ import 'rowvia/style.css';
82
+
83
+ const { api, grid } = createGrid(document.getElementById('grid')!, {
84
+ columnDefs: [
85
+ { field: 'name', headerName: '姓名', enableRowGroup: true },
86
+ { field: 'hours', headerName: '工时', type: 'numberColumn', aggFunc: 'sum' },
87
+ ],
88
+ rowData: [
89
+ { name: '林晓', hours: 24 },
90
+ { name: '陈宇', hours: 16 },
91
+ ],
92
+ pagination: true,
93
+ paginationPageSize: 100,
94
+ rowSelection: 'multiple',
95
+ enableRangeSelection: true,
96
+ sideBar: { toolPanels: ['columns', 'filters'] },
97
+ theme: 'ag-theme-quartz',
98
+ });
99
+
100
+ api.setQuickFilter('林晓');
101
+ api.setSortModel([{ colId: 'hours', sort: 'desc' }]);
102
+
103
+ // 页面卸载时调用:grid.destroy();
104
+ ```
105
+
106
+ ### 表格功能范围
107
+
108
+ | 类别 | 当前实现 |
109
+ | --- | --- |
110
+ | 渲染与布局 | 行虚拟化、固定行列、列宽调整、列拖动、列分组、单元格跨列、自定义行高、全宽行 |
111
+ | 查询与筛选 | 单列和多列排序,文本、数字、日期、集合、布尔筛选,浮动筛选、多条件筛选、跨列高级筛选、外部筛选、快速搜索 |
112
+ | 选择与编辑 | 单选和多选、范围选择、填充柄、复制剪切粘贴、单元格编辑、整行编辑、批量编辑、撤销重做、富选择编辑器 |
113
+ | 数据组织 | 分组聚合、树形数据、主从表、分组吸顶、汇总行、透视列、自定义聚合、占比展示 |
114
+ | 行模型 | 客户端、无限滚动、视口和服务端行模型,以及数据块加载、刷新和清除 |
115
+ | 扩展与状态 | 自定义渲染器、编辑器、表头和筛选器,列状态和表格状态保存恢复,行拖动、备注、公式与计算列 |
116
+ | 工具界面 | 列面板、筛选面板、上下文菜单、列菜单、状态栏、查找栏、加载和空数据提示 |
117
+ | 导入导出 | CSV 导出、基础 XLSX 导入导出、多页 PDF 导出、打印样式 |
118
+ | 图表 | 折线、面积、条形、柱形、饼图、散点图,迷你图、PNG 下载,以及部分图表悬停提示 |
119
+ | 可访问性与主题 | ARIA 属性、键盘导航、`localeText`、Alpine / Quartz / Balham / Dark 风格和 CSS 变量 |
120
+
121
+ 配置 `chartStorageKey` 后,图表可通过浏览器 `localStorage` 保存和恢复。图表使用 `rowvia-charts:` 存储键前缀。
122
+
123
+ ### 当前限制
124
+
125
+ - 未提供 React、Vue 或 Angular 专用封装,需通过组件生命周期挂载和销毁 DOM 实例。
126
+ - AG Grid 风格的 API 和主题名称不意味着完整兼容;迁移时应核对本项目的类型声明和实际行为。
127
+ - 图表未完整实现透视图表、AG Grid 图表设置界面和全部提示交互。
128
+ - XLSX 导出以数据值和基础样式为主,不支持完整的公式、图片、多工作表、冻结窗格、超链接或工作表保护。
129
+ - 行拖动限于当前表格,不支持跨表格拖动和外部放置区域。
130
+ - 未提供主题构建器、迁移工具、AI 工具包或 MCP 服务。
131
+
132
+ ## 甘特图接入
133
+
134
+ ```ts
135
+ import { createGantt, type GanttTask } from 'rowvia';
136
+ import 'rowvia/style.css';
137
+
138
+ const tasks: GanttTask[] = [{
139
+ id: 'task-1',
140
+ path: ['task-1'],
141
+ name: '需求开发',
142
+ kind: 'task',
143
+ start: '2026-09-22',
144
+ end: '2026-09-25',
145
+ status: 'in-progress',
146
+ owner: null,
147
+ progress: 50,
148
+ hours: 24,
149
+ milestone: false,
150
+ dependsOn: [],
151
+ }];
152
+
153
+ const gantt = createGantt(document.getElementById('gantt')!, {
154
+ tasks,
155
+ members: [],
156
+ title: '项目计划',
157
+ tableWidth: 280,
158
+ unit: 'day',
159
+ onTaskChange(task) { console.log('保存任务变化', task); },
160
+ });
161
+
162
+ // 容器需设置高度,例如 700px。
163
+ gantt.expandAll();
164
+ gantt.scrollToTask('task-1');
165
+ // 页面卸载时调用:gantt.destroy();
166
+ ```
167
+
168
+ 支持树形展开收起、搜索、筛选排序、八档时间刻度、缩放、今天定位、时间翻页、里程碑过滤、排期拖动和两端调整。通过 `setTasks()` 替换任务,通过 `onTaskChange` 将变更交给业务系统持久化;`onTaskOpen` 可替换默认详情对话框。
169
+
170
+ 详细说明见 [甘特图接入文档](demos/gantt/README.md)。
171
+
172
+ ## 人员排期接入
173
+
174
+ ```ts
175
+ import { createPersonnelSchedule } from 'rowvia';
176
+ import 'rowvia/style.css';
177
+
178
+ const schedule = createPersonnelSchedule(document.getElementById('schedule')!, {
179
+ people: [{ id: 'alice', name: '林晓' }],
180
+ items: [{
181
+ id: 'task-1', personId: 'alice', name: '界面开发',
182
+ status: '进行中', node: '需求开发', estimate: 3,
183
+ start: '2026-09-21', end: '2026-09-25',
184
+ }],
185
+ onItemChange(item) { console.log('保存排期变化', item); },
186
+ });
187
+
188
+ // 容器需设置明确高度。
189
+ const items = schedule.getItems();
190
+ // 页面卸载时调用:schedule.destroy();
191
+ ```
192
+
193
+ 支持人员多选和搜索、仅看有排期人员、名称与状态筛选、排序、五档缩放、日期导航、紧凑和宽松布局、排期拖动和两端调整、未排期估分编辑、详情编辑及视图保存恢复。
194
+
195
+ `setData()` 更新人员和任务,`updateItem()` 修改任务,`setPeople()` 选择展示人员。视图通过 `localStorage` 保存,任务变更保存在内存中,由 `onItemChange` 交给业务系统持久化。不同业务可通过 `viewStorageKey` 隔离视图。
196
+
197
+ 详细说明见 [人员排期接入文档](demos/personnel/README.md)。
198
+
199
+ ## 目录结构
200
+
201
+ ```text
202
+ src/
203
+ index.ts 公共入口
204
+ grid.ts 表格实例与功能装配
205
+ api.ts GridApi / ColumnApi 实现
206
+ types.ts 表格公共类型
207
+ core/ 列模型、行模型、取值、事件、公式等
208
+ render/ 行、表头、单元格渲染与编辑器
209
+ features/ 筛选、编辑、导出、图表、面板等功能
210
+ gantt/ 独立甘特图组件与 Canvas 时间线
211
+ personnel/ 独立人员排期组件与数据模型
212
+ components/ 共用详情对话框
213
+ styles/ 表格与首页样式
214
+ demos/ 七个演示页面及本地数据
215
+ test/ 表格、甘特图、人员排期测试
216
+ scripts/ 构建辅助脚本
217
+ docs/ 演示验证记录
218
+ ```
219
+
220
+ ## 验证与发布
221
+
222
+ - `npm test`:182 项表格回归检查,以及甘特图和人员排期集成测试,覆盖渲染、筛选、编辑、滚动联动、排期调整、多实例隔离和销毁等行为。
223
+ - `npm run typecheck`:检查库代码、演示及构建配置。
224
+ - `npm run build`:生成全部演示、ESM / UMD 文件、CSS 和类型声明。
225
+ - `npm pack --dry-run`:检查 npm 包的文件清单;包内容限定为 `dist/`、README 和包元数据。
226
+ - `npm publish`:通过 `prepublishOnly` 自动执行类型检查、测试与库构建。
227
+
228
+ 历史浏览器验证见 [演示验证说明](docs/DEMO-VERIFICATION.md)。自动测试不等同于完整的浏览器、无障碍或 AG Grid 兼容性验收。
@@ -0,0 +1 @@
1
+ .ag-grid-root{--ag-font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;--ag-font-size: 13px;--ag-header-font-size: 12px;--ag-background-color: #fff;--ag-header-background-color: #f5f7fa;--ag-odd-row-background-color: rgba(0, 0, 0, .03);--ag-header-foreground-color: #5a636b;--ag-foreground-color: #181d1f;--ag-secondary-foreground-color: #6b7680;--ag-border-color: #dde2eb;--ag-border-color-strong: #b8c0c9;--ag-row-hover-color: rgba(33, 150, 243, .06);--ag-selected-row-background-color: rgba(33, 150, 243, .12);--ag-range-selection-background-color: rgba(33, 150, 243, .14);--ag-range-selection-border-color: #2196f3;--ag-range-selection-chart-category-color: #2196f3;--ag-range-selection-chart-background-color: rgba(33, 150, 243, .1);--ag-header-height: 48px;--ag-header-cell-horizontal-padding: 12px;--ag-cell-horizontal-padding: 12px;--ag-row-height: 42px;--ag-checkbox-checked-color: #2196f3;--ag-accent-color: #2196f3;--ag-alpine-active-color: #2196f3;--ag-input-focus-border-color: #2196f3;--ag-invalid-color: #e02525;--ag-disabled-foreground-color: rgba(24, 29, 31, .5);--ag-chip-background-color: rgba(24, 29, 31, .06);--ag-modal-overlay-background-color: rgba(0, 0, 0, .4);--ag-toggle-button-border-width: 0;--ag-widget-container-shadow: 0 4px 16px rgba(0, 0, 0, .18);--ag-cell-data-changed-color: #2196f3;--ag-chart-text-color: #5a636b;position:relative;box-sizing:border-box;font-family:var(--ag-font-family);font-size:var(--ag-font-size);color:var(--ag-foreground-color);background-color:var(--ag-background-color);line-height:1.4;-webkit-font-smoothing:antialiased}.ag-grid-root *,.ag-grid-root *:before,.ag-grid-root *:after{box-sizing:border-box}.ag-theme-quartz{--ag-header-background-color: #f9fafb;--ag-border-color: #eff0f1;--ag-odd-row-background-color: transparent;--ag-header-foreground-color: #39485d;--ag-foreground-color: #1f383c;--ag-secondary-foreground-color: rgba(31, 56, 60, .6);--ag-row-height: 42px;--ag-header-height: 48px;--ag-border-radius: 8px;--ag-selected-row-background-color: rgba(33, 150, 243, .1)}.ag-theme-balham{--ag-header-background-color: #f5f5f5;--ag-border-color: #bdbfc1;--ag-header-height: 32px;--ag-row-height: 28px;--ag-cell-horizontal-padding: 8px;--ag-font-size: 12px}.ag-theme-alpine-dark,.ag-theme-quartz-dark{--ag-background-color: #181d1f;--ag-header-background-color: #23272a;--ag-odd-row-background-color: rgba(255, 255, 255, .04);--ag-border-color: #3a4045;--ag-border-color-strong: #4c545b;--ag-foreground-color: #e5e9ec;--ag-header-foreground-color: #b6bcc2;--ag-secondary-foreground-color: rgba(229, 233, 236, .6);--ag-chip-background-color: rgba(255, 255, 255, .1);--ag-disabled-foreground-color: rgba(229, 233, 236, .5);--ag-range-selection-background-color: rgba(33, 150, 243, .24)}.ag-root{position:relative;display:flex;width:100%;height:100%;overflow:hidden}.ag-main{flex:1 1 auto;display:flex;flex-direction:column;min-width:0;position:relative;overflow:hidden}.ag-header-wrapper{position:relative;overflow:hidden;flex:none;min-height:0;border-bottom:1px solid var(--ag-border-color);background-color:var(--ag-header-background-color)}.ag-header{display:flex;position:relative;height:var(--ag-header-height);flex:none;overflow:hidden}.ag-pinned-left-header,.ag-pinned-right-header{position:relative;overflow:hidden;flex:none;height:100%}.ag-header-viewport{flex:1 1 auto;position:relative;overflow:hidden;min-width:0}.ag-header-container,.ag-header-row{position:relative;height:100%}.ag-header-cell{position:absolute;top:0;display:flex;align-items:center;height:100%;padding:0 var(--ag-header-cell-horizontal-padding);font-size:var(--ag-header-font-size);font-weight:600;color:var(--ag-header-foreground-color);background-color:var(--ag-header-background-color);border-right:1px solid var(--ag-border-color);-webkit-user-select:none;user-select:none;cursor:default;overflow:hidden}.ag-header-cell:last-child{border-right:none}.ag-header-cell-label{flex:1 1 auto;display:flex;align-items:center;gap:6px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ag-header-cell-text{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ag-header-cell.ag-right-aligned-header,.ag-header-cell.ag-right-aligned-header .ag-header-cell-label{justify-content:flex-end}.ag-header-icon{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;flex:none;color:var(--ag-secondary-foreground-color);opacity:.75;cursor:pointer}.ag-header-icon:hover{opacity:1}.ag-sort-indicator{margin-left:4px}.ag-sort-indicator.ag-sort-asc,.ag-sort-indicator.ag-sort-desc{color:var(--ag-alpine-active-color);opacity:1}.ag-sort-order{font-size:10px;margin-left:-4px;align-self:flex-start;color:var(--ag-alpine-active-color)}.ag-filter-icon.ag-filter-active{color:var(--ag-alpine-active-color);opacity:1}.ag-header-cell-resize{position:absolute;top:0;right:-3px;bottom:0;width:7px;cursor:col-resize;z-index:2}.ag-header-cell-resize:after{content:"";position:absolute;top:20%;bottom:20%;right:3px;width:1px;background:var(--ag-border-color-strong)}.ag-header-cell-resize:hover:after{background:var(--ag-alpine-active-color);width:2px}body.ag-resizing{cursor:col-resize;-webkit-user-select:none;user-select:none}.ag-header-cell-drag-ghost{opacity:.6}.ag-floating-filters{border-top:1px solid var(--ag-border-color);height:28px}.ag-floating-filter-cell{display:flex;align-items:center;padding:2px 6px;border-right:1px solid var(--ag-border-color);background-color:var(--ag-header-background-color)}.ag-floating-filter-input{width:100%;border:1px solid var(--ag-border-color);border-radius:4px;padding:2px 6px;font-size:12px;font-family:var(--ag-font-family);color:var(--ag-foreground-color);background:var(--ag-background-color);outline:none}.ag-floating-filter-input:focus{border-color:var(--ag-input-focus-border-color)}.ag-body{flex:1 1 auto;display:flex;position:relative;min-height:0;overflow:hidden}.ag-body-viewport-wrapper{flex:1 1 auto;display:flex;flex-direction:column;position:relative;min-width:0}.ag-body-viewport{flex:1 1 auto;overflow:auto;position:relative;outline:none;scrollbar-width:thin}.ag-body-viewport::-webkit-scrollbar{width:12px;height:12px}.ag-body-viewport::-webkit-scrollbar-thumb{background:#80808066;border-radius:6px;border:3px solid transparent;background-clip:content-box}.ag-body-viewport::-webkit-scrollbar-thumb:hover{background:#80808099;background-clip:content-box}.ag-body-container{position:relative;width:100%}.ag-pinned-left-cols-viewport,.ag-pinned-right-cols-viewport{position:relative;overflow:hidden;flex:none;align-self:stretch;height:100%}.ag-pinned-left-cols-viewport .ag-row>.ag-cell:last-child,.ag-pinned-left-header .ag-header-cell:last-child,.ag-floating-pinned-left .ag-row>.ag-cell:last-child,.ag-floating-pinned-bottom-left .ag-row>.ag-cell:last-child,.ag-sticky-group-rows-left .ag-row>.ag-cell:last-child{border-inline-end:1px solid var(--ag-border-color)}.ag-pinned-right-cols-viewport .ag-row>.ag-cell:first-child,.ag-pinned-right-header .ag-header-cell:first-child,.ag-floating-pinned-right .ag-row>.ag-cell:first-child,.ag-floating-pinned-bottom-right .ag-row>.ag-cell:first-child,.ag-sticky-group-rows-right .ag-row>.ag-cell:first-child{border-inline-start:1px solid var(--ag-border-color)}.ag-floating-top,.ag-floating-bottom{position:relative;overflow:hidden;flex:none}.ag-floating-top{border-bottom:1px solid var(--ag-border-color)}.ag-floating-bottom{border-top:1px solid var(--ag-border-color)}.ag-floating-pinned-cols{position:absolute;overflow:hidden;height:0;z-index:4}.ag-floating-pinned-left{top:0;left:0}.ag-floating-pinned-right{top:0;right:0}.ag-floating-pinned-bottom-left{bottom:0;left:0;border-top:1px solid var(--ag-border-color)}.ag-floating-pinned-bottom-right{bottom:0;right:0;border-top:1px solid var(--ag-border-color)}.ag-sticky-group-rows{position:absolute;top:0;left:0;right:0;height:0;z-index:5;pointer-events:none;background-color:var(--ag-header-background-color)}.ag-sticky-group-rows-left,.ag-sticky-group-rows-center,.ag-sticky-group-rows-right{position:absolute;top:0;height:0;overflow:hidden}.ag-sticky-group-rows-left{left:0}.ag-sticky-group-rows-center{left:0;right:0}.ag-sticky-group-rows-right{right:0}.ag-sticky-group-rows .ag-row{pointer-events:auto}.ag-row{position:absolute;left:0;width:100%;-webkit-user-select:none;user-select:none;border-bottom:1px solid var(--ag-border-color);background-color:var(--ag-background-color)}.ag-row.ag-row-even{background-color:var(--ag-odd-row-background-color)}.ag-row:hover,.ag-row.ag-row-hover{background-color:var(--ag-row-hover-color)}.ag-row.ag-row-selected{background-color:var(--ag-selected-row-background-color)}.ag-row.ag-row-group{background-color:var(--ag-header-background-color);font-weight:600;border-bottom:1px solid var(--ag-border-color)}.ag-row.ag-row-group:hover,.ag-row.ag-row-group.ag-row-hover{background-color:var(--ag-row-hover-color)}.ag-row.ag-row-footer{background-color:var(--ag-header-background-color);font-weight:600;border-top:1px solid var(--ag-border-color)}.ag-row-full-width{width:100%!important}.ag-cell{position:absolute;top:0;display:flex;align-items:center;height:100%;padding:0 var(--ag-cell-horizontal-padding);overflow:hidden;white-space:nowrap;border-right:1px solid var(--ag-border-color);background-color:inherit}.ag-cell:last-child{border-right:none}.ag-cell-value{flex:1 1 auto;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ag-right-aligned-cell{justify-content:flex-end}.ag-right-aligned-cell .ag-cell-value{text-align:right}.ag-cell.ag-cell-focus{border:1px solid var(--ag-alpine-active-color)}.ag-cell.ag-cell-focus:after{content:""}.ag-cell.ag-cell-editing{padding:0;border:1px solid var(--ag-input-focus-border-color);box-shadow:0 0 0 1px var(--ag-input-focus-border-color);background-color:var(--ag-background-color)}.ag-cell.ag-cell-editing .ag-cell-value,.ag-cell.ag-cell-editing .ag-cell-note-marker,.ag-cell.ag-cell-editing .ag-row-drag-handle{display:none}.ag-cell.ag-cell-editing .ag-cell-editor{width:100%;height:100%}.ag-cell.ag-cell-invalid{border-color:var(--ag-invalid-color);box-shadow:0 0 0 1px var(--ag-invalid-color)}.ag-cell-data-change{animation:ag-cell-data-change 1s ease-out}@keyframes ag-cell-data-change{0%{background-color:var(--ag-cell-data-changed-color);color:#fff}to{background-color:transparent}}.ag-cell-range-selected{background-color:var(--ag-range-selection-background-color)}.ag-cell-range-anchor{box-shadow:inset 0 0 0 1px var(--ag-range-selection-border-color)}.ag-find-match{background-color:#ffeb3b73}.ag-find-active-match{background-color:#ff980099}.ag-group-cell-renderer{display:flex;align-items:center;width:100%;gap:6px}.ag-group-value-expanded-icon{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;flex:none;cursor:pointer;color:var(--ag-secondary-foreground-color);border-radius:4px}.ag-group-value-expanded-icon:hover{background-color:var(--ag-chip-background-color)}.ag-group-child-count{color:var(--ag-secondary-foreground-color);font-weight:400}.ag-cell-checkbox{display:flex;align-items:center;justify-content:center;width:100%;height:100%}.ag-range-overlay{position:absolute;border:1px solid var(--ag-range-selection-border-color);background-color:var(--ag-range-selection-background-color);pointer-events:none;z-index:3}.ag-range-handle{position:absolute;width:8px;height:8px;background-color:var(--ag-range-selection-border-color);border:1px solid #fff;cursor:crosshair;z-index:4}.ag-row-detail{position:absolute;background-color:var(--ag-background-color);border-bottom:1px solid var(--ag-border-color);overflow:auto;z-index:1}.ag-status-bar{flex:none;display:flex;align-items:stretch;min-height:26px;border-top:1px solid var(--ag-border-color);background-color:var(--ag-header-background-color);font-size:12px;color:var(--ag-secondary-foreground-color);padding:0 12px;gap:24px}.ag-status-panel{display:flex;align-items:center;padding:2px 0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:none}.ag-status-panel-center,.ag-status-panel-right{flex:0 1 auto;min-width:0}.ag-status-panel-center{flex:1 1 auto;justify-content:center}.ag-status-panel-right{margin-left:auto}.ag-pagination-page-label{color:var(--ag-secondary-foreground-color)}.ag-pagination-panel{flex:none;display:flex;align-items:center;justify-content:space-between;min-height:40px;padding:0 12px;border-top:1px solid var(--ag-border-color);background-color:var(--ag-header-background-color);font-size:12px;color:var(--ag-secondary-foreground-color);gap:12px}.ag-pagination-buttons{display:flex;align-items:center;gap:4px}.ag-pagination-button{border:1px solid var(--ag-border-color);background:var(--ag-background-color);color:var(--ag-foreground-color);border-radius:4px;min-width:26px;height:24px;cursor:pointer;font-size:12px;line-height:1;padding:0 6px}.ag-pagination-button:hover{background-color:var(--ag-row-hover-color)}.ag-pagination-page-input{width:48px;height:24px;border:1px solid var(--ag-border-color);border-radius:4px;text-align:center;font-size:12px;color:var(--ag-foreground-color);background:var(--ag-background-color)}.ag-pagination-info{white-space:nowrap}.ag-pagination-from-to{color:var(--ag-foreground-color)}.ag-pagination-page-size{display:flex;align-items:center;gap:6px}.ag-pagination-page-size-select{height:24px;border:1px solid var(--ag-border-color);border-radius:4px;font-size:12px;background:var(--ag-background-color);color:var(--ag-foreground-color)}.ag-side-bar{display:flex;flex-direction:column;width:220px;flex:none;border-left:1px solid var(--ag-border-color);background-color:var(--ag-background-color);overflow:hidden}.ag-side-bar-left{border-left:none;border-right:1px solid var(--ag-border-color);order:-1}.ag-side-buttons{display:flex;flex-direction:column;border-bottom:1px solid var(--ag-border-color);background-color:var(--ag-header-background-color);flex:none}.ag-side-button{border:none;background:none;text-align:left;padding:10px 12px;font-size:12px;font-weight:600;color:var(--ag-header-foreground-color);cursor:pointer;border-left:3px solid transparent;font-family:var(--ag-font-family)}.ag-side-button:hover{background-color:var(--ag-row-hover-color)}.ag-side-button.ag-selected{color:var(--ag-alpine-active-color);border-left-color:var(--ag-alpine-active-color);background-color:var(--ag-selected-row-background-color)}.ag-side-bar-panel{flex:1 1 auto;overflow:auto;padding:8px;font-size:12px}.ag-side-bar-empty,.ag-column-group-hint{color:var(--ag-secondary-foreground-color);padding:8px 4px;font-style:italic}.ag-column-panel,.ag-filters-panel{display:flex;flex-direction:column;gap:8px}.ag-column-panel-search{width:100%;border:1px solid var(--ag-border-color);border-radius:4px;padding:5px 8px;font-size:12px;color:var(--ag-foreground-color);background:var(--ag-background-color);outline:none}.ag-column-panel-search:focus{border-color:var(--ag-input-focus-border-color)}.ag-column-panel-columns{display:flex;flex-direction:column}.ag-column-select-column{display:flex;align-items:center;gap:8px;padding:4px;border-radius:4px;cursor:grab}.ag-column-select-column:hover{background-color:var(--ag-row-hover-color)}.ag-column-select-label{flex:1 1 auto;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:var(--ag-foreground-color)}.ag-column-select-actions{display:flex;gap:2px}.ag-column-select-action{border:none;background:none;cursor:pointer;color:var(--ag-secondary-foreground-color);padding:0 2px;font-size:12px;line-height:1}.ag-column-select-action:hover{color:var(--ag-alpine-active-color)}.ag-column-panel-section-title,.ag-side-bar-section-title{font-weight:700;font-size:11px;text-transform:uppercase;letter-spacing:.6px;color:var(--ag-secondary-foreground-color);margin:8px 0 4px}.ag-column-group-list{display:flex;flex-direction:column;gap:4px;min-height:32px;border:1px dashed var(--ag-border-color-strong);border-radius:4px;padding:4px}.ag-column-group-item{display:flex;align-items:center;gap:6px;background-color:var(--ag-chip-background-color);border-radius:4px;padding:3px 6px;cursor:grab}.ag-column-group-item span{flex:1 1 auto}.ag-column-group-remove{border:none;background:none;cursor:pointer;color:var(--ag-secondary-foreground-color);font-size:14px;line-height:1;padding:0 2px}.ag-column-group-remove:hover{color:var(--ag-invalid-color)}.ag-filters-tool-panel-item{display:flex;flex-direction:column;gap:4px;padding:6px 4px;border-bottom:1px solid var(--ag-border-color)}.ag-filters-tool-panel-item-header{display:flex;align-items:center;justify-content:space-between;font-weight:600;color:var(--ag-foreground-color)}.ag-filters-tool-panel-item-badge{color:var(--ag-alpine-active-color);display:inline-flex}.ag-popup{position:absolute;z-index:100;background-color:var(--ag-background-color);border:1px solid var(--ag-border-color);border-radius:6px;box-shadow:var(--ag-widget-container-shadow);font-size:12px;color:var(--ag-foreground-color);padding:4px;max-height:70vh;overflow:auto}.ag-popup-title{font-weight:700;padding:6px 8px;font-size:12px;border-bottom:1px solid var(--ag-border-color);margin-bottom:4px;color:var(--ag-header-foreground-color)}.ag-menu-item{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:4px;cursor:pointer;position:relative;white-space:nowrap}.ag-menu-item:hover{background-color:var(--ag-row-hover-color)}.ag-menu-item-disabled,.ag-menu-item-disabled:hover{color:var(--ag-disabled-foreground-color);cursor:default;background:none}.ag-menu-item-active{color:var(--ag-alpine-active-color)}.ag-menu-item-icon,.ag-menu-item-check{width:16px;display:inline-flex;align-items:center;justify-content:center;flex:none}.ag-menu-item-label{flex:1 1 auto}.ag-menu-item-shortcut{color:var(--ag-secondary-foreground-color);font-size:11px}.ag-menu-item-arrow{margin-left:4px}.ag-menu-separator{height:1px;background-color:var(--ag-border-color);margin:4px 0}.ag-menu-section{font-size:10px;text-transform:uppercase;letter-spacing:.6px;color:var(--ag-secondary-foreground-color);padding:6px 8px 2px;font-weight:700}.ag-menu-popup-sub{position:absolute;left:100%;top:0;background-color:var(--ag-background-color);border:1px solid var(--ag-border-color);border-radius:6px;box-shadow:var(--ag-widget-container-shadow);padding:4px;min-width:160px;z-index:101}.ag-filter-popup{display:flex;flex-direction:column;gap:8px;padding:8px}.ag-filter-condition{width:100%;border:1px solid var(--ag-border-color);border-radius:4px;padding:4px 6px;font-size:12px;color:var(--ag-foreground-color);background:var(--ag-background-color)}.ag-filter-input{width:100%;border:1px solid var(--ag-border-color);border-radius:4px;padding:4px 6px;font-size:12px;color:var(--ag-foreground-color);background:var(--ag-background-color);outline:none}.ag-filter-input:focus{border-color:var(--ag-input-focus-border-color)}.ag-filter-inputs{display:flex;gap:6px}.ag-popup-buttons{display:flex;justify-content:flex-end;gap:6px;margin-top:4px}.ag-button{border:1px solid var(--ag-border-color);background:var(--ag-background-color);color:var(--ag-foreground-color);border-radius:4px;padding:4px 10px;font-size:12px;cursor:pointer;font-family:var(--ag-font-family)}.ag-button:hover{background-color:var(--ag-row-hover-color)}.ag-button-primary{background-color:var(--ag-alpine-active-color);border-color:var(--ag-alpine-active-color);color:#fff}.ag-button-primary:hover{filter:brightness(1.08);background-color:var(--ag-alpine-active-color)}.ag-button-small{padding:2px 8px;font-size:11px}.ag-set-filter{display:flex;flex-direction:column;gap:6px;padding:8px}.ag-set-filter-list{max-height:180px;overflow:auto;display:flex;flex-direction:column;gap:2px}.ag-set-filter-item{display:flex;align-items:center;gap:6px;padding:3px 4px;border-radius:4px;cursor:pointer}.ag-set-filter-item:hover{background-color:var(--ag-row-hover-color)}.ag-set-filter-actions{display:flex;gap:6px}.ag-set-filter-empty{color:var(--ag-secondary-foreground-color);padding:8px;font-style:italic}.ag-find-bar{display:flex;align-items:center;gap:8px;padding:8px}.ag-find-input{flex:1 1 auto;border:1px solid var(--ag-border-color);border-radius:4px;padding:5px 8px;font-size:12px;color:var(--ag-foreground-color);background:var(--ag-background-color);outline:none}.ag-find-input:focus{border-color:var(--ag-input-focus-border-color)}.ag-find-count{color:var(--ag-secondary-foreground-color);white-space:nowrap;min-width:64px}.ag-find-case{display:flex;align-items:center;gap:4px;white-space:nowrap}.ag-chart-panel{display:flex;flex-direction:column;gap:6px}.ag-chart-panel-label{font-weight:600;color:var(--ag-secondary-foreground-color);font-size:11px;margin-top:4px}.ag-chart-panel-select{width:100%;border:1px solid var(--ag-border-color);border-radius:4px;padding:4px 6px;font-size:12px;background:var(--ag-background-color);color:var(--ag-foreground-color)}.ag-chart-panel-series{display:flex;flex-direction:column;gap:2px;max-height:140px;overflow:auto}.ag-chart-panel-series-item{display:flex;align-items:center;gap:6px;padding:2px 4px}.ag-chart-panel-create{margin-top:8px}.ag-chart-panel-list{margin-top:8px;display:flex;flex-direction:column;gap:4px}.ag-chart-panel-list-item{display:flex;align-items:center;justify-content:space-between;background-color:var(--ag-chip-background-color);border-radius:4px;padding:4px 8px}.ag-chart-window{width:640px!important;max-width:90vw}.ag-chart-window-header{display:flex;align-items:center;gap:8px;padding:4px 4px 8px;border-bottom:1px solid var(--ag-border-color)}.ag-chart-window-title{flex:1 1 auto;font-weight:700}.ag-chart-window-body{padding:12px;display:flex;flex-direction:column;align-items:center}.ag-chart-canvas{background-color:var(--ag-background-color);max-width:100%}.ag-chart-legend{display:flex;flex-wrap:wrap;gap:12px;padding-top:8px;font-size:11px;color:var(--ag-secondary-foreground-color)}.ag-chart-legend-item{display:flex;align-items:center;gap:4px}.ag-chart-legend-swatch{width:10px;height:10px;border-radius:2px;display:inline-block}.ag-overlay{display:flex;align-items:center;justify-content:center;background-color:color-mix(in srgb,var(--ag-background-color) 80%,transparent)}.ag-overlay-loading-wrapper,.ag-overlay-no-rows-wrapper{display:flex;flex-direction:column;align-items:center;gap:8px;color:var(--ag-secondary-foreground-color);font-size:13px}.ag-overlay-loading-spinner{width:28px;height:28px;border:3px solid var(--ag-border-color);border-top-color:var(--ag-alpine-active-color);border-radius:50%;animation:ag-spin .9s linear infinite}@keyframes ag-spin{to{transform:rotate(360deg)}}.ag-cell-editor{width:100%;height:100%}.ag-cell-editor-input{width:100%;height:100%;border:none;outline:none;padding:0 var(--ag-cell-horizontal-padding);font-size:var(--ag-font-size);font-family:var(--ag-font-family);color:var(--ag-foreground-color);background:var(--ag-background-color)}.ag-cell-editor-number{display:flex;align-items:center;width:100%;height:100%;position:relative}.ag-cell-editor-number .ag-cell-editor-input{text-align:inherit}.ag-cell-editor-stepper{width:18px;display:flex;align-items:center;justify-content:center;font-size:8px;color:var(--ag-secondary-foreground-color);cursor:pointer;-webkit-user-select:none;user-select:none}.ag-cell-editor-stepper:hover{color:var(--ag-alpine-active-color)}.ag-cell-editor-select{width:100%;height:100%;border:none;outline:none;padding:0 var(--ag-cell-horizontal-padding);font-size:var(--ag-font-size);font-family:var(--ag-font-family);color:var(--ag-foreground-color);background:var(--ag-background-color)}.ag-cell-editor-textarea{width:100%;height:100%;border:none;outline:none;padding:4px var(--ag-cell-horizontal-padding);font-size:var(--ag-font-size);font-family:var(--ag-font-family);resize:none;color:var(--ag-foreground-color);background:var(--ag-background-color)}.ag-sparkline-cell{display:flex;align-items:center;width:100%;height:100%}.ag-sparkline{color:var(--ag-alpine-active-color)}.ag-row{transition:top .25s ease}.ag-native-checkbox{accent-color:var(--ag-checkbox-checked-color);width:14px;height:14px;cursor:pointer}.ag-group-header-rows{position:relative}.ag-group-header-row{border-bottom:1px solid var(--ag-border-color)}.ag-header-group-cell{position:absolute;top:0;display:flex;align-items:center;justify-content:center;font-size:var(--ag-header-font-size);font-weight:600;color:var(--ag-header-foreground-color);border-right:1px solid var(--ag-border-color);cursor:pointer;overflow:hidden;-webkit-user-select:none;user-select:none;background-color:var(--ag-header-background-color)}.ag-header-group-cell-label{overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.ag-header-group-expand{margin-left:6px;color:var(--ag-secondary-foreground-color)}.ag-row-group-panel{display:flex;align-items:center;gap:8px;padding:4px 8px;border-bottom:1px solid var(--ag-border-color);background-color:var(--ag-header-background-color);min-height:28px;font-size:11px;color:var(--ag-secondary-foreground-color)}.ag-row-group-panel-label{text-transform:uppercase;letter-spacing:.6px;font-weight:700;white-space:nowrap}.ag-row-group-panel-chips{display:flex;gap:6px;flex-wrap:wrap;flex:1 1 auto;min-height:22px;border:1px dashed transparent;border-radius:4px;padding:2px}.ag-row-group-panel-chips.ag-drag-over{border-color:var(--ag-alpine-active-color);background-color:var(--ag-selected-row-background-color)}.ag-row-group-chip{display:flex;align-items:center;gap:6px;background-color:var(--ag-chip-background-color);border-radius:4px;padding:2px 6px;cursor:grab;font-weight:600;color:var(--ag-foreground-color)}.ag-row-group-chip-remove{border:none;background:none;cursor:pointer;color:var(--ag-secondary-foreground-color);font-size:12px;line-height:1;padding:0}.ag-row-group-chip-remove:hover{color:var(--ag-invalid-color)}.ag-row-number-cell{color:var(--ag-secondary-foreground-color);font-variant-numeric:tabular-nums}.ag-cell-row-drag{cursor:grab}.ag-animate-show-change-cell-renderer{display:inline-flex;align-items:center;gap:6px;width:100%}.ag-value-change-arrow{display:inline-flex;align-items:center;flex:none}.ag-value-change-old{opacity:.55;text-decoration:line-through;flex:none}.ag-value-change-new{border-radius:12px;padding:1px 8px;transition:background-color .6s ease}.ag-value-change-value-highlight .ag-value-change-new{background-color:#4caf5040;color:#1b5e20}.ag-value-change-value-highlight.ag-value-change-delta-down .ag-value-change-new{background-color:#f4433640;color:#b71c1c}.ag-value-change-delta-up{color:#1b5e20}.ag-value-change-delta-down{color:#b71c1c}.ag-rich-select{width:100%;height:100%}.ag-rich-select-input{width:100%;height:100%;border:none;outline:none;padding:0 var(--ag-cell-horizontal-padding);font-size:var(--ag-font-size);font-family:var(--ag-font-family);color:var(--ag-foreground-color);background:var(--ag-background-color)}.ag-rich-select-popup{background-color:var(--ag-background-color);border:1px solid var(--ag-border-color);border-radius:6px;box-shadow:var(--ag-widget-container-shadow);max-height:260px;display:flex;flex-direction:column;overflow:hidden}.ag-rich-select-search{border:none;border-bottom:1px solid var(--ag-border-color);padding:6px 8px;font-size:12px;outline:none;color:var(--ag-foreground-color);background:var(--ag-background-color)}.ag-rich-select-list{overflow:auto;padding:4px}.ag-rich-select-item{padding:5px 8px;border-radius:4px;cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ag-rich-select-item:hover,.ag-rich-select-item.ag-active{background-color:var(--ag-selected-row-background-color)}.ag-rich-select-item.ag-selected{color:var(--ag-alpine-active-color);font-weight:600}.ag-rich-select-highlight{background-color:#ffc10773;font-weight:700}.ag-rich-select-empty{padding:8px;color:var(--ag-secondary-foreground-color);font-style:italic}.ag-example-wrapper{display:flex;flex-direction:column;height:100vh;overflow:hidden}.ag-example-header{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:16px 24px;flex-wrap:wrap}.ag-example-tabs{display:flex;gap:4px;background:#f9fafb;border:1px solid #eff0f1;border-radius:8px;padding:4px}.ag-example-tab{border:none;background:transparent;border-radius:6px;padding:6px 14px;font-size:13px;cursor:pointer;color:#39485d;font-family:var(--ag-font-family)}.ag-example-tab.ag-active{background:#fff;color:#000;box-shadow:0 1px 3px #0000001a}.ag-example-input-wrapper{position:relative;display:flex;align-items:center}.ag-example-input-wrapper svg{position:absolute;left:8px;color:#98a2b3}.ag-example-input{border:1px solid #eff0f1;border-radius:8px;padding:8px 12px 8px 30px;font-size:13px;width:220px;outline:none;font-family:var(--ag-font-family);color:#1f383c;background:#fff}.ag-example-input:focus{border-color:var(--ag-input-focus-border-color)}.ag-multi-filter-operator{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--ag-secondary-foreground-color)}.ag-multi-filter-operator .ag-filter-condition{flex:1 1 auto}.ag-multi-filter-list,.ag-advanced-filter-list{display:flex;flex-direction:column;gap:6px}.ag-multi-filter-row,.ag-advanced-filter-row{display:flex;align-items:center;gap:4px}.ag-multi-filter-row .ag-filter-condition,.ag-advanced-filter-row .ag-filter-condition{width:auto;flex:0 0 auto}.ag-multi-filter-row .ag-filter-input,.ag-advanced-filter-row .ag-filter-input{flex:1 1 auto;min-width:60px}.ag-advanced-filter-popup .ag-multi-filter-operator{margin-top:8px}.ag-formula-editor{display:flex;flex-direction:column;gap:8px;padding:8px}.ag-formula-input{width:100%;border:1px solid var(--ag-border-color);border-radius:4px;padding:6px 8px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;resize:vertical;color:var(--ag-foreground-color);background:var(--ag-background-color);outline:none}.ag-formula-preview{font-size:12px;color:var(--ag-secondary-foreground-color);min-height:16px}.ag-formula-preview.ag-formula-error{color:var(--ag-invalid-color)}.ag-formula-functions-title{font-size:10px;text-transform:uppercase;letter-spacing:.6px;color:var(--ag-secondary-foreground-color);font-weight:700;margin-bottom:4px}.ag-formula-functions-list{display:flex;flex-wrap:wrap;gap:4px;max-height:120px;overflow:auto}.ag-cell-note-marker{position:absolute;top:2px;right:2px;width:0;height:0;border-left:6px solid transparent;border-top:6px solid var(--ag-alpine-active-color);cursor:pointer}.ag-cell-note-marker:hover{border-top-color:#ff9800}.ag-note-editor{display:flex;flex-direction:column;gap:8px;padding:8px}.ag-row-drag-handle{display:inline-flex;align-items:center;justify-content:center;width:18px;height:100%;flex:none;cursor:grab;color:var(--ag-secondary-foreground-color);opacity:.6}.ag-row-drag-handle:hover{opacity:1}.ag-row-draggable{cursor:grab}body.ag-row-dragging{cursor:grabbing;-webkit-user-select:none;user-select:none}.ag-row-drag-ghost{position:fixed;z-index:2000;background:var(--ag-background-color);border:1px solid var(--ag-alpine-active-color);border-radius:4px;box-shadow:var(--ag-widget-container-shadow);padding:4px 10px;font-size:12px;pointer-events:none;opacity:.9}.ag-row-drop-indicator{position:absolute;left:0;right:0;height:2px;background:var(--ag-alpine-active-color);pointer-events:none;z-index:5}.ag-direction-rtl{direction:rtl}.ag-direction-rtl .ag-header-cell,.ag-direction-rtl .ag-cell{border-right:none;border-left:1px solid var(--ag-border-color)}.ag-chart-window-body{position:relative}.ag-chart-tooltip{position:absolute;z-index:10;background:var(--ag-background-color);border:1px solid var(--ag-border-color);border-radius:6px;box-shadow:var(--ag-widget-container-shadow);padding:6px 8px;font-size:11px;color:var(--ag-foreground-color);pointer-events:none;white-space:nowrap}.ag-chart-tooltip-title{font-weight:700;margin-bottom:2px}.ag-cell-col-span{overflow:visible}@media print{.ag-grid-root{height:auto!important}.ag-body-viewport{overflow:visible!important;height:auto!important}.ag-body-container,.ag-pinned-left-cols-viewport,.ag-pinned-right-cols-viewport{position:static!important;height:auto!important;overflow:visible!important}.ag-row{position:static!important;display:flex!important;page-break-inside:avoid}.ag-header{position:static!important}.ag-side-bar,.ag-pagination-panel,.ag-popup{display:none!important}}.ag-pinned-cols-inner{position:absolute;top:0;left:0;right:0;will-change:transform}.rowvia-detail-dialog{font:14px/1.5 -apple-system,BlinkMacSystemFont,PingFang SC,sans-serif;color:#1f2329;background:#fff;border:1px solid #dee0e3;border-radius:8px;padding:24px;min-width:320px;max-width:calc(100vw - 48px);box-sizing:border-box}.rowvia-detail-dialog::backdrop{background:#1f232930}.rowvia-detail-dialog h2{font-size:18px;margin:0 0 20px}.rowvia-detail-dialog dl{display:grid;grid-template-columns:auto 1fr;gap:8px 16px;margin:0 0 24px}.rowvia-detail-dialog dt{color:#646a73}.rowvia-detail-dialog dd{margin:0;overflow-wrap:anywhere}.rowvia-detail-dialog button{font:inherit;border:1px solid #dee0e3;background:#fff;border-radius:4px;padding:6px 16px;cursor:pointer}.rowvia-detail-dialog button:hover{background:#f5f6f7}.rowvia-detail-dialog button:focus-visible{outline:2px solid #4254e8;outline-offset:2px}.rowvia-gantt{--ag-font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", Roboto, Helvetica, Arial, sans-serif;--gt-accent: #3370ff;--gt-text: #1f2329;--gt-text-secondary: #646a73;--gt-text-tertiary: #8f959e;--gt-border: #dee0e3;--gt-border-light: #eff0f1;--gt-fill: #f5f6f7;--gt-group-row: #f7f8fa;--gt-status-not-started: #b8bdc4;--gt-status-in-progress: #3370ff;--gt-status-done: #2ea121;--gt-status-delayed: #f54a45;--gt-summary: #2f3b52;--gt-weekend: rgba(31, 35, 41, .04);--gt-row-height: 36px;--gt-header-height: 44px}.rowvia-gantt,.rowvia-gantt *{box-sizing:border-box}.rowvia-gantt .gantt-app{display:flex;flex-direction:column;height:100vh;background:#fff}.rowvia-gantt .gantt-toolbar{display:flex;align-items:center;justify-content:space-between;gap:16px;height:48px;padding:0 16px;background:#fff;border-bottom:1px solid var(--gt-border);flex-shrink:0}.rowvia-gantt .gantt-title{display:flex;align-items:baseline;gap:10px;min-width:0}.rowvia-gantt .gantt-title-name{font-size:15px;font-weight:600;white-space:nowrap}.rowvia-gantt .gantt-title-sub{font-size:12px;color:var(--gt-text-tertiary);white-space:nowrap}.rowvia-gantt .gantt-tools{display:flex;align-items:center;gap:8px}.rowvia-gantt .gt-tool-label{font-size:12px;color:var(--gt-text-secondary)}.rowvia-gantt .gt-sep{width:1px;height:18px;background:var(--gt-border);margin:0 2px}.rowvia-gantt .gt-seg{display:inline-flex;border:1px solid var(--gt-border);border-radius:6px;overflow:hidden;background:#fff}.rowvia-gantt .gt-seg button{border:none;background:transparent;padding:4px 12px;font-size:12px;color:var(--gt-text-secondary);cursor:pointer;border-right:1px solid var(--gt-border-light);line-height:20px}.rowvia-gantt .gt-seg button:last-child{border-right:none}.rowvia-gantt .gt-seg button:hover{background:#3370ff0f;color:var(--gt-accent)}.rowvia-gantt .gt-seg button.gt-seg-active{background:var(--gt-accent);color:#fff}.rowvia-gantt .gt-btn{border:1px solid var(--gt-border);background:#fff;border-radius:6px;padding:4px 12px;font-size:12px;line-height:20px;color:var(--gt-text);cursor:pointer;white-space:nowrap}.rowvia-gantt .gt-btn:hover{border-color:var(--gt-accent);color:var(--gt-accent)}.rowvia-gantt .gt-btn-active{border-color:var(--gt-accent);color:var(--gt-accent);background:#3370ff0f}.rowvia-gantt .gt-btn-active:after{content:"";display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--gt-accent);margin-left:6px;vertical-align:1px}.rowvia-gantt .gantt-body{flex:1;display:flex;min-height:0;background:#fff}.rowvia-gantt .gantt-left{width:660px;min-width:660px;display:flex;flex-direction:column;border-right:1px solid var(--gt-border);overflow:hidden}.rowvia-gantt .gantt-left .grid{flex:1;min-height:0}.rowvia-gantt .gantt-left .ag-theme-quartz{--ag-header-height: 44px;--ag-row-height: 36px;--ag-font-size: 12px;--ag-header-font-size: 12px;--ag-header-background-color: #fff;--ag-header-foreground-color: var(--gt-text);--ag-foreground-color: var(--gt-text);--ag-secondary-foreground-color: var(--gt-text-tertiary);--ag-odd-row-background-color: transparent;--ag-border-color: var(--gt-border-light);--ag-row-hover-color: rgba(51, 112, 255, .05);--ag-selected-row-background-color: rgba(51, 112, 255, .09);--ag-cell-horizontal-padding: 12px}.rowvia-gantt .gantt-left .ag-header-cell{font-weight:500;border-bottom:1px solid var(--gt-border)}.rowvia-gantt .gantt-left .ag-cell{border-bottom:1px solid rgba(31,35,41,.05)}.rowvia-gantt .gantt-left .ag-row.ag-row-group{background:var(--gt-group-row)}.rowvia-gantt .gantt-left .ag-row.ag-row-group.ag-row-hover{background:#3370ff0f}.rowvia-gantt .gantt-left .ag-body-viewport::-webkit-scrollbar{width:6px}.rowvia-gantt .gantt-left .ag-body-viewport::-webkit-scrollbar-thumb{background:#1f23292e;border-radius:3px}.rowvia-gantt .gantt-left .ag-body-viewport::-webkit-scrollbar-track{background:transparent}.rowvia-gantt .gantt-right{flex:1;min-width:0;display:flex}.rowvia-gantt .gantt-status{display:flex;align-items:center;justify-content:flex-end;gap:20px;height:36px;padding:0 16px;background:#fff;border-top:1px solid var(--gt-border);font-size:12px;color:var(--gt-text-secondary);flex-shrink:0}.rowvia-gantt .gt-status-item{display:flex;align-items:baseline;gap:5px;white-space:nowrap}.rowvia-gantt .gt-status-value{font-weight:600;color:var(--gt-text);font-variant-numeric:tabular-nums}.rowvia-gantt .gt-task-name{display:inline-flex;align-items:center;gap:6px}.rowvia-gantt .gt-name-icon{width:12px;height:12px;min-width:12px;border:1.5px solid var(--gt-text-tertiary);margin-right:2px}.rowvia-gantt .gt-name-icon-task{border-radius:50%}.rowvia-gantt .gt-name-icon-milestone{border-radius:3px;border-color:#f80}.rowvia-gantt .gt-task-badge{font-size:10px;padding:0 5px;border-radius:4px;line-height:16px;white-space:nowrap}.rowvia-gantt .gt-task-badge-phase{background:#3370ff1a;color:var(--gt-accent)}.rowvia-gantt .gt-task-badge-milestone{background:#ff88001f;color:#d97400}.rowvia-gantt .gt-cell-owner{display:flex;align-items:center;gap:6px}.rowvia-gantt .gt-cell-owner-empty{color:#c2c7cd;font-size:12px}.rowvia-gantt .gt-avatar{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;min-width:20px;border-radius:50%;color:#fff;font-size:11px;line-height:1;cursor:pointer;-webkit-user-select:none;user-select:none}.rowvia-gantt .gt-cell-status{display:inline-flex;align-items:center;gap:6px;white-space:nowrap}.rowvia-gantt .gt-status-dot{width:7px;height:7px;border-radius:50%;background:currentColor}.rowvia-gantt .gt-cell-status.gt-status-not-started{color:var(--gt-text-tertiary)}.rowvia-gantt .gt-cell-status.gt-status-in-progress{color:var(--gt-status-in-progress)}.rowvia-gantt .gt-cell-status.gt-status-done{color:var(--gt-status-done)}.rowvia-gantt .gt-cell-status.gt-status-delayed{color:var(--gt-status-delayed)}.rowvia-gantt .gt-cell-status-summary{color:var(--gt-text-tertiary)}.rowvia-gantt .gt-cell-date{font-variant-numeric:tabular-nums}.rowvia-gantt .gt-cell-date-derived{color:var(--gt-text-tertiary)}.rowvia-gantt .gt-cell-date-empty{color:#c2c7cd}.rowvia-gantt .gt-cell-progress{display:flex;align-items:center;gap:6px}.rowvia-gantt .gt-progress-track{flex:1;height:4px;border-radius:2px;background:var(--gt-fill);overflow:hidden}.rowvia-gantt .gt-progress-fill{display:block;height:100%;border-radius:2px;background:var(--gt-status-in-progress)}.rowvia-gantt .gt-progress-fill.gt-status-done{background:var(--gt-status-done)}.rowvia-gantt .gt-progress-fill.gt-status-delayed{background:var(--gt-status-delayed)}.rowvia-gantt .gt-progress-value{font-size:11px;color:var(--gt-text-tertiary);font-variant-numeric:tabular-nums;min-width:30px;text-align:right}.rowvia-gantt .gt-cell-progress-summary{color:var(--gt-text-tertiary);font-size:12px}.rowvia-gantt .gt-root{position:relative;flex:1;min-width:0;display:flex;flex-direction:column;overflow:hidden;-webkit-user-select:none;user-select:none}.rowvia-gantt .gt-header{position:relative;height:var(--gt-header-height);background:#fff;border-bottom:1px solid var(--gt-border);overflow:hidden;flex-shrink:0}.rowvia-gantt .gt-ruler{display:block}.rowvia-gantt .gt-ruler-tools{position:absolute;right:12px;top:0;height:100%;display:flex;align-items:center;gap:2px;z-index:6;background:linear-gradient(to right,#fff0 0,#fff 28px);padding-left:28px}.rowvia-gantt .gt-ruler-btn{border:none;background:transparent;font-size:12px;color:var(--gt-text-secondary);padding:3px 7px;border-radius:4px;cursor:pointer;line-height:18px;font-family:inherit}.rowvia-gantt .gt-ruler-btn:hover{background:var(--gt-fill);color:var(--gt-accent)}.rowvia-gantt .gt-ruler-step{display:inline-flex;align-items:center;gap:3px;font-weight:500}.rowvia-gantt .gt-ruler-caret{font-size:9px}.rowvia-gantt .gt-ruler-icon{font-size:13px;padding:3px 6px}.rowvia-gantt .gt-ruler-zoom-value{font-size:11px;color:var(--gt-text-tertiary);min-width:38px;text-align:center;font-variant-numeric:tabular-nums}.rowvia-gantt .gt-ruler-today{font-weight:500}.rowvia-gantt .gt-step-menu{position:absolute;background:#fff;border:1px solid var(--gt-border);border-radius:6px;box-shadow:0 8px 24px #1f23291f;padding:4px;z-index:20;min-width:76px}.rowvia-gantt .gt-step-item{padding:6px 10px;font-size:12px;color:var(--gt-text);border-radius:4px;cursor:pointer}.rowvia-gantt .gt-step-item:hover{background:var(--gt-fill)}.rowvia-gantt .gt-step-item-active{color:var(--gt-accent);font-weight:600}.rowvia-gantt .gt-scroll{flex:1;min-height:0;overflow:auto;position:relative}.rowvia-gantt .gt-spacer{pointer-events:none}.rowvia-gantt .gt-canvas{position:absolute;left:0;top:0;display:block}.rowvia-gantt .gt-tooltip{position:absolute;z-index:10;background:#1f2329eb;color:#fff;font-size:11px;padding:4px 8px;border-radius:4px;pointer-events:none;white-space:nowrap}.rowvia-gantt .gt-popup{position:absolute;z-index:11;background:#fff;border:1px solid var(--gt-border);border-radius:8px;box-shadow:0 8px 24px #1f23291f;padding:6px;min-width:136px}.rowvia-gantt .gt-popup-title{font-size:11px;color:var(--gt-text-tertiary);padding:4px 8px 6px}.rowvia-gantt .gt-popup-item{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:6px;font-size:13px;cursor:pointer}.rowvia-gantt .gt-popup-item:hover{background:#3370ff14}.rowvia-gantt .gt-popup-item-active{color:var(--gt-accent);font-weight:600}.rowvia-gantt .gt-popup-clear{border-top:1px solid var(--gt-border-light);margin-top:4px;border-radius:0 0 6px 6px;color:var(--gt-text-secondary);font-size:12px}.rowvia-gantt .gt-panel{position:fixed;z-index:30;display:none;width:420px;max-width:calc(100vw - 24px);background:#fff;border:1px solid var(--gt-border);border-radius:8px;box-shadow:0 10px 32px #1f232924;padding:14px 16px}.rowvia-gantt .gt-panel-title{font-size:14px;font-weight:600;margin-bottom:12px}.rowvia-gantt .gt-panel-empty{font-size:12px;color:var(--gt-text-tertiary);padding:8px 0 12px}.rowvia-gantt .gt-panel-hint{font-size:11px;color:var(--gt-text-tertiary);margin-top:10px}.rowvia-gantt .gt-panel-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:14px;padding-top:12px;border-top:1px solid var(--gt-border-light)}.rowvia-gantt .gt-panel-btn{border:1px solid var(--gt-border);background:#fff;border-radius:6px;padding:5px 16px;font-size:12px;color:var(--gt-text);cursor:pointer}.rowvia-gantt .gt-panel-btn:hover{border-color:var(--gt-accent);color:var(--gt-accent)}.rowvia-gantt .gt-panel-btn-primary{background:var(--gt-accent);border-color:var(--gt-accent);color:#fff}.rowvia-gantt .gt-panel-btn-primary:hover{background:#245bdb;color:#fff}.rowvia-gantt .gt-panel-select,.rowvia-gantt .gt-panel-input{height:28px;border:1px solid var(--gt-border);border-radius:6px;padding:0 8px;font-size:12px;font-family:inherit;color:var(--gt-text);background:#fff;min-width:0}.rowvia-gantt .gt-panel-select:focus,.rowvia-gantt .gt-panel-input:focus{outline:none;border-color:var(--gt-accent)}.rowvia-gantt .gt-panel-input-num{width:76px}.rowvia-gantt .gt-filter-row{display:flex;align-items:center;gap:6px;margin-bottom:8px}.rowvia-gantt .gt-filter-row .gt-panel-select:first-child{width:96px;flex:none}.rowvia-gantt .gt-filter-row .gt-panel-select-cond{width:76px;flex:none}.rowvia-gantt .gt-filter-row .gt-panel-input[type=date],.rowvia-gantt .gt-filter-row .gt-panel-input[type=text]{flex:1}.rowvia-gantt .gt-filter-remove{border:none;background:transparent;color:var(--gt-text-tertiary);font-size:14px;cursor:pointer;padding:2px 6px;border-radius:4px;flex:none}.rowvia-gantt .gt-filter-remove:hover{background:var(--gt-fill);color:var(--gt-status-delayed)}.rowvia-gantt .gt-filter-add{display:flex;flex-wrap:wrap;gap:6px;margin-top:4px}.rowvia-gantt .gt-filter-add-btn{border:1px dashed var(--gt-border);background:#fff;border-radius:6px;padding:4px 10px;font-size:12px;color:var(--gt-text-secondary);cursor:pointer}.rowvia-gantt .gt-filter-add-btn:hover{border-color:var(--gt-accent);color:var(--gt-accent)}.rowvia-gantt .gt-sort-item{display:flex;align-items:center;gap:8px;padding:8px 10px;border-radius:6px;cursor:pointer;font-size:13px}.rowvia-gantt .gt-sort-item:hover{background:var(--gt-fill)}.rowvia-gantt .gt-sort-item-active{color:var(--gt-accent)}.rowvia-gantt .gt-sort-label{flex:1}.rowvia-gantt .gt-sort-badge{min-width:18px;height:18px;border-radius:9px;background:var(--gt-accent);color:#fff;font-size:11px;display:inline-flex;align-items:center;justify-content:center;padding:0 5px}.rowvia-gantt .gt-sort-dir{font-size:12px}.rowvia-gantt{width:100%;height:100%;min-height:260px;position:relative;font:12px -apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,sans-serif;color:#1f2329;--gt-header-height:72px;--gt-accent:#4555e5;--gt-group-row:#fff}.rowvia-gantt .gantt-app{height:100%;position:relative}.rowvia-gantt .gantt-toolbar{height:40px;padding:0 16px;border-color:#eff0f1}.rowvia-gantt .gantt-title-name{font-size:14px}.rowvia-gantt .gantt-title-sub{font-size:11px;background:#f5f3fa;padding:2px 5px;color:#646a73}.rowvia-gantt .gt-view-toolbar{display:flex;align-items:center;gap:4px;height:40px;flex-shrink:0;padding:0 16px;border-bottom:1px solid #eff0f1}.rowvia-gantt .gt-toolbar-spacer{flex:1}.rowvia-gantt .gt-btn{border:0;padding:4px 8px;border-radius:4px}.rowvia-gantt .gt-btn:hover{background:#f5f6f7;color:#1f2329}.rowvia-gantt .gt-quick{height:44px;display:flex;align-items:center;padding:0 16px;flex-shrink:0}.rowvia-gantt .gt-quick input{font:inherit;border:0;outline:none;width:200px;padding:6px 8px;border-radius:4px;background:transparent}.rowvia-gantt .gt-quick input:focus{outline:1px solid #4555e5}.rowvia-gantt .gantt-body{margin:0 16px 16px;border:1px solid #dee0e3;border-radius:4px;overflow:hidden}.rowvia-gantt .gantt-left{width:250px;min-width:160px;flex-shrink:0;background:#fff}.rowvia-gantt .gantt-left .ag-theme-quartz{--ag-header-height:72px;--ag-cell-horizontal-padding:16px;--ag-font-size:12px}.rowvia-gantt .gantt-left .ag-root-wrapper{border:0;border-radius:0}.rowvia-gantt .gantt-left .ag-row.ag-row-group{background:#fff}.rowvia-gantt .gantt-left .ag-row.ag-row-hover{background:#f5f6f7}.rowvia-gantt .gantt-left .ag-cell{border-right:0}.rowvia-gantt .gantt-left .ag-header-cell{border:0}.rowvia-gantt .gt-title-header{height:100%;display:flex;align-items:center;gap:8px;color:#646a73;font-weight:400}.rowvia-gantt .gt-tree-toggle{border:0;background:none;color:#8f959e;cursor:pointer;padding:0;font-size:12px}.rowvia-gantt .gt-title-link{font:inherit;border:0;background:none;text-align:left;cursor:pointer;padding:0;color:inherit;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rowvia-gantt .gt-title-link:hover{color:#4555e5}.rowvia-gantt .gt-task-name{min-width:0;max-width:100%;gap:8px}.rowvia-gantt .gt-node-dot{width:12px;height:12px;border:1px solid #b9bdc2;border-radius:50%;background:#d1d4d8;flex-shrink:0}.rowvia-gantt .gt-node-done{background:#34b625;border-color:#289b1d}.rowvia-gantt .gt-node-in-progress{background:#ffcf22;border-color:#e1b31a}.rowvia-gantt .gt-node-delayed{background:#f54a45;border-color:#d83931}.rowvia-gantt .gantt-status{position:absolute;right:110px;bottom:26px;border:1px solid #eff0f1;border-radius:24px;box-shadow:0 2px 8px #1f232914;padding:0 16px;height:36px;font-size:12px;z-index:8}.rowvia-gantt .gt-ruler-tools{height:40px;right:12px}.rowvia-gantt .gt-ruler-today{border-left:1px solid #eff0f1;border-radius:0;margin-left:8px;padding-left:16px}.rowvia-gantt .gt-step-menu{min-width:120px;right:150px!important}.rowvia-gantt .gt-step-item{cursor:pointer}.rowvia-gantt .gt-settings{position:absolute;z-index:25;right:16px;top:76px;width:288px;padding:16px;background:#fff;border:1px solid #dee0e3;border-radius:6px;box-shadow:0 4px 16px #1f23291f}.rowvia-gantt .gt-settings[hidden]{display:none}.rowvia-gantt .gt-settings-title{margin-bottom:12px}.rowvia-gantt .gt-settings label{display:flex;align-items:center;gap:6px;margin:10px 0}.rowvia-gantt .gt-settings input{accent-color:#4555e5;margin:0}.rowvia-gantt .gt-settings .gt-indented{margin-left:22px}.rowvia-gantt .gt-theme-options{display:flex;gap:8px;margin-top:16px}.rowvia-gantt .gt-theme-options label{padding:20px 10px;border:1px solid #dee0e3;border-radius:4px;flex:1}.rowvia-gantt .gt-theme-options label:has(:checked){border-color:#4555e5;background:#f5f5ff}.rowvia-gantt button:focus-visible,.rowvia-gantt [tabindex]:focus-visible{outline:2px solid #4555e5;outline-offset:-2px}@media (max-width:600px){.rowvia-gantt .gantt-left{width:180px!important;min-width:140px}.rowvia-gantt .gantt-body{margin:0 8px 8px}.rowvia-gantt .gantt-status{right:20px;bottom:18px}.rowvia-gantt .gt-ruler-tools{right:0;padding-left:4px;gap:0}.rowvia-gantt .gt-ruler-btn{padding:3px 4px}}.rowvia-gantt{font-size:14px;--gt-header-height:80px}.rowvia-gantt .gantt-toolbar,.rowvia-gantt .gt-view-toolbar{height:44px}.rowvia-gantt .gt-quick{height:48px}.rowvia-gantt .gantt-left .ag-theme-quartz{--ag-header-height:80px;--ag-font-size:14px;--ag-font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC",sans-serif}.rowvia-gantt .gantt-left .ag-cell{border-bottom:1px solid #dee0e3}.rowvia-gantt .gt-title-header,.rowvia-gantt .gt-ruler-btn{font-size:14px}.rowvia-gantt .gantt-left .ag-group-value{min-width:0;overflow:visible}.rowvia-gantt .gt-child-name{position:relative}.rowvia-gantt .gt-child-name:before{content:"";position:absolute;left:-24px;top:-14px;width:15px;height:26px;border-left:1px solid #dee0e3;border-bottom:1px solid #dee0e3;border-bottom-left-radius:7px}.rowvia-gantt .gt-root-leaf{padding-left:24px}.rowvia-gantt .gt-task-name{width:100%}.rowvia-gantt .gt-title-link{max-width:100%}.rowvia-gantt .gantt-status{font-size:14px}.rowvia-gantt .gantt-left .ag-row-group .gt-title-link{font-weight:500}.rowvia-gantt .gt-child-name{padding-left:12px}.rowvia-gantt .gt-child-name:before{top:-22px;height:34px;left:-12px}.rowvia-gantt .gt-title-header{padding-left:8px}.rowvia-gantt .gt-today-badge{position:absolute;width:50px;height:20px;line-height:20px;text-align:center;background:#4555e5;color:#fff;border-radius:12px;font-size:12px;pointer-events:none;z-index:7}.personnel-schedule{font:14px/1.5 -apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,sans-serif;color:#1f2329;background:#fff;height:100%;min-height:400px;position:relative;display:flex;flex-direction:column;overflow:hidden;--line:#e4e5e7;--blue:#4254e8}.personnel-schedule *{box-sizing:border-box}.personnel-schedule [hidden]{display:none!important}.personnel-schedule button,.personnel-schedule input,.personnel-schedule select{font:inherit;color:inherit}.personnel-schedule button{border:0;background:transparent;cursor:pointer;padding:5px 8px;border-radius:4px;white-space:nowrap}.personnel-schedule button:hover{background:#f1f2f5}.personnel-schedule button:focus-visible,.personnel-schedule input:focus-visible,.personnel-schedule select:focus-visible{outline:2px solid #6874ec;outline-offset:1px}.personnel-schedule input:not([type=checkbox]):not([type=range]),.personnel-schedule select{border:1px solid var(--line);border-radius:4px;padding:6px 8px;background:#fff;min-width:0}.personnel-schedule input[type=checkbox]{accent-color:var(--blue);margin-right:7px}.personnel-schedule .ps-title{height:44px;flex-shrink:0;border-bottom:1px solid var(--line);display:flex;gap:8px;align-items:center;padding:0 16px}.personnel-schedule .ps-title strong{font-weight:500}.personnel-schedule .ps-app-icon{color:#fff;background:#18b6a4;border-radius:6px;width:24px;height:24px;text-align:center}.personnel-schedule .ps-title nav{position:absolute;left:44%;display:flex;gap:16px;font-size:13px}.personnel-schedule .ps-title nav button{height:44px;color:#646a73}.personnel-schedule .ps-title nav .active{color:#1f2329}.personnel-schedule .ps-toolbar{height:48px;display:flex;align-items:center;gap:8px;padding:0 16px;border-bottom:1px solid var(--line);flex-shrink:0;white-space:nowrap}.personnel-schedule .ps-toolbar button{font-size:13px}.personnel-schedule .ps-tint{background:#f0f1ff;color:var(--blue)}.personnel-schedule .ps-space{flex:1}.personnel-schedule .ps-round{border:1px solid var(--line);border-radius:50%;padding:0;width:24px;height:24px;color:#9da1a7}.personnel-schedule .ps-zoom{width:112px;height:3px;accent-color:#9098e4}.personnel-schedule .ps-save{border:1px solid var(--line);color:var(--blue)}.personnel-schedule .ps-scroll{flex:1;min-height:0;overflow:auto;position:relative;padding-bottom:54px}.personnel-schedule .ps-table{min-width:100%}.personnel-schedule .ps-time-header{height:34px;display:flex;position:sticky;top:0;z-index:5;background:#fff;border-bottom:1px solid var(--line)}.personnel-schedule .ps-date-nav{width:200px;flex-shrink:0;position:sticky;left:0;z-index:6;display:flex;align-items:center;padding:0 16px;background:#fff;border-right:1px solid var(--line);font-size:12px;font-weight:500}.personnel-schedule .ps-date-nav button{padding:0 3px}.personnel-schedule .ps-date-nav .ps-date-label{margin-right:4px}.personnel-schedule .ps-weeks{display:flex;font-size:12px;font-weight:500;align-items:stretch}.personnel-schedule .ps-weeks span{flex-shrink:0;border-right:1px solid var(--line);text-align:center;padding:8px 0}.personnel-schedule .ps-person-row{display:flex;border-bottom:2px solid #dcdfe3;position:relative}.personnel-schedule .ps-person{width:200px;flex-shrink:0;position:sticky;left:0;z-index:3;background:#fff;border-right:1px solid var(--line);padding:12px 16px;color:#8b8f97;font-size:12px}.personnel-schedule .ps-person>div:not(:first-child){display:flex;justify-content:space-between;height:24px;align-items:center}.personnel-schedule .ps-person b{font-weight:500;color:#40444c}.personnel-schedule .ps-person-name{display:flex;align-items:center;gap:6px;color:#1f2329;font-size:14px;margin-bottom:8px}.personnel-schedule .ps-person-name strong{font-weight:500}.personnel-schedule .ps-avatar{width:24px;height:24px;border-radius:50%;color:#fff;text-align:center;font-size:8px;line-height:24px;box-shadow:inset 0 0 8px #ffffff50}.personnel-schedule .ps-person button{padding:0;color:#5665dc;font-size:12px}.personnel-schedule .ps-timeline{position:relative;overflow:hidden;background:repeating-linear-gradient(to right,transparent 0,transparent calc(var(--day) - 1px),#e9eaec calc(var(--day) - 1px),#e9eaec var(--day))}.personnel-schedule .ps-weekend{position:absolute;top:0;bottom:0;background:#f4f4f5;z-index:0;border-right:1px solid #e9eaec}.personnel-schedule .ps-today{position:absolute;top:0;bottom:0;border-left:1px solid #9f93f2;z-index:2;pointer-events:none}.personnel-schedule .ps-today:before{content:"";position:absolute;top:0;left:-3px;width:5px;height:5px;background:#9f93f2;border-radius:50%}.personnel-schedule .ps-bar{position:absolute;height:32px;display:flex;align-items:center;gap:6px;text-align:left;border-radius:0;padding:0 10px;overflow:hidden;z-index:2;touch-action:none;-webkit-user-select:none;user-select:none;cursor:grab;font-size:12px}.personnel-schedule .ps-color{background:color-mix(in srgb,var(--bar-color) 85%,transparent);color:#fff}.personnel-schedule .ps-bar.ps-color:hover{background:var(--bar-color);box-shadow:0 0 0 1px #7698d1}.personnel-schedule .ps-bar-name{overflow:hidden;text-overflow:ellipsis;max-width:300px;flex-shrink:0}.personnel-schedule .ps-status{background:#00000015;border-radius:3px;padding:0 4px;flex-shrink:0}.personnel-schedule .ps-node{flex-shrink:0}.personnel-schedule .ps-node:first-letter{color:#46aa59}.personnel-schedule .ps-effort{margin-left:auto;padding-right:8px}.personnel-schedule .ps-content{background:#fff;border:1px solid #d9dce2;border-left:4px solid var(--bar-color);color:#4f5560}.personnel-schedule .ps-resize{position:absolute;left:0;top:0;bottom:0;width:7px;cursor:ew-resize}.personnel-schedule .ps-resize[data-edge=end]{left:auto;right:0}.personnel-schedule .ps-no-schedule{position:absolute;left:24px;top:54px;color:#b6b9c0;font-size:12px}.personnel-schedule .ps-total{position:absolute;bottom:24px;right:104px;z-index:6;background:#fff;border:1px solid #e3e5eb;border-radius:24px;padding:10px 14px;box-shadow:0 3px 16px #202d4b12;color:#8d929b;font-size:12px}.personnel-schedule .ps-empty{padding:80px;width:calc(100vw - 30px);text-align:center;color:#8d929b}.personnel-schedule .ps-popover{position:absolute;z-index:20;background:#fff;border:1px solid #dddfe5;box-shadow:0 5px 20px #25324b18;border-radius:5px;width:420px;max-width:calc(100% - 24px);padding:16px;font-size:13px;max-height:calc(100% - 120px);overflow:auto}.personnel-schedule .ps-panel-title{color:#757b85;margin:0 0 14px;display:flex;justify-content:space-between;align-items:center;font-size:13px}.personnel-schedule .ps-popover label{display:flex;align-items:center;gap:6px;margin:8px 0}.personnel-schedule .ps-panel-title label{margin:0;font-size:12px}.personnel-schedule .ps-person-filter{display:flex;gap:10px;margin-bottom:12px}.personnel-schedule .ps-person-filter span{background:#f5f6f8;padding:7px;flex:1;white-space:nowrap;font-size:12px}.personnel-schedule .ps-person-search{width:100%}.personnel-schedule .ps-person-options{display:grid;grid-template-columns:1fr 1fr}.personnel-schedule .ps-sort-fields{display:flex;gap:6px;background:#f5f6f8}.personnel-schedule .ps-sort-fields select{flex:1}.personnel-schedule .ps-link{color:#5665dc}.personnel-schedule .ps-segment{display:flex;background:#f2f3f5;border:1px solid var(--line);border-radius:5px;margin-bottom:16px}.personnel-schedule .ps-segment button{flex:1}.personnel-schedule .selected{color:#4254e8;background:#eef0ff}.personnel-schedule .ps-segment .selected{color:#fff;background:#4254e8}.personnel-schedule .ps-panel-settings{width:320px}.personnel-schedule .ps-style-options{display:flex;gap:12px}.personnel-schedule .ps-style-options button{border:1px solid var(--line);width:50%;text-align:left;font-size:12px}.personnel-schedule .ps-style-options i{display:block;margin:10px 0 20px;height:28px;border-left:4px solid #8270ef;background:linear-gradient(#fff 25%,#e9eaee 25%,#e9eaee 75%,#fff 75%)}.personnel-schedule .ps-style-options button:last-child i{border:7px solid #8270ef;background:#fff;border-radius:5px}.personnel-schedule .ps-range-inputs{display:flex;gap:10px;align-items:center}.personnel-schedule .ps-range-inputs input{width:50%}.personnel-schedule .ps-calendars{display:flex;gap:16px;margin:12px 0}.personnel-schedule .ps-calendar{flex:1;min-width:0}.personnel-schedule .ps-calendar>div:first-child{display:flex;justify-content:space-between;align-items:center}.personnel-schedule .ps-calendar strong{font-size:13px;font-weight:500}.personnel-schedule .ps-calendar-grid{display:grid;grid-template-columns:repeat(7,1fr);margin-top:10px;gap:2px;text-align:center}.personnel-schedule .ps-calendar-grid>*{height:28px;font-size:12px;padding:5px 0}.personnel-schedule .ps-calendar-grid button{border-radius:50%}.personnel-schedule .ps-calendar-grid .in-range{background:#f0f1fb}.personnel-schedule .ps-calendar-grid .selected{background:#4254e8;color:#fff}.personnel-schedule .ps-presets{display:flex;gap:6px;flex-wrap:wrap;border-top:1px solid var(--line);padding-top:10px}.personnel-schedule .ps-presets button{background:#f4f5f7;color:#5262d5;min-width:66px;font-size:12px}.personnel-schedule .ps-panel-unplanned{width:760px}.personnel-schedule table{width:100%;border-collapse:collapse;font-size:12px}.personnel-schedule th{text-align:left;font-weight:400;color:#9398a0;border-bottom:1px solid #d7dae0;padding:8px 0}.personnel-schedule td{padding:8px 0}.personnel-schedule td:first-child button{max-width:310px;overflow:hidden;text-overflow:ellipsis;font-weight:500}.personnel-schedule td input{width:65px!important;border:0!important}.personnel-schedule td:nth-child(2){color:#9499a1}.personnel-schedule .ps-detail{position:absolute;right:0;top:0;bottom:0;width:660px;max-width:90%;background:#fff;box-shadow:-6px 0 20px #25324b20;z-index:30;overflow:auto;border-left:1px solid var(--line)}.personnel-schedule .ps-detail header{height:52px;display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid var(--line);padding:0 20px}.personnel-schedule .ps-detail-body{padding:24px}.personnel-schedule .ps-detail h3{font-size:16px;margin:24px 0}.personnel-schedule .ps-detail label{display:grid;grid-template-columns:140px 1fr;gap:15px;align-items:center;margin:20px 0}.personnel-schedule .ps-chip{background:#f0edff;padding:3px 6px;border-radius:3px;font-size:12px}.personnel-schedule .ps-primary{background:#4254e8;color:#fff;padding:7px 18px}.personnel-schedule .ps-primary:hover{background:#3447d7}.personnel-schedule .ps-error{color:#d34848}.personnel-schedule .ps-view{display:block;width:100%;text-align:left}.personnel-schedule .ps-toast{position:absolute;top:24px;left:50%;transform:translate(-50%);border-radius:6px;padding:10px 22px;background:#252a36;color:#fff;z-index:50;font-size:13px}@media (max-width:700px){.personnel-schedule .ps-toolbar{overflow-x:auto;gap:4px;padding:0 8px}.personnel-schedule .ps-title nav{position:static;margin-left:auto}.personnel-schedule .ps-zoom{min-width:70px}.personnel-schedule .ps-total{right:16px}.personnel-schedule .ps-detail label{grid-template-columns:90px 1fr}.personnel-schedule .ps-panel-unplanned{overflow:auto}.personnel-schedule .ps-panel-unplanned table{min-width:620px}}