@agent-plan/pi-adapter 0.2.24 → 0.2.25

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,iCAAiC,CAAC;AA+1BtF,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CA0mI9D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAoB,MAAM,iCAAiC,CAAC;AAo5BtF,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAqnI9D"}
package/dist/index.js CHANGED
@@ -16,7 +16,6 @@ import { join, dirname } from "node:path";
16
16
  import { homedir } from "node:os";
17
17
  import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
18
18
  import { writeFile, rm } from "node:fs/promises";
19
- import { randomUUID } from "node:crypto";
20
19
  import { createServer } from "node:net";
21
20
  import { fileURLToPath } from "node:url";
22
21
  import { serve } from "@agent-plan/server/serve";
@@ -30,7 +29,7 @@ let capturedPi = null;
30
29
  let store = null;
31
30
  let server = null;
32
31
  let lastKnownWebPort = null;
33
- let plannerSessionId = randomUUID();
32
+ let plannerSessionId = "pi:uninitialized";
34
33
  // True while the agent is mutating .planner/ files. The web server returns 503-busy
35
34
  // during this window so the UI doesn't render inconsistent data.
36
35
  let planBusy = false;
@@ -55,6 +54,50 @@ function taskStartFailure(outcome, details = {}) {
55
54
  details: { ...outcome, ...details },
56
55
  };
57
56
  }
57
+ function derivedStatusReadOnlyResult(entity, ref, attemptedStatus, effectiveStatus) {
58
+ const childKind = entity === "feature" ? "phases" : "tasks";
59
+ const retryAction = entity === "feature"
60
+ ? `Retry feature_update ${ref} without the status field if you need to update metadata.`
61
+ : `Retry phase_update ${ref} without the status field if you need to update metadata.`;
62
+ const nextActions = [
63
+ `${entity[0].toUpperCase()}${entity.slice(1)} status is derived from child ${childKind}; update the child ${childKind} instead of setting ${entity}.status.`,
64
+ retryAction,
65
+ ];
66
+ return {
67
+ isError: true,
68
+ content: [{ type: "text", text: [
69
+ `❌ ${entity.toUpperCase()} UPDATE FAILED [DERIVED_STATUS_READ_ONLY]`,
70
+ `${entity[0].toUpperCase()}${entity.slice(1)} status is derived from child ${childKind} and cannot be set directly.`,
71
+ `Attempted status: ${attemptedStatus}`,
72
+ `Effective derived status: ${effectiveStatus}`,
73
+ "No planner data was changed.",
74
+ "Next required actions:",
75
+ ...nextActions.map((action, index) => `${index + 1}. ${action}`),
76
+ ].join("\n") }],
77
+ details: {
78
+ updated: false,
79
+ errorCode: "DERIVED_STATUS_READ_ONLY",
80
+ entity,
81
+ ref,
82
+ attemptedStatus,
83
+ effectiveStatus,
84
+ nextActions,
85
+ },
86
+ };
87
+ }
88
+ function piContextReadActions(eligibility, refs, requirementReadRequired, retryAction) {
89
+ const actions = (eligibility.requiredReads ?? []).flatMap((read) => {
90
+ if (read.kind === "task")
91
+ return [`task_get ${refs.task} with full=true`];
92
+ if (read.kind === "phase")
93
+ return [`phase_get ${refs.phase} with full=true`];
94
+ return refs.feature ? [`feature_get ${refs.feature} with full=true`] : [];
95
+ });
96
+ if (requirementReadRequired)
97
+ actions.push("requirement_list");
98
+ actions.push(retryAction);
99
+ return actions;
100
+ }
58
101
  // Helper to notify a running server in another process via HTTP.
59
102
  async function notifyExternalServer() {
60
103
  try {
@@ -802,8 +845,8 @@ export default function planPiExtension(pi) {
802
845
  capturedPi = pi;
803
846
  // ── Restore on session start/reload ─────────────────────────────────
804
847
  pi.on("session_start", async (_event, ctx) => {
805
- plannerSessionId = randomUUID();
806
- invalidateReads();
848
+ plannerSessionId = `pi:${ctx.sessionManager.getSessionId()}`;
849
+ invalidateReads(plannerSessionId);
807
850
  startReadSession(plannerSessionId);
808
851
  try {
809
852
  ctx.ui.addAutocompleteProvider((current) => ({
@@ -2245,11 +2288,16 @@ export default function planPiExtension(pi) {
2245
2288
  requirementIds: linkedRequirementIds,
2246
2289
  };
2247
2290
  const contextEligibility = contextReadEligibilityForSession(contextInput);
2291
+ const requirementsReady = hasReadRequirementsForSession(plannerSessionId, linkedRequirementIds, linkedRequirements);
2292
+ const phaseRef = formatPhaseRef(phase.number, featureNumberOfPhase(phase, features));
2293
+ const taskRef = `${phaseRef}/T${String(task.number).padStart(3, "0")}`;
2294
+ const featureRef = feature ? formatFeatureRef(feature.number) : "";
2248
2295
  if (!contextEligibility.eligible) {
2249
- ctx.ui.notify(`❌ TASK START FAILED [CONTEXT_READ_REQUIRED]\nstarted: false\n${contextEligibility.reason}\nRead task(full), phase(full), feature(full) in order, then retry.`, "error");
2296
+ const actions = piContextReadActions(contextEligibility, { task: taskRef, phase: phaseRef, ...(featureRef ? { feature: featureRef } : {}) }, !requirementsReady, `/planner task start ${taskRef}`);
2297
+ ctx.ui.notify(`❌ TASK START FAILED [CONTEXT_READ_REQUIRED]\nstarted: false\n${contextEligibility.reason}\nNext required actions:\n${actions.map((action, index) => `${index + 1}. ${action}`).join("\n")}`, "error");
2250
2298
  return;
2251
2299
  }
2252
- if (!hasReadRequirementsForSession(plannerSessionId, linkedRequirementIds, linkedRequirements)) {
2300
+ if (!requirementsReady) {
2253
2301
  ctx.ui.notify("❌ TASK START FAILED [REQUIREMENTS_READ_REQUIRED]\nstarted: false\nRun requirement_list, then retry /planner task start. The task remains unchanged.", "error");
2254
2302
  return;
2255
2303
  }
@@ -3527,10 +3575,12 @@ export default function planPiExtension(pi) {
3527
3575
  if (!resolvedFeature.ok)
3528
3576
  return { content: [{ type: "text", text: resolvedFeature.error }], details: {} };
3529
3577
  const featureId = resolvedFeature.feature.id;
3578
+ if (params.status !== undefined) {
3579
+ return derivedStatusReadOnlyResult("feature", formatFeatureRef(resolvedFeature.feature.number), String(params.status), resolvedFeature.feature.status);
3580
+ }
3530
3581
  const mutableFields = [
3531
3582
  "name",
3532
3583
  "description",
3533
- "status",
3534
3584
  "startDate",
3535
3585
  "endDate",
3536
3586
  "workDone",
@@ -3570,18 +3620,6 @@ export default function planPiExtension(pi) {
3570
3620
  feature.priority = params.priority;
3571
3621
  if (params.acceptedDecisions !== undefined)
3572
3622
  feature.acceptedDecisions = params.acceptedDecisions;
3573
- if (params.status !== undefined) {
3574
- const status = params.status;
3575
- if (feature.status !== status) {
3576
- if (status === "in-progress" && !feature.startDate) {
3577
- feature.startDate = new Date().toISOString().slice(0, 10);
3578
- }
3579
- if (status === "done" && !feature.endDate) {
3580
- feature.endDate = new Date().toISOString().slice(0, 10);
3581
- }
3582
- }
3583
- feature.status = status;
3584
- }
3585
3623
  feature.updatedAt = nowISO();
3586
3624
  return doc;
3587
3625
  });
@@ -3814,14 +3852,15 @@ export default function planPiExtension(pi) {
3814
3852
  catch {
3815
3853
  return { content: [{ type: "text", text: `Phase not found: ${params.phaseId}` }], details: {} };
3816
3854
  }
3855
+ if (params.status !== undefined) {
3856
+ return derivedStatusReadOnlyResult("phase", formatPhaseRef(resolvedPhase.number, featureNumberOfPhase(resolvedPhase, features)), String(params.status), resolvedPhase.status);
3857
+ }
3817
3858
  const prevFeatureId = phase.featureId;
3818
3859
  let nextFeatureIdForUpdate = prevFeatureId;
3819
3860
  if (params.title !== undefined) {
3820
3861
  phase.title = params.title;
3821
3862
  phase.slug = normalizeSlug(params.title);
3822
3863
  }
3823
- if (params.status !== undefined)
3824
- phase.status = params.status;
3825
3864
  if (params.summary !== undefined)
3826
3865
  phase.summary = params.summary;
3827
3866
  if (params.description !== undefined)
@@ -4391,7 +4430,7 @@ export default function planPiExtension(pi) {
4391
4430
  resumeLocation: params.resume_location.trim(), howToResume: params.how_to_resume.trim(), relatedTaskId: "",
4392
4431
  pausedAt: nowISO(), pausedBy: params.paused_by?.trim() ?? "",
4393
4432
  };
4394
- invalidateReads();
4433
+ invalidateReads(plannerSessionId);
4395
4434
  const checkpointed = await st.pauseTask(found.phase.id, found.task.id, snapshot);
4396
4435
  await st.syncTaskStatusRollup(found.phase.id);
4397
4436
  const activeDeviation = (await st.loadProject()).workDeviations
@@ -4424,7 +4463,7 @@ export default function planPiExtension(pi) {
4424
4463
  pi.registerTool({
4425
4464
  name: "task_switch",
4426
4465
  label: "Task Switch",
4427
- description: "Switch from active work to a temporary task, even outside priority order. Reuse the target's valid sessionInfo context or require the exact full tree when missing or stale. Atomically snapshot/pause the source, start the target, and push a durable LIFO return target.",
4466
+ description: "Switch from active work to a temporary task, even outside priority order. Call this tool first so valid sessionInfo context can be reused; on denial, perform only the missing/stale reads listed in nextActions and retry. Atomically snapshot/pause the source, start the target, and push a durable LIFO return target.",
4428
4467
  parameters: Type.Object({
4429
4468
  from_task: Type.String({ description: "Currently in-progress task ref" }),
4430
4469
  to_task: Type.String({ description: "Temporary task ref to start" }),
@@ -4469,11 +4508,16 @@ export default function planPiExtension(pi) {
4469
4508
  requirementIds: linkedRequirementIds,
4470
4509
  };
4471
4510
  const contextEligibility = contextReadEligibilityForSession(contextInput);
4511
+ const requirementsReady = hasReadRequirementsForSession(plannerSessionId, linkedRequirementIds, linkedRequirements);
4512
+ const targetPhaseRef = formatPhaseRef(target.phase.number, featureNumberOfPhase(target.phase, features));
4513
+ const targetTaskRef = `${targetPhaseRef}/T${String(target.task.number).padStart(3, "0")}`;
4514
+ const targetFeatureRef = targetFeature ? formatFeatureRef(targetFeature.number) : "";
4472
4515
  if (!contextEligibility.eligible) {
4473
- return { content: [{ type: "text", text: `Task switch denied: context reads required. ${contextEligibility.reason}` }], details: contextEligibility };
4516
+ const nextActions = piContextReadActions(contextEligibility, { task: targetTaskRef, phase: targetPhaseRef, ...(targetFeatureRef ? { feature: targetFeatureRef } : {}) }, !requirementsReady, `Retry task_switch to ${targetTaskRef}`);
4517
+ return { content: [{ type: "text", text: `Task switch denied: context reads required. ${contextEligibility.reason}` }], details: { ...contextEligibility, nextActions } };
4474
4518
  }
4475
- if (!hasReadRequirementsForSession(plannerSessionId, linkedRequirementIds, linkedRequirements)) {
4476
- return { content: [{ type: "text", text: "Task switch denied: read the requirements linked to the target phase and feature before switching." }], details: { requirementIds: linkedRequirementIds } };
4519
+ if (!requirementsReady) {
4520
+ return { content: [{ type: "text", text: "Task switch denied: read the requirements linked to the target phase and feature before switching." }], details: { requirementIds: linkedRequirementIds, nextActions: ["requirement_list", `Retry task_switch to ${targetTaskRef}`] } };
4477
4521
  }
4478
4522
  if (!hasValidSessionAttestation(contextInput)) {
4479
4523
  await st.recordContextRead({ sessionId: plannerSessionId, phaseId: target.phase.id, taskId: target.task.id, ...(target.phase.featureId ? { featureId: target.phase.featureId } : {}), requirementIds: linkedRequirementIds });
@@ -4567,7 +4611,7 @@ export default function planPiExtension(pi) {
4567
4611
  if (target.phase.id !== source.phase.id)
4568
4612
  await st.syncTaskStatusRollup(target.phase.id);
4569
4613
  await st.writeGenerated();
4570
- invalidateReads();
4614
+ invalidateReads(plannerSessionId);
4571
4615
  const sourceRef = `${formatPhaseRef(source.phase.number, featureNumberOfPhase(source.phase, features))}/T${String(source.task.number).padStart(3, "0")}`;
4572
4616
  const targetRef = `${formatPhaseRef(target.phase.number, featureNumberOfPhase(target.phase, features))}/T${String(target.task.number).padStart(3, "0")}`;
4573
4617
  return {
@@ -4584,7 +4628,7 @@ export default function planPiExtension(pi) {
4584
4628
  pi.registerTool({
4585
4629
  name: "task_start",
4586
4630
  label: "Task Start",
4587
- description: "Set a task to in-progress or resume checkpointed work. Read the exact full task → phase → feature tree and linked requirements once per harness session; subsequent starts reuse persisted sessionInfo while entity updatedAt values remain unchanged. A stale or denied start is an isError result with started=false and an exact retry sequence; NEVER claim work started unless details.started is true. Success is returned only after persisted in-progress state is verified.",
4631
+ description: "Set a task to in-progress or resume checkpointed work. Call this tool before reading context so it can reuse valid sessionInfo attestations; if denied, perform only the missing/stale reads listed in nextActions, in order, and retry. A denied start is an isError result with started=false; NEVER claim work started unless details.started is true. Success is returned only after persisted in-progress state is verified.",
4588
4632
  parameters: Type.Object({
4589
4633
  taskId: Type.String({ description: "Task ref: F00x/P00x/T00x, bare T00x (global), 5-char shortId, UUID, or title to start" }),
4590
4634
  }),
@@ -4601,10 +4645,6 @@ export default function planPiExtension(pi) {
4601
4645
  const taskRef = `${phaseRef}/T${String(task.number).padStart(3, "0")}`;
4602
4646
  const feature = found.phase.featureId ? features.find((candidate) => candidate.id === found.phase.featureId) : undefined;
4603
4647
  const featureRef = feature ? formatFeatureRef(feature.number) : "";
4604
- if (task.status === "in-progress") {
4605
- const outcome = taskStartSucceeded(task.id, true);
4606
- return { content: [{ type: "text", text: `✅ Task already started: ${taskRef} — ${task.title} (in-progress)\nstarted: true` }], details: { ...task, ...outcome, task } };
4607
- }
4608
4648
  if (task.status === "done")
4609
4649
  return taskStartFailure(taskStartDenied("TASK_DONE", `Task ${taskRef} is done and was not reopened.`, [`Use task_update with status=planned and a motivation to reopen ${taskRef}.`, `Repeat the required full context reads, then retry task_start ${taskRef}.`], { taskId: task.id }));
4610
4650
  const linkedRequirements = [
@@ -4624,16 +4664,11 @@ export default function planPiExtension(pi) {
4624
4664
  requirementIds: linkedRequirementIds,
4625
4665
  };
4626
4666
  const contextEligibility = contextReadEligibilityForSession(contextInput);
4667
+ const requirementsReady = hasReadRequirementsForSession(plannerSessionId, linkedRequirementIds, linkedRequirements);
4627
4668
  if (!contextEligibility.eligible) {
4628
- return taskStartFailure(taskStartDenied("CONTEXT_READ_REQUIRED", `Required context reads are incomplete or stale. ${contextEligibility.reason}`, [
4629
- `task_get ${taskRef} with full=true`,
4630
- `phase_get ${phaseRef} with full=true`,
4631
- ...(featureRef ? [`feature_get ${featureRef} with full=true`] : []),
4632
- ...(linkedRequirementIds.length > 0 ? ["requirement_list"] : []),
4633
- `Retry task_start ${taskRef}`,
4634
- ], { taskId: task.id }), { contextEligibility });
4635
- }
4636
- if (!hasReadRequirementsForSession(plannerSessionId, linkedRequirementIds, linkedRequirements)) {
4669
+ return taskStartFailure(taskStartDenied("CONTEXT_READ_REQUIRED", `Required context reads are incomplete or stale. ${contextEligibility.reason}`, piContextReadActions(contextEligibility, { task: taskRef, phase: phaseRef, ...(featureRef ? { feature: featureRef } : {}) }, !requirementsReady, `Retry task_start ${taskRef}`), { taskId: task.id }), { contextEligibility });
4670
+ }
4671
+ if (!requirementsReady) {
4637
4672
  return taskStartFailure(taskStartDenied("REQUIREMENTS_READ_REQUIRED", "Linked requirements were not read; the task remains unchanged.", ["requirement_list", `Retry task_start ${taskRef}`], { taskId: task.id, requirementIds: linkedRequirementIds }));
4638
4673
  }
4639
4674
  if (!hasValidSessionAttestation(contextInput)) {
@@ -4645,6 +4680,10 @@ export default function planPiExtension(pi) {
4645
4680
  requirementIds: linkedRequirementIds,
4646
4681
  });
4647
4682
  }
4683
+ if (task.status === "in-progress") {
4684
+ const outcome = taskStartSucceeded(task.id, true);
4685
+ return { content: [{ type: "text", text: `✅ Task already started: ${taskRef} — ${task.title} (in-progress)\nstarted: true` }], details: { ...task, ...outcome, task } };
4686
+ }
4648
4687
  const [project, phases, focus] = await Promise.all([st.loadProject(), st.loadAllPhases(), st.loadResume()]);
4649
4688
  const eligibility = checkExplicitTaskStart(features, phases, task.id, project.workDeviations);
4650
4689
  if (!eligibility.eligible)
@@ -5184,7 +5223,7 @@ export default function planPiExtension(pi) {
5184
5223
  "",
5185
5224
  "Operational rules:",
5186
5225
  "- Handoffs are context, not locks. Read the relevant handoff with handoff show <ref> before resuming.",
5187
- "- BEFORE work: read the exact task(full), parent phase(full), parent feature(full), and linked requirements once per harness session in that order. Later task_start, resume, or task_switch calls reuse valid sessionInfo; reread only after a new session, a lineage change, or an entity updatedAt change. A denial is an error with started=false: follow its nextActions and retry; only details.started=true proves the task is in-progress. Only then touch code. AFTER finishing: task_complete with durable completion/verification evidence.",
5226
+ "- BEFORE work: call task_start or task_switch first so valid sessionInfo attestations are reused. If denied, perform only the missing/stale full reads listed in nextActions, in that order, then retry. A denial is an error with started=false; only details.started=true proves the task is in-progress. Only then touch code. AFTER finishing: task_complete with durable completion/verification evidence.",
5188
5227
  "- Record every new decision or user-agreed modification in both the relevant feature and phase before treating the discussion as complete.",
5189
5228
  "- Use task_update with motivation for blocked/canceled/rejected/deferred/waiting/planned(from non-planned).",
5190
5229
  "- Planner ops (status/handoff/planner metadata) are NOT code edits; they are always allowed.",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-plan/pi-adapter",
3
- "version": "0.2.24",
3
+ "version": "0.2.25",
4
4
  "private": false,
5
5
  "description": "Pi agent extension for Agent Plan — structured project planning in .planner/",
6
6
  "keywords": [
@@ -28,8 +28,8 @@
28
28
  "dependencies": {
29
29
  "typebox": "^1.1.24",
30
30
  "zod": "^3.24.0",
31
- "@agent-plan/core": "0.2.24",
32
- "@agent-plan/server": "0.2.24"
31
+ "@agent-plan/core": "0.2.25",
32
+ "@agent-plan/server": "0.2.25"
33
33
  },
34
34
  "devDependencies": {
35
35
  "@earendil-works/pi-coding-agent": "^0.74.0",
@@ -0,0 +1 @@
1
+ @import"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&family=JetBrains+Mono:wght@400;500;600;700&display=swap";/*! tailwindcss v4.3.1 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction: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-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-amber-600:oklch(66.6% .179 58.318);--color-amber-700:oklch(55.5% .163 48.998);--color-emerald-400:oklch(76.5% .177 163.223);--color-emerald-500:oklch(69.6% .17 162.48);--color-emerald-600:oklch(59.6% .145 163.225);--color-sky-400:oklch(74.6% .16 232.661);--color-sky-500:oklch(68.5% .169 237.323);--color-sky-700:oklch(50% .134 242.749);--color-rose-400:oklch(71.2% .194 13.428);--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-black:#000;--color-white:#fff;--spacing:.25rem;--container-md:28rem;--container-2xl:42rem;--container-3xl:48rem;--container-4xl:56rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--font-weight-black:900;--tracking-tight:-.025em;--tracking-wide:.025em;--tracking-wider:.05em;--leading-snug:1.375;--radius-sm:.25rem;--radius-md:.375rem;--radius-lg:.5rem;--radius-xl:.75rem;--radius-2xl:1rem;--animate-pulse:pulse 2s cubic-bezier(.4, 0, .6, 1) infinite;--blur-sm:8px;--blur-xl:24px;--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);--color-status-draft:#94a3b8;--color-status-discovery:#6366f1;--color-status-planned:#0ea5e9;--color-status-in-progress:#f59e0b;--color-status-paused:#ea580c;--color-status-done:#22c55e;--color-status-blocked:#ef4444;--color-status-canceled:#94a3b8;--color-status-waiting:#64748b;--color-status-deferred:#8b5cf6;--color-status-rejected:#f43f5e;--color-status-started:#6366f1;--color-status-closed:#0d9488}}@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%;-moz-tab-size:4;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-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]){-webkit-appearance:button;-moz-appearance:button;appearance:button}::file-selector-button{-webkit-appearance:button;-moz-appearance: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}.sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.top-0{top:0}.top-1\/2{top:50%}.top-full{top:100%}.right-0{right:0}.right-2\.5{right:calc(var(--spacing) * 2.5)}.right-3{right:calc(var(--spacing) * 3)}.bottom-0{bottom:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-50{z-index:50}.z-\[150\]{z-index:150}.z-\[200\]{z-index:200}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.mx-2{margin-inline:calc(var(--spacing) * 2)}.my-1{margin-block:var(--spacing)}.mt-0{margin-top:0}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mb-1{margin-bottom:var(--spacing)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.ml-1{margin-left:var(--spacing)}.ml-1\.5{margin-left:calc(var(--spacing) * 1.5)}.ml-2{margin-left:calc(var(--spacing) * 2)}.ml-4{margin-left:calc(var(--spacing) * 4)}.ml-auto{margin-left:auto}.line-clamp-2{-webkit-line-clamp:2;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.table{display:table}.h-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-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-11{height:calc(var(--spacing) * 11)}.h-auto{height:auto}.h-full{height:100%}.h-px{height:1px}.max-h-\[32dvh\]{max-height:32dvh}.max-h-\[184px\]{max-height:184px}.max-h-\[calc\(100vh-2rem\)\]{max-height:calc(100vh - 2rem)}.min-h-0{min-height:0}.min-h-7{min-height:calc(var(--spacing) * 7)}.min-h-8{min-height:calc(var(--spacing) * 8)}.min-h-9{min-height:calc(var(--spacing) * 9)}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.w-1\.5{width:calc(var(--spacing) * 1.5)}.w-2{width:calc(var(--spacing) * 2)}.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-7{width:calc(var(--spacing) * 7)}.w-8{width:calc(var(--spacing) * 8)}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.w-52{width:calc(var(--spacing) * 52)}.w-\[1px\]{width:1px}.w-full{width:100%}.max-w-2xl{max-width:var(--container-2xl)}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-full{max-width:100%}.max-w-md{max-width:var(--container-md)}.max-w-none{max-width:none}.min-w-0{min-width:0}.min-w-28{min-width:calc(var(--spacing) * 28)}.min-w-44{min-width:calc(var(--spacing) * 44)}.min-w-\[7\.5rem\]{min-width:7.5rem}.min-w-\[180px\]{min-width:180px}.flex-1{flex:1}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.table-fixed{table-layout:fixed}.border-collapse{border-collapse:collapse}.-translate-y-1\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.rotate-0{rotate:0deg}.rotate-90{rotate:90deg}.rotate-180{rotate:180deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.animate-pulse{animation:var(--animate-pulse)}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.resize{resize:both}.scroll-mt-20{scroll-margin-top:calc(var(--spacing) * 20)}.scroll-mt-28{scroll-margin-top:calc(var(--spacing) * 28)}.\[scrollbar-width\:thin\]{scrollbar-width:thin}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.appearance-none{-webkit-appearance:none;-moz-appearance:none;appearance:none}.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\.75rem_minmax\(0\,1fr\)_2rem\]{grid-template-columns:3.75rem minmax(0,1fr) 2rem}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-2\.5{gap:calc(var(--spacing) * 2.5)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-5{gap:calc(var(--spacing) * 5)}.gap-6{gap:calc(var(--spacing) * 6)}.gap-8{gap:calc(var(--spacing) * 8)}.gap-x-3{column-gap:calc(var(--spacing) * 3)}.gap-y-1{row-gap:var(--spacing)}.self-end{align-self:flex-end}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-\[8px\]{border-radius:8px}.rounded-\[9px\]{border-radius:9px}.rounded-\[10px\]{border-radius:10px}.rounded-\[12px\]{border-radius:12px}.rounded-\[14px\]{border-radius:14px}.rounded-\[16px\]{border-radius:16px}.rounded-\[18px\]{border-radius:18px}.rounded-\[24px\]{border-radius:24px}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-sm{border-radius:var(--radius-sm)}.rounded-xl{border-radius:var(--radius-xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-2{border-top-style:var(--tw-border-style);border-top-width:2px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-2{border-left-style:var(--tw-border-style);border-left-width:2px}.border-dashed{--tw-border-style:dashed;border-style:dashed}.border-\[color\:color-mix\(in_srgb\,var\(--color-status-done\)_0\%\,transparent\)\]{border-color:#0000}@supports (color:color-mix(in lab,red,red)){.border-\[color\:color-mix\(in_srgb\,var\(--color-status-done\)_0\%\,transparent\)\]{border-color:color-mix(in srgb,var(--color-status-done) 0%,transparent)}}.border-\[var\(--accent\)\]{border-color:var(--accent)}.border-\[var\(--border\)\]{border-color:var(--border)}.border-\[var\(--border-strong\)\]{border-color:var(--border-strong)}.border-\[var\(--color-status-done\)\]{border-color:var(--color-status-done)}.border-\[var\(--danger-soft\)\]{border-color:var(--danger-soft)}.border-\[var\(--text-muted\)\]{border-color:var(--text-muted)}.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-emerald-500\/30{border-color:#00bb7f4d}@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-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-sky-500\/30{border-color:#00a5ef4d}@supports (color:color-mix(in lab,red,red)){.border-sky-500\/30{border-color:color-mix(in oklab,var(--color-sky-500) 30%,transparent)}}.border-transparent{border-color:#0000}.bg-\[color\:color-mix\(in_srgb\,var\(--accent\)_8\%\,transparent\)\]{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.bg-\[color\:color-mix\(in_srgb\,var\(--accent\)_8\%\,transparent\)\]{background-color:color-mix(in srgb,var(--accent) 8%,transparent)}}.bg-\[color\:color-mix\(in_srgb\,var\(--accent\)_10\%\,transparent\)\]{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.bg-\[color\:color-mix\(in_srgb\,var\(--accent\)_10\%\,transparent\)\]{background-color:color-mix(in srgb,var(--accent) 10%,transparent)}}.bg-\[color\:color-mix\(in_srgb\,var\(--accent\)_12\%\,transparent\)\]{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.bg-\[color\:color-mix\(in_srgb\,var\(--accent\)_12\%\,transparent\)\]{background-color:color-mix(in srgb,var(--accent) 12%,transparent)}}.bg-\[color\:color-mix\(in_srgb\,var\(--accent\)_16\%\,transparent\)\]{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.bg-\[color\:color-mix\(in_srgb\,var\(--accent\)_16\%\,transparent\)\]{background-color:color-mix(in srgb,var(--accent) 16%,transparent)}}.bg-\[color\:color-mix\(in_srgb\,var\(--accent\)_18\%\,transparent\)\]{background-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.bg-\[color\:color-mix\(in_srgb\,var\(--accent\)_18\%\,transparent\)\]{background-color:color-mix(in srgb,var(--accent) 18%,transparent)}}.bg-\[var\(--accent\)\]{background-color:var(--accent)}.bg-\[var\(--accent-soft\)\]{background-color:var(--accent-soft)}.bg-\[var\(--border\)\]{background-color:var(--border)}.bg-\[var\(--danger-soft\)\],.bg-\[var\(--danger-soft\)\]\/50{background-color:var(--danger-soft)}@supports (color:color-mix(in lab,red,red)){.bg-\[var\(--danger-soft\)\]\/50{background-color:color-mix(in oklab,var(--danger-soft) 50%,transparent)}}.bg-\[var\(--surface\)\]{background-color:var(--surface)}.bg-\[var\(--surface-card\)\]{background-color:var(--surface-card)}.bg-\[var\(--surface-elevated\)\],.bg-\[var\(--surface-elevated\)\]\/95{background-color:var(--surface-elevated)}@supports (color:color-mix(in lab,red,red)){.bg-\[var\(--surface-elevated\)\]\/95{background-color:color-mix(in oklab,var(--surface-elevated) 95%,transparent)}}.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-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black) 50%,transparent)}}.bg-current{background-color:currentColor}.bg-emerald-500{background-color:var(--color-emerald-500)}.bg-emerald-500\/10{background-color:#00bb7f1a}@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-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-sky-500{background-color:var(--color-sky-500)}.bg-sky-500\/10{background-color:#00a5ef1a}@supports (color:color-mix(in lab,red,red)){.bg-sky-500\/10{background-color:color-mix(in oklab,var(--color-sky-500) 10%,transparent)}}.bg-transparent{background-color:#0000}.bg-\[repeating-linear-gradient\(135deg\,var\(--text-muted\)_0_1px\,transparent_1px_3px\)\]{background-image:repeating-linear-gradient(135deg,var(--text-muted) 0 1px,transparent 1px 3px)}.fill-\[var\(--text-subtle\)\]{fill:var(--text-subtle)}.p-0{padding:0}.p-1{padding:var(--spacing)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-0{padding-inline:0}.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-8{padding-inline:calc(var(--spacing) * 8)}.py-0{padding-block:0}.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-5{padding-block:calc(var(--spacing) * 5)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-12{padding-block:calc(var(--spacing) * 12)}.pt-0\.5{padding-top:calc(var(--spacing) * .5)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pr-1{padding-right:var(--spacing)}.pr-6{padding-right:calc(var(--spacing) * 6)}.pr-8{padding-right:calc(var(--spacing) * 8)}.pb-1{padding-bottom:var(--spacing)}.pl-1{padding-left:var(--spacing)}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-4{padding-left:calc(var(--spacing) * 4)}.pl-5{padding-left:calc(var(--spacing) * 5)}.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-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[0\.95em\]{font-size:.95em}.text-\[10\.5px\]{font-size:10.5px}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.leading-6{--tw-leading:calc(var(--spacing) * 6);line-height:calc(var(--spacing) * 6)}.leading-none{--tw-leading:1;line-height:1}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.font-black{--tw-font-weight:var(--font-weight-black);font-weight:var(--font-weight-black)}.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-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-\[0\.12em\]{--tw-tracking:.12em;letter-spacing:.12em}.tracking-\[0\.14em\]{--tw-tracking:.14em;letter-spacing:.14em}.tracking-\[0\.16em\]{--tw-tracking:.16em;letter-spacing:.16em}.tracking-\[0\.18em\]{--tw-tracking:.18em;letter-spacing:.18em}.tracking-\[0\.22em\]{--tw-tracking:.22em;letter-spacing:.22em}.tracking-\[0\.24em\]{--tw-tracking:.24em;letter-spacing:.24em}.tracking-tight{--tw-tracking:var(--tracking-tight);letter-spacing:var(--tracking-tight)}.tracking-wide{--tw-tracking:var(--tracking-wide);letter-spacing:var(--tracking-wide)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.\[overflow-wrap\:anywhere\]{overflow-wrap:anywhere}.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-\[var\(--accent\)\]{color:var(--accent)}.text-\[var\(--color-status-blocked\)\]{color:var(--color-status-blocked)}.text-\[var\(--text\)\]{color:var(--text)}.text-\[var\(--text-muted\)\]{color:var(--text-muted)}.text-\[var\(--text-subtle\)\]{color:var(--text-subtle)}.text-amber-600{color:var(--color-amber-600)}.text-amber-700{color:var(--color-amber-700)}.text-emerald-500{color:var(--color-emerald-500)}.text-emerald-600{color:var(--color-emerald-600)}.text-rose-600{color:var(--color-rose-600)}.text-rose-700{color:var(--color-rose-700)}.text-sky-700{color:var(--color-sky-700)}.text-white{color:var(--color-white)}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.line-through{text-decoration-line:line-through}.underline{text-decoration-line:underline}.decoration-dotted{text-decoration-style:dotted}.underline-offset-2{text-underline-offset:2px}.underline-offset-4{text-underline-offset:4px}.accent-\[var\(--accent\)\]{accent-color:var(--accent)}.opacity-60{opacity:.6}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a), 0 8px 10px -6px 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-\[color\:color-mix\(in_srgb\,var\(--accent\)_55\%\,transparent\)\]{--tw-ring-color:var(--accent)}@supports (color:color-mix(in lab,red,red)){.ring-\[color\:color-mix\(in_srgb\,var\(--accent\)_55\%\,transparent\)\]{--tw-ring-color:color-mix(in srgb,var(--accent) 55%,transparent)}}.ring-\[var\(--accent\)\]{--tw-ring-color:var(--accent)}.grayscale{--tw-grayscale:grayscale(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.backdrop-blur-sm{--tw-backdrop-blur:blur(var(--blur-sm));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-blur-xl{--tw-backdrop-blur:blur(var(--blur-xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.backdrop-saturate-150{--tw-backdrop-saturate:saturate(150%);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-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-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))}.\[contain\:inline-size\]{contain:inline-size}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.group-open\:rotate-180:is(:where(.group):is([open],:popover-open,:open) *){rotate:180deg}@media(hover:hover){.group-hover\:border-\[var\(--accent\)\]:is(:where(.group):hover *){border-color:var(--accent)}.group-hover\:text-\[var\(--accent\)\]:is(:where(.group):hover *){color:var(--accent)}}.last\:border-0:last-child{border-style:var(--tw-border-style);border-width:0}@media(hover:hover){.hover\:border-\[var\(--accent\)\]:hover{border-color:var(--accent)}.hover\:bg-\[color-mix\(in_srgb\,var\(--danger-soft\)_88\%\,black_12\%\)\]:hover{background-color:var(--danger-soft)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[color-mix\(in_srgb\,var\(--danger-soft\)_88\%\,black_12\%\)\]:hover{background-color:color-mix(in srgb,var(--danger-soft) 88%,black 12%)}}.hover\:bg-\[var\(--accent\)\]:hover{background-color:var(--accent)}.hover\:bg-\[var\(--accent-hover\)\]:hover{background-color:var(--accent-hover)}.hover\:bg-\[var\(--accent-soft\)\]:hover{background-color:var(--accent-soft)}.hover\:bg-\[var\(--surface-card\)\]:hover{background-color:var(--surface-card)}.hover\:bg-\[var\(--surface-elevated\)\]:hover,.hover\:bg-\[var\(--surface-elevated\)\]\/65:hover{background-color:var(--surface-elevated)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[var\(--surface-elevated\)\]\/65:hover{background-color:color-mix(in oklab,var(--surface-elevated) 65%,transparent)}}.hover\:bg-\[var\(--surface-hover\)\]\/60:hover{background-color:var(--surface-hover)}@supports (color:color-mix(in lab,red,red)){.hover\:bg-\[var\(--surface-hover\)\]\/60:hover{background-color:color-mix(in oklab,var(--surface-hover) 60%,transparent)}}.hover\:bg-\[var\(--surface-strong\)\]:hover{background-color:var(--surface-strong)}.hover\:text-\[var\(--accent\)\]:hover{color:var(--accent)}.hover\:text-\[var\(--text\)\]:hover{color:var(--text)}.hover\:text-white:hover{color:var(--color-white)}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-90:hover{opacity:.9}}.focus-visible\:bg-\[var\(--surface-hover\)\]\/60:focus-visible{background-color:var(--surface-hover)}@supports (color:color-mix(in lab,red,red)){.focus-visible\:bg-\[var\(--surface-hover\)\]\/60:focus-visible{background-color:color-mix(in oklab,var(--surface-hover) 60%,transparent)}}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-visible\:ring-\[var\(--accent\)\]:focus-visible{--tw-ring-color:var(--accent)}.focus-visible\:ring-offset-1:focus-visible{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:ring-offset-2:focus-visible{--tw-ring-offset-width:2px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:ring-offset-\[var\(--surface\)\]:focus-visible{--tw-ring-offset-color:var(--surface)}.focus-visible\:outline-none:focus-visible{--tw-outline-style:none;outline-style:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:cursor-wait:disabled{cursor:wait}.disabled\:opacity-60:disabled{opacity:.6}@media(prefers-reduced-motion:reduce){.motion-reduce\:transition-none{transition-property:none}}@media(min-width:40rem){.sm\:ml-4{margin-left:calc(var(--spacing) * 4)}.sm\:flex{display:flex}.sm\:hidden{display:none}.sm\:inline{display:inline}.sm\:inline-block{display:inline-block}.sm\:h-4{height:calc(var(--spacing) * 4)}.sm\:h-8{height:calc(var(--spacing) * 8)}.sm\:h-9{height:calc(var(--spacing) * 9)}.sm\:min-h-8{min-height:calc(var(--spacing) * 8)}.sm\:min-h-9{min-height:calc(var(--spacing) * 9)}.sm\:min-h-11{min-height:calc(var(--spacing) * 11)}.sm\:w-4{width:calc(var(--spacing) * 4)}.sm\:w-9{width:calc(var(--spacing) * 9)}.sm\:w-auto{width:auto}.sm\:max-w-full{max-width:100%}.sm\:flex-1{flex:1}.sm\:shrink-0{flex-shrink:0}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:items-start{align-items:flex-start}.sm\:justify-between{justify-content:space-between}.sm\:gap-2{gap:calc(var(--spacing) * 2)}.sm\:gap-2\.5{gap:calc(var(--spacing) * 2.5)}.sm\:gap-3{gap:calc(var(--spacing) * 3)}.sm\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.sm\:rounded-\[10px\]{border-radius:10px}.sm\:rounded-\[12px\]{border-radius:12px}.sm\:rounded-\[14px\]{border-radius:14px}.sm\:p-4{padding:calc(var(--spacing) * 4)}.sm\:px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.sm\:px-3{padding-inline:calc(var(--spacing) * 3)}.sm\:px-4{padding-inline:calc(var(--spacing) * 4)}.sm\:py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.sm\:py-2{padding-block:calc(var(--spacing) * 2)}.sm\:py-2\.5{padding-block:calc(var(--spacing) * 2.5)}.sm\:pl-4{padding-left:calc(var(--spacing) * 4)}.sm\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.sm\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.sm\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}@media(min-width:48rem){.md\:col-span-3{grid-column:span 3/span 3}.md\:col-span-4{grid-column:span 4/span 4}.md\:block{display:block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:max-h-\[calc\(100vh-3rem\)\]{max-height:calc(100vh - 3rem)}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-\[minmax\(0\,1fr\)_200px_auto_auto\]{grid-template-columns:minmax(0,1fr) 200px auto auto}.md\:grid-cols-\[minmax\(0\,1fr\)_auto_auto\]{grid-template-columns:minmax(0,1fr) auto auto}.md\:flex-row{flex-direction:row}.md\:items-center{align-items:center}.md\:items-end{align-items:flex-end}.md\:items-start{align-items:flex-start}.md\:justify-between{justify-content:space-between}.md\:justify-end{justify-content:flex-end}.md\:gap-6{gap:calc(var(--spacing) * 6)}.md\:p-6{padding:calc(var(--spacing) * 6)}.md\:p-8{padding:calc(var(--spacing) * 8)}.md\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}}@media(min-width:64rem){.lg\:block{display:block}.lg\:contents{display:contents}.lg\:hidden{display:none}.lg\:w-auto{width:auto}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-\[minmax\(0\,1fr\)_minmax\(0\,150px\)_124px_44px_44px\]{grid-template-columns:minmax(0,1fr) minmax(0,150px) 124px 44px 44px}.lg\:grid-cols-\[minmax\(0\,1fr\)_minmax\(0\,168px\)_124px_44px_44px\]{grid-template-columns:minmax(0,1fr) minmax(0,168px) 124px 44px 44px}.lg\:items-center{align-items:center}}@media(min-width:80rem){.xl\:col-span-2{grid-column:span 2/span 2}.xl\:block{display:block}.xl\:contents{display:contents}.xl\:hidden{display:none}.xl\:w-auto{width:auto}.xl\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.xl\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.xl\:grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.xl\:grid-cols-\[minmax\(0\,1fr\)_minmax\(0\,132px\)_minmax\(0\,152px\)_124px_44px_44px\]{grid-template-columns:minmax(0,1fr) minmax(0,132px) minmax(0,152px) 124px 44px 44px}.xl\:items-center{align-items:center}}@media(prefers-color-scheme:dark){.dark\:text-amber-400{color:var(--color-amber-400)}.dark\:text-emerald-400{color:var(--color-emerald-400)}.dark\:text-rose-400{color:var(--color-rose-400)}.dark\:text-sky-400{color:var(--color-sky-400)}}.\[\&\:\:-webkit-details-marker\]\:hidden::-webkit-details-marker{display:none}.\[\&\:\:-webkit-scrollbar\]\:h-1\.5::-webkit-scrollbar{height:calc(var(--spacing) * 1.5)}}:root{--font-sans:"Inter", ui-sans-serif, system-ui, sans-serif;--font-mono:"JetBrains Mono", ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;--radius-panel:24px;--radius-card:20px;--radius-input:14px;--container-width:1180px;--surface-blur:18px;--bg-base:#f8fafc;--bg-gradient-a:#3b82f62e;--bg-gradient-b:#8b5cf629;--surface:#ffffffc2;--surface-strong:#ffffffe6;--surface-elevated:#fffffffa;--border:#94a3b838;--border-strong:#94a3b857;--text:#0f172a;--text-muted:#475569;--text-subtle:#64748b;--accent:#6366f1;--accent-soft:#6366f124;--accent-hover:#4f46e5;--danger-soft:#ef44441f;--color-entity-feature:#8b5cf6;--color-entity-phase:#06b6d4;--color-entity-task:#10b981;--shadow-panel:0 20px 60px -24px #0f172a38;--shadow-card:0 12px 30px -18px #0f172a2e;color-scheme:light}[data-theme=dark]{--bg-base:#08111f;--bg-gradient-a:#3b82f61f;--bg-gradient-b:#8b5cf624;--surface:#0f172abd;--surface-strong:#0f172ae0;--surface-elevated:#0f172af5;--border:#94a3b824;--border-strong:#94a3b847;--text:#f8fafc;--text-muted:#94a3b8;--text-subtle:#64748b;--accent:#818cf8;--accent-soft:#818cf829;--accent-hover:#6366f1;--danger-soft:#ef44442e;--color-entity-feature:#a78bfa;--color-entity-phase:#22d3ee;--color-entity-task:#34d399;--shadow-panel:0 20px 60px -24px #0009;--shadow-card:0 12px 30px -18px #0000006b;color-scheme:dark}*,:before,:after{box-sizing:border-box}html,body,#root{min-height:100%}body{font-family:var(--font-sans);color:var(--text);background-color:var(--bg-base);background-image:radial-gradient(50% 55% at 0% 0%,var(--bg-gradient-a) 0%,transparent 70%),radial-gradient(42% 48% at 100% 0%,var(--bg-gradient-b) 0%,transparent 64%);-webkit-font-smoothing:antialiased;background-attachment:fixed;margin:0;line-height:1.5}button,input,select,textarea{font:inherit}a{color:inherit;text-decoration:none}.page-shell{min-height:100vh}.page-container{width:min(100% - 3rem,var(--container-width));margin-inline:auto}.grid>*,.formatted-text{min-width:0}.formatted-text p,.formatted-text li,.formatted-text blockquote,.formatted-text a,.formatted-text code{overflow-wrap:anywhere}.surface-panel{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-panel);-webkit-backdrop-filter:blur(var(--surface-blur)) saturate(140%);box-shadow:var(--shadow-panel)}.surface-card{background:var(--surface-strong);border-radius:var(--radius-card);-webkit-backdrop-filter:blur(14px)saturate(130%);box-shadow:var(--shadow-card)}.field-control{border-radius:var(--radius-input);border:1px solid var(--border-strong);background:var(--surface-elevated);width:100%;min-height:48px;color:var(--text);outline:none;padding:.75rem .95rem}.field-control:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-soft)}.field-textarea{resize:vertical;min-height:120px}.status-chip{border:1px solid var(--border-strong);letter-spacing:.02em;text-transform:capitalize;border-radius:999px;align-items:center;gap:.35rem;padding:.25rem .65rem;font-size:.72rem;font-weight:700;display:inline-flex}.status-draft{background:#94a3b824}@supports (color:color-mix(in lab,red,red)){.status-draft{background:color-mix(in srgb,var(--color-status-draft) 14%,transparent)}}.status-draft{color:var(--color-status-draft)}.status-discovery{background:#6366f124}@supports (color:color-mix(in lab,red,red)){.status-discovery{background:color-mix(in srgb,var(--color-status-discovery) 14%,transparent)}}.status-discovery{color:var(--color-status-discovery)}.status-planned{background:#0ea5e924}@supports (color:color-mix(in lab,red,red)){.status-planned{background:color-mix(in srgb,var(--color-status-planned) 14%,transparent)}}.status-planned{color:var(--color-status-planned)}.status-in-progress{background:#f59e0b29}@supports (color:color-mix(in lab,red,red)){.status-in-progress{background:color-mix(in srgb,var(--color-status-in-progress) 16%,transparent)}}.status-in-progress{color:var(--color-status-in-progress)}.status-paused{background:#ea580c24}@supports (color:color-mix(in lab,red,red)){.status-paused{background:color-mix(in srgb,var(--color-status-paused) 14%,transparent)}}.status-paused{color:var(--color-status-paused)}.status-done{background:#22c55e29}@supports (color:color-mix(in lab,red,red)){.status-done{background:color-mix(in srgb,var(--color-status-done) 16%,transparent)}}.status-done{color:var(--color-status-done)}.status-blocked{background:#ef444426}@supports (color:color-mix(in lab,red,red)){.status-blocked{background:color-mix(in srgb,var(--color-status-blocked) 15%,transparent)}}.status-blocked{color:var(--color-status-blocked)}.status-canceled{background:#94a3b81f}@supports (color:color-mix(in lab,red,red)){.status-canceled{background:color-mix(in srgb,var(--color-status-canceled) 12%,transparent)}}.status-canceled{color:var(--color-status-canceled)}.status-rejected{background:#f43f5e1f}@supports (color:color-mix(in lab,red,red)){.status-rejected{background:color-mix(in srgb,var(--color-status-rejected) 12%,transparent)}}.status-rejected{color:var(--color-status-rejected)}.status-deferred{background:#8b5cf61f}@supports (color:color-mix(in lab,red,red)){.status-deferred{background:color-mix(in srgb,var(--color-status-deferred) 12%,transparent)}}.status-deferred{color:var(--color-status-deferred)}.status-waiting{background:#64748b1f}@supports (color:color-mix(in lab,red,red)){.status-waiting{background:color-mix(in srgb,var(--color-status-waiting) 12%,transparent)}}.status-waiting{color:var(--color-status-waiting)}.status-started{background:#6366f11a}@supports (color:color-mix(in lab,red,red)){.status-started{background:color-mix(in srgb,var(--color-status-started) 10%,transparent)}}.status-started{color:var(--color-status-started)}.status-closed{background:#0d94881f}@supports (color:color-mix(in lab,red,red)){.status-closed{background:color-mix(in srgb,var(--color-status-closed) 12%,transparent)}}.status-closed{color:var(--color-status-closed)}.status-pattern-dashed{border-style:dashed;border-color:#6366f1b3}@supports (color:color-mix(in lab,red,red)){.status-pattern-dashed{border-color:color-mix(in srgb,var(--color-status-started) 70%,transparent)}}.status-pattern-dashed-planned{border-style:dashed;border-color:#0ea5e9a6}@supports (color:color-mix(in lab,red,red)){.status-pattern-dashed-planned{border-color:color-mix(in srgb,var(--color-status-planned) 65%,transparent)}}.status-pattern-dashed-started{border-style:dashed;border-color:#6366f1b3}@supports (color:color-mix(in lab,red,red)){.status-pattern-dashed-started{border-color:color-mix(in srgb,var(--color-status-started) 70%,transparent)}}.status-pattern-dashed-paused{border-style:dashed;border-color:#ea580cb3}@supports (color:color-mix(in lab,red,red)){.status-pattern-dashed-paused{border-color:color-mix(in srgb,var(--color-status-paused) 70%,transparent)}}.status-pattern-dashed-waiting{border-style:dashed;border-color:#64748bb3}@supports (color:color-mix(in lab,red,red)){.status-pattern-dashed-waiting{border-color:color-mix(in srgb,var(--color-status-waiting) 70%,transparent)}}.status-pattern-dashed-deferred{border-style:dashed;border-color:#8b5cf6b3}@supports (color:color-mix(in lab,red,red)){.status-pattern-dashed-deferred{border-color:color-mix(in srgb,var(--color-status-deferred) 70%,transparent)}}@keyframes ap-status-pulse{0%,to{box-shadow:0 0 color-mix(in srgb,var(--color-status-in-progress) 40%,transparent)}50%{box-shadow:0 0 0 3px color-mix(in srgb,var(--color-status-in-progress) 12%,transparent)}}.status-pattern-pulse{animation:2s ease-in-out infinite ap-status-pulse}.status-pattern-stripe{background-image:repeating-linear-gradient(135deg,#0000 0,#0000 10px,#0d948814 10px,#0d948814 20px)}@supports (color:color-mix(in lab,red,red)){.status-pattern-stripe{background-image:repeating-linear-gradient(135deg,transparent 0 10px,color-mix(in srgb,var(--color-status-closed) 8%,transparent) 10px 20px)}}.status-pattern-hatch{background-image:repeating-linear-gradient(45deg,#0000 0,#0000 8px,#94a3b814 8px,#94a3b814 16px)}@supports (color:color-mix(in lab,red,red)){.status-pattern-hatch{background-image:repeating-linear-gradient(45deg,transparent 0 8px,color-mix(in srgb,var(--color-status-canceled) 8%,transparent) 8px 16px)}}.status-pattern-crosshatch{background-image:repeating-linear-gradient(45deg,#0000 0,#0000 4px,#f43f5e14 4px,#f43f5e14 8px),repeating-linear-gradient(-45deg,#0000 0,#0000 4px,#f43f5e14 4px,#f43f5e14 8px)}@supports (color:color-mix(in lab,red,red)){.status-pattern-crosshatch{background-image:repeating-linear-gradient(45deg,transparent 0 4px,color-mix(in srgb,var(--color-status-rejected) 8%,transparent) 4px 8px),repeating-linear-gradient(-45deg,transparent 0 4px,color-mix(in srgb,var(--color-status-rejected) 8%,transparent) 4px 8px)}}@media(prefers-reduced-motion:reduce){.status-pattern-pulse{animation:none}}.plan-description{background:var(--surface-elevated);border-left:3px solid var(--accent)}@supports (color:color-mix(in lab,red,red)){.plan-description{border-left:3px solid color-mix(in srgb,var(--accent) 55%,transparent)}}.plan-description{border-radius:var(--radius-card);color:var(--text);padding:.85rem 1rem}.plan-description p{margin:0}.entity-badge{border:1px solid var(--border-strong);letter-spacing:.03em;text-transform:uppercase;border-radius:999px;align-items:center;gap:.4rem;padding:.3rem .7rem;font-size:.72rem;font-weight:800;display:inline-flex}.entity-badge--feature{color:var(--color-entity-feature);background:var(--color-entity-feature)}@supports (color:color-mix(in lab,red,red)){.entity-badge--feature{background:color-mix(in srgb,var(--color-entity-feature) 14%,transparent)}}.entity-badge--phase{color:var(--color-entity-phase);background:var(--color-entity-phase)}@supports (color:color-mix(in lab,red,red)){.entity-badge--phase{background:color-mix(in srgb,var(--color-entity-phase) 14%,transparent)}}.entity-badge--task{color:var(--color-entity-task);background:var(--color-entity-task)}@supports (color:color-mix(in lab,red,red)){.entity-badge--task{background:color-mix(in srgb,var(--color-entity-task) 14%,transparent)}}.entity-badge--requirement{color:var(--accent);background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.entity-badge--requirement{background:color-mix(in srgb,var(--accent) 14%,transparent)}}.entity-link--feature{color:var(--color-entity-feature)}.entity-link--phase{color:var(--color-entity-phase)}.entity-link--task{color:var(--color-entity-task)}.entity-path-badge{border:1px solid var(--border-strong);background:var(--surface-elevated);font-variant-numeric:tabular-nums;border-radius:7px;align-items:stretch;line-height:1;display:inline-flex;overflow:hidden}.entity-path-seg{letter-spacing:.02em;align-items:center;padding:.24rem .5rem;font-size:.72rem;font-weight:800;display:inline-flex}.entity-path-seg--feature{color:var(--color-entity-feature);background:var(--color-entity-feature)}@supports (color:color-mix(in lab,red,red)){.entity-path-seg--feature{background:color-mix(in srgb,var(--color-entity-feature) 14%,transparent)}}.entity-path-seg--phase{color:var(--color-entity-phase);background:var(--color-entity-phase)}@supports (color:color-mix(in lab,red,red)){.entity-path-seg--phase{background:color-mix(in srgb,var(--color-entity-phase) 14%,transparent)}}.entity-path-seg--task{color:var(--color-entity-task);background:var(--color-entity-task)}@supports (color:color-mix(in lab,red,red)){.entity-path-seg--task{background:color-mix(in srgb,var(--color-entity-task) 14%,transparent)}}.entity-path-seg--link{cursor:pointer;text-decoration:none;transition:filter .15s,transform 50ms}.entity-path-seg--link:hover{filter:brightness(1.15)}.entity-path-seg--link:active{transform:translateY(1px)}.entity-path-seg--link:focus-visible{outline:2px solid var(--accent);outline-offset:-2px}.entity-path-sep{color:var(--text-subtle);align-items:center;padding-inline:.2rem;font-size:.72rem;font-weight:700;display:inline-flex}.copyable-id{-webkit-appearance:none;-moz-appearance:none;appearance:none;cursor:pointer;font:inherit;color:inherit;background:0 0;border:none;border-radius:8px;padding:0}.copyable-id:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.copyable-id__icon{opacity:.4;align-items:center;transition:opacity .15s;display:inline-flex}.copyable-id:hover .copyable-id__icon,.copyable-id:focus-visible .copyable-id__icon{opacity:1}.handoff-badge{border:1px solid var(--border);background:var(--surface-card);color:var(--text-muted);border-radius:9999px;align-items:center;gap:.25rem;padding:.125rem .5rem;font-size:.6875rem;line-height:1.1;text-decoration:none;transition:background .15s,color .15s,border-color .15s;display:inline-flex}.handoff-badge:hover{background:var(--surface-elevated);color:var(--text);border-color:var(--accent)}.handoff-badge svg{flex:none}.handoff-badge__label{white-space:nowrap;font-weight:500}@media(max-width:640px){:root{font-size:106.25%}}.btn-primary{background:var(--accent);color:#fff}.btn-primary:hover{background:var(--accent-hover)}button:disabled,select:disabled,input:disabled,textarea:disabled{cursor:not-allowed;opacity:.6}::-webkit-scrollbar{width:8px}::-webkit-scrollbar-thumb{background:var(--border-strong);border-radius:999px}@keyframes ap-progress-glow{0%,to{box-shadow:0 0 color-mix(in srgb,var(--color-status-in-progress) 0%,transparent)}50%{box-shadow:0 0 18px -2px color-mix(in srgb,var(--color-status-in-progress) 28%,transparent)}}.ap-in-progress{background:#f59e0b12;animation:2.6s ease-in-out infinite ap-progress-glow}@supports (color:color-mix(in lab,red,red)){.ap-in-progress{background:color-mix(in srgb,var(--color-status-in-progress) 7%,transparent)}}@keyframes ap-dot-ping{0%{opacity:.85;transform:scale(1)}75%,to{opacity:0;transform:scale(2.6)}}.status-item{border-radius:10px;position:relative;overflow:hidden}.ap-progress-dot{flex:none;width:9px;height:9px;margin-inline:6px;display:inline-block;position:relative;overflow:visible}.ap-progress-dot:before{content:"";background:var(--color-status-in-progress);border-radius:999px;position:absolute;top:0;right:0;bottom:0;left:0;box-shadow:0 0 8px #f59e0bb3}@supports (color:color-mix(in lab,red,red)){.ap-progress-dot:before{box-shadow:0 0 8px color-mix(in srgb,var(--color-status-in-progress) 70%,transparent)}}.ap-progress-dot:after{content:"";background:var(--color-status-in-progress);transform-origin:50%;border-radius:999px;animation:1.9s cubic-bezier(0,0,.2,1) infinite ap-dot-ping;position:absolute;top:0;right:0;bottom:0;left:0}@media(prefers-reduced-motion:reduce){.ap-in-progress{animation:none}.ap-progress-dot:after{opacity:0;animation:none}}.short-id-badge{font-family:var(--font-mono,ui-monospace, monospace);letter-spacing:.04em;color:var(--text-muted);background:var(--accent);border-radius:6px;align-items:center;padding:3px 6px;font-size:10.5px;font-weight:700;line-height:1;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.short-id-badge{background:color-mix(in srgb,var(--accent) 8%,transparent)}}.short-id-badge{border:1px solid var(--accent)}@supports (color:color-mix(in lab,red,red)){.short-id-badge{border:1px solid color-mix(in srgb,var(--accent) 24%,transparent)}}.short-id-badge{font-variant-numeric:tabular-nums}.drag-handle{width:28px;height:28px;color:var(--text-subtle);cursor:grab;touch-action:none;opacity:.6;background:0 0;border:1px solid #0000;border-radius:6px;flex:none;justify-content:center;align-items:center;transition:opacity .12s,background .12s,color .12s,border-color .12s;display:inline-flex}.drag-handle:hover,.drag-handle:focus-visible{opacity:1;background:var(--surface-elevated);color:var(--text);border-color:var(--border)}.drag-handle:active{cursor:grabbing}.ap-sortable--dragging{opacity:.55;outline:2px solid var(--accent)}@supports (color:color-mix(in lab,red,red)){.ap-sortable--dragging{outline:2px solid color-mix(in srgb,var(--accent) 55%,transparent)}}.ap-sortable--dragging{outline-offset:2px;border-radius:12px}.ap-drag-overlay{border:1px solid var(--accent);box-shadow:0 12px 32px -8px #0006}@supports (color:color-mix(in lab,red,red)){.ap-drag-overlay{border:1px solid color-mix(in srgb,var(--accent) 45%,transparent)}}.ap-drag-overlay{cursor:grabbing;background:var(--surface-elevated);border-radius:12px}.search-bar .ei-placeholder{padding:0 12px}.ap-search-sticky{z-index:20;background:var(--surface-elevated);-webkit-backdrop-filter:saturate(180%)blur(10px);border-bottom:1px solid var(--border);margin-bottom:.75rem;padding-bottom:.5rem;position:sticky;top:0}.status-card-stepper{flex-wrap:wrap;align-items:center;gap:.15rem;min-width:0;display:flex}.status-card{border:1px solid var(--border-strong);background:var(--surface);opacity:.75;border-radius:.5rem;align-items:center;gap:.3rem;min-width:0;padding:.3rem .5rem;display:inline-flex}.status-card.status-card-current{opacity:1;border-width:2px;box-shadow:0 0 0 1px}@supports (color:color-mix(in lab,red,red)){.status-card.status-card-current{box-shadow:0 0 0 1px color-mix(in srgb,currentColor 35%,transparent)}}.status-card-icon{flex-shrink:0;width:.9rem;height:.9rem}.status-card-label{text-transform:capitalize;white-space:nowrap;font-size:.7rem;font-weight:700}.status-card-time{opacity:.8;white-space:nowrap;font-size:.62rem;font-weight:500}.status-card-time-initial{opacity:.6;font-style:italic}.status-card.status-draft,.status-card.status-discovery,.status-card.status-planned,.status-card.status-in-progress,.status-card.status-paused,.status-card.status-done,.status-card.status-blocked,.status-card.status-canceled,.status-card.status-rejected,.status-card.status-deferred,.status-card.status-waiting{background:var(--surface)}@supports (color:color-mix(in lab,red,red)){.status-card.status-draft,.status-card.status-discovery,.status-card.status-planned,.status-card.status-in-progress,.status-card.status-paused,.status-card.status-done,.status-card.status-blocked,.status-card.status-canceled,.status-card.status-rejected,.status-card.status-deferred,.status-card.status-waiting{background:color-mix(in srgb,var(--surface) 60%,transparent)}}.status-card.status-draft,.status-card.status-discovery,.status-card.status-planned,.status-card.status-in-progress,.status-card.status-paused,.status-card.status-done,.status-card.status-blocked,.status-card.status-canceled,.status-card.status-rejected,.status-card.status-deferred,.status-card.status-waiting{border-color:currentColor}@supports (color:color-mix(in lab,red,red)){.status-card.status-draft,.status-card.status-discovery,.status-card.status-planned,.status-card.status-in-progress,.status-card.status-paused,.status-card.status-done,.status-card.status-blocked,.status-card.status-canceled,.status-card.status-rejected,.status-card.status-deferred,.status-card.status-waiting{border-color:color-mix(in srgb,currentColor 40%,var(--border-strong))}}.status-card.status-in-progress{background:#f59e0b24}@supports (color:color-mix(in lab,red,red)){.status-card.status-in-progress{background:color-mix(in srgb,var(--color-status-in-progress) 14%,transparent)}}.status-card.status-in-progress{color:var(--color-status-in-progress)}.status-card.status-paused{background:#ea580c24}@supports (color:color-mix(in lab,red,red)){.status-card.status-paused{background:color-mix(in srgb,var(--color-status-paused) 14%,transparent)}}.status-card.status-paused{color:var(--color-status-paused)}.status-card.status-done{background:#22c55e29}@supports (color:color-mix(in lab,red,red)){.status-card.status-done{background:color-mix(in srgb,var(--color-status-done) 16%,transparent)}}.status-card.status-done{color:var(--color-status-done)}.status-card.status-blocked{background:#ef444429}@supports (color:color-mix(in lab,red,red)){.status-card.status-blocked{background:color-mix(in srgb,var(--color-status-blocked) 16%,transparent)}}.status-card.status-blocked{color:var(--color-status-blocked)}.status-card.status-planned{background:#0ea5e924}@supports (color:color-mix(in lab,red,red)){.status-card.status-planned{background:color-mix(in srgb,var(--color-status-planned) 14%,transparent)}}.status-card.status-planned{color:var(--color-status-planned)}.status-card.status-draft{background:#94a3b824}@supports (color:color-mix(in lab,red,red)){.status-card.status-draft{background:color-mix(in srgb,var(--color-status-draft) 14%,transparent)}}.status-card.status-draft{color:var(--color-status-draft)}.status-card.status-discovery{background:#6366f124}@supports (color:color-mix(in lab,red,red)){.status-card.status-discovery{background:color-mix(in srgb,var(--color-status-discovery) 14%,transparent)}}.status-card.status-discovery{color:var(--color-status-discovery)}.status-card.status-canceled{background:#94a3b824}@supports (color:color-mix(in lab,red,red)){.status-card.status-canceled{background:color-mix(in srgb,var(--color-status-canceled) 14%,transparent)}}.status-card.status-canceled{color:var(--color-status-canceled)}.status-card.status-rejected{background:#f43f5e24}@supports (color:color-mix(in lab,red,red)){.status-card.status-rejected{background:color-mix(in srgb,var(--color-status-rejected) 14%,transparent)}}.status-card.status-rejected{color:var(--color-status-rejected)}.status-card.status-deferred{background:#8b5cf624}@supports (color:color-mix(in lab,red,red)){.status-card.status-deferred{background:color-mix(in srgb,var(--color-status-deferred) 14%,transparent)}}.status-card.status-deferred{color:var(--color-status-deferred)}.status-card.status-waiting{background:#64748b24}@supports (color:color-mix(in lab,red,red)){.status-card.status-waiting{background:color-mix(in srgb,var(--color-status-waiting) 14%,transparent)}}.status-card.status-waiting{color:var(--color-status-waiting)}.status-card.status-card-future{opacity:.55;border-style:dashed!important;border-color:var(--border-strong)!important;color:var(--text-subtle)!important;background:0 0!important}.status-card.status-card-future .status-card-icon{opacity:.6}.status-stepper{align-items:flex-start;gap:0;padding:.9rem 1rem .7rem;display:flex;overflow-x:auto}.status-step{flex-direction:column;flex:1 1 0;align-items:center;gap:.45rem;min-width:5.5rem;display:flex;position:relative}.status-step-label{text-align:center;white-space:nowrap;letter-spacing:.01em;font-size:.68rem;font-weight:700;line-height:1.25}.status-step-date{font-variant-numeric:tabular-nums;color:var(--text-subtle);text-align:center;white-space:nowrap;margin-top:.1rem;font-size:.58rem;line-height:1.2}.status-step--current .status-step-date{color:var(--text-muted)}.status-node{z-index:1;border-radius:9999px;flex-shrink:0;place-items:center;width:2rem;height:2rem;transition:background .2s,box-shadow .2s,border-color .2s;display:grid;position:relative}.status-node-icon{width:1rem;height:1rem}.status-step--completed .status-node{border:2px solid var(--step-color);background:0 0}@supports (color:color-mix(in lab,red,red)){.status-step--completed .status-node{border:2px solid color-mix(in srgb,var(--step-color) 45%,transparent)}}.status-step--completed .status-node{color:var(--step-color)}@supports (color:color-mix(in lab,red,red)){.status-step--completed .status-node{color:color-mix(in srgb,var(--step-color) 70%,var(--text))}}.status-step--completed .status-step-label{color:var(--step-color)}@supports (color:color-mix(in lab,red,red)){.status-step--completed .status-step-label{color:color-mix(in srgb,var(--step-color) 70%,var(--text))}}.status-step--current .status-node{border:2px solid var(--step-color);color:var(--step-color);box-shadow:0 0 0 4px var(--step-color);background:0 0}@supports (color:color-mix(in lab,red,red)){.status-step--current .status-node{box-shadow:0 0 0 4px color-mix(in srgb,var(--step-color) 16%,transparent)}}.status-step--current .status-step-label{color:var(--text);font-weight:800}.status-step--pending .status-node{background:var(--surface);border:2px dashed var(--border-strong);color:var(--step-color)}@supports (color:color-mix(in lab,red,red)){.status-step--pending .status-node{color:color-mix(in srgb,var(--step-color) 45%,var(--text-subtle))}}.status-step--pending .status-step-label{color:var(--text-subtle)}.status-connector{z-index:0;width:calc(100% - 2rem);height:2px;position:absolute;top:1rem;left:calc(1rem - 50%);transform:translateY(-1px)}.status-connector--traveled{background:var(--step-color)}@supports (color:color-mix(in lab,red,red)){.status-connector--traveled{background:color-mix(in srgb,var(--step-color) 50%,transparent)}}.status-connector--pending{background:repeating-linear-gradient(90deg,var(--border-strong) 0 5px,transparent 5px 10px)}@media(max-width:640px){.status-step{min-width:4.2rem}.status-step-label{font-size:.62rem}.status-node{width:1.7rem;height:1.7rem}.status-node-icon{width:.85rem;height:.85rem}.status-connector{width:calc(100% - 1.7rem);top:.85rem;left:calc(.85rem - 50%)}}.checklist-num{background:var(--text-subtle);border-radius:.3rem;justify-content:center;align-items:center;min-width:1.6rem;padding:.05rem .3rem;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.checklist-num{background:color-mix(in srgb,var(--text-subtle) 12%,transparent)}}.checklist-num{color:var(--text-subtle);font-variant-numeric:tabular-nums;letter-spacing:.02em;text-transform:uppercase;margin-right:.15rem;font-size:.62rem;font-weight:800}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{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-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@keyframes pulse{50%{opacity:.5}}