tmux-agent-monitor 0.0.3 → 0.0.6

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/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { a as resolveLogPaths, c as isDangerousCommand, i as decodePaneId, l as allowedKeys, n as configSchema, o as resolveServerKey, r as wsClientMessageSchema, s as compileDangerPatterns, t as claudeHookEventSchema, u as defaultConfig } from "./src-C_y43gN3.mjs";
2
+ import { a as resolveServerKey, c as allowedKeys, i as resolveLogPaths, l as defaultConfig, n as configSchema, o as compileDangerPatterns, r as wsClientMessageSchema, s as isDangerousCommand, t as claudeHookEventSchema } from "./src-CFxYk-pF.mjs";
3
3
  import { serve } from "@hono/node-server";
4
4
  import { execa } from "execa";
5
5
  import qrcode from "qrcode-terminal";
@@ -1288,23 +1288,15 @@ const createApp = ({ config, monitor, tmuxActions }) => {
1288
1288
  });
1289
1289
  });
1290
1290
  app.get("/api/sessions/:paneId", (c) => {
1291
- let paneId;
1292
- try {
1293
- paneId = decodePaneId(c.req.param("paneId"));
1294
- } catch {
1295
- return c.json({ error: buildError$1("INVALID_PAYLOAD", "invalid pane id") }, 400);
1296
- }
1291
+ const paneId = c.req.param("paneId");
1292
+ if (!paneId) return c.json({ error: buildError$1("INVALID_PAYLOAD", "invalid pane id") }, 400);
1297
1293
  const detail = monitor.registry.getDetail(paneId);
1298
1294
  if (!detail) return c.json({ error: buildError$1("NOT_FOUND", "pane not found") }, 404);
1299
1295
  return c.json({ session: detail });
1300
1296
  });
1301
1297
  app.get("/api/sessions/:paneId/diff", async (c) => {
1302
- let paneId;
1303
- try {
1304
- paneId = decodePaneId(c.req.param("paneId"));
1305
- } catch {
1306
- return c.json({ error: buildError$1("INVALID_PAYLOAD", "invalid pane id") }, 400);
1307
- }
1298
+ const paneId = c.req.param("paneId");
1299
+ if (!paneId) return c.json({ error: buildError$1("INVALID_PAYLOAD", "invalid pane id") }, 400);
1308
1300
  const detail = monitor.registry.getDetail(paneId);
1309
1301
  if (!detail) return c.json({ error: buildError$1("NOT_FOUND", "pane not found") }, 404);
1310
1302
  const force = c.req.query("force") === "1";
@@ -1312,12 +1304,8 @@ const createApp = ({ config, monitor, tmuxActions }) => {
1312
1304
  return c.json({ summary });
1313
1305
  });
1314
1306
  app.get("/api/sessions/:paneId/diff/file", async (c) => {
1315
- let paneId;
1316
- try {
1317
- paneId = decodePaneId(c.req.param("paneId"));
1318
- } catch {
1319
- return c.json({ error: buildError$1("INVALID_PAYLOAD", "invalid pane id") }, 400);
1320
- }
1307
+ const paneId = c.req.param("paneId");
1308
+ if (!paneId) return c.json({ error: buildError$1("INVALID_PAYLOAD", "invalid pane id") }, 400);
1321
1309
  const detail = monitor.registry.getDetail(paneId);
1322
1310
  if (!detail) return c.json({ error: buildError$1("NOT_FOUND", "pane not found") }, 404);
1323
1311
  const pathParam = c.req.query("path");
@@ -1331,12 +1319,8 @@ const createApp = ({ config, monitor, tmuxActions }) => {
1331
1319
  return c.json({ file });
1332
1320
  });
1333
1321
  app.get("/api/sessions/:paneId/commits", async (c) => {
1334
- let paneId;
1335
- try {
1336
- paneId = decodePaneId(c.req.param("paneId"));
1337
- } catch {
1338
- return c.json({ error: buildError$1("INVALID_PAYLOAD", "invalid pane id") }, 400);
1339
- }
1322
+ const paneId = c.req.param("paneId");
1323
+ if (!paneId) return c.json({ error: buildError$1("INVALID_PAYLOAD", "invalid pane id") }, 400);
1340
1324
  const detail = monitor.registry.getDetail(paneId);
1341
1325
  if (!detail) return c.json({ error: buildError$1("NOT_FOUND", "pane not found") }, 404);
1342
1326
  const limit = Number.parseInt(c.req.query("limit") ?? "10", 10);
@@ -1350,12 +1334,8 @@ const createApp = ({ config, monitor, tmuxActions }) => {
1350
1334
  return c.json({ log });
1351
1335
  });
1352
1336
  app.get("/api/sessions/:paneId/commits/:hash", async (c) => {
1353
- let paneId;
1354
- try {
1355
- paneId = decodePaneId(c.req.param("paneId"));
1356
- } catch {
1357
- return c.json({ error: buildError$1("INVALID_PAYLOAD", "invalid pane id") }, 400);
1358
- }
1337
+ const paneId = c.req.param("paneId");
1338
+ if (!paneId) return c.json({ error: buildError$1("INVALID_PAYLOAD", "invalid pane id") }, 400);
1359
1339
  const detail = monitor.registry.getDetail(paneId);
1360
1340
  if (!detail) return c.json({ error: buildError$1("NOT_FOUND", "pane not found") }, 404);
1361
1341
  const hash = c.req.param("hash");
@@ -1370,12 +1350,8 @@ const createApp = ({ config, monitor, tmuxActions }) => {
1370
1350
  return c.json({ commit });
1371
1351
  });
1372
1352
  app.get("/api/sessions/:paneId/commits/:hash/file", async (c) => {
1373
- let paneId;
1374
- try {
1375
- paneId = decodePaneId(c.req.param("paneId"));
1376
- } catch {
1377
- return c.json({ error: buildError$1("INVALID_PAYLOAD", "invalid pane id") }, 400);
1378
- }
1353
+ const paneId = c.req.param("paneId");
1354
+ if (!paneId) return c.json({ error: buildError$1("INVALID_PAYLOAD", "invalid pane id") }, 400);
1379
1355
  const detail = monitor.registry.getDetail(paneId);
1380
1356
  if (!detail) return c.json({ error: buildError$1("NOT_FOUND", "pane not found") }, 404);
1381
1357
  const hash = c.req.param("hash");
@@ -139,18 +139,6 @@ const isDangerousCommand = (text, patterns) => {
139
139
  const encodePaneId = (paneId) => {
140
140
  return encodeURIComponent(paneId);
141
141
  };
142
- const decodePaneId = (paneIdEncoded) => {
143
- try {
144
- const decoded = decodeURIComponent(paneIdEncoded);
145
- for (let i = 0; i < decoded.length; i += 1) {
146
- const code = decoded.charCodeAt(i);
147
- if (code < 32 || code === 127) return paneIdEncoded;
148
- }
149
- return decoded;
150
- } catch {
151
- return paneIdEncoded;
152
- }
153
- };
154
142
  const sanitizeServerKey = (value) => {
155
143
  return value.replace(/\//g, "_").replace(/[^a-zA-Z0-9_-]/g, "-");
156
144
  };
@@ -366,4 +354,4 @@ const configSchema = z.object({
366
354
  });
367
355
 
368
356
  //#endregion
369
- export { resolveLogPaths as a, isDangerousCommand as c, decodePaneId as i, allowedKeys as l, configSchema as n, resolveServerKey as o, wsClientMessageSchema as r, compileDangerPatterns as s, claudeHookEventSchema as t, defaultConfig as u };
357
+ export { resolveServerKey as a, allowedKeys as c, resolveLogPaths as i, defaultConfig as l, configSchema as n, compileDangerPatterns as o, wsClientMessageSchema as r, isDangerousCommand as s, claudeHookEventSchema as t };
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { o as resolveServerKey } from "./src-C_y43gN3.mjs";
2
+ import { a as resolveServerKey } from "./src-CFxYk-pF.mjs";
3
3
  import fs from "node:fs";
4
4
  import path from "node:path";
5
5
  import os from "node:os";
@@ -0,0 +1 @@
1
+ *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:IBM Plex Mono,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.visible{visibility:visible}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.z-10{z-index:10}.mx-auto{margin-left:auto;margin-right:auto}.mb-3{margin-bottom:.75rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.h-2{height:.5rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-8{height:2rem}.max-h-\[240px\]{max-height:240px}.max-h-\[360px\]{max-height:360px}.max-h-\[480px\]{max-height:480px}.min-h-\[320px\]{min-height:320px}.min-h-\[64px\]{min-height:64px}.w-2{width:.5rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-8{width:2rem}.w-full{width:100%}.w-max{width:-moz-max-content;width:max-content}.min-w-0{min-width:0px}.min-w-\[200px\]{min-width:200px}.min-w-\[70px\]{min-width:70px}.max-w-2xl{max-width:42rem}.max-w-5xl{max-width:64rem}.max-w-full{max-width:100%}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.resize-y{resize:vertical}.resize{resize:both}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.self-start{align-self:flex-start}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.break-all{word-break:break-all}.rounded-2xl{border-radius:1rem}.rounded-3xl{border-radius:1.5rem}.rounded-\[32px\]{border-radius:32px}.rounded-full{border-radius:9999px}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-2{border-width:2px}.border-t{border-top-width:1px}.border-latte-blue\/40{border-color:rgb(var(--ctp-blue) / .4)}.border-latte-green\/40{border-color:rgb(var(--ctp-green) / .4)}.border-latte-lavender\/35{border-color:rgb(var(--ctp-lavender) / .35)}.border-latte-lavender\/40{border-color:rgb(var(--ctp-lavender) / .4)}.border-latte-lavender\/60{border-color:rgb(var(--ctp-lavender) / .6)}.border-latte-overlay0\/60{border-color:rgb(var(--ctp-overlay0) / .6)}.border-latte-peach\/40{border-color:rgb(var(--ctp-peach) / .4)}.border-latte-peach\/50{border-color:rgb(var(--ctp-peach) / .5)}.border-latte-red\/40{border-color:rgb(var(--ctp-red) / .4)}.border-latte-surface1{--tw-border-opacity: 1;border-color:rgb(var(--ctp-surface1) / var(--tw-border-opacity, 1))}.border-latte-surface1\/60{border-color:rgb(var(--ctp-surface1) / .6)}.border-latte-surface2{--tw-border-opacity: 1;border-color:rgb(var(--ctp-surface2) / var(--tw-border-opacity, 1))}.border-latte-surface2\/70{border-color:rgb(var(--ctp-surface2) / .7)}.border-t-latte-lavender{--tw-border-opacity: 1;border-top-color:rgb(var(--ctp-lavender) / var(--tw-border-opacity, 1))}.bg-latte-base\/60{background-color:rgb(var(--ctp-base) / .6)}.bg-latte-base\/70{background-color:rgb(var(--ctp-base) / .7)}.bg-latte-base\/80{background-color:rgb(var(--ctp-base) / .8)}.bg-latte-blue\/15{background-color:rgb(var(--ctp-blue) / .15)}.bg-latte-green{--tw-bg-opacity: 1;background-color:rgb(var(--ctp-green) / var(--tw-bg-opacity, 1))}.bg-latte-green\/20{background-color:rgb(var(--ctp-green) / .2)}.bg-latte-lavender{--tw-bg-opacity: 1;background-color:rgb(var(--ctp-lavender) / var(--tw-bg-opacity, 1))}.bg-latte-lavender\/10{background-color:rgb(var(--ctp-lavender) / .1)}.bg-latte-mantle\/40{background-color:rgb(var(--ctp-mantle) / .4)}.bg-latte-peach\/10{background-color:rgb(var(--ctp-peach) / .1)}.bg-latte-peach\/20{background-color:rgb(var(--ctp-peach) / .2)}.bg-latte-red{--tw-bg-opacity: 1;background-color:rgb(var(--ctp-red) / var(--tw-bg-opacity, 1))}.bg-latte-red\/10{background-color:rgb(var(--ctp-red) / .1)}.bg-latte-red\/15{background-color:rgb(var(--ctp-red) / .15)}.bg-latte-red\/20{background-color:rgb(var(--ctp-red) / .2)}.bg-latte-surface0\/60{background-color:rgb(var(--ctp-surface0) / .6)}.bg-latte-surface1{--tw-bg-opacity: 1;background-color:rgb(var(--ctp-surface1) / var(--tw-bg-opacity, 1))}.bg-transparent{background-color:transparent}.object-contain{-o-object-fit:contain;object-fit:contain}.p-1{padding:.25rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.text-left{text-align:left}.font-display{font-family:Fraunces,serif}.font-mono{font-family:IBM Plex Mono,monospace}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xs{font-size:.75rem;line-height:1rem}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.tracking-\[0\.24em\]{letter-spacing:.24em}.tracking-\[0\.25em\]{letter-spacing:.25em}.tracking-\[0\.2em\]{letter-spacing:.2em}.tracking-\[0\.32em\]{letter-spacing:.32em}.tracking-\[0\.3em\]{letter-spacing:.3em}.tracking-\[0\.4em\]{letter-spacing:.4em}.tracking-\[0\.5em\]{letter-spacing:.5em}.text-latte-base{--tw-text-opacity: 1;color:rgb(var(--ctp-base) / var(--tw-text-opacity, 1))}.text-latte-blue{--tw-text-opacity: 1;color:rgb(var(--ctp-blue) / var(--tw-text-opacity, 1))}.text-latte-green{--tw-text-opacity: 1;color:rgb(var(--ctp-green) / var(--tw-text-opacity, 1))}.text-latte-lavender{--tw-text-opacity: 1;color:rgb(var(--ctp-lavender) / var(--tw-text-opacity, 1))}.text-latte-overlay1{--tw-text-opacity: 1;color:rgb(var(--ctp-overlay1) / var(--tw-text-opacity, 1))}.text-latte-peach{--tw-text-opacity: 1;color:rgb(var(--ctp-peach) / var(--tw-text-opacity, 1))}.text-latte-red{--tw-text-opacity: 1;color:rgb(var(--ctp-red) / var(--tw-text-opacity, 1))}.text-latte-subtext0{--tw-text-opacity: 1;color:rgb(var(--ctp-subtext0) / var(--tw-text-opacity, 1))}.text-latte-subtext1{--tw-text-opacity: 1;color:rgb(var(--ctp-subtext1) / var(--tw-text-opacity, 1))}.text-latte-text{--tw-text-opacity: 1;color:rgb(var(--ctp-text) / var(--tw-text-opacity, 1))}.text-latte-yellow{--tw-text-opacity: 1;color:rgb(var(--ctp-yellow) / var(--tw-text-opacity, 1))}.shadow-\[inset_0_0_0_1px_rgba\(114\,135\,253\,0\.12\)\]{--tw-shadow: inset 0 0 0 1px rgba(114,135,253,.12);--tw-shadow-colored: inset 0 0 0 1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-glass{--tw-shadow: 0 20px 60px -30px rgb(var(--ctp-shadow) / .35);--tw-shadow-colored: 0 20px 60px -30px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-glow{--tw-shadow: 0 0 0 1px rgb(var(--ctp-lavender) / .3), 0 15px 40px -20px rgb(var(--ctp-lavender) / .6);--tw-shadow-colored: 0 0 0 1px var(--tw-shadow-color), 0 15px 40px -20px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur{--tw-backdrop-blur: blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.backdrop-blur-sm{--tw-backdrop-blur: blur(4px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}:root{color-scheme:light;--ctp-base: 239 241 245;--ctp-mantle: 230 233 239;--ctp-crust: 220 224 232;--ctp-text: 76 79 105;--ctp-subtext1: 92 95 119;--ctp-subtext0: 108 111 133;--ctp-surface0: 204 208 218;--ctp-surface1: 188 192 204;--ctp-surface2: 172 176 190;--ctp-overlay0: 156 160 176;--ctp-overlay1: 140 143 161;--ctp-overlay2: 124 127 147;--ctp-blue: 30 102 245;--ctp-lavender: 114 135 253;--ctp-peach: 254 100 11;--ctp-red: 210 15 57;--ctp-green: 64 160 43;--ctp-yellow: 223 142 29;--ctp-mauve: 136 57 239;--ctp-maroon: 230 69 83;--ctp-shadow: 31 30 58;--grid-dot-alpha: .15;--grid-opacity: .08;--bg-gradient-1: radial-gradient( 1200px 600px at 20% 0%, rgb(var(--ctp-lavender) / .18), transparent 55% );--bg-gradient-2: radial-gradient( 900px 500px at 90% 10%, rgb(var(--ctp-peach) / .12), transparent 60% )}:root[data-theme=mocha]{color-scheme:dark;--ctp-base: 30 30 46;--ctp-mantle: 24 24 37;--ctp-crust: 17 17 27;--ctp-text: 205 214 244;--ctp-subtext1: 186 194 222;--ctp-subtext0: 166 173 200;--ctp-surface0: 49 50 68;--ctp-surface1: 69 71 90;--ctp-surface2: 88 91 112;--ctp-overlay0: 108 112 134;--ctp-overlay1: 127 132 156;--ctp-overlay2: 147 153 178;--ctp-blue: 137 180 250;--ctp-lavender: 180 190 254;--ctp-peach: 250 179 135;--ctp-red: 243 139 168;--ctp-green: 166 227 161;--ctp-yellow: 249 226 175;--ctp-mauve: 203 166 247;--ctp-maroon: 235 160 172;--ctp-shadow: 8 10 22;--grid-dot-alpha: .12;--grid-opacity: .12;--bg-gradient-1: radial-gradient( 1200px 600px at 20% 0%, rgb(var(--ctp-lavender) / .12), transparent 60% );--bg-gradient-2: radial-gradient( 900px 500px at 90% 10%, rgb(var(--ctp-peach) / .08), transparent 65% )}body{font-family:IBM Plex Sans,sans-serif;background:var(--bg-gradient-1),var(--bg-gradient-2),rgb(var(--ctp-base));color:rgb(var(--ctp-text));min-height:100vh}body:before{content:"";position:fixed;inset:0;pointer-events:none;opacity:var(--grid-opacity);background-image:radial-gradient(rgb(var(--ctp-text) / var(--grid-dot-alpha)) 1px,transparent 1px);background-size:24px 24px;mix-blend-mode:multiply}*{box-sizing:border-box}.hover\:-translate-y-1:hover{--tw-translate-y: -.25rem;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:translate-y-\[-1px\]:hover{--tw-translate-y: -1px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.hover\:border-latte-overlay1:hover{--tw-border-opacity: 1;border-color:rgb(var(--ctp-overlay1) / var(--tw-border-opacity, 1))}.hover\:bg-latte-crust:hover{--tw-bg-opacity: 1;background-color:rgb(var(--ctp-crust) / var(--tw-bg-opacity, 1))}.hover\:bg-latte-surface1\/70:hover{background-color:rgb(var(--ctp-surface1) / .7)}.hover\:text-latte-text:hover{--tw-text-opacity: 1;color:rgb(var(--ctp-text) / var(--tw-text-opacity, 1))}.hover\:shadow-glow:hover{--tw-shadow: 0 0 0 1px rgb(var(--ctp-lavender) / .3), 0 15px 40px -20px rgb(var(--ctp-lavender) / .6);--tw-shadow-colored: 0 0 0 1px var(--tw-shadow-color), 0 15px 40px -20px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.focus\:border-latte-lavender:focus{--tw-border-opacity: 1;border-color:rgb(var(--ctp-lavender) / var(--tw-border-opacity, 1))}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-latte-lavender\/30:focus{--tw-ring-color: rgb(var(--ctp-lavender) / .3)}.focus-visible\:outline-none:focus-visible{outline:2px solid transparent;outline-offset:2px}.focus-visible\:ring-2:focus-visible{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus-visible\:ring-latte-lavender:focus-visible{--tw-ring-opacity: 1;--tw-ring-color: rgb(var(--ctp-lavender) / var(--tw-ring-opacity, 1))}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:opacity-50:disabled{opacity:.5}.data-\[state\=active\]\:bg-latte-base\/90[data-state=active]{background-color:rgb(var(--ctp-base) / .9)}.data-\[state\=active\]\:text-latte-text[data-state=active]{--tw-text-opacity: 1;color:rgb(var(--ctp-text) / var(--tw-text-opacity, 1))}.data-\[state\=active\]\:shadow-sm[data-state=active]{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}@media(min-width:768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:text-sm{font-size:.875rem;line-height:1.25rem}}@media(min-width:1024px){.lg\:grid-cols-\[1\.3fr_1fr\]{grid-template-columns:1.3fr 1fr}}