@mukulaggarwal/pacman 0.1.5 → 0.1.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.
@@ -11,8 +11,8 @@
11
11
  href="https://fonts.googleapis.com/css2?family=Press+Start+2P&family=Orbitron:wght@400;500;600;700&family=Lexend:wght@300;400;500;600&family=Fira+Code:wght@400;500&display=swap"
12
12
  rel="stylesheet"
13
13
  />
14
- <script type="module" crossorigin src="/assets/index-DBwmBIzA.js"></script>
15
- <link rel="stylesheet" crossorigin href="/assets/index-BOAOMlJT.css">
14
+ <script type="module" crossorigin src="/assets/index-C0NQ8pNs.js"></script>
15
+ <link rel="stylesheet" crossorigin href="/assets/index-BwF9HPxA.css">
16
16
  </head>
17
17
  <body>
18
18
  <div id="root"></div>
@@ -13,7 +13,7 @@ import {
13
13
  import {
14
14
  createSlackConnector,
15
15
  openSocketModeConnection
16
- } from "./chunk-YJ32S56Q.js";
16
+ } from "./chunk-X6CHTBN2.js";
17
17
 
18
18
  // src/slack-listener.ts
19
19
  import { google } from "googleapis";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mukulaggarwal/pacman",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "description": "Privacy-first personal assistant context manager with MCP, onboarding, and Slack runtime",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../integrations-slack/dist/index.js"],"sourcesContent":["// src/index.ts\nimport WebSocket from \"ws\";\nvar SLACK_API_BASE = \"https://slack.com/api\";\nvar SlackConnector = class {\n type = \"slack\";\n token;\n channels;\n async authenticate(config) {\n this.token = config.credentials?.botToken;\n this.channels = config.channels;\n if (!this.token) {\n throw new Error(\"Slack bot token is required\");\n }\n }\n async healthCheck() {\n if (!this.token) throw new Error(\"Slack bot token is required\");\n const data = await slackApiRequest(\n this.token,\n \"auth.test\"\n );\n return {\n summary: `Connected as ${data.user ?? \"unknown\"} in ${data.team ?? \"unknown workspace\"}`\n };\n }\n async fetchDelta(cursor) {\n if (!this.token) throw new Error(\"Not authenticated\");\n const channelIds = this.channels?.length ? this.channels : (await this.listChannels()).map((channel) => channel.id);\n const oldest = cursor ? Math.floor(new Date(cursor).getTime() / 1e3).toString() : void 0;\n const items = [];\n for (const channelId of channelIds) {\n const data = await slackApiRequest(\n this.token,\n \"conversations.history\",\n {\n channel: channelId,\n limit: \"50\",\n ...oldest ? { oldest } : {}\n }\n );\n for (const msg of data.messages ?? []) {\n items.push({\n id: `${channelId}:${msg.ts}`,\n source: \"slack\",\n type: \"message\",\n content: msg.text ?? \"\",\n metadata: {\n user: msg.user,\n botId: msg.bot_id,\n channel: channelId,\n subtype: msg.subtype,\n threadTs: msg.thread_ts\n },\n timestamp: new Date(parseFloat(msg.ts) * 1e3).toISOString()\n });\n }\n }\n return {\n items,\n newCursor: (/* @__PURE__ */ new Date()).toISOString(),\n hasMore: false\n };\n }\n async normalize(rawItems) {\n return rawItems.map((item) => ({\n id: item.id,\n source: \"slack\",\n title: `Slack message from ${item.metadata.user ?? \"unknown\"}`,\n body: item.content,\n entities: extractMentions(item.content),\n timestamp: item.timestamp\n }));\n }\n async listChannels() {\n if (!this.token) throw new Error(\"Slack bot token is required\");\n const channels = [];\n let cursor;\n do {\n const data = await slackApiRequest(\n this.token,\n \"conversations.list\",\n {\n limit: \"200\",\n types: \"public_channel,private_channel\",\n exclude_archived: \"true\",\n ...cursor ? { cursor } : {}\n }\n );\n for (const channel of data.channels ?? []) {\n if (!channel.id || !channel.name) continue;\n channels.push({\n id: channel.id,\n name: channel.name,\n isPrivate: !!channel.is_private\n });\n }\n cursor = data.response_metadata?.next_cursor || void 0;\n } while (cursor);\n return channels.sort((a, b) => a.name.localeCompare(b.name));\n }\n async listUsers() {\n if (!this.token) throw new Error(\"Slack bot token is required\");\n const users = [];\n let cursor;\n do {\n const data = await slackApiRequest(\n this.token,\n \"users.list\",\n {\n limit: \"200\",\n ...cursor ? { cursor } : {}\n }\n );\n for (const member of data.members ?? []) {\n if (!member.id || member.deleted || member.is_bot) continue;\n users.push({\n id: member.id,\n name: member.name ?? member.real_name ?? member.id,\n realName: member.real_name\n });\n }\n cursor = data.response_metadata?.next_cursor || void 0;\n } while (cursor);\n return users.sort((a, b) => a.name.localeCompare(b.name));\n }\n async fetchThread(channelId, threadTs, channelName) {\n if (!this.token) throw new Error(\"Slack bot token is required\");\n const data = await slackApiRequest(\n this.token,\n \"conversations.replies\",\n {\n channel: channelId,\n ts: threadTs,\n limit: \"200\"\n }\n );\n const permalink = await this.getPermalink(channelId, threadTs).catch(() => void 0);\n const messages = (data.messages ?? []).map(toSlackThreadMessage);\n return {\n channelId,\n channelName,\n threadTs,\n permalink,\n messages\n };\n }\n async getPermalink(channelId, messageTs) {\n if (!this.token) throw new Error(\"Slack bot token is required\");\n const data = await slackApiRequest(\n this.token,\n \"chat.getPermalink\",\n { channel: channelId, message_ts: messageTs }\n );\n return data.permalink;\n }\n async postThreadReply(channelId, threadTs, text) {\n if (!this.token) throw new Error(\"Slack bot token is required\");\n const data = await slackApiRequest(\n this.token,\n \"chat.postMessage\",\n void 0,\n {\n channel: channelId,\n thread_ts: threadTs,\n text\n }\n );\n return data.ts ?? threadTs;\n }\n async postEphemeral(channelId, userId, text, threadTs) {\n if (!this.token) throw new Error(\"Slack bot token is required\");\n await slackApiRequest(\n this.token,\n \"chat.postEphemeral\",\n void 0,\n {\n channel: channelId,\n user: userId,\n thread_ts: threadTs,\n text\n }\n );\n }\n};\nasync function validateSlackAppToken(appToken) {\n await slackApiRequest(\n appToken,\n \"apps.connections.open\",\n void 0,\n {},\n \"POST\"\n );\n}\nasync function openSocketModeConnection(appToken, handlers, createSocket = (url) => new WebSocket(url)) {\n const data = await slackApiRequest(\n appToken,\n \"apps.connections.open\",\n void 0,\n {},\n \"POST\"\n );\n if (!data.url) {\n throw new Error(\"Slack did not return a Socket Mode URL\");\n }\n const socket = createSocket(data.url);\n await new Promise((resolve, reject) => {\n let settled = false;\n socket.on(\"open\", () => {\n settled = true;\n resolve();\n });\n socket.on(\"error\", (err) => {\n if (!settled) {\n reject(err);\n return;\n }\n handlers.onError?.(err);\n });\n });\n socket.on(\"message\", (rawData) => {\n try {\n const envelope = JSON.parse(rawData.toString());\n if (envelope.envelope_id) {\n socket.send(JSON.stringify({ envelope_id: envelope.envelope_id }));\n }\n handlers.onEnvelope?.(envelope);\n const event = envelope.payload?.event;\n if (event) {\n handlers.onEvent?.(event);\n }\n } catch (err) {\n handlers.onError?.(err instanceof Error ? err : new Error(String(err)));\n }\n });\n const closed = new Promise((resolve) => {\n socket.on(\"close\", () => {\n resolve();\n });\n });\n return {\n close: () => socket.close(),\n closed\n };\n}\nfunction toSlackThreadMessage(message) {\n return {\n ts: message.ts,\n text: message.text ?? \"\",\n userId: message.user,\n botId: message.bot_id,\n subtype: message.subtype,\n threadTs: message.thread_ts\n };\n}\nfunction extractMentions(text) {\n const mentions = text.match(/<@[\\w]+>/g) ?? [];\n return mentions.map((m) => m.replace(/<@|>/g, \"\"));\n}\nasync function slackApiRequest(token, method, params, body, httpMethod = body ? \"POST\" : \"GET\") {\n const url = new URL(`${SLACK_API_BASE}/${method}`);\n if (params) {\n for (const [key, value] of Object.entries(params)) {\n if (value !== void 0 && value !== \"\") {\n url.searchParams.set(key, value);\n }\n }\n }\n const response = await fetch(url, {\n method: httpMethod,\n headers: {\n Authorization: `Bearer ${token}`,\n ...body ? { \"Content-Type\": \"application/json; charset=utf-8\" } : {}\n },\n ...body ? { body: JSON.stringify(body) } : {}\n });\n const data = await response.json();\n if (!response.ok || !data.ok) {\n throw new Error(`Slack API ${method} failed: ${data.error ?? response.statusText}`);\n }\n return data;\n}\nfunction createSlackConnector() {\n return new SlackConnector();\n}\nexport {\n SlackConnector,\n createSlackConnector,\n openSocketModeConnection,\n validateSlackAppToken\n};\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../integrations-gdrive/dist/index.js"],"sourcesContent":["// src/index.ts\nvar GDriveDocsConnector = class {\n type = \"gdrive\";\n credentials;\n async authenticate(config) {\n this.credentials = config.credentials;\n if (!this.credentials?.clientId || !this.credentials?.clientSecret || !this.credentials?.refreshToken) {\n throw new Error(\"Google Drive client ID, client secret, and refresh token are required\");\n }\n }\n async healthCheck() {\n if (!this.credentials?.clientId || !this.credentials?.clientSecret || !this.credentials?.refreshToken) {\n throw new Error(\"Google Drive client ID, client secret, and refresh token are required\");\n }\n const { google } = await import(\"googleapis\");\n const oauth2Client = new google.auth.OAuth2(\n this.credentials.clientId,\n this.credentials.clientSecret\n );\n oauth2Client.setCredentials({ refresh_token: this.credentials.refreshToken });\n const drive = google.drive({ version: \"v3\", auth: oauth2Client });\n const about = await drive.about.get({ fields: \"user\" });\n return { summary: `Connected as ${about.data.user?.displayName ?? \"unknown\"}` };\n }\n async fetchDelta(cursor) {\n if (!this.credentials) throw new Error(\"Not authenticated\");\n const { google } = await import(\"googleapis\");\n const oauth2Client = new google.auth.OAuth2(\n this.credentials.clientId,\n this.credentials.clientSecret\n );\n oauth2Client.setCredentials({ refresh_token: this.credentials.refreshToken });\n const drive = google.drive({ version: \"v3\", auth: oauth2Client });\n const modifiedAfter = cursor ?? new Date(Date.now() - 864e5).toISOString();\n const res = await drive.files.list({\n q: `modifiedTime > '${modifiedAfter}' and mimeType = 'application/vnd.google-apps.document' and trashed = false`,\n fields: \"files(id, name, modifiedTime, owners)\",\n pageSize: 50\n });\n const items = [];\n for (const file of res.data.files ?? []) {\n if (!file.id || !file.name) continue;\n let content = \"\";\n try {\n const exportRes = await drive.files.export({\n fileId: file.id,\n mimeType: \"text/plain\"\n });\n content = String(exportRes.data).slice(0, 5e3);\n } catch {\n content = `[Document: ${file.name}]`;\n }\n items.push({\n id: file.id,\n source: \"gdrive\",\n type: \"document\",\n content,\n metadata: {\n name: file.name,\n modifiedTime: file.modifiedTime ?? \"\"\n },\n timestamp: file.modifiedTime ?? (/* @__PURE__ */ new Date()).toISOString()\n });\n }\n return {\n items,\n newCursor: (/* @__PURE__ */ new Date()).toISOString(),\n hasMore: false\n };\n }\n async normalize(rawItems) {\n return rawItems.map((item) => ({\n id: item.id,\n source: \"gdrive\",\n title: `Doc: ${item.metadata.name}`,\n body: item.content.slice(0, 2e3),\n entities: [],\n timestamp: item.timestamp\n }));\n }\n};\nfunction createGDriveDocsConnector() {\n return new GDriveDocsConnector();\n}\nexport {\n GDriveDocsConnector,\n createGDriveDocsConnector\n};\n"],"mappings":";AACA,IAAI,sBAAsB,MAAM;AAAA,EAC9B,OAAO;AAAA,EACP;AAAA,EACA,MAAM,aAAa,QAAQ;AACzB,SAAK,cAAc,OAAO;AAC1B,QAAI,CAAC,KAAK,aAAa,YAAY,CAAC,KAAK,aAAa,gBAAgB,CAAC,KAAK,aAAa,cAAc;AACrG,YAAM,IAAI,MAAM,uEAAuE;AAAA,IACzF;AAAA,EACF;AAAA,EACA,MAAM,cAAc;AAClB,QAAI,CAAC,KAAK,aAAa,YAAY,CAAC,KAAK,aAAa,gBAAgB,CAAC,KAAK,aAAa,cAAc;AACrG,YAAM,IAAI,MAAM,uEAAuE;AAAA,IACzF;AACA,UAAM,EAAE,OAAO,IAAI,MAAM,OAAO,YAAY;AAC5C,UAAM,eAAe,IAAI,OAAO,KAAK;AAAA,MACnC,KAAK,YAAY;AAAA,MACjB,KAAK,YAAY;AAAA,IACnB;AACA,iBAAa,eAAe,EAAE,eAAe,KAAK,YAAY,aAAa,CAAC;AAC5E,UAAM,QAAQ,OAAO,MAAM,EAAE,SAAS,MAAM,MAAM,aAAa,CAAC;AAChE,UAAM,QAAQ,MAAM,MAAM,MAAM,IAAI,EAAE,QAAQ,OAAO,CAAC;AACtD,WAAO,EAAE,SAAS,gBAAgB,MAAM,KAAK,MAAM,eAAe,SAAS,GAAG;AAAA,EAChF;AAAA,EACA,MAAM,WAAW,QAAQ;AACvB,QAAI,CAAC,KAAK,YAAa,OAAM,IAAI,MAAM,mBAAmB;AAC1D,UAAM,EAAE,OAAO,IAAI,MAAM,OAAO,YAAY;AAC5C,UAAM,eAAe,IAAI,OAAO,KAAK;AAAA,MACnC,KAAK,YAAY;AAAA,MACjB,KAAK,YAAY;AAAA,IACnB;AACA,iBAAa,eAAe,EAAE,eAAe,KAAK,YAAY,aAAa,CAAC;AAC5E,UAAM,QAAQ,OAAO,MAAM,EAAE,SAAS,MAAM,MAAM,aAAa,CAAC;AAChE,UAAM,gBAAgB,UAAU,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,EAAE,YAAY;AACzE,UAAM,MAAM,MAAM,MAAM,MAAM,KAAK;AAAA,MACjC,GAAG,mBAAmB,aAAa;AAAA,MACnC,QAAQ;AAAA,MACR,UAAU;AAAA,IACZ,CAAC;AACD,UAAM,QAAQ,CAAC;AACf,eAAW,QAAQ,IAAI,KAAK,SAAS,CAAC,GAAG;AACvC,UAAI,CAAC,KAAK,MAAM,CAAC,KAAK,KAAM;AAC5B,UAAI,UAAU;AACd,UAAI;AACF,cAAM,YAAY,MAAM,MAAM,MAAM,OAAO;AAAA,UACzC,QAAQ,KAAK;AAAA,UACb,UAAU;AAAA,QACZ,CAAC;AACD,kBAAU,OAAO,UAAU,IAAI,EAAE,MAAM,GAAG,GAAG;AAAA,MAC/C,QAAQ;AACN,kBAAU,cAAc,KAAK,IAAI;AAAA,MACnC;AACA,YAAM,KAAK;AAAA,QACT,IAAI,KAAK;AAAA,QACT,QAAQ;AAAA,QACR,MAAM;AAAA,QACN;AAAA,QACA,UAAU;AAAA,UACR,MAAM,KAAK;AAAA,UACX,cAAc,KAAK,gBAAgB;AAAA,QACrC;AAAA,QACA,WAAW,KAAK,iBAAiC,oBAAI,KAAK,GAAG,YAAY;AAAA,MAC3E,CAAC;AAAA,IACH;AACA,WAAO;AAAA,MACL;AAAA,MACA,YAA4B,oBAAI,KAAK,GAAG,YAAY;AAAA,MACpD,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM,UAAU,UAAU;AACxB,WAAO,SAAS,IAAI,CAAC,UAAU;AAAA,MAC7B,IAAI,KAAK;AAAA,MACT,QAAQ;AAAA,MACR,OAAO,QAAQ,KAAK,SAAS,IAAI;AAAA,MACjC,MAAM,KAAK,QAAQ,MAAM,GAAG,GAAG;AAAA,MAC/B,UAAU,CAAC;AAAA,MACX,WAAW,KAAK;AAAA,IAClB,EAAE;AAAA,EACJ;AACF;AACA,SAAS,4BAA4B;AACnC,SAAO,IAAI,oBAAoB;AACjC;","names":[]}
@@ -1 +0,0 @@
1
- :root{--pac-yellow: #FFD700;--pac-yellow-glow: rgba(255, 215, 0, .35);--pac-yellow-dim: rgba(255, 215, 0, .12);--ghost-red: #FF1744;--ghost-pink: #FF80AB;--ghost-cyan: #00E5FF;--ghost-orange: #FFAB40;--maze-blue: #1A1AFF;--maze-blue-glow: rgba(26, 26, 255, .25);--maze-wall: #2929cc;--bg-base: #060614;--bg-surface: #0c0c24;--bg-elevated: #14143a;--bg-input: #0a0a20;--bg-inset: #050510;--border: #1e1e5a;--border-hover: #2e2e8a;--border-focus: var(--pac-yellow);--accent: var(--pac-yellow);--accent-hover: #e6c200;--accent-subtle: rgba(255, 215, 0, .06);--accent-dim: rgba(255, 215, 0, .14);--text-primary: #e4e4ff;--text-secondary: #9898cc;--text-muted: #6464aa;--text-dim: #404088;--success: #00FF88;--success-subtle: rgba(0, 255, 136, .06);--success-dim: rgba(0, 255, 136, .14);--error: #FF4466;--error-subtle: rgba(255, 68, 102, .06);--warning: var(--pac-yellow);--warning-subtle: rgba(255, 215, 0, .06);--font-pixel: "Press Start 2P", monospace;--font-display: "Orbitron", sans-serif;--font-body: "Lexend", sans-serif;--font-mono: "Fira Code", "JetBrains Mono", monospace;--radius-lg: 16px;--radius: 12px;--radius-sm: 8px;--radius-xs: 6px}*{margin:0;padding:0;box-sizing:border-box}body{font-family:var(--font-body);background:var(--bg-base);color:var(--text-primary);min-height:100vh;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body:before{content:"";position:fixed;top:0;right:0;bottom:0;left:0;background:radial-gradient(ellipse 60% 40% at 50% 0%,rgba(26,26,255,.06) 0%,transparent 70%),repeating-linear-gradient(0deg,transparent,transparent 39px,rgba(26,26,255,.03) 39px,rgba(26,26,255,.03) 40px),repeating-linear-gradient(90deg,transparent,transparent 39px,rgba(26,26,255,.03) 39px,rgba(26,26,255,.03) 40px);pointer-events:none;z-index:0}#root{position:relative;z-index:1}.container{max-width:740px;margin:0 auto;padding:2rem 2rem 3rem}.container:has(.template-preview){max-width:960px}.container:has(.landing){max-width:900px;padding:0 2rem 3rem}.container.container-with-sidebar{max-width:1180px}.onboarding-shell.with-summary{display:grid;grid-template-columns:minmax(0,1fr) 320px;gap:1.5rem;align-items:start}.onboarding-main{min-width:0}.onboarding-summary-sidebar{position:sticky;top:1.5rem}.onboarding-summary-mobile-wrap{display:none;margin-bottom:1rem}.onboarding-summary-toggle{width:100%;display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:.9rem 1rem;background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius);color:var(--text-primary);font-family:var(--font-display);font-size:.78rem;letter-spacing:.03em}.onboarding-summary-panel{display:grid;gap:.9rem;padding:1rem;background:linear-gradient(180deg,#0c0c24fa,#050510fa);border:1px solid var(--border);border-radius:var(--radius-lg);box-shadow:0 18px 40px #0003}.onboarding-summary-panel.mobile{margin-top:.75rem}.onboarding-summary-header{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem}.onboarding-summary-kicker{display:inline-block;margin-bottom:.35rem;font-family:var(--font-pixel);font-size:.42rem;color:var(--pac-yellow);letter-spacing:.04em}.onboarding-summary-header h3{font-family:var(--font-display);font-size:.9rem;color:var(--text-primary)}.onboarding-summary-count{font-size:.72rem;color:var(--text-dim);white-space:nowrap}.onboarding-summary-list{display:grid;gap:.75rem}.onboarding-summary-card{width:100%;display:grid;gap:.7rem;padding:.9rem;text-align:left;background:var(--bg-input);border:1px solid var(--border);border-radius:var(--radius);color:var(--text-secondary);transition:border-color .2s ease,transform .2s ease,background .2s ease}.onboarding-summary-card:not(:disabled):hover{border-color:var(--border-hover);background:var(--bg-surface);transform:translateY(-1px)}.onboarding-summary-card.current{border-color:#ffd70047;background:var(--pac-yellow-dim)}.onboarding-summary-card:disabled{opacity:.55;cursor:not-allowed}.onboarding-summary-card-top{display:flex;align-items:flex-start;justify-content:space-between;gap:.75rem}.onboarding-summary-card-title{display:flex;align-items:flex-start;gap:.8rem}.onboarding-summary-step{width:26px;height:26px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;background:var(--bg-elevated);border:1px solid var(--border);color:var(--pac-yellow);font-family:var(--font-pixel);font-size:.45rem;flex-shrink:0}.onboarding-summary-card-title strong{display:block;color:var(--text-primary);font-size:.85rem;margin-bottom:.2rem}.onboarding-summary-card-title span{display:block;font-size:.74rem;line-height:1.45;color:var(--text-dim)}.onboarding-summary-action{font-size:.72rem;color:var(--pac-yellow);white-space:nowrap}.onboarding-summary-lines{display:grid;gap:.32rem}.onboarding-summary-lines span{font-size:.76rem;line-height:1.45;color:var(--text-secondary)}.landing{animation:fadeIn .6s ease-out}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.landing-hero{text-align:center;padding:4rem 0 3rem;position:relative}.landing-hero:before{content:"";position:absolute;top:20%;left:50%;transform:translate(-50%);width:500px;height:500px;background:radial-gradient(circle,rgba(255,215,0,.06) 0%,transparent 70%);pointer-events:none}.pac-scene{display:flex;align-items:center;justify-content:center;gap:12px;margin-bottom:2rem;position:relative}.pac-trail-dot{width:8px;height:8px;border-radius:50%;background:var(--pac-yellow);box-shadow:0 0 6px var(--pac-yellow-glow);opacity:.9}.pac-trail-dot.eaten{opacity:.1;box-shadow:none}.pac-trail-dot.power{width:14px;height:14px;animation:powerPulse 1s ease-in-out infinite}@keyframes powerPulse{0%,to{box-shadow:0 0 6px var(--pac-yellow-glow);transform:scale(1)}50%{box-shadow:0 0 18px var(--pac-yellow-glow);transform:scale(1.3)}}.pacman-char{width:36px;height:36px;position:relative}.pacman-char:before,.pacman-char:after{content:"";position:absolute;left:0;width:36px;height:18px;background:var(--pac-yellow)}.pacman-char:before{top:0;border-radius:18px 18px 0 0;transform-origin:bottom center;animation:chompTop .3s ease-in-out infinite alternate}.pacman-char:after{bottom:0;border-radius:0 0 18px 18px;transform-origin:top center;animation:chompBottom .3s ease-in-out infinite alternate}@keyframes chompTop{0%{transform:rotate(0)}to{transform:rotate(-18deg)}}@keyframes chompBottom{0%{transform:rotate(0)}to{transform:rotate(18deg)}}.pacman-char-small{width:22px;height:22px}.pacman-char-small:before,.pacman-char-small:after{width:22px;height:11px}.pacman-char-small:before{border-radius:11px 11px 0 0}.pacman-char-small:after{border-radius:0 0 11px 11px}.landing-brand{font-family:var(--font-pixel);font-size:2.5rem;color:var(--pac-yellow);text-shadow:0 0 20px var(--pac-yellow-glow),0 0 60px rgba(255,215,0,.15);margin-bottom:.75rem;letter-spacing:.1em}.landing-subtitle{font-family:var(--font-display);font-size:.85rem;font-weight:400;color:var(--text-secondary);letter-spacing:.15em;text-transform:uppercase;margin-bottom:1.25rem}.landing-tagline{font-family:var(--font-body);font-size:1.1rem;color:var(--text-muted);font-weight:300;max-width:480px;margin:0 auto;line-height:1.6}.ghost-section{padding:2rem 0}.section-heading{font-family:var(--font-display);font-size:1.1rem;font-weight:600;color:var(--text-primary);text-align:center;margin-bottom:2rem;letter-spacing:.04em;text-wrap:balance}.ghost-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:1.5rem;align-items:stretch}.ghost-card{background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius);padding:1.5rem;text-align:left;position:relative;overflow:hidden;display:flex;flex-direction:column;gap:1rem;min-height:100%;transition:border-color .3s,transform .3s,box-shadow .3s}.ghost-card:hover{transform:translateY(-4px);box-shadow:0 18px 40px #00000038}.ghost-card:before{content:"";position:absolute;right:-36px;bottom:-44px;width:140px;height:140px;border-radius:50%;opacity:.06;pointer-events:none}.ghost-card.ghost-red{border-color:#ff174433}.ghost-card.ghost-red:hover{border-color:#ff174466}.ghost-card.ghost-red:before{background:var(--ghost-red)}.ghost-card.ghost-pink{border-color:#ff80ab33}.ghost-card.ghost-pink:hover{border-color:#ff80ab66}.ghost-card.ghost-pink:before{background:var(--ghost-pink)}.ghost-card.ghost-cyan{border-color:#00e5ff33}.ghost-card.ghost-cyan:hover{border-color:#00e5ff66}.ghost-card.ghost-cyan:before{background:var(--ghost-cyan)}.ghost-card-top{display:flex;align-items:flex-start;gap:1rem}.ghost-card-copy{flex:1;min-width:0}.ghost-icon{width:56px;height:56px;margin:0;flex-shrink:0;animation:ghostFloat 3s ease-in-out infinite}.ghost-icon svg{width:100%;height:100%}@keyframes ghostFloat{0%,to{transform:translateY(0)}50%{transform:translateY(-8px)}}.ghost-card h3{font-family:var(--font-display);font-size:.9rem;font-weight:600;margin-bottom:.5rem;letter-spacing:.03em}.ghost-card.ghost-red h3{color:var(--ghost-red)}.ghost-card.ghost-pink h3{color:var(--ghost-pink)}.ghost-card.ghost-cyan h3{color:var(--ghost-cyan)}.ghost-card.ghost-orange{border-color:#ffab4033}.ghost-card.ghost-orange:hover{border-color:#ffab4066}.ghost-card.ghost-orange:before{background:var(--ghost-orange)}.ghost-card.ghost-orange h3{color:var(--ghost-orange)}.ghost-problem{font-size:.84rem;color:var(--text-muted);line-height:1.6;margin-bottom:0}.ghost-solution{display:grid;gap:.45rem;margin-top:auto;padding:.9rem 1rem;background:linear-gradient(180deg,#ffd7001a,#ffd7000a);border:1px solid rgba(255,215,0,.14);border-radius:var(--radius-sm)}.ghost-solution-kicker{display:inline-flex;align-items:center;gap:.45rem;font-family:var(--font-display);font-size:.68rem;font-weight:600;letter-spacing:.08em;color:var(--pac-yellow);text-transform:uppercase}.ghost-solution-title{font-size:.92rem;font-weight:600;color:var(--text-primary);line-height:1.4}.ghost-solution-detail{font-size:.78rem;color:var(--text-secondary);line-height:1.55}.comparison-section{padding:2.5rem 0}.comparison-grid{display:grid;grid-template-columns:1fr auto 1fr;gap:1rem;align-items:stretch}.comparison-card{background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius);overflow:hidden}.comparison-label{display:block;font-family:var(--font-pixel);font-size:.55rem;letter-spacing:.1em;padding:.625rem 1rem;border-bottom:1px solid var(--border)}.comparison-card.before .comparison-label{color:var(--ghost-red);background:#ff17440a}.comparison-card.after .comparison-label{color:var(--success);background:#00ff880a}.mock-chat{padding:1rem;display:flex;flex-direction:column;gap:.75rem}.mock-msg{display:flex;gap:.6rem;align-items:flex-start}.mock-avatar{width:28px;height:28px;border-radius:6px;flex-shrink:0;display:flex;align-items:center;justify-content:center;font-size:.6rem;font-weight:700;font-family:var(--font-mono)}.mock-avatar.user{background:var(--maze-wall);color:#fff}.mock-avatar.bot{background:var(--pac-yellow-dim);color:var(--pac-yellow)}.mock-msg-body{flex:1}.mock-msg-name{font-size:.72rem;font-weight:600;margin-bottom:.25rem}.mock-msg-name .badge{font-size:.55rem;background:var(--bg-elevated);color:var(--text-dim);padding:1px 5px;border-radius:3px;font-weight:500;margin-left:4px;vertical-align:middle}.mock-msg-text{font-size:.78rem;line-height:1.55;color:var(--text-secondary)}.mock-msg-text.dim{color:var(--text-muted);font-style:italic}.mock-msg-text.bright{color:var(--text-primary)}.comparison-arrow{display:flex;align-items:center;justify-content:center;padding:0 .25rem}.comparison-arrow-inner{display:flex;flex-direction:column;align-items:center;gap:.5rem}.comparison-arrow .pacman-char-small{animation:chompSlide 2s ease-in-out infinite}@keyframes chompSlide{0%,to{transform:translate(0)}50%{transform:translate(6px)}}.landing-cta{text-align:center;padding:2.5rem 0 1rem}.btn-start{display:inline-flex;align-items:center;gap:.75rem;padding:1rem 2.5rem;background:var(--pac-yellow);color:#060614;font-family:var(--font-display);font-size:.95rem;font-weight:700;border:none;border-radius:50px;cursor:pointer;letter-spacing:.04em;box-shadow:0 0 20px var(--pac-yellow-glow),0 4px 16px #0006;transition:all .25s}.btn-start:hover{transform:translateY(-2px) scale(1.03);box-shadow:0 0 40px var(--pac-yellow-glow),0 6px 24px #00000080}.btn-start:active{transform:translateY(0) scale(1)}.btn-start .pacman-char-small:before,.btn-start .pacman-char-small:after{background:#060614}@media(max-width:920px){.container:has(.landing){max-width:760px}.ghost-grid,.comparison-grid{grid-template-columns:1fr}.comparison-arrow{padding:.25rem 0}.comparison-arrow-inner{flex-direction:row}.comparison-arrow svg{transform:rotate(90deg)}}@media(max-width:720px){.container{padding:1.5rem 1rem 2.5rem}.container:has(.landing){padding:0 1rem 2.5rem}.landing-hero{padding:3rem 0 2.5rem}.landing-hero:before{top:10%;width:320px;height:320px}.landing-brand{font-size:1.85rem}.landing-subtitle{font-size:.72rem}.landing-tagline{font-size:1rem;max-width:none}.ghost-card{padding:1.25rem}.ghost-card-top{flex-direction:column;gap:.85rem}.ghost-icon{width:48px;height:48px}.btn-start{width:100%;justify-content:center;padding:1rem 1.5rem}}@media(max-width:520px){.pac-scene{gap:8px}.section-heading{font-size:1rem;margin-bottom:1.5rem}.ghost-solution{padding:.8rem .9rem}.mock-chat{padding:.875rem}.project-structure-grid{grid-template-columns:1fr}}.pac-progress{display:flex;align-items:center;justify-content:space-between;margin-bottom:2.5rem;position:relative;padding:0 1rem}.pac-progress:before{content:"";position:absolute;top:50%;left:2rem;right:2rem;height:2px;background:var(--border);transform:translateY(-50%);z-index:0}.pac-progress:after{content:"";position:absolute;top:50%;left:2rem;height:2px;width:var(--eaten-width, 0%);background:linear-gradient(90deg,var(--pac-yellow-dim),var(--pac-yellow-dim));transform:translateY(-50%);z-index:0;transition:width .5s ease}.pac-progress-step{display:flex;flex-direction:column;align-items:center;gap:.625rem;position:relative;z-index:1;background:none;border:none;padding:0;cursor:pointer;transition:opacity .2s ease}.pac-progress-step.locked{cursor:not-allowed}.pac-progress-step.clickable:hover .pac-step-label{color:var(--text-primary)}.pac-progress-step:disabled{opacity:.55}.pac-dot{width:10px;height:10px;border-radius:50%;background:var(--pac-yellow);box-shadow:0 0 8px var(--pac-yellow-glow);transition:all .4s ease}.pac-progress-step.eaten .pac-dot{width:6px;height:6px;background:var(--pac-yellow-dim);box-shadow:none;opacity:.4}.pac-progress-step.current .pac-dot{width:0;height:0;opacity:0}.pac-step-label{font-family:var(--font-display);font-size:.55rem;font-weight:500;color:var(--text-dim);letter-spacing:.06em;text-transform:uppercase;white-space:nowrap;transition:color .3s}.pac-progress-step.eaten .pac-step-label{color:var(--pac-yellow);opacity:.5}.pac-progress-step.current .pac-step-label{color:var(--pac-yellow)}.pac-progress-pacman{position:absolute;top:50%;transform:translateY(-50%);z-index:2;transition:left .5s cubic-bezier(.4,0,.2,1)}.step-header{margin-bottom:2.5rem}.step-meta{display:flex;align-items:center;justify-content:space-between;margin-bottom:.875rem}.step-counter{font-family:var(--font-pixel);font-size:.55rem;color:var(--text-muted);letter-spacing:.06em}.step-name{font-family:var(--font-display);font-size:.7rem;font-weight:500;color:var(--pac-yellow);letter-spacing:.08em;text-transform:uppercase}.progress-track{height:3px;background:var(--border);border-radius:3px;overflow:hidden;position:relative}.progress-fill{height:100%;background:linear-gradient(90deg,var(--pac-yellow),var(--accent-hover));border-radius:3px;transition:width .6s cubic-bezier(.4,0,.2,1);box-shadow:0 0 8px var(--pac-yellow-glow)}h1{font-family:var(--font-display);font-size:1.75rem;font-weight:700;color:var(--text-primary);margin-bottom:.5rem;letter-spacing:.02em;line-height:1.2}h2{font-family:var(--font-body);font-size:1rem;margin-bottom:1.5rem;color:var(--text-secondary);font-weight:400;line-height:1.5}.step-content{animation:stepIn .45s ease-out}@keyframes stepIn{0%{opacity:0;transform:translateY(12px)}to{opacity:1;transform:translateY(0)}}label{display:block;margin-bottom:.375rem;color:var(--text-secondary);font-size:.85rem;font-weight:500}input,select,textarea{width:100%;padding:.8rem 1rem;background:var(--bg-input);border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text-primary);font-family:var(--font-body);font-size:.95rem;margin-bottom:1rem;transition:border-color .2s,box-shadow .2s}input::placeholder,textarea::placeholder{color:var(--text-dim)}input:focus,select:focus,textarea:focus{outline:none;border-color:var(--pac-yellow);box-shadow:0 0 0 3px var(--pac-yellow-dim),0 0 12px #ffd70014}select{cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%236464aa' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right .875rem center;padding-right:2.5rem}textarea{min-height:200px;font-family:var(--font-mono);font-size:.85rem;resize:vertical}.form-card{background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius);padding:1.5rem;margin-bottom:1.5rem}.form-row{display:grid;grid-template-columns:1fr 1fr;gap:1rem}.form-field,.form-field input,.form-field select{margin-bottom:0}.form-section{margin-bottom:1.5rem}.field-label{display:block;font-size:.8rem;font-weight:500;color:var(--text-muted);margin-bottom:.5rem;letter-spacing:.01em}.field-hint{display:block;font-size:.78rem;color:var(--text-dim);margin-top:.35rem;line-height:1.5}.field-error{display:block;font-size:.76rem;color:var(--error);margin-top:.45rem;line-height:1.4}.profile-grid{display:grid;grid-template-columns:1fr 1fr;gap:.625rem}.profile-card{display:flex;align-items:center;gap:.875rem;padding:.875rem 1rem;background:var(--bg-input);border:1px solid var(--border);border-radius:var(--radius-sm);cursor:pointer;transition:all .2s;position:relative;overflow:hidden}.profile-card:hover{border-color:var(--border-hover);background:var(--bg-elevated)}.profile-card.selected{border-color:var(--pac-yellow);background:var(--pac-yellow-dim);box-shadow:0 0 12px #ffd70014}.profile-indicator{width:3px;height:28px;border-radius:2px;flex-shrink:0;opacity:.7;transition:opacity .2s}.profile-card.selected .profile-indicator{opacity:1;box-shadow:0 0 8px currentColor}.profile-info{display:flex;flex-direction:column;gap:1px}.profile-name{font-weight:600;font-size:.85rem;color:var(--text-primary)}.profile-desc{font-size:.72rem;color:var(--text-muted);line-height:1.4}button{padding:.75rem 1.5rem;border:none;border-radius:var(--radius-sm);font-family:var(--font-body);font-size:.9rem;font-weight:600;cursor:pointer;transition:all .2s}.btn-primary{background:linear-gradient(135deg,var(--pac-yellow) 0%,var(--accent-hover) 100%);color:#060614;box-shadow:0 2px 8px #0000004d,0 0 16px #ffd7001f}.btn-primary:hover:not(:disabled){box-shadow:0 4px 16px #0000004d,0 0 28px #ffd70033;transform:translateY(-1px)}.btn-primary:active:not(:disabled){transform:translateY(0)}.btn-primary:disabled{opacity:.35;cursor:not-allowed;transform:none}.btn-secondary{background:var(--bg-elevated);color:var(--text-secondary);border:1px solid var(--border)}.btn-secondary:hover:not(:disabled){background:var(--border);color:var(--text-primary);border-color:var(--border-hover)}.btn-secondary:disabled{opacity:.35;cursor:not-allowed}.btn-group{display:flex;gap:.75rem;margin-top:2rem}.checkbox-group{display:grid;grid-template-columns:1fr 1fr;gap:.5rem;margin-bottom:1rem}.checkbox-item{display:flex;align-items:center;gap:.625rem;padding:.625rem .75rem;background:var(--bg-input);border:1px solid var(--border);border-radius:var(--radius-sm);cursor:pointer;font-size:.875rem;color:var(--text-secondary);transition:all .2s}.checkbox-item:hover{border-color:var(--border-hover);color:var(--text-primary)}.checkbox-item input[type=checkbox]{width:16px;height:16px;margin:0;accent-color:var(--pac-yellow);flex-shrink:0}.radio-group{display:flex;gap:.75rem;margin-bottom:1.25rem}.radio-item{flex:1;padding:1.25rem 1rem;background:var(--bg-input);border:1px solid var(--border);border-radius:var(--radius);cursor:pointer;text-align:center;transition:all .2s}.radio-item:hover{border-color:var(--border-hover);background:var(--bg-elevated)}.radio-item.selected{border-color:var(--pac-yellow);background:var(--pac-yellow-dim);box-shadow:0 0 12px #ffd70014}.radio-item strong{color:var(--text-primary)}.radio-item small{color:var(--text-muted);font-size:.78rem}.integration-section-header{display:flex;align-items:flex-start;justify-content:space-between;margin-bottom:1.5rem}.integration-count{font-family:var(--font-pixel);font-size:.5rem;color:var(--success);background:var(--success-subtle);padding:6px 12px;border-radius:99px;letter-spacing:.02em}.recommendation-banner{display:flex;align-items:center;gap:.75rem;padding:.875rem 1.25rem;background:var(--pac-yellow-dim);border:1px solid rgba(255,215,0,.15);border-radius:var(--radius-sm);margin-bottom:1.25rem;font-size:.82rem;color:var(--pac-yellow)}.recommendation-banner .pacman-char-small{flex-shrink:0}.recommended-badge{font-family:var(--font-pixel);font-size:.42rem;color:var(--pac-yellow);background:var(--pac-yellow-dim);padding:3px 8px;border-radius:99px;letter-spacing:.04em;border:1px solid rgba(255,215,0,.2);white-space:nowrap}.folder-section{margin-top:1.5rem;padding-top:1.5rem;border-top:1px solid var(--border)}.folder-section-title{font-family:var(--font-display);font-size:.85rem;font-weight:600;color:var(--text-primary);margin-bottom:.35rem;display:flex;align-items:center;gap:.5rem}.folder-section-desc{font-size:.8rem;color:var(--text-muted);margin-bottom:1rem;line-height:1.5}.folder-list{display:flex;flex-direction:column;gap:.5rem;margin-bottom:.75rem}.folder-row{display:grid;grid-template-columns:1fr auto 1fr auto;gap:.5rem;align-items:center;padding:.5rem .75rem;background:var(--bg-input);border:1px solid var(--border);border-radius:var(--radius-sm)}.folder-row input{margin-bottom:0;padding:.55rem .75rem;font-size:.82rem}.folder-row .btn-browse{padding:.55rem .75rem;font-size:.75rem;background:var(--bg-elevated);border:1px solid var(--border);color:var(--text-secondary);white-space:nowrap}.folder-row .btn-browse:hover{border-color:var(--border-hover);color:var(--text-primary)}.folder-row .btn-remove{padding:.4rem .6rem;background:transparent;border:1px solid transparent;color:var(--text-dim);font-size:1rem;line-height:1}.folder-row .btn-remove:hover{color:var(--error);border-color:var(--error-subtle);background:var(--error-subtle)}.btn-add-folder{display:inline-flex;align-items:center;gap:.4rem;padding:.55rem 1rem;font-size:.8rem;font-weight:500;background:var(--bg-surface);border:1px dashed var(--border);color:var(--text-muted);border-radius:var(--radius-sm);cursor:pointer;transition:all .2s}.btn-add-folder:hover{border-color:var(--pac-yellow);color:var(--pac-yellow);background:var(--pac-yellow-dim)}.project-structure-banner{display:grid;gap:.35rem;padding:1rem 1.1rem;margin-bottom:1rem;background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius)}.project-structure-banner strong{color:var(--pac-yellow);font-family:var(--font-display);font-size:.78rem;letter-spacing:.05em;text-transform:uppercase}.project-structure-banner span{color:var(--text-secondary);font-size:.82rem;line-height:1.6}.project-structure-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.85rem;margin-bottom:1rem}.project-structure-card{display:grid;gap:.65rem;width:100%;padding:1rem;text-align:left;background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius)}.project-structure-card.active{border-color:#ffd7004d;box-shadow:0 0 0 1px #ffd70014}.project-structure-card-top{display:flex;align-items:center;justify-content:space-between;gap:.75rem}.project-structure-card-top strong{color:var(--text-primary);font-size:.9rem;font-family:var(--font-display)}.project-structure-card-top span{color:var(--text-dim);font-size:.74rem;white-space:nowrap}.project-structure-card p{color:var(--text-secondary);font-size:.8rem;line-height:1.55}.project-structure-meta{display:flex;flex-wrap:wrap;gap:.45rem}.project-structure-chip{display:inline-flex;align-items:center;padding:.28rem .55rem;border-radius:999px;background:var(--pac-yellow-dim);color:var(--pac-yellow);font-size:.72rem;line-height:1.2}.project-structure-chip.muted{background:var(--bg-inset);color:var(--text-secondary);border:1px solid var(--border)}.template-preview{display:flex;height:520px;background:var(--bg-inset);border:1px solid var(--border);border-radius:var(--radius);overflow:hidden;margin-bottom:.5rem}.template-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;gap:1rem;color:var(--text-muted);font-family:var(--font-body)}.template-spinner{width:28px;height:28px;border:3px solid var(--border);border-top-color:var(--pac-yellow);border-radius:50%;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.template-error{display:flex;align-items:center;justify-content:center;width:100%;color:var(--error);font-size:.9rem}.template-sidebar{width:200px;min-width:200px;background:var(--bg-input);border-right:1px solid var(--border);display:flex;flex-direction:column;overflow-y:auto}.template-sidebar-header{display:flex;align-items:center;justify-content:space-between;padding:.75rem 1rem;font-family:var(--font-display);font-size:.6rem;font-weight:600;text-transform:uppercase;letter-spacing:.1em;color:var(--text-muted);border-bottom:1px solid var(--border)}.template-sidebar-actions{display:flex;gap:.25rem}.template-action-btn{display:flex;align-items:center;justify-content:center;width:24px;height:24px;padding:0;background:transparent;border:none;border-radius:var(--radius-xs);color:var(--text-muted);cursor:pointer;transition:all .15s}.template-action-btn:hover{background:var(--border);color:var(--pac-yellow)}.template-file-tab{display:flex;align-items:center;gap:.5rem;width:100%;padding:.55rem 1rem;background:transparent;border:none;border-left:2px solid transparent;color:var(--text-secondary);font-family:var(--font-body);font-size:.8rem;cursor:pointer;text-align:left;transition:all .15s}.template-file-tab:hover{background:var(--bg-elevated)}.template-file-tab.active{background:var(--bg-inset);border-left-color:var(--pac-yellow);color:var(--text-primary)}.template-file-icon{width:20px;height:20px;display:flex;align-items:center;justify-content:center;border-radius:4px;font-family:var(--font-mono);font-size:.65rem;font-weight:700;flex-shrink:0}.template-file-icon.icon-m{background:var(--pac-yellow-dim);color:var(--pac-yellow)}.template-file-icon.icon-j{background:#ffab401f;color:var(--ghost-orange)}.template-file-icon.icon-y{background:#ff80ab1f;color:var(--ghost-pink)}.template-file-icon.icon-f{background:#6464aa1f;color:var(--text-muted)}.template-file-name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.template-file-lines{font-family:var(--font-mono);font-size:.65rem;color:var(--text-dim);flex-shrink:0}.template-folder-group{display:flex;flex-direction:column}.template-folder-row{display:flex;align-items:center;position:relative}.template-folder-tab{display:flex;align-items:center;gap:.35rem;flex:1;padding:.55rem .6rem .55rem .7rem;background:transparent;border:none;border-left:2px solid transparent;color:var(--text-secondary);font-family:var(--font-body);font-size:.8rem;cursor:pointer;text-align:left;transition:all .15s;min-width:0}.template-folder-tab:hover{background:var(--bg-elevated)}.template-folder-arrow{font-size:.65rem;width:12px;flex-shrink:0;color:var(--text-muted)}.template-file-icon.icon-folder{background:var(--pac-yellow-dim);color:var(--pac-yellow);display:flex;align-items:center;justify-content:center}.template-folder-action{display:none;align-items:center;justify-content:center;width:22px;height:22px;font-size:.75rem;color:var(--text-muted);cursor:pointer;border-radius:3px;flex-shrink:0;transition:all .15s}.template-folder-row:hover .template-folder-action{display:flex}.template-folder-add:hover{background:var(--pac-yellow-dim);color:var(--pac-yellow)}.template-folder-children{display:flex;flex-direction:column}.template-file-tab.indented{padding-left:2.1rem}.template-folder-empty{padding:.4rem 1rem .4rem 2.1rem;font-size:.7rem;color:var(--text-dim);font-style:italic}.template-item-delete{display:none;align-items:center;justify-content:center;width:22px;height:22px;font-size:.85rem;color:var(--text-muted);cursor:pointer;border-radius:3px;flex-shrink:0;transition:all .15s}.template-file-tab:hover .template-item-delete,.template-folder-row:hover .template-item-delete{display:flex}.template-file-tab:hover .template-file-lines,.template-folder-row:hover .template-file-lines{display:none}.template-item-delete:hover{background:var(--error-subtle);color:var(--error)}.template-create-input{display:flex;align-items:center;gap:.35rem;padding:.35rem .6rem;background:var(--bg-elevated);border:1px solid var(--border);border-radius:4px;margin:.3rem .5rem}.template-create-prefix{font-family:var(--font-mono);font-size:.72rem;color:var(--text-muted);white-space:nowrap;flex-shrink:0}.template-create-field{width:100%;padding:.2rem .3rem;background:transparent;border:none;border-radius:0;color:var(--text-primary);font-family:var(--font-mono);font-size:.78rem;outline:none;margin:0}.template-create-field::placeholder{color:var(--text-dim)}.template-empty-editor{display:flex;align-items:center;justify-content:center;flex:1;color:var(--text-dim);font-size:.9rem;font-family:var(--font-body)}.template-editor{flex:1;display:flex;flex-direction:column;min-width:0}.template-editor-header{display:flex;align-items:center;gap:.75rem;padding:.6rem 1rem;background:var(--bg-input);border-bottom:1px solid var(--border);min-height:40px}.template-editor-path{font-family:var(--font-mono);font-size:.78rem;color:var(--text-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.template-editor-badge{font-family:var(--font-mono);font-size:.6rem;font-weight:600;text-transform:uppercase;letter-spacing:.06em;padding:.15rem .45rem;border-radius:9999px;background:var(--pac-yellow-dim);color:var(--pac-yellow);flex-shrink:0}.template-editor-body{display:flex;flex:1;overflow:auto}.template-line-numbers{display:flex;flex-direction:column;padding:.75rem 0;min-width:42px;text-align:right;font-family:var(--font-mono);font-size:.78rem;line-height:1.55;color:var(--text-dim);-webkit-user-select:none;user-select:none;border-right:1px solid var(--border);background:var(--bg-inset)}.template-line-numbers span{padding:0 .6rem}.template-textarea{flex:1;padding:.75rem;background:var(--bg-inset);border:none;border-radius:0;color:var(--text-secondary);font-family:var(--font-mono);font-size:.78rem;line-height:1.55;resize:none;outline:none;min-height:100%;margin:0;white-space:pre;overflow-wrap:normal;overflow-x:auto}.template-textarea:focus{border:none;box-shadow:none}.success{text-align:center;padding:2rem 0}.success h1{font-family:var(--font-display);font-size:1.75rem;margin-bottom:.75rem}.success h2{color:var(--success);font-family:var(--font-display);font-size:1.25rem;font-weight:600}.success-icon{width:80px;height:80px;border-radius:50%;background:var(--success-dim);display:flex;align-items:center;justify-content:center;margin:0 auto 1.5rem;animation:scaleIn .5s cubic-bezier(.34,1.56,.64,1);box-shadow:0 0 30px #00ff8826}@keyframes scaleIn{0%{transform:scale(0);opacity:0}to{transform:scale(1);opacity:1}}.success-icon svg{width:36px;height:36px;color:var(--success)}.pac-celebration{display:flex;align-items:center;justify-content:center;gap:10px;margin:1.5rem 0;animation:fadeIn .8s ease-out}.pac-celebration .pac-trail-dot{animation:dotPop .6s ease-out both}.pac-celebration .pac-trail-dot:nth-child(1){animation-delay:.1s}.pac-celebration .pac-trail-dot:nth-child(2){animation-delay:.2s}.pac-celebration .pac-trail-dot:nth-child(3){animation-delay:.3s}.pac-celebration .pac-trail-dot:nth-child(5){animation-delay:.3s}.pac-celebration .pac-trail-dot:nth-child(6){animation-delay:.2s}.pac-celebration .pac-trail-dot:nth-child(7){animation-delay:.1s}@keyframes dotPop{0%{transform:scale(0);opacity:0}to{transform:scale(1);opacity:1}}.saving-overlay{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:1.5rem;padding:4rem 2rem;text-align:center;animation:fadeIn .3s ease}.saving-text{font-family:var(--font-display);font-size:.9rem;color:var(--pac-yellow);letter-spacing:.04em}.saving-dots{display:flex;gap:8px;align-items:center}.saving-dots .pac-trail-dot{animation:savingEat 1.2s ease-in-out infinite}.saving-dots .pac-trail-dot:nth-child(1){animation-delay:0s}.saving-dots .pac-trail-dot:nth-child(2){animation-delay:.2s}.saving-dots .pac-trail-dot:nth-child(3){animation-delay:.4s}.saving-dots .pac-trail-dot:nth-child(4){animation-delay:.6s}.saving-dots .pac-trail-dot:nth-child(5){animation-delay:.8s}@keyframes savingEat{0%,60%,to{opacity:1;transform:scale(1)}30%{opacity:.2;transform:scale(.4)}}.code-block{text-align:left;margin-top:1rem;background:var(--bg-surface);border:1px solid var(--border);padding:1.25rem;border-radius:var(--radius);font-size:.82rem;font-family:var(--font-mono);white-space:pre-wrap;color:var(--text-secondary);line-height:1.7}.summary{background:var(--bg-surface);border:1px solid var(--border);padding:1.25rem;border-radius:var(--radius);margin-bottom:1rem;font-family:var(--font-mono);font-size:.82rem;white-space:pre-wrap;color:var(--text-secondary);line-height:1.6;max-height:400px;overflow-y:auto}.banner-warning{background:#ffd7000a;border:1px solid rgba(255,215,0,.15);border-radius:var(--radius-sm);padding:.75rem 1rem;font-size:.82rem;color:var(--pac-yellow);line-height:1.6}.banner-info{background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius-sm);padding:1rem;font-size:.85rem;color:var(--text-secondary);line-height:1.6}.banner-success{background:var(--success-subtle);border:1px solid rgba(0,255,136,.15);border-radius:var(--radius-sm);padding:1rem}.instructions-grid{display:grid;grid-template-columns:1fr 1fr;gap:1rem;margin:1.5rem 0;text-align:left}.instruction-card{background:var(--bg-surface);border:1px solid var(--border);border-radius:var(--radius);padding:1.25rem;transition:border-color .2s}.instruction-card:hover{border-color:var(--border-hover)}.instruction-card-icon{width:36px;height:36px;border-radius:var(--radius-sm);display:flex;align-items:center;justify-content:center;font-family:var(--font-pixel);font-size:.45rem;margin-bottom:.75rem;color:#fff}.instruction-card h4{font-family:var(--font-display);font-size:.78rem;font-weight:600;color:var(--text-primary);margin-bottom:.5rem;letter-spacing:.02em}.instruction-card .cmd{font-family:var(--font-mono);font-size:.75rem;color:var(--pac-yellow);background:var(--bg-inset);padding:.45rem .65rem;border-radius:var(--radius-xs);border:1px solid var(--border);display:block;margin-top:.35rem;white-space:pre-wrap;line-height:1.6}.instruction-card p{font-size:.78rem;color:var(--text-muted);line-height:1.5}.text-success{color:var(--success)}.text-error{color:var(--error)}.text-warning{color:var(--warning)}.text-muted{color:var(--text-muted)}.text-pac{color:var(--pac-yellow)}.mt-1{margin-top:.5rem}.mb-1{margin-bottom:.5rem}.neon-glow{box-shadow:0 0 5px var(--pac-yellow-glow),0 0 20px #ffd70014}.ghost-svg{transition:transform .3s}.ghost-svg:hover{transform:scale(1.1)}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:var(--bg-inset)}::-webkit-scrollbar-thumb{background:var(--border);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:var(--border-hover)}.validation-dots{display:inline-flex;gap:4px;align-items:center}.validation-dots .pac-trail-dot{animation:validationPulse 1s ease-in-out infinite}.validation-dots .pac-trail-dot:nth-child(2){animation-delay:.2s}.validation-dots .pac-trail-dot:nth-child(3){animation-delay:.4s}@keyframes validationPulse{0%,to{opacity:.3;transform:scale(.8)}50%{opacity:1;transform:scale(1.3)}}:focus-visible{outline:2px solid var(--pac-yellow);outline-offset:2px}@media(max-width:980px){.container.container-with-sidebar{max-width:960px}.onboarding-shell.with-summary{grid-template-columns:1fr}.onboarding-summary-sidebar{display:none}.onboarding-summary-mobile-wrap{display:block}}