@dendelion/paper-camp 0.20.0 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/README.md +34 -0
  2. package/dist/app/assets/index-BK4XPXt_.js +4 -0
  3. package/dist/app/assets/index-BK4XPXt_.js.map +1 -0
  4. package/dist/app/assets/index-BZnU3b_x.js +2 -0
  5. package/dist/app/assets/index-BZnU3b_x.js.map +1 -0
  6. package/dist/app/assets/index-BxQBW2Oi.js +2 -0
  7. package/dist/app/assets/index-BxQBW2Oi.js.map +1 -0
  8. package/dist/app/assets/{index-D_Lo8ptS.js → index-COEivZHG.js} +4 -4
  9. package/dist/app/assets/{index-D_Lo8ptS.js.map → index-COEivZHG.js.map} +1 -1
  10. package/dist/app/assets/index-COQOoPiS.js +2 -0
  11. package/dist/app/assets/{index-BHmWkgBW.js.map → index-COQOoPiS.js.map} +1 -1
  12. package/dist/app/assets/index-DIlqYxon.js +7 -0
  13. package/dist/app/assets/index-DIlqYxon.js.map +1 -0
  14. package/dist/app/assets/index-VXeQcBh1.js +2 -0
  15. package/dist/app/assets/index-VXeQcBh1.js.map +1 -0
  16. package/dist/app/assets/{index-DMDqfoCe.js → index-vgBxkLmQ.js} +2 -2
  17. package/dist/app/assets/{index-DMDqfoCe.js.map → index-vgBxkLmQ.js.map} +1 -1
  18. package/dist/app/assets/main-DEUaro51.css +1 -0
  19. package/dist/app/assets/main-s2b5XHSS.js +425 -0
  20. package/dist/app/assets/main-s2b5XHSS.js.map +1 -0
  21. package/dist/app/assets/{sidebar-section-B-A20bg9.js → sidebar-section-4MxZoa3M.js} +2 -2
  22. package/dist/app/assets/{sidebar-section-B-A20bg9.js.map → sidebar-section-4MxZoa3M.js.map} +1 -1
  23. package/dist/app/index.html +6 -6
  24. package/dist/app/toolbar.js +13775 -5454
  25. package/dist/app/toolbar.js.map +1 -1
  26. package/dist/chunks/{phase-progress.DPAZ01Gg.js → phase-progress.DimXpZFz.js} +1337 -1300
  27. package/dist/chunks/phase-progress.DimXpZFz.js.map +1 -0
  28. package/dist/cli/index.js +5289 -5105
  29. package/dist/cli/index.js.map +1 -1
  30. package/dist/core/corpus-format.d.ts +14 -0
  31. package/dist/core/corpus-format.d.ts.map +1 -1
  32. package/dist/core/entity-view.d.ts +6 -0
  33. package/dist/core/entity-view.d.ts.map +1 -0
  34. package/dist/core/git-log.d.ts +2 -0
  35. package/dist/core/git-log.d.ts.map +1 -1
  36. package/dist/core/git-pr/pr-lookup.d.ts.map +1 -1
  37. package/dist/core/index.js +106 -104
  38. package/dist/core/issues.d.ts +2 -3
  39. package/dist/core/issues.d.ts.map +1 -1
  40. package/dist/core/parse/parser.d.ts.map +1 -1
  41. package/dist/core/parse/schemas.d.ts +11 -0
  42. package/dist/core/parse/schemas.d.ts.map +1 -1
  43. package/dist/core/phase-run.d.ts +1 -0
  44. package/dist/core/phase-run.d.ts.map +1 -1
  45. package/dist/core/readers.d.ts +4 -3
  46. package/dist/core/readers.d.ts.map +1 -1
  47. package/dist/core/release-notes.d.ts +2 -0
  48. package/dist/core/release-notes.d.ts.map +1 -1
  49. package/dist/core/roadmap.d.ts +21 -0
  50. package/dist/core/roadmap.d.ts.map +1 -1
  51. package/dist/core/run-order.d.ts +2 -1
  52. package/dist/core/run-order.d.ts.map +1 -1
  53. package/dist/core/scaffold/scaffold.d.ts +1 -1
  54. package/dist/core/scaffold/scaffold.d.ts.map +1 -1
  55. package/dist/core/sections.d.ts.map +1 -1
  56. package/dist/core/serialize/entity-file.d.ts +79 -0
  57. package/dist/core/serialize/entity-file.d.ts.map +1 -0
  58. package/dist/core/serialize/index.d.ts +1 -0
  59. package/dist/core/serialize/index.d.ts.map +1 -1
  60. package/dist/core/serialize/serializer.d.ts +1 -76
  61. package/dist/core/serialize/serializer.d.ts.map +1 -1
  62. package/dist/core/stats.d.ts +2 -0
  63. package/dist/core/stats.d.ts.map +1 -1
  64. package/dist/core/status/status.d.ts +18 -1
  65. package/dist/core/status/status.d.ts.map +1 -1
  66. package/dist/types/index.d.ts +36 -18
  67. package/dist/types/index.d.ts.map +1 -1
  68. package/dist/types/index.js +16 -15
  69. package/dist/types/index.js.map +1 -1
  70. package/package.json +2 -2
  71. package/dist/app/assets/index-3pzg7Iyw.js +0 -2
  72. package/dist/app/assets/index-3pzg7Iyw.js.map +0 -1
  73. package/dist/app/assets/index-BHmWkgBW.js +0 -2
  74. package/dist/app/assets/index-BuzzfADD.js +0 -2
  75. package/dist/app/assets/index-BuzzfADD.js.map +0 -1
  76. package/dist/app/assets/index-CkLeljbk.js +0 -2
  77. package/dist/app/assets/index-CkLeljbk.js.map +0 -1
  78. package/dist/app/assets/index-DfekHwwU.js +0 -7
  79. package/dist/app/assets/index-DfekHwwU.js.map +0 -1
  80. package/dist/app/assets/index-Gi97Lmex.js +0 -4
  81. package/dist/app/assets/index-Gi97Lmex.js.map +0 -1
  82. package/dist/app/assets/main-Bm0W4ucz.css +0 -1
  83. package/dist/app/assets/main-DP_okYxh.js +0 -215
  84. package/dist/app/assets/main-DP_okYxh.js.map +0 -1
  85. package/dist/chunks/phase-progress.DPAZ01Gg.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-VXeQcBh1.js","sources":["../../../src/app/services/system/merge-policy-api.ts","../../../src/app/features/settings/components/merge-policy-section.tsx","../../../src/app/features/settings/components/setup-section.tsx","../../../src/app/features/settings/components/subjects-section.tsx","../../../src/app/features/settings/settings-page.tsx","../../../src/app/features/settings/components/settings-sidebar.tsx"],"sourcesContent":["import type { MergePolicyResult } from '@/types/index';\nimport { apiUrl } from '../api-base';\n\nexport const fetchMergePolicy = async (): Promise<MergePolicyResult | null> => {\n try {\n const response = await fetch(apiUrl('/api/merge-policy'));\n if (!response.ok) return null;\n return (await response.json()) as MergePolicyResult;\n } catch {\n return null;\n }\n};\n\nexport const applyMergePolicy = async (): Promise<MergePolicyResult | null> => {\n try {\n const response = await fetch(apiUrl('/api/merge-policy/apply'), { method: 'POST' });\n if (!response.ok) return null;\n return (await response.json()) as MergePolicyResult;\n } catch {\n return null;\n }\n};\n","import { applyMergePolicy, fetchMergePolicy } from '@/app/services/system';\nimport type { MergePolicy, MergePolicyResult } from '@/types/index';\nimport { Alert, Button, Card, Divider, Stamp, useToast } from '@dendelion/paper-ui';\nimport { useEffect, useState } from 'react';\n\nconst RECOMMENDED: MergePolicy = {\n allowSquashMerge: true,\n allowMergeCommit: false,\n allowRebaseMerge: false,\n squashMergeCommitTitle: 'PR_TITLE',\n squashMergeCommitMessage: 'PR_BODY',\n};\n\nconst POLICY_ROWS: { key: keyof MergePolicy; label: string }[] = [\n { key: 'allowSquashMerge', label: 'Allow squash merge' },\n { key: 'allowMergeCommit', label: 'Allow merge commit' },\n { key: 'allowRebaseMerge', label: 'Allow rebase merge' },\n { key: 'squashMergeCommitTitle', label: 'Squash commit title' },\n { key: 'squashMergeCommitMessage', label: 'Squash commit message' },\n];\n\nfunction formatValue(value: boolean | string): string {\n return typeof value === 'boolean' ? (value ? 'Yes' : 'No') : value;\n}\n\nfunction matchesRecommended(policy: MergePolicy): boolean {\n return POLICY_ROWS.every((row) => policy[row.key] === RECOMMENDED[row.key]);\n}\n\ninterface PolicyRowProps {\n label: string;\n current: boolean | string;\n recommended: boolean | string;\n isLast: boolean;\n}\n\nconst PolicyRow = ({ label, current, recommended, isLast }: PolicyRowProps) => {\n const matches = current === recommended;\n return (\n <>\n <div className=\"flex items-center gap-3 pb-2 pt-2\">\n <span className=\"flex-1\">{label}</span>\n <span className={matches ? 'opacity-[0.65] font-normal' : 'font-semibold'}>\n {formatValue(current)}\n </span>\n {!matches && <span className=\"opacity-[0.45]\">→ {formatValue(recommended)}</span>}\n </div>\n {!isLast && <Divider />}\n </>\n );\n};\n\nexport const MergePolicySection = () => {\n const [result, setResult] = useState<MergePolicyResult | null | undefined>(undefined);\n const [applying, setApplying] = useState(false);\n const { toast } = useToast();\n\n useEffect(() => {\n fetchMergePolicy().then(setResult);\n }, []);\n\n const handleApply = async () => {\n setApplying(true);\n const applied = await applyMergePolicy();\n setApplying(false);\n if (applied?.status === 'ok') {\n setResult(applied);\n toast({ title: 'Merge policy applied', variant: 'success' });\n } else {\n toast({\n title: 'Failed to apply merge policy',\n description: applied?.status === 'unavailable' ? applied.reason : undefined,\n variant: 'error',\n });\n }\n };\n\n const upToDate = result?.status === 'ok' && matchesRecommended(result.policy);\n\n return (\n <div>\n <div className=\"mb-6\">\n <h2 className=\"m-0\">Merge Policy</h2>\n <p className=\"opacity-50 mt-1\">\n Paper Camp's canonical policy: squash-only merges, with the commit title and body taken\n from the PR.\n </p>\n </div>\n {result === undefined && <p>Loading…</p>}\n {result === null && <Alert variant=\"warning\">Failed to load merge policy.</Alert>}\n {result?.status === 'unavailable' && <Alert variant=\"warning\">{result.reason}</Alert>}\n {result?.status === 'ok' && (\n <>\n <div className=\"flex items-center gap-3 mb-3\">\n <span className=\"font-medium\">{result.repo}</span>\n <Stamp\n size=\"small\"\n fillColor={upToDate ? 'rgba(143, 185, 150, 0.25)' : 'rgba(212, 163, 115, 0.25)'}\n textColor={upToDate ? '#5E8A66' : '#A67B4F'}\n >\n {upToDate ? 'Matches recommended policy' : 'Differs from recommended policy'}\n </Stamp>\n </div>\n <Card size=\"small\" texture=\"kraft\">\n {POLICY_ROWS.map((row, idx) => (\n <PolicyRow\n key={row.key}\n label={row.label}\n current={result.policy[row.key]}\n recommended={RECOMMENDED[row.key]}\n isLast={idx === POLICY_ROWS.length - 1}\n />\n ))}\n </Card>\n <div className=\"mt-4\">\n <Button size=\"small\" onClick={handleApply} disabled={applying || upToDate}>\n {applying ? 'Applying…' : 'Apply recommended policy'}\n </Button>\n </div>\n </>\n )}\n </div>\n );\n};\n","import { connectService, fetchConfig, fetchConnections, saveConfig } from '@/app/services/system';\nimport { useAppStore } from '@/app/stores/app-store';\nimport type { CapabilityStatus, ConnectionResult } from '@/types/index';\nimport {\n Alert,\n Button,\n Card,\n CodeBlock,\n Divider,\n Stamp,\n Tooltip,\n useToast,\n} from '@dendelion/paper-ui';\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nconst RELAY_POLL_MS = 2000;\n\n// Only claude-code exposes `auth login`/`auth status` (see agentAuthenticated in server/services.ts).\nconst RELAY_CONNECTION_ID: ConnectionResult['id'] = 'agent:claude-code';\n\n// Same two commands the relay drives interactively — shown as copy-paste fallback\n// when the relay itself can't run (no PTY, offline, unsupported CLI version).\nconst AUTH_FIX_COMMANDS = ['claude auth login', 'claude setup-token'] as const;\n\nconst RelayFallbackGuide = () => (\n <div className=\"mt-2 flex flex-col gap-2\">\n <p className=\"opacity-[0.65] text-sm m-0\">\n The in-app relay couldn't complete. Run one of these in a terminal instead:\n </p>\n {AUTH_FIX_COMMANDS.map((cmd) => (\n <CodeBlock key={cmd} code={cmd} />\n ))}\n <p className=\"opacity-50 text-sm m-0\">\n {/* paper-ui has no inline-code component, only the block-level CodeBlock */}\n Alternatively, set <code>ANTHROPIC_API_KEY</code> in the server's environment — that bills as\n API usage rather than your Max subscription, so treat it as a fallback, not the default.\n </p>\n </div>\n);\n\nconst SignInAction = ({ onSignedIn }: { onSignedIn: () => void }) => {\n const loginRelay = useAppStore((s) => s.loginRelay);\n const startLoginRelay = useAppStore((s) => s.startLoginRelay);\n const loadLoginRelayStatus = useAppStore((s) => s.loadLoginRelayStatus);\n const cancelLoginRelay = useAppStore((s) => s.cancelLoginRelay);\n const { toast } = useToast();\n const openedUrlRef = useRef<string | null>(null);\n const phase = loginRelay?.phase;\n\n useEffect(() => {\n if (phase !== 'starting' && phase !== 'awaiting-authorization') return;\n const id = window.setInterval(() => loadLoginRelayStatus(), RELAY_POLL_MS);\n return () => window.clearInterval(id);\n }, [phase, loadLoginRelayStatus]);\n\n useEffect(() => {\n const url = loginRelay?.authorizeUrl;\n if (phase !== 'awaiting-authorization' || !url || openedUrlRef.current === url) return;\n openedUrlRef.current = url;\n window.open(url, '_blank', 'noopener,noreferrer');\n }, [phase, loginRelay?.authorizeUrl]);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: keyed on phase transitions only — toast/onSignedIn aren't stable across renders, and including them would refire on every relay poll\n useEffect(() => {\n if (phase === 'success') {\n toast({ title: 'Signed in', variant: 'success' });\n onSignedIn();\n } else if (phase === 'error') {\n toast({ title: 'Sign-in failed', description: loginRelay?.error, variant: 'error' });\n }\n }, [phase]);\n\n if (phase === 'starting') {\n return (\n <Button size=\"small\" disabled>\n Starting…\n </Button>\n );\n }\n if (phase === 'awaiting-authorization') {\n return (\n <div className=\"flex items-center gap-2\">\n <Button\n size=\"small\"\n onClick={() =>\n loginRelay?.authorizeUrl &&\n window.open(loginRelay.authorizeUrl, '_blank', 'noopener,noreferrer')\n }\n >\n Reopen sign-in tab\n </Button>\n <Button size=\"small\" onClick={() => cancelLoginRelay()}>\n Cancel\n </Button>\n </div>\n );\n }\n return (\n <div>\n <Button size=\"small\" onClick={() => startLoginRelay()}>\n Sign in\n </Button>\n {phase === 'error' && <RelayFallbackGuide />}\n </div>\n );\n};\n\nconst STATUS_STAMP: Record<CapabilityStatus, { fill: string; text: string; label: string }> = {\n ok: { fill: 'rgba(143, 185, 150, 0.25)', text: '#5E8A66', label: 'Ready' },\n warn: { fill: 'rgba(212, 163, 115, 0.25)', text: '#A67B4F', label: 'Needs attention' },\n missing: { fill: 'rgba(201, 139, 139, 0.25)', text: '#6E3A3A', label: 'Missing' },\n};\n\nconst ConnectActionView = ({\n connection,\n onConnect,\n connecting,\n}: {\n connection: ConnectionResult;\n onConnect: (id: string) => void;\n connecting: boolean;\n}) => {\n const { connect } = connection;\n if (!connect) return null;\n if (connect.kind === 'command' && connect.runnable) {\n return (\n <Button size=\"small\" onClick={() => onConnect(connection.id)} disabled={connecting}>\n {connecting ? 'Running…' : `Run \\`${connect.command}\\``}\n </Button>\n );\n }\n if (connect.kind === 'command') {\n return (\n <div className=\"mt-2\">\n <CodeBlock code={connect.command} />\n </div>\n );\n }\n if (connect.kind === 'link') {\n return (\n <Button\n size=\"small\"\n onClick={() => window.open(connect.url, '_blank', 'noopener,noreferrer')}\n >\n {connect.label}\n </Button>\n );\n }\n return <p className=\"opacity-[0.65] text-sm mt-2 mx-0 mb-0\">{connect.message}</p>;\n};\n\nconst ConnectionRow = ({\n connection,\n isLast,\n onRecheck,\n rechecking,\n onConnect,\n connecting,\n}: {\n connection: ConnectionResult;\n isLast: boolean;\n onRecheck: (id: string) => void;\n rechecking: boolean;\n onConnect: (id: string) => void;\n connecting: boolean;\n}) => {\n const stamp = STATUS_STAMP[connection.status];\n return (\n <>\n <div className=\"pb-3 pt-3\">\n <div className=\"flex items-center gap-3\">\n <span className=\"flex-1 font-medium\">{connection.label}</span>\n {connection.authenticated === false && (\n <Tooltip content=\"Installed, but not signed in\">\n <Stamp size=\"small\" variant=\"warning\">\n Not signed in\n </Stamp>\n </Tooltip>\n )}\n <Stamp size=\"small\" fillColor={stamp.fill} textColor={stamp.text}>\n {stamp.label}\n </Stamp>\n <Button size=\"small\" onClick={() => onRecheck(connection.id)} disabled={rechecking}>\n {rechecking ? 'Checking…' : 'Recheck'}\n </Button>\n </div>\n <p className=\"opacity-[0.65] text-sm mt-1 mx-0 mb-0\">Unlocks: {connection.unlocks}</p>\n <p className=\"opacity-50 text-sm mt-1 mx-0 mb-0\">{connection.detail}</p>\n <div className=\"mt-2\">\n {connection.id === RELAY_CONNECTION_ID && connection.authenticated === false ? (\n <SignInAction onSignedIn={() => onRecheck(connection.id)} />\n ) : (\n <ConnectActionView\n connection={connection}\n onConnect={onConnect}\n connecting={connecting}\n />\n )}\n </div>\n </div>\n {!isLast && <Divider />}\n </>\n );\n};\n\nexport const SetupSection = () => {\n const [connections, setConnections] = useState<ConnectionResult[] | null>(null);\n const [loadFailed, setLoadFailed] = useState(false);\n const [reloadingId, setReloadingId] = useState<string | null>(null);\n const [connectingId, setConnectingId] = useState<string | null>(null);\n const [setupDismissed, setSetupDismissed] = useState(false);\n const { toast } = useToast();\n\n const applyConnections = useCallback((result: ConnectionResult[] | null) => {\n if (result === null) {\n setLoadFailed(true);\n return;\n }\n setLoadFailed(false);\n setConnections(result);\n }, []);\n\n useEffect(() => {\n fetchConnections().then(applyConnections);\n fetchConfig().then((c) => setSetupDismissed(c?.setupDismissed ?? false));\n }, [applyConnections]);\n\n const handleRecheck = async (id: string) => {\n setReloadingId(id);\n applyConnections(await fetchConnections());\n setReloadingId(null);\n };\n\n const handleConnect = async (id: string) => {\n setConnectingId(id);\n const updated = await connectService(id);\n if (updated) {\n setConnections((prev) => prev?.map((c) => (c.id === id ? updated : c)) ?? prev);\n } else {\n toast({ title: 'Failed to connect', variant: 'error' });\n }\n setConnectingId(null);\n };\n\n const handleDismissToggle = async () => {\n const next = !setupDismissed;\n const { ok } = await saveConfig({ setupDismissed: next });\n if (ok) {\n setSetupDismissed(next);\n toast({ title: 'Saved', variant: 'success' });\n } else {\n toast({ title: 'Failed to save', variant: 'error' });\n }\n };\n\n const allOk = connections?.every((c) => c.status === 'ok') ?? true;\n const externalConnections = connections?.filter((c) => c.kind === 'external') ?? [];\n const localConnections = connections?.filter((c) => c.kind === 'local') ?? [];\n\n return (\n <div>\n <div className=\"mb-6\">\n <h2 className=\"m-0\">Setup</h2>\n </div>\n {connections === null && !loadFailed && <p>Loading…</p>}\n {loadFailed && (\n <div className=\"mb-4\">\n <Alert variant=\"warning\">Failed to load connections. Try refreshing.</Alert>\n </div>\n )}\n {connections && (\n <>\n {!allOk && (\n <div className=\"mb-4\">\n <Alert variant=\"warning\">\n Some connections are incomplete — features that depend on them stay disabled until\n fixed. Run the connect command below, then recheck.\n </Alert>\n </div>\n )}\n {externalConnections.length > 0 && (\n <div className=\"mb-4\">\n <p className=\"opacity-[0.45] text-sm mt-0 mb-2\">\n External services — reached on your behalf with their own remote credential.\n </p>\n <Card size=\"small\" texture=\"kraft\">\n {externalConnections.map((c, idx) => (\n <ConnectionRow\n key={c.id}\n connection={c}\n isLast={idx === externalConnections.length - 1}\n onRecheck={handleRecheck}\n rechecking={reloadingId === c.id}\n onConnect={handleConnect}\n connecting={connectingId === c.id}\n />\n ))}\n </Card>\n </div>\n )}\n {localConnections.length > 0 && (\n <div className=\"mb-4\">\n <p className=\"opacity-[0.45] text-sm mt-0 mb-2\">\n Local adapters — driven on this machine with their own local session.\n </p>\n <Card size=\"small\" texture=\"kraft\">\n {localConnections.map((c, idx) => (\n <ConnectionRow\n key={c.id}\n connection={c}\n isLast={idx === localConnections.length - 1}\n onRecheck={handleRecheck}\n rechecking={reloadingId === c.id}\n onConnect={handleConnect}\n connecting={connectingId === c.id}\n />\n ))}\n </Card>\n </div>\n )}\n <div className=\"mt-4\">\n <Button size=\"small\" onClick={handleDismissToggle}>\n {setupDismissed ? 'Show Setup on open again' : \"Don't show Setup on open\"}\n </Button>\n </div>\n </>\n )}\n </div>\n );\n};\n","import { useSubjectVocabulary } from '@/app/hooks';\nimport { Button, Card, Divider } from '@dendelion/paper-ui';\nimport { useNavigate } from '@tanstack/react-router';\n\nexport const SubjectsSection = () => {\n const { subjects, loading, available } = useSubjectVocabulary();\n const navigate = useNavigate();\n\n return (\n <div>\n <div className=\"mb-6\">\n <h2 className=\"m-0\">Subjects</h2>\n <p className=\"opacity-50 mt-1\">\n Subjects are the roadmap's bets and standing concerns. Edit the vocabulary on the Roadmap\n page.\n </p>\n </div>\n {loading && <p>Loading…</p>}\n {!loading && !available && (\n <p className=\"opacity-60 m-0\">Couldn't load subjects — check the server config.</p>\n )}\n {!loading && available && (\n <Card size=\"small\" texture=\"kraft\">\n {subjects.length === 0 && <p className=\"opacity-[0.45] m-0 pb-2\">No subjects yet.</p>}\n {subjects.map((name, idx) => (\n <div key={name}>\n <div className=\"pb-2 pt-2\">{name}</div>\n {idx < subjects.length - 1 && <Divider />}\n </div>\n ))}\n {subjects.length > 0 && <Divider />}\n <div className=\"pt-3\">\n <Button size=\"small\" onClick={() => navigate({ to: '/roadmap' })}>\n Go to Roadmap\n </Button>\n </div>\n </Card>\n )}\n </div>\n );\n};\n","import { PageTitle } from '@/app/components/page-title';\nimport { useActiveSettingsSection, useProjectIdentity } from '@/app/hooks';\nimport { fetchConfig, saveConfig, uploadIcon } from '@/app/services/system';\nimport { color } from '@/app/styles/tokens';\nimport {\n AGENT_IDS,\n AGENT_LABELS,\n AGENT_OPTIONS,\n type AgentConfig,\n type AgentId,\n DEFAULT_AGENTS,\n type DefaultAgentsMap,\n type PaperCampConfig,\n agentConfigsEqual,\n} from '@/types/index';\nimport { Alert, Button, Card, Divider, Input, Select, Stamp, useToast } from '@dendelion/paper-ui';\nimport { useEffect, useRef, useState } from 'react';\nimport { MergePolicySection } from './components/merge-policy-section';\nimport { SetupSection } from './components/setup-section';\nimport { SubjectsSection } from './components/subjects-section';\n\nconst TASK_TYPE_KEYS = [\n 'phase',\n 'planDraft',\n 'ideaExtend',\n 'commitSuggest',\n 'feedback',\n 'codeReview',\n] as const;\ntype TaskTypeKey = (typeof TASK_TYPE_KEYS)[number];\n\nconst TASK_TYPE_LABELS: Record<TaskTypeKey, string> = {\n phase: 'Phase run',\n planDraft: 'Plan draft',\n ideaExtend: 'Idea extend',\n commitSuggest: 'Commit suggest',\n feedback: 'Scout chat',\n codeReview: 'Code review',\n};\n\ninterface AgentTaskRowProps {\n taskKey: TaskTypeKey;\n agentConfig: AgentConfig;\n isLast: boolean;\n onSave: (key: TaskTypeKey, config: AgentConfig) => Promise<void>;\n /** The code-authoring task's config — codeReview's model must never match it (IDEA-170). */\n authorConfig?: AgentConfig;\n}\n\nconst TASK_COLUMN_WIDTH = 110;\nconst AGENT_COLUMN_WIDTH = 140;\nconst MODEL_COLUMN_WIDTH = 160;\nconst EFFORT_COLUMN_WIDTH = 110;\n\nconst AgentTaskRowHeader = () => (\n <div className=\"flex items-center gap-3 pb-1\">\n <span className=\"w-[110px] shrink-0 text-sm opacity-[0.45]\">Task</span>\n <span className=\"w-[140px] shrink-0 text-sm opacity-[0.45]\">Agent</span>\n <span className=\"w-[160px] shrink-0 text-sm opacity-[0.45]\">Model</span>\n <span className=\"w-[110px] shrink-0 text-sm opacity-[0.45]\">Effort</span>\n </div>\n);\n\nconst AgentTaskRow = ({\n taskKey,\n agentConfig,\n isLast,\n onSave,\n authorConfig,\n}: AgentTaskRowProps) => {\n // Fall back if the config carries an unknown agent id — never white-screen the page.\n const opts = AGENT_OPTIONS[agentConfig.agent] ?? AGENT_OPTIONS['claude-code'];\n // Only the author's model is excluded, and only while both rows share the same agent id.\n const excludedModel =\n authorConfig && authorConfig.agent === agentConfig.agent\n ? (authorConfig.model ?? '')\n : undefined;\n const modelOpts = Array.isArray(opts.model)\n ? opts.model.filter((m) => m !== excludedModel)\n : opts.model;\n const effortOpts = opts.effort;\n const [localModel, setLocalModel] = useState(agentConfig.model ?? '');\n\n useEffect(() => {\n setLocalModel(agentConfig.model ?? '');\n }, [agentConfig.model]);\n\n const handleAgentChange = (v: string) => {\n const newId = v as AgentId;\n const newOpts = AGENT_OPTIONS[newId];\n const newConfig: AgentConfig = { agent: newId };\n // Only carry the model over if the new agent accepts it — otherwise a claude\n // model like 'opus' would leak into opencode and fail at launch.\n if (\n agentConfig.model &&\n (newOpts.model === null || newOpts.model?.includes(agentConfig.model))\n ) {\n newConfig.model = agentConfig.model;\n }\n if (agentConfig.effort && Array.isArray(newOpts.effort)) newConfig.effort = agentConfig.effort;\n onSave(taskKey, newConfig);\n };\n\n const handleModelSelectChange = (v: string) => {\n onSave(taskKey, { ...agentConfig, model: v || undefined });\n };\n\n const handleModelInputBlur = () => {\n onSave(taskKey, { ...agentConfig, model: localModel || undefined });\n };\n\n const handleEffortChange = (v: string) => {\n onSave(taskKey, { ...agentConfig, effort: v || undefined });\n };\n\n return (\n <>\n <div className=\"flex items-center gap-3 pb-2 pt-2\">\n <span className=\"w-[110px] shrink-0 text-sm opacity-[0.65]\">\n {TASK_TYPE_LABELS[taskKey]}\n </span>\n <Select\n size=\"small\"\n width={AGENT_COLUMN_WIDTH}\n value={agentConfig.agent}\n onChange={handleAgentChange}\n options={AGENT_IDS.map((id) => ({ value: id, label: AGENT_LABELS[id] }))}\n />\n {Array.isArray(modelOpts) ? (\n <Select\n size=\"small\"\n width={MODEL_COLUMN_WIDTH}\n value={agentConfig.model ?? ''}\n onChange={handleModelSelectChange}\n options={[\n ...(excludedModel === '' ? [] : [{ value: '', label: 'Default' }]),\n ...modelOpts.map((m) => ({ value: m, label: m })),\n ]}\n />\n ) : modelOpts === null ? (\n <Input\n size=\"small\"\n className=\"w-[160px]\"\n value={localModel}\n placeholder=\"Default model\"\n onChange={(e) => setLocalModel(e.target.value)}\n onBlur={handleModelInputBlur}\n />\n ) : null}\n {/* Reserve the effort slot even when the agent has no effort options, so\n switching agents doesn't change the control count and shift the row. */}\n <div className={Array.isArray(effortOpts) ? 'visible' : 'invisible'}>\n <Select\n size=\"small\"\n width={EFFORT_COLUMN_WIDTH}\n value={agentConfig.effort ?? ''}\n onChange={handleEffortChange}\n options={[\n { value: '', label: 'Default' },\n ...(Array.isArray(effortOpts) ? effortOpts : []).map((e) => ({ value: e, label: e })),\n ]}\n />\n </div>\n </div>\n {!isLast && <Divider />}\n </>\n );\n};\n\nconst GeneralSection = () => {\n const fileRef = useRef<HTMLInputElement>(null);\n const [config, setConfig] = useState<PaperCampConfig | null | undefined>(undefined);\n const { iconDataUri: fetchedIconDataUri, loading: identityLoading } = useProjectIdentity();\n const [uploadedIconDataUri, setUploadedIconDataUri] = useState<string | null>(null);\n const iconDataUri = uploadedIconDataUri ?? fetchedIconDataUri;\n const [uploading, setUploading] = useState(false);\n const [portInput, setPortInput] = useState('');\n const [nameInput, setNameInput] = useState('');\n const { toast } = useToast();\n\n useEffect(() => {\n fetchConfig().then((c) => {\n setConfig(c);\n if (c?.port !== undefined) setPortInput(String(c.port));\n if (c?.projectName !== undefined) setNameInput(c.projectName);\n });\n }, []);\n\n const handleSaveAgentConfig = async (key: TaskTypeKey, newEntry: AgentConfig) => {\n const current = config?.defaultAgents;\n const updated: DefaultAgentsMap = {\n phase: current?.phase ?? DEFAULT_AGENTS.phase,\n planDraft: current?.planDraft ?? DEFAULT_AGENTS.planDraft,\n ideaExtend: current?.ideaExtend ?? DEFAULT_AGENTS.ideaExtend,\n commitSuggest: current?.commitSuggest ?? DEFAULT_AGENTS.commitSuggest,\n feedback: current?.feedback ?? DEFAULT_AGENTS.feedback,\n codeReview: current?.codeReview ?? DEFAULT_AGENTS.codeReview,\n [key]: newEntry,\n };\n if (key === 'codeReview' && agentConfigsEqual(newEntry, updated.phase)) {\n toast({\n title: 'Failed to save',\n description: 'Code review must use a different model than Phase run.',\n variant: 'error',\n });\n return;\n }\n const { ok, error } = await saveConfig({ defaultAgents: updated });\n if (ok) {\n setConfig((prev) => (prev ? { ...prev, defaultAgents: updated } : prev));\n toast({ title: 'Saved', variant: 'success' });\n } else {\n toast({ title: 'Failed to save', description: error, variant: 'error' });\n }\n };\n\n const handleSavePort = async () => {\n const port = Number(portInput);\n if (!config || !Number.isInteger(port) || port <= 0 || port === config.port) return;\n const { ok, error } = await saveConfig({ port });\n if (ok) {\n setConfig((prev) => (prev ? { ...prev, port } : prev));\n toast({\n title: 'Saved',\n description: 'Restart `paper-camp dev` to apply the new port.',\n variant: 'success',\n });\n } else {\n toast({ title: 'Failed to save', description: error, variant: 'error' });\n }\n };\n\n const handleToggleIntegration = async () => {\n if (!config) return;\n const next = !(config.integration?.toolbar?.enabled ?? true);\n const integration = {\n ...config.integration,\n toolbar: { ...config.integration?.toolbar, enabled: next },\n };\n const { ok, error } = await saveConfig({ integration });\n if (ok) {\n setConfig((prev) => (prev ? { ...prev, integration } : prev));\n toast({ title: 'Saved', variant: 'success' });\n } else {\n toast({ title: 'Failed to save', description: error, variant: 'error' });\n }\n };\n\n const handleSaveName = async () => {\n const projectName = nameInput.trim();\n if (!config || !projectName || projectName === config.projectName) return;\n const { ok, error } = await saveConfig({ projectName });\n if (ok) {\n setConfig((prev) => (prev ? { ...prev, projectName } : prev));\n setNameInput(projectName);\n toast({ title: 'Saved', variant: 'success' });\n } else {\n toast({ title: 'Failed to save', description: error, variant: 'error' });\n }\n };\n\n const handleFile = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n setUploading(true);\n const reader = new FileReader();\n reader.onloadend = async () => {\n const dataUri = reader.result as string;\n const ok = await uploadIcon(dataUri);\n setUploading(false);\n if (ok) {\n setUploadedIconDataUri(dataUri);\n toast({ title: 'Saved', variant: 'success' });\n } else {\n toast({ title: 'Failed to save', variant: 'error' });\n }\n };\n reader.readAsDataURL(file);\n };\n\n return (\n <div>\n <div className=\"mb-6\">\n <h2 className=\"m-0\">Project Info</h2>\n </div>\n {config === undefined && <p>Loading…</p>}\n {config === null && (\n <Alert variant=\"warning\">\n No papercamp/config.json found — run <code>paper-camp init</code> in this directory first.\n </Alert>\n )}\n {config && (\n <Card size=\"small\" texture=\"kraft\">\n <div className=\"flex items-end gap-3 pb-3\">\n <Input\n value={nameInput}\n onChange={(e) => setNameInput(e.target.value)}\n onBlur={handleSaveName}\n label=\"Project Name\"\n />\n <Stamp\n size=\"small\"\n fillColor=\"rgba(143, 185, 150, 0.25)\"\n textColor={color.accentGreenDark}\n >\n v{config.version}\n </Stamp>\n </div>\n <Divider />\n\n <div className=\"flex items-center gap-3 pb-3 pt-3\">\n {iconDataUri && (\n <img\n src={iconDataUri}\n alt=\"Project icon\"\n className=\"w-10 h-10 object-contain shrink-0 rounded\"\n />\n )}\n <div>\n {/* paper-ui has no file-input component, so this raw input is intentional */}\n <input\n ref={fileRef}\n type=\"file\"\n accept=\".svg,.png,.jpg,.jpeg,.gif,.webp\"\n onChange={handleFile}\n className=\"hidden\"\n />\n <Button size=\"small\" onClick={() => fileRef.current?.click()} disabled={uploading}>\n {uploading ? 'Uploading…' : 'Choose File'}\n </Button>\n {identityLoading && <p className=\"text-sm opacity-50 mt-1 mx-0 mb-0\">Loading…</p>}\n {!identityLoading && !iconDataUri && !uploading && (\n <p className=\"text-sm opacity-[0.45] mt-1 mx-0 mb-0\">No icon set.</p>\n )}\n </div>\n </div>\n <Divider />\n\n <div className=\"flex items-end gap-3 pb-3 pt-3\">\n <Input\n type=\"number\"\n value={portInput}\n onChange={(e) => setPortInput(e.target.value)}\n onBlur={handleSavePort}\n label=\"Port\"\n helperText=\"Default for `paper-camp dev`. Restart the server to apply a change.\"\n />\n </div>\n <Divider />\n\n <div className=\"flex items-center justify-between gap-3 pb-3 pt-3\">\n <div>\n <p className=\"m-0\">In-app dev toolbar</p>\n <p className=\"opacity-[0.45] text-sm mt-1 mx-0 mb-0\">\n Inject the paper-camp toolbar into this project's dev server via the Vite plugin.\n </p>\n </div>\n <Button size=\"small\" onClick={handleToggleIntegration}>\n {(config.integration?.toolbar?.enabled ?? true) ? 'Disable' : 'Enable'}\n </Button>\n </div>\n <Divider />\n\n <AgentTaskRowHeader />\n {TASK_TYPE_KEYS.map((key, idx) => (\n <AgentTaskRow\n key={key}\n taskKey={key}\n agentConfig={config.defaultAgents?.[key] ?? DEFAULT_AGENTS[key]}\n isLast={idx === TASK_TYPE_KEYS.length - 1}\n onSave={handleSaveAgentConfig}\n authorConfig={\n key === 'codeReview'\n ? (config.defaultAgents?.phase ?? DEFAULT_AGENTS.phase)\n : undefined\n }\n />\n ))}\n </Card>\n )}\n\n <p className=\"opacity-[0.45] text-sm mt-4\">\n <strong>Initialized:</strong>{' '}\n {config ? new Date(config.initializedAt).toLocaleString() : '—'}\n </p>\n </div>\n );\n};\n\nexport const SettingsPage = () => {\n const section = useActiveSettingsSection();\n return (\n <div>\n <PageTitle>Settings</PageTitle>\n {section === 'subjects' ? (\n <SubjectsSection />\n ) : section === 'setup' ? (\n <SetupSection />\n ) : section === 'merge-policy' ? (\n <MergePolicySection />\n ) : (\n <GeneralSection />\n )}\n </div>\n );\n};\n","import { useActiveSettingsSection } from '@/app/hooks';\nimport { ListItem } from '@dendelion/paper-ui';\nimport { useNavigate } from '@tanstack/react-router';\nimport { SidebarSection } from '../../plans/components/sidebar-section';\n\nexport const SettingsSidebar = () => {\n const section = useActiveSettingsSection();\n const navigate = useNavigate();\n\n return (\n <>\n <SidebarSection label=\"General\">\n <ListItem\n size=\"small\"\n className=\"pc-row text-xs\"\n active={section === null}\n onClick={() => navigate({ to: '/settings' })}\n >\n Project Info\n </ListItem>\n <ListItem\n size=\"small\"\n className=\"pc-row text-xs\"\n active={section === 'setup'}\n onClick={() => navigate({ to: '/settings/$section', params: { section: 'setup' } })}\n >\n Setup\n </ListItem>\n <ListItem\n size=\"small\"\n className=\"pc-row text-xs\"\n active={section === 'merge-policy'}\n onClick={() =>\n navigate({ to: '/settings/$section', params: { section: 'merge-policy' } })\n }\n >\n Merge Policy\n </ListItem>\n </SidebarSection>\n <SidebarSection label=\"Ideas\">\n <ListItem\n size=\"small\"\n className=\"pc-row text-xs\"\n active={section === 'subjects'}\n onClick={() => navigate({ to: '/settings/$section', params: { section: 'subjects' } })}\n >\n Subjects\n </ListItem>\n </SidebarSection>\n </>\n );\n};\n"],"names":["fetchMergePolicy","response","apiUrl","applyMergePolicy","RECOMMENDED","POLICY_ROWS","formatValue","value","matchesRecommended","policy","row","PolicyRow","label","current","recommended","isLast","matches","jsxs","Fragment","jsx","Divider","MergePolicySection","result","setResult","useState","applying","setApplying","toast","useToast","useEffect","handleApply","applied","upToDate","Alert","Stamp","Card","idx","Button","RELAY_POLL_MS","RELAY_CONNECTION_ID","AUTH_FIX_COMMANDS","RelayFallbackGuide","cmd","CodeBlock","SignInAction","onSignedIn","loginRelay","useAppStore","s","startLoginRelay","loadLoginRelayStatus","cancelLoginRelay","openedUrlRef","useRef","phase","id","url","STATUS_STAMP","ConnectActionView","connection","onConnect","connecting","connect","ConnectionRow","onRecheck","rechecking","stamp","Tooltip","SetupSection","connections","setConnections","loadFailed","setLoadFailed","reloadingId","setReloadingId","connectingId","setConnectingId","setupDismissed","setSetupDismissed","applyConnections","useCallback","fetchConnections","fetchConfig","c","handleRecheck","handleConnect","updated","connectService","prev","handleDismissToggle","next","ok","saveConfig","allOk","externalConnections","localConnections","SubjectsSection","subjects","loading","available","useSubjectVocabulary","navigate","useNavigate","name","TASK_TYPE_KEYS","TASK_TYPE_LABELS","AGENT_COLUMN_WIDTH","MODEL_COLUMN_WIDTH","EFFORT_COLUMN_WIDTH","AgentTaskRowHeader","AgentTaskRow","taskKey","agentConfig","onSave","authorConfig","opts","AGENT_OPTIONS","excludedModel","modelOpts","m","effortOpts","localModel","setLocalModel","handleAgentChange","v","newId","newOpts","newConfig","_a","handleModelSelectChange","handleModelInputBlur","handleEffortChange","Select","AGENT_IDS","AGENT_LABELS","Input","e","GeneralSection","fileRef","config","setConfig","fetchedIconDataUri","identityLoading","useProjectIdentity","uploadedIconDataUri","setUploadedIconDataUri","iconDataUri","uploading","setUploading","portInput","setPortInput","nameInput","setNameInput","handleSaveAgentConfig","key","newEntry","DEFAULT_AGENTS","agentConfigsEqual","error","handleSavePort","port","handleToggleIntegration","_b","integration","_c","handleSaveName","projectName","handleFile","file","reader","dataUri","uploadIcon","color","SettingsPage","section","useActiveSettingsSection","PageTitle","SettingsSidebar","SidebarSection","ListItem"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- import{u as h,F as v,r,j as e,P as L,R as u,z as y,g as S,q as f,G as b,J as A}from"./main-DP_okYxh.js";const T={phase:"Phase run",audit:"Audit","batch-reconcile":"Batch reconcile","batch-draft":"Batch draft","run-all":"Run all phases",draft:"Draft",extend:"Extend",suggest:"Suggest ideas","commit-suggest":"Commit suggest","overlap-check":"Overlap check",prioritise:"Prioritise queue",sync:"Sync",reconcile:"Reconcile","fix-review":"Fix review","resolve-conflict":"Resolve conflict",feedback:"Feedback reply","pr-review":"PR review","issue-fix":"Issue fix"},m=s=>String(s).padStart(2,"0"),R=s=>{const a=new Date(s);return`${a.getFullYear()}-${m(a.getMonth()+1)}-${m(a.getDate())}`},_=s=>new Date(s).toLocaleDateString(void 0,{weekday:"long",year:"numeric",month:"long",day:"numeric"}),k=s=>{const a=new Date(s);return`${m(a.getHours())}:${m(a.getMinutes())}:${m(a.getSeconds())}`},p="text-sm font-semibold whitespace-nowrap overflow-hidden",N="grid grid-cols-[20px_116px_minmax(0,1fr)_88px_150px_72px] gap-2.5 items-center max-lg:grid-cols-[20px_116px_minmax(0,1fr)_88px_72px] max-[480px]:grid-cols-1 max-[480px]:gap-1",D=({id:s})=>{const[a,c]=r.useState(null),[l,i]=r.useState(!1),[o,x]=r.useState(0);r.useEffect(()=>{let n=!1,d;c(null),i(!1);const g=j=>{b(s).then(w=>{n||c(w.lines??[])}).catch(()=>{if(!n){if(j>0){d=setTimeout(()=>g(j-1),700);return}i(!0),c([])}})};return g(3),()=>{n=!0,d&&clearTimeout(d)}},[s,o]);const t=e.jsx(A,{variant:"ghost",size:"small",onClick:()=>x(n=>n+1),children:"Retry"});return a===null?e.jsx("p",{className:"opacity-50 m-0",children:"Loading…"}):l?e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("p",{className:"opacity-50 m-0",children:"Couldn't load this task's output."}),t]}):a.length===0?e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("p",{className:"opacity-50 m-0",children:"No output recorded."}),t]}):e.jsx("pre",{className:"font-mono text-xs m-0 max-h-[320px] overflow-y-auto whitespace-pre-wrap",children:a.join(`
1
+ import{u as h,E as v,r,j as e,P as L,R as u,z as y,g as S,q as f,F as b,J as A}from"./main-s2b5XHSS.js";const T={phase:"Phase run",audit:"Audit","batch-reconcile":"Batch reconcile","batch-draft":"Batch draft","run-all":"Run all phases",draft:"Draft",extend:"Extend",suggest:"Suggest ideas","commit-suggest":"Commit suggest","overlap-check":"Overlap check",prioritise:"Prioritise queue",sync:"Sync",reconcile:"Reconcile","fix-review":"Fix review","resolve-conflict":"Resolve conflict",feedback:"Feedback reply","pr-review":"PR review","issue-fix":"Issue fix"},m=s=>String(s).padStart(2,"0"),R=s=>{const a=new Date(s);return`${a.getFullYear()}-${m(a.getMonth()+1)}-${m(a.getDate())}`},_=s=>new Date(s).toLocaleDateString(void 0,{weekday:"long",year:"numeric",month:"long",day:"numeric"}),k=s=>{const a=new Date(s);return`${m(a.getHours())}:${m(a.getMinutes())}:${m(a.getSeconds())}`},p="text-sm font-semibold whitespace-nowrap overflow-hidden",N="grid grid-cols-[20px_116px_minmax(0,1fr)_88px_150px_72px] gap-2.5 items-center max-lg:grid-cols-[20px_116px_minmax(0,1fr)_88px_72px] max-[480px]:grid-cols-1 max-[480px]:gap-1",D=({id:s})=>{const[a,c]=r.useState(null),[l,i]=r.useState(!1),[o,x]=r.useState(0);r.useEffect(()=>{let n=!1,d;c(null),i(!1);const g=j=>{b(s).then(w=>{n||c(w.lines??[])}).catch(()=>{if(!n){if(j>0){d=setTimeout(()=>g(j-1),700);return}i(!0),c([])}})};return g(3),()=>{n=!0,d&&clearTimeout(d)}},[s,o]);const t=e.jsx(A,{variant:"ghost",size:"small",onClick:()=>x(n=>n+1),children:"Retry"});return a===null?e.jsx("p",{className:"opacity-50 m-0",children:"Loading…"}):l?e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("p",{className:"opacity-50 m-0",children:"Couldn't load this task's output."}),t]}):a.length===0?e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("p",{className:"opacity-50 m-0",children:"No output recorded."}),t]}):e.jsx("pre",{className:"font-mono text-xs m-0 max-h-[320px] overflow-y-auto whitespace-pre-wrap",children:a.join(`
2
2
  `)})},E=({size:s=14,className:a})=>e.jsx("svg",{width:s,height:s,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",className:a,children:e.jsx("polyline",{points:"9 18 15 12 9 6"})}),$=({entry:s,highlighted:a})=>{const[c,l]=r.useState(a);r.useEffect(()=>{a&&l(!0)},[a]);const i=()=>l(o=>!o);return e.jsxs("div",{className:a?"task-row-highlighted flex flex-col gap-1 rounded-[10px] outline outline-2 outline-offset-[-2px] outline-[rgba(200,154,90,0.5)]":"flex flex-col gap-1 rounded-[10px]",children:[e.jsx("div",{role:"button",tabIndex:0,"aria-expanded":c,onClick:i,onKeyDown:o=>{(o.key==="Enter"||o.key===" ")&&(o.preventDefault(),i())},className:"group cursor-pointer rounded-[10px]",children:e.jsx(u,{size:"small",texture:"canvas",className:"plan-row-card",children:e.jsxs("div",{className:N,children:[e.jsx("span",{className:"inline-flex items-center opacity-50",children:e.jsx(E,{className:"group-aria-expanded:rotate-90"})}),e.jsx("span",{className:"font-semibold whitespace-nowrap overflow-hidden",children:T[s.taskKind]??s.taskKind}),e.jsx("span",{className:"overflow-hidden text-ellipsis whitespace-nowrap opacity-70",children:s.planTitle}),e.jsx("span",{className:"text-sm opacity-50 whitespace-nowrap",children:y[s.agentId]}),e.jsxs("span",{className:"max-lg:hidden font-mono text-xs opacity-[0.55] whitespace-nowrap",children:[k(s.startedAt),"–",k(s.endedAt)]}),e.jsx("div",{className:"flex items-center",children:e.jsx(S,{size:"small",fillColor:s.outcome==="done"?"rgba(143, 185, 150, 0.25)":s.outcome==="superseded"?"rgba(212, 163, 115, 0.25)":"rgba(201, 139, 139, 0.25)",textColor:s.outcome==="done"?f.accentGreenDark:s.outcome==="superseded"?f.accentAmberDark:f.accentRoseDark,children:s.outcome})})]})})}),c&&e.jsxs(u,{size:"small",texture:"kraft",className:"plan-row-card",children:[s.outcome==="error"&&s.reason&&e.jsx("p",{className:"m-0 mb-2 text-sm text-state-danger",children:s.reason}),e.jsx(D,{id:s.id})]})]})},I=()=>{const s=h(t=>t.taskLog),a=h(t=>t.taskLogLoading),c=h(t=>t.loadTaskLog),{taskId:l}=v({from:"/tasks"}),i=r.useRef(null);r.useEffect(()=>{c()},[c]),r.useEffect(()=>{var n;if(!l)return;const t=(n=i.current)==null?void 0:n.querySelector(".task-row-highlighted");t==null||t.scrollIntoView({behavior:"smooth",block:"center"})},[l]);const o=[...s].sort((t,n)=>n.endedAt.localeCompare(t.endedAt)),x=[];for(const t of o){const n=R(t.endedAt),d=x.at(-1);(d==null?void 0:d.key)===n?d.entries.push(t):x.push({key:n,entries:[t]})}return e.jsxs("div",{ref:i,children:[e.jsx(L,{children:"Tasks"}),a&&e.jsx("p",{className:"opacity-50",children:"Loading…"}),!a&&o.length===0&&e.jsx("p",{className:"opacity-50",children:"No tasks have run yet."}),!a&&o.length>0&&e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx(u,{size:"small",texture:"kraft",className:"plan-row-card",children:e.jsxs("div",{className:N,children:[e.jsx("span",{}),e.jsx("span",{className:`${p} opacity-60`,children:"Task"}),e.jsx("span",{className:`${p} opacity-60`,children:"Plan"}),e.jsx("span",{className:`${p} opacity-60`,children:"Agent"}),e.jsx("span",{className:`max-lg:hidden ${p} opacity-60`,children:"Time"}),e.jsx("span",{className:`${p} opacity-60`,children:"Outcome"})]})}),x.map(t=>e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx(u,{size:"small",texture:"kraft",className:"plan-row-card",children:e.jsx("span",{className:`${p} opacity-75`,children:_(t.entries[0].endedAt)})}),t.entries.map(n=>e.jsx($,{entry:n,highlighted:n.id===l},n.id))]},t.key))]})]})};export{I as TasksPage};
3
- //# sourceMappingURL=index-DMDqfoCe.js.map
3
+ //# sourceMappingURL=index-vgBxkLmQ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-DMDqfoCe.js","sources":["../../../src/app/features/tasks/tasks-page.tsx"],"sourcesContent":["import { PageTitle } from '@/app/components/page-title';\nimport { fetchTaskLogLines } from '@/app/services/content/docs-api';\nimport { useAppStore } from '@/app/stores/app-store';\nimport { color } from '@/app/styles/tokens';\nimport { AGENT_LABELS, type TaskKind, type TaskLogEntry } from '@/types/index';\nimport { Button, Card, Stamp } from '@dendelion/paper-ui';\nimport { useSearch } from '@tanstack/react-router';\nimport { useEffect, useRef, useState } from 'react';\n\nconst TASK_KIND_LABELS: Record<TaskKind, string> = {\n phase: 'Phase run',\n audit: 'Audit',\n 'batch-reconcile': 'Batch reconcile',\n 'batch-draft': 'Batch draft',\n 'run-all': 'Run all phases',\n draft: 'Draft',\n extend: 'Extend',\n suggest: 'Suggest ideas',\n 'commit-suggest': 'Commit suggest',\n 'overlap-check': 'Overlap check',\n prioritise: 'Prioritise queue',\n sync: 'Sync',\n reconcile: 'Reconcile',\n 'fix-review': 'Fix review',\n 'resolve-conflict': 'Resolve conflict',\n feedback: 'Feedback reply',\n 'pr-review': 'PR review',\n 'issue-fix': 'Issue fix',\n};\n\nconst pad = (n: number) => String(n).padStart(2, '0');\n\nconst dayKey = (iso: string) => {\n const d = new Date(iso);\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\n};\n\nconst formatDayHeader = (iso: string) =>\n new Date(iso).toLocaleDateString(undefined, {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n });\n\nconst formatTime = (iso: string) => {\n const d = new Date(iso);\n return `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;\n};\n\nconst headerLabelClassName = 'text-sm font-semibold whitespace-nowrap overflow-hidden';\n\nconst TASK_ROWS_GRID_CLASS =\n 'grid grid-cols-[20px_116px_minmax(0,1fr)_88px_150px_72px] gap-2.5 items-center max-lg:grid-cols-[20px_116px_minmax(0,1fr)_88px_72px] max-[480px]:grid-cols-1 max-[480px]:gap-1';\n\nconst TaskLogLines = ({ id }: { id: string }) => {\n const [lines, setLines] = useState<string[] | null>(null);\n const [failed, setFailed] = useState(false);\n const [attempt, setAttempt] = useState(0);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: attempt is the retry trigger (re-runs the fetch), not a value read in the body.\n useEffect(() => {\n let cancelled = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n setLines(null);\n setFailed(false);\n // Auto-retry first (dev server briefly drops requests on hot reload); manual Retry only if it stays down.\n const load = (remaining: number) => {\n fetchTaskLogLines(id)\n .then((data) => {\n if (cancelled) return;\n setLines(data.lines ?? []);\n })\n .catch(() => {\n if (cancelled) return;\n if (remaining > 0) {\n timer = setTimeout(() => load(remaining - 1), 700);\n return;\n }\n // Empty result != failed request: conflating them mislabels a fetch error as \"no output\".\n setFailed(true);\n setLines([]);\n });\n };\n load(3);\n return () => {\n cancelled = true;\n if (timer) clearTimeout(timer);\n };\n }, [id, attempt]);\n\n const retry = (\n <Button variant=\"ghost\" size=\"small\" onClick={() => setAttempt((n) => n + 1)}>\n Retry\n </Button>\n );\n\n if (lines === null) return <p className=\"opacity-50 m-0\">Loading…</p>;\n if (failed)\n return (\n <div className=\"flex items-center gap-2\">\n <p className=\"opacity-50 m-0\">Couldn't load this task's output.</p>\n {retry}\n </div>\n );\n if (lines.length === 0)\n return (\n <div className=\"flex items-center gap-2\">\n <p className=\"opacity-50 m-0\">No output recorded.</p>\n {retry}\n </div>\n );\n return (\n <pre className=\"font-mono text-xs m-0 max-h-[320px] overflow-y-auto whitespace-pre-wrap\">\n {lines.join('\\n')}\n </pre>\n );\n};\n\nconst ChevronRightIcon = ({ size = 14, className }: { size?: number; className?: string }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n className={className}\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n);\n\nconst TaskRow = ({ entry, highlighted }: { entry: TaskLogEntry; highlighted: boolean }) => {\n const [expanded, setExpanded] = useState(highlighted);\n useEffect(() => {\n if (highlighted) setExpanded(true);\n }, [highlighted]);\n const toggle = () => setExpanded((v) => !v);\n\n return (\n <div\n className={\n highlighted\n ? 'task-row-highlighted flex flex-col gap-1 rounded-[10px] outline outline-2 outline-offset-[-2px] outline-[rgba(200,154,90,0.5)]'\n : 'flex flex-col gap-1 rounded-[10px]'\n }\n >\n {/* biome-ignore lint/a11y/useSemanticElements: the clickable row wraps a Card whose block layout a native <button> would break; keyboard toggling is wired on the div. */}\n <div\n role=\"button\"\n tabIndex={0}\n aria-expanded={expanded}\n onClick={toggle}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n toggle();\n }\n }}\n className=\"group cursor-pointer rounded-[10px]\"\n >\n <Card size=\"small\" texture=\"canvas\" className=\"plan-row-card\">\n <div className={TASK_ROWS_GRID_CLASS}>\n <span className=\"inline-flex items-center opacity-50\">\n <ChevronRightIcon className=\"group-aria-expanded:rotate-90\" />\n </span>\n <span className=\"font-semibold whitespace-nowrap overflow-hidden\">\n {TASK_KIND_LABELS[entry.taskKind] ?? entry.taskKind}\n </span>\n <span className=\"overflow-hidden text-ellipsis whitespace-nowrap opacity-70\">\n {entry.planTitle}\n </span>\n <span className=\"text-sm opacity-50 whitespace-nowrap\">\n {AGENT_LABELS[entry.agentId]}\n </span>\n <span className=\"max-lg:hidden font-mono text-xs opacity-[0.55] whitespace-nowrap\">\n {formatTime(entry.startedAt)}–{formatTime(entry.endedAt)}\n </span>\n <div className=\"flex items-center\">\n <Stamp\n size=\"small\"\n fillColor={\n entry.outcome === 'done'\n ? 'rgba(143, 185, 150, 0.25)'\n : entry.outcome === 'superseded'\n ? 'rgba(212, 163, 115, 0.25)'\n : 'rgba(201, 139, 139, 0.25)'\n }\n textColor={\n entry.outcome === 'done'\n ? color.accentGreenDark\n : entry.outcome === 'superseded'\n ? color.accentAmberDark\n : color.accentRoseDark\n }\n >\n {entry.outcome}\n </Stamp>\n </div>\n </div>\n </Card>\n </div>\n {expanded && (\n <Card size=\"small\" texture=\"kraft\" className=\"plan-row-card\">\n {entry.outcome === 'error' && entry.reason && (\n <p className=\"m-0 mb-2 text-sm text-state-danger\">{entry.reason}</p>\n )}\n <TaskLogLines id={entry.id} />\n </Card>\n )}\n </div>\n );\n};\n\nexport const TasksPage = () => {\n const taskLog = useAppStore((s) => s.taskLog);\n const taskLogLoading = useAppStore((s) => s.taskLogLoading);\n const loadTaskLog = useAppStore((s) => s.loadTaskLog);\n const { taskId } = useSearch({ from: '/tasks' });\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n loadTaskLog();\n }, [loadTaskLog]);\n\n useEffect(() => {\n if (!taskId) return;\n const row = containerRef.current?.querySelector('.task-row-highlighted');\n row?.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }, [taskId]);\n\n const sorted = [...taskLog].sort((a, b) => b.endedAt.localeCompare(a.endedAt));\n\n const groups: { key: string; entries: TaskLogEntry[] }[] = [];\n for (const entry of sorted) {\n const key = dayKey(entry.endedAt);\n const group = groups.at(-1);\n if (group?.key === key) group.entries.push(entry);\n else groups.push({ key, entries: [entry] });\n }\n\n return (\n <div ref={containerRef}>\n <PageTitle>Tasks</PageTitle>\n {taskLogLoading && <p className=\"opacity-50\">Loading…</p>}\n {!taskLogLoading && sorted.length === 0 && (\n <p className=\"opacity-50\">No tasks have run yet.</p>\n )}\n {!taskLogLoading && sorted.length > 0 && (\n <div className=\"flex flex-col gap-1\">\n <Card size=\"small\" texture=\"kraft\" className=\"plan-row-card\">\n <div className={TASK_ROWS_GRID_CLASS}>\n <span />\n <span className={`${headerLabelClassName} opacity-60`}>Task</span>\n <span className={`${headerLabelClassName} opacity-60`}>Plan</span>\n <span className={`${headerLabelClassName} opacity-60`}>Agent</span>\n <span className={`max-lg:hidden ${headerLabelClassName} opacity-60`}>Time</span>\n <span className={`${headerLabelClassName} opacity-60`}>Outcome</span>\n </div>\n </Card>\n {groups.map((group) => (\n <div key={group.key} className=\"flex flex-col gap-1\">\n <Card size=\"small\" texture=\"kraft\" className=\"plan-row-card\">\n <span className={`${headerLabelClassName} opacity-75`}>\n {formatDayHeader(group.entries[0].endedAt)}\n </span>\n </Card>\n {group.entries.map((entry) => (\n <TaskRow key={entry.id} entry={entry} highlighted={entry.id === taskId} />\n ))}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n};\n"],"names":["TASK_KIND_LABELS","pad","n","dayKey","iso","d","formatDayHeader","formatTime","headerLabelClassName","TASK_ROWS_GRID_CLASS","TaskLogLines","id","lines","setLines","useState","failed","setFailed","attempt","setAttempt","useEffect","cancelled","timer","load","remaining","fetchTaskLogLines","data","retry","jsx","Button","jsxs","ChevronRightIcon","size","className","TaskRow","entry","highlighted","expanded","setExpanded","toggle","v","e","Card","AGENT_LABELS","Stamp","color","TasksPage","taskLog","useAppStore","s","taskLogLoading","loadTaskLog","taskId","useSearch","containerRef","useRef","row","_a","sorted","a","b","groups","key","group","PageTitle"],"mappings":"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"}
1
+ {"version":3,"file":"index-vgBxkLmQ.js","sources":["../../../src/app/features/tasks/tasks-page.tsx"],"sourcesContent":["import { PageTitle } from '@/app/components/page-title';\nimport { fetchTaskLogLines } from '@/app/services/content/docs-api';\nimport { useAppStore } from '@/app/stores/app-store';\nimport { color } from '@/app/styles/tokens';\nimport { AGENT_LABELS, type TaskKind, type TaskLogEntry } from '@/types/index';\nimport { Button, Card, Stamp } from '@dendelion/paper-ui';\nimport { useSearch } from '@tanstack/react-router';\nimport { useEffect, useRef, useState } from 'react';\n\nconst TASK_KIND_LABELS: Record<TaskKind, string> = {\n phase: 'Phase run',\n audit: 'Audit',\n 'batch-reconcile': 'Batch reconcile',\n 'batch-draft': 'Batch draft',\n 'run-all': 'Run all phases',\n draft: 'Draft',\n extend: 'Extend',\n suggest: 'Suggest ideas',\n 'commit-suggest': 'Commit suggest',\n 'overlap-check': 'Overlap check',\n prioritise: 'Prioritise queue',\n sync: 'Sync',\n reconcile: 'Reconcile',\n 'fix-review': 'Fix review',\n 'resolve-conflict': 'Resolve conflict',\n feedback: 'Feedback reply',\n 'pr-review': 'PR review',\n 'issue-fix': 'Issue fix',\n};\n\nconst pad = (n: number) => String(n).padStart(2, '0');\n\nconst dayKey = (iso: string) => {\n const d = new Date(iso);\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\n};\n\nconst formatDayHeader = (iso: string) =>\n new Date(iso).toLocaleDateString(undefined, {\n weekday: 'long',\n year: 'numeric',\n month: 'long',\n day: 'numeric',\n });\n\nconst formatTime = (iso: string) => {\n const d = new Date(iso);\n return `${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;\n};\n\nconst headerLabelClassName = 'text-sm font-semibold whitespace-nowrap overflow-hidden';\n\nconst TASK_ROWS_GRID_CLASS =\n 'grid grid-cols-[20px_116px_minmax(0,1fr)_88px_150px_72px] gap-2.5 items-center max-lg:grid-cols-[20px_116px_minmax(0,1fr)_88px_72px] max-[480px]:grid-cols-1 max-[480px]:gap-1';\n\nconst TaskLogLines = ({ id }: { id: string }) => {\n const [lines, setLines] = useState<string[] | null>(null);\n const [failed, setFailed] = useState(false);\n const [attempt, setAttempt] = useState(0);\n\n // biome-ignore lint/correctness/useExhaustiveDependencies: attempt is the retry trigger (re-runs the fetch), not a value read in the body.\n useEffect(() => {\n let cancelled = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n setLines(null);\n setFailed(false);\n // Auto-retry first (dev server briefly drops requests on hot reload); manual Retry only if it stays down.\n const load = (remaining: number) => {\n fetchTaskLogLines(id)\n .then((data) => {\n if (cancelled) return;\n setLines(data.lines ?? []);\n })\n .catch(() => {\n if (cancelled) return;\n if (remaining > 0) {\n timer = setTimeout(() => load(remaining - 1), 700);\n return;\n }\n // Empty result != failed request: conflating them mislabels a fetch error as \"no output\".\n setFailed(true);\n setLines([]);\n });\n };\n load(3);\n return () => {\n cancelled = true;\n if (timer) clearTimeout(timer);\n };\n }, [id, attempt]);\n\n const retry = (\n <Button variant=\"ghost\" size=\"small\" onClick={() => setAttempt((n) => n + 1)}>\n Retry\n </Button>\n );\n\n if (lines === null) return <p className=\"opacity-50 m-0\">Loading…</p>;\n if (failed)\n return (\n <div className=\"flex items-center gap-2\">\n <p className=\"opacity-50 m-0\">Couldn't load this task's output.</p>\n {retry}\n </div>\n );\n if (lines.length === 0)\n return (\n <div className=\"flex items-center gap-2\">\n <p className=\"opacity-50 m-0\">No output recorded.</p>\n {retry}\n </div>\n );\n return (\n <pre className=\"font-mono text-xs m-0 max-h-[320px] overflow-y-auto whitespace-pre-wrap\">\n {lines.join('\\n')}\n </pre>\n );\n};\n\nconst ChevronRightIcon = ({ size = 14, className }: { size?: number; className?: string }) => (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n className={className}\n >\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n);\n\nconst TaskRow = ({ entry, highlighted }: { entry: TaskLogEntry; highlighted: boolean }) => {\n const [expanded, setExpanded] = useState(highlighted);\n useEffect(() => {\n if (highlighted) setExpanded(true);\n }, [highlighted]);\n const toggle = () => setExpanded((v) => !v);\n\n return (\n <div\n className={\n highlighted\n ? 'task-row-highlighted flex flex-col gap-1 rounded-[10px] outline outline-2 outline-offset-[-2px] outline-[rgba(200,154,90,0.5)]'\n : 'flex flex-col gap-1 rounded-[10px]'\n }\n >\n {/* biome-ignore lint/a11y/useSemanticElements: the clickable row wraps a Card whose block layout a native <button> would break; keyboard toggling is wired on the div. */}\n <div\n role=\"button\"\n tabIndex={0}\n aria-expanded={expanded}\n onClick={toggle}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n toggle();\n }\n }}\n className=\"group cursor-pointer rounded-[10px]\"\n >\n <Card size=\"small\" texture=\"canvas\" className=\"plan-row-card\">\n <div className={TASK_ROWS_GRID_CLASS}>\n <span className=\"inline-flex items-center opacity-50\">\n <ChevronRightIcon className=\"group-aria-expanded:rotate-90\" />\n </span>\n <span className=\"font-semibold whitespace-nowrap overflow-hidden\">\n {TASK_KIND_LABELS[entry.taskKind] ?? entry.taskKind}\n </span>\n <span className=\"overflow-hidden text-ellipsis whitespace-nowrap opacity-70\">\n {entry.planTitle}\n </span>\n <span className=\"text-sm opacity-50 whitespace-nowrap\">\n {AGENT_LABELS[entry.agentId]}\n </span>\n <span className=\"max-lg:hidden font-mono text-xs opacity-[0.55] whitespace-nowrap\">\n {formatTime(entry.startedAt)}–{formatTime(entry.endedAt)}\n </span>\n <div className=\"flex items-center\">\n <Stamp\n size=\"small\"\n fillColor={\n entry.outcome === 'done'\n ? 'rgba(143, 185, 150, 0.25)'\n : entry.outcome === 'superseded'\n ? 'rgba(212, 163, 115, 0.25)'\n : 'rgba(201, 139, 139, 0.25)'\n }\n textColor={\n entry.outcome === 'done'\n ? color.accentGreenDark\n : entry.outcome === 'superseded'\n ? color.accentAmberDark\n : color.accentRoseDark\n }\n >\n {entry.outcome}\n </Stamp>\n </div>\n </div>\n </Card>\n </div>\n {expanded && (\n <Card size=\"small\" texture=\"kraft\" className=\"plan-row-card\">\n {entry.outcome === 'error' && entry.reason && (\n <p className=\"m-0 mb-2 text-sm text-state-danger\">{entry.reason}</p>\n )}\n <TaskLogLines id={entry.id} />\n </Card>\n )}\n </div>\n );\n};\n\nexport const TasksPage = () => {\n const taskLog = useAppStore((s) => s.taskLog);\n const taskLogLoading = useAppStore((s) => s.taskLogLoading);\n const loadTaskLog = useAppStore((s) => s.loadTaskLog);\n const { taskId } = useSearch({ from: '/tasks' });\n const containerRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n loadTaskLog();\n }, [loadTaskLog]);\n\n useEffect(() => {\n if (!taskId) return;\n const row = containerRef.current?.querySelector('.task-row-highlighted');\n row?.scrollIntoView({ behavior: 'smooth', block: 'center' });\n }, [taskId]);\n\n const sorted = [...taskLog].sort((a, b) => b.endedAt.localeCompare(a.endedAt));\n\n const groups: { key: string; entries: TaskLogEntry[] }[] = [];\n for (const entry of sorted) {\n const key = dayKey(entry.endedAt);\n const group = groups.at(-1);\n if (group?.key === key) group.entries.push(entry);\n else groups.push({ key, entries: [entry] });\n }\n\n return (\n <div ref={containerRef}>\n <PageTitle>Tasks</PageTitle>\n {taskLogLoading && <p className=\"opacity-50\">Loading…</p>}\n {!taskLogLoading && sorted.length === 0 && (\n <p className=\"opacity-50\">No tasks have run yet.</p>\n )}\n {!taskLogLoading && sorted.length > 0 && (\n <div className=\"flex flex-col gap-1\">\n <Card size=\"small\" texture=\"kraft\" className=\"plan-row-card\">\n <div className={TASK_ROWS_GRID_CLASS}>\n <span />\n <span className={`${headerLabelClassName} opacity-60`}>Task</span>\n <span className={`${headerLabelClassName} opacity-60`}>Plan</span>\n <span className={`${headerLabelClassName} opacity-60`}>Agent</span>\n <span className={`max-lg:hidden ${headerLabelClassName} opacity-60`}>Time</span>\n <span className={`${headerLabelClassName} opacity-60`}>Outcome</span>\n </div>\n </Card>\n {groups.map((group) => (\n <div key={group.key} className=\"flex flex-col gap-1\">\n <Card size=\"small\" texture=\"kraft\" className=\"plan-row-card\">\n <span className={`${headerLabelClassName} opacity-75`}>\n {formatDayHeader(group.entries[0].endedAt)}\n </span>\n </Card>\n {group.entries.map((entry) => (\n <TaskRow key={entry.id} entry={entry} highlighted={entry.id === taskId} />\n ))}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n};\n"],"names":["TASK_KIND_LABELS","pad","n","dayKey","iso","d","formatDayHeader","formatTime","headerLabelClassName","TASK_ROWS_GRID_CLASS","TaskLogLines","id","lines","setLines","useState","failed","setFailed","attempt","setAttempt","useEffect","cancelled","timer","load","remaining","fetchTaskLogLines","data","retry","jsx","Button","jsxs","ChevronRightIcon","size","className","TaskRow","entry","highlighted","expanded","setExpanded","toggle","v","e","Card","AGENT_LABELS","Stamp","color","TasksPage","taskLog","useAppStore","s","taskLogLoading","loadTaskLog","taskId","useSearch","containerRef","useRef","row","_a","sorted","a","b","groups","key","group","PageTitle"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ @charset "UTF-8";*,: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:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";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:JetBrains Mono,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%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.bottom-1\/4{bottom:25%}.left-1\/2{left:50%}.left-1\/4{left:25%}.right-1\/4{right:25%}.top-1\/2{top:50%}.top-1\/4{top:25%}.top-28{top:7rem}.z-50{z-index:50}.m-2{margin:.5rem}.mx-auto{margin-left:auto;margin-right:auto}.mb-10{margin-bottom:2.5rem}.mb-12{margin-bottom:3rem}.mb-16{margin-bottom:4rem}.ml-2{margin-left:.5rem}.mt-8{margin-top:2rem}.inline-block{display:inline-block}.list-item{display:list-item}.h-20{height:5rem}.h-24{height:6rem}.h-3{height:.75rem}.h-4{height:1rem}.h-40{height:10rem}.h-5{height:1.25rem}.h-96{height:24rem}.h-\[600px\]{height:600px}.max-h-\[calc\(100vh-10rem\)\]{max-height:calc(100vh - 10rem)}.min-h-\[140px\]{min-height:140px}.min-h-\[calc\(100vh-80px\)\]{min-height:calc(100vh - 80px)}.w-1\.5{width:.375rem}.w-14{width:3.5rem}.w-16{width:4rem}.w-3{width:.75rem}.w-32{width:8rem}.w-72{width:18rem}.w-96{width:24rem}.w-\[600px\]{width:600px}.w-px{width:1px}.max-w-2xl{max-width:42rem}.max-w-6xl{max-width:72rem}.max-w-7xl{max-width:80rem}.max-w-xl{max-width:36rem}.-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))}.resize{resize:both}.scroll-mt-24{scroll-margin-top:6rem}.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))}.gap-10{gap:2.5rem}.gap-12{gap:3rem}.gap-8{gap:2rem}.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-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.5rem * 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-20>: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-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-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.rounded-2xl{border-radius:1rem}.rounded-lg{border-radius:.5rem}.rounded-none{border-radius:0}.rounded-sm{border-radius:.125rem}.rounded-xl{border-radius:.75rem}.border-t{border-top-width:1px}.border-ink-100{--tw-border-opacity: 1;border-color:rgb(229 227 223 / var(--tw-border-opacity))}.bg-canvas-200{--tw-bg-opacity: 1;background-color:rgb(240 234 216 / var(--tw-bg-opacity))}.bg-paper-100{--tw-bg-opacity: 1;background-color:rgb(250 248 240 / var(--tw-bg-opacity))}.bg-paper-50{--tw-bg-opacity: 1;background-color:rgb(253 252 248 / var(--tw-bg-opacity))}.bg-canvas-weave{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='cv'%3E%3CfeTurbulence type='turbulence' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix type='matrix' values='0 0 0 0 0.62 0 0 0 0 0.60 0 0 0 0 0.52 0 0 0 0.42 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23cv)' opacity='1'/%3E%3C/svg%3E")}.bg-kraft-texture{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='k'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix type='matrix' values='0 0 0 0 0.50 0 0 0 0 0.35 0 0 0 0 0.20 0 0 0 0.55 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23k)' opacity='1'/%3E%3C/svg%3E")}.bg-paper-texture{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)' opacity='0.04'/%3E%3C/svg%3E")}.bg-parchment-texture{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='p'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.7' numOctaves='5' stitchTiles='stitch'/%3E%3CfeColorMatrix type='matrix' values='0 0 0 0 0.55 0 0 0 0 0.48 0 0 0 0 0.35 0 0 0 0.45 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23p)' opacity='1'/%3E%3C/svg%3E")}.bg-speckle-texture{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='speckle'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.4' numOctaves='1' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23speckle)' opacity='0.14'/%3E%3C/svg%3E")}.p-10{padding:2.5rem}.p-3{padding:.75rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-4{padding-top:1rem;padding-bottom:1rem}.pb-24{padding-bottom:6rem}.pb-40{padding-bottom:10rem}.pr-5{padding-right:1.25rem}.font-display{font-family:Luminari,Cormorant Garamond,Georgia,serif}.font-mono{font-family:JetBrains Mono,monospace}.font-serif{font-family:Cormorant Garamond,Georgia,serif}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-5xl{font-size:3rem;line-height:1}.text-7xl{font-size:4.5rem;line-height:1}.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}.capitalize{text-transform:capitalize}.tracking-tight{letter-spacing:-.025em}.tracking-wider{letter-spacing:.05em}.text-black\/60{color:#0009}.text-black\/80{color:#000c}.text-ink-600{--tw-text-opacity: 1;color:rgb(80 76 70 / var(--tw-text-opacity))}.text-ink-900{--tw-text-opacity: 1;color:rgb(26 25 23 / var(--tw-text-opacity))}.text-watercolor-rose{--tw-text-opacity: 1;color:rgb(201 139 139 / var(--tw-text-opacity))}.text-white\/60{color:#fff9}.text-white\/80{color:#fffc}.accent-\[\#8FB996\]{accent-color:#8FB996}.shadow-ink-sm{--tw-shadow: 0 1px 2px rgba(26, 25, 23, .12);--tw-shadow-colored: 0 1px 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-paper-lg{--tw-shadow: 0 10px 15px rgba(61, 53, 43, .1), 0 4px 6px rgba(61, 53, 43, .08);--tw-shadow-colored: 0 10px 15px var(--tw-shadow-color), 0 4px 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-paper-md{--tw-shadow: 0 4px 6px rgba(61, 53, 43, .08), 0 2px 4px rgba(61, 53, 43, .06);--tw-shadow-colored: 0 4px 6px var(--tw-shadow-color), 0 2px 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-paper-sm{--tw-shadow: 0 1px 2px rgba(61, 53, 43, .08), 0 1px 1px rgba(61, 53, 43, .06);--tw-shadow-colored: 0 1px 2px var(--tw-shadow-color), 0 1px 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-pressed{--tw-shadow: inset 0 2px 4px rgba(61, 53, 43, .15);--tw-shadow-colored: inset 0 2px 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)}.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)}.blur-3xl{--tw-blur: blur(64px);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)}.drop-shadow{--tw-drop-shadow: drop-shadow(0 1px 2px rgb(0 0 0 / .1)) drop-shadow(0 1px 1px rgb(0 0 0 / .06));filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition-all{transition-property:all;transition-timing-function: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}.duration-300{transition-duration:.3s}:root{--pui-bg-base: #FDFCF8;--pui-bg-surface: #FAF8F0;--pui-bg-elevated: #F5F1E6;--pui-text-primary: #1A1917;--pui-text-secondary: #68635C;--pui-sketch-stroke: rgba(61, 53, 43, .32)}body{font-family:var(--paper-font-default, "Luminari", "Cormorant Garamond", Georgia, serif);background-color:#fdfcf8;color:#1a1917;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)' opacity='0.04'/%3E%3C/svg%3E");background-repeat:repeat;background-size:200px 200px}@font-face{font-family:Luminari;src:url(/fonts/Luminari-Regular.woff) format("woff");font-weight:400;font-style:normal;font-display:swap;size-adjust:88%}button{font-family:var(--paper-button-font, "Luminari", "Cormorant Garamond", Georgia, serif)}input,select,textarea{font-family:Cormorant Garamond,Georgia,serif}code,pre{font-family:JetBrains Mono,monospace}html,body,#root{height:100%}html{scroll-behavior:smooth}input:-webkit-autofill,input:-webkit-autofill:hover,input:-webkit-autofill:focus,input:-webkit-autofill:active{-webkit-box-shadow:inset 0 0 0px 1000px #F5F1E6!important;-webkit-text-fill-color:#1A1917!important;border:1px solid rgba(61,53,43,.08)!important;border-radius:.75rem!important;-webkit-transition:background-color 5000s ease-in-out 0s!important;transition:background-color 5000s ease-in-out 0s!important}input:-moz-autofill{background-color:#f5f1e6!important;color:#1a1917!important;border:1px solid rgba(61,53,43,.08)!important}input:-webkit-autofill:first-line{color:#1a1917!important;font-family:inherit!important;font-size:inherit!important}.last\:border-0:last-child{border-width:0px}.hover\:opacity-80:hover{opacity:.8}.hover\:shadow-paper-lg:hover{--tw-shadow: 0 10px 15px rgba(61, 53, 43, .1), 0 4px 6px rgba(61, 53, 43, .08);--tw-shadow-colored: 0 10px 15px var(--tw-shadow-color), 0 4px 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)}@media (min-width: 640px){.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}.sm\:px-10{padding-left:2.5rem;padding-right:2.5rem}.sm\:text-3xl{font-size:1.875rem;line-height:2.25rem}.sm\:text-6xl{font-size:3.75rem;line-height:1}}@media (min-width: 768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.md\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.md\:text-7xl{font-size:4.5rem;line-height:1}}@media (min-width: 1024px){.lg\:block{display:block}.lg\:flex{display:flex}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}}@media (min-width: 1280px){.xl\:grid-cols-\[1fr_330px\]{grid-template-columns:1fr 330px}}.button-module__button___Z331g{position:relative;display:inline-flex;align-items:center;justify-content:center;gap:.5rem;border:none;cursor:pointer;font-family:var(--paper-button-font, var(--paper-font-default, "Luminari", "Cormorant Garamond", Georgia, serif));font-weight:600;letter-spacing:.01em;line-height:1.2;color:#1a1917;transition:color .25s ease,filter .25s ease;overflow:visible;background:transparent}.button-module__button___Z331g:focus-visible{outline:2px solid #8A9BA8;outline-offset:2px}.button-module__button___Z331g:disabled{opacity:.5;cursor:not-allowed;filter:none}.button-module__blobBg___QQFzf{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;z-index:0;pointer-events:none}.button-module__blobFill___XwLjV{transition:fill .25s ease}.button-module__blobRing___567UW{fill:none;stroke:#3d352b59;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;opacity:0;transition:opacity .35s ease 50ms}.button-module__button___Z331g:hover:not(:disabled) .button-module__blobRing___567UW{opacity:1}.button-module__button___Z331g:active:not(:disabled) .button-module__blobRing___567UW{stroke:#3d352b8c}.button-module__isActive___FXNSJ .button-module__blobRing___567UW{opacity:1}.button-module__primary___ppbyq .button-module__blobFill___XwLjV{fill:var(--pui-btn-primary, rgba(143, 185, 150, .25))}.button-module__primary___ppbyq:hover:not(:disabled) .button-module__blobFill___XwLjV{fill:var(--pui-btn-primary-hover, rgba(143, 185, 150, .3))}.button-module__primary___ppbyq:active:not(:disabled) .button-module__blobFill___XwLjV{fill:var(--pui-btn-primary-active, rgba(143, 185, 150, .34))}.button-module__isActive___FXNSJ.button-module__primary___ppbyq .button-module__blobFill___XwLjV{fill:var(--pui-btn-primary-hover, rgba(143, 185, 150, .3))}.button-module__isActive___FXNSJ.button-module__primary___ppbyq:hover .button-module__blobFill___XwLjV{fill:var(--pui-btn-primary-active, rgba(143, 185, 150, .34))}.button-module__secondary___esy5L .button-module__blobFill___XwLjV{fill:var(--pui-btn-secondary, rgba(61, 53, 43, .1))}.button-module__secondary___esy5L:hover:not(:disabled) .button-module__blobFill___XwLjV{fill:var(--pui-btn-secondary-hover, rgba(61, 53, 43, .14))}.button-module__secondary___esy5L:active:not(:disabled) .button-module__blobFill___XwLjV{fill:var(--pui-btn-secondary-active, rgba(61, 53, 43, .18))}.button-module__isActive___FXNSJ.button-module__secondary___esy5L .button-module__blobFill___XwLjV{fill:var(--pui-btn-secondary-hover, rgba(61, 53, 43, .14))}.button-module__isActive___FXNSJ.button-module__secondary___esy5L:hover .button-module__blobFill___XwLjV{fill:var(--pui-btn-secondary-active, rgba(61, 53, 43, .18))}.button-module__ghost___NisA0{color:#68635c}.button-module__ghost___NisA0 .button-module__blobFill___XwLjV{fill:transparent}.button-module__ghost___NisA0:hover:not(:disabled) .button-module__blobFill___XwLjV{fill:#8fb9961f}.button-module__ghost___NisA0:active:not(:disabled) .button-module__blobFill___XwLjV{fill:#8fb99633}.button-module__ghost___NisA0 .button-module__blobRing___567UW{stroke:#3d352b38}.button-module__isActive___FXNSJ.button-module__ghost___NisA0 .button-module__blobFill___XwLjV{fill:#8fb99640}.button-module__isActive___FXNSJ.button-module__ghost___NisA0:hover .button-module__blobFill___XwLjV{fill:#8fb9964d}.button-module__danger___Wnvuq{color:#9e5e5e}.button-module__danger___Wnvuq .button-module__blobFill___XwLjV{fill:#f0ead8}.button-module__danger___Wnvuq:hover:not(:disabled) .button-module__blobFill___XwLjV{fill:#e8d4d4}.button-module__danger___Wnvuq:active:not(:disabled) .button-module__blobFill___XwLjV{fill:#dec4c4}.button-module__isActive___FXNSJ.button-module__danger___Wnvuq .button-module__blobFill___XwLjV{fill:#e8d4d4}.button-module__isActive___FXNSJ.button-module__danger___Wnvuq:hover .button-module__blobFill___XwLjV{fill:#dec4c4}.button-module__chalkboard___d3Nqb{color:#d4e8cb}.button-module__chalkboard___d3Nqb .button-module__blobFill___XwLjV{display:none}.button-module__chalkboard___d3Nqb .button-module__blobRing___567UW{stroke:#c8d2c373;stroke-width:2.2}.button-module__chalkboard___d3Nqb:active:not(:disabled) .button-module__blobRing___567UW{stroke:#c8d2c3a6}.button-module__chalkboard___d3Nqb.button-module__ghost___NisA0 .button-module__blobRing___567UW{stroke:#c8d2c359}.button-module__chalkboard___d3Nqb.button-module__danger___Wnvuq{color:#e8a0a0}.button-module__tiny___8ZZ7A{padding:.25rem .75rem;font-size:.75rem}.button-module__small___u7y8a{padding:.5rem 1rem;font-size:1.125rem}.button-module__medium___HBIAj{padding:.75rem 1.5rem;font-size:1.5rem}.button-module__large___RPzNy{padding:1rem 2rem;font-size:1.875rem}.button-module__fullWidth___H0P0F{width:100%}.button-module__iconLeft___s60SZ,.button-module__iconRight___75eFu{display:flex;align-items:center;justify-content:center;flex-shrink:0;position:relative;z-index:1}.button-module__label___pXAyM{position:relative;z-index:1}.sketch-border-module__svg___whV4x{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;pointer-events:none;overflow:visible;z-index:2}.sketch-border-module__behind___lgdYV{z-index:0}.sketch-border-module__stroke___vAm-v{fill:none;stroke:var(--sketch-stroke, var(--pui-sketch-stroke, rgba(61, 53, 43, .32)));stroke-linecap:round;stroke-linejoin:round;transition:stroke .15s ease-out}.sketch-border-module__fill___zlpd6{stroke:none;fill:var(--sketch-fill, transparent);transition:fill .15s ease-out}.page-module__page___-uHnG{position:relative;display:flex;flex-direction:column;height:100%;max-width:800px;margin:0 auto;filter:drop-shadow(0 4px 6px rgba(61,53,43,.1)) drop-shadow(0 1px 2px rgba(61,53,43,.06));--sketch-stroke: transparent}.page-module__outlined___Wwtyg{--sketch-stroke: rgba(61, 53, 43, .32)}.page-module__surface___sWfI6{position:relative;z-index:1;flex:1 1 auto;min-height:0;overflow-y:auto;scrollbar-gutter:stable;padding:2rem;font-size:1.125rem;line-height:32px;background-color:#fdfcf8;border-radius:11.1301107544px 13.0280477258px 14.0986926147px 9.8815479971px;clip-path:var(--sketch-clip)}.page-module__surface___sWfI6>*+*{margin-top:2rem}.page-module__surface___sWfI6 h1,.page-module__surface___sWfI6 h2,.page-module__surface___sWfI6 h3,.page-module__surface___sWfI6 h4,.page-module__surface___sWfI6 h5,.page-module__surface___sWfI6 h6{line-height:32px}.page-module__flat___HlOaY .page-module__surface___sWfI6{border-radius:12px}.page-module__withAccent___lsv-m:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;z-index:0;clip-path:var(--sketch-clip);mix-blend-mode:multiply;pointer-events:none;opacity:.08}.page-module__accentBlue___XxbMV:before{background:radial-gradient(300px 300px at calc(100% + 80px) -80px,#AFC6E0 0%,transparent 70%)}.page-module__accentGreen___Ne6Q8:before{background:radial-gradient(300px 300px at calc(100% + 80px) -80px,#B5D4BA 0%,transparent 70%)}.page-module__accentAmber___kLAwa:before{background:radial-gradient(300px 300px at calc(100% + 80px) -80px,#E4C9A8 0%,transparent 70%)}.page-module__accentRose___O9ZbZ:before{background:radial-gradient(300px 300px at calc(100% + 80px) -80px,#DEB5B5 0%,transparent 70%)}.page-module__accentSlate___xCB66:before{background:radial-gradient(300px 300px at calc(100% + 80px) -80px,#B0BEC8 0%,transparent 70%)}.layout-module__layout___O1aWi{display:flex;flex-direction:column;height:100vh;width:100%;overflow:hidden}.layout-module__header___I-kxe{display:flex;align-items:center;justify-content:space-between;height:48px;padding:0 1.5rem;background-color:#faf8f0;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='speckle'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.4' numOctaves='1' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23speckle)' opacity='0.14'/%3E%3C/svg%3E");background-repeat:repeat;background-size:200px 200px;border-bottom:1px solid rgba(61,53,43,.12);box-shadow:0 1px 2px #3d352b14,0 1px 1px #3d352b0f;flex-shrink:0;position:relative;z-index:200}.layout-module__headerLeft___JChJQ,.layout-module__headerTitles___aqSUG{display:flex;align-items:baseline;gap:.75rem}.layout-module__headerTitle___wvr39{font-family:var(--paper-font-default, "Luminari", "Cormorant Garamond", Georgia, serif);font-size:1.25rem;font-weight:600;color:#1a1917;margin:0;line-height:1;white-space:nowrap}.layout-module__headerSubtitle___6f5BD{font-family:var(--paper-font-default, "Luminari", "Cormorant Garamond", Georgia, serif);font-size:1rem;font-weight:400;color:#a8a399;margin:0;line-height:1;white-space:nowrap}.layout-module__headerActions___adC12{display:flex;align-items:center;gap:.75rem}.layout-module__mobileToggle___4WpVG{display:flex;align-items:center;justify-content:center;width:44px;height:44px;border-radius:12px;background:transparent;border:none;color:#68635c;cursor:pointer;transition:all .15s ease-out}.layout-module__mobileToggle___4WpVG:hover{background-color:#0000000a;color:#1a1917}@media (min-width: 768px){.layout-module__mobileToggle___4WpVG{display:none}}.layout-module__body___tywNf{display:flex;flex:1;min-width:0;position:relative;overflow:hidden}.layout-module__mobileOverlay___tzbBC{position:fixed;top:0;right:0;bottom:0;left:0;width:100%;height:100%;padding:0;border:none;background:#1a191766;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);cursor:default;z-index:250}.layout-module__sidebar___8VKGq{width:240px;flex-shrink:0;padding:32px;position:sticky;top:0;align-self:stretch;height:100%;overflow-y:auto}@media (max-width: 767px){.layout-module__sidebar___8VKGq{position:fixed;top:0;left:0;width:280px;height:100vh;padding:32px;background-color:#fdfcf8;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)' opacity='0.04'/%3E%3C/svg%3E");background-repeat:repeat;background-size:200px 200px;box-shadow:0 10px 15px #3d352b1a,0 4px 6px #3d352b14;transform:translate(-100%);transition:transform .3s ease-out;z-index:300}}.layout-module__sidebarOpen___47rtr{transform:translate(0)}.layout-module__sidebarInner___tq2X6{display:flex;flex-direction:column;height:100%}.layout-module__logoArea___RLnC0{height:32px;display:flex;align-items:center;margin-bottom:0;padding-bottom:0}.layout-module__logoText___pAmfV{font-family:var(--paper-font-default, "Luminari", "Cormorant Garamond", Georgia, serif);font-size:1.25rem;font-weight:700;color:#1a1917;letter-spacing:.02em;line-height:32px}.layout-module__nav___FxcrZ{display:flex;flex-direction:column;gap:0;flex:1;margin-top:32px}.layout-module__main___9z7bu{flex:1;display:flex;flex-direction:column;min-width:0;overflow:hidden}.layout-module__navIslandFixed___H4TwP{position:fixed;bottom:1.5rem;left:50%;z-index:100;transform:translate(-50%);pointer-events:none}.layout-module__navIslandFixed___H4TwP>*{pointer-events:auto}.layout-module__content___jL-VB{flex:1;min-height:0;overflow:hidden;padding:32px;line-height:32px}.layout-module__contentWithPage___vVdfN{flex:1;min-height:0;overflow:hidden;padding:24px 32px;line-height:32px}.layout-module__footer___LyakU{padding:20px 32px;background-color:#faf8f0;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)' opacity='0.04'/%3E%3C/svg%3E");background-repeat:repeat;background-size:200px 200px;border-top:1px solid rgba(61,53,43,.12);text-align:center;flex-shrink:0}.layout-module__footerText___8BYxc{font-family:var(--paper-font-default, "Luminari", "Cormorant Garamond", Georgia, serif);color:#a8a399;margin:0}.island-module__island___Yd2ej{position:fixed;bottom:1.5rem;left:50%;transform:translate(-50%);z-index:50;display:inline-flex;align-items:center;gap:1rem;padding:.75rem 1.25rem;border-radius:28px;background-color:#e5dbc4;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='k'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix type='matrix' values='0 0 0 0 0.50 0 0 0 0 0.35 0 0 0 0 0.20 0 0 0 0.55 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23k)' opacity='1'/%3E%3C/svg%3E");background-repeat:repeat;background-size:200px 200px;border:1px solid rgba(61,53,43,.12);box-shadow:0 10px 15px #3d352b1a,0 4px 6px #3d352b14,inset 0 1px #ffffff80}.island-module__chalkboard___yK6AH{border-color:#c8d2c333;box-shadow:0 10px 15px #00000040,0 4px 6px #0003,inset 0 1px #c8d2c31a}.checkbox-module__wrapper___uLYMI{display:flex;align-items:center;gap:1rem;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.checkbox-module__wrapper___uLYMI:hover .checkbox-module__blobFill___mPJSR{fill:#7c9cc02e}.checkbox-module__wrapper___uLYMI:hover .checkbox-module__input___Ptgt7:checked~.checkbox-module__blobBg___bw3sn .checkbox-module__blobFill___mPJSR,.checkbox-module__wrapper___uLYMI:hover .checkbox-module__input___Ptgt7:indeterminate~.checkbox-module__blobBg___bw3sn .checkbox-module__blobFill___mPJSR{fill:#e8dec8}.checkbox-module__labelLeft___-vAmH{flex-direction:row-reverse}.checkbox-module__input___Ptgt7{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.checkbox-module__input___Ptgt7:focus-visible~.checkbox-module__box___yAh-r{outline:2px dotted #A8A399;outline-offset:2px}.checkbox-module__input___Ptgt7:checked~.checkbox-module__box___yAh-r,.checkbox-module__input___Ptgt7:indeterminate~.checkbox-module__box___yAh-r{--sketch-stroke: rgba(61, 53, 43, .7)}.checkbox-module__input___Ptgt7:checked~.checkbox-module__box___yAh-r .checkbox-module__checkmark___tTyBz,.checkbox-module__input___Ptgt7:indeterminate~.checkbox-module__box___yAh-r .checkbox-module__checkmark___tTyBz{stroke-dashoffset:0}.checkbox-module__input___Ptgt7:checked~.checkbox-module__box___yAh-r .checkbox-module__indeterminateLine___IosI-,.checkbox-module__input___Ptgt7:indeterminate~.checkbox-module__box___yAh-r .checkbox-module__indeterminateLine___IosI-{stroke-dashoffset:0}.checkbox-module__input___Ptgt7:checked~.checkbox-module__blobBg___bw3sn .checkbox-module__blobFill___mPJSR,.checkbox-module__input___Ptgt7:indeterminate~.checkbox-module__blobBg___bw3sn .checkbox-module__blobFill___mPJSR{fill:#f0ead8}.checkbox-module__input___Ptgt7:disabled~.checkbox-module__box___yAh-r{opacity:.4;cursor:not-allowed}.checkbox-module__boxWrapper___byjoS{position:relative;display:flex;align-items:center;justify-content:center;width:40px;height:40px}.checkbox-module__blobBg___bw3sn{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;z-index:0;pointer-events:none}.checkbox-module__blobFill___mPJSR{transition:fill .25s ease;fill:transparent}.checkbox-module__box___yAh-r{display:flex;align-items:center;justify-content:center;width:24px;height:24px;background-color:transparent;position:relative;z-index:1;border-radius:6px;--sketch-stroke: rgba(61, 53, 43, .42)}.checkbox-module__box___yAh-r:hover{--sketch-stroke: rgba(61, 53, 43, .6)}.checkbox-module__icon___RO-yn{width:20px;height:20px;color:#1a1917}.checkbox-module__checkmark___tTyBz{stroke-dasharray:36;stroke-dashoffset:36;transition:stroke-dashoffset .2s ease-out}.checkbox-module__indeterminateLine___IosI-{stroke-dasharray:20;stroke-dashoffset:20;transition:stroke-dashoffset .2s ease-out}.checkbox-module__labelText___bAnLr{font-family:var(--paper-font-default, "Luminari", "Cormorant Garamond", Georgia, serif);font-size:1.125rem;font-weight:400;color:#68635c;line-height:1.5}.checkbox-module__chalkboard___sv6SL .checkbox-module__labelText___bAnLr{color:#a8b5a0}.checkbox-module__chalkboard___sv6SL .checkbox-module__box___yAh-r{--sketch-stroke: rgba(200, 210, 195, .5)}.checkbox-module__chalkboard___sv6SL .checkbox-module__box___yAh-r:hover{--sketch-stroke: #d4e8cb}.checkbox-module__chalkboard___sv6SL .checkbox-module__icon___RO-yn{color:#d4e8cb}.checkbox-module__chalkboard___sv6SL .checkbox-module__blobFill___mPJSR{display:none}.checkbox-module__chalkboard___sv6SL .checkbox-module__input___Ptgt7:focus-visible~.checkbox-module__box___yAh-r{outline-color:#d4e8cb}.checkbox-module__chalkboard___sv6SL .checkbox-module__input___Ptgt7:checked~.checkbox-module__box___yAh-r,.checkbox-module__chalkboard___sv6SL .checkbox-module__input___Ptgt7:indeterminate~.checkbox-module__box___yAh-r{--sketch-stroke: #d4e8cb}.icon-button-module__iconButton___avg6i{position:relative;display:flex;align-items:center;justify-content:center;border:none;cursor:pointer;color:#1a1917;transition:color .25s ease,filter .25s ease;flex-shrink:0;overflow:visible;background:transparent}.icon-button-module__iconButton___avg6i:focus-visible{outline:2px solid #8A9BA8;outline-offset:2px}.icon-button-module__iconButton___avg6i:disabled{opacity:.5;cursor:not-allowed;filter:none}.icon-button-module__blobBg___466Vy{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;z-index:0;pointer-events:none}.icon-button-module__blobFill___FTN1g{transition:fill .25s ease}.icon-button-module__blobRing___hRdQb{fill:none;stroke:#3d352b59;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;opacity:0;transition:opacity .35s ease 50ms}.icon-button-module__iconButton___avg6i:hover:not(:disabled) .icon-button-module__blobRing___hRdQb{opacity:1}.icon-button-module__iconButton___avg6i:active:not(:disabled) .icon-button-module__blobRing___hRdQb{stroke:#3d352b8c}.icon-button-module__isActive___XlvtM .icon-button-module__blobRing___hRdQb{opacity:1}.icon-button-module__icon___h204x{position:relative;z-index:1;display:flex;align-items:center;justify-content:center}.icon-button-module__default___9frNR .icon-button-module__blobFill___FTN1g{fill:#f0ead8}.icon-button-module__default___9frNR:hover:not(:disabled) .icon-button-module__blobFill___FTN1g{fill:#e8dec8}.icon-button-module__default___9frNR:active:not(:disabled) .icon-button-module__blobFill___FTN1g{fill:#ddd2b8}.icon-button-module__isActive___XlvtM.icon-button-module__default___9frNR .icon-button-module__blobFill___FTN1g{fill:#e8dec8}.icon-button-module__isActive___XlvtM.icon-button-module__default___9frNR:hover .icon-button-module__blobFill___FTN1g{fill:#ddd2b8}.icon-button-module__ghost___Wbxog{color:#68635c}.icon-button-module__ghost___Wbxog .icon-button-module__blobFill___FTN1g{fill:transparent}.icon-button-module__ghost___Wbxog:hover:not(:disabled) .icon-button-module__blobFill___FTN1g{fill:#8fb9961f}.icon-button-module__ghost___Wbxog:active:not(:disabled) .icon-button-module__blobFill___FTN1g{fill:#8fb99633}.icon-button-module__ghost___Wbxog .icon-button-module__blobRing___hRdQb{stroke:#3d352b38}.icon-button-module__isActive___XlvtM.icon-button-module__ghost___Wbxog .icon-button-module__blobFill___FTN1g{fill:#8fb99640}.icon-button-module__isActive___XlvtM.icon-button-module__ghost___Wbxog:hover .icon-button-module__blobFill___FTN1g{fill:#8fb9964d}.icon-button-module__danger___p0Xz5{color:#9e5e5e}.icon-button-module__danger___p0Xz5 .icon-button-module__blobFill___FTN1g{fill:#f0ead8}.icon-button-module__danger___p0Xz5:hover:not(:disabled) .icon-button-module__blobFill___FTN1g{fill:#e8d4d4}.icon-button-module__danger___p0Xz5:active:not(:disabled) .icon-button-module__blobFill___FTN1g{fill:#dec4c4}.icon-button-module__isActive___XlvtM.icon-button-module__danger___p0Xz5 .icon-button-module__blobFill___FTN1g{fill:#e8d4d4}.icon-button-module__isActive___XlvtM.icon-button-module__danger___p0Xz5:hover .icon-button-module__blobFill___FTN1g{fill:#dec4c4}.icon-button-module__tiny___4WYvA{width:32px;height:32px}.icon-button-module__tiny___4WYvA .icon-button-module__icon___h204x{width:16px;height:16px}.icon-button-module__small___bPnCU{width:40px;height:40px}.icon-button-module__small___bPnCU .icon-button-module__icon___h204x{width:20px;height:20px}.icon-button-module__medium___nOxPf{width:48px;height:48px}.icon-button-module__medium___nOxPf .icon-button-module__icon___h204x{width:24px;height:24px}.icon-button-module__large___UBU5z{width:56px;height:56px}.icon-button-module__large___UBU5z .icon-button-module__icon___h204x{width:28px;height:28px}.icon-button-module__chalkboard___mi0sQ{color:#d4e8cb}.icon-button-module__chalkboard___mi0sQ .icon-button-module__blobFill___FTN1g{display:none}.icon-button-module__chalkboard___mi0sQ .icon-button-module__blobRing___hRdQb{stroke:#c8d2c373;stroke-width:2.2}.icon-button-module__chalkboard___mi0sQ:active:not(:disabled) .icon-button-module__blobRing___hRdQb{stroke:#c8d2c3a6}.icon-button-module__chalkboard___mi0sQ.icon-button-module__ghost___Wbxog .icon-button-module__blobRing___hRdQb{stroke:#c8d2c359}.icon-button-module__chalkboard___mi0sQ.icon-button-module__danger___p0Xz5{color:#e8a0a0}.stamp-module__stamp___5qaNY{position:relative;display:inline-flex;align-items:center;justify-content:center;gap:.25rem;font-family:Caveat,cursive;font-weight:500;line-height:1.2}.stamp-module__small___BBlBg{padding:.25rem .75rem;font-size:1.125rem}.stamp-module__medium___HG2YD{padding:.5rem 1rem;font-size:1.5rem}.stamp-module__large___aUT0I{padding:.75rem 1.25rem;font-size:1.875rem}.stamp-module__blobBg___Mdrdd{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;z-index:0;pointer-events:none}.stamp-module__blobFill___QyCeB{transition:fill .25s ease}.stamp-module__blobRing___EUDx7{fill:none;stroke-width:1.8}.stamp-module__dot___qZyCR{position:relative;z-index:1;width:6px;height:6px;border-radius:50%;background:currentColor;flex-shrink:0}.stamp-module__label___T89iH{position:relative;z-index:1;white-space:nowrap}.stamp-module__chalkboard___syI4T{color:#d4e8cb}.copy-button-module__copyButton___-hTo4{font-family:JetBrains Mono,monospace;font-size:.75rem;padding:.125rem .5rem;border-radius:.375rem;transition:background-color .15s ease,color .15s ease;background-color:#3d352b0f;color:#68635c;border:1px solid rgba(61,53,43,.12);cursor:pointer}.copy-button-module__copyButton___-hTo4:hover{color:#1a1917;border-color:#3d352b33}.copy-button-module__copyButton___-hTo4:focus-visible{outline:2px solid #8A9BA8;outline-offset:2px}.copy-button-module__dark___O45N-{background-color:#ffffff1a;color:#a8a399;border-color:#ffffff26}.copy-button-module__chalkboard___hW4aw{background-color:#c8dcc31f;color:#a8b5a0;border-color:#c8d2c333;font-family:Courier Prime,monospace;letter-spacing:.02em}.copy-button-module__chalkboard___hW4aw:hover{background-color:#c8dcc333;color:#d4e8cb}.copy-button-module__copied___XlHFr{background-color:#8fb99640;color:#51719b}.code-block-module__codeBlock___dq28o{border-radius:.75rem;overflow:hidden;border:1px solid rgba(61,53,43,.12);width:100%}.code-block-module__header___42Fek{padding:.625rem 1.25rem;font-size:.75rem;font-family:JetBrains Mono,monospace;border-bottom:1px solid rgba(61,53,43,.12);background-color:#f5f1e6;color:#68635c;display:flex;align-items:center;justify-content:space-between}.code-block-module__relative___oO-zy{position:relative}.code-block-module__copyOverlay___PjAuq{position:absolute;top:.5rem;right:.5rem;z-index:10}.code-block-module__pre___zXzLZ{padding:1.25rem;font-size:.875rem;line-height:1.625;overflow-x:auto;background-color:#2b2926;color:#faf8f0;font-family:JetBrains Mono,monospace;white-space:pre;word-wrap:normal}.code-block-module__chalkboard___bdo9J{border-color:#c8d2c333;border-radius:.5rem}.code-block-module__chalkboardHeader___3RiVd{background-color:#142e22;border-bottom-color:#c8d2c333;color:#5e7a68;font-family:Courier Prime,monospace;font-size:.875rem;letter-spacing:.04em}.code-block-module__chalkboardPre___iRBFR{background-color:#142e22;color:#d4e8cb;font-family:Courier Prime,monospace;font-size:1rem;line-height:1.7;padding:1.25rem 1.5rem;opacity:.92}.table-module__tableFrame___KP-90{position:relative;filter:drop-shadow(0 8px 14px rgba(61,53,43,.14));--sketch-stroke: rgba(61, 53, 43, .32)}.table-module__tableWrapper___gc3Y3{position:relative;border-radius:12px;overflow:hidden;clip-path:var(--sketch-clip)}.table-module__toolbar___zhCel{display:flex;align-items:center;justify-content:space-between;gap:1rem;height:64px;padding:0 2rem;background-color:var(--pui-texture-shade, #F5F1E6);background-image:var(--pui-texture-image, url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)' opacity='0.04'/%3E%3C/svg%3E"));background-repeat:repeat;background-size:200px 200px;box-sizing:border-box;position:relative}.table-module__toolbar___zhCel:after{content:"";position:absolute;left:0;right:0;bottom:-1.5px;height:3px;background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='64' height='3' preserveAspectRatio='none' viewBox='0 0 64 3'%3E%3Cpath d='M0 1.6 C 8 0.7 14 2.3 22 1.5 C 30 0.8 38 2.2 46 1.5 C 54 0.9 60 2.1 64 1.5' fill='none' stroke='%233d352b' stroke-opacity='0.3' stroke-width='1' stroke-linecap='round'/%3E%3C/svg%3E") repeat-x left center;background-size:64px 3px;pointer-events:none}.table-module__toolbarTitle___D8oH-{display:flex;align-items:center;min-width:0}.table-module__panelFooter___lCCKo{padding:1rem 2rem 1.5rem;background-color:var(--pui-texture-shade, #F5F1E6);background-image:var(--pui-texture-image, url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)' opacity='0.04'/%3E%3C/svg%3E"));background-repeat:repeat;background-size:200px 200px;box-sizing:border-box;position:relative}.table-module__panelFooter___lCCKo:before{content:"";position:absolute;left:0;right:0;top:-1.5px;height:3px;background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='64' height='3' preserveAspectRatio='none' viewBox='0 0 64 3'%3E%3Cpath d='M0 1.6 C 8 0.7 14 2.3 22 1.5 C 30 0.8 38 2.2 46 1.5 C 54 0.9 60 2.1 64 1.5' fill='none' stroke='%233d352b' stroke-opacity='0.3' stroke-width='1' stroke-linecap='round'/%3E%3C/svg%3E") repeat-x left center;background-size:64px 3px;pointer-events:none}.table-module__compact___mG-2Y .table-module__toolbar___zhCel{height:48px;padding:0 1rem}.table-module__compact___mG-2Y .table-module__panelFooter___lCCKo{padding:.75rem 1rem 1rem}.table-module__compact___mG-2Y .table-module__toolbarActions___EX6qS button{font-size:.875rem}.table-module__search___zIBk2{position:relative;display:flex;align-items:center;flex:1;max-width:280px;--sketch-fill: #FBF9F4;--sketch-stroke: rgba(61, 53, 43, .32)}.table-module__search___zIBk2:focus-within{--sketch-stroke: rgba(138, 155, 168, .45)}.table-module__searchIcon___ayhK8{position:absolute;left:.75rem;color:#a8a399;pointer-events:none;z-index:1}.table-module__searchInput___PqsEG{-webkit-appearance:none;-moz-appearance:none;appearance:none;position:relative;z-index:1;width:100%;padding:.5rem .75rem .5rem 2rem;color:#1a1917;font-family:var(--paper-font-default, "Luminari", "Cormorant Garamond", Georgia, serif);font-size:1rem;font-weight:500;line-height:1.2;border:none;outline:none;background:transparent}.table-module__searchInput___PqsEG::-moz-placeholder{color:#a8a399;font-weight:400;font-family:Caveat,cursive;font-size:1.125rem}.table-module__searchInput___PqsEG::placeholder{color:#a8a399;font-weight:400;font-family:Caveat,cursive;font-size:1.125rem}.table-module__searchInput___PqsEG:focus{outline:2px dotted #A8A399;outline-offset:2px}.table-module__toolbarActions___EX6qS{display:flex;align-items:center;gap:.5rem}.table-module__tableScroll___1gvc4{overflow-x:auto}.table-module__tableWrapper___gc3Y3>.table-module__tableScroll___1gvc4:first-child{padding-top:.25rem}.table-module__tableWrapper___gc3Y3>.table-module__tableScroll___1gvc4:last-child{padding-bottom:.25rem}.table-module__table___tdU5g{width:100%;table-layout:fixed;border-collapse:collapse;font-family:var(--paper-font-default, "Luminari", "Cormorant Garamond", Georgia, serif);font-size:1rem;color:#1a1917}.table-module__compact___mG-2Y .table-module__th___GQbKk,.table-module__compact___mG-2Y .table-module__td___WktB5,.table-module__compact___mG-2Y .table-module__footerCell___bM-jv{padding-left:1rem;padding-right:1rem}.table-module__th___GQbKk{text-align:left;font-weight:700;color:#1a1917;letter-spacing:.03em;white-space:nowrap;padding:0 2rem;height:52px;box-sizing:border-box;vertical-align:middle;line-height:32px;background-color:var(--pui-texture-shade, #F5F1E6);background-image:var(--pui-texture-image, url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)' opacity='0.04'/%3E%3C/svg%3E"));background-repeat:repeat;background-size:200px 200px;position:relative}.table-module__th___GQbKk:after{content:"";position:absolute;left:0;right:0;bottom:-1.5px;height:3px;background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='64' height='3' preserveAspectRatio='none' viewBox='0 0 64 3'%3E%3Cpath d='M0 1.6 C 8 0.7 14 2.3 22 1.5 C 30 0.8 38 2.2 46 1.5 C 54 0.9 60 2.1 64 1.5' fill='none' stroke='%233d352b' stroke-opacity='0.3' stroke-width='1' stroke-linecap='round'/%3E%3C/svg%3E") repeat-x left center;background-size:64px 3px;pointer-events:none}.table-module__td___WktB5{font-family:var(--paper-font-default, "Luminari", "Cormorant Garamond", Georgia, serif);color:#68635c;padding:0 2rem;height:40px;box-sizing:border-box;vertical-align:middle;line-height:32px;position:relative}.table-module__td___WktB5:after{content:"";position:absolute;left:0;right:0;bottom:-1.5px;height:3px;background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='64' height='3' preserveAspectRatio='none' viewBox='0 0 64 3'%3E%3Cpath d='M0 1.6 C 8 0.7 14 2.3 22 1.5 C 30 0.8 38 2.2 46 1.5 C 54 0.9 60 2.1 64 1.5' fill='none' stroke='%233d352b' stroke-opacity='0.3' stroke-width='1' stroke-linecap='round'/%3E%3C/svg%3E") repeat-x left center;background-size:64px 3px;pointer-events:none}.table-module__tr___xeZno:last-child .table-module__td___WktB5:after{display:none}.table-module__expandTh___uxkR4,.table-module__expandTd___VoBRC{width:48px;text-align:center;padding:0}.table-module__expandIcon___8V45X{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;padding:0;border:none;background:transparent;font-size:.65em;color:#68635c;cursor:pointer}.table-module__expandable___R7o2l{cursor:pointer}.table-module__expandable___R7o2l:hover .table-module__td___WktB5{background-color:#00000008}.table-module__footerRow___ik1DH .table-module__footerCell___bM-jv{padding:0 2rem;background-color:var(--pui-texture-shade, #F5F1E6);background-image:var(--pui-texture-image, url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)' opacity='0.04'/%3E%3C/svg%3E"));background-repeat:repeat;background-size:200px 200px;color:#68635c;font-family:JetBrains Mono,monospace;font-size:.75rem;line-height:1.5;position:relative}.table-module__footerRow___ik1DH .table-module__footerCell___bM-jv:after{content:"";position:absolute;left:0;right:0;bottom:-1.5px;height:3px;background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='64' height='3' preserveAspectRatio='none' viewBox='0 0 64 3'%3E%3Cpath d='M0 1.6 C 8 0.7 14 2.3 22 1.5 C 30 0.8 38 2.2 46 1.5 C 54 0.9 60 2.1 64 1.5' fill='none' stroke='%233d352b' stroke-opacity='0.3' stroke-width='1' stroke-linecap='round'/%3E%3C/svg%3E") repeat-x left center;background-size:64px 3px;pointer-events:none}.table-module__expandedRow___1TbTQ .table-module__expandedCell___sKAaD{padding:1rem 2rem;background-color:#e5dbc4;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='k'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix type='matrix' values='0 0 0 0 0.50 0 0 0 0 0.35 0 0 0 0 0.20 0 0 0 0.55 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23k)' opacity='1'/%3E%3C/svg%3E");background-repeat:repeat;background-size:200px 200px;color:#1a1917;font-family:Caveat,cursive;font-size:1.125rem;line-height:1.5;border-bottom:1px solid rgba(61,53,43,.12)}.table-module__boardScroll___Y1yqm{overflow-x:auto}.table-module__board___kFAI-{display:flex;align-items:flex-start}.table-module__boardColumn___-W9bP{flex:1 0 280px;display:flex;flex-direction:column}.table-module__boardColumn___-W9bP+.table-module__boardColumn___-W9bP{border-left:1px solid rgba(61,53,43,.08)}.table-module__boardColumnHeader___kY3Fj{display:flex;align-items:center;justify-content:space-between;gap:.75rem;height:64px;padding:0 1.5rem;box-sizing:border-box;background-color:#f5f1e6;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)' opacity='0.04'/%3E%3C/svg%3E");background-repeat:repeat;background-size:200px 200px;border-bottom:1px solid rgba(61,53,43,.12)}.table-module__boardColumnHeader___kY3Fj.table-module__accentBlue___PEJ1V{border-bottom-color:#51719b}.table-module__boardColumnHeader___kY3Fj.table-module__accentGreen___wJ53r{border-bottom-color:#8fb996}.table-module__boardColumnHeader___kY3Fj.table-module__accentAmber___Iezjv{border-bottom-color:#a67b4f}.table-module__boardColumnHeader___kY3Fj.table-module__accentRose___W8zxc{border-bottom-color:#9e5e5e}.table-module__boardColumnHeader___kY3Fj.table-module__accentSlate___oUZCX{border-bottom-color:#5e7080}.table-module__boardColumnLabel___JBEed{font-family:var(--paper-font-default, "Luminari", "Cormorant Garamond", Georgia, serif);font-weight:700;font-size:1rem;letter-spacing:.03em;text-transform:uppercase;color:#1a1917}.table-module__boardColumnCount___Pkpiq{display:flex;align-items:center;justify-content:center;min-width:22px;height:22px;padding:0 .25rem;border-radius:9999px;background-color:#faf8f0;border:1px solid rgba(61,53,43,.12);font-family:var(--paper-font-default, "Luminari", "Cormorant Garamond", Georgia, serif);font-size:.875rem;color:#68635c}.table-module__boardColumnBody___uAgRF{flex:1;display:flex;flex-direction:column;min-height:96px}.table-module__boardRow___C1P60{padding:.75rem 1.5rem;border-bottom:1px solid rgba(61,53,43,.08)}.table-module__boardRow___C1P60:last-child{border-bottom:none}.table-module__boardEmpty___IKv2W{padding:1rem 1.5rem;text-align:center;font-family:Caveat,cursive;font-size:1.125rem;color:#a8a399;font-style:italic}.table-module__chalkboardFrame___xB3N5{filter:drop-shadow(0 8px 14px rgba(0,0,0,.3));--sketch-stroke: rgba(200, 210, 195, .3)}.table-module__chalkboardWrapper___KjY5r .table-module__toolbar___zhCel{background-color:#1e3a2d;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='c'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix type='matrix' values='0 0 0 0 0.15 0 0 0 0 0.28 0 0 0 0 0.20 0 0 0 0.08 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23c)' opacity='1'/%3E%3C/svg%3E")}.table-module__chalkboardWrapper___KjY5r .table-module__panelFooter___lCCKo{background-color:#1e3a2d;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='c'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix type='matrix' values='0 0 0 0 0.15 0 0 0 0 0.28 0 0 0 0 0.20 0 0 0 0.08 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23c)' opacity='1'/%3E%3C/svg%3E")}.table-module__chalkboardWrapper___KjY5r .table-module__searchIcon___ayhK8{color:#a8b5a0}.table-module__chalkboardWrapper___KjY5r .table-module__searchInput___PqsEG{color:#d4e8cb;font-family:JetBrains Mono,monospace;font-size:.875rem;background-color:#142e2266;background-image:none;border:1px solid rgba(200,210,195,.2);border-radius:8px;box-shadow:1px 1px 2px #00000026}.table-module__chalkboardWrapper___KjY5r .table-module__searchInput___PqsEG::-moz-placeholder{color:#a8b5a0;font-family:Caveat,cursive}.table-module__chalkboardWrapper___KjY5r .table-module__searchInput___PqsEG::placeholder{color:#a8b5a0;font-family:Caveat,cursive}.table-module__chalkboardWrapper___KjY5r .table-module__searchInput___PqsEG:focus{outline:2px dotted #d4e8cb;outline-offset:2px}.table-module__chalkboard___v0m3A{color:#e8e4d9}.table-module__chalkboard___v0m3A .table-module__th___GQbKk{font-family:Caveat,cursive;font-weight:600;font-size:1.125rem;text-transform:uppercase;letter-spacing:.06em;color:#d4e8cb;background-color:#1e3a2d;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='c'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix type='matrix' values='0 0 0 0 0.15 0 0 0 0 0.28 0 0 0 0 0.20 0 0 0 0.08 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23c)' opacity='1'/%3E%3C/svg%3E");border-bottom-color:#c8d2c333}.table-module__chalkboard___v0m3A .table-module__td___WktB5{color:#e8e4d9;border-bottom-color:#c8d2c333}.table-module__boardColumnHeader___kY3Fj.table-module__chalkboard___v0m3A{font-family:Caveat,cursive;color:#d4e8cb;background-color:#1e3a2d;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='c'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix type='matrix' values='0 0 0 0 0.15 0 0 0 0 0.28 0 0 0 0 0.20 0 0 0 0.08 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23c)' opacity='1'/%3E%3C/svg%3E");border-bottom-color:#c8d2c333}.table-module__boardRow___C1P60.table-module__chalkboard___v0m3A{color:#e8e4d9;border-bottom-color:#c8d2c333}.table-module__expandIcon___8V45X svg{transition:transform .15s ease-out}.table-module__expandIcon___8V45X[aria-expanded=true] svg{transform:rotate(90deg)}.cells-module__cell___x7DuX{position:relative}.cells-module__toggle___U6zvr{font-family:JetBrains Mono,monospace;font-size:.75rem;padding:2px 10px;border-radius:4px;border:1px solid rgba(61,53,43,.15);background:#3d352b0a;color:#a8a399;cursor:pointer;transition:background .15s ease,color .15s ease,border-color .15s ease}.cells-module__toggle___U6zvr:hover{background:#3d352b14}.cells-module__toggleActive___B5U1p{background:#8fb99626;border-color:#8fb9964d;color:#3d5a42}.cells-module__chalkToggle___mGnxj{font-size:.75rem;border-color:#c8d2c326;background:#c8d2c30f;color:#a8b5a0}.cells-module__chalkToggleActive___40QxK{background:#d4e8cb1f;border-color:#d4e8cb40;color:#d4e8cb}.cells-module__input___6FtwV{font-family:JetBrains Mono,monospace;font-size:.75rem;padding:2px 8px;border-radius:4px;border:1px solid rgba(61,53,43,.15);background:#faf8f099;color:#1a1917;width:100%;max-width:180px;outline:none;transition:border-color .15s ease,box-shadow .15s ease}.cells-module__input___6FtwV::-moz-placeholder{color:#a8a399}.cells-module__input___6FtwV::placeholder{color:#a8a399}.cells-module__input___6FtwV:focus{border-color:#8fb99680;box-shadow:0 0 0 2px #8fb99626}.cells-module__input___6FtwV[type=number]{max-width:100px}.cells-module__chalkInput___T8jRO{font-size:.75rem;border-color:#c8d2c333;background:#142e2299;color:#d4e8cb}.cells-module__chalkInput___T8jRO::-moz-placeholder{color:#a8b5a0}.cells-module__chalkInput___T8jRO::placeholder{color:#a8b5a0}.cells-module__chalkInput___T8jRO:focus{border-color:#d4e8cb66;box-shadow:0 0 0 2px #d4e8cb1a}.cells-module__dropdownToggle___OPFkY{display:inline-flex;align-items:center;gap:6px;font-family:JetBrains Mono,monospace;font-size:.75rem;color:#8c7d56;background:#8c7d5614;border:1px solid rgba(140,125,86,.2);border-radius:4px;padding:2px 8px 2px 10px;cursor:pointer;transition:background .15s ease,border-color .15s ease}.cells-module__dropdownToggle___OPFkY:hover{background:#8c7d5624;border-color:#8c7d5659}.cells-module__chevron___LosSi{flex-shrink:0;stroke:currentColor;transition:transform .15s ease}.cells-module__chevronOpen___sM4y0{transform:rotate(180deg)}.cells-module__dropdown___8Ov5L{position:absolute;top:calc(100% + 4px);left:0;min-width:100%;background:#faf8f0;border:1px solid rgba(61,53,43,.12);border-radius:6px;box-shadow:0 4px 12px #3d352b1f;z-index:20;padding:4px 0;animation:cells-module__fadeIn___ha0fT .12s ease}@keyframes cells-module__fadeIn___ha0fT{0%{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:translateY(0)}}.cells-module__dropdownItem___3iLvf{font-family:JetBrains Mono,monospace;font-size:.75rem;color:#68635c;padding:6px 12px;cursor:default}.cells-module__dropdownItem___3iLvf:hover{background:#8fb9961f;color:#1a1917}.cells-module__chalkDropdownToggle___o9LTb{font-size:.75rem;color:#d4e8cb;background:#c8d2c314;border-color:#c8d2c326}.cells-module__chalkDropdownToggle___o9LTb:hover{background:#c8d2c326;border-color:#c8d2c340}.cells-module__chalkDropdown___E1y9a{background-color:#1e3a2d;border-color:#c8d2c333;box-shadow:0 4px 16px #0006}.cells-module__chalkDropdownItem___cW122{font-size:.75rem;color:#e8e4d9}.cells-module__chalkDropdownItem___cW122:hover{background:#c8d2c31f;color:#d4e8cb}.prop-table-module__wrapper___AufwJ.prop-table-module__wrapper___AufwJ{overflow:visible}.prop-table-module__codeName___Sa7rq{font-family:JetBrains Mono,monospace;font-size:.875rem;color:#51719b}.prop-table-module__required___4C7Pm{color:#9e5e5e;margin-left:2px}.prop-table-module__desc___QNNO7{font-family:var(--paper-font-default, "Luminari", "Cormorant Garamond", Georgia, serif);color:#68635c;font-size:1rem;line-height:1.5;display:block}.prop-table-module__chalkCodeName___Erzq6{color:#d4e8cb}.prop-table-module__chalkRequired___3Mh-y{color:#e8a0a0}.prop-table-module__chalkDesc___46JCK{color:#e8e4d9}.swatch-module__swatch___Kvyl1{border-radius:.75rem;border:2px solid rgba(61,53,43,.12);transition:all .2s ease;flex-shrink:0;cursor:pointer;background:transparent;padding:0}.swatch-module__active___4ydAA{border-color:#7c9cc0;box-shadow:0 4px 6px #3d352b14;transform:scale(1.1)}.swatch-module__disabled___t3NKC{opacity:.35;filter:grayscale(100%);cursor:not-allowed}.swatch-module__chalkboard___0IL0r{border-color:#c8d2c333}.swatch-module__chalkboard___0IL0r.swatch-module__active___4ydAA{border-color:#d4e8cb;box-shadow:0 4px 6px #00000040}.card-module__borderLayer___WSpJq{position:relative;display:flex;flex-direction:column;overflow:hidden;border-radius:10.2613552204px 13.9939804531px 12.8313181748px 11.7450953895px;--sketch-stroke: rgba(61, 53, 43, .32)}.card-module__default___glPy-{filter:drop-shadow(0 1px 2px rgba(61,53,43,.09))}.card-module__elevated___uhWj9{filter:drop-shadow(0 4px 6px rgba(61,53,43,.1)) drop-shadow(0 1px 2px rgba(61,53,43,.06))}.card-module__textureLayer___Kcofz{position:relative;z-index:1;flex:1 1 auto;padding:2rem;font-size:1.125rem;line-height:32px;background-color:#faf8f0;border-radius:10.820763309px 14.017098291px 14.3591687278px 10.5718840179px;clip-path:var(--sketch-clip)}.card-module__textureLayer___Kcofz>*+*{margin-top:2rem}.card-module__flat___KnG5z,.card-module__flat___KnG5z .card-module__textureLayer___Kcofz{border-radius:12px}.card-module__small___HXUTr .card-module__textureLayer___Kcofz{padding:.75rem 1rem;font-size:1rem;line-height:1.2}.card-module__small___HXUTr .card-module__textureLayer___Kcofz>*+*{margin-top:.75rem}.card-module__withAccent___2t7bV:before{content:"";position:absolute;width:160px;height:160px;border-radius:50%;top:-40px;right:-40px;filter:blur(40px);mix-blend-mode:multiply;pointer-events:none;z-index:0;opacity:.12}.card-module__accentBlue___a1KIq:before{background:radial-gradient(circle,#AFC6E0 0%,transparent 70%)}.card-module__accentGreen___RNWoA:before{background:radial-gradient(circle,#B5D4BA 0%,transparent 70%)}.card-module__accentAmber___uMhom:before{background:radial-gradient(circle,#E4C9A8 0%,transparent 70%)}.card-module__accentRose___VPI3t:before{background:radial-gradient(circle,#DEB5B5 0%,transparent 70%)}.card-module__accentSlate___-l4jE:before{background:radial-gradient(circle,#B0BEC8 0%,transparent 70%)}.card-module__chalkboard___bQ48O{--sketch-stroke: rgba(200, 210, 195, .3);filter:drop-shadow(0 4px 10px rgba(0,0,0,.28))}.card-module__chalkboard___bQ48O .card-module__textureLayer___Kcofz{color:#e8e4d9;background-color:#142e22}.input-module__wrapper___xaEw6{display:flex;flex-direction:column;gap:.5rem}.input-module__label___lu7R1{font-family:var(--paper-font-default, "Luminari", "Cormorant Garamond", Georgia, serif);font-size:1rem;font-weight:600;color:#1a1917;letter-spacing:.03em}.input-module__field___khFpX{position:relative;display:block;width:100%;border-radius:8px;--sketch-fill: rgba(61, 53, 43, .05);--sketch-stroke: rgba(61, 53, 43, .32)}.input-module__field___khFpX:hover{--sketch-stroke: rgba(61, 53, 43, .42)}.input-module__field___khFpX:focus-within{outline:2px dotted #A8A399;outline-offset:2px;--sketch-stroke: rgba(138, 155, 168, .45)}.input-module__input___h7K-F{-webkit-appearance:none;-moz-appearance:none;appearance:none;display:block;position:relative;z-index:1;width:100%;border:none;outline:none;background:transparent;color:#1a1917;font-family:var(--paper-font-default, "Luminari", "Cormorant Garamond", Georgia, serif);font-weight:500;line-height:1.2}.input-module__input___h7K-F::-moz-placeholder{color:#a8a399;font-weight:400;font-family:Caveat,cursive;font-size:1.125rem}.input-module__input___h7K-F::placeholder{color:#a8a399;font-weight:400;font-family:Caveat,cursive;font-size:1.125rem}.input-module__small___SkByh .input-module__input___h7K-F{padding:.5rem .75rem;font-size:.875rem}.input-module__medium___0QPuV .input-module__input___h7K-F{padding:.75rem 1rem;font-size:1rem}.input-module__large___zGwRu .input-module__input___h7K-F{padding:1rem 1.25rem;font-size:1.125rem}.input-module__error___QDqga{--sketch-stroke: rgba(201, 139, 139, .45)}.input-module__error___QDqga:focus-within{--sketch-stroke: rgba(201, 139, 139, .55)}.input-module__disabled___K-5hi{opacity:.55;--sketch-fill: rgba(61, 53, 43, .03);--sketch-stroke: rgba(61, 53, 43, .15)}.input-module__disabled___K-5hi .input-module__input___h7K-F{cursor:not-allowed}.input-module__disabled___K-5hi:hover{--sketch-stroke: rgba(61, 53, 43, .15)}.input-module__helperText___njeLH{font-family:Caveat,cursive;font-size:1rem;color:#a8a399}.input-module__helperError___qDBpD{color:#9e5e5e}.input-module__chalkboard___Xh-5s .input-module__label___lu7R1{color:#d4e8cb}.input-module__chalkboard___Xh-5s .input-module__helperText___njeLH{color:#a8b5a0}.input-module__chalkboard___Xh-5s .input-module__field___khFpX{--sketch-fill: rgba(200, 210, 195, .08);--sketch-stroke: rgba(200, 210, 195, .3)}.input-module__chalkboard___Xh-5s .input-module__field___khFpX:hover{--sketch-stroke: rgba(200, 210, 195, .45)}.input-module__chalkboard___Xh-5s .input-module__field___khFpX:focus-within{outline:2px dotted #d4e8cb;outline-offset:2px;--sketch-stroke: #d4e8cb}.input-module__chalkboard___Xh-5s .input-module__input___h7K-F{color:#d4e8cb}.input-module__chalkboard___Xh-5s .input-module__input___h7K-F::-moz-placeholder{color:#a8b5a0}.input-module__chalkboard___Xh-5s .input-module__input___h7K-F::placeholder{color:#a8b5a0}.input-module__chalkboard___Xh-5s .input-module__disabled___K-5hi{--sketch-fill: rgba(200, 210, 195, .04);--sketch-stroke: rgba(200, 210, 195, .12)}.input-module__chalkboard___Xh-5s .input-module__disabled___K-5hi:hover{--sketch-stroke: rgba(200, 210, 195, .12)}.select-module__wrapper___Hc5F3{display:flex;flex-direction:column;gap:.5rem;position:relative}.select-module__label___ay-3s{font-family:var(--paper-font-default, "Luminari", "Cormorant Garamond", Georgia, serif);font-size:1rem;font-weight:600;color:#1a1917;letter-spacing:.03em}.select-module__nativeSelect___UA2d-{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0;opacity:0}.select-module__trigger___xMYHi{position:relative;-webkit-appearance:none;-moz-appearance:none;appearance:none;display:flex;align-items:center;justify-content:space-between;width:100%;text-align:left;font-family:var(--paper-font-default, "Luminari", "Cormorant Garamond", Georgia, serif);font-weight:500;line-height:1.2;color:#1a1917;cursor:pointer;background:transparent;border:none;outline:none;border-radius:8px;--sketch-fill: rgba(61, 53, 43, .05);--sketch-stroke: rgba(61, 53, 43, .32)}.select-module__trigger___xMYHi:hover:not(:disabled){--sketch-stroke: rgba(61, 53, 43, .42)}.select-module__trigger___xMYHi.select-module__open___w3mbZ{--sketch-stroke: rgba(138, 155, 168, .45)}.select-module__trigger___xMYHi:focus-visible{outline:2px dotted #A8A399;outline-offset:2px}.select-module__trigger___xMYHi:disabled{opacity:.55;cursor:not-allowed;--sketch-fill: rgba(61, 53, 43, .03);--sketch-stroke: rgba(61, 53, 43, .15)}.select-module__triggerLabel___ihpER{position:relative;z-index:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select-module__placeholder___0VOFP{color:#a8a399;font-family:Caveat,cursive;font-size:1.125rem}.select-module__small___iU9W9{padding:.5rem .75rem;font-size:.875rem}.select-module__small___iU9W9 .select-module__chevron___0dCTg{width:14px;height:14px}.select-module__medium___B-XBN{padding:.75rem 1rem;font-size:1rem}.select-module__large___iII2c{padding:1rem 1.25rem;font-size:1.125rem}.select-module__chevron___0dCTg{position:relative;z-index:1;flex-shrink:0;margin-left:.5rem;color:#a8a399;transition:transform .2s ease-out}.select-module__chevronOpen___cFOYe{transform:rotate(180deg)}.select-module__error___P5RBk{--sketch-stroke: rgba(201, 139, 139, .45)}.select-module__error___P5RBk.select-module__open___w3mbZ{--sketch-stroke: rgba(201, 139, 139, .55)}.select-module__dropdown___Q-uK3{position:absolute;top:calc(100% + 6px);left:0;width:100%;z-index:600;--sketch-fill: #F5F1E6;--sketch-stroke: rgba(61, 53, 43, .32);filter:drop-shadow(0 8px 14px rgba(61,53,43,.12));animation:select-module__slideDown___sT374 .18s ease-out}.select-module__options___HmrQ0{position:relative;z-index:1;padding:.75rem 1rem;max-height:320px;overflow-y:auto}@keyframes select-module__slideDown___sT374{0%{opacity:0;transform:translateY(-4px) scale(.97)}to{opacity:1;transform:translateY(0) scale(1)}}.select-module__option___vNnue{padding:.5rem .75rem;font-family:var(--paper-font-default, "Luminari", "Cormorant Garamond", Georgia, serif);font-size:1rem;color:#1a1917;cursor:pointer;border-radius:7.3494871656px 8.038152972px 8.8915453758px 7.3795197837px;transition:background-color .15s ease-out}.select-module__option___vNnue:hover:not(.select-module__optionDisabled___ex2zq){background-image:radial-gradient(circle at 50% 50%,rgba(143,185,150,.22) 0%,transparent 70%);background-color:#8fb9961f}.select-module__optionSelected___tAFjn{font-weight:600;color:#1a1917;background-image:radial-gradient(circle at 50% 50%,rgba(138,155,168,.18) 0%,transparent 70%)}.select-module__optionHighlighted___zYQLq{background-image:radial-gradient(circle at 50% 50%,rgba(143,185,150,.28) 0%,transparent 70%);background-color:#8fb99624}.select-module__optionDisabled___ex2zq{opacity:.45;cursor:not-allowed;text-decoration:line-through}.select-module__helperText___r5gyn{font-family:Caveat,cursive;font-size:1rem;color:#a8a399}.select-module__helperError___ydSPT{color:#9e5e5e}.select-module__chalkboard___sXBw8 .select-module__label___ay-3s{color:#d4e8cb}.select-module__chalkboard___sXBw8 .select-module__helperText___r5gyn{color:#a8b5a0}.select-module__chalkboard___sXBw8 .select-module__trigger___xMYHi{color:#d4e8cb;--sketch-fill: rgba(200, 210, 195, .08);--sketch-stroke: rgba(200, 210, 195, .3)}.select-module__chalkboard___sXBw8 .select-module__trigger___xMYHi:hover:not(:disabled){--sketch-stroke: rgba(200, 210, 195, .45)}.select-module__chalkboard___sXBw8 .select-module__trigger___xMYHi.select-module__open___w3mbZ{--sketch-stroke: #d4e8cb}.select-module__chalkboard___sXBw8 .select-module__trigger___xMYHi:focus-visible{outline:2px dotted #d4e8cb;outline-offset:2px}.select-module__chalkboard___sXBw8 .select-module__trigger___xMYHi:disabled{opacity:.55;--sketch-fill: rgba(200, 210, 195, .04);--sketch-stroke: rgba(200, 210, 195, .12)}.select-module__chalkboard___sXBw8 .select-module__placeholder___0VOFP,.select-module__chalkboard___sXBw8 .select-module__chevron___0dCTg{color:#a8b5a0}.select-module__chalkboard___sXBw8 .select-module__dropdown___Q-uK3{--sketch-fill: #1e3a2d;--sketch-stroke: rgba(200, 210, 195, .3);filter:drop-shadow(0 8px 14px rgba(0,0,0,.3))}.select-module__chalkboard___sXBw8 .select-module__option___vNnue{color:#e8e4d9;border-radius:8px}.select-module__chalkboard___sXBw8 .select-module__option___vNnue:hover:not(.select-module__optionDisabled___ex2zq){background-image:none;background-color:#c8d2c314}.select-module__chalkboard___sXBw8 .select-module__optionSelected___tAFjn{color:#d4e8cb;background-image:none;background-color:#c8d2c31f}.select-module__chalkboard___sXBw8 .select-module__optionHighlighted___zYQLq{background-image:none;background-color:#c8d2c31a}.tabs-module__tabs___UMeM9{display:flex;flex-direction:column}.tabs-module__tabBar___qKukf{display:flex;gap:.25rem}.tabs-module__tabButton___DyC14{flex:0 0 auto}.tabs-module__content___F1vOY{margin-top:.5rem}.alert-module__alert___j7ZRS{position:relative;display:flex;align-items:center;gap:.75rem;padding:.75rem 1rem;color:#68635c;filter:drop-shadow(0 1px 2px rgba(61,53,43,.09));--sketch-stroke: rgba(61, 53, 43, .32)}.alert-module__surface___IaVgU{position:absolute;top:0;right:0;bottom:0;left:0;z-index:0;border-radius:8px;clip-path:var(--sketch-clip)}.alert-module__iconWrapper___kLoxT{position:relative;z-index:1;flex-shrink:0;display:flex;align-items:center;justify-content:center;width:20px;height:20px}.alert-module__message___klR2U{flex:1;min-width:0;position:relative;z-index:1;font-family:Cormorant Garamond,Georgia,serif;font-size:1rem;line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.alert-module__dismiss___f2uoG{position:relative;z-index:1;flex-shrink:0;display:flex;align-items:center;justify-content:center;padding:.25rem;background:transparent;border:none;cursor:pointer;border-radius:7.4022820412px 8.1572004364px 8.081755765px 7.4344159448px;color:inherit;opacity:.6;transition:opacity .15s ease-out,background .15s ease-out}.alert-module__dismiss___f2uoG:hover{opacity:1;background:#0000000a}.alert-module__dismiss___f2uoG:focus-visible{opacity:1;outline:2px solid #8A9BA8;outline-offset:2px}.alert-module__info___PBo1l{--sketch-stroke: rgba(138, 155, 168, .45)}.alert-module__success___AVBKS{--sketch-stroke: rgba(94, 138, 102, .42)}.alert-module__warning___zkMaJ{--sketch-stroke: rgba(166, 123, 79, .45)}.alert-module__error___cxg96{color:#9e5e5e;--sketch-stroke: rgba(158, 94, 94, .45)}.alert-module__chalkboard___7pgWk{color:#e8e4d9;--sketch-stroke: rgba(200, 210, 195, .4)}.alert-module__chalkboard___7pgWk .alert-module__surface___IaVgU{background-color:#1e3a2d;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='c'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix type='matrix' values='0 0 0 0 0.15 0 0 0 0 0.28 0 0 0 0 0.20 0 0 0 0.08 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23c)' opacity='1'/%3E%3C/svg%3E");background-repeat:repeat;background-size:200px 200px}.alert-module__chalkboard___7pgWk .alert-module__dismiss___f2uoG{color:#a8b5a0}.alert-module__chalkboard___7pgWk .alert-module__dismiss___f2uoG:hover{background:#c8d2c314}.modal-module__overlay___a52Ni{position:fixed;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;padding:1.5rem;background-color:#1a191738;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)' opacity='0.04'/%3E%3C/svg%3E");background-repeat:repeat;background-size:200px 200px;z-index:400;animation:modal-module__fadeIn___5OWd5 .2s ease-out}.modal-module__backdrop___RS4yj{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;padding:0;margin:0;border:none;background:transparent;cursor:default;z-index:400}.modal-module__modal___ZioOV{position:relative;background-color:#faf8f0;border-radius:16.861741964px 22.4598068376px 20.6118764586px 16.3015887388px;border:1px solid rgba(61,53,43,.12);box-shadow:0 10px 15px #3d352b1a,0 4px 6px #3d352b14;max-height:90vh;overflow-y:auto;animation:modal-module__slideUp___vfFrm .25s ease-out;z-index:500}.modal-module__small___hcxwF{width:100%;max-width:360px}.modal-module__medium___mjbM5{width:100%;max-width:480px}.modal-module__large___1dzyf{width:100%;max-width:640px}.modal-module__header___iP09B{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:1.5rem 1.5rem 0;position:relative;z-index:1}.modal-module__title___nj06m{font-family:var(--paper-font-default, "Luminari", "Cormorant Garamond", Georgia, serif);font-size:1.875rem;font-weight:700;color:#1a1917;line-height:1.2;margin:0}.modal-module__close___gQou9{position:relative;z-index:1;display:flex;align-items:center;justify-content:center;padding:.5rem;background:transparent;border:none;cursor:pointer;border-radius:7.4946177763px 8.8798499554px 8.1508379227px 7.5248096829px;color:#a8a399;transition:color .15s ease-out,background .15s ease-out;flex-shrink:0}.modal-module__close___gQou9:hover{color:#1a1917;background:#0000000a}.modal-module__close___gQou9:focus-visible{outline:2px solid #8A9BA8;outline-offset:2px}.modal-module__body___Y-EdA{padding:1rem 1.5rem 1.5rem;position:relative;z-index:1}.modal-module__chalkboard___qY8qo{background-color:#1e3a2d;border-color:#c8d2c333}.modal-module__chalkboard___qY8qo .modal-module__title___nj06m{color:#d4e8cb}.modal-module__chalkboard___qY8qo .modal-module__close___gQou9{color:#a8b5a0}.modal-module__chalkboard___qY8qo .modal-module__close___gQou9:hover{color:#d4e8cb;background:#c8d2c314}@keyframes modal-module__fadeIn___5OWd5{0%{opacity:0}to{opacity:1}}@keyframes modal-module__slideUp___vfFrm{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}@media (prefers-reduced-motion: reduce){.modal-module__overlay___a52Ni,.modal-module__modal___ZioOV{animation:none}}.textarea-module__wrapper___NbiNO{display:flex;flex-direction:column;gap:.5rem}.textarea-module__label___ejhyZ{font-family:var(--paper-font-default, "Luminari", "Cormorant Garamond", Georgia, serif);font-size:1rem;font-weight:600;color:#1a1917;letter-spacing:.03em}.textarea-module__field___KluQf{position:relative;display:block;width:100%;border-radius:8px;--sketch-fill: rgba(61, 53, 43, .05);--sketch-stroke: rgba(61, 53, 43, .32)}.textarea-module__field___KluQf:hover{--sketch-stroke: rgba(61, 53, 43, .42)}.textarea-module__field___KluQf:focus-within{outline:2px dotted #A8A399;outline-offset:2px;--sketch-stroke: rgba(138, 155, 168, .45)}.textarea-module__textarea___0y-7v{-webkit-appearance:none;-moz-appearance:none;appearance:none;display:block;position:relative;z-index:1;width:100%;min-height:4rem;resize:none;border:none;outline:none;background:transparent;color:#1a1917;font-family:var(--paper-font-default, "Luminari", "Cormorant Garamond", Georgia, serif);font-weight:500;line-height:1.5}.textarea-module__textarea___0y-7v::-moz-placeholder{color:#a8a399;font-weight:400;font-family:Caveat,cursive;font-size:1.125rem}.textarea-module__textarea___0y-7v::placeholder{color:#a8a399;font-weight:400;font-family:Caveat,cursive;font-size:1.125rem}.textarea-module__resizeGrip___lONlE{position:absolute;right:3px;bottom:3px;z-index:2;display:flex;padding:3px;cursor:ns-resize;color:var(--sketch-stroke, rgba(61, 53, 43, .32));opacity:.75;touch-action:none;transition:opacity .15s ease-out}.textarea-module__resizeGrip___lONlE:hover{opacity:1}.textarea-module__resizeGrip___lONlE svg{width:11px;height:11px;stroke:currentColor;stroke-width:1.4;stroke-linecap:round}.textarea-module__small___yPyr8 .textarea-module__textarea___0y-7v{padding:.5rem .75rem;font-size:.875rem}.textarea-module__medium___ezQxA .textarea-module__textarea___0y-7v{padding:.75rem 1rem;font-size:1rem}.textarea-module__large___xfeKi .textarea-module__textarea___0y-7v{padding:1rem 1.25rem;font-size:1.125rem}.textarea-module__error___EkXKJ{--sketch-stroke: rgba(201, 139, 139, .45)}.textarea-module__error___EkXKJ:focus-within{--sketch-stroke: rgba(201, 139, 139, .55)}.textarea-module__disabled___9CKbb{opacity:.55;--sketch-fill: rgba(61, 53, 43, .03);--sketch-stroke: rgba(61, 53, 43, .15)}.textarea-module__disabled___9CKbb .textarea-module__textarea___0y-7v{cursor:not-allowed}.textarea-module__disabled___9CKbb:hover{--sketch-stroke: rgba(61, 53, 43, .15)}.textarea-module__helperText___l1sPh{font-family:Caveat,cursive;font-size:1rem;color:#a8a399}.textarea-module__helperError___VfTLy{color:#9e5e5e}.textarea-module__chalkboard___zZ0X0 .textarea-module__label___ejhyZ{color:#d4e8cb}.textarea-module__chalkboard___zZ0X0 .textarea-module__helperText___l1sPh{color:#a8b5a0}.textarea-module__chalkboard___zZ0X0 .textarea-module__field___KluQf{--sketch-fill: rgba(200, 210, 195, .08);--sketch-stroke: rgba(200, 210, 195, .3)}.textarea-module__chalkboard___zZ0X0 .textarea-module__field___KluQf:hover{--sketch-stroke: rgba(200, 210, 195, .45)}.textarea-module__chalkboard___zZ0X0 .textarea-module__field___KluQf:focus-within{outline:2px dotted #d4e8cb;outline-offset:2px;--sketch-stroke: #d4e8cb}.textarea-module__chalkboard___zZ0X0 .textarea-module__textarea___0y-7v{color:#d4e8cb}.textarea-module__chalkboard___zZ0X0 .textarea-module__textarea___0y-7v::-moz-placeholder{color:#a8b5a0}.textarea-module__chalkboard___zZ0X0 .textarea-module__textarea___0y-7v::placeholder{color:#a8b5a0}.textarea-module__chalkboard___zZ0X0 .textarea-module__disabled___9CKbb{--sketch-fill: rgba(200, 210, 195, .04);--sketch-stroke: rgba(200, 210, 195, .12)}.textarea-module__chalkboard___zZ0X0 .textarea-module__disabled___9CKbb:hover{--sketch-stroke: rgba(200, 210, 195, .12)}.progress-module__track___a5BMO{position:relative;width:100%;overflow:hidden}.progress-module__svg___3U0-E{display:block;width:100%;height:100%}.list-item-module__listItem___-tw9O{position:relative;display:flex;align-items:center;gap:.5rem;width:100%;font-family:var(--paper-font-default, "Luminari", "Cormorant Garamond", Georgia, serif);color:#1a1917;background:transparent;border:none;border-radius:8px;text-align:left;outline:none}.list-item-module__listItem___-tw9O:focus-visible{outline:2px solid #8A9BA8;outline-offset:2px}.list-item-module__static___qtEX6{cursor:default}.list-item-module__clickable___GLJmd{cursor:pointer}.list-item-module__blobBg___O3Mzh{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;z-index:0;pointer-events:none}.list-item-module__blobFill___dXHk1{fill:transparent;transition:fill .25s ease}.list-item-module__blobRing___S9mas{fill:none;stroke:#3d352b38;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;opacity:0;transition:opacity .35s ease 50ms}.list-item-module__clickable___GLJmd:hover .list-item-module__blobFill___dXHk1{fill:#8fb9961f}.list-item-module__clickable___GLJmd:active .list-item-module__blobFill___dXHk1{fill:#8fb99633}.list-item-module__clickable___GLJmd:hover .list-item-module__blobRing___S9mas{opacity:1}.list-item-module__clickable___GLJmd:active .list-item-module__blobRing___S9mas{stroke:#3d352b8c}.list-item-module__active___UsL8O .list-item-module__blobFill___dXHk1{fill:#8fb99640}.list-item-module__active___UsL8O:hover .list-item-module__blobFill___dXHk1{fill:#8fb9964d}.list-item-module__active___UsL8O .list-item-module__blobRing___S9mas{opacity:1}.list-item-module__small___9dphK{padding:.25rem .5rem;font-size:1rem;line-height:1.2}.list-item-module__medium___yGZCr{padding:.5rem .75rem;font-size:1.125rem;line-height:1.2}.list-item-module__icon___2b4wU{position:relative;z-index:1;display:flex;align-items:center;justify-content:center;flex-shrink:0;color:#68635c}.list-item-module__label___SIzJ4{position:relative;z-index:1;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.list-item-module__action___qGh0-{position:relative;z-index:1;display:flex;align-items:center;flex-shrink:0;margin-left:auto}.list-item-module__chalkboard___qpWuM{color:#e8e4d9}.list-item-module__chalkboard___qpWuM .list-item-module__icon___2b4wU{color:#a8b5a0}.list-item-module__chalkboard___qpWuM .list-item-module__blobRing___S9mas{stroke:#c8d2c359}.list-item-module__chalkboard___qpWuM.list-item-module__clickable___GLJmd:active .list-item-module__blobRing___S9mas{stroke:#c8d2c3a6}.list-item-module__chalkboard___qpWuM:focus-visible{outline:2px solid #d4e8cb;outline-offset:2px}.accordion-module__accordion___mqGl-{width:100%}.accordion-module__header___mLfbd{display:flex;align-items:center;gap:.5rem;width:100%;padding:0;font-family:inherit;font-size:inherit;line-height:inherit;color:inherit;background:transparent;border:none;cursor:pointer;text-align:left}.accordion-module__header___mLfbd:hover .accordion-module__icon___Z90NR{color:#1a1917}.accordion-module__header___mLfbd:focus-visible{outline:2px solid #8A9BA8;outline-offset:2px;border-radius:8px}.accordion-module__icon___Z90NR{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:1em;height:1em;font-size:.65em;color:#68635c;transition:transform .2s ease,color .15s ease-out}.accordion-module__title___HusgG{flex:1}.accordion-module__content___1K0td{margin-top:.5rem;padding-left:calc(1em + .5rem);color:#68635c;font-size:1rem;line-height:1.5}.accordion-module__chalkboard___am8r4 .accordion-module__icon___Z90NR{color:#a8b5a0}.accordion-module__chalkboard___am8r4 .accordion-module__header___mLfbd:hover .accordion-module__icon___Z90NR{color:#d4e8cb}.accordion-module__chalkboard___am8r4 .accordion-module__header___mLfbd:focus-visible{outline:2px solid #d4e8cb;outline-offset:2px}.accordion-module__chalkboard___am8r4 .accordion-module__content___1K0td{color:#a8b5a0}.accordion-module__icon___Z90NR svg{transition:transform .15s ease-out}.accordion-module__expanded___836xG .accordion-module__icon___Z90NR svg{transform:rotate(90deg)}.icon-module__icon___2vrJz{position:relative;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;overflow:visible}.icon-module__blobBg___ENPYJ{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;z-index:0;pointer-events:none}.icon-module__blobFill___IPbwQ{fill:#f0ead8}.icon-module__blobRing___1awqV{fill:none;stroke:#3d352b59;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;opacity:.5}.icon-module__content___TaZR6{position:relative;z-index:1;display:flex;align-items:center;justify-content:center;color:#1a1917}.icon-module__small___Xp--F{width:36px;height:36px}.icon-module__medium___tCjMB{width:44px;height:44px}.icon-module__large___vBtP7{width:52px;height:52px}.radio-module__group___4RWR9{display:flex;flex-direction:column;gap:.75rem}.radio-module__horizontal___yWjeu{flex-direction:row;flex-wrap:wrap;gap:1.25rem}.radio-module__wrapper___BB05E{display:flex;align-items:center;gap:1rem;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.radio-module__wrapper___BB05E:hover .radio-module__blobFill___p5BX4{fill:#7c9cc02e}.radio-module__labelLeft___ijB93{flex-direction:row-reverse}.radio-module__input___M2nFJ{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.radio-module__input___M2nFJ:focus-visible~.radio-module__box___H7ofS{outline:2px dotted #A8A399;outline-offset:2px}.radio-module__input___M2nFJ:checked~.radio-module__box___H7ofS{--sketch-stroke: rgba(61, 53, 43, .7)}.radio-module__input___M2nFJ:checked~.radio-module__box___H7ofS .radio-module__dot___jVJ-d{transform:scale(1)}.radio-module__input___M2nFJ:disabled~.radio-module__box___H7ofS{opacity:.4;cursor:not-allowed}.radio-module__boxWrapper___Y3qis{position:relative;display:flex;align-items:center;justify-content:center;width:40px;height:40px}.radio-module__blobBg___IR-M5{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;z-index:0;pointer-events:none}.radio-module__blobFill___p5BX4{transition:fill .25s ease;fill:transparent}.radio-module__box___H7ofS{display:flex;align-items:center;justify-content:center;width:24px;height:24px;background-color:transparent;position:relative;z-index:1;border-radius:50%;--sketch-stroke: rgba(61, 53, 43, .42)}.radio-module__box___H7ofS:hover{--sketch-stroke: rgba(61, 53, 43, .6)}.radio-module__dot___jVJ-d{width:12px;height:12px;border-radius:50%;background-color:#1a1917;transform:scale(0);transition:transform .2s ease-out}.radio-module__labelText___I-nu3{font-family:var(--paper-font-default, "Luminari", "Cormorant Garamond", Georgia, serif);font-size:1.125rem;font-weight:400;color:#68635c;line-height:1.5}.radio-module__chalkboard___IIBqI .radio-module__labelText___I-nu3{color:#a8b5a0}.radio-module__chalkboard___IIBqI .radio-module__box___H7ofS{--sketch-stroke: rgba(200, 210, 195, .5)}.radio-module__chalkboard___IIBqI .radio-module__box___H7ofS:hover{--sketch-stroke: #d4e8cb}.radio-module__chalkboard___IIBqI .radio-module__dot___jVJ-d{background-color:#d4e8cb}.radio-module__chalkboard___IIBqI .radio-module__blobFill___p5BX4{display:none}.radio-module__chalkboard___IIBqI .radio-module__input___M2nFJ:focus-visible~.radio-module__box___H7ofS{outline-color:#d4e8cb}.radio-module__chalkboard___IIBqI .radio-module__input___M2nFJ:checked~.radio-module__box___H7ofS{--sketch-stroke: #d4e8cb}.switch-module__wrapper___5-2P1{display:inline-flex;align-items:center;gap:1rem;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none}.switch-module__labelLeft___WlT-N{flex-direction:row-reverse}.switch-module__input___YKZRj{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.switch-module__input___YKZRj:focus-visible~.switch-module__track___QNvnO{outline:2px solid #8A9BA8;outline-offset:2px}.switch-module__input___YKZRj:checked~.switch-module__track___QNvnO{background-color:#8fb996;--sketch-stroke: #5E8A66}.switch-module__input___YKZRj:checked~.switch-module__track___QNvnO .switch-module__thumb___cunvF{transform:translate(var(--switch-travel));background-color:#fdfcf8}.switch-module__input___YKZRj:disabled~.switch-module__track___QNvnO{opacity:.4;cursor:not-allowed}.switch-module__track___QNvnO{position:relative;flex-shrink:0;box-sizing:border-box;border-radius:9999px;background-color:#3d352b0f;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)' opacity='0.04'/%3E%3C/svg%3E");background-repeat:repeat;background-size:200px 200px;transition:background-color .2s ease;--sketch-stroke: rgba(61, 53, 43, .2)}.switch-module__thumb___cunvF{position:absolute;top:3px;left:3px;background-color:#68635c;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)' opacity='0.04'/%3E%3C/svg%3E");background-repeat:repeat;background-size:200px 200px;box-shadow:0 1px 2px #1a19171f;transition:transform .2s ease-out,background-color .2s ease}.switch-module__small___WPIxc .switch-module__track___QNvnO{width:34px;height:20px}.switch-module__small___WPIxc .switch-module__thumb___cunvF{width:12px;height:12px;border-radius:5.9190495668px 6.3443127509px 6.2731773717px 5.1450246877px}.switch-module__small___WPIxc{--switch-travel: 14px}.switch-module__medium___yPulW .switch-module__track___QNvnO{width:42px;height:24px}.switch-module__medium___yPulW .switch-module__thumb___cunvF{width:16px;height:16px;border-radius:6.6793936744px 8.5192742867px 9.4809086199px 7.331976778px}.switch-module__medium___yPulW{--switch-travel: 18px}.switch-module__large___VlKV1 .switch-module__track___QNvnO{width:52px;height:30px}.switch-module__large___VlKV1 .switch-module__thumb___cunvF{width:22px;height:22px;border-radius:9.883116473px 11.5902973882px 11.2637250449px 10.1073963964px}.switch-module__large___VlKV1{--switch-travel: 22px}.switch-module__labelText___9Qg39{font-family:var(--paper-font-default, "Luminari", "Cormorant Garamond", Georgia, serif);font-size:1.125rem;color:#68635c;line-height:1.5}.switch-module__chalkboard___qKTMz .switch-module__track___QNvnO{background:#c8d2c314;--sketch-stroke: rgba(200, 210, 195, .25)}.switch-module__chalkboard___qKTMz .switch-module__thumb___cunvF{background:#a8b5a0}.switch-module__chalkboard___qKTMz .switch-module__labelText___9Qg39{color:#a8b5a0}.switch-module__chalkboard___qKTMz .switch-module__input___YKZRj:checked~.switch-module__track___QNvnO{background:#3d5a42;--sketch-stroke: #a8c49a}.switch-module__chalkboard___qKTMz .switch-module__input___YKZRj:checked~.switch-module__track___QNvnO .switch-module__thumb___cunvF{background:#d4e8cb}.spinner-module__spinner___FDTk2{display:inline-flex;color:#68635c}.spinner-module__chalkboard___DLE1z{color:#d4e8cb}.spinner-module__svg___JnCWN{overflow:visible}.spinner-module__track___xbnbo{stroke:currentColor;stroke-width:3.4;opacity:.15}.spinner-module__head___j5dWe{stroke:currentColor;stroke-width:4.6;stroke-dasharray:26 74;animation:spinner-module__draw___dZVus 1.1s linear infinite}@keyframes spinner-module__draw___dZVus{to{stroke-dashoffset:-100}}@media (prefers-reduced-motion: reduce){.spinner-module__head___j5dWe{animation-duration:2.4s}}.skeleton-module__skeleton___HCSvg{display:block;animation:skeleton-module__pulse___6eCq1 1.4s ease-in-out infinite}.skeleton-module__svg___OzxGp{display:block;width:100%;height:100%}.skeleton-module__text___v17Nv{width:100%;height:1em;margin:.15em 0}.skeleton-module__rect___wqIJy{width:100%;height:100px}.skeleton-module__circle___RCmyR{width:40px;height:40px}@keyframes skeleton-module__pulse___6eCq1{0%,to{opacity:1}50%{opacity:.45}}@media (prefers-reduced-motion: reduce){.skeleton-module__skeleton___HCSvg{animation:none}}.divider-module__horizontal___tP3rG{display:flex;align-items:center;gap:.75rem;width:100%}.divider-module__line___KnBes{flex:1;height:2px;border-radius:9999px;background:linear-gradient(90deg,transparent,rgba(26,25,23,.18) 12%,rgba(26,25,23,.18) 88%,transparent)}.divider-module__label___WiUwZ{flex-shrink:0;font-family:Caveat,cursive;font-size:1.125rem;color:#a8a399;line-height:1}.divider-module__vertical___wBSrT{display:inline-block;align-self:stretch;width:2px;min-height:1em;border-radius:9999px;background:linear-gradient(180deg,transparent,rgba(26,25,23,.18) 12%,rgba(26,25,23,.18) 88%,transparent)}.divider-module__chalkboard___gXTde .divider-module__line___KnBes{background:linear-gradient(90deg,transparent,rgba(212,232,203,.25) 12%,rgba(212,232,203,.25) 88%,transparent)}.divider-module__chalkboard___gXTde .divider-module__label___WiUwZ{color:#a8b5a0}.divider-module__chalkboard___gXTde.divider-module__vertical___wBSrT{background:linear-gradient(180deg,transparent,rgba(212,232,203,.25) 12%,rgba(212,232,203,.25) 88%,transparent)}.tooltip-module__wrapper___XeVNe{display:inline-block}.tooltip-module__tooltip___e-rkz{position:fixed;z-index:700;max-width:240px;padding:.5rem .75rem;font-family:var(--paper-font-default, "Luminari", "Cormorant Garamond", Georgia, serif);font-size:.875rem;line-height:1.35;color:#1a1917;background-color:#e5dbc4;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='k'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix type='matrix' values='0 0 0 0 0.50 0 0 0 0 0.35 0 0 0 0 0.20 0 0 0 0.55 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23k)' opacity='1'/%3E%3C/svg%3E");background-repeat:repeat;background-size:200px 200px;border:1px solid rgba(61,53,43,.15);border-radius:7.5441723257px 8.382133141px 8.5588590697px 6.2925783997px;box-shadow:0 4px 6px #3d352b14,0 2px 4px #3d352b0f;pointer-events:none;animation:tooltip-module__tooltipIn___CZbRw .12s ease-out}.tooltip-module__tooltip___e-rkz:after{content:"";position:absolute;width:9px;height:9px;background-color:#e5dbc4;transform:rotate(45deg);z-index:-1}.tooltip-module__top___78WWU:after{bottom:-4px;left:50%;margin-left:-4.5px}.tooltip-module__bottom___Irl3O:after{top:-4px;left:50%;margin-left:-4.5px}.tooltip-module__left___C1Ec4:after{right:-4px;top:50%;margin-top:-4.5px}.tooltip-module__right___oUA-Z:after{left:-4px;top:50%;margin-top:-4.5px}.tooltip-module__chalkboard___Um6dx{color:#d4e8cb;background-color:#1e3a2d;border:1px solid rgba(200,210,195,.2)}.tooltip-module__chalkboard___Um6dx:after{background-color:#1e3a2d}@keyframes tooltip-module__tooltipIn___CZbRw{0%{opacity:0;transform:scale(.96)}to{opacity:1}}@media (prefers-reduced-motion: reduce){.tooltip-module__tooltip___e-rkz{animation:none}}.toast-module__stack___hDi0s{position:fixed;z-index:800;display:flex;flex-direction:column;gap:.75rem;max-width:calc(100vw - 2rem);pointer-events:none}.toast-module__stack___hDi0s>*{pointer-events:auto}.toast-module__topLeft___Luw-F{top:1.5rem;left:1.5rem}.toast-module__topCenter___N1DwF{top:1.5rem;left:50%;transform:translate(-50%)}.toast-module__topRight___Dtgau{top:1.5rem;right:1.5rem}.toast-module__bottomLeft___Eb2lo{bottom:1.5rem;left:1.5rem;flex-direction:column-reverse}.toast-module__bottomCenter___gs-Yb{bottom:1.5rem;left:50%;transform:translate(-50%);flex-direction:column-reverse}.toast-module__bottomRight___-0e2j{bottom:1.5rem;right:1.5rem;flex-direction:column-reverse}.toast-module__item___RFjtm{width:360px;max-width:100%;animation:toast-module__toastIn___9m9iN .2s ease-out}@keyframes toast-module__toastIn___9m9iN{0%{opacity:0;transform:translateY(8px) scale(.97)}to{opacity:1;transform:translateY(0) scale(1)}}@media (prefers-reduced-motion: reduce){.toast-module__item___RFjtm{animation:none}}.toast-module__card___ZCvJS{position:relative;display:flex;align-items:flex-start;gap:1rem;padding:1.25rem 1.5rem;color:#68635c;filter:drop-shadow(0 8px 14px rgba(61,53,43,.14));--sketch-stroke: rgba(61, 53, 43, .32)}.toast-module__surface___mfMl0{position:absolute;top:0;right:0;bottom:0;left:0;z-index:0;border-radius:12px;clip-path:var(--sketch-clip)}.toast-module__iconWrapper___lnjcC{position:relative;z-index:1;flex-shrink:0;display:flex;align-items:center;justify-content:center;width:24px;height:24px;margin-top:2px}.toast-module__content___AlliM{flex:1;min-width:0;position:relative;z-index:1}.toast-module__title___1Oqh8{font-family:var(--paper-font-default, "Luminari", "Cormorant Garamond", Georgia, serif);font-size:1.25rem;font-weight:700;line-height:1.2;margin-bottom:.25rem}.toast-module__description___eiUSB{font-family:Cormorant Garamond,Georgia,serif;font-size:1rem;line-height:1.5}.toast-module__dismiss___tUGx4{position:relative;z-index:1;flex-shrink:0;display:flex;align-items:center;justify-content:center;padding:.25rem;background:transparent;border:none;cursor:pointer;border-radius:7.5860901055px 8.2992557176px 8.5573936272px 7.3242017133px;color:inherit;opacity:.6;transition:opacity .15s ease-out,background .15s ease-out}.toast-module__dismiss___tUGx4:hover{opacity:1;background:#0000000a}.toast-module__dismiss___tUGx4:focus-visible{opacity:1;outline:2px solid #8A9BA8;outline-offset:2px}.toast-module__info___Nh8S9{--sketch-stroke: rgba(138, 155, 168, .45)}.toast-module__success___hlKLc{--sketch-stroke: rgba(94, 138, 102, .42)}.toast-module__warning___XUMJt{--sketch-stroke: rgba(166, 123, 79, .45)}.toast-module__error___pSFFC{color:#9e5e5e;--sketch-stroke: rgba(158, 94, 94, .45)}.toast-module__chalkboard___c49gt{color:#e8e4d9;filter:drop-shadow(0 8px 14px rgba(0,0,0,.32));--sketch-stroke: rgba(200, 210, 195, .4)}.toast-module__chalkboard___c49gt .toast-module__surface___mfMl0{background-color:#1e3a2d;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='c'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix type='matrix' values='0 0 0 0 0.15 0 0 0 0 0.28 0 0 0 0 0.20 0 0 0 0.08 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23c)' opacity='1'/%3E%3C/svg%3E");background-repeat:repeat;background-size:200px 200px}.toast-module__chalkboard___c49gt .toast-module__dismiss___tUGx4{color:#a8b5a0}.toast-module__chalkboard___c49gt .toast-module__dismiss___tUGx4:hover{background:#c8d2c314}.avatar-module__avatar___gw6mG{position:relative;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;font-family:var(--paper-font-default, "Luminari", "Cormorant Garamond", Georgia, serif);font-weight:600;color:#1a1917;-webkit-user-select:none;-moz-user-select:none;user-select:none;--avatar-fill: #F5F1E6;--sketch-stroke: rgba(61, 53, 43, .2)}.avatar-module__surface___TYxHH{position:absolute;top:0;right:0;bottom:0;left:0;z-index:0;display:flex;align-items:center;justify-content:center;overflow:hidden;background-color:var(--avatar-fill);background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)' opacity='0.04'/%3E%3C/svg%3E");background-repeat:repeat;background-size:200px 200px;clip-path:var(--sketch-clip)}.avatar-module__circle___EHI7d .avatar-module__surface___TYxHH{border-radius:50%}.avatar-module__square___Hx-84 .avatar-module__surface___TYxHH{border-radius:6.009190243px 8.7502094px 9.3068396525px 7.9651077168px}.avatar-module__small___CPLh1{width:28px;height:28px;font-size:.75rem}.avatar-module__medium___1Nmcy{width:36px;height:36px;font-size:.875rem}.avatar-module__large___1CKR4{width:48px;height:48px;font-size:1.125rem}.avatar-module__xlarge___TY6p6{width:64px;height:64px;font-size:1.5rem}.avatar-module__image___yuWcg{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.avatar-module__blue___HGIn3{--avatar-fill: rgba(124, 156, 192, .18);color:#51719b}.avatar-module__green___ee9-J{--avatar-fill: rgba(143, 185, 150, .2);color:#5e8a66}.avatar-module__amber___A-ih1{--avatar-fill: rgba(212, 163, 115, .2);color:#a67b4f}.avatar-module__rose___eozxi{--avatar-fill: rgba(201, 139, 139, .2);color:#9e5e5e}.avatar-module__slate___bUlWM{--avatar-fill: rgba(138, 155, 168, .18);color:#5e7080}.avatar-module__chalkboard___n2ZKN{color:#d4e8cb;--avatar-fill: rgba(212, 232, 203, .08);--sketch-stroke: rgba(200, 210, 195, .4)}.avatar-module__chalkboard___n2ZKN .avatar-module__surface___TYxHH{background-image:none}.breadcrumb-module__breadcrumb___r-ILp{font-family:var(--paper-font-default, "Luminari", "Cormorant Garamond", Georgia, serif);font-size:.875rem}.breadcrumb-module__list___V3YFy{display:flex;flex-wrap:wrap;align-items:center;list-style:none;margin:0;padding:0}.breadcrumb-module__item___dDwYf{display:flex;align-items:center;gap:.25rem}.breadcrumb-module__link___CHC9k{color:#68635c;text-decoration:none;border-radius:8px;transition:color .15s ease-out}.breadcrumb-module__link___CHC9k:hover{color:#1a1917;text-decoration:underline;text-underline-offset:2px}.breadcrumb-module__link___CHC9k:focus-visible{outline:2px solid #8A9BA8;outline-offset:2px}.breadcrumb-module__linkButton___XoMW-{background:none;border:none;padding:0;margin:0;font:inherit;cursor:pointer}.breadcrumb-module__current___dprI9{color:#1a1917;font-weight:500}.breadcrumb-module__static___affaf{color:#68635c}.breadcrumb-module__separator___uLhtn{flex-shrink:0;color:#a8a399;margin:0 .25rem}.breadcrumb-module__chalkboard___COJpw .breadcrumb-module__link___CHC9k{color:#a8b5a0}.breadcrumb-module__chalkboard___COJpw .breadcrumb-module__link___CHC9k:hover{color:#d4e8cb}.breadcrumb-module__chalkboard___COJpw .breadcrumb-module__link___CHC9k:focus-visible{outline:2px solid #d4e8cb;outline-offset:2px}.breadcrumb-module__chalkboard___COJpw .breadcrumb-module__current___dprI9{color:#d4e8cb}.breadcrumb-module__chalkboard___COJpw .breadcrumb-module__static___affaf{color:#a8b5a0}.breadcrumb-module__chalkboard___COJpw .breadcrumb-module__separator___uLhtn{color:#5e7a68}.pagination-module__pagination___XUA2y{display:flex;align-items:center;gap:.5rem}.pagination-module__list___20YPz{display:flex;align-items:center;gap:.25rem;list-style:none;margin:0;padding:0}.pagination-module__pageButton___-T5D5{min-width:32px;justify-content:center}.pagination-module__dots___gL2WQ{display:flex;align-items:center;justify-content:center;width:32px;color:#a8a399;font-family:Luminari,Cormorant Garamond,Georgia,serif}.menu-module__wrapper___WCtoy{display:inline-block}.menu-module__menu___i40Wj{position:fixed;z-index:600;min-width:160px;filter:drop-shadow(0 8px 14px rgba(61,53,43,.14));--sketch-stroke: rgba(61, 53, 43, .32);animation:menu-module__menuIn___-OAQJ .16s ease-out}.menu-module__surface___SJbaB{position:absolute;top:0;right:0;bottom:0;left:0;z-index:0;background-color:#f5f1e6;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)' opacity='0.04'/%3E%3C/svg%3E");background-repeat:repeat;background-size:200px 200px;border-radius:9.873766536px 13.1103028909px 12.2195697109px 9.3845946583px;clip-path:var(--sketch-clip)}.menu-module__list___YjCfD{position:relative;z-index:1;padding:.5rem;max-height:320px;overflow-y:auto;display:flex;flex-direction:column;gap:2px}@keyframes menu-module__menuIn___-OAQJ{0%{opacity:0;transform:translateY(-4px) scale(.97)}to{opacity:1;transform:translateY(0) scale(1)}}@media (prefers-reduced-motion: reduce){.menu-module__menu___i40Wj{animation:none}}.menu-module__item___aqcgg{display:flex;align-items:center;gap:.5rem;width:100%;padding:.5rem .75rem;border:none;background:transparent;font-family:var(--paper-font-default, "Luminari", "Cormorant Garamond", Georgia, serif);font-size:1rem;text-align:left;color:#1a1917;cursor:pointer;border-radius:7.0879576923px 8.7776669611px 8.0372118002px 7.3662891164px;transition:background-color .15s ease-out}.menu-module__item___aqcgg:hover:not(:disabled){background-image:radial-gradient(circle at 50% 50%,rgba(143,185,150,.22) 0%,transparent 70%);background-color:#8fb9961f}.menu-module__item___aqcgg:focus{outline:none;background-image:radial-gradient(circle at 50% 50%,rgba(143,185,150,.28) 0%,transparent 70%);background-color:#8fb99624}.menu-module__item___aqcgg:focus-visible{outline:2px solid #8A9BA8;outline-offset:2px}.menu-module__icon___1qUvA{display:flex;align-items:center;justify-content:center;flex-shrink:0;color:#68635c}.menu-module__label___MtQMh{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.menu-module__danger___p9oZo,.menu-module__danger___p9oZo .menu-module__icon___1qUvA{color:#9e5e5e}.menu-module__danger___p9oZo:hover:not(:disabled),.menu-module__danger___p9oZo:focus{background-image:radial-gradient(circle at 50% 50%,rgba(201,139,139,.22) 0%,transparent 70%);background-color:#c98b8b1f}.menu-module__itemDisabled___HByLP{opacity:.45;cursor:not-allowed}.menu-module__separator___g2uay{height:1px;margin:.25rem .5rem;background:#3d352b26}.menu-module__chalkboard___5jIwI{filter:drop-shadow(0 8px 14px rgba(0,0,0,.3));--sketch-stroke: rgba(200, 210, 195, .3)}.menu-module__chalkboard___5jIwI .menu-module__surface___SJbaB{background-image:none;background-color:#1e3a2d}.menu-module__chalkboard___5jIwI .menu-module__item___aqcgg{color:#e8e4d9}.menu-module__chalkboard___5jIwI .menu-module__item___aqcgg:hover:not(:disabled),.menu-module__chalkboard___5jIwI .menu-module__item___aqcgg:focus{background-image:none;background-color:#c8d2c31a}.menu-module__chalkboard___5jIwI .menu-module__item___aqcgg:focus-visible{outline:2px solid #d4e8cb;outline-offset:2px}.menu-module__chalkboard___5jIwI .menu-module__icon___1qUvA{color:#a8b5a0}.menu-module__chalkboard___5jIwI .menu-module__danger___p9oZo,.menu-module__chalkboard___5jIwI .menu-module__danger___p9oZo .menu-module__icon___1qUvA{color:#e8a0a0}.menu-module__chalkboard___5jIwI .menu-module__danger___p9oZo:hover:not(:disabled),.menu-module__chalkboard___5jIwI .menu-module__danger___p9oZo:focus{background-color:#e8a0a026}.menu-module__chalkboard___5jIwI .menu-module__separator___g2uay{background:#c8d2c333}.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}.visible{visibility:visible}.invisible{visibility:hidden}.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-y-0{top:0;bottom:0}.-right-1{right:-.25rem}.-top-1{top:-.25rem}.left-0{left:0}.right-0{right:0}.top-0{top:0}.top-\[var\(--pc-stack-toggle-top\,50\%\)\]{top:var(--pc-stack-toggle-top,50%)}.z-10{z-index:10}.z-\[290\]{z-index:290}.z-\[300\]{z-index:300}.m-0{margin:0}.mx-0{margin-left:0;margin-right:0}.\!mb-0{margin-bottom:0!important}.-mb-1{margin-bottom:-.25rem}.-ml-8{margin-left:-2rem}.-mr-8{margin-right:-2rem}.-mt-6{margin-top:-1.5rem}.-mt-8{margin-top:-2rem}.mb-0{margin-bottom:0}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.mb-\[0\.2rem\]{margin-bottom:.2rem}.mb-\[0\.4rem\]{margin-bottom:.4rem}.ml-0{margin-left:0}.ml-auto{margin-left:auto}.mr-0{margin-right:0}.mr-2{margin-right:.5rem}.mt-0{margin-top:0}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.box-border{box-sizing:border-box}.block{display: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-1\.5{height:.375rem}.h-10{height:2.5rem}.h-14{height:3.5rem}.h-2{height:.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-\[18px\]{height:18px}.h-\[20px\]{height:20px}.h-\[28px\]{height:28px}.h-\[32px\]{height:32px}.h-\[4\.625rem\]{height:4.625rem}.h-\[64px\]{height:64px}.h-\[9px\]{height:9px}.h-\[var\(--pc-header-h\)\]{height:var(--pc-header-h)}.h-\[var\(--pc-sidebar-h\,100\%\)\]{height:var(--pc-sidebar-h,100%)}.h-full{height:100%}.h-screen{height:100vh}.max-h-40{max-height:10rem}.max-h-48{max-height:12rem}.max-h-64,.max-h-\[16rem\]{max-height:16rem}.max-h-\[320px\]{max-height:320px}.min-h-0{min-height:0px}.min-h-11{min-height:2.75rem}.min-h-\[7rem\]{min-height:7rem}.min-h-full{min-height:100%}.min-h-page{min-height:calc(100vh - 64px)}.min-h-screen{min-height:100vh}.w-10{width:2.5rem}.w-2{width:.5rem}.w-20{width:5rem}.w-24{width:6rem}.w-4{width:1rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-\[110px\]{width:110px}.w-\[140px\]{width:140px}.w-\[160px\]{width:160px}.w-\[18px\]{width:18px}.w-\[20px\]{width:20px}.w-\[224px\]{width:224px}.w-\[28px\]{width:28px}.w-\[9px\]{width:9px}.w-\[min\(var\(--pc-stack-width\)\,100vw\)\]{width:min(var(--pc-stack-width),100vw)}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-16{min-width:4rem}.min-w-\[140px\]{min-width:140px}.min-w-\[6ch\]{min-width:6ch}.min-w-min{min-width:-moz-min-content;min-width:min-content}.max-w-\[360px\]{max-width:360px}.max-w-\[85\%\]{max-width:85%}.max-w-full{max-width:100%}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-none{max-width:none}.max-w-sm{max-width:24rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-\[0_0_36px\]{flex:0 0 36px}.flex-\[1_1_0\%\]{flex:1 1 0%}.flex-\[1_1_260px\]{flex:1 1 260px}.flex-auto{flex:1 1 auto}.flex-none{flex:none}.flex-shrink-0{flex-shrink:0}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.grow{flex-grow:1}.basis-\[6\.625rem\]{flex-basis:6.625rem}.-translate-x-full{--tw-translate-x: -100%;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{--tw-translate-x: 0px;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))}.cursor-default{cursor:default}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.scroll-mt-4{scroll-margin-top:1rem}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.list-none{list-style-type:none}.grid-cols-\[20px_116px_minmax\(0\,1fr\)_88px_150px_72px\]{grid-template-columns:20px 116px minmax(0,1fr) 88px 150px 72px}.grid-cols-\[76px_minmax\(0\,1fr\)_112px\]{grid-template-columns:76px minmax(0,1fr) 112px}.grid-cols-\[76px_minmax\(0\,1fr\)_84px_96px_112px\]{grid-template-columns:76px minmax(0,1fr) 84px 96px 112px}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.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-4{gap:1rem}.gap-5{gap:1.25rem}.gap-6{gap:1.5rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.gap-x-4{-moz-column-gap:1rem;column-gap:1rem}.gap-y-1{row-gap:.25rem}.gap-y-2{row-gap:.5rem}.self-start{align-self:flex-start}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-y-hidden{overflow-y:hidden}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-ellipsis{text-overflow:ellipsis}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.rounded{border-radius:.25rem}.rounded-\[10px\]{border-radius:10px}.rounded-\[3px\]{border-radius:3px}.rounded-\[8px\]{border-radius:8px}.rounded-full{border-radius:9999px}.rounded-md{border-radius:.375rem}.rounded-l-md{border-top-left-radius:.375rem;border-bottom-left-radius:.375rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-l-4{border-left-width:4px}.border-l-\[3px\]{border-left-width:3px}.border-solid{border-style:solid}.border-none{border-style:none}.border-black\/10{border-color:#0000001a}.border-black\/\[0\.08\]{border-color:#00000014}.border-black\/\[15\%\]{border-color:#00000026}.border-black\/\[8\%\]{border-color:#00000014}.border-desk-border{border-color:#c8d2c326}.border-paper-950\/\[12\%\]{border-color:#3d352b1f}.bg-\[rgba\(155\,122\,181\,0\.08\)\]{background-color:#9b7ab514}.bg-\[var\(--pui-bg-base\)\]{background-color:var(--pui-bg-base)}.bg-black\/\[0\.08\]{background-color:#00000014}.bg-black\/\[4\%\]{background-color:#0000000a}.bg-black\/\[6\%\]{background-color:#0000000f}.bg-chalk-fail-text{--tw-bg-opacity: 1;background-color:rgb(214 160 160 / var(--tw-bg-opacity, 1))}.bg-chalk-pass-text{--tw-bg-opacity: 1;background-color:rgb(181 214 181 / var(--tw-bg-opacity, 1))}.bg-chalk-running-text{--tw-bg-opacity: 1;background-color:rgb(214 196 160 / var(--tw-bg-opacity, 1))}.bg-desk-bg{--tw-bg-opacity: 1;background-color:rgb(30 58 45 / var(--tw-bg-opacity, 1))}.bg-desk-bg\/60{background-color:#1e3a2d99}.bg-desk-text-muted{--tw-bg-opacity: 1;background-color:rgb(168 181 160 / var(--tw-bg-opacity, 1))}.bg-ink-900\/\[40\%\]{background-color:#1a191766}.bg-transparent{background-color:transparent}.bg-watercolor-green{--tw-bg-opacity: 1;background-color:rgb(143 185 150 / var(--tw-bg-opacity, 1))}.bg-watercolor-green\/\[18\%\]{background-color:#8fb9962e}.bg-watercolor-green\/\[30\%\]{background-color:#8fb9964d}.bg-watercolor-rose-dark{--tw-bg-opacity: 1;background-color:rgb(158 94 94 / var(--tw-bg-opacity, 1))}.bg-watercolor-rose\/\[18\%\]{background-color:#c98b8b2e}.bg-watercolor-rose\/\[30\%\]{background-color:#c98b8b4d}.bg-chalkboard{background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 200 200' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='c'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix type='matrix' values='0 0 0 0 0.15 0 0 0 0 0.28 0 0 0 0 0.20 0 0 0 0.08 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23c)' opacity='1'/%3E%3C/svg%3E"),linear-gradient(135deg,#264a3a,#1e3a2d 60%)}.bg-none{background-image:none}.object-contain{-o-object-fit:contain;object-fit:contain}.p-0{padding:0}.p-2{padding:.5rem}.p-4{padding:1rem}.p-\[var\(--pc-stack-pad\)\]{padding:var(--pc-stack-pad)}.px-0{padding-left:0;padding-right:0}.px-1{padding-left:.25rem;padding-right:.25rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-\[0\.35em\]{padding-left:.35em;padding-right:.35em}.px-\[var\(--pc-stack-pad\)\]{padding-left:var(--pc-stack-pad);padding-right:var(--pc-stack-pad)}.py-0{padding-top:0;padding-bottom:0}.py-1{padding-top:.25rem;padding-bottom:.25rem}.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-24{padding-top:6rem;padding-bottom:6rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-\[0\.1em\]{padding-top:.1em;padding-bottom:.1em}.pb-0{padding-bottom:0}.pb-1{padding-bottom:.25rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pb-\[var\(--pc-content-pad-bottom\)\]{padding-bottom:var(--pc-content-pad-bottom)}.pl-1{padding-left:.25rem}.pl-4{padding-left:1rem}.pl-5{padding-left:1.25rem}.pl-6{padding-left:1.5rem}.pl-8{padding-left:2rem}.pl-\[1\.4rem\]{padding-left:1.4rem}.pr-1{padding-right:.25rem}.pr-2{padding-right:.5rem}.pr-8{padding-right:2rem}.pt-0{padding-top:0}.pt-2{padding-top:.5rem}.pt-3{padding-top:.75rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.font-display-luminari{font-family:Luminari,Cormorant Garamond,Georgia,serif}.font-handwritten{font-family:Caveat,cursive}.font-mono{font-family:JetBrains Mono,Fira Code,monospace}.\!text-base{font-size:1.125rem!important}.\!text-sm{font-size:1rem!important}.\!text-xs{font-size:.875rem!important}.text-2xs{font-size:.75rem}.text-3xs{font-size:.6875rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-\[0\.85em\]{font-size:.85em}.text-\[0\.95rem\]{font-size:.95rem}.text-\[1\.1rem\]{font-size:1.1rem}.text-\[1\.3rem\]{font-size:1.3rem}.text-\[1\.75rem\]{font-size:1.75rem}.text-\[17px\]{font-size:17px}.text-base{font-size:1.125rem}.text-lg{font-size:1.5rem}.text-md{font-size:1.25rem}.text-sm{font-size:1rem}.text-xs{font-size:.875rem}.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}.italic{font-style:italic}.leading-4{line-height:1rem}.leading-\[1\.1\]{line-height:1.1}.leading-\[1\.2\]{line-height:1.2}.leading-\[1\.7\]{line-height:1.7}.leading-none{line-height:1}.leading-normal{line-height:1.5}.leading-relaxed{line-height:1.625}.leading-tight{line-height:1.25}.tracking-wide{letter-spacing:.025em}.text-\[\#7B5E9E\]{--tw-text-opacity: 1;color:rgb(123 94 158 / var(--tw-text-opacity, 1))}.text-\[var\(--pui-text-primary\)\]{color:var(--pui-text-primary)}.text-desk-chalk{--tw-text-opacity: 1;color:rgb(212 232 203 / var(--tw-text-opacity, 1))}.text-desk-text{--tw-text-opacity: 1;color:rgb(232 228 217 / var(--tw-text-opacity, 1))}.text-desk-text-muted{--tw-text-opacity: 1;color:rgb(168 181 160 / var(--tw-text-opacity, 1))}.text-inherit{color:inherit}.text-ink-300{--tw-text-opacity: 1;color:rgb(168 163 153 / var(--tw-text-opacity, 1))}.text-ink-500{--tw-text-opacity: 1;color:rgb(104 99 92 / var(--tw-text-opacity, 1))}.text-ink-900{--tw-text-opacity: 1;color:rgb(26 25 23 / var(--tw-text-opacity, 1))}.text-state-danger{--tw-text-opacity: 1;color:rgb(160 96 96 / var(--tw-text-opacity, 1))}.text-watercolor-amber-dark{--tw-text-opacity: 1;color:rgb(166 123 79 / var(--tw-text-opacity, 1))}.text-watercolor-blue-dark{--tw-text-opacity: 1;color:rgb(81 113 155 / var(--tw-text-opacity, 1))}.text-watercolor-green-dark{--tw-text-opacity: 1;color:rgb(94 138 102 / var(--tw-text-opacity, 1))}.text-watercolor-rose-dark{--tw-text-opacity: 1;color:rgb(158 94 94 / var(--tw-text-opacity, 1))}.text-watercolor-slate-dark{--tw-text-opacity: 1;color:rgb(94 112 128 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.line-through{text-decoration-line:line-through}.no-underline{text-decoration-line:none}.decoration-desk-border{text-decoration-color:#c8d2c326}.opacity-100{opacity:1}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-45{opacity:.45}.opacity-50{opacity:.5}.opacity-55{opacity:.55}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.opacity-\[0\.35\]{opacity:.35}.opacity-\[0\.45\]{opacity:.45}.opacity-\[0\.4\]{opacity:.4}.opacity-\[0\.55\]{opacity:.55}.opacity-\[0\.65\]{opacity:.65}.opacity-\[0\.6\]{opacity:.6}.opacity-\[0\.7\]{opacity:.7}.opacity-\[0\.85\]{opacity:.85}.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-\[-2px_0_8px_rgba\(0\,0\,0\,0\.15\)\]{--tw-shadow: -2px 0 8px rgba(0,0,0,.15);--tw-shadow-colored: -2px 0 8px 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_6px_rgba\(214\,160\,160\,0\.9\)\]{--tw-shadow: 0 0 6px rgba(214,160,160,.9);--tw-shadow-colored: 0 0 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-\[2px_0_12px_rgba\(0\,0\,0\,0\.15\)\]{--tw-shadow: 2px 0 12px rgba(0,0,0,.15);--tw-shadow-colored: 2px 0 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-\[inset_0_0_0_1px_rgba\(214\,160\,160\,0\.6\)\]{--tw-shadow: inset 0 0 0 1px rgba(214,160,160,.6);--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-\[inset_0_0_0_1px_rgba\(214\,196\,160\,0\.6\)\]{--tw-shadow: inset 0 0 0 1px rgba(214,196,160,.6);--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)}.outline{outline-style:solid}.outline-2{outline-width:2px}.outline-offset-\[-2px\]{outline-offset:-2px}.outline-\[rgba\(200\,154\,90\,0\.5\)\]{outline-color:#c89a5a80}.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)}.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-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.\[background-repeat\:repeat\,no-repeat\]{background-repeat:repeat,no-repeat}.\[background-size\:200px_200px\,auto\]{background-size:200px 200px,auto}.\[container-type\:inline-size\]{container-type:inline-size}.\[cursor\:inherit\]{cursor:inherit}.\[font\:inherit\]{font:inherit}.\[phase\:1\]{phase:1}.\[scrollbar-gutter\:stable\]{scrollbar-gutter:stable}:root{--paper-font-default: "Cormorant Garamond", Georgia, serif;--pui-btn-primary: rgba(143, 185, 150, .25);--pui-btn-primary-hover: rgba(143, 185, 150, .3);--pui-btn-primary-active: rgba(143, 185, 150, .3);--pui-btn-secondary: rgba(61, 53, 43, .1);--pui-btn-secondary-hover: rgba(61, 53, 43, .14);--pui-btn-secondary-active: rgba(61, 53, 43, .18)}header>div[class*=headerActions]{flex:1;min-width:0}header[class*=layout-module__header___]{height:64px}header[class*=layout-module__header___]{background-color:transparent;background-image:none;border-bottom:none;box-shadow:none}.plan-row-card [class*=textureLayer]{padding:.375rem .875rem}.stack-task-card [class*=textureLayer]{padding:.5rem .875rem}@media (max-width: 480px){.phase-table-phone [class*=tableScroll]{overflow-x:visible}.phase-table-phone table,.phase-table-phone thead,.phase-table-phone tbody,.phase-table-phone tr,.phase-table-phone th,.phase-table-phone td{display:block;width:auto}.phase-table-phone thead{display:none}.phase-table-phone tr{padding:.5rem 0;border-bottom:1px solid rgba(0,0,0,.08)}.phase-table-phone tr:last-child{border-bottom:none}.phase-table-phone td{height:auto;padding:.125rem 1rem;border-bottom:none}}.run-meta-full{display:none}@container (min-width: 190px){.run-meta-full{display:inline}}.archive-row-action{padding:.25rem .75rem}.phase-running-row{background-image:linear-gradient(to right,var(--pui-btn-primary) 0,var(--pui-btn-primary) var(--phase-fill, 0%),transparent var(--phase-fill, 0%))}@media (max-width: 480px){button[class*=iconButton][class*=small],label[class*=wrapper] [class*=boxWrapper]{width:44px;height:44px}}@media (max-width: 480px){.plan-row-card [class*=textureLayer]{padding-top:.75rem;padding-bottom:.75rem}}:root{--pc-content-pad-bottom: 0px}@media (max-width: 480px){:root{--pc-content-pad-bottom: 96px}}:root{--pc-stack-width: 288px;--pc-stack-pad: 16px}@media (max-width: 480px){:root{--pc-stack-width: 100vw}}@media (min-width: 1391px){:root{--pc-stack-width: 480px;--pc-stack-pad: 1.5rem}}:root{--pc-stack-toggle-top: 50%}@media (max-width: 480px){:root{--pc-stack-toggle-top: 70%}}:root{--pc-header-h: 66px}.pc-page.pc-page>div{border-radius:0;clip-path:none;padding-top:2rem}@media (min-width: 1199px){.pc-page.pc-page>div{padding-right:var(--pc-stack-width)}}.pc-app-header{padding-left:2rem;padding-right:2rem;border-bottom:1px solid var(--pui-sketch-stroke)}.pc-page.pc-page{border-left:1px solid var(--pui-sketch-stroke);filter:none}.pc-git-file-row [class*=boxWrapper]{width:24px;height:24px;margin-bottom:-4px}.pc-row{display:flex;align-items:flex-end;height:32px;padding-top:0;padding-bottom:4px;line-height:1}.pc-row-label{display:flex;align-items:flex-end;height:32px;padding-bottom:4px;line-height:1}.last\:border-b-0:last-child{border-bottom-width:0px}.hover\:underline:hover{text-decoration-line:underline}.hover\:decoration-desk-chalk:hover{text-decoration-color:#d4e8cb}.enabled\:hover\:-translate-y-px:hover:enabled{--tw-translate-y: -1px;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))}.enabled\:hover\:brightness-\[1\.15\]:hover:enabled{--tw-brightness: brightness(1.15);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)}.enabled\:active\:translate-y-0:active:enabled{--tw-translate-y: 0px;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))}.enabled\:active\:brightness-\[0\.95\]:active:enabled{--tw-brightness: brightness(.95);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)}.group[aria-expanded=true] .group-aria-expanded\: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))}@media not all and (min-width: 1024px){.max-lg\:hidden{display:none}.max-lg\:grid-cols-\[20px_116px_minmax\(0\,1fr\)_88px_72px\]{grid-template-columns:20px 116px minmax(0,1fr) 88px 72px}.max-lg\:grid-cols-\[76px_minmax\(0\,1fr\)_96px_112px\]{grid-template-columns:76px minmax(0,1fr) 96px 112px}}@media (max-width: 480px){.max-\[480px\]\:fixed{position:fixed}.max-\[480px\]\:bottom-0{bottom:0}.max-\[480px\]\:left-0{left:0}.max-\[480px\]\:right-0{right:0}.max-\[480px\]\:z-\[250\]{z-index:250}.max-\[480px\]\:flex{display:flex}.max-\[480px\]\:hidden{display:none}.max-\[480px\]\:max-w-none{max-width:none}.max-\[480px\]\:flex-\[1_1_100\%\]{flex:1 1 100%}.max-\[480px\]\:grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.max-\[480px\]\:items-stretch{align-items:stretch}.max-\[480px\]\:justify-around{justify-content:space-around}.max-\[480px\]\:gap-1{gap:.25rem}.max-\[480px\]\:border-t{border-top-width:1px}.max-\[480px\]\:border-black\/10{border-color:#0000001a}.max-\[480px\]\:bg-\[var\(--pui-bg-base\,\#fff\)\]{background-color:var(--pui-bg-base,#fff)}.max-\[480px\]\:px-2{padding-left:.5rem;padding-right:.5rem}.max-\[480px\]\:py-2{padding-top:.5rem;padding-bottom:.5rem}.max-\[480px\]\:shadow-\[0_-2px_8px_rgba\(0\,0\,0\,0\.08\)\]{--tw-shadow: 0 -2px 8px rgba(0,0,0,.08);--tw-shadow-colored: 0 -2px 8px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.max-\[480px\]\:\[padding-bottom\:calc\(0\.5rem\+env\(safe-area-inset-bottom\)\)\]{padding-bottom:calc(.5rem + env(safe-area-inset-bottom))}}@media (min-width: 640px){.sm\:flex-row{flex-direction:row}}@media (min-width: 1024px){.lg\:sticky{position:sticky}.lg\:inset-auto{inset:auto}.lg\:top-0{top:0}.lg\:z-auto{z-index:auto}.lg\:hidden{display:none}.lg\:translate-x-0{--tw-translate-x: 0px;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))}.lg\:\[--pc-sidebar-h\:calc\(100vh-160px\)\]{--pc-sidebar-h: calc(100vh - 160px) }}@media (min-width: 1199px){.min-\[1199px\]\:pr-\[var\(--pc-stack-width\)\]{padding-right:var(--pc-stack-width)}}