specweave 3.1.5 → 3.1.6

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 (99) hide show
  1. package/.claude-plugin/marketplace.json +2 -2
  2. package/README.md +2 -2
  3. package/bin/specweave.js +17 -0
  4. package/dist/dashboard/assets/index-B4Xv671Q.css +1 -0
  5. package/dist/dashboard/assets/index-VnHjeVmH.js +16 -0
  6. package/dist/dashboard/index.html +2 -2
  7. package/dist/src/cli/commands/card.d.ts.map +1 -1
  8. package/dist/src/cli/commands/card.js +15 -10
  9. package/dist/src/cli/commands/card.js.map +1 -1
  10. package/dist/src/cli/commands/complete.d.ts.map +1 -1
  11. package/dist/src/cli/commands/complete.js +6 -0
  12. package/dist/src/cli/commands/complete.js.map +1 -1
  13. package/dist/src/cli/commands/create-increment.d.ts.map +1 -1
  14. package/dist/src/cli/commands/create-increment.js +4 -0
  15. package/dist/src/cli/commands/create-increment.js.map +1 -1
  16. package/dist/src/cli/commands/dashboard.d.ts.map +1 -1
  17. package/dist/src/cli/commands/dashboard.js +2 -0
  18. package/dist/src/cli/commands/dashboard.js.map +1 -1
  19. package/dist/src/cli/commands/jev-helpers.d.ts +12 -4
  20. package/dist/src/cli/commands/jev-helpers.d.ts.map +1 -1
  21. package/dist/src/cli/commands/jev-helpers.js +22 -13
  22. package/dist/src/cli/commands/jev-helpers.js.map +1 -1
  23. package/dist/src/cli/commands/pickup.d.ts.map +1 -1
  24. package/dist/src/cli/commands/pickup.js +8 -4
  25. package/dist/src/cli/commands/pickup.js.map +1 -1
  26. package/dist/src/cli/commands/require-increment.d.ts +18 -0
  27. package/dist/src/cli/commands/require-increment.d.ts.map +1 -0
  28. package/dist/src/cli/commands/require-increment.js +75 -0
  29. package/dist/src/cli/commands/require-increment.js.map +1 -0
  30. package/dist/src/cli/commands/small-fix.d.ts +14 -0
  31. package/dist/src/cli/commands/small-fix.d.ts.map +1 -0
  32. package/dist/src/cli/commands/small-fix.js +52 -0
  33. package/dist/src/cli/commands/small-fix.js.map +1 -0
  34. package/dist/src/cli/commands/verify.d.ts.map +1 -1
  35. package/dist/src/cli/commands/verify.js +3 -0
  36. package/dist/src/cli/commands/verify.js.map +1 -1
  37. package/dist/src/core/config/types.d.ts +7 -0
  38. package/dist/src/core/config/types.d.ts.map +1 -1
  39. package/dist/src/core/config/types.js.map +1 -1
  40. package/dist/src/core/hooks/handlers/pre-compact.d.ts.map +1 -1
  41. package/dist/src/core/hooks/handlers/pre-compact.js +4 -1
  42. package/dist/src/core/hooks/handlers/pre-compact.js.map +1 -1
  43. package/dist/src/core/hooks/handlers/pre-tool-use.d.ts +5 -2
  44. package/dist/src/core/hooks/handlers/pre-tool-use.d.ts.map +1 -1
  45. package/dist/src/core/hooks/handlers/pre-tool-use.js +16 -3
  46. package/dist/src/core/hooks/handlers/pre-tool-use.js.map +1 -1
  47. package/dist/src/core/hooks/handlers/require-increment.d.ts +40 -0
  48. package/dist/src/core/hooks/handlers/require-increment.d.ts.map +1 -0
  49. package/dist/src/core/hooks/handlers/require-increment.js +123 -0
  50. package/dist/src/core/hooks/handlers/require-increment.js.map +1 -0
  51. package/dist/src/core/session/pickup.d.ts +2 -0
  52. package/dist/src/core/session/pickup.d.ts.map +1 -1
  53. package/dist/src/core/session/pickup.js +4 -3
  54. package/dist/src/core/session/pickup.js.map +1 -1
  55. package/dist/src/core/session/work-handoff.d.ts.map +1 -1
  56. package/dist/src/core/session/work-handoff.js +6 -3
  57. package/dist/src/core/session/work-handoff.js.map +1 -1
  58. package/dist/src/core/tasks/ledger.d.ts +7 -0
  59. package/dist/src/core/tasks/ledger.d.ts.map +1 -1
  60. package/dist/src/core/tasks/ledger.js +20 -4
  61. package/dist/src/core/tasks/ledger.js.map +1 -1
  62. package/dist/src/core/tasks/work-session.d.ts +58 -0
  63. package/dist/src/core/tasks/work-session.d.ts.map +1 -0
  64. package/dist/src/core/tasks/work-session.js +88 -0
  65. package/dist/src/core/tasks/work-session.js.map +1 -0
  66. package/dist/src/dashboard/server/dashboard-server.d.ts.map +1 -1
  67. package/dist/src/dashboard/server/dashboard-server.js +2 -0
  68. package/dist/src/dashboard/server/dashboard-server.js.map +1 -1
  69. package/dist/src/dashboard/server/data/plan-timeline.d.ts +40 -0
  70. package/dist/src/dashboard/server/data/plan-timeline.d.ts.map +1 -0
  71. package/dist/src/dashboard/server/data/plan-timeline.js +259 -0
  72. package/dist/src/dashboard/server/data/plan-timeline.js.map +1 -0
  73. package/dist/src/dashboard/server/data/work-projection.d.ts.map +1 -1
  74. package/dist/src/dashboard/server/data/work-projection.js +7 -2
  75. package/dist/src/dashboard/server/data/work-projection.js.map +1 -1
  76. package/dist/src/dashboard/server/routes/plan-routes.d.ts +4 -0
  77. package/dist/src/dashboard/server/routes/plan-routes.d.ts.map +1 -0
  78. package/dist/src/dashboard/server/routes/plan-routes.js +19 -0
  79. package/dist/src/dashboard/server/routes/plan-routes.js.map +1 -0
  80. package/dist/src/dashboard/work-types.d.ts +81 -0
  81. package/dist/src/dashboard/work-types.d.ts.map +1 -1
  82. package/dist/src/utils/find-project-root.d.ts +2 -0
  83. package/dist/src/utils/find-project-root.d.ts.map +1 -1
  84. package/dist/src/utils/find-project-root.js +8 -1
  85. package/dist/src/utils/find-project-root.js.map +1 -1
  86. package/dist/src/utils/main-checkout.d.ts +30 -0
  87. package/dist/src/utils/main-checkout.d.ts.map +1 -0
  88. package/dist/src/utils/main-checkout.js +74 -0
  89. package/dist/src/utils/main-checkout.js.map +1 -0
  90. package/package.json +1 -1
  91. package/plugins/specweave/.claude-plugin/plugin.json +1 -1
  92. package/plugins/specweave/hooks/run-worker.mjs +42 -5
  93. package/plugins/specweave/hooks/run.mjs +101 -6
  94. package/src/templates/AGENTS.md.template +1 -1
  95. package/src/templates/environments/minimal/README.md +3 -3
  96. package/src/templates/environments/progressive/README.md +5 -6
  97. package/src/templates/environments/standard/README.md +4 -4
  98. package/dist/dashboard/assets/index-BFPKNEDz.css +0 -1
  99. package/dist/dashboard/assets/index-DVaY9gOX.js +0 -13
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Main checkout of a Git worktree.
3
+ *
4
+ * SpecWithCode runs threads in linked worktrees outside the project
5
+ * (`~/.specwithcode/<machine>/worktrees/*`), where no `.specweave/` is found by
6
+ * walking up. A linked worktree's `.git` is a file whose `gitdir:` line points
7
+ * into `<main>/.git/worktrees/<name>`, so the main checkout (and the planning
8
+ * root above it) can be found from that line alone.
9
+ *
10
+ * Sync `fs` only and no Git process: the hook launcher inlines the same logic
11
+ * (`plugins/specweave/hooks/run.mjs`, `run-worker.mjs`) and a parity test keeps
12
+ * the copies equal.
13
+ *
14
+ * @module utils/main-checkout
15
+ */
16
+ import * as fs from 'fs';
17
+ import path from 'path';
18
+ const WORKTREE_GITDIR = /^gitdir:\s*(.*?)[\\/]\.git[\\/]worktrees[\\/][^\\/]+[\\/]?\s*$/;
19
+ /**
20
+ * The main checkout of the linked worktree containing `dir`, or null when the
21
+ * nearest `.git` is a directory (an ordinary checkout), a submodule link
22
+ * (`.git/modules/`), unreadable, or absent.
23
+ */
24
+ export function mainCheckoutOf(dir) {
25
+ return worktreeLink(dir)?.main ?? null;
26
+ }
27
+ /** Top of the linked worktree containing `dir` (the folder holding its `.git` file), or null. */
28
+ export function linkedWorktreeRoot(dir) {
29
+ return worktreeLink(dir)?.root ?? null;
30
+ }
31
+ /**
32
+ * Where Git commands for work started in `startDir` run. Planning state may
33
+ * resolve to the main checkout (`findEffectiveRoot`), but a thread's branch,
34
+ * diff and pushes live in its own worktree.
35
+ */
36
+ export function gitCheckoutFor(startDir, planningRoot) {
37
+ const own = linkedWorktreeRoot(startDir);
38
+ if (!own)
39
+ return planningRoot;
40
+ const rel = path.relative(own, path.resolve(planningRoot));
41
+ const inside = rel === '' || (!rel.startsWith('..') && !path.isAbsolute(rel));
42
+ return inside ? planningRoot : own;
43
+ }
44
+ function worktreeLink(dir) {
45
+ let current;
46
+ try {
47
+ current = path.resolve(dir);
48
+ }
49
+ catch {
50
+ return null;
51
+ }
52
+ for (let depth = 0; depth < 100; depth++) {
53
+ const dotGit = path.join(current, '.git');
54
+ try {
55
+ const stat = fs.statSync(dotGit, { throwIfNoEntry: false });
56
+ if (stat) {
57
+ if (!stat.isFile())
58
+ return null;
59
+ const first = fs.readFileSync(dotGit, 'utf8').split(/\r?\n/, 1)[0] ?? '';
60
+ const match = WORKTREE_GITDIR.exec(first.trim());
61
+ return match && match[1] ? { root: current, main: path.resolve(current, match[1]) } : null;
62
+ }
63
+ }
64
+ catch {
65
+ return null;
66
+ }
67
+ const parent = path.dirname(current);
68
+ if (parent === current)
69
+ return null;
70
+ current = parent;
71
+ }
72
+ return null;
73
+ }
74
+ //# sourceMappingURL=main-checkout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main-checkout.js","sourceRoot":"","sources":["../../../src/utils/main-checkout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,eAAe,GAAG,gEAAgE,CAAC;AAEzF;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,OAAO,YAAY,CAAC,GAAG,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC;AACzC,CAAC;AAED,iGAAiG;AACjG,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,OAAO,YAAY,CAAC,GAAG,CAAC,EAAE,IAAI,IAAI,IAAI,CAAC;AACzC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB,EAAE,YAAoB;IACnE,MAAM,GAAG,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IACzC,IAAI,CAAC,GAAG;QAAE,OAAO,YAAY,CAAC;IAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9E,OAAO,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC;AACrC,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAC;YAC5D,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;oBAAE,OAAO,IAAI,CAAC;gBAChC,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBACzE,MAAM,KAAK,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;gBACjD,OAAO,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YAC7F,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,MAAM,KAAK,OAAO;YAAE,OAAO,IAAI,CAAC;QACpC,OAAO,GAAG,MAAM,CAAC;IACnB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "specweave",
3
- "version": "3.1.5",
3
+ "version": "3.1.6",
4
4
  "description": "Keep intent, specifications, and verified progress portable across AI coding tools. A local live work board, append-only task evidence, explicit handoffs, and optional GitHub/Jira/Azure DevOps integrations.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "sw",
3
3
  "description": "Portable intent and verified progress across coding tools. Six core workflow skills plus opt-in grill-me, glossary, sync, project and jev, two default lifecycle hooks, and a deterministic CLI and live local dashboard.",
4
- "version": "3.1.5",
4
+ "version": "3.1.6",
5
5
  "author": {
6
6
  "name": "SpecWeave Team",
7
7
  "url": "https://spec-weave.com"
@@ -21,11 +21,13 @@
21
21
  * Fast path: PreToolUse for a file outside `.specweave/increments/` prints `{}`
22
22
  * without loading the CLI at all (the guards only concern increment files), and
23
23
  * PreToolUse for Bash prints `{}` unless the project opted into the Jev command
24
- * guard with a `.specweave/state/jev-guard.enabled` marker.
24
+ * guard with a `.specweave/state/jev-guard.enabled` marker. Edits outside
25
+ * increments reach the required-increment guard only under a
26
+ * `.specweave/state/require-increment.enabled` marker.
25
27
  */
26
28
  import { createRequire } from 'node:module';
27
29
  import { spawnSync } from 'node:child_process';
28
- import { existsSync, lstatSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';
30
+ import { existsSync, lstatSync, mkdirSync, readFileSync, rmSync, statSync, writeFileSync } from 'node:fs';
29
31
  import { homedir } from 'node:os';
30
32
  import path from 'node:path';
31
33
  import { fileURLToPath, pathToFileURL } from 'node:url';
@@ -66,10 +68,44 @@ const event = process.argv[2] ?? '';
66
68
 
67
69
  /** Opt-in marker for the Jev Bash guard, searched upward from cwd / project dir. */
68
70
  const JEV_GUARD_MARKER = path.join('.specweave', 'state', 'jev-guard.enabled');
71
+ /** Opt-in marker for required increments (`specweave require-increment`): ordinary edits reach the guard. */
72
+ const REQUIRE_INCREMENT_MARKER = path.join('.specweave', 'state', 'require-increment.enabled');
73
+ const EDIT_TOOLS = new Set(['Edit', 'Write', 'MultiEdit', 'NotebookEdit']);
69
74
  const JEV_GUARD_MAX_DEPTH = 8;
70
75
 
71
76
  function hasJevGuardMarker(input) {
72
- const starts = [typeof input.cwd === 'string' ? input.cwd : process.cwd(), process.env.CLAUDE_PROJECT_DIR];
77
+ return hasMarker(input, JEV_GUARD_MARKER);
78
+ }
79
+
80
+ // Main checkout of the linked Git worktree containing `dir`, or null. Keep in
81
+ // step with src/utils/main-checkout.ts (a parity test compares them): the
82
+ // SpecWithCode worktrees live outside the project, so markers are searched from
83
+ // the main checkout too. Sync reads only, no Git process.
84
+ const WORKTREE_GITDIR = /^gitdir:\s*(.*?)[\\/]\.git[\\/]worktrees[\\/][^\\/]+[\\/]?\s*$/;
85
+ function mainCheckoutOf(dir) {
86
+ let current;
87
+ try { current = path.resolve(dir); } catch { return null; }
88
+ for (let depth = 0; depth < 100; depth++) {
89
+ const dotGit = path.join(current, '.git');
90
+ try {
91
+ const stat = statSync(dotGit, { throwIfNoEntry: false });
92
+ if (stat) {
93
+ if (!stat.isFile()) return null;
94
+ const first = readFileSync(dotGit, 'utf8').split(/\r?\n/, 1)[0] ?? '';
95
+ const match = WORKTREE_GITDIR.exec(first.trim());
96
+ return match && match[1] ? path.resolve(current, match[1]) : null;
97
+ }
98
+ } catch { return null; }
99
+ const parent = path.dirname(current);
100
+ if (parent === current) return null;
101
+ current = parent;
102
+ }
103
+ return null;
104
+ }
105
+
106
+ function hasMarker(input, marker) {
107
+ const first = [typeof input.cwd === 'string' ? input.cwd : process.cwd(), process.env.CLAUDE_PROJECT_DIR].filter(Boolean);
108
+ const starts = [...first, ...first.map(mainCheckoutOf)];
73
109
  for (const start of starts) {
74
110
  if (!start) continue;
75
111
  let current;
@@ -80,7 +116,7 @@ function hasJevGuardMarker(input) {
80
116
  }
81
117
  for (let depth = 0; depth < JEV_GUARD_MAX_DEPTH; depth++) {
82
118
  try {
83
- if (existsSync(path.join(current, JEV_GUARD_MARKER))) return true;
119
+ if (existsSync(path.join(current, marker))) return true;
84
120
  } catch {
85
121
  break;
86
122
  }
@@ -158,7 +194,8 @@ function normalizeInput(raw) {
158
194
  event === 'pre-tool-use' &&
159
195
  (tool === 'Bash'
160
196
  ? !hasJevGuardMarker(input)
161
- : !filePath.includes('.specweave/increments/'));
197
+ : !filePath.includes('.specweave/increments/') &&
198
+ !(EDIT_TOOLS.has(tool) && hasMarker(input, REQUIRE_INCREMENT_MARKER)));
162
199
  return { raw: JSON.stringify(input), skip };
163
200
  }
164
201
  } catch {
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  // SpecWeave hook supervisor: parent deadline remains live while the worker blocks in Git.
3
3
  import { spawn, spawnSync } from 'node:child_process';
4
- import { appendFileSync, existsSync, mkdirSync, readFileSync } from 'node:fs';
4
+ import { appendFileSync, existsSync, mkdirSync, readFileSync, statSync } from 'node:fs';
5
5
  import { homedir } from 'node:os';
6
6
  import path from 'node:path';
7
7
  import { fileURLToPath } from 'node:url';
@@ -48,28 +48,123 @@ function hasClosePendingFor(data) {
48
48
  // Jev guard with a local marker file.
49
49
  const JEV_GUARD_MARKER = path.join('.specweave', 'state', 'jev-guard.enabled');
50
50
  const JEV_GUARD_MAX_DEPTH = 8;
51
- function hasJevGuardMarker(data) {
52
- const starts = [typeof data.cwd === 'string' ? data.cwd : process.cwd(), process.env.CLAUDE_PROJECT_DIR];
53
- for (const start of starts) {
51
+ // Edits outside increments only matter when the project opted into required
52
+ // increments (`specweave require-increment`), which leaves its own marker; a
53
+ // session or SpecWithCode thread with a small fix there, or a thread bound to
54
+ // an open increment there, skips too.
55
+ const REQUIRE_INCREMENT_MARKER = path.join('.specweave', 'state', 'require-increment.enabled');
56
+ const EDIT_TOOLS = new Set(['Edit', 'Write', 'MultiEdit', 'NotebookEdit']);
57
+ // Main checkout of the linked Git worktree containing `dir`, or null. Keep in
58
+ // step with src/utils/main-checkout.ts (a parity test compares them): the
59
+ // SpecWithCode worktrees live outside the project, so markers are searched from
60
+ // the main checkout too. Sync reads only, no Git process.
61
+ const WORKTREE_GITDIR = /^gitdir:\s*(.*?)[\\/]\.git[\\/]worktrees[\\/][^\\/]+[\\/]?\s*$/;
62
+ function mainCheckoutOf(dir) {
63
+ let current;
64
+ try { current = path.resolve(dir); } catch { return null; }
65
+ for (let depth = 0; depth < 100; depth++) {
66
+ const dotGit = path.join(current, '.git');
67
+ try {
68
+ const stat = statSync(dotGit, { throwIfNoEntry: false });
69
+ if (stat) {
70
+ if (!stat.isFile()) return null;
71
+ const first = readFileSync(dotGit, 'utf8').split(/\r?\n/, 1)[0] ?? '';
72
+ const match = WORKTREE_GITDIR.exec(first.trim());
73
+ return match && match[1] ? path.resolve(current, match[1]) : null;
74
+ }
75
+ } catch { return null; }
76
+ const parent = path.dirname(current);
77
+ if (parent === current) return null;
78
+ current = parent;
79
+ }
80
+ return null;
81
+ }
82
+ function markerStarts(data) {
83
+ const starts = [typeof data.cwd === 'string' ? data.cwd : process.cwd(), process.env.CLAUDE_PROJECT_DIR].filter(Boolean);
84
+ return [...starts, ...starts.map(mainCheckoutOf)];
85
+ }
86
+ function findMarker(data, marker) {
87
+ for (const start of markerStarts(data)) {
54
88
  if (!start) continue;
55
89
  let current;
56
90
  try { current = path.resolve(start); } catch { continue; }
57
91
  for (let depth = 0; depth < JEV_GUARD_MAX_DEPTH; depth++) {
58
- try { if (existsSync(path.join(current, JEV_GUARD_MARKER))) return true; } catch { break; }
92
+ try { if (existsSync(path.join(current, marker))) return current; } catch { break; }
59
93
  const parent = path.dirname(current);
60
94
  if (parent === current) break;
61
95
  current = parent;
62
96
  }
63
97
  }
98
+ return null;
99
+ }
100
+ function hasJevGuardMarker(data) {
101
+ return findMarker(data, JEV_GUARD_MARKER) !== null;
102
+ }
103
+ // A small fix declared in this project by the session, or (Codex, Pi: no
104
+ // session id) by the SpecWithCode thread, keyed `studio-<thread>` and sanitized
105
+ // like workSessionFile. Worktrees count as their main checkout.
106
+ const SAFE_ID = /^[A-Za-z0-9._-]{1,128}$/;
107
+ function sessionWorksIn(data, root) {
108
+ const session = typeof data.session_id === 'string' ? data.session_id : '';
109
+ const thread = (process.env.SPECWEAVE_STUDIO_THREAD_ID ?? '').trim();
110
+ const ids = [session, thread ? `studio-${thread}`.replace(/[^\w.-]/g, '_') : '']
111
+ .filter((id) => SAFE_ID.test(id) && id !== '.' && id !== '..');
112
+ const project = (dir) => path.resolve(mainCheckoutOf(dir) ?? dir);
113
+ for (const id of ids) {
114
+ try {
115
+ const marker = JSON.parse(readFileSync(path.join(homedir(), '.specweave', 'sessions', `${id}.json`), 'utf8'));
116
+ if (marker?.kind !== 'small-fix' || typeof marker.root !== 'string') continue;
117
+ if (path.resolve(marker.root) === root || project(marker.root) === project(root)) return true;
118
+ } catch {}
119
+ }
64
120
  return false;
65
121
  }
122
+ // The SpecWithCode thread is bound to an increment of this project that is not
123
+ // closed: the guard would pass, so skip the worker. Same rule as the guard's
124
+ // binding check, with an exact project match (anything else asks the worker).
125
+ const CLOSED_STATUSES = new Set(['completed', 'abandoned', 'cancelled']);
126
+ function threadBoundIn(root) {
127
+ const thread = (process.env.SPECWEAVE_STUDIO_THREAD_ID ?? '').trim();
128
+ if (!thread) return false;
129
+ try {
130
+ const file = path.join(homedir(), '.specweave', 'studio', 'threads', `${thread.replace(/[^\w.-]/g, '_')}.json`);
131
+ const binding = JSON.parse(readFileSync(file, 'utf8'));
132
+ const id = binding?.incrementId;
133
+ if (typeof binding?.root !== 'string' || !binding.root || typeof id !== 'string' || !SAFE_ID.test(id) || id === '.' || id === '..') return false;
134
+ const project = (dir) => path.resolve(mainCheckoutOf(dir) ?? dir);
135
+ if (path.resolve(binding.root) !== root && project(binding.root) !== project(root)) return false;
136
+ let status = '';
137
+ try { status = String(JSON.parse(readFileSync(path.join(binding.root, '.specweave', 'increments', id, 'metadata.json'), 'utf8'))?.status ?? ''); }
138
+ catch {}
139
+ return !CLOSED_STATUSES.has(status);
140
+ } catch { return false; }
141
+ }
142
+ // `--scope user`: the entry `specweave require-increment` writes to
143
+ // ~/.claude/settings.json runs in every project. It guards nothing (not even
144
+ // increment files) unless an opted-in project's marker is found, and leaves a
145
+ // project whose own entry Claude loaded to that entry (no second worker).
146
+ const USER_SCOPE = process.argv[3] === '--scope' && process.argv[4] === 'user';
147
+ const EDIT_HOOK_MATCHER = 'Edit|Write|MultiEdit|NotebookEdit';
148
+ function projectEntryLoaded(data) {
149
+ const dir = process.env.CLAUDE_PROJECT_DIR || (typeof data.cwd === 'string' ? data.cwd : '');
150
+ if (!dir) return false;
151
+ try {
152
+ const groups = JSON.parse(readFileSync(path.join(dir, '.claude', 'settings.json'), 'utf8'))?.hooks?.PreToolUse;
153
+ return Array.isArray(groups) && groups.some((g) => g?.matcher === EDIT_HOOK_MATCHER && Array.isArray(g.hooks)
154
+ && g.hooks.some((h) => typeof h?.command === 'string' && /hooks\/run\.mjs"?\s+pre-tool-use\s*$/.test(h.command.replace(/\\/g, '/'))));
155
+ } catch { return false; }
156
+ }
66
157
  function skipPreToolUse(data) {
67
158
  const tool = typeof data.tool_name === 'string' ? data.tool_name : '';
159
+ if (USER_SCOPE && (tool === 'Bash' || findMarker(data, REQUIRE_INCREMENT_MARKER) === null || projectEntryLoaded(data))) return true;
68
160
  if (tool === 'Bash') return !hasJevGuardMarker(data);
69
161
  const ti = data.tool_input;
70
162
  const filePath = ti && typeof ti === 'object' && typeof ti.file_path === 'string'
71
163
  ? ti.file_path.replace(/\\/g, '/') : '';
72
- return !filePath.includes('.specweave/increments/');
164
+ if (filePath.includes('.specweave/increments/')) return false;
165
+ if (!EDIT_TOOLS.has(tool)) return true;
166
+ const root = findMarker(data, REQUIRE_INCREMENT_MARKER);
167
+ return root === null || sessionWorksIn(data, root) || threadBoundIn(root);
73
168
  }
74
169
  function record(reason) {
75
170
  try {
@@ -8,7 +8,7 @@ This project uses SpecWeave. Plan increments in `.specweave/increments/NNNN-slug
8
8
  ## The loop
9
9
 
10
10
  1. `specweave pickup`: applies the latest handoff, prints the open increment, next task and ACs, claims, branch, notes and memory.
11
- 2. New work needing ACs or handoff: `specweave create-increment "title"`, then fill spec.md. First ask the user only their critical decisions, one at a time with a recommended answer, and record them under `## Decisions` (sw-increment). If an open increment owns the files, add ACs and tasks there. Small fixes need no increment. Close what you open: its plan ends with "Verify and close NNNN".
11
+ 2. New work needing ACs or handoff: `specweave create-increment "title"`, then fill spec.md. First ask the user only their critical decisions, one at a time with a recommended answer, and record them under `## Decisions` (sw-increment). If an open increment owns the files, add ACs and tasks there. Features always get one; for a fix too small to plan run `specweave small-fix "<why>"`. Close what you open: its plan ends with "Verify and close NNNN".
12
12
  3. `specweave task claim T-NN`, edit only that task's Files, commit as `NNNN: what changed`, then `specweave task done T-NN --run "<its Test>"`. `--line`/`--link` feed `specweave cards --md`.
13
13
  4. When the last task is done or skipped, without asking: `specweave verify`, a fresh-context review (subagent or new session) for anything that ships, `specweave complete NNNN`. PR-shipped work needs `task done` first.
14
14
  5. Stopping with tasks left, or switching tools: `specweave handoff --reason "<why>"`.
@@ -2,13 +2,13 @@
2
2
 
3
3
  **Single environment: Production only**
4
4
 
5
- This template is for quick MVPs and prototypes that deploy directly to production.
5
+ This template is for quick MVPs and prototypes that deploy directly to production. It fits a team of 2–10 people before its first real release.
6
6
 
7
7
  ## Strategy
8
8
 
9
9
  - **1 environment**: Production
10
10
  - **Deployment flow**: Local development → Production
11
- - **Best for**: MVPs, prototypes, solo developers, quick shipping
11
+ - **Best for**: MVPs, prototypes, pre-release projects, quick shipping
12
12
 
13
13
  ## Structure
14
14
 
@@ -48,6 +48,6 @@ your-project/
48
48
 
49
49
  Move to **Standard** strategy when:
50
50
  - ✅ You have real users (need staging for testing)
51
- - ✅ Team growing (need isolation)
51
+ - ✅ More than one person deploys and you need isolation
52
52
  - ✅ Bugs in production are too costly
53
53
  - ✅ Need to test infrastructure changes safely
@@ -2,13 +2,13 @@
2
2
 
3
3
  **Four environments: Development, QA, Staging, Production**
4
4
 
5
- This template is for growing teams with dedicated QA and rigorous testing.
5
+ This template is for mature products with dedicated QA and rigorous testing. It fits a team of 2–10 people with a QA step in every release.
6
6
 
7
7
  ## Strategy
8
8
 
9
9
  - **4 environments**: Development (local), QA (cloud), Staging (cloud), Production (cloud)
10
10
  - **Deployment flow**: Development → QA → Staging → Production
11
- - **Best for**: Growing teams (5-15 developers), multiple teams, rigorous QA
11
+ - **Best for**: Mature products, a dedicated QA step, rigorous testing
12
12
 
13
13
  ## Structure
14
14
 
@@ -69,11 +69,11 @@ Production (manual deploy)
69
69
 
70
70
  ### QA
71
71
  - **Type**: Cloud (Hetzner/Railway)
72
- - **Purpose**: Dedicated QA team testing
72
+ - **Purpose**: Dedicated QA testing
73
73
  - **Size**: Small resources (CX11)
74
74
  - **Promotion**: Auto-deploy from `develop` branch
75
75
  - **Testing**: Manual QA, exploratory testing, regression
76
- - **Access**: QA team only
76
+ - **Access**: QA testers only
77
77
 
78
78
  ### Staging
79
79
  - **Type**: Cloud (Hetzner/Railway)
@@ -121,8 +121,7 @@ Secrets for 'production':
121
121
 
122
122
  ## When to Graduate
123
123
 
124
- Move to **Enterprise** strategy when:
125
- - ✅ Team exceeds 15 developers
124
+ Add more environments when:
126
125
  - ✅ Need UAT environment for customer validation
127
126
  - ✅ Regulatory/compliance requirements (HIPAA, PCI-DSS)
128
127
  - ✅ Need regional deployments
@@ -2,13 +2,13 @@
2
2
 
3
3
  **Three environments: Development, Staging, Production**
4
4
 
5
- This template is for professional projects with proper testing and validation.
5
+ This template is for professional projects with proper testing and validation. It fits a team of 2–10 people running a product in production.
6
6
 
7
7
  ## Strategy
8
8
 
9
9
  - **3 environments**: Development (local), Staging (cloud), Production (cloud)
10
10
  - **Deployment flow**: Development → Staging → Production
11
- - **Best for**: Small teams (2-5 developers), production SaaS, professional projects
11
+ - **Best for**: Production SaaS with real users, professional projects
12
12
 
13
13
  ## Structure
14
14
 
@@ -91,7 +91,7 @@ Secrets for 'production':
91
91
  ## When to Graduate
92
92
 
93
93
  Move to **Progressive** strategy when:
94
- - ✅ Team growing beyond 5 developers
94
+ - ✅ Releases need a QA sign-off before staging
95
95
  - ✅ Need dedicated QA environment
96
- - ✅ Multiple teams contributing
96
+ - ✅ Several workstreams ship to production at once
97
97
  - ✅ More rigorous testing required
@@ -1 +0,0 @@
1
- .hub-page{max-width:1500px;margin:auto;padding:40px 42px;color:var(--work-ink);overflow-wrap:anywhere}.hub-heading{display:flex;justify-content:space-between;gap:28px;align-items:flex-end;margin-bottom:34px}.hub-eyebrow{font:12px var(--sw-brand-sans);letter-spacing:.18em;color:var(--work-accent);margin-bottom:12px}.hub-heading h1{font:450 clamp(32px,4vw,52px)/1.08 var(--sw-brand-display);letter-spacing:-.035em;margin:0 0 12px}.hub-lede{font-size:14px;color:var(--work-muted);max-width:520px}.hub-actions{display:flex;gap:12px;align-items:flex-end;flex-shrink:0}.hub-page button,.hub-dialog button{min-height:44px;border:1px solid var(--work-border);padding:8px 13px;border-radius:var(--sw-brand-radius);font-size:14px;color:var(--work-ink);background:var(--sw-brand-surface);cursor:pointer}.hub-page button:hover,.hub-dialog button:hover{border-color:var(--sw-brand-control-border)}.hub-page button:disabled{opacity:.6;cursor:wait}.hub-page .hub-primary,.hub-dialog .hub-primary{background:var(--sw-brand-action);border-color:var(--sw-brand-action);color:var(--sw-brand-on-action);font-weight:500}.hub-harness{display:grid;gap:5px;color:var(--work-muted);font-size:12px}.hub-page select,.hub-page input,.hub-page textarea{border:1px solid var(--sw-brand-control-border);background:var(--sw-brand-card);color:var(--work-ink);border-radius:4px;padding:11px;min-width:0;width:100%;font-size:14px}.hub-page select{min-height:44px}.hub-grid{display:grid;grid-template-columns:minmax(0,.9fr) minmax(0,1.1fr);gap:32px}.hub-grid>section{min-width:0}.hub-purpose{background:var(--sw-brand-surface);border:1px solid var(--sw-brand-line);border-radius:8px;padding:25px;align-self:start}.hub-section-head{display:flex;align-items:center;justify-content:space-between;gap:14px;margin-bottom:16px}.hub-section-head h2{font-size:16px;font-weight:600}.hub-section-head h2 span{margin-left:7px;color:var(--work-muted);font:12px var(--sw-brand-mono)}.hub-section-head button{flex-shrink:0}.hub-goal{font:25px/1.4 var(--sw-brand-display);margin:22px 0 30px}.hub-purpose h3{color:var(--sw-brand-muted);text-transform:uppercase;letter-spacing:.1em;font:12px var(--sw-brand-sans);margin-bottom:12px}.hub-context{font-size:14px;line-height:1.75;white-space:pre-wrap;color:var(--sw-brand-ink)}.hub-meta{display:flex;justify-content:space-between;gap:12px;margin-top:30px;padding-top:17px;border-top:1px solid var(--sw-brand-line);font:12px var(--sw-brand-sans);color:var(--sw-brand-muted)}.hub-description{font-size:14px;line-height:1.6;color:var(--work-muted);margin-bottom:16px}.hub-work-list{max-height:465px;overflow:auto}.hub-work-row{display:flex;align-items:center;justify-content:space-between;gap:18px;padding:16px 0;border-bottom:1px solid var(--work-border)}.hub-work-row>div{min-width:0}.hub-work-row h3,.hub-library-row h3{font-size:14px;margin:6px 0;font-weight:600}.hub-work-row p{color:var(--work-muted);font-size:14px;line-height:1.5;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.hub-work-row button{flex-shrink:0}.hub-state{font:12px var(--sw-brand-sans);text-transform:uppercase;color:var(--sw-brand-success)}.hub-state-blocked{color:var(--sw-brand-danger)}.hub-state-review{color:var(--sw-brand-review)}.hub-text-link{display:inline-block;margin-top:20px;font-size:14px;color:var(--work-accent);min-height:44px;padding-top:10px}.hub-libraries{margin-top:34px;padding-top:30px;border-top:1px solid var(--work-border)}.hub-library-row{display:flex;gap:16px;justify-content:space-between;padding:18px 0;border-bottom:1px solid var(--work-border)}.hub-library-row>div{min-width:0}.hub-library-row small{font:12px/1.6 var(--sw-brand-mono);letter-spacing:.06em;color:var(--work-muted)}.hub-library-row a{font:12px/1.6 var(--sw-brand-mono);color:var(--work-accent);display:block}.hub-library-row p{font-size:14px;line-height:1.6;color:var(--sw-brand-muted);white-space:pre-wrap}.hub-library-row>button{align-self:start}.hub-row-actions{display:flex;flex-direction:column;gap:8px;flex-shrink:0}.hub-schedule-status{display:inline-block;font:12px var(--sw-brand-sans);color:var(--sw-brand-muted);margin-top:10px}.hub-empty{border:1px dashed var(--sw-brand-line);border-radius:6px;padding:25px;font-size:14px;line-height:1.7;color:var(--work-muted)}.hub-form-panel{margin-top:28px;border:1px solid var(--sw-brand-control-border);border-radius:8px;padding:24px;background:var(--sw-brand-soft)}.hub-form-panel form{display:grid;gap:17px}.hub-form-panel label{display:grid;gap:8px;font-size:14px;color:var(--sw-brand-ink)}.hub-form-panel textarea{resize:vertical}.hub-form-panel .hub-primary{justify-self:start;min-width:100px}.hub-error{padding:14px;border:1px solid var(--sw-brand-danger);background:var(--sw-brand-danger-soft);color:var(--sw-brand-danger);border-radius:var(--sw-brand-radius);margin-bottom:15px;font-size:14px}.hub-error button{margin-left:12px}.hub-notice{color:var(--sw-brand-success);font-size:14px;padding:10px 0}.hub-footer{display:flex;justify-content:space-between;gap:16px;margin-top:34px;padding-top:20px;color:var(--work-muted);font:12px var(--sw-brand-sans)}.hub-footer a{color:var(--work-accent)}.hub-dialog{color:var(--work-ink);background:var(--work-panel);border:1px solid var(--sw-brand-control-border);border-radius:10px;padding:24px;width:min(820px,calc(100vw - 32px));max-height:90vh}.hub-dialog::backdrop{background:var(--sw-brand-overlay)}.hub-dialog>p{font-size:14px;color:var(--work-muted);margin-bottom:18px}.hub-dialog textarea{width:100%;height:50vh;background:var(--sw-brand-card);color:var(--sw-brand-ink);border:1px solid var(--sw-brand-line);padding:15px;font:12px/1.6 var(--sw-brand-mono);margin-bottom:16px;resize:vertical}.hub-dialog :focus-visible{outline:2px solid var(--work-accent);outline-offset:3px}@media(max-width:1150px){.hub-page{padding:30px 25px}.hub-heading{align-items:flex-start;flex-direction:column}.hub-actions{flex-wrap:wrap}.hub-grid{gap:22px;grid-template-columns:minmax(0,1fr) minmax(0,1fr)}}@media(max-width:760px){.hub-page{padding:24px 16px}.hub-grid{grid-template-columns:minmax(0,1fr);gap:28px}.hub-heading h1{font-size:34px}.hub-actions{width:100%;gap:10px}.hub-harness{flex:1}.hub-actions>.hub-primary{flex:1}.hub-purpose{padding:20px}.hub-goal{font-size:23px}.hub-section-head h2{font-size:15px}.hub-footer{flex-direction:column}.hub-form-panel{padding:18px}.hub-work-row,.hub-library-row{gap:10px}.hub-page button,.hub-dialog button{min-height:44px}.hub-row-actions button{padding:8px}.hub-libraries{margin-top:25px}.hub-dialog{padding:18px}}@media(prefers-reduced-motion:reduce){.hub-page *{scroll-behavior:auto}}.hub-page .hub-primary:hover,.hub-dialog .hub-primary:hover{background:var(--sw-brand-action-hover);border-color:var(--sw-brand-action-hover)}.hub-page button,.hub-dialog button{font-family:var(--sw-brand-sans)}.hub-purpose{box-shadow:var(--sw-brand-shadow)}@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-space-y-reverse:0;--tw-divide-y-reverse:0;--tw-border-style:solid;--tw-gradient-position:initial;--tw-gradient-from:#0000;--tw-gradient-via:#0000;--tw-gradient-to:#0000;--tw-gradient-stops:initial;--tw-gradient-via-stops:initial;--tw-gradient-from-position:0%;--tw-gradient-via-position:50%;--tw-gradient-to-position:100%;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-400:var(--sw-brand-danger);--color-red-500:oklch(63.7% .237 25.331);--color-red-900:oklch(39.6% .141 25.723);--color-red-950:oklch(25.8% .092 26.042);--color-orange-400:var(--sw-brand-warning);--color-orange-500:oklch(70.5% .213 47.604);--color-amber-300:var(--sw-brand-warning);--color-amber-400:var(--sw-brand-warning);--color-amber-500:oklch(76.9% .188 70.08);--color-yellow-400:oklch(85.2% .199 91.936);--color-green-400:oklch(79.2% .209 151.711);--color-emerald-300:var(--sw-brand-success);--color-emerald-400:var(--sw-brand-success);--color-emerald-500:var(--sw-brand-success);--color-emerald-600:oklch(59.6% .145 163.225);--color-cyan-400:var(--sw-brand-review);--color-cyan-500:oklch(71.5% .143 215.221);--color-blue-400:var(--sw-brand-review);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-blue-700:oklch(48.8% .243 264.376);--color-indigo-300:var(--sw-brand-accent);--color-indigo-400:var(--sw-brand-accent);--color-indigo-500:var(--sw-brand-action-hover);--color-indigo-600:var(--sw-brand-action);--color-violet-400:var(--sw-brand-review);--color-violet-500:oklch(60.6% .25 292.717);--color-rose-200:var(--sw-brand-danger);--color-rose-300:var(--sw-brand-danger);--color-rose-400:var(--sw-brand-danger);--color-rose-500:oklch(64.5% .246 16.439);--color-rose-600:oklch(58.6% .253 17.585);--color-rose-700:oklch(51.4% .222 16.935);--color-rose-900:oklch(41% .159 10.272);--color-gray-100:var(--sw-brand-ink);--color-gray-200:var(--sw-brand-ink);--color-gray-300:var(--sw-brand-ink);--color-gray-400:var(--sw-brand-muted);--color-gray-500:var(--sw-brand-muted);--color-gray-600:var(--sw-brand-muted);--color-gray-700:var(--sw-brand-line);--color-gray-800:var(--sw-brand-soft);--color-gray-900:var(--sw-brand-surface);--color-gray-950:var(--sw-brand-paper);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-xs:20rem;--container-sm:24rem;--container-md:28rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wider:.05em;--leading-tight:1.25;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--animate-spin:spin 1s linear infinite;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring:where(:not(iframe)){outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.collapse{visibility:collapse}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:0}.top-0\.5{top:calc(var(--spacing) * .5)}.top-1\/2{top:50%}.top-full{top:100%}.right-2{right:calc(var(--spacing) * 2)}.bottom-full{bottom:100%}.left-0\.5{left:calc(var(--spacing) * .5)}.left-1\/2{left:50%}.left-2\.5{left:calc(var(--spacing) * 2.5)}.left-\[18px\]{left:18px}.z-10{z-index:10}.z-50{z-index:50}.col-span-full{grid-column:1/-1}.mx-3{margin-inline:calc(var(--spacing) * 3)}.mx-auto{margin-inline:auto}.my-2{margin-block:calc(var(--spacing) * 2)}.-mt-px{margin-top:-1px}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-1\.5{margin-top:calc(var(--spacing) * 1.5)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mr-1{margin-right:var(--spacing)}.mb-1{margin-bottom:var(--spacing)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.ml-1{margin-left:var(--spacing)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-6{margin-left:calc(var(--spacing) * 6)}.ml-10{margin-left:calc(var(--spacing) * 10)}.ml-auto{margin-left:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-0\.5{height:calc(var(--spacing) * .5)}.h-1\.5{height:calc(var(--spacing) * 1.5)}.h-2{height:calc(var(--spacing) * 2)}.h-2\.5{height:calc(var(--spacing) * 2.5)}.h-3{height:calc(var(--spacing) * 3)}.h-3\.5{height:calc(var(--spacing) * 3.5)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-8{height:calc(var(--spacing) * 8)}.h-12{height:calc(var(--spacing) * 12)}.h-24{height:calc(var(--spacing) * 24)}.h-40{height:calc(var(--spacing) * 40)}.h-64{height:calc(var(--spacing) * 64)}.h-full{height:100%}.max-h-32{max-height:calc(var(--spacing) * 32)}.max-h-40{max-height:calc(var(--spacing) * 40)}.max-h-48{max-height:calc(var(--spacing) * 48)}.max-h-64{max-height:calc(var(--spacing) * 64)}.max-h-\[400px\]{max-height:400px}.min-h-\[2px\]{min-height:2px}.min-h-\[400px\]{min-height:400px}.min-h-screen{min-height:100vh}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.w-2\.5{width:calc(var(--spacing) * 2.5)}.w-3{width:calc(var(--spacing) * 3)}.w-3\.5{width:calc(var(--spacing) * 3.5)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-8{width:calc(var(--spacing) * 8)}.w-9{width:calc(var(--spacing) * 9)}.w-10{width:calc(var(--spacing) * 10)}.w-12{width:calc(var(--spacing) * 12)}.w-14{width:calc(var(--spacing) * 14)}.w-16{width:calc(var(--spacing) * 16)}.w-24{width:calc(var(--spacing) * 24)}.w-28{width:calc(var(--spacing) * 28)}.w-48{width:calc(var(--spacing) * 48)}.w-full{width:100%}.max-w-48{max-width:calc(var(--spacing) * 48)}.max-w-\[120px\]{max-width:120px}.max-w-\[180px\]{max-width:180px}.max-w-\[200px\]{max-width:200px}.max-w-md{max-width:var(--container-md)}.max-w-sm{max-width:var(--container-sm)}.max-w-xs{max-width:var(--container-xs)}.min-w-0{min-width:0}.min-w-\[60px\]{min-width:60px}.flex-1{flex:1}.flex-shrink-0,.shrink-0{flex-shrink:0}.table-fixed{table-layout:fixed}.-translate-x-1\/2{--tw-translate-x: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.-rotate-90{rotate:-90deg}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.animate-pulse{animation:var(--animate-pulse)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-\[1fr\,80px\,80px\,120px\]{grid-template-columns:1fr,80px,80px,120px}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-px{gap:1px}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-1\.5>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1.5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1.5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-2>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 2) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 2) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}:where(.divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.divide-gray-800\/50>:not(:last-child)){border-color:var(--color-gray-800)}@supports (color:color-mix(in lab,red,red)){:where(.divide-gray-800\/50>:not(:last-child)){border-color:color-mix(in oklab,var(--color-gray-800) 50%,transparent)}}.self-center{align-self:center}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-xl{border-radius:var(--radius-xl)}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.border{border-style:var(--tw-border-style);border-width:1px}.border-4{border-style:var(--tw-border-style);border-width:4px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-amber-500\/20{border-color:#f99c0033}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/20{border-color:color-mix(in oklab,var(--color-amber-500) 20%,transparent)}}.border-amber-500\/30{border-color:#f99c004d}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/30{border-color:color-mix(in oklab,var(--color-amber-500) 30%,transparent)}}.border-amber-500\/50{border-color:#f99c0080}@supports (color:color-mix(in lab,red,red)){.border-amber-500\/50{border-color:color-mix(in oklab,var(--color-amber-500) 50%,transparent)}}.border-cyan-500\/20{border-color:#00b7d733}@supports (color:color-mix(in lab,red,red)){.border-cyan-500\/20{border-color:color-mix(in oklab,var(--color-cyan-500) 20%,transparent)}}.border-emerald-500,.border-emerald-500\/20{border-color:var(--color-emerald-500)}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/20{border-color:color-mix(in oklab,var(--color-emerald-500) 20%,transparent)}}.border-emerald-500\/30{border-color:var(--color-emerald-500)}@supports (color:color-mix(in lab,red,red)){.border-emerald-500\/30{border-color:color-mix(in oklab,var(--color-emerald-500) 30%,transparent)}}.border-gray-600{border-color:var(--color-gray-600)}.border-gray-700,.border-gray-700\/50{border-color:var(--color-gray-700)}@supports (color:color-mix(in lab,red,red)){.border-gray-700\/50{border-color:color-mix(in oklab,var(--color-gray-700) 50%,transparent)}}.border-gray-800,.border-gray-800\/50{border-color:var(--color-gray-800)}@supports (color:color-mix(in lab,red,red)){.border-gray-800\/50{border-color:color-mix(in oklab,var(--color-gray-800) 50%,transparent)}}.border-indigo-500,.border-indigo-500\/20{border-color:var(--color-indigo-500)}@supports (color:color-mix(in lab,red,red)){.border-indigo-500\/20{border-color:color-mix(in oklab,var(--color-indigo-500) 20%,transparent)}}.border-indigo-500\/30{border-color:var(--color-indigo-500)}@supports (color:color-mix(in lab,red,red)){.border-indigo-500\/30{border-color:color-mix(in oklab,var(--color-indigo-500) 30%,transparent)}}.border-indigo-500\/50{border-color:var(--color-indigo-500)}@supports (color:color-mix(in lab,red,red)){.border-indigo-500\/50{border-color:color-mix(in oklab,var(--color-indigo-500) 50%,transparent)}}.border-red-900\/40{border-color:#82181a66}@supports (color:color-mix(in lab,red,red)){.border-red-900\/40{border-color:color-mix(in oklab,var(--color-red-900) 40%,transparent)}}.border-rose-500{border-color:var(--color-rose-500)}.border-rose-500\/20{border-color:#ff235733}@supports (color:color-mix(in lab,red,red)){.border-rose-500\/20{border-color:color-mix(in oklab,var(--color-rose-500) 20%,transparent)}}.border-rose-500\/30{border-color:#ff23574d}@supports (color:color-mix(in lab,red,red)){.border-rose-500\/30{border-color:color-mix(in oklab,var(--color-rose-500) 30%,transparent)}}.border-rose-500\/50{border-color:#ff235780}@supports (color:color-mix(in lab,red,red)){.border-rose-500\/50{border-color:color-mix(in oklab,var(--color-rose-500) 50%,transparent)}}.border-rose-700{border-color:var(--color-rose-700)}.border-transparent{border-color:#0000}.border-t-gray-800{border-top-color:var(--color-gray-800)}.border-l-amber-500{border-left-color:var(--color-amber-500)}.border-l-blue-500{border-left-color:var(--color-blue-500)}.border-l-rose-500{border-left-color:var(--color-rose-500)}.bg-amber-400{background-color:var(--color-amber-400)}.bg-amber-500{background-color:var(--color-amber-500)}.bg-amber-500\/10{background-color:#f99c001a}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/10{background-color:color-mix(in oklab,var(--color-amber-500) 10%,transparent)}}.bg-amber-500\/15{background-color:#f99c0026}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/15{background-color:color-mix(in oklab,var(--color-amber-500) 15%,transparent)}}.bg-amber-500\/20{background-color:#f99c0033}@supports (color:color-mix(in lab,red,red)){.bg-amber-500\/20{background-color:color-mix(in oklab,var(--color-amber-500) 20%,transparent)}}.bg-black\/60{background-color:#0009}@supports (color:color-mix(in lab,red,red)){.bg-black\/60{background-color:color-mix(in oklab,var(--color-black) 60%,transparent)}}.bg-blue-500{background-color:var(--color-blue-500)}.bg-blue-500\/10{background-color:#3080ff1a}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/10{background-color:color-mix(in oklab,var(--color-blue-500) 10%,transparent)}}.bg-blue-500\/20{background-color:#3080ff33}@supports (color:color-mix(in lab,red,red)){.bg-blue-500\/20{background-color:color-mix(in oklab,var(--color-blue-500) 20%,transparent)}}.bg-blue-600{background-color:var(--color-blue-600)}.bg-blue-700{background-color:var(--color-blue-700)}.bg-cyan-500{background-color:var(--color-cyan-500)}.bg-cyan-500\/10{background-color:#00b7d71a}@supports (color:color-mix(in lab,red,red)){.bg-cyan-500\/10{background-color:color-mix(in oklab,var(--color-cyan-500) 10%,transparent)}}.bg-cyan-500\/15{background-color:#00b7d726}@supports (color:color-mix(in lab,red,red)){.bg-cyan-500\/15{background-color:color-mix(in oklab,var(--color-cyan-500) 15%,transparent)}}.bg-cyan-500\/20{background-color:#00b7d733}@supports (color:color-mix(in lab,red,red)){.bg-cyan-500\/20{background-color:color-mix(in oklab,var(--color-cyan-500) 20%,transparent)}}.bg-cyan-500\/60{background-color:#00b7d799}@supports (color:color-mix(in lab,red,red)){.bg-cyan-500\/60{background-color:color-mix(in oklab,var(--color-cyan-500) 60%,transparent)}}.bg-emerald-400{background-color:var(--color-emerald-400)}.bg-emerald-500,.bg-emerald-500\/10{background-color:var(--color-emerald-500)}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/10{background-color:color-mix(in oklab,var(--color-emerald-500) 10%,transparent)}}.bg-emerald-500\/15{background-color:var(--color-emerald-500)}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/15{background-color:color-mix(in oklab,var(--color-emerald-500) 15%,transparent)}}.bg-emerald-500\/20{background-color:var(--color-emerald-500)}@supports (color:color-mix(in lab,red,red)){.bg-emerald-500\/20{background-color:color-mix(in oklab,var(--color-emerald-500) 20%,transparent)}}.bg-emerald-600\/20{background-color:#00976733}@supports (color:color-mix(in lab,red,red)){.bg-emerald-600\/20{background-color:color-mix(in oklab,var(--color-emerald-600) 20%,transparent)}}.bg-gray-500,.bg-gray-500\/10{background-color:var(--color-gray-500)}@supports (color:color-mix(in lab,red,red)){.bg-gray-500\/10{background-color:color-mix(in oklab,var(--color-gray-500) 10%,transparent)}}.bg-gray-500\/20{background-color:var(--color-gray-500)}@supports (color:color-mix(in lab,red,red)){.bg-gray-500\/20{background-color:color-mix(in oklab,var(--color-gray-500) 20%,transparent)}}.bg-gray-600{background-color:var(--color-gray-600)}.bg-gray-700,.bg-gray-700\/50{background-color:var(--color-gray-700)}@supports (color:color-mix(in lab,red,red)){.bg-gray-700\/50{background-color:color-mix(in oklab,var(--color-gray-700) 50%,transparent)}}.bg-gray-800,.bg-gray-800\/20{background-color:var(--color-gray-800)}@supports (color:color-mix(in lab,red,red)){.bg-gray-800\/20{background-color:color-mix(in oklab,var(--color-gray-800) 20%,transparent)}}.bg-gray-800\/30{background-color:var(--color-gray-800)}@supports (color:color-mix(in lab,red,red)){.bg-gray-800\/30{background-color:color-mix(in oklab,var(--color-gray-800) 30%,transparent)}}.bg-gray-800\/40{background-color:var(--color-gray-800)}@supports (color:color-mix(in lab,red,red)){.bg-gray-800\/40{background-color:color-mix(in oklab,var(--color-gray-800) 40%,transparent)}}.bg-gray-800\/50{background-color:var(--color-gray-800)}@supports (color:color-mix(in lab,red,red)){.bg-gray-800\/50{background-color:color-mix(in oklab,var(--color-gray-800) 50%,transparent)}}.bg-gray-900,.bg-gray-900\/50{background-color:var(--color-gray-900)}@supports (color:color-mix(in lab,red,red)){.bg-gray-900\/50{background-color:color-mix(in oklab,var(--color-gray-900) 50%,transparent)}}.bg-gray-900\/60{background-color:var(--color-gray-900)}@supports (color:color-mix(in lab,red,red)){.bg-gray-900\/60{background-color:color-mix(in oklab,var(--color-gray-900) 60%,transparent)}}.bg-gray-950{background-color:var(--color-gray-950)}.bg-green-400{background-color:var(--color-green-400)}.bg-indigo-400{background-color:var(--color-indigo-400)}.bg-indigo-500,.bg-indigo-500\/10{background-color:var(--color-indigo-500)}@supports (color:color-mix(in lab,red,red)){.bg-indigo-500\/10{background-color:color-mix(in oklab,var(--color-indigo-500) 10%,transparent)}}.bg-indigo-500\/20{background-color:var(--color-indigo-500)}@supports (color:color-mix(in lab,red,red)){.bg-indigo-500\/20{background-color:color-mix(in oklab,var(--color-indigo-500) 20%,transparent)}}.bg-indigo-500\/40{background-color:var(--color-indigo-500)}@supports (color:color-mix(in lab,red,red)){.bg-indigo-500\/40{background-color:color-mix(in oklab,var(--color-indigo-500) 40%,transparent)}}.bg-indigo-500\/60{background-color:var(--color-indigo-500)}@supports (color:color-mix(in lab,red,red)){.bg-indigo-500\/60{background-color:color-mix(in oklab,var(--color-indigo-500) 60%,transparent)}}.bg-indigo-600{background-color:var(--color-indigo-600)}.bg-orange-500\/15{background-color:#fe6e0026}@supports (color:color-mix(in lab,red,red)){.bg-orange-500\/15{background-color:color-mix(in oklab,var(--color-orange-500) 15%,transparent)}}.bg-orange-500\/20{background-color:#fe6e0033}@supports (color:color-mix(in lab,red,red)){.bg-orange-500\/20{background-color:color-mix(in oklab,var(--color-orange-500) 20%,transparent)}}.bg-red-400{background-color:var(--color-red-400)}.bg-red-500{background-color:var(--color-red-500)}.bg-red-500\/20{background-color:#fb2c3633}@supports (color:color-mix(in lab,red,red)){.bg-red-500\/20{background-color:color-mix(in oklab,var(--color-red-500) 20%,transparent)}}.bg-red-950\/30{background-color:#4608094d}@supports (color:color-mix(in lab,red,red)){.bg-red-950\/30{background-color:color-mix(in oklab,var(--color-red-950) 30%,transparent)}}.bg-rose-400{background-color:var(--color-rose-400)}.bg-rose-500{background-color:var(--color-rose-500)}.bg-rose-500\/10{background-color:#ff23571a}@supports (color:color-mix(in lab,red,red)){.bg-rose-500\/10{background-color:color-mix(in oklab,var(--color-rose-500) 10%,transparent)}}.bg-rose-500\/15{background-color:#ff235726}@supports (color:color-mix(in lab,red,red)){.bg-rose-500\/15{background-color:color-mix(in oklab,var(--color-rose-500) 15%,transparent)}}.bg-rose-500\/70{background-color:#ff2357b3}@supports (color:color-mix(in lab,red,red)){.bg-rose-500\/70{background-color:color-mix(in oklab,var(--color-rose-500) 70%,transparent)}}.bg-rose-600{background-color:var(--color-rose-600)}.bg-rose-600\/20{background-color:#e7004433}@supports (color:color-mix(in lab,red,red)){.bg-rose-600\/20{background-color:color-mix(in oklab,var(--color-rose-600) 20%,transparent)}}.bg-rose-900\/30{background-color:#8b08364d}@supports (color:color-mix(in lab,red,red)){.bg-rose-900\/30{background-color:color-mix(in oklab,var(--color-rose-900) 30%,transparent)}}.bg-violet-500\/20{background-color:#8d54ff33}@supports (color:color-mix(in lab,red,red)){.bg-violet-500\/20{background-color:color-mix(in oklab,var(--color-violet-500) 20%,transparent)}}.bg-white{background-color:var(--color-white)}.bg-yellow-400{background-color:var(--color-yellow-400)}.bg-gradient-to-br{--tw-gradient-position:to bottom right in oklab;background-image:linear-gradient(var(--tw-gradient-stops))}.from-amber-500\/10{--tw-gradient-from:#f99c001a}@supports (color:color-mix(in lab,red,red)){.from-amber-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-amber-500) 10%, transparent)}}.from-amber-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-cyan-500\/10{--tw-gradient-from:#00b7d71a}@supports (color:color-mix(in lab,red,red)){.from-cyan-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-cyan-500) 10%, transparent)}}.from-cyan-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-emerald-500\/10{--tw-gradient-from:var(--color-emerald-500)}@supports (color:color-mix(in lab,red,red)){.from-emerald-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-emerald-500) 10%, transparent)}}.from-emerald-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-indigo-500\/10{--tw-gradient-from:var(--color-indigo-500)}@supports (color:color-mix(in lab,red,red)){.from-indigo-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-indigo-500) 10%, transparent)}}.from-indigo-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.from-rose-500\/10{--tw-gradient-from:#ff23571a}@supports (color:color-mix(in lab,red,red)){.from-rose-500\/10{--tw-gradient-from:color-mix(in oklab, var(--color-rose-500) 10%, transparent)}}.from-rose-500\/10{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-amber-500\/5{--tw-gradient-to:#f99c000d}@supports (color:color-mix(in lab,red,red)){.to-amber-500\/5{--tw-gradient-to:color-mix(in oklab, var(--color-amber-500) 5%, transparent)}}.to-amber-500\/5{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-cyan-500\/5{--tw-gradient-to:#00b7d70d}@supports (color:color-mix(in lab,red,red)){.to-cyan-500\/5{--tw-gradient-to:color-mix(in oklab, var(--color-cyan-500) 5%, transparent)}}.to-cyan-500\/5{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-emerald-500\/5{--tw-gradient-to:var(--color-emerald-500)}@supports (color:color-mix(in lab,red,red)){.to-emerald-500\/5{--tw-gradient-to:color-mix(in oklab, var(--color-emerald-500) 5%, transparent)}}.to-emerald-500\/5{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-indigo-500\/5{--tw-gradient-to:var(--color-indigo-500)}@supports (color:color-mix(in lab,red,red)){.to-indigo-500\/5{--tw-gradient-to:color-mix(in oklab, var(--color-indigo-500) 5%, transparent)}}.to-indigo-500\/5{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.to-rose-500\/5{--tw-gradient-to:#ff23570d}@supports (color:color-mix(in lab,red,red)){.to-rose-500\/5{--tw-gradient-to:color-mix(in oklab, var(--color-rose-500) 5%, transparent)}}.to-rose-500\/5{--tw-gradient-stops:var(--tw-gradient-via-stops,var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position))}.p-1{padding:var(--spacing)}.p-1\.5{padding:calc(var(--spacing) * 1.5)}.p-2{padding:calc(var(--spacing) * 2)}.p-2\.5{padding:calc(var(--spacing) * 2.5)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-5{padding:calc(var(--spacing) * 5)}.p-6{padding:calc(var(--spacing) * 6)}.p-8{padding:calc(var(--spacing) * 8)}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-5{padding-inline:calc(var(--spacing) * 5)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-16{padding-block:calc(var(--spacing) * 16)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-8{padding-left:calc(var(--spacing) * 8)}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.font-mono{font-family:var(--font-mono)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[8px\]{font-size:8px}.text-\[9px\]{font-size:9px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-300{color:var(--color-amber-300)}.text-amber-400,.text-amber-400\/80{color:var(--color-amber-400)}@supports (color:color-mix(in lab,red,red)){.text-amber-400\/80{color:color-mix(in oklab,var(--color-amber-400) 80%,transparent)}}.text-blue-400{color:var(--color-blue-400)}.text-cyan-400{color:var(--color-cyan-400)}.text-emerald-400{color:var(--color-emerald-400)}.text-emerald-500{color:var(--color-emerald-500)}.text-gray-100{color:var(--color-gray-100)}.text-gray-200{color:var(--color-gray-200)}.text-gray-300{color:var(--color-gray-300)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-gray-600{color:var(--color-gray-600)}.text-gray-700{color:var(--color-gray-700)}.text-indigo-400{color:var(--color-indigo-400)}.text-orange-400{color:var(--color-orange-400)}.text-red-400{color:var(--color-red-400)}.text-rose-300{color:var(--color-rose-300)}.text-rose-400,.text-rose-400\/60{color:var(--color-rose-400)}@supports (color:color-mix(in lab,red,red)){.text-rose-400\/60{color:color-mix(in oklab,var(--color-rose-400) 60%,transparent)}}.text-rose-400\/80{color:var(--color-rose-400)}@supports (color:color-mix(in lab,red,red)){.text-rose-400\/80{color:color-mix(in oklab,var(--color-rose-400) 80%,transparent)}}.text-violet-400{color:var(--color-violet-400)}.text-white{color:var(--color-white)}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.italic{font-style:italic}.line-through{text-decoration-line:line-through}.underline{text-decoration-line:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.placeholder-gray-500::placeholder{color:var(--color-gray-500)}.placeholder-gray-600::placeholder{color:var(--color-gray-600)}.opacity-0{opacity:0}.opacity-25{opacity:.25}.opacity-60{opacity:.6}.opacity-75{opacity:.75}.shadow-2xl{--tw-shadow:0 25px 50px -12px var(--tw-shadow-color,#00000040);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-1{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-amber-500\/50{--tw-ring-color:#f99c0080}@supports (color:color-mix(in lab,red,red)){.ring-amber-500\/50{--tw-ring-color:color-mix(in oklab, var(--color-amber-500) 50%, transparent)}}.ring-red-500\/50{--tw-ring-color:#fb2c3680}@supports (color:color-mix(in lab,red,red)){.ring-red-500\/50{--tw-ring-color:color-mix(in oklab, var(--color-red-500) 50%, transparent)}}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-200{--tw-duration:.2s;transition-duration:.2s}.duration-500{--tw-duration:.5s;transition-duration:.5s}@media(hover:hover){.group-hover\:bg-rose-400:is(:where(.group):hover *){background-color:var(--color-rose-400)}.group-hover\:text-gray-400:is(:where(.group):hover *){color:var(--color-gray-400)}.group-hover\:opacity-100:is(:where(.group):hover *),.group-hover\/item\:opacity-100:is(:where(.group\/item):hover *){opacity:1}.hover\:border-amber-500\/30:hover{border-color:#f99c004d}@supports (color:color-mix(in lab,red,red)){.hover\:border-amber-500\/30:hover{border-color:color-mix(in oklab,var(--color-amber-500) 30%,transparent)}}.hover\:border-amber-500\/40:hover{border-color:#f99c0066}@supports (color:color-mix(in lab,red,red)){.hover\:border-amber-500\/40:hover{border-color:color-mix(in oklab,var(--color-amber-500) 40%,transparent)}}.hover\:border-emerald-500\/50:hover{border-color:var(--color-emerald-500)}@supports (color:color-mix(in lab,red,red)){.hover\:border-emerald-500\/50:hover{border-color:color-mix(in oklab,var(--color-emerald-500) 50%,transparent)}}.hover\:border-gray-600:hover{border-color:var(--color-gray-600)}.hover\:border-gray-700:hover{border-color:var(--color-gray-700)}.hover\:border-indigo-500\/30:hover{border-color:var(--color-indigo-500)}@supports (color:color-mix(in lab,red,red)){.hover\:border-indigo-500\/30:hover{border-color:color-mix(in oklab,var(--color-indigo-500) 30%,transparent)}}.hover\:bg-emerald-600\/40:hover{background-color:#00976766}@supports (color:color-mix(in lab,red,red)){.hover\:bg-emerald-600\/40:hover{background-color:color-mix(in oklab,var(--color-emerald-600) 40%,transparent)}}.hover\:bg-gray-600:hover{background-color:var(--color-gray-600)}.hover\:bg-gray-700:hover{background-color:var(--color-gray-700)}.hover\:bg-gray-800:hover,.hover\:bg-gray-800\/20:hover{background-color:var(--color-gray-800)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-gray-800\/20:hover{background-color:color-mix(in oklab,var(--color-gray-800) 20%,transparent)}}.hover\:bg-gray-800\/30:hover{background-color:var(--color-gray-800)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-gray-800\/30:hover{background-color:color-mix(in oklab,var(--color-gray-800) 30%,transparent)}}.hover\:bg-gray-800\/50:hover{background-color:var(--color-gray-800)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-gray-800\/50:hover{background-color:color-mix(in oklab,var(--color-gray-800) 50%,transparent)}}.hover\:bg-gray-800\/80:hover{background-color:var(--color-gray-800)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-gray-800\/80:hover{background-color:color-mix(in oklab,var(--color-gray-800) 80%,transparent)}}.hover\:bg-indigo-500:hover,.hover\:bg-indigo-500\/60:hover{background-color:var(--color-indigo-500)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-indigo-500\/60:hover{background-color:color-mix(in oklab,var(--color-indigo-500) 60%,transparent)}}.hover\:bg-rose-500:hover{background-color:var(--color-rose-500)}.hover\:bg-rose-600\/40:hover{background-color:#e7004466}@supports (color:color-mix(in lab,red,red)){.hover\:bg-rose-600\/40:hover{background-color:color-mix(in oklab,var(--color-rose-600) 40%,transparent)}}.hover\:text-amber-300:hover{color:var(--color-amber-300)}.hover\:text-emerald-300:hover{color:var(--color-emerald-300)}.hover\:text-gray-200:hover{color:var(--color-gray-200)}.hover\:text-gray-300:hover{color:var(--color-gray-300)}.hover\:text-indigo-300:hover{color:var(--color-indigo-300)}.hover\:text-rose-200:hover{color:var(--color-rose-200)}.hover\:text-rose-300:hover{color:var(--color-rose-300)}.hover\:text-rose-400:hover{color:var(--color-rose-400)}.hover\:text-white:hover{color:var(--color-white)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-80:hover{opacity:.8}}.focus\:border-gray-600:focus{border-color:var(--color-gray-600)}.focus\:border-indigo-500:focus{border-color:var(--color-indigo-500)}.focus\:ring-1:focus{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-indigo-500:focus,.focus\:ring-indigo-500\/30:focus{--tw-ring-color:var(--color-indigo-500)}@supports (color:color-mix(in lab,red,red)){.focus\:ring-indigo-500\/30:focus{--tw-ring-color:color-mix(in oklab, var(--color-indigo-500) 30%, transparent)}}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:text-gray-700:disabled{color:var(--color-gray-700)}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}@media(min-width:48rem){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media(min-width:64rem){.lg\:col-span-2{grid-column:span 2/span 2}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}}:root{--sw-brand-paper:#f6f4ee;--sw-brand-ink:#252820;--sw-brand-muted:#65695e;--sw-brand-line:#d9dcd0;--sw-brand-accent:#bd481f;--sw-brand-surface:#fbfcf8;--sw-brand-card:#fff;--sw-brand-soft:#eff2e8;--sw-brand-hover:#e6e9de;--sw-brand-selected:#e7ebdf;--sw-brand-control-border:#8f9d81;--sw-brand-action:#252820;--sw-brand-action-hover:#3f4835;--sw-brand-on-action:#fff;--sw-brand-success:#547451;--sw-brand-warning:#90541e;--sw-brand-danger:#a2392b;--sw-brand-danger-soft:#faeee8;--sw-brand-review:#626f9a;--sw-brand-sans:"IBM Plex Sans", sans-serif;--sw-brand-display:"Newsreader", Georgia, serif;--sw-brand-mono:ui-monospace, "SFMono-Regular", Consolas, monospace;--sw-brand-radius:4px;--sw-brand-shadow:0 18px 50px #25282008;--sw-brand-overlay:#25282066;--sw-brand-line-soft:#e5e7df;--sw-brand-line-strong:#b9c0ae;--sw-brand-term-bg:#20231c;--sw-brand-term-ink:#e8ecdf;--sw-brand-on-accent:#fff;--sw-brand-accent-ink:#a6431f;--sw-brand-success-ink:#4a6847}:root[data-theme=dark]{--sw-brand-paper:#181914;--sw-brand-ink:#ece8dc;--sw-brand-muted:#a8ab9d;--sw-brand-line:#34372e;--sw-brand-accent:#e5794c;--sw-brand-surface:#1e201a;--sw-brand-card:#22241d;--sw-brand-soft:#23261e;--sw-brand-hover:#2c2f26;--sw-brand-selected:#2a2e24;--sw-brand-control-border:#6b755f;--sw-brand-action:#ece8dc;--sw-brand-action-hover:#d4d0c3;--sw-brand-on-action:#181914;--sw-brand-success:#8fb58a;--sw-brand-warning:#d9a066;--sw-brand-danger:#e8836f;--sw-brand-danger-soft:#3a2520;--sw-brand-review:#a3aedb;--sw-brand-shadow:0 18px 50px #00000040;--sw-brand-overlay:#000a;--sw-brand-line-soft:#2a2d24;--sw-brand-line-strong:#4a4f41;--sw-brand-term-bg:#0f100c;--sw-brand-term-ink:#e8ecdf;--sw-brand-on-accent:#181914;--sw-brand-accent-ink:#e5794c;--sw-brand-success-ink:#8fb58a}@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(/assets/web-0-CXU3YvQl.woff2)format("woff2");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(/assets/web-1-CnEgTPdE.woff2)format("woff2");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(/assets/web-2-Cuw1d432.woff2)format("woff2");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(/assets/web-3-tuJ4lY6O.woff2)format("woff2");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(/assets/web-4-KUPCjGsn.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:400;font-stretch:100%;font-display:swap;src:url(/assets/web-5-BD64o3ke.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(/assets/web-0-CXU3YvQl.woff2)format("woff2");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(/assets/web-1-CnEgTPdE.woff2)format("woff2");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(/assets/web-2-Cuw1d432.woff2)format("woff2");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(/assets/web-3-tuJ4lY6O.woff2)format("woff2");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(/assets/web-4-KUPCjGsn.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:500;font-stretch:100%;font-display:swap;src:url(/assets/web-5-BD64o3ke.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:600;font-stretch:100%;font-display:swap;src:url(/assets/web-0-CXU3YvQl.woff2)format("woff2");unicode-range:U+460-52F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F}@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:600;font-stretch:100%;font-display:swap;src:url(/assets/web-1-CnEgTPdE.woff2)format("woff2");unicode-range:U+301,U+400-45F,U+490-491,U+4B0-4B1,U+2116}@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:600;font-stretch:100%;font-display:swap;src:url(/assets/web-2-Cuw1d432.woff2)format("woff2");unicode-range:U+370-377,U+37A-37F,U+384-38A,U+38C,U+38E-3A1,U+3A3-3FF}@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:600;font-stretch:100%;font-display:swap;src:url(/assets/web-3-tuJ4lY6O.woff2)format("woff2");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:600;font-stretch:100%;font-display:swap;src:url(/assets/web-4-KUPCjGsn.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:IBM Plex Sans;font-style:normal;font-weight:600;font-stretch:100%;font-display:swap;src:url(/assets/web-5-BD64o3ke.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Newsreader;font-style:italic;font-weight:400;font-display:swap;src:url(/assets/web-6-CuVUMDWO.woff2)format("woff2");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Newsreader;font-style:italic;font-weight:400;font-display:swap;src:url(/assets/web-7-B2O-dwcv.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Newsreader;font-style:italic;font-weight:400;font-display:swap;src:url(/assets/web-8-b0I-AwbV.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Newsreader;font-style:normal;font-weight:400;font-display:swap;src:url(/assets/web-9-CjmLAiqB.woff2)format("woff2");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Newsreader;font-style:normal;font-weight:400;font-display:swap;src:url(/assets/web-10-ppjp2k5c.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Newsreader;font-style:normal;font-weight:400;font-display:swap;src:url(/assets/web-11-T5L87s1n.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Newsreader;font-style:normal;font-weight:450;font-display:swap;src:url(/assets/web-9-CjmLAiqB.woff2)format("woff2");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Newsreader;font-style:normal;font-weight:450;font-display:swap;src:url(/assets/web-10-ppjp2k5c.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Newsreader;font-style:normal;font-weight:450;font-display:swap;src:url(/assets/web-11-T5L87s1n.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}@font-face{font-family:Newsreader;font-style:normal;font-weight:500;font-display:swap;src:url(/assets/web-9-CjmLAiqB.woff2)format("woff2");unicode-range:U+102-103,U+110-111,U+128-129,U+168-169,U+1A0-1A1,U+1AF-1B0,U+300-301,U+303-304,U+308-309,U+323,U+329,U+1EA0-1EF9,U+20AB}@font-face{font-family:Newsreader;font-style:normal;font-weight:500;font-display:swap;src:url(/assets/web-10-ppjp2k5c.woff2)format("woff2");unicode-range:U+100-2BA,U+2BD-2C5,U+2C7-2CC,U+2CE-2D7,U+2DD-2FF,U+304,U+308,U+329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF}@font-face{font-family:Newsreader;font-style:normal;font-weight:500;font-display:swap;src:url(/assets/web-11-T5L87s1n.woff2)format("woff2");unicode-range:U+??,U+131,U+152-153,U+2BB-2BC,U+2C6,U+2DA,U+2DC,U+304,U+308,U+329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:var(--sw-brand-surface);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:var(--sw-brand-surface)}@keyframes slideIn{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}.animate-slide-in{animation:.2s ease-out slideIn}@keyframes pulse-dot{0%,to{opacity:1}50%{opacity:.4}}.animate-pulse-dot{animation:2s ease-in-out infinite pulse-dot}:root{color-scheme:light;--work-bg:var(--sw-brand-paper);--work-panel:var(--sw-brand-surface);--work-border:var(--sw-brand-line);--work-muted:var(--sw-brand-muted);--work-ink:var(--sw-brand-ink);--work-accent:var(--sw-brand-accent)}.work-shell .bg-gray-700.text-white,.work-shell .hover\:bg-gray-700.hover\:text-white:hover{color:var(--sw-brand-ink)}.work-shell{background:var(--work-bg);font-family:var(--sw-brand-sans);color:var(--work-ink)}.work-shell button,.work-shell select,.work-shell input,.work-shell textarea{font:inherit}.work-shell button,.work-shell summary{cursor:pointer}.work-shell :focus-visible,.work-dialog :focus-visible{outline:2px solid var(--work-accent);outline-offset:4px}.work-sidebar{background:var(--sw-brand-surface);border-right:1px solid var(--sw-brand-line);flex-direction:column;flex:0 0 204px;width:204px;height:100dvh;display:flex;position:sticky;top:0;overflow:auto}.work-brand{letter-spacing:-.5px;align-items:center;gap:10px;padding:30px 20px 32px;font-size:18px;font-weight:650;display:flex}.work-brand small{color:var(--work-muted);letter-spacing:1.6px;margin-top:4px;font-size:8px;font-weight:500;display:block}.work-brand-mark{background:var(--work-accent);color:var(--sw-brand-muted);border-radius:4px;width:32px;height:32px;padding-left:5px;font-size:19px;line-height:26px;position:relative}.work-brand-mark span{position:absolute;top:5px;left:11px}.work-project-select{padding:0 16px 27px}.work-project-select label{color:var(--sw-brand-muted);letter-spacing:1.5px;margin-bottom:10px;font-size:9px;display:block}.work-project-select select{width:100%;color:var(--sw-brand-ink);background:var(--sw-brand-surface);border:1px solid var(--sw-brand-line);border-radius:5px;padding:8px;font-size:12px}.work-navigation{gap:6px;padding:0 10px;display:grid}.work-navigation a{color:var(--sw-brand-muted);border-radius:5px;align-items:center;gap:12px;padding:12px 13px;font-size:13px;text-decoration:none;display:flex}.work-navigation a.active{color:var(--work-accent);background:var(--sw-brand-surface)}.work-navigation a:hover{background:var(--sw-brand-surface)}.work-nav-icon{width:20px;font-size:20px;line-height:18px}.work-sidebar-note{border-top:1px solid var(--sw-brand-line);margin:40px 22px;padding-top:22px}.work-sidebar-note>span{color:var(--sw-brand-muted);letter-spacing:1.8px;font-size:9px}.work-sidebar-note strong{font-family:var(--sw-brand-display);color:var(--sw-brand-ink);margin-top:12px;font-size:22px;font-weight:400;line-height:1.3;display:block}.work-sidebar-note p{color:var(--sw-brand-muted);margin-top:12px;font-size:11px;line-height:1.7}.work-advanced{color:var(--sw-brand-muted);margin-top:auto;padding:16px;font-size:11px}.work-advanced summary{padding:8px 0}.work-advanced nav{gap:4px;margin-top:10px;display:grid}.work-advanced a{border-radius:4px;padding:7px}.work-advanced a:hover{color:var(--sw-brand-muted);background:var(--sw-brand-surface)}.work-sidebar-footer{border-top:1px solid var(--sw-brand-line);color:var(--sw-brand-muted);align-items:center;gap:8px;padding:20px 18px;font-size:10px;display:flex}.work-header{border-bottom:1px solid var(--sw-brand-line);height:54px;color:var(--sw-brand-muted);flex-shrink:0;justify-content:space-between;align-items:center;padding:0 30px;font-size:11px;display:flex}.work-header b{margin:0 12px;font-weight:400}.work-header strong{color:var(--sw-brand-ink);font-weight:500}.work-page{min-width:0;padding:32px 30px 20px}.work-eyebrow{letter-spacing:1.5px;color:var(--sw-brand-muted);align-items:center;gap:7px;font-size:9px;display:flex}.work-eyebrow>span:last-child{color:var(--sw-brand-muted);letter-spacing:1.2px;margin-left:auto;font-size:8px}.work-live-dot{background:var(--sw-brand-surface);border-radius:50%;flex:none;width:6px;height:6px;display:inline-block}.work-live-dot.connected{background:var(--sw-brand-surface);box-shadow:var(--sw-brand-shadow)}.work-heading{justify-content:space-between;align-items:center;gap:20px;margin:15px 0 30px;display:flex}.work-heading h1{letter-spacing:-1.6px;margin:0;font-size:clamp(25px,2.8vw,42px);font-weight:500;line-height:1.2}.work-heading p{color:var(--sw-brand-muted);margin-top:10px;font-size:12px}.work-primary,.work-secondary{white-space:nowrap;border:1px solid #0000;border-radius:5px;justify-content:center;align-items:center;gap:6px;padding:10px 15px;display:inline-flex;font-size:12px!important;font-weight:600!important}.work-primary{background:var(--work-accent);color:var(--sw-brand-muted)}.work-secondary{background:var(--sw-brand-surface);border-color:var(--sw-brand-line);color:var(--sw-brand-ink)}.work-primary:disabled,.work-secondary:disabled{opacity:.5;cursor:wait}.work-metrics{border:1px solid var(--sw-brand-line);background:var(--sw-brand-surface);border-radius:7px;grid-template-columns:repeat(4,minmax(0,1fr));margin-bottom:30px;display:grid}.work-metrics>div{border-right:1px solid var(--sw-brand-line);padding:20px 22px}.work-metrics>div:last-child{border:none}.work-metrics span{color:var(--sw-brand-muted);font-size:10px;display:block}.work-metrics strong{letter-spacing:-1px;font-variant-numeric:tabular-nums;margin:8px 0 5px;font-size:32px;font-weight:500;line-height:1.2;display:block}.work-metrics em{color:var(--sw-brand-muted);font-size:16px;font-style:normal}.work-metrics small{color:var(--sw-brand-muted);font-size:9px}.work-amber{color:var(--sw-brand-muted)}.work-toolbar{justify-content:space-between;align-items:center;gap:12px;margin-bottom:20px;display:flex}.work-view-label{letter-spacing:1.4px;font-size:10px;font-weight:600}.work-view-label span{color:var(--sw-brand-muted);letter-spacing:0;margin-left:12px;font-size:10px;font-weight:400}.work-search{border:1px solid var(--sw-brand-line);background:var(--sw-brand-surface);color:var(--sw-brand-muted);border-radius:5px;align-items:center;gap:7px;padding:5px 10px;display:flex}.work-search input{color:var(--sw-brand-ink);background:0 0;border:0;outline:none;width:205px;padding:3px 0;font-size:11px}.work-search input::placeholder{color:var(--sw-brand-muted)}.work-board-scroll{padding-bottom:16px;overflow-x:auto}.work-board{grid-template-columns:repeat(5,minmax(185px,1fr));gap:13px;min-width:960px;display:grid}.work-column{background:var(--sw-brand-surface);border:1px solid var(--sw-brand-line);border-radius:7px;min-width:0;padding:10px 8px;transition:background .15s,border-color .15s}.work-column.is-drop-target{background:var(--sw-brand-surface);border-color:var(--sw-brand-line)}.work-column-title{align-items:center;gap:7px;padding:5px 4px 16px;display:flex}.work-column-title h2{white-space:nowrap;font-size:11px;font-weight:600}.work-state-dot{border:1px solid var(--sw-brand-line);background:var(--sw-brand-surface);border-radius:50%;width:7px;height:7px}.state-active .work-state-dot,.state-blocked .work-state-dot,.state-review .work-state-dot,.state-done .work-state-dot{background:var(--sw-brand-surface);border-color:var(--sw-brand-line)}.work-count{color:var(--sw-brand-muted);font-variant-numeric:tabular-nums;margin-left:auto;font-size:10px}.work-cards{gap:10px;display:grid}.work-card{background:var(--sw-brand-surface);border:1px solid var(--sw-brand-line);box-shadow:var(--sw-brand-shadow);border-radius:6px;padding:12px;transition:border-color .15s,transform .15s}.work-card:hover{border-color:var(--sw-brand-line);transform:translateY(-1px)}.work-card-top{color:var(--sw-brand-muted);letter-spacing:.7px;justify-content:space-between;align-items:center;font-family:SFMono-Regular,Consolas,monospace;font-size:8px;display:flex}.work-drag{color:var(--sw-brand-muted);cursor:grab;font-size:15px}.work-card-title{color:var(--sw-brand-ink);text-align:left;overflow-wrap:anywhere;background:0 0;border:0;margin:8px 0;padding:0;line-height:1.5;display:block;font-size:12px!important;font-weight:600!important}.work-card-summary{color:var(--sw-brand-muted);-webkit-line-clamp:3;-webkit-box-orient:vertical;margin:0 0 13px;font-size:10px;line-height:1.65;display:-webkit-box;overflow:hidden}.work-progress>div{color:var(--sw-brand-muted);justify-content:space-between;font-size:9px;display:flex}.work-progress progress{background:var(--sw-brand-surface);width:100%;height:3px;accent-color:var(--sw-brand-accent);border:none;border-radius:2px;margin:8px 0 4px;display:block}.work-progress progress::-webkit-progress-bar{background:var(--sw-brand-surface);border-radius:2px}.work-progress progress::-webkit-progress-value{background:var(--sw-brand-surface);border-radius:2px}.work-progress small{color:var(--sw-brand-muted);font-size:9px}.work-card-proof{color:var(--sw-brand-muted);justify-content:space-between;align-items:center;gap:5px;padding:10px 0;font-size:8px;display:flex}.work-card-proof a{color:var(--sw-brand-muted);white-space:nowrap}.proof-passed,.proof-failed,.proof-stale{color:var(--sw-brand-muted)}.work-card-actor{border-top:1px solid var(--sw-brand-line);color:var(--sw-brand-ink);align-items:center;gap:7px;padding-top:10px;font-size:9px;display:flex}.work-card-actor small{color:var(--sw-brand-muted);margin-top:2px;font-size:8px;display:block}.work-avatar{background:var(--sw-brand-surface);border:1px solid var(--sw-brand-line);width:23px;height:23px;color:var(--sw-brand-ink);border-radius:50%;place-items:center;font-size:10px;display:grid}.work-setup-count{color:var(--sw-brand-muted);margin-left:auto;font-size:9px}.work-state-control{padding-top:9px;display:block}.work-state-control select{border:0;border-top:1px solid var(--sw-brand-line);width:100%;color:var(--sw-brand-muted);background:var(--sw-brand-surface);border-radius:0;padding:4px 3px;font-size:9px}.work-column-empty{color:var(--sw-brand-muted);text-align:center;border:1px dashed var(--sw-brand-line);border-radius:5px;padding:28px 9px;font-size:10px;line-height:1.7}.work-footnote{color:var(--sw-brand-muted);justify-content:space-between;gap:15px;margin-top:4px;font-size:9px;line-height:1.6;display:flex}.work-error{border:1px solid var(--sw-brand-line);color:var(--sw-brand-muted);background:var(--sw-brand-surface);border-radius:5px;margin-bottom:14px;padding:12px;font-size:12px}.work-error button{margin-left:20px;text-decoration:underline}.work-warning{color:var(--sw-brand-muted);margin-bottom:10px;font-size:11px}.work-sr-only{clip:rect(0,0,0,0);white-space:nowrap;border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.work-empty{color:var(--sw-brand-muted);padding:28px 0;font-size:12px}.work-empty.small{padding:12px 0;font-size:11px}.work-dialog{border:1px solid var(--sw-brand-line);background:var(--sw-brand-surface);width:min(650px,100vw - 32px);max-height:90dvh;color:var(--sw-brand-ink);box-shadow:var(--sw-brand-shadow);font-family:var(--sw-brand-sans);border-radius:10px;margin:auto;padding:0;position:fixed;inset:0;overflow:auto}.work-dialog::backdrop{background:var(--sw-brand-overlay);-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}.work-dialog-heading{border-bottom:1px solid var(--sw-brand-line);justify-content:space-between;align-items:center;gap:15px;padding:23px 24px;display:flex}.work-dialog-heading h2{letter-spacing:-.5px;overflow-wrap:anywhere;font-size:19px;font-weight:500;line-height:1.3}.work-icon-button{background:var(--sw-brand-surface);color:var(--sw-brand-muted);border:0;border-radius:4px;flex-shrink:0;width:28px;height:28px;font-size:23px}.work-form{gap:17px;padding:22px 24px;display:grid}.work-form p{color:var(--sw-brand-muted);margin:0;font-size:12px;line-height:1.6}.work-form label{color:var(--sw-brand-muted);gap:7px;font-size:11px;display:grid}.work-form input,.work-form textarea,.work-form select{background:var(--sw-brand-surface);width:100%;color:var(--sw-brand-ink);border:1px solid var(--sw-brand-line);border-radius:5px;min-width:0;padding:10px;font-size:12px;display:block}.work-form input::placeholder,.work-form textarea::placeholder{color:var(--sw-brand-muted)}.work-form textarea{resize:vertical}.work-form button{justify-self:start}.work-form-grid{grid-template-columns:1fr 1fr;gap:15px;display:grid}.work-detail{padding:22px 24px}.work-detail .work-form{padding:18px 0}.work-detail-meta{color:var(--sw-brand-muted);flex-wrap:wrap;gap:10px;font-size:10px;display:flex}.work-detail h3{color:var(--sw-brand-ink);margin:10px 0;font-size:13px;font-weight:600}.work-evidence{border-block:1px solid var(--sw-brand-line);margin:15px 0 25px;padding:13px 0 20px}.work-evidence>div{align-items:baseline;gap:12px;display:flex}.work-evidence strong{font-size:25px;font-weight:500}.work-evidence p,.work-evidence span{color:var(--sw-brand-muted);font-size:11px;line-height:1.7}.work-evidence a{color:var(--sw-brand-muted);margin-top:10px;font-size:11px;display:inline-block}.work-muted{color:var(--sw-brand-muted);font-size:11px;line-height:1.7}.work-timeline{padding:8px 0;list-style:none}.work-timeline li{gap:13px;padding-bottom:20px;font-size:11px;display:flex;position:relative}.work-timeline li:not(:last-child):before{content:"";background:var(--sw-brand-surface);width:1px;position:absolute;top:11px;bottom:0;left:4px}.work-timeline-dot{border:1px solid var(--sw-brand-line);background:var(--sw-brand-surface);border-radius:50%;flex:none;width:9px;height:9px;margin-top:4px}.work-timeline-title{flex-wrap:wrap;align-items:baseline;gap:9px;display:flex}.work-timeline-title strong{color:var(--sw-brand-ink);font-weight:600}.work-timeline-title span{color:var(--sw-brand-muted)}.work-timeline-title small{text-transform:uppercase;border:1px solid var(--sw-brand-line);color:var(--sw-brand-muted);border-radius:3px;padding:1px 4px;font-size:8px}.work-timeline p{color:var(--sw-brand-muted);overflow-wrap:anywhere;margin:5px 0 0;font-size:10px}.work-timeline .work-timeline-note{color:var(--sw-brand-muted)}.work-add-setup,.work-handoff{border-top:1px solid var(--sw-brand-line);color:var(--sw-brand-muted);padding:16px 0;font-size:12px}.work-handoff pre{white-space:pre-wrap;color:var(--sw-brand-muted);overflow-wrap:anywhere;padding:16px 0;font-size:10px;line-height:1.7}.work-session-group{border:1px solid var(--sw-brand-line);background:var(--sw-brand-surface);border-radius:7px;margin-bottom:16px;padding:20px}.work-session-group>button{color:var(--sw-brand-ink);text-align:left;margin-bottom:15px;font-size:15px}.work-session-group>button span{color:var(--sw-brand-muted)}@media(max-width:1000px){.work-sidebar{flex-basis:172px;width:172px}.work-brand{padding-inline:14px;font-size:16px}.work-page{padding:25px 20px}.work-metrics>div{padding:17px 14px}.work-metrics small{line-height:1.7;display:block}.work-header{padding-inline:20px}.work-header>span:last-child{display:none}}@media(max-width:640px){.work-sidebar{flex-basis:57px;width:57px}.work-brand{padding:23px 12px}.work-brand>span,.work-project-select,.work-nav-label,.work-sidebar-note,.work-sidebar-footer>span:last-child{display:none}.work-navigation{padding:0 6px}.work-navigation a{padding:12px 10px}.work-advanced{overflow-wrap:anywhere;padding:12px 6px;font-size:8px}.work-sidebar-footer{padding:20px}.work-header{padding-inline:16px;font-size:10px}.work-page{padding:23px 15px 16px}.work-heading{flex-direction:column;align-items:flex-start;gap:18px}.work-heading h1{font-size:29px}.work-heading p{max-width:250px;line-height:1.8}.work-eyebrow>span:last-child{display:none}.work-metrics{grid-template-columns:1fr 1fr}.work-metrics>div:nth-child(2){border-right:none}.work-metrics>div:nth-child(-n+2){border-bottom:1px solid var(--sw-brand-line)}.work-metrics strong{font-size:28px}.work-toolbar{flex-direction:column;align-items:flex-start}.work-search,.work-search input{width:100%}.work-board{grid-template-columns:repeat(5,235px);gap:12px;min-width:0}.work-footnote{flex-direction:column;gap:4px}.work-form-grid{grid-template-columns:1fr}.work-dialog-heading,.work-detail,.work-form{padding:18px}}@media(prefers-reduced-motion:reduce){*,:before,:after{scroll-behavior:auto!important;transition:none!important;animation:none!important}}.work-local-sessions{margin-bottom:35px}.work-local-sessions>h2{margin-bottom:8px;font-size:19px;font-weight:500}.work-local-sessions>.work-muted{margin-bottom:20px}.work-local-session-heading{flex-wrap:wrap;align-items:center;gap:12px;margin-bottom:20px;display:flex}.work-local-session-heading strong{font-size:14px}.work-local-session-heading span,.work-local-session-heading small{color:var(--sw-brand-muted);font-size:10px}.work-local-session-heading small{margin-left:auto}.work-session-link{gap:12px;display:flex}.work-session-link label{flex:1;min-width:0}.work-session-link select{background:var(--sw-brand-surface);width:100%;color:var(--sw-brand-muted);border:1px solid var(--sw-brand-line);border-radius:5px;padding:10px;font-size:11px}html,body,#root{width:100%;min-width:0;margin:0}.work-shell{width:100%;overflow-x:clip}.work-shell>div,.work-page,.work-board-scroll{min-width:0;max-width:100%}.work-sr-only{top:0;left:0}.work-column{flex-direction:column;max-height:680px;display:flex}.work-cards{align-content:start;min-height:0;overflow-y:auto}body{background:var(--sw-brand-paper);color:var(--sw-brand-ink);font-family:var(--sw-brand-sans)}.work-sidebar{background:var(--sw-brand-soft);border-color:var(--sw-brand-line)}.work-brand-mark{background:var(--sw-brand-action);color:var(--sw-brand-on-action)}.work-navigation a.active{background:var(--sw-brand-selected);color:var(--sw-brand-accent)}.work-navigation a:hover,.work-advanced a:hover{background:var(--sw-brand-hover);color:var(--sw-brand-ink)}.work-heading h1,.work-dialog-heading h2{font-family:var(--sw-brand-display);font-weight:450}.work-primary{background:var(--sw-brand-action);color:var(--sw-brand-on-action);border-color:var(--sw-brand-action)}.work-primary:hover{background:var(--sw-brand-action-hover)}.work-secondary{background:var(--sw-brand-surface);color:var(--sw-brand-ink);border-color:var(--sw-brand-control-border)}.work-primary,.work-secondary,.work-form input,.work-form select,.work-project-select select{border-radius:var(--sw-brand-radius);min-height:44px}.work-metrics,.work-session-group{background:var(--sw-brand-surface)}.work-column{background:var(--sw-brand-soft)}.work-card{background:var(--sw-brand-card)}.work-card:hover,.work-column.is-drop-target{border-color:var(--sw-brand-control-border)}.work-column.is-drop-target{background:var(--sw-brand-selected)}.work-state-dot{border-color:var(--sw-brand-muted);background:0 0}.state-active .work-state-dot{background:var(--sw-brand-warning);border-color:var(--sw-brand-warning)}.state-blocked .work-state-dot{background:var(--sw-brand-danger);border-color:var(--sw-brand-danger)}.state-review .work-state-dot{background:var(--sw-brand-review);border-color:var(--sw-brand-review)}.state-done .work-state-dot,.work-live-dot.connected{background:var(--sw-brand-success);border-color:var(--sw-brand-success)}.proof-passed{color:var(--sw-brand-success)}.proof-failed,.work-error{color:var(--sw-brand-danger)}.work-error{background:var(--sw-brand-danger-soft)}.proof-stale,.work-warning,.work-amber{color:var(--sw-brand-warning)}.work-card-proof a,.work-evidence a,.work-detail-meta,.work-handoff,.work-add-setup{color:var(--sw-brand-accent)}.work-progress progress{accent-color:var(--sw-brand-success)}.work-progress progress::-webkit-progress-value{background:var(--sw-brand-success)}.work-progress progress::-webkit-progress-bar{background:var(--sw-brand-line)}.work-avatar,.work-timeline-dot{background:var(--sw-brand-selected);color:var(--sw-brand-ink)}.work-card-title{font-size:15px!important}.work-card-summary,.work-form p,.work-form label,.work-form input,.work-form textarea,.work-heading p{font-size:14px}.work-card-top,.work-card-proof,.work-card-actor,.work-card-actor small,.work-state-control select,.work-metrics small,.work-footnote{font-size:12px}.work-icon-button{width:44px;height:44px}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-divide-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-gradient-position{syntax:"*";inherits:false}@property --tw-gradient-from{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-via{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-to{syntax:"<color>";inherits:false;initial-value:#0000}@property --tw-gradient-stops{syntax:"*";inherits:false}@property --tw-gradient-via-stops{syntax:"*";inherits:false}@property --tw-gradient-from-position{syntax:"<length-percentage>";inherits:false;initial-value:0%}@property --tw-gradient-via-position{syntax:"<length-percentage>";inherits:false;initial-value:50%}@property --tw-gradient-to-position{syntax:"<length-percentage>";inherits:false;initial-value:100%}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes pulse{50%{opacity:.5}}