UNPKG

@dollhousemcp/mcp-server

Version:

DollhouseMCP - A Model Context Protocol (MCP) server that enables dynamic AI persona management from markdown files, allowing Claude and other compatible AI assistants to activate and switch between different behavioral personas.

1,338 lines (1,118 loc) 30.6 kB
/** * DollhouseMCP Console — Setup Tab * * Platform-specific install instructions with OS detection, * copy-to-clipboard code blocks, and verification steps. */ /* ── Layout ────────────────────────────────────────────────────────────── */ .setup-page { max-width: 52rem; margin: 0 auto; padding: var(--gutter) var(--gutter) 3rem; } /* ── Hero ──────────────────────────────────────────────────────────────── */ .setup-hero { text-align: center; margin-bottom: 2rem; } .setup-hero-status { display: inline-flex; align-items: center; gap: 0.5rem; padding: 0.35rem 1rem; border-radius: 999px; background: color-mix(in srgb, #22c55e 12%, var(--surface-1)); border: 1px solid color-mix(in srgb, #22c55e 30%, var(--line)); color: #16a34a; font-family: var(--font-mono); font-size: 0.82rem; font-weight: 600; margin-bottom: 1rem; } [data-theme="dark"] .setup-hero-status { color: #4ade80; } .setup-status-dot { width: 8px; height: 8px; border-radius: 50%; background: #22c55e; animation: setup-pulse 2s ease-in-out infinite; } @keyframes setup-pulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.4; } } .setup-hero-title { font-family: var(--font-heading); font-size: var(--step-3); font-weight: 700; color: var(--ink-950); margin: 0 0 0.4rem; } .setup-hero-sub { font-size: var(--step-0); color: var(--ink-500); margin: 0; } /* ── Method toggle ─────────────────────────────────────────────────────── */ .setup-method-toggle { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 0.5rem; border: none; padding: 0; margin: 0 0 1.2rem; } .setup-method-btn { appearance: none; display: flex; flex-direction: column; gap: 0.15rem; padding: 0.7rem 1rem; border: 2px solid var(--line); border-radius: var(--radius-md); background: var(--surface-2); cursor: pointer; text-align: left; transition: border-color 0.15s, background 0.15s; } .setup-method-btn:hover { border-color: color-mix(in srgb, var(--signal) 40%, var(--line)); } .setup-method-btn.is-active { border-color: var(--signal); background: color-mix(in srgb, var(--signal-2) 8%, var(--surface-2)); } .setup-method-btn strong { font-family: var(--font-heading); font-size: var(--step-0); color: var(--ink-950); } .setup-method-btn span { font-size: var(--step--1); color: var(--ink-500); } .setup-method-btn.is-active strong { color: var(--signal); } /* ── Channel selector ──────────────────────────────────────────────────── */ .setup-channel-toggle { display: flex; align-items: center; gap: 0.75rem; border: none; padding: 0; margin: 0 0 1.2rem; } .setup-channel-toggle[hidden] { display: none; } .setup-channel-legend { font-family: var(--font-heading); font-size: var(--step--1); font-weight: 600; color: var(--ink-700); } .setup-channel-select { appearance: auto; padding: 0.35rem 0.6rem; border: 2px solid var(--line); border-radius: var(--radius-md); background: var(--surface-2); font-size: var(--step--1); color: var(--ink-950); cursor: pointer; } .setup-channel-select:focus { border-color: var(--signal); outline: none; } .setup-channel-hint { font-size: var(--step--1); color: var(--ink-500); } .setup-pinned-prereq { margin-bottom: 1.2rem; } .setup-permissions-intro { display: grid; gap: 1.2rem; margin-bottom: 1.2rem; } .setup-permissions-intro[hidden] { display: none !important; } .setup-permissions-note { padding: 1rem 1.2rem; border: 1px solid var(--line); border-radius: var(--radius-md); background: var(--surface-2); min-width: 0; overflow: hidden; } .setup-permissions-note strong { display: block; font-family: var(--font-heading); font-size: var(--step-0); font-weight: 700; color: var(--ink-950); margin-bottom: 0.35rem; } .setup-permissions-note p { margin: 0; color: var(--ink-700); font-size: var(--step--1); line-height: 1.55; } .setup-method h4 { font-family: var(--font-heading); font-size: var(--step-0); font-weight: 600; color: var(--ink-900); margin: 1rem 0 0.3rem; } .setup-method h4:first-of-type { margin-top: 0.3rem; } /* ── Platform tabs ─────────────────────────────────────────────────────── */ .setup-platforms { display: flex; flex-wrap: wrap; gap: 0.35rem; justify-content: center; margin-bottom: 1.5rem; } .setup-platform-tab { appearance: none; border: 1px solid var(--line); border-radius: 999px; background: var(--surface-2); color: var(--ink-700); font-family: var(--font-mono); font-size: 0.82rem; font-weight: 600; padding: 0.42rem 0.9rem; cursor: pointer; white-space: nowrap; transition: background 0.15s, color 0.15s, border-color 0.15s; } .setup-platform-tab:hover, .setup-platform-tab:focus-visible { background: color-mix(in srgb, var(--signal-2) 12%, var(--surface-1)); border-color: color-mix(in srgb, var(--signal) 30%, var(--line)); color: var(--ink-950); } .setup-platform-tab.is-active { background: var(--signal); border-color: var(--signal); color: #fff; } /* ── Panels ────────────────────────────────────────────────────────────── */ .setup-panel { display: grid; gap: 1.2rem; min-width: 0; } .setup-panel[hidden] { display: none; } /* ── Method blocks ─────────────────────────────────────────────────────── */ .setup-method { background: var(--surface-2); border: 1px solid var(--line); border-radius: var(--radius-md); padding: 1.2rem 1.4rem; min-width: 0; } .setup-method-primary { background: linear-gradient(135deg, color-mix(in srgb, var(--signal-2) 6%, var(--surface-2)), var(--surface-2) 60%); border-color: color-mix(in srgb, var(--signal) 25%, var(--line)); } .setup-method h3 { font-family: var(--font-heading); font-size: var(--step-1); font-weight: 700; color: var(--ink-950); margin: 0 0 0.5rem; } .setup-method p { color: var(--ink-700); font-size: var(--step--1); margin: 0 0 0.65rem; line-height: 1.55; } .setup-method p:last-child { margin-bottom: 0; } .setup-security-mode code { word-break: break-word; } .setup-security-mode { min-width: 0; overflow: hidden; } .setup-manual-fallback { border: 1px solid var(--line); border-radius: var(--radius-sm); background: var(--surface-1); overflow: hidden; } .setup-manual-fallback summary { cursor: pointer; list-style: none; padding: 0.9rem 1rem; font-family: var(--font-heading); font-size: var(--step-0); font-weight: 600; color: var(--ink-900); } .setup-manual-fallback summary::-webkit-details-marker { display: none; } .setup-manual-fallback summary::after { content: '+'; float: right; color: var(--ink-500); } .setup-manual-fallback[open] summary::after { content: '-'; } .setup-manual-fallback-body { padding: 0 1rem 1rem; border-top: 1px solid var(--line); } .setup-permission-status { margin: 0 0 0.8rem; padding: 0.85rem 1rem; border-radius: var(--radius-sm); border: 1px solid var(--line); background: color-mix(in srgb, var(--surface-1) 85%, white); } .setup-permission-status-title { display: block; margin-bottom: 0.3rem; color: var(--ink-900); } .setup-permission-status-msg { margin: 0; color: var(--ink-700); } .setup-permission-status[data-state="warning"] { border-color: color-mix(in srgb, #f59e0b 40%, var(--line)); background: color-mix(in srgb, #f59e0b 10%, var(--surface-2)); } .setup-permission-status[data-state="warning"] .setup-permission-status-title { color: #b45309; } .setup-permission-status[data-state="info"] { border-color: color-mix(in srgb, var(--signal) 30%, var(--line)); background: color-mix(in srgb, var(--signal-2) 10%, var(--surface-2)); } .setup-permission-status[data-state="info"] .setup-permission-status-title { color: var(--signal); } [data-theme="dark"] .setup-permission-status[data-state="warning"] .setup-permission-status-title { color: #fbbf24; } .setup-support-badge { display: inline-flex; align-items: center; margin-left: 0.45rem; padding: 0.18rem 0.5rem; border-radius: 999px; font-family: var(--font-mono); font-size: 0.7rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.02em; } .setup-support-badge--verified { background: color-mix(in srgb, #22c55e 18%, var(--surface-2)); color: #15803d; border: 1px solid color-mix(in srgb, #22c55e 45%, var(--line)); } .setup-support-badge--manual { background: color-mix(in srgb, #f59e0b 14%, var(--surface-2)); color: #b45309; border: 1px solid color-mix(in srgb, #f59e0b 40%, var(--line)); } .setup-support-badge--unsupported { background: color-mix(in srgb, #64748b 14%, var(--surface-2)); color: var(--ink-600); border: 1px solid color-mix(in srgb, #64748b 35%, var(--line)); } [data-theme="dark"] .setup-support-badge--verified { color: #4ade80; } [data-theme="dark"] .setup-support-badge--manual { color: #fbbf24; } .setup-paths { list-style: none; margin: 0 0 0.8rem; padding: 0; display: grid; gap: 0.3rem; } .setup-paths li { font-size: var(--step--1); color: var(--ink-700); } .setup-paths li strong { color: var(--ink-900); min-width: 5rem; display: inline-block; } .setup-paths li.is-current { color: var(--signal); font-weight: 600; } .setup-paths li.is-current strong { color: var(--signal); } /* ── Code blocks ───────────────────────────────────────────────────────── */ .setup-code-block { position: relative; margin: 0.5rem 0; min-width: 0; max-width: 100%; } .setup-code-block pre { margin: 0; padding: 1rem 1.2rem; padding-right: 4.5rem; background: var(--ink-950); color: #e2e8f0; border-radius: var(--radius-sm); font-family: var(--font-mono); font-size: 0.82rem; line-height: 1.6; overflow-x: auto; white-space: pre; tab-size: 2; max-width: 100%; min-width: 0; box-sizing: border-box; } [data-theme="dark"] .setup-code-block pre { background: #0a0e18; border: 1px solid var(--line); } .setup-code-block-sm pre { padding: 0.7rem 1rem; padding-right: 4.5rem; } .setup-copy-btn { position: absolute; top: 0.55rem; right: 0.55rem; z-index: 2; appearance: none; border: 1px solid color-mix(in srgb, #ffffff 18%, transparent); border-radius: var(--radius-sm); background: color-mix(in srgb, var(--ink-950) 80%, #1e293b); color: #cbd5e1; font-family: var(--font-mono); font-size: 0.72rem; font-weight: 600; padding: 0.3rem 0.65rem; cursor: pointer; transition: background 0.15s, color 0.15s; letter-spacing: 0.03em; text-transform: uppercase; } .setup-copy-btn:hover { background: color-mix(in srgb, var(--signal) 70%, var(--ink-950)); color: #fff; } .setup-copy-btn[data-copied] { background: color-mix(in srgb, #22c55e 50%, var(--ink-950)); color: #fff; } /* ── CTA button ────────────────────────────────────────────────────────── */ .setup-btn { display: inline-flex; align-items: center; gap: 0.45rem; padding: 0.55rem 1.4rem; border-radius: var(--radius-sm); font-family: var(--font-mono); font-size: 0.88rem; font-weight: 700; text-decoration: none; cursor: pointer; transition: transform 0.12s, box-shadow 0.12s; } .setup-btn:hover { transform: translateY(-1px); box-shadow: var(--shadow-soft); } .setup-btn-primary { background: var(--signal); color: #fff; border: none; } .setup-btn-primary:hover { background: var(--signal-2); } /* ── Install row ───────────────────────────────────────────────────────── */ .setup-install-row { display: flex; align-items: center; gap: 0.8rem; margin-bottom: 0.8rem; } .setup-install-btn.is-loading { opacity: 0.7; cursor: wait; animation: setup-install-pulse 1.5s ease-in-out infinite; } @keyframes setup-install-pulse { 0%, 100% { opacity: 0.7; } 50% { opacity: 0.4; } } .setup-install-btn.is-success { background: #16a34a; cursor: default; } .setup-install-status { font-family: var(--font-mono); font-size: 0.8rem; font-weight: 600; } .setup-install-status.is-success { color: #16a34a; } [data-theme="dark"] .setup-install-status.is-success { color: #4ade80; } .setup-install-status.is-error { color: #dc2626; } [data-theme="dark"] .setup-install-status.is-error { color: #f87171; } .setup-btn-secondary { background: var(--surface-1); color: var(--signal); border: 1px solid color-mix(in srgb, var(--signal) 30%, var(--line)); } .setup-btn-secondary:hover { background: color-mix(in srgb, var(--signal-2) 12%, var(--surface-1)); } /* ── Open config button ────────────────────────────────────────────────── */ .setup-open-btn { appearance: none; border: 1px solid var(--line); border-radius: var(--radius-sm); background: var(--surface-1); color: var(--signal); font-family: var(--font-mono); font-size: 0.7rem; font-weight: 600; padding: 0.2rem 0.55rem; cursor: pointer; vertical-align: middle; margin-left: 0.5rem; transition: background 0.15s, border-color 0.15s; } .setup-open-btn:hover { background: color-mix(in srgb, var(--signal-2) 12%, var(--surface-1)); border-color: color-mix(in srgb, var(--signal) 35%, var(--line)); } .setup-open-btn[disabled] { opacity: 0.5; cursor: default; } /* ── Badges ────────────────────────────────────────────────────────────── */ .setup-badge { display: inline-block; padding: 0.15rem 0.5rem; border-radius: 999px; font-family: var(--font-mono); font-size: 0.68rem; font-weight: 700; letter-spacing: 0.03em; text-transform: uppercase; vertical-align: middle; background: color-mix(in srgb, #22c55e 15%, var(--surface-1)); border: 1px solid color-mix(in srgb, #22c55e 30%, var(--line)); color: #16a34a; } [data-theme="dark"] .setup-badge { color: #4ade80; } .setup-badge-muted { background: var(--surface-1); border-color: var(--line); color: var(--ink-500); } /* ── Hints ─────────────────────────────────────────────────────────────── */ .setup-hint { font-size: var(--step--1); color: var(--ink-500); font-style: italic; margin: 0.3rem 0 0; } /* ── Verify section ────────────────────────────────────────────────────── */ .setup-verify { margin-top: 2rem; padding: 1.4rem 1.6rem; background: linear-gradient(135deg, color-mix(in srgb, var(--accent) 5%, var(--surface-2)), var(--surface-2) 60%); border: 1px solid color-mix(in srgb, var(--accent) 20%, var(--line)); border-radius: var(--radius-md); } .setup-verify h3 { font-family: var(--font-heading); font-size: var(--step-1); font-weight: 700; color: var(--ink-950); margin: 0 0 0.5rem; } .setup-verify p { color: var(--ink-700); font-size: var(--step--1); margin: 0 0 0.65rem; line-height: 1.55; } .setup-try-prompts { display: flex; flex-wrap: wrap; gap: 0.4rem; } .setup-try-prompts code { display: inline-block; padding: 0.3rem 0.7rem; background: var(--surface-1); border: 1px solid var(--line); border-radius: var(--radius-sm); font-family: var(--font-mono); font-size: 0.78rem; color: var(--ink-700); white-space: nowrap; } /* ── Footer ────────────────────────────────────────────────────────────── */ .setup-footer { margin-top: 1.5rem; text-align: center; } .setup-footer p { font-size: var(--step--1); color: var(--ink-500); } .setup-footer a { color: var(--signal); text-decoration: none; } .setup-footer a:hover { text-decoration: underline; } /* ── Detection: installed notice + tab badge ────────────────────────────── */ .setup-tab-badge { display: inline-block; margin-left: 0.3rem; padding: 0.1rem 0.4rem; border-radius: 999px; font-size: 0.62rem; font-weight: 700; letter-spacing: 0.03em; text-transform: uppercase; background: color-mix(in srgb, #22c55e 18%, var(--surface-1)); color: #16a34a; vertical-align: middle; } [data-theme="dark"] .setup-tab-badge { color: #4ade80; } .setup-installed-notice { padding: 0.8rem 1rem; margin-bottom: 0.8rem; border-radius: var(--radius-sm); border: 1px solid color-mix(in srgb, var(--accent) 35%, var(--line)); background: color-mix(in srgb, var(--accent) 6%, var(--surface-2)); font-size: var(--step--1); color: var(--ink-700); line-height: 1.5; } .setup-installed-notice strong { color: var(--accent); } /* Green match state — config matches what would be installed */ .setup-installed-notice.is-match { border-color: color-mix(in srgb, #22c55e 35%, var(--line)); background: color-mix(in srgb, #22c55e 6%, var(--surface-2)); } .setup-installed-notice.is-match strong { color: #16a34a; } [data-theme="dark"] .setup-installed-notice.is-match strong { color: #4ade80; } .setup-tab-badge.is-match { background: color-mix(in srgb, #22c55e 25%, var(--surface-1)); color: #16a34a; } [data-theme="dark"] .setup-tab-badge.is-match { color: #4ade80; } .setup-install-btn.is-match { background: #16a34a; cursor: default; opacity: 0.85; } .setup-installed-notice details { margin-top: 0.5rem; } .setup-installed-notice summary { cursor: pointer; color: var(--signal); font-weight: 600; font-size: 0.8rem; } .setup-installed-notice pre { margin: 0.4rem 0 0; padding: 0.6rem 0.8rem; background: var(--ink-950); color: #e2e8f0; border-radius: var(--radius-sm); font-family: var(--font-mono); font-size: 0.78rem; white-space: pre-wrap; word-break: break-all; } [data-theme="dark"] .setup-installed-notice pre { background: #0a0e18; border: 1px solid var(--line); } /* ── Responsive ────────────────────────────────────────────────────────── */ @media (max-width: 640px) { .setup-page { padding: 1rem; } .setup-method-toggle { grid-template-columns: 1fr; } .setup-platforms { gap: 0.25rem; } .setup-platform-tab { font-size: 0.75rem; padding: 0.35rem 0.65rem; } .setup-method { padding: 1rem; } .setup-code-block pre { font-size: 0.75rem; padding-right: 3.8rem; } .setup-try-prompts { flex-direction: column; } } /* ── Completion banner ────────────────────────────────────────────────── */ .setup-completion-banner { margin: 1.5rem 0 2rem; padding: 1.5rem 2rem; border-radius: 12px; background: color-mix(in srgb, #22c55e 8%, var(--surface-1)); border: 2px solid color-mix(in srgb, #22c55e 40%, var(--line)); text-align: center; animation: completionFadeIn 0.4s ease-out; } @keyframes completionFadeIn { from { opacity: 0; transform: translateY(-10px); } to { opacity: 1; transform: translateY(0); } } .setup-completion-icon { font-size: 2.5rem; color: #22c55e; line-height: 1; margin-bottom: 0.5rem; } .setup-completion-banner h3 { margin: 0 0 0.5rem; font-size: 1.3rem; color: var(--text-1); } .setup-completion-banner > p { margin: 0 0 1rem; color: var(--text-2); } .setup-completion-steps { display: flex; flex-direction: column; gap: 0.75rem; max-width: 28rem; margin: 1.25rem auto; text-align: left; } .setup-completion-step { display: flex; align-items: center; gap: 0.75rem; color: var(--text-1); } .setup-completion-step-num { display: inline-flex; align-items: center; justify-content: center; width: 1.6rem; height: 1.6rem; border-radius: 50%; background: color-mix(in srgb, #22c55e 20%, var(--surface-1)); border: 1px solid color-mix(in srgb, #22c55e 40%, var(--line)); font-size: 0.8rem; font-weight: 700; color: #22c55e; flex-shrink: 0; } .setup-completion-terminal-hint { margin-top: 1.25rem; font-size: 0.85rem; color: var(--text-3); } .setup-completion-terminal-hint code { background: var(--surface-2); padding: 0.15rem 0.4rem; border-radius: 4px; font-size: 0.8rem; } /* ═══════════════════════════════════════════════════════════════════════ LICENSE SELECTOR (#1746 Step 3) ═══════════════════════════════════════════════════════════════════════ */ .license-section { margin-top: 2.5rem; padding-top: 2rem; border-top: 1px solid var(--line); } .license-heading { font-family: var(--font-heading); font-size: var(--step-2); font-weight: 700; color: var(--ink-950); margin: 0 0 0.3rem; } .license-sub { color: var(--ink-500); margin: 0 0 1.5rem; font-size: var(--step-0); } /* ── Tier buttons ───────────────────────────────────────────────────── */ .license-tiers { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0.75rem; margin-bottom: 1rem; } @media (max-width: 640px) { .license-tiers { grid-template-columns: 1fr; } } .license-tier { all: unset; box-sizing: border-box; display: flex; flex-direction: column; gap: 0.5rem; padding: 1rem 1.2rem; border: 2px solid var(--line); border-radius: var(--radius-md); background: var(--paper); cursor: pointer; transition: border-color 0.15s, box-shadow 0.15s, background 0.15s; text-align: left; } .license-tier:hover { border-color: var(--ink-500); } .license-tier:focus-visible { outline: 2px solid var(--signal); outline-offset: 2px; } .license-tier.is-selected { border-color: var(--signal); background: color-mix(in srgb, var(--signal) 6%, var(--paper)); box-shadow: 0 0 0 1px var(--signal); } .license-tier-price-label { display: block; font-family: var(--font-heading); font-size: 0.75rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.06em; color: var(--ink-500); margin-bottom: 0.4rem; } .license-tier-price-label--free { color: #16a34a; } .license-tier-price-label--paid { color: var(--signal); } .license-tier-header { display: flex; align-items: center; gap: 0.6rem; } .license-tier-radio { display: inline-block; width: 18px; height: 18px; border: 2px solid var(--ink-500); border-radius: 50%; flex-shrink: 0; position: relative; transition: border-color 0.15s; } .license-tier.is-selected .license-tier-radio { border-color: var(--signal); } .license-tier.is-selected .license-tier-radio::after { content: ''; position: absolute; inset: 3px; background: var(--signal); border-radius: 50%; } .license-tier-name { font-family: var(--font-heading); font-size: var(--step-0); color: var(--ink-950); } .license-tier-badge { font-size: 0.7rem; font-weight: 600; padding: 0.1rem 0.4rem; border-radius: 4px; text-transform: uppercase; letter-spacing: 0.03em; } .license-tier-badge--default { background: color-mix(in srgb, var(--signal) 15%, transparent); color: var(--signal); } .license-tier-price { font-size: 0.8rem; color: var(--ink-500); font-weight: 500; } .license-tier-desc { color: var(--ink-700); font-size: 0.85rem; line-height: 1.4; margin: 0; } /* ── Detail panels ──────────────────────────────────────────────────── */ .license-detail { border: 1px solid var(--line); border-radius: var(--radius-md); background: var(--surface-1); overflow: hidden; animation: license-slide-in 0.2s ease-out; } @keyframes license-slide-in { from { opacity: 0; transform: translateY(-6px); } to { opacity: 1; transform: translateY(0); } } .license-detail-content { padding: 1.2rem 1.5rem; } .license-detail-content p { margin: 0 0 0.75rem; color: var(--ink-700); font-size: 0.9rem; line-height: 1.5; } .license-detail-content a { color: var(--signal); text-decoration: underline; } .license-detail-list { margin: 0; padding-left: 1.2rem; color: var(--ink-700); font-size: 0.85rem; line-height: 1.8; } /* ── Forms ───────────────────────────────────────────────────────────── */ .license-form { display: flex; flex-direction: column; gap: 1rem; padding: 1.2rem 1.5rem; } .license-form-label { display: flex; flex-direction: column; gap: 0.3rem; font-size: 0.85rem; font-weight: 600; color: var(--ink-700); } .license-optional { font-weight: 400; color: var(--ink-500); } .license-form-hint { font-size: 0.8rem; font-weight: 400; color: var(--ink-500); line-height: 1.4; } .license-form-input, .license-form-select, .license-form-textarea { font-family: var(--font-body); font-size: 0.9rem; padding: 0.55rem 0.75rem; border: 1px solid var(--line); border-radius: var(--radius-sm); background: var(--paper); color: var(--ink-950); transition: border-color 0.15s; } .license-form-input:focus, .license-form-select:focus, .license-form-textarea:focus { outline: none; border-color: var(--signal); box-shadow: 0 0 0 2px color-mix(in srgb, var(--signal) 20%, transparent); } .license-form-check { display: flex; align-items: flex-start; gap: 0.5rem; font-size: 0.85rem; color: var(--ink-700); line-height: 1.4; cursor: pointer; } .license-form-check input[type="checkbox"] { margin-top: 0.15rem; flex-shrink: 0; accent-color: var(--signal); } .license-submit-btn { align-self: flex-start; margin-top: 0.25rem; } .license-form-status { font-size: 0.85rem; margin: 0; min-height: 1.2em; } .license-form-status.is-error { color: #dc2626; } .license-form-status.is-success { color: #16a34a; } /* ── Saved confirmation ──────────────────────────────────────────────── */ .license-saved { display: flex; align-items: center; gap: 0.5rem; padding: 0.75rem 1rem; background: color-mix(in srgb, #16a34a 10%, var(--paper)); border: 1px solid color-mix(in srgb, #16a34a 30%, var(--line)); border-radius: var(--radius-sm); color: #16a34a; font-weight: 600; font-size: 0.9rem; margin-top: 0.75rem; animation: license-slide-in 0.2s ease-out; } .license-saved-icon { font-size: 1.1rem; } /* ── Dark mode overrides ─────────────────────────────────────────────── */ [data-theme="dark"] .license-tier { background: var(--surface-1); } [data-theme="dark"] .license-tier.is-selected { background: color-mix(in srgb, var(--signal) 10%, var(--surface-1)); } [data-theme="dark"] .license-form-input, [data-theme="dark"] .license-form-select, [data-theme="dark"] .license-form-textarea { background: var(--surface-2); color: var(--ink-950); } /* ── Verification code input ─────────────────────────────────────────── */ .license-verification { animation: license-slide-in 0.2s ease-out; } .license-verify-intro { margin: 0; color: var(--ink-700); font-size: 0.9rem; } .license-code-input { font-family: var(--font-mono); font-size: 1.5rem; letter-spacing: 0.3em; text-align: center; max-width: 200px; } .license-verify-actions { display: flex; gap: 0.75rem; align-items: center; } .license-verify-timer { font-size: 0.8rem; color: var(--ink-500); margin: 0; } /* ── Active license details ──────────────────────────────────────────── */ .license-active-details { margin-top: 0.75rem; } .license-info-table { width: 100%; border-collapse: collapse; font-size: 0.85rem; margin-bottom: 12px; } .license-info-table td { padding: 6px 0; border-bottom: 1px solid var(--line); vertical-align: top; } .license-info-table thead { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0, 0, 0, 0); } .license-info-table td:first-child { font-weight: 600; color: var(--ink-700); width: 130px; padding-right: 12px; } .license-info-table td:last-child { color: var(--ink-950); } .license-file-path { font-size: 0.8rem; color: var(--ink-500); margin: 0; } .license-file-path code { background: var(--surface-2); padding: 2px 6px; border-radius: 4px; font-size: 0.78rem; }