@masterteam/task-schedule 0.0.2 → 0.0.4
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/README.md +102 -70
- package/assets/i18n/ar.json +58 -0
- package/assets/i18n/en.json +58 -0
- package/assets/task-schedule.css +2 -2
- package/fesm2022/masterteam-task-schedule.mjs +2025 -2046
- package/fesm2022/masterteam-task-schedule.mjs.map +1 -1
- package/package.json +8 -3
- package/types/masterteam-task-schedule.d.ts +301 -201
package/README.md
CHANGED
|
@@ -5,25 +5,27 @@ Syncfusion Gantt based task-schedule package with external model switching.
|
|
|
5
5
|
## Public API
|
|
6
6
|
|
|
7
7
|
- `TaskSchedule` component (`mt-task-schedule`)
|
|
8
|
-
- `
|
|
9
|
-
- `
|
|
10
|
-
- `
|
|
11
|
-
- `
|
|
12
|
-
- `
|
|
8
|
+
- `TaskScheduleHeader` component (`mt-task-schedule-header`)
|
|
9
|
+
- `TaskScheduleImportDialog` component (`mt-task-schedule-import-dialog`)
|
|
10
|
+
- `TaskScheduleFetchDataAdapter` interface
|
|
11
|
+
- `TaskScheduleActionDataAdapter` interface
|
|
12
|
+
- `TaskScheduleFetchService`
|
|
13
|
+
- `TaskScheduleActionService`
|
|
13
14
|
- `TaskScheduleModelType`
|
|
14
15
|
- `TaskScheduleContext`
|
|
15
16
|
- `TASK_SCHEDULE_DEFAULT_PDF_FONT`
|
|
16
17
|
|
|
17
18
|
## Inputs
|
|
18
19
|
|
|
19
|
-
- `
|
|
20
|
-
|
|
20
|
+
- `context`: object with required `levelId` and `levelDataId` for fetch-based schedule reads
|
|
21
|
+
|
|
22
|
+
Main context fields:
|
|
23
|
+
|
|
24
|
+
- `modelType`: `'default' | 'edit' | 'baseline' | 'criticalPath' | 'critical-path' | 'resources' | 'unscheduled' | 'phaseGate' | 'custom'`
|
|
25
|
+
- `langCode`: `'en' | 'ar' | null`
|
|
21
26
|
- `dateFormat`: default `dd/MM/yyyy`
|
|
22
27
|
- `height`: default `760px`
|
|
23
|
-
- `
|
|
24
|
-
- `pdfFontData`: optional base64 TTF string for PDF export font
|
|
25
|
-
- `pdfRtlFontData`: optional base64 TTF string used in RTL/Arabic PDF export
|
|
26
|
-
- `pdfFontSize`: optional PDF font size (default `11`)
|
|
28
|
+
- `pdfFonts`: optional `{ regular?: string; arabic?: string; size?: number }`
|
|
27
29
|
|
|
28
30
|
## Outputs
|
|
29
31
|
|
|
@@ -33,21 +35,37 @@ Syncfusion Gantt based task-schedule package with external model switching.
|
|
|
33
35
|
- `loaded`
|
|
34
36
|
- `loadError`
|
|
35
37
|
|
|
36
|
-
`
|
|
38
|
+
`TaskScheduleFetchDataAdapter` methods:
|
|
37
39
|
|
|
40
|
+
- `load(modelType, context)`
|
|
38
41
|
- `importTasks(context, file)`
|
|
42
|
+
- `exportTasks(context)`
|
|
43
|
+
- `loadDependencies(context)`
|
|
44
|
+
- `loadTimeline(context, mode)`
|
|
45
|
+
- `loadBaselineVersions(context)`
|
|
46
|
+
- `loadBaselineSnapshot(context, version?)`
|
|
47
|
+
|
|
48
|
+
`TaskScheduleActionDataAdapter` methods:
|
|
49
|
+
|
|
50
|
+
- `createTask(context, payload)`
|
|
51
|
+
- `updateTask(context, taskId, payload)`
|
|
52
|
+
- `deleteTask(context, taskId)`
|
|
53
|
+
- `updateBulkTasks(context, payload)`
|
|
54
|
+
- `updateParent(context, taskId, parentId)`
|
|
55
|
+
- `updateOrder(context, payload)`
|
|
56
|
+
- `updateProgress(context, taskId, payload)`
|
|
39
57
|
- `applyImportedTasks(context, payload)`
|
|
40
58
|
- `setBaseline(context, payload?)`
|
|
41
|
-
- `
|
|
59
|
+
- `createDependency(context, payload)`
|
|
60
|
+
- `updateDependency(context, dependencyId, payload)`
|
|
61
|
+
- `deleteDependency(context, dependencyId)`
|
|
42
62
|
|
|
43
63
|
## Usage
|
|
44
64
|
|
|
45
65
|
```ts
|
|
46
66
|
import { Component, signal } from '@angular/core';
|
|
47
67
|
import {
|
|
48
|
-
TASK_SCHEDULE_DATA_ADAPTER,
|
|
49
68
|
TaskSchedule,
|
|
50
|
-
TaskScheduleDataAdapter,
|
|
51
69
|
TaskScheduleModelType,
|
|
52
70
|
} from '@masterteam/task-schedule';
|
|
53
71
|
|
|
@@ -57,86 +75,100 @@ import {
|
|
|
57
75
|
selector: 'app-task-schedule-host',
|
|
58
76
|
template: `
|
|
59
77
|
<mt-task-schedule
|
|
60
|
-
[
|
|
61
|
-
|
|
62
|
-
|
|
78
|
+
[context]="{
|
|
79
|
+
levelId: 12,
|
|
80
|
+
modelType: modelType(),
|
|
81
|
+
levelDataId: 18,
|
|
82
|
+
langCode: 'en'
|
|
83
|
+
}"
|
|
63
84
|
/>
|
|
64
85
|
`,
|
|
65
|
-
providers: [
|
|
66
|
-
{
|
|
67
|
-
provide: TASK_SCHEDULE_DATA_ADAPTER,
|
|
68
|
-
useExisting: TaskScheduleApiAdapterService,
|
|
69
|
-
},
|
|
70
|
-
],
|
|
71
86
|
})
|
|
72
87
|
export class TaskScheduleHostComponent {
|
|
73
88
|
readonly modelType = signal<TaskScheduleModelType>('default');
|
|
74
89
|
}
|
|
75
90
|
```
|
|
76
91
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
-
|
|
83
|
-
-
|
|
84
|
-
- Runtime
|
|
85
|
-
-
|
|
86
|
-
-
|
|
87
|
-
|
|
88
|
-
Runtime
|
|
89
|
-
|
|
90
|
-
- `
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
- `
|
|
95
|
-
- `PUT /api/levels/{levelId}/{levelDataId}/schedule/
|
|
96
|
-
- `
|
|
97
|
-
- `
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
- `
|
|
106
|
-
- `
|
|
107
|
-
- `
|
|
108
|
-
- `
|
|
109
|
-
- `
|
|
110
|
-
- `
|
|
111
|
-
- `endpoints
|
|
112
|
-
- `
|
|
113
|
-
- `
|
|
92
|
+
`mt-task-schedule` uses `TaskScheduleFetchService` for reads and `TaskScheduleActionService` for write actions.
|
|
93
|
+
`mt-task-schedule-header` and `TaskScheduleImportDialog` also split fetch/write behavior across the same two services.
|
|
94
|
+
|
|
95
|
+
Backend routes used:
|
|
96
|
+
|
|
97
|
+
- Mixed schedule reads (default/edit/critical/custom/resources/unscheduled): `POST /api/levels/{levelId}/{levelDataId}/schedule/read`
|
|
98
|
+
- Phase-gate runtime tree: `GET /api/levels/{levelId}/{levelDataId}/schedule/tree?renderMode=PhaseGate`
|
|
99
|
+
- Runtime baseline snapshot view: `GET /api/levels/{levelId}/{levelDataId}/schedule/baselines/latest`
|
|
100
|
+
- Runtime baseline history: `GET /api/levels/{levelId}/{levelDataId}/schedule/baselines`
|
|
101
|
+
- Runtime baseline version snapshot: `GET /api/levels/{levelId}/{levelDataId}/schedule/baselines/{version}`
|
|
102
|
+
- Runtime dependencies: `GET/POST/PUT/DELETE /api/levels/{levelId}/{levelDataId}/schedule/dependencies`
|
|
103
|
+
- Runtime timeline buckets: `POST /api/levels/{levelId}/{levelDataId}/schedule/read` with `mode: 'Timeline'`
|
|
104
|
+
- Custom view config: `GET /api/schedulemanager/{levelId}/schedule/{customViewId}`
|
|
105
|
+
- Team members (edit/resources mode): `GET /api/levels/{levelId}/TeamMember`
|
|
106
|
+
|
|
107
|
+
Runtime mutations (when `levelDataId` exists):
|
|
108
|
+
|
|
109
|
+
- `POST /api/process-submit` for create/update/delete/progress
|
|
110
|
+
- `PUT /api/levels/{levelId}/{levelDataId}/schedule/bulk-update`
|
|
111
|
+
- `PUT /api/levels/{levelId}/{levelDataId}/schedule/reorder`
|
|
112
|
+
- `POST /api/levels/{levelId}/{levelDataId}/schedule/baselines` (set baseline)
|
|
113
|
+
- `GET /api/levels/{levelId}/{levelDataId}/schedule/mpp` (export)
|
|
114
|
+
|
|
115
|
+
Plain schedule reads no longer use legacy `/api/tasks/...` read routes.
|
|
116
|
+
Import dialog keeps its current MPP preview/apply flow unless `endpoints.importTasks` / `endpoints.applyImportedTasks` are overridden.
|
|
117
|
+
|
|
118
|
+
Context options for backend routing:
|
|
119
|
+
|
|
120
|
+
- `modelType`: selected schedule mode
|
|
121
|
+
- `langCode`: optional language override
|
|
122
|
+
- `dateFormat`: optional gantt date format
|
|
123
|
+
- `height`: optional gantt height
|
|
124
|
+
- `customViewId`: used in `custom` mode to load schedule-manager view columns
|
|
125
|
+
- `resources`: optional static resource list override
|
|
126
|
+
- `endpoints`: optional endpoint template overrides (`processSubmit`, `scheduleRead`, `scheduleQuery`, `scheduleTree`, `scheduleTreePhaseGate`, `scheduleDependencies`, `scheduleDependencyById`, `scheduleBaselines`, `scheduleBaselineByVersion`, `scheduleViewById`, `teamMembers`, `createTask`, etc.)
|
|
127
|
+
- `endpoints.importTasks` / `endpoints.applyImportedTasks`: optional overrides for runtime/legacy MPP import flow
|
|
128
|
+
- `endpoints.setBaseline`: optional override for baseline endpoint (runtime default: `/api/levels/{levelId}/{levelDataId}/schedule/baselines`)
|
|
129
|
+
- `endpoints.exportTasks`: optional override for export endpoint (runtime default: `/api/levels/{levelId}/{levelDataId}/schedule/mpp`)
|
|
130
|
+
- `pdfFonts`: optional `{ regular?: string; arabic?: string; size?: number }` base64 font config for PDF export
|
|
131
|
+
|
|
132
|
+
HTTP base URL, auth, language headers, and idempotency are expected to be handled by the host app interceptors.
|
|
114
133
|
|
|
115
134
|
When no PDF font is provided, package fallback uses embedded `TASK_SCHEDULE_DEFAULT_PDF_FONT`.
|
|
116
135
|
|
|
117
|
-
## Import
|
|
136
|
+
## Import Dialog
|
|
118
137
|
|
|
119
|
-
Use `
|
|
120
|
-
The
|
|
138
|
+
Use `TaskScheduleImportDialog` with `ModalService` to import `.mpp`/`.xer` files and apply tasks (replace or append).
|
|
139
|
+
The dialog is Tailwind-based and uses `@masterteam/components` (`mt-button`, `mt-entity-preview`).
|
|
121
140
|
Imported rows support inline editing before apply (task name, planned/actual dates, assignee, progress) with per-row selection.
|
|
122
141
|
|
|
123
142
|
## Shell Component
|
|
124
143
|
|
|
125
|
-
Use `mt-task-schedule-
|
|
144
|
+
Use `mt-task-schedule-header` as a reusable schedule header that combines:
|
|
126
145
|
|
|
127
146
|
- mode switcher
|
|
128
|
-
- Set Baseline action (
|
|
129
|
-
- Import
|
|
130
|
-
- Export tasks action (
|
|
147
|
+
- Set Baseline action (feature service `setBaseline`)
|
|
148
|
+
- Import dialog orchestration
|
|
149
|
+
- Export tasks action (feature service `exportTasks`)
|
|
131
150
|
|
|
132
|
-
|
|
151
|
+
It does not render `mt-task-schedule` internally. Use it separately when you want a standard schedule header above your own schedule host.
|
|
133
152
|
|
|
153
|
+
Shell parity control fields also live on `context`:
|
|
154
|
+
|
|
155
|
+
- `modeOptions`
|
|
134
156
|
- `allowEditMode`
|
|
135
157
|
- `allowImport`
|
|
136
158
|
- `allowSetBaseline`
|
|
137
159
|
- `hasTasks`
|
|
138
160
|
- `baselinePending`
|
|
139
161
|
|
|
140
|
-
Use
|
|
162
|
+
Use the fetch service for reads/import preview/export and the action service for mutations. The package does not use NGXS.
|
|
163
|
+
|
|
164
|
+
Fetch and action helpers exposed for runtime helpers:
|
|
165
|
+
|
|
166
|
+
- `loadDependencies`
|
|
167
|
+
- `createDependency`
|
|
168
|
+
- `updateDependency`
|
|
169
|
+
- `deleteDependency`
|
|
170
|
+
- `loadTimeline`
|
|
171
|
+
- `loadBaselineVersions`
|
|
172
|
+
- `loadBaselineSnapshot`
|
|
141
173
|
|
|
142
174
|
See `PARITY_REPORT.md` for legacy-to-package migration coverage.
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"task-schedule": {
|
|
3
|
+
"common": {
|
|
4
|
+
"unexpectedError": "حدث خطأ غير متوقع."
|
|
5
|
+
},
|
|
6
|
+
"dialog": {
|
|
7
|
+
"type": "النوع",
|
|
8
|
+
"typePlaceholder": "اختر النوع",
|
|
9
|
+
"typeFirst": "اختر النوع أولاً لتحميل النموذج.",
|
|
10
|
+
"save": "حفظ",
|
|
11
|
+
"cancel": "إلغاء"
|
|
12
|
+
},
|
|
13
|
+
"header": {
|
|
14
|
+
"title": "الجدول الزمني",
|
|
15
|
+
"mode": "الوضع",
|
|
16
|
+
"setBaseline": "تعيين خط الأساس",
|
|
17
|
+
"pending": "معلق",
|
|
18
|
+
"import": "استيراد",
|
|
19
|
+
"export": "تصدير",
|
|
20
|
+
"exportFileName": "tasks",
|
|
21
|
+
"baselineNotSupported": "خدمة الإجراءات الحالية لا تدعم تعيين خط الأساس.",
|
|
22
|
+
"exportNotSupported": "خدمة الجلب الحالية لا تدعم تصدير المهام.",
|
|
23
|
+
"contextMissing": "سياق الجدول الزمني غير مكتمل.",
|
|
24
|
+
"baselineDisabled": "لا يمكن تعيين خط الأساس حالياً."
|
|
25
|
+
},
|
|
26
|
+
"modes": {
|
|
27
|
+
"default": "الافتراضي",
|
|
28
|
+
"criticalPath": "المسار الحرج",
|
|
29
|
+
"baseline": "خط الأساس",
|
|
30
|
+
"resources": "الموارد",
|
|
31
|
+
"unscheduled": "غير مجدول",
|
|
32
|
+
"phaseGate": "بوابة المرحلة",
|
|
33
|
+
"edit": "الجدولة",
|
|
34
|
+
"custom": "عرض مخصص"
|
|
35
|
+
},
|
|
36
|
+
"importModal": {
|
|
37
|
+
"title": "استيراد المهام",
|
|
38
|
+
"selectFile": "اختر ملف MPP أو XER",
|
|
39
|
+
"startImport": "بدء الاستيراد",
|
|
40
|
+
"cancel": "إلغاء",
|
|
41
|
+
"replace": "استبدال المهام الحالية",
|
|
42
|
+
"append": "إضافة إلى المهام الحالية",
|
|
43
|
+
"task": "المهمة",
|
|
44
|
+
"startDate": "تاريخ البدء",
|
|
45
|
+
"finishDate": "تاريخ الانتهاء",
|
|
46
|
+
"actualStartDate": "تاريخ البدء الفعلي",
|
|
47
|
+
"actualFinishDate": "تاريخ الانتهاء الفعلي",
|
|
48
|
+
"assignedTo": "المسند إليه",
|
|
49
|
+
"progress": "الإنجاز",
|
|
50
|
+
"noTasks": "لا توجد مهام في الملف المستورد.",
|
|
51
|
+
"missingContext": "سياق الجدول الزمني غير مكتمل.",
|
|
52
|
+
"importNotSupported": "خدمة الجلب الحالية لا تدعم الاستيراد.",
|
|
53
|
+
"applyNotSupported": "خدمة الإجراءات الحالية لا تدعم تطبيق المهام المستوردة.",
|
|
54
|
+
"chooseFileFirst": "اختر ملفاً أولاً.",
|
|
55
|
+
"rowsLimited": "تم عرض أول مجموعة من المهام فقط لتحسين الأداء."
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
{
|
|
2
|
+
"task-schedule": {
|
|
3
|
+
"common": {
|
|
4
|
+
"unexpectedError": "An unexpected error occurred."
|
|
5
|
+
},
|
|
6
|
+
"dialog": {
|
|
7
|
+
"type": "Type",
|
|
8
|
+
"typePlaceholder": "Select type",
|
|
9
|
+
"typeFirst": "Select the type first to load the form.",
|
|
10
|
+
"save": "Save",
|
|
11
|
+
"cancel": "Cancel"
|
|
12
|
+
},
|
|
13
|
+
"header": {
|
|
14
|
+
"title": "Task Schedule",
|
|
15
|
+
"mode": "Mode",
|
|
16
|
+
"setBaseline": "Set Baseline",
|
|
17
|
+
"pending": "Pending",
|
|
18
|
+
"import": "Import",
|
|
19
|
+
"export": "Export",
|
|
20
|
+
"exportFileName": "tasks",
|
|
21
|
+
"baselineNotSupported": "Current action service does not support setting baseline.",
|
|
22
|
+
"exportNotSupported": "Current fetch service does not support task export.",
|
|
23
|
+
"contextMissing": "Task schedule context is incomplete.",
|
|
24
|
+
"baselineDisabled": "Setting baseline is currently unavailable."
|
|
25
|
+
},
|
|
26
|
+
"modes": {
|
|
27
|
+
"default": "Default",
|
|
28
|
+
"criticalPath": "Critical Path",
|
|
29
|
+
"baseline": "Baseline",
|
|
30
|
+
"resources": "Resources",
|
|
31
|
+
"unscheduled": "Unscheduled",
|
|
32
|
+
"phaseGate": "PhaseGate",
|
|
33
|
+
"edit": "Scheduling",
|
|
34
|
+
"custom": "Custom View"
|
|
35
|
+
},
|
|
36
|
+
"importModal": {
|
|
37
|
+
"title": "Import Tasks",
|
|
38
|
+
"selectFile": "Select MPP or XER file",
|
|
39
|
+
"startImport": "Start Import",
|
|
40
|
+
"cancel": "Cancel",
|
|
41
|
+
"replace": "Replace existing tasks",
|
|
42
|
+
"append": "Append to existing tasks",
|
|
43
|
+
"task": "Task",
|
|
44
|
+
"startDate": "Start Date",
|
|
45
|
+
"finishDate": "Finish Date",
|
|
46
|
+
"actualStartDate": "Actual Start Date",
|
|
47
|
+
"actualFinishDate": "Actual Finish Date",
|
|
48
|
+
"assignedTo": "Assigned To",
|
|
49
|
+
"progress": "Progress",
|
|
50
|
+
"noTasks": "No tasks found in the imported file.",
|
|
51
|
+
"missingContext": "Task schedule context is incomplete.",
|
|
52
|
+
"importNotSupported": "Current fetch service does not support import.",
|
|
53
|
+
"applyNotSupported": "Current action service does not support applying imported tasks.",
|
|
54
|
+
"chooseFileFirst": "Choose a file first.",
|
|
55
|
+
"rowsLimited": "Only the first rows are shown for performance."
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
package/assets/task-schedule.css
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
/*! tailwindcss v4.2.
|
|
2
|
-
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-amber-50:oklch(98.7% .022 95.277);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-800:oklch(47.3% .137 46.201);--color-slate-50:oklch(98.4% .003 247.858);--color-slate-100:oklch(96.8% .007 247.896);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-400:oklch(70.4% .04 256.788);--color-slate-500:oklch(55.4% .046 257.417);--color-slate-600:oklch(44.6% .043 257.281);--color-slate-700:oklch(37.2% .044 257.287);--color-slate-900:oklch(20.8% .042 265.755);--color-white:#fff;--spacing:.25rem;--container-6xl:72rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--font-weight-medium:500;--font-weight-semibold:600;--tracking-wide:.025em;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.visible{visibility:visible}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.z-\[1000\]{z-index:1000}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.max-h-\[28rem\]{max-height:28rem}.w-full{width:100%}.max-w-6xl{max-width:var(--container-6xl)}.max-w-\[22rem\]{max-width:22rem}.min-w-0{min-width:calc(var(--spacing) * 0)}.min-w-\[1180px\]{min-width:1180px}.cursor-pointer{cursor:pointer}.grid-cols-\[40px_minmax\(220px\,2fr\)_minmax\(130px\,1fr\)_minmax\(130px\,1fr\)_minmax\(130px\,1fr\)_minmax\(130px\,1fr\)_minmax\(190px\,1\.1fr\)_minmax\(120px\,0\.8fr\)\]{grid-template-columns:40px minmax(220px,2fr) minmax(130px,1fr) minmax(130px,1fr) minmax(130px,1fr) minmax(130px,1fr) minmax(190px,1.1fr) minmax(120px,.8fr)}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-2{column-gap:calc(var(--spacing) * 2)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-amber-200{border-color:var(--color-amber-200)}.border-slate-100{border-color:var(--color-slate-100)}.border-slate-200{border-color:var(--color-slate-200)}.border-slate-300{border-color:var(--color-slate-300)}.bg-amber-50{background-color:var(--color-amber-50)}.bg-slate-50{background-color:var(--color-slate-50)}.bg-slate-100{background-color:var(--color-slate-100)}.bg-slate-900\/40{background-color:#0f172b66}@supports (color:color-mix(in lab, red, red)){.bg-slate-900\/40{background-color:color-mix(in oklab, var(--color-slate-900) 40%, transparent)}}.bg-white{background-color:var(--color-white)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.text-amber-800{color:var(--color-amber-800)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-slate-700{color:var(--color-slate-700)}.text-slate-900{color:var(--color-slate-900)}.uppercase{text-transform:uppercase}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-slate-200{--tw-ring-color:var(--color-slate-200)}.outline-none{--tw-outline-style:none;outline-style:none}@media (hover:hover){.hover\:border-slate-400:hover{border-color:var(--color-slate-400)}}.focus\:border-slate-400:focus{border-color:var(--color-slate-400)}}@keyframes enter{0%{opacity:var(--p-enter-opacity,1);transform:translate3d(var(--p-enter-translate-x,0), var(--p-enter-translate-y,0), 0) scale3d(var(--p-enter-scale,1), var(--p-enter-scale,1), var(--p-enter-scale,1)) rotate(var(--p-enter-rotate,0))}}@keyframes leave{to{opacity:var(--p-leave-opacity,1);transform:translate3d(var(--p-leave-translate-x,0), var(--p-leave-translate-y,0), 0) scale3d(var(--p-leave-scale,1), var(--p-leave-scale,1), var(--p-leave-scale,1)) rotate(var(--p-leave-rotate,0))}}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}
|
|
1
|
+
/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */
|
|
2
|
+
@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-200:oklch(88.5% .062 18.334);--color-red-700:oklch(50.5% .213 27.518);--color-amber-50:oklch(98.7% .022 95.277);--color-amber-200:oklch(92.4% .12 95.746);--color-amber-800:oklch(47.3% .137 46.201);--color-slate-400:oklch(70.4% .04 256.788);--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--font-weight-medium:500;--font-weight-bold:700;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.visible{visibility:visible}.static{position:static}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.m-0{margin:calc(var(--spacing) * 0)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.\!h-\[min\(84vh\,43rem\)\]{height:min(84vh,43rem)!important}.\!h-\[min\(88vh\,52rem\)\]{height:min(88vh,52rem)!important}.h-full{height:100%}.\!max-h-\[84vh\]{max-height:84vh!important}.\!max-h-\[88vh\]{max-height:88vh!important}.min-h-0{min-height:calc(var(--spacing) * 0)}.\!w-\[min\(86vw\,60rem\)\]{width:min(86vw,60rem)!important}.\!w-\[min\(92vw\,80rem\)\]{width:min(92vw,80rem)!important}.w-56{width:calc(var(--spacing) * 56)}.w-full{width:100%}.min-w-0{min-width:calc(var(--spacing) * 0)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}.\!overflow-y-hidden{overflow-y:hidden!important}.overflow-y-auto{overflow-y:auto}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-lg{border-radius:var(--radius-lg)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-amber-200{border-color:var(--color-amber-200)}.border-red-200{border-color:var(--color-red-200)}.border-surface{border-color:var(--p-content-border-color)}.border-surface-200{border-color:var(--p-surface-200)}@supports (color:color-mix(in lab, red, red)){.border-surface-200{border-color:color-mix(in srgb, var(--p-surface-200) calc(100% * 1), transparent)}}.bg-amber-50{background-color:var(--color-amber-50)}.bg-red-50{background-color:var(--color-red-50)}.bg-surface-0{background-color:var(--p-surface-0)}@supports (color:color-mix(in lab, red, red)){.bg-surface-0{background-color:color-mix(in srgb, var(--p-surface-0) calc(100% * 1), transparent)}}.bg-surface-50{background-color:var(--p-surface-50)}@supports (color:color-mix(in lab, red, red)){.bg-surface-50{background-color:color-mix(in srgb, var(--p-surface-50) calc(100% * 1), transparent)}}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-4{padding-inline:calc(var(--spacing) * 4)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.whitespace-nowrap{white-space:nowrap}.text-amber-800{color:var(--color-amber-800)}.text-muted-color{color:var(--p-text-muted-color)}.text-red-700{color:var(--color-red-700)}.text-slate-400{color:var(--color-slate-400)}.text-surface-500{color:var(--p-surface-500)}@supports (color:color-mix(in lab, red, red)){.text-surface-500{color:color-mix(in srgb, var(--p-surface-500) calc(100% * 1), transparent)}}.text-surface-600{color:var(--p-surface-600)}@supports (color:color-mix(in lab, red, red)){.text-surface-600{color:color-mix(in srgb, var(--p-surface-600) calc(100% * 1), transparent)}}@media (min-width:64rem){.lg\:grid-cols-\[minmax\(0\,1fr\)_auto_auto\]{grid-template-columns:minmax(0,1fr) auto auto}.lg\:items-end{align-items:flex-end}}}@keyframes enter{0%{opacity:var(--p-enter-opacity,1);transform:translate3d(var(--p-enter-translate-x,0), var(--p-enter-translate-y,0), 0) scale3d(var(--p-enter-scale,1), var(--p-enter-scale,1), var(--p-enter-scale,1)) rotate(var(--p-enter-rotate,0))}}@keyframes leave{to{opacity:var(--p-leave-opacity,1);transform:translate3d(var(--p-leave-translate-x,0), var(--p-leave-translate-y,0), 0) scale3d(var(--p-leave-scale,1), var(--p-leave-scale,1), var(--p-leave-scale,1)) rotate(var(--p-leave-rotate,0))}}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}
|