studiograph 1.3.3-next.21 → 1.3.3-next.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (79) hide show
  1. package/dist/cli/commands/serve.js +3 -0
  2. package/dist/cli/commands/serve.js.map +1 -1
  3. package/dist/cli/commands/sync.js +58 -17
  4. package/dist/cli/commands/sync.js.map +1 -1
  5. package/dist/core/workspace.d.ts +6 -0
  6. package/dist/core/workspace.js +47 -0
  7. package/dist/core/workspace.js.map +1 -1
  8. package/dist/server/chrome/chrome.js +23 -252
  9. package/dist/server/collab.d.ts +27 -0
  10. package/dist/server/collab.js +117 -0
  11. package/dist/server/collab.js.map +1 -0
  12. package/dist/server/index.js +11 -6
  13. package/dist/server/index.js.map +1 -1
  14. package/dist/server/routes/collab.d.ts +6 -0
  15. package/dist/server/routes/collab.js +10 -0
  16. package/dist/server/routes/collab.js.map +1 -0
  17. package/dist/server/routes/graph-api.d.ts +2 -2
  18. package/dist/server/routes/graph-api.js +27 -6
  19. package/dist/server/routes/graph-api.js.map +1 -1
  20. package/dist/server/routes/sync-api.d.ts +2 -1
  21. package/dist/server/routes/sync-api.js +13 -1
  22. package/dist/server/routes/sync-api.js.map +1 -1
  23. package/dist/server/routes/ws.js +38 -0
  24. package/dist/server/routes/ws.js.map +1 -1
  25. package/dist/server/session-manager.d.ts +40 -0
  26. package/dist/server/session-manager.js +130 -0
  27. package/dist/server/session-manager.js.map +1 -0
  28. package/dist/server/ws-hub.d.ts +60 -1
  29. package/dist/server/ws-hub.js +113 -2
  30. package/dist/server/ws-hub.js.map +1 -1
  31. package/dist/web/_app/immutable/assets/AppShell.EyPUoNrB.css +1 -0
  32. package/dist/web/_app/immutable/assets/{editor.CaaAjbLg.css → entity.Bjlko8oW.css} +1 -1
  33. package/dist/web/_app/immutable/chunks/1XQG_7uE.js +1 -0
  34. package/dist/web/_app/immutable/chunks/{BDskUnFZ.js → BIQoyk5V.js} +10 -10
  35. package/dist/web/_app/immutable/chunks/{DFSquWcI.js → BV_9Nfp2.js} +1 -1
  36. package/dist/web/_app/immutable/chunks/Bk7i2AGK.js +5 -0
  37. package/dist/web/_app/immutable/chunks/ByFfmBEu.js +2 -0
  38. package/dist/web/_app/immutable/chunks/{BzhnXU6Q.js → C5cMwwSn.js} +1 -1
  39. package/dist/web/_app/immutable/chunks/CICthOLY.js +27 -0
  40. package/dist/web/_app/immutable/chunks/CaITTL5o.js +2 -0
  41. package/dist/web/_app/immutable/chunks/{BfTJ6NzK.js → CjKjQEMp.js} +1 -1
  42. package/dist/web/_app/immutable/chunks/{GRkK54yd.js → D-tW7Byc.js} +1 -1
  43. package/dist/web/_app/immutable/chunks/{Ddy4RvyP.js → DCWeodCf.js} +1 -1
  44. package/dist/web/_app/immutable/chunks/DWSjaG46.js +1 -0
  45. package/dist/web/_app/immutable/chunks/{DRChbfXz.js → DiXzlxx7.js} +1 -1
  46. package/dist/web/_app/immutable/chunks/{BbLYZVsw.js → Dpn7ZAUg.js} +1 -1
  47. package/dist/web/_app/immutable/chunks/EhE2EcYu.js +1 -0
  48. package/dist/web/_app/immutable/chunks/dCvzTHAY.js +1 -0
  49. package/dist/web/_app/immutable/chunks/{BjnErSlK.js → eEhMI0BQ.js} +1 -1
  50. package/dist/web/_app/immutable/chunks/i6t46AUT.js +2 -0
  51. package/dist/web/_app/immutable/chunks/pwrC_shA.js +1 -0
  52. package/dist/web/_app/immutable/entry/app.DjA3G34a.js +2 -0
  53. package/dist/web/_app/immutable/entry/start.DLZQ1-hB.js +1 -0
  54. package/dist/web/_app/immutable/nodes/0.B3dFDaCX.js +2 -0
  55. package/dist/web/_app/immutable/nodes/{1.gy-UNDF3.js → 1.B7XWRWiG.js} +1 -1
  56. package/dist/web/_app/immutable/nodes/{2.CFmJZos9.js → 2.BEOcFuIE.js} +1 -1
  57. package/dist/web/_app/immutable/nodes/3.NxBZXoOo.js +1 -0
  58. package/dist/web/_app/immutable/nodes/4.DyI15z1O.js +17 -0
  59. package/dist/web/_app/immutable/nodes/{5.C7yLiq2I.js → 5.CLl1ihqQ.js} +1 -1
  60. package/dist/web/_app/immutable/nodes/{6.DKaTmAiw.js → 6.DcamPcH8.js} +1 -1
  61. package/dist/web/_app/immutable/nodes/{7.CA3sQ74A.js → 7.C8Ctaz0_.js} +1 -1
  62. package/dist/web/_app/immutable/nodes/8.B5PKapjV.js +2 -0
  63. package/dist/web/_app/immutable/nodes/{9.BVVyKTae.js → 9.CjhBf9vj.js} +1 -1
  64. package/dist/web/_app/version.json +1 -1
  65. package/dist/web/index.html +10 -10
  66. package/package.json +2 -1
  67. package/dist/web/_app/immutable/assets/AppShell.C00jH_aT.css +0 -1
  68. package/dist/web/_app/immutable/chunks/B3v6bkHV.js +0 -27
  69. package/dist/web/_app/immutable/chunks/BQlTvYWB.js +0 -1
  70. package/dist/web/_app/immutable/chunks/CRcLi9EQ.js +0 -1
  71. package/dist/web/_app/immutable/chunks/DL7u7dQi.js +0 -2
  72. package/dist/web/_app/immutable/chunks/m74CvwCG.js +0 -2
  73. package/dist/web/_app/immutable/chunks/trveDs8t.js +0 -1
  74. package/dist/web/_app/immutable/entry/app.3j3I-9SC.js +0 -2
  75. package/dist/web/_app/immutable/entry/start.CYScsHkx.js +0 -1
  76. package/dist/web/_app/immutable/nodes/0.CxCm4CPW.js +0 -2
  77. package/dist/web/_app/immutable/nodes/3.D1yvWsPv.js +0 -1
  78. package/dist/web/_app/immutable/nodes/4.LKUIo9Zg.js +0 -16
  79. package/dist/web/_app/immutable/nodes/8.DEuJARDO.js +0 -2
@@ -23,12 +23,71 @@ export interface WsRepoSyncEvent {
23
23
  actor: string;
24
24
  timestamp: string;
25
25
  }
26
- export type WsEvent = WsChangeEvent | WsRepoSyncEvent;
26
+ /** Emitted when a user's edit session closes and changes are committed. */
27
+ export interface WsSessionCommitEvent {
28
+ type: 'session_commit';
29
+ repo: string;
30
+ entities: string[];
31
+ actor: string;
32
+ timestamp: string;
33
+ }
34
+ /** Emitted when a sync pipeline run completes for a collection. */
35
+ export interface WsSyncCompleteEvent {
36
+ type: 'sync_complete';
37
+ repo: string;
38
+ source: string;
39
+ created: number;
40
+ updated: number;
41
+ deleted: number;
42
+ actor: string;
43
+ timestamp: string;
44
+ }
45
+ /** Emitted when a collection is created or deleted. */
46
+ export interface WsCollectionEvent {
47
+ type: 'collection_created' | 'collection_deleted';
48
+ repo: string;
49
+ actor: string;
50
+ timestamp: string;
51
+ }
52
+ /** Emitted when a user enters or leaves an entity view (presence). */
53
+ export interface WsPresenceEvent {
54
+ type: 'presence';
55
+ action: 'enter' | 'leave' | 'heartbeat';
56
+ repo: string;
57
+ entityType: string;
58
+ entityId: string;
59
+ user: {
60
+ id: string;
61
+ name: string;
62
+ color?: string;
63
+ };
64
+ timestamp: string;
65
+ }
66
+ export type WsEvent = WsChangeEvent | WsRepoSyncEvent | WsSessionCommitEvent | WsSyncCompleteEvent | WsCollectionEvent | WsPresenceEvent;
27
67
  export declare class WsHub {
28
68
  private clients;
29
69
  private heartbeatTimer;
70
+ private presenceMap;
30
71
  constructor();
31
72
  addClient(ws: WebSocket, user: AuthUser | null, collections: string[] | null): void;
73
+ /**
74
+ * Handle a presence message sent by a client.
75
+ * Updates server-side presence state and broadcasts to collection peers.
76
+ */
77
+ handlePresence(action: 'enter' | 'leave' | 'heartbeat', repo: string, entityType: string, entityId: string, user: {
78
+ id: string;
79
+ name: string;
80
+ color?: string;
81
+ }): void;
82
+ /** Return current presence for an entity (for initial state on connect). */
83
+ getPresence(repo: string, entityType: string, entityId: string): Array<{
84
+ id: string;
85
+ name: string;
86
+ color?: string;
87
+ }>;
88
+ /** Send the full current presence map to a single newly connected client. */
89
+ sendPresenceSnapshot(ws: WebSocket, collections: Set<string> | null): void;
90
+ private clearUserPresence;
32
91
  broadcast(event: WsEvent): void;
33
92
  get connectionCount(): number;
34
93
  destroy(): void;
@@ -4,12 +4,24 @@
4
4
  * Tracks authenticated WebSocket connections and broadcasts entity/repo
5
5
  * change events scoped to each client's collection access.
6
6
  */
7
+ const PRESENCE_STALE_MS = 90_000; // 90s — heartbeat every 30s, so 3 missed = gone
8
+ /** Assign a stable color to a user based on their id. */
9
+ const PRESENCE_COLORS = ['#4f8ef7', '#e05252', '#52c27d', '#e0a252', '#9b52e0', '#52bde0'];
10
+ function presenceColor(userId) {
11
+ let hash = 0;
12
+ for (let i = 0; i < userId.length; i++)
13
+ hash = (hash * 31 + userId.charCodeAt(i)) | 0;
14
+ return PRESENCE_COLORS[Math.abs(hash) % PRESENCE_COLORS.length];
15
+ }
7
16
  export class WsHub {
8
17
  clients = new Set();
9
18
  heartbeatTimer = null;
19
+ // entityKey → Map<userId, PresenceEntry>
20
+ presenceMap = new Map();
10
21
  constructor() {
11
- // Ping all clients every 30s, drop unresponsive ones
22
+ // Ping all clients every 30s and clean stale presence entries
12
23
  this.heartbeatTimer = setInterval(() => {
24
+ const now = Date.now();
13
25
  for (const client of this.clients) {
14
26
  if (client.ws.readyState === 1 /* OPEN */) {
15
27
  client.ws.ping();
@@ -18,6 +30,17 @@ export class WsHub {
18
30
  this.clients.delete(client);
19
31
  }
20
32
  }
33
+ // Clean stale presence
34
+ for (const [entityKey, users] of this.presenceMap) {
35
+ for (const [userId, entry] of users) {
36
+ if (now - entry.lastSeen > PRESENCE_STALE_MS) {
37
+ users.delete(userId);
38
+ // No broadcast needed — clients will expire stale entries themselves
39
+ }
40
+ }
41
+ if (users.size === 0)
42
+ this.presenceMap.delete(entityKey);
43
+ }
21
44
  }, 30_000);
22
45
  }
23
46
  addClient(ws, user, collections) {
@@ -27,9 +50,97 @@ export class WsHub {
27
50
  collections: collections ? new Set(collections) : null,
28
51
  };
29
52
  this.clients.add(client);
30
- ws.on('close', () => this.clients.delete(client));
53
+ ws.on('close', () => {
54
+ this.clients.delete(client);
55
+ // Clear presence for this user on disconnect
56
+ if (user)
57
+ this.clearUserPresence(String(user.id), user.displayName, collections);
58
+ });
31
59
  ws.on('error', () => this.clients.delete(client));
32
60
  }
61
+ /**
62
+ * Handle a presence message sent by a client.
63
+ * Updates server-side presence state and broadcasts to collection peers.
64
+ */
65
+ handlePresence(action, repo, entityType, entityId, user) {
66
+ const entityKey = `${repo}/${entityType}/${entityId}`;
67
+ const color = user.color ?? presenceColor(user.id);
68
+ if (action === 'leave') {
69
+ const users = this.presenceMap.get(entityKey);
70
+ if (users) {
71
+ users.delete(user.id);
72
+ if (users.size === 0)
73
+ this.presenceMap.delete(entityKey);
74
+ }
75
+ }
76
+ else {
77
+ // enter or heartbeat
78
+ if (!this.presenceMap.has(entityKey)) {
79
+ this.presenceMap.set(entityKey, new Map());
80
+ }
81
+ this.presenceMap.get(entityKey).set(user.id, {
82
+ user: { id: user.id, name: user.name, color },
83
+ lastSeen: Date.now(),
84
+ });
85
+ }
86
+ this.broadcast({
87
+ type: 'presence',
88
+ action,
89
+ repo,
90
+ entityType,
91
+ entityId,
92
+ user: { id: user.id, name: user.name, color },
93
+ timestamp: new Date().toISOString(),
94
+ });
95
+ }
96
+ /** Return current presence for an entity (for initial state on connect). */
97
+ getPresence(repo, entityType, entityId) {
98
+ const entityKey = `${repo}/${entityType}/${entityId}`;
99
+ const users = this.presenceMap.get(entityKey);
100
+ if (!users)
101
+ return [];
102
+ return Array.from(users.values()).map(e => e.user);
103
+ }
104
+ /** Send the full current presence map to a single newly connected client. */
105
+ sendPresenceSnapshot(ws, collections) {
106
+ const now = new Date().toISOString();
107
+ for (const [entityKey, users] of this.presenceMap) {
108
+ const [repo, entityType, entityId] = entityKey.split('/');
109
+ if (!repo || !entityType || !entityId)
110
+ continue;
111
+ if (collections && !collections.has(repo))
112
+ continue;
113
+ for (const entry of users.values()) {
114
+ ws.send(JSON.stringify({
115
+ type: 'presence',
116
+ action: 'enter',
117
+ repo,
118
+ entityType,
119
+ entityId,
120
+ user: entry.user,
121
+ timestamp: now,
122
+ }));
123
+ }
124
+ }
125
+ }
126
+ clearUserPresence(userId, userName, collections) {
127
+ for (const [entityKey, users] of this.presenceMap) {
128
+ if (users.has(userId)) {
129
+ users.delete(userId);
130
+ const [repo, entityType, entityId] = entityKey.split('/');
131
+ if (repo && entityType && entityId) {
132
+ this.broadcast({
133
+ type: 'presence', action: 'leave',
134
+ repo, entityType, entityId,
135
+ user: { id: userId, name: userName },
136
+ timestamp: new Date().toISOString(),
137
+ });
138
+ }
139
+ if (users.size === 0)
140
+ this.presenceMap.delete(entityKey);
141
+ }
142
+ }
143
+ }
33
144
  broadcast(event) {
34
145
  const payload = JSON.stringify(event);
35
146
  for (const client of this.clients) {
@@ -1 +1 @@
1
- {"version":3,"file":"ws-hub.js","sourceRoot":"","sources":["../../src/server/ws-hub.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgCH,MAAM,OAAO,KAAK;IACR,OAAO,GAAG,IAAI,GAAG,EAAY,CAAC;IAC9B,cAAc,GAA0C,IAAI,CAAC;IAErE;QACE,qDAAqD;QACrD,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;YACrC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBAClC,IAAI,MAAM,CAAC,EAAE,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU,EAAE,CAAC;oBAC1C,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;gBACnB,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC;QACH,CAAC,EAAE,MAAM,CAAC,CAAC;IACb,CAAC;IAED,SAAS,CAAC,EAAa,EAAE,IAAqB,EAAE,WAA4B;QAC1E,MAAM,MAAM,GAAa;YACvB,EAAE;YACF,IAAI;YACJ,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI;SACvD,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAEzB,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QAClD,EAAE,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACpD,CAAC;IAED,SAAS,CAAC,KAAc;QACtB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACtC,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,MAAM,CAAC,EAAE,CAAC,UAAU,KAAK,CAAC,CAAC,UAAU;gBAAE,SAAS;YACpD,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YACnD,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,IAAI,eAAe;QACjB,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IAC3B,CAAC;IAED,OAAO;QACL,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACnC,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;QACD,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IAEO,UAAU,CAAC,MAAgB,EAAE,IAAY;QAC/C,sDAAsD;QACtD,IAAI,CAAC,MAAM,CAAC,WAAW;YAAE,OAAO,IAAI,CAAC;QACrC,OAAO,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;CACF"}
1
+ {"version":3,"file":"ws-hub.js","sourceRoot":"","sources":["../../src/server/ws-hub.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ .dialog-overlay{position:fixed;inset:0;z-index:1000;background:#0009}[data-theme=light] .dialog-overlay{background:#00000040}.dialog-content{position:fixed;z-index:1001;top:80px;left:50%;transform:translate(-50%);display:flex;flex-direction:column;background:var(--color-bg-elevated);border:1px solid var(--color-border-strong);border-radius:12px;overflow:hidden;box-shadow:0 24px 80px #00000080;max-height:calc(100vh - 120px)}.dialog-sm{width:420px;max-width:90vw}.dialog-md{width:560px;max-width:90vw}.dialog-lg{width:680px;max-width:90vw}.dialog-xl{width:800px;max-width:90vw}.dialog-fit{width:fit-content;min-width:320px;max-width:min(640px,90vw)}.dialog-header{display:flex;align-items:center;justify-content:space-between;padding:20px 24px 0;flex-shrink:0}.dialog-title{font-size:16px;font-weight:500;color:var(--color-text-primary);margin:0}.dialog-description{font-size:13px;color:var(--color-text-secondary);line-height:1.5;margin:0}.dialog-body{padding:12px 24px 20px;overflow-y:auto;flex:1;min-height:0}.dialog-footer{display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:16px 24px;border-top:1px solid var(--color-border);flex-shrink:0}.dialog-close-btn{width:28px;height:28px;display:flex;align-items:center;justify-content:center;border:none;background:transparent;color:var(--color-text-tertiary);cursor:pointer;border-radius:6px;line-height:1;transition:color .15s,background .15s}.dialog-close-btn:hover{background:var(--color-bg-hover);color:var(--color-text-primary)}.entity-body{padding:16px 24px 24px;display:flex;flex-direction:column;gap:20px}.type-section.svelte-ak7t5k{display:flex;flex-direction:column;gap:8px}.type-section-label.svelte-ak7t5k{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-tertiary)}.type-grid.svelte-ak7t5k{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.type-grid.svelte-ak7t5k .type-card{display:flex;flex-direction:column;align-items:flex-start;gap:10px;padding:12px;height:auto;border-radius:8px;text-align:left;color:var(--color-text-secondary);justify-content:flex-start}.type-grid.svelte-ak7t5k .type-card:hover{background:var(--color-bg-hover);border-color:var(--color-border-strong)}.type-grid.svelte-ak7t5k .type-card:hover .type-name{color:var(--color-text-primary)}.type-dot.svelte-ak7t5k{width:8px;height:8px;border-radius:50%}.type-info.svelte-ak7t5k{display:flex;flex-direction:column;gap:2px}.type-name.svelte-ak7t5k{font-size:13px;font-weight:500;color:var(--color-text-secondary)}.type-desc.svelte-ak7t5k{font-size:11px;color:var(--color-text-tertiary);line-height:1.3}.sidebar.svelte-6dohdz{width:340px;min-width:340px;display:flex;flex-direction:column;overflow:hidden;background:var(--color-bg);border-right:1px solid var(--color-border)}.sidebar-header.svelte-6dohdz{height:40px;display:flex;align-items:center;gap:11px;padding:0 12px 0 19px;border-bottom:1px solid var(--color-border);flex-shrink:0}.sidebar-header.svelte-6dohdz .settings-btn{margin-left:auto}.sidebar-header.svelte-6dohdz .home-btn{display:inline-flex;align-items:center;gap:11px;padding:0;min-width:0;text-align:left;border-radius:0;height:auto;background:transparent!important}.sidebar-header.svelte-6dohdz .home-btn:hover .workspace-icon{opacity:.8}.sidebar-header.svelte-6dohdz .home-btn:hover .workspace-name{color:var(--color-text-secondary)}.workspace-icon.svelte-6dohdz{width:22px;height:22px;border-radius:50%;background:var(--color-accent, #6e6ee8);color:#fff;display:flex;align-items:center;justify-content:center;font-weight:600;font-size:10px;flex-shrink:0}.workspace-name.svelte-6dohdz{flex:1;font-size:13px;font-weight:600;color:var(--color-text-primary)}.settings-nav.svelte-6dohdz{display:flex;flex-direction:column;flex:1;padding-top:0}.settings-nav.svelte-6dohdz button[data-slot=tabs-trigger]{display:flex;align-items:center;width:100%;height:40px;padding:0 12px 0 19px;gap:11px;border:none;background:transparent;cursor:pointer;font-family:inherit;font-size:13px;color:var(--color-text-secondary);transition:color .15s,background .15s}.settings-nav.svelte-6dohdz button[data-slot=tabs-trigger]:hover{background:var(--color-bg-hover);color:var(--color-text-primary)}.settings-nav.svelte-6dohdz button[data-slot=tabs-trigger][data-state=active]{background:var(--color-bg-hover);color:var(--color-text-primary);font-weight:500}.settings-nav.svelte-6dohdz button[data-slot=tabs-trigger] svg{width:14px;height:14px;flex-shrink:0;box-sizing:content-box;padding:0 4px}.filter-bar.svelte-6dohdz{position:relative;display:flex;align-items:center;height:40px;padding:0 12px 0 52px;border-bottom:1px solid var(--color-border);flex-shrink:0}.filter-icon.svelte-6dohdz{position:absolute;left:22px;top:50%;transform:translateY(-50%);display:flex;align-items:center;justify-content:center;width:16px;color:var(--color-text-tertiary)}.filter-bar.svelte-6dohdz .filter-input{flex:1;background:transparent;border:none;outline:none;padding:0;margin:0;font-size:13px;line-height:1.4;height:auto;border-radius:0}.filter-bar.svelte-6dohdz .filter-clear{width:20px;height:20px;flex-shrink:0}.filter-bar.svelte-6dohdz .sort-toggle{width:28px;height:28px;flex-shrink:0;margin-left:4px}.filter-bar.svelte-6dohdz .sort-toggle.active{color:var(--color-accent, #6e6ee8)}.repo-type-icon.svelte-6dohdz{display:inline-flex;align-items:center;color:var(--color-text-tertiary);margin-right:6px;flex-shrink:0;align-self:center}.tree.svelte-6dohdz{flex:1;overflow-y:auto;padding-top:0}.tree-group.svelte-6dohdz{display:flex;flex-direction:column}.tree-group.svelte-6dohdz+.tree-group:where(.svelte-6dohdz){margin-top:0}.repo-row{display:flex;align-items:baseline;height:32px;line-height:32px;width:100%;padding:0 12px 0 20px;border:none;background:transparent;font-family:inherit;text-align:left;border-left:2px solid transparent;border-radius:0;gap:0;justify-content:flex-start}.repo-row:hover,.repo-row.focused{background:var(--color-bg-hover)}.repo-row.repo-active{border-left-color:var(--active-color)}.repo-name.svelte-6dohdz{font-size:13px;color:var(--color-text-secondary)}.repo-row.repo-active .repo-name.svelte-6dohdz,.repo-row.repo-active .repo-type-icon.svelte-6dohdz{font-weight:600;color:var(--color-text-primary)}.tree-row{position:relative;display:flex;align-items:baseline;height:32px;line-height:32px;padding-right:40px;color:var(--color-text-secondary);font-size:13px;border:none;background:transparent;font-family:inherit;text-align:left;width:100%;border-left:2px solid transparent;border-radius:0;gap:0;justify-content:flex-start}.tree-row:hover,.tree-row.focused{background:var(--color-bg-hover)}.tree-row.selected{background:var(--color-bg-selected);border-left-color:var(--active-color);color:var(--color-text-primary);font-weight:600}.row-chevron.svelte-6dohdz{display:inline-flex;align-items:center;justify-content:center;width:16px;height:32px;flex-shrink:0;margin-right:14px;color:var(--color-text-tertiary);align-self:center}.row-label.svelte-6dohdz{flex:1;overflow:hidden;white-space:nowrap;mask-image:linear-gradient(to right,black calc(100% - 16px),transparent 100%);-webkit-mask-image:linear-gradient(to right,black calc(100% - 16px),transparent 100%)}.item-count.svelte-6dohdz{font-size:11px;color:var(--color-text-tertiary);margin-left:8px;flex-shrink:0}.indent-group.svelte-6dohdz{position:relative}.indent-group.svelte-6dohdz:before{content:"";position:absolute;left:var(--guide-left);top:0;bottom:0;width:1px;background:var(--color-border);pointer-events:none}.loading-row.svelte-6dohdz{height:32px;display:flex;align-items:center;font-size:13px;color:var(--color-text-tertiary)}.type-header-row{color:var(--color-text-secondary);border-left:2px solid transparent}.type-header-row.type-active{color:var(--color-text-primary);font-weight:600}.type-header-row .row-label.svelte-6dohdz{flex:none;mask-image:none;-webkit-mask-image:none}.new-entity-row{color:var(--color-text-tertiary);align-items:center}.new-entity-row:hover{color:var(--color-text-secondary)}.entity-row-wrapper.svelte-6dohdz{position:relative;display:flex;align-items:center}.entity-row-wrapper.svelte-6dohdz .tree-row{flex:1;min-width:0}.entity-row-wrapper.svelte-6dohdz .entity-delete-btn{display:none;width:20px;height:20px;position:absolute;right:16px;flex-shrink:0;padding:0}.entity-row-wrapper.svelte-6dohdz .entity-delete-btn:hover{color:var(--color-error, #e55)}.entity-row-wrapper.svelte-6dohdz:hover .tree-row{background:var(--color-bg-hover)}.entity-row-wrapper.svelte-6dohdz:hover .entity-delete-btn{display:inline-flex}.entity-type-dot.svelte-6dohdz{width:6px;height:6px;border-radius:50%;flex-shrink:0;margin-right:19px;align-self:center}.recent-time.svelte-6dohdz{font-size:11px;color:var(--color-text-tertiary);position:absolute;right:26px;top:50%;transform:translate(50%,-50%);white-space:nowrap}.entity-row-wrapper.svelte-6dohdz:hover .recent-time:where(.svelte-6dohdz){display:none}.presence-stack.svelte-6dohdz{display:flex;align-items:center;gap:-4px;margin-left:auto;flex-shrink:0;align-self:center}.presence-avatar.svelte-6dohdz{width:18px;height:18px;border-radius:50%;font-size:9px;font-weight:600;color:#fff;background:var(--color-accent);display:flex;align-items:center;justify-content:center;margin-left:-3px;border:1px solid var(--color-bg);box-sizing:border-box;flex-shrink:0;align-self:center}.presence-stack.svelte-6dohdz .presence-avatar:where(.svelte-6dohdz):first-child{margin-left:4px}.presence-avatar.svelte-6dohdz:nth-child(1){z-index:3}.presence-avatar.svelte-6dohdz:nth-child(2){z-index:2}.presence-avatar.svelte-6dohdz:nth-child(3){z-index:1}.filter-match.svelte-6dohdz{background:color-mix(in srgb,var(--color-accent, #6e6ee8) 25%,transparent);color:inherit;border-radius:2px;padding:0}.no-results.svelte-6dohdz{padding:24px 16px;font-size:13px;color:var(--color-text-tertiary);text-align:center}.repo-row .repo-rename-input{flex:1;min-width:0;height:100%;padding:0 6px;margin:0;border:1px solid var(--color-accent, #6e6ee8);border-radius:3px;font-size:13px;font-weight:600}.repo-row-wrapper.svelte-6dohdz{position:relative;display:flex;align-items:center}.repo-row-wrapper.svelte-6dohdz .repo-row{flex:1;min-width:0}.repo-row-wrapper.svelte-6dohdz .repo-delete-btn{display:none;width:20px;height:20px;position:absolute;right:16px;flex-shrink:0;padding:0}.repo-row-wrapper.svelte-6dohdz .repo-delete-btn:hover{color:var(--color-error, #e55)}.repo-row-wrapper.svelte-6dohdz:hover .repo-row{background:var(--color-bg-hover)}.repo-row-wrapper.svelte-6dohdz:hover .repo-delete-btn{display:inline-flex}.repo-row-wrapper.svelte-6dohdz .repo-sync-btn{display:none;width:20px;height:20px;position:absolute;right:44px;flex-shrink:0;padding:0}.repo-row-wrapper.svelte-6dohdz .repo-sync-btn:hover{color:var(--color-accent, #4af)}.repo-row-wrapper.svelte-6dohdz .repo-sync-btn.syncing{display:inline-flex;animation:svelte-6dohdz-spin 1s linear infinite}.repo-row-wrapper.svelte-6dohdz:hover .repo-sync-btn{display:inline-flex}@keyframes svelte-6dohdz-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.new-collection-btn,.new-collection-btn .repo-name.svelte-6dohdz,.new-collection-btn .row-chevron.svelte-6dohdz{color:var(--color-text-tertiary)}.new-collection-btn:hover,.new-collection-btn:hover .repo-name.svelte-6dohdz{color:var(--color-text-secondary)}.new-collection-row.svelte-6dohdz{display:flex;align-items:center;height:32px;padding:0 12px 0 20px;border-left:2px solid transparent}.new-collection-row.svelte-6dohdz .new-collection-input{flex:1;height:100%;padding:0 0 0 30px;border:none;background:transparent;font-size:13px;border-radius:0}.new-collection-row.svelte-6dohdz .new-collection-clear{width:20px;height:20px;flex-shrink:0;margin-right:4px}.new-collection-row.svelte-6dohdz .private-toggle{width:20px;height:20px;flex-shrink:0;margin-left:auto;margin-right:4px;color:var(--color-text-secondary)}.new-collection-row.svelte-6dohdz .private-toggle.active{color:var(--color-accent, #6e6ee8)}@keyframes svelte-6dohdz-shake{0%,to{transform:translate(0)}20%{transform:translate(-4px)}40%{transform:translate(4px)}60%{transform:translate(-3px)}80%{transform:translate(2px)}}.new-collection-row.svelte-6dohdz .new-collection-input.shake{animation:svelte-6dohdz-shake .3s ease-in-out}.sidebar-footer.svelte-6dohdz{display:flex;align-items:center;height:40px;padding:0 12px 0 19px;border-top:1px solid var(--color-border);flex-shrink:0;gap:8px}.user-email.svelte-6dohdz{flex:1;font-size:12px;color:var(--color-text-tertiary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sidebar-footer.svelte-6dohdz .footer-icon-btn{width:28px;height:28px}.search-header.svelte-1xems06{display:flex;align-items:center;height:52px;padding:0 16px;gap:10px;border-bottom:1px solid var(--color-border)}.search-header.svelte-1xems06 svg{color:var(--color-text-tertiary);flex-shrink:0}.search-header.svelte-1xems06 .search-input{flex:1;font-size:15px;line-height:20px;border:none;background:transparent;box-shadow:none;padding:0;height:auto}.search-header.svelte-1xems06 .search-input:focus{box-shadow:none;border:none}.esc-badge.svelte-1xems06{font-family:var(--font-sans);font-size:11px;line-height:1;padding:3px 6px;border-radius:4px;background:var(--color-bg-surface);border:1px solid var(--color-border);color:var(--color-text-tertiary)}.results-list.svelte-1xems06{flex:1;overflow-y:auto;min-height:0}.empty-results.svelte-1xems06{padding:24px 16px;text-align:center;font-size:13px;color:var(--color-text-tertiary)}.results-list.svelte-1xems06 .result-row{display:flex;align-items:flex-start;padding:10px 16px;width:100%;text-align:left;border-radius:0;height:auto;justify-content:flex-start}.results-list.svelte-1xems06 .result-row:hover,.results-list.svelte-1xems06 .result-row.selected{background:var(--color-bg-hover)}.result-body.svelte-1xems06{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.result-title-row.svelte-1xems06{display:flex;align-items:center;gap:8px}.result-title.svelte-1xems06{font-size:13px;font-weight:500;color:var(--color-text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.entity-tag.svelte-1xems06{flex-shrink:0;font-size:10px;font-weight:500;letter-spacing:.04em;text-transform:uppercase;padding:1px 6px;border-radius:3px;background:var(--color-badge-bg);color:var(--color-badge-text)}.result-meta.svelte-1xems06{font-size:12px;color:var(--color-text-tertiary)}.search-footer.svelte-1xems06{display:flex;align-items:center;height:39px;padding:0 16px;gap:16px;border-top:1px solid var(--color-border)}.shortcut-group.svelte-1xems06{display:flex;align-items:center;gap:4px}.shortcut-key.svelte-1xems06{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 4px;border-radius:4px;background:var(--color-bg-surface);border:1px solid var(--color-border);color:var(--color-text-tertiary)}.shortcut-label.svelte-1xems06{font-size:11px;color:var(--color-text-tertiary);margin-left:2px}.app-frame.svelte-vr1z90{width:100vw;height:100vh;display:flex;flex-direction:column;overflow:hidden;background:var(--color-bg)}.app-body.svelte-vr1z90{flex:1;display:flex;min-height:0;overflow:hidden}.main-content.svelte-vr1z90{flex:1;display:flex;flex-direction:column;min-width:0;min-height:0;overflow:hidden}#sg-chrome-footer{flex-shrink:0}
@@ -1 +1 @@
1
- .autocomplete.svelte-84vb17{position:relative;width:100%}.input-row.svelte-84vb17{display:flex;flex-wrap:wrap;align-items:center;gap:4px;min-height:22px;padding:0;background:transparent;border:none;border-radius:4px}.chip.svelte-84vb17{display:inline-flex;align-items:center;gap:4px;height:20px;padding:0 8px;border-radius:9999px;font-size:12px;background:var(--color-accent-muted);color:var(--color-link, #8b8bf0);flex-shrink:0}.chip.svelte-84vb17 .chip-remove{width:14px;height:14px;padding:0;color:var(--color-text-tertiary);font-size:12px;line-height:1}.chip.svelte-84vb17 .chip-remove:hover{color:var(--color-text-primary)}.ac-input.svelte-84vb17{flex:1;min-width:80px;height:22px;padding:0;font-size:13px;font-family:inherit;color:var(--color-text-primary);background:transparent;border:none;outline:none}.dropdown.svelte-84vb17{position:absolute;top:100%;left:0;right:0;margin-top:4px;max-height:240px;overflow-y:auto;background:var(--color-bg-elevated);border:1px solid var(--color-border);border-radius:6px;box-shadow:0 4px 16px #00000040;z-index:50}.dropdown-item.svelte-84vb17{display:flex;align-items:center;justify-content:space-between;padding:6px 10px;cursor:pointer;gap:8px}.dropdown-item.highlighted.svelte-84vb17{background:var(--color-bg-hover)}.entity-title.svelte-84vb17{font-size:13px;color:var(--color-text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.entity-meta.svelte-84vb17{display:flex;align-items:center;gap:6px;flex-shrink:0}.entity-type-badge.svelte-84vb17{font-size:11px;padding:1px 6px;border-radius:9999px;background:var(--color-badge-bg);color:var(--color-badge-text)}.entity-repo.svelte-84vb17{font-size:11px;color:var(--color-text-tertiary)}.inline-properties.svelte-x7sio8{padding:16px 40px 8px;border-bottom:1px solid var(--color-border)}.ip-row.svelte-x7sio8{display:grid;grid-template-columns:20px 120px 1fr;align-items:start;gap:8px;padding:5px 8px;margin:0 -8px;border-radius:4px;min-height:30px;outline:2px solid transparent;transition:outline-color .1s}.ip-row.svelte-x7sio8:hover{outline-color:var(--color-border)}.ip-row.ip-focused.svelte-x7sio8{outline-color:var(--color-accent)}.ip-icon.svelte-x7sio8{display:flex;align-items:center;justify-content:center;color:var(--color-text-tertiary);position:relative;height:22px}.ip-key.svelte-x7sio8{font-size:13px;color:var(--color-text-tertiary);line-height:22px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ip-value.svelte-x7sio8{display:flex;align-items:center;min-height:22px;line-height:22px;position:relative;cursor:text}.ip-edit-input.svelte-x7sio8{font-size:13px;font-family:inherit;color:var(--color-text-primary);background:transparent;border:none;padding:0 4px;height:22px;line-height:22px;width:100%;outline:none}.ip-status-wrap.svelte-x7sio8{position:relative;width:100%}.ip-status-dropdown.svelte-x7sio8{position:absolute;top:100%;left:-4px;margin-top:4px;min-width:180px;background:var(--color-bg-elevated);border:1px solid var(--color-border);border-radius:6px;box-shadow:0 4px 16px #00000040;z-index:50;padding:4px;max-height:240px;overflow-y:auto}.ip-status-dropdown.svelte-x7sio8 .ip-status-option{display:flex;align-items:center;gap:6px;width:100%;padding:5px 8px;font-size:13px;color:var(--color-text-primary);border-radius:4px;text-align:left;justify-content:flex-start;height:auto}.ip-status-dropdown.svelte-x7sio8 .ip-status-option:hover{background:var(--color-bg-hover)}.ip-status-dropdown.svelte-x7sio8 .ip-status-option.selected{color:var(--color-accent)}.ip-cal-wrap.svelte-x7sio8{position:relative;width:100%}.ip-cal-dropdown.svelte-x7sio8{position:absolute;top:100%;left:-4px;margin-top:4px;background:var(--color-bg-elevated);border:1px solid var(--color-border);border-radius:6px;box-shadow:0 4px 16px #00000040;z-index:50;padding:12px;width:264px}.ip-cal-header.svelte-x7sio8{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.ip-cal-title.svelte-x7sio8{font-size:13px;font-weight:500;color:var(--color-text-primary)}.ip-cal-header.svelte-x7sio8 .ip-cal-nav{width:28px;height:28px}.ip-cal-weekdays.svelte-x7sio8{display:grid;grid-template-columns:repeat(7,1fr);margin-bottom:4px}.ip-cal-wd.svelte-x7sio8{font-size:11px;color:var(--color-text-tertiary);text-align:center;padding:4px 0}.ip-cal-week.svelte-x7sio8{display:grid;grid-template-columns:repeat(7,1fr)}.ip-cal-week.svelte-x7sio8 .ip-cal-day{display:flex;align-items:center;justify-content:center;width:100%;aspect-ratio:1;border-radius:4px;font-size:13px;color:var(--color-text-primary);padding:0;height:auto}.ip-cal-week.svelte-x7sio8 .ip-cal-day:hover{background:var(--color-bg-hover)}.ip-cal-week.svelte-x7sio8 .ip-cal-day.outside{color:var(--color-text-tertiary);opacity:.5}.ip-cal-week.svelte-x7sio8 .ip-cal-day.today{font-weight:600;color:var(--color-accent)}.ip-cal-week.svelte-x7sio8 .ip-cal-day.selected{background:var(--color-accent);color:#fff;font-weight:500}.ip-cal-week.svelte-x7sio8 .ip-cal-day.selected:hover{background:var(--color-accent-hover)}.ip-badge.svelte-x7sio8{display:inline-flex;align-items:center;height:22px;padding:0 8px;border-radius:9999px;font-size:12px;text-transform:lowercase;background:var(--color-badge-bg);color:var(--color-badge-text)}.ip-wikilink-group.svelte-x7sio8{display:flex;flex-wrap:wrap;gap:6px}.ip-wikilink-group.svelte-x7sio8 .ip-wikilink-chip{display:inline-flex;align-items:center;height:22px;padding:0 8px;border-radius:9999px;font-size:12px;background:var(--color-accent-muted);color:var(--color-link, #8b8bf0)}.ip-wikilink-group.svelte-x7sio8 .ip-wikilink-chip:hover{background:#8b8bf029}.ip-status-value.svelte-x7sio8{display:flex;align-items:center;gap:5px;height:22px}.ip-status-dot.svelte-x7sio8{width:6px;height:6px;border-radius:3px;flex-shrink:0}.ip-status-text.svelte-x7sio8,.ip-date-text.svelte-x7sio8,.ip-text-value.svelte-x7sio8{font-size:13px;line-height:22px;color:var(--color-text-primary)}.ip-url-link.svelte-x7sio8{font-size:13px;line-height:22px;color:var(--color-link, #8b8bf0);text-decoration:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ip-url-link.svelte-x7sio8:hover{text-decoration:underline}.inline-properties.svelte-x7sio8 .ip-add-btn{margin:8px -8px;font-size:13px}.ip-add-key-input.svelte-x7sio8{font-size:13px;font-family:inherit;color:var(--color-text-primary);background:transparent;border:none;border-bottom:1px solid var(--color-accent);padding:2px 0;width:100%;outline:none}.ip-add-row.svelte-x7sio8{background:var(--color-bg-hover)}.ip-icon-trigger{all:unset;display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:4px;color:var(--color-text-tertiary)}.ip-icon-trigger:hover{color:var(--color-text-secondary)}.ip-menu-content{min-width:160px;background:var(--color-bg-elevated);border:1px solid var(--color-border);border-radius:6px;box-shadow:0 4px 16px #00000040;z-index:50;padding:4px}.ip-menu-item{display:flex;align-items:center;gap:8px;width:100%;padding:5px 8px;font-size:13px;cursor:pointer;border-radius:4px;color:var(--color-text-primary)}.ip-menu-item:hover,.ip-menu-item[data-highlighted]{background:var(--color-bg-hover)}.ip-menu-destructive{color:var(--color-destructive)!important}.ip-menu-destructive:hover,.ip-menu-destructive[data-highlighted]{background:#e54d4d1a!important}.ip-menu-item-icon.svelte-x7sio8{display:flex;align-items:center;flex-shrink:0}.ip-menu-check.svelte-x7sio8{margin-left:auto;display:flex;align-items:center}.ip-menu-sep{height:1px;background:var(--color-border);margin:4px 0}.editor-wrap.svelte-ok7wy5{display:flex;min-height:0}.cm-container.svelte-ok7wy5{flex:1}.cm-container.svelte-ok7wy5 .cm-editor{min-height:400px;outline:none}.cm-container.svelte-ok7wy5 .cm-scroller{overflow:visible!important}
1
+ .autocomplete.svelte-84vb17{position:relative;width:100%}.input-row.svelte-84vb17{display:flex;flex-wrap:wrap;align-items:center;gap:4px;min-height:22px;padding:0;background:transparent;border:none;border-radius:4px}.chip.svelte-84vb17{display:inline-flex;align-items:center;gap:4px;height:20px;padding:0 8px;border-radius:9999px;font-size:12px;background:var(--color-accent-muted);color:var(--color-link, #8b8bf0);flex-shrink:0}.chip.svelte-84vb17 .chip-remove{width:14px;height:14px;padding:0;color:var(--color-text-tertiary);font-size:12px;line-height:1}.chip.svelte-84vb17 .chip-remove:hover{color:var(--color-text-primary)}.ac-input.svelte-84vb17{flex:1;min-width:80px;height:22px;padding:0;font-size:13px;font-family:inherit;color:var(--color-text-primary);background:transparent;border:none;outline:none}.dropdown.svelte-84vb17{position:absolute;top:100%;left:0;right:0;margin-top:4px;max-height:240px;overflow-y:auto;background:var(--color-bg-elevated);border:1px solid var(--color-border);border-radius:6px;box-shadow:0 4px 16px #00000040;z-index:50}.dropdown-item.svelte-84vb17{display:flex;align-items:center;justify-content:space-between;padding:6px 10px;cursor:pointer;gap:8px}.dropdown-item.highlighted.svelte-84vb17{background:var(--color-bg-hover)}.entity-title.svelte-84vb17{font-size:13px;color:var(--color-text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}.entity-meta.svelte-84vb17{display:flex;align-items:center;gap:6px;flex-shrink:0}.entity-type-badge.svelte-84vb17{font-size:11px;padding:1px 6px;border-radius:9999px;background:var(--color-badge-bg);color:var(--color-badge-text)}.entity-repo.svelte-84vb17{font-size:11px;color:var(--color-text-tertiary)}.inline-properties.svelte-x7sio8{padding:16px 40px 8px;border-bottom:1px solid var(--color-border)}.ip-row.svelte-x7sio8{display:grid;grid-template-columns:20px 120px 1fr;align-items:start;gap:8px;padding:5px 8px;margin:0 -8px;border-radius:4px;min-height:30px;outline:2px solid transparent;transition:outline-color .1s}.ip-row.svelte-x7sio8:hover{outline-color:var(--color-border)}.ip-row.ip-focused.svelte-x7sio8{outline-color:var(--color-accent)}.ip-icon.svelte-x7sio8{display:flex;align-items:center;justify-content:center;color:var(--color-text-tertiary);position:relative;height:22px}.ip-key.svelte-x7sio8{font-size:13px;color:var(--color-text-tertiary);line-height:22px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ip-value.svelte-x7sio8{display:flex;align-items:center;min-height:22px;line-height:22px;position:relative;cursor:text}.ip-edit-input.svelte-x7sio8{font-size:13px;font-family:inherit;color:var(--color-text-primary);background:transparent;border:none;padding:0 4px;height:22px;line-height:22px;width:100%;outline:none}.ip-status-wrap.svelte-x7sio8{position:relative;width:100%}.ip-status-dropdown.svelte-x7sio8{position:absolute;top:100%;left:-4px;margin-top:4px;min-width:180px;background:var(--color-bg-elevated);border:1px solid var(--color-border);border-radius:6px;box-shadow:0 4px 16px #00000040;z-index:50;padding:4px;max-height:240px;overflow-y:auto}.ip-status-dropdown.svelte-x7sio8 .ip-status-option{display:flex;align-items:center;gap:6px;width:100%;padding:5px 8px;font-size:13px;color:var(--color-text-primary);border-radius:4px;text-align:left;justify-content:flex-start;height:auto}.ip-status-dropdown.svelte-x7sio8 .ip-status-option:hover{background:var(--color-bg-hover)}.ip-status-dropdown.svelte-x7sio8 .ip-status-option.selected{color:var(--color-accent)}.ip-cal-wrap.svelte-x7sio8{position:relative;width:100%}.ip-cal-dropdown.svelte-x7sio8{position:absolute;top:100%;left:-4px;margin-top:4px;background:var(--color-bg-elevated);border:1px solid var(--color-border);border-radius:6px;box-shadow:0 4px 16px #00000040;z-index:50;padding:12px;width:264px}.ip-cal-header.svelte-x7sio8{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.ip-cal-title.svelte-x7sio8{font-size:13px;font-weight:500;color:var(--color-text-primary)}.ip-cal-header.svelte-x7sio8 .ip-cal-nav{width:28px;height:28px}.ip-cal-weekdays.svelte-x7sio8{display:grid;grid-template-columns:repeat(7,1fr);margin-bottom:4px}.ip-cal-wd.svelte-x7sio8{font-size:11px;color:var(--color-text-tertiary);text-align:center;padding:4px 0}.ip-cal-week.svelte-x7sio8{display:grid;grid-template-columns:repeat(7,1fr)}.ip-cal-week.svelte-x7sio8 .ip-cal-day{display:flex;align-items:center;justify-content:center;width:100%;aspect-ratio:1;border-radius:4px;font-size:13px;color:var(--color-text-primary);padding:0;height:auto}.ip-cal-week.svelte-x7sio8 .ip-cal-day:hover{background:var(--color-bg-hover)}.ip-cal-week.svelte-x7sio8 .ip-cal-day.outside{color:var(--color-text-tertiary);opacity:.5}.ip-cal-week.svelte-x7sio8 .ip-cal-day.today{font-weight:600;color:var(--color-accent)}.ip-cal-week.svelte-x7sio8 .ip-cal-day.selected{background:var(--color-accent);color:#fff;font-weight:500}.ip-cal-week.svelte-x7sio8 .ip-cal-day.selected:hover{background:var(--color-accent-hover)}.ip-badge.svelte-x7sio8{display:inline-flex;align-items:center;height:22px;padding:0 8px;border-radius:9999px;font-size:12px;text-transform:lowercase;background:var(--color-badge-bg);color:var(--color-badge-text)}.ip-wikilink-group.svelte-x7sio8{display:flex;flex-wrap:wrap;gap:6px}.ip-wikilink-group.svelte-x7sio8 .ip-wikilink-chip{display:inline-flex;align-items:center;height:22px;padding:0 8px;border-radius:9999px;font-size:12px;background:var(--color-accent-muted);color:var(--color-link, #8b8bf0)}.ip-wikilink-group.svelte-x7sio8 .ip-wikilink-chip:hover{background:#8b8bf029}.ip-status-value.svelte-x7sio8{display:flex;align-items:center;gap:5px;height:22px}.ip-status-dot.svelte-x7sio8{width:6px;height:6px;border-radius:3px;flex-shrink:0}.ip-status-text.svelte-x7sio8,.ip-date-text.svelte-x7sio8,.ip-text-value.svelte-x7sio8{font-size:13px;line-height:22px;color:var(--color-text-primary)}.ip-url-link.svelte-x7sio8{font-size:13px;line-height:22px;color:var(--color-link, #8b8bf0);text-decoration:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ip-url-link.svelte-x7sio8:hover{text-decoration:underline}.inline-properties.svelte-x7sio8 .ip-add-btn{margin:8px -8px;font-size:13px}.ip-add-key-input.svelte-x7sio8{font-size:13px;font-family:inherit;color:var(--color-text-primary);background:transparent;border:none;border-bottom:1px solid var(--color-accent);padding:2px 0;width:100%;outline:none}.ip-add-row.svelte-x7sio8{background:var(--color-bg-hover)}.ip-icon-trigger{all:unset;display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:4px;color:var(--color-text-tertiary)}.ip-icon-trigger:hover{color:var(--color-text-secondary)}.ip-menu-content{min-width:160px;background:var(--color-bg-elevated);border:1px solid var(--color-border);border-radius:6px;box-shadow:0 4px 16px #00000040;z-index:50;padding:4px}.ip-menu-item{display:flex;align-items:center;gap:8px;width:100%;padding:5px 8px;font-size:13px;cursor:pointer;border-radius:4px;color:var(--color-text-primary)}.ip-menu-item:hover,.ip-menu-item[data-highlighted]{background:var(--color-bg-hover)}.ip-menu-destructive{color:var(--color-destructive)!important}.ip-menu-destructive:hover,.ip-menu-destructive[data-highlighted]{background:#e54d4d1a!important}.ip-menu-item-icon.svelte-x7sio8{display:flex;align-items:center;flex-shrink:0}.ip-menu-check.svelte-x7sio8{margin-left:auto;display:flex;align-items:center}.ip-menu-sep{height:1px;background:var(--color-border);margin:4px 0}.editor-wrap.svelte-ok7wy5{display:flex;min-height:0}.cm-container.svelte-ok7wy5{flex:1}.cm-container.svelte-ok7wy5 .cm-editor{min-height:400px;outline:none}.cm-container.svelte-ok7wy5 .cm-scroller{overflow:visible!important}.cm-container.svelte-ok7wy5 .cm-ySelectionInfo{font-family:var(--font-sans),Inter,sans-serif;font-size:12px;font-weight:500}
@@ -0,0 +1 @@
1
+ import{c,a as p}from"./CjKjQEMp.js";import"./eEhMI0BQ.js";import{f as i}from"./D-tW7Byc.js";import{I as l,s as m}from"./pwrC_shA.js";import{l as d,s as f}from"./EhE2EcYu.js";function k(t,o){const e=d(o,["children","$$slots","$$events","$$legacy"]);const r=[["path",{d:"M20 6 9 17l-5-5"}]];l(t,f({name:"check"},()=>e,{get iconNode(){return r},children:(a,$)=>{var s=c(),n=i(s);m(n,o,"default",{}),p(a,s)},$$slots:{default:!0}}))}export{k as C};