@eeshans/howiprompt 2.1.1 → 2.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/server.js CHANGED
@@ -43,7 +43,7 @@ export async function startServer(opts) {
43
43
  // API: pick directory (native macOS folder picker)
44
44
  if (req.method === "GET" && url.pathname === "/api/pick-directory") {
45
45
  try {
46
- const result = execSync(`osascript -e 'tell application "Finder" to activate' -e 'return POSIX path of (choose folder with prompt "Select directory to exclude")'`, { timeout: 60000 }).toString().trim();
46
+ const result = execSync(`osascript -e 'return POSIX path of (choose folder with prompt "Select directory to exclude")'`, { timeout: 60000 }).toString().trim();
47
47
  // Remove trailing slash
48
48
  const dirPath = result.replace(/\/$/, "");
49
49
  res.writeHead(200, { "Content-Type": "application/json" });
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAQzC,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAmB;IACnD,sDAAsD;IACtD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/D,MAAM,UAAU,GAAG;QACjB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,EAAI,2BAA2B;QAC7E,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,sCAAsC;KAC7F,CAAC;IACF,IAAI,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IAE5E,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IAC5D,IAAI,eAAe,GAAG,KAAK,CAAC;IAE5B,MAAM,SAAS,GAA2B;QACxC,OAAO,EAAE,WAAW;QACpB,KAAK,EAAE,wBAAwB;QAC/B,MAAM,EAAE,UAAU;QAClB,OAAO,EAAE,kBAAkB;QAC3B,MAAM,EAAE,WAAW;QACnB,MAAM,EAAE,eAAe;QACvB,MAAM,EAAE,cAAc;KACvB,CAAC;IAEF,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QAClD,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,oBAAoB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAErE,eAAe;QACf,GAAG,CAAC,SAAS,CAAC,6BAA6B,EAAE,GAAG,CAAC,CAAC;QAClD,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,yBAAyB,CAAC,CAAC;QACzE,GAAG,CAAC,SAAS,CAAC,8BAA8B,EAAE,cAAc,CAAC,CAAC;QAE9D,IAAI,GAAG,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC7B,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,GAAG,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QAED,oBAAoB;QACpB,IAAI,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;YACnC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC1C,OAAO;QACT,CAAC;QAED,mDAAmD;QACnD,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,QAAQ,KAAK,qBAAqB,EAAE,CAAC;YACnE,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,QAAQ,CACrB,+FAA+F,EAC/F,EAAE,OAAO,EAAE,KAAK,EAAE,CACnB,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;gBACpB,wBAAwB;gBACxB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAC1C,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;YAC7C,CAAC;YAAC,MAAM,CAAC;gBACP,qCAAqC;gBACrC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC1C,CAAC;YACD,OAAO;QACT,CAAC;QAED,8DAA8D;QAC9D,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,QAAQ,KAAK,sBAAsB,EAAE,CAAC;YACrE,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG;gBAAE,IAAI,IAAI,KAAK,CAAC;YAC7C,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAE3C,6EAA6E;YAC7E,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;YACnE,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;YAEpD,IAAI,YAAY,GAAG,CAAC,CAAC;YACrB,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7B,sDAAsD;gBACtD,MAAM,UAAU,GAAG,CAAC,GAAW,EAAU,EAAE;oBACzC,IAAI,KAAK,GAAG,CAAC,CAAC;oBACd,IAAI,CAAC;wBACH,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;4BACjE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;4BACxC,IAAI,KAAK,CAAC,WAAW,EAAE;gCAAE,KAAK,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;iCAC9C,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gCACvC,KAAK,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;4BAC7E,CAAC;wBACH,CAAC;oBACH,CAAC;oBAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;oBACtB,OAAO,KAAK,CAAC;gBACf,CAAC,CAAC;gBACF,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,yBAAyB;YACjF,CAAC;YAED,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;YACrD,OAAO;QACT,CAAC;QAED,sDAAsD;QACtD,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;YAC3D,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;gBAAE,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;YAC3D,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;YAC5D,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,CAAC,CAAC;YACvD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACtC,OAAO;QACT,CAAC;QAED,uBAAuB;QACvB,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;YAC3D,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;YAC7D,MAAM,QAAQ,GAAG,SAAS,EAAE,CAAC;YAC7B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;YACtC,OAAO;QACT,CAAC;QAED,cAAc;QACd,IAAI,GAAG,CAAC,QAAQ,KAAK,aAAa,EAAE,CAAC;YACnC,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;gBACzB,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;gBAC5D,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACxC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;gBAChC,OAAO;YACT,CAAC;YACD,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;gBACzB,IAAI,IAAI,GAAG,EAAE,CAAC;gBACd,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG;oBAAE,IAAI,IAAI,KAAK,CAAC;gBAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACjC,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;gBAC5D,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAClC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;gBACtC,OAAO;YACT,CAAC;QACH,CAAC;QAED,6BAA6B;QAC7B,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,QAAQ,KAAK,sBAAsB,EAAE,CAAC;YACpE,IAAI,eAAe,EAAE,CAAC;gBACpB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC,CAAC,CAAC;gBAC/D,OAAO;YACT,CAAC;YAED,eAAe,GAAG,IAAI,CAAC;YACvB,IAAI,kBAAkB,GAAG,KAAK,CAAC;YAC/B,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,kBAAkB,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAEtD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;gBACjB,cAAc,EAAE,mBAAmB;gBACnC,eAAe,EAAE,UAAU;gBAC3B,YAAY,EAAE,YAAY;aAC3B,CAAC,CAAC;YAEH,SAAS,IAAI,CAAC,IAAY,EAAE,IAAa;gBACvC,IAAI,kBAAkB;oBAAE,OAAO;gBAC/B,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,WAAW,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACjE,CAAC;YAED,IAAI,CAAC;gBACH,IAAI,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,+BAA+B,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC1F,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;gBACnD,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC;oBAC9B,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,UAAU,EAAE,CAAC,QAAQ,EAAE,EAAE;wBACvB,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;oBAC7B,CAAC;iBACF,CAAC,CAAC;gBACH,MAAM,OAAO,GAAG,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC;oBACxC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;oBACnD,CAAC,CAAC,IAAI,CAAC;gBACT,IAAI,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YACvC,CAAC;YAAC,OAAO,GAAQ,EAAE,CAAC;gBAClB,IAAI,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;YACnD,CAAC;oBAAS,CAAC;gBACT,eAAe,GAAG,KAAK,CAAC;gBACxB,GAAG,CAAC,GAAG,EAAE,CAAC;YACZ,CAAC;YACD,OAAO;QACT,CAAC;QAED,8EAA8E;QAC9E,IAAI,GAAG,CAAC,QAAQ,KAAK,eAAe,IAAI,GAAG,CAAC,QAAQ,KAAK,uBAAuB,EAAE,CAAC;YACjF,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC/B,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC,CAAC;gBACxF,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC;YACxC,CAAC;iBAAM,CAAC;gBACN,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACnB,GAAG,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YACpC,CAAC;YACD,OAAO;QACT,CAAC;QAED,wCAAwC;QACxC,IAAI,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEpD,yBAAyB;QACzB,IAAI,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/B,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC/C,CAAC;QACD,6EAA6E;QAC7E,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;YACpD,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7B,QAAQ,GAAG,SAAS,CAAC;YACvB,CAAC;QACH,CAAC;QAED,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;YAC9D,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACnC,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,0BAA0B,CAAC;YAC1D,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7C,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -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-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)}}
@@ -0,0 +1,37 @@
1
+ import{i as Me}from"./theme.CbYAaQI4.js";let b={},O="both",F="both",ae=null,fe={};const q=document.getElementById("sourceBar"),pe="dashboard-source-filter",ie={both:"All",claude_code:"Claude Code",codex:"Codex",copilot_chat:"Copilot Chat",cursor:"Cursor",lmstudio:"LM Studio"},K={claude_code:"#e67e22",codex:"#a855f7",copilot_chat:"#06b6d4",cursor:"#3b82f6",lmstudio:"#22c55e"};function ee(e){return ie[e]||e.replace(/_/g," ").replace(/\b\w/g,t=>t.toUpperCase())}function ne(e){return Math.round(Number(e)||0).toLocaleString()}function J(e){const t=Number(e)||0;if(t<1e6)return Math.round(t).toLocaleString();if(t<1e9){const o=t/1e6;return(o>=100?Math.round(o):o.toFixed(1).replace(/\.0$/,""))+"M"}const n=t/1e9;return(n>=100?Math.round(n):n.toFixed(1).replace(/\.0$/,""))+"B"}function ce(e){const t=Number(e)||0;return`${t%12||12}${t<12?"am":"pm"}`}function Ie(e){if(!e||!e.first||!e.last)return"2025";const t=new Date(e.first),n=new Date(e.last),o={month:"short",day:"2-digit",year:"numeric"};return`${t.toLocaleDateString("en-US",o)} – ${n.toLocaleDateString("en-US",o)}`}const he={"The Architect":"/images/card_architect.png","The Explorer":"/images/card_explorer.png","The Commander":"/images/card_commander.png","The Partner":"/images/card_partner.png"},Te=125.66;function ge(e,t,n){const o=document.getElementById(e),s=document.getElementById(t),a=Math.round(n??0);if(o){const i=Te*(1-Math.min(a,100)/100);o.setAttribute("stroke-dashoffset",String(i))}s&&(s.textContent=a)}function $e(e,t,n,o){const s=document.getElementById("cardTop"),a=e.name||"The Explorer";s&&(s.style.backgroundImage=`url('${he[a]||he["The Explorer"]}')`);const i=document.getElementById("personaName");i&&(i.textContent=a);const h=document.getElementById("personaDescription");h&&(h.textContent=e.description||"Not enough data."),ge("donutDetail","valDetail",e.detail_score),ge("donutStyle","valStyle",e.style_score);const r=t?.vibe_coder_index?.avg_score,u=r!=null?100-r:null,m=t?.politeness?.avg_score,c=d=>document.getElementById(d);c("cardVibe")&&(c("cardVibe").textContent=u!=null?Math.round(u):"--"),c("cardPolite")&&(c("cardPolite").textContent=m!=null?Math.round(m):"--"),c("cardVibeBar")&&(c("cardVibeBar").style.width=`${Math.min(u??0,100)}%`),c("cardPoliteBar")&&(c("cardPoliteBar").style.width=`${Math.min(m,100)}%`);const p=c("cardSerial");if(p){const d=String(Math.abs((e.name||"").split("").reduce((w,x)=>(w<<5)-w+x.charCodeAt(0),0))%1e4).padStart(4,"0");p.textContent=`#${d}`}}function ze(e){const t=Array.isArray(e)?e:[],n=document.getElementById("heatmapGrid");if(!n)return;const o=n.closest(".heatmap-panel");o&&o.style.setProperty("--heatmap-color",re());let s=o?.querySelector(".heatmap-tooltip");!s&&o&&(s=document.createElement("div"),s.className="heatmap-tooltip",o.appendChild(s));const a=["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];n.innerHTML="";const i=document.createElement("div");n.appendChild(i);for(let r=0;r<24;r++){const u=document.createElement("div");u.className="heatmap-hour",u.textContent=r%3===0?String(r):"",n.appendChild(u)}const h=Math.max(1,...t.flat());a.forEach((r,u)=>{const m=document.createElement("div");m.className="heatmap-label",m.textContent=r,n.appendChild(m),(t[u]||[]).forEach((c,p)=>{const d=document.createElement("div");if(d.className="heatmap-cell",c>0){const w=Math.ceil(c/h*5);d.classList.add("l"+Math.min(w,5))}d.setAttribute("aria-label",`${r} ${ce(p)}: ${c} prompt${c!==1?"s":""}`),d.dataset.day=r,d.dataset.hour=p,d.dataset.count=c,n.appendChild(d)})}),s&&(n.onmouseover=r=>{const u=r.target.closest(".heatmap-cell");if(!u){s.style.opacity="0";return}const{day:m,hour:c,count:p}=u.dataset;s.textContent=`${m} ${ce(c)} — ${p} prompt${p!=="1"?"s":""}`;const d=u.getBoundingClientRect(),w=o.getBoundingClientRect();let x=d.left-w.left+d.width/2;x=Math.max(60,Math.min(x,w.width-60)),s.style.left=x+"px",s.style.top=d.top-w.top-30+"px",s.style.opacity="1"},n.onmouseleave=()=>{s.style.opacity="0"})}let $={},z="vibe";const Ae={vibe:{key:"vibe_coder_index",label:"Vibe Coder Index",suffix:"/100",desc:"<strong>Higher</strong> = vibe coder. <strong>Lower</strong> = engineer.",invert:!0},polite:{key:"politeness",label:"Politeness",suffix:"/100",desc:"<strong>Higher</strong> = warmer. <strong>Lower</strong> = sharper.",axisTop:"Warmer",axisBottom:"Sharper"},activity:{key:"_prompts",label:"Activity",suffix:"/wk",desc:"<strong>Higher</strong> = heavier usage. <strong>Lower</strong> = quieter weeks."}};function Ne(e,t){return e.map(n=>t==="_prompts"?n.prompts??null:n.nlp&&n.nlp[t]!=null?Math.round(n.nlp[t]):null)}function re(){const e=K[F];return e||getComputedStyle(document.documentElement).getPropertyValue("--accent").trim()||"#5c3d2e"}function ye(e){return getComputedStyle(document.documentElement).getPropertyValue(e).trim()}let H=null;function we(e){const t=e?.trends||{},n=t?.weekly_rollups||[];if(n.length<2)return;const o=t?.weekly_by_platform||{},s=Object.keys(o).length>0,a=document.getElementById("trendChart"),i=document.getElementById("trendVal"),h=document.getElementById("trendLabel"),r=document.getElementById("trendMetricDef");if(!a)return;const u=n.map((f,l)=>{const C=new Date(f.week_start||f.date),k=C.toLocaleDateString("en-US",{month:"short",day:"numeric"}),L=l>0?new Date(n[l-1].week_start||n[l-1].date):null;return l===0||!L||L.getFullYear()!==C.getFullYear()?`${k} '${String(C.getFullYear()).slice(-2)}`:k}),m=e.nlp||{},c=n.length>0?Math.round(n.reduce((f,l)=>f+l.prompts,0)/n.length):null,p={vibe:m.vibe_coder_index?.avg_score,polite:m.politeness?.avg_score,activity:c};$={};for(const[f,l]of Object.entries(Ae)){const C=Ne(n,l.key),k=l.invert?C.map(v=>v!=null?100-v:null):C;if(k.some(v=>v!=null)){const v=p[f],A={points:k.map(N=>N??0),label:l.label,desc:l.desc,suffix:l.suffix,lifetime:l.invert&&v!=null?100-v:v};if(s){const N=n.map(D=>D.week_start);A.platforms={};for(const[D,P]of Object.entries(o)){const S=new Map(P.map(M=>[M.week_start,M])),V=N.map(M=>{const I=S.get(M);if(!I)return 0;if(l.key==="_prompts")return I.prompts??0;if(I.nlp&&I.nlp[l.key]!=null){const G=Math.round(I.nlp[l.key]);return l.invert?100-G:G}return 0});V.some(M=>M!=null&&M!==0)&&(A.platforms[D]=V)}}$[f]=A}}$[z]||(z=Object.keys($)[0]||"vibe");function d(f){const l=$[f];if(!l)return{series:[],colors:[]};if(l.platforms&&Object.keys(l.platforms).length>1){const k=[],L=[];for(const[v,A]of Object.entries(l.platforms))k.push({name:ie[v]||v,data:A.map(N=>N??0)}),L.push(K[v]||"#666666");return{series:k,colors:L,showLegend:!0}}else return{series:[{name:l.label,data:l.points}],colors:[re()],showLegend:!1}}function w(f,l){if(f==="vibe"||f==="polite")return{min:0,max:100,tickAmount:4};const C=l.flatMap(v=>v.data||[]).filter(v=>Number.isFinite(v)),k=C.length>0?Math.max(...C):0;return{min:0,max:k<=0?10:Math.ceil(k*1.15),tickAmount:4}}function x(){return window.innerWidth<=1100?4:window.innerWidth<=1400?5:7}const j=document.documentElement.classList.contains("dark"),g=ye("--muted")||"#888",y=ye("--border")||"#ddd",E=d(z),B=$[z]?.suffix||"",R=w(z,E.series),Y={chart:{type:"area",height:window.innerWidth<=1100?150:window.innerWidth<=1400?170:190,fontFamily:"'DM Sans', system-ui, sans-serif",toolbar:{show:!1},zoom:{enabled:!1},background:"transparent",animations:{enabled:!1}},stroke:{curve:"smooth",width:2.5},fill:{type:"gradient",gradient:{shadeIntensity:1,opacityFrom:.35,opacityTo:.02,stops:[0,95]}},colors:E.colors,series:E.series,xaxis:{categories:u,labels:{style:{colors:g,fontSize:"11px"},rotate:0,hideOverlappingLabels:!0},tickAmount:x(),axisBorder:{show:!1},axisTicks:{show:!1}},yaxis:{show:!0,min:R.min,max:R.max,tickAmount:R.tickAmount,forceNiceScale:!1,axisBorder:{show:!1},axisTicks:{show:!1},labels:{style:{colors:g,fontSize:"11px"},formatter:f=>z==="activity"?J(Math.round(f)):`${Math.round(f)}`}},grid:{show:!0,borderColor:y,strokeDashArray:3,xaxis:{lines:{show:!1}},yaxis:{lines:{show:!0}},padding:{left:12,right:12,top:-8,bottom:0}},legend:{show:!1},tooltip:{shared:!0,intersect:!1,theme:j?"dark":"light",y:{formatter:f=>f!=null?Math.round(f)+B:"--"},style:{fontSize:"12px",fontFamily:"'JetBrains Mono', monospace"}},dataLabels:{enabled:!1}};H&&(H.destroy(),H=null),H=new ApexCharts(a,Y),H.render();function _(f){if(!$[f])return;z=f;const l=$[f],C=l.lifetime!=null?Math.round(l.lifetime):l.points[l.points.length-1];i.textContent=(f==="activity"?J(C):C)+l.suffix,h.textContent="",r&&(r.innerHTML=l.desc||"");const k=i.closest(".trend-panel");k&&k.style.setProperty("--trend-color",re()),document.querySelectorAll(".metric-tab").forEach(S=>S.classList.toggle("active",S.dataset.metric===f));const{series:L,colors:v,showLegend:A}=d(f),N=l.suffix||"",D=w(f,L),P=document.getElementById("trendLegend");if(P)if(P.innerHTML="",A){for(const S of L){const V=Object.entries(ie).find(([,G])=>G===S.name)?.[0],M=V?K[V]:"#666",I=document.createElement("span");I.className="trend-legend-pill",I.innerHTML=`<span class="trend-legend-dot" style="background:${M}"></span>${S.name}`,P.appendChild(I)}P.style.display=""}else P.style.display="none";H.updateOptions({series:L,colors:v,chart:{animations:{enabled:!1}},xaxis:{categories:u,tickAmount:x(),labels:{style:{colors:g,fontSize:"11px"},rotate:0,hideOverlappingLabels:!0},axisBorder:{show:!1},axisTicks:{show:!1}},yaxis:{show:!0,min:D.min,max:D.max,tickAmount:D.tickAmount,forceNiceScale:!1,axisBorder:{show:!1},axisTicks:{show:!1},labels:{style:{colors:g,fontSize:"11px"},formatter:S=>f==="activity"?J(Math.round(S)):`${Math.round(S)}`}},tooltip:{y:{formatter:S=>S!=null?Math.round(S)+N:"--"}}},!1,!1,!1)}document.querySelectorAll(".metric-tab").forEach(f=>{f.addEventListener("click",()=>_(f.dataset.metric))}),_(z)}function De(){const e=document.getElementById("playerCard"),t=e?.closest(".card-dock");if(!e||!t)return;const n=12;t.addEventListener("mousemove",o=>{const s=t.getBoundingClientRect(),a=(o.clientX-s.left)/s.width,i=(o.clientY-s.top)/s.height;e.style.transform=`rotateY(${(a-.5)*n}deg) rotateX(${(.5-i)*n}deg)`}),t.addEventListener("mouseleave",()=>{e.style.transform=""})}function ve(e){return b[e]||null}function Pe(){return Object.keys(b).filter(e=>e==="both"||!!ve(e)).sort((e,t)=>e==="both"?1:t==="both"?-1:ee(e).localeCompare(ee(t)))}function Ee(e){const t=ve(e);if(!t)return;F=e,ae=t;const n=t.volume||{},o=t.temporal||{},s=t.conversation_depth||{};t.politeness;const a=t.persona||{},i=g=>document.getElementById(g),h=i("dateRange");h&&(h.textContent=Ie(t.date_range));const r=i("promptsValue");r&&(r.textContent=ne(n.total_human));const u=i("promptsSubtitle");u&&(u.textContent=`${ne(n.avg_words_per_prompt)} words avg`);const m=i("conversationsValue");m&&(m.textContent=ne(n.total_conversations));const c=i("conversationsSubtitle");c&&(c.textContent=`${s.avg_turns??0} turns avg`);const p=i("wordsTypedValue");p&&(p.textContent=J(n.total_words_human));const d=i("wordsTypedSubtitle");d&&(d.textContent=`${n.avg_words_per_prompt??0} words avg`);const w=i("nightOwlValue");w&&(w.textContent=`${o.night_owl_pct??0}%`);const x=i("peakHourValue");x&&(x.textContent=ce(o.peak_hour));const j=i("peakDayValue");j&&(j.textContent=o.peak_day||"N/A"),$e(a,t.nlp||{}),ze(o.heatmap),we(t)}function de(){if(!q)return;const e=Pe();q.innerHTML="";for(const o of e){const s=document.createElement("button");s.className="source-pill",s.dataset.source=o;const a=K[o];if(a){const h=document.createElement("span");h.className="source-pill-dot",h.style.background=a,s.appendChild(h)}const i=document.createTextNode(ee(o));s.appendChild(i),q.appendChild(s)}let t=localStorage.getItem(pe)||O;t==="claude"&&e.includes("claude_code")&&(t="claude_code"),(t==="both"||!e.includes(t))&&(t=e.find(o=>o!=="both")||e[0]||"both");function n(o){q.querySelectorAll(".source-pill").forEach(s=>{s.classList.toggle("active",s.dataset.source===o)}),localStorage.setItem(pe,o),Ee(o)}q.addEventListener("click",o=>{const s=o.target.closest(".source-pill");s&&n(s.dataset.source)}),n(t)}let X=null;function Oe(){const e=document.getElementById("methodologyModal");if(e){X=document.activeElement,e.classList.add("active"),document.body.style.overflow="hidden";const t=e.querySelector(".modal-close");t&&t.focus()}}function ue(){const e=document.getElementById("methodologyModal");e&&(e.classList.remove("active"),document.body.style.overflow="",X&&(X.focus(),X=null))}window.openMethodology=Oe;window.closeMethodology=ue;let Q=null,Z=null,W=null;function le(){return Array.isArray(U)&&U.length>0?U:Array.isArray(Z)&&Z.length>0?Z:[]}function ke(e){const t=Array.isArray(e)?e:[];return Z=t,t.length>0&&(U=t),t}function je(e=[],t=[],n=[]){const o=new Map((e||[]).map(i=>[i.id,i])),s=new Set(n),a={};for(const i of t||[]){const h=o.get(i.id);if(!h){s.has(i.id)||(a[i.id]="New");continue}(h.status!==i.status||h.detected!==i.detected)&&(a[i.id]="Updated")}return a}async function xe(e={}){const{useCache:t=!0,force:n=!1}=e;if(!n){const o=le();if(t&&o.length>0)return o;if(W)return W}return W=fetch("/api/detect").then(o=>o.json()).then(o=>ke(o.backends||[])).catch(()=>le()).finally(()=>{W=null}),W}function be(e={},t=[],n={}){const{isRefreshing:o=!1,badges:s={}}=n,a=document.getElementById("settingsBackends");if(!a)return;const i=new Map((t||[]).map(r=>[r.id,r])),h=Array.from(new Set([...Object.keys(e.backends||{}),...Array.from(i.keys())]));if(h.length===0){a.innerHTML=`<div class="wizard-loading">${o?"Checking installed backends…":"No backend settings yet."}</div>`;return}a.innerHTML=h.map(r=>{const u=e.backends?.[r]||{enabled:!1},m=i.get(r),c=m?m.supported===!1||m.status==="coming_soon"||m.status==="not_found":!1;let p=o?"Checking installation...":"Saved configuration";m?.status==="available"&&(p="Ready to analyze"),m?.status==="coming_soon"&&(p="Detected, but analysis support is not shipped yet"),m?.status==="not_found"&&(p="Not installed");const d=s[r]?`<span class="settings-backend-badge">${s[r]}</span>`:"";return`<div class="settings-backend-row">
2
+ <label class="wizard-toggle ${c?"is-disabled":""}">
3
+ <input type="checkbox" data-backend="${r}" ${u.enabled!==!1?"checked":""} ${c?"disabled":""}>
4
+ <span class="settings-backend-title">${ee(r)}${d}</span>
5
+ </label>
6
+ <div class="settings-backend-detail">${p}</div>
7
+ </div>`}).join("")}async function Re(){const e=document.getElementById("settingsModal");if(!e)return;Q=document.activeElement,e.classList.add("active"),document.body.style.overflow="hidden";const t=await fetch("/api/config").then(s=>s.json()).catch(()=>({})),n=le();be(t,n,{isRefreshing:!0});const o=document.getElementById("settingsExclusionSection");if(o&&t.backends?.claude_code){o.style.display="block";const s=t.backends.claude_code.exclusions??[];_e("settingsExclusionChips",s)}xe({force:!0}).then(s=>{if(!document.getElementById("settingsModal")?.classList.contains("active"))return;const i=[...n.map(r=>r.id),...Object.keys(t.backends||{})],h=je(n,s,i);be(t,s,{isRefreshing:!1,badges:h})}).catch(()=>{})}function te(){const e=document.getElementById("settingsModal");e&&(e.classList.remove("active"),document.body.style.overflow="",Q&&(Q.focus(),Q=null))}async function He(){if(document.querySelectorAll("#settingsBackends input[type=checkbox]:checked").length===0){alert("Please enable at least one backend to analyze.");return}const t={};document.querySelectorAll("#settingsBackends input[type=checkbox]").forEach(n=>{t[n.dataset.backend]={enabled:n.checked,exclusions:[]}}),t.claude_code&&(t.claude_code.exclusions=Le("settingsExclusionChips")),await fetch("/api/config",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({backends:t})}),te(),qe()}window.openSettings=Re;window.closeSettings=te;document.getElementById("settingsAddExclusion")?.addEventListener("click",()=>Se("settingsExclusionChips"));document.getElementById("settingsSave")?.addEventListener("click",He);document.getElementById("settingsReset")?.addEventListener("click",()=>{document.getElementById("resetConfirmModal")?.classList.add("active")});document.getElementById("resetCancel")?.addEventListener("click",()=>{document.getElementById("resetConfirmModal")?.classList.remove("active")});document.getElementById("resetConfirm")?.addEventListener("click",async()=>{await fetch("/api/reset",{method:"POST"}),window.location.reload()});document.getElementById("settingsModal")?.addEventListener("click",e=>{e.target===e.currentTarget&&te()});document.getElementById("methodologyModal")?.addEventListener("click",e=>{e.target===e.currentTarget&&ue()});document.addEventListener("keydown",e=>{e.key==="Escape"&&(ue(),te());const t=document.getElementById("methodologyModal");if(e.key==="Tab"&&t?.classList.contains("active")){const n=t.querySelectorAll('button, [href], [tabindex]:not([tabindex="-1"])');if(n.length===0)return;const o=n[0],s=n[n.length-1];e.shiftKey&&document.activeElement===o?(e.preventDefault(),s.focus()):!e.shiftKey&&document.activeElement===s&&(e.preventDefault(),o.focus())}});function Ve(){(location.protocol==="file:"||location.hostname==="localhost"||location.hostname==="127.0.0.1")&&document.querySelectorAll('a[href="/wrapped"]').forEach(t=>{const n=location.pathname,o=n.substring(0,n.lastIndexOf("/"));t.href=o+"/wrapped/index.html"})}function Ce(e){fe=e.branding||{};const t=fe.github_repo||"https://github.com/eeshansrivastava89/howiprompt",n=document.getElementById("footerGithubLink");n&&(n.href=t)}let oe=!1;async function qe(){if(oe)return;oe=!0;const e=document.getElementById("refreshModal"),t=document.getElementById("refreshLog"),n=document.getElementById("refreshProgressBar"),o=document.getElementById("refreshModalResult"),s=document.getElementById("refreshModalClose");e&&(t&&(t.innerHTML='<div class="wizard-log-entry">Starting pipeline...</div>'),n&&(n.style.width="0"),o.style.display="none",s.style.display="none",e.classList.add("active"),document.body.style.overflow="hidden");const a=m=>{o&&(o.innerHTML=m,o.style.display="block",s.style.display="inline-block",s.focus()),oe=!1},i=["sync","parse","insert","nlp","embedding","classifiers","metrics"];let h=0,r=!1;const u=new EventSource("/api/pipeline/stream");u.addEventListener("progress",m=>{const c=JSON.parse(m.data);if(t){const d=document.createElement("div");d.className="wizard-log-entry",d.textContent=`${c.stage}: ${c.detail}`,t.appendChild(d),t.scrollTop=t.scrollHeight}const p=i.indexOf(c.stage);p>=0&&p>h&&(h=p),n&&(n.style.width=`${(h+1)/i.length*100}%`)}),u.addEventListener("complete",m=>{r=!0,u.close();const c=JSON.parse(m.data);if(n&&(n.style.width="100%"),t){const w=document.createElement("div");w.className="wizard-log-entry done",w.textContent=`Done! ${c.stats.totalMessages.toLocaleString()} messages analyzed.`,t.appendChild(w),t.scrollTop=t.scrollHeight}c.metrics&&(b=c.metrics.source_views||{both:c.metrics},!b.claude_code&&b.claude&&(b.claude_code=b.claude),b.both=b.both||c.metrics,b[F]||(F="both"),de(),Ee(F));const p=[],d=c.stats;d.newMessages>0?p.push(`<span class="result-num">${d.newMessages}</span> new message${d.newMessages===1?"":"s"} synced`):p.push("Already up to date"),p.push(`<span class="result-num">${J(d.totalMessages)}</span> total messages`),d.embedded>0&&p.push(`<span class="result-num">${d.embedded}</span> embeddings computed`),a(p.join("<br>"))}),u.addEventListener("pipeline_error",m=>{r=!0,u.close();const c=JSON.parse(m.data);a(`Refresh failed: ${c.message}`)}),u.onerror=()=>{r||(u.close(),a("Refresh failed — is the server running?"))}}document.getElementById("refreshModalClose")?.addEventListener("click",()=>{const e=document.getElementById("refreshModal");e&&(e.classList.remove("active"),document.body.style.overflow="")});let U=[];const T=[{key:"boot",label:"Prepare"},{key:"sync",label:"Sync Sources"},{key:"parse",label:"Parse Chats"},{key:"insert",label:"Store Messages"},{key:"nlp",label:"Language Scores"},{key:"embedding",label:"Embeddings"},{key:"classifiers",label:"Behavior Scores"},{key:"metrics",label:"Build Dashboard"}],se=Object.fromEntries(T.map((e,t)=>[e.key,t]));function We(){const e=document.getElementById("wizardLog"),t=document.getElementById("wizardProgressBar"),n=document.getElementById("wizardProgressLabel"),o=document.getElementById("wizardProgressPct"),s=document.getElementById("wizardStageList"),a=Object.fromEntries(T.map(({key:g},y)=>[g,{key:g,label:T[y].label,detail:"Waiting...",progress:0,status:"pending"}]));let i="boot",h=null,r=!1;function u(){const g=T.reduce((y,{key:E})=>y+(a[E].progress||0),0)/T.length;if(t&&(t.style.width=`${Math.round(g)}%`),n){const y=a[i]||a.boot;n.textContent=y?.detail||"Preparing analysis..."}o&&(o.textContent=`${Math.round(g)}%`),s&&(s.innerHTML=T.map(({key:y,label:E})=>{const B=a[y];return`
8
+ <div class="wizard-stage-row">
9
+ <div class="wizard-stage-name">${E}</div>
10
+ <div class="wizard-stage-track is-${B.status}">
11
+ <div class="wizard-stage-fill" style="width:${B.progress}%"></div>
12
+ <span class="wizard-stage-detail">${B.detail}</span>
13
+ </div>
14
+ <div class="wizard-stage-value">${Math.round(B.progress)}%</div>
15
+ </div>
16
+ `}).join(""))}function m(){h&&(clearInterval(h),h=null)}function c(g){m(),h=window.setInterval(()=>{if(r||i!==g)return;const y=a[g],E=g==="embedding"||g==="classifiers"?95:88;y.progress>=E||(y.progress=Math.min(E,y.progress+(y.progress<30?3:1)),u())},450)}function p(g,y="normal"){if(!e)return;const E=document.createElement("div");E.className=`wizard-log-entry${y==="done"?" done":y==="error"?" error":""}`,E.textContent=g,e.appendChild(E),e.scrollTop=e.scrollHeight}function d(){e&&(e.innerHTML="");for(const{key:g}of T)a[g].detail="Waiting...",a[g].progress=0,a[g].status="pending";i="boot",a.boot.detail="Connecting to local pipeline...",a.boot.progress=5,a.boot.status="active",r=!1,p("Starting pipeline..."),c("boot"),u()}function w(g,y,E){const B=se[g]!=null?g:"boot",R=se[B],Y=se[i]??0;if(R>Y)for(let f=Y;f<R;f++){const l=T[f].key;a[l].status="done",a[l].progress=100}i=B;const _=a[B];_.status="active",_.detail=y,typeof E=="number"&&Number.isFinite(E)?_.progress=Math.max(_.progress,Math.min(100,E)):_.progress=Math.max(_.progress,12),p(`${B}: ${y}`),c(B),u()}function x(g){r=!0,m();for(const{key:y}of T)a[y].status="done",a[y].progress=100,a[y].detail==="Waiting..."&&(a[y].detail="Done");i="metrics",a.metrics.detail="Dashboard ready.",p(`Done! ${Number(g||0).toLocaleString()} messages analyzed.`,"done"),u()}function j(g){r=!0,m();const y=a[i]||a.boot;y.status="error",y.detail=g,p(`Error: ${g}`,"error"),u()}return{begin:d,advance:w,finish:x,fail:j}}async function Fe(){const e=document.getElementById("setupWizard");if(!e)return!1;let t=!1;try{t=(await fetch("./metrics.json")).ok}catch{}if(t)return fetch("/api/config",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({hasCompletedSetup:!0})}).catch(()=>{}),!1;let n;try{const o=await fetch("/api/config");o.ok&&(n=await o.json())}catch{}return n?.hasCompletedSetup&&t?!1:(e.classList.add("active"),document.body.style.overflow="hidden",await Je(),!0)}async function Je(){const e=document.getElementById("wizardBackends");if(e)try{const t=await fetch("/api/detect"),{backends:n}=await t.json();ke(n),e.innerHTML=n.map(o=>{let s="";return o.status==="available"?s="Detected locally":o.status==="coming_soon"?s="Detected (coming soon)":s="Not installed",`
17
+ <div class="wizard-backend ${o.detected?"detected":""}" data-id="${o.id}">
18
+ <div class="wizard-backend-icon ${o.status}"></div>
19
+ <div class="wizard-backend-info">
20
+ <div class="wizard-backend-name">${o.name}</div>
21
+ <div class="wizard-backend-detail">${s}</div>
22
+ </div>
23
+ </div>`}).join("")}catch{e.innerHTML='<div class="wizard-loading">Could not detect backends.</div>'}}async function Se(e){const t=document.getElementById(e);if(!t)return;let n;try{n=(await(await fetch("/api/pick-directory")).json()).path}catch{return}if(!n||t.querySelector(`[data-path="${CSS.escape(n)}"]`))return;let o=0;try{o=(await(await fetch("/api/exclusion-count",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:n})})).json()).messageCount||0}catch{}Be(t,n,o)}function Be(e,t,n){const o=document.createElement("div");o.className="exclusion-chip",o.dataset.path=t;const s=t.split("/").pop()||t,a=n>0?`${n.toLocaleString()} messages`:"no data found";o.innerHTML=`
24
+ <span class="exclusion-chip-path" title="${t}">${s}</span>
25
+ <span class="exclusion-chip-count">${a}</span>
26
+ <button class="exclusion-chip-remove" type="button" aria-label="Remove">&times;</button>
27
+ `,o.querySelector(".exclusion-chip-remove").addEventListener("click",()=>o.remove()),e.appendChild(o)}function Le(e){const t=document.getElementById(e);return t?[...t.querySelectorAll(".exclusion-chip")].map(n=>n.dataset.path):[]}async function _e(e,t){const n=document.getElementById(e);if(n){n.innerHTML="";for(const o of t){let s=0;try{s=(await(await fetch("/api/exclusion-count",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:o})})).json()).messageCount||0}catch{}Be(n,o,s)}}}function Ue(){const e=document.getElementById("wizardConfig"),t=document.getElementById("wizardExclusions");if(!e)return;const n=U.filter(o=>o.status==="available"&&o.supported!==!1);fetch("/api/config").then(o=>o.json()).then(o=>{e.innerHTML=n.map(s=>{const a=o.backends?.[s.id],i=a?a.enabled!==!1:!0;return`
28
+ <label class="wizard-toggle">
29
+ <input type="checkbox" data-backend="${s.id}" ${i?"checked":""}>
30
+ ${s.name}
31
+ </label>
32
+ `}).join(""),n.some(s=>s.id==="claude_code")&&t?(t.style.display="block",_e("wizardExclusionChips",o.backends?.claude_code?.exclusions??[])):t&&(t.style.display="none")}).catch(()=>{e.innerHTML=n.map(o=>`
33
+ <label class="wizard-toggle">
34
+ <input type="checkbox" data-backend="${o.id}" checked>
35
+ ${o.name}
36
+ </label>
37
+ `).join("")})}async function Ye(){const e={};document.querySelectorAll("#wizardConfig input[type=checkbox]").forEach(t=>{e[t.dataset.backend]={enabled:t.checked,exclusions:[]}}),e.claude_code&&(e.claude_code.exclusions=Le("wizardExclusionChips"));try{await fetch("/api/config",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({backends:e})})}catch{}}function Ge(){const e=document.getElementById("wizardDone"),t=We();let n=!1;t.begin();const o=new EventSource("/api/pipeline/stream");o.addEventListener("progress",s=>{const a=JSON.parse(s.data);t.advance(a.stage,a.detail,a.progress)}),o.addEventListener("complete",s=>{n=!0,o.close();const a=JSON.parse(s.data);t.finish(a.stats.totalMessages),e&&(e.style.display="inline-block"),a.metrics&&(b=a.metrics.source_views||{both:a.metrics},!b.claude_code&&b.claude&&(b.claude_code=b.claude),b.both=b.both||a.metrics,O=a.metrics.default_view||"both",O==="claude"&&b.claude_code&&(O="claude_code"))}),o.addEventListener("pipeline_error",s=>{n=!0,o.close();const a=JSON.parse(s.data);t.fail(a.message),e&&(e.textContent="Continue Anyway",e.style.display="inline-block")}),o.onerror=()=>{n||(o.close(),t.fail("Connection lost — check terminal for details."),e&&(e.textContent="Continue Anyway",e.style.display="inline-block"))}}function me(e){document.querySelectorAll(".wizard-step").forEach(t=>{const n=Number(t.dataset.step);t.classList.toggle("active",n===e),t.classList.toggle("done",n<e)}),document.querySelectorAll(".wizard-page").forEach(t=>t.classList.remove("active")),document.getElementById(`wizardStep${e}`)?.classList.add("active")}document.getElementById("wizardAddExclusion")?.addEventListener("click",()=>Se("wizardExclusionChips"));document.getElementById("wizardNext1")?.addEventListener("click",()=>{Ue(),me(2)});document.getElementById("wizardBack2")?.addEventListener("click",()=>me(1));document.getElementById("wizardNext2")?.addEventListener("click",async()=>{if(document.querySelectorAll("#wizardConfig input[type=checkbox]:checked").length===0){alert("Please enable at least one backend to analyze.");return}await Ye(),me(3),Ge()});document.getElementById("wizardDone")?.addEventListener("click",async()=>{try{await fetch("/api/config",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({hasCompletedSetup:!0})})}catch{}const e=document.getElementById("setupWizard");e&&(e.classList.remove("active"),document.body.style.overflow=""),Ce({}),de()});async function Xe(){if(Me(),Ve(),De(),document.getElementById("themeToggle")?.addEventListener("click",()=>{requestAnimationFrame(()=>{ae&&we(ae)})}),!await Fe()){xe({useCache:!0}).catch(()=>{});try{const t=await fetch("./metrics.json");if(!t.ok)throw new Error(`HTTP ${t.status}`);const n=await t.json();b=n.source_views||{both:n},!b.claude_code&&b.claude&&(b.claude_code=b.claude),b.both=b.both||n,O=n.default_view||"both",O==="claude"&&b.claude_code&&(O="claude_code"),Ce(n),de()}catch(t){console.warn("Could not load metrics.json:",t.message)}}}Xe();
@@ -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.Ck1ZXjve.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.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>
2
2
  Wrapped
3
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>
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="How much you vibe-code. Higher = more intent-driven, less spec-heavy.">Vibe Coder Index</button> <button class="metric-tab" data-metric="polite" data-tooltip="How courteous and collaborative your tone is. Higher = warmer, more appreciative prompting style.">Politeness</button> <button class="metric-tab" data-metric="activity" data-tooltip="Prompts per week.">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> <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>
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.PuBlxVje.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.DmQY6kFx.js"></script> </body></html>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eeshans/howiprompt",
3
- "version": "2.1.1",
3
+ "version": "2.1.2",
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:0;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;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-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:280px}.right-col{align-self:center;width:100%;max-width:480px}}@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:220px;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,37 +0,0 @@
1
- import{i as Se}from"./theme.CbYAaQI4.js";let b={},P="both",R="both",Z=null,re={};const O=document.getElementById("sourceBar"),de="dashboard-source-filter",ee={both:"All",claude_code:"Claude Code",codex:"Codex",copilot_chat:"Copilot Chat",cursor:"Cursor",lmstudio:"LM Studio"},W={claude_code:"#e67e22",codex:"#a855f7",copilot_chat:"#06b6d4",cursor:"#3b82f6",lmstudio:"#22c55e"};function G(e){return ee[e]||e.replace(/_/g," ").replace(/\b\w/g,t=>t.toUpperCase())}function X(e){return Math.round(Number(e)||0).toLocaleString()}function se(e){const t=Number(e)||0;if(t<1e6)return Math.round(t).toLocaleString();if(t<1e9){const o=t/1e6;return(o>=100?Math.round(o):o.toFixed(1).replace(/\.0$/,""))+"M"}const n=t/1e9;return(n>=100?Math.round(n):n.toFixed(1).replace(/\.0$/,""))+"B"}function te(e){const t=Number(e)||0;return`${t%12||12}${t<12?"am":"pm"}`}function xe(e){if(!e||!e.first||!e.last)return"2025";const t=new Date(e.first),n=new Date(e.last),o={month:"short",day:"2-digit",year:"numeric"};return`${t.toLocaleDateString("en-US",o)} – ${n.toLocaleDateString("en-US",o)}`}const ue={"The Architect":"/images/card_architect.png","The Explorer":"/images/card_explorer.png","The Commander":"/images/card_commander.png","The Partner":"/images/card_partner.png"},_e=125.66;function me(e,t,n){const o=document.getElementById(e),s=document.getElementById(t),a=Math.round(n??0);if(o){const c=_e*(1-Math.min(a,100)/100);o.setAttribute("stroke-dashoffset",String(c))}s&&(s.textContent=a)}function Be(e,t,n,o){const s=document.getElementById("cardTop"),a=e.name||"The Explorer";s&&(s.style.backgroundImage=`url('${ue[a]||ue["The Explorer"]}')`);const c=document.getElementById("personaName");c&&(c.textContent=a);const g=document.getElementById("personaDescription");g&&(g.textContent=e.description||"Not enough data."),me("donutDetail","valDetail",e.detail_score),me("donutStyle","valStyle",e.style_score);const l=t?.vibe_coder_index?.avg_score,m=l!=null?100-l:null,d=t?.politeness?.avg_score,i=r=>document.getElementById(r);i("cardVibe")&&(i("cardVibe").textContent=m!=null?Math.round(m):"--"),i("cardPolite")&&(i("cardPolite").textContent=d!=null?Math.round(d):"--"),i("cardVibeBar")&&(i("cardVibeBar").style.width=`${Math.min(m??0,100)}%`),i("cardPoliteBar")&&(i("cardPoliteBar").style.width=`${Math.min(d,100)}%`);const p=i("cardSerial");if(p){const r=String(Math.abs((e.name||"").split("").reduce((v,x)=>(v<<5)-v+x.charCodeAt(0),0))%1e4).padStart(4,"0");p.textContent=`#${r}`}}function Le(e){const t=Array.isArray(e)?e:[],n=document.getElementById("heatmapGrid");if(!n)return;const o=n.closest(".heatmap-panel");o&&o.style.setProperty("--heatmap-color",ne());let s=o?.querySelector(".heatmap-tooltip");!s&&o&&(s=document.createElement("div"),s.className="heatmap-tooltip",o.appendChild(s));const a=["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];n.innerHTML="";const c=document.createElement("div");n.appendChild(c);for(let l=0;l<24;l++){const m=document.createElement("div");m.className="heatmap-hour",m.textContent=l%3===0?String(l):"",n.appendChild(m)}const g=Math.max(1,...t.flat());a.forEach((l,m)=>{const d=document.createElement("div");d.className="heatmap-label",d.textContent=l,n.appendChild(d),(t[m]||[]).forEach((i,p)=>{const r=document.createElement("div");if(r.className="heatmap-cell",i>0){const v=Math.ceil(i/g*5);r.classList.add("l"+Math.min(v,5))}r.setAttribute("aria-label",`${l} ${te(p)}: ${i} prompt${i!==1?"s":""}`),r.dataset.day=l,r.dataset.hour=p,r.dataset.count=i,n.appendChild(r)})}),s&&(n.onmouseover=l=>{const m=l.target.closest(".heatmap-cell");if(!m){s.style.opacity="0";return}const{day:d,hour:i,count:p}=m.dataset;s.textContent=`${d} ${te(i)} — ${p} prompt${p!=="1"?"s":""}`;const r=m.getBoundingClientRect(),v=o.getBoundingClientRect();let x=r.left-v.left+r.width/2;x=Math.max(60,Math.min(x,v.width-60)),s.style.left=x+"px",s.style.top=r.top-v.top-30+"px",s.style.opacity="1"},n.onmouseleave=()=>{s.style.opacity="0"})}let M={},D="vibe";const Ie={vibe:{key:"vibe_coder_index",label:"Vibe Coder Index",suffix:"/100",desc:"How much you vibe-code. Higher = more intent-driven, less spec-heavy.",invert:!0},polite:{key:"politeness",label:"Politeness",suffix:"/100",desc:"How collaborative your tone is. Higher = warmer, more appreciative prompting style."},activity:{key:"_prompts",label:"Activity",suffix:"/wk",desc:"Prompts per week."}};function Me(e,t){return e.map(n=>t==="_prompts"?n.prompts??null:n.nlp&&n.nlp[t]!=null?Math.round(n.nlp[t]):null)}function ne(){const e=W[R];return e||getComputedStyle(document.documentElement).getPropertyValue("--accent").trim()||"#5c3d2e"}function $e(e){return getComputedStyle(document.documentElement).getPropertyValue(e).trim()}let N=null;function fe(e){const t=e?.trends||{},n=t?.weekly_rollups||[];if(n.length<2)return;const o=t?.weekly_by_platform||{},s=Object.keys(o).length>0,a=document.getElementById("trendChart"),c=document.getElementById("trendVal"),g=document.getElementById("trendLabel"),l=document.getElementById("trendMetricDef");if(!a)return;const m=n.map((f,u)=>{const C=new Date(f.week_start||f.date),w=C.toLocaleDateString("en-US",{month:"short",day:"numeric"}),S=u>0?new Date(n[u-1].week_start||n[u-1].date):null;return u===0||!S||S.getFullYear()!==C.getFullYear()?`${w} '${String(C.getFullYear()).slice(-2)}`:w}),d=e.nlp||{},i=n.length>0?Math.round(n.reduce((f,u)=>f+u.prompts,0)/n.length):null,p={vibe:d.vibe_coder_index?.avg_score,polite:d.politeness?.avg_score,activity:i};M={};for(const[f,u]of Object.entries(Ie)){const C=Me(n,u.key),w=u.invert?C.map(E=>E!=null?100-E:null):C;if(w.some(E=>E!=null)){const E=p[f],T={points:w.map(z=>z??0),label:u.label,desc:u.desc,suffix:u.suffix,lifetime:u.invert&&E!=null?100-E:E};if(s){const z=n.map(L=>L.week_start);T.platforms={};for(const[L,B]of Object.entries(o)){const V=new Map(B.map(_=>[_.week_start,_])),q=z.map(_=>{const A=V.get(_);if(!A)return 0;if(u.key==="_prompts")return A.prompts??0;if(A.nlp&&A.nlp[u.key]!=null){const le=Math.round(A.nlp[u.key]);return u.invert?100-le:le}return 0});q.some(_=>_!=null&&_!==0)&&(T.platforms[L]=q)}}M[f]=T}}M[D]||(D=Object.keys(M)[0]||"vibe");function r(f){const u=M[f];if(!u)return{series:[],colors:[]};if(u.platforms&&Object.keys(u.platforms).length>1){const w=[],S=[];for(const[E,T]of Object.entries(u.platforms))w.push({name:ee[E]||E,data:T.map(z=>z??0)}),S.push(W[E]||"#666666");return{series:w,colors:S,showLegend:!0}}else return{series:[{name:u.label,data:u.points}],colors:[ne()],showLegend:!1}}const v=document.documentElement.classList.contains("dark"),x=$e("--muted")||"#888",$=r(D),h=M[D]?.suffix||"",y={chart:{type:"area",height:220,fontFamily:"'DM Sans', system-ui, sans-serif",toolbar:{show:!1},zoom:{enabled:!1},background:"transparent",animations:{enabled:!0,easing:"easeinout",speed:400}},stroke:{curve:"smooth",width:2.5},fill:{type:"gradient",gradient:{shadeIntensity:1,opacityFrom:.35,opacityTo:.02,stops:[0,95]}},colors:$.colors,series:$.series,xaxis:{categories:m,labels:{style:{colors:x,fontSize:"11px"},rotate:0,hideOverlappingLabels:!0},tickAmount:7,axisBorder:{show:!1},axisTicks:{show:!1}},yaxis:{show:!1,min:0},grid:{show:!1,padding:{left:28,right:28,top:-8,bottom:0}},legend:{show:!1},tooltip:{shared:!0,intersect:!1,theme:v?"dark":"light",y:{formatter:f=>f!=null?Math.round(f)+h:"--"},style:{fontSize:"12px",fontFamily:"'JetBrains Mono', monospace"}},dataLabels:{enabled:!1}};N&&(N.destroy(),N=null),N=new ApexCharts(a,y),N.render();function k(f){if(!M[f])return;D=f;const u=M[f],C=u.lifetime!=null?Math.round(u.lifetime):u.points[u.points.length-1];c.textContent=(f==="activity"?se(C):C)+u.suffix,g.textContent="",l&&(l.textContent=u.desc||"");const w=c.closest(".trend-panel");w&&w.style.setProperty("--trend-color",ne()),document.querySelectorAll(".metric-tab").forEach(B=>B.classList.toggle("active",B.dataset.metric===f));const{series:S,colors:E,showLegend:T}=r(f),z=u.suffix||"",L=document.getElementById("trendLegend");if(L)if(L.innerHTML="",T){for(const B of S){const V=Object.entries(ee).find(([,A])=>A===B.name)?.[0],q=V?W[V]:"#666",_=document.createElement("span");_.className="trend-legend-pill",_.innerHTML=`<span class="trend-legend-dot" style="background:${q}"></span>${B.name}`,L.appendChild(_)}L.style.display=""}else L.style.display="none";N.updateOptions({colors:E,tooltip:{y:{formatter:B=>B!=null?Math.round(B)+z:"--"}}},!1,!1),N.updateSeries(S)}document.querySelectorAll(".metric-tab").forEach(f=>{f.addEventListener("click",()=>k(f.dataset.metric))}),k(D)}function Te(){const e=document.getElementById("playerCard"),t=e?.closest(".card-dock");if(!e||!t)return;const n=12;t.addEventListener("mousemove",o=>{const s=t.getBoundingClientRect(),a=(o.clientX-s.left)/s.width,c=(o.clientY-s.top)/s.height;e.style.transform=`rotateY(${(a-.5)*n}deg) rotateX(${(.5-c)*n}deg)`}),t.addEventListener("mouseleave",()=>{e.style.transform=""})}function ge(e){return b[e]||null}function ze(){return Object.keys(b).filter(e=>e==="both"||!!ge(e)).sort((e,t)=>e==="both"?1:t==="both"?-1:G(e).localeCompare(G(t)))}function he(e){const t=ge(e);if(!t)return;R=e,Z=t;const n=t.volume||{},o=t.temporal||{},s=t.conversation_depth||{};t.politeness;const a=t.persona||{},c=h=>document.getElementById(h),g=c("dateRange");g&&(g.textContent=xe(t.date_range));const l=c("promptsValue");l&&(l.textContent=X(n.total_human));const m=c("promptsSubtitle");m&&(m.textContent=`${X(n.avg_words_per_prompt)} words avg`);const d=c("conversationsValue");d&&(d.textContent=X(n.total_conversations));const i=c("conversationsSubtitle");i&&(i.textContent=`${s.avg_turns??0} turns avg`);const p=c("wordsTypedValue");p&&(p.textContent=se(n.total_words_human));const r=c("wordsTypedSubtitle");r&&(r.textContent=`${n.avg_words_per_prompt??0} words avg`);const v=c("nightOwlValue");v&&(v.textContent=`${o.night_owl_pct??0}%`);const x=c("peakHourValue");x&&(x.textContent=te(o.peak_hour));const $=c("peakDayValue");$&&($.textContent=o.peak_day||"N/A"),Be(a,t.nlp||{}),Le(o.heatmap),fe(t)}function ae(){if(!O)return;const e=ze();O.innerHTML="";for(const o of e){const s=document.createElement("button");s.className="source-pill",s.dataset.source=o;const a=W[o];if(a){const g=document.createElement("span");g.className="source-pill-dot",g.style.background=a,s.appendChild(g)}const c=document.createTextNode(G(o));s.appendChild(c),O.appendChild(s)}let t=localStorage.getItem(de)||P;t==="claude"&&e.includes("claude_code")&&(t="claude_code"),(t==="both"||!e.includes(t))&&(t=e.find(o=>o!=="both")||e[0]||"both");function n(o){O.querySelectorAll(".source-pill").forEach(s=>{s.classList.toggle("active",s.dataset.source===o)}),localStorage.setItem(de,o),he(o)}O.addEventListener("click",o=>{const s=o.target.closest(".source-pill");s&&n(s.dataset.source)}),n(t)}let F=null;function Ae(){const e=document.getElementById("methodologyModal");if(e){F=document.activeElement,e.classList.add("active"),document.body.style.overflow="hidden";const t=e.querySelector(".modal-close");t&&t.focus()}}function ce(){const e=document.getElementById("methodologyModal");e&&(e.classList.remove("active"),document.body.style.overflow="",F&&(F.focus(),F=null))}window.openMethodology=Ae;window.closeMethodology=ce;let J=null,U=null,j=null;function oe(){return Array.isArray(H)&&H.length>0?H:Array.isArray(U)&&U.length>0?U:[]}function ye(e){const t=Array.isArray(e)?e:[];return U=t,t.length>0&&(H=t),t}function Ne(e=[],t=[],n=[]){const o=new Map((e||[]).map(c=>[c.id,c])),s=new Set(n),a={};for(const c of t||[]){const g=o.get(c.id);if(!g){s.has(c.id)||(a[c.id]="New");continue}(g.status!==c.status||g.detected!==c.detected)&&(a[c.id]="Updated")}return a}async function be(e={}){const{useCache:t=!0,force:n=!1}=e;if(!n){const o=oe();if(t&&o.length>0)return o;if(j)return j}return j=fetch("/api/detect").then(o=>o.json()).then(o=>ye(o.backends||[])).catch(()=>oe()).finally(()=>{j=null}),j}function pe(e={},t=[],n={}){const{isRefreshing:o=!1,badges:s={}}=n,a=document.getElementById("settingsBackends");if(!a)return;const c=new Map((t||[]).map(l=>[l.id,l])),g=Array.from(new Set([...Object.keys(e.backends||{}),...Array.from(c.keys())]));if(g.length===0){a.innerHTML=`<div class="wizard-loading">${o?"Checking installed backends…":"No backend settings yet."}</div>`;return}a.innerHTML=g.map(l=>{const m=e.backends?.[l]||{enabled:!1},d=c.get(l),i=d?d.supported===!1||d.status==="coming_soon"||d.status==="not_found":!1;let p=o?"Checking installation...":"Saved configuration";d?.status==="available"&&(p="Ready to analyze"),d?.status==="coming_soon"&&(p="Detected, but analysis support is not shipped yet"),d?.status==="not_found"&&(p="Not installed");const r=s[l]?`<span class="settings-backend-badge">${s[l]}</span>`:"";return`<div class="settings-backend-row">
2
- <label class="wizard-toggle ${i?"is-disabled":""}">
3
- <input type="checkbox" data-backend="${l}" ${m.enabled!==!1?"checked":""} ${i?"disabled":""}>
4
- <span class="settings-backend-title">${G(l)}${r}</span>
5
- </label>
6
- <div class="settings-backend-detail">${p}</div>
7
- </div>`}).join("")}async function Pe(){const e=document.getElementById("settingsModal");if(!e)return;J=document.activeElement,e.classList.add("active"),document.body.style.overflow="hidden";const t=await fetch("/api/config").then(s=>s.json()).catch(()=>({})),n=oe();pe(t,n,{isRefreshing:!0});const o=document.getElementById("settingsExclusionSection");if(o&&t.backends?.claude_code){o.style.display="block";const s=t.backends.claude_code.exclusions??[];Ce("settingsExclusionChips",s)}be({force:!0}).then(s=>{if(!document.getElementById("settingsModal")?.classList.contains("active"))return;const c=[...n.map(l=>l.id),...Object.keys(t.backends||{})],g=Ne(n,s,c);pe(t,s,{isRefreshing:!1,badges:g})}).catch(()=>{})}function Y(){const e=document.getElementById("settingsModal");e&&(e.classList.remove("active"),document.body.style.overflow="",J&&(J.focus(),J=null))}async function De(){if(document.querySelectorAll("#settingsBackends input[type=checkbox]:checked").length===0){alert("Please enable at least one backend to analyze.");return}const t={};document.querySelectorAll("#settingsBackends input[type=checkbox]").forEach(n=>{t[n.dataset.backend]={enabled:n.checked,exclusions:[]}}),t.claude_code&&(t.claude_code.exclusions=ke("settingsExclusionChips")),await fetch("/api/config",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({backends:t})}),Y(),je()}window.openSettings=Pe;window.closeSettings=Y;document.getElementById("settingsAddExclusion")?.addEventListener("click",()=>we("settingsExclusionChips"));document.getElementById("settingsSave")?.addEventListener("click",De);document.getElementById("settingsReset")?.addEventListener("click",()=>{document.getElementById("resetConfirmModal")?.classList.add("active")});document.getElementById("resetCancel")?.addEventListener("click",()=>{document.getElementById("resetConfirmModal")?.classList.remove("active")});document.getElementById("resetConfirm")?.addEventListener("click",async()=>{await fetch("/api/reset",{method:"POST"}),window.location.reload()});document.getElementById("settingsModal")?.addEventListener("click",e=>{e.target===e.currentTarget&&Y()});document.getElementById("methodologyModal")?.addEventListener("click",e=>{e.target===e.currentTarget&&ce()});document.addEventListener("keydown",e=>{e.key==="Escape"&&(ce(),Y());const t=document.getElementById("methodologyModal");if(e.key==="Tab"&&t?.classList.contains("active")){const n=t.querySelectorAll('button, [href], [tabindex]:not([tabindex="-1"])');if(n.length===0)return;const o=n[0],s=n[n.length-1];e.shiftKey&&document.activeElement===o?(e.preventDefault(),s.focus()):!e.shiftKey&&document.activeElement===s&&(e.preventDefault(),o.focus())}});function Oe(){(location.protocol==="file:"||location.hostname==="localhost"||location.hostname==="127.0.0.1")&&document.querySelectorAll('a[href="/wrapped"]').forEach(t=>{const n=location.pathname,o=n.substring(0,n.lastIndexOf("/"));t.href=o+"/wrapped/index.html"})}function ve(e){re=e.branding||{};const t=re.github_repo||"https://github.com/eeshansrivastava89/howiprompt",n=document.getElementById("footerGithubLink");n&&(n.href=t)}let K=!1;async function je(){if(K)return;K=!0;const e=document.getElementById("refreshModal"),t=document.getElementById("refreshLog"),n=document.getElementById("refreshProgressBar"),o=document.getElementById("refreshModalResult"),s=document.getElementById("refreshModalClose");e&&(t&&(t.innerHTML='<div class="wizard-log-entry">Starting pipeline...</div>'),n&&(n.style.width="0"),o.style.display="none",s.style.display="none",e.classList.add("active"),document.body.style.overflow="hidden");const a=d=>{o&&(o.innerHTML=d,o.style.display="block",s.style.display="inline-block",s.focus()),K=!1},c=["sync","parse","insert","nlp","embedding","classifiers","metrics"];let g=0,l=!1;const m=new EventSource("/api/pipeline/stream");m.addEventListener("progress",d=>{const i=JSON.parse(d.data);if(t){const r=document.createElement("div");r.className="wizard-log-entry",r.textContent=`${i.stage}: ${i.detail}`,t.appendChild(r),t.scrollTop=t.scrollHeight}const p=c.indexOf(i.stage);p>=0&&p>g&&(g=p),n&&(n.style.width=`${(g+1)/c.length*100}%`)}),m.addEventListener("complete",d=>{l=!0,m.close();const i=JSON.parse(d.data);if(n&&(n.style.width="100%"),t){const v=document.createElement("div");v.className="wizard-log-entry done",v.textContent=`Done! ${i.stats.totalMessages.toLocaleString()} messages analyzed.`,t.appendChild(v),t.scrollTop=t.scrollHeight}i.metrics&&(b=i.metrics.source_views||{both:i.metrics},!b.claude_code&&b.claude&&(b.claude_code=b.claude),b.both=b.both||i.metrics,b[R]||(R="both"),ae(),he(R));const p=[],r=i.stats;r.newMessages>0?p.push(`<span class="result-num">${r.newMessages}</span> new message${r.newMessages===1?"":"s"} synced`):p.push("Already up to date"),p.push(`<span class="result-num">${se(r.totalMessages)}</span> total messages`),r.embedded>0&&p.push(`<span class="result-num">${r.embedded}</span> embeddings computed`),a(p.join("<br>"))}),m.addEventListener("pipeline_error",d=>{l=!0,m.close();const i=JSON.parse(d.data);a(`Refresh failed: ${i.message}`)}),m.onerror=()=>{l||(m.close(),a("Refresh failed — is the server running?"))}}document.getElementById("refreshModalClose")?.addEventListener("click",()=>{const e=document.getElementById("refreshModal");e&&(e.classList.remove("active"),document.body.style.overflow="")});let H=[];const I=[{key:"boot",label:"Prepare"},{key:"sync",label:"Sync Sources"},{key:"parse",label:"Parse Chats"},{key:"insert",label:"Store Messages"},{key:"nlp",label:"Language Scores"},{key:"embedding",label:"Embeddings"},{key:"classifiers",label:"Behavior Scores"},{key:"metrics",label:"Build Dashboard"}],Q=Object.fromEntries(I.map((e,t)=>[e.key,t]));function Re(){const e=document.getElementById("wizardLog"),t=document.getElementById("wizardProgressBar"),n=document.getElementById("wizardProgressLabel"),o=document.getElementById("wizardProgressPct"),s=document.getElementById("wizardStageList"),a=Object.fromEntries(I.map(({key:h},y)=>[h,{key:h,label:I[y].label,detail:"Waiting...",progress:0,status:"pending"}]));let c="boot",g=null,l=!1;function m(){const h=I.reduce((y,{key:k})=>y+(a[k].progress||0),0)/I.length;if(t&&(t.style.width=`${Math.round(h)}%`),n){const y=a[c]||a.boot;n.textContent=y?.detail||"Preparing analysis..."}o&&(o.textContent=`${Math.round(h)}%`),s&&(s.innerHTML=I.map(({key:y,label:k})=>{const f=a[y];return`
8
- <div class="wizard-stage-row">
9
- <div class="wizard-stage-name">${k}</div>
10
- <div class="wizard-stage-track is-${f.status}">
11
- <div class="wizard-stage-fill" style="width:${f.progress}%"></div>
12
- <span class="wizard-stage-detail">${f.detail}</span>
13
- </div>
14
- <div class="wizard-stage-value">${Math.round(f.progress)}%</div>
15
- </div>
16
- `}).join(""))}function d(){g&&(clearInterval(g),g=null)}function i(h){d(),g=window.setInterval(()=>{if(l||c!==h)return;const y=a[h],k=h==="embedding"||h==="classifiers"?95:88;y.progress>=k||(y.progress=Math.min(k,y.progress+(y.progress<30?3:1)),m())},450)}function p(h,y="normal"){if(!e)return;const k=document.createElement("div");k.className=`wizard-log-entry${y==="done"?" done":y==="error"?" error":""}`,k.textContent=h,e.appendChild(k),e.scrollTop=e.scrollHeight}function r(){e&&(e.innerHTML="");for(const{key:h}of I)a[h].detail="Waiting...",a[h].progress=0,a[h].status="pending";c="boot",a.boot.detail="Connecting to local pipeline...",a.boot.progress=5,a.boot.status="active",l=!1,p("Starting pipeline..."),i("boot"),m()}function v(h,y,k){const f=Q[h]!=null?h:"boot",u=Q[f],C=Q[c]??0;if(u>C)for(let S=C;S<u;S++){const E=I[S].key;a[E].status="done",a[E].progress=100}c=f;const w=a[f];w.status="active",w.detail=y,typeof k=="number"&&Number.isFinite(k)?w.progress=Math.max(w.progress,Math.min(100,k)):w.progress=Math.max(w.progress,12),p(`${f}: ${y}`),i(f),m()}function x(h){l=!0,d();for(const{key:y}of I)a[y].status="done",a[y].progress=100,a[y].detail==="Waiting..."&&(a[y].detail="Done");c="metrics",a.metrics.detail="Dashboard ready.",p(`Done! ${Number(h||0).toLocaleString()} messages analyzed.`,"done"),m()}function $(h){l=!0,d();const y=a[c]||a.boot;y.status="error",y.detail=h,p(`Error: ${h}`,"error"),m()}return{begin:r,advance:v,finish:x,fail:$}}async function He(){const e=document.getElementById("setupWizard");if(!e)return!1;let t=!1;try{t=(await fetch("./metrics.json")).ok}catch{}if(t)return fetch("/api/config",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({hasCompletedSetup:!0})}).catch(()=>{}),!1;let n;try{const o=await fetch("/api/config");o.ok&&(n=await o.json())}catch{}return n?.hasCompletedSetup&&t?!1:(e.classList.add("active"),document.body.style.overflow="hidden",await Ve(),!0)}async function Ve(){const e=document.getElementById("wizardBackends");if(e)try{const t=await fetch("/api/detect"),{backends:n}=await t.json();ye(n),e.innerHTML=n.map(o=>{let s="";return o.status==="available"?s="Detected locally":o.status==="coming_soon"?s="Detected (coming soon)":s="Not installed",`
17
- <div class="wizard-backend ${o.detected?"detected":""}" data-id="${o.id}">
18
- <div class="wizard-backend-icon ${o.status}"></div>
19
- <div class="wizard-backend-info">
20
- <div class="wizard-backend-name">${o.name}</div>
21
- <div class="wizard-backend-detail">${s}</div>
22
- </div>
23
- </div>`}).join("")}catch{e.innerHTML='<div class="wizard-loading">Could not detect backends.</div>'}}async function we(e){const t=document.getElementById(e);if(!t)return;let n;try{n=(await(await fetch("/api/pick-directory")).json()).path}catch{return}if(!n||t.querySelector(`[data-path="${CSS.escape(n)}"]`))return;let o=0;try{o=(await(await fetch("/api/exclusion-count",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:n})})).json()).messageCount||0}catch{}Ee(t,n,o)}function Ee(e,t,n){const o=document.createElement("div");o.className="exclusion-chip",o.dataset.path=t;const s=t.split("/").pop()||t,a=n>0?`${n.toLocaleString()} messages`:"no data found";o.innerHTML=`
24
- <span class="exclusion-chip-path" title="${t}">${s}</span>
25
- <span class="exclusion-chip-count">${a}</span>
26
- <button class="exclusion-chip-remove" type="button" aria-label="Remove">&times;</button>
27
- `,o.querySelector(".exclusion-chip-remove").addEventListener("click",()=>o.remove()),e.appendChild(o)}function ke(e){const t=document.getElementById(e);return t?[...t.querySelectorAll(".exclusion-chip")].map(n=>n.dataset.path):[]}async function Ce(e,t){const n=document.getElementById(e);if(n){n.innerHTML="";for(const o of t){let s=0;try{s=(await(await fetch("/api/exclusion-count",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:o})})).json()).messageCount||0}catch{}Ee(n,o,s)}}}function qe(){const e=document.getElementById("wizardConfig"),t=document.getElementById("wizardExclusions");if(!e)return;const n=H.filter(o=>o.status==="available"&&o.supported!==!1);fetch("/api/config").then(o=>o.json()).then(o=>{e.innerHTML=n.map(s=>{const a=o.backends?.[s.id],c=a?a.enabled!==!1:!0;return`
28
- <label class="wizard-toggle">
29
- <input type="checkbox" data-backend="${s.id}" ${c?"checked":""}>
30
- ${s.name}
31
- </label>
32
- `}).join(""),n.some(s=>s.id==="claude_code")&&t?(t.style.display="block",Ce("wizardExclusionChips",o.backends?.claude_code?.exclusions??[])):t&&(t.style.display="none")}).catch(()=>{e.innerHTML=n.map(o=>`
33
- <label class="wizard-toggle">
34
- <input type="checkbox" data-backend="${o.id}" checked>
35
- ${o.name}
36
- </label>
37
- `).join("")})}async function Fe(){const e={};document.querySelectorAll("#wizardConfig input[type=checkbox]").forEach(t=>{e[t.dataset.backend]={enabled:t.checked,exclusions:[]}}),e.claude_code&&(e.claude_code.exclusions=ke("wizardExclusionChips"));try{await fetch("/api/config",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({backends:e})})}catch{}}function Je(){const e=document.getElementById("wizardDone"),t=Re();let n=!1;t.begin();const o=new EventSource("/api/pipeline/stream");o.addEventListener("progress",s=>{const a=JSON.parse(s.data);t.advance(a.stage,a.detail,a.progress)}),o.addEventListener("complete",s=>{n=!0,o.close();const a=JSON.parse(s.data);t.finish(a.stats.totalMessages),e&&(e.style.display="inline-block"),a.metrics&&(b=a.metrics.source_views||{both:a.metrics},!b.claude_code&&b.claude&&(b.claude_code=b.claude),b.both=b.both||a.metrics,P=a.metrics.default_view||"both",P==="claude"&&b.claude_code&&(P="claude_code"))}),o.addEventListener("pipeline_error",s=>{n=!0,o.close();const a=JSON.parse(s.data);t.fail(a.message),e&&(e.textContent="Continue Anyway",e.style.display="inline-block")}),o.onerror=()=>{n||(o.close(),t.fail("Connection lost — check terminal for details."),e&&(e.textContent="Continue Anyway",e.style.display="inline-block"))}}function ie(e){document.querySelectorAll(".wizard-step").forEach(t=>{const n=Number(t.dataset.step);t.classList.toggle("active",n===e),t.classList.toggle("done",n<e)}),document.querySelectorAll(".wizard-page").forEach(t=>t.classList.remove("active")),document.getElementById(`wizardStep${e}`)?.classList.add("active")}document.getElementById("wizardAddExclusion")?.addEventListener("click",()=>we("wizardExclusionChips"));document.getElementById("wizardNext1")?.addEventListener("click",()=>{qe(),ie(2)});document.getElementById("wizardBack2")?.addEventListener("click",()=>ie(1));document.getElementById("wizardNext2")?.addEventListener("click",async()=>{if(document.querySelectorAll("#wizardConfig input[type=checkbox]:checked").length===0){alert("Please enable at least one backend to analyze.");return}await Fe(),ie(3),Je()});document.getElementById("wizardDone")?.addEventListener("click",async()=>{try{await fetch("/api/config",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({hasCompletedSetup:!0})})}catch{}const e=document.getElementById("setupWizard");e&&(e.classList.remove("active"),document.body.style.overflow=""),ve({}),ae()});async function Ue(){if(Se(),Oe(),Te(),document.getElementById("themeToggle")?.addEventListener("click",()=>{requestAnimationFrame(()=>{Z&&fe(Z)})}),!await He()){be({useCache:!0}).catch(()=>{});try{const t=await fetch("./metrics.json");if(!t.ok)throw new Error(`HTTP ${t.status}`);const n=await t.json();b=n.source_views||{both:n},!b.claude_code&&b.claude&&(b.claude_code=b.claude),b.both=b.both||n,P=n.default_view||"both",P==="claude"&&b.claude_code&&(P="claude_code"),ve(n),ae()}catch(t){console.warn("Could not load metrics.json:",t.message)}}}Ue();