claude-code-session-manager 0.35.11 → 0.35.14
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.
- package/dist/assets/{TiptapBody-VPI1MjII.js → TiptapBody-o1hQcwtq.js} +1 -1
- package/dist/assets/index-B39Qiq0n.css +32 -0
- package/dist/assets/{index-CEht6zJc.js → index-DqWSSMkp.js} +463 -463
- package/dist/index.html +2 -2
- package/package.json +1 -1
- package/src/main/__tests__/browserAgentServer.test.cjs +186 -0
- package/src/main/__tests__/scheduler-autofix-select.test.cjs +45 -0
- package/src/main/browserAgentServer.cjs +202 -0
- package/src/main/browserView.cjs +197 -1
- package/src/main/index.cjs +11 -0
- package/src/main/lib/__tests__/browserAgentActions.test.cjs +76 -0
- package/src/main/lib/browserAgentActions.cjs +114 -0
- package/src/main/lib/schedulerBatch.cjs +40 -33
- package/src/main/scheduler.cjs +137 -38
- package/src/preload/api.d.ts +8 -2
- package/dist/assets/index-C7NyYuXu.css +0 -32
package/src/main/scheduler.cjs
CHANGED
|
@@ -1525,6 +1525,8 @@ async function spawnJob(job, runId, runDir, defaultCwd) {
|
|
|
1525
1525
|
|
|
1526
1526
|
let actuallyFailed = false;
|
|
1527
1527
|
let failedJobSnapshot = null;
|
|
1528
|
+
let needsInvestigationNow = false;
|
|
1529
|
+
let investigationJobSnapshot = null;
|
|
1528
1530
|
await mutate((s) => {
|
|
1529
1531
|
const i2 = s.jobs.findIndex((x) => x.slug === job.slug);
|
|
1530
1532
|
if (i2 >= 0) {
|
|
@@ -1574,6 +1576,30 @@ async function spawnJob(job, runId, runDir, defaultCwd) {
|
|
|
1574
1576
|
if (effectiveStatus === 'failed') {
|
|
1575
1577
|
actuallyFailed = true;
|
|
1576
1578
|
failedJobSnapshot = { ...s.jobs[i2] };
|
|
1579
|
+
} else if (effectiveStatus === 'needs_review') {
|
|
1580
|
+
// Same-tick auto-fix (feedback 2026-07-12): rather than waiting up to
|
|
1581
|
+
// 10 min for reverifyNeedsReview()'s periodic pass, check right here
|
|
1582
|
+
// whether this job qualifies for auto-fix (same eligibility rule
|
|
1583
|
+
// reverifyNeedsReview uses via selectAutoFixTargets) and, if so, spawn
|
|
1584
|
+
// the investigation immediately. Stamp autoFixAttempted BEFORE the
|
|
1585
|
+
// investigation fires (mirrors reverifyNeedsReview's auto-fix section)
|
|
1586
|
+
// so the periodic pass 10 min later sees it already attempted and
|
|
1587
|
+
// does not spawn a duplicate.
|
|
1588
|
+
const fixSlugExists = (slug) => fs.existsSync(path.join(PRDS_DIR, `${slug}.md`));
|
|
1589
|
+
if (
|
|
1590
|
+
process.env.SM_AUTOFIX_DISABLE !== '1' &&
|
|
1591
|
+
isEligibleForImmediateAutoFix(s.jobs[i2], s.jobs, fixSlugExists)
|
|
1592
|
+
) {
|
|
1593
|
+
const isNoPlanRetry = s.jobs[i2].autoFixAttempted && s.jobs[i2].autoFixOutcome === 'no-plan';
|
|
1594
|
+
s.jobs[i2].autoFixAttempted = true;
|
|
1595
|
+
if (!s.jobs[i2].runId) s.jobs[i2].runId = runId;
|
|
1596
|
+
if (isNoPlanRetry) {
|
|
1597
|
+
s.jobs[i2].autoFixRetries = (s.jobs[i2].autoFixRetries ?? 0) + 1;
|
|
1598
|
+
delete s.jobs[i2].autoFixOutcome;
|
|
1599
|
+
}
|
|
1600
|
+
needsInvestigationNow = true;
|
|
1601
|
+
investigationJobSnapshot = { ...s.jobs[i2] };
|
|
1602
|
+
}
|
|
1577
1603
|
}
|
|
1578
1604
|
// Auto-promote: when a fix-* PRD completes successfully, the original
|
|
1579
1605
|
// failed PRD's work is logically done. Flip its status to 'completed'
|
|
@@ -1632,6 +1658,11 @@ async function spawnJob(job, runId, runDir, defaultCwd) {
|
|
|
1632
1658
|
console.error('[scheduler] spawnInvestigation error', job.slug, e);
|
|
1633
1659
|
});
|
|
1634
1660
|
}
|
|
1661
|
+
} else if (needsInvestigationNow && investigationJobSnapshot) {
|
|
1662
|
+
console.log(`[scheduler] needs_review ${job.slug} → immediate auto-fix investigation (not waiting for periodic reverify)`);
|
|
1663
|
+
spawnInvestigation(investigationJobSnapshot, runDir).catch((e) => {
|
|
1664
|
+
console.error('[scheduler] spawnInvestigation error', job.slug, e);
|
|
1665
|
+
});
|
|
1635
1666
|
}
|
|
1636
1667
|
} catch (e) {
|
|
1637
1668
|
console.error('[scheduler] spawnJob error', job.slug, e);
|
|
@@ -1652,20 +1683,21 @@ function tickQueue() {
|
|
|
1652
1683
|
const state = await readQueue();
|
|
1653
1684
|
if (state.paused) {
|
|
1654
1685
|
console.log('[scheduler] tickQueue skipped: paused');
|
|
1655
|
-
return;
|
|
1686
|
+
return { fired: false, reason: 'paused' };
|
|
1656
1687
|
}
|
|
1657
|
-
if (cancelToken.cancelled) return;
|
|
1688
|
+
if (cancelToken.cancelled) return { fired: false, reason: 'cancelled' };
|
|
1658
1689
|
|
|
1659
1690
|
await reconcile(state);
|
|
1660
1691
|
const cap = ENV_CAP ?? state.config.concurrencyCap;
|
|
1661
|
-
const batch = pickNextBatch(state.jobs, runningSet, cap);
|
|
1692
|
+
const { batch, reason: holdReason } = pickNextBatch(state.jobs, runningSet, cap);
|
|
1662
1693
|
if (batch.length === 0) {
|
|
1663
1694
|
// Queue drained — run the definition-of-done gate fire-and-forget.
|
|
1664
1695
|
// Non-blocking: does not hold the mutate lock; errors are logged, not thrown.
|
|
1665
1696
|
runDefinitionOfDoneOnDrain(state, { cancelToken }).catch((err) => {
|
|
1666
1697
|
console.log(`[scheduler] dod-drain: ${err?.message ?? String(err)}`);
|
|
1667
1698
|
});
|
|
1668
|
-
return;
|
|
1699
|
+
if (holdReason) return { fired: false, reason: 'held', detail: holdReason };
|
|
1700
|
+
return { fired: false, reason: 'drained' };
|
|
1669
1701
|
}
|
|
1670
1702
|
|
|
1671
1703
|
const availableMb = getAvailableMemMb();
|
|
@@ -1678,7 +1710,7 @@ function tickQueue() {
|
|
|
1678
1710
|
const threshold = RESERVED_HOST_MB + MIN_FREE_MB_PER_JOB * (runningSet.size + 1);
|
|
1679
1711
|
console.log(`[scheduler] memory gate: available=${availableMb} MB < threshold=${threshold} MB (host reserve ${RESERVED_HOST_MB} + ${MIN_FREE_MB_PER_JOB}/job × ${runningSet.size + 1}) — deferring ${batch.length} job(s)`);
|
|
1680
1712
|
lastMemGate = { availableMb, threshold, deferred: true, at: new Date().toISOString() };
|
|
1681
|
-
return;
|
|
1713
|
+
return { fired: false, reason: 'memory-deferred', deferredCount: batch.length, availableMb, threshold };
|
|
1682
1714
|
}
|
|
1683
1715
|
const gatedBatch = batch.slice(0, allowed);
|
|
1684
1716
|
if (gatedBatch.length < batch.length) {
|
|
@@ -1699,22 +1731,50 @@ function tickQueue() {
|
|
|
1699
1731
|
// spawnJob is fire-and-forget; it calls tickQueue() on completion.
|
|
1700
1732
|
spawnJob(job, runId, runDir, state.config.defaultCwd).catch(() => {});
|
|
1701
1733
|
}
|
|
1734
|
+
return { fired: true, count: gatedBatch.length, group: gatedBatch[0]?.parallelGroup };
|
|
1702
1735
|
});
|
|
1703
1736
|
tickTail = next.catch(() => {});
|
|
1704
1737
|
return next;
|
|
1705
1738
|
}
|
|
1706
1739
|
|
|
1740
|
+
// Translates a tickQueue()/runDueJobs() outcome descriptor into a renderer-facing
|
|
1741
|
+
// ActionOutcome for the schedule:force-tick IPC handler.
|
|
1742
|
+
function forceTickOutcome(result) {
|
|
1743
|
+
if (!result) return { ok: true, kind: 'info', message: 'No pending jobs' };
|
|
1744
|
+
if (result.fired) {
|
|
1745
|
+
const groupSuffix = result.group !== undefined ? ` (group g${result.group})` : '';
|
|
1746
|
+
return { ok: true, kind: 'info', message: `Fired ${result.count} job(s)${groupSuffix}` };
|
|
1747
|
+
}
|
|
1748
|
+
switch (result.reason) {
|
|
1749
|
+
case 'drained':
|
|
1750
|
+
return { ok: true, kind: 'info', message: 'No pending jobs' };
|
|
1751
|
+
case 'paused':
|
|
1752
|
+
return { ok: true, kind: 'warn', message: 'Scheduler is paused' };
|
|
1753
|
+
case 'cancelled':
|
|
1754
|
+
return { ok: true, kind: 'warn', message: 'Batch cancelled — try again' };
|
|
1755
|
+
case 'memory-deferred':
|
|
1756
|
+
return { ok: true, kind: 'warn', message: `Deferred ${result.deferredCount} job(s) — low memory (${result.availableMb} MB available, need ${result.threshold} MB)` };
|
|
1757
|
+
case 'held': {
|
|
1758
|
+
const detail = String(result.detail ?? '').replace(/^\[scheduler\]\s*[\w-]+\s*(?:\[[^\]]*\])?:\s*/, '');
|
|
1759
|
+
return { ok: true, kind: 'warn', message: detail || 'Batch held' };
|
|
1760
|
+
}
|
|
1761
|
+
default:
|
|
1762
|
+
return { ok: true, kind: 'info', message: 'No pending jobs' };
|
|
1763
|
+
}
|
|
1764
|
+
}
|
|
1765
|
+
|
|
1707
1766
|
async function runDueJobs() {
|
|
1708
1767
|
const state = await readQueue();
|
|
1709
1768
|
if (state.paused) {
|
|
1710
1769
|
console.log('[scheduler] runDueJobs skipped: paused');
|
|
1711
|
-
return;
|
|
1770
|
+
return { fired: false, reason: 'paused' };
|
|
1712
1771
|
}
|
|
1713
1772
|
cancelToken = { cancelled: false };
|
|
1714
|
-
await tickQueue();
|
|
1773
|
+
const result = await tickQueue();
|
|
1715
1774
|
// Clear the one-shot scheduledFor without waiting for jobs to settle.
|
|
1716
1775
|
await mutate((s) => { s.scheduledFor = null; });
|
|
1717
1776
|
await broadcast();
|
|
1777
|
+
return result;
|
|
1718
1778
|
}
|
|
1719
1779
|
|
|
1720
1780
|
// ---------- when-available launch logic ----------
|
|
@@ -2067,6 +2127,24 @@ function selectAutoFixTargets(jobs, { fixSlugExists, resolveJobRunId = resolveRu
|
|
|
2067
2127
|
});
|
|
2068
2128
|
}
|
|
2069
2129
|
|
|
2130
|
+
/**
|
|
2131
|
+
* Pure helper — no I/O by default (fixSlugExists is injectable). Answers
|
|
2132
|
+
* "does this single needs_review job qualify for an auto-fix investigation
|
|
2133
|
+
* right now?" by delegating to selectAutoFixTargets's eligibility rules
|
|
2134
|
+
* (same-1-attempt cap, depth cap, no fix sibling) against the full job list,
|
|
2135
|
+
* then checking whether this job is among the returned targets. Shared by
|
|
2136
|
+
* spawnJob's immediate same-tick path and (indirectly, via
|
|
2137
|
+
* selectAutoFixTargets itself) reverifyNeedsReview's periodic path, so both
|
|
2138
|
+
* use one eligibility definition rather than two divergent copies.
|
|
2139
|
+
*/
|
|
2140
|
+
function isEligibleForImmediateAutoFix(job, allJobs, fixSlugExists) {
|
|
2141
|
+
const targets = selectAutoFixTargets(allJobs, {
|
|
2142
|
+
fixSlugExists,
|
|
2143
|
+
resolveJobRunId: () => job.runId,
|
|
2144
|
+
});
|
|
2145
|
+
return targets.some((t) => t.slug === job.slug);
|
|
2146
|
+
}
|
|
2147
|
+
|
|
2070
2148
|
async function reverifyNeedsReview() {
|
|
2071
2149
|
const snap = await readQueue();
|
|
2072
2150
|
const candidates = snap.jobs.filter(isRescanCandidate);
|
|
@@ -2098,7 +2176,6 @@ async function reverifyNeedsReview() {
|
|
|
2098
2176
|
}
|
|
2099
2177
|
if (healed.length) {
|
|
2100
2178
|
const healSet = new Set(healed);
|
|
2101
|
-
const promoted = [];
|
|
2102
2179
|
await mutate((s) => {
|
|
2103
2180
|
for (const j of s.jobs) {
|
|
2104
2181
|
if (j.status === 'needs_review' && healSet.has(j.slug)) {
|
|
@@ -2107,32 +2184,8 @@ async function reverifyNeedsReview() {
|
|
|
2107
2184
|
delete j.verifierVerdict;
|
|
2108
2185
|
}
|
|
2109
2186
|
}
|
|
2110
|
-
// Mirror the live-completion auto-promote (spawnJob, ~line 1583): a
|
|
2111
|
-
// healed fix-plan job means its original's work is logically done too.
|
|
2112
|
-
// Without this, a job healed here (boot/periodic reverify) never
|
|
2113
|
-
// releases its original from needs_review — only a fix-plan job that
|
|
2114
|
-
// completes during a live run gets promoted, leaving the boot-heal
|
|
2115
|
-
// path unable to fully resolve the fix-plan lineages it just healed
|
|
2116
|
-
// (2026-07-12: 521-fix-*/523-fix-* healed but their originals stayed
|
|
2117
|
-
// stuck needs_review).
|
|
2118
|
-
for (const slug of healed) {
|
|
2119
|
-
if (!isFixPlanSlug(slug)) continue;
|
|
2120
|
-
const orig = healTargetForFix(slug, s.jobs);
|
|
2121
|
-
if (orig) {
|
|
2122
|
-
const priorStatus = orig.status;
|
|
2123
|
-
orig.status = 'completed';
|
|
2124
|
-
orig.exitCode = 0;
|
|
2125
|
-
orig.error = null;
|
|
2126
|
-
orig.completedBy = slug;
|
|
2127
|
-
if (priorStatus === 'needs_review') delete orig.verifierVerdict;
|
|
2128
|
-
promoted.push(`${orig.slug} (was ${priorStatus})`);
|
|
2129
|
-
}
|
|
2130
|
-
}
|
|
2131
2187
|
});
|
|
2132
2188
|
console.log(`[scheduler] boot reverify: healed ${healed.length} stale needs_review → completed (${healed.join(', ')})`);
|
|
2133
|
-
if (promoted.length) {
|
|
2134
|
-
console.log(`[scheduler] boot reverify: auto-promoted ${promoted.length} original(s) via healed fix-plan job(s): ${promoted.join(', ')}`);
|
|
2135
|
-
}
|
|
2136
2189
|
await broadcast();
|
|
2137
2190
|
}
|
|
2138
2191
|
if (leftForReview.length) {
|
|
@@ -2140,6 +2193,38 @@ async function reverifyNeedsReview() {
|
|
|
2140
2193
|
console.log(`[scheduler] boot reverify: left for review: ${detail}`);
|
|
2141
2194
|
}
|
|
2142
2195
|
|
|
2196
|
+
// Mirror the live-completion auto-promote (spawnJob, ~line 1583): ANY
|
|
2197
|
+
// completed fix-plan job whose original is still needs_review/failed means
|
|
2198
|
+
// the original's work is logically done. Runs every pass (not just against
|
|
2199
|
+
// jobs healed THIS pass) and over ALL completed fix-plan jobs, not just
|
|
2200
|
+
// ones just-healed above — a fix-plan job healed by a PRIOR boot/periodic
|
|
2201
|
+
// pass, or completed via a live run, is just as valid a promotion source.
|
|
2202
|
+
// Idempotent: an already-promoted original has status !== 'needs_review'/
|
|
2203
|
+
// 'failed', so isPromotableOriginal excludes it on repeat passes — safe to
|
|
2204
|
+
// re-run unconditionally. (2026-07-12: 521-fix-*/523-fix-* healed on one
|
|
2205
|
+
// boot but their originals stayed stuck needs_review on every subsequent
|
|
2206
|
+
// boot/tick, because the promotion only ran inside `if (healed.length)`
|
|
2207
|
+
// scoped to that single pass's fresh heals.)
|
|
2208
|
+
const promoted = [];
|
|
2209
|
+
await mutate((s) => {
|
|
2210
|
+
for (const job of s.jobs) {
|
|
2211
|
+
if (job.status !== 'completed' || !isFixPlanSlug(job.slug)) continue;
|
|
2212
|
+
const orig = healTargetForFix(job.slug, s.jobs);
|
|
2213
|
+
if (!orig) continue;
|
|
2214
|
+
const priorStatus = orig.status;
|
|
2215
|
+
orig.status = 'completed';
|
|
2216
|
+
orig.exitCode = 0;
|
|
2217
|
+
orig.error = null;
|
|
2218
|
+
orig.completedBy = job.slug;
|
|
2219
|
+
if (priorStatus === 'needs_review') delete orig.verifierVerdict;
|
|
2220
|
+
promoted.push(`${orig.slug} (was ${priorStatus}, via ${job.slug})`);
|
|
2221
|
+
}
|
|
2222
|
+
});
|
|
2223
|
+
if (promoted.length) {
|
|
2224
|
+
console.log(`[scheduler] boot reverify: auto-promoted ${promoted.length} original(s): ${promoted.join(', ')}`);
|
|
2225
|
+
await broadcast();
|
|
2226
|
+
}
|
|
2227
|
+
|
|
2143
2228
|
// Surface needs_review jobs that can never self-heal or get an auto-fix
|
|
2144
2229
|
// investigation (no runId, no backfillable run dir) instead of leaving
|
|
2145
2230
|
// them silently stranded. Also surface no-plan auto-fix jobs whose one
|
|
@@ -2256,8 +2341,13 @@ function registerScheduleHandlers() {
|
|
|
2256
2341
|
// Bypass the billing-poll gate entirely — fire pending jobs immediately regardless of meter state.
|
|
2257
2342
|
// Clears any existing pause first (same semantics as run-now).
|
|
2258
2343
|
await clearPause('run-now');
|
|
2259
|
-
|
|
2260
|
-
|
|
2344
|
+
try {
|
|
2345
|
+
const result = await runDueJobs();
|
|
2346
|
+
return forceTickOutcome(result);
|
|
2347
|
+
} catch (e) {
|
|
2348
|
+
logs.writeLine({ level: 'error', scope: 'scheduler', message: 'runDueJobs error (force-tick)', meta: { error: e?.message } });
|
|
2349
|
+
return { ok: false, kind: 'error', message: `Failed to fire batch: ${e?.message ?? String(e)}` };
|
|
2350
|
+
}
|
|
2261
2351
|
});
|
|
2262
2352
|
|
|
2263
2353
|
// .default({}) so callers may omit the payload entirely (same as the old `partial || {}`).
|
|
@@ -2303,12 +2393,21 @@ function registerScheduleHandlers() {
|
|
|
2303
2393
|
// handler already reconciles on read, but this gives the renderer an
|
|
2304
2394
|
// explicit refresh path that also broadcasts so all views update.
|
|
2305
2395
|
ipcMain.handle('schedule:rescan', async () => {
|
|
2306
|
-
await mutate(async (state) => {
|
|
2396
|
+
const { added, removed } = await mutate(async (state) => {
|
|
2397
|
+
const before = new Set(state.jobs.map((j) => j.slug));
|
|
2307
2398
|
await reconcile(state);
|
|
2308
|
-
|
|
2399
|
+
const after = new Set(state.jobs.map((j) => j.slug));
|
|
2400
|
+
const added = [...after].filter((slug) => !before.has(slug)).length;
|
|
2401
|
+
const removed = [...before].filter((slug) => !after.has(slug)).length;
|
|
2402
|
+
return { added, removed };
|
|
2309
2403
|
});
|
|
2310
2404
|
await broadcast();
|
|
2311
|
-
|
|
2405
|
+
let message;
|
|
2406
|
+
if (added === 0 && removed === 0) message = 'Rescanned — no changes';
|
|
2407
|
+
else if (added > 0 && removed === 0) message = `Rescanned — ${added} new PRD(s) picked up`;
|
|
2408
|
+
else if (added === 0 && removed > 0) message = `Rescanned — ${removed} PRD(s) removed from disk`;
|
|
2409
|
+
else message = `Rescanned — ${added} new PRD(s) picked up, ${removed} removed from disk`;
|
|
2410
|
+
return { ok: true, kind: 'info', message };
|
|
2312
2411
|
});
|
|
2313
2412
|
|
|
2314
2413
|
// Archive every non-running PRD and drop its entry from queue.json.
|
|
@@ -2726,4 +2825,4 @@ const remote = {
|
|
|
2726
2825
|
},
|
|
2727
2826
|
};
|
|
2728
2827
|
|
|
2729
|
-
module.exports = { registerScheduleHandlers, attachWindow, init, ROOT, PRDS_DIR, selectHistoryJobs, parsePorcelain, FINISH_PROTOCOL, remote, pickNextBatch, pickForProject, reapDeadRunningJobs, pollRecoveryClearSource, memoryLimitedBatchSize, availableForJobs, reverifyNeedsReview, isRescanCandidate, isPromotableOriginal, selectAutoFixTargets, resolveRunId, isUnresolvableNeedsReview, healTargetForFix, buildInvestigationPrompt, committedInWindow, isFixPlanSlug, isFixPlanBeyondDepthCap, MAX_INVESTIGATION_DEPTH };
|
|
2828
|
+
module.exports = { registerScheduleHandlers, attachWindow, init, ROOT, PRDS_DIR, selectHistoryJobs, parsePorcelain, FINISH_PROTOCOL, remote, pickNextBatch, pickForProject, reapDeadRunningJobs, pollRecoveryClearSource, memoryLimitedBatchSize, availableForJobs, reverifyNeedsReview, isRescanCandidate, isPromotableOriginal, selectAutoFixTargets, isEligibleForImmediateAutoFix, resolveRunId, isUnresolvableNeedsReview, healTargetForFix, buildInvestigationPrompt, committedInWindow, isFixPlanSlug, isFixPlanBeyondDepthCap, MAX_INVESTIGATION_DEPTH };
|
package/src/preload/api.d.ts
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
export interface ActionOutcome {
|
|
2
|
+
ok: boolean;
|
|
3
|
+
kind?: 'info' | 'warn' | 'error';
|
|
4
|
+
message: string;
|
|
5
|
+
}
|
|
6
|
+
|
|
1
7
|
export interface SpawnResult {
|
|
2
8
|
pid: number;
|
|
3
9
|
cwd: string;
|
|
@@ -1216,10 +1222,10 @@ export interface SessionManagerAPI {
|
|
|
1216
1222
|
setConfig: (partial: Partial<ScheduleConfig & { supervisor?: Partial<SupervisorConfig> }>) => Promise<{ ok: boolean; config: ScheduleConfig }>;
|
|
1217
1223
|
resetJob: (slug: string) => Promise<{ ok: boolean; error?: string }>;
|
|
1218
1224
|
runNow: () => Promise<{ ok: boolean }>;
|
|
1219
|
-
forceTick: () => Promise<
|
|
1225
|
+
forceTick: () => Promise<ActionOutcome>;
|
|
1220
1226
|
resume: () => Promise<{ ok: boolean }>;
|
|
1221
1227
|
/** Re-scan prds/ and merge into queue.json; broadcasts updated state. */
|
|
1222
|
-
rescan: () => Promise<
|
|
1228
|
+
rescan: () => Promise<ActionOutcome>;
|
|
1223
1229
|
/** Move all pending+failed PRDs to prds-archived/<ISO>/ and drop their
|
|
1224
1230
|
* queue entries. Completed/running entries are preserved. */
|
|
1225
1231
|
clearQueue: () => Promise<{ ok: boolean; archived: number; archivedTo: string | null }>;
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Copyright (c) 2014 The xterm.js authors. All rights reserved.
|
|
3
|
-
* Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
|
|
4
|
-
* https://github.com/chjj/term.js
|
|
5
|
-
* @license MIT
|
|
6
|
-
*
|
|
7
|
-
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
8
|
-
* of this software and associated documentation files (the "Software"), to deal
|
|
9
|
-
* in the Software without restriction, including without limitation the rights
|
|
10
|
-
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
11
|
-
* copies of the Software, and to permit persons to whom the Software is
|
|
12
|
-
* furnished to do so, subject to the following conditions:
|
|
13
|
-
*
|
|
14
|
-
* The above copyright notice and this permission notice shall be included in
|
|
15
|
-
* all copies or substantial portions of the Software.
|
|
16
|
-
*
|
|
17
|
-
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
-
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
-
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
-
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
-
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
22
|
-
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
23
|
-
* THE SOFTWARE.
|
|
24
|
-
*
|
|
25
|
-
* Originally forked from (with the author's permission):
|
|
26
|
-
* Fabrice Bellard's javascript vt100 for jslinux:
|
|
27
|
-
* http://bellard.org/jslinux/
|
|
28
|
-
* Copyright (c) 2011 Fabrice Bellard
|
|
29
|
-
* The original design remains. The terminal itself
|
|
30
|
-
* has been extended to include xterm CSI codes, among
|
|
31
|
-
* other features.
|
|
32
|
-
*/.xterm{cursor:text;position:relative;-moz-user-select:none;user-select:none;-ms-user-select:none;-webkit-user-select:none}.xterm.focus,.xterm:focus{outline:none}.xterm .xterm-helpers{position:absolute;top:0;z-index:5}.xterm .xterm-helper-textarea{padding:0;border:0;margin:0;position:absolute;opacity:0;left:-9999em;top:0;width:0;height:0;z-index:-5;white-space:nowrap;overflow:hidden;resize:none}.xterm .composition-view{background:#000;color:#fff;display:none;position:absolute;white-space:nowrap;z-index:1}.xterm .composition-view.active{display:block}.xterm .xterm-viewport{background-color:#000;overflow-y:scroll;cursor:default;position:absolute;right:0;left:0;top:0;bottom:0}.xterm .xterm-screen{position:relative}.xterm .xterm-screen canvas{position:absolute;left:0;top:0}.xterm .xterm-scroll-area{visibility:hidden}.xterm-char-measure-element{display:inline-block;visibility:hidden;position:absolute;top:0;left:-9999em;line-height:normal}.xterm.enable-mouse-events{cursor:default}.xterm.xterm-cursor-pointer,.xterm .xterm-cursor-pointer{cursor:pointer}.xterm.column-select.focus{cursor:crosshair}.xterm .xterm-accessibility:not(.debug),.xterm .xterm-message{position:absolute;left:0;top:0;bottom:0;right:0;z-index:10;color:transparent;pointer-events:none}.xterm .xterm-accessibility-tree:not(.debug) *::-moz-selection{color:transparent}.xterm .xterm-accessibility-tree:not(.debug) *::selection{color:transparent}.xterm .xterm-accessibility-tree{-webkit-user-select:text;-moz-user-select:text;user-select:text;white-space:pre}.xterm .live-region{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}.xterm-dim{opacity:1!important}.xterm-underline-1{text-decoration:underline}.xterm-underline-2{-webkit-text-decoration:double underline;text-decoration:double underline}.xterm-underline-3{-webkit-text-decoration:wavy underline;text-decoration:wavy underline}.xterm-underline-4{-webkit-text-decoration:dotted underline;text-decoration:dotted underline}.xterm-underline-5{-webkit-text-decoration:dashed underline;text-decoration:dashed underline}.xterm-overline{text-decoration:overline}.xterm-overline.xterm-underline-1{text-decoration:overline underline}.xterm-overline.xterm-underline-2{-webkit-text-decoration:overline double underline;text-decoration:overline double underline}.xterm-overline.xterm-underline-3{-webkit-text-decoration:overline wavy underline;text-decoration:overline wavy underline}.xterm-overline.xterm-underline-4{-webkit-text-decoration:overline dotted underline;text-decoration:overline dotted underline}.xterm-overline.xterm-underline-5{-webkit-text-decoration:overline dashed underline;text-decoration:overline dashed underline}.xterm-strikethrough{text-decoration:line-through}.xterm-screen .xterm-decoration-container .xterm-decoration{z-index:6;position:absolute}.xterm-screen .xterm-decoration-container .xterm-decoration.xterm-decoration-top-layer{z-index:7}.xterm-decoration-overview-ruler{z-index:8;position:absolute;top:0;right:0;pointer-events:none}.xterm-decoration-top{z-index:2;position:relative}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:Geist,system-ui,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}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;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:IBM Plex Mono,JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.\!container{width:100%!important}.container{width:100%}@media(min-width:640px){.\!container{max-width:640px!important}.container{max-width:640px}}@media(min-width:768px){.\!container{max-width:768px!important}.container{max-width:768px}}@media(min-width:1024px){.\!container{max-width:1024px!important}.container{max-width:1024px}}@media(min-width:1280px){.\!container{max-width:1280px!important}.container{max-width:1280px}}@media(min-width:1536px){.\!container{max-width:1536px!important}.container{max-width:1536px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.visible{visibility:visible}.invisible{visibility:hidden}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-x-0{left:0;right:0}.-left-\[10px\]{left:-10px}.-left-\[4px\]{left:-4px}.bottom-0{bottom:0}.bottom-10{bottom:2.5rem}.bottom-2{bottom:.5rem}.bottom-3{bottom:.75rem}.bottom-4{bottom:1rem}.bottom-full{bottom:100%}.left-0{left:0}.left-1\/2{left:50%}.left-2\.5{left:.625rem}.right-0{right:0}.right-1\.5{right:.375rem}.right-11{right:2.75rem}.right-2{right:.5rem}.right-3{right:.75rem}.right-4{right:1rem}.top-0{top:0}.top-0\.5{top:.125rem}.top-1\.5{top:.375rem}.top-1\/2{top:50%}.top-10{top:2.5rem}.top-12{top:3rem}.top-2{top:.5rem}.top-3{top:.75rem}.top-9{top:2.25rem}.top-\[38px\]{top:38px}.top-full{top:100%}.top-px{top:1px}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-\[200\]{z-index:200}.z-\[300\]{z-index:300}.z-\[400\]{z-index:400}.z-\[55\]{z-index:55}.z-\[60\]{z-index:60}.col-span-2{grid-column:span 2 / span 2}.-m-1{margin:-.25rem}.m-0{margin:0}.mx-0\.5{margin-left:.125rem;margin-right:.125rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.mx-3{margin-left:.75rem;margin-right:.75rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-\[18px\]{margin-left:18px;margin-right:18px}.mx-auto{margin-left:auto;margin-right:auto}.my-1{margin-top:.25rem;margin-bottom:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.my-8{margin-top:2rem;margin-bottom:2rem}.-mb-px{margin-bottom:-1px}.mb-0{margin-bottom:0}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-2\.5{margin-bottom:.625rem}.mb-3{margin-bottom:.75rem}.mb-3\.5{margin-bottom:.875rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-7{margin-bottom:1.75rem}.mb-\[18px\]{margin-bottom:18px}.mb-\[22px\]{margin-bottom:22px}.mb-\[5px\]{margin-bottom:5px}.mb-px{margin-bottom:1px}.ml-1{margin-left:.25rem}.ml-1\.5{margin-left:.375rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-5{margin-left:1.25rem}.ml-6{margin-left:1.5rem}.ml-8{margin-left:2rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-1\.5{margin-right:.375rem}.mr-2{margin-right:.5rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-2\.5{margin-top:.625rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-\[18px\]{margin-top:18px}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.\!block{display:block!important}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.contents{display:contents}.hidden{display:none}.h-0\.5{height:.125rem}.h-1{height:.25rem}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-11{height:2.75rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-2{height:.5rem}.h-2\.5{height:.625rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-80{height:20rem}.h-9{height:2.25rem}.h-\[10px\]{height:10px}.h-\[13px\]{height:13px}.h-\[15px\]{height:15px}.h-\[18px\]{height:18px}.h-\[22px\]{height:22px}.h-\[30px\]{height:30px}.h-\[34px\]{height:34px}.h-\[38px\]{height:38px}.h-\[52px\]{height:52px}.h-\[7px\]{height:7px}.h-\[80vh\]{height:80vh}.h-\[90vh\]{height:90vh}.h-\[9px\]{height:9px}.h-full{height:100%}.max-h-24{max-height:6rem}.max-h-40{max-height:10rem}.max-h-48{max-height:12rem}.max-h-60{max-height:15rem}.max-h-64{max-height:16rem}.max-h-72{max-height:18rem}.max-h-\[60vh\]{max-height:60vh}.max-h-\[70vh\]{max-height:70vh}.max-h-\[85vh\]{max-height:85vh}.max-h-\[90vh\]{max-height:90vh}.max-h-full{max-height:100%}.min-h-0{min-height:0px}.min-h-32{min-height:8rem}.min-h-\[140px\]{min-height:140px}.min-h-\[200px\]{min-height:200px}.min-h-\[26px\]{min-height:26px}.min-h-\[60px\]{min-height:60px}.w-1{width:.25rem}.w-1\.5{width:.375rem}.w-10{width:2.5rem}.w-11{width:2.75rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-2{width:.5rem}.w-2\.5{width:.625rem}.w-2\/5{width:40%}.w-20{width:5rem}.w-24{width:6rem}.w-28{width:7rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-32{width:8rem}.w-4{width:1rem}.w-44{width:11rem}.w-48{width:12rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-60{width:15rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-72{width:18rem}.w-8{width:2rem}.w-80{width:20rem}.w-9{width:2.25rem}.w-96{width:24rem}.w-\[10px\]{width:10px}.w-\[110px\]{width:110px}.w-\[13px\]{width:13px}.w-\[15px\]{width:15px}.w-\[18px\]{width:18px}.w-\[22px\]{width:22px}.w-\[240px\]{width:240px}.w-\[280px\]{width:280px}.w-\[30px\]{width:30px}.w-\[344px\]{width:344px}.w-\[34px\]{width:34px}.w-\[38px\]{width:38px}.w-\[3px\]{width:3px}.w-\[420px\]{width:420px}.w-\[52px\]{width:52px}.w-\[600px\]{width:600px}.w-\[62px\]{width:62px}.w-\[640px\]{width:640px}.w-\[7px\]{width:7px}.w-\[840px\]{width:840px}.w-\[900px\]{width:900px}.w-\[9px\]{width:9px}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0px}.min-w-\[104px\]{min-width:104px}.min-w-\[200px\]{min-width:200px}.min-w-\[240px\]{min-width:240px}.min-w-\[280px\]{min-width:280px}.min-w-\[3\.5em\]{min-width:3.5em}.min-w-\[6rem\]{min-width:6rem}.min-w-\[7\.5rem\]{min-width:7.5rem}.min-w-\[80px\]{min-width:80px}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-\[1100px\]{max-width:1100px}.max-w-\[12rem\]{max-width:12rem}.max-w-\[16ch\]{max-width:16ch}.max-w-\[16rem\]{max-width:16rem}.max-w-\[180px\]{max-width:180px}.max-w-\[18rem\]{max-width:18rem}.max-w-\[200px\]{max-width:200px}.max-w-\[220px\]{max-width:220px}.max-w-\[22rem\]{max-width:22rem}.max-w-\[24rem\]{max-width:24rem}.max-w-\[320px\]{max-width:320px}.max-w-\[420px\]{max-width:420px}.max-w-\[440px\]{max-width:440px}.max-w-\[500px\]{max-width:500px}.max-w-\[560px\]{max-width:560px}.max-w-\[600px\]{max-width:600px}.max-w-\[620px\]{max-width:620px}.max-w-\[70\%\]{max-width:70%}.max-w-\[760px\]{max-width:760px}.max-w-\[80\%\]{max-width:80%}.max-w-\[820px\]{max-width:820px}.max-w-\[8rem\]{max-width:8rem}.max-w-\[90\%\]{max-width:90%}.max-w-\[90vw\]{max-width:90vw}.max-w-\[95vw\]{max-width:95vw}.max-w-\[calc\(100vw-1rem\)\]{max-width:calc(100vw - 1rem)}.max-w-\[min\(96vw\,1400px\)\]{max-width:min(96vw,1400px)}.max-w-full{max-width:100%}.max-w-md{max-width:28rem}.max-w-none{max-width:none}.max-w-sm{max-width:24rem}.max-w-xl{max-width:36rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.grow{flex-grow:1}.border-collapse{border-collapse:collapse}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0\.5{--tw-translate-x: .125rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-1\/2{--tw-translate-x: 50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-3\.5{--tw-translate-x: .875rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-180{--tw-rotate: 180deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-col-resize{cursor:col-resize}.cursor-default{cursor:default}.cursor-grab{cursor:grab}.cursor-grabbing{cursor:grabbing}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.cursor-wait{cursor:wait}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.select-all{-webkit-user-select:all;-moz-user-select:all;user-select:all}.resize-none{resize:none}.resize-y{resize:vertical}.resize{resize:both}.list-inside{list-style-position:inside}.list-disc{list-style-type:disc}.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{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid-cols-\[116px_1fr_auto_auto\]{grid-template-columns:116px 1fr auto auto}.grid-cols-\[5rem_1fr_auto\]{grid-template-columns:5rem 1fr auto}.grid-cols-\[auto_1fr\]{grid-template-columns:auto 1fr}.grid-cols-\[auto_1fr_auto\]{grid-template-columns:auto 1fr auto}.grid-cols-\[repeat\(auto-fit\,minmax\(160px\,1fr\)\)\]{grid-template-columns:repeat(auto-fit,minmax(160px,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.place-items-center{place-items:center}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0{gap:0px}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-2\.5{gap:.625rem}.gap-3{gap:.75rem}.gap-3\.5{gap:.875rem}.gap-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-\[18px\]{gap:18px}.gap-\[2px\]{gap:2px}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-y-0\.5{row-gap:.125rem}.gap-y-1{row-gap:.25rem}.gap-y-2{row-gap:.5rem}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-2\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.625rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.625rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.space-y-\[22px\]>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(22px * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(22px * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-line>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(224 211 184 / var(--tw-divide-opacity, 1))}.divide-line\/60>:not([hidden])~:not([hidden]){border-color:#e0d3b899}.self-start{align-self:flex-start}.self-center{align-self:center}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-ellipsis{text-overflow:ellipsis}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.text-pretty{text-wrap:pretty}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:1rem}.rounded-\[10px\]{border-radius:10px}.rounded-\[11px\]{border-radius:11px}.rounded-\[12px\]{border-radius:12px}.rounded-\[13px\]{border-radius:13px}.rounded-\[14px\]{border-radius:14px}.rounded-\[2px\]{border-radius:2px}.rounded-\[3px\]{border-radius:3px}.rounded-\[7px\]{border-radius:7px}.rounded-\[9px\]{border-radius:9px}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-sm{border-radius:.125rem}.rounded-xl{border-radius:.75rem}.rounded-l{border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.rounded-t-\[10px\]{border-top-left-radius:10px;border-top-right-radius:10px}.rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.rounded-bl-lg{border-bottom-left-radius:.5rem}.rounded-br-sm{border-bottom-right-radius:.125rem}.rounded-tl-lg{border-top-left-radius:.5rem}.rounded-tr-lg{border-top-right-radius:.5rem}.border{border-width:1px}.border-0{border-width:0px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-b-0{border-bottom-width:0px}.border-l{border-left-width:1px}.border-l-0{border-left-width:0px}.border-l-2{border-left-width:2px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.\!border-sage\/40{border-color:#6f7d5266!important}.border-\[\#8e641a\]\/40{border-color:#8e641a66}.border-\[\#b8443c\]\/40{border-color:#b8443c66}.border-\[\#e8cdb9\]{--tw-border-opacity: 1;border-color:rgb(232 205 185 / var(--tw-border-opacity, 1))}.border-\[\#eccdbe\]{--tw-border-opacity: 1;border-color:rgb(236 205 190 / var(--tw-border-opacity, 1))}.border-accent{--tw-border-opacity: 1;border-color:rgb(184 92 52 / var(--tw-border-opacity, 1))}.border-accent-muted{--tw-border-opacity: 1;border-color:rgb(232 169 136 / var(--tw-border-opacity, 1))}.border-accent\/30{border-color:#b85c344d}.border-accent\/40{border-color:#b85c3466}.border-accent\/50{border-color:#b85c3480}.border-accent\/60{border-color:#b85c3499}.border-amber-400\/25{border-color:#fbbf2440}.border-amber-400\/30{border-color:#fbbf244d}.border-amber-500\/15{border-color:#f59e0b26}.border-amber-500\/25{border-color:#f59e0b40}.border-amber-500\/40{border-color:#f59e0b66}.border-amber-700{--tw-border-opacity: 1;border-color:rgb(180 83 9 / var(--tw-border-opacity, 1))}.border-amber-700\/50{border-color:#b4530980}.border-amber-700\/60{border-color:#b4530999}.border-amber-800\/60{border-color:#92400e99}.border-blue-500{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.border-blue-900\/40{border-color:#1e3a8a66}.border-butter{--tw-border-opacity: 1;border-color:rgb(228 184 90 / var(--tw-border-opacity, 1))}.border-butter\/60{border-color:#e4b85a99}.border-green-800\/60{border-color:#16653499}.border-hive-plum{--tw-border-opacity: 1;border-color:rgb(138 90 110 / var(--tw-border-opacity, 1))}.border-hive-slate{--tw-border-opacity: 1;border-color:rgb(95 111 134 / var(--tw-border-opacity, 1))}.border-hive-teal{--tw-border-opacity: 1;border-color:rgb(79 125 114 / var(--tw-border-opacity, 1))}.border-honey\/30{border-color:#d3a23c4d}.border-line{--tw-border-opacity: 1;border-color:rgb(224 211 184 / var(--tw-border-opacity, 1))}.border-line\/30{border-color:#e0d3b84d}.border-line\/50{border-color:#e0d3b880}.border-line\/60{border-color:#e0d3b899}.border-orange-800\/60{border-color:#9a341299}.border-purple-900\/40{border-color:#581c8766}.border-red-400\/30{border-color:#f871714d}.border-red-500\/20{border-color:#ef444433}.border-red-500\/40{border-color:#ef444466}.border-red-500\/50{border-color:#ef444480}.border-red-500\/70{border-color:#ef4444b3}.border-red-700{--tw-border-opacity: 1;border-color:rgb(185 28 28 / var(--tw-border-opacity, 1))}.border-red-700\/50{border-color:#b91c1c80}.border-red-700\/60{border-color:#b91c1c99}.border-red-800{--tw-border-opacity: 1;border-color:rgb(153 27 27 / var(--tw-border-opacity, 1))}.border-red-800\/40{border-color:#991b1b66}.border-red-800\/60{border-color:#991b1b99}.border-red-900\/40{border-color:#7f1d1d66}.border-red-900\/50{border-color:#7f1d1d80}.border-red-900\/60{border-color:#7f1d1d99}.border-rule{--tw-border-opacity: 1;border-color:rgb(217 201 168 / var(--tw-border-opacity, 1))}.border-sage{--tw-border-opacity: 1;border-color:rgb(111 125 82 / var(--tw-border-opacity, 1))}.border-sage\/30{border-color:#6f7d524d}.border-sage\/40{border-color:#6f7d5266}.border-sage\/50{border-color:#6f7d5280}.border-sage\/60{border-color:#6f7d5299}.border-transparent{border-color:transparent}.border-white\/10{border-color:#ffffff1a}.border-white\/5{border-color:#ffffff0d}.border-yellow-600\/50{border-color:#ca8a0480}.border-yellow-600\/60{border-color:#ca8a0499}.border-yellow-800\/40{border-color:#854d0e66}.border-yellow-900\/40{border-color:#713f1266}.bg-\[\#2a2118\]{--tw-bg-opacity: 1;background-color:rgb(42 33 24 / var(--tw-bg-opacity, 1))}.bg-\[\#8e641a\]\/10{background-color:#8e641a1a}.bg-\[\#b8443c\]\/10{background-color:#b8443c1a}.bg-\[\#c0503a\]{--tw-bg-opacity: 1;background-color:rgb(192 80 58 / var(--tw-bg-opacity, 1))}.bg-\[\#c0503a\]\/20{background-color:#c0503a33}.bg-\[\#e4ebd6\]{--tw-bg-opacity: 1;background-color:rgb(228 235 214 / var(--tw-bg-opacity, 1))}.bg-\[\#e5ecd8\]{--tw-bg-opacity: 1;background-color:rgb(229 236 216 / var(--tw-bg-opacity, 1))}.bg-\[\#f0d9c8\]{--tw-bg-opacity: 1;background-color:rgb(240 217 200 / var(--tw-bg-opacity, 1))}.bg-\[\#f5e9df\]{--tw-bg-opacity: 1;background-color:rgb(245 233 223 / var(--tw-bg-opacity, 1))}.bg-\[\#f8e8e0\]{--tw-bg-opacity: 1;background-color:rgb(248 232 224 / var(--tw-bg-opacity, 1))}.bg-accent{--tw-bg-opacity: 1;background-color:rgb(184 92 52 / var(--tw-bg-opacity, 1))}.bg-accent-muted\/30{background-color:#e8a9884d}.bg-accent-muted\/40{background-color:#e8a98866}.bg-accent\/10{background-color:#b85c341a}.bg-accent\/15{background-color:#b85c3426}.bg-accent\/20{background-color:#b85c3433}.bg-accent\/\[0\.06\]{background-color:#b85c340f}.bg-amber-100\/40{background-color:#fef3c766}.bg-amber-400{--tw-bg-opacity: 1;background-color:rgb(251 191 36 / var(--tw-bg-opacity, 1))}.bg-amber-400\/10{background-color:#fbbf241a}.bg-amber-400\/15{background-color:#fbbf2426}.bg-amber-400\/20{background-color:#fbbf2433}.bg-amber-500\/10{background-color:#f59e0b1a}.bg-amber-500\/20{background-color:#f59e0b33}.bg-amber-500\/5{background-color:#f59e0b0d}.bg-amber-950\/10{background-color:#451a031a}.bg-amber-950\/50{background-color:#451a0380}.bg-amber-950\/60{background-color:#451a0399}.bg-bg{--tw-bg-opacity: 1;background-color:rgb(246 239 225 / var(--tw-bg-opacity, 1))}.bg-bg-elev{--tw-bg-opacity: 1;background-color:rgb(239 230 211 / var(--tw-bg-opacity, 1))}.bg-bg-elev\/40{background-color:#efe6d366}.bg-bg-elev\/50{background-color:#efe6d380}.bg-bg-elev\/60{background-color:#efe6d399}.bg-bg-elev\/80{background-color:#efe6d3cc}.bg-bg-elev\/85{background-color:#efe6d3d9}.bg-bg-hi{--tw-bg-opacity: 1;background-color:rgb(251 246 236 / var(--tw-bg-opacity, 1))}.bg-bg-hi\/40{background-color:#fbf6ec66}.bg-bg\/40{background-color:#f6efe166}.bg-black\/50{background-color:#00000080}.bg-black\/60{background-color:#0009}.bg-black\/65{background-color:#000000a6}.bg-blue-400{--tw-bg-opacity: 1;background-color:rgb(96 165 250 / var(--tw-bg-opacity, 1))}.bg-blue-500\/10{background-color:#3b82f61a}.bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.bg-blue-950\/30{background-color:#1725544d}.bg-butter{--tw-bg-opacity: 1;background-color:rgb(228 184 90 / var(--tw-bg-opacity, 1))}.bg-butter\/20{background-color:#e4b85a33}.bg-butter\/25{background-color:#e4b85a40}.bg-butter\/30{background-color:#e4b85a4d}.bg-current{background-color:currentColor}.bg-emerald-400{--tw-bg-opacity: 1;background-color:rgb(52 211 153 / var(--tw-bg-opacity, 1))}.bg-fg{--tw-bg-opacity: 1;background-color:rgb(42 34 26 / var(--tw-bg-opacity, 1))}.bg-fg-faint{--tw-bg-opacity: 1;background-color:rgb(138 122 96 / var(--tw-bg-opacity, 1))}.bg-fg\/5{background-color:#2a221a0d}.bg-green-500{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-green-900\/30{background-color:#14532d4d}.bg-green-950\/50{background-color:#052e1680}.bg-hive-plum{--tw-bg-opacity: 1;background-color:rgb(138 90 110 / var(--tw-bg-opacity, 1))}.bg-hive-slate{--tw-bg-opacity: 1;background-color:rgb(95 111 134 / var(--tw-bg-opacity, 1))}.bg-hive-teal{--tw-bg-opacity: 1;background-color:rgb(79 125 114 / var(--tw-bg-opacity, 1))}.bg-honey{--tw-bg-opacity: 1;background-color:rgb(211 162 60 / var(--tw-bg-opacity, 1))}.bg-honey\/10{background-color:#d3a23c1a}.bg-honey\/15{background-color:#d3a23c26}.bg-line{--tw-bg-opacity: 1;background-color:rgb(224 211 184 / var(--tw-bg-opacity, 1))}.bg-orange-950\/50{background-color:#43140780}.bg-purple-950\/30{background-color:#3b07644d}.bg-red-400{--tw-bg-opacity: 1;background-color:rgb(248 113 113 / var(--tw-bg-opacity, 1))}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-red-500\/10{background-color:#ef44441a}.bg-red-500\/5{background-color:#ef44440d}.bg-red-600{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.bg-red-900\/20{background-color:#7f1d1d33}.bg-red-900\/30{background-color:#7f1d1d4d}.bg-red-950{--tw-bg-opacity: 1;background-color:rgb(69 10 10 / var(--tw-bg-opacity, 1))}.bg-red-950\/10{background-color:#450a0a1a}.bg-red-950\/20{background-color:#450a0a33}.bg-red-950\/30{background-color:#450a0a4d}.bg-red-950\/40{background-color:#450a0a66}.bg-red-950\/50{background-color:#450a0a80}.bg-red-950\/60{background-color:#450a0a99}.bg-red-950\/95{background-color:#450a0af2}.bg-rule{--tw-bg-opacity: 1;background-color:rgb(217 201 168 / var(--tw-bg-opacity, 1))}.bg-sage{--tw-bg-opacity: 1;background-color:rgb(111 125 82 / var(--tw-bg-opacity, 1))}.bg-sage\/10{background-color:#6f7d521a}.bg-sage\/15{background-color:#6f7d5226}.bg-sage\/20{background-color:#6f7d5233}.bg-sage\/25{background-color:#6f7d5240}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-yellow-400{--tw-bg-opacity: 1;background-color:rgb(250 204 21 / var(--tw-bg-opacity, 1))}.bg-yellow-500\/5{background-color:#eab3080d}.bg-yellow-950\/20{background-color:#42200633}.bg-yellow-950\/30{background-color:#4220064d}.bg-zinc-500{--tw-bg-opacity: 1;background-color:rgb(113 113 122 / var(--tw-bg-opacity, 1))}.object-contain{-o-object-fit:contain;object-fit:contain}.p-0{padding:0}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-3\.5{padding:.875rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-0{padding-left:0;padding-right:0}.px-0\.5{padding-left:.125rem;padding-right:.125rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-10{padding-left:2.5rem;padding-right:2.5rem}.px-14{padding-left:3.5rem;padding-right:3.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-3\.5{padding-left:.875rem;padding-right:.875rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.px-9{padding-left:2.25rem;padding-right:2.25rem}.px-\[15px\]{padding-left:15px;padding-right:15px}.px-\[18px\]{padding-left:18px;padding-right:18px}.px-\[22px\]{padding-left:22px;padding-right:22px}.px-\[9px\]{padding-left:9px;padding-right:9px}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-3\.5{padding-top:.875rem;padding-bottom:.875rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-9{padding-top:2.25rem;padding-bottom:2.25rem}.py-\[14px\]{padding-top:14px;padding-bottom:14px}.py-\[15px\]{padding-top:15px;padding-bottom:15px}.py-\[18px\]{padding-top:18px;padding-bottom:18px}.py-\[22px\]{padding-top:22px;padding-bottom:22px}.py-\[3px\]{padding-top:3px;padding-bottom:3px}.py-\[7px\]{padding-top:7px;padding-bottom:7px}.py-\[9px\]{padding-top:9px;padding-bottom:9px}.py-px{padding-top:1px;padding-bottom:1px}.pb-0{padding-bottom:0}.pb-1{padding-bottom:.25rem}.pb-1\.5{padding-bottom:.375rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pb-5{padding-bottom:1.25rem}.pb-6{padding-bottom:1.5rem}.pb-7{padding-bottom:1.75rem}.pb-\[10px\]{padding-bottom:10px}.pb-\[15px\]{padding-bottom:15px}.pb-\[9px\]{padding-bottom:9px}.pl-1{padding-left:.25rem}.pl-12{padding-left:3rem}.pl-2{padding-left:.5rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pl-5{padding-left:1.25rem}.pl-9{padding-left:2.25rem}.pl-\[3\.75rem\]{padding-left:3.75rem}.pr-1{padding-right:.25rem}.pr-2{padding-right:.5rem}.pr-3{padding-right:.75rem}.pt-0{padding-top:0}.pt-0\.5{padding-top:.125rem}.pt-1{padding-top:.25rem}.pt-1\.5{padding-top:.375rem}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.pt-3\.5{padding-top:.875rem}.pt-4{padding-top:1rem}.pt-6{padding-top:1.5rem}.pt-7{padding-top:1.75rem}.pt-\[12vh\]{padding-top:12vh}.pt-\[14px\]{padding-top:14px}.pt-\[15px\]{padding-top:15px}.pt-\[15vh\]{padding-top:15vh}.pt-\[8vh\]{padding-top:8vh}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-mono{font-family:IBM Plex Mono,JetBrains Mono,ui-monospace,SFMono-Regular,Menlo,monospace}.font-sans{font-family:Geist,system-ui,sans-serif}.font-serif{font-family:Newsreader,Georgia,serif}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-\[10\.5px\]{font-size:10.5px}.text-\[10px\]{font-size:10px}.text-\[11\.5px\]{font-size:11.5px}.text-\[11px\]{font-size:11px}.text-\[12\.5px\]{font-size:12.5px}.text-\[12px\]{font-size:12px}.text-\[13\.5px\]{font-size:13.5px}.text-\[13px\]{font-size:13px}.text-\[14\.5px\]{font-size:14.5px}.text-\[14px\]{font-size:14px}.text-\[15px\]{font-size:15px}.text-\[17px\]{font-size:17px}.text-\[18px\]{font-size:18px}.text-\[19px\]{font-size:19px}.text-\[22px\]{font-size:22px}.text-\[30px\]{font-size:30px}.text-\[34px\]{font-size:34px}.text-\[38px\]{font-size:38px}.text-\[40px\]{font-size:40px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.normal-case{text-transform:none}.italic{font-style:italic}.not-italic{font-style:normal}.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)}.leading-5{line-height:1.25rem}.leading-\[1\.1\]{line-height:1.1}.leading-\[1\.45\]{line-height:1.45}.leading-\[1\.4\]{line-height:1.4}.leading-\[1\.55\]{line-height:1.55}.leading-\[1\.5\]{line-height:1.5}.leading-loose{line-height:2}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-snug{line-height:1.375}.leading-tight{line-height:1.25}.tracking-\[-0\.01em\]{letter-spacing:-.01em}.tracking-\[0\.01em\]{letter-spacing:.01em}.tracking-\[0\.06em\]{letter-spacing:.06em}.tracking-\[0\.07em\]{letter-spacing:.07em}.tracking-\[0\.08em\]{letter-spacing:.08em}.tracking-\[0\.3em\]{letter-spacing:.3em}.tracking-\[0\.6px\]{letter-spacing:.6px}.tracking-\[0\.7px\]{letter-spacing:.7px}.tracking-\[0\.8px\]{letter-spacing:.8px}.tracking-\[6px\]{letter-spacing:6px}.tracking-normal{letter-spacing:0em}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.\!text-sage{--tw-text-opacity: 1 !important;color:rgb(111 125 82 / var(--tw-text-opacity, 1))!important}.text-\[\#7a5416\]{--tw-text-opacity: 1;color:rgb(122 84 22 / var(--tw-text-opacity, 1))}.text-\[\#8a2f28\]{--tw-text-opacity: 1;color:rgb(138 47 40 / var(--tw-text-opacity, 1))}.text-\[\#9a3f1f\]{--tw-text-opacity: 1;color:rgb(154 63 31 / var(--tw-text-opacity, 1))}.text-\[\#c0503a\]{--tw-text-opacity: 1;color:rgb(192 80 58 / var(--tw-text-opacity, 1))}.text-\[\#e8ddc9\]{--tw-text-opacity: 1;color:rgb(232 221 201 / var(--tw-text-opacity, 1))}.text-accent{--tw-text-opacity: 1;color:rgb(184 92 52 / var(--tw-text-opacity, 1))}.text-accent-dark{--tw-text-opacity: 1;color:rgb(129 64 36 / var(--tw-text-opacity, 1))}.text-accent\/80{color:#b85c34cc}.text-accent\/90{color:#b85c34e6}.text-amber-200{--tw-text-opacity: 1;color:rgb(253 230 138 / var(--tw-text-opacity, 1))}.text-amber-300{--tw-text-opacity: 1;color:rgb(252 211 77 / var(--tw-text-opacity, 1))}.text-amber-400{--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.text-amber-400\/70{color:#fbbf24b3}.text-amber-700{--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.text-bg{--tw-text-opacity: 1;color:rgb(246 239 225 / var(--tw-text-opacity, 1))}.text-blue-300\/90{color:#93c5fde6}.text-blue-400{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.text-blue-400\/80{color:#60a5facc}.text-butter{--tw-text-opacity: 1;color:rgb(228 184 90 / var(--tw-text-opacity, 1))}.text-fg{--tw-text-opacity: 1;color:rgb(42 34 26 / var(--tw-text-opacity, 1))}.text-fg-dim{--tw-text-opacity: 1;color:rgb(91 74 54 / var(--tw-text-opacity, 1))}.text-fg-faint{--tw-text-opacity: 1;color:rgb(138 122 96 / var(--tw-text-opacity, 1))}.text-fg-faint\/30{color:#8a7a604d}.text-fg-faint\/40{color:#8a7a6066}.text-fg-faint\/50{color:#8a7a6080}.text-fg-faint\/60{color:#8a7a6099}.text-fg-faint\/70{color:#8a7a60b3}.text-fg\/40{color:#2a221a66}.text-fg\/50{color:#2a221a80}.text-fg\/70{color:#2a221ab3}.text-fg\/85{color:#2a221ad9}.text-green-200{--tw-text-opacity: 1;color:rgb(187 247 208 / var(--tw-text-opacity, 1))}.text-green-300{--tw-text-opacity: 1;color:rgb(134 239 172 / var(--tw-text-opacity, 1))}.text-green-400{--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.text-green-400\/70{color:#4ade80b3}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-green-500\/70{color:#22c55eb3}.text-hive-plum{--tw-text-opacity: 1;color:rgb(138 90 110 / var(--tw-text-opacity, 1))}.text-hive-slate{--tw-text-opacity: 1;color:rgb(95 111 134 / var(--tw-text-opacity, 1))}.text-hive-teal{--tw-text-opacity: 1;color:rgb(79 125 114 / var(--tw-text-opacity, 1))}.text-honey-dark{--tw-text-opacity: 1;color:rgb(123 86 14 / var(--tw-text-opacity, 1))}.text-orange-200{--tw-text-opacity: 1;color:rgb(254 215 170 / var(--tw-text-opacity, 1))}.text-purple-400\/80{color:#c084fccc}.text-red-200{--tw-text-opacity: 1;color:rgb(254 202 202 / var(--tw-text-opacity, 1))}.text-red-300{--tw-text-opacity: 1;color:rgb(252 165 165 / var(--tw-text-opacity, 1))}.text-red-300\/70{color:#fca5a5b3}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-red-400\/60{color:#f8717199}.text-red-400\/70{color:#f87171b3}.text-red-400\/80{color:#f87171cc}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-rule{--tw-text-opacity: 1;color:rgb(217 201 168 / var(--tw-text-opacity, 1))}.text-sage{--tw-text-opacity: 1;color:rgb(111 125 82 / var(--tw-text-opacity, 1))}.text-sage-dark{--tw-text-opacity: 1;color:rgb(78 87 57 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-white\/75{color:#ffffffbf}.text-yellow-200{--tw-text-opacity: 1;color:rgb(254 240 138 / var(--tw-text-opacity, 1))}.text-yellow-300{--tw-text-opacity: 1;color:rgb(253 224 71 / var(--tw-text-opacity, 1))}.text-yellow-400{--tw-text-opacity: 1;color:rgb(250 204 21 / var(--tw-text-opacity, 1))}.text-yellow-400\/80{color:#facc15cc}.text-yellow-500\/70{color:#eab308b3}.text-yellow-500\/80{color:#eab308cc}.text-yellow-500\/90{color:#eab308e6}.underline{text-decoration-line:underline}.line-through{text-decoration-line:line-through}.no-underline{text-decoration-line:none}.underline-offset-2{text-underline-offset:2px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.placeholder-fg-faint::-moz-placeholder{--tw-placeholder-opacity: 1;color:rgb(138 122 96 / var(--tw-placeholder-opacity, 1))}.placeholder-fg-faint::placeholder{--tw-placeholder-opacity: 1;color:rgb(138 122 96 / var(--tw-placeholder-opacity, 1))}.accent-accent{accent-color:#b85c34}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_0_1px_rgba\(184\,92\,52\,0\.25\)\]{--tw-shadow: 0 0 0 1px rgba(184,92,52,.25);--tw-shadow-colored: 0 0 0 1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_2px_0_\#e0d3b8\]{--tw-shadow: 0 2px 0 #e0d3b8;--tw-shadow-colored: 0 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_2px_0_rgba\(0\,0\,0\,0\.18\)\]{--tw-shadow: 0 2px 0 rgba(0,0,0,.18);--tw-shadow-colored: 0 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[inset_0_0_0_1px\]{--tw-shadow: inset 0 0 0 1px;--tw-shadow-colored: inset 0 0 0 1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-md{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-line{--tw-shadow-color: #e0d3b8;--tw-shadow: var(--tw-shadow-colored)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-1{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-2{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-inset{--tw-ring-inset: inset}.ring-accent{--tw-ring-opacity: 1;--tw-ring-color: rgb(184 92 52 / var(--tw-ring-opacity, 1))}.ring-accent\/20{--tw-ring-color: rgb(184 92 52 / .2)}.ring-butter{--tw-ring-opacity: 1;--tw-ring-color: rgb(228 184 90 / var(--tw-ring-opacity, 1))}.ring-hive-plum{--tw-ring-opacity: 1;--tw-ring-color: rgb(138 90 110 / var(--tw-ring-opacity, 1))}.ring-hive-slate{--tw-ring-opacity: 1;--tw-ring-color: rgb(95 111 134 / var(--tw-ring-opacity, 1))}.ring-hive-teal{--tw-ring-opacity: 1;--tw-ring-color: rgb(79 125 114 / var(--tw-ring-opacity, 1))}.ring-line{--tw-ring-opacity: 1;--tw-ring-color: rgb(224 211 184 / var(--tw-ring-opacity, 1))}.ring-red-400{--tw-ring-opacity: 1;--tw-ring-color: rgb(248 113 113 / var(--tw-ring-opacity, 1))}.ring-red-500{--tw-ring-opacity: 1;--tw-ring-color: rgb(239 68 68 / var(--tw-ring-opacity, 1))}.ring-sage{--tw-ring-opacity: 1;--tw-ring-color: rgb(111 125 82 / var(--tw-ring-opacity, 1))}.blur{--tw-blur: blur(8px);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)!important}.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{--tw-backdrop-blur: blur(8px);-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-sm{--tw-backdrop-blur: blur(4px);-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,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-\[width\]{transition-property:width;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-1000{transition-duration:1s}.duration-150{transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.duration-500{transition-duration:.5s}.duration-75{transition-duration:75ms}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.\[writing-mode\:vertical-rl\]{writing-mode:vertical-rl}.burn-proj-stripe{background-image:repeating-linear-gradient(45deg,#6f7d52 0px,#6f7d52 4px,transparent 4px,transparent 8px)}.tiptap-content h1{font-size:1.5rem;font-weight:600;margin:.75rem 0 .5rem;line-height:1.3;color:#2a221a;font-family:Newsreader,Georgia,serif}.tiptap-content h2{font-size:1.25rem;font-weight:600;margin:.75rem 0 .4rem;line-height:1.3;color:#2a221a;font-family:Newsreader,Georgia,serif}.tiptap-content h3{font-size:1.1rem;font-weight:600;margin:.6rem 0 .3rem;line-height:1.3;color:#2a221a;font-family:Newsreader,Georgia,serif}.tiptap-content p{margin:.4rem 0;color:#2a221a;line-height:1.6}.tiptap-content ul{list-style:disc;padding-left:1.5rem;margin:.4rem 0;color:#2a221a}.tiptap-content ol{list-style:decimal;padding-left:1.5rem;margin:.4rem 0;color:#2a221a}.tiptap-content li{margin:.15rem 0}.tiptap-content blockquote{border-left:3px solid #d9c9a8;padding-left:.75rem;color:#5b4a36;margin:.4rem 0;font-style:italic}.tiptap-content code{background:#fbf6ec;color:#b85c34;padding:.1em .35em;border-radius:3px;font-size:.88em;font-family:IBM Plex Mono,ui-monospace,monospace;border:1px solid #e0d3b8}.tiptap-content pre{background:#fbf6ec;color:#2a221a;padding:.75rem 1rem;border-radius:6px;overflow-x:auto;margin:.5rem 0;font-size:.85em;font-family:IBM Plex Mono,ui-monospace,monospace;border:1px solid #e0d3b8}.tiptap-content pre code{background:none;padding:0;color:inherit;font-size:inherit;border:0}.tiptap-content a{color:#b85c34;text-decoration:underline}.tiptap-content hr{border:none;border-top:1px solid #d9c9a8;margin:.75rem 0}.tiptap-content strong{font-weight:600}.tiptap-content em{font-style:italic}.tiptap-content:focus{outline:none}.markdown-body{color:#2a221a}.markdown-body h1{font-size:1.9rem;font-weight:600;margin:1.4rem 0 .7rem;line-height:1.25;font-family:Newsreader,Georgia,serif}.markdown-body h2{font-size:1.5rem;font-weight:600;margin:1.2rem 0 .6rem;line-height:1.3;font-family:Newsreader,Georgia,serif;border-bottom:1px solid #e6dcc4;padding-bottom:.2rem}.markdown-body h3{font-size:1.2rem;font-weight:600;margin:1rem 0 .4rem;line-height:1.3;font-family:Newsreader,Georgia,serif}.markdown-body h4,.markdown-body h5,.markdown-body h6{font-weight:600;margin:.8rem 0 .3rem;font-family:Newsreader,Georgia,serif}.markdown-body p{margin:.6rem 0;line-height:1.7}.markdown-body ul{list-style:disc;padding-left:1.6rem;margin:.5rem 0}.markdown-body ol{list-style:decimal;padding-left:1.6rem;margin:.5rem 0}.markdown-body li{margin:.2rem 0;line-height:1.6}.markdown-body li>input[type=checkbox]{margin-right:.4rem}.markdown-body blockquote{border-left:3px solid #d9c9a8;padding-left:.85rem;color:#5b4a36;margin:.6rem 0;font-style:italic}.markdown-body code{background:#fbf6ec;color:#b85c34;padding:.1em .35em;border-radius:3px;font-size:.88em;font-family:IBM Plex Mono,ui-monospace,monospace;border:1px solid #e0d3b8}.markdown-body pre{background:#fbf6ec;color:#2a221a;padding:.8rem 1rem;border-radius:6px;overflow-x:auto;margin:.7rem 0;font-size:.85em;font-family:IBM Plex Mono,ui-monospace,monospace;border:1px solid #e0d3b8}.markdown-body pre code{background:none;padding:0;color:inherit;font-size:inherit;border:0}.markdown-body a{color:#b85c34;text-decoration:underline}.markdown-body hr{border:none;border-top:1px solid #d9c9a8;margin:1rem 0}.markdown-body strong{font-weight:600}.markdown-body em{font-style:italic}.markdown-body img{max-width:100%;border-radius:4px}.markdown-body table{border-collapse:collapse;margin:.7rem 0;font-size:.9em}.markdown-body th,.markdown-body td{border:1px solid #e0d3b8;padding:.35rem .6rem;text-align:left}.markdown-body th{background:#f1e7d2;font-weight:600}.markdown-body h1[id],.markdown-body h2[id],.markdown-body h3[id]{scroll-margin-top:1rem}.prose-chat--plan{border:1px solid #8e641a40;border-radius:14px;background:#8e641a0d}.prose-chat--plan ul,.prose-chat--plan ol{list-style:none;padding-left:1.4rem;margin:.4rem 0}.prose-chat--plan li{position:relative;margin:.3rem 0}.prose-chat--plan li:before{content:"✓";position:absolute;left:-1.4rem;color:#4d7a4d;font-weight:600}html,body,#root{height:100%;margin:0;overflow:hidden}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background:#efe6d3}::-webkit-scrollbar-thumb{background:#d9c9a8;border-radius:5px}::-webkit-scrollbar-thumb:hover{background:#c8b88f}.placeholder\:text-fg-dim::-moz-placeholder{--tw-text-opacity: 1;color:rgb(91 74 54 / var(--tw-text-opacity, 1))}.placeholder\:text-fg-dim::placeholder{--tw-text-opacity: 1;color:rgb(91 74 54 / var(--tw-text-opacity, 1))}.placeholder\:text-fg-faint::-moz-placeholder{--tw-text-opacity: 1;color:rgb(138 122 96 / var(--tw-text-opacity, 1))}.placeholder\:text-fg-faint::placeholder{--tw-text-opacity: 1;color:rgb(138 122 96 / var(--tw-text-opacity, 1))}.placeholder\:text-fg-faint\/40::-moz-placeholder{color:#8a7a6066}.placeholder\:text-fg-faint\/40::placeholder{color:#8a7a6066}.last\:mb-0:last-child{margin-bottom:0}.last\:border-0:last-child{border-width:0px}.even\:bg-bg-elev\/40:nth-child(2n){background-color:#efe6d366}.hover\:border-accent:hover{--tw-border-opacity: 1;border-color:rgb(184 92 52 / var(--tw-border-opacity, 1))}.hover\:border-accent\/30:hover{border-color:#b85c344d}.hover\:border-accent\/40:hover{border-color:#b85c3466}.hover\:border-accent\/60:hover{border-color:#b85c3499}.hover\:border-amber-400\/60:hover{border-color:#fbbf2499}.hover\:border-fg-faint:hover{--tw-border-opacity: 1;border-color:rgb(138 122 96 / var(--tw-border-opacity, 1))}.hover\:border-red-400\/50:hover{border-color:#f8717180}.hover\:border-red-400\/60:hover{border-color:#f8717199}.hover\:bg-\[\#b8443c\]\/10:hover{background-color:#b8443c1a}.hover\:bg-accent:hover{--tw-bg-opacity: 1;background-color:rgb(184 92 52 / var(--tw-bg-opacity, 1))}.hover\:bg-accent\/25:hover{background-color:#b85c3440}.hover\:bg-accent\/40:hover{background-color:#b85c3466}.hover\:bg-accent\/90:hover{background-color:#b85c34e6}.hover\:bg-amber-900\/20:hover{background-color:#78350f33}.hover\:bg-bg:hover{--tw-bg-opacity: 1;background-color:rgb(246 239 225 / var(--tw-bg-opacity, 1))}.hover\:bg-bg-elev:hover{--tw-bg-opacity: 1;background-color:rgb(239 230 211 / var(--tw-bg-opacity, 1))}.hover\:bg-bg-elev\/20:hover{background-color:#efe6d333}.hover\:bg-bg-elev\/50:hover{background-color:#efe6d380}.hover\:bg-bg-hi:hover{--tw-bg-opacity: 1;background-color:rgb(251 246 236 / var(--tw-bg-opacity, 1))}.hover\:bg-bg-hi\/40:hover{background-color:#fbf6ec66}.hover\:bg-bg-hi\/50:hover{background-color:#fbf6ec80}.hover\:bg-bg-hi\/60:hover{background-color:#fbf6ec99}.hover\:bg-bg-hi\/70:hover{background-color:#fbf6ecb3}.hover\:bg-bg-hi\/80:hover{background-color:#fbf6eccc}.hover\:bg-bg\/40:hover{background-color:#f6efe166}.hover\:bg-blue-500:hover{--tw-bg-opacity: 1;background-color:rgb(59 130 246 / var(--tw-bg-opacity, 1))}.hover\:bg-blue-900\/40:hover{background-color:#1e3a8a66}.hover\:bg-red-500:hover{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.hover\:bg-red-900\/20:hover{background-color:#7f1d1d33}.hover\:bg-red-950\/30:hover{background-color:#450a0a4d}.hover\:bg-transparent:hover{background-color:transparent}.hover\:bg-white\/10:hover{background-color:#ffffff1a}.hover\:bg-white\/5:hover{background-color:#ffffff0d}.hover\:bg-yellow-600:hover{--tw-bg-opacity: 1;background-color:rgb(202 138 4 / var(--tw-bg-opacity, 1))}.hover\:text-accent:hover{--tw-text-opacity: 1;color:rgb(184 92 52 / var(--tw-text-opacity, 1))}.hover\:text-amber-300:hover{--tw-text-opacity: 1;color:rgb(252 211 77 / var(--tw-text-opacity, 1))}.hover\:text-amber-400:hover{--tw-text-opacity: 1;color:rgb(251 191 36 / var(--tw-text-opacity, 1))}.hover\:text-bg:hover{--tw-text-opacity: 1;color:rgb(246 239 225 / var(--tw-text-opacity, 1))}.hover\:text-fg:hover{--tw-text-opacity: 1;color:rgb(42 34 26 / var(--tw-text-opacity, 1))}.hover\:text-fg-dim:hover{--tw-text-opacity: 1;color:rgb(91 74 54 / var(--tw-text-opacity, 1))}.hover\:text-red-300:hover{--tw-text-opacity: 1;color:rgb(252 165 165 / var(--tw-text-opacity, 1))}.hover\:text-red-400:hover{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.hover\:text-red-500:hover{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.hover\:text-yellow-300:hover{--tw-text-opacity: 1;color:rgb(253 224 71 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:no-underline:hover{text-decoration-line:none}.hover\:opacity-100:hover{opacity:1}.hover\:opacity-80:hover{opacity:.8}.hover\:opacity-90:hover{opacity:.9}.hover\:shadow-sm:hover{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.hover\:brightness-125:hover{--tw-brightness: brightness(1.25);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)}.focus\:border-accent:focus{--tw-border-opacity: 1;border-color:rgb(184 92 52 / var(--tw-border-opacity, 1))}.focus\:border-accent\/40:focus{border-color:#b85c3466}.focus\:border-accent\/50:focus{border-color:#b85c3480}.focus\:border-fg-faint:focus{--tw-border-opacity: 1;border-color:rgb(138 122 96 / var(--tw-border-opacity, 1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-inset:focus{--tw-ring-inset: inset}.focus\:ring-accent:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(184 92 52 / var(--tw-ring-opacity, 1))}.active\:bg-accent\/60:active{background-color:#b85c3499}.disabled\:cursor-default:disabled{cursor:default}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:border-rule:disabled{--tw-border-opacity: 1;border-color:rgb(217 201 168 / var(--tw-border-opacity, 1))}.disabled\:bg-rule:disabled{--tw-bg-opacity: 1;background-color:rgb(217 201 168 / var(--tw-bg-opacity, 1))}.disabled\:text-rule:disabled{--tw-text-opacity: 1;color:rgb(217 201 168 / var(--tw-text-opacity, 1))}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.disabled\:opacity-70:disabled{opacity:.7}.disabled\:hover\:bg-transparent:hover:disabled{background-color:transparent}.group:hover .group-hover\:block{display:block}.group:hover .group-hover\:hidden{display:none}.group:hover .group-hover\:opacity-100{opacity:1}.group:hover .group-hover\:opacity-70{opacity:.7}@media(min-width:768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(min-width:1280px){.xl\:sticky{position:sticky}.xl\:top-6{top:1.5rem}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.xl\:grid-cols-\[minmax\(0\,1fr\)_340px\]{grid-template-columns:minmax(0,1fr) 340px}.xl\:grid-cols-\[minmax\(0\,1fr\)_380px\]{grid-template-columns:minmax(0,1fr) 380px}.xl\:p-9{padding:2.25rem}}.\[\&\>span\]\:w-full>span{width:100%}.\[\&_p\]\:max-w-lg p{max-width:32rem}.\[\&_pre\]\:max-w-none pre{max-width:none}
|