diff --git a/codex-prompt/codex.md b/codex-prompt/codex.md deleted file mode 100644 index f7141d6..0000000 --- a/codex-prompt/codex.md +++ /dev/null @@ -1,288 +0,0 @@ -# Progetto: GoFiber MVC + HTMX + Svelte UI Kit + GORM + AUTH + Role System + Template Separation - -# OBIETTIVO - -Implementare un progetto GoFiber MVC completo con: - -- HTML server-rendered (html/template) -- HTMX per partial HTML -- Design System Svelte (Custom Elements) -- GORM + SQLite/Postgres selezionabile via .env -- Migrazioni + seed -- CORS -- AUTH completo (signup, login, logout, verify email, lost password, reset) -- Email transactional (SMTP + file sink in develop) -- Separazione template per: - - public (pagine accessibili senza login) - - private (solo utenti autenticati) - - admin (solo utenti role=admin) - -Architettura server-first. Nessuna SPA. - ---- - -# TEMPLATE DIRECTORY STRUCTURE (OBBLIGATORIA) - -Strutturare /web/templates così: - -/web/templates/ - layout.html - - /public/ - home.html - login.html - signup.html - forgot_password.html - reset_password.html - verify_notice.html - - /private/ - dashboard.html - users/ - index.html - _table.html - _modal.html - - /admin/ - dashboard.html - users.html - -Il layout deve essere unico e includere: -- ui.css -- htmx.min.js -- ui.esm.js - ---- - -# RUOLI UTENTE - -Aggiungere campo Role nel model User: - -- role string - - "user" default - - "admin" - -Vincoli: -- Solo admin può accedere a /admin/* -- /private/* richiede autenticazione -- /public/* accessibile a tutti - ---- - -# ROUTING CON GRUPPI - -Configurare in main.go: - -Public routes: -- GET / -- GET /login -- POST /login -- GET /signup -- POST /signup -- GET /forgot-password -- POST /forgot-password -- GET /reset-password -- POST /reset-password -- GET /verify-email - -Private group (RequireAuth middleware): -- GET /dashboard -- GET /users -- GET /users/table -- GET /users/:id/modal -- POST /logout - -Admin group (RequireAuth + RequireAdmin middleware): -- GET /admin -- GET /admin/users - ---- - -# MIDDLEWARE - -Implementare: - -## RequireAuth -- verifica sessione -- se non autenticato → redirect /login - -## RequireAdmin -- verifica user.Role == "admin" -- se non admin → 403 o redirect /dashboard - ---- - -# DATABASE MODEL UPDATE - -Aggiornare model User: - -- ID uint -- Email string unique -- PasswordHash string -- EmailVerified bool -- Role string (default "user") -- CreatedAt -- UpdatedAt - -Migrazioni devono includere nuovo campo Role. - -Seed: -- In develop creare: - - admin@example.com (role=admin, email verified) - - user@example.com (role=user, email verified) - -Password default esempio: "password" - ---- - -# AUTH REQUIREMENTS (RIEPILOGO) - -Signup: -- crea utente con role=user -- EmailVerified=false -- genera token verifica -- invia email o salva in sink - -Login: -- verifica password -- verifica EmailVerified -- salva sessione con: - - user_id - - user_role - -Logout: -- distrugge sessione - -Verify email: -- valida token hash -- set EmailVerified=true - -Forgot password: -- genera reset token -- invia/salva email - -Reset password: -- aggiorna PasswordHash -- invalida token - ---- - -# EMAIL TEMPLATE DIRECTORY - -Creare: - -/web/emails/templates/ - verify_email.html - verify_email.txt - reset_password.html - reset_password.txt - -In develop: -- salvare email in: - EMAIL_SINK_DIR -- nome file: - timestamp__type__to.eml - -In prod: -- inviare SMTP - ---- - -# DIRECTORY PROTEZIONE LOGICA - -Controllers devono renderizzare template in base al path: - -- c.Render("public/login", data) -- c.Render("private/users/index", data) -- c.Render("admin/dashboard", data) - -Mai mischiare. - ---- - -# LAYOUT - -layout.html deve: - -- rilevare se utente autenticato -- mostrare navbar differente: - - public: login/signup - - user: dashboard + logout - - admin: dashboard + admin + logout - -Passare CurrentUser al template se autenticato. - ---- - -# HTMX IN PRIVATE - -/users: -- search con hx-get -- table partial in private/users/_table.html -- modal in private/users/_modal.html - ---- - -# CORS - -Configurato da .env - ---- - -# BUILD HASH - -Usare BUILD_HASH in query string per css/js. - ---- - -# CRITERI DI ACCETTAZIONE - -1) Template directory separata correttamente -2) Accesso diretto a /private/* senza login → redirect /login -3) Accesso a /admin/* senza role=admin → 403 -4) Signup crea utente role=user -5) Seed crea admin role=admin -6) Navbar cambia in base a stato login -7) Email sink funziona in develop -8) DB driver selezionabile via .env -9) Migrazioni e seed eseguiti all'avvio -10) Nessuna logica di autorizzazione nel frontend - ---- - -# STRUTTURA FINALE PROGETTO (SEMPLIFICATA) - -/cmd/server -/internal - /config - /db - /models - /repo - /services - /auth - /mailer - /controllers -/web - /templates - /public - /private - /admin - /emails/templates - /static -/ui-kit - ---- - -# NOTE PER CODEX - -- Creare tutti i file mancanti -- Scrivere codice completo, compilabile -- Commentare le parti sicurezza (token hashing) -- Usare bcrypt -- Usare SHA256 per token hash -- Non salvare mai token in chiaro nel DB -- Creare helper per CurrentUser -- Applicare middleware correttamente - -Non semplificare l’architettura. -Mantenere separazione MVC pulita. \ No newline at end of file diff --git a/internal/controllers/auth_controller.go b/internal/controllers/auth_controller.go index 9d9b956..89d65aa 100644 --- a/internal/controllers/auth_controller.go +++ b/internal/controllers/auth_controller.go @@ -208,3 +208,63 @@ func (ac *AuthController) ResetPassword(c *fiber.Ctx) error { } return c.Redirect("/login") } + +func (ac *AuthController) UpdateLanguage(c *fiber.Ctx) error { + currentUser, ok := httpmw.CurrentUserFromContext(c) + if !ok { + return c.SendStatus(fiber.StatusUnauthorized) + } + + type langRequest struct { + Lang string `json:"lang" form:"lang"` + } + + var req langRequest + if err := c.BodyParser(&req); err != nil { + req.Lang = c.FormValue("lang") + } + + lang := services.NormalizeLanguage(req.Lang) + if !services.IsSupportedLanguage(lang) { + return c.Status(fiber.StatusBadRequest).SendString("invalid language") + } + + if err := ac.authService.UpdateUserLanguage(currentUser.ID, lang); err != nil { + if errors.Is(err, services.ErrInvalidLanguage) { + return c.Status(fiber.StatusBadRequest).SendString("invalid language") + } + return c.Status(fiber.StatusInternalServerError).SendString("cannot update language") + } + + return c.SendStatus(fiber.StatusNoContent) +} + +func (ac *AuthController) UpdateTheme(c *fiber.Ctx) error { + currentUser, ok := httpmw.CurrentUserFromContext(c) + if !ok { + return c.SendStatus(fiber.StatusUnauthorized) + } + + type themeRequest struct { + Theme string `json:"theme" form:"theme"` + } + + var req themeRequest + if err := c.BodyParser(&req); err != nil { + req.Theme = c.FormValue("theme") + } + + theme := services.NormalizeTheme(req.Theme) + if theme != "dark" && theme != "light" { + return c.Status(fiber.StatusBadRequest).SendString("invalid theme") + } + + if err := ac.authService.UpdateUserTheme(currentUser.ID, theme); err != nil { + if errors.Is(err, services.ErrInvalidTheme) { + return c.Status(fiber.StatusBadRequest).SendString("invalid theme") + } + return c.Status(fiber.StatusInternalServerError).SendString("cannot update theme") + } + + return c.SendStatus(fiber.StatusNoContent) +} diff --git a/internal/controllers/users_controller.go b/internal/controllers/users_controller.go index 1f3dcee..6a03183 100644 --- a/internal/controllers/users_controller.go +++ b/internal/controllers/users_controller.go @@ -68,12 +68,12 @@ func (uc *UsersController) Table(c *fiber.Ctx) error { } func (uc *UsersController) Modal(c *fiber.Ctx) error { - id, err := strconv.ParseUint(c.Params("id"), 10, 64) - if err != nil || id == 0 { + id := strings.TrimSpace(c.Params("id")) + if id == "" { return c.Status(fiber.StatusBadRequest).SendString("invalid user id") } - user, err := uc.usersService.GetByID(uint(id)) + user, err := uc.usersService.GetByID(id) if err != nil { return err } diff --git a/internal/db/migrate.go b/internal/db/migrate.go index 318c5fd..d63b26f 100644 --- a/internal/db/migrate.go +++ b/internal/db/migrate.go @@ -11,5 +11,6 @@ func Migrate(database *gorm.DB) error { &models.User{}, &models.EmailVerificationToken{}, &models.PasswordResetToken{}, + &models.UserProperties{}, ) } diff --git a/internal/db/seed.go b/internal/db/seed.go index e40e3f0..b04f789 100644 --- a/internal/db/seed.go +++ b/internal/db/seed.go @@ -23,6 +23,10 @@ func Seed(database *gorm.DB) error { Role: models.RoleAdmin, EmailVerified: true, PasswordHash: passwordHash, + Properties: models.UserProperties{ + Lang: "en", + Dark: true, + }, }, { Name: "Normal User", @@ -30,6 +34,10 @@ func Seed(database *gorm.DB) error { Role: models.RoleUser, EmailVerified: true, PasswordHash: passwordHash, + Properties: models.UserProperties{ + Lang: "it", + Dark: false, + }, }, { Name: "Demo One", @@ -37,6 +45,10 @@ func Seed(database *gorm.DB) error { Role: models.RoleUser, EmailVerified: true, PasswordHash: passwordHash, + Properties: models.UserProperties{ + Lang: "en", + Dark: true, + }, }, { Name: "Demo Two", @@ -44,6 +56,10 @@ func Seed(database *gorm.DB) error { Role: models.RoleUser, EmailVerified: true, PasswordHash: passwordHash, + Properties: models.UserProperties{ + Lang: "en", + Dark: true, + }, }, { Name: "Demo Three", @@ -51,11 +67,20 @@ func Seed(database *gorm.DB) error { Role: models.RoleUser, EmailVerified: true, PasswordHash: passwordHash, + Properties: models.UserProperties{ + Lang: "en", + Dark: true, + }, }, } for _, user := range seedUsers { - if err := upsertUser(database, user); err != nil { + userID, err := upsertUser(database, user) + if err != nil { + return err + } + user.Properties.UserId = userID + if err := upsertUserProperties(database, user.Properties, user.Email); err != nil { return err } } @@ -63,7 +88,7 @@ func Seed(database *gorm.DB) error { return nil } -func upsertUser(database *gorm.DB, user models.User) error { +func upsertUser(database *gorm.DB, user models.User) (string, error) { result := database.Clauses(clause.OnConflict{ Columns: []clause.Column{{Name: "email"}}, DoUpdates: clause.AssignmentColumns([]string{ @@ -73,9 +98,26 @@ func upsertUser(database *gorm.DB, user models.User) error { "password_hash", "updated_at", }), - }).Create(&user) + }).Omit("Properties").Create(&user) if result.Error != nil { - return fmt.Errorf("seed user %s: %w", user.Email, result.Error) + return "", fmt.Errorf("seed user %s: %w", user.Email, result.Error) + } + + var persisted models.User + if err := database.Select("id").Where("email = ?", user.Email).First(&persisted).Error; err != nil { + return "", fmt.Errorf("load seeded user %s: %w", user.Email, err) + } + + return persisted.ID, nil +} + +func upsertUserProperties(database *gorm.DB, props models.UserProperties, userEmail string) error { + result := database.Clauses(clause.OnConflict{ + Columns: []clause.Column{{Name: "user_id"}}, + DoNothing: true, + }).Create(&props) + if result.Error != nil { + return fmt.Errorf("seed user properties %s: %w", userEmail, result.Error) } return nil diff --git a/internal/http/middleware/auth.go b/internal/http/middleware/auth.go index e928bbe..ee22670 100644 --- a/internal/http/middleware/auth.go +++ b/internal/http/middleware/auth.go @@ -31,7 +31,7 @@ func RequireAdmin() fiber.Handler { } } -func SetSessionUserID(c *fiber.Ctx, userID uint) error { +func SetSessionUserID(c *fiber.Ctx, userID string) error { store, ok := c.Locals(contextStoreKey).(*session.Store) if !ok || store == nil { return errors.New("session store not available") diff --git a/internal/http/middleware/current_user.go b/internal/http/middleware/current_user.go index 97aa06f..48d3cdc 100644 --- a/internal/http/middleware/current_user.go +++ b/internal/http/middleware/current_user.go @@ -2,7 +2,7 @@ package middleware import ( "fmt" - "strconv" + "strings" "trustcontact/internal/models" "trustcontact/internal/repo" @@ -37,6 +37,21 @@ func CurrentUserMiddleware(store *session.Store, database *gorm.DB) fiber.Handle c.Locals(contextUserKey, user) setTemplateData(c, "CurrentUser", user) + if user != nil { + setTemplateData(c, "UserLang", strings.TrimSpace(user.Properties.Lang)) + if user.Properties.UserId != "" { + if user.Properties.Dark { + setTemplateData(c, "UserTheme", "dark") + } else { + setTemplateData(c, "UserTheme", "light") + } + } else { + setTemplateData(c, "UserTheme", "") + } + } else { + setTemplateData(c, "UserLang", "") + setTemplateData(c, "UserTheme", "") + } return c.Next() } } @@ -49,7 +64,7 @@ func CurrentUser(c *fiber.Ctx, store *session.Store, userRepo *repo.UserRepo) (* uidRaw := sess.Get(sessionUserIDKey) uid, ok := normalizeUserID(uidRaw) - if !ok || uid == 0 { + if !ok || uid == "" { return nil, nil } @@ -77,37 +92,16 @@ func CurrentUserFromContext(c *fiber.Ctx) (*models.User, bool) { return user, true } -func normalizeUserID(v any) (uint, bool) { +func normalizeUserID(v any) (string, bool) { switch value := v.(type) { - case uint: - return value, true - case uint64: - return uint(value), true - case uint32: - return uint(value), true - case int: - if value <= 0 { - return 0, false - } - return uint(value), true - case int64: - if value <= 0 { - return 0, false - } - return uint(value), true - case int32: - if value <= 0 { - return 0, false - } - return uint(value), true case string: - parsed, err := strconv.ParseUint(value, 10, 64) - if err != nil || parsed == 0 { - return 0, false + trimmed := strings.TrimSpace(value) + if trimmed == "" { + return "", false } - return uint(parsed), true + return trimmed, true default: - return 0, false + return "", false } } diff --git a/internal/http/router.go b/internal/http/router.go index ee4417f..6d67d46 100644 --- a/internal/http/router.go +++ b/internal/http/router.go @@ -50,6 +50,8 @@ func RegisterRoutes(app *fiber.App, store *session.Store, database *gorm.DB, cfg app.Post("/reset-password", authController.ResetPassword) app.Get("/forbidden", authController.ShowForbidden) app.Get("/welcome", httpmw.RequireAuth(), authController.ShowWelcome) + app.Post("/preferences/lang", httpmw.RequireAuth(), authController.UpdateLanguage) + app.Post("/preferences/theme", httpmw.RequireAuth(), authController.UpdateTheme) private := app.Group("/private", httpmw.RequireAuth(), httpmw.RequireAdmin()) private.Get("/", func(c *fiber.Ctx) error { diff --git a/internal/models/auth_tokens.go b/internal/models/auth_tokens.go index 21e78a2..aa6a7aa 100644 --- a/internal/models/auth_tokens.go +++ b/internal/models/auth_tokens.go @@ -1,21 +1,38 @@ package models -import "time" +import ( + "time" + + "github.com/google/uuid" + "gorm.io/gorm" +) type EmailVerificationToken struct { - ID uint `gorm:"primaryKey"` - UserID uint `gorm:"not null;index"` + ID string `gorm:"primaryKey"` + UserID string `gorm:"not null;index"` TokenHash string `gorm:"size:64;uniqueIndex;not null"` ExpiresAt time.Time `gorm:"not null;index"` CreatedAt time.Time UpdatedAt time.Time } +func (token *EmailVerificationToken) BeforeCreate(tx *gorm.DB) (err error) { + // UUID version 4 + token.ID = uuid.NewString() + return +} + type PasswordResetToken struct { - ID uint `gorm:"primaryKey"` - UserID uint `gorm:"not null;index"` + ID string `gorm:"primaryKey"` + UserID string `gorm:"not null;index"` TokenHash string `gorm:"size:64;uniqueIndex;not null"` ExpiresAt time.Time `gorm:"not null;index"` CreatedAt time.Time UpdatedAt time.Time } + +func (token *PasswordResetToken) BeforeCreate(tx *gorm.DB) (err error) { + // UUID version 4 + token.ID = uuid.NewString() + return +} diff --git a/internal/models/user.go b/internal/models/user.go index 562e512..d56ac20 100644 --- a/internal/models/user.go +++ b/internal/models/user.go @@ -1,6 +1,11 @@ package models -import "time" +import ( + "time" + + "github.com/google/uuid" + "gorm.io/gorm" +) const ( RoleAdmin = "admin" @@ -8,12 +13,25 @@ const ( ) type User struct { - ID uint `gorm:"primaryKey"` - Name string `gorm:"size:120;index"` - Email string `gorm:"size:320;uniqueIndex;not null"` - PasswordHash string `gorm:"size:255;not null"` - EmailVerified bool `gorm:"not null;default:false"` - Role string `gorm:"size:32;index;not null;default:user"` + ID string `gorm:"primaryKey"` + Name string `gorm:"size:120;index"` + Email string `gorm:"size:320;uniqueIndex;not null"` + PasswordHash string `gorm:"size:255;not null"` + EmailVerified bool `gorm:"not null;default:false"` + Role string `gorm:"size:32;index;not null;default:user"` + Properties UserProperties `gorm:"foreignKey:UserId;constraint:OnUpdate:CASCADE,OnDelete:CASCADE;"` CreatedAt time.Time UpdatedAt time.Time } + +func (user *User) BeforeCreate(tx *gorm.DB) (err error) { + // UUID version 4 + user.ID = uuid.NewString() + return +} + +type UserProperties struct { + UserId string `json:"user_id" gorm:"uniqueIndex"` + Lang string `json:"lang"` + Dark bool `json:"dark"` +} diff --git a/internal/repo/email_verification_token_repo.go b/internal/repo/email_verification_token_repo.go index e59acc8..a3dc6e2 100644 --- a/internal/repo/email_verification_token_repo.go +++ b/internal/repo/email_verification_token_repo.go @@ -33,10 +33,10 @@ func (r *EmailVerificationTokenRepo) FindValidByHash(tokenHash string, now time. return &token, nil } -func (r *EmailVerificationTokenRepo) DeleteByID(id uint) error { +func (r *EmailVerificationTokenRepo) DeleteByID(id string) error { return r.db.Delete(&models.EmailVerificationToken{}, id).Error } -func (r *EmailVerificationTokenRepo) DeleteByUserID(userID uint) error { +func (r *EmailVerificationTokenRepo) DeleteByUserID(userID string) error { return r.db.Where("user_id = ?", userID).Delete(&models.EmailVerificationToken{}).Error } diff --git a/internal/repo/password_reset_token_repo.go b/internal/repo/password_reset_token_repo.go index badb41f..d110953 100644 --- a/internal/repo/password_reset_token_repo.go +++ b/internal/repo/password_reset_token_repo.go @@ -33,10 +33,10 @@ func (r *PasswordResetTokenRepo) FindValidByHash(tokenHash string, now time.Time return &token, nil } -func (r *PasswordResetTokenRepo) DeleteByID(id uint) error { +func (r *PasswordResetTokenRepo) DeleteByID(id string) error { return r.db.Delete(&models.PasswordResetToken{}, id).Error } -func (r *PasswordResetTokenRepo) DeleteByUserID(userID uint) error { +func (r *PasswordResetTokenRepo) DeleteByUserID(userID string) error { return r.db.Where("user_id = ?", userID).Delete(&models.PasswordResetToken{}).Error } diff --git a/internal/repo/user_repo.go b/internal/repo/user_repo.go index 6b46c5b..b2120ce 100644 --- a/internal/repo/user_repo.go +++ b/internal/repo/user_repo.go @@ -26,9 +26,9 @@ func NewUserRepo(db *gorm.DB) *UserRepo { return &UserRepo{db: db} } -func (r *UserRepo) FindByID(id uint) (*models.User, error) { +func (r *UserRepo) FindByID(id string) (*models.User, error) { var user models.User - if err := r.db.First(&user, id).Error; err != nil { + if err := r.db.Preload("Properties").Where("id = ?", id).First(&user).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, nil } @@ -40,7 +40,7 @@ func (r *UserRepo) FindByID(id uint) (*models.User, error) { func (r *UserRepo) FindByEmail(email string) (*models.User, error) { var user models.User - if err := r.db.Where("email = ?", email).First(&user).Error; err != nil { + if err := r.db.Preload("Properties").Where("email = ?", email).First(&user).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, nil } @@ -54,18 +54,58 @@ func (r *UserRepo) Create(user *models.User) error { return r.db.Create(user).Error } -func (r *UserRepo) SetEmailVerified(userID uint, verified bool) error { +func (r *UserRepo) SetEmailVerified(userID string, verified bool) error { return r.db.Model(&models.User{}). Where("id = ?", userID). Update("email_verified", verified).Error } -func (r *UserRepo) UpdatePasswordHash(userID uint, passwordHash string) error { +func (r *UserRepo) UpdatePasswordHash(userID string, passwordHash string) error { return r.db.Model(&models.User{}). Where("id = ?", userID). Update("password_hash", passwordHash).Error } +func (r *UserRepo) UpsertLanguagePreference(userID string, lang string) error { + var existing models.UserProperties + err := r.db.Where("user_id = ?", userID).First(&existing).Error + if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { + return err + } + + if errors.Is(err, gorm.ErrRecordNotFound) { + props := models.UserProperties{ + UserId: userID, + Lang: lang, + } + return r.db.Create(&props).Error + } + + return r.db.Model(&models.UserProperties{}). + Where("user_id = ?", userID). + Update("lang", lang).Error +} + +func (r *UserRepo) UpsertDarkPreference(userID string, dark bool) error { + var existing models.UserProperties + err := r.db.Where("user_id = ?", userID).First(&existing).Error + if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) { + return err + } + + if errors.Is(err, gorm.ErrRecordNotFound) { + props := models.UserProperties{ + UserId: userID, + Dark: dark, + } + return r.db.Create(&props).Error + } + + return r.db.Model(&models.UserProperties{}). + Where("user_id = ?", userID). + Update("dark", dark).Error +} + func (r *UserRepo) List(params UserListParams) ([]models.User, int64, error) { query := r.db.Model(&models.User{}) @@ -92,8 +132,8 @@ func (r *UserRepo) List(params UserListParams) ([]models.User, int64, error) { if pageSize <= 0 { pageSize = 10 } - if pageSize > 100 { - pageSize = 100 + if pageSize > 500 { + pageSize = 500 } offset := (page - 1) * pageSize diff --git a/internal/services/auth_service.go b/internal/services/auth_service.go index 2e7ee92..ca9eb6c 100644 --- a/internal/services/auth_service.go +++ b/internal/services/auth_service.go @@ -22,8 +22,20 @@ var ( ErrInvalidCredentials = errors.New("invalid credentials") ErrEmailNotVerified = errors.New("email not verified") ErrInvalidOrExpiredToken = errors.New("invalid or expired token") + ErrInvalidLanguage = errors.New("invalid language") + ErrInvalidTheme = errors.New("invalid theme") ) +var supportedLanguages = map[string]struct{}{ + "it": {}, + "en": {}, + "en_us": {}, + "de": {}, + "fr": {}, + "de_ch": {}, + "fr_ch": {}, +} + type AuthService struct { cfg *config.Config users *repo.UserRepo @@ -187,6 +199,23 @@ func (s *AuthService) ResetPassword(token, newPassword string) error { return s.resetTokens.DeleteByID(record.ID) } +func (s *AuthService) UpdateUserLanguage(userID string, lang string) error { + normalized := NormalizeLanguage(lang) + if !IsSupportedLanguage(normalized) { + return ErrInvalidLanguage + } + + return s.users.UpsertLanguagePreference(userID, normalized) +} + +func (s *AuthService) UpdateUserTheme(userID string, theme string) error { + normalized := NormalizeTheme(theme) + if normalized != "dark" && normalized != "light" { + return ErrInvalidTheme + } + return s.users.UpsertDarkPreference(userID, normalized == "dark") +} + func (s *AuthService) issueVerifyEmail(ctx context.Context, user *models.User) error { plainToken, err := auth.NewToken() if err != nil { @@ -245,3 +274,17 @@ func (s *AuthService) sendResetEmail(ctx context.Context, user *models.User, pla func normalizeEmail(email string) string { return strings.ToLower(strings.TrimSpace(email)) } + +func NormalizeLanguage(lang string) string { + normalized := strings.ToLower(strings.TrimSpace(lang)) + return strings.ReplaceAll(normalized, "-", "_") +} + +func IsSupportedLanguage(lang string) bool { + _, ok := supportedLanguages[NormalizeLanguage(lang)] + return ok +} + +func NormalizeTheme(theme string) string { + return strings.ToLower(strings.TrimSpace(theme)) +} diff --git a/internal/services/users_service.go b/internal/services/users_service.go index 3ad9416..a8b2b6c 100644 --- a/internal/services/users_service.go +++ b/internal/services/users_service.go @@ -49,8 +49,8 @@ func (s *UsersService) List(query UsersQuery) (*UsersPage, error) { if pageSize <= 0 { pageSize = 10 } - if pageSize > 100 { - pageSize = 100 + if pageSize > 500 { + pageSize = 500 } sort := normalizeSort(query.Sort) @@ -104,7 +104,7 @@ func (s *UsersService) List(query UsersQuery) (*UsersPage, error) { }, nil } -func (s *UsersService) GetByID(id uint) (*models.User, error) { +func (s *UsersService) GetByID(id string) (*models.User, error) { return s.users.FindByID(id) } diff --git a/web/static/css/app.css b/web/static/css/app.css index b103de6..c564812 100644 --- a/web/static/css/app.css +++ b/web/static/css/app.css @@ -1,2 +1,3820 @@ /*! tailwindcss v4.2.0 | MIT License | https://tailwindcss.com */ -@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-space-x-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-50:oklch(97.1% .013 17.38);--color-red-100:oklch(93.6% .032 17.717);--color-red-200:oklch(88.5% .062 18.334);--color-red-300:oklch(80.8% .114 19.571);--color-red-700:oklch(50.5% .213 27.518);--color-red-800:oklch(44.4% .177 26.899);--color-red-900:oklch(39.6% .141 25.723);--color-yellow-50:oklch(98.7% .026 102.212);--color-yellow-200:oklch(94.5% .129 101.54);--color-yellow-300:oklch(90.5% .182 98.111);--color-yellow-700:oklch(55.4% .135 66.442);--color-yellow-800:oklch(47.6% .114 61.907);--color-yellow-900:oklch(42.1% .095 57.708);--color-green-50:oklch(98.2% .018 155.826);--color-green-200:oklch(92.5% .084 155.995);--color-green-300:oklch(87.1% .15 154.449);--color-green-800:oklch(44.8% .119 151.328);--color-green-900:oklch(39.3% .095 152.535);--color-blue-50:oklch(97% .014 254.604);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-200:oklch(88.2% .059 254.128);--color-blue-300:oklch(80.9% .105 251.813);--color-blue-400:oklch(70.7% .165 254.624);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-blue-800:oklch(42.4% .199 265.638);--color-blue-900:oklch(37.9% .146 265.522);--color-gray-50:oklch(98.5% .002 247.839);--color-gray-100:oklch(96.7% .003 264.542);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-300:oklch(87.2% .01 258.338);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-600:oklch(44.6% .03 256.802);--color-gray-700:oklch(37.3% .034 259.733);--color-gray-800:oklch(27.8% .033 256.848);--color-gray-900:oklch(21% .034 264.665);--color-white:#fff;--spacing:.25rem;--breakpoint-xl:80rem;--container-md:28rem;--container-xl:36rem;--container-2xl:42rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--leading-relaxed:1.625;--radius-sm:.25rem;--radius-lg:.5rem;--ease-out:cubic-bezier(0, 0, .2, 1);--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab, currentcolor 50%, transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}.tooltip-arrow,.tooltip-arrow:before{background:inherit;width:8px;height:8px;position:absolute}.tooltip-arrow{visibility:hidden}.tooltip-arrow:before{content:"";visibility:visible;transform:rotate(45deg)}[data-tooltip-style^=light]+.tooltip>.tooltip-arrow:before{border-style:solid;border-color:var(--color-gray-200)}[data-tooltip-style^=light]+.tooltip[data-popper-placement^=top]>.tooltip-arrow:before{border-bottom-width:1px;border-right-width:1px}[data-tooltip-style^=light]+.tooltip[data-popper-placement^=right]>.tooltip-arrow:before{border-bottom-width:1px;border-left-width:1px}[data-tooltip-style^=light]+.tooltip[data-popper-placement^=bottom]>.tooltip-arrow:before{border-top-width:1px;border-left-width:1px}[data-tooltip-style^=light]+.tooltip[data-popper-placement^=left]>.tooltip-arrow:before{border-top-width:1px;border-right-width:1px}.tooltip[data-popper-placement^=top]>.tooltip-arrow{bottom:-4px}.tooltip[data-popper-placement^=bottom]>.tooltip-arrow{top:-4px}.tooltip[data-popper-placement^=left]>.tooltip-arrow{right:-4px}.tooltip[data-popper-placement^=right]>.tooltip-arrow{left:-4px}.tooltip.invisible>.tooltip-arrow:before{visibility:hidden}[data-popper-arrow],[data-popper-arrow]:before{background:inherit;width:8px;height:8px;position:absolute}[data-popper-arrow]{visibility:hidden}[data-popper-arrow]:before{content:"";visibility:visible;transform:rotate(45deg)}[data-popper-arrow]:after{content:"";visibility:visible;background:inherit;width:9px;height:9px;position:absolute;transform:rotate(45deg)}[role=tooltip]>[data-popper-arrow]:before{border-style:solid;border-color:var(--color-gray-200)}.dark [role=tooltip]>[data-popper-arrow]:before{border-style:solid;border-color:var(--color-gray-600)}[role=tooltip]>[data-popper-arrow]:after{border-style:solid;border-color:var(--color-gray-200)}.dark [role=tooltip]>[data-popper-arrow]:after{border-style:solid;border-color:var(--color-gray-600)}[data-popover][role=tooltip][data-popper-placement^=top]>[data-popper-arrow]:before,[data-popover][role=tooltip][data-popper-placement^=top]>[data-popper-arrow]:after{border-bottom-width:1px;border-right-width:1px}[data-popover][role=tooltip][data-popper-placement^=right]>[data-popper-arrow]:before,[data-popover][role=tooltip][data-popper-placement^=right]>[data-popper-arrow]:after{border-bottom-width:1px;border-left-width:1px}[data-popover][role=tooltip][data-popper-placement^=bottom]>[data-popper-arrow]:before,[data-popover][role=tooltip][data-popper-placement^=bottom]>[data-popper-arrow]:after{border-top-width:1px;border-left-width:1px}[data-popover][role=tooltip][data-popper-placement^=left]>[data-popper-arrow]:before,[data-popover][role=tooltip][data-popper-placement^=left]>[data-popper-arrow]:after{border-top-width:1px;border-right-width:1px}[data-popover][role=tooltip][data-popper-placement^=top]>[data-popper-arrow]{bottom:-5px}[data-popover][role=tooltip][data-popper-placement^=bottom]>[data-popper-arrow]{top:-5px}[data-popover][role=tooltip][data-popper-placement^=left]>[data-popper-arrow]{right:-5px}[data-popover][role=tooltip][data-popper-placement^=right]>[data-popper-arrow]{left:-5px}[role=tooltip].invisible>[data-popper-arrow]:before,[role=tooltip].invisible>[data-popper-arrow]:after{visibility:hidden}[type=text],[type=email],[type=url],[type=password],[type=number],[type=date],[type=datetime-local],[type=month],[type=search],[type=tel],[type=time],[type=week],[multiple],textarea,select{appearance:none;border-color:var(--color-gray-500);--tw-shadow:0 0 #0000;background-color:#fff;border-width:1px;border-radius:0;padding:.5rem .75rem;font-size:1rem;line-height:1.5rem}:is([type=text],[type=email],[type=url],[type=password],[type=number],[type=date],[type=datetime-local],[type=month],[type=search],[type=tel],[type=time],[type=week],[multiple],textarea,select):focus{outline-offset:2px;--tw-ring-inset:var(--tw-empty, );--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:var(--color-blue-600);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);border-color:var(--color-blue-600);outline:2px solid #0000}input::placeholder,textarea::placeholder{color:var(--color-gray-500);opacity:1}::-webkit-datetime-edit-fields-wrapper{padding:0}input[type=time]::-webkit-calendar-picker-indicator{background:0 0}select:not([size]){-webkit-print-color-adjust:exact;print-color-adjust:exact;background-image:url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 10 6'%3e %3cpath stroke='oklch(55.1%25 0.027 264.364)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m1 1 4 4 4-4'/%3e %3c/svg%3e");background-position:right .75rem center;background-repeat:no-repeat;background-size:.75em .75em;padding-right:2.5rem}[dir=rtl] select:not([size]){background-position:.75rem;padding-left:0;padding-right:.75rem}[multiple]{background-image:initial;background-position:initial;background-repeat:unset;background-size:initial;print-color-adjust:unset;padding-right:.75rem}[type=checkbox],[type=radio]{appearance:none;-webkit-print-color-adjust:exact;print-color-adjust:exact;vertical-align:middle;-webkit-user-select:none;user-select:none;width:1rem;height:1rem;color:var(--color-blue-600);border-color:--color-gray-500;--tw-shadow:0 0 #0000;background-color:#fff;background-origin:border-box;border-width:1px;flex-shrink:0;padding:0;display:inline-block}[type=checkbox]{border-radius:0}[type=radio]{border-radius:100%}[type=checkbox]:focus,[type=radio]:focus{outline-offset:2px;--tw-ring-inset:var(--tw-empty, );--tw-ring-offset-width:2px;--tw-ring-offset-color:#fff;--tw-ring-color:var(--color-blue-600);--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);outline:2px solid #0000}[type=checkbox]:checked,[type=radio]:checked,.dark [type=checkbox]:checked,.dark [type=radio]:checked{background-position:50%;background-repeat:no-repeat;background-size:.55em .55em;background-color:currentColor!important;border-color:#0000!important}[type=checkbox]:checked{-webkit-print-color-adjust:exact;print-color-adjust:exact;background-image:url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 12'%3e %3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M1 5.917 5.724 10.5 15 1.5'/%3e %3c/svg%3e");background-repeat:no-repeat;background-size:.55em .55em}[type=radio]:checked,.dark [type=radio]:checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e");background-size:1em 1em}[type=checkbox]:indeterminate{-webkit-print-color-adjust:exact;print-color-adjust:exact;background-image:url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 12'%3e %3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M0.5 6h14'/%3e %3c/svg%3e");background-position:50%;background-repeat:no-repeat;background-size:.55em .55em;background-color:currentColor!important;border-color:#0000!important}[type=checkbox]:indeterminate:hover,[type=checkbox]:indeterminate:focus{background-color:currentColor!important;border-color:#0000!important}[type=file]{background:unset;border-color:inherit;font-size:unset;line-height:inherit;border-width:0;border-radius:0;padding:0}[type=file]:focus{outline:1px auto inherit}input[type=file]::file-selector-button{color:#fff;background:var(--color-gray-800);cursor:pointer;border:0;margin-inline:-1rem 1rem;padding:.625rem 1rem .625rem 2rem;font-size:.875rem;font-weight:500}input[type=file]::file-selector-button:hover{background:var(--color-gray-700)}[dir=rtl] input[type=file]::file-selector-button{padding-left:1rem;padding-right:2rem}.dark input[type=file]::file-selector-button{color:#fff;background:var(--color-gray-600)}.dark input[type=file]::file-selector-button:hover{background:var(--color-gray-500)}input[type=range]::-webkit-slider-thumb{background:var(--color-blue-600);appearance:none;cursor:pointer;border:0;border-radius:9999px;width:1.25rem;height:1.25rem}input[type=range]:disabled::-webkit-slider-thumb{background:var(--color-gray-400)}.dark input[type=range]:disabled::-webkit-slider-thumb{background:var(--color-gray-500)}input[type=range]:focus::-webkit-slider-thumb{outline-offset:2px;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow,0 0 #0000);--tw-ring-opacity:1;--tw-ring-color:rgb(164 202 254/var(--tw-ring-opacity));outline:2px solid #0000}input[type=range]::-moz-range-thumb{background:var(--color-blue-600);appearance:none;cursor:pointer;border:0;border-radius:9999px;width:1.25rem;height:1.25rem}input[type=range]:disabled::-moz-range-thumb{background:var(--color-gray-400)}.dark input[type=range]:disabled::-moz-range-thumb{background:var(--color-gray-500)}input[type=range]::-moz-range-progress{background:var(--color-blue-500)}input[type=range]::-ms-fill-lower{background:var(--color-blue-500)}input[type=range].range-sm::-webkit-slider-thumb{width:1rem;height:1rem}input[type=range].range-lg::-webkit-slider-thumb{width:1.5rem;height:1.5rem}input[type=range].range-sm::-moz-range-thumb{width:1rem;height:1rem}input[type=range].range-lg::-moz-range-thumb{width:1.5rem;height:1.5rem}.toggle-bg:after{content:"";border-color:var(--color-gray-300);width:1.25rem;height:1.25rem;box-shadow:var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color);background:#fff;border-width:1px;border-radius:9999px;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter,backdrop-filter;transition-duration:.15s;position:absolute;top:.125rem;left:.125rem}input:checked+.toggle-bg:after{border-color:#fff;transform:translate(100%)}input:checked+.toggle-bg{background:var(--color-blue-600);border-color:var(--color-blue-600)}}@layer components;@layer utilities{.collapse{visibility:collapse}.invisible{visibility:hidden}.visible{visibility:visible}.datatable-wrapper{width:100%}@media (min-width:640px){.datatable-wrapper .datatable-top{flex-direction:row-reverse;align-items:center}}@media (min-width:640px){.datatable-wrapper .datatable-bottom{flex-direction:row;align-items:center}}.datatable-wrapper .datatable-bottom{flex-direction:column;justify-content:space-between;align-items:start;gap:1rem;margin-top:1rem;display:flex}@media (min-width:640px){.datatable-wrapper .datatable-bottom{flex-direction:row;align-items:center}}.datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:first-of-type,.datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:last-of-type{position:relative}.datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item-link{color:var(--color-gray-500);border-top:1px solid var(--color-gray-300);border-bottom:1px solid var(--color-gray-300);border-right:1px solid var(--color-gray-300);align-items:center;height:2rem;padding-left:.75rem;padding-right:.75rem;font-size:.875rem;font-weight:500;display:flex}.datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:first-of-type .datatable-pagination-list-item-link,.datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:last-of-type .datatable-pagination-list-item-link,.dark .datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:first-of-type .datatable-pagination-list-item-link,.dark .datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:last-of-type .datatable-pagination-list-item-link{color:#0000}.datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:first-of-type .datatable-pagination-list-item-link:after{content:url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='oklch(55.1%25 0.027 264.364)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m14 8-4 4 4 4'/%3e %3c/svg%3e");width:1.3rem;height:1.3rem;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}.datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:first-of-type .datatable-pagination-list-item-link:hover:after{content:url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='oklch(21%25 0.034 264.665)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m14 8-4 4 4 4'/%3e %3c/svg%3e")}.datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:last-of-type .datatable-pagination-list-item-link:after{content:url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='oklch(55.1%25 0.027 264.364)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m10 16 4-4-4-4'/%3e %3c/svg%3e");width:1.3rem;height:1.3rem;position:absolute;top:50%;right:50%;transform:translate(50%,-50%)}.datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:last-of-type .datatable-pagination-list-item-link:hover:after{content:url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='oklch(21%25 0.034 264.665)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m10 16 4-4-4-4'/%3e %3c/svg%3e")}.datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:first-of-type .datatable-pagination-list-item-link{border-left:1px solid var(--color-gray-300);border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:last-of-type .datatable-pagination-list-item-link{border-left:0;border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item-link:hover{background-color:var(--color-gray-50);color:var(--color-gray-700)}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:calc(var(--spacing) * 0)}.start{inset-inline-start:var(--spacing)}.end{inset-inline-end:var(--spacing)}.top-0{top:calc(var(--spacing) * 0)}.right-0{right:calc(var(--spacing) * 0)}.bottom-0{bottom:calc(var(--spacing) * 0)}.bottom-\[60px\]{bottom:60px}.left-0{left:calc(var(--spacing) * 0)}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.mx-auto{margin-inline:auto}.my-2{margin-block:calc(var(--spacing) * 2)}.my-4{margin-block:calc(var(--spacing) * 4)}.ms-3{margin-inline-start:calc(var(--spacing) * 3)}.ms-auto{margin-inline-start:auto}.me-2{margin-inline-end:calc(var(--spacing) * 2)}.me-3{margin-inline-end:calc(var(--spacing) * 3)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-5{margin-top:calc(var(--spacing) * 5)}.apexcharts-canvas .apexcharts-legend-series{align-items:center!important;margin-bottom:.25rem!important;margin-left:.5rem!important;margin-right:.5rem!important;display:flex!important}.apexcharts-canvas .apexcharts-tooltip{color:var(--color-gray-700)!important;background-color:#fff!important;border:0!important;border-radius:.25rem!important;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a!important}.datatable-wrapper .datatable-top{flex-direction:column-reverse;justify-content:space-between;align-items:start;gap:1rem;margin-bottom:1rem;display:flex}@media (min-width:640px){.datatable-wrapper .datatable-top{flex-direction:row-reverse;align-items:center}}[dir=rtl] .apexcharts-tooltip .apexcharts-tooltip-marker{margin-left:.375rem!important;margin-right:0!important}.datatable-wrapper .datatable-top .datatable-dropdown{color:var(--color-gray-500);font-size:.875rem}.datatable-wrapper .datatable-top .datatable-dropdown .datatable-selector{background-color:var(--color-gray-50);color:var(--color-gray-900);border:1px solid var(--color-gray-300);border-radius:.5rem;min-width:4rem;margin-right:.25rem;font-size:.875rem}.apexcharts-canvas .apexcharts-tooltip .apexcharts-tooltip-title{background-color:var(--color-gray-100)!important;border-bottom-color:var(--color-gray-200)!important;color:var(--color-gray-500)!important;margin-bottom:.75rem!important;padding:.5rem .75rem!important;font-size:.875rem!important;font-weight:400!important}.-mb-px{margin-bottom:-1px}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.apexcharts-canvas .apexcharts-xaxistooltip{color:var(--color-gray-500)!important;background-color:#fff!important;border-color:#0000!important;border-radius:.25rem!important;padding:.5rem .75rem!important;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a!important}.apexcharts-canvas .apexcharts-xaxistooltip:after,.apexcharts-canvas .apexcharts-xaxistooltip:before{border-bottom-color:#fff!important}.apexcharts-canvas .apexcharts-xaxistooltip:after{border-width:8px!important;margin-left:-8px!important}.apexcharts-canvas .apexcharts-xaxistooltip:before{border-width:10px!important;margin-left:-10px!important}.ml-auto{margin-left:auto}.datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list{align-items:center;height:2rem;font-size:.875rem;display:flex}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-\[calc\(100\%-1rem\)\]{height:calc(100% - 1rem)}.max-h-full{max-height:100%}.min-h-screen{min-height:100vh}.datatable-wrapper .datatable-table{width:100%;color:var(--color-gray-500);text-align:left;font-size:.875rem}.datatable-wrapper .datatable-table thead{color:var(--color-gray-500);background-color:var(--color-gray-50);font-size:.75rem}.datatable-wrapper .datatable-table thead th{white-space:nowrap;padding:.75rem 1.5rem;width:auto!important}.datatable-wrapper .datatable-table tbody th,.datatable-wrapper .datatable-table tbody td{padding:.75rem 1.5rem;width:auto!important}.datatable-wrapper .datatable-table thead th .datatable-sorter,.datatable-wrapper .datatable-table thead th{text-transform:uppercase}.datatable-wrapper .datatable-table tbody tr{border-bottom:1px solid var(--color-gray-200)}.w-1\/2{width:50%}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-40{width:calc(var(--spacing) * 40)}.w-44{width:calc(var(--spacing) * 44)}.w-56{width:calc(var(--spacing) * 56)}.w-64{width:calc(var(--spacing) * 64)}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-7xl{max-width:var(--container-7xl)}.max-w-md{max-width:var(--container-md)}.max-w-screen-xl{max-width:var(--breakpoint-xl)}.max-w-xl{max-width:var(--container-xl)}.datatable-wrapper .datatable-search .datatable-input,.datatable-wrapper .datatable-input{color:var(--color-gray-900);border:1px solid var(--color-gray-300);background-color:var(--color-gray-50);border-radius:.5rem;min-width:16rem;font-size:.875rem}.datatable-wrapper thead th .datatable-input{color:var(--color-gray-900);background-color:#fff;min-width:0;padding-top:.35rem;padding-bottom:.35rem;font-weight:400}.datatable-wrapper .datatable-search .datatable-input{color:var(--color-gray-900);border:1px solid var(--color-gray-300);background-color:var(--color-gray-50);border-radius:.5rem;min-width:16rem;font-size:.875rem}.dark .datatable-wrapper .datatable-search .datatable-input{color:#fff;background-color:var(--color-gray-800);border:1px solid var(--color-gray-700)}.datatable-wrapper .datatable-search .datatable-input:focus{border-color:var(--color-blue-600)}.min-w-\[95px\]{min-width:95px}.flex-1{flex:1}.flex-shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.-translate-x-full{--tw-translate-x:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-0{--tw-translate-x:calc(var(--spacing) * 0);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-full{--tw-translate-x:100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-full{--tw-translate-y:-100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-full{--tw-translate-y:100%;translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.transform-none{transform:none}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize{resize:both}.list-none{list-style-type:none}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-1{gap:calc(var(--spacing) * 1)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-x-2>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse)))}:where(.space-x-3>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 3) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-x-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-gray-100>:not(:last-child)){border-color:var(--color-gray-100)}.self-center{align-self:center}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.datatable-wrapper .datatable-container,.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.rounded-t-lg{border-top-left-radius:var(--radius-lg);border-top-right-radius:var(--radius-lg)}.rounded-l-lg{border-top-left-radius:var(--radius-lg);border-bottom-left-radius:var(--radius-lg)}.rounded-r-lg{border-top-right-radius:var(--radius-lg);border-bottom-right-radius:var(--radius-lg)}.rounded-b{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-b-lg{border-bottom-right-radius:var(--radius-lg);border-bottom-left-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.dark .apexcharts-canvas .apexcharts-tooltip{background-color:var(--color-gray-700)!important;color:var(--color-gray-400)!important;border-color:#0000!important;box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a!important}.dark .apexcharts-canvas .apexcharts-tooltip .apexcharts-tooltip-title{background-color:var(--color-gray-600)!important;border-color:var(--color-gray-500)!important;color:var(--color-gray-500)!important}.dark .apexcharts-canvas .apexcharts-xaxistooltip{color:var(--color-gray-400)!important;background-color:var(--color-gray-700)!important}.dark .apexcharts-canvas .apexcharts-xaxistooltip:after,.dark .apexcharts-canvas .apexcharts-xaxistooltip:before{border-bottom-color:var(--color-gray-700)!important}.dark .apexcharts-gridline,.dark .apexcharts-xcrosshairs,.dark .apexcharts-ycrosshairs{stroke:var(--color-gray-700)!important}.dark .datatable-wrapper .datatable-search .datatable-input,.dark .datatable-wrapper .datatable-input{color:#fff;background-color:var(--color-gray-800);border:1px solid var(--color-gray-700)}.dark .datatable-wrapper thead th .datatable-input{background-color:var(--color-gray-700);border-color:var(--color-gray-600);color:#fff}.dark .datatable-wrapper .datatable-top .datatable-dropdown{color:var(--color-gray-400)}.dark .datatable-wrapper .datatable-top .datatable-dropdown .datatable-selector{background-color:var(--color-gray-800);border:1px solid var(--color-gray-700);color:#fff}.dark .datatable-wrapper .datatable-table{color:var(--color-gray-400)}.dark .datatable-wrapper .datatable-table thead{color:var(--color-gray-400);background-color:var(--color-gray-800)}.dark .datatable-wrapper .datatable-table tbody tr{border-bottom:1px solid var(--color-gray-700)}.dark .datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item-link{color:var(--color-gray-400);border-color:var(--color-gray-700)}.dark .datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:first-of-type .datatable-pagination-list-item-link,.dark .datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:last-of-type .datatable-pagination-list-item-link{color:#0000}.dark .datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:first-of-type .datatable-pagination-list-item-link:after{content:url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='oklch(70.7%25 0.022 261.325)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m14 8-4 4 4 4'/%3e %3c/svg%3e")}.dark .datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:first-of-type .datatable-pagination-list-item-link:hover:after{content:url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m14 8-4 4 4 4'/%3e %3c/svg%3e")}.dark .datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:last-of-type .datatable-pagination-list-item-link:after{content:url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='oklch(70.7%25 0.022 261.325)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m10 16 4-4-4-4'/%3e %3c/svg%3e")}.dark .datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:last-of-type .datatable-pagination-list-item-link:hover:after{content:url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m10 16 4-4-4-4'/%3e %3c/svg%3e")}.dark .datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:first-of-type .datatable-pagination-list-item-link{border-left:1px solid var(--color-gray-700)}.dark .datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item-link:hover{background-color:var(--color-gray-700);color:#fff}.border-blue-200{border-color:var(--color-blue-200)}.border-blue-600{border-color:var(--color-blue-600)}.border-blue-700{border-color:var(--color-blue-700)}.border-gray-100{border-color:var(--color-gray-100)}.border-gray-200{border-color:var(--color-gray-200)}.border-gray-300{border-color:var(--color-gray-300)}.border-green-200{border-color:var(--color-green-200)}.border-red-200{border-color:var(--color-red-200)}.border-yellow-200{border-color:var(--color-yellow-200)}.apexcharts-canvas .apexcharts-tooltip-series-group.apexcharts-active .apexcharts-tooltip-y-group{padding:0!important}.apexcharts-canvas .apexcharts-tooltip-series-group.apexcharts-active{color:var(--color-gray-500)!important;background-color:#fff!important;padding-bottom:.75rem!important;padding-left:.75rem!important;padding-right:.75rem!important}.dark .apexcharts-canvas .apexcharts-tooltip-series-group.apexcharts-active{background-color:var(--color-gray-700)!important;color:var(--color-gray-400)!important}.apexcharts-canvas .apexcharts-tooltip-series-group.apexcharts-active:first-of-type{padding-top:.75rem!important}.datatable-wrapper .datatable-table tbody tr.selected{background-color:var(--color-gray-100)}.dark .datatable-wrapper .datatable-table tbody tr.selected{background-color:var(--color-gray-700)}.selectedCell{background-color:var(--color-gray-50)}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-100{background-color:var(--color-blue-100)}.bg-blue-600{background-color:var(--color-blue-600)}.bg-blue-700{background-color:var(--color-blue-700)}.bg-gray-50{background-color:var(--color-gray-50)}.bg-gray-100{background-color:var(--color-gray-100)}.bg-gray-200{background-color:var(--color-gray-200)}.bg-gray-800{background-color:var(--color-gray-800)}.bg-gray-900\/50{background-color:#10182880}@supports (color:color-mix(in lab, red, red)){.bg-gray-900\/50{background-color:color-mix(in oklab, var(--color-gray-900) 50%, transparent)}}.bg-green-50{background-color:var(--color-green-50)}.bg-red-50{background-color:var(--color-red-50)}.bg-red-100{background-color:var(--color-red-100)}.bg-transparent{background-color:#0000}.bg-white{background-color:var(--color-white)}.bg-white\/50{background-color:#ffffff80}@supports (color:color-mix(in lab, red, red)){.bg-white\/50{background-color:color-mix(in oklab, var(--color-white) 50%, transparent)}}.bg-yellow-50{background-color:var(--color-yellow-50)}.dark .selectedCell{background-color:var(--color-gray-700)}.apexcharts-canvas .apexcharts-datalabels-group .apexcharts-text.apexcharts-datalabel-label{fill:var(--color-gray-500)!important;font-size:1rem,[object Object]!important;font-weight:400!important}.dark .apexcharts-canvas .apexcharts-datalabels-group .apexcharts-text.apexcharts-datalabel-label{fill:var(--color-gray-400)!important}.apexcharts-datalabels-group .apexcharts-text.apexcharts-datalabel-value{fill:var(--color-gray-900)!important;font-size:1.875rem,[object Object]!important;font-weight:700!important}.dark .apexcharts-canvas .apexcharts-datalabels-group .apexcharts-text.apexcharts-datalabel-value{fill:#fff!important}.apexcharts-ycrosshairs{stroke:var(--color-gray-200)!important}.dark .apexcharts-ycrosshairs{stroke:var(--color-gray-700)!important}.object-cover{object-fit:cover}.apexcharts-canvas .apexcharts-legend,.apexcharts-canvas .apexcharts-tooltip-series-group.apexcharts-active .apexcharts-tooltip-y-group{padding:0!important}.p-1{padding:calc(var(--spacing) * 1)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.pt-2{padding-top:calc(var(--spacing) * 2)}.datatable-wrapper .datatable-container thead tr.search-filtering-row th{padding-top:0}.apexcharts-canvas .apexcharts-legend-text{color:var(--color-gray-500)!important;padding-left:1.25rem!important;font-size:.75rem!important;font-weight:500!important}[dir=rtl] .apexcharts-canvas .apexcharts-legend-text{padding-right:.5rem!important}.apexcharts-canvas .apexcharts-legend-text:not(.apexcharts-inactive-legend):hover{color:var(--color-gray-900)!important}.dark .apexcharts-canvas .apexcharts-legend-text{color:var(--color-gray-400)!important}.dark .apexcharts-canvas .apexcharts-legend-text:not(.apexcharts-inactive-legend):hover{color:#fff!important}.datatable-wrapper .datatable-table .datatable-empty,.text-center{text-align:center}.text-left{text-align:left}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.apexcharts-canvas .apexcharts-datalabels .apexcharts-text.apexcharts-pie-label{font-size:.75rem,[object Object]!important;text-shadow:none!important;filter:none!important;font-weight:600!important;font-size:.75rem,[object Object]!important;font-weight:600!important}.apexcharts-canvas .apexcharts-xaxistooltip-text{font-size:.875rem!important;font-weight:400!important}.apexcharts-canvas .apexcharts-tooltip .apexcharts-tooltip-text-y-label{color:var(--color-gray-500)!important;font-size:.875rem!important}.dark .apexcharts-canvas .apexcharts-tooltip .apexcharts-tooltip-text-y-label{color:var(--color-gray-400)!important}.apexcharts-canvas .apexcharts-tooltip .apexcharts-tooltip-text-y-value{color:var(--color-gray-900);font-size:.875rem!important}.dark .apexcharts-canvas .apexcharts-tooltip .apexcharts-tooltip-text-y-value{color:#fff!important}.datatable-wrapper .datatable-bottom .datatable-info{color:var(--color-gray-500);font-size:.875rem}.dark .datatable-wrapper .datatable-bottom .datatable-info{color:var(--color-gray-400)}.leading-6{--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.leading-9{--tw-leading:calc(var(--spacing) * 9);line-height:calc(var(--spacing) * 9)}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.whitespace-nowrap{white-space:nowrap}.datatable-wrapper .datatable-table thead th .datatable-sorter{text-transform:uppercase}.datatable-wrapper .datatable-table thead th .datatable-sorter:hover,.datatable-wrapper .datatable-table thead th.datatable-ascending .datatable-sorter,.datatable-wrapper .datatable-table thead th.datatable-descending .datatable-sorter{color:var(--color-gray-900)}.dark .datatable-wrapper .datatable-table thead th .datatable-sorter:hover,.dark .datatable-wrapper .datatable-table thead th.datatable-ascending .datatable-sorter,.dark .datatable-wrapper .datatable-table thead th.datatable-descending .datatable-sorter{color:#fff}.datatable-wrapper .datatable-table thead th.datatable-ascending .datatable-sorter{color:var(--color-gray-900)}.dark .datatable-wrapper .datatable-table thead th.datatable-ascending .datatable-sorter{color:#fff}.datatable-wrapper .datatable-table thead th.datatable-descending .datatable-sorter{color:var(--color-gray-900)}.dark .datatable-wrapper .datatable-table thead th.datatable-descending .datatable-sorter{color:#fff}.text-blue-600{color:var(--color-blue-600)}.text-blue-700{color:var(--color-blue-700)}.text-blue-800{color:var(--color-blue-800)}.text-blue-900{color:var(--color-blue-900)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-gray-800{color:var(--color-gray-800)}.text-gray-900{color:var(--color-gray-900)}.text-green-800{color:var(--color-green-800)}.text-red-700{color:var(--color-red-700)}.text-red-800{color:var(--color-red-800)}.text-white{color:var(--color-white)}.text-yellow-800{color:var(--color-yellow-800)}.uppercase{text-transform:uppercase}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-0{opacity:0}.opacity-100{opacity:1}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.blur{--tw-blur:blur(8px);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,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.ease-out{--tw-ease:var(--ease-out);transition-timing-function:var(--ease-out)}@media (hover:hover){.hover\:border-gray-300:hover{border-color:var(--color-gray-300)}.hover\:bg-blue-800:hover{background-color:var(--color-blue-800)}.hover\:bg-gray-50:hover{background-color:var(--color-gray-50)}.hover\:bg-gray-100:hover{background-color:var(--color-gray-100)}.hover\:bg-gray-200:hover{background-color:var(--color-gray-200)}.hover\:bg-red-50:hover{background-color:var(--color-red-50)}.hover\:bg-white:hover{background-color:var(--color-white)}.hover\:text-blue-600:hover{color:var(--color-blue-600)}.hover\:text-blue-700:hover{color:var(--color-blue-700)}.hover\:text-gray-600:hover{color:var(--color-gray-600)}.hover\:text-gray-900:hover{color:var(--color-gray-900)}.hover\:underline:hover{text-decoration-line:underline}}.focus\:z-10:focus{z-index:10}.focus\:border-blue-500:focus{border-color:var(--color-blue-500)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-4:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus\:ring-blue-300:focus{--tw-ring-color:var(--color-blue-300)}.focus\:ring-blue-500:focus{--tw-ring-color:var(--color-blue-500)}.focus\:ring-gray-200:focus{--tw-ring-color:var(--color-gray-200)}.focus\:ring-gray-300:focus{--tw-ring-color:var(--color-gray-300)}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}@media (min-width:40rem){.sm\:col-span-2{grid-column:span 2/span 2}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:48rem){.md\:inset-0{inset:calc(var(--spacing) * 0)}.md\:order-1{order:1}.md\:col-span-2{grid-column:span 2/span 2}.md\:ms-4{margin-inline-start:calc(var(--spacing) * 4)}.md\:mt-0{margin-top:calc(var(--spacing) * 0)}.md\:block{display:block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:w-auto{width:auto}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.md\:flex-row{flex-direction:row}.md\:items-center{align-items:center}.md\:gap-1{gap:calc(var(--spacing) * 1)}:where(.md\:space-x-8>:not(:last-child)){--tw-space-x-reverse:0;margin-inline-start:calc(calc(var(--spacing) * 8) * var(--tw-space-x-reverse));margin-inline-end:calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-x-reverse)))}.md\:border-0{border-style:var(--tw-border-style);border-width:0}.md\:bg-transparent{background-color:#0000}.md\:bg-white{background-color:var(--color-white)}.md\:p-0{padding:calc(var(--spacing) * 0)}.md\:p-4{padding:calc(var(--spacing) * 4)}.md\:p-5{padding:calc(var(--spacing) * 5)}.md\:p-8{padding:calc(var(--spacing) * 8)}.md\:text-blue-700{color:var(--color-blue-700)}@media (hover:hover){.md\:hover\:bg-transparent:hover{background-color:#0000}.md\:hover\:text-blue-700:hover{color:var(--color-blue-700)}}}@media (min-width:64rem){.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}.rtl\:rotate-180:where(:dir(rtl),[dir=rtl],[dir=rtl] *){rotate:180deg}:where(.rtl\:space-x-reverse:where(:dir(rtl),[dir=rtl],[dir=rtl] *)>:not(:last-child)){--tw-space-x-reverse:1}.rtl\:text-right:where(:dir(rtl),[dir=rtl],[dir=rtl] *){text-align:right}:where(.dark\:divide-gray-700:is(.dark *)>:not(:last-child)){border-color:var(--color-gray-700)}.dark\:border-blue-500:is(.dark *){border-color:var(--color-blue-500)}.dark\:border-blue-800:is(.dark *){border-color:var(--color-blue-800)}.dark\:border-gray-500:is(.dark *){border-color:var(--color-gray-500)}.dark\:border-gray-600:is(.dark *){border-color:var(--color-gray-600)}.dark\:border-gray-700:is(.dark *){border-color:var(--color-gray-700)}.dark\:border-green-800:is(.dark *){border-color:var(--color-green-800)}.dark\:border-red-800:is(.dark *){border-color:var(--color-red-800)}.dark\:border-transparent:is(.dark *){border-color:#0000}.dark\:border-yellow-700:is(.dark *){border-color:var(--color-yellow-700)}.dark\:bg-blue-600:is(.dark *){background-color:var(--color-blue-600)}.dark\:bg-blue-900:is(.dark *){background-color:var(--color-blue-900)}.dark\:bg-blue-900\/30:is(.dark *){background-color:#1c398e4d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-blue-900\/30:is(.dark *){background-color:color-mix(in oklab, var(--color-blue-900) 30%, transparent)}}.dark\:bg-gray-600:is(.dark *){background-color:var(--color-gray-600)}.dark\:bg-gray-700:is(.dark *){background-color:var(--color-gray-700)}.dark\:bg-gray-800:is(.dark *){background-color:var(--color-gray-800)}.dark\:bg-gray-800\/50:is(.dark *){background-color:#1e293980}@supports (color:color-mix(in lab, red, red)){.dark\:bg-gray-800\/50:is(.dark *){background-color:color-mix(in oklab, var(--color-gray-800) 50%, transparent)}}.dark\:bg-gray-900:is(.dark *){background-color:var(--color-gray-900)}.dark\:bg-gray-900\/80:is(.dark *){background-color:#101828cc}@supports (color:color-mix(in lab, red, red)){.dark\:bg-gray-900\/80:is(.dark *){background-color:color-mix(in oklab, var(--color-gray-900) 80%, transparent)}}.dark\:bg-green-900\/40:is(.dark *){background-color:#0d542b66}@supports (color:color-mix(in lab, red, red)){.dark\:bg-green-900\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-green-900) 40%, transparent)}}.dark\:bg-red-900\/40:is(.dark *){background-color:#82181a66}@supports (color:color-mix(in lab, red, red)){.dark\:bg-red-900\/40:is(.dark *){background-color:color-mix(in oklab, var(--color-red-900) 40%, transparent)}}.dark\:bg-yellow-900\/30:is(.dark *){background-color:#733e0a4d}@supports (color:color-mix(in lab, red, red)){.dark\:bg-yellow-900\/30:is(.dark *){background-color:color-mix(in oklab, var(--color-yellow-900) 30%, transparent)}}.dark\:text-blue-100:is(.dark *){color:var(--color-blue-100)}.dark\:text-blue-200:is(.dark *){color:var(--color-blue-200)}.dark\:text-blue-300:is(.dark *){color:var(--color-blue-300)}.dark\:text-blue-400:is(.dark *){color:var(--color-blue-400)}.dark\:text-blue-500:is(.dark *){color:var(--color-blue-500)}.dark\:text-gray-100:is(.dark *){color:var(--color-gray-100)}.dark\:text-gray-200:is(.dark *){color:var(--color-gray-200)}.dark\:text-gray-300:is(.dark *){color:var(--color-gray-300)}.dark\:text-gray-400:is(.dark *){color:var(--color-gray-400)}.dark\:text-gray-500:is(.dark *){color:var(--color-gray-500)}.dark\:text-green-300:is(.dark *){color:var(--color-green-300)}.dark\:text-red-300:is(.dark *){color:var(--color-red-300)}.dark\:text-white:is(.dark *){color:var(--color-white)}.dark\:text-yellow-300:is(.dark *){color:var(--color-yellow-300)}.dark\:placeholder-gray-400:is(.dark *)::placeholder{color:var(--color-gray-400)}@media (hover:hover){.dark\:hover\:bg-blue-700:is(.dark *):hover{background-color:var(--color-blue-700)}.dark\:hover\:bg-gray-600:is(.dark *):hover{background-color:var(--color-gray-600)}.dark\:hover\:bg-gray-700:is(.dark *):hover{background-color:var(--color-gray-700)}.dark\:hover\:bg-gray-700\/60:is(.dark *):hover{background-color:#36415399}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-gray-700\/60:is(.dark *):hover{background-color:color-mix(in oklab, var(--color-gray-700) 60%, transparent)}}.dark\:hover\:bg-gray-800:is(.dark *):hover{background-color:var(--color-gray-800)}.dark\:hover\:bg-red-900\/40:is(.dark *):hover{background-color:#82181a66}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-red-900\/40:is(.dark *):hover{background-color:color-mix(in oklab, var(--color-red-900) 40%, transparent)}}.dark\:hover\:text-blue-500:is(.dark *):hover{color:var(--color-blue-500)}.dark\:hover\:text-gray-300:is(.dark *):hover{color:var(--color-gray-300)}.dark\:hover\:text-white:is(.dark *):hover{color:var(--color-white)}}.dark\:focus\:ring-blue-800:is(.dark *):focus{--tw-ring-color:var(--color-blue-800)}.dark\:focus\:ring-gray-600:is(.dark *):focus{--tw-ring-color:var(--color-gray-600)}.dark\:focus\:ring-gray-700:is(.dark *):focus{--tw-ring-color:var(--color-gray-700)}@media (min-width:48rem){.md\:dark\:bg-gray-900:is(.dark *){background-color:var(--color-gray-900)}.md\:dark\:bg-transparent:is(.dark *){background-color:#0000}@media (hover:hover){.md\:dark\:hover\:bg-transparent:is(.dark *):hover{background-color:#0000}}}.flag-lang{width:32px;height:22px}.flag-lang-ch{width:22px;height:22px}}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-space-x-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false} \ No newline at end of file +@layer properties; +@layer theme, base, components, utilities; +@layer theme { + :root, :host { + --font-sans: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", + "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", + "Courier New", monospace; + --color-red-50: oklch(97.1% 0.013 17.38); + --color-red-100: oklch(93.6% 0.032 17.717); + --color-red-200: oklch(88.5% 0.062 18.334); + --color-red-300: oklch(80.8% 0.114 19.571); + --color-red-700: oklch(50.5% 0.213 27.518); + --color-red-800: oklch(44.4% 0.177 26.899); + --color-red-900: oklch(39.6% 0.141 25.723); + --color-yellow-50: oklch(98.7% 0.026 102.212); + --color-yellow-200: oklch(94.5% 0.129 101.54); + --color-yellow-300: oklch(90.5% 0.182 98.111); + --color-yellow-700: oklch(55.4% 0.135 66.442); + --color-yellow-800: oklch(47.6% 0.114 61.907); + --color-yellow-900: oklch(42.1% 0.095 57.708); + --color-green-50: oklch(98.2% 0.018 155.826); + --color-green-200: oklch(92.5% 0.084 155.995); + --color-green-300: oklch(87.1% 0.15 154.449); + --color-green-800: oklch(44.8% 0.119 151.328); + --color-green-900: oklch(39.3% 0.095 152.535); + --color-blue-50: oklch(97% 0.014 254.604); + --color-blue-100: oklch(93.2% 0.032 255.585); + --color-blue-200: oklch(88.2% 0.059 254.128); + --color-blue-300: oklch(80.9% 0.105 251.813); + --color-blue-400: oklch(70.7% 0.165 254.624); + --color-blue-500: oklch(62.3% 0.214 259.815); + --color-blue-600: oklch(54.6% 0.245 262.881); + --color-blue-700: oklch(48.8% 0.243 264.376); + --color-blue-800: oklch(42.4% 0.199 265.638); + --color-blue-900: oklch(37.9% 0.146 265.522); + --color-gray-50: oklch(98.5% 0.002 247.839); + --color-gray-100: oklch(96.7% 0.003 264.542); + --color-gray-200: oklch(92.8% 0.006 264.531); + --color-gray-300: oklch(87.2% 0.01 258.338); + --color-gray-400: oklch(70.7% 0.022 261.325); + --color-gray-500: oklch(55.1% 0.027 264.364); + --color-gray-600: oklch(44.6% 0.03 256.802); + --color-gray-700: oklch(37.3% 0.034 259.733); + --color-gray-800: oklch(27.8% 0.033 256.848); + --color-gray-900: oklch(21% 0.034 264.665); + --color-black: #000; + --color-white: #fff; + --spacing: 0.25rem; + --breakpoint-xl: 80rem; + --container-md: 28rem; + --container-xl: 36rem; + --container-2xl: 42rem; + --container-7xl: 80rem; + --text-xs: 0.75rem; + --text-xs--line-height: calc(1 / 0.75); + --text-sm: 0.875rem; + --text-sm--line-height: calc(1.25 / 0.875); + --text-base: 1rem; + --text-base--line-height: calc(1.5 / 1); + --text-lg: 1.125rem; + --text-lg--line-height: calc(1.75 / 1.125); + --text-xl: 1.25rem; + --text-xl--line-height: calc(1.75 / 1.25); + --text-2xl: 1.5rem; + --text-2xl--line-height: calc(2 / 1.5); + --text-3xl: 1.875rem; + --text-3xl--line-height: calc(2.25 / 1.875); + --font-weight-medium: 500; + --font-weight-semibold: 600; + --font-weight-bold: 700; + --leading-relaxed: 1.625; + --radius-sm: 0.25rem; + --radius-lg: 0.5rem; + --ease-out: cubic-bezier(0, 0, 0.2, 1); + --default-transition-duration: 150ms; + --default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + --default-font-family: var(--font-sans); + --default-mono-font-family: var(--font-mono); + } +} +@layer base { + *, ::after, ::before, ::backdrop, ::file-selector-button { + box-sizing: border-box; + margin: 0; + padding: 0; + border: 0 solid; + } + html, :host { + line-height: 1.5; + -webkit-text-size-adjust: 100%; + tab-size: 4; + font-family: var(--default-font-family, ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"); + font-feature-settings: var(--default-font-feature-settings, normal); + font-variation-settings: var(--default-font-variation-settings, normal); + -webkit-tap-highlight-color: transparent; + } + hr { + height: 0; + color: inherit; + border-top-width: 1px; + } + abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + } + h1, h2, h3, h4, h5, h6 { + font-size: inherit; + font-weight: inherit; + } + a { + color: inherit; + -webkit-text-decoration: inherit; + text-decoration: inherit; + } + b, strong { + font-weight: bolder; + } + code, kbd, samp, pre { + font-family: var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace); + font-feature-settings: var(--default-mono-font-feature-settings, normal); + font-variation-settings: var(--default-mono-font-variation-settings, normal); + font-size: 1em; + } + small { + font-size: 80%; + } + sub, sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; + } + sub { + bottom: -0.25em; + } + sup { + top: -0.5em; + } + table { + text-indent: 0; + border-color: inherit; + border-collapse: collapse; + } + :-moz-focusring { + outline: auto; + } + progress { + vertical-align: baseline; + } + summary { + display: list-item; + } + ol, ul, menu { + list-style: none; + } + img, svg, video, canvas, audio, iframe, embed, object { + display: block; + vertical-align: middle; + } + img, video { + max-width: 100%; + height: auto; + } + button, input, select, optgroup, textarea, ::file-selector-button { + font: inherit; + font-feature-settings: inherit; + font-variation-settings: inherit; + letter-spacing: inherit; + color: inherit; + border-radius: 0; + background-color: transparent; + opacity: 1; + } + :where(select:is([multiple], [size])) optgroup { + font-weight: bolder; + } + :where(select:is([multiple], [size])) optgroup option { + padding-inline-start: 20px; + } + ::file-selector-button { + margin-inline-end: 4px; + } + ::placeholder { + opacity: 1; + } + @supports (not (-webkit-appearance: -apple-pay-button)) or (contain-intrinsic-size: 1px) { + ::placeholder { + color: currentcolor; + @supports (color: color-mix(in lab, red, red)) { + color: color-mix(in oklab, currentcolor 50%, transparent); + } + } + } + textarea { + resize: vertical; + } + ::-webkit-search-decoration { + -webkit-appearance: none; + } + ::-webkit-date-and-time-value { + min-height: 1lh; + text-align: inherit; + } + ::-webkit-datetime-edit { + display: inline-flex; + } + ::-webkit-datetime-edit-fields-wrapper { + padding: 0; + } + ::-webkit-datetime-edit, ::-webkit-datetime-edit-year-field, ::-webkit-datetime-edit-month-field, ::-webkit-datetime-edit-day-field, ::-webkit-datetime-edit-hour-field, ::-webkit-datetime-edit-minute-field, ::-webkit-datetime-edit-second-field, ::-webkit-datetime-edit-millisecond-field, ::-webkit-datetime-edit-meridiem-field { + padding-block: 0; + } + ::-webkit-calendar-picker-indicator { + line-height: 1; + } + :-moz-ui-invalid { + box-shadow: none; + } + button, input:where([type="button"], [type="reset"], [type="submit"]), ::file-selector-button { + appearance: button; + } + ::-webkit-inner-spin-button, ::-webkit-outer-spin-button { + height: auto; + } + [hidden]:where(:not([hidden="until-found"])) { + display: none !important; + } +} +@layer utilities { + .collapse { + visibility: collapse; + } + .invisible { + visibility: hidden; + } + .visible { + visibility: visible; + } + .datatable-wrapper { + width: 100%; + & .datatable-top { + display: flex; + justify-content: space-between; + flex-direction: column-reverse; + align-items: start; + gap: 1rem; + margin-bottom: 1rem; + @media (min-width: 640px) { + flex-direction: row-reverse; + align-items: center; + } + } + & .datatable-search .datatable-input { + color: var(--color-gray-900); + font-size: 0.875rem; + border: 1px solid var(--color-gray-300); + border-radius: 0.5rem; + background-color: var(--color-gray-50); + min-width: 16rem; + } + & .datatable-input { + color: var(--color-gray-900); + font-size: 0.875rem; + border: 1px solid var(--color-gray-300); + border-radius: 0.5rem; + background-color: var(--color-gray-50); + min-width: 16rem; + } + .dark & .datatable-search .datatable-input { + color: white; + background-color: var(--color-gray-800); + border: 1px solid var(--color-gray-700); + } + .dark & .datatable-input { + color: white; + background-color: var(--color-gray-800); + border: 1px solid var(--color-gray-700); + } + & thead th .datatable-input { + background-color: white; + font-weight: 400; + color: var(--color-gray-900); + padding-top: .35rem; + padding-bottom: .35rem; + min-width: 0; + } + .dark & thead th .datatable-input { + background-color: var(--color-gray-700); + border-color: var(--color-gray-600); + color: white; + } + & .datatable-top .datatable-dropdown { + color: var(--color-gray-500); + font-size: 0.875rem; + } + .dark & .datatable-top .datatable-dropdown { + color: var(--color-gray-400); + } + & .datatable-top .datatable-dropdown .datatable-selector { + background-color: var(--color-gray-50); + color: var(--color-gray-900); + font-size: 0.875rem; + border: 1px solid var(--color-gray-300); + border-radius: 0.5rem; + margin-right: 0.25rem; + min-width: 4rem; + } + .dark & .datatable-top .datatable-dropdown .datatable-selector { + background-color: var(--color-gray-800); + border: 1px solid var(--color-gray-700); + color: white; + } + & .datatable-container thead tr.search-filtering-row th { + padding-top: 0; + } + & .datatable-search .datatable-input:focus { + border-color: var(--color-blue-600); + } + & .datatable-container { + overflow-x: auto; + } + & .datatable-table { + width: 100%; + font-size: 0.875rem; + color: var(--color-gray-500); + text-align: left; + } + .dark & .datatable-table { + color: var(--color-gray-400); + } + & .datatable-table thead { + font-size: 0.75rem; + color: var(--color-gray-500); + background-color: var(--color-gray-50); + } + .dark & .datatable-table thead { + color: var(--color-gray-400); + background-color: var(--color-gray-800); + } + & .datatable-table thead th { + white-space: nowrap; + } + & .datatable-table thead th { + width: auto !important; + padding-top: 0.75rem; + padding-bottom: 0.75rem; + padding-left: 1.5rem; + padding-right: 1.5rem; + } + & .datatable-table tbody th { + width: auto !important; + padding-top: 0.75rem; + padding-bottom: 0.75rem; + padding-left: 1.5rem; + padding-right: 1.5rem; + } + & .datatable-table tbody td { + width: auto !important; + padding-top: 0.75rem; + padding-bottom: 0.75rem; + padding-left: 1.5rem; + padding-right: 1.5rem; + } + & .datatable-table thead th .datatable-sorter { + text-transform: uppercase; + } + & .datatable-table thead th { + text-transform: uppercase; + } + & .datatable-table thead th .datatable-sorter:hover { + color: var(--color-gray-900); + } + & .datatable-table thead th.datatable-ascending .datatable-sorter { + color: var(--color-gray-900); + } + & .datatable-table thead th.datatable-descending .datatable-sorter { + color: var(--color-gray-900); + } + .dark & .datatable-table thead th .datatable-sorter:hover { + color: white; + } + .dark & .datatable-table thead th.datatable-ascending .datatable-sorter { + color: white; + } + .dark & .datatable-table thead th.datatable-descending .datatable-sorter { + color: white; + } + & .datatable-table tbody tr.selected { + background-color: var(--color-gray-100); + } + .dark & .datatable-table tbody tr.selected { + background-color: var(--color-gray-700); + } + & .datatable-table tbody tr { + border-bottom: 1px solid var(--color-gray-200); + } + .dark & .datatable-table tbody tr { + border-bottom: 1px solid var(--color-gray-700); + } + & .datatable-table .datatable-empty { + text-align: center; + } + & .datatable-bottom { + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: start; + margin-top: 1rem; + gap: 1rem; + @media (min-width: 640px) { + flex-direction: row; + align-items: center; + } + } + & .datatable-bottom .datatable-info { + color: var(--color-gray-500); + font-size: 0.875rem; + } + .dark & .datatable-bottom .datatable-info { + color: var(--color-gray-400); + } + & .datatable-bottom .datatable-pagination .datatable-pagination-list { + display: flex; + align-items: center; + height: 2rem; + font-size: 0.875rem; + } + & .datatable-bottom .datatable-pagination .datatable-pagination-list-item-link { + display: flex; + align-items: center; + color: var(--color-gray-500); + font-weight: 500; + padding-left: 0.75rem; + padding-right: 0.75rem; + height: 2rem; + font-size: 0.875rem; + border-top: 1px solid var(--color-gray-300); + border-bottom: 1px solid var(--color-gray-300); + border-right: 1px solid var(--color-gray-300); + } + .dark & .datatable-bottom .datatable-pagination .datatable-pagination-list-item-link { + color: var(--color-gray-400); + border-color: var(--color-gray-700); + } + & .datatable-bottom .datatable-pagination .datatable-pagination-list-item:first-of-type { + position: relative; + } + & .datatable-bottom .datatable-pagination .datatable-pagination-list-item:last-of-type { + position: relative; + } + & .datatable-bottom .datatable-pagination .datatable-pagination-list-item:first-of-type .datatable-pagination-list-item-link { + color: transparent; + } + & .datatable-bottom .datatable-pagination .datatable-pagination-list-item:last-of-type .datatable-pagination-list-item-link { + color: transparent; + } + .dark & .datatable-bottom .datatable-pagination .datatable-pagination-list-item:first-of-type .datatable-pagination-list-item-link { + color: transparent; + } + .dark & .datatable-bottom .datatable-pagination .datatable-pagination-list-item:last-of-type .datatable-pagination-list-item-link { + color: transparent; + } + & .datatable-bottom .datatable-pagination .datatable-pagination-list-item:first-of-type .datatable-pagination-list-item-link::after { + content: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='oklch(55.1%25 0.027 264.364)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m14 8-4 4 4 4'/%3e %3c/svg%3e"); + position: absolute; + top: 50%; + left: 50%; + width: 1.3rem; + height: 1.3rem; + transform: translate(-50%, -50%); + } + & .datatable-bottom .datatable-pagination .datatable-pagination-list-item:first-of-type .datatable-pagination-list-item-link:hover::after { + content: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='oklch(21%25 0.034 264.665)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m14 8-4 4 4 4'/%3e %3c/svg%3e"); + } + .dark & .datatable-bottom .datatable-pagination .datatable-pagination-list-item:first-of-type .datatable-pagination-list-item-link::after { + content: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='oklch(70.7%25 0.022 261.325)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m14 8-4 4 4 4'/%3e %3c/svg%3e"); + } + .dark & .datatable-bottom .datatable-pagination .datatable-pagination-list-item:first-of-type .datatable-pagination-list-item-link:hover::after { + content: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m14 8-4 4 4 4'/%3e %3c/svg%3e"); + } + & .datatable-bottom .datatable-pagination .datatable-pagination-list-item:last-of-type .datatable-pagination-list-item-link::after { + content: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='oklch(55.1%25 0.027 264.364)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m10 16 4-4-4-4'/%3e %3c/svg%3e"); + position: absolute; + top: 50%; + right: 50%; + width: 1.3rem; + height: 1.3rem; + transform: translate(50%, -50%); + } + & .datatable-bottom .datatable-pagination .datatable-pagination-list-item:last-of-type .datatable-pagination-list-item-link:hover::after { + content: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='oklch(21%25 0.034 264.665)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m10 16 4-4-4-4'/%3e %3c/svg%3e"); + } + .dark & .datatable-bottom .datatable-pagination .datatable-pagination-list-item:last-of-type .datatable-pagination-list-item-link::after { + content: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='oklch(70.7%25 0.022 261.325)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m10 16 4-4-4-4'/%3e %3c/svg%3e"); + } + .dark & .datatable-bottom .datatable-pagination .datatable-pagination-list-item:last-of-type .datatable-pagination-list-item-link:hover::after { + content: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m10 16 4-4-4-4'/%3e %3c/svg%3e"); + } + & .datatable-bottom .datatable-pagination .datatable-pagination-list-item:first-of-type .datatable-pagination-list-item-link { + border-top-left-radius: 0.5rem; + border-bottom-left-radius: 0.5rem; + border-left: 1px solid var(--color-gray-300); + } + .dark & .datatable-bottom .datatable-pagination .datatable-pagination-list-item:first-of-type .datatable-pagination-list-item-link { + border-left: 1px solid var(--color-gray-700); + } + & .datatable-bottom .datatable-pagination .datatable-pagination-list-item:last-of-type .datatable-pagination-list-item-link { + border-top-right-radius: 0.5rem; + border-bottom-right-radius: 0.5rem; + border-left: 0; + } + & .datatable-bottom .datatable-pagination .datatable-pagination-list-item-link:hover { + background-color: var(--color-gray-50); + color: var(--color-gray-700); + } + .dark & .datatable-bottom .datatable-pagination .datatable-pagination-list-item-link:hover { + background-color: var(--color-gray-700); + color: white; + } + } + .datatable-bottom { + .datatable-wrapper & { + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: start; + margin-top: 1rem; + gap: 1rem; + @media (min-width: 640px) { + flex-direction: row; + align-items: center; + } + } + .datatable-wrapper & .datatable-info { + color: var(--color-gray-500); + font-size: 0.875rem; + } + .dark .datatable-wrapper & .datatable-info { + color: var(--color-gray-400); + } + .datatable-wrapper & .datatable-pagination .datatable-pagination-list { + display: flex; + align-items: center; + height: 2rem; + font-size: 0.875rem; + } + .datatable-wrapper & .datatable-pagination .datatable-pagination-list-item-link { + display: flex; + align-items: center; + color: var(--color-gray-500); + font-weight: 500; + padding-left: 0.75rem; + padding-right: 0.75rem; + height: 2rem; + font-size: 0.875rem; + border-top: 1px solid var(--color-gray-300); + border-bottom: 1px solid var(--color-gray-300); + border-right: 1px solid var(--color-gray-300); + } + .dark .datatable-wrapper & .datatable-pagination .datatable-pagination-list-item-link { + color: var(--color-gray-400); + border-color: var(--color-gray-700); + } + .datatable-wrapper & .datatable-pagination .datatable-pagination-list-item:first-of-type { + position: relative; + } + .datatable-wrapper & .datatable-pagination .datatable-pagination-list-item:last-of-type { + position: relative; + } + .datatable-wrapper & .datatable-pagination .datatable-pagination-list-item:first-of-type .datatable-pagination-list-item-link { + color: transparent; + } + .datatable-wrapper & .datatable-pagination .datatable-pagination-list-item:last-of-type .datatable-pagination-list-item-link { + color: transparent; + } + .dark .datatable-wrapper & .datatable-pagination .datatable-pagination-list-item:first-of-type .datatable-pagination-list-item-link { + color: transparent; + } + .dark .datatable-wrapper & .datatable-pagination .datatable-pagination-list-item:last-of-type .datatable-pagination-list-item-link { + color: transparent; + } + .datatable-wrapper & .datatable-pagination .datatable-pagination-list-item:first-of-type .datatable-pagination-list-item-link::after { + content: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='oklch(55.1%25 0.027 264.364)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m14 8-4 4 4 4'/%3e %3c/svg%3e"); + position: absolute; + top: 50%; + left: 50%; + width: 1.3rem; + height: 1.3rem; + transform: translate(-50%, -50%); + } + .datatable-wrapper & .datatable-pagination .datatable-pagination-list-item:first-of-type .datatable-pagination-list-item-link:hover::after { + content: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='oklch(21%25 0.034 264.665)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m14 8-4 4 4 4'/%3e %3c/svg%3e"); + } + .dark .datatable-wrapper & .datatable-pagination .datatable-pagination-list-item:first-of-type .datatable-pagination-list-item-link::after { + content: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='oklch(70.7%25 0.022 261.325)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m14 8-4 4 4 4'/%3e %3c/svg%3e"); + } + .dark .datatable-wrapper & .datatable-pagination .datatable-pagination-list-item:first-of-type .datatable-pagination-list-item-link:hover::after { + content: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m14 8-4 4 4 4'/%3e %3c/svg%3e"); + } + .datatable-wrapper & .datatable-pagination .datatable-pagination-list-item:last-of-type .datatable-pagination-list-item-link::after { + content: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='oklch(55.1%25 0.027 264.364)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m10 16 4-4-4-4'/%3e %3c/svg%3e"); + position: absolute; + top: 50%; + right: 50%; + width: 1.3rem; + height: 1.3rem; + transform: translate(50%, -50%); + } + .datatable-wrapper & .datatable-pagination .datatable-pagination-list-item:last-of-type .datatable-pagination-list-item-link:hover::after { + content: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='oklch(21%25 0.034 264.665)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m10 16 4-4-4-4'/%3e %3c/svg%3e"); + } + .dark .datatable-wrapper & .datatable-pagination .datatable-pagination-list-item:last-of-type .datatable-pagination-list-item-link::after { + content: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='oklch(70.7%25 0.022 261.325)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m10 16 4-4-4-4'/%3e %3c/svg%3e"); + } + .dark .datatable-wrapper & .datatable-pagination .datatable-pagination-list-item:last-of-type .datatable-pagination-list-item-link:hover::after { + content: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m10 16 4-4-4-4'/%3e %3c/svg%3e"); + } + .datatable-wrapper & .datatable-pagination .datatable-pagination-list-item:first-of-type .datatable-pagination-list-item-link { + border-top-left-radius: 0.5rem; + border-bottom-left-radius: 0.5rem; + border-left: 1px solid var(--color-gray-300); + } + .dark .datatable-wrapper & .datatable-pagination .datatable-pagination-list-item:first-of-type .datatable-pagination-list-item-link { + border-left: 1px solid var(--color-gray-700); + } + .datatable-wrapper & .datatable-pagination .datatable-pagination-list-item:last-of-type .datatable-pagination-list-item-link { + border-top-right-radius: 0.5rem; + border-bottom-right-radius: 0.5rem; + border-left: 0; + } + .datatable-wrapper & .datatable-pagination .datatable-pagination-list-item-link:hover { + background-color: var(--color-gray-50); + color: var(--color-gray-700); + } + .dark .datatable-wrapper & .datatable-pagination .datatable-pagination-list-item-link:hover { + background-color: var(--color-gray-700); + color: white; + } + } + .datatable-pagination { + .datatable-wrapper .datatable-bottom & .datatable-pagination-list { + display: flex; + align-items: center; + height: 2rem; + font-size: 0.875rem; + } + .datatable-wrapper .datatable-bottom & .datatable-pagination-list-item-link { + display: flex; + align-items: center; + color: var(--color-gray-500); + font-weight: 500; + padding-left: 0.75rem; + padding-right: 0.75rem; + height: 2rem; + font-size: 0.875rem; + border-top: 1px solid var(--color-gray-300); + border-bottom: 1px solid var(--color-gray-300); + border-right: 1px solid var(--color-gray-300); + } + .dark .datatable-wrapper .datatable-bottom & .datatable-pagination-list-item-link { + color: var(--color-gray-400); + border-color: var(--color-gray-700); + } + .datatable-wrapper .datatable-bottom & .datatable-pagination-list-item:first-of-type { + position: relative; + } + .datatable-wrapper .datatable-bottom & .datatable-pagination-list-item:last-of-type { + position: relative; + } + .datatable-wrapper .datatable-bottom & .datatable-pagination-list-item:first-of-type .datatable-pagination-list-item-link { + color: transparent; + } + .datatable-wrapper .datatable-bottom & .datatable-pagination-list-item:last-of-type .datatable-pagination-list-item-link { + color: transparent; + } + .dark .datatable-wrapper .datatable-bottom & .datatable-pagination-list-item:first-of-type .datatable-pagination-list-item-link { + color: transparent; + } + .dark .datatable-wrapper .datatable-bottom & .datatable-pagination-list-item:last-of-type .datatable-pagination-list-item-link { + color: transparent; + } + .datatable-wrapper .datatable-bottom & .datatable-pagination-list-item:first-of-type .datatable-pagination-list-item-link::after { + content: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='oklch(55.1%25 0.027 264.364)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m14 8-4 4 4 4'/%3e %3c/svg%3e"); + position: absolute; + top: 50%; + left: 50%; + width: 1.3rem; + height: 1.3rem; + transform: translate(-50%, -50%); + } + .datatable-wrapper .datatable-bottom & .datatable-pagination-list-item:first-of-type .datatable-pagination-list-item-link:hover::after { + content: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='oklch(21%25 0.034 264.665)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m14 8-4 4 4 4'/%3e %3c/svg%3e"); + } + .dark .datatable-wrapper .datatable-bottom & .datatable-pagination-list-item:first-of-type .datatable-pagination-list-item-link::after { + content: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='oklch(70.7%25 0.022 261.325)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m14 8-4 4 4 4'/%3e %3c/svg%3e"); + } + .dark .datatable-wrapper .datatable-bottom & .datatable-pagination-list-item:first-of-type .datatable-pagination-list-item-link:hover::after { + content: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m14 8-4 4 4 4'/%3e %3c/svg%3e"); + } + .datatable-wrapper .datatable-bottom & .datatable-pagination-list-item:last-of-type .datatable-pagination-list-item-link::after { + content: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='oklch(55.1%25 0.027 264.364)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m10 16 4-4-4-4'/%3e %3c/svg%3e"); + position: absolute; + top: 50%; + right: 50%; + width: 1.3rem; + height: 1.3rem; + transform: translate(50%, -50%); + } + .datatable-wrapper .datatable-bottom & .datatable-pagination-list-item:last-of-type .datatable-pagination-list-item-link:hover::after { + content: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='oklch(21%25 0.034 264.665)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m10 16 4-4-4-4'/%3e %3c/svg%3e"); + } + .dark .datatable-wrapper .datatable-bottom & .datatable-pagination-list-item:last-of-type .datatable-pagination-list-item-link::after { + content: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='oklch(70.7%25 0.022 261.325)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m10 16 4-4-4-4'/%3e %3c/svg%3e"); + } + .dark .datatable-wrapper .datatable-bottom & .datatable-pagination-list-item:last-of-type .datatable-pagination-list-item-link:hover::after { + content: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m10 16 4-4-4-4'/%3e %3c/svg%3e"); + } + .datatable-wrapper .datatable-bottom & .datatable-pagination-list-item:first-of-type .datatable-pagination-list-item-link { + border-top-left-radius: 0.5rem; + border-bottom-left-radius: 0.5rem; + border-left: 1px solid var(--color-gray-300); + } + .dark .datatable-wrapper .datatable-bottom & .datatable-pagination-list-item:first-of-type .datatable-pagination-list-item-link { + border-left: 1px solid var(--color-gray-700); + } + .datatable-wrapper .datatable-bottom & .datatable-pagination-list-item:last-of-type .datatable-pagination-list-item-link { + border-top-right-radius: 0.5rem; + border-bottom-right-radius: 0.5rem; + border-left: 0; + } + .datatable-wrapper .datatable-bottom & .datatable-pagination-list-item-link:hover { + background-color: var(--color-gray-50); + color: var(--color-gray-700); + } + .dark .datatable-wrapper .datatable-bottom & .datatable-pagination-list-item-link:hover { + background-color: var(--color-gray-700); + color: white; + } + } + .datatable-pagination-list-item-link { + .datatable-wrapper .datatable-bottom .datatable-pagination & { + display: flex; + align-items: center; + color: var(--color-gray-500); + font-weight: 500; + padding-left: 0.75rem; + padding-right: 0.75rem; + height: 2rem; + font-size: 0.875rem; + border-top: 1px solid var(--color-gray-300); + border-bottom: 1px solid var(--color-gray-300); + border-right: 1px solid var(--color-gray-300); + } + .dark .datatable-wrapper .datatable-bottom .datatable-pagination & { + color: var(--color-gray-400); + border-color: var(--color-gray-700); + } + .datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:first-of-type & { + color: transparent; + } + .datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:last-of-type & { + color: transparent; + } + .dark .datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:first-of-type & { + color: transparent; + } + .dark .datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:last-of-type & { + color: transparent; + } + .datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:first-of-type &::after { + content: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='oklch(55.1%25 0.027 264.364)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m14 8-4 4 4 4'/%3e %3c/svg%3e"); + position: absolute; + top: 50%; + left: 50%; + width: 1.3rem; + height: 1.3rem; + transform: translate(-50%, -50%); + } + .datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:first-of-type &:hover::after { + content: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='oklch(21%25 0.034 264.665)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m14 8-4 4 4 4'/%3e %3c/svg%3e"); + } + .dark .datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:first-of-type &::after { + content: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='oklch(70.7%25 0.022 261.325)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m14 8-4 4 4 4'/%3e %3c/svg%3e"); + } + .dark .datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:first-of-type &:hover::after { + content: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m14 8-4 4 4 4'/%3e %3c/svg%3e"); + } + .datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:last-of-type &::after { + content: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='oklch(55.1%25 0.027 264.364)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m10 16 4-4-4-4'/%3e %3c/svg%3e"); + position: absolute; + top: 50%; + right: 50%; + width: 1.3rem; + height: 1.3rem; + transform: translate(50%, -50%); + } + .datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:last-of-type &:hover::after { + content: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='oklch(21%25 0.034 264.665)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m10 16 4-4-4-4'/%3e %3c/svg%3e"); + } + .dark .datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:last-of-type &::after { + content: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='oklch(70.7%25 0.022 261.325)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m10 16 4-4-4-4'/%3e %3c/svg%3e"); + } + .dark .datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:last-of-type &:hover::after { + content: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m10 16 4-4-4-4'/%3e %3c/svg%3e"); + } + .datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:first-of-type & { + border-top-left-radius: 0.5rem; + border-bottom-left-radius: 0.5rem; + border-left: 1px solid var(--color-gray-300); + } + .dark .datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:first-of-type & { + border-left: 1px solid var(--color-gray-700); + } + .datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:last-of-type & { + border-top-right-radius: 0.5rem; + border-bottom-right-radius: 0.5rem; + border-left: 0; + } + .datatable-wrapper .datatable-bottom .datatable-pagination &:hover { + background-color: var(--color-gray-50); + color: var(--color-gray-700); + } + .dark .datatable-wrapper .datatable-bottom .datatable-pagination &:hover { + background-color: var(--color-gray-700); + color: white; + } + } + .sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip-path: inset(50%); + white-space: nowrap; + border-width: 0; + } + .absolute { + position: absolute; + } + .fixed { + position: fixed; + } + .relative { + position: relative; + } + .static { + position: static; + } + .inset-0 { + inset: calc(var(--spacing) * 0); + } + .start { + inset-inline-start: var(--spacing); + } + .end { + inset-inline-end: var(--spacing); + } + .top-0 { + top: calc(var(--spacing) * 0); + } + .right-0 { + right: calc(var(--spacing) * 0); + } + .bottom-0 { + bottom: calc(var(--spacing) * 0); + } + .bottom-\[60px\] { + bottom: 60px; + } + .left-0 { + left: calc(var(--spacing) * 0); + } + .z-10 { + z-index: 10; + } + .z-20 { + z-index: 20; + } + .z-30 { + z-index: 30; + } + .z-40 { + z-index: 40; + } + .z-50 { + z-index: 50; + } + .col-span-4 { + grid-column: span 4 / span 4; + } + .container { + width: 100%; + @media (width >= 40rem) { + max-width: 40rem; + } + @media (width >= 48rem) { + max-width: 48rem; + } + @media (width >= 64rem) { + max-width: 64rem; + } + @media (width >= 80rem) { + max-width: 80rem; + } + @media (width >= 96rem) { + max-width: 96rem; + } + } + .mx-auto { + margin-inline: auto; + } + .my-2 { + margin-block: calc(var(--spacing) * 2); + } + .my-4 { + margin-block: calc(var(--spacing) * 4); + } + .ms-2 { + margin-inline-start: calc(var(--spacing) * 2); + } + .ms-3 { + margin-inline-start: calc(var(--spacing) * 3); + } + .ms-auto { + margin-inline-start: auto; + } + .me-2 { + margin-inline-end: calc(var(--spacing) * 2); + } + .me-3 { + margin-inline-end: calc(var(--spacing) * 3); + } + .mt-1 { + margin-top: calc(var(--spacing) * 1); + } + .mt-2 { + margin-top: calc(var(--spacing) * 2); + } + .mt-4 { + margin-top: calc(var(--spacing) * 4); + } + .mt-5 { + margin-top: calc(var(--spacing) * 5); + } + .apexcharts-canvas { + & .apexcharts-tooltip { + background-color: white !important; + color: var(--color-gray-700) !important; + border: 0 !important; + border-radius: 0.25rem !important; + box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1) !important; + } + .dark & .apexcharts-tooltip { + background-color: var(--color-gray-700) !important; + color: var(--color-gray-400) !important; + border-color: transparent !important; + box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1) !important; + } + & .apexcharts-tooltip .apexcharts-tooltip-title { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + padding-right: 0.75rem !important; + padding-left: 0.75rem !important; + margin-bottom: 0.75rem !important; + background-color: var(--color-gray-100) !important; + border-bottom-color: var(--color-gray-200) !important; + font-size: 0.875rem !important; + font-weight: 400 !important; + color: var(--color-gray-500) !important; + } + .dark & .apexcharts-tooltip .apexcharts-tooltip-title { + background-color: var(--color-gray-600) !important; + border-color: var(--color-gray-500) !important; + color: var(--color-gray-500) !important; + } + & .apexcharts-xaxistooltip { + color: var(--color-gray-500) !important; + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + padding-right: 0.75rem !important; + padding-left: 0.75rem !important; + border-color: transparent !important; + background-color: white !important; + border-radius: 0.25rem !important; + box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1) !important; + } + .dark & .apexcharts-xaxistooltip { + color: var(--color-gray-400) !important; + background-color: var(--color-gray-700) !important; + } + & .apexcharts-tooltip .apexcharts-tooltip-text-y-label { + color: var(--color-gray-500) !important; + font-size: 0.875rem !important; + } + .dark & .apexcharts-tooltip .apexcharts-tooltip-text-y-label { + color: var(--color-gray-400) !important; + } + & .apexcharts-tooltip .apexcharts-tooltip-text-y-value { + color: var(--color-gray-900); + font-size: 0.875rem !important; + } + .dark & .apexcharts-tooltip .apexcharts-tooltip-text-y-value { + color: white !important; + } + & .apexcharts-xaxistooltip-text { + font-weight: 400 !important; + font-size: 0.875rem !important; + } + & .apexcharts-xaxistooltip:after { + border-bottom-color: white !important; + } + & .apexcharts-xaxistooltip:before { + border-bottom-color: white !important; + } + & .apexcharts-xaxistooltip:after { + border-width: 8px !important; + margin-left: -8px !important; + } + & .apexcharts-xaxistooltip:before { + border-width: 10px !important; + margin-left: -10px !important; + } + .dark & .apexcharts-xaxistooltip:after { + border-bottom-color: var(--color-gray-700) !important; + } + .dark & .apexcharts-xaxistooltip:before { + border-bottom-color: var(--color-gray-700) !important; + } + & .apexcharts-tooltip-series-group.apexcharts-active .apexcharts-tooltip-y-group { + padding: 0 !important; + } + & .apexcharts-tooltip-series-group.apexcharts-active { + padding-left: 0.75rem !important; + padding-right: 0.75rem !important; + padding-bottom: 0.75rem !important; + background-color: white !important; + color: var(--color-gray-500) !important; + } + .dark & .apexcharts-tooltip-series-group.apexcharts-active { + background-color: var(--color-gray-700) !important; + color: var(--color-gray-400) !important; + } + & .apexcharts-tooltip-series-group.apexcharts-active:first-of-type { + padding-top: 0.75rem !important; + } + & .apexcharts-legend { + padding: 0 !important; + } + & .apexcharts-legend-text { + font-size: 0.75rem !important; + font-weight: 500 !important; + padding-left: 1.25rem !important; + color: var(--color-gray-500) !important; + } + :is([dir=rtl]) & .apexcharts-legend-text { + padding-right: 0.5rem !important; + } + & .apexcharts-legend-text:not(.apexcharts-inactive-legend):hover { + color: var(--color-gray-900) !important; + } + .dark & .apexcharts-legend-text { + color: var(--color-gray-400) !important; + } + .dark & .apexcharts-legend-text:not(.apexcharts-inactive-legend):hover { + color: white !important; + } + & .apexcharts-legend-series { + margin-left: 0.5rem !important; + margin-right: 0.5rem !important; + margin-bottom: 0.25rem !important; + display: flex !important; + align-items: center !important; + } + .dark & .apexcharts-datalabels-group .apexcharts-text.apexcharts-datalabel-value { + fill: white !important; + } + & .apexcharts-datalabels-group .apexcharts-text.apexcharts-datalabel-label { + fill: var(--color-gray-500) !important; + font-size: 1rem,[object Object] !important; + font-weight: 400 !important; + } + .dark & .apexcharts-datalabels-group .apexcharts-text.apexcharts-datalabel-label { + fill: var(--color-gray-400) !important; + } + & .apexcharts-datalabels .apexcharts-text.apexcharts-pie-label { + font-size: 0.75rem,[object Object] !important; + font-weight: 600 !important; + text-shadow: none !important; + filter: none !important; + } + } + .apexcharts-legend-series { + .apexcharts-canvas & { + margin-left: 0.5rem !important; + margin-right: 0.5rem !important; + margin-bottom: 0.25rem !important; + display: flex !important; + align-items: center !important; + } + } + .apexcharts-tooltip { + .apexcharts-canvas & { + background-color: white !important; + color: var(--color-gray-700) !important; + border: 0 !important; + border-radius: 0.25rem !important; + box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1) !important; + } + .dark .apexcharts-canvas & { + background-color: var(--color-gray-700) !important; + color: var(--color-gray-400) !important; + border-color: transparent !important; + box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1) !important; + } + .apexcharts-canvas & .apexcharts-tooltip-title { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + padding-right: 0.75rem !important; + padding-left: 0.75rem !important; + margin-bottom: 0.75rem !important; + background-color: var(--color-gray-100) !important; + border-bottom-color: var(--color-gray-200) !important; + font-size: 0.875rem !important; + font-weight: 400 !important; + color: var(--color-gray-500) !important; + } + .dark .apexcharts-canvas & .apexcharts-tooltip-title { + background-color: var(--color-gray-600) !important; + border-color: var(--color-gray-500) !important; + color: var(--color-gray-500) !important; + } + .apexcharts-canvas & .apexcharts-tooltip-text-y-label { + color: var(--color-gray-500) !important; + font-size: 0.875rem !important; + } + .dark .apexcharts-canvas & .apexcharts-tooltip-text-y-label { + color: var(--color-gray-400) !important; + } + .apexcharts-canvas & .apexcharts-tooltip-text-y-value { + color: var(--color-gray-900); + font-size: 0.875rem !important; + } + :is([dir=rtl]) & .apexcharts-tooltip-marker { + margin-right: 0px !important; + margin-left: 0.375rem !important; + } + .dark .apexcharts-canvas & .apexcharts-tooltip-text-y-value { + color: white !important; + } + } + .datatable-top { + .datatable-wrapper & { + display: flex; + justify-content: space-between; + flex-direction: column-reverse; + align-items: start; + gap: 1rem; + margin-bottom: 1rem; + @media (min-width: 640px) { + flex-direction: row-reverse; + align-items: center; + } + } + .datatable-wrapper & .datatable-dropdown { + color: var(--color-gray-500); + font-size: 0.875rem; + } + .dark .datatable-wrapper & .datatable-dropdown { + color: var(--color-gray-400); + } + .datatable-wrapper & .datatable-dropdown .datatable-selector { + background-color: var(--color-gray-50); + color: var(--color-gray-900); + font-size: 0.875rem; + border: 1px solid var(--color-gray-300); + border-radius: 0.5rem; + margin-right: 0.25rem; + min-width: 4rem; + } + .dark .datatable-wrapper & .datatable-dropdown .datatable-selector { + background-color: var(--color-gray-800); + border: 1px solid var(--color-gray-700); + color: white; + } + } + .apexcharts-tooltip-marker { + :is([dir=rtl]) .apexcharts-tooltip & { + margin-right: 0px !important; + margin-left: 0.375rem !important; + } + } + .datatable-dropdown { + .datatable-wrapper .datatable-top & { + color: var(--color-gray-500); + font-size: 0.875rem; + } + .dark .datatable-wrapper .datatable-top & { + color: var(--color-gray-400); + } + .datatable-wrapper .datatable-top & .datatable-selector { + background-color: var(--color-gray-50); + color: var(--color-gray-900); + font-size: 0.875rem; + border: 1px solid var(--color-gray-300); + border-radius: 0.5rem; + margin-right: 0.25rem; + min-width: 4rem; + } + .dark .datatable-wrapper .datatable-top & .datatable-selector { + background-color: var(--color-gray-800); + border: 1px solid var(--color-gray-700); + color: white; + } + } + .datatable-selector { + .datatable-wrapper .datatable-top .datatable-dropdown & { + background-color: var(--color-gray-50); + color: var(--color-gray-900); + font-size: 0.875rem; + border: 1px solid var(--color-gray-300); + border-radius: 0.5rem; + margin-right: 0.25rem; + min-width: 4rem; + } + .dark .datatable-wrapper .datatable-top .datatable-dropdown & { + background-color: var(--color-gray-800); + border: 1px solid var(--color-gray-700); + color: white; + } + } + .apexcharts-tooltip-title { + .apexcharts-canvas .apexcharts-tooltip & { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + padding-right: 0.75rem !important; + padding-left: 0.75rem !important; + margin-bottom: 0.75rem !important; + background-color: var(--color-gray-100) !important; + border-bottom-color: var(--color-gray-200) !important; + font-size: 0.875rem !important; + font-weight: 400 !important; + color: var(--color-gray-500) !important; + } + .dark .apexcharts-canvas .apexcharts-tooltip & { + background-color: var(--color-gray-600) !important; + border-color: var(--color-gray-500) !important; + color: var(--color-gray-500) !important; + } + } + .-mb-px { + margin-bottom: -1px; + } + .mb-1 { + margin-bottom: calc(var(--spacing) * 1); + } + .mb-2 { + margin-bottom: calc(var(--spacing) * 2); + } + .mb-3 { + margin-bottom: calc(var(--spacing) * 3); + } + .mb-4 { + margin-bottom: calc(var(--spacing) * 4); + } + .mb-6 { + margin-bottom: calc(var(--spacing) * 6); + } + .apexcharts-xaxistooltip { + .apexcharts-canvas & { + color: var(--color-gray-500) !important; + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + padding-right: 0.75rem !important; + padding-left: 0.75rem !important; + border-color: transparent !important; + background-color: white !important; + border-radius: 0.25rem !important; + box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1) !important; + } + .dark .apexcharts-canvas & { + color: var(--color-gray-400) !important; + background-color: var(--color-gray-700) !important; + } + .apexcharts-canvas &:after { + border-bottom-color: white !important; + } + .apexcharts-canvas &:before { + border-bottom-color: white !important; + } + .apexcharts-canvas &:after { + border-width: 8px !important; + margin-left: -8px !important; + } + .apexcharts-canvas &:before { + border-width: 10px !important; + margin-left: -10px !important; + } + .dark .apexcharts-canvas &:after { + border-bottom-color: var(--color-gray-700) !important; + } + .dark .apexcharts-canvas &:before { + border-bottom-color: var(--color-gray-700) !important; + } + } + .ml-auto { + margin-left: auto; + } + .datatable-pagination-list { + .datatable-wrapper .datatable-bottom .datatable-pagination & { + display: flex; + align-items: center; + height: 2rem; + font-size: 0.875rem; + } + } + .block { + display: block; + } + .flex { + display: flex; + } + .grid { + display: grid; + } + .hidden { + display: none; + } + .inline { + display: inline; + } + .inline-block { + display: inline-block; + } + .inline-flex { + display: inline-flex; + } + .table { + display: table; + } + .h-2\.5 { + height: calc(var(--spacing) * 2.5); + } + .h-3 { + height: calc(var(--spacing) * 3); + } + .h-4 { + height: calc(var(--spacing) * 4); + } + .h-5 { + height: calc(var(--spacing) * 5); + } + .h-6 { + height: calc(var(--spacing) * 6); + } + .h-8 { + height: calc(var(--spacing) * 8); + } + .h-9 { + height: calc(var(--spacing) * 9); + } + .h-10 { + height: calc(var(--spacing) * 10); + } + .h-\[calc\(100\%-1rem\)\] { + height: calc(100% - 1rem); + } + .max-h-full { + max-height: 100%; + } + .min-h-screen { + min-height: 100vh; + } + .datatable-table { + .datatable-wrapper & { + width: 100%; + font-size: 0.875rem; + color: var(--color-gray-500); + text-align: left; + } + .dark .datatable-wrapper & { + color: var(--color-gray-400); + } + .datatable-wrapper & thead { + font-size: 0.75rem; + color: var(--color-gray-500); + background-color: var(--color-gray-50); + } + .dark .datatable-wrapper & thead { + color: var(--color-gray-400); + background-color: var(--color-gray-800); + } + .datatable-wrapper & thead th { + white-space: nowrap; + } + .datatable-wrapper & thead th { + width: auto !important; + padding-top: 0.75rem; + padding-bottom: 0.75rem; + padding-left: 1.5rem; + padding-right: 1.5rem; + } + .datatable-wrapper & tbody th { + width: auto !important; + padding-top: 0.75rem; + padding-bottom: 0.75rem; + padding-left: 1.5rem; + padding-right: 1.5rem; + } + .datatable-wrapper & tbody td { + width: auto !important; + padding-top: 0.75rem; + padding-bottom: 0.75rem; + padding-left: 1.5rem; + padding-right: 1.5rem; + } + .datatable-wrapper & thead th .datatable-sorter { + text-transform: uppercase; + } + .datatable-wrapper & thead th { + text-transform: uppercase; + } + .datatable-wrapper & thead th .datatable-sorter:hover { + color: var(--color-gray-900); + } + .datatable-wrapper & thead th.datatable-ascending .datatable-sorter { + color: var(--color-gray-900); + } + .datatable-wrapper & thead th.datatable-descending .datatable-sorter { + color: var(--color-gray-900); + } + .dark .datatable-wrapper & thead th .datatable-sorter:hover { + color: white; + } + .dark .datatable-wrapper & thead th.datatable-ascending .datatable-sorter { + color: white; + } + .dark .datatable-wrapper & thead th.datatable-descending .datatable-sorter { + color: white; + } + .datatable-wrapper & tbody tr.selected { + background-color: var(--color-gray-100); + } + .dark .datatable-wrapper & tbody tr.selected { + background-color: var(--color-gray-700); + } + .datatable-wrapper & tbody tr { + border-bottom: 1px solid var(--color-gray-200); + } + .dark .datatable-wrapper & tbody tr { + border-bottom: 1px solid var(--color-gray-700); + } + .datatable-wrapper & .datatable-empty { + text-align: center; + } + } + .w-1 { + width: calc(var(--spacing) * 1); + } + .w-1\/2 { + width: calc(1 / 2 * 100%); + } + .w-1\/8 { + width: calc(1 / 8 * 100%); + } + .w-2\.5 { + width: calc(var(--spacing) * 2.5); + } + .w-3 { + width: calc(var(--spacing) * 3); + } + .w-4 { + width: calc(var(--spacing) * 4); + } + .w-5 { + width: calc(var(--spacing) * 5); + } + .w-8 { + width: calc(var(--spacing) * 8); + } + .w-9 { + width: calc(var(--spacing) * 9); + } + .w-10 { + width: calc(var(--spacing) * 10); + } + .w-32 { + width: calc(var(--spacing) * 32); + } + .w-40 { + width: calc(var(--spacing) * 40); + } + .w-44 { + width: calc(var(--spacing) * 44); + } + .w-56 { + width: calc(var(--spacing) * 56); + } + .w-64 { + width: calc(var(--spacing) * 64); + } + .w-full { + width: 100%; + } + .max-w-2xl { + max-width: var(--container-2xl); + } + .max-w-7xl { + max-width: var(--container-7xl); + } + .max-w-md { + max-width: var(--container-md); + } + .max-w-screen-xl { + max-width: var(--breakpoint-xl); + } + .max-w-xl { + max-width: var(--container-xl); + } + .datatable-input { + .datatable-wrapper .datatable-search & { + color: var(--color-gray-900); + font-size: 0.875rem; + border: 1px solid var(--color-gray-300); + border-radius: 0.5rem; + background-color: var(--color-gray-50); + min-width: 16rem; + } + .datatable-wrapper & { + color: var(--color-gray-900); + font-size: 0.875rem; + border: 1px solid var(--color-gray-300); + border-radius: 0.5rem; + background-color: var(--color-gray-50); + min-width: 16rem; + } + .dark .datatable-wrapper .datatable-search & { + color: white; + background-color: var(--color-gray-800); + border: 1px solid var(--color-gray-700); + } + .dark .datatable-wrapper & { + color: white; + background-color: var(--color-gray-800); + border: 1px solid var(--color-gray-700); + } + .datatable-wrapper thead th & { + background-color: white; + font-weight: 400; + color: var(--color-gray-900); + padding-top: .35rem; + padding-bottom: .35rem; + min-width: 0; + } + .dark .datatable-wrapper thead th & { + background-color: var(--color-gray-700); + border-color: var(--color-gray-600); + color: white; + } + .datatable-wrapper .datatable-search &:focus { + border-color: var(--color-blue-600); + } + } + .datatable-search { + .datatable-wrapper & .datatable-input { + color: var(--color-gray-900); + font-size: 0.875rem; + border: 1px solid var(--color-gray-300); + border-radius: 0.5rem; + background-color: var(--color-gray-50); + min-width: 16rem; + } + .dark .datatable-wrapper & .datatable-input { + color: white; + background-color: var(--color-gray-800); + border: 1px solid var(--color-gray-700); + } + .datatable-wrapper & .datatable-input:focus { + border-color: var(--color-blue-600); + } + } + .min-w-\[95px\] { + min-width: 95px; + } + .flex-1 { + flex: 1; + } + .flex-auto { + flex: auto; + } + .flex-none { + flex: none; + } + .flex-shrink { + flex-shrink: 1; + } + .shrink-0 { + flex-shrink: 0; + } + .-translate-x-full { + --tw-translate-x: -100%; + translate: var(--tw-translate-x) var(--tw-translate-y); + } + .translate-x-0 { + --tw-translate-x: calc(var(--spacing) * 0); + translate: var(--tw-translate-x) var(--tw-translate-y); + } + .translate-x-full { + --tw-translate-x: 100%; + translate: var(--tw-translate-x) var(--tw-translate-y); + } + .-translate-y-full { + --tw-translate-y: -100%; + translate: var(--tw-translate-x) var(--tw-translate-y); + } + .translate-y-full { + --tw-translate-y: 100%; + translate: var(--tw-translate-x) var(--tw-translate-y); + } + .rotate-180 { + rotate: 180deg; + } + .transform { + transform: var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,); + } + .transform-none { + transform: none; + } + .cursor-default { + cursor: default; + } + .cursor-not-allowed { + cursor: not-allowed; + } + .cursor-pointer { + cursor: pointer; + } + .resize { + resize: both; + } + .list-none { + list-style-type: none; + } + .auto-rows-auto { + grid-auto-rows: auto; + } + .grid-cols-4 { + grid-template-columns: repeat(4, minmax(0, 1fr)); + } + .grid-cols-7 { + grid-template-columns: repeat(7, minmax(0, 1fr)); + } + .flex-col { + flex-direction: column; + } + .flex-wrap { + flex-wrap: wrap; + } + .items-center { + align-items: center; + } + .items-end { + align-items: flex-end; + } + .items-start { + align-items: flex-start; + } + .justify-between { + justify-content: space-between; + } + .justify-center { + justify-content: center; + } + .justify-end { + justify-content: flex-end; + } + .justify-start { + justify-content: flex-start; + } + .gap-1 { + gap: calc(var(--spacing) * 1); + } + .gap-2 { + gap: calc(var(--spacing) * 2); + } + .gap-3 { + gap: calc(var(--spacing) * 3); + } + .gap-4 { + gap: calc(var(--spacing) * 4); + } + .gap-6 { + gap: calc(var(--spacing) * 6); + } + .space-y-2 { + :where(& > :not(:last-child)) { + --tw-space-y-reverse: 0; + margin-block-start: calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse)); + margin-block-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse))); + } + } + .space-y-4 { + :where(& > :not(:last-child)) { + --tw-space-y-reverse: 0; + margin-block-start: calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse)); + margin-block-end: calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse))); + } + } + .space-y-5 { + :where(& > :not(:last-child)) { + --tw-space-y-reverse: 0; + margin-block-start: calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse)); + margin-block-end: calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse))); + } + } + .space-y-6 { + :where(& > :not(:last-child)) { + --tw-space-y-reverse: 0; + margin-block-start: calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse)); + margin-block-end: calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse))); + } + } + .space-x-2 { + :where(& > :not(:last-child)) { + --tw-space-x-reverse: 0; + margin-inline-start: calc(calc(var(--spacing) * 2) * var(--tw-space-x-reverse)); + margin-inline-end: calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-x-reverse))); + } + } + .space-x-3 { + :where(& > :not(:last-child)) { + --tw-space-x-reverse: 0; + margin-inline-start: calc(calc(var(--spacing) * 3) * var(--tw-space-x-reverse)); + margin-inline-end: calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-x-reverse))); + } + } + .divide-y { + :where(& > :not(:last-child)) { + --tw-divide-y-reverse: 0; + border-bottom-style: var(--tw-border-style); + border-top-style: var(--tw-border-style); + border-top-width: calc(1px * var(--tw-divide-y-reverse)); + border-bottom-width: calc(1px * calc(1 - var(--tw-divide-y-reverse))); + } + } + .divide-gray-100 { + :where(& > :not(:last-child)) { + border-color: var(--color-gray-100); + } + } + .self-center { + align-self: center; + } + .self-end { + align-self: flex-end; + } + .truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .overflow-hidden { + overflow: hidden; + } + .datatable-container { + .datatable-wrapper & thead tr.search-filtering-row th { + padding-top: 0; + } + .datatable-wrapper & { + overflow-x: auto; + } + } + .overflow-x-auto { + overflow-x: auto; + } + .overflow-x-hidden { + overflow-x: hidden; + } + .overflow-y-auto { + overflow-y: auto; + } + .rounded { + border-radius: 0.25rem; + } + .rounded-full { + border-radius: calc(infinity * 1px); + } + .rounded-lg { + border-radius: var(--radius-lg); + } + .rounded-sm { + border-radius: var(--radius-sm); + } + .rounded-t { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; + } + .rounded-t-lg { + border-top-left-radius: var(--radius-lg); + border-top-right-radius: var(--radius-lg); + } + .rounded-l-lg { + border-top-left-radius: var(--radius-lg); + border-bottom-left-radius: var(--radius-lg); + } + .rounded-r-lg { + border-top-right-radius: var(--radius-lg); + border-bottom-right-radius: var(--radius-lg); + } + .rounded-b { + border-bottom-right-radius: 0.25rem; + border-bottom-left-radius: 0.25rem; + } + .rounded-b-lg { + border-bottom-right-radius: var(--radius-lg); + border-bottom-left-radius: var(--radius-lg); + } + .border { + border-style: var(--tw-border-style); + border-width: 1px; + } + .border-0 { + border-style: var(--tw-border-style); + border-width: 0px; + } + .border-t { + border-top-style: var(--tw-border-style); + border-top-width: 1px; + } + .border-b { + border-bottom-style: var(--tw-border-style); + border-bottom-width: 1px; + } + .border-b-2 { + border-bottom-style: var(--tw-border-style); + border-bottom-width: 2px; + } + .dark { + & .apexcharts-canvas .apexcharts-tooltip { + background-color: var(--color-gray-700) !important; + color: var(--color-gray-400) !important; + border-color: transparent !important; + box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1) !important; + } + & .apexcharts-canvas .apexcharts-tooltip .apexcharts-tooltip-title { + background-color: var(--color-gray-600) !important; + border-color: var(--color-gray-500) !important; + color: var(--color-gray-500) !important; + } + & .apexcharts-canvas .apexcharts-xaxistooltip { + color: var(--color-gray-400) !important; + background-color: var(--color-gray-700) !important; + } + & .apexcharts-canvas .apexcharts-tooltip .apexcharts-tooltip-text-y-label { + color: var(--color-gray-400) !important; + } + & .apexcharts-canvas .apexcharts-tooltip .apexcharts-tooltip-text-y-value { + color: white !important; + } + & .apexcharts-canvas .apexcharts-xaxistooltip:after { + border-bottom-color: var(--color-gray-700) !important; + } + & .apexcharts-canvas .apexcharts-xaxistooltip:before { + border-bottom-color: var(--color-gray-700) !important; + } + & .apexcharts-canvas .apexcharts-tooltip-series-group.apexcharts-active { + background-color: var(--color-gray-700) !important; + color: var(--color-gray-400) !important; + } + & .apexcharts-canvas .apexcharts-legend-text { + color: var(--color-gray-400) !important; + } + & .apexcharts-canvas .apexcharts-legend-text:not(.apexcharts-inactive-legend):hover { + color: white !important; + } + & .apexcharts-canvas .apexcharts-datalabels-group .apexcharts-text.apexcharts-datalabel-value { + fill: white !important; + } + & .apexcharts-canvas .apexcharts-datalabels-group .apexcharts-text.apexcharts-datalabel-label { + fill: var(--color-gray-400) !important; + } + & .apexcharts-gridline { + stroke: var(--color-gray-700) !important; + } + & .apexcharts-xcrosshairs { + stroke: var(--color-gray-700) !important; + } + & .apexcharts-ycrosshairs { + stroke: var(--color-gray-700) !important; + } + } + .dark { + & .datatable-wrapper .datatable-search .datatable-input { + color: white; + background-color: var(--color-gray-800); + border: 1px solid var(--color-gray-700); + } + & .datatable-wrapper .datatable-input { + color: white; + background-color: var(--color-gray-800); + border: 1px solid var(--color-gray-700); + } + & .datatable-wrapper thead th .datatable-input { + background-color: var(--color-gray-700); + border-color: var(--color-gray-600); + color: white; + } + & .datatable-wrapper .datatable-top .datatable-dropdown { + color: var(--color-gray-400); + } + & .datatable-wrapper .datatable-top .datatable-dropdown .datatable-selector { + background-color: var(--color-gray-800); + border: 1px solid var(--color-gray-700); + color: white; + } + & .datatable-wrapper .datatable-table { + color: var(--color-gray-400); + } + & .datatable-wrapper .datatable-table thead { + color: var(--color-gray-400); + background-color: var(--color-gray-800); + } + & .datatable-wrapper .datatable-table thead th .datatable-sorter:hover { + color: white; + } + & .datatable-wrapper .datatable-table thead th.datatable-ascending .datatable-sorter { + color: white; + } + & .datatable-wrapper .datatable-table thead th.datatable-descending .datatable-sorter { + color: white; + } + & .datatable-wrapper .datatable-table tbody tr.selected { + background-color: var(--color-gray-700); + } + & .datatable-wrapper .datatable-table tbody tr { + border-bottom: 1px solid var(--color-gray-700); + } + & .datatable-wrapper .datatable-bottom .datatable-info { + color: var(--color-gray-400); + } + & .datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item-link { + color: var(--color-gray-400); + border-color: var(--color-gray-700); + } + & .datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:first-of-type .datatable-pagination-list-item-link { + color: transparent; + } + & .datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:last-of-type .datatable-pagination-list-item-link { + color: transparent; + } + & .datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:first-of-type .datatable-pagination-list-item-link::after { + content: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='oklch(70.7%25 0.022 261.325)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m14 8-4 4 4 4'/%3e %3c/svg%3e"); + } + & .datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:first-of-type .datatable-pagination-list-item-link:hover::after { + content: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m14 8-4 4 4 4'/%3e %3c/svg%3e"); + } + & .datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:last-of-type .datatable-pagination-list-item-link::after { + content: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='oklch(70.7%25 0.022 261.325)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m10 16 4-4-4-4'/%3e %3c/svg%3e"); + } + & .datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:last-of-type .datatable-pagination-list-item-link:hover::after { + content: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' width='20' height='20' fill='none' viewBox='0 0 24 24'%3e %3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m10 16 4-4-4-4'/%3e %3c/svg%3e"); + } + & .datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item:first-of-type .datatable-pagination-list-item-link { + border-left: 1px solid var(--color-gray-700); + } + & .datatable-wrapper .datatable-bottom .datatable-pagination .datatable-pagination-list-item-link:hover { + background-color: var(--color-gray-700); + color: white; + } + } + .border-black { + border-color: var(--color-black); + } + .border-blue-200 { + border-color: var(--color-blue-200); + } + .border-blue-600 { + border-color: var(--color-blue-600); + } + .border-blue-700 { + border-color: var(--color-blue-700); + } + .border-gray-100 { + border-color: var(--color-gray-100); + } + .border-gray-200 { + border-color: var(--color-gray-200); + } + .border-gray-300 { + border-color: var(--color-gray-300); + } + .border-green-200 { + border-color: var(--color-green-200); + } + .border-red-200 { + border-color: var(--color-red-200); + } + .border-white { + border-color: var(--color-white); + } + .border-yellow-200 { + border-color: var(--color-yellow-200); + } + .apexcharts-active { + .apexcharts-canvas .apexcharts-tooltip-series-group& .apexcharts-tooltip-y-group { + padding: 0 !important; + } + .apexcharts-canvas .apexcharts-tooltip-series-group& { + padding-left: 0.75rem !important; + padding-right: 0.75rem !important; + padding-bottom: 0.75rem !important; + background-color: white !important; + color: var(--color-gray-500) !important; + } + .dark .apexcharts-canvas .apexcharts-tooltip-series-group& { + background-color: var(--color-gray-700) !important; + color: var(--color-gray-400) !important; + } + .apexcharts-canvas .apexcharts-tooltip-series-group&:first-of-type { + padding-top: 0.75rem !important; + } + } + .selected { + .datatable-wrapper .datatable-table tbody tr& { + background-color: var(--color-gray-100); + } + .dark .datatable-wrapper .datatable-table tbody tr& { + background-color: var(--color-gray-700); + } + } + .selectedCell { + background-color: var(--color-gray-50); + .dark & { + background-color: var(--color-gray-700); + } + } + .bg-blue-50 { + background-color: var(--color-blue-50); + } + .bg-blue-100 { + background-color: var(--color-blue-100); + } + .bg-blue-600 { + background-color: var(--color-blue-600); + } + .bg-blue-700 { + background-color: var(--color-blue-700); + } + .bg-gray-50 { + background-color: var(--color-gray-50); + } + .bg-gray-100 { + background-color: var(--color-gray-100); + } + .bg-gray-200 { + background-color: var(--color-gray-200); + } + .bg-gray-800 { + background-color: var(--color-gray-800); + } + .bg-gray-900\/50 { + background-color: color-mix(in srgb, oklch(21% 0.034 264.665) 50%, transparent); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--color-gray-900) 50%, transparent); + } + } + .bg-green-50 { + background-color: var(--color-green-50); + } + .bg-red-50 { + background-color: var(--color-red-50); + } + .bg-red-100 { + background-color: var(--color-red-100); + } + .bg-transparent { + background-color: transparent; + } + .bg-white { + background-color: var(--color-white); + } + .bg-white\/50 { + background-color: color-mix(in srgb, #fff 50%, transparent); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--color-white) 50%, transparent); + } + } + .bg-yellow-50 { + background-color: var(--color-yellow-50); + } + .dark { + & .selectedCell { + background-color: var(--color-gray-700); + } + } + .apexcharts-datalabels-group { + & .apexcharts-text.apexcharts-datalabel-value { + fill: var(--color-gray-900) !important; + font-size: 1.875rem,[object Object] !important; + font-weight: 700 !important; + } + .dark .apexcharts-canvas & .apexcharts-text.apexcharts-datalabel-value { + fill: white !important; + } + .apexcharts-canvas & .apexcharts-text.apexcharts-datalabel-label { + fill: var(--color-gray-500) !important; + font-size: 1rem,[object Object] !important; + font-weight: 400 !important; + } + .dark .apexcharts-canvas & .apexcharts-text.apexcharts-datalabel-label { + fill: var(--color-gray-400) !important; + } + } + .apexcharts-datalabel-label { + .apexcharts-canvas .apexcharts-datalabels-group .apexcharts-text& { + fill: var(--color-gray-500) !important; + font-size: 1rem,[object Object] !important; + font-weight: 400 !important; + } + .dark .apexcharts-canvas .apexcharts-datalabels-group .apexcharts-text& { + fill: var(--color-gray-400) !important; + } + } + .apexcharts-datalabel-value { + .apexcharts-datalabels-group .apexcharts-text& { + fill: var(--color-gray-900) !important; + font-size: 1.875rem,[object Object] !important; + font-weight: 700 !important; + } + .dark .apexcharts-canvas .apexcharts-datalabels-group .apexcharts-text& { + fill: white !important; + } + } + .apexcharts-ycrosshairs { + stroke: var(--color-gray-200) !important; + .dark & { + stroke: var(--color-gray-700) !important; + } + } + .object-cover { + object-fit: cover; + } + .apexcharts-legend { + .apexcharts-canvas & { + padding: 0 !important; + } + } + .apexcharts-tooltip-y-group { + .apexcharts-canvas .apexcharts-tooltip-series-group.apexcharts-active & { + padding: 0 !important; + } + } + .p-1 { + padding: calc(var(--spacing) * 1); + } + .p-1\.5 { + padding: calc(var(--spacing) * 1.5); + } + .p-2 { + padding: calc(var(--spacing) * 2); + } + .p-2\.5 { + padding: calc(var(--spacing) * 2.5); + } + .p-4 { + padding: calc(var(--spacing) * 4); + } + .p-5 { + padding: calc(var(--spacing) * 5); + } + .p-6 { + padding: calc(var(--spacing) * 6); + } + .p-8 { + padding: calc(var(--spacing) * 8); + } + .px-1 { + padding-inline: calc(var(--spacing) * 1); + } + .px-2 { + padding-inline: calc(var(--spacing) * 2); + } + .px-2\.5 { + padding-inline: calc(var(--spacing) * 2.5); + } + .px-3 { + padding-inline: calc(var(--spacing) * 3); + } + .px-4 { + padding-inline: calc(var(--spacing) * 4); + } + .px-5 { + padding-inline: calc(var(--spacing) * 5); + } + .px-6 { + padding-inline: calc(var(--spacing) * 6); + } + .py-0\.5 { + padding-block: calc(var(--spacing) * 0.5); + } + .py-1 { + padding-block: calc(var(--spacing) * 1); + } + .py-2 { + padding-block: calc(var(--spacing) * 2); + } + .py-2\.5 { + padding-block: calc(var(--spacing) * 2.5); + } + .py-3 { + padding-block: calc(var(--spacing) * 3); + } + .py-4 { + padding-block: calc(var(--spacing) * 4); + } + .pt-2 { + padding-top: calc(var(--spacing) * 2); + } + .search-filtering-row { + .datatable-wrapper .datatable-container thead tr& th { + padding-top: 0; + } + } + .apexcharts-legend-text { + .apexcharts-canvas & { + font-size: 0.75rem !important; + font-weight: 500 !important; + padding-left: 1.25rem !important; + color: var(--color-gray-500) !important; + } + :is([dir=rtl]) .apexcharts-canvas & { + padding-right: 0.5rem !important; + } + .apexcharts-canvas &:not(.apexcharts-inactive-legend):hover { + color: var(--color-gray-900) !important; + } + .dark .apexcharts-canvas & { + color: var(--color-gray-400) !important; + } + .dark .apexcharts-canvas &:not(.apexcharts-inactive-legend):hover { + color: white !important; + } + } + .datatable-empty { + .datatable-wrapper .datatable-table & { + text-align: center; + } + } + .text-center { + text-align: center; + } + .text-left { + text-align: left; + } + .text-2xl { + font-size: var(--text-2xl); + line-height: var(--tw-leading, var(--text-2xl--line-height)); + } + .text-3xl { + font-size: var(--text-3xl); + line-height: var(--tw-leading, var(--text-3xl--line-height)); + } + .text-base { + font-size: var(--text-base); + line-height: var(--tw-leading, var(--text-base--line-height)); + } + .text-lg { + font-size: var(--text-lg); + line-height: var(--tw-leading, var(--text-lg--line-height)); + } + .text-sm { + font-size: var(--text-sm); + line-height: var(--tw-leading, var(--text-sm--line-height)); + } + .text-xl { + font-size: var(--text-xl); + line-height: var(--tw-leading, var(--text-xl--line-height)); + } + .text-xs { + font-size: var(--text-xs); + line-height: var(--tw-leading, var(--text-xs--line-height)); + } + .apexcharts-datalabels { + .apexcharts-canvas & .apexcharts-text.apexcharts-pie-label { + font-size: 0.75rem,[object Object] !important; + font-weight: 600 !important; + text-shadow: none !important; + filter: none !important; + } + } + .apexcharts-pie-label { + .apexcharts-canvas .apexcharts-datalabels .apexcharts-text& { + font-size: 0.75rem,[object Object] !important; + font-weight: 600 !important; + text-shadow: none !important; + filter: none !important; + } + } + .apexcharts-xaxistooltip-text { + .apexcharts-canvas & { + font-weight: 400 !important; + font-size: 0.875rem !important; + } + } + .apexcharts-tooltip-text-y-label { + .apexcharts-canvas .apexcharts-tooltip & { + color: var(--color-gray-500) !important; + font-size: 0.875rem !important; + } + .dark .apexcharts-canvas .apexcharts-tooltip & { + color: var(--color-gray-400) !important; + } + } + .apexcharts-tooltip-text-y-value { + .apexcharts-canvas .apexcharts-tooltip & { + color: var(--color-gray-900); + font-size: 0.875rem !important; + } + .dark .apexcharts-canvas .apexcharts-tooltip & { + color: white !important; + } + } + .datatable-info { + .datatable-wrapper .datatable-bottom & { + color: var(--color-gray-500); + font-size: 0.875rem; + } + .dark .datatable-wrapper .datatable-bottom & { + color: var(--color-gray-400); + } + } + .leading-6 { + --tw-leading: calc(var(--spacing) * 6); + line-height: calc(var(--spacing) * 6); + } + .leading-9 { + --tw-leading: calc(var(--spacing) * 9); + line-height: calc(var(--spacing) * 9); + } + .leading-none { + --tw-leading: 1; + line-height: 1; + } + .leading-relaxed { + --tw-leading: var(--leading-relaxed); + line-height: var(--leading-relaxed); + } + .font-bold { + --tw-font-weight: var(--font-weight-bold); + font-weight: var(--font-weight-bold); + } + .font-medium { + --tw-font-weight: var(--font-weight-medium); + font-weight: var(--font-weight-medium); + } + .font-semibold { + --tw-font-weight: var(--font-weight-semibold); + font-weight: var(--font-weight-semibold); + } + .whitespace-nowrap { + white-space: nowrap; + } + .datatable-sorter { + .datatable-wrapper .datatable-table thead th & { + text-transform: uppercase; + } + .datatable-wrapper .datatable-table thead th &:hover { + color: var(--color-gray-900); + } + .datatable-wrapper .datatable-table thead th.datatable-ascending & { + color: var(--color-gray-900); + } + .datatable-wrapper .datatable-table thead th.datatable-descending & { + color: var(--color-gray-900); + } + .dark .datatable-wrapper .datatable-table thead th &:hover { + color: white; + } + .dark .datatable-wrapper .datatable-table thead th.datatable-ascending & { + color: white; + } + .dark .datatable-wrapper .datatable-table thead th.datatable-descending & { + color: white; + } + } + .datatable-ascending { + .datatable-wrapper .datatable-table thead th& .datatable-sorter { + color: var(--color-gray-900); + } + .dark .datatable-wrapper .datatable-table thead th& .datatable-sorter { + color: white; + } + } + .datatable-descending { + .datatable-wrapper .datatable-table thead th& .datatable-sorter { + color: var(--color-gray-900); + } + .dark .datatable-wrapper .datatable-table thead th& .datatable-sorter { + color: white; + } + } + .text-blue-600 { + color: var(--color-blue-600); + } + .text-blue-700 { + color: var(--color-blue-700); + } + .text-blue-800 { + color: var(--color-blue-800); + } + .text-blue-900 { + color: var(--color-blue-900); + } + .text-gray-400 { + color: var(--color-gray-400); + } + .text-gray-500 { + color: var(--color-gray-500); + } + .text-gray-600 { + color: var(--color-gray-600); + } + .text-gray-700 { + color: var(--color-gray-700); + } + .text-gray-800 { + color: var(--color-gray-800); + } + .text-gray-900 { + color: var(--color-gray-900); + } + .text-green-800 { + color: var(--color-green-800); + } + .text-red-700 { + color: var(--color-red-700); + } + .text-red-800 { + color: var(--color-red-800); + } + .text-white { + color: var(--color-white); + } + .text-yellow-800 { + color: var(--color-yellow-800); + } + .uppercase { + text-transform: uppercase; + } + .antialiased { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + } + .opacity-0 { + opacity: 0%; + } + .opacity-100 { + opacity: 100%; + } + .shadow-lg { + --tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1)); + box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); + } + .shadow-sm { + --tw-shadow: 0 1px 3px 0 var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 1px 2px -1px var(--tw-shadow-color, rgb(0 0 0 / 0.1)); + box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); + } + .outline { + outline-style: var(--tw-outline-style); + outline-width: 1px; + } + .blur { + --tw-blur: blur(8px); + 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,); + } + .filter { + filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,); + } + .transition { + transition-property: color, background-color, border-color, outline-color, text-decoration-color, fill, stroke, --tw-gradient-from, --tw-gradient-via, --tw-gradient-to, opacity, box-shadow, transform, translate, scale, rotate, filter, -webkit-backdrop-filter, backdrop-filter, display, content-visibility, overlay, pointer-events; + transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); + transition-duration: var(--tw-duration, var(--default-transition-duration)); + } + .transition-opacity { + transition-property: opacity; + transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); + transition-duration: var(--tw-duration, var(--default-transition-duration)); + } + .transition-transform { + transition-property: transform, translate, scale, rotate; + transition-timing-function: var(--tw-ease, var(--default-transition-timing-function)); + transition-duration: var(--tw-duration, var(--default-transition-duration)); + } + .ease-out { + --tw-ease: var(--ease-out); + transition-timing-function: var(--ease-out); + } + .hover\:border-gray-300 { + &:hover { + @media (hover: hover) { + border-color: var(--color-gray-300); + } + } + } + .hover\:bg-blue-800 { + &:hover { + @media (hover: hover) { + background-color: var(--color-blue-800); + } + } + } + .hover\:bg-gray-50 { + &:hover { + @media (hover: hover) { + background-color: var(--color-gray-50); + } + } + } + .hover\:bg-gray-100 { + &:hover { + @media (hover: hover) { + background-color: var(--color-gray-100); + } + } + } + .hover\:bg-gray-200 { + &:hover { + @media (hover: hover) { + background-color: var(--color-gray-200); + } + } + } + .hover\:bg-red-50 { + &:hover { + @media (hover: hover) { + background-color: var(--color-red-50); + } + } + } + .hover\:bg-white { + &:hover { + @media (hover: hover) { + background-color: var(--color-white); + } + } + } + .hover\:text-blue-600 { + &:hover { + @media (hover: hover) { + color: var(--color-blue-600); + } + } + } + .hover\:text-blue-700 { + &:hover { + @media (hover: hover) { + color: var(--color-blue-700); + } + } + } + .hover\:text-gray-600 { + &:hover { + @media (hover: hover) { + color: var(--color-gray-600); + } + } + } + .hover\:text-gray-900 { + &:hover { + @media (hover: hover) { + color: var(--color-gray-900); + } + } + } + .hover\:underline { + &:hover { + @media (hover: hover) { + text-decoration-line: underline; + } + } + } + .focus\:z-10 { + &:focus { + z-index: 10; + } + } + .focus\:border-blue-500 { + &:focus { + border-color: var(--color-blue-500); + } + } + .focus\:ring-2 { + &:focus { + --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor); + box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); + } + } + .focus\:ring-4 { + &:focus { + --tw-ring-shadow: var(--tw-ring-inset,) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor); + box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); + } + } + .focus\:ring-blue-300 { + &:focus { + --tw-ring-color: var(--color-blue-300); + } + } + .focus\:ring-blue-500 { + &:focus { + --tw-ring-color: var(--color-blue-500); + } + } + .focus\:ring-gray-200 { + &:focus { + --tw-ring-color: var(--color-gray-200); + } + } + .focus\:ring-gray-300 { + &:focus { + --tw-ring-color: var(--color-gray-300); + } + } + .focus\:outline-none { + &:focus { + --tw-outline-style: none; + outline-style: none; + } + } + .disabled\:cursor-not-allowed { + &:disabled { + cursor: not-allowed; + } + } + .disabled\:opacity-50 { + &:disabled { + opacity: 50%; + } + } + .sm\:col-span-2 { + @media (width >= 40rem) { + grid-column: span 2 / span 2; + } + } + .sm\:grid-cols-2 { + @media (width >= 40rem) { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + } + .md\:inset-0 { + @media (width >= 48rem) { + inset: calc(var(--spacing) * 0); + } + } + .md\:order-1 { + @media (width >= 48rem) { + order: 1; + } + } + .md\:col-span-2 { + @media (width >= 48rem) { + grid-column: span 2 / span 2; + } + } + .md\:col-span-3 { + @media (width >= 48rem) { + grid-column: span 3 / span 3; + } + } + .md\:col-span-4 { + @media (width >= 48rem) { + grid-column: span 4 / span 4; + } + } + .md\:ms-4 { + @media (width >= 48rem) { + margin-inline-start: calc(var(--spacing) * 4); + } + } + .md\:mt-0 { + @media (width >= 48rem) { + margin-top: calc(var(--spacing) * 0); + } + } + .md\:block { + @media (width >= 48rem) { + display: block; + } + } + .md\:flex { + @media (width >= 48rem) { + display: flex; + } + } + .md\:hidden { + @media (width >= 48rem) { + display: none; + } + } + .md\:w-auto { + @media (width >= 48rem) { + width: auto; + } + } + .md\:grid-cols-3 { + @media (width >= 48rem) { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + } + .md\:grid-cols-4 { + @media (width >= 48rem) { + grid-template-columns: repeat(4, minmax(0, 1fr)); + } + } + .md\:flex-row { + @media (width >= 48rem) { + flex-direction: row; + } + } + .md\:items-center { + @media (width >= 48rem) { + align-items: center; + } + } + .md\:gap-1 { + @media (width >= 48rem) { + gap: calc(var(--spacing) * 1); + } + } + .md\:space-x-8 { + @media (width >= 48rem) { + :where(& > :not(:last-child)) { + --tw-space-x-reverse: 0; + margin-inline-start: calc(calc(var(--spacing) * 8) * var(--tw-space-x-reverse)); + margin-inline-end: calc(calc(var(--spacing) * 8) * calc(1 - var(--tw-space-x-reverse))); + } + } + } + .md\:border-0 { + @media (width >= 48rem) { + border-style: var(--tw-border-style); + border-width: 0px; + } + } + .md\:bg-transparent { + @media (width >= 48rem) { + background-color: transparent; + } + } + .md\:bg-white { + @media (width >= 48rem) { + background-color: var(--color-white); + } + } + .md\:p-0 { + @media (width >= 48rem) { + padding: calc(var(--spacing) * 0); + } + } + .md\:p-4 { + @media (width >= 48rem) { + padding: calc(var(--spacing) * 4); + } + } + .md\:p-5 { + @media (width >= 48rem) { + padding: calc(var(--spacing) * 5); + } + } + .md\:p-8 { + @media (width >= 48rem) { + padding: calc(var(--spacing) * 8); + } + } + .md\:text-blue-700 { + @media (width >= 48rem) { + color: var(--color-blue-700); + } + } + .md\:hover\:bg-transparent { + @media (width >= 48rem) { + &:hover { + @media (hover: hover) { + background-color: transparent; + } + } + } + } + .md\:hover\:text-blue-700 { + @media (width >= 48rem) { + &:hover { + @media (hover: hover) { + color: var(--color-blue-700); + } + } + } + } + .lg\:grid-cols-3 { + @media (width >= 64rem) { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + } + .rtl\:rotate-180 { + &:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) { + rotate: 180deg; + } + } + .rtl\:space-x-reverse { + &:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) { + :where(& > :not(:last-child)) { + --tw-space-x-reverse: 1; + } + } + } + .rtl\:text-right { + &:where(:dir(rtl), [dir="rtl"], [dir="rtl"] *) { + text-align: right; + } + } + .dark\:divide-gray-600 { + &:is(.dark *) { + :where(& > :not(:last-child)) { + border-color: var(--color-gray-600); + } + } + } + .dark\:divide-gray-700 { + &:is(.dark *) { + :where(& > :not(:last-child)) { + border-color: var(--color-gray-700); + } + } + } + .dark\:border-blue-500 { + &:is(.dark *) { + border-color: var(--color-blue-500); + } + } + .dark\:border-blue-800 { + &:is(.dark *) { + border-color: var(--color-blue-800); + } + } + .dark\:border-gray-500 { + &:is(.dark *) { + border-color: var(--color-gray-500); + } + } + .dark\:border-gray-600 { + &:is(.dark *) { + border-color: var(--color-gray-600); + } + } + .dark\:border-gray-700 { + &:is(.dark *) { + border-color: var(--color-gray-700); + } + } + .dark\:border-green-800 { + &:is(.dark *) { + border-color: var(--color-green-800); + } + } + .dark\:border-red-800 { + &:is(.dark *) { + border-color: var(--color-red-800); + } + } + .dark\:border-transparent { + &:is(.dark *) { + border-color: transparent; + } + } + .dark\:border-yellow-700 { + &:is(.dark *) { + border-color: var(--color-yellow-700); + } + } + .dark\:bg-blue-600 { + &:is(.dark *) { + background-color: var(--color-blue-600); + } + } + .dark\:bg-blue-900 { + &:is(.dark *) { + background-color: var(--color-blue-900); + } + } + .dark\:bg-blue-900\/30 { + &:is(.dark *) { + background-color: color-mix(in srgb, oklch(37.9% 0.146 265.522) 30%, transparent); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--color-blue-900) 30%, transparent); + } + } + } + .dark\:bg-gray-600 { + &:is(.dark *) { + background-color: var(--color-gray-600); + } + } + .dark\:bg-gray-700 { + &:is(.dark *) { + background-color: var(--color-gray-700); + } + } + .dark\:bg-gray-800 { + &:is(.dark *) { + background-color: var(--color-gray-800); + } + } + .dark\:bg-gray-800\/50 { + &:is(.dark *) { + background-color: color-mix(in srgb, oklch(27.8% 0.033 256.848) 50%, transparent); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--color-gray-800) 50%, transparent); + } + } + } + .dark\:bg-gray-900 { + &:is(.dark *) { + background-color: var(--color-gray-900); + } + } + .dark\:bg-gray-900\/80 { + &:is(.dark *) { + background-color: color-mix(in srgb, oklch(21% 0.034 264.665) 80%, transparent); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--color-gray-900) 80%, transparent); + } + } + } + .dark\:bg-green-900\/40 { + &:is(.dark *) { + background-color: color-mix(in srgb, oklch(39.3% 0.095 152.535) 40%, transparent); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--color-green-900) 40%, transparent); + } + } + } + .dark\:bg-red-900\/40 { + &:is(.dark *) { + background-color: color-mix(in srgb, oklch(39.6% 0.141 25.723) 40%, transparent); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--color-red-900) 40%, transparent); + } + } + } + .dark\:bg-yellow-900\/30 { + &:is(.dark *) { + background-color: color-mix(in srgb, oklch(42.1% 0.095 57.708) 30%, transparent); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--color-yellow-900) 30%, transparent); + } + } + } + .dark\:text-blue-100 { + &:is(.dark *) { + color: var(--color-blue-100); + } + } + .dark\:text-blue-200 { + &:is(.dark *) { + color: var(--color-blue-200); + } + } + .dark\:text-blue-300 { + &:is(.dark *) { + color: var(--color-blue-300); + } + } + .dark\:text-blue-400 { + &:is(.dark *) { + color: var(--color-blue-400); + } + } + .dark\:text-blue-500 { + &:is(.dark *) { + color: var(--color-blue-500); + } + } + .dark\:text-gray-100 { + &:is(.dark *) { + color: var(--color-gray-100); + } + } + .dark\:text-gray-200 { + &:is(.dark *) { + color: var(--color-gray-200); + } + } + .dark\:text-gray-300 { + &:is(.dark *) { + color: var(--color-gray-300); + } + } + .dark\:text-gray-400 { + &:is(.dark *) { + color: var(--color-gray-400); + } + } + .dark\:text-gray-500 { + &:is(.dark *) { + color: var(--color-gray-500); + } + } + .dark\:text-green-300 { + &:is(.dark *) { + color: var(--color-green-300); + } + } + .dark\:text-red-300 { + &:is(.dark *) { + color: var(--color-red-300); + } + } + .dark\:text-white { + &:is(.dark *) { + color: var(--color-white); + } + } + .dark\:text-yellow-300 { + &:is(.dark *) { + color: var(--color-yellow-300); + } + } + .dark\:placeholder-gray-400 { + &:is(.dark *) { + &::placeholder { + color: var(--color-gray-400); + } + } + } + .dark\:outline { + &:is(.dark *) { + outline-style: var(--tw-outline-style); + outline-width: 1px; + } + } + .dark\:hover\:bg-blue-700 { + &:is(.dark *) { + &:hover { + @media (hover: hover) { + background-color: var(--color-blue-700); + } + } + } + } + .dark\:hover\:bg-gray-600 { + &:is(.dark *) { + &:hover { + @media (hover: hover) { + background-color: var(--color-gray-600); + } + } + } + } + .dark\:hover\:bg-gray-700 { + &:is(.dark *) { + &:hover { + @media (hover: hover) { + background-color: var(--color-gray-700); + } + } + } + } + .dark\:hover\:bg-gray-700\/60 { + &:is(.dark *) { + &:hover { + @media (hover: hover) { + background-color: color-mix(in srgb, oklch(37.3% 0.034 259.733) 60%, transparent); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--color-gray-700) 60%, transparent); + } + } + } + } + } + .dark\:hover\:bg-gray-800 { + &:is(.dark *) { + &:hover { + @media (hover: hover) { + background-color: var(--color-gray-800); + } + } + } + } + .dark\:hover\:bg-red-900\/40 { + &:is(.dark *) { + &:hover { + @media (hover: hover) { + background-color: color-mix(in srgb, oklch(39.6% 0.141 25.723) 40%, transparent); + @supports (color: color-mix(in lab, red, red)) { + background-color: color-mix(in oklab, var(--color-red-900) 40%, transparent); + } + } + } + } + } + .dark\:hover\:text-blue-500 { + &:is(.dark *) { + &:hover { + @media (hover: hover) { + color: var(--color-blue-500); + } + } + } + } + .dark\:hover\:text-gray-300 { + &:is(.dark *) { + &:hover { + @media (hover: hover) { + color: var(--color-gray-300); + } + } + } + } + .dark\:hover\:text-white { + &:is(.dark *) { + &:hover { + @media (hover: hover) { + color: var(--color-white); + } + } + } + } + .dark\:focus\:ring-blue-800 { + &:is(.dark *) { + &:focus { + --tw-ring-color: var(--color-blue-800); + } + } + } + .dark\:focus\:ring-gray-600 { + &:is(.dark *) { + &:focus { + --tw-ring-color: var(--color-gray-600); + } + } + } + .dark\:focus\:ring-gray-700 { + &:is(.dark *) { + &:focus { + --tw-ring-color: var(--color-gray-700); + } + } + } + .md\:dark\:bg-gray-900 { + @media (width >= 48rem) { + &:is(.dark *) { + background-color: var(--color-gray-900); + } + } + } + .md\:dark\:bg-transparent { + @media (width >= 48rem) { + &:is(.dark *) { + background-color: transparent; + } + } + } + .md\:dark\:hover\:bg-transparent { + @media (width >= 48rem) { + &:is(.dark *) { + &:hover { + @media (hover: hover) { + background-color: transparent; + } + } + } + } + } +} +@layer utilities { + .flag-lang { + width: 32px; + height: 22px; + } + .flag-lang-ch { + width: 22px; + height: 22px; + } +} +@layer base { + .tooltip-arrow,.tooltip-arrow:before { + position: absolute; + width: 8px; + height: 8px; + background: inherit; + } + .tooltip-arrow { + visibility: hidden; + } + .tooltip-arrow:before { + content: ""; + visibility: visible; + transform: rotate(45deg); + } + [data-tooltip-style^='light'] + .tooltip > .tooltip-arrow:before { + border-style: solid; + border-color: var(--color-gray-200); + } + [data-tooltip-style^='light'] + .tooltip[data-popper-placement^='top'] > .tooltip-arrow:before { + border-bottom-width: 1px; + border-right-width: 1px; + } + [data-tooltip-style^='light'] + .tooltip[data-popper-placement^='right'] > .tooltip-arrow:before { + border-bottom-width: 1px; + border-left-width: 1px; + } + [data-tooltip-style^='light'] + .tooltip[data-popper-placement^='bottom'] > .tooltip-arrow:before { + border-top-width: 1px; + border-left-width: 1px; + } + [data-tooltip-style^='light'] + .tooltip[data-popper-placement^='left'] > .tooltip-arrow:before { + border-top-width: 1px; + border-right-width: 1px; + } + .tooltip[data-popper-placement^='top'] > .tooltip-arrow { + bottom: -4px; + } + .tooltip[data-popper-placement^='bottom'] > .tooltip-arrow { + top: -4px; + } + .tooltip[data-popper-placement^='left'] > .tooltip-arrow { + right: -4px; + } + .tooltip[data-popper-placement^='right'] > .tooltip-arrow { + left: -4px; + } + .tooltip.invisible > .tooltip-arrow:before { + visibility: hidden; + } + [data-popper-arrow],[data-popper-arrow]:before { + position: absolute; + width: 8px; + height: 8px; + background: inherit; + } + [data-popper-arrow] { + visibility: hidden; + } + [data-popper-arrow]:before { + content: ""; + visibility: visible; + transform: rotate(45deg); + } + [data-popper-arrow]:after { + content: ""; + visibility: visible; + transform: rotate(45deg); + position: absolute; + width: 9px; + height: 9px; + background: inherit; + } + [role="tooltip"] > [data-popper-arrow]:before { + border-style: solid; + border-color: var(--color-gray-200); + } + .dark [role="tooltip"] > [data-popper-arrow]:before { + border-style: solid; + border-color: var(--color-gray-600); + } + [role="tooltip"] > [data-popper-arrow]:after { + border-style: solid; + border-color: var(--color-gray-200); + } + .dark [role="tooltip"] > [data-popper-arrow]:after { + border-style: solid; + border-color: var(--color-gray-600); + } + [data-popover][role="tooltip"][data-popper-placement^='top'] > [data-popper-arrow]:before { + border-bottom-width: 1px; + border-right-width: 1px; + } + [data-popover][role="tooltip"][data-popper-placement^='top'] > [data-popper-arrow]:after { + border-bottom-width: 1px; + border-right-width: 1px; + } + [data-popover][role="tooltip"][data-popper-placement^='right'] > [data-popper-arrow]:before { + border-bottom-width: 1px; + border-left-width: 1px; + } + [data-popover][role="tooltip"][data-popper-placement^='right'] > [data-popper-arrow]:after { + border-bottom-width: 1px; + border-left-width: 1px; + } + [data-popover][role="tooltip"][data-popper-placement^='bottom'] > [data-popper-arrow]:before { + border-top-width: 1px; + border-left-width: 1px; + } + [data-popover][role="tooltip"][data-popper-placement^='bottom'] > [data-popper-arrow]:after { + border-top-width: 1px; + border-left-width: 1px; + } + [data-popover][role="tooltip"][data-popper-placement^='left'] > [data-popper-arrow]:before { + border-top-width: 1px; + border-right-width: 1px; + } + [data-popover][role="tooltip"][data-popper-placement^='left'] > [data-popper-arrow]:after { + border-top-width: 1px; + border-right-width: 1px; + } + [data-popover][role="tooltip"][data-popper-placement^='top'] > [data-popper-arrow] { + bottom: -5px; + } + [data-popover][role="tooltip"][data-popper-placement^='bottom'] > [data-popper-arrow] { + top: -5px; + } + [data-popover][role="tooltip"][data-popper-placement^='left'] > [data-popper-arrow] { + right: -5px; + } + [data-popover][role="tooltip"][data-popper-placement^='right'] > [data-popper-arrow] { + left: -5px; + } + [role="tooltip"].invisible > [data-popper-arrow]:before { + visibility: hidden; + } + [role="tooltip"].invisible > [data-popper-arrow]:after { + visibility: hidden; + } +} +@layer base { + [type='text'],[type='email'],[type='url'],[type='password'],[type='number'],[type='date'],[type='datetime-local'],[type='month'],[type='search'],[type='tel'],[type='time'],[type='week'],[multiple],textarea,select { + appearance: none; + background-color: #fff; + border-color: var(--color-gray-500); + border-width: 1px; + border-radius: 0px; + padding-top: 0.5rem; + padding-right: 0.75rem; + padding-bottom: 0.5rem; + padding-left: 0.75rem; + font-size: 1rem; + line-height: 1.5rem; + --tw-shadow: 0 0 #0000; + &:focus { + outline: 2px solid transparent; + outline-offset: 2px; + --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/); + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: var(--color-blue-600); + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow); + border-color: var(--color-blue-600); + } + } + input::placeholder,textarea::placeholder { + color: var(--color-gray-500); + opacity: 1; + } + ::-webkit-datetime-edit-fields-wrapper { + padding: 0; + } + input[type="time"]::-webkit-calendar-picker-indicator { + background: none; + } + select:not([size]) { + background-image: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 10 6'%3e %3cpath stroke='oklch(55.1%25 0.027 264.364)' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m1 1 4 4 4-4'/%3e %3c/svg%3e"); + background-position: right 0.75rem center; + background-repeat: no-repeat; + background-size: 0.75em 0.75em; + padding-right: 2.5rem; + print-color-adjust: exact; + } + :is([dir=rtl]) select:not([size]) { + background-position: left 0.75rem center; + padding-right: 0.75rem; + padding-left: 0; + } + [multiple] { + background-image: initial; + background-position: initial; + background-repeat: unset; + background-size: initial; + padding-right: 0.75rem; + print-color-adjust: unset; + } + [type='checkbox'],[type='radio'] { + appearance: none; + padding: 0; + print-color-adjust: exact; + display: inline-block; + vertical-align: middle; + background-origin: border-box; + user-select: none; + flex-shrink: 0; + height: 1rem; + width: 1rem; + color: var(--color-blue-600); + background-color: #fff; + border-color: --color-gray-500; + border-width: 1px; + --tw-shadow: 0 0 #0000; + } + [type='checkbox'] { + border-radius: 0px; + } + [type='radio'] { + border-radius: 100%; + } + [type='checkbox']:focus,[type='radio']:focus { + outline: 2px solid transparent; + outline-offset: 2px; + --tw-ring-inset: var(--tw-empty,/*!*/ /*!*/); + --tw-ring-offset-width: 2px; + --tw-ring-offset-color: #fff; + --tw-ring-color: var(--color-blue-600); + --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); + } + [type='checkbox']:checked,[type='radio']:checked,.dark [type='checkbox']:checked,.dark [type='radio']:checked { + border-color: transparent !important; + background-color: currentColor !important; + background-size: 0.55em 0.55em; + background-position: center; + background-repeat: no-repeat; + } + [type='checkbox']:checked { + background-image: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 12'%3e %3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M1 5.917 5.724 10.5 15 1.5'/%3e %3c/svg%3e"); + background-repeat: no-repeat; + background-size: 0.55em 0.55em; + print-color-adjust: exact; + } + [type='radio']:checked { + background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e"); + background-size: 1em 1em; + } + .dark [type='radio']:checked { + background-image: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e"); + background-size: 1em 1em; + } + [type='checkbox']:indeterminate { + background-image: url("data:image/svg+xml,%3csvg aria-hidden='true' xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 12'%3e %3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M0.5 6h14'/%3e %3c/svg%3e"); + background-color: currentColor !important; + border-color: transparent !important; + background-position: center; + background-repeat: no-repeat; + background-size: 0.55em 0.55em; + print-color-adjust: exact; + } + [type='checkbox']:indeterminate:hover,[type='checkbox']:indeterminate:focus { + border-color: transparent !important; + background-color: currentColor !important; + } + [type='file'] { + background: unset; + border-color: inherit; + border-width: 0; + border-radius: 0; + padding: 0; + font-size: unset; + line-height: inherit; + } + [type='file']:focus { + outline: 1px auto inherit; + } + input[type=file]::file-selector-button { + color: white; + background: var(--color-gray-800); + border: 0; + font-weight: 500; + font-size: 0.875rem; + cursor: pointer; + padding-top: 0.625rem; + padding-bottom: 0.625rem; + padding-left: 2rem; + padding-right: 1rem; + margin-inline-start: -1rem; + margin-inline-end: 1rem; + &:hover { + background: var(--color-gray-700); + } + } + :is([dir=rtl]) input[type=file]::file-selector-button { + padding-right: 2rem; + padding-left: 1rem; + } + .dark input[type=file]::file-selector-button { + color: white; + background: var(--color-gray-600); + &:hover { + background: var(--color-gray-500); + } + } + input[type="range"]::-webkit-slider-thumb { + height: 1.25rem; + width: 1.25rem; + background: var(--color-blue-600); + border-radius: 9999px; + border: 0; + appearance: none; + -moz-appearance: none; + -webkit-appearance: none; + cursor: pointer; + } + input[type="range"]:disabled::-webkit-slider-thumb { + background: var(--color-gray-400); + } + .dark input[type="range"]:disabled::-webkit-slider-thumb { + background: var(--color-gray-500); + } + input[type="range"]:focus::-webkit-slider-thumb { + outline: 2px solid transparent; + outline-offset: 2px; + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(4px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); + --tw-ring-opacity: 1; + --tw-ring-color: rgb(164 202 254 / var(--tw-ring-opacity)); + } + input[type="range"]::-moz-range-thumb { + height: 1.25rem; + width: 1.25rem; + background: var(--color-blue-600); + border-radius: 9999px; + border: 0; + appearance: none; + -moz-appearance: none; + -webkit-appearance: none; + cursor: pointer; + } + input[type="range"]:disabled::-moz-range-thumb { + background: var(--color-gray-400); + } + .dark input[type="range"]:disabled::-moz-range-thumb { + background: var(--color-gray-500); + } + input[type="range"]::-moz-range-progress { + background: var(--color-blue-500); + } + input[type="range"]::-ms-fill-lower { + background: var(--color-blue-500); + } + input[type="range"].range-sm::-webkit-slider-thumb { + height: 1rem; + width: 1rem; + } + input[type="range"].range-lg::-webkit-slider-thumb { + height: 1.5rem; + width: 1.5rem; + } + input[type="range"].range-sm::-moz-range-thumb { + height: 1rem; + width: 1rem; + } + input[type="range"].range-lg::-moz-range-thumb { + height: 1.5rem; + width: 1.5rem; + } + .toggle-bg:after { + content: ""; + position: absolute; + top: 0.125rem; + left: 0.125rem; + background: white; + border-color: var(--color-gray-300); + border-width: 1px; + border-radius: 9999px; + height: 1.25rem; + width: 1.25rem; + transition-property: background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter; + transition-duration: .15s; + box-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color); + } + input:checked + .toggle-bg:after { + transform: translateX(100%);; + border-color: white; + } + input:checked + .toggle-bg { + background: var(--color-blue-600); + border-color: var(--color-blue-600); + } +} +@property --tw-translate-x { + syntax: "*"; + inherits: false; + initial-value: 0; +} +@property --tw-translate-y { + syntax: "*"; + inherits: false; + initial-value: 0; +} +@property --tw-translate-z { + syntax: "*"; + inherits: false; + initial-value: 0; +} +@property --tw-rotate-x { + syntax: "*"; + inherits: false; +} +@property --tw-rotate-y { + syntax: "*"; + inherits: false; +} +@property --tw-rotate-z { + syntax: "*"; + inherits: false; +} +@property --tw-skew-x { + syntax: "*"; + inherits: false; +} +@property --tw-skew-y { + syntax: "*"; + inherits: false; +} +@property --tw-space-y-reverse { + syntax: "*"; + inherits: false; + initial-value: 0; +} +@property --tw-space-x-reverse { + syntax: "*"; + inherits: false; + initial-value: 0; +} +@property --tw-divide-y-reverse { + syntax: "*"; + inherits: false; + initial-value: 0; +} +@property --tw-border-style { + syntax: "*"; + inherits: false; + initial-value: solid; +} +@property --tw-leading { + syntax: "*"; + inherits: false; +} +@property --tw-font-weight { + syntax: "*"; + inherits: false; +} +@property --tw-shadow { + syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; +} +@property --tw-shadow-color { + syntax: "*"; + inherits: false; +} +@property --tw-shadow-alpha { + syntax: ""; + inherits: false; + initial-value: 100%; +} +@property --tw-inset-shadow { + syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; +} +@property --tw-inset-shadow-color { + syntax: "*"; + inherits: false; +} +@property --tw-inset-shadow-alpha { + syntax: ""; + inherits: false; + initial-value: 100%; +} +@property --tw-ring-color { + syntax: "*"; + inherits: false; +} +@property --tw-ring-shadow { + syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; +} +@property --tw-inset-ring-color { + syntax: "*"; + inherits: false; +} +@property --tw-inset-ring-shadow { + syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; +} +@property --tw-ring-inset { + syntax: "*"; + inherits: false; +} +@property --tw-ring-offset-width { + syntax: ""; + inherits: false; + initial-value: 0px; +} +@property --tw-ring-offset-color { + syntax: "*"; + inherits: false; + initial-value: #fff; +} +@property --tw-ring-offset-shadow { + syntax: "*"; + inherits: false; + initial-value: 0 0 #0000; +} +@property --tw-outline-style { + syntax: "*"; + inherits: false; + initial-value: solid; +} +@property --tw-blur { + syntax: "*"; + inherits: false; +} +@property --tw-brightness { + syntax: "*"; + inherits: false; +} +@property --tw-contrast { + syntax: "*"; + inherits: false; +} +@property --tw-grayscale { + syntax: "*"; + inherits: false; +} +@property --tw-hue-rotate { + syntax: "*"; + inherits: false; +} +@property --tw-invert { + syntax: "*"; + inherits: false; +} +@property --tw-opacity { + syntax: "*"; + inherits: false; +} +@property --tw-saturate { + syntax: "*"; + inherits: false; +} +@property --tw-sepia { + syntax: "*"; + inherits: false; +} +@property --tw-drop-shadow { + syntax: "*"; + inherits: false; +} +@property --tw-drop-shadow-color { + syntax: "*"; + inherits: false; +} +@property --tw-drop-shadow-alpha { + syntax: ""; + inherits: false; + initial-value: 100%; +} +@property --tw-drop-shadow-size { + syntax: "*"; + inherits: false; +} +@property --tw-ease { + syntax: "*"; + inherits: false; +} +@layer properties { + @supports ((-webkit-hyphens: none) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color:rgb(from red r g b)))) { + *, ::before, ::after, ::backdrop { + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-translate-z: 0; + --tw-rotate-x: initial; + --tw-rotate-y: initial; + --tw-rotate-z: initial; + --tw-skew-x: initial; + --tw-skew-y: initial; + --tw-space-y-reverse: 0; + --tw-space-x-reverse: 0; + --tw-divide-y-reverse: 0; + --tw-border-style: solid; + --tw-leading: initial; + --tw-font-weight: initial; + --tw-shadow: 0 0 #0000; + --tw-shadow-color: initial; + --tw-shadow-alpha: 100%; + --tw-inset-shadow: 0 0 #0000; + --tw-inset-shadow-color: initial; + --tw-inset-shadow-alpha: 100%; + --tw-ring-color: initial; + --tw-ring-shadow: 0 0 #0000; + --tw-inset-ring-color: initial; + --tw-inset-ring-shadow: 0 0 #0000; + --tw-ring-inset: initial; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-offset-shadow: 0 0 #0000; + --tw-outline-style: solid; + --tw-blur: initial; + --tw-brightness: initial; + --tw-contrast: initial; + --tw-grayscale: initial; + --tw-hue-rotate: initial; + --tw-invert: initial; + --tw-opacity: initial; + --tw-saturate: initial; + --tw-sepia: initial; + --tw-drop-shadow: initial; + --tw-drop-shadow-color: initial; + --tw-drop-shadow-alpha: 100%; + --tw-drop-shadow-size: initial; + --tw-ease: initial; + } + } +} diff --git a/web/static/vendor/theme.js b/web/static/vendor/theme.js index 739463e..c2c7901 100644 --- a/web/static/vendor/theme.js +++ b/web/static/vendor/theme.js @@ -2,6 +2,13 @@ var STORAGE_KEY = "theme"; var root = document.documentElement; var mediaQuery = window.matchMedia("(prefers-color-scheme: dark)"); + var isAuthenticated = window.__TC_IS_AUTHENTICATED === true || window.__TC_IS_AUTHENTICATED === "true"; + var serverTheme = normalizeTheme(window.__TC_SERVER_THEME); + + function normalizeTheme(theme) { + if (!theme) return ""; + return String(theme).trim().toLowerCase(); + } function getStoredTheme() { var value = null; @@ -33,6 +40,16 @@ } } + function persistThemePreference(theme) { + if (!isAuthenticated) return; + fetch("/preferences/theme", { + method: "POST", + headers: { "Content-Type": "application/json" }, + credentials: "same-origin", + body: JSON.stringify({ theme: theme }), + }).catch(function () {}); + } + function updateToggleState(theme) { var button = document.getElementById("themeToggle"); if (!button) return; @@ -43,6 +60,11 @@ } function applyInitialTheme() { + if (isAuthenticated && (serverTheme === "dark" || serverTheme === "light")) { + setStoredTheme(serverTheme); + applyTheme(serverTheme); + return; + } var stored = getStoredTheme(); applyTheme(stored || getPreferredTheme()); } @@ -51,6 +73,7 @@ var next = currentTheme() === "dark" ? "light" : "dark"; applyTheme(next); setStoredTheme(next); + persistThemePreference(next); updateToggleState(next); }; diff --git a/web/templates/admin/_navbar.html b/web/templates/admin/_navbar.html index dcc3a4e..916ca1d 100644 --- a/web/templates/admin/_navbar.html +++ b/web/templates/admin/_navbar.html @@ -31,10 +31,12 @@ {{if .CurrentUser}}
-