lula2 0.0.5 → 0.0.7
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 +291 -8
- package/dist/_app/env.js +1 -0
- package/dist/_app/immutable/assets/0.DtiRW3lO.css +1 -0
- package/dist/_app/immutable/assets/DynamicControlEditor.BkVTzFZ-.css +1 -0
- package/dist/_app/immutable/chunks/7x_q-1ab.js +1 -0
- package/dist/_app/immutable/chunks/B19gt6-g.js +2 -0
- package/dist/_app/immutable/chunks/B8y4N5iB.js +66 -0
- package/dist/_app/immutable/chunks/BR-0Dorr.js +1 -0
- package/dist/_app/immutable/chunks/B_3ksxz5.js +2 -0
- package/dist/_app/immutable/chunks/CMWPLh7h.js +1 -0
- package/dist/_app/immutable/chunks/D3aNP_lg.js +1 -0
- package/dist/_app/immutable/chunks/D4Q_ObIy.js +1 -0
- package/dist/_app/immutable/chunks/DQAUO7J_.js +3 -0
- package/dist/_app/immutable/chunks/DsnmJJEf.js +1 -0
- package/dist/_app/immutable/entry/app.gXI-RXWG.js +2 -0
- package/dist/_app/immutable/entry/start.B_FNOkXN.js +1 -0
- package/dist/_app/immutable/nodes/0.CSH0JcZp.js +1 -0
- package/dist/_app/immutable/nodes/1.B2ee3OXU.js +1 -0
- package/dist/_app/immutable/nodes/2.D-sdW8nU.js +1 -0
- package/dist/_app/immutable/nodes/3.DpuBpKOB.js +1 -0
- package/dist/_app/immutable/nodes/4.OaCXaSqf.js +9 -0
- package/dist/_app/version.json +1 -0
- package/dist/cli/commands/crawl.js +128 -0
- package/dist/cli/commands/ui.js +2769 -0
- package/dist/cli/commands/version.js +14 -0
- package/dist/cli/server/index.js +2713 -0
- package/dist/cli/server/server.js +2702 -0
- package/dist/cli/server/serverState.js +1199 -0
- package/dist/cli/server/spreadsheetRoutes.js +788 -0
- package/dist/cli/server/types.js +0 -0
- package/dist/cli/server/websocketServer.js +2625 -0
- package/dist/cli/utils/debug.js +24 -0
- package/dist/favicon.svg +1 -0
- package/dist/index.html +38 -0
- package/dist/index.js +2908 -37
- package/dist/lula.png +0 -0
- package/dist/lula2 +2 -0
- package/package.json +120 -72
- package/src/app.css +192 -0
- package/src/app.d.ts +13 -0
- package/src/app.html +13 -0
- package/src/lib/actions/fadeWhenScrollable.ts +39 -0
- package/src/lib/actions/modal.ts +230 -0
- package/src/lib/actions/tooltip.ts +82 -0
- package/src/lib/components/control-sets/ControlSetInfo.svelte +20 -0
- package/src/lib/components/control-sets/ControlSetSelector.svelte +46 -0
- package/src/lib/components/control-sets/index.ts +5 -0
- package/src/lib/components/controls/ControlDetailsPanel.svelte +235 -0
- package/src/lib/components/controls/ControlsList.svelte +608 -0
- package/src/lib/components/controls/DynamicControlEditor.svelte +298 -0
- package/src/lib/components/controls/MappingCard.svelte +105 -0
- package/src/lib/components/controls/MappingForm.svelte +188 -0
- package/src/lib/components/controls/index.ts +9 -0
- package/src/lib/components/controls/renderers/EditableFieldRenderer.svelte +103 -0
- package/src/lib/components/controls/renderers/FieldRenderer.svelte +49 -0
- package/src/lib/components/controls/renderers/index.ts +5 -0
- package/src/lib/components/controls/tabs/CustomFieldsTab.svelte +130 -0
- package/src/lib/components/controls/tabs/ImplementationTab.svelte +127 -0
- package/src/lib/components/controls/tabs/MappingsTab.svelte +182 -0
- package/src/lib/components/controls/tabs/OverviewTab.svelte +151 -0
- package/src/lib/components/controls/tabs/TimelineTab.svelte +41 -0
- package/src/lib/components/controls/tabs/index.ts +8 -0
- package/src/lib/components/controls/utils/ProcessedTextRenderer.svelte +63 -0
- package/src/lib/components/controls/utils/textProcessor.ts +164 -0
- package/src/lib/components/forms/DynamicControlForm.svelte +340 -0
- package/src/lib/components/forms/DynamicField.svelte +494 -0
- package/src/lib/components/forms/FormField.svelte +107 -0
- package/src/lib/components/forms/index.ts +6 -0
- package/src/lib/components/setup/ExistingControlSets.svelte +284 -0
- package/src/lib/components/setup/SpreadsheetImport.svelte +968 -0
- package/src/lib/components/setup/index.ts +5 -0
- package/src/lib/components/ui/Dropdown.svelte +107 -0
- package/src/lib/components/ui/EmptyState.svelte +80 -0
- package/src/lib/components/ui/FeatureToggle.svelte +50 -0
- package/src/lib/components/ui/SearchBar.svelte +73 -0
- package/src/lib/components/ui/StatusBadge.svelte +79 -0
- package/src/lib/components/ui/TabNavigation.svelte +48 -0
- package/src/lib/components/ui/Tooltip.svelte +120 -0
- package/src/lib/components/ui/index.ts +10 -0
- package/src/lib/components/version-control/DiffViewer.svelte +292 -0
- package/src/lib/components/version-control/TimelineItem.svelte +107 -0
- package/src/lib/components/version-control/YamlDiffViewer.svelte +428 -0
- package/src/lib/components/version-control/index.ts +6 -0
- package/src/lib/form-types.ts +57 -0
- package/src/lib/formatUtils.ts +17 -0
- package/src/lib/index.ts +5 -0
- package/src/lib/types.ts +180 -0
- package/src/lib/websocket.ts +359 -0
- package/src/routes/+layout.svelte +236 -0
- package/src/routes/+page.svelte +38 -0
- package/src/routes/control/[id]/+page.svelte +112 -0
- package/src/routes/setup/+page.svelte +241 -0
- package/src/stores/compliance.ts +95 -0
- package/src/styles/highlightjs.css +20 -0
- package/src/styles/modal.css +58 -0
- package/src/styles/tables.css +111 -0
- package/src/styles/tooltip.css +65 -0
- package/dist/controls/index.d.ts +0 -18
- package/dist/controls/index.d.ts.map +0 -1
- package/dist/controls/index.js +0 -18
- package/dist/crawl.d.ts +0 -62
- package/dist/crawl.d.ts.map +0 -1
- package/dist/crawl.js +0 -172
- package/dist/index.d.ts +0 -8
- package/dist/index.d.ts.map +0 -1
- package/src/controls/index.ts +0 -19
- package/src/crawl.ts +0 -227
- package/src/index.ts +0 -46
package/README.md
CHANGED
|
@@ -1,22 +1,305 @@
|
|
|
1
|
-
# Lula
|
|
1
|
+
# Lula - GitOps for Compliance
|
|
2
|
+
|
|
3
|
+
<img src="static/lula.png" alt="Lula Logo" width="150" align="right" />
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
> [!IMPORTANT]
|
|
7
|
+
> This project is still in its early stages. Expect breaking changes.
|
|
8
|
+
>
|
|
9
|
+
> Looking for the original Lula OSCAL compliance validator? Go to [defenseunicorns-labs/lula1](https://github.com/defenseunicorns-labs/lula1)
|
|
10
|
+
>
|
|
11
|
+
> _Lula 1 is in maintenance mode and not receiving active updates or new features._
|
|
2
12
|
|
|
3
13
|
[](https://npmjs.com/package/lula-next)
|
|
4
14
|
[](https://snyk.io/advisor/npm-package/lula-next)
|
|
5
15
|
[](https://npmjs.com/package/lula-next)
|
|
6
16
|
[](https://npmjs.com/package/lula-next)
|
|
7
17
|
|
|
8
|
-
|
|
18
|
+
Bring GitOps principles to compliance management. Lula treats security controls as code, enabling teams to manage compliance frameworks (NIST 800-53, CIS, SOC2) through pull requests, code reviews, and automated workflows—just like your application code in a user-friendly web interface. Your data stays your data--Lula takes spreadsheet imports, lets you drag & drop the UI layout and version control the data as yaml automatically for you.
|
|
19
|
+
|
|
20
|
+
We built Lula 2 after discovering key limitations with the OSCAL-based approach:
|
|
21
|
+
|
|
22
|
+
**Challenges in Lula 1:**
|
|
23
|
+
- OSCAL proved too complex for most teams to work with effectively
|
|
24
|
+
- Automated tests alone were insufficient for real compliance verification
|
|
25
|
+
- The format made collaboration and review difficult
|
|
26
|
+
|
|
27
|
+
**Lula 2's Approach:**
|
|
28
|
+
- **Simple YAML + Spreadsheets**: Import from any spreadsheet tool (including EMASS), no OSCAL knowledge required
|
|
29
|
+
- **Human + AI Analysis**: Recognizes that compliance requires human judgment augmented by AI reasoning, not just automated tests
|
|
30
|
+
- **Git-native**: Use standard diff tools and pull requests for review
|
|
31
|
+
- **Web UI**: Intuitive interface that anyone can use, not just CLI experts
|
|
32
|
+
- **Change Impact Tracking**: Maps controls to actual code and tracks when changes might affect compliance
|
|
33
|
+
|
|
34
|
+
This evolution reflects our learning that effective compliance management needs to be accessible to all stakeholders—not just those who can navigate complex standards or write validation code.
|
|
35
|
+
|
|
36
|
+
## Why GitOps for Compliance?
|
|
37
|
+
|
|
38
|
+
- **Version Everything**: Every control change, ui change, mapping is tracked, reviewable, and revertable
|
|
39
|
+
- **Pull Request Workflows**: Review compliance changes before they go live
|
|
40
|
+
- **Branch Strategies**: Test control changes in isolated branches
|
|
41
|
+
- **Automated Validation**: CI/CD pipelines can validate control completeness
|
|
42
|
+
- **Audit Trail**: Git history provides immutable audit logs
|
|
43
|
+
- **Collaborative Review**: Security, compliance, and engineering teams collaborate through PRs
|
|
44
|
+
- **Automated Change Detection**: Map controls to source code via generated UUIDs and track when code changes impact your compliance posture
|
|
45
|
+
|
|
46
|
+
## Key Features
|
|
47
|
+
|
|
48
|
+
- **Controls as Code**: Each control stored as an individual YAML file
|
|
49
|
+
- **Import/Export**: Import any generic spreadsheet with column headers, including from tools like EMASS
|
|
50
|
+
- **Smart Formatting**: Automatic text processing for control descriptions and procedures
|
|
51
|
+
- **Source Mappings**: Link controls to actual code implementations
|
|
52
|
+
- **Multi-Framework**: Support NIST, CIS, SOC2, and custom frameworks in one repo
|
|
53
|
+
- **Git Timeline**: Visual history of all control changes
|
|
54
|
+
|
|
55
|
+
## Quick Start
|
|
56
|
+
|
|
57
|
+
Run Lula directly with npx (no installation required):
|
|
9
58
|
|
|
10
59
|
```bash
|
|
11
|
-
|
|
12
|
-
Commenting on file1.ts: **Compliance Alert**: `file1.ts` changed between lines 9–16.
|
|
13
|
-
UUID `123e4567-e89b-12d3-a456-426614174001` may be out of compliance. Please review.
|
|
14
|
-
Commenting on file1.yaml: **Compliance Alert**: `file1.yaml` changed between lines 16–18.
|
|
15
|
-
UUID `123e4567-e89b-12d3-a456-426614174000` may be out of compliance. Please review.
|
|
60
|
+
npx lula2
|
|
16
61
|
```
|
|
17
62
|
|
|
18
|
-
|
|
63
|
+
This will:
|
|
64
|
+
|
|
65
|
+
1. Scan for existing control sets in your directory
|
|
66
|
+
2. Launch the web interface at http://localhost:3000
|
|
67
|
+
3. Start the API server for control management
|
|
68
|
+
|
|
69
|
+
## Interface Features
|
|
70
|
+
|
|
71
|
+
Once launched, you can:
|
|
72
|
+
|
|
73
|
+
- **Browse Controls**: Navigate through control families and individual controls
|
|
74
|
+
- **Edit Controls**: Update implementation narratives, status, and properties
|
|
75
|
+
- **Track Changes**: View Git history and timeline for each control
|
|
76
|
+
- **Manage Mappings**: Link controls to source code and documentation
|
|
77
|
+
- **Import Data**: Use the setup page to import OSCAL catalogs or existing control sets
|
|
78
|
+
- **Export Reports**: Generate compliance reports and assessments
|
|
79
|
+
|
|
80
|
+
## Commands
|
|
81
|
+
|
|
82
|
+
### Version Command
|
|
19
83
|
|
|
20
84
|
```bash
|
|
21
85
|
> npx lula2 --version
|
|
22
86
|
```
|
|
87
|
+
|
|
88
|
+
## Project Structure
|
|
89
|
+
|
|
90
|
+
Lula organizes controls in a Git-friendly structure:
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
my-compliance-project/
|
|
94
|
+
├── lula.yaml # Control set metadata
|
|
95
|
+
├── controls/ # Individual control files
|
|
96
|
+
│ ├── AC/ # Access Control family
|
|
97
|
+
│ │ ├── AC-1.yaml
|
|
98
|
+
│ │ ├── AC-2.yaml
|
|
99
|
+
│ │ └── AC-2_1.yaml # Control enhancements
|
|
100
|
+
│ ├── AU/ # Audit family
|
|
101
|
+
│ │ └── ...
|
|
102
|
+
│ └── ...
|
|
103
|
+
└── mappings/ # Source code mappings
|
|
104
|
+
├── AC/
|
|
105
|
+
│ └── AC-1-mappings.yaml
|
|
106
|
+
└── ...
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### Control File Format
|
|
110
|
+
|
|
111
|
+
Each control is stored as a YAML file with a consistent schema based on the imported spreadsheet:
|
|
112
|
+
|
|
113
|
+
```yaml
|
|
114
|
+
id: AC-1
|
|
115
|
+
title: Access Control Policy and Procedures
|
|
116
|
+
family: AC
|
|
117
|
+
description: |
|
|
118
|
+
The organization develops, documents, and disseminates...
|
|
119
|
+
implementation_status: Implemented
|
|
120
|
+
security_control_designation: Hybrid
|
|
121
|
+
control_implementation_narrative: |
|
|
122
|
+
Our organization implements AC-1 through...
|
|
123
|
+
implementation_guidance: |
|
|
124
|
+
Step-by-step guidance for implementing this control...
|
|
125
|
+
assessment_procedures: |
|
|
126
|
+
Methods for assessing control effectiveness...
|
|
127
|
+
test_results: |
|
|
128
|
+
Results from the latest assessment...
|
|
129
|
+
properties:
|
|
130
|
+
priority: P1
|
|
131
|
+
responsible_role: CISO
|
|
132
|
+
last_reviewed: 2024-01-15
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Features in Detail
|
|
136
|
+
|
|
137
|
+
### GitOps Workflow
|
|
138
|
+
|
|
139
|
+
Manage compliance like code with full GitOps practices:
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
# Create feature branch for control updates
|
|
143
|
+
git checkout -b update-ac-controls
|
|
144
|
+
|
|
145
|
+
# Make changes through Lula UI
|
|
146
|
+
npx lula2
|
|
147
|
+
|
|
148
|
+
# Commit changes
|
|
149
|
+
git add controls/
|
|
150
|
+
git commit -m "Updated AC family implementation narratives"
|
|
151
|
+
|
|
152
|
+
# Push and create PR
|
|
153
|
+
git push origin update-ac-controls
|
|
154
|
+
# → Team reviews changes in PR
|
|
155
|
+
# → CI validates control completeness
|
|
156
|
+
# → Merge when approved
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### Smart Text Processing
|
|
160
|
+
|
|
161
|
+
Lula automatically formats complex text fields:
|
|
162
|
+
|
|
163
|
+
- Detects and styles headers (Description:, Guidance:, etc.)
|
|
164
|
+
- Converts CSV data into formatted tables
|
|
165
|
+
- Properly formats lists and bullet points
|
|
166
|
+
- Highlights control IDs and CCI references
|
|
167
|
+
|
|
168
|
+
### Control Mappings
|
|
169
|
+
|
|
170
|
+
Link controls to actual implementations using a UUID:
|
|
171
|
+
|
|
172
|
+
```yaml
|
|
173
|
+
- control_id: AC-10_3
|
|
174
|
+
justification: 'This is my reason this is compliant'
|
|
175
|
+
status: implemented
|
|
176
|
+
source_entries: [source: src/auth/policies.ts]
|
|
177
|
+
uuid: 439489d2-c1db-4ab4-a4dd-d0a6f4a0dd24
|
|
178
|
+
last_validated: 2024-01-15
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
## GitOps Benefits for Compliance
|
|
182
|
+
|
|
183
|
+
### For Compliance Teams
|
|
184
|
+
|
|
185
|
+
- **Review Process**: Control changes go through pull request reviews
|
|
186
|
+
- **Rollback**: Instantly revert problematic control updates
|
|
187
|
+
- **Branching**: Test control changes without affecting production
|
|
188
|
+
- **History**: Complete audit trail in Git log
|
|
189
|
+
- **Protection**: Leverage `CODEOWNERS` to limit who can edit controls/mappings or change the UI
|
|
190
|
+
- **Monitoring**: Leverage SCM tools to track key changes/issues
|
|
191
|
+
|
|
192
|
+
### For Security Engineers
|
|
193
|
+
|
|
194
|
+
- **Infrastructure as Code**: Compliance configurations alongside IaC
|
|
195
|
+
- **Automation**: Trigger compliance checks on control changes
|
|
196
|
+
- **Integration**: Controls in the same repo as security policies
|
|
197
|
+
- **Validation**: Pre-commit hooks for control completeness
|
|
198
|
+
|
|
199
|
+
### For Auditors
|
|
200
|
+
|
|
201
|
+
- **Immutable History**: Git provides tamper-evident audit logs when combined with SCM tooling
|
|
202
|
+
- **Change Attribution**: Every change linked to a person and reason
|
|
203
|
+
- **Point-in-Time**: View controls as they were at any date
|
|
204
|
+
- **Evidence Chain**: PRs document review and approval process
|
|
205
|
+
|
|
206
|
+
## Configuration
|
|
207
|
+
|
|
208
|
+
### lula.yaml
|
|
209
|
+
|
|
210
|
+
Managed by the UI for you, each control set includes a configuration file:
|
|
211
|
+
|
|
212
|
+
```yaml
|
|
213
|
+
name: NIST 800-53 Rev 4 Moderate
|
|
214
|
+
version: 4.0.0
|
|
215
|
+
description: NIST Special Publication 800-53 Security Controls
|
|
216
|
+
source: https://csrc.nist.gov/publications/detail/sp/800-53/rev-4/final
|
|
217
|
+
families:
|
|
218
|
+
- id: AC
|
|
219
|
+
name: Access Control
|
|
220
|
+
- id: AU
|
|
221
|
+
name: Audit and Accountability
|
|
222
|
+
# ... more families
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
## Troubleshooting
|
|
226
|
+
|
|
227
|
+
### Common Issues
|
|
228
|
+
|
|
229
|
+
**No control sets found:**
|
|
230
|
+
|
|
231
|
+
- Ensure you have a `lula.yaml` file in your control set directory
|
|
232
|
+
- Check that control files are in the correct structure
|
|
233
|
+
|
|
234
|
+
**WebSocket connection failed:**
|
|
235
|
+
|
|
236
|
+
- Verify the port is not in use
|
|
237
|
+
- Check firewall settings
|
|
238
|
+
- Ensure both frontend and backend are running
|
|
239
|
+
|
|
240
|
+
**Git history not showing:**
|
|
241
|
+
|
|
242
|
+
- Verify the directory is a Git repository
|
|
243
|
+
- Ensure Git is installed and accessible
|
|
244
|
+
- Check file permissions
|
|
245
|
+
|
|
246
|
+
## Development
|
|
247
|
+
|
|
248
|
+
### Prerequisites
|
|
249
|
+
|
|
250
|
+
- Node.js 22+
|
|
251
|
+
- Git (for version history features)
|
|
252
|
+
- pnpm (recommended) or npm
|
|
253
|
+
|
|
254
|
+
### Local Development
|
|
255
|
+
|
|
256
|
+
```bash
|
|
257
|
+
# Clone the repository
|
|
258
|
+
git clone https://github.com/defenseunicorns/lula.git
|
|
259
|
+
cd lula
|
|
260
|
+
|
|
261
|
+
# Install dependencies
|
|
262
|
+
pnpm install
|
|
263
|
+
|
|
264
|
+
# Run development servers
|
|
265
|
+
pnpm run dev:full # Runs both frontend and backend
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### Build
|
|
269
|
+
|
|
270
|
+
```bash
|
|
271
|
+
pnpm run build
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
## Architecture
|
|
275
|
+
|
|
276
|
+
- **Frontend**: SvelteKit 5 with Tailwind CSS
|
|
277
|
+
- **Backend**: Express + WebSocket server
|
|
278
|
+
- **Storage**: YAML files with Git integration
|
|
279
|
+
- **State Management**: Svelte 5 runes
|
|
280
|
+
- **CLI**: Commander.js with TypeScript
|
|
281
|
+
|
|
282
|
+
## Contributing
|
|
283
|
+
|
|
284
|
+
We welcome contributions! Please see [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.
|
|
285
|
+
|
|
286
|
+
## License
|
|
287
|
+
|
|
288
|
+
Apache-2.0 - See [LICENSE](LICENSE) for details.
|
|
289
|
+
|
|
290
|
+
## Support
|
|
291
|
+
|
|
292
|
+
- **Documentation**: [https://lula.dev/docs](https://lula.dev/docs)
|
|
293
|
+
- **Issues**: [GitHub Issues](https://github.com/defenseunicorns/lula2/issues)
|
|
294
|
+
- **Discussions**: [GitHub Discussions](https://github.com/defenseunicorns/lula2/discussions)
|
|
295
|
+
|
|
296
|
+
## Related Projects
|
|
297
|
+
|
|
298
|
+
- [Lula 1 (Original CLI)](https://github.com/defenseunicorns-labs/lula1) - OSCAL-based compliance validator CLI
|
|
299
|
+
- [OSCAL](https://pages.nist.gov/OSCAL/) - Open Security Controls Assessment Language
|
|
300
|
+
|
|
301
|
+
## Credits
|
|
302
|
+
|
|
303
|
+
Developed by [The Lula Authors](https://github.com/defenseunicorns/lula2/graphs/contributors)
|
|
304
|
+
|
|
305
|
+
Part of the Defense Unicorns ecosystem for secure, compliant software delivery.
|
package/dist/_app/env.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const env={}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/*! tailwindcss v4.1.13 | MIT License | https://tailwindcss.com */@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-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--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;--tw-font-weight:initial;--tw-tracking:initial;--tw-border-style:solid;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-y-reverse:0;--tw-leading:initial;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease: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-amber-100:oklch(96.2% .059 95.617);--color-amber-300:oklch(87.9% .169 91.605);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-amber-800:oklch(47.3% .137 46.201);--color-amber-900:oklch(41.4% .112 45.904);--color-emerald-50:oklch(97.9% .021 166.113);--color-emerald-100:oklch(95% .052 163.051);--color-emerald-300:oklch(84.5% .143 164.978);--color-emerald-800:oklch(43.2% .095 166.913);--color-emerald-900:oklch(37.8% .077 168.94);--color-gray-950:oklch(13% .028 261.692);--spacing:.25rem;--container-sm:24rem;--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: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5/2.25);--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-extrabold:800;--tracking-tight:-.025em;--tracking-wider:.05em;--leading-relaxed:1.625;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--ease-in-out:cubic-bezier(.4,0,.2,1);--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4,0,.6,1)infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--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;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{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}html{color-scheme:dark;scrollbar-width:thin;scrollbar-color:#9ca3af80 transparent;overflow-y:auto}html::-webkit-scrollbar{z-index:20;width:5px}html::-webkit-scrollbar-thumb{background-color:#9ca3af80;border-radius:4px}html::-webkit-scrollbar-track{background:0 0}html button:not([disabled]),html [role=button]:not([disabled]){cursor:pointer}.tooltip-arrow,.tooltip-arrow:before{background:inherit;width:8px;height:8px;position:absolute}.tooltip-arrow{visibility:hidden}.tooltip-arrow:before{content:"";visibility:visible;transform:rotate(45deg)}[data-tooltip-style^=light]+.tooltip>.tooltip-arrow:before{border-style:solid;border-color:#e5e7eb}[data-tooltip-style^=light]+.tooltip[data-popper-placement^=top]>.tooltip-arrow:before{border-bottom-width:1px;border-right-width:1px}[data-tooltip-style^=light]+.tooltip[data-popper-placement^=right]>.tooltip-arrow:before{border-bottom-width:1px;border-left-width:1px}[data-tooltip-style^=light]+.tooltip[data-popper-placement^=bottom]>.tooltip-arrow:before{border-top-width:1px;border-left-width:1px}[data-tooltip-style^=light]+.tooltip[data-popper-placement^=left]>.tooltip-arrow:before{border-top-width:1px;border-right-width:1px}.tooltip[data-popper-placement^=top]>.tooltip-arrow{bottom:-4px}.tooltip[data-popper-placement^=bottom]>.tooltip-arrow{top:-4px}.tooltip[data-popper-placement^=left]>.tooltip-arrow{right:-4px}.tooltip[data-popper-placement^=right]>.tooltip-arrow{left:-4px}.tooltip.invisible>.tooltip-arrow:before{visibility:hidden}[data-popper-arrow],[data-popper-arrow]:before{background:inherit;width:8px;height:8px;position:absolute}[data-popper-arrow]{visibility:hidden}[data-popper-arrow]:before{content:"";visibility:visible;transform:rotate(45deg)}[data-popper-arrow]:after{content:"";visibility:visible;background:inherit;width:9px;height:9px;position:absolute;transform:rotate(45deg)}[role=tooltip]>[data-popper-arrow]:before{border-style:solid;border-color:#e5e7eb}.dark [role=tooltip]>[data-popper-arrow]:before{border-style:solid;border-color:#4a5565}[role=tooltip]>[data-popper-arrow]:after{border-style:solid;border-color:#e5e7eb}.dark [role=tooltip]>[data-popper-arrow]:after{border-style:solid;border-color:#4a5565}[data-popover][role=tooltip][data-popper-placement^=top]>[data-popper-arrow]:before,[data-popover][role=tooltip][data-popper-placement^=top]>[data-popper-arrow]:after{border-bottom-width:1px;border-right-width:1px}[data-popover][role=tooltip][data-popper-placement^=right]>[data-popper-arrow]:before,[data-popover][role=tooltip][data-popper-placement^=right]>[data-popper-arrow]:after{border-bottom-width:1px;border-left-width:1px}[data-popover][role=tooltip][data-popper-placement^=bottom]>[data-popper-arrow]:before,[data-popover][role=tooltip][data-popper-placement^=bottom]>[data-popper-arrow]:after{border-top-width:1px;border-left-width:1px}[data-popover][role=tooltip][data-popper-placement^=left]>[data-popper-arrow]:before,[data-popover][role=tooltip][data-popper-placement^=left]>[data-popper-arrow]:after{border-top-width:1px;border-right-width:1px}[data-popover][role=tooltip][data-popper-placement^=top]>[data-popper-arrow]{bottom:-5px}[data-popover][role=tooltip][data-popper-placement^=bottom]>[data-popper-arrow]{top:-5px}[data-popover][role=tooltip][data-popper-placement^=left]>[data-popper-arrow]{right:-5px}[data-popover][role=tooltip][data-popper-placement^=right]>[data-popper-arrow]{left:-5px}[role=tooltip].invisible>[data-popper-arrow]:before,[role=tooltip].invisible>[data-popper-arrow]:after{visibility:hidden}[type=text],[type=email],[type=url],[type=password],[type=number],[type=date],[type=datetime-local],[type=month],[type=search],[type=tel],[type=time],[type=week],[multiple],textarea,select{appearance:none;--tw-shadow:0 0 #0000;background-color:#fff;border-width:1px;border-color:#6b7280;border-radius:0;padding:.5rem .75rem;font-size:1rem;line-height:1.5rem}:is([type=text],[type=email],[type=url],[type=password],[type=number],[type=date],[type=datetime-local],[type=month],[type=search],[type=tel],[type=time],[type=week],[multiple],textarea,select):focus{outline-offset:2px;--tw-ring-inset:var(--tw-empty, );--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#1c64f2;--tw-ring-offset-shadow:var(--tw-ring-inset)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-color:#1c64f2;outline:2px solid #0000}input::placeholder,textarea::placeholder{color:#6b7280;opacity:1}::-webkit-datetime-edit-fields-wrapper{padding:0}input[type=time]::-webkit-calendar-picker-indicator{background:0 0}select:not([size]){-webkit-print-color-adjust:exact;print-color-adjust:exact;background-image:url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 10 6'%3e %3cpath stroke='%236B7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m1 1 4 4 4-4'/%3e %3c/svg%3e");background-position:right .75rem center;background-repeat:no-repeat;background-size:.75em .75em;padding-right:2.5rem}[dir=rtl] select:not([size]){background-position:.75rem;padding-left:0;padding-right:.75rem}[multiple]{background-image:initial;background-position:initial;background-repeat:unset;background-size:initial;-webkit-print-color-adjust:unset;print-color-adjust:unset;padding-right:.75rem}[type=checkbox],[type=radio]{appearance:none;-webkit-print-color-adjust:exact;print-color-adjust:exact;vertical-align:middle;-webkit-user-select:none;user-select:none;color:#1c64f2;--tw-shadow:0 0 #0000;background-color:#fff;background-origin:border-box;border-width:1px;border-color:#6b7280;flex-shrink:0;width:1rem;height:1rem;padding:0;display:inline-block}[type=checkbox]{border-radius:0}[type=radio]{border-radius:100%}[type=checkbox]:focus,[type=radio]:focus{outline-offset:2px;--tw-ring-inset:var(--tw-empty, );--tw-ring-offset-width:2px;--tw-ring-offset-color:#fff;--tw-ring-color:#1c64f2;--tw-ring-offset-shadow:var(--tw-ring-inset)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);outline:2px solid #0000}[type=checkbox]:checked,[type=radio]:checked,.dark [type=checkbox]:checked,.dark [type=radio]:checked{background-color:currentColor;background-position:50%;background-repeat:no-repeat;background-size:.55em .55em;border-color:#0000}[type=checkbox]:checked{-webkit-print-color-adjust:exact;print-color-adjust:exact;background-image:url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 12'%3e %3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M1 5.917 5.724 10.5 15 1.5'/%3e %3c/svg%3e");background-repeat:no-repeat;background-size:.55em .55em}[type=radio]:checked,.dark [type=radio]:checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e");background-size:1em 1em}[type=checkbox]:indeterminate{-webkit-print-color-adjust:exact;print-color-adjust:exact;background-color:currentColor;background-image:url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 12'%3e %3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M0.5 6h14'/%3e %3c/svg%3e");background-position:50%;background-repeat:no-repeat;background-size:.55em .55em;border-color:#0000}[type=checkbox]:indeterminate:hover,[type=checkbox]:indeterminate:focus{background-color:currentColor;border-color:#0000}[type=file]{background:unset;border-color:inherit;font-size:unset;line-height:inherit;border-width:0;border-radius:0;padding:0}[type=file]:focus{outline:1px auto inherit}input[type=file]::file-selector-button{color:#fff;background:#1f2937;border:0;font-size:.875rem;font-weight:500}input[type=file]::file-selector-button{cursor:pointer;margin-inline:-1rem 1rem;padding:.625rem 1rem .625rem 2rem}input[type=file]::file-selector-button:hover{background:#374151}[dir=rtl] input[type=file]::file-selector-button{padding-left:1rem;padding-right:2rem}.dark input[type=file]::file-selector-button{color:#fff;background:#4b5563}.dark input[type=file]::file-selector-button:hover{background:#6b7280}input[type=range]::-webkit-slider-thumb{appearance:none;cursor:pointer;background:#1c64f2;border:0;border-radius:9999px;width:1.25rem;height:1.25rem}input[type=range]:disabled::-webkit-slider-thumb{background:#9ca3af}.dark input[type=range]:disabled::-webkit-slider-thumb{background:#6b7280}input[type=range]:focus::-webkit-slider-thumb{outline-offset:2px;--tw-ring-offset-shadow:var(--tw-ring-inset)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset)0 0 0 calc(4px + var(--tw-ring-offset-width))var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(164 202 254/var(--tw-ring-opacity));outline:2px solid #0000}input[type=range]::-moz-range-thumb{appearance:none;cursor:pointer;background:#1c64f2;border:0;border-radius:9999px;width:1.25rem;height:1.25rem}input[type=range]:disabled::-moz-range-thumb{background:#9ca3af}.dark input[type=range]:disabled::-moz-range-thumb{background:#6b7280}input[type=range]::-moz-range-progress{background:#3f83f8}input[type=range]::-ms-fill-lower{background:#3f83f8}input[type=range].range-sm::-webkit-slider-thumb{width:1rem;height:1rem}input[type=range].range-lg::-webkit-slider-thumb{width:1.5rem;height:1.5rem}input[type=range].range-sm::-moz-range-thumb{width:1rem;height:1rem}input[type=range].range-lg::-moz-range-thumb{width:1.5rem;height:1.5rem}.toggle-bg:after{content:"";width:1.25rem;height:1.25rem;box-shadow:var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);background:#fff;border-width:1px;border-color:#d1d5db;border-radius:9999px;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter,backdrop-filter;transition-duration:.15s;position:absolute;top:.125rem;left:.125rem}input:checked+.toggle-bg:after{border-color:#fff;transform:translate(100%)}input:checked+.toggle-bg{background:#1c64f2;border-color:#1c64f2}}@layer components{.sticky-header{z-index:40;position:sticky}.btn{cursor:pointer;border-radius:var(--radius-lg);border-style:var(--tw-border-style);padding-inline:calc(var(--spacing)*3);padding-block:calc(var(--spacing)*1.5);text-align:center;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:#9ca3af;transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out);background-color:#0000;border-width:1px;border-color:#4b5563;align-items:center;display:inline-flex}@media (hover:hover){.btn:hover{color:#fff;background-color:#374151}}.btn-primary{cursor:pointer;border-radius:var(--radius-lg);border-style:var(--tw-border-style);padding-inline:calc(var(--spacing)*5);padding-block:calc(var(--spacing)*2.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:#3f83f8;transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));background-color:#111827;border-width:1px;border-color:#1c64f2}@media (hover:hover){.btn-primary:hover{color:#fff;background-color:#1c64f2}}.btn-primary:focus{--tw-outline-style:none;outline-style:none}.btn-primary:focus-visible{z-index:10;color:#fff;--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(4px + 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);--tw-ring-color:#c3ddfd;background-color:#1c64f2}.btn-primary:disabled{cursor:not-allowed;color:#fff;background-color:#6b7280;border-color:#0000}.btn-secondary{cursor:pointer;border-radius:var(--radius-lg);border-style:var(--tw-border-style);padding-inline:calc(var(--spacing)*5);padding-block:calc(var(--spacing)*2.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:#fff;transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));background-color:#1c64f2;border-width:1px;border-color:#0000}@media (hover:hover){.btn-secondary:hover{background-color:#1a56db}}.btn-secondary:focus{--tw-outline-style:none;outline-style:none}.btn-secondary:focus-visible{z-index:10;color:#fff;--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(4px + 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);--tw-ring-color:#c3ddfd;background-color:#3f83f8}.btn-secondary:disabled{cursor:not-allowed;color:#fff;background-color:#6b7280;border-color:#0000}.btn-alternative{cursor:pointer;border-radius:var(--radius-lg);border-style:var(--tw-border-style);padding-inline:calc(var(--spacing)*5);padding-block:calc(var(--spacing)*2.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);color:#9ca3af;transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));background-color:#1f2937;border-width:1px;border-color:#4b5563}@media (hover:hover){.btn-alternative:hover{color:#fff;background-color:#374151}}.btn-alternative:focus{z-index:10;--tw-outline-style:none;outline-style:none}.btn-alternative:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(4px + 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);--tw-ring-color:#374151}.btn-alternative:disabled{cursor:not-allowed;color:#9ca3af;background-color:#1f2937}.card{margin-bottom:calc(var(--spacing)*4);border-radius:var(--radius-lg);border-style:var(--tw-border-style);padding:calc(var(--spacing)*4);--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);background-color:#111827;border-width:1px;border-color:#1f2937}.search-input{border-radius:var(--radius-lg);border-style:var(--tw-border-style);width:100%;padding:calc(var(--spacing)*2.5);padding-right:calc(var(--spacing)*10);padding-left:calc(var(--spacing)*10);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:#f3f4f6;background-color:#1f2937;border-width:1px;border-color:#4b5563;display:block}.search-input::placeholder{color:#d1d5db}.search-input:focus{color:#fff;--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);--tw-ring-color:#3f83f8;--tw-outline-style:none;border-color:#3f83f8;outline-style:none}.search-input::-webkit-search-cancel-button{display:none}select{border-radius:var(--radius-lg);border-style:var(--tw-border-style);width:100%;padding:calc(var(--spacing)*2.5);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:#f3f4f6;background-color:#1f2937;border-width:1px;border-color:#374151;display:block}select::placeholder{color:#9ca3af}select:focus{--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);--tw-ring-color:#3f83f8;--tw-outline-style:none;border-color:#3f83f8;outline-style:none}svg.icon{color:#9ca3af;transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.3s;flex-shrink:0;transition-duration:.3s}.text-link{color:#76a9fa;text-decoration-color:#76a9fa}@media (hover:hover){.text-link:hover{text-decoration-line:underline}}.no-scrollbar{scrollbar-width:none}}@layer utilities{.scrollable-container{scrollbar-width:thin;padding-bottom:1rem;overflow:hidden auto;position:static!important}.scrollable-container:not(.no-fade):after{content:"";pointer-events:none;right:calc(var(--spacing)*0);bottom:calc(var(--spacing)*0);left:calc(var(--spacing)*0);--tw-gradient-position:to bottom in oklab;background-image:linear-gradient(var(--tw-gradient-stops));--tw-gradient-from:oklab(0% 0 0/0);--tw-gradient-to:#111827;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position));height:28px;position:absolute}.scrollable-container .btn:not(.keep-default-btn-style){--tw-border-style:none;border-style:none}.scrollable-container table{table-layout:fixed;text-align:left;width:100%;font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:#9ca3af}.scrollable-container table thead{top:calc(var(--spacing)*0);z-index:10;font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:#9ca3af;text-transform:uppercase;--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);position:sticky}.scrollable-container table thead tr{text-align:left;font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider);color:#9ca3af;text-transform:uppercase;background-color:#1118274d}.scrollable-container table thead tr th{padding-inline:calc(var(--spacing)*2);padding-block:calc(var(--spacing)*4);white-space:nowrap;background-color:#1f2937}.scrollable-container table thead tr th:first-child{border-top-left-radius:var(--radius-lg)}.scrollable-container table thead tr th:last-child{border-top-right-radius:var(--radius-lg)}.scrollable-container table tbody tr{background-color:#111827}.scrollable-container table tbody tr.group-boundary{border-top-style:var(--tw-border-style);border-top-width:5px;border-top-color:#1f2937}.scrollable-container table tbody tr.expandable-row td{background-color:var(--color-gray-950)}.scrollable-container table tbody tr td{white-space:nowrap;color:#9ca3af}.pointer-events-none{pointer-events:none}.invisible{visibility:hidden}.visible{visibility:visible}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing)*0)}.inset-y-0{inset-block:calc(var(--spacing)*0)}.top-4{top:calc(var(--spacing)*4)}.top-12{top:calc(var(--spacing)*12)}.top-\[-4px\]{top:-4px}.top-\[50\%\]{top:50%}.right-0{right:calc(var(--spacing)*0)}.right-3{right:calc(var(--spacing)*3)}.right-4{right:calc(var(--spacing)*4)}.right-\[-4px\]{right:-4px}.bottom-0{bottom:calc(var(--spacing)*0)}.bottom-3{bottom:calc(var(--spacing)*3)}.bottom-\[-4px\]{bottom:-4px}.left-0{left:calc(var(--spacing)*0)}.left-4{left:calc(var(--spacing)*4)}.left-\[-4px\]{left:-4px}.left-\[50\%\]{left:50%}.z-10{z-index:10}.z-40{z-index:40}.z-50{z-index:50}.z-100{z-index:100}.col-span-1{grid-column:span 1/span 1}.col-span-full{grid-column:1/-1}.container{width:100%}@media (min-width:31rem){.container{max-width:31rem}}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.m-0{margin:calc(var(--spacing)*0)}.mx-auto{margin-inline:auto}.me-2{margin-inline-end:calc(var(--spacing)*2)}.-mt-1{margin-top:calc(var(--spacing)*-1)}.mt-0\.5{margin-top:calc(var(--spacing)*.5)}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-1\.5{margin-top:calc(var(--spacing)*1.5)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-6{margin-top:calc(var(--spacing)*6)}.mr-1{margin-right:calc(var(--spacing)*1)}.mr-2{margin-right:calc(var(--spacing)*2)}.mr-3{margin-right:calc(var(--spacing)*3)}.mb-1{margin-bottom:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-3{margin-bottom:calc(var(--spacing)*3)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.mb-8{margin-bottom:calc(var(--spacing)*8)}.mb-10{margin-bottom:calc(var(--spacing)*10)}.-ml-1{margin-left:calc(var(--spacing)*-1)}.ml-1{margin-left:calc(var(--spacing)*1)}.ml-2{margin-left:calc(var(--spacing)*2)}.ml-4{margin-left:calc(var(--spacing)*4)}.ml-12{margin-left:calc(var(--spacing)*12)}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-1\.5{height:calc(var(--spacing)*1.5)}.h-2{height:calc(var(--spacing)*2)}.h-3{height:calc(var(--spacing)*3)}.h-4{height:calc(var(--spacing)*4)}.h-5{height:calc(var(--spacing)*5)}.h-6{height:calc(var(--spacing)*6)}.h-8{height:calc(var(--spacing)*8)}.h-10{height:calc(var(--spacing)*10)}.h-12{height:calc(var(--spacing)*12)}.h-16{height:calc(var(--spacing)*16)}.h-64{height:calc(var(--spacing)*64)}.h-\[12px\]{height:12px}.h-full{height:100%}.h-screen{height:100vh}.max-h-96{max-height:calc(var(--spacing)*96)}.max-h-\[600px\]{max-height:600px}.min-h-\[100px\]{min-height:100px}.min-h-\[120px\]{min-height:120px}.min-h-\[400px\]{min-height:400px}.min-h-screen{min-height:100vh}.w-0\.5{width:calc(var(--spacing)*.5)}.w-1\.5{width:calc(var(--spacing)*1.5)}.w-1\/2{width:50%}.w-2{width:calc(var(--spacing)*2)}.w-3{width:calc(var(--spacing)*3)}.w-4{width:calc(var(--spacing)*4)}.w-5{width:calc(var(--spacing)*5)}.w-6{width:calc(var(--spacing)*6)}.w-8{width:calc(var(--spacing)*8)}.w-10{width:calc(var(--spacing)*10)}.w-11{width:calc(var(--spacing)*11)}.w-12{width:calc(var(--spacing)*12)}.w-16{width:calc(var(--spacing)*16)}.w-48{width:calc(var(--spacing)*48)}.w-64{width:calc(var(--spacing)*64)}.w-\[12px\]{width:12px}.w-fit{width:fit-content}.w-full{width:100%}.max-w-6xl{max-width:var(--container-6xl)}.max-w-sm{max-width:var(--container-sm)}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-60{min-width:calc(var(--spacing)*60)}.min-w-\[400px\]{min-width:400px}.min-w-\[700px\]{min-width:700px}.min-w-\[800px\]{min-width:800px}.min-w-\[850px\]{min-width:850px}.min-w-\[900px\]{min-width:900px}.min-w-\[1024px\]{min-width:1024px}.min-w-\[1100px\]{min-width:1100px}.min-w-\[1150px\]{min-width:1150px}.min-w-\[1200px\]{min-width:1200px}.min-w-\[1250px\]{min-width:1250px}.min-w-\[1300px\]{min-width:1300px}.min-w-\[1450px\]{min-width:1450px}.min-w-\[1500px\]{min-width:1500px}.min-w-\[1600px\]{min-width:1600px}.min-w-\[1650px\]{min-width:1650px}.min-w-\[1750px\]{min-width:1750px}.min-w-\[1865px\]{min-width:1865px}.min-w-\[2000px\]{min-width:2000px}.min-w-\[2200px\]{min-width:2200px}.min-w-full{min-width:100%}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}.origin-top-right{transform-origin:100% 0}.translate-x-0{--tw-translate-x:calc(var(--spacing)*0);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-5{--tw-translate-x:calc(var(--spacing)*5);translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-x-\[-50\%\]{--tw-translate-x:-50%;translate:var(--tw-translate-x)var(--tw-translate-y)}.translate-y-\[-50\%\]{--tw-translate-y:-50%;translate:var(--tw-translate-x)var(--tw-translate-y)}.rotate-45{rotate:45deg}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-help{cursor:help}.cursor-move{cursor:move}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize{resize:both}.resize-none{resize:none}.resize-y{resize:vertical}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-1{gap:calc(var(--spacing)*1)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-6{gap:calc(var(--spacing)*6)}.gap-8{gap:calc(var(--spacing)*8)}: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-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)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*3)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*3)*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)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*6)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*6)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-8>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*8)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-10>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*10)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*10)*calc(1 - var(--tw-space-y-reverse)))}:where(.space-x-1>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*1)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*1)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*2)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*2)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*3)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*3)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-4>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*4)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-8>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing)*8)*var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing)*8)*calc(1 - var(--tw-space-x-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px*var(--tw-divide-y-reverse));border-bottom-width:calc(1px*calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-gray-200>:not(:last-child)){border-color:#e5e7eb}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t-lg{border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg)}.rounded-t-xl{border-top-left-radius:var(--radius-xl);border-top-right-radius:var(--radius-xl)}.rounded-l-lg{border-top-left-radius:var(--radius-lg);border-bottom-left-radius:var(--radius-lg)}.rounded-r-lg{border-top-right-radius:var(--radius-lg);border-bottom-right-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-none{--tw-border-style:none;border-style:none}.border-blue-200{border-color:#c3ddfd}.border-blue-300{border-color:#a4cafe}.border-blue-500{border-color:#3f83f8}.border-blue-600{border-color:#1c64f2}.border-gray-100{border-color:#f3f4f6}.border-gray-200{border-color:#e5e7eb}.border-gray-300{border-color:#d1d5db}.border-gray-700{border-color:#374151}.border-green-200{border-color:#bcf0da}.border-green-300{border-color:#84e1bc}.border-green-500{border-color:#0e9f6e}.border-purple-200{border-color:#dcd7fe}.border-purple-300{border-color:#cabffd}.border-purple-500{border-color:#9061f9}.border-red-200{border-color:#fbd5d5}.border-red-400{border-color:#f98080}.border-red-500{border-color:#f05252}.border-transparent{border-color:#0000}.bg-amber-100{background-color:var(--color-amber-100)}.bg-amber-400{background-color:var(--color-amber-400)}.bg-blue-50{background-color:#ebf5ff}.bg-blue-100{background-color:#e1effe}.bg-blue-500{background-color:#3f83f8}.bg-blue-600{background-color:#1c64f2}.bg-emerald-100{background-color:var(--color-emerald-100)}.bg-gray-50{background-color:#f9fafb}.bg-gray-100{background-color:#f3f4f6}.bg-gray-200{background-color:#e5e7eb}.bg-gray-600{background-color:#4b5563}.bg-gray-700{background-color:#374151}.bg-gray-800{background-color:#1f2937}.bg-gray-900{background-color:#111827}.bg-gray-950{background-color:var(--color-gray-950)}.bg-green-50{background-color:#f3faf7}.bg-green-100{background-color:#def7ec}.bg-green-200{background-color:#bcf0da}.bg-green-500{background-color:#0e9f6e}.bg-purple-50{background-color:#f6f5ff}.bg-purple-100{background-color:#edebfe}.bg-red-50{background-color:#fdf2f2}.bg-red-100{background-color:#fde8e8}.bg-red-200{background-color:#fbd5d5}.bg-transparent{background-color:#0000}.bg-white{background-color:#fff}.bg-yellow-50{background-color:#fdfdea}.bg-yellow-500{background-color:#c27803}.\!bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab!important;background-image:linear-gradient(var(--tw-gradient-stops))!important}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.bg-gradient-to-r{--tw-gradient-position:to right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-blue-50{--tw-gradient-from:#ebf5ff;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-gray-50{--tw-gradient-from:#f9fafb;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.from-green-50{--tw-gradient-from:#f3faf7;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-emerald-50{--tw-gradient-to:var(--color-emerald-50);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-gray-100{--tw-gradient-to:#f3f4f6;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.to-indigo-50{--tw-gradient-to:#f0f5ff;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.p-0{padding:calc(var(--spacing)*0)}.p-1{padding:calc(var(--spacing)*1)}.p-1\.5{padding:calc(var(--spacing)*1.5)}.p-2{padding:calc(var(--spacing)*2)}.p-2\.5{padding:calc(var(--spacing)*2.5)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.p-6{padding:calc(var(--spacing)*6)}.p-8{padding:calc(var(--spacing)*8)}.px-0\.5{padding-inline:calc(var(--spacing)*.5)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-1\.5{padding-inline:calc(var(--spacing)*1.5)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-2\.5{padding-inline:calc(var(--spacing)*2.5)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-5{padding-inline:calc(var(--spacing)*5)}.px-6{padding-inline:calc(var(--spacing)*6)}.px-8{padding-inline:calc(var(--spacing)*8)}.py-0\.5{padding-block:calc(var(--spacing)*.5)}.py-1{padding-block:calc(var(--spacing)*1)}.py-2{padding-block:calc(var(--spacing)*2)}.py-2\.5{padding-block:calc(var(--spacing)*2.5)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-5{padding-block:calc(var(--spacing)*5)}.py-6{padding-block:calc(var(--spacing)*6)}.py-8{padding-block:calc(var(--spacing)*8)}.py-10{padding-block:calc(var(--spacing)*10)}.py-12{padding-block:calc(var(--spacing)*12)}.py-16{padding-block:calc(var(--spacing)*16)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-5{padding-top:calc(var(--spacing)*5)}.pt-6{padding-top:calc(var(--spacing)*6)}.pr-3{padding-right:calc(var(--spacing)*3)}.pr-12{padding-right:calc(var(--spacing)*12)}.pb-4{padding-bottom:calc(var(--spacing)*4)}.pb-6{padding-bottom:calc(var(--spacing)*6)}.pl-3{padding-left:calc(var(--spacing)*3)}.pl-4{padding-left:calc(var(--spacing)*4)}.pl-10{padding-left:calc(var(--spacing)*10)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.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-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-5{--tw-leading:calc(var(--spacing)*5);line-height:calc(var(--spacing)*5)}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-extrabold{--tw-font-weight:var(--font-weight-extrabold);font-weight:var(--font-weight-extrabold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-600{color:var(--color-amber-600)}.text-amber-700{color:var(--color-amber-700)}.text-amber-800{color:var(--color-amber-800)}.text-blue-600{color:#1c64f2}.text-blue-700{color:#1a56db}.text-blue-800{color:#1e429f}.text-emerald-800{color:var(--color-emerald-800)}.text-gray-300{color:#d1d5db}.text-gray-400{color:#9ca3af}.text-gray-500{color:#6b7280}.text-gray-600{color:#4b5563}.text-gray-700{color:#374151}.text-gray-800{color:#1f2937}.text-gray-900{color:#111827}.text-green-600{color:#057a55}.text-green-700{color:#046c4e}.text-green-800{color:#03543f}.text-green-900{color:#014737}.text-orange-600{color:#d03801}.text-purple-600{color:#7e3af2}.text-purple-700{color:#6c2bd9}.text-purple-800{color:#5521b5}.text-red-500{color:#f05252}.text-red-600{color:#e02424}.text-red-700{color:#c81e1e}.text-red-800{color:#9b1c1c}.text-red-900{color:#771d1d}.text-white{color:#fff}.text-yellow-800{color:#723b13}.capitalize{text-transform:capitalize}.lowercase{text-transform:lowercase}.uppercase{text-transform:uppercase}.italic{font-style:italic}.line-through{text-decoration-line:line-through}.placeholder-gray-500::placeholder{color:#6b7280}.opacity-0{opacity:0}.opacity-25{opacity:.25}.opacity-75{opacity:.75}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-0{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(0px + 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)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-shadow{transition-property:box-shadow;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-300{--tw-duration:.3s;transition-duration:.3s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.select-none{-webkit-user-select:none;user-select:none}@media (hover:hover){.group-hover\:bg-blue-200:is(:where(.group):hover *){background-color:#c3ddfd}.group-hover\:text-blue-600:is(:where(.group):hover *){color:#1c64f2}.group-hover\:opacity-100:is(:where(.group):hover *){opacity:1}}.first\:mt-0:first-child{margin-top:calc(var(--spacing)*0)}@media (hover:hover){.hover\:border-blue-300:hover{border-color:#a4cafe}.hover\:border-blue-400:hover{border-color:#76a9fa}.hover\:bg-blue-100:hover{background-color:#e1effe}.hover\:bg-blue-200:hover{background-color:#c3ddfd}.hover\:bg-blue-700:hover{background-color:#1a56db}.hover\:bg-gray-50:hover{background-color:#f9fafb}.hover\:bg-gray-100:hover{background-color:#f3f4f6}.hover\:bg-gray-200:hover{background-color:#e5e7eb}.hover\:bg-gray-300:hover{background-color:#d1d5db}.hover\:bg-gray-700:hover{background-color:#374151}.hover\:bg-green-200:hover{background-color:#bcf0da}.hover\:bg-purple-200:hover{background-color:#dcd7fe}.hover\:bg-red-50:hover{background-color:#fdf2f2}.hover\:bg-red-100:hover{background-color:#fde8e8}.hover\:text-blue-700:hover{color:#1a56db}.hover\:text-blue-800:hover{color:#1e429f}.hover\:text-gray-600:hover{color:#4b5563}.hover\:text-gray-700:hover{color:#374151}.hover\:text-gray-800:hover{color:#1f2937}.hover\:text-gray-900:hover{color:#111827}.hover\:text-red-500:hover{color:#f05252}.hover\:text-red-700:hover{color:#c81e1e}.hover\:text-red-800:hover{color:#9b1c1c}.hover\:opacity-80:hover{opacity:.8}.hover\:shadow:hover{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.hover\:shadow-md:hover{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a),0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}}.focus\:z-10:focus{z-index:10}.focus\:border-blue-500:focus{border-color:#3f83f8}.focus\:border-red-500:focus{border-color:#f05252}.focus\:border-transparent:focus{border-color:#0000}.focus\:bg-gray-700:focus{background-color:#374151}.focus\:placeholder-gray-400:focus::placeholder{color:#9ca3af}.focus\:ring-1:focus{--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)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + 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)}.focus\:ring-4:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(4px + 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)}.focus\:ring-blue-300:focus{--tw-ring-color:#a4cafe}.focus\:ring-blue-500:focus{--tw-ring-color:#3f83f8}.focus\:ring-blue-600:focus{--tw-ring-color:#1c64f2}.focus\:ring-gray-500:focus{--tw-ring-color:#6b7280}.focus\:ring-red-500:focus{--tw-ring-color:#f05252}.focus\:ring-offset-2:focus{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,)0 0 0 var(--tw-ring-offset-width)var(--tw-ring-offset-color)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-gray-400:disabled{background-color:#9ca3af}.disabled\:opacity-50:disabled{opacity:.5}@media (min-width:40rem){.sm\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}@media (min-width:48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:px-4{padding-inline:calc(var(--spacing)*4)}.md\:py-2{padding-block:calc(var(--spacing)*2)}}@media (min-width:64rem){.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:px-8{padding-inline:calc(var(--spacing)*8)}}@media (min-width:80rem){.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}:where(.dark\:divide-gray-600:is(.dark *)>:not(:last-child)){border-color:#4b5563}:where(.dark\:divide-gray-700:is(.dark *)>:not(:last-child)){border-color:#374151}.dark\:border-blue-600:is(.dark *){border-color:#1c64f2}.dark\:border-blue-700:is(.dark *){border-color:#1a56db}.dark\:border-blue-800:is(.dark *){border-color:#1e429f}.dark\:border-gray-500:is(.dark *){border-color:#6b7280}.dark\:border-gray-600:is(.dark *){border-color:#4b5563}.dark\:border-gray-700:is(.dark *){border-color:#374151}.dark\:border-green-700:is(.dark *){border-color:#046c4e}.dark\:border-green-800:is(.dark *){border-color:#03543f}.dark\:border-purple-700:is(.dark *){border-color:#6c2bd9}.dark\:border-purple-800:is(.dark *){border-color:#5521b5}.dark\:border-red-800:is(.dark *){border-color:#9b1c1c}.dark\:bg-amber-900\/30:is(.dark *){background-color:#7b33064d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-amber-900\/30:is(.dark *){background-color:color-mix(in oklab,var(--color-amber-900)30%,transparent)}}.dark\:bg-blue-600:is(.dark *){background-color:#1c64f2}.dark\:bg-blue-800:is(.dark *){background-color:#1e429f}.dark\:bg-blue-900:is(.dark *){background-color:#233876}.dark\:bg-blue-900\/10:is(.dark *){background-color:#2338761a}.dark\:bg-blue-900\/20:is(.dark *){background-color:#23387633}.dark\:bg-blue-900\/30:is(.dark *){background-color:#2338764d}.dark\:bg-emerald-900\/30:is(.dark *){background-color:#004e3b4d}@supports (color:color-mix(in lab,red,red)){.dark\:bg-emerald-900\/30:is(.dark *){background-color:color-mix(in oklab,var(--color-emerald-900)30%,transparent)}}.dark\:bg-gray-600:is(.dark *){background-color:#4b5563}.dark\:bg-gray-700:is(.dark *){background-color:#374151}.dark\:bg-gray-800:is(.dark *){background-color:#1f2937}.dark\:bg-gray-800\/50:is(.dark *){background-color:#1f293780}.dark\:bg-gray-900:is(.dark *){background-color:#111827}.dark\:bg-gray-900\/20:is(.dark *){background-color:#11182733}.dark\:bg-green-800:is(.dark *){background-color:#03543f}.dark\:bg-green-900:is(.dark *){background-color:#014737}.dark\:bg-green-900\/10:is(.dark *){background-color:#0147371a}.dark\:bg-green-900\/20:is(.dark *){background-color:#01473733}.dark\:bg-green-900\/30:is(.dark *){background-color:#0147374d}.dark\:bg-orange-800:is(.dark *){background-color:#8a2c0d}.dark\:bg-purple-900:is(.dark *){background-color:#4a1d96}.dark\:bg-purple-900\/10:is(.dark *){background-color:#4a1d961a}.dark\:bg-purple-900\/20:is(.dark *){background-color:#4a1d9633}.dark\:bg-purple-900\/30:is(.dark *){background-color:#4a1d964d}.dark\:bg-red-800:is(.dark *){background-color:#9b1c1c}.dark\:bg-red-900:is(.dark *){background-color:#771d1d}.dark\:bg-red-900\/20:is(.dark *){background-color:#771d1d33}.dark\:bg-red-900\/30:is(.dark *){background-color:#771d1d4d}.dark\:bg-yellow-600:is(.dark *){background-color:#9f580a}.dark\:from-blue-900\/20:is(.dark *){--tw-gradient-from:oklab(36.062% -.00615554 -.109299/.2);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:from-gray-800:is(.dark *){--tw-gradient-from:#1f2937;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:from-green-900\/20:is(.dark *){--tw-gradient-from:oklab(35.4524% -.0679389 .0103961/.2);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:to-emerald-900\/20:is(.dark *){--tw-gradient-to:#004e3b33}@supports (color:color-mix(in lab,red,red)){.dark\:to-emerald-900\/20:is(.dark *){--tw-gradient-to:color-mix(in oklab,var(--color-emerald-900)20%,transparent)}}.dark\:to-emerald-900\/20:is(.dark *){--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:to-gray-900:is(.dark *){--tw-gradient-to:#111827;--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:to-indigo-900\/20:is(.dark *){--tw-gradient-to:oklab(35.707% .0266021 -.117194/.2);--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position),var(--tw-gradient-from)var(--tw-gradient-from-position),var(--tw-gradient-to)var(--tw-gradient-to-position))}.dark\:text-amber-300:is(.dark *){color:var(--color-amber-300)}.dark\:text-amber-400:is(.dark *){color:var(--color-amber-400)}.dark\:text-blue-200:is(.dark *){color:#c3ddfd}.dark\:text-blue-300:is(.dark *){color:#a4cafe}.dark\:text-blue-400:is(.dark *){color:#76a9fa}.dark\:text-emerald-300:is(.dark *){color:var(--color-emerald-300)}.dark\:text-gray-100:is(.dark *){color:#f3f4f6}.dark\:text-gray-200:is(.dark *){color:#e5e7eb}.dark\:text-gray-300:is(.dark *){color:#d1d5db}.dark\:text-gray-400:is(.dark *){color:#9ca3af}.dark\:text-gray-500:is(.dark *){color:#6b7280}.dark\:text-gray-600:is(.dark *){color:#4b5563}.dark\:text-green-100:is(.dark *){color:#def7ec}.dark\:text-green-200:is(.dark *){color:#bcf0da}.dark\:text-green-300:is(.dark *){color:#84e1bc}.dark\:text-green-400:is(.dark *){color:#31c48d}.dark\:text-orange-200:is(.dark *){color:#fcd9bd}.dark\:text-orange-400:is(.dark *){color:#ff8a4c}.dark\:text-purple-200:is(.dark *){color:#dcd7fe}.dark\:text-purple-300:is(.dark *){color:#cabffd}.dark\:text-purple-400:is(.dark *){color:#ac94fa}.dark\:text-red-100:is(.dark *){color:#fde8e8}.dark\:text-red-200:is(.dark *){color:#fbd5d5}.dark\:text-red-300:is(.dark *){color:#f8b4b4}.dark\:text-red-400:is(.dark *){color:#f98080}.dark\:text-white:is(.dark *){color:#fff}.dark\:text-yellow-100:is(.dark *){color:#fdf6b2}.dark\:text-yellow-300:is(.dark *){color:#faca15}.dark\:placeholder-gray-400:is(.dark *)::placeholder{color:#9ca3af}.dark\:ring-offset-gray-800:is(.dark *){--tw-ring-offset-color:#1f2937}@media (hover:hover){.dark\:group-hover\:bg-blue-700:is(.dark *):is(:where(.group):hover *){background-color:#1a56db}.dark\:group-hover\:text-blue-400:is(.dark *):is(:where(.group):hover *){color:#76a9fa}.dark\:hover\:border-blue-500:is(.dark *):hover{border-color:#3f83f8}.dark\:hover\:border-blue-700:is(.dark *):hover{border-color:#1a56db}.dark\:hover\:bg-blue-700:is(.dark *):hover{background-color:#1a56db}.dark\:hover\:bg-blue-800:is(.dark *):hover{background-color:#1e429f}.dark\:hover\:bg-blue-800\/30:is(.dark *):hover{background-color:#1e429f4d}.dark\:hover\:bg-blue-900\/30:is(.dark *):hover{background-color:#2338764d}.dark\:hover\:bg-blue-900\/50:is(.dark *):hover{background-color:#23387680}.dark\:hover\:bg-gray-600:is(.dark *):hover{background-color:#4b5563}.dark\:hover\:bg-gray-700:is(.dark *):hover{background-color:#374151}.dark\:hover\:bg-gray-800:is(.dark *):hover{background-color:#1f2937}.dark\:hover\:bg-gray-800\/50:is(.dark *):hover{background-color:#1f293780}.dark\:hover\:bg-green-800\/30:is(.dark *):hover{background-color:#03543f4d}.dark\:hover\:bg-purple-800\/30:is(.dark *):hover{background-color:#5521b54d}.dark\:hover\:bg-red-900\/20:is(.dark *):hover{background-color:#771d1d33}.dark\:hover\:bg-red-900\/50:is(.dark *):hover{background-color:#771d1d80}.dark\:hover\:text-blue-100:is(.dark *):hover{color:#e1effe}.dark\:hover\:text-blue-300:is(.dark *):hover{color:#a4cafe}.dark\:hover\:text-gray-100:is(.dark *):hover{color:#f3f4f6}.dark\:hover\:text-gray-200:is(.dark *):hover{color:#e5e7eb}.dark\:hover\:text-gray-300:is(.dark *):hover{color:#d1d5db}.dark\:hover\:text-red-100:is(.dark *):hover{color:#fde8e8}.dark\:hover\:text-white:is(.dark *):hover{color:#fff}}.dark\:focus\:ring-blue-400:is(.dark *):focus{--tw-ring-color:#76a9fa}.dark\:focus\:ring-blue-600:is(.dark *):focus{--tw-ring-color:#1c64f2}.dark\:focus\:ring-blue-800:is(.dark *):focus{--tw-ring-color:#1e429f}}:root{--navbar-height:4rem;--sidebar-width:16rem;--table-height:350px}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@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}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-leading{syntax:"*";inherits:false}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.diff-viewer.svelte-tcwuie{font-family:Monaco,Menlo,Consolas,monospace}.diff-line.svelte-tcwuie:hover{background-color:#3b82f60d}.diff-line.bg-green-50.svelte-tcwuie:hover{background-color:#22c55e1a}.diff-line.bg-red-50.svelte-tcwuie:hover{background-color:#ef44441a}.dark .diff-line.svelte-tcwuie:hover{background-color:#3b82f61a}.yaml-diff-viewer.svelte-1mbkpm9{font-family:Monaco,Menlo,Consolas,monospace}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{i as k,j as t,k as S,q as b,S as h}from"./B_3ksxz5.js";function u(r,i){return r===i||r?.[h]===i}function c(r={},i,a,q){return k(()=>{var f,s;return t(()=>{f=s,s=[],S(()=>{r!==a(...s)&&(i(r,...s),f&&u(a(...f),r)&&i(null,...f))})}),()=>{b(()=>{s&&u(a(...s),r)&&i(null,...s)})}}),r}export{c as b};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{O as K,l as k,aw as Ne,v as de,m as Me,t as ae,h as te,a0 as Oe,L as We,M as Ie,N as ie,P as R,z as D,ax as De,ay as Le,w as H,y as Pe,az as B,aA as J,x as W,aB as ve,aC as he,aD as pe,T as Re,ab as oe,aE as le,Q as we,A as $e,aF as X,q as He,aG as U,aH as Ue,aI as qe,aJ as Fe,aK as Ve,aL as Ye,aM as Be,a3 as Je,i as ne,aN as ze,aO as Ge,X as Ke,aP as se,aQ as Xe,aR as Qe,aS as Ze,aT as je,at as xe,aU as et,aV as tt,U as rt,aW as at,aX as nt,aY as st,aZ as it,a_ as ot,a$ as lt,b0 as ct,as as ft,k as be,j as _e,b1 as ut,b2 as dt}from"./B_3ksxz5.js";function mt(e,t){return t}function vt(e,t,r){for(var a=e.items,n=[],s=t.length,i=0;i<s;i++)Ve(t[i].e,n,!0);var l=s>0&&n.length===0&&r!==null;if(l){var g=r.parentNode;Ye(g),g.append(r),a.clear(),T(e,t[0].prev,t[s-1].next)}Be(n,()=>{for(var d=0;d<s;d++){var S=t[d];l||(a.delete(S.k),T(e,S.prev,S.next)),U(S.e,!l)}})}function Tt(e,t,r,a,n,s=null){var i=e,l={flags:t,items:new Map,first:null},g=(t&ve)!==0;if(g){var d=e;i=k?K(Ne(d)):d.appendChild(de())}k&&Me();var S=null,y=!1,w=new Map,E=Oe(()=>{var h=r();return pe(h)?h:h==null?[]:he(h)}),f,u;function _(){ht(u,f,l,w,i,n,t,a,r),s!==null&&(f.length===0?S?we(S):S=H(()=>s(i)):S!==null&&$e(S,()=>{S=null}))}ae(()=>{u??=Je,f=te(E);var h=f.length;if(y&&h===0)return;y=h===0;let C=!1;if(k){var v=We(i)===Ie;v!==(h===0)&&(i=ie(),K(i),R(!1),C=!0)}if(k){for(var p=null,b,o=0;o<h;o++){if(D.nodeType===De&&D.data===Le){i=D,C=!0,R(!1);break}var c=f[o],A=a(c,o);b=re(D,l,p,null,c,A,o,n,t,r),l.items.set(A,b),p=b}h>0&&K(ie())}if(k)h===0&&s&&(S=H(()=>s(i)));else if(Pe()){var M=new Set,q=W;for(o=0;o<h;o+=1){c=f[o],A=a(c,o);var O=l.items.get(A)??w.get(A);O?(t&(B|J))!==0&&Se(O,c,o,t):(b=re(null,l,null,null,c,A,o,n,t,r,!0),w.set(A,b)),M.add(A)}for(const[m,F]of l.items)M.has(m)||q.skipped_effects.add(F.e);q.add_callback(_)}else _();C&&R(!0),te(E)}),k&&(i=D)}function ht(e,t,r,a,n,s,i,l,g){var d=(i&qe)!==0,S=(i&(B|J))!==0,y=t.length,w=r.items,E=r.first,f=E,u,_=null,h,C=[],v=[],p,b,o,c;if(d)for(c=0;c<y;c+=1)p=t[c],b=l(p,c),o=w.get(b),o!==void 0&&(o.a?.measure(),(h??=new Set).add(o));for(c=0;c<y;c+=1){if(p=t[c],b=l(p,c),o=w.get(b),o===void 0){var A=a.get(b);if(A!==void 0){a.delete(b),w.set(b,A);var M=_?_.next:f;T(r,_,A),T(r,A,M),Q(A,M,n),_=A}else{var q=f?f.e.nodes_start:n;_=re(q,r,_,_===null?r.first:_.next,p,b,c,s,i,g)}w.set(b,_),C=[],v=[],f=_.next;continue}if(S&&Se(o,p,c,i),(o.e.f&X)!==0&&(we(o.e),d&&(o.a?.unfix(),(h??=new Set).delete(o))),o!==f){if(u!==void 0&&u.has(o)){if(C.length<v.length){var O=v[0],m;_=O.prev;var F=C[0],z=C[C.length-1];for(m=0;m<C.length;m+=1)Q(C[m],O,n);for(m=0;m<v.length;m+=1)u.delete(v[m]);T(r,F.prev,z.next),T(r,_,F),T(r,z,O),f=O,_=z,c-=1,C=[],v=[]}else u.delete(o),Q(o,f,n),T(r,o.prev,o.next),T(r,o,_===null?r.first:_.next),T(r,_,o),_=o;continue}for(C=[],v=[];f!==null&&f.k!==b;)(f.e.f&X)===0&&(u??=new Set).add(f),v.push(f),f=f.next;if(f===null)continue;o=f}C.push(o),_=o,f=o.next}if(f!==null||u!==void 0){for(var I=u===void 0?[]:he(u);f!==null;)(f.e.f&X)===0&&I.push(f),f=f.next;var G=I.length;if(G>0){var me=(i&ve)!==0&&y===0?n:null;if(d){for(c=0;c<G;c+=1)I[c].a?.measure();for(c=0;c<G;c+=1)I[c].a?.fix()}vt(r,I,me)}}d&&He(()=>{if(h!==void 0)for(o of h)o.a?.apply()}),e.first=r.first&&r.first.e,e.last=_&&_.e;for(var Te of a.values())U(Te.e);a.clear()}function Se(e,t,r,a){(a&B)!==0&&le(e.v,t),(a&J)!==0?le(e.i,r):e.i=r}function re(e,t,r,a,n,s,i,l,g,d,S){var y=(g&B)!==0,w=(g&Ue)===0,E=y?w?Re(n,!1,!1):oe(n):n,f=(g&J)===0?i:oe(i),u={i:f,v:E,k:s,a:null,e:null,prev:r,next:a};try{if(e===null){var _=document.createDocumentFragment();_.append(e=de())}return u.e=H(()=>l(e,E,f,d),k),u.e.prev=r&&r.e,u.e.next=a&&a.e,r===null?S||(t.first=u):(r.next=u,r.e.next=u.e),a!==null&&(a.prev=u,a.e.prev=u.e),u}finally{}}function Q(e,t,r){for(var a=e.next?e.next.e.nodes_start:r,n=t?t.e.nodes_start:r,s=e.e.nodes_start;s!==null&&s!==a;){var i=Fe(s);n.before(s),s=i}}function T(e,t,r){t===null?e.first=r:(t.next=r,t.e.next=r&&r.e),r!==null&&(r.prev=t,r.e.prev=t&&t.e)}function pt(e,t){var r=void 0,a;ae(()=>{r!==(r=t())&&(a&&(U(a),a=null),r&&(a=H(()=>{ne(()=>r(e))})))})}function ge(e){var t,r,a="";if(typeof e=="string"||typeof e=="number")a+=e;else if(typeof e=="object")if(Array.isArray(e)){var n=e.length;for(t=0;t<n;t++)e[t]&&(r=ge(e[t]))&&(a&&(a+=" "),a+=r)}else for(r in e)e[r]&&(a&&(a+=" "),a+=r);return a}function wt(){for(var e,t,r=0,a="",n=arguments.length;r<n;r++)(e=arguments[r])&&(t=ge(e))&&(a&&(a+=" "),a+=t);return a}function bt(e){return typeof e=="object"?wt(e):e??""}const ce=[...`
|
|
2
|
+
\r\f \v\uFEFF`];function _t(e,t,r){var a=e==null?"":""+e;if(t&&(a=a?a+" "+t:t),r){for(var n in r)if(r[n])a=a?a+" "+n:n;else if(a.length)for(var s=n.length,i=0;(i=a.indexOf(n,i))>=0;){var l=i+s;(i===0||ce.includes(a[i-1]))&&(l===a.length||ce.includes(a[l]))?a=(i===0?"":a.substring(0,i))+a.substring(l+1):i=l}}return a===""?null:a}function fe(e,t=!1){var r=t?" !important;":";",a="";for(var n in e){var s=e[n];s!=null&&s!==""&&(a+=" "+n+": "+s+r)}return a}function Z(e){return e[0]!=="-"||e[1]!=="-"?e.toLowerCase():e}function St(e,t){if(t){var r="",a,n;if(Array.isArray(t)?(a=t[0],n=t[1]):a=t,e){e=String(e).replaceAll(/\s*\/\*.*?\*\/\s*/g,"").trim();var s=!1,i=0,l=!1,g=[];a&&g.push(...Object.keys(a).map(Z)),n&&g.push(...Object.keys(n).map(Z));var d=0,S=-1;const u=e.length;for(var y=0;y<u;y++){var w=e[y];if(l?w==="/"&&e[y-1]==="*"&&(l=!1):s?s===w&&(s=!1):w==="/"&&e[y+1]==="*"?l=!0:w==='"'||w==="'"?s=w:w==="("?i++:w===")"&&i--,!l&&s===!1&&i===0){if(w===":"&&S===-1)S=y;else if(w===";"||y===u-1){if(S!==-1){var E=Z(e.substring(d,S).trim());if(!g.includes(E)){w!==";"&&y++;var f=e.substring(d,y).trim();r+=" "+f+";"}}d=y+1,S=-1}}}}return a&&(r+=fe(a)),n&&(r+=fe(n,!0)),r=r.trim(),r===""?null:r}return e==null?null:String(e)}function gt(e,t,r,a,n,s){var i=e.__className;if(k||i!==r||i===void 0){var l=_t(r,a,s);(!k||l!==e.getAttribute("class"))&&(l==null?e.removeAttribute("class"):t?e.className=l:e.setAttribute("class",l)),e.__className=r}else if(s&&n!==s)for(var g in s){var d=!!s[g];(n==null||d!==!!n[g])&&e.classList.toggle(g,d)}return s}function j(e,t={},r,a){for(var n in r){var s=r[n];t[n]!==s&&(r[n]==null?e.style.removeProperty(n):e.style.setProperty(n,s,a))}}function yt(e,t,r,a){var n=e.__style;if(k||n!==t){var s=St(t,a);(!k||s!==e.getAttribute("style"))&&(s==null?e.removeAttribute("style"):e.style.cssText=s),e.__style=t}else a&&(Array.isArray(a)?(j(e,r?.[0],a[0]),j(e,r?.[1],a[1],"important")):j(e,r,a));return a}function V(e,t,r=!1){if(e.multiple){if(t==null)return;if(!pe(t))return ze();for(var a of e.options)a.selected=t.includes($(a));return}for(a of e.options){var n=$(a);if(Ge(n,t)){a.selected=!0;return}}(!r||t!==void 0)&&(e.selectedIndex=-1)}function ye(e){var t=new MutationObserver(()=>{V(e,e.__value)});t.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),Ke(()=>{t.disconnect()})}function Nt(e,t,r=t){var a=!0;se(e,"change",n=>{var s=n?"[selected]":":checked",i;if(e.multiple)i=[].map.call(e.querySelectorAll(s),$);else{var l=e.querySelector(s)??e.querySelector("option:not([disabled])");i=l&&$(l)}r(i)}),ne(()=>{var n=t();if(V(e,n,a),a&&n===void 0){var s=e.querySelector(":checked");s!==null&&(n=$(s),r(n))}e.__value=n,a=!1}),ye(e)}function $(e){return"__value"in e?e.__value:e.value}const L=Symbol("class"),P=Symbol("style"),Ce=Symbol("is custom element"),Ae=Symbol("is html");function Mt(e){if(k){var t=!1,r=()=>{if(!t){if(t=!0,e.hasAttribute("value")){var a=e.value;Y(e,"value",null),e.value=a}if(e.hasAttribute("checked")){var n=e.checked;Y(e,"checked",null),e.checked=n}}};e.__on_r=r,it(r),ot()}}function Ct(e,t){t?e.hasAttribute("selected")||e.setAttribute("selected",""):e.removeAttribute("selected")}function Y(e,t,r,a){var n=ke(e);k&&(n[t]=e.getAttribute(t),t==="src"||t==="srcset"||t==="href"&&e.nodeName==="LINK")||n[t]!==(n[t]=r)&&(t==="loading"&&(e[st]=r),r==null?e.removeAttribute(t):typeof r!="string"&&Ee(e).includes(t)?e[t]=r:e.setAttribute(t,r))}function At(e,t,r,a,n=!1){var s=ke(e),i=s[Ce],l=!s[Ae];let g=k&&i;g&&R(!1);var d=t||{},S=e.tagName==="OPTION";for(var y in t)y in r||(r[y]=null);r.class?r.class=bt(r.class):r[L]&&(r.class=null),r[P]&&(r.style??=null);var w=Ee(e);for(const v in r){let p=r[v];if(S&&v==="value"&&p==null){e.value=e.__value="",d[v]=p;continue}if(v==="class"){var E=e.namespaceURI==="http://www.w3.org/1999/xhtml";gt(e,E,p,a,t?.[L],r[L]),d[v]=p,d[L]=r[L];continue}if(v==="style"){yt(e,p,t?.[P],r[P]),d[v]=p,d[P]=r[P];continue}var f=d[v];if(!(p===f&&!(p===void 0&&e.hasAttribute(v)))){d[v]=p;var u=v[0]+v[1];if(u!=="$$")if(u==="on"){const b={},o="$$"+v;let c=v.slice(2);var _=lt(c);if(Ze(c)&&(c=c.slice(0,-7),b.capture=!0),!_&&f){if(p!=null)continue;e.removeEventListener(c,d[o],b),d[o]=null}if(p!=null)if(_)e[`__${c}`]=p,xe([c]);else{let A=function(M){d[v].call(this,M)};d[o]=je(c,e,A,b)}else _&&(e[`__${c}`]=void 0)}else if(v==="style")Y(e,v,p);else if(v==="autofocus")et(e,!!p);else if(!i&&(v==="__value"||v==="value"&&p!=null))e.value=e.__value=p;else if(v==="selected"&&S)Ct(e,p);else{var h=v;l||(h=tt(h));var C=h==="defaultValue"||h==="defaultChecked";if(p==null&&!i&&!C)if(s[v]=null,h==="value"||h==="checked"){let b=e;const o=t===void 0;if(h==="value"){let c=b.defaultValue;b.removeAttribute(h),b.defaultValue=c,b.value=b.__value=o?c:null}else{let c=b.defaultChecked;b.removeAttribute(h),b.defaultChecked=c,b.checked=o?c:!1}}else e.removeAttribute(v);else C||w.includes(h)&&(i||typeof p!="string")?(e[h]=p,h in s&&(s[h]=rt)):typeof p!="function"&&Y(e,h,p)}}}return g&&R(!0),d}function Ot(e,t,r=[],a=[],n,s=!1){Xe(r,a,i=>{var l=void 0,g={},d=e.nodeName==="SELECT",S=!1;if(ae(()=>{var w=t(...i.map(te)),E=At(e,l,w,n,s);S&&d&&"value"in w&&V(e,w.value);for(let u of Object.getOwnPropertySymbols(g))w[u]||U(g[u]);for(let u of Object.getOwnPropertySymbols(w)){var f=w[u];u.description===Qe&&(!l||f!==l[u])&&(g[u]&&U(g[u]),g[u]=H(()=>pt(e,()=>f))),E[u]=f}l=E}),d){var y=e;ne(()=>{V(y,l.value,!0),ye(y)})}S=!0})}function ke(e){return e.__attributes??={[Ce]:e.nodeName.includes("-"),[Ae]:e.namespaceURI===at}}var ue=new Map;function Ee(e){var t=e.getAttribute("is")||e.nodeName,r=ue.get(t);if(r)return r;ue.set(t,r=[]);for(var a,n=e,s=Element.prototype;s!==n;){a=ct(n);for(var i in a)a[i].set&&r.push(i);n=nt(n)}return r}function Wt(e,t,r=t){var a=new WeakSet;se(e,"input",async n=>{var s=n?e.defaultValue:e.value;if(s=x(e)?ee(s):s,r(s),W!==null&&a.add(W),await ft(),s!==(s=t())){var i=e.selectionStart,l=e.selectionEnd;e.value=s??"",l!==null&&(e.selectionStart=i,e.selectionEnd=Math.min(l,e.value.length))}}),(k&&e.defaultValue!==e.value||be(t)==null&&e.value)&&(r(x(e)?ee(e.value):e.value),W!==null&&a.add(W)),_e(()=>{var n=t();if(e===document.activeElement){var s=ut??W;if(a.has(s))return}x(e)&&n===ee(e.value)||e.type==="date"&&!n&&!e.value||n!==e.value&&(e.value=n??"")})}function It(e,t,r=t){se(e,"change",a=>{var n=a?e.defaultChecked:e.checked;r(n)}),(k&&e.defaultChecked!==e.checked||be(t)==null)&&r(e.checked),_e(()=>{var a=t();e.checked=!!a})}function x(e){var t=e.type;return t==="number"||t==="range"}function ee(e){return e===""?null:+e}const N=dt({id:"unknown",name:"Unknown Control Set",currentPath:"",controls:[],mappings:[],families:[],totalControls:0,totalMappings:0,isConnected:!1});class kt{ws=null;reconnectTimer=null;reconnectAttempts=0;maxReconnectAttempts=5;reconnectDelay=1e3;connect(){if(this.ws&&(this.ws.readyState===WebSocket.CONNECTING||this.ws.readyState===WebSocket.OPEN)){console.log("WebSocket already connected or connecting");return}const t=window.location.protocol==="https:"?"wss:":"ws:",r=window.location.hostname==="localhost"?"localhost:3000":window.location.host,a=`${t}//${r}/ws`;console.log("Connecting to WebSocket:",a);try{this.ws=new WebSocket(a),this.ws.onopen=()=>{console.log("WebSocket connected"),this.reconnectAttempts=0,this.reconnectDelay=1e3},this.ws.onmessage=n=>{try{const s=JSON.parse(n.data);this.handleMessage(s)}catch(s){console.error("Failed to parse WebSocket message:",s)}},this.ws.onerror=n=>{console.error("WebSocket error:",n)},this.ws.onclose=()=>{console.log("WebSocket disconnected"),N.update(n=>({...n,isConnected:!1})),this.ws=null,this.scheduleReconnect()}}catch(n){console.error("Failed to create WebSocket:",n),this.scheduleReconnect()}}handleMessage(t){switch(console.log("WebSocket message received:",t),t.type){case"connected":console.log("WebSocket connection confirmed"),N.update(r=>({...r,isConnected:!0}));break;case"state-update":console.log("State update received"),t.payload&&N.set({...t.payload,isConnected:!0,isSwitchingControlSet:!1});break;case"metadata-update":console.log("Metadata update received"),t.payload&&N.update(r=>({...r,...t.payload,isConnected:!0,isSwitchingControlSet:!1}));break;case"controls-update":console.log("Controls update received"),t.payload&&N.update(r=>({...r,controls:t.payload}));break;case"mappings-update":console.log("Mappings update received"),t.payload&&N.update(r=>({...r,mappings:t.payload}));break;case"control-details":console.log("Control details received:",t.payload),t.payload&&window.dispatchEvent(new CustomEvent("control-details",{detail:t.payload}));break;case"control-sets-list":console.log("Control sets list received"),t.payload&&window.dispatchEvent(new CustomEvent("control-sets-list",{detail:t.payload}));break;case"control-updated":console.log("Control updated successfully:",t.payload);break;case"mapping-created":case"mapping-updated":case"mapping-deleted":console.log(`Mapping operation successful: ${t.type}`,t.payload),window.dispatchEvent(new CustomEvent("mappings-changed",{detail:t.payload}));break;case"error":console.error("WebSocket error:",t.payload);break;default:console.warn("Unknown WebSocket message type:",t.type)}}scheduleReconnect(){if(this.reconnectTimer&&clearTimeout(this.reconnectTimer),this.reconnectAttempts>=this.maxReconnectAttempts){console.error("Max reconnection attempts reached");return}this.reconnectAttempts++,console.log(`Scheduling reconnect attempt ${this.reconnectAttempts} in ${this.reconnectDelay}ms`),this.reconnectTimer=window.setTimeout(()=>{this.connect()},this.reconnectDelay),this.reconnectDelay=Math.min(this.reconnectDelay*2,3e4)}disconnect(){this.reconnectTimer&&(clearTimeout(this.reconnectTimer),this.reconnectTimer=null),this.ws&&(this.ws.close(),this.ws=null),N.update(t=>({...t,isConnected:!1}))}isConnected(){return this.ws!==null&&this.ws.readyState===WebSocket.OPEN}async sendCommand(t,r){if(console.log(`Sending WebSocket command: ${t}`,r),!this.ws||this.ws.readyState!==WebSocket.OPEN){console.log("WebSocket not ready, waiting for connection...");try{await this.waitForConnection()}catch(a){throw console.error("Failed to connect:",a),a}}if(this.ws&&this.ws.readyState===WebSocket.OPEN){const a=JSON.stringify({type:t,payload:r});console.log("Sending message:",a),this.ws.send(a)}else{const a=new Error("WebSocket not connected after waiting");throw console.error(a),a}}waitForConnection(t=5e3){return new Promise((r,a)=>{const n=Date.now(),s=()=>{this.ws&&this.ws.readyState===WebSocket.OPEN?r():Date.now()-n>t?a(new Error("WebSocket connection timeout")):setTimeout(s,100)};s()})}async updateControl(t){return this.sendCommand("update-control",t)}async createMapping(t){return this.sendCommand("create-mapping",t)}async updateMapping(t){return this.sendCommand("update-mapping",t)}async deleteMapping(t){return this.sendCommand("delete-mapping",{uuid:t})}async switchControlSet(t){return N.update(r=>({...r,isSwitchingControlSet:!0})),this.sendCommand("switch-control-set",{path:t})}async getControlDetails(t){return this.sendCommand("get-control",{id:t})}async scanControlSets(){return this.sendCommand("scan-control-sets")}send(t){this.ws&&this.ws.readyState===WebSocket.OPEN?this.ws.send(JSON.stringify(t)):console.warn("WebSocket not connected, cannot send message")}}const Dt=new kt;export{Ot as a,Y as b,Wt as c,Nt as d,Tt as e,N as f,bt as g,yt as h,mt as i,It as j,Mt as r,gt as s,Dt as w};
|