pipe-kan 0.28.0 → 0.29.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -36,7 +36,42 @@ export JIRA_API_TOKEN=... # only if jira-cli does not already have it
36
36
  bunx pipe-kan
37
37
  ```
38
38
 
39
- Scope flags start empty. Add `-a you@work.com` or `-s~Done` if you want a tighter list, then Refresh.
39
+ Scope flags start empty (jira-cli's one Project). Add `-a you@work.com` or `-s~Done` if you want a tighter list, then Refresh. More than one Project key: `--projects` below.
40
+
41
+ ## Multiple projects
42
+
43
+ Default Scope is one Project — jira-cli's `jira init` project. To list more than one Project key:
44
+
45
+ ```sh
46
+ bunx pipe-kan --projects KEY1,KEY2
47
+ ```
48
+
49
+ `--projects` is a pipe-kan Scope flag. Comma-separated keys; trimmed and uppercased. The same string in the header **Scope flags** field, then **Refresh**, is the same Scope.
50
+
51
+ That Scope becomes JQL `project in ("KEY1", "KEY2")`. `-a`, `-s`, `-t`, and `-P` AND onto that clause. `-q` / `--jql` replaces the generated JQL; `--projects` still records the keys for Favourites and Presets.
52
+
53
+ With that Scope:
54
+
55
+ - **Refresh** re-runs `jira issue list` for All stories (`project in (...)` plus the other Scope clauses) and lists All epics as `project in (...) AND type="Epic"`. Epic children are listed for those Epics. Header chip shows the keys, or `DEMO` when Scope has none.
56
+ - **Favourites** stay local. When Scope has Project keys, Favourite writes stamp that set.
57
+ - **Presets** stay Filter, Sort, and Hide. Save stamps the current Project set. Apply copies that chrome; it does not change Scope. Apply is a no-op when the Preset's Project set does not match the current Scope.
58
+
59
+ A Pipe may already mix Project keys. Refresh replaces that Board with the current Scope.
60
+
61
+ ## Preset
62
+
63
+ A Preset is a named, local snapshot of Filter, Sort, and Hide. It is not Scope.
64
+
65
+ 1. Set Filter and Sort in the header. Hide a Column from **Columns** (uncheck its status).
66
+ 2. Left pane **Presets** (after Favourites). Always shown, default open.
67
+ 3. Group **…** → **Save Preset**: type a name, **Save** (or Enter). Done when the name is a row. Empty and duplicate names (case-insensitive) fail with "Preset names must be unique".
68
+ 4. Click the row to Apply: last-used Filter, Sort, and Hide become that snapshot. Apply also restores the opener at Save (All stories, All epics, or Combined). Later Filter / Sort / Hide writes last-used only. Command (Cmd+K) **Apply {name}** is the same Apply.
69
+ 5. Row **…**:
70
+ - **Save over** — replace that Preset with current last-used chrome
71
+ - **Rename** — prompt; same uniqueness rule as Save
72
+ - **Delete** — drop that Preset
73
+
74
+ No built-in names. No applied highlight. Search and the selected Epic do not change the Preset list.
40
75
 
41
76
  ## Fake Jira
42
77
 
package/dist/pipe-kan.js CHANGED
@@ -1276,6 +1276,42 @@ function createApp(opts) {
1276
1276
  rememberTargetEndId(merged);
1277
1277
  return merged;
1278
1278
  }
1279
+ function issueEpic(issue) {
1280
+ return cardsOf([issue], targetEndFieldId)[0]?.epic;
1281
+ }
1282
+ function mergeSelectedChildren(existing, incoming, epicKeys) {
1283
+ const replace = new Set(epicKeys);
1284
+ const incomingKeys = new Set(incoming.map(issueKeyOf).filter((key) => Boolean(key)));
1285
+ const kept = existing.filter((issue) => {
1286
+ const key = issueKeyOf(issue);
1287
+ if (key && incomingKeys.has(key))
1288
+ return false;
1289
+ const epic = issueEpic(issue);
1290
+ return !epic || !replace.has(epic);
1291
+ });
1292
+ return [...kept, ...incoming];
1293
+ }
1294
+ async function refreshSelected(epicKeys) {
1295
+ const keys = [...new Set(epicKeys.filter((key) => key.trim() !== ""))];
1296
+ console.log("Refresh selected", keys.join(","));
1297
+ try {
1298
+ let nextChildren = JSON.parse(await cli.listChildren(keys));
1299
+ const cards = cardsOf(nextChildren, targetEndFieldId);
1300
+ if (cards.length > 0 && !cards.some((card) => card.epic) && keys.length === 1) {
1301
+ const epic = keys[0];
1302
+ nextChildren = JSON.parse(await cli.listEpic(epic, flags));
1303
+ }
1304
+ const hydrated = await hydrateRaw(nextChildren);
1305
+ childrenRaw = mergeSelectedChildren(childrenRaw, hydrated, keys);
1306
+ hasChildrenCache = true;
1307
+ childrenError = undefined;
1308
+ return app.board();
1309
+ } catch (err) {
1310
+ const message = err instanceof Error ? err.message : "Refresh failed";
1311
+ console.error("Refresh failed", message);
1312
+ return { ...app.board(), error: message };
1313
+ }
1314
+ }
1279
1315
  async function tryMove(key, status) {
1280
1316
  const current = currentStatus(key);
1281
1317
  if (current === status) {
@@ -1308,7 +1344,10 @@ function createApp(opts) {
1308
1344
  rememberTargetEndId([...payload, ...epicsPayload, ...childrenRaw]);
1309
1345
  return app.board();
1310
1346
  },
1311
- async refresh(next) {
1347
+ async refresh(next, opts) {
1348
+ if (opts?.scope === "selected") {
1349
+ return refreshSelected(opts.epicKeys ?? []);
1350
+ }
1312
1351
  if (next !== undefined)
1313
1352
  flags = next;
1314
1353
  console.log("Refresh");
@@ -1486,6 +1525,15 @@ function handleAppApi(req, res, app) {
1486
1525
  if (url.pathname === "/api/refresh" && method === "POST") {
1487
1526
  reply(req, res, async (text) => {
1488
1527
  const body = text ? JSON.parse(text) : {};
1528
+ if (body.scope === "selected") {
1529
+ const epicKeys = Array.isArray(body.epicKeys) ? body.epicKeys.filter((item) => typeof item === "string" && item.trim() !== "") : [];
1530
+ if (!epicKeys.length) {
1531
+ json(res, 400, { error: "selected Refresh requires epicKeys" });
1532
+ return;
1533
+ }
1534
+ json(res, 200, await app.refresh(undefined, { scope: "selected", epicKeys }));
1535
+ return;
1536
+ }
1489
1537
  json(res, 200, await app.refresh(body.flags));
1490
1538
  });
1491
1539
  return true;
@@ -11783,12 +11831,17 @@ function permissionOptionForDecision(options, decision) {
11783
11831
  // src/server/agent/skills.ts
11784
11832
  import { existsSync as existsSync3, readFileSync as readFileSync4, readdirSync } from "node:fs";
11785
11833
  import { homedir as homedir4 } from "node:os";
11786
- import { join as join6 } from "node:path";
11787
- function createSkillRegistry(bundledDir = join6(import.meta.dirname, "..", "..", "..", ".agents", "skills")) {
11834
+ import { dirname as dirname3, join as join6 } from "node:path";
11835
+ import { fileURLToPath } from "node:url";
11836
+ function moduleDirname(meta) {
11837
+ return meta.dirname ?? dirname3(fileURLToPath(meta.url));
11838
+ }
11839
+ function createSkillRegistry(bundledDir) {
11840
+ const dir = bundledDir ?? join6(moduleDirname(import.meta), "..", "..", "..", ".agents", "skills");
11788
11841
  const userDir = join6(homedir4(), ".pi", "agent", "skills");
11789
11842
  return {
11790
11843
  list() {
11791
- const bundled = listSkills(bundledDir);
11844
+ const bundled = listSkills(dir);
11792
11845
  const user = existsSync3(userDir) ? listSkills(userDir) : [];
11793
11846
  const map = new Map;
11794
11847
  for (const skill of bundled)
@@ -11801,7 +11854,7 @@ function createSkillRegistry(bundledDir = join6(import.meta.dirname, "..", "..",
11801
11854
  const userPath = skillPath(userDir, id);
11802
11855
  if (existsSync3(userPath))
11803
11856
  return readSkill(userPath, id);
11804
- const bundledPath = skillPath(bundledDir, id);
11857
+ const bundledPath = skillPath(dir, id);
11805
11858
  if (existsSync3(bundledPath))
11806
11859
  return readSkill(bundledPath, id);
11807
11860
  return;
@@ -11893,7 +11946,7 @@ var TOOLS = [
11893
11946
  },
11894
11947
  {
11895
11948
  name: "refresh_board",
11896
- description: "Refresh the board from Jira. Requires user approval.",
11949
+ description: "Open the Refresh confirm dialog (all Epics or the focused Epic). Requires user approval.",
11897
11950
  parameters: { flags: { type: "string", description: "Optional jira-cli flags" } },
11898
11951
  mutates: true
11899
11952
  },
@@ -11934,7 +11987,10 @@ var TOOLS = [
11934
11987
  mutates: true
11935
11988
  }
11936
11989
  ];
11937
- var skills = createSkillRegistry();
11990
+ var skills;
11991
+ function skillRegistry() {
11992
+ return skills ??= createSkillRegistry();
11993
+ }
11938
11994
  var EXECUTORS = {
11939
11995
  board_state(_, app) {
11940
11996
  const board = app.board();
@@ -11957,7 +12013,7 @@ var EXECUTORS = {
11957
12013
  const skillId = String(args.skillId ?? "");
11958
12014
  if (!skillId)
11959
12015
  return { ok: false, error: "Missing skillId" };
11960
- const skill = skills.load(skillId);
12016
+ const skill = skillRegistry().load(skillId);
11961
12017
  if (!skill)
11962
12018
  return { ok: false, error: `Skill not found: ${skillId}` };
11963
12019
  const block = skillContextBlock(skill);
@@ -11989,10 +12045,15 @@ var EXECUTORS = {
11989
12045
  return { ok: false, error: result.error };
11990
12046
  return { ok: true, value: { moved: key, to: status } };
11991
12047
  },
11992
- async refresh_board(args, app) {
12048
+ refresh_board(args) {
11993
12049
  const flags = typeof args.flags === "string" ? args.flags : undefined;
11994
- await app.refresh(flags);
11995
- return { ok: true, value: "Board refreshed" };
12050
+ return {
12051
+ ok: true,
12052
+ value: {
12053
+ __ui_action: "confirm_refresh",
12054
+ ...flags !== undefined ? { flags } : {}
12055
+ }
12056
+ };
11996
12057
  },
11997
12058
  apply_preset(args) {
11998
12059
  const name = String(args.name ?? "");
@@ -12100,7 +12161,10 @@ function createToolRegistry() {
12100
12161
  var sessions = new Map;
12101
12162
  var connecting = null;
12102
12163
  var startEpoch = 0;
12103
- var skills2 = createSkillRegistry();
12164
+ var skills2;
12165
+ function skillRegistry2() {
12166
+ return skills2 ??= createSkillRegistry();
12167
+ }
12104
12168
  var tools = createToolRegistry();
12105
12169
  function json2(res, status, body) {
12106
12170
  res.statusCode = status;
@@ -12160,7 +12224,7 @@ function handleAgentApi(req, res, app) {
12160
12224
  return true;
12161
12225
  }
12162
12226
  if (url.pathname === "/api/agent/skills" && method === "GET") {
12163
- json2(res, 200, skills2.list().map((s) => ({ id: s.id, name: s.name, description: s.description })));
12227
+ json2(res, 200, skillRegistry2().list().map((s) => ({ id: s.id, name: s.name, description: s.description })));
12164
12228
  return true;
12165
12229
  }
12166
12230
  if (url.pathname === "/api/agent/session" && method === "POST") {
@@ -12238,7 +12302,7 @@ function handleAgentApi(req, res, app) {
12238
12302
  }
12239
12303
  const context = [tools.systemBlock(), ...withPipedBoardContext(app.board(), body.context ?? [])];
12240
12304
  if (body.skillId) {
12241
- const skill = skills2.load(body.skillId);
12305
+ const skill = skillRegistry2().load(body.skillId);
12242
12306
  if (skill)
12243
12307
  context.push(skillContextBlock(skill));
12244
12308
  }
@@ -12566,8 +12630,8 @@ function stdinStat() {
12566
12630
 
12567
12631
  // src/ui.ts
12568
12632
  import { createReadStream, existsSync as existsSync4, statSync } from "node:fs";
12569
- import { dirname as dirname3, extname, join as join9, resolve as resolve2, sep } from "node:path";
12570
- import { fileURLToPath } from "node:url";
12633
+ import { dirname as dirname4, extname, join as join9, resolve as resolve2, sep } from "node:path";
12634
+ import { fileURLToPath as fileURLToPath2 } from "node:url";
12571
12635
  var types = {
12572
12636
  ".css": "text/css; charset=utf-8",
12573
12637
  ".html": "text/html; charset=utf-8",
@@ -12580,7 +12644,7 @@ var types = {
12580
12644
  ".woff2": "font/woff2"
12581
12645
  };
12582
12646
  function packageRoot(from = import.meta.url) {
12583
- return resolve2(dirname3(fileURLToPath(from)), "..");
12647
+ return resolve2(dirname4(fileURLToPath2(from)), "..");
12584
12648
  }
12585
12649
  function uiDir(root) {
12586
12650
  return join9(root, "dist", "ui");
@@ -0,0 +1,2 @@
1
+ /*! tailwindcss v4.3.3 | MIT License | https://tailwindcss.com */
2
+ @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-translate-x:0;--tw-translate-y:0;--tw-translate-z:0;--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-leading:initial;--tw-font-weight:initial;--tw-ordinal:initial;--tw-slashed-zero:initial;--tw-numeric-figure:initial;--tw-numeric-spacing:initial;--tw-numeric-fraction: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-outline-style:solid;--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-content:""}}}@layer theme{:root,:host{--font-sans:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";--font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--color-red-500:oklch(63.7% .237 25.331);--color-orange-400:oklch(75% .183 55.934);--color-amber-400:oklch(82.8% .189 84.429);--color-amber-500:oklch(76.9% .188 70.08);--color-yellow-500:oklch(79.5% .184 86.047);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-lg:32rem;--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:calc(1.5 / 1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75 / 1.125);--font-weight-light:300;--font-weight-normal:400;--font-weight-medium:500;--font-weight-semibold:600;--font-weight-bold:700;--leading-snug:1.375;--leading-relaxed:1.625;--radius-xs:.125rem;--radius-2xl:1rem;--animate-spin:spin 1s linear infinite;--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-accent:var(--accent);--animate-shimmer:shimmer 1.6s linear infinite}}@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,-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", Arial, 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;-webkit-text-decoration:inherit;-webkit-text-decoration: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:where(:not(iframe)){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}*{border-color:var(--border);outline-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){*{outline-color:color-mix(in oklab, var(--ring) 50%, transparent)}}*{scrollbar-width:thin;scrollbar-color:var(--foreground) transparent}@supports (color:color-mix(in lab, red, red)){*{scrollbar-color:color-mix(in oklab, var(--foreground) 20%, transparent) transparent}}html,body{background-color:var(--sidebar);color:var(--foreground);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-family:Inter,SF Pro Display,ui-sans-serif,system-ui,sans-serif;font-weight:450}}@layer components;@layer utilities{.collapse{visibility:collapse}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.inset-0{inset:0}.-top-2{top:calc(var(--spacing) * -2)}.top-\[50\%\]{top:50%}.-right-2{right:calc(var(--spacing) * -2)}.left-2{left:calc(var(--spacing) * 2)}.left-\[50\%\]{left:50%}.z-10{z-index:10}.z-50{z-index:50}.order-first{order:-9999}.order-last{order:9999}.container{width:100%}@media (width>=40rem){.container{max-width:40rem}}@media (width>=48rem){.container{max-width:48rem}}@media (width>=64rem){.container{max-width:64rem}}@media (width>=80rem){.container{max-width:80rem}}@media (width>=96rem){.container{max-width:96rem}}.-mx-1{margin-inline:calc(var(--spacing) * -1)}.my-1{margin-block:var(--spacing)}.mt-0\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:var(--spacing)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-auto{margin-top:auto}.mr-1{margin-right:var(--spacing)}.mb-1\.5{margin-bottom:calc(var(--spacing) * 1.5)}.ml-auto{margin-left:auto}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.size-2{width:calc(var(--spacing) * 2);height:calc(var(--spacing) * 2)}.size-2\.5{width:calc(var(--spacing) * 2.5);height:calc(var(--spacing) * 2.5)}.size-3{width:calc(var(--spacing) * 3);height:calc(var(--spacing) * 3)}.size-3\.5{width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.size-4{width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.size-5{width:calc(var(--spacing) * 5);height:calc(var(--spacing) * 5)}.size-6{width:calc(var(--spacing) * 6);height:calc(var(--spacing) * 6)}.size-8{width:calc(var(--spacing) * 8);height:calc(var(--spacing) * 8)}.size-9{width:calc(var(--spacing) * 9);height:calc(var(--spacing) * 9)}.size-10{width:calc(var(--spacing) * 10);height:calc(var(--spacing) * 10)}.size-full{width:100%;height:100%}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-7{height:calc(var(--spacing) * 7)}.h-8{height:calc(var(--spacing) * 8)}.h-9{height:calc(var(--spacing) * 9)}.h-10{height:calc(var(--spacing) * 10)}.h-11{height:calc(var(--spacing) * 11)}.h-14{height:calc(var(--spacing) * 14)}.h-\[22px\]{height:22px}.h-auto{height:auto}.h-fit{height:fit-content}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-24{max-height:calc(var(--spacing) * 24)}.max-h-32{max-height:calc(var(--spacing) * 32)}.max-h-\[min\(20rem\,calc\(82vh-3rem\)\)\]{max-height:min(20rem,82vh - 3rem)}.max-h-\[min\(70vh\,28rem\)\]{max-height:min(70vh,28rem)}.max-h-\[var\(--radix-dropdown-menu-content-available-height\,70vh\)\]{max-height:var(--radix-dropdown-menu-content-available-height,70vh)}.min-h-0{min-height:0}.min-h-4{min-height:calc(var(--spacing) * 4)}.min-h-8{min-height:calc(var(--spacing) * 8)}.min-h-11{min-height:calc(var(--spacing) * 11)}.min-h-24{min-height:calc(var(--spacing) * 24)}.min-h-64{min-height:calc(var(--spacing) * 64)}.w-3{width:calc(var(--spacing) * 3)}.w-44{width:calc(var(--spacing) * 44)}.w-56{width:calc(var(--spacing) * 56)}.w-fit{width:fit-content}.w-full{width:100%}.w-px{width:1px}.max-w-72{max-width:calc(var(--spacing) * 72)}.max-w-\[85\%\]{max-width:85%}.max-w-\[calc\(100\%-2rem\)\]{max-width:calc(100% - 2rem)}.max-w-full{max-width:100%}.max-w-lg{max-width:var(--container-lg)}.min-w-0{min-width:0}.min-w-5{min-width:calc(var(--spacing) * 5)}.min-w-32{min-width:calc(var(--spacing) * 32)}.min-w-40{min-width:calc(var(--spacing) * 40)}.flex-1{flex:1}.shrink-0{flex-shrink:0}.translate-x-\[-50\%\]{--tw-translate-x:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-y-\[-50\%\]{--tw-translate-y:-50%;translate:var(--tw-translate-x) var(--tw-translate-y)}.-rotate-90{rotate:-90deg}.transform{transform:var(--tw-rotate-x,) var(--tw-rotate-y,) var(--tw-rotate-z,) var(--tw-skew-x,) var(--tw-skew-y,)}.shimmer{background-image:linear-gradient(90deg,currentColor 40% 50%,currentColor 60%)}@supports (color:color-mix(in lab, red, red)){.shimmer{background-image:linear-gradient(90deg, currentColor 40%, color-mix(in oklab, currentColor 35%, transparent) 50%, currentColor 60%)}}.shimmer{color:#0000;animation:var(--animate-shimmer);background-size:200% 100%;-webkit-background-clip:text;background-clip:text}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-grab\!{cursor:grab!important}.cursor-grabbing{cursor:grabbing}.cursor-grabbing\!{cursor:grabbing!important}.cursor-text{cursor:text}.resize-none{resize:none}.resize-y{resize:vertical}.auto-rows-fr{grid-auto-rows:minmax(0,1fr)}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.items-baseline{align-items:baseline}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:var(--spacing)}.gap-1\.5{gap:calc(var(--spacing) * 1.5)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}:where(.space-y-1>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(var(--spacing) * var(--tw-space-y-reverse));margin-block-end:calc(var(--spacing) * calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-hidden{overflow-x:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-2xl{border-radius:var(--radius-2xl)}.rounded-\[9px\]{border-radius:9px}.rounded-full{border-radius:2147483647px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-none{border-radius:0}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.rounded-xl{border-radius:calc(var(--radius) + 4px)}.rounded-xs{border-radius:var(--radius-xs)}.border{border-style:var(--tw-border-style);border-width:1px}.border-0{border-style:var(--tw-border-style);border-width:0}.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-l{border-left-style:var(--tw-border-style);border-left-width:1px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-border{border-color:var(--border)}.border-destructive\/15{border-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.border-destructive\/15{border-color:color-mix(in oklab, var(--destructive) 15%, transparent)}}.border-destructive\/40{border-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.border-destructive\/40{border-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}.border-input{border-color:var(--input)}.border-primary\/10{border-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.border-primary\/10{border-color:color-mix(in oklab, var(--primary) 10%, transparent)}}.border-transparent{border-color:#0000}.border-warning\/15{border-color:var(--warning)}@supports (color:color-mix(in lab, red, red)){.border-warning\/15{border-color:color-mix(in oklab, var(--warning) 15%, transparent)}}.border-warning\/50{border-color:var(--warning)}@supports (color:color-mix(in lab, red, red)){.border-warning\/50{border-color:color-mix(in oklab, var(--warning) 50%, transparent)}}.border-l-primary{border-left-color:var(--primary)}.bg-background{background-color:var(--background)}.bg-black\/40{background-color:#0006}@supports (color:color-mix(in lab, red, red)){.bg-black\/40{background-color:color-mix(in oklab, var(--color-black) 40%, transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab, red, red)){.bg-black\/50{background-color:color-mix(in oklab, var(--color-black) 50%, transparent)}}.bg-border{background-color:var(--border)}.bg-card{background-color:var(--card)}.bg-destructive\/10{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.bg-destructive\/10{background-color:color-mix(in oklab, var(--destructive) 10%, transparent)}}.bg-muted,.bg-muted\/40{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.bg-muted\/40{background-color:color-mix(in oklab, var(--muted) 40%, transparent)}}.bg-popover{background-color:var(--popover)}.bg-primary,.bg-primary\/10{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/10{background-color:color-mix(in oklab, var(--primary) 10%, transparent)}}.bg-primary\/20{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.bg-primary\/20{background-color:color-mix(in oklab, var(--primary) 20%, transparent)}}.bg-secondary{background-color:var(--secondary)}.bg-sidebar{background-color:var(--sidebar)}.bg-sidebar-accent{background-color:var(--sidebar-accent)}.bg-transparent{background-color:#0000}.bg-warning\/10{background-color:var(--warning)}@supports (color:color-mix(in lab, red, red)){.bg-warning\/10{background-color:color-mix(in oklab, var(--warning) 10%, transparent)}}.scroll-fade{-webkit-mask-image:linear-gradient(#0000,#000 12px calc(100% - 12px),#0000);mask-image:linear-gradient(#0000,#000 12px calc(100% - 12px),#0000)}.fill-current{fill:currentColor}.p-1{padding:var(--spacing)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-1{padding-inline:var(--spacing)}.px-1\.5{padding-inline:calc(var(--spacing) * 1.5)}.px-2{padding-inline:calc(var(--spacing) * 2)}.px-2\.5{padding-inline:calc(var(--spacing) * 2.5)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.px-\[7px\]{padding-inline:7px}.py-0{padding-block:0}.py-0\.5{padding-block:calc(var(--spacing) * .5)}.py-1{padding-block:var(--spacing)}.py-1\.5{padding-block:calc(var(--spacing) * 1.5)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-3{padding-block:calc(var(--spacing) * 3)}.py-4{padding-block:calc(var(--spacing) * 4)}.pt-1{padding-top:var(--spacing)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-3{padding-top:calc(var(--spacing) * 3)}.pt-\[13px\]{padding-top:13px}.pt-\[18vh\]{padding-top:18vh}.pr-1{padding-right:var(--spacing)}.pr-2{padding-right:calc(var(--spacing) * 2)}.pr-3{padding-right:calc(var(--spacing) * 3)}.pb-1{padding-bottom:var(--spacing)}.pb-2{padding-bottom:calc(var(--spacing) * 2)}.pb-3{padding-bottom:calc(var(--spacing) * 3)}.pb-5{padding-bottom:calc(var(--spacing) * 5)}.pb-6{padding-bottom:calc(var(--spacing) * 6)}.pl-0{padding-left:0}.pl-3{padding-left:calc(var(--spacing) * 3)}.pl-6{padding-left:calc(var(--spacing) * 6)}.pl-8{padding-left:calc(var(--spacing) * 8)}.text-center{text-align:center}.text-left{text-align:left}.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-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.text-\[9px\]{font-size:9px}.text-\[11px\]{font-size:11px}.text-\[12px\]{font-size:12px}.text-\[13px\]{font-size:13px}.leading-\[18px\]{--tw-leading:18px;line-height:18px}.leading-none{--tw-leading:1;line-height:1}.leading-relaxed{--tw-leading:var(--leading-relaxed);line-height:var(--leading-relaxed)}.leading-snug{--tw-leading:var(--leading-snug);line-height:var(--leading-snug)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.font-normal{--tw-font-weight:var(--font-weight-normal);font-weight:var(--font-weight-normal)}.font-semibold{--tw-font-weight:var(--font-weight-semibold);font-weight:var(--font-weight-semibold)}.wrap-break-word{overflow-wrap:break-word}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-500{color:var(--color-amber-500)}.text-card-foreground{color:var(--card-foreground)}.text-destructive{color:var(--destructive)}.text-destructive-foreground{color:var(--destructive-foreground)}.text-foreground{color:var(--foreground)}.text-muted-foreground,.text-muted-foreground\/60{color:var(--muted-foreground)}@supports (color:color-mix(in lab, red, red)){.text-muted-foreground\/60{color:color-mix(in oklab, var(--muted-foreground) 60%, transparent)}}.text-orange-400{color:var(--color-orange-400)}.text-popover-foreground{color:var(--popover-foreground)}.text-primary{color:var(--primary)}.text-primary-foreground{color:var(--primary-foreground)}.text-red-500{color:var(--color-red-500)}.text-secondary-foreground{color:var(--secondary-foreground)}.text-sidebar-accent-foreground{color:var(--sidebar-accent-foreground)}.text-sidebar-foreground{color:var(--sidebar-foreground)}.text-warning-foreground{color:var(--warning-foreground)}.text-yellow-500{color:var(--color-yellow-500)}.capitalize{text-transform:capitalize}.uppercase{text-transform:uppercase}.lining-nums{--tw-numeric-figure:lining-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.tabular-nums{--tw-numeric-spacing:tabular-nums;font-variant-numeric:var(--tw-ordinal,) var(--tw-slashed-zero,) var(--tw-numeric-figure,) var(--tw-numeric-spacing,) var(--tw-numeric-fraction,)}.underline-offset-4{text-underline-offset:4px}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.opacity-0{opacity:0}.opacity-50{opacity:.5}.shadow{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px 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)}.shadow-\[inset_0_0_0_1px_var\(--ring\)\]{--tw-shadow:inset 0 0 0 1px var(--tw-shadow-color,var(--ring));box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a), 0 4px 6px -4px 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)}.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)}.shadow-none{--tw-shadow:0 0 #0000;box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a), 0 1px 2px -1px 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)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.ring-primary{--tw-ring-color:var(--primary)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.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-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}@media (hover:hover){.group-hover\:opacity-60:is(:where(.group):hover *){opacity:.6}.group-hover\/kanban-column\:opacity-100:is(:where(.group\/kanban-column):hover *){opacity:1}}.group-data-\[align\=end\]\/message\:items-end:is(:where(.group\/message)[data-align=end] *){align-items:flex-end}.group-data-\[align\=end\]\/message\:justify-end:is(:where(.group\/message)[data-align=end] *){justify-content:flex-end}.group-data-\[align\=end\]\/message\:self-end:is(:where(.group\/message)[data-align=end] *){align-self:flex-end}.group-data-\[variant\=separator\]\/marker\:flex-none:is(:where(.group\/marker)[data-variant=separator] *){flex:none}.placeholder\:text-muted-foreground::placeholder{color:var(--muted-foreground)}.before\:mr-1:before{content:var(--tw-content);margin-right:var(--spacing)}.before\:h-px:before{content:var(--tw-content);height:1px}.before\:min-w-0:before{content:var(--tw-content);min-width:0}.before\:flex-1:before{content:var(--tw-content);flex:1}.before\:bg-border:before{content:var(--tw-content);background-color:var(--border)}.after\:absolute:after{content:var(--tw-content);position:absolute}.after\:inset-y-0:after{content:var(--tw-content);inset-block:0}.after\:left-1\/2:after{content:var(--tw-content);left:50%}.after\:ml-1:after{content:var(--tw-content);margin-left:var(--spacing)}.after\:h-px:after{content:var(--tw-content);height:1px}.after\:w-1:after{content:var(--tw-content);width:var(--spacing)}.after\:min-w-0:after{content:var(--tw-content);min-width:0}.after\:flex-1:after{content:var(--tw-content);flex:1}.after\:-translate-x-1\/2:after{content:var(--tw-content);--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.after\:bg-border:after{content:var(--tw-content);background-color:var(--border)}@media (hover:hover){.hover\:bg-accent:hover{background-color:var(--accent)}.hover\:bg-destructive\/90:hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-destructive\/90:hover{background-color:color-mix(in oklab, var(--destructive) 90%, transparent)}}.hover\:bg-foreground\/5:hover{background-color:var(--foreground)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-foreground\/5:hover{background-color:color-mix(in oklab, var(--foreground) 5%, transparent)}}.hover\:bg-muted\/50:hover{background-color:var(--muted)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-muted\/50:hover{background-color:color-mix(in oklab, var(--muted) 50%, transparent)}}.hover\:bg-primary\/90:hover{background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-primary\/90:hover{background-color:color-mix(in oklab, var(--primary) 90%, transparent)}}.hover\:bg-secondary\/80:hover{background-color:var(--secondary)}@supports (color:color-mix(in lab, red, red)){.hover\:bg-secondary\/80:hover{background-color:color-mix(in oklab, var(--secondary) 80%, transparent)}}.hover\:text-accent-foreground:hover{color:var(--accent-foreground)}.hover\:text-foreground:hover{color:var(--foreground)}.hover\:text-white:hover{color:var(--color-white)}.hover\:underline:hover{text-decoration-line:underline}}.focus\:bg-accent:focus{background-color:var(--accent)}.focus\:text-accent-foreground:focus{color:var(--accent-foreground)}.focus-visible\:border-ring:focus-visible{border-color:var(--ring)}.focus-visible\:ring-0:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-1:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-2:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-\[3px\]:focus-visible{--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-destructive\/20:focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.focus-visible\:ring-ring:focus-visible,.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.focus-visible\:ring-ring\/50:focus-visible{--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.focus-visible\:ring-offset-1:focus-visible{--tw-ring-offset-width:1px;--tw-ring-offset-shadow:var(--tw-ring-inset,) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color)}.focus-visible\:outline-hidden:focus-visible{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.focus-visible\:outline-hidden:focus-visible{outline-offset:2px;outline:2px solid #0000}}.disabled\:pointer-events-none:disabled{pointer-events:none}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-50:disabled{opacity:.5}.has-\[\[data-slot\=input-group-control\]\:focus-visible\]\:border-ring:has([data-slot=input-group-control]:focus-visible){border-color:var(--ring)}.has-\[\[data-slot\=input-group-control\]\:focus-visible\]\:ring-\[3px\]:has([data-slot=input-group-control]:focus-visible){--tw-ring-shadow:var(--tw-ring-inset,) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow)}.has-\[\[data-slot\=input-group-control\]\:focus-visible\]\:ring-ring\/50:has([data-slot=input-group-control]:focus-visible){--tw-ring-color:var(--ring)}@supports (color:color-mix(in lab, red, red)){.has-\[\[data-slot\=input-group-control\]\:focus-visible\]\:ring-ring\/50:has([data-slot=input-group-control]:focus-visible){--tw-ring-color:color-mix(in oklab, var(--ring) 50%, transparent)}}.has-\[\>svg\]\:px-2\.5:has(>svg){padding-inline:calc(var(--spacing) * 2.5)}.has-\[\>svg\]\:px-3:has(>svg){padding-inline:calc(var(--spacing) * 3)}.has-\[\>svg\]\:px-4:has(>svg){padding-inline:calc(var(--spacing) * 4)}.aria-invalid\:border-destructive[aria-invalid=true]{border-color:var(--destructive)}.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.aria-invalid\:ring-destructive\/20[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 20%, transparent)}}.aria-\[orientation\=horizontal\]\:h-px[aria-orientation=horizontal]{height:1px}.aria-\[orientation\=horizontal\]\:w-full[aria-orientation=horizontal]{width:100%}.aria-\[orientation\=horizontal\]\:after\:left-0[aria-orientation=horizontal]:after{content:var(--tw-content);left:0}.aria-\[orientation\=horizontal\]\:after\:h-1[aria-orientation=horizontal]:after{content:var(--tw-content);height:var(--spacing)}.aria-\[orientation\=horizontal\]\:after\:w-full[aria-orientation=horizontal]:after{content:var(--tw-content);width:100%}.aria-\[orientation\=horizontal\]\:after\:translate-x-0[aria-orientation=horizontal]:after{content:var(--tw-content);--tw-translate-x:0px;translate:var(--tw-translate-x) var(--tw-translate-y)}.aria-\[orientation\=horizontal\]\:after\:-translate-y-1\/2[aria-orientation=horizontal]:after{content:var(--tw-content);--tw-translate-y:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.aria-\[orientation\=vertical\]\:flex-col[aria-orientation=vertical]{flex-direction:column}.data-disabled\:pointer-events-none[data-disabled]{pointer-events:none}.data-disabled\:opacity-50[data-disabled]{opacity:.5}.data-\[align\=end\]\:flex-row-reverse[data-align=end]{flex-direction:row-reverse}:is(.\*\:data-\[slot\=bubble-content\]\:bg-muted>*)[data-slot=bubble-content]{background-color:var(--muted)}:is(.\*\:data-\[slot\=bubble-content\]\:bg-primary>*)[data-slot=bubble-content]{background-color:var(--primary)}:is(.\*\:data-\[slot\=bubble-content\]\:text-primary-foreground>*)[data-slot=bubble-content]{color:var(--primary-foreground)}@media (width>=40rem){.sm\:max-w-lg{max-width:var(--container-lg)}.sm\:flex-row{flex-direction:row}.sm\:justify-end{justify-content:flex-end}.sm\:text-left{text-align:left}}@media (width>=48rem){.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.dark\:border-destructive\/25:where(.dark *,.dark){border-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:border-destructive\/25:where(.dark *,.dark){border-color:color-mix(in oklab, var(--destructive) 25%, transparent)}}@media (prefers-color-scheme:dark){.dark\:border-destructive\/25:where(.system *,.system){border-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:border-destructive\/25:where(.system *,.system){border-color:color-mix(in oklab, var(--destructive) 25%, transparent)}}}.dark\:border-input:where(.dark *,.dark){border-color:var(--input)}@media (prefers-color-scheme:dark){.dark\:border-input:where(.system *,.system){border-color:var(--input)}}.dark\:border-primary\/25:where(.dark *,.dark){border-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.dark\:border-primary\/25:where(.dark *,.dark){border-color:color-mix(in oklab, var(--primary) 25%, transparent)}}@media (prefers-color-scheme:dark){.dark\:border-primary\/25:where(.system *,.system){border-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.dark\:border-primary\/25:where(.system *,.system){border-color:color-mix(in oklab, var(--primary) 25%, transparent)}}}.dark\:border-warning\/25:where(.dark *,.dark){border-color:var(--warning)}@supports (color:color-mix(in lab, red, red)){.dark\:border-warning\/25:where(.dark *,.dark){border-color:color-mix(in oklab, var(--warning) 25%, transparent)}}@media (prefers-color-scheme:dark){.dark\:border-warning\/25:where(.system *,.system){border-color:var(--warning)}@supports (color:color-mix(in lab, red, red)){.dark\:border-warning\/25:where(.system *,.system){border-color:color-mix(in oklab, var(--warning) 25%, transparent)}}}.dark\:bg-destructive\/15:where(.dark *,.dark){background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-destructive\/15:where(.dark *,.dark){background-color:color-mix(in oklab, var(--destructive) 15%, transparent)}}@media (prefers-color-scheme:dark){.dark\:bg-destructive\/15:where(.system *,.system){background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-destructive\/15:where(.system *,.system){background-color:color-mix(in oklab, var(--destructive) 15%, transparent)}}}.dark\:bg-input\/30:where(.dark *,.dark){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-input\/30:where(.dark *,.dark){background-color:color-mix(in oklab, var(--input) 30%, transparent)}}@media (prefers-color-scheme:dark){.dark\:bg-input\/30:where(.system *,.system){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-input\/30:where(.system *,.system){background-color:color-mix(in oklab, var(--input) 30%, transparent)}}}.dark\:bg-input\/32:where(.dark *,.dark){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-input\/32:where(.dark *,.dark){background-color:color-mix(in oklab, var(--input) 32%, transparent)}}@media (prefers-color-scheme:dark){.dark\:bg-input\/32:where(.system *,.system){background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-input\/32:where(.system *,.system){background-color:color-mix(in oklab, var(--input) 32%, transparent)}}}.dark\:bg-primary\/15:where(.dark *,.dark){background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-primary\/15:where(.dark *,.dark){background-color:color-mix(in oklab, var(--primary) 15%, transparent)}}@media (prefers-color-scheme:dark){.dark\:bg-primary\/15:where(.system *,.system){background-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-primary\/15:where(.system *,.system){background-color:color-mix(in oklab, var(--primary) 15%, transparent)}}}.dark\:bg-transparent:where(.dark *,.dark){background-color:#0000}@media (prefers-color-scheme:dark){.dark\:bg-transparent:where(.system *,.system){background-color:#0000}}.dark\:bg-warning\/15:where(.dark *,.dark){background-color:var(--warning)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-warning\/15:where(.dark *,.dark){background-color:color-mix(in oklab, var(--warning) 15%, transparent)}}@media (prefers-color-scheme:dark){.dark\:bg-warning\/15:where(.system *,.system){background-color:var(--warning)}@supports (color:color-mix(in lab, red, red)){.dark\:bg-warning\/15:where(.system *,.system){background-color:color-mix(in oklab, var(--warning) 15%, transparent)}}}.dark\:text-amber-400:where(.dark *,.dark){color:var(--color-amber-400)}@media (prefers-color-scheme:dark){.dark\:text-amber-400:where(.system *,.system){color:var(--color-amber-400)}}.dark\:text-destructive:where(.dark *,.dark){color:var(--destructive)}@media (prefers-color-scheme:dark){.dark\:text-destructive:where(.system *,.system){color:var(--destructive)}}.dark\:text-primary:where(.dark *,.dark){color:var(--primary)}@media (prefers-color-scheme:dark){.dark\:text-primary:where(.system *,.system){color:var(--primary)}}.dark\:text-warning:where(.dark *,.dark){color:var(--warning)}@media (prefers-color-scheme:dark){.dark\:text-warning:where(.system *,.system){color:var(--warning)}}@media (hover:hover){.dark\:hover\:bg-accent\/50:where(.dark *,.dark):hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-accent\/50:where(.dark *,.dark):hover{background-color:color-mix(in oklab, var(--accent) 50%, transparent)}}}@media (prefers-color-scheme:dark){@media (hover:hover){.dark\:hover\:bg-accent\/50:where(.system *,.system):hover{background-color:var(--accent)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-accent\/50:where(.system *,.system):hover{background-color:color-mix(in oklab, var(--accent) 50%, transparent)}}}}@media (hover:hover){.dark\:hover\:bg-destructive\/60:where(.dark *,.dark):hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-destructive\/60:where(.dark *,.dark):hover{background-color:color-mix(in oklab, var(--destructive) 60%, transparent)}}}@media (prefers-color-scheme:dark){@media (hover:hover){.dark\:hover\:bg-destructive\/60:where(.system *,.system):hover{background-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-destructive\/60:where(.system *,.system):hover{background-color:color-mix(in oklab, var(--destructive) 60%, transparent)}}}}@media (hover:hover){.dark\:hover\:bg-input\/50:where(.dark *,.dark):hover{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-input\/50:where(.dark *,.dark):hover{background-color:color-mix(in oklab, var(--input) 50%, transparent)}}}@media (prefers-color-scheme:dark){@media (hover:hover){.dark\:hover\:bg-input\/50:where(.system *,.system):hover{background-color:var(--input)}@supports (color:color-mix(in lab, red, red)){.dark\:hover\:bg-input\/50:where(.system *,.system):hover{background-color:color-mix(in oklab, var(--input) 50%, transparent)}}}}.dark\:focus-visible\:ring-destructive\/40:where(.dark *,.dark):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:focus-visible\:ring-destructive\/40:where(.dark *,.dark):focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}@media (prefers-color-scheme:dark){.dark\:focus-visible\:ring-destructive\/40:where(.system *,.system):focus-visible{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:focus-visible\:ring-destructive\/40:where(.system *,.system):focus-visible{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}}.dark\:aria-invalid\:ring-destructive\/40:where(.dark *,.dark)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:aria-invalid\:ring-destructive\/40:where(.dark *,.dark)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}@media (prefers-color-scheme:dark){.dark\:aria-invalid\:ring-destructive\/40:where(.system *,.system)[aria-invalid=true]{--tw-ring-color:var(--destructive)}@supports (color:color-mix(in lab, red, red)){.dark\:aria-invalid\:ring-destructive\/40:where(.system *,.system)[aria-invalid=true]{--tw-ring-color:color-mix(in oklab, var(--destructive) 40%, transparent)}}}.\[\&_svg\]\:pointer-events-none svg{pointer-events:none}.\[\&_svg\]\:shrink-0 svg{flex-shrink:0}.\[\&_svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4 svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&_svg\:not\(\[class\*\=size-\]\)\]\:size-3\.5 svg:not([class*=size-]){width:calc(var(--spacing) * 3.5);height:calc(var(--spacing) * 3.5)}.\[\&\>svg\:not\(\[class\*\=\'size-\'\]\)\]\:size-4>svg:not([class*=size-]){width:calc(var(--spacing) * 4);height:calc(var(--spacing) * 4)}.\[\&\[aria-orientation\=horizontal\]\>div\]\:rotate-90[aria-orientation=horizontal]>div{rotate:90deg}}:root{--background:#f9f9fa;--foreground:#23252a;--card:#fff;--card-foreground:#23252a;--popover:#fff;--popover-foreground:#23252a;--primary:#6d78d5;--primary-foreground:#fff;--secondary:#efeff0;--secondary-foreground:#23252a;--muted:#efeff0;--muted-foreground:#b0b5c0;--accent:#e8e8ea;--accent-foreground:#23252a;--destructive:#eb5757;--destructive-foreground:#eb5757;--warning:#f2994a;--warning-foreground:#8a5a20;--border:#e2e2e2;--input:#e2e2e2;--ring:#7180ff;--chart-1:oklch(64.6% .222 41.116);--chart-2:oklch(60% .118 184.704);--chart-3:oklch(39.8% .07 227.392);--chart-4:oklch(82.8% .189 84.429);--chart-5:oklch(76.9% .188 70.08);--radius:.5rem;--header-height:calc(var(--spacing) * 11);--sidebar:#efeff0;--sidebar-foreground:#23252a;--sidebar-primary:#6d78d5;--sidebar-primary-foreground:#fff;--sidebar-accent:#e4e4e6;--sidebar-accent-foreground:#23252a;--sidebar-border:#e2e2e2;--sidebar-ring:#7180ff;--kanban-board-circle-primary:oklch(43.9% 0 0);--kanban-board-circle-gray:oklch(55.13% .0233 264.36);--kanban-board-circle-red:oklch(63.68% .2078 25.33);--kanban-board-circle-yellow:oklch(79.59% .1618 86.05);--kanban-board-circle-green:oklch(72.29% .1921 149.58);--kanban-board-circle-cyan:oklch(71.46% .1256 215.13);--kanban-board-circle-blue:oklch(62.32% .1879 259.8);--kanban-board-circle-indigo:oklch(58.6% .2037 277.12);--kanban-board-circle-violet:oklch(60.59% .2187 292.72);--kanban-board-circle-purple:oklch(62.67% .2325 303.86);--kanban-board-circle-pink:oklch(65.59% .2117 354.34)}.dark{--lightningcss-light: ;--lightningcss-dark:initial;color-scheme:dark;--background:#121213;--foreground:#fff;--card:#18191a;--card-foreground:#fff;--popover:#18191a;--popover-foreground:#fff;--primary:#6d78d5;--primary-foreground:#fff;--secondary:#19191c;--secondary-foreground:#fff;--muted:#19191c;--muted-foreground:#6b6f76;--accent:#1c1c1d;--accent-foreground:#fff;--destructive:#eb5757;--destructive-foreground:#eb5757;--warning:#f2994a;--warning-foreground:#f2994a;--border:#212224;--input:#212224;--ring:#7180ff;--chart-1:oklch(48.8% .243 264.376);--chart-2:oklch(69.6% .17 162.48);--chart-3:oklch(76.9% .188 70.08);--chart-4:oklch(62.7% .265 303.9);--chart-5:oklch(64.5% .246 16.439);--sidebar:#09090a;--sidebar-foreground:#fff;--sidebar-primary:#6d78d5;--sidebar-primary-foreground:#fff;--sidebar-accent:#18191a;--sidebar-accent-foreground:#fff;--sidebar-border:#212224;--sidebar-ring:#7180ff;--kanban-board-circle-primary:oklch(55.6% 0 0);--kanban-board-circle-gray:oklch(71.37% .0192 261.33);--kanban-board-circle-red:oklch(71.08% .166 22.21);--kanban-board-circle-yellow:oklch(86.01% .173 91.84);--kanban-board-circle-green:oklch(80.03% .1823 151.7);--kanban-board-circle-cyan:oklch(79.73% .1339 211.45);--kanban-board-circle-blue:oklch(71.35% .1435 254.61);--kanban-board-circle-indigo:oklch(67.97% .1586 276.96);--kanban-board-circle-violet:oklch(70.93% .1589 293.52);--kanban-board-circle-purple:oklch(72.18% .1766 305.51);--kanban-board-circle-pink:oklch(72.53% .1752 349.74)}.pk-calendar{--fc-border-color:var(--border);--fc-page-bg-color:transparent;--fc-neutral-bg-color:var(--muted);--fc-today-bg-color:var(--primary)}@supports (color:color-mix(in lab, red, red)){.pk-calendar{--fc-today-bg-color:color-mix(in oklab, var(--primary) 14%, transparent)}}.pk-calendar{--fc-neutral-text-color:var(--foreground);--fc-button-bg-color:transparent;--fc-button-border-color:var(--border);--fc-button-text-color:var(--foreground);--fc-button-hover-bg-color:var(--muted);--fc-button-hover-border-color:var(--border);--fc-button-active-bg-color:var(--muted);--fc-button-active-border-color:var(--border);--fc-event-bg-color:var(--primary);--fc-event-border-color:var(--primary);--fc-event-text-color:var(--primary-foreground);--fc-small-font-size:11px;color:var(--foreground);font-size:12px}.pk-calendar .fc-toolbar-title{font-size:13px;font-weight:500}.pk-calendar .fc-button{box-shadow:none;padding:.15rem .5rem;font-size:12px}.pk-calendar .fc-event{cursor:pointer}.pk-calendar .fc-event-key{all:unset;text-overflow:ellipsis;white-space:nowrap;cursor:pointer;width:100%;font:inherit;display:block;overflow:hidden}.pk-calendar .fc-event-created{background-color:var(--chart-2);border-color:var(--chart-2)}.pk-calendar .fc-event-target-end{background-color:var(--primary);border-color:var(--primary)}@property --tw-translate-x{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-y{syntax:"*";inherits:false;initial-value:0}@property --tw-translate-z{syntax:"*";inherits:false;initial-value:0}@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-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-ordinal{syntax:"*";inherits:false}@property --tw-slashed-zero{syntax:"*";inherits:false}@property --tw-numeric-figure{syntax:"*";inherits:false}@property --tw-numeric-spacing{syntax:"*";inherits:false}@property --tw-numeric-fraction{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-outline-style{syntax:"*";inherits:false;initial-value:solid}@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-content{syntax:"*";inherits:false;initial-value:""}@keyframes spin{to{transform:rotate(360deg)}}@keyframes shimmer{0%{background-position:100% 0}to{background-position:-100% 0}}