From a92cc76a9a780d04aa0563bd64b9df9e5bc2b4b3 Mon Sep 17 00:00:00 2001 From: Fabien Masson Date: Tue, 22 Sep 2026 21:15:23 +0200 Subject: [PATCH] basic llm request stream --- artwork/.$schema.drawio.bkp | 102 ++++++++ artwork/schema.drawio | 108 ++++++++ backend/cmd/serve.go | 33 ++- backend/internal/adapter/database/factory.go | 1 + backend/internal/adapter/database/orm/orm.go | 12 +- .../database/turso/agent_repository.go | 16 +- .../adapter/database/turso/chat_repository.go | 83 ++++++ backend/internal/adapter/database/turso/db.go | 4 + .../migrations/000001_create_tables.down.sql | 3 +- .../migrations/000001_create_tables.up.sql | 28 +- backend/internal/adapter/llm/anyllm.go | 54 +++- .../{llmserver/server.go => brain/router.go} | 22 +- backend/internal/brain/session.go | 6 + backend/internal/domain/llm.go | 90 ++++--- backend/internal/http/handlers/agent.go | 14 +- backend/internal/http/handlers/chat.go | 182 +++++++++++++ backend/internal/http/handlers/provider.go | 20 +- backend/internal/http/router.go | 3 + .../web/_app/immutable/assets/0.Bdga2HVs.css | 2 - .../web/_app/immutable/assets/0.PdzDvXHc.css | 2 + .../chunks/{D3up1JC1.js => B0qrqti_.js} | 2 +- .../web/_app/immutable/chunks/B5isPFOt.js | 1 - .../chunks/{BqkZ0BZ5.js => BC84wEQu.js} | 2 +- .../chunks/{BEgKbVuy.js => BDef5Ccs.js} | 2 +- .../chunks/{D4uBfDnr.js => BorM6hBh.js} | 2 +- .../chunks/{DNQ6C3zq.js => DFI7Zp3t.js} | 2 +- .../web/_app/immutable/chunks/DL7ZyBAF.js | 1 + .../chunks/{D35bQ8xD.js => DOY2HMbt.js} | 2 +- .../chunks/{D1d5-1oo.js => DtPl1hOB.js} | 2 +- .../{app.DHv_tZ2J.js => app.DteMb5qC.js} | 4 +- .../_app/immutable/entry/start.Bxa_xdGb.js | 1 - .../_app/immutable/entry/start.wXD-FaGY.js | 1 + .../nodes/{0.DNLpy_rd.js => 0.WTbeuaG5.js} | 0 .../nodes/{1.Cvrs0-W0.js => 1.HToxGbTu.js} | 2 +- .../web/_app/immutable/nodes/12.B5iUSTUw.js | 1 - .../web/_app/immutable/nodes/12.DXjVg3KD.js | 1 + .../web/_app/immutable/nodes/17.D_IcqSXn.js | 1 + .../web/_app/immutable/nodes/17.wrIvaz1M.js | 1 - .../nodes/{18.BfPDxxm9.js => 18.CljvOcq_.js} | 2 +- .../nodes/{19.Bhx_NIDl.js => 19.B7Etxitc.js} | 2 +- .../web/_app/immutable/nodes/2.Bs3bPWro.js | 1 - .../web/_app/immutable/nodes/2.DJpmXDpd.js | 1 + .../nodes/{3.BD_oZvMH.js => 3.DQ-wAvIJ.js} | 2 +- .../web/_app/immutable/nodes/8.D-K-fxzc.js | 1 - .../web/_app/immutable/nodes/8.TeTitTKA.js | 1 + backend/internal/http/web/_app/version.json | 2 +- backend/internal/http/web/index.html | 16 +- backend/internal/llmserver/session.go | 5 - backend/internal/service/chat/service.go | 246 ++++++++++++++++++ backend/internal/service/chat/session.go | 52 ++++ backend/lassistanoque.db-wal | Bin 12392 -> 865232 bytes backend/web/package-lock.json | 165 ++++++++++++ backend/web/package.json | 1 + backend/web/src/lib/api/client.ts | 62 +++++ backend/web/src/lib/api/endpoints/chat.ts | 11 + backend/web/src/lib/components/Menu.svelte | 6 +- backend/web/src/lib/types/api.ts | 50 ++++ backend/web/src/lib/ui/autofocus.ts | 3 + .../[space]/(chat)/+page.svelte | 41 ++- .../(authenticated)/[space]/(chat)/+page.ts | 9 +- .../(chat)/[conversation]/+page.svelte | 75 ++++++ .../[space]/(chat)/[conversation]/+page.ts | 9 + .../[space]/settings/agents/+page.svelte | 1 - .../src/routes/(public)/login/+page.svelte | 13 +- backend/web/src/routes/layout.css | 54 +++- backend/web/tailwind.config.js | 10 + 66 files changed, 1496 insertions(+), 158 deletions(-) create mode 100644 artwork/.$schema.drawio.bkp create mode 100644 artwork/schema.drawio create mode 100644 backend/internal/adapter/database/turso/chat_repository.go rename backend/internal/{llmserver/server.go => brain/router.go} (60%) create mode 100644 backend/internal/brain/session.go create mode 100644 backend/internal/http/handlers/chat.go delete mode 100644 backend/internal/http/web/_app/immutable/assets/0.Bdga2HVs.css create mode 100644 backend/internal/http/web/_app/immutable/assets/0.PdzDvXHc.css rename backend/internal/http/web/_app/immutable/chunks/{D3up1JC1.js => B0qrqti_.js} (98%) delete mode 100644 backend/internal/http/web/_app/immutable/chunks/B5isPFOt.js rename backend/internal/http/web/_app/immutable/chunks/{BqkZ0BZ5.js => BC84wEQu.js} (87%) rename backend/internal/http/web/_app/immutable/chunks/{BEgKbVuy.js => BDef5Ccs.js} (79%) rename backend/internal/http/web/_app/immutable/chunks/{D4uBfDnr.js => BorM6hBh.js} (99%) rename backend/internal/http/web/_app/immutable/chunks/{DNQ6C3zq.js => DFI7Zp3t.js} (59%) create mode 100644 backend/internal/http/web/_app/immutable/chunks/DL7ZyBAF.js rename backend/internal/http/web/_app/immutable/chunks/{D35bQ8xD.js => DOY2HMbt.js} (86%) rename backend/internal/http/web/_app/immutable/chunks/{D1d5-1oo.js => DtPl1hOB.js} (80%) rename backend/internal/http/web/_app/immutable/entry/{app.DHv_tZ2J.js => app.DteMb5qC.js} (55%) delete mode 100644 backend/internal/http/web/_app/immutable/entry/start.Bxa_xdGb.js create mode 100644 backend/internal/http/web/_app/immutable/entry/start.wXD-FaGY.js rename backend/internal/http/web/_app/immutable/nodes/{0.DNLpy_rd.js => 0.WTbeuaG5.js} (100%) rename backend/internal/http/web/_app/immutable/nodes/{1.Cvrs0-W0.js => 1.HToxGbTu.js} (82%) delete mode 100644 backend/internal/http/web/_app/immutable/nodes/12.B5iUSTUw.js create mode 100644 backend/internal/http/web/_app/immutable/nodes/12.DXjVg3KD.js create mode 100644 backend/internal/http/web/_app/immutable/nodes/17.D_IcqSXn.js delete mode 100644 backend/internal/http/web/_app/immutable/nodes/17.wrIvaz1M.js rename backend/internal/http/web/_app/immutable/nodes/{18.BfPDxxm9.js => 18.CljvOcq_.js} (92%) rename backend/internal/http/web/_app/immutable/nodes/{19.Bhx_NIDl.js => 19.B7Etxitc.js} (92%) delete mode 100644 backend/internal/http/web/_app/immutable/nodes/2.Bs3bPWro.js create mode 100644 backend/internal/http/web/_app/immutable/nodes/2.DJpmXDpd.js rename backend/internal/http/web/_app/immutable/nodes/{3.BD_oZvMH.js => 3.DQ-wAvIJ.js} (66%) delete mode 100644 backend/internal/http/web/_app/immutable/nodes/8.D-K-fxzc.js create mode 100644 backend/internal/http/web/_app/immutable/nodes/8.TeTitTKA.js delete mode 100644 backend/internal/llmserver/session.go create mode 100644 backend/internal/service/chat/service.go create mode 100644 backend/internal/service/chat/session.go create mode 100644 backend/web/src/lib/api/endpoints/chat.ts create mode 100644 backend/web/src/lib/ui/autofocus.ts create mode 100644 backend/web/src/routes/(authenticated)/[space]/(chat)/[conversation]/+page.svelte create mode 100644 backend/web/src/routes/(authenticated)/[space]/(chat)/[conversation]/+page.ts create mode 100644 backend/web/tailwind.config.js diff --git a/artwork/.$schema.drawio.bkp b/artwork/.$schema.drawio.bkp new file mode 100644 index 0000000..a5f20ac --- /dev/null +++ b/artwork/.$schema.drawio.bkp @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/artwork/schema.drawio b/artwork/schema.drawio new file mode 100644 index 0000000..d0902b6 --- /dev/null +++ b/artwork/schema.drawio @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/backend/cmd/serve.go b/backend/cmd/serve.go index 159ce21..d05d022 100644 --- a/backend/cmd/serve.go +++ b/backend/cmd/serve.go @@ -16,10 +16,11 @@ import ( "trankilou.fr/lassistanoque/backend/internal/adapter/file" "trankilou.fr/lassistanoque/backend/internal/adapter/llm" "trankilou.fr/lassistanoque/backend/internal/adapter/security" + "trankilou.fr/lassistanoque/backend/internal/brain" "trankilou.fr/lassistanoque/backend/internal/http" - "trankilou.fr/lassistanoque/backend/internal/llmserver" "trankilou.fr/lassistanoque/backend/internal/service/agent" "trankilou.fr/lassistanoque/backend/internal/service/auth" + "trankilou.fr/lassistanoque/backend/internal/service/chat" "trankilou.fr/lassistanoque/backend/internal/service/provider" "trankilou.fr/lassistanoque/backend/internal/service/storage" "trankilou.fr/lassistanoque/backend/internal/service/user" @@ -67,6 +68,10 @@ func runServe() { tokenManager := security.NewJwtTokenManager(12*time.Hour, 7*24*time.Hour, "lassistanoque") pwdAuth := password.NewPasswordAuthenticator(tokenManager, db.UserRepository()) llmEngine := llm.NewAnyLLMEngine() + repoUser := db.UserRepository() + repoProvider := db.ProviderRepository() + repoAgent := db.AgentRepository() + repoChat := db.ChatRepository() // services authService := auth.NewService( @@ -76,36 +81,40 @@ func runServe() { "password": pwdAuth, }, ) - userService := user.NewService(db.UserRepository()) + userService := user.NewService(repoUser) storageService := storage.NewService(store) - providerService := provider.NewService(db.ProviderRepository(), db.UserRepository(), llmEngine) - agentService := agent.NewService(db.AgentRepository(), db.UserRepository()) + providerService := provider.NewService(repoProvider, repoUser, llmEngine) + agentService := agent.NewService(repoAgent, repoUser) + chatService := chat.NewService(repoUser, repoAgent, repoProvider, repoChat, llmEngine) // http server - router := http.NewRouter(http.Dependencies{ + httpRouter := http.NewRouter(http.Dependencies{ StorageService: storageService, AuthService: authService, UserService: userService, TokenManager: tokenManager, ProviderService: providerService, AgentService: agentService, + ChatService: chatService, }) - llms := llmserver.NewLLMServer(llmserver.Dependencies{}) + brainRouter := brain.NewRouter(brain.Dependencies{ + ChatRepository: db.ChatRepository(), + }) ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) defer stop() - // start LLM service + // start Brain router go func() { - if err := llms.Start(); err != nil && !errors.Is(err, nethttp.ErrServerClosed) { + if err := brainRouter.Start(); err != nil && !errors.Is(err, nethttp.ErrServerClosed) { slog.Error("failed to start llm server", "error", err) } }() - // start HTTP service + // start HTTP router go func() { - if err := router.Start(); err != nil && !errors.Is(err, nethttp.ErrServerClosed) { + if err := httpRouter.Start(); err != nil && !errors.Is(err, nethttp.ErrServerClosed) { slog.Error("failed to start http server", "error", err) } }() @@ -115,7 +124,7 @@ func runServe() { // stop HTTP service ctx, cancel1 := context.WithTimeout(context.Background(), 10*time.Second) defer cancel1() - if err := router.Stop(ctx); err != nil { + if err := httpRouter.Stop(ctx); err != nil { slog.Error("failed to stop http server", "error", err) } slog.Info("HTTP server stopped gracefully") @@ -123,7 +132,7 @@ func runServe() { // stop LLM service ctx, cancel2 := context.WithTimeout(context.Background(), 10*time.Second) defer cancel2() - if err := llms.Stop(ctx); err != nil { + if err := brainRouter.Stop(ctx); err != nil { slog.Error("failed to stop llm server", "error", err) } slog.Info("LLM server stopped gracefully") diff --git a/backend/internal/adapter/database/factory.go b/backend/internal/adapter/database/factory.go index 22d79fd..0d20214 100644 --- a/backend/internal/adapter/database/factory.go +++ b/backend/internal/adapter/database/factory.go @@ -14,6 +14,7 @@ type Database interface { FileRepository() domain.FileRepository ProviderRepository() domain.ProviderRepository AgentRepository() domain.AgentRepository + ChatRepository() domain.ChatRepository Migrate() error Close() } diff --git a/backend/internal/adapter/database/orm/orm.go b/backend/internal/adapter/database/orm/orm.go index dc14517..ea809a6 100644 --- a/backend/internal/adapter/database/orm/orm.go +++ b/backend/internal/adapter/database/orm/orm.go @@ -41,12 +41,14 @@ func NewTable[T any](db *sql.DB, dialect Dialect, tablename string) (Table[T], e fields := make([]dbfield, 0) for field := range t.Fields() { - f := dbfield{ - name: field.Name, - stype: field.Type.String(), - dbname: field.Tag.Get("db"), + if field.Tag.Get("db") != "-" { + f := dbfield{ + name: field.Name, + stype: field.Type.String(), + dbname: field.Tag.Get("db"), + } + fields = append(fields, f) } - fields = append(fields, f) } return Table[T]{ diff --git a/backend/internal/adapter/database/turso/agent_repository.go b/backend/internal/adapter/database/turso/agent_repository.go index b891eb9..f76f36c 100644 --- a/backend/internal/adapter/database/turso/agent_repository.go +++ b/backend/internal/adapter/database/turso/agent_repository.go @@ -10,24 +10,24 @@ import ( type TursoAgentRepository struct { db *sql.DB - AgentTable orm.Table[domain.Agent] + agentTable orm.Table[domain.Agent] } func NewTursoAgentRepository(db *sql.DB) *TursoAgentRepository { dialect := orm.NewSqliteDialect() - AgentTable, err := orm.NewTable[domain.Agent](db, dialect, "agents") + agentTable, err := orm.NewTable[domain.Agent](db, dialect, "agents") if err != nil { log.Fatalf("error creating lasebuche agent table") } return &TursoAgentRepository{ db: db, - AgentTable: AgentTable, + agentTable: agentTable, } } func (r *TursoAgentRepository) ListAgents(userID string, teamID string) ([]*domain.Agent, error) { - return r.AgentTable.Select( + return r.agentTable.Select( orm.WithWhere( "team_id=$1 and team_id in (select team_id from user_teams where user_id=$2)", teamID, @@ -37,7 +37,7 @@ func (r *TursoAgentRepository) ListAgents(userID string, teamID string) ([]*doma } func (r *TursoAgentRepository) GetAgent(userID string, teamID string, id string) (*domain.Agent, error) { - return r.AgentTable.SelectOne( + return r.agentTable.SelectOne( "id=$1 and team_id=$2 and team_id in (select team_id from user_teams where user_id=$3)", id, teamID, @@ -46,15 +46,15 @@ func (r *TursoAgentRepository) GetAgent(userID string, teamID string, id string) } func (r *TursoAgentRepository) CreateAgent(userID string, agent *domain.Agent) (*domain.Agent, error) { - return r.AgentTable.Insert(agent) + return r.agentTable.Insert(agent) } func (r *TursoAgentRepository) UpdateAgent(userID string, agent *domain.Agent) (*domain.Agent, error) { - return r.AgentTable.Update(agent) + return r.agentTable.Update(agent) } func (r *TursoAgentRepository) DeleteAgent(userID string, teamID string, id string) error { - return r.AgentTable.DeleteWhere( + return r.agentTable.DeleteWhere( "id=$1 and team_id=$2 and team_id in (select team_id from user_teams where user_id=$3)", id, teamID, diff --git a/backend/internal/adapter/database/turso/chat_repository.go b/backend/internal/adapter/database/turso/chat_repository.go new file mode 100644 index 0000000..197cb8b --- /dev/null +++ b/backend/internal/adapter/database/turso/chat_repository.go @@ -0,0 +1,83 @@ +package turso + +import ( + "database/sql" + "log" + + "trankilou.fr/lassistanoque/backend/internal/adapter/database/orm" + "trankilou.fr/lassistanoque/backend/internal/domain" +) + +type TursoChatRepository struct { + db *sql.DB + chatTable orm.Table[domain.Chat] + messageTable orm.Table[domain.Message] +} + +func NewTursoChatRepository(db *sql.DB) *TursoChatRepository { + dialect := orm.NewSqliteDialect() + chatTable, err := orm.NewTable[domain.Chat](db, dialect, "chats") + messageTable, err := orm.NewTable[domain.Message](db, dialect, "chat_messages") + if err != nil { + log.Fatalf("error creating lasebuche agent table") + } + + return &TursoChatRepository{ + db: db, + chatTable: chatTable, + messageTable: messageTable, + } +} + +func (r *TursoChatRepository) ListChats(userID string, teamID string, page int) ([]*domain.Chat, error) { + return r.chatTable.Select( + orm.WithWhere( + "team_id=$1 and team_id in (select team_id from user_teams where user_id=$2)", + teamID, + userID, + ), + orm.WithPagination(page, 50), + ) +} + +func (r *TursoChatRepository) GetChat(userID string, teamID string, id string) (*domain.Chat, error) { + return r.chatTable.SelectOne( + "id=$1 and team_id=$2 and team_id in (select team_id from user_teams where user_id=$3)", + id, + teamID, + userID, + ) +} + +func (r *TursoChatRepository) CreateChat(userID string, chat *domain.Chat) (*domain.Chat, error) { + return r.chatTable.Insert(chat) +} + +func (r *TursoChatRepository) UpdateChat(userID string, chat *domain.Chat) (*domain.Chat, error) { + return r.chatTable.Update(chat) +} + +func (r *TursoChatRepository) DeleteChat(userID string, teamID string, id string) error { + return r.chatTable.DeleteWhere( + "id=$1 and team_id=$2 and team_id in (select team_id from user_teams where user_id=$3)", + id, + teamID, + userID, + ) +} + +func (r *TursoChatRepository) GetChatMessages(userID string, teamID string, chatID string) ([]*domain.Message, error) { + return r.messageTable.Select( + orm.WithWhere( + "chat_id=$1 and team_id=$2 and team_id in (select team_id from user_teams where user_id=$3)", + chatID, + teamID, + userID, + ), + orm.WithOrder("_date_created asc"), + ) +} + +func (r *TursoChatRepository) CreateChatMessage(userID string, message *domain.Message) (*domain.Message, error) { + return r.messageTable.Insert(message) +} diff --git a/backend/internal/adapter/database/turso/db.go b/backend/internal/adapter/database/turso/db.go index 2169ca4..726ab35 100644 --- a/backend/internal/adapter/database/turso/db.go +++ b/backend/internal/adapter/database/turso/db.go @@ -75,3 +75,7 @@ func (db *TursoDB) ProviderRepository() domain.ProviderRepository { func (db *TursoDB) AgentRepository() domain.AgentRepository { return NewTursoAgentRepository(db.DB) } + +func (db *TursoDB) ChatRepository() domain.ChatRepository { + return NewTursoChatRepository(db.DB) +} diff --git a/backend/internal/adapter/database/turso/migrations/000001_create_tables.down.sql b/backend/internal/adapter/database/turso/migrations/000001_create_tables.down.sql index 6f5807b..a28b29c 100644 --- a/backend/internal/adapter/database/turso/migrations/000001_create_tables.down.sql +++ b/backend/internal/adapter/database/turso/migrations/000001_create_tables.down.sql @@ -9,6 +9,7 @@ drop table user_teams; drop table channels; drop table tools; drop table tasks; -drop table history; +drop table chats; +drop table chat_contents; drop table files; drop table agents; diff --git a/backend/internal/adapter/database/turso/migrations/000001_create_tables.up.sql b/backend/internal/adapter/database/turso/migrations/000001_create_tables.up.sql index 9abab00..f9317a2 100644 --- a/backend/internal/adapter/database/turso/migrations/000001_create_tables.up.sql +++ b/backend/internal/adapter/database/turso/migrations/000001_create_tables.up.sql @@ -117,14 +117,30 @@ create table tasks ( _version text not null ); -create table history ( +create table chats ( id text not null primary key, - task_id text not null, - start_datetime numeric, + team_id text not null, + start_datetime numeric not null, end_datetime numeric, - prompt text not null, - log text not null, - response text not null, + agent_id text, + user_id text, + task_id text, + title text, + _date_created numeric not null default current_timestamp, + _date_updated numeric, + _version text not null +); + +create table chat_messages ( + id text not null primary key, + team_id text not null, + chat_id text not null, + content_datetime numeric, + role text not null, + content text, + agent_id text, + tool_call_id text, + tool_calls text, _date_created numeric not null default current_timestamp, _date_updated numeric, _version text not null diff --git a/backend/internal/adapter/llm/anyllm.go b/backend/internal/adapter/llm/anyllm.go index e1624a2..7d30ddd 100644 --- a/backend/internal/adapter/llm/anyllm.go +++ b/backend/internal/adapter/llm/anyllm.go @@ -5,6 +5,7 @@ import ( "fmt" anyllm "github.com/mozilla-ai/any-llm-go" + "github.com/mozilla-ai/any-llm-go/providers" "github.com/mozilla-ai/any-llm-go/providers/anthropic" "github.com/mozilla-ai/any-llm-go/providers/ollama" "github.com/mozilla-ai/any-llm-go/providers/openai" @@ -79,13 +80,13 @@ func (e *AnyLLMEngine) Stream( ctx context.Context, provider *domain.Provider, modelID string, - params *domain.StreamParams, + params *domain.LLMParams, messages []*domain.Message, -) error { +) (*domain.Message, error) { p, err := providerFactory(provider) if err != nil { - return err + return nil, err } anyllmMessages := make([]anyllm.Message, 0) @@ -96,26 +97,57 @@ func (e *AnyLLMEngine) Stream( }) } + if params.ReasoningEffort == "" { + params.ReasoningEffort = "none" + } + chunkChan, errChan := p.CompletionStream(ctx, anyllm.CompletionParams{ - Model: modelID, - Messages: anyllmMessages, - Stream: true, + Model: modelID, + Messages: anyllmMessages, + Stream: true, + ReasoningEffort: providers.ReasoningEffort(params.ReasoningEffort), }) + fullContent := "" + role := anyllm.RoleAssistant + for chunk := range chunkChan { if len(chunk.Choices) > 0 { content := chunk.Choices[0].Delta.Content + reasoning := chunk.Choices[0].Delta.Reasoning if params.OnChunk != nil { - params.OnChunk(&domain.Chunk{ - Content: content, - }) + if content != "" { + fullContent += content + params.OnChunk(&domain.Chunk{ + Done: false, + Role: role, + Content: content, + Reasoning: false, + }) + } else if reasoning != nil { + params.OnChunk(&domain.Chunk{ + Done: false, + Role: role, + Content: reasoning.Content, + Reasoning: true, + }) + } } } } + params.OnChunk(&domain.Chunk{ + Done: true, + Role: role, + Content: "", + }) + if err := <-errChan; err != nil { - return err + return nil, err } - return nil + return &domain.Message{ + Role: role, + Content: fullContent, + }, nil } diff --git a/backend/internal/llmserver/server.go b/backend/internal/brain/router.go similarity index 60% rename from backend/internal/llmserver/server.go rename to backend/internal/brain/router.go index 45ed046..8c6b6cb 100644 --- a/backend/internal/llmserver/server.go +++ b/backend/internal/brain/router.go @@ -1,17 +1,19 @@ -package llmserver +package brain import ( "context" "fmt" "sync" + "trankilou.fr/lassistanoque/backend/internal/domain" "trankilou.fr/lassistanoque/backend/internal/utility" ) type Dependencies struct { + ChatRepository domain.ChatRepository } -type LLMServer struct { +type Router struct { started bool mu sync.Mutex sessions map[string]*Session // running sessions @@ -19,8 +21,8 @@ type LLMServer struct { closeChan chan bool } -func NewLLMServer(deps Dependencies) *LLMServer { - return &LLMServer{ +func NewRouter(deps Dependencies) *Router { + return &Router{ started: true, sessions: make(map[string]*Session), newSessionChan: make(chan string), @@ -28,7 +30,7 @@ func NewLLMServer(deps Dependencies) *LLMServer { } } -func (s *LLMServer) Start() error { +func (s *Router) Start() error { for { select { @@ -40,13 +42,13 @@ func (s *LLMServer) Start() error { } -func (s *LLMServer) Stop(ctx context.Context) error { +func (s *Router) Stop(ctx context.Context) error { s.closeChan <- true s.started = false return nil } -func (s *LLMServer) StartSession() (*Session, error) { +func (s *Router) StartSession() (*Session, error) { sid := utility.GenID() session := &Session{} @@ -56,3 +58,9 @@ func (s *LLMServer) StartSession() (*Session, error) { return session, nil } + +func (s *Router) Process(ctx context.Context, Chat *domain.ChatWithMessages) error { + s.closeChan <- true + s.started = false + return nil +} diff --git a/backend/internal/brain/session.go b/backend/internal/brain/session.go new file mode 100644 index 0000000..93e025b --- /dev/null +++ b/backend/internal/brain/session.go @@ -0,0 +1,6 @@ +package brain + +type Session struct { + serverID string + chatID string +} diff --git a/backend/internal/domain/llm.go b/backend/internal/domain/llm.go index 09587ed..bb304f1 100644 --- a/backend/internal/domain/llm.go +++ b/backend/internal/domain/llm.go @@ -1,32 +1,47 @@ package domain -import "context" +import ( + "context" + "time" +) -type LLMModelDetail struct { - ParentModel string `json:"parent_model"` - Format string `json:"format"` - Family string `json:"family"` - Families []string `json:"families"` - ParameterSize string `json:"parameter_size"` - QuantizationLevel string `json:"quantization_level"` -} - -type LLMModel struct { - Name string `json:"name"` - Model string `json:"model"` - ModifiedAt int64 `json:"modified_at"` - Size int64 `json:"size"` - Digest string `json:"digest"` - Detail *LLMModelDetail `json:"detail"` +type Chat struct { + ID string `db:"id" json:"id"` + TeamID string `db:"team_id" json:"teamId"` + StartDatetime *time.Time `db:"start_datetime" json:"startDatetime"` + EndDatetime *time.Time `db:"end_datetime" json:"endDatetime"` + AgentID string `db:"agent_id" json:"agentId"` + UserID string `db:"user_id" json:"userId"` + TaskID string `db:"task_id" json:"taskId,omitempty"` + Title string `db:"title" json:"title"` + DateCreated time.Time `db:"_date_created" json:"_date_created"` + DateUpdated *time.Time `db:"_date_updated" json:"_date_updated"` + VersionId string `db:"_version" json:"_version"` } type Message struct { - Role string - Content string - ToolCalls []ToolCall - ToolCallID string + ID string `db:"id" json:"id"` + TeamID string `db:"team_id" json:"teamId"` + ChatID string `db:"chat_id" json:"chatId"` + Role string `db:"role" json:"role"` + Content string `db:"content" json:"content"` + ToolCallID string `db:"tool_call_id" json:"toolCallId"` + ToolCalls []ToolCall `db:"-" json:"toolcalls"` + ToolCallsJson string `db:"tool_calls" json:"-"` + DateCreated time.Time `db:"_date_created" json:"_date_created"` + DateUpdated *time.Time `db:"_date_updated" json:"_date_updated"` + VersionId string `db:"_version" json:"_version"` +} - //Reasoning *Reasoning +type ChatWithMessages struct { + Chat *Chat `json:"chat"` + Messages []*Message `json:"messages"` +} + +type ChatParams struct { + ProviderID string + ModelID string + OnChunk StreamCallback } type Tool struct { @@ -36,14 +51,13 @@ type ToolCall struct { } type Chunk struct { - Content string + Done bool `json:"done"` + Role string `json:"role"` + Content string `json:"content"` + Reasoning bool } -type StreamParams struct { - Tools []*Tool - OnChunk func(chunk *Chunk) - OnDebug func() -} +type StreamCallback func(chunk *Chunk) type Role string @@ -54,6 +68,12 @@ const ( RoleTool Role = "tool" ) +type LLMParams struct { + Tools []*Tool + OnChunk StreamCallback + ReasoningEffort string +} + type LLMEngine interface { ListProviderTypes() []Item ListModelsFromProvider(ctx context.Context, provider *Provider) ([]string, error) @@ -61,7 +81,17 @@ type LLMEngine interface { ctx context.Context, provider *Provider, modelID string, - params *StreamParams, + params *LLMParams, messages []*Message, - ) error + ) (*Message, error) +} + +type ChatRepository interface { + ListChats(userID string, teamID string, page int) ([]*Chat, error) + GetChat(userID string, teamID string, id string) (*Chat, error) + CreateChat(userID string, chat *Chat) (*Chat, error) + UpdateChat(userID string, chat *Chat) (*Chat, error) + DeleteChat(userID string, teamID string, id string) error + GetChatMessages(userID string, teamID string, id string) ([]*Message, error) + CreateChatMessage(userID string, message *Message) (*Message, error) } diff --git a/backend/internal/http/handlers/agent.go b/backend/internal/http/handlers/agent.go index e0fc9ab..c72d10e 100644 --- a/backend/internal/http/handlers/agent.go +++ b/backend/internal/http/handlers/agent.go @@ -42,7 +42,7 @@ func (h *AgentHandler) ListAgents(c *echo.Context) error { teamID := c.Param("space") agents, err := h.agentService.ListAgents(userID, teamID) if err != nil { - c.Logger().Error("error listing agents", err) + c.Logger().Error("error listing agents", "error", err) return echo.NewHTTPError(http.StatusBadRequest, "error listing agents") } return c.JSON(http.StatusOK, agents) @@ -54,7 +54,7 @@ func (h *AgentHandler) GetAgent(c *echo.Context) error { agentID := c.Param("agent") agent, err := h.agentService.GetAgent(userID, teamID, agentID) if err != nil { - c.Logger().Error("error getting agent: %s", err) + c.Logger().Error("error getting agent", "error", err) return echo.NewHTTPError(http.StatusBadRequest, "error getting agent") } return c.JSON(http.StatusOK, agent) @@ -66,13 +66,13 @@ func (h *AgentHandler) CreateAgent(c *echo.Context) error { var agent domain.Agent err := c.Bind(&agent) if err != nil { - c.Logger().Error("error binding agent : %s", err) + c.Logger().Error("error binding agent", "error", err) return echo.NewHTTPError(http.StatusBadRequest, "error binding agent") } agent.TeamID = teamID updagent, err := h.agentService.CreateAgent(userID, &agent) if err != nil { - c.Logger().Error("error creating agent: %s", err) + c.Logger().Error("error creating agent", "error", err) return echo.NewHTTPError(http.StatusBadRequest, "error creating agent") } return c.JSON(http.StatusOK, updagent) @@ -84,13 +84,13 @@ func (h *AgentHandler) UpdateAgent(c *echo.Context) error { var agent domain.Agent err := c.Bind(&agent) if err != nil { - c.Logger().Error("error binding agent : %s", err) + c.Logger().Error("error binding agent", "error", err) return echo.NewHTTPError(http.StatusBadRequest, "error binding agent") } agent.TeamID = teamID updagent, err := h.agentService.UpdateAgent(userID, &agent) if err != nil { - c.Logger().Error("error updating agent: %s", err) + c.Logger().Error("error updating agent", "error", err) return echo.NewHTTPError(http.StatusBadRequest, "error updating agent") } return c.JSON(http.StatusOK, updagent) @@ -102,7 +102,7 @@ func (h *AgentHandler) DeleteAgent(c *echo.Context) error { agentID := c.Param("agent") err := h.agentService.DeleteAgent(userID, teamID, agentID) if err != nil { - c.Logger().Error("error creating agent: %s", err) + c.Logger().Error("error creating agent", "error", err) return echo.NewHTTPError(http.StatusBadRequest, "error creating agent") } return c.JSON(http.StatusOK, agentID) diff --git a/backend/internal/http/handlers/chat.go b/backend/internal/http/handlers/chat.go new file mode 100644 index 0000000..63a4667 --- /dev/null +++ b/backend/internal/http/handlers/chat.go @@ -0,0 +1,182 @@ +package handlers + +import ( + "encoding/json" + "log/slog" + "net/http" + "strconv" + + "github.com/labstack/echo/v5" + "trankilou.fr/lassistanoque/backend/internal/domain" + "trankilou.fr/lassistanoque/backend/internal/service/auth" + "trankilou.fr/lassistanoque/backend/internal/service/chat" +) + +func NewChatGroup(prefix string, e *echo.Group, service *chat.Service, middlewares ...echo.MiddlewareFunc) *echo.Group { + chatHandler := &ChatHandler{ + chatService: service, + } + auth := e.Group(prefix, middlewares...) + + auth.POST("/:space", chatHandler.NewChat) + auth.POST("/:space/:id", chatHandler.NewChatMessage) + auth.GET("/:space/all/:page", chatHandler.List) + auth.GET("/:space/:id", chatHandler.Get) + auth.GET("/:space/:id/subscribe", chatHandler.Subscribe) + auth.DELETE("/:space/:id", chatHandler.Delete) + return auth +} + +type ChatHandler struct { + chatService *chat.Service +} + +type ChatRequest struct { + Prompt string `json:"prompt"` + AgentID string `json:"agentID"` + ProviderID string `json:"providerID"` + ModelID string `json:"modelID"` + ReasoningLevel string `json:"reasoningLevel"` +} + +func (h *ChatHandler) NewChat(c *echo.Context) error { + userID := c.Get(auth.ContextUserIDKey).(string) + teamID := c.Param("space") + var request ChatRequest + err := c.Bind(&request) + if err != nil { + c.Logger().Error("error binding request", "error", err.Error()) + return echo.NewHTTPError(http.StatusBadRequest, "error binding request") + } + chat, err := h.chatService.NewChat( + userID, + teamID, + request.AgentID, + ) + if err != nil { + c.Logger().Error("error creating chat", "error", err.Error()) + return echo.NewHTTPError(http.StatusBadRequest, "error creating chat") + } + + return c.JSON(http.StatusOK, chat) +} + +func (h *ChatHandler) NewChatMessage(c *echo.Context) error { + userID := c.Get(auth.ContextUserIDKey).(string) + teamID := c.Param("space") + chatID := c.Param("id") + var request ChatRequest + err := c.Bind(&request) + if err != nil { + c.Logger().Error("error binding request", "error", err.Error()) + return echo.NewHTTPError(http.StatusBadRequest, "error binding request") + } + + enc := json.NewEncoder(c.Response()) + chunkChan := make(chan *domain.Chunk) + + _, err = h.chatService.AddChatMessage( + c.Request().Context(), + userID, + teamID, + chatID, + request.AgentID, + request.Prompt, + &domain.ChatParams{ + OnChunk: func(chunk *domain.Chunk) { + chunkChan <- chunk + }, + }, + ) + if err != nil { + c.Logger().Error("error creating chat message", "error", err.Error()) + return echo.NewHTTPError(http.StatusBadRequest, "error creating chat message") + } + + enc.Encode(&domain.Chunk{ + Done: false, + Role: string(domain.RoleUser), + Content: request.Prompt, + }) + http.NewResponseController(c.Response()).Flush() + + for { + chunk := <-chunkChan + slog.Info("Chunk", "role", chunk.Role, "content", chunk.Content, "reasoning", chunk.Reasoning) + if chunk.Done { + return nil + } + enc.Encode(chunk) + http.NewResponseController(c.Response()).Flush() + } + +} + +func (h *ChatHandler) List(c *echo.Context) error { + userID := c.Get(auth.ContextUserIDKey).(string) + teamID := c.Param("space") + page := c.Param("page") + pageInt, _ := strconv.Atoi(page) + chats, err := h.chatService.ListChats(userID, teamID, pageInt) + if err != nil { + c.Logger().Error("error listing chats", "error", err) + return echo.NewHTTPError(http.StatusBadRequest, "error listing chats") + } + return c.JSON(http.StatusOK, chats) +} + +func (h *ChatHandler) Get(c *echo.Context) error { + userID := c.Get(auth.ContextUserIDKey).(string) + teamID := c.Param("space") + chatID := c.Param("id") + chatWithMessages, err := h.chatService.GetChatWithMessages(userID, teamID, chatID) + if err != nil { + c.Logger().Error("error getting chat with messages", "error", err) + return echo.NewHTTPError(http.StatusBadRequest, "error getting chat") + } + return c.JSON(http.StatusOK, chatWithMessages) +} + +func (h *ChatHandler) Delete(c *echo.Context) error { + userID := c.Get(auth.ContextUserIDKey).(string) + teamID := c.Param("space") + chatID := c.Param("id") + err := h.chatService.DeleteChat(userID, teamID, chatID) + if err != nil { + c.Logger().Error("error deleting chat", "error", err) + return echo.NewHTTPError(http.StatusBadRequest, "error deleting chat") + } + return c.JSON(http.StatusOK, "chat deleted") +} + +func (h *ChatHandler) Subscribe(c *echo.Context) error { + userID := c.Get(auth.ContextUserIDKey).(string) + teamID := c.Param("space") + chatID := c.Param("id") + + enc := json.NewEncoder(c.Response()) + chunkChan := make(chan *domain.Chunk) + + err := h.chatService.Subscribe( + userID, + teamID, + chatID, + func(chunk *domain.Chunk) { + chunkChan <- chunk + }, + ) + if err != nil { + c.Logger().Error("error subscribing to chat", "error", err.Error()) + return echo.NewHTTPError(http.StatusBadRequest, "error creating chat") + } + + for { + chunk := <-chunkChan + if chunk.Done { + return nil + } + enc.Encode(chunk) + http.NewResponseController(c.Response()).Flush() + } + +} diff --git a/backend/internal/http/handlers/provider.go b/backend/internal/http/handlers/provider.go index 753438d..c5271cb 100644 --- a/backend/internal/http/handlers/provider.go +++ b/backend/internal/http/handlers/provider.go @@ -40,7 +40,7 @@ func (h *ModelHandler) ListProviders(c *echo.Context) error { teamID := c.Param("space") providers, err := h.providerService.ListProviders(userID, teamID) if err != nil { - c.Logger().Error("error listing providers: %s", err) + c.Logger().Error("error listing providers", "error", err) return echo.NewHTTPError(http.StatusBadRequest, "error listing providers") } return c.JSON(http.StatusOK, providers) @@ -52,7 +52,7 @@ func (h *ModelHandler) GetProvider(c *echo.Context) error { providerID := c.Param("provider") provider, err := h.providerService.GetProvider(userID, teamID, providerID) if err != nil { - c.Logger().Error("error getting provider: %s", err) + c.Logger().Error("error getting provider", "error", err) return echo.NewHTTPError(http.StatusBadRequest, "error getting provider") } return c.JSON(http.StatusOK, provider) @@ -64,13 +64,13 @@ func (h *ModelHandler) CreateProvider(c *echo.Context) error { var provider domain.Provider err := c.Bind(&provider) if err != nil { - c.Logger().Error("error binding provider: %s", err) + c.Logger().Error("error binding provider", "error", err) return echo.NewHTTPError(http.StatusBadRequest, "error binding provider") } provider.TeamID = teamID updprovider, err := h.providerService.CreateProvider(userID, &provider) if err != nil { - c.Logger().Error("error creating provider: %s", err) + c.Logger().Error("error creating provider", "error", err) return echo.NewHTTPError(http.StatusBadRequest, "error creating provider") } return c.JSON(http.StatusOK, updprovider) @@ -82,13 +82,13 @@ func (h *ModelHandler) UpdateProvider(c *echo.Context) error { var provider domain.Provider err := c.Bind(&provider) if err != nil { - c.Logger().Error("error binding provider: %s", err) + c.Logger().Error("error binding provider", "error", err) return echo.NewHTTPError(http.StatusBadRequest, "error binding provider") } provider.TeamID = teamID updprovider, err := h.providerService.UpdateProvider(userID, &provider) if err != nil { - c.Logger().Error("error updating provider: %s", err) + c.Logger().Error("error updating provider", "error", err) return echo.NewHTTPError(http.StatusBadRequest, "error creating provider") } return c.JSON(http.StatusOK, updprovider) @@ -100,7 +100,7 @@ func (h *ModelHandler) DeleteProvider(c *echo.Context) error { providerID := c.Param("provider") err := h.providerService.DeleteProvider(userID, teamID, providerID) if err != nil { - c.Logger().Error("error creating provider: %s", err) + c.Logger().Error("error creating provider", "error", err) return echo.NewHTTPError(http.StatusBadRequest, "error creating provider") } return c.JSON(http.StatusOK, providerID) @@ -111,13 +111,13 @@ func (h *ModelHandler) ListAvailableModels(c *echo.Context) error { var provider domain.Provider err := c.Bind(&provider) if err != nil { - c.Logger().Error("error binding provider: %s", err) + c.Logger().Error("error binding provider", "error", err) return echo.NewHTTPError(http.StatusBadRequest, "error binding provider") } provider.TeamID = teamID list, err := h.providerService.ListAvailableModels(c.Request().Context(), &provider) if err != nil { - c.Logger().Error("error listing available models: %s", err) + c.Logger().Error("error listing available models", "error", err) return echo.NewHTTPError(http.StatusBadRequest, "error listing available models") } return c.JSON(http.StatusOK, list) @@ -128,7 +128,7 @@ func (h *ModelHandler) ListProvidersModels(c *echo.Context) error { teamID := c.Param("space") list, err := h.providerService.ListProvidersModels(userID, teamID) if err != nil { - c.Logger().Error("error listing providers models: %s", err) + c.Logger().Error("error listing providers models", "error", err) return echo.NewHTTPError(http.StatusBadRequest, "error listing providers models") } return c.JSON(http.StatusOK, list) diff --git a/backend/internal/http/router.go b/backend/internal/http/router.go index e6c70e7..7264ab6 100644 --- a/backend/internal/http/router.go +++ b/backend/internal/http/router.go @@ -13,6 +13,7 @@ import ( "trankilou.fr/lassistanoque/backend/internal/http/handlers" "trankilou.fr/lassistanoque/backend/internal/service/agent" "trankilou.fr/lassistanoque/backend/internal/service/auth" + "trankilou.fr/lassistanoque/backend/internal/service/chat" "trankilou.fr/lassistanoque/backend/internal/service/provider" "trankilou.fr/lassistanoque/backend/internal/service/storage" "trankilou.fr/lassistanoque/backend/internal/service/user" @@ -40,6 +41,7 @@ type Dependencies struct { UserService *user.Service ProviderService *provider.Service AgentService *agent.Service + ChatService *chat.Service TokenManager auth.TokenManager } @@ -81,6 +83,7 @@ func NewRouter(deps Dependencies) *Router { _ = handlers.NewModelGroup("/provider", api, deps.ProviderService, deps.TokenManager.TokenMiddleware) _ = handlers.NewAgentGroup("/agent", api, deps.AgentService, deps.UserService, deps.TokenManager.TokenMiddleware) _ = handlers.NewTeamGroup("/team", api, deps.UserService, deps.TokenManager.TokenMiddleware) + _ = handlers.NewChatGroup("/chat", api, deps.ChatService, deps.TokenManager.TokenMiddleware) server := http.Server{ Addr: fmt.Sprintf(":%d", cfg.HttpPort), diff --git a/backend/internal/http/web/_app/immutable/assets/0.Bdga2HVs.css b/backend/internal/http/web/_app/immutable/assets/0.Bdga2HVs.css deleted file mode 100644 index 3c2ed7d..0000000 --- a/backend/internal/http/web/_app/immutable/assets/0.Bdga2HVs.css +++ /dev/null @@ -1,2 +0,0 @@ -/*! tailwindcss v4.3.3 | 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-border-style:solid;--tw-font-weight:initial;--tw-outline-style:solid;--tw-duration:initial;--tw-leading:initial;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-ease:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, 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-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-700:oklch(50.5% .213 27.518);--color-red-900:oklch(39.6% .141 25.723);--color-green-300:oklch(87.1% .15 154.449);--color-green-700:oklch(52.7% .154 150.069);--color-cyan-600:oklch(60.9% .126 221.723);--color-sky-300:oklch(82.8% .111 230.318);--color-sky-700:oklch(50% .134 242.749);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-900:oklch(37.9% .146 265.522);--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-800:oklch(27.8% .033 256.848);--color-stone-50:oklch(98.5% .001 106.423);--color-stone-100:oklch(97% .001 106.424);--color-stone-200:oklch(92.3% .003 48.717);--color-stone-300:oklch(86.9% .005 56.366);--color-stone-400:oklch(70.9% .01 56.259);--color-stone-500:oklch(55.3% .013 58.071);--color-stone-600:oklch(44.4% .011 73.639);--color-stone-700:oklch(37.4% .01 67.558);--color-stone-800:oklch(26.8% .007 34.298);--color-stone-900:oklch(21.6% .006 56.043);--color-stone-950:oklch(14.7% .004 49.25);--color-white:#fff;--spacing:.25rem;--container-3xl:48rem;--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-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--font-weight-medium:500;--font-weight-bold:700;--radius-sm:.25rem;--radius-lg:.5rem;--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, 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;-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:where(:not(iframe)){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-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}input:where([type=text]),input:where(:not([type])),input:where([type=email]),input:where([type=url]),input:where([type=password]),input:where([type=number]),input:where([type=date]),input:where([type=datetime-local]),input:where([type=month]),input:where([type=search]),input:where([type=tel]),input:where([type=time]),input:where([type=week]),select:where([multiple]),textarea,select{appearance:none;--tw-shadow:0 0 #0000;background-color:#fff;border-width:1px;border-color:oklch(55.1% .027 264.364);border-radius:0;padding:.5rem .75rem;font-size:1rem;line-height:1.5rem}:is(input:where([type=text]),input:where(:not([type])),input:where([type=email]),input:where([type=url]),input:where([type=password]),input:where([type=number]),input:where([type=date]),input:where([type=datetime-local]),input:where([type=month]),input:where([type=search]),input:where([type=tel]),input:where([type=time]),input:where([type=week]),select:where([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:oklch(54.6% .245 262.881);--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:oklch(54.6% .245 262.881);outline:2px solid #0000}input::placeholder,textarea::placeholder{color:oklch(55.1% .027 264.364);opacity:1}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-date-and-time-value{min-height:1.5em;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-year-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-month-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-day-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-hour-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-minute-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-second-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-millisecond-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-meridiem-field{padding-top:0;padding-bottom:0}select{-webkit-print-color-adjust:exact;print-color-adjust:exact;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='oklch(55.1%25 0.027 264.364)' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-right:2.5rem}select:where([multiple]),select:where([size]:not([size="1"])){background-image:initial;background-position:initial;background-repeat:unset;background-size:initial;print-color-adjust:unset;padding-right:.75rem}input:where([type=checkbox]),input:where([type=radio]){appearance:none;-webkit-print-color-adjust:exact;print-color-adjust:exact;vertical-align:middle;-webkit-user-select:none;user-select:none;color:oklch(54.6% .245 262.881);--tw-shadow:0 0 #0000;background-color:#fff;background-origin:border-box;border-width:1px;border-color:oklch(55.1% .027 264.364);flex-shrink:0;width:1rem;height:1rem;padding:0;display:inline-block}input:where([type=checkbox]){border-radius:0}input:where([type=radio]){border-radius:100%}input:where([type=checkbox]):focus,input:where([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:oklch(54.6% .245 262.881);--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}input:where([type=checkbox]):checked,input:where([type=radio]):checked{background-color:currentColor;background-position:50%;background-repeat:no-repeat;background-size:100% 100%;border-color:#0000}input:where([type=checkbox]):checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e")}@media (forced-colors:active){input:where([type=checkbox]):checked{appearance:auto}}input:where([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")}@media (forced-colors:active){input:where([type=radio]):checked{appearance:auto}}input:where([type=checkbox]):checked:hover,input:where([type=checkbox]):checked:focus,input:where([type=radio]):checked:hover,input:where([type=radio]):checked:focus{background-color:currentColor;border-color:#0000}input:where([type=checkbox]):indeterminate{background-color:currentColor;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e");background-position:50%;background-repeat:no-repeat;background-size:100% 100%;border-color:#0000}@media (forced-colors:active){input:where([type=checkbox]):indeterminate{appearance:auto}}input:where([type=checkbox]):indeterminate:hover,input:where([type=checkbox]):indeterminate:focus{background-color:currentColor;border-color:#0000}input:where([type=file]){background:unset;border-color:inherit;font-size:unset;line-height:inherit;border-width:0;border-radius:0;padding:0}input:where([type=file]):focus{outline:1px solid buttontext;outline:1px auto -webkit-focus-ring-color}}@layer components;@layer utilities{.visible{visibility:visible}.z-10{z-index:10}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.m-2{margin:calc(var(--spacing) * 2)}.m-54{margin:calc(var(--spacing) * 54)}.m-71{margin:calc(var(--spacing) * 71)}.m-143{margin:calc(var(--spacing) * 143)}.m-209{margin:calc(var(--spacing) * 209)}.m-214{margin:calc(var(--spacing) * 214)}.m-357{margin:calc(var(--spacing) * 357)}.m-375{margin:calc(var(--spacing) * 375)}.m-572{margin:calc(var(--spacing) * 572)}.m-auto{margin:auto}.mx-1{margin-inline:var(--spacing)}.mx-4{margin-inline:calc(var(--spacing) * 4)}.my-1{margin-block:var(--spacing)}.my-2{margin-block:calc(var(--spacing) * 2)}.my-4{margin-block:calc(var(--spacing) * 4)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mr-1{margin-right:var(--spacing)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-4{margin-left:calc(var(--spacing) * 4)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-10{height:calc(var(--spacing) * 10)}.h-full{height:100%}.h-screen{height:100vh}.w-6{width:calc(var(--spacing) * 6)}.w-20{width:calc(var(--spacing) * 20)}.w-96{width:calc(var(--spacing) * 96)}.w-full{width:100%}.max-w-full{max-width:100%}.flex-1{flex:1}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-\[repeat\(auto-fit\,minmax\(150px\,1fr\)\)\]{grid-template-columns:repeat(auto-fit,minmax(150px,1fr))}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.items-center{align-items:center}.justify-center{justify-content:center}.gap-2{gap:calc(var(--spacing) * 2)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.overflow-scroll{overflow:scroll}.overflow-y-scroll{overflow-y:scroll}.rounded{border-radius:.25rem}.rounded-full{border-radius:2147483647px}.rounded-lg{border-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-stone-200{border-color:var(--color-stone-200)}.border-stone-500{border-color:var(--color-stone-500)}.bg-cyan-600{background-color:var(--color-cyan-600)}.bg-red-900{background-color:var(--color-red-900)}.bg-stone-300{background-color:var(--color-stone-300)}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.py-1{padding-block:var(--spacing)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.text-red-300{color:var(--color-red-300)}.text-red-700{color:var(--color-red-700)}.text-stone-500{color:var(--color-stone-500)}.text-white{color:var(--color-white)}.italic{font-style:italic}.opacity-50{opacity:.5}.outline{outline-style:var(--tw-outline-style);outline-width:1px}@media (width>=48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}.dark\:border-stone-800:where(.dark,.dark *){border-color:var(--color-stone-800)}.dark\:bg-stone-700:where(.dark,.dark *){background-color:var(--color-stone-700)}.dark\:text-red-400:where(.dark,.dark *){color:var(--color-red-400)}}html{height:100%}body{background-color:var(--color-stone-100);height:100%;color:var(--color-stone-950)}body:where(.dark,.dark *){background-color:var(--color-stone-950);color:var(--color-stone-100)}.formelement>label{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--color-stone-600);text-transform:uppercase}.formelement>label:where(.dark,.dark *){color:var(--color-stone-400)}hr{border-color:var(--color-stone-200)}hr:where(.dark,.dark *){border-color:var(--color-stone-800)}h2{margin-bottom:calc(var(--spacing) * 4);font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.container{max-width:var(--container-3xl);margin-inline:auto}.pointer{cursor:pointer}.bt{appearance:button;min-width:calc(var(--spacing) * 40);cursor:pointer;background-color:var(--color-stone-300);padding-inline:calc(var(--spacing) * 4);padding-block:var(--spacing);--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold);transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.3s;border-radius:.25rem;transition-duration:.3s}@media (hover:hover){.bt:hover{background-color:var(--color-stone-200)}}.bt:where(.dark,.dark *){background-color:var(--color-stone-800)}@media (hover:hover){.bt:where(.dark,.dark *):hover{background-color:var(--color-stone-700)}}.bt.small{min-width:0;padding-inline:calc(var(--spacing) * 2);padding-block:var(--spacing)}.bt.changed,.bt.saving{background-color:var(--color-sky-300)}:is(.bt.changed,.bt.saving):where(.dark,.dark *){background-color:var(--color-sky-700)}.bt.saved{background-color:var(--color-green-300)}.bt.saved:where(.dark,.dark *){background-color:var(--color-green-700)}.bt.error{background-color:var(--color-red-300)}.bt.error:where(.dark,.dark *){background-color:var(--color-red-700)}.bt.disabled{color:var(--color-stone-400)}@media (hover:hover){.bt.disabled:hover{background-color:var(--color-stone-200)}.bt.disabled:where(.dark,.dark *):hover{background-color:var(--color-stone-800)}}.menuitem{color:var(--color-stone-950)}.menuitem:where(.dark,.dark *){color:var(--color-stone-300)}@media (hover:hover){.menuitem:hover:where(.dark,.dark *){color:var(--color-stone-50)}}.header{padding-block:calc(var(--spacing) * 2);font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height));--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.public h1{margin-bottom:calc(var(--spacing) * 4);font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height));--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.profile a,.public a{background-color:var(--color-sky-300)}:is(.profile a,.public a):where(.dark,.dark *){background-color:var(--color-sky-700)}#outer{flex-direction:row;height:100%;display:flex}#main{flex-direction:column;width:100%;display:flex}#sidebar{min-width:calc(var(--spacing) * 64);border-right-style:var(--tw-border-style);border-right-width:1px;border-right-color:var(--color-stone-200);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.3s;transition-duration:.3s}#sidebar:where(.dark,.dark *){border-color:var(--color-stone-800)}#content{padding:calc(var(--spacing) * 2)}#hamburgerDesktop,#hamburgerMobile{display:none}@media (width>=640px){#hamburgerDesktop{display:inline}.desktopMenuClosed #sidebar{width:calc(var(--spacing) * 10);min-width:calc(var(--spacing) * 10)}}@media not all and (width>=640px){#hamburgerMobile{display:inline}#main{margin-left:calc(var(--spacing) * 10)}#sidebar{background-color:var(--color-stone-100);width:100%;height:100%;position:fixed;left:0}#sidebar:where(.dark,.dark *){background-color:var(--color-stone-950)}.mobileMenuClosed #sidebar{width:calc(var(--spacing) * 10);min-width:calc(var(--spacing) * 10);position:fixed}}.formgroup{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-stone-300);background-color:var(--color-stone-100);padding:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));border-radius:.25rem}.formgroup:where(.dark,.dark *){border-color:var(--color-stone-700);background-color:var(--color-stone-900)}.formelement{margin-bottom:calc(var(--spacing) * 3)}.textinput{height:calc(var(--spacing) * 8);border-color:var(--color-stone-700);background-color:var(--color-stone-50);width:100%;padding-inline:calc(var(--spacing) * 2);padding-block:var(--spacing);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-stone-900);border-radius:.25rem}.textinput:where(.dark,.dark *){background-color:var(--color-stone-950);color:var(--color-stone-100)}.areainput{border-color:var(--color-stone-700);background-color:var(--color-stone-50);width:100%;padding-inline:calc(var(--spacing) * 2);padding-block:var(--spacing);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-stone-900);border-radius:.25rem}.areainput:where(.dark,.dark *){background-color:var(--color-stone-950);color:var(--color-stone-100)}.svelte-select{height:calc(var(--spacing) * 8);--tw-border-style:none;width:100%;color:var(--color-stone-900);border-style:none;display:flex;position:relative}.svelte-select:where(.dark,.dark *){background-color:var(--color-stone-950);color:var(--color-stone-100)}.svelte-select .value-container{flex:1;position:relative}.svelte-select input{height:calc(var(--spacing) * 8);cursor:default;border-color:var(--color-stone-700);width:100%;padding-inline:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing) * 10);line-height:calc(var(--spacing) * 10);color:var(--color-stone-100);background-color:#0000;border-radius:.25rem;margin:0;padding-block:0;position:absolute;top:0;left:0}.svelte-select.disabled{border-color:var(--color-gray-200);background-color:var(--color-gray-200);color:var(--color-gray-600)}.svelte-select.disabled input::placeholder{color:var(--color-gray-400);opacity:1}.svelte-select>.value-container>.selected-item{height:calc(var(--spacing) * 8);padding-inline:calc(var(--spacing) * 4);--tw-leading:calc(var(--spacing) * 8);line-height:calc(var(--spacing) * 8);overflow-x:hidden}.svelte-select>.value-container>.selected-item:focus{--tw-outline-style:none;outline-style:none}.svelte-select .hide-selected-item{display:none}.svelte-select .indicators{pointer-events:none;height:calc(var(--spacing) * 8);--tw-translate-y:0px;translate:var(--tw-translate-x) var(--tw-translate-y);color:var(--color-gray-200);align-items:center;display:flex;position:absolute;top:0;bottom:0;right:0}.svelte-select .icons>*{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;--tw-ease:var(--ease-in-out);transition-duration:.2s;transition-timing-function:var(--ease-in-out)}.svelte-select .icons>:focus{--tw-outline-style:none;outline-style:none}.svelte-select .clear-select{pointer-events:auto}.svelte-select.focused .icons,.svelte-select .chevron:hover,.svelte-select .clear-select:hover{color:var(--color-gray-600)}.svelte-select .clear-select{height:calc(var(--spacing) * 5);width:calc(var(--spacing) * 9);padding-inline:calc(var(--spacing) * 2);color:var(--color-gray-300);flex:none}.svelte-select .chevron{height:calc(var(--spacing) * 5);width:calc(var(--spacing) * 9);border-left-style:var(--tw-border-style);padding-top:0;padding-right:calc(var(--spacing) * 2);padding-left:calc(var(--spacing) * 2);color:var(--color-gray-300);border-left-width:2px;display:flex}.svelte-select.multi{height:auto;padding-right:calc(var(--spacing) * 9);padding-left:calc(var(--spacing) * 4);flex-wrap:wrap;align-items:stretch}.svelte-select.multi input{margin:0;padding:0;position:relative}.svelte-select.error{border-color:var(--color-red-500);background-color:var(--color-white)}.a11y-text{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.svelte-select-list{z-index:10;max-height:calc(var(--spacing) * 64);border-radius:var(--radius-sm);--tw-border-style:none;background-color:var(--color-stone-50);--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);width:100%;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);border-style:none;position:absolute;left:0;right:0;overflow-y:auto}.svelte-select-list:where(.dark,.dark *){background-color:var(--color-stone-800)}.svelte-select-list .list-group-title{height:calc(var(--spacing) * 8);cursor:default;padding-inline:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing) * 10);line-height:calc(var(--spacing) * 10);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);text-overflow:ellipsis;white-space:nowrap;color:var(--color-gray-400);text-transform:uppercase}.svelte-select-list .empty{padding-block:calc(var(--spacing) * 5);text-align:center;color:var(--color-gray-500)}.svelte-select-item{height:calc(var(--spacing) * 8);cursor:default;padding-inline:calc(var(--spacing) * 5);--tw-leading:calc(var(--spacing) * 10);line-height:calc(var(--spacing) * 10);text-overflow:ellipsis;white-space:nowrap;color:var(--color-gray-800);overflow:hidden}.item.group-item{padding-inline:calc(var(--spacing) * 4)}.item.active{background-color:var(--color-blue-600);color:var(--color-white)}.item.active:where(.dark,.dark *){background-color:var(--color-blue-900)}.item.not-selectable{color:var(--color-gray-300)}.item.first{border-top-left-radius:var(--radius-sm);border-top-right-radius:var(--radius-sm)}.item.hover:not(.active){background-color:var(--color-blue-100)}.item.hover:not(.active):where(.dark,.dark *){background-color:var(--color-stone-700)}.multi input{flex:40px}.multi-item{margin-top:var(--spacing);margin-right:var(--spacing);height:calc(var(--spacing) * 8);cursor:default;border-radius:var(--radius-sm);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-gray-200);background-color:var(--color-gray-100);max-width:100%;padding-right:var(--spacing);padding-left:var(--spacing);--tw-leading:calc(var(--spacing) * 8);line-height:calc(var(--spacing) * 8);text-overflow:ellipsis;white-space:nowrap;align-items:center;display:flex;overflow:hidden}@media (hover:hover){.multi-item.disabled:hover{background-color:var(--color-gray-300);color:var(--color-gray-500)}}.multi-item-clear{width:calc(var(--spacing) * 5);justify-content:center;align-items:center;display:flex}.list-item{list-style-type:none}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-duration{syntax:"*";inherits:false}@property --tw-leading{syntax:"*";inherits:false}@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-ease{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}@keyframes spin{to{transform:rotate(360deg)}} diff --git a/backend/internal/http/web/_app/immutable/assets/0.PdzDvXHc.css b/backend/internal/http/web/_app/immutable/assets/0.PdzDvXHc.css new file mode 100644 index 0000000..d49ce03 --- /dev/null +++ b/backend/internal/http/web/_app/immutable/assets/0.PdzDvXHc.css @@ -0,0 +1,2 @@ +/*! tailwindcss v4.3.3 | 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-border-style:solid;--tw-font-weight:initial;--tw-outline-style:solid;--tw-duration:initial;--tw-leading:initial;--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-ease:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, 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-300:oklch(80.8% .114 19.571);--color-red-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-red-700:oklch(50.5% .213 27.518);--color-red-900:oklch(39.6% .141 25.723);--color-green-300:oklch(87.1% .15 154.449);--color-green-700:oklch(52.7% .154 150.069);--color-cyan-400:oklch(78.9% .154 211.53);--color-cyan-600:oklch(60.9% .126 221.723);--color-sky-300:oklch(82.8% .111 230.318);--color-sky-700:oklch(50% .134 242.749);--color-blue-100:oklch(93.2% .032 255.585);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-900:oklch(37.9% .146 265.522);--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-800:oklch(27.8% .033 256.848);--color-stone-50:oklch(98.5% .001 106.423);--color-stone-100:oklch(97% .001 106.424);--color-stone-200:oklch(92.3% .003 48.717);--color-stone-300:oklch(86.9% .005 56.366);--color-stone-400:oklch(70.9% .01 56.259);--color-stone-500:oklch(55.3% .013 58.071);--color-stone-600:oklch(44.4% .011 73.639);--color-stone-700:oklch(37.4% .01 67.558);--color-stone-800:oklch(26.8% .007 34.298);--color-stone-900:oklch(21.6% .006 56.043);--color-stone-950:oklch(14.7% .004 49.25);--color-white:#fff;--spacing:.25rem;--container-3xl:48rem;--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-3xl:1.875rem;--text-3xl--line-height:calc(2.25 / 1.875);--font-weight-medium:500;--font-weight-bold:700;--radius-sm:.25rem;--radius-lg:.5rem;--ease-in-out:cubic-bezier(.4, 0, .2, 1);--animate-spin:spin 1s linear infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, 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;-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:where(:not(iframe)){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-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}input:where([type=text]),input:where(:not([type])),input:where([type=email]),input:where([type=url]),input:where([type=password]),input:where([type=number]),input:where([type=date]),input:where([type=datetime-local]),input:where([type=month]),input:where([type=search]),input:where([type=tel]),input:where([type=time]),input:where([type=week]),select:where([multiple]),textarea,select{appearance:none;--tw-shadow:0 0 #0000;background-color:#fff;border-width:1px;border-color:oklch(55.1% .027 264.364);border-radius:0;padding:.5rem .75rem;font-size:1rem;line-height:1.5rem}:is(input:where([type=text]),input:where(:not([type])),input:where([type=email]),input:where([type=url]),input:where([type=password]),input:where([type=number]),input:where([type=date]),input:where([type=datetime-local]),input:where([type=month]),input:where([type=search]),input:where([type=tel]),input:where([type=time]),input:where([type=week]),select:where([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:oklch(54.6% .245 262.881);--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:oklch(54.6% .245 262.881);outline:2px solid #0000}input::placeholder,textarea::placeholder{color:oklch(55.1% .027 264.364);opacity:1}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-date-and-time-value{min-height:1.5em;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-year-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-month-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-day-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-hour-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-minute-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-second-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-millisecond-field{padding-top:0;padding-bottom:0}::-webkit-datetime-edit-meridiem-field{padding-top:0;padding-bottom:0}select{-webkit-print-color-adjust:exact;print-color-adjust:exact;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='oklch(55.1%25 0.027 264.364)' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-right:2.5rem}select:where([multiple]),select:where([size]:not([size="1"])){background-image:initial;background-position:initial;background-repeat:unset;background-size:initial;print-color-adjust:unset;padding-right:.75rem}input:where([type=checkbox]),input:where([type=radio]){appearance:none;-webkit-print-color-adjust:exact;print-color-adjust:exact;vertical-align:middle;-webkit-user-select:none;user-select:none;color:oklch(54.6% .245 262.881);--tw-shadow:0 0 #0000;background-color:#fff;background-origin:border-box;border-width:1px;border-color:oklch(55.1% .027 264.364);flex-shrink:0;width:1rem;height:1rem;padding:0;display:inline-block}input:where([type=checkbox]){border-radius:0}input:where([type=radio]){border-radius:100%}input:where([type=checkbox]):focus,input:where([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:oklch(54.6% .245 262.881);--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}input:where([type=checkbox]):checked,input:where([type=radio]):checked{background-color:currentColor;background-position:50%;background-repeat:no-repeat;background-size:100% 100%;border-color:#0000}input:where([type=checkbox]):checked{background-image:url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e")}@media (forced-colors:active){input:where([type=checkbox]):checked{appearance:auto}}input:where([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")}@media (forced-colors:active){input:where([type=radio]):checked{appearance:auto}}input:where([type=checkbox]):checked:hover,input:where([type=checkbox]):checked:focus,input:where([type=radio]):checked:hover,input:where([type=radio]):checked:focus{background-color:currentColor;border-color:#0000}input:where([type=checkbox]):indeterminate{background-color:currentColor;background-image:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e");background-position:50%;background-repeat:no-repeat;background-size:100% 100%;border-color:#0000}@media (forced-colors:active){input:where([type=checkbox]):indeterminate{appearance:auto}}input:where([type=checkbox]):indeterminate:hover,input:where([type=checkbox]):indeterminate:focus{background-color:currentColor;border-color:#0000}input:where([type=file]){background:unset;border-color:inherit;font-size:unset;line-height:inherit;border-width:0;border-radius:0;padding:0}input:where([type=file]):focus{outline:1px solid buttontext;outline:1px auto -webkit-focus-ring-color}}@layer components;@layer utilities{.visible{visibility:visible}.z-10{z-index:10}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.m-2{margin:calc(var(--spacing) * 2)}.m-54{margin:calc(var(--spacing) * 54)}.m-71{margin:calc(var(--spacing) * 71)}.m-143{margin:calc(var(--spacing) * 143)}.m-209{margin:calc(var(--spacing) * 209)}.m-214{margin:calc(var(--spacing) * 214)}.m-357{margin:calc(var(--spacing) * 357)}.m-375{margin:calc(var(--spacing) * 375)}.m-572{margin:calc(var(--spacing) * 572)}.m-auto{margin:auto}.mx-1{margin-inline:var(--spacing)}.mx-4{margin-inline:calc(var(--spacing) * 4)}.my-1{margin-block:var(--spacing)}.my-2{margin-block:calc(var(--spacing) * 2)}.my-4{margin-block:calc(var(--spacing) * 4)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mr-1{margin-right:var(--spacing)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-4{margin-left:calc(var(--spacing) * 4)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-10{height:calc(var(--spacing) * 10)}.h-full{height:100%}.h-screen{height:100vh}.w-6{width:calc(var(--spacing) * 6)}.w-20{width:calc(var(--spacing) * 20)}.w-96{width:calc(var(--spacing) * 96)}.w-full{width:100%}.max-w-full{max-width:100%}.flex-1{flex:1}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-\[repeat\(auto-fit\,minmax\(150px\,1fr\)\)\]{grid-template-columns:repeat(auto-fit,minmax(150px,1fr))}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.items-center{align-items:center}.justify-center{justify-content:center}.gap-2{gap:calc(var(--spacing) * 2)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-x-4{column-gap:calc(var(--spacing) * 4)}.overflow-scroll{overflow:scroll}.overflow-y-scroll{overflow-y:scroll}.rounded{border-radius:.25rem}.rounded-full{border-radius:2147483647px}.rounded-lg{border-radius:var(--radius-lg)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-stone-200{border-color:var(--color-stone-200)}.border-stone-500{border-color:var(--color-stone-500)}.bg-cyan-600{background-color:var(--color-cyan-600)}.bg-red-900{background-color:var(--color-red-900)}.bg-stone-300{background-color:var(--color-stone-300)}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.py-1{padding-block:var(--spacing)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.text-red-300{color:var(--color-red-300)}.text-red-700{color:var(--color-red-700)}.text-stone-500{color:var(--color-stone-500)}.text-white{color:var(--color-white)}.italic{font-style:italic}.opacity-50{opacity:.5}.outline{outline-style:var(--tw-outline-style);outline-width:1px}@media (width>=48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}.dark\:border-stone-800:where(.dark,.dark *){border-color:var(--color-stone-800)}.dark\:bg-stone-700:where(.dark,.dark *){background-color:var(--color-stone-700)}.dark\:text-red-400:where(.dark,.dark *){color:var(--color-red-400)}}html{height:100%}body{background-color:var(--color-stone-100);height:100%;color:var(--color-stone-950)}body:where(.dark,.dark *){background-color:var(--color-stone-950);color:var(--color-stone-100)}.formelement>label{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height));color:var(--color-stone-600);text-transform:uppercase}.formelement>label:where(.dark,.dark *){color:var(--color-stone-400)}hr{border-color:var(--color-stone-200)}hr:where(.dark,.dark *){border-color:var(--color-stone-800)}h2{margin-bottom:calc(var(--spacing) * 4);font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height));--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.container{max-width:var(--container-3xl);margin-inline:auto}.pointer{cursor:pointer}.bt{appearance:button;min-width:calc(var(--spacing) * 40);cursor:pointer;background-color:var(--color-stone-300);padding-inline:calc(var(--spacing) * 4);padding-block:var(--spacing);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.3s;border-radius:.25rem;transition-duration:.3s}@media (hover:hover){.bt:hover{background-color:var(--color-stone-200)}}.bt:where(.dark,.dark *){background-color:var(--color-stone-800)}@media (hover:hover){.bt:where(.dark,.dark *):hover{background-color:var(--color-stone-700)}}.bt.small{min-width:0;padding-inline:calc(var(--spacing) * 2);padding-block:var(--spacing)}.bt.changed,.bt.saving{background-color:var(--color-cyan-400)}:is(.bt.changed,.bt.saving):where(.dark,.dark *){background-color:var(--color-cyan-600)}.bt.saved{background-color:var(--color-green-300)}.bt.saved:where(.dark,.dark *){background-color:var(--color-green-700)}.bt.error{background-color:var(--color-red-300)}.bt.error:where(.dark,.dark *){background-color:var(--color-red-700)}.bt.disabled{color:var(--color-stone-400)}@media (hover:hover){.bt.disabled:hover{background-color:var(--color-stone-200)}.bt.disabled:where(.dark,.dark *):hover{background-color:var(--color-stone-800)}}.bt.highlight{color:var(--color-sky-700)}.bt.highlight:where(.dark,.dark *){color:var(--color-sky-300)}.menuitem{color:var(--color-stone-950)}.menuitem:where(.dark,.dark *){color:var(--color-stone-300)}@media (hover:hover){.menuitem:hover:where(.dark,.dark *){color:var(--color-stone-50)}}.header{padding-block:calc(var(--spacing) * 2);font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height));--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.public h1{margin-bottom:calc(var(--spacing) * 4);font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height));--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.profile a,.public a{background-color:var(--color-sky-300)}:is(.profile a,.public a):where(.dark,.dark *){background-color:var(--color-sky-700)}#outer{flex-direction:row;height:100%;display:flex}#main{flex-direction:column;width:100%;display:flex}#sidebar{min-width:calc(var(--spacing) * 64);border-right-style:var(--tw-border-style);border-right-width:1px;border-right-color:var(--color-stone-200);transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.3s;transition-duration:.3s}#sidebar:where(.dark,.dark *){border-color:var(--color-stone-800)}#content{padding:calc(var(--spacing) * 2)}#hamburgerDesktop,#hamburgerMobile{display:none}@media (width>=640px){#hamburgerDesktop{display:inline}.desktopMenuClosed #sidebar{width:calc(var(--spacing) * 10);min-width:calc(var(--spacing) * 10)}}@media not all and (width>=640px){#hamburgerMobile{display:inline}#main{margin-left:calc(var(--spacing) * 10)}#sidebar{background-color:var(--color-stone-100);width:100%;height:100%;position:fixed;left:0}#sidebar:where(.dark,.dark *){background-color:var(--color-stone-950)}.mobileMenuClosed #sidebar{width:calc(var(--spacing) * 10);min-width:calc(var(--spacing) * 10);position:fixed}}.formgroup{border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-stone-300);background-color:var(--color-stone-100);padding:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));border-radius:.25rem}.formgroup:where(.dark,.dark *){border-color:var(--color-stone-700);background-color:var(--color-stone-900)}.formelement{margin-bottom:calc(var(--spacing) * 3)}.textinput{height:calc(var(--spacing) * 8);border-color:var(--color-stone-700);background-color:var(--color-stone-50);width:100%;padding-inline:calc(var(--spacing) * 2);padding-block:var(--spacing);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-stone-900);border-radius:.25rem}.textinput:where(.dark,.dark *){background-color:var(--color-stone-950);color:var(--color-stone-100)}.areainput{border-color:var(--color-stone-700);background-color:var(--color-stone-50);width:100%;padding-inline:calc(var(--spacing) * 2);padding-block:var(--spacing);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));color:var(--color-stone-900);border-radius:.25rem}.areainput:where(.dark,.dark *){background-color:var(--color-stone-950);color:var(--color-stone-100)}.svelte-select{height:calc(var(--spacing) * 8);--tw-border-style:none;width:100%;color:var(--color-stone-900);border-style:none;display:flex;position:relative}.svelte-select:where(.dark,.dark *){background-color:var(--color-stone-950);color:var(--color-stone-100)}.svelte-select .value-container{flex:1;position:relative}.svelte-select input{height:calc(var(--spacing) * 8);cursor:default;border-color:var(--color-stone-700);width:100%;padding-inline:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing) * 10);line-height:calc(var(--spacing) * 10);color:var(--color-stone-100);background-color:#0000;border-radius:.25rem;margin:0;padding-block:0;position:absolute;top:0;left:0}.svelte-select.disabled{border-color:var(--color-gray-200);background-color:var(--color-gray-200);color:var(--color-gray-600)}.svelte-select.disabled input::placeholder{color:var(--color-gray-400);opacity:1}.svelte-select>.value-container>.selected-item{height:calc(var(--spacing) * 8);padding-inline:calc(var(--spacing) * 4);--tw-leading:calc(var(--spacing) * 8);line-height:calc(var(--spacing) * 8);overflow-x:hidden}.svelte-select>.value-container>.selected-item:focus{--tw-outline-style:none;outline-style:none}.svelte-select .hide-selected-item{display:none}.svelte-select .indicators{pointer-events:none;height:calc(var(--spacing) * 8);--tw-translate-y:0px;translate:var(--tw-translate-x) var(--tw-translate-y);color:var(--color-gray-200);align-items:center;display:flex;position:absolute;top:0;bottom:0;right:0}.svelte-select .icons>*{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration));--tw-duration:.2s;--tw-ease:var(--ease-in-out);transition-duration:.2s;transition-timing-function:var(--ease-in-out)}.svelte-select .icons>:focus{--tw-outline-style:none;outline-style:none}.svelte-select .clear-select{pointer-events:auto}.svelte-select.focused .icons,.svelte-select .chevron:hover,.svelte-select .clear-select:hover{color:var(--color-gray-600)}.svelte-select .clear-select{height:calc(var(--spacing) * 5);width:calc(var(--spacing) * 9);padding-inline:calc(var(--spacing) * 2);color:var(--color-gray-300);flex:none}.svelte-select .chevron{height:calc(var(--spacing) * 5);width:calc(var(--spacing) * 9);border-left-style:var(--tw-border-style);padding-top:0;padding-right:calc(var(--spacing) * 2);padding-left:calc(var(--spacing) * 2);color:var(--color-gray-300);border-left-width:2px;display:flex}.svelte-select.multi{height:auto;padding-right:calc(var(--spacing) * 9);padding-left:calc(var(--spacing) * 4);flex-wrap:wrap;align-items:stretch}.svelte-select.multi input{margin:0;padding:0;position:relative}.svelte-select.error{border-color:var(--color-red-500);background-color:var(--color-white)}.a11y-text{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.svelte-select-list{z-index:10;max-height:calc(var(--spacing) * 64);border-radius:var(--radius-sm);--tw-border-style:none;background-color:var(--color-stone-50);--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);width:100%;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);border-style:none;position:absolute;left:0;right:0;overflow-y:auto}.svelte-select-list:where(.dark,.dark *){background-color:var(--color-stone-800)}.svelte-select-list .list-group-title{height:calc(var(--spacing) * 8);cursor:default;padding-inline:calc(var(--spacing) * 2);font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height));--tw-leading:calc(var(--spacing) * 10);line-height:calc(var(--spacing) * 10);--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium);text-overflow:ellipsis;white-space:nowrap;color:var(--color-gray-400);text-transform:uppercase}.svelte-select-list .empty{padding-block:calc(var(--spacing) * 5);text-align:center;color:var(--color-gray-500)}.svelte-select-item{height:calc(var(--spacing) * 8);cursor:default;padding-inline:calc(var(--spacing) * 5);--tw-leading:calc(var(--spacing) * 10);line-height:calc(var(--spacing) * 10);text-overflow:ellipsis;white-space:nowrap;color:var(--color-gray-800);overflow:hidden}.item.group-item{padding-inline:calc(var(--spacing) * 4)}.item.active{background-color:var(--color-blue-600);color:var(--color-white)}.item.active:where(.dark,.dark *){background-color:var(--color-blue-900)}.item.not-selectable{color:var(--color-gray-300)}.item.first{border-top-left-radius:var(--radius-sm);border-top-right-radius:var(--radius-sm)}.item.hover:not(.active){background-color:var(--color-blue-100)}.item.hover:not(.active):where(.dark,.dark *){background-color:var(--color-stone-700)}.multi input{flex:40px}.multi-item{margin-top:var(--spacing);margin-right:var(--spacing);height:calc(var(--spacing) * 8);cursor:default;border-radius:var(--radius-sm);border-style:var(--tw-border-style);border-width:1px;border-color:var(--color-gray-200);background-color:var(--color-gray-100);max-width:100%;padding-right:var(--spacing);padding-left:var(--spacing);--tw-leading:calc(var(--spacing) * 8);line-height:calc(var(--spacing) * 8);text-overflow:ellipsis;white-space:nowrap;align-items:center;display:flex;overflow:hidden}@media (hover:hover){.multi-item.disabled:hover{background-color:var(--color-gray-300);color:var(--color-gray-500)}}.multi-item-clear{width:calc(var(--spacing) * 5);justify-content:center;align-items:center;display:flex}.list-item{list-style-type:none}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-duration{syntax:"*";inherits:false}@property --tw-leading{syntax:"*";inherits:false}@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-ease{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}@keyframes spin{to{transform:rotate(360deg)}} diff --git a/backend/internal/http/web/_app/immutable/chunks/D3up1JC1.js b/backend/internal/http/web/_app/immutable/chunks/B0qrqti_.js similarity index 98% rename from backend/internal/http/web/_app/immutable/chunks/D3up1JC1.js rename to backend/internal/http/web/_app/immutable/chunks/B0qrqti_.js index de8cb27..6531254 100644 --- a/backend/internal/http/web/_app/immutable/chunks/D3up1JC1.js +++ b/backend/internal/http/web/_app/immutable/chunks/B0qrqti_.js @@ -1 +1 @@ -import{F as e,I as t,P as n,Q as r,X as i,nt as a,r as o,t as s}from"./39JK5HWF.js";var c=class{constructor(e,t){this.status=e,this.body=typeof t==`string`?{message:t}:t||{message:`Error: ${e}`}}toString(){return JSON.stringify(this.body)}},l=class{constructor(e,t){try{new Headers({location:t})}catch{throw Error(`Invalid redirect location ${JSON.stringify(t)}: this string contains characters that cannot be used in HTTP headers`)}this.status=e,this.location=t}},u=class extends Error{constructor(e,t,n){super(n),this.status=e,this.text=t}};new URL(`sveltekit-internal://`);function d(e,t){return e===`/`||t===`ignore`?e:t===`never`?e.endsWith(`/`)?e.slice(0,-1):e:t===`always`&&!e.endsWith(`/`)?e+`/`:e}function f(e){return e.split(`%25`).map(decodeURI).join(`%25`)}function p(e){for(let t in e)e[t]=decodeURIComponent(e[t]);return e}function m({href:e}){return e.split(`#`)[0]}function h(e,t,n,r=!1){let i=new URL(e);Object.defineProperty(i,"searchParams",{value:new Proxy(i.searchParams,{get(e,r){if(r===`get`||r===`getAll`||r===`has`)return(t,...i)=>(n(t),e[r](t,...i));t();let i=Reflect.get(e,r);return typeof i==`function`?i.bind(e):i}}),enumerable:!0,configurable:!0});let a=[`href`,`pathname`,`search`,`toString`,`toJSON`];r&&a.push(`hash`);for(let n of a)Object.defineProperty(i,n,{get(){return t(),e[n]},enumerable:!0,configurable:!0});return i}function g(){}function _(...e){let t=5381;for(let n of e)if(typeof n==`string`){let e=n.length;for(;e;)t=t*33^n.charCodeAt(--e)}else if(ArrayBuffer.isView(n)){let e=new Uint8Array(n.buffer,n.byteOffset,n.byteLength),r=e.length;for(;r;)t=t*33^e[--r]}else throw TypeError(`value must be a string or TypedArray`);return(t>>>0).toString(36)}new TextEncoder;function v(e){let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e((e instanceof Request?e.method:t?.method||`GET`)!==`GET`&&y.delete(x(e)),ee(e,t));var y=new Map;function b(e,t){let n=x(e,t),r=document.querySelector(n);if(r?.textContent){r.remove();let{body:e,...t}=JSON.parse(r.textContent);r.getAttribute(`data-b64`)!==null&&(e=v(e));let i=r.getAttribute(`data-ttl`);return i&&y.set(n,{body:e,init:t,ttl:1e3*Number(i)}),Promise.resolve(new Response(e,t))}return window.fetch(e,t)}function te(e,t,n){if(y.size>0){let t=x(e,n),r=y.get(t);if(r){if(performance.now(){let n=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(e);if(n)return t.push({name:n[1],matcher:n[2],optional:!1,rest:!0,chained:!0}),`(?:/([^]*))?`;let r=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(e);if(r)return t.push({name:r[1],matcher:r[2],optional:!0,rest:!1,chained:!0}),`(?:/([^/]+))?`;if(!e)return;let i=e.split(/\[(.+?)\](?!\])/);return`/`+i.map((e,n)=>{if(n%2){if(e.startsWith(`x+`))return ce(String.fromCharCode(parseInt(e.slice(2),16)));if(e.startsWith(`u+`))return ce(String.fromCharCode(...e.slice(2).split(`-`).map(e=>parseInt(e,16))));let[,r,a,o,s]=ne.exec(e);return t.push({name:o,matcher:s,optional:!!r,rest:!!a,chained:a?n===1&&i[0]===``:!1}),a?`([^]*?)`:r?`([^/]*)?`:`([^/]+?)`}return ce(e)}).join(``)}).join(``)}/?$`),params:t}}function ae(e){return e!==``&&!/^\([^)]+\)$/.test(e)}function oe(e){return e.slice(1).split(`/`).filter(ae)}function se(e,t,n){let r={},i=e.slice(1),a=i.filter(e=>e!==void 0),o=0;for(let e=0;ee).join(`/`),o=0),c===void 0)if(s.rest)c=``;else continue;if(!s.matcher||n[s.matcher](c)){r[s.name]=c;let n=t[e+1],l=i[e+1];n&&!n.rest&&n.optional&&l&&s.chained&&(o=0),!n&&!l&&Object.keys(r).length===a.length&&(o=0);continue}if(s.optional&&s.chained){o++;continue}return}if(!o)return r}function ce(e){return e.normalize().replace(/[[\]]/g,`\\$&`).replace(/%/g,`%25`).replace(/\//g,`%2[Ff]`).replace(/\?/g,`%3[Ff]`).replace(/#/g,`%23`).replace(/[.*+?^${}()|\\]/g,`\\$&`)}function le({nodes:e,server_loads:t,dictionary:n,matchers:r}){let i=new Set(t);return Object.entries(n).map(([t,[n,i,s]])=>{let{pattern:c,params:l}=ie(t),u={id:t,exec:e=>{let t=c.exec(e);if(t)return se(t,l,r)},errors:[1,...s||[]].map(t=>e[t]),layouts:[0,...i||[]].map(o),leaf:a(n)};return u.errors.length=u.layouts.length=Math.max(u.errors.length,u.layouts.length),u});function a(t){let n=t<0;return n&&(t=~t),[n,e[t]]}function o(t){return t===void 0?t:[i.has(t),e[t]]}}function ue(e,t=JSON.parse){try{return t(sessionStorage[e])}catch{}}function de(e,t,n=JSON.stringify){let r=n(t);try{sessionStorage[e]=r}catch{}}var S=globalThis.__sveltekit_1oispqz?.base??``,fe=globalThis.__sveltekit_1oispqz?.assets??S??``,pe=`1788613178637`,me=`sveltekit:snapshot`,he=`sveltekit:scroll`,ge=`sveltekit:states`,C=`sveltekit:history`,w=`sveltekit:navigation`,T={tap:1,hover:2,viewport:3,eager:4,off:-1,false:-1},E=location.origin;function _e(e){if(e instanceof URL)return e;let t=document.baseURI;if(!t){let e=document.getElementsByTagName(`base`);t=e.length?e[0].href:document.URL}return new URL(e,t)}function D(){return{x:pageXOffset,y:pageYOffset}}function O(e,t){return e.getAttribute(`data-sveltekit-${t}`)}var ve={...T,"":T.hover};function ye(e){let t=e.assignedSlot??e.parentNode;return t?.nodeType===11&&(t=t.host),t}function be(e,t){for(;e&&e!==t;){if(e.nodeName.toUpperCase()===`A`&&e.hasAttribute(`href`))return e;e=ye(e)}}function xe(e,t,n){let r;try{if(r=new URL(e instanceof SVGAElement?e.href.baseVal:e.href,document.baseURI),n&&r.hash.match(/^#[^/]/)){let e=location.hash.split(`#`)[1]||`/`;r.hash=`#${e}${r.hash}`}}catch{}let i=e instanceof SVGAElement?e.target.baseVal:e.target,a=!r||!!i||k(r,t,n)||(e.getAttribute(`rel`)||``).split(/\s+/).includes(`external`),o=r?.origin===E&&e.hasAttribute(`download`);return{url:r,external:a,target:i,download:o}}function Se(e){let t=null,n=null,r=null,i=null,a=null,o=null,s=e;for(;s&&s!==document.documentElement;)r===null&&(r=O(s,`preload-code`)),i===null&&(i=O(s,`preload-data`)),t===null&&(t=O(s,`keepfocus`)),n===null&&(n=O(s,`noscroll`)),a===null&&(a=O(s,`reload`)),o===null&&(o=O(s,`replacestate`)),s=ye(s);function c(e){switch(e){case``:case`true`:return!0;case`off`:case`false`:return!1;default:return}}return{preload_code:ve[r??`off`],preload_data:ve[i??`off`],keepfocus:c(t),noscroll:c(n),reload:c(a),replace_state:c(o)}}function Ce(e){let t=a(e),n=!0;function r(){n=!0,t.update(e=>e)}function i(e){n=!1,t.set(e)}function o(e){let r;return t.subscribe(t=>{(r===void 0||n&&t!==r)&&e(r=t)})}return{notify:r,set:i,subscribe:o}}var we={v:g};function Te(){let{set:e,subscribe:t}=a(!1),n;async function r(){clearTimeout(n);try{let t=await fetch(`${fe}/_app/version.json`,{headers:{pragma:`no-cache`,"cache-control":`no-cache`}});if(!t.ok)return!1;let r=(await t.json()).version!==pe;return r&&(e(!0),we.v(),clearTimeout(n)),r}catch{return!1}}return{subscribe:t,check:r}}function k(e,t,n){return e.origin!==E||!e.pathname.startsWith(t)?!0:n?e.pathname!==location.pathname:!1}function Ee(e){}var De=new Set([`load`,`prerender`,`csr`,`ssr`,`trailingSlash`,`config`]);[...De],[...new Set([...De])];function Oe(e){return e.filter(e=>e!=null)}function ke(e,t){return e+`/`+t}function Ae(e){return e instanceof c||e instanceof u?e.status:500}function je(e){return e instanceof u?e.text:`Internal Error`}var A,j,Me,Ne=o.toString().includes(`$$`)||/function \w+\(\) \{\}/.test(o.toString()),Pe=`a:`;Ne?(A={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL(Pe)},j={current:null},Me={current:!1}):(A=new class{#e=r({});get data(){return n(this.#e)}set data(e){i(this.#e,e)}#t=r(null);get form(){return n(this.#t)}set form(e){i(this.#t,e)}#n=r(null);get error(){return n(this.#n)}set error(e){i(this.#n,e)}#r=r({});get params(){return n(this.#r)}set params(e){i(this.#r,e)}#i=r({id:null});get route(){return n(this.#i)}set route(e){i(this.#i,e)}#a=r({});get state(){return n(this.#a)}set state(e){i(this.#a,e)}#o=r(-1);get status(){return n(this.#o)}set status(e){i(this.#o,e)}#s=r(new URL(Pe));get url(){return n(this.#s)}set url(e){i(this.#s,e)}},j=new class{#e=r(null);get current(){return n(this.#e)}set current(e){i(this.#e,e)}},Me=new class{#e=r(!1);get current(){return n(this.#e)}set current(e){i(this.#e,e)}},we.v=()=>Me.current=!0);function Fe(e){Object.assign(A,e)}var Ie={spanContext(){return Le},setAttribute(){return this},setAttributes(){return this},addEvent(){return this},setStatus(){return this},updateName(){return this},end(){return this},isRecording(){return!1},recordException(){return this},addLink(){return this},addLinks(){return this}},Le={traceId:``,spanId:``,traceFlags:0},{onMount:Re,tick:ze}=s,Be=new Set([`icon`,`shortcut icon`,`apple-touch-icon`]),M=null,N=ue(`sveltekit:scroll`)??{},P=ue(`sveltekit:snapshot`)??{},F={url:Ce({}),page:Ce({}),navigating:a(null),updated:Te()};function Ve(e){N[e]=D()}function He(e,t){let n=e+1;for(;N[n];)delete N[n],n+=1;for(n=t+1;P[n];)delete P[n],n+=1}function I(e,t=!1){return t?location.replace(e.href):location.href=e.href,new Promise(g)}async function Ue(){if(`serviceWorker`in navigator){let e=await navigator.serviceWorker.getRegistration(S||`/`);e&&await e.update()}}var We,Ge,L,R,Ke,z,qe={},Je={},Ye=[],Xe=[],B=null;function V(){B?.fork?.then(e=>e?.discard()),B=null,Q={element:void 0,href:void 0}}var H=new Map,Ze=new Set,Qe=new Set,U=new Set,W={branch:[],error:null,url:null,nav:null},$e=!1,G=!1,et=!0,K=!1,q=!1,tt=!1,nt=!1,rt,J,Y,X,it=new Set,at=new Map,ot=new Map;async function st(e,t,n){if(globalThis.__sveltekit_1oispqz.data){let{q:e={},p:t={},l:n={},f:r={}}=globalThis.__sveltekit_1oispqz.data;for(let t in e)qe[t]=e[t];for(let e in n)qe[e]=n[e];for(let e in r)qe[e]=r[e];for(let e in t)Je[e]=t[e]}document.URL!==location.href&&(location.href=location.href),z=e,await e.hooks.init?.(),We=le(e),R=document.documentElement,Ke=t,Ge=e.nodes[0],L=e.nodes[1],Ge(),L(),J=history.state?.[C],Y=history.state?.[w],J||(J=Y=Date.now(),history.replaceState({...history.state,[C]:J,[w]:Y},``));let r=N[J];function i(){r&&(history.scrollRestoration=`manual`,scrollTo(r.x,r.y))}n?(i(),await It(Ke,n)):(await Z({type:`enter`,url:_e(z.hash?Ht(new URL(location.href)):location.href),replace_state:!0}),i()),Ft()}function ct(){Ye.length=0,nt=!1}function lt(e){Xe.some(e=>e?.snapshot)&&(P[e]=Xe.map(e=>e?.snapshot?.capture()))}function ut(e){P[e]?.forEach((e,t)=>{Xe[t]?.snapshot?.restore(e)})}function dt(){Ve(J),de(he,N),lt(Y),de(me,P)}async function ft(e,n,r,i){let a,o;n.invalidateAll&&V(),await Z({type:`goto`,url:_e(e),keepfocus:n.keepFocus,noscroll:n.noScroll,replace_state:n.replaceState,state:n.state,redirect_count:r,nav_token:i,accept:()=>{if(n.invalidateAll){nt=!0,a=new Set;for(let[e,t]of at)for(let[n,r]of t)r.resource?.reset(),a.add(ke(e,n));o=new Set;for(let[e,t]of ot)for(let n of t.keys())o.add(ke(e,n))}n.invalidate&&n.invalidate.forEach(Pt)}}),n.invalidateAll&&t().then(t).then(()=>{for(let[e,t]of at)for(let[n,{resource:r}]of t)a?.has(ke(e,n))&&r.start();for(let[e,t]of ot)for(let[n,{resource:r}]of t)o?.has(ke(e,n))&&r.reconnect()})}async function pt(e){if(e.id!==B?.id){V();let t={};it.add(t),B={id:e.id,token:t,promise:Ct({...e,preload:t}).then(e=>(it.delete(t),e.type===`loaded`&&e.state.error&&V(),e)),fork:null}}return B.promise}async function mt(e){let t=(await Dt(e,!1))?.route;t&&await Promise.all([...t.layouts,t.leaf].filter(Boolean).map(e=>e[1]()))}async function ht(e,t,n){let r={params:W.params,route:{id:W.route?.id??null},url:new URL(location.href)};if(W={...e.state,nav:r},Fe(e.props.page),rt=new z.root({target:t,props:{...e.props,stores:F,components:Xe},hydrate:n,sync:!1,transformError:void 0}),await Promise.resolve(),n){let e={from:null,to:{...r,scroll:N[J]??D()},willUnload:!1,type:`enter`,complete:Promise.resolve()};U.forEach(t=>t(e))}ut(Y),G=!0}async function gt({url:e,params:t,branch:n,errors:r,status:i,error:a,route:o,form:s}){let c=`never`;if(S&&(e.pathname===S||e.pathname===S+`/`))c=`always`;else for(let e of n)e?.slash!==void 0&&(c=e.slash);e.pathname=d(e.pathname,c),e.search=e.search;let l={type:`loaded`,state:{url:e,params:t,branch:n,error:a,route:o},props:{constructors:Oe(n).map(e=>e.node.component),page:Vt(A)}};s!==void 0&&(l.props.form=s);let u={},f=!A,p=0;for(let e=0;e(s&&(c.route=!0),e[t])}),params:new Proxy(r,{get:(e,t)=>(s&&c.params.add(t),e[t])}),data:a?.data??null,url:h(n,()=>{s&&(c.url=!0)},e=>{s&&c.search_params.add(e)},z.hash),async fetch(t,r){t instanceof Request&&(r={body:t.method===`GET`||t.method===`HEAD`?void 0:await t.blob(),cache:t.cache,credentials:t.credentials,headers:[...t.headers].length>0?t?.headers:void 0,integrity:t.integrity,keepalive:t.keepalive,method:t.method,mode:t.mode,redirect:t.redirect,referrer:t.referrer,referrerPolicy:t.referrerPolicy,signal:t.signal,...r});let{resolved:i,promise:a}=vt(t,r,n);return s&&e(i.href),a},setHeaders:g,depends:e,parent(){return s&&(c.parent=!0),t()},untrack(e){s=!1;try{return e()}finally{s=!0}}};o=await l.universal.load.call(null,u)??null}return{node:l,loader:e,server:a,universal:l.universal?.load?{type:`data`,data:o,uses:c}:null,data:o??a?.data??null,slash:l.universal?.trailingSlash??a?.slash}}function vt(e,t,n){let r=e instanceof Request?e.url:e,i=new URL(r,n);return i.origin===n.origin&&(r=i.href.slice(n.origin.length)),{resolved:i,promise:G?te(r,i.href,t):b(r,t)}}function yt(e,t,n,r,i,a){if(nt)return!0;if(!i)return!1;if(i.parent&&e||i.route&&t||i.url&&n)return!0;for(let e of i.search_params)if(r.has(e))return!0;for(let e of i.params)if(a[e]!==W.params[e])return!0;for(let e of i.dependencies)if(Ye.some(t=>t(new URL(e))))return!0;return!1}function bt(e,t){return e?.type===`data`?e:e?.type===`skip`?t??null:null}function xt(e,t){if(!e)return new Set(t.searchParams.keys());let n=new Set([...e.searchParams.keys(),...t.searchParams.keys()]);for(let r of n){let i=e.searchParams.getAll(r),a=t.searchParams.getAll(r);i.every(e=>a.includes(e))&&a.every(e=>i.includes(e))&&n.delete(r)}return n}function St({error:e,url:t,route:n,params:r}){return{type:`loaded`,state:{error:e,url:t,route:n,params:r,branch:[]},props:{page:Vt(A),constructors:[]}}}async function Ct({id:e,invalidating:t,url:n,params:r,route:i,preload:a}){if(B?.id===e)return it.delete(B.token),B.promise;let{errors:o,layouts:s,leaf:u}=i,d=[...s,u];o.forEach(e=>e?.().catch(g)),d.forEach(e=>e?.[1]().catch(g));let f=W.url?e!==kt(W.url):!1,p=W.route?i.id!==W.route.id:!1,m=xt(W.url,n),h=!1,_=d.map(async(e,t)=>{if(!e)return;let a=W.branch[t];return e[1]===a?.loader&&!yt(h,p,f,m,a.universal?.uses,r)?a:(h=!0,_t({loader:e[1],url:n,params:r,route:i,parent:async()=>{let e={};for(let n=0;nPromise.resolve({}),server_data_node:bt(null)}),{node:await L(),loader:L,universal:null,server:null,data:null}],status:e,error:t,errors:[],route:null})}catch(t){if(t instanceof l){await ft(new URL(t.location,location.href),{},0);return}let a=await z.get_error_template(),o=await $(t,{url:n,params:i,route:r}),s=a({status:e,message:String(o?.message??``).replace(/&/g,`&`).replace(//g,`>`)}),c=new DOMParser().parseFromString(s,`text/html`);throw document.documentElement.replaceChild(document.adoptNode(c.head),document.head),document.documentElement.replaceChild(document.adoptNode(c.body),document.body),t}}async function Et(e){let t=e.href;if(H.has(t))return H.get(t);let n;try{let r=(async()=>{let t=await z.hooks.reroute({url:new URL(e),fetch:async(t,n)=>vt(t,n,e).promise})??e;if(typeof t==`string`){let n=new URL(e);z.hash?n.hash=t:n.pathname=t,t=n}return t})();H.set(t,r),n=await r}catch{H.delete(t);return}return n}async function Dt(e,t){if(e&&!k(e,S,z.hash)){let n=await Et(e);if(!n)return;let r=Ot(n);for(let n of We){let i=n.exec(r);if(i)return{id:kt(e),invalidating:t,route:n,params:p(i),url:e}}}}function Ot(e){return f(z.hash?e.hash.replace(/^#/,``).replace(/[?#].+/,``):e.pathname.slice(S.length))||`/`}function kt(e){return(z.hash?e.hash.replace(/^#/,``):e.pathname)+e.search}function At({url:e,type:t,intent:n,delta:r,event:i,scroll:a}){let o=!1,s=Bt(W,n,e,t,a??null);r!==void 0&&(s.navigation.delta=r),i!==void 0&&(s.navigation.event=i);let c={...s.navigation,cancel:()=>{o=!0,s.reject(Error(`navigation cancelled`))}};return K||Ze.forEach(e=>e(c)),o?null:s}async function Z({type:n,url:r,popped:i,keepfocus:a,noscroll:o,replace_state:s,state:c={},redirect_count:l=0,nav_token:d={},accept:f=g,block:p=g,event:m}){let h=X;X=d;let _=await Dt(r,!1),v=n===`enter`?Bt(W,_,r,n):At({url:r,type:n,delta:i?.delta,intent:_,scroll:i?.scroll,event:m});if(!v){p(),X===d&&(X=h);return}let ee=J,y=Y;f(),K=!0,G&&v.navigation.type!==`enter`&&F.navigating.set(j.current=v.navigation);let b=_&&await Ct(_);if(!b){if(k(r,S,z.hash))return await I(r,s);b=await jt(r,{id:null},await $(new u(404,`Not Found`,`Not found: ${r.pathname}`),{url:r,params:{},route:{id:null}}),404,s)}if(r=_?.url||r,X!==d){v.reject(Error(`navigation aborted`));return}if(!b)return;if(b.type===`redirect`){if(l<20){await Z({type:n,url:new URL(b.location,r),popped:i,keepfocus:a,noscroll:o,replace_state:s,state:c,redirect_count:l+1,nav_token:d}),v.fulfil(void 0);return}if(b=await Tt({status:500,error:await $(Error(`Redirect loop`),{url:r,params:{},route:{id:null}}),url:r,route:{id:null}}),!b)return}else if(b.props.page.status>=400&&await F.updated.check())return await Ue(),await I(r,s);if(ct(),Ve(ee),lt(y),b.props.page.url.pathname!==r.pathname&&(r.pathname=b.props.page.url.pathname),c=i?i.state:c,!i){let e=+!s,t={[C]:J+=e,[w]:Y+=e,[ge]:c};(s?history.replaceState:history.pushState).call(history,t,``,r),s||He(J,Y)}let te=_&&B?.id===_.id?B.fork:null;B?.fork&&!te?V():(B=null,Q={element:void 0,href:void 0}),b.props.page.state=c;let x;if(G){let t=(await Promise.all(Array.from(Qe,e=>e(v.navigation)))).filter(e=>typeof e==`function`);if(t.length>0){function e(){t.forEach(e=>{U.delete(e)})}t.push(e),t.forEach(e=>{U.add(e)})}let n=v.navigation.to;W={...b.state,nav:{params:n.params,route:n.route,url:n.url}},b.props.page&&(b.props.page.url=r),!a&&document.activeElement instanceof HTMLElement&&document.activeElement!==document.body&&document.activeElement.blur();let i=te&&await te;i?x=i.commit():(M=null,rt.$set(b.props),M&&Object.assign(b.props.page,M),Fe(b.props.page),x=e?.()),tt=!0}else await ht(b,Ke,!1);let{activeElement:ne}=document;if(await x,await t(),await t(),X!==d){v.reject(Error(`navigation aborted`));return}b.props.page&&M&&Object.assign(b.props.page,M);let re=null;if(et){let e=i?i.scroll:o?D():null;e?scrollTo(e.x,e.y):(re=r.hash&&document.getElementById(Ut(r)))?re.scrollIntoView():scrollTo(0,0)}let ie=document.activeElement!==ne&&document.activeElement!==document.body;!a&&!ie&&zt(r,!re),et=!0,K=!1,v.fulfil(void 0),v.navigation.to&&(v.navigation.to.scroll=D()),U.forEach(e=>e(v.navigation)),n===`popstate`&&ut(Y),F.navigating.set(j.current=null)}async function jt(e,t,n,r,i){return e.origin===E&&e.pathname===location.pathname&&!$e?await Tt({status:r,error:n,url:e,route:t}):await I(e,i)}var Q={element:void 0,href:void 0};function Mt(){let e,t;R.addEventListener(`mousemove`,t=>{let n=t.target;clearTimeout(e),e=setTimeout(()=>{i(n,T.hover)},20)});function n(e){e.defaultPrevented||i(e.composedPath()[0],T.tap)}R.addEventListener(`mousedown`,n),R.addEventListener(`touchstart`,n,{passive:!0});let r=new IntersectionObserver(e=>{for(let t of e)t.isIntersecting&&(mt(new URL(t.target.href)),r.unobserve(t.target))},{threshold:0});async function i(e,n){let r=be(e,R),i=r===Q.element&&r?.href===Q.href&&n>=t;if(!r||i)return;let{url:a,external:o,download:s}=xe(r,S,z.hash);if(o||s)return;let c=Se(r),l=a&&kt(W.url)===kt(a);if(!(c.reload||l))if(n<=c.preload_data){Q={element:r,href:r.href},t=T.tap;let e=await Dt(a,!1);if(!e)return;pt(e)}else n<=c.preload_code&&(Q={element:r,href:r.href},t=n,mt(a))}function a(){r.disconnect();for(let e of R.querySelectorAll(`a`)){let{url:t,external:n,download:i}=xe(e,S,z.hash);if(n||i)continue;let a=Se(e);a.reload||(a.preload_code===T.viewport&&r.observe(e),a.preload_code===T.eager&&mt(t))}}U.add(a),a()}function $(e,t){if(e instanceof c)return e.body;let n=Ae(e),r=je(e);return z.hooks.handleError({error:e,event:t,status:n,message:r})??{message:r}}function Nt(e,t={}){return e=new URL(_e(e)),e.origin===E?ft(e,t,0):Promise.reject(Error(`goto: invalid URL`))}function Pt(e){if(typeof e==`function`)Ye.push(e);else{let{href:t}=new URL(e,location.href);Ye.push(e=>e.href===t)}}function Ft(){history.scrollRestoration=`manual`,addEventListener(`beforeunload`,e=>{let t=!1;if(dt(),!K){let e=Bt(W,void 0,null,`leave`),n={...e.navigation,cancel:()=>{t=!0,e.reject(Error(`navigation cancelled`))}};Ze.forEach(e=>e(n))}t?(e.preventDefault(),e.returnValue=``):history.scrollRestoration=`auto`}),addEventListener(`visibilitychange`,()=>{document.visibilityState===`hidden`&&dt()}),navigator.connection?.saveData||Mt(),R.addEventListener(`click`,async t=>{if(t.button||t.which!==1||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.defaultPrevented)return;let n=be(t.composedPath()[0],R);if(!n)return;let{url:r,external:i,target:a,download:o}=xe(n,S,z.hash);if(!r)return;if(a===`_parent`||a===`_top`){if(window.parent!==window)return}else if(a&&a!==`_self`)return;let s=Se(n);if(!(n instanceof SVGAElement)&&r.protocol!==location.protocol&&r.protocol!==`https:`&&r.protocol!==`http:`||o)return;let[c,l]=(z.hash?r.hash.replace(/^#/,``):r.href).split(`#`),u=c===m(location);if(i||s.reload&&(!u||!l)){At({url:r,type:`link`,event:t})?K=!0:t.preventDefault();return}if(l!==void 0&&u){let[,i]=W.url.href.split(`#`);if(i===l){if(t.preventDefault(),l===``||l===`top`&&n.ownerDocument.getElementById(`top`)===null)scrollTo({top:0});else{let e=n.ownerDocument.getElementById(decodeURIComponent(l));e&&(e.scrollIntoView(),e.focus())}return}if(q=!0,Ve(J),e(r),!s.replace_state)return;q=!1}t.preventDefault(),await new Promise(e=>{requestAnimationFrame(()=>{setTimeout(e,0)}),setTimeout(e,100)}),await Z({type:`link`,url:r,keepfocus:s.keepfocus,noscroll:s.noscroll,replace_state:s.replace_state??r.href===location.href,event:t})}),R.addEventListener(`submit`,e=>{if(e.defaultPrevented)return;let t=HTMLFormElement.prototype.cloneNode.call(e.target),n=e.submitter;if((n?.formTarget||t.target)===`_blank`||(n?.formMethod||t.method)!==`get`)return;let r=new URL(n?.hasAttribute(`formaction`)&&n?.formAction||t.action);if(k(r,S,!1))return;let i=e.target,a=Se(i);if(a.reload)return;e.preventDefault(),e.stopPropagation();let o=new FormData(i,n);r.search=new URLSearchParams(o).toString(),Z({type:`form`,url:r,keepfocus:a.keepfocus,noscroll:a.noscroll,replace_state:a.replace_state??r.href===location.href,event:e})}),addEventListener(`popstate`,async t=>{if(!Rt)if(t.state?.[`sveltekit:history`]){let n=t.state[C];if(X={},n===J)return;let r=N[n],i=t.state[`sveltekit:states`]??{},a=new URL(t.state[`sveltekit:pageurl`]??location.href),o=t.state[w],s=W.url?m(location)===m(W.url):!1;if(o===Y&&(tt||s)){i!==A.state&&(A.state=i),e(a),N[J]=D(),r&&scrollTo(r.x,r.y),J=n;return}let c=n-J;await Z({type:`popstate`,url:a,popped:{state:i,scroll:r,delta:c},accept:()=>{J=n,Y=o},block:()=>{history.go(-c)},nav_token:X,event:t})}else q||(e(new URL(location.href)),z.hash&&location.reload())}),addEventListener(`hashchange`,()=>{q&&(q=!1,history.replaceState({...history.state,[C]:++J,[w]:Y},``,location.href))});for(let e of document.querySelectorAll(`link`))Be.has(e.rel)&&(e.href=e.href);addEventListener(`pageshow`,e=>{e.persisted&&F.navigating.set(j.current=null)});function e(e){W.url=A.url=e,F.page.set(Vt(A)),F.page.notify()}}async function It(e,{status:t=200,error:n,node_ids:r,params:i,route:a,server_route:o,data:s,form:c}){$e=!0;let u=new URL(location.href),d;({params:i={},route:a={id:null}}=await Dt(u,!1)||{}),d=We.find(({id:e})=>e===a.id);let f,p=!0;try{let e=r.map(async(t,n)=>{let r=s[n];return r?.uses&&(r.uses=Lt(r.uses)),_t({loader:z.nodes[t],url:u,params:i,route:a,parent:async()=>{let t={};for(let r=0;r{let a=history.state;Rt=!0,location.replace(new URL(`#${n}`,location.href)),history.replaceState(a,``,e),t&&scrollTo(r,i),Rt=!1})}else{let e=document.body,t=e.getAttribute(`tabindex`);e.tabIndex=-1,e.focus({preventScroll:!0,focusVisible:!1}),t===null?e.removeAttribute(`tabindex`):e.setAttribute(`tabindex`,t)}let r=getSelection();if(r&&r.type!==`None`){let e=[];for(let t=0;t{if(r.rangeCount===e.length){for(let t=0;t{a=e,o=t});return s.catch(g),{navigation:{from:{params:e.params,route:{id:e.route?.id??null},url:e.url,scroll:D()},to:n&&{params:t?.params??null,route:{id:t?.route?.id??null},url:n,scroll:i},willUnload:!t,type:r,complete:s},fulfil:a,reject:o}}function Vt(e){return{data:e.data,error:e.error,form:e.form,params:e.params,route:e.route,state:e.state,status:e.status,url:e.url}}function Ht(e){let t=new URL(e);return t.hash=decodeURIComponent(e.hash),t}function Ut(e){let t;if(z.hash){let[,,n]=e.hash.split(`#`,3);t=n??``}else t=e.hash.slice(1);return decodeURIComponent(t)}export{A as a,j as i,st as n,Me as o,F as r,Ee as s,Nt as t}; \ No newline at end of file +import{F as e,I as t,P as n,Q as r,X as i,nt as a,r as o,t as s}from"./39JK5HWF.js";var c=class{constructor(e,t){this.status=e,this.body=typeof t==`string`?{message:t}:t||{message:`Error: ${e}`}}toString(){return JSON.stringify(this.body)}},l=class{constructor(e,t){try{new Headers({location:t})}catch{throw Error(`Invalid redirect location ${JSON.stringify(t)}: this string contains characters that cannot be used in HTTP headers`)}this.status=e,this.location=t}},u=class extends Error{constructor(e,t,n){super(n),this.status=e,this.text=t}};new URL(`sveltekit-internal://`);function d(e,t){return e===`/`||t===`ignore`?e:t===`never`?e.endsWith(`/`)?e.slice(0,-1):e:t===`always`&&!e.endsWith(`/`)?e+`/`:e}function f(e){return e.split(`%25`).map(decodeURI).join(`%25`)}function p(e){for(let t in e)e[t]=decodeURIComponent(e[t]);return e}function m({href:e}){return e.split(`#`)[0]}function h(e,t,n,r=!1){let i=new URL(e);Object.defineProperty(i,"searchParams",{value:new Proxy(i.searchParams,{get(e,r){if(r===`get`||r===`getAll`||r===`has`)return(t,...i)=>(n(t),e[r](t,...i));t();let i=Reflect.get(e,r);return typeof i==`function`?i.bind(e):i}}),enumerable:!0,configurable:!0});let a=[`href`,`pathname`,`search`,`toString`,`toJSON`];r&&a.push(`hash`);for(let n of a)Object.defineProperty(i,n,{get(){return t(),e[n]},enumerable:!0,configurable:!0});return i}function g(){}function _(...e){let t=5381;for(let n of e)if(typeof n==`string`){let e=n.length;for(;e;)t=t*33^n.charCodeAt(--e)}else if(ArrayBuffer.isView(n)){let e=new Uint8Array(n.buffer,n.byteOffset,n.byteLength),r=e.length;for(;r;)t=t*33^e[--r]}else throw TypeError(`value must be a string or TypedArray`);return(t>>>0).toString(36)}new TextEncoder;function v(e){let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e((e instanceof Request?e.method:t?.method||`GET`)!==`GET`&&y.delete(x(e)),ee(e,t));var y=new Map;function b(e,t){let n=x(e,t),r=document.querySelector(n);if(r?.textContent){r.remove();let{body:e,...t}=JSON.parse(r.textContent);r.getAttribute(`data-b64`)!==null&&(e=v(e));let i=r.getAttribute(`data-ttl`);return i&&y.set(n,{body:e,init:t,ttl:1e3*Number(i)}),Promise.resolve(new Response(e,t))}return window.fetch(e,t)}function te(e,t,n){if(y.size>0){let t=x(e,n),r=y.get(t);if(r){if(performance.now(){let n=/^\[\.\.\.(\w+)(?:=(\w+))?\]$/.exec(e);if(n)return t.push({name:n[1],matcher:n[2],optional:!1,rest:!0,chained:!0}),`(?:/([^]*))?`;let r=/^\[\[(\w+)(?:=(\w+))?\]\]$/.exec(e);if(r)return t.push({name:r[1],matcher:r[2],optional:!0,rest:!1,chained:!0}),`(?:/([^/]+))?`;if(!e)return;let i=e.split(/\[(.+?)\](?!\])/);return`/`+i.map((e,n)=>{if(n%2){if(e.startsWith(`x+`))return ce(String.fromCharCode(parseInt(e.slice(2),16)));if(e.startsWith(`u+`))return ce(String.fromCharCode(...e.slice(2).split(`-`).map(e=>parseInt(e,16))));let[,r,a,o,s]=ne.exec(e);return t.push({name:o,matcher:s,optional:!!r,rest:!!a,chained:a?n===1&&i[0]===``:!1}),a?`([^]*?)`:r?`([^/]*)?`:`([^/]+?)`}return ce(e)}).join(``)}).join(``)}/?$`),params:t}}function ae(e){return e!==``&&!/^\([^)]+\)$/.test(e)}function oe(e){return e.slice(1).split(`/`).filter(ae)}function se(e,t,n){let r={},i=e.slice(1),a=i.filter(e=>e!==void 0),o=0;for(let e=0;ee).join(`/`),o=0),c===void 0)if(s.rest)c=``;else continue;if(!s.matcher||n[s.matcher](c)){r[s.name]=c;let n=t[e+1],l=i[e+1];n&&!n.rest&&n.optional&&l&&s.chained&&(o=0),!n&&!l&&Object.keys(r).length===a.length&&(o=0);continue}if(s.optional&&s.chained){o++;continue}return}if(!o)return r}function ce(e){return e.normalize().replace(/[[\]]/g,`\\$&`).replace(/%/g,`%25`).replace(/\//g,`%2[Ff]`).replace(/\?/g,`%3[Ff]`).replace(/#/g,`%23`).replace(/[.*+?^${}()|\\]/g,`\\$&`)}function le({nodes:e,server_loads:t,dictionary:n,matchers:r}){let i=new Set(t);return Object.entries(n).map(([t,[n,i,s]])=>{let{pattern:c,params:l}=ie(t),u={id:t,exec:e=>{let t=c.exec(e);if(t)return se(t,l,r)},errors:[1,...s||[]].map(t=>e[t]),layouts:[0,...i||[]].map(o),leaf:a(n)};return u.errors.length=u.layouts.length=Math.max(u.errors.length,u.layouts.length),u});function a(t){let n=t<0;return n&&(t=~t),[n,e[t]]}function o(t){return t===void 0?t:[i.has(t),e[t]]}}function ue(e,t=JSON.parse){try{return t(sessionStorage[e])}catch{}}function de(e,t,n=JSON.stringify){let r=n(t);try{sessionStorage[e]=r}catch{}}var S=globalThis.__sveltekit_1vzpa2i?.base??``,fe=globalThis.__sveltekit_1vzpa2i?.assets??S??``,pe=`1788815336322`,me=`sveltekit:snapshot`,he=`sveltekit:scroll`,ge=`sveltekit:states`,C=`sveltekit:history`,w=`sveltekit:navigation`,T={tap:1,hover:2,viewport:3,eager:4,off:-1,false:-1},E=location.origin;function _e(e){if(e instanceof URL)return e;let t=document.baseURI;if(!t){let e=document.getElementsByTagName(`base`);t=e.length?e[0].href:document.URL}return new URL(e,t)}function D(){return{x:pageXOffset,y:pageYOffset}}function O(e,t){return e.getAttribute(`data-sveltekit-${t}`)}var ve={...T,"":T.hover};function ye(e){let t=e.assignedSlot??e.parentNode;return t?.nodeType===11&&(t=t.host),t}function be(e,t){for(;e&&e!==t;){if(e.nodeName.toUpperCase()===`A`&&e.hasAttribute(`href`))return e;e=ye(e)}}function xe(e,t,n){let r;try{if(r=new URL(e instanceof SVGAElement?e.href.baseVal:e.href,document.baseURI),n&&r.hash.match(/^#[^/]/)){let e=location.hash.split(`#`)[1]||`/`;r.hash=`#${e}${r.hash}`}}catch{}let i=e instanceof SVGAElement?e.target.baseVal:e.target,a=!r||!!i||k(r,t,n)||(e.getAttribute(`rel`)||``).split(/\s+/).includes(`external`),o=r?.origin===E&&e.hasAttribute(`download`);return{url:r,external:a,target:i,download:o}}function Se(e){let t=null,n=null,r=null,i=null,a=null,o=null,s=e;for(;s&&s!==document.documentElement;)r===null&&(r=O(s,`preload-code`)),i===null&&(i=O(s,`preload-data`)),t===null&&(t=O(s,`keepfocus`)),n===null&&(n=O(s,`noscroll`)),a===null&&(a=O(s,`reload`)),o===null&&(o=O(s,`replacestate`)),s=ye(s);function c(e){switch(e){case``:case`true`:return!0;case`off`:case`false`:return!1;default:return}}return{preload_code:ve[r??`off`],preload_data:ve[i??`off`],keepfocus:c(t),noscroll:c(n),reload:c(a),replace_state:c(o)}}function Ce(e){let t=a(e),n=!0;function r(){n=!0,t.update(e=>e)}function i(e){n=!1,t.set(e)}function o(e){let r;return t.subscribe(t=>{(r===void 0||n&&t!==r)&&e(r=t)})}return{notify:r,set:i,subscribe:o}}var we={v:g};function Te(){let{set:e,subscribe:t}=a(!1),n;async function r(){clearTimeout(n);try{let t=await fetch(`${fe}/_app/version.json`,{headers:{pragma:`no-cache`,"cache-control":`no-cache`}});if(!t.ok)return!1;let r=(await t.json()).version!==pe;return r&&(e(!0),we.v(),clearTimeout(n)),r}catch{return!1}}return{subscribe:t,check:r}}function k(e,t,n){return e.origin!==E||!e.pathname.startsWith(t)?!0:n?e.pathname!==location.pathname:!1}function Ee(e){}var De=new Set([`load`,`prerender`,`csr`,`ssr`,`trailingSlash`,`config`]);[...De],[...new Set([...De])];function Oe(e){return e.filter(e=>e!=null)}function ke(e,t){return e+`/`+t}function Ae(e){return e instanceof c||e instanceof u?e.status:500}function je(e){return e instanceof u?e.text:`Internal Error`}var A,j,Me,Ne=o.toString().includes(`$$`)||/function \w+\(\) \{\}/.test(o.toString()),Pe=`a:`;Ne?(A={data:{},form:null,error:null,params:{},route:{id:null},state:{},status:-1,url:new URL(Pe)},j={current:null},Me={current:!1}):(A=new class{#e=r({});get data(){return n(this.#e)}set data(e){i(this.#e,e)}#t=r(null);get form(){return n(this.#t)}set form(e){i(this.#t,e)}#n=r(null);get error(){return n(this.#n)}set error(e){i(this.#n,e)}#r=r({});get params(){return n(this.#r)}set params(e){i(this.#r,e)}#i=r({id:null});get route(){return n(this.#i)}set route(e){i(this.#i,e)}#a=r({});get state(){return n(this.#a)}set state(e){i(this.#a,e)}#o=r(-1);get status(){return n(this.#o)}set status(e){i(this.#o,e)}#s=r(new URL(Pe));get url(){return n(this.#s)}set url(e){i(this.#s,e)}},j=new class{#e=r(null);get current(){return n(this.#e)}set current(e){i(this.#e,e)}},Me=new class{#e=r(!1);get current(){return n(this.#e)}set current(e){i(this.#e,e)}},we.v=()=>Me.current=!0);function Fe(e){Object.assign(A,e)}var Ie={spanContext(){return Le},setAttribute(){return this},setAttributes(){return this},addEvent(){return this},setStatus(){return this},updateName(){return this},end(){return this},isRecording(){return!1},recordException(){return this},addLink(){return this},addLinks(){return this}},Le={traceId:``,spanId:``,traceFlags:0},{onMount:Re,tick:ze}=s,Be=new Set([`icon`,`shortcut icon`,`apple-touch-icon`]),M=null,N=ue(`sveltekit:scroll`)??{},P=ue(`sveltekit:snapshot`)??{},F={url:Ce({}),page:Ce({}),navigating:a(null),updated:Te()};function Ve(e){N[e]=D()}function He(e,t){let n=e+1;for(;N[n];)delete N[n],n+=1;for(n=t+1;P[n];)delete P[n],n+=1}function I(e,t=!1){return t?location.replace(e.href):location.href=e.href,new Promise(g)}async function Ue(){if(`serviceWorker`in navigator){let e=await navigator.serviceWorker.getRegistration(S||`/`);e&&await e.update()}}var We,Ge,L,R,Ke,z,qe={},Je={},Ye=[],Xe=[],B=null;function V(){B?.fork?.then(e=>e?.discard()),B=null,Q={element:void 0,href:void 0}}var H=new Map,Ze=new Set,Qe=new Set,U=new Set,W={branch:[],error:null,url:null,nav:null},$e=!1,G=!1,et=!0,K=!1,q=!1,tt=!1,nt=!1,rt,J,Y,X,it=new Set,at=new Map,ot=new Map;async function st(e,t,n){if(globalThis.__sveltekit_1vzpa2i.data){let{q:e={},p:t={},l:n={},f:r={}}=globalThis.__sveltekit_1vzpa2i.data;for(let t in e)qe[t]=e[t];for(let e in n)qe[e]=n[e];for(let e in r)qe[e]=r[e];for(let e in t)Je[e]=t[e]}document.URL!==location.href&&(location.href=location.href),z=e,await e.hooks.init?.(),We=le(e),R=document.documentElement,Ke=t,Ge=e.nodes[0],L=e.nodes[1],Ge(),L(),J=history.state?.[C],Y=history.state?.[w],J||(J=Y=Date.now(),history.replaceState({...history.state,[C]:J,[w]:Y},``));let r=N[J];function i(){r&&(history.scrollRestoration=`manual`,scrollTo(r.x,r.y))}n?(i(),await It(Ke,n)):(await Z({type:`enter`,url:_e(z.hash?Ht(new URL(location.href)):location.href),replace_state:!0}),i()),Ft()}function ct(){Ye.length=0,nt=!1}function lt(e){Xe.some(e=>e?.snapshot)&&(P[e]=Xe.map(e=>e?.snapshot?.capture()))}function ut(e){P[e]?.forEach((e,t)=>{Xe[t]?.snapshot?.restore(e)})}function dt(){Ve(J),de(he,N),lt(Y),de(me,P)}async function ft(e,n,r,i){let a,o;n.invalidateAll&&V(),await Z({type:`goto`,url:_e(e),keepfocus:n.keepFocus,noscroll:n.noScroll,replace_state:n.replaceState,state:n.state,redirect_count:r,nav_token:i,accept:()=>{if(n.invalidateAll){nt=!0,a=new Set;for(let[e,t]of at)for(let[n,r]of t)r.resource?.reset(),a.add(ke(e,n));o=new Set;for(let[e,t]of ot)for(let n of t.keys())o.add(ke(e,n))}n.invalidate&&n.invalidate.forEach(Pt)}}),n.invalidateAll&&t().then(t).then(()=>{for(let[e,t]of at)for(let[n,{resource:r}]of t)a?.has(ke(e,n))&&r.start();for(let[e,t]of ot)for(let[n,{resource:r}]of t)o?.has(ke(e,n))&&r.reconnect()})}async function pt(e){if(e.id!==B?.id){V();let t={};it.add(t),B={id:e.id,token:t,promise:Ct({...e,preload:t}).then(e=>(it.delete(t),e.type===`loaded`&&e.state.error&&V(),e)),fork:null}}return B.promise}async function mt(e){let t=(await Dt(e,!1))?.route;t&&await Promise.all([...t.layouts,t.leaf].filter(Boolean).map(e=>e[1]()))}async function ht(e,t,n){let r={params:W.params,route:{id:W.route?.id??null},url:new URL(location.href)};if(W={...e.state,nav:r},Fe(e.props.page),rt=new z.root({target:t,props:{...e.props,stores:F,components:Xe},hydrate:n,sync:!1,transformError:void 0}),await Promise.resolve(),n){let e={from:null,to:{...r,scroll:N[J]??D()},willUnload:!1,type:`enter`,complete:Promise.resolve()};U.forEach(t=>t(e))}ut(Y),G=!0}async function gt({url:e,params:t,branch:n,errors:r,status:i,error:a,route:o,form:s}){let c=`never`;if(S&&(e.pathname===S||e.pathname===S+`/`))c=`always`;else for(let e of n)e?.slash!==void 0&&(c=e.slash);e.pathname=d(e.pathname,c),e.search=e.search;let l={type:`loaded`,state:{url:e,params:t,branch:n,error:a,route:o},props:{constructors:Oe(n).map(e=>e.node.component),page:Vt(A)}};s!==void 0&&(l.props.form=s);let u={},f=!A,p=0;for(let e=0;e(s&&(c.route=!0),e[t])}),params:new Proxy(r,{get:(e,t)=>(s&&c.params.add(t),e[t])}),data:a?.data??null,url:h(n,()=>{s&&(c.url=!0)},e=>{s&&c.search_params.add(e)},z.hash),async fetch(t,r){t instanceof Request&&(r={body:t.method===`GET`||t.method===`HEAD`?void 0:await t.blob(),cache:t.cache,credentials:t.credentials,headers:[...t.headers].length>0?t?.headers:void 0,integrity:t.integrity,keepalive:t.keepalive,method:t.method,mode:t.mode,redirect:t.redirect,referrer:t.referrer,referrerPolicy:t.referrerPolicy,signal:t.signal,...r});let{resolved:i,promise:a}=vt(t,r,n);return s&&e(i.href),a},setHeaders:g,depends:e,parent(){return s&&(c.parent=!0),t()},untrack(e){s=!1;try{return e()}finally{s=!0}}};o=await l.universal.load.call(null,u)??null}return{node:l,loader:e,server:a,universal:l.universal?.load?{type:`data`,data:o,uses:c}:null,data:o??a?.data??null,slash:l.universal?.trailingSlash??a?.slash}}function vt(e,t,n){let r=e instanceof Request?e.url:e,i=new URL(r,n);return i.origin===n.origin&&(r=i.href.slice(n.origin.length)),{resolved:i,promise:G?te(r,i.href,t):b(r,t)}}function yt(e,t,n,r,i,a){if(nt)return!0;if(!i)return!1;if(i.parent&&e||i.route&&t||i.url&&n)return!0;for(let e of i.search_params)if(r.has(e))return!0;for(let e of i.params)if(a[e]!==W.params[e])return!0;for(let e of i.dependencies)if(Ye.some(t=>t(new URL(e))))return!0;return!1}function bt(e,t){return e?.type===`data`?e:e?.type===`skip`?t??null:null}function xt(e,t){if(!e)return new Set(t.searchParams.keys());let n=new Set([...e.searchParams.keys(),...t.searchParams.keys()]);for(let r of n){let i=e.searchParams.getAll(r),a=t.searchParams.getAll(r);i.every(e=>a.includes(e))&&a.every(e=>i.includes(e))&&n.delete(r)}return n}function St({error:e,url:t,route:n,params:r}){return{type:`loaded`,state:{error:e,url:t,route:n,params:r,branch:[]},props:{page:Vt(A),constructors:[]}}}async function Ct({id:e,invalidating:t,url:n,params:r,route:i,preload:a}){if(B?.id===e)return it.delete(B.token),B.promise;let{errors:o,layouts:s,leaf:u}=i,d=[...s,u];o.forEach(e=>e?.().catch(g)),d.forEach(e=>e?.[1]().catch(g));let f=W.url?e!==kt(W.url):!1,p=W.route?i.id!==W.route.id:!1,m=xt(W.url,n),h=!1,_=d.map(async(e,t)=>{if(!e)return;let a=W.branch[t];return e[1]===a?.loader&&!yt(h,p,f,m,a.universal?.uses,r)?a:(h=!0,_t({loader:e[1],url:n,params:r,route:i,parent:async()=>{let e={};for(let n=0;nPromise.resolve({}),server_data_node:bt(null)}),{node:await L(),loader:L,universal:null,server:null,data:null}],status:e,error:t,errors:[],route:null})}catch(t){if(t instanceof l){await ft(new URL(t.location,location.href),{},0);return}let a=await z.get_error_template(),o=await $(t,{url:n,params:i,route:r}),s=a({status:e,message:String(o?.message??``).replace(/&/g,`&`).replace(//g,`>`)}),c=new DOMParser().parseFromString(s,`text/html`);throw document.documentElement.replaceChild(document.adoptNode(c.head),document.head),document.documentElement.replaceChild(document.adoptNode(c.body),document.body),t}}async function Et(e){let t=e.href;if(H.has(t))return H.get(t);let n;try{let r=(async()=>{let t=await z.hooks.reroute({url:new URL(e),fetch:async(t,n)=>vt(t,n,e).promise})??e;if(typeof t==`string`){let n=new URL(e);z.hash?n.hash=t:n.pathname=t,t=n}return t})();H.set(t,r),n=await r}catch{H.delete(t);return}return n}async function Dt(e,t){if(e&&!k(e,S,z.hash)){let n=await Et(e);if(!n)return;let r=Ot(n);for(let n of We){let i=n.exec(r);if(i)return{id:kt(e),invalidating:t,route:n,params:p(i),url:e}}}}function Ot(e){return f(z.hash?e.hash.replace(/^#/,``).replace(/[?#].+/,``):e.pathname.slice(S.length))||`/`}function kt(e){return(z.hash?e.hash.replace(/^#/,``):e.pathname)+e.search}function At({url:e,type:t,intent:n,delta:r,event:i,scroll:a}){let o=!1,s=Bt(W,n,e,t,a??null);r!==void 0&&(s.navigation.delta=r),i!==void 0&&(s.navigation.event=i);let c={...s.navigation,cancel:()=>{o=!0,s.reject(Error(`navigation cancelled`))}};return K||Ze.forEach(e=>e(c)),o?null:s}async function Z({type:n,url:r,popped:i,keepfocus:a,noscroll:o,replace_state:s,state:c={},redirect_count:l=0,nav_token:d={},accept:f=g,block:p=g,event:m}){let h=X;X=d;let _=await Dt(r,!1),v=n===`enter`?Bt(W,_,r,n):At({url:r,type:n,delta:i?.delta,intent:_,scroll:i?.scroll,event:m});if(!v){p(),X===d&&(X=h);return}let ee=J,y=Y;f(),K=!0,G&&v.navigation.type!==`enter`&&F.navigating.set(j.current=v.navigation);let b=_&&await Ct(_);if(!b){if(k(r,S,z.hash))return await I(r,s);b=await jt(r,{id:null},await $(new u(404,`Not Found`,`Not found: ${r.pathname}`),{url:r,params:{},route:{id:null}}),404,s)}if(r=_?.url||r,X!==d){v.reject(Error(`navigation aborted`));return}if(!b)return;if(b.type===`redirect`){if(l<20){await Z({type:n,url:new URL(b.location,r),popped:i,keepfocus:a,noscroll:o,replace_state:s,state:c,redirect_count:l+1,nav_token:d}),v.fulfil(void 0);return}if(b=await Tt({status:500,error:await $(Error(`Redirect loop`),{url:r,params:{},route:{id:null}}),url:r,route:{id:null}}),!b)return}else if(b.props.page.status>=400&&await F.updated.check())return await Ue(),await I(r,s);if(ct(),Ve(ee),lt(y),b.props.page.url.pathname!==r.pathname&&(r.pathname=b.props.page.url.pathname),c=i?i.state:c,!i){let e=+!s,t={[C]:J+=e,[w]:Y+=e,[ge]:c};(s?history.replaceState:history.pushState).call(history,t,``,r),s||He(J,Y)}let te=_&&B?.id===_.id?B.fork:null;B?.fork&&!te?V():(B=null,Q={element:void 0,href:void 0}),b.props.page.state=c;let x;if(G){let t=(await Promise.all(Array.from(Qe,e=>e(v.navigation)))).filter(e=>typeof e==`function`);if(t.length>0){function e(){t.forEach(e=>{U.delete(e)})}t.push(e),t.forEach(e=>{U.add(e)})}let n=v.navigation.to;W={...b.state,nav:{params:n.params,route:n.route,url:n.url}},b.props.page&&(b.props.page.url=r),!a&&document.activeElement instanceof HTMLElement&&document.activeElement!==document.body&&document.activeElement.blur();let i=te&&await te;i?x=i.commit():(M=null,rt.$set(b.props),M&&Object.assign(b.props.page,M),Fe(b.props.page),x=e?.()),tt=!0}else await ht(b,Ke,!1);let{activeElement:ne}=document;if(await x,await t(),await t(),X!==d){v.reject(Error(`navigation aborted`));return}b.props.page&&M&&Object.assign(b.props.page,M);let re=null;if(et){let e=i?i.scroll:o?D():null;e?scrollTo(e.x,e.y):(re=r.hash&&document.getElementById(Ut(r)))?re.scrollIntoView():scrollTo(0,0)}let ie=document.activeElement!==ne&&document.activeElement!==document.body;!a&&!ie&&zt(r,!re),et=!0,K=!1,v.fulfil(void 0),v.navigation.to&&(v.navigation.to.scroll=D()),U.forEach(e=>e(v.navigation)),n===`popstate`&&ut(Y),F.navigating.set(j.current=null)}async function jt(e,t,n,r,i){return e.origin===E&&e.pathname===location.pathname&&!$e?await Tt({status:r,error:n,url:e,route:t}):await I(e,i)}var Q={element:void 0,href:void 0};function Mt(){let e,t;R.addEventListener(`mousemove`,t=>{let n=t.target;clearTimeout(e),e=setTimeout(()=>{i(n,T.hover)},20)});function n(e){e.defaultPrevented||i(e.composedPath()[0],T.tap)}R.addEventListener(`mousedown`,n),R.addEventListener(`touchstart`,n,{passive:!0});let r=new IntersectionObserver(e=>{for(let t of e)t.isIntersecting&&(mt(new URL(t.target.href)),r.unobserve(t.target))},{threshold:0});async function i(e,n){let r=be(e,R),i=r===Q.element&&r?.href===Q.href&&n>=t;if(!r||i)return;let{url:a,external:o,download:s}=xe(r,S,z.hash);if(o||s)return;let c=Se(r),l=a&&kt(W.url)===kt(a);if(!(c.reload||l))if(n<=c.preload_data){Q={element:r,href:r.href},t=T.tap;let e=await Dt(a,!1);if(!e)return;pt(e)}else n<=c.preload_code&&(Q={element:r,href:r.href},t=n,mt(a))}function a(){r.disconnect();for(let e of R.querySelectorAll(`a`)){let{url:t,external:n,download:i}=xe(e,S,z.hash);if(n||i)continue;let a=Se(e);a.reload||(a.preload_code===T.viewport&&r.observe(e),a.preload_code===T.eager&&mt(t))}}U.add(a),a()}function $(e,t){if(e instanceof c)return e.body;let n=Ae(e),r=je(e);return z.hooks.handleError({error:e,event:t,status:n,message:r})??{message:r}}function Nt(e,t={}){return e=new URL(_e(e)),e.origin===E?ft(e,t,0):Promise.reject(Error(`goto: invalid URL`))}function Pt(e){if(typeof e==`function`)Ye.push(e);else{let{href:t}=new URL(e,location.href);Ye.push(e=>e.href===t)}}function Ft(){history.scrollRestoration=`manual`,addEventListener(`beforeunload`,e=>{let t=!1;if(dt(),!K){let e=Bt(W,void 0,null,`leave`),n={...e.navigation,cancel:()=>{t=!0,e.reject(Error(`navigation cancelled`))}};Ze.forEach(e=>e(n))}t?(e.preventDefault(),e.returnValue=``):history.scrollRestoration=`auto`}),addEventListener(`visibilitychange`,()=>{document.visibilityState===`hidden`&&dt()}),navigator.connection?.saveData||Mt(),R.addEventListener(`click`,async t=>{if(t.button||t.which!==1||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||t.defaultPrevented)return;let n=be(t.composedPath()[0],R);if(!n)return;let{url:r,external:i,target:a,download:o}=xe(n,S,z.hash);if(!r)return;if(a===`_parent`||a===`_top`){if(window.parent!==window)return}else if(a&&a!==`_self`)return;let s=Se(n);if(!(n instanceof SVGAElement)&&r.protocol!==location.protocol&&r.protocol!==`https:`&&r.protocol!==`http:`||o)return;let[c,l]=(z.hash?r.hash.replace(/^#/,``):r.href).split(`#`),u=c===m(location);if(i||s.reload&&(!u||!l)){At({url:r,type:`link`,event:t})?K=!0:t.preventDefault();return}if(l!==void 0&&u){let[,i]=W.url.href.split(`#`);if(i===l){if(t.preventDefault(),l===``||l===`top`&&n.ownerDocument.getElementById(`top`)===null)scrollTo({top:0});else{let e=n.ownerDocument.getElementById(decodeURIComponent(l));e&&(e.scrollIntoView(),e.focus())}return}if(q=!0,Ve(J),e(r),!s.replace_state)return;q=!1}t.preventDefault(),await new Promise(e=>{requestAnimationFrame(()=>{setTimeout(e,0)}),setTimeout(e,100)}),await Z({type:`link`,url:r,keepfocus:s.keepfocus,noscroll:s.noscroll,replace_state:s.replace_state??r.href===location.href,event:t})}),R.addEventListener(`submit`,e=>{if(e.defaultPrevented)return;let t=HTMLFormElement.prototype.cloneNode.call(e.target),n=e.submitter;if((n?.formTarget||t.target)===`_blank`||(n?.formMethod||t.method)!==`get`)return;let r=new URL(n?.hasAttribute(`formaction`)&&n?.formAction||t.action);if(k(r,S,!1))return;let i=e.target,a=Se(i);if(a.reload)return;e.preventDefault(),e.stopPropagation();let o=new FormData(i,n);r.search=new URLSearchParams(o).toString(),Z({type:`form`,url:r,keepfocus:a.keepfocus,noscroll:a.noscroll,replace_state:a.replace_state??r.href===location.href,event:e})}),addEventListener(`popstate`,async t=>{if(!Rt)if(t.state?.[`sveltekit:history`]){let n=t.state[C];if(X={},n===J)return;let r=N[n],i=t.state[`sveltekit:states`]??{},a=new URL(t.state[`sveltekit:pageurl`]??location.href),o=t.state[w],s=W.url?m(location)===m(W.url):!1;if(o===Y&&(tt||s)){i!==A.state&&(A.state=i),e(a),N[J]=D(),r&&scrollTo(r.x,r.y),J=n;return}let c=n-J;await Z({type:`popstate`,url:a,popped:{state:i,scroll:r,delta:c},accept:()=>{J=n,Y=o},block:()=>{history.go(-c)},nav_token:X,event:t})}else q||(e(new URL(location.href)),z.hash&&location.reload())}),addEventListener(`hashchange`,()=>{q&&(q=!1,history.replaceState({...history.state,[C]:++J,[w]:Y},``,location.href))});for(let e of document.querySelectorAll(`link`))Be.has(e.rel)&&(e.href=e.href);addEventListener(`pageshow`,e=>{e.persisted&&F.navigating.set(j.current=null)});function e(e){W.url=A.url=e,F.page.set(Vt(A)),F.page.notify()}}async function It(e,{status:t=200,error:n,node_ids:r,params:i,route:a,server_route:o,data:s,form:c}){$e=!0;let u=new URL(location.href),d;({params:i={},route:a={id:null}}=await Dt(u,!1)||{}),d=We.find(({id:e})=>e===a.id);let f,p=!0;try{let e=r.map(async(t,n)=>{let r=s[n];return r?.uses&&(r.uses=Lt(r.uses)),_t({loader:z.nodes[t],url:u,params:i,route:a,parent:async()=>{let t={};for(let r=0;r{let a=history.state;Rt=!0,location.replace(new URL(`#${n}`,location.href)),history.replaceState(a,``,e),t&&scrollTo(r,i),Rt=!1})}else{let e=document.body,t=e.getAttribute(`tabindex`);e.tabIndex=-1,e.focus({preventScroll:!0,focusVisible:!1}),t===null?e.removeAttribute(`tabindex`):e.setAttribute(`tabindex`,t)}let r=getSelection();if(r&&r.type!==`None`){let e=[];for(let t=0;t{if(r.rangeCount===e.length){for(let t=0;t{a=e,o=t});return s.catch(g),{navigation:{from:{params:e.params,route:{id:e.route?.id??null},url:e.url,scroll:D()},to:n&&{params:t?.params??null,route:{id:t?.route?.id??null},url:n,scroll:i},willUnload:!t,type:r,complete:s},fulfil:a,reject:o}}function Vt(e){return{data:e.data,error:e.error,form:e.form,params:e.params,route:e.route,state:e.state,status:e.status,url:e.url}}function Ht(e){let t=new URL(e);return t.hash=decodeURIComponent(e.hash),t}function Ut(e){let t;if(z.hash){let[,,n]=e.hash.split(`#`,3);t=n??``}else t=e.hash.slice(1);return decodeURIComponent(t)}export{A as a,j as i,st as n,Me as o,F as r,Ee as s,Nt as t}; \ No newline at end of file diff --git a/backend/internal/http/web/_app/immutable/chunks/B5isPFOt.js b/backend/internal/http/web/_app/immutable/chunks/B5isPFOt.js deleted file mode 100644 index 3acd335..0000000 --- a/backend/internal/http/web/_app/immutable/chunks/B5isPFOt.js +++ /dev/null @@ -1 +0,0 @@ -import"./D3up1JC1.js"; \ No newline at end of file diff --git a/backend/internal/http/web/_app/immutable/chunks/BqkZ0BZ5.js b/backend/internal/http/web/_app/immutable/chunks/BC84wEQu.js similarity index 87% rename from backend/internal/http/web/_app/immutable/chunks/BqkZ0BZ5.js rename to backend/internal/http/web/_app/immutable/chunks/BC84wEQu.js index 15d4aad..59cf926 100644 --- a/backend/internal/http/web/_app/immutable/chunks/BqkZ0BZ5.js +++ b/backend/internal/http/web/_app/immutable/chunks/BC84wEQu.js @@ -1 +1 @@ -import{J as e}from"./39JK5HWF.js";import{t}from"./D3up1JC1.js";import"./B5isPFOt.js";var n=e({user:null,status:`loading`}),r=()=>{localStorage.removeItem(`accessToken`),n.status=`unauthenticated`},i=()=>localStorage.getItem(`accessToken`),a=e=>{localStorage.setItem(`accessToken`,e)},o=`/api`,s=class extends Error{status;body;constructor(e,t){super(`API Error ${e}`),this.status=e,this.body=t}};async function c(e,n={}){let{auth:a=!0,headers:c,...u}=n,d={"Content-Type":`application/json`,...c},f=new Headers(d);if(a){let e=i();e&&f.append(`Authorization`,`Bearer ${e}`)}let p=await fetch(`${o}${e}`,{...u,headers:f});if(p.status===401&&(r(),t(`/login`)),!p.ok)throw new s(p.status,await l(p));if(p.status!==204)return p.json()}async function l(e){try{return await e.json()}catch{return null}}var u={get:(e,t)=>c(e,{...t,method:`GET`}),post:(e,t,n)=>c(e,{...n,method:`POST`,body:JSON.stringify(t)}),put:(e,t,n)=>c(e,{...n,method:`PUT`,body:JSON.stringify(t)}),delete:(e,t)=>c(e,{...t,method:`DELETE`})};export{a as i,n,r,u as t}; \ No newline at end of file +import{J as e}from"./39JK5HWF.js";import{t}from"./B0qrqti_.js";import"./DL7ZyBAF.js";var n=e({user:null,status:`loading`}),r=()=>{localStorage.removeItem(`accessToken`),n.status=`unauthenticated`},i=()=>localStorage.getItem(`accessToken`),a=e=>{localStorage.setItem(`accessToken`,e)},o=`/api`,s=class extends Error{status;body;constructor(e,t){super(`API Error ${e}`),this.status=e,this.body=t}};async function c(e,n={}){let{auth:a=!0,headers:c,...u}=n,d={"Content-Type":`application/json`,...c},f=new Headers(d);if(a){let e=i();e&&f.append(`Authorization`,`Bearer ${e}`)}let p=await fetch(`${o}${e}`,{...u,headers:f});if(p.status===401&&(r(),t(`/login`)),!p.ok)throw new s(p.status,await l(p));if(p.status!==204)return p.json()}async function l(e){try{return await e.json()}catch{return null}}var u={get:(e,t)=>c(e,{...t,method:`GET`}),post:(e,t,n)=>c(e,{...n,method:`POST`,body:JSON.stringify(t)}),put:(e,t,n)=>c(e,{...n,method:`PUT`,body:JSON.stringify(t)}),delete:(e,t)=>c(e,{...t,method:`DELETE`})};export{a as i,n,r,u as t}; \ No newline at end of file diff --git a/backend/internal/http/web/_app/immutable/chunks/BEgKbVuy.js b/backend/internal/http/web/_app/immutable/chunks/BDef5Ccs.js similarity index 79% rename from backend/internal/http/web/_app/immutable/chunks/BEgKbVuy.js rename to backend/internal/http/web/_app/immutable/chunks/BDef5Ccs.js index a5a40b7..bb7450f 100644 --- a/backend/internal/http/web/_app/immutable/chunks/BEgKbVuy.js +++ b/backend/internal/http/web/_app/immutable/chunks/BDef5Ccs.js @@ -1 +1 @@ -import{t as e}from"./BqkZ0BZ5.js";var t={me:()=>e.get(`/user/me`),update:(t,n)=>e.put(`/user/${t}`,n),listAddresses:t=>e.get(`/user/${t}/address`),createAddress:(t,n)=>e.post(`/user/${t}/address`,n),updateAddress:(t,n)=>e.put(`/user/${t}/address`,n),deleteAddress:(t,n)=>e.delete(`/user/${t}/address/${n}`)};export{t}; \ No newline at end of file +import{t as e}from"./BC84wEQu.js";var t={me:()=>e.get(`/user/me`),update:(t,n)=>e.put(`/user/${t}`,n),listAddresses:t=>e.get(`/user/${t}/address`),createAddress:(t,n)=>e.post(`/user/${t}/address`,n),updateAddress:(t,n)=>e.put(`/user/${t}/address`,n),deleteAddress:(t,n)=>e.delete(`/user/${t}/address/${n}`)};export{t}; \ No newline at end of file diff --git a/backend/internal/http/web/_app/immutable/chunks/D4uBfDnr.js b/backend/internal/http/web/_app/immutable/chunks/BorM6hBh.js similarity index 99% rename from backend/internal/http/web/_app/immutable/chunks/D4uBfDnr.js rename to backend/internal/http/web/_app/immutable/chunks/BorM6hBh.js index 159c3a9..bc14f83 100644 --- a/backend/internal/http/web/_app/immutable/chunks/D4uBfDnr.js +++ b/backend/internal/http/web/_app/immutable/chunks/BorM6hBh.js @@ -1,4 +1,4 @@ -import{$ as e,A as t,B as n,D as r,E as i,G as a,I as o,J as s,K as c,L as l,M as u,N as d,O as f,P as p,Q as m,S as h,T as g,V as _,W as v,X as y,_ as b,a as x,at as ee,b as S,c as te,d as C,dt as w,f as ne,h as re,it as ie,j as ae,k as oe,l as se,lt as ce,m as le,n as ue,o as de,q as T,r as fe,u as pe,w as E,x as me}from"./39JK5HWF.js";import"./D3up1JC1.js";import"./xihTtKlq.js";var he=Math.min,D=Math.max,ge=Math.round,O=Math.floor,k=e=>({x:e,y:e}),A={left:`right`,right:`left`,bottom:`top`,top:`bottom`};function _e(e,t,n){return D(e,he(t,n))}function j(e,t){return typeof e==`function`?e(t):e}function M(e){return e.split(`-`)[0]}function N(e){return e.split(`-`)[1]}function P(e){return e===`x`?`y`:`x`}function ve(e){return e===`y`?`height`:`width`}function F(e){let t=e[0];return t===`t`||t===`b`?`y`:`x`}function I(e){return P(F(e))}function ye(e,t,n){n===void 0&&(n=!1);let r=N(e),i=I(e),a=ve(i),o=i===`x`?r===(n?`end`:`start`)?`right`:`left`:r===`start`?`bottom`:`top`;return t.reference[a]>t.floating[a]&&(o=Ee(o)),[o,Ee(o)]}function be(e){let t=Ee(e);return[L(e),t,L(t)]}function L(e){return e.includes(`start`)?e.replace(`start`,`end`):e.replace(`end`,`start`)}var xe=[`left`,`right`],Se=[`right`,`left`],R=[`top`,`bottom`],Ce=[`bottom`,`top`];function we(e,t,n){switch(e){case`top`:case`bottom`:return n?t?Se:xe:t?xe:Se;case`left`:case`right`:return t?R:Ce;default:return[]}}function Te(e,t,n,r){let i=N(e),a=we(M(e),n===`start`,r);return i&&(a=a.map(e=>e+`-`+i),t&&(a=a.concat(a.map(L)))),a}function Ee(e){let t=M(e);return A[t]+e.slice(t.length)}function De(e){return{top:e.top??0,right:e.right??0,bottom:e.bottom??0,left:e.left??0}}function Oe(e){return typeof e==`number`?{top:e,right:e,bottom:e,left:e}:De(e)}function ke(e){let{x:t,y:n,width:r,height:i}=e;return{width:r,height:i,top:n,left:t,right:t+r,bottom:n+i,x:t,y:n}}function Ae(e,t,n){let{reference:r,floating:i}=e,a=F(t),o=I(t),s=ve(o),c=M(t),l=a===`y`,u=r.x+r.width/2-i.width/2,d=r.y+r.height/2-i.height/2,f=r[s]/2-i[s]/2,p;switch(c){case`top`:p={x:u,y:r.y-i.height};break;case`bottom`:p={x:u,y:r.y+r.height};break;case`right`:p={x:r.x+r.width,y:d};break;case`left`:p={x:r.x-i.width,y:d};break;default:p={x:r.x,y:r.y}}let m=N(t);return m&&(p[o]+=f*(m===`end`?1:-1)*(n&&l?-1:1)),p}async function je(e,t){t===void 0&&(t={});let{x:n,y:r,platform:i,rects:a,elements:o,strategy:s}=e,{boundary:c=`clippingAncestors`,rootBoundary:l=`viewport`,elementContext:u=`floating`,altBoundary:d=!1,padding:f=0}=j(t,e),p=Oe(f),m=o[d?u===`floating`?`reference`:`floating`:u],h=ke(await i.getClippingRect({element:await(i.isElement==null?void 0:i.isElement(m))??!0?m:m.contextElement||await(i.getDocumentElement==null?void 0:i.getDocumentElement(o.floating)),boundary:c,rootBoundary:l,strategy:s})),g=u===`floating`?{x:n,y:r,width:a.floating.width,height:a.floating.height}:a.reference,_=await(i.getOffsetParent==null?void 0:i.getOffsetParent(o.floating)),v=await(i.isElement==null?void 0:i.isElement(_))&&await(i.getScale==null?void 0:i.getScale(_))||{x:1,y:1},y=ke(i.convertOffsetParentRelativeRectToViewportRelativeRect?await i.convertOffsetParentRelativeRectToViewportRelativeRect({elements:o,rect:g,offsetParent:_,strategy:s}):g);return{top:(h.top-y.top+p.top)/v.y,bottom:(y.bottom-h.bottom+p.bottom)/v.y,left:(h.left-y.left+p.left)/v.x,right:(y.right-h.right+p.right)/v.x}}var Me=50,Ne=async(e,t,n)=>{let{placement:r=`bottom`,strategy:i=`absolute`,middleware:a=[],platform:o}=n,s=o.detectOverflow?o:{...o,detectOverflow:je},c=await(o.isRTL==null?void 0:o.isRTL(t)),l=await o.getElementRects({reference:e,floating:t,strategy:i}),{x:u,y:d}=Ae(l,r,c),f=r,p=0,m={};for(let n=0;ne<=0)){let e=(i.flip?.index||0)+1,t=ee[e];if(t&&(u!==`alignment`||_===F(t)||C.every(e=>F(e.placement)!==_||e.overflows[0]>0)))return{data:{index:e,overflows:C},reset:{placement:t}};let n=C.filter(e=>e.overflows[0]<=0).sort((e,t)=>e.overflows[1]-t.overflows[1])[0]?.placement;if(!n)switch(f){case`bestFit`:{let e=C.filter(e=>{if(x){let t=F(e.placement);return t===_||t===`y`}return!0}).map(e=>[e.placement,e.overflows.filter(e=>e>0).reduce((e,t)=>e+t,0)]).sort((e,t)=>e[1]-t[1])[0]?.[0];e&&(n=e);break}case`initialPlacement`:n=o}if(r!==n)return{reset:{placement:n}}}return{}}}},z=new Set([`left`,`top`]);async function Fe(e,t){let{placement:n,platform:r,elements:i}=e,a=await(r.isRTL==null?void 0:r.isRTL(i.floating)),o=M(n),s=N(n),c=F(n)===`y`,l=z.has(o)?-1:1,u=a&&c?-1:1,d=j(t,e),{mainAxis:f,crossAxis:p,alignmentAxis:m}=typeof d==`number`?{mainAxis:d,crossAxis:0,alignmentAxis:null}:{mainAxis:d.mainAxis||0,crossAxis:d.crossAxis||0,alignmentAxis:d.alignmentAxis};return s&&typeof m==`number`&&(p=s===`end`?m*-1:m),c?{x:p*u,y:f*l}:{x:f*l,y:p*u}}var Ie=function(e){return e===void 0&&(e=0),{name:`offset`,options:e,async fn(t){var n;let{x:r,y:i,placement:a,middlewareData:o}=t,s=await Fe(t,e);return a===o.offset?.placement&&(n=o.arrow)!=null&&n.alignmentOffset?{}:{x:r+s.x,y:i+s.y,data:{...s,placement:a}}}}},Le=function(e){return e===void 0&&(e={}),{name:`shift`,options:e,async fn(t){let{x:n,y:r,placement:i,platform:a}=t,{mainAxis:o=!0,crossAxis:s=!1,limiter:c={fn:e=>{let{x:t,y:n}=e;return{x:t,y:n}}},...l}=j(e,t),u={x:n,y:r},d=await a.detectOverflow(t,l),f=F(i),p=P(f),m=u[p],h=u[f],g=(e,t)=>_e(t+d[e===`y`?`top`:`left`],t,t-d[e===`y`?`bottom`:`right`]);o&&(m=g(p,m)),s&&(h=g(f,h));let _=c.fn({...t,[p]:m,[f]:h});return{..._,data:{x:_.x-n,y:_.y-r,enabled:{[p]:o,[f]:s}}}}}};function Re(){return typeof window<`u`}function ze(e){return H(e)?(e.nodeName||``).toLowerCase():`#document`}function B(e){var t;return(e==null||(t=e.ownerDocument)==null?void 0:t.defaultView)||window}function V(e){return((H(e)?e.ownerDocument:e.document)||window.document)?.documentElement}function H(e){return Re()?e instanceof Node||e instanceof B(e).Node:!1}function U(e){return Re()?e instanceof Element||e instanceof B(e).Element:!1}function W(e){return Re()?e instanceof HTMLElement||e instanceof B(e).HTMLElement:!1}function Be(e){return!Re()||typeof ShadowRoot>`u`?!1:e instanceof ShadowRoot||e instanceof B(e).ShadowRoot}function Ve(e){let{overflow:t,overflowX:n,overflowY:r,display:i}=J(e);return/auto|scroll|overlay|hidden|clip/.test(t+r+n)&&i!==`inline`&&i!==`contents`}function He(e){return/^(table|td|th)$/.test(ze(e))}function Ue(e){try{if(e.matches(`:popover-open`))return!0}catch{}try{return e.matches(`:modal`)}catch{return!1}}var G=/transform|translate|scale|rotate|perspective|filter/,We=/paint|layout|strict|content/,K=e=>!!e&&e!==`none`,Ge;function Ke(e){let t=U(e)?J(e):e;return K(t.transform)||K(t.translate)||K(t.scale)||K(t.rotate)||K(t.perspective)||!qe()&&(K(t.backdropFilter)||K(t.filter))||G.test(t.willChange||``)||We.test(t.contain||``)}function q(e){let t=Y(e);for(;W(t)&&!Je(t);){if(Ke(t))return t;if(Ue(t))return null;t=Y(t)}return null}function qe(){return Ge??=typeof CSS<`u`&&CSS.supports&&CSS.supports(`-webkit-backdrop-filter`,`none`),Ge}function Je(e){return/^(html|body|#document)$/.test(ze(e))}function J(e){return B(e).getComputedStyle(e)}function Ye(e){return U(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.scrollX,scrollTop:e.scrollY}}function Y(e){if(ze(e)===`html`)return e;let t=e.assignedSlot||e.parentNode||Be(e)&&e.host||V(e);return Be(t)?t.host:t}function Xe(e){let t=Y(e);return Je(t)?(e.ownerDocument||e).body:W(t)&&Ve(t)?t:Xe(t)}function X(e,t,n){t===void 0&&(t=[]),n===void 0&&(n=!0);let r=Xe(e),i=r===e.ownerDocument?.body,a=B(r);if(i){let e=Ze(a);return t.concat(a,a.visualViewport||[],Ve(r)?r:[],e&&n?X(e):[])}return t.concat(r,X(r,[],n))}function Ze(e){return e.parent&&Object.getPrototypeOf(e.parent)?e.frameElement:null}function Qe(e){let t=J(e),n=parseFloat(t.width)||0,r=parseFloat(t.height)||0,i=W(e),a=i?e.offsetWidth:n,o=i?e.offsetHeight:r,s=ge(n)!==a||ge(r)!==o;return s&&(n=a,r=o),{width:n,height:r,$:s}}function $e(e){return U(e)?e:e.contextElement}function et(e){let t=$e(e);if(!W(t))return k(1);let n=t.getBoundingClientRect(),{width:r,height:i,$:a}=Qe(t),o=(a?ge(n.width):n.width)/r,s=(a?ge(n.height):n.height)/i;return(!o||!Number.isFinite(o))&&(o=1),(!s||!Number.isFinite(s))&&(s=1),{x:o,y:s}}var tt=k(0);function nt(e){let t=B(e);return!qe()||!t.visualViewport?tt:{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}}function rt(e,t,n){return t===void 0&&(t=!1),!!n&&t&&n===B(e)}function Z(e,t,n,r){t===void 0&&(t=!1),n===void 0&&(n=!1);let i=e.getBoundingClientRect(),a=$e(e),o=k(1);t&&(r?U(r)&&(o=et(r)):o=et(e));let s=rt(a,n,r)?nt(a):k(0),c=(i.left+s.x)/o.x,l=(i.top+s.y)/o.y,u=i.width/o.x,d=i.height/o.y;if(a&&r){let e=B(a),t=U(r)?B(r):r,n=e,i=Ze(n);for(;i&&t!==n;){let e=et(i),t=i.getBoundingClientRect(),r=J(i),a=t.left+(i.clientLeft+parseFloat(r.paddingLeft))*e.x,o=t.top+(i.clientTop+parseFloat(r.paddingTop))*e.y;c*=e.x,l*=e.y,u*=e.x,d*=e.y,c+=a,l+=o,n=B(i),i=Ze(n)}}return ke({width:u,height:d,x:c,y:l})}function it(e,t){let n=Ye(e).scrollLeft;return t?t.left+n:Z(V(e)).left+n}function at(e,t){let n=e.getBoundingClientRect();return{x:n.left+t.scrollLeft-it(e,n),y:n.top+t.scrollTop}}function ot(e){let{elements:t,rect:n,offsetParent:r,strategy:i}=e,a=i===`fixed`,o=V(r),s=t?Ue(t.floating):!1;if(r===o||s&&a)return n;let c={scrollLeft:0,scrollTop:0},l=k(1),u=k(0),d=W(r);if((d||!a)&&((ze(r)!==`body`||Ve(o))&&(c=Ye(r)),d)){let e=Z(r);l=et(r),u.x=e.x+r.clientLeft,u.y=e.y+r.clientTop}let f=o&&!d&&!a?at(o,c):k(0);return{width:n.width*l.x,height:n.height*l.y,x:n.x*l.x-c.scrollLeft*l.x+u.x+f.x,y:n.y*l.y-c.scrollTop*l.y+u.y+f.y}}function st(e){return e.getClientRects?Array.from(e.getClientRects()):[]}function ct(e){let t=Ye(e),n=e.ownerDocument.body,r=D(e.scrollWidth,e.clientWidth,n.scrollWidth,n.clientWidth),i=D(e.scrollHeight,e.clientHeight,n.scrollHeight,n.clientHeight),a=-t.scrollLeft+it(e),o=-t.scrollTop;return J(n).direction===`rtl`&&(a+=D(e.clientWidth,n.clientWidth)-r),{width:r,height:i,x:a,y:o}}var Q=25;function lt(e,t,n){n===void 0&&(n=`viewport`);let r=n===`layoutViewport`,i=B(e),a=V(e),o=i.visualViewport,s=a.clientWidth,c=a.clientHeight,l=0,u=0;if(o){let e=!qe()||t===`fixed`;r?e||(l=-o.offsetLeft,u=-o.offsetTop):(s=o.width,c=o.height,e&&(l=o.offsetLeft,u=o.offsetTop))}if(it(a)<=0){let e=a.ownerDocument,t=e.body,n=getComputedStyle(t),r=e.compatMode===`CSS1Compat`&&parseFloat(n.marginLeft)+parseFloat(n.marginRight)||0,i=Math.abs(a.clientWidth-t.clientWidth-r),o=getComputedStyle(a).scrollbarGutter===`stable both-edges`?i/2:i;o<=Q&&(s-=o)}return{width:s,height:c,x:l,y:u}}function ut(e,t){let n=Z(e,!0,t===`fixed`),r=n.top+e.clientTop,i=n.left+e.clientLeft,a=et(e);return{width:e.clientWidth*a.x,height:e.clientHeight*a.y,x:i*a.x,y:r*a.y}}function dt(e,t,n){let r;if(t===`viewport`||t===`layoutViewport`)r=lt(e,n,t);else if(t===`document`)r=ct(V(e));else if(U(t))r=ut(t,n);else{let n=nt(e);r={x:t.x-n.x,y:t.y-n.y,width:t.width,height:t.height}}return ke(r)}function ft(e,t){let n=t.get(e);if(n)return n;let r=X(e,[],!1).filter(e=>U(e)&&ze(e)!==`body`),i=null,a=J(e).position===`fixed`,o=a?Y(e):e;for(;U(o)&&!Je(o);){let e=J(o),t=Ke(o),n=i?i.position:a?`fixed`:``;!t&&(n===`fixed`||n===`absolute`&&e.position===`static`)?r=r.filter(e=>e!==o):i=e,o=Y(o)}return t.set(e,r),r}function pt(e){let{element:t,boundary:n,rootBoundary:r,strategy:i}=e,a=[...n===`clippingAncestors`?Ue(t)?[]:ft(t,this._c):[].concat(n),r],o=dt(t,a[0],i),s=o.top,c=o.right,l=o.bottom,u=o.left;for(let e=1;e{s(!1,1e-7)},1e3)}y=!1}try{r=new IntersectionObserver(b,{...v,root:a.ownerDocument})}catch{r=new IntersectionObserver(b,v)}r.observe(e)}let c=B(e),l=()=>s(n);return c.addEventListener(`resize`,l),s(!0),()=>{c.removeEventListener(`resize`,l),o()}}function wt(e,t,n,r){r===void 0&&(r={});let{ancestorScroll:i=!0,ancestorResize:a=!0,elementResize:o=typeof ResizeObserver==`function`,layoutShift:s=typeof IntersectionObserver==`function`,animationFrame:c=!1}=r,l=$e(e),u=i||a?[...l?X(l):[],...t?X(t):[]]:[];u.forEach(e=>{i&&e.addEventListener(`scroll`,n),a&&e.addEventListener(`resize`,n)});let d=l&&s?Ct(l,n,a):null,f=-1,p=null;o&&(p=new ResizeObserver(e=>{let[r]=e;r&&r.target===l&&p&&t&&(p.unobserve(t),cancelAnimationFrame(f),f=requestAnimationFrame(()=>{var e;(e=p)==null||e.observe(t)})),n()}),l&&!c&&p.observe(l),t&&p.observe(t));let m,h=c?Z(e):null;c&&g();function g(){let t=Z(e);h&&!St(h,t)&&n(),h=t,m=requestAnimationFrame(g)}return n(),()=>{var e;u.forEach(e=>{i&&e.removeEventListener(`scroll`,n),a&&e.removeEventListener(`resize`,n)}),d?.(),(e=p)==null||e.disconnect(),p=null,c&&cancelAnimationFrame(m)}}var Tt=Ie,Et=Le,Dt=Pe,Ot=(e,t,n)=>{let r=new Map,i=n??{},a={...xt,...i.platform,_c:r};return Ne(e,t,{...i,platform:a})};function kt(e){let t,n,r={autoUpdate:!0},i=e,a=t=>({...r,...e||{},...t||{}}),s=e=>{t&&n&&(i=a(e),Ot(t,n,i).then(e=>{Object.assign(n.style,{position:e.strategy,left:`${e.x}px`,top:`${e.y}px`}),i?.onComputed&&i.onComputed(e)}))},c=e=>{if(`subscribe`in e)return u(e),{};t=e,s()},l=(e,r)=>{let c;n=e,i=a(r),setTimeout(()=>s(r),0),s(r);let l=()=>{c&&=(c(),void 0)},u=({autoUpdate:e}=i||{})=>{l(),e!==!1&&o().then(()=>wt(t,n,()=>s(i),e===!0?{}:e))};return c=u(),{update(e){s(e),c=u(e)},destroy(){l()}}},u=e=>{let n=e.subscribe(e=>{t===void 0?(t=e,s()):(Object.assign(t,e),s())});ue(n)};return[c,l,s]}function At({loadOptions:e,filterText:t,items:n,multiple:r,value:i,itemId:a,groupBy:o,filterSelectedItems:s,itemFilter:c,convertStringItemsToObjects:l,filterGroupedItems:u,label:d}){if(n&&e)return n;if(!n)return[];n&&n.length>0&&typeof n[0]!=`object`&&(n=l(n));let f=n.filter(e=>{let n=c(e[d],t,e);return n&&r&&Array.isArray(i)&&i.length&&(n=!i.some(t=>{let n=typeof t==`object`&&t?t[a]:t;return s?n===e[a]:!1})),n});return o&&(f=u(f)),f}async function jt({onerror:e,onloaded:t,loadOptions:n,convertStringItemsToObjects:r,filterText:i}){let a=await n(i).catch(t=>{console.warn(`svelte-select loadOptions error :>> `,t),e?.({type:`loadOptions`,details:t})});if(a&&!a.cancelled)return a?(a&&a.length>0&&typeof a[0]!=`object`&&(a=r(a)),t?.({items:a})):a=[],{filteredItems:a,loading:!1,focused:!0,listOpen:!0}}ce();var $=oe(`
`),j=l(` `,1);function M(l,v){g(v,!0);let T=h(v,`components`,23,()=>[]),E=h(v,`data_0`,3,null),D=h(v,`data_1`,3,null),O=h(v,`data_2`,3,null);o(()=>v.stores.page.set(v.page)),p(()=>{v.stores,v.page,v.constructors,T(),v.form,E(),D(),O(),v.stores.page.notify()});let k=d(!1),M=d(!1),N=d(null);S(()=>{let e=v.stores.page.subscribe(()=>{u(k)&&(m(M,!0),s().then(()=>{m(N,document.title||`untitled page`,!0)}))});return m(k,!0),e});let P=e(()=>v.constructors[2]);var F=j(),I=c(F),L=t=>{let n=e(()=>v.constructors[0]);var a=r(),o=c(a);w(o,()=>u(n),(t,n)=>{b(n(t,{get data(){return E()},get form(){return v.form},get params(){return v.page.params},children:(t,n)=>{var a=r(),o=c(a),s=t=>{let n=e(()=>v.constructors[1]);var a=r(),o=c(a);w(o,()=>u(n),(e,t)=>{b(t(e,{get data(){return D()},get form(){return v.form},get params(){return v.page.params},children:(e,t)=>{var n=r(),a=c(n);w(a,()=>u(P),(e,t)=>{b(t(e,{get data(){return O()},get form(){return v.form},get params(){return v.page.params}}),e=>T()[2]=e,()=>T()?.[2])}),i(e,n)},$$slots:{default:!0}}),e=>T()[1]=e,()=>T()?.[1])}),i(t,a)},l=t=>{let n=e(()=>v.constructors[1]);var a=r(),o=c(a);w(o,()=>u(n),(e,t)=>{b(t(e,{get data(){return D()},get form(){return v.form},get params(){return v.page.params}}),e=>T()[1]=e,()=>T()?.[1])}),i(t,a)};C(o,e=>{v.constructors[2]?e(s):e(l,-1)}),i(t,a)},$$slots:{default:!0}}),e=>T()[0]=e,()=>T()?.[0])}),i(t,a)},R=t=>{let n=e(()=>v.constructors[0]);var a=r(),o=c(a);w(o,()=>u(n),(e,t)=>{b(t(e,{get data(){return E()},get form(){return v.form},get params(){return v.page.params}}),e=>T()[0]=e,()=>T()?.[0])}),i(t,a)};C(I,e=>{v.constructors[1]?e(L):e(R,-1)});var z=x(I,2),B=e=>{var r=A(),o=a(r),s=e=>{var r=t();n(()=>f(r,u(N))),i(e,r)};C(o,e=>{u(M)&&e(s)}),_(r),i(e,r)};C(z,e=>{u(k)&&e(B)}),i(l,F),y()}var N=v(M),P=[()=>O(()=>import(`../nodes/0.DNLpy_rd.js`),__vite__mapDeps([0,1,2,3,4]),import.meta.url),()=>O(()=>import(`../nodes/1.Cvrs0-W0.js`),__vite__mapDeps([5,1,2,6,7]),import.meta.url),()=>O(()=>import(`../nodes/2.Bs3bPWro.js`),__vite__mapDeps([8,1,7,2,3,6,9,10,11,12,13]),import.meta.url),()=>O(()=>import(`../nodes/3.BD_oZvMH.js`),__vite__mapDeps([14,1,7,2,9,12]),import.meta.url),()=>O(()=>import(`../nodes/4.Dw1ji0S9.js`),__vite__mapDeps([15,1,2]),import.meta.url),()=>O(()=>import(`../nodes/5.BV8wWprr.js`),__vite__mapDeps([16,1,2]),import.meta.url),()=>O(()=>import(`../nodes/6.iWRSAZEv.js`),__vite__mapDeps([17,1,2]),import.meta.url),()=>O(()=>import(`../nodes/7.CJ-_CrAo.js`),__vite__mapDeps([18,1,2]),import.meta.url),()=>O(()=>import(`../nodes/8.D-K-fxzc.js`),__vite__mapDeps([19,1,2,10,7,9,20,21,22]),import.meta.url),()=>O(()=>import(`../nodes/9.C_kOH_FX.js`),__vite__mapDeps([23,1,2]),import.meta.url),()=>O(()=>import(`../nodes/10.2kRbJUBr.js`),__vite__mapDeps([24,1,2]),import.meta.url),()=>O(()=>import(`../nodes/11.3PxmG5oJ.js`),__vite__mapDeps([25,1,2]),import.meta.url),()=>O(()=>import(`../nodes/12.B5iUSTUw.js`),__vite__mapDeps([26,1,2,20,10,7,9,21,22,27]),import.meta.url),()=>O(()=>import(`../nodes/13.CjlegDH_.js`),__vite__mapDeps([28,1,2]),import.meta.url),()=>O(()=>import(`../nodes/14.CFcHzpcm.js`),__vite__mapDeps([29,1,2]),import.meta.url),()=>O(()=>import(`../nodes/15.SpasLkf4.js`),__vite__mapDeps([30,1,2]),import.meta.url),()=>O(()=>import(`../nodes/16.TiX4VGhr.js`),__vite__mapDeps([31,1,2]),import.meta.url),()=>O(()=>import(`../nodes/17.wrIvaz1M.js`),__vite__mapDeps([32,1,2,3,10,7,9,11,21,22,27]),import.meta.url),()=>O(()=>import(`../nodes/18.BfPDxxm9.js`),__vite__mapDeps([33,1,7,2,9,10,13,34]),import.meta.url),()=>O(()=>import(`../nodes/19.Bhx_NIDl.js`),__vite__mapDeps([35,1,7,2,9,13,21,27,34,10]),import.meta.url)],F=[],I={"/(authenticated)":[3,[2]],"/(public)/login":[18],"/(authenticated)/profile":[17,[2]],"/(public)/register":[19],"/(authenticated)/[space]/(chat)":[4,[2]],"/(authenticated)/[space]/history":[5,[2]],"/(authenticated)/[space]/kb":[6,[2]],"/(authenticated)/[space]/settings":[7,[2]],"/(authenticated)/[space]/settings/agents":[8,[2]],"/(authenticated)/[space]/settings/channels":[9,[2]],"/(authenticated)/[space]/settings/kb":[10,[2]],"/(authenticated)/[space]/settings/memory":[11,[2]],"/(authenticated)/[space]/settings/models":[12,[2]],"/(authenticated)/[space]/settings/skills":[13,[2]],"/(authenticated)/[space]/settings/tools":[14,[2]],"/(authenticated)/[space]/settings/users":[15,[2]],"/(authenticated)/[space]/tasks":[16,[2]]},L={handleError:(({error:e})=>{console.error(e)}),reroute:(()=>{}),transport:{}},R=Object.fromEntries(Object.entries(L.transport).map(([e,t])=>[e,t.decode])),z=Object.fromEntries(Object.entries(L.transport).map(([e,t])=>[e,t.encode])),B=!1,V=(e,t)=>R[e](t),H=()=>O(()=>import(`../chunks/Bjy-W4x2.js`).then(e=>e.default),[],import.meta.url);export{V as decode,R as decoders,I as dictionary,z as encoders,H as get_error_template,B as hash,L as hooks,k as matchers,P as nodes,N as root,F as server_loads}; \ No newline at end of file +const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["../nodes/0.WTbeuaG5.js","../chunks/39JK5HWF.js","../chunks/xihTtKlq.js","../chunks/DTCALkcP.js","../assets/0.PdzDvXHc.css","../nodes/1.HToxGbTu.js","../chunks/DtPl1hOB.js","../chunks/B0qrqti_.js","../nodes/2.DJpmXDpd.js","../chunks/DL7ZyBAF.js","../chunks/BC84wEQu.js","../chunks/BDef5Ccs.js","../chunks/D8dI9nx6.js","../chunks/BRXBpvt8.js","../nodes/3.DQ-wAvIJ.js","../nodes/4.Dw1ji0S9.js","../nodes/5.BV8wWprr.js","../nodes/6.iWRSAZEv.js","../nodes/7.CJ-_CrAo.js","../nodes/8.TeTitTKA.js","../chunks/DOY2HMbt.js","../chunks/DRdGzrsF.js","../chunks/BorM6hBh.js","../nodes/9.C_kOH_FX.js","../nodes/10.2kRbJUBr.js","../nodes/11.3PxmG5oJ.js","../nodes/12.DXjVg3KD.js","../chunks/D3MDK1zR.js","../nodes/13.CjlegDH_.js","../nodes/14.CFcHzpcm.js","../nodes/15.SpasLkf4.js","../nodes/16.TiX4VGhr.js","../nodes/17.D_IcqSXn.js","../nodes/18.CljvOcq_.js","../chunks/DFI7Zp3t.js","../nodes/19.B7Etxitc.js"])))=>i.map(i=>d[i]); +import{$ as e,A as t,B as n,D as r,E as i,G as a,H as o,I as s,K as c,O as l,P as u,Q as d,T as f,V as p,X as m,a as h,at as g,dt as _,i as v,it as y,o as b,q as x,r as S,w as C,y as w}from"../chunks/39JK5HWF.js";import"../chunks/xihTtKlq.js";var T=`modulepreload`,E=function(e,t){return new URL(e,t).href},D={},O=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href}r=o(t.map(t=>{if(t=E(t,n),t=s(t),t in D)return;D[t]=!0;let r=t.endsWith(`.css`);for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}let i=document.createElement(`link`);if(i.rel=r?`stylesheet`:T,r||(i.as=`script`),i.crossOrigin=``,i.href=t,a&&i.setAttribute(`nonce`,a),document.head.appendChild(i),r)return new Promise((e,n)=>{i.addEventListener(`load`,e),i.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},k={},A=l(`
`),j=l(` `,1);function M(l,v){g(v,!0);let T=h(v,`components`,23,()=>[]),E=h(v,`data_0`,3,null),D=h(v,`data_1`,3,null),O=h(v,`data_2`,3,null);o(()=>v.stores.page.set(v.page)),p(()=>{v.stores,v.page,v.constructors,T(),v.form,E(),D(),O(),v.stores.page.notify()});let k=d(!1),M=d(!1),N=d(null);S(()=>{let e=v.stores.page.subscribe(()=>{u(k)&&(m(M,!0),s().then(()=>{m(N,document.title||`untitled page`,!0)}))});return m(k,!0),e});let P=e(()=>v.constructors[2]);var F=j(),I=c(F),L=t=>{let n=e(()=>v.constructors[0]);var a=r(),o=c(a);w(o,()=>u(n),(t,n)=>{b(n(t,{get data(){return E()},get form(){return v.form},get params(){return v.page.params},children:(t,n)=>{var a=r(),o=c(a),s=t=>{let n=e(()=>v.constructors[1]);var a=r(),o=c(a);w(o,()=>u(n),(e,t)=>{b(t(e,{get data(){return D()},get form(){return v.form},get params(){return v.page.params},children:(e,t)=>{var n=r(),a=c(n);w(a,()=>u(P),(e,t)=>{b(t(e,{get data(){return O()},get form(){return v.form},get params(){return v.page.params}}),e=>T()[2]=e,()=>T()?.[2])}),i(e,n)},$$slots:{default:!0}}),e=>T()[1]=e,()=>T()?.[1])}),i(t,a)},l=t=>{let n=e(()=>v.constructors[1]);var a=r(),o=c(a);w(o,()=>u(n),(e,t)=>{b(t(e,{get data(){return D()},get form(){return v.form},get params(){return v.page.params}}),e=>T()[1]=e,()=>T()?.[1])}),i(t,a)};C(o,e=>{v.constructors[2]?e(s):e(l,-1)}),i(t,a)},$$slots:{default:!0}}),e=>T()[0]=e,()=>T()?.[0])}),i(t,a)},R=t=>{let n=e(()=>v.constructors[0]);var a=r(),o=c(a);w(o,()=>u(n),(e,t)=>{b(t(e,{get data(){return E()},get form(){return v.form},get params(){return v.page.params}}),e=>T()[0]=e,()=>T()?.[0])}),i(t,a)};C(I,e=>{v.constructors[1]?e(L):e(R,-1)});var z=x(I,2),B=e=>{var r=A(),o=a(r),s=e=>{var r=t();n(()=>f(r,u(N))),i(e,r)};C(o,e=>{u(M)&&e(s)}),_(r),i(e,r)};C(z,e=>{u(k)&&e(B)}),i(l,F),y()}var N=v(M),P=[()=>O(()=>import(`../nodes/0.WTbeuaG5.js`),__vite__mapDeps([0,1,2,3,4]),import.meta.url),()=>O(()=>import(`../nodes/1.HToxGbTu.js`),__vite__mapDeps([5,1,2,6,7]),import.meta.url),()=>O(()=>import(`../nodes/2.DJpmXDpd.js`),__vite__mapDeps([8,1,7,2,3,6,9,10,11,12,13]),import.meta.url),()=>O(()=>import(`../nodes/3.DQ-wAvIJ.js`),__vite__mapDeps([14,1,7,2,9,12]),import.meta.url),()=>O(()=>import(`../nodes/4.Dw1ji0S9.js`),__vite__mapDeps([15,1,2]),import.meta.url),()=>O(()=>import(`../nodes/5.BV8wWprr.js`),__vite__mapDeps([16,1,2]),import.meta.url),()=>O(()=>import(`../nodes/6.iWRSAZEv.js`),__vite__mapDeps([17,1,2]),import.meta.url),()=>O(()=>import(`../nodes/7.CJ-_CrAo.js`),__vite__mapDeps([18,1,2]),import.meta.url),()=>O(()=>import(`../nodes/8.TeTitTKA.js`),__vite__mapDeps([19,1,2,10,7,9,12,20,21,22]),import.meta.url),()=>O(()=>import(`../nodes/9.C_kOH_FX.js`),__vite__mapDeps([23,1,2]),import.meta.url),()=>O(()=>import(`../nodes/10.2kRbJUBr.js`),__vite__mapDeps([24,1,2]),import.meta.url),()=>O(()=>import(`../nodes/11.3PxmG5oJ.js`),__vite__mapDeps([25,1,2]),import.meta.url),()=>O(()=>import(`../nodes/12.DXjVg3KD.js`),__vite__mapDeps([26,1,2,20,10,7,9,21,22,27]),import.meta.url),()=>O(()=>import(`../nodes/13.CjlegDH_.js`),__vite__mapDeps([28,1,2]),import.meta.url),()=>O(()=>import(`../nodes/14.CFcHzpcm.js`),__vite__mapDeps([29,1,2]),import.meta.url),()=>O(()=>import(`../nodes/15.SpasLkf4.js`),__vite__mapDeps([30,1,2]),import.meta.url),()=>O(()=>import(`../nodes/16.TiX4VGhr.js`),__vite__mapDeps([31,1,2]),import.meta.url),()=>O(()=>import(`../nodes/17.D_IcqSXn.js`),__vite__mapDeps([32,1,2,3,10,7,9,11,21,22,27]),import.meta.url),()=>O(()=>import(`../nodes/18.CljvOcq_.js`),__vite__mapDeps([33,1,7,2,9,10,13,34]),import.meta.url),()=>O(()=>import(`../nodes/19.B7Etxitc.js`),__vite__mapDeps([35,1,7,2,9,13,21,27,34,10]),import.meta.url)],F=[],I={"/(authenticated)":[3,[2]],"/(public)/login":[18],"/(authenticated)/profile":[17,[2]],"/(public)/register":[19],"/(authenticated)/[space]/(chat)":[4,[2]],"/(authenticated)/[space]/history":[5,[2]],"/(authenticated)/[space]/kb":[6,[2]],"/(authenticated)/[space]/settings":[7,[2]],"/(authenticated)/[space]/settings/agents":[8,[2]],"/(authenticated)/[space]/settings/channels":[9,[2]],"/(authenticated)/[space]/settings/kb":[10,[2]],"/(authenticated)/[space]/settings/memory":[11,[2]],"/(authenticated)/[space]/settings/models":[12,[2]],"/(authenticated)/[space]/settings/skills":[13,[2]],"/(authenticated)/[space]/settings/tools":[14,[2]],"/(authenticated)/[space]/settings/users":[15,[2]],"/(authenticated)/[space]/tasks":[16,[2]]},L={handleError:(({error:e})=>{console.error(e)}),reroute:(()=>{}),transport:{}},R=Object.fromEntries(Object.entries(L.transport).map(([e,t])=>[e,t.decode])),z=Object.fromEntries(Object.entries(L.transport).map(([e,t])=>[e,t.encode])),B=!1,V=(e,t)=>R[e](t),H=()=>O(()=>import(`../chunks/Bjy-W4x2.js`).then(e=>e.default),[],import.meta.url);export{V as decode,R as decoders,I as dictionary,z as encoders,H as get_error_template,B as hash,L as hooks,k as matchers,P as nodes,N as root,F as server_loads}; \ No newline at end of file diff --git a/backend/internal/http/web/_app/immutable/entry/start.Bxa_xdGb.js b/backend/internal/http/web/_app/immutable/entry/start.Bxa_xdGb.js deleted file mode 100644 index b3f4f69..0000000 --- a/backend/internal/http/web/_app/immutable/entry/start.Bxa_xdGb.js +++ /dev/null @@ -1 +0,0 @@ -import{n as e,s as t}from"../chunks/D3up1JC1.js";export{t as load_css,e as start}; \ No newline at end of file diff --git a/backend/internal/http/web/_app/immutable/entry/start.wXD-FaGY.js b/backend/internal/http/web/_app/immutable/entry/start.wXD-FaGY.js new file mode 100644 index 0000000..4b25814 --- /dev/null +++ b/backend/internal/http/web/_app/immutable/entry/start.wXD-FaGY.js @@ -0,0 +1 @@ +import{n as e,s as t}from"../chunks/B0qrqti_.js";export{t as load_css,e as start}; \ No newline at end of file diff --git a/backend/internal/http/web/_app/immutable/nodes/0.DNLpy_rd.js b/backend/internal/http/web/_app/immutable/nodes/0.WTbeuaG5.js similarity index 100% rename from backend/internal/http/web/_app/immutable/nodes/0.DNLpy_rd.js rename to backend/internal/http/web/_app/immutable/nodes/0.WTbeuaG5.js diff --git a/backend/internal/http/web/_app/immutable/nodes/1.Cvrs0-W0.js b/backend/internal/http/web/_app/immutable/nodes/1.HToxGbTu.js similarity index 82% rename from backend/internal/http/web/_app/immutable/nodes/1.Cvrs0-W0.js rename to backend/internal/http/web/_app/immutable/nodes/1.HToxGbTu.js index 7b6f436..0543963 100644 --- a/backend/internal/http/web/_app/immutable/nodes/1.Cvrs0-W0.js +++ b/backend/internal/http/web/_app/immutable/nodes/1.HToxGbTu.js @@ -1 +1 @@ -import{B as e,E as t,G as n,K as r,O as i,T as a,at as o,dt as s,it as c,q as l}from"../chunks/39JK5HWF.js";import"../chunks/xihTtKlq.js";import{t as u}from"../chunks/D1d5-1oo.js";var d=i(`

`,1);function f(i,f){o(f,!0);var p=d(),m=r(p),h=n(m,!0);s(m);var g=l(m,2),_=n(g,!0);s(g),e(()=>{a(h,u.status),a(_,u.error?.message)}),t(i,p),c()}export{f as component}; \ No newline at end of file +import{B as e,E as t,G as n,K as r,O as i,T as a,at as o,dt as s,it as c,q as l}from"../chunks/39JK5HWF.js";import"../chunks/xihTtKlq.js";import{t as u}from"../chunks/DtPl1hOB.js";var d=i(`

`,1);function f(i,f){o(f,!0);var p=d(),m=r(p),h=n(m,!0);s(m);var g=l(m,2),_=n(g,!0);s(g),e(()=>{a(h,u.status),a(_,u.error?.message)}),t(i,p),c()}export{f as component}; \ No newline at end of file diff --git a/backend/internal/http/web/_app/immutable/nodes/12.B5iUSTUw.js b/backend/internal/http/web/_app/immutable/nodes/12.B5iUSTUw.js deleted file mode 100644 index 7e8809e..0000000 --- a/backend/internal/http/web/_app/immutable/nodes/12.B5iUSTUw.js +++ /dev/null @@ -1 +0,0 @@ -import{B as e,C as t,D as n,E as r,G as i,J as a,K as o,M as s,N as c,O as l,P as u,Q as d,T as f,X as p,_ as m,a as h,at as g,c as _,dt as v,ft as y,it as b,j as x,q as S,r as C,s as w,u as T,ut as E,w as D,x as O,z as k}from"../chunks/39JK5HWF.js";import"../chunks/xihTtKlq.js";import{t as A}from"../chunks/D35bQ8xD.js";import{n as j,t as M}from"../chunks/DRdGzrsF.js";import{t as ee}from"../chunks/D4uBfDnr.js";import{n as N}from"../chunks/D3MDK1zR.js";var P=y({load:()=>F}),F=async({params:e})=>({title:`Paramétrage : Modèles`,back:`../settings`,space:e.space,providerTypes:await A.providerTypes()}),I=l(`
  • `),L=l(`
      `);function R(t,l){g(l,!0);let y=h(l,`item`,7),x=d(a(y().models.split(`|`))),C=d(a(y().models.split(`|`).map(e=>({value:e,selected:!0})))),N=new j,P=e=>{e.focus()},F=e=>{e.preventDefault(),y().models=u(x).join(`|`),l.onSave(y())},R=e=>{e.preventDefault(),l.onCancel()},z=e=>{e.preventDefault(),N.clear(),A.getAvailableModels(y().teamId,y()).then(e=>{p(C,e.map(e=>({value:e,selected:u(x).includes(e)})),!0)}).catch(e=>{N.set(`models`,e)})},B=()=>{p(x,u(C).filter(e=>e.selected).map(e=>e.value),!0)};var V=L(),H=i(V),U=i(H),W=i(U),G=S(i(W),2);T(G),k(()=>_(G,()=>y().name,e=>y().name=e)),m(G,e=>P?.(e));var te=S(G,2);M(te,{key:`name`,get errors(){return l.errors}}),v(W);var K=S(W,2),q=S(i(K),2);ee(q,{get items(){return l.providerTypes},valueMode:`id`,get value(){return y().type},set value(e){y().type=e}});var ne=S(q,2);M(ne,{key:`type`,get errors(){return l.errors}}),v(K);var J=S(K,2),Y=S(i(J),2);T(Y);var re=S(Y,2);M(re,{key:`baseUrl`,get errors(){return l.errors}}),v(J);var X=S(J,2),Z=S(i(X),2);T(Z);var ie=S(Z,2);M(ie,{key:`apiKey`,get errors(){return l.errors}}),v(X);var Q=S(X,2),ae=S(i(Q),2),$=S(ae,2);O($,21,()=>u(C),e=>e.value,(t,a,c)=>{var l=n(),d=o(l),p=t=>{var n=I(),o=i(n),c=i(o);T(c);var l=S(c);v(o),v(n),e(()=>f(l,` ${u(a).value??``}`)),s(`change`,c,B),w(c,()=>u(a).selected,e=>u(a).selected=e),r(t,n)};D(d,e=>{u(a).value&&e(p)}),r(t,l)}),v($);var oe=S($,2),se=i(oe);M(se,{key:`models`,get errors(){return N}}),v(oe),v(Q);var ce=S(Q,2),le=i(ce);E(2),v(ce),v(U),v(H),v(V),c(`submit`,U,F),s(`change`,U,()=>{l.errors.clear()}),_(Y,()=>y().baseUrl,e=>y().baseUrl=e),_(Z,()=>y().apiKey,e=>y().apiKey=e),s(`click`,ae,z),s(`click`,le,R),r(t,V),b()}x([`change`,`click`]);var z=l(`
      Ajouter un fournisseur
      `),B=l(`
      `),V=l(`
      `);function H(c,l){g(l,!0);let m=d(a([])),h=d(!1),_=d(null),y=d(a({})),x=new j;C(async()=>{p(m,await A.getProviders(l.data.space),!0)});let w=()=>{u(_)||(x.clear(),p(y,{},!0),u(y).models=``,p(h,!0))},T=()=>{p(h,!1)},E=e=>{e.name||x.set(`name`,`Le nom est obligatoire !`),e.type||x.set(`type`,`Le type est obligatoire !`),e.baseUrl&&!N(e.baseUrl)&&x.set(`baseUrl`,`Mauvaise URL !`),x.size===0&&A.createProvider(l.data.space,e).then(e=>{u(m).push(e),p(h,!1),p(y,{},!0)}).catch(e=>{console.log(e)})},k=()=>{p(_,null),p(y,{},!0)},M=e=>{e.name||x.set(`name`,`Le nom est obligatoire !`),e.type||x.set(`type`,`Le type est obligatoire !`),e.baseUrl&&!N(e.baseUrl)&&x.set(`baseUrl`,`Mauvaise URL !`),x.size===0&&A.updateProvider(l.data.space,e).then(e=>{p(m,u(m).map(t=>e.id===t.id?e:t),!0),p(_,null),p(y,{},!0)}).catch(e=>{console.log(e)})},ee=async e=>{x.clear(),!u(h)&&A.getProvider(l.data.space,e).then(t=>{p(m,u(m).map(n=>n.id===e?t:n),!0),p(_,e,!0)})},P=e=>{A.deleteProvider(l.data.space,e).then(()=>{p(m,u(m).filter(t=>t.id!==e),!0)}).catch(e=>{console.log(e)})};var F=V(),I=i(F),L=e=>{var i=n(),a=o(i);t(a,()=>`new`,e=>{R(e,{get item(){return u(y)},get errors(){return x},get providerTypes(){return l.data.providerTypes},onSave:E,onCancel:T})}),r(e,i)},H=e=>{var t=z();s(`click`,t,w),r(e,t)};D(I,e=>{u(h)?e(L):e(H,-1)});var U=S(I,2);O(U,17,()=>u(m),e=>e.id,(a,c)=>{var d=n(),p=o(d),m=e=>{var i=n(),a=o(i);t(a,()=>u(c).id,e=>{R(e,{get item(){return u(c)},get errors(){return x},get providerTypes(){return l.data.providerTypes},onSave:M,onCancel:k})}),r(e,i)},h=t=>{var n=B(),a=i(n),o=i(a),l=i(o,!0);v(o);var d=S(o,2),p=i(d);v(d),v(a);var m=S(a,2),h=S(m,2);v(n),e(()=>{f(l,u(c).name),f(p,`(${u(c).type??``})`)}),s(`click`,m,()=>ee(u(c).id)),s(`click`,h,()=>P(u(c).id)),r(t,n)};D(p,e=>{u(_)===u(c).id?e(m):e(h,-1)}),r(a,d)}),v(F),r(c,F),b()}x([`click`]);export{H as component,P as universal}; \ No newline at end of file diff --git a/backend/internal/http/web/_app/immutable/nodes/12.DXjVg3KD.js b/backend/internal/http/web/_app/immutable/nodes/12.DXjVg3KD.js new file mode 100644 index 0000000..83054c4 --- /dev/null +++ b/backend/internal/http/web/_app/immutable/nodes/12.DXjVg3KD.js @@ -0,0 +1 @@ +import{B as e,C as t,D as n,E as r,G as i,J as a,K as o,L as s,M as c,N as l,O as u,P as d,Q as f,T as p,X as m,_ as h,a as g,at as _,c as v,dt as y,ft as b,it as x,j as S,q as C,s as ee,u as w,ut as T,w as E,x as D,z as O}from"../chunks/39JK5HWF.js";import"../chunks/xihTtKlq.js";import{t as k}from"../chunks/DOY2HMbt.js";import{n as A,t as j}from"../chunks/DRdGzrsF.js";import{t as M}from"../chunks/BorM6hBh.js";import{n as N}from"../chunks/D3MDK1zR.js";var P=b({load:()=>F}),F=async({params:e})=>({title:`Paramétrage : Modèles`,back:`../settings`,space:e.space,providerTypes:await k.providerTypes(),providers:await k.getProviders(e.space)}),I=u(`
    1. `),L=u(`
        `);function R(t,s){_(s,!0);let u=g(s,`item`,7),b=f(a(u().models.split(`|`))),S=f(a(u().models.split(`|`).map(e=>({value:e,selected:!0})))),N=new A,P=e=>{e.focus()},F=e=>{e.preventDefault(),u().models=d(b).join(`|`),s.onSave(u())},R=e=>{e.preventDefault(),s.onCancel()},z=e=>{e.preventDefault(),N.clear(),k.getAvailableModels(u().teamId,u()).then(e=>{m(S,e.map(e=>({value:e,selected:d(b).includes(e)})),!0)}).catch(e=>{N.set(`models`,e)})},B=()=>{m(b,d(S).filter(e=>e.selected).map(e=>e.value),!0)};var V=L(),H=i(V),U=i(H),W=i(U),G=C(i(W),2);w(G),O(()=>v(G,()=>u().name,e=>u().name=e)),h(G,e=>P?.(e));var te=C(G,2);j(te,{key:`name`,get errors(){return s.errors}}),y(W);var K=C(W,2),q=C(i(K),2);M(q,{get items(){return s.providerTypes},valueMode:`id`,get value(){return u().type},set value(e){u().type=e}});var ne=C(q,2);j(ne,{key:`type`,get errors(){return s.errors}}),y(K);var J=C(K,2),Y=C(i(J),2);w(Y);var re=C(Y,2);j(re,{key:`baseUrl`,get errors(){return s.errors}}),y(J);var X=C(J,2),Z=C(i(X),2);w(Z);var ie=C(Z,2);j(ie,{key:`apiKey`,get errors(){return s.errors}}),y(X);var Q=C(X,2),ae=C(i(Q),2),$=C(ae,2);D($,21,()=>d(S),e=>e.value,(t,a,s)=>{var l=n(),u=o(l),f=t=>{var n=I(),o=i(n),s=i(o);w(s);var l=C(s);y(o),y(n),e(()=>p(l,` ${d(a).value??``}`)),c(`change`,s,B),ee(s,()=>d(a).selected,e=>d(a).selected=e),r(t,n)};E(u,e=>{d(a).value&&e(f)}),r(t,l)}),y($);var oe=C($,2),se=i(oe);j(se,{key:`models`,get errors(){return N}}),y(oe),y(Q);var ce=C(Q,2),le=i(ce);T(2),y(ce),y(U),y(H),y(V),l(`submit`,U,F),c(`change`,U,()=>{s.errors.clear()}),v(Y,()=>u().baseUrl,e=>u().baseUrl=e),v(Z,()=>u().apiKey,e=>u().apiKey=e),c(`click`,ae,z),c(`click`,le,R),r(t,V),x()}S([`change`,`click`]);var z=u(``),B=u(`
        `),V=u(`
        `);function H(l,u){_(u,!0);let h=f(a(s(()=>u.data.providers))),g=f(!1),v=f(null),b=f(a({})),S=new A,ee=()=>{d(v)||(S.clear(),m(b,{},!0),d(b).models=``,m(g,!0))},w=()=>{m(g,!1)},T=e=>{e.name||S.set(`name`,`Le nom est obligatoire !`),e.type||S.set(`type`,`Le type est obligatoire !`),e.baseUrl&&!N(e.baseUrl)&&S.set(`baseUrl`,`Mauvaise URL !`),S.size===0&&k.createProvider(u.data.space,e).then(e=>{d(h).push(e),m(g,!1),m(b,{},!0)}).catch(e=>{console.log(e)})},O=()=>{m(v,null),m(b,{},!0)},j=e=>{e.name||S.set(`name`,`Le nom est obligatoire !`),e.type||S.set(`type`,`Le type est obligatoire !`),e.baseUrl&&!N(e.baseUrl)&&S.set(`baseUrl`,`Mauvaise URL !`),S.size===0&&k.updateProvider(u.data.space,e).then(e=>{m(h,d(h).map(t=>e.id===t.id?e:t),!0),m(v,null),m(b,{},!0)}).catch(e=>{console.log(e)})},M=async e=>{S.clear(),!d(g)&&k.getProvider(u.data.space,e).then(t=>{m(h,d(h).map(n=>n.id===e?t:n),!0),m(v,e,!0)})},P=e=>{k.deleteProvider(u.data.space,e).then(()=>{m(h,d(h).filter(t=>t.id!==e),!0)}).catch(e=>{console.log(e)})};var F=V(),I=i(F),L=e=>{var i=n(),a=o(i);t(a,()=>`new`,e=>{R(e,{get item(){return d(b)},get errors(){return S},get providerTypes(){return u.data.providerTypes},onSave:T,onCancel:w})}),r(e,i)},H=e=>{var t=z();c(`click`,t,ee),r(e,t)};E(I,e=>{d(g)?e(L):e(H,-1)});var U=C(I,2);D(U,17,()=>d(h),e=>e.id,(a,s)=>{var l=n(),f=o(l),m=e=>{var i=n(),a=o(i);t(a,()=>d(s).id,e=>{R(e,{get item(){return d(s)},get errors(){return S},get providerTypes(){return u.data.providerTypes},onSave:j,onCancel:O})}),r(e,i)},h=t=>{var n=B(),a=i(n),o=i(a),l=i(o,!0);y(o);var u=C(o,2),f=i(u);y(u),y(a);var m=C(a,2),h=C(m,2);y(n),e(()=>{p(l,d(s).name),p(f,`(${d(s).type??``})`)}),c(`click`,m,()=>M(d(s).id)),c(`click`,h,()=>P(d(s).id)),r(t,n)};E(f,e=>{d(v)===d(s).id?e(m):e(h,-1)}),r(a,l)}),y(F),r(l,F),x()}S([`click`]);export{H as component,P as universal}; \ No newline at end of file diff --git a/backend/internal/http/web/_app/immutable/nodes/17.D_IcqSXn.js b/backend/internal/http/web/_app/immutable/nodes/17.D_IcqSXn.js new file mode 100644 index 0000000..5158eab --- /dev/null +++ b/backend/internal/http/web/_app/immutable/nodes/17.D_IcqSXn.js @@ -0,0 +1 @@ +import{$ as e,A as t,B as n,E as r,G as i,J as a,K as o,L as s,M as c,N as l,O as u,P as d,Q as f,T as p,V as m,X as h,_ as ee,a as g,at as te,c as _,dt as v,ft as y,h as b,it as ne,j as x,p as S,q as C,r as re,u as w,ut as T,w as E,x as ie,z as ae}from"../chunks/39JK5HWF.js";import"../chunks/xihTtKlq.js";import{n as oe,t as se}from"../chunks/DTCALkcP.js";import{t as D}from"../chunks/BC84wEQu.js";import{t as O}from"../chunks/BDef5Ccs.js";import{n as ce,t as k}from"../chunks/DRdGzrsF.js";import{t as le}from"../chunks/BorM6hBh.js";import{t as ue}from"../chunks/D3MDK1zR.js";var de=y({load:()=>fe}),fe=async()=>({title:`Profil`,me:await O.me()}),A=function(e){return e[e.None=0]=`None`,e[e.Changed=1]=`Changed`,e[e.Saving=2]=`Saving`,e[e.Saved=3]=`Saved`,e[e.Error=4]=`Error`,e}({}),pe={listTimezones:()=>D.get(`/misc/timezones`)},me=u(` Enregistrement en cours`,1),he=u(` Enregistrement réussi`,1),ge=u(``);function _e(e,a){te(a,!0);let o=g(a,`state`,7),s=g(a,`disabled`,3,!1);m(()=>{(o()===A.Saved||o()===A.Error)&&setTimeout(()=>{o(A.None)},2e3)});let l=()=>{a.handleClick&&(o()===A.Changed||o()===A.None)&&a.handleClick()};var u=ge();let d;var f=i(u),h=e=>{var i=t();n(()=>p(i,a.label)),r(e,i)},ee=e=>{var t=me();T(),r(e,t)},_=e=>{var t=he();T(),r(e,t)},y=e=>{var n=t(`Echec`);r(e,n)};E(f,e=>{o()==A.None||o()==A.Changed?e(h):o()==A.Saving?e(ee,1):o()==A.Saved?e(_,2):o()==A.Error&&e(y,3)}),v(u),n(()=>{u.disabled=s(),d=b(u,1,`bt`,null,d,{disabled:s(),changed:o()===A.Changed,saving:o()===A.Saving,saved:o()===A.Saved,error:o()===A.Error})}),c(`click`,u,l),r(e,u),ne()}x([`click`]);var ve=u(`
        `),ye=u(`

        Mon compte

        Canaux de communication

        `,1);function j(t,u){te(u,!0);let g=a(s(()=>u.data.me.user)),y=f(a([])),b=f(a({type:``,address:``})),x=f(a([])),T=new ce,E=f(a(A.None)),D=f(a(A.None));re(async()=>{h(y,await O.listAddresses(g.id),!0),h(x,(await pe.listTimezones()).map(e=>({value:e,label:e})),!0)}),m(()=>{oe(g.theme),se()});let de=e=>{e.preventDefault(),h(E,A.Saving,!0),ue(g.email)||T.set(`email`,`Adresse email invalide !`),g.firstname||T.set(`firstname`,`Le prénom est obligatoire !`),g.lastname||T.set(`lastname`,`Le nom est obligatoire !`),T.size==0&&O.update(g.id,g).then(()=>{h(E,A.Saved,!0)}).catch(e=>{h(E,A.Saving,!0),console.error(e)})},fe=()=>{h(D,A.Saving,!0),O.createAddress(g.id,d(b)).then(e=>{d(y).push(e),h(b,{type:``,address:``},!0),h(D,A.Saved,!0)}).catch(e=>{console.log(e)})},me=e=>{O.deleteAddress(g.id,e).then(()=>{h(y,d(y).filter(t=>t.id!=e),!0)}).catch(e=>{console.log(e)})},he=()=>{T.clear(),h(E,A.Changed,!0)},ge=e=>{e.focus()};var j=ye(),M=o(j),N=C(i(M),2),P=i(N),F=C(i(P),2);w(F),ae(()=>_(F,()=>g.email,e=>g.email=e)),ee(F,e=>ge?.(e));var be=C(F,2);k(be,{key:`email`,get errors(){return T}}),v(P);var I=C(P,2),L=i(I),R=C(i(L),2);w(R);var xe=C(R,2);k(xe,{key:`firstname`,get errors(){return T}}),v(L);var Se=C(L,2),z=C(i(Se),2);w(z);var Ce=C(z,2);k(Ce,{key:`lastname`,get errors(){return T}}),v(Se),v(I);var B=C(I,2),V=i(B),H=C(i(V),2),U=i(H);U.value=U.__value=`en`;var we=C(U);we.value=we.__value=`fr`,v(H);var Te=C(H,2);k(Te,{key:`lang`,get errors(){return T}}),v(V);var Ee=C(V,2),De=C(i(Ee),2);le(De,{get items(){return d(x)},valueMode:`id`,get value(){return g.timezone},set value(e){g.timezone=e}});var Oe=C(De,2);k(Oe,{key:`timezone`,get errors(){return T}}),v(Ee),v(B);var W=C(B,2),G=C(i(W),2),K=i(G);K.value=K.__value=`auto`;var q=C(K);q.value=q.__value=`dark`;var ke=C(q);ke.value=ke.__value=`light`,v(G);var Ae=C(G,2);k(Ae,{key:`theme`,get errors(){return T}}),v(W),_e(C(W,2),{label:`Enregistrer`,get state(){return d(E)}}),v(N),v(M);var je=C(M,2),Me=C(i(je),2);ie(Me,17,()=>d(y),e=>e.id,(e,t)=>{var a=ve(),o=i(a),s=i(o),l=i(s);v(s);var u=C(s,2),f=i(u,!0);v(u);var m=C(u,2);v(o),v(a),n(()=>{p(l,`${d(t).type??``} :`),p(f,d(t).address)}),c(`click`,m,()=>{me(d(t).id)}),r(e,a)});var Ne=C(Me,2),J=i(Ne),Y=i(J),X=i(Y);X.value=X.__value=``;var Z=C(X);Z.value=Z.__value=`email`;var Q=C(Z);Q.value=Q.__value=`signal`;var $=C(Q);$.value=$.__value=`telegram`;var Pe=C($);Pe.value=Pe.__value=`whatsapp`,v(Y),v(J);var Fe=C(J,2),Ie=i(Fe);w(Ie),v(Fe);var Le=C(Fe,2),Re=i(Le);{let t=e(()=>d(b).type===``||d(b).address===``);_e(Re,{get disabled(){return d(t)},label:`Ajouter`,handleClick:fe,get state(){return d(D)}})}v(Le),v(Ne),v(je),l(`submit`,N,de),c(`change`,N,he),_(R,()=>g.firstname,e=>g.firstname=e),_(z,()=>g.lastname,e=>g.lastname=e),S(H,()=>g.lang,e=>g.lang=e),S(G,()=>g.theme,e=>g.theme=e),S(Y,()=>d(b).type,e=>d(b).type=e),c(`change`,Ie,()=>h(D,A.Changed,!0)),_(Ie,()=>d(b).address,e=>d(b).address=e),r(t,j),ne()}x([`change`,`click`]);export{j as component,de as universal}; \ No newline at end of file diff --git a/backend/internal/http/web/_app/immutable/nodes/17.wrIvaz1M.js b/backend/internal/http/web/_app/immutable/nodes/17.wrIvaz1M.js deleted file mode 100644 index 2468ea1..0000000 --- a/backend/internal/http/web/_app/immutable/nodes/17.wrIvaz1M.js +++ /dev/null @@ -1 +0,0 @@ -import{$ as e,A as t,B as n,E as r,G as i,J as a,K as o,L as s,M as c,N as l,O as u,P as d,Q as f,T as p,V as m,X as h,_ as ee,a as g,at as te,c as _,dt as v,ft as y,h as b,it as ne,j as x,p as S,q as C,r as re,u as w,ut as T,w as E,x as ie,z as ae}from"../chunks/39JK5HWF.js";import"../chunks/xihTtKlq.js";import{n as oe,t as se}from"../chunks/DTCALkcP.js";import{t as D}from"../chunks/BqkZ0BZ5.js";import{t as O}from"../chunks/BEgKbVuy.js";import{n as ce,t as k}from"../chunks/DRdGzrsF.js";import{t as le}from"../chunks/D4uBfDnr.js";import{t as ue}from"../chunks/D3MDK1zR.js";var de=y({load:()=>fe}),fe=async()=>({title:`Profil`,me:await O.me()}),A=function(e){return e[e.None=0]=`None`,e[e.Changed=1]=`Changed`,e[e.Saving=2]=`Saving`,e[e.Saved=3]=`Saved`,e[e.Error=4]=`Error`,e}({}),pe={listTimezones:()=>D.get(`/misc/timezones`)},me=u(` Enregistrement en cours`,1),he=u(` Enregistrement réussi`,1),ge=u(``);function _e(e,a){te(a,!0);let o=g(a,`state`,7),s=g(a,`disabled`,3,!1);m(()=>{(o()===A.Saved||o()===A.Error)&&setTimeout(()=>{o(A.None)},2e3)});let l=()=>{a.handleClick&&(o()===A.Changed||o()===A.None)&&a.handleClick()};var u=ge();let d;var f=i(u),h=e=>{var i=t();n(()=>p(i,a.label)),r(e,i)},ee=e=>{var t=me();T(),r(e,t)},_=e=>{var t=he();T(),r(e,t)},y=e=>{var n=t(`Echec`);r(e,n)};E(f,e=>{o()==A.None||o()==A.Changed?e(h):o()==A.Saving?e(ee,1):o()==A.Saved?e(_,2):o()==A.Error&&e(y,3)}),v(u),n(()=>{u.disabled=s(),d=b(u,1,`bt`,null,d,{disabled:s(),changed:A.Changed,saving:A.Saving,saved:A.Saved,error:A.Error})}),c(`click`,u,l),r(e,u),ne()}x([`click`]);var ve=u(`
        `),ye=u(`

        Mon compte

        Canaux de communication

        `,1);function j(t,u){te(u,!0);let g=a(s(()=>u.data.me.user)),y=f(a([])),b=f(a({type:``,address:``})),x=f(a([])),T=new ce,E=f(a(A.None)),D=f(a(A.None));re(async()=>{h(y,await O.listAddresses(g.id),!0),h(x,(await pe.listTimezones()).map(e=>({value:e,label:e})),!0)}),m(()=>{oe(g.theme),se()});let de=e=>{e.preventDefault(),h(E,A.Saving,!0),ue(g.email)||T.set(`email`,`Adresse email invalide !`),g.firstname||T.set(`firstname`,`Le prénom est obligatoire !`),g.lastname||T.set(`lastname`,`Le nom est obligatoire !`),T.size==0&&O.update(g.id,g).then(()=>{h(E,A.Saved,!0)}).catch(e=>{h(E,A.Saving,!0),console.error(e)})},fe=()=>{h(D,A.Saving,!0),O.createAddress(g.id,d(b)).then(e=>{d(y).push(e),h(b,{type:``,address:``},!0),h(D,A.Saved,!0)}).catch(e=>{console.log(e)})},me=e=>{O.deleteAddress(g.id,e).then(()=>{h(y,d(y).filter(t=>t.id!=e),!0)}).catch(e=>{console.log(e)})},he=()=>{T.clear(),h(E,A.Changed,!0)},ge=e=>{e.focus()};var j=ye(),M=o(j),N=C(i(M),2),P=i(N),F=C(i(P),2);w(F),ae(()=>_(F,()=>g.email,e=>g.email=e)),ee(F,e=>ge?.(e));var be=C(F,2);k(be,{key:`email`,get errors(){return T}}),v(P);var I=C(P,2),L=i(I),R=C(i(L),2);w(R);var xe=C(R,2);k(xe,{key:`firstname`,get errors(){return T}}),v(L);var Se=C(L,2),z=C(i(Se),2);w(z);var Ce=C(z,2);k(Ce,{key:`lastname`,get errors(){return T}}),v(Se),v(I);var B=C(I,2),V=i(B),H=C(i(V),2),U=i(H);U.value=U.__value=`en`;var we=C(U);we.value=we.__value=`fr`,v(H);var Te=C(H,2);k(Te,{key:`lang`,get errors(){return T}}),v(V);var Ee=C(V,2),De=C(i(Ee),2);le(De,{get items(){return d(x)},valueMode:`id`,get value(){return g.timezone},set value(e){g.timezone=e}});var Oe=C(De,2);k(Oe,{key:`timezone`,get errors(){return T}}),v(Ee),v(B);var W=C(B,2),G=C(i(W),2),K=i(G);K.value=K.__value=`auto`;var q=C(K);q.value=q.__value=`dark`;var ke=C(q);ke.value=ke.__value=`light`,v(G);var Ae=C(G,2);k(Ae,{key:`theme`,get errors(){return T}}),v(W),_e(C(W,2),{label:`Enregistrer`,get state(){return d(E)}}),v(N),v(M);var je=C(M,2),Me=C(i(je),2);ie(Me,17,()=>d(y),e=>e.id,(e,t)=>{var a=ve(),o=i(a),s=i(o),l=i(s);v(s);var u=C(s,2),f=i(u,!0);v(u);var m=C(u,2);v(o),v(a),n(()=>{p(l,`${d(t).type??``} :`),p(f,d(t).address)}),c(`click`,m,()=>{me(d(t).id)}),r(e,a)});var Ne=C(Me,2),J=i(Ne),Y=i(J),X=i(Y);X.value=X.__value=``;var Z=C(X);Z.value=Z.__value=`email`;var Q=C(Z);Q.value=Q.__value=`signal`;var $=C(Q);$.value=$.__value=`telegram`;var Pe=C($);Pe.value=Pe.__value=`whatsapp`,v(Y),v(J);var Fe=C(J,2),Ie=i(Fe);w(Ie),v(Fe);var Le=C(Fe,2),Re=i(Le);{let t=e(()=>d(b).type===``||d(b).address===``);_e(Re,{get disabled(){return d(t)},label:`Ajouter`,handleClick:fe,get state(){return d(D)}})}v(Le),v(Ne),v(je),l(`submit`,N,de),c(`change`,N,he),_(R,()=>g.firstname,e=>g.firstname=e),_(z,()=>g.lastname,e=>g.lastname=e),S(H,()=>g.lang,e=>g.lang=e),S(G,()=>g.theme,e=>g.theme=e),S(Y,()=>d(b).type,e=>d(b).type=e),c(`change`,Ie,()=>h(D,A.Changed,!0)),_(Ie,()=>d(b).address,e=>d(b).address=e),r(t,j),ne()}x([`change`,`click`]);export{j as component,de as universal}; \ No newline at end of file diff --git a/backend/internal/http/web/_app/immutable/nodes/18.BfPDxxm9.js b/backend/internal/http/web/_app/immutable/nodes/18.CljvOcq_.js similarity index 92% rename from backend/internal/http/web/_app/immutable/nodes/18.BfPDxxm9.js rename to backend/internal/http/web/_app/immutable/nodes/18.CljvOcq_.js index 92c9d7e..bf6cbe8 100644 --- a/backend/internal/http/web/_app/immutable/nodes/18.BfPDxxm9.js +++ b/backend/internal/http/web/_app/immutable/nodes/18.CljvOcq_.js @@ -1 +1 @@ -import{B as e,E as t,G as n,J as r,K as i,M as a,N as o,O as s,at as c,c as l,d as u,dt as d,et as f,it as p,j as m,q as h,u as g,ut as _,w as v}from"../chunks/39JK5HWF.js";import{t as y}from"../chunks/D3up1JC1.js";import"../chunks/xihTtKlq.js";import"../chunks/B5isPFOt.js";import{i as b,n as x}from"../chunks/BqkZ0BZ5.js";import{t as S}from"../chunks/BRXBpvt8.js";import{t as C}from"../chunks/DNQ6C3zq.js";var w=s(`
        `,1),T=s(`
        ← Retour
        `),E=s(`
        logo

        Identifiez-vous ...


        `);function D(s,m){c(m,!0);let D=r({email:``,password:``,validemail:!1}),O=()=>{D.validemail=!0},k=e=>{e.preventDefault(),C.login(D).then(e=>{x.user=e.user,b(e.accessToken),y(`/`)}).catch(e=>{console.log(e)})};var A=E(),j=n(A),M=n(j),N=h(M,4),P=e=>{var r=w(),a=i(r),s=h(n(a),2),c=n(s);g(c),f(c,!0),_(2),d(s),d(a),_(2),o(`submit`,a,O),l(c,()=>D.email,e=>D.email=e),t(e,r)},F=e=>{var r=T(),i=h(n(r),2),s=n(i);g(s),f(s,!0),_(2),d(i);var c=h(i,2);d(r),o(`submit`,r,k),l(s,()=>D.password,e=>D.password=e),a(`click`,c,()=>{D.validemail=!1}),t(e,r)};v(N,e=>{D.validemail?e(F,-1):e(P)}),_(4),d(j),d(A),e(()=>u(M,`src`,S)),t(s,A),p()}m([`click`]);export{D as component}; \ No newline at end of file +import{B as e,E as t,G as n,J as r,K as i,M as a,N as o,O as s,at as c,c as l,d as u,dt as d,et as f,it as p,j as m,q as h,u as g,ut as _,w as v}from"../chunks/39JK5HWF.js";import{t as y}from"../chunks/B0qrqti_.js";import"../chunks/xihTtKlq.js";import"../chunks/DL7ZyBAF.js";import{i as b,n as x}from"../chunks/BC84wEQu.js";import{t as S}from"../chunks/BRXBpvt8.js";import{t as C}from"../chunks/DFI7Zp3t.js";var w=s(`
        `,1),T=s(`
        ← Retour
        `),E=s(`
        logo

        Identifiez-vous ...


        `);function D(s,m){c(m,!0);let D=r({email:``,password:``,validemail:!1}),O=()=>{D.validemail=!0},k=e=>{e.preventDefault(),C.login(D).then(e=>{x.user=e.user,b(e.accessToken),y(`/`)}).catch(e=>{console.log(e)})};var A=E(),j=n(A),M=n(j),N=h(M,4),P=e=>{var r=w(),a=i(r),s=h(n(a),2),c=n(s);g(c),f(c,!0),_(2),d(s),d(a),_(2),o(`submit`,a,O),l(c,()=>D.email,e=>D.email=e),t(e,r)},F=e=>{var r=T(),i=h(n(r),2),s=n(i);g(s),f(s,!0),_(2),d(i);var c=h(i,2);d(r),o(`submit`,r,k),l(s,()=>D.password,e=>D.password=e),a(`click`,c,()=>{D.validemail=!1}),t(e,r)};v(N,e=>{D.validemail?e(F,-1):e(P)}),_(4),d(j),d(A),e(()=>u(M,`src`,S)),t(s,A),p()}m([`click`]);export{D as component}; \ No newline at end of file diff --git a/backend/internal/http/web/_app/immutable/nodes/19.Bhx_NIDl.js b/backend/internal/http/web/_app/immutable/nodes/19.B7Etxitc.js similarity index 92% rename from backend/internal/http/web/_app/immutable/nodes/19.Bhx_NIDl.js rename to backend/internal/http/web/_app/immutable/nodes/19.B7Etxitc.js index f2423be..b7c27c6 100644 --- a/backend/internal/http/web/_app/immutable/nodes/19.Bhx_NIDl.js +++ b/backend/internal/http/web/_app/immutable/nodes/19.B7Etxitc.js @@ -1 +1 @@ -import{B as e,E as t,G as n,J as r,M as i,N as a,O as o,at as s,c,d as l,dt as u,et as d,it as f,j as p,q as m,u as h}from"../chunks/39JK5HWF.js";import{t as g}from"../chunks/D3up1JC1.js";import"../chunks/xihTtKlq.js";import"../chunks/B5isPFOt.js";import{t as _}from"../chunks/BRXBpvt8.js";import{n as v,t as y}from"../chunks/DRdGzrsF.js";import{t as b}from"../chunks/D3MDK1zR.js";import{t as x}from"../chunks/DNQ6C3zq.js";var S=o(`
        logo

        Inscription

        `);function C(o,p){s(p,!0);let C=new v,w=r({email:``,firstname:``,lastname:``,password:``,verifPassword:``}),T=e=>{if(e.preventDefault(),C.clear(),b(w.email)||C.set(`email`,`Adresse email invalide !`),w.firstname||C.set(`firstname`,`Le prénom est obligatoire !`),w.lastname||C.set(`lastname`,`Le nom est obligatoire !`),w.password!==w.verifPassword&&C.set(`verifPassword`,`Les mots de pass ne correspondent pas.`),C.size==0){let e={method:`password`,email:w.email,firstname:w.firstname,lastname:w.lastname,password:w.password};x.register(e).then(()=>{g(`/`)}).catch(e=>{C.set(`submit`,`Erreur: `+e)})}};var E=S(),D=n(E),O=n(D),k=m(O,4),A=m(n(k),2);h(A),d(A,!0);var j=m(A,2);y(j,{key:`email`,get errors(){return C}});var M=m(j,4);h(M);var N=m(M,2);y(N,{key:`firstname`,get errors(){return C}});var P=m(N,4);h(P);var F=m(P,2);y(F,{key:`lastname`,get errors(){return C}});var I=m(F,4);h(I);var L=m(I,2);y(L,{key:`password`,get errors(){return C}});var R=m(L,4);h(R);var z=m(R,2);y(z,{key:`verifPassword`,get errors(){return C}});var B=m(z,4);y(B,{key:`submit`,get errors(){return C}}),u(k),u(D),u(E),e(()=>l(O,`src`,_)),a(`submit`,k,T),i(`change`,k,()=>{C.clear()}),c(A,()=>w.email,e=>w.email=e),c(M,()=>w.firstname,e=>w.firstname=e),c(P,()=>w.lastname,e=>w.lastname=e),c(I,()=>w.password,e=>w.password=e),c(R,()=>w.verifPassword,e=>w.verifPassword=e),t(o,E),f()}p([`change`]);export{C as component}; \ No newline at end of file +import{B as e,E as t,G as n,J as r,M as i,N as a,O as o,at as s,c,d as l,dt as u,et as d,it as f,j as p,q as m,u as h}from"../chunks/39JK5HWF.js";import{t as g}from"../chunks/B0qrqti_.js";import"../chunks/xihTtKlq.js";import"../chunks/DL7ZyBAF.js";import{t as _}from"../chunks/BRXBpvt8.js";import{n as v,t as y}from"../chunks/DRdGzrsF.js";import{t as b}from"../chunks/D3MDK1zR.js";import{t as x}from"../chunks/DFI7Zp3t.js";var S=o(`
        logo

        Inscription

        `);function C(o,p){s(p,!0);let C=new v,w=r({email:``,firstname:``,lastname:``,password:``,verifPassword:``}),T=e=>{if(e.preventDefault(),C.clear(),b(w.email)||C.set(`email`,`Adresse email invalide !`),w.firstname||C.set(`firstname`,`Le prénom est obligatoire !`),w.lastname||C.set(`lastname`,`Le nom est obligatoire !`),w.password!==w.verifPassword&&C.set(`verifPassword`,`Les mots de pass ne correspondent pas.`),C.size==0){let e={method:`password`,email:w.email,firstname:w.firstname,lastname:w.lastname,password:w.password};x.register(e).then(()=>{g(`/`)}).catch(e=>{C.set(`submit`,`Erreur: `+e)})}};var E=S(),D=n(E),O=n(D),k=m(O,4),A=m(n(k),2);h(A),d(A,!0);var j=m(A,2);y(j,{key:`email`,get errors(){return C}});var M=m(j,4);h(M);var N=m(M,2);y(N,{key:`firstname`,get errors(){return C}});var P=m(N,4);h(P);var F=m(P,2);y(F,{key:`lastname`,get errors(){return C}});var I=m(F,4);h(I);var L=m(I,2);y(L,{key:`password`,get errors(){return C}});var R=m(L,4);h(R);var z=m(R,2);y(z,{key:`verifPassword`,get errors(){return C}});var B=m(z,4);y(B,{key:`submit`,get errors(){return C}}),u(k),u(D),u(E),e(()=>l(O,`src`,_)),a(`submit`,k,T),i(`change`,k,()=>{C.clear()}),c(A,()=>w.email,e=>w.email=e),c(M,()=>w.firstname,e=>w.firstname=e),c(P,()=>w.lastname,e=>w.lastname=e),c(I,()=>w.password,e=>w.password=e),c(R,()=>w.verifPassword,e=>w.verifPassword=e),t(o,E),f()}p([`change`]);export{C as component}; \ No newline at end of file diff --git a/backend/internal/http/web/_app/immutable/nodes/2.Bs3bPWro.js b/backend/internal/http/web/_app/immutable/nodes/2.Bs3bPWro.js deleted file mode 100644 index 3324332..0000000 --- a/backend/internal/http/web/_app/immutable/nodes/2.Bs3bPWro.js +++ /dev/null @@ -1 +0,0 @@ -import{$ as e,B as t,E as n,G as r,J as i,K as a,M as o,N as s,O as c,P as l,T as u,V as d,W as f,a as p,at as m,b as h,d as g,dt as _,ft as v,g as y,h as b,it as x,j as S,q as C,r as w,w as T,x as E}from"../chunks/39JK5HWF.js";import{t as D}from"../chunks/D3up1JC1.js";import"../chunks/xihTtKlq.js";import{n as O,t as k}from"../chunks/DTCALkcP.js";import{t as A}from"../chunks/D1d5-1oo.js";import"../chunks/B5isPFOt.js";import{n as j,r as M}from"../chunks/BqkZ0BZ5.js";import{t as N}from"../chunks/BEgKbVuy.js";import{t as P}from"../chunks/D8dI9nx6.js";import{t as F}from"../chunks/BRXBpvt8.js";var I=v({load:()=>L}),L=async()=>{let e=await N.me();return P.spaces=e.teams,P.current||(P.current=P.spaces[0].id),{spaceid:P.current,me:e}},R=i({sidebarDesktopOpen:!0,sidebarMobileOpen:!1,menuContentVisible:!0}),z=c(` `),B=c(``);function V(e,i){m(i,!0);let a=p(i,`label`,3,``),o=p(i,`icon`,3,``),s=p(i,`link`,3,``);var c=B(),l=r(c),d=r(l),f=C(d,2),h=e=>{var i=z(),o=r(i,!0);_(i),t(()=>u(o,a())),n(e,i)};T(f,e=>{R.menuContentVisible&&e(h)}),_(l),_(c),t(()=>{g(l,`href`,s()),b(d,1,y([o()]))}),n(e,c),x()}var H=c(`
        logo
        `),U=c(``),W=c(`
        `),G=c(`
        FM
        Fabien Masson
        `),K=c(`
        `,1);function q(i,s){m(s,!0);let c=()=>{M()};var d=K(),f=a(d),p=r(f),h=e=>{var i=H(),a=r(i);_(i),t(()=>g(a,`src`,F)),n(e,i)};T(p,e=>{R.menuContentVisible&&e(h)});var v=C(p,2),y=C(v,2);_(f);var b=C(f,2),S=e=>{var i=W(),a=r(i),o=r(a);E(o,21,()=>s.spaces,e=>e.id,(e,i)=>{var a=U(),o=r(a,!0);_(a);var s={};t(()=>{u(o,l(i).label),s!==(s=l(i).id)&&(a.value=(a.__value=l(i).id)??``)}),n(e,a)}),_(o),_(a),_(i),n(e,i)};T(b,e=>{R.menuContentVisible&&e(S)});var w=C(b,2),D=r(w);{let t=e(()=>`/${s.spaceid}`);V(D,{label:`Nouveau chat`,icon:`icon-plus`,get link(){return l(t)}})}var O=C(D,2);{let t=e(()=>`/${s.spaceid}/history`);V(O,{label:`Conversations`,icon:`icon-chat`,get link(){return l(t)}})}var k=C(O,2);{let t=e(()=>`/${s.spaceid}/tasks`);V(k,{label:`Planification`,icon:`icon-tasks`,get link(){return l(t)}})}var A=C(k,2);{let t=e(()=>`/${s.spaceid}/kb`);V(A,{label:`Connaissances`,icon:`icon-graduation-cap`,get link(){return l(t)}})}var j=C(A,2);{let t=e(()=>`/${s.spaceid}/settings`);V(j,{label:`Réglages`,icon:`icon-cog`,get link(){return l(t)}})}_(w);var N=C(w,2),P=r(N),I=e=>{var t=G(),i=C(r(t),4);_(t),o(`click`,i,c),n(e,t)},L=e=>{V(e,{label:`User`,icon:`icon-user`,link:`/profile`})};T(P,e=>{R.menuContentVisible?e(I):e(L,-1)}),_(N),o(`click`,v,function(...e){s.handleMenuDesktop?.apply(this,e)}),o(`click`,y,function(...e){s.handleMenuMobile?.apply(this,e)}),n(i,d),x()}S([`click`]);var J=c(``),Y=c(`

        `);function X(e,i){m(i,!0);let a=()=>{R.sidebarDesktopOpen=!R.sidebarDesktopOpen,R.sidebarDesktopOpen?setTimeout(()=>{R.menuContentVisible=R.sidebarDesktopOpen},200):R.menuContentVisible=R.sidebarDesktopOpen},o=()=>{R.sidebarMobileOpen=!R.sidebarMobileOpen,R.sidebarMobileOpen?setTimeout(()=>{R.menuContentVisible=R.sidebarMobileOpen},200):R.menuContentVisible=R.sidebarMobileOpen},c=()=>{R.menuContentVisible=window.innerWidth<640?R.sidebarMobileOpen:R.sidebarDesktopOpen};w(async()=>{c(),i.data.me?(j.user=i.data.me.user,O(j.user.theme),k(),j.status=`authenticated`):j.status=`unauthenticated`}),d(()=>{j.status==`unauthenticated`&&D(`/login`)});var l=Y();s(`resize`,f,c);var p=r(l);q(r(p),{get spaces(){return P.spaces},get spaceid(){return i.data.spaceid},handleMenuDesktop:a,handleMenuMobile:o}),_(p);var v=C(p,2),S=r(v),E=r(S),M=r(E),N=r(M),F=r(N),I=r(F,!0);_(F);var L=C(F,2),z=e=>{var i=J(),a=r(i);_(i),t(()=>g(a,`href`,A.data.back)),n(e,i)};T(L,e=>{A.data.back&&e(z)}),_(N),_(M),_(E);var B=C(E,2),V=r(B);h(V,()=>i.children),_(B),_(S),_(v),_(l),t(()=>{b(l,1,y([R.sidebarDesktopOpen?`desktopMenuOpen`:`desktopMenuClosed`,R.sidebarMobileOpen?`mobileMenuOpen`:`mobileMenuClosed`])),u(I,A.data.title)}),n(e,l),x()}export{X as component,I as universal}; \ No newline at end of file diff --git a/backend/internal/http/web/_app/immutable/nodes/2.DJpmXDpd.js b/backend/internal/http/web/_app/immutable/nodes/2.DJpmXDpd.js new file mode 100644 index 0000000..9edc8d3 --- /dev/null +++ b/backend/internal/http/web/_app/immutable/nodes/2.DJpmXDpd.js @@ -0,0 +1 @@ +import{$ as e,B as t,E as n,G as r,J as i,K as a,M as o,N as s,O as c,P as l,T as u,V as d,W as f,a as p,at as m,b as h,d as g,dt as _,ft as v,g as y,h as b,it as x,j as S,q as C,r as w,w as T,x as E}from"../chunks/39JK5HWF.js";import{t as D}from"../chunks/B0qrqti_.js";import"../chunks/xihTtKlq.js";import{n as O,t as k}from"../chunks/DTCALkcP.js";import{t as A}from"../chunks/DtPl1hOB.js";import"../chunks/DL7ZyBAF.js";import{n as j,r as M}from"../chunks/BC84wEQu.js";import{t as N}from"../chunks/BDef5Ccs.js";import{t as P}from"../chunks/D8dI9nx6.js";import{t as F}from"../chunks/BRXBpvt8.js";var I=v({load:()=>L}),L=async()=>{let e=await N.me();return P.spaces=e.teams,P.current||(P.current=P.spaces[0].id),{spaceid:P.current,me:e}},R=i({sidebarDesktopOpen:!0,sidebarMobileOpen:!1,menuContentVisible:!0}),z=c(` `),B=c(``);function V(e,i){m(i,!0);let a=p(i,`label`,3,``),s=p(i,`icon`,3,``),c=p(i,`link`,3,``),l=e=>{e.preventDefault(),R.sidebarMobileOpen=!1,R.menuContentVisible=!1,D(c())};var d=B(),f=r(d),h=r(f),v=C(h,2),S=e=>{var i=z(),o=r(i,!0);_(i),t(()=>u(o,a())),n(e,i)};T(v,e=>{R.menuContentVisible&&e(S)}),_(f),_(d),t(()=>{g(f,`href`,c()),b(h,1,y([s()]))}),o(`click`,f,l),n(e,d),x()}S([`click`]);var H=c(`
        logo
        `),U=c(``),W=c(`
        `),G=c(`
        FM
        Fabien Masson
        `),K=c(`
        `,1);function q(i,s){m(s,!0);let c=()=>{M()};var d=K(),f=a(d),p=r(f),h=e=>{var i=H(),a=r(i);_(i),t(()=>g(a,`src`,F)),n(e,i)};T(p,e=>{R.menuContentVisible&&e(h)});var v=C(p,2),y=C(v,2);_(f);var b=C(f,2),S=e=>{var i=W(),a=r(i),o=r(a);E(o,21,()=>s.spaces,e=>e.id,(e,i)=>{var a=U(),o=r(a,!0);_(a);var s={};t(()=>{u(o,l(i).label),s!==(s=l(i).id)&&(a.value=(a.__value=l(i).id)??``)}),n(e,a)}),_(o),_(a),_(i),n(e,i)};T(b,e=>{R.menuContentVisible&&e(S)});var w=C(b,2),D=r(w);{let t=e(()=>`/${s.spaceid}`);V(D,{label:`Nouveau chat`,icon:`icon-plus`,get link(){return l(t)}})}var O=C(D,2);{let t=e(()=>`/${s.spaceid}/history`);V(O,{label:`Conversations`,icon:`icon-chat`,get link(){return l(t)}})}var k=C(O,2);{let t=e(()=>`/${s.spaceid}/tasks`);V(k,{label:`Planification`,icon:`icon-tasks`,get link(){return l(t)}})}var A=C(k,2);{let t=e(()=>`/${s.spaceid}/kb`);V(A,{label:`Connaissances`,icon:`icon-graduation-cap`,get link(){return l(t)}})}var j=C(A,2);{let t=e(()=>`/${s.spaceid}/settings`);V(j,{label:`Réglages`,icon:`icon-cog`,get link(){return l(t)}})}_(w);var N=C(w,2),P=r(N),I=e=>{var t=G(),i=C(r(t),4);_(t),o(`click`,i,c),n(e,t)},L=e=>{V(e,{label:`User`,icon:`icon-user`,link:`/profile`})};T(P,e=>{R.menuContentVisible?e(I):e(L,-1)}),_(N),o(`click`,v,function(...e){s.handleMenuDesktop?.apply(this,e)}),o(`click`,y,function(...e){s.handleMenuMobile?.apply(this,e)}),n(i,d),x()}S([`click`]);var J=c(``),Y=c(`

        `);function X(e,i){m(i,!0);let a=()=>{R.sidebarDesktopOpen=!R.sidebarDesktopOpen,R.sidebarDesktopOpen?setTimeout(()=>{R.menuContentVisible=R.sidebarDesktopOpen},200):R.menuContentVisible=R.sidebarDesktopOpen},o=()=>{R.sidebarMobileOpen=!R.sidebarMobileOpen,R.sidebarMobileOpen?setTimeout(()=>{R.menuContentVisible=R.sidebarMobileOpen},200):R.menuContentVisible=R.sidebarMobileOpen},c=()=>{R.menuContentVisible=window.innerWidth<640?R.sidebarMobileOpen:R.sidebarDesktopOpen};w(async()=>{c(),i.data.me?(j.user=i.data.me.user,O(j.user.theme),k(),j.status=`authenticated`):j.status=`unauthenticated`}),d(()=>{j.status==`unauthenticated`&&D(`/login`)});var l=Y();s(`resize`,f,c);var p=r(l);q(r(p),{get spaces(){return P.spaces},get spaceid(){return i.data.spaceid},handleMenuDesktop:a,handleMenuMobile:o}),_(p);var v=C(p,2),S=r(v),E=r(S),M=r(E),N=r(M),F=r(N),I=r(F,!0);_(F);var L=C(F,2),z=e=>{var i=J(),a=r(i);_(i),t(()=>g(a,`href`,A.data.back)),n(e,i)};T(L,e=>{A.data.back&&e(z)}),_(N),_(M),_(E);var B=C(E,2),V=r(B);h(V,()=>i.children),_(B),_(S),_(v),_(l),t(()=>{b(l,1,y([R.sidebarDesktopOpen?`desktopMenuOpen`:`desktopMenuClosed`,R.sidebarMobileOpen?`mobileMenuOpen`:`mobileMenuClosed`])),u(I,A.data.title)}),n(e,l),x()}export{X as component,I as universal}; \ No newline at end of file diff --git a/backend/internal/http/web/_app/immutable/nodes/3.BD_oZvMH.js b/backend/internal/http/web/_app/immutable/nodes/3.DQ-wAvIJ.js similarity index 66% rename from backend/internal/http/web/_app/immutable/nodes/3.BD_oZvMH.js rename to backend/internal/http/web/_app/immutable/nodes/3.DQ-wAvIJ.js index 0b5a6e0..c523105 100644 --- a/backend/internal/http/web/_app/immutable/nodes/3.BD_oZvMH.js +++ b/backend/internal/http/web/_app/immutable/nodes/3.DQ-wAvIJ.js @@ -1 +1 @@ -import{at as e,ft as t,it as n}from"../chunks/39JK5HWF.js";import{t as r}from"../chunks/D3up1JC1.js";import"../chunks/xihTtKlq.js";import"../chunks/B5isPFOt.js";import{t as i}from"../chunks/D8dI9nx6.js";var a=t({load:()=>o}),o=async({parent:e})=>{let{me:t}=await e();return{me:t}};function s(t,a){e(a,!0),r(`/${i.current}/`,{replaceState:!0}),n()}export{s as component,a as universal}; \ No newline at end of file +import{at as e,ft as t,it as n}from"../chunks/39JK5HWF.js";import{t as r}from"../chunks/B0qrqti_.js";import"../chunks/xihTtKlq.js";import"../chunks/DL7ZyBAF.js";import{t as i}from"../chunks/D8dI9nx6.js";var a=t({load:()=>o}),o=async({parent:e})=>{let{me:t}=await e();return{me:t}};function s(t,a){e(a,!0),r(`/${i.current}/`,{replaceState:!0}),n()}export{s as component,a as universal}; \ No newline at end of file diff --git a/backend/internal/http/web/_app/immutable/nodes/8.D-K-fxzc.js b/backend/internal/http/web/_app/immutable/nodes/8.D-K-fxzc.js deleted file mode 100644 index d3b8829..0000000 --- a/backend/internal/http/web/_app/immutable/nodes/8.D-K-fxzc.js +++ /dev/null @@ -1 +0,0 @@ -import{B as e,C as t,D as n,E as r,G as i,J as a,K as o,M as s,N as c,O as l,P as u,Q as d,T as f,X as p,_ as m,a as h,at as g,c as _,dt as v,ft as y,it as b,j as x,q as S,tt as C,u as w,ut as T,w as E,x as D,z as O}from"../chunks/39JK5HWF.js";import"../chunks/xihTtKlq.js";import{t as k}from"../chunks/BqkZ0BZ5.js";import{t as A}from"../chunks/D35bQ8xD.js";import{n as j,t as M}from"../chunks/DRdGzrsF.js";import{t as N}from"../chunks/D4uBfDnr.js";var P={getAgents:e=>k.get(`/agent/${e}`),getAgent:(e,t)=>k.get(`/agent/${e}/${t}`),createAgent:(e,t)=>k.post(`/agent/${e}`,t),updateAgent:(e,t)=>k.put(`/agent/${e}`,t),deleteAgent:(e,t)=>k.delete(`/agent/${e}/${t}`)},F=y({load:()=>I}),I=async({params:e})=>({title:`Paramétrage : Agents`,back:`../settings`,space:e.space,agents:await P.getAgents(e.space),providersModels:await A.getProvidersModels(e.space)}),L=l(`
        `);function R(e,t){g(t,!0);let n=h(t,`item`,7),a=d(``),o=e=>e.group,l=e=>{e.focus()},f=e=>{e.preventDefault(),t.onSave(n())},y=e=>{e.preventDefault(),t.onCancel()};var x=L(),E=i(x),D=i(E),k=i(D),A=S(i(k),2);w(A),O(()=>_(A,()=>n().name,e=>n().name=e)),m(A,e=>l?.(e));var j=S(A,2);M(j,{key:`name`,get errors(){return t.errors}}),v(k);var P=S(k,2),F=S(i(P),2);C(F);var I=S(F,2);M(I,{key:`baseUrl`,get errors(){return t.errors}}),v(P);var R=S(P,2),z=S(i(R),2);N(z,{get items(){return t.providersModels},valueMode:`id`,groupBy:o,get value(){return u(a)},set value(e){p(a,e,!0)}});var B=S(z,2);M(B,{key:`type`,get errors(){return t.errors}}),v(R);var V=S(R,2),H=i(V);T(2),v(V),v(D),v(E),v(x),c(`submit`,D,f),s(`change`,D,()=>{t.errors.clear()}),_(F,()=>n().systemPrompt,e=>n().systemPrompt=e),s(`click`,H,y),r(e,x),b()}x([`change`,`click`]);var z=l(``),B=l(`
        `),V=l(`
        `);function H(c,l){g(l,!0);let m=d(a(l.data.agents)),h=d(!1),_=d(null),y=d(a({})),x=new j,C=()=>{u(_)||(x.clear(),p(y,{},!0),p(h,!0))},w=()=>{p(h,!1)},T=e=>{e.name||x.set(`name`,`Le nom est obligatoire !`),x.size===0&&P.createAgent(l.data.space,e).then(e=>{u(m).push(e),p(h,!1),p(y,{},!0)}).catch(e=>{console.log(e)})},O=()=>{p(_,null),p(y,{},!0)},k=e=>{e.name||x.set(`name`,`Le nom est obligatoire !`),x.size===0&&P.updateAgent(l.data.space,e).then(e=>{p(m,u(m).map(t=>e.id===t.id?e:t),!0),p(_,null),p(y,{},!0)}).catch(e=>{console.log(e)})},A=async e=>{x.clear(),!u(h)&&P.getAgent(l.data.space,e).then(t=>{p(m,u(m).filter(e=>e.id===t.id?t:e),!0),p(_,e,!0)}).catch(e=>console.log(e))},M=e=>{P.deleteAgent(l.data.space,e).then(()=>{p(m,u(m).filter(t=>t.id!==e),!0)}).catch(e=>{console.log(e)})};var N=V(),F=i(N),I=e=>{var i=n(),a=o(i);t(a,()=>`new`,e=>{R(e,{get item(){return u(y)},get errors(){return x},onSave:T,onCancel:w,get providersModels(){return l.data.providersModels}})}),r(e,i)},L=e=>{var t=z();s(`click`,t,C),r(e,t)};E(F,e=>{u(h)?e(I):e(L,-1)});var H=S(F,2);D(H,17,()=>u(m),e=>e.id,(a,c)=>{var d=n(),p=o(d),m=e=>{var i=n(),a=o(i);t(a,()=>u(c).id,e=>{R(e,{get item(){return u(c)},get errors(){return x},onSave:k,onCancel:O,get providersModels(){return l.data.providersModels}})}),r(e,i)},h=t=>{var n=B(),a=i(n),o=i(a),l=i(o,!0);v(o),v(a);var d=S(a,2),p=S(d,2);v(n),e(()=>f(l,u(c).name)),s(`click`,d,()=>A(u(c).id)),s(`click`,p,()=>M(u(c).id)),r(t,n)};E(p,e=>{u(_)===u(c).id?e(m):e(h,-1)}),r(a,d)}),v(N),r(c,N),b()}x([`click`]);export{H as component,F as universal}; \ No newline at end of file diff --git a/backend/internal/http/web/_app/immutable/nodes/8.TeTitTKA.js b/backend/internal/http/web/_app/immutable/nodes/8.TeTitTKA.js new file mode 100644 index 0000000..82b8822 --- /dev/null +++ b/backend/internal/http/web/_app/immutable/nodes/8.TeTitTKA.js @@ -0,0 +1 @@ +import{B as e,C as t,D as n,E as r,G as i,J as a,K as o,L as s,M as c,N as l,O as u,P as d,Q as f,T as p,X as m,_ as h,a as g,at as _,c as v,dt as y,ft as b,h as x,it as S,j as C,q as w,tt as T,u as E,ut as D,w as O,x as k,z as A}from"../chunks/39JK5HWF.js";import"../chunks/xihTtKlq.js";import{t as j}from"../chunks/BC84wEQu.js";import{t as M}from"../chunks/D8dI9nx6.js";import{t as N}from"../chunks/DOY2HMbt.js";import{n as P,t as F}from"../chunks/DRdGzrsF.js";import{t as I}from"../chunks/BorM6hBh.js";var L={getAgents:e=>j.get(`/agent/${e}`),getAgent:(e,t)=>j.get(`/agent/${e}/${t}`),createAgent:(e,t)=>j.post(`/agent/${e}`,t),updateAgent:(e,t)=>j.put(`/agent/${e}`,t),deleteAgent:(e,t)=>j.delete(`/agent/${e}/${t}`)},R={getSpace:e=>j.get(`/team/${e}`),updateSpace:(e,t)=>j.put(`/team/${e}`,t)},z=b({load:()=>B}),B=async({params:e})=>({title:`Paramétrage : Agents`,back:`../settings`,space:await R.getSpace(e.space),agents:await L.getAgents(e.space),providersModels:await N.getProvidersModels(e.space)}),V=u(`
        `);function H(e,t){_(t,!0);let n=g(t,`item`,7),o=f(a(s(()=>n().defaultProviderId+`|`+n().defaultModelId))),u=e=>e.group,p=e=>{e.focus()},b=e=>{e.preventDefault();let r=d(o).split(`|`);d(o).length>1?(n().defaultProviderId=r[0],n().defaultModelId=r[1]):(n().defaultProviderId=``,n().defaultModelId=``),t.onSave(n())},x=e=>{e.preventDefault(),t.onCancel()};var C=V(),O=i(C),k=i(O),j=i(k),M=w(i(j),2);E(M),A(()=>v(M,()=>n().name,e=>n().name=e)),h(M,e=>p?.(e));var N=w(M,2);F(N,{key:`name`,get errors(){return t.errors}}),y(j);var P=w(j,2),L=w(i(P),2);T(L);var R=w(L,2);F(R,{key:`baseUrl`,get errors(){return t.errors}}),y(P);var z=w(P,2),B=w(i(z),2);I(B,{get items(){return t.providersModels},valueMode:`id`,groupBy:u,get value(){return d(o)},set value(e){m(o,e,!0)}});var H=w(B,2);F(H,{key:`model`,get errors(){return t.errors}}),y(z);var U=w(z,2),W=i(U);D(2),y(U),y(k),y(O),y(C),l(`submit`,k,b),c(`change`,k,()=>{t.errors.clear()}),v(L,()=>n().systemPrompt,e=>n().systemPrompt=e),c(`click`,W,x),r(e,C),S()}C([`change`,`click`]);var U=u(``),W=u(`
        `),G=u(`
        `);function K(l,u){_(u,!0);let h=f(a(s(()=>u.data.space))),g=f(a(s(()=>u.data.agents))),v=f(!1),b=f(null),C=f(a({})),T=new P,E=()=>{d(b)||(T.clear(),m(C,{},!0),m(v,!0))},D=()=>{m(v,!1)},A=e=>{e.name||T.set(`name`,`Le nom est obligatoire !`),(e.defaultProviderId===``||e.defaultModelId===``)&&T.set(`model`,`Le modèle est obligatoire !`),T.size===0&&L.createAgent(u.data.space.id,e).then(e=>{d(g).push(e),m(v,!1),m(C,{},!0)}).catch(e=>{console.log(e)})},j=()=>{m(b,null),m(C,{},!0)},N=e=>{e.name||T.set(`name`,`Le nom est obligatoire !`),T.size===0&&L.updateAgent(u.data.space.id,e).then(e=>{m(g,d(g).map(t=>e.id===t.id?e:t),!0),m(b,null),m(C,{},!0)}).catch(e=>{console.log(e)})},F=async e=>{T.clear(),!d(v)&&L.getAgent(u.data.space.id,e).then(t=>{m(g,d(g).filter(e=>e.id===t.id?t:e),!0),m(b,e,!0)}).catch(e=>console.log(e))},I=e=>{L.deleteAgent(u.data.space.id,e).then(()=>{m(g,d(g).filter(t=>t.id!==e),!0)}).catch(e=>{console.log(e)})},z=e=>{let t=d(h);t.defaultAgentId=e,R.updateSpace(t.id,t).then(e=>{M.spaces.map(t=>t.id===M.current?e:t),m(h,e,!0)}).catch(e=>{console.log(e)})};var B=G(),V=i(B),K=e=>{var i=n(),a=o(i);t(a,()=>`new`,e=>{H(e,{get item(){return d(C)},get errors(){return T},onSave:A,onCancel:D,get providersModels(){return u.data.providersModels}})}),r(e,i)},q=e=>{var t=U();c(`click`,t,E),r(e,t)};O(V,e=>{d(v)?e(K):e(q,-1)});var J=w(V,2);k(J,17,()=>d(g),e=>e.id,(a,s)=>{var l=n(),f=o(l),m=e=>{var i=n(),a=o(i);t(a,()=>d(s).id,e=>{H(e,{get item(){return d(s)},get errors(){return T},onSave:N,onCancel:j,get providersModels(){return u.data.providersModels}})}),r(e,i)},g=t=>{var n=W(),a=i(n),o=i(a),l=i(o,!0);y(o),y(a);var u=w(a,2);let f;var m=w(u,2),g=w(m,2);y(n),e(()=>{p(l,d(s).name),f=x(u,1,`bt small mx-1`,null,f,{highlight:d(s).id===d(h).defaultAgentId})}),c(`click`,u,()=>z(d(s).id)),c(`click`,m,()=>F(d(s).id)),c(`click`,g,()=>I(d(s).id)),r(t,n)};O(f,e=>{d(b)===d(s).id?e(m):e(g,-1)}),r(a,l)}),y(B),r(l,B),S()}C([`click`]);export{K as component,z as universal}; \ No newline at end of file diff --git a/backend/internal/http/web/_app/version.json b/backend/internal/http/web/_app/version.json index 4961b80..587190b 100644 --- a/backend/internal/http/web/_app/version.json +++ b/backend/internal/http/web/_app/version.json @@ -1 +1 @@ -{"version":"1788613178637"} \ No newline at end of file +{"version":"1788815336322"} \ No newline at end of file diff --git a/backend/internal/http/web/index.html b/backend/internal/http/web/index.html index 25f980f..772a1b3 100644 --- a/backend/internal/http/web/index.html +++ b/backend/internal/http/web/index.html @@ -4,29 +4,29 @@ - - + + - + - + - +
        diff --git a/backend/web/src/lib/types/api.ts b/backend/web/src/lib/types/api.ts index f0aa57d..7f61239 100644 --- a/backend/web/src/lib/types/api.ts +++ b/backend/web/src/lib/types/api.ts @@ -78,6 +78,49 @@ export interface Agent { _version: string } +export type Chat = { + id: string + teamId: string + startDatetime: string + endDatetime: string + agentId: string + userId: string + taskId: string + title: string + _date_created: string + _date_updated: string + _version: string +} + +export type Message = { + id: string + role: string + content: string + toolCallId: string + toolCalls: Array + _date_created: string + _date_updated: string + _version: string +} + +export type ChatWithMessages = { + chat: Chat + messages: Message[] +} + +export type Chunk = { + done: boolean + role: string + content: string +} + +export type ChatRequest = { + agentId: string + providerId: string + modelId: string + prompt: string +} + export enum SaveState { None, @@ -86,3 +129,10 @@ export enum SaveState { Saved, Error, } + + +export type PageRequest = { + pageNum: number + pageSize: number + filters: Map +} diff --git a/backend/web/src/lib/ui/autofocus.ts b/backend/web/src/lib/ui/autofocus.ts new file mode 100644 index 0000000..57801b4 --- /dev/null +++ b/backend/web/src/lib/ui/autofocus.ts @@ -0,0 +1,3 @@ + export const autofocus = (node: HTMLElement) => { + node.focus(); + } diff --git a/backend/web/src/routes/(authenticated)/[space]/(chat)/+page.svelte b/backend/web/src/routes/(authenticated)/[space]/(chat)/+page.svelte index 0b1bff7..9b6460c 100644 --- a/backend/web/src/routes/(authenticated)/[space]/(chat)/+page.svelte +++ b/backend/web/src/routes/(authenticated)/[space]/(chat)/+page.svelte @@ -1,8 +1,35 @@ -
        - Lorem ipsum dolor sit amet consectetur, adipisicing elit. Asperiores, reiciendis quo. Quos animi nisi modi cumque hic illo doloremque totam! Distinctio molestias sint magnam illum nostrum eos, fugit aliquid consequuntur? - Lorem ipsum dolor sit amet consectetur, adipisicing elit. Asperiores, reiciendis quo. Quos animi nisi modi cumque hic illo doloremque totam! Distinctio molestias sint magnam illum nostrum eos, fugit aliquid consequuntur? - Lorem ipsum dolor sit amet consectetur, adipisicing elit. Asperiores, reiciendis quo. Quos animi nisi modi cumque hic illo doloremque totam! Distinctio molestias sint magnam illum nostrum eos, fugit aliquid consequuntur? - Lorem ipsum dolor sit amet consectetur, adipisicing elit. Asperiores, reiciendis quo. Quos animi nisi modi cumque hic illo doloremque totam! Distinctio molestias sint magnam illum nostrum eos, fugit aliquid consequuntur? - Lorem ipsum dolor sit amet consectetur, adipisicing elit. Asperiores, reiciendis quo. Quos animi nisi modi cumque hic illo doloremque totam! Distinctio molestias sint magnam illum nostrum eos, fugit aliquid consequuntur? - Lorem ipsum dolor sit amet consectetur, adipisicing elit. Asperiores, reiciendis quo. Quos animi nisi modi cumque hic illo doloremque totam! Distinctio molestias sint magnam illum nostrum eos, fugit aliquid consequuntur? + + + +
        +
        +
        + + +
        +
        diff --git a/backend/web/src/routes/(authenticated)/[space]/(chat)/+page.ts b/backend/web/src/routes/(authenticated)/[space]/(chat)/+page.ts index ef26b91..33ac37f 100644 --- a/backend/web/src/routes/(authenticated)/[space]/(chat)/+page.ts +++ b/backend/web/src/routes/(authenticated)/[space]/(chat)/+page.ts @@ -1,3 +1,8 @@ -export function load() { - return { title: 'Conversation' }; +import type { PageLoad } from "./$types"; + +export const load: PageLoad = ({params}) => { + return { + title: 'Nouvelle conversation', + spaceId : params.space, + }; } diff --git a/backend/web/src/routes/(authenticated)/[space]/(chat)/[conversation]/+page.svelte b/backend/web/src/routes/(authenticated)/[space]/(chat)/[conversation]/+page.svelte new file mode 100644 index 0000000..74cfb84 --- /dev/null +++ b/backend/web/src/routes/(authenticated)/[space]/(chat)/[conversation]/+page.svelte @@ -0,0 +1,75 @@ + + +
        +
        + {#each messages as message (message.id)} +
        +
        + +
        +
        + {/each} +
        +
        +
        + + +
        +
        +
        diff --git a/backend/web/src/routes/(authenticated)/[space]/(chat)/[conversation]/+page.ts b/backend/web/src/routes/(authenticated)/[space]/(chat)/[conversation]/+page.ts new file mode 100644 index 0000000..4e51ec0 --- /dev/null +++ b/backend/web/src/routes/(authenticated)/[space]/(chat)/[conversation]/+page.ts @@ -0,0 +1,9 @@ +import type { PageLoad } from "./$types"; + +export const load: PageLoad = ({params}) => { + return { + title: 'Nouvelle conversation', + spaceId: params.space, + chatId: params.conversation, + }; +} diff --git a/backend/web/src/routes/(authenticated)/[space]/settings/agents/+page.svelte b/backend/web/src/routes/(authenticated)/[space]/settings/agents/+page.svelte index 539399d..9910253 100644 --- a/backend/web/src/routes/(authenticated)/[space]/settings/agents/+page.svelte +++ b/backend/web/src/routes/(authenticated)/[space]/settings/agents/+page.svelte @@ -100,7 +100,6 @@ let updSpace = space updSpace.defaultAgentId = agentId teamApi.updateSpace(updSpace.id, updSpace).then((newdata)=>{ - console.log(newdata) spaceState.spaces.map((s)=>s.id===spaceState.current?newdata:s) space=newdata }).catch((err)=>{ diff --git a/backend/web/src/routes/(public)/login/+page.svelte b/backend/web/src/routes/(public)/login/+page.svelte index ddca439..b2002d2 100644 --- a/backend/web/src/routes/(public)/login/+page.svelte +++ b/backend/web/src/routes/(public)/login/+page.svelte @@ -3,6 +3,7 @@ import { auth, setToken } from '$lib/state/auth.svelte'; import { goto } from '$app/navigation'; import { authApi } from "$lib/api/endpoints/auth" + import { validateEmail } from "$lib/utilities/validators" type Credentials = { email: string @@ -17,7 +18,7 @@ }) const formSubmitEmail = () => { - credentials.validemail = true + credentials.validemail = validateEmail(credentials.email) } const formSubmitPass = (e: Event) => { @@ -43,16 +44,16 @@
        -
        @@ -72,10 +73,10 @@ -
        diff --git a/backend/web/src/routes/layout.css b/backend/web/src/routes/layout.css index d3d6533..b0b4371 100644 --- a/backend/web/src/routes/layout.css +++ b/backend/web/src/routes/layout.css @@ -11,7 +11,7 @@ body { @apply h-full bg-stone-100 text-stone-950 dark:bg-stone-950 dark:text-stone-100; } -.formelement > label { +label { @apply text-xs text-stone-600 uppercase dark:text-stone-400; } hr { @@ -30,9 +30,9 @@ h2 { } .bt { appearance: button; - @apply min-w-40 cursor-pointer rounded bg-stone-300 px-4 py-1 transition-all duration-300 hover:bg-stone-200 dark:bg-stone-800 dark:hover:bg-stone-700; + @apply min-w-40 cursor-pointer rounded bg-stone-300 px-4 py-1 transition-all duration-300 hover:bg-stone-400 dark:bg-stone-800 dark:hover:bg-stone-700; &.small { - @apply min-w-0 px-2 py-1; + @apply min-w-2 px-2 py-1; } &.changed, &.saving { @@ -62,10 +62,12 @@ h2 { .public h1 { @apply mb-4 text-3xl font-bold; } -.profile a, -.public a { +.profile a { @apply bg-sky-300 dark:bg-sky-700; } +.public a { + @apply text-sky-500 dark:text-sky-500; +} #outer { @apply flex h-full flex-row; @@ -113,10 +115,18 @@ h2 { } } +.chatinput { + @apply w-full rounded-l-xl border-stone-300 bg-stone-50 p-2 text-stone-900 dark:border-stone-700 dark:bg-stone-900 dark:text-stone-100; +} + +.chatbutton { + @apply min-w-12 cursor-pointer rounded-r-xl bg-stone-300 px-2 py-1 transition-all duration-300 hover:bg-stone-400 dark:bg-stone-700 dark:hover:bg-stone-600; +} + /* form */ .formgroup { - @apply rounded border border-stone-300 bg-stone-100 p-2 text-sm dark:border-stone-700 dark:bg-stone-900; + @apply rounded border border-stone-300 bg-stone-200 p-2 text-sm dark:border-stone-700 dark:bg-stone-900; } .formelement { @@ -124,11 +134,11 @@ h2 { } .textinput { - @apply h-8 w-full rounded border-stone-700 bg-stone-50 px-2 py-1 text-sm text-stone-900 dark:bg-stone-950 dark:text-stone-100; + @apply h-8 w-full rounded border-stone-300 bg-stone-50 px-2 py-1 text-sm text-stone-900 dark:border-stone-700 dark:bg-stone-950 dark:text-stone-100; } .areainput { - @apply w-full rounded border-stone-700 bg-stone-50 px-2 py-1 text-sm text-stone-900 dark:bg-stone-950 dark:text-stone-100; + @apply w-full rounded border-stone-300 bg-stone-50 px-2 py-1 text-sm text-stone-900 dark:bg-stone-950 dark:text-stone-100; } /* svelte select */ @@ -261,3 +271,31 @@ h2 { .list-item { @apply list-none; } + +/* chat */ + +.message { + @apply m-2 rounded p-2; + + &.user { + @apply bg-sky-500 dark:text-white; + } + + &.assistant { + &.reasoning { + @apply text-white/50; + } + } +} + +.message-content { + @apply text-sm; +} + +.message-content p { + @apply my-2; +} + +.message-content pre { + @apply my-2 whitespace-pre dark:bg-stone-700; +} diff --git a/backend/web/tailwind.config.js b/backend/web/tailwind.config.js new file mode 100644 index 0000000..d0b1278 --- /dev/null +++ b/backend/web/tailwind.config.js @@ -0,0 +1,10 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: [ + "./src/**/*.{html,js,svelte,ts}", + ], + theme: { + extend: {}, + }, + plugins: [], +}