@masterteam/task-schedule 0.0.3 → 0.0.5

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 CHANGED
@@ -5,26 +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
- - `TaskScheduleShell` component (`mt-task-schedule-shell`)
9
- - `TaskScheduleImportModal` component (`mt-task-schedule-import-modal`)
10
- - `TASK_SCHEDULE_DATA_ADAPTER` injection token
11
- - `TaskScheduleDataAdapter` interface
12
- - `TaskScheduleBackendAdapter` (default built-in adapter)
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
- ## Inputs
18
-
19
- - `context`: object with required `levelId` and `levelDataId` for fetch-based schedule reads
20
-
21
- Main context fields:
22
-
23
- - `modelType`: `'default' | 'edit' | 'baseline' | 'criticalPath' | 'critical-path' | 'resources' | 'unscheduled' | 'phaseGate' | 'custom'`
24
- - `langCode`: `'en' | 'ar' | null`
25
- - `dateFormat`: default `dd/MM/yyyy`
26
- - `height`: default `760px`
27
- - `pdfFonts`: optional `{ regular?: string; arabic?: string; size?: number }`
18
+ ## Inputs
19
+
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`
26
+ - `dateFormat`: default `dd/MM/yyyy`
27
+ - `height`: default `760px`
28
+ - `pdfFonts`: optional `{ regular?: string; arabic?: string; size?: number }`
28
29
 
29
30
  ## Outputs
30
31
 
@@ -34,21 +35,37 @@ Main context fields:
34
35
  - `loaded`
35
36
  - `loadError`
36
37
 
37
- `TaskScheduleDataAdapter` optional import methods:
38
+ `TaskScheduleFetchDataAdapter` methods:
38
39
 
40
+ - `load(modelType, context)`
39
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)`
40
57
  - `applyImportedTasks(context, payload)`
41
58
  - `setBaseline(context, payload?)`
42
- - `exportTasks(context)`
59
+ - `createDependency(context, payload)`
60
+ - `updateDependency(context, dependencyId, payload)`
61
+ - `deleteDependency(context, dependencyId)`
43
62
 
44
63
  ## Usage
45
64
 
46
65
  ```ts
47
66
  import { Component, signal } from '@angular/core';
48
67
  import {
49
- TASK_SCHEDULE_DATA_ADAPTER,
50
68
  TaskSchedule,
51
- TaskScheduleDataAdapter,
52
69
  TaskScheduleModelType,
53
70
  } from '@masterteam/task-schedule';
54
71
 
@@ -56,97 +73,102 @@ import {
56
73
  standalone: true,
57
74
  imports: [TaskSchedule],
58
75
  selector: 'app-task-schedule-host',
59
- template: `
60
- <mt-task-schedule
61
- [context]="{
62
- levelId: 12,
63
- modelType: modelType(),
64
- levelDataId: 18,
65
- langCode: 'en'
66
- }"
67
- />
68
- `,
69
- providers: [
70
- {
71
- provide: TASK_SCHEDULE_DATA_ADAPTER,
72
- useExisting: TaskScheduleApiAdapterService,
73
- },
74
- ],
76
+ template: `
77
+ <mt-task-schedule
78
+ [context]="{
79
+ levelId: 12,
80
+ modelType: modelType(),
81
+ levelDataId: 18,
82
+ langCode: 'en'
83
+ }"
84
+ />
85
+ `,
75
86
  })
76
87
  export class TaskScheduleHostComponent {
77
88
  readonly modelType = signal<TaskScheduleModelType>('default');
78
89
  }
79
90
  ```
80
91
 
81
- The component uses `TaskScheduleBackendAdapter` by default.
82
-
83
- Backend routes used:
84
-
85
- - Mixed schedule reads (default/edit/critical/custom): `POST /api/levels/{levelId}/{levelDataId}/schedule/query`
86
- - Runtime baseline snapshot view: `GET /api/levels/{levelId}/{levelDataId}/schedule/baselines/latest`
87
- - Runtime unscheduled: `GET /api/levels/{levelId}/{levelDataId}/schedule/unscheduled`
88
- - Runtime resource mode: `GET /api/levels/{levelId}/{levelDataId}/schedule/by-resource`
89
- - Custom view config: `GET /api/schedulemanager/{levelId}/schedule/{customViewId}`
90
- - Team members (edit/resources mode): `GET /api/levels/{levelId}/TeamMember`
91
-
92
- Phase-gate runtime reads are handled separately in the app-client phase-gate flow and are not part of this package migration.
93
-
94
- Runtime mutations (when `levelDataId` exists):
95
-
96
- - `POST /api/levels/{levelId}/{levelDataId}/schedule`
97
- - `PUT /api/levels/{levelId}/{levelDataId}/schedule/{taskId}`
98
- - `DELETE /api/levels/{levelId}/{levelDataId}/schedule/{taskId}`
99
- - `PUT /api/levels/{levelId}/{levelDataId}/schedule/bulk-update`
100
- - `PUT /api/levels/{levelId}/{levelDataId}/schedule/reorder`
101
- - `PUT /api/levels/{levelId}/{levelDataId}/schedule/{taskId}/progress`
102
- - `POST /api/levels/{levelId}/{levelDataId}/schedule/baselines` (set baseline)
103
- - `GET /api/levels/{levelId}/{levelDataId}/schedule/mpp` (export)
104
-
105
- Plain schedule reads no longer use legacy `/api/tasks/...` read routes.
106
- Import modal keeps its current MPP preview/apply flow unless `endpoints.importTasks` / `endpoints.applyImportedTasks` are overridden.
107
-
108
- Context options for backend routing:
109
-
110
- - `apiBaseUrl`: optional base URL prefix
111
- - `modelType`: selected schedule mode
112
- - `langCode`: optional language override
113
- - `dateFormat`: optional gantt date format
114
- - `height`: optional gantt height
115
- - `customViewId`: used in `custom` mode to load schedule-manager view columns
116
- - `resources`: optional static resource list override
117
- - `endpoints`: optional endpoint template overrides (`scheduleTreePhaseGate`, `scheduleViewById`, `teamMembers`, `createTask`, etc.)
118
- - `endpoints.importTasks` / `endpoints.applyImportedTasks`: optional overrides for runtime/legacy MPP import flow
119
- - `endpoints.setBaseline`: optional override for baseline endpoint (runtime default: `/api/levels/{levelId}/{levelDataId}/schedule/baselines`)
120
- - `endpoints.exportTasks`: optional override for export endpoint (runtime default: `/api/levels/{levelId}/{levelDataId}/schedule/mpp`)
121
- - `requestHeaders`: optional additional headers
122
- - `pdfFonts`: optional `{ regular?: string; arabic?: string; size?: number }` base64 font config for PDF export
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.
123
133
 
124
134
  When no PDF font is provided, package fallback uses embedded `TASK_SCHEDULE_DEFAULT_PDF_FONT`.
125
135
 
126
- ## Import Modal
136
+ ## Import Dialog
127
137
 
128
- Use `mt-task-schedule-import-modal` to import `.mpp`/`.xer` files and apply tasks (replace or append).
129
- The modal is Tailwind-based and uses `@masterteam/components` (`mt-button`, `mt-entity-preview`).
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`).
130
140
  Imported rows support inline editing before apply (task name, planned/actual dates, assignee, progress) with per-row selection.
131
141
 
132
- ## Shell Component
133
-
134
- Use `mt-task-schedule-shell` as the package-level host that combines:
142
+ ## Shell Component
143
+
144
+ Use `mt-task-schedule-header` as a reusable schedule header that combines:
135
145
 
136
146
  - mode switcher
137
- - Set Baseline action (adapter `setBaseline`)
138
- - Import modal orchestration
139
- - Export tasks action (adapter `exportTasks`)
140
-
141
- Shell parity control fields also live on `context`:
142
-
143
- - `modeOptions`
144
- - `allowEditMode`
145
- - `allowImport`
146
- - `allowSetBaseline`
147
- - `hasTasks`
148
- - `baselinePending`
149
-
150
- Use one adapter service per selector/source if needed. The component does not use NGXS.
147
+ - Set Baseline action (feature service `setBaseline`)
148
+ - Import dialog orchestration
149
+ - Export tasks action (feature service `exportTasks`)
150
+
151
+ It does not render `mt-task-schedule` internally. Use it separately when you want a standard schedule header above your own schedule host.
152
+
153
+ Shell parity control fields also live on `context`:
154
+
155
+ - `modeOptions`
156
+ - `allowEditMode`
157
+ - `allowImport`
158
+ - `allowSetBaseline`
159
+ - `hasTasks`
160
+ - `baselinePending`
161
+
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`
151
173
 
152
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
+ }
@@ -1,2 +1,2 @@
1
- /*! tailwindcss v4.2.1 | 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;--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}