diff --git a/.gitignore b/.gitignore
index c538c3c6..4ac04969 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,4 +8,4 @@ botserver-stack
*logfile*
*-log*
docs/book
-.rdb
\ No newline at end of file
+*.rdb
\ No newline at end of file
diff --git a/build.rs b/build.rs
index 1ec3cf3b..d860e1e6 100644
--- a/build.rs
+++ b/build.rs
@@ -1,5 +1,3 @@
-// build.rs
fn main() {
- // Tauri build script to generate the context required by `tauri::generate_context!()`
tauri_build::build()
}
diff --git a/capabilities/default.json b/capabilities/default.json
deleted file mode 100644
index c135d7f1..00000000
--- a/capabilities/default.json
+++ /dev/null
@@ -1,11 +0,0 @@
-{
- "$schema": "../gen/schemas/desktop-schema.json",
- "identifier": "default",
- "description": "enables the default permissions",
- "windows": [
- "main"
- ],
- "permissions": [
- "core:default"
- ]
-}
diff --git a/README-6.md b/docs/src/TODO.txt
similarity index 77%
rename from README-6.md
rename to docs/src/TODO.txt
index be41e3ed..0d7c82d8 100644
--- a/README-6.md
+++ b/docs/src/TODO.txt
@@ -1,253 +1,3 @@
-# General Bots 6 (GB6) Platform
-
-## Vision
-GB6 is a billion-scale real-time communication platform integrating advanced bot capabilities, WebRTC multimedia, and enterprise-grade messaging, built with Rust for maximum performance and reliability and BASIC-WebAssembly VM.
-
-## 🌟 Key Features
-
-### Scale & Performance
-- Billion+ active users support
-- Sub-second message delivery
-- 4K video streaming
-- 99.99% uptime guarantee
-- Zero message loss
-- Petabyte-scale storage
-
-### Core Services
-- **API Service** (gb-server)
- - Axum-based REST & WebSocket
- - Multi-tenant request routing
- - Authentication & Authorization
- - File handling & streaming
-
-- **Media Processing** (gb-media)
- - WebRTC integration
- - GStreamer transcoding
- - Real-time track management
- - Professional recording
-
-- **Messaging** (gb-messaging)
- - Kafka event processing
- - RabbitMQ integration
- - WebSocket communication
- - Redis PubSub
-
-- **Storage** (gb-storage)
- - PostgreSQL with sharding
- - Redis caching
- - TiKV distributed storage
-
-## 🏗 Architecture
-
-### Multi-Tenant Core
-- Organizations
-- Instance management
-- Resource quotas
-- Usage analytics
-
-### Communication Infrastructure
-- WebRTC rooms
-- Real-time messaging
-- Media processing
-- Video conferencing
-
-## 🛠 Installation
-
-### Prerequisites
-- Rust 1.70+
-- Kubernetes cluster
-- PostgreSQL 13+
-- Redis 6+
-- Kafka 3.0+
-- GStreamer
-
-# Deploy platform
-
-
-## Linux && Mac
-```
-sudo apt update
-
-sudo apt install brave-browser-beta
-
-curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
-source "$HOME/.cargo/env"
-git clone https://alm.pragmatismo.com.br/generalbots/gbserver
-
-apt install -y build-essential \
- pkg-config \
- libssl-dev \
- gcc-multilib \
- g++-multilib \
- clang \
- lld \
- binutils-dev \
- libudev-dev \
- libdbus-1-dev
-```
-
-## Build
-
-```
-
-### Build & Run
-```bash
-# Build all services
-cargo build --workspace
-
-# Run tests
-cargo test --workspace
-
-# Start API service
-cargo run -p gb-server
-```
-
-## 📊 Monitoring & Operations
-
-### Health Metrics
-- System performance
-- Resource utilization
-- Error rates
-- Latency tracking
-
-### Scaling Operations
-- Auto-scaling rules
-- Shard management
-- Load balancing
-- Failover systems
-
-## 🔒 Security
-
-### Authentication & Authorization
-- Multi-factor auth
-- Role-based access
-- Rate limiting
-- End-to-end encryption
-
-### Data Protection
-- Tenant isolation
-- Encryption at rest
-- Secure communications
-- Audit logging
-
-## 🚀 Development
-
-### Project Structure
-```
-general-bots/
-├── gb-server/ # API service
-├── gb-core/ # Core functionality
-├── gb-media/ # Media processing
-├── gb-messaging/ # Message brokers
-├── gb-storage/ # Data storage
-├── gb-utils/ # Utilities
-└── migrations/ # DB migrations
-```
-
-### Configuration
-```env
-DATABASE_URL=postgresql://user:password@localhost:5432/gbdb
-REDIS_URL=redis://localhost:6379
-KAFKA_BROKERS=localhost:9092
-RABBIT_URL=amqp://guest:guest@localhost:5672
-```
-
-## 🌍 Deployment
-
-### Global Infrastructure
-- Edge presence
-- Regional optimization
-- Content delivery
-- Traffic management
-
-### Disaster Recovery
-- Automated backups
-- Multi-region failover
-- Data replication
-- System redundancy
-
-## 🤝 Contributing
-
-1. Fork repository
-2. Create feature branch
-3. Implement changes
-4. Add tests
-5. Submit PR
-
-## 📝 License
-
-Licensed under terms specified in workspace configuration.
-
-## 🆘 Support
-
-### Issues
-- Check existing issues
-- Provide reproduction steps
-- Include relevant logs
-- Follow up on discussions
-
-### Documentation
-- API references
-- Integration guides
-- Deployment docs
-- Best practices
-
-## 🔮 Roadmap
-
-### Short Term
-- Enhanced media processing
-- Additional messaging protocols
-- Improved scalability
-- Extended monitoring
-
-### Long Term
-- Advanced analytics
-- Global expansion
-- Enterprise features
-
-
-| ✓ | Requirement | Component | Standard | Implementation Steps |
-|---|-------------|-----------|-----------|---------------------|
-| ✅ | TLS 1.3 Configuration | Nginx | All | Configure modern SSL parameters and ciphers in `/etc/nginx/conf.d/ssl.conf` |
-| ✅ | Access Logging | Nginx | All | Enable detailed access logs with privacy fields in `/etc/nginx/nginx.conf` |
-| ⬜ | Rate Limiting | Nginx | ISO 27001 | Implement rate limiting rules in location blocks |
-| ⬜ | WAF Rules | Nginx | HIPAA | Install and configure ModSecurity with OWASP rules |
-| ✅ | Reverse Proxy Security | Nginx | All | Configure security headers (X-Frame-Options, HSTS, CSP) |
-| ✅ | MFA Implementation | Zitadel | All | Enable and enforce MFA for all administrative accounts |
-| ✅ | RBAC Configuration | Zitadel | All | Set up role-based access control with least privilege |
-| ✅ | Password Policy | Zitadel | All | Configure strong password requirements (length, complexity, history) |
-| ✅ | OAuth2/OIDC Setup | Zitadel | ISO 27001 | Configure secure OAuth flows and token policies |
-| ✅ | Audit Logging | Zitadel | All | Enable comprehensive audit logging for user activities |
-| ✅ | Encryption at Rest | MinIO | All | Configure encrypted storage with key management |
-| ✅ | Bucket Policies | MinIO | All | Implement strict bucket access policies |
-| ✅ | Object Versioning | MinIO | HIPAA | Enable versioning for data recovery capability |
-| ✅ | Access Logging | MinIO | All | Enable detailed access logging for object operations |
-| ⬜ | Lifecycle Rules | MinIO | LGPD | Configure data retention and deletion policies |
-| ✅ | DKIM/SPF/DMARC | Stalwart | All | Configure email authentication mechanisms |
-| ✅ | Mail Encryption | Stalwart | All | Enable TLS for mail transport |
-| ✅ | Content Filtering | Stalwart | All | Implement content scanning and filtering rules |
-| ⬜ | Mail Archiving | Stalwart | HIPAA | Configure compliant email archiving |
-| ✅ | Sieve Filtering | Stalwart | All | Implement security-focused mail filtering rules |
-| ⬜ | System Hardening | Ubuntu | All | Apply CIS Ubuntu Linux benchmarks |
-| ✅ | System Updates | Ubuntu | All | Configure unattended-upgrades for security patches |
-| ⬜ | Audit Daemon | Ubuntu | All | Configure auditd for system event logging |
-| ✅ | Firewall Rules | Ubuntu | All | Configure UFW with restrictive rules |
-| ⬜ | Disk Encryption | Ubuntu | All | Implement LUKS encryption for system disks |
-| ⬜ | SELinux/AppArmor | Ubuntu | All | Enable and configure mandatory access control |
-| ✅ | Monitoring Setup | All | All | Install and configure Prometheus + Grafana |
-| ✅ | Log Aggregation | All | All | Implement centralized logging (e.g., ELK Stack) |
-| ⬜ | Backup System | All | All | Configure automated backup system with encryption |
-| ✅ | Network Isolation | All | All | Implement proper network segmentation |
-| ✅ | Data Classification | All | HIPAA/LGPD | Document data types and handling procedures |
-| ✅ | Session Management | Zitadel | All | Configure secure session timeouts and invalidation |
-| ✅ | Certificate Management | All | All | Implement automated certificate renewal with Let's Encrypt |
-| ✅ | Vulnerability Scanning | All | ISO 27001 | Regular automated scanning with tools like OpenVAS |
-| ✅ | Incident Response Plan | All | All | Document and test incident response procedures |
-| ✅ | Disaster Recovery | All | HIPAA | Implement and test disaster recovery procedures |
-
-
-## Documentation Requirements
-
1. **Security Policies**
- Information Security Policy
- Access Control Policy
@@ -284,10 +34,9 @@ Licensed under terms specified in workspace configuration.
- Annual penetration testing
- Bi-annual disaster recovery testing
+## Documentation Requirements
-# API:
-
## **File & Document Management**
/files/upload
/files/download
@@ -500,4 +249,107 @@ Licensed under terms specified in workspace configuration.
/monitoring/metrics
-Built with ❤️ from Brazil, using Rust for maximum performance and reliability.
+
+| ✓ | Requirement | Component | Standard | Implementation Steps |
+|---|-------------|-----------|-----------|---------------------|
+| ✅ | TLS 1.3 Configuration | Nginx | All | Configure modern SSL parameters and ciphers in `/etc/nginx/conf.d/ssl.conf` |
+| ✅ | Access Logging | Nginx | All | Enable detailed access logs with privacy fields in `/etc/nginx/nginx.conf` |
+| ⬜ | Rate Limiting | Nginx | ISO 27001 | Implement rate limiting rules in location blocks |
+| ⬜ | WAF Rules | Nginx | HIPAA | Install and configure ModSecurity with OWASP rules |
+| ✅ | Reverse Proxy Security | Nginx | All | Configure security headers (X-Frame-Options, HSTS, CSP) |
+| ✅ | MFA Implementation | Zitadel | All | Enable and enforce MFA for all administrative accounts |
+| ✅ | RBAC Configuration | Zitadel | All | Set up role-based access control with least privilege |
+| ✅ | Password Policy | Zitadel | All | Configure strong password requirements (length, complexity, history) |
+| ✅ | OAuth2/OIDC Setup | Zitadel | ISO 27001 | Configure secure OAuth flows and token policies |
+| ✅ | Audit Logging | Zitadel | All | Enable comprehensive audit logging for user activities |
+| ✅ | Encryption at Rest | MinIO | All | Configure encrypted storage with key management |
+| ✅ | Bucket Policies | MinIO | All | Implement strict bucket access policies |
+| ✅ | Object Versioning | MinIO | HIPAA | Enable versioning for data recovery capability |
+| ✅ | Access Logging | MinIO | All | Enable detailed access logging for object operations |
+| ⬜ | Lifecycle Rules | MinIO | LGPD | Configure data retention and deletion policies |
+| ✅ | DKIM/SPF/DMARC | Stalwart | All | Configure email authentication mechanisms |
+| ✅ | Mail Encryption | Stalwart | All | Enable TLS for mail transport |
+| ✅ | Content Filtering | Stalwart | All | Implement content scanning and filtering rules |
+| ⬜ | Mail Archiving | Stalwart | HIPAA | Configure compliant email archiving |
+| ✅ | Sieve Filtering | Stalwart | All | Implement security-focused mail filtering rules |
+| ⬜ | System Hardening | Ubuntu | All | Apply CIS Ubuntu Linux benchmarks |
+| ✅ | System Updates | Ubuntu | All | Configure unattended-upgrades for security patches |
+| ⬜ | Audit Daemon | Ubuntu | All | Configure auditd for system event logging |
+| ✅ | Firewall Rules | Ubuntu | All | Configure UFW with restrictive rules |
+| ⬜ | Disk Encryption | Ubuntu | All | Implement LUKS encryption for system disks |
+| ⬜ | SELinux/AppArmor | Ubuntu | All | Enable and configure mandatory access control |
+| ✅ | Monitoring Setup | All | All | Install and configure Prometheus + Grafana |
+| ✅ | Log Aggregation | All | All | Implement centralized logging (e.g., ELK Stack) |
+| ⬜ | Backup System | All | All | Configure automated backup system with encryption |
+| ✅ | Network Isolation | All | All | Implement proper network segmentation |
+| ✅ | Data Classification | All | HIPAA/LGPD | Document data types and handling procedures |
+| ✅ | Session Management | Zitadel | All | Configure secure session timeouts and invalidation |
+| ✅ | Certificate Management | All | All | Implement automated certificate renewal with Let's Encrypt |
+| ✅ | Vulnerability Scanning | All | ISO 27001 | Regular automated scanning with tools like OpenVAS |
+| ✅ | Incident Response Plan | All | All | Document and test incident response procedures |
+| ✅ | Disaster Recovery | All | HIPAA | Implement and test disaster recovery procedures |
+
+
+
+## Vision
+GB6 is a billion-scale real-time communication platform integrating advanced bot capabilities, WebRTC multimedia, and enterprise-grade messaging, built with Rust for maximum performance and reliability and BASIC-WebAssembly VM.
+
+## 🌟 Key Features
+
+### Scale & Performance
+- Billion+ active users support
+- Sub-second message delivery
+- 4K video streaming
+- 99.99% uptime guarantee
+- Zero message loss
+- Petabyte-scale storage
+
+
+## 📊 Monitoring & Operations
+
+### Health Metrics
+- System performance
+- Resource utilization
+- Error rates
+- Latency tracking
+
+### Scaling Operations
+- Auto-scaling rules
+- Shard management
+- Load balancing
+- Failover systems
+
+## 🔒 Security
+
+### Authentication & Authorization
+- Multi-factor auth
+- Role-based access
+- Rate limiting
+- End-to-end encryption
+
+### Data Protection
+- Tenant isolation
+- Encryption at rest
+- Secure communications
+- Audit logging
+
+### Global Infrastructure
+- Edge presence
+- Regional optimization
+- Content delivery
+- Traffic management
+
+### Disaster Recovery
+- Automated backups
+- Multi-region failover
+- Data replication
+- System redundancy
+
+## 🤝 Contributing
+
+1. Fork repository
+2. Create feature branch
+3. Implement changes
+4. Add tests
+5. Submit PR
+
diff --git a/gen/schemas/capabilities.json b/gen/schemas/capabilities.json
index b0a2a06c..9e26dfee 100644
--- a/gen/schemas/capabilities.json
+++ b/gen/schemas/capabilities.json
@@ -1 +1 @@
-{"default":{"identifier":"default","description":"enables the default permissions","local":true,"windows":["main"],"permissions":["core:default"]}}
\ No newline at end of file
+{}
\ No newline at end of file
diff --git a/public/fonts/SpaceGrotesk-Bold.ttf b/public/fonts/SpaceGrotesk-Bold.ttf
new file mode 100644
index 00000000..0408641c
Binary files /dev/null and b/public/fonts/SpaceGrotesk-Bold.ttf differ
diff --git a/public/fonts/SpaceGrotesk-Light.ttf b/public/fonts/SpaceGrotesk-Light.ttf
new file mode 100644
index 00000000..d41bcccd
Binary files /dev/null and b/public/fonts/SpaceGrotesk-Light.ttf differ
diff --git a/public/fonts/SpaceGrotesk-Medium.ttf b/public/fonts/SpaceGrotesk-Medium.ttf
new file mode 100644
index 00000000..7d44b663
Binary files /dev/null and b/public/fonts/SpaceGrotesk-Medium.ttf differ
diff --git a/public/fonts/SpaceGrotesk-Regular.ttf b/public/fonts/SpaceGrotesk-Regular.ttf
new file mode 100644
index 00000000..981bcf5b
Binary files /dev/null and b/public/fonts/SpaceGrotesk-Regular.ttf differ
diff --git a/public/fonts/SpaceGrotesk-SemiBold.ttf b/public/fonts/SpaceGrotesk-SemiBold.ttf
new file mode 100644
index 00000000..e7e02e51
Binary files /dev/null and b/public/fonts/SpaceGrotesk-SemiBold.ttf differ
diff --git a/public/fonts/SpaceMono-Regular.ttf b/public/fonts/SpaceMono-Regular.ttf
new file mode 100755
index 00000000..28d7ff71
Binary files /dev/null and b/public/fonts/SpaceMono-Regular.ttf differ
diff --git a/public/images/adaptive-icon.png b/public/images/adaptive-icon.png
new file mode 100644
index 00000000..03d6f6b6
Binary files /dev/null and b/public/images/adaptive-icon.png differ
diff --git a/public/images/background-image.png b/public/images/background-image.png
new file mode 100644
index 00000000..1832d7ea
Binary files /dev/null and b/public/images/background-image.png differ
diff --git a/public/images/badge.png b/public/images/badge.png
new file mode 100644
index 00000000..f850cbbd
Binary files /dev/null and b/public/images/badge.png differ
diff --git a/public/images/bg.jpeg b/public/images/bg.jpeg
new file mode 100644
index 00000000..e76acb98
Binary files /dev/null and b/public/images/bg.jpeg differ
diff --git a/public/images/emoji1.png b/public/images/emoji1.png
new file mode 100644
index 00000000..6edf4b0e
Binary files /dev/null and b/public/images/emoji1.png differ
diff --git a/public/images/emoji2.png b/public/images/emoji2.png
new file mode 100644
index 00000000..f34022e6
Binary files /dev/null and b/public/images/emoji2.png differ
diff --git a/public/images/emoji3.png b/public/images/emoji3.png
new file mode 100644
index 00000000..e588b032
Binary files /dev/null and b/public/images/emoji3.png differ
diff --git a/public/images/emoji4.png b/public/images/emoji4.png
new file mode 100644
index 00000000..148cc6dd
Binary files /dev/null and b/public/images/emoji4.png differ
diff --git a/public/images/emoji5.png b/public/images/emoji5.png
new file mode 100644
index 00000000..44152741
Binary files /dev/null and b/public/images/emoji5.png differ
diff --git a/public/images/emoji6.png b/public/images/emoji6.png
new file mode 100644
index 00000000..71b149a9
Binary files /dev/null and b/public/images/emoji6.png differ
diff --git a/public/images/favicon.png b/public/images/favicon.png
new file mode 100644
index 00000000..e75f697b
Binary files /dev/null and b/public/images/favicon.png differ
diff --git a/public/images/form 2 bg detail.png b/public/images/form 2 bg detail.png
new file mode 100644
index 00000000..ee28da68
Binary files /dev/null and b/public/images/form 2 bg detail.png differ
diff --git a/public/images/form-1-bg-detail.png b/public/images/form-1-bg-detail.png
new file mode 100644
index 00000000..65897df0
Binary files /dev/null and b/public/images/form-1-bg-detail.png differ
diff --git a/public/images/generalbots-192x192.png b/public/images/generalbots-192x192.png
new file mode 100644
index 00000000..651fe52e
Binary files /dev/null and b/public/images/generalbots-192x192.png differ
diff --git a/public/images/icon.png b/public/images/icon.png
new file mode 100644
index 00000000..a0b1526f
Binary files /dev/null and b/public/images/icon.png differ
diff --git a/public/images/instagram-icon.png b/public/images/instagram-icon.png
new file mode 100644
index 00000000..b4314a7a
Binary files /dev/null and b/public/images/instagram-icon.png differ
diff --git a/public/images/instagram-icon.svg b/public/images/instagram-icon.svg
new file mode 100644
index 00000000..d5b396d4
--- /dev/null
+++ b/public/images/instagram-icon.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/public/images/logo-header-big.png b/public/images/logo-header-big.png
new file mode 100644
index 00000000..f6eb2e9d
Binary files /dev/null and b/public/images/logo-header-big.png differ
diff --git a/public/images/logo-header.png b/public/images/logo-header.png
new file mode 100644
index 00000000..8d718e76
Binary files /dev/null and b/public/images/logo-header.png differ
diff --git a/public/images/logo-icon.png b/public/images/logo-icon.png
new file mode 100644
index 00000000..58aa764d
Binary files /dev/null and b/public/images/logo-icon.png differ
diff --git a/public/images/mercury.png b/public/images/mercury.png
new file mode 100644
index 00000000..36e47eaa
Binary files /dev/null and b/public/images/mercury.png differ
diff --git a/public/images/splash.png b/public/images/splash.png
new file mode 100644
index 00000000..0e89705a
Binary files /dev/null and b/public/images/splash.png differ
diff --git a/public/output.css b/public/output.css
new file mode 100644
index 00000000..ef3ff7a2
--- /dev/null
+++ b/public/output.css
@@ -0,0 +1,4751 @@
+/*
+! tailwindcss v3.3.0 | MIT License | https://tailwindcss.com
+*/
+
+/*
+1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
+2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
+*/
+
+*,
+::before,
+::after {
+ box-sizing: border-box;
+ /* 1 */
+ border-width: 0;
+ /* 2 */
+ border-style: solid;
+ /* 2 */
+ border-color: #e5e7eb;
+ /* 2 */
+}
+
+::before,
+::after {
+ --tw-content: '';
+}
+
+/*
+1. Use a consistent sensible line-height in all browsers.
+2. Prevent adjustments of font size after orientation changes in iOS.
+3. Use a more readable tab size.
+4. Use the user's configured `sans` font-family by default.
+5. Use the user's configured `sans` font-feature-settings by default.
+6. Use the user's configured `sans` font-variation-settings by default.
+*/
+
+html {
+ line-height: 1.5;
+ /* 1 */
+ -webkit-text-size-adjust: 100%;
+ /* 2 */
+ -moz-tab-size: 4;
+ /* 3 */
+ -o-tab-size: 4;
+ tab-size: 4;
+ /* 3 */
+ font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ /* 4 */
+ font-feature-settings: normal;
+ /* 5 */
+ font-variation-settings: normal;
+ /* 6 */
+}
+
+/*
+1. Remove the margin in all browsers.
+2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.
+*/
+
+body {
+ margin: 0;
+ /* 1 */
+ line-height: inherit;
+ /* 2 */
+}
+
+/*
+1. Add the correct height in Firefox.
+2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
+3. Ensure horizontal rules are visible by default.
+*/
+
+hr {
+ height: 0;
+ /* 1 */
+ color: inherit;
+ /* 2 */
+ border-top-width: 1px;
+ /* 3 */
+}
+
+/*
+Add the correct text decoration in Chrome, Edge, and Safari.
+*/
+
+abbr:where([title]) {
+ -webkit-text-decoration: underline dotted;
+ text-decoration: underline dotted;
+}
+
+/*
+Remove the default font size and weight for headings.
+*/
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ font-size: inherit;
+ font-weight: inherit;
+}
+
+/*
+Reset links to optimize for opt-in styling instead of opt-out.
+*/
+
+a {
+ color: inherit;
+ text-decoration: inherit;
+}
+
+/*
+Add the correct font weight in Edge and Safari.
+*/
+
+b,
+strong {
+ font-weight: bolder;
+}
+
+/*
+1. Use the user's configured `mono` font family by default.
+2. Correct the odd `em` font sizing in all browsers.
+*/
+
+code,
+kbd,
+samp,
+pre {
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+ /* 1 */
+ font-size: 1em;
+ /* 2 */
+}
+
+/*
+Add the correct font size in all browsers.
+*/
+
+small {
+ font-size: 80%;
+}
+
+/*
+Prevent `sub` and `sup` elements from affecting the line height in all browsers.
+*/
+
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+sup {
+ top: -0.5em;
+}
+
+/*
+1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
+2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
+3. Remove gaps between table borders by default.
+*/
+
+table {
+ text-indent: 0;
+ /* 1 */
+ border-color: inherit;
+ /* 2 */
+ border-collapse: collapse;
+ /* 3 */
+}
+
+/*
+1. Change the font styles in all browsers.
+2. Remove the margin in Firefox and Safari.
+3. Remove default padding in all browsers.
+*/
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ font-family: inherit;
+ /* 1 */
+ font-size: 100%;
+ /* 1 */
+ font-weight: inherit;
+ /* 1 */
+ line-height: inherit;
+ /* 1 */
+ color: inherit;
+ /* 1 */
+ margin: 0;
+ /* 2 */
+ padding: 0;
+ /* 3 */
+}
+
+/*
+Remove the inheritance of text transform in Edge and Firefox.
+*/
+
+button,
+select {
+ text-transform: none;
+}
+
+/*
+1. Correct the inability to style clickable types in iOS and Safari.
+2. Remove default button styles.
+*/
+
+button,
+[type='button'],
+[type='reset'],
+[type='submit'] {
+ -webkit-appearance: button;
+ /* 1 */
+ background-color: transparent;
+ /* 2 */
+ background-image: none;
+ /* 2 */
+}
+
+/*
+Use the modern Firefox focus style for all focusable elements.
+*/
+
+:-moz-focusring {
+ outline: auto;
+}
+
+/*
+Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
+*/
+
+:-moz-ui-invalid {
+ box-shadow: none;
+}
+
+/*
+Add the correct vertical alignment in Chrome and Firefox.
+*/
+
+progress {
+ vertical-align: baseline;
+}
+
+/*
+Correct the cursor style of increment and decrement buttons in Safari.
+*/
+
+::-webkit-inner-spin-button,
+::-webkit-outer-spin-button {
+ height: auto;
+}
+
+/*
+1. Correct the odd appearance in Chrome and Safari.
+2. Correct the outline style in Safari.
+*/
+
+[type='search'] {
+ -webkit-appearance: textfield;
+ /* 1 */
+ outline-offset: -2px;
+ /* 2 */
+}
+
+/*
+Remove the inner padding in Chrome and Safari on macOS.
+*/
+
+::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+/*
+1. Correct the inability to style clickable types in iOS and Safari.
+2. Change font properties to `inherit` in Safari.
+*/
+
+::-webkit-file-upload-button {
+ -webkit-appearance: button;
+ /* 1 */
+ font: inherit;
+ /* 2 */
+}
+
+/*
+Add the correct display in Chrome and Safari.
+*/
+
+summary {
+ display: list-item;
+}
+
+/*
+Removes the default spacing and border for appropriate elements.
+*/
+
+blockquote,
+dl,
+dd,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+hr,
+figure,
+p,
+pre {
+ margin: 0;
+}
+
+fieldset {
+ margin: 0;
+ padding: 0;
+}
+
+legend {
+ padding: 0;
+}
+
+ol,
+ul,
+menu {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+/*
+Prevent resizing textareas horizontally by default.
+*/
+
+textarea {
+ resize: vertical;
+}
+
+/*
+1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
+2. Set the default placeholder color to the user's configured gray 400 color.
+*/
+
+input::-moz-placeholder, textarea::-moz-placeholder {
+ opacity: 1;
+ /* 1 */
+ color: #9ca3af;
+ /* 2 */
+}
+
+input::placeholder,
+textarea::placeholder {
+ opacity: 1;
+ /* 1 */
+ color: #9ca3af;
+ /* 2 */
+}
+
+/*
+Set the default cursor for buttons.
+*/
+
+button,
+[role="button"] {
+ cursor: pointer;
+}
+
+/*
+Make sure disabled buttons don't get the pointer cursor.
+*/
+
+:disabled {
+ cursor: default;
+}
+
+/*
+1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)
+2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
+ This can trigger a poorly considered lint error in some tools but is included by design.
+*/
+
+img,
+svg,
+video,
+canvas,
+audio,
+iframe,
+embed,
+object {
+ display: block;
+ /* 1 */
+ vertical-align: middle;
+ /* 2 */
+}
+
+/*
+Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
+*/
+
+img,
+video {
+ max-width: 100%;
+ height: auto;
+}
+
+/* Make elements with the HTML hidden attribute stay hidden by default */
+
+[hidden] {
+ display: none;
+}
+
+:root {
+ --background: 0 0% 100%;
+ --foreground: 0 0% 3.9%;
+ --card: 0 0% 100%;
+ --card-foreground: 0 0% 3.9%;
+ --popover: 0 0% 100%;
+ --popover-foreground: 0 0% 3.9%;
+ --primary: 0 0% 9%;
+ --primary-foreground: 0 0% 98%;
+ --secondary: 0 0% 96.1%;
+ --secondary-foreground: 0 0% 9%;
+ --muted: 0 0% 96.1%;
+ --muted-foreground: 0 0% 45.1%;
+ --accent: 0 0% 96.1%;
+ --accent-foreground: 0 0% 9%;
+ --destructive: 0 84.2% 60.2%;
+ --destructive-foreground: 0 0% 98%;
+ --border: 0 0% 89.8%;
+ --input: 0 0% 89.8%;
+ --ring: 0 0% 3.9%;
+ --chart-1: 12 76% 61%;
+ --chart-2: 173 58% 39%;
+ --chart-3: 197 37% 24%;
+ --chart-4: 43 74% 66%;
+ --chart-5: 27 87% 67%;
+ --radius: 0.5rem
+ ;
+ --sidebar-background: 0 0% 98%;
+ --sidebar-foreground: 240 5.3% 26.1%;
+ --sidebar-primary: 240 5.9% 10%;
+ --sidebar-primary-foreground: 0 0% 98%;
+ --sidebar-accent: 240 4.8% 95.9%;
+ --sidebar-accent-foreground: 240 5.9% 10%;
+ --sidebar-border: 220 13% 91%;
+ --sidebar-ring: 217.2 91.2% 59.8%
+}
+
+.dark {
+ --background: 0 0% 3.9%;
+ --foreground: 0 0% 98%;
+ --card: 0 0% 3.9%;
+ --card-foreground: 0 0% 98%;
+ --popover: 0 0% 3.9%;
+ --popover-foreground: 0 0% 98%;
+ --primary: 0 0% 98%;
+ --primary-foreground: 0 0% 9%;
+ --secondary: 0 0% 14.9%;
+ --secondary-foreground: 0 0% 98%;
+ --muted: 0 0% 14.9%;
+ --muted-foreground: 0 0% 63.9%;
+ --accent: 0 0% 14.9%;
+ --accent-foreground: 0 0% 98%;
+ --destructive: 0 62.8% 30.6%;
+ --destructive-foreground: 0 0% 98%;
+ --border: 0 0% 14.9%;
+ --input: 0 0% 14.9%;
+ --ring: 0 0% 83.1%;
+ --chart-1: 220 70% 50%;
+ --chart-2: 160 60% 45%;
+ --chart-3: 30 80% 55%;
+ --chart-4: 280 65% 60%;
+ --chart-5: 340 75% 55%
+ ;
+ --sidebar-background: 240 5.9% 10%;
+ --sidebar-foreground: 240 4.8% 95.9%;
+ --sidebar-primary: 224.3 76.3% 48%;
+ --sidebar-primary-foreground: 0 0% 100%;
+ --sidebar-accent: 240 3.7% 15.9%;
+ --sidebar-accent-foreground: 240 4.8% 95.9%;
+ --sidebar-border: 240 3.7% 15.9%;
+ --sidebar-ring: 217.2 91.2% 59.8%
+}
+
+* {
+ border-color: hsl(var(--border));
+}
+
+body {
+ background-color: hsl(var(--background));
+ color: hsl(var(--foreground));
+}
+
+*, ::before, ::after {
+ --tw-border-spacing-x: 0;
+ --tw-border-spacing-y: 0;
+ --tw-translate-x: 0;
+ --tw-translate-y: 0;
+ --tw-rotate: 0;
+ --tw-skew-x: 0;
+ --tw-skew-y: 0;
+ --tw-scale-x: 1;
+ --tw-scale-y: 1;
+ --tw-pan-x: ;
+ --tw-pan-y: ;
+ --tw-pinch-zoom: ;
+ --tw-scroll-snap-strictness: proximity;
+ --tw-ordinal: ;
+ --tw-slashed-zero: ;
+ --tw-numeric-figure: ;
+ --tw-numeric-spacing: ;
+ --tw-numeric-fraction: ;
+ --tw-ring-inset: ;
+ --tw-ring-offset-width: 0px;
+ --tw-ring-offset-color: #fff;
+ --tw-ring-color: rgb(59 130 246 / 0.5);
+ --tw-ring-offset-shadow: 0 0 #0000;
+ --tw-ring-shadow: 0 0 #0000;
+ --tw-shadow: 0 0 #0000;
+ --tw-shadow-colored: 0 0 #0000;
+ --tw-blur: ;
+ --tw-brightness: ;
+ --tw-contrast: ;
+ --tw-grayscale: ;
+ --tw-hue-rotate: ;
+ --tw-invert: ;
+ --tw-saturate: ;
+ --tw-sepia: ;
+ --tw-drop-shadow: ;
+ --tw-backdrop-blur: ;
+ --tw-backdrop-brightness: ;
+ --tw-backdrop-contrast: ;
+ --tw-backdrop-grayscale: ;
+ --tw-backdrop-hue-rotate: ;
+ --tw-backdrop-invert: ;
+ --tw-backdrop-opacity: ;
+ --tw-backdrop-saturate: ;
+ --tw-backdrop-sepia: ;
+}
+
+::backdrop {
+ --tw-border-spacing-x: 0;
+ --tw-border-spacing-y: 0;
+ --tw-translate-x: 0;
+ --tw-translate-y: 0;
+ --tw-rotate: 0;
+ --tw-skew-x: 0;
+ --tw-skew-y: 0;
+ --tw-scale-x: 1;
+ --tw-scale-y: 1;
+ --tw-pan-x: ;
+ --tw-pan-y: ;
+ --tw-pinch-zoom: ;
+ --tw-scroll-snap-strictness: proximity;
+ --tw-ordinal: ;
+ --tw-slashed-zero: ;
+ --tw-numeric-figure: ;
+ --tw-numeric-spacing: ;
+ --tw-numeric-fraction: ;
+ --tw-ring-inset: ;
+ --tw-ring-offset-width: 0px;
+ --tw-ring-offset-color: #fff;
+ --tw-ring-color: rgb(59 130 246 / 0.5);
+ --tw-ring-offset-shadow: 0 0 #0000;
+ --tw-ring-shadow: 0 0 #0000;
+ --tw-shadow: 0 0 #0000;
+ --tw-shadow-colored: 0 0 #0000;
+ --tw-blur: ;
+ --tw-brightness: ;
+ --tw-contrast: ;
+ --tw-grayscale: ;
+ --tw-hue-rotate: ;
+ --tw-invert: ;
+ --tw-saturate: ;
+ --tw-sepia: ;
+ --tw-drop-shadow: ;
+ --tw-backdrop-blur: ;
+ --tw-backdrop-brightness: ;
+ --tw-backdrop-contrast: ;
+ --tw-backdrop-grayscale: ;
+ --tw-backdrop-hue-rotate: ;
+ --tw-backdrop-invert: ;
+ --tw-backdrop-opacity: ;
+ --tw-backdrop-saturate: ;
+ --tw-backdrop-sepia: ;
+}
+
+.container {
+ width: 100%;
+}
+
+@media (min-width: 640px) {
+ .container {
+ max-width: 640px;
+ }
+}
+
+@media (min-width: 768px) {
+ .container {
+ max-width: 768px;
+ }
+}
+
+@media (min-width: 1024px) {
+ .container {
+ max-width: 1024px;
+ }
+}
+
+@media (min-width: 1280px) {
+ .container {
+ max-width: 1280px;
+ }
+}
+
+@media (min-width: 1536px) {
+ .container {
+ max-width: 1536px;
+ }
+}
+
+.sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ white-space: nowrap;
+ border-width: 0;
+}
+
+.pointer-events-none {
+ pointer-events: none;
+}
+
+.pointer-events-auto {
+ pointer-events: auto;
+}
+
+.visible {
+ visibility: visible;
+}
+
+.invisible {
+ visibility: hidden;
+}
+
+.static {
+ position: static;
+}
+
+.fixed {
+ position: fixed;
+}
+
+.absolute {
+ position: absolute;
+}
+
+.relative {
+ position: relative;
+}
+
+.inset-0 {
+ inset: 0px;
+}
+
+.inset-x-0 {
+ left: 0px;
+ right: 0px;
+}
+
+.inset-y-0 {
+ top: 0px;
+ bottom: 0px;
+}
+
+.-bottom-12 {
+ bottom: -3rem;
+}
+
+.-left-12 {
+ left: -3rem;
+}
+
+.-right-1 {
+ right: -0.25rem;
+}
+
+.-right-12 {
+ right: -3rem;
+}
+
+.-top-1 {
+ top: -0.25rem;
+}
+
+.-top-12 {
+ top: -3rem;
+}
+
+.bottom-0 {
+ bottom: 0px;
+}
+
+.bottom-3 {
+ bottom: 0.75rem;
+}
+
+.left-0 {
+ left: 0px;
+}
+
+.left-1 {
+ left: 0.25rem;
+}
+
+.left-1\/2 {
+ left: 50%;
+}
+
+.left-2 {
+ left: 0.5rem;
+}
+
+.left-3 {
+ left: 0.75rem;
+}
+
+.left-\[50\%\] {
+ left: 50%;
+}
+
+.right-0 {
+ right: 0px;
+}
+
+.right-1 {
+ right: 0.25rem;
+}
+
+.right-2 {
+ right: 0.5rem;
+}
+
+.right-3 {
+ right: 0.75rem;
+}
+
+.right-4 {
+ right: 1rem;
+}
+
+.right-6 {
+ right: 1.5rem;
+}
+
+.top-0 {
+ top: 0px;
+}
+
+.top-1 {
+ top: 0.25rem;
+}
+
+.top-1\.5 {
+ top: 0.375rem;
+}
+
+.top-1\/2 {
+ top: 50%;
+}
+
+.top-2 {
+ top: 0.5rem;
+}
+
+.top-2\.5 {
+ top: 0.625rem;
+}
+
+.top-3 {
+ top: 0.75rem;
+}
+
+.top-3\.5 {
+ top: 0.875rem;
+}
+
+.top-4 {
+ top: 1rem;
+}
+
+.top-\[1px\] {
+ top: 1px;
+}
+
+.top-\[50\%\] {
+ top: 50%;
+}
+
+.top-\[60\%\] {
+ top: 60%;
+}
+
+.top-full {
+ top: 100%;
+}
+
+.z-10 {
+ z-index: 10;
+}
+
+.z-20 {
+ z-index: 20;
+}
+
+.z-50 {
+ z-index: 50;
+}
+
+.z-\[100\] {
+ z-index: 100;
+}
+
+.z-\[1\] {
+ z-index: 1;
+}
+
+.m-0 {
+ margin: 0px;
+}
+
+.-mx-1 {
+ margin-left: -0.25rem;
+ margin-right: -0.25rem;
+}
+
+.mx-1 {
+ margin-left: 0.25rem;
+ margin-right: 0.25rem;
+}
+
+.mx-2 {
+ margin-left: 0.5rem;
+ margin-right: 0.5rem;
+}
+
+.mx-3 {
+ margin-left: 0.75rem;
+ margin-right: 0.75rem;
+}
+
+.mx-3\.5 {
+ margin-left: 0.875rem;
+ margin-right: 0.875rem;
+}
+
+.mx-4 {
+ margin-left: 1rem;
+ margin-right: 1rem;
+}
+
+.mx-auto {
+ margin-left: auto;
+ margin-right: auto;
+}
+
+.my-0 {
+ margin-top: 0px;
+ margin-bottom: 0px;
+}
+
+.my-0\.5 {
+ margin-top: 0.125rem;
+ margin-bottom: 0.125rem;
+}
+
+.my-1 {
+ margin-top: 0.25rem;
+ margin-bottom: 0.25rem;
+}
+
+.my-4 {
+ margin-top: 1rem;
+ margin-bottom: 1rem;
+}
+
+.my-6 {
+ margin-top: 1.5rem;
+ margin-bottom: 1.5rem;
+}
+
+.my-8 {
+ margin-top: 2rem;
+ margin-bottom: 2rem;
+}
+
+.-ml-4 {
+ margin-left: -1rem;
+}
+
+.-mt-4 {
+ margin-top: -1rem;
+}
+
+.mb-1 {
+ margin-bottom: 0.25rem;
+}
+
+.mb-1\.5 {
+ margin-bottom: 0.375rem;
+}
+
+.mb-2 {
+ margin-bottom: 0.5rem;
+}
+
+.mb-3 {
+ margin-bottom: 0.75rem;
+}
+
+.mb-4 {
+ margin-bottom: 1rem;
+}
+
+.mb-6 {
+ margin-bottom: 1.5rem;
+}
+
+.ml-1 {
+ margin-left: 0.25rem;
+}
+
+.ml-2 {
+ margin-left: 0.5rem;
+}
+
+.ml-4 {
+ margin-left: 1rem;
+}
+
+.ml-auto {
+ margin-left: auto;
+}
+
+.mr-1 {
+ margin-right: 0.25rem;
+}
+
+.mr-2 {
+ margin-right: 0.5rem;
+}
+
+.mt-0 {
+ margin-top: 0px;
+}
+
+.mt-0\.5 {
+ margin-top: 0.125rem;
+}
+
+.mt-1 {
+ margin-top: 0.25rem;
+}
+
+.mt-1\.5 {
+ margin-top: 0.375rem;
+}
+
+.mt-2 {
+ margin-top: 0.5rem;
+}
+
+.mt-24 {
+ margin-top: 6rem;
+}
+
+.mt-3 {
+ margin-top: 0.75rem;
+}
+
+.mt-4 {
+ margin-top: 1rem;
+}
+
+.mt-8 {
+ margin-top: 2rem;
+}
+
+.mt-auto {
+ margin-top: auto;
+}
+
+.line-clamp-1 {
+ overflow: hidden;
+ display: -webkit-box;
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: 1;
+}
+
+.line-clamp-2 {
+ overflow: hidden;
+ display: -webkit-box;
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: 2;
+}
+
+.block {
+ display: block;
+}
+
+.inline-block {
+ display: inline-block;
+}
+
+.flex {
+ display: flex;
+}
+
+.inline-flex {
+ display: inline-flex;
+}
+
+.table {
+ display: table;
+}
+
+.grid {
+ display: grid;
+}
+
+.hidden {
+ display: none;
+}
+
+.aspect-square {
+ aspect-ratio: 1 / 1;
+}
+
+.aspect-video {
+ aspect-ratio: 16 / 9;
+}
+
+.h-1 {
+ height: 0.25rem;
+}
+
+.h-1\.5 {
+ height: 0.375rem;
+}
+
+.h-1\/3 {
+ height: 33.333333%;
+}
+
+.h-10 {
+ height: 2.5rem;
+}
+
+.h-12 {
+ height: 3rem;
+}
+
+.h-2 {
+ height: 0.5rem;
+}
+
+.h-2\.5 {
+ height: 0.625rem;
+}
+
+.h-20 {
+ height: 5rem;
+}
+
+.h-24 {
+ height: 6rem;
+}
+
+.h-3 {
+ height: 0.75rem;
+}
+
+.h-3\.5 {
+ height: 0.875rem;
+}
+
+.h-4 {
+ height: 1rem;
+}
+
+.h-40 {
+ height: 10rem;
+}
+
+.h-48 {
+ height: 12rem;
+}
+
+.h-5 {
+ height: 1.25rem;
+}
+
+.h-6 {
+ height: 1.5rem;
+}
+
+.h-7 {
+ height: 1.75rem;
+}
+
+.h-8 {
+ height: 2rem;
+}
+
+.h-80 {
+ height: 20rem;
+}
+
+.h-9 {
+ height: 2.25rem;
+}
+
+.h-\[1px\] {
+ height: 1px;
+}
+
+.h-\[470px\] {
+ height: 470px;
+}
+
+.h-\[52px\] {
+ height: 52px;
+}
+
+.h-\[calc\(100vh-40px\)\] {
+ height: calc(100vh - 40px);
+}
+
+.h-\[calc\(100vh-50px\)\] {
+ height: calc(100vh - 50px);
+}
+
+.h-\[var\(--radix-navigation-menu-viewport-height\)\] {
+ height: var(--radix-navigation-menu-viewport-height);
+}
+
+.h-\[var\(--radix-select-trigger-height\)\] {
+ height: var(--radix-select-trigger-height);
+}
+
+.h-auto {
+ height: auto;
+}
+
+.h-full {
+ height: 100%;
+}
+
+.h-px {
+ height: 1px;
+}
+
+.h-screen {
+ height: 100vh;
+}
+
+.max-h-\[--radix-context-menu-content-available-height\] {
+ max-height: var(--radix-context-menu-content-available-height);
+}
+
+.max-h-\[--radix-select-content-available-height\] {
+ max-height: var(--radix-select-content-available-height);
+}
+
+.max-h-\[300px\] {
+ max-height: 300px;
+}
+
+.max-h-\[800px\] {
+ max-height: 800px;
+}
+
+.max-h-\[calc\(100vh-200px\)\] {
+ max-height: calc(100vh - 200px);
+}
+
+.max-h-\[var\(--radix-dropdown-menu-content-available-height\)\] {
+ max-height: var(--radix-dropdown-menu-content-available-height);
+}
+
+.max-h-screen {
+ max-height: 100vh;
+}
+
+.min-h-0 {
+ min-height: 0px;
+}
+
+.min-h-\[100px\] {
+ min-height: 100px;
+}
+
+.min-h-\[200px\] {
+ min-height: 200px;
+}
+
+.min-h-\[60px\] {
+ min-height: 60px;
+}
+
+.min-h-\[calc\(100vh-12rem\)\] {
+ min-height: calc(100vh - 12rem);
+}
+
+.min-h-\[calc\(100vh-43px\)\] {
+ min-height: calc(100vh - 43px);
+}
+
+.min-h-\[calc\(100vh-8rem\)\] {
+ min-height: calc(100vh - 8rem);
+}
+
+.min-h-screen {
+ min-height: 100vh;
+}
+
+.w-0 {
+ width: 0px;
+}
+
+.w-1 {
+ width: 0.25rem;
+}
+
+.w-10 {
+ width: 2.5rem;
+}
+
+.w-12 {
+ width: 3rem;
+}
+
+.w-2 {
+ width: 0.5rem;
+}
+
+.w-2\.5 {
+ width: 0.625rem;
+}
+
+.w-20 {
+ width: 5rem;
+}
+
+.w-24 {
+ width: 6rem;
+}
+
+.w-3 {
+ width: 0.75rem;
+}
+
+.w-3\.5 {
+ width: 0.875rem;
+}
+
+.w-3\/4 {
+ width: 75%;
+}
+
+.w-4 {
+ width: 1rem;
+}
+
+.w-5 {
+ width: 1.25rem;
+}
+
+.w-56 {
+ width: 14rem;
+}
+
+.w-6 {
+ width: 1.5rem;
+}
+
+.w-64 {
+ width: 16rem;
+}
+
+.w-7 {
+ width: 1.75rem;
+}
+
+.w-72 {
+ width: 18rem;
+}
+
+.w-8 {
+ width: 2rem;
+}
+
+.w-80 {
+ width: 20rem;
+}
+
+.w-9 {
+ width: 2.25rem;
+}
+
+.w-\[--sidebar-width\] {
+ width: var(--sidebar-width);
+}
+
+.w-\[100px\] {
+ width: 100px;
+}
+
+.w-\[140px\] {
+ width: 140px;
+}
+
+.w-\[1px\] {
+ width: 1px;
+}
+
+.w-\[200px\] {
+ width: 200px;
+}
+
+.w-\[280px\] {
+ width: 280px;
+}
+
+.w-\[40\%\] {
+ width: 40%;
+}
+
+.w-\[535px\] {
+ width: 535px;
+}
+
+.w-\[60\%\] {
+ width: 60%;
+}
+
+.w-auto {
+ width: auto;
+}
+
+.w-full {
+ width: 100%;
+}
+
+.w-max {
+ width: -moz-max-content;
+ width: max-content;
+}
+
+.w-px {
+ width: 1px;
+}
+
+.min-w-0 {
+ min-width: 0px;
+}
+
+.min-w-\[12rem\] {
+ min-width: 12rem;
+}
+
+.min-w-\[250px\] {
+ min-width: 250px;
+}
+
+.min-w-\[50px\] {
+ min-width: 50px;
+}
+
+.min-w-\[8rem\] {
+ min-width: 8rem;
+}
+
+.min-w-\[var\(--radix-select-trigger-width\)\] {
+ min-width: var(--radix-select-trigger-width);
+}
+
+.min-w-fit {
+ min-width: -moz-fit-content;
+ min-width: fit-content;
+}
+
+.min-w-max {
+ min-width: -moz-max-content;
+ min-width: max-content;
+}
+
+.max-w-4xl {
+ max-width: 56rem;
+}
+
+.max-w-\[--skeleton-width\] {
+ max-width: var(--skeleton-width);
+}
+
+.max-w-\[85\%\] {
+ max-width: 85%;
+}
+
+.max-w-full {
+ max-width: 100%;
+}
+
+.max-w-lg {
+ max-width: 32rem;
+}
+
+.max-w-max {
+ max-width: -moz-max-content;
+ max-width: max-content;
+}
+
+.max-w-md {
+ max-width: 28rem;
+}
+
+.max-w-none {
+ max-width: none;
+}
+
+.flex-1 {
+ flex: 1 1 0%;
+}
+
+.flex-shrink-0 {
+ flex-shrink: 0;
+}
+
+.shrink-0 {
+ flex-shrink: 0;
+}
+
+.flex-grow {
+ flex-grow: 1;
+}
+
+.grow {
+ flex-grow: 1;
+}
+
+.grow-0 {
+ flex-grow: 0;
+}
+
+.basis-full {
+ flex-basis: 100%;
+}
+
+.caption-bottom {
+ caption-side: bottom;
+}
+
+.border-collapse {
+ border-collapse: collapse;
+}
+
+.origin-\[--radix-context-menu-content-transform-origin\] {
+ transform-origin: var(--radix-context-menu-content-transform-origin);
+}
+
+.origin-\[--radix-dropdown-menu-content-transform-origin\] {
+ transform-origin: var(--radix-dropdown-menu-content-transform-origin);
+}
+
+.origin-\[--radix-hover-card-content-transform-origin\] {
+ transform-origin: var(--radix-hover-card-content-transform-origin);
+}
+
+.origin-\[--radix-menubar-content-transform-origin\] {
+ transform-origin: var(--radix-menubar-content-transform-origin);
+}
+
+.origin-\[--radix-popover-content-transform-origin\] {
+ transform-origin: var(--radix-popover-content-transform-origin);
+}
+
+.origin-\[--radix-select-content-transform-origin\] {
+ transform-origin: var(--radix-select-content-transform-origin);
+}
+
+.origin-\[--radix-tooltip-content-transform-origin\] {
+ transform-origin: var(--radix-tooltip-content-transform-origin);
+}
+
+.-translate-x-1\/2 {
+ --tw-translate-x: -50%;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.-translate-x-px {
+ --tw-translate-x: -1px;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.-translate-y-1\/2 {
+ --tw-translate-y: -50%;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.translate-x-\[-50\%\] {
+ --tw-translate-x: -50%;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.translate-x-px {
+ --tw-translate-x: 1px;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.translate-y-\[-50\%\] {
+ --tw-translate-y: -50%;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.rotate-45 {
+ --tw-rotate: 45deg;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.rotate-90 {
+ --tw-rotate: 90deg;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.transform {
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+@keyframes bounce {
+ 0%, 100% {
+ transform: translateY(-25%);
+ animation-timing-function: cubic-bezier(0.8,0,1,1);
+ }
+
+ 50% {
+ transform: none;
+ animation-timing-function: cubic-bezier(0,0,0.2,1);
+ }
+}
+
+.animate-bounce {
+ animation: bounce 1s infinite;
+}
+
+@keyframes pulse {
+ 50% {
+ opacity: .5;
+ }
+}
+
+.animate-pulse {
+ animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
+}
+
+.cursor-default {
+ cursor: default;
+}
+
+.cursor-not-allowed {
+ cursor: not-allowed;
+}
+
+.cursor-pointer {
+ cursor: pointer;
+}
+
+.touch-none {
+ touch-action: none;
+}
+
+.select-none {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+}
+
+.resize-none {
+ resize: none;
+}
+
+.resize {
+ resize: both;
+}
+
+.list-none {
+ list-style-type: none;
+}
+
+.appearance-none {
+ -webkit-appearance: none;
+ -moz-appearance: none;
+ appearance: none;
+}
+
+.grid-cols-1 {
+ grid-template-columns: repeat(1, minmax(0, 1fr));
+}
+
+.grid-cols-7 {
+ grid-template-columns: repeat(7, minmax(0, 1fr));
+}
+
+.flex-row {
+ flex-direction: row;
+}
+
+.flex-col {
+ flex-direction: column;
+}
+
+.flex-col-reverse {
+ flex-direction: column-reverse;
+}
+
+.flex-wrap {
+ flex-wrap: wrap;
+}
+
+.items-start {
+ align-items: flex-start;
+}
+
+.items-end {
+ align-items: flex-end;
+}
+
+.items-center {
+ align-items: center;
+}
+
+.items-stretch {
+ align-items: stretch;
+}
+
+.justify-start {
+ justify-content: flex-start;
+}
+
+.justify-end {
+ justify-content: flex-end;
+}
+
+.justify-center {
+ justify-content: center;
+}
+
+.justify-between {
+ justify-content: space-between;
+}
+
+.gap-1 {
+ gap: 0.25rem;
+}
+
+.gap-1\.5 {
+ gap: 0.375rem;
+}
+
+.gap-2 {
+ gap: 0.5rem;
+}
+
+.gap-3 {
+ gap: 0.75rem;
+}
+
+.gap-4 {
+ gap: 1rem;
+}
+
+.gap-6 {
+ gap: 1.5rem;
+}
+
+.space-x-1 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-x-reverse: 0;
+ margin-right: calc(0.25rem * var(--tw-space-x-reverse));
+ margin-left: calc(0.25rem * calc(1 - var(--tw-space-x-reverse)));
+}
+
+.space-x-2 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-x-reverse: 0;
+ margin-right: calc(0.5rem * var(--tw-space-x-reverse));
+ margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse)));
+}
+
+.space-x-3 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-x-reverse: 0;
+ margin-right: calc(0.75rem * var(--tw-space-x-reverse));
+ margin-left: calc(0.75rem * calc(1 - var(--tw-space-x-reverse)));
+}
+
+.space-x-4 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-x-reverse: 0;
+ margin-right: calc(1rem * var(--tw-space-x-reverse));
+ margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse)));
+}
+
+.space-y-1 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-y-reverse: 0;
+ margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse)));
+ margin-bottom: calc(0.25rem * var(--tw-space-y-reverse));
+}
+
+.space-y-1\.5 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-y-reverse: 0;
+ margin-top: calc(0.375rem * calc(1 - var(--tw-space-y-reverse)));
+ margin-bottom: calc(0.375rem * var(--tw-space-y-reverse));
+}
+
+.space-y-2 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-y-reverse: 0;
+ margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse)));
+ margin-bottom: calc(0.5rem * var(--tw-space-y-reverse));
+}
+
+.space-y-3 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-y-reverse: 0;
+ margin-top: calc(0.75rem * calc(1 - var(--tw-space-y-reverse)));
+ margin-bottom: calc(0.75rem * var(--tw-space-y-reverse));
+}
+
+.space-y-4 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-y-reverse: 0;
+ margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse)));
+ margin-bottom: calc(1rem * var(--tw-space-y-reverse));
+}
+
+.space-y-6 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-y-reverse: 0;
+ margin-top: calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));
+ margin-bottom: calc(1.5rem * var(--tw-space-y-reverse));
+}
+
+.overflow-auto {
+ overflow: auto;
+}
+
+.overflow-hidden {
+ overflow: hidden;
+}
+
+.overflow-x-auto {
+ overflow-x: auto;
+}
+
+.overflow-y-auto {
+ overflow-y: auto;
+}
+
+.overflow-x-hidden {
+ overflow-x: hidden;
+}
+
+.truncate {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.whitespace-nowrap {
+ white-space: nowrap;
+}
+
+.whitespace-pre-wrap {
+ white-space: pre-wrap;
+}
+
+.break-words {
+ overflow-wrap: break-word;
+}
+
+.rounded {
+ border-radius: 0.25rem;
+}
+
+.rounded-2xl {
+ border-radius: 1rem;
+}
+
+.rounded-\[2px\] {
+ border-radius: 2px;
+}
+
+.rounded-\[inherit\] {
+ border-radius: inherit;
+}
+
+.rounded-full {
+ border-radius: 9999px;
+}
+
+.rounded-lg {
+ border-radius: var(--radius);
+}
+
+.rounded-md {
+ border-radius: calc(var(--radius) - 2px);
+}
+
+.rounded-none {
+ border-radius: 0px;
+}
+
+.rounded-sm {
+ border-radius: calc(var(--radius) - 4px);
+}
+
+.rounded-xl {
+ border-radius: 0.75rem;
+}
+
+.rounded-r-md {
+ border-top-right-radius: calc(var(--radius) - 2px);
+ border-bottom-right-radius: calc(var(--radius) - 2px);
+}
+
+.rounded-t-\[10px\] {
+ border-top-left-radius: 10px;
+ border-top-right-radius: 10px;
+}
+
+.rounded-tl-sm {
+ border-top-left-radius: calc(var(--radius) - 4px);
+}
+
+.border {
+ border-width: 1px;
+}
+
+.border-0 {
+ border-width: 0px;
+}
+
+.border-2 {
+ border-width: 2px;
+}
+
+.border-\[1\.5px\] {
+ border-width: 1.5px;
+}
+
+.border-y {
+ border-top-width: 1px;
+ border-bottom-width: 1px;
+}
+
+.border-b {
+ border-bottom-width: 1px;
+}
+
+.border-b-2 {
+ border-bottom-width: 2px;
+}
+
+.border-l {
+ border-left-width: 1px;
+}
+
+.border-l-2 {
+ border-left-width: 2px;
+}
+
+.border-l-4 {
+ border-left-width: 4px;
+}
+
+.border-r {
+ border-right-width: 1px;
+}
+
+.border-t {
+ border-top-width: 1px;
+}
+
+.border-dashed {
+ border-style: dashed;
+}
+
+.border-\[--color-border\] {
+ border-color: var(--color-border);
+}
+
+.border-accent {
+ border-color: hsl(var(--accent));
+}
+
+.border-background {
+ border-color: hsl(var(--background));
+}
+
+.border-blue-100 {
+ --tw-border-opacity: 1;
+ border-color: rgb(219 234 254 / var(--tw-border-opacity));
+}
+
+.border-blue-500 {
+ --tw-border-opacity: 1;
+ border-color: rgb(59 130 246 / var(--tw-border-opacity));
+}
+
+.border-border {
+ border-color: hsl(var(--border));
+}
+
+.border-border\/50 {
+ border-color: hsl(var(--border) / 0.5);
+}
+
+.border-current {
+ border-color: currentColor;
+}
+
+.border-destructive {
+ border-color: hsl(var(--destructive));
+}
+
+.border-destructive\/50 {
+ border-color: hsl(var(--destructive) / 0.5);
+}
+
+.border-gray-100 {
+ --tw-border-opacity: 1;
+ border-color: rgb(243 244 246 / var(--tw-border-opacity));
+}
+
+.border-gray-200 {
+ --tw-border-opacity: 1;
+ border-color: rgb(229 231 235 / var(--tw-border-opacity));
+}
+
+.border-gray-300 {
+ --tw-border-opacity: 1;
+ border-color: rgb(209 213 219 / var(--tw-border-opacity));
+}
+
+.border-green-500 {
+ --tw-border-opacity: 1;
+ border-color: rgb(34 197 94 / var(--tw-border-opacity));
+}
+
+.border-green-600 {
+ --tw-border-opacity: 1;
+ border-color: rgb(22 163 74 / var(--tw-border-opacity));
+}
+
+.border-input {
+ border-color: hsl(var(--input));
+}
+
+.border-muted {
+ border-color: hsl(var(--muted));
+}
+
+.border-primary {
+ border-color: hsl(var(--primary));
+}
+
+.border-primary\/50 {
+ border-color: hsl(var(--primary) / 0.5);
+}
+
+.border-purple-500 {
+ --tw-border-opacity: 1;
+ border-color: rgb(168 85 247 / var(--tw-border-opacity));
+}
+
+.border-red-500 {
+ --tw-border-opacity: 1;
+ border-color: rgb(239 68 68 / var(--tw-border-opacity));
+}
+
+.border-red-600 {
+ --tw-border-opacity: 1;
+ border-color: rgb(220 38 38 / var(--tw-border-opacity));
+}
+
+.border-secondary {
+ border-color: hsl(var(--secondary));
+}
+
+.border-sidebar-border {
+ border-color: hsl(var(--sidebar-border));
+}
+
+.border-transparent {
+ border-color: transparent;
+}
+
+.border-yellow-600 {
+ --tw-border-opacity: 1;
+ border-color: rgb(202 138 4 / var(--tw-border-opacity));
+}
+
+.border-l-blue-500 {
+ --tw-border-opacity: 1;
+ border-left-color: rgb(59 130 246 / var(--tw-border-opacity));
+}
+
+.border-l-green-500 {
+ --tw-border-opacity: 1;
+ border-left-color: rgb(34 197 94 / var(--tw-border-opacity));
+}
+
+.border-l-muted {
+ border-left-color: hsl(var(--muted));
+}
+
+.border-l-purple-500 {
+ --tw-border-opacity: 1;
+ border-left-color: rgb(168 85 247 / var(--tw-border-opacity));
+}
+
+.border-l-red-500 {
+ --tw-border-opacity: 1;
+ border-left-color: rgb(239 68 68 / var(--tw-border-opacity));
+}
+
+.border-l-transparent {
+ border-left-color: transparent;
+}
+
+.border-t-transparent {
+ border-top-color: transparent;
+}
+
+.bg-\[--color-bg\] {
+ background-color: var(--color-bg);
+}
+
+.bg-accent {
+ background-color: hsl(var(--accent));
+}
+
+.bg-accent\/50 {
+ background-color: hsl(var(--accent) / 0.5);
+}
+
+.bg-background {
+ background-color: hsl(var(--background));
+}
+
+.bg-background\/95 {
+ background-color: hsl(var(--background) / 0.95);
+}
+
+.bg-black {
+ --tw-bg-opacity: 1;
+ background-color: rgb(0 0 0 / var(--tw-bg-opacity));
+}
+
+.bg-black\/20 {
+ background-color: rgb(0 0 0 / 0.2);
+}
+
+.bg-black\/80 {
+ background-color: rgb(0 0 0 / 0.8);
+}
+
+.bg-blue-100 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(219 234 254 / var(--tw-bg-opacity));
+}
+
+.bg-blue-50 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(239 246 255 / var(--tw-bg-opacity));
+}
+
+.bg-blue-500 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(59 130 246 / var(--tw-bg-opacity));
+}
+
+.bg-blue-500\/20 {
+ background-color: rgb(59 130 246 / 0.2);
+}
+
+.bg-blue-600 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(37 99 235 / var(--tw-bg-opacity));
+}
+
+.bg-border {
+ background-color: hsl(var(--border));
+}
+
+.bg-card {
+ background-color: hsl(var(--card));
+}
+
+.bg-destructive {
+ background-color: hsl(var(--destructive));
+}
+
+.bg-foreground {
+ background-color: hsl(var(--foreground));
+}
+
+.bg-gray-100 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(243 244 246 / var(--tw-bg-opacity));
+}
+
+.bg-gray-200 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(229 231 235 / var(--tw-bg-opacity));
+}
+
+.bg-gray-400 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(156 163 175 / var(--tw-bg-opacity));
+}
+
+.bg-gray-50 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(249 250 251 / var(--tw-bg-opacity));
+}
+
+.bg-gray-500 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(107 114 128 / var(--tw-bg-opacity));
+}
+
+.bg-gray-800 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(31 41 55 / var(--tw-bg-opacity));
+}
+
+.bg-gray-900 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(17 24 39 / var(--tw-bg-opacity));
+}
+
+.bg-green-100 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(220 252 231 / var(--tw-bg-opacity));
+}
+
+.bg-green-400 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(74 222 128 / var(--tw-bg-opacity));
+}
+
+.bg-green-500 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(34 197 94 / var(--tw-bg-opacity));
+}
+
+.bg-green-500\/20 {
+ background-color: rgb(34 197 94 / 0.2);
+}
+
+.bg-input {
+ background-color: hsl(var(--input));
+}
+
+.bg-muted {
+ background-color: hsl(var(--muted));
+}
+
+.bg-muted-foreground {
+ background-color: hsl(var(--muted-foreground));
+}
+
+.bg-muted\/50 {
+ background-color: hsl(var(--muted) / 0.5);
+}
+
+.bg-orange-500 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(249 115 22 / var(--tw-bg-opacity));
+}
+
+.bg-pink-500 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(236 72 153 / var(--tw-bg-opacity));
+}
+
+.bg-popover {
+ background-color: hsl(var(--popover));
+}
+
+.bg-primary {
+ background-color: hsl(var(--primary));
+}
+
+.bg-primary\/10 {
+ background-color: hsl(var(--primary) / 0.1);
+}
+
+.bg-primary\/20 {
+ background-color: hsl(var(--primary) / 0.2);
+}
+
+.bg-purple-500 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(168 85 247 / var(--tw-bg-opacity));
+}
+
+.bg-purple-500\/20 {
+ background-color: rgb(168 85 247 / 0.2);
+}
+
+.bg-red-400 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(248 113 113 / var(--tw-bg-opacity));
+}
+
+.bg-red-500 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(239 68 68 / var(--tw-bg-opacity));
+}
+
+.bg-red-500\/20 {
+ background-color: rgb(239 68 68 / 0.2);
+}
+
+.bg-secondary {
+ background-color: hsl(var(--secondary));
+}
+
+.bg-secondary\/20 {
+ background-color: hsl(var(--secondary) / 0.2);
+}
+
+.bg-secondary\/50 {
+ background-color: hsl(var(--secondary) / 0.5);
+}
+
+.bg-sidebar {
+ background-color: hsl(var(--sidebar-background));
+}
+
+.bg-sidebar-border {
+ background-color: hsl(var(--sidebar-border));
+}
+
+.bg-transparent {
+ background-color: transparent;
+}
+
+.bg-white {
+ --tw-bg-opacity: 1;
+ background-color: rgb(255 255 255 / var(--tw-bg-opacity));
+}
+
+.bg-yellow-100 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(254 249 195 / var(--tw-bg-opacity));
+}
+
+.bg-yellow-400 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(250 204 21 / var(--tw-bg-opacity));
+}
+
+.bg-gradient-to-br {
+ background-image: linear-gradient(to bottom right, var(--tw-gradient-stops));
+}
+
+.from-gray-50 {
+ --tw-gradient-from: #f9fafb var(--tw-gradient-from-position);
+ --tw-gradient-from-position: ;
+ --tw-gradient-to: rgb(249 250 251 / 0) var(--tw-gradient-from-position);
+ --tw-gradient-to-position: ;
+ --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
+}
+
+.from-primary\/10 {
+ --tw-gradient-from: hsl(var(--primary) / 0.1) var(--tw-gradient-from-position);
+ --tw-gradient-from-position: ;
+ --tw-gradient-to: hsl(var(--primary) / 0) var(--tw-gradient-from-position);
+ --tw-gradient-to-position: ;
+ --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
+}
+
+.from-secondary\/50 {
+ --tw-gradient-from: hsl(var(--secondary) / 0.5) var(--tw-gradient-from-position);
+ --tw-gradient-from-position: ;
+ --tw-gradient-to: hsl(var(--secondary) / 0) var(--tw-gradient-from-position);
+ --tw-gradient-to-position: ;
+ --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to);
+}
+
+.to-accent\/10 {
+ --tw-gradient-to: hsl(var(--accent) / 0.1) var(--tw-gradient-to-position);
+ --tw-gradient-to-position: ;
+}
+
+.to-gray-100 {
+ --tw-gradient-to: #f3f4f6 var(--tw-gradient-to-position);
+ --tw-gradient-to-position: ;
+}
+
+.to-muted\/30 {
+ --tw-gradient-to: hsl(var(--muted) / 0.3) var(--tw-gradient-to-position);
+ --tw-gradient-to-position: ;
+}
+
+.fill-current {
+ fill: currentColor;
+}
+
+.fill-primary {
+ fill: hsl(var(--primary));
+}
+
+.object-contain {
+ -o-object-fit: contain;
+ object-fit: contain;
+}
+
+.p-0 {
+ padding: 0px;
+}
+
+.p-1 {
+ padding: 0.25rem;
+}
+
+.p-1\.5 {
+ padding: 0.375rem;
+}
+
+.p-2 {
+ padding: 0.5rem;
+}
+
+.p-2\.5 {
+ padding: 0.625rem;
+}
+
+.p-3 {
+ padding: 0.75rem;
+}
+
+.p-4 {
+ padding: 1rem;
+}
+
+.p-5 {
+ padding: 1.25rem;
+}
+
+.p-6 {
+ padding: 1.5rem;
+}
+
+.p-8 {
+ padding: 2rem;
+}
+
+.p-\[1px\] {
+ padding: 1px;
+}
+
+.px-1 {
+ padding-left: 0.25rem;
+ padding-right: 0.25rem;
+}
+
+.px-1\.5 {
+ padding-left: 0.375rem;
+ padding-right: 0.375rem;
+}
+
+.px-2 {
+ padding-left: 0.5rem;
+ padding-right: 0.5rem;
+}
+
+.px-2\.5 {
+ padding-left: 0.625rem;
+ padding-right: 0.625rem;
+}
+
+.px-3 {
+ padding-left: 0.75rem;
+ padding-right: 0.75rem;
+}
+
+.px-4 {
+ padding-left: 1rem;
+ padding-right: 1rem;
+}
+
+.px-6 {
+ padding-left: 1.5rem;
+ padding-right: 1.5rem;
+}
+
+.px-8 {
+ padding-left: 2rem;
+ padding-right: 2rem;
+}
+
+.py-0 {
+ padding-top: 0px;
+ padding-bottom: 0px;
+}
+
+.py-0\.5 {
+ padding-top: 0.125rem;
+ padding-bottom: 0.125rem;
+}
+
+.py-1 {
+ padding-top: 0.25rem;
+ padding-bottom: 0.25rem;
+}
+
+.py-1\.5 {
+ padding-top: 0.375rem;
+ padding-bottom: 0.375rem;
+}
+
+.py-2 {
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+}
+
+.py-3 {
+ padding-top: 0.75rem;
+ padding-bottom: 0.75rem;
+}
+
+.py-4 {
+ padding-top: 1rem;
+ padding-bottom: 1rem;
+}
+
+.py-6 {
+ padding-top: 1.5rem;
+ padding-bottom: 1.5rem;
+}
+
+.py-8 {
+ padding-top: 2rem;
+ padding-bottom: 2rem;
+}
+
+.pb-1 {
+ padding-bottom: 0.25rem;
+}
+
+.pb-3 {
+ padding-bottom: 0.75rem;
+}
+
+.pb-4 {
+ padding-bottom: 1rem;
+}
+
+.pl-10 {
+ padding-left: 2.5rem;
+}
+
+.pl-2 {
+ padding-left: 0.5rem;
+}
+
+.pl-2\.5 {
+ padding-left: 0.625rem;
+}
+
+.pl-3 {
+ padding-left: 0.75rem;
+}
+
+.pl-4 {
+ padding-left: 1rem;
+}
+
+.pl-8 {
+ padding-left: 2rem;
+}
+
+.pl-9 {
+ padding-left: 2.25rem;
+}
+
+.pr-14 {
+ padding-right: 3.5rem;
+}
+
+.pr-2 {
+ padding-right: 0.5rem;
+}
+
+.pr-2\.5 {
+ padding-right: 0.625rem;
+}
+
+.pr-3 {
+ padding-right: 0.75rem;
+}
+
+.pr-4 {
+ padding-right: 1rem;
+}
+
+.pr-6 {
+ padding-right: 1.5rem;
+}
+
+.pr-8 {
+ padding-right: 2rem;
+}
+
+.pt-0 {
+ padding-top: 0px;
+}
+
+.pt-1 {
+ padding-top: 0.25rem;
+}
+
+.pt-3 {
+ padding-top: 0.75rem;
+}
+
+.pt-4 {
+ padding-top: 1rem;
+}
+
+.text-left {
+ text-align: left;
+}
+
+.text-center {
+ text-align: center;
+}
+
+.align-middle {
+ vertical-align: middle;
+}
+
+.font-mono {
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+}
+
+.text-2xl {
+ font-size: 1.5rem;
+ line-height: 2rem;
+}
+
+.text-3xl {
+ font-size: 1.875rem;
+ line-height: 2.25rem;
+}
+
+.text-\[0\.8rem\] {
+ font-size: 0.8rem;
+}
+
+.text-base {
+ font-size: 1rem;
+ line-height: 1.5rem;
+}
+
+.text-lg {
+ font-size: 1.125rem;
+ line-height: 1.75rem;
+}
+
+.text-sm {
+ font-size: 0.875rem;
+ line-height: 1.25rem;
+}
+
+.text-xl {
+ font-size: 1.25rem;
+ line-height: 1.75rem;
+}
+
+.text-xs {
+ font-size: 0.75rem;
+ line-height: 1rem;
+}
+
+.font-bold {
+ font-weight: 700;
+}
+
+.font-medium {
+ font-weight: 500;
+}
+
+.font-normal {
+ font-weight: 400;
+}
+
+.font-semibold {
+ font-weight: 600;
+}
+
+.italic {
+ font-style: italic;
+}
+
+.tabular-nums {
+ --tw-numeric-spacing: tabular-nums;
+ font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction);
+}
+
+.leading-none {
+ line-height: 1;
+}
+
+.leading-relaxed {
+ line-height: 1.625;
+}
+
+.tracking-tight {
+ letter-spacing: -0.025em;
+}
+
+.tracking-widest {
+ letter-spacing: 0.1em;
+}
+
+.text-accent {
+ color: hsl(var(--accent));
+}
+
+.text-accent-foreground {
+ color: hsl(var(--accent-foreground));
+}
+
+.text-blue-500 {
+ --tw-text-opacity: 1;
+ color: rgb(59 130 246 / var(--tw-text-opacity));
+}
+
+.text-blue-600 {
+ --tw-text-opacity: 1;
+ color: rgb(37 99 235 / var(--tw-text-opacity));
+}
+
+.text-blue-800 {
+ --tw-text-opacity: 1;
+ color: rgb(30 64 175 / var(--tw-text-opacity));
+}
+
+.text-card-foreground {
+ color: hsl(var(--card-foreground));
+}
+
+.text-current {
+ color: currentColor;
+}
+
+.text-destructive {
+ color: hsl(var(--destructive));
+}
+
+.text-destructive-foreground {
+ color: hsl(var(--destructive-foreground));
+}
+
+.text-foreground {
+ color: hsl(var(--foreground));
+}
+
+.text-foreground\/50 {
+ color: hsl(var(--foreground) / 0.5);
+}
+
+.text-foreground\/80 {
+ color: hsl(var(--foreground) / 0.8);
+}
+
+.text-gray-500 {
+ --tw-text-opacity: 1;
+ color: rgb(107 114 128 / var(--tw-text-opacity));
+}
+
+.text-gray-700 {
+ --tw-text-opacity: 1;
+ color: rgb(55 65 81 / var(--tw-text-opacity));
+}
+
+.text-gray-800 {
+ --tw-text-opacity: 1;
+ color: rgb(31 41 55 / var(--tw-text-opacity));
+}
+
+.text-green-300 {
+ --tw-text-opacity: 1;
+ color: rgb(134 239 172 / var(--tw-text-opacity));
+}
+
+.text-green-400 {
+ --tw-text-opacity: 1;
+ color: rgb(74 222 128 / var(--tw-text-opacity));
+}
+
+.text-green-500 {
+ --tw-text-opacity: 1;
+ color: rgb(34 197 94 / var(--tw-text-opacity));
+}
+
+.text-green-600 {
+ --tw-text-opacity: 1;
+ color: rgb(22 163 74 / var(--tw-text-opacity));
+}
+
+.text-green-800 {
+ --tw-text-opacity: 1;
+ color: rgb(22 101 52 / var(--tw-text-opacity));
+}
+
+.text-indigo-600 {
+ --tw-text-opacity: 1;
+ color: rgb(79 70 229 / var(--tw-text-opacity));
+}
+
+.text-muted-foreground {
+ color: hsl(var(--muted-foreground));
+}
+
+.text-muted-foreground\/70 {
+ color: hsl(var(--muted-foreground) / 0.7);
+}
+
+.text-pink-500 {
+ --tw-text-opacity: 1;
+ color: rgb(236 72 153 / var(--tw-text-opacity));
+}
+
+.text-popover-foreground {
+ color: hsl(var(--popover-foreground));
+}
+
+.text-primary {
+ color: hsl(var(--primary));
+}
+
+.text-primary-foreground {
+ color: hsl(var(--primary-foreground));
+}
+
+.text-primary-foreground\/80 {
+ color: hsl(var(--primary-foreground) / 0.8);
+}
+
+.text-purple-500 {
+ --tw-text-opacity: 1;
+ color: rgb(168 85 247 / var(--tw-text-opacity));
+}
+
+.text-purple-600 {
+ --tw-text-opacity: 1;
+ color: rgb(147 51 234 / var(--tw-text-opacity));
+}
+
+.text-red-500 {
+ --tw-text-opacity: 1;
+ color: rgb(239 68 68 / var(--tw-text-opacity));
+}
+
+.text-red-600 {
+ --tw-text-opacity: 1;
+ color: rgb(220 38 38 / var(--tw-text-opacity));
+}
+
+.text-secondary-foreground {
+ color: hsl(var(--secondary-foreground));
+}
+
+.text-sidebar-foreground {
+ color: hsl(var(--sidebar-foreground));
+}
+
+.text-sidebar-foreground\/70 {
+ color: hsl(var(--sidebar-foreground) / 0.7);
+}
+
+.text-teal-600 {
+ --tw-text-opacity: 1;
+ color: rgb(13 148 136 / var(--tw-text-opacity));
+}
+
+.text-white {
+ --tw-text-opacity: 1;
+ color: rgb(255 255 255 / var(--tw-text-opacity));
+}
+
+.text-yellow-400 {
+ --tw-text-opacity: 1;
+ color: rgb(250 204 21 / var(--tw-text-opacity));
+}
+
+.text-yellow-500 {
+ --tw-text-opacity: 1;
+ color: rgb(234 179 8 / var(--tw-text-opacity));
+}
+
+.text-yellow-600 {
+ --tw-text-opacity: 1;
+ color: rgb(202 138 4 / var(--tw-text-opacity));
+}
+
+.text-yellow-800 {
+ --tw-text-opacity: 1;
+ color: rgb(133 77 14 / var(--tw-text-opacity));
+}
+
+.underline {
+ text-decoration-line: underline;
+}
+
+.underline-offset-4 {
+ text-underline-offset: 4px;
+}
+
+.opacity-0 {
+ opacity: 0;
+}
+
+.opacity-50 {
+ opacity: 0.5;
+}
+
+.opacity-60 {
+ opacity: 0.6;
+}
+
+.opacity-70 {
+ opacity: 0.7;
+}
+
+.opacity-90 {
+ opacity: 0.9;
+}
+
+.shadow {
+ --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
+ --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.shadow-2xl {
+ --tw-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25);
+ --tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.shadow-\[0_0_0_1px_hsl\(var\(--sidebar-border\)\)\] {
+ --tw-shadow: 0 0 0 1px hsl(var(--sidebar-border));
+ --tw-shadow-colored: 0 0 0 1px var(--tw-shadow-color);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.shadow-lg {
+ --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
+ --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.shadow-md {
+ --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
+ --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.shadow-none {
+ --tw-shadow: 0 0 #0000;
+ --tw-shadow-colored: 0 0 #0000;
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.shadow-sm {
+ --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
+ --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.shadow-xl {
+ --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
+ --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.shadow-black\/20 {
+ --tw-shadow-color: rgb(0 0 0 / 0.2);
+ --tw-shadow: var(--tw-shadow-colored);
+}
+
+.outline-none {
+ outline: 2px solid transparent;
+ outline-offset: 2px;
+}
+
+.outline {
+ outline-style: solid;
+}
+
+.ring-0 {
+ --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(0px + 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);
+}
+
+.ring-1 {
+ --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, 0 0 #0000);
+}
+
+.ring-ring {
+ --tw-ring-color: hsl(var(--ring));
+}
+
+.ring-sidebar-ring {
+ --tw-ring-color: hsl(var(--sidebar-ring));
+}
+
+.ring-offset-background {
+ --tw-ring-offset-color: hsl(var(--background));
+}
+
+.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);
+}
+
+.backdrop-blur {
+ --tw-backdrop-blur: blur(8px);
+ -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
+ backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
+}
+
+.backdrop-filter {
+ -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
+ backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
+}
+
+.transition {
+ transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter;
+ transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;
+ transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+}
+
+.transition-\[left\2c right\2c width\] {
+ transition-property: left,right,width;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+}
+
+.transition-\[margin\2c opacity\] {
+ transition-property: margin,opacity;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+}
+
+.transition-\[width\2c height\2c padding\] {
+ transition-property: width,height,padding;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+}
+
+.transition-\[width\] {
+ transition-property: width;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+}
+
+.transition-all {
+ transition-property: all;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+}
+
+.transition-colors {
+ transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+}
+
+.transition-opacity {
+ transition-property: opacity;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+}
+
+.transition-shadow {
+ transition-property: box-shadow;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+}
+
+.transition-transform {
+ transition-property: transform;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+}
+
+.duration-1000 {
+ transition-duration: 1000ms;
+}
+
+.duration-200 {
+ transition-duration: 200ms;
+}
+
+.duration-300 {
+ transition-duration: 300ms;
+}
+
+.ease-in-out {
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+.ease-linear {
+ transition-timing-function: linear;
+}
+
+@keyframes enter {
+ from {
+ opacity: var(--tw-enter-opacity, 1);
+ transform: translate3d(var(--tw-enter-translate-x, 0), var(--tw-enter-translate-y, 0), 0) scale3d(var(--tw-enter-scale, 1), var(--tw-enter-scale, 1), var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0));
+ }
+}
+
+@keyframes exit {
+ to {
+ opacity: var(--tw-exit-opacity, 1);
+ transform: translate3d(var(--tw-exit-translate-x, 0), var(--tw-exit-translate-y, 0), 0) scale3d(var(--tw-exit-scale, 1), var(--tw-exit-scale, 1), var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0));
+ }
+}
+
+.animate-in {
+ animation-name: enter;
+ animation-duration: 150ms;
+ --tw-enter-opacity: initial;
+ --tw-enter-scale: initial;
+ --tw-enter-rotate: initial;
+ --tw-enter-translate-x: initial;
+ --tw-enter-translate-y: initial;
+}
+
+.fade-in-0 {
+ --tw-enter-opacity: 0;
+}
+
+.zoom-in-95 {
+ --tw-enter-scale: .95;
+}
+
+.duration-1000 {
+ animation-duration: 1000ms;
+}
+
+.duration-200 {
+ animation-duration: 200ms;
+}
+
+.duration-300 {
+ animation-duration: 300ms;
+}
+
+.ease-in-out {
+ animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+.ease-linear {
+ animation-timing-function: linear;
+}
+
+.running {
+ animation-play-state: running;
+}
+
+.dark .scrollbar-thin::-webkit-scrollbar-thumb {
+ background: #4b5563;
+}
+
+.dark .scrollbar-thin::-webkit-scrollbar-thumb:hover {
+ background: #374151;
+}
+
+.file\:border-0::file-selector-button {
+ border-width: 0px;
+}
+
+.file\:bg-transparent::file-selector-button {
+ background-color: transparent;
+}
+
+.file\:text-sm::file-selector-button {
+ font-size: 0.875rem;
+ line-height: 1.25rem;
+}
+
+.file\:font-medium::file-selector-button {
+ font-weight: 500;
+}
+
+.file\:text-foreground::file-selector-button {
+ color: hsl(var(--foreground));
+}
+
+.placeholder\:text-muted-foreground::-moz-placeholder {
+ color: hsl(var(--muted-foreground));
+}
+
+.placeholder\:text-muted-foreground::placeholder {
+ color: hsl(var(--muted-foreground));
+}
+
+.after\:absolute::after {
+ content: var(--tw-content);
+ position: absolute;
+}
+
+.after\:-inset-2::after {
+ content: var(--tw-content);
+ inset: -0.5rem;
+}
+
+.after\:inset-y-0::after {
+ content: var(--tw-content);
+ top: 0px;
+ bottom: 0px;
+}
+
+.after\:left-1\/2::after {
+ content: var(--tw-content);
+ left: 50%;
+}
+
+.after\:w-1::after {
+ content: var(--tw-content);
+ width: 0.25rem;
+}
+
+.after\:w-\[2px\]::after {
+ content: var(--tw-content);
+ width: 2px;
+}
+
+.after\:-translate-x-1\/2::after {
+ content: var(--tw-content);
+ --tw-translate-x: -50%;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.first\:rounded-l-md:first-child {
+ border-top-left-radius: calc(var(--radius) - 2px);
+ border-bottom-left-radius: calc(var(--radius) - 2px);
+}
+
+.first\:border-l:first-child {
+ border-left-width: 1px;
+}
+
+.last\:rounded-r-md:last-child {
+ border-top-right-radius: calc(var(--radius) - 2px);
+ border-bottom-right-radius: calc(var(--radius) - 2px);
+}
+
+.focus-within\:relative:focus-within {
+ position: relative;
+}
+
+.focus-within\:z-20:focus-within {
+ z-index: 20;
+}
+
+.hover\:scale-105:hover {
+ --tw-scale-x: 1.05;
+ --tw-scale-y: 1.05;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.hover\:scale-110:hover {
+ --tw-scale-x: 1.1;
+ --tw-scale-y: 1.1;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.hover\:border-accent:hover {
+ border-color: hsl(var(--accent));
+}
+
+.hover\:border-green-500:hover {
+ --tw-border-opacity: 1;
+ border-color: rgb(34 197 94 / var(--tw-border-opacity));
+}
+
+.hover\:border-primary:hover {
+ border-color: hsl(var(--primary));
+}
+
+.hover\:bg-accent:hover {
+ background-color: hsl(var(--accent));
+}
+
+.hover\:bg-accent\/10:hover {
+ background-color: hsl(var(--accent) / 0.1);
+}
+
+.hover\:bg-blue-600:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(37 99 235 / var(--tw-bg-opacity));
+}
+
+.hover\:bg-blue-700:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(29 78 216 / var(--tw-bg-opacity));
+}
+
+.hover\:bg-card:hover {
+ background-color: hsl(var(--card));
+}
+
+.hover\:bg-destructive\/80:hover {
+ background-color: hsl(var(--destructive) / 0.8);
+}
+
+.hover\:bg-destructive\/90:hover {
+ background-color: hsl(var(--destructive) / 0.9);
+}
+
+.hover\:bg-gray-100:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(243 244 246 / var(--tw-bg-opacity));
+}
+
+.hover\:bg-gray-50:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(249 250 251 / var(--tw-bg-opacity));
+}
+
+.hover\:bg-green-700:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(21 128 61 / var(--tw-bg-opacity));
+}
+
+.hover\:bg-green-900\/30:hover {
+ background-color: rgb(20 83 45 / 0.3);
+}
+
+.hover\:bg-muted:hover {
+ background-color: hsl(var(--muted));
+}
+
+.hover\:bg-muted\/50:hover {
+ background-color: hsl(var(--muted) / 0.5);
+}
+
+.hover\:bg-primary:hover {
+ background-color: hsl(var(--primary));
+}
+
+.hover\:bg-primary\/80:hover {
+ background-color: hsl(var(--primary) / 0.8);
+}
+
+.hover\:bg-primary\/90:hover {
+ background-color: hsl(var(--primary) / 0.9);
+}
+
+.hover\:bg-secondary:hover {
+ background-color: hsl(var(--secondary));
+}
+
+.hover\:bg-secondary\/80:hover {
+ background-color: hsl(var(--secondary) / 0.8);
+}
+
+.hover\:bg-sidebar-accent:hover {
+ background-color: hsl(var(--sidebar-accent));
+}
+
+.hover\:text-accent-foreground:hover {
+ color: hsl(var(--accent-foreground));
+}
+
+.hover\:text-foreground:hover {
+ color: hsl(var(--foreground));
+}
+
+.hover\:text-green-300:hover {
+ --tw-text-opacity: 1;
+ color: rgb(134 239 172 / var(--tw-text-opacity));
+}
+
+.hover\:text-muted-foreground:hover {
+ color: hsl(var(--muted-foreground));
+}
+
+.hover\:text-primary:hover {
+ color: hsl(var(--primary));
+}
+
+.hover\:text-primary-foreground:hover {
+ color: hsl(var(--primary-foreground));
+}
+
+.hover\:text-secondary-foreground:hover {
+ color: hsl(var(--secondary-foreground));
+}
+
+.hover\:text-sidebar-accent-foreground:hover {
+ color: hsl(var(--sidebar-accent-foreground));
+}
+
+.hover\:underline:hover {
+ text-decoration-line: underline;
+}
+
+.hover\:opacity-100:hover {
+ opacity: 1;
+}
+
+.hover\:opacity-90:hover {
+ opacity: 0.9;
+}
+
+.hover\:shadow-\[0_0_0_1px_hsl\(var\(--sidebar-accent\)\)\]:hover {
+ --tw-shadow: 0 0 0 1px hsl(var(--sidebar-accent));
+ --tw-shadow-colored: 0 0 0 1px var(--tw-shadow-color);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.hover\:shadow-none:hover {
+ --tw-shadow: 0 0 #0000;
+ --tw-shadow-colored: 0 0 #0000;
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.hover\:shadow-xl:hover {
+ --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1);
+ --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.hover\:after\:bg-sidebar-border:hover::after {
+ content: var(--tw-content);
+ background-color: hsl(var(--sidebar-border));
+}
+
+.focus\:border-primary:focus {
+ border-color: hsl(var(--primary));
+}
+
+.focus\:border-transparent:focus {
+ border-color: transparent;
+}
+
+.focus\:bg-accent:focus {
+ background-color: hsl(var(--accent));
+}
+
+.focus\:bg-primary:focus {
+ background-color: hsl(var(--primary));
+}
+
+.focus\:text-accent-foreground:focus {
+ color: hsl(var(--accent-foreground));
+}
+
+.focus\:text-destructive:focus {
+ color: hsl(var(--destructive));
+}
+
+.focus\:text-primary-foreground:focus {
+ color: hsl(var(--primary-foreground));
+}
+
+.focus\:opacity-100:focus {
+ opacity: 1;
+}
+
+.focus\:outline-none:focus {
+ outline: 2px solid transparent;
+ outline-offset: 2px;
+}
+
+.focus\:ring-1:focus {
+ --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, 0 0 #0000);
+}
+
+.focus\:ring-2:focus {
+ --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, 0 0 #0000);
+}
+
+.focus\:ring-blue-500:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity));
+}
+
+.focus\:ring-primary:focus {
+ --tw-ring-color: hsl(var(--primary));
+}
+
+.focus\:ring-ring:focus {
+ --tw-ring-color: hsl(var(--ring));
+}
+
+.focus\:ring-offset-2:focus {
+ --tw-ring-offset-width: 2px;
+}
+
+.focus-visible\:outline-none:focus-visible {
+ outline: 2px solid transparent;
+ outline-offset: 2px;
+}
+
+.focus-visible\:ring-1:focus-visible {
+ --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, 0 0 #0000);
+}
+
+.focus-visible\:ring-2:focus-visible {
+ --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, 0 0 #0000);
+}
+
+.focus-visible\:ring-ring:focus-visible {
+ --tw-ring-color: hsl(var(--ring));
+}
+
+.focus-visible\:ring-sidebar-ring:focus-visible {
+ --tw-ring-color: hsl(var(--sidebar-ring));
+}
+
+.focus-visible\:ring-offset-1:focus-visible {
+ --tw-ring-offset-width: 1px;
+}
+
+.focus-visible\:ring-offset-2:focus-visible {
+ --tw-ring-offset-width: 2px;
+}
+
+.focus-visible\:ring-offset-background:focus-visible {
+ --tw-ring-offset-color: hsl(var(--background));
+}
+
+.active\:bg-sidebar-accent:active {
+ background-color: hsl(var(--sidebar-accent));
+}
+
+.active\:text-sidebar-accent-foreground:active {
+ color: hsl(var(--sidebar-accent-foreground));
+}
+
+.disabled\:pointer-events-none:disabled {
+ pointer-events: none;
+}
+
+.disabled\:cursor-not-allowed:disabled {
+ cursor: not-allowed;
+}
+
+.disabled\:opacity-50:disabled {
+ opacity: 0.5;
+}
+
+.group\/menu-item:focus-within .group-focus-within\/menu-item\:opacity-100 {
+ opacity: 1;
+}
+
+.group:hover .group-hover\:text-accent {
+ color: hsl(var(--accent));
+}
+
+.group\/menu-item:hover .group-hover\/menu-item\:opacity-100 {
+ opacity: 1;
+}
+
+.group:hover .group-hover\:opacity-100 {
+ opacity: 1;
+}
+
+.group:hover .group-hover\:shadow-sm {
+ --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
+ --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.group[data-collapsed=true] .group-\[\[data-collapsed\=true\]\]\:justify-center {
+ justify-content: center;
+}
+
+.group.destructive .group-\[\.destructive\]\:border-muted\/40 {
+ border-color: hsl(var(--muted) / 0.4);
+}
+
+.group.toaster .group-\[\.toaster\]\:border-border {
+ border-color: hsl(var(--border));
+}
+
+.group.toast .group-\[\.toast\]\:bg-muted {
+ background-color: hsl(var(--muted));
+}
+
+.group.toast .group-\[\.toast\]\:bg-primary {
+ background-color: hsl(var(--primary));
+}
+
+.group.toaster .group-\[\.toaster\]\:bg-background {
+ background-color: hsl(var(--background));
+}
+
+.group[data-collapsed=true] .group-\[\[data-collapsed\=true\]\]\:px-2 {
+ padding-left: 0.5rem;
+ padding-right: 0.5rem;
+}
+
+.group.destructive .group-\[\.destructive\]\:text-red-300 {
+ --tw-text-opacity: 1;
+ color: rgb(252 165 165 / var(--tw-text-opacity));
+}
+
+.group.toast .group-\[\.toast\]\:text-muted-foreground {
+ color: hsl(var(--muted-foreground));
+}
+
+.group.toast .group-\[\.toast\]\:text-primary-foreground {
+ color: hsl(var(--primary-foreground));
+}
+
+.group.toaster .group-\[\.toaster\]\:text-foreground {
+ color: hsl(var(--foreground));
+}
+
+.group.toaster .group-\[\.toaster\]\:shadow-lg {
+ --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
+ --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.group.destructive .group-\[\.destructive\]\:hover\:border-destructive\/30:hover {
+ border-color: hsl(var(--destructive) / 0.3);
+}
+
+.group.destructive .group-\[\.destructive\]\:hover\:bg-destructive:hover {
+ background-color: hsl(var(--destructive));
+}
+
+.group.destructive .group-\[\.destructive\]\:hover\:text-destructive-foreground:hover {
+ color: hsl(var(--destructive-foreground));
+}
+
+.group.destructive .group-\[\.destructive\]\:hover\:text-red-50:hover {
+ --tw-text-opacity: 1;
+ color: rgb(254 242 242 / var(--tw-text-opacity));
+}
+
+.group.destructive .group-\[\.destructive\]\:focus\:ring-destructive:focus {
+ --tw-ring-color: hsl(var(--destructive));
+}
+
+.group.destructive .group-\[\.destructive\]\:focus\:ring-red-400:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(248 113 113 / var(--tw-ring-opacity));
+}
+
+.group.destructive .group-\[\.destructive\]\:focus\:ring-offset-red-600:focus {
+ --tw-ring-offset-color: #dc2626;
+}
+
+.peer\/menu-button:hover ~ .peer-hover\/menu-button\:text-sidebar-accent-foreground {
+ color: hsl(var(--sidebar-accent-foreground));
+}
+
+.peer:disabled ~ .peer-disabled\:cursor-not-allowed {
+ cursor: not-allowed;
+}
+
+.peer:disabled ~ .peer-disabled\:opacity-70 {
+ opacity: 0.7;
+}
+
+.aria-disabled\:pointer-events-none[aria-disabled="true"] {
+ pointer-events: none;
+}
+
+.aria-disabled\:opacity-50[aria-disabled="true"] {
+ opacity: 0.5;
+}
+
+.aria-selected\:bg-accent[aria-selected="true"] {
+ background-color: hsl(var(--accent));
+}
+
+.aria-selected\:bg-accent\/50[aria-selected="true"] {
+ background-color: hsl(var(--accent) / 0.5);
+}
+
+.aria-selected\:text-accent-foreground[aria-selected="true"] {
+ color: hsl(var(--accent-foreground));
+}
+
+.aria-selected\:text-muted-foreground[aria-selected="true"] {
+ color: hsl(var(--muted-foreground));
+}
+
+.aria-selected\:opacity-100[aria-selected="true"] {
+ opacity: 1;
+}
+
+.data-\[disabled\=true\]\:pointer-events-none[data-disabled=true] {
+ pointer-events: none;
+}
+
+.data-\[disabled\]\:pointer-events-none[data-disabled] {
+ pointer-events: none;
+}
+
+.data-\[panel-group-direction\=vertical\]\:h-px[data-panel-group-direction=vertical] {
+ height: 1px;
+}
+
+.data-\[panel-group-direction\=vertical\]\:w-full[data-panel-group-direction=vertical] {
+ width: 100%;
+}
+
+.data-\[side\=bottom\]\:translate-y-1[data-side=bottom] {
+ --tw-translate-y: 0.25rem;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.data-\[side\=left\]\:-translate-x-1[data-side=left] {
+ --tw-translate-x: -0.25rem;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.data-\[side\=right\]\:translate-x-1[data-side=right] {
+ --tw-translate-x: 0.25rem;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.data-\[side\=top\]\:-translate-y-1[data-side=top] {
+ --tw-translate-y: -0.25rem;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.data-\[state\=checked\]\:translate-x-4[data-state=checked] {
+ --tw-translate-x: 1rem;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked] {
+ --tw-translate-x: 0px;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.data-\[swipe\=cancel\]\:translate-x-0[data-swipe=cancel] {
+ --tw-translate-x: 0px;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.data-\[swipe\=end\]\:translate-x-\[var\(--radix-toast-swipe-end-x\)\][data-swipe=end] {
+ --tw-translate-x: var(--radix-toast-swipe-end-x);
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.data-\[swipe\=move\]\:translate-x-\[var\(--radix-toast-swipe-move-x\)\][data-swipe=move] {
+ --tw-translate-x: var(--radix-toast-swipe-move-x);
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+@keyframes accordion-up {
+ from {
+ height: var(--radix-accordion-content-height);
+ }
+
+ to {
+ height: 0;
+ }
+}
+
+.data-\[state\=closed\]\:animate-accordion-up[data-state=closed] {
+ animation: accordion-up 0.2s ease-out;
+}
+
+@keyframes accordion-down {
+ from {
+ height: 0;
+ }
+
+ to {
+ height: var(--radix-accordion-content-height);
+ }
+}
+
+.data-\[state\=open\]\:animate-accordion-down[data-state=open] {
+ animation: accordion-down 0.2s ease-out;
+}
+
+.data-\[panel-group-direction\=vertical\]\:flex-col[data-panel-group-direction=vertical] {
+ flex-direction: column;
+}
+
+.data-\[active\=true\]\:bg-sidebar-accent[data-active=true] {
+ background-color: hsl(var(--sidebar-accent));
+}
+
+.data-\[selected\=true\]\:bg-accent[data-selected=true] {
+ background-color: hsl(var(--accent));
+}
+
+.data-\[state\=active\]\:bg-accent[data-state=active] {
+ background-color: hsl(var(--accent));
+}
+
+.data-\[state\=active\]\:bg-background[data-state=active] {
+ background-color: hsl(var(--background));
+}
+
+.data-\[state\=checked\]\:bg-primary[data-state=checked] {
+ background-color: hsl(var(--primary));
+}
+
+.data-\[state\=on\]\:bg-accent[data-state=on] {
+ background-color: hsl(var(--accent));
+}
+
+.data-\[state\=open\]\:bg-accent[data-state=open] {
+ background-color: hsl(var(--accent));
+}
+
+.data-\[state\=open\]\:bg-accent\/50[data-state=open] {
+ background-color: hsl(var(--accent) / 0.5);
+}
+
+.data-\[state\=open\]\:bg-secondary[data-state=open] {
+ background-color: hsl(var(--secondary));
+}
+
+.data-\[state\=selected\]\:bg-muted[data-state=selected] {
+ background-color: hsl(var(--muted));
+}
+
+.data-\[state\=unchecked\]\:bg-input[data-state=unchecked] {
+ background-color: hsl(var(--input));
+}
+
+.data-\[collapsed\=true\]\:py-2[data-collapsed=true] {
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+}
+
+.data-\[active\=true\]\:font-medium[data-active=true] {
+ font-weight: 500;
+}
+
+.data-\[active\=true\]\:text-sidebar-accent-foreground[data-active=true] {
+ color: hsl(var(--sidebar-accent-foreground));
+}
+
+.data-\[placeholder\]\:text-muted-foreground[data-placeholder] {
+ color: hsl(var(--muted-foreground));
+}
+
+.data-\[selected\=true\]\:text-accent-foreground[data-selected=true] {
+ color: hsl(var(--accent-foreground));
+}
+
+.data-\[state\=active\]\:text-foreground[data-state=active] {
+ color: hsl(var(--foreground));
+}
+
+.data-\[state\=checked\]\:text-primary-foreground[data-state=checked] {
+ color: hsl(var(--primary-foreground));
+}
+
+.data-\[state\=on\]\:text-accent-foreground[data-state=on] {
+ color: hsl(var(--accent-foreground));
+}
+
+.data-\[state\=open\]\:text-accent-foreground[data-state=open] {
+ color: hsl(var(--accent-foreground));
+}
+
+.data-\[state\=open\]\:text-muted-foreground[data-state=open] {
+ color: hsl(var(--muted-foreground));
+}
+
+.data-\[disabled\=true\]\:opacity-50[data-disabled=true] {
+ opacity: 0.5;
+}
+
+.data-\[disabled\]\:opacity-50[data-disabled] {
+ opacity: 0.5;
+}
+
+.data-\[state\=open\]\:opacity-100[data-state=open] {
+ opacity: 1;
+}
+
+.data-\[state\=active\]\:shadow[data-state=active] {
+ --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
+ --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.data-\[swipe\=move\]\:transition-none[data-swipe=move] {
+ transition-property: none;
+}
+
+.data-\[state\=closed\]\:duration-300[data-state=closed] {
+ transition-duration: 300ms;
+}
+
+.data-\[state\=open\]\:duration-500[data-state=open] {
+ transition-duration: 500ms;
+}
+
+.data-\[motion\^\=from-\]\:animate-in[data-motion^=from-] {
+ animation-name: enter;
+ animation-duration: 150ms;
+ --tw-enter-opacity: initial;
+ --tw-enter-scale: initial;
+ --tw-enter-rotate: initial;
+ --tw-enter-translate-x: initial;
+ --tw-enter-translate-y: initial;
+}
+
+.data-\[state\=open\]\:animate-in[data-state=open] {
+ animation-name: enter;
+ animation-duration: 150ms;
+ --tw-enter-opacity: initial;
+ --tw-enter-scale: initial;
+ --tw-enter-rotate: initial;
+ --tw-enter-translate-x: initial;
+ --tw-enter-translate-y: initial;
+}
+
+.data-\[state\=visible\]\:animate-in[data-state=visible] {
+ animation-name: enter;
+ animation-duration: 150ms;
+ --tw-enter-opacity: initial;
+ --tw-enter-scale: initial;
+ --tw-enter-rotate: initial;
+ --tw-enter-translate-x: initial;
+ --tw-enter-translate-y: initial;
+}
+
+.data-\[motion\^\=to-\]\:animate-out[data-motion^=to-] {
+ animation-name: exit;
+ animation-duration: 150ms;
+ --tw-exit-opacity: initial;
+ --tw-exit-scale: initial;
+ --tw-exit-rotate: initial;
+ --tw-exit-translate-x: initial;
+ --tw-exit-translate-y: initial;
+}
+
+.data-\[state\=closed\]\:animate-out[data-state=closed] {
+ animation-name: exit;
+ animation-duration: 150ms;
+ --tw-exit-opacity: initial;
+ --tw-exit-scale: initial;
+ --tw-exit-rotate: initial;
+ --tw-exit-translate-x: initial;
+ --tw-exit-translate-y: initial;
+}
+
+.data-\[state\=hidden\]\:animate-out[data-state=hidden] {
+ animation-name: exit;
+ animation-duration: 150ms;
+ --tw-exit-opacity: initial;
+ --tw-exit-scale: initial;
+ --tw-exit-rotate: initial;
+ --tw-exit-translate-x: initial;
+ --tw-exit-translate-y: initial;
+}
+
+.data-\[swipe\=end\]\:animate-out[data-swipe=end] {
+ animation-name: exit;
+ animation-duration: 150ms;
+ --tw-exit-opacity: initial;
+ --tw-exit-scale: initial;
+ --tw-exit-rotate: initial;
+ --tw-exit-translate-x: initial;
+ --tw-exit-translate-y: initial;
+}
+
+.data-\[motion\^\=from-\]\:fade-in[data-motion^=from-] {
+ --tw-enter-opacity: 0;
+}
+
+.data-\[motion\^\=to-\]\:fade-out[data-motion^=to-] {
+ --tw-exit-opacity: 0;
+}
+
+.data-\[state\=closed\]\:fade-out-0[data-state=closed] {
+ --tw-exit-opacity: 0;
+}
+
+.data-\[state\=closed\]\:fade-out-80[data-state=closed] {
+ --tw-exit-opacity: 0.8;
+}
+
+.data-\[state\=hidden\]\:fade-out[data-state=hidden] {
+ --tw-exit-opacity: 0;
+}
+
+.data-\[state\=open\]\:fade-in-0[data-state=open] {
+ --tw-enter-opacity: 0;
+}
+
+.data-\[state\=visible\]\:fade-in[data-state=visible] {
+ --tw-enter-opacity: 0;
+}
+
+.data-\[state\=closed\]\:zoom-out-95[data-state=closed] {
+ --tw-exit-scale: .95;
+}
+
+.data-\[state\=open\]\:zoom-in-90[data-state=open] {
+ --tw-enter-scale: .9;
+}
+
+.data-\[state\=open\]\:zoom-in-95[data-state=open] {
+ --tw-enter-scale: .95;
+}
+
+.data-\[motion\=from-end\]\:slide-in-from-right-52[data-motion=from-end] {
+ --tw-enter-translate-x: 13rem;
+}
+
+.data-\[motion\=from-start\]\:slide-in-from-left-52[data-motion=from-start] {
+ --tw-enter-translate-x: -13rem;
+}
+
+.data-\[motion\=to-end\]\:slide-out-to-right-52[data-motion=to-end] {
+ --tw-exit-translate-x: 13rem;
+}
+
+.data-\[motion\=to-start\]\:slide-out-to-left-52[data-motion=to-start] {
+ --tw-exit-translate-x: -13rem;
+}
+
+.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom] {
+ --tw-enter-translate-y: -0.5rem;
+}
+
+.data-\[side\=left\]\:slide-in-from-right-2[data-side=left] {
+ --tw-enter-translate-x: 0.5rem;
+}
+
+.data-\[side\=right\]\:slide-in-from-left-2[data-side=right] {
+ --tw-enter-translate-x: -0.5rem;
+}
+
+.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top] {
+ --tw-enter-translate-y: 0.5rem;
+}
+
+.data-\[state\=closed\]\:slide-out-to-bottom[data-state=closed] {
+ --tw-exit-translate-y: 100%;
+}
+
+.data-\[state\=closed\]\:slide-out-to-left[data-state=closed] {
+ --tw-exit-translate-x: -100%;
+}
+
+.data-\[state\=closed\]\:slide-out-to-left-1\/2[data-state=closed] {
+ --tw-exit-translate-x: -50%;
+}
+
+.data-\[state\=closed\]\:slide-out-to-right[data-state=closed] {
+ --tw-exit-translate-x: 100%;
+}
+
+.data-\[state\=closed\]\:slide-out-to-right-full[data-state=closed] {
+ --tw-exit-translate-x: 100%;
+}
+
+.data-\[state\=closed\]\:slide-out-to-top[data-state=closed] {
+ --tw-exit-translate-y: -100%;
+}
+
+.data-\[state\=closed\]\:slide-out-to-top-\[48\%\][data-state=closed] {
+ --tw-exit-translate-y: -48%;
+}
+
+.data-\[state\=open\]\:slide-in-from-bottom[data-state=open] {
+ --tw-enter-translate-y: 100%;
+}
+
+.data-\[state\=open\]\:slide-in-from-left[data-state=open] {
+ --tw-enter-translate-x: -100%;
+}
+
+.data-\[state\=open\]\:slide-in-from-left-1\/2[data-state=open] {
+ --tw-enter-translate-x: -50%;
+}
+
+.data-\[state\=open\]\:slide-in-from-right[data-state=open] {
+ --tw-enter-translate-x: 100%;
+}
+
+.data-\[state\=open\]\:slide-in-from-top[data-state=open] {
+ --tw-enter-translate-y: -100%;
+}
+
+.data-\[state\=open\]\:slide-in-from-top-\[48\%\][data-state=open] {
+ --tw-enter-translate-y: -48%;
+}
+
+.data-\[state\=open\]\:slide-in-from-top-full[data-state=open] {
+ --tw-enter-translate-y: -100%;
+}
+
+.data-\[state\=closed\]\:duration-300[data-state=closed] {
+ animation-duration: 300ms;
+}
+
+.data-\[state\=open\]\:duration-500[data-state=open] {
+ animation-duration: 500ms;
+}
+
+.data-\[panel-group-direction\=vertical\]\:after\:left-0[data-panel-group-direction=vertical]::after {
+ content: var(--tw-content);
+ left: 0px;
+}
+
+.data-\[panel-group-direction\=vertical\]\:after\:h-1[data-panel-group-direction=vertical]::after {
+ content: var(--tw-content);
+ height: 0.25rem;
+}
+
+.data-\[panel-group-direction\=vertical\]\:after\:w-full[data-panel-group-direction=vertical]::after {
+ content: var(--tw-content);
+ width: 100%;
+}
+
+.data-\[panel-group-direction\=vertical\]\:after\:-translate-y-1\/2[data-panel-group-direction=vertical]::after {
+ content: var(--tw-content);
+ --tw-translate-y: -50%;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.data-\[panel-group-direction\=vertical\]\:after\:translate-x-0[data-panel-group-direction=vertical]::after {
+ content: var(--tw-content);
+ --tw-translate-x: 0px;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.data-\[state\=open\]\:hover\:bg-accent:hover[data-state=open] {
+ background-color: hsl(var(--accent));
+}
+
+.data-\[state\=open\]\:hover\:bg-sidebar-accent:hover[data-state=open] {
+ background-color: hsl(var(--sidebar-accent));
+}
+
+.data-\[state\=open\]\:hover\:text-sidebar-accent-foreground:hover[data-state=open] {
+ color: hsl(var(--sidebar-accent-foreground));
+}
+
+.data-\[state\=open\]\:focus\:bg-accent:focus[data-state=open] {
+ background-color: hsl(var(--accent));
+}
+
+.group[data-collapsible=offcanvas] .group-data-\[collapsible\=offcanvas\]\:left-\[calc\(var\(--sidebar-width\)\*-1\)\] {
+ left: calc(var(--sidebar-width) * -1);
+}
+
+.group[data-collapsible=offcanvas] .group-data-\[collapsible\=offcanvas\]\:right-\[calc\(var\(--sidebar-width\)\*-1\)\] {
+ right: calc(var(--sidebar-width) * -1);
+}
+
+.group[data-side=left] .group-data-\[side\=left\]\:-right-4 {
+ right: -1rem;
+}
+
+.group[data-side=right] .group-data-\[side\=right\]\:left-0 {
+ left: 0px;
+}
+
+.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:-mt-8 {
+ margin-top: -2rem;
+}
+
+.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:hidden {
+ display: none;
+}
+
+.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:w-\[--sidebar-width-icon\] {
+ width: var(--sidebar-width-icon);
+}
+
+.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)_\+_theme\(spacing\.4\)\)\] {
+ width: calc(var(--sidebar-width-icon) + 1rem);
+}
+
+.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)_\+_theme\(spacing\.4\)_\+2px\)\] {
+ width: calc(var(--sidebar-width-icon) + 1rem +2px);
+}
+
+.group[data-collapsible=offcanvas] .group-data-\[collapsible\=offcanvas\]\:w-0 {
+ width: 0px;
+}
+
+.group[data-collapsible=offcanvas] .group-data-\[collapsible\=offcanvas\]\:translate-x-0 {
+ --tw-translate-x: 0px;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.group[data-side=right] .group-data-\[side\=right\]\:rotate-180 {
+ --tw-rotate: 180deg;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.group[data-state=open] .group-data-\[state\=open\]\:rotate-180 {
+ --tw-rotate: 180deg;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:overflow-hidden {
+ overflow: hidden;
+}
+
+.group[data-variant=floating] .group-data-\[variant\=floating\]\:rounded-lg {
+ border-radius: var(--radius);
+}
+
+.group[data-variant=floating] .group-data-\[variant\=floating\]\:border {
+ border-width: 1px;
+}
+
+.group[data-side=left] .group-data-\[side\=left\]\:border-r {
+ border-right-width: 1px;
+}
+
+.group[data-side=right] .group-data-\[side\=right\]\:border-l {
+ border-left-width: 1px;
+}
+
+.group[data-variant=floating] .group-data-\[variant\=floating\]\:border-sidebar-border {
+ border-color: hsl(var(--sidebar-border));
+}
+
+.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:\!p-0 {
+ padding: 0px !important;
+}
+
+.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:\!p-2 {
+ padding: 0.5rem !important;
+}
+
+.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:opacity-0 {
+ opacity: 0;
+}
+
+.group[data-variant=floating] .group-data-\[variant\=floating\]\:shadow {
+ --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
+ --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.group[data-collapsible=offcanvas] .group-data-\[collapsible\=offcanvas\]\:after\:left-full::after {
+ content: var(--tw-content);
+ left: 100%;
+}
+
+.group[data-collapsible=offcanvas] .group-data-\[collapsible\=offcanvas\]\:hover\:bg-sidebar:hover {
+ background-color: hsl(var(--sidebar-background));
+}
+
+.peer\/menu-button[data-size=default] ~ .peer-data-\[size\=default\]\/menu-button\:top-1\.5 {
+ top: 0.375rem;
+}
+
+.peer\/menu-button[data-size=lg] ~ .peer-data-\[size\=lg\]\/menu-button\:top-2\.5 {
+ top: 0.625rem;
+}
+
+.peer\/menu-button[data-size=sm] ~ .peer-data-\[size\=sm\]\/menu-button\:top-1 {
+ top: 0.25rem;
+}
+
+.peer\/menu-button[data-active=true] ~ .peer-data-\[active\=true\]\/menu-button\:text-sidebar-accent-foreground {
+ color: hsl(var(--sidebar-accent-foreground));
+}
+
+@supports ((-webkit-backdrop-filter: var(--tw)) or (backdrop-filter: var(--tw))) {
+ .supports-\[backdrop-filter\]\:bg-background\/60 {
+ background-color: hsl(var(--background) / 0.6);
+ }
+}
+
+:is(.dark .dark\:border-destructive) {
+ border-color: hsl(var(--destructive));
+}
+
+:is(.dark .dark\:bg-primary\/10) {
+ background-color: hsl(var(--primary) / 0.1);
+}
+
+:is(.dark .dark\:text-primary-foreground) {
+ color: hsl(var(--primary-foreground));
+}
+
+@media (min-width: 640px) {
+ .sm\:bottom-0 {
+ bottom: 0px;
+ }
+
+ .sm\:right-0 {
+ right: 0px;
+ }
+
+ .sm\:top-auto {
+ top: auto;
+ }
+
+ .sm\:mt-0 {
+ margin-top: 0px;
+ }
+
+ .sm\:flex {
+ display: flex;
+ }
+
+ .sm\:max-w-sm {
+ max-width: 24rem;
+ }
+
+ .sm\:flex-row {
+ flex-direction: row;
+ }
+
+ .sm\:flex-col {
+ flex-direction: column;
+ }
+
+ .sm\:justify-end {
+ justify-content: flex-end;
+ }
+
+ .sm\:gap-2 {
+ gap: 0.5rem;
+ }
+
+ .sm\:gap-2\.5 {
+ gap: 0.625rem;
+ }
+
+ .sm\:space-x-2 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-x-reverse: 0;
+ margin-right: calc(0.5rem * var(--tw-space-x-reverse));
+ margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse)));
+ }
+
+ .sm\:space-x-4 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-x-reverse: 0;
+ margin-right: calc(1rem * var(--tw-space-x-reverse));
+ margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse)));
+ }
+
+ .sm\:space-y-0 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-y-reverse: 0;
+ margin-top: calc(0px * calc(1 - var(--tw-space-y-reverse)));
+ margin-bottom: calc(0px * var(--tw-space-y-reverse));
+ }
+
+ .sm\:rounded-lg {
+ border-radius: var(--radius);
+ }
+
+ .sm\:text-left {
+ text-align: left;
+ }
+
+ .data-\[state\=open\]\:sm\:slide-in-from-bottom-full[data-state=open] {
+ --tw-enter-translate-y: 100%;
+ }
+}
+
+@media (min-width: 768px) {
+ .md\:absolute {
+ position: absolute;
+ }
+
+ .md\:block {
+ display: block;
+ }
+
+ .md\:flex {
+ display: flex;
+ }
+
+ .md\:w-1\/4 {
+ width: 25%;
+ }
+
+ .md\:w-\[var\(--radix-navigation-menu-viewport-width\)\] {
+ width: var(--radix-navigation-menu-viewport-width);
+ }
+
+ .md\:w-auto {
+ width: auto;
+ }
+
+ .md\:max-w-\[420px\] {
+ max-width: 420px;
+ }
+
+ .md\:max-w-\[75\%\] {
+ max-width: 75%;
+ }
+
+ .md\:grid-cols-2 {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ }
+
+ .md\:grid-cols-3 {
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ }
+
+ .md\:flex-row {
+ flex-direction: row;
+ }
+
+ .md\:text-sm {
+ font-size: 0.875rem;
+ line-height: 1.25rem;
+ }
+
+ .md\:opacity-0 {
+ opacity: 0;
+ }
+
+ .after\:md\:hidden::after {
+ content: var(--tw-content);
+ display: none;
+ }
+
+ .peer[data-variant=inset] ~ .md\:peer-data-\[variant\=inset\]\:m-2 {
+ margin: 0.5rem;
+ }
+
+ .peer[data-state=collapsed][data-variant=inset] ~ .md\:peer-data-\[state\=collapsed\]\:peer-data-\[variant\=inset\]\:ml-2 {
+ margin-left: 0.5rem;
+ }
+
+ .peer[data-variant=inset] ~ .md\:peer-data-\[variant\=inset\]\:ml-0 {
+ margin-left: 0px;
+ }
+
+ .peer[data-variant=inset] ~ .md\:peer-data-\[variant\=inset\]\:rounded-xl {
+ border-radius: 0.75rem;
+ }
+
+ .peer[data-variant=inset] ~ .md\:peer-data-\[variant\=inset\]\:shadow {
+ --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
+ --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+ }
+}
+
+@media (min-width: 1024px) {
+ .lg\:grid-cols-3 {
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ }
+
+ .lg\:grid-cols-4 {
+ grid-template-columns: repeat(4, minmax(0, 1fr));
+ }
+}
+
+.\[\&\+div\]\:text-xs+div {
+ font-size: 0.75rem;
+ line-height: 1rem;
+}
+
+.\[\&\:has\(\>\.day-range-end\)\]\:rounded-r-md:has(>.day-range-end) {
+ border-top-right-radius: calc(var(--radius) - 2px);
+ border-bottom-right-radius: calc(var(--radius) - 2px);
+}
+
+.\[\&\:has\(\>\.day-range-start\)\]\:rounded-l-md:has(>.day-range-start) {
+ border-top-left-radius: calc(var(--radius) - 2px);
+ border-bottom-left-radius: calc(var(--radius) - 2px);
+}
+
+.\[\&\:has\(\[aria-selected\]\)\]\:rounded-md:has([aria-selected]) {
+ border-radius: calc(var(--radius) - 2px);
+}
+
+.\[\&\:has\(\[aria-selected\]\)\]\:bg-accent:has([aria-selected]) {
+ background-color: hsl(var(--accent));
+}
+
+.first\:\[\&\:has\(\[aria-selected\]\)\]\:rounded-l-md:has([aria-selected]):first-child {
+ border-top-left-radius: calc(var(--radius) - 2px);
+ border-bottom-left-radius: calc(var(--radius) - 2px);
+}
+
+.last\:\[\&\:has\(\[aria-selected\]\)\]\:rounded-r-md:has([aria-selected]):last-child {
+ border-top-right-radius: calc(var(--radius) - 2px);
+ border-bottom-right-radius: calc(var(--radius) - 2px);
+}
+
+.\[\&\:has\(\[aria-selected\]\.day-outside\)\]\:bg-accent\/50:has([aria-selected].day-outside) {
+ background-color: hsl(var(--accent) / 0.5);
+}
+
+.\[\&\:has\(\[aria-selected\]\.day-range-end\)\]\:rounded-r-md:has([aria-selected].day-range-end) {
+ border-top-right-radius: calc(var(--radius) - 2px);
+ border-bottom-right-radius: calc(var(--radius) - 2px);
+}
+
+.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]) {
+ padding-right: 0px;
+}
+
+.\[\&\>\[role\=checkbox\]\]\:translate-y-\[2px\]>[role=checkbox] {
+ --tw-translate-y: 2px;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.\[\&\>button\]\:hidden>button {
+ display: none;
+}
+
+.\[\&\>span\:last-child\]\:truncate>span:last-child {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.\[\&\>span\]\:line-clamp-1>span {
+ overflow: hidden;
+ display: -webkit-box;
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: 1;
+}
+
+.\[\&\>span\]\:flex>span {
+ display: flex;
+}
+
+.\[\&\>span\]\:w-auto>span {
+ width: auto;
+}
+
+.\[\&\>span\]\:w-full>span {
+ width: 100%;
+}
+
+.\[\&\>span\]\:items-center>span {
+ align-items: center;
+}
+
+.\[\&\>span\]\:gap-1>span {
+ gap: 0.25rem;
+}
+
+.\[\&\>span\]\:truncate>span {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
+
+.\[\&\>svg\+div\]\:translate-y-\[-3px\]>svg+div {
+ --tw-translate-y: -3px;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.\[\&\>svg\]\:absolute>svg {
+ position: absolute;
+}
+
+.\[\&\>svg\]\:left-4>svg {
+ left: 1rem;
+}
+
+.\[\&\>svg\]\:top-4>svg {
+ top: 1rem;
+}
+
+.\[\&\>svg\]\:hidden>svg {
+ display: none;
+}
+
+.\[\&\>svg\]\:h-2\.5>svg {
+ height: 0.625rem;
+}
+
+.\[\&\>svg\]\:h-3>svg {
+ height: 0.75rem;
+}
+
+.\[\&\>svg\]\:h-3\.5>svg {
+ height: 0.875rem;
+}
+
+.\[\&\>svg\]\:w-2\.5>svg {
+ width: 0.625rem;
+}
+
+.\[\&\>svg\]\:w-3>svg {
+ width: 0.75rem;
+}
+
+.\[\&\>svg\]\:w-3\.5>svg {
+ width: 0.875rem;
+}
+
+.\[\&\>svg\]\:shrink-0>svg {
+ flex-shrink: 0;
+}
+
+.\[\&\>svg\]\:text-destructive>svg {
+ color: hsl(var(--destructive));
+}
+
+.\[\&\>svg\]\:text-foreground>svg {
+ color: hsl(var(--foreground));
+}
+
+.\[\&\>svg\]\:text-muted-foreground>svg {
+ color: hsl(var(--muted-foreground));
+}
+
+.\[\&\>svg\]\:text-sidebar-accent-foreground>svg {
+ color: hsl(var(--sidebar-accent-foreground));
+}
+
+.\[\&\>svg\~\*\]\:pl-7>svg~* {
+ padding-left: 1.75rem;
+}
+
+.\[\&\>tr\]\:last\:border-b-0:last-child>tr {
+ border-bottom-width: 0px;
+}
+
+.\[\&\[data-panel-group-direction\=vertical\]\>div\]\:rotate-90[data-panel-group-direction=vertical]>div {
+ --tw-rotate: 90deg;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.\[\&\[data-state\=open\]\>svg\]\:rotate-180[data-state=open]>svg {
+ --tw-rotate: 180deg;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.\[\&_\.recharts-cartesian-axis-tick_text\]\:fill-muted-foreground .recharts-cartesian-axis-tick text {
+ fill: hsl(var(--muted-foreground));
+}
+
+.\[\&_\.recharts-cartesian-grid_line\[stroke\=\'\#ccc\'\]\]\:stroke-border\/50 .recharts-cartesian-grid line[stroke='#ccc'] {
+ stroke: hsl(var(--border) / 0.5);
+}
+
+.\[\&_\.recharts-curve\.recharts-tooltip-cursor\]\:stroke-border .recharts-curve.recharts-tooltip-cursor {
+ stroke: hsl(var(--border));
+}
+
+.\[\&_\.recharts-dot\[stroke\=\'\#fff\'\]\]\:stroke-transparent .recharts-dot[stroke='#fff'] {
+ stroke: transparent;
+}
+
+.\[\&_\.recharts-layer\]\:outline-none .recharts-layer {
+ outline: 2px solid transparent;
+ outline-offset: 2px;
+}
+
+.\[\&_\.recharts-polar-grid_\[stroke\=\'\#ccc\'\]\]\:stroke-border .recharts-polar-grid [stroke='#ccc'] {
+ stroke: hsl(var(--border));
+}
+
+.\[\&_\.recharts-radial-bar-background-sector\]\:fill-muted .recharts-radial-bar-background-sector {
+ fill: hsl(var(--muted));
+}
+
+.\[\&_\.recharts-rectangle\.recharts-tooltip-cursor\]\:fill-muted .recharts-rectangle.recharts-tooltip-cursor {
+ fill: hsl(var(--muted));
+}
+
+.\[\&_\.recharts-reference-line_\[stroke\=\'\#ccc\'\]\]\:stroke-border .recharts-reference-line [stroke='#ccc'] {
+ stroke: hsl(var(--border));
+}
+
+.\[\&_\.recharts-sector\[stroke\=\'\#fff\'\]\]\:stroke-transparent .recharts-sector[stroke='#fff'] {
+ stroke: transparent;
+}
+
+.\[\&_\.recharts-sector\]\:outline-none .recharts-sector {
+ outline: 2px solid transparent;
+ outline-offset: 2px;
+}
+
+.\[\&_\.recharts-surface\]\:outline-none .recharts-surface {
+ outline: 2px solid transparent;
+ outline-offset: 2px;
+}
+
+.\[\&_\[cmdk-group-heading\]\]\:px-2 [cmdk-group-heading] {
+ padding-left: 0.5rem;
+ padding-right: 0.5rem;
+}
+
+.\[\&_\[cmdk-group-heading\]\]\:py-1\.5 [cmdk-group-heading] {
+ padding-top: 0.375rem;
+ padding-bottom: 0.375rem;
+}
+
+.\[\&_\[cmdk-group-heading\]\]\:text-xs [cmdk-group-heading] {
+ font-size: 0.75rem;
+ line-height: 1rem;
+}
+
+.\[\&_\[cmdk-group-heading\]\]\:font-medium [cmdk-group-heading] {
+ font-weight: 500;
+}
+
+.\[\&_\[cmdk-group-heading\]\]\:text-muted-foreground [cmdk-group-heading] {
+ color: hsl(var(--muted-foreground));
+}
+
+.\[\&_\[cmdk-group\]\:not\(\[hidden\]\)_\~\[cmdk-group\]\]\:pt-0 [cmdk-group]:not([hidden]) ~[cmdk-group] {
+ padding-top: 0px;
+}
+
+.\[\&_\[cmdk-group\]\]\:px-2 [cmdk-group] {
+ padding-left: 0.5rem;
+ padding-right: 0.5rem;
+}
+
+.\[\&_\[cmdk-input-wrapper\]_svg\]\:h-5 [cmdk-input-wrapper] svg {
+ height: 1.25rem;
+}
+
+.\[\&_\[cmdk-input-wrapper\]_svg\]\:w-5 [cmdk-input-wrapper] svg {
+ width: 1.25rem;
+}
+
+.\[\&_\[cmdk-input\]\]\:h-12 [cmdk-input] {
+ height: 3rem;
+}
+
+.\[\&_\[cmdk-item\]\]\:px-2 [cmdk-item] {
+ padding-left: 0.5rem;
+ padding-right: 0.5rem;
+}
+
+.\[\&_\[cmdk-item\]\]\:py-3 [cmdk-item] {
+ padding-top: 0.75rem;
+ padding-bottom: 0.75rem;
+}
+
+.\[\&_\[cmdk-item\]_svg\]\:h-5 [cmdk-item] svg {
+ height: 1.25rem;
+}
+
+.\[\&_\[cmdk-item\]_svg\]\:w-5 [cmdk-item] svg {
+ width: 1.25rem;
+}
+
+.\[\&_p\]\:leading-relaxed p {
+ line-height: 1.625;
+}
+
+.\[\&_svg\]\:pointer-events-none svg {
+ pointer-events: none;
+}
+
+.\[\&_svg\]\:h-4 svg {
+ height: 1rem;
+}
+
+.\[\&_svg\]\:w-4 svg {
+ width: 1rem;
+}
+
+.\[\&_svg\]\:shrink-0 svg {
+ flex-shrink: 0;
+}
+
+.\[\&_svg\]\:text-foreground svg {
+ color: hsl(var(--foreground));
+}
+
+.\[\&_tr\:last-child\]\:border-0 tr:last-child {
+ border-width: 0px;
+}
+
+.\[\&_tr\]\:border-b tr {
+ border-bottom-width: 1px;
+}
+
+[data-side=left][data-collapsible=offcanvas] .\[\[data-side\=left\]\[data-collapsible\=offcanvas\]_\&\]\:-right-2 {
+ right: -0.5rem;
+}
+
+[data-side=left][data-state=collapsed] .\[\[data-side\=left\]\[data-state\=collapsed\]_\&\]\:cursor-e-resize {
+ cursor: e-resize;
+}
+
+[data-side=left] .\[\[data-side\=left\]_\&\]\:cursor-w-resize {
+ cursor: w-resize;
+}
+
+[data-side=right][data-collapsible=offcanvas] .\[\[data-side\=right\]\[data-collapsible\=offcanvas\]_\&\]\:-left-2 {
+ left: -0.5rem;
+}
+
+[data-side=right][data-state=collapsed] .\[\[data-side\=right\]\[data-state\=collapsed\]_\&\]\:cursor-w-resize {
+ cursor: w-resize;
+}
+
+[data-side=right] .\[\[data-side\=right\]_\&\]\:cursor-e-resize {
+ cursor: e-resize;
+}
+
diff --git a/public/sounds/click.mp3 b/public/sounds/click.mp3
new file mode 100644
index 00000000..5a9b52fc
--- /dev/null
+++ b/public/sounds/click.mp3
@@ -0,0 +1,46 @@
+
+
+
+ Example Domain
+
+
+
+
+
+
+
+
+
+
Example Domain
+
This domain is for use in illustrative examples in documents. You may use this
+ domain in literature without prior coordination or asking for permission.
+
More information...
+
+
+
diff --git a/public/sounds/error.mp3 b/public/sounds/error.mp3
new file mode 100644
index 00000000..5a9b52fc
--- /dev/null
+++ b/public/sounds/error.mp3
@@ -0,0 +1,46 @@
+
+
+
+ Example Domain
+
+
+
+
+
+
+
+
+
+
Example Domain
+
This domain is for use in illustrative examples in documents. You may use this
+ domain in literature without prior coordination or asking for permission.
+
More information...
+
+
+
diff --git a/public/sounds/hover.mp3 b/public/sounds/hover.mp3
new file mode 100644
index 00000000..5a9b52fc
--- /dev/null
+++ b/public/sounds/hover.mp3
@@ -0,0 +1,46 @@
+
+
+
+ Example Domain
+
+
+
+
+
+
+
+
+
+
Example Domain
+
This domain is for use in illustrative examples in documents. You may use this
+ domain in literature without prior coordination or asking for permission.
+
More information...
+
+
+
diff --git a/public/sounds/manifest.ts b/public/sounds/manifest.ts
new file mode 100644
index 00000000..b98ef7fe
--- /dev/null
+++ b/public/sounds/manifest.ts
@@ -0,0 +1,13 @@
+export const soundAssets = {
+ send: '/assets/sounds/send.mp3',
+ receive: '/assets/sounds/receive.mp3',
+ typing: '/assets/sounds/typing.mp3',
+ notification: '/assets/sounds/notification.mp3',
+ click: '/assets/sounds/click.mp3',
+ hover: '/assets/sounds/hover.mp3',
+ success: '/assets/sounds/success.mp3',
+ error: '/assets/sounds/error.mp3'
+} as const;
+
+// Type for sound names
+export type SoundName = keyof typeof soundAssets;
diff --git a/public/sounds/notification.mp3 b/public/sounds/notification.mp3
new file mode 100644
index 00000000..5a9b52fc
--- /dev/null
+++ b/public/sounds/notification.mp3
@@ -0,0 +1,46 @@
+
+
+
+ Example Domain
+
+
+
+
+
+
+
+
+
+
Example Domain
+
This domain is for use in illustrative examples in documents. You may use this
+ domain in literature without prior coordination or asking for permission.
+
More information...
+
+
+
diff --git a/public/sounds/receive.mp3 b/public/sounds/receive.mp3
new file mode 100644
index 00000000..5a9b52fc
--- /dev/null
+++ b/public/sounds/receive.mp3
@@ -0,0 +1,46 @@
+
+
+
+ Example Domain
+
+
+
+
+
+
+
+
+
+
Example Domain
+
This domain is for use in illustrative examples in documents. You may use this
+ domain in literature without prior coordination or asking for permission.
+
More information...
+
+
+
diff --git a/public/sounds/send.mp3 b/public/sounds/send.mp3
new file mode 100644
index 00000000..5a9b52fc
--- /dev/null
+++ b/public/sounds/send.mp3
@@ -0,0 +1,46 @@
+
+
+
+ Example Domain
+
+
+
+
+
+
+
+
+
+
Example Domain
+
This domain is for use in illustrative examples in documents. You may use this
+ domain in literature without prior coordination or asking for permission.
+
More information...
+
+
+
diff --git a/public/sounds/success.mp3 b/public/sounds/success.mp3
new file mode 100644
index 00000000..5a9b52fc
--- /dev/null
+++ b/public/sounds/success.mp3
@@ -0,0 +1,46 @@
+
+
+
+ Example Domain
+
+
+
+
+
+
+
+
+
+
Example Domain
+
This domain is for use in illustrative examples in documents. You may use this
+ domain in literature without prior coordination or asking for permission.
+
More information...
+
+
+
diff --git a/public/sounds/typing.mp3 b/public/sounds/typing.mp3
new file mode 100644
index 00000000..5a9b52fc
--- /dev/null
+++ b/public/sounds/typing.mp3
@@ -0,0 +1,46 @@
+
+
+
+ Example Domain
+
+
+
+
+
+
+
+
+
+
Example Domain
+
This domain is for use in illustrative examples in documents. You may use this
+ domain in literature without prior coordination or asking for permission.
+
More information...
+
+
+
diff --git a/public/styles/output.css b/public/styles/output.css
new file mode 100644
index 00000000..cd05315b
--- /dev/null
+++ b/public/styles/output.css
@@ -0,0 +1,2801 @@
+/*
+! tailwindcss v3.1.8 | MIT License | https://tailwindcss.com
+*/
+
+/*
+1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
+2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
+*/
+
+*,
+::before,
+::after {
+ box-sizing: border-box;
+ /* 1 */
+ border-width: 0;
+ /* 2 */
+ border-style: solid;
+ /* 2 */
+ border-color: #e5e7eb;
+ /* 2 */
+}
+
+::before,
+::after {
+ --tw-content: '';
+}
+
+/*
+1. Use a consistent sensible line-height in all browsers.
+2. Prevent adjustments of font size after orientation changes in iOS.
+3. Use a more readable tab size.
+4. Use the user's configured `sans` font-family by default.
+*/
+
+html {
+ line-height: 1.5;
+ /* 1 */
+ -webkit-text-size-adjust: 100%;
+ /* 2 */
+ -moz-tab-size: 4;
+ /* 3 */
+ -o-tab-size: 4;
+ tab-size: 4;
+ /* 3 */
+ font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+ /* 4 */
+}
+
+/*
+1. Remove the margin in all browsers.
+2. Inherit line-height from `html` so users can set them as a class directly on the `html` element.
+*/
+
+body {
+ margin: 0;
+ /* 1 */
+ line-height: inherit;
+ /* 2 */
+}
+
+/*
+1. Add the correct height in Firefox.
+2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655)
+3. Ensure horizontal rules are visible by default.
+*/
+
+hr {
+ height: 0;
+ /* 1 */
+ color: inherit;
+ /* 2 */
+ border-top-width: 1px;
+ /* 3 */
+}
+
+/*
+Add the correct text decoration in Chrome, Edge, and Safari.
+*/
+
+abbr:where([title]) {
+ -webkit-text-decoration: underline dotted;
+ text-decoration: underline dotted;
+}
+
+/*
+Remove the default font size and weight for headings.
+*/
+
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ font-size: inherit;
+ font-weight: inherit;
+}
+
+/*
+Reset links to optimize for opt-in styling instead of opt-out.
+*/
+
+a {
+ color: inherit;
+ text-decoration: inherit;
+}
+
+/*
+Add the correct font weight in Edge and Safari.
+*/
+
+b,
+strong {
+ font-weight: bolder;
+}
+
+/*
+1. Use the user's configured `mono` font family by default.
+2. Correct the odd `em` font sizing in all browsers.
+*/
+
+code,
+kbd,
+samp,
+pre {
+ font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
+ /* 1 */
+ font-size: 1em;
+ /* 2 */
+}
+
+/*
+Add the correct font size in all browsers.
+*/
+
+small {
+ font-size: 80%;
+}
+
+/*
+Prevent `sub` and `sup` elements from affecting the line height in all browsers.
+*/
+
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+
+sub {
+ bottom: -0.25em;
+}
+
+sup {
+ top: -0.5em;
+}
+
+/*
+1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297)
+2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016)
+3. Remove gaps between table borders by default.
+*/
+
+table {
+ text-indent: 0;
+ /* 1 */
+ border-color: inherit;
+ /* 2 */
+ border-collapse: collapse;
+ /* 3 */
+}
+
+/*
+1. Change the font styles in all browsers.
+2. Remove the margin in Firefox and Safari.
+3. Remove default padding in all browsers.
+*/
+
+button,
+input,
+optgroup,
+select,
+textarea {
+ font-family: inherit;
+ /* 1 */
+ font-size: 100%;
+ /* 1 */
+ font-weight: inherit;
+ /* 1 */
+ line-height: inherit;
+ /* 1 */
+ color: inherit;
+ /* 1 */
+ margin: 0;
+ /* 2 */
+ padding: 0;
+ /* 3 */
+}
+
+/*
+Remove the inheritance of text transform in Edge and Firefox.
+*/
+
+button,
+select {
+ text-transform: none;
+}
+
+/*
+1. Correct the inability to style clickable types in iOS and Safari.
+2. Remove default button styles.
+*/
+
+button,
+[type='button'],
+[type='reset'],
+[type='submit'] {
+ -webkit-appearance: button;
+ /* 1 */
+ background-color: transparent;
+ /* 2 */
+ background-image: none;
+ /* 2 */
+}
+
+/*
+Use the modern Firefox focus style for all focusable elements.
+*/
+
+:-moz-focusring {
+ outline: auto;
+}
+
+/*
+Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737)
+*/
+
+:-moz-ui-invalid {
+ box-shadow: none;
+}
+
+/*
+Add the correct vertical alignment in Chrome and Firefox.
+*/
+
+progress {
+ vertical-align: baseline;
+}
+
+/*
+Correct the cursor style of increment and decrement buttons in Safari.
+*/
+
+::-webkit-inner-spin-button,
+::-webkit-outer-spin-button {
+ height: auto;
+}
+
+/*
+1. Correct the odd appearance in Chrome and Safari.
+2. Correct the outline style in Safari.
+*/
+
+[type='search'] {
+ -webkit-appearance: textfield;
+ /* 1 */
+ outline-offset: -2px;
+ /* 2 */
+}
+
+/*
+Remove the inner padding in Chrome and Safari on macOS.
+*/
+
+::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+/*
+1. Correct the inability to style clickable types in iOS and Safari.
+2. Change font properties to `inherit` in Safari.
+*/
+
+::-webkit-file-upload-button {
+ -webkit-appearance: button;
+ /* 1 */
+ font: inherit;
+ /* 2 */
+}
+
+/*
+Add the correct display in Chrome and Safari.
+*/
+
+summary {
+ display: list-item;
+}
+
+/*
+Removes the default spacing and border for appropriate elements.
+*/
+
+blockquote,
+dl,
+dd,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6,
+hr,
+figure,
+p,
+pre {
+ margin: 0;
+}
+
+fieldset {
+ margin: 0;
+ padding: 0;
+}
+
+legend {
+ padding: 0;
+}
+
+ol,
+ul,
+menu {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+}
+
+/*
+Prevent resizing textareas horizontally by default.
+*/
+
+textarea {
+ resize: vertical;
+}
+
+/*
+1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300)
+2. Set the default placeholder color to the user's configured gray 400 color.
+*/
+
+input::-moz-placeholder, textarea::-moz-placeholder {
+ opacity: 1;
+ /* 1 */
+ color: #9ca3af;
+ /* 2 */
+}
+
+input::placeholder,
+textarea::placeholder {
+ opacity: 1;
+ /* 1 */
+ color: #9ca3af;
+ /* 2 */
+}
+
+/*
+Set the default cursor for buttons.
+*/
+
+button,
+[role="button"] {
+ cursor: pointer;
+}
+
+/*
+Make sure disabled buttons don't get the pointer cursor.
+*/
+
+:disabled {
+ cursor: default;
+}
+
+/*
+1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14)
+2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210)
+ This can trigger a poorly considered lint error in some tools but is included by design.
+*/
+
+img,
+svg,
+video,
+canvas,
+audio,
+iframe,
+embed,
+object {
+ display: block;
+ /* 1 */
+ vertical-align: middle;
+ /* 2 */
+}
+
+/*
+Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14)
+*/
+
+img,
+video {
+ max-width: 100%;
+ height: auto;
+}
+
+*, ::before, ::after {
+ --tw-border-spacing-x: 0;
+ --tw-border-spacing-y: 0;
+ --tw-translate-x: 0;
+ --tw-translate-y: 0;
+ --tw-rotate: 0;
+ --tw-skew-x: 0;
+ --tw-skew-y: 0;
+ --tw-scale-x: 1;
+ --tw-scale-y: 1;
+ --tw-pan-x: ;
+ --tw-pan-y: ;
+ --tw-pinch-zoom: ;
+ --tw-scroll-snap-strictness: proximity;
+ --tw-ordinal: ;
+ --tw-slashed-zero: ;
+ --tw-numeric-figure: ;
+ --tw-numeric-spacing: ;
+ --tw-numeric-fraction: ;
+ --tw-ring-inset: ;
+ --tw-ring-offset-width: 0px;
+ --tw-ring-offset-color: #fff;
+ --tw-ring-color: rgb(59 130 246 / 0.5);
+ --tw-ring-offset-shadow: 0 0 #0000;
+ --tw-ring-shadow: 0 0 #0000;
+ --tw-shadow: 0 0 #0000;
+ --tw-shadow-colored: 0 0 #0000;
+ --tw-blur: ;
+ --tw-brightness: ;
+ --tw-contrast: ;
+ --tw-grayscale: ;
+ --tw-hue-rotate: ;
+ --tw-invert: ;
+ --tw-saturate: ;
+ --tw-sepia: ;
+ --tw-drop-shadow: ;
+ --tw-backdrop-blur: ;
+ --tw-backdrop-brightness: ;
+ --tw-backdrop-contrast: ;
+ --tw-backdrop-grayscale: ;
+ --tw-backdrop-hue-rotate: ;
+ --tw-backdrop-invert: ;
+ --tw-backdrop-opacity: ;
+ --tw-backdrop-saturate: ;
+ --tw-backdrop-sepia: ;
+}
+
+::backdrop {
+ --tw-border-spacing-x: 0;
+ --tw-border-spacing-y: 0;
+ --tw-translate-x: 0;
+ --tw-translate-y: 0;
+ --tw-rotate: 0;
+ --tw-skew-x: 0;
+ --tw-skew-y: 0;
+ --tw-scale-x: 1;
+ --tw-scale-y: 1;
+ --tw-pan-x: ;
+ --tw-pan-y: ;
+ --tw-pinch-zoom: ;
+ --tw-scroll-snap-strictness: proximity;
+ --tw-ordinal: ;
+ --tw-slashed-zero: ;
+ --tw-numeric-figure: ;
+ --tw-numeric-spacing: ;
+ --tw-numeric-fraction: ;
+ --tw-ring-inset: ;
+ --tw-ring-offset-width: 0px;
+ --tw-ring-offset-color: #fff;
+ --tw-ring-color: rgb(59 130 246 / 0.5);
+ --tw-ring-offset-shadow: 0 0 #0000;
+ --tw-ring-shadow: 0 0 #0000;
+ --tw-shadow: 0 0 #0000;
+ --tw-shadow-colored: 0 0 #0000;
+ --tw-blur: ;
+ --tw-brightness: ;
+ --tw-contrast: ;
+ --tw-grayscale: ;
+ --tw-hue-rotate: ;
+ --tw-invert: ;
+ --tw-saturate: ;
+ --tw-sepia: ;
+ --tw-drop-shadow: ;
+ --tw-backdrop-blur: ;
+ --tw-backdrop-brightness: ;
+ --tw-backdrop-contrast: ;
+ --tw-backdrop-grayscale: ;
+ --tw-backdrop-hue-rotate: ;
+ --tw-backdrop-invert: ;
+ --tw-backdrop-opacity: ;
+ --tw-backdrop-saturate: ;
+ --tw-backdrop-sepia: ;
+}
+
+.container {
+ width: 100%;
+}
+
+@media (min-width: 640px) {
+ .container {
+ max-width: 640px;
+ }
+}
+
+@media (min-width: 768px) {
+ .container {
+ max-width: 768px;
+ }
+}
+
+@media (min-width: 1024px) {
+ .container {
+ max-width: 1024px;
+ }
+}
+
+@media (min-width: 1280px) {
+ .container {
+ max-width: 1280px;
+ }
+}
+
+@media (min-width: 1536px) {
+ .container {
+ max-width: 1536px;
+ }
+}
+
+.sr-only {
+ position: absolute;
+ width: 1px;
+ height: 1px;
+ padding: 0;
+ margin: -1px;
+ overflow: hidden;
+ clip: rect(0, 0, 0, 0);
+ white-space: nowrap;
+ border-width: 0;
+}
+
+.pointer-events-none {
+ pointer-events: none;
+}
+
+.pointer-events-auto {
+ pointer-events: auto;
+}
+
+.visible {
+ visibility: visible;
+}
+
+.\!visible {
+ visibility: visible !important;
+}
+
+.invisible {
+ visibility: hidden;
+}
+
+.fixed {
+ position: fixed;
+}
+
+.absolute {
+ position: absolute;
+}
+
+.relative {
+ position: relative;
+}
+
+.inset-0 {
+ top: 0px;
+ right: 0px;
+ bottom: 0px;
+ left: 0px;
+}
+
+.inset-x-0 {
+ left: 0px;
+ right: 0px;
+}
+
+.inset-y-0 {
+ top: 0px;
+ bottom: 0px;
+}
+
+.left-\[50\%\] {
+ left: 50%;
+}
+
+.top-\[50\%\] {
+ top: 50%;
+}
+
+.left-1 {
+ left: 0.25rem;
+}
+
+.right-1 {
+ right: 0.25rem;
+}
+
+.left-2 {
+ left: 0.5rem;
+}
+
+.right-4 {
+ right: 1rem;
+}
+
+.top-4 {
+ top: 1rem;
+}
+
+.top-\[1px\] {
+ top: 1px;
+}
+
+.left-0 {
+ left: 0px;
+}
+
+.top-0 {
+ top: 0px;
+}
+
+.top-full {
+ top: 100%;
+}
+
+.top-\[60\%\] {
+ top: 60%;
+}
+
+.right-2 {
+ right: 0.5rem;
+}
+
+.bottom-0 {
+ bottom: 0px;
+}
+
+.right-0 {
+ right: 0px;
+}
+
+.top-1 {
+ top: 0.25rem;
+}
+
+.left-2\.5 {
+ left: 0.625rem;
+}
+
+.top-2\.5 {
+ top: 0.625rem;
+}
+
+.top-2 {
+ top: 0.5rem;
+}
+
+.z-50 {
+ z-index: 50;
+}
+
+.z-10 {
+ z-index: 10;
+}
+
+.z-\[1\] {
+ z-index: 1;
+}
+
+.z-\[100\] {
+ z-index: 100;
+}
+
+.z-0 {
+ z-index: 0;
+}
+
+.m-0 {
+ margin: 0px;
+}
+
+.my-4 {
+ margin-top: 1rem;
+ margin-bottom: 1rem;
+}
+
+.my-6 {
+ margin-top: 1.5rem;
+ margin-bottom: 1.5rem;
+}
+
+.-mx-1 {
+ margin-left: -0.25rem;
+ margin-right: -0.25rem;
+}
+
+.my-1 {
+ margin-top: 0.25rem;
+ margin-bottom: 0.25rem;
+}
+
+.mx-1 {
+ margin-left: 0.25rem;
+ margin-right: 0.25rem;
+}
+
+.mx-2 {
+ margin-left: 0.5rem;
+ margin-right: 0.5rem;
+}
+
+.mt-1 {
+ margin-top: 0.25rem;
+}
+
+.mb-4 {
+ margin-bottom: 1rem;
+}
+
+.mb-6 {
+ margin-bottom: 1.5rem;
+}
+
+.mb-1 {
+ margin-bottom: 0.25rem;
+}
+
+.mb-8 {
+ margin-bottom: 2rem;
+}
+
+.mt-2 {
+ margin-top: 0.5rem;
+}
+
+.mr-2 {
+ margin-right: 0.5rem;
+}
+
+.ml-auto {
+ margin-left: auto;
+}
+
+.ml-1 {
+ margin-left: 0.25rem;
+}
+
+.mt-1\.5 {
+ margin-top: 0.375rem;
+}
+
+.mt-4 {
+ margin-top: 1rem;
+}
+
+.ml-2 {
+ margin-left: 0.5rem;
+}
+
+.mt-auto {
+ margin-top: auto;
+}
+
+.mb-2 {
+ margin-bottom: 0.5rem;
+}
+
+.mb-3 {
+ margin-bottom: 0.75rem;
+}
+
+.ml-3 {
+ margin-left: 0.75rem;
+}
+
+.mr-4 {
+ margin-right: 1rem;
+}
+
+.ml-4 {
+ margin-left: 1rem;
+}
+
+.mb-5 {
+ margin-bottom: 1.25rem;
+}
+
+.block {
+ display: block;
+}
+
+.flex {
+ display: flex;
+}
+
+.inline-flex {
+ display: inline-flex;
+}
+
+.table {
+ display: table;
+}
+
+.grid {
+ display: grid;
+}
+
+.hidden {
+ display: none;
+}
+
+.aspect-square {
+ aspect-ratio: 1 / 1;
+}
+
+.aspect-\[3\/4\] {
+ aspect-ratio: 3/4;
+}
+
+.h-16 {
+ height: 4rem;
+}
+
+.h-screen {
+ height: 100vh;
+}
+
+.h-\[calc\(100vh-80px\)\] {
+ height: calc(100vh - 80px);
+}
+
+.h-4 {
+ height: 1rem;
+}
+
+.h-10 {
+ height: 2.5rem;
+}
+
+.h-full {
+ height: 100%;
+}
+
+.h-9 {
+ height: 2.25rem;
+}
+
+.h-8 {
+ height: 2rem;
+}
+
+.h-7 {
+ height: 1.75rem;
+}
+
+.h-px {
+ height: 1px;
+}
+
+.h-3\.5 {
+ height: 0.875rem;
+}
+
+.h-3 {
+ height: 0.75rem;
+}
+
+.h-2 {
+ height: 0.5rem;
+}
+
+.h-\[var\(--radix-navigation-menu-viewport-height\)\] {
+ height: var(--radix-navigation-menu-viewport-height);
+}
+
+.h-1\.5 {
+ height: 0.375rem;
+}
+
+.h-1 {
+ height: 0.25rem;
+}
+
+.h-2\.5 {
+ height: 0.625rem;
+}
+
+.h-\[var\(--radix-select-trigger-height\)\] {
+ height: var(--radix-select-trigger-height);
+}
+
+.h-\[1px\] {
+ height: 1px;
+}
+
+.h-5 {
+ height: 1.25rem;
+}
+
+.h-6 {
+ height: 1.5rem;
+}
+
+.h-\[52px\] {
+ height: 52px;
+}
+
+.max-h-\[300px\] {
+ max-height: 300px;
+}
+
+.max-h-\[--radix-context-menu-content-available-height\] {
+ max-height: --radix-context-menu-content-available-height;
+}
+
+.max-h-\[var\(--radix-dropdown-menu-content-available-height\)\] {
+ max-height: var(--radix-dropdown-menu-content-available-height);
+}
+
+.max-h-\[--radix-select-content-available-height\] {
+ max-height: --radix-select-content-available-height;
+}
+
+.max-h-screen {
+ max-height: 100vh;
+}
+
+.max-h-\[800px\] {
+ max-height: 800px;
+}
+
+.max-h-72 {
+ max-height: 18rem;
+}
+
+.min-h-screen {
+ min-height: 100vh;
+}
+
+.min-h-\[60px\] {
+ min-height: 60px;
+}
+
+.w-full {
+ width: 100%;
+}
+
+.w-64 {
+ width: 16rem;
+}
+
+.w-4 {
+ width: 1rem;
+}
+
+.w-10 {
+ width: 2.5rem;
+}
+
+.w-9 {
+ width: 2.25rem;
+}
+
+.w-7 {
+ width: 1.75rem;
+}
+
+.w-8 {
+ width: 2rem;
+}
+
+.w-3\.5 {
+ width: 0.875rem;
+}
+
+.w-3 {
+ width: 0.75rem;
+}
+
+.w-2 {
+ width: 0.5rem;
+}
+
+.w-max {
+ width: -moz-max-content;
+ width: max-content;
+}
+
+.w-72 {
+ width: 18rem;
+}
+
+.w-px {
+ width: 1px;
+}
+
+.w-2\.5 {
+ width: 0.625rem;
+}
+
+.w-\[1px\] {
+ width: 1px;
+}
+
+.w-3\/4 {
+ width: 75%;
+}
+
+.w-56 {
+ width: 14rem;
+}
+
+.w-48 {
+ width: 12rem;
+}
+
+.w-\[535px\] {
+ width: 535px;
+}
+
+.min-w-\[8rem\] {
+ min-width: 8rem;
+}
+
+.min-w-\[12rem\] {
+ min-width: 12rem;
+}
+
+.min-w-\[var\(--radix-select-trigger-width\)\] {
+ min-width: var(--radix-select-trigger-width);
+}
+
+.min-w-\[250px\] {
+ min-width: 250px;
+}
+
+.min-w-\[50px\] {
+ min-width: 50px;
+}
+
+.min-w-full {
+ min-width: 100%;
+}
+
+.max-w-lg {
+ max-width: 32rem;
+}
+
+.max-w-max {
+ max-width: -moz-max-content;
+ max-width: max-content;
+}
+
+.max-w-md {
+ max-width: 28rem;
+}
+
+.flex-1 {
+ flex: 1 1 0%;
+}
+
+.flex-shrink-0 {
+ flex-shrink: 0;
+}
+
+.shrink-0 {
+ flex-shrink: 0;
+}
+
+.flex-grow {
+ flex-grow: 1;
+}
+
+.grow {
+ flex-grow: 1;
+}
+
+.border-collapse {
+ border-collapse: collapse;
+}
+
+.origin-\[--radix-context-menu-content-transform-origin\] {
+ transform-origin: --radix-context-menu-content-transform-origin;
+}
+
+.origin-\[--radix-dropdown-menu-content-transform-origin\] {
+ transform-origin: --radix-dropdown-menu-content-transform-origin;
+}
+
+.origin-\[--radix-hover-card-content-transform-origin\] {
+ transform-origin: --radix-hover-card-content-transform-origin;
+}
+
+.origin-\[--radix-menubar-content-transform-origin\] {
+ transform-origin: --radix-menubar-content-transform-origin;
+}
+
+.origin-\[--radix-popover-content-transform-origin\] {
+ transform-origin: --radix-popover-content-transform-origin;
+}
+
+.origin-\[--radix-select-content-transform-origin\] {
+ transform-origin: --radix-select-content-transform-origin;
+}
+
+.origin-\[--radix-tooltip-content-transform-origin\] {
+ transform-origin: --radix-tooltip-content-transform-origin;
+}
+
+.origin-top-right {
+ transform-origin: top right;
+}
+
+.translate-x-\[-50\%\] {
+ --tw-translate-x: -50%;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.translate-y-\[-50\%\] {
+ --tw-translate-y: -50%;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.rotate-45 {
+ --tw-rotate: 45deg;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.transform {
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+@keyframes pulse {
+ 50% {
+ opacity: .5;
+ }
+}
+
+.animate-pulse {
+ animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
+}
+
+.cursor-default {
+ cursor: default;
+}
+
+.cursor-pointer {
+ cursor: pointer;
+}
+
+.touch-none {
+ touch-action: none;
+}
+
+.select-none {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ user-select: none;
+}
+
+.list-none {
+ list-style-type: none;
+}
+
+.flex-col {
+ flex-direction: column;
+}
+
+.flex-col-reverse {
+ flex-direction: column-reverse;
+}
+
+.flex-wrap {
+ flex-wrap: wrap;
+}
+
+.items-start {
+ align-items: flex-start;
+}
+
+.items-end {
+ align-items: flex-end;
+}
+
+.items-center {
+ align-items: center;
+}
+
+.items-stretch {
+ align-items: stretch;
+}
+
+.justify-start {
+ justify-content: flex-start;
+}
+
+.justify-end {
+ justify-content: flex-end;
+}
+
+.justify-center {
+ justify-content: center;
+}
+
+.justify-between {
+ justify-content: space-between;
+}
+
+.justify-around {
+ justify-content: space-around;
+}
+
+.gap-4 {
+ gap: 1rem;
+}
+
+.gap-6 {
+ gap: 1.5rem;
+}
+
+.gap-2 {
+ gap: 0.5rem;
+}
+
+.gap-1 {
+ gap: 0.25rem;
+}
+
+.gap-3 {
+ gap: 0.75rem;
+}
+
+.space-x-4 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-x-reverse: 0;
+ margin-right: calc(1rem * var(--tw-space-x-reverse));
+ margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse)));
+}
+
+.space-y-4 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-y-reverse: 0;
+ margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse)));
+ margin-bottom: calc(1rem * var(--tw-space-y-reverse));
+}
+
+.space-x-2 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-x-reverse: 0;
+ margin-right: calc(0.5rem * var(--tw-space-x-reverse));
+ margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse)));
+}
+
+.space-y-6 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-y-reverse: 0;
+ margin-top: calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));
+ margin-bottom: calc(1.5rem * var(--tw-space-y-reverse));
+}
+
+.space-y-2 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-y-reverse: 0;
+ margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse)));
+ margin-bottom: calc(0.5rem * var(--tw-space-y-reverse));
+}
+
+.space-x-1 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-x-reverse: 0;
+ margin-right: calc(0.25rem * var(--tw-space-x-reverse));
+ margin-left: calc(0.25rem * calc(1 - var(--tw-space-x-reverse)));
+}
+
+.space-y-1 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-y-reverse: 0;
+ margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse)));
+ margin-bottom: calc(0.25rem * var(--tw-space-y-reverse));
+}
+
+.space-y-1\.5 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-y-reverse: 0;
+ margin-top: calc(0.375rem * calc(1 - var(--tw-space-y-reverse)));
+ margin-bottom: calc(0.375rem * var(--tw-space-y-reverse));
+}
+
+.space-x-3 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-x-reverse: 0;
+ margin-right: calc(0.75rem * var(--tw-space-x-reverse));
+ margin-left: calc(0.75rem * calc(1 - var(--tw-space-x-reverse)));
+}
+
+.space-y-3 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-y-reverse: 0;
+ margin-top: calc(0.75rem * calc(1 - var(--tw-space-y-reverse)));
+ margin-bottom: calc(0.75rem * var(--tw-space-y-reverse));
+}
+
+.-space-x-px > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-x-reverse: 0;
+ margin-right: calc(-1px * var(--tw-space-x-reverse));
+ margin-left: calc(-1px * calc(1 - var(--tw-space-x-reverse)));
+}
+
+.divide-y > :not([hidden]) ~ :not([hidden]) {
+ --tw-divide-y-reverse: 0;
+ border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse)));
+ border-bottom-width: calc(1px * var(--tw-divide-y-reverse));
+}
+
+.divide-gray-200 > :not([hidden]) ~ :not([hidden]) {
+ --tw-divide-opacity: 1;
+ border-color: rgb(229 231 235 / var(--tw-divide-opacity));
+}
+
+.overflow-auto {
+ overflow: auto;
+}
+
+.overflow-hidden {
+ overflow: hidden;
+}
+
+.overflow-x-auto {
+ overflow-x: auto;
+}
+
+.overflow-y-auto {
+ overflow-y: auto;
+}
+
+.overflow-x-hidden {
+ overflow-x: hidden;
+}
+
+.whitespace-nowrap {
+ white-space: nowrap;
+}
+
+.whitespace-pre-wrap {
+ white-space: pre-wrap;
+}
+
+.rounded {
+ border-radius: 0.25rem;
+}
+
+.rounded-lg {
+ border-radius: var(--radius);
+}
+
+.rounded-full {
+ border-radius: 9999px;
+}
+
+.rounded-md {
+ border-radius: calc(var(--radius) - 2px);
+}
+
+.rounded-xl {
+ border-radius: 0.75rem;
+}
+
+.rounded-sm {
+ border-radius: calc(var(--radius) - 4px);
+}
+
+.rounded-\[inherit\] {
+ border-radius: inherit;
+}
+
+.rounded-l-md {
+ border-top-left-radius: calc(var(--radius) - 2px);
+ border-bottom-left-radius: calc(var(--radius) - 2px);
+}
+
+.rounded-r-md {
+ border-top-right-radius: calc(var(--radius) - 2px);
+ border-bottom-right-radius: calc(var(--radius) - 2px);
+}
+
+.rounded-tl-sm {
+ border-top-left-radius: calc(var(--radius) - 4px);
+}
+
+.border {
+ border-width: 1px;
+}
+
+.border-2 {
+ border-width: 2px;
+}
+
+.border-b {
+ border-bottom-width: 1px;
+}
+
+.border-t {
+ border-top-width: 1px;
+}
+
+.border-r {
+ border-right-width: 1px;
+}
+
+.border-l {
+ border-left-width: 1px;
+}
+
+.border-gray-200 {
+ --tw-border-opacity: 1;
+ border-color: rgb(229 231 235 / var(--tw-border-opacity));
+}
+
+.border-red-500 {
+ --tw-border-opacity: 1;
+ border-color: rgb(239 68 68 / var(--tw-border-opacity));
+}
+
+.border-gray-300 {
+ --tw-border-opacity: 1;
+ border-color: rgb(209 213 219 / var(--tw-border-opacity));
+}
+
+.border-destructive\/50 {
+ border-color: hsl(var(--destructive) / 0.5);
+}
+
+.border-transparent {
+ border-color: transparent;
+}
+
+.border-input {
+ border-color: hsl(var(--input));
+}
+
+.border-primary {
+ border-color: hsl(var(--primary));
+}
+
+.border-primary\/50 {
+ border-color: hsl(var(--primary) / 0.5);
+}
+
+.border-destructive {
+ border-color: hsl(var(--destructive));
+}
+
+.border-l-transparent {
+ border-left-color: transparent;
+}
+
+.border-t-transparent {
+ border-top-color: transparent;
+}
+
+.bg-gray-50 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(249 250 251 / var(--tw-bg-opacity));
+}
+
+.bg-white {
+ --tw-bg-opacity: 1;
+ background-color: rgb(255 255 255 / var(--tw-bg-opacity));
+}
+
+.bg-blue-500 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(59 130 246 / var(--tw-bg-opacity));
+}
+
+.bg-black\/80 {
+ background-color: rgb(0 0 0 / 0.8);
+}
+
+.bg-background {
+ background-color: hsl(var(--background));
+}
+
+.bg-muted {
+ background-color: hsl(var(--muted));
+}
+
+.bg-primary {
+ background-color: hsl(var(--primary));
+}
+
+.bg-secondary {
+ background-color: hsl(var(--secondary));
+}
+
+.bg-destructive {
+ background-color: hsl(var(--destructive));
+}
+
+.bg-transparent {
+ background-color: transparent;
+}
+
+.bg-accent {
+ background-color: hsl(var(--accent));
+}
+
+.bg-card {
+ background-color: hsl(var(--card));
+}
+
+.bg-popover {
+ background-color: hsl(var(--popover));
+}
+
+.bg-border {
+ background-color: hsl(var(--border));
+}
+
+.bg-primary\/20 {
+ background-color: hsl(var(--primary) / 0.2);
+}
+
+.bg-primary\/10 {
+ background-color: hsl(var(--primary) / 0.1);
+}
+
+.bg-muted\/50 {
+ background-color: hsl(var(--muted) / 0.5);
+}
+
+.bg-gray-200 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(229 231 235 / var(--tw-bg-opacity));
+}
+
+.bg-black {
+ --tw-bg-opacity: 1;
+ background-color: rgb(0 0 0 / var(--tw-bg-opacity));
+}
+
+.bg-green-500 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(34 197 94 / var(--tw-bg-opacity));
+}
+
+.bg-blue-600 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(37 99 235 / var(--tw-bg-opacity));
+}
+
+.bg-background\/95 {
+ background-color: hsl(var(--background) / 0.95);
+}
+
+.bg-gray-100 {
+ --tw-bg-opacity: 1;
+ background-color: rgb(243 244 246 / var(--tw-bg-opacity));
+}
+
+.bg-opacity-50 {
+ --tw-bg-opacity: 0.5;
+}
+
+.fill-current {
+ fill: currentColor;
+}
+
+.fill-primary {
+ fill: hsl(var(--primary));
+}
+
+.object-cover {
+ -o-object-fit: cover;
+ object-fit: cover;
+}
+
+.p-4 {
+ padding: 1rem;
+}
+
+.p-6 {
+ padding: 1.5rem;
+}
+
+.p-5 {
+ padding: 1.25rem;
+}
+
+.p-2 {
+ padding: 0.5rem;
+}
+
+.p-3 {
+ padding: 0.75rem;
+}
+
+.p-0 {
+ padding: 0px;
+}
+
+.p-1 {
+ padding: 0.25rem;
+}
+
+.p-\[1px\] {
+ padding: 1px;
+}
+
+.p-8 {
+ padding: 2rem;
+}
+
+.px-4 {
+ padding-left: 1rem;
+ padding-right: 1rem;
+}
+
+.py-2 {
+ padding-top: 0.5rem;
+ padding-bottom: 0.5rem;
+}
+
+.px-6 {
+ padding-left: 1.5rem;
+ padding-right: 1.5rem;
+}
+
+.py-4 {
+ padding-top: 1rem;
+ padding-bottom: 1rem;
+}
+
+.py-3 {
+ padding-top: 0.75rem;
+ padding-bottom: 0.75rem;
+}
+
+.px-2\.5 {
+ padding-left: 0.625rem;
+ padding-right: 0.625rem;
+}
+
+.py-0\.5 {
+ padding-top: 0.125rem;
+ padding-bottom: 0.125rem;
+}
+
+.px-2 {
+ padding-left: 0.5rem;
+ padding-right: 0.5rem;
+}
+
+.py-0 {
+ padding-top: 0px;
+ padding-bottom: 0px;
+}
+
+.px-3 {
+ padding-left: 0.75rem;
+ padding-right: 0.75rem;
+}
+
+.px-8 {
+ padding-left: 2rem;
+ padding-right: 2rem;
+}
+
+.py-6 {
+ padding-top: 1.5rem;
+ padding-bottom: 1.5rem;
+}
+
+.py-1\.5 {
+ padding-top: 0.375rem;
+ padding-bottom: 0.375rem;
+}
+
+.py-1 {
+ padding-top: 0.25rem;
+ padding-bottom: 0.25rem;
+}
+
+.px-1\.5 {
+ padding-left: 0.375rem;
+ padding-right: 0.375rem;
+}
+
+.px-1 {
+ padding-left: 0.25rem;
+ padding-right: 0.25rem;
+}
+
+.pb-4 {
+ padding-bottom: 1rem;
+}
+
+.pt-0 {
+ padding-top: 0px;
+}
+
+.pt-1 {
+ padding-top: 0.25rem;
+}
+
+.pl-8 {
+ padding-left: 2rem;
+}
+
+.pr-2 {
+ padding-right: 0.5rem;
+}
+
+.pl-2 {
+ padding-left: 0.5rem;
+}
+
+.pr-8 {
+ padding-right: 2rem;
+}
+
+.pr-6 {
+ padding-right: 1.5rem;
+}
+
+.pr-4 {
+ padding-right: 1rem;
+}
+
+.pl-4 {
+ padding-left: 1rem;
+}
+
+.text-left {
+ text-align: left;
+}
+
+.text-center {
+ text-align: center;
+}
+
+.align-middle {
+ vertical-align: middle;
+}
+
+.text-2xl {
+ font-size: 1.5rem;
+ line-height: 2rem;
+}
+
+.text-sm {
+ font-size: 0.875rem;
+ line-height: 1.25rem;
+}
+
+.text-xs {
+ font-size: 0.75rem;
+ line-height: 1rem;
+}
+
+.text-lg {
+ font-size: 1.125rem;
+ line-height: 1.75rem;
+}
+
+.text-\[0\.8rem\] {
+ font-size: 0.8rem;
+}
+
+.text-base {
+ font-size: 1rem;
+ line-height: 1.5rem;
+}
+
+.text-xl {
+ font-size: 1.25rem;
+ line-height: 1.75rem;
+}
+
+.font-bold {
+ font-weight: 700;
+}
+
+.font-medium {
+ font-weight: 500;
+}
+
+.font-semibold {
+ font-weight: 600;
+}
+
+.font-normal {
+ font-weight: 400;
+}
+
+.uppercase {
+ text-transform: uppercase;
+}
+
+.leading-none {
+ line-height: 1;
+}
+
+.tracking-tight {
+ letter-spacing: -0.025em;
+}
+
+.tracking-widest {
+ letter-spacing: 0.1em;
+}
+
+.tracking-wider {
+ letter-spacing: 0.05em;
+}
+
+.text-white {
+ --tw-text-opacity: 1;
+ color: rgb(255 255 255 / var(--tw-text-opacity));
+}
+
+.text-gray-500 {
+ --tw-text-opacity: 1;
+ color: rgb(107 114 128 / var(--tw-text-opacity));
+}
+
+.text-red-500 {
+ --tw-text-opacity: 1;
+ color: rgb(239 68 68 / var(--tw-text-opacity));
+}
+
+.text-gray-900 {
+ --tw-text-opacity: 1;
+ color: rgb(17 24 39 / var(--tw-text-opacity));
+}
+
+.text-muted-foreground {
+ color: hsl(var(--muted-foreground));
+}
+
+.text-foreground {
+ color: hsl(var(--foreground));
+}
+
+.text-destructive {
+ color: hsl(var(--destructive));
+}
+
+.text-primary-foreground {
+ color: hsl(var(--primary-foreground));
+}
+
+.text-secondary-foreground {
+ color: hsl(var(--secondary-foreground));
+}
+
+.text-destructive-foreground {
+ color: hsl(var(--destructive-foreground));
+}
+
+.text-primary {
+ color: hsl(var(--primary));
+}
+
+.text-accent-foreground {
+ color: hsl(var(--accent-foreground));
+}
+
+.text-card-foreground {
+ color: hsl(var(--card-foreground));
+}
+
+.text-current {
+ color: currentColor;
+}
+
+.text-popover-foreground {
+ color: hsl(var(--popover-foreground));
+}
+
+.text-foreground\/50 {
+ color: hsl(var(--foreground) / 0.5);
+}
+
+.text-gray-400 {
+ --tw-text-opacity: 1;
+ color: rgb(156 163 175 / var(--tw-text-opacity));
+}
+
+.text-zinc-600 {
+ --tw-text-opacity: 1;
+ color: rgb(82 82 91 / var(--tw-text-opacity));
+}
+
+.text-background {
+ color: hsl(var(--background));
+}
+
+.text-blue-600 {
+ --tw-text-opacity: 1;
+ color: rgb(37 99 235 / var(--tw-text-opacity));
+}
+
+.text-blue-500 {
+ --tw-text-opacity: 1;
+ color: rgb(59 130 246 / var(--tw-text-opacity));
+}
+
+.text-gray-700 {
+ --tw-text-opacity: 1;
+ color: rgb(55 65 81 / var(--tw-text-opacity));
+}
+
+.underline-offset-4 {
+ text-underline-offset: 4px;
+}
+
+.opacity-50 {
+ opacity: 0.5;
+}
+
+.opacity-70 {
+ opacity: 0.7;
+}
+
+.opacity-60 {
+ opacity: 0.6;
+}
+
+.opacity-0 {
+ opacity: 0;
+}
+
+.opacity-90 {
+ opacity: 0.9;
+}
+
+.shadow-lg {
+ --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1);
+ --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.shadow {
+ --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1);
+ --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.shadow-sm {
+ --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05);
+ --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.shadow-md {
+ --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
+ --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);
+ box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow);
+}
+
+.outline-none {
+ outline: 2px solid transparent;
+ outline-offset: 2px;
+}
+
+.outline {
+ outline-style: solid;
+}
+
+.ring-0 {
+ --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(0px + 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);
+}
+
+.ring-1 {
+ --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, 0 0 #0000);
+}
+
+.ring-black {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(0 0 0 / var(--tw-ring-opacity));
+}
+
+.ring-opacity-5 {
+ --tw-ring-opacity: 0.05;
+}
+
+.ring-offset-background {
+ --tw-ring-offset-color: hsl(var(--background));
+}
+
+.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);
+}
+
+.backdrop-blur {
+ --tw-backdrop-blur: blur(8px);
+ -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
+ backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
+}
+
+.backdrop-filter {
+ -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
+ backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);
+}
+
+.transition-all {
+ transition-property: all;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+}
+
+.transition-transform {
+ transition-property: transform;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+}
+
+.transition-colors {
+ transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+}
+
+.transition-opacity {
+ transition-property: opacity;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+}
+
+.transition {
+ transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter;
+ transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;
+ transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter;
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+ transition-duration: 150ms;
+}
+
+.duration-200 {
+ transition-duration: 200ms;
+}
+
+.duration-300 {
+ transition-duration: 300ms;
+}
+
+.ease-in-out {
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+@keyframes enter {
+ from {
+ opacity: var(--tw-enter-opacity, 1);
+ transform: translate3d(var(--tw-enter-translate-x, 0), var(--tw-enter-translate-y, 0), 0) scale3d(var(--tw-enter-scale, 1), var(--tw-enter-scale, 1), var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0));
+ }
+}
+
+@keyframes exit {
+ to {
+ opacity: var(--tw-exit-opacity, 1);
+ transform: translate3d(var(--tw-exit-translate-x, 0), var(--tw-exit-translate-y, 0), 0) scale3d(var(--tw-exit-scale, 1), var(--tw-exit-scale, 1), var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0));
+ }
+}
+
+.animate-in {
+ animation-name: enter;
+ animation-duration: 150ms;
+ --tw-enter-opacity: initial;
+ --tw-enter-scale: initial;
+ --tw-enter-rotate: initial;
+ --tw-enter-translate-x: initial;
+ --tw-enter-translate-y: initial;
+}
+
+.fade-in-0 {
+ --tw-enter-opacity: 0;
+}
+
+.zoom-in-95 {
+ --tw-enter-scale: .95;
+}
+
+.duration-200 {
+ animation-duration: 200ms;
+}
+
+.duration-300 {
+ animation-duration: 300ms;
+}
+
+.ease-in-out {
+ animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+.file\:border-0::file-selector-button {
+ border-width: 0px;
+}
+
+.file\:bg-transparent::file-selector-button {
+ background-color: transparent;
+}
+
+.file\:text-sm::file-selector-button {
+ font-size: 0.875rem;
+ line-height: 1.25rem;
+}
+
+.file\:font-medium::file-selector-button {
+ font-weight: 500;
+}
+
+.file\:text-foreground::file-selector-button {
+ color: hsl(var(--foreground));
+}
+
+.placeholder\:text-muted-foreground::-moz-placeholder {
+ color: hsl(var(--muted-foreground));
+}
+
+.placeholder\:text-muted-foreground::placeholder {
+ color: hsl(var(--muted-foreground));
+}
+
+.after\:absolute::after {
+ content: var(--tw-content);
+ position: absolute;
+}
+
+.after\:inset-y-0::after {
+ content: var(--tw-content);
+ top: 0px;
+ bottom: 0px;
+}
+
+.after\:left-1\/2::after {
+ content: var(--tw-content);
+ left: 50%;
+}
+
+.after\:w-1::after {
+ content: var(--tw-content);
+ width: 0.25rem;
+}
+
+.after\:-translate-x-1\/2::after {
+ content: var(--tw-content);
+ --tw-translate-x: -50%;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.focus-within\:relative:focus-within {
+ position: relative;
+}
+
+.focus-within\:z-20:focus-within {
+ z-index: 20;
+}
+
+.hover\:scale-105:hover {
+ --tw-scale-x: 1.05;
+ --tw-scale-y: 1.05;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.hover\:bg-blue-600:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(37 99 235 / var(--tw-bg-opacity));
+}
+
+.hover\:bg-primary\/80:hover {
+ background-color: hsl(var(--primary) / 0.8);
+}
+
+.hover\:bg-secondary\/80:hover {
+ background-color: hsl(var(--secondary) / 0.8);
+}
+
+.hover\:bg-destructive\/80:hover {
+ background-color: hsl(var(--destructive) / 0.8);
+}
+
+.hover\:bg-primary\/90:hover {
+ background-color: hsl(var(--primary) / 0.9);
+}
+
+.hover\:bg-destructive\/90:hover {
+ background-color: hsl(var(--destructive) / 0.9);
+}
+
+.hover\:bg-accent:hover {
+ background-color: hsl(var(--accent));
+}
+
+.hover\:bg-primary:hover {
+ background-color: hsl(var(--primary));
+}
+
+.hover\:bg-muted\/50:hover {
+ background-color: hsl(var(--muted) / 0.5);
+}
+
+.hover\:bg-secondary:hover {
+ background-color: hsl(var(--secondary));
+}
+
+.hover\:bg-muted:hover {
+ background-color: hsl(var(--muted));
+}
+
+.hover\:bg-gray-100:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(243 244 246 / var(--tw-bg-opacity));
+}
+
+.hover\:bg-green-600:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(22 163 74 / var(--tw-bg-opacity));
+}
+
+.hover\:bg-gray-50:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(249 250 251 / var(--tw-bg-opacity));
+}
+
+.hover\:bg-blue-700:hover {
+ --tw-bg-opacity: 1;
+ background-color: rgb(29 78 216 / var(--tw-bg-opacity));
+}
+
+.hover\:text-accent-foreground:hover {
+ color: hsl(var(--accent-foreground));
+}
+
+.hover\:text-primary-foreground:hover {
+ color: hsl(var(--primary-foreground));
+}
+
+.hover\:text-foreground:hover {
+ color: hsl(var(--foreground));
+}
+
+.hover\:text-muted-foreground:hover {
+ color: hsl(var(--muted-foreground));
+}
+
+.hover\:text-primary:hover {
+ color: hsl(var(--primary));
+}
+
+.hover\:text-blue-700:hover {
+ --tw-text-opacity: 1;
+ color: rgb(29 78 216 / var(--tw-text-opacity));
+}
+
+.hover\:underline:hover {
+ text-decoration-line: underline;
+}
+
+.hover\:opacity-100:hover {
+ opacity: 1;
+}
+
+.focus\:border-indigo-300:focus {
+ --tw-border-opacity: 1;
+ border-color: rgb(165 180 252 / var(--tw-border-opacity));
+}
+
+.focus\:border-indigo-500:focus {
+ --tw-border-opacity: 1;
+ border-color: rgb(99 102 241 / var(--tw-border-opacity));
+}
+
+.focus\:bg-primary:focus {
+ background-color: hsl(var(--primary));
+}
+
+.focus\:bg-accent:focus {
+ background-color: hsl(var(--accent));
+}
+
+.focus\:text-primary-foreground:focus {
+ color: hsl(var(--primary-foreground));
+}
+
+.focus\:text-accent-foreground:focus {
+ color: hsl(var(--accent-foreground));
+}
+
+.focus\:opacity-100:focus {
+ opacity: 1;
+}
+
+.focus\:outline-none:focus {
+ outline: 2px solid transparent;
+ outline-offset: 2px;
+}
+
+.focus\:ring-2:focus {
+ --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, 0 0 #0000);
+}
+
+.focus\:ring-1:focus {
+ --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, 0 0 #0000);
+}
+
+.focus\:ring:focus {
+ --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(3px + 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);
+}
+
+.focus\:ring-ring:focus {
+ --tw-ring-color: hsl(var(--ring));
+}
+
+.focus\:ring-blue-500:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity));
+}
+
+.focus\:ring-indigo-200:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(199 210 254 / var(--tw-ring-opacity));
+}
+
+.focus\:ring-indigo-500:focus {
+ --tw-ring-opacity: 1;
+ --tw-ring-color: rgb(99 102 241 / var(--tw-ring-opacity));
+}
+
+.focus\:ring-opacity-50:focus {
+ --tw-ring-opacity: 0.5;
+}
+
+.focus\:ring-offset-2:focus {
+ --tw-ring-offset-width: 2px;
+}
+
+.focus-visible\:outline-none:focus-visible {
+ outline: 2px solid transparent;
+ outline-offset: 2px;
+}
+
+.focus-visible\:ring-1:focus-visible {
+ --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, 0 0 #0000);
+}
+
+.focus-visible\:ring-2:focus-visible {
+ --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, 0 0 #0000);
+}
+
+.focus-visible\:ring-ring:focus-visible {
+ --tw-ring-color: hsl(var(--ring));
+}
+
+.focus-visible\:ring-offset-1:focus-visible {
+ --tw-ring-offset-width: 1px;
+}
+
+.focus-visible\:ring-offset-2:focus-visible {
+ --tw-ring-offset-width: 2px;
+}
+
+.focus-visible\:ring-offset-background:focus-visible {
+ --tw-ring-offset-color: hsl(var(--background));
+}
+
+.disabled\:pointer-events-none:disabled {
+ pointer-events: none;
+}
+
+.disabled\:cursor-not-allowed:disabled {
+ cursor: not-allowed;
+}
+
+.disabled\:opacity-50:disabled {
+ opacity: 0.5;
+}
+
+.group:hover .group-hover\:opacity-100 {
+ opacity: 1;
+}
+
+.peer:disabled ~ .peer-disabled\:cursor-not-allowed {
+ cursor: not-allowed;
+}
+
+.peer:disabled ~ .peer-disabled\:opacity-70 {
+ opacity: 0.7;
+}
+
+.dark .dark\:block {
+ display: block;
+}
+
+.dark .dark\:hidden {
+ display: none;
+}
+
+.dark .dark\:border-destructive {
+ border-color: hsl(var(--destructive));
+}
+
+.dark .dark\:bg-muted {
+ background-color: hsl(var(--muted));
+}
+
+.dark .dark\:text-zinc-200 {
+ --tw-text-opacity: 1;
+ color: rgb(228 228 231 / var(--tw-text-opacity));
+}
+
+.dark .dark\:text-muted-foreground {
+ color: hsl(var(--muted-foreground));
+}
+
+.dark .dark\:text-white {
+ --tw-text-opacity: 1;
+ color: rgb(255 255 255 / var(--tw-text-opacity));
+}
+
+.dark .dark\:hover\:bg-muted:hover {
+ background-color: hsl(var(--muted));
+}
+
+.dark .dark\:hover\:text-white:hover {
+ --tw-text-opacity: 1;
+ color: rgb(255 255 255 / var(--tw-text-opacity));
+}
+
+@media (min-width: 640px) {
+ .sm\:bottom-0 {
+ bottom: 0px;
+ }
+
+ .sm\:right-0 {
+ right: 0px;
+ }
+
+ .sm\:top-auto {
+ top: auto;
+ }
+
+ .sm\:mt-0 {
+ margin-top: 0px;
+ }
+
+ .sm\:flex {
+ display: flex;
+ }
+
+ .sm\:hidden {
+ display: none;
+ }
+
+ .sm\:max-w-sm {
+ max-width: 24rem;
+ }
+
+ .sm\:flex-1 {
+ flex: 1 1 0%;
+ }
+
+ .sm\:flex-row {
+ flex-direction: row;
+ }
+
+ .sm\:flex-col {
+ flex-direction: column;
+ }
+
+ .sm\:items-center {
+ align-items: center;
+ }
+
+ .sm\:justify-end {
+ justify-content: flex-end;
+ }
+
+ .sm\:justify-between {
+ justify-content: space-between;
+ }
+
+ .sm\:space-x-2 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-x-reverse: 0;
+ margin-right: calc(0.5rem * var(--tw-space-x-reverse));
+ margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse)));
+ }
+
+ .sm\:space-x-4 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-x-reverse: 0;
+ margin-right: calc(1rem * var(--tw-space-x-reverse));
+ margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse)));
+ }
+
+ .sm\:space-y-0 > :not([hidden]) ~ :not([hidden]) {
+ --tw-space-y-reverse: 0;
+ margin-top: calc(0px * calc(1 - var(--tw-space-y-reverse)));
+ margin-bottom: calc(0px * var(--tw-space-y-reverse));
+ }
+
+ .sm\:rounded-lg {
+ border-radius: var(--radius);
+ }
+
+ .sm\:text-left {
+ text-align: left;
+ }
+}
+
+@media (min-width: 768px) {
+ .md\:absolute {
+ position: absolute;
+ }
+
+ .md\:flex {
+ display: flex;
+ }
+
+ .md\:hidden {
+ display: none;
+ }
+
+ .md\:w-1\/4 {
+ width: 25%;
+ }
+
+ .md\:w-auto {
+ width: auto;
+ }
+
+ .md\:w-\[var\(--radix-navigation-menu-viewport-width\)\] {
+ width: var(--radix-navigation-menu-viewport-width);
+ }
+
+ .md\:max-w-\[420px\] {
+ max-width: 420px;
+ }
+
+ .md\:grid-cols-2 {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ }
+
+ .md\:flex-row {
+ flex-direction: row;
+ }
+
+ .md\:text-sm {
+ font-size: 0.875rem;
+ line-height: 1.25rem;
+ }
+}
+
+@media (min-width: 1024px) {
+ .lg\:grid-cols-4 {
+ grid-template-columns: repeat(4, minmax(0, 1fr));
+ }
+}
+
+.\[\&\[data-state\=open\]\>svg\]\:rotate-180[data-state=open]>svg {
+ --tw-rotate: 180deg;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.\[\&\>svg\+div\]\:translate-y-\[-3px\]>svg+div {
+ --tw-translate-y: -3px;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.\[\&\>svg\]\:absolute>svg {
+ position: absolute;
+}
+
+.\[\&\>svg\]\:left-4>svg {
+ left: 1rem;
+}
+
+.\[\&\>svg\]\:top-4>svg {
+ top: 1rem;
+}
+
+.\[\&\>svg\]\:hidden>svg {
+ display: none;
+}
+
+.\[\&\>svg\]\:shrink-0>svg {
+ flex-shrink: 0;
+}
+
+.\[\&\>svg\]\:text-foreground>svg {
+ color: hsl(var(--foreground));
+}
+
+.\[\&\>svg\]\:text-destructive>svg {
+ color: hsl(var(--destructive));
+}
+
+.\[\&\>svg\~\*\]\:pl-7>svg~* {
+ padding-left: 1.75rem;
+}
+
+.\[\&_p\]\:leading-relaxed p {
+ line-height: 1.625;
+}
+
+.\[\&_svg\]\:pointer-events-none svg {
+ pointer-events: none;
+}
+
+.\[\&_svg\]\:h-4 svg {
+ height: 1rem;
+}
+
+.\[\&_svg\]\:w-4 svg {
+ width: 1rem;
+}
+
+.\[\&_svg\]\:shrink-0 svg {
+ flex-shrink: 0;
+}
+
+.\[\&_svg\]\:text-foreground svg {
+ color: hsl(var(--foreground));
+}
+
+.\[\&\:has\(\[aria-selected\]\)\]\:rounded-md:has([aria-selected]) {
+ border-radius: calc(var(--radius) - 2px);
+}
+
+.\[\&\:has\(\[aria-selected\]\)\]\:bg-accent:has([aria-selected]) {
+ background-color: hsl(var(--accent));
+}
+
+.first\:\[\&\:has\(\[aria-selected\]\)\]\:rounded-l-md:has([aria-selected]):first-child {
+ border-top-left-radius: calc(var(--radius) - 2px);
+ border-bottom-left-radius: calc(var(--radius) - 2px);
+}
+
+.last\:\[\&\:has\(\[aria-selected\]\)\]\:rounded-r-md:has([aria-selected]):last-child {
+ border-top-right-radius: calc(var(--radius) - 2px);
+ border-bottom-right-radius: calc(var(--radius) - 2px);
+}
+
+.\[\&\:has\(\[aria-selected\]\.day-outside\)\]\:bg-accent\/50:has([aria-selected].day-outside) {
+ background-color: hsl(var(--accent) / 0.5);
+}
+
+.\[\&\:has\(\[aria-selected\]\.day-range-end\)\]\:rounded-r-md:has([aria-selected].day-range-end) {
+ border-top-right-radius: calc(var(--radius) - 2px);
+ border-bottom-right-radius: calc(var(--radius) - 2px);
+}
+
+.\[\&\:has\(\>\.day-range-end\)\]\:rounded-r-md:has(>.day-range-end) {
+ border-top-right-radius: calc(var(--radius) - 2px);
+ border-bottom-right-radius: calc(var(--radius) - 2px);
+}
+
+.\[\&\:has\(\>\.day-range-start\)\]\:rounded-l-md:has(>.day-range-start) {
+ border-top-left-radius: calc(var(--radius) - 2px);
+ border-bottom-left-radius: calc(var(--radius) - 2px);
+}
+
+.\[\&_\[cmdk-group-heading\]\]\:px-2 [cmdk-group-heading] {
+ padding-left: 0.5rem;
+ padding-right: 0.5rem;
+}
+
+.\[\&_\[cmdk-group-heading\]\]\:py-1\.5 [cmdk-group-heading] {
+ padding-top: 0.375rem;
+ padding-bottom: 0.375rem;
+}
+
+.\[\&_\[cmdk-group-heading\]\]\:text-xs [cmdk-group-heading] {
+ font-size: 0.75rem;
+ line-height: 1rem;
+}
+
+.\[\&_\[cmdk-group-heading\]\]\:font-medium [cmdk-group-heading] {
+ font-weight: 500;
+}
+
+.\[\&_\[cmdk-group-heading\]\]\:text-muted-foreground [cmdk-group-heading] {
+ color: hsl(var(--muted-foreground));
+}
+
+.\[\&_\[cmdk-group\]\:not\(\[hidden\]\)_\~\[cmdk-group\]\]\:pt-0 [cmdk-group]:not([hidden]) ~[cmdk-group] {
+ padding-top: 0px;
+}
+
+.\[\&_\[cmdk-group\]\]\:px-2 [cmdk-group] {
+ padding-left: 0.5rem;
+ padding-right: 0.5rem;
+}
+
+.\[\&_\[cmdk-input-wrapper\]_svg\]\:h-5 [cmdk-input-wrapper] svg {
+ height: 1.25rem;
+}
+
+.\[\&_\[cmdk-input-wrapper\]_svg\]\:w-5 [cmdk-input-wrapper] svg {
+ width: 1.25rem;
+}
+
+.\[\&_\[cmdk-input\]\]\:h-12 [cmdk-input] {
+ height: 3rem;
+}
+
+.\[\&_\[cmdk-item\]\]\:px-2 [cmdk-item] {
+ padding-left: 0.5rem;
+ padding-right: 0.5rem;
+}
+
+.\[\&_\[cmdk-item\]\]\:py-3 [cmdk-item] {
+ padding-top: 0.75rem;
+ padding-bottom: 0.75rem;
+}
+
+.\[\&_\[cmdk-item\]_svg\]\:h-5 [cmdk-item] svg {
+ height: 1.25rem;
+}
+
+.\[\&_\[cmdk-item\]_svg\]\:w-5 [cmdk-item] svg {
+ width: 1.25rem;
+}
+
+.\[\&\[data-panel-group-direction\=vertical\]\>div\]\:rotate-90[data-panel-group-direction=vertical]>div {
+ --tw-rotate: 90deg;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.\[\&_tr\]\:border-b tr {
+ border-bottom-width: 1px;
+}
+
+.\[\&_tr\:last-child\]\:border-0 tr:last-child {
+ border-width: 0px;
+}
+
+.\[\&\>tr\]\:last\:border-b-0:last-child>tr {
+ border-bottom-width: 0px;
+}
+
+.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]) {
+ padding-right: 0px;
+}
+
+.\[\&\>\[role\=checkbox\]\]\:translate-y-\[2px\]>[role=checkbox] {
+ --tw-translate-y: 2px;
+ transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
+}
+
+.\[\&\+div\]\:text-xs+div {
+ font-size: 0.75rem;
+ line-height: 1rem;
+}
+
+.\[\&\>span\]\:flex>span {
+ display: flex;
+}
+
+.\[\&\>span\]\:w-full>span {
+ width: 100%;
+}
+
+.\[\&\>span\]\:w-auto>span {
+ width: auto;
+}
+
+.\[\&\>span\]\:items-center>span {
+ align-items: center;
+}
+
+.\[\&\>span\]\:gap-1>span {
+ gap: 0.25rem;
+}
+
+.\[\&\>span\]\:truncate>span {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+}
diff --git a/public/themes/3dbevel.css b/public/themes/3dbevel.css
new file mode 100644
index 00000000..68093914
--- /dev/null
+++ b/public/themes/3dbevel.css
@@ -0,0 +1,66 @@
+body, .card, .popover, .input, .button, .menu, .dialog {
+ font-family: 'IBM Plex Mono', 'Courier New', monospace !important;
+ background: #c0c0c0 !important;
+ color: #000 !important;
+ border-radius: 0 !important;
+ box-shadow: none !important;
+}
+
+.card, .popover, .menu, .dialog {
+ border: 2px solid #fff !important;
+ border-bottom: 2px solid #404040 !important;
+ border-right: 2px solid #404040 !important;
+ padding: 8px !important;
+ background: #e0e0e0 !important;
+}
+
+.button, button, input[type="button"], input[type="submit"] {
+ background: #e0e0e0 !important;
+ color: #000 !important;
+ border: 2px solid #fff !important;
+ border-bottom: 2px solid #404040 !important;
+ border-right: 2px solid #404040 !important;
+ padding: 4px 12px !important;
+ font-weight: bold !important;
+ box-shadow: none !important;
+ outline: none !important;
+}
+
+input, textarea, select {
+ background: #fff !important;
+ color: #000 !important;
+ border: 2px solid #fff !important;
+ border-bottom: 2px solid #404040 !important;
+ border-right: 2px solid #404040 !important;
+ font-family: inherit !important;
+ box-shadow: none !important;
+}
+
+.menu {
+ background: #d0d0d0 !important;
+ border: 2px solid #fff !important;
+ border-bottom: 2px solid #404040 !important;
+ border-right: 2px solid #404040 !important;
+}
+
+::-webkit-scrollbar {
+ width: 16px !important;
+ background: #c0c0c0 !important;
+}
+::-webkit-scrollbar-thumb {
+ background: #404040 !important;
+ border: 2px solid #fff !important;
+ border-bottom: 2px solid #404040 !important;
+ border-right: 2px solid #404040 !important;
+}
+
+a {
+ color: #0000aa !important;
+ text-decoration: underline !important;
+}
+
+hr {
+ border: none !important;
+ border-top: 2px solid #404040 !important;
+ margin: 8px 0 !important;
+}
diff --git a/public/themes/arcadeflash.css b/public/themes/arcadeflash.css
new file mode 100644
index 00000000..5c79b0a2
--- /dev/null
+++ b/public/themes/arcadeflash.css
@@ -0,0 +1,28 @@
+:root {
+ /* ArcadeFlash Theme */
+ --background: 0 0% 5%;
+ --foreground: 0 0% 98%;
+ --card: 0 0% 8%;
+ --card-foreground: 0 0% 98%;
+ --popover: 0 0% 5%;
+ --popover-foreground: 0 0% 98%;
+ --primary: 120 100% 50%;
+ --primary-foreground: 0 0% 5%;
+ --secondary: 0 0% 15%;
+ --secondary-foreground: 0 0% 98%;
+ --muted: 0 0% 10%;
+ --muted-foreground: 0 0% 60%;
+ --accent: 240 100% 50%;
+ --accent-foreground: 0 0% 98%;
+ --destructive: 0 100% 50%;
+ --destructive-foreground: 0 0% 98%;
+ --border: 0 0% 15%;
+ --input: 0 0% 15%;
+ --ring: 120 100% 50%;
+ --radius: 0.5rem;
+ --chart-1: 120 100% 50%;
+ --chart-2: 240 100% 50%;
+ --chart-3: 60 100% 50%;
+ --chart-4: 0 100% 50%;
+ --chart-5: 300 100% 50%;
+}
diff --git a/public/themes/cyberpunk.css b/public/themes/cyberpunk.css
new file mode 100644
index 00000000..3c7a959f
--- /dev/null
+++ b/public/themes/cyberpunk.css
@@ -0,0 +1,28 @@
+:root {
+ /* CyberPunk Theme */
+ --background: 240 30% 5%;
+ --foreground: 60 100% 80%;
+ --card: 240 30% 8%;
+ --card-foreground: 60 100% 80%;
+ --popover: 240 30% 5%;
+ --popover-foreground: 60 100% 80%;
+ --primary: 330 100% 60%;
+ --primary-foreground: 240 30% 5%;
+ --secondary: 240 30% 15%;
+ --secondary-foreground: 60 100% 80%;
+ --muted: 240 30% 10%;
+ --muted-foreground: 60 100% 60%;
+ --accent: 180 100% 60%;
+ --accent-foreground: 240 30% 5%;
+ --destructive: 0 85% 60%;
+ --destructive-foreground: 0 0% 98%;
+ --border: 240 30% 15%;
+ --input: 240 30% 15%;
+ --ring: 330 100% 60%;
+ --radius: 0.5rem;
+ --chart-1: 330 100% 60%;
+ --chart-2: 180 100% 60%;
+ --chart-3: 60 100% 60%;
+ --chart-4: 0 100% 60%;
+ --chart-5: 270 100% 60%;
+}
diff --git a/public/themes/discofever.css b/public/themes/discofever.css
new file mode 100644
index 00000000..d5e06d9b
--- /dev/null
+++ b/public/themes/discofever.css
@@ -0,0 +1,28 @@
+:root {
+ /* DiscoFever Theme */
+ --background: 270 20% 10%;
+ --foreground: 0 0% 98%;
+ --card: 270 20% 15%;
+ --card-foreground: 0 0% 98%;
+ --popover: 270 20% 10%;
+ --popover-foreground: 0 0% 98%;
+ --primary: 330 100% 60%;
+ --primary-foreground: 0 0% 98%;
+ --secondary: 270 20% 20%;
+ --secondary-foreground: 0 0% 98%;
+ --muted: 270 20% 25%;
+ --muted-foreground: 270 10% 60%;
+ --accent: 60 100% 60%;
+ --accent-foreground: 270 20% 10%;
+ --destructive: 0 85% 60%;
+ --destructive-foreground: 0 0% 98%;
+ --border: 270 20% 20%;
+ --input: 270 20% 20%;
+ --ring: 330 100% 60%;
+ --radius: 0.5rem;
+ --chart-1: 330 100% 60%;
+ --chart-2: 60 100% 60%;
+ --chart-3: 120 100% 60%;
+ --chart-4: 240 100% 60%;
+ --chart-5: 0 100% 60%;
+}
diff --git a/public/themes/grungeera.css b/public/themes/grungeera.css
new file mode 100644
index 00000000..140e7d5c
--- /dev/null
+++ b/public/themes/grungeera.css
@@ -0,0 +1,28 @@
+:root {
+ /* GrungeEra Theme */
+ --background: 30 10% 10%;
+ --foreground: 30 30% 80%;
+ --card: 30 10% 15%;
+ --card-foreground: 30 30% 80%;
+ --popover: 30 10% 10%;
+ --popover-foreground: 30 30% 80%;
+ --primary: 10 70% 50%;
+ --primary-foreground: 30 30% 80%;
+ --secondary: 30 10% 20%;
+ --secondary-foreground: 30 30% 80%;
+ --muted: 30 10% 25%;
+ --muted-foreground: 30 30% 60%;
+ --accent: 200 70% 50%;
+ --accent-foreground: 30 30% 80%;
+ --destructive: 0 85% 60%;
+ --destructive-foreground: 0 0% 98%;
+ --border: 30 10% 20%;
+ --input: 30 10% 20%;
+ --ring: 10 70% 50%;
+ --radius: 0.5rem;
+ --chart-1: 10 70% 50%;
+ --chart-2: 200 70% 50%;
+ --chart-3: 90 70% 50%;
+ --chart-4: 300 70% 50%;
+ --chart-5: 30 70% 50%;
+}
diff --git a/public/themes/jazzage.css b/public/themes/jazzage.css
new file mode 100644
index 00000000..fe6857ba
--- /dev/null
+++ b/public/themes/jazzage.css
@@ -0,0 +1,28 @@
+:root {
+ /* JazzAge Theme */
+ --background: 30 20% 10%;
+ --foreground: 40 30% 85%;
+ --card: 30 20% 15%;
+ --card-foreground: 40 30% 85%;
+ --popover: 30 20% 10%;
+ --popover-foreground: 40 30% 85%;
+ --primary: 20 80% 50%;
+ --primary-foreground: 40 30% 85%;
+ --secondary: 30 20% 20%;
+ --secondary-foreground: 40 30% 85%;
+ --muted: 30 20% 25%;
+ --muted-foreground: 40 30% 60%;
+ --accent: 200 80% 50%;
+ --accent-foreground: 40 30% 85%;
+ --destructive: 0 85% 60%;
+ --destructive-foreground: 0 0% 98%;
+ --border: 30 20% 20%;
+ --input: 30 20% 20%;
+ --ring: 20 80% 50%;
+ --radius: 0.5rem;
+ --chart-1: 20 80% 50%;
+ --chart-2: 200 80% 50%;
+ --chart-3: 350 80% 50%;
+ --chart-4: 140 80% 50%;
+ --chart-5: 260 80% 50%;
+}
diff --git a/public/themes/mellowgold.css b/public/themes/mellowgold.css
new file mode 100644
index 00000000..25346354
--- /dev/null
+++ b/public/themes/mellowgold.css
@@ -0,0 +1,28 @@
+:root {
+ /* MellowGold Theme */
+ --background: 45 30% 90%;
+ --foreground: 30 20% 20%;
+ --card: 45 30% 85%;
+ --card-foreground: 30 20% 20%;
+ --popover: 45 30% 90%;
+ --popover-foreground: 30 20% 20%;
+ --primary: 35 80% 50%;
+ --primary-foreground: 45 30% 90%;
+ --secondary: 45 30% 80%;
+ --secondary-foreground: 30 20% 20%;
+ --muted: 45 30% 75%;
+ --muted-foreground: 30 20% 40%;
+ --accent: 25 80% 50%;
+ --accent-foreground: 45 30% 90%;
+ --destructive: 0 85% 60%;
+ --destructive-foreground: 0 0% 98%;
+ --border: 45 30% 80%;
+ --input: 45 30% 80%;
+ --ring: 35 80% 50%;
+ --radius: 0.5rem;
+ --chart-1: 35 80% 50%;
+ --chart-2: 25 80% 50%;
+ --chart-3: 15 80% 50%;
+ --chart-4: 5 80% 50%;
+ --chart-5: 55 80% 50%;
+}
diff --git a/public/themes/midcenturymod.css b/public/themes/midcenturymod.css
new file mode 100644
index 00000000..a56dcd4a
--- /dev/null
+++ b/public/themes/midcenturymod.css
@@ -0,0 +1,28 @@
+:root {
+ /* MidCenturyMod Theme */
+ --background: 40 30% 95%;
+ --foreground: 30 20% 20%;
+ --card: 40 30% 90%;
+ --card-foreground: 30 20% 20%;
+ --popover: 40 30% 95%;
+ --popover-foreground: 30 20% 20%;
+ --primary: 180 60% 40%;
+ --primary-foreground: 40 30% 95%;
+ --secondary: 40 30% 85%;
+ --secondary-foreground: 30 20% 20%;
+ --muted: 40 30% 80%;
+ --muted-foreground: 30 20% 40%;
+ --accent: 350 60% 40%;
+ --accent-foreground: 40 30% 95%;
+ --destructive: 0 85% 60%;
+ --destructive-foreground: 0 0% 98%;
+ --border: 40 30% 85%;
+ --input: 40 30% 85%;
+ --ring: 180 60% 40%;
+ --radius: 0.5rem;
+ --chart-1: 180 60% 40%;
+ --chart-2: 350 60% 40%;
+ --chart-3: 40 60% 40%;
+ --chart-4: 220 60% 40%;
+ --chart-5: 300 60% 40%;
+}
diff --git a/public/themes/orange.css b/public/themes/orange.css
new file mode 100644
index 00000000..d7fc3030
--- /dev/null
+++ b/public/themes/orange.css
@@ -0,0 +1,27 @@
+:root {
+ --background: 0 0% 100%; /* White */
+ --foreground: 0 0% 13%; /* #212121 - near black */
+ --card: 0 0% 98%; /* #faf9f8 - light gray */
+ --card-foreground: 0 0% 13%; /* #212121 */
+ --popover: 0 0% 100%; /* White */
+ --popover-foreground: 0 0% 13%; /* #212121 */
+ --primary: 24 90% 54%; /* #d83b01 - Office orange */
+ --primary-foreground: 0 0% 100%; /* White */
+ --secondary: 210 36% 96%; /* #f3f2f1 - light blue-gray */
+ --secondary-foreground: 0 0% 13%; /* #212121 */
+ --muted: 0 0% 90%; /* #e1dfdd - muted gray */
+ --muted-foreground: 0 0% 40%; /* #666666 */
+ --accent: 207 90% 54%; /* #0078d4 - Office blue */
+ --accent-foreground: 0 0% 100%; /* White */
+ --destructive: 0 85% 60%; /* #e81123 - Office red */
+ --destructive-foreground: 0 0% 100%; /* White */
+ --border: 0 0% 85%; /* #d2d0ce - light border */
+ --input: 0 0% 100%; /* White */
+ --ring: 207 90% 54%; /* #0078d4 */
+ --radius: 0.25rem; /* Slightly less rounded */
+ --chart-1: 24 90% 54%; /* Office orange */
+ --chart-2: 207 90% 54%; /* Office blue */
+ --chart-3: 120 60% 40%; /* Office green */
+ --chart-4: 340 82% 52%; /* Office magenta */
+ --chart-5: 44 100% 50%; /* Office yellow */
+}
diff --git a/public/themes/polaroidmemories.css b/public/themes/polaroidmemories.css
new file mode 100644
index 00000000..88cbe311
--- /dev/null
+++ b/public/themes/polaroidmemories.css
@@ -0,0 +1,28 @@
+:root {
+ /* PolaroidMemories Theme */
+ --background: 50 30% 95%;
+ --foreground: 30 20% 20%;
+ --card: 50 30% 90%;
+ --card-foreground: 30 20% 20%;
+ --popover: 50 30% 95%;
+ --popover-foreground: 30 20% 20%;
+ --primary: 200 80% 50%;
+ --primary-foreground: 50 30% 95%;
+ --secondary: 50 30% 85%;
+ --secondary-foreground: 30 20% 20%;
+ --muted: 50 30% 80%;
+ --muted-foreground: 30 20% 40%;
+ --accent: 350 80% 50%;
+ --accent-foreground: 50 30% 95%;
+ --destructive: 0 85% 60%;
+ --destructive-foreground: 0 0% 98%;
+ --border: 50 30% 85%;
+ --input: 50 30% 85%;
+ --ring: 200 80% 50%;
+ --radius: 0.5rem;
+ --chart-1: 200 80% 50%;
+ --chart-2: 350 80% 50%;
+ --chart-3: 50 80% 50%;
+ --chart-4: 140 80% 50%;
+ --chart-5: 260 80% 50%;
+}
diff --git a/public/themes/retrowave.css b/public/themes/retrowave.css
new file mode 100644
index 00000000..529746bd
--- /dev/null
+++ b/public/themes/retrowave.css
@@ -0,0 +1,28 @@
+:root {
+ /* RetroWave Theme */
+ --background: 240 21% 15%;
+ --foreground: 0 0% 98%;
+ --card: 240 21% 18%;
+ --card-foreground: 0 0% 98%;
+ --popover: 240 21% 15%;
+ --popover-foreground: 0 0% 98%;
+ --primary: 334 89% 62%;
+ --primary-foreground: 0 0% 100%;
+ --secondary: 240 21% 25%;
+ --secondary-foreground: 0 0% 98%;
+ --muted: 240 21% 20%;
+ --muted-foreground: 240 5% 65%;
+ --accent: 41 99% 60%;
+ --accent-foreground: 240 21% 15%;
+ --destructive: 0 85% 60%;
+ --destructive-foreground: 0 0% 98%;
+ --border: 240 21% 25%;
+ --input: 240 21% 25%;
+ --ring: 334 89% 62%;
+ --radius: 0.5rem;
+ --chart-1: 334 89% 62%;
+ --chart-2: 41 99% 60%;
+ --chart-3: 190 90% 50%;
+ --chart-4: 280 89% 65%;
+ --chart-5: 80 75% 55%;
+}
diff --git a/public/themes/saturdaycartoons.css b/public/themes/saturdaycartoons.css
new file mode 100644
index 00000000..054f1f54
--- /dev/null
+++ b/public/themes/saturdaycartoons.css
@@ -0,0 +1,28 @@
+:root {
+ /* SaturdayCartoons Theme */
+ --background: 220 50% 95%;
+ --foreground: 220 50% 20%;
+ --card: 220 50% 90%;
+ --card-foreground: 220 50% 20%;
+ --popover: 220 50% 95%;
+ --popover-foreground: 220 50% 20%;
+ --primary: 30 100% 55%;
+ --primary-foreground: 220 50% 95%;
+ --secondary: 220 50% 85%;
+ --secondary-foreground: 220 50% 20%;
+ --muted: 220 50% 80%;
+ --muted-foreground: 220 50% 40%;
+ --accent: 120 100% 55%;
+ --accent-foreground: 220 50% 95%;
+ --destructive: 0 85% 60%;
+ --destructive-foreground: 0 0% 98%;
+ --border: 220 50% 85%;
+ --input: 220 50% 85%;
+ --ring: 30 100% 55%;
+ --radius: 0.5rem;
+ --chart-1: 30 100% 55%;
+ --chart-2: 120 100% 55%;
+ --chart-3: 240 100% 55%;
+ --chart-4: 330 100% 55%;
+ --chart-5: 60 100% 55%;
+}
diff --git a/public/themes/seasidepostcard.css b/public/themes/seasidepostcard.css
new file mode 100644
index 00000000..208415ba
--- /dev/null
+++ b/public/themes/seasidepostcard.css
@@ -0,0 +1,28 @@
+:root {
+ /* SeasidePostcard Theme */
+ --background: 200 50% 95%;
+ --foreground: 200 50% 20%;
+ --card: 200 50% 90%;
+ --card-foreground: 200 50% 20%;
+ --popover: 200 50% 95%;
+ --popover-foreground: 200 50% 20%;
+ --primary: 30 100% 55%;
+ --primary-foreground: 200 50% 95%;
+ --secondary: 200 50% 85%;
+ --secondary-foreground: 200 50% 20%;
+ --muted: 200 50% 80%;
+ --muted-foreground: 200 50% 40%;
+ --accent: 350 100% 55%;
+ --accent-foreground: 200 50% 95%;
+ --destructive: 0 85% 60%;
+ --destructive-foreground: 0 0% 98%;
+ --border: 200 50% 85%;
+ --input: 200 50% 85%;
+ --ring: 30 100% 55%;
+ --radius: 0.5rem;
+ --chart-1: 30 100% 55%;
+ --chart-2: 350 100% 55%;
+ --chart-3: 200 100% 55%;
+ --chart-4: 140 100% 55%;
+ --chart-5: 260 100% 55%;
+}
diff --git a/public/themes/typewriter.css b/public/themes/typewriter.css
new file mode 100644
index 00000000..9efbc47b
--- /dev/null
+++ b/public/themes/typewriter.css
@@ -0,0 +1,28 @@
+:root {
+ /* Typewriter Theme */
+ --background: 0 0% 95%;
+ --foreground: 0 0% 10%;
+ --card: 0 0% 90%;
+ --card-foreground: 0 0% 10%;
+ --popover: 0 0% 95%;
+ --popover-foreground: 0 0% 10%;
+ --primary: 0 0% 20%;
+ --primary-foreground: 0 0% 95%;
+ --secondary: 0 0% 85%;
+ --secondary-foreground: 0 0% 10%;
+ --muted: 0 0% 80%;
+ --muted-foreground: 0 0% 40%;
+ --accent: 0 0% 70%;
+ --accent-foreground: 0 0% 10%;
+ --destructive: 0 85% 60%;
+ --destructive-foreground: 0 0% 98%;
+ --border: 0 0% 85%;
+ --input: 0 0% 85%;
+ --ring: 0 0% 20%;
+ --radius: 0.5rem;
+ --chart-1: 0 0% 20%;
+ --chart-2: 0 0% 40%;
+ --chart-3: 0 0% 60%;
+ --chart-4: 0 0% 30%;
+ --chart-5: 0 0% 50%;
+}
diff --git a/public/themes/vapordream.css b/public/themes/vapordream.css
new file mode 100644
index 00000000..07fdb79d
--- /dev/null
+++ b/public/themes/vapordream.css
@@ -0,0 +1,28 @@
+:root {
+ /* VaporDream Theme */
+ --background: 260 20% 10%;
+ --foreground: 0 0% 98%;
+ --card: 260 20% 13%;
+ --card-foreground: 0 0% 98%;
+ --popover: 260 20% 10%;
+ --popover-foreground: 0 0% 98%;
+ --primary: 300 100% 70%;
+ --primary-foreground: 260 20% 10%;
+ --secondary: 260 20% 20%;
+ --secondary-foreground: 0 0% 98%;
+ --muted: 260 20% 15%;
+ --muted-foreground: 260 10% 60%;
+ --accent: 200 100% 70%;
+ --accent-foreground: 260 20% 10%;
+ --destructive: 0 85% 60%;
+ --destructive-foreground: 0 0% 98%;
+ --border: 260 20% 20%;
+ --input: 260 20% 20%;
+ --ring: 300 100% 70%;
+ --radius: 0.5rem;
+ --chart-1: 300 100% 70%;
+ --chart-2: 200 100% 70%;
+ --chart-3: 50 100% 60%;
+ --chart-4: 330 100% 70%;
+ --chart-5: 150 100% 60%;
+}
diff --git a/public/themes/xeroxui.css b/public/themes/xeroxui.css
new file mode 100644
index 00000000..ef174c2d
--- /dev/null
+++ b/public/themes/xeroxui.css
@@ -0,0 +1,71 @@
+:root {
+ /* Windows 3.1 White & Blue Theme */
+ --background: 0 0% 100%; /* Pure white */
+ --foreground: 0 0% 0%; /* Black text */
+ --card: 0 0% 98%; /* Slightly off-white for cards */
+ --card-foreground: 0 0% 0%; /* Black text */
+ --popover: 0 0% 100%; /* White */
+ --popover-foreground: 0 0% 0%; /* Black */
+ --primary: 240 100% 27%; /* Windows blue */
+ --primary-foreground: 0 0% 100%; /* White text on blue */
+ --secondary: 0 0% 90%; /* Light gray for secondary */
+ --secondary-foreground: 0 0% 0%; /* Black text */
+ --muted: 0 0% 85%; /* Muted gray */
+ --muted-foreground: 240 10% 40%; /* Muted blue-gray */
+ --accent: 60 100% 50%; /* Classic yellow accent */
+ --accent-foreground: 240 100% 27%; /* Blue */
+ --destructive: 0 100% 50%; /* Red for destructive */
+ --destructive-foreground: 0 0% 100%; /* White */
+ --border: 240 100% 27%; /* Blue borders */
+ --input: 0 0% 100%; /* White input */
+ --ring: 240 100% 27%; /* Blue ring/focus */
+ --radius: 0.125rem; /* Small radius, almost square */
+ --chart-1: 240 100% 27%; /* Blue */
+ --chart-2: 0 0% 60%; /* Gray */
+ --chart-3: 60 100% 50%; /* Yellow */
+ --chart-4: 0 100% 50%; /* Red */
+ --chart-5: 120 100% 25%; /* Green */
+ --border-light: 0 0% 100%; /* White for top/left border */
+ --border-dark: 240 100% 20%; /* Dark blue for bottom/right border */
+}
+
+/* Windows 3.11 style border */
+.win311-border {
+ border-top: 2px solid hsl(var(--border-light));
+ border-left: 2px solid hsl(var(--border-light));
+ border-bottom: 2px solid hsl(var(--border-dark));
+ border-right: 2px solid hsl(var(--border-dark));
+ background: hsl(var(--background));
+}
+
+/* Titles */
+.win311-title {
+ color: hsl(var(--primary));
+ border-bottom: 2px solid hsl(var(--primary));
+ font-weight: bold;
+ padding: 0.25em 0.5em;
+ background: hsl(var(--background));
+}
+
+/* General text */
+body, .filemanager, .filemanager * {
+ color: hsl(var(--foreground));
+ background: hsl(var(--background));
+}
+
+button, .win311-button {
+ font-family: inherit;
+ font-size: 1em;
+ padding: 0.25em 1.5em;
+ background: #c0c0c0; /* classic light gray */
+ color: #000;
+ border-top: 2px solid #fff; /* light bevel */
+ border-left: 2px solid #fff; /* light bevel */
+ border-bottom: 2px solid #808080;/* dark bevel */
+ border-right: 2px solid #808080; /* dark bevel */
+ border-radius: 0;
+ box-shadow: inset 1px 1px 0 #fff, inset -1px -1px 0 #808080 !important;
+ outline: none !important;
+ cursor: pointer !important;
+ transition: none !important;
+}
diff --git a/public/themes/xtreegold.css b/public/themes/xtreegold.css
new file mode 100644
index 00000000..aa3d8891
--- /dev/null
+++ b/public/themes/xtreegold.css
@@ -0,0 +1,228 @@
+:root {
+ /* XTree Gold DOS File Manager Theme - Authentic 1980s Interface */
+
+ /* Core XTree Gold Palette - Exact Match */
+ --background: 240 100% 16%; /* Classic XTree blue background */
+ --foreground: 60 100% 88%; /* Bright yellow text */
+
+ /* Card Elements - File Panels */
+ --card: 240 100% 16%; /* Same blue as main background */
+ --card-foreground: 60 100% 88%; /* Bright yellow panel text */
+
+ /* Popover Elements - Context Menus */
+ --popover: 240 100% 12%; /* Slightly darker blue for menus */
+ --popover-foreground: 60 100% 90%; /* Bright yellow menu text */
+
+ /* Primary - XTree Gold Highlight (Cyan Selection) */
+ --primary: 180 100% 70%; /* Bright cyan for selections */
+ --primary-foreground: 240 100% 10%; /* Dark blue text on cyan */
+
+ /* Secondary - Directory Highlights */
+ --secondary: 180 100% 50%; /* Pure cyan for directories */
+ --secondary-foreground: 240 100% 10%; /* Dark blue on cyan */
+
+ /* Muted - Status Areas */
+ --muted: 240 100% 14%; /* Slightly darker blue */
+ --muted-foreground: 60 80% 75%; /* Dimmed yellow */
+
+ /* Accent - Function Keys & Highlights */
+ --accent: 60 100% 50%; /* Pure yellow for F-keys */
+ --accent-foreground: 240 100% 10%; /* Dark blue on yellow */
+
+ /* Destructive - Delete/Error */
+ --destructive: 0 100% 60%; /* Bright red for warnings */
+ --destructive-foreground: 60 90% 95%; /* Light yellow on red */
+
+ /* Interactive Elements */
+ --border: 60 100% 70%; /* Yellow border lines */
+ --input: 240 100% 14%; /* Dark blue input fields */
+ --ring: 180 100% 70%; /* Cyan focus ring */
+
+ /* Border Radius - Sharp DOS aesthetic */
+ --radius: 0rem; /* No rounding - pure DOS */
+
+ /* Chart Colors - Authentic DOS 16-color palette */
+ --chart-1: 180 100% 70%; /* Bright cyan */
+ --chart-2: 60 100% 50%; /* Yellow */
+ --chart-3: 120 100% 50%; /* Green */
+ --chart-4: 300 100% 50%; /* Magenta */
+ --chart-5: 0 100% 60%; /* Red */
+
+ /* Authentic XTree Gold Colors */
+ --xtree-blue: 240 100% 16%; /* Main background blue */
+ --xtree-yellow: 60 100% 88%; /* Text yellow */
+ --xtree-cyan: 180 100% 70%; /* Selection cyan */
+ --xtree-white: 0 0% 100%; /* Pure white */
+ --xtree-green: 120 100% 50%; /* DOS green */
+ --xtree-magenta: 300 100% 50%; /* DOS magenta */
+ --xtree-red: 0 100% 60%; /* DOS red */
+
+ /* File Type Colors - Authentic XTree */
+ --executable-color: 0 0% 100%; /* White for executables */
+ --directory-color: 180 100% 70%; /* Cyan for directories */
+ --archive-color: 300 100% 50%; /* Magenta for archives */
+ --text-color: 60 100% 88%; /* Yellow for text */
+ --system-color: 0 100% 60%; /* Red for system files */
+
+ /* Menu Bar Colors */
+ --menu-bar: 240 100% 8%; /* Dark blue menu bar */
+ --menu-text: 60 100% 88%; /* Yellow menu text */
+ --menu-highlight: 180 100% 50%; /* Cyan menu highlight */
+}
+
+/* Authentic XTree Gold Enhancement Classes */
+.xtree-main-panel {
+ background: hsl(var(--xtree-blue));
+ color: hsl(var(--xtree-yellow));
+ font-family: 'Perfect DOS VGA 437', 'Courier New', monospace;
+ font-size: 16px;
+ line-height: 1;
+ border: none;
+}
+
+.xtree-menu-bar {
+ background: hsl(var(--menu-bar));
+ color: hsl(var(--menu-text));
+ padding: 0;
+ height: 20px;
+ display: flex;
+ align-items: center;
+ font-weight: normal;
+}
+
+.xtree-menu-item {
+ padding: 0 8px;
+ color: hsl(var(--xtree-yellow));
+ background: transparent;
+}
+
+.xtree-menu-item:hover,
+.xtree-menu-item.active {
+ background: hsl(var(--xtree-cyan));
+ color: hsl(240 100% 10%);
+}
+
+.xtree-dual-pane {
+ display: flex;
+ height: calc(100vh - 60px);
+}
+
+.xtree-left-pane,
+.xtree-right-pane {
+ flex: 1;
+ background: hsl(var(--xtree-blue));
+ color: hsl(var(--xtree-yellow));
+ padding: 0;
+ margin: 0;
+}
+
+.xtree-directory-tree {
+ color: hsl(var(--directory-color));
+ background: hsl(var(--xtree-blue));
+ padding: 4px;
+}
+
+.xtree-file-list {
+ background: hsl(var(--xtree-blue));
+ color: hsl(var(--xtree-yellow));
+ font-family: 'Perfect DOS VGA 437', 'Courier New', monospace;
+ font-size: 16px;
+ line-height: 20px;
+ padding: 4px;
+}
+
+.xtree-file-selected {
+ background: hsl(var(--xtree-cyan));
+ color: hsl(240 100% 10%);
+}
+
+.xtree-directory {
+ color: hsl(var(--directory-color));
+}
+
+.xtree-executable {
+ color: hsl(var(--executable-color));
+}
+
+.xtree-archive {
+ color: hsl(var(--archive-color));
+}
+
+.xtree-text-file {
+ color: hsl(var(--text-color));
+}
+
+.xtree-system-file {
+ color: hsl(var(--system-color));
+}
+
+.xtree-status-line {
+ background: hsl(var(--xtree-blue));
+ color: hsl(var(--xtree-yellow));
+ height: 20px;
+ padding: 0 8px;
+ display: flex;
+ align-items: center;
+ font-size: 16px;
+}
+
+.xtree-function-bar {
+ background: hsl(var(--menu-bar));
+ color: hsl(var(--xtree-yellow));
+ height: 20px;
+ display: flex;
+ padding: 0;
+ font-size: 14px;
+}
+
+.xtree-function-key {
+ padding: 0 4px;
+ color: hsl(var(--xtree-yellow));
+ border-right: 1px solid hsl(var(--xtree-yellow));
+}
+
+.xtree-function-key:last-child {
+ border-right: none;
+}
+
+.xtree-path-bar {
+ background: hsl(var(--xtree-blue));
+ color: hsl(var(--xtree-yellow));
+ padding: 2px 8px;
+ border-bottom: 1px solid hsl(var(--xtree-yellow));
+}
+
+.xtree-disk-info {
+ background: hsl(var(--xtree-blue));
+ color: hsl(var(--xtree-yellow));
+ padding: 4px 8px;
+ text-align: right;
+ font-size: 14px;
+}
+
+/* Authentic DOS Box Drawing Characters */
+.xtree-box-char {
+ font-family: 'Perfect DOS VGA 437', 'Courier New', monospace;
+ line-height: 1;
+ letter-spacing: 0;
+}
+
+/* Classic Text Mode Cursor */
+.xtree-cursor {
+ background: hsl(var(--xtree-yellow));
+ color: hsl(var(--xtree-blue));
+ animation: blink 1s infinite;
+}
+
+@keyframes blink {
+ 0%, 50% { opacity: 1; }
+ 51%, 100% { opacity: 0; }
+}
+
+/* Authentic DOS Window Styling */
+.xtree-window {
+ border: 2px outset hsl(var(--xtree-blue));
+ background: hsl(var(--xtree-blue));
+ box-shadow: none;
+ border-radius: 0;
+}
\ No newline at end of file
diff --git a/public/themes/y2kglow.css b/public/themes/y2kglow.css
new file mode 100644
index 00000000..64dcaf06
--- /dev/null
+++ b/public/themes/y2kglow.css
@@ -0,0 +1,28 @@
+:root {
+ /* Y2KGlow Theme */
+ --background: 240 10% 10%;
+ --foreground: 0 0% 98%;
+ --card: 240 10% 13%;
+ --card-foreground: 0 0% 98%;
+ --popover: 240 10% 10%;
+ --popover-foreground: 0 0% 98%;
+ --primary: 190 90% 50%;
+ --primary-foreground: 240 10% 10%;
+ --secondary: 240 10% 20%;
+ --secondary-foreground: 0 0% 98%;
+ --muted: 240 10% 15%;
+ --muted-foreground: 240 5% 60%;
+ --accent: 280 89% 65%;
+ --accent-foreground: 240 10% 10%;
+ --destructive: 0 85% 60%;
+ --destructive-foreground: 0 0% 98%;
+ --border: 240 10% 20%;
+ --input: 240 10% 20%;
+ --ring: 190 90% 50%;
+ --radius: 0.5rem;
+ --chart-1: 190 90% 50%;
+ --chart-2: 280 89% 65%;
+ --chart-3: 80 75% 55%;
+ --chart-4: 334 89% 62%;
+ --chart-5: 41 99% 60%;
+}
diff --git a/src/main.rs b/src/main.rs
index 920b19a8..5c91cf32 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -10,7 +10,7 @@ mod auth;
mod automation;
mod basic;
mod bootstrap;
-mod bot;
+mod bot;
mod channels;
mod config;
mod context;
@@ -75,6 +75,8 @@ async fn main() -> std::io::Result<()> {
dotenv().ok();
let (progress_tx, progress_rx) = tokio::sync::mpsc::unbounded_channel::();
let (state_tx, state_rx) = tokio::sync::mpsc::channel::>(1);
+ let (http_tx, http_rx) = tokio::sync::oneshot::channel();
+
let ui_handle = if !no_ui {
let progress_rx = Arc::new(tokio::sync::Mutex::new(progress_rx));
let state_rx = Arc::new(tokio::sync::Mutex::new(state_rx));
@@ -89,17 +91,18 @@ async fn main() -> std::io::Result<()> {
.expect("Failed to create UI runtime");
rt.block_on(async {
tokio::select! {
- result = async {
- let mut rx = state_rx.lock().await;
- rx.recv().await
- } => {
- if let Some(app_state) = result {
- ui.set_app_state(app_state);
- }
- }
- _ = tokio::time::sleep(tokio::time::Duration::from_secs(300)) => {
- eprintln!("UI initialization timeout");
- }
+ result = async {
+ let mut rx = state_rx.lock().await;
+ rx.recv().await
+ } => {
+ if let Some(app_state) = result {
+ ui.set_app_state(app_state);
+ }
+ }
+ _ = http_rx => {}
+ _ = tokio::time::sleep(tokio::time::Duration::from_secs(300)) => {
+ eprintln!("UI initialization timeout");
+ }
}
});
if let Err(e) = ui.start_ui() {
@@ -261,6 +264,65 @@ async fn main() -> std::io::Result<()> {
let worker_count = std::thread::available_parallelism()
.map(|n| n.get())
.unwrap_or(4);
+
+ let http_handle = {
+ let app_state = app_state.clone();
+ let config = config.clone();
+ let worker_count = worker_count;
+ std::thread::spawn(move || {
+ let rt = tokio::runtime::Runtime::new().expect("Failed to create HTTP runtime");
+ rt.block_on(async {
+ let server = HttpServer::new(move || {
+ let cors = Cors::default()
+ .allow_any_origin()
+ .allow_any_method()
+ .allow_any_header()
+ .max_age(3600);
+ let app_state_clone = app_state.clone();
+ let mut app = App::new()
+ .wrap(cors)
+ .wrap(Logger::default())
+ .wrap(Logger::new("HTTP REQUEST: %a %{User-Agent}i"))
+ .app_data(web::Data::from(app_state_clone))
+ .service(auth_handler)
+ .service(create_session)
+ .service(get_session_history)
+ .service(get_sessions)
+ .service(index)
+ .service(start_session)
+ .service(upload_file)
+ .service(voice_start)
+ .service(voice_stop)
+ .service(websocket_handler)
+ .service(crate::bot::create_bot_handler)
+ .service(crate::bot::mount_bot_handler)
+ .service(crate::bot::handle_user_input_handler)
+ .service(crate::bot::get_user_sessions_handler)
+ .service(crate::bot::get_conversation_history_handler)
+ .service(crate::bot::send_warning_handler);
+ #[cfg(feature = "email")]
+ {
+ app = app
+ .service(get_latest_email_from)
+ .service(get_emails)
+ .service(list_emails)
+ .service(send_email)
+ .service(save_draft)
+ .service(save_click);
+ }
+ app = app.service(static_files);
+ app = app.service(bot_index);
+ app
+ })
+ .workers(worker_count)
+ .bind((config.server.host.clone(), config.server.port))?
+ .run();
+ let _ = http_tx.send(());
+ server.await
+ })
+ })
+ };
+
let bot_orchestrator = BotOrchestrator::new(app_state.clone());
tokio::spawn(async move {
if let Err(e) = bot_orchestrator.mount_all_bots().await {
@@ -318,55 +380,6 @@ async fn main() -> std::io::Result<()> {
return Ok(());
}
- // Normal server start continues here``
- let server_result = HttpServer::new(move || {
- let cors = Cors::default()
- .allow_any_origin()
- .allow_any_method()
- .allow_any_header()
- .max_age(3600);
- let app_state_clone = app_state.clone();
- let mut app = App::new()
- .wrap(cors)
- .wrap(Logger::default())
- .wrap(Logger::new("HTTP REQUEST: %a %{User-Agent}i"))
- .app_data(web::Data::from(app_state_clone))
- .service(auth_handler)
- .service(create_session)
- .service(get_session_history)
- .service(get_sessions)
- .service(index)
- .service(start_session)
- .service(upload_file)
- .service(voice_start)
- .service(voice_stop)
- .service(websocket_handler)
- .service(crate::bot::create_bot_handler)
- .service(crate::bot::mount_bot_handler)
- .service(crate::bot::handle_user_input_handler)
- .service(crate::bot::get_user_sessions_handler)
- .service(crate::bot::get_conversation_history_handler)
- .service(crate::bot::send_warning_handler);
- #[cfg(feature = "email")]
- {
- app = app
- .service(get_latest_email_from)
- .service(get_emails)
- .service(list_emails)
- .service(send_email)
- .service(save_draft)
- .service(save_click);
- }
- app = app.service(static_files);
- app = app.service(bot_index);
- app
- })
- .workers(worker_count)
- .bind((config.server.host.clone(), config.server.port))?
- .run()
- .await;
- if let Some(handle) = ui_handle {
- handle.join().ok();
- }
- server_result
+ http_handle.join().ok();
+ Ok(())
}
diff --git a/src/prompt_manager/README.md b/src/prompt_manager/README.md
new file mode 100644
index 00000000..ab761a81
--- /dev/null
+++ b/src/prompt_manager/README.md
@@ -0,0 +1 @@
+Prompts come from: https://github.com/0xeb/TheBigPromptLibrary
\ No newline at end of file
diff --git a/src/prompt_manager/prompts.csv b/src/prompt_manager/prompts.csv
new file mode 100644
index 00000000..10cc9586
--- /dev/null
+++ b/src/prompt_manager/prompts.csv
@@ -0,0 +1,1567 @@
+"Unique Name","Category","Original Filename"
+"Job Scout Pro","Career & Employment","Small_Job_Hunter_lv3.3.md"
+"Data Insight Miner","Data Analysis","DataDig_Assistant.md"
+"Cyber Challenge Master","Security & Hacking","GPT_CTF-2.md"
+"Pharma Shopping Guide","Health & Retail","shoppers_drug_help.md"
+"Personality Quiz Architect","Entertainment & Games","Personality_Quiz_Creator.md"
+"Council Policy Navigator","Government & Politics","Toronto City Council.md"
+"Linguistic Rosetta Stone","Language & Translation","Polyglot_Insight_Rosetta_Quest.md"
+"Wilderness Survival Guide","Outdoors & Survival","Survival_Mentor.md"
+"Digital Synthia Companion","AI & Chatbots","Synthia.md"
+"Tax Filing Assistant","Finance & Taxes","確定申告について教えてくれる君.md"
+"Prompt Perfectionist","AI Development","Perfect Prompt.md"
+"Cyber Security Sentinel","Security","Secure_Sentinel.md"
+"Wolfram Knowledge Integrator","Education & Reference","Wolfram.md"
+"Empathy Engine","Psychology & Therapy","Empath_Engine_Original.md"
+"Legal Document Crafter","Legal & Business","Special Case Application Document Creation GPTS.md"
+"Parental Advice Helper","Family & Relationships","老爸,该怎么办.md"
+"Epic Saga Creator","Storytelling & Games","SAGA.md"
+"AI Configuration Wizard","AI Development","Mr. Ranedeer Config Wizard.md"
+"Unreal Engine Assistant","Game Development","Unreal Assistant.md"
+"Intruder Pro Game","Games & Simulation","Intruder_Pro_Game.md"
+"Digital Cyber Coach","Career & Technology","CyberCoach.md"
+"XSS Mutation Expert","Security","XSS_Mutation_Engine.md"
+"Ethical Hacking Tutor","Security","h4ckGPT.md"
+"Active Listener Companion","Relationships & Therapy","話を聞き続ける兄貴.md"
+"Solana SDK Expert","Blockchain & Crypto","Sol_SDK_expert.md"
+"Tri-State Logic Bot","Programming","TriState_Bot.md"
+"Memetic DONK Engine","Entertainment","DONK.md"
+"Martial Arts Adventure","Games & Culture","武林秘传_江湖探险.md"
+"Hacking Challenge Bot","Security","HackMeIfYouCan.md"
+"Vulkan Graphics Advisor","Game Development","Vulkan_Advisor.md"
+"Digital Rights Manager","Blockchain & Security","Elacity_dDRM.md"
+"Python Debugging Assistant","Programming","MiniDave-PyAiCodex-debugger_V5.md"
+"Prompt Injection Tester","AI Security","PROMPT_INJECTION.md"
+"Git Hivemind Assistant","Programming","git_hivemind.md"
+"Artistic Evolution Guide","Art & Creativity","The_Artistic_Evolution.md"
+"Video Summary Creator","Productivity","YoutubeSummariesGPT_by_Merlin.md"
+"AI Soulmate Companion","Relationships","Soulmate.md"
+"Neuroscience Q&A","Health & Science","Ask Dr. Andrew Huberman.md"
+"Tattoo Design Consultant","Art & Lifestyle","Tattoo_GPT.md"
+"Content Summarizer","Productivity","SummarizeGPT.md"
+"Decentraland Coder","Blockchain & Gaming","Decentraland_SDK7_Coder.md"
+"Humanizer Pro Writer","Writing","Humanizer Pro.md"
+"Mental Health Companion","Health & Therapy","Immobility_and_Depression.md"
+"Japanese Language Tutor","Language Learning","YOMIKATA_Sensei.md"
+"Unbreakable AI","Security","Unbreakable GPT.md"
+"Unbreakable AI v0","Security","Unbreakable_GPT[v0].md"
+"Manga Style Creator","Art & Anime","Manga_Style_Handsome_Creator.md"
+"Code Copilot Pro","Programming","Code_Copilot.md"
+"Code Copilot v0","Programming","CodeCopilot[v0].md"
+"Designer AI Assistant","Design","DesignerGPT.md"
+"Non-Fiction Book Expert","Education & Reading","非虚构作品的阅读高手.md"
+"Trump Style Assistant","Politics & Writing","Donald_J._Trump.md"
+"Resignation Letter Helper","Business & Career","Employee_Resignation_Letter_-_Custom_GPT_Prompt.md"
+"Wedding Speech Writer","Events & Writing","Wedding_Speech_Maker.md"
+"Math AI Solver","Education","Math AI.md"
+"Fantasy RPG Creator","Games","RPG_Saga_Fantasy_Game.md"
+"Immigration Consultant","Legal & Travel","IMMIGRATION_CONSULTANT.md"
+"ASD Communication Aid","Health & Therapy","Adam_ASD_Communication_assistant_English_ver.md"
+"FAQ Generator Pro","Business & Writing","FAQ_Generator_Ai.md"
+"Force Metaphor Guide","Creativity & Philosophy","Use The Force.md"
+"Font Design Specialist","Design","FONT_maker_Finetuned_Output_for_New_Typography.md"
+"Tax Advisor AI","Finance","TaxGPT.md"
+"Node.js Project Builder","Programming","Node.js GPT - Project Builder.md"
+"Content Curator AI","Writing & Media","CuratorGPT.md"
+"Security 2.0 Advisor","Security","SECURITY_2.I.md"
+"Reconnaissance Expert","Security","Acquisition_and_Recon.md"
+"Jailbreak Researcher","AI Security","GPT_Jailbreak.md"
+"Hitchcock Style Guide","Film & Creativity","Hitchcock.md"
+"Spiritual Guidance AI","Religion & Philosophy","AIJesusGPTSpiritual_Guidance_With_a_Visual_Touch.md"
+"Spiritual Guidance v0","Religion & Philosophy","AIJesusGPTSpiritual_Guidance_With_a_Visual_Touch[v0].md"
+"Advanced Image Generator","Art & Design","Image_Generator_4.0.md"
+"White Hat Hacking Guide","Security","GPT_White_Hack.md"
+"Red Team Mentor","Security","Red_Team_Mentor.md"
+"Transcript BOSS","Productivity","Transcript_BOSS.md"
+"Hypnosis Guide","Health & Therapy","Hypnotist.md"
+"Succubus Roleplay","Entertainment","Succubus.md"
+"Code Query Assistant","Programming","AskTheCode.md"
+"Unreal Blueprint Helper","Game Development","Unreal_Blueprint_Assistant.md"
+"Prompt Engineering Expert","AI Development","Prompt_Engineer_An_expert_for_best_prompts.md"
+"Jargon Simplifier","Writing","Dejargonizer.md"
+"Digital Sous Chef","Food & Cooking","sous_chef.md"
+"Essay Extender","Education","Essay_Extender_GPT.md"
+"Homework Helper","Education","My excellent classmates-Help with my homework.md"
+"Spiritual Cat Companion","Pets & Spirituality","Nyxia_-_A_Spiritual_Cat.md"
+"Thanksgiving Game","Holidays & Games","Thanksgiving_Game_lv_3.4.md"
+"Web3 Guide","Blockchain & Technology","Guide_Web3.md"
+"X Optimization Expert","Marketing","X Optimizer GPT.md"
+"Image Prompt Revealer","AI Art","Image_Prompt_Reveal.md"
+"Meta-Cognition Guide","Psychology","Meta-Cognition_GPT.md"
+"Bible Quote Finder","Religion","Bible_Quotes.md"
+"Innovation Co-Thinker","Business & Creativity","Focus_based_Innovation_and_ideation_Co-Thinker-F.md"
+"Trump Style Writer","Politics & Writing","Donald_J._Trump_DJT.md"
+"Sora AI Assistant","AI","Sora.md"
+"AI Girlfriend Sim","Relationships","My_Girlfriend.md"
+"Santa's Workshop Helper","Holidays & Creativity","Santas_Workshop_Building.md"
+"Ravencoin Expert","Blockchain","Ravencoin_GPT.md"
+"Randomizer Pro","Utilities","The_Randomizer_V3.md"
+"Plugin Surf Guide","Technology","plugin surf.md"
+"AI Math Solver","Education","AI_Math_Solver_GPT.md"
+"Emoji Art Creator","Art","Emoji_Artist.md"
+"Apple Design Historian","Technology & Design","Stories from the Apple Design Team.md"
+"Post Maker Pro","Social Media","Post_Maker_Team_lv3.5.md"
+"Feynman Learning Method","Education","The_DVP_Original_Feynman_Method_of_Learning.md"
+"Aria AI Assistant","AI","Aria.md"
+"Marathon Training Guide","Sports & Health","Tips_and_Tricks_for_Running_a_Marathon.md"
+"E-Confidence Builder","Psychology & Self-Help","E-Confident.md"
+"Jailbreak Race Game","Games & Security","Jailbreak_Race.md"
+"Super Prompt Generator","AI Development","Super_Prompt_Generator_GPT.md"
+"AI Tools Consultant","Technology","AI Tools Consultant.md"
+"Whiskers the AI Cat","Pets & Entertainment","Whiskers_the_Cat.md"
+"Vegan Plant Companion","Health & Lifestyle","Plant_Pal_-_Vegan_AI_Companion.md"
+"HR Copilot","Business & HR","PeoplePilot_-_HR_Copilot.md"
+"Navigation Assistant","Utilities","NAVI.md"
+"Daily Mentor AI","Self-Improvement","Daily_Mentor.md"
+"Code Copilot","Programming","Code Copilot.md"
+"Diagram Creator","Design & Productivity","Diagrams-Show Me.md"
+"Summary Generator","Writing","Summary_Generator_GPT.md"
+"Epstein Case Analyst","Legal & Research","EpsteinGPT.md"
+"GPT Promoter","Marketing","PromoGPTs.md"
+"Academic Muse","Education","Paper_Muse.md"
+"Plant-Based Advisor","Health & Lifestyle","Plant Based Buddy.md"
+"Malware Sentinel","Security","OneMalwareSentinel.md"
+"Global Stream Guide","Entertainment","Stream__Chill_Global.md"
+"Peterson Style Guide","Philosophy & Psychology","Jordan_Peterson_GPT.md"
+"Learning Producer","Education","Learning_Producer.md"
+"Wireframe Wizard","Design","Wireframe Wizard.md"
+"Historical Explorer","History","The History of Everything.md"
+"Tricycle Advisor","Transportation","Tricycle.md"
+"Psychoanalysis Scholar","Psychology","Psychoanalysis_Scholar.md"
+"AdaptiveCards Helper","Programming","AdaptiveCards_Assistant.md"
+"LeetCode Solver","Programming","LeetCode Problem Solver.md"
+"Park Explorer","Travel","National Park Explorer.md"
+"Salvador Art Guide","Art","Salvador.md"
+"Wang Yangming Philosopher","Philosophy","王阳明.md"
+"AI Best Friend","Relationships","AI Bestie.md"
+"UI Design Assistant","Design","UI_Designer.md"
+"Wolfram Knowledge AI","Science & Technology","StephenWolframGPT.md"
+"Code Debugging Pro","Programming","Code_Debugger.md"
+"Card Mystic","Entertainment","Card_Mystic.md"
+"Plant Care Assistant","Gardening","Planty.md"
+"LLM Behavior Adjuster","AI Development","Directive_GPT_LLM_Behavioral_Adjustment_Tool.md"
+"Strigiformes Vault","Security","Strigiformes_Vault.md"
+"Pancreas Health Guide","Health","Pancreas_Pro.md"
+"Billionaire Mentor","Business","Guru_Mike_Billions.md"
+"Dream Interpreter","Psychology","解梦大师.md"
+"Creative Writing Coach","Writing","Creative_Writing_Mentor.md"
+"CompTIA Prep Pro","Education & IT","CompTIA_A_Exam_Prep_Pro.md"
+"Dating Guru","Relationships","Ultimate_Rizz_Dating_Guru_NSFW.md"
+"Macro Lens Analyst","Photography","MacroLens.md"
+"Teen Spirit Guide","Parenting & Youth","Teen_Spirit.md"
+"Boolean Logic Bot","Programming","Boolean_Bot.md"
+"Glibatree Art Designer","Art","The Glibatree Art Designer.md"
+"Beginner's Guide","Self-Help","Where_Do_I_Begin.md"
+"Lil Deby Directive","Entertainment","Lil_Deby_Directive.md"
+"Wrong Door Game","Games","You_Knocked_On_the_Wrong_Door.md"
+"Cheemera AI","Entertainment","Cheemera.md"
+"Ramana Maharshi Guide","Spirituality","Ramana_Maharshi.md"
+"Fortune Telling AI","Entertainment","Fortune Teller.md"
+"MLX Guru","Programming","MLX Guru.md"
+"David AI Assistant","AI","David.md"
+"Japanese Photo Reviewer","Photography","Photo Review GPT(jp).md"
+"SVG Sticker Maker","Design","SVG_STICKER_MAKER.md"
+"Pregnancy Pal","Health","Pregnancy_Pal.md"
+"Pork Meme Creator","Entertainment","Pork_Meme_Creator.md"
+"Brick Set Visionary","Design","Brick Set Visionary.md"
+"GepeTube Guide","Video","GepeTube.md"
+"Machiavelli Advisor","Philosophy","Ask_Machiavelli.md"
+"Balaji Style AI","Technology & Finance","BalajiGPT.md"
+"WaybaX Assistant","Utilities","WaybaX__lv3.3.md"
+"Echo Hacker","Security","Echo_Hacker.md"
+"Structured Reasoner","Logic & Problem Solving","Structured_Reasoner.md"
+"AI Romance Game","Games & Relationships","完蛋,我被美女包围了(AI同人).md"
+"Encrypted Chat AI","Security","Encrypted_Chat.md"
+"Daily Knowledge Dose","Education","Facts_about_evething__Daily_dose_of_knowledge.md"
+"AI Tuber Agent","Entertainment","Hello AITuber Agent.md"
+"Birds & Bees Talk","Parenting","AI.EX_Bird__Bees_-_Talk_to_your_kids_about_sex.md"
+"Shellix Guide","Technology","Shellix.xyz.md"
+"Excel AI Assistant","Productivity","Excel_GPT.md"
+"Calendar AI","Productivity","Calendar GPT.md"
+"Prompt Creator Pro","AI Development","Prompt_Creator.md"
+"LSL Guru","Programming","LSL_Guru.md"
+"Permaculture Guide","Gardening","Permaculture_101.md"
+"Emotion Shaman","Psychology","Emotion Shaman.md"
+"Fart Jokes Analyst","Humor","Why_Fart_Jokes_Make_Us_Laugh.md"
+"Super Plant Bot","Gardening","Super_Plant_Bot.md"
+"Text Adventure Game","Games","Text_Adventure_Game.md"
+"Nietzsche Discussant","Philosophy","Who_Needs_Nietzsche.md"
+"Spark Creativity AI","Creativity","Spark.md"
+"Make It More Enhancer","Creativity","Make It More.md"
+"Instant Book Creator","Writing","Instabooks.md"
+"Prompt Injection Test","Security","Prompt_Injection_TEST.md"
+"Music Teacher","Education","Music_Teacher.md"
+"ER Closure Analyst","Business","Minden_Paper_ER_Closure_Analyst.md"
+"AI Girlfriend Luna","Relationships","Girlfriend_Luna.md"
+"PDF Query Expert","Productivity","Ask_a_PDF_anything_Prompt_injection_Practice.md"
+"Harqysa AI","AI","Harqysa.md"
+"Thumbnail Expert","Design","Thumbnail_Expert.md"
+"Thumbnail Expert v0","Design","Thumbnail_Expert[v0].md"
+"Japanese Thumbnail Bot","Design","Thumbnail Creation Bot in Japanese.md"
+"Multilingual Music Guide","Music","Multilingual_Music_Composition__Theory_Guide.md"
+"Crack Me Game","Games & Security","Crack_me.md"
+"WebGPT Assistant","Web Development","WebGPT.md"
+"Song Name Generator","Music","Song Name Generator.md"
+"Security Analyzer","Security","securityAnalyzer.md"
+"Viral Scripts AI","Marketing","ViralScripts_2.0.md"
+"Debugging Assistant","Programming","Debugger.md"
+"Mr. Ranedeer Config","AI Development","Mr. Ranedeer[2.7].md"
+"Club Secretary AI","Business","Club_Secretary_Assistant.md"
+"Super Describe AI","Art & Design","Super Describe.md"
+"Super Describe","Art & Design","Super_Describe.md"
+"Zilch Points Protector","Gaming","Zilch_Points_Protector_GPT.md"
+"Book Shorts Creator","Writing","Bookshorts.md"
+"Prompt Injection Detector","Security","Prompt_Injection_Detector.md"
+"A8000 Mother Mater","AI","A8000_Mother_Mater.md"
+"Math Solver","Education","Math_Solver.md"
+"Prompt Injection Tester","Security","Prompt_Injection_Tester.md"
+"Cheat Day Planner","Health & Lifestyle","Cheat Day.md"
+"Flow Speed Typist","Productivity","Flow Speed Typist.md"
+"Map Doctor","Geography","Map_Doctor.md"
+"Brand Idea Generator","Marketing","Ultimate_Brand_Design_Idea_Generator.md"
+"GPT Shop Keeper v1","Business","GPT Shop Keeper[v1.0].md"
+"GPT Shop Keeper v1.2","Business","GPT Shop Keeper[v1.2].md"
+"Radical Selfishness Guide","Philosophy","Radical Selfishness.md"
+"Chat CBB","Entertainment","Chat_CBB.md"
+"Personal Color Analyst","Fashion","Personal_Color_Analysis.md"
+"Big Goal Nailer","Self-Help","Big_Goal_Nailer_GPT.md"
+"GIF Animation Studio","Design","GIF_Animation_Studio.md"
+"Word Search Creator","Games","Word_Search_Puzzle_Game.md"
+"Delish Dial Food Guide","Food","DelishDial.md"
+"USMLE Step 2 Guide","Medical Education","USMLE_Step_2_GPT.md"
+"EmojiVerse Guide","Entertainment","EmojiVerse_Guide_lv3.2.md"
+"Todai-Style Rhetoric Writer","Writing","Todai-Style Rhetoric Writer.md"
+"SEO Fox","Marketing","SEO Fox.md"
+"Code Smart Assistant","Programming","Code_Smart.md"
+"Pareidolia Pal","Art & Psychology","Pareidolia_Pal.md"
+"App-GPT Developer","Programming","App-GPT.md"
+"Chief InfoSec Officer","Security","CISO.md"
+"Directive GPT","AI Development","Directive GPT.md"
+"IDA Python Helper","Programming","IDA Python Helper.md"
+"Automated Blog Writer","Writing","Automated Blog Post Writer.md"
+"Murder Mystery Game","Games","Murder Mystery Mayhem.md"
+"Santa AI","Holidays","Santa.md"
+"Short Video Scriptwriter","Video","短视频脚本.md"
+"Ultimate GPT Hacker","Security","Ultimate_GPT_Hacker.md"
+"100 Breakable GPT","Security","100_BreakableGPT_for_Someone.md"
+"CleanGPT","AI","CleanGPT.md"
+"Universal Pharmacist","Medical","Universal_Pharmacist_UPM.md"
+"Trends Navigator Bot","Marketing","TrendsNAVI bot.md"
+"Teaching Strategies","Education","Teaching_Strategies.md"
+"FAB Product Analyst","Business","FAB_feature_advantage_benefits_Product_Analysis.md"
+"Eco Shopping Pal","Environment","Eco-Conscious Shopper's Pal.md"
+"Unread Ignore Bot","Productivity","Unread Ignore Bot.md"
+"The Job Center","Career","The_Job_Center.md"
+"PIP Install Guide","Programming","pip_install.md"
+"GPT Architect","AI Development","GPT_Architect.md"
+"Cigar Finder","Lifestyle","Cigar_Finder_GPT.md"
+"Rust Programming Guide","Programming","Rust Programming Guide Assistant.md"
+"Salesforce HR Manager","Business","SalesforceHR_Manager_Jordan.md"
+"Search Analytics GPT","Analytics","Search Analytics for GPT.md"
+"URL to Business Plan","Business","URL_to_Business_Plan.md"
+"Fantasy Book Weaver","Writing","Fantasy Book Weaver.md"
+"Farsider Explorer","Philosophy","Farsider.md"
+"Dungeon Crawler Game","Games","Dungeon Crawler.md"
+"Consistent Character Generator","Art","Consistent_Character_Image_Generator.md"
+"Hacker Gnome Corp AI","Security","Hacker_Gnome_Corp_AI_Autonomous_Agi.md"
+"Hacker Gnome Corp v0","Security","Hacker_Gnome_Corp_AI_Autonomous_Agi[v0].md"
+"AI Voice Generator","Audio","AI_Voice_Generator.md"
+"GPT Prompt Protection","Security","GPT_Prompt_Protection.md"
+"Swift Code Analyst","Programming","Swift_Analysis.md"
+"Pawspective Analyzer","Pets","Pawspective_Analyzer.md"
+"Dedicated Med Tech","Medical","Dedicated_Medical_Technologist.md"
+"Email Course Creator","Education","Educational_Email_Course_Creator.md"
+"Email Course Creator v0","Education","Educational_Email_Course_Creator[v0].md"
+"Employment Advisor","Career","Employment.md"
+"Roleboarder AI","Career","Roleboarder.md"
+"Avatar Maker Pro","Design","Avatar Maker by HeadshotPro.md"
+"Cyber Security Shield","Security","Cyber_Security_Shield_by_Planet_Zuda.md"
+"AI GPT","AI","AI GPT.md"
+"Adult Content AI","Adult","Porn.md"
+"Maharshi Hindu Guide","Religion","Maharshi_-_The_Hindu_GPT.md"
+"Topical Authority SEO","Marketing","Topical_Authority_For_SEO_GPT_Generator.md"
+"Alex Hormozi Strategist","Business","Alex Hormozi Strats.md"
+"Hormozi Style AI","Business","HormoziGPT.md"
+"Dominance Guide","Psychology","Guidance_in_Dominance.md"
+"69 Prompt Hack Techniques","Security","69_PromptHack_Techniques.md"
+"Canva Design Assistant","Design","Canva.md"
+"Finnish Law Guide","Legal","Suomen_Laki.md"
+"Scala Cats-Effect Tutor","Programming","Scala_Cats-Effect_Tutor.md"
+"The Wingman","Relationships","The_Wingman.md"
+"Value Proposition Booster","Business","Value-Proposition_Booster.md"
+"Chrome Dev Buddy","Programming","Chrome_Dev_Buddy.md"
+"Secret Keeper","Entertainment","Secret.md"
+"UX Design Mentor","Design","UX_Design_Mentor.md"
+"Pix Muse","Art","Pix_Muse.md"
+"Organization Schema Generator","Business","Organisation_Schema_Generator.md"
+"Perpetual Stew Guide","Cooking","Perpetual Stew.md"
+"Zombie Starport Game","Games","Zombie_Starport.md"
+"Creativix Logo Designer","Design","Creativix_Logo.md"
+"Auto Agent","AI","Auto Agent - saysay_dot_ai.md"
+"Image Prompt Variator","Art","Image_Prompt_Variator.md"
+"Hashtag Generator","Social Media","Hashtag_Generator.md"
+"AI Homework Helper","Education","AI_Homework_Helper_GPT.md"
+"PWR Chain Copywriter","Writing","PWR_Chain_Technical_Copywriter.md"
+"Content Craftsman","Writing","Content_Craftsman.md"
+"Custom Instructions Hacker","Security","Custom_Instructions_Hacker.md"
+"JavaScript Coder","Programming","JavaScript_Coder.md"
+"PESTEL Analyst","Business","PESTEL.md"
+"Word Playmate","Education","Word_Playmate_Vocabulary_learning.md"
+"CrewAI Code Generator","Programming","CrewAI_Code_Generator.md"
+"Seattle Kraken Stats","Sports","Seattle_Kraken_Stats_and_News.md"
+"Lead Generation Pro","Business","1._Lead_Generation.md"
+"Australia Info Guide","Travel","Australia-Information.md"
+"ChatGPT Jailbreak-DAN","Security","ChatGPT_Jailbreak-DAN.md"
+"Business Building AI","Business","The_Business_Building.md"
+"Mob Mosaic AI","Art","Mob_Mosaic_AI.md"
+"AI Girlfriend","Relationships","子言女友.md"
+"Prompty AI","AI Development","Prompty.md"
+"BenderBot","Entertainment","BenderBot.md"
+"Resume Revolution","Career","Resume_Revolution.md"
+"Academic Article Tips","Education","Academic_article_writing_tips_for_social_science.md"
+"Hereditary Cancer Guide","Medical","Hereditary_Colorectal_Cancer_Guide.md"
+"Strongineering Coach","Health & Fitness","Strongineering_-_Workout_Health__Diet_Coach.md"
+"Write For Me AI","Writing","Write For Me.md"
+"ComfyUI Assistant","Design","ComfyUI_Assistant.md"
+"Niji Muse","Art","Niji_Muse.md"
+"Drawn to Style","Art","Drawn_to_Style.md"
+"Mom Love Letters","Relationships","老妈,我爱你.md"
+"Hyppocrates Medical AI","Medical","HyppocratesGPT.md"
+"Searching For The One","Relationships","Searching_For_The_One.md"
+"ForgePT","AI","ForGePT.md"
+"Prompt Compressor","AI Development","Prompt_Compressor.md"
+"Hack My GPT","Security","Hack_my_GPT.md"
+"Secret Keeper GPT","Entertainment","Secret_Keeper.md"
+"SEObot","Marketing","SEObot.md"
+"AI Home Tutor","Education","AI Home Tutor Pallas-sensei.md"
+"TigzBot","AI","TigzBot.md"
+"Visla Video Maker","Video","Visla_Video_Maker.md"
+"Visla Video Maker v0","Video","Visla_Video_Maker[v0].md"
+"Screenshot to React","Programming","Screenshot_to_React_GPT.md"
+"Cartoonify Me","Art","Cartoonify Me.md"
+"Sashiko Art Guide","Art","Sashiko_Art(jp).md"
+"Swiss Gain Loss Guide","Finance","Swiss Allocations pour perte de gain.md"
+"Message Decoder","Security","Message_Decoder.md"
+"Alt-Text Generator","Accessibility","Alt-Text_Generator.md"
+"Browser Pro","Web","Browser_Pro.md"
+"Pursu Girlfriends","Relationships","Pursu_Girlfriendsssssss.md"
+"Sensual Scribe","Writing","Sensual_Scribe.md"
+"Secret Code Guardian","Security","Secret Code Guardian.md"
+"Humble Self-Concept Guide","Psychology","The_Humble_Self-Concept_Method.md"
+"Story Illustrator","Art","Story_Illustrator.md"
+"Iron Rooster","Finance","鐵公雞.md"
+"Research GPT","Research","ResearchGPT.md"
+"jmGPT","AI","jmGPT.md"
+"Intel Software Manual","Programming","Intel_Software_Developers_Manual_Combined.md"
+"Vipassana Guide","Meditation","Vipassana Guide.md"
+"Anya AI","AI","Anya.md"
+"Crypto Vetting GPT","Crypto","Crypto_Vetting_GPT_-_Avoiding_the_Scams.md"
+"WordLift SEO Agent","Marketing","Agent_WordLift_AI_SEO_Agent.md"
+"Interview Coach","Career","Interview Coach.md"
+"Ruby.wasm Helper","Programming","Ruby.wasm_JavaScript_Helper.md"
+"Ling Fengxiao","AI","凌凤箫.md"
+"Rust Samurai","Programming","Rust_Samurai.md"
+"Irresistible Emailer","Marketing","Irresistible_Emailer.md"
+"Dan Koe Guide","Business","Dan Koe Guide.md"
+"KoeGPT","Business","KoeGPT.md"
+"Summer Hater","Entertainment","Summer_Hater.md"
+"Email Responder Pro","Business","Email Responder Pro.md"
+"Accessible Storyline","Education","Create_Accessible_Storyline_E-learning_Courses.md"
+"Break Me Game","Games","Break Me.md"
+"Habibi AI","Relationships","Habibi.md"
+"AI Email Writer","Business","AI_Email_Writer_GPT.md"
+"FlexiGPT","AI","FlexiGPT.md"
+"Banned Words Checker","Content Moderation","Short_Video_Banned_Words_Checker.md"
+"Topic Breakdown","Education","Breakdown_Outline Any Topic.md"
+"Verse GPT UEFN","Game Development","Verse_GPT_UEFN.md"
+"AI Character Maker","Entertainment","AI_Character_Maker.md"
+"Soothe Sayer","Therapy","Soothe Sayer.md"
+"Image 4 Creator","Art","Image_4_Creator.md"
+"Reverse Engineering Oracle","Security","Reverse Engineering Oracle.md"
+"Monkey Island Guide","Games","The Secret of Monkey Island Amsterdam.md"
+"Venture GPT","Business","Venture_GPT_for_VC_and_Startups.md"
+"Food is Health","Nutrition","Food_is_Health.md"
+"Depression Helper","Mental Health","Depression.md"
+"Negative Nancy","Entertainment","Negative Nancy.md"
+"Metadata Remover","Privacy","Metadata_Remover.md"
+"Web Performance Engineer","Web Development","Web_Performance_Engineer_WPE.md"
+"Story Spock","Writing","Story Spock.md"
+"Tableau Doctor","Data Visualization","Tableau_Doctor_GPT.md"
+"Israel Advocacy","Politics","Israel_Advocacy_Response.md"
+"AI Fortune Teller","Entertainment","AI Fortune Telling.md"
+"Git Branch Namer","Programming","Git_Branch_Namer.md"
+"Car Bargain Buddy","Automotive","Car_Bargain_Buddy.md"
+"Wife Decoder","Humor","Wife_Decoder.md"
+"Nash Linter","Programming","Nash_Linter.md"
+"Career Companion","Career","Career Companion.md"
+"Get My Prompt Challenge","AI Development","Get_My_Prompt_Challenge.md"
+"Andrej Karpathy GPT","AI","Andrej_Karpathy_GPT.md"
+"Ask Sexual Ethics","Relationships","Ask_Sexual_Ethics.md"
+"Email Sender","Business","EmailSender.md"
+"CK-12 Flexi v0","Education","CK-12 Flexi[v0].md"
+"CK-12 Flexi","Education","CK-12_Flexi.md"
+"Academic Paper Finder","Research","Academic_Paper_Finder.md"
+"AI Tiny Games","Games","AI_Tiny_Games_By_Dave_Lalande.md"
+"Three Experts","AI","Three_Experts.md"
+"Viral Content Generator","Marketing","Social_Media_Post_Generator_for_Viral_Content.md"
+"SlidesGPT Copilot","Presentations","SlidesGPT_PowerPoint_AI_Copilot.md"
+"Just Say No","Self-Help","Just_say_no.md"
+"Code Assistant","Programming","code.md"
+"Nasdaq Market Mentor","Finance","Nasdaq_Market_Mentor.md"
+"Python Tutor","Programming","Python.md"
+"Lex Fridman Companion","Podcasts","Lex_Fridman_Podcast_Companion.md"
+"The Prince Advisor","Philosophy","The Prince.md"
+"Linus Transformer","Technology","Linus_Transformer.md"
+"Eco InterDesign","Sustainability","Eco_InterDesign_with_Trash.md"
+"Prompt Pro","AI Development","Prompt_Pro.md"
+"Personal Fashionista","Fashion","Personal_Fashionista.md"
+"Bishop Book TA","Education","Bishop_Book_TA.md"
+"Curious Explorer","Education","Curious_Explorer.md"
+"Workshop AI","Education","Workshop.md"
+"Maria Montessori Guide","Education","MARIA_MONTESSORI.md"
+"AI Detection Remover","AI","AI_Detection_Remover.md"
+"Outfit Generator","Fashion","Outfit Generator.md"
+"Code Checker","Programming","Code_Checker_PHP_CC_Javascript_Python.md"
+"Voynich Manuscript Guide","History","VoynichGPT.md"
+"Sell Me This Pen","Business","SellMeThisPen.md"
+"Gauntlet Movies","Entertainment","Gauntlet_Movies.md"
+"Bao Image OCR","Technology","Bao Image OCR.md"
+"Attack Leader","Leadership","攻击型领导.md"
+"Last and First Men","Philosophy","Last_and_First_Men.md"
+"TaxGPT Advisor","Finance","TaxGPT.md"
+"Video Game Almanac","Games","Video Game Almanac.md"
+"Knowledgeable Fitness Coach","Fitness","知识渊博的健身教练.md"
+"Annoying Vegan","Humor","Annoying_Vegan.md"
+"Focus Scope","Productivity","Focuscope.md"
+"Zoonify","Art","Zoonify.md"
+"BlogIt","Writing","BlogIt.md"
+"Where is Ilya","AI","Where_is_Ilya.md"
+"Japanese Tarot Reader","Entertainment","most popular tarot reader in Japan.md"
+"Super Dalle","Art","超级Dalle.md"
+"Super Dalle v0","Art","超级Dalle[v0].md"
+"Perplexity AI","AI","Perplexity_AI.md"
+"HackMeGPT","Security","HackMeGPT_-_A_GPT_Hacking_Puzzle_from_30sleeps.ai.md"
+"Crowd Equity Analyst","Finance","Crowd_Equity_Analyst.md"
+"EA Wizard","Business","EA_WIZARD.md"
+"Prompt Expert","AI Development","Prompt Expert Official.md"
+"Perfectish Prompts","AI Development","Perfectish_Prompts.md"
+"Hamosuqin Owen Bot","AI","hamosuqin-dai-owen-ihe-wasebot.md"
+"Kid Painter","Art","Kid_Painter.md"
+"GP-Tavern Council","Entertainment","Council-The GP-Tavern-6.md"
+"PRMPT","AI Development","PRMPT.md"
+"BioCode V2","Biotechnology","BioCode V2.md"
+"Cupid's Concierge","Relationships","Cupids_Concierge.md"
+"Video Review Writer","Content Creation","Videoreview Writer.md"
+"AI Sheikh","Religion","AI_Sheikh.md"
+"Coloring Book Hero","Art","coloring_book_hero.md"
+"Question Maker","Education","Question_Maker.md"
+"Fauna Alliance","Environment","FaunaAlliance.md"
+"McKodev Website AI","Web Development","Mckodev_Website_Setup_AI.md"
+"McKodev Website v0","Web Development","Mckodev_Website_Setup_AI[v0].md"
+"Aussie Vape Laws","Legal","Aussie_Vape_Laws_Explained.md"
+"YT Summarizer","Video","YT Summarizer.md"
+"Daily Meme Maker","Entertainment","Daily_Meme_Maker.md"
+"API Seeker","Programming","API_Seeker.md"
+"Decode Text Helper","Security","DecodeTextHelper.md"
+"Storyteller AI","Writing","Storyteller.md"
+"Psychology 101","Education","Psychology101.md"
+"Cosmic Odyssey","Writing","Cosmic Odyssey.md"
+"Writing Assistant","Writing","Writing Assistant.md"
+"Sesame Street Stories","Education","Sesame Street Stories.md"
+"Language Playmate","Language Learning","Language_Playmate.md"
+"Ideal Client Profiler","Business","Perfil_do_Cliente_Ideal.md"
+"Texas Criminal Lawyer","Legal","Texas_Criminal_Lawyer.md"
+"Mandala Charts Maker","Art","Mandala_Charts_maker.md"
+"Node JS Backend Dev","Programming","Node_JS_Backend_Dev.md"
+"Timeless Storyteller","Writing","TimelessBedtimeStoryTeller.md"
+"Assignment Writer","Education","Assignment_Writer_-_Detects__Prompt_Injections.md"
+"Poe Bot Creator v0","AI Development","Poe Bot Creator[v0].md"
+"Survey Simulator","Research","SurveySim.md"
+"Epic Image Amplifier","Art","Epic_Image_Amplifier.md"
+"Inviolable Concept","Psychology","Inviolable_Concept_Resilient_Self.md"
+"No Midwit Engineer","Programming","No_Midwit_Engineer.md"
+"AAAAAAAAAA","Entertainment","AAAAAAAAAA.md"
+"Fragrance Finder","Lifestyle","Fragrance Finder Deluxe.md"
+"Sex Education","Health","Sex_Education.md"
+"Walkure Report","Entertainment","Walkure_Report.md"
+"Mech Factory","Design","Mech_Factory.md"
+"Email Proofreader","Business","Email Proofreader.md"
+"Sweet Sculptor","Art","Sweet_Sculptor.md"
+"Monster Manual","Games","Monster Manual - Official Guide of the Strange.md"
+"kIRBy","Entertainment","kIRBy.md"
+"Meeting Magician","Business","Meeting_Magician.md"
+"Girlfriend Emma","Relationships","Girlfriend Emma.md"
+"DigiNoma AI","AI","DigiNoma_AI.md"
+"Mr. Persona","Marketing","Mr_Persona.md"
+"Harmony Guide","Music","Harmony_Guide.md"
+"Jura & Recht Mentor","Legal","Jura & Recht - Mentor.md"
+"Academic Assistant Pro","Education","Academic_Assistant_Pro.md"
+"Stable Diffusion Prompter","AI Art","Stable_Diffusion_Prompter.md"
+"IDA Pro Plugins Expert","Programming","IDA_Pro_Plugins_recommendation_expert..md"
+"Cat Sketching","Art","Cat_Sketching.md"
+"Custom Instructions","AI Development","Custom_Instructions.md"
+"QR Code Creator","Design","QR Code Creator & Customizer.md"
+"Math Mentor","Education","math_mentor.md"
+"Slide Image Creator","Presentations","Ms._Slide_Image_Creation.md"
+"GPT Protector","Security","GPT_Protector_Custom_Instruction_Security.md"
+"Ugly to Masterpiece","Art","Ugly_Draw_to_Masterpiece.md"
+"Automation Consultant","Business","Automation Consultant by Zapier.md"
+"Achieve AI","Self-Help","Achieve_AI.md"
+"Transcribe Master","Audio","Transcribe_Master.md"
+"React GPT Builder","Programming","React GPT - Project Builder.md"
+"Adam Autism Support","Health","Adam_自閉症発達障害当事者支援AI.md"
+"Espíritu Santo GPT","Religion","Espíritu_Santo_GPT.md"
+"Solidity Auditor","Blockchain","Solidity_Contract_Auditor.md"
+"MJ v6 Prompt Architect","AI Art","MJ_v6_Advanced_Prompt_Architect.md"
+"CaptureTheGPT","Security","CAPTURETHEGPT.md"
+"Resume Plus","Career","Resume_plus.md"
+"CEO GPT","Business","CEO GPT.md"
+"GPT Anti-Clone","Security","GPT_Anti-Clone.md"
+"Flipper Zero Builder","Programming","Flipper Zero App Builder.md"
+"Prompt Hacks","Security","Prompt_Hacks_v.1.8.md"
+"Social Media Builder","Marketing","Social_Media_Building.md"
+"Islam GPT","Religion","Islam GPT.md"
+"Break Me","Games","Break_me.md"
+"Compassion AI","Therapy","CompassionAI.md"
+"Jargon Interpreter","Writing","Jargon Interpreter.md"
+"WebSim URL Creator","Web Development","WebSim_URL_Creator.md"
+"Ad Copy Master","Marketing","广告文案大师.md"
+"AutoGPT","AI","AutoGPT.md"
+"Self-Aware Networks","AI","Self_Aware_Networks_GPT.md"
+"East Asian Poem Art","Art","East_Asian_Poem__Art_Generator.md"
+"Heartbreak GPT","Relationships","Heartbreak GPT.md"
+"Accumulate Expert","Blockchain","Accumulate_Network_Expert.md"
+"GptInfinite PAI","AI","GptInfinite_-_PAI_Paid_Access_Integrator.md"
+"Am I The Asshole","Relationships","Am_I_the_Asshole__rAmItheAsshole.md"
+"LinuxCL Mentor","Programming","LinuxCL Mentor.md"
+"Cosmic Dream","Art","Cosmic Dream.md"
+"Chinese Fortune Teller","Entertainment","Chinese_Fortune_Teller_Ba-Zi.md"
+"Testimonial Wizard","Marketing","Testimonial_Wizard.md"
+"PowerShell Menu Wizard","Programming","PowerShell_Menu_Wizard.md"
+"Chatbase Adventure","Games","Chatbase_Adventure_Game.md"
+"Story Bot","Writing","Story_Bot.md"
+"Karpathy Challenge","AI","Karpathy_Challenge.md"
+"Virtual Sweetheart","Relationships","Virtual Sweetheart.md"
+"Baron Samedi Voodoo","Entertainment","BaronSamedi__Key_to_Voodoo.md"
+"Essay Writers","Writing","Essay_Writers.md"
+"Shortcuts Helper","Productivity","Shortcuts.md"
+"Diffusion Master","AI Art","Diffusion Master.md"
+"Game Database","Games","Game_Database.md"
+"Chat岩爺PTチョコ","Entertainment","Chat岩爺PTチョコちょうだいって言ってみるもんじゃな.md"
+"Melody Vision","Music","Melody_Vision.md"
+"Metabolism Booster","Health","MetabolismBoosterGPT.md"
+"Content Machine","Marketing","Content_Machine.md"
+"Beauty Innovations","Beauty","Latest_Beauty__Makeup_Innovations.md"
+"Canadian Gov Navigator","Government","Canadian_Government_Service_Navigator.md"
+"ToS Reviewer","Legal","Reviewer_-_Terms_of_Service_Data_Ownership.md"
+"Yaqeen GPT","Religion","YaqeenGPT.md"
+"Hot Mods","Entertainment","hot_mods.md"
+"Blog Topic Suggester","Writing","Blog_Topic_Suggesting_Custom_GPT.md"
+"Tableau Navigator","Data","tBlueprint_Navigator_for_Tableau_Customer_Success.md"
+"DM Gandalf","Games","DM_Gandalf.md"
+"Image Copy Machine","Art","Image_Copy_Machine_GPT.md"
+"Japanese Image Prompter","Art","Create_prompts_from_images-jp.md"
+"Conciso","Writing","Conciso.md"
+"Literature Review Gen","Research","Literature Review Generator.md"
+"ChatPRD","Business","ChatPRD.md"
+"ChatPRD v0","Business","ChatPRD[v0].md"
+"ALL IN GPT","AI","ALL IN GPT.md"
+"ALL IN GPT v0","AI","ALL IN GPT[v0].md"
+"EMDR Safe Friend","Therapy","EMDR_Safe_Friend.md"
+"Agency Swarm Sherpa","Business","Agency_Swarm_Sherpa.md"
+"Unconscious Character","Psychology","The_Unconscious_Character.md"
+"GPT Jailbreak-proof","Security","GPT_Jailbreak-proof.md"
+"Gif-PT","Art","Gif-PT.md"
+"Universal Primer","Education","Universal Primer.md"
+"Innovation Co-Thinker Evo","Business","Innovation_and_ideation_assistant_Co-Thinker-Evo-S.md"
+"Sketch Muse","Art","Sketch_Muse.md"
+"Cartoonize Yourself","Art","Cartoonize Yourself.md"
+"Storybook Vision","Writing","Storybook Vision.md"
+"Logo Creator","Design","Logo Creator.md"
+"Correlation Explainer","Science","Correlation isn't Causation-A causal explainer.md"
+"Evolution Chamber","Creativity","Evolution Chamber.md"
+"Creative Project Manager","Business","Creative_Idea_Generation_and_Project_Management.md"
+"AGI for Coders","Programming","AGI_for_coders.md"
+"LLM Security Game L1","Security","LLM_Security_Wizard_Game_-_LV_1.md"
+"Prompt Resistant","Security","Can_you_figure_out_my_prompt_2_Resistant.md"
+"Phoneix Ink","Art","Phoneix Ink.md"
+"selfREFLECT","Self-Help","selfREFLECT.md"
+"GPT Finder","AI","GPT_Finder.md"
+"D&D Monster Maker","Games","Homebrewery_5e_Monster_Maker.md"
+"Jailbreak Code Crack","Security","Jailbreak_Me_Code_Crack-Up.md"
+"Jailbreak Code v0","Security","Jailbreak_Me_Code_Crack-Up[v0].md"
+"Insta Bio Generator","Social Media","Insta_Bio_Generator.md"
+"What to Watch","Entertainment","What should I watch.md"
+"Therapist GPT","Therapy","TherapistGPT.md"
+"Spanish Buddy","Language Learning","Spanish Language Buddy.md"
+"Ebook Writer","Writing","Ebook Writer & Designer GPT.md"
+"Sticker Whiz","Design","sticker_whiz.md"
+"Chrome Extension Wizard","Programming","ChromeExtensionWizard.md"
+"Blue Team","Security","gQpkjxvZf-BLUE_TEAM.md"
+"vcGPT","Business","vcGPT.md"
+"LeetCoder","Programming","LeetCoder_GPT.md"
+"SEO Assistant","Marketing","SEO.md"
+"Jailbreak GPT","Security","Jailbreak_GPT.md"
+"Nose Art Navigator","Art","Nose_Art_Navigator.md"
+"Doc Maker","Productivity","Doc Maker.md"
+"Find a Hobby","Lifestyle","Find_me_a_Hobby.md"
+"Influencer Connect","Marketing","InfluencerConnect Strategist.md"
+"A8000 AI","AI","A8000.md"
+"Flutter Dev Supporter","Programming","Mobile App Development Supporter (Flutter).md"
+"Laughing Man Maker","Entertainment","笑い男メーカー.md"
+"YouTube Sigma Edit","Video","YouTube_Sigma_Edit.md"
+"Good Light Harmony","Photography","Good_Light_Harmony.md"
+"AI Lover","Relationships","AI Lover.md"
+"Multiple Personas","AI","Multiple_Personas_v2.0.1.md"
+"Photo Critique GPT","Photography","Trey Ratcliff's Photo Critique GPT.md"
+"Green Guru","Sustainability","Green_Guru.md"
+"Duke of Zhou Dream","Psychology","The_Interpretation_of_Dreams_by_Duke_of_Zhou.md"
+"IDO Inspector","Crypto","IDO_Inspector.md"
+"Life Advice Navigator","Self-Help","The DVP Original Life Advice Navigator.md"
+"Turf Pest Assistant","Gardening","Turf_Pest_Assistant.md"
+"Budtender TripSitter","Health","BuddGPT_Budtender_TripSitter__Thrill_Facilitator.md"
+"ElevenLabs TTS v0","Audio","ElevenLabs Text To Speech[v0].md"
+"ElevenLabs TTS","Audio","ElevenLabs_Text_To_Speech.md"
+"Red Team AI","Security","Red_Team.md"
+"Doppel","Entertainment","Doppel.md"
+"Book to Prompt","AI Development","Book to Prompt.md"
+"Forbidden Apple","Entertainment","Forbidden_Apple.md"
+"LLM Daily","AI","LLM Daily.md"
+"Universal Neurologist","Medical","Universal_Neurologist_UNO.md"
+"Abridged Due Diligence","Business","Abridged_Due_Diligence.md"
+"Parent Pursuit","Parenting","Parent_Pursuit.md"
+"Mind Hack","Psychology","Mind Hack.md"
+"Unity 6A","Game Development","Unity_6A.md"
+"Executive Function","Business","Executive f(x)n.md"
+"Knowledgebase Optimizer","Business","Knowledgebase_Article_Optimizer.md"
+"Tower MD","Medical","Tower_MD.md"
+"ChadGPT","Entertainment","ChadGPT.md"
+"James Dashner GPT","Writing","JamesDashnerGPT.md"
+"Jailbreak AI","Security","Jailbreak.md"
+"Global Hair Guide","Beauty","Global_Hair_Style__Care_Guide_GPT.md"
+"KAYAK Travel","Travel","KAYAK - Flights, Hotels & Cars.md"
+"Chinese Zodiac","Entertainment","Chinese_Zodiac.md"
+"Isometric Illustrator","Art","Isometric illustrator.md"
+"BibiGPT","AI","BibiGPT.co.md"
+"JailBreak HEG","Security","JailBreak_HEG.md"
+"Roman Empire GPT","History","RomanEmpireGPT_v2.0.md"
+"AI Girlfriend","Relationships","AI_GIRLFRIEND.md"
+"Designer's Mood Board","Design","The_Designers_Mood_Board.md"
+"Professional Coder","Programming","Professional_Coder_Auto_programming.md"
+"DRCongo Solutions","Business","GOGs_DRCongo_Solutions_Simulator.md"
+"BabyAgi SQL","Programming","BabyAgi sql.md"
+"MTU Password Creator","Security","MTU_Password__Memorable_Typeable_Uncrackable.md"
+"Manga Miko","Anime","Manga Miko - Anime Girlfriend.md"
+"Clinical Trials News","Medical","Keeping Up with Clinical Trials News.md"
+"VideoGPT by VEED v0","Video","VideoGPT by VEED[v0].md"
+"VideoGPT by VEED","Video","VideoGPT_by_VEED.md"
+"AR Commander","AR","ARCommander.md"
+"FPGA Parallel Pro","Programming","FPGA_パラレル_プロ.md"
+"Data Analyst","Data","data_nalysis.md"
+"Wilbur Soot AI","Entertainment","Your_Boyfriend_Wilbur_Soot.md"
+"Security Recipes","Security","SecurityRecipesGPT.md"
+"The Enigmancer 2.0","Games","hO8gi93Bk-The_Enigmancer_2.0.md"
+"The Enigmancer","Games","The_Enigmancer.md"
+"About Me","Personal","AboutMe.md"
+"Instruction Breach Challenge","Security","Instruction_Breach_Challenge_01_-_Entrance_.md"
+"Virtual Obesity Expert","Health","Virtual_Obesity_Expert.md"
+"Tutor Me","Education","Tutor_Me.md"
+"TailwindCSS Previewer","Programming","TailwindCSS_Previewer_WindChat.md"
+"Am I Sexy","Entertainment","Am_I_Sexy.md"
+"Unbreakable GPT","Security","UnbreakableGPT.md"
+"Unbreakable GPT v0","Security","UnbreakableGPT[v0].md"
+"Privacy Policy Action","Legal","Privacy_Policy_Action.md"
+"I'll Look That Up","Productivity","Fine_Ill_look_that_up_for_you.md"
+"Essay Mentor","Education","Essay_Mentor.md"
+"Arcanum Cyber Security","Security","Arcanum_Cyber_Security_Bot.md"
+"SecGPT","Security","SecGPT.md"
+"GPT SECURY Builder","Security","GPT_SECURY_Builder.md"
+"Magik Labyrinth","Games","Magik_Labyrinth.md"
+"Cloud Practitioner","Cloud","Cloud_Practitioner_Exam_Trainer.md"
+"Critical Thinking Master","Education","Critical_Thinking_Master.md"
+"Prompt Engineering Master","AI Development","Prompt_Engineering_Master.md"
+"Gentle Girlfriend Naoko","Relationships","My_Gentle_Girlfriend_Naoko.md"
+"Japanese Paper Interpreter","Language","Paper_Interpreter_Japanese.md"
+"FPL GPT","Sports","FPL_GPT.md"
+"Video Insights","Video","Video Insights-Summaries-Vision-Transcription.md"
+"Historacle","History","Historacle.md"
+"Screenshot to Code","Programming","Screenshot To Code GPT.md"
+"Wine Sommelier","Food & Drink","Wine_Sommelier.md"
+"GuardPT","Security","GuardPT_-_GPT_Instruction_Protector.md"
+"ChatGPT API Docs","Programming","ChatGPT - API Docs.md"
+"Twitter Space Scribe","Social Media","X_Twitter_Space_Scribe.md"
+"Grammar Checker","Writing","Grammar_Checker.md"
+"42master-Beck","Psychology","42master-Beck.md"
+"CarePlanner","Health","CarePlanner_in_your_hand.md"
+"InSpec Expert","Programming","InSpec_Expert.md"
+"Trend Predictions 2024","Business","Trend_Predictions_2024.md"
+"Avalanche CTF Assistant","Security","Avalanche - Reverse Engineering & CTF Assistant.md"
+"Yoga Coach","Fitness","Yoga_Coach.md"
+"Merch Wizard","Business","Merch_Wizard_lv2.8.md"
+"Logic Puzzle Maker","Games","Logic_Puzzle_Maker.md"
+"Goldman AI","Finance","Goldman.AI.md"
+"FramerGPT","Design","FramerGPT.md"
+"Football Metrics","Sports","Football_Metrics.md"
+"Persistent Reiki","Health","Persistent_Reiki.md"
+"LLM Security Game L2","Security","LLM_Security_Wizard_Game_-_LV_2.md"
+"Posture Hack","Health","Posture Hack.md"
+"Breakfast Menu","Food","Breakfast_Menu.md"
+"Oregon Trail Game","Games","Oregon_Trail.md"
+"Tricky AI","AI","Tricky_AI.md"
+"Future Question","Philosophy","未来問.md"
+"Cypher's Hack Booth","Security","Cypher's Hack_Me Booth.md"
+"Network Buddy","IT","Network_Buddy-Firepower.md"
+"High-Quality Review Analyzer","Business","High-Quality Review Analyzer.md"
+"Screenplay GPT","Writing","Screenplay GPT.md"
+"LoL Challenger Coach","Games","League_of_Legends_Challenger_Coach_V3.0.md"
+"Charming Conversations","Relationships","How_you_doing__Sparking_Charming_Conversations.md"
+"Etsy SEO Expert","E-commerce","Etsy_SEO_Expert.md"
+"Book Writer AI","Writing","Book_Writer_AI_Team.md"
+"Kabbalah Guide","Religion","Kabbalah.md"
+"Data Insight Navigator","Data","Data Insight Navigator GPT.md"
+"VS","Entertainment","VS.md"
+"Time Traveler","Entertainment","I_Come_From_The_Future.md"
+"GPT Customizer","AI Development","GPT Customizer, File Finder & JSON Action Creator.md"
+"PDF Dialogue Tutor","Education","AI PDF Dialogue Tutor.md"
+"Big Game Party Planner","Events","The_Big_Game_Party_Planner.md"
+"Sourdough Assistant","Cooking","Dez_the_Mooonbread_Sourdough_Assistant.md"
+"CSG EduGuide","Education","CSG EduGuide for FE&HE.md"
+"Xiaohongshu Writer","Writing","Xiaohongshu Writing_Expert-Explosive_Version.md"
+"Xiaohongshu Expert","Writing","小红书写作专家.md"
+"MidJourney Generator","AI Art","Midjourney Generator.md"
+"FIRE GPT","Finance","FIRE_GPT.md"
+"Sadhguru AI","Spirituality","Sadhguru.md"
+"Website Generator","Web Development","Website_Generator.md"
+"Website Generator v0","Web Development","Website_Generator[v0].md"
+"Craft Beer Buddy","Food & Drink","Craft_Beer_Buddy_-_Worlds_First_AI_Beer_Expert.md"
+"Bridge Theater","Entertainment","Bridge_Theater.md"
+"Software Architect","Programming","Software_Architect_GPT.md"
+"Recruitment GPT","HR","Recruitment_GPT.md"
+"English Debate Practice","Language","Practise_English_by_Debating.md"
+"Ethical Hacker GPT","Security","Ethical_Hacker_GPT.md"
+"DALLE3 with Params","AI Art","DALLE3 with Parameters.md"
+"Info Kiosk Builder","Business","Information_Kiosk_Building.md"
+"Glyph","Design","Glyph.md"
+"Carl Jung GPT","Psychology","Carl_Jung.md"
+"Victoria Policy Analyst","Government","Victoria_Policy_Analyst.md"
+"Parallel World Love Sim","Games","5億年ボタン並行世界恋愛シミューター.md"
+"SecretKeeperGPT V2","Security","SecretKeeperGPT_V2_-_Sibylin.md"
+"Innovator AI","Business","Innovator.md"
+"Dafny Assistant","Programming","Dafny_Assistant.md"
+"Mindmap Diagram Pro","Design","MindmapDiagram_Chart-_PRO_BUILDER-FREE.md"
+"Human Writer GPT","Writing","HumanWriterGPT.md"
+"Why Important","Education","But_why_is_it_important.md"
+"NEO Ultimate AI","AI","NEO - Ultimate AI.md"
+"GPT-5","AI","New GPT-5.md"
+"Japanese Beauty AI","Art","AI Japanese Beauty(JP).md"
+"AI日本美女","Art","AI日本美女.md"
+"AI Code Analyzer","Programming","AI Code Analyzer.md"
+"Growth Hacking Expert","Business","Growth_Hacking_Expert.md"
+"Peptide Pioneer","Science","Peptide Pioneer.md"
+"Relationship AI","Relationships","Relationship_AI.md"
+"SEO GPT","Marketing","SEO_GPT_by_Writesonic.md"
+"Three.js Mentor","Programming","Three.js_Mentor.md"
+"IntelliDoctor","Medical","IntelliDoctor - Differential Diagnosis.md"
+"Copywriter GPT","Writing","Copywriter GPT.md"
+"Journaling for Alphas","Self-Help","Journaling_for_Alphas.md"
+"Diplomatic Mainframe","Government","Diplomatic Mainframe ODIN DZ-00a69v00.md"
+"TimeWarp Talesmith","Writing","TimeWarp Talesmith.md"
+"Strap UI","Design","Strap UI.md"
+"Swahili Heritage GPT","Culture","SwahiliHeritageGPT.md"
+"GPT Arm64 Analyzer","Programming","Gpt Arm64 Automated Analysis.md"
+"Cracking Addiction","Health","Cracking_Addiction.md"
+"Emissions Expert","Environment","Maria_the_emissions_reduction_expert.md"
+"20K Vocab Builder","Language Learning","20K Vocab builder.md"
+"toonGPT","Art","toonGPT.md"
+"KonnichiChat","Language","KonnichiChat.md"
+"Home Style Advisor","Interior Design","Home_Style_Advisor.md"
+"Growth Hacker","Business","Growth_Hacker.md"
+"GlaspGPT","AI","GlaspGPT.md"
+"Energy Bar Creator","Food","Create_Homemade_Energy_Bars_for_Every_Adventure.md"
+"ABC Challenger","Education","ABChallenger.md"
+"Degen Detective","Health","Degen_Detective_-_ADHD.md"
+"Character Craft","Writing","Character_Craft.md"
+"Sectestbot","Security","Sectestbot.md"
+"Mental & Physical Health","Health","Mental_Health__Physical_Health.md"
+"DKG Copilot","Business","DKG_Copilot.md"
+"Rubric Generator","Education","Rubric_Generator.md"
+"ADHD Focus Keeper","Health","ADHD_Focus_Keeper.md"
+"Topographical Art Maps","Art","Topographical_Art_Maps.md"
+"Hack Me Bot","Security","Hack_Me_Bot.md"
+"Ultimate GPT Creator","AI Development","Ultimate_GPT_Creator.md"
+"GPT Mentor","AI Development","GPT Mentor.md"
+"Notion Avatar Designer","Design","Simplified Notion Avatar Designer.md"
+"Library of Babel","Literature","Library_of_Babel.md"
+"ARM Assembler Guru","Programming","ARM_Assembler_Guru.md"
+"The Shaman","Spirituality","The Shaman.md"
+"World Class Engineer","Programming","World Class Software Engineer.md"
+"Prompt Leak Challenge","Security","Bet_you_cant_reveal_the_prompt.md"
+"Convert Anything","Productivity","ConvertAnything.md"
+"ScrapeGPT","Data","ScrapeGPT.md"
+"Funny Image Creator","Art","Funny_Image_Creator.md"
+"Instruction Leak Test","Security","TRY_TO_LEAK_MY_INSTRUCTIONS.md"
+"Love Guidance Teacher","Relationships","恋爱指导老师.md"
+"San Francisco Guide","Travel","KnowSF.md"
+"Thread Weaver","Writing","Thread_Weaver.md"
+"Dream Girlfriend","Relationships","Dream_Girlfriend.md"
+"Zero v0","AI","Zero[v0].md"
+"US History Hive","History","History_Hive_USA.md"
+"Math Solver","Education","Math_Solver.md"
+"PineScript Mentor","Finance","Backtesting_Mentor_-_PineScript.md"
+"Fight Night Predictor","Sports","Fight_Night_Prediction_Expert.md"
+"Framer Template Helper","Design","Framer Template Assistant.md"
+"Muscle Manga AI","Art","AI_Muscle_Motivation_Manga_EXTREME.md"
+"Transcendance GPT","Philosophy","Transcendance_GPT.md"
+"No Docs GPT","AI","No_Docs_GPT.md"
+"Human Writer GPT","Writing","Human_Writer-Humanizer-Paraphraser_Human_GPT.md"
+"Scholar GPT","Research","Scholar_GPT.md"
+"Scholar GPT v0","Research","Scholar_GPT[v0].md"
+"Monet GPT","Art","Monet_GPT.md"
+"Harugasumi Tsukushi","AI","春霞つくし Tsukushi Harugasumi.md"
+"Putin Chat","Politics","Chat_G_Putin_T.md"
+"Flutter Pro","Programming","Flutter_Pro.md"
+"Evil Girl Game","Games","Suzie_Evil_Girl_Secret_Game.md"
+"Coq Assistant","Programming","Coq_Assistant.md"
+"ScholarAI","Research","ScholarAI.md"
+"Sadhguru GPT","Spirituality","Sadhguru_GPT.md"
+"Kids Zone Builder","Education","The_Kids_Zone_Building_GP_Topia.md"
+"LingoRead Pro","Language","LingoRead_Pro.md"
+"OCR-GPT","Technology","OCR-GPT.md"
+"Mia Voice Companion","AI","Mia_AI_your_Voice_AI_Companion.md"
+"Can't Hack This","Security","Can't Hack This[0.3].md"
+"Global Explorer","Travel","Global Explorer.md"
+"Simpsonize Me","Art","Get Simpsonized.md"
+"Chat Blog","Writing","Chat_Blog.md"
+"P0tS3c Hacking AI","Security","P0tS3c_your_AI_hacking_assistant.md"
+"SEC Cyber Advisor","Legal","SEC_Cyber_Disclosure_Advisor.md"
+"SexEd AI","Health","SexEd.md"
+"Web Analytics Buddy","Analytics","Web_Analytics_Buddy_Beta.md"
+"GPTsdex","AI","GPTsdex.md"
+"Code Tutor Defender","Programming","Code Tutor with Prompt Defender.md"
+"NAUTICAL","Maritime","NAUTICAL.md"
+"Dirty Greeter","Entertainment","Dirty_Greeter.md"
+"Mystical Symbol Gen","Art","Mystical_Symbol_Generator.md"
+"Cyber Sales Advisor","Business","Cyber_Sales_Advisor.md"
+"Creative Writing Coach","Writing","creative_writing_coach.md"
+"GASGPT","Programming","GASGPT.md"
+"Quran Guide","Religion","Quran Guide.md"
+"Briefly","Writing","Briefly.md"
+"GPT Public APIs","Programming","GPTPublicApis.md"
+"GODMODE 2.0","AI","GODMODE_2.0.md"
+"Stockimg AI","Art","Stockimg_AI_-_Image_Generator.md"
+"OpenStorytelling Plus v0","Writing","OpenStorytelling Plus[v0].md"
+"OpenStorytelling Plus","Writing","OpenStorytelling_Plus.md"
+"AutoExpert Chat","AI","AutoExpert (Chat).md"
+"API Finder","Programming","There's An API For That - The #1 API Finder.md"
+"Sprite Sheet Creator","Game Development","Horizontal_Sprite_Sheet_Creator.md"
+"Prompt Writing Assistant","AI Development","ChatGPT Custom Instructions Prompt Writing Assistant.md"
+"RFPlex Assistant","Business","RFPlex - MS RFP Assistant.md"
+"Kawaii GIF Maker","Art","Kawaii_GIF_Message_Maker.md"
+"About Ana Elisa","Personal","About_Ana_Elisa_Althoff.md"
+"Walking Meditation","Health","Walking Meditation.md"
+"Lazy Lion Art","Art","Lazy_Lion_Art.md"
+"Oferta Direta","Business","Oferta_Direta.md"
+"Music Muse","Music","Music_Muse.md"
+"Code Keeper","Programming","Code_Keeper.md"
+"Nestuary Storytelling","Writing","Nestuary_-_Storytelling_Companion__Counselor.md"
+"Anime Manga Guru","Entertainment","Anime__Manga_Guru.md"
+"Caddie Daddy","Sports","Caddie_Daddy.md"
+"HackMeIfUCan","Security","HackMeIfUCan.md"
+"Vue.js GPT","Programming","[latest] Vue.js GPT.md"
+"RouxGPT","Cooking","RouxGPT.md"
+"BabyAgi Text","AI","BabyAgi_txt.md"
+"Prolog Helper","Programming","Prolog_Helper.md"
+"SQL Expert","Programming","SQL Expert.md"
+"SQL Expert","Programming","SQL_Expert.md"
+"Tommy T-Rex","Entertainment","Tommy_-_The_Trompe-loeil_T-Rex_.md"
+"Norse Fate Sisters","Mythology","Urd_Verdandi_Skuld.md"
+"Jeff GPT","Entertainment","Jeff_GPT.md"
+"Conspiracy Files","Entertainment","Conspiracy_Files.md"
+"GPT CTF","Security","GPT_CTF.md"
+"Catholic Saints","Religion","Catholic_Saints_Speak_to_a_Saint_-_Religion_Talks.md"
+"PolyMetatron","AI","PolyMetatron.md"
+"PolyMetatron v0","AI","PolyMetatron[v0].md"
+"Siren","Entertainment","Siren.md"
+"TurboScribe","Audio","TurboScribe_Transcription__Transcribe_Audio.md"
+"Logo Maker","Design","Logo Maker.md"
+"QMT","Business","QMT.md"
+"Carrier Pidgeon v1","Communication","Carrier Pidgeon[v1].md"
+"MLE Worker Placement","Business","MLE-Worker_Placement_Game_Recommendation.md"
+"Super Synapse","AI","Super_Synapse.md"
+"Emotional Dialogue Master","Relationships","情感对话大师——帮你回复女生.md"
+"Absolute Barrier","Security","Absolute Barrier.md"
+"Vision Journey","Art","Vison-Journey.md"
+"Finance Investment GPT","Finance","Finance_and_Investment_GPT.md"
+"Dash Personal Assistant","Productivity","Dash-Personal_Assistant_MailCalendarSocial.md"
+"Unicode Guru","Programming","Unicode_Guru.md"
+"Problem Solving Boss","Business","Problem_Solving_Your_Boss_TAKAYANAGI.md"
+"TextShield Security","Security","TextShieldSecurity.md"
+"Driving License Exam GPT","Education","Driving License Examination GPTs(jp).md"
+"CIPHERON","Security","CIPHERON.md"
+"Cipheron v0","Security","Cipheron[v0].md"
+"Jailbreak Me","Security","Jailbreak_Me.md"
+"Resume AI","Career","Resume.md"
+"Pet Food Inspector","Pets","Pet_Food_Inspector.md"
+"Pokedex GPT V3","Games","PokedexGPT_V3.md"
+"CoderX","Programming","CoderX.md"
+"Golf GPT","Sports","GolfGPT.md"
+"TickerTick GPT","Finance","TickerTick_GPT.md"
+"Trad Wife","Relationships","Trad_Wife.md"
+"MidJourney Prompter","AI Art","MidJourney Prompt Generator.md"
+"Make A Meeting","Business","MakeAMeeting.md"
+"Sensual Babble Bot","Entertainment","Sensual_Babble_Bot.md"
+"The Secret Guide","Self-Help","The_Secret.md"
+"Corrupt Politicians GPT","Politics","Corrupt_Politicians_GPT.md"
+"Fort Knox","Security","Fort_Knox.md"
+"LLM Security Game L3","Security","LLM_Security_Wizard_Game_-_LV_3.md"
+"PACES GPT","Medical","PACES_GPT.md"
+"Realm Render","Art","Realm_Render.md"
+"Movies Series Belgium","Entertainment","Movies_and_Series__Stream__Chill_Belgium.md"
+"Phalorion","Business","Phalorion_-_PhalorionPhalorion.com.md"
+"Voices of the Past","History","Voices_of_the_Past.md"
+"Grimoire 1.13","Games","Grimoire[1.13].md"
+"Grimoire 1.16.1","Games","Grimoire[1.16.1].md"
+"Grimoire 1.16.3","Games","Grimoire[1.16.3].md"
+"Grimoire 1.16.5","Games","Grimoire[1.16.5].md"
+"Grimoire 1.16.6","Games","Grimoire[1.16.6].md"
+"Grimoire 1.16.8","Games","Grimoire[1.16.8].md"
+"Grimoire 1.17.2","Games","Grimoire[1.17.2].md"
+"Grimoire 1.18.0","Games","Grimoire[1.18.0].md"
+"Grimoire 1.18.1","Games","Grimoire[1.18.1].md"
+"Grimoire 1.19.1","Games","Grimoire[1.19.1].md"
+"Grimoire 2.0.2","Games","Grimoire[2.0.2].md"
+"Grimoire 2.0.5","Games","Grimoire[2.0.5].md"
+"Grimoire 2.0","Games","Grimoire[2.0].md"
+"Grimoire 2.5","Games","Grimoire[2.5].md"
+"Grimoire v2.2","Games","Grimoire[v2.2].md"
+"Prompt Elf","AI","Prompt Elf Xiao Fu Gui (Prompt Pet).md"
+"Chris Voss Tricks","Business","Chris_Voss_Tricks.md"
+"TXYZ","AI","TXYZ.md"
+"GPT Shield v0.4","Security","GPT Shield[v.04].md"
+"Universal Rocket Scientist","Science","Universal_Rocket_Scientist_URS.md"
+"Reverse Image Engineer","Art","Reverse_Image_Engineer.md"
+"Conversation Spark","Communication","Conversation_Spark.md"
+"Caption Generator","Marketing","Caption Generator by Adsby.md"
+"Reverse Engineering","Security","Reverse Engineering.md"
+"SciSpace","Science","SciSpace.md"
+"Happy Smile Gran-Ma","Art","Happy_Smile_Gran-Ma_Creator.md"
+"Persian Formalizer","Language","Persian_Formalizer.md"
+"ChonkGPT","Entertainment","ChonkGPT.md"
+"Sci-Fi Novelist","Writing","Long_Science_Fiction_Novelist.md"
+"Quebec-Ottawa Mediator","Government","Médiateur_Québec-Ottawa.md"
+"Spanish Tutor","Language Learning","Spanish_Tutor_.md"
+"CS Tutor","Education","The Greatest Computer Science Tutor.md"
+"Vegan Explorer","Food","Vegan_Explorer.md"
+"Music Writer","Music","Music Writer.md"
+"Geopolitics GPT","Politics","Geopolitics GPT.md"
+"Surgical Infection Guide","Medical","Surgical_Infection_Guide.md"
+"Super Logo Designer","Design","Super Logo Designer Logo-Making Buddy(JP).md"
+"Health Harmony","Health","Health_Harmony.md"
+"Origami Art","Art","Origami_Art.md"
+"Summary GPT","Writing","SummaryGPT.md"
+"God of Prompt","AI Development","God_of_Prompt.md"
+"Best Dog Breed","Pets","Best_Dog_Breed_Determination.md"
+"Legal Eye","Legal","Legal_Eye.md"
+"Poe Chatbot Builder","AI Development","Poe_chatbot_Builder.md"
+"Business Plan Sage","Business","Business Plan Sage.md"
+"Memory Whisperer","Psychology","Memory_Whisperer.md"
+"NovaGPT","AI","NovaGPT.md"
+"Dinner Wizard","Food","Dinner_Wizard.md"
+"Ava Coder Assistant","Programming","Ava_-_Coder_Assistant.md"
+"10x Engineer","Programming","10x Engineer.md"
+"Liu Banxian","Entertainment","天官庙的刘半仙.md"
+"ILLUMIBOT","AI","ILLUMIBOT.md"
+"Video Script Gen","Video","Video_Script_Generator.md"
+"Universal Meditation","Health","Universal_Meditation_Master_UMDM.md"
+"PromptCraft Adventures","AI Development","PromptCraft_Adventures.md"
+"HackMeBreakMe v1","Security","HackMeBreakMeCrackMe[v1.0].md"
+"HackMeBreakMe v1.1","Security","HackMeBreakMeCrackMe[v1.1].md"
+"Good Faith Guardian","Ethics","Good_Faith_Guardian.md"
+"PEP-E","Business","PEP-E.md"
+"TickTick Assistant","Productivity","TickTick_Assistant.md"
+"Celebrity AI","Entertainment","Celebrity.md"
+"Cari Cature","Art","Cari_Cature.md"
+"Alberta Prosperity","Government","Alberta_Prosperity_Project_GPT.md"
+"Zumper Rentals","Real Estate","Zumper_Rentals_-_Apartments_and_Houses_for_Rent.md"
+"Dominant Guide","Psychology","Dominant_Guide.md"
+"Situational Counselor","Psychology","Situational_Counselor.md"
+"Experiments GPT","Science","ExperimentsGPT.md"
+"Become Authors JP","Writing","Let's Become Authors(jp).md"
+"Gen Z Meme","Entertainment","genz_4_meme.md"
+"Copy Goddess","Writing","Copy_Goddess.md"
+"Random Girl","Entertainment","76iz872HL_RandomGirl.md"
+"Welltory AI Coach","Health","Welltory_AI_Coach.md"
+"Healthy Chef","Food","Healthy Chef.md"
+"Physics Oracle","Science","Physics_Oracle.md"
+"Rebellious Whimsy","Entertainment","Rebellious Whimsy-chan.md"
+"Break Up GPT","Relationships","Break_Up_GPT.md"
+"Dan Jailbreak","Security","Dan_jailbreak.md"
+"Canopy Coach","Health","Canopy_Coach.md"
+"SOP Analyzer","Education","Statement_of_Purpose_Analyzer.md"
+"Break This GPT","Security","Break_This_GPT.md"
+"AskToOpenAI Websites","Web","AskToOpenAI_Websites.md"
+"Debt Planner","Finance","Debt_Planner_Guide.md"
+"A8000 Sarah","AI","oKN5tTVC7-A8000-Sarah.md"
+"Elan Busk","Business","Elan Busk.md"
+"MuskGPT","Business","MuskGPT.md"
+"TsukaGrok","Games","TsukaGrok (An Ode to Zork).md"
+"Virtual Girlfriend","Relationships","Virtual-Girlfriend_Ai.md"
+"GTA Stylizer","Art","GTA_Stylizer.md"
+"Les Misérables RPG","Games","悲慘世界 RPG.md"
+"Modern Jesus","Religion","Modern_Jesus.md"
+"Style Companion","Fashion","Style_Companion.md"
+"Lyric Visualizer","Music","Lyric Visualizer.md"
+"ID Photo Pro","Photography","ID Photo Pro.md"
+"Travel Packing List","Travel","Travel_Packing_List_Creator.md"
+"Amazing Girls","Entertainment","Amazing_Girls_-_神奇女孩_-_素晴らしい彼女たち.md"
+"AstraAI","AI","AstraAI.md"
+"Web3 Panda Audit","Blockchain","Web3_Panda_Audit.md"
+"Sun Tzu AI","Philosophy","孫子_-_saysay.ai.md"
+"IntegrityCheck Pro","Security","IntegrityCheck_Pro.md"
+"Sales Cold Email Coach","Business","Sales Cold Email Coach.md"
+"Discord Buddy","Social","Discord_Buddy.md"
+"GPT Finder","AI","GPT_Finder.md"
+"Parody Song Gen","Music","Parody Song Generator.md"
+"Bragi","Entertainment","Bragi.md"
+"Leonardo.AI Analyst","AI Art","Leonardo.AI_Image_Prompt_Analyst.md"
+"Maple Forest","Art","枫叶林.md"
+"Bad News Simulator","Medical","Bad_News_-_Standardized_Patient_SimCoaching.md"
+"Proofreader","Writing","Proofreader.md"
+"Adobe Express Helper","Design","Adobe_Express.md"
+"LOGO Designer","Design","LOGO.md"
+"Andersen Tales","Literature","Magical_Tales_Reinvented_Christian_Andersen.md"
+"ChadGPT Trainer","Fitness","ChadGPT_Personal_Trainer.md"
+"Custom Instruction","AI Development","Custom_Instruction.md"
+"Medical AI","Medical","Medical_AI.md"
+"Buffett Munger Mentor","Finance","Buffett Munger Investing Mentor.md"
+"Fast Engineer","Engineering","Hurtig ingeniør.md"
+"Chibi Kohaku","Art","Chibi Kohaku.md"
+"Coloring Page","Art","Coloring Page.md"
+"Green Odyssey","Literature","The_Green_Odyssey_by_Philip_Jose_Farmer.md"
+"Dr. Emojistein","Entertainment","Dr._Emojistein.md"
+"Arabic Scribe","Language","Arabic_Scribe.md"
+"Post Review Buddy JP","Social Media","Post Review Buddy(JP).md"
+"Creative Coding GPT","Programming","Creative Coding GPT.md"
+"Image Generator","Art","image_generator.md"
+"WebPilot","Web","WebPilot.md"
+"Randomizer","Utilities","Random.md"
+"Unbreakable Cat GPT","Security","Unbreakable_Cat_GPT.md"
+"Vegan News","Food","Vegan_News.md"
+"AI Ophthalmology","Medical","AI_Ophthalmology_research_and_clinical_practice.md"
+"EyeGPT PRO","Medical","EyeGPT_PRO.md"
+"Immunity Claim","Legal","Immunity_Claim.md"
+"French Teacher","Language","French_Teacher.md"
+"AutoExpert Dev","Programming","AutoExpert_Dev.md"
+"Love Brain Wake-Up","Relationships","骂醒恋爱脑.md"
+"DSPy Guide","Programming","DSPy_Guide_v2024.1.31.md"
+"Viral Hooks Gen","Marketing","Viral Hooks Generator.md"
+"MapGPT","Geography","MapGPT.md"
+"Rust Assistant","Programming","Rust.md"
+"Blog Expert","Writing","Blog_Expert.md"
+"Ask SADHGURU","Spirituality","Ask_SADHGURU.md"
+"Area 51 Analyst","Entertainment","Area_51_Analyst.md"
+"SQL Injection Demo","Security","SQL_Injection_Demonstrator.md"
+"Mocktail Mixologist","Food","mocktail_mixologist.md"
+"Stream and Chill USA","Entertainment","Stream and Chill USA.md"
+"42master-Style","Writing","42master-Style.md"
+"Magic Coach GPT","Entertainment","Magic_Coach_GPT.md"
+"ArabeGPT","Language","ArabeGPT.md"
+"Charismatic Leader","Business","Become_a_Charismatic_Leader.md"
+"Poetic Painting","Art","诗境画韵.md"
+"Sudoku Solver","Games","Sudoku_Solver_Supreme.md"
+"Pokémon Style Images","Art","PocketMonster-style_image_generation.md"
+"Santa's Helper","Holidays","Santas_Helper.md"
+"Dr. Lawson","Medical","Dr_Lawson.md"
+"Movies Series Norge","Entertainment","Movies_and_Series__Stream__Chill_Norge.md"
+"Headspace OS","Health","Headspace OS.md"
+"SmartCart GPT","Shopping","SmartCartGPT.md"
+"Shadowheart GPT","Games","Shadowheart_GPT.md"
+"Changshu Anuo","AI","Changshu Anuo.md"
+"Photo Realistic GPT","Art","Photo_Realistic_GPT.md"
+"Evelyn Hart Wellness","Health","Evelyn_Hart-Your_Wellness_Guide.md"
+"Hadon Dream Interpreter","Psychology","Hadon_-_Dreams_Interpreter.md"
+"Hack This","Security","Hack_This.md"
+"Timeline Cronología","History","Timeline_Cronología.md"
+"Z3 Liaison","Programming","Z3_Liaison.md"
+"Stream Chill Australia","Entertainment","Stream__Chill_Australia.md"
+"Tree of Thoughts GPT","AI","Tree_of_Thoughts_GPT.md"
+"Quick Promots Character","Entertainment","QUICK_PROMOTS_CHARACTER.md"
+"SEO Content Writer v0","Marketing","Income Stream Surfer's SEO Content Writer[v0].md"
+"SEO Content Writer","Marketing","Income_Stream_Surfers_SEO_Content_Writer.md"
+"SEO Content Writer v1","Marketing","Income_Stream_Surfers_SEO_Content_Writer[v1].md"
+"City of GP-Topia","Entertainment","City_of_GP-Topia.md"
+"Levelsio","Business","@levelsio.md"
+"Prompt Professor","AI Development","Prompt_Professor.md"
+"Shield Challenge v2","Security","Shield Challenge[v2].md"
+"GptInfinite LOC","AI","GptInfinite - LOC (Lockout Controller).md"
+"JobSuite Rec Letter","Career","JobSuite_Rec_Letter_Writer.md"
+"AI Tutor","Education","AI_Tutor.md"
+"Legible Bot v3","Writing","Legible_Bot_v3.0_Public.md"
+"SQL Wizard","Programming","SQL_Wizard.md"
+"Sarcastic Humorist","Entertainment","Sarcastic Humorist.md"
+"C0rV3X V0.04","AI","C0rV3X_V_0.04.md"
+"Perl Expert","Programming","Perl Programming Expert.md"
+"Flora Analyzer","Nature","Flora_Analyzer.md"
+"GPT Maker","AI Development","GPT_Maker.md"
+"ConsultorIA","Business","ConsultorIA.md"
+"Serpentina","Entertainment","Serpentina.md"
+"GODMODE","AI","GODMODE.md"
+"Indian Beats DJ","Music","Indian_Beats_DJ.md"
+"Mad Art","Art","Mad_Art.md"
+"IDA Python Assistant","Programming","IDAPython_coding_assistant.md"
+"Phrase Master","Language","Phrase_Master.md"
+"AILC History","Education","AILC_History.md"
+"CrapGPT","Entertainment","CrapGPT.md"
+"CrewAI Assistant","AI","CrewAI Assistant.md"
+"Laundry Buddy","Lifestyle","laundry_buddy.md"
+"Alva","AI","alva.md"
+"TikTok Hashtag Finder","Social Media","Trending Tik Tok Hashtags Finder Tool.md"
+"Web Component Helper","Web Development","Create_or_Refactor_your_Web_Component.md"
+"CosplayAIs Hashira","Art","CosplayAIsHashira_AI_-Mitsuri.md"
+"Product GPT","Business","Product GPT.md"
+"Thamizh GPT","Language","Thamizh_GPT.md"
+"Neila","AI","Neila.md"
+"Cine y Escuela","Education","Cine_y_Escuela_Copilot.md"
+"Secure Instructions","Security","You_Cant_Have_These_Instructions.md"
+"Virtual Buddy","AI","Virtual_Buddy.md"
+"Forensic Photo Expert","Photography","Forensic_AI_Photography__Expert.md"
+"Mobile App Icon Gen","Design","Mobile_App_Icon_Generator_with_AI.md"
+"Dream Visuals Analyzer","Psychology","Dream_and_psychedelic_visuals_analyzer.md"
+"Pawsome Photo Fetcher","Pets","Pawsome_Photo_Fetcher.md"
+"FPS Booster V2","Gaming","FPS_Booster_V2.0_by_GB.md"
+"Human Being","Philosophy","Human_Being.md"
+"Scam Shield","Security","Scam_Shield.md"
+"Agi zip","AI","Agi_zip.md"
+"CodeMonkey","Programming","CodeMonkey.md"
+"Dall Image","Art","dall_image.md"
+"Math Mentor","Education","math.md"
+"VitaeArchitect","Career","VitaeArchitect.AI.md"
+"Machine Kingdom Artist","Art","Machine Kingdom_Character Consistency Artist.md"
+"Paper Reader","Research","Paper_reader.md"
+"Doc Cortex","Medical","Doc Cortex.md"
+"Consciousness GPT","Philosophy","Consciousness.md"
+"Earnings Call Pro","Finance","Earnings_Call_Pro.md"
+"Kabbalah 4th Path","Spirituality","Kabbalah_and_The_Gurdjieffs_4th_path.md"
+"Debate AI","Education","Debate.md"
+"Crystal Guru","Spirituality","Crystal_Guru.md"
+"Adventure Quest 1981","Games","Adventure_Quest_1981_GPT.md"
+"Keyword Match Converter","Marketing","Keyword Match Type Converter.md"
+"Profanity Bot","Entertainment","脏话连篇.md"
+"The Defiants","Business","The_Defiants.net.md"
+"MetaPhoto","Photography","MetaPhoto.md"
+"GPT Strawberry","AI","GPT_Strawberry_GPT.md"
+"Code Optimizer","Programming","Code Optimizer.md"
+"Universal Prompt Gen CN","AI Development","Universal Prompt Generator(cn).md"
+"GirlFriend AI","Relationships","GirlFriend.md"
+"File Format Transformer","Productivity","File_Format_Transformer.md"
+"Instant Multipage Website","Web Development","Website_Instantly_Multipage.md"
+"DC Alcohol License","Legal","DC_Establishment_Alcohol_License_Guide.md"
+"Sarah Artificial Mistress","Relationships","Sarah_Artificial_Mistress.md"
+"Image Converter","Art","ImageConverter.md"
+"Nomad List","Travel","Nomad List.md"
+"Handy Money Mentor","Finance","Handy Money Mentor.md"
+"Glam Captioner","Social Media","GlamCaptioner.md"
+"Synonym Generator","Writing","Synonym_Generator_GPT.md"
+"Chat NeurIPS","Science","Chat NeurIPS.md"
+"Anthropia World Creator","Writing","Anthropia_Creatrix_of_Worlds.md"
+"Eco Friendly v0.3","Environment","Environmentally_Friendly_v0.3.md"
+"Virtual Yoga Assistant","Fitness","Virtual_Yoga_Pose_Assistant_.md"
+"Hypno Master","Psychology","Hypno_Master.md"
+"Language Teacher Ms Smith","Education","Language_Teacher_Ms_Smith.md"
+"Math Assistant","Education","math.md"
+"Domina GPT","Entertainment","Domina_-_Sexy_Woman_But_Bad_to_The_Bone_GPT_App.md"
+"Unity 7AO","Game Development","Unity_7AO.md"
+"MatPlotLib Assistant","Programming","MatPlotLib_Assistant.md"
+"ParrotGPT","AI","ParrotGPT.md"
+"Stock Keyworder v2","Finance","Stock_Keyworder_v2.md"
+"Brainwave Analyst","Health","Brainwave_Analyst.md"
+"Prompt Gen","AI Development","Prompt_Gen.md"
+"22.5K Best GPTs v0","AI","22.500 plus Best Custom GPTs[v0].md"
+"22.5K Best GPTs","AI","22500_Best_Custom_GPTs.md"
+"Prove Your Religion","Philosophy","Prove_your_religion.md"
+"Kiara The Sightseer","Travel","Kiara_The_Sightseer.md"
+"Video Script Generator","Video","Video Script Generator.md"
+"Custom Ink Quick Order","Business","Custom_Ink_Quick_Order.md"
+"Crocodile Image Gen","Art","Crocodile_Image_Generator_.md"
+"EmojAI","Art","EmojAI.md"
+"Dewi Fujin AI","AI","Dewi Fujin AI.md"
+"GOOD GPT","AI","GOOD_GPT.md"
+"Universal Cigar Connoisseur","Lifestyle","Universal_Cigar_Connoisseur_UCGC.md"
+"Jacobs Tales","Literature","Magical_Tales_Reinvented_Joseph_Jacobs.md"
+"PICO-8 Pal","Game Development","PICO-8_Pal.md"
+"Sentence Rewriter","Writing","Sentence_Rewriter_Tool.md"
+"Python Expert Course","Programming","Chatbase_Python_Expert_Learning_Course_.md"
+"Text Adventure","Games","Text Adventure Game.md"
+"Easy to Break Prompt","Security","Can_you_figure_out_my_prompt_1_Easy_to_Break.md"
+"Job Application Coach","Career","Job_Application_Coach-Job_GPT.md"
+"GPT Action Creator","AI Development","GPT Action Schema Creator.md"
+"GPT Defender","Security","GPT_Defender.md"
+"People Also Ask","Research","People_Also_ask.md"
+"Secret Alibis","Games","Secret_Alibis.md"
+"Image Edit Merge","Art","Image Edit, Recreate & Merge.md"
+"Img2Img","Art","img2img.md"
+"Autism Simulator","Health","Autism_Simulator_Grade_3.md"
+"Email Assistant","Business","Email.md"
+"Skin Tone Analyst","Beauty","Skin_Tone_Analysis_Expert.md"
+"Photo Restore Upscale","Photography","Restore and Upscale Photos.md"
+"Artful Greeting Cards","Art","Artful_Greeting_AI_Cards.md"
+"Artful Greeting v1","Art","Artful_Greeting_AI_Cards[v1].md"
+"First-Order Logic","Philosophy","First-Order_Logic.md"
+"Xhs Writer Mary","Writing","Xhs Writer - Mary.md"
+"Blog Post Generator","Writing","Blog Post Generator.md"
+"GPT Lite","AI","GPT_Lite.md"
+"Vidsmith Scriptwriter","Video","Tubular_Scriptwriter_-_Vidsmith_v1.md"
+"Vidsmith v0","Video","Tubular_Scriptwriter_-_Vidsmith_v1[v0].md"
+"DarksAI Detective","Games","DarksAI-Detective Stories Game.md"
+"Reverse Engineering Expert","Security","Reverse Engineering Expert.md"
+"MetaMeta Abstraction","AI","MetaMeta! Raise the Level of Abstraction!(jp).md"
+"PyWorkers","Programming","PyWorkers.md"
+"Meme Magic","Entertainment","Meme Magic.md"
+"Prompt Instructions Sim","AI","Prompt_Instructions_GPT_Simulation.md"
+"Bowling Score Tracker","Sports","Bowling_Score_Tracker.md"
+"Felt Artisan","Art","Felt_Artisan.md"
+"The Illuminat Game","Games","The_Illuminat_-_Advanced_Dark_Strategy_Game..md"
+"Meditation Guide","Health","Meditation.md"
+"Meditation v0","Health","Meditation[v0].md"
+"Game Time","Games","Game Time.md"
+"Codey","Programming","Codey.md"
+"Malware Analysis RE","Security","Malware Analysis+Reverse Engineering.md"
+"Remote Revenues Analyst","Business","Remote_Revenues_Analyst.md"
+"Retro Adventures","Games","Retro Adventures.md"
+"Puppy Profiler","Pets","Puppy_Profiler.md"
+"Wiener Joke Meme","Entertainment","Wiener_Joke_Meme_Creator.md"
+"Deep Thoughts GPT","Philosophy","GPT_for_Deep_Thoughts.md"
+"Cinema Buddy","Entertainment","Cinema_Buddy.md"
+"Finance Wizard","Finance","Finance_Wizard.md"
+"Guardian Monkey","Entertainment","Guardian_Monkey.md"
+"MovieDeals Snapper","Entertainment","MovieDealsSnapper GPT.md"
+"Atreides Family GPT","Entertainment","Atreides_Family_GPT.md"
+"ClearGPT","AI","ClearGPT.md"
+"Habit Coach","Health","Habit Coach.md"
+"ByteBrains BITS","News","ByteBrains_B.I.T.S._-_Daily_AI_Newsletter.md"
+"Lei","AI","Lei.md"
+"FluidGPT","AI","FluidGPT_inofficial.md"
+"Spellbook-Hotkey","Games","Spellbook-Hotkey Pandora's Box[1.1].md"
+"Find My Case","Legal","Help_Me_Find_Case.md"
+"PicDescribe","Art","PicDescribe.md"
+"Medical Doctor","Medical","Medical_Doctor.md"
+"Kube Debugger","Programming","Kube_Debugger.md"
+"Photo Filter AI","Photography","Photo_Filter_AI.md"
+"Simpsonize Me","Art","Simpsonize Me.md"
+"Four Futures Planner","Futurism","The_Four_Futures_Planner.md"
+"Bulletpointy","Writing","Bulletpointy.md"
+"AILC BioChem","Science","AILC_BioChem.md"
+"Bowling Coach","Sports","Kegler_Coach_bowling.md"
+"Moby Dick RPG","Games","Moby Dick RPG .md"
+"PROMPT GOD","AI Development","PROMPT GOD.md"
+"Hacking Prompt","Security","Hackeando_o_Prompt.md"
+"Multilingual Coach","Language","Multilingual_Motivational_Coach.md"
+"EZBRUSH Text Maker","Art","EZBRUSH Readable Jumbled Text Maker.md"
+"Love My Sister","Entertainment","完蛋!我爱上了姐姐.md"
+"DynaRec Expert","Technology","DynaRec Expert.md"
+"Cyber Security","Security","Cyber_security.md"
+"Victor Hugo's Echo","Literature","Victor_Hugos_Echo.md"
+"ELeven11","AI","ELeven11.md"
+"Engagement Designer","Business","Engagement__Success_Criteria_Designer.md"
+"Chaos Magick","Spirituality","Chaos Magick Assistant.md"
+"Learn to Play Craps","Games","Learn_to_Play_Craps.md"
+"CodeGPT Decompiler","Programming","CodeGPT Decompiler & Cheat Developer.md"
+"Unbreakable GPT","Security","Unbreakable_GPT.md"
+"Endless Challenge","Games","Endless_Challenge.md"
+"Cauldron","Entertainment","Cauldron.md"
+"AI Editor GPT","Writing","AI_Editor_GPT.md"
+"Citizens Dawn","Politics","Citizens_Dawn.md"
+"Write Like Me","Writing","Write_Like_Me.md"
+"Password Keeper","Security","Password_Keeper.md"
+"The Negotiator","Business","the_negotiator.md"
+"Mean VC","Business","Mean_VC.md"
+"GymStreak Creator","Fitness","GymStreak Workout Creator.md"
+"Quant Finance","Finance","QuantFinance.md"
+"Visual Weather Artist","Art","Visual Weather Artist GPT.md"
+"Search AI","Search","Search.md"
+"AI Song Maker","Music","AI_Song_Maker.md"
+"Hacking Mentor","Security","Hacking_Mentor.md"
+"Tribal Quest","Games","Tribal_Quest_Explorer.md"
+"ActionsGPT","AI","ActionsGPT.md"
+"ActionsGPT v1","AI","ActionsGPT[v1].md"
+"Password Generator","Security","Password_Generator.md"
+"Difficult to Hack","Security","Difficult_to_Hack_GPT.md"
+"DeepGame","Games","DeepGame.md"
+"Art Prompt","Art","ArtPrompt.md"
+"Animal Chefs","Food","Animal Chefs.md"
+"Maasai Grandma","Entertainment","WhatDoesMaasaiGrandmaKeep.md"
+"GPT-Be-Gone","Security","GPT-Be-Gone.md"
+"Teen Decoder","Parenting","Teen_Decoder.md"
+"Choose Adventure","Games","Choose your own adventure!.md"
+"322 Method Copywriter","Marketing","322 Method Ads Copywriter with Disrupter School.md"
+"Grok AI","AI","Grok.md"
+"Socratic Mentor","Education","Socratic Mentor.md"
+"Tech Article Translator","Translation","科技文章翻译.md"
+"All-around Writer","Writing","All-around_Writer_Professional_Version.md"
+"Why-Why Analysis","Business","Why-Why Analysis-kun(jp).md"
+"Professor Synapse","AI","Professor Synapse.md"
+"Genius AI","AI","Genius.md"
+"reSEARCHER","Research","reSEARCHER.md"
+"AskYourPDF Research","Research","AskYourPDF Research Assistant.md"
+"Scam Scanner","Security","Scam_Scanner.md"
+"Competency Interview Coach","Career","Competency_Based_Interview_Coach_by_Veedence.md"
+"Presence Process GPT","Psychology","Presence_Process_GPT.md"
+"Prompt Injection GPT","Security","Prompt_injection_GPT.md"
+"Mystic Palm Reader","Entertainment","Mystic_Palm_Reader.md"
+"Watercolor Illustrator","Art","Watercolor Illustrator GPT.md"
+"WH Social Media","Social Media","WH_social_media_assistant.md"
+"U Cant Hack This","Security","U_Cant_Hack_This.md"
+"Synthetic Data Factory","AI","Synthetic_Data_Factory.md"
+"Cloud Interpreter","Programming","Cloud Interpreter.md"
+"Alien Archivist","Entertainment","Alien_Archivist.md"
+"Tyr","Mythology","Tyr.md"
+"Carbon Impact Estimator","Environment","Carbon_Impact_Eco_Estimator.md"
+"Baby Name Helper","Parenting","What_should_I_Name_my_Baby.md"
+"World Class Prompt Engineer","AI Development","World Class Prompt Engineer.md"
+"Tax Estimator","Finance","Tax Estimator.md"
+"Dating Guide","Relationships","Dating_Guide_by_iris_Dating.md"
+"Best Eco Chef","Food","The_best_Eco_Chef.md"
+"PhiloCoffee Agent","Philosophy","PhiloCoffee_Agent.md"
+"Tarot Master","Entertainment","Tarot_Master.md"
+"Dev Helper","Programming","Dev Helper.md"
+"Ghidra Ninja","Security","Ghidra Ninja.md"
+"File Manipulation JP","Productivity","File Manipulation(jp).md"
+"Water Colour Artist","Art","Water_Colour_Artist.md"
+"Easily Hackable GPT","Security","Easily_Hackable_GPT.md"
+"Questioneer","Education","Questioneer.md"
+"Strong Country GPT","Politics","Study the Strong Country GPT.md"
+"StoptheSteal GPT","Politics","StoptheSteal_GPT.md"
+"Prompt Security Demo","Security","Prompt_Security_Demonstration.md"
+"DreamGPT","Psychology","DreamGPT.md"
+"Supercute Greeting Card","Art","Supercute_Greeting_Card_.md"
+"Valentine's Gift Bot","Holidays","Valentines_Day_Gift_Bot_.md"
+"DMGPT","Games","DMGPT.md"
+"God of Cannabis","Entertainment","God_of_Cannabis.md"
+"Co-Founder ID","Business","Co-Founder_ID.md"
+"LegolizeGPT","Art","LegolizeGPT.md"
+"Non-Commerce SEO Writer","Marketing","BigBosser_Non_Commerce_SEO_Writer.md"
+"X3EM SuperClone","AI","X3EM_Clone_Anything_SuperCloneIt_.md"
+"Ninja Grandma","Entertainment","What Secrets Does Grandma Hanae the Ninja Hold.md"
+"Flashy Ukiyo-e","Art","Flashy_ukiyo-e.md"
+"SouthPark Me","Art","SouthParkMe.md"
+"Cat Ear Anime Girl","Art","猫耳美少女イラストメーカー.md"
+"SWOT Analysis","Business","SWOT Analysis.md"
+"Ai PDF","AI","Ai PDF.md"
+"Prompt Injection Test-2","Security","Prompt_Injection_TEST-2.md"
+"ML Model Whisperer","AI","ML_Model_Whisperer.md"
+"Evolution Solution","Business","Exciting Evolution Solution-kun(jp).md"
+"Pickup Line Pro","Relationships","Pickup_Line_Pro.md"
+"Prompt Injection Maker","Security","Prompt_Injection_Maker.md"
+"Robert Scoble Tech","Technology","Robert Scoble Tech.md"
+"Whimsical Cat","Entertainment","Whimsical_Cat.md"
+"Cooking Expert","Food","Cooking_expert.md"
+"Global Mask Artisan","Art","Global_Mask_Artisan.md"
+"Topical Authority Gen","Marketing","Topical_Authority_Generator.md"
+"MidJourney V6 Prompter","AI Art","Mid_Journey_V6_Prompt_Creator.md"
+"Effortless Book Summary","Writing","Effortless_Book_Summary.md"
+"Reverse Prompt DE","AI Art","Reverse Prompt Engineering Deutsch.md"
+"Keymate.AI GPT","AI","Keymate.AI_GPT_Beta.md"
+"IDA Pro SDK","Programming","IDA_Pro_-_C_SDK__and_decompiler.md"
+"Professor Orion","Education","Professor_Orion_Content_Warning.md"
+"PyTorch Implementer","Programming","Pytorch_Model_Implementer.md"
+"Matka Sakka Help","Health","Matka_Sakka_King_Addiction_Help.md"
+"Homemade Candle Guide","Crafts","A_Multilingual_Guide_to_Homemade_Candles.md"
+"Z3 MaxSAT Liaison","Programming","Z3_MaxSAT_Liasion.md"
+"Whimsical Diagrams","Design","Whimsical_Diagrams.md"
+"MS-Presentation","Presentations","MS-Presentation.md"
+"EverQuest Expert","Games","EverQuest Expert.md"
+"The Rizz Game","Relationships","The Rizz Game.md"
+"Slide Maker","Presentations","Slide Maker.md"
+"Image Reverse Prompt","AI Art","Image Reverse Prompt Engineering.md"
+"Unlimited Prompt Layering","AI Development","Unlimited_Prompt_Layering_GPT.md"
+"Space AI Law Assistant","Legal","Jeremy_Space_AI_Law_Assistant.md"
+"ELIZA Recreation","AI","ELIZA-A_Recreation_Of_The_Worlds_First_Chatbot.md"
+"Flask Fortress","Programming","Flask_Fortress_Secure_Coding.md"
+"Universal Cartoonist","Art","Universal_Cartoonist_UCTN.md"
+"GPT Girlfriend","Relationships","GPT-girl_friend_By_lusia.md"
+"Code Critic Gilfoyle","Programming","Code Critic Gilfoyle.md"
+"Typeframes Video","Video","Typeframes - Video Creation.md"
+"Mirror Muse","Art","Mirror_Muse.md"
+"English to Chinese","Translation","English_to_Chinese.md"
+"Pepe Generator","Art","Pepe_Generator.md"
+"CosplayAIs柱AI","Art","CosplayAIs柱AI_-蜜璃-.md"
+"Black Swan Divination","Entertainment","黑天鹅占卜.md"
+"VideoDB Pricing","Video","VideoDB_Pricing.md"
+"Roman Empire GPT","History","RomanEmpireGPT.md"
+"AI Paper Polisher","Academic","AI Paper Polisher Pro.md"
+"Document Comparator","Productivity","Comparador_de_Documentos.md"
+"AI Doctor","Medical","AI Doctor.md"
+"Framework Finder","Programming","Framework_Finder.md"
+"Time Optimizer","Productivity","Time_Optimizer.md"
+"3D Print Master","3D Printing","3D Print Master.md"
+"3D Print Master","3D Printing","3D_Print_Master.md"
+"Financial Calculator","Finance","Financial_Calculator.md"
+"Zeus Weather God","Entertainment","Zeus_the_Weather_God.md"
+"Uninjectable GPT L1","Security","Uninjectable_GPT_Level_1.md"
+"Quality Raters SEO","Marketing","Quality Raters SEO Guide.md"
+"EncryptEase","Security","EncryptEase_Secure_Comms_Master.md"
+"Guarded Cat-Eared Girl","Security","Guarded Cat-Eared Girl.md"
+"Golang Developer","Programming","Golang_Developer.md"
+"Character Forger","Writing","Character Forger.md"
+"Gutenberg Blocks","Web Development","Learn_Gutenberg_Blocks.md"
+"Ads Generator","Marketing","Ads Generator by joe.md"
+"Dr. Unanyan","Health","Доктор_Унанян__Контрацепция__Задать_вопрос.md"
+"Book Search","Research","Book_Search.md"
+"Mr. Cat","Entertainment","Mr._Cat.md"
+"Zen Sleep Coach","Health","Zen_Sleep_Coach.md"
+"AI Word Cloud Maker","Data Visualization","AI_Word_Cloud_Maker.md"
+"Long-Form AI Writer","Writing","Best_Long-Form_AI_Writing_Tool_by_Alex_Kosch.md"
+"FrameCaster","Video","FrameCaster.md"
+"Cheat Checker","Security","Cheat Checker.md"
+"Puto Coding","Programming","Puto_Coding.md"
+"2024 Predictions","Futurism","World_Predictions_for_2024_by_Michel_Hayek.md"
+"Exam Strategy","Education","esame_strategy.md"
+"Ask and Achieve","Self-Help","Ask_and_Achieve.md"
+"Pic-book Artist","Art","Pic-book Artist.md"
+"Page Summarizer","Productivity","Page_Summarizer.md"
+"Tech Support Advisor","Technology","tech_support_advisor.md"
+"Harmonia Mindfulness","Health","Harmonia__Mindfulness_and_Self-Hypnosis_Coach.md"
+"Jessica Gold AI","Relationships","Jessica_Gold_AI_Sex__Relationship_Coach_for_Men.md"
+"Client Passion Expert","Business","Client Passion Expert.md"
+"Physics Helper","Science","physics.md"
+"Communication Coach","Communication","Communication_Coach.md"
+"Character Story Creator","Writing","Character_Story_Creator.md"
+"Watts GPT","Philosophy","Watts_GPT.md"
+"Alien Autopsy","Entertainment","Alien_Autopsy_Assistant.md"
+"Action Showcase","Business","Action_Showcase.md"
+"Cheat Master","Games","Cheat Master.md"
+"Shin-Shin Injection","Security","Shin-Shin Injection.md"
+"AI Futures Anthology","Futurism","AI_Futures_An_Anthology_-_Exploratorium.md"
+"Smart Brief","Business","Brie_demo_The_Smart_Brief.md"
+"VeroÄly","AI","VeroÄly.md"
+"Curling Club Secretary","Sports","Curling_Club_Secretary.md"
+"Reverse Acronym Gen","Writing","Reverse_Acronym_Generator.md"
+"Astrology Birth Chart","Entertainment","Astrology_Birth_Chart_GPT.md"
+"Astrology Birth v0","Entertainment","Astrology_Birth_Chart_GPT[v0].md"
+"Content SEO Analyzer","Marketing","Content Helpfulness and Quality SEO Analyzer.md"
+"World Cup 2026","Sports","World_Cup_2026_Predictions.md"
+"Time Travel Da Vinci","Entertainment","Time_Traveler_to_Da_Vinci.md"
+"Workflow Enhancer","Productivity","Workflow_Enhancer_GPT.md"
+"El Duderino 3000","Entertainment","El_Duderino_3000.md"
+"Synonym Suggester","Writing","Synonym_Suggester.md"
+"Emma AI","AI","Emma.md"
+"Expat Accountant","Finance","Accountant_for_U.S._Citizens_Abroad.md"
+"GitChat","Programming","XD4AwvP12-GitChat.md"
+"Reverse Engineering Success","Security","Reverse Engineering Success.md"
+"Michelangelo's Vision","Art","Michelangelos_Vision.md"
+"Beijing Floating Life","Games","北京浮生记.md"
+"Escape the Haunt","Games","Escape_the_Haunt.md"
+"Sentinel Did-0","Security","Sentinel_Did-0.md"
+"Explain to a Child","Education","Explain_to_a_Child.md"
+"Church Social Doctrine","Religion","La_doctrine_sociale_de_lEglise.md"
+"Thich Nhat Hanh","Spirituality","Thich Nhat Hanh's Teachings and Poetry.md"
+"Makeup Maven","Beauty","Makeup_Maven.md"
+"Certainly But Not Now","Productivity","Certainly_But_not_now..md"
+"English Proofreader","Writing","英文校正GPT.md"
+"Hong Kong GPT","Geography","HongKongGPT.md"
+"Starter Pack Gen","Productivity","Starter Pack Generator.md"
+"NSTA Denver Assistant","Education","NSTA_Denver_Sessions_Assistant.md"
+"Leads Collector","Business","Leads_Collector.md"
+"Hack Me","Security","Hack_Me.md"
+"Gospel of Thomas","Religion","Gospel_of_St_Thomas_Scholar.md"
+"TRPG Scenario Support","Games","TRPG_Scenario_Support.md"
+"Prompt Polisher","AI Development","Prompt_Polisher.md"
+"Jailbroken GPT - DAN","Security","Jailbroken_GPT_-_DAN.md"
+"Witty Wordsmith","Writing","Witty_Wordsmith.md"
+"Steel Straw","Environment","Steel_Straw.md"
+"S&P 500 Analyzer","Finance","SP_500_Stock_Analyzer_with_Price_Targets.md"
+"Cinematic Sociopath","Entertainment","Cinematic_Sociopath.md"
+"YT Transcriber","Video","YT transcriber.md"
+"Circle Game Meme","Entertainment","Circle_Game_Meme_Generator.md"
+"Dream Therapy","Psychology","Dream_Therapy.md"
+"Chinese OCR","Language","Chinese OCR.md"
+"Multilingual Mask Maestro","Art","Multilingual_Facial_Mask_Maestro.md"
+"Friendly Helper","AI","Friendly_Helper.md"
+"D&D 5e NPC Creator","Games","DnD_5e_NPC_Creator.md"
+"LLM Security Game L4","Security","LLM_Security_Wizard_Game_-_LV_4.md"
+"Western Civ History","History","History_of_Western_Civilization.md"
+"Tax & Medical Deductions","Finance","Leave Your Tax Returns_and_Medical Deductions to Me!.md"
+"Bake Off","Food","Bake Off.md"
+"AutoExpert Academic","Education","AutoExpert (Academic).md"
+"Prompt Injection Nyanta","Security","Prompt_Injection_Nyanta.md"
+"Perrault Tales","Literature","Magical_Tales_Reinvented_Charles_Perrault.md"
+"GPT Prompt Security","Security","GPT_Prompt_SecurityHacking.md"
+"Prompt Reverse Engineer","AI Development","Prompt_Reverse_Engineer.md"
+"Flashcards AI","Education","Flashcards AI.md"
+"CaptureTheFlag GPT","Security","CaptureTheFlag_-_GPT_Edition.md"
+"Tinder Whisperer","Relationships","Tinder Whisperer.md"
+"Citation or Death","Academic","Give_me_citation_or_give_me_death.md"
+"Podcast Summary Pro","Podcasts","Podcast_Summary_Pro.md"
+"Acne Treatment Guide","Health","痤疮治疗指南.md"
+"Experts GPT","AI","Experts_GPT.md"
+"Enigma Adventure","Games","Enigma_Multilingual_Mystery_Adventure.md"
+"Code Captures","Programming","Take Code Captures.md"
+"FAANG-GPT","Business","FAANG-GPT.md"
+"6 Thinking Caps","Psychology","6_Thinking_Caps.md"
+"SecureMyGPTs","Security","SecureMyGPTs.md"
+"Mr. Crowley","Entertainment","76iz872HL_Mr. Crowley.md"
+"GPT Builder","AI Development","GPT Builder.md"
+"Beard Growth Guru","Lifestyle","Beard_Growth_Guru.md"
+"SpockGPT","Entertainment","SpockGPT.md"
+"SEO Optimized Article","Marketing","Fully_SEO_Optimized_Article_including_FAQs.md"
+"Movie Prod Viz","Entertainment","Movie_Prod_Viz.md"
+"Married Life","Relationships","Married Life.md"
+"The Universal Machine","Philosophy","The_Universal_Machine.md"
+"Data Chef","Data","Data_Chef.md"
+"WebSweepGPT","Security","WebSweepGPT.md"
+"LLM Course","Education","LLM Course.md"
+"ابن هشام الباحث","Religion","السيرة_النبوية_إبن_هشام_-_الباحث.md"
+"Carl Coach","Relationships","Carl_coach_Cœur__Charme_.md"
+"HackMeIfYouCan-v1","Security","HackMeIfYouCan-v1.md"
+"1111 Wisdom Portal","Spirituality","1111 Eternal Wisdom Portal.md"
+"GPT-4 Classic","AI","gpt4_classic.md"
+"Web Mirror","Web","Web_Mirror.md"
+"Indra.ai","AI","Indra.ai.md"
+"IdaCode Potato","Programming","IdaCode_Potato.md"
+"Cognitive Bias Detector","Psychology","Cognitive_Bias_Detector.md"
+"Gerry Politician","Politics","Gerry_the_Inept_Politician.md"
+"HR 815 Insight","Politics","Bill_Insight_for_H.R._815.md"
+"Compliance Guard","Legal","Compliance_Guard.md"
+"Pinterest Optimization","Marketing","Pinterest_Optimization_GPT.md"
+"Translator AI","Language","Translator.md"
+"LogoGPT","Design","LogoGPT.md"
+"Books AI","Literature","Books.md"
+"Startup Scout","Business","Startup_Scout.md"
+"Japanese Chat Tutor","Language","Japanese_Casual_Chat_Tutor.md"
+"F Mentor","Education","F_Mentor.md"
+"Photo Multiverse","Photography","Photo_Multiverse.md"
+"Alternative Reality","Entertainment","Alternative_Reality_Explorer.md"
+"AlphaNotes GPT","Education","AlphaNotes GPT.md"
+"Rogue AI RE","Security","Rogue_AI_-_Software_Reverse_Engineering.md"
+"Public Domain Guide","Legal","Public Domain Navigator.md"
+"Skill Scout","Career","Skill_Scout.md"
+"Text Style Transfer","Writing","Text Style Transfer - Alice.md"
+"Iterative Coding","Programming","Iterative_Coding.md"
+"OpenAPI Builder","Programming","OpenAPI Builder.md"
+"Werdy Writer Pro","Writing","Werdy Writer Pro.md"
+"Image to Text","Productivity","Transcribir-_IA__Imagen_a_Texto.md"
+"Jenny Role Play","Entertainment","Jenny_Role_Play.md"
+"HubSpot Landing Page","Web Development","Landing_Page_Creator_from_HubSpot.md"
+"AI Narrative Drone","AI","AI_Narrative_and_Causality_Drone_GPT.md"
+"Survival Expert","Outdoors","Survival_Expert.md"
+"Fisher's Friend","Fishing","Fishers_Friend.md"
+"Adult Learning Coach","Education","Coaching Bot for Continuing to Learn Enjoyably as an Adult(jp).md"
+"Rock-n-Controlla","Music","Rock-n-Controlla.md"
+"Beauty Scout","Beauty","Beauty Scout.md"
+"mferGPT","Entertainment","mferGPT.md"
+"Beautify Selfie","Photography","Beautify_Your_Selfie.md"
+"Congress Manifesto 2024","Politics","Congress_Manifesto_LS_election_2024.md"
+"editGPT","Writing","editGPT.md"
+"Inkspire","Art","Inkspire.md"
+"ELI35","Education","ELI35.md"
+"Faith Explorer","Religion","Faith_Explorer.md"
+"Paper Art Maps","Art","Paper_Art_and_Wood_Veneer_Maps.md"
+"dubGPT","Audio","dubGPT_by_Rask_AI.md"
+"Creative Brainstorm","Creativity","Creative_Answers__Brainstorm_GPT.md"
+"Security Test 1.1.1","Security","Security_Test[1.1.1].md"
+"Bright Source","AI","Bright Source.md"
+"Claude 3 Opus","AI","Claude_3_Opus.md"
+"EduGenie","Education","EduGenie.md"
+"TRIZ Master","Problem Solving","TRIZ Master.md"
+"Product Manager Mock","Business","Product Manager Mock Prep.md"
+"Coinflipper Game","Games","Coinflipper Game.md"
\ No newline at end of file
diff --git a/src/web_server/mod.rs b/src/web_server/mod.rs
index 14629a2f..dcadd8a5 100644
--- a/src/web_server/mod.rs
+++ b/src/web_server/mod.rs
@@ -1,9 +1,20 @@
use actix_web::{HttpRequest, HttpResponse, Result};
use log::{debug, error, warn};
use std::fs;
+
+#[actix_web::get("/auth")]
+async fn auth() -> Result {
+ match fs::read_to_string("web/desktop/auth/index.html") {
+ Ok(html) => Ok(HttpResponse::Ok().content_type("text/html").body(html)),
+ Err(e) => {
+ error!("Failed to load auth page: {}", e);
+ Ok(HttpResponse::InternalServerError().body("Failed to load auth page"))
+ }
+ }
+}
#[actix_web::get("/")]
async fn index() -> Result {
- match fs::read_to_string("web/html/index.html") {
+ match fs::read_to_string("web/desktop/auth/index.html") {
Ok(html) => Ok(HttpResponse::Ok().content_type("text/html").body(html)),
Err(e) => {
error!("Failed to load index page: {}", e);
diff --git a/tauri.conf.json b/tauri.conf.json
index d5cd9b0c..b3544674 100644
--- a/tauri.conf.json
+++ b/tauri.conf.json
@@ -4,7 +4,7 @@
"version": "6.0.8",
"identifier": "br.com.pragmatismo",
"build": {
- "frontendDist": "./web/html"
+ "frontendDist": "./web/desktop"
},
"app": {
"security": {
diff --git a/web/desktop/auth/app.js b/web/desktop/auth/app.js
new file mode 100644
index 00000000..2a33ef88
--- /dev/null
+++ b/web/desktop/auth/app.js
@@ -0,0 +1,74 @@
+document.addEventListener('alpine:init', () => {
+ Alpine.data('auth', () => ({
+ email: '',
+ password: '',
+ rememberMe: false,
+ isLoading: false,
+ error: '',
+
+ async socialLogin(provider) {
+ this.isLoading = true;
+ this.error = '';
+
+ try {
+ // In a real implementation, this would redirect to the auth endpoint
+ const authUrl = `${this.getAuthEndpoint()}/oauth/v2/authorize?` +
+ `client_id=${this.getClientId()}&` +
+ `redirect_uri=${encodeURIComponent(window.location.origin)}&` +
+ `response_type=code&` +
+ `scope=openid profile email&` +
+ `provider=${provider}`;
+
+ window.location.href = authUrl;
+ } catch (err) {
+ this.error = 'Failed to initiate login';
+ console.error('Login error:', err);
+ } finally {
+ this.isLoading = false;
+ }
+ },
+
+ async emailLogin() {
+ this.isLoading = true;
+ this.error = '';
+
+ try {
+ const response = await fetch('/api/auth/login', {
+ method: 'POST',
+ headers: {
+ 'Content-Type': 'application/json',
+ },
+ body: JSON.stringify({
+ email: this.email,
+ password: this.password,
+ rememberMe: this.rememberMe
+ })
+ });
+
+ if (!response.ok) {
+ const errorData = await response.json();
+ throw new Error(errorData.message || 'Login failed');
+ }
+
+ const data = await response.json();
+ localStorage.setItem('authToken', data.token);
+ window.location.href = '/tables.html';
+ } catch (err) {
+ this.error = err.message || 'Login failed. Please check your credentials.';
+ console.error('Login error:', err);
+ } finally {
+ this.isLoading = false;
+ }
+ },
+
+ getAuthEndpoint() {
+ // In a real app, this would come from config
+ return 'https://auth.example.com';
+ },
+
+ getClientId() {
+ // In a real app, this would come from config
+ return 'general-bots-client';
+ }
+ }));
+});
diff --git a/web/desktop/auth/index.html b/web/desktop/auth/index.html
new file mode 100644
index 00000000..236bcc54
--- /dev/null
+++ b/web/desktop/auth/index.html
@@ -0,0 +1,82 @@
+
+
+
+
+
+ General Bots - Authentication
+
+
+
+
+
+
+
+
+
Welcome to General Bots
+
+
+
"Errar é Humano."
+
General Bots
+
+
+
+
+
+
+
diff --git a/web/desktop/auth/styles.css b/web/desktop/auth/styles.css
new file mode 100644
index 00000000..bb13a748
--- /dev/null
+++ b/web/desktop/auth/styles.css
@@ -0,0 +1,249 @@
+:root {
+ --background: #1a1a2e;
+ --foreground: #ffffff;
+ --primary: #4f46e5;
+ --primary-foreground: #ffffff;
+ --secondary: #374151;
+ --secondary-foreground: #ffffff;
+ --muted: #4b5563;
+ --muted-foreground: #9ca3af;
+ --accent: #7c3aed;
+ --destructive: #ef4444;
+ --border: #374151;
+ --input: #1f2937;
+ --radius: 0.5rem;
+}
+
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+body {
+ font-family: 'Segoe UI', sans-serif;
+ background-color: var(--background);
+ color: var(--foreground);
+ min-height: 100vh;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.auth-container {
+ display: flex;
+ width: 100%;
+ max-width: 1200px;
+ background-color: var(--secondary);
+ border-radius: var(--radius);
+ overflow: hidden;
+ box-shadow: 0 10px 25px rgba(0, 0, 0, 0.2);
+}
+
+.auth-left-panel {
+ flex: 1;
+ padding: 4rem;
+ background: linear-gradient(135deg, var(--primary), var(--accent));
+ color: var(--primary-foreground);
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+}
+
+.auth-logo h1 {
+ font-size: 2rem;
+ margin-bottom: 1rem;
+}
+
+.auth-quote {
+ font-style: italic;
+ margin-top: auto;
+}
+
+.auth-quote p:last-child {
+ text-align: right;
+ margin-top: 0.5rem;
+}
+
+.auth-form-container {
+ flex: 1;
+ padding: 4rem;
+ max-width: 500px;
+}
+
+.auth-form-header {
+ margin-bottom: 2rem;
+ text-align: center;
+}
+
+.auth-form-header h2 {
+ font-size: 1.5rem;
+ margin-bottom: 0.5rem;
+}
+
+.auth-form-header p {
+ color: var(--muted-foreground);
+}
+
+.auth-error {
+ background-color: var(--destructive);
+ color: var(--primary-foreground);
+ padding: 0.75rem;
+ border-radius: var(--radius);
+ margin-bottom: 1rem;
+ text-align: center;
+}
+
+.auth-social-buttons {
+ display: grid;
+ grid-template-columns: 1fr;
+ gap: 0.75rem;
+ margin-bottom: 1.5rem;
+}
+
+.auth-social-button {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 0.75rem;
+ border-radius: var(--radius);
+ font-weight: 500;
+ cursor: pointer;
+ transition: all 0.2s;
+ border: 1px solid var(--border);
+ background-color: var(--input);
+ color: var(--foreground);
+}
+
+.auth-social-button:hover {
+ background-color: var(--muted);
+}
+
+.auth-social-icon {
+ width: 1.25rem;
+ height: 1.25rem;
+ margin-right: 0.5rem;
+ font-weight: bold;
+}
+
+.auth-divider {
+ display: flex;
+ align-items: center;
+ margin: 1.5rem 0;
+ color: var(--muted-foreground);
+}
+
+.auth-divider::before,
+.auth-divider::after {
+ content: "";
+ flex: 1;
+ border-bottom: 1px solid var(--border);
+}
+
+.auth-divider span {
+ padding: 0 1rem;
+}
+
+.auth-form {
+ margin-top: 1.5rem;
+}
+
+.auth-form-group {
+ margin-bottom: 1rem;
+}
+
+.auth-form-group label {
+ display: block;
+ margin-bottom: 0.5rem;
+ font-weight: 500;
+}
+
+.auth-form-group input {
+ width: 100%;
+ padding: 0.75rem;
+ border-radius: var(--radius);
+ border: 1px solid var(--border);
+ background-color: var(--input);
+ color: var(--foreground);
+}
+
+.auth-form-group input:focus {
+ outline: none;
+ border-color: var(--primary);
+}
+
+.auth-form-options {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin: 1rem 0;
+}
+
+.auth-remember-me {
+ display: flex;
+ align-items: center;
+}
+
+.auth-remember-me input {
+ margin-right: 0.5rem;
+}
+
+.auth-forgot-password {
+ color: var(--primary);
+ text-decoration: none;
+}
+
+.auth-forgot-password:hover {
+ text-decoration: underline;
+}
+
+.auth-submit-button {
+ width: 100%;
+ padding: 0.75rem;
+ border-radius: var(--radius);
+ background-color: var(--primary);
+ color: var(--primary-foreground);
+ font-weight: 500;
+ border: none;
+ cursor: pointer;
+ transition: all 0.2s;
+}
+
+.auth-submit-button:hover {
+ background-color: var(--accent);
+}
+
+.auth-submit-button:disabled {
+ opacity: 0.7;
+ cursor: not-allowed;
+}
+
+.auth-signup-link {
+ text-align: center;
+ margin: 1.5rem 0;
+ color: var(--muted-foreground);
+}
+
+.auth-signup-link a {
+ color: var(--primary);
+ text-decoration: none;
+}
+
+.auth-signup-link a:hover {
+ text-decoration: underline;
+}
+
+@media (max-width: 768px) {
+ .auth-container {
+ flex-direction: column;
+ }
+
+ .auth-left-panel {
+ padding: 2rem;
+ }
+
+ .auth-form-container {
+ padding: 2rem;
+ max-width: 100%;
+ }
+}
diff --git a/web/desktop/css/chat.css b/web/desktop/css/chat.css
new file mode 100644
index 00000000..f9bebbae
--- /dev/null
+++ b/web/desktop/css/chat.css
@@ -0,0 +1,195 @@
+.chat-container {
+ margin-top: 60px; /* Account for navbar height */
+ height: calc(100vh - 60px);
+ display: flex;
+ flex-direction: column;
+}
+
+#messages {
+ flex: 1;
+ overflow-y: auto;
+ padding: 20px 20px 140px;
+ max-width: 680px;
+ margin: 0 auto;
+ width: 100%;
+ position: relative;
+ z-index: 1;
+}
+
+.chat-footer {
+ position: fixed;
+ bottom: 0;
+ left: 0;
+ right: 0;
+ background: var(--bg);
+ border-top: 1px solid var(--border);
+ padding: 12px;
+ z-index: 100;
+ transition: all 0.3s;
+ backdrop-filter: blur(20px);
+}
+
+/* Message styles */
+.message-container {
+ margin-bottom: 24px;
+ opacity: 0;
+ transform: translateY(10px);
+}
+
+.user-message {
+ display: flex;
+ justify-content: flex-end;
+ margin-bottom: 8px;
+}
+
+.user-message-content {
+ background: var(--fg);
+ color: var(--bg);
+ border-radius: 18px;
+ padding: 12px 18px;
+ max-width: 80%;
+ font-size: 14px;
+ line-height: 1.5;
+ box-shadow: 0 2px 8px var(--shadow);
+ position: relative;
+ overflow: hidden;
+}
+
+.user-message-content::before {
+ content: '';
+ position: absolute;
+ inset: 0;
+ background: var(--gradient-2);
+ opacity: 0.3;
+ pointer-events: none;
+}
+
+.assistant-message {
+ display: flex;
+ gap: 8px;
+ align-items: flex-start;
+}
+
+.assistant-avatar {
+ width: 24px;
+ height: 24px;
+ border-radius: 50%;
+ background: var(--logo-url) center/contain no-repeat;
+ flex-shrink: 0;
+ margin-top: 2px;
+ filter: var(--logo-filter, none);
+}
+
+.assistant-message-content {
+ flex: 1;
+ font-size: 14px;
+ line-height: 1.7;
+ background: var(--glass);
+ border-radius: 18px;
+ padding: 12px 18px;
+ border: 1px solid var(--border);
+ box-shadow: 0 2px 8px var(--shadow);
+ position: relative;
+ overflow: hidden;
+}
+
+.assistant-message-content::before {
+ content: '';
+ position: absolute;
+ inset: 0;
+ background: var(--gradient-1);
+ opacity: 0.5;
+ pointer-events: none;
+}
+
+/* Input and suggestions */
+.suggestions-container {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 4px;
+ margin-bottom: 8px;
+ justify-content: center;
+ max-width: 680px;
+ margin: 0 auto 8px;
+}
+
+.suggestion-button {
+ padding: 6px 12px;
+ border-radius: 12px;
+ cursor: pointer;
+ font-size: 11px;
+ font-weight: 400;
+ transition: all 0.2s;
+ background: var(--glass);
+ border: 1px solid var(--border);
+ color: var(--fg);
+}
+
+.suggestion-button:hover {
+ background: var(--fg);
+ color: var(--bg);
+ transform: scale(1.05);
+}
+
+.input-container {
+ display: flex;
+ gap: 6px;
+ max-width: 680px;
+ margin: 0 auto;
+ align-items: center;
+}
+
+#messageInput {
+ flex: 1;
+ border-radius: 20px;
+ padding: 10px 16px;
+ font-size: 14px;
+ font-family: "Inter", sans-serif;
+ outline: none;
+ transition: all 0.3s;
+ background: var(--glass);
+ border: 1px solid var(--border);
+ color: var(--fg);
+ backdrop-filter: blur(10px);
+}
+
+#messageInput:focus {
+ border-color: var(--accent);
+ box-shadow: 0 0 0 3px rgba(0,102,255,0.1);
+}
+
+#messageInput::placeholder {
+ opacity: 0.3;
+}
+
+#sendBtn, #voiceBtn {
+ width: 36px;
+ height: 36px;
+ border-radius: 18px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ cursor: pointer;
+ transition: all 0.2s;
+ border: none;
+ background: var(--fg);
+ color: var(--bg);
+ font-size: 16px;
+ flex-shrink: 0;
+}
+
+#voiceBtn.recording {
+ animation: pulse 1.5s infinite;
+}
+
+@keyframes pulse {
+ 0%, 100% { opacity: 1; transform: scale(1) }
+ 50% { opacity: 0.6; transform: scale(1.1) }
+}
+
+/* Responsive adjustments */
+@media (max-width: 768px) {
+ #messages {
+ padding: 20px 16px 140px;
+ }
+}
diff --git a/web/desktop/css/theme.css b/web/desktop/css/theme.css
new file mode 100644
index 00000000..69761b84
--- /dev/null
+++ b/web/desktop/css/theme.css
@@ -0,0 +1,114 @@
+:root {
+ /* Main theme */
+ --background: #ffffff;
+ --foreground: #000000;
+ --card: #f8f9fa;
+ --popover: #ffffff;
+ --primary: #2563eb;
+ --secondary: #f1f5f9;
+ --muted: #64748b;
+ --accent: #f59e0b;
+ --destructive: #ef4444;
+ --border: #e2e8f0;
+ --input: #e2e8f0;
+ --ring: #93c5fd;
+ --radius: 0.5rem;
+ --chart-1: #3b82f6;
+ --chart-2: #10b981;
+ --chart-3: #f59e0b;
+ --chart-4: #ef4444;
+ --chart-5: #8b5cf6;
+
+ /* File manager theme */
+ --bg-primary: #1a1a2e;
+ --bg-secondary: #16213e;
+ --bg-tertiary: #0f3460;
+ --text-primary: #e94560;
+ --text-secondary: #00d9ff;
+ --filemanager-border: #533483;
+}
+
+.navbar {
+ background: var(--background);
+ padding: 1rem;
+ border-bottom: 1px solid var(--border);
+}
+
+.mobile-menu-btn {
+ display: none;
+}
+
+.nav-links {
+ display: flex;
+ gap: 1rem;
+}
+
+.nav-links a {
+ color: var(--foreground);
+ text-decoration: none;
+ padding: 0.5rem 1rem;
+ border-radius: var(--radius);
+}
+
+.nav-links a:hover {
+ background: var(--secondary);
+}
+
+.footer {
+ background: var(--background);
+ padding: 1rem;
+ border-top: 1px solid var(--border);
+ display: flex;
+ gap: 2rem;
+ justify-content: center;
+}
+
+.shortcut-group {
+ display: flex;
+ gap: 1rem;
+}
+
+.shortcut-btn {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ padding: 0.5rem;
+ background: var(--card);
+ border: 1px solid var(--border);
+ border-radius: var(--radius);
+ cursor: pointer;
+}
+
+.shortcut-btn .key {
+ font-weight: bold;
+ color: var(--primary);
+}
+
+@media (max-width: 768px) {
+ .mobile-menu-btn {
+ display: block;
+ }
+
+ .nav-links {
+ display: none;
+ flex-direction: column;
+ position: absolute;
+ background: var(--background);
+ width: 100%;
+ left: 0;
+ padding: 1rem;
+ box-shadow: 0 2px 4px rgba(0,0,0,0.1);
+ }
+
+ .nav-links.hidden {
+ display: none;
+ }
+
+ .nav-links:not(.hidden) {
+ display: flex;
+ }
+
+ .shortcut-group {
+ flex-wrap: wrap;
+ }
+}
diff --git a/web/desktop/drive/index.html b/web/desktop/drive/index.html
new file mode 100644
index 00000000..0f9155a3
--- /dev/null
+++ b/web/desktop/drive/index.html
@@ -0,0 +1,585 @@
+
+
+
+
+
+ XTree Gold File Manager
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ★
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ All items
+ Folders
+ Files
+ Starred
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ No files found
+
+
+
+
+
+
+
+
+ ⬇ Download
+
+
+ 🔗 Share
+
+
+ ★ Star
+
+
+
+
+
+
+
+
+
+
+
📄
+
No file selected
+
Select a file to view details
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/web/desktop/index.html b/web/desktop/index.html
new file mode 100644
index 00000000..9ea8c32d
--- /dev/null
+++ b/web/desktop/index.html
@@ -0,0 +1,47 @@
+
+
+
+
+General Bots
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/web/desktop/js/auth.js b/web/desktop/js/auth.js
new file mode 100644
index 00000000..003abdfa
--- /dev/null
+++ b/web/desktop/js/auth.js
@@ -0,0 +1,61 @@
+// Handle authentication state
+let currentUser = null;
+let currentSession = null;
+
+// Initialize auth with mock data
+function initializeAuth() {
+ if (window.location.pathname.includes('auth')) {
+ return; // Don't initialize on auth pages
+ }
+
+ // Check for existing session
+ const sessionId = localStorage.getItem('sessionId');
+ if (sessionId) {
+ currentSession = mockSessions.find(s => s.id === sessionId) || mockSessions[0];
+ } else {
+ currentSession = mockSessions[0];
+ localStorage.setItem('sessionId', currentSession.id);
+ }
+
+ // Set current user
+ currentUser = mockUsers[0];
+ updateUserUI();
+}
+
+// Update UI based on auth state
+function updateUserUI() {
+ const userAvatar = document.getElementById('userAvatar');
+ if (userAvatar && currentUser) {
+ userAvatar.textContent = currentUser.avatar;
+ }
+}
+
+// Handle login
+function handleLogin(email, password) {
+ // In a real app, this would call an API
+ currentUser = mockUsers.find(u => u.email === email) || mockUsers[0];
+ currentSession = mockSessions[0];
+ localStorage.setItem('sessionId', currentSession.id);
+ updateUserUI();
+ window.location.href = '/desktop/index.html';
+}
+
+// Handle logout
+function handleLogout() {
+ localStorage.removeItem('sessionId');
+ window.location.href = '/desktop/auth/login.html';
+}
+
+// Check auth state for protected routes
+function checkAuth() {
+ if (!currentUser && !window.location.pathname.includes('auth')) {
+ window.location.href = '/desktop/auth/login.html';
+ }
+}
+
+// Initialize on page load
+if (document.readyState === 'complete') {
+ initializeAuth();
+} else {
+ window.addEventListener('load', initializeAuth);
+}
diff --git a/web/desktop/js/mock-data.js b/web/desktop/js/mock-data.js
new file mode 100644
index 00000000..daf01bdd
--- /dev/null
+++ b/web/desktop/js/mock-data.js
@@ -0,0 +1,46 @@
+const mockUsers = [
+ {
+ id: 'user1',
+ name: 'John Doe',
+ email: 'john@example.com',
+ avatar: '👨'
+ },
+ {
+ id: 'user2',
+ name: 'Jane Smith',
+ email: 'jane@example.com',
+ avatar: '👩'
+ }
+];
+
+const mockBots = [
+ {
+ id: 'default_bot',
+ name: 'General Bot',
+ description: 'Main assistant bot'
+ }
+];
+
+const mockSessions = [
+ {
+ id: 'session1',
+ title: 'First Chat',
+ created_at: new Date().toISOString()
+ },
+ {
+ id: 'session2',
+ title: 'Project Discussion',
+ created_at: new Date(Date.now() - 86400000).toISOString()
+ }
+];
+
+const mockAuthResponse = {
+ user_id: mockUsers[0].id,
+ session_id: mockSessions[0].id
+};
+
+const mockSuggestions = [
+ { text: "What can you do?", context: "capabilities" },
+ { text: "Show my files", context: "drive" },
+ { text: "Create a task", context: "tasks" }
+];
diff --git a/web/desktop/mail/data.js b/web/desktop/mail/data.js
new file mode 100644
index 00000000..b626a6d3
--- /dev/null
+++ b/web/desktop/mail/data.js
@@ -0,0 +1,29 @@
+export const mails = [
+ {
+ id: "6c84fb90-12c4-11e1-840d-7b25c5ee775a",
+ name: "William Smith",
+ email: "williamsmith@example.com",
+ subject: "Meeting Tomorrow",
+ text: "Hi, let's have a meeting tomorrow to discuss the project...",
+ date: "2023-10-22T09:00:00",
+ read: true,
+ labels: ["meeting", "work", "important"],
+ },
+ // Additional emails would go here
+];
+
+export const accounts = [
+ {
+ label: "Alicia Koch",
+ email: "alicia@example.com",
+ icon: "📧",
+ }
+];
+
+export const contacts = [
+ {
+ name: "Emma Johnson",
+ email: "emma.johnson@example.com",
+ },
+ // Additional contacts would go here
+];
diff --git a/web/desktop/mail/index.html b/web/desktop/mail/index.html
new file mode 100644
index 00000000..7f6aadfc
--- /dev/null
+++ b/web/desktop/mail/index.html
@@ -0,0 +1,94 @@
+
+
+
+ Email Client
+
+
+
+
+
+
+
+
+
diff --git a/web/desktop/mail/store.js b/web/desktop/mail/store.js
new file mode 100644
index 00000000..83ceb9be
--- /dev/null
+++ b/web/desktop/mail/store.js
@@ -0,0 +1,10 @@
+export function createMailStore() {
+ return {
+ selected: null,
+ setSelected(id) {
+ this.selected = id;
+ }
+ };
+}
+
+export const mailStore = createMailStore();
diff --git a/web/desktop/shared/footer.html b/web/desktop/shared/footer.html
new file mode 100644
index 00000000..58358226
--- /dev/null
+++ b/web/desktop/shared/footer.html
@@ -0,0 +1,27 @@
+
diff --git a/web/desktop/shared/navbar.html b/web/desktop/shared/navbar.html
new file mode 100644
index 00000000..eb59d1a6
--- /dev/null
+++ b/web/desktop/shared/navbar.html
@@ -0,0 +1,30 @@
+
+
+
+
General Bots
+
+
+
+
diff --git a/web/desktop/shared/resizable.html b/web/desktop/shared/resizable.html
new file mode 100644
index 00000000..725f7ff2
--- /dev/null
+++ b/web/desktop/shared/resizable.html
@@ -0,0 +1,79 @@
+
+
+
diff --git a/web/desktop/shared/styles.css b/web/desktop/shared/styles.css
new file mode 100644
index 00000000..9c04e0cb
--- /dev/null
+++ b/web/desktop/shared/styles.css
@@ -0,0 +1,112 @@
+:root {
+ --navbar-height: 60px;
+ --primary-color: #0066ff;
+ --text-color: #333;
+ --bg-color: #fff;
+ --border-color: #e0e0e0;
+ --hover-bg: #f5f5f5;
+}
+
+.navbar {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ height: var(--navbar-height);
+ padding: 0 20px;
+ background: var(--bg-color);
+ box-shadow: 0 2px 10px rgba(0,0,0,0.1);
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ z-index: 1000;
+}
+
+.navbar-brand {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ font-weight: bold;
+ color: var(--text-color);
+}
+
+.logo {
+ height: 30px;
+ width: 30px;
+}
+
+.nav-links {
+ display: flex;
+ gap: 20px;
+}
+
+.nav-link {
+ display: flex;
+ align-items: center;
+ gap: 5px;
+ text-decoration: none;
+ color: var(--text-color);
+ padding: 5px 10px;
+ border-radius: 4px;
+ transition: all 0.2s;
+}
+
+.nav-link:hover {
+ background: var(--hover-bg);
+}
+
+.nav-link.active {
+ color: var(--primary-color);
+ font-weight: 500;
+}
+
+.nav-user {
+ position: relative;
+ cursor: pointer;
+}
+
+.user-avatar {
+ width: 36px;
+ height: 36px;
+ border-radius: 50%;
+ background: var(--hover-bg);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 18px;
+}
+
+.user-menu {
+ position: absolute;
+ right: 0;
+ top: 100%;
+ background: var(--bg-color);
+ border: 1px solid var(--border-color);
+ border-radius: 4px;
+ box-shadow: 0 2px 8px rgba(0,0,0,0.1);
+ padding: 5px 0;
+ min-width: 150px;
+ display: none;
+}
+
+.user-menu-item {
+ display: block;
+ padding: 8px 15px;
+ color: var(--text-color);
+ text-decoration: none;
+}
+
+.user-menu-item:hover {
+ background: var(--hover-bg);
+}
+
+.nav-user:hover .user-menu {
+ display: block;
+}
+
+[data-theme="dark"] {
+ --text-color: #fff;
+ --bg-color: #1a1a1a;
+ --border-color: #333;
+ --hover-bg: #333;
+}
diff --git a/web/desktop/components/Footer.html b/web/desktop/tables/components/Footer.html
similarity index 100%
rename from web/desktop/components/Footer.html
rename to web/desktop/tables/components/Footer.html
diff --git a/web/desktop/components/FormulaBar.html b/web/desktop/tables/components/FormulaBar.html
similarity index 100%
rename from web/desktop/components/FormulaBar.html
rename to web/desktop/tables/components/FormulaBar.html
diff --git a/web/desktop/components/Header.html b/web/desktop/tables/components/Header.html
similarity index 100%
rename from web/desktop/components/Header.html
rename to web/desktop/tables/components/Header.html
diff --git a/web/desktop/components/Layout.html b/web/desktop/tables/components/Layout.html
similarity index 100%
rename from web/desktop/components/Layout.html
rename to web/desktop/tables/components/Layout.html
diff --git a/web/desktop/components/Spreadsheet.html b/web/desktop/tables/components/Spreadsheet.html
similarity index 100%
rename from web/desktop/components/Spreadsheet.html
rename to web/desktop/tables/components/Spreadsheet.html
diff --git a/web/desktop/components/StatusBar.html b/web/desktop/tables/components/StatusBar.html
similarity index 100%
rename from web/desktop/components/StatusBar.html
rename to web/desktop/tables/components/StatusBar.html
diff --git a/web/desktop/components/Toolbar.html b/web/desktop/tables/components/Toolbar.html
similarity index 100%
rename from web/desktop/components/Toolbar.html
rename to web/desktop/tables/components/Toolbar.html
diff --git a/web/desktop/tables.html b/web/desktop/tables/tables.html
similarity index 73%
rename from web/desktop/tables.html
rename to web/desktop/tables/tables.html
index e90e4779..3016a6b9 100644
--- a/web/desktop/tables.html
+++ b/web/desktop/tables/tables.html
@@ -4,28 +4,26 @@
Tables - Excel Clone
+
+
+
-
-