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 + + + + + +
+
+ +
+

"Errar é Humano."

+

General Bots

+
+
+ +
+
+

Sign in to your account

+

Choose your preferred login method

+
+ +
+ +
+ + + + + +
+ +
+ OR +
+ +
+
+ + +
+ +
+ + +
+ +
+
+ + +
+ Forgot password? +
+ + +
+ + +
+
+ + 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 + + + + + + +
+ +
+ +
+ +
+ +
+ + +
+ +
+ + + +
+ + +
+ +
+

+ + +
+ + +
+
+ + +
+ + +
+ No files found +
+
+
+ + +
+
+ + + +
+ +
+ + + +
+
+
+ + +
+
+ +
+ +
+ + +
+ +
+
+
+ + +
+ +
+ + + + 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 @@ + 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 + + + -
-
-

📊 Tables

-
Excel Clone - Celebrating Lotus 1-2-3 Legacy 🎉
+
+ - -
- - - - - - - - - - -
- -
-
A1
- -
- -
- - - -
-
- -
-
- Rows: 0 - Cols: 0 - Selected: None + +
+
+

📊 Tables

+
Excel Clone - Celebrating Lotus 1-2-3 Legacy 🎉
-
Ready | Lotus 1-2-3 Mode Active ✨
+ +
+
+ +
+
+
+
diff --git a/web/desktop/store.js b/web/desktop/tasks/store.js similarity index 100% rename from web/desktop/store.js rename to web/desktop/tasks/store.js diff --git a/web/desktop/todo.html b/web/desktop/tasks/tasks.html similarity index 100% rename from web/desktop/todo.html rename to web/desktop/tasks/tasks.html diff --git a/web/html/index.html b/web/html/index.html index d325f91e..0b545d23 100644 --- a/web/html/index.html +++ b/web/html/index.html @@ -732,14 +732,14 @@ connectionStatus.className=`connection-status ${s}`; } function getWebSocketUrl(){ -const p=window.location.protocol==="https:"?"wss:":"ws:",s=currentSessionId||crypto.randomUUID(),u=currentUserId||crypto.randomUUID(); -return`${p}//${window.location.host}/ws?session_id=${s}&user_id=${u}`; +const p="ws:",s=currentSessionId||crypto.randomUUID(),u=currentUserId||crypto.randomUUID(); +return`${p}//localhost:8080/ws?session_id=${s}&user_id=${u}`; } async function initializeAuth(){ try{ updateConnectionStatus("connecting"); -const p=window.location.pathname.split('/').filter(s=>s),b=p.length>0?p[0]:'default',r=await fetch(`/api/auth?bot_name=${encodeURIComponent(b)}`),a=await r.json(); +const p=window.location.pathname.split('/').filter(s=>s),b=p.length>0?p[0]:'default',r=await fetch(`http://localhost:8080/api/auth?bot_name=${encodeURIComponent(b)}`),a=await r.json(); currentUserId=a.user_id; currentSessionId=a.session_id; connectWebSocket(); @@ -753,7 +753,7 @@ setTimeout(initializeAuth,3000); async function loadSessions(){ try{ -const r=await fetch("/api/sessions"),s=await r.json(),h=document.getElementById("history"); +const r=await fetch("http://localhost:8080/api/sessions"),s=await r.json(),h=document.getElementById("history"); h.innerHTML=""; s.forEach(session=>{ const item=document.createElement('div'); @@ -769,7 +769,7 @@ console.error("Failed to load sessions:",e); async function createNewSession(){ try{ -const r=await fetch("/api/sessions",{method:"POST"}),s=await r.json(); +const r=await fetch("http://localhost:8080/api/sessions",{method:"POST"}),s=await r.json(); currentSessionId=s.session_id; hasReceivedInitialMessage=false; connectWebSocket(); @@ -802,7 +802,7 @@ sidebar.classList.remove('open'); async function loadSessionHistory(s){ try{ -const r=await fetch("/api/sessions/"+s),h=await r.json(),m=document.getElementById("messages"); +const r=await fetch("http://localhost:8080/api/sessions/"+s),h=await r.json(),m=document.getElementById("messages"); m.innerHTML=""; if(h.length===0){ updateContextUsage(0); @@ -1156,7 +1156,7 @@ await stopVoiceSession(); async function startVoiceSession(){ if(!currentSessionId)return; try{ -const r=await fetch("th/voice/start",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({session_id:currentSessionId,user_id:currentUserId})}),d=await r.json(); +const r=await fetch("http://localhost:8080/api/voice/start",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({session_id:currentSessionId,user_id:currentUserId})}),d=await r.json(); if(d.token){ await connectToVoiceRoom(d.token); startVoiceRecording(); @@ -1170,7 +1170,7 @@ showWarning("Falha ao iniciar modo de voz"); async function stopVoiceSession(){ if(!currentSessionId)return; try{ -await fetch("/api/voice/stop",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({session_id:currentSessionId})}); +await fetch("http://localhost:8080/api/voice/stop",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({session_id:currentSessionId})}); if(voiceRoom){ voiceRoom.disconnect(); voiceRoom=null; @@ -1185,7 +1185,7 @@ console.error("Failed to stop voice session:",e); async function connectToVoiceRoom(t){ try{ -const r=new LiveKitClient.Room(),p=window.location.protocol==="https:"?"wss:":"ws:",u=`${p}//${window.location.host}/voice`; +const r=new LiveKitClient.Room(),p="ws:",u=`${p}//localhost:8080/voice`; await r.connect(u,t); voiceRoom=r;