@pollinations/ui 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/README.md +15 -10
  2. package/dist/{Button-DMJ2K6Gr.d.ts → Button-Bn8pGg6N.d.ts} +1 -1
  3. package/dist/{Button-CNzpisJf.d.cts → Button-CWUBCiIc.d.cts} +1 -1
  4. package/dist/{Chip-BS8ronOu.d.ts → Chip-C5impfYd.d.ts} +2 -2
  5. package/dist/{Chip-DyqWrq0r.d.cts → Chip-SM52sUbZ.d.cts} +2 -2
  6. package/dist/app.css +1 -1
  7. package/dist/auth/index.cjs +1 -9
  8. package/dist/auth/index.cjs.map +1 -1
  9. package/dist/auth/index.d.cts +1 -2
  10. package/dist/auth/index.d.ts +1 -2
  11. package/dist/auth/index.js +1 -9
  12. package/dist/auth/index.js.map +1 -1
  13. package/dist/auth/sdk.d.cts +2 -2
  14. package/dist/auth/sdk.d.ts +2 -2
  15. package/dist/index.cjs +354 -177
  16. package/dist/index.cjs.map +1 -1
  17. package/dist/index.d.cts +47 -9
  18. package/dist/index.d.ts +47 -9
  19. package/dist/index.js +346 -176
  20. package/dist/index.js.map +1 -1
  21. package/dist/modality/index.cjs +6 -38
  22. package/dist/modality/index.cjs.map +1 -1
  23. package/dist/modality/index.d.cts +7 -27
  24. package/dist/modality/index.d.ts +7 -27
  25. package/dist/modality/index.js +6 -37
  26. package/dist/modality/index.js.map +1 -1
  27. package/dist/styles.css +1 -1
  28. package/dist/theme-VMRlhqST.d.cts +9 -0
  29. package/dist/theme-VMRlhqST.d.ts +9 -0
  30. package/dist/wallet/index.cjs +4 -1
  31. package/dist/wallet/index.cjs.map +1 -1
  32. package/dist/wallet/index.d.cts +2 -2
  33. package/dist/wallet/index.d.ts +2 -2
  34. package/dist/wallet/index.js +4 -1
  35. package/dist/wallet/index.js.map +1 -1
  36. package/dist/wallet/sdk.cjs +4 -1
  37. package/dist/wallet/sdk.cjs.map +1 -1
  38. package/dist/wallet/sdk.js +4 -1
  39. package/dist/wallet/sdk.js.map +1 -1
  40. package/package.json +3 -8
  41. package/dist/showcase/index.cjs +0 -2851
  42. package/dist/showcase/index.cjs.map +0 -1
  43. package/dist/showcase/index.d.cts +0 -19
  44. package/dist/showcase/index.d.ts +0 -19
  45. package/dist/showcase/index.js +0 -2839
  46. package/dist/showcase/index.js.map +0 -1
  47. package/dist/theme-DfHMjWB7.d.cts +0 -16
  48. package/dist/theme-DfHMjWB7.d.ts +0 -16
@@ -20,7 +20,6 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/modules/modality/index.ts
21
21
  var modality_exports = {};
22
22
  __export(modality_exports, {
23
- ModalityButton: () => ModalityButton,
24
23
  getModalityColors: () => getModalityColors
25
24
  });
26
25
  module.exports = __toCommonJS(modality_exports);
@@ -28,31 +27,37 @@ module.exports = __toCommonJS(modality_exports);
28
27
  // src/modules/modality/colors.ts
29
28
  var MODALITY_COLORS = {
30
29
  text: {
30
+ theme: "blue",
31
31
  filled: "polli:bg-blue-200 polli:text-blue-900",
32
32
  hover: "polli:hover:bg-blue-100 polli:hover:text-blue-900",
33
33
  text: "polli:text-blue-800"
34
34
  },
35
35
  image: {
36
+ theme: "pink",
36
37
  filled: "polli:bg-pink-200 polli:text-pink-900",
37
38
  hover: "polli:hover:bg-pink-100 polli:hover:text-pink-900",
38
39
  text: "polli:text-pink-800"
39
40
  },
40
41
  video: {
42
+ theme: "teal",
41
43
  filled: "polli:bg-teal-200 polli:text-teal-900",
42
44
  hover: "polli:hover:bg-teal-100 polli:hover:text-teal-900",
43
45
  text: "polli:text-teal-800"
44
46
  },
45
47
  audio: {
48
+ theme: "violet",
46
49
  filled: "polli:bg-violet-200 polli:text-violet-900",
47
50
  hover: "polli:hover:bg-violet-100 polli:hover:text-violet-900",
48
51
  text: "polli:text-violet-800"
49
52
  },
50
53
  realtime: {
54
+ theme: "green",
51
55
  filled: "polli:bg-green-200 polli:text-green-900",
52
56
  hover: "polli:hover:bg-green-100 polli:hover:text-green-900",
53
57
  text: "polli:text-green-800"
54
58
  },
55
59
  embedding: {
60
+ theme: "amber",
56
61
  filled: "polli:bg-amber-200 polli:text-amber-900",
57
62
  hover: "polli:hover:bg-amber-100 polli:hover:text-amber-900",
58
63
  text: "polli:text-amber-800"
@@ -71,45 +76,8 @@ function getModalityColors(category) {
71
76
  const key = normalize(category);
72
77
  return key ? MODALITY_COLORS[key] : null;
73
78
  }
74
-
75
- // src/lib/cn.ts
76
- var import_clsx = require("clsx");
77
- var import_tailwind_merge = require("tailwind-merge");
78
- var twMerge = (0, import_tailwind_merge.extendTailwindMerge)({ prefix: "polli" });
79
- function cn(...inputs) {
80
- return twMerge((0, import_clsx.clsx)(...inputs));
81
- }
82
-
83
- // src/modules/modality/ModalityButton.tsx
84
- var import_jsx_runtime = require("react/jsx-runtime");
85
- var ModalityButton = ({
86
- category,
87
- selected = true,
88
- onClick,
89
- disabled,
90
- children
91
- }) => {
92
- const colors = getModalityColors(category ?? "");
93
- return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
94
- "button",
95
- {
96
- type: "button",
97
- onClick,
98
- disabled,
99
- "aria-pressed": selected,
100
- className: cn(
101
- "polli:inline-flex polli:shrink-0 polli:items-center polli:gap-1 polli:rounded-full polli:px-3 polli:py-1 polli:text-left polli:text-sm polli:font-medium polli:leading-normal polli:transition-colors",
102
- selected ? colors?.filled ?? "polli:bg-gray-200 polli:text-gray-900" : "polli:bg-gray-100 polli:text-gray-600",
103
- !disabled && !selected && colors?.hover,
104
- disabled ? "polli:cursor-not-allowed polli:opacity-50" : "polli:cursor-pointer"
105
- ),
106
- children
107
- }
108
- );
109
- };
110
79
  // Annotate the CommonJS export names for ESM import in node:
111
80
  0 && (module.exports = {
112
- ModalityButton,
113
81
  getModalityColors
114
82
  });
115
83
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/modules/modality/index.ts","../../src/modules/modality/colors.ts","../../src/lib/cn.ts","../../src/modules/modality/ModalityButton.tsx"],"sourcesContent":["export {\n getModalityColors,\n type Modality,\n type ModalityColorSet,\n} from \"./colors.ts\";\nexport { ModalityButton, type ModalityButtonProps } from \"./ModalityButton.tsx\";\n","/**\n * Single source of truth for modality colors.\n *\n * Each modality (text/image/video/audio/realtime/embedding) gets one\n * page-theme hue, applied at the soft `-200/-900/-400` chip recipe.\n * Used in two places:\n * 1. The model-selection buttons in the API key creation flow.\n * 2. The static modality chips on the OAuth authorize screen.\n *\n * Interactive selection (model-picker) renders as `rounded-full` pills\n * aligned to the canonical Button. Static display (authorize summary)\n * renders as `rounded-lg` chips. Page-theme hues only — no rogue\n * indigo/rose.\n */\nexport type Modality =\n | \"text\"\n | \"image\"\n | \"video\"\n | \"audio\"\n | \"realtime\"\n | \"embedding\";\n\nexport type ModalityColorSet = {\n /** Selected/filled state: `bg + text + border` classes. */\n filled: string;\n /** Hover hint shown on the unselected button (subtle tint). */\n hover: string;\n /** Heading text colour for the category label. */\n text: string;\n};\n\n// No borders — chips and buttons in this system are borderless.\nexport const MODALITY_COLORS: Record<Modality, ModalityColorSet> = {\n text: {\n filled: \"polli:bg-blue-200 polli:text-blue-900\",\n hover: \"polli:hover:bg-blue-100 polli:hover:text-blue-900\",\n text: \"polli:text-blue-800\",\n },\n image: {\n filled: \"polli:bg-pink-200 polli:text-pink-900\",\n hover: \"polli:hover:bg-pink-100 polli:hover:text-pink-900\",\n text: \"polli:text-pink-800\",\n },\n video: {\n filled: \"polli:bg-teal-200 polli:text-teal-900\",\n hover: \"polli:hover:bg-teal-100 polli:hover:text-teal-900\",\n text: \"polli:text-teal-800\",\n },\n audio: {\n filled: \"polli:bg-violet-200 polli:text-violet-900\",\n hover: \"polli:hover:bg-violet-100 polli:hover:text-violet-900\",\n text: \"polli:text-violet-800\",\n },\n realtime: {\n filled: \"polli:bg-green-200 polli:text-green-900\",\n hover: \"polli:hover:bg-green-100 polli:hover:text-green-900\",\n text: \"polli:text-green-800\",\n },\n embedding: {\n filled: \"polli:bg-amber-200 polli:text-amber-900\",\n hover: \"polli:hover:bg-amber-100 polli:hover:text-amber-900\",\n text: \"polli:text-amber-800\",\n },\n};\n\n/** Map any human-typed category string to the canonical `Modality` key. */\nfunction normalize(category: string): Modality | null {\n const lower = category.toLowerCase();\n if (lower === \"images\") return \"image\";\n if (lower === \"embeddings\") return \"embedding\";\n if (\n lower === \"text\" ||\n lower === \"image\" ||\n lower === \"video\" ||\n lower === \"audio\" ||\n lower === \"realtime\" ||\n lower === \"embedding\"\n ) {\n return lower;\n }\n return null;\n}\n\nexport function getModalityColors(category: string): ModalityColorSet | null {\n const key = normalize(category);\n return key ? MODALITY_COLORS[key] : null;\n}\n","import { clsx } from \"clsx\";\nimport { extendTailwindMerge } from \"tailwind-merge\";\n\nconst twMerge = extendTailwindMerge({ prefix: \"polli\" });\n\n/** Internal class merge for polli:-prefixed package primitive classes. */\nexport function cn(...inputs: (string | undefined | null | false)[]) {\n return twMerge(clsx(...inputs));\n}\n","import type { FC, ReactNode } from \"react\";\nimport { cn } from \"../../lib/cn.ts\";\nimport { getModalityColors } from \"./colors.ts\";\n\nexport type ModalityButtonProps = {\n /** Modality key or category string (\"Text\", \"Images\", etc). */\n category?: string;\n /** Filled (modality hue) when true, muted gray when false. */\n selected?: boolean;\n onClick?: () => void;\n disabled?: boolean;\n children: ReactNode;\n};\n\n/**\n * Rounded-full pill button colored by modality. Single source of truth\n * for every interactive modality affordance — model picker, design\n * showcase, etc. Shape and recipe live here; consumers only supply\n * content + state.\n */\nexport const ModalityButton: FC<ModalityButtonProps> = ({\n category,\n selected = true,\n onClick,\n disabled,\n children,\n}) => {\n const colors = getModalityColors(category ?? \"\");\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n aria-pressed={selected}\n className={cn(\n \"polli:inline-flex polli:shrink-0 polli:items-center polli:gap-1 polli:rounded-full polli:px-3 polli:py-1 polli:text-left polli:text-sm polli:font-medium polli:leading-normal polli:transition-colors\",\n selected\n ? (colors?.filled ??\n \"polli:bg-gray-200 polli:text-gray-900\")\n : \"polli:bg-gray-100 polli:text-gray-600\",\n !disabled && !selected && colors?.hover,\n disabled\n ? \"polli:cursor-not-allowed polli:opacity-50\"\n : \"polli:cursor-pointer\",\n )}\n >\n {children}\n </button>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACgCO,IAAM,kBAAsD;AAAA,EAC/D,MAAM;AAAA,IACF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,EACV;AAAA,EACA,OAAO;AAAA,IACH,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,EACV;AAAA,EACA,OAAO;AAAA,IACH,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,EACV;AAAA,EACA,OAAO;AAAA,IACH,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,EACV;AAAA,EACA,UAAU;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,EACV;AAAA,EACA,WAAW;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,EACV;AACJ;AAGA,SAAS,UAAU,UAAmC;AAClD,QAAM,QAAQ,SAAS,YAAY;AACnC,MAAI,UAAU,SAAU,QAAO;AAC/B,MAAI,UAAU,aAAc,QAAO;AACnC,MACI,UAAU,UACV,UAAU,WACV,UAAU,WACV,UAAU,WACV,UAAU,cACV,UAAU,aACZ;AACE,WAAO;AAAA,EACX;AACA,SAAO;AACX;AAEO,SAAS,kBAAkB,UAA2C;AACzE,QAAM,MAAM,UAAU,QAAQ;AAC9B,SAAO,MAAM,gBAAgB,GAAG,IAAI;AACxC;;;ACtFA,kBAAqB;AACrB,4BAAoC;AAEpC,IAAM,cAAU,2CAAoB,EAAE,QAAQ,QAAQ,CAAC;AAGhD,SAAS,MAAM,QAA+C;AACjE,SAAO,YAAQ,kBAAK,GAAG,MAAM,CAAC;AAClC;;;ACqBQ;AATD,IAAM,iBAA0C,CAAC;AAAA,EACpD;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACF,QAAM,SAAS,kBAAkB,YAAY,EAAE;AAC/C,SACI;AAAA,IAAC;AAAA;AAAA,MACG,MAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA,gBAAc;AAAA,MACd,WAAW;AAAA,QACP;AAAA,QACA,WACO,QAAQ,UACL,0CACJ;AAAA,QACN,CAAC,YAAY,CAAC,YAAY,QAAQ;AAAA,QAClC,WACM,8CACA;AAAA,MACV;AAAA,MAEC;AAAA;AAAA,EACL;AAER;","names":[]}
1
+ {"version":3,"sources":["../../src/modules/modality/index.ts","../../src/modules/modality/colors.ts"],"sourcesContent":["export {\n getModalityColors,\n type Modality,\n type ModalityColorSet,\n} from \"./colors.ts\";\n","/**\n * Single source of truth for modality colors.\n *\n * Each modality (text/image/video/audio/realtime/embedding) gets one\n * page-theme hue, applied at the soft `-200/-900/-400` chip recipe.\n * Used by apps to compose model-selection buttons and static modality chips.\n * This module only owns modality color data; primitives own shape and behavior.\n */\nimport type { ThemeName } from \"../../theme.ts\";\n\nexport type Modality =\n | \"text\"\n | \"image\"\n | \"video\"\n | \"audio\"\n | \"realtime\"\n | \"embedding\";\n\nexport type ModalityColorSet = {\n /** Matching package theme for surfaces/chips that should inherit this hue. */\n theme: ThemeName;\n /** Selected/filled state: `bg + text + border` classes. */\n filled: string;\n /** Hover hint shown on the unselected button (subtle tint). */\n hover: string;\n /** Heading text colour for the category label. */\n text: string;\n};\n\n// No borders — chips and buttons in this system are borderless.\nexport const MODALITY_COLORS: Record<Modality, ModalityColorSet> = {\n text: {\n theme: \"blue\",\n filled: \"polli:bg-blue-200 polli:text-blue-900\",\n hover: \"polli:hover:bg-blue-100 polli:hover:text-blue-900\",\n text: \"polli:text-blue-800\",\n },\n image: {\n theme: \"pink\",\n filled: \"polli:bg-pink-200 polli:text-pink-900\",\n hover: \"polli:hover:bg-pink-100 polli:hover:text-pink-900\",\n text: \"polli:text-pink-800\",\n },\n video: {\n theme: \"teal\",\n filled: \"polli:bg-teal-200 polli:text-teal-900\",\n hover: \"polli:hover:bg-teal-100 polli:hover:text-teal-900\",\n text: \"polli:text-teal-800\",\n },\n audio: {\n theme: \"violet\",\n filled: \"polli:bg-violet-200 polli:text-violet-900\",\n hover: \"polli:hover:bg-violet-100 polli:hover:text-violet-900\",\n text: \"polli:text-violet-800\",\n },\n realtime: {\n theme: \"green\",\n filled: \"polli:bg-green-200 polli:text-green-900\",\n hover: \"polli:hover:bg-green-100 polli:hover:text-green-900\",\n text: \"polli:text-green-800\",\n },\n embedding: {\n theme: \"amber\",\n filled: \"polli:bg-amber-200 polli:text-amber-900\",\n hover: \"polli:hover:bg-amber-100 polli:hover:text-amber-900\",\n text: \"polli:text-amber-800\",\n },\n};\n\n/** Map any human-typed category string to the canonical `Modality` key. */\nfunction normalize(category: string): Modality | null {\n const lower = category.toLowerCase();\n if (lower === \"images\") return \"image\";\n if (lower === \"embeddings\") return \"embedding\";\n if (\n lower === \"text\" ||\n lower === \"image\" ||\n lower === \"video\" ||\n lower === \"audio\" ||\n lower === \"realtime\" ||\n lower === \"embedding\"\n ) {\n return lower;\n }\n return null;\n}\n\nexport function getModalityColors(category: string): ModalityColorSet | null {\n const key = normalize(category);\n return key ? MODALITY_COLORS[key] : null;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;AC8BO,IAAM,kBAAsD;AAAA,EAC/D,MAAM;AAAA,IACF,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,EACV;AAAA,EACA,OAAO;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,EACV;AAAA,EACA,OAAO;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,EACV;AAAA,EACA,OAAO;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,EACV;AAAA,EACA,UAAU;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,EACV;AAAA,EACA,WAAW;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,EACV;AACJ;AAGA,SAAS,UAAU,UAAmC;AAClD,QAAM,QAAQ,SAAS,YAAY;AACnC,MAAI,UAAU,SAAU,QAAO;AAC/B,MAAI,UAAU,aAAc,QAAO;AACnC,MACI,UAAU,UACV,UAAU,WACV,UAAU,WACV,UAAU,WACV,UAAU,cACV,UAAU,aACZ;AACE,WAAO;AAAA,EACX;AACA,SAAO;AACX;AAEO,SAAS,kBAAkB,UAA2C;AACzE,QAAM,MAAM,UAAU,QAAQ;AAC9B,SAAO,MAAM,gBAAgB,GAAG,IAAI;AACxC;","names":[]}
@@ -1,21 +1,18 @@
1
- import { FC, ReactNode } from 'react';
1
+ import { T as ThemeName } from '../theme-VMRlhqST.cjs';
2
2
 
3
3
  /**
4
4
  * Single source of truth for modality colors.
5
5
  *
6
6
  * Each modality (text/image/video/audio/realtime/embedding) gets one
7
7
  * page-theme hue, applied at the soft `-200/-900/-400` chip recipe.
8
- * Used in two places:
9
- * 1. The model-selection buttons in the API key creation flow.
10
- * 2. The static modality chips on the OAuth authorize screen.
11
- *
12
- * Interactive selection (model-picker) renders as `rounded-full` pills
13
- * aligned to the canonical Button. Static display (authorize summary)
14
- * renders as `rounded-lg` chips. Page-theme hues only — no rogue
15
- * indigo/rose.
8
+ * Used by apps to compose model-selection buttons and static modality chips.
9
+ * This module only owns modality color data; primitives own shape and behavior.
16
10
  */
11
+
17
12
  type Modality = "text" | "image" | "video" | "audio" | "realtime" | "embedding";
18
13
  type ModalityColorSet = {
14
+ /** Matching package theme for surfaces/chips that should inherit this hue. */
15
+ theme: ThemeName;
19
16
  /** Selected/filled state: `bg + text + border` classes. */
20
17
  filled: string;
21
18
  /** Hover hint shown on the unselected button (subtle tint). */
@@ -25,21 +22,4 @@ type ModalityColorSet = {
25
22
  };
26
23
  declare function getModalityColors(category: string): ModalityColorSet | null;
27
24
 
28
- type ModalityButtonProps = {
29
- /** Modality key or category string ("Text", "Images", etc). */
30
- category?: string;
31
- /** Filled (modality hue) when true, muted gray when false. */
32
- selected?: boolean;
33
- onClick?: () => void;
34
- disabled?: boolean;
35
- children: ReactNode;
36
- };
37
- /**
38
- * Rounded-full pill button colored by modality. Single source of truth
39
- * for every interactive modality affordance — model picker, design
40
- * showcase, etc. Shape and recipe live here; consumers only supply
41
- * content + state.
42
- */
43
- declare const ModalityButton: FC<ModalityButtonProps>;
44
-
45
- export { type Modality, ModalityButton, type ModalityButtonProps, type ModalityColorSet, getModalityColors };
25
+ export { type Modality, type ModalityColorSet, getModalityColors };
@@ -1,21 +1,18 @@
1
- import { FC, ReactNode } from 'react';
1
+ import { T as ThemeName } from '../theme-VMRlhqST.js';
2
2
 
3
3
  /**
4
4
  * Single source of truth for modality colors.
5
5
  *
6
6
  * Each modality (text/image/video/audio/realtime/embedding) gets one
7
7
  * page-theme hue, applied at the soft `-200/-900/-400` chip recipe.
8
- * Used in two places:
9
- * 1. The model-selection buttons in the API key creation flow.
10
- * 2. The static modality chips on the OAuth authorize screen.
11
- *
12
- * Interactive selection (model-picker) renders as `rounded-full` pills
13
- * aligned to the canonical Button. Static display (authorize summary)
14
- * renders as `rounded-lg` chips. Page-theme hues only — no rogue
15
- * indigo/rose.
8
+ * Used by apps to compose model-selection buttons and static modality chips.
9
+ * This module only owns modality color data; primitives own shape and behavior.
16
10
  */
11
+
17
12
  type Modality = "text" | "image" | "video" | "audio" | "realtime" | "embedding";
18
13
  type ModalityColorSet = {
14
+ /** Matching package theme for surfaces/chips that should inherit this hue. */
15
+ theme: ThemeName;
19
16
  /** Selected/filled state: `bg + text + border` classes. */
20
17
  filled: string;
21
18
  /** Hover hint shown on the unselected button (subtle tint). */
@@ -25,21 +22,4 @@ type ModalityColorSet = {
25
22
  };
26
23
  declare function getModalityColors(category: string): ModalityColorSet | null;
27
24
 
28
- type ModalityButtonProps = {
29
- /** Modality key or category string ("Text", "Images", etc). */
30
- category?: string;
31
- /** Filled (modality hue) when true, muted gray when false. */
32
- selected?: boolean;
33
- onClick?: () => void;
34
- disabled?: boolean;
35
- children: ReactNode;
36
- };
37
- /**
38
- * Rounded-full pill button colored by modality. Single source of truth
39
- * for every interactive modality affordance — model picker, design
40
- * showcase, etc. Shape and recipe live here; consumers only supply
41
- * content + state.
42
- */
43
- declare const ModalityButton: FC<ModalityButtonProps>;
44
-
45
- export { type Modality, ModalityButton, type ModalityButtonProps, type ModalityColorSet, getModalityColors };
25
+ export { type Modality, type ModalityColorSet, getModalityColors };
@@ -1,31 +1,37 @@
1
1
  // src/modules/modality/colors.ts
2
2
  var MODALITY_COLORS = {
3
3
  text: {
4
+ theme: "blue",
4
5
  filled: "polli:bg-blue-200 polli:text-blue-900",
5
6
  hover: "polli:hover:bg-blue-100 polli:hover:text-blue-900",
6
7
  text: "polli:text-blue-800"
7
8
  },
8
9
  image: {
10
+ theme: "pink",
9
11
  filled: "polli:bg-pink-200 polli:text-pink-900",
10
12
  hover: "polli:hover:bg-pink-100 polli:hover:text-pink-900",
11
13
  text: "polli:text-pink-800"
12
14
  },
13
15
  video: {
16
+ theme: "teal",
14
17
  filled: "polli:bg-teal-200 polli:text-teal-900",
15
18
  hover: "polli:hover:bg-teal-100 polli:hover:text-teal-900",
16
19
  text: "polli:text-teal-800"
17
20
  },
18
21
  audio: {
22
+ theme: "violet",
19
23
  filled: "polli:bg-violet-200 polli:text-violet-900",
20
24
  hover: "polli:hover:bg-violet-100 polli:hover:text-violet-900",
21
25
  text: "polli:text-violet-800"
22
26
  },
23
27
  realtime: {
28
+ theme: "green",
24
29
  filled: "polli:bg-green-200 polli:text-green-900",
25
30
  hover: "polli:hover:bg-green-100 polli:hover:text-green-900",
26
31
  text: "polli:text-green-800"
27
32
  },
28
33
  embedding: {
34
+ theme: "amber",
29
35
  filled: "polli:bg-amber-200 polli:text-amber-900",
30
36
  hover: "polli:hover:bg-amber-100 polli:hover:text-amber-900",
31
37
  text: "polli:text-amber-800"
@@ -44,44 +50,7 @@ function getModalityColors(category) {
44
50
  const key = normalize(category);
45
51
  return key ? MODALITY_COLORS[key] : null;
46
52
  }
47
-
48
- // src/lib/cn.ts
49
- import { clsx } from "clsx";
50
- import { extendTailwindMerge } from "tailwind-merge";
51
- var twMerge = extendTailwindMerge({ prefix: "polli" });
52
- function cn(...inputs) {
53
- return twMerge(clsx(...inputs));
54
- }
55
-
56
- // src/modules/modality/ModalityButton.tsx
57
- import { jsx } from "react/jsx-runtime";
58
- var ModalityButton = ({
59
- category,
60
- selected = true,
61
- onClick,
62
- disabled,
63
- children
64
- }) => {
65
- const colors = getModalityColors(category ?? "");
66
- return /* @__PURE__ */ jsx(
67
- "button",
68
- {
69
- type: "button",
70
- onClick,
71
- disabled,
72
- "aria-pressed": selected,
73
- className: cn(
74
- "polli:inline-flex polli:shrink-0 polli:items-center polli:gap-1 polli:rounded-full polli:px-3 polli:py-1 polli:text-left polli:text-sm polli:font-medium polli:leading-normal polli:transition-colors",
75
- selected ? colors?.filled ?? "polli:bg-gray-200 polli:text-gray-900" : "polli:bg-gray-100 polli:text-gray-600",
76
- !disabled && !selected && colors?.hover,
77
- disabled ? "polli:cursor-not-allowed polli:opacity-50" : "polli:cursor-pointer"
78
- ),
79
- children
80
- }
81
- );
82
- };
83
53
  export {
84
- ModalityButton,
85
54
  getModalityColors
86
55
  };
87
56
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/modules/modality/colors.ts","../../src/lib/cn.ts","../../src/modules/modality/ModalityButton.tsx"],"sourcesContent":["/**\n * Single source of truth for modality colors.\n *\n * Each modality (text/image/video/audio/realtime/embedding) gets one\n * page-theme hue, applied at the soft `-200/-900/-400` chip recipe.\n * Used in two places:\n * 1. The model-selection buttons in the API key creation flow.\n * 2. The static modality chips on the OAuth authorize screen.\n *\n * Interactive selection (model-picker) renders as `rounded-full` pills\n * aligned to the canonical Button. Static display (authorize summary)\n * renders as `rounded-lg` chips. Page-theme hues only — no rogue\n * indigo/rose.\n */\nexport type Modality =\n | \"text\"\n | \"image\"\n | \"video\"\n | \"audio\"\n | \"realtime\"\n | \"embedding\";\n\nexport type ModalityColorSet = {\n /** Selected/filled state: `bg + text + border` classes. */\n filled: string;\n /** Hover hint shown on the unselected button (subtle tint). */\n hover: string;\n /** Heading text colour for the category label. */\n text: string;\n};\n\n// No borders — chips and buttons in this system are borderless.\nexport const MODALITY_COLORS: Record<Modality, ModalityColorSet> = {\n text: {\n filled: \"polli:bg-blue-200 polli:text-blue-900\",\n hover: \"polli:hover:bg-blue-100 polli:hover:text-blue-900\",\n text: \"polli:text-blue-800\",\n },\n image: {\n filled: \"polli:bg-pink-200 polli:text-pink-900\",\n hover: \"polli:hover:bg-pink-100 polli:hover:text-pink-900\",\n text: \"polli:text-pink-800\",\n },\n video: {\n filled: \"polli:bg-teal-200 polli:text-teal-900\",\n hover: \"polli:hover:bg-teal-100 polli:hover:text-teal-900\",\n text: \"polli:text-teal-800\",\n },\n audio: {\n filled: \"polli:bg-violet-200 polli:text-violet-900\",\n hover: \"polli:hover:bg-violet-100 polli:hover:text-violet-900\",\n text: \"polli:text-violet-800\",\n },\n realtime: {\n filled: \"polli:bg-green-200 polli:text-green-900\",\n hover: \"polli:hover:bg-green-100 polli:hover:text-green-900\",\n text: \"polli:text-green-800\",\n },\n embedding: {\n filled: \"polli:bg-amber-200 polli:text-amber-900\",\n hover: \"polli:hover:bg-amber-100 polli:hover:text-amber-900\",\n text: \"polli:text-amber-800\",\n },\n};\n\n/** Map any human-typed category string to the canonical `Modality` key. */\nfunction normalize(category: string): Modality | null {\n const lower = category.toLowerCase();\n if (lower === \"images\") return \"image\";\n if (lower === \"embeddings\") return \"embedding\";\n if (\n lower === \"text\" ||\n lower === \"image\" ||\n lower === \"video\" ||\n lower === \"audio\" ||\n lower === \"realtime\" ||\n lower === \"embedding\"\n ) {\n return lower;\n }\n return null;\n}\n\nexport function getModalityColors(category: string): ModalityColorSet | null {\n const key = normalize(category);\n return key ? MODALITY_COLORS[key] : null;\n}\n","import { clsx } from \"clsx\";\nimport { extendTailwindMerge } from \"tailwind-merge\";\n\nconst twMerge = extendTailwindMerge({ prefix: \"polli\" });\n\n/** Internal class merge for polli:-prefixed package primitive classes. */\nexport function cn(...inputs: (string | undefined | null | false)[]) {\n return twMerge(clsx(...inputs));\n}\n","import type { FC, ReactNode } from \"react\";\nimport { cn } from \"../../lib/cn.ts\";\nimport { getModalityColors } from \"./colors.ts\";\n\nexport type ModalityButtonProps = {\n /** Modality key or category string (\"Text\", \"Images\", etc). */\n category?: string;\n /** Filled (modality hue) when true, muted gray when false. */\n selected?: boolean;\n onClick?: () => void;\n disabled?: boolean;\n children: ReactNode;\n};\n\n/**\n * Rounded-full pill button colored by modality. Single source of truth\n * for every interactive modality affordance — model picker, design\n * showcase, etc. Shape and recipe live here; consumers only supply\n * content + state.\n */\nexport const ModalityButton: FC<ModalityButtonProps> = ({\n category,\n selected = true,\n onClick,\n disabled,\n children,\n}) => {\n const colors = getModalityColors(category ?? \"\");\n return (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n aria-pressed={selected}\n className={cn(\n \"polli:inline-flex polli:shrink-0 polli:items-center polli:gap-1 polli:rounded-full polli:px-3 polli:py-1 polli:text-left polli:text-sm polli:font-medium polli:leading-normal polli:transition-colors\",\n selected\n ? (colors?.filled ??\n \"polli:bg-gray-200 polli:text-gray-900\")\n : \"polli:bg-gray-100 polli:text-gray-600\",\n !disabled && !selected && colors?.hover,\n disabled\n ? \"polli:cursor-not-allowed polli:opacity-50\"\n : \"polli:cursor-pointer\",\n )}\n >\n {children}\n </button>\n );\n};\n"],"mappings":";AAgCO,IAAM,kBAAsD;AAAA,EAC/D,MAAM;AAAA,IACF,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,EACV;AAAA,EACA,OAAO;AAAA,IACH,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,EACV;AAAA,EACA,OAAO;AAAA,IACH,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,EACV;AAAA,EACA,OAAO;AAAA,IACH,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,EACV;AAAA,EACA,UAAU;AAAA,IACN,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,EACV;AAAA,EACA,WAAW;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,EACV;AACJ;AAGA,SAAS,UAAU,UAAmC;AAClD,QAAM,QAAQ,SAAS,YAAY;AACnC,MAAI,UAAU,SAAU,QAAO;AAC/B,MAAI,UAAU,aAAc,QAAO;AACnC,MACI,UAAU,UACV,UAAU,WACV,UAAU,WACV,UAAU,WACV,UAAU,cACV,UAAU,aACZ;AACE,WAAO;AAAA,EACX;AACA,SAAO;AACX;AAEO,SAAS,kBAAkB,UAA2C;AACzE,QAAM,MAAM,UAAU,QAAQ;AAC9B,SAAO,MAAM,gBAAgB,GAAG,IAAI;AACxC;;;ACtFA,SAAS,YAAY;AACrB,SAAS,2BAA2B;AAEpC,IAAM,UAAU,oBAAoB,EAAE,QAAQ,QAAQ,CAAC;AAGhD,SAAS,MAAM,QAA+C;AACjE,SAAO,QAAQ,KAAK,GAAG,MAAM,CAAC;AAClC;;;ACqBQ;AATD,IAAM,iBAA0C,CAAC;AAAA,EACpD;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AAAA,EACA;AACJ,MAAM;AACF,QAAM,SAAS,kBAAkB,YAAY,EAAE;AAC/C,SACI;AAAA,IAAC;AAAA;AAAA,MACG,MAAK;AAAA,MACL;AAAA,MACA;AAAA,MACA,gBAAc;AAAA,MACd,WAAW;AAAA,QACP;AAAA,QACA,WACO,QAAQ,UACL,0CACJ;AAAA,QACN,CAAC,YAAY,CAAC,YAAY,QAAQ;AAAA,QAClC,WACM,8CACA;AAAA,MACV;AAAA,MAEC;AAAA;AAAA,EACL;AAER;","names":[]}
1
+ {"version":3,"sources":["../../src/modules/modality/colors.ts"],"sourcesContent":["/**\n * Single source of truth for modality colors.\n *\n * Each modality (text/image/video/audio/realtime/embedding) gets one\n * page-theme hue, applied at the soft `-200/-900/-400` chip recipe.\n * Used by apps to compose model-selection buttons and static modality chips.\n * This module only owns modality color data; primitives own shape and behavior.\n */\nimport type { ThemeName } from \"../../theme.ts\";\n\nexport type Modality =\n | \"text\"\n | \"image\"\n | \"video\"\n | \"audio\"\n | \"realtime\"\n | \"embedding\";\n\nexport type ModalityColorSet = {\n /** Matching package theme for surfaces/chips that should inherit this hue. */\n theme: ThemeName;\n /** Selected/filled state: `bg + text + border` classes. */\n filled: string;\n /** Hover hint shown on the unselected button (subtle tint). */\n hover: string;\n /** Heading text colour for the category label. */\n text: string;\n};\n\n// No borders — chips and buttons in this system are borderless.\nexport const MODALITY_COLORS: Record<Modality, ModalityColorSet> = {\n text: {\n theme: \"blue\",\n filled: \"polli:bg-blue-200 polli:text-blue-900\",\n hover: \"polli:hover:bg-blue-100 polli:hover:text-blue-900\",\n text: \"polli:text-blue-800\",\n },\n image: {\n theme: \"pink\",\n filled: \"polli:bg-pink-200 polli:text-pink-900\",\n hover: \"polli:hover:bg-pink-100 polli:hover:text-pink-900\",\n text: \"polli:text-pink-800\",\n },\n video: {\n theme: \"teal\",\n filled: \"polli:bg-teal-200 polli:text-teal-900\",\n hover: \"polli:hover:bg-teal-100 polli:hover:text-teal-900\",\n text: \"polli:text-teal-800\",\n },\n audio: {\n theme: \"violet\",\n filled: \"polli:bg-violet-200 polli:text-violet-900\",\n hover: \"polli:hover:bg-violet-100 polli:hover:text-violet-900\",\n text: \"polli:text-violet-800\",\n },\n realtime: {\n theme: \"green\",\n filled: \"polli:bg-green-200 polli:text-green-900\",\n hover: \"polli:hover:bg-green-100 polli:hover:text-green-900\",\n text: \"polli:text-green-800\",\n },\n embedding: {\n theme: \"amber\",\n filled: \"polli:bg-amber-200 polli:text-amber-900\",\n hover: \"polli:hover:bg-amber-100 polli:hover:text-amber-900\",\n text: \"polli:text-amber-800\",\n },\n};\n\n/** Map any human-typed category string to the canonical `Modality` key. */\nfunction normalize(category: string): Modality | null {\n const lower = category.toLowerCase();\n if (lower === \"images\") return \"image\";\n if (lower === \"embeddings\") return \"embedding\";\n if (\n lower === \"text\" ||\n lower === \"image\" ||\n lower === \"video\" ||\n lower === \"audio\" ||\n lower === \"realtime\" ||\n lower === \"embedding\"\n ) {\n return lower;\n }\n return null;\n}\n\nexport function getModalityColors(category: string): ModalityColorSet | null {\n const key = normalize(category);\n return key ? MODALITY_COLORS[key] : null;\n}\n"],"mappings":";AA8BO,IAAM,kBAAsD;AAAA,EAC/D,MAAM;AAAA,IACF,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,EACV;AAAA,EACA,OAAO;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,EACV;AAAA,EACA,OAAO;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,EACV;AAAA,EACA,OAAO;AAAA,IACH,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,EACV;AAAA,EACA,UAAU;AAAA,IACN,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,EACV;AAAA,EACA,WAAW;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,MAAM;AAAA,EACV;AACJ;AAGA,SAAS,UAAU,UAAmC;AAClD,QAAM,QAAQ,SAAS,YAAY;AACnC,MAAI,UAAU,SAAU,QAAO;AAC/B,MAAI,UAAU,aAAc,QAAO;AACnC,MACI,UAAU,UACV,UAAU,WACV,UAAU,WACV,UAAU,WACV,UAAU,cACV,UAAU,aACZ;AACE,WAAO;AAAA,EACX;AACA,SAAO;AACX;AAEO,SAAS,kBAAkB,UAA2C;AACzE,QAAM,MAAM,UAAU,QAAQ;AAC9B,SAAO,MAAM,gBAAgB,GAAG,IAAI;AACxC;","names":[]}
package/dist/styles.css CHANGED
@@ -1,2 +1,2 @@
1
1
  /*! tailwindcss v4.3.0 | 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-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking: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-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-duration:initial;--tw-ease:initial;--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}}}@layer theme{:root,:host{--polli-font-serif:ui-serif, Georgia, Cambria, "Times New Roman", Times, serif;--polli-font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--polli-color-red-400:oklch(70.4% .191 22.216);--polli-color-amber-100:oklch(96.2% .059 95.617);--polli-color-amber-200:oklch(92.4% .12 95.746);--polli-color-amber-800:oklch(47.3% .137 46.201);--polli-color-amber-900:oklch(41.4% .112 45.904);--polli-color-green-100:oklch(96.2% .044 156.743);--polli-color-green-200:oklch(92.5% .084 155.995);--polli-color-green-700:oklch(52.7% .154 150.069);--polli-color-green-800:oklch(44.8% .119 151.328);--polli-color-green-900:oklch(39.3% .095 152.535);--polli-color-green-950:oklch(26.6% .065 152.934);--polli-color-emerald-100:oklch(95% .052 163.051);--polli-color-teal-100:oklch(95.3% .051 180.801);--polli-color-teal-200:oklch(91% .096 180.426);--polli-color-teal-800:oklch(43.7% .078 188.216);--polli-color-teal-900:oklch(38.6% .063 188.416);--polli-color-blue-100:oklch(93.2% .032 255.585);--polli-color-blue-200:oklch(88.2% .059 254.128);--polli-color-blue-800:oklch(42.4% .199 265.638);--polli-color-blue-900:oklch(37.9% .146 265.522);--polli-color-violet-100:oklch(94.3% .029 294.588);--polli-color-violet-200:oklch(89.4% .057 293.283);--polli-color-violet-800:oklch(43.2% .232 292.759);--polli-color-violet-900:oklch(38% .189 293.745);--polli-color-pink-100:oklch(94.8% .028 342.258);--polli-color-pink-200:oklch(89.9% .061 343.231);--polli-color-pink-800:oklch(45.9% .187 3.815);--polli-color-pink-900:oklch(40.8% .153 2.432);--polli-color-gray-100:oklch(96.7% .003 264.542);--polli-color-gray-200:oklch(92.8% .006 264.531);--polli-color-gray-300:oklch(87.2% .01 258.338);--polli-color-gray-400:oklch(70.7% .022 261.325);--polli-color-gray-600:oklch(44.6% .03 256.802);--polli-color-gray-700:oklch(37.3% .034 259.733);--polli-color-gray-900:oklch(21% .034 264.665);--polli-color-gray-950:oklch(13% .028 261.692);--polli-color-white:#fff;--polli-spacing:.25rem;--polli-container-md:28rem;--polli-container-xl:36rem;--polli-container-2xl:42rem;--polli-container-3xl:48rem;--polli-text-xs:.75rem;--polli-text-xs--line-height:calc(1 / .75);--polli-text-sm:.875rem;--polli-text-sm--line-height:calc(1.25 / .875);--polli-text-base:16px;--polli-text-base--line-height:calc(1.5 / 1);--polli-text-xl:1.25rem;--polli-text-xl--line-height:calc(1.75 / 1.25);--polli-text-2xl:1.5rem;--polli-text-2xl--line-height:calc(2 / 1.5);--polli-text-3xl:1.875rem;--polli-text-3xl--line-height:calc(2.25 / 1.875);--polli-text-4xl:2.25rem;--polli-text-4xl--line-height:calc(2.5 / 2.25);--polli-font-weight-medium:500;--polli-font-weight-semibold:600;--polli-font-weight-bold:700;--polli-font-weight-black:900;--polli-tracking-tight:-.025em;--polli-tracking-wide:.025em;--polli-leading-tight:1.25;--polli-leading-normal:1.5;--polli-radius-md:.375rem;--polli-radius-lg:.5rem;--polli-radius-xl:.75rem;--polli-radius-2xl:1rem;--polli-ease-out:cubic-bezier(0, 0, .2, 1);--polli-default-transition-duration:.15s;--polli-default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--polli-font-heading:"LCT Mogi", ui-sans-serif, sans-serif;--polli-font-subheading:"Fraunces", ui-serif, serif;--polli-font-body:"Uncut Sans", ui-sans-serif, sans-serif;--polli-font-pixel:"Pixelify Sans", ui-monospace, monospace;--polli-text-micro:10px;--polli-color-surface-white:var(--polli-color-surface-white)}}@layer base,components;@layer utilities{.polli\:pointer-events-none{pointer-events:none}.polli\:invisible{visibility:hidden}.polli\:visible{visibility:visible}.polli\:sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.polli\:absolute{position:absolute}.polli\:fixed{position:fixed}.polli\:relative{position:relative}.polli\:sticky{position:sticky}.polli\:inset-0{inset:calc(var(--polli-spacing) * 0)}.polli\:-top-8{top:calc(var(--polli-spacing) * -8)}.polli\:top-0{top:calc(var(--polli-spacing) * 0)}.polli\:left-1\/2{left:50%}.polli\:z-20{z-index:20}.polli\:z-50{z-index:50}.polli\:z-\[100\]{z-index:100}.polli\:z-\[110\]{z-index:110}.polli\:col-span-full{grid-column:1/-1}.polli\:mx-auto{margin-inline:auto}.polli\:my-auto{margin-block:auto}.polli\:mt-1{margin-top:calc(var(--polli-spacing) * 1)}.polli\:mt-1\.5{margin-top:calc(var(--polli-spacing) * 1.5)}.polli\:mt-2{margin-top:calc(var(--polli-spacing) * 2)}.polli\:mt-5{margin-top:calc(var(--polli-spacing) * 5)}.polli\:mb-1{margin-bottom:calc(var(--polli-spacing) * 1)}.polli\:mb-2{margin-bottom:calc(var(--polli-spacing) * 2)}.polli\:mb-3{margin-bottom:calc(var(--polli-spacing) * 3)}.polli\:ml-1{margin-left:calc(var(--polli-spacing) * 1)}.polli\:box-border{box-sizing:border-box}.polli\:block{display:block}.polli\:contents{display:contents}.polli\:flex{display:flex}.polli\:grid{display:grid}.polli\:inline-block{display:inline-block}.polli\:inline-flex{display:inline-flex}.polli\:aspect-square{aspect-ratio:1}.polli\:h-2{height:calc(var(--polli-spacing) * 2)}.polli\:h-3{height:calc(var(--polli-spacing) * 3)}.polli\:h-3\.5{height:calc(var(--polli-spacing) * 3.5)}.polli\:h-4{height:calc(var(--polli-spacing) * 4)}.polli\:h-5{height:calc(var(--polli-spacing) * 5)}.polli\:h-6{height:calc(var(--polli-spacing) * 6)}.polli\:h-7{height:calc(var(--polli-spacing) * 7)}.polli\:h-8{height:calc(var(--polli-spacing) * 8)}.polli\:h-9{height:calc(var(--polli-spacing) * 9)}.polli\:h-10{height:calc(var(--polli-spacing) * 10)}.polli\:h-12{height:calc(var(--polli-spacing) * 12)}.polli\:h-44{height:calc(var(--polli-spacing) * 44)}.polli\:h-dvh{height:100dvh}.polli\:max-h-64{max-height:calc(var(--polli-spacing) * 64)}.polli\:min-h-0{min-height:calc(var(--polli-spacing) * 0)}.polli\:min-h-8{min-height:calc(var(--polli-spacing) * 8)}.polli\:w-2{width:calc(var(--polli-spacing) * 2)}.polli\:w-3{width:calc(var(--polli-spacing) * 3)}.polli\:w-3\.5{width:calc(var(--polli-spacing) * 3.5)}.polli\:w-4{width:calc(var(--polli-spacing) * 4)}.polli\:w-5{width:calc(var(--polli-spacing) * 5)}.polli\:w-6{width:calc(var(--polli-spacing) * 6)}.polli\:w-8{width:calc(var(--polli-spacing) * 8)}.polli\:w-9{width:calc(var(--polli-spacing) * 9)}.polli\:w-10{width:calc(var(--polli-spacing) * 10)}.polli\:w-12{width:calc(var(--polli-spacing) * 12)}.polli\:w-36{width:calc(var(--polli-spacing) * 36)}.polli\:w-44{width:calc(var(--polli-spacing) * 44)}.polli\:w-56{width:calc(var(--polli-spacing) * 56)}.polli\:w-80{width:calc(var(--polli-spacing) * 80)}.polli\:w-\[304px\]{width:304px}.polli\:w-full{width:100%}.polli\:w-max{width:max-content}.polli\:max-w-2xl{max-width:var(--polli-container-2xl)}.polli\:max-w-3xl{max-width:var(--polli-container-3xl)}.polli\:max-w-\[1220px\]{max-width:1220px}.polli\:max-w-full{max-width:100%}.polli\:max-w-md{max-width:var(--polli-container-md)}.polli\:max-w-xl{max-width:var(--polli-container-xl)}.polli\:min-w-0{min-width:calc(var(--polli-spacing) * 0)}.polli\:min-w-\[140px\]{min-width:140px}.polli\:min-w-\[150px\]{min-width:150px}.polli\:min-w-\[320px\]{min-width:320px}.polli\:flex-1{flex:1}.polli\:flex-shrink-0,.polli\:shrink-0{flex-shrink:0}.polli\:-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.polli\:translate-x-1{--tw-translate-x:calc(var(--polli-spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.polli\:translate-x-6{--tw-translate-x:calc(var(--polli-spacing) * 6);translate:var(--tw-translate-x) var(--tw-translate-y)}.polli\:rotate-180{rotate:180deg}.polli\:cursor-help{cursor:help}.polli\:cursor-not-allowed{cursor:not-allowed}.polli\:cursor-pointer{cursor:pointer}.polli\:scroll-mt-24{scroll-margin-top:calc(var(--polli-spacing) * 24)}.polli\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.polli\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.polli\:grid-cols-\[repeat\(auto-fit\,minmax\(150px\,1fr\)\)\]{grid-template-columns:repeat(auto-fit,minmax(150px,1fr))}.polli\:grid-cols-\[repeat\(auto-fit\,minmax\(210px\,1fr\)\)\]{grid-template-columns:repeat(auto-fit,minmax(210px,1fr))}.polli\:grid-cols-\[repeat\(auto-fit\,minmax\(220px\,1fr\)\)\]{grid-template-columns:repeat(auto-fit,minmax(220px,1fr))}.polli\:grid-cols-\[repeat\(auto-fit\,minmax\(230px\,1fr\)\)\]{grid-template-columns:repeat(auto-fit,minmax(230px,1fr))}.polli\:grid-cols-\[repeat\(auto-fit\,minmax\(260px\,1fr\)\)\]{grid-template-columns:repeat(auto-fit,minmax(260px,1fr))}.polli\:flex-col{flex-direction:column}.polli\:flex-wrap{flex-wrap:wrap}.polli\:items-baseline{align-items:baseline}.polli\:items-center{align-items:center}.polli\:items-start{align-items:flex-start}.polli\:justify-between{justify-content:space-between}.polli\:justify-center{justify-content:center}.polli\:justify-end{justify-content:flex-end}.polli\:justify-start{justify-content:flex-start}.polli\:gap-1{gap:calc(var(--polli-spacing) * 1)}.polli\:gap-1\.5{gap:calc(var(--polli-spacing) * 1.5)}.polli\:gap-2{gap:calc(var(--polli-spacing) * 2)}.polli\:gap-3{gap:calc(var(--polli-spacing) * 3)}.polli\:gap-4{gap:calc(var(--polli-spacing) * 4)}.polli\:gap-5{gap:calc(var(--polli-spacing) * 5)}.polli\:gap-8{gap:calc(var(--polli-spacing) * 8)}.polli\:gap-10{gap:calc(var(--polli-spacing) * 10)}.polli\:gap-x-4{column-gap:calc(var(--polli-spacing) * 4)}.polli\:gap-y-1{row-gap:calc(var(--polli-spacing) * 1)}.polli\:self-center{align-self:center}.polli\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.polli\:overflow-auto{overflow:auto}.polli\:overflow-hidden{overflow:hidden}.polli\:overflow-x-auto{overflow-x:auto}.polli\:overflow-x-hidden{overflow-x:hidden}.polli\:overflow-y-auto{overflow-y:auto}.polli\:overflow-y-hidden{overflow-y:hidden}.polli\:rounded{border-radius:.25rem}.polli\:rounded-2xl{border-radius:var(--polli-radius-2xl)}.polli\:rounded-full{border-radius:3.40282e38px}.polli\:rounded-lg{border-radius:var(--polli-radius-lg)}.polli\:rounded-md{border-radius:var(--polli-radius-md)}.polli\:rounded-xl{border-radius:var(--polli-radius-xl)}.polli\:rounded-t-lg{border-top-left-radius:var(--polli-radius-lg);border-top-right-radius:var(--polli-radius-lg)}.polli\:border{border-style:var(--tw-border-style);border-width:1px}.polli\:border-2{border-style:var(--tw-border-style);border-width:2px}.polli\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.polli\:border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.polli\:border-gray-300{border-color:var(--polli-color-gray-300)}.polli\:border-gray-400\/70{border-color:var(--polli-color-gray-400)}@supports (color:color-mix(in lab, red, red)){.polli\:border-gray-400\/70{border-color:color-mix(in oklab, var(--polli-color-gray-400) 70%, transparent)}}.polli\:border-green-950\/10{border-color:var(--polli-color-green-950)}@supports (color:color-mix(in lab, red, red)){.polli\:border-green-950\/10{border-color:color-mix(in oklab, var(--polli-color-green-950) 10%, transparent)}}.polli\:border-intent-danger-border{border-color:var(--polli-color-danger-border)}.polli\:border-red-400{border-color:var(--polli-color-red-400)}.polli\:border-theme-border{border-color:var(--polli-color-border)}.polli\:bg-\[oklch\(0\.88_0\.12_25\)\]{background-color:oklch(88% .12 25)}.polli\:bg-\[oklch\(0\.88_0\.12_158\)\]{background-color:oklch(88% .12 158)}.polli\:bg-\[oklch\(0\.93_0\.06_300\)\]{background-color:oklch(93% .06 300)}.polli\:bg-\[oklch\(0\.935_0\.06_158\)\]{background-color:oklch(93.5% .06 158)}.polli\:bg-amber-200{background-color:var(--polli-color-amber-200)}.polli\:bg-blue-200{background-color:var(--polli-color-blue-200)}.polli\:bg-current{background-color:currentColor}.polli\:bg-emerald-100{background-color:var(--polli-color-emerald-100)}.polli\:bg-gray-100,.polli\:bg-gray-100\/80{background-color:var(--polli-color-gray-100)}@supports (color:color-mix(in lab, red, red)){.polli\:bg-gray-100\/80{background-color:color-mix(in oklab, var(--polli-color-gray-100) 80%, transparent)}}.polli\:bg-gray-200{background-color:var(--polli-color-gray-200)}.polli\:bg-gray-950\/50{background-color:var(--polli-color-gray-950)}@supports (color:color-mix(in lab, red, red)){.polli\:bg-gray-950\/50{background-color:color-mix(in oklab, var(--polli-color-gray-950) 50%, transparent)}}.polli\:bg-green-100{background-color:var(--polli-color-green-100)}.polli\:bg-green-200{background-color:var(--polli-color-green-200)}.polli\:bg-intent-danger-bg-light{background-color:var(--polli-color-danger-bg-light)}.polli\:bg-pink-200{background-color:var(--polli-color-pink-200)}.polli\:bg-surface-white{background-color:var(--polli-color-surface-white)}.polli\:bg-teal-200{background-color:var(--polli-color-teal-200)}.polli\:bg-theme-bg-active{background-color:var(--polli-color-bg-active)}.polli\:bg-theme-bg-hover{background-color:var(--polli-color-bg-hover)}.polli\:bg-theme-bg-pale{background-color:var(--polli-color-bg-pale)}.polli\:bg-theme-bg-subtle{background-color:var(--polli-color-bg-subtle)}.polli\:bg-theme-border{background-color:var(--polli-color-border)}.polli\:bg-theme-text-base{background-color:var(--polli-color-text-base)}.polli\:bg-theme-text-muted{background-color:var(--polli-color-text-muted)}.polli\:bg-theme-text-soft{background-color:var(--polli-color-text-soft)}.polli\:bg-theme-text-strong{background-color:var(--polli-color-text-strong)}.polli\:bg-violet-200{background-color:var(--polli-color-violet-200)}.polli\:bg-white{background-color:var(--polli-color-white)}.polli\:p-2{padding:calc(var(--polli-spacing) * 2)}.polli\:p-3{padding:calc(var(--polli-spacing) * 3)}.polli\:p-4{padding:calc(var(--polli-spacing) * 4)}.polli\:p-6{padding:calc(var(--polli-spacing) * 6)}.polli\:px-2{padding-inline:calc(var(--polli-spacing) * 2)}.polli\:px-2\.5{padding-inline:calc(var(--polli-spacing) * 2.5)}.polli\:px-3{padding-inline:calc(var(--polli-spacing) * 3)}.polli\:px-4{padding-inline:calc(var(--polli-spacing) * 4)}.polli\:px-5{padding-inline:calc(var(--polli-spacing) * 5)}.polli\:px-6{padding-inline:calc(var(--polli-spacing) * 6)}.polli\:px-8{padding-inline:calc(var(--polli-spacing) * 8)}.polli\:py-0\.5{padding-block:calc(var(--polli-spacing) * .5)}.polli\:py-1{padding-block:calc(var(--polli-spacing) * 1)}.polli\:py-1\.5{padding-block:calc(var(--polli-spacing) * 1.5)}.polli\:py-2{padding-block:calc(var(--polli-spacing) * 2)}.polli\:py-3{padding-block:calc(var(--polli-spacing) * 3)}.polli\:py-4{padding-block:calc(var(--polli-spacing) * 4)}.polli\:pt-0\.5{padding-top:calc(var(--polli-spacing) * .5)}.polli\:pt-1{padding-top:calc(var(--polli-spacing) * 1)}.polli\:pt-1\.5{padding-top:calc(var(--polli-spacing) * 1.5)}.polli\:pt-2{padding-top:calc(var(--polli-spacing) * 2)}.polli\:pt-3{padding-top:calc(var(--polli-spacing) * 3)}.polli\:pt-6{padding-top:calc(var(--polli-spacing) * 6)}.polli\:pt-8{padding-top:calc(var(--polli-spacing) * 8)}.polli\:pb-1{padding-bottom:calc(var(--polli-spacing) * 1)}.polli\:pb-2{padding-bottom:calc(var(--polli-spacing) * 2)}.polli\:pb-3{padding-bottom:calc(var(--polli-spacing) * 3)}.polli\:pb-8{padding-bottom:calc(var(--polli-spacing) * 8)}.polli\:pb-10{padding-bottom:calc(var(--polli-spacing) * 10)}.polli\:text-center{text-align:center}.polli\:text-left{text-align:left}.polli\:font-body{font-family:Uncut Sans,ui-sans-serif,sans-serif}.polli\:font-heading{font-family:LCT Mogi,ui-sans-serif,sans-serif}.polli\:font-mono{font-family:var(--polli-font-mono)}.polli\:font-pixel{font-family:Pixelify Sans,ui-monospace,monospace}.polli\:font-serif{font-family:var(--polli-font-serif)}.polli\:font-subheading{font-family:Fraunces,ui-serif,serif}.polli\:text-2xl{font-size:var(--polli-text-2xl);line-height:var(--tw-leading,var(--polli-text-2xl--line-height))}.polli\:text-3xl{font-size:var(--polli-text-3xl);line-height:var(--tw-leading,var(--polli-text-3xl--line-height))}.polli\:text-4xl{font-size:var(--polli-text-4xl);line-height:var(--tw-leading,var(--polli-text-4xl--line-height))}.polli\:text-base{font-size:16px;line-height:var(--tw-leading,var(--polli-text-base--line-height))}.polli\:text-sm{font-size:var(--polli-text-sm);line-height:var(--tw-leading,var(--polli-text-sm--line-height))}.polli\:text-xl{font-size:var(--polli-text-xl);line-height:var(--tw-leading,var(--polli-text-xl--line-height))}.polli\:text-xs{font-size:var(--polli-text-xs);line-height:var(--tw-leading,var(--polli-text-xs--line-height))}.polli\:text-micro{font-size:10px}.polli\:leading-6{--tw-leading:calc(var(--polli-spacing) * 6);line-height:calc(var(--polli-spacing) * 6)}.polli\:leading-none{--tw-leading:1;line-height:1}.polli\:leading-normal{--tw-leading:var(--polli-leading-normal);line-height:var(--polli-leading-normal)}.polli\:leading-tight{--tw-leading:var(--polli-leading-tight);line-height:var(--polli-leading-tight)}.polli\:font-black{--tw-font-weight:var(--polli-font-weight-black);font-weight:var(--polli-font-weight-black)}.polli\:font-bold{--tw-font-weight:var(--polli-font-weight-bold);font-weight:var(--polli-font-weight-bold)}.polli\:font-medium{--tw-font-weight:var(--polli-font-weight-medium);font-weight:var(--polli-font-weight-medium)}.polli\:font-semibold{--tw-font-weight:var(--polli-font-weight-semibold);font-weight:var(--polli-font-weight-semibold)}.polli\:tracking-tight{--tw-tracking:var(--polli-tracking-tight);letter-spacing:var(--polli-tracking-tight)}.polli\:tracking-wide{--tw-tracking:var(--polli-tracking-wide);letter-spacing:var(--polli-tracking-wide)}.polli\:\[overflow-wrap\:anywhere\]{overflow-wrap:anywhere}.polli\:break-words{overflow-wrap:break-word}.polli\:whitespace-nowrap{white-space:nowrap}.polli\:whitespace-pre-line{white-space:pre-line}.polli\:text-\[oklch\(0\.42_0\.18_300\)\]{color:oklch(42% .18 300)}.polli\:text-\[oklch\(0\.46_0\.13_158\)\]{color:oklch(46% .13 158)}.polli\:text-amber-800,.polli\:text-amber-800\/70{color:var(--polli-color-amber-800)}@supports (color:color-mix(in lab, red, red)){.polli\:text-amber-800\/70{color:color-mix(in oklab, var(--polli-color-amber-800) 70%, transparent)}}.polli\:text-amber-900{color:var(--polli-color-amber-900)}.polli\:text-blue-800{color:var(--polli-color-blue-800)}.polli\:text-blue-900{color:var(--polli-color-blue-900)}.polli\:text-gray-300{color:var(--polli-color-gray-300)}.polli\:text-gray-400{color:var(--polli-color-gray-400)}.polli\:text-gray-600{color:var(--polli-color-gray-600)}.polli\:text-gray-700{color:var(--polli-color-gray-700)}.polli\:text-gray-900{color:var(--polli-color-gray-900)}.polli\:text-green-700{color:var(--polli-color-green-700)}.polli\:text-green-800{color:var(--polli-color-green-800)}.polli\:text-green-900{color:var(--polli-color-green-900)}.polli\:text-intent-danger-text{color:var(--polli-color-danger-text)}.polli\:text-pink-800{color:var(--polli-color-pink-800)}.polli\:text-pink-900{color:var(--polli-color-pink-900)}.polli\:text-teal-800{color:var(--polli-color-teal-800)}.polli\:text-teal-900{color:var(--polli-color-teal-900)}.polli\:text-theme-text-base{color:var(--polli-color-text-base)}.polli\:text-theme-text-muted{color:var(--polli-color-text-muted)}.polli\:text-theme-text-soft,.polli\:text-theme-text-soft\/60{color:var(--polli-color-text-soft)}@supports (color:color-mix(in lab, red, red)){.polli\:text-theme-text-soft\/60{color:color-mix(in oklab, var(--polli-color-text-soft) 60%, transparent)}}.polli\:text-theme-text-strong{color:var(--polli-color-text-strong)}.polli\:text-violet-800{color:var(--polli-color-violet-800)}.polli\:text-violet-900{color:var(--polli-color-violet-900)}.polli\:capitalize{text-transform:capitalize}.polli\:uppercase{text-transform:uppercase}.polli\: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,)}.polli\:underline{text-decoration-line:underline}.polli\:decoration-dotted{text-decoration-style:dotted}.polli\:placeholder-green-950::placeholder{color:var(--polli-color-green-950)}.polli\:opacity-0{opacity:0}.polli\:opacity-30{opacity:.3}.polli\:opacity-50{opacity:.5}.polli\:opacity-60{opacity:.6}.polli\:opacity-100{opacity:1}.polli\: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)}.polli\: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)}.polli\:ring-1{--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)}.polli\:ring-theme-border{--tw-ring-color:var(--polli-color-border)}.polli\:backdrop-blur{--tw-backdrop-blur:blur(8px);-webkit-backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,) var(--tw-backdrop-brightness,) var(--tw-backdrop-contrast,) var(--tw-backdrop-grayscale,) var(--tw-backdrop-hue-rotate,) var(--tw-backdrop-invert,) var(--tw-backdrop-opacity,) var(--tw-backdrop-saturate,) var(--tw-backdrop-sepia,)}.polli\: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(--polli-default-transition-timing-function));transition-duration:var(--tw-duration,var(--polli-default-transition-duration))}.polli\:transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--polli-default-transition-timing-function));transition-duration:var(--tw-duration,var(--polli-default-transition-duration))}.polli\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--polli-default-transition-timing-function));transition-duration:var(--tw-duration,var(--polli-default-transition-duration))}.polli\:transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--polli-default-transition-timing-function));transition-duration:var(--tw-duration,var(--polli-default-transition-duration))}.polli\:transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--polli-default-transition-timing-function));transition-duration:var(--tw-duration,var(--polli-default-transition-duration))}.polli\:duration-150{--tw-duration:.15s;transition-duration:.15s}.polli\:duration-200{--tw-duration:.2s;transition-duration:.2s}.polli\:ease-out{--tw-ease:var(--polli-ease-out);transition-timing-function:var(--polli-ease-out)}.polli\:select-none{-webkit-user-select:none;user-select:none}@media (hover:hover){.polli\:group-hover\:opacity-100:is(:where(.polli\:group):hover *){opacity:1}}.polli\:last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.polli\:last\:pb-0:last-child{padding-bottom:calc(var(--polli-spacing) * 0)}@media (hover:hover){.polli\:hover\:bg-\[oklch\(0\.88_0\.075_25\)\]:hover{background-color:oklch(88% .075 25)}.polli\:hover\:bg-amber-100:hover{background-color:var(--polli-color-amber-100)}.polli\:hover\:bg-blue-100:hover{background-color:var(--polli-color-blue-100)}.polli\:hover\:bg-green-100:hover{background-color:var(--polli-color-green-100)}.polli\:hover\:bg-pink-100:hover{background-color:var(--polli-color-pink-100)}.polli\:hover\:bg-teal-100:hover{background-color:var(--polli-color-teal-100)}.polli\:hover\:bg-theme-bg-active:hover{background-color:var(--polli-color-bg-active)}.polli\:hover\:bg-theme-bg-hover:hover{background-color:var(--polli-color-bg-hover)}.polli\:hover\:bg-theme-bg-pale:hover{background-color:var(--polli-color-bg-pale)}.polli\:hover\:bg-theme-bg-subtle:hover{background-color:var(--polli-color-bg-subtle)}.polli\:hover\:bg-transparent:hover{background-color:#0000}.polli\:hover\:bg-violet-100:hover{background-color:var(--polli-color-violet-100)}.polli\:hover\:text-amber-900:hover{color:var(--polli-color-amber-900)}.polli\:hover\:text-blue-900:hover{color:var(--polli-color-blue-900)}.polli\:hover\:text-green-900:hover{color:var(--polli-color-green-900)}.polli\:hover\:text-pink-900:hover{color:var(--polli-color-pink-900)}.polli\:hover\:text-teal-900:hover{color:var(--polli-color-teal-900)}.polli\:hover\:text-theme-text-strong:hover{color:var(--polli-color-text-strong)}.polli\:hover\:text-violet-900:hover{color:var(--polli-color-violet-900)}.polli\:hover\:brightness-105:hover{--tw-brightness:brightness(105%);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,)}.polli\:hover\:filter:hover{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,)}}.polli\:focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.polli\:disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.polli\:disabled\:opacity-50:disabled{opacity:.5}.polli\:disabled\:opacity-60:disabled{opacity:.6}@media (min-width:48rem){.polli\:md\:w-auto{width:auto}.polli\:md\:flex-row{flex-direction:row}.polli\:md\:items-start{align-items:flex-start}.polli\:md\:justify-between{justify-content:space-between}}}@font-face{font-family:LCT Mogi;src:url(./fonts/lct-mogi-a.woff2)format("woff2");font-weight:400;font-style:normal;font-display:swap}@font-face{font-family:Fraunces;src:url(./fonts/fraunces-soft-bold.woff2)format("woff2");font-weight:500;font-style:normal;font-display:swap}@font-face{font-family:Uncut Sans;src:url(./fonts/uncut-sans-variable.woff2)format("woff2-variations");font-weight:300 700;font-style:normal;font-display:swap}:root{--polli-font-heading:"LCT Mogi", ui-sans-serif, sans-serif;--polli-font-subheading:"Fraunces", ui-serif, serif;--polli-font-body:"Uncut Sans", ui-sans-serif, sans-serif;--polli-font-pixel:"Pixelify Sans", ui-monospace, monospace;--polli-text-micro:10px;--polli-text-base:16px;--polli-color-surface-white:oklch(100% 0 0/.8)}[data-theme=amber]{--polli-color-text-base:oklch(41.4% .112 45.904);--polli-color-text-strong:oklch(27.9% .077 45.635);--polli-color-text-soft:oklch(55.5% .163 48.998);--polli-color-text-muted:oklch(62% .045 45.904);--polli-color-border:oklch(87.9% .169 91.605);--polli-color-bg-subtle:oklch(98.7% .022 95.277/.7);--polli-color-bg-active:oklch(92.4% .12 95.746);--polli-color-bg-hover:oklch(87.9% .169 91.605);--polli-color-bg-pale:oklch(96.2% .059 95.617);--polli-color-scrollbar-thumb:oklch(82.8% .189 84.429/.7)}[data-theme=blue]{--polli-color-text-base:oklch(37.9% .146 265.522);--polli-color-text-strong:oklch(28.2% .091 267.935);--polli-color-text-soft:oklch(48.8% .243 264.376);--polli-color-text-muted:oklch(62% .058 265.522);--polli-color-border:oklch(80.9% .105 251.813);--polli-color-bg-subtle:oklch(97% .014 254.604/.7);--polli-color-bg-active:oklch(88.2% .059 254.128);--polli-color-bg-hover:oklch(80.9% .105 251.813);--polli-color-bg-pale:oklch(93.2% .032 255.585);--polli-color-scrollbar-thumb:oklch(70.7% .165 254.624/.7)}[data-theme=pink]{--polli-color-text-base:oklch(40.8% .153 2.432);--polli-color-text-strong:oklch(28.4% .109 3.907);--polli-color-text-soft:oklch(52.5% .223 3.958);--polli-color-text-muted:oklch(62% .061 2.432);--polli-color-border:oklch(82.3% .12 346.018);--polli-color-bg-subtle:oklch(97.1% .014 343.198/.7);--polli-color-bg-active:oklch(89.9% .061 343.231);--polli-color-bg-hover:oklch(82.3% .12 346.018);--polli-color-bg-pale:oklch(94.8% .028 342.258);--polli-color-scrollbar-thumb:oklch(71.8% .202 349.761/.7)}[data-theme=teal]{--polli-color-text-base:oklch(38.6% .063 188.416);--polli-color-text-strong:oklch(27.7% .046 192.524);--polli-color-text-soft:oklch(51.1% .096 186.391);--polli-color-text-muted:oklch(62% .025 188.416);--polli-color-border:oklch(85.5% .138 181.071);--polli-color-bg-subtle:oklch(98.4% .014 180.72/.7);--polli-color-bg-active:oklch(91% .096 180.426);--polli-color-bg-hover:oklch(85.5% .138 181.071);--polli-color-bg-pale:oklch(95.3% .051 180.801);--polli-color-scrollbar-thumb:oklch(70.4% .14 182.503/.7)}[data-theme=violet]{--polli-color-text-base:oklch(38% .189 293.745);--polli-color-text-strong:oklch(28.3% .141 291.089);--polli-color-text-soft:oklch(49.1% .27 292.581);--polli-color-text-muted:oklch(62% .076 293.745);--polli-color-border:oklch(81.1% .111 293.571);--polli-color-bg-subtle:oklch(96.9% .016 293.756/.7);--polli-color-bg-active:oklch(89.4% .057 293.283);--polli-color-bg-hover:oklch(81.1% .111 293.571);--polli-color-bg-pale:oklch(94.3% .029 294.588);--polli-color-scrollbar-thumb:oklch(70.2% .183 293.541/.7)}:root,[data-theme=green]{--polli-color-text-base:oklch(39.3% .095 152.535);--polli-color-text-strong:oklch(26.6% .065 152.934);--polli-color-text-soft:oklch(52.7% .154 150.069);--polli-color-text-muted:oklch(62% .038 152.535);--polli-color-border:oklch(87.1% .15 154.449);--polli-color-bg-subtle:oklch(98.2% .018 155.826/.7);--polli-color-bg-active:oklch(92.5% .084 155.995);--polli-color-bg-hover:oklch(87.1% .15 154.449);--polli-color-bg-pale:oklch(96.2% .044 156.743);--polli-color-scrollbar-thumb:oklch(79.2% .209 151.711/.7)}:root{--polli-color-danger-bg-light:oklch(93.5% .045 25);--polli-color-danger-text:oklch(48% .18 25);--polli-color-danger-border:oklch(78% .115 25)}.polli-scrollbar-subtle{scrollbar-width:thin;scrollbar-color:transparent transparent}.polli-scrollbar-subtle::-webkit-scrollbar{width:12px;height:12px}.polli-scrollbar-subtle::-webkit-scrollbar-track{background:0 0}.polli-scrollbar-subtle::-webkit-scrollbar-thumb{background-color:#0000;background-clip:content-box;border:3px solid #0000;border-radius:9999px;transition:background-color .16s}.polli-scrollbar-subtle[data-scrollbar-active=true]{scrollbar-color:var(--polli-color-scrollbar-thumb) transparent}.polli-scrollbar-subtle[data-scrollbar-active=true]::-webkit-scrollbar-thumb{background-color:var(--polli-color-scrollbar-thumb)}.polli-input-number-clean::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.polli-input-number-clean::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.polli-input-number-clean{-moz-appearance:textfield}.polli-slider{--polli-slider-thumb-shadow-fallback:var(--polli-color-text-strong)}@supports (color:color-mix(in lab, red, red)){.polli-slider{--polli-slider-thumb-shadow-fallback:color-mix(in oklab, var(--polli-color-text-strong) 35%, transparent)}}.polli-slider{--polli-slider-progress-value:var(--polli-slider-progress,0%);--polli-slider-fill-value:var(--polli-slider-fill,var(--polli-color-bg-active));--polli-slider-track-value:var(--polli-slider-track,var(--polli-color-bg-pale));--polli-slider-thumb-border-value:var(--polli-slider-thumb-border,var(--polli-color-text-strong));--polli-slider-thumb-shadow-value:var(--polli-slider-thumb-shadow,var(--polli-slider-thumb-shadow-fallback));cursor:grab;appearance:none;background:linear-gradient(to right, var(--polli-slider-fill-value) 0%, var(--polli-slider-fill-value) var(--polli-slider-progress-value), var(--polli-slider-track-value) var(--polli-slider-progress-value), var(--polli-slider-track-value) 100%);border-radius:9999px;outline:none;width:100%;height:.5rem;transition:opacity .15s,filter .15s}.polli-slider:active{cursor:grabbing}.polli-slider:disabled{cursor:not-allowed;opacity:.6}.polli-slider:focus-visible{box-shadow:0 0 0 2px var(--polli-slider-fill-value), 0 0 0 4px var(--polli-color-surface-white)}.polli-slider::-webkit-slider-runnable-track{background:0 0;border-radius:9999px;height:.5rem}.polli-slider::-moz-range-track{background:0 0;border-radius:9999px;height:.5rem}.polli-slider::-webkit-slider-thumb{appearance:none;border:3px solid var(--polli-slider-thumb-border-value);width:22px;height:22px;box-shadow:0 2px 6px var(--polli-slider-thumb-shadow-value);background:#fff;border-radius:9999px;margin-top:-7px;transition:transform .15s}.polli-slider::-moz-range-thumb{border:3px solid var(--polli-slider-thumb-border-value);width:22px;height:22px;box-shadow:0 2px 6px var(--polli-slider-thumb-shadow-value);background:#fff;border-radius:9999px;transition:transform .15s}.polli-slider:hover::-webkit-slider-thumb{transform:scale(1.1)}.polli-slider:active::-webkit-slider-thumb{transform:scale(1.05)}@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-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-tracking{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-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@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}
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-divide-y-reverse:0;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-tracking: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-duration:initial;--tw-ease:initial;--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}}}@layer theme{:root,:host{--polli-font-mono:ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;--polli-color-red-400:oklch(70.4% .191 22.216);--polli-color-amber-100:oklch(96.2% .059 95.617);--polli-color-amber-200:oklch(92.4% .12 95.746);--polli-color-amber-800:oklch(47.3% .137 46.201);--polli-color-amber-900:oklch(41.4% .112 45.904);--polli-color-green-100:oklch(96.2% .044 156.743);--polli-color-green-200:oklch(92.5% .084 155.995);--polli-color-green-700:oklch(52.7% .154 150.069);--polli-color-green-800:oklch(44.8% .119 151.328);--polli-color-green-900:oklch(39.3% .095 152.535);--polli-color-green-950:oklch(26.6% .065 152.934);--polli-color-teal-100:oklch(95.3% .051 180.801);--polli-color-teal-200:oklch(91% .096 180.426);--polli-color-teal-800:oklch(43.7% .078 188.216);--polli-color-teal-900:oklch(38.6% .063 188.416);--polli-color-blue-100:oklch(93.2% .032 255.585);--polli-color-blue-200:oklch(88.2% .059 254.128);--polli-color-blue-800:oklch(42.4% .199 265.638);--polli-color-blue-900:oklch(37.9% .146 265.522);--polli-color-violet-100:oklch(94.3% .029 294.588);--polli-color-violet-200:oklch(89.4% .057 293.283);--polli-color-violet-800:oklch(43.2% .232 292.759);--polli-color-violet-900:oklch(38% .189 293.745);--polli-color-pink-100:oklch(94.8% .028 342.258);--polli-color-pink-200:oklch(89.9% .061 343.231);--polli-color-pink-800:oklch(45.9% .187 3.815);--polli-color-pink-900:oklch(40.8% .153 2.432);--polli-color-gray-100:oklch(96.7% .003 264.542);--polli-color-gray-200:oklch(92.8% .006 264.531);--polli-color-gray-300:oklch(87.2% .01 258.338);--polli-color-gray-400:oklch(70.7% .022 261.325);--polli-color-gray-700:oklch(37.3% .034 259.733);--polli-color-gray-900:oklch(21% .034 264.665);--polli-color-gray-950:oklch(13% .028 261.692);--polli-color-white:#fff;--polli-spacing:.25rem;--polli-container-md:28rem;--polli-container-xl:36rem;--polli-container-2xl:42rem;--polli-text-xs:.75rem;--polli-text-xs--line-height:calc(1 / .75);--polli-text-sm:.875rem;--polli-text-sm--line-height:calc(1.25 / .875);--polli-text-base:16px;--polli-text-base--line-height:calc(1.5 / 1);--polli-text-xl:1.25rem;--polli-text-xl--line-height:calc(1.75 / 1.25);--polli-text-2xl:1.5rem;--polli-text-2xl--line-height:calc(2 / 1.5);--polli-font-weight-medium:500;--polli-font-weight-semibold:600;--polli-font-weight-bold:700;--polli-tracking-tight:-.025em;--polli-tracking-wide:.025em;--polli-leading-tight:1.25;--polli-leading-normal:1.5;--polli-radius-md:.375rem;--polli-radius-lg:.5rem;--polli-radius-xl:.75rem;--polli-radius-2xl:1rem;--polli-ease-out:cubic-bezier(0, 0, .2, 1);--polli-default-transition-duration:.15s;--polli-default-transition-timing-function:cubic-bezier(.4, 0, .2, 1);--polli-font-heading:"LCT Mogi", ui-sans-serif, sans-serif;--polli-font-subheading:"Fraunces", ui-serif, serif;--polli-font-body:"Uncut Sans", ui-sans-serif, sans-serif;--polli-font-pixel:"Pixelify Sans", ui-monospace, monospace;--polli-text-micro:10px;--polli-color-surface-white:var(--polli-color-surface-white)}}@layer base,components;@layer utilities{.polli\:pointer-events-none{pointer-events:none}.polli\:invisible{visibility:hidden}.polli\:visible{visibility:visible}.polli\:sr-only{clip-path:inset(50%);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.polli\:absolute{position:absolute}.polli\:fixed{position:fixed}.polli\:relative{position:relative}.polli\:inset-0{inset:calc(var(--polli-spacing) * 0)}.polli\:-top-8{top:calc(var(--polli-spacing) * -8)}.polli\:left-1\/2{left:50%}.polli\:z-50{z-index:50}.polli\:z-\[100\]{z-index:100}.polli\:z-\[110\]{z-index:110}.polli\:my-auto{margin-block:auto}.polli\:mt-1{margin-top:calc(var(--polli-spacing) * 1)}.polli\:mt-1\.5{margin-top:calc(var(--polli-spacing) * 1.5)}.polli\:mt-2{margin-top:calc(var(--polli-spacing) * 2)}.polli\:mb-1{margin-bottom:calc(var(--polli-spacing) * 1)}.polli\:mb-2{margin-bottom:calc(var(--polli-spacing) * 2)}.polli\:mb-3{margin-bottom:calc(var(--polli-spacing) * 3)}.polli\:ml-1{margin-left:calc(var(--polli-spacing) * 1)}.polli\:box-border{box-sizing:border-box}.polli\:block{display:block}.polli\:contents{display:contents}.polli\:flex{display:flex}.polli\:grid{display:grid}.polli\:inline-block{display:inline-block}.polli\:inline-flex{display:inline-flex}.polli\:aspect-square{aspect-ratio:1}.polli\:h-2{height:calc(var(--polli-spacing) * 2)}.polli\:h-3{height:calc(var(--polli-spacing) * 3)}.polli\:h-3\.5{height:calc(var(--polli-spacing) * 3.5)}.polli\:h-4{height:calc(var(--polli-spacing) * 4)}.polli\:h-5{height:calc(var(--polli-spacing) * 5)}.polli\:h-6{height:calc(var(--polli-spacing) * 6)}.polli\:h-7{height:calc(var(--polli-spacing) * 7)}.polli\:h-8{height:calc(var(--polli-spacing) * 8)}.polli\:h-9{height:calc(var(--polli-spacing) * 9)}.polli\:h-12{height:calc(var(--polli-spacing) * 12)}.polli\:h-dvh{height:100dvh}.polli\:max-h-64{max-height:calc(var(--polli-spacing) * 64)}.polli\:min-h-8{min-height:calc(var(--polli-spacing) * 8)}.polli\:w-2{width:calc(var(--polli-spacing) * 2)}.polli\:w-3{width:calc(var(--polli-spacing) * 3)}.polli\:w-3\.5{width:calc(var(--polli-spacing) * 3.5)}.polli\:w-4{width:calc(var(--polli-spacing) * 4)}.polli\:w-5{width:calc(var(--polli-spacing) * 5)}.polli\:w-6{width:calc(var(--polli-spacing) * 6)}.polli\:w-8{width:calc(var(--polli-spacing) * 8)}.polli\:w-9{width:calc(var(--polli-spacing) * 9)}.polli\:w-12{width:calc(var(--polli-spacing) * 12)}.polli\:w-\[304px\]{width:304px}.polli\:w-full{width:100%}.polli\:w-max{width:max-content}.polli\:max-w-2xl{max-width:var(--polli-container-2xl)}.polli\:max-w-full{max-width:100%}.polli\:max-w-md{max-width:var(--polli-container-md)}.polli\:max-w-xl{max-width:var(--polli-container-xl)}.polli\:min-w-0{min-width:calc(var(--polli-spacing) * 0)}.polli\:min-w-\[140px\]{min-width:140px}.polli\:min-w-\[150px\]{min-width:150px}.polli\:min-w-\[320px\]{min-width:320px}.polli\:flex-1{flex:1}.polli\:flex-shrink-0,.polli\:shrink-0{flex-shrink:0}.polli\:border-collapse{border-collapse:collapse}.polli\:-translate-x-1\/2{--tw-translate-x:calc(calc(1 / 2 * 100%) * -1);translate:var(--tw-translate-x) var(--tw-translate-y)}.polli\:translate-x-1{--tw-translate-x:calc(var(--polli-spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.polli\:translate-x-6{--tw-translate-x:calc(var(--polli-spacing) * 6);translate:var(--tw-translate-x) var(--tw-translate-y)}.polli\:rotate-180{rotate:180deg}.polli\:cursor-help{cursor:help}.polli\:cursor-not-allowed{cursor:not-allowed}.polli\:cursor-pointer{cursor:pointer}.polli\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.polli\:grid-cols-7{grid-template-columns:repeat(7,minmax(0,1fr))}.polli\:flex-nowrap{flex-wrap:nowrap}.polli\:flex-wrap{flex-wrap:wrap}.polli\:items-center{align-items:center}.polli\:items-start{align-items:flex-start}.polli\:justify-between{justify-content:space-between}.polli\:justify-center{justify-content:center}.polli\:justify-end{justify-content:flex-end}.polli\:justify-start{justify-content:flex-start}.polli\:gap-1{gap:calc(var(--polli-spacing) * 1)}.polli\:gap-1\.5{gap:calc(var(--polli-spacing) * 1.5)}.polli\:gap-2{gap:calc(var(--polli-spacing) * 2)}.polli\:gap-3{gap:calc(var(--polli-spacing) * 3)}:where(.polli\:divide-y>:not(:last-child)){--tw-divide-y-reverse:0;border-bottom-style:var(--tw-border-style);border-top-style:var(--tw-border-style);border-top-width:calc(1px * var(--tw-divide-y-reverse));border-bottom-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)))}:where(.polli\:divide-theme-border\/65>:not(:last-child)){border-color:var(--polli-color-border)}@supports (color:color-mix(in lab, red, red)){:where(.polli\:divide-theme-border\/65>:not(:last-child)){border-color:color-mix(in oklab, var(--polli-color-border) 65%, transparent)}}.polli\:self-center{align-self:center}.polli\:truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.polli\:overflow-hidden{overflow:hidden}.polli\:overflow-x-auto{overflow-x:auto}.polli\:overflow-x-hidden{overflow-x:hidden}.polli\:overflow-y-auto{overflow-y:auto}.polli\:overflow-y-hidden{overflow-y:hidden}.polli\:rounded{border-radius:.25rem}.polli\:rounded-2xl{border-radius:var(--polli-radius-2xl)}.polli\:rounded-full{border-radius:3.40282e38px}.polli\:rounded-lg{border-radius:var(--polli-radius-lg)}.polli\:rounded-md{border-radius:var(--polli-radius-md)}.polli\:rounded-xl{border-radius:var(--polli-radius-xl)}.polli\:rounded-t-lg{border-top-left-radius:var(--polli-radius-lg);border-top-right-radius:var(--polli-radius-lg)}.polli\:border{border-style:var(--tw-border-style);border-width:1px}.polli\:border-2{border-style:var(--tw-border-style);border-width:2px}.polli\:border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.polli\:border-gray-300{border-color:var(--polli-color-gray-300)}.polli\:border-gray-400\/70{border-color:var(--polli-color-gray-400)}@supports (color:color-mix(in lab, red, red)){.polli\:border-gray-400\/70{border-color:color-mix(in oklab, var(--polli-color-gray-400) 70%, transparent)}}.polli\:border-intent-danger-border{border-color:var(--polli-color-danger-border)}.polli\:border-intent-success-border{border-color:var(--polli-color-success-border)}.polli\:border-intent-warning-border{border-color:var(--polli-color-warning-border)}.polli\:border-red-400{border-color:var(--polli-color-red-400)}.polli\:border-theme-border{border-color:var(--polli-color-border)}.polli\:bg-\[oklch\(0\.88_0\.12_25\)\]{background-color:oklch(88% .12 25)}.polli\:bg-\[oklch\(0\.88_0\.12_158\)\]{background-color:oklch(88% .12 158)}.polli\:bg-\[oklch\(0\.93_0\.06_300\)\]{background-color:oklch(93% .06 300)}.polli\:bg-\[oklch\(0\.935_0\.06_158\)\]{background-color:oklch(93.5% .06 158)}.polli\:bg-amber-200{background-color:var(--polli-color-amber-200)}.polli\:bg-blue-200{background-color:var(--polli-color-blue-200)}.polli\:bg-current{background-color:currentColor}.polli\:bg-gray-100\/80{background-color:var(--polli-color-gray-100)}@supports (color:color-mix(in lab, red, red)){.polli\:bg-gray-100\/80{background-color:color-mix(in oklab, var(--polli-color-gray-100) 80%, transparent)}}.polli\:bg-gray-200{background-color:var(--polli-color-gray-200)}.polli\:bg-gray-950\/50{background-color:var(--polli-color-gray-950)}@supports (color:color-mix(in lab, red, red)){.polli\:bg-gray-950\/50{background-color:color-mix(in oklab, var(--polli-color-gray-950) 50%, transparent)}}.polli\:bg-green-200{background-color:var(--polli-color-green-200)}.polli\:bg-intent-danger-bg-light,.polli\:bg-intent-danger-bg-light\/65{background-color:var(--polli-color-danger-bg-light)}@supports (color:color-mix(in lab, red, red)){.polli\:bg-intent-danger-bg-light\/65{background-color:color-mix(in oklab, var(--polli-color-danger-bg-light) 65%, transparent)}}.polli\:bg-intent-success-bg-light,.polli\:bg-intent-success-bg-light\/55{background-color:var(--polli-color-success-bg-light)}@supports (color:color-mix(in lab, red, red)){.polli\:bg-intent-success-bg-light\/55{background-color:color-mix(in oklab, var(--polli-color-success-bg-light) 55%, transparent)}}.polli\:bg-intent-warning-bg-light,.polli\:bg-intent-warning-bg-light\/65{background-color:var(--polli-color-warning-bg-light)}@supports (color:color-mix(in lab, red, red)){.polli\:bg-intent-warning-bg-light\/65{background-color:color-mix(in oklab, var(--polli-color-warning-bg-light) 65%, transparent)}}.polli\:bg-pink-200{background-color:var(--polli-color-pink-200)}.polli\:bg-surface-white{background-color:var(--polli-color-surface-white)}.polli\:bg-teal-200{background-color:var(--polli-color-teal-200)}.polli\:bg-theme-bg-active{background-color:var(--polli-color-bg-active)}.polli\:bg-theme-bg-pale{background-color:var(--polli-color-bg-pale)}.polli\:bg-theme-bg-subtle{background-color:var(--polli-color-bg-subtle)}.polli\:bg-transparent{background-color:#0000}.polli\:bg-violet-200{background-color:var(--polli-color-violet-200)}.polli\:bg-white{background-color:var(--polli-color-white)}.polli\:p-0{padding:calc(var(--polli-spacing) * 0)}.polli\:p-3{padding:calc(var(--polli-spacing) * 3)}.polli\:p-4{padding:calc(var(--polli-spacing) * 4)}.polli\:p-6{padding:calc(var(--polli-spacing) * 6)}.polli\:px-2{padding-inline:calc(var(--polli-spacing) * 2)}.polli\:px-2\.5{padding-inline:calc(var(--polli-spacing) * 2.5)}.polli\:px-3{padding-inline:calc(var(--polli-spacing) * 3)}.polli\:px-4{padding-inline:calc(var(--polli-spacing) * 4)}.polli\:px-6{padding-inline:calc(var(--polli-spacing) * 6)}.polli\:px-8{padding-inline:calc(var(--polli-spacing) * 8)}.polli\:py-0\.5{padding-block:calc(var(--polli-spacing) * .5)}.polli\:py-1{padding-block:calc(var(--polli-spacing) * 1)}.polli\:py-1\.5{padding-block:calc(var(--polli-spacing) * 1.5)}.polli\:py-2{padding-block:calc(var(--polli-spacing) * 2)}.polli\:py-3{padding-block:calc(var(--polli-spacing) * 3)}.polli\:pt-0\.5{padding-top:calc(var(--polli-spacing) * .5)}.polli\:pt-1\.5{padding-top:calc(var(--polli-spacing) * 1.5)}.polli\:pt-2{padding-top:calc(var(--polli-spacing) * 2)}.polli\:pt-3{padding-top:calc(var(--polli-spacing) * 3)}.polli\:pt-6{padding-top:calc(var(--polli-spacing) * 6)}.polli\:pb-1{padding-bottom:calc(var(--polli-spacing) * 1)}.polli\:pb-2{padding-bottom:calc(var(--polli-spacing) * 2)}.polli\:pb-3{padding-bottom:calc(var(--polli-spacing) * 3)}.polli\:pb-8{padding-bottom:calc(var(--polli-spacing) * 8)}.polli\:text-center{text-align:center}.polli\:text-left{text-align:left}.polli\:text-right{text-align:right}.polli\:align-middle{vertical-align:middle}.polli\:font-body{font-family:Uncut Sans,ui-sans-serif,sans-serif}.polli\:font-mono{font-family:var(--polli-font-mono)}.polli\:font-subheading{font-family:Fraunces,ui-serif,serif}.polli\:text-2xl{font-size:var(--polli-text-2xl);line-height:var(--tw-leading,var(--polli-text-2xl--line-height))}.polli\:text-base{font-size:16px;line-height:var(--tw-leading,var(--polli-text-base--line-height))}.polli\:text-sm{font-size:var(--polli-text-sm);line-height:var(--tw-leading,var(--polli-text-sm--line-height))}.polli\:text-xl{font-size:var(--polli-text-xl);line-height:var(--tw-leading,var(--polli-text-xl--line-height))}.polli\:text-xs{font-size:var(--polli-text-xs);line-height:var(--tw-leading,var(--polli-text-xs--line-height))}.polli\:text-micro{font-size:10px}.polli\:leading-none{--tw-leading:1;line-height:1}.polli\:leading-normal{--tw-leading:var(--polli-leading-normal);line-height:var(--polli-leading-normal)}.polli\:leading-tight{--tw-leading:var(--polli-leading-tight);line-height:var(--polli-leading-tight)}.polli\:font-bold{--tw-font-weight:var(--polli-font-weight-bold);font-weight:var(--polli-font-weight-bold)}.polli\:font-medium{--tw-font-weight:var(--polli-font-weight-medium);font-weight:var(--polli-font-weight-medium)}.polli\:font-semibold{--tw-font-weight:var(--polli-font-weight-semibold);font-weight:var(--polli-font-weight-semibold)}.polli\:tracking-tight{--tw-tracking:var(--polli-tracking-tight);letter-spacing:var(--polli-tracking-tight)}.polli\:tracking-wide{--tw-tracking:var(--polli-tracking-wide);letter-spacing:var(--polli-tracking-wide)}.polli\:break-words{overflow-wrap:break-word}.polli\:whitespace-nowrap{white-space:nowrap}.polli\:whitespace-pre-line{white-space:pre-line}.polli\:text-\[oklch\(0\.42_0\.18_300\)\]{color:oklch(42% .18 300)}.polli\:text-\[oklch\(0\.46_0\.13_158\)\]{color:oklch(46% .13 158)}.polli\:text-amber-800{color:var(--polli-color-amber-800)}.polli\:text-amber-900{color:var(--polli-color-amber-900)}.polli\:text-blue-800{color:var(--polli-color-blue-800)}.polli\:text-blue-900{color:var(--polli-color-blue-900)}.polli\:text-gray-300{color:var(--polli-color-gray-300)}.polli\:text-gray-400{color:var(--polli-color-gray-400)}.polli\:text-gray-700{color:var(--polli-color-gray-700)}.polli\:text-gray-900{color:var(--polli-color-gray-900)}.polli\:text-green-700{color:var(--polli-color-green-700)}.polli\:text-green-800{color:var(--polli-color-green-800)}.polli\:text-green-900{color:var(--polli-color-green-900)}.polli\:text-inherit{color:inherit}.polli\:text-intent-danger-text{color:var(--polli-color-danger-text)}.polli\:text-intent-success-text{color:var(--polli-color-success-text)}.polli\:text-intent-warning-text{color:var(--polli-color-warning-text)}.polli\:text-pink-800{color:var(--polli-color-pink-800)}.polli\:text-pink-900{color:var(--polli-color-pink-900)}.polli\:text-teal-800{color:var(--polli-color-teal-800)}.polli\:text-teal-900{color:var(--polli-color-teal-900)}.polli\:text-theme-text-base{color:var(--polli-color-text-base)}.polli\:text-theme-text-muted{color:var(--polli-color-text-muted)}.polli\:text-theme-text-soft,.polli\:text-theme-text-soft\/60{color:var(--polli-color-text-soft)}@supports (color:color-mix(in lab, red, red)){.polli\:text-theme-text-soft\/60{color:color-mix(in oklab, var(--polli-color-text-soft) 60%, transparent)}}.polli\:text-theme-text-strong{color:var(--polli-color-text-strong)}.polli\:text-violet-800{color:var(--polli-color-violet-800)}.polli\:text-violet-900{color:var(--polli-color-violet-900)}.polli\:uppercase{text-transform:uppercase}.polli\: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,)}.polli\:placeholder-green-950::placeholder{color:var(--polli-color-green-950)}.polli\:opacity-0{opacity:0}.polli\:opacity-30{opacity:.3}.polli\:opacity-50{opacity:.5}.polli\:opacity-60{opacity:.6}.polli\:opacity-100{opacity:1}.polli\: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)}.polli\: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)}.polli\:ring-1{--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)}.polli\:ring-theme-border{--tw-ring-color:var(--polli-color-border)}.polli\: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(--polli-default-transition-timing-function));transition-duration:var(--tw-duration,var(--polli-default-transition-duration))}.polli\:transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--polli-default-transition-timing-function));transition-duration:var(--tw-duration,var(--polli-default-transition-duration))}.polli\:transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease,var(--polli-default-transition-timing-function));transition-duration:var(--tw-duration,var(--polli-default-transition-duration))}.polli\:transition-opacity{transition-property:opacity;transition-timing-function:var(--tw-ease,var(--polli-default-transition-timing-function));transition-duration:var(--tw-duration,var(--polli-default-transition-duration))}.polli\:transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease,var(--polli-default-transition-timing-function));transition-duration:var(--tw-duration,var(--polli-default-transition-duration))}.polli\:duration-150{--tw-duration:.15s;transition-duration:.15s}.polli\:duration-200{--tw-duration:.2s;transition-duration:.2s}.polli\:ease-out{--tw-ease:var(--polli-ease-out);transition-timing-function:var(--polli-ease-out)}.polli\:select-none{-webkit-user-select:none;user-select:none}@media (hover:hover){.polli\:group-hover\:opacity-100:is(:where(.polli\:group):hover *){opacity:1}.polli\:hover\:bg-\[oklch\(0\.88_0\.075_25\)\]:hover{background-color:oklch(88% .075 25)}.polli\:hover\:bg-amber-100:hover{background-color:var(--polli-color-amber-100)}.polli\:hover\:bg-blue-100:hover{background-color:var(--polli-color-blue-100)}.polli\:hover\:bg-green-100:hover{background-color:var(--polli-color-green-100)}.polli\:hover\:bg-pink-100:hover{background-color:var(--polli-color-pink-100)}.polli\:hover\:bg-teal-100:hover{background-color:var(--polli-color-teal-100)}.polli\:hover\:bg-theme-bg-active:hover{background-color:var(--polli-color-bg-active)}.polli\:hover\:bg-theme-bg-hover:hover{background-color:var(--polli-color-bg-hover)}.polli\:hover\:bg-theme-bg-pale:hover{background-color:var(--polli-color-bg-pale)}.polli\:hover\:bg-theme-bg-subtle:hover{background-color:var(--polli-color-bg-subtle)}.polli\:hover\:bg-transparent:hover{background-color:#0000}.polli\:hover\:bg-violet-100:hover{background-color:var(--polli-color-violet-100)}.polli\:hover\:text-amber-900:hover{color:var(--polli-color-amber-900)}.polli\:hover\:text-blue-900:hover{color:var(--polli-color-blue-900)}.polli\:hover\:text-green-900:hover{color:var(--polli-color-green-900)}.polli\:hover\:text-pink-900:hover{color:var(--polli-color-pink-900)}.polli\:hover\:text-teal-900:hover{color:var(--polli-color-teal-900)}.polli\:hover\:text-theme-text-strong:hover{color:var(--polli-color-text-strong)}.polli\:hover\:text-violet-900:hover{color:var(--polli-color-violet-900)}.polli\:hover\:brightness-105:hover{--tw-brightness:brightness(105%);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,)}.polli\:hover\:filter:hover{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,)}}.polli\:focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.polli\:disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.polli\:disabled\:opacity-50:disabled{opacity:.5}.polli\:disabled\:opacity-60:disabled{opacity:.6}}@font-face{font-family:LCT Mogi;src:url(./fonts/lct-mogi-a.woff2)format("woff2");font-weight:400;font-style:normal;font-display:swap}@font-face{font-family:Fraunces;src:url(./fonts/fraunces-soft-bold.woff2)format("woff2");font-weight:500;font-style:normal;font-display:swap}@font-face{font-family:Uncut Sans;src:url(./fonts/uncut-sans-variable.woff2)format("woff2-variations");font-weight:300 700;font-style:normal;font-display:swap}:root{--polli-font-heading:"LCT Mogi", ui-sans-serif, sans-serif;--polli-font-subheading:"Fraunces", ui-serif, serif;--polli-font-body:"Uncut Sans", ui-sans-serif, sans-serif;--polli-font-pixel:"Pixelify Sans", ui-monospace, monospace;--polli-text-micro:10px;--polli-text-base:16px;--polli-color-surface-white:oklch(100% 0 0/.8)}[data-theme=amber]{--polli-color-text-base:oklch(41.4% .112 45.904);--polli-color-text-strong:oklch(27.9% .077 45.635);--polli-color-text-soft:oklch(55.5% .163 48.998);--polli-color-text-muted:oklch(62% .045 45.904);--polli-color-border:oklch(87.9% .169 91.605);--polli-color-bg-subtle:oklch(98.7% .022 95.277/.7);--polli-color-bg-active:oklch(92.4% .12 95.746);--polli-color-bg-hover:oklch(87.9% .169 91.605);--polli-color-bg-pale:oklch(96.2% .059 95.617);--polli-color-scrollbar-thumb:oklch(82.8% .189 84.429/.7)}[data-theme=blue]{--polli-color-text-base:oklch(37.9% .146 265.522);--polli-color-text-strong:oklch(28.2% .091 267.935);--polli-color-text-soft:oklch(48.8% .243 264.376);--polli-color-text-muted:oklch(62% .058 265.522);--polli-color-border:oklch(80.9% .105 251.813);--polli-color-bg-subtle:oklch(97% .014 254.604/.7);--polli-color-bg-active:oklch(88.2% .059 254.128);--polli-color-bg-hover:oklch(80.9% .105 251.813);--polli-color-bg-pale:oklch(93.2% .032 255.585);--polli-color-scrollbar-thumb:oklch(70.7% .165 254.624/.7)}[data-theme=pink]{--polli-color-text-base:oklch(40.8% .153 2.432);--polli-color-text-strong:oklch(28.4% .109 3.907);--polli-color-text-soft:oklch(52.5% .223 3.958);--polli-color-text-muted:oklch(62% .061 2.432);--polli-color-border:oklch(82.3% .12 346.018);--polli-color-bg-subtle:oklch(97.1% .014 343.198/.7);--polli-color-bg-active:oklch(89.9% .061 343.231);--polli-color-bg-hover:oklch(82.3% .12 346.018);--polli-color-bg-pale:oklch(94.8% .028 342.258);--polli-color-scrollbar-thumb:oklch(71.8% .202 349.761/.7)}[data-theme=teal]{--polli-color-text-base:oklch(38.6% .063 188.416);--polli-color-text-strong:oklch(27.7% .046 192.524);--polli-color-text-soft:oklch(51.1% .096 186.391);--polli-color-text-muted:oklch(62% .025 188.416);--polli-color-border:oklch(85.5% .138 181.071);--polli-color-bg-subtle:oklch(98.4% .014 180.72/.7);--polli-color-bg-active:oklch(91% .096 180.426);--polli-color-bg-hover:oklch(85.5% .138 181.071);--polli-color-bg-pale:oklch(95.3% .051 180.801);--polli-color-scrollbar-thumb:oklch(70.4% .14 182.503/.7)}[data-theme=violet]{--polli-color-text-base:oklch(38% .189 293.745);--polli-color-text-strong:oklch(28.3% .141 291.089);--polli-color-text-soft:oklch(49.1% .27 292.581);--polli-color-text-muted:oklch(62% .076 293.745);--polli-color-border:oklch(81.1% .111 293.571);--polli-color-bg-subtle:oklch(96.9% .016 293.756/.7);--polli-color-bg-active:oklch(89.4% .057 293.283);--polli-color-bg-hover:oklch(81.1% .111 293.571);--polli-color-bg-pale:oklch(94.3% .029 294.588);--polli-color-scrollbar-thumb:oklch(70.2% .183 293.541/.7)}:root,[data-theme=green]{--polli-color-text-base:oklch(39.3% .095 152.535);--polli-color-text-strong:oklch(26.6% .065 152.934);--polli-color-text-soft:oklch(52.7% .154 150.069);--polli-color-text-muted:oklch(62% .038 152.535);--polli-color-border:oklch(87.1% .15 154.449);--polli-color-bg-subtle:oklch(98.2% .018 155.826/.7);--polli-color-bg-active:oklch(92.5% .084 155.995);--polli-color-bg-hover:oklch(87.1% .15 154.449);--polli-color-bg-pale:oklch(96.2% .044 156.743);--polli-color-scrollbar-thumb:oklch(79.2% .209 151.711/.7)}:root{--polli-color-danger-bg-light:oklch(93.5% .045 25);--polli-color-danger-text:oklch(48% .18 25);--polli-color-danger-border:oklch(78% .115 25);--polli-color-success-bg-light:oklch(94% .055 150);--polli-color-success-text:oklch(38% .12 150);--polli-color-success-border:oklch(78% .13 150);--polli-color-warning-bg-light:oklch(94% .06 75);--polli-color-warning-text:oklch(45% .13 65);--polli-color-warning-border:oklch(82% .14 75)}.polli-scrollbar-subtle{scrollbar-width:thin;scrollbar-color:transparent transparent}.polli-scrollbar-subtle::-webkit-scrollbar{width:12px;height:12px}.polli-scrollbar-subtle::-webkit-scrollbar-track{background:0 0}.polli-scrollbar-subtle::-webkit-scrollbar-thumb{background-color:#0000;background-clip:content-box;border:3px solid #0000;border-radius:9999px;transition:background-color .16s}.polli-scrollbar-subtle[data-scrollbar-active=true]{scrollbar-color:var(--polli-color-scrollbar-thumb) transparent}.polli-scrollbar-subtle[data-scrollbar-active=true]::-webkit-scrollbar-thumb{background-color:var(--polli-color-scrollbar-thumb)}.polli-input-number-clean::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}.polli-input-number-clean::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.polli-input-number-clean{-moz-appearance:textfield}.polli-slider{--polli-slider-thumb-shadow-fallback:var(--polli-color-text-strong)}@supports (color:color-mix(in lab, red, red)){.polli-slider{--polli-slider-thumb-shadow-fallback:color-mix(in oklab, var(--polli-color-text-strong) 35%, transparent)}}.polli-slider{--polli-slider-progress-value:var(--polli-slider-progress,0%);--polli-slider-fill-value:var(--polli-slider-fill,var(--polli-color-bg-active));--polli-slider-track-value:var(--polli-slider-track,var(--polli-color-bg-pale));--polli-slider-thumb-border-value:var(--polli-slider-thumb-border,var(--polli-color-text-strong));--polli-slider-thumb-shadow-value:var(--polli-slider-thumb-shadow,var(--polli-slider-thumb-shadow-fallback));cursor:grab;appearance:none;background:linear-gradient(to right, var(--polli-slider-fill-value) 0%, var(--polli-slider-fill-value) var(--polli-slider-progress-value), var(--polli-slider-track-value) var(--polli-slider-progress-value), var(--polli-slider-track-value) 100%);border-radius:9999px;outline:none;width:100%;height:.5rem;transition:opacity .15s,filter .15s}.polli-slider:active{cursor:grabbing}.polli-slider:disabled{cursor:not-allowed;opacity:.6}.polli-slider:focus-visible{box-shadow:0 0 0 2px var(--polli-slider-fill-value), 0 0 0 4px var(--polli-color-surface-white)}.polli-slider::-webkit-slider-runnable-track{background:0 0;border-radius:9999px;height:.5rem}.polli-slider::-moz-range-track{background:0 0;border-radius:9999px;height:.5rem}.polli-slider::-webkit-slider-thumb{appearance:none;border:3px solid var(--polli-slider-thumb-border-value);width:22px;height:22px;box-shadow:0 2px 6px var(--polli-slider-thumb-shadow-value);background:#fff;border-radius:9999px;margin-top:-7px;transition:transform .15s}.polli-slider::-moz-range-thumb{border:3px solid var(--polli-slider-thumb-border-value);width:22px;height:22px;box-shadow:0 2px 6px var(--polli-slider-thumb-shadow-value);background:#fff;border-radius:9999px;transition:transform .15s}.polli-slider:hover::-webkit-slider-thumb{transform:scale(1.1)}.polli-slider:active::-webkit-slider-thumb{transform:scale(1.05)}@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-divide-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-tracking{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-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@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}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * The six chrome themes exposed by the CSS-var cascade. Apply via
3
+ * `data-theme="<name>"` on any ancestor — primitives and `--polli-*`
4
+ * tokens in that subtree restyle accordingly.
5
+ */
6
+ declare const themes: readonly ["amber", "blue", "pink", "teal", "violet", "green"];
7
+ type ThemeName = (typeof themes)[number];
8
+
9
+ export { type ThemeName as T, themes as t };
@@ -0,0 +1,9 @@
1
+ /**
2
+ * The six chrome themes exposed by the CSS-var cascade. Apply via
3
+ * `data-theme="<name>"` on any ancestor — primitives and `--polli-*`
4
+ * tokens in that subtree restyle accordingly.
5
+ */
6
+ declare const themes: readonly ["amber", "blue", "pink", "teal", "violet", "green"];
7
+ type ThemeName = (typeof themes)[number];
8
+
9
+ export { type ThemeName as T, themes as t };
@@ -48,7 +48,10 @@ var chipSizes = {
48
48
  var intentClasses = {
49
49
  news: "polli:bg-[oklch(0.935_0.06_158)] polli:text-[oklch(0.46_0.13_158)]",
50
50
  alpha: "polli:bg-[oklch(0.93_0.06_300)] polli:text-[oklch(0.42_0.18_300)]",
51
- neutral: "polli:border polli:border-gray-400/70 polli:bg-gray-100/80 polli:text-gray-900"
51
+ neutral: "polli:border polli:border-gray-400/70 polli:bg-gray-100/80 polli:text-gray-900",
52
+ success: "polli:border polli:border-intent-success-border polli:bg-intent-success-bg-light polli:text-intent-success-text",
53
+ warning: "polli:border polli:border-intent-warning-border polli:bg-intent-warning-bg-light polli:text-intent-warning-text",
54
+ danger: "polli:border polli:border-intent-danger-border polli:bg-intent-danger-bg-light polli:text-intent-danger-text"
52
55
  };
53
56
  var Chip = ({
54
57
  theme,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/modules/wallet/index.ts","../../src/lib/cn.ts","../../src/primitives/Chip.tsx","../../src/modules/wallet/chips.tsx","../../src/modules/wallet/colors.ts","../../src/modules/wallet/format-pollen.ts","../../src/modules/wallet/wallet-display.tsx"],"sourcesContent":["export { PaidChip, TierChip, type WalletChipProps } from \"./chips.tsx\";\nexport {\n PAID_BALANCE_CHART_COLOR,\n TIER_BALANCE_CHART_COLOR,\n} from \"./colors.ts\";\nexport { formatPollen } from \"./format-pollen.ts\";\nexport {\n WalletBalanceCard,\n type WalletBalanceCardProps,\n WalletDot,\n type WalletDotProps,\n} from \"./wallet-display.tsx\";\n","import { clsx } from \"clsx\";\nimport { extendTailwindMerge } from \"tailwind-merge\";\n\nconst twMerge = extendTailwindMerge({ prefix: \"polli\" });\n\n/** Internal class merge for polli:-prefixed package primitive classes. */\nexport function cn(...inputs: (string | undefined | null | false)[]) {\n return twMerge(clsx(...inputs));\n}\n","import type { ComponentPropsWithoutRef, FC } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport type { ThemeName } from \"../theme.ts\";\n\n/** Semantic chip labels for status and metadata badges. */\ntype ChipIntent = \"news\" | \"alpha\" | \"neutral\";\n\nconst chipSizes = {\n sm: \"polli:px-2 polli:py-0.5 polli:text-xs\",\n md: \"polli:px-2.5 polli:py-0.5 polli:text-sm\",\n lg: \"polli:px-3 polli:py-1 polli:text-sm\",\n} as const;\n\nconst intentClasses: Record<ChipIntent, string> = {\n news: \"polli:bg-[oklch(0.935_0.06_158)] polli:text-[oklch(0.46_0.13_158)]\",\n alpha: \"polli:bg-[oklch(0.93_0.06_300)] polli:text-[oklch(0.42_0.18_300)]\",\n neutral:\n \"polli:border polli:border-gray-400/70 polli:bg-gray-100/80 polli:text-gray-900\",\n};\n\nexport type ChipProps = ComponentPropsWithoutRef<\"span\"> & {\n /** Override the cascade theme for this chip's subtree. */\n theme?: ThemeName;\n /** Semantic intent. Wins over `theme` when set. */\n intent?: ChipIntent;\n size?: keyof typeof chipSizes;\n};\n\n// Static, rectangular colored container. Round shapes are reserved for buttons.\n// Reads `bg-theme-bg-active` / `text-theme-text-strong` from the cascade unless\n// `intent` is set (semantic, theme-independent).\nexport const Chip: FC<ChipProps> = ({\n theme,\n intent,\n size = \"md\",\n className,\n children,\n ...rest\n}) => {\n const intentClass = intent\n ? intentClasses[intent]\n : \"polli:bg-theme-bg-active polli:text-theme-text-strong\";\n return (\n <span\n {...rest}\n data-theme={theme}\n className={cn(\n \"polli:inline-flex polli:shrink-0 polli:items-center polli:gap-1 polli:rounded-lg polli:font-medium polli:leading-normal\",\n chipSizes[size],\n intentClass,\n className,\n )}\n >\n {children}\n </span>\n );\n};\n","import type { FC } from \"react\";\nimport { cn } from \"../../lib/cn.ts\";\nimport { Chip, type ChipProps } from \"../../primitives/Chip.tsx\";\n\nexport type WalletChipProps = Omit<ChipProps, \"intent\">;\n\nexport const PaidChip: FC<WalletChipProps> = ({\n className,\n children,\n ...props\n}) => (\n <Chip {...props} className={cn(\"polli-wallet-chip-paid\", className)}>\n {children}\n </Chip>\n);\n\nexport const TierChip: FC<WalletChipProps> = ({\n className,\n children,\n ...props\n}) => (\n <Chip {...props} className={cn(\"polli-wallet-chip-tier\", className)}>\n {children}\n </Chip>\n);\n","export const PAID_BALANCE_CHART_COLOR = \"var(--polli-color-paid-pale)\";\nexport const TIER_BALANCE_CHART_COLOR = \"var(--polli-color-tier-pale)\";\n","// 5-digit budget for pollen display. Integer takes its space, decimals fill\n// the remainder (capped at 4), floor toward -infinity, trailing zeros stripped.\n// Integers needing >=6 digits switch to compact (K/M/B, 3 sig figs).\n// Decimal point and minus sign do not count toward the budget.\n\nconst BUDGET = 5;\nconst MAX_DECIMALS = 4;\nconst COMPACT_THRESHOLD = 100_000;\n\nfunction floorTo(value: number, decimals: number): number {\n const factor = 10 ** decimals;\n return Math.floor(value * factor) / factor;\n}\n\nfunction formatCompact(value: number): string {\n const abs = Math.abs(value);\n const sign = value < 0 ? \"-\" : \"\";\n const [unit, scale] =\n abs >= 1e9\n ? ([\"B\", 1e9] as const)\n : abs >= 1e6\n ? ([\"M\", 1e6] as const)\n : ([\"K\", 1e3] as const);\n const ratio = abs / scale;\n const intDigits = Math.max(1, Math.floor(Math.log10(ratio)) + 1);\n const decimals = Math.max(0, 3 - intDigits);\n const floored = floorTo(ratio, decimals);\n return `${sign}${Number(floored.toFixed(decimals)).toString()}${unit}`;\n}\n\nexport function formatPollen(value: number): string {\n if (!Number.isFinite(value) || value === 0) return \"0\";\n\n const abs = Math.abs(value);\n\n if (abs >= COMPACT_THRESHOLD) return formatCompact(value);\n\n const intDigits = abs >= 1 ? Math.floor(Math.log10(abs)) + 1 : 1;\n const decimals = Math.min(MAX_DECIMALS, Math.max(0, BUDGET - intDigits));\n const floored = floorTo(value, decimals);\n if (floored === 0) return \"0\";\n return Number(floored.toFixed(decimals)).toString();\n}\n","import type { FC, ReactNode } from \"react\";\nimport { cn } from \"../../lib/cn.ts\";\n\ntype WalletBalanceKind = \"paid\" | \"tier\";\n\nconst walletPanelClasses: Record<WalletBalanceKind, string> = {\n paid: \"polli-wallet-panel-paid\",\n tier: \"polli-wallet-panel-tier\",\n};\n\nconst walletTextClasses: Record<WalletBalanceKind, string> = {\n paid: \"polli-wallet-text-paid\",\n tier: \"polli-wallet-text-tier\",\n};\n\nexport type WalletDotProps = {\n kind: WalletBalanceKind;\n className?: string;\n};\n\nexport const WalletDot: FC<WalletDotProps> = ({ kind, className }) => (\n <span\n className={cn(\n \"polli:h-2 polli:w-2 polli:rounded-full\",\n kind === \"paid\" ? \"polli-wallet-dot-paid\" : \"polli-wallet-dot-tier\",\n className,\n )}\n aria-hidden=\"true\"\n />\n);\n\nexport type WalletBalanceCardProps = {\n kind: WalletBalanceKind;\n label: ReactNode;\n value: ReactNode;\n info?: ReactNode;\n footer?: ReactNode;\n className?: string;\n};\n\nexport const WalletBalanceCard: FC<WalletBalanceCardProps> = ({\n kind,\n label,\n value,\n info,\n footer,\n className,\n}) => (\n <div\n className={cn(\n \"polli:rounded-xl polli:p-4\",\n walletPanelClasses[kind],\n className,\n )}\n >\n <span className=\"polli:flex polli:items-center polli:gap-2\">\n <WalletDot kind={kind} />\n <span className=\"polli:text-sm polli:font-bold polli:uppercase polli:tracking-wide polli:text-amber-900\">\n {label}\n </span>\n {info}\n </span>\n <div\n className={cn(\n \"polli-wallet-balance-value polli:mt-1 polli:font-bold polli:leading-none polli:tracking-tight polli:tabular-nums\",\n walletTextClasses[kind],\n )}\n >\n {value}\n </div>\n {footer && (\n <div className=\"polli:mt-1.5 polli:text-sm polli:font-bold polli:tabular-nums polli:text-green-700\">\n {footer}\n </div>\n )}\n </div>\n);\n"],"mappings":"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","names":["import_jsx_runtime","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../../src/modules/wallet/index.ts","../../src/lib/cn.ts","../../src/primitives/Chip.tsx","../../src/modules/wallet/chips.tsx","../../src/modules/wallet/colors.ts","../../src/modules/wallet/format-pollen.ts","../../src/modules/wallet/wallet-display.tsx"],"sourcesContent":["export { PaidChip, TierChip, type WalletChipProps } from \"./chips.tsx\";\nexport {\n PAID_BALANCE_CHART_COLOR,\n TIER_BALANCE_CHART_COLOR,\n} from \"./colors.ts\";\nexport { formatPollen } from \"./format-pollen.ts\";\nexport {\n WalletBalanceCard,\n type WalletBalanceCardProps,\n WalletDot,\n type WalletDotProps,\n} from \"./wallet-display.tsx\";\n","import { clsx } from \"clsx\";\nimport { extendTailwindMerge } from \"tailwind-merge\";\n\nconst twMerge = extendTailwindMerge({ prefix: \"polli\" });\n\n/** Internal class merge for polli:-prefixed package primitive classes. */\nexport function cn(...inputs: (string | undefined | null | false)[]) {\n return twMerge(clsx(...inputs));\n}\n","import type { ComponentPropsWithoutRef, FC } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport type { ThemeName } from \"../theme.ts\";\n\n/** Semantic chip labels for status and metadata badges. */\ntype ChipIntent =\n | \"news\"\n | \"alpha\"\n | \"neutral\"\n | \"success\"\n | \"warning\"\n | \"danger\";\n\nconst chipSizes = {\n sm: \"polli:px-2 polli:py-0.5 polli:text-xs\",\n md: \"polli:px-2.5 polli:py-0.5 polli:text-sm\",\n lg: \"polli:px-3 polli:py-1 polli:text-sm\",\n} as const;\n\nconst intentClasses: Record<ChipIntent, string> = {\n news: \"polli:bg-[oklch(0.935_0.06_158)] polli:text-[oklch(0.46_0.13_158)]\",\n alpha: \"polli:bg-[oklch(0.93_0.06_300)] polli:text-[oklch(0.42_0.18_300)]\",\n neutral:\n \"polli:border polli:border-gray-400/70 polli:bg-gray-100/80 polli:text-gray-900\",\n success:\n \"polli:border polli:border-intent-success-border polli:bg-intent-success-bg-light polli:text-intent-success-text\",\n warning:\n \"polli:border polli:border-intent-warning-border polli:bg-intent-warning-bg-light polli:text-intent-warning-text\",\n danger: \"polli:border polli:border-intent-danger-border polli:bg-intent-danger-bg-light polli:text-intent-danger-text\",\n};\n\nexport type ChipProps = ComponentPropsWithoutRef<\"span\"> & {\n /** Override the cascade theme for this chip's subtree. */\n theme?: ThemeName;\n /** Semantic intent. Wins over `theme` when set. */\n intent?: ChipIntent;\n size?: keyof typeof chipSizes;\n};\n\n// Static, rectangular colored container. Round shapes are reserved for buttons.\n// Reads `bg-theme-bg-active` / `text-theme-text-strong` from the cascade unless\n// `intent` is set (semantic, theme-independent).\nexport const Chip: FC<ChipProps> = ({\n theme,\n intent,\n size = \"md\",\n className,\n children,\n ...rest\n}) => {\n const intentClass = intent\n ? intentClasses[intent]\n : \"polli:bg-theme-bg-active polli:text-theme-text-strong\";\n return (\n <span\n {...rest}\n data-theme={theme}\n className={cn(\n \"polli:inline-flex polli:shrink-0 polli:items-center polli:gap-1 polli:rounded-lg polli:font-medium polli:leading-normal\",\n chipSizes[size],\n intentClass,\n className,\n )}\n >\n {children}\n </span>\n );\n};\n","import type { FC } from \"react\";\nimport { cn } from \"../../lib/cn.ts\";\nimport { Chip, type ChipProps } from \"../../primitives/Chip.tsx\";\n\nexport type WalletChipProps = Omit<ChipProps, \"intent\">;\n\nexport const PaidChip: FC<WalletChipProps> = ({\n className,\n children,\n ...props\n}) => (\n <Chip {...props} className={cn(\"polli-wallet-chip-paid\", className)}>\n {children}\n </Chip>\n);\n\nexport const TierChip: FC<WalletChipProps> = ({\n className,\n children,\n ...props\n}) => (\n <Chip {...props} className={cn(\"polli-wallet-chip-tier\", className)}>\n {children}\n </Chip>\n);\n","export const PAID_BALANCE_CHART_COLOR = \"var(--polli-color-paid-pale)\";\nexport const TIER_BALANCE_CHART_COLOR = \"var(--polli-color-tier-pale)\";\n","// 5-digit budget for pollen display. Integer takes its space, decimals fill\n// the remainder (capped at 4), floor toward -infinity, trailing zeros stripped.\n// Integers needing >=6 digits switch to compact (K/M/B, 3 sig figs).\n// Decimal point and minus sign do not count toward the budget.\n\nconst BUDGET = 5;\nconst MAX_DECIMALS = 4;\nconst COMPACT_THRESHOLD = 100_000;\n\nfunction floorTo(value: number, decimals: number): number {\n const factor = 10 ** decimals;\n return Math.floor(value * factor) / factor;\n}\n\nfunction formatCompact(value: number): string {\n const abs = Math.abs(value);\n const sign = value < 0 ? \"-\" : \"\";\n const [unit, scale] =\n abs >= 1e9\n ? ([\"B\", 1e9] as const)\n : abs >= 1e6\n ? ([\"M\", 1e6] as const)\n : ([\"K\", 1e3] as const);\n const ratio = abs / scale;\n const intDigits = Math.max(1, Math.floor(Math.log10(ratio)) + 1);\n const decimals = Math.max(0, 3 - intDigits);\n const floored = floorTo(ratio, decimals);\n return `${sign}${Number(floored.toFixed(decimals)).toString()}${unit}`;\n}\n\nexport function formatPollen(value: number): string {\n if (!Number.isFinite(value) || value === 0) return \"0\";\n\n const abs = Math.abs(value);\n\n if (abs >= COMPACT_THRESHOLD) return formatCompact(value);\n\n const intDigits = abs >= 1 ? Math.floor(Math.log10(abs)) + 1 : 1;\n const decimals = Math.min(MAX_DECIMALS, Math.max(0, BUDGET - intDigits));\n const floored = floorTo(value, decimals);\n if (floored === 0) return \"0\";\n return Number(floored.toFixed(decimals)).toString();\n}\n","import type { FC, ReactNode } from \"react\";\nimport { cn } from \"../../lib/cn.ts\";\n\ntype WalletBalanceKind = \"paid\" | \"tier\";\n\nconst walletPanelClasses: Record<WalletBalanceKind, string> = {\n paid: \"polli-wallet-panel-paid\",\n tier: \"polli-wallet-panel-tier\",\n};\n\nconst walletTextClasses: Record<WalletBalanceKind, string> = {\n paid: \"polli-wallet-text-paid\",\n tier: \"polli-wallet-text-tier\",\n};\n\nexport type WalletDotProps = {\n kind: WalletBalanceKind;\n className?: string;\n};\n\nexport const WalletDot: FC<WalletDotProps> = ({ kind, className }) => (\n <span\n className={cn(\n \"polli:h-2 polli:w-2 polli:rounded-full\",\n kind === \"paid\" ? \"polli-wallet-dot-paid\" : \"polli-wallet-dot-tier\",\n className,\n )}\n aria-hidden=\"true\"\n />\n);\n\nexport type WalletBalanceCardProps = {\n kind: WalletBalanceKind;\n label: ReactNode;\n value: ReactNode;\n info?: ReactNode;\n footer?: ReactNode;\n className?: string;\n};\n\nexport const WalletBalanceCard: FC<WalletBalanceCardProps> = ({\n kind,\n label,\n value,\n info,\n footer,\n className,\n}) => (\n <div\n className={cn(\n \"polli:rounded-xl polli:p-4\",\n walletPanelClasses[kind],\n className,\n )}\n >\n <span className=\"polli:flex polli:items-center polli:gap-2\">\n <WalletDot kind={kind} />\n <span className=\"polli:text-sm polli:font-bold polli:uppercase polli:tracking-wide polli:text-amber-900\">\n {label}\n </span>\n {info}\n </span>\n <div\n className={cn(\n \"polli-wallet-balance-value polli:mt-1 polli:font-bold polli:leading-none polli:tracking-tight polli:tabular-nums\",\n walletTextClasses[kind],\n )}\n >\n {value}\n </div>\n {footer && (\n <div className=\"polli:mt-1.5 polli:text-sm polli:font-bold polli:tabular-nums polli:text-green-700\">\n {footer}\n </div>\n )}\n </div>\n);\n"],"mappings":"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","names":["import_jsx_runtime","import_jsx_runtime"]}
@@ -1,6 +1,6 @@
1
1
  import { FC, ReactNode } from 'react';
2
- import { a as ChipProps } from '../Chip-DyqWrq0r.cjs';
3
- import '../theme-DfHMjWB7.cjs';
2
+ import { a as ChipProps } from '../Chip-SM52sUbZ.cjs';
3
+ import '../theme-VMRlhqST.cjs';
4
4
 
5
5
  type WalletChipProps = Omit<ChipProps, "intent">;
6
6
  declare const PaidChip: FC<WalletChipProps>;
@@ -1,6 +1,6 @@
1
1
  import { FC, ReactNode } from 'react';
2
- import { a as ChipProps } from '../Chip-BS8ronOu.js';
3
- import '../theme-DfHMjWB7.js';
2
+ import { a as ChipProps } from '../Chip-C5impfYd.js';
3
+ import '../theme-VMRlhqST.js';
4
4
 
5
5
  type WalletChipProps = Omit<ChipProps, "intent">;
6
6
  declare const PaidChip: FC<WalletChipProps>;