From 87c8dfcbea0e6e467051e71cc798a589362676e4 Mon Sep 17 00:00:00 2001
From: mirivlad
Date: Tue, 2 Jun 2026 02:26:05 +0800
Subject: [PATCH] =?UTF-8?q?sync:=20overhaul=20sync=20system=20=E2=80=94=20?=
=?UTF-8?q?device=20pairing,=20server=5Fsequence,=20auto-sync,=20dashboard?=
=?UTF-8?q?s?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
BREAKING: replace legacy API keys with device tokens via pairing flow.
- Server: /api/client/pair, revoke, me endpoints; server_sequence + tombstones + idempotency
- Desktop client: PairDevice, GetMe, RevokeCurrent; auto-sync loop every 60s
- Config: device_token stored in separate file (0600), not config.yml
- Client DB: last_pull_seq migration for incremental pull
- Frontend (Svelte): settings modal with connect/disconnect/interval
- User dashboard (/dashboard): device list with status, revoke with password
- Admin dashboard (/admin/dashboard): devices table from /admin/api/devices
- CLI (cmd/verstak): updated for ServerSequence/GetState changes
- Fix: autoSyncLoop falls back to SQLite sync_state for server URL
- Fix: SyncSetInterval preserves server_url/device_id from SQLite
---
cmd/verstak-gui/app.go | 154 ++++-
.../frontend-dist/assets/main-Bkv7FuGB.css | 1 +
.../frontend-dist/assets/main-CvznySlT.js | 16 +
.../frontend-dist/assets/main-DVpSwKcZ.css | 1 -
.../frontend-dist/assets/main-Dk1pVsWM.js | 16 -
cmd/verstak-gui/frontend-dist/index.html | 4 +-
cmd/verstak-server/server.go | 643 ++++++++++++++----
cmd/verstak/main.go | 8 +-
frontend/src/App.svelte | 122 +++-
go.mod | 2 +-
internal/core/config/config.go | 66 +-
internal/core/storage/migrations_011.sql.go | 6 +
internal/core/storage/storage.go | 17 +-
internal/core/sync/client.go | 140 +++-
internal/core/sync/sync.go | 59 +-
15 files changed, 1002 insertions(+), 253 deletions(-)
create mode 100644 cmd/verstak-gui/frontend-dist/assets/main-Bkv7FuGB.css
create mode 100644 cmd/verstak-gui/frontend-dist/assets/main-CvznySlT.js
delete mode 100644 cmd/verstak-gui/frontend-dist/assets/main-DVpSwKcZ.css
delete mode 100644 cmd/verstak-gui/frontend-dist/assets/main-Dk1pVsWM.js
create mode 100644 internal/core/storage/migrations_011.sql.go
diff --git a/cmd/verstak-gui/app.go b/cmd/verstak-gui/app.go
index fc61019..b34bcf2 100644
--- a/cmd/verstak-gui/app.go
+++ b/cmd/verstak-gui/app.go
@@ -3,6 +3,7 @@ package main
import (
"context"
"fmt"
+ "log"
"os"
"os/exec"
"path/filepath"
@@ -51,6 +52,49 @@ func (a *App) startup(ctx context.Context) {
wailsruntime.EventsEmit(ctx, "files-dropped", paths)
}
})
+ go a.autoSyncLoop()
+}
+
+func (a *App) autoSyncLoop() {
+ const checkInterval = 60 * time.Second
+ ticker := time.NewTicker(checkInterval)
+ defer ticker.Stop()
+ log.Printf("[autosync] started, vault=%s", a.vault)
+ for {
+ select {
+ case <-ticker.C:
+ serverURL := ""
+ cfg, err := config.Load(a.vault)
+ if err == nil {
+ serverURL = cfg.Sync.ServerURL
+ }
+ // Fall back to SQLite sync_state if config doesn't have it.
+ if serverURL == "" {
+ sURL, _, _, _, _ := a.sync.GetState()
+ serverURL = sURL
+ }
+ if serverURL == "" {
+ log.Printf("[autosync] no server URL")
+ continue
+ }
+ if cfg != nil && cfg.Sync.SyncInterval <= 0 {
+ log.Printf("[autosync] interval=%d, skipping", cfg.Sync.SyncInterval)
+ continue
+ }
+ deviceToken := config.LoadDeviceToken(a.vault)
+ if deviceToken == "" {
+ log.Printf("[autosync] no device token")
+ continue
+ }
+ log.Printf("[autosync] running SyncNow...")
+ if _, err := a.SyncNow(); err != nil {
+ log.Printf("[autosync] SyncNow error: %v", err)
+ }
+ case <-a.ctx.Done():
+ log.Printf("[autosync] stopped")
+ return
+ }
+ }
}
// ============================================================
@@ -844,6 +888,10 @@ type SyncStatusDTO struct {
Configured bool `json:"configured"`
ServerURL string `json:"serverUrl"`
DeviceID string `json:"deviceId"`
+ DeviceName string `json:"deviceName"`
+ Connected bool `json:"connected"`
+ Revoked bool `json:"revoked"`
+ TokenStored bool `json:"tokenStored"`
UnpushedOps int `json:"unpushedOps"`
LastSyncAt string `json:"lastSyncAt"`
SyncInterval int `json:"syncInterval"`
@@ -854,65 +902,120 @@ func (a *App) SyncStatus() (*SyncStatusDTO, error) {
if err != nil {
return &SyncStatusDTO{}, nil
}
- unpushed, _ := a.sync.GetUnpushedOps()
cfg, _ := config.Load(a.vault)
+ deviceToken := config.LoadDeviceToken(a.vault)
dto := &SyncStatusDTO{
- Configured: serverURL != "" && apiKey != "",
+ Configured: serverURL != "" && (apiKey != "" || deviceToken != ""),
ServerURL: serverURL,
- UnpushedOps: len(unpushed),
LastSyncAt: lastSyncAt,
+ UnpushedOps: 0,
+ TokenStored: deviceToken != "",
}
if cfg != nil {
dto.DeviceID = cfg.Sync.DeviceID
dto.SyncInterval = cfg.Sync.SyncInterval
}
+ unpushed, _ := a.sync.GetUnpushedOps()
+ dto.UnpushedOps = len(unpushed)
+
+ if deviceToken != "" {
+ client := syncsvc.NewClient(serverURL, "", "", a.vault)
+ client.DeviceToken = deviceToken
+ if cfg != nil {
+ client.DeviceID = cfg.Sync.DeviceID
+ }
+ if info, err := client.GetMe(); err == nil {
+ dto.DeviceName = info.DeviceName
+ dto.DeviceID = info.DeviceID
+ dto.Connected = true
+ if info.RevokedAt != "" {
+ dto.Revoked = true
+ dto.Connected = false
+ }
+ }
+ }
return dto, nil
}
func (a *App) SyncConfigure(serverURL, username, password string) error {
- // Register device on server with user credentials.
hostname, _ := os.Hostname()
if hostname == "" {
hostname = "unknown"
}
client := syncsvc.NewClient(serverURL, "", "", a.vault)
- deviceID, apiKey, err := client.RegisterDeviceWithAuth(hostname, username, password)
+ deviceID, deviceToken, err := client.PairDevice(serverURL, username, password, hostname, "verstak-gui/v2")
if err != nil {
- return fmt.Errorf("register: %w", err)
+ return fmt.Errorf("pair: %w", err)
}
- if err := a.sync.SetState(serverURL, apiKey); err != nil {
+ // Save token to separate file with 0600 perms.
+ if err := config.SaveDeviceToken(a.vault, deviceToken); err != nil {
+ return fmt.Errorf("save token: %w", err)
+ }
+ if err := a.sync.SetState(serverURL, ""); err != nil {
return err
}
- // Persist to vault config.
cfg, err := config.Load(a.vault)
if err != nil {
- return err
+ cfg = &config.Config{}
}
cfg.Sync.ServerURL = serverURL
- cfg.Sync.APIKey = apiKey
cfg.Sync.DeviceID = deviceID
+ cfg.Sync.APIKey = ""
return config.Save(a.vault, cfg)
}
+func (a *App) SyncDisconnect() error {
+ deviceToken := config.LoadDeviceToken(a.vault)
+ cfg, err := config.Load(a.vault)
+ if err != nil {
+ cfg = &config.Config{}
+ }
+ // Revoke token on server if we have one.
+ if deviceToken != "" {
+ client := syncsvc.NewClient(cfg.Sync.ServerURL, "", "", a.vault)
+ client.DeviceToken = deviceToken
+ _ = client.RevokeCurrent()
+ }
+ config.RemoveDeviceToken(a.vault)
+ cfg.Sync.ServerURL = ""
+ cfg.Sync.DeviceID = ""
+ cfg.Sync.APIKey = ""
+ if err := config.Save(a.vault, cfg); err != nil {
+ return err
+ }
+ return a.sync.SetState("", "")
+}
+
func (a *App) SyncTestConnection(serverURL, username, password string) error {
client := syncsvc.NewClient(serverURL, "", "", a.vault)
- _, _, err := client.RegisterDeviceWithAuth("test-connection", username, password)
+ _, _, err := client.PairDevice(serverURL, username, password, "test-connection", "verstak-gui/v2")
return err
}
func (a *App) SyncSetInterval(minutes int) error {
cfg, err := config.Load(a.vault)
if err != nil {
- return err
+ cfg = &config.Config{}
+ }
+ // If config lost the server URL, restore from sync_state.
+ if cfg.Sync.ServerURL == "" {
+ sURL, _, _, _, _ := a.sync.GetState()
+ if sURL != "" {
+ cfg.Sync.ServerURL = sURL
+ }
+ }
+ if cfg.Sync.DeviceID == "" {
+ cfg.Sync.DeviceID = a.sync.GetDeviceID()
}
cfg.Sync.SyncInterval = minutes
return config.Save(a.vault, cfg)
}
func (a *App) SyncNow() (map[string]interface{}, error) {
- serverURL, apiKey, lastRev, _, err := a.sync.GetState()
- if err != nil || serverURL == "" || apiKey == "" {
+ serverURL, apiKey, lastPullSeq, _, err := a.sync.GetState()
+ deviceToken := config.LoadDeviceToken(a.vault)
+ if err != nil || serverURL == "" || (apiKey == "" && deviceToken == "") {
return nil, fmt.Errorf("sync not configured")
}
@@ -922,6 +1025,7 @@ func (a *App) SyncNow() (map[string]interface{}, error) {
}
client := syncsvc.NewClient(serverURL, apiKey, deviceID, a.vault)
+ client.DeviceToken = deviceToken
// Push unpushed ops.
unpushed, err := a.sync.GetUnpushedOps()
@@ -940,15 +1044,33 @@ func (a *App) SyncNow() (map[string]interface{}, error) {
}
// Pull remote ops.
- pullResult, err := client.Pull(lastRev)
+ pullResult, err := client.Pull(lastPullSeq)
if err != nil {
return nil, fmt.Errorf("pull: %w", err)
}
+ if len(pullResult.Ops) > 0 {
+ // Apply pulled ops locally (record as remote ops, mark applied).
+ for _, op := range pullResult.Ops {
+ _ = a.sync.RecordRemoteOp(op)
+ }
+ opIDs := make([]string, len(pullResult.Ops))
+ for i, op := range pullResult.Ops {
+ opIDs[i] = op.OpID
+ }
+ _ = a.sync.MarkApplied(opIDs)
+ }
+
+ // Update sync state.
+ if pullResult.ServerSequence > lastPullSeq {
+ _ = a.sync.SetLastPullSeq(pullResult.ServerSequence)
+ }
+ _ = a.sync.SetLastSyncAt(time.Now().UTC().Format(time.RFC3339))
+
return map[string]interface{}{
"pushed": len(pushResult.Accepted),
"pulled": len(pullResult.Ops),
- "serverRevision": pullResult.ServerRevision,
+ "serverSequence": pullResult.ServerSequence,
}, nil
}
diff --git a/cmd/verstak-gui/frontend-dist/assets/main-Bkv7FuGB.css b/cmd/verstak-gui/frontend-dist/assets/main-Bkv7FuGB.css
new file mode 100644
index 0000000..289504f
--- /dev/null
+++ b/cmd/verstak-gui/frontend-dist/assets/main-Bkv7FuGB.css
@@ -0,0 +1 @@
+.file-row.svelte-1u905d2.svelte-1u905d2{display:flex;align-items:center;gap:10px;padding:8px 12px;border-radius:6px;cursor:default;transition:background .12s;min-height:52px;-webkit-user-select:none;user-select:none;position:relative}.file-row.svelte-1u905d2.svelte-1u905d2:hover{background:#1e1e30}.file-row--selected.svelte-1u905d2.svelte-1u905d2{background:#1e1e3a;outline:1px solid #3a3a6c}.file-row--selected.svelte-1u905d2.svelte-1u905d2:hover{background:#252545}.file-row.svelte-1u905d2.svelte-1u905d2:focus-visible{outline:2px solid #5588ff;outline-offset:-2px}.file-row-icon.svelte-1u905d2.svelte-1u905d2{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:32px;height:32px;color:#888}.file-row-body.svelte-1u905d2.svelte-1u905d2{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.file-row-name.svelte-1u905d2.svelte-1u905d2{font-size:13px;color:#ddd;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:1.3}.file-row-meta.svelte-1u905d2.svelte-1u905d2{display:flex;align-items:center;gap:4px;font-size:11px;color:#666}.meta-sep.svelte-1u905d2.svelte-1u905d2{color:#444}.file-row-actions.svelte-1u905d2.svelte-1u905d2{display:flex;gap:2px;align-items:center;opacity:0;transition:opacity .15s ease;flex-shrink:0}.file-row.svelte-1u905d2:hover .file-row-actions.svelte-1u905d2{opacity:1}.action-btn.svelte-1u905d2.svelte-1u905d2{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;border-radius:4px;background:transparent;color:#666;cursor:pointer;transition:background .12s,color .12s}.action-btn.svelte-1u905d2.svelte-1u905d2:hover{background:#2a2a3c;color:#ccc}.action-btn-danger.svelte-1u905d2.svelte-1u905d2:hover{background:#3a2222;color:#ff6b6b}.action-btn.svelte-1u905d2.svelte-1u905d2:focus-visible{outline:2px solid #5588ff;outline-offset:1px}.menu-backdrop.svelte-1u905d2.svelte-1u905d2{position:fixed;top:0;right:0;bottom:0;left:0;z-index:99}.menu.svelte-1u905d2.svelte-1u905d2{position:absolute;right:12px;margin-top:4px;background:#1a1a28;border:1px solid #2a2a3c;border-radius:8px;padding:4px;z-index:100;min-width:220px;box-shadow:0 4px 16px #00000080}.menu-item.svelte-1u905d2.svelte-1u905d2{display:flex;align-items:center;gap:8px;width:100%;padding:7px 10px;border:none;background:transparent;color:#ccc;font-size:12px;text-align:left;cursor:pointer;border-radius:4px;font-family:inherit}.menu-item.svelte-1u905d2.svelte-1u905d2:hover{background:#2a2a3c;color:#fff}.menu-item-danger.svelte-1u905d2.svelte-1u905d2{color:#ff6b6b}.menu-item-danger.svelte-1u905d2.svelte-1u905d2:hover{background:#3a2222}.menu-item.svelte-1u905d2.svelte-1u905d2:focus-visible{outline:2px solid #5588ff;outline-offset:1px}.menu-sep.svelte-1u905d2.svelte-1u905d2{height:1px;background:#2a2a3c;margin:4px 8px}.breadcrumbs.svelte-csi2lb{display:flex;align-items:center;gap:4px;padding:8px 0;font-size:13px;color:#999}.sep.svelte-csi2lb{color:#444}.crumb.svelte-csi2lb{font-size:13px}.crumb--current.svelte-csi2lb{color:#ccc}.crumb--link.svelte-csi2lb{background:none;border:none;padding:2px 4px;color:#888;cursor:pointer;border-radius:3px;font-family:inherit;font-size:13px;transition:color .12s,background .12s}.crumb--link.svelte-csi2lb:hover{color:#ccc;background:#1e1e30}.crumb--link.svelte-csi2lb:focus-visible{outline:2px solid #5588ff;outline-offset:1px}.overlay.svelte-1cw3u0m{position:fixed;top:0;right:0;bottom:0;left:0;background:#000000a6;display:flex;align-items:center;justify-content:center;z-index:1000}.modal.svelte-1cw3u0m{background:#14141f;border:1px solid #2a2a3c;border-radius:10px;width:90vw;max-width:900px;height:85vh;max-height:700px;display:flex;flex-direction:column;overflow:hidden}.preview-header.svelte-1cw3u0m{display:flex;align-items:center;gap:10px;padding:12px 16px;border-bottom:1px solid #2a2a3c;flex-shrink:0}.preview-title.svelte-1cw3u0m{display:flex;align-items:center;gap:8px;color:#ddd;font-size:14px;min-width:0}.preview-name.svelte-1cw3u0m{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.preview-meta.svelte-1cw3u0m{font-size:11px;color:#666;margin-left:auto;white-space:nowrap}.preview-actions.svelte-1cw3u0m{display:flex;gap:4px;flex-shrink:0;margin-left:8px}.action-btn.svelte-1cw3u0m{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border:none;border-radius:4px;background:transparent;color:#666;cursor:pointer;transition:background .12s,color .12s}.action-btn.svelte-1cw3u0m:hover{background:#2a2a3c;color:#ccc}.action-btn.svelte-1cw3u0m:focus-visible{outline:2px solid #5588ff;outline-offset:1px}.action-btn-close.svelte-1cw3u0m{color:#ff6b6b}.action-btn-close.svelte-1cw3u0m:hover{background:#3a2222;color:#f44}.preview-body.svelte-1cw3u0m{flex:1;overflow:auto;min-height:0}.preview-status.svelte-1cw3u0m{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:48px 24px;color:#888;font-size:14px}.preview-image-container.svelte-1cw3u0m{display:flex;align-items:center;justify-content:center;padding:16px;min-height:200px;background:#0e0e18}.preview-image.svelte-1cw3u0m{max-width:100%;max-height:calc(85vh - 100px);object-fit:contain;border-radius:4px}.preview-text.svelte-1cw3u0m{margin:0;padding:16px;font-family:SF Mono,Fira Code,Cascadia Code,Consolas,monospace;font-size:12px;line-height:1.5;color:#ccc;white-space:pre-wrap;word-wrap:break-word;overflow:auto}.preview-pdf-container.svelte-1cw3u0m{width:100%;height:100%}.preview-pdf.svelte-1cw3u0m{width:100%;height:100%;border:none}.btn-sm.svelte-1cw3u0m{padding:6px 14px;border:1px solid #2a2a3c;background:#1a1a28;color:#ccc;border-radius:6px;cursor:pointer;font-size:12px;font-family:inherit;transition:background .12s}.btn-sm.svelte-1cw3u0m:hover{background:#223}.overlay.svelte-1fv6yyk{position:fixed;top:0;right:0;bottom:0;left:0;background:#0009;display:flex;align-items:center;justify-content:center;z-index:200}.modal.svelte-1fv6yyk{background:#1a1a28;border:1px solid #2a2a3c;border-radius:12px;padding:24px;width:360px;max-width:90vw}h3.svelte-1fv6yyk{font-size:18px;margin-bottom:12px;color:#e4e4ef}.message.svelte-1fv6yyk{font-size:14px;color:#aaa;margin-bottom:20px;line-height:1.4}.actions.svelte-1fv6yyk{display:flex;gap:8px;justify-content:flex-end}.btn.svelte-1fv6yyk{padding:8px 16px;border:1px solid #2a2a3c;background:#1a1a28;color:#ccc;border-radius:6px;cursor:pointer;font-size:13px;font-family:inherit}.btn.svelte-1fv6yyk:hover{background:#223}.btn-primary.svelte-1fv6yyk{background:#6366f1;border-color:#6366f1;color:#fff}.btn-primary.svelte-1fv6yyk:hover{background:#4f46e5}.btn-danger.svelte-1fv6yyk{background:#dc2626;border-color:#dc2626;color:#fff}.btn-danger.svelte-1fv6yyk:hover{background:#b91c1c}.btn.svelte-1fv6yyk:focus-visible{outline:2px solid #5588ff;outline-offset:1px}.svelte-1qo7cgm.svelte-1qo7cgm,.svelte-1qo7cgm.svelte-1qo7cgm:before,.svelte-1qo7cgm.svelte-1qo7cgm:after{box-sizing:border-box;margin:0;padding:0}.app.svelte-1qo7cgm.svelte-1qo7cgm{display:flex;width:100vw;height:100vh;overflow:hidden;background:#13131f;color:#e4e4ef;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:14px}.sidebar.svelte-1qo7cgm.svelte-1qo7cgm{width:260px;min-width:200px;height:100vh;display:flex;flex-direction:column;background:#1a1a28;border-right:1px solid #2a2a3c;flex-shrink:0;overflow:hidden}.sidebar-brand.svelte-1qo7cgm.svelte-1qo7cgm{padding:16px 20px;display:flex;align-items:center;gap:10px;border-bottom:1px solid #2a2a3c;flex-shrink:0}.logo.svelte-1qo7cgm.svelte-1qo7cgm{font-size:20px;line-height:1}.brand-name.svelte-1qo7cgm.svelte-1qo7cgm{font-size:16px;font-weight:600}.sidebar-nav.svelte-1qo7cgm.svelte-1qo7cgm{flex:1;overflow-y:auto;padding:12px 0}.nav-group.svelte-1qo7cgm.svelte-1qo7cgm{margin-bottom:16px}.nav-label.svelte-1qo7cgm.svelte-1qo7cgm{font-size:10px;text-transform:uppercase;letter-spacing:.5px;color:#666;padding:4px 20px;margin-bottom:4px}.nav-item.svelte-1qo7cgm.svelte-1qo7cgm{display:block;width:100%;padding:8px 20px;border:none;background:none;color:#ccc;font-size:13px;text-align:left;cursor:pointer;border-radius:0;font-family:inherit}.nav-item.svelte-1qo7cgm.svelte-1qo7cgm:hover{background:#223}.nav-item.selected.svelte-1qo7cgm.svelte-1qo7cgm{background:#2a2a4a;color:#fff;font-weight:500}.nav-empty.svelte-1qo7cgm.svelte-1qo7cgm{padding:8px 20px;color:#555;font-size:12px}.sidebar-footer.svelte-1qo7cgm.svelte-1qo7cgm{padding:8px 12px;border-top:1px solid #2a2a3c;flex-shrink:0;display:flex;flex-direction:column;gap:4px}.version.svelte-1qo7cgm.svelte-1qo7cgm{font-size:11px;color:#555;text-align:center}.main.svelte-1qo7cgm.svelte-1qo7cgm{flex:1;display:flex;flex-direction:column;height:100vh;min-width:0;overflow:hidden;background:#13131f}.header.svelte-1qo7cgm.svelte-1qo7cgm{padding:12px 24px;border-bottom:1px solid #2a2a3c;display:flex;align-items:center;flex-shrink:0;min-height:48px}.header-left.svelte-1qo7cgm.svelte-1qo7cgm{display:flex;align-items:center;gap:8px;flex:1}.header-right.svelte-1qo7cgm.svelte-1qo7cgm{display:flex;align-items:center;gap:8px}.header-sync-btn.svelte-1qo7cgm.svelte-1qo7cgm{background:#1e1e38;border:1px solid #6366f1;border-radius:8px;padding:6px 12px;cursor:pointer;display:inline-flex;align-items:center;gap:6px;color:#c0c0f0;font-family:inherit;font-size:13px;position:relative}.header-sync-btn.svelte-1qo7cgm.svelte-1qo7cgm:hover{background:#2a2a50;color:#e4e4ef;border-color:#818cf8}.header-sync-btn.svelte-1qo7cgm.svelte-1qo7cgm:disabled{opacity:.5;cursor:not-allowed}.sync-badge.svelte-1qo7cgm.svelte-1qo7cgm{background:#6366f1;color:#fff;font-size:10px;border-radius:50%;width:16px;height:16px;display:inline-flex;align-items:center;justify-content:center;position:absolute;top:-6px;right:-6px}.crumb.svelte-1qo7cgm.svelte-1qo7cgm{font-size:14px;font-weight:500}.crumb.placeholder.svelte-1qo7cgm.svelte-1qo7cgm{color:#666}.crumb-type.svelte-1qo7cgm.svelte-1qo7cgm{font-size:11px;color:#555;background:#1e1e2e;padding:2px 8px;border-radius:10px;margin-left:8px}.error-banner.svelte-1qo7cgm.svelte-1qo7cgm{background:#3a2222;color:#f88;padding:8px 24px;font-size:12px;border-bottom:1px solid #4a2222;flex-shrink:0;cursor:pointer;display:flex;justify-content:space-between;align-items:center}.dismiss-btn.svelte-1qo7cgm.svelte-1qo7cgm{background:none;border:none;color:#f66;cursor:pointer;padding:2px;display:flex;align-items:center;border-radius:2px}.dismiss-btn.svelte-1qo7cgm.svelte-1qo7cgm:hover{color:#f44}.tabs.svelte-1qo7cgm.svelte-1qo7cgm{display:flex;border-bottom:1px solid #2a2a3c;flex-shrink:0;padding:0 24px}.tab.svelte-1qo7cgm.svelte-1qo7cgm{padding:10px 16px;border:none;background:none;color:#888;font-size:13px;cursor:pointer;border-bottom:2px solid transparent;font-family:inherit}.tab.svelte-1qo7cgm.svelte-1qo7cgm:hover{color:#ccc}.tab.active.svelte-1qo7cgm.svelte-1qo7cgm{color:#e4e4ef;border-bottom-color:#6366f1}.tab-content.svelte-1qo7cgm.svelte-1qo7cgm{flex:1;overflow-y:auto}.note-editor.svelte-1qo7cgm.svelte-1qo7cgm{flex:1;display:flex;flex-direction:column;height:100%}.note-editor-header.svelte-1qo7cgm.svelte-1qo7cgm{padding:12px 24px;border-bottom:1px solid #2a2a3c;display:flex;align-items:center;gap:12px;flex-shrink:0}.note-title.svelte-1qo7cgm.svelte-1qo7cgm{font-size:16px;font-weight:500}.dirty-mark.svelte-1qo7cgm.svelte-1qo7cgm{color:#f59e0b;font-size:10px}.note-editor-actions.svelte-1qo7cgm.svelte-1qo7cgm{margin-left:auto;display:flex;gap:8px}.note-textarea.svelte-1qo7cgm.svelte-1qo7cgm{flex:1;width:100%;border:none;outline:none;background:#13131f;color:#e4e4ef;font-family:SF Mono,Fira Code,monospace;font-size:14px;line-height:1.6;padding:24px;resize:none}.overview.svelte-1qo7cgm.svelte-1qo7cgm{padding:24px}.overview.svelte-1qo7cgm h2.svelte-1qo7cgm{font-size:24px;margin-bottom:16px}.meta-grid.svelte-1qo7cgm.svelte-1qo7cgm{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:12px;margin-bottom:24px}.meta-item.svelte-1qo7cgm.svelte-1qo7cgm{background:#1a1a28;padding:12px 16px;border-radius:8px}.meta-label.svelte-1qo7cgm.svelte-1qo7cgm{display:block;font-size:11px;color:#666;margin-bottom:4px;text-transform:uppercase}.quick-actions.svelte-1qo7cgm.svelte-1qo7cgm{display:flex;gap:8px;margin-bottom:24px;flex-wrap:wrap}.qa-btn.svelte-1qo7cgm.svelte-1qo7cgm{padding:10px 16px;border:1px solid #2a2a3c;background:#1a1a28;color:#ccc;border-radius:8px;cursor:pointer;font-size:13px;font-family:inherit;display:inline-flex;align-items:center;gap:6px}.qa-btn.svelte-1qo7cgm.svelte-1qo7cgm:hover{background:#223}.qa-btn.svelte-1qo7cgm.svelte-1qo7cgm:disabled{opacity:.4;cursor:not-allowed}.recent-section.svelte-1qo7cgm.svelte-1qo7cgm{margin-bottom:24px}.recent-section.svelte-1qo7cgm h3.svelte-1qo7cgm{font-size:13px;color:#666;text-transform:uppercase;margin-bottom:8px}.recent-note.svelte-1qo7cgm.svelte-1qo7cgm{padding:8px 12px;border-radius:6px;cursor:pointer;display:flex;justify-content:space-between}.recent-note.svelte-1qo7cgm.svelte-1qo7cgm:hover{background:#1a1a28}.recent-date.svelte-1qo7cgm.svelte-1qo7cgm{font-size:11px;color:#555}.recent-entry.svelte-1qo7cgm.svelte-1qo7cgm{padding:6px 0;font-size:13px;color:#888;border-bottom:1px solid #1a1a28}.notes-tab.svelte-1qo7cgm.svelte-1qo7cgm{padding:24px}.tab-toolbar.svelte-1qo7cgm.svelte-1qo7cgm{margin-bottom:16px}.create-form.svelte-1qo7cgm.svelte-1qo7cgm{background:#1a1a28;padding:16px;border-radius:8px;margin-bottom:16px}.create-form.svelte-1qo7cgm input.svelte-1qo7cgm{width:100%;padding:8px 12px;border:1px solid #2a2a3c;background:#13131f;color:#e4e4ef;border-radius:4px;font-size:14px;font-family:inherit;margin-bottom:8px}.create-form.svelte-1qo7cgm input.svelte-1qo7cgm:focus{outline:none;border-color:#6366f1}.form-actions.svelte-1qo7cgm.svelte-1qo7cgm{display:flex;gap:8px}.notes-list.svelte-1qo7cgm.svelte-1qo7cgm{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:12px}.note-card.svelte-1qo7cgm.svelte-1qo7cgm{background:#1a1a28;border:1px solid #2a2a3c;border-radius:8px;padding:16px;cursor:pointer}.note-card.svelte-1qo7cgm.svelte-1qo7cgm:hover{border-color:#3a3a5c}.note-card-title.svelte-1qo7cgm.svelte-1qo7cgm{font-size:14px;font-weight:500;margin-bottom:4px}.note-card-date.svelte-1qo7cgm.svelte-1qo7cgm{font-size:11px;color:#555}.worklog-tab.svelte-1qo7cgm.svelte-1qo7cgm{padding:24px}.worklog-form.svelte-1qo7cgm.svelte-1qo7cgm{display:flex;gap:8px;margin-bottom:24px;align-items:center}.worklog-form.svelte-1qo7cgm input.svelte-1qo7cgm{padding:8px 12px;border:1px solid #2a2a3c;background:#13131f;color:#e4e4ef;border-radius:4px;font-size:14px;font-family:inherit}.worklog-form.svelte-1qo7cgm input.svelte-1qo7cgm:focus{outline:none;border-color:#6366f1}.worklog-form.svelte-1qo7cgm input[type=text].svelte-1qo7cgm{flex:1}.worklog-form.svelte-1qo7cgm input[type=number].svelte-1qo7cgm{width:70px}.worklog-entry.svelte-1qo7cgm.svelte-1qo7cgm{padding:12px 0;border-bottom:1px solid #1a1a28}.wl-meta.svelte-1qo7cgm.svelte-1qo7cgm{font-size:11px;color:#555;margin-top:2px}.actions-tab.svelte-1qo7cgm.svelte-1qo7cgm{padding:24px}.action-card.svelte-1qo7cgm.svelte-1qo7cgm{background:#1a1a28;padding:12px 16px;border-radius:8px;display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:8px}.action-info.svelte-1qo7cgm.svelte-1qo7cgm{display:flex;align-items:center;gap:8px;flex:1;min-width:0}.action-title.svelte-1qo7cgm.svelte-1qo7cgm{font-weight:500}.action-type.svelte-1qo7cgm.svelte-1qo7cgm{font-size:11px;color:#888;background:#223;padding:2px 8px;border-radius:10px;white-space:nowrap}.action-data.svelte-1qo7cgm.svelte-1qo7cgm{font-size:11px;color:#555;font-family:SF Mono,Fira Code,monospace;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:200px}.action-btns.svelte-1qo7cgm.svelte-1qo7cgm{display:flex;gap:4px;flex-shrink:0}.action-btns.svelte-1qo7cgm .btn-danger.svelte-1qo7cgm{color:#ff6b6b;border-color:#4a2222;padding:4px 8px}.action-btns.svelte-1qo7cgm .btn-danger.svelte-1qo7cgm:hover{background:#3a2222}.empty-state.svelte-1qo7cgm.svelte-1qo7cgm{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px 24px;text-align:center}.empty-state.svelte-1qo7cgm p.svelte-1qo7cgm{margin:0;font-size:14px;color:#666}.empty-state.svelte-1qo7cgm .empty-icon.svelte-1qo7cgm{margin-bottom:12px;color:#444}.empty-state.svelte-1qo7cgm .hint.svelte-1qo7cgm{font-size:12px;color:#555;margin-top:6px}.empty-state.svelte-1qo7cgm .empty-actions.svelte-1qo7cgm{display:flex;gap:8px;justify-content:center;margin-top:16px}.empty-note.svelte-1qo7cgm.svelte-1qo7cgm{font-size:12px;color:#444;margin-top:16px}.welcome.svelte-1qo7cgm.svelte-1qo7cgm{padding:48px 24px;text-align:center}.welcome.svelte-1qo7cgm h2.svelte-1qo7cgm{font-size:32px;font-weight:300;color:#8888a4;margin-bottom:16px}.welcome.svelte-1qo7cgm p.svelte-1qo7cgm{color:#666;font-size:14px}.error-text.svelte-1qo7cgm.svelte-1qo7cgm{color:#f88}.fab.svelte-1qo7cgm.svelte-1qo7cgm{position:fixed;bottom:24px;right:24px;width:56px;height:56px;border-radius:50%;background:#6366f1;color:#fff;font-size:28px;display:flex;align-items:center;justify-content:center;cursor:pointer;box-shadow:0 4px 12px #6366f166}.fab.svelte-1qo7cgm.svelte-1qo7cgm:hover{background:#4f46e5}.modal-overlay.svelte-1qo7cgm.svelte-1qo7cgm{position:fixed;top:0;right:0;bottom:0;left:0;background:#0009;display:flex;align-items:center;justify-content:center;z-index:100}.modal.svelte-1qo7cgm.svelte-1qo7cgm{background:#1a1a28;border:1px solid #2a2a3c;border-radius:12px;padding:24px;width:400px;max-width:90vw}.modal.svelte-1qo7cgm h3.svelte-1qo7cgm{font-size:18px;margin-bottom:16px}.form-group.svelte-1qo7cgm.svelte-1qo7cgm{margin-bottom:12px}.form-group.svelte-1qo7cgm label.svelte-1qo7cgm{display:block;font-size:12px;color:#666;margin-bottom:4px}.form-group.svelte-1qo7cgm input.svelte-1qo7cgm,.form-group.svelte-1qo7cgm select.svelte-1qo7cgm{width:100%;padding:8px 12px;border:1px solid #2a2a3c;background:#13131f;color:#e4e4ef;border-radius:4px;font-size:14px;font-family:inherit}.form-group.svelte-1qo7cgm select.svelte-1qo7cgm{-moz-appearance:none;appearance:none;-webkit-appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23888' d='M2 4l4 4 4-4'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 10px center;padding-right:32px}.form-group.svelte-1qo7cgm input.svelte-1qo7cgm:focus,.form-group.svelte-1qo7cgm select.svelte-1qo7cgm:focus{outline:none;border-color:#6366f1}.modal-actions.svelte-1qo7cgm.svelte-1qo7cgm{display:flex;gap:8px;justify-content:flex-end;margin-top:16px}.btn.svelte-1qo7cgm.svelte-1qo7cgm{padding:8px 16px;border:1px solid #2a2a3c;background:#1a1a28;color:#ccc;border-radius:6px;cursor:pointer;font-size:13px;font-family:inherit}.btn.svelte-1qo7cgm.svelte-1qo7cgm:hover{background:#223}.btn-primary.svelte-1qo7cgm.svelte-1qo7cgm{background:#6366f1;border-color:#6366f1;color:#fff}.btn-primary.svelte-1qo7cgm.svelte-1qo7cgm:hover{background:#4f46e5}.btn.svelte-1qo7cgm.svelte-1qo7cgm:disabled{opacity:.4;cursor:not-allowed}.btn-sm.svelte-1qo7cgm.svelte-1qo7cgm{padding:4px 10px;font-size:12px}.btn-danger.svelte-1qo7cgm.svelte-1qo7cgm{color:#ff6b6b;border-color:#4a2222}.btn-danger.svelte-1qo7cgm.svelte-1qo7cgm:hover{background:#3a2222}.files-tab.svelte-1qo7cgm.svelte-1qo7cgm{padding:20px}.files-tab.svelte-1qo7cgm .tab-toolbar.svelte-1qo7cgm{display:flex;gap:8px;align-items:center;margin-bottom:16px}.file-list.svelte-1qo7cgm.svelte-1qo7cgm{display:flex;flex-direction:column}.back-btn.svelte-1qo7cgm.svelte-1qo7cgm{margin-bottom:4px;display:inline-flex;align-items:center;gap:4px}.import-summary.svelte-1qo7cgm.svelte-1qo7cgm{margin-bottom:16px}.summary-row.svelte-1qo7cgm.svelte-1qo7cgm{display:flex;justify-content:space-between;padding:6px 0;font-size:14px;border-bottom:1px solid #2a2a3c}.summary-warn.svelte-1qo7cgm.svelte-1qo7cgm{margin-top:8px;padding:8px 12px;background:#3a2a22;border-radius:6px;color:#fa6;font-size:13px}.rename-error.svelte-1qo7cgm.svelte-1qo7cgm{color:#ff6b6b;font-size:12px;margin-top:4px}.today-dashboard.svelte-1qo7cgm.svelte-1qo7cgm{padding:24px;overflow-y:auto;flex:1}.today-header.svelte-1qo7cgm.svelte-1qo7cgm{display:flex;align-items:baseline;gap:12px;margin-bottom:16px}.today-header.svelte-1qo7cgm h2.svelte-1qo7cgm{font-size:24px}.today-date.svelte-1qo7cgm.svelte-1qo7cgm{font-size:13px;color:#666}.today-summary.svelte-1qo7cgm.svelte-1qo7cgm{display:flex;gap:8px;margin-bottom:20px;flex-wrap:wrap}.summary-chip.svelte-1qo7cgm.svelte-1qo7cgm{font-size:12px;color:#b0b0c0;background:#1a1a28;border:1px solid #2a2a3c;padding:4px 12px;border-radius:16px}.today-case.svelte-1qo7cgm.svelte-1qo7cgm{background:#1a1a28;border:1px solid #2a2a3c;border-radius:8px;margin-bottom:12px;overflow:hidden}.today-case-header.svelte-1qo7cgm.svelte-1qo7cgm{padding:12px 16px;display:flex;align-items:center;gap:8px;border-bottom:1px solid #2a2a3c;cursor:pointer}.today-case-header.svelte-1qo7cgm.svelte-1qo7cgm:hover{background:#1e1e30}.today-case-title.svelte-1qo7cgm.svelte-1qo7cgm{font-weight:500}.today-case-type.svelte-1qo7cgm.svelte-1qo7cgm{font-size:11px;color:#888;background:#223;padding:2px 8px;border-radius:10px}.today-case-count.svelte-1qo7cgm.svelte-1qo7cgm{font-size:11px;color:#6366f1;margin-left:4px}.today-case-time.svelte-1qo7cgm.svelte-1qo7cgm{font-size:11px;color:#555;margin-left:auto}.today-events.svelte-1qo7cgm.svelte-1qo7cgm{padding:8px 16px}.today-event.svelte-1qo7cgm.svelte-1qo7cgm{display:flex;align-items:center;gap:8px;padding:4px 0;font-size:13px;color:#b0b0c0;cursor:pointer}.today-event.svelte-1qo7cgm.svelte-1qo7cgm:hover{color:#e4e4ef}.today-event-icon.svelte-1qo7cgm.svelte-1qo7cgm{width:18px;text-align:center;color:#6366f1;font-size:13px}.today-event-title.svelte-1qo7cgm.svelte-1qo7cgm{flex:1}.today-event-type.svelte-1qo7cgm.svelte-1qo7cgm{font-size:11px;color:#666}.today-event-time.svelte-1qo7cgm.svelte-1qo7cgm{font-size:11px;color:#555;margin-left:auto}.today-events-empty.svelte-1qo7cgm.svelte-1qo7cgm{padding:8px 16px;font-size:13px;color:#666;font-style:italic}.today-empty.svelte-1qo7cgm.svelte-1qo7cgm{padding:48px 24px;text-align:center}.today-empty.svelte-1qo7cgm p.svelte-1qo7cgm{color:#666;font-size:14px;margin:0}.today-empty.svelte-1qo7cgm .hint.svelte-1qo7cgm{font-size:12px;color:#555;margin-top:8px}.today-timeline.svelte-1qo7cgm.svelte-1qo7cgm{margin-top:24px}.today-timeline.svelte-1qo7cgm h3.svelte-1qo7cgm{font-size:13px;color:#666;text-transform:uppercase;margin-bottom:12px}.timeline-event.svelte-1qo7cgm.svelte-1qo7cgm{display:flex;align-items:center;gap:10px;font-size:13px;color:#b0b0c0;border-left:2px solid #2a2a3c;padding:6px 0 6px 16px;margin-left:4px;cursor:pointer}.timeline-event.svelte-1qo7cgm.svelte-1qo7cgm:hover{color:#e4e4ef}.timeline-dot.svelte-1qo7cgm.svelte-1qo7cgm{width:6px;height:6px;border-radius:50%;background:#6366f1;margin-left:-19px;flex-shrink:0}.timeline-title.svelte-1qo7cgm.svelte-1qo7cgm{flex:1}.timeline-type.svelte-1qo7cgm.svelte-1qo7cgm{font-size:11px;color:#666}.timeline-time.svelte-1qo7cgm.svelte-1qo7cgm{font-size:11px;color:#555}.activity-tab.svelte-1qo7cgm.svelte-1qo7cgm{padding:24px}.activity-events.svelte-1qo7cgm.svelte-1qo7cgm{display:flex;flex-direction:column;gap:2px}.activity-event.svelte-1qo7cgm.svelte-1qo7cgm{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:6px;font-size:13px;color:#b0b0c0;cursor:pointer}.activity-event.svelte-1qo7cgm.svelte-1qo7cgm:hover{background:#1a1a28;color:#e4e4ef}.activity-event-icon.svelte-1qo7cgm.svelte-1qo7cgm{width:18px;text-align:center;color:#6366f1;font-size:13px;flex-shrink:0}.activity-event-title.svelte-1qo7cgm.svelte-1qo7cgm{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.activity-event-type.svelte-1qo7cgm.svelte-1qo7cgm{font-size:11px;color:#666;flex-shrink:0}.activity-event-target.svelte-1qo7cgm.svelte-1qo7cgm{font-size:10px;color:#555;background:#1e1e2e;padding:1px 6px;border-radius:8px;flex-shrink:0}.activity-event-time.svelte-1qo7cgm.svelte-1qo7cgm{font-size:11px;color:#555;margin-left:8px;flex-shrink:0}.activity-feed.svelte-1qo7cgm.svelte-1qo7cgm{padding:24px;overflow-y:auto;flex:1}.activity-feed-header.svelte-1qo7cgm.svelte-1qo7cgm{margin-bottom:20px}.activity-feed-header.svelte-1qo7cgm h2.svelte-1qo7cgm{font-size:24px}.activity-feed-events.svelte-1qo7cgm.svelte-1qo7cgm{display:flex;flex-direction:column;gap:2px}.activity-feed-event.svelte-1qo7cgm.svelte-1qo7cgm{display:flex;align-items:flex-start;gap:10px;padding:8px 12px;border-radius:8px;cursor:pointer}.activity-feed-event.svelte-1qo7cgm.svelte-1qo7cgm:hover{background:#1a1a28;color:#e4e4ef}.activity-feed-icon.svelte-1qo7cgm.svelte-1qo7cgm{width:20px;text-align:center;color:#6366f1;font-size:14px;flex-shrink:0;margin-top:1px}.activity-feed-body.svelte-1qo7cgm.svelte-1qo7cgm{flex:1;min-width:0}.activity-feed-title.svelte-1qo7cgm.svelte-1qo7cgm{font-size:14px;color:#e4e4ef}.activity-feed-meta.svelte-1qo7cgm.svelte-1qo7cgm{display:flex;align-items:center;gap:8px;margin-top:2px}.activity-feed-type.svelte-1qo7cgm.svelte-1qo7cgm{font-size:11px;color:#666}.activity-feed-target.svelte-1qo7cgm.svelte-1qo7cgm{font-size:10px;color:#555;background:#1e1e2e;padding:1px 6px;border-radius:8px}.activity-feed-time.svelte-1qo7cgm.svelte-1qo7cgm{font-size:11px;color:#555}.sidebar-sync-btn.svelte-1qo7cgm.svelte-1qo7cgm{background:#1e1e38;border:1px solid #6366f1;border-radius:8px;padding:8px 12px;cursor:pointer;width:100%;display:flex;align-items:center;gap:8px;color:#c0c0f0;font-family:inherit;font-size:13px}.sidebar-sync-btn.svelte-1qo7cgm.svelte-1qo7cgm:hover{background:#2a2a50;color:#e4e4ef;border-color:#818cf8}.sidebar-sync-label.svelte-1qo7cgm.svelte-1qo7cgm{flex:1;text-align:left}.sync-dot.svelte-1qo7cgm.svelte-1qo7cgm{width:8px;height:8px;border-radius:50%;background:#4a4a4a;flex-shrink:0}.sync-dot.active.svelte-1qo7cgm.svelte-1qo7cgm{background:#4ade80;box-shadow:0 0 6px #4ade8080}.modal-sync.svelte-1qo7cgm.svelte-1qo7cgm{width:460px}.sync-status.svelte-1qo7cgm.svelte-1qo7cgm{background:#13131f;border-radius:8px;padding:12px;margin-bottom:16px}.sync-row.svelte-1qo7cgm.svelte-1qo7cgm{display:flex;justify-content:space-between;padding:4px 0;font-size:13px}.sync-label.svelte-1qo7cgm.svelte-1qo7cgm{color:#666}.sync-value.svelte-1qo7cgm.svelte-1qo7cgm{color:#e4e4ef}.sync-value.mono.svelte-1qo7cgm.svelte-1qo7cgm{font-family:SF Mono,Fira Code,monospace;font-size:12px}.sync-result.svelte-1qo7cgm.svelte-1qo7cgm{font-size:12px;color:#6366f1;padding:4px 0}.sync-connected-actions.svelte-1qo7cgm.svelte-1qo7cgm{display:flex;gap:8px;margin-bottom:16px}
diff --git a/cmd/verstak-gui/frontend-dist/assets/main-CvznySlT.js b/cmd/verstak-gui/frontend-dist/assets/main-CvznySlT.js
new file mode 100644
index 0000000..d2d1bf0
--- /dev/null
+++ b/cmd/verstak-gui/frontend-dist/assets/main-CvznySlT.js
@@ -0,0 +1,16 @@
+var js=Object.defineProperty;var Bs=(l,e,t)=>e in l?js(l,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):l[e]=t;var Ft=(l,e,t)=>Bs(l,typeof e!="symbol"?e+"":e,t);(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))n(i);new MutationObserver(i=>{for(const o of i)if(o.type==="childList")for(const s of o.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&n(s)}).observe(document,{childList:!0,subtree:!0});function t(i){const o={};return i.integrity&&(o.integrity=i.integrity),i.referrerPolicy&&(o.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?o.credentials="include":i.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function n(i){if(i.ep)return;i.ep=!0;const o=t(i);fetch(i.href,o)}})();function W(){}function zn(l){return l()}function fl(){return Object.create(null)}function oe(l){l.forEach(zn)}function Vn(l){return typeof l=="function"}function it(l,e){return l!=l?e==e:l!==e||l&&typeof l=="object"||typeof l=="function"}let _t;function gt(l,e){return l===e?!0:(_t||(_t=document.createElement("a")),_t.href=e,l===_t.href)}function Os(l){return Object.keys(l).length===0}function Ps(l){return l??""}function r(l,e){l.appendChild(e)}function b(l,e,t){l.insertBefore(e,t||null)}function h(l){l.parentNode&&l.parentNode.removeChild(l)}function Ce(l,e){for(let t=0;tl.removeEventListener(e,t,n)}function Ve(l){return function(e){return e.stopPropagation(),l.call(this,e)}}function Ye(l){return function(e){e.target===this&&l.call(this,e)}}function c(l,e,t){t==null?l.removeAttribute(e):l.getAttribute(e)!==t&&l.setAttribute(e,t)}function ht(l){return l===""?null:+l}function zs(l){return Array.from(l.childNodes)}function O(l,e){e=""+e,l.data!==e&&(l.data=e)}function se(l,e){l.value=e??""}function He(l,e,t,n){t==null?l.style.removeProperty(e):l.style.setProperty(e,t,"")}function tt(l,e,t){for(let n=0;n{const i=l.$$.callbacks[e];if(i){const o=Vs(e,t,{cancelable:n});return i.slice().forEach(s=>{s.call(l,o)}),!o.defaultPrevented}return!0}}function Rs(l,e){const t=l.$$.callbacks[e.type];t&&t.slice().forEach(n=>n.call(this,e))}const $e=[],ul=[];let et=[];const dl=[],Ks=Promise.resolve();let Bt=!1;function Us(){Bt||(Bt=!0,Ks.then(Un))}function lt(l){et.push(l)}const jt=new Set;let xe=0;function Un(){if(xe!==0)return;const l=dt;do{try{for(;xe<$e.length;){const e=$e[xe];xe++,ut(e),Ws(e.$$)}}catch(e){throw $e.length=0,xe=0,e}for(ut(null),$e.length=0,xe=0;ul.length;)ul.pop()();for(let e=0;el.indexOf(n)===-1?e.push(n):t.push(n)),t.forEach(n=>n()),et=e}const vt=new Set;let Ze;function Re(){Ze={r:0,c:[],p:Ze}}function Ke(){Ze.r||oe(Ze.c),Ze=Ze.p}function ae(l,e){l&&l.i&&(vt.delete(l),l.i(e))}function de(l,e,t,n){if(l&&l.o){if(vt.has(l))return;vt.add(l),Ze.c.push(()=>{vt.delete(l),n&&(t&&l.d(1),n())}),l.o(e)}else n&&n()}function Y(l){return(l==null?void 0:l.length)!==void 0?l:Array.from(l)}function Js(l,e){de(l,1,1,()=>{e.delete(l.key)})}function Xs(l,e,t,n,i,o,s,a,f,d,_,g){let p=l.length,v=o.length,w=p;const C={};for(;w--;)C[l[w].key]=w;const q=[],T=new Map,D=new Map,N=[];for(w=v;w--;){const S=g(i,o,w),L=t(S);let y=s.get(L);y?N.push(()=>y.p(S,e)):(y=d(L,S),y.c()),T.set(L,q[w]=y),L in C&&D.set(L,Math.abs(w-C[L]))}const I=new Set,A=new Set;function j(S){ae(S,1),S.m(a,_),s.set(S.key,S),_=S.first,v--}for(;p&&v;){const S=q[v-1],L=l[p-1],y=S.key,M=L.key;S===L?(_=S.first,p--,v--):T.has(M)?!s.has(y)||I.has(y)?j(S):A.has(M)?p--:D.get(y)>D.get(M)?(A.add(y),j(S)):(I.add(M),p--):(f(L,s),p--)}for(;p--;){const S=l[p];T.has(S.key)||f(S,s)}for(;v;)j(q[v-1]);return oe(N),q}function Qe(l){l&&l.c()}function Ge(l,e,t){const{fragment:n,after_update:i}=l.$$;n&&n.m(e,t),lt(()=>{const o=l.$$.on_mount.map(zn).filter(Vn);l.$$.on_destroy?l.$$.on_destroy.push(...o):oe(o),l.$$.on_mount=[]}),i.forEach(lt)}function Je(l,e){const t=l.$$;t.fragment!==null&&(Gs(t.after_update),oe(t.on_destroy),t.fragment&&t.fragment.d(e),t.on_destroy=t.fragment=null,t.ctx=[])}function Zs(l,e){l.$$.dirty[0]===-1&&($e.push(l),Us(),l.$$.dirty.fill(0)),l.$$.dirty[e/31|0]|=1<{const w=v.length?v[0]:p;return d.ctx&&i(d.ctx[g],d.ctx[g]=w)&&(!d.skip_bound&&d.bound[g]&&d.bound[g](w),_&&Zs(l,g)),p}):[],d.update(),_=!0,oe(d.before_update),d.fragment=n?n(d.ctx):!1,e.target){if(e.hydrate){const g=zs(e.target);d.fragment&&d.fragment.l(g),g.forEach(h)}else d.fragment&&d.fragment.c();e.intro&&ae(l.$$.fragment),Ge(l,e.target,e.anchor),Un()}ut(f)}class ot{constructor(){Ft(this,"$$");Ft(this,"$$set")}$destroy(){Je(this,1),this.$destroy=W}$on(e,t){if(!Vn(t))return W;const n=this.$$.callbacks[e]||(this.$$.callbacks[e]=[]);return n.push(t),()=>{const i=n.indexOf(t);i!==-1&&n.splice(i,1)}}$set(e){this.$$set&&!Os(e)&&(this.$$.skip_bound=!0,this.$$set(e),this.$$.skip_bound=!1)}}const Ys="4";typeof window<"u"&&(window.__svelte||(window.__svelte={v:new Set})).v.add(Ys);function Qs(l){let e,t;return{c(){e=K("path"),t=K("polyline"),c(e,"d","M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"),c(t,"points","14 2 14 8 20 8")},m(n,i){b(n,e,i),b(n,t,i)},d(n){n&&(h(e),h(t))}}}function xs(l){let e,t,n,i,o;return{c(){e=K("path"),t=K("polyline"),n=K("line"),i=K("line"),o=K("polyline"),c(e,"d","M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"),c(t,"points","14 2 14 8 20 8"),c(n,"x1","16"),c(n,"y1","13"),c(n,"x2","8"),c(n,"y2","13"),c(i,"x1","16"),c(i,"y1","17"),c(i,"x2","8"),c(i,"y2","17"),c(o,"points","10 9 9 9 8 9")},m(s,a){b(s,e,a),b(s,t,a),b(s,n,a),b(s,i,a),b(s,o,a)},d(s){s&&(h(e),h(t),h(n),h(i),h(o))}}}function $s(l){let e,t;return{c(){e=K("polyline"),t=K("polyline"),c(e,"points","16 18 22 12 16 6"),c(t,"points","8 6 2 12 8 18")},m(n,i){b(n,e,i),b(n,t,i)},d(n){n&&(h(e),h(t))}}}function eo(l){let e,t,n,i;return{c(){e=K("path"),t=K("polyline"),n=K("line"),i=K("rect"),c(e,"d","M21 8v13a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8"),c(t,"points","7 3 12 8 17 3"),c(n,"x1","3"),c(n,"y1","8"),c(n,"x2","21"),c(n,"y2","8"),c(i,"x","10"),c(i,"y","12"),c(i,"width","4"),c(i,"height","4"),c(i,"rx","1")},m(o,s){b(o,e,s),b(o,t,s),b(o,n,s),b(o,i,s)},d(o){o&&(h(e),h(t),h(n),h(i))}}}function to(l){let e,t,n,i,o;return{c(){e=K("path"),t=K("polyline"),n=K("line"),i=K("line"),o=K("line"),c(e,"d","M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"),c(t,"points","14 2 14 8 20 8"),c(n,"x1","9"),c(n,"y1","12"),c(n,"x2","15"),c(n,"y2","12"),c(i,"x1","9"),c(i,"y1","15"),c(i,"x2","13"),c(i,"y2","15"),c(o,"x1","12"),c(o,"y1","15"),c(o,"x2","12"),c(o,"y2","18")},m(s,a){b(s,e,a),b(s,t,a),b(s,n,a),b(s,i,a),b(s,o,a)},d(s){s&&(h(e),h(t),h(n),h(i),h(o))}}}function lo(l){let e,t,n,i,o,s;return{c(){e=K("path"),t=K("polyline"),n=K("line"),i=K("line"),o=K("line"),s=K("line"),c(e,"d","M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"),c(t,"points","14 2 14 8 20 8"),c(n,"x1","8"),c(n,"y1","12"),c(n,"x2","16"),c(n,"y2","12"),c(i,"x1","8"),c(i,"y1","16"),c(i,"x2","16"),c(i,"y2","16"),c(o,"x1","8"),c(o,"y1","14"),c(o,"x2","12"),c(o,"y2","14"),c(s,"x1","12"),c(s,"y1","12"),c(s,"x2","12"),c(s,"y2","18")},m(a,f){b(a,e,f),b(a,t,f),b(a,n,f),b(a,i,f),b(a,o,f),b(a,s,f)},d(a){a&&(h(e),h(t),h(n),h(i),h(o),h(s))}}}function no(l){let e,t,n,i;return{c(){e=K("path"),t=K("polyline"),n=K("line"),i=K("line"),c(e,"d","M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"),c(t,"points","14 2 14 8 20 8"),c(n,"x1","16"),c(n,"y1","13"),c(n,"x2","8"),c(n,"y2","13"),c(i,"x1","16"),c(i,"y1","17"),c(i,"x2","8"),c(i,"y2","17")},m(o,s){b(o,e,s),b(o,t,s),b(o,n,s),b(o,i,s)},d(o){o&&(h(e),h(t),h(n),h(i))}}}function io(l){let e,t,n,i,o;return{c(){e=K("path"),t=K("polyline"),n=K("line"),i=K("line"),o=K("line"),c(e,"d","M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"),c(t,"points","14 2 14 8 20 8"),c(n,"x1","8"),c(n,"y1","12"),c(n,"x2","16"),c(n,"y2","12"),c(i,"x1","8"),c(i,"y1","16"),c(i,"x2","16"),c(i,"y2","16"),c(o,"x1","8"),c(o,"y1","14"),c(o,"x2","12"),c(o,"y2","14")},m(s,a){b(s,e,a),b(s,t,a),b(s,n,a),b(s,i,a),b(s,o,a)},d(s){s&&(h(e),h(t),h(n),h(i),h(o))}}}function so(l){let e,t,n;return{c(){e=K("path"),t=K("circle"),n=K("circle"),c(e,"d","M9 18V5l12-2v13"),c(t,"cx","6"),c(t,"cy","18"),c(t,"r","3"),c(n,"cx","18"),c(n,"cy","16"),c(n,"r","3")},m(i,o){b(i,e,o),b(i,t,o),b(i,n,o)},d(i){i&&(h(e),h(t),h(n))}}}function oo(l){let e,t;return{c(){e=K("rect"),t=K("polyline"),c(e,"x","2"),c(e,"y","4"),c(e,"width","20"),c(e,"height","16"),c(e,"rx","2"),c(t,"points","10 9 16 12 10 15 10 9")},m(n,i){b(n,e,i),b(n,t,i)},d(n){n&&(h(e),h(t))}}}function co(l){let e,t,n;return{c(){e=K("rect"),t=K("circle"),n=K("polyline"),c(e,"x","3"),c(e,"y","3"),c(e,"width","18"),c(e,"height","18"),c(e,"rx","2"),c(e,"ry","2"),c(t,"cx","8.5"),c(t,"cy","8.5"),c(t,"r","1.5"),c(n,"points","21 15 16 10 5 21")},m(i,o){b(i,e,o),b(i,t,o),b(i,n,o)},d(i){i&&(h(e),h(t),h(n))}}}function ro(l){let e;return{c(){e=K("path"),c(e,"d","M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z")},m(t,n){b(t,e,n)},d(t){t&&h(e)}}}function ao(l){let e;function t(o,s){return o[0]==="folder"?ro:o[0]==="image"?co:o[0]==="video"?oo:o[0]==="audio"?so:o[0]==="pdf"?io:o[0]==="document"?no:o[0]==="spreadsheet"?lo:o[0]==="presentation"?to:o[0]==="archive"?eo:o[0]==="code"?$s:o[0]==="text"?xs:Qs}let n=t(l),i=n(l);return{c(){e=K("svg"),i.c(),c(e,"width",l[1]),c(e,"height",l[1]),c(e,"viewBox","0 0 24 24"),c(e,"fill","none"),c(e,"stroke","currentColor"),c(e,"stroke-width","1.5"),c(e,"stroke-linecap","round"),c(e,"stroke-linejoin","round"),c(e,"xmlns","http://www.w3.org/2000/svg")},m(o,s){b(o,e,s),i.m(e,null)},p(o,[s]){n!==(n=t(o))&&(i.d(1),i=n(o),i&&(i.c(),i.m(e,null))),s&2&&c(e,"width",o[1]),s&2&&c(e,"height",o[1])},i:W,o:W,d(o){o&&h(e),i.d()}}}function fo(l,e,t){let{kind:n="generic"}=e,{size:i=20}=e;return l.$$set=o=>{"kind"in o&&t(0,n=o.kind),"size"in o&&t(1,i=o.size)},[n,i]}class Wn extends ot{constructor(e){super(),st(this,e,fo,ao,it,{kind:0,size:1})}}function kt(l){if(l==null||l<0)return"—";if(l===0)return"0 B";const e=["B","KB","MB","GB"],t=Math.min(Math.floor(Math.log(l)/Math.log(1024)),e.length-1),n=l/Math.pow(1024,t);return(t===0?n.toFixed(0):n.toFixed(1))+" "+e[t]}const Ot={"image/jpeg":"Изображение JPEG","image/png":"Изображение PNG","image/gif":"Изображение GIF","image/webp":"Изображение WebP","image/svg+xml":"Изображение SVG","image/bmp":"Изображение BMP","image/tiff":"Изображение TIFF","image/avif":"Изображение AVIF","application/pdf":"PDF документ","application/msword":"Документ Word","application/vnd.openxmlformats-officedocument.wordprocessingml.document":"Документ Word","application/vnd.ms-excel":"Таблица Excel","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":"Таблица Excel","application/vnd.ms-powerpoint":"Презентация PowerPoint","application/vnd.openxmlformats-officedocument.presentationml.presentation":"Презентация PowerPoint","application/zip":"ZIP архив","application/gzip":"GZIP архив","application/x-tar":"TAR архив","application/x-7z-compressed":"7z архив","application/x-rar-compressed":"RAR архив","text/plain":"Текстовый файл","text/html":"HTML файл","text/css":"CSS файл","text/javascript":"JavaScript файл","application/json":"JSON файл","application/xml":"XML файл","application/x-yaml":"YAML файл","application/octet-stream":"Бинарный файл","application/x-msdos-program":"Исполняемый файл","inode/directory":"Папка"};function ml(l){return l?Ot[l]||l:"Неизвестно"}function uo(l){if(l.type==="folder")return"Папка";const e=(l.mime||"").toLowerCase();if(Ot[e])return Ot[e];const n=(l.name||"").toLowerCase().split(".").pop();return n?n.toUpperCase():"Файл"}function Gn(l){if(l.type==="folder")return"folder";const e=(l.mime||"").toLowerCase();if(e.startsWith("image/"))return"image";if(e.startsWith("video/"))return"video";if(e.startsWith("audio/"))return"audio";if(e.startsWith("text/"))return"text";if(e.includes("pdf"))return"pdf";if(e.includes("word")||e.includes("document"))return"document";if(e.includes("spreadsheet")||e.includes("excel"))return"spreadsheet";if(e.includes("presentation")||e.includes("powerpoint"))return"presentation";if(e.includes("zip")||e.includes("tar")||e.includes("gzip")||e.includes("rar")||e.includes("7z")||e.includes("compress"))return"archive";if(e.includes("json")||e.includes("xml")||e.includes("yaml")||e.includes("javascript")||e.includes("css")||e.includes("html"))return"code";const n=(l.name||"").toLowerCase().split(".").pop();return["js","ts","jsx","tsx","vue","svelte","py","rs","go","c","cpp","h","hpp","java","kt","swift","rb","php","pl","sh","bash","zsh","fish","yml","yaml","json","xml","toml","ini","cfg","conf","md","markdown","css","scss","less","sass","sql","graphql","proto","gradle","cmake","makefile","dockerfile","env","gitignore"].includes(n)?"code":"generic"}const mo=["image/jpeg","image/png","image/gif","image/webp","image/bmp","image/tiff","image/avif","image/svg+xml"],po=["text/plain","text/html","text/css","text/javascript","application/json","application/xml","application/x-yaml","text/x-shellscript"],_o=["txt","log","conf","ini","yaml","yml","json","xml","csv","sh","py","js","ts","css","html","md","markdown","cfg"],vo=["jpg","jpeg","png","gif","webp","bmp","tiff","tif","avif","svg"];function Jn(l){const e=(l.mime||"").toLowerCase(),n=(l.name||"").toLowerCase().split(".").pop();return mo.includes(e)||vo.includes(n)}function Xn(l){const e=(l.mime||"").toLowerCase(),n=(l.name||"").toLowerCase().split(".").pop();return po.includes(e)||_o.includes(n)&&n!=="md"&&n!=="markdown"}function Zn(l){return(l.mime||"").toLowerCase().includes("pdf")}function Yn(l){const e=(l.name||"").toLowerCase();return e.endsWith(".md")||e.endsWith(".markdown")}function go(l){return Jn(l)||Zn(l)}function ho(l){return Xn(l)||Yn(l)}function bo(l){let e,t,n,i=kt(l[0].size)+"",o;return{c(){e=u("span"),e.textContent="·",t=k(),n=u("span"),o=E(i),c(e,"class","meta-sep svelte-1u905d2")},m(s,a){b(s,e,a),b(s,t,a),b(s,n,a),r(n,o)},p(s,a){a&1&&i!==(i=kt(s[0].size)+"")&&O(o,i)},d(s){s&&(h(e),h(t),h(n))}}}function ko(l){let e,t,n;return{c(){e=u("button"),e.innerHTML=' ',c(e,"class","action-btn svelte-1u905d2"),c(e,"title","Открыть папку"),c(e,"aria-label","Открыть папку")},m(i,o){b(i,e,o),t||(n=F(e,"click",Ve(l[27])),t=!0)},p:W,d(i){i&&h(e),t=!1,n()}}}function yo(l){let e,t,n,i,o;return{c(){e=u("button"),e.innerHTML=' ',t=k(),n=u("button"),n.innerHTML=' ',c(e,"class","action-btn svelte-1u905d2"),c(e,"title","Предпросмотр"),c(e,"aria-label","Предпросмотр"),c(n,"class","action-btn svelte-1u905d2"),c(n,"title","Открыть во внешней программе"),c(n,"aria-label","Открыть внешне")},m(s,a){b(s,e,a),b(s,t,a),b(s,n,a),i||(o=[F(e,"click",Ve(l[26])),F(n,"click",Ve(l[8]))],i=!0)},p:W,d(s){s&&(h(e),h(t),h(n)),i=!1,oe(o)}}}function pl(l){let e,t,n,i,o,s,a,f,d,_,g,p,v,w,C,q,T,D,N,I,A,j,S,L=l[5]&&wo(l);return{c(){e=u("div"),t=k(),n=u("div"),i=u("button"),i.innerHTML=`
+ Открыть`,o=k(),s=u("button"),s.innerHTML=`
+ Открыть во внешней программе`,a=k(),L&&L.c(),f=k(),d=u("div"),_=k(),g=u("button"),g.innerHTML=`
+ Переименовать`,p=k(),v=u("button"),v.innerHTML=`
+ Дублировать`,w=k(),C=u("button"),C.innerHTML=`
+ Вырезать`,q=k(),T=u("button"),T.innerHTML=`
+ Копировать`,D=k(),N=u("div"),I=k(),A=u("button"),A.innerHTML=`
+ Удалить`,c(e,"class","menu-backdrop svelte-1u905d2"),c(e,"role","presentation"),c(i,"class","menu-item svelte-1u905d2"),c(i,"role","menuitem"),c(s,"class","menu-item svelte-1u905d2"),c(s,"role","menuitem"),c(d,"class","menu-sep svelte-1u905d2"),c(g,"class","menu-item svelte-1u905d2"),c(g,"role","menuitem"),c(v,"class","menu-item svelte-1u905d2"),c(v,"role","menuitem"),c(C,"class","menu-item svelte-1u905d2"),c(C,"role","menuitem"),c(T,"class","menu-item svelte-1u905d2"),c(T,"role","menuitem"),c(N,"class","menu-sep svelte-1u905d2"),c(A,"class","menu-item menu-item-danger svelte-1u905d2"),c(A,"role","menuitem"),c(n,"class","menu svelte-1u905d2"),c(n,"role","menu")},m(y,M){b(y,e,M),b(y,t,M),b(y,n,M),r(n,i),r(n,o),r(n,s),r(n,a),L&&L.m(n,null),r(n,f),r(n,d),r(n,_),r(n,g),r(n,p),r(n,v),r(n,w),r(n,C),r(n,q),r(n,T),r(n,D),r(n,N),r(n,I),r(n,A),j||(S=[F(e,"click",Ve(l[17])),F(i,"click",l[15]),F(s,"click",l[8]),F(g,"click",l[11]),F(v,"click",l[12]),F(C,"click",l[13]),F(T,"click",l[14]),F(A,"click",l[10]),F(n,"click",Ve(l[25]))],j=!0)},p(y,M){y[5]&&L.p(y,M)},d(y){y&&(h(e),h(t),h(n)),L&&L.d(),j=!1,oe(S)}}}function wo(l){let e,t,n;return{c(){e=u("button"),e.innerHTML=`
+ Показать в проводнике`,c(e,"class","menu-item svelte-1u905d2"),c(e,"role","menuitem")},m(i,o){b(i,e,o),t||(n=F(e,"click",l[9]),t=!0)},p:W,d(i){i&&h(e),t=!1,n()}}}function qo(l){let e,t,n,i,o,s,a=l[0].name+"",f,d,_,g,p,v,w,C,q,T,D,N,I,A,j,S,L,y,M,z,J,Z;n=new Wn({props:{kind:l[4],size:22}});let V=!l[5]&&bo(l);function R(X,ne){return X[5]?ko:yo}let U=R(l)(l),le=l[2]&&pl(l);return{c(){e=u("div"),t=u("div"),Qe(n.$$.fragment),i=k(),o=u("div"),s=u("div"),f=E(a),_=k(),g=u("div"),p=u("span"),p.textContent=`${l[6]}`,v=k(),V&&V.c(),w=k(),C=u("div"),U.c(),q=k(),T=u("button"),D=K("svg"),N=K("circle"),I=K("circle"),A=K("circle"),j=k(),S=u("button"),S.innerHTML=' ',y=k(),le&&le.c(),M=ze(),c(t,"class","file-row-icon svelte-1u905d2"),c(s,"class","file-row-name svelte-1u905d2"),c(s,"title",d=l[0].name),c(g,"class","file-row-meta svelte-1u905d2"),c(o,"class","file-row-body svelte-1u905d2"),c(N,"cx","12"),c(N,"cy","5"),c(N,"r","2"),c(I,"cx","12"),c(I,"cy","12"),c(I,"r","2"),c(A,"cx","12"),c(A,"cy","19"),c(A,"r","2"),c(D,"width","16"),c(D,"height","16"),c(D,"viewBox","0 0 24 24"),c(D,"fill","currentColor"),c(T,"class","action-btn svelte-1u905d2"),c(T,"title","Ещё"),c(T,"aria-label","Ещё"),c(T,"aria-expanded",l[2]),c(S,"class","action-btn action-btn-danger svelte-1u905d2"),c(S,"title","Удалить"),c(S,"aria-label","Удалить"),c(C,"class","file-row-actions svelte-1u905d2"),c(e,"class","file-row svelte-1u905d2"),c(e,"role","button"),c(e,"tabindex","0"),c(e,"draggable","true"),c(e,"aria-label",L=l[5]?`Папка ${l[0].name}`:`Файл ${l[0].name}`),bt(e,"file-row--selected",l[1])},m(X,ne){b(X,e,ne),r(e,t),Ge(n,t,null),r(e,i),r(e,o),r(o,s),r(s,f),r(o,_),r(o,g),r(g,p),r(g,v),V&&V.m(g,null),r(e,w),r(e,C),U.m(C,null),r(C,q),r(C,T),r(T,D),r(D,N),r(D,I),r(D,A),r(C,j),r(C,S),b(X,y,ne),le&&le.m(X,ne),b(X,M,ne),z=!0,J||(Z=[F(window,"click",l[17]),F(T,"click",Ve(l[16])),F(S,"click",Ve(l[10])),F(e,"click",l[7]),F(e,"contextmenu",l[21]),F(e,"dragstart",l[18]),F(e,"dragover",l[19]),F(e,"drop",l[20])],J=!0)},p(X,[ne]){(!z||ne&1)&&a!==(a=X[0].name+"")&&O(f,a),(!z||ne&1&&d!==(d=X[0].name))&&c(s,"title",d),X[5]||V.p(X,ne),U.p(X,ne),(!z||ne&4)&&c(T,"aria-expanded",X[2]),(!z||ne&1&&L!==(L=X[5]?`Папка ${X[0].name}`:`Файл ${X[0].name}`))&&c(e,"aria-label",L),(!z||ne&2)&&bt(e,"file-row--selected",X[1]),X[2]?le?le.p(X,ne):(le=pl(X),le.c(),le.m(M.parentNode,M)):le&&(le.d(1),le=null)},i(X){z||(ae(n.$$.fragment,X),z=!0)},o(X){de(n.$$.fragment,X),z=!1},d(X){X&&(h(e),h(y),h(M)),Je(n),V&&V.d(),U.d(),le&&le.d(X),J=!1,oe(Z)}}}function Co(l,e,t){let{item:n}=e,{selected:i=!1}=e,{onDragStart:o}=e,{onDragOver:s}=e,{onDrop:a}=e;const f=yt(),d=Gn(n),_=n.type==="folder",g=uo(n);let p=!1,v=null;function w(B){B.ctrlKey||B.metaKey?f("toggleSelect",n.id):B.shiftKey?f("rangeSelect",n.id):v?(clearTimeout(v),v=null,_?f("navigate",n.id):f("preview",n)):v=setTimeout(()=>{v=null,f("selectOne",n.id)},250)}function C(){f("openExternal",n.fileId)}function q(){f("showInFolder",n.id)}function T(){t(2,p=!1),f("delete",{id:n.id,type:n.type})}function D(){t(2,p=!1),f("rename",{id:n.id,name:n.name})}function N(){t(2,p=!1),f("duplicate",n.id)}function I(){t(2,p=!1),f("cut",n.id)}function A(){t(2,p=!1),f("copy",n.id)}function j(){t(2,p=!1),_?f("navigate",n.id):f("preview",n)}function S(){t(2,p=!p)}function L(){t(2,p=!1)}function y(B){o&&o(B,n.id)}function M(B){s&&_&&s(B,n.id)}function z(B){a&&_&&a(B,n.id)}function J(B){B.preventDefault(),t(2,p=!0)}function Z(B){Rs.call(this,l,B)}const V=()=>f("preview",n),R=()=>f("navigate",n.id);return l.$$set=B=>{"item"in B&&t(0,n=B.item),"selected"in B&&t(1,i=B.selected),"onDragStart"in B&&t(22,o=B.onDragStart),"onDragOver"in B&&t(23,s=B.onDragOver),"onDrop"in B&&t(24,a=B.onDrop)},[n,i,p,f,d,_,g,w,C,q,T,D,N,I,A,j,S,L,y,M,z,J,o,s,a,Z,V,R]}class To extends ot{constructor(e){super(),st(this,e,Co,qo,it,{item:0,selected:1,onDragStart:22,onDragOver:23,onDrop:24})}}function _l(l,e,t){const n=l.slice();return n[4]=e[t],n[6]=t,n}function So(l){let e;return{c(){e=u("span"),e.textContent="/",c(e,"class","sep svelte-csi2lb")},m(t,n){b(t,e,n)},d(t){t&&h(e)}}}function Mo(l){let e,t=l[4].name+"",n,i,o;function s(){return l[2](l[6])}return{c(){e=u("button"),n=E(t),c(e,"class","crumb crumb--link svelte-csi2lb")},m(a,f){b(a,e,f),r(e,n),i||(o=F(e,"click",s),i=!0)},p(a,f){l=a,f&1&&t!==(t=l[4].name+"")&&O(n,t)},d(a){a&&h(e),i=!1,o()}}}function Lo(l){let e,t=l[4].name+"",n;return{c(){e=u("span"),n=E(t),c(e,"class","crumb crumb--current svelte-csi2lb")},m(i,o){b(i,e,o),r(e,n)},p(i,o){o&1&&t!==(t=i[4].name+"")&&O(n,t)},d(i){i&&h(e)}}}function vl(l){let e,t,n=l[6]>0&&So();function i(a,f){return a[6]===a[0].length-1?Lo:Mo}let o=i(l),s=o(l);return{c(){n&&n.c(),e=k(),s.c(),t=ze()},m(a,f){n&&n.m(a,f),b(a,e,f),s.m(a,f),b(a,t,f)},p(a,f){o===(o=i(a))&&s?s.p(a,f):(s.d(1),s=o(a),s&&(s.c(),s.m(t.parentNode,t)))},d(a){a&&(h(e),h(t)),n&&n.d(a),s.d(a)}}}function Io(l){let e,t=Y(l[0]),n=[];for(let i=0;io(a);return l.$$set=a=>{"crumbs"in a&&t(0,n=a.crumbs)},[n,o,s]}class Qn extends ot{constructor(e){super(),st(this,e,Do,Io,it,{crumbs:0})}}function No(l){let e,t,n,i,o,s;return{c(){e=u("div"),t=u("p"),t.textContent="Предпросмотр недоступен для этого типа файлов.",n=k(),i=u("button"),i.textContent="Открыть во внешней программе",c(i,"class","btn btn-sm svelte-1cw3u0m"),c(e,"class","preview-status svelte-1cw3u0m")},m(a,f){b(a,e,f),r(e,t),r(e,n),r(e,i),o||(s=F(i,"click",l[9]),o=!0)},p:W,d(a){a&&h(e),o=!1,s()}}}function Ao(l){let e,t;function n(s,a){return a&2&&(e=null),e==null&&(e=!!(s[1]&&s[1].startsWith("data:"))),e?Oo:Bo}let i=n(l,-1),o=i(l);return{c(){o.c(),t=ze()},m(s,a){o.m(s,a),b(s,t,a)},p(s,a){i===(i=n(s,a))&&o?o.p(s,a):(o.d(1),o=i(s),o&&(o.c(),o.m(t.parentNode,t)))},d(s){s&&h(t),o.d(s)}}}function Eo(l){let e,t,n;return{c(){e=u("pre"),t=u("code"),n=E(l[1]),c(e,"class","preview-text svelte-1cw3u0m")},m(i,o){b(i,e,o),r(e,t),r(t,n)},p(i,o){o&2&&O(n,i[1])},d(i){i&&h(e)}}}function Fo(l){let e,t,n,i;return{c(){e=u("div"),t=u("img"),gt(t.src,n=l[1])||c(t,"src",n),c(t,"alt",i=l[0].name),c(t,"class","preview-image svelte-1cw3u0m"),c(e,"class","preview-image-container svelte-1cw3u0m")},m(o,s){b(o,e,s),r(e,t)},p(o,s){s&2&&!gt(t.src,n=o[1])&&c(t,"src",n),s&1&&i!==(i=o[0].name)&&c(t,"alt",i)},d(o){o&&h(e)}}}function Ho(l){let e,t,n,i,o,s,a;return{c(){e=u("div"),t=u("p"),n=E(l[3]),i=k(),o=u("button"),o.textContent="Открыть во внешней программе",c(o,"class","btn btn-sm svelte-1cw3u0m"),c(e,"class","preview-status svelte-1cw3u0m")},m(f,d){b(f,e,d),r(e,t),r(t,n),r(e,i),r(e,o),s||(a=F(o,"click",l[9]),s=!0)},p(f,d){d&8&&O(n,f[3])},d(f){f&&h(e),s=!1,a()}}}function jo(l){let e;return{c(){e=u("div"),e.innerHTML="Загрузка...
",c(e,"class","preview-status svelte-1cw3u0m")},m(t,n){b(t,e,n)},p:W,d(t){t&&h(e)}}}function Bo(l){let e,t,n,i,o,s;return{c(){e=u("div"),t=u("p"),t.textContent="Предпросмотр PDF недоступен.",n=k(),i=u("button"),i.textContent="Открыть во внешней программе",c(i,"class","btn btn-sm svelte-1cw3u0m"),c(e,"class","preview-status svelte-1cw3u0m")},m(a,f){b(a,e,f),r(e,t),r(e,n),r(e,i),o||(s=F(i,"click",l[9]),o=!0)},p:W,d(a){a&&h(e),o=!1,s()}}}function Oo(l){let e,t,n;return{c(){e=u("div"),t=u("embed"),gt(t.src,n=l[1])||c(t,"src",n),c(t,"type","application/pdf"),c(t,"class","preview-pdf svelte-1cw3u0m"),c(e,"class","preview-pdf-container svelte-1cw3u0m")},m(i,o){b(i,e,o),r(e,t)},p(i,o){o&2&&!gt(t.src,n=i[1])&&c(t,"src",n)},d(i){i&&h(e)}}}function Po(l){let e,t,n,i,o,s,a,f=l[0].name+"",d,_,g,p,v=kt(l[0].size)+"",w,C,q=ml(l[0].mime)+"",T,D,N,I,A,j,S,L,y,M,z,J;o=new Wn({props:{kind:l[8],size:18}});function Z(B,U){return B[2]?jo:B[3]?Ho:B[6]&&B[1]?Fo:B[5]&&B[1]?Eo:B[4]?Ao:No}let V=Z(l),R=V(l);return{c(){e=u("div"),t=u("div"),n=u("header"),i=u("div"),Qe(o.$$.fragment),s=k(),a=u("span"),d=E(f),g=k(),p=u("div"),w=E(v),C=E(" · "),T=E(q),D=k(),N=u("div"),I=u("button"),I.innerHTML=' ',A=k(),j=u("button"),j.innerHTML=' ',S=k(),L=u("div"),R.c(),c(a,"class","preview-name svelte-1cw3u0m"),c(a,"title",_=l[0].name),c(i,"class","preview-title svelte-1cw3u0m"),c(p,"class","preview-meta svelte-1cw3u0m"),c(I,"class","action-btn svelte-1cw3u0m"),c(I,"title","Открыть во внешней программе"),c(I,"aria-label","Открыть внешне"),c(j,"class","action-btn action-btn-close svelte-1cw3u0m"),c(j,"title","Close"),c(j,"aria-label","Close preview"),c(N,"class","preview-actions svelte-1cw3u0m"),c(n,"class","preview-header svelte-1cw3u0m"),c(L,"class","preview-body svelte-1cw3u0m"),c(t,"class","modal svelte-1cw3u0m"),c(e,"class","overlay svelte-1cw3u0m"),c(e,"role","dialog"),c(e,"aria-modal","true"),c(e,"aria-label",y=`Preview: ${l[0].name}`)},m(B,U){b(B,e,U),r(e,t),r(t,n),r(n,i),Ge(o,i,null),r(i,s),r(i,a),r(a,d),r(n,g),r(n,p),r(p,w),r(p,C),r(p,T),r(n,D),r(n,N),r(N,I),r(N,A),r(N,j),r(t,S),r(t,L),R.m(L,null),M=!0,z||(J=[F(I,"click",l[9]),F(j,"click",l[10]),F(e,"click",Ye(l[11]))],z=!0)},p(B,[U]){(!M||U&1)&&f!==(f=B[0].name+"")&&O(d,f),(!M||U&1&&_!==(_=B[0].name))&&c(a,"title",_),(!M||U&1)&&v!==(v=kt(B[0].size)+"")&&O(w,v),(!M||U&1)&&q!==(q=ml(B[0].mime)+"")&&O(T,q),V===(V=Z(B))&&R?R.p(B,U):(R.d(1),R=V(B),R&&(R.c(),R.m(L,null))),(!M||U&1&&y!==(y=`Preview: ${B[0].name}`))&&c(e,"aria-label",y)},i(B){M||(ae(o.$$.fragment,B),M=!0)},o(B){de(o.$$.fragment,B),M=!1},d(B){B&&h(e),Je(o),R.d(),z=!1,oe(J)}}}function zo(l,e,t){let n,i,o,{item:s}=e,{content:a=""}=e,{loading:f=!1}=e,{error:d=""}=e;const _=yt(),g=Gn(s);function p(q){q.key==="Escape"&&_("close")}function v(){_("openExternal",s.fileId)}Rn(()=>{window.addEventListener("keydown",p)}),Kn(()=>{window.removeEventListener("keydown",p)});const w=()=>_("close"),C=()=>_("close");return l.$$set=q=>{"item"in q&&t(0,s=q.item),"content"in q&&t(1,a=q.content),"loading"in q&&t(2,f=q.loading),"error"in q&&t(3,d=q.error)},l.$$.update=()=>{l.$$.dirty&3&&t(6,n=Jn(s)&&a&&a.startsWith("data:")),l.$$.dirty&1&&t(5,i=Xn(s)||Yn(s)),l.$$.dirty&1&&t(4,o=Zn(s))},[s,a,f,d,o,i,n,_,g,v,w,C]}class Vo extends ot{constructor(e){super(),st(this,e,zo,Po,it,{item:0,content:1,loading:2,error:3})}}function Ro(l){let e,t,n,i,o,s,a,f,d,_,g,p,v,w,C,q,T;return{c(){e=u("div"),t=u("div"),n=u("h3"),i=E(l[0]),o=k(),s=u("p"),a=E(l[1]),f=k(),d=u("div"),_=u("button"),g=E(l[2]),v=k(),w=u("button"),C=E(l[3]),c(n,"class","svelte-1fv6yyk"),c(s,"class","message svelte-1fv6yyk"),c(_,"class",p="btn "+(l[4]?"btn-danger":"btn-primary")+" svelte-1fv6yyk"),c(w,"class","btn svelte-1fv6yyk"),c(d,"class","actions svelte-1fv6yyk"),c(t,"class","modal svelte-1fv6yyk"),c(e,"class","overlay svelte-1fv6yyk"),c(e,"role","dialog"),c(e,"aria-modal","true"),c(e,"aria-label",l[0])},m(D,N){b(D,e,N),r(e,t),r(t,n),r(n,i),r(t,o),r(t,s),r(s,a),r(t,f),r(t,d),r(d,_),r(_,g),r(d,v),r(d,w),r(w,C),q||(T=[F(_,"click",l[6]),F(w,"click",l[7]),F(e,"click",Ye(l[8]))],q=!0)},p(D,[N]){N&1&&O(i,D[0]),N&2&&O(a,D[1]),N&4&&O(g,D[2]),N&16&&p!==(p="btn "+(D[4]?"btn-danger":"btn-primary")+" svelte-1fv6yyk")&&c(_,"class",p),N&8&&O(C,D[3]),N&1&&c(e,"aria-label",D[0])},i:W,o:W,d(D){D&&h(e),q=!1,oe(T)}}}function Ko(l,e,t){let{title:n="Подтверждение"}=e,{message:i=""}=e,{confirmText:o="Удалить"}=e,{cancelText:s="Отмена"}=e,{danger:a=!1}=e;const f=yt(),d=()=>f("confirm"),_=()=>f("cancel"),g=()=>f("cancel");return l.$$set=p=>{"title"in p&&t(0,n=p.title),"message"in p&&t(1,i=p.message),"confirmText"in p&&t(2,o=p.confirmText),"cancelText"in p&&t(3,s=p.cancelText),"danger"in p&&t(4,a=p.danger)},[n,i,o,s,a,f,d,_,g]}class Uo extends ot{constructor(e){super(),st(this,e,Ko,Ro,it,{title:0,message:1,confirmText:2,cancelText:3,danger:4})}}function gl(l,e,t){const n=l.slice();return n[201]=e[t],n}function hl(l,e,t){const n=l.slice();return n[204]=e[t],n}function bl(l,e,t){const n=l.slice();return n[207]=e[t],n}function kl(l,e,t){const n=l.slice();return n[226]=e[t],n}function yl(l,e,t){const n=l.slice();return n[226]=e[t],n}function wl(l,e,t){const n=l.slice();return n[234]=e[t],n}function ql(l,e,t){const n=l.slice();return n[226]=e[t],n}function Cl(l,e,t){const n=l.slice();return n[226]=e[t],n}function Tl(l,e,t){const n=l.slice();return n[210]=e[t],n}function Sl(l,e,t){const n=l.slice();return n[221]=e[t],n}function Ml(l,e,t){const n=l.slice();return n[218]=e[t],n}function Ll(l,e,t){const n=l.slice();return n[213]=e[t],n}function Il(l,e,t){const n=l.slice();return n[210]=e[t],n}function Dl(l,e,t){const n=l.slice();return n[213]=e[t],n}function Nl(l,e,t){const n=l.slice();return n[229]=e[t],n}function Al(l,e,t){const n=l.slice();return n[207]=e[t],n}function El(l,e,t){const n=l.slice();return n[243]=e[t],n}function Fl(l,e,t){const n=l.slice();return n[246]=e[t],n}function Hl(l){let e,t=l[246].label+"",n,i,o,s,a;function f(){return l[114](l[246])}return{c(){e=u("button"),n=E(t),i=k(),c(e,"class",o="nav-item "+(l[7]===l[246].id?"selected":"")+" svelte-1qo7cgm")},m(d,_){b(d,e,_),r(e,n),r(e,i),s||(a=F(e,"click",f),s=!0)},p(d,_){l=d,_[0]&1&&t!==(t=l[246].label+"")&&O(n,t),_[0]&129&&o!==(o="nav-item "+(l[7]===l[246].id?"selected":"")+" svelte-1qo7cgm")&&c(e,"class",o)},d(d){d&&h(e),s=!1,a()}}}function jl(l){let e,t,n,i,o,s=l[1].length>0&&Bl(l),a=Y(l[1]),f=[];for(let _=0;_0?s?s.p(_,g):(s=Bl(_),s.c(),s.m(t,null)):s&&(s.d(1),s=null),g[0]&258|g[1]&536870912){a=Y(_[1]);let p;for(p=0;p0&&Rl(l);return{c(){e=u("button"),t=K("svg"),n=K("polyline"),i=K("polyline"),o=K("path"),s=k(),d&&d.c(),c(n,"points","23 4 23 10 17 10"),c(n,"class","svelte-1qo7cgm"),c(i,"points","1 20 1 14 7 14"),c(i,"class","svelte-1qo7cgm"),c(o,"d","M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15"),c(o,"class","svelte-1qo7cgm"),c(t,"width","16"),c(t,"height","16"),c(t,"viewBox","0 0 24 24"),c(t,"fill","none"),c(t,"stroke","currentColor"),c(t,"stroke-width","2"),c(t,"stroke-linecap","round"),c(t,"stroke-linejoin","round"),c(t,"class","svelte-1qo7cgm"),c(e,"class","header-sync-btn svelte-1qo7cgm"),e.disabled=l[51],c(e,"title","Синхронизировать")},m(_,g){b(_,e,g),r(e,t),r(t,n),r(t,i),r(t,o),r(e,s),d&&d.m(e,null),a||(f=F(e,"click",l[113]),a=!0)},p(_,g){_[50].unpushedOps>0?d?d.p(_,g):(d=Rl(_),d.c(),d.m(e,null)):d&&(d.d(1),d=null),g[1]&1048576&&(e.disabled=_[51])},d(_){_&&h(e),d&&d.d(),a=!1,f()}}}function Rl(l){let e,t=l[50].unpushedOps+"",n;return{c(){e=u("span"),n=E(t),c(e,"class","sync-badge svelte-1qo7cgm")},m(i,o){b(i,e,o),r(e,n)},p(i,o){o[1]&524288&&t!==(t=i[50].unpushedOps+"")&&O(n,t)},d(i){i&&h(e)}}}function Kl(l){let e,t,n,i,o,s;return{c(){e=u("div"),t=E(l[6]),n=k(),i=u("button"),i.innerHTML=' ',c(i,"class","dismiss-btn svelte-1qo7cgm"),c(i,"aria-label","Dismiss"),c(e,"class","error-banner svelte-1qo7cgm")},m(a,f){b(a,e,f),r(e,t),r(e,n),r(e,i),o||(s=[F(i,"click",Ve(l[116])),F(e,"click",l[117])],o=!0)},p(a,f){f[0]&64&&O(t,a[6])},d(a){a&&h(e),o=!1,oe(s)}}}function Xo(l){let e,t,n;function i(a,f){if(a[27])return tc;if(a[0].length>0)return ec;if(a[6])return $o}let o=i(l),s=o&&o(l);return{c(){e=u("div"),t=u("h2"),t.textContent="Верстак",n=k(),s&&s.c(),c(t,"class","svelte-1qo7cgm"),c(e,"class","welcome svelte-1qo7cgm")},m(a,f){b(a,e,f),r(e,t),r(e,n),s&&s.m(e,null)},p(a,f){o===(o=i(a))&&s?s.p(a,f):(s&&s.d(1),s=o&&o(a),s&&(s.c(),s.m(e,null)))},i:W,o:W,d(a){a&&h(e),s&&s.d()}}}function Zo(l){let e,t,n;function i(a,f){return a[3].length===0?nc:lc}let o=i(l),s=o(l);return{c(){e=u("div"),t=u("div"),t.innerHTML='Активность ',n=k(),s.c(),c(t,"class","activity-feed-header svelte-1qo7cgm"),c(e,"class","activity-feed svelte-1qo7cgm")},m(a,f){b(a,e,f),r(e,t),r(e,n),s.m(e,null)},p(a,f){o===(o=i(a))&&s?s.p(a,f):(s.d(1),s=o(a),s&&(s.c(),s.m(e,null)))},i:W,o:W,d(a){a&&h(e),s.d()}}}function Yo(l){let e,t,n,i,o,s=l[2].date+"",a,f,d,_=l[2].summary&&Gl(l);function g(w,C){return w[2].groups&&w[2].groups.length>0?sc:ic}let p=g(l),v=p(l);return{c(){e=u("div"),t=u("div"),n=u("h2"),n.textContent="Сегодня",i=k(),o=u("span"),a=E(s),f=k(),_&&_.c(),d=k(),v.c(),c(n,"class","svelte-1qo7cgm"),c(o,"class","today-date svelte-1qo7cgm"),c(t,"class","today-header svelte-1qo7cgm"),c(e,"class","today-dashboard svelte-1qo7cgm")},m(w,C){b(w,e,C),r(e,t),r(t,n),r(t,i),r(t,o),r(o,a),r(e,f),_&&_.m(e,null),r(e,d),v.m(e,null)},p(w,C){C[0]&4&&s!==(s=w[2].date+"")&&O(a,s),w[2].summary?_?_.p(w,C):(_=Gl(w),_.c(),_.m(e,d)):_&&(_.d(1),_=null),p===(p=g(w))&&v?v.p(w,C):(v.d(1),v=p(w),v&&(v.c(),v.m(e,null)))},i:W,o:W,d(w){w&&h(e),_&&_.d(),v.d()}}}function Qo(l){let e,t,n,i,o,s,a=Y(l[58]),f=[];for(let p=0;p{_[w]=null}),Ke()),~i?(o=_[i],o?o.p(p,v):(o=_[i]=d[i](p),o.c()),ae(o,1),o.m(n,null)):o=null)},i(p){s||(ae(o),s=!0)},o(p){de(o),s=!1},d(p){p&&(h(e),h(t),h(n)),Ce(f,p),~i&&_[i].d()}}}function xo(l){let e,t,n,i=l[11].title+"",o,s,a,f,d,_,g,p,v,w,C,q=l[11].dirty&&hn();return{c(){e=u("div"),t=u("div"),n=u("span"),o=E(i),s=k(),q&&q.c(),a=k(),f=u("div"),d=u("button"),d.textContent="Сохранить",_=k(),g=u("button"),g.textContent="Закрыть",p=k(),v=u("textarea"),c(n,"class","note-title svelte-1qo7cgm"),c(d,"class","btn btn-primary svelte-1qo7cgm"),c(g,"class","btn svelte-1qo7cgm"),c(f,"class","note-editor-actions svelte-1qo7cgm"),c(t,"class","note-editor-header svelte-1qo7cgm"),c(v,"class","note-textarea svelte-1qo7cgm"),c(v,"placeholder","Начните писать..."),c(e,"class","note-editor svelte-1qo7cgm")},m(T,D){b(T,e,D),r(e,t),r(t,n),r(n,o),r(t,s),q&&q.m(t,null),r(t,a),r(t,f),r(f,d),r(f,_),r(f,g),r(e,p),r(e,v),se(v,l[11].content),w||(C=[F(d,"click",l[93]),F(g,"click",l[91]),F(v,"input",l[118]),F(v,"input",l[92])],w=!0)},p(T,D){D[0]&2048&&i!==(i=T[11].title+"")&&O(o,i),T[11].dirty?q||(q=hn(),q.c(),q.m(t,a)):q&&(q.d(1),q=null),D[0]&2048&&se(v,T[11].content)},i:W,o:W,d(T){T&&h(e),q&&q.d(),w=!1,oe(C)}}}function $o(l){let e,t,n;return{c(){e=u("p"),t=E("Ошибка: "),n=E(l[6]),c(e,"class","error-text svelte-1qo7cgm")},m(i,o){b(i,e,o),r(e,t),r(e,n)},p(i,o){o[0]&64&&O(n,i[6])},d(i){i&&h(e)}}}function ec(l){let e,t,n;return{c(){e=u("p"),e.textContent="Выберите раздел в боковой панели.",t=k(),n=u("p"),n.textContent="Или создайте новое дело кнопкой «+».",c(e,"class","svelte-1qo7cgm"),c(n,"class","hint svelte-1qo7cgm")},m(i,o){b(i,e,o),b(i,t,o),b(i,n,o)},p:W,d(i){i&&(h(e),h(t),h(n))}}}function tc(l){let e;return{c(){e=u("p"),e.textContent="Загрузка...",c(e,"class","svelte-1qo7cgm")},m(t,n){b(t,e,n)},p:W,d(t){t&&h(e)}}}function lc(l){let e,t=Y(l[3]),n=[];for(let i=0;iАктивность пока не зафиксирована
',c(e,"class","empty-state svelte-1qo7cgm")},m(t,n){b(t,e,n)},p:W,d(t){t&&h(e)}}}function Ul(l){let e,t=l[226].targetType+"",n;return{c(){e=u("span"),n=E(t),c(e,"class","activity-feed-target svelte-1qo7cgm")},m(i,o){b(i,e,o),r(e,n)},p(i,o){o[0]&8&&t!==(t=i[226].targetType+"")&&O(n,t)},d(i){i&&h(e)}}}function Wl(l){let e,t,n=nt(l[226].eventType)+"",i,o,s,a,f=l[226].title+"",d,_,g,p,v=Ue(l[226].eventType)+"",w,C,q,T,D=Be(l[226].createdAt)+"",N,I,A=je(l[226].createdAt)+"",j,S,L,y,M=l[226].targetType&&Ul(l);function z(){return l[151](l[226])}function J(...Z){return l[152](l[226],...Z)}return{c(){e=u("div"),t=u("span"),i=E(n),o=k(),s=u("div"),a=u("span"),d=E(f),_=k(),g=u("div"),p=u("span"),w=E(v),C=k(),M&&M.c(),q=k(),T=u("span"),N=E(D),I=k(),j=E(A),S=k(),c(t,"class","activity-feed-icon svelte-1qo7cgm"),c(a,"class","activity-feed-title svelte-1qo7cgm"),c(p,"class","activity-feed-type svelte-1qo7cgm"),c(T,"class","activity-feed-time svelte-1qo7cgm"),c(g,"class","activity-feed-meta svelte-1qo7cgm"),c(s,"class","activity-feed-body svelte-1qo7cgm"),c(e,"class","activity-feed-event svelte-1qo7cgm"),c(e,"role","button"),c(e,"tabindex","0")},m(Z,V){b(Z,e,V),r(e,t),r(t,i),r(e,o),r(e,s),r(s,a),r(a,d),r(s,_),r(s,g),r(g,p),r(p,w),r(g,C),M&&M.m(g,null),r(g,q),r(g,T),r(T,N),r(T,I),r(T,j),r(e,S),L||(y=[F(e,"click",z),F(e,"keydown",J)],L=!0)},p(Z,V){l=Z,V[0]&8&&n!==(n=nt(l[226].eventType)+"")&&O(i,n),V[0]&8&&f!==(f=l[226].title+"")&&O(d,f),V[0]&8&&v!==(v=Ue(l[226].eventType)+"")&&O(w,v),l[226].targetType?M?M.p(l,V):(M=Ul(l),M.c(),M.m(g,q)):M&&(M.d(1),M=null),V[0]&8&&D!==(D=Be(l[226].createdAt)+"")&&O(N,D),V[0]&8&&A!==(A=je(l[226].createdAt)+"")&&O(j,A)},d(Z){Z&&h(e),M&&M.d(),L=!1,oe(y)}}}function Gl(l){let e,t,n,i=l[2].summary.changedCases>0&&Jl(l),o=l[2].summary.notes>0&&Xl(l),s=l[2].summary.files>0&&Zl(l);return{c(){e=u("div"),i&&i.c(),t=k(),o&&o.c(),n=k(),s&&s.c(),c(e,"class","today-summary svelte-1qo7cgm")},m(a,f){b(a,e,f),i&&i.m(e,null),r(e,t),o&&o.m(e,null),r(e,n),s&&s.m(e,null)},p(a,f){a[2].summary.changedCases>0?i?i.p(a,f):(i=Jl(a),i.c(),i.m(e,t)):i&&(i.d(1),i=null),a[2].summary.notes>0?o?o.p(a,f):(o=Xl(a),o.c(),o.m(e,n)):o&&(o.d(1),o=null),a[2].summary.files>0?s?s.p(a,f):(s=Zl(a),s.c(),s.m(e,null)):s&&(s.d(1),s=null)},d(a){a&&h(e),i&&i.d(),o&&o.d(),s&&s.d()}}}function Jl(l){let e,t=l[2].summary.changedCases+"",n,i,o=We(l[2].summary.changedCases,"дело","дела","дел")+"",s;return{c(){e=u("span"),n=E(t),i=k(),s=E(o),c(e,"class","summary-chip svelte-1qo7cgm")},m(a,f){b(a,e,f),r(e,n),r(e,i),r(e,s)},p(a,f){f[0]&4&&t!==(t=a[2].summary.changedCases+"")&&O(n,t),f[0]&4&&o!==(o=We(a[2].summary.changedCases,"дело","дела","дел")+"")&&O(s,o)},d(a){a&&h(e)}}}function Xl(l){let e,t=l[2].summary.notes+"",n,i,o=We(l[2].summary.notes,"заметка","заметки","заметок")+"",s;return{c(){e=u("span"),n=E(t),i=k(),s=E(o),c(e,"class","summary-chip svelte-1qo7cgm")},m(a,f){b(a,e,f),r(e,n),r(e,i),r(e,s)},p(a,f){f[0]&4&&t!==(t=a[2].summary.notes+"")&&O(n,t),f[0]&4&&o!==(o=We(a[2].summary.notes,"заметка","заметки","заметок")+"")&&O(s,o)},d(a){a&&h(e)}}}function Zl(l){let e,t=l[2].summary.files+"",n,i,o=We(l[2].summary.files,"файл","файла","файлов")+"",s;return{c(){e=u("span"),n=E(t),i=k(),s=E(o),c(e,"class","summary-chip svelte-1qo7cgm")},m(a,f){b(a,e,f),r(e,n),r(e,i),r(e,s)},p(a,f){f[0]&4&&t!==(t=a[2].summary.files+"")&&O(n,t),f[0]&4&&o!==(o=We(a[2].summary.files,"файл","файла","файлов")+"")&&O(s,o)},d(a){a&&h(e)}}}function ic(l){let e;return{c(){e=u("div"),e.innerHTML='Сегодня пока тихо
Здесь появятся дела, заметки, файлы и действия, с которыми вы работали сегодня.
',c(e,"class","today-empty svelte-1qo7cgm")},m(t,n){b(t,e,n)},p:W,d(t){t&&h(e)}}}function sc(l){let e,t,n=Y(l[2].groups),i=[];for(let s=0;s0&&en(l);return{c(){for(let s=0;s0?o?o.p(s,a):(o=en(s),o.c(),o.m(t.parentNode,t)):o&&(o.d(1),o=null)},d(s){s&&(h(e),h(t)),Ce(i,s),o&&o.d(s)}}}function Yl(l){let e,t=l[234].events.length+"",n,i,o=We(l[234].events.length,"событие","события","событий")+"",s;return{c(){e=u("span"),n=E(t),i=k(),s=E(o),c(e,"class","today-case-count svelte-1qo7cgm")},m(a,f){b(a,e,f),r(e,n),r(e,i),r(e,s)},p(a,f){f[0]&4&&t!==(t=a[234].events.length+"")&&O(n,t),f[0]&4&&o!==(o=We(a[234].events.length,"событие","события","событий")+"")&&O(s,o)},d(a){a&&h(e)}}}function oc(l){let e;return{c(){e=u("div"),e.textContent="Изменён сегодня",c(e,"class","today-events-empty svelte-1qo7cgm")},m(t,n){b(t,e,n)},p:W,d(t){t&&h(e)}}}function cc(l){let e,t=Y(l[234].events),n=[];for(let i=0;i0?cc:oc}let j=A(l),S=j(l);return{c(){e=u("div"),t=u("div"),n=u("span"),o=E(i),s=k(),a=u("span"),d=E(f),_=k(),D&&D.c(),g=k(),p=u("span"),w=E(v),C=k(),S.c(),c(n,"class","today-case-title svelte-1qo7cgm"),c(a,"class","today-case-type svelte-1qo7cgm"),c(p,"class","today-case-time svelte-1qo7cgm"),c(t,"class","today-case-header svelte-1qo7cgm"),c(t,"role","button"),c(t,"tabindex","0"),c(e,"class","today-case svelte-1qo7cgm")},m(L,y){b(L,e,y),r(e,t),r(t,n),r(n,o),r(t,s),r(t,a),r(a,d),r(t,_),D&&D.m(t,null),r(t,g),r(t,p),r(p,w),r(e,C),S.m(e,null),q||(T=[F(t,"click",N),F(t,"keydown",I)],q=!0)},p(L,y){l=L,y[0]&4&&i!==(i=l[234].nodeTitle+"")&&O(o,i),y[0]&4&&f!==(f=On(l[234].nodeKind)+"")&&O(d,f),l[234].events?D?D.p(l,y):(D=Yl(l),D.c(),D.m(t,g)):D&&(D.d(1),D=null),y[0]&4&&v!==(v=je(l[234].lastActivityAt)+"")&&O(w,v),j===(j=A(l))&&S?S.p(l,y):(S.d(1),S=j(l),S&&(S.c(),S.m(e,null)))},d(L){L&&h(e),D&&D.d(),S.d(),q=!1,oe(T)}}}function en(l){let e,t,n,i=Y(l[2].events),o=[];for(let s=0;s0&&rn(l);const A=[yc,kc],j=[];function S(M,z){return M[31]?0:1}p=S(l),v=j[p]=A[p](l);let L=l[28]&&!l[30]&&fn(),y=l[35]&&un(l);return{c(){e=u("div"),t=u("div"),n=u("button"),i=E("+ Добавить файл"),o=k(),s=u("button"),a=E("+ Добавить папку"),f=k(),d=u("button"),d.textContent="+ Новый файл",_=k(),I&&I.c(),g=k(),v.c(),w=k(),L&&L.c(),C=k(),y&&y.c(),q=ze(),c(n,"class","btn btn-primary svelte-1qo7cgm"),n.disabled=l[28],c(s,"class","btn svelte-1qo7cgm"),s.disabled=l[28],c(d,"class","btn svelte-1qo7cgm"),c(t,"class","tab-toolbar svelte-1qo7cgm"),c(e,"class","files-tab svelte-1qo7cgm")},m(M,z){b(M,e,z),r(e,t),r(t,n),r(n,i),r(t,o),r(t,s),r(s,a),r(t,f),r(t,d),r(t,_),I&&I.m(t,null),r(e,g),j[p].m(e,null),r(e,w),L&&L.m(e,null),b(M,C,z),y&&y.m(M,z),b(M,q,z),T=!0,D||(N=[F(n,"click",l[95]),F(s,"click",l[96]),F(d,"click",l[67])],D=!0)},p(M,z){(!T||z[0]&268435456)&&(n.disabled=M[28]),(!T||z[0]&268435456)&&(s.disabled=M[28]),M[39].items.length>0?I?I.p(M,z):(I=rn(M),I.c(),I.m(t,null)):I&&(I.d(1),I=null);let J=p;p=S(M),p===J?j[p].p(M,z):(Re(),de(j[J],1,1,()=>{j[J]=null}),Ke(),v=j[p],v?v.p(M,z):(v=j[p]=A[p](M),v.c()),ae(v,1),v.m(e,w)),M[28]&&!M[30]?L||(L=fn(),L.c(),L.m(e,null)):L&&(L.d(1),L=null),M[35]?y?(y.p(M,z),z[1]&16&&ae(y,1)):(y=un(M),y.c(),ae(y,1),y.m(q.parentNode,q)):y&&(Re(),de(y,1,1,()=>{y=null}),Ke())},i(M){T||(ae(v),ae(y),T=!0)},o(M){de(v),de(y),T=!1},d(M){M&&(h(e),h(C),h(q)),I&&I.d(),j[p].d(),L&&L.d(),y&&y.d(M),D=!1,oe(N)}}}function dc(l){let e,t,n,i,o,s,a,f=l[21]&&dn(l);function d(p,v){return p[10].length===0&&!p[21]?Mc:Sc}let _=d(l),g=_(l);return{c(){e=u("div"),t=u("div"),n=u("button"),n.textContent="+ Добавить заметку",i=k(),f&&f.c(),o=k(),g.c(),c(n,"class","btn btn-primary svelte-1qo7cgm"),c(t,"class","tab-toolbar svelte-1qo7cgm"),c(e,"class","notes-tab svelte-1qo7cgm")},m(p,v){b(p,e,v),r(e,t),r(t,n),r(e,i),f&&f.m(e,null),r(e,o),g.m(e,null),s||(a=F(n,"click",l[87]),s=!0)},p(p,v){p[21]?f?f.p(p,v):(f=dn(p),f.c(),f.m(e,o)):f&&(f.d(1),f=null),_===(_=d(p))&&g?g.p(p,v):(g.d(1),g=_(p),g&&(g.c(),g.m(e,null)))},i:W,o:W,d(p){p&&h(e),f&&f.d(),g.d(),s=!1,a()}}}function mc(l){let e,t,n=l[8].title+"",i,o,s,a,f,d,_=l[8].type+"",g,p,v,w,C,q=(l[8].section||"—")+"",T,D,N,I,A,j=Be(l[8].createdAt)+"",S,L,y,M,z,J,Z,V,R,B,U,le,X,ne,re=l[10].length>0&&pn(l),Q=l[13].length>0&&vn(l);return{c(){e=u("div"),t=u("h2"),i=E(n),o=k(),s=u("div"),a=u("div"),f=u("span"),f.textContent="Тип",d=u("span"),g=E(_),p=k(),v=u("div"),w=u("span"),w.textContent="Раздел",C=u("span"),T=E(q),D=k(),N=u("div"),I=u("span"),I.textContent="Создано",A=u("span"),S=E(j),L=k(),y=u("div"),M=u("button"),M.innerHTML=`
+ Новая заметка`,z=k(),J=u("button"),J.innerHTML=`
+ Добавить файл`,Z=k(),V=u("button"),V.innerHTML=`
+ Добавить действие`,R=k(),B=u("button"),B.innerHTML=`
+ Записать время`,U=k(),re&&re.c(),le=k(),Q&&Q.c(),c(t,"class","svelte-1qo7cgm"),c(f,"class","meta-label svelte-1qo7cgm"),c(d,"class","svelte-1qo7cgm"),c(a,"class","meta-item svelte-1qo7cgm"),c(w,"class","meta-label svelte-1qo7cgm"),c(C,"class","svelte-1qo7cgm"),c(v,"class","meta-item svelte-1qo7cgm"),c(I,"class","meta-label svelte-1qo7cgm"),c(A,"class","svelte-1qo7cgm"),c(N,"class","meta-item svelte-1qo7cgm"),c(s,"class","meta-grid svelte-1qo7cgm"),c(M,"class","qa-btn svelte-1qo7cgm"),c(J,"class","qa-btn svelte-1qo7cgm"),c(V,"class","qa-btn svelte-1qo7cgm"),c(B,"class","qa-btn svelte-1qo7cgm"),c(y,"class","quick-actions svelte-1qo7cgm"),c(e,"class","overview svelte-1qo7cgm")},m(ee,x){b(ee,e,x),r(e,t),r(t,i),r(e,o),r(e,s),r(s,a),r(a,f),r(a,d),r(d,g),r(s,p),r(s,v),r(v,w),r(v,C),r(C,T),r(s,D),r(s,N),r(N,I),r(N,A),r(A,S),r(e,L),r(e,y),r(y,M),r(y,z),r(y,J),r(y,Z),r(y,V),r(y,R),r(y,B),r(e,U),re&&re.m(e,null),r(e,le),Q&&Q.m(e,null),X||(ne=[F(M,"click",l[120]),F(J,"click",l[121]),F(V,"click",l[101]),F(B,"click",l[122])],X=!0)},p(ee,x){x[0]&256&&n!==(n=ee[8].title+"")&&O(i,n),x[0]&256&&_!==(_=ee[8].type+"")&&O(g,_),x[0]&256&&q!==(q=(ee[8].section||"—")+"")&&O(T,q),x[0]&256&&j!==(j=Be(ee[8].createdAt)+"")&&O(S,j),ee[10].length>0?re?re.p(ee,x):(re=pn(ee),re.c(),re.m(e,le)):re&&(re.d(1),re=null),ee[13].length>0?Q?Q.p(ee,x):(Q=vn(ee),Q.c(),Q.m(e,null)):Q&&(Q.d(1),Q=null)},i:W,o:W,d(ee){ee&&h(e),re&&re.d(),Q&&Q.d(),X=!1,oe(ne)}}}function pc(l){let e,t=Y(l[4]),n=[];for(let i=0;iАктивность пока не зафиксирована',c(e,"class","empty-state svelte-1qo7cgm")},m(t,n){b(t,e,n)},p:W,d(t){t&&h(e)}}}function nn(l){let e,t=l[226].targetType+"",n;return{c(){e=u("span"),n=E(t),c(e,"class","activity-event-target svelte-1qo7cgm")},m(i,o){b(i,e,o),r(e,n)},p(i,o){o[0]&16&&t!==(t=i[226].targetType+"")&&O(n,t)},d(i){i&&h(e)}}}function sn(l){let e,t,n=nt(l[226].eventType)+"",i,o,s,a=l[226].title+"",f,d,_,g=Ue(l[226].eventType)+"",p,v,w,C,q=je(l[226].createdAt)+"",T,D,N=l[226].targetType&&nn(l);return{c(){e=u("div"),t=u("span"),i=E(n),o=k(),s=u("span"),f=E(a),d=k(),_=u("span"),p=E(g),v=k(),N&&N.c(),w=k(),C=u("span"),T=E(q),D=k(),c(t,"class","activity-event-icon svelte-1qo7cgm"),c(s,"class","activity-event-title svelte-1qo7cgm"),c(_,"class","activity-event-type svelte-1qo7cgm"),c(C,"class","activity-event-time svelte-1qo7cgm"),c(e,"class","activity-event svelte-1qo7cgm")},m(I,A){b(I,e,A),r(e,t),r(t,i),r(e,o),r(e,s),r(s,f),r(e,d),r(e,_),r(_,p),r(e,v),N&&N.m(e,null),r(e,w),r(e,C),r(C,T),r(e,D)},p(I,A){A[0]&16&&n!==(n=nt(I[226].eventType)+"")&&O(i,n),A[0]&16&&a!==(a=I[226].title+"")&&O(f,a),A[0]&16&&g!==(g=Ue(I[226].eventType)+"")&&O(p,g),I[226].targetType?N?N.p(I,A):(N=nn(I),N.c(),N.m(e,w)):N&&(N.d(1),N=null),A[0]&16&&q!==(q=je(I[226].createdAt)+"")&&O(T,q)},d(I){I&&h(e),N&&N.d()}}}function vc(l){let e,t=Y(l[13]),n=[];for(let i=0;iЗаписей работы пока нет',c(e,"class","empty-state svelte-1qo7cgm")},m(t,n){b(t,e,n)},p:W,d(t){t&&h(e)}}}function on(l){let e,t,n=l[210].summary+"",i,o,s,a=l[210].minutes+"",f,d,_=Be(l[210].createdAt)+"",g,p;return{c(){e=u("div"),t=u("div"),i=E(n),o=k(),s=u("div"),f=E(a),d=E(" мин · "),g=E(_),p=k(),c(t,"class","svelte-1qo7cgm"),c(s,"class","wl-meta svelte-1qo7cgm"),c(e,"class","worklog-entry svelte-1qo7cgm")},m(v,w){b(v,e,w),r(e,t),r(t,i),r(e,o),r(e,s),r(s,f),r(s,d),r(s,g),r(e,p)},p(v,w){w[0]&8192&&n!==(n=v[210].summary+"")&&O(i,n),w[0]&8192&&a!==(a=v[210].minutes+"")&&O(f,a),w[0]&8192&&_!==(_=Be(v[210].createdAt)+"")&&O(g,_)},d(v){v&&h(e)}}}function hc(l){let e,t=Y(l[12]),n=[];for(let i=0;iДействий пока нет',c(e,"class","empty-state svelte-1qo7cgm")},m(t,n){b(t,e,n)},p:W,d(t){t&&h(e)}}}function cn(l){let e,t,n,i=l[221].title+"",o,s,a,f=l[105](l[221].type)+"",d,_,g,p=l[221].data+"",v,w,C,q,T,D,N,I,A;function j(){return l[141](l[221])}function S(){return l[142](l[221])}return{c(){e=u("div"),t=u("div"),n=u("span"),o=E(i),s=k(),a=u("span"),d=E(f),_=k(),g=u("span"),v=E(p),w=k(),C=u("div"),q=u("button"),q.textContent="Запустить",T=k(),D=u("button"),D.innerHTML=' ',N=k(),c(n,"class","action-title svelte-1qo7cgm"),c(a,"class","action-type svelte-1qo7cgm"),c(g,"class","action-data svelte-1qo7cgm"),c(t,"class","action-info svelte-1qo7cgm"),c(q,"class","btn btn-sm svelte-1qo7cgm"),c(D,"class","btn btn-sm btn-danger svelte-1qo7cgm"),c(C,"class","action-btns svelte-1qo7cgm"),c(e,"class","action-card svelte-1qo7cgm")},m(L,y){b(L,e,y),r(e,t),r(t,n),r(n,o),r(t,s),r(t,a),r(a,d),r(t,_),r(t,g),r(g,v),r(e,w),r(e,C),r(C,q),r(C,T),r(C,D),r(e,N),I||(A=[F(q,"click",j),F(D,"click",S)],I=!0)},p(L,y){l=L,y[0]&4096&&i!==(i=l[221].title+"")&&O(o,i),y[0]&4096&&f!==(f=l[105](l[221].type)+"")&&O(d,f),y[0]&4096&&p!==(p=l[221].data+"")&&O(v,p)},d(L){L&&h(e),I=!1,oe(A)}}}function rn(l){let e,t,n=l[39].items.length+"",i,o,s;return{c(){e=u("button"),t=E("Вставить "),i=E(n),c(e,"class","btn svelte-1qo7cgm")},m(a,f){b(a,e,f),r(e,t),r(e,i),o||(s=F(e,"click",l[72]),o=!0)},p(a,f){f[1]&256&&n!==(n=a[39].items.length+"")&&O(i,n)},d(a){a&&h(e),o=!1,s()}}}function kc(l){let e,t,n,i,o,s,a;const f=[qc,wc],d=[];function _(w,C){return w[33].length>0?0:1}e=_(l),t=d[e]=f[e](l);const g=[Tc,Cc],p=[];function v(w,C){return w[34].length===0?0:1}return i=v(l),o=p[i]=g[i](l),{c(){t.c(),n=k(),o.c(),s=ze()},m(w,C){d[e].m(w,C),b(w,n,C),p[i].m(w,C),b(w,s,C),a=!0},p(w,C){let q=e;e=_(w),e===q?d[e].p(w,C):(Re(),de(d[q],1,1,()=>{d[q]=null}),Ke(),t=d[e],t?t.p(w,C):(t=d[e]=f[e](w),t.c()),ae(t,1),t.m(n.parentNode,n));let T=i;i=v(w),i===T?p[i].p(w,C):(Re(),de(p[T],1,1,()=>{p[T]=null}),Ke(),o=p[i],o?o.p(w,C):(o=p[i]=g[i](w),o.c()),ae(o,1),o.m(s.parentNode,s))},i(w){a||(ae(t),ae(o),a=!0)},o(w){de(t),de(o),a=!1},d(w){w&&(h(n),h(s)),d[e].d(w),p[i].d(w)}}}function yc(l){let e;return{c(){e=u("div"),e.innerHTML='Загрузка...
',c(e,"class","empty-state svelte-1qo7cgm")},m(t,n){b(t,e,n)},p:W,i:W,o:W,d(t){t&&h(e)}}}function wc(l){let e,t;return e=new Qn({props:{crumbs:[{name:"Файлы"}]}}),{c(){Qe(e.$$.fragment)},m(n,i){Ge(e,n,i),t=!0},p:W,i(n){t||(ae(e.$$.fragment,n),t=!0)},o(n){de(e.$$.fragment,n),t=!1},d(n){Je(e,n)}}}function qc(l){let e,t,n,i,o,s;return e=new Qn({props:{crumbs:[{name:"Файлы"},...l[33]]}}),e.$on("navigate",l[127]),{c(){Qe(e.$$.fragment),t=k(),n=u("button"),n.innerHTML=`
+ Back`,c(n,"class","btn btn-sm back-btn svelte-1qo7cgm")},m(a,f){Ge(e,a,f),b(a,t,f),b(a,n,f),i=!0,o||(s=F(n,"click",l[63]),o=!0)},p(a,f){const d={};f[1]&4&&(d.crumbs=[{name:"Файлы"},...a[33]]),e.$set(d)},i(a){i||(ae(e.$$.fragment,a),i=!0)},o(a){de(e.$$.fragment,a),i=!1},d(a){a&&(h(t),h(n)),Je(e,a),o=!1,s()}}}function Cc(l){let e,t=[],n=new Map,i,o=Y(l[34]);const s=a=>a[218].id;for(let a=0;a0?"В этой папке пока нет файлов":"В этом проекте пока нет файлов",s,a,f,d,_,g,p,v,w,C;return{c(){e=u("div"),t=u("div"),t.innerHTML=' ',n=k(),i=u("p"),s=E(o),a=k(),f=u("p"),f.textContent="Добавьте файл или папку, чтобы сохранить материалы проекта.",d=k(),_=u("div"),g=u("button"),g.textContent="Добавить файл",p=k(),v=u("button"),v.textContent="Добавить папку",c(t,"class","empty-icon svelte-1qo7cgm"),c(i,"class","svelte-1qo7cgm"),c(f,"class","hint svelte-1qo7cgm"),c(g,"class","btn btn-primary svelte-1qo7cgm"),c(v,"class","btn svelte-1qo7cgm"),c(_,"class","empty-actions svelte-1qo7cgm"),c(e,"class","empty-state svelte-1qo7cgm")},m(q,T){b(q,e,T),r(e,t),r(e,n),r(e,i),r(i,s),r(e,a),r(e,f),r(e,d),r(e,_),r(_,g),r(_,p),r(_,v),w||(C=[F(g,"click",l[95]),F(v,"click",l[96])],w=!0)},p(q,T){T[1]&4&&o!==(o=q[33].length>0?"В этой папке пока нет файлов":"В этом проекте пока нет файлов")&&O(s,o)},i:W,o:W,d(q){q&&h(e),w=!1,oe(C)}}}function an(l,e){let t,n,i;return n=new To({props:{item:e[218],selected:e[40].includes(e[218].id),onDragStart:e[76],onDragOver:e[77],onDrop:e[78]}}),n.$on("navigate",e[128]),n.$on("preview",e[129]),n.$on("openExternal",e[130]),n.$on("showInFolder",e[131]),n.$on("delete",e[132]),n.$on("rename",e[133]),n.$on("duplicate",e[134]),n.$on("cut",e[135]),n.$on("copy",e[136]),n.$on("selectOne",e[137]),n.$on("toggleSelect",e[138]),n.$on("rangeSelect",e[139]),{key:l,first:null,c(){t=ze(),Qe(n.$$.fragment),this.first=t},m(o,s){b(o,t,s),Ge(n,o,s),i=!0},p(o,s){e=o;const a={};s[1]&8&&(a.item=e[218]),s[1]&520&&(a.selected=e[40].includes(e[218].id)),n.$set(a)},i(o){i||(ae(n.$$.fragment,o),i=!0)},o(o){de(n.$$.fragment,o),i=!1},d(o){o&&h(t),Je(n,o)}}}function fn(l){let e;return{c(){e=u("div"),e.innerHTML='Сканирование...
',c(e,"class","empty-state svelte-1qo7cgm")},m(t,n){b(t,e,n)},d(t){t&&h(e)}}}function un(l){let e,t;return e=new Vo({props:{item:l[35],content:l[36],loading:l[37],error:l[38]}}),e.$on("close",l[66]),e.$on("openExternal",l[140]),{c(){Qe(e.$$.fragment)},m(n,i){Ge(e,n,i),t=!0},p(n,i){const o={};i[1]&16&&(o.item=n[35]),i[1]&32&&(o.content=n[36]),i[1]&64&&(o.loading=n[37]),i[1]&128&&(o.error=n[38]),e.$set(o)},i(n){t||(ae(e.$$.fragment,n),t=!0)},o(n){de(e.$$.fragment,n),t=!1},d(n){Je(e,n)}}}function dn(l){let e,t,n,i,o,s,a,f,d;return{c(){e=u("div"),t=u("input"),n=k(),i=u("div"),o=u("button"),o.textContent="Создать",s=k(),a=u("button"),a.textContent="Отмена",c(t,"type","text"),c(t,"placeholder","Название заметки"),c(t,"class","svelte-1qo7cgm"),c(o,"class","btn btn-primary svelte-1qo7cgm"),c(a,"class","btn svelte-1qo7cgm"),c(i,"class","form-actions svelte-1qo7cgm"),c(e,"class","create-form svelte-1qo7cgm")},m(_,g){b(_,e,g),r(e,t),se(t,l[22]),r(e,n),r(e,i),r(i,o),r(i,s),r(i,a),f||(d=[F(t,"input",l[124]),F(t,"keydown",l[125]),F(o,"click",l[89]),F(a,"click",l[88])],f=!0)},p(_,g){g[0]&4194304&&t.value!==_[22]&&se(t,_[22])},d(_){_&&h(e),f=!1,oe(d)}}}function Sc(l){let e,t=Y(l[10]),n=[];for(let i=0;iНет заметокСоздайте первую заметку для этого дела.
',c(e,"class","empty-state svelte-1qo7cgm")},m(t,n){b(t,e,n)},p:W,d(t){t&&h(e)}}}function mn(l){let e,t,n=l[213].title+"",i,o,s,a=Be(l[213].createdAt)+"",f,d,_,g;function p(){return l[126](l[213])}return{c(){e=u("div"),t=u("div"),i=E(n),o=k(),s=u("div"),f=E(a),d=k(),c(t,"class","note-card-title svelte-1qo7cgm"),c(s,"class","note-card-date svelte-1qo7cgm"),c(e,"class","note-card svelte-1qo7cgm")},m(v,w){b(v,e,w),r(e,t),r(t,i),r(e,o),r(e,s),r(s,f),r(e,d),_||(g=F(e,"click",p),_=!0)},p(v,w){l=v,w[0]&1024&&n!==(n=l[213].title+"")&&O(i,n),w[0]&1024&&a!==(a=Be(l[213].createdAt)+"")&&O(f,a)},d(v){v&&h(e),_=!1,g()}}}function pn(l){let e,t,n,i=Y(l[10].slice(0,5)),o=[];for(let s=0;s0&&wn(l);return{c(){e=u("div"),t=u("div"),n=u("h3"),n.textContent="Новое дело",i=k(),o=u("div"),s=u("label"),s.textContent="Название",a=k(),f=u("input"),d=k(),_=u("div"),g=u("label"),g.textContent="Раздел",p=k(),v=u("select");for(let y=0;yl[155].call(v)),c(_,"class","form-group svelte-1qo7cgm"),c(T,"class","btn btn-primary svelte-1qo7cgm"),c(N,"class","btn svelte-1qo7cgm"),c(q,"class","modal-actions svelte-1qo7cgm"),c(t,"class","modal svelte-1qo7cgm"),c(e,"class","modal-overlay svelte-1qo7cgm")},m(y,M){b(y,e,M),r(e,t),r(t,n),r(t,i),r(t,o),r(o,s),r(o,a),r(o,f),se(f,l[17]),r(t,d),r(t,_),r(_,g),r(_,p),r(_,v);for(let z=0;z0?L?L.p(y,M):(L=wn(y),L.c(),L.m(t,C)):L&&(L.d(1),L=null)},d(y){y&&h(e),Ce(S,y),L&&L.d(),I=!1,oe(A)}}}function yn(l){let e,t=l[207].label+"",n,i;return{c(){e=u("option"),n=E(t),e.__value=i=l[207].id,se(e,e.__value),c(e,"class","svelte-1qo7cgm")},m(o,s){b(o,e,s),r(e,n)},p(o,s){s[0]&1&&t!==(t=o[207].label+"")&&O(n,t),s[0]&1&&i!==(i=o[207].id)&&(e.__value=i,se(e,e.__value))},d(o){o&&h(e)}}}function wn(l){let e,t,n,i,o,s,a,f=Y(l[20]),d=[];for(let _=0;_l[156].call(i)),c(e,"class","form-group svelte-1qo7cgm")},m(_,g){b(_,e,g),r(e,t),r(e,n),r(e,i),r(i,o);for(let p=0;pl[159].call(v)),c(_,"class","form-group svelte-1qo7cgm"),c(q,"class","svelte-1qo7cgm"),c(I,"type","text"),c(I,"placeholder",A=l[25]==="open_url"?"https://example.com":l[25]==="open_folder"||l[25]==="open_file"?"/path/to/file":"команда"),c(I,"class","svelte-1qo7cgm"),c(C,"class","form-group svelte-1qo7cgm"),c(L,"class","btn btn-primary svelte-1qo7cgm"),c(M,"class","btn svelte-1qo7cgm"),c(S,"class","modal-actions svelte-1qo7cgm"),c(t,"class","modal svelte-1qo7cgm"),c(e,"class","modal-overlay svelte-1qo7cgm")},m(R,B){b(R,e,B),r(e,t),r(t,n),r(t,i),r(t,o),r(o,s),r(o,a),r(o,f),se(f,l[24]),r(t,d),r(t,_),r(_,g),r(_,p),r(_,v);for(let U=0;U⚒ Верстак ',i=k(),o=u("nav"),s=u("div"),a=u("div"),a.textContent="Разделы",f=k();for(let te=0;te<_e.length;te+=1)_e[te].c();d=k(),ve&&ve.c(),_=k(),g=u("div"),p=u("button"),v=K("svg"),w=K("polyline"),C=K("polyline"),q=K("path"),T=k(),D=u("span"),N=k(),I=u("span"),I.textContent="Синхронизация",A=k(),j=u("span"),S=E(l[5]),L=k(),y=u("main"),M=u("header"),z=u("div"),Se.c(),J=k(),Z=u("div"),we&&we.c(),V=k(),Te&&Te.c(),R=k(),U.c(),le=k(),ge&&ge.c(),X=k(),he&&he.c(),ne=k(),be&&be.c(),re=k(),ke&&ke.c(),Q=k(),pe&&pe.c(),ee=k(),ue&&ue.c(),x=k(),ye&&ye.c(),c(n,"class","sidebar-brand svelte-1qo7cgm"),c(a,"class","nav-label svelte-1qo7cgm"),c(s,"class","nav-group svelte-1qo7cgm"),c(o,"class","sidebar-nav svelte-1qo7cgm"),c(w,"points","23 4 23 10 17 10"),c(w,"class","svelte-1qo7cgm"),c(C,"points","1 20 1 14 7 14"),c(C,"class","svelte-1qo7cgm"),c(q,"d","M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15"),c(q,"class","svelte-1qo7cgm"),c(v,"width","16"),c(v,"height","16"),c(v,"viewBox","0 0 24 24"),c(v,"fill","none"),c(v,"stroke","currentColor"),c(v,"stroke-width","2"),c(v,"stroke-linecap","round"),c(v,"stroke-linejoin","round"),c(v,"class","svelte-1qo7cgm"),c(D,"class","sync-dot svelte-1qo7cgm"),bt(D,"active",(P=l[50])==null?void 0:P.configured),c(I,"class","sidebar-sync-label svelte-1qo7cgm"),c(p,"class","sidebar-sync-btn svelte-1qo7cgm"),c(p,"title","Настройки синхронизации"),c(j,"class","version svelte-1qo7cgm"),c(g,"class","sidebar-footer svelte-1qo7cgm"),c(t,"class","sidebar svelte-1qo7cgm"),c(z,"class","header-left svelte-1qo7cgm"),c(Z,"class","header-right svelte-1qo7cgm"),c(M,"class","header svelte-1qo7cgm"),c(y,"class","main svelte-1qo7cgm"),c(e,"class","app svelte-1qo7cgm")},m(P,te){b(P,e,te),r(e,t),r(t,n),r(t,i),r(t,o),r(o,s),r(s,a),r(s,f);for(let Me=0;Me<_e.length;Me+=1)_e[Me]&&_e[Me].m(s,null);r(o,d),ve&&ve.m(o,null),r(t,_),r(t,g),r(g,p),r(p,v),r(v,w),r(v,C),r(v,q),r(p,T),r(p,D),r(p,N),r(p,I),r(g,A),r(g,j),r(j,S),r(e,L),r(e,y),r(y,M),r(M,z),Se.m(z,null),r(M,J),r(M,Z),we&&we.m(Z,null),r(y,V),Te&&Te.m(y,null),r(y,R),Ae[B].m(y,null),r(y,le),ge&&ge.m(y,null),r(y,X),he&&he.m(y,null),r(y,ne),be&&be.m(y,null),r(y,re),ke&&ke.m(y,null),r(y,Q),pe&&pe.m(y,null),r(y,ee),ue&&ue.m(y,null),r(y,x),ye&&ye.m(y,null),fe=!0,me||(Oe=F(p,"click",l[107]),me=!0)},p(P,te){var Ee,Fe;if(te[0]&129|te[1]&268435456){Ie=Y(P[0]);let ie;for(ie=0;ie{Ae[Me]=null}),Ke(),U=Ae[B],U?U.p(P,te):(U=Ae[B]=ct[B](P),U.c()),ae(U,1),U.m(y,le)),!P[11]&&!P[8]&&P[7]!=="today"&&P[7]!=="inbox"&&P[7]!=="activity"?ge?ge.p(P,te):(ge=bn(P),ge.c(),ge.m(y,X)):ge&&(ge.d(1),ge=null),P[16]?he?he.p(P,te):(he=kn(P),he.c(),he.m(y,ne)):he&&(he.d(1),he=null),P[23]?be?be.p(P,te):(be=Cn(P),be.c(),be.m(y,re)):be&&(be.d(1),be=null),P[30]&&P[29]?ke?ke.p(P,te):(ke=Sn(P),ke.c(),ke.m(y,Q)):ke&&(ke.d(1),ke=null),P[46]?pe?pe.p(P,te):(pe=Ln(P),pe.c(),pe.m(y,ee)):pe&&(pe.d(1),pe=null),P[41]?ue?(ue.p(P,te),te[1]&1024&&ae(ue,1)):(ue=Dn(P),ue.c(),ae(ue,1),ue.m(y,x)):ue&&(Re(),de(ue,1,1,()=>{ue=null}),Ke()),P[49]?ye?ye.p(P,te):(ye=Nn(P),ye.c(),ye.m(y,null)):ye&&(ye.d(1),ye=null)},i(P){fe||(ae(U),ae(ue),fe=!0)},o(P){de(U),de(ue),fe=!1},d(P){P&&h(e),Ce(_e,P),ve&&ve.d(),Se.d(),we&&we.d(),Te&&Te.d(),Ae[B].d(),ge&&ge.d(),he&&he.d(),be&&be.d(),ke&&ke.d(),pe&&pe.d(),ue&&ue.d(),ye&&ye.d(),me=!1,Oe()}}}function G(l,...e){try{if(window.go&&window.go.main&&window.go.main.App){const t=window.go.main.App[l];if(typeof t=="function")return t(...e)}}catch(t){console.error("Wails call error:",l,t)}return Promise.reject(new Error("Wails not connected: "+l))}function Ue(l){return{note_created:"Заметка создана",note_updated:"Заметка изменена",file_added:"Файл добавлен",file_deleted:"Файл удалён",file_renamed:"Файл переименован",file_copied:"Файл скопирован",file_moved:"Файл перемещён",folder_added:"Папка добавлена",folder_deleted:"Папка удалена",folder_renamed:"Папка переименована",node_created:"Дело создано",node_updated:"Дело изменено"}[l]||l}function nt(l){return l==="note_created"||l==="file_added"||l==="folder_added"||l==="node_created"?"+":l==="file_deleted"||l==="folder_deleted"?"×":l==="file_renamed"||l==="folder_renamed"||l==="note_updated"||l==="node_updated"?"~":l==="file_copied"?"⧉":l==="file_moved"?"→":"•"}function je(l){if(!l)return"";try{return new Date(l).toLocaleTimeString("ru-RU",{hour:"2-digit",minute:"2-digit"})}catch{return""}}function Be(l){if(!l)return"";try{return new Date(l).toLocaleDateString("ru-RU",{day:"numeric",month:"short"})}catch{return l}}function On(l){return{project:"Проект",client:"Клиент",document:"Документ",recipe:"Рецепт",archive:"Архив",case:"Дело"}[l]||l||"Дело"}function We(l,e,t,n){return l=Math.abs(l)%100,l>=5&&l<=20?n:(l%=10,l===1?e:l>=2&&l<=4?t:n)}const Pn=l=>l.id!=="today"&&l.id!=="inbox"&&l.id!=="activity";function Hc(l,e,t){let n=[],i=[],o=null,s=[],a=0,f=!0,d=[],_="",g="",p="",v=null,w="overview",C=[],q=null,T=[],D=[],N=[],I="",A="",j=!1,S="",L="clients",y="",M=[],z=!1,J="",Z=!1,V="",R="open_url",B="",U=[{id:"open_url",label:"Открыть URL"},{id:"open_file",label:"Открыть файл"},{id:"open_folder",label:"Открыть папку"},{id:"run_command",label:"Запустить команду"},{id:"run_script",label:"Запустить скрипт"},{id:"open_terminal",label:"Открыть терминал"},{id:"launch_app",label:"Запустить приложение"}],le=!0,X=!1,ne=null,re=!1,Q="",ee=!1,x=null,fe=[],me=[],Oe=null,Ie="",_e=!1,ve="",De={items:[],mode:"copy"},$=[],Se=[],we=!1,Te="",ct="",Ae=!1,rt="Удалить",ge=null,he=null,be=!1,ke="",pe="",ue="",ye=!1,Ne=null,P=!1,te="",Me="",Ee="",Fe=0,ie="";const mt=[{id:"overview",label:"Обзор"},{id:"notes",label:"Заметки"},{id:"files",label:"Файлы"},{id:"actions",label:"Действия"},{id:"worklog",label:"Журнал"},{id:"activity",label:"Активность"}];let wt=null;Rn(async()=>{try{t(5,_=await G("VerstakVersion")||"verstak-gui/v2"),t(0,n=await G("ListSections")||[])}catch(m){t(6,g=String(m)),t(0,n=[{id:"today",label:"Сегодня"},{id:"inbox",label:"Неразобранное"},{id:"activity",label:"Активность"},{id:"clients",label:"Клиенты"},{id:"projects",label:"Проекты"},{id:"recipes",label:"Рецепты"},{id:"documents",label:"Документы"},{id:"archive",label:"Архив"}])}window.runtime&&window.runtime.EventsOn&&(window.runtime.EventsOn("files-dropped",wi),wt=()=>window.runtime.EventsOff("files-dropped")),window.addEventListener("keydown",Qt),t(27,le=!1),at()}),Kn(()=>{wt&&wt(),window.removeEventListener("keydown",Qt)});async function qt(m){t(7,p=m),t(8,v=null),t(9,w="overview"),t(10,C=[]),T=[],t(12,D=[]),t(13,N=[]),t(16,j=!1),t(6,g=""),t(2,o=null),t(3,s=[]),a=0,f=!0,t(1,i=[]);try{m==="today"?t(2,o=await G("ListTodayView")||{cases:[]}):m==="activity"?(t(3,s=await G("ListActivityFeed",50,0)||[]),a=s.length,f=s.length===50):t(1,i=await G("ListNodesBySection",m)||[])}catch(H){t(6,g=String(H)),t(1,i=[]),t(2,o={cases:[]}),t(3,s=[])}}async function Ct(m){t(8,v=m),t(9,w="overview"),t(10,C=[]),T=[],t(12,D=[]),t(13,N=[]),t(34,me=[]),t(33,fe=[]),t(32,x=null),t(35,Oe=null),t(36,Ie=""),t(40,$=[]),Se=[],t(11,q=null),t(16,j=!1),t(21,z=!1),t(6,g=""),t(4,d=[]),await zt(m.id)}async function zt(m){try{t(10,C=await G("ListNotes",m)||[])}catch{}try{T=await G("ListFiles",m)||[]}catch{}try{t(12,D=await G("ListActions",m)||[])}catch{}try{t(13,N=await G("ListWorklog",m)||[])}catch{}try{t(4,d=await G("ListActivityByNode",m,50,0)||[])}catch{}}async function Le(m){t(31,ee=!0);try{let H=await G("ListItems",m)||[];H.sort((ce,qe)=>ce.type!==qe.type?ce.type==="folder"?-1:1:(ce.name||"").localeCompare(qe.name||"")),t(34,me=H)}catch{t(34,me=[])}t(31,ee=!1)}async function Tt(m){if(v){try{const H=await G("GetNodeDetail",m);H&&t(33,fe=[...fe,{id:m,name:H.title}])}catch{t(33,fe=[...fe,{id:m,name:"..."}])}t(32,x=m),await Le(m)}}function Vt(){if(fe.length<2)t(33,fe=[]),t(32,x=null),Le(v.id);else{const m=fe[fe.length-2];t(33,fe=fe.slice(0,-1)),t(32,x=m.id),Le(m.id)}}function Rt(m){const H=fe[m];t(33,fe=fe.slice(0,m+1)),t(32,x=H.id),Le(H.id)}async function St(m){t(35,Oe=m),t(36,Ie=""),t(38,ve=""),t(37,_e=!0);try{go(m)?t(36,Ie=await G("GetFileBase64",m.fileId)||""):ho(m)&&t(36,Ie=await G("ReadFileText",m.fileId)||"")}catch(H){t(38,ve=String(H))}t(37,_e=!1)}function Mt(){t(35,Oe=null),t(36,Ie=""),t(38,ve="")}async function xn(){const m=prompt("Введите имя файла:");if(!(!m||!m.trim()))try{const H=x||v.id;await G("CreateEmptyFile",H,m.trim()),await Le(H)}catch(H){t(6,g=String(H))}}async function Kt(m){try{await G("DuplicateNode",m);const H=x||v.id;await Le(H)}catch(H){t(6,g=String(H))}}function Ut(m){const H=me.find(ce=>ce.id===m);H&&$t(H.id,H.name)}function Wt(m){t(39,De={items:[m],mode:"cut"})}function Gt(m){t(39,De={items:[m],mode:"copy"})}async function Jt(){if(De.items.length===0)return;const m=x||v.id;try{if(De.mode==="copy")for(const H of De.items)await G("DuplicateNode",H);else for(const H of De.items)await G("MoveNode",H,m);t(39,De={items:[],mode:"copy"}),await Le(m)}catch(H){t(6,g=String(H))}}function Xt(m){$.includes(m)?t(40,$=$.filter(H=>H!==m)):t(40,$=[...$,m])}function Zt(m){t(40,$=[m])}function $n(){t(40,$=me.map(m=>m.id))}function Yt(m){if(me.length===0)return;const H=$.length>0?$[$.length-1]:me[0].id,ce=me.findIndex(Xe=>Xe.id===H),qe=me.findIndex(Xe=>Xe.id===m);if(ce===-1||qe===-1)return;const ft=Math.min(ce,qe),Et=Math.max(ce,qe),Hs=me.slice(ft,Et+1).map(Xe=>Xe.id),al=new Set($);Hs.forEach(Xe=>al.add(Xe)),t(40,$=[...al])}function ei(){t(40,$=[])}function Lt(m){return m.length>0?m:me.map(H=>H.id)}async function ti(){var ce;const m=Lt($),H=m.length===1&&((ce=me.find(qe=>qe.id===m[0]))==null?void 0:ce.type)==="folder"?"папку":`файлов (${m.length})`;pt({title:"Удаление",message:`Удалить ${H}?`,confirmText:"Удалить",danger:!0,onConfirm:async()=>{for(const ft of m)try{await G("DeleteFileOrFolder",ft)}catch(Et){t(6,g=String(Et))}t(40,$=[]);const qe=x||v.id;await Le(qe)}})}function li(){const m=Lt($);t(39,De={items:m,mode:"cut"}),t(40,$=[])}function ni(){const m=Lt($);t(39,De={items:m,mode:"copy"}),t(40,$=[])}function ii(m,H){const ce=$.includes(H)?$:[H];Se=ce,m.dataTransfer.effectAllowed="move",m.dataTransfer.setData("text/plain",ce.join(","))}function si(m,H){const ce=me.find(qe=>qe.id===H);ce&&ce.type==="folder"&&(m.preventDefault(),m.dataTransfer.dropEffect="move")}async function oi(m,H){if(m.preventDefault(),Se.length!==0){for(const ce of Se)try{await G("MoveNode",ce,H)}catch(qe){t(6,g=String(qe))}Se=[],t(40,$=[]),await Le(x||v.id)}}function Qt(m){if(w==="files"&&!(m.target.tagName==="INPUT"||m.target.tagName==="TEXTAREA"))if(m.ctrlKey||m.metaKey)m.key==="c"||m.key==="C"?(m.preventDefault(),ni()):m.key==="x"||m.key==="X"?(m.preventDefault(),li()):m.key==="v"||m.key==="V"?(m.preventDefault(),Jt()):m.key==="a"||m.key==="A"?(m.preventDefault(),$n()):m.key==="o"||m.key==="O"?(m.preventDefault(),ci()):m.key==="Enter"&&(m.preventDefault(),xt());else if(m.key==="Enter")m.preventDefault(),xt();else if(m.key==="Delete"||m.key==="Backspace"){if(Oe){m.preventDefault(),Mt();return}if($.length>0){m.preventDefault(),ti();return}if(m.key==="Backspace"&&fe.length>0){m.preventDefault(),Vt();return}}else if(m.key==="Escape"){if(Oe){Mt();return}if($.length>0){ei();return}}else m.key==="F2"&&(m.preventDefault(),ri())}function xt(){if($.length===1){const m=me.find(H=>H.id===$[0]);m&&(m.type==="folder"?Tt(m.id):St(m))}}function ci(){if($.length===1){const m=me.find(H=>H.id===$[0]);m&&m.fileId&&G("OpenFile",m.fileId)}}function $t(m,H){ke=m,t(47,pe=H),t(48,ue=""),t(46,be=!0)}function ri(){if($.length===1){const m=me.find(H=>H.id===$[0]);m&&$t(m.id,m.name)}}async function el(){const m=pe.trim();if(!m){t(48,ue="Имя не может быть пустым");return}try{await G("ValidateName",m)}catch{t(48,ue="Недопустимое имя");return}t(46,be=!1),ke="";try{await G("RenameNode",ke,m);const H=x||v.id;await Le(H)}catch(H){t(6,g=String(H))}}function ai(){t(46,be=!1),ke="",t(47,pe=""),t(48,ue="")}function fi(m){m.key==="Enter"?el():t(48,ue="")}function pt(m){t(42,Te=m.title||"Подтверждение"),t(43,ct=m.message||""),t(44,Ae=m.danger!==void 0?m.danger:!0),t(45,rt=m.confirmText||"Удалить"),ge=m.onConfirm||null,he=m.onCancel||null,t(41,we=!0)}function tl(){t(41,we=!1),ge=null,he=null}function ui(){ge&&ge(),tl()}function di(){he&&he(),tl()}function mi(){t(16,j=!0),t(17,S=""),t(18,L=p||"clients"),t(19,y=""),G("ListTemplates").then(m=>{t(20,M=m||[])}).catch(()=>{t(20,M=[])})}function pi(){t(16,j=!1),t(17,S="")}async function ll(){if(S.trim())try{let m;y?m=await G("FromTemplate","","case",S.trim(),L,y):m=await G("CreateNode","","case",S.trim(),L),t(16,j=!1),t(17,S=""),t(19,y=""),await qt(L)}catch(m){t(6,g=String(m))}}function nl(){t(21,z=!0),t(22,J="")}function _i(){t(21,z=!1),t(22,J="")}async function il(){if(!(!J.trim()||!v))try{const m=await G("CreateNote",v.id,J.trim());t(10,C=[...C,m&&m.id?m:{id:Date.now().toString(),title:J.trim(),createdAt:new Date().toISOString()}]),t(21,z=!1),t(22,J="")}catch{const H={id:Date.now().toString(),title:J.trim(),createdAt:new Date().toISOString()};t(10,C=[...C,H]),t(21,z=!1),t(22,J="")}}async function It(m){if(q&&q.dirty){pt({title:"Несохранённые изменения",message:"Закрыть редактор? Все несохранённые изменения будут потеряны.",confirmText:"Закрыть",danger:!1,onConfirm:async()=>{await sl(m)}});return}await sl(m)}async function sl(m){try{const H=await G("ReadNote",m.id);t(11,q={id:m.id,title:m.title,content:H||"",dirty:!1})}catch{t(11,q={id:m.id,title:m.title,content:"# "+m.title+`
+
+`,dirty:!1})}}function vi(){if(q&&q.dirty){pt({title:"Несохранённые изменения",message:"Закрыть редактор? Все несохранённые изменения будут потеряны.",confirmText:"Закрыть",danger:!1,onConfirm:()=>{t(11,q=null)}});return}t(11,q=null)}function gi(m){q&&(t(11,q.content=m.target.value,q),t(11,q.dirty=!0,q))}async function hi(){if(q)try{await G("SaveNote",q.id,q.content),t(11,q.dirty=!1,q)}catch{t(11,q.dirty=!1,q)}}async function bi(){const m=parseInt(I,10);if(!(!A.trim()||isNaN(m)||m<=0||!v)){try{const H=await G("CreateWorklog",v.id,A.trim(),m);t(13,N=[...N,H&&H.id?H:{id:Date.now().toString(),nodeId:v.id,summary:A.trim(),minutes:m,createdAt:new Date().toISOString()}])}catch{t(13,N=[...N,{id:Date.now().toString(),nodeId:v.id,summary:A.trim(),minutes:m,createdAt:new Date().toISOString()}])}t(15,A=""),t(14,I="")}}async function ol(){const m=await G("PickFile");m&&await Dt(v.id,m)}async function ki(){const m=await G("PickDirectory");m&&await Dt(v.id,m)}async function Dt(m,H){t(28,X=!0);try{const ce=await G("PreviewImport",H);t(29,ne=ce),Q=H,t(30,re=!0)}catch(ce){t(6,g=String(ce))}t(28,X=!1)}async function Nt(m){try{const H=m==="copy"?await G("AddPathCopy",v.id,Q):await G("AddPathLink",v.id,Q);t(30,re=!1),t(29,ne=null),t(33,fe=[]),t(32,x=null),await Promise.all([zt(v.id),Le(v.id)])}catch(H){t(6,g=String(H))}}function yi(){t(30,re=!1),t(29,ne=null)}async function cl({id:m,type:H}){pt({title:"Удаление",message:`Удалить ${H==="folder"?"папку":"файл"}?`,confirmText:"Удалить",danger:!0,onConfirm:async()=>{try{await G("DeleteFileOrFolder",m),T=T.filter(ft=>ft.nodeId!==m);const qe=x||v.id;await Le(qe)}catch(qe){t(6,g=String(qe))}}})}async function wi(m){if(!m||m.length===0)return;if(!v){t(6,g="Сначала выберите дело для добавления файлов");return}const H=m[0];await Dt(v.id,H)}function qi(m){return w===m?"tab active":"tab"}function Ci(){t(23,Z=!0),t(24,V=""),t(25,R="open_url"),t(26,B="")}function Ti(){t(23,Z=!1),t(24,V=""),t(26,B="")}async function At(){if(!(!V.trim()||!B.trim()||!v))try{const m=await G("CreateAction",v.id,R,V.trim(),B.trim());m&&m.id&&t(12,D=[...D,m]),t(23,Z=!1),t(24,V=""),t(26,B="")}catch(m){t(6,g=String(m))}}async function rl(m){try{await G("DeleteAction",m),t(12,D=D.filter(H=>H.id!==m))}catch(H){t(6,g=String(H))}}function Si(m){const H=U.find(ce=>ce.id===m);return H?H.label:m}async function Pe(m){try{const H=await G("GetNodeDetail",m);H&&Ct(H)}catch(H){t(6,g=String(H))}}async function at(){try{t(50,Ne=await G("SyncStatus"))}catch{t(50,Ne={configured:!1,serverUrl:"",deviceId:"",unpushedOps:0,lastSyncAt:"",syncInterval:0})}}function Mi(){t(49,ye=!0),t(52,te=(Ne==null?void 0:Ne.serverUrl)||""),t(53,Me=""),t(54,Ee=""),t(55,Fe=(Ne==null?void 0:Ne.syncInterval)||0),t(56,ie="")}function Li(){t(49,ye=!1),t(56,ie="")}async function Ii(){t(51,P=!0),t(56,ie="");try{await G("SyncConfigure",te,Me,Ee),Fe>0&&await G("SyncSetInterval",Fe),t(54,Ee=""),t(53,Me=""),await at(),t(49,ye=!1)}catch(m){t(56,ie="err: "+String(m))}t(51,P=!1)}async function Di(){t(51,P=!0),t(56,ie="");try{await G("SyncSetInterval",Fe),t(56,ie="интервал сохранён"),await at()}catch(m){t(56,ie="err: "+String(m))}t(51,P=!1)}async function Ni(){t(51,P=!0),t(56,ie="");try{await G("SyncTestConnection",te,Me,Ee),t(56,ie="connection ok")}catch(m){t(56,ie="connection failed: "+String(m))}t(51,P=!1)}async function Ai(){t(51,P=!0),t(56,ie="");try{await G("SyncDisconnect"),t(56,ie="disconnected"),await at()}catch(m){t(56,ie="err: "+String(m))}t(51,P=!1)}async function Ei(){t(51,P=!0),t(56,ie="");try{const m=await G("SyncNow");t(56,ie="pushed "+m.pushed+", pulled "+m.pulled+" (seq "+m.serverSequence+")"),await at()}catch(m){t(56,ie="err: "+String(m))}t(51,P=!1)}const Fi=m=>qt(m.id),Hi=m=>Ct(m),ji=()=>t(6,g=""),Bi=()=>t(6,g="");function Oi(){q.content=this.value,t(11,q)}const Pi=m=>{t(9,w=m.id),m.id==="files"&&v&&me.length===0&&!x&&Le(v.id)},zi=()=>{t(9,w="notes"),nl()},Vi=()=>{t(9,w="files"),ol()},Ri=()=>t(9,w="worklog"),Ki=m=>It(m);function Ui(){J=this.value,t(22,J)}const Wi=m=>m.key==="Enter"&&il(),Gi=m=>It(m),Ji=m=>{const H=m.detail;H===0?(t(33,fe=[]),t(32,x=null),Le(v.id)):Rt(H-1)},Xi=m=>Tt(m.detail),Zi=m=>St(m.detail),Yi=m=>G("OpenFile",m.detail),Qi=m=>G("OpenFolder",m.detail),xi=m=>cl(m.detail),$i=m=>Ut(m.detail.id),es=m=>Kt(m.detail),ts=m=>Wt(m.detail),ls=m=>Gt(m.detail),ns=m=>Zt(m.detail),is=m=>Xt(m.detail),ss=m=>Yt(m.detail),os=m=>G("OpenFile",m.detail),cs=m=>G("RunAction",m.id),rs=m=>rl(m.id);function as(){A=this.value,t(15,A)}function fs(){I=ht(this.value),t(14,I)}const us=m=>Pe(m.nodeId),ds=(m,H)=>H.key==="Enter"&&Pe(m.nodeId),ms=m=>Pe(m.nodeId),ps=(m,H)=>H.key==="Enter"&&Pe(m.nodeId),_s=m=>Pe(m.nodeId),vs=(m,H)=>H.key==="Enter"&&Pe(m.nodeId),gs=m=>Pe(m.nodeId),hs=(m,H)=>H.key==="Enter"&&Pe(m.nodeId);function bs(){S=this.value,t(17,S)}const ks=m=>m.key==="Enter"&&ll();function ys(){L=Ht(this),t(18,L),t(0,n)}function ws(){y=Ht(this),t(19,y),t(20,M)}function qs(){V=this.value,t(24,V)}const Cs=m=>m.key==="Enter"&&At();function Ts(){R=Ht(this),t(25,R),t(57,U)}function Ss(){B=this.value,t(26,B)}const Ms=m=>m.key==="Enter"&&At(),Ls=()=>Nt("copy"),Is=()=>Nt("link");function Ds(){pe=this.value,t(47,pe)}function Ns(){te=this.value,t(52,te)}function As(){Me=this.value,t(53,Me)}function Es(){Ee=this.value,t(54,Ee)}function Fs(){Fe=ht(this.value),t(55,Fe)}return[n,i,o,s,d,_,g,p,v,w,C,q,D,N,I,A,j,S,L,y,M,z,J,Z,V,R,B,le,X,ne,re,ee,x,fe,me,Oe,Ie,_e,ve,De,$,we,Te,ct,Ae,rt,be,pe,ue,ye,Ne,P,te,Me,Ee,Fe,ie,U,mt,qt,Ct,Le,Tt,Vt,Rt,St,Mt,xn,Kt,Ut,Wt,Gt,Jt,Xt,Zt,Yt,ii,si,oi,el,ai,fi,ui,di,mi,pi,ll,nl,_i,il,It,vi,gi,hi,bi,ol,ki,Nt,yi,cl,qi,Ci,Ti,At,rl,Si,Pe,Mi,Li,Ii,Di,Ni,Ai,Ei,Fi,Hi,ji,Bi,Oi,Pi,zi,Vi,Ri,Ki,Ui,Wi,Gi,Ji,Xi,Zi,Yi,Qi,xi,$i,es,ts,ls,ns,is,ss,os,cs,rs,as,fs,us,ds,ms,ps,_s,vs,gs,hs,bs,ks,ys,ws,qs,Cs,Ts,Ss,Ms,Ls,Is,Ds,Ns,As,Es,Fs]}class jc extends ot{constructor(e){super(),st(this,e,Hc,Fc,it,{},null,[-1,-1,-1,-1,-1,-1,-1,-1,-1])}}new jc({target:document.getElementById("app")});
diff --git a/cmd/verstak-gui/frontend-dist/assets/main-DVpSwKcZ.css b/cmd/verstak-gui/frontend-dist/assets/main-DVpSwKcZ.css
deleted file mode 100644
index efa1c62..0000000
--- a/cmd/verstak-gui/frontend-dist/assets/main-DVpSwKcZ.css
+++ /dev/null
@@ -1 +0,0 @@
-.file-row.svelte-1u905d2.svelte-1u905d2{display:flex;align-items:center;gap:10px;padding:8px 12px;border-radius:6px;cursor:default;transition:background .12s;min-height:52px;-webkit-user-select:none;user-select:none;position:relative}.file-row.svelte-1u905d2.svelte-1u905d2:hover{background:#1e1e30}.file-row--selected.svelte-1u905d2.svelte-1u905d2{background:#1e1e3a;outline:1px solid #3a3a6c}.file-row--selected.svelte-1u905d2.svelte-1u905d2:hover{background:#252545}.file-row.svelte-1u905d2.svelte-1u905d2:focus-visible{outline:2px solid #5588ff;outline-offset:-2px}.file-row-icon.svelte-1u905d2.svelte-1u905d2{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:32px;height:32px;color:#888}.file-row-body.svelte-1u905d2.svelte-1u905d2{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.file-row-name.svelte-1u905d2.svelte-1u905d2{font-size:13px;color:#ddd;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;line-height:1.3}.file-row-meta.svelte-1u905d2.svelte-1u905d2{display:flex;align-items:center;gap:4px;font-size:11px;color:#666}.meta-sep.svelte-1u905d2.svelte-1u905d2{color:#444}.file-row-actions.svelte-1u905d2.svelte-1u905d2{display:flex;gap:2px;align-items:center;opacity:0;transition:opacity .15s ease;flex-shrink:0}.file-row.svelte-1u905d2:hover .file-row-actions.svelte-1u905d2{opacity:1}.action-btn.svelte-1u905d2.svelte-1u905d2{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;border-radius:4px;background:transparent;color:#666;cursor:pointer;transition:background .12s,color .12s}.action-btn.svelte-1u905d2.svelte-1u905d2:hover{background:#2a2a3c;color:#ccc}.action-btn-danger.svelte-1u905d2.svelte-1u905d2:hover{background:#3a2222;color:#ff6b6b}.action-btn.svelte-1u905d2.svelte-1u905d2:focus-visible{outline:2px solid #5588ff;outline-offset:1px}.menu-backdrop.svelte-1u905d2.svelte-1u905d2{position:fixed;top:0;right:0;bottom:0;left:0;z-index:99}.menu.svelte-1u905d2.svelte-1u905d2{position:absolute;right:12px;margin-top:4px;background:#1a1a28;border:1px solid #2a2a3c;border-radius:8px;padding:4px;z-index:100;min-width:220px;box-shadow:0 4px 16px #00000080}.menu-item.svelte-1u905d2.svelte-1u905d2{display:flex;align-items:center;gap:8px;width:100%;padding:7px 10px;border:none;background:transparent;color:#ccc;font-size:12px;text-align:left;cursor:pointer;border-radius:4px;font-family:inherit}.menu-item.svelte-1u905d2.svelte-1u905d2:hover{background:#2a2a3c;color:#fff}.menu-item-danger.svelte-1u905d2.svelte-1u905d2{color:#ff6b6b}.menu-item-danger.svelte-1u905d2.svelte-1u905d2:hover{background:#3a2222}.menu-item.svelte-1u905d2.svelte-1u905d2:focus-visible{outline:2px solid #5588ff;outline-offset:1px}.menu-sep.svelte-1u905d2.svelte-1u905d2{height:1px;background:#2a2a3c;margin:4px 8px}.breadcrumbs.svelte-csi2lb{display:flex;align-items:center;gap:4px;padding:8px 0;font-size:13px;color:#999}.sep.svelte-csi2lb{color:#444}.crumb.svelte-csi2lb{font-size:13px}.crumb--current.svelte-csi2lb{color:#ccc}.crumb--link.svelte-csi2lb{background:none;border:none;padding:2px 4px;color:#888;cursor:pointer;border-radius:3px;font-family:inherit;font-size:13px;transition:color .12s,background .12s}.crumb--link.svelte-csi2lb:hover{color:#ccc;background:#1e1e30}.crumb--link.svelte-csi2lb:focus-visible{outline:2px solid #5588ff;outline-offset:1px}.overlay.svelte-1cw3u0m{position:fixed;top:0;right:0;bottom:0;left:0;background:#000000a6;display:flex;align-items:center;justify-content:center;z-index:1000}.modal.svelte-1cw3u0m{background:#14141f;border:1px solid #2a2a3c;border-radius:10px;width:90vw;max-width:900px;height:85vh;max-height:700px;display:flex;flex-direction:column;overflow:hidden}.preview-header.svelte-1cw3u0m{display:flex;align-items:center;gap:10px;padding:12px 16px;border-bottom:1px solid #2a2a3c;flex-shrink:0}.preview-title.svelte-1cw3u0m{display:flex;align-items:center;gap:8px;color:#ddd;font-size:14px;min-width:0}.preview-name.svelte-1cw3u0m{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.preview-meta.svelte-1cw3u0m{font-size:11px;color:#666;margin-left:auto;white-space:nowrap}.preview-actions.svelte-1cw3u0m{display:flex;gap:4px;flex-shrink:0;margin-left:8px}.action-btn.svelte-1cw3u0m{display:flex;align-items:center;justify-content:center;width:30px;height:30px;border:none;border-radius:4px;background:transparent;color:#666;cursor:pointer;transition:background .12s,color .12s}.action-btn.svelte-1cw3u0m:hover{background:#2a2a3c;color:#ccc}.action-btn.svelte-1cw3u0m:focus-visible{outline:2px solid #5588ff;outline-offset:1px}.action-btn-close.svelte-1cw3u0m{color:#ff6b6b}.action-btn-close.svelte-1cw3u0m:hover{background:#3a2222;color:#f44}.preview-body.svelte-1cw3u0m{flex:1;overflow:auto;min-height:0}.preview-status.svelte-1cw3u0m{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:48px 24px;color:#888;font-size:14px}.preview-image-container.svelte-1cw3u0m{display:flex;align-items:center;justify-content:center;padding:16px;min-height:200px;background:#0e0e18}.preview-image.svelte-1cw3u0m{max-width:100%;max-height:calc(85vh - 100px);object-fit:contain;border-radius:4px}.preview-text.svelte-1cw3u0m{margin:0;padding:16px;font-family:SF Mono,Fira Code,Cascadia Code,Consolas,monospace;font-size:12px;line-height:1.5;color:#ccc;white-space:pre-wrap;word-wrap:break-word;overflow:auto}.preview-pdf-container.svelte-1cw3u0m{width:100%;height:100%}.preview-pdf.svelte-1cw3u0m{width:100%;height:100%;border:none}.btn-sm.svelte-1cw3u0m{padding:6px 14px;border:1px solid #2a2a3c;background:#1a1a28;color:#ccc;border-radius:6px;cursor:pointer;font-size:12px;font-family:inherit;transition:background .12s}.btn-sm.svelte-1cw3u0m:hover{background:#223}.overlay.svelte-1fv6yyk{position:fixed;top:0;right:0;bottom:0;left:0;background:#0009;display:flex;align-items:center;justify-content:center;z-index:200}.modal.svelte-1fv6yyk{background:#1a1a28;border:1px solid #2a2a3c;border-radius:12px;padding:24px;width:360px;max-width:90vw}h3.svelte-1fv6yyk{font-size:18px;margin-bottom:12px;color:#e4e4ef}.message.svelte-1fv6yyk{font-size:14px;color:#aaa;margin-bottom:20px;line-height:1.4}.actions.svelte-1fv6yyk{display:flex;gap:8px;justify-content:flex-end}.btn.svelte-1fv6yyk{padding:8px 16px;border:1px solid #2a2a3c;background:#1a1a28;color:#ccc;border-radius:6px;cursor:pointer;font-size:13px;font-family:inherit}.btn.svelte-1fv6yyk:hover{background:#223}.btn-primary.svelte-1fv6yyk{background:#6366f1;border-color:#6366f1;color:#fff}.btn-primary.svelte-1fv6yyk:hover{background:#4f46e5}.btn-danger.svelte-1fv6yyk{background:#dc2626;border-color:#dc2626;color:#fff}.btn-danger.svelte-1fv6yyk:hover{background:#b91c1c}.btn.svelte-1fv6yyk:focus-visible{outline:2px solid #5588ff;outline-offset:1px}.svelte-1kukkze.svelte-1kukkze,.svelte-1kukkze.svelte-1kukkze:before,.svelte-1kukkze.svelte-1kukkze:after{box-sizing:border-box;margin:0;padding:0}.app.svelte-1kukkze.svelte-1kukkze{display:flex;width:100vw;height:100vh;overflow:hidden;background:#13131f;color:#e4e4ef;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:14px}.sidebar.svelte-1kukkze.svelte-1kukkze{width:260px;min-width:200px;height:100vh;display:flex;flex-direction:column;background:#1a1a28;border-right:1px solid #2a2a3c;flex-shrink:0;overflow:hidden}.sidebar-brand.svelte-1kukkze.svelte-1kukkze{padding:16px 20px;display:flex;align-items:center;gap:10px;border-bottom:1px solid #2a2a3c;flex-shrink:0}.logo.svelte-1kukkze.svelte-1kukkze{font-size:20px;line-height:1}.brand-name.svelte-1kukkze.svelte-1kukkze{font-size:16px;font-weight:600}.sidebar-nav.svelte-1kukkze.svelte-1kukkze{flex:1;overflow-y:auto;padding:12px 0}.nav-group.svelte-1kukkze.svelte-1kukkze{margin-bottom:16px}.nav-label.svelte-1kukkze.svelte-1kukkze{font-size:10px;text-transform:uppercase;letter-spacing:.5px;color:#666;padding:4px 20px;margin-bottom:4px}.nav-item.svelte-1kukkze.svelte-1kukkze{display:block;width:100%;padding:8px 20px;border:none;background:none;color:#ccc;font-size:13px;text-align:left;cursor:pointer;border-radius:0;font-family:inherit}.nav-item.svelte-1kukkze.svelte-1kukkze:hover{background:#223}.nav-item.selected.svelte-1kukkze.svelte-1kukkze{background:#2a2a4a;color:#fff;font-weight:500}.nav-empty.svelte-1kukkze.svelte-1kukkze{padding:8px 20px;color:#555;font-size:12px}.sidebar-footer.svelte-1kukkze.svelte-1kukkze{padding:8px 12px;border-top:1px solid #2a2a3c;flex-shrink:0;display:flex;flex-direction:column;gap:4px}.version.svelte-1kukkze.svelte-1kukkze{font-size:11px;color:#555;text-align:center}.main.svelte-1kukkze.svelte-1kukkze{flex:1;display:flex;flex-direction:column;height:100vh;min-width:0;overflow:hidden;background:#13131f}.header.svelte-1kukkze.svelte-1kukkze{padding:12px 24px;border-bottom:1px solid #2a2a3c;display:flex;align-items:center;flex-shrink:0;min-height:48px}.header-left.svelte-1kukkze.svelte-1kukkze{display:flex;align-items:center;gap:8px;flex:1}.header-right.svelte-1kukkze.svelte-1kukkze{display:flex;align-items:center;gap:8px}.header-sync-btn.svelte-1kukkze.svelte-1kukkze{background:#1e1e38;border:1px solid #6366f1;border-radius:8px;padding:6px 12px;cursor:pointer;display:inline-flex;align-items:center;gap:6px;color:#c0c0f0;font-family:inherit;font-size:13px;position:relative}.header-sync-btn.svelte-1kukkze.svelte-1kukkze:hover{background:#2a2a50;color:#e4e4ef;border-color:#818cf8}.header-sync-btn.svelte-1kukkze.svelte-1kukkze:disabled{opacity:.5;cursor:not-allowed}.sync-badge.svelte-1kukkze.svelte-1kukkze{background:#6366f1;color:#fff;font-size:10px;border-radius:50%;width:16px;height:16px;display:inline-flex;align-items:center;justify-content:center;position:absolute;top:-6px;right:-6px}.crumb.svelte-1kukkze.svelte-1kukkze{font-size:14px;font-weight:500}.crumb.placeholder.svelte-1kukkze.svelte-1kukkze{color:#666}.crumb-type.svelte-1kukkze.svelte-1kukkze{font-size:11px;color:#555;background:#1e1e2e;padding:2px 8px;border-radius:10px;margin-left:8px}.error-banner.svelte-1kukkze.svelte-1kukkze{background:#3a2222;color:#f88;padding:8px 24px;font-size:12px;border-bottom:1px solid #4a2222;flex-shrink:0;cursor:pointer;display:flex;justify-content:space-between;align-items:center}.dismiss-btn.svelte-1kukkze.svelte-1kukkze{background:none;border:none;color:#f66;cursor:pointer;padding:2px;display:flex;align-items:center;border-radius:2px}.dismiss-btn.svelte-1kukkze.svelte-1kukkze:hover{color:#f44}.tabs.svelte-1kukkze.svelte-1kukkze{display:flex;border-bottom:1px solid #2a2a3c;flex-shrink:0;padding:0 24px}.tab.svelte-1kukkze.svelte-1kukkze{padding:10px 16px;border:none;background:none;color:#888;font-size:13px;cursor:pointer;border-bottom:2px solid transparent;font-family:inherit}.tab.svelte-1kukkze.svelte-1kukkze:hover{color:#ccc}.tab.active.svelte-1kukkze.svelte-1kukkze{color:#e4e4ef;border-bottom-color:#6366f1}.tab-content.svelte-1kukkze.svelte-1kukkze{flex:1;overflow-y:auto}.note-editor.svelte-1kukkze.svelte-1kukkze{flex:1;display:flex;flex-direction:column;height:100%}.note-editor-header.svelte-1kukkze.svelte-1kukkze{padding:12px 24px;border-bottom:1px solid #2a2a3c;display:flex;align-items:center;gap:12px;flex-shrink:0}.note-title.svelte-1kukkze.svelte-1kukkze{font-size:16px;font-weight:500}.dirty-mark.svelte-1kukkze.svelte-1kukkze{color:#f59e0b;font-size:10px}.note-editor-actions.svelte-1kukkze.svelte-1kukkze{margin-left:auto;display:flex;gap:8px}.note-textarea.svelte-1kukkze.svelte-1kukkze{flex:1;width:100%;border:none;outline:none;background:#13131f;color:#e4e4ef;font-family:SF Mono,Fira Code,monospace;font-size:14px;line-height:1.6;padding:24px;resize:none}.overview.svelte-1kukkze.svelte-1kukkze{padding:24px}.overview.svelte-1kukkze h2.svelte-1kukkze{font-size:24px;margin-bottom:16px}.meta-grid.svelte-1kukkze.svelte-1kukkze{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:12px;margin-bottom:24px}.meta-item.svelte-1kukkze.svelte-1kukkze{background:#1a1a28;padding:12px 16px;border-radius:8px}.meta-label.svelte-1kukkze.svelte-1kukkze{display:block;font-size:11px;color:#666;margin-bottom:4px;text-transform:uppercase}.quick-actions.svelte-1kukkze.svelte-1kukkze{display:flex;gap:8px;margin-bottom:24px;flex-wrap:wrap}.qa-btn.svelte-1kukkze.svelte-1kukkze{padding:10px 16px;border:1px solid #2a2a3c;background:#1a1a28;color:#ccc;border-radius:8px;cursor:pointer;font-size:13px;font-family:inherit;display:inline-flex;align-items:center;gap:6px}.qa-btn.svelte-1kukkze.svelte-1kukkze:hover{background:#223}.qa-btn.svelte-1kukkze.svelte-1kukkze:disabled{opacity:.4;cursor:not-allowed}.recent-section.svelte-1kukkze.svelte-1kukkze{margin-bottom:24px}.recent-section.svelte-1kukkze h3.svelte-1kukkze{font-size:13px;color:#666;text-transform:uppercase;margin-bottom:8px}.recent-note.svelte-1kukkze.svelte-1kukkze{padding:8px 12px;border-radius:6px;cursor:pointer;display:flex;justify-content:space-between}.recent-note.svelte-1kukkze.svelte-1kukkze:hover{background:#1a1a28}.recent-date.svelte-1kukkze.svelte-1kukkze{font-size:11px;color:#555}.recent-entry.svelte-1kukkze.svelte-1kukkze{padding:6px 0;font-size:13px;color:#888;border-bottom:1px solid #1a1a28}.notes-tab.svelte-1kukkze.svelte-1kukkze{padding:24px}.tab-toolbar.svelte-1kukkze.svelte-1kukkze{margin-bottom:16px}.create-form.svelte-1kukkze.svelte-1kukkze{background:#1a1a28;padding:16px;border-radius:8px;margin-bottom:16px}.create-form.svelte-1kukkze input.svelte-1kukkze{width:100%;padding:8px 12px;border:1px solid #2a2a3c;background:#13131f;color:#e4e4ef;border-radius:4px;font-size:14px;font-family:inherit;margin-bottom:8px}.create-form.svelte-1kukkze input.svelte-1kukkze:focus{outline:none;border-color:#6366f1}.form-actions.svelte-1kukkze.svelte-1kukkze{display:flex;gap:8px}.notes-list.svelte-1kukkze.svelte-1kukkze{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:12px}.note-card.svelte-1kukkze.svelte-1kukkze{background:#1a1a28;border:1px solid #2a2a3c;border-radius:8px;padding:16px;cursor:pointer}.note-card.svelte-1kukkze.svelte-1kukkze:hover{border-color:#3a3a5c}.note-card-title.svelte-1kukkze.svelte-1kukkze{font-size:14px;font-weight:500;margin-bottom:4px}.note-card-date.svelte-1kukkze.svelte-1kukkze{font-size:11px;color:#555}.worklog-tab.svelte-1kukkze.svelte-1kukkze{padding:24px}.worklog-form.svelte-1kukkze.svelte-1kukkze{display:flex;gap:8px;margin-bottom:24px;align-items:center}.worklog-form.svelte-1kukkze input.svelte-1kukkze{padding:8px 12px;border:1px solid #2a2a3c;background:#13131f;color:#e4e4ef;border-radius:4px;font-size:14px;font-family:inherit}.worklog-form.svelte-1kukkze input.svelte-1kukkze:focus{outline:none;border-color:#6366f1}.worklog-form.svelte-1kukkze input[type=text].svelte-1kukkze{flex:1}.worklog-form.svelte-1kukkze input[type=number].svelte-1kukkze{width:70px}.worklog-entry.svelte-1kukkze.svelte-1kukkze{padding:12px 0;border-bottom:1px solid #1a1a28}.wl-meta.svelte-1kukkze.svelte-1kukkze{font-size:11px;color:#555;margin-top:2px}.actions-tab.svelte-1kukkze.svelte-1kukkze{padding:24px}.action-card.svelte-1kukkze.svelte-1kukkze{background:#1a1a28;padding:12px 16px;border-radius:8px;display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:8px}.action-info.svelte-1kukkze.svelte-1kukkze{display:flex;align-items:center;gap:8px;flex:1;min-width:0}.action-title.svelte-1kukkze.svelte-1kukkze{font-weight:500}.action-type.svelte-1kukkze.svelte-1kukkze{font-size:11px;color:#888;background:#223;padding:2px 8px;border-radius:10px;white-space:nowrap}.action-data.svelte-1kukkze.svelte-1kukkze{font-size:11px;color:#555;font-family:SF Mono,Fira Code,monospace;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:200px}.action-btns.svelte-1kukkze.svelte-1kukkze{display:flex;gap:4px;flex-shrink:0}.action-btns.svelte-1kukkze .btn-danger.svelte-1kukkze{color:#ff6b6b;border-color:#4a2222;padding:4px 8px}.action-btns.svelte-1kukkze .btn-danger.svelte-1kukkze:hover{background:#3a2222}.empty-state.svelte-1kukkze.svelte-1kukkze{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:48px 24px;text-align:center}.empty-state.svelte-1kukkze p.svelte-1kukkze{margin:0;font-size:14px;color:#666}.empty-state.svelte-1kukkze .empty-icon.svelte-1kukkze{margin-bottom:12px;color:#444}.empty-state.svelte-1kukkze .hint.svelte-1kukkze{font-size:12px;color:#555;margin-top:6px}.empty-state.svelte-1kukkze .empty-actions.svelte-1kukkze{display:flex;gap:8px;justify-content:center;margin-top:16px}.empty-note.svelte-1kukkze.svelte-1kukkze{font-size:12px;color:#444;margin-top:16px}.welcome.svelte-1kukkze.svelte-1kukkze{padding:48px 24px;text-align:center}.welcome.svelte-1kukkze h2.svelte-1kukkze{font-size:32px;font-weight:300;color:#8888a4;margin-bottom:16px}.welcome.svelte-1kukkze p.svelte-1kukkze{color:#666;font-size:14px}.error-text.svelte-1kukkze.svelte-1kukkze{color:#f88}.fab.svelte-1kukkze.svelte-1kukkze{position:fixed;bottom:24px;right:24px;width:56px;height:56px;border-radius:50%;background:#6366f1;color:#fff;font-size:28px;display:flex;align-items:center;justify-content:center;cursor:pointer;box-shadow:0 4px 12px #6366f166}.fab.svelte-1kukkze.svelte-1kukkze:hover{background:#4f46e5}.modal-overlay.svelte-1kukkze.svelte-1kukkze{position:fixed;top:0;right:0;bottom:0;left:0;background:#0009;display:flex;align-items:center;justify-content:center;z-index:100}.modal.svelte-1kukkze.svelte-1kukkze{background:#1a1a28;border:1px solid #2a2a3c;border-radius:12px;padding:24px;width:400px;max-width:90vw}.modal.svelte-1kukkze h3.svelte-1kukkze{font-size:18px;margin-bottom:16px}.form-group.svelte-1kukkze.svelte-1kukkze{margin-bottom:12px}.form-group.svelte-1kukkze label.svelte-1kukkze{display:block;font-size:12px;color:#666;margin-bottom:4px}.form-group.svelte-1kukkze input.svelte-1kukkze,.form-group.svelte-1kukkze select.svelte-1kukkze{width:100%;padding:8px 12px;border:1px solid #2a2a3c;background:#13131f;color:#e4e4ef;border-radius:4px;font-size:14px;font-family:inherit}.form-group.svelte-1kukkze select.svelte-1kukkze{-moz-appearance:none;appearance:none;-webkit-appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23888' d='M2 4l4 4 4-4'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 10px center;padding-right:32px}.form-group.svelte-1kukkze input.svelte-1kukkze:focus,.form-group.svelte-1kukkze select.svelte-1kukkze:focus{outline:none;border-color:#6366f1}.modal-actions.svelte-1kukkze.svelte-1kukkze{display:flex;gap:8px;justify-content:flex-end;margin-top:16px}.btn.svelte-1kukkze.svelte-1kukkze{padding:8px 16px;border:1px solid #2a2a3c;background:#1a1a28;color:#ccc;border-radius:6px;cursor:pointer;font-size:13px;font-family:inherit}.btn.svelte-1kukkze.svelte-1kukkze:hover{background:#223}.btn-primary.svelte-1kukkze.svelte-1kukkze{background:#6366f1;border-color:#6366f1;color:#fff}.btn-primary.svelte-1kukkze.svelte-1kukkze:hover{background:#4f46e5}.btn.svelte-1kukkze.svelte-1kukkze:disabled{opacity:.4;cursor:not-allowed}.btn-sm.svelte-1kukkze.svelte-1kukkze{padding:4px 10px;font-size:12px}.btn-danger.svelte-1kukkze.svelte-1kukkze{color:#ff6b6b;border-color:#4a2222}.btn-danger.svelte-1kukkze.svelte-1kukkze:hover{background:#3a2222}.files-tab.svelte-1kukkze.svelte-1kukkze{padding:20px}.files-tab.svelte-1kukkze .tab-toolbar.svelte-1kukkze{display:flex;gap:8px;align-items:center;margin-bottom:16px}.file-list.svelte-1kukkze.svelte-1kukkze{display:flex;flex-direction:column}.back-btn.svelte-1kukkze.svelte-1kukkze{margin-bottom:4px;display:inline-flex;align-items:center;gap:4px}.import-summary.svelte-1kukkze.svelte-1kukkze{margin-bottom:16px}.summary-row.svelte-1kukkze.svelte-1kukkze{display:flex;justify-content:space-between;padding:6px 0;font-size:14px;border-bottom:1px solid #2a2a3c}.summary-warn.svelte-1kukkze.svelte-1kukkze{margin-top:8px;padding:8px 12px;background:#3a2a22;border-radius:6px;color:#fa6;font-size:13px}.rename-error.svelte-1kukkze.svelte-1kukkze{color:#ff6b6b;font-size:12px;margin-top:4px}.today-dashboard.svelte-1kukkze.svelte-1kukkze{padding:24px;overflow-y:auto;flex:1}.today-header.svelte-1kukkze.svelte-1kukkze{display:flex;align-items:baseline;gap:12px;margin-bottom:16px}.today-header.svelte-1kukkze h2.svelte-1kukkze{font-size:24px}.today-date.svelte-1kukkze.svelte-1kukkze{font-size:13px;color:#666}.today-summary.svelte-1kukkze.svelte-1kukkze{display:flex;gap:8px;margin-bottom:20px;flex-wrap:wrap}.summary-chip.svelte-1kukkze.svelte-1kukkze{font-size:12px;color:#b0b0c0;background:#1a1a28;border:1px solid #2a2a3c;padding:4px 12px;border-radius:16px}.today-case.svelte-1kukkze.svelte-1kukkze{background:#1a1a28;border:1px solid #2a2a3c;border-radius:8px;margin-bottom:12px;overflow:hidden}.today-case-header.svelte-1kukkze.svelte-1kukkze{padding:12px 16px;display:flex;align-items:center;gap:8px;border-bottom:1px solid #2a2a3c;cursor:pointer}.today-case-header.svelte-1kukkze.svelte-1kukkze:hover{background:#1e1e30}.today-case-title.svelte-1kukkze.svelte-1kukkze{font-weight:500}.today-case-type.svelte-1kukkze.svelte-1kukkze{font-size:11px;color:#888;background:#223;padding:2px 8px;border-radius:10px}.today-case-count.svelte-1kukkze.svelte-1kukkze{font-size:11px;color:#6366f1;margin-left:4px}.today-case-time.svelte-1kukkze.svelte-1kukkze{font-size:11px;color:#555;margin-left:auto}.today-events.svelte-1kukkze.svelte-1kukkze{padding:8px 16px}.today-event.svelte-1kukkze.svelte-1kukkze{display:flex;align-items:center;gap:8px;padding:4px 0;font-size:13px;color:#b0b0c0;cursor:pointer}.today-event.svelte-1kukkze.svelte-1kukkze:hover{color:#e4e4ef}.today-event-icon.svelte-1kukkze.svelte-1kukkze{width:18px;text-align:center;color:#6366f1;font-size:13px}.today-event-title.svelte-1kukkze.svelte-1kukkze{flex:1}.today-event-type.svelte-1kukkze.svelte-1kukkze{font-size:11px;color:#666}.today-event-time.svelte-1kukkze.svelte-1kukkze{font-size:11px;color:#555;margin-left:auto}.today-events-empty.svelte-1kukkze.svelte-1kukkze{padding:8px 16px;font-size:13px;color:#666;font-style:italic}.today-empty.svelte-1kukkze.svelte-1kukkze{padding:48px 24px;text-align:center}.today-empty.svelte-1kukkze p.svelte-1kukkze{color:#666;font-size:14px;margin:0}.today-empty.svelte-1kukkze .hint.svelte-1kukkze{font-size:12px;color:#555;margin-top:8px}.today-timeline.svelte-1kukkze.svelte-1kukkze{margin-top:24px}.today-timeline.svelte-1kukkze h3.svelte-1kukkze{font-size:13px;color:#666;text-transform:uppercase;margin-bottom:12px}.timeline-event.svelte-1kukkze.svelte-1kukkze{display:flex;align-items:center;gap:10px;font-size:13px;color:#b0b0c0;border-left:2px solid #2a2a3c;padding:6px 0 6px 16px;margin-left:4px;cursor:pointer}.timeline-event.svelte-1kukkze.svelte-1kukkze:hover{color:#e4e4ef}.timeline-dot.svelte-1kukkze.svelte-1kukkze{width:6px;height:6px;border-radius:50%;background:#6366f1;margin-left:-19px;flex-shrink:0}.timeline-title.svelte-1kukkze.svelte-1kukkze{flex:1}.timeline-type.svelte-1kukkze.svelte-1kukkze{font-size:11px;color:#666}.timeline-time.svelte-1kukkze.svelte-1kukkze{font-size:11px;color:#555}.activity-tab.svelte-1kukkze.svelte-1kukkze{padding:24px}.activity-events.svelte-1kukkze.svelte-1kukkze{display:flex;flex-direction:column;gap:2px}.activity-event.svelte-1kukkze.svelte-1kukkze{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:6px;font-size:13px;color:#b0b0c0;cursor:pointer}.activity-event.svelte-1kukkze.svelte-1kukkze:hover{background:#1a1a28;color:#e4e4ef}.activity-event-icon.svelte-1kukkze.svelte-1kukkze{width:18px;text-align:center;color:#6366f1;font-size:13px;flex-shrink:0}.activity-event-title.svelte-1kukkze.svelte-1kukkze{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.activity-event-type.svelte-1kukkze.svelte-1kukkze{font-size:11px;color:#666;flex-shrink:0}.activity-event-target.svelte-1kukkze.svelte-1kukkze{font-size:10px;color:#555;background:#1e1e2e;padding:1px 6px;border-radius:8px;flex-shrink:0}.activity-event-time.svelte-1kukkze.svelte-1kukkze{font-size:11px;color:#555;margin-left:8px;flex-shrink:0}.activity-feed.svelte-1kukkze.svelte-1kukkze{padding:24px;overflow-y:auto;flex:1}.activity-feed-header.svelte-1kukkze.svelte-1kukkze{margin-bottom:20px}.activity-feed-header.svelte-1kukkze h2.svelte-1kukkze{font-size:24px}.activity-feed-events.svelte-1kukkze.svelte-1kukkze{display:flex;flex-direction:column;gap:2px}.activity-feed-event.svelte-1kukkze.svelte-1kukkze{display:flex;align-items:flex-start;gap:10px;padding:8px 12px;border-radius:8px;cursor:pointer}.activity-feed-event.svelte-1kukkze.svelte-1kukkze:hover{background:#1a1a28;color:#e4e4ef}.activity-feed-icon.svelte-1kukkze.svelte-1kukkze{width:20px;text-align:center;color:#6366f1;font-size:14px;flex-shrink:0;margin-top:1px}.activity-feed-body.svelte-1kukkze.svelte-1kukkze{flex:1;min-width:0}.activity-feed-title.svelte-1kukkze.svelte-1kukkze{font-size:14px;color:#e4e4ef}.activity-feed-meta.svelte-1kukkze.svelte-1kukkze{display:flex;align-items:center;gap:8px;margin-top:2px}.activity-feed-type.svelte-1kukkze.svelte-1kukkze{font-size:11px;color:#666}.activity-feed-target.svelte-1kukkze.svelte-1kukkze{font-size:10px;color:#555;background:#1e1e2e;padding:1px 6px;border-radius:8px}.activity-feed-time.svelte-1kukkze.svelte-1kukkze{font-size:11px;color:#555}.sidebar-sync-btn.svelte-1kukkze.svelte-1kukkze{background:#1e1e38;border:1px solid #6366f1;border-radius:8px;padding:8px 12px;cursor:pointer;width:100%;display:flex;align-items:center;gap:8px;color:#c0c0f0;font-family:inherit;font-size:13px}.sidebar-sync-btn.svelte-1kukkze.svelte-1kukkze:hover{background:#2a2a50;color:#e4e4ef;border-color:#818cf8}.sidebar-sync-label.svelte-1kukkze.svelte-1kukkze{flex:1;text-align:left}.sync-dot.svelte-1kukkze.svelte-1kukkze{width:8px;height:8px;border-radius:50%;background:#4a4a4a;flex-shrink:0}.sync-dot.active.svelte-1kukkze.svelte-1kukkze{background:#4ade80;box-shadow:0 0 6px #4ade8080}.modal-sync.svelte-1kukkze.svelte-1kukkze{width:460px}.sync-status.svelte-1kukkze.svelte-1kukkze{background:#13131f;border-radius:8px;padding:12px;margin-bottom:16px}.sync-row.svelte-1kukkze.svelte-1kukkze{display:flex;justify-content:space-between;padding:4px 0;font-size:13px}.sync-label.svelte-1kukkze.svelte-1kukkze{color:#666}.sync-value.svelte-1kukkze.svelte-1kukkze{color:#e4e4ef}.sync-value.mono.svelte-1kukkze.svelte-1kukkze{font-family:SF Mono,Fira Code,monospace;font-size:12px}.sync-result.svelte-1kukkze.svelte-1kukkze{font-size:12px;color:#6366f1;padding:4px 0}
diff --git a/cmd/verstak-gui/frontend-dist/assets/main-Dk1pVsWM.js b/cmd/verstak-gui/frontend-dist/assets/main-Dk1pVsWM.js
deleted file mode 100644
index ed0fcc9..0000000
--- a/cmd/verstak-gui/frontend-dist/assets/main-Dk1pVsWM.js
+++ /dev/null
@@ -1,16 +0,0 @@
-var Is=Object.defineProperty;var Ds=(l,e,t)=>e in l?Is(l,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):l[e]=t;var Et=(l,e,t)=>Ds(l,typeof e!="symbol"?e+"":e,t);(function(){const e=document.createElement("link").relList;if(e&&e.supports&&e.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))n(i);new MutationObserver(i=>{for(const o of i)if(o.type==="childList")for(const s of o.addedNodes)s.tagName==="LINK"&&s.rel==="modulepreload"&&n(s)}).observe(document,{childList:!0,subtree:!0});function t(i){const o={};return i.integrity&&(o.integrity=i.integrity),i.referrerPolicy&&(o.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?o.credentials="include":i.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function n(i){if(i.ep)return;i.ep=!0;const o=t(i);fetch(i.href,o)}})();function J(){}function Hn(l){return l()}function ul(){return Object.create(null)}function ae(l){l.forEach(Hn)}function jn(l){return typeof l=="function"}function nt(l,e){return l!=l?e==e:l!==e||l&&typeof l=="object"||typeof l=="function"}let dt;function _t(l,e){return l===e?!0:(dt||(dt=document.createElement("a")),dt.href=e,l===dt.href)}function As(l){return Object.keys(l).length===0}function Ns(l){return l??""}function c(l,e){l.appendChild(e)}function w(l,e,t){l.insertBefore(e,t||null)}function y(l){l.parentNode&&l.parentNode.removeChild(l)}function Me(l,e){for(let t=0;tl.removeEventListener(e,t,n)}function Ve(l){return function(e){return e.stopPropagation(),l.call(this,e)}}function Ze(l){return function(e){e.target===this&&l.call(this,e)}}function r(l,e,t){t==null?l.removeAttribute(e):l.getAttribute(e)!==t&&l.setAttribute(e,t)}function mt(l){return l===""?null:+l}function Es(l){return Array.from(l.childNodes)}function B(l,e){e=""+e,l.data!==e&&(l.data=e)}function ce(l,e){l.value=e??""}function et(l,e,t){for(let n=0;n{const i=l.$$.callbacks[e];if(i){const o=Fs(e,t,{cancelable:n});return i.slice().forEach(s=>{s.call(l,o)}),!o.defaultPrevented}return!0}}function Hs(l,e){const t=l.$$.callbacks[e.type];t&&t.slice().forEach(n=>n.call(this,e))}const xe=[],al=[];let $e=[];const fl=[],js=Promise.resolve();let jt=!1;function Bs(){jt||(jt=!0,js.then(Pn))}function tt(l){$e.push(l)}const Ht=new Set;let Qe=0;function Pn(){if(Qe!==0)return;const l=at;do{try{for(;Qel.indexOf(n)===-1?e.push(n):t.push(n)),t.forEach(n=>n()),$e=e}const pt=new Set;let Xe;function Re(){Xe={r:0,c:[],p:Xe}}function Ke(){Xe.r||ae(Xe.c),Xe=Xe.p}function ke(l,e){l&&l.i&&(pt.delete(l),l.i(e))}function me(l,e,t,n){if(l&&l.o){if(pt.has(l))return;pt.add(l),Xe.c.push(()=>{pt.delete(l),n&&(t&&l.d(1),n())}),l.o(e)}else n&&n()}function ee(l){return(l==null?void 0:l.length)!==void 0?l:Array.from(l)}function Vs(l,e){me(l,1,1,()=>{e.delete(l.key)})}function Rs(l,e,t,n,i,o,s,u,a,d,_,v){let p=l.length,m=o.length,b=p;const C={};for(;b--;)C[l[b].key]=b;const g=[],T=new Map,L=new Map,A=[];for(b=m;b--;){const D=v(i,o,b),M=t(D);let z=s.get(M);z?A.push(()=>z.p(D,e)):(z=d(M,D),z.c()),T.set(M,g[b]=z),M in C&&L.set(M,Math.abs(b-C[M]))}const S=new Set,j=new Set;function P(D){ke(D,1),D.m(u,_),s.set(D.key,D),_=D.first,m--}for(;p&&m;){const D=g[m-1],M=l[p-1],z=D.key,I=M.key;D===M?(_=D.first,p--,m--):T.has(I)?!s.has(z)||S.has(z)?P(D):j.has(I)?p--:L.get(z)>L.get(I)?(j.add(z),P(D)):(S.add(I),p--):(a(M,s),p--)}for(;p--;){const D=l[p];T.has(D.key)||a(D,s)}for(;m;)P(g[m-1]);return ae(A),g}function Ye(l){l&&l.c()}function qe(l,e,t){const{fragment:n,after_update:i}=l.$$;n&&n.m(e,t),tt(()=>{const o=l.$$.on_mount.map(Hn).filter(jn);l.$$.on_destroy?l.$$.on_destroy.push(...o):ae(o),l.$$.on_mount=[]}),i.forEach(tt)}function Ge(l,e){const t=l.$$;t.fragment!==null&&(Ps(t.after_update),ae(t.on_destroy),t.fragment&&t.fragment.d(e),t.on_destroy=t.fragment=null,t.ctx=[])}function Ks(l,e){l.$$.dirty[0]===-1&&(xe.push(l),Bs(),l.$$.dirty.fill(0)),l.$$.dirty[e/31|0]|=1<{const b=m.length?m[0]:p;return d.ctx&&i(d.ctx[v],d.ctx[v]=b)&&(!d.skip_bound&&d.bound[v]&&d.bound[v](b),_&&Ks(l,v)),p}):[],d.update(),_=!0,ae(d.before_update),d.fragment=n?n(d.ctx):!1,e.target){if(e.hydrate){const v=Es(e.target);d.fragment&&d.fragment.l(v),v.forEach(y)}else d.fragment&&d.fragment.c();e.intro&&ke(l.$$.fragment),qe(l,e.target,e.anchor),Pn()}ut(a)}class st{constructor(){Et(this,"$$");Et(this,"$$set")}$destroy(){Ge(this,1),this.$destroy=J}$on(e,t){if(!jn(t))return J;const n=this.$$.callbacks[e]||(this.$$.callbacks[e]=[]);return n.push(t),()=>{const i=n.indexOf(t);i!==-1&&n.splice(i,1)}}$set(e){this.$$set&&!As(e)&&(this.$$.skip_bound=!0,this.$$set(e),this.$$.skip_bound=!1)}}const Ws="4";typeof window<"u"&&(window.__svelte||(window.__svelte={v:new Set})).v.add(Ws);function Us(l){let e,t;return{c(){e=U("path"),t=U("polyline"),r(e,"d","M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"),r(t,"points","14 2 14 8 20 8")},m(n,i){w(n,e,i),w(n,t,i)},d(n){n&&(y(e),y(t))}}}function qs(l){let e,t,n,i,o;return{c(){e=U("path"),t=U("polyline"),n=U("line"),i=U("line"),o=U("polyline"),r(e,"d","M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"),r(t,"points","14 2 14 8 20 8"),r(n,"x1","16"),r(n,"y1","13"),r(n,"x2","8"),r(n,"y2","13"),r(i,"x1","16"),r(i,"y1","17"),r(i,"x2","8"),r(i,"y2","17"),r(o,"points","10 9 9 9 8 9")},m(s,u){w(s,e,u),w(s,t,u),w(s,n,u),w(s,i,u),w(s,o,u)},d(s){s&&(y(e),y(t),y(n),y(i),y(o))}}}function Gs(l){let e,t;return{c(){e=U("polyline"),t=U("polyline"),r(e,"points","16 18 22 12 16 6"),r(t,"points","8 6 2 12 8 18")},m(n,i){w(n,e,i),w(n,t,i)},d(n){n&&(y(e),y(t))}}}function Js(l){let e,t,n,i;return{c(){e=U("path"),t=U("polyline"),n=U("line"),i=U("rect"),r(e,"d","M21 8v13a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8"),r(t,"points","7 3 12 8 17 3"),r(n,"x1","3"),r(n,"y1","8"),r(n,"x2","21"),r(n,"y2","8"),r(i,"x","10"),r(i,"y","12"),r(i,"width","4"),r(i,"height","4"),r(i,"rx","1")},m(o,s){w(o,e,s),w(o,t,s),w(o,n,s),w(o,i,s)},d(o){o&&(y(e),y(t),y(n),y(i))}}}function Xs(l){let e,t,n,i,o;return{c(){e=U("path"),t=U("polyline"),n=U("line"),i=U("line"),o=U("line"),r(e,"d","M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"),r(t,"points","14 2 14 8 20 8"),r(n,"x1","9"),r(n,"y1","12"),r(n,"x2","15"),r(n,"y2","12"),r(i,"x1","9"),r(i,"y1","15"),r(i,"x2","13"),r(i,"y2","15"),r(o,"x1","12"),r(o,"y1","15"),r(o,"x2","12"),r(o,"y2","18")},m(s,u){w(s,e,u),w(s,t,u),w(s,n,u),w(s,i,u),w(s,o,u)},d(s){s&&(y(e),y(t),y(n),y(i),y(o))}}}function Zs(l){let e,t,n,i,o,s;return{c(){e=U("path"),t=U("polyline"),n=U("line"),i=U("line"),o=U("line"),s=U("line"),r(e,"d","M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"),r(t,"points","14 2 14 8 20 8"),r(n,"x1","8"),r(n,"y1","12"),r(n,"x2","16"),r(n,"y2","12"),r(i,"x1","8"),r(i,"y1","16"),r(i,"x2","16"),r(i,"y2","16"),r(o,"x1","8"),r(o,"y1","14"),r(o,"x2","12"),r(o,"y2","14"),r(s,"x1","12"),r(s,"y1","12"),r(s,"x2","12"),r(s,"y2","18")},m(u,a){w(u,e,a),w(u,t,a),w(u,n,a),w(u,i,a),w(u,o,a),w(u,s,a)},d(u){u&&(y(e),y(t),y(n),y(i),y(o),y(s))}}}function Ys(l){let e,t,n,i;return{c(){e=U("path"),t=U("polyline"),n=U("line"),i=U("line"),r(e,"d","M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"),r(t,"points","14 2 14 8 20 8"),r(n,"x1","16"),r(n,"y1","13"),r(n,"x2","8"),r(n,"y2","13"),r(i,"x1","16"),r(i,"y1","17"),r(i,"x2","8"),r(i,"y2","17")},m(o,s){w(o,e,s),w(o,t,s),w(o,n,s),w(o,i,s)},d(o){o&&(y(e),y(t),y(n),y(i))}}}function Qs(l){let e,t,n,i,o;return{c(){e=U("path"),t=U("polyline"),n=U("line"),i=U("line"),o=U("line"),r(e,"d","M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"),r(t,"points","14 2 14 8 20 8"),r(n,"x1","8"),r(n,"y1","12"),r(n,"x2","16"),r(n,"y2","12"),r(i,"x1","8"),r(i,"y1","16"),r(i,"x2","16"),r(i,"y2","16"),r(o,"x1","8"),r(o,"y1","14"),r(o,"x2","12"),r(o,"y2","14")},m(s,u){w(s,e,u),w(s,t,u),w(s,n,u),w(s,i,u),w(s,o,u)},d(s){s&&(y(e),y(t),y(n),y(i),y(o))}}}function xs(l){let e,t,n;return{c(){e=U("path"),t=U("circle"),n=U("circle"),r(e,"d","M9 18V5l12-2v13"),r(t,"cx","6"),r(t,"cy","18"),r(t,"r","3"),r(n,"cx","18"),r(n,"cy","16"),r(n,"r","3")},m(i,o){w(i,e,o),w(i,t,o),w(i,n,o)},d(i){i&&(y(e),y(t),y(n))}}}function $s(l){let e,t;return{c(){e=U("rect"),t=U("polyline"),r(e,"x","2"),r(e,"y","4"),r(e,"width","20"),r(e,"height","16"),r(e,"rx","2"),r(t,"points","10 9 16 12 10 15 10 9")},m(n,i){w(n,e,i),w(n,t,i)},d(n){n&&(y(e),y(t))}}}function eo(l){let e,t,n;return{c(){e=U("rect"),t=U("circle"),n=U("polyline"),r(e,"x","3"),r(e,"y","3"),r(e,"width","18"),r(e,"height","18"),r(e,"rx","2"),r(e,"ry","2"),r(t,"cx","8.5"),r(t,"cy","8.5"),r(t,"r","1.5"),r(n,"points","21 15 16 10 5 21")},m(i,o){w(i,e,o),w(i,t,o),w(i,n,o)},d(i){i&&(y(e),y(t),y(n))}}}function to(l){let e;return{c(){e=U("path"),r(e,"d","M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z")},m(t,n){w(t,e,n)},d(t){t&&y(e)}}}function lo(l){let e;function t(o,s){return o[0]==="folder"?to:o[0]==="image"?eo:o[0]==="video"?$s:o[0]==="audio"?xs:o[0]==="pdf"?Qs:o[0]==="document"?Ys:o[0]==="spreadsheet"?Zs:o[0]==="presentation"?Xs:o[0]==="archive"?Js:o[0]==="code"?Gs:o[0]==="text"?qs:Us}let n=t(l),i=n(l);return{c(){e=U("svg"),i.c(),r(e,"width",l[1]),r(e,"height",l[1]),r(e,"viewBox","0 0 24 24"),r(e,"fill","none"),r(e,"stroke","currentColor"),r(e,"stroke-width","1.5"),r(e,"stroke-linecap","round"),r(e,"stroke-linejoin","round"),r(e,"xmlns","http://www.w3.org/2000/svg")},m(o,s){w(o,e,s),i.m(e,null)},p(o,[s]){n!==(n=t(o))&&(i.d(1),i=n(o),i&&(i.c(),i.m(e,null))),s&2&&r(e,"width",o[1]),s&2&&r(e,"height",o[1])},i:J,o:J,d(o){o&&y(e),i.d()}}}function no(l,e,t){let{kind:n="generic"}=e,{size:i=20}=e;return l.$$set=o=>{"kind"in o&&t(0,n=o.kind),"size"in o&&t(1,i=o.size)},[n,i]}class Vn extends st{constructor(e){super(),it(this,e,no,lo,nt,{kind:0,size:1})}}function ht(l){if(l==null||l<0)return"—";if(l===0)return"0 B";const e=["B","KB","MB","GB"],t=Math.min(Math.floor(Math.log(l)/Math.log(1024)),e.length-1),n=l/Math.pow(1024,t);return(t===0?n.toFixed(0):n.toFixed(1))+" "+e[t]}const Bt={"image/jpeg":"Изображение JPEG","image/png":"Изображение PNG","image/gif":"Изображение GIF","image/webp":"Изображение WebP","image/svg+xml":"Изображение SVG","image/bmp":"Изображение BMP","image/tiff":"Изображение TIFF","image/avif":"Изображение AVIF","application/pdf":"PDF документ","application/msword":"Документ Word","application/vnd.openxmlformats-officedocument.wordprocessingml.document":"Документ Word","application/vnd.ms-excel":"Таблица Excel","application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":"Таблица Excel","application/vnd.ms-powerpoint":"Презентация PowerPoint","application/vnd.openxmlformats-officedocument.presentationml.presentation":"Презентация PowerPoint","application/zip":"ZIP архив","application/gzip":"GZIP архив","application/x-tar":"TAR архив","application/x-7z-compressed":"7z архив","application/x-rar-compressed":"RAR архив","text/plain":"Текстовый файл","text/html":"HTML файл","text/css":"CSS файл","text/javascript":"JavaScript файл","application/json":"JSON файл","application/xml":"XML файл","application/x-yaml":"YAML файл","application/octet-stream":"Бинарный файл","application/x-msdos-program":"Исполняемый файл","inode/directory":"Папка"};function kl(l){return l?Bt[l]||l:"Неизвестно"}function io(l){if(l.type==="folder")return"Папка";const e=(l.mime||"").toLowerCase();if(Bt[e])return Bt[e];const n=(l.name||"").toLowerCase().split(".").pop();return n?n.toUpperCase():"Файл"}function Rn(l){if(l.type==="folder")return"folder";const e=(l.mime||"").toLowerCase();if(e.startsWith("image/"))return"image";if(e.startsWith("video/"))return"video";if(e.startsWith("audio/"))return"audio";if(e.startsWith("text/"))return"text";if(e.includes("pdf"))return"pdf";if(e.includes("word")||e.includes("document"))return"document";if(e.includes("spreadsheet")||e.includes("excel"))return"spreadsheet";if(e.includes("presentation")||e.includes("powerpoint"))return"presentation";if(e.includes("zip")||e.includes("tar")||e.includes("gzip")||e.includes("rar")||e.includes("7z")||e.includes("compress"))return"archive";if(e.includes("json")||e.includes("xml")||e.includes("yaml")||e.includes("javascript")||e.includes("css")||e.includes("html"))return"code";const n=(l.name||"").toLowerCase().split(".").pop();return["js","ts","jsx","tsx","vue","svelte","py","rs","go","c","cpp","h","hpp","java","kt","swift","rb","php","pl","sh","bash","zsh","fish","yml","yaml","json","xml","toml","ini","cfg","conf","md","markdown","css","scss","less","sass","sql","graphql","proto","gradle","cmake","makefile","dockerfile","env","gitignore"].includes(n)?"code":"generic"}const so=["image/jpeg","image/png","image/gif","image/webp","image/bmp","image/tiff","image/avif","image/svg+xml"],oo=["text/plain","text/html","text/css","text/javascript","application/json","application/xml","application/x-yaml","text/x-shellscript"],ro=["txt","log","conf","ini","yaml","yml","json","xml","csv","sh","py","js","ts","css","html","md","markdown","cfg"],co=["jpg","jpeg","png","gif","webp","bmp","tiff","tif","avif","svg"];function Kn(l){const e=(l.mime||"").toLowerCase(),n=(l.name||"").toLowerCase().split(".").pop();return so.includes(e)||co.includes(n)}function Wn(l){const e=(l.mime||"").toLowerCase(),n=(l.name||"").toLowerCase().split(".").pop();return oo.includes(e)||ro.includes(n)&&n!=="md"&&n!=="markdown"}function Un(l){return(l.mime||"").toLowerCase().includes("pdf")}function qn(l){const e=(l.name||"").toLowerCase();return e.endsWith(".md")||e.endsWith(".markdown")}function uo(l){return Kn(l)||Un(l)}function ao(l){return Wn(l)||qn(l)}function fo(l){let e,t,n,i=ht(l[0].size)+"",o;return{c(){e=f("span"),e.textContent="·",t=h(),n=f("span"),o=N(i),r(e,"class","meta-sep svelte-1u905d2")},m(s,u){w(s,e,u),w(s,t,u),w(s,n,u),c(n,o)},p(s,u){u&1&&i!==(i=ht(s[0].size)+"")&&B(o,i)},d(s){s&&(y(e),y(t),y(n))}}}function ko(l){let e,t,n;return{c(){e=f("button"),e.innerHTML=' ',r(e,"class","action-btn svelte-1u905d2"),r(e,"title","Открыть папку"),r(e,"aria-label","Открыть папку")},m(i,o){w(i,e,o),t||(n=H(e,"click",Ve(l[27])),t=!0)},p:J,d(i){i&&y(e),t=!1,n()}}}function po(l){let e,t,n,i,o;return{c(){e=f("button"),e.innerHTML=' ',t=h(),n=f("button"),n.innerHTML=' ',r(e,"class","action-btn svelte-1u905d2"),r(e,"title","Предпросмотр"),r(e,"aria-label","Предпросмотр"),r(n,"class","action-btn svelte-1u905d2"),r(n,"title","Открыть во внешней программе"),r(n,"aria-label","Открыть внешне")},m(s,u){w(s,e,u),w(s,t,u),w(s,n,u),i||(o=[H(e,"click",Ve(l[26])),H(n,"click",Ve(l[8]))],i=!0)},p:J,d(s){s&&(y(e),y(t),y(n)),i=!1,ae(o)}}}function dl(l){let e,t,n,i,o,s,u,a,d,_,v,p,m,b,C,g,T,L,A,S,j,P,D,M=l[5]&&_o(l);return{c(){e=f("div"),t=h(),n=f("div"),i=f("button"),i.innerHTML=`
- Открыть`,o=h(),s=f("button"),s.innerHTML=`
- Открыть во внешней программе`,u=h(),M&&M.c(),a=h(),d=f("div"),_=h(),v=f("button"),v.innerHTML=`
- Переименовать`,p=h(),m=f("button"),m.innerHTML=`
- Дублировать`,b=h(),C=f("button"),C.innerHTML=`
- Вырезать`,g=h(),T=f("button"),T.innerHTML=`
- Копировать`,L=h(),A=f("div"),S=h(),j=f("button"),j.innerHTML=`
- Удалить`,r(e,"class","menu-backdrop svelte-1u905d2"),r(e,"role","presentation"),r(i,"class","menu-item svelte-1u905d2"),r(i,"role","menuitem"),r(s,"class","menu-item svelte-1u905d2"),r(s,"role","menuitem"),r(d,"class","menu-sep svelte-1u905d2"),r(v,"class","menu-item svelte-1u905d2"),r(v,"role","menuitem"),r(m,"class","menu-item svelte-1u905d2"),r(m,"role","menuitem"),r(C,"class","menu-item svelte-1u905d2"),r(C,"role","menuitem"),r(T,"class","menu-item svelte-1u905d2"),r(T,"role","menuitem"),r(A,"class","menu-sep svelte-1u905d2"),r(j,"class","menu-item menu-item-danger svelte-1u905d2"),r(j,"role","menuitem"),r(n,"class","menu svelte-1u905d2"),r(n,"role","menu")},m(z,I){w(z,e,I),w(z,t,I),w(z,n,I),c(n,i),c(n,o),c(n,s),c(n,u),M&&M.m(n,null),c(n,a),c(n,d),c(n,_),c(n,v),c(n,p),c(n,m),c(n,b),c(n,C),c(n,g),c(n,T),c(n,L),c(n,A),c(n,S),c(n,j),P||(D=[H(e,"click",Ve(l[17])),H(i,"click",l[15]),H(s,"click",l[8]),H(v,"click",l[11]),H(m,"click",l[12]),H(C,"click",l[13]),H(T,"click",l[14]),H(j,"click",l[10]),H(n,"click",Ve(l[25]))],P=!0)},p(z,I){z[5]&&M.p(z,I)},d(z){z&&(y(e),y(t),y(n)),M&&M.d(),P=!1,ae(D)}}}function _o(l){let e,t,n;return{c(){e=f("button"),e.innerHTML=`
- Показать в проводнике`,r(e,"class","menu-item svelte-1u905d2"),r(e,"role","menuitem")},m(i,o){w(i,e,o),t||(n=H(e,"click",l[9]),t=!0)},p:J,d(i){i&&y(e),t=!1,n()}}}function mo(l){let e,t,n,i,o,s,u=l[0].name+"",a,d,_,v,p,m,b,C,g,T,L,A,S,j,P,D,M,z,I,O,q,Z;n=new Vn({props:{kind:l[4],size:22}});let R=!l[5]&&fo(l);function K(G,se){return G[5]?ko:po}let W=K(l)(l),ne=l[2]&&dl(l);return{c(){e=f("div"),t=f("div"),Ye(n.$$.fragment),i=h(),o=f("div"),s=f("div"),a=N(u),_=h(),v=f("div"),p=f("span"),p.textContent=`${l[6]}`,m=h(),R&&R.c(),b=h(),C=f("div"),W.c(),g=h(),T=f("button"),L=U("svg"),A=U("circle"),S=U("circle"),j=U("circle"),P=h(),D=f("button"),D.innerHTML=' ',z=h(),ne&&ne.c(),I=Pe(),r(t,"class","file-row-icon svelte-1u905d2"),r(s,"class","file-row-name svelte-1u905d2"),r(s,"title",d=l[0].name),r(v,"class","file-row-meta svelte-1u905d2"),r(o,"class","file-row-body svelte-1u905d2"),r(A,"cx","12"),r(A,"cy","5"),r(A,"r","2"),r(S,"cx","12"),r(S,"cy","12"),r(S,"r","2"),r(j,"cx","12"),r(j,"cy","19"),r(j,"r","2"),r(L,"width","16"),r(L,"height","16"),r(L,"viewBox","0 0 24 24"),r(L,"fill","currentColor"),r(T,"class","action-btn svelte-1u905d2"),r(T,"title","Ещё"),r(T,"aria-label","Ещё"),r(T,"aria-expanded",l[2]),r(D,"class","action-btn action-btn-danger svelte-1u905d2"),r(D,"title","Удалить"),r(D,"aria-label","Удалить"),r(C,"class","file-row-actions svelte-1u905d2"),r(e,"class","file-row svelte-1u905d2"),r(e,"role","button"),r(e,"tabindex","0"),r(e,"draggable","true"),r(e,"aria-label",M=l[5]?`Папка ${l[0].name}`:`Файл ${l[0].name}`),vt(e,"file-row--selected",l[1])},m(G,se){w(G,e,se),c(e,t),qe(n,t,null),c(e,i),c(e,o),c(o,s),c(s,a),c(o,_),c(o,v),c(v,p),c(v,m),R&&R.m(v,null),c(e,b),c(e,C),W.m(C,null),c(C,g),c(C,T),c(T,L),c(L,A),c(L,S),c(L,j),c(C,P),c(C,D),w(G,z,se),ne&&ne.m(G,se),w(G,I,se),O=!0,q||(Z=[H(window,"click",l[17]),H(T,"click",Ve(l[16])),H(D,"click",Ve(l[10])),H(e,"click",l[7]),H(e,"contextmenu",l[21]),H(e,"dragstart",l[18]),H(e,"dragover",l[19]),H(e,"drop",l[20])],q=!0)},p(G,[se]){(!O||se&1)&&u!==(u=G[0].name+"")&&B(a,u),(!O||se&1&&d!==(d=G[0].name))&&r(s,"title",d),G[5]||R.p(G,se),W.p(G,se),(!O||se&4)&&r(T,"aria-expanded",G[2]),(!O||se&1&&M!==(M=G[5]?`Папка ${G[0].name}`:`Файл ${G[0].name}`))&&r(e,"aria-label",M),(!O||se&2)&&vt(e,"file-row--selected",G[1]),G[2]?ne?ne.p(G,se):(ne=dl(G),ne.c(),ne.m(I.parentNode,I)):ne&&(ne.d(1),ne=null)},i(G){O||(ke(n.$$.fragment,G),O=!0)},o(G){me(n.$$.fragment,G),O=!1},d(G){G&&(y(e),y(z),y(I)),Ge(n),R&&R.d(),W.d(),ne&&ne.d(G),q=!1,ae(Z)}}}function vo(l,e,t){let{item:n}=e,{selected:i=!1}=e,{onDragStart:o}=e,{onDragOver:s}=e,{onDrop:u}=e;const a=bt(),d=Rn(n),_=n.type==="folder",v=io(n);let p=!1,m=null;function b(E){E.ctrlKey||E.metaKey?a("toggleSelect",n.id):E.shiftKey?a("rangeSelect",n.id):m?(clearTimeout(m),m=null,_?a("navigate",n.id):a("preview",n)):m=setTimeout(()=>{m=null,a("selectOne",n.id)},250)}function C(){a("openExternal",n.fileId)}function g(){a("showInFolder",n.id)}function T(){t(2,p=!1),a("delete",{id:n.id,type:n.type})}function L(){t(2,p=!1),a("rename",{id:n.id,name:n.name})}function A(){t(2,p=!1),a("duplicate",n.id)}function S(){t(2,p=!1),a("cut",n.id)}function j(){t(2,p=!1),a("copy",n.id)}function P(){t(2,p=!1),_?a("navigate",n.id):a("preview",n)}function D(){t(2,p=!p)}function M(){t(2,p=!1)}function z(E){o&&o(E,n.id)}function I(E){s&&_&&s(E,n.id)}function O(E){u&&_&&u(E,n.id)}function q(E){E.preventDefault(),t(2,p=!0)}function Z(E){Hs.call(this,l,E)}const R=()=>a("preview",n),K=()=>a("navigate",n.id);return l.$$set=E=>{"item"in E&&t(0,n=E.item),"selected"in E&&t(1,i=E.selected),"onDragStart"in E&&t(22,o=E.onDragStart),"onDragOver"in E&&t(23,s=E.onDragOver),"onDrop"in E&&t(24,u=E.onDrop)},[n,i,p,a,d,_,v,b,C,g,T,L,A,S,j,P,D,M,z,I,O,q,o,s,u,Z,R,K]}class ho extends st{constructor(e){super(),it(this,e,vo,mo,nt,{item:0,selected:1,onDragStart:22,onDragOver:23,onDrop:24})}}function pl(l,e,t){const n=l.slice();return n[4]=e[t],n[6]=t,n}function bo(l){let e;return{c(){e=f("span"),e.textContent="/",r(e,"class","sep svelte-csi2lb")},m(t,n){w(t,e,n)},d(t){t&&y(e)}}}function go(l){let e,t=l[4].name+"",n,i,o;function s(){return l[2](l[6])}return{c(){e=f("button"),n=N(t),r(e,"class","crumb crumb--link svelte-csi2lb")},m(u,a){w(u,e,a),c(e,n),i||(o=H(e,"click",s),i=!0)},p(u,a){l=u,a&1&&t!==(t=l[4].name+"")&&B(n,t)},d(u){u&&y(e),i=!1,o()}}}function yo(l){let e,t=l[4].name+"",n;return{c(){e=f("span"),n=N(t),r(e,"class","crumb crumb--current svelte-csi2lb")},m(i,o){w(i,e,o),c(e,n)},p(i,o){o&1&&t!==(t=i[4].name+"")&&B(n,t)},d(i){i&&y(e)}}}function _l(l){let e,t,n=l[6]>0&&bo();function i(u,a){return u[6]===u[0].length-1?yo:go}let o=i(l),s=o(l);return{c(){n&&n.c(),e=h(),s.c(),t=Pe()},m(u,a){n&&n.m(u,a),w(u,e,a),s.m(u,a),w(u,t,a)},p(u,a){o===(o=i(u))&&s?s.p(u,a):(s.d(1),s=o(u),s&&(s.c(),s.m(t.parentNode,t)))},d(u){u&&(y(e),y(t)),n&&n.d(u),s.d(u)}}}function wo(l){let e,t=ee(l[0]),n=[];for(let i=0;io(u);return l.$$set=u=>{"crumbs"in u&&t(0,n=u.crumbs)},[n,o,s]}class Gn extends st{constructor(e){super(),it(this,e,zo,wo,nt,{crumbs:0})}}function Co(l){let e,t,n,i,o,s;return{c(){e=f("div"),t=f("p"),t.textContent="Предпросмотр недоступен для этого типа файлов.",n=h(),i=f("button"),i.textContent="Открыть во внешней программе",r(i,"class","btn btn-sm svelte-1cw3u0m"),r(e,"class","preview-status svelte-1cw3u0m")},m(u,a){w(u,e,a),c(e,t),c(e,n),c(e,i),o||(s=H(i,"click",l[9]),o=!0)},p:J,d(u){u&&y(e),o=!1,s()}}}function To(l){let e,t;function n(s,u){return u&2&&(e=null),e==null&&(e=!!(s[1]&&s[1].startsWith("data:"))),e?Ao:Do}let i=n(l,-1),o=i(l);return{c(){o.c(),t=Pe()},m(s,u){o.m(s,u),w(s,t,u)},p(s,u){i===(i=n(s,u))&&o?o.p(s,u):(o.d(1),o=i(s),o&&(o.c(),o.m(t.parentNode,t)))},d(s){s&&y(t),o.d(s)}}}function Mo(l){let e,t,n;return{c(){e=f("pre"),t=f("code"),n=N(l[1]),r(e,"class","preview-text svelte-1cw3u0m")},m(i,o){w(i,e,o),c(e,t),c(t,n)},p(i,o){o&2&&B(n,i[1])},d(i){i&&y(e)}}}function So(l){let e,t,n,i;return{c(){e=f("div"),t=f("img"),_t(t.src,n=l[1])||r(t,"src",n),r(t,"alt",i=l[0].name),r(t,"class","preview-image svelte-1cw3u0m"),r(e,"class","preview-image-container svelte-1cw3u0m")},m(o,s){w(o,e,s),c(e,t)},p(o,s){s&2&&!_t(t.src,n=o[1])&&r(t,"src",n),s&1&&i!==(i=o[0].name)&&r(t,"alt",i)},d(o){o&&y(e)}}}function Lo(l){let e,t,n,i,o,s,u;return{c(){e=f("div"),t=f("p"),n=N(l[3]),i=h(),o=f("button"),o.textContent="Открыть во внешней программе",r(o,"class","btn btn-sm svelte-1cw3u0m"),r(e,"class","preview-status svelte-1cw3u0m")},m(a,d){w(a,e,d),c(e,t),c(t,n),c(e,i),c(e,o),s||(u=H(o,"click",l[9]),s=!0)},p(a,d){d&8&&B(n,a[3])},d(a){a&&y(e),s=!1,u()}}}function Io(l){let e;return{c(){e=f("div"),e.innerHTML="Загрузка...
",r(e,"class","preview-status svelte-1cw3u0m")},m(t,n){w(t,e,n)},p:J,d(t){t&&y(e)}}}function Do(l){let e,t,n,i,o,s;return{c(){e=f("div"),t=f("p"),t.textContent="Предпросмотр PDF недоступен.",n=h(),i=f("button"),i.textContent="Открыть во внешней программе",r(i,"class","btn btn-sm svelte-1cw3u0m"),r(e,"class","preview-status svelte-1cw3u0m")},m(u,a){w(u,e,a),c(e,t),c(e,n),c(e,i),o||(s=H(i,"click",l[9]),o=!0)},p:J,d(u){u&&y(e),o=!1,s()}}}function Ao(l){let e,t,n;return{c(){e=f("div"),t=f("embed"),_t(t.src,n=l[1])||r(t,"src",n),r(t,"type","application/pdf"),r(t,"class","preview-pdf svelte-1cw3u0m"),r(e,"class","preview-pdf-container svelte-1cw3u0m")},m(i,o){w(i,e,o),c(e,t)},p(i,o){o&2&&!_t(t.src,n=i[1])&&r(t,"src",n)},d(i){i&&y(e)}}}function No(l){let e,t,n,i,o,s,u,a=l[0].name+"",d,_,v,p,m=ht(l[0].size)+"",b,C,g=kl(l[0].mime)+"",T,L,A,S,j,P,D,M,z,I,O,q;o=new Vn({props:{kind:l[8],size:18}});function Z(E,W){return E[2]?Io:E[3]?Lo:E[6]&&E[1]?So:E[5]&&E[1]?Mo:E[4]?To:Co}let R=Z(l),K=R(l);return{c(){e=f("div"),t=f("div"),n=f("header"),i=f("div"),Ye(o.$$.fragment),s=h(),u=f("span"),d=N(a),v=h(),p=f("div"),b=N(m),C=N(" · "),T=N(g),L=h(),A=f("div"),S=f("button"),S.innerHTML=' ',j=h(),P=f("button"),P.innerHTML=' ',D=h(),M=f("div"),K.c(),r(u,"class","preview-name svelte-1cw3u0m"),r(u,"title",_=l[0].name),r(i,"class","preview-title svelte-1cw3u0m"),r(p,"class","preview-meta svelte-1cw3u0m"),r(S,"class","action-btn svelte-1cw3u0m"),r(S,"title","Открыть во внешней программе"),r(S,"aria-label","Открыть внешне"),r(P,"class","action-btn action-btn-close svelte-1cw3u0m"),r(P,"title","Close"),r(P,"aria-label","Close preview"),r(A,"class","preview-actions svelte-1cw3u0m"),r(n,"class","preview-header svelte-1cw3u0m"),r(M,"class","preview-body svelte-1cw3u0m"),r(t,"class","modal svelte-1cw3u0m"),r(e,"class","overlay svelte-1cw3u0m"),r(e,"role","dialog"),r(e,"aria-modal","true"),r(e,"aria-label",z=`Preview: ${l[0].name}`)},m(E,W){w(E,e,W),c(e,t),c(t,n),c(n,i),qe(o,i,null),c(i,s),c(i,u),c(u,d),c(n,v),c(n,p),c(p,b),c(p,C),c(p,T),c(n,L),c(n,A),c(A,S),c(A,j),c(A,P),c(t,D),c(t,M),K.m(M,null),I=!0,O||(q=[H(S,"click",l[9]),H(P,"click",l[10]),H(e,"click",Ze(l[11]))],O=!0)},p(E,[W]){(!I||W&1)&&a!==(a=E[0].name+"")&&B(d,a),(!I||W&1&&_!==(_=E[0].name))&&r(u,"title",_),(!I||W&1)&&m!==(m=ht(E[0].size)+"")&&B(b,m),(!I||W&1)&&g!==(g=kl(E[0].mime)+"")&&B(T,g),R===(R=Z(E))&&K?K.p(E,W):(K.d(1),K=R(E),K&&(K.c(),K.m(M,null))),(!I||W&1&&z!==(z=`Preview: ${E[0].name}`))&&r(e,"aria-label",z)},i(E){I||(ke(o.$$.fragment,E),I=!0)},o(E){me(o.$$.fragment,E),I=!1},d(E){E&&y(e),Ge(o),K.d(),O=!1,ae(q)}}}function Eo(l,e,t){let n,i,o,{item:s}=e,{content:u=""}=e,{loading:a=!1}=e,{error:d=""}=e;const _=bt(),v=Rn(s);function p(g){g.key==="Escape"&&_("close")}function m(){_("openExternal",s.fileId)}Bn(()=>{window.addEventListener("keydown",p)}),On(()=>{window.removeEventListener("keydown",p)});const b=()=>_("close"),C=()=>_("close");return l.$$set=g=>{"item"in g&&t(0,s=g.item),"content"in g&&t(1,u=g.content),"loading"in g&&t(2,a=g.loading),"error"in g&&t(3,d=g.error)},l.$$.update=()=>{l.$$.dirty&3&&t(6,n=Kn(s)&&u&&u.startsWith("data:")),l.$$.dirty&1&&t(5,i=Wn(s)||qn(s)),l.$$.dirty&1&&t(4,o=Un(s))},[s,u,a,d,o,i,n,_,v,m,b,C]}class Fo extends st{constructor(e){super(),it(this,e,Eo,No,nt,{item:0,content:1,loading:2,error:3})}}function Ho(l){let e,t,n,i,o,s,u,a,d,_,v,p,m,b,C,g,T;return{c(){e=f("div"),t=f("div"),n=f("h3"),i=N(l[0]),o=h(),s=f("p"),u=N(l[1]),a=h(),d=f("div"),_=f("button"),v=N(l[2]),m=h(),b=f("button"),C=N(l[3]),r(n,"class","svelte-1fv6yyk"),r(s,"class","message svelte-1fv6yyk"),r(_,"class",p="btn "+(l[4]?"btn-danger":"btn-primary")+" svelte-1fv6yyk"),r(b,"class","btn svelte-1fv6yyk"),r(d,"class","actions svelte-1fv6yyk"),r(t,"class","modal svelte-1fv6yyk"),r(e,"class","overlay svelte-1fv6yyk"),r(e,"role","dialog"),r(e,"aria-modal","true"),r(e,"aria-label",l[0])},m(L,A){w(L,e,A),c(e,t),c(t,n),c(n,i),c(t,o),c(t,s),c(s,u),c(t,a),c(t,d),c(d,_),c(_,v),c(d,m),c(d,b),c(b,C),g||(T=[H(_,"click",l[6]),H(b,"click",l[7]),H(e,"click",Ze(l[8]))],g=!0)},p(L,[A]){A&1&&B(i,L[0]),A&2&&B(u,L[1]),A&4&&B(v,L[2]),A&16&&p!==(p="btn "+(L[4]?"btn-danger":"btn-primary")+" svelte-1fv6yyk")&&r(_,"class",p),A&8&&B(C,L[3]),A&1&&r(e,"aria-label",L[0])},i:J,o:J,d(L){L&&y(e),g=!1,ae(T)}}}function jo(l,e,t){let{title:n="Подтверждение"}=e,{message:i=""}=e,{confirmText:o="Удалить"}=e,{cancelText:s="Отмена"}=e,{danger:u=!1}=e;const a=bt(),d=()=>a("confirm"),_=()=>a("cancel"),v=()=>a("cancel");return l.$$set=p=>{"title"in p&&t(0,n=p.title),"message"in p&&t(1,i=p.message),"confirmText"in p&&t(2,o=p.confirmText),"cancelText"in p&&t(3,s=p.cancelText),"danger"in p&&t(4,u=p.danger)},[n,i,o,s,u,a,d,_,v]}class Bo extends st{constructor(e){super(),it(this,e,jo,Ho,nt,{title:0,message:1,confirmText:2,cancelText:3,danger:4})}}function ml(l,e,t){const n=l.slice();return n[199]=e[t],n}function vl(l,e,t){const n=l.slice();return n[202]=e[t],n}function hl(l,e,t){const n=l.slice();return n[205]=e[t],n}function bl(l,e,t){const n=l.slice();return n[224]=e[t],n}function gl(l,e,t){const n=l.slice();return n[224]=e[t],n}function yl(l,e,t){const n=l.slice();return n[232]=e[t],n}function wl(l,e,t){const n=l.slice();return n[224]=e[t],n}function zl(l,e,t){const n=l.slice();return n[224]=e[t],n}function Cl(l,e,t){const n=l.slice();return n[208]=e[t],n}function Tl(l,e,t){const n=l.slice();return n[219]=e[t],n}function Ml(l,e,t){const n=l.slice();return n[216]=e[t],n}function Sl(l,e,t){const n=l.slice();return n[211]=e[t],n}function Ll(l,e,t){const n=l.slice();return n[208]=e[t],n}function Il(l,e,t){const n=l.slice();return n[211]=e[t],n}function Dl(l,e,t){const n=l.slice();return n[227]=e[t],n}function Al(l,e,t){const n=l.slice();return n[205]=e[t],n}function Nl(l,e,t){const n=l.slice();return n[241]=e[t],n}function El(l,e,t){const n=l.slice();return n[244]=e[t],n}function Fl(l){let e,t=l[244].label+"",n,i,o,s,u;function a(){return l[112](l[244])}return{c(){e=f("button"),n=N(t),i=h(),r(e,"class",o="nav-item "+(l[7]===l[244].id?"selected":"")+" svelte-1kukkze")},m(d,_){w(d,e,_),c(e,n),c(e,i),s||(u=H(e,"click",a),s=!0)},p(d,_){l=d,_[0]&1&&t!==(t=l[244].label+"")&&B(n,t),_[0]&129&&o!==(o="nav-item "+(l[7]===l[244].id?"selected":"")+" svelte-1kukkze")&&r(e,"class",o)},d(d){d&&y(e),s=!1,u()}}}function Hl(l){let e,t,n,i,o,s=l[1].length>0&&jl(l),u=ee(l[1]),a=[];for(let _=0;_0?s?s.p(_,v):(s=jl(_),s.c(),s.m(t,null)):s&&(s.d(1),s=null),v[0]&258|v[1]&536870912){u=ee(_[1]);let p;for(p=0;p0&&Rl(l);return{c(){e=f("button"),t=U("svg"),n=U("polyline"),i=U("polyline"),o=U("path"),s=h(),d&&d.c(),r(n,"points","23 4 23 10 17 10"),r(n,"class","svelte-1kukkze"),r(i,"points","1 20 1 14 7 14"),r(i,"class","svelte-1kukkze"),r(o,"d","M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15"),r(o,"class","svelte-1kukkze"),r(t,"width","16"),r(t,"height","16"),r(t,"viewBox","0 0 24 24"),r(t,"fill","none"),r(t,"stroke","currentColor"),r(t,"stroke-width","2"),r(t,"stroke-linecap","round"),r(t,"stroke-linejoin","round"),r(t,"class","svelte-1kukkze"),r(e,"class","header-sync-btn svelte-1kukkze"),e.disabled=l[51],r(e,"title","Синхронизировать")},m(_,v){w(_,e,v),c(e,t),c(t,n),c(t,i),c(t,o),c(e,s),d&&d.m(e,null),u||(a=H(e,"click",l[111]),u=!0)},p(_,v){_[50].unpushedOps>0?d?d.p(_,v):(d=Rl(_),d.c(),d.m(e,null)):d&&(d.d(1),d=null),v[1]&1048576&&(e.disabled=_[51])},d(_){_&&y(e),d&&d.d(),u=!1,a()}}}function Rl(l){let e,t=l[50].unpushedOps+"",n;return{c(){e=f("span"),n=N(t),r(e,"class","sync-badge svelte-1kukkze")},m(i,o){w(i,e,o),c(e,n)},p(i,o){o[1]&524288&&t!==(t=i[50].unpushedOps+"")&&B(n,t)},d(i){i&&y(e)}}}function Kl(l){let e,t,n,i,o,s;return{c(){e=f("div"),t=N(l[6]),n=h(),i=f("button"),i.innerHTML=' ',r(i,"class","dismiss-btn svelte-1kukkze"),r(i,"aria-label","Dismiss"),r(e,"class","error-banner svelte-1kukkze")},m(u,a){w(u,e,a),c(e,t),c(e,n),c(e,i),o||(s=[H(i,"click",Ve(l[114])),H(e,"click",l[115])],o=!0)},p(u,a){a[0]&64&&B(t,u[6])},d(u){u&&y(e),o=!1,ae(s)}}}function Ro(l){let e,t,n;function i(u,a){if(u[27])return Xo;if(u[0].length>0)return Jo;if(u[6])return Go}let o=i(l),s=o&&o(l);return{c(){e=f("div"),t=f("h2"),t.textContent="Верстак",n=h(),s&&s.c(),r(t,"class","svelte-1kukkze"),r(e,"class","welcome svelte-1kukkze")},m(u,a){w(u,e,a),c(e,t),c(e,n),s&&s.m(e,null)},p(u,a){o===(o=i(u))&&s?s.p(u,a):(s&&s.d(1),s=o&&o(u),s&&(s.c(),s.m(e,null)))},i:J,o:J,d(u){u&&y(e),s&&s.d()}}}function Ko(l){let e,t,n;function i(u,a){return u[3].length===0?Yo:Zo}let o=i(l),s=o(l);return{c(){e=f("div"),t=f("div"),t.innerHTML='Активность ',n=h(),s.c(),r(t,"class","activity-feed-header svelte-1kukkze"),r(e,"class","activity-feed svelte-1kukkze")},m(u,a){w(u,e,a),c(e,t),c(e,n),s.m(e,null)},p(u,a){o===(o=i(u))&&s?s.p(u,a):(s.d(1),s=o(u),s&&(s.c(),s.m(e,null)))},i:J,o:J,d(u){u&&y(e),s.d()}}}function Wo(l){let e,t,n,i,o,s=l[2].date+"",u,a,d,_=l[2].summary&&ql(l);function v(b,C){return b[2].groups&&b[2].groups.length>0?xo:Qo}let p=v(l),m=p(l);return{c(){e=f("div"),t=f("div"),n=f("h2"),n.textContent="Сегодня",i=h(),o=f("span"),u=N(s),a=h(),_&&_.c(),d=h(),m.c(),r(n,"class","svelte-1kukkze"),r(o,"class","today-date svelte-1kukkze"),r(t,"class","today-header svelte-1kukkze"),r(e,"class","today-dashboard svelte-1kukkze")},m(b,C){w(b,e,C),c(e,t),c(t,n),c(t,i),c(t,o),c(o,u),c(e,a),_&&_.m(e,null),c(e,d),m.m(e,null)},p(b,C){C[0]&4&&s!==(s=b[2].date+"")&&B(u,s),b[2].summary?_?_.p(b,C):(_=ql(b),_.c(),_.m(e,d)):_&&(_.d(1),_=null),p===(p=v(b))&&m?m.p(b,C):(m.d(1),m=p(b),m&&(m.c(),m.m(e,null)))},i:J,o:J,d(b){b&&y(e),_&&_.d(),m.d()}}}function Uo(l){let e,t,n,i,o,s,u=ee(l[58]),a=[];for(let p=0;p{_[b]=null}),Ke()),~i?(o=_[i],o?o.p(p,m):(o=_[i]=d[i](p),o.c()),ke(o,1),o.m(n,null)):o=null)},i(p){s||(ke(o),s=!0)},o(p){me(o),s=!1},d(p){p&&(y(e),y(t),y(n)),Me(a,p),~i&&_[i].d()}}}function qo(l){let e,t,n,i=l[11].title+"",o,s,u,a,d,_,v,p,m,b,C,g=l[11].dirty&&vn();return{c(){e=f("div"),t=f("div"),n=f("span"),o=N(i),s=h(),g&&g.c(),u=h(),a=f("div"),d=f("button"),d.textContent="Сохранить",_=h(),v=f("button"),v.textContent="Закрыть",p=h(),m=f("textarea"),r(n,"class","note-title svelte-1kukkze"),r(d,"class","btn btn-primary svelte-1kukkze"),r(v,"class","btn svelte-1kukkze"),r(a,"class","note-editor-actions svelte-1kukkze"),r(t,"class","note-editor-header svelte-1kukkze"),r(m,"class","note-textarea svelte-1kukkze"),r(m,"placeholder","Начните писать..."),r(e,"class","note-editor svelte-1kukkze")},m(T,L){w(T,e,L),c(e,t),c(t,n),c(n,o),c(t,s),g&&g.m(t,null),c(t,u),c(t,a),c(a,d),c(a,_),c(a,v),c(e,p),c(e,m),ce(m,l[11].content),b||(C=[H(d,"click",l[93]),H(v,"click",l[91]),H(m,"input",l[116]),H(m,"input",l[92])],b=!0)},p(T,L){L[0]&2048&&i!==(i=T[11].title+"")&&B(o,i),T[11].dirty?g||(g=vn(),g.c(),g.m(t,u)):g&&(g.d(1),g=null),L[0]&2048&&ce(m,T[11].content)},i:J,o:J,d(T){T&&y(e),g&&g.d(),b=!1,ae(C)}}}function Go(l){let e,t,n;return{c(){e=f("p"),t=N("Ошибка: "),n=N(l[6]),r(e,"class","error-text svelte-1kukkze")},m(i,o){w(i,e,o),c(e,t),c(e,n)},p(i,o){o[0]&64&&B(n,i[6])},d(i){i&&y(e)}}}function Jo(l){let e,t,n;return{c(){e=f("p"),e.textContent="Выберите раздел в боковой панели.",t=h(),n=f("p"),n.textContent="Или создайте новое дело кнопкой «+».",r(e,"class","svelte-1kukkze"),r(n,"class","hint svelte-1kukkze")},m(i,o){w(i,e,o),w(i,t,o),w(i,n,o)},p:J,d(i){i&&(y(e),y(t),y(n))}}}function Xo(l){let e;return{c(){e=f("p"),e.textContent="Загрузка...",r(e,"class","svelte-1kukkze")},m(t,n){w(t,e,n)},p:J,d(t){t&&y(e)}}}function Zo(l){let e,t=ee(l[3]),n=[];for(let i=0;iАктивность пока не зафиксирована',r(e,"class","empty-state svelte-1kukkze")},m(t,n){w(t,e,n)},p:J,d(t){t&&y(e)}}}function Wl(l){let e,t=l[224].targetType+"",n;return{c(){e=f("span"),n=N(t),r(e,"class","activity-feed-target svelte-1kukkze")},m(i,o){w(i,e,o),c(e,n)},p(i,o){o[0]&8&&t!==(t=i[224].targetType+"")&&B(n,t)},d(i){i&&y(e)}}}function Ul(l){let e,t,n=lt(l[224].eventType)+"",i,o,s,u,a=l[224].title+"",d,_,v,p,m=We(l[224].eventType)+"",b,C,g,T,L=He(l[224].createdAt)+"",A,S,j=Fe(l[224].createdAt)+"",P,D,M,z,I=l[224].targetType&&Wl(l);function O(){return l[149](l[224])}function q(...Z){return l[150](l[224],...Z)}return{c(){e=f("div"),t=f("span"),i=N(n),o=h(),s=f("div"),u=f("span"),d=N(a),_=h(),v=f("div"),p=f("span"),b=N(m),C=h(),I&&I.c(),g=h(),T=f("span"),A=N(L),S=h(),P=N(j),D=h(),r(t,"class","activity-feed-icon svelte-1kukkze"),r(u,"class","activity-feed-title svelte-1kukkze"),r(p,"class","activity-feed-type svelte-1kukkze"),r(T,"class","activity-feed-time svelte-1kukkze"),r(v,"class","activity-feed-meta svelte-1kukkze"),r(s,"class","activity-feed-body svelte-1kukkze"),r(e,"class","activity-feed-event svelte-1kukkze"),r(e,"role","button"),r(e,"tabindex","0")},m(Z,R){w(Z,e,R),c(e,t),c(t,i),c(e,o),c(e,s),c(s,u),c(u,d),c(s,_),c(s,v),c(v,p),c(p,b),c(v,C),I&&I.m(v,null),c(v,g),c(v,T),c(T,A),c(T,S),c(T,P),c(e,D),M||(z=[H(e,"click",O),H(e,"keydown",q)],M=!0)},p(Z,R){l=Z,R[0]&8&&n!==(n=lt(l[224].eventType)+"")&&B(i,n),R[0]&8&&a!==(a=l[224].title+"")&&B(d,a),R[0]&8&&m!==(m=We(l[224].eventType)+"")&&B(b,m),l[224].targetType?I?I.p(l,R):(I=Wl(l),I.c(),I.m(v,g)):I&&(I.d(1),I=null),R[0]&8&&L!==(L=He(l[224].createdAt)+"")&&B(A,L),R[0]&8&&j!==(j=Fe(l[224].createdAt)+"")&&B(P,j)},d(Z){Z&&y(e),I&&I.d(),M=!1,ae(z)}}}function ql(l){let e,t,n,i=l[2].summary.changedCases>0&&Gl(l),o=l[2].summary.notes>0&&Jl(l),s=l[2].summary.files>0&&Xl(l);return{c(){e=f("div"),i&&i.c(),t=h(),o&&o.c(),n=h(),s&&s.c(),r(e,"class","today-summary svelte-1kukkze")},m(u,a){w(u,e,a),i&&i.m(e,null),c(e,t),o&&o.m(e,null),c(e,n),s&&s.m(e,null)},p(u,a){u[2].summary.changedCases>0?i?i.p(u,a):(i=Gl(u),i.c(),i.m(e,t)):i&&(i.d(1),i=null),u[2].summary.notes>0?o?o.p(u,a):(o=Jl(u),o.c(),o.m(e,n)):o&&(o.d(1),o=null),u[2].summary.files>0?s?s.p(u,a):(s=Xl(u),s.c(),s.m(e,null)):s&&(s.d(1),s=null)},d(u){u&&y(e),i&&i.d(),o&&o.d(),s&&s.d()}}}function Gl(l){let e,t=l[2].summary.changedCases+"",n,i,o=Ue(l[2].summary.changedCases,"дело","дела","дел")+"",s;return{c(){e=f("span"),n=N(t),i=h(),s=N(o),r(e,"class","summary-chip svelte-1kukkze")},m(u,a){w(u,e,a),c(e,n),c(e,i),c(e,s)},p(u,a){a[0]&4&&t!==(t=u[2].summary.changedCases+"")&&B(n,t),a[0]&4&&o!==(o=Ue(u[2].summary.changedCases,"дело","дела","дел")+"")&&B(s,o)},d(u){u&&y(e)}}}function Jl(l){let e,t=l[2].summary.notes+"",n,i,o=Ue(l[2].summary.notes,"заметка","заметки","заметок")+"",s;return{c(){e=f("span"),n=N(t),i=h(),s=N(o),r(e,"class","summary-chip svelte-1kukkze")},m(u,a){w(u,e,a),c(e,n),c(e,i),c(e,s)},p(u,a){a[0]&4&&t!==(t=u[2].summary.notes+"")&&B(n,t),a[0]&4&&o!==(o=Ue(u[2].summary.notes,"заметка","заметки","заметок")+"")&&B(s,o)},d(u){u&&y(e)}}}function Xl(l){let e,t=l[2].summary.files+"",n,i,o=Ue(l[2].summary.files,"файл","файла","файлов")+"",s;return{c(){e=f("span"),n=N(t),i=h(),s=N(o),r(e,"class","summary-chip svelte-1kukkze")},m(u,a){w(u,e,a),c(e,n),c(e,i),c(e,s)},p(u,a){a[0]&4&&t!==(t=u[2].summary.files+"")&&B(n,t),a[0]&4&&o!==(o=Ue(u[2].summary.files,"файл","файла","файлов")+"")&&B(s,o)},d(u){u&&y(e)}}}function Qo(l){let e;return{c(){e=f("div"),e.innerHTML='Сегодня пока тихо
Здесь появятся дела, заметки, файлы и действия, с которыми вы работали сегодня.
',r(e,"class","today-empty svelte-1kukkze")},m(t,n){w(t,e,n)},p:J,d(t){t&&y(e)}}}function xo(l){let e,t,n=ee(l[2].groups),i=[];for(let s=0;s0&&$l(l);return{c(){for(let s=0;s0?o?o.p(s,u):(o=$l(s),o.c(),o.m(t.parentNode,t)):o&&(o.d(1),o=null)},d(s){s&&(y(e),y(t)),Me(i,s),o&&o.d(s)}}}function Zl(l){let e,t=l[232].events.length+"",n,i,o=Ue(l[232].events.length,"событие","события","событий")+"",s;return{c(){e=f("span"),n=N(t),i=h(),s=N(o),r(e,"class","today-case-count svelte-1kukkze")},m(u,a){w(u,e,a),c(e,n),c(e,i),c(e,s)},p(u,a){a[0]&4&&t!==(t=u[232].events.length+"")&&B(n,t),a[0]&4&&o!==(o=Ue(u[232].events.length,"событие","события","событий")+"")&&B(s,o)},d(u){u&&y(e)}}}function $o(l){let e;return{c(){e=f("div"),e.textContent="Изменён сегодня",r(e,"class","today-events-empty svelte-1kukkze")},m(t,n){w(t,e,n)},p:J,d(t){t&&y(e)}}}function er(l){let e,t=ee(l[232].events),n=[];for(let i=0;i0?er:$o}let P=j(l),D=P(l);return{c(){e=f("div"),t=f("div"),n=f("span"),o=N(i),s=h(),u=f("span"),d=N(a),_=h(),L&&L.c(),v=h(),p=f("span"),b=N(m),C=h(),D.c(),r(n,"class","today-case-title svelte-1kukkze"),r(u,"class","today-case-type svelte-1kukkze"),r(p,"class","today-case-time svelte-1kukkze"),r(t,"class","today-case-header svelte-1kukkze"),r(t,"role","button"),r(t,"tabindex","0"),r(e,"class","today-case svelte-1kukkze")},m(M,z){w(M,e,z),c(e,t),c(t,n),c(n,o),c(t,s),c(t,u),c(u,d),c(t,_),L&&L.m(t,null),c(t,v),c(t,p),c(p,b),c(e,C),D.m(e,null),g||(T=[H(t,"click",A),H(t,"keydown",S)],g=!0)},p(M,z){l=M,z[0]&4&&i!==(i=l[232].nodeTitle+"")&&B(o,i),z[0]&4&&a!==(a=En(l[232].nodeKind)+"")&&B(d,a),l[232].events?L?L.p(l,z):(L=Zl(l),L.c(),L.m(t,v)):L&&(L.d(1),L=null),z[0]&4&&m!==(m=Fe(l[232].lastActivityAt)+"")&&B(b,m),P===(P=j(l))&&D?D.p(l,z):(D.d(1),D=P(l),D&&(D.c(),D.m(e,null)))},d(M){M&&y(e),L&&L.d(),D.d(),g=!1,ae(T)}}}function $l(l){let e,t,n,i=ee(l[2].events),o=[];for(let s=0;s0&&rn(l);const j=[pr,dr],P=[];function D(I,O){return I[31]?0:1}p=D(l),m=P[p]=j[p](l);let M=l[28]&&!l[30]&&un(),z=l[35]&&an(l);return{c(){e=f("div"),t=f("div"),n=f("button"),i=N("+ Добавить файл"),o=h(),s=f("button"),u=N("+ Добавить папку"),a=h(),d=f("button"),d.textContent="+ Новый файл",_=h(),S&&S.c(),v=h(),m.c(),b=h(),M&&M.c(),C=h(),z&&z.c(),g=Pe(),r(n,"class","btn btn-primary svelte-1kukkze"),n.disabled=l[28],r(s,"class","btn svelte-1kukkze"),s.disabled=l[28],r(d,"class","btn svelte-1kukkze"),r(t,"class","tab-toolbar svelte-1kukkze"),r(e,"class","files-tab svelte-1kukkze")},m(I,O){w(I,e,O),c(e,t),c(t,n),c(n,i),c(t,o),c(t,s),c(s,u),c(t,a),c(t,d),c(t,_),S&&S.m(t,null),c(e,v),P[p].m(e,null),c(e,b),M&&M.m(e,null),w(I,C,O),z&&z.m(I,O),w(I,g,O),T=!0,L||(A=[H(n,"click",l[95]),H(s,"click",l[96]),H(d,"click",l[67])],L=!0)},p(I,O){(!T||O[0]&268435456)&&(n.disabled=I[28]),(!T||O[0]&268435456)&&(s.disabled=I[28]),I[39].items.length>0?S?S.p(I,O):(S=rn(I),S.c(),S.m(t,null)):S&&(S.d(1),S=null);let q=p;p=D(I),p===q?P[p].p(I,O):(Re(),me(P[q],1,1,()=>{P[q]=null}),Ke(),m=P[p],m?m.p(I,O):(m=P[p]=j[p](I),m.c()),ke(m,1),m.m(e,b)),I[28]&&!I[30]?M||(M=un(),M.c(),M.m(e,null)):M&&(M.d(1),M=null),I[35]?z?(z.p(I,O),O[1]&16&&ke(z,1)):(z=an(I),z.c(),ke(z,1),z.m(g.parentNode,g)):z&&(Re(),me(z,1,1,()=>{z=null}),Ke())},i(I){T||(ke(m),ke(z),T=!0)},o(I){me(m),me(z),T=!1},d(I){I&&(y(e),y(C),y(g)),S&&S.d(),P[p].d(),M&&M.d(),z&&z.d(I),L=!1,ae(A)}}}function sr(l){let e,t,n,i,o,s,u,a=l[21]&&fn(l);function d(p,m){return p[10].length===0&&!p[21]?gr:br}let _=d(l),v=_(l);return{c(){e=f("div"),t=f("div"),n=f("button"),n.textContent="+ Добавить заметку",i=h(),a&&a.c(),o=h(),v.c(),r(n,"class","btn btn-primary svelte-1kukkze"),r(t,"class","tab-toolbar svelte-1kukkze"),r(e,"class","notes-tab svelte-1kukkze")},m(p,m){w(p,e,m),c(e,t),c(t,n),c(e,i),a&&a.m(e,null),c(e,o),v.m(e,null),s||(u=H(n,"click",l[87]),s=!0)},p(p,m){p[21]?a?a.p(p,m):(a=fn(p),a.c(),a.m(e,o)):a&&(a.d(1),a=null),_===(_=d(p))&&v?v.p(p,m):(v.d(1),v=_(p),v&&(v.c(),v.m(e,null)))},i:J,o:J,d(p){p&&y(e),a&&a.d(),v.d(),s=!1,u()}}}function or(l){let e,t,n=l[8].title+"",i,o,s,u,a,d,_=l[8].type+"",v,p,m,b,C,g=(l[8].section||"—")+"",T,L,A,S,j,P=He(l[8].createdAt)+"",D,M,z,I,O,q,Z,R,K,E,W,ne,G,se,oe=l[10].length>0&&dn(l),x=l[13].length>0&&_n(l);return{c(){e=f("div"),t=f("h2"),i=N(n),o=h(),s=f("div"),u=f("div"),a=f("span"),a.textContent="Тип",d=f("span"),v=N(_),p=h(),m=f("div"),b=f("span"),b.textContent="Раздел",C=f("span"),T=N(g),L=h(),A=f("div"),S=f("span"),S.textContent="Создано",j=f("span"),D=N(P),M=h(),z=f("div"),I=f("button"),I.innerHTML=`
- Новая заметка`,O=h(),q=f("button"),q.innerHTML=`
- Добавить файл`,Z=h(),R=f("button"),R.innerHTML=`
- Добавить действие`,K=h(),E=f("button"),E.innerHTML=`
- Записать время`,W=h(),oe&&oe.c(),ne=h(),x&&x.c(),r(t,"class","svelte-1kukkze"),r(a,"class","meta-label svelte-1kukkze"),r(d,"class","svelte-1kukkze"),r(u,"class","meta-item svelte-1kukkze"),r(b,"class","meta-label svelte-1kukkze"),r(C,"class","svelte-1kukkze"),r(m,"class","meta-item svelte-1kukkze"),r(S,"class","meta-label svelte-1kukkze"),r(j,"class","svelte-1kukkze"),r(A,"class","meta-item svelte-1kukkze"),r(s,"class","meta-grid svelte-1kukkze"),r(I,"class","qa-btn svelte-1kukkze"),r(q,"class","qa-btn svelte-1kukkze"),r(R,"class","qa-btn svelte-1kukkze"),r(E,"class","qa-btn svelte-1kukkze"),r(z,"class","quick-actions svelte-1kukkze"),r(e,"class","overview svelte-1kukkze")},m(Y,Q){w(Y,e,Q),c(e,t),c(t,i),c(e,o),c(e,s),c(s,u),c(u,a),c(u,d),c(d,v),c(s,p),c(s,m),c(m,b),c(m,C),c(C,T),c(s,L),c(s,A),c(A,S),c(A,j),c(j,D),c(e,M),c(e,z),c(z,I),c(z,O),c(z,q),c(z,Z),c(z,R),c(z,K),c(z,E),c(e,W),oe&&oe.m(e,null),c(e,ne),x&&x.m(e,null),G||(se=[H(I,"click",l[118]),H(q,"click",l[119]),H(R,"click",l[101]),H(E,"click",l[120])],G=!0)},p(Y,Q){Q[0]&256&&n!==(n=Y[8].title+"")&&B(i,n),Q[0]&256&&_!==(_=Y[8].type+"")&&B(v,_),Q[0]&256&&g!==(g=(Y[8].section||"—")+"")&&B(T,g),Q[0]&256&&P!==(P=He(Y[8].createdAt)+"")&&B(D,P),Y[10].length>0?oe?oe.p(Y,Q):(oe=dn(Y),oe.c(),oe.m(e,ne)):oe&&(oe.d(1),oe=null),Y[13].length>0?x?x.p(Y,Q):(x=_n(Y),x.c(),x.m(e,null)):x&&(x.d(1),x=null)},i:J,o:J,d(Y){Y&&y(e),oe&&oe.d(),x&&x.d(),G=!1,ae(se)}}}function rr(l){let e,t=ee(l[4]),n=[];for(let i=0;iАктивность пока не зафиксирована',r(e,"class","empty-state svelte-1kukkze")},m(t,n){w(t,e,n)},p:J,d(t){t&&y(e)}}}function ln(l){let e,t=l[224].targetType+"",n;return{c(){e=f("span"),n=N(t),r(e,"class","activity-event-target svelte-1kukkze")},m(i,o){w(i,e,o),c(e,n)},p(i,o){o[0]&16&&t!==(t=i[224].targetType+"")&&B(n,t)},d(i){i&&y(e)}}}function nn(l){let e,t,n=lt(l[224].eventType)+"",i,o,s,u=l[224].title+"",a,d,_,v=We(l[224].eventType)+"",p,m,b,C,g=Fe(l[224].createdAt)+"",T,L,A=l[224].targetType&&ln(l);return{c(){e=f("div"),t=f("span"),i=N(n),o=h(),s=f("span"),a=N(u),d=h(),_=f("span"),p=N(v),m=h(),A&&A.c(),b=h(),C=f("span"),T=N(g),L=h(),r(t,"class","activity-event-icon svelte-1kukkze"),r(s,"class","activity-event-title svelte-1kukkze"),r(_,"class","activity-event-type svelte-1kukkze"),r(C,"class","activity-event-time svelte-1kukkze"),r(e,"class","activity-event svelte-1kukkze")},m(S,j){w(S,e,j),c(e,t),c(t,i),c(e,o),c(e,s),c(s,a),c(e,d),c(e,_),c(_,p),c(e,m),A&&A.m(e,null),c(e,b),c(e,C),c(C,T),c(e,L)},p(S,j){j[0]&16&&n!==(n=lt(S[224].eventType)+"")&&B(i,n),j[0]&16&&u!==(u=S[224].title+"")&&B(a,u),j[0]&16&&v!==(v=We(S[224].eventType)+"")&&B(p,v),S[224].targetType?A?A.p(S,j):(A=ln(S),A.c(),A.m(e,b)):A&&(A.d(1),A=null),j[0]&16&&g!==(g=Fe(S[224].createdAt)+"")&&B(T,g)},d(S){S&&y(e),A&&A.d()}}}function ur(l){let e,t=ee(l[13]),n=[];for(let i=0;iЗаписей работы пока нет',r(e,"class","empty-state svelte-1kukkze")},m(t,n){w(t,e,n)},p:J,d(t){t&&y(e)}}}function sn(l){let e,t,n=l[208].summary+"",i,o,s,u=l[208].minutes+"",a,d,_=He(l[208].createdAt)+"",v,p;return{c(){e=f("div"),t=f("div"),i=N(n),o=h(),s=f("div"),a=N(u),d=N(" мин · "),v=N(_),p=h(),r(t,"class","svelte-1kukkze"),r(s,"class","wl-meta svelte-1kukkze"),r(e,"class","worklog-entry svelte-1kukkze")},m(m,b){w(m,e,b),c(e,t),c(t,i),c(e,o),c(e,s),c(s,a),c(s,d),c(s,v),c(e,p)},p(m,b){b[0]&8192&&n!==(n=m[208].summary+"")&&B(i,n),b[0]&8192&&u!==(u=m[208].minutes+"")&&B(a,u),b[0]&8192&&_!==(_=He(m[208].createdAt)+"")&&B(v,_)},d(m){m&&y(e)}}}function fr(l){let e,t=ee(l[12]),n=[];for(let i=0;iДействий пока нет',r(e,"class","empty-state svelte-1kukkze")},m(t,n){w(t,e,n)},p:J,d(t){t&&y(e)}}}function on(l){let e,t,n,i=l[219].title+"",o,s,u,a=l[105](l[219].type)+"",d,_,v,p=l[219].data+"",m,b,C,g,T,L,A,S,j;function P(){return l[139](l[219])}function D(){return l[140](l[219])}return{c(){e=f("div"),t=f("div"),n=f("span"),o=N(i),s=h(),u=f("span"),d=N(a),_=h(),v=f("span"),m=N(p),b=h(),C=f("div"),g=f("button"),g.textContent="Запустить",T=h(),L=f("button"),L.innerHTML=' ',A=h(),r(n,"class","action-title svelte-1kukkze"),r(u,"class","action-type svelte-1kukkze"),r(v,"class","action-data svelte-1kukkze"),r(t,"class","action-info svelte-1kukkze"),r(g,"class","btn btn-sm svelte-1kukkze"),r(L,"class","btn btn-sm btn-danger svelte-1kukkze"),r(C,"class","action-btns svelte-1kukkze"),r(e,"class","action-card svelte-1kukkze")},m(M,z){w(M,e,z),c(e,t),c(t,n),c(n,o),c(t,s),c(t,u),c(u,d),c(t,_),c(t,v),c(v,m),c(e,b),c(e,C),c(C,g),c(C,T),c(C,L),c(e,A),S||(j=[H(g,"click",P),H(L,"click",D)],S=!0)},p(M,z){l=M,z[0]&4096&&i!==(i=l[219].title+"")&&B(o,i),z[0]&4096&&a!==(a=l[105](l[219].type)+"")&&B(d,a),z[0]&4096&&p!==(p=l[219].data+"")&&B(m,p)},d(M){M&&y(e),S=!1,ae(j)}}}function rn(l){let e,t,n=l[39].items.length+"",i,o,s;return{c(){e=f("button"),t=N("Вставить "),i=N(n),r(e,"class","btn svelte-1kukkze")},m(u,a){w(u,e,a),c(e,t),c(e,i),o||(s=H(e,"click",l[72]),o=!0)},p(u,a){a[1]&256&&n!==(n=u[39].items.length+"")&&B(i,n)},d(u){u&&y(e),o=!1,s()}}}function dr(l){let e,t,n,i,o,s,u;const a=[mr,_r],d=[];function _(b,C){return b[33].length>0?0:1}e=_(l),t=d[e]=a[e](l);const v=[hr,vr],p=[];function m(b,C){return b[34].length===0?0:1}return i=m(l),o=p[i]=v[i](l),{c(){t.c(),n=h(),o.c(),s=Pe()},m(b,C){d[e].m(b,C),w(b,n,C),p[i].m(b,C),w(b,s,C),u=!0},p(b,C){let g=e;e=_(b),e===g?d[e].p(b,C):(Re(),me(d[g],1,1,()=>{d[g]=null}),Ke(),t=d[e],t?t.p(b,C):(t=d[e]=a[e](b),t.c()),ke(t,1),t.m(n.parentNode,n));let T=i;i=m(b),i===T?p[i].p(b,C):(Re(),me(p[T],1,1,()=>{p[T]=null}),Ke(),o=p[i],o?o.p(b,C):(o=p[i]=v[i](b),o.c()),ke(o,1),o.m(s.parentNode,s))},i(b){u||(ke(t),ke(o),u=!0)},o(b){me(t),me(o),u=!1},d(b){b&&(y(n),y(s)),d[e].d(b),p[i].d(b)}}}function pr(l){let e;return{c(){e=f("div"),e.innerHTML='Загрузка...
',r(e,"class","empty-state svelte-1kukkze")},m(t,n){w(t,e,n)},p:J,i:J,o:J,d(t){t&&y(e)}}}function _r(l){let e,t;return e=new Gn({props:{crumbs:[{name:"Файлы"}]}}),{c(){Ye(e.$$.fragment)},m(n,i){qe(e,n,i),t=!0},p:J,i(n){t||(ke(e.$$.fragment,n),t=!0)},o(n){me(e.$$.fragment,n),t=!1},d(n){Ge(e,n)}}}function mr(l){let e,t,n,i,o,s;return e=new Gn({props:{crumbs:[{name:"Файлы"},...l[33]]}}),e.$on("navigate",l[125]),{c(){Ye(e.$$.fragment),t=h(),n=f("button"),n.innerHTML=`
- Back`,r(n,"class","btn btn-sm back-btn svelte-1kukkze")},m(u,a){qe(e,u,a),w(u,t,a),w(u,n,a),i=!0,o||(s=H(n,"click",l[63]),o=!0)},p(u,a){const d={};a[1]&4&&(d.crumbs=[{name:"Файлы"},...u[33]]),e.$set(d)},i(u){i||(ke(e.$$.fragment,u),i=!0)},o(u){me(e.$$.fragment,u),i=!1},d(u){u&&(y(t),y(n)),Ge(e,u),o=!1,s()}}}function vr(l){let e,t=[],n=new Map,i,o=ee(l[34]);const s=u=>u[216].id;for(let u=0;u0?"В этой папке пока нет файлов":"В этом проекте пока нет файлов",s,u,a,d,_,v,p,m,b,C;return{c(){e=f("div"),t=f("div"),t.innerHTML=' ',n=h(),i=f("p"),s=N(o),u=h(),a=f("p"),a.textContent="Добавьте файл или папку, чтобы сохранить материалы проекта.",d=h(),_=f("div"),v=f("button"),v.textContent="Добавить файл",p=h(),m=f("button"),m.textContent="Добавить папку",r(t,"class","empty-icon svelte-1kukkze"),r(i,"class","svelte-1kukkze"),r(a,"class","hint svelte-1kukkze"),r(v,"class","btn btn-primary svelte-1kukkze"),r(m,"class","btn svelte-1kukkze"),r(_,"class","empty-actions svelte-1kukkze"),r(e,"class","empty-state svelte-1kukkze")},m(g,T){w(g,e,T),c(e,t),c(e,n),c(e,i),c(i,s),c(e,u),c(e,a),c(e,d),c(e,_),c(_,v),c(_,p),c(_,m),b||(C=[H(v,"click",l[95]),H(m,"click",l[96])],b=!0)},p(g,T){T[1]&4&&o!==(o=g[33].length>0?"В этой папке пока нет файлов":"В этом проекте пока нет файлов")&&B(s,o)},i:J,o:J,d(g){g&&y(e),b=!1,ae(C)}}}function cn(l,e){let t,n,i;return n=new ho({props:{item:e[216],selected:e[40].includes(e[216].id),onDragStart:e[76],onDragOver:e[77],onDrop:e[78]}}),n.$on("navigate",e[126]),n.$on("preview",e[127]),n.$on("openExternal",e[128]),n.$on("showInFolder",e[129]),n.$on("delete",e[130]),n.$on("rename",e[131]),n.$on("duplicate",e[132]),n.$on("cut",e[133]),n.$on("copy",e[134]),n.$on("selectOne",e[135]),n.$on("toggleSelect",e[136]),n.$on("rangeSelect",e[137]),{key:l,first:null,c(){t=Pe(),Ye(n.$$.fragment),this.first=t},m(o,s){w(o,t,s),qe(n,o,s),i=!0},p(o,s){e=o;const u={};s[1]&8&&(u.item=e[216]),s[1]&520&&(u.selected=e[40].includes(e[216].id)),n.$set(u)},i(o){i||(ke(n.$$.fragment,o),i=!0)},o(o){me(n.$$.fragment,o),i=!1},d(o){o&&y(t),Ge(n,o)}}}function un(l){let e;return{c(){e=f("div"),e.innerHTML='Сканирование...
',r(e,"class","empty-state svelte-1kukkze")},m(t,n){w(t,e,n)},d(t){t&&y(e)}}}function an(l){let e,t;return e=new Fo({props:{item:l[35],content:l[36],loading:l[37],error:l[38]}}),e.$on("close",l[66]),e.$on("openExternal",l[138]),{c(){Ye(e.$$.fragment)},m(n,i){qe(e,n,i),t=!0},p(n,i){const o={};i[1]&16&&(o.item=n[35]),i[1]&32&&(o.content=n[36]),i[1]&64&&(o.loading=n[37]),i[1]&128&&(o.error=n[38]),e.$set(o)},i(n){t||(ke(e.$$.fragment,n),t=!0)},o(n){me(e.$$.fragment,n),t=!1},d(n){Ge(e,n)}}}function fn(l){let e,t,n,i,o,s,u,a,d;return{c(){e=f("div"),t=f("input"),n=h(),i=f("div"),o=f("button"),o.textContent="Создать",s=h(),u=f("button"),u.textContent="Отмена",r(t,"type","text"),r(t,"placeholder","Название заметки"),r(t,"class","svelte-1kukkze"),r(o,"class","btn btn-primary svelte-1kukkze"),r(u,"class","btn svelte-1kukkze"),r(i,"class","form-actions svelte-1kukkze"),r(e,"class","create-form svelte-1kukkze")},m(_,v){w(_,e,v),c(e,t),ce(t,l[22]),c(e,n),c(e,i),c(i,o),c(i,s),c(i,u),a||(d=[H(t,"input",l[122]),H(t,"keydown",l[123]),H(o,"click",l[89]),H(u,"click",l[88])],a=!0)},p(_,v){v[0]&4194304&&t.value!==_[22]&&ce(t,_[22])},d(_){_&&y(e),a=!1,ae(d)}}}function br(l){let e,t=ee(l[10]),n=[];for(let i=0;iНет заметокСоздайте первую заметку для этого дела.
',r(e,"class","empty-state svelte-1kukkze")},m(t,n){w(t,e,n)},p:J,d(t){t&&y(e)}}}function kn(l){let e,t,n=l[211].title+"",i,o,s,u=He(l[211].createdAt)+"",a,d,_,v;function p(){return l[124](l[211])}return{c(){e=f("div"),t=f("div"),i=N(n),o=h(),s=f("div"),a=N(u),d=h(),r(t,"class","note-card-title svelte-1kukkze"),r(s,"class","note-card-date svelte-1kukkze"),r(e,"class","note-card svelte-1kukkze")},m(m,b){w(m,e,b),c(e,t),c(t,i),c(e,o),c(e,s),c(s,a),c(e,d),_||(v=H(e,"click",p),_=!0)},p(m,b){l=m,b[0]&1024&&n!==(n=l[211].title+"")&&B(i,n),b[0]&1024&&u!==(u=He(l[211].createdAt)+"")&&B(a,u)},d(m){m&&y(e),_=!1,v()}}}function dn(l){let e,t,n,i=ee(l[10].slice(0,5)),o=[];for(let s=0;s0&&yn(l);return{c(){e=f("div"),t=f("div"),n=f("h3"),n.textContent="Новое дело",i=h(),o=f("div"),s=f("label"),s.textContent="Название",u=h(),a=f("input"),d=h(),_=f("div"),v=f("label"),v.textContent="Раздел",p=h(),m=f("select");for(let z=0;zl[153].call(m)),r(_,"class","form-group svelte-1kukkze"),r(T,"class","btn btn-primary svelte-1kukkze"),r(A,"class","btn svelte-1kukkze"),r(g,"class","modal-actions svelte-1kukkze"),r(t,"class","modal svelte-1kukkze"),r(e,"class","modal-overlay svelte-1kukkze")},m(z,I){w(z,e,I),c(e,t),c(t,n),c(t,i),c(t,o),c(o,s),c(o,u),c(o,a),ce(a,l[17]),c(t,d),c(t,_),c(_,v),c(_,p),c(_,m);for(let O=0;O0?M?M.p(z,I):(M=yn(z),M.c(),M.m(t,C)):M&&(M.d(1),M=null)},d(z){z&&y(e),Me(D,z),M&&M.d(),S=!1,ae(j)}}}function gn(l){let e,t=l[205].label+"",n,i;return{c(){e=f("option"),n=N(t),e.__value=i=l[205].id,ce(e,e.__value),r(e,"class","svelte-1kukkze")},m(o,s){w(o,e,s),c(e,n)},p(o,s){s[0]&1&&t!==(t=o[205].label+"")&&B(n,t),s[0]&1&&i!==(i=o[205].id)&&(e.__value=i,ce(e,e.__value))},d(o){o&&y(e)}}}function yn(l){let e,t,n,i,o,s,u,a=ee(l[20]),d=[];for(let _=0;_l[154].call(i)),r(e,"class","form-group svelte-1kukkze")},m(_,v){w(_,e,v),c(e,t),c(e,n),c(e,i),c(i,o);for(let p=0;pl[157].call(m)),r(_,"class","form-group svelte-1kukkze"),r(g,"class","svelte-1kukkze"),r(S,"type","text"),r(S,"placeholder",j=l[25]==="open_url"?"https://example.com":l[25]==="open_folder"||l[25]==="open_file"?"/path/to/file":"команда"),r(S,"class","svelte-1kukkze"),r(C,"class","form-group svelte-1kukkze"),r(M,"class","btn btn-primary svelte-1kukkze"),r(I,"class","btn svelte-1kukkze"),r(D,"class","modal-actions svelte-1kukkze"),r(t,"class","modal svelte-1kukkze"),r(e,"class","modal-overlay svelte-1kukkze")},m(K,E){w(K,e,E),c(e,t),c(t,n),c(t,i),c(t,o),c(o,s),c(o,u),c(o,a),ce(a,l[24]),c(t,d),c(t,_),c(_,v),c(_,p),c(_,m);for(let W=0;W⚒ Верстак ',i=h(),o=f("nav"),s=f("div"),u=f("div"),u.textContent="Разделы",a=h();for(let ie=0;ie{Ee[Ie]=null}),Ke(),W=Ee[E],W?W.p(V,ie):(W=Ee[E]=ot[E](V),W.c()),ke(W,1),W.m(z,ne)),!V[11]&&!V[8]&&V[7]!=="today"&&V[7]!=="inbox"&&V[7]!=="activity"?be?be.p(V,ie):(be=hn(V),be.c(),be.m(z,G)):be&&(be.d(1),be=null),V[16]?ge?ge.p(V,ie):(ge=bn(V),ge.c(),ge.m(z,se)):ge&&(ge.d(1),ge=null),V[23]?ye?ye.p(V,ie):(ye=zn(V),ye.c(),ye.m(z,oe)):ye&&(ye.d(1),ye=null),V[30]&&V[29]?we?we.p(V,ie):(we=Tn(V),we.c(),we.m(z,x)):we&&(we.d(1),we=null),V[46]?he?he.p(V,ie):(he=Sn(V),he.c(),he.m(z,Y)):he&&(he.d(1),he=null),V[41]?de?(de.p(V,ie),ie[1]&1024&&ke(de,1)):(de=In(V),de.c(),ke(de,1),de.m(z,Q)):de&&(Re(),me(de,1,1,()=>{de=null}),Ke()),V[49]?Ce?Ce.p(V,ie):(Ce=Dn(V),Ce.c(),Ce.m(z,null)):Ce&&(Ce.d(1),Ce=null)},i(V){ue||(ke(W),ke(de),ue=!0)},o(V){me(W),me(de),ue=!1},d(V){V&&y(e),Me(re,V),ve&&ve.d(),Le.d(),ze&&ze.d(),Se&&Se.d(),Ee[E].d(),be&&be.d(),ge&&ge.d(),ye&&ye.d(),we&&we.d(),he&&he.d(),de&&de.d(),Ce&&Ce.d(),te=!1,_e()}}}function X(l,...e){try{if(window.go&&window.go.main&&window.go.main.App){const t=window.go.main.App[l];if(typeof t=="function")return t(...e)}}catch(t){console.error("Wails call error:",l,t)}return Promise.reject(new Error("Wails not connected: "+l))}function We(l){return{note_created:"Заметка создана",note_updated:"Заметка изменена",file_added:"Файл добавлен",file_deleted:"Файл удалён",file_renamed:"Файл переименован",file_copied:"Файл скопирован",file_moved:"Файл перемещён",folder_added:"Папка добавлена",folder_deleted:"Папка удалена",folder_renamed:"Папка переименована",node_created:"Дело создано",node_updated:"Дело изменено"}[l]||l}function lt(l){return l==="note_created"||l==="file_added"||l==="folder_added"||l==="node_created"?"+":l==="file_deleted"||l==="folder_deleted"?"×":l==="file_renamed"||l==="folder_renamed"||l==="note_updated"||l==="node_updated"?"~":l==="file_copied"?"⧉":l==="file_moved"?"→":"•"}function Fe(l){if(!l)return"";try{return new Date(l).toLocaleTimeString("ru-RU",{hour:"2-digit",minute:"2-digit"})}catch{return""}}function He(l){if(!l)return"";try{return new Date(l).toLocaleDateString("ru-RU",{day:"numeric",month:"short"})}catch{return l}}function En(l){return{project:"Проект",client:"Клиент",document:"Документ",recipe:"Рецепт",archive:"Архив",case:"Дело"}[l]||l||"Дело"}function Ue(l,e,t,n){return l=Math.abs(l)%100,l>=5&&l<=20?n:(l%=10,l===1?e:l>=2&&l<=4?t:n)}const Fn=l=>l.id!=="today"&&l.id!=="inbox"&&l.id!=="activity";function wr(l,e,t){let n=[],i=[],o=null,s=[],u=0,a=!0,d=[],_="",v="",p="",m=null,b="overview",C=[],g=null,T=[],L=[],A=[],S="",j="",P=!1,D="",M="clients",z="",I=[],O=!1,q="",Z=!1,R="",K="open_url",E="",W=[{id:"open_url",label:"Открыть URL"},{id:"open_file",label:"Открыть файл"},{id:"open_folder",label:"Открыть папку"},{id:"run_command",label:"Запустить команду"},{id:"run_script",label:"Запустить скрипт"},{id:"open_terminal",label:"Открыть терминал"},{id:"launch_app",label:"Запустить приложение"}],ne=!0,G=!1,se=null,oe=!1,x="",Y=!1,Q=null,ue=[],te=[],_e=null,$="",re=!1,ve="",Ae={items:[],mode:"copy"},le=[],Le=[],ze=!1,Se="",ot="",Ee=!1,rt="Удалить",be=null,ge=null,ye=!1,we="",he="",de="",Ce=!1,Ne=null,V=!1,ie="",Ie="",je="",Be=0,pe="";const ft=[{id:"overview",label:"Обзор"},{id:"notes",label:"Заметки"},{id:"files",label:"Файлы"},{id:"actions",label:"Действия"},{id:"worklog",label:"Журнал"},{id:"activity",label:"Активность"}];let gt=null;Bn(async()=>{try{t(5,_=await X("VerstakVersion")||"verstak-gui/v2"),t(0,n=await X("ListSections")||[])}catch(k){t(6,v=String(k)),t(0,n=[{id:"today",label:"Сегодня"},{id:"inbox",label:"Неразобранное"},{id:"activity",label:"Активность"},{id:"clients",label:"Клиенты"},{id:"projects",label:"Проекты"},{id:"recipes",label:"Рецепты"},{id:"documents",label:"Документы"},{id:"archive",label:"Архив"}])}window.runtime&&window.runtime.EventsOn&&(window.runtime.EventsOn("files-dropped",vi),gt=()=>window.runtime.EventsOff("files-dropped")),window.addEventListener("keydown",Yt),t(27,ne=!1),At()}),On(()=>{gt&>(),window.removeEventListener("keydown",Yt)});async function yt(k){t(7,p=k),t(8,m=null),t(9,b="overview"),t(10,C=[]),T=[],t(12,L=[]),t(13,A=[]),t(16,P=!1),t(6,v=""),t(2,o=null),t(3,s=[]),u=0,a=!0,t(1,i=[]);try{k==="today"?t(2,o=await X("ListTodayView")||{cases:[]}):k==="activity"?(t(3,s=await X("ListActivityFeed",50,0)||[]),u=s.length,a=s.length===50):t(1,i=await X("ListNodesBySection",k)||[])}catch(F){t(6,v=String(F)),t(1,i=[]),t(2,o={cases:[]}),t(3,s=[])}}async function wt(k){t(8,m=k),t(9,b="overview"),t(10,C=[]),T=[],t(12,L=[]),t(13,A=[]),t(34,te=[]),t(33,ue=[]),t(32,Q=null),t(35,_e=null),t(36,$=""),t(40,le=[]),Le=[],t(11,g=null),t(16,P=!1),t(21,O=!1),t(6,v=""),t(4,d=[]),await Pt(k.id)}async function Pt(k){try{t(10,C=await X("ListNotes",k)||[])}catch{}try{T=await X("ListFiles",k)||[]}catch{}try{t(12,L=await X("ListActions",k)||[])}catch{}try{t(13,A=await X("ListWorklog",k)||[])}catch{}try{t(4,d=await X("ListActivityByNode",k,50,0)||[])}catch{}}async function De(k){t(31,Y=!0);try{let F=await X("ListItems",k)||[];F.sort((fe,Te)=>fe.type!==Te.type?fe.type==="folder"?-1:1:(fe.name||"").localeCompare(Te.name||"")),t(34,te=F)}catch{t(34,te=[])}t(31,Y=!1)}async function zt(k){if(m){try{const F=await X("GetNodeDetail",k);F&&t(33,ue=[...ue,{id:k,name:F.title}])}catch{t(33,ue=[...ue,{id:k,name:"..."}])}t(32,Q=k),await De(k)}}function Vt(){if(ue.length<2)t(33,ue=[]),t(32,Q=null),De(m.id);else{const k=ue[ue.length-2];t(33,ue=ue.slice(0,-1)),t(32,Q=k.id),De(k.id)}}function Rt(k){const F=ue[k];t(33,ue=ue.slice(0,k+1)),t(32,Q=F.id),De(F.id)}async function Ct(k){t(35,_e=k),t(36,$=""),t(38,ve=""),t(37,re=!0);try{uo(k)?t(36,$=await X("GetFileBase64",k.fileId)||""):ao(k)&&t(36,$=await X("ReadFileText",k.fileId)||"")}catch(F){t(38,ve=String(F))}t(37,re=!1)}function Tt(){t(35,_e=null),t(36,$=""),t(38,ve="")}async function Jn(){const k=prompt("Введите имя файла:");if(!(!k||!k.trim()))try{const F=Q||m.id;await X("CreateEmptyFile",F,k.trim()),await De(F)}catch(F){t(6,v=String(F))}}async function Kt(k){try{await X("DuplicateNode",k);const F=Q||m.id;await De(F)}catch(F){t(6,v=String(F))}}function Wt(k){const F=te.find(fe=>fe.id===k);F&&xt(F.id,F.name)}function Ut(k){t(39,Ae={items:[k],mode:"cut"})}function qt(k){t(39,Ae={items:[k],mode:"copy"})}async function Gt(){if(Ae.items.length===0)return;const k=Q||m.id;try{if(Ae.mode==="copy")for(const F of Ae.items)await X("DuplicateNode",F);else for(const F of Ae.items)await X("MoveNode",F,k);t(39,Ae={items:[],mode:"copy"}),await De(k)}catch(F){t(6,v=String(F))}}function Jt(k){le.includes(k)?t(40,le=le.filter(F=>F!==k)):t(40,le=[...le,k])}function Xt(k){t(40,le=[k])}function Xn(){t(40,le=te.map(k=>k.id))}function Zt(k){if(te.length===0)return;const F=le.length>0?le[le.length-1]:te[0].id,fe=te.findIndex(Je=>Je.id===F),Te=te.findIndex(Je=>Je.id===k);if(fe===-1||Te===-1)return;const ct=Math.min(fe,Te),Nt=Math.max(fe,Te),Ls=te.slice(ct,Nt+1).map(Je=>Je.id),cl=new Set(le);Ls.forEach(Je=>cl.add(Je)),t(40,le=[...cl])}function Zn(){t(40,le=[])}function Mt(k){return k.length>0?k:te.map(F=>F.id)}async function Yn(){var fe;const k=Mt(le),F=k.length===1&&((fe=te.find(Te=>Te.id===k[0]))==null?void 0:fe.type)==="folder"?"папку":`файлов (${k.length})`;kt({title:"Удаление",message:`Удалить ${F}?`,confirmText:"Удалить",danger:!0,onConfirm:async()=>{for(const ct of k)try{await X("DeleteFileOrFolder",ct)}catch(Nt){t(6,v=String(Nt))}t(40,le=[]);const Te=Q||m.id;await De(Te)}})}function Qn(){const k=Mt(le);t(39,Ae={items:k,mode:"cut"}),t(40,le=[])}function xn(){const k=Mt(le);t(39,Ae={items:k,mode:"copy"}),t(40,le=[])}function $n(k,F){const fe=le.includes(F)?le:[F];Le=fe,k.dataTransfer.effectAllowed="move",k.dataTransfer.setData("text/plain",fe.join(","))}function ei(k,F){const fe=te.find(Te=>Te.id===F);fe&&fe.type==="folder"&&(k.preventDefault(),k.dataTransfer.dropEffect="move")}async function ti(k,F){if(k.preventDefault(),Le.length!==0){for(const fe of Le)try{await X("MoveNode",fe,F)}catch(Te){t(6,v=String(Te))}Le=[],t(40,le=[]),await De(Q||m.id)}}function Yt(k){if(b==="files"&&!(k.target.tagName==="INPUT"||k.target.tagName==="TEXTAREA"))if(k.ctrlKey||k.metaKey)k.key==="c"||k.key==="C"?(k.preventDefault(),xn()):k.key==="x"||k.key==="X"?(k.preventDefault(),Qn()):k.key==="v"||k.key==="V"?(k.preventDefault(),Gt()):k.key==="a"||k.key==="A"?(k.preventDefault(),Xn()):k.key==="o"||k.key==="O"?(k.preventDefault(),li()):k.key==="Enter"&&(k.preventDefault(),Qt());else if(k.key==="Enter")k.preventDefault(),Qt();else if(k.key==="Delete"||k.key==="Backspace"){if(_e){k.preventDefault(),Tt();return}if(le.length>0){k.preventDefault(),Yn();return}if(k.key==="Backspace"&&ue.length>0){k.preventDefault(),Vt();return}}else if(k.key==="Escape"){if(_e){Tt();return}if(le.length>0){Zn();return}}else k.key==="F2"&&(k.preventDefault(),ni())}function Qt(){if(le.length===1){const k=te.find(F=>F.id===le[0]);k&&(k.type==="folder"?zt(k.id):Ct(k))}}function li(){if(le.length===1){const k=te.find(F=>F.id===le[0]);k&&k.fileId&&X("OpenFile",k.fileId)}}function xt(k,F){we=k,t(47,he=F),t(48,de=""),t(46,ye=!0)}function ni(){if(le.length===1){const k=te.find(F=>F.id===le[0]);k&&xt(k.id,k.name)}}async function $t(){const k=he.trim();if(!k){t(48,de="Имя не может быть пустым");return}try{await X("ValidateName",k)}catch{t(48,de="Недопустимое имя");return}t(46,ye=!1),we="";try{await X("RenameNode",we,k);const F=Q||m.id;await De(F)}catch(F){t(6,v=String(F))}}function ii(){t(46,ye=!1),we="",t(47,he=""),t(48,de="")}function si(k){k.key==="Enter"?$t():t(48,de="")}function kt(k){t(42,Se=k.title||"Подтверждение"),t(43,ot=k.message||""),t(44,Ee=k.danger!==void 0?k.danger:!0),t(45,rt=k.confirmText||"Удалить"),be=k.onConfirm||null,ge=k.onCancel||null,t(41,ze=!0)}function el(){t(41,ze=!1),be=null,ge=null}function oi(){be&&be(),el()}function ri(){ge&&ge(),el()}function ci(){t(16,P=!0),t(17,D=""),t(18,M=p||"clients"),t(19,z=""),X("ListTemplates").then(k=>{t(20,I=k||[])}).catch(()=>{t(20,I=[])})}function ui(){t(16,P=!1),t(17,D="")}async function tl(){if(D.trim())try{let k;z?k=await X("FromTemplate","","case",D.trim(),M,z):k=await X("CreateNode","","case",D.trim(),M),t(16,P=!1),t(17,D=""),t(19,z=""),await yt(M)}catch(k){t(6,v=String(k))}}function ll(){t(21,O=!0),t(22,q="")}function ai(){t(21,O=!1),t(22,q="")}async function nl(){if(!(!q.trim()||!m))try{const k=await X("CreateNote",m.id,q.trim());t(10,C=[...C,k&&k.id?k:{id:Date.now().toString(),title:q.trim(),createdAt:new Date().toISOString()}]),t(21,O=!1),t(22,q="")}catch{const F={id:Date.now().toString(),title:q.trim(),createdAt:new Date().toISOString()};t(10,C=[...C,F]),t(21,O=!1),t(22,q="")}}async function St(k){if(g&&g.dirty){kt({title:"Несохранённые изменения",message:"Закрыть редактор? Все несохранённые изменения будут потеряны.",confirmText:"Закрыть",danger:!1,onConfirm:async()=>{await il(k)}});return}await il(k)}async function il(k){try{const F=await X("ReadNote",k.id);t(11,g={id:k.id,title:k.title,content:F||"",dirty:!1})}catch{t(11,g={id:k.id,title:k.title,content:"# "+k.title+`
-
-`,dirty:!1})}}function fi(){if(g&&g.dirty){kt({title:"Несохранённые изменения",message:"Закрыть редактор? Все несохранённые изменения будут потеряны.",confirmText:"Закрыть",danger:!1,onConfirm:()=>{t(11,g=null)}});return}t(11,g=null)}function ki(k){g&&(t(11,g.content=k.target.value,g),t(11,g.dirty=!0,g))}async function di(){if(g)try{await X("SaveNote",g.id,g.content),t(11,g.dirty=!1,g)}catch{t(11,g.dirty=!1,g)}}async function pi(){const k=parseInt(S,10);if(!(!j.trim()||isNaN(k)||k<=0||!m)){try{const F=await X("CreateWorklog",m.id,j.trim(),k);t(13,A=[...A,F&&F.id?F:{id:Date.now().toString(),nodeId:m.id,summary:j.trim(),minutes:k,createdAt:new Date().toISOString()}])}catch{t(13,A=[...A,{id:Date.now().toString(),nodeId:m.id,summary:j.trim(),minutes:k,createdAt:new Date().toISOString()}])}t(15,j=""),t(14,S="")}}async function sl(){const k=await X("PickFile");k&&await Lt(m.id,k)}async function _i(){const k=await X("PickDirectory");k&&await Lt(m.id,k)}async function Lt(k,F){t(28,G=!0);try{const fe=await X("PreviewImport",F);t(29,se=fe),x=F,t(30,oe=!0)}catch(fe){t(6,v=String(fe))}t(28,G=!1)}async function It(k){try{const F=k==="copy"?await X("AddPathCopy",m.id,x):await X("AddPathLink",m.id,x);t(30,oe=!1),t(29,se=null),t(33,ue=[]),t(32,Q=null),await Promise.all([Pt(m.id),De(m.id)])}catch(F){t(6,v=String(F))}}function mi(){t(30,oe=!1),t(29,se=null)}async function ol({id:k,type:F}){kt({title:"Удаление",message:`Удалить ${F==="folder"?"папку":"файл"}?`,confirmText:"Удалить",danger:!0,onConfirm:async()=>{try{await X("DeleteFileOrFolder",k),T=T.filter(ct=>ct.nodeId!==k);const Te=Q||m.id;await De(Te)}catch(Te){t(6,v=String(Te))}}})}async function vi(k){if(!k||k.length===0)return;if(!m){t(6,v="Сначала выберите дело для добавления файлов");return}const F=k[0];await Lt(m.id,F)}function hi(k){return b===k?"tab active":"tab"}function bi(){t(23,Z=!0),t(24,R=""),t(25,K="open_url"),t(26,E="")}function gi(){t(23,Z=!1),t(24,R=""),t(26,E="")}async function Dt(){if(!(!R.trim()||!E.trim()||!m))try{const k=await X("CreateAction",m.id,K,R.trim(),E.trim());k&&k.id&&t(12,L=[...L,k]),t(23,Z=!1),t(24,R=""),t(26,E="")}catch(k){t(6,v=String(k))}}async function rl(k){try{await X("DeleteAction",k),t(12,L=L.filter(F=>F.id!==k))}catch(F){t(6,v=String(F))}}function yi(k){const F=W.find(fe=>fe.id===k);return F?F.label:k}async function Oe(k){try{const F=await X("GetNodeDetail",k);F&&wt(F)}catch(F){t(6,v=String(F))}}async function At(){try{t(50,Ne=await X("SyncStatus"))}catch{t(50,Ne={configured:!1,serverUrl:"",deviceId:"",unpushedOps:0,lastSyncAt:"",syncInterval:0})}}function wi(){t(49,Ce=!0),t(52,ie=(Ne==null?void 0:Ne.serverUrl)||""),t(53,Ie=""),t(54,je=""),t(55,Be=(Ne==null?void 0:Ne.syncInterval)||0),t(56,pe="")}function zi(){t(49,Ce=!1),t(56,pe="")}async function Ci(){t(51,V=!0),t(56,pe="");try{await X("SyncConfigure",ie,Ie,je),Be>0&&await X("SyncSetInterval",Be),t(56,pe="ok"),await At()}catch(k){t(56,pe="err: "+String(k))}t(51,V=!1)}async function Ti(){t(51,V=!0),t(56,pe="");try{await X("SyncTestConnection",ie,Ie,je),t(56,pe="connection ok")}catch(k){t(56,pe="connection failed: "+String(k))}t(51,V=!1)}async function Mi(){t(51,V=!0),t(56,pe="");try{const k=await X("SyncNow");t(56,pe="pushed "+k.pushed+", pulled "+k.pulled+" (rev "+k.serverRevision+")"),await At()}catch(k){t(56,pe="err: "+String(k))}t(51,V=!1)}const Si=k=>yt(k.id),Li=k=>wt(k),Ii=()=>t(6,v=""),Di=()=>t(6,v="");function Ai(){g.content=this.value,t(11,g)}const Ni=k=>{t(9,b=k.id),k.id==="files"&&m&&te.length===0&&!Q&&De(m.id)},Ei=()=>{t(9,b="notes"),ll()},Fi=()=>{t(9,b="files"),sl()},Hi=()=>t(9,b="worklog"),ji=k=>St(k);function Bi(){q=this.value,t(22,q)}const Oi=k=>k.key==="Enter"&&nl(),Pi=k=>St(k),Vi=k=>{const F=k.detail;F===0?(t(33,ue=[]),t(32,Q=null),De(m.id)):Rt(F-1)},Ri=k=>zt(k.detail),Ki=k=>Ct(k.detail),Wi=k=>X("OpenFile",k.detail),Ui=k=>X("OpenFolder",k.detail),qi=k=>ol(k.detail),Gi=k=>Wt(k.detail.id),Ji=k=>Kt(k.detail),Xi=k=>Ut(k.detail),Zi=k=>qt(k.detail),Yi=k=>Xt(k.detail),Qi=k=>Jt(k.detail),xi=k=>Zt(k.detail),$i=k=>X("OpenFile",k.detail),es=k=>X("RunAction",k.id),ts=k=>rl(k.id);function ls(){j=this.value,t(15,j)}function ns(){S=mt(this.value),t(14,S)}const is=k=>Oe(k.nodeId),ss=(k,F)=>F.key==="Enter"&&Oe(k.nodeId),os=k=>Oe(k.nodeId),rs=(k,F)=>F.key==="Enter"&&Oe(k.nodeId),cs=k=>Oe(k.nodeId),us=(k,F)=>F.key==="Enter"&&Oe(k.nodeId),as=k=>Oe(k.nodeId),fs=(k,F)=>F.key==="Enter"&&Oe(k.nodeId);function ks(){D=this.value,t(17,D)}const ds=k=>k.key==="Enter"&&tl();function ps(){M=Ft(this),t(18,M),t(0,n)}function _s(){z=Ft(this),t(19,z),t(20,I)}function ms(){R=this.value,t(24,R)}const vs=k=>k.key==="Enter"&&Dt();function hs(){K=Ft(this),t(25,K),t(57,W)}function bs(){E=this.value,t(26,E)}const gs=k=>k.key==="Enter"&&Dt(),ys=()=>It("copy"),ws=()=>It("link");function zs(){he=this.value,t(47,he)}function Cs(){ie=this.value,t(52,ie)}function Ts(){Ie=this.value,t(53,Ie)}function Ms(){je=this.value,t(54,je)}function Ss(){Be=mt(this.value),t(55,Be)}return[n,i,o,s,d,_,v,p,m,b,C,g,L,A,S,j,P,D,M,z,I,O,q,Z,R,K,E,ne,G,se,oe,Y,Q,ue,te,_e,$,re,ve,Ae,le,ze,Se,ot,Ee,rt,ye,he,de,Ce,Ne,V,ie,Ie,je,Be,pe,W,ft,yt,wt,De,zt,Vt,Rt,Ct,Tt,Jn,Kt,Wt,Ut,qt,Gt,Jt,Xt,Zt,$n,ei,ti,$t,ii,si,oi,ri,ci,ui,tl,ll,ai,nl,St,fi,ki,di,pi,sl,_i,It,mi,ol,hi,bi,gi,Dt,rl,yi,Oe,wi,zi,Ci,Ti,Mi,Si,Li,Ii,Di,Ai,Ni,Ei,Fi,Hi,ji,Bi,Oi,Pi,Vi,Ri,Ki,Wi,Ui,qi,Gi,Ji,Xi,Zi,Yi,Qi,xi,$i,es,ts,ls,ns,is,ss,os,rs,cs,us,as,fs,ks,ds,ps,_s,ms,vs,hs,bs,gs,ys,ws,zs,Cs,Ts,Ms,Ss]}class zr extends st{constructor(e){super(),it(this,e,wr,yr,nt,{},null,[-1,-1,-1,-1,-1,-1,-1,-1])}}new zr({target:document.getElementById("app")});
diff --git a/cmd/verstak-gui/frontend-dist/index.html b/cmd/verstak-gui/frontend-dist/index.html
index 673426f..7b93f17 100644
--- a/cmd/verstak-gui/frontend-dist/index.html
+++ b/cmd/verstak-gui/frontend-dist/index.html
@@ -16,8 +16,8 @@
background: #13131f;
}
-
-
+
+
diff --git a/cmd/verstak-server/server.go b/cmd/verstak-server/server.go
index b162c2b..9d413f5 100644
--- a/cmd/verstak-server/server.go
+++ b/cmd/verstak-server/server.go
@@ -195,7 +195,14 @@ CREATE TABLE IF NOT EXISTS server_devices (
id TEXT PRIMARY KEY,
name TEXT NOT NULL,
api_key TEXT NOT NULL UNIQUE,
+ token_hash TEXT,
+ token_prefix TEXT,
+ token_suffix TEXT,
+ user_id TEXT,
+ client_version TEXT,
+ last_ip TEXT,
last_seen TEXT,
+ revoked_at TEXT,
created_at TEXT NOT NULL
);
@@ -208,15 +215,33 @@ CREATE TABLE IF NOT EXISTS server_revisions (
CREATE TABLE IF NOT EXISTS server_ops (
op_id TEXT PRIMARY KEY,
+ server_sequence INTEGER,
device_id TEXT NOT NULL,
entity_type TEXT NOT NULL,
entity_id TEXT NOT NULL,
op_type TEXT NOT NULL,
payload_json TEXT NOT NULL,
+ idempotency_key TEXT,
+ client_sequence INTEGER DEFAULT 0,
+ last_seen_server_seq INTEGER DEFAULT 0,
created_at TEXT NOT NULL,
pushed_at TEXT NOT NULL DEFAULT (datetime('now'))
);
+CREATE TABLE IF NOT EXISTS server_tombstones (
+ entity_type TEXT NOT NULL,
+ entity_id TEXT NOT NULL,
+ op_id TEXT NOT NULL,
+ deleted_at TEXT NOT NULL,
+ PRIMARY KEY (entity_type, entity_id)
+);
+
+CREATE TABLE IF NOT EXISTS server_idempotency_keys (
+ idempotency_key TEXT PRIMARY KEY,
+ response_json TEXT NOT NULL,
+ created_at TEXT NOT NULL
+);
+
CREATE TABLE IF NOT EXISTS server_blobs (
sha256 TEXT PRIMARY KEY,
size INTEGER NOT NULL,
@@ -252,12 +277,43 @@ CREATE TABLE IF NOT EXISTS server_user_devices (
device_id TEXT NOT NULL,
PRIMARY KEY (user_id, device_id)
);
+
+CREATE TABLE IF NOT EXISTS server_audit_log (
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
+ event_type TEXT NOT NULL,
+ user_id TEXT,
+ device_id TEXT,
+ ip TEXT,
+ message TEXT,
+ created_at TEXT NOT NULL DEFAULT (datetime('now'))
+);
`
// ============================================================
// Server
// ============================================================
+type pairRateLimit struct {
+ mu sync.Mutex
+ attempts map[string]int
+}
+
+func (p *pairRateLimit) allow(ip string) bool {
+ p.mu.Lock()
+ defer p.mu.Unlock()
+ if p.attempts == nil {
+ p.attempts = make(map[string]int)
+ }
+ p.attempts[ip]++
+ return p.attempts[ip] <= 5
+}
+
+func (p *pairRateLimit) reset(ip string) {
+ p.mu.Lock()
+ defer p.mu.Unlock()
+ delete(p.attempts, ip)
+}
+
type Server struct {
db *sql.DB
cfg *Config
@@ -265,6 +321,12 @@ type Server struct {
userTokens *userTokenStore
blobsDir string
mux *http.ServeMux
+ pairLimit *pairRateLimit
+}
+
+func (s *Server) auditLog(eventType, userID, deviceID, ip, msg string) {
+ s.db.Exec("INSERT INTO server_audit_log (event_type, user_id, device_id, ip, message, created_at) VALUES (?, ?, ?, ?, ?, ?)",
+ eventType, userID, deviceID, ip, msg, time.Now().UTC().Format(time.RFC3339))
}
func NewServer(dbPath, dataDir string, cfg *Config) (*Server, error) {
@@ -288,6 +350,35 @@ func NewServer(dbPath, dataDir string, cfg *Config) (*Server, error) {
// Migrations for older databases.
db.Exec("ALTER TABLE server_users ADD COLUMN blocked INTEGER NOT NULL DEFAULT 0")
db.Exec("ALTER TABLE server_users ADD COLUMN last_seen TEXT")
+ db.Exec("ALTER TABLE server_devices ADD COLUMN token_hash TEXT")
+ db.Exec("ALTER TABLE server_devices ADD COLUMN token_prefix TEXT")
+ db.Exec("ALTER TABLE server_devices ADD COLUMN token_suffix TEXT")
+ db.Exec("ALTER TABLE server_devices ADD COLUMN user_id TEXT")
+ db.Exec("ALTER TABLE server_devices ADD COLUMN client_version TEXT")
+ db.Exec("ALTER TABLE server_devices ADD COLUMN last_ip TEXT")
+ db.Exec("ALTER TABLE server_devices ADD COLUMN revoked_at TEXT")
+
+ // Migration: add server_sequence and tombstones.
+ db.Exec("ALTER TABLE server_ops ADD COLUMN server_sequence INTEGER")
+ db.Exec("CREATE INDEX IF NOT EXISTS idx_server_ops_sequence ON server_ops(server_sequence)")
+ db.Exec("CREATE INDEX IF NOT EXISTS idx_server_ops_entity ON server_ops(entity_type, entity_id)")
+ db.Exec(`CREATE TABLE IF NOT EXISTS server_tombstones (
+ entity_type TEXT NOT NULL,
+ entity_id TEXT NOT NULL,
+ op_id TEXT NOT NULL,
+ deleted_at TEXT NOT NULL,
+ PRIMARY KEY (entity_type, entity_id)
+ )`)
+ db.Exec("CREATE INDEX IF NOT EXISTS idx_server_ops_sequence ON server_ops(server_sequence)")
+ db.Exec("CREATE INDEX IF NOT EXISTS idx_server_ops_entity ON server_ops(entity_type, entity_id)")
+ db.Exec(`CREATE TABLE IF NOT EXISTS server_idempotency_keys (
+ idempotency_key TEXT PRIMARY KEY,
+ response_json TEXT NOT NULL,
+ created_at TEXT NOT NULL
+ )`)
+ db.Exec(`ALTER TABLE server_ops ADD COLUMN idempotency_key TEXT`)
+ db.Exec(`ALTER TABLE server_ops ADD COLUMN client_sequence INTEGER DEFAULT 0`)
+ db.Exec(`ALTER TABLE server_ops ADD COLUMN last_seen_server_seq INTEGER DEFAULT 0`)
blobsDir := filepath.Join(dataDir, "blobs")
if err := os.MkdirAll(blobsDir, 0750); err != nil {
@@ -301,6 +392,7 @@ func NewServer(dbPath, dataDir string, cfg *Config) (*Server, error) {
tokens: newTokenStore(),
userTokens: newUserTokenStore(),
blobsDir: blobsDir,
+ pairLimit: &pairRateLimit{},
}
s.mux = s.routes()
return s, nil
@@ -325,6 +417,10 @@ func (s *Server) routes() *http.ServeMux {
mux.HandleFunc("/api/v1/sync/push", s.handleSyncPush)
mux.HandleFunc("/api/v1/sync/pull", s.handleSyncPull)
mux.HandleFunc("/api/v1/blobs/", s.handleBlobs)
+ mux.HandleFunc("/api/client/pair", s.handleClientPair)
+ mux.HandleFunc("/api/client/revoke-current", s.handleClientRevoke)
+ mux.HandleFunc("/api/client/me", s.handleClientMe)
+ mux.HandleFunc("/api/client/revoke-device", s.handleClientRevokeDevice)
mux.HandleFunc("/api/v1/auth/register", s.handleRegister)
mux.HandleFunc("/api/v1/auth/confirm", s.handleConfirm)
mux.HandleFunc("/api/v1/auth/login", s.handleUserLogin)
@@ -372,8 +468,32 @@ func (s *Server) requireAPIKey(w http.ResponseWriter, r *http.Request) bool {
jsonErr(w, 401, "API key required")
return false
}
+ // First try device token (hashed).
+ hash := sha256Hex(key)
+ var deviceID, userID, revokedAt sql.NullString
+ err := s.db.QueryRow("SELECT id, user_id, revoked_at FROM server_devices WHERE token_hash=?", hash).Scan(&deviceID, &userID, &revokedAt)
+ if err == nil {
+ if revokedAt.Valid && revokedAt.String != "" {
+ jsonErr(w, 401, "device revoked")
+ return false
+ }
+ // Check user not blocked.
+ var blocked int
+ if userID.Valid && userID.String != "" {
+ s.db.QueryRow("SELECT blocked FROM server_users WHERE id=?", userID.String).Scan(&blocked)
+ if blocked != 0 {
+ jsonErr(w, 403, "user blocked")
+ return false
+ }
+ }
+ r.Header.Set("X-Device-ID", deviceID.String)
+ r.Header.Set("X-User-ID", userID.String)
+ s.db.Exec("UPDATE server_devices SET last_seen=? WHERE id=?", time.Now().UTC().Format(time.RFC3339), deviceID.String)
+ return true
+ }
+ // Fallback to plain api_key (legacy).
var count int
- err := s.db.QueryRow("SELECT COUNT(*) FROM server_devices WHERE api_key=?", key).Scan(&count)
+ err = s.db.QueryRow("SELECT COUNT(*) FROM server_devices WHERE api_key=?", key).Scan(&count)
if err != nil || count == 0 {
jsonErr(w, 401, "invalid API key")
return false
@@ -425,6 +545,20 @@ a:hover{text-decoration:underline}