@eeshans/howiprompt 2.1.2 → 2.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -63,6 +63,18 @@ npx @eeshans/howiprompt --help # usage info
63
63
 
64
64
  Subsequent refreshes are incremental and reuse the local database, caches, and configured exclusions.
65
65
 
66
+ ### Self-Host On GitHub Pages
67
+
68
+ If you want to publish your own stats as a static site:
69
+
70
+ ```bash
71
+ git clone https://github.com/eeshansrivastava89/howiprompt.git
72
+ cd howiprompt && npm install && npm run dev:cli
73
+ cd howiprompt/frontend && DEMO_DEPLOY=true npm run build
74
+ ```
75
+
76
+ Then commit and push `docs/`, and enable GitHub Pages from `main` / `docs` in your repo settings.
77
+
66
78
  ---
67
79
 
68
80
  ## What You Get
@@ -133,6 +145,9 @@ npm run dev:cli
133
145
  # Build frontend
134
146
  cd frontend && npm run build
135
147
 
148
+ # Build the hosted demo from ~/.howiprompt/metrics.json
149
+ cd frontend && DEMO_DEPLOY=true npm run build
150
+
136
151
  # Build for distribution
137
152
  npm run build:cli
138
153
 
@@ -0,0 +1 @@
1
+ /*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial}}}@layer theme{:root,:host{--font-sans:"DM Sans", system-ui, -apple-system, sans-serif;--font-serif:"Fraunces", Georgia, serif;--font-mono:"JetBrains Mono", "SF Mono", Menlo, monospace;--spacing:.25rem;--container-md:28rem;--container-lg:32rem;--container-3xl:48rem;--container-4xl:56rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--text-7xl:4.5rem;--text-7xl--line-height:1;--text-8xl:6rem;--text-8xl--line-height:1;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wider:.05em;--tracking-widest:.1em;--radius-sm:.25rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-bg:var(--bg);--color-text:var(--text);--color-muted:var(--muted);--color-border:var(--border);--grid-template-columns-24:repeat(24, minmax(0, 1fr))}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{box-sizing:border-box;margin:0;padding:0}html,body{height:100%}body{font-family:var(--font-sans);background:var(--bg);color:var(--text);-webkit-font-smoothing:antialiased;touch-action:manipulation}}@layer components{@keyframes fadeIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes spin{to{transform:rotate(360deg)}}@keyframes methBob{0%,to{transform:rotate(45deg)translate(0)}50%{transform:rotate(45deg)translate(2px,2px)}}.animate{animation:.4s forwards fadeIn}.delay-1{opacity:0;animation-delay:50ms}.delay-2{opacity:0;animation-delay:.1s}.delay-3{opacity:0;animation-delay:.15s}.delay-4{opacity:0;animation-delay:.2s}.delay-5{opacity:0;animation-delay:.25s}.refreshing .refresh-icon{animation:.8s linear infinite spin}.top-nav{z-index:50;background:var(--bg);position:sticky;top:0}.source-bar{border-bottom:1px solid var(--border);flex-wrap:wrap;flex-shrink:0;align-items:center;gap:6px;padding:8px 24px;display:flex}.source-pill{color:var(--muted);border:1px solid var(--border);cursor:pointer;white-space:nowrap;background:0 0;border-radius:999px;align-items:center;gap:6px;padding:6px 14px;font-family:inherit;font-size:13px;font-weight:500;transition:all .2s;display:inline-flex}.source-pill:hover{border-color:var(--text);color:var(--text)}.source-pill.active{background:var(--text);color:var(--bg);border-color:var(--text);font-weight:600}.source-pill-dot{border-radius:50%;flex-shrink:0;width:8px;height:8px}@media(max-width:640px){.source-bar{gap:4px;padding:6px 12px}.source-pill{padding:5px 10px;font-size:12px}}.card-dock{perspective:1200px}.player-card{transform-style:preserve-3d;will-change:transform;border:1px solid #0000000f;transition:transform .15s ease-out,box-shadow .2s ease-out;box-shadow:0 1px 2px #0000000a,0 4px 12px #0000000f,0 12px 32px #00000014,0 24px 60px #0000000f;container-type:inline-size}.dark .player-card{border-color:#ffffff0f;box-shadow:0 1px 2px #0003,0 4px 12px #0003,0 12px 32px #00000040,0 24px 60px #0003}.persona-name{text-shadow:0 2px 8px #0000004d;font-size:clamp(26px,6cqw,36px)}.donut-ring svg{transform:rotate(-90deg)}.donut-fill{transition:stroke-dashoffset .6s}.stat-block:not(:last-child):after{content:"";background:var(--border);width:1px;height:60%;position:absolute;top:20%;right:0}.trend-dot{transition:r .1s}.trend-tooltip:after{content:"";border:5px solid #0000;border-top-color:var(--text);position:absolute;top:100%;left:50%;transform:translate(-50%)}.heatmap-cell.l1{background:var(--heatmap-color,var(--accent));opacity:.2}.heatmap-cell.l2{background:var(--heatmap-color,var(--accent));opacity:.35}.heatmap-cell.l3{background:var(--heatmap-color,var(--accent));opacity:.55}.heatmap-cell.l4{background:var(--heatmap-color,var(--accent));opacity:.75}.heatmap-cell.l5{background:var(--heatmap-color,var(--accent));opacity:1}.heatmap-tooltip:after{content:"";border:4px solid #0000;border-top-color:var(--text);position:absolute;top:100%;left:50%;transform:translate(-50%)}.meth-modal{box-shadow:0 1px 2px #0000000a,0 8px 24px #0000000f,0 32px 64px #00000014}.dark .meth-modal{box-shadow:0 1px 2px #0003,0 8px 24px #0003,0 32px 64px #00000040}.meth-progress-fill{background:linear-gradient(90deg,var(--accent),var(--accent))}@supports (color:color-mix(in lab,red,red)){.meth-progress-fill{background:linear-gradient(90deg,var(--accent),color-mix(in srgb,var(--accent) 50%,transparent))}}.meth-step-icon{background:linear-gradient(135deg,var(--accent),var(--accent))}@supports (color:color-mix(in lab,red,red)){.meth-step-icon{background:linear-gradient(135deg,var(--accent),color-mix(in srgb,var(--accent) 70%,#a08060))}}.meth-step-icon{box-shadow:0 4px 10px rgba(var(--accent-rgb),.2)}.meth-step:not(:last-child):after{content:"";z-index:2;background:var(--bg);border:1px solid var(--border);border-bottom:none;border-left:none;width:14px;height:14px;position:absolute;top:50%;right:-1px;transform:translate(50%)translateY(-50%)rotate(45deg)}@media(max-width:700px){.meth-step:not(:last-child):after{display:none}}.meth-scroll-arrow{animation:2s ease-in-out infinite methBob}.meth-s1{background:radial-gradient(ellipse 55% 50% at 50% 85%,rgba(var(--accent-rgb),.06),transparent)}.meth-s2{background:radial-gradient(circle at 80% 20%,rgba(var(--accent-rgb),.06),transparent 45%)}.meth-s3{background:radial-gradient(ellipse 60% 50% at 30% 70%,rgba(var(--accent-rgb),.06),transparent)}.dark .meth-s1{background:radial-gradient(ellipse 55% 50% at 50% 85%,rgba(var(--accent-rgb),.1),transparent)}.dark .meth-s2{background:radial-gradient(circle at 80% 20%,rgba(var(--accent-rgb),.1),transparent 45%)}.dark .meth-s3{background:radial-gradient(ellipse 60% 50% at 30% 70%,rgba(var(--accent-rgb),.1),transparent)}.meth-taste-card:before{content:"";background:var(--tc,var(--accent));height:3px;position:absolute;top:0;left:0;right:0}.meth-pd-art:after{content:"";background:radial-gradient(circle at 50% 80%,#0000 40%,#fff3);position:absolute;inset:0}.dark .meth-pd-art:after{background:radial-gradient(circle at 50% 80%,#0000 40%,#00000026)}.meth-p-thumb.active{box-shadow:0 0 0 3px var(--pa),var(--shadow)}@supports (color:color-mix(in lab,red,red)){.meth-p-thumb.active{box-shadow:0 0 0 3px color-mix(in srgb,var(--pa) 10%,transparent),var(--shadow)}}.meth-reveal{opacity:0;transition:opacity .6s cubic-bezier(.16,1,.3,1),transform .6s cubic-bezier(.16,1,.3,1);transform:translateY(20px)}.meth-reveal.vis{opacity:1;transform:translateY(0)}.meth-reveal.d1{transition-delay:80ms}.meth-reveal.d2{transition-delay:.16s}.meth-reveal.d3{transition-delay:.24s}.meth-reveal.d4{transition-delay:.32s}.wizard-stage-fill{background:var(--accent);transition:width .35s}@supports (color:color-mix(in lab,red,red)){.wizard-stage-fill{background:color-mix(in srgb,var(--accent) 18%,transparent)}}.wizard-stage-track.is-active .wizard-stage-fill{background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.wizard-stage-track.is-active .wizard-stage-fill{background:color-mix(in srgb,var(--accent) 28%,transparent)}}.wizard-stage-track.is-done .wizard-stage-fill{background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.wizard-stage-track.is-done .wizard-stage-fill{background:color-mix(in srgb,var(--accent) 40%,transparent)}}.wizard-stage-track.is-error .wizard-stage-fill{background:var(--stat-r)}@supports (color:color-mix(in lab,red,red)){.wizard-stage-track.is-error .wizard-stage-fill{background:color-mix(in srgb,var(--stat-r) 32%,transparent)}}:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:var(--ui-radius-sm)}@media(prefers-reduced-motion:reduce){*,:before,:after{transition:none!important;animation:none!important}.player-card{transform:none!important}.meth-reveal{opacity:1!important;transform:none!important}}}@layer utilities{.absolute{position:absolute}.relative{position:relative}.static{position:static}.top-1\/2{top:50%}.bottom-12{bottom:calc(var(--spacing) * 12)}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.mx-2{margin-inline:calc(var(--spacing) * 2)}.mx-auto{margin-inline:auto}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-16{margin-top:calc(var(--spacing) * 16)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.mb-10{margin-bottom:calc(var(--spacing) * 10)}.mb-12{margin-bottom:calc(var(--spacing) * 12)}.ml-12{margin-left:calc(var(--spacing) * 12)}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.aspect-square{aspect-ratio:1}.h-2{height:calc(var(--spacing) * 2)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.min-h-screen{min-height:100vh}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-8{width:calc(var(--spacing) * 8)}.w-12{width:calc(var(--spacing) * 12)}.w-full{width:100%}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.cursor-pointer{cursor:pointer}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-24{grid-template-columns:var(--grid-template-columns-24)}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-\[1px\]{gap:1px}.gap-\[2px\]{gap:2px}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-\[2px\]>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(2px * var(--tw-space-y-reverse));margin-block-end:calc(2px * calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.rounded-full{border-radius:3.40282e38px}.rounded-sm{border-radius:var(--radius-sm)}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-border{border-color:var(--color-border)}.bg-bg{background-color:var(--color-bg)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-20{padding-block:calc(var(--spacing) * 20)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-14{padding-top:calc(var(--spacing) * 14)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.text-center{text-align:center}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.font-serif{font-family:var(--font-serif)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-7xl{font-size:var(--text-7xl);line-height:var(--tw-leading,var(--text-7xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.text-muted,.text-muted\/40{color:var(--color-muted)}@supports (color:color-mix(in lab,red,red)){.text-muted\/40{color:color-mix(in oklab,var(--color-muted) 40%,transparent)}}.text-muted\/60{color:var(--color-muted)}@supports (color:color-mix(in lab,red,red)){.text-muted\/60{color:color-mix(in oklab,var(--color-muted) 60%,transparent)}}.text-text,.text-text\/80{color:var(--color-text)}@supports (color:color-mix(in lab,red,red)){.text-text\/80{color:color-mix(in oklab,var(--color-text) 80%,transparent)}}.text-text\/90{color:var(--color-text)}@supports (color:color-mix(in lab,red,red)){.text-text\/90{color:color-mix(in oklab,var(--color-text) 90%,transparent)}}.uppercase{text-transform:uppercase}.italic{font-style:italic}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.delay-1{transition-delay:1ms}.delay-2{transition-delay:2ms}.delay-3{transition-delay:3ms}.duration-300{--tw-duration:.3s;transition-duration:.3s}@media(hover:hover){.hover\:text-text:hover{color:var(--color-text)}}@media(min-width:40rem){.sm\:mb-8{margin-bottom:calc(var(--spacing) * 8)}.sm\:flex{display:flex}.sm\:gap-4{gap:calc(var(--spacing) * 4)}.sm\:gap-6{gap:calc(var(--spacing) * 6)}.sm\:gap-\[2px\]{gap:2px}.sm\:p-4{padding:calc(var(--spacing) * 4)}.sm\:p-6{padding:calc(var(--spacing) * 6)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:py-20{padding-block:calc(var(--spacing) * 20)}.sm\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.sm\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.sm\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.sm\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.sm\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.sm\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.sm\:text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}}@media(min-width:48rem){.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\:p-8{padding:calc(var(--spacing) * 8)}.md\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.md\:text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}.md\:text-8xl{font-size:var(--text-8xl);line-height:var(--tw-leading,var(--text-8xl--line-height))}}@media(min-width:64rem){.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}}}:root{--bg:#f5f3f0;--surface:#fff;--surface-raised:#faf8f5;--text:#3c3226;--subtext:#6b5e50;--muted:#8a7d6f;--border:#d9d2c9;--border-light:#ebe5dc;--accent:#5c3d2e;--accent-soft:#ede6de;--accent-rgb:92,61,46;--ui-radius:14px;--ui-radius-sm:8px;--shadow:0 1px 3px #3c32260f, 0 4px 12px #3c32260a;--shadow-hover:0 4px 12px #3c32261a, 0 8px 24px #3c32260f;--stat-b:#1a5bdb;--stat-r:#d20f39}.dark{--bg:#1c1816;--surface:#2a2420;--surface-raised:#332c26;--text:#e0d6cc;--subtext:#b0a596;--muted:#8a7d6f;--border:#3d342c;--border-light:#4a3f35;--accent:#c9a882;--accent-soft:#2e261f;--accent-rgb:201,168,130;--shadow:0 1px 3px #0000004d, 0 4px 12px #0003;--shadow-hover:0 4px 12px #0006, 0 8px 24px #0000004d;--stat-b:#89b4fa;--stat-r:#f38ba8}.header{background:var(--bg);flex-wrap:wrap;flex-shrink:0;justify-content:space-between;align-items:center;gap:12px;padding:12px 24px;display:flex}.header-left{flex-wrap:wrap;align-items:baseline;gap:12px;display:flex}.header h1{letter-spacing:-.02em;font-size:24px;font-weight:700}.header h1 span{color:var(--accent)}.header-subtitle{color:var(--muted);font-size:20px;font-weight:500}.date-range{color:var(--muted);font-size:14px;font-weight:500}.header-right{align-items:center;gap:12px;display:flex}.nav-link,.accent-link{color:var(--text);background:var(--surface);border:1px solid var(--border);cursor:pointer;white-space:nowrap;border-radius:20px;justify-content:center;align-items:center;gap:6px;padding:8px 14px;font-family:inherit;font-size:13px;font-weight:600;text-decoration:none;transition:all .15s;display:inline-flex}.nav-link:hover,.accent-link:hover{border-color:var(--accent);color:var(--accent);background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.nav-link:hover,.accent-link:hover{background:color-mix(in srgb,var(--accent) 10%,var(--surface))}}.create-btn{color:var(--accent);background:var(--accent-soft);border:1px solid var(--accent);align-items:center;gap:7px;padding:8px 14px;font-size:13px;font-weight:700;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.create-btn{border:1px solid color-mix(in srgb,var(--accent) 35%,var(--border))}}.create-btn{cursor:pointer;white-space:nowrap;border-radius:20px;font-family:inherit;transition:all .15s}.create-btn:hover{border-color:var(--accent);color:var(--accent);background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.create-btn:hover{background:color-mix(in srgb,var(--accent) 18%,var(--surface))}}.create-modal{background:var(--surface);width:min(92vw,860px);max-width:860px;box-shadow:var(--shadow-hover);border:1px solid var(--border);border-radius:28px;flex-direction:column;max-height:min(88vh,860px);display:flex;overflow:hidden}.create-header{border-bottom:1px solid var(--border);background:var(--bg);justify-content:space-between;align-items:center;gap:16px;padding:18px 24px;display:flex}.create-header-left{align-items:center;gap:14px;display:flex}.create-logo{border:1px solid var(--accent);border-radius:14px;width:40px;height:40px}@supports (color:color-mix(in lab,red,red)){.create-logo{border:1px solid color-mix(in srgb,var(--accent) 28%,var(--border))}}.create-logo{background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.create-logo{background:color-mix(in srgb,var(--accent) 12%,transparent)}}.create-logo{color:var(--accent);flex-shrink:0;justify-content:center;align-items:center;font-family:JetBrains Mono,monospace;font-size:15px;font-weight:700;display:flex}.create-header-title{letter-spacing:-.02em;color:var(--text);font-family:Fraunces,serif;font-size:18px;font-weight:700}.create-header-sub{color:var(--muted);margin-top:2px;font-size:12px}.create-body{flex-direction:column;gap:18px;padding:22px 24px;display:flex;overflow:auto}.create-card{border:1px solid var(--border);padding:18px 18px 16px}@supports (color:color-mix(in lab,red,red)){.create-card{border:1px solid color-mix(in srgb,var(--border) 92%,transparent)}}.create-card{background:linear-gradient(180deg,var(--surface),var(--bg));border-radius:22px}@supports (color:color-mix(in lab,red,red)){.create-card{background:linear-gradient(180deg,color-mix(in srgb,var(--surface) 82%,var(--bg) 18%),color-mix(in srgb,var(--bg) 34%,transparent))}}.create-card-muted{background:linear-gradient(180deg,var(--bg),var(--surface))}@supports (color:color-mix(in lab,red,red)){.create-card-muted{background:linear-gradient(180deg,color-mix(in srgb,var(--bg) 28%,transparent),color-mix(in srgb,var(--surface) 94%,transparent))}}.create-section-head{flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:12px;margin-bottom:8px;display:flex}.create-eyebrow{letter-spacing:.08em;text-transform:uppercase;color:var(--accent);margin:0;font-size:11px;font-weight:700}.create-rule{letter-spacing:-.02em;color:var(--text);margin:0;font-size:19px;font-weight:700}.create-card-copy{color:var(--muted);max-width:62ch;margin:0 0 14px;font-size:14px;line-height:1.55}.create-kicker{letter-spacing:.02em;text-transform:uppercase;color:var(--text);margin:0 0 4px;font-size:12px;font-weight:700}.create-subcopy{color:var(--muted);margin:0;font-size:12px;line-height:1.45}.command-strip{background:linear-gradient(180deg,var(--bg),var(--bg));justify-content:space-between;align-items:center;gap:12px;padding:12px 14px;display:flex}@supports (color:color-mix(in lab,red,red)){.command-strip{background:linear-gradient(180deg,color-mix(in srgb,var(--bg) 82%,transparent),color-mix(in srgb,var(--bg) 96%,transparent))}}.command-strip{border:1px solid var(--border)}@supports (color:color-mix(in lab,red,red)){.command-strip{border:1px solid color-mix(in srgb,var(--border) 70%,transparent)}}.command-strip{border-radius:16px;box-shadow:inset 0 1px #ffffff08}.command-line-wrap{flex:1;min-width:0}.command-line{color:var(--text);white-space:nowrap;align-items:center;gap:10px;font-family:JetBrains Mono,monospace;font-size:15px;display:flex;overflow:auto}.command-prompt{color:var(--accent);font-weight:700}.command-actions{flex-shrink:0;align-items:center;gap:8px;display:flex}.create-copy-btn,.create-source-link{white-space:nowrap;border-radius:999px;align-items:center;gap:6px;padding:7px 10px;font-family:inherit;font-size:12px;font-weight:600;text-decoration:none;transition:all .15s;display:inline-flex}.create-copy-btn{border:1px solid var(--border);color:var(--text);cursor:pointer;background:0 0}.create-copy-btn:hover,.create-source-link:hover{border-color:var(--accent);color:var(--accent);background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.create-copy-btn:hover,.create-source-link:hover{background:color-mix(in srgb,var(--accent) 10%,transparent)}}.create-copy-btn.is-copied{color:#2f8f5b;background:#2f8f5b1a;border-color:#2f8f5b}.create-source-link{border:1px solid var(--border);color:var(--muted);background:0 0}.create-steps{border-top:1px solid var(--border);flex-direction:column;gap:0;display:flex}@supports (color:color-mix(in lab,red,red)){.create-steps{border-top:1px solid color-mix(in srgb,var(--border) 82%,transparent)}}.create-steps{margin-top:4px}.create-step{border-bottom:1px solid var(--border);padding:12px 0}@supports (color:color-mix(in lab,red,red)){.create-step{border-bottom:1px solid color-mix(in srgb,var(--border) 82%,transparent)}}.create-step-head{align-items:center;gap:10px;margin-bottom:8px;display:flex}.create-step-num{background:var(--accent);border-radius:999px;justify-content:center;align-items:center;width:24px;height:24px;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.create-step-num{background:color-mix(in srgb,var(--accent) 16%,transparent)}}.create-step-num{color:var(--accent);flex-shrink:0;font-size:12px;font-weight:700}.create-step-title{color:var(--text);font-size:15px;font-weight:700}.create-step-command{justify-content:space-between;align-items:center;gap:12px;padding-left:34px;display:flex}.create-step-command code{color:var(--text);white-space:nowrap;flex:1;font-family:JetBrains Mono,monospace;font-size:12px;overflow:auto}.create-copy-btn-sm{flex-shrink:0;padding:6px 9px;font-size:11px}.create-hosted-note{color:var(--muted);margin:12px 0 0;font-size:12px;line-height:1.55}.create-hosted-note a{color:var(--accent);text-decoration:none}.create-hosted-note a:hover{text-decoration:underline}.create-bottom{border-top:1px solid var(--border);background:var(--bg);padding:14px 24px}.create-bottom-note{color:var(--muted);font-size:11px;line-height:1.5}.theme-btn{border:1px solid var(--border);background:var(--surface);cursor:pointer;width:36px;height:36px;color:var(--muted);border-radius:50%;justify-content:center;align-items:center;transition:all .2s;display:flex}.theme-btn:hover{border-color:var(--accent);color:var(--accent)}@media(max-width:640px){.header{gap:8px;padding:10px 16px}.header-right{gap:8px}.header-right .nav-link{display:none}.create-modal{border-radius:22px;width:min(94vw,860px)}.create-header{align-items:flex-start;padding:16px 18px}.create-body{padding:18px}.create-bottom{padding:12px 18px}.command-strip{flex-direction:column;align-items:stretch}.command-actions{flex-wrap:wrap;justify-content:flex-start}.create-step-command{flex-direction:column;align-items:stretch;padding-left:0}.create-step-command code{white-space:normal;word-break:break-word}}.page-frame{flex-direction:column;height:100dvh;min-height:0;display:flex}@media(max-width:1024px){.page-frame{height:auto;min-height:100dvh}}.dash-panel{flex-direction:column;flex:1;min-height:0;display:flex}.dash-container{flex-direction:column;flex:1;min-height:0;padding:0 24px;display:flex}.main-grid{flex:1;grid-template-columns:2fr 1fr;gap:20px;min-height:0;padding:16px 0;display:grid}@media(max-width:1024px){.main-grid{flex:none;grid-template-columns:1fr}.right-col{order:-1}}.left{flex-direction:column;gap:12px;min-width:0;min-height:0;display:flex}.stat-cards{grid-template-columns:repeat(4,1fr);gap:12px;display:grid}@media(max-width:640px){.stat-cards{grid-template-columns:repeat(2,1fr)}}.stat-card{background:var(--surface);border-radius:var(--ui-radius-sm);box-shadow:var(--shadow);padding:14px 16px}.stat-card-label{text-transform:uppercase;letter-spacing:.04em;color:var(--muted);margin-bottom:4px;font-size:12px;font-weight:600}.stat-card-value{letter-spacing:-.03em;font-family:JetBrains Mono,monospace;font-size:28px;font-weight:700;line-height:1}.stat-card-value.highlight{color:var(--text);font-weight:800}.stat-card-sub{color:var(--muted);margin-top:4px;font-size:13px}.trend-panel{background:var(--surface);border-radius:var(--ui-radius-sm);box-shadow:var(--shadow);flex-direction:column;flex:1;min-width:0;min-height:340px;padding:14px 20px 10px;display:flex}.trend-header{flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:10px 16px;min-width:0;margin-bottom:10px;display:flex}.trend-copy{flex-direction:column;flex:1;gap:6px;min-width:0;display:flex}.trend-copy-row{flex-wrap:wrap;align-items:center;gap:8px;min-width:0;display:flex}.trend-title{font-size:16px;font-weight:700}.trend-copy-sep{color:var(--border);font-size:13px;line-height:1}.trend-metric-def{color:var(--muted);min-width:0;font-size:12px;font-style:italic;line-height:1.35}.trend-legend{flex-wrap:wrap;align-items:center;gap:10px;min-height:15px;display:flex}.trend-legend-pill{color:var(--muted);white-space:nowrap;align-items:center;gap:5px;font-size:11px;font-weight:500;display:inline-flex}.trend-legend-dot{border-radius:50%;flex-shrink:0;width:8px;height:8px}.metric-tabs{flex-wrap:wrap;align-self:flex-start;gap:4px;min-width:0;display:flex}.metric-tab{border:1px solid var(--border);color:var(--muted);cursor:pointer;white-space:nowrap;background:0 0;border-radius:20px;padding:6px 14px;font-family:inherit;font-size:12px;font-weight:600;transition:all .15s;position:relative}.metric-tab[data-tooltip]:hover:after{content:attr(data-tooltip);background:var(--text);color:var(--bg);white-space:normal;z-index:20;pointer-events:none;border-radius:8px;width:max-content;max-width:220px;padding:6px 12px;font-family:JetBrains Mono,monospace;font-size:11px;font-weight:500;line-height:1.4;position:absolute;top:calc(100% + 8px);left:50%;transform:translate(-50%)}.metric-tab[data-tooltip]:hover:before{content:"";border:5px solid #0000;border-bottom-color:var(--text);z-index:20;pointer-events:none;position:absolute;top:calc(100% + 3px);left:50%;transform:translate(-50%)}.metric-tab.active{background:var(--accent);color:#fff;border-color:var(--accent)}.metric-tab:hover:not(.active){border-color:var(--accent);color:var(--accent)}.trend-current{align-items:baseline;gap:8px;margin-bottom:8px;display:flex}.trend-current-val{letter-spacing:-.03em;color:var(--trend-color,var(--accent));font-family:JetBrains Mono,monospace;font-size:36px;font-weight:800}.trend-current-label{display:none}.trend-chart-wrap{flex:1;min-width:0;min-height:60px;position:relative}.heatmap-panel{background:var(--surface);border-radius:var(--ui-radius-sm);box-shadow:var(--shadow);flex-shrink:0;padding:14px 18px}.heatmap-title{margin-bottom:8px;font-size:14px;font-weight:700}.heatmap{grid-template-columns:32px repeat(24,1fr);gap:1px;font-size:10px;display:grid}.heatmap-label{color:var(--muted);align-items:center;font-size:10px;font-weight:500;display:flex}.heatmap-hour{text-align:center;color:var(--muted);font-size:10px;font-weight:500}.heatmap-cell{background:var(--border);opacity:.3;border-radius:2px;height:18px}.heatmap-cell.l1{background:var(--heatmap-color,var(--accent));opacity:.2}.heatmap-cell.l2{background:var(--heatmap-color,var(--accent));opacity:.35}.heatmap-cell.l3{background:var(--heatmap-color,var(--accent));opacity:.55}.heatmap-cell.l4{background:var(--heatmap-color,var(--accent));opacity:.75}.heatmap-cell.l5{background:var(--heatmap-color,var(--accent));opacity:1}.heatmap-tooltip{background:var(--text);color:var(--bg);pointer-events:none;opacity:0;white-space:nowrap;z-index:10;border-radius:6px;padding:5px 10px;font-family:JetBrains Mono,monospace;font-size:11px;font-weight:600;transition:opacity .1s;position:absolute;top:0;left:0;transform:translate(-50%)}.heatmap-tooltip:after{content:"";border:4px solid #0000;border-top-color:var(--text);position:absolute;top:100%;left:50%;transform:translate(-50%)}.heatmap-panel{position:relative}.heatmap-meta{color:var(--muted);justify-content:space-between;margin-top:6px;font-size:11px;display:flex}.right-col{flex-direction:column;gap:12px;min-width:0;min-height:0;display:flex}.card-dock{perspective:1200px;flex:1;width:100%;min-height:0;display:flex;position:relative}.player-card{background:var(--surface);width:100%;transform-style:preserve-3d;will-change:transform;border:1px solid #0000000f;border-radius:24px;flex-direction:column;height:100%;transition:transform .15s ease-out,box-shadow .2s ease-out;display:flex;overflow:hidden;box-shadow:0 1px 2px #0000000a,0 4px 12px #0000000f,0 12px 32px #00000014,0 24px 60px #0000000f;container-type:inline-size}.dark .player-card{border-color:#ffffff0f;box-shadow:0 1px 2px #0003,0 4px 12px #0003,0 12px 32px #00000040,0 24px 60px #0003}.card-top{aspect-ratio:840/1040;background-position:50%;background-size:cover;border-radius:24px 24px 0 0;padding:0;position:relative;overflow:hidden}.card-top-content{z-index:2;flex-direction:column;gap:8px;width:50%;padding:22px 24px 18px;display:flex;position:absolute;inset:0}.persona-name{color:#fff;letter-spacing:-.04em;text-shadow:0 2px 8px #0000004d;white-space:nowrap;font-size:clamp(22px,5.5cqw,36px);font-weight:800;line-height:.96}.donut-grid{flex-direction:column;gap:10px;margin-top:16px;display:flex}.donut-item{align-items:center;gap:10px;display:flex}.donut-ring{flex-shrink:0;width:44px;height:44px;position:relative}.donut-ring svg{width:100%;height:100%;transform:rotate(-90deg)}.donut-ring .donut-track{fill:none;stroke:#ffffff26;stroke-width:5px}.donut-ring .donut-fill{fill:none;stroke:#ffffffd9;stroke-width:5px;stroke-linecap:round;transition:stroke-dashoffset .6s}.donut-val{color:#fff;justify-content:center;align-items:center;font-family:JetBrains Mono,monospace;font-size:13px;font-weight:800;display:flex;position:absolute;inset:0}.donut-label{color:#ffffffb3;font-size:12px;font-weight:600}.card-body{padding:14px 24px 12px}.persona-desc{color:var(--muted);font-size:14px;line-height:1.58}.persona-desc strong{color:var(--text);font-weight:700}.stat-strip{border-top:1px solid var(--border);grid-template-columns:repeat(2,1fr);display:grid}.stat-block{text-align:center;padding:16px 10px 14px;position:relative}.stat-block:not(:last-child):after{content:"";background:var(--border);width:1px;height:60%;position:absolute;top:20%;right:0}.stat-num{letter-spacing:-.04em;font-family:JetBrains Mono,monospace;font-size:30px;font-weight:800;line-height:1}.stat-block:first-child .stat-num{color:var(--accent)}.stat-block:nth-child(2) .stat-num{color:var(--stat-b)}.stat-block:nth-child(3) .stat-num{color:var(--stat-r)}.stat-label{text-transform:uppercase;letter-spacing:.05em;color:var(--muted);margin-top:5px;font-size:12px;font-weight:700}.stat-minibar{background:var(--border);opacity:.55;border-radius:999px;width:58%;height:3px;margin:8px auto 0;overflow:hidden}.stat-minibar-fill{border-radius:2px;height:100%}.stat-minibar-fill.o{background:var(--accent)}.stat-minibar-fill.b{background:var(--stat-b)}.stat-minibar-fill.r{background:var(--stat-r)}.card-foot{color:var(--muted);border-top:1px solid var(--border);justify-content:space-between;padding:8px 24px;font-family:JetBrains Mono,monospace;font-size:11px;display:flex}.footer{color:var(--muted);border-top:1px solid var(--border);flex-shrink:0;justify-content:space-between;align-items:center;margin-top:16px;padding:12px 24px;font-size:11px;display:flex}.footer-links{gap:16px;display:flex}.footer-links a{color:var(--muted);text-decoration:none;transition:color .15s}.footer-links a:hover{color:var(--text)}.share-toast{background:var(--surface);color:var(--text);border:1px solid var(--border);border-radius:var(--ui-radius-sm);box-shadow:var(--shadow);z-index:50;opacity:0;pointer-events:none;padding:10px 16px;font-size:13px;font-weight:500;transition:opacity .3s,transform .3s;position:fixed;bottom:84px;right:24px;transform:translateY(8px)}.share-toast.show{opacity:1;transform:translateY(0)}.refresh-modal{background:var(--surface);border-radius:var(--ui-radius);width:90%;max-width:480px;box-shadow:var(--shadow-hover);text-align:center;padding:28px 32px}.refresh-modal h3{margin-bottom:16px;font-size:16px;font-weight:700}.refresh-modal .wizard-log{text-align:left;height:180px;margin-bottom:12px}.refresh-modal .wizard-progress{margin-bottom:12px}.refresh-modal-result{color:var(--text);font-size:14px;line-height:1.8}.refresh-modal-result .result-num{color:var(--accent);font-family:JetBrains Mono,monospace;font-weight:700}.refresh-modal-close{background:var(--accent);color:#fff;cursor:pointer;border:none;border-radius:20px;margin-top:16px;padding:8px 24px;font-family:inherit;font-size:13px;font-weight:600;transition:transform .1s}.refresh-modal-close:hover{transform:scale(1.03)}@media(max-width:1024px){.page-frame{overflow-x:hidden}.dash-container,.main-grid,.card-dock{flex:none}.player-card{height:auto}.card-top-content{gap:8px}.trend-panel{flex:none;min-height:320px}.right-col{align-self:center;width:100%;max-width:480px}}@media(max-width:1400px){.trend-panel{min-height:320px}}@media(max-width:640px){html,body{height:auto;overflow-x:hidden}.header{gap:8px;padding:10px 16px}.header-right{gap:8px}.tab-bar{padding:0 16px}.dash-container{padding:0 12px}.main-grid{gap:12px}.right-col{align-self:stretch;gap:10px;max-width:none}.card-top{aspect-ratio:840/1040}.card-top-content{width:45%;padding:14px 14px 12px}.persona-name{font-size:22px}.donut-ring{width:36px;height:36px}.donut-val{font-size:11px}.donut-label{font-size:10px}.donut-grid,.donut-item{gap:6px}.card-body{padding:10px 16px 8px}.persona-desc{overflow-wrap:break-word;font-size:12px}.stat-num{font-size:22px}.stat-label{font-size:10px}.stat-block{padding:10px 4px}.card-foot{padding:6px 16px;font-size:10px}.stat-cards{gap:8px}.stat-card{padding:10px 12px}.stat-card-value{font-size:20px}.stat-card-label,.stat-card-sub{font-size:11px}.trend-panel{min-height:300px;padding:14px}.trend-header{flex-direction:column;align-items:flex-start;gap:6px}.trend-copy{gap:4px;width:100%}.trend-copy-row{gap:6px}.trend-copy-sep{display:none}.trend-metric-def{font-size:11px}.trend-title{font-size:14px}.metric-tabs{flex-wrap:wrap;gap:3px;width:100%}.metric-tab{border-radius:14px;padding:4px 8px;font-size:10px}.trend-current-val{font-size:24px}.trend-current-label{font-size:12px}.trend-chart-wrap{min-height:80px}.heatmap-panel{padding:10px 14px}.heatmap-title{margin-bottom:4px;font-size:13px}.heatmap{grid-template-columns:14px repeat(24,1fr);gap:1px}.heatmap-hour{visibility:hidden;height:0;font-size:0;line-height:0}.heatmap-label{text-overflow:clip;white-space:nowrap;width:14px;font-size:7px;overflow:hidden}.heatmap-cell{border-radius:1px;height:8px}.heatmap-meta{flex-wrap:wrap;gap:4px;font-size:10px}.footer{text-align:center;flex-direction:column;gap:4px;margin-top:8px;padding:10px 12px;font-size:10px}}@media(prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important}.player-card{transform:none!important}}.icon-sm{width:16px;height:16px}.sr-only{clip:rect(0,0,0,0);border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.wizard-overlay{z-index:200;background:var(--bg);justify-content:center;align-items:center;padding:16px;display:none;position:fixed;inset:0}.wizard-overlay.active{display:flex}.wizard-panel{background:var(--surface);border-radius:var(--ui-radius);width:100%;max-width:520px;box-shadow:var(--shadow-hover);padding:32px}.wizard-title{letter-spacing:-.02em;margin-bottom:4px;font-size:20px;font-weight:700}.wizard-title span{color:var(--accent)}.wizard-steps{gap:6px;margin:20px 0 24px;display:flex}.wizard-step{color:var(--muted);background:var(--bg);border-radius:20px;align-items:center;gap:6px;padding:6px 14px;font-size:12px;font-weight:600;transition:all .2s;display:flex}.wizard-step.active{background:var(--accent);color:#fff}.wizard-step.done{color:var(--accent)}.wizard-step-num{font-weight:700}.wizard-page{display:none}.wizard-page.active{display:block}.wizard-intro{color:var(--subtext);margin-bottom:20px;font-size:14px;line-height:1.5}.wizard-loading{color:var(--muted);text-align:center;padding:24px 0;font-size:13px}.wizard-backends{flex-direction:column;gap:8px;margin-bottom:24px;display:flex}.wizard-backend{border:1px solid var(--border);border-radius:var(--ui-radius-sm);align-items:center;gap:12px;padding:12px 16px;transition:border-color .15s;display:flex}.wizard-backend.detected{border-color:var(--accent)}.wizard-backend-icon{border-radius:50%;flex-shrink:0;width:8px;height:8px}.wizard-backend-icon.available{background:#40a02b}.wizard-backend-icon.coming_soon{background:#df8e1d}.wizard-backend-icon.not_found{background:var(--border)}.wizard-backend-info{flex:1}.wizard-backend-name{font-size:14px;font-weight:600}.wizard-backend-detail{color:var(--muted);margin-top:2px;font-size:12px}.wizard-config{flex-direction:column;gap:8px;margin-bottom:16px;display:flex}.wizard-toggle{border:1px solid var(--border);border-radius:var(--ui-radius-sm);cursor:pointer;align-items:center;gap:12px;padding:10px 16px;font-size:14px;font-weight:500;transition:border-color .15s;display:flex}.wizard-toggle:has(input:checked){border-color:var(--accent)}.wizard-toggle input[type=checkbox]{accent-color:var(--accent);width:16px;height:16px}.wizard-toggle.is-disabled{cursor:not-allowed;opacity:.65}.wizard-exclusions{margin-bottom:16px}.wizard-label{margin-bottom:6px;font-size:13px;font-weight:600;display:block}.wizard-hint{color:var(--muted);margin-top:8px;font-size:11px}.exclusion-chips{flex-direction:column;gap:6px;margin-bottom:8px;display:flex}.exclusion-chip{background:var(--bg);border:1px solid var(--border);border-radius:var(--ui-radius-sm);align-items:center;gap:8px;padding:8px 12px;font-size:12px;display:flex}.exclusion-chip-path{text-overflow:ellipsis;white-space:nowrap;color:var(--text);flex:1;font-family:JetBrains Mono,monospace;overflow:hidden}.exclusion-chip-count{color:var(--muted);white-space:nowrap;font-size:11px}.exclusion-chip-remove{cursor:pointer;color:var(--muted);background:0 0;border:none;padding:2px;font-size:16px;line-height:1;transition:color .15s}.exclusion-chip-remove:hover{color:var(--stat-r)}.exclusion-add-btn{align-items:center;gap:6px;padding:8px 16px;font-size:12px;display:inline-flex}.wizard-nav{justify-content:flex-end;gap:8px;display:flex}.wizard-btn{cursor:pointer;border:none;border-radius:20px;padding:10px 24px;font-family:inherit;font-size:13px;font-weight:600;transition:transform .1s}.wizard-btn:hover{transform:scale(1.03)}.wizard-btn-primary{background:var(--accent);color:#fff}.wizard-btn-ghost{background:var(--bg);color:var(--text);border:1px solid var(--border)}.wizard-log{background:var(--bg);border:1px solid var(--border);border-radius:var(--ui-radius-sm);height:180px;margin-bottom:16px;padding:12px;font-family:JetBrains Mono,monospace;font-size:12px;overflow-y:auto}.wizard-log-entry{color:var(--subtext);padding:2px 0}.wizard-log-entry.done{color:var(--accent);font-weight:600}.wizard-log-entry.error{color:var(--stat-r)}.wizard-progress{background:var(--border);border-radius:2px;height:4px;margin-bottom:12px;overflow:hidden}.wizard-progress-bar{background:var(--accent);width:0;height:100%;transition:width .4s}.wizard-progress-meta{justify-content:space-between;align-items:center;gap:12px;margin-bottom:8px;display:flex}.wizard-progress-label{color:var(--text);font-size:12px;font-weight:600}.wizard-progress-pct{color:var(--accent);font-size:12px;font-weight:700}.wizard-stage-list{flex-direction:column;gap:8px;margin-bottom:12px;display:flex}.wizard-stage-row{grid-template-columns:minmax(0,130px) 1fr 36px;align-items:center;gap:10px;display:grid}.wizard-stage-name{letter-spacing:.02em;color:var(--muted);text-transform:uppercase;font-size:11px;font-weight:700}.wizard-stage-track{border:1px solid var(--border);background:var(--bg);border-radius:999px;height:24px;position:relative;overflow:hidden}.wizard-stage-fill{background:var(--accent);width:0;position:absolute;inset:0 auto 0 0}@supports (color:color-mix(in lab,red,red)){.wizard-stage-fill{background:color-mix(in srgb,var(--accent) 18%,transparent)}}.wizard-stage-fill{transition:width .35s}.wizard-stage-track.is-active .wizard-stage-fill{background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.wizard-stage-track.is-active .wizard-stage-fill{background:color-mix(in srgb,var(--accent) 28%,transparent)}}.wizard-stage-track.is-done .wizard-stage-fill{background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.wizard-stage-track.is-done .wizard-stage-fill{background:color-mix(in srgb,var(--accent) 40%,transparent)}}.wizard-stage-track.is-error .wizard-stage-fill{background:var(--stat-r)}@supports (color:color-mix(in lab,red,red)){.wizard-stage-track.is-error .wizard-stage-fill{background:color-mix(in srgb,var(--stat-r) 32%,transparent)}}.wizard-stage-detail{z-index:1;color:var(--subtext);white-space:nowrap;text-overflow:ellipsis;padding:0 10px;font-size:11px;line-height:24px;display:block;position:relative;overflow:hidden}.wizard-stage-track.is-active .wizard-stage-detail{color:var(--text)}.wizard-stage-value{color:var(--muted);text-align:right;font-size:11px;font-weight:700}@media(max-width:640px){.wizard-panel{padding:24px 20px}.wizard-steps{flex-wrap:wrap}.wizard-stage-row{grid-template-columns:110px 1fr 32px}}.settings-modal{background:var(--surface);border-radius:var(--ui-radius);width:90%;max-width:460px;box-shadow:var(--shadow-hover)}.settings-header{justify-content:space-between;align-items:center;padding:20px 24px 0;display:flex}.settings-header h3{font-size:16px;font-weight:700}.settings-body{padding:16px 24px}.settings-section{margin-bottom:16px}.settings-backend-row{flex-direction:column;gap:4px;display:flex}.settings-backend-title{align-items:center;gap:8px;display:inline-flex}.settings-backend-badge{letter-spacing:.02em;text-transform:uppercase;background:var(--accent);border-radius:999px;justify-content:center;align-items:center;padding:2px 8px;font-size:10px;font-weight:700;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.settings-backend-badge{background:color-mix(in srgb,var(--accent) 16%,transparent)}}.settings-backend-badge{color:var(--accent)}.settings-backend-detail{color:var(--muted);padding:0 4px 2px 16px;font-size:12px}.settings-footer{border-top:1px solid var(--border);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;margin-top:8px;padding:16px 24px 20px;display:flex}.settings-footer-right{gap:8px;display:flex}@media(max-width:480px){.settings-footer{flex-direction:column-reverse;align-items:stretch}.settings-footer-right{justify-content:stretch}.settings-footer-right .wizard-btn{text-align:center;flex:1}.settings-footer .wizard-btn-danger{text-align:center}}.wizard-btn-danger{color:var(--stat-r);border:1px solid var(--stat-r);background:0 0;padding:8px 16px;font-size:12px}.wizard-btn-danger:hover{background:var(--stat-r);color:#fff}.modal-overlay{z-index:100;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#3c322659;justify-content:center;align-items:center;padding:16px;display:none;position:fixed;inset:0}.dark .modal-overlay{background:#0000008c}.modal-overlay.active{display:flex}.meth-modal{background:var(--bg);border:1px solid var(--border);border-radius:20px;flex-direction:column;width:min(1000px,100%);height:min(720px,100vh - 32px);display:flex;position:relative;overflow:hidden;box-shadow:0 1px 2px #0000000a,0 8px 24px #0000000f,0 32px 64px #00000014}.dark .meth-modal{box-shadow:0 1px 2px #0003,0 8px 24px #0003,0 32px 64px #00000040}.meth-progress{background:var(--border);z-index:20;opacity:.5;height:2px;position:absolute;top:0;left:0;right:0}.meth-progress-fill{background:linear-gradient(90deg,var(--accent),var(--accent));border-radius:0 1px 1px 0;width:0%;height:100%;transition:width .25s}@supports (color:color-mix(in lab,red,red)){.meth-progress-fill{background:linear-gradient(90deg,var(--accent),color-mix(in srgb,var(--accent) 50%,transparent))}}.meth-header{border-bottom:1px solid var(--border);background:var(--bg);z-index:10;flex-shrink:0;justify-content:space-between;align-items:center;padding:14px 22px;display:flex}.meth-header-left{align-items:center;gap:12px;display:flex}.meth-logo{background:var(--accent);width:32px;height:32px;box-shadow:0 2px 6px rgba(var(--accent-rgb),.2);border-radius:8px;justify-content:center;align-items:center;font-size:15px;display:flex}.meth-header-title{letter-spacing:-.02em;color:var(--text);font-family:Fraunces,serif;font-size:16px;font-weight:700}.meth-header-sub{color:var(--muted);margin-top:1px;font-size:11px}.modal-close{border:1px solid var(--border);background:var(--surface);width:32px;height:32px;color:var(--muted);cursor:pointer;border-radius:8px;justify-content:center;align-items:center;font-size:14px;transition:all .15s;display:flex}.modal-close:hover{border-color:var(--accent);color:var(--accent)}.modal-close svg{color:currentColor;width:16px;height:16px}.meth-scroll{scroll-snap-type:y mandatory;scrollbar-width:thin;scrollbar-color:rgba(var(--accent-rgb),.12) transparent;flex:1;height:0;min-height:0;overflow:hidden auto}.meth-scroll::-webkit-scrollbar{width:5px}.meth-scroll::-webkit-scrollbar-track{background:0 0}.meth-scroll::-webkit-scrollbar-thumb{background:rgba(var(--accent-rgb),.12);border-radius:3px}.meth-snap{scroll-snap-align:start;scroll-snap-stop:always;flex-direction:column;flex-shrink:0;height:100%;min-height:100%;display:flex;overflow:hidden}.meth-reveal{opacity:0;transition:opacity .6s cubic-bezier(.16,1,.3,1),transform .6s cubic-bezier(.16,1,.3,1);transform:translateY(20px)}.meth-reveal.vis{opacity:1;transform:translateY(0)}.meth-reveal.d1{transition-delay:80ms}.meth-reveal.d2{transition-delay:.16s}.meth-reveal.d3{transition-delay:.24s}.meth-reveal.d4{transition-delay:.32s}.meth-s1{background:radial-gradient(ellipse 55% 50% at 50% 85%,rgba(var(--accent-rgb),.06),transparent)}.dark .meth-s1{background:radial-gradient(ellipse 55% 50% at 50% 85%,rgba(var(--accent-rgb),.1),transparent)}.meth-s1-inner{flex-direction:column;flex:1;justify-content:center;padding:0 48px;display:flex}@media(max-width:640px){.meth-s1-inner{padding:0 20px}}.meth-hero{text-align:center;padding:40px 0 32px}.meth-hero-kicker{background:var(--accent-soft);text-transform:uppercase;letter-spacing:.12em;color:var(--accent);border-radius:999px;align-items:center;gap:7px;margin-bottom:20px;padding:6px 14px;font-family:JetBrains Mono,monospace;font-size:11px;font-weight:700;display:inline-flex}.meth-hero h1{letter-spacing:-.04em;color:var(--text);max-width:15ch;margin:0 auto;font-family:Fraunces,serif;font-size:clamp(34px,5.5vw,52px);font-weight:800;line-height:1.02}.meth-hero h1 em{color:var(--accent);font-style:italic;font-weight:600}.meth-hero-sub{color:var(--subtext,var(--muted));max-width:46ch;margin-top:16px;margin-left:auto;margin-right:auto;font-size:17px;line-height:1.6}.meth-pipeline-wrap{padding:0 0 28px}.meth-rule{color:var(--accent);align-items:center;gap:12px;margin-bottom:18px;font-family:Fraunces,serif;font-size:14px;font-weight:700;display:flex}.meth-rule:after{content:"";background:var(--border);flex:1;height:1px}.meth-process{grid-template-columns:repeat(4,1fr);gap:2px;display:grid}@media(max-width:700px){.meth-process{grid-template-columns:1fr 1fr}}.meth-step{background:var(--surface);border:1px solid var(--border);padding:22px 20px;transition:all .2s;position:relative}.meth-step:first-child{border-radius:12px 0 0 12px}.meth-step:last-child{border-radius:0 12px 12px 0}@media(max-width:700px){.meth-step:first-child{border-radius:12px 0 0}.meth-step:nth-child(2){border-radius:0 12px 0 0}.meth-step:nth-child(3){border-radius:0 0 0 12px}.meth-step:last-child{border-radius:0 0 12px}}.meth-step:hover{background:var(--accent-soft)}.meth-step-icon{background:linear-gradient(135deg,var(--accent),var(--accent));border-radius:9px;width:38px;height:38px}@supports (color:color-mix(in lab,red,red)){.meth-step-icon{background:linear-gradient(135deg,var(--accent),color-mix(in srgb,var(--accent) 70%,#a08060))}}.meth-step-icon{color:#f0e8de;box-shadow:0 4px 10px rgba(var(--accent-rgb),.2);justify-content:center;align-items:center;margin-bottom:12px;font-size:17px;display:flex}.meth-step h3{color:var(--text);margin-bottom:5px;font-family:Fraunces,serif;font-size:16px;font-weight:700}.meth-step p{color:var(--muted);font-size:13px;line-height:1.55}.meth-step:not(:last-child):after{content:"";z-index:2;background:var(--bg);border:1px solid var(--border);border-bottom:none;border-left:none;width:14px;height:14px;position:absolute;top:50%;right:-1px;transform:translate(50%)translateY(-50%)rotate(45deg)}@media(max-width:700px){.meth-step:not(:last-child):after{display:none}}.meth-scroll-hint{text-align:center;color:var(--muted);letter-spacing:.1em;text-transform:uppercase;flex-direction:column;align-items:center;gap:6px;padding:8px 0 16px;font-family:JetBrains Mono,monospace;font-size:10px;display:flex}.meth-scroll-arrow{border-right:2px solid var(--border);border-bottom:2px solid var(--border);width:14px;height:14px;animation:2s ease-in-out infinite methBob;transform:rotate(45deg)}@keyframes methBob{0%,to{transform:rotate(45deg)translate(0)}50%{transform:rotate(45deg)translate(2px,2px)}}.meth-s2{background:radial-gradient(circle at 80% 20%,rgba(var(--accent-rgb),.06),transparent 45%)}.dark .meth-s2{background:radial-gradient(circle at 80% 20%,rgba(var(--accent-rgb),.1),transparent 45%)}.meth-s2-inner{flex-direction:column;flex:1;justify-content:center;padding:0 48px;display:flex}@media(max-width:640px){.meth-s2-inner{padding:0 20px}}.meth-s2-header{text-align:center;margin-bottom:36px}.meth-s2-header h2{letter-spacing:-.03em;color:var(--text);font-family:Fraunces,serif;font-size:clamp(28px,4vw,40px);font-weight:800;line-height:1.05}.meth-s2-header p{color:var(--subtext,var(--muted));max-width:48ch;margin-top:10px;margin-left:auto;margin-right:auto;font-size:16px;line-height:1.6}.meth-taste-grid{grid-template-columns:repeat(4,1fr);gap:14px;display:grid}@media(max-width:800px){.meth-taste-grid{grid-template-columns:1fr 1fr}}@media(max-width:480px){.meth-taste-grid{grid-template-columns:1fr}}.meth-taste-card{background:var(--surface);border:1px solid var(--border);box-shadow:var(--shadow);border-radius:16px;padding:24px 22px;position:relative;overflow:hidden}.meth-taste-card:before{content:"";background:var(--tc,var(--accent));height:3px;position:absolute;top:0;left:0;right:0}.meth-taste-cat{color:var(--text);margin-bottom:16px;font-family:Fraunces,serif;font-size:17px;font-weight:700}.meth-taste-list{flex-direction:column;display:flex}.meth-taste-item{border-bottom:1px solid var(--border);justify-content:space-between;align-items:baseline;gap:6px;padding:9px 0;font-size:13px;display:flex}.meth-taste-item:last-child{border-bottom:none}.meth-taste-name{color:var(--text);white-space:nowrap;font-weight:600}.meth-taste-note{color:var(--muted);text-align:right;font-size:11px}.meth-s3{background:radial-gradient(ellipse 60% 50% at 30% 70%,rgba(var(--accent-rgb),.06),transparent)}.dark .meth-s3{background:radial-gradient(ellipse 60% 50% at 30% 70%,rgba(var(--accent-rgb),.1),transparent)}.meth-s3-inner{flex-direction:column;flex:1;min-height:0;padding:28px 48px 24px;display:flex}@media(max-width:640px){.meth-s3-inner{padding:24px 20px 20px}}.meth-s3-header{margin-bottom:20px}.meth-s3-header h2{letter-spacing:-.03em;color:var(--text);font-family:Fraunces,serif;font-size:clamp(26px,3.5vw,36px);font-weight:800;line-height:1.05}.meth-s3-header p{color:var(--subtext,var(--muted));margin-top:8px;font-size:15px;line-height:1.55}.meth-persona-layout{flex:1;grid-template-columns:210px 1fr;gap:16px;min-height:0;display:grid}@media(max-width:760px){.meth-persona-layout{grid-template-rows:auto 1fr;grid-template-columns:1fr}}.meth-persona-list{scrollbar-width:thin;scrollbar-color:rgba(var(--accent-rgb),.1) transparent;flex-direction:column;gap:6px;display:flex;overflow-y:auto}@media(max-width:760px){.meth-persona-list{flex-direction:row;gap:8px;padding-bottom:4px;overflow:auto hidden}}.meth-p-thumb{background:var(--surface);cursor:pointer;box-shadow:var(--shadow);border:2px solid #0000;border-radius:13px;flex-shrink:0;align-items:center;gap:12px;padding:11px 14px;transition:all .2s;display:flex}.meth-p-thumb:hover{border-color:var(--border);transform:translateY(-1px)}.meth-p-thumb.active{border-color:var(--pa,var(--accent));background:var(--pa,var(--accent))}@supports (color:color-mix(in lab,red,red)){.meth-p-thumb.active{background:color-mix(in srgb,var(--pa,var(--accent)) 6%,var(--surface))}}.meth-p-thumb.active{box-shadow:0 0 0 3px var(--pa),var(--shadow)}@supports (color:color-mix(in lab,red,red)){.meth-p-thumb.active{box-shadow:0 0 0 3px color-mix(in srgb,var(--pa) 10%,transparent),var(--shadow)}}.meth-p-thumb-img{background:var(--bg);border-radius:10px;flex-shrink:0;justify-content:center;align-items:center;width:44px;height:44px;display:flex;overflow:hidden}.meth-p-thumb-img img{object-fit:contain;filter:drop-shadow(0 2px 4px #0000001a);width:90%;height:90%}.meth-p-thumb-text{min-width:0}.meth-p-thumb-name{color:var(--text);white-space:nowrap;text-overflow:ellipsis;font-family:Fraunces,serif;font-size:14px;font-weight:700;overflow:hidden}.meth-p-thumb-trait{color:var(--muted);-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:11px;line-height:1.35;display:-webkit-box;overflow:hidden}@media(max-width:760px){.meth-p-thumb{text-align:center;flex-direction:column;gap:6px;min-width:100px;padding:8px 14px}.meth-p-thumb-trait{display:none}}.meth-pd{background:var(--surface);border:1px solid var(--border);min-height:0;box-shadow:var(--shadow);border-radius:18px;grid-template-columns:240px 1fr;display:grid;overflow:hidden}@media(max-width:900px){.meth-pd{grid-template-columns:200px 1fr}}@media(max-width:760px){.meth-pd{grid-template-rows:180px 1fr;grid-template-columns:1fr}}.meth-pd-art{background:var(--pd-gradient,linear-gradient(160deg,#ede6de,#f5f3f0));border-right:1px solid var(--border);justify-content:center;align-items:center;padding:20px;display:flex;position:relative;overflow:hidden}@media(max-width:760px){.meth-pd-art{border-right:none;border-bottom:1px solid var(--border)}}.meth-pd-art:after{content:"";background:radial-gradient(circle at 50% 80%,#0000 40%,#fff3);position:absolute;inset:0}.dark .meth-pd-art{background:var(--pd-gradient-dark,linear-gradient(160deg,#2e2822,#1c1816))}.dark .meth-pd-art:after{background:radial-gradient(circle at 50% 80%,#0000 40%,#00000026)}.meth-pd-art img{object-fit:contain;z-index:1;filter:drop-shadow(0 10px 20px #00000026);width:auto;max-width:90%;height:82%;transition:transform .4s cubic-bezier(.16,1,.3,1),opacity .25s;position:relative}.meth-pd-copy{scrollbar-width:thin;scrollbar-color:rgba(var(--accent-rgb),.1) transparent;flex-direction:column;padding:24px 28px;display:flex;overflow-y:auto}@media(max-width:640px){.meth-pd-copy{padding:18px 20px}}.meth-pd-badge{text-transform:uppercase;letter-spacing:.1em;color:var(--pa,var(--accent));margin-bottom:5px;font-family:JetBrains Mono,monospace;font-size:11px;font-weight:700}.meth-pd-name{letter-spacing:-.04em;color:var(--text);margin-bottom:12px;font-family:Fraunces,serif;font-size:clamp(28px,3.5vw,38px);font-weight:800;line-height:.95}.meth-pd-desc{color:var(--subtext,var(--muted));margin-bottom:18px;font-size:15px;line-height:1.6}.meth-pd-cards{grid-template-columns:1fr 1fr;gap:10px;margin-bottom:16px;display:grid}@media(max-width:500px){.meth-pd-cards{grid-template-columns:1fr}}.meth-pd-card{background:var(--accent-soft);border:1px solid var(--border);border-radius:12px;padding:14px 16px}.meth-pd-card-label{text-transform:uppercase;letter-spacing:.08em;color:var(--muted);margin-bottom:6px;font-family:JetBrains Mono,monospace;font-size:10px;font-weight:700}.meth-pd-card-text{color:var(--text);font-size:13px;line-height:1.55}.meth-pd-axes{grid-template-columns:repeat(2,1fr);gap:14px;display:grid}@media(max-width:600px){.meth-pd-axes{grid-template-columns:1fr}}.meth-ax{flex-direction:column;gap:5px;display:flex}.meth-ax-label{color:var(--text);justify-content:space-between;font-size:11px;font-weight:600;display:flex}.meth-ax-label span:last-child{color:var(--muted);font-family:JetBrains Mono,monospace}.meth-ax-track{background:var(--border);border-radius:3px;height:6px;overflow:hidden}.meth-ax-fill{background:var(--pa,var(--accent));border-radius:3px;height:100%;transition:width .5s cubic-bezier(.16,1,.3,1)}.meth-bottom{border-top:1px solid var(--border);background:var(--bg);flex-wrap:wrap;flex-shrink:0;justify-content:space-between;align-items:center;gap:12px;padding:12px 22px;display:flex}.meth-bottom-note{color:var(--muted);max-width:50ch;font-size:11px;line-height:1.5}.meth-dot-nav{align-items:center;gap:6px;display:flex}.meth-dot{background:var(--border);cursor:pointer;border:none;border-radius:50%;width:8px;height:8px;transition:all .2s}.meth-dot.active{background:var(--accent);box-shadow:0 0 6px rgba(var(--accent-rgb),.25)}.meth-dot:hover{background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.meth-dot:hover{background:color-mix(in srgb,var(--accent) 50%,var(--border))}}@media(prefers-reduced-motion:reduce){.meth-reveal{opacity:1!important;transition:none!important;transform:none!important}.meth-scroll-arrow{animation:none!important}}.card-label{text-transform:uppercase;letter-spacing:.05em;color:var(--muted);margin-bottom:8px;font-size:12px;font-weight:600}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}
@@ -0,0 +1 @@
1
+ import"./wrapped.astro_astro_type_script_index_1_lang.DKLs-Mo8.js";
@@ -0,0 +1 @@
1
+ /*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial}}}@layer theme{:root,:host{--font-sans:"DM Sans", system-ui, -apple-system, sans-serif;--font-serif:"Fraunces", Georgia, serif;--font-mono:"JetBrains Mono", "SF Mono", Menlo, monospace;--spacing:.25rem;--container-md:28rem;--container-lg:32rem;--container-3xl:48rem;--container-4xl:56rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--text-7xl:4.5rem;--text-7xl--line-height:1;--text-8xl:6rem;--text-8xl--line-height:1;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wider:.05em;--tracking-widest:.1em;--radius-sm:.25rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-bg:var(--bg);--color-text:var(--text);--color-muted:var(--muted);--color-border:var(--border);--grid-template-columns-24:repeat(24, minmax(0, 1fr))}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{box-sizing:border-box;margin:0;padding:0}html,body{height:100%}body{font-family:var(--font-sans);background:var(--bg);color:var(--text);-webkit-font-smoothing:antialiased;touch-action:manipulation}}@layer components{@keyframes fadeIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes spin{to{transform:rotate(360deg)}}@keyframes methBob{0%,to{transform:rotate(45deg)translate(0)}50%{transform:rotate(45deg)translate(2px,2px)}}.animate{animation:.4s forwards fadeIn}.delay-1{opacity:0;animation-delay:50ms}.delay-2{opacity:0;animation-delay:.1s}.delay-3{opacity:0;animation-delay:.15s}.delay-4{opacity:0;animation-delay:.2s}.delay-5{opacity:0;animation-delay:.25s}.refreshing .refresh-icon{animation:.8s linear infinite spin}.top-nav{z-index:50;background:var(--bg);position:sticky;top:0}.source-bar{border-bottom:1px solid var(--border);flex-wrap:wrap;flex-shrink:0;align-items:center;gap:6px;padding:8px 24px;display:flex}.source-pill{color:var(--muted);border:1px solid var(--border);cursor:pointer;white-space:nowrap;background:0 0;border-radius:999px;align-items:center;gap:6px;padding:6px 14px;font-family:inherit;font-size:13px;font-weight:500;transition:all .2s;display:inline-flex}.source-pill:hover{border-color:var(--text);color:var(--text)}.source-pill.active{background:var(--text);color:var(--bg);border-color:var(--text);font-weight:600}.source-pill-dot{border-radius:50%;flex-shrink:0;width:8px;height:8px}@media(max-width:640px){.source-bar{gap:4px;padding:6px 12px}.source-pill{padding:5px 10px;font-size:12px}}.card-dock{perspective:1200px}.player-card{transform-style:preserve-3d;will-change:transform;border:1px solid #0000000f;transition:transform .15s ease-out,box-shadow .2s ease-out;box-shadow:0 1px 2px #0000000a,0 4px 12px #0000000f,0 12px 32px #00000014,0 24px 60px #0000000f;container-type:inline-size}.dark .player-card{border-color:#ffffff0f;box-shadow:0 1px 2px #0003,0 4px 12px #0003,0 12px 32px #00000040,0 24px 60px #0003}.persona-name{text-shadow:0 2px 8px #0000004d;font-size:clamp(26px,6cqw,36px)}.donut-ring svg{transform:rotate(-90deg)}.donut-fill{transition:stroke-dashoffset .6s}.stat-block:not(:last-child):after{content:"";background:var(--border);width:1px;height:60%;position:absolute;top:20%;right:0}.trend-dot{transition:r .1s}.trend-tooltip:after{content:"";border:5px solid #0000;border-top-color:var(--text);position:absolute;top:100%;left:50%;transform:translate(-50%)}.heatmap-cell.l1{background:var(--heatmap-color,var(--accent));opacity:.2}.heatmap-cell.l2{background:var(--heatmap-color,var(--accent));opacity:.35}.heatmap-cell.l3{background:var(--heatmap-color,var(--accent));opacity:.55}.heatmap-cell.l4{background:var(--heatmap-color,var(--accent));opacity:.75}.heatmap-cell.l5{background:var(--heatmap-color,var(--accent));opacity:1}.heatmap-tooltip:after{content:"";border:4px solid #0000;border-top-color:var(--text);position:absolute;top:100%;left:50%;transform:translate(-50%)}.meth-modal{box-shadow:0 1px 2px #0000000a,0 8px 24px #0000000f,0 32px 64px #00000014}.dark .meth-modal{box-shadow:0 1px 2px #0003,0 8px 24px #0003,0 32px 64px #00000040}.meth-progress-fill{background:linear-gradient(90deg,var(--accent),var(--accent))}@supports (color:color-mix(in lab,red,red)){.meth-progress-fill{background:linear-gradient(90deg,var(--accent),color-mix(in srgb,var(--accent) 50%,transparent))}}.meth-step-icon{background:linear-gradient(135deg,var(--accent),var(--accent))}@supports (color:color-mix(in lab,red,red)){.meth-step-icon{background:linear-gradient(135deg,var(--accent),color-mix(in srgb,var(--accent) 70%,#a08060))}}.meth-step-icon{box-shadow:0 4px 10px rgba(var(--accent-rgb),.2)}.meth-step:not(:last-child):after{content:"";z-index:2;background:var(--bg);border:1px solid var(--border);border-bottom:none;border-left:none;width:14px;height:14px;position:absolute;top:50%;right:-1px;transform:translate(50%)translateY(-50%)rotate(45deg)}@media(max-width:700px){.meth-step:not(:last-child):after{display:none}}.meth-scroll-arrow{animation:2s ease-in-out infinite methBob}.meth-s1{background:radial-gradient(ellipse 55% 50% at 50% 85%,rgba(var(--accent-rgb),.06),transparent)}.meth-s2{background:radial-gradient(circle at 80% 20%,rgba(var(--accent-rgb),.06),transparent 45%)}.meth-s3{background:radial-gradient(ellipse 60% 50% at 30% 70%,rgba(var(--accent-rgb),.06),transparent)}.dark .meth-s1{background:radial-gradient(ellipse 55% 50% at 50% 85%,rgba(var(--accent-rgb),.1),transparent)}.dark .meth-s2{background:radial-gradient(circle at 80% 20%,rgba(var(--accent-rgb),.1),transparent 45%)}.dark .meth-s3{background:radial-gradient(ellipse 60% 50% at 30% 70%,rgba(var(--accent-rgb),.1),transparent)}.meth-taste-card:before{content:"";background:var(--tc,var(--accent));height:3px;position:absolute;top:0;left:0;right:0}.meth-pd-art:after{content:"";background:radial-gradient(circle at 50% 80%,#0000 40%,#fff3);position:absolute;inset:0}.dark .meth-pd-art:after{background:radial-gradient(circle at 50% 80%,#0000 40%,#00000026)}.meth-p-thumb.active{box-shadow:0 0 0 3px var(--pa),var(--shadow)}@supports (color:color-mix(in lab,red,red)){.meth-p-thumb.active{box-shadow:0 0 0 3px color-mix(in srgb,var(--pa) 10%,transparent),var(--shadow)}}.meth-reveal{opacity:0;transition:opacity .6s cubic-bezier(.16,1,.3,1),transform .6s cubic-bezier(.16,1,.3,1);transform:translateY(20px)}.meth-reveal.vis{opacity:1;transform:translateY(0)}.meth-reveal.d1{transition-delay:80ms}.meth-reveal.d2{transition-delay:.16s}.meth-reveal.d3{transition-delay:.24s}.meth-reveal.d4{transition-delay:.32s}.wizard-stage-fill{background:var(--accent);transition:width .35s}@supports (color:color-mix(in lab,red,red)){.wizard-stage-fill{background:color-mix(in srgb,var(--accent) 18%,transparent)}}.wizard-stage-track.is-active .wizard-stage-fill{background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.wizard-stage-track.is-active .wizard-stage-fill{background:color-mix(in srgb,var(--accent) 28%,transparent)}}.wizard-stage-track.is-done .wizard-stage-fill{background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.wizard-stage-track.is-done .wizard-stage-fill{background:color-mix(in srgb,var(--accent) 40%,transparent)}}.wizard-stage-track.is-error .wizard-stage-fill{background:var(--stat-r)}@supports (color:color-mix(in lab,red,red)){.wizard-stage-track.is-error .wizard-stage-fill{background:color-mix(in srgb,var(--stat-r) 32%,transparent)}}:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:var(--ui-radius-sm)}@media(prefers-reduced-motion:reduce){*,:before,:after{transition:none!important;animation:none!important}.player-card{transform:none!important}.meth-reveal{opacity:1!important;transform:none!important}}}@layer utilities{.absolute{position:absolute}.relative{position:relative}.static{position:static}.top-1\/2{top:50%}.bottom-12{bottom:calc(var(--spacing) * 12)}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.mx-2{margin-inline:calc(var(--spacing) * 2)}.mx-auto{margin-inline:auto}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-16{margin-top:calc(var(--spacing) * 16)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.mb-10{margin-bottom:calc(var(--spacing) * 10)}.mb-12{margin-bottom:calc(var(--spacing) * 12)}.ml-12{margin-left:calc(var(--spacing) * 12)}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.aspect-square{aspect-ratio:1}.h-2{height:calc(var(--spacing) * 2)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.min-h-screen{min-height:100vh}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-8{width:calc(var(--spacing) * 8)}.w-12{width:calc(var(--spacing) * 12)}.w-full{width:100%}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.cursor-pointer{cursor:pointer}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-24{grid-template-columns:var(--grid-template-columns-24)}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-\[1px\]{gap:1px}.gap-\[2px\]{gap:2px}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-\[2px\]>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(2px * var(--tw-space-y-reverse));margin-block-end:calc(2px * calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.rounded-full{border-radius:3.40282e38px}.rounded-sm{border-radius:var(--radius-sm)}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-border{border-color:var(--color-border)}.bg-bg{background-color:var(--color-bg)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-20{padding-block:calc(var(--spacing) * 20)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-14{padding-top:calc(var(--spacing) * 14)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.text-center{text-align:center}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.font-serif{font-family:var(--font-serif)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-7xl{font-size:var(--text-7xl);line-height:var(--tw-leading,var(--text-7xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.text-muted,.text-muted\/40{color:var(--color-muted)}@supports (color:color-mix(in lab,red,red)){.text-muted\/40{color:color-mix(in oklab,var(--color-muted) 40%,transparent)}}.text-muted\/60{color:var(--color-muted)}@supports (color:color-mix(in lab,red,red)){.text-muted\/60{color:color-mix(in oklab,var(--color-muted) 60%,transparent)}}.text-text,.text-text\/80{color:var(--color-text)}@supports (color:color-mix(in lab,red,red)){.text-text\/80{color:color-mix(in oklab,var(--color-text) 80%,transparent)}}.text-text\/90{color:var(--color-text)}@supports (color:color-mix(in lab,red,red)){.text-text\/90{color:color-mix(in oklab,var(--color-text) 90%,transparent)}}.uppercase{text-transform:uppercase}.italic{font-style:italic}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.delay-1{transition-delay:1ms}.delay-2{transition-delay:2ms}.delay-3{transition-delay:3ms}.duration-300{--tw-duration:.3s;transition-duration:.3s}@media(hover:hover){.hover\:text-text:hover{color:var(--color-text)}}@media(min-width:40rem){.sm\:mb-8{margin-bottom:calc(var(--spacing) * 8)}.sm\:flex{display:flex}.sm\:gap-4{gap:calc(var(--spacing) * 4)}.sm\:gap-6{gap:calc(var(--spacing) * 6)}.sm\:gap-\[2px\]{gap:2px}.sm\:p-4{padding:calc(var(--spacing) * 4)}.sm\:p-6{padding:calc(var(--spacing) * 6)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:py-20{padding-block:calc(var(--spacing) * 20)}.sm\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.sm\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.sm\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.sm\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.sm\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.sm\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.sm\:text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}}@media(min-width:48rem){.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\:p-8{padding:calc(var(--spacing) * 8)}.md\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.md\:text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}.md\:text-8xl{font-size:var(--text-8xl);line-height:var(--tw-leading,var(--text-8xl--line-height))}}@media(min-width:64rem){.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}}}:root{--bg:#f5f3f0;--surface:#fff;--surface-raised:#faf8f5;--text:#3c3226;--subtext:#6b5e50;--muted:#8a7d6f;--border:#d9d2c9;--border-light:#ebe5dc;--accent:#5c3d2e;--accent-soft:#ede6de;--accent-rgb:92,61,46;--ui-radius:14px;--ui-radius-sm:8px;--shadow:0 1px 3px #3c32260f, 0 4px 12px #3c32260a;--shadow-hover:0 4px 12px #3c32261a, 0 8px 24px #3c32260f;--stat-b:#1a5bdb;--stat-r:#d20f39}.dark{--bg:#1c1816;--surface:#2a2420;--surface-raised:#332c26;--text:#e0d6cc;--subtext:#b0a596;--muted:#8a7d6f;--border:#3d342c;--border-light:#4a3f35;--accent:#c9a882;--accent-soft:#2e261f;--accent-rgb:201,168,130;--shadow:0 1px 3px #0000004d, 0 4px 12px #0003;--shadow-hover:0 4px 12px #0006, 0 8px 24px #0000004d;--stat-b:#89b4fa;--stat-r:#f38ba8}.header{background:var(--bg);flex-wrap:wrap;flex-shrink:0;justify-content:space-between;align-items:center;gap:12px;padding:12px 24px;display:flex}.header-left{flex-wrap:wrap;align-items:baseline;gap:12px;display:flex}.header h1{letter-spacing:-.02em;font-size:24px;font-weight:700}.header h1 span{color:var(--accent)}.header-subtitle{color:var(--muted);font-size:20px;font-weight:500}.date-range{color:var(--muted);font-size:14px;font-weight:500}.header-right{align-items:center;gap:12px;display:flex}.nav-link,.accent-link{color:var(--text);background:var(--surface);border:1px solid var(--border);cursor:pointer;white-space:nowrap;border-radius:20px;justify-content:center;align-items:center;gap:6px;padding:8px 14px;font-family:inherit;font-size:13px;font-weight:600;text-decoration:none;transition:all .15s;display:inline-flex}.nav-link:hover,.accent-link:hover{border-color:var(--accent);color:var(--accent);background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.nav-link:hover,.accent-link:hover{background:color-mix(in srgb,var(--accent) 10%,var(--surface))}}.create-btn{color:var(--accent);background:var(--accent-soft);border:1px solid var(--accent);align-items:center;gap:7px;padding:8px 14px;font-size:13px;font-weight:700;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.create-btn{border:1px solid color-mix(in srgb,var(--accent) 35%,var(--border))}}.create-btn{cursor:pointer;white-space:nowrap;border-radius:20px;font-family:inherit;transition:all .15s}.create-btn:hover{border-color:var(--accent);color:var(--accent);background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.create-btn:hover{background:color-mix(in srgb,var(--accent) 18%,var(--surface))}}.create-modal{background:var(--surface);width:min(92vw,860px);max-width:860px;box-shadow:var(--shadow-hover);border:1px solid var(--border);border-radius:28px;flex-direction:column;max-height:min(88vh,860px);display:flex;overflow:hidden}.create-header{border-bottom:1px solid var(--border);background:var(--bg);justify-content:space-between;align-items:center;gap:16px;padding:18px 24px;display:flex}.create-header-left{align-items:center;gap:14px;display:flex}.create-logo{border:1px solid var(--accent);border-radius:14px;width:40px;height:40px}@supports (color:color-mix(in lab,red,red)){.create-logo{border:1px solid color-mix(in srgb,var(--accent) 28%,var(--border))}}.create-logo{background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.create-logo{background:color-mix(in srgb,var(--accent) 12%,transparent)}}.create-logo{color:var(--accent);flex-shrink:0;justify-content:center;align-items:center;font-family:JetBrains Mono,monospace;font-size:15px;font-weight:700;display:flex}.create-header-title{letter-spacing:-.02em;color:var(--text);font-family:Fraunces,serif;font-size:18px;font-weight:700}.create-header-sub{color:var(--muted);margin-top:2px;font-size:12px}.create-body{flex-direction:column;gap:18px;padding:22px 24px;display:flex;overflow:auto}.create-card{border:1px solid var(--border);padding:18px 18px 16px}@supports (color:color-mix(in lab,red,red)){.create-card{border:1px solid color-mix(in srgb,var(--border) 92%,transparent)}}.create-card{background:linear-gradient(180deg,var(--surface),var(--bg));border-radius:22px}@supports (color:color-mix(in lab,red,red)){.create-card{background:linear-gradient(180deg,color-mix(in srgb,var(--surface) 82%,var(--bg) 18%),color-mix(in srgb,var(--bg) 34%,transparent))}}.create-card-muted{background:linear-gradient(180deg,var(--bg),var(--surface))}@supports (color:color-mix(in lab,red,red)){.create-card-muted{background:linear-gradient(180deg,color-mix(in srgb,var(--bg) 28%,transparent),color-mix(in srgb,var(--surface) 94%,transparent))}}.create-section-head{flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:12px;margin-bottom:8px;display:flex}.create-eyebrow{letter-spacing:.08em;text-transform:uppercase;color:var(--accent);margin:0;font-size:11px;font-weight:700}.create-rule{letter-spacing:-.02em;color:var(--text);margin:0;font-size:19px;font-weight:700}.create-card-copy{color:var(--muted);max-width:62ch;margin:0 0 14px;font-size:14px;line-height:1.55}.create-kicker{letter-spacing:.02em;text-transform:uppercase;color:var(--text);margin:0 0 4px;font-size:12px;font-weight:700}.create-subcopy{color:var(--muted);margin:0;font-size:12px;line-height:1.45}.command-strip{background:linear-gradient(180deg,var(--bg),var(--bg));justify-content:space-between;align-items:center;gap:12px;padding:12px 14px;display:flex}@supports (color:color-mix(in lab,red,red)){.command-strip{background:linear-gradient(180deg,color-mix(in srgb,var(--bg) 82%,transparent),color-mix(in srgb,var(--bg) 96%,transparent))}}.command-strip{border:1px solid var(--border)}@supports (color:color-mix(in lab,red,red)){.command-strip{border:1px solid color-mix(in srgb,var(--border) 70%,transparent)}}.command-strip{border-radius:16px;box-shadow:inset 0 1px #ffffff08}.command-line-wrap{flex:1;min-width:0}.command-line{color:var(--text);white-space:nowrap;align-items:center;gap:10px;font-family:JetBrains Mono,monospace;font-size:15px;display:flex;overflow:auto}.command-prompt{color:var(--accent);font-weight:700}.command-actions{flex-shrink:0;align-items:center;gap:8px;display:flex}.create-copy-btn,.create-source-link{white-space:nowrap;border-radius:999px;align-items:center;gap:6px;padding:7px 10px;font-family:inherit;font-size:12px;font-weight:600;text-decoration:none;transition:all .15s;display:inline-flex}.create-copy-btn{border:1px solid var(--border);color:var(--text);cursor:pointer;background:0 0}.create-copy-btn:hover,.create-source-link:hover{border-color:var(--accent);color:var(--accent);background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.create-copy-btn:hover,.create-source-link:hover{background:color-mix(in srgb,var(--accent) 10%,transparent)}}.create-copy-btn.is-copied{color:#2f8f5b;background:#2f8f5b1a;border-color:#2f8f5b}.create-source-link{border:1px solid var(--border);color:var(--muted);background:0 0}.create-steps{border-top:1px solid var(--border);flex-direction:column;gap:0;display:flex}@supports (color:color-mix(in lab,red,red)){.create-steps{border-top:1px solid color-mix(in srgb,var(--border) 82%,transparent)}}.create-steps{margin-top:4px}.create-step{border-bottom:1px solid var(--border);padding:12px 0}@supports (color:color-mix(in lab,red,red)){.create-step{border-bottom:1px solid color-mix(in srgb,var(--border) 82%,transparent)}}.create-step-head{align-items:center;gap:10px;margin-bottom:8px;display:flex}.create-step-num{background:var(--accent);border-radius:999px;justify-content:center;align-items:center;width:24px;height:24px;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.create-step-num{background:color-mix(in srgb,var(--accent) 16%,transparent)}}.create-step-num{color:var(--accent);flex-shrink:0;font-size:12px;font-weight:700}.create-step-title{color:var(--text);font-size:15px;font-weight:700}.create-step-command{justify-content:space-between;align-items:center;gap:12px;padding-left:34px;display:flex}.create-step-command code{color:var(--text);white-space:nowrap;flex:1;font-family:JetBrains Mono,monospace;font-size:12px;overflow:auto}.create-copy-btn-sm{flex-shrink:0;padding:6px 9px;font-size:11px}.create-hosted-note{color:var(--muted);margin:12px 0 0;font-size:12px;line-height:1.55}.create-hosted-note a{color:var(--accent);text-decoration:none}.create-hosted-note a:hover{text-decoration:underline}.create-bottom{border-top:1px solid var(--border);background:var(--bg);padding:14px 24px}.create-bottom-note{color:var(--muted);font-size:11px;line-height:1.5}.theme-btn{border:1px solid var(--border);background:var(--surface);cursor:pointer;width:36px;height:36px;color:var(--muted);border-radius:50%;justify-content:center;align-items:center;transition:all .2s;display:flex}.theme-btn:hover{border-color:var(--accent);color:var(--accent)}.wizard-config{flex-direction:column;gap:8px;margin-bottom:16px;display:flex}.wizard-toggle{border:1px solid var(--border);border-radius:var(--ui-radius-sm);cursor:pointer;align-items:center;gap:12px;padding:10px 16px;font-size:14px;font-weight:500;transition:border-color .15s;display:flex}.wizard-toggle:has(input:checked){border-color:var(--accent)}.wizard-toggle input[type=checkbox]{accent-color:var(--accent);width:16px;height:16px}.wizard-toggle.is-disabled{cursor:not-allowed;opacity:.65}.wizard-label{margin-bottom:6px;font-size:13px;font-weight:600;display:block}.wizard-hint{color:var(--muted);margin-top:8px;font-size:11px}.wizard-loading{color:var(--muted);text-align:center;padding:24px 0;font-size:13px}.exclusion-chips{flex-direction:column;gap:6px;margin-bottom:8px;display:flex}.exclusion-chip{background:var(--bg);border:1px solid var(--border);border-radius:var(--ui-radius-sm);align-items:center;gap:8px;padding:8px 12px;font-size:12px;display:flex}.exclusion-chip-path{text-overflow:ellipsis;white-space:nowrap;color:var(--text);flex:1;font-family:JetBrains Mono,monospace;overflow:hidden}.exclusion-chip-count{color:var(--muted);white-space:nowrap;font-size:11px}.exclusion-chip-remove{cursor:pointer;color:var(--muted);background:0 0;border:none;padding:2px;font-size:16px;line-height:1;transition:color .15s}.exclusion-chip-remove:hover{color:var(--stat-r)}.exclusion-add-btn{align-items:center;gap:6px;padding:8px 16px;font-size:12px;display:inline-flex}.wizard-btn{cursor:pointer;border:none;border-radius:20px;padding:10px 24px;font-family:inherit;font-size:13px;font-weight:600;transition:transform .1s}.wizard-btn:hover{transform:scale(1.03)}.wizard-btn-primary{background:var(--accent);color:#fff}.wizard-btn-ghost{background:var(--bg);color:var(--text);border:1px solid var(--border)}.wizard-btn-danger{color:var(--stat-r);border:1px solid var(--stat-r);background:0 0;padding:8px 16px;font-size:12px}.wizard-btn-danger:hover{background:var(--stat-r);color:#fff}.wizard-progress{background:var(--border);border-radius:2px;height:4px;margin-bottom:12px;overflow:hidden}.wizard-progress-bar{background:var(--accent);width:0;height:100%;transition:width .4s}.wizard-log{background:var(--bg);border:1px solid var(--border);border-radius:var(--ui-radius-sm);height:180px;margin-bottom:16px;padding:12px;font-family:JetBrains Mono,monospace;font-size:12px;overflow-y:auto}.wizard-log-entry{color:var(--subtext);padding:2px 0}.wizard-log-entry.done{color:var(--accent);font-weight:600}.wizard-log-entry.error{color:var(--stat-r)}.settings-modal{background:var(--surface);border-radius:var(--ui-radius);width:90%;max-width:460px;box-shadow:var(--shadow-hover)}.settings-header{justify-content:space-between;align-items:center;padding:20px 24px 0;display:flex}.settings-header h3{font-size:16px;font-weight:700}.settings-body{padding:16px 24px}.settings-section{margin-bottom:16px}.settings-backend-row{flex-direction:column;gap:4px;display:flex}.settings-backend-title{align-items:center;gap:8px;display:inline-flex}.settings-backend-badge{letter-spacing:.02em;text-transform:uppercase;background:var(--accent);border-radius:999px;justify-content:center;align-items:center;padding:2px 8px;font-size:10px;font-weight:700;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.settings-backend-badge{background:color-mix(in srgb,var(--accent) 16%,transparent)}}.settings-backend-badge{color:var(--accent)}.settings-backend-detail{color:var(--muted);padding:0 4px 2px 16px;font-size:12px}.settings-footer{border-top:1px solid var(--border);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;margin-top:8px;padding:16px 24px 20px;display:flex}.settings-footer-right{gap:8px;display:flex}.refresh-modal{background:var(--surface);border-radius:var(--ui-radius);width:90%;max-width:480px;box-shadow:var(--shadow-hover);text-align:center;padding:28px 32px}.refresh-modal h3{margin-bottom:16px;font-size:16px;font-weight:700}.refresh-modal .wizard-log{text-align:left;height:180px;margin-bottom:12px}.refresh-modal .wizard-progress{margin-bottom:12px}.refresh-modal-result{color:var(--text);font-size:14px;line-height:1.8}.refresh-modal-result .result-num{color:var(--accent);font-family:JetBrains Mono,monospace;font-weight:700}.refresh-modal-close{background:var(--accent);color:#fff;cursor:pointer;border:none;border-radius:20px;margin-top:16px;padding:8px 24px;font-family:inherit;font-size:13px;font-weight:600;transition:transform .1s}.refresh-modal-close:hover{transform:scale(1.03)}@media(max-width:640px){.header{gap:8px;padding:10px 16px}.header-right{gap:8px}.header-right .nav-link{display:none}.create-modal{border-radius:22px;width:min(94vw,860px)}.create-header{align-items:flex-start;padding:16px 18px}.create-body{padding:18px}.create-bottom{padding:12px 18px}.command-strip{flex-direction:column;align-items:stretch}.command-actions{flex-wrap:wrap;justify-content:flex-start}.create-step-command{flex-direction:column;align-items:stretch;padding-left:0}.create-step-command code{white-space:normal;word-break:break-word}}@media(max-width:480px){.settings-footer{flex-direction:column-reverse;align-items:stretch}.settings-footer-right{justify-content:stretch}.settings-footer-right .wizard-btn{text-align:center;flex:1}.settings-footer .wizard-btn-danger{text-align:center}}html{scroll-snap-type:y mandatory;scroll-behavior:smooth}section{scroll-snap-align:start;scroll-snap-stop:always}.top-nav{z-index:60;background:var(--bg);position:fixed;top:0;left:0;right:0}@keyframes fadeInWrapped{0%{opacity:0}to{opacity:1}}@keyframes fadeInUp{0%{opacity:0;transform:translateY(30px)}to{opacity:1;transform:translateY(0)}}.animate-fade-in{animation:1s ease-out forwards fadeInWrapped}.animate-fade-in-up{animation:.8s ease-out forwards fadeInUp}.delay-1{opacity:0;animation-delay:.3s}.delay-2{opacity:0;animation-delay:.6s}.stat-accent{color:var(--accent)}.gradient-text{background:linear-gradient(135deg,var(--accent),rgba(var(--accent-rgb),.6));-webkit-text-fill-color:transparent;-webkit-background-clip:text;background-clip:text}.heatmap-cell{transition:all .3s}.heatmap-cell:hover{z-index:10;transform:scale(1.2)}.card{background:var(--surface);border:1px solid var(--border);border-radius:12px}.scroll-hint{animation:2s infinite bounce}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}}.tabular-nums{font-variant-numeric:tabular-nums}.refresh-btn{cursor:pointer;border:1px solid var(--border);color:var(--text);background:0 0;border-radius:999px;align-items:center;gap:5px;padding:4px 12px;font-family:inherit;font-size:13px;transition:border-color .2s;display:inline-flex}.refresh-btn:hover{border-color:var(--accent)}.icon-sm{width:16px;height:16px}.arc-gauge{width:140px;height:140px;margin:0 auto;position:relative}.arc-gauge svg{width:100%;height:100%}.arc-gauge .arc-track{fill:none;stroke:var(--border);stroke-width:8px;opacity:.3}.arc-gauge .arc-fill{fill:none;stroke:var(--accent);stroke-width:8px;stroke-linecap:round;transition:stroke-dashoffset 1s}.arc-gauge-inner{flex-direction:column;justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.donut-ring{flex-shrink:0;width:56px;height:56px;position:relative}.donut-ring svg{width:100%;height:100%;transform:rotate(-90deg)}.donut-ring .donut-track{fill:none;stroke:var(--border);stroke-width:5px}.donut-ring .donut-fill{fill:none;stroke:var(--accent);stroke-width:5px;stroke-linecap:round;transition:stroke-dashoffset .8s}.donut-val{color:var(--text);justify-content:center;align-items:center;font-family:JetBrains Mono,monospace;font-size:15px;font-weight:800;display:flex;position:absolute;inset:0}.wrapped-card-top{object-fit:contain;width:100%;max-height:320px;margin:0 auto;display:block}.wrapped-persona-section{padding-top:8rem;padding-bottom:4.5rem}.wrapped-receipt-section{padding-top:7rem;padding-bottom:4.5rem}.wrapped-persona-body{padding:1.25rem 1.5rem 1.5rem}.receipt-card{padding:1.25rem 1.5rem;font-size:13px;line-height:1.45}.receipt-card>.border-b{margin-bottom:.875rem;padding-bottom:.875rem}.receipt-card>.space-y-1{gap:.125rem}@media(min-width:640px){.wrapped-persona-section{padding-top:9rem}.wrapped-receipt-section{padding-top:7.5rem}.wrapped-persona-body{padding:1.5rem 1.75rem 1.75rem}.receipt-card{padding:1.5rem 1.75rem}}@media(prefers-reduced-motion:reduce){*,:before,:after{transition:none!important;animation:none!important}}.modal-overlay{z-index:100;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#3c322659;justify-content:center;align-items:center;padding:16px;display:none;position:fixed;inset:0}.dark .modal-overlay{background:#0000008c}.modal-overlay.active{display:flex}.meth-modal{background:var(--bg);border:1px solid var(--border);border-radius:20px;flex-direction:column;width:min(1000px,100%);height:min(720px,100vh - 32px);display:flex;position:relative;overflow:hidden;box-shadow:0 1px 2px #0000000a,0 8px 24px #0000000f,0 32px 64px #00000014}.dark .meth-modal{box-shadow:0 1px 2px #0003,0 8px 24px #0003,0 32px 64px #00000040}.meth-progress{background:var(--border);z-index:20;opacity:.5;height:2px;position:absolute;top:0;left:0;right:0}.meth-progress-fill{background:linear-gradient(90deg,var(--accent),var(--accent));border-radius:0 1px 1px 0;width:0%;height:100%;transition:width .25s}@supports (color:color-mix(in lab,red,red)){.meth-progress-fill{background:linear-gradient(90deg,var(--accent),color-mix(in srgb,var(--accent) 50%,transparent))}}.meth-header{border-bottom:1px solid var(--border);background:var(--bg);z-index:10;flex-shrink:0;justify-content:space-between;align-items:center;padding:14px 22px;display:flex}.meth-header-left{align-items:center;gap:12px;display:flex}.meth-logo{background:var(--accent);width:32px;height:32px;box-shadow:0 2px 6px rgba(var(--accent-rgb),.2);border-radius:8px;justify-content:center;align-items:center;font-size:15px;display:flex}.meth-header-title{letter-spacing:-.02em;color:var(--text);font-family:Fraunces,serif;font-size:16px;font-weight:700}.meth-header-sub{color:var(--muted);margin-top:1px;font-size:11px}.modal-close{border:1px solid var(--border);background:var(--surface);width:32px;height:32px;color:var(--muted);cursor:pointer;border-radius:8px;justify-content:center;align-items:center;font-size:14px;transition:all .15s;display:flex}.modal-close:hover{border-color:var(--accent);color:var(--accent)}.modal-close svg{color:currentColor;width:16px;height:16px}.meth-scroll{scroll-snap-type:y mandatory;scrollbar-width:thin;scrollbar-color:rgba(var(--accent-rgb),.12) transparent;flex:1;height:0;min-height:0;overflow:hidden auto}.meth-scroll::-webkit-scrollbar{width:5px}.meth-scroll::-webkit-scrollbar-track{background:0 0}.meth-scroll::-webkit-scrollbar-thumb{background:rgba(var(--accent-rgb),.12);border-radius:3px}.meth-snap{scroll-snap-align:start;scroll-snap-stop:always;flex-direction:column;flex-shrink:0;height:100%;min-height:100%;display:flex;overflow:hidden}.meth-reveal{opacity:0;transition:opacity .6s cubic-bezier(.16,1,.3,1),transform .6s cubic-bezier(.16,1,.3,1);transform:translateY(20px)}.meth-reveal.vis{opacity:1;transform:translateY(0)}.meth-reveal.d1{transition-delay:80ms}.meth-reveal.d2{transition-delay:.16s}.meth-reveal.d3{transition-delay:.24s}.meth-reveal.d4{transition-delay:.32s}.meth-s1{background:radial-gradient(ellipse 55% 50% at 50% 85%,rgba(var(--accent-rgb),.06),transparent)}.dark .meth-s1{background:radial-gradient(ellipse 55% 50% at 50% 85%,rgba(var(--accent-rgb),.1),transparent)}.meth-s1-inner{flex-direction:column;flex:1;justify-content:center;padding:0 48px;display:flex}@media(max-width:640px){.meth-s1-inner{padding:0 20px}}.meth-hero{text-align:center;padding:40px 0 32px}.meth-hero-kicker{background:var(--accent-soft);text-transform:uppercase;letter-spacing:.12em;color:var(--accent);border-radius:999px;align-items:center;gap:7px;margin-bottom:20px;padding:6px 14px;font-family:JetBrains Mono,monospace;font-size:11px;font-weight:700;display:inline-flex}.meth-hero h1{letter-spacing:-.04em;color:var(--text);max-width:15ch;margin:0 auto;font-family:Fraunces,serif;font-size:clamp(34px,5.5vw,52px);font-weight:800;line-height:1.02}.meth-hero h1 em{color:var(--accent);font-style:italic;font-weight:600}.meth-hero-sub{color:var(--subtext,var(--muted));max-width:46ch;margin-top:16px;margin-left:auto;margin-right:auto;font-size:17px;line-height:1.6}.meth-pipeline-wrap{padding:0 0 28px}.meth-rule{color:var(--accent);align-items:center;gap:12px;margin-bottom:18px;font-family:Fraunces,serif;font-size:14px;font-weight:700;display:flex}.meth-rule:after{content:"";background:var(--border);flex:1;height:1px}.meth-process{grid-template-columns:repeat(4,1fr);gap:2px;display:grid}@media(max-width:700px){.meth-process{grid-template-columns:1fr 1fr}}.meth-step{background:var(--surface);border:1px solid var(--border);padding:22px 20px;transition:all .2s;position:relative}.meth-step:first-child{border-radius:12px 0 0 12px}.meth-step:last-child{border-radius:0 12px 12px 0}@media(max-width:700px){.meth-step:first-child{border-radius:12px 0 0}.meth-step:nth-child(2){border-radius:0 12px 0 0}.meth-step:nth-child(3){border-radius:0 0 0 12px}.meth-step:last-child{border-radius:0 0 12px}}.meth-step:hover{background:var(--accent-soft)}.meth-step-icon{background:linear-gradient(135deg,var(--accent),var(--accent));border-radius:9px;width:38px;height:38px}@supports (color:color-mix(in lab,red,red)){.meth-step-icon{background:linear-gradient(135deg,var(--accent),color-mix(in srgb,var(--accent) 70%,#a08060))}}.meth-step-icon{color:#f0e8de;box-shadow:0 4px 10px rgba(var(--accent-rgb),.2);justify-content:center;align-items:center;margin-bottom:12px;font-size:17px;display:flex}.meth-step h3{color:var(--text);margin-bottom:5px;font-family:Fraunces,serif;font-size:16px;font-weight:700}.meth-step p{color:var(--muted);font-size:13px;line-height:1.55}.meth-step:not(:last-child):after{content:"";z-index:2;background:var(--bg);border:1px solid var(--border);border-bottom:none;border-left:none;width:14px;height:14px;position:absolute;top:50%;right:-1px;transform:translate(50%)translateY(-50%)rotate(45deg)}@media(max-width:700px){.meth-step:not(:last-child):after{display:none}}.meth-scroll-hint{text-align:center;color:var(--muted);letter-spacing:.1em;text-transform:uppercase;flex-direction:column;align-items:center;gap:6px;padding:8px 0 16px;font-family:JetBrains Mono,monospace;font-size:10px;display:flex}.meth-scroll-arrow{border-right:2px solid var(--border);border-bottom:2px solid var(--border);width:14px;height:14px;animation:2s ease-in-out infinite methBob;transform:rotate(45deg)}@keyframes methBob{0%,to{transform:rotate(45deg)translate(0)}50%{transform:rotate(45deg)translate(2px,2px)}}.meth-s2{background:radial-gradient(circle at 80% 20%,rgba(var(--accent-rgb),.06),transparent 45%)}.dark .meth-s2{background:radial-gradient(circle at 80% 20%,rgba(var(--accent-rgb),.1),transparent 45%)}.meth-s2-inner{flex-direction:column;flex:1;justify-content:center;padding:0 48px;display:flex}@media(max-width:640px){.meth-s2-inner{padding:0 20px}}.meth-s2-header{text-align:center;margin-bottom:36px}.meth-s2-header h2{letter-spacing:-.03em;color:var(--text);font-family:Fraunces,serif;font-size:clamp(28px,4vw,40px);font-weight:800;line-height:1.05}.meth-s2-header p{color:var(--subtext,var(--muted));max-width:48ch;margin-top:10px;margin-left:auto;margin-right:auto;font-size:16px;line-height:1.6}.meth-taste-grid{grid-template-columns:repeat(4,1fr);gap:14px;display:grid}@media(max-width:800px){.meth-taste-grid{grid-template-columns:1fr 1fr}}@media(max-width:480px){.meth-taste-grid{grid-template-columns:1fr}}.meth-taste-card{background:var(--surface);border:1px solid var(--border);box-shadow:var(--shadow);border-radius:16px;padding:24px 22px;position:relative;overflow:hidden}.meth-taste-card:before{content:"";background:var(--tc,var(--accent));height:3px;position:absolute;top:0;left:0;right:0}.meth-taste-cat{color:var(--text);margin-bottom:16px;font-family:Fraunces,serif;font-size:17px;font-weight:700}.meth-taste-list{flex-direction:column;display:flex}.meth-taste-item{border-bottom:1px solid var(--border);justify-content:space-between;align-items:baseline;gap:6px;padding:9px 0;font-size:13px;display:flex}.meth-taste-item:last-child{border-bottom:none}.meth-taste-name{color:var(--text);white-space:nowrap;font-weight:600}.meth-taste-note{color:var(--muted);text-align:right;font-size:11px}.meth-s3{background:radial-gradient(ellipse 60% 50% at 30% 70%,rgba(var(--accent-rgb),.06),transparent)}.dark .meth-s3{background:radial-gradient(ellipse 60% 50% at 30% 70%,rgba(var(--accent-rgb),.1),transparent)}.meth-s3-inner{flex-direction:column;flex:1;min-height:0;padding:28px 48px 24px;display:flex}@media(max-width:640px){.meth-s3-inner{padding:24px 20px 20px}}.meth-s3-header{margin-bottom:20px}.meth-s3-header h2{letter-spacing:-.03em;color:var(--text);font-family:Fraunces,serif;font-size:clamp(26px,3.5vw,36px);font-weight:800;line-height:1.05}.meth-s3-header p{color:var(--subtext,var(--muted));margin-top:8px;font-size:15px;line-height:1.55}.meth-persona-layout{flex:1;grid-template-columns:210px 1fr;gap:16px;min-height:0;display:grid}@media(max-width:760px){.meth-persona-layout{grid-template-rows:auto 1fr;grid-template-columns:1fr}}.meth-persona-list{scrollbar-width:thin;scrollbar-color:rgba(var(--accent-rgb),.1) transparent;flex-direction:column;gap:6px;display:flex;overflow-y:auto}@media(max-width:760px){.meth-persona-list{flex-direction:row;gap:8px;padding-bottom:4px;overflow:auto hidden}}.meth-p-thumb{background:var(--surface);cursor:pointer;box-shadow:var(--shadow);border:2px solid #0000;border-radius:13px;flex-shrink:0;align-items:center;gap:12px;padding:11px 14px;transition:all .2s;display:flex}.meth-p-thumb:hover{border-color:var(--border);transform:translateY(-1px)}.meth-p-thumb.active{border-color:var(--pa,var(--accent));background:var(--pa,var(--accent))}@supports (color:color-mix(in lab,red,red)){.meth-p-thumb.active{background:color-mix(in srgb,var(--pa,var(--accent)) 6%,var(--surface))}}.meth-p-thumb.active{box-shadow:0 0 0 3px var(--pa),var(--shadow)}@supports (color:color-mix(in lab,red,red)){.meth-p-thumb.active{box-shadow:0 0 0 3px color-mix(in srgb,var(--pa) 10%,transparent),var(--shadow)}}.meth-p-thumb-img{background:var(--bg);border-radius:10px;flex-shrink:0;justify-content:center;align-items:center;width:44px;height:44px;display:flex;overflow:hidden}.meth-p-thumb-img img{object-fit:contain;filter:drop-shadow(0 2px 4px #0000001a);width:90%;height:90%}.meth-p-thumb-text{min-width:0}.meth-p-thumb-name{color:var(--text);white-space:nowrap;text-overflow:ellipsis;font-family:Fraunces,serif;font-size:14px;font-weight:700;overflow:hidden}.meth-p-thumb-trait{color:var(--muted);-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:11px;line-height:1.35;display:-webkit-box;overflow:hidden}@media(max-width:760px){.meth-p-thumb{text-align:center;flex-direction:column;gap:6px;min-width:100px;padding:8px 14px}.meth-p-thumb-trait{display:none}}.meth-pd{background:var(--surface);border:1px solid var(--border);min-height:0;box-shadow:var(--shadow);border-radius:18px;grid-template-columns:240px 1fr;display:grid;overflow:hidden}@media(max-width:900px){.meth-pd{grid-template-columns:200px 1fr}}@media(max-width:760px){.meth-pd{grid-template-rows:180px 1fr;grid-template-columns:1fr}}.meth-pd-art{background:var(--pd-gradient,linear-gradient(160deg,#ede6de,#f5f3f0));border-right:1px solid var(--border);justify-content:center;align-items:center;padding:20px;display:flex;position:relative;overflow:hidden}@media(max-width:760px){.meth-pd-art{border-right:none;border-bottom:1px solid var(--border)}}.meth-pd-art:after{content:"";background:radial-gradient(circle at 50% 80%,#0000 40%,#fff3);position:absolute;inset:0}.dark .meth-pd-art{background:var(--pd-gradient-dark,linear-gradient(160deg,#2e2822,#1c1816))}.dark .meth-pd-art:after{background:radial-gradient(circle at 50% 80%,#0000 40%,#00000026)}.meth-pd-art img{object-fit:contain;z-index:1;filter:drop-shadow(0 10px 20px #00000026);width:auto;max-width:90%;height:82%;transition:transform .4s cubic-bezier(.16,1,.3,1),opacity .25s;position:relative}.meth-pd-copy{scrollbar-width:thin;scrollbar-color:rgba(var(--accent-rgb),.1) transparent;flex-direction:column;padding:24px 28px;display:flex;overflow-y:auto}@media(max-width:640px){.meth-pd-copy{padding:18px 20px}}.meth-pd-badge{text-transform:uppercase;letter-spacing:.1em;color:var(--pa,var(--accent));margin-bottom:5px;font-family:JetBrains Mono,monospace;font-size:11px;font-weight:700}.meth-pd-name{letter-spacing:-.04em;color:var(--text);margin-bottom:12px;font-family:Fraunces,serif;font-size:clamp(28px,3.5vw,38px);font-weight:800;line-height:.95}.meth-pd-desc{color:var(--subtext,var(--muted));margin-bottom:18px;font-size:15px;line-height:1.6}.meth-pd-cards{grid-template-columns:1fr 1fr;gap:10px;margin-bottom:16px;display:grid}@media(max-width:500px){.meth-pd-cards{grid-template-columns:1fr}}.meth-pd-card{background:var(--accent-soft);border:1px solid var(--border);border-radius:12px;padding:14px 16px}.meth-pd-card-label{text-transform:uppercase;letter-spacing:.08em;color:var(--muted);margin-bottom:6px;font-family:JetBrains Mono,monospace;font-size:10px;font-weight:700}.meth-pd-card-text{color:var(--text);font-size:13px;line-height:1.55}.meth-pd-axes{grid-template-columns:repeat(2,1fr);gap:14px;display:grid}@media(max-width:600px){.meth-pd-axes{grid-template-columns:1fr}}.meth-ax{flex-direction:column;gap:5px;display:flex}.meth-ax-label{color:var(--text);justify-content:space-between;font-size:11px;font-weight:600;display:flex}.meth-ax-label span:last-child{color:var(--muted);font-family:JetBrains Mono,monospace}.meth-ax-track{background:var(--border);border-radius:3px;height:6px;overflow:hidden}.meth-ax-fill{background:var(--pa,var(--accent));border-radius:3px;height:100%;transition:width .5s cubic-bezier(.16,1,.3,1)}.meth-bottom{border-top:1px solid var(--border);background:var(--bg);flex-wrap:wrap;flex-shrink:0;justify-content:space-between;align-items:center;gap:12px;padding:12px 22px;display:flex}.meth-bottom-note{color:var(--muted);max-width:50ch;font-size:11px;line-height:1.5}.meth-dot-nav{align-items:center;gap:6px;display:flex}.meth-dot{background:var(--border);cursor:pointer;border:none;border-radius:50%;width:8px;height:8px;transition:all .2s}.meth-dot.active{background:var(--accent);box-shadow:0 0 6px rgba(var(--accent-rgb),.25)}.meth-dot:hover{background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.meth-dot:hover{background:color-mix(in srgb,var(--accent) 50%,var(--border))}}@media(prefers-reduced-motion:reduce){.meth-reveal{opacity:1!important;transition:none!important;transform:none!important}.meth-scroll-arrow{animation:none!important}}.card-label{text-transform:uppercase;letter-spacing:.05em;color:var(--muted);margin-bottom:8px;font-size:12px;font-weight:600}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}
@@ -0,0 +1 @@
1
+ function s(o){return navigator.clipboard?.writeText?navigator.clipboard.writeText(o):new Promise((c,n)=>{try{const e=document.createElement("textarea");e.value=o,e.setAttribute("readonly",""),e.style.position="absolute",e.style.left="-9999px",document.body.appendChild(e),e.select(),document.execCommand("copy"),document.body.removeChild(e),c()}catch(e){n(e)}})}function l(){const o=document.getElementById("createModal"),c=[...document.querySelectorAll("[data-copy-text]")];if(!o||c.length===0)return;const n=new WeakMap;let e=null;window.openCreateModal=()=>{e=document.activeElement,o.classList.add("active"),document.body.style.overflow="hidden"},window.closeCreateModal=()=>{o.classList.remove("active"),document.body.style.overflow="",e&&typeof e.focus=="function"&&(e.focus(),e=null)},c.forEach(t=>{const i=t.querySelector(".create-copy-label");t.addEventListener("click",async()=>{const r=t.dataset.copyText||"";try{await s(r),i&&(i.textContent="Copied"),t.classList.add("is-copied");const a=n.get(t);a&&clearTimeout(a);const d=window.setTimeout(()=>{i&&(i.textContent="Copy"),t.classList.remove("is-copied")},1600);n.set(t,d)}catch{i&&(i.textContent="Failed");const a=n.get(t);a&&clearTimeout(a);const d=window.setTimeout(()=>{i&&(i.textContent="Copy")},1600);n.set(t,d)}})}),o.addEventListener("click",t=>{t.target===o&&window.closeCreateModal()}),document.addEventListener("keydown",t=>{t.key==="Escape"&&window.closeCreateModal()})}l();
@@ -1,9 +1,9 @@
1
- <!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests"><title>How I Prompt: Dashboard</title><link rel="icon" type="image/svg+xml" href="/favicon.svg"><!-- Open Graph --><meta property="og:title" content="How I Prompt: Dashboard"><meta property="og:description" content="Prompts analyzed. A condensed view of AI conversation patterns."><meta property="og:type" content="website"><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=DM+Sans:opsz,wght@9..40,400;9..40,500;9..40,600;9..40,700;9..40,800&family=Fraunces:ital,opsz,wght@0,9..144,400;0,9..144,600;0,9..144,700;0,9..144,800;1,9..144,400;1,9..144,600&family=JetBrains+Mono:wght@400;600;700&display=swap" rel="stylesheet"><script src="https://cdn.jsdelivr.net/npm/apexcharts@4/dist/apexcharts.min.js"></script><link rel="stylesheet" href="/_astro/index.CsEH3YG3.css"></head> <body> <div class="page-frame"> <div class="top-nav" id="topNav"> <header class="header"> <div class="header-left"> <h1>How I <span>Prompt</span></h1> <span class="date-range" id="dateRange">--</span> </div> <div class="header-right"> <a href="/wrapped" class="accent-link"> <svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"></path></svg>
1
+ <!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests"><title>How I Prompt: Dashboard</title><link rel="icon" type="image/svg+xml" href="/favicon.svg"><!-- Open Graph --><meta property="og:title" content="How I Prompt: Dashboard"><meta property="og:description" content="Prompts analyzed. A condensed view of AI conversation patterns."><meta property="og:type" content="website"><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=DM+Sans:opsz,wght@9..40,400;9..40,500;9..40,600;9..40,700;9..40,800&family=Fraunces:ital,opsz,wght@0,9..144,400;0,9..144,600;0,9..144,700;0,9..144,800;1,9..144,400;1,9..144,600&family=JetBrains+Mono:wght@400;600;700&display=swap" rel="stylesheet"><script src="https://cdn.jsdelivr.net/npm/apexcharts@4/dist/apexcharts.min.js"></script><link rel="stylesheet" href="/_astro/index.Cac4dtJr.css"></head> <body> <div class="page-frame"> <div class="top-nav" id="topNav"> <header class="header"> <div class="header-left"> <h1>How I <span>Prompt</span></h1> <span class="date-range" id="dateRange">--</span> </div> <div class="header-right"> <a href="/wrapped" class="accent-link"> <svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 3v4M3 5h4M6 17v4m-2-2h4m5-16l2.286 6.857L21 12l-5.714 2.143L13 21l-2.286-6.857L5 12l5.714-2.143L13 3z"></path></svg>
2
2
  Wrapped
3
- </a> <div class="create-dropdown" id="createDropdown"> <button class="create-btn" id="createToggle" type="button" aria-expanded="false" aria-controls="createMenu"> <svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 9l-3 3 3 3m8-6l3 3-3 3M14 4l-4 16"></path></svg>
3
+ </a> <button class="create-btn" id="createToggle" type="button" onclick="openCreateModal()" aria-label="Open create your own modal"> <svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 9l-3 3 3 3m8-6l3 3-3 3M14 4l-4 16"></path></svg>
4
4
  Create Your Own
5
- </button> <div class="create-menu" id="createMenu" hidden> <div class="create-menu-copy"> <p class="create-kicker">Run locally on your own AI chats</p> <p class="create-subcopy">Private, local-first analytics in one command.</p> </div> <div class="command-strip" role="group" aria-label="Run command"> <div class="command-line-wrap"> <div class="command-line"> <span class="command-prompt">$</span> <code id="createCommand">npx @eeshans/howiprompt</code> </div> </div> <div class="command-actions"> <button class="create-copy-btn" id="createCopyBtn" type="button" data-copy-text="npx @eeshans/howiprompt" aria-label="Copy command"> <svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24"><rect x="9" y="9" width="13" height="13" rx="2" ry="2" stroke-width="2"></rect><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"></path></svg> <span class="create-copy-label">Copy</span> </button> <a class="create-source-link" href="https://github.com/eeshansrivastava89/howiprompt" target="_blank" rel="noreferrer"> <svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><path d="M12 .5C5.65.5.5 5.65.5 12a11.5 11.5 0 008 10.94c.58.1.79-.25.79-.56l-.02-2.15c-3.25.71-3.94-1.56-3.94-1.56-.53-1.35-1.3-1.71-1.3-1.71-1.07-.73.08-.71.08-.71 1.18.08 1.8 1.21 1.8 1.21 1.05 1.8 2.76 1.28 3.43.98.1-.76.41-1.28.74-1.58-2.59-.29-5.31-1.29-5.31-5.75 0-1.27.45-2.31 1.2-3.12-.12-.29-.52-1.46.12-3.04 0 0 .98-.31 3.2 1.19a11.1 11.1 0 015.82 0c2.21-1.5 3.19-1.19 3.19-1.19.64 1.58.24 2.75.12 3.04.75.81 1.2 1.85 1.2 3.12 0 4.47-2.73 5.46-5.33 5.74.42.36.79 1.08.79 2.17l-.01 3.22c0 .31.21.67.8.56A11.5 11.5 0 0023.5 12C23.5 5.65 18.35.5 12 .5z"></path></svg> <span>Source</span> </a> </div> </div> </div> </div> <button class="nav-link" type="button" onclick="openMethodology()">The Method</button> <button class="theme-btn" id="themeToggle" aria-label="Toggle theme"> <svg width="16" height="16" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z"></path></svg> </button> <button class="theme-btn" id="settingsBtn" onclick="openSettings()" aria-label="Settings"> <svg width="18" height="18" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.066 2.573c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.573 1.066c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.066-2.573c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"></path><circle cx="12" cy="12" r="3"></circle></svg> </button> </div> </header> <nav class="source-bar" id="sourceBar"></nav> </div> <!-- DASHBOARD --> <div class="dash-panel" id="tab-dashboard"> <div class="dash-container"> <div class="main-grid"> <!-- LEFT 2fr --> <div class="left"> <!-- Stat cards --> <div class="stat-cards animate delay-1"> <div class="stat-card"> <div class="stat-card-label">Prompts</div> <div class="stat-card-value" id="promptsValue">--</div> <div class="stat-card-sub" id="promptsSubtitle">-- words avg</div> </div> <div class="stat-card"> <div class="stat-card-label">Conversations</div> <div class="stat-card-value" id="conversationsValue">--</div> <div class="stat-card-sub" id="conversationsSubtitle">-- turns avg</div> </div> <div class="stat-card"> <div class="stat-card-label">Words Typed</div> <div class="stat-card-value" id="wordsTypedValue">--</div> <div class="stat-card-sub" id="wordsTypedSubtitle">--</div> </div> <div class="stat-card"> <div class="stat-card-label">Night Owl</div> <div class="stat-card-value highlight" id="nightOwlValue">--%</div> <div class="stat-card-sub">prompts 11pm–4am</div> </div> </div> <!-- Trend Chart --> <div class="trend-panel animate delay-2"> <div class="trend-header"> <div class="trend-copy"> <div class="trend-copy-row"> <div class="trend-title">Trends</div> <span class="trend-copy-sep" aria-hidden="true">|</span> <div class="trend-metric-def" id="trendMetricDef">How much you vibe-code. Higher = more intent-driven, less spec-heavy.</div> </div> <div class="trend-legend" id="trendLegend"></div> </div> <div class="metric-tabs" id="metricTabs"> <button class="metric-tab active" data-metric="vibe" data-tooltip="Engineer on the left, vibe coder on the right. Higher means more instinct-led prompting.">Vibe Coder Index</button> <button class="metric-tab" data-metric="polite" data-tooltip="Direct on the left, warm on the right. Higher means a kinder, more collaborative tone.">Politeness</button> <button class="metric-tab" data-metric="activity" data-tooltip="Quiet weeks on the low end, heavy usage on the high end.">Activity</button> </div> </div> <div class="trend-current"> <span class="trend-current-val" id="trendVal">--</span> <span class="trend-current-label" id="trendLabel">--</span> </div> <div class="trend-chart-wrap" id="trendWrap"> <div id="trendChart"></div> </div> </div> <!-- Heatmap --> <div class="heatmap-panel animate delay-3"> <div class="heatmap-title">Activity Heatmap</div> <div class="heatmap" id="heatmapGrid"></div> <div class="heatmap-meta"> <span>Peak Hour: <strong id="peakHourValue">--</strong></span> <span>Peak Day: <strong id="peakDayValue">--</strong></span> </div> </div> </div> <!-- RIGHT 1fr --> <div class="right-col"> <div class="card-dock"> <!-- Player card --> <div class="player-card" id="playerCard"> <div class="card-top" id="cardTop"> <div class="card-top-content"> <div class="persona-name" id="personaName">--</div> <div class="donut-grid"> <div class="donut-item"> <div class="donut-ring"><svg viewBox="0 0 44 44"><circle class="donut-track" cx="22" cy="22" r="20"></circle><circle class="donut-fill" id="donutDetail" cx="22" cy="22" r="20" stroke-dasharray="125.66" stroke-dashoffset="125.66"></circle></svg><div class="donut-val" id="valDetail">--</div></div> <div class="donut-label">Detail</div> </div> <div class="donut-item"> <div class="donut-ring"><svg viewBox="0 0 44 44"><circle class="donut-track" cx="22" cy="22" r="20"></circle><circle class="donut-fill" id="donutStyle" cx="22" cy="22" r="20" stroke-dasharray="125.66" stroke-dashoffset="125.66"></circle></svg><div class="donut-val" id="valStyle">--</div></div> <div class="donut-label">Collab</div> </div> </div> </div> </div> <div class="card-body"> <p class="persona-desc" id="personaDescription">Loading persona data...</p> </div> <div class="stat-strip"> <div class="stat-block"><div class="stat-num" id="cardVibe">--</div><div class="stat-label">Vibe Coder Index</div><div class="stat-minibar"><div class="stat-minibar-fill b" id="cardVibeBar"></div></div></div> <div class="stat-block"><div class="stat-num" id="cardPolite">--</div><div class="stat-label">Politeness</div><div class="stat-minibar"><div class="stat-minibar-fill r" id="cardPoliteBar"></div></div></div> </div> <div class="card-foot"><span>howiprompt.eeshans.com</span><span id="cardSerial">#0000</span></div> </div> </div> </div> </div> </div> </div> <!-- FOOTER --> <footer class="footer"> <span>&copy; 2025 Eeshan Srivastava</span> <span>Personal project &middot; MIT License &middot; Non-commercial</span> <span class="footer-links"> <a href="https://github.com/eeshansrivastava89/howiprompt" target="_blank" id="footerGithubLink">Source</a> <a href="https://www.linkedin.com/in/eeshans/" target="_blank">LinkedIn</a> </span> </footer> </div> <div class="modal-overlay" id="refreshModal" role="dialog" aria-modal="true" aria-labelledby="refreshModalTitle"> <div class="refresh-modal"> <h3 id="refreshModalTitle">Syncing Pipeline</h3> <div class="wizard-progress" id="refreshProgress"><div class="wizard-progress-bar" id="refreshProgressBar"></div></div> <div class="wizard-log" id="refreshLog"></div> <div class="refresh-modal-result" id="refreshModalResult" style="display:none"></div> <button class="refresh-modal-close" id="refreshModalClose" style="display:none">Done</button> </div> </div> <div class="modal-overlay" id="methodologyModal" role="dialog" aria-modal="true" aria-labelledby="methodologyTitle"> <div class="meth-modal"> <div class="meth-progress"><div class="meth-progress-fill" id="methProgressFill"></div></div> <!-- Header --> <div class="meth-header"> <div class="meth-header-left"> <div class="meth-logo">📊</div> <div> <div class="meth-header-title" id="methodologyTitle">The Method</div> <div class="meth-header-sub">How your prompting profile is built</div> </div> </div> <button class="modal-close" onclick="closeMethodology()" aria-label="Close methodology modal"> <svg fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path> </svg> </button> </div> <!-- Snap-scroll container --> <div class="meth-scroll" id="methScroll"> <!-- S1: Intro + Pipeline --> <section class="meth-snap meth-s1" data-meth-section="0"> <div class="meth-s1-inner"> <div class="meth-hero"> <div class="meth-hero-kicker meth-reveal">🔬 Methodology</div> <h1 class="meth-reveal d1">From raw chats to your <em>prompting profile</em></h1> <p class="meth-hero-sub meth-reveal d2">Your prompts never leave your machine. We score them through on-device embeddings and behavioral analysis to build a profile that captures how you prompt.</p> </div> <div class="meth-pipeline-wrap meth-reveal d3"> <div class="meth-rule">The Pipeline</div> <div class="meth-process"> <div class="meth-step"> <div class="meth-step-icon">📥</div> <h3>Collect</h3> <p>Read local histories from Claude Code, Codex, Copilot Chat, Cursor, and LM Studio.</p> </div> <div class="meth-step"> <div class="meth-step-icon">🔍</div> <h3>Filter</h3> <p>Keep human-authored prompts. Remove system messages, tool output, and assistant text.</p> </div> <div class="meth-step"> <div class="meth-step-icon">📐</div> <h3>Score</h3> <p>Embed each prompt with bge-small-en-v1.5 locally. Classify behavioral metrics via cosine similarity.</p> </div> <div class="meth-step"> <div class="meth-step-icon">🧭</div> <h3>Classify</h3> <p>Two axes — Detail Level and Communication Style — place you on a 2×2 grid validated on 21k prompts.</p> </div> </div> </div> <div class="meth-scroll-hint meth-reveal d4"> <span>Scroll</span> <div class="meth-scroll-arrow"></div> </div> </div> </section> <!-- S2: What We Measure --> <section class="meth-snap meth-s2" data-meth-section="1"> <div class="meth-s2-inner"> <div class="meth-s2-header meth-reveal"> <h2>What We Measure</h2> <p>Style scores use on-device embeddings. Persona axes use behavioral patterns validated on 21k prompts from open research datasets (WildChat, OpenAssistant).</p> </div> <div class="meth-taste-grid"> <div class="meth-taste-card meth-reveal d1" style="--tc:#5c3d2e"> <div class="meth-taste-cat">Volume</div> <div class="meth-taste-list"> <div class="meth-taste-item"><span class="meth-taste-name">Prompts</span><span class="meth-taste-note">Total messages</span></div> <div class="meth-taste-item"><span class="meth-taste-name">Conversations</span><span class="meth-taste-note">Distinct threads</span></div> <div class="meth-taste-item"><span class="meth-taste-name">Words</span><span class="meth-taste-note">Total typed</span></div> </div> </div> <div class="meth-taste-card meth-reveal d2" style="--tc:#7b5a42"> <div class="meth-taste-cat">Timing</div> <div class="meth-taste-list"> <div class="meth-taste-item"><span class="meth-taste-name">Peak hour</span><span class="meth-taste-note">Most active time</span></div> <div class="meth-taste-item"><span class="meth-taste-name">Night owl</span><span class="meth-taste-note">11pm–4am share</span></div> <div class="meth-taste-item"><span class="meth-taste-name">Trend</span><span class="meth-taste-note">Volume over time</span></div> </div> </div> <div class="meth-taste-card meth-reveal d3" style="--tc:#a08060"> <div class="meth-taste-cat">Style</div> <div class="meth-taste-list"> <div class="meth-taste-item"><span class="meth-taste-name">Vibe Index</span><span class="meth-taste-note">Vibes vs. specs</span></div> <div class="meth-taste-item"><span class="meth-taste-name">Politeness</span><span class="meth-taste-note">Tone warmth</span></div> </div> </div> <div class="meth-taste-card meth-reveal d4" style="--tc:#c4a882"> <div class="meth-taste-cat">Persona Axes</div> <div class="meth-taste-list"> <div class="meth-taste-item"><span class="meth-taste-name">Detail Level</span><span class="meth-taste-note">Prompt depth</span></div> <div class="meth-taste-item"><span class="meth-taste-name">Comm Style</span><span class="meth-taste-note">How you direct</span></div> </div> </div> </div> </div> </section> <!-- S3: Persona Explorer --> <section class="meth-snap meth-s3" data-meth-section="2"> <div class="meth-s3-inner"> <div class="meth-s3-header meth-reveal"> <h2>The 4 Personas</h2> <p>Two axes form a 2×2 grid. Your quadrant determines which persona fits your prompting pattern.</p> </div> <div class="meth-persona-layout meth-reveal d1"> <div class="meth-persona-list" id="methPersonaList"></div> <div class="meth-pd" id="methPersonaDetail"></div> </div> </div> </section> </div> <!-- Bottom bar --> <div class="meth-bottom"> <span class="meth-bottom-note">🔒 Fully local — no data leaves your machine.</span> <div class="meth-dot-nav" id="methDotNav"> <button class="meth-dot active" data-meth-idx="0"></button> <button class="meth-dot" data-meth-idx="1"></button> <button class="meth-dot" data-meth-idx="2"></button> </div> </div> </div> </div> <script type="module" src="/_astro/MethodologyModal.astro_astro_type_script_index_0_lang.jiHwSrn-.js"></script> <div class="wizard-overlay" id="setupWizard" role="dialog" aria-modal="true" aria-labelledby="wizardTitle"> <div class="wizard-panel"> <h2 id="wizardTitle" class="wizard-title">How I Prompt</h2> <!-- Step indicators --> <div class="wizard-steps"> <div class="wizard-step active" data-step="1"><span class="wizard-step-num">1</span> Detect</div> <div class="wizard-step" data-step="2"><span class="wizard-step-num">2</span> Configure</div> <div class="wizard-step" data-step="3"><span class="wizard-step-num">3</span> Analyze</div> </div> <!-- Step 1: Welcome + Detection --> <div class="wizard-page active" id="wizardStep1"> <p class="wizard-intro">Let's find your AI coding assistant data. Everything stays on your machine.</p> <div id="wizardBackends" class="wizard-backends"> <div class="wizard-loading">Scanning for AI assistants...</div> </div> <button class="wizard-btn wizard-btn-primary" id="wizardNext1">Continue</button> </div> <!-- Step 2: Configure --> <div class="wizard-page" id="wizardStep2"> <p class="wizard-intro">Toggle which backends to include in your analysis.</p> <div id="wizardConfig" class="wizard-config"></div> <div id="wizardExclusions" class="wizard-exclusions" style="display:none"> <label class="wizard-label">Excluded directories</label> <div class="exclusion-chips" id="wizardExclusionChips"></div> <button class="wizard-btn wizard-btn-ghost exclusion-add-btn" id="wizardAddExclusion" type="button"> <svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 4v16m8-8H4"></path></svg>
5
+ </button> <button class="nav-link" type="button" onclick="openMethodology()">The Method</button> <button class="theme-btn" id="themeToggle" aria-label="Toggle theme"> <svg width="16" height="16" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z"></path></svg> </button> <button class="theme-btn" id="settingsBtn" onclick="openSettings()" aria-label="Settings"> <svg width="18" height="18" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.066 2.573c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.573 1.066c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.066-2.573c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"></path><circle cx="12" cy="12" r="3"></circle></svg> </button> </div> </header> <nav class="source-bar" id="sourceBar"></nav> </div> <!-- DASHBOARD --> <div class="dash-panel" id="tab-dashboard"> <div class="dash-container"> <div class="main-grid"> <!-- LEFT 2fr --> <div class="left"> <!-- Stat cards --> <div class="stat-cards animate delay-1"> <div class="stat-card"> <div class="stat-card-label">Prompts</div> <div class="stat-card-value" id="promptsValue">--</div> <div class="stat-card-sub" id="promptsSubtitle">-- words avg</div> </div> <div class="stat-card"> <div class="stat-card-label">Conversations</div> <div class="stat-card-value" id="conversationsValue">--</div> <div class="stat-card-sub" id="conversationsSubtitle">-- turns avg</div> </div> <div class="stat-card"> <div class="stat-card-label">Words Typed</div> <div class="stat-card-value" id="wordsTypedValue">--</div> <div class="stat-card-sub" id="wordsTypedSubtitle">--</div> </div> <div class="stat-card"> <div class="stat-card-label">Night Owl</div> <div class="stat-card-value highlight" id="nightOwlValue">--%</div> <div class="stat-card-sub">prompts 11pm–4am</div> </div> </div> <!-- Trend Chart --> <div class="trend-panel animate delay-2"> <div class="trend-header"> <div class="trend-copy"> <div class="trend-copy-row"> <div class="trend-title">Trends</div> <span class="trend-copy-sep" aria-hidden="true">|</span> <div class="trend-metric-def" id="trendMetricDef">How much you vibe-code. Higher = more intent-driven, less spec-heavy.</div> </div> <div class="trend-legend" id="trendLegend"></div> </div> <div class="metric-tabs" id="metricTabs"> <button class="metric-tab active" data-metric="vibe" data-tooltip="Engineer on the left, vibe coder on the right. Higher means more instinct-led prompting.">Vibe Coder Index</button> <button class="metric-tab" data-metric="polite" data-tooltip="Direct on the left, warm on the right. Higher means a kinder, more collaborative tone.">Politeness</button> <button class="metric-tab" data-metric="activity" data-tooltip="Quiet weeks on the low end, heavy usage on the high end.">Activity</button> </div> </div> <div class="trend-current"> <span class="trend-current-val" id="trendVal">--</span> <span class="trend-current-label" id="trendLabel">--</span> </div> <div class="trend-chart-wrap" id="trendWrap"> <div id="trendChart"></div> </div> </div> <!-- Heatmap --> <div class="heatmap-panel animate delay-3"> <div class="heatmap-title">Activity Heatmap</div> <div class="heatmap" id="heatmapGrid"></div> <div class="heatmap-meta"> <span>Peak Hour: <strong id="peakHourValue">--</strong></span> <span>Peak Day: <strong id="peakDayValue">--</strong></span> </div> </div> </div> <!-- RIGHT 1fr --> <div class="right-col"> <div class="card-dock"> <!-- Player card --> <div class="player-card" id="playerCard"> <div class="card-top" id="cardTop"> <div class="card-top-content"> <div class="persona-name" id="personaName">--</div> <div class="donut-grid"> <div class="donut-item"> <div class="donut-ring"><svg viewBox="0 0 44 44"><circle class="donut-track" cx="22" cy="22" r="20"></circle><circle class="donut-fill" id="donutDetail" cx="22" cy="22" r="20" stroke-dasharray="125.66" stroke-dashoffset="125.66"></circle></svg><div class="donut-val" id="valDetail">--</div></div> <div class="donut-label">Detail</div> </div> <div class="donut-item"> <div class="donut-ring"><svg viewBox="0 0 44 44"><circle class="donut-track" cx="22" cy="22" r="20"></circle><circle class="donut-fill" id="donutStyle" cx="22" cy="22" r="20" stroke-dasharray="125.66" stroke-dashoffset="125.66"></circle></svg><div class="donut-val" id="valStyle">--</div></div> <div class="donut-label">Collab</div> </div> </div> </div> </div> <div class="card-body"> <p class="persona-desc" id="personaDescription">Loading persona data...</p> </div> <div class="stat-strip"> <div class="stat-block"><div class="stat-num" id="cardVibe">--</div><div class="stat-label">Vibe Coder Index</div><div class="stat-minibar"><div class="stat-minibar-fill b" id="cardVibeBar"></div></div></div> <div class="stat-block"><div class="stat-num" id="cardPolite">--</div><div class="stat-label">Politeness</div><div class="stat-minibar"><div class="stat-minibar-fill r" id="cardPoliteBar"></div></div></div> </div> <div class="card-foot"><span>howiprompt.eeshans.com</span><span id="cardSerial">#0000</span></div> </div> </div> </div> </div> </div> </div> <!-- FOOTER --> <footer class="footer"> <span>&copy; 2025 Eeshan Srivastava</span> <span>Personal project &middot; MIT License &middot; Non-commercial</span> <span class="footer-links"> <a href="https://github.com/eeshansrivastava89/howiprompt" target="_blank" id="footerGithubLink">Source</a> <a href="https://www.linkedin.com/in/eeshans/" target="_blank">LinkedIn</a> </span> </footer> </div> <div class="modal-overlay" id="refreshModal" role="dialog" aria-modal="true" aria-labelledby="refreshModalTitle"> <div class="refresh-modal"> <h3 id="refreshModalTitle">Syncing Pipeline</h3> <div class="wizard-progress" id="refreshProgress"><div class="wizard-progress-bar" id="refreshProgressBar"></div></div> <div class="wizard-log" id="refreshLog"></div> <div class="refresh-modal-result" id="refreshModalResult" style="display:none"></div> <button class="refresh-modal-close" id="refreshModalClose" style="display:none">Done</button> </div> </div> <div class="modal-overlay" id="methodologyModal" role="dialog" aria-modal="true" aria-labelledby="methodologyTitle"> <div class="meth-modal"> <div class="meth-progress"><div class="meth-progress-fill" id="methProgressFill"></div></div> <!-- Header --> <div class="meth-header"> <div class="meth-header-left"> <div class="meth-logo">📊</div> <div> <div class="meth-header-title" id="methodologyTitle">The Method</div> <div class="meth-header-sub">How your prompting profile is built</div> </div> </div> <button class="modal-close" onclick="closeMethodology()" aria-label="Close methodology modal"> <svg fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path> </svg> </button> </div> <!-- Snap-scroll container --> <div class="meth-scroll" id="methScroll"> <!-- S1: Intro + Pipeline --> <section class="meth-snap meth-s1" data-meth-section="0"> <div class="meth-s1-inner"> <div class="meth-hero"> <div class="meth-hero-kicker meth-reveal">🔬 Methodology</div> <h1 class="meth-reveal d1">From raw chats to your <em>prompting profile</em></h1> <p class="meth-hero-sub meth-reveal d2">Your prompts never leave your machine. On-device embeddings and behavioral analysis turn them into a profile that captures how you prompt.</p> </div> <div class="meth-pipeline-wrap meth-reveal d3"> <div class="meth-rule">The Pipeline</div> <div class="meth-process"> <div class="meth-step"> <div class="meth-step-icon">📥</div> <h3>Collect</h3> <p>Read local histories from Claude Code, Codex, Copilot Chat, Cursor, and LM Studio.</p> </div> <div class="meth-step"> <div class="meth-step-icon">🔍</div> <h3>Filter</h3> <p>Keep human-authored prompts. Remove system messages, tool output, and assistant text.</p> </div> <div class="meth-step"> <div class="meth-step-icon">📐</div> <h3>Score</h3> <p>Embed each prompt with bge-small-en-v1.5 locally. Classify behavioral metrics via cosine similarity.</p> </div> <div class="meth-step"> <div class="meth-step-icon">🧭</div> <h3>Classify</h3> <p>Two axes — Detail Level and Communication Style — place you on a 2×2 grid validated on 21k prompts.</p> </div> </div> </div> <div class="meth-scroll-hint meth-reveal d4"> <span>Scroll</span> <div class="meth-scroll-arrow"></div> </div> </div> </section> <!-- S2: What Gets Measured --> <section class="meth-snap meth-s2" data-meth-section="1"> <div class="meth-s2-inner"> <div class="meth-s2-header meth-reveal"> <h2>What Gets Measured</h2> <p>Style scores use on-device embeddings. Persona axes use behavioral patterns validated on 21k prompts from open research datasets (WildChat, OpenAssistant).</p> </div> <div class="meth-taste-grid"> <div class="meth-taste-card meth-reveal d1" style="--tc:#5c3d2e"> <div class="meth-taste-cat">Volume</div> <div class="meth-taste-list"> <div class="meth-taste-item"><span class="meth-taste-name">Prompts</span><span class="meth-taste-note">Total messages</span></div> <div class="meth-taste-item"><span class="meth-taste-name">Conversations</span><span class="meth-taste-note">Distinct threads</span></div> <div class="meth-taste-item"><span class="meth-taste-name">Words</span><span class="meth-taste-note">Total typed</span></div> </div> </div> <div class="meth-taste-card meth-reveal d2" style="--tc:#7b5a42"> <div class="meth-taste-cat">Timing</div> <div class="meth-taste-list"> <div class="meth-taste-item"><span class="meth-taste-name">Peak hour</span><span class="meth-taste-note">Most active time</span></div> <div class="meth-taste-item"><span class="meth-taste-name">Night owl</span><span class="meth-taste-note">11pm–4am share</span></div> <div class="meth-taste-item"><span class="meth-taste-name">Trend</span><span class="meth-taste-note">Volume over time</span></div> </div> </div> <div class="meth-taste-card meth-reveal d3" style="--tc:#a08060"> <div class="meth-taste-cat">Style</div> <div class="meth-taste-list"> <div class="meth-taste-item"><span class="meth-taste-name">Vibe Index</span><span class="meth-taste-note">Vibes vs. specs</span></div> <div class="meth-taste-item"><span class="meth-taste-name">Politeness</span><span class="meth-taste-note">Tone warmth</span></div> </div> </div> <div class="meth-taste-card meth-reveal d4" style="--tc:#c4a882"> <div class="meth-taste-cat">Persona Axes</div> <div class="meth-taste-list"> <div class="meth-taste-item"><span class="meth-taste-name">Detail Level</span><span class="meth-taste-note">Prompt depth</span></div> <div class="meth-taste-item"><span class="meth-taste-name">Comm Style</span><span class="meth-taste-note">How you direct</span></div> </div> </div> </div> </div> </section> <!-- S3: Persona Explorer --> <section class="meth-snap meth-s3" data-meth-section="2"> <div class="meth-s3-inner"> <div class="meth-s3-header meth-reveal"> <h2>The 4 Personas</h2> <p>Two axes form a 2×2 grid. Your quadrant determines which persona fits your prompting pattern.</p> </div> <div class="meth-persona-layout meth-reveal d1"> <div class="meth-persona-list" id="methPersonaList"></div> <div class="meth-pd" id="methPersonaDetail"></div> </div> </div> </section> </div> <!-- Bottom bar --> <div class="meth-bottom"> <span class="meth-bottom-note">🔒 Fully local — no data leaves your machine.</span> <div class="meth-dot-nav" id="methDotNav"> <button class="meth-dot active" data-meth-idx="0"></button> <button class="meth-dot" data-meth-idx="1"></button> <button class="meth-dot" data-meth-idx="2"></button> </div> </div> </div> </div> <script type="module" src="/_astro/MethodologyModal.astro_astro_type_script_index_0_lang.jiHwSrn-.js"></script> <div class="modal-overlay" id="createModal" role="dialog" aria-modal="true" aria-labelledby="createTitle"> <div class="create-modal"> <div class="create-header"> <div class="create-header-left"> <div class="create-logo">&lt;/&gt;</div> <div> <div class="create-header-title" id="createTitle">Create Your Own</div> <div class="create-header-sub">Run privately on your machine or publish your own hosted snapshot.</div> </div> </div> <button class="modal-close" onclick="closeCreateModal()" aria-label="Close create your own modal"> <svg fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path> </svg> </button> </div> <div class="create-body"> <section class="create-card"> <div class="create-section-head"> <p class="create-eyebrow">1 command</p> <h3 class="create-rule">Run Fully Local</h3> </div> <p class="create-card-copy">Private, local-first analytics in one command. No hosting, no setup, no extra steps.</p> <div class="command-strip" role="group" aria-label="Run command"> <div class="command-line-wrap"> <div class="command-line"> <span class="command-prompt">$</span> <code>npx @eeshans/howiprompt</code> </div> </div> <div class="command-actions"> <button class="create-copy-btn" type="button" data-copy-text="npx @eeshans/howiprompt" aria-label="Copy npx command"> <svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24"><rect x="9" y="9" width="13" height="13" rx="2" ry="2" stroke-width="2"></rect><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"></path></svg> <span class="create-copy-label">Copy</span> </button> <a class="create-source-link" href="https://github.com/eeshansrivastava89/howiprompt" target="_blank" rel="noreferrer"> <svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><path d="M12 .5C5.65.5.5 5.65.5 12a11.5 11.5 0 008 10.94c.58.1.79-.25.79-.56l-.02-2.15c-3.25.71-3.94-1.56-3.94-1.56-.53-1.35-1.3-1.71-1.3-1.71-1.07-.73.08-.71.08-.71 1.18.08 1.8 1.21 1.8 1.21 1.05 1.8 2.76 1.28 3.43.98.1-.76.41-1.28.74-1.58-2.59-.29-5.31-1.29-5.31-5.75 0-1.27.45-2.31 1.2-3.12-.12-.29-.52-1.46.12-3.04 0 0 .98-.31 3.2 1.19a11.1 11.1 0 015.82 0c2.21-1.5 3.19-1.19 3.19-1.19.64 1.58.24 2.75.12 3.04.75.81 1.2 1.85 1.2 3.12 0 4.47-2.73 5.46-5.33 5.74.42.36.79 1.08.79 2.17l-.01 3.22c0 .31.21.67.8.56A11.5 11.5 0 0023.5 12C23.5 5.65 18.35.5 12 .5z"></path></svg> <span>Source</span> </a> </div> </div> </section> <section class="create-card create-card-muted"> <div class="create-section-head"> <p class="create-eyebrow">3 steps</p> <h3 class="create-rule">Self-Host On GitHub Pages</h3> </div> <p class="create-card-copy">Publish your own persona and stats as a shareable static site in three short steps.</p> <div class="create-steps" aria-label="Self-host on GitHub Pages"> <div class="create-step"> <div class="create-step-head"><span class="create-step-num">1</span><span class="create-step-title">Clone the repo</span></div> <div class="create-step-command"> <code>git clone https://github.com/eeshansrivastava89/howiprompt.git</code> <button class="create-copy-btn create-copy-btn-sm" type="button" data-copy-text="git clone https://github.com/eeshansrivastava89/howiprompt.git" aria-label="Copy clone command"> <svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24"><rect x="9" y="9" width="13" height="13" rx="2" ry="2" stroke-width="2"></rect><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"></path></svg> <span class="create-copy-label">Copy</span> </button> </div> </div> <div class="create-step"> <div class="create-step-head"><span class="create-step-num">2</span><span class="create-step-title">Launch the local app</span></div> <div class="create-step-command"> <code>cd howiprompt &amp;&amp; npm install &amp;&amp; npm run dev:cli</code> <button class="create-copy-btn create-copy-btn-sm" type="button" data-copy-text="cd howiprompt &#38;&#38; npm install &#38;&#38; npm run dev:cli" aria-label="Copy dev CLI command"> <svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24"><rect x="9" y="9" width="13" height="13" rx="2" ry="2" stroke-width="2"></rect><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"></path></svg> <span class="create-copy-label">Copy</span> </button> </div> </div> <div class="create-step"> <div class="create-step-head"><span class="create-step-num">3</span><span class="create-step-title">Build the hosted snapshot</span></div> <div class="create-step-command"> <code>cd howiprompt/frontend &amp;&amp; DEMO_DEPLOY=true npm run build</code> <button class="create-copy-btn create-copy-btn-sm" type="button" data-copy-text="cd howiprompt/frontend &#38;&#38; DEMO_DEPLOY=true npm run build" aria-label="Copy demo build command"> <svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24"><rect x="9" y="9" width="13" height="13" rx="2" ry="2" stroke-width="2"></rect><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"></path></svg> <span class="create-copy-label">Copy</span> </button> </div> </div> </div> <p class="create-hosted-note">Then commit and push `docs/`, and enable GitHub Pages from `main` / `docs`. <a href="https://docs.github.com/en/pages/quickstart" target="_blank" rel="noreferrer">Setup guide</a></p> </section> </div> <div class="create-bottom"> <span class="create-bottom-note">One command for local-only use. One optional path for a public hosted snapshot.</span> </div> </div> </div> <div class="wizard-overlay" id="setupWizard" role="dialog" aria-modal="true" aria-labelledby="wizardTitle"> <div class="wizard-panel"> <h2 id="wizardTitle" class="wizard-title">How I Prompt</h2> <!-- Step indicators --> <div class="wizard-steps"> <div class="wizard-step active" data-step="1"><span class="wizard-step-num">1</span> Detect</div> <div class="wizard-step" data-step="2"><span class="wizard-step-num">2</span> Configure</div> <div class="wizard-step" data-step="3"><span class="wizard-step-num">3</span> Analyze</div> </div> <!-- Step 1: Welcome + Detection --> <div class="wizard-page active" id="wizardStep1"> <p class="wizard-intro">Let's find your AI coding assistant data. Everything stays on your machine.</p> <div id="wizardBackends" class="wizard-backends"> <div class="wizard-loading">Scanning for AI assistants...</div> </div> <button class="wizard-btn wizard-btn-primary" id="wizardNext1">Continue</button> </div> <!-- Step 2: Configure --> <div class="wizard-page" id="wizardStep2"> <p class="wizard-intro">Toggle which backends to include in your analysis.</p> <div id="wizardConfig" class="wizard-config"></div> <div id="wizardExclusions" class="wizard-exclusions" style="display:none"> <label class="wizard-label">Excluded directories</label> <div class="exclusion-chips" id="wizardExclusionChips"></div> <button class="wizard-btn wizard-btn-ghost exclusion-add-btn" id="wizardAddExclusion" type="button"> <svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 4v16m8-8H4"></path></svg>
6
6
  Add Directory
7
7
  </button> <p class="wizard-hint">Claude Code projects in these directories will be skipped.</p> </div> <div class="wizard-nav"> <button class="wizard-btn wizard-btn-ghost" id="wizardBack2">Back</button> <button class="wizard-btn wizard-btn-primary" id="wizardNext2">Run Analysis</button> </div> </div> <!-- Step 3: Pipeline Run (SSE log) --> <div class="wizard-page" id="wizardStep3"> <p class="wizard-intro">Analyzing your prompting patterns...</p> <div class="wizard-progress-meta"> <div class="wizard-progress-label" id="wizardProgressLabel">Preparing analysis...</div> <div class="wizard-progress-pct" id="wizardProgressPct">0%</div> </div> <div class="wizard-progress"> <div class="wizard-progress-bar" id="wizardProgressBar"></div> </div> <div class="wizard-stage-list" id="wizardStageList"></div> <div class="wizard-log" id="wizardLog"></div> <button class="wizard-btn wizard-btn-primary" id="wizardDone" style="display:none">View Dashboard</button> </div> </div> </div> <div class="modal-overlay" id="settingsModal" role="dialog" aria-modal="true" aria-labelledby="settingsTitle"> <div class="settings-modal"> <div class="settings-header"> <h3 id="settingsTitle">Settings</h3> <button class="modal-close" onclick="closeSettings()" aria-label="Close settings"> <svg fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path> </svg> </button> </div> <div class="settings-body"> <div class="settings-section"> <label class="wizard-label">Backends</label> <div id="settingsBackends" class="wizard-config"></div> </div> <div class="settings-section" id="settingsExclusionSection" style="display:none"> <label class="wizard-label">Excluded directories</label> <div class="exclusion-chips" id="settingsExclusionChips"></div> <button class="wizard-btn wizard-btn-ghost exclusion-add-btn" id="settingsAddExclusion" type="button"> <svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 4v16m8-8H4"></path></svg>
8
8
  Add Directory
9
- </button> <p class="wizard-hint">Claude Code projects in these directories will be skipped.</p> </div> </div> <div class="settings-footer"> <button class="wizard-btn wizard-btn-danger" id="settingsReset" type="button">Reset</button> <div class="settings-footer-right"> <button class="wizard-btn wizard-btn-ghost" onclick="closeSettings()">Cancel</button> <button class="wizard-btn wizard-btn-primary" id="settingsSave">Save & Re-analyze</button> </div> </div> </div> </div> <!-- Reset confirm dialog --> <div class="modal-overlay" id="resetConfirmModal" role="dialog" aria-modal="true"> <div class="refresh-modal"> <h3>Reset Setup?</h3> <p style="font-size:14px;color:var(--subtext);margin-bottom:20px;line-height:1.5">This removes the current metrics file and reopens the setup wizard. Cached raw logs and database history stay on disk and will be reused on the next analysis run.</p> <div style="display:flex;gap:8px;justify-content:center"> <button class="wizard-btn wizard-btn-ghost" id="resetCancel">Cancel</button> <button class="wizard-btn wizard-btn-danger" id="resetConfirm">Reset</button> </div> </div> </div> <script type="module" src="/_astro/index.astro_astro_type_script_index_0_lang.CpfYIT7a.js"></script> <script type="module" src="/_astro/index.astro_astro_type_script_index_1_lang.DmQY6kFx.js"></script> </body></html>
9
+ </button> <p class="wizard-hint">Claude Code projects in these directories will be skipped.</p> </div> </div> <div class="settings-footer"> <button class="wizard-btn wizard-btn-danger" id="settingsReset" type="button">Reset</button> <div class="settings-footer-right"> <button class="wizard-btn wizard-btn-ghost" onclick="closeSettings()">Cancel</button> <button class="wizard-btn wizard-btn-primary" id="settingsSave">Save & Re-analyze</button> </div> </div> </div> </div> <!-- Reset confirm dialog --> <div class="modal-overlay" id="resetConfirmModal" role="dialog" aria-modal="true"> <div class="refresh-modal"> <h3>Reset Setup?</h3> <p style="font-size:14px;color:var(--subtext);margin-bottom:20px;line-height:1.5">This removes the current metrics file and reopens the setup wizard. Cached raw logs and database history stay on disk and will be reused on the next analysis run.</p> <div style="display:flex;gap:8px;justify-content:center"> <button class="wizard-btn wizard-btn-ghost" id="resetCancel">Cancel</button> <button class="wizard-btn wizard-btn-danger" id="resetConfirm">Reset</button> </div> </div> </div> <script type="module" src="/_astro/index.astro_astro_type_script_index_0_lang.CpfYIT7a.js"></script> <script type="module" src="/_astro/index.astro_astro_type_script_index_1_lang.D0DdrdXM.js"></script> </body></html>
@@ -1,9 +1,9 @@
1
- <!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests"><script>if(location.protocol === 'http:' && location.hostname !== 'localhost' && location.hostname !== '127.0.0.1') location.replace('https:' + location.href.substring(location.protocol.length));</script><title>How I Prompt: Wrapped</title><link rel="icon" type="image/svg+xml" href="/favicon.svg"><!-- Open Graph --><meta property="og:title" content="How I Prompt: Wrapped"><meta property="og:description" content="A year in AI conversations."><meta property="og:type" content="website"><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=DM+Sans:opsz,wght@9..40,400;9..40,500;9..40,600;9..40,700;9..40,800&family=Fraunces:ital,opsz,wght@0,9..144,400;0,9..144,600;0,9..144,700;0,9..144,800;1,9..144,400;1,9..144,600&family=JetBrains+Mono:wght@400;600;700&display=swap" rel="stylesheet"><link rel="stylesheet" href="/_astro/wrapped.CpzRcLjf.css"></head> <body class="bg-bg text-text font-sans antialiased transition-colors duration-300"> <div class="top-nav" id="topNav"> <header class="header"> <div class="header-left"> <h1>How I <span>Prompt</span> <span class="header-subtitle">| Wrapped</span></h1> <span class="date-range" id="dateRange">--</span> </div> <div class="header-right"> <a href="/" class="accent-link dashboard-link"> <svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2V6zM14 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2V6zM4 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2v-2zM14 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2v-2z"></path></svg>
1
+ <!DOCTYPE html><html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests"><script>if(location.protocol === 'http:' && location.hostname !== 'localhost' && location.hostname !== '127.0.0.1') location.replace('https:' + location.href.substring(location.protocol.length));</script><title>How I Prompt: Wrapped</title><link rel="icon" type="image/svg+xml" href="/favicon.svg"><!-- Open Graph --><meta property="og:title" content="How I Prompt: Wrapped"><meta property="og:description" content="A year in AI conversations."><meta property="og:type" content="website"><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=DM+Sans:opsz,wght@9..40,400;9..40,500;9..40,600;9..40,700;9..40,800&family=Fraunces:ital,opsz,wght@0,9..144,400;0,9..144,600;0,9..144,700;0,9..144,800;1,9..144,400;1,9..144,600&family=JetBrains+Mono:wght@400;600;700&display=swap" rel="stylesheet"><link rel="stylesheet" href="/_astro/wrapped.CS5tu281.css"></head> <body class="bg-bg text-text font-sans antialiased transition-colors duration-300"> <div class="top-nav" id="topNav"> <header class="header"> <div class="header-left"> <h1>How I <span>Prompt</span> <span class="header-subtitle">| Wrapped</span></h1> <span class="date-range" id="dateRange">--</span> </div> <div class="header-right"> <a href="/" class="accent-link dashboard-link"> <svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2V6zM14 6a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2V6zM4 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2H6a2 2 0 01-2-2v-2zM14 16a2 2 0 012-2h2a2 2 0 012 2v2a2 2 0 01-2 2h-2a2 2 0 01-2-2v-2z"></path></svg>
2
2
  Dashboard
3
- </a> <div class="create-dropdown" id="createDropdown"> <button class="create-btn" id="createToggle" type="button" aria-expanded="false" aria-controls="createMenu"> <svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 9l-3 3 3 3m8-6l3 3-3 3M14 4l-4 16"></path></svg>
3
+ </a> <button class="create-btn" id="createToggle" type="button" onclick="openCreateModal()" aria-label="Open create your own modal"> <svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M8 9l-3 3 3 3m8-6l3 3-3 3M14 4l-4 16"></path></svg>
4
4
  Create Your Own
5
- </button> <div class="create-menu" id="createMenu" hidden> <div class="create-menu-copy"> <p class="create-kicker">Run locally on your own AI chats</p> <p class="create-subcopy">Private, local-first analytics in one command.</p> </div> <div class="command-strip" role="group" aria-label="Run command"> <div class="command-line-wrap"> <div class="command-line"> <span class="command-prompt">$</span> <code id="createCommand">npx @eeshans/howiprompt</code> </div> </div> <div class="command-actions"> <button class="create-copy-btn" id="createCopyBtn" type="button" data-copy-text="npx @eeshans/howiprompt" aria-label="Copy command"> <svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24"><rect x="9" y="9" width="13" height="13" rx="2" ry="2" stroke-width="2"></rect><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"></path></svg> <span class="create-copy-label">Copy</span> </button> <a class="create-source-link" href="https://github.com/eeshansrivastava89/howiprompt" target="_blank" rel="noreferrer"> <svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><path d="M12 .5C5.65.5.5 5.65.5 12a11.5 11.5 0 008 10.94c.58.1.79-.25.79-.56l-.02-2.15c-3.25.71-3.94-1.56-3.94-1.56-.53-1.35-1.3-1.71-1.3-1.71-1.07-.73.08-.71.08-.71 1.18.08 1.8 1.21 1.8 1.21 1.05 1.8 2.76 1.28 3.43.98.1-.76.41-1.28.74-1.58-2.59-.29-5.31-1.29-5.31-5.75 0-1.27.45-2.31 1.2-3.12-.12-.29-.52-1.46.12-3.04 0 0 .98-.31 3.2 1.19a11.1 11.1 0 015.82 0c2.21-1.5 3.19-1.19 3.19-1.19.64 1.58.24 2.75.12 3.04.75.81 1.2 1.85 1.2 3.12 0 4.47-2.73 5.46-5.33 5.74.42.36.79 1.08.79 2.17l-.01 3.22c0 .31.21.67.8.56A11.5 11.5 0 0023.5 12C23.5 5.65 18.35.5 12 .5z"></path></svg> <span>Source</span> </a> </div> </div> </div> </div> <button class="nav-link" type="button" onclick="openMethodology()">The Method</button> <button class="theme-btn" id="themeToggle" aria-label="Toggle theme"> <svg width="16" height="16" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z"></path></svg> </button> <button class="theme-btn" id="settingsBtn" onclick="openSettings()" aria-label="Settings"> <svg width="18" height="18" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.066 2.573c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.573 1.066c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.066-2.573c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"></path><circle cx="12" cy="12" r="3"></circle></svg> </button> </div> </header> <nav class="source-bar" id="sourceBar"></nav> </div> <section class="min-h-screen flex flex-col items-center justify-center px-6 relative pt-14"> <div class="text-center max-w-3xl"> <p class="font-serif text-3xl md:text-5xl italic text-text/90 animate-fade-in">"You're absolutely right."</p> <p class="text-muted/40 text-xs mt-2 animate-fade-in delay-1">and other agreement phrases</p> <p class="text-muted text-lg mt-6 animate-fade-in delay-1">— <span id="yrAttribution">the AI</span>, <span class="stat-accent font-semibold" id="yrCount">--</span> times</p> <p class="text-muted/60 text-sm mt-2 animate-fade-in delay-1">That's <span class="text-text/80" id="yrPerConvo">--</span> per conversation</p> <div class="mt-16 animate-fade-in delay-2"> <p class="text-muted text-sm uppercase tracking-widest mb-2" id="dateRangeDisplay">--</p> <h1 class="text-4xl md:text-6xl font-bold">How I <span class="gradient-text">Prompt</span></h1> </div> </div> <div class="absolute bottom-12"> <p class="text-muted text-sm mb-2">Scroll</p> <svg class="w-5 h-5 mx-auto text-muted scroll-hint" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M19 14l-7 7m0 0l-7-7m7 7V3"></path> </svg> </div> </section> <section class="min-h-screen flex items-center justify-center px-6 py-20"> <div class="max-w-3xl w-full"> <p class="text-muted text-sm uppercase tracking-widest mb-8 text-center">The Numbers</p> <div class="text-center mb-12"> <div class="text-7xl md:text-8xl font-bold gradient-text counter" id="mainCounter" data-target="0">--</div> <p class="text-2xl text-text/80 mt-2">prompts sent</p> </div> <div class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-5 gap-3"> <div class="card p-4 text-center"> <p class="text-2xl font-bold font-mono text-text" id="totalConversations">--</p> <p class="text-muted text-xs mt-1">conversations</p> </div> <div class="card p-4 text-center"> <p class="text-2xl font-bold font-mono text-text" id="totalWordsK">--</p> <p class="text-muted text-xs mt-1">words typed</p> </div> <div class="card p-4 text-center"> <p class="text-2xl font-bold font-mono text-text" id="avgTurns">--</p> <p class="text-muted text-xs mt-1">avg turns</p> </div> <div class="card p-4 text-center"> <p class="text-2xl font-bold font-mono text-text" id="maxTurns">--</p> <p class="text-muted text-xs mt-1">longest session</p> </div> <div class="card p-4 text-center"> <p class="text-2xl font-bold font-mono text-text" id="deepDives">--</p> <p class="text-muted text-xs mt-1">deep dives</p> </div> </div> </div> </section> <section class="min-h-screen flex items-center justify-center px-4 sm:px-6 py-8 sm:py-20"> <div class="max-w-4xl w-full"> <p class="text-muted text-sm uppercase tracking-widest mb-4 sm:mb-8 text-center">When You Prompt</p> <div class="card p-3 sm:p-4 md:p-8 mb-4 sm:mb-8 overflow-x-auto"> <p class="text-sm text-muted mb-6">Activity by Hour × Day</p> <div class="w-full"> <div class="hidden sm:flex mb-2 ml-12"> <div class="flex-1 grid grid-cols-24 gap-[2px]"> <span class="text-[10px] text-muted text-center">0</span> <span class="text-[10px] text-muted text-center"></span> <span class="text-[10px] text-muted text-center"></span> <span class="text-[10px] text-muted text-center">3</span> <span class="text-[10px] text-muted text-center"></span> <span class="text-[10px] text-muted text-center"></span> <span class="text-[10px] text-muted text-center">6</span> <span class="text-[10px] text-muted text-center"></span> <span class="text-[10px] text-muted text-center"></span> <span class="text-[10px] text-muted text-center">9</span> <span class="text-[10px] text-muted text-center"></span> <span class="text-[10px] text-muted text-center"></span> <span class="text-[10px] text-muted text-center">12</span> <span class="text-[10px] text-muted text-center"></span> <span class="text-[10px] text-muted text-center"></span> <span class="text-[10px] text-muted text-center">15</span> <span class="text-[10px] text-muted text-center"></span> <span class="text-[10px] text-muted text-center"></span> <span class="text-[10px] text-muted text-center">18</span> <span class="text-[10px] text-muted text-center"></span> <span class="text-[10px] text-muted text-center"></span> <span class="text-[10px] text-muted text-center">21</span> <span class="text-[10px] text-muted text-center"></span> <span class="text-[10px] text-muted text-center"></span> </div> </div> <div id="heatmap" class="space-y-[2px]"></div> </div> </div> <div class="grid grid-cols-3 gap-2 sm:gap-4"> <div class="card p-3 sm:p-6 text-center overflow-hidden"> <p class="text-xl sm:text-4xl font-bold font-mono stat-accent" id="peakHour">--</p> <p class="text-muted text-xs sm:text-sm mt-1">Peak hour</p> <p class="text-muted text-[10px] sm:text-xs" id="peakHourCount">-- prompts</p> </div> <div class="card p-3 sm:p-6 text-center overflow-hidden"> <p class="text-xl sm:text-4xl font-bold font-mono text-text" id="nightOwlPct">--%</p> <p class="text-muted text-xs sm:text-sm mt-1">Night Owl</p> <p class="text-muted text-[10px] sm:text-xs">11pm – 4am</p> </div> <div class="card p-3 sm:p-6 text-center overflow-hidden"> <p class="text-xl sm:text-4xl font-bold font-mono text-text truncate" id="peakDay">--</p> <p class="text-muted text-xs sm:text-sm mt-1">Peak day</p> <p class="text-muted text-[10px] sm:text-xs" id="peakDayCount">-- prompts</p> </div> </div> </div> </section> <section class="min-h-screen flex items-center justify-center px-4 sm:px-6 py-8 sm:py-20"> <div class="max-w-3xl w-full"> <p class="text-muted text-sm uppercase tracking-widest mb-4 text-center">Your Style</p> <h2 class="text-3xl sm:text-5xl font-bold text-center mb-2" id="styleHeadline">--</h2> <p class="text-muted text-base sm:text-lg text-center max-w-lg mx-auto mb-10" id="styleSubline">Loading your style profile...</p> <div class="grid md:grid-cols-2 gap-4 sm:gap-6"> <!-- Vibe Coder Index Spectrum --> <div class="card p-6 text-center"> <p class="text-muted text-xs uppercase tracking-wider mb-4 font-semibold">Vibe Coder Index</p> <p class="text-4xl font-mono font-bold mb-1" id="wrappedVibeValue">--</p> <p class="text-muted text-sm mb-6" id="wrappedVibeLabel">Loading...</p> <div class="relative h-2 rounded-full mx-2" style="background: linear-gradient(to right, #a78bfa, var(--border) 50%, var(--accent));"> <div class="absolute top-1/2 w-4 h-4 rounded-full border-2 shadow-md" style="background:var(--accent);border-color:var(--bg);transform: translate(-50%, -50%); left: 50%; transition: left 0.8s ease;" id="wrappedVibeMarker"></div> </div> <div class="flex justify-between text-muted text-xs mt-2 mx-2"> <span>Engineer</span><span>Vibe Coder</span> </div> </div> <!-- Politeness Gauge --> <div class="card p-6 text-center"> <p class="text-muted text-xs uppercase tracking-wider mb-4 font-semibold">Politeness</p> <div class="arc-gauge"> <svg viewBox="0 0 120 120"> <circle fill="none" stroke="var(--border)" stroke-width="8" opacity="0.3" cx="60" cy="60" r="52"></circle> <circle fill="none" stroke="var(--accent)" stroke-width="8" stroke-linecap="round" id="wrappedPoliteArc" cx="60" cy="60" r="52" stroke-dasharray="326.73" stroke-dashoffset="326.73" transform="rotate(-90 60 60)"></circle> </svg> <div class="arc-gauge-inner"> <p class="text-3xl font-mono font-bold" id="wrappedPoliteValue">--</p> <p class="text-muted text-xs" id="wrappedPoliteLabel">Loading...</p> </div> </div> <p class="text-muted text-xs mt-3">Tone warmth &amp; collaboration</p> </div> </div> </div> </section> <section class="wrapped-persona-section min-h-screen flex items-center justify-center px-6 py-20"> <div class="max-w-lg w-full"> <p class="text-muted text-sm uppercase tracking-widest mb-6 text-center">Your Persona</p> <div class="card overflow-hidden"> <img class="wrapped-card-top" id="wrappedCardTop" src="/images/char_architect.png" alt="Persona character art"> <div class="wrapped-persona-body text-center"> <h2 class="text-2xl sm:text-3xl font-bold gradient-text mb-3" id="personaName">--</h2> <p class="text-muted text-sm sm:text-base max-w-md mx-auto mb-6" id="personaDesc">Loading...</p> <div class="flex flex-wrap justify-center gap-2 mb-6" id="personaTraits"></div> <div class="grid grid-cols-2 gap-4"> <div class="flex flex-col items-center gap-2"> <div class="donut-ring"> <svg viewBox="0 0 44 44"><circle fill="none" stroke="var(--border)" stroke-width="5" cx="22" cy="22" r="20"></circle><circle fill="none" stroke="#4CAF50" stroke-width="5" stroke-linecap="round" id="wDonutDetail" cx="22" cy="22" r="20" stroke-dasharray="125.66" stroke-dashoffset="125.66"></circle></svg> <div class="donut-val" id="wValDetail">--</div> </div> <span class="text-xs text-muted font-medium">Detail Level</span> </div> <div class="flex flex-col items-center gap-2"> <div class="donut-ring"> <svg viewBox="0 0 44 44"><circle fill="none" stroke="var(--border)" stroke-width="5" cx="22" cy="22" r="20"></circle><circle fill="none" stroke="#7B1FA2" stroke-width="5" stroke-linecap="round" id="wDonutStyle" cx="22" cy="22" r="20" stroke-dasharray="125.66" stroke-dashoffset="125.66"></circle></svg> <div class="donut-val" id="wValStyle">--</div> </div> <span class="text-xs text-muted font-medium">Comm Style</span> </div> </div> </div> </div> </div> </section> <section class="wrapped-receipt-section min-h-screen flex items-center justify-center px-6 py-20"> <div class="max-w-lg w-full"> <p class="text-muted text-sm uppercase tracking-widest mb-6 text-center">The Receipt</p> <div class="card receipt-card font-mono text-sm" id="terminalCard" style="background:var(--surface)"> <p class="text-xs text-muted mb-4 text-center" id="termDateRange">-- SUMMARY</p> <div class="border-b border-border mb-4 pb-4 space-y-1"> <div class="flex justify-between"><span class="text-muted">Prompts</span><span class="font-bold" id="termPrompts">--</span></div> <div class="flex justify-between"><span class="text-muted">Conversations</span><span class="font-bold" id="termConversations">--</span></div> <div class="flex justify-between"><span class="text-muted">Words Typed</span><span class="font-bold" id="termWordsK">--</span></div> <div class="flex justify-between"><span class="text-muted">Avg Turns</span><span class="font-bold" id="termAvgTurns">--</span></div> <div class="flex justify-between"><span class="text-muted">Longest Session</span><span class="font-bold" id="termMaxTurns">--</span></div> <div class="flex justify-between"><span class="text-muted">Deep Dives</span><span class="font-bold" id="termDeepDives">--</span></div> </div> <div class="border-b border-border mb-4 pb-4 space-y-1"> <div class="flex justify-between"><span class="text-muted">Peak Hour</span><span class="font-bold" id="termPeakHour">--</span></div> <div class="flex justify-between"><span class="text-muted">Peak Day</span><span class="font-bold" id="termPeakDay">--</span></div> <div class="flex justify-between"><span class="text-muted">Night Owl</span><span class="font-bold" id="termNightOwl">--</span></div> </div> <div class="border-b border-border mb-4 pb-4 space-y-1"> <div class="flex justify-between"><span class="text-muted">Vibe Coder Index</span><span class="font-bold stat-accent" id="termVibe">--</span></div> <div class="flex justify-between"><span class="text-muted">Politeness</span><span class="font-bold" id="termPolite">--</span></div> </div> <div class="border-b border-border mb-4 pb-4 space-y-1" id="termPlatformSection"></div> <div class="space-y-1"> <div class="flex justify-between"><span class="text-muted">"You're right"</span><span class="font-bold" id="termYrCount">--</span></div> </div> <div class="mt-6 pt-4 border-t border-border text-center"> <p class="font-bold stat-accent" id="termPersonaName">PERSONA: --</p> <p class="text-muted text-xs mt-1" id="termPersonaTraits">--</p> </div> <p class="text-center text-xs text-muted mt-4">howiprompt.eeshans.com</p> </div> </div> </section> <footer class="py-8 text-center text-xs text-muted border-t border-border"> <p>&copy; 2025 Eeshan Srivastava &middot; MIT License &middot; Non-commercial</p> <p class="mt-2"> <a href="https://github.com/eeshansrivastava89/howiprompt" target="_blank" class="text-muted hover:text-text transition-colors build-your-own-link">Source</a>
5
+ </button> <button class="nav-link" type="button" onclick="openMethodology()">The Method</button> <button class="theme-btn" id="themeToggle" aria-label="Toggle theme"> <svg width="16" height="16" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M20.354 15.354A9 9 0 018.646 3.646 9.003 9.003 0 0012 21a9.003 9.003 0 008.354-5.646z"></path></svg> </button> <button class="theme-btn" id="settingsBtn" onclick="openSettings()" aria-label="Settings"> <svg width="18" height="18" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.066 2.573c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.573 1.066c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.066-2.573c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z"></path><circle cx="12" cy="12" r="3"></circle></svg> </button> </div> </header> <nav class="source-bar" id="sourceBar"></nav> </div> <section class="min-h-screen flex flex-col items-center justify-center px-6 relative pt-14"> <div class="text-center max-w-3xl"> <p class="font-serif text-3xl md:text-5xl italic text-text/90 animate-fade-in">"You're absolutely right."</p> <p class="text-muted/40 text-xs mt-2 animate-fade-in delay-1">and other agreement phrases</p> <p class="text-muted text-lg mt-6 animate-fade-in delay-1">— <span id="yrAttribution">the AI</span>, <span class="stat-accent font-semibold" id="yrCount">--</span> times</p> <p class="text-muted/60 text-sm mt-2 animate-fade-in delay-1">That's <span class="text-text/80" id="yrPerConvo">--</span> per conversation</p> <div class="mt-16 animate-fade-in delay-2"> <p class="text-muted text-sm uppercase tracking-widest mb-2" id="dateRangeDisplay">--</p> <h1 class="text-4xl md:text-6xl font-bold">How I <span class="gradient-text">Prompt</span></h1> </div> </div> <div class="absolute bottom-12"> <p class="text-muted text-sm mb-2">Scroll</p> <svg class="w-5 h-5 mx-auto text-muted scroll-hint" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M19 14l-7 7m0 0l-7-7m7 7V3"></path> </svg> </div> </section> <section class="min-h-screen flex items-center justify-center px-6 py-20"> <div class="max-w-3xl w-full"> <p class="text-muted text-sm uppercase tracking-widest mb-8 text-center">The Numbers</p> <div class="text-center mb-12"> <div class="text-7xl md:text-8xl font-bold gradient-text counter" id="mainCounter" data-target="0">--</div> <p class="text-2xl text-text/80 mt-2">prompts sent</p> </div> <div class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-5 gap-3"> <div class="card p-4 text-center"> <p class="text-2xl font-bold font-mono text-text" id="totalConversations">--</p> <p class="text-muted text-xs mt-1">conversations</p> </div> <div class="card p-4 text-center"> <p class="text-2xl font-bold font-mono text-text" id="totalWordsK">--</p> <p class="text-muted text-xs mt-1">words typed</p> </div> <div class="card p-4 text-center"> <p class="text-2xl font-bold font-mono text-text" id="avgTurns">--</p> <p class="text-muted text-xs mt-1">avg turns</p> </div> <div class="card p-4 text-center"> <p class="text-2xl font-bold font-mono text-text" id="maxTurns">--</p> <p class="text-muted text-xs mt-1">longest session</p> </div> <div class="card p-4 text-center"> <p class="text-2xl font-bold font-mono text-text" id="deepDives">--</p> <p class="text-muted text-xs mt-1">deep dives</p> </div> </div> </div> </section> <section class="min-h-screen flex items-center justify-center px-4 sm:px-6 py-8 sm:py-20"> <div class="max-w-4xl w-full"> <p class="text-muted text-sm uppercase tracking-widest mb-4 sm:mb-8 text-center">When You Prompt</p> <div class="card p-3 sm:p-4 md:p-8 mb-4 sm:mb-8 overflow-x-auto"> <p class="text-sm text-muted mb-6">Activity by Hour × Day</p> <div class="w-full"> <div class="hidden sm:flex mb-2 ml-12"> <div class="flex-1 grid grid-cols-24 gap-[2px]"> <span class="text-[10px] text-muted text-center">0</span> <span class="text-[10px] text-muted text-center"></span> <span class="text-[10px] text-muted text-center"></span> <span class="text-[10px] text-muted text-center">3</span> <span class="text-[10px] text-muted text-center"></span> <span class="text-[10px] text-muted text-center"></span> <span class="text-[10px] text-muted text-center">6</span> <span class="text-[10px] text-muted text-center"></span> <span class="text-[10px] text-muted text-center"></span> <span class="text-[10px] text-muted text-center">9</span> <span class="text-[10px] text-muted text-center"></span> <span class="text-[10px] text-muted text-center"></span> <span class="text-[10px] text-muted text-center">12</span> <span class="text-[10px] text-muted text-center"></span> <span class="text-[10px] text-muted text-center"></span> <span class="text-[10px] text-muted text-center">15</span> <span class="text-[10px] text-muted text-center"></span> <span class="text-[10px] text-muted text-center"></span> <span class="text-[10px] text-muted text-center">18</span> <span class="text-[10px] text-muted text-center"></span> <span class="text-[10px] text-muted text-center"></span> <span class="text-[10px] text-muted text-center">21</span> <span class="text-[10px] text-muted text-center"></span> <span class="text-[10px] text-muted text-center"></span> </div> </div> <div id="heatmap" class="space-y-[2px]"></div> </div> </div> <div class="grid grid-cols-3 gap-2 sm:gap-4"> <div class="card p-3 sm:p-6 text-center overflow-hidden"> <p class="text-xl sm:text-4xl font-bold font-mono stat-accent" id="peakHour">--</p> <p class="text-muted text-xs sm:text-sm mt-1">Peak hour</p> <p class="text-muted text-[10px] sm:text-xs" id="peakHourCount">-- prompts</p> </div> <div class="card p-3 sm:p-6 text-center overflow-hidden"> <p class="text-xl sm:text-4xl font-bold font-mono text-text" id="nightOwlPct">--%</p> <p class="text-muted text-xs sm:text-sm mt-1">Night Owl</p> <p class="text-muted text-[10px] sm:text-xs">11pm – 4am</p> </div> <div class="card p-3 sm:p-6 text-center overflow-hidden"> <p class="text-xl sm:text-4xl font-bold font-mono text-text truncate" id="peakDay">--</p> <p class="text-muted text-xs sm:text-sm mt-1">Peak day</p> <p class="text-muted text-[10px] sm:text-xs" id="peakDayCount">-- prompts</p> </div> </div> </div> </section> <section class="min-h-screen flex items-center justify-center px-4 sm:px-6 py-8 sm:py-20"> <div class="max-w-3xl w-full"> <p class="text-muted text-sm uppercase tracking-widest mb-4 text-center">Your Style</p> <h2 class="text-3xl sm:text-5xl font-bold text-center mb-2" id="styleHeadline">--</h2> <p class="text-muted text-base sm:text-lg text-center max-w-lg mx-auto mb-10" id="styleSubline">Loading your style profile...</p> <div class="grid md:grid-cols-2 gap-4 sm:gap-6"> <!-- Vibe Coder Index Spectrum --> <div class="card p-6 text-center"> <p class="text-muted text-xs uppercase tracking-wider mb-4 font-semibold">Vibe Coder Index</p> <p class="text-4xl font-mono font-bold mb-1" id="wrappedVibeValue">--</p> <p class="text-muted text-sm mb-6" id="wrappedVibeLabel">Loading...</p> <div class="relative h-2 rounded-full mx-2" style="background: linear-gradient(to right, #a78bfa, var(--border) 50%, var(--accent));"> <div class="absolute top-1/2 w-4 h-4 rounded-full border-2 shadow-md" style="background:var(--accent);border-color:var(--bg);transform: translate(-50%, -50%); left: 50%; transition: left 0.8s ease;" id="wrappedVibeMarker"></div> </div> <div class="flex justify-between text-muted text-xs mt-2 mx-2"> <span>Engineer</span><span>Vibe Coder</span> </div> </div> <!-- Politeness Gauge --> <div class="card p-6 text-center"> <p class="text-muted text-xs uppercase tracking-wider mb-4 font-semibold">Politeness</p> <div class="arc-gauge"> <svg viewBox="0 0 120 120"> <circle fill="none" stroke="var(--border)" stroke-width="8" opacity="0.3" cx="60" cy="60" r="52"></circle> <circle fill="none" stroke="var(--accent)" stroke-width="8" stroke-linecap="round" id="wrappedPoliteArc" cx="60" cy="60" r="52" stroke-dasharray="326.73" stroke-dashoffset="326.73" transform="rotate(-90 60 60)"></circle> </svg> <div class="arc-gauge-inner"> <p class="text-3xl font-mono font-bold" id="wrappedPoliteValue">--</p> <p class="text-muted text-xs" id="wrappedPoliteLabel">Loading...</p> </div> </div> <p class="text-muted text-xs mt-3">Tone warmth &amp; collaboration</p> </div> </div> </div> </section> <section class="wrapped-persona-section min-h-screen flex items-center justify-center px-6 py-20"> <div class="max-w-lg w-full"> <p class="text-muted text-sm uppercase tracking-widest mb-6 text-center">Your Persona</p> <div class="card overflow-hidden"> <img class="wrapped-card-top" id="wrappedCardTop" src="/images/char_architect.png" alt="Persona character art"> <div class="wrapped-persona-body text-center"> <h2 class="text-2xl sm:text-3xl font-bold gradient-text mb-3" id="personaName">--</h2> <p class="text-muted text-sm sm:text-base max-w-md mx-auto mb-6" id="personaDesc">Loading...</p> <div class="flex flex-wrap justify-center gap-2 mb-6" id="personaTraits"></div> <div class="grid grid-cols-2 gap-4"> <div class="flex flex-col items-center gap-2"> <div class="donut-ring"> <svg viewBox="0 0 44 44"><circle fill="none" stroke="var(--border)" stroke-width="5" cx="22" cy="22" r="20"></circle><circle fill="none" stroke="#4CAF50" stroke-width="5" stroke-linecap="round" id="wDonutDetail" cx="22" cy="22" r="20" stroke-dasharray="125.66" stroke-dashoffset="125.66"></circle></svg> <div class="donut-val" id="wValDetail">--</div> </div> <span class="text-xs text-muted font-medium">Detail Level</span> </div> <div class="flex flex-col items-center gap-2"> <div class="donut-ring"> <svg viewBox="0 0 44 44"><circle fill="none" stroke="var(--border)" stroke-width="5" cx="22" cy="22" r="20"></circle><circle fill="none" stroke="#7B1FA2" stroke-width="5" stroke-linecap="round" id="wDonutStyle" cx="22" cy="22" r="20" stroke-dasharray="125.66" stroke-dashoffset="125.66"></circle></svg> <div class="donut-val" id="wValStyle">--</div> </div> <span class="text-xs text-muted font-medium">Comm Style</span> </div> </div> </div> </div> </div> </section> <section class="wrapped-receipt-section min-h-screen flex items-center justify-center px-6 py-20"> <div class="max-w-lg w-full"> <p class="text-muted text-sm uppercase tracking-widest mb-6 text-center">The Receipt</p> <div class="card receipt-card font-mono text-sm" id="terminalCard" style="background:var(--surface)"> <p class="text-xs text-muted mb-4 text-center" id="termDateRange">-- SUMMARY</p> <div class="border-b border-border mb-4 pb-4 space-y-1"> <div class="flex justify-between"><span class="text-muted">Prompts</span><span class="font-bold" id="termPrompts">--</span></div> <div class="flex justify-between"><span class="text-muted">Conversations</span><span class="font-bold" id="termConversations">--</span></div> <div class="flex justify-between"><span class="text-muted">Words Typed</span><span class="font-bold" id="termWordsK">--</span></div> <div class="flex justify-between"><span class="text-muted">Avg Turns</span><span class="font-bold" id="termAvgTurns">--</span></div> <div class="flex justify-between"><span class="text-muted">Longest Session</span><span class="font-bold" id="termMaxTurns">--</span></div> <div class="flex justify-between"><span class="text-muted">Deep Dives</span><span class="font-bold" id="termDeepDives">--</span></div> </div> <div class="border-b border-border mb-4 pb-4 space-y-1"> <div class="flex justify-between"><span class="text-muted">Peak Hour</span><span class="font-bold" id="termPeakHour">--</span></div> <div class="flex justify-between"><span class="text-muted">Peak Day</span><span class="font-bold" id="termPeakDay">--</span></div> <div class="flex justify-between"><span class="text-muted">Night Owl</span><span class="font-bold" id="termNightOwl">--</span></div> </div> <div class="border-b border-border mb-4 pb-4 space-y-1"> <div class="flex justify-between"><span class="text-muted">Vibe Coder Index</span><span class="font-bold stat-accent" id="termVibe">--</span></div> <div class="flex justify-between"><span class="text-muted">Politeness</span><span class="font-bold" id="termPolite">--</span></div> </div> <div class="border-b border-border mb-4 pb-4 space-y-1" id="termPlatformSection"></div> <div class="space-y-1"> <div class="flex justify-between"><span class="text-muted">"You're right"</span><span class="font-bold" id="termYrCount">--</span></div> </div> <div class="mt-6 pt-4 border-t border-border text-center"> <p class="font-bold stat-accent" id="termPersonaName">PERSONA: --</p> <p class="text-muted text-xs mt-1" id="termPersonaTraits">--</p> </div> <p class="text-center text-xs text-muted mt-4">howiprompt.eeshans.com</p> </div> </div> </section> <footer class="py-8 text-center text-xs text-muted border-t border-border"> <p>&copy; 2025 Eeshan Srivastava &middot; MIT License &middot; Non-commercial</p> <p class="mt-2"> <a href="https://github.com/eeshansrivastava89/howiprompt" target="_blank" class="text-muted hover:text-text transition-colors build-your-own-link">Source</a>
6
6
  &middot;
7
- <a href="https://www.linkedin.com/in/eeshans/" target="_blank" class="text-muted hover:text-text transition-colors">LinkedIn</a> </p> </footer> <div class="modal-overlay" id="refreshModal" role="dialog" aria-modal="true" aria-labelledby="refreshModalTitle"> <div class="refresh-modal"> <h3 id="refreshModalTitle">Syncing Pipeline</h3> <div class="wizard-progress" id="refreshProgress"><div class="wizard-progress-bar" id="refreshProgressBar"></div></div> <div class="wizard-log" id="refreshLog"></div> <div class="refresh-modal-result" id="refreshModalResult" style="display:none"></div> <button class="refresh-modal-close" id="refreshModalClose" style="display:none">Done</button> </div> </div> <div class="modal-overlay" id="methodologyModal" role="dialog" aria-modal="true" aria-labelledby="methodologyTitle"> <div class="meth-modal"> <div class="meth-progress"><div class="meth-progress-fill" id="methProgressFill"></div></div> <!-- Header --> <div class="meth-header"> <div class="meth-header-left"> <div class="meth-logo">📊</div> <div> <div class="meth-header-title" id="methodologyTitle">The Method</div> <div class="meth-header-sub">How your prompting profile is built</div> </div> </div> <button class="modal-close" onclick="closeMethodology()" aria-label="Close methodology modal"> <svg fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path> </svg> </button> </div> <!-- Snap-scroll container --> <div class="meth-scroll" id="methScroll"> <!-- S1: Intro + Pipeline --> <section class="meth-snap meth-s1" data-meth-section="0"> <div class="meth-s1-inner"> <div class="meth-hero"> <div class="meth-hero-kicker meth-reveal">🔬 Methodology</div> <h1 class="meth-reveal d1">From raw chats to your <em>prompting profile</em></h1> <p class="meth-hero-sub meth-reveal d2">Your prompts never leave your machine. We score them through on-device embeddings and behavioral analysis to build a profile that captures how you prompt.</p> </div> <div class="meth-pipeline-wrap meth-reveal d3"> <div class="meth-rule">The Pipeline</div> <div class="meth-process"> <div class="meth-step"> <div class="meth-step-icon">📥</div> <h3>Collect</h3> <p>Read local histories from Claude Code, Codex, Copilot Chat, Cursor, and LM Studio.</p> </div> <div class="meth-step"> <div class="meth-step-icon">🔍</div> <h3>Filter</h3> <p>Keep human-authored prompts. Remove system messages, tool output, and assistant text.</p> </div> <div class="meth-step"> <div class="meth-step-icon">📐</div> <h3>Score</h3> <p>Embed each prompt with bge-small-en-v1.5 locally. Classify behavioral metrics via cosine similarity.</p> </div> <div class="meth-step"> <div class="meth-step-icon">🧭</div> <h3>Classify</h3> <p>Two axes — Detail Level and Communication Style — place you on a 2×2 grid validated on 21k prompts.</p> </div> </div> </div> <div class="meth-scroll-hint meth-reveal d4"> <span>Scroll</span> <div class="meth-scroll-arrow"></div> </div> </div> </section> <!-- S2: What We Measure --> <section class="meth-snap meth-s2" data-meth-section="1"> <div class="meth-s2-inner"> <div class="meth-s2-header meth-reveal"> <h2>What We Measure</h2> <p>Style scores use on-device embeddings. Persona axes use behavioral patterns validated on 21k prompts from open research datasets (WildChat, OpenAssistant).</p> </div> <div class="meth-taste-grid"> <div class="meth-taste-card meth-reveal d1" style="--tc:#5c3d2e"> <div class="meth-taste-cat">Volume</div> <div class="meth-taste-list"> <div class="meth-taste-item"><span class="meth-taste-name">Prompts</span><span class="meth-taste-note">Total messages</span></div> <div class="meth-taste-item"><span class="meth-taste-name">Conversations</span><span class="meth-taste-note">Distinct threads</span></div> <div class="meth-taste-item"><span class="meth-taste-name">Words</span><span class="meth-taste-note">Total typed</span></div> </div> </div> <div class="meth-taste-card meth-reveal d2" style="--tc:#7b5a42"> <div class="meth-taste-cat">Timing</div> <div class="meth-taste-list"> <div class="meth-taste-item"><span class="meth-taste-name">Peak hour</span><span class="meth-taste-note">Most active time</span></div> <div class="meth-taste-item"><span class="meth-taste-name">Night owl</span><span class="meth-taste-note">11pm–4am share</span></div> <div class="meth-taste-item"><span class="meth-taste-name">Trend</span><span class="meth-taste-note">Volume over time</span></div> </div> </div> <div class="meth-taste-card meth-reveal d3" style="--tc:#a08060"> <div class="meth-taste-cat">Style</div> <div class="meth-taste-list"> <div class="meth-taste-item"><span class="meth-taste-name">Vibe Index</span><span class="meth-taste-note">Vibes vs. specs</span></div> <div class="meth-taste-item"><span class="meth-taste-name">Politeness</span><span class="meth-taste-note">Tone warmth</span></div> </div> </div> <div class="meth-taste-card meth-reveal d4" style="--tc:#c4a882"> <div class="meth-taste-cat">Persona Axes</div> <div class="meth-taste-list"> <div class="meth-taste-item"><span class="meth-taste-name">Detail Level</span><span class="meth-taste-note">Prompt depth</span></div> <div class="meth-taste-item"><span class="meth-taste-name">Comm Style</span><span class="meth-taste-note">How you direct</span></div> </div> </div> </div> </div> </section> <!-- S3: Persona Explorer --> <section class="meth-snap meth-s3" data-meth-section="2"> <div class="meth-s3-inner"> <div class="meth-s3-header meth-reveal"> <h2>The 4 Personas</h2> <p>Two axes form a 2×2 grid. Your quadrant determines which persona fits your prompting pattern.</p> </div> <div class="meth-persona-layout meth-reveal d1"> <div class="meth-persona-list" id="methPersonaList"></div> <div class="meth-pd" id="methPersonaDetail"></div> </div> </div> </section> </div> <!-- Bottom bar --> <div class="meth-bottom"> <span class="meth-bottom-note">🔒 Fully local — no data leaves your machine.</span> <div class="meth-dot-nav" id="methDotNav"> <button class="meth-dot active" data-meth-idx="0"></button> <button class="meth-dot" data-meth-idx="1"></button> <button class="meth-dot" data-meth-idx="2"></button> </div> </div> </div> </div> <script type="module" src="/_astro/MethodologyModal.astro_astro_type_script_index_0_lang.jiHwSrn-.js"></script> <div class="modal-overlay" id="settingsModal" role="dialog" aria-modal="true" aria-labelledby="settingsTitle"> <div class="settings-modal"> <div class="settings-header"> <h3 id="settingsTitle">Settings</h3> <button class="modal-close" onclick="closeSettings()" aria-label="Close settings"> <svg fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path> </svg> </button> </div> <div class="settings-body"> <div class="settings-section"> <label class="wizard-label">Backends</label> <div id="settingsBackends" class="wizard-config"></div> </div> <div class="settings-section" id="settingsExclusionSection" style="display:none"> <label class="wizard-label">Excluded directories</label> <div class="exclusion-chips" id="settingsExclusionChips"></div> <button class="wizard-btn wizard-btn-ghost exclusion-add-btn" id="settingsAddExclusion" type="button"> <svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 4v16m8-8H4"></path></svg>
7
+ <a href="https://www.linkedin.com/in/eeshans/" target="_blank" class="text-muted hover:text-text transition-colors">LinkedIn</a> </p> </footer> <div class="modal-overlay" id="refreshModal" role="dialog" aria-modal="true" aria-labelledby="refreshModalTitle"> <div class="refresh-modal"> <h3 id="refreshModalTitle">Syncing Pipeline</h3> <div class="wizard-progress" id="refreshProgress"><div class="wizard-progress-bar" id="refreshProgressBar"></div></div> <div class="wizard-log" id="refreshLog"></div> <div class="refresh-modal-result" id="refreshModalResult" style="display:none"></div> <button class="refresh-modal-close" id="refreshModalClose" style="display:none">Done</button> </div> </div> <div class="modal-overlay" id="methodologyModal" role="dialog" aria-modal="true" aria-labelledby="methodologyTitle"> <div class="meth-modal"> <div class="meth-progress"><div class="meth-progress-fill" id="methProgressFill"></div></div> <!-- Header --> <div class="meth-header"> <div class="meth-header-left"> <div class="meth-logo">📊</div> <div> <div class="meth-header-title" id="methodologyTitle">The Method</div> <div class="meth-header-sub">How your prompting profile is built</div> </div> </div> <button class="modal-close" onclick="closeMethodology()" aria-label="Close methodology modal"> <svg fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path> </svg> </button> </div> <!-- Snap-scroll container --> <div class="meth-scroll" id="methScroll"> <!-- S1: Intro + Pipeline --> <section class="meth-snap meth-s1" data-meth-section="0"> <div class="meth-s1-inner"> <div class="meth-hero"> <div class="meth-hero-kicker meth-reveal">🔬 Methodology</div> <h1 class="meth-reveal d1">From raw chats to your <em>prompting profile</em></h1> <p class="meth-hero-sub meth-reveal d2">Your prompts never leave your machine. On-device embeddings and behavioral analysis turn them into a profile that captures how you prompt.</p> </div> <div class="meth-pipeline-wrap meth-reveal d3"> <div class="meth-rule">The Pipeline</div> <div class="meth-process"> <div class="meth-step"> <div class="meth-step-icon">📥</div> <h3>Collect</h3> <p>Read local histories from Claude Code, Codex, Copilot Chat, Cursor, and LM Studio.</p> </div> <div class="meth-step"> <div class="meth-step-icon">🔍</div> <h3>Filter</h3> <p>Keep human-authored prompts. Remove system messages, tool output, and assistant text.</p> </div> <div class="meth-step"> <div class="meth-step-icon">📐</div> <h3>Score</h3> <p>Embed each prompt with bge-small-en-v1.5 locally. Classify behavioral metrics via cosine similarity.</p> </div> <div class="meth-step"> <div class="meth-step-icon">🧭</div> <h3>Classify</h3> <p>Two axes — Detail Level and Communication Style — place you on a 2×2 grid validated on 21k prompts.</p> </div> </div> </div> <div class="meth-scroll-hint meth-reveal d4"> <span>Scroll</span> <div class="meth-scroll-arrow"></div> </div> </div> </section> <!-- S2: What Gets Measured --> <section class="meth-snap meth-s2" data-meth-section="1"> <div class="meth-s2-inner"> <div class="meth-s2-header meth-reveal"> <h2>What Gets Measured</h2> <p>Style scores use on-device embeddings. Persona axes use behavioral patterns validated on 21k prompts from open research datasets (WildChat, OpenAssistant).</p> </div> <div class="meth-taste-grid"> <div class="meth-taste-card meth-reveal d1" style="--tc:#5c3d2e"> <div class="meth-taste-cat">Volume</div> <div class="meth-taste-list"> <div class="meth-taste-item"><span class="meth-taste-name">Prompts</span><span class="meth-taste-note">Total messages</span></div> <div class="meth-taste-item"><span class="meth-taste-name">Conversations</span><span class="meth-taste-note">Distinct threads</span></div> <div class="meth-taste-item"><span class="meth-taste-name">Words</span><span class="meth-taste-note">Total typed</span></div> </div> </div> <div class="meth-taste-card meth-reveal d2" style="--tc:#7b5a42"> <div class="meth-taste-cat">Timing</div> <div class="meth-taste-list"> <div class="meth-taste-item"><span class="meth-taste-name">Peak hour</span><span class="meth-taste-note">Most active time</span></div> <div class="meth-taste-item"><span class="meth-taste-name">Night owl</span><span class="meth-taste-note">11pm–4am share</span></div> <div class="meth-taste-item"><span class="meth-taste-name">Trend</span><span class="meth-taste-note">Volume over time</span></div> </div> </div> <div class="meth-taste-card meth-reveal d3" style="--tc:#a08060"> <div class="meth-taste-cat">Style</div> <div class="meth-taste-list"> <div class="meth-taste-item"><span class="meth-taste-name">Vibe Index</span><span class="meth-taste-note">Vibes vs. specs</span></div> <div class="meth-taste-item"><span class="meth-taste-name">Politeness</span><span class="meth-taste-note">Tone warmth</span></div> </div> </div> <div class="meth-taste-card meth-reveal d4" style="--tc:#c4a882"> <div class="meth-taste-cat">Persona Axes</div> <div class="meth-taste-list"> <div class="meth-taste-item"><span class="meth-taste-name">Detail Level</span><span class="meth-taste-note">Prompt depth</span></div> <div class="meth-taste-item"><span class="meth-taste-name">Comm Style</span><span class="meth-taste-note">How you direct</span></div> </div> </div> </div> </div> </section> <!-- S3: Persona Explorer --> <section class="meth-snap meth-s3" data-meth-section="2"> <div class="meth-s3-inner"> <div class="meth-s3-header meth-reveal"> <h2>The 4 Personas</h2> <p>Two axes form a 2×2 grid. Your quadrant determines which persona fits your prompting pattern.</p> </div> <div class="meth-persona-layout meth-reveal d1"> <div class="meth-persona-list" id="methPersonaList"></div> <div class="meth-pd" id="methPersonaDetail"></div> </div> </div> </section> </div> <!-- Bottom bar --> <div class="meth-bottom"> <span class="meth-bottom-note">🔒 Fully local — no data leaves your machine.</span> <div class="meth-dot-nav" id="methDotNav"> <button class="meth-dot active" data-meth-idx="0"></button> <button class="meth-dot" data-meth-idx="1"></button> <button class="meth-dot" data-meth-idx="2"></button> </div> </div> </div> </div> <script type="module" src="/_astro/MethodologyModal.astro_astro_type_script_index_0_lang.jiHwSrn-.js"></script> <div class="modal-overlay" id="createModal" role="dialog" aria-modal="true" aria-labelledby="createTitle"> <div class="create-modal"> <div class="create-header"> <div class="create-header-left"> <div class="create-logo">&lt;/&gt;</div> <div> <div class="create-header-title" id="createTitle">Create Your Own</div> <div class="create-header-sub">Run privately on your machine or publish your own hosted snapshot.</div> </div> </div> <button class="modal-close" onclick="closeCreateModal()" aria-label="Close create your own modal"> <svg fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path> </svg> </button> </div> <div class="create-body"> <section class="create-card"> <div class="create-section-head"> <p class="create-eyebrow">1 command</p> <h3 class="create-rule">Run Fully Local</h3> </div> <p class="create-card-copy">Private, local-first analytics in one command. No hosting, no setup, no extra steps.</p> <div class="command-strip" role="group" aria-label="Run command"> <div class="command-line-wrap"> <div class="command-line"> <span class="command-prompt">$</span> <code>npx @eeshans/howiprompt</code> </div> </div> <div class="command-actions"> <button class="create-copy-btn" type="button" data-copy-text="npx @eeshans/howiprompt" aria-label="Copy npx command"> <svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24"><rect x="9" y="9" width="13" height="13" rx="2" ry="2" stroke-width="2"></rect><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"></path></svg> <span class="create-copy-label">Copy</span> </button> <a class="create-source-link" href="https://github.com/eeshansrivastava89/howiprompt" target="_blank" rel="noreferrer"> <svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><path d="M12 .5C5.65.5.5 5.65.5 12a11.5 11.5 0 008 10.94c.58.1.79-.25.79-.56l-.02-2.15c-3.25.71-3.94-1.56-3.94-1.56-.53-1.35-1.3-1.71-1.3-1.71-1.07-.73.08-.71.08-.71 1.18.08 1.8 1.21 1.8 1.21 1.05 1.8 2.76 1.28 3.43.98.1-.76.41-1.28.74-1.58-2.59-.29-5.31-1.29-5.31-5.75 0-1.27.45-2.31 1.2-3.12-.12-.29-.52-1.46.12-3.04 0 0 .98-.31 3.2 1.19a11.1 11.1 0 015.82 0c2.21-1.5 3.19-1.19 3.19-1.19.64 1.58.24 2.75.12 3.04.75.81 1.2 1.85 1.2 3.12 0 4.47-2.73 5.46-5.33 5.74.42.36.79 1.08.79 2.17l-.01 3.22c0 .31.21.67.8.56A11.5 11.5 0 0023.5 12C23.5 5.65 18.35.5 12 .5z"></path></svg> <span>Source</span> </a> </div> </div> </section> <section class="create-card create-card-muted"> <div class="create-section-head"> <p class="create-eyebrow">3 steps</p> <h3 class="create-rule">Self-Host On GitHub Pages</h3> </div> <p class="create-card-copy">Publish your own persona and stats as a shareable static site in three short steps.</p> <div class="create-steps" aria-label="Self-host on GitHub Pages"> <div class="create-step"> <div class="create-step-head"><span class="create-step-num">1</span><span class="create-step-title">Clone the repo</span></div> <div class="create-step-command"> <code>git clone https://github.com/eeshansrivastava89/howiprompt.git</code> <button class="create-copy-btn create-copy-btn-sm" type="button" data-copy-text="git clone https://github.com/eeshansrivastava89/howiprompt.git" aria-label="Copy clone command"> <svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24"><rect x="9" y="9" width="13" height="13" rx="2" ry="2" stroke-width="2"></rect><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"></path></svg> <span class="create-copy-label">Copy</span> </button> </div> </div> <div class="create-step"> <div class="create-step-head"><span class="create-step-num">2</span><span class="create-step-title">Launch the local app</span></div> <div class="create-step-command"> <code>cd howiprompt &amp;&amp; npm install &amp;&amp; npm run dev:cli</code> <button class="create-copy-btn create-copy-btn-sm" type="button" data-copy-text="cd howiprompt &#38;&#38; npm install &#38;&#38; npm run dev:cli" aria-label="Copy dev CLI command"> <svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24"><rect x="9" y="9" width="13" height="13" rx="2" ry="2" stroke-width="2"></rect><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"></path></svg> <span class="create-copy-label">Copy</span> </button> </div> </div> <div class="create-step"> <div class="create-step-head"><span class="create-step-num">3</span><span class="create-step-title">Build the hosted snapshot</span></div> <div class="create-step-command"> <code>cd howiprompt/frontend &amp;&amp; DEMO_DEPLOY=true npm run build</code> <button class="create-copy-btn create-copy-btn-sm" type="button" data-copy-text="cd howiprompt/frontend &#38;&#38; DEMO_DEPLOY=true npm run build" aria-label="Copy demo build command"> <svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24"><rect x="9" y="9" width="13" height="13" rx="2" ry="2" stroke-width="2"></rect><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 15H4a2 2 0 01-2-2V4a2 2 0 012-2h9a2 2 0 012 2v1"></path></svg> <span class="create-copy-label">Copy</span> </button> </div> </div> </div> <p class="create-hosted-note">Then commit and push `docs/`, and enable GitHub Pages from `main` / `docs`. <a href="https://docs.github.com/en/pages/quickstart" target="_blank" rel="noreferrer">Setup guide</a></p> </section> </div> <div class="create-bottom"> <span class="create-bottom-note">One command for local-only use. One optional path for a public hosted snapshot.</span> </div> </div> </div> <div class="modal-overlay" id="settingsModal" role="dialog" aria-modal="true" aria-labelledby="settingsTitle"> <div class="settings-modal"> <div class="settings-header"> <h3 id="settingsTitle">Settings</h3> <button class="modal-close" onclick="closeSettings()" aria-label="Close settings"> <svg fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path> </svg> </button> </div> <div class="settings-body"> <div class="settings-section"> <label class="wizard-label">Backends</label> <div id="settingsBackends" class="wizard-config"></div> </div> <div class="settings-section" id="settingsExclusionSection" style="display:none"> <label class="wizard-label">Excluded directories</label> <div class="exclusion-chips" id="settingsExclusionChips"></div> <button class="wizard-btn wizard-btn-ghost exclusion-add-btn" id="settingsAddExclusion" type="button"> <svg width="14" height="14" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 4v16m8-8H4"></path></svg>
8
8
  Add Directory
9
- </button> <p class="wizard-hint">Claude Code projects in these directories will be skipped.</p> </div> </div> <div class="settings-footer"> <button class="wizard-btn wizard-btn-danger" id="settingsReset" type="button">Reset</button> <div class="settings-footer-right"> <button class="wizard-btn wizard-btn-ghost" onclick="closeSettings()">Cancel</button> <button class="wizard-btn wizard-btn-primary" id="settingsSave">Save & Re-analyze</button> </div> </div> </div> </div> <!-- Reset confirm dialog --> <div class="modal-overlay" id="resetConfirmModal" role="dialog" aria-modal="true"> <div class="refresh-modal"> <h3>Reset Setup?</h3> <p style="font-size:14px;color:var(--subtext);margin-bottom:20px;line-height:1.5">This removes the current metrics file and reopens the setup wizard. Cached raw logs and database history stay on disk and will be reused on the next analysis run.</p> <div style="display:flex;gap:8px;justify-content:center"> <button class="wizard-btn wizard-btn-ghost" id="resetCancel">Cancel</button> <button class="wizard-btn wizard-btn-danger" id="resetConfirm">Reset</button> </div> </div> </div> <script type="module" src="/_astro/wrapped.astro_astro_type_script_index_0_lang.D4GeWu2-.js"></script> <script type="module" src="/_astro/wrapped.astro_astro_type_script_index_1_lang.CPAAJDh5.js"></script> </body></html>
9
+ </button> <p class="wizard-hint">Claude Code projects in these directories will be skipped.</p> </div> </div> <div class="settings-footer"> <button class="wizard-btn wizard-btn-danger" id="settingsReset" type="button">Reset</button> <div class="settings-footer-right"> <button class="wizard-btn wizard-btn-ghost" onclick="closeSettings()">Cancel</button> <button class="wizard-btn wizard-btn-primary" id="settingsSave">Save & Re-analyze</button> </div> </div> </div> </div> <!-- Reset confirm dialog --> <div class="modal-overlay" id="resetConfirmModal" role="dialog" aria-modal="true"> <div class="refresh-modal"> <h3>Reset Setup?</h3> <p style="font-size:14px;color:var(--subtext);margin-bottom:20px;line-height:1.5">This removes the current metrics file and reopens the setup wizard. Cached raw logs and database history stay on disk and will be reused on the next analysis run.</p> <div style="display:flex;gap:8px;justify-content:center"> <button class="wizard-btn wizard-btn-ghost" id="resetCancel">Cancel</button> <button class="wizard-btn wizard-btn-danger" id="resetConfirm">Reset</button> </div> </div> </div> <script type="module" src="/_astro/wrapped.astro_astro_type_script_index_0_lang.D4GeWu2-.js"></script> <script type="module" src="/_astro/wrapped.astro_astro_type_script_index_1_lang.DKLs-Mo8.js"></script> </body></html>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eeshans/howiprompt",
3
- "version": "2.1.2",
3
+ "version": "2.1.3",
4
4
  "description": "Local-first analytics dashboard for your AI coding assistant conversations",
5
5
  "type": "module",
6
6
  "author": "Eeshan Srivastava (https://eeshans.com)",
@@ -1 +0,0 @@
1
- /*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial}}}@layer theme{:root,:host{--font-sans:"DM Sans", system-ui, -apple-system, sans-serif;--font-serif:"Fraunces", Georgia, serif;--font-mono:"JetBrains Mono", "SF Mono", Menlo, monospace;--spacing:.25rem;--container-md:28rem;--container-lg:32rem;--container-3xl:48rem;--container-4xl:56rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--text-7xl:4.5rem;--text-7xl--line-height:1;--text-8xl:6rem;--text-8xl--line-height:1;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wider:.05em;--tracking-widest:.1em;--radius-sm:.25rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-bg:var(--bg);--color-text:var(--text);--color-muted:var(--muted);--color-border:var(--border);--grid-template-columns-24:repeat(24, minmax(0, 1fr))}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{box-sizing:border-box;margin:0;padding:0}html,body{height:100%}body{font-family:var(--font-sans);background:var(--bg);color:var(--text);-webkit-font-smoothing:antialiased;touch-action:manipulation}}@layer components{@keyframes fadeIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes spin{to{transform:rotate(360deg)}}@keyframes methBob{0%,to{transform:rotate(45deg)translate(0)}50%{transform:rotate(45deg)translate(2px,2px)}}.animate{animation:.4s forwards fadeIn}.delay-1{opacity:0;animation-delay:50ms}.delay-2{opacity:0;animation-delay:.1s}.delay-3{opacity:0;animation-delay:.15s}.delay-4{opacity:0;animation-delay:.2s}.delay-5{opacity:0;animation-delay:.25s}.refreshing .refresh-icon{animation:.8s linear infinite spin}.top-nav{z-index:50;background:var(--bg);position:sticky;top:0}.source-bar{border-bottom:1px solid var(--border);flex-wrap:wrap;flex-shrink:0;align-items:center;gap:6px;padding:8px 24px;display:flex}.source-pill{color:var(--muted);border:1px solid var(--border);cursor:pointer;white-space:nowrap;background:0 0;border-radius:999px;align-items:center;gap:6px;padding:6px 14px;font-family:inherit;font-size:13px;font-weight:500;transition:all .2s;display:inline-flex}.source-pill:hover{border-color:var(--text);color:var(--text)}.source-pill.active{background:var(--text);color:var(--bg);border-color:var(--text);font-weight:600}.source-pill-dot{border-radius:50%;flex-shrink:0;width:8px;height:8px}@media(max-width:640px){.source-bar{gap:4px;padding:6px 12px}.source-pill{padding:5px 10px;font-size:12px}}.card-dock{perspective:1200px}.player-card{transform-style:preserve-3d;will-change:transform;border:1px solid #0000000f;transition:transform .15s ease-out,box-shadow .2s ease-out;box-shadow:0 1px 2px #0000000a,0 4px 12px #0000000f,0 12px 32px #00000014,0 24px 60px #0000000f;container-type:inline-size}.dark .player-card{border-color:#ffffff0f;box-shadow:0 1px 2px #0003,0 4px 12px #0003,0 12px 32px #00000040,0 24px 60px #0003}.persona-name{text-shadow:0 2px 8px #0000004d;font-size:clamp(26px,6cqw,36px)}.donut-ring svg{transform:rotate(-90deg)}.donut-fill{transition:stroke-dashoffset .6s}.stat-block:not(:last-child):after{content:"";background:var(--border);width:1px;height:60%;position:absolute;top:20%;right:0}.trend-dot{transition:r .1s}.trend-tooltip:after{content:"";border:5px solid #0000;border-top-color:var(--text);position:absolute;top:100%;left:50%;transform:translate(-50%)}.heatmap-cell.l1{background:var(--heatmap-color,var(--accent));opacity:.2}.heatmap-cell.l2{background:var(--heatmap-color,var(--accent));opacity:.35}.heatmap-cell.l3{background:var(--heatmap-color,var(--accent));opacity:.55}.heatmap-cell.l4{background:var(--heatmap-color,var(--accent));opacity:.75}.heatmap-cell.l5{background:var(--heatmap-color,var(--accent));opacity:1}.heatmap-tooltip:after{content:"";border:4px solid #0000;border-top-color:var(--text);position:absolute;top:100%;left:50%;transform:translate(-50%)}.meth-modal{box-shadow:0 1px 2px #0000000a,0 8px 24px #0000000f,0 32px 64px #00000014}.dark .meth-modal{box-shadow:0 1px 2px #0003,0 8px 24px #0003,0 32px 64px #00000040}.meth-progress-fill{background:linear-gradient(90deg,var(--accent),var(--accent))}@supports (color:color-mix(in lab,red,red)){.meth-progress-fill{background:linear-gradient(90deg,var(--accent),color-mix(in srgb,var(--accent) 50%,transparent))}}.meth-step-icon{background:linear-gradient(135deg,var(--accent),var(--accent))}@supports (color:color-mix(in lab,red,red)){.meth-step-icon{background:linear-gradient(135deg,var(--accent),color-mix(in srgb,var(--accent) 70%,#a08060))}}.meth-step-icon{box-shadow:0 4px 10px rgba(var(--accent-rgb),.2)}.meth-step:not(:last-child):after{content:"";z-index:2;background:var(--bg);border:1px solid var(--border);border-bottom:none;border-left:none;width:14px;height:14px;position:absolute;top:50%;right:-1px;transform:translate(50%)translateY(-50%)rotate(45deg)}@media(max-width:700px){.meth-step:not(:last-child):after{display:none}}.meth-scroll-arrow{animation:2s ease-in-out infinite methBob}.meth-s1{background:radial-gradient(ellipse 55% 50% at 50% 85%,rgba(var(--accent-rgb),.06),transparent)}.meth-s2{background:radial-gradient(circle at 80% 20%,rgba(var(--accent-rgb),.06),transparent 45%)}.meth-s3{background:radial-gradient(ellipse 60% 50% at 30% 70%,rgba(var(--accent-rgb),.06),transparent)}.dark .meth-s1{background:radial-gradient(ellipse 55% 50% at 50% 85%,rgba(var(--accent-rgb),.1),transparent)}.dark .meth-s2{background:radial-gradient(circle at 80% 20%,rgba(var(--accent-rgb),.1),transparent 45%)}.dark .meth-s3{background:radial-gradient(ellipse 60% 50% at 30% 70%,rgba(var(--accent-rgb),.1),transparent)}.meth-taste-card:before{content:"";background:var(--tc,var(--accent));height:3px;position:absolute;top:0;left:0;right:0}.meth-pd-art:after{content:"";background:radial-gradient(circle at 50% 80%,#0000 40%,#fff3);position:absolute;inset:0}.dark .meth-pd-art:after{background:radial-gradient(circle at 50% 80%,#0000 40%,#00000026)}.meth-p-thumb.active{box-shadow:0 0 0 3px var(--pa),var(--shadow)}@supports (color:color-mix(in lab,red,red)){.meth-p-thumb.active{box-shadow:0 0 0 3px color-mix(in srgb,var(--pa) 10%,transparent),var(--shadow)}}.meth-reveal{opacity:0;transition:opacity .6s cubic-bezier(.16,1,.3,1),transform .6s cubic-bezier(.16,1,.3,1);transform:translateY(20px)}.meth-reveal.vis{opacity:1;transform:translateY(0)}.meth-reveal.d1{transition-delay:80ms}.meth-reveal.d2{transition-delay:.16s}.meth-reveal.d3{transition-delay:.24s}.meth-reveal.d4{transition-delay:.32s}.wizard-stage-fill{background:var(--accent);transition:width .35s}@supports (color:color-mix(in lab,red,red)){.wizard-stage-fill{background:color-mix(in srgb,var(--accent) 18%,transparent)}}.wizard-stage-track.is-active .wizard-stage-fill{background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.wizard-stage-track.is-active .wizard-stage-fill{background:color-mix(in srgb,var(--accent) 28%,transparent)}}.wizard-stage-track.is-done .wizard-stage-fill{background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.wizard-stage-track.is-done .wizard-stage-fill{background:color-mix(in srgb,var(--accent) 40%,transparent)}}.wizard-stage-track.is-error .wizard-stage-fill{background:var(--stat-r)}@supports (color:color-mix(in lab,red,red)){.wizard-stage-track.is-error .wizard-stage-fill{background:color-mix(in srgb,var(--stat-r) 32%,transparent)}}:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:var(--ui-radius-sm)}@media(prefers-reduced-motion:reduce){*,:before,:after{transition:none!important;animation:none!important}.player-card{transform:none!important}.meth-reveal{opacity:1!important;transform:none!important}}}@layer utilities{.absolute{position:absolute}.relative{position:relative}.static{position:static}.top-1\/2{top:50%}.bottom-12{bottom:calc(var(--spacing) * 12)}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.mx-2{margin-inline:calc(var(--spacing) * 2)}.mx-auto{margin-inline:auto}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-16{margin-top:calc(var(--spacing) * 16)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.mb-10{margin-bottom:calc(var(--spacing) * 10)}.mb-12{margin-bottom:calc(var(--spacing) * 12)}.ml-12{margin-left:calc(var(--spacing) * 12)}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.aspect-square{aspect-ratio:1}.h-2{height:calc(var(--spacing) * 2)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.min-h-screen{min-height:100vh}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-8{width:calc(var(--spacing) * 8)}.w-12{width:calc(var(--spacing) * 12)}.w-full{width:100%}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.cursor-pointer{cursor:pointer}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-24{grid-template-columns:var(--grid-template-columns-24)}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-\[1px\]{gap:1px}.gap-\[2px\]{gap:2px}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-\[2px\]>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(2px * var(--tw-space-y-reverse));margin-block-end:calc(2px * calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.rounded-full{border-radius:3.40282e38px}.rounded-sm{border-radius:var(--radius-sm)}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-border{border-color:var(--color-border)}.bg-bg{background-color:var(--color-bg)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-20{padding-block:calc(var(--spacing) * 20)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-14{padding-top:calc(var(--spacing) * 14)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.text-center{text-align:center}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.font-serif{font-family:var(--font-serif)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-7xl{font-size:var(--text-7xl);line-height:var(--tw-leading,var(--text-7xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.text-muted,.text-muted\/40{color:var(--color-muted)}@supports (color:color-mix(in lab,red,red)){.text-muted\/40{color:color-mix(in oklab,var(--color-muted) 40%,transparent)}}.text-muted\/60{color:var(--color-muted)}@supports (color:color-mix(in lab,red,red)){.text-muted\/60{color:color-mix(in oklab,var(--color-muted) 60%,transparent)}}.text-text,.text-text\/80{color:var(--color-text)}@supports (color:color-mix(in lab,red,red)){.text-text\/80{color:color-mix(in oklab,var(--color-text) 80%,transparent)}}.text-text\/90{color:var(--color-text)}@supports (color:color-mix(in lab,red,red)){.text-text\/90{color:color-mix(in oklab,var(--color-text) 90%,transparent)}}.uppercase{text-transform:uppercase}.italic{font-style:italic}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.delay-1{transition-delay:1ms}.delay-2{transition-delay:2ms}.delay-3{transition-delay:3ms}.duration-300{--tw-duration:.3s;transition-duration:.3s}@media(hover:hover){.hover\:text-text:hover{color:var(--color-text)}}@media(min-width:40rem){.sm\:mb-8{margin-bottom:calc(var(--spacing) * 8)}.sm\:flex{display:flex}.sm\:gap-4{gap:calc(var(--spacing) * 4)}.sm\:gap-6{gap:calc(var(--spacing) * 6)}.sm\:gap-\[2px\]{gap:2px}.sm\:p-4{padding:calc(var(--spacing) * 4)}.sm\:p-6{padding:calc(var(--spacing) * 6)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:py-20{padding-block:calc(var(--spacing) * 20)}.sm\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.sm\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.sm\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.sm\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.sm\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.sm\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.sm\:text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}}@media(min-width:48rem){.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\:p-8{padding:calc(var(--spacing) * 8)}.md\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.md\:text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}.md\:text-8xl{font-size:var(--text-8xl);line-height:var(--tw-leading,var(--text-8xl--line-height))}}@media(min-width:64rem){.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}}}:root{--bg:#f5f3f0;--surface:#fff;--surface-raised:#faf8f5;--text:#3c3226;--subtext:#6b5e50;--muted:#8a7d6f;--border:#d9d2c9;--border-light:#ebe5dc;--accent:#5c3d2e;--accent-soft:#ede6de;--accent-rgb:92,61,46;--ui-radius:14px;--ui-radius-sm:8px;--shadow:0 1px 3px #3c32260f, 0 4px 12px #3c32260a;--shadow-hover:0 4px 12px #3c32261a, 0 8px 24px #3c32260f;--stat-b:#1a5bdb;--stat-r:#d20f39}.dark{--bg:#1c1816;--surface:#2a2420;--surface-raised:#332c26;--text:#e0d6cc;--subtext:#b0a596;--muted:#8a7d6f;--border:#3d342c;--border-light:#4a3f35;--accent:#c9a882;--accent-soft:#2e261f;--accent-rgb:201,168,130;--shadow:0 1px 3px #0000004d, 0 4px 12px #0003;--shadow-hover:0 4px 12px #0006, 0 8px 24px #0000004d;--stat-b:#89b4fa;--stat-r:#f38ba8}.header{background:var(--bg);flex-wrap:wrap;flex-shrink:0;justify-content:space-between;align-items:center;gap:12px;padding:12px 24px;display:flex}.header-left{flex-wrap:wrap;align-items:baseline;gap:12px;display:flex}.header h1{letter-spacing:-.02em;font-size:24px;font-weight:700}.header h1 span{color:var(--accent)}.header-subtitle{color:var(--muted);font-size:20px;font-weight:500}.date-range{color:var(--muted);font-size:14px;font-weight:500}.header-right{align-items:center;gap:12px;display:flex}.nav-link,.accent-link{color:var(--text);background:var(--surface);border:1px solid var(--border);cursor:pointer;white-space:nowrap;border-radius:20px;justify-content:center;align-items:center;gap:6px;padding:8px 14px;font-family:inherit;font-size:13px;font-weight:600;text-decoration:none;transition:all .15s;display:inline-flex}.nav-link:hover,.accent-link:hover{border-color:var(--accent);color:var(--accent);background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.nav-link:hover,.accent-link:hover{background:color-mix(in srgb,var(--accent) 10%,var(--surface))}}.create-dropdown{position:relative}.create-btn{color:var(--accent);background:var(--accent-soft);border:1px solid var(--accent);align-items:center;gap:7px;padding:8px 14px;font-size:13px;font-weight:700;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.create-btn{border:1px solid color-mix(in srgb,var(--accent) 35%,var(--border))}}.create-btn{cursor:pointer;white-space:nowrap;border-radius:20px;font-family:inherit;transition:all .15s}.create-btn:hover,.create-dropdown.open .create-btn{border-color:var(--accent);color:var(--accent);background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.create-btn:hover,.create-dropdown.open .create-btn{background:color-mix(in srgb,var(--accent) 18%,var(--surface))}}.create-menu{background:var(--surface);border:1px solid var(--border);border-radius:var(--ui-radius-sm);width:min(560px,100vw - 32px);box-shadow:var(--shadow-hover);z-index:80;padding:12px;position:absolute;top:calc(100% + 10px);right:0}.create-menu[hidden]{display:none}.create-menu-copy{margin-bottom:10px}.create-kicker{letter-spacing:.02em;text-transform:uppercase;color:var(--text);margin:0 0 4px;font-size:12px;font-weight:700}.create-subcopy{color:var(--muted);margin:0;font-size:12px;line-height:1.45}.command-strip{background:linear-gradient(180deg,var(--bg),var(--bg));justify-content:space-between;align-items:center;gap:12px;padding:10px 12px;display:flex}@supports (color:color-mix(in lab,red,red)){.command-strip{background:linear-gradient(180deg,color-mix(in srgb,var(--bg) 74%,transparent),color-mix(in srgb,var(--bg) 92%,transparent))}}.command-strip{border:1px solid var(--border)}@supports (color:color-mix(in lab,red,red)){.command-strip{border:1px solid color-mix(in srgb,var(--border) 92%,transparent)}}.command-strip{border-radius:12px}.command-line-wrap{flex:1;min-width:0}.command-line{color:var(--text);white-space:nowrap;align-items:center;gap:10px;font-family:JetBrains Mono,monospace;font-size:13px;display:flex;overflow:auto}.command-prompt{color:var(--accent);font-weight:700}.command-actions{flex-shrink:0;align-items:center;gap:8px;display:flex}.create-copy-btn,.create-source-link{white-space:nowrap;border-radius:999px;align-items:center;gap:6px;padding:7px 10px;font-family:inherit;font-size:12px;font-weight:600;text-decoration:none;transition:all .15s;display:inline-flex}.create-copy-btn{border:1px solid var(--border);color:var(--text);cursor:pointer;background:0 0}.create-copy-btn:hover,.create-source-link:hover{border-color:var(--accent);color:var(--accent);background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.create-copy-btn:hover,.create-source-link:hover{background:color-mix(in srgb,var(--accent) 10%,transparent)}}.create-copy-btn.is-copied{color:#2f8f5b;background:#2f8f5b1a;border-color:#2f8f5b}.create-source-link{border:1px solid var(--border);color:var(--muted);background:0 0}.theme-btn{border:1px solid var(--border);background:var(--surface);cursor:pointer;width:36px;height:36px;color:var(--muted);border-radius:50%;justify-content:center;align-items:center;transition:all .2s;display:flex}.theme-btn:hover{border-color:var(--accent);color:var(--accent)}@media(max-width:640px){.header{gap:8px;padding:10px 16px}.header-right{gap:8px}.header-right .nav-link{display:none}.create-menu{width:min(420px,100vw - 32px);left:0;right:auto}.command-strip{flex-direction:column;align-items:stretch}.command-actions{flex-wrap:wrap;justify-content:flex-start}}.page-frame{flex-direction:column;height:100dvh;min-height:0;display:flex}@media(max-width:1024px){.page-frame{height:auto;min-height:100dvh}}.dash-panel{flex-direction:column;flex:1;min-height:0;display:flex}.dash-container{flex-direction:column;flex:1;min-height:0;padding:0 24px;display:flex}.main-grid{flex:1;grid-template-columns:2fr 1fr;gap:20px;min-height:0;padding:16px 0;display:grid}@media(max-width:1024px){.main-grid{flex:none;grid-template-columns:1fr}.right-col{order:-1}}.left{flex-direction:column;gap:12px;min-width:0;min-height:0;display:flex}.stat-cards{grid-template-columns:repeat(4,1fr);gap:12px;display:grid}@media(max-width:640px){.stat-cards{grid-template-columns:repeat(2,1fr)}}.stat-card{background:var(--surface);border-radius:var(--ui-radius-sm);box-shadow:var(--shadow);padding:14px 16px}.stat-card-label{text-transform:uppercase;letter-spacing:.04em;color:var(--muted);margin-bottom:4px;font-size:12px;font-weight:600}.stat-card-value{letter-spacing:-.03em;font-family:JetBrains Mono,monospace;font-size:28px;font-weight:700;line-height:1}.stat-card-value.highlight{color:var(--text);font-weight:800}.stat-card-sub{color:var(--muted);margin-top:4px;font-size:13px}.trend-panel{background:var(--surface);border-radius:var(--ui-radius-sm);box-shadow:var(--shadow);flex-direction:column;flex:1;min-width:0;min-height:340px;padding:14px 20px 10px;display:flex}.trend-header{flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:10px 16px;min-width:0;margin-bottom:10px;display:flex}.trend-copy{flex-direction:column;flex:1;gap:6px;min-width:0;display:flex}.trend-copy-row{flex-wrap:wrap;align-items:center;gap:8px;min-width:0;display:flex}.trend-title{font-size:16px;font-weight:700}.trend-copy-sep{color:var(--border);font-size:13px;line-height:1}.trend-metric-def{color:var(--muted);min-width:0;font-size:12px;font-style:italic;line-height:1.35}.trend-legend{flex-wrap:wrap;align-items:center;gap:10px;min-height:15px;display:flex}.trend-legend-pill{color:var(--muted);white-space:nowrap;align-items:center;gap:5px;font-size:11px;font-weight:500;display:inline-flex}.trend-legend-dot{border-radius:50%;flex-shrink:0;width:8px;height:8px}.metric-tabs{flex-wrap:wrap;align-self:flex-start;gap:4px;min-width:0;display:flex}.metric-tab{border:1px solid var(--border);color:var(--muted);cursor:pointer;white-space:nowrap;background:0 0;border-radius:20px;padding:6px 14px;font-family:inherit;font-size:12px;font-weight:600;transition:all .15s;position:relative}.metric-tab[data-tooltip]:hover:after{content:attr(data-tooltip);background:var(--text);color:var(--bg);white-space:normal;z-index:20;pointer-events:none;border-radius:8px;width:max-content;max-width:220px;padding:6px 12px;font-family:JetBrains Mono,monospace;font-size:11px;font-weight:500;line-height:1.4;position:absolute;top:calc(100% + 8px);left:50%;transform:translate(-50%)}.metric-tab[data-tooltip]:hover:before{content:"";border:5px solid #0000;border-bottom-color:var(--text);z-index:20;pointer-events:none;position:absolute;top:calc(100% + 3px);left:50%;transform:translate(-50%)}.metric-tab.active{background:var(--accent);color:#fff;border-color:var(--accent)}.metric-tab:hover:not(.active){border-color:var(--accent);color:var(--accent)}.trend-current{align-items:baseline;gap:8px;margin-bottom:8px;display:flex}.trend-current-val{letter-spacing:-.03em;color:var(--trend-color,var(--accent));font-family:JetBrains Mono,monospace;font-size:36px;font-weight:800}.trend-current-label{display:none}.trend-chart-wrap{flex:1;min-width:0;min-height:60px;position:relative}.heatmap-panel{background:var(--surface);border-radius:var(--ui-radius-sm);box-shadow:var(--shadow);flex-shrink:0;padding:14px 18px}.heatmap-title{margin-bottom:8px;font-size:14px;font-weight:700}.heatmap{grid-template-columns:32px repeat(24,1fr);gap:1px;font-size:10px;display:grid}.heatmap-label{color:var(--muted);align-items:center;font-size:10px;font-weight:500;display:flex}.heatmap-hour{text-align:center;color:var(--muted);font-size:10px;font-weight:500}.heatmap-cell{background:var(--border);opacity:.3;border-radius:2px;height:18px}.heatmap-cell.l1{background:var(--heatmap-color,var(--accent));opacity:.2}.heatmap-cell.l2{background:var(--heatmap-color,var(--accent));opacity:.35}.heatmap-cell.l3{background:var(--heatmap-color,var(--accent));opacity:.55}.heatmap-cell.l4{background:var(--heatmap-color,var(--accent));opacity:.75}.heatmap-cell.l5{background:var(--heatmap-color,var(--accent));opacity:1}.heatmap-tooltip{background:var(--text);color:var(--bg);pointer-events:none;opacity:0;white-space:nowrap;z-index:10;border-radius:6px;padding:5px 10px;font-family:JetBrains Mono,monospace;font-size:11px;font-weight:600;transition:opacity .1s;position:absolute;top:0;left:0;transform:translate(-50%)}.heatmap-tooltip:after{content:"";border:4px solid #0000;border-top-color:var(--text);position:absolute;top:100%;left:50%;transform:translate(-50%)}.heatmap-panel{position:relative}.heatmap-meta{color:var(--muted);justify-content:space-between;margin-top:6px;font-size:11px;display:flex}.right-col{flex-direction:column;gap:12px;min-width:0;min-height:0;display:flex}.card-dock{perspective:1200px;flex:1;width:100%;min-height:0;display:flex;position:relative}.player-card{background:var(--surface);width:100%;transform-style:preserve-3d;will-change:transform;border:1px solid #0000000f;border-radius:24px;flex-direction:column;height:100%;transition:transform .15s ease-out,box-shadow .2s ease-out;display:flex;overflow:hidden;box-shadow:0 1px 2px #0000000a,0 4px 12px #0000000f,0 12px 32px #00000014,0 24px 60px #0000000f;container-type:inline-size}.dark .player-card{border-color:#ffffff0f;box-shadow:0 1px 2px #0003,0 4px 12px #0003,0 12px 32px #00000040,0 24px 60px #0003}.card-top{aspect-ratio:840/1040;background-position:50%;background-size:cover;border-radius:24px 24px 0 0;padding:0;position:relative;overflow:hidden}.card-top-content{z-index:2;flex-direction:column;gap:8px;width:50%;padding:22px 24px 18px;display:flex;position:absolute;inset:0}.persona-name{color:#fff;letter-spacing:-.04em;text-shadow:0 2px 8px #0000004d;white-space:nowrap;font-size:clamp(22px,5.5cqw,36px);font-weight:800;line-height:.96}.donut-grid{flex-direction:column;gap:10px;margin-top:16px;display:flex}.donut-item{align-items:center;gap:10px;display:flex}.donut-ring{flex-shrink:0;width:44px;height:44px;position:relative}.donut-ring svg{width:100%;height:100%;transform:rotate(-90deg)}.donut-ring .donut-track{fill:none;stroke:#ffffff26;stroke-width:5px}.donut-ring .donut-fill{fill:none;stroke:#ffffffd9;stroke-width:5px;stroke-linecap:round;transition:stroke-dashoffset .6s}.donut-val{color:#fff;justify-content:center;align-items:center;font-family:JetBrains Mono,monospace;font-size:13px;font-weight:800;display:flex;position:absolute;inset:0}.donut-label{color:#ffffffb3;font-size:12px;font-weight:600}.card-body{padding:14px 24px 12px}.persona-desc{color:var(--muted);font-size:14px;line-height:1.58}.persona-desc strong{color:var(--text);font-weight:700}.stat-strip{border-top:1px solid var(--border);grid-template-columns:repeat(2,1fr);display:grid}.stat-block{text-align:center;padding:16px 10px 14px;position:relative}.stat-block:not(:last-child):after{content:"";background:var(--border);width:1px;height:60%;position:absolute;top:20%;right:0}.stat-num{letter-spacing:-.04em;font-family:JetBrains Mono,monospace;font-size:30px;font-weight:800;line-height:1}.stat-block:first-child .stat-num{color:var(--accent)}.stat-block:nth-child(2) .stat-num{color:var(--stat-b)}.stat-block:nth-child(3) .stat-num{color:var(--stat-r)}.stat-label{text-transform:uppercase;letter-spacing:.05em;color:var(--muted);margin-top:5px;font-size:12px;font-weight:700}.stat-minibar{background:var(--border);opacity:.55;border-radius:999px;width:58%;height:3px;margin:8px auto 0;overflow:hidden}.stat-minibar-fill{border-radius:2px;height:100%}.stat-minibar-fill.o{background:var(--accent)}.stat-minibar-fill.b{background:var(--stat-b)}.stat-minibar-fill.r{background:var(--stat-r)}.card-foot{color:var(--muted);border-top:1px solid var(--border);justify-content:space-between;padding:8px 24px;font-family:JetBrains Mono,monospace;font-size:11px;display:flex}.footer{color:var(--muted);border-top:1px solid var(--border);flex-shrink:0;justify-content:space-between;align-items:center;margin-top:16px;padding:12px 24px;font-size:11px;display:flex}.footer-links{gap:16px;display:flex}.footer-links a{color:var(--muted);text-decoration:none;transition:color .15s}.footer-links a:hover{color:var(--text)}.share-toast{background:var(--surface);color:var(--text);border:1px solid var(--border);border-radius:var(--ui-radius-sm);box-shadow:var(--shadow);z-index:50;opacity:0;pointer-events:none;padding:10px 16px;font-size:13px;font-weight:500;transition:opacity .3s,transform .3s;position:fixed;bottom:84px;right:24px;transform:translateY(8px)}.share-toast.show{opacity:1;transform:translateY(0)}.refresh-modal{background:var(--surface);border-radius:var(--ui-radius);width:90%;max-width:480px;box-shadow:var(--shadow-hover);text-align:center;padding:28px 32px}.refresh-modal h3{margin-bottom:16px;font-size:16px;font-weight:700}.refresh-modal .wizard-log{text-align:left;height:180px;margin-bottom:12px}.refresh-modal .wizard-progress{margin-bottom:12px}.refresh-modal-result{color:var(--text);font-size:14px;line-height:1.8}.refresh-modal-result .result-num{color:var(--accent);font-family:JetBrains Mono,monospace;font-weight:700}.refresh-modal-close{background:var(--accent);color:#fff;cursor:pointer;border:none;border-radius:20px;margin-top:16px;padding:8px 24px;font-family:inherit;font-size:13px;font-weight:600;transition:transform .1s}.refresh-modal-close:hover{transform:scale(1.03)}@media(max-width:1024px){.page-frame{overflow-x:hidden}.dash-container,.main-grid,.card-dock{flex:none}.player-card{height:auto}.card-top-content{gap:8px}.trend-panel{flex:none;min-height:320px}.right-col{align-self:center;width:100%;max-width:480px}}@media(max-width:1400px){.trend-panel{min-height:320px}}@media(max-width:640px){html,body{height:auto;overflow-x:hidden}.header{gap:8px;padding:10px 16px}.header-right{gap:8px}.tab-bar{padding:0 16px}.dash-container{padding:0 12px}.main-grid{gap:12px}.right-col{align-self:stretch;gap:10px;max-width:none}.card-top{aspect-ratio:840/1040}.card-top-content{width:45%;padding:14px 14px 12px}.persona-name{font-size:22px}.donut-ring{width:36px;height:36px}.donut-val{font-size:11px}.donut-label{font-size:10px}.donut-grid,.donut-item{gap:6px}.card-body{padding:10px 16px 8px}.persona-desc{overflow-wrap:break-word;font-size:12px}.stat-num{font-size:22px}.stat-label{font-size:10px}.stat-block{padding:10px 4px}.card-foot{padding:6px 16px;font-size:10px}.stat-cards{gap:8px}.stat-card{padding:10px 12px}.stat-card-value{font-size:20px}.stat-card-label,.stat-card-sub{font-size:11px}.trend-panel{min-height:300px;padding:14px}.trend-header{flex-direction:column;align-items:flex-start;gap:6px}.trend-copy{gap:4px;width:100%}.trend-copy-row{gap:6px}.trend-copy-sep{display:none}.trend-metric-def{font-size:11px}.trend-title{font-size:14px}.metric-tabs{flex-wrap:wrap;gap:3px;width:100%}.metric-tab{border-radius:14px;padding:4px 8px;font-size:10px}.trend-current-val{font-size:24px}.trend-current-label{font-size:12px}.trend-chart-wrap{min-height:80px}.heatmap-panel{padding:10px 14px}.heatmap-title{margin-bottom:4px;font-size:13px}.heatmap{grid-template-columns:14px repeat(24,1fr);gap:1px}.heatmap-hour{visibility:hidden;height:0;font-size:0;line-height:0}.heatmap-label{text-overflow:clip;white-space:nowrap;width:14px;font-size:7px;overflow:hidden}.heatmap-cell{border-radius:1px;height:8px}.heatmap-meta{flex-wrap:wrap;gap:4px;font-size:10px}.footer{text-align:center;flex-direction:column;gap:4px;margin-top:8px;padding:10px 12px;font-size:10px}}@media(prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important}.player-card{transform:none!important}}.icon-sm{width:16px;height:16px}.sr-only{clip:rect(0,0,0,0);border:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.wizard-overlay{z-index:200;background:var(--bg);justify-content:center;align-items:center;padding:16px;display:none;position:fixed;inset:0}.wizard-overlay.active{display:flex}.wizard-panel{background:var(--surface);border-radius:var(--ui-radius);width:100%;max-width:520px;box-shadow:var(--shadow-hover);padding:32px}.wizard-title{letter-spacing:-.02em;margin-bottom:4px;font-size:20px;font-weight:700}.wizard-title span{color:var(--accent)}.wizard-steps{gap:6px;margin:20px 0 24px;display:flex}.wizard-step{color:var(--muted);background:var(--bg);border-radius:20px;align-items:center;gap:6px;padding:6px 14px;font-size:12px;font-weight:600;transition:all .2s;display:flex}.wizard-step.active{background:var(--accent);color:#fff}.wizard-step.done{color:var(--accent)}.wizard-step-num{font-weight:700}.wizard-page{display:none}.wizard-page.active{display:block}.wizard-intro{color:var(--subtext);margin-bottom:20px;font-size:14px;line-height:1.5}.wizard-loading{color:var(--muted);text-align:center;padding:24px 0;font-size:13px}.wizard-backends{flex-direction:column;gap:8px;margin-bottom:24px;display:flex}.wizard-backend{border:1px solid var(--border);border-radius:var(--ui-radius-sm);align-items:center;gap:12px;padding:12px 16px;transition:border-color .15s;display:flex}.wizard-backend.detected{border-color:var(--accent)}.wizard-backend-icon{border-radius:50%;flex-shrink:0;width:8px;height:8px}.wizard-backend-icon.available{background:#40a02b}.wizard-backend-icon.coming_soon{background:#df8e1d}.wizard-backend-icon.not_found{background:var(--border)}.wizard-backend-info{flex:1}.wizard-backend-name{font-size:14px;font-weight:600}.wizard-backend-detail{color:var(--muted);margin-top:2px;font-size:12px}.wizard-config{flex-direction:column;gap:8px;margin-bottom:16px;display:flex}.wizard-toggle{border:1px solid var(--border);border-radius:var(--ui-radius-sm);cursor:pointer;align-items:center;gap:12px;padding:10px 16px;font-size:14px;font-weight:500;transition:border-color .15s;display:flex}.wizard-toggle:has(input:checked){border-color:var(--accent)}.wizard-toggle input[type=checkbox]{accent-color:var(--accent);width:16px;height:16px}.wizard-toggle.is-disabled{cursor:not-allowed;opacity:.65}.wizard-exclusions{margin-bottom:16px}.wizard-label{margin-bottom:6px;font-size:13px;font-weight:600;display:block}.wizard-hint{color:var(--muted);margin-top:8px;font-size:11px}.exclusion-chips{flex-direction:column;gap:6px;margin-bottom:8px;display:flex}.exclusion-chip{background:var(--bg);border:1px solid var(--border);border-radius:var(--ui-radius-sm);align-items:center;gap:8px;padding:8px 12px;font-size:12px;display:flex}.exclusion-chip-path{text-overflow:ellipsis;white-space:nowrap;color:var(--text);flex:1;font-family:JetBrains Mono,monospace;overflow:hidden}.exclusion-chip-count{color:var(--muted);white-space:nowrap;font-size:11px}.exclusion-chip-remove{cursor:pointer;color:var(--muted);background:0 0;border:none;padding:2px;font-size:16px;line-height:1;transition:color .15s}.exclusion-chip-remove:hover{color:var(--stat-r)}.exclusion-add-btn{align-items:center;gap:6px;padding:8px 16px;font-size:12px;display:inline-flex}.wizard-nav{justify-content:flex-end;gap:8px;display:flex}.wizard-btn{cursor:pointer;border:none;border-radius:20px;padding:10px 24px;font-family:inherit;font-size:13px;font-weight:600;transition:transform .1s}.wizard-btn:hover{transform:scale(1.03)}.wizard-btn-primary{background:var(--accent);color:#fff}.wizard-btn-ghost{background:var(--bg);color:var(--text);border:1px solid var(--border)}.wizard-log{background:var(--bg);border:1px solid var(--border);border-radius:var(--ui-radius-sm);height:180px;margin-bottom:16px;padding:12px;font-family:JetBrains Mono,monospace;font-size:12px;overflow-y:auto}.wizard-log-entry{color:var(--subtext);padding:2px 0}.wizard-log-entry.done{color:var(--accent);font-weight:600}.wizard-log-entry.error{color:var(--stat-r)}.wizard-progress{background:var(--border);border-radius:2px;height:4px;margin-bottom:12px;overflow:hidden}.wizard-progress-bar{background:var(--accent);width:0;height:100%;transition:width .4s}.wizard-progress-meta{justify-content:space-between;align-items:center;gap:12px;margin-bottom:8px;display:flex}.wizard-progress-label{color:var(--text);font-size:12px;font-weight:600}.wizard-progress-pct{color:var(--accent);font-size:12px;font-weight:700}.wizard-stage-list{flex-direction:column;gap:8px;margin-bottom:12px;display:flex}.wizard-stage-row{grid-template-columns:minmax(0,130px) 1fr 36px;align-items:center;gap:10px;display:grid}.wizard-stage-name{letter-spacing:.02em;color:var(--muted);text-transform:uppercase;font-size:11px;font-weight:700}.wizard-stage-track{border:1px solid var(--border);background:var(--bg);border-radius:999px;height:24px;position:relative;overflow:hidden}.wizard-stage-fill{background:var(--accent);width:0;position:absolute;inset:0 auto 0 0}@supports (color:color-mix(in lab,red,red)){.wizard-stage-fill{background:color-mix(in srgb,var(--accent) 18%,transparent)}}.wizard-stage-fill{transition:width .35s}.wizard-stage-track.is-active .wizard-stage-fill{background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.wizard-stage-track.is-active .wizard-stage-fill{background:color-mix(in srgb,var(--accent) 28%,transparent)}}.wizard-stage-track.is-done .wizard-stage-fill{background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.wizard-stage-track.is-done .wizard-stage-fill{background:color-mix(in srgb,var(--accent) 40%,transparent)}}.wizard-stage-track.is-error .wizard-stage-fill{background:var(--stat-r)}@supports (color:color-mix(in lab,red,red)){.wizard-stage-track.is-error .wizard-stage-fill{background:color-mix(in srgb,var(--stat-r) 32%,transparent)}}.wizard-stage-detail{z-index:1;color:var(--subtext);white-space:nowrap;text-overflow:ellipsis;padding:0 10px;font-size:11px;line-height:24px;display:block;position:relative;overflow:hidden}.wizard-stage-track.is-active .wizard-stage-detail{color:var(--text)}.wizard-stage-value{color:var(--muted);text-align:right;font-size:11px;font-weight:700}@media(max-width:640px){.wizard-panel{padding:24px 20px}.wizard-steps{flex-wrap:wrap}.wizard-stage-row{grid-template-columns:110px 1fr 32px}}.settings-modal{background:var(--surface);border-radius:var(--ui-radius);width:90%;max-width:460px;box-shadow:var(--shadow-hover)}.settings-header{justify-content:space-between;align-items:center;padding:20px 24px 0;display:flex}.settings-header h3{font-size:16px;font-weight:700}.settings-body{padding:16px 24px}.settings-section{margin-bottom:16px}.settings-backend-row{flex-direction:column;gap:4px;display:flex}.settings-backend-title{align-items:center;gap:8px;display:inline-flex}.settings-backend-badge{letter-spacing:.02em;text-transform:uppercase;background:var(--accent);border-radius:999px;justify-content:center;align-items:center;padding:2px 8px;font-size:10px;font-weight:700;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.settings-backend-badge{background:color-mix(in srgb,var(--accent) 16%,transparent)}}.settings-backend-badge{color:var(--accent)}.settings-backend-detail{color:var(--muted);padding:0 4px 2px 16px;font-size:12px}.settings-footer{border-top:1px solid var(--border);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;margin-top:8px;padding:16px 24px 20px;display:flex}.settings-footer-right{gap:8px;display:flex}@media(max-width:480px){.settings-footer{flex-direction:column-reverse;align-items:stretch}.settings-footer-right{justify-content:stretch}.settings-footer-right .wizard-btn{text-align:center;flex:1}.settings-footer .wizard-btn-danger{text-align:center}}.wizard-btn-danger{color:var(--stat-r);border:1px solid var(--stat-r);background:0 0;padding:8px 16px;font-size:12px}.wizard-btn-danger:hover{background:var(--stat-r);color:#fff}.modal-overlay{z-index:100;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#3c322659;justify-content:center;align-items:center;padding:16px;display:none;position:fixed;inset:0}.dark .modal-overlay{background:#0000008c}.modal-overlay.active{display:flex}.meth-modal{background:var(--bg);border:1px solid var(--border);border-radius:20px;flex-direction:column;width:min(1000px,100%);height:min(720px,100vh - 32px);display:flex;position:relative;overflow:hidden;box-shadow:0 1px 2px #0000000a,0 8px 24px #0000000f,0 32px 64px #00000014}.dark .meth-modal{box-shadow:0 1px 2px #0003,0 8px 24px #0003,0 32px 64px #00000040}.meth-progress{background:var(--border);z-index:20;opacity:.5;height:2px;position:absolute;top:0;left:0;right:0}.meth-progress-fill{background:linear-gradient(90deg,var(--accent),var(--accent));border-radius:0 1px 1px 0;width:0%;height:100%;transition:width .25s}@supports (color:color-mix(in lab,red,red)){.meth-progress-fill{background:linear-gradient(90deg,var(--accent),color-mix(in srgb,var(--accent) 50%,transparent))}}.meth-header{border-bottom:1px solid var(--border);background:var(--bg);z-index:10;flex-shrink:0;justify-content:space-between;align-items:center;padding:14px 22px;display:flex}.meth-header-left{align-items:center;gap:12px;display:flex}.meth-logo{background:var(--accent);width:32px;height:32px;box-shadow:0 2px 6px rgba(var(--accent-rgb),.2);border-radius:8px;justify-content:center;align-items:center;font-size:15px;display:flex}.meth-header-title{letter-spacing:-.02em;color:var(--text);font-family:Fraunces,serif;font-size:16px;font-weight:700}.meth-header-sub{color:var(--muted);margin-top:1px;font-size:11px}.modal-close{border:1px solid var(--border);background:var(--surface);width:32px;height:32px;color:var(--muted);cursor:pointer;border-radius:8px;justify-content:center;align-items:center;font-size:14px;transition:all .15s;display:flex}.modal-close:hover{border-color:var(--accent);color:var(--accent)}.modal-close svg{color:currentColor;width:16px;height:16px}.meth-scroll{scroll-snap-type:y mandatory;scrollbar-width:thin;scrollbar-color:rgba(var(--accent-rgb),.12) transparent;flex:1;height:0;min-height:0;overflow:hidden auto}.meth-scroll::-webkit-scrollbar{width:5px}.meth-scroll::-webkit-scrollbar-track{background:0 0}.meth-scroll::-webkit-scrollbar-thumb{background:rgba(var(--accent-rgb),.12);border-radius:3px}.meth-snap{scroll-snap-align:start;scroll-snap-stop:always;flex-direction:column;flex-shrink:0;height:100%;min-height:100%;display:flex;overflow:hidden}.meth-reveal{opacity:0;transition:opacity .6s cubic-bezier(.16,1,.3,1),transform .6s cubic-bezier(.16,1,.3,1);transform:translateY(20px)}.meth-reveal.vis{opacity:1;transform:translateY(0)}.meth-reveal.d1{transition-delay:80ms}.meth-reveal.d2{transition-delay:.16s}.meth-reveal.d3{transition-delay:.24s}.meth-reveal.d4{transition-delay:.32s}.meth-s1{background:radial-gradient(ellipse 55% 50% at 50% 85%,rgba(var(--accent-rgb),.06),transparent)}.dark .meth-s1{background:radial-gradient(ellipse 55% 50% at 50% 85%,rgba(var(--accent-rgb),.1),transparent)}.meth-s1-inner{flex-direction:column;flex:1;justify-content:center;padding:0 48px;display:flex}@media(max-width:640px){.meth-s1-inner{padding:0 20px}}.meth-hero{text-align:center;padding:40px 0 32px}.meth-hero-kicker{background:var(--accent-soft);text-transform:uppercase;letter-spacing:.12em;color:var(--accent);border-radius:999px;align-items:center;gap:7px;margin-bottom:20px;padding:6px 14px;font-family:JetBrains Mono,monospace;font-size:11px;font-weight:700;display:inline-flex}.meth-hero h1{letter-spacing:-.04em;color:var(--text);max-width:15ch;margin:0 auto;font-family:Fraunces,serif;font-size:clamp(34px,5.5vw,52px);font-weight:800;line-height:1.02}.meth-hero h1 em{color:var(--accent);font-style:italic;font-weight:600}.meth-hero-sub{color:var(--subtext,var(--muted));max-width:46ch;margin-top:16px;margin-left:auto;margin-right:auto;font-size:17px;line-height:1.6}.meth-pipeline-wrap{padding:0 0 28px}.meth-rule{color:var(--accent);align-items:center;gap:12px;margin-bottom:18px;font-family:Fraunces,serif;font-size:14px;font-weight:700;display:flex}.meth-rule:after{content:"";background:var(--border);flex:1;height:1px}.meth-process{grid-template-columns:repeat(4,1fr);gap:2px;display:grid}@media(max-width:700px){.meth-process{grid-template-columns:1fr 1fr}}.meth-step{background:var(--surface);border:1px solid var(--border);padding:22px 20px;transition:all .2s;position:relative}.meth-step:first-child{border-radius:12px 0 0 12px}.meth-step:last-child{border-radius:0 12px 12px 0}@media(max-width:700px){.meth-step:first-child{border-radius:12px 0 0}.meth-step:nth-child(2){border-radius:0 12px 0 0}.meth-step:nth-child(3){border-radius:0 0 0 12px}.meth-step:last-child{border-radius:0 0 12px}}.meth-step:hover{background:var(--accent-soft)}.meth-step-icon{background:linear-gradient(135deg,var(--accent),var(--accent));border-radius:9px;width:38px;height:38px}@supports (color:color-mix(in lab,red,red)){.meth-step-icon{background:linear-gradient(135deg,var(--accent),color-mix(in srgb,var(--accent) 70%,#a08060))}}.meth-step-icon{color:#f0e8de;box-shadow:0 4px 10px rgba(var(--accent-rgb),.2);justify-content:center;align-items:center;margin-bottom:12px;font-size:17px;display:flex}.meth-step h3{color:var(--text);margin-bottom:5px;font-family:Fraunces,serif;font-size:16px;font-weight:700}.meth-step p{color:var(--muted);font-size:13px;line-height:1.55}.meth-step:not(:last-child):after{content:"";z-index:2;background:var(--bg);border:1px solid var(--border);border-bottom:none;border-left:none;width:14px;height:14px;position:absolute;top:50%;right:-1px;transform:translate(50%)translateY(-50%)rotate(45deg)}@media(max-width:700px){.meth-step:not(:last-child):after{display:none}}.meth-scroll-hint{text-align:center;color:var(--muted);letter-spacing:.1em;text-transform:uppercase;flex-direction:column;align-items:center;gap:6px;padding:8px 0 16px;font-family:JetBrains Mono,monospace;font-size:10px;display:flex}.meth-scroll-arrow{border-right:2px solid var(--border);border-bottom:2px solid var(--border);width:14px;height:14px;animation:2s ease-in-out infinite methBob;transform:rotate(45deg)}@keyframes methBob{0%,to{transform:rotate(45deg)translate(0)}50%{transform:rotate(45deg)translate(2px,2px)}}.meth-s2{background:radial-gradient(circle at 80% 20%,rgba(var(--accent-rgb),.06),transparent 45%)}.dark .meth-s2{background:radial-gradient(circle at 80% 20%,rgba(var(--accent-rgb),.1),transparent 45%)}.meth-s2-inner{flex-direction:column;flex:1;justify-content:center;padding:0 48px;display:flex}@media(max-width:640px){.meth-s2-inner{padding:0 20px}}.meth-s2-header{text-align:center;margin-bottom:36px}.meth-s2-header h2{letter-spacing:-.03em;color:var(--text);font-family:Fraunces,serif;font-size:clamp(28px,4vw,40px);font-weight:800;line-height:1.05}.meth-s2-header p{color:var(--subtext,var(--muted));max-width:48ch;margin-top:10px;margin-left:auto;margin-right:auto;font-size:16px;line-height:1.6}.meth-taste-grid{grid-template-columns:repeat(4,1fr);gap:14px;display:grid}@media(max-width:800px){.meth-taste-grid{grid-template-columns:1fr 1fr}}@media(max-width:480px){.meth-taste-grid{grid-template-columns:1fr}}.meth-taste-card{background:var(--surface);border:1px solid var(--border);box-shadow:var(--shadow);border-radius:16px;padding:24px 22px;position:relative;overflow:hidden}.meth-taste-card:before{content:"";background:var(--tc,var(--accent));height:3px;position:absolute;top:0;left:0;right:0}.meth-taste-cat{color:var(--text);margin-bottom:16px;font-family:Fraunces,serif;font-size:17px;font-weight:700}.meth-taste-list{flex-direction:column;display:flex}.meth-taste-item{border-bottom:1px solid var(--border);justify-content:space-between;align-items:baseline;gap:6px;padding:9px 0;font-size:13px;display:flex}.meth-taste-item:last-child{border-bottom:none}.meth-taste-name{color:var(--text);white-space:nowrap;font-weight:600}.meth-taste-note{color:var(--muted);text-align:right;font-size:11px}.meth-s3{background:radial-gradient(ellipse 60% 50% at 30% 70%,rgba(var(--accent-rgb),.06),transparent)}.dark .meth-s3{background:radial-gradient(ellipse 60% 50% at 30% 70%,rgba(var(--accent-rgb),.1),transparent)}.meth-s3-inner{flex-direction:column;flex:1;min-height:0;padding:28px 48px 24px;display:flex}@media(max-width:640px){.meth-s3-inner{padding:24px 20px 20px}}.meth-s3-header{margin-bottom:20px}.meth-s3-header h2{letter-spacing:-.03em;color:var(--text);font-family:Fraunces,serif;font-size:clamp(26px,3.5vw,36px);font-weight:800;line-height:1.05}.meth-s3-header p{color:var(--subtext,var(--muted));margin-top:8px;font-size:15px;line-height:1.55}.meth-persona-layout{flex:1;grid-template-columns:210px 1fr;gap:16px;min-height:0;display:grid}@media(max-width:760px){.meth-persona-layout{grid-template-rows:auto 1fr;grid-template-columns:1fr}}.meth-persona-list{scrollbar-width:thin;scrollbar-color:rgba(var(--accent-rgb),.1) transparent;flex-direction:column;gap:6px;display:flex;overflow-y:auto}@media(max-width:760px){.meth-persona-list{flex-direction:row;gap:8px;padding-bottom:4px;overflow:auto hidden}}.meth-p-thumb{background:var(--surface);cursor:pointer;box-shadow:var(--shadow);border:2px solid #0000;border-radius:13px;flex-shrink:0;align-items:center;gap:12px;padding:11px 14px;transition:all .2s;display:flex}.meth-p-thumb:hover{border-color:var(--border);transform:translateY(-1px)}.meth-p-thumb.active{border-color:var(--pa,var(--accent));background:var(--pa,var(--accent))}@supports (color:color-mix(in lab,red,red)){.meth-p-thumb.active{background:color-mix(in srgb,var(--pa,var(--accent)) 6%,var(--surface))}}.meth-p-thumb.active{box-shadow:0 0 0 3px var(--pa),var(--shadow)}@supports (color:color-mix(in lab,red,red)){.meth-p-thumb.active{box-shadow:0 0 0 3px color-mix(in srgb,var(--pa) 10%,transparent),var(--shadow)}}.meth-p-thumb-img{background:var(--bg);border-radius:10px;flex-shrink:0;justify-content:center;align-items:center;width:44px;height:44px;display:flex;overflow:hidden}.meth-p-thumb-img img{object-fit:contain;filter:drop-shadow(0 2px 4px #0000001a);width:90%;height:90%}.meth-p-thumb-text{min-width:0}.meth-p-thumb-name{color:var(--text);white-space:nowrap;text-overflow:ellipsis;font-family:Fraunces,serif;font-size:14px;font-weight:700;overflow:hidden}.meth-p-thumb-trait{color:var(--muted);-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:11px;line-height:1.35;display:-webkit-box;overflow:hidden}@media(max-width:760px){.meth-p-thumb{text-align:center;flex-direction:column;gap:6px;min-width:100px;padding:8px 14px}.meth-p-thumb-trait{display:none}}.meth-pd{background:var(--surface);border:1px solid var(--border);min-height:0;box-shadow:var(--shadow);border-radius:18px;grid-template-columns:240px 1fr;display:grid;overflow:hidden}@media(max-width:900px){.meth-pd{grid-template-columns:200px 1fr}}@media(max-width:760px){.meth-pd{grid-template-rows:180px 1fr;grid-template-columns:1fr}}.meth-pd-art{background:var(--pd-gradient,linear-gradient(160deg,#ede6de,#f5f3f0));border-right:1px solid var(--border);justify-content:center;align-items:center;padding:20px;display:flex;position:relative;overflow:hidden}@media(max-width:760px){.meth-pd-art{border-right:none;border-bottom:1px solid var(--border)}}.meth-pd-art:after{content:"";background:radial-gradient(circle at 50% 80%,#0000 40%,#fff3);position:absolute;inset:0}.dark .meth-pd-art{background:var(--pd-gradient-dark,linear-gradient(160deg,#2e2822,#1c1816))}.dark .meth-pd-art:after{background:radial-gradient(circle at 50% 80%,#0000 40%,#00000026)}.meth-pd-art img{object-fit:contain;z-index:1;filter:drop-shadow(0 10px 20px #00000026);width:auto;max-width:90%;height:82%;transition:transform .4s cubic-bezier(.16,1,.3,1),opacity .25s;position:relative}.meth-pd-copy{scrollbar-width:thin;scrollbar-color:rgba(var(--accent-rgb),.1) transparent;flex-direction:column;padding:24px 28px;display:flex;overflow-y:auto}@media(max-width:640px){.meth-pd-copy{padding:18px 20px}}.meth-pd-badge{text-transform:uppercase;letter-spacing:.1em;color:var(--pa,var(--accent));margin-bottom:5px;font-family:JetBrains Mono,monospace;font-size:11px;font-weight:700}.meth-pd-name{letter-spacing:-.04em;color:var(--text);margin-bottom:12px;font-family:Fraunces,serif;font-size:clamp(28px,3.5vw,38px);font-weight:800;line-height:.95}.meth-pd-desc{color:var(--subtext,var(--muted));margin-bottom:18px;font-size:15px;line-height:1.6}.meth-pd-cards{grid-template-columns:1fr 1fr;gap:10px;margin-bottom:16px;display:grid}@media(max-width:500px){.meth-pd-cards{grid-template-columns:1fr}}.meth-pd-card{background:var(--accent-soft);border:1px solid var(--border);border-radius:12px;padding:14px 16px}.meth-pd-card-label{text-transform:uppercase;letter-spacing:.08em;color:var(--muted);margin-bottom:6px;font-family:JetBrains Mono,monospace;font-size:10px;font-weight:700}.meth-pd-card-text{color:var(--text);font-size:13px;line-height:1.55}.meth-pd-axes{grid-template-columns:repeat(2,1fr);gap:14px;display:grid}@media(max-width:600px){.meth-pd-axes{grid-template-columns:1fr}}.meth-ax{flex-direction:column;gap:5px;display:flex}.meth-ax-label{color:var(--text);justify-content:space-between;font-size:11px;font-weight:600;display:flex}.meth-ax-label span:last-child{color:var(--muted);font-family:JetBrains Mono,monospace}.meth-ax-track{background:var(--border);border-radius:3px;height:6px;overflow:hidden}.meth-ax-fill{background:var(--pa,var(--accent));border-radius:3px;height:100%;transition:width .5s cubic-bezier(.16,1,.3,1)}.meth-bottom{border-top:1px solid var(--border);background:var(--bg);flex-wrap:wrap;flex-shrink:0;justify-content:space-between;align-items:center;gap:12px;padding:12px 22px;display:flex}.meth-bottom-note{color:var(--muted);max-width:50ch;font-size:11px;line-height:1.5}.meth-dot-nav{align-items:center;gap:6px;display:flex}.meth-dot{background:var(--border);cursor:pointer;border:none;border-radius:50%;width:8px;height:8px;transition:all .2s}.meth-dot.active{background:var(--accent);box-shadow:0 0 6px rgba(var(--accent-rgb),.25)}.meth-dot:hover{background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.meth-dot:hover{background:color-mix(in srgb,var(--accent) 50%,var(--border))}}@media(prefers-reduced-motion:reduce){.meth-reveal{opacity:1!important;transition:none!important;transform:none!important}.meth-scroll-arrow{animation:none!important}}.card-label{text-transform:uppercase;letter-spacing:.05em;color:var(--muted);margin-bottom:8px;font-size:12px;font-weight:600}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}
@@ -1 +0,0 @@
1
- import"./wrapped.astro_astro_type_script_index_1_lang.CPAAJDh5.js";
@@ -1 +0,0 @@
1
- /*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-space-y-reverse:0;--tw-border-style:solid;--tw-font-weight:initial;--tw-tracking:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial}}}@layer theme{:root,:host{--font-sans:"DM Sans", system-ui, -apple-system, sans-serif;--font-serif:"Fraunces", Georgia, serif;--font-mono:"JetBrains Mono", "SF Mono", Menlo, monospace;--spacing:.25rem;--container-md:28rem;--container-lg:32rem;--container-3xl:48rem;--container-4xl:56rem;--text-xs:.75rem;--text-xs--line-height:calc(1 / .75);--text-sm:.875rem;--text-sm--line-height:calc(1.25 / .875);--text-base:1rem;--text-base--line-height: 1.5 ;--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75 / 1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2 / 1.5);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5 / 2.25);--text-5xl:3rem;--text-5xl--line-height:1;--text-6xl:3.75rem;--text-6xl--line-height:1;--text-7xl:4.5rem;--text-7xl--line-height:1;--text-8xl:6rem;--text-8xl--line-height:1;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--tracking-wider:.05em;--tracking-widest:.1em;--radius-sm:.25rem;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono);--color-bg:var(--bg);--color-text:var(--text);--color-muted:var(--muted);--color-border:var(--border);--grid-template-columns-24:repeat(24, minmax(0, 1fr))}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*{box-sizing:border-box;margin:0;padding:0}html,body{height:100%}body{font-family:var(--font-sans);background:var(--bg);color:var(--text);-webkit-font-smoothing:antialiased;touch-action:manipulation}}@layer components{@keyframes fadeIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes spin{to{transform:rotate(360deg)}}@keyframes methBob{0%,to{transform:rotate(45deg)translate(0)}50%{transform:rotate(45deg)translate(2px,2px)}}.animate{animation:.4s forwards fadeIn}.delay-1{opacity:0;animation-delay:50ms}.delay-2{opacity:0;animation-delay:.1s}.delay-3{opacity:0;animation-delay:.15s}.delay-4{opacity:0;animation-delay:.2s}.delay-5{opacity:0;animation-delay:.25s}.refreshing .refresh-icon{animation:.8s linear infinite spin}.top-nav{z-index:50;background:var(--bg);position:sticky;top:0}.source-bar{border-bottom:1px solid var(--border);flex-wrap:wrap;flex-shrink:0;align-items:center;gap:6px;padding:8px 24px;display:flex}.source-pill{color:var(--muted);border:1px solid var(--border);cursor:pointer;white-space:nowrap;background:0 0;border-radius:999px;align-items:center;gap:6px;padding:6px 14px;font-family:inherit;font-size:13px;font-weight:500;transition:all .2s;display:inline-flex}.source-pill:hover{border-color:var(--text);color:var(--text)}.source-pill.active{background:var(--text);color:var(--bg);border-color:var(--text);font-weight:600}.source-pill-dot{border-radius:50%;flex-shrink:0;width:8px;height:8px}@media(max-width:640px){.source-bar{gap:4px;padding:6px 12px}.source-pill{padding:5px 10px;font-size:12px}}.card-dock{perspective:1200px}.player-card{transform-style:preserve-3d;will-change:transform;border:1px solid #0000000f;transition:transform .15s ease-out,box-shadow .2s ease-out;box-shadow:0 1px 2px #0000000a,0 4px 12px #0000000f,0 12px 32px #00000014,0 24px 60px #0000000f;container-type:inline-size}.dark .player-card{border-color:#ffffff0f;box-shadow:0 1px 2px #0003,0 4px 12px #0003,0 12px 32px #00000040,0 24px 60px #0003}.persona-name{text-shadow:0 2px 8px #0000004d;font-size:clamp(26px,6cqw,36px)}.donut-ring svg{transform:rotate(-90deg)}.donut-fill{transition:stroke-dashoffset .6s}.stat-block:not(:last-child):after{content:"";background:var(--border);width:1px;height:60%;position:absolute;top:20%;right:0}.trend-dot{transition:r .1s}.trend-tooltip:after{content:"";border:5px solid #0000;border-top-color:var(--text);position:absolute;top:100%;left:50%;transform:translate(-50%)}.heatmap-cell.l1{background:var(--heatmap-color,var(--accent));opacity:.2}.heatmap-cell.l2{background:var(--heatmap-color,var(--accent));opacity:.35}.heatmap-cell.l3{background:var(--heatmap-color,var(--accent));opacity:.55}.heatmap-cell.l4{background:var(--heatmap-color,var(--accent));opacity:.75}.heatmap-cell.l5{background:var(--heatmap-color,var(--accent));opacity:1}.heatmap-tooltip:after{content:"";border:4px solid #0000;border-top-color:var(--text);position:absolute;top:100%;left:50%;transform:translate(-50%)}.meth-modal{box-shadow:0 1px 2px #0000000a,0 8px 24px #0000000f,0 32px 64px #00000014}.dark .meth-modal{box-shadow:0 1px 2px #0003,0 8px 24px #0003,0 32px 64px #00000040}.meth-progress-fill{background:linear-gradient(90deg,var(--accent),var(--accent))}@supports (color:color-mix(in lab,red,red)){.meth-progress-fill{background:linear-gradient(90deg,var(--accent),color-mix(in srgb,var(--accent) 50%,transparent))}}.meth-step-icon{background:linear-gradient(135deg,var(--accent),var(--accent))}@supports (color:color-mix(in lab,red,red)){.meth-step-icon{background:linear-gradient(135deg,var(--accent),color-mix(in srgb,var(--accent) 70%,#a08060))}}.meth-step-icon{box-shadow:0 4px 10px rgba(var(--accent-rgb),.2)}.meth-step:not(:last-child):after{content:"";z-index:2;background:var(--bg);border:1px solid var(--border);border-bottom:none;border-left:none;width:14px;height:14px;position:absolute;top:50%;right:-1px;transform:translate(50%)translateY(-50%)rotate(45deg)}@media(max-width:700px){.meth-step:not(:last-child):after{display:none}}.meth-scroll-arrow{animation:2s ease-in-out infinite methBob}.meth-s1{background:radial-gradient(ellipse 55% 50% at 50% 85%,rgba(var(--accent-rgb),.06),transparent)}.meth-s2{background:radial-gradient(circle at 80% 20%,rgba(var(--accent-rgb),.06),transparent 45%)}.meth-s3{background:radial-gradient(ellipse 60% 50% at 30% 70%,rgba(var(--accent-rgb),.06),transparent)}.dark .meth-s1{background:radial-gradient(ellipse 55% 50% at 50% 85%,rgba(var(--accent-rgb),.1),transparent)}.dark .meth-s2{background:radial-gradient(circle at 80% 20%,rgba(var(--accent-rgb),.1),transparent 45%)}.dark .meth-s3{background:radial-gradient(ellipse 60% 50% at 30% 70%,rgba(var(--accent-rgb),.1),transparent)}.meth-taste-card:before{content:"";background:var(--tc,var(--accent));height:3px;position:absolute;top:0;left:0;right:0}.meth-pd-art:after{content:"";background:radial-gradient(circle at 50% 80%,#0000 40%,#fff3);position:absolute;inset:0}.dark .meth-pd-art:after{background:radial-gradient(circle at 50% 80%,#0000 40%,#00000026)}.meth-p-thumb.active{box-shadow:0 0 0 3px var(--pa),var(--shadow)}@supports (color:color-mix(in lab,red,red)){.meth-p-thumb.active{box-shadow:0 0 0 3px color-mix(in srgb,var(--pa) 10%,transparent),var(--shadow)}}.meth-reveal{opacity:0;transition:opacity .6s cubic-bezier(.16,1,.3,1),transform .6s cubic-bezier(.16,1,.3,1);transform:translateY(20px)}.meth-reveal.vis{opacity:1;transform:translateY(0)}.meth-reveal.d1{transition-delay:80ms}.meth-reveal.d2{transition-delay:.16s}.meth-reveal.d3{transition-delay:.24s}.meth-reveal.d4{transition-delay:.32s}.wizard-stage-fill{background:var(--accent);transition:width .35s}@supports (color:color-mix(in lab,red,red)){.wizard-stage-fill{background:color-mix(in srgb,var(--accent) 18%,transparent)}}.wizard-stage-track.is-active .wizard-stage-fill{background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.wizard-stage-track.is-active .wizard-stage-fill{background:color-mix(in srgb,var(--accent) 28%,transparent)}}.wizard-stage-track.is-done .wizard-stage-fill{background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.wizard-stage-track.is-done .wizard-stage-fill{background:color-mix(in srgb,var(--accent) 40%,transparent)}}.wizard-stage-track.is-error .wizard-stage-fill{background:var(--stat-r)}@supports (color:color-mix(in lab,red,red)){.wizard-stage-track.is-error .wizard-stage-fill{background:color-mix(in srgb,var(--stat-r) 32%,transparent)}}:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:var(--ui-radius-sm)}@media(prefers-reduced-motion:reduce){*,:before,:after{transition:none!important;animation:none!important}.player-card{transform:none!important}.meth-reveal{opacity:1!important;transform:none!important}}}@layer utilities{.absolute{position:absolute}.relative{position:relative}.static{position:static}.top-1\/2{top:50%}.bottom-12{bottom:calc(var(--spacing) * 12)}.container{width:100%}@media(min-width:40rem){.container{max-width:40rem}}@media(min-width:48rem){.container{max-width:48rem}}@media(min-width:64rem){.container{max-width:64rem}}@media(min-width:80rem){.container{max-width:80rem}}@media(min-width:96rem){.container{max-width:96rem}}.mx-2{margin-inline:calc(var(--spacing) * 2)}.mx-auto{margin-inline:auto}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-3{margin-top:calc(var(--spacing) * 3)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-6{margin-top:calc(var(--spacing) * 6)}.mt-16{margin-top:calc(var(--spacing) * 16)}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.mb-10{margin-bottom:calc(var(--spacing) * 10)}.mb-12{margin-bottom:calc(var(--spacing) * 12)}.ml-12{margin-left:calc(var(--spacing) * 12)}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.aspect-square{aspect-ratio:1}.h-2{height:calc(var(--spacing) * 2)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.min-h-screen{min-height:100vh}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-8{width:calc(var(--spacing) * 8)}.w-12{width:calc(var(--spacing) * 12)}.w-full{width:100%}.max-w-3xl{max-width:var(--container-3xl)}.max-w-4xl{max-width:var(--container-4xl)}.max-w-lg{max-width:var(--container-lg)}.max-w-md{max-width:var(--container-md)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.cursor-pointer{cursor:pointer}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-24{grid-template-columns:var(--grid-template-columns-24)}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-\[1px\]{gap:1px}.gap-\[2px\]{gap:2px}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing) * 1) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 1) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-\[2px\]>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(2px * var(--tw-space-y-reverse));margin-block-end:calc(2px * calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.rounded-full{border-radius:3.40282e38px}.rounded-sm{border-radius:var(--radius-sm)}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-border{border-color:var(--color-border)}.bg-bg{background-color:var(--color-bg)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-8{padding-block:calc(var(--spacing) * 8)}.py-20{padding-block:calc(var(--spacing) * 20)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-14{padding-top:calc(var(--spacing) * 14)}.pb-4{padding-bottom:calc(var(--spacing) * 4)}.text-center{text-align:center}.font-mono{font-family:var(--font-mono)}.font-sans{font-family:var(--font-sans)}.font-serif{font-family:var(--font-serif)}.text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.text-7xl{font-size:var(--text-7xl);line-height:var(--tw-leading,var(--text-7xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[10px\]{font-size:10px}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.tracking-wider{--tw-tracking:var(--tracking-wider);letter-spacing:var(--tracking-wider)}.tracking-widest{--tw-tracking:var(--tracking-widest);letter-spacing:var(--tracking-widest)}.text-muted,.text-muted\/40{color:var(--color-muted)}@supports (color:color-mix(in lab,red,red)){.text-muted\/40{color:color-mix(in oklab,var(--color-muted) 40%,transparent)}}.text-muted\/60{color:var(--color-muted)}@supports (color:color-mix(in lab,red,red)){.text-muted\/60{color:color-mix(in oklab,var(--color-muted) 60%,transparent)}}.text-text,.text-text\/80{color:var(--color-text)}@supports (color:color-mix(in lab,red,red)){.text-text\/80{color:color-mix(in oklab,var(--color-text) 80%,transparent)}}.text-text\/90{color:var(--color-text)}@supports (color:color-mix(in lab,red,red)){.text-text\/90{color:color-mix(in oklab,var(--color-text) 90%,transparent)}}.uppercase{text-transform:uppercase}.italic{font-style:italic}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.shadow-md{--tw-shadow:0 4px 6px -1px var(--tw-shadow-color,#0000001a), 0 2px 4px -2px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.invert{--tw-invert:invert(100%);filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.delay-1{transition-delay:1ms}.delay-2{transition-delay:2ms}.delay-3{transition-delay:3ms}.duration-300{--tw-duration:.3s;transition-duration:.3s}@media(hover:hover){.hover\:text-text:hover{color:var(--color-text)}}@media(min-width:40rem){.sm\:mb-8{margin-bottom:calc(var(--spacing) * 8)}.sm\:flex{display:flex}.sm\:gap-4{gap:calc(var(--spacing) * 4)}.sm\:gap-6{gap:calc(var(--spacing) * 6)}.sm\:gap-\[2px\]{gap:2px}.sm\:p-4{padding:calc(var(--spacing) * 4)}.sm\:p-6{padding:calc(var(--spacing) * 6)}.sm\:px-6{padding-inline:calc(var(--spacing) * 6)}.sm\:py-20{padding-block:calc(var(--spacing) * 20)}.sm\:text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.sm\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}.sm\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.sm\:text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.sm\:text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.sm\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.sm\:text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}}@media(min-width:48rem){.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\:p-8{padding:calc(var(--spacing) * 8)}.md\:text-5xl{font-size:var(--text-5xl);line-height:var(--tw-leading,var(--text-5xl--line-height))}.md\:text-6xl{font-size:var(--text-6xl);line-height:var(--tw-leading,var(--text-6xl--line-height))}.md\:text-8xl{font-size:var(--text-8xl);line-height:var(--tw-leading,var(--text-8xl--line-height))}}@media(min-width:64rem){.lg\:grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}}}:root{--bg:#f5f3f0;--surface:#fff;--surface-raised:#faf8f5;--text:#3c3226;--subtext:#6b5e50;--muted:#8a7d6f;--border:#d9d2c9;--border-light:#ebe5dc;--accent:#5c3d2e;--accent-soft:#ede6de;--accent-rgb:92,61,46;--ui-radius:14px;--ui-radius-sm:8px;--shadow:0 1px 3px #3c32260f, 0 4px 12px #3c32260a;--shadow-hover:0 4px 12px #3c32261a, 0 8px 24px #3c32260f;--stat-b:#1a5bdb;--stat-r:#d20f39}.dark{--bg:#1c1816;--surface:#2a2420;--surface-raised:#332c26;--text:#e0d6cc;--subtext:#b0a596;--muted:#8a7d6f;--border:#3d342c;--border-light:#4a3f35;--accent:#c9a882;--accent-soft:#2e261f;--accent-rgb:201,168,130;--shadow:0 1px 3px #0000004d, 0 4px 12px #0003;--shadow-hover:0 4px 12px #0006, 0 8px 24px #0000004d;--stat-b:#89b4fa;--stat-r:#f38ba8}.header{background:var(--bg);flex-wrap:wrap;flex-shrink:0;justify-content:space-between;align-items:center;gap:12px;padding:12px 24px;display:flex}.header-left{flex-wrap:wrap;align-items:baseline;gap:12px;display:flex}.header h1{letter-spacing:-.02em;font-size:24px;font-weight:700}.header h1 span{color:var(--accent)}.header-subtitle{color:var(--muted);font-size:20px;font-weight:500}.date-range{color:var(--muted);font-size:14px;font-weight:500}.header-right{align-items:center;gap:12px;display:flex}.nav-link,.accent-link{color:var(--text);background:var(--surface);border:1px solid var(--border);cursor:pointer;white-space:nowrap;border-radius:20px;justify-content:center;align-items:center;gap:6px;padding:8px 14px;font-family:inherit;font-size:13px;font-weight:600;text-decoration:none;transition:all .15s;display:inline-flex}.nav-link:hover,.accent-link:hover{border-color:var(--accent);color:var(--accent);background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.nav-link:hover,.accent-link:hover{background:color-mix(in srgb,var(--accent) 10%,var(--surface))}}.create-dropdown{position:relative}.create-btn{color:var(--accent);background:var(--accent-soft);border:1px solid var(--accent);align-items:center;gap:7px;padding:8px 14px;font-size:13px;font-weight:700;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.create-btn{border:1px solid color-mix(in srgb,var(--accent) 35%,var(--border))}}.create-btn{cursor:pointer;white-space:nowrap;border-radius:20px;font-family:inherit;transition:all .15s}.create-btn:hover,.create-dropdown.open .create-btn{border-color:var(--accent);color:var(--accent);background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.create-btn:hover,.create-dropdown.open .create-btn{background:color-mix(in srgb,var(--accent) 18%,var(--surface))}}.create-menu{background:var(--surface);border:1px solid var(--border);border-radius:var(--ui-radius-sm);width:min(560px,100vw - 32px);box-shadow:var(--shadow-hover);z-index:80;padding:12px;position:absolute;top:calc(100% + 10px);right:0}.create-menu[hidden]{display:none}.create-menu-copy{margin-bottom:10px}.create-kicker{letter-spacing:.02em;text-transform:uppercase;color:var(--text);margin:0 0 4px;font-size:12px;font-weight:700}.create-subcopy{color:var(--muted);margin:0;font-size:12px;line-height:1.45}.command-strip{background:linear-gradient(180deg,var(--bg),var(--bg));justify-content:space-between;align-items:center;gap:12px;padding:10px 12px;display:flex}@supports (color:color-mix(in lab,red,red)){.command-strip{background:linear-gradient(180deg,color-mix(in srgb,var(--bg) 74%,transparent),color-mix(in srgb,var(--bg) 92%,transparent))}}.command-strip{border:1px solid var(--border)}@supports (color:color-mix(in lab,red,red)){.command-strip{border:1px solid color-mix(in srgb,var(--border) 92%,transparent)}}.command-strip{border-radius:12px}.command-line-wrap{flex:1;min-width:0}.command-line{color:var(--text);white-space:nowrap;align-items:center;gap:10px;font-family:JetBrains Mono,monospace;font-size:13px;display:flex;overflow:auto}.command-prompt{color:var(--accent);font-weight:700}.command-actions{flex-shrink:0;align-items:center;gap:8px;display:flex}.create-copy-btn,.create-source-link{white-space:nowrap;border-radius:999px;align-items:center;gap:6px;padding:7px 10px;font-family:inherit;font-size:12px;font-weight:600;text-decoration:none;transition:all .15s;display:inline-flex}.create-copy-btn{border:1px solid var(--border);color:var(--text);cursor:pointer;background:0 0}.create-copy-btn:hover,.create-source-link:hover{border-color:var(--accent);color:var(--accent);background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.create-copy-btn:hover,.create-source-link:hover{background:color-mix(in srgb,var(--accent) 10%,transparent)}}.create-copy-btn.is-copied{color:#2f8f5b;background:#2f8f5b1a;border-color:#2f8f5b}.create-source-link{border:1px solid var(--border);color:var(--muted);background:0 0}.theme-btn{border:1px solid var(--border);background:var(--surface);cursor:pointer;width:36px;height:36px;color:var(--muted);border-radius:50%;justify-content:center;align-items:center;transition:all .2s;display:flex}.theme-btn:hover{border-color:var(--accent);color:var(--accent)}.wizard-config{flex-direction:column;gap:8px;margin-bottom:16px;display:flex}.wizard-toggle{border:1px solid var(--border);border-radius:var(--ui-radius-sm);cursor:pointer;align-items:center;gap:12px;padding:10px 16px;font-size:14px;font-weight:500;transition:border-color .15s;display:flex}.wizard-toggle:has(input:checked){border-color:var(--accent)}.wizard-toggle input[type=checkbox]{accent-color:var(--accent);width:16px;height:16px}.wizard-toggle.is-disabled{cursor:not-allowed;opacity:.65}.wizard-label{margin-bottom:6px;font-size:13px;font-weight:600;display:block}.wizard-hint{color:var(--muted);margin-top:8px;font-size:11px}.wizard-loading{color:var(--muted);text-align:center;padding:24px 0;font-size:13px}.exclusion-chips{flex-direction:column;gap:6px;margin-bottom:8px;display:flex}.exclusion-chip{background:var(--bg);border:1px solid var(--border);border-radius:var(--ui-radius-sm);align-items:center;gap:8px;padding:8px 12px;font-size:12px;display:flex}.exclusion-chip-path{text-overflow:ellipsis;white-space:nowrap;color:var(--text);flex:1;font-family:JetBrains Mono,monospace;overflow:hidden}.exclusion-chip-count{color:var(--muted);white-space:nowrap;font-size:11px}.exclusion-chip-remove{cursor:pointer;color:var(--muted);background:0 0;border:none;padding:2px;font-size:16px;line-height:1;transition:color .15s}.exclusion-chip-remove:hover{color:var(--stat-r)}.exclusion-add-btn{align-items:center;gap:6px;padding:8px 16px;font-size:12px;display:inline-flex}.wizard-btn{cursor:pointer;border:none;border-radius:20px;padding:10px 24px;font-family:inherit;font-size:13px;font-weight:600;transition:transform .1s}.wizard-btn:hover{transform:scale(1.03)}.wizard-btn-primary{background:var(--accent);color:#fff}.wizard-btn-ghost{background:var(--bg);color:var(--text);border:1px solid var(--border)}.wizard-btn-danger{color:var(--stat-r);border:1px solid var(--stat-r);background:0 0;padding:8px 16px;font-size:12px}.wizard-btn-danger:hover{background:var(--stat-r);color:#fff}.wizard-progress{background:var(--border);border-radius:2px;height:4px;margin-bottom:12px;overflow:hidden}.wizard-progress-bar{background:var(--accent);width:0;height:100%;transition:width .4s}.wizard-log{background:var(--bg);border:1px solid var(--border);border-radius:var(--ui-radius-sm);height:180px;margin-bottom:16px;padding:12px;font-family:JetBrains Mono,monospace;font-size:12px;overflow-y:auto}.wizard-log-entry{color:var(--subtext);padding:2px 0}.wizard-log-entry.done{color:var(--accent);font-weight:600}.wizard-log-entry.error{color:var(--stat-r)}.settings-modal{background:var(--surface);border-radius:var(--ui-radius);width:90%;max-width:460px;box-shadow:var(--shadow-hover)}.settings-header{justify-content:space-between;align-items:center;padding:20px 24px 0;display:flex}.settings-header h3{font-size:16px;font-weight:700}.settings-body{padding:16px 24px}.settings-section{margin-bottom:16px}.settings-backend-row{flex-direction:column;gap:4px;display:flex}.settings-backend-title{align-items:center;gap:8px;display:inline-flex}.settings-backend-badge{letter-spacing:.02em;text-transform:uppercase;background:var(--accent);border-radius:999px;justify-content:center;align-items:center;padding:2px 8px;font-size:10px;font-weight:700;display:inline-flex}@supports (color:color-mix(in lab,red,red)){.settings-backend-badge{background:color-mix(in srgb,var(--accent) 16%,transparent)}}.settings-backend-badge{color:var(--accent)}.settings-backend-detail{color:var(--muted);padding:0 4px 2px 16px;font-size:12px}.settings-footer{border-top:1px solid var(--border);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;margin-top:8px;padding:16px 24px 20px;display:flex}.settings-footer-right{gap:8px;display:flex}.refresh-modal{background:var(--surface);border-radius:var(--ui-radius);width:90%;max-width:480px;box-shadow:var(--shadow-hover);text-align:center;padding:28px 32px}.refresh-modal h3{margin-bottom:16px;font-size:16px;font-weight:700}.refresh-modal .wizard-log{text-align:left;height:180px;margin-bottom:12px}.refresh-modal .wizard-progress{margin-bottom:12px}.refresh-modal-result{color:var(--text);font-size:14px;line-height:1.8}.refresh-modal-result .result-num{color:var(--accent);font-family:JetBrains Mono,monospace;font-weight:700}.refresh-modal-close{background:var(--accent);color:#fff;cursor:pointer;border:none;border-radius:20px;margin-top:16px;padding:8px 24px;font-family:inherit;font-size:13px;font-weight:600;transition:transform .1s}.refresh-modal-close:hover{transform:scale(1.03)}@media(max-width:640px){.header{gap:8px;padding:10px 16px}.header-right{gap:8px}.header-right .nav-link{display:none}.create-menu{width:min(420px,100vw - 32px);left:0;right:auto}.command-strip{flex-direction:column;align-items:stretch}.command-actions{flex-wrap:wrap;justify-content:flex-start}}@media(max-width:480px){.settings-footer{flex-direction:column-reverse;align-items:stretch}.settings-footer-right{justify-content:stretch}.settings-footer-right .wizard-btn{text-align:center;flex:1}.settings-footer .wizard-btn-danger{text-align:center}}html{scroll-snap-type:y mandatory;scroll-behavior:smooth}section{scroll-snap-align:start;scroll-snap-stop:always}.top-nav{z-index:60;background:var(--bg);position:fixed;top:0;left:0;right:0}@keyframes fadeInWrapped{0%{opacity:0}to{opacity:1}}@keyframes fadeInUp{0%{opacity:0;transform:translateY(30px)}to{opacity:1;transform:translateY(0)}}.animate-fade-in{animation:1s ease-out forwards fadeInWrapped}.animate-fade-in-up{animation:.8s ease-out forwards fadeInUp}.delay-1{opacity:0;animation-delay:.3s}.delay-2{opacity:0;animation-delay:.6s}.stat-accent{color:var(--accent)}.gradient-text{background:linear-gradient(135deg,var(--accent),rgba(var(--accent-rgb),.6));-webkit-text-fill-color:transparent;-webkit-background-clip:text;background-clip:text}.heatmap-cell{transition:all .3s}.heatmap-cell:hover{z-index:10;transform:scale(1.2)}.card{background:var(--surface);border:1px solid var(--border);border-radius:12px}.scroll-hint{animation:2s infinite bounce}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}}.tabular-nums{font-variant-numeric:tabular-nums}.refresh-btn{cursor:pointer;border:1px solid var(--border);color:var(--text);background:0 0;border-radius:999px;align-items:center;gap:5px;padding:4px 12px;font-family:inherit;font-size:13px;transition:border-color .2s;display:inline-flex}.refresh-btn:hover{border-color:var(--accent)}.icon-sm{width:16px;height:16px}.arc-gauge{width:140px;height:140px;margin:0 auto;position:relative}.arc-gauge svg{width:100%;height:100%}.arc-gauge .arc-track{fill:none;stroke:var(--border);stroke-width:8px;opacity:.3}.arc-gauge .arc-fill{fill:none;stroke:var(--accent);stroke-width:8px;stroke-linecap:round;transition:stroke-dashoffset 1s}.arc-gauge-inner{flex-direction:column;justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.donut-ring{flex-shrink:0;width:56px;height:56px;position:relative}.donut-ring svg{width:100%;height:100%;transform:rotate(-90deg)}.donut-ring .donut-track{fill:none;stroke:var(--border);stroke-width:5px}.donut-ring .donut-fill{fill:none;stroke:var(--accent);stroke-width:5px;stroke-linecap:round;transition:stroke-dashoffset .8s}.donut-val{color:var(--text);justify-content:center;align-items:center;font-family:JetBrains Mono,monospace;font-size:15px;font-weight:800;display:flex;position:absolute;inset:0}.wrapped-card-top{object-fit:contain;width:100%;max-height:320px;margin:0 auto;display:block}.wrapped-persona-section{padding-top:8rem;padding-bottom:4.5rem}.wrapped-receipt-section{padding-top:7rem;padding-bottom:4.5rem}.wrapped-persona-body{padding:1.25rem 1.5rem 1.5rem}.receipt-card{padding:1.25rem 1.5rem;font-size:13px;line-height:1.45}.receipt-card>.border-b{margin-bottom:.875rem;padding-bottom:.875rem}.receipt-card>.space-y-1{gap:.125rem}@media(min-width:640px){.wrapped-persona-section{padding-top:9rem}.wrapped-receipt-section{padding-top:7.5rem}.wrapped-persona-body{padding:1.5rem 1.75rem 1.75rem}.receipt-card{padding:1.5rem 1.75rem}}@media(prefers-reduced-motion:reduce){*,:before,:after{transition:none!important;animation:none!important}}.modal-overlay{z-index:100;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);background:#3c322659;justify-content:center;align-items:center;padding:16px;display:none;position:fixed;inset:0}.dark .modal-overlay{background:#0000008c}.modal-overlay.active{display:flex}.meth-modal{background:var(--bg);border:1px solid var(--border);border-radius:20px;flex-direction:column;width:min(1000px,100%);height:min(720px,100vh - 32px);display:flex;position:relative;overflow:hidden;box-shadow:0 1px 2px #0000000a,0 8px 24px #0000000f,0 32px 64px #00000014}.dark .meth-modal{box-shadow:0 1px 2px #0003,0 8px 24px #0003,0 32px 64px #00000040}.meth-progress{background:var(--border);z-index:20;opacity:.5;height:2px;position:absolute;top:0;left:0;right:0}.meth-progress-fill{background:linear-gradient(90deg,var(--accent),var(--accent));border-radius:0 1px 1px 0;width:0%;height:100%;transition:width .25s}@supports (color:color-mix(in lab,red,red)){.meth-progress-fill{background:linear-gradient(90deg,var(--accent),color-mix(in srgb,var(--accent) 50%,transparent))}}.meth-header{border-bottom:1px solid var(--border);background:var(--bg);z-index:10;flex-shrink:0;justify-content:space-between;align-items:center;padding:14px 22px;display:flex}.meth-header-left{align-items:center;gap:12px;display:flex}.meth-logo{background:var(--accent);width:32px;height:32px;box-shadow:0 2px 6px rgba(var(--accent-rgb),.2);border-radius:8px;justify-content:center;align-items:center;font-size:15px;display:flex}.meth-header-title{letter-spacing:-.02em;color:var(--text);font-family:Fraunces,serif;font-size:16px;font-weight:700}.meth-header-sub{color:var(--muted);margin-top:1px;font-size:11px}.modal-close{border:1px solid var(--border);background:var(--surface);width:32px;height:32px;color:var(--muted);cursor:pointer;border-radius:8px;justify-content:center;align-items:center;font-size:14px;transition:all .15s;display:flex}.modal-close:hover{border-color:var(--accent);color:var(--accent)}.modal-close svg{color:currentColor;width:16px;height:16px}.meth-scroll{scroll-snap-type:y mandatory;scrollbar-width:thin;scrollbar-color:rgba(var(--accent-rgb),.12) transparent;flex:1;height:0;min-height:0;overflow:hidden auto}.meth-scroll::-webkit-scrollbar{width:5px}.meth-scroll::-webkit-scrollbar-track{background:0 0}.meth-scroll::-webkit-scrollbar-thumb{background:rgba(var(--accent-rgb),.12);border-radius:3px}.meth-snap{scroll-snap-align:start;scroll-snap-stop:always;flex-direction:column;flex-shrink:0;height:100%;min-height:100%;display:flex;overflow:hidden}.meth-reveal{opacity:0;transition:opacity .6s cubic-bezier(.16,1,.3,1),transform .6s cubic-bezier(.16,1,.3,1);transform:translateY(20px)}.meth-reveal.vis{opacity:1;transform:translateY(0)}.meth-reveal.d1{transition-delay:80ms}.meth-reveal.d2{transition-delay:.16s}.meth-reveal.d3{transition-delay:.24s}.meth-reveal.d4{transition-delay:.32s}.meth-s1{background:radial-gradient(ellipse 55% 50% at 50% 85%,rgba(var(--accent-rgb),.06),transparent)}.dark .meth-s1{background:radial-gradient(ellipse 55% 50% at 50% 85%,rgba(var(--accent-rgb),.1),transparent)}.meth-s1-inner{flex-direction:column;flex:1;justify-content:center;padding:0 48px;display:flex}@media(max-width:640px){.meth-s1-inner{padding:0 20px}}.meth-hero{text-align:center;padding:40px 0 32px}.meth-hero-kicker{background:var(--accent-soft);text-transform:uppercase;letter-spacing:.12em;color:var(--accent);border-radius:999px;align-items:center;gap:7px;margin-bottom:20px;padding:6px 14px;font-family:JetBrains Mono,monospace;font-size:11px;font-weight:700;display:inline-flex}.meth-hero h1{letter-spacing:-.04em;color:var(--text);max-width:15ch;margin:0 auto;font-family:Fraunces,serif;font-size:clamp(34px,5.5vw,52px);font-weight:800;line-height:1.02}.meth-hero h1 em{color:var(--accent);font-style:italic;font-weight:600}.meth-hero-sub{color:var(--subtext,var(--muted));max-width:46ch;margin-top:16px;margin-left:auto;margin-right:auto;font-size:17px;line-height:1.6}.meth-pipeline-wrap{padding:0 0 28px}.meth-rule{color:var(--accent);align-items:center;gap:12px;margin-bottom:18px;font-family:Fraunces,serif;font-size:14px;font-weight:700;display:flex}.meth-rule:after{content:"";background:var(--border);flex:1;height:1px}.meth-process{grid-template-columns:repeat(4,1fr);gap:2px;display:grid}@media(max-width:700px){.meth-process{grid-template-columns:1fr 1fr}}.meth-step{background:var(--surface);border:1px solid var(--border);padding:22px 20px;transition:all .2s;position:relative}.meth-step:first-child{border-radius:12px 0 0 12px}.meth-step:last-child{border-radius:0 12px 12px 0}@media(max-width:700px){.meth-step:first-child{border-radius:12px 0 0}.meth-step:nth-child(2){border-radius:0 12px 0 0}.meth-step:nth-child(3){border-radius:0 0 0 12px}.meth-step:last-child{border-radius:0 0 12px}}.meth-step:hover{background:var(--accent-soft)}.meth-step-icon{background:linear-gradient(135deg,var(--accent),var(--accent));border-radius:9px;width:38px;height:38px}@supports (color:color-mix(in lab,red,red)){.meth-step-icon{background:linear-gradient(135deg,var(--accent),color-mix(in srgb,var(--accent) 70%,#a08060))}}.meth-step-icon{color:#f0e8de;box-shadow:0 4px 10px rgba(var(--accent-rgb),.2);justify-content:center;align-items:center;margin-bottom:12px;font-size:17px;display:flex}.meth-step h3{color:var(--text);margin-bottom:5px;font-family:Fraunces,serif;font-size:16px;font-weight:700}.meth-step p{color:var(--muted);font-size:13px;line-height:1.55}.meth-step:not(:last-child):after{content:"";z-index:2;background:var(--bg);border:1px solid var(--border);border-bottom:none;border-left:none;width:14px;height:14px;position:absolute;top:50%;right:-1px;transform:translate(50%)translateY(-50%)rotate(45deg)}@media(max-width:700px){.meth-step:not(:last-child):after{display:none}}.meth-scroll-hint{text-align:center;color:var(--muted);letter-spacing:.1em;text-transform:uppercase;flex-direction:column;align-items:center;gap:6px;padding:8px 0 16px;font-family:JetBrains Mono,monospace;font-size:10px;display:flex}.meth-scroll-arrow{border-right:2px solid var(--border);border-bottom:2px solid var(--border);width:14px;height:14px;animation:2s ease-in-out infinite methBob;transform:rotate(45deg)}@keyframes methBob{0%,to{transform:rotate(45deg)translate(0)}50%{transform:rotate(45deg)translate(2px,2px)}}.meth-s2{background:radial-gradient(circle at 80% 20%,rgba(var(--accent-rgb),.06),transparent 45%)}.dark .meth-s2{background:radial-gradient(circle at 80% 20%,rgba(var(--accent-rgb),.1),transparent 45%)}.meth-s2-inner{flex-direction:column;flex:1;justify-content:center;padding:0 48px;display:flex}@media(max-width:640px){.meth-s2-inner{padding:0 20px}}.meth-s2-header{text-align:center;margin-bottom:36px}.meth-s2-header h2{letter-spacing:-.03em;color:var(--text);font-family:Fraunces,serif;font-size:clamp(28px,4vw,40px);font-weight:800;line-height:1.05}.meth-s2-header p{color:var(--subtext,var(--muted));max-width:48ch;margin-top:10px;margin-left:auto;margin-right:auto;font-size:16px;line-height:1.6}.meth-taste-grid{grid-template-columns:repeat(4,1fr);gap:14px;display:grid}@media(max-width:800px){.meth-taste-grid{grid-template-columns:1fr 1fr}}@media(max-width:480px){.meth-taste-grid{grid-template-columns:1fr}}.meth-taste-card{background:var(--surface);border:1px solid var(--border);box-shadow:var(--shadow);border-radius:16px;padding:24px 22px;position:relative;overflow:hidden}.meth-taste-card:before{content:"";background:var(--tc,var(--accent));height:3px;position:absolute;top:0;left:0;right:0}.meth-taste-cat{color:var(--text);margin-bottom:16px;font-family:Fraunces,serif;font-size:17px;font-weight:700}.meth-taste-list{flex-direction:column;display:flex}.meth-taste-item{border-bottom:1px solid var(--border);justify-content:space-between;align-items:baseline;gap:6px;padding:9px 0;font-size:13px;display:flex}.meth-taste-item:last-child{border-bottom:none}.meth-taste-name{color:var(--text);white-space:nowrap;font-weight:600}.meth-taste-note{color:var(--muted);text-align:right;font-size:11px}.meth-s3{background:radial-gradient(ellipse 60% 50% at 30% 70%,rgba(var(--accent-rgb),.06),transparent)}.dark .meth-s3{background:radial-gradient(ellipse 60% 50% at 30% 70%,rgba(var(--accent-rgb),.1),transparent)}.meth-s3-inner{flex-direction:column;flex:1;min-height:0;padding:28px 48px 24px;display:flex}@media(max-width:640px){.meth-s3-inner{padding:24px 20px 20px}}.meth-s3-header{margin-bottom:20px}.meth-s3-header h2{letter-spacing:-.03em;color:var(--text);font-family:Fraunces,serif;font-size:clamp(26px,3.5vw,36px);font-weight:800;line-height:1.05}.meth-s3-header p{color:var(--subtext,var(--muted));margin-top:8px;font-size:15px;line-height:1.55}.meth-persona-layout{flex:1;grid-template-columns:210px 1fr;gap:16px;min-height:0;display:grid}@media(max-width:760px){.meth-persona-layout{grid-template-rows:auto 1fr;grid-template-columns:1fr}}.meth-persona-list{scrollbar-width:thin;scrollbar-color:rgba(var(--accent-rgb),.1) transparent;flex-direction:column;gap:6px;display:flex;overflow-y:auto}@media(max-width:760px){.meth-persona-list{flex-direction:row;gap:8px;padding-bottom:4px;overflow:auto hidden}}.meth-p-thumb{background:var(--surface);cursor:pointer;box-shadow:var(--shadow);border:2px solid #0000;border-radius:13px;flex-shrink:0;align-items:center;gap:12px;padding:11px 14px;transition:all .2s;display:flex}.meth-p-thumb:hover{border-color:var(--border);transform:translateY(-1px)}.meth-p-thumb.active{border-color:var(--pa,var(--accent));background:var(--pa,var(--accent))}@supports (color:color-mix(in lab,red,red)){.meth-p-thumb.active{background:color-mix(in srgb,var(--pa,var(--accent)) 6%,var(--surface))}}.meth-p-thumb.active{box-shadow:0 0 0 3px var(--pa),var(--shadow)}@supports (color:color-mix(in lab,red,red)){.meth-p-thumb.active{box-shadow:0 0 0 3px color-mix(in srgb,var(--pa) 10%,transparent),var(--shadow)}}.meth-p-thumb-img{background:var(--bg);border-radius:10px;flex-shrink:0;justify-content:center;align-items:center;width:44px;height:44px;display:flex;overflow:hidden}.meth-p-thumb-img img{object-fit:contain;filter:drop-shadow(0 2px 4px #0000001a);width:90%;height:90%}.meth-p-thumb-text{min-width:0}.meth-p-thumb-name{color:var(--text);white-space:nowrap;text-overflow:ellipsis;font-family:Fraunces,serif;font-size:14px;font-weight:700;overflow:hidden}.meth-p-thumb-trait{color:var(--muted);-webkit-line-clamp:2;-webkit-box-orient:vertical;font-size:11px;line-height:1.35;display:-webkit-box;overflow:hidden}@media(max-width:760px){.meth-p-thumb{text-align:center;flex-direction:column;gap:6px;min-width:100px;padding:8px 14px}.meth-p-thumb-trait{display:none}}.meth-pd{background:var(--surface);border:1px solid var(--border);min-height:0;box-shadow:var(--shadow);border-radius:18px;grid-template-columns:240px 1fr;display:grid;overflow:hidden}@media(max-width:900px){.meth-pd{grid-template-columns:200px 1fr}}@media(max-width:760px){.meth-pd{grid-template-rows:180px 1fr;grid-template-columns:1fr}}.meth-pd-art{background:var(--pd-gradient,linear-gradient(160deg,#ede6de,#f5f3f0));border-right:1px solid var(--border);justify-content:center;align-items:center;padding:20px;display:flex;position:relative;overflow:hidden}@media(max-width:760px){.meth-pd-art{border-right:none;border-bottom:1px solid var(--border)}}.meth-pd-art:after{content:"";background:radial-gradient(circle at 50% 80%,#0000 40%,#fff3);position:absolute;inset:0}.dark .meth-pd-art{background:var(--pd-gradient-dark,linear-gradient(160deg,#2e2822,#1c1816))}.dark .meth-pd-art:after{background:radial-gradient(circle at 50% 80%,#0000 40%,#00000026)}.meth-pd-art img{object-fit:contain;z-index:1;filter:drop-shadow(0 10px 20px #00000026);width:auto;max-width:90%;height:82%;transition:transform .4s cubic-bezier(.16,1,.3,1),opacity .25s;position:relative}.meth-pd-copy{scrollbar-width:thin;scrollbar-color:rgba(var(--accent-rgb),.1) transparent;flex-direction:column;padding:24px 28px;display:flex;overflow-y:auto}@media(max-width:640px){.meth-pd-copy{padding:18px 20px}}.meth-pd-badge{text-transform:uppercase;letter-spacing:.1em;color:var(--pa,var(--accent));margin-bottom:5px;font-family:JetBrains Mono,monospace;font-size:11px;font-weight:700}.meth-pd-name{letter-spacing:-.04em;color:var(--text);margin-bottom:12px;font-family:Fraunces,serif;font-size:clamp(28px,3.5vw,38px);font-weight:800;line-height:.95}.meth-pd-desc{color:var(--subtext,var(--muted));margin-bottom:18px;font-size:15px;line-height:1.6}.meth-pd-cards{grid-template-columns:1fr 1fr;gap:10px;margin-bottom:16px;display:grid}@media(max-width:500px){.meth-pd-cards{grid-template-columns:1fr}}.meth-pd-card{background:var(--accent-soft);border:1px solid var(--border);border-radius:12px;padding:14px 16px}.meth-pd-card-label{text-transform:uppercase;letter-spacing:.08em;color:var(--muted);margin-bottom:6px;font-family:JetBrains Mono,monospace;font-size:10px;font-weight:700}.meth-pd-card-text{color:var(--text);font-size:13px;line-height:1.55}.meth-pd-axes{grid-template-columns:repeat(2,1fr);gap:14px;display:grid}@media(max-width:600px){.meth-pd-axes{grid-template-columns:1fr}}.meth-ax{flex-direction:column;gap:5px;display:flex}.meth-ax-label{color:var(--text);justify-content:space-between;font-size:11px;font-weight:600;display:flex}.meth-ax-label span:last-child{color:var(--muted);font-family:JetBrains Mono,monospace}.meth-ax-track{background:var(--border);border-radius:3px;height:6px;overflow:hidden}.meth-ax-fill{background:var(--pa,var(--accent));border-radius:3px;height:100%;transition:width .5s cubic-bezier(.16,1,.3,1)}.meth-bottom{border-top:1px solid var(--border);background:var(--bg);flex-wrap:wrap;flex-shrink:0;justify-content:space-between;align-items:center;gap:12px;padding:12px 22px;display:flex}.meth-bottom-note{color:var(--muted);max-width:50ch;font-size:11px;line-height:1.5}.meth-dot-nav{align-items:center;gap:6px;display:flex}.meth-dot{background:var(--border);cursor:pointer;border:none;border-radius:50%;width:8px;height:8px;transition:all .2s}.meth-dot.active{background:var(--accent);box-shadow:0 0 6px rgba(var(--accent-rgb),.25)}.meth-dot:hover{background:var(--accent)}@supports (color:color-mix(in lab,red,red)){.meth-dot:hover{background:color-mix(in srgb,var(--accent) 50%,var(--border))}}@media(prefers-reduced-motion:reduce){.meth-reveal{opacity:1!important;transition:none!important;transform:none!important}.meth-scroll-arrow{animation:none!important}}.card-label{text-transform:uppercase;letter-spacing:.05em;color:var(--muted);margin-bottom:8px;font-size:12px;font-weight:600}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-space-y-reverse{syntax:"*";inherits:false;initial-value:0}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}
@@ -1 +0,0 @@
1
- function r(i){return navigator.clipboard?.writeText?navigator.clipboard.writeText(i):new Promise((a,o)=>{try{const e=document.createElement("textarea");e.value=i,e.setAttribute("readonly",""),e.style.position="absolute",e.style.left="-9999px",document.body.appendChild(e),e.select(),document.execCommand("copy"),document.body.removeChild(e),a()}catch(e){o(e)}})}function l(){const i=document.getElementById("createDropdown"),a=document.getElementById("createToggle"),o=document.getElementById("createMenu"),e=document.getElementById("createCopyBtn"),n=e?.querySelector(".create-copy-label");if(!i||!a||!o||!e)return;let c=null;function d(t){i.classList.toggle("open",t),a.setAttribute("aria-expanded",String(t)),o.hidden=!t}a.addEventListener("click",t=>{t.stopPropagation(),d(o.hidden)}),o.addEventListener("click",t=>{t.stopPropagation()}),e.addEventListener("click",async()=>{const t=e.dataset.copyText||"";try{await r(t),n&&(n.textContent="Copied"),e.classList.add("is-copied"),c&&clearTimeout(c),c=window.setTimeout(()=>{n&&(n.textContent="Copy"),e.classList.remove("is-copied")},1600)}catch{n&&(n.textContent="Failed"),c&&clearTimeout(c),c=window.setTimeout(()=>{n&&(n.textContent="Copy")},1600)}}),document.addEventListener("click",()=>{d(!1)}),document.addEventListener("keydown",t=>{t.key==="Escape"&&d(!1)})}l();