@pollinations/ui 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/README.md +219 -0
  2. package/dist/Button-CNzpisJf.d.cts +26 -0
  3. package/dist/Button-DMJ2K6Gr.d.ts +26 -0
  4. package/dist/Chip-BS8ronOu.d.ts +20 -0
  5. package/dist/Chip-DyqWrq0r.d.cts +20 -0
  6. package/dist/app.css +87 -0
  7. package/dist/assets/logo-wordmark.svg +1 -0
  8. package/dist/assets/logo.svg +4 -0
  9. package/dist/auth/index.cjs +225 -0
  10. package/dist/auth/index.cjs.map +1 -0
  11. package/dist/auth/index.d.cts +28 -0
  12. package/dist/auth/index.d.ts +28 -0
  13. package/dist/auth/index.js +194 -0
  14. package/dist/auth/index.js.map +1 -0
  15. package/dist/auth/sdk.cjs +220 -0
  16. package/dist/auth/sdk.cjs.map +1 -0
  17. package/dist/auth/sdk.d.cts +53 -0
  18. package/dist/auth/sdk.d.ts +53 -0
  19. package/dist/auth/sdk.js +187 -0
  20. package/dist/auth/sdk.js.map +1 -0
  21. package/dist/fonts/fraunces-soft-bold.woff2 +0 -0
  22. package/dist/fonts/lct-mogi-a.woff2 +0 -0
  23. package/dist/fonts/uncut-sans-variable.woff2 +0 -0
  24. package/dist/index.cjs +1771 -0
  25. package/dist/index.cjs.map +1 -0
  26. package/dist/index.d.cts +340 -0
  27. package/dist/index.d.ts +340 -0
  28. package/dist/index.js +1706 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/licenses/Fraunces-OFL.txt +93 -0
  31. package/dist/licenses/LCT-Mogi-OFL.txt +93 -0
  32. package/dist/licenses/UncutSans-OFL.txt +94 -0
  33. package/dist/modality/index.cjs +115 -0
  34. package/dist/modality/index.cjs.map +1 -0
  35. package/dist/modality/index.d.cts +45 -0
  36. package/dist/modality/index.d.ts +45 -0
  37. package/dist/modality/index.js +87 -0
  38. package/dist/modality/index.js.map +1 -0
  39. package/dist/showcase/index.cjs +2851 -0
  40. package/dist/showcase/index.cjs.map +1 -0
  41. package/dist/showcase/index.d.cts +19 -0
  42. package/dist/showcase/index.d.ts +19 -0
  43. package/dist/showcase/index.js +2839 -0
  44. package/dist/showcase/index.js.map +1 -0
  45. package/dist/styles.css +2 -0
  46. package/dist/theme-DfHMjWB7.d.cts +16 -0
  47. package/dist/theme-DfHMjWB7.d.ts +16 -0
  48. package/dist/wallet/index.cjs +190 -0
  49. package/dist/wallet/index.cjs.map +1 -0
  50. package/dist/wallet/index.d.cts +30 -0
  51. package/dist/wallet/index.d.ts +30 -0
  52. package/dist/wallet/index.js +157 -0
  53. package/dist/wallet/index.js.map +1 -0
  54. package/dist/wallet/sdk.cjs +203 -0
  55. package/dist/wallet/sdk.cjs.map +1 -0
  56. package/dist/wallet/sdk.d.cts +33 -0
  57. package/dist/wallet/sdk.d.ts +33 -0
  58. package/dist/wallet/sdk.js +172 -0
  59. package/dist/wallet/sdk.js.map +1 -0
  60. package/dist/wallet.css +73 -0
  61. package/package.json +105 -0
@@ -0,0 +1,203 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/modules/wallet/sdk.ts
21
+ var sdk_exports = {};
22
+ __export(sdk_exports, {
23
+ Balance: () => Balance,
24
+ KeyBudget: () => KeyBudget,
25
+ KeyExpiry: () => KeyExpiry,
26
+ KeyModels: () => KeyModels,
27
+ KeyPrefix: () => KeyPrefix
28
+ });
29
+ module.exports = __toCommonJS(sdk_exports);
30
+
31
+ // src/modules/wallet/Balance.tsx
32
+ var import_react = require("@pollinations/sdk/react");
33
+
34
+ // src/lib/cn.ts
35
+ var import_clsx = require("clsx");
36
+ var import_tailwind_merge = require("tailwind-merge");
37
+ var twMerge = (0, import_tailwind_merge.extendTailwindMerge)({ prefix: "polli" });
38
+ function cn(...inputs) {
39
+ return twMerge((0, import_clsx.clsx)(...inputs));
40
+ }
41
+
42
+ // src/primitives/Chip.tsx
43
+ var import_jsx_runtime = require("react/jsx-runtime");
44
+ var chipSizes = {
45
+ sm: "polli:px-2 polli:py-0.5 polli:text-xs",
46
+ md: "polli:px-2.5 polli:py-0.5 polli:text-sm",
47
+ lg: "polli:px-3 polli:py-1 polli:text-sm"
48
+ };
49
+ var intentClasses = {
50
+ news: "polli:bg-[oklch(0.935_0.06_158)] polli:text-[oklch(0.46_0.13_158)]",
51
+ alpha: "polli:bg-[oklch(0.93_0.06_300)] polli:text-[oklch(0.42_0.18_300)]",
52
+ neutral: "polli:border polli:border-gray-400/70 polli:bg-gray-100/80 polli:text-gray-900"
53
+ };
54
+ var Chip = ({
55
+ theme,
56
+ intent,
57
+ size = "md",
58
+ className,
59
+ children,
60
+ ...rest
61
+ }) => {
62
+ const intentClass = intent ? intentClasses[intent] : "polli:bg-theme-bg-active polli:text-theme-text-strong";
63
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
64
+ "span",
65
+ {
66
+ ...rest,
67
+ "data-theme": theme,
68
+ className: cn(
69
+ "polli:inline-flex polli:shrink-0 polli:items-center polli:gap-1 polli:rounded-lg polli:font-medium polli:leading-normal",
70
+ chipSizes[size],
71
+ intentClass,
72
+ className
73
+ ),
74
+ children
75
+ }
76
+ );
77
+ };
78
+
79
+ // src/modules/wallet/format-pollen.ts
80
+ var BUDGET = 5;
81
+ var MAX_DECIMALS = 4;
82
+ var COMPACT_THRESHOLD = 1e5;
83
+ function floorTo(value, decimals) {
84
+ const factor = 10 ** decimals;
85
+ return Math.floor(value * factor) / factor;
86
+ }
87
+ function formatCompact(value) {
88
+ const abs = Math.abs(value);
89
+ const sign = value < 0 ? "-" : "";
90
+ const [unit, scale] = abs >= 1e9 ? ["B", 1e9] : abs >= 1e6 ? ["M", 1e6] : ["K", 1e3];
91
+ const ratio = abs / scale;
92
+ const intDigits = Math.max(1, Math.floor(Math.log10(ratio)) + 1);
93
+ const decimals = Math.max(0, 3 - intDigits);
94
+ const floored = floorTo(ratio, decimals);
95
+ return `${sign}${Number(floored.toFixed(decimals)).toString()}${unit}`;
96
+ }
97
+ function formatPollen(value) {
98
+ if (!Number.isFinite(value) || value === 0) return "0";
99
+ const abs = Math.abs(value);
100
+ if (abs >= COMPACT_THRESHOLD) return formatCompact(value);
101
+ const intDigits = abs >= 1 ? Math.floor(Math.log10(abs)) + 1 : 1;
102
+ const decimals = Math.min(MAX_DECIMALS, Math.max(0, BUDGET - intDigits));
103
+ const floored = floorTo(value, decimals);
104
+ if (floored === 0) return "0";
105
+ return Number(floored.toFixed(decimals)).toString();
106
+ }
107
+
108
+ // src/modules/wallet/Balance.tsx
109
+ var import_jsx_runtime2 = require("react/jsx-runtime");
110
+ function Balance({ className } = {}) {
111
+ const { isLoggedIn } = (0, import_react.useAuthState)();
112
+ const { data: balance } = (0, import_react.useAccountBalance)({ enabled: isLoggedIn });
113
+ if (!isLoggedIn || balance == null) return null;
114
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)(
115
+ Chip,
116
+ {
117
+ "data-polli": "balance",
118
+ className: cn("polli:tabular-nums", className),
119
+ children: [
120
+ formatPollen(balance.balance),
121
+ " pollen"
122
+ ]
123
+ }
124
+ );
125
+ }
126
+
127
+ // src/modules/wallet/KeyBudget.tsx
128
+ var import_react2 = require("@pollinations/sdk/react");
129
+ var import_jsx_runtime3 = require("react/jsx-runtime");
130
+ function KeyBudget({ className } = {}) {
131
+ const { isLoggedIn } = (0, import_react2.useAuthState)();
132
+ const { data: key } = (0, import_react2.useAccountKey)({ enabled: isLoggedIn });
133
+ const budget = key?.pollenBudget;
134
+ if (!isLoggedIn || budget == null) return null;
135
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsxs)(
136
+ Chip,
137
+ {
138
+ "data-polli": "key-budget",
139
+ className: cn("polli:tabular-nums", className),
140
+ children: [
141
+ formatPollen(budget),
142
+ " pollen"
143
+ ]
144
+ }
145
+ );
146
+ }
147
+
148
+ // src/modules/wallet/KeyExpiry.tsx
149
+ var import_react3 = require("@pollinations/sdk/react");
150
+ var import_jsx_runtime4 = require("react/jsx-runtime");
151
+ function KeyExpiry({ className } = {}) {
152
+ const { isLoggedIn } = (0, import_react3.useAuthState)();
153
+ const { data: key } = (0, import_react3.useAccountKey)({ enabled: isLoggedIn });
154
+ if (!isLoggedIn || !key?.expiresAt) return null;
155
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
156
+ Chip,
157
+ {
158
+ "data-polli": "key-expiry",
159
+ className: cn("polli:tabular-nums", className),
160
+ children: key.expiresAt.slice(0, 10)
161
+ }
162
+ );
163
+ }
164
+
165
+ // src/modules/wallet/KeyModels.tsx
166
+ var import_react4 = require("@pollinations/sdk/react");
167
+ var import_jsx_runtime5 = require("react/jsx-runtime");
168
+ function KeyModels({ className } = {}) {
169
+ const { isLoggedIn } = (0, import_react4.useAuthState)();
170
+ const { data: key } = (0, import_react4.useAccountKey)({ enabled: isLoggedIn });
171
+ if (!isLoggedIn || !key) return null;
172
+ const models = key.permissions?.models ?? null;
173
+ const text = models === null ? "All models" : `${models.length} model${models.length === 1 ? "" : "s"}`;
174
+ return /* @__PURE__ */ (0, import_jsx_runtime5.jsx)(Chip, { "data-polli": "key-models", className, children: text });
175
+ }
176
+
177
+ // src/modules/wallet/KeyPrefix.tsx
178
+ var import_react5 = require("@pollinations/sdk/react");
179
+ var import_jsx_runtime6 = require("react/jsx-runtime");
180
+ function KeyPrefix({ className } = {}) {
181
+ const { apiKey } = (0, import_react5.useAuthState)();
182
+ if (!apiKey) return null;
183
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
184
+ Chip,
185
+ {
186
+ "data-polli": "key-prefix",
187
+ className: cn("polli:font-mono polli:select-none", className),
188
+ children: [
189
+ apiKey.slice(0, 7),
190
+ "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022"
191
+ ]
192
+ }
193
+ );
194
+ }
195
+ // Annotate the CommonJS export names for ESM import in node:
196
+ 0 && (module.exports = {
197
+ Balance,
198
+ KeyBudget,
199
+ KeyExpiry,
200
+ KeyModels,
201
+ KeyPrefix
202
+ });
203
+ //# sourceMappingURL=sdk.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/modules/wallet/sdk.ts","../../src/modules/wallet/Balance.tsx","../../src/lib/cn.ts","../../src/primitives/Chip.tsx","../../src/modules/wallet/format-pollen.ts","../../src/modules/wallet/KeyBudget.tsx","../../src/modules/wallet/KeyExpiry.tsx","../../src/modules/wallet/KeyModels.tsx","../../src/modules/wallet/KeyPrefix.tsx"],"sourcesContent":["export { Balance, type BalanceProps } from \"./Balance.tsx\";\nexport { KeyBudget, type KeyBudgetProps } from \"./KeyBudget.tsx\";\nexport { KeyExpiry, type KeyExpiryProps } from \"./KeyExpiry.tsx\";\nexport { KeyModels, type KeyModelsProps } from \"./KeyModels.tsx\";\nexport { KeyPrefix, type KeyPrefixProps } from \"./KeyPrefix.tsx\";\n","import { useAccountBalance, useAuthState } from \"@pollinations/sdk/react\";\nimport { cn } from \"../../lib/cn.ts\";\nimport { Chip } from \"../../primitives/Chip.tsx\";\nimport { formatPollen } from \"./format-pollen.ts\";\n\nexport type BalanceProps = { className?: string };\n\n/** Renders the logged-in user's pollen balance. `null` until loaded. */\nexport function Balance({ className }: BalanceProps = {}) {\n const { isLoggedIn } = useAuthState();\n const { data: balance } = useAccountBalance({ enabled: isLoggedIn });\n if (!isLoggedIn || balance == null) return null;\n return (\n <Chip\n data-polli=\"balance\"\n className={cn(\"polli:tabular-nums\", className)}\n >\n {formatPollen(balance.balance)} pollen\n </Chip>\n );\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 { 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","// 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 { useAccountKey, useAuthState } from \"@pollinations/sdk/react\";\nimport { cn } from \"../../lib/cn.ts\";\nimport { Chip } from \"../../primitives/Chip.tsx\";\nimport { formatPollen } from \"./format-pollen.ts\";\n\nexport type KeyBudgetProps = { className?: string };\n\n/** Renders the current delegated key's remaining budget. `null` until loaded. */\nexport function KeyBudget({ className }: KeyBudgetProps = {}) {\n const { isLoggedIn } = useAuthState();\n const { data: key } = useAccountKey({ enabled: isLoggedIn });\n const budget = key?.pollenBudget;\n if (!isLoggedIn || budget == null) return null;\n return (\n <Chip\n data-polli=\"key-budget\"\n className={cn(\"polli:tabular-nums\", className)}\n >\n {formatPollen(budget)} pollen\n </Chip>\n );\n}\n","import { useAccountKey, useAuthState } from \"@pollinations/sdk/react\";\nimport { cn } from \"../../lib/cn.ts\";\nimport { Chip } from \"../../primitives/Chip.tsx\";\n\nexport type KeyExpiryProps = { className?: string };\n\n/** Renders the current delegated key's expiry date (YYYY-MM-DD) or `null`. */\nexport function KeyExpiry({ className }: KeyExpiryProps = {}) {\n const { isLoggedIn } = useAuthState();\n const { data: key } = useAccountKey({ enabled: isLoggedIn });\n if (!isLoggedIn || !key?.expiresAt) return null;\n return (\n <Chip\n data-polli=\"key-expiry\"\n className={cn(\"polli:tabular-nums\", className)}\n >\n {key.expiresAt.slice(0, 10)}\n </Chip>\n );\n}\n","import { useAccountKey, useAuthState } from \"@pollinations/sdk/react\";\nimport { Chip } from \"../../primitives/Chip.tsx\";\n\nexport type KeyModelsProps = { className?: string };\n\n/** Renders \"All models\" or \"N models\" for the current key. `null` until loaded. */\nexport function KeyModels({ className }: KeyModelsProps = {}) {\n const { isLoggedIn } = useAuthState();\n const { data: key } = useAccountKey({ enabled: isLoggedIn });\n if (!isLoggedIn || !key) return null;\n const models = key.permissions?.models ?? null;\n const text =\n models === null\n ? \"All models\"\n : `${models.length} model${models.length === 1 ? \"\" : \"s\"}`;\n return (\n <Chip data-polli=\"key-models\" className={className}>\n {text}\n </Chip>\n );\n}\n","import { useAuthState } from \"@pollinations/sdk/react\";\nimport { cn } from \"../../lib/cn.ts\";\nimport { Chip } from \"../../primitives/Chip.tsx\";\n\nexport type KeyPrefixProps = { className?: string };\n\n/** Renders the first 7 chars of the API key followed by bullets. `null` when logged out. */\nexport function KeyPrefix({ className }: KeyPrefixProps = {}) {\n const { apiKey } = useAuthState();\n if (!apiKey) return null;\n return (\n <Chip\n data-polli=\"key-prefix\"\n className={cn(\"polli:font-mono polli:select-none\", className)}\n >\n {apiKey.slice(0, 7)}\n {\"••••••••\"}\n </Chip>\n );\n}\n"],"mappings":"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","names":["import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime"]}
@@ -0,0 +1,33 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ type BalanceProps = {
4
+ className?: string;
5
+ };
6
+ /** Renders the logged-in user's pollen balance. `null` until loaded. */
7
+ declare function Balance({ className }?: BalanceProps): react_jsx_runtime.JSX.Element | null;
8
+
9
+ type KeyBudgetProps = {
10
+ className?: string;
11
+ };
12
+ /** Renders the current delegated key's remaining budget. `null` until loaded. */
13
+ declare function KeyBudget({ className }?: KeyBudgetProps): react_jsx_runtime.JSX.Element | null;
14
+
15
+ type KeyExpiryProps = {
16
+ className?: string;
17
+ };
18
+ /** Renders the current delegated key's expiry date (YYYY-MM-DD) or `null`. */
19
+ declare function KeyExpiry({ className }?: KeyExpiryProps): react_jsx_runtime.JSX.Element | null;
20
+
21
+ type KeyModelsProps = {
22
+ className?: string;
23
+ };
24
+ /** Renders "All models" or "N models" for the current key. `null` until loaded. */
25
+ declare function KeyModels({ className }?: KeyModelsProps): react_jsx_runtime.JSX.Element | null;
26
+
27
+ type KeyPrefixProps = {
28
+ className?: string;
29
+ };
30
+ /** Renders the first 7 chars of the API key followed by bullets. `null` when logged out. */
31
+ declare function KeyPrefix({ className }?: KeyPrefixProps): react_jsx_runtime.JSX.Element | null;
32
+
33
+ export { Balance, type BalanceProps, KeyBudget, type KeyBudgetProps, KeyExpiry, type KeyExpiryProps, KeyModels, type KeyModelsProps, KeyPrefix, type KeyPrefixProps };
@@ -0,0 +1,33 @@
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
+
3
+ type BalanceProps = {
4
+ className?: string;
5
+ };
6
+ /** Renders the logged-in user's pollen balance. `null` until loaded. */
7
+ declare function Balance({ className }?: BalanceProps): react_jsx_runtime.JSX.Element | null;
8
+
9
+ type KeyBudgetProps = {
10
+ className?: string;
11
+ };
12
+ /** Renders the current delegated key's remaining budget. `null` until loaded. */
13
+ declare function KeyBudget({ className }?: KeyBudgetProps): react_jsx_runtime.JSX.Element | null;
14
+
15
+ type KeyExpiryProps = {
16
+ className?: string;
17
+ };
18
+ /** Renders the current delegated key's expiry date (YYYY-MM-DD) or `null`. */
19
+ declare function KeyExpiry({ className }?: KeyExpiryProps): react_jsx_runtime.JSX.Element | null;
20
+
21
+ type KeyModelsProps = {
22
+ className?: string;
23
+ };
24
+ /** Renders "All models" or "N models" for the current key. `null` until loaded. */
25
+ declare function KeyModels({ className }?: KeyModelsProps): react_jsx_runtime.JSX.Element | null;
26
+
27
+ type KeyPrefixProps = {
28
+ className?: string;
29
+ };
30
+ /** Renders the first 7 chars of the API key followed by bullets. `null` when logged out. */
31
+ declare function KeyPrefix({ className }?: KeyPrefixProps): react_jsx_runtime.JSX.Element | null;
32
+
33
+ export { Balance, type BalanceProps, KeyBudget, type KeyBudgetProps, KeyExpiry, type KeyExpiryProps, KeyModels, type KeyModelsProps, KeyPrefix, type KeyPrefixProps };
@@ -0,0 +1,172 @@
1
+ // src/modules/wallet/Balance.tsx
2
+ import { useAccountBalance, useAuthState } from "@pollinations/sdk/react";
3
+
4
+ // src/lib/cn.ts
5
+ import { clsx } from "clsx";
6
+ import { extendTailwindMerge } from "tailwind-merge";
7
+ var twMerge = extendTailwindMerge({ prefix: "polli" });
8
+ function cn(...inputs) {
9
+ return twMerge(clsx(...inputs));
10
+ }
11
+
12
+ // src/primitives/Chip.tsx
13
+ import { jsx } from "react/jsx-runtime";
14
+ var chipSizes = {
15
+ sm: "polli:px-2 polli:py-0.5 polli:text-xs",
16
+ md: "polli:px-2.5 polli:py-0.5 polli:text-sm",
17
+ lg: "polli:px-3 polli:py-1 polli:text-sm"
18
+ };
19
+ var intentClasses = {
20
+ news: "polli:bg-[oklch(0.935_0.06_158)] polli:text-[oklch(0.46_0.13_158)]",
21
+ alpha: "polli:bg-[oklch(0.93_0.06_300)] polli:text-[oklch(0.42_0.18_300)]",
22
+ neutral: "polli:border polli:border-gray-400/70 polli:bg-gray-100/80 polli:text-gray-900"
23
+ };
24
+ var Chip = ({
25
+ theme,
26
+ intent,
27
+ size = "md",
28
+ className,
29
+ children,
30
+ ...rest
31
+ }) => {
32
+ const intentClass = intent ? intentClasses[intent] : "polli:bg-theme-bg-active polli:text-theme-text-strong";
33
+ return /* @__PURE__ */ jsx(
34
+ "span",
35
+ {
36
+ ...rest,
37
+ "data-theme": theme,
38
+ className: cn(
39
+ "polli:inline-flex polli:shrink-0 polli:items-center polli:gap-1 polli:rounded-lg polli:font-medium polli:leading-normal",
40
+ chipSizes[size],
41
+ intentClass,
42
+ className
43
+ ),
44
+ children
45
+ }
46
+ );
47
+ };
48
+
49
+ // src/modules/wallet/format-pollen.ts
50
+ var BUDGET = 5;
51
+ var MAX_DECIMALS = 4;
52
+ var COMPACT_THRESHOLD = 1e5;
53
+ function floorTo(value, decimals) {
54
+ const factor = 10 ** decimals;
55
+ return Math.floor(value * factor) / factor;
56
+ }
57
+ function formatCompact(value) {
58
+ const abs = Math.abs(value);
59
+ const sign = value < 0 ? "-" : "";
60
+ const [unit, scale] = abs >= 1e9 ? ["B", 1e9] : abs >= 1e6 ? ["M", 1e6] : ["K", 1e3];
61
+ const ratio = abs / scale;
62
+ const intDigits = Math.max(1, Math.floor(Math.log10(ratio)) + 1);
63
+ const decimals = Math.max(0, 3 - intDigits);
64
+ const floored = floorTo(ratio, decimals);
65
+ return `${sign}${Number(floored.toFixed(decimals)).toString()}${unit}`;
66
+ }
67
+ function formatPollen(value) {
68
+ if (!Number.isFinite(value) || value === 0) return "0";
69
+ const abs = Math.abs(value);
70
+ if (abs >= COMPACT_THRESHOLD) return formatCompact(value);
71
+ const intDigits = abs >= 1 ? Math.floor(Math.log10(abs)) + 1 : 1;
72
+ const decimals = Math.min(MAX_DECIMALS, Math.max(0, BUDGET - intDigits));
73
+ const floored = floorTo(value, decimals);
74
+ if (floored === 0) return "0";
75
+ return Number(floored.toFixed(decimals)).toString();
76
+ }
77
+
78
+ // src/modules/wallet/Balance.tsx
79
+ import { jsxs } from "react/jsx-runtime";
80
+ function Balance({ className } = {}) {
81
+ const { isLoggedIn } = useAuthState();
82
+ const { data: balance } = useAccountBalance({ enabled: isLoggedIn });
83
+ if (!isLoggedIn || balance == null) return null;
84
+ return /* @__PURE__ */ jsxs(
85
+ Chip,
86
+ {
87
+ "data-polli": "balance",
88
+ className: cn("polli:tabular-nums", className),
89
+ children: [
90
+ formatPollen(balance.balance),
91
+ " pollen"
92
+ ]
93
+ }
94
+ );
95
+ }
96
+
97
+ // src/modules/wallet/KeyBudget.tsx
98
+ import { useAccountKey, useAuthState as useAuthState2 } from "@pollinations/sdk/react";
99
+ import { jsxs as jsxs2 } from "react/jsx-runtime";
100
+ function KeyBudget({ className } = {}) {
101
+ const { isLoggedIn } = useAuthState2();
102
+ const { data: key } = useAccountKey({ enabled: isLoggedIn });
103
+ const budget = key?.pollenBudget;
104
+ if (!isLoggedIn || budget == null) return null;
105
+ return /* @__PURE__ */ jsxs2(
106
+ Chip,
107
+ {
108
+ "data-polli": "key-budget",
109
+ className: cn("polli:tabular-nums", className),
110
+ children: [
111
+ formatPollen(budget),
112
+ " pollen"
113
+ ]
114
+ }
115
+ );
116
+ }
117
+
118
+ // src/modules/wallet/KeyExpiry.tsx
119
+ import { useAccountKey as useAccountKey2, useAuthState as useAuthState3 } from "@pollinations/sdk/react";
120
+ import { jsx as jsx2 } from "react/jsx-runtime";
121
+ function KeyExpiry({ className } = {}) {
122
+ const { isLoggedIn } = useAuthState3();
123
+ const { data: key } = useAccountKey2({ enabled: isLoggedIn });
124
+ if (!isLoggedIn || !key?.expiresAt) return null;
125
+ return /* @__PURE__ */ jsx2(
126
+ Chip,
127
+ {
128
+ "data-polli": "key-expiry",
129
+ className: cn("polli:tabular-nums", className),
130
+ children: key.expiresAt.slice(0, 10)
131
+ }
132
+ );
133
+ }
134
+
135
+ // src/modules/wallet/KeyModels.tsx
136
+ import { useAccountKey as useAccountKey3, useAuthState as useAuthState4 } from "@pollinations/sdk/react";
137
+ import { jsx as jsx3 } from "react/jsx-runtime";
138
+ function KeyModels({ className } = {}) {
139
+ const { isLoggedIn } = useAuthState4();
140
+ const { data: key } = useAccountKey3({ enabled: isLoggedIn });
141
+ if (!isLoggedIn || !key) return null;
142
+ const models = key.permissions?.models ?? null;
143
+ const text = models === null ? "All models" : `${models.length} model${models.length === 1 ? "" : "s"}`;
144
+ return /* @__PURE__ */ jsx3(Chip, { "data-polli": "key-models", className, children: text });
145
+ }
146
+
147
+ // src/modules/wallet/KeyPrefix.tsx
148
+ import { useAuthState as useAuthState5 } from "@pollinations/sdk/react";
149
+ import { jsxs as jsxs3 } from "react/jsx-runtime";
150
+ function KeyPrefix({ className } = {}) {
151
+ const { apiKey } = useAuthState5();
152
+ if (!apiKey) return null;
153
+ return /* @__PURE__ */ jsxs3(
154
+ Chip,
155
+ {
156
+ "data-polli": "key-prefix",
157
+ className: cn("polli:font-mono polli:select-none", className),
158
+ children: [
159
+ apiKey.slice(0, 7),
160
+ "\u2022\u2022\u2022\u2022\u2022\u2022\u2022\u2022"
161
+ ]
162
+ }
163
+ );
164
+ }
165
+ export {
166
+ Balance,
167
+ KeyBudget,
168
+ KeyExpiry,
169
+ KeyModels,
170
+ KeyPrefix
171
+ };
172
+ //# sourceMappingURL=sdk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/modules/wallet/Balance.tsx","../../src/lib/cn.ts","../../src/primitives/Chip.tsx","../../src/modules/wallet/format-pollen.ts","../../src/modules/wallet/KeyBudget.tsx","../../src/modules/wallet/KeyExpiry.tsx","../../src/modules/wallet/KeyModels.tsx","../../src/modules/wallet/KeyPrefix.tsx"],"sourcesContent":["import { useAccountBalance, useAuthState } from \"@pollinations/sdk/react\";\nimport { cn } from \"../../lib/cn.ts\";\nimport { Chip } from \"../../primitives/Chip.tsx\";\nimport { formatPollen } from \"./format-pollen.ts\";\n\nexport type BalanceProps = { className?: string };\n\n/** Renders the logged-in user's pollen balance. `null` until loaded. */\nexport function Balance({ className }: BalanceProps = {}) {\n const { isLoggedIn } = useAuthState();\n const { data: balance } = useAccountBalance({ enabled: isLoggedIn });\n if (!isLoggedIn || balance == null) return null;\n return (\n <Chip\n data-polli=\"balance\"\n className={cn(\"polli:tabular-nums\", className)}\n >\n {formatPollen(balance.balance)} pollen\n </Chip>\n );\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 { 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","// 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 { useAccountKey, useAuthState } from \"@pollinations/sdk/react\";\nimport { cn } from \"../../lib/cn.ts\";\nimport { Chip } from \"../../primitives/Chip.tsx\";\nimport { formatPollen } from \"./format-pollen.ts\";\n\nexport type KeyBudgetProps = { className?: string };\n\n/** Renders the current delegated key's remaining budget. `null` until loaded. */\nexport function KeyBudget({ className }: KeyBudgetProps = {}) {\n const { isLoggedIn } = useAuthState();\n const { data: key } = useAccountKey({ enabled: isLoggedIn });\n const budget = key?.pollenBudget;\n if (!isLoggedIn || budget == null) return null;\n return (\n <Chip\n data-polli=\"key-budget\"\n className={cn(\"polli:tabular-nums\", className)}\n >\n {formatPollen(budget)} pollen\n </Chip>\n );\n}\n","import { useAccountKey, useAuthState } from \"@pollinations/sdk/react\";\nimport { cn } from \"../../lib/cn.ts\";\nimport { Chip } from \"../../primitives/Chip.tsx\";\n\nexport type KeyExpiryProps = { className?: string };\n\n/** Renders the current delegated key's expiry date (YYYY-MM-DD) or `null`. */\nexport function KeyExpiry({ className }: KeyExpiryProps = {}) {\n const { isLoggedIn } = useAuthState();\n const { data: key } = useAccountKey({ enabled: isLoggedIn });\n if (!isLoggedIn || !key?.expiresAt) return null;\n return (\n <Chip\n data-polli=\"key-expiry\"\n className={cn(\"polli:tabular-nums\", className)}\n >\n {key.expiresAt.slice(0, 10)}\n </Chip>\n );\n}\n","import { useAccountKey, useAuthState } from \"@pollinations/sdk/react\";\nimport { Chip } from \"../../primitives/Chip.tsx\";\n\nexport type KeyModelsProps = { className?: string };\n\n/** Renders \"All models\" or \"N models\" for the current key. `null` until loaded. */\nexport function KeyModels({ className }: KeyModelsProps = {}) {\n const { isLoggedIn } = useAuthState();\n const { data: key } = useAccountKey({ enabled: isLoggedIn });\n if (!isLoggedIn || !key) return null;\n const models = key.permissions?.models ?? null;\n const text =\n models === null\n ? \"All models\"\n : `${models.length} model${models.length === 1 ? \"\" : \"s\"}`;\n return (\n <Chip data-polli=\"key-models\" className={className}>\n {text}\n </Chip>\n );\n}\n","import { useAuthState } from \"@pollinations/sdk/react\";\nimport { cn } from \"../../lib/cn.ts\";\nimport { Chip } from \"../../primitives/Chip.tsx\";\n\nexport type KeyPrefixProps = { className?: string };\n\n/** Renders the first 7 chars of the API key followed by bullets. `null` when logged out. */\nexport function KeyPrefix({ className }: KeyPrefixProps = {}) {\n const { apiKey } = useAuthState();\n if (!apiKey) return null;\n return (\n <Chip\n data-polli=\"key-prefix\"\n className={cn(\"polli:font-mono polli:select-none\", className)}\n >\n {apiKey.slice(0, 7)}\n {\"••••••••\"}\n </Chip>\n );\n}\n"],"mappings":"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","names":["useAuthState","jsxs","useAuthState","useAccountKey","useAuthState","jsx","useAuthState","useAccountKey","useAccountKey","useAuthState","jsx","useAuthState","useAccountKey","useAuthState","jsxs","useAuthState"]}
@@ -0,0 +1,73 @@
1
+ /** biome-ignore-all lint/suspicious/noUnknownAtRules: tailwind handles it */
2
+
3
+ :root {
4
+ --polli-color-paid-pale: oklch(0.93 0.09 95.746);
5
+ --polli-color-paid-soft: oklch(0.85 0.16 95.746);
6
+ --polli-color-paid-deep: #78350f;
7
+ --polli-color-tier-pale: oklch(0.93 0.06 55);
8
+ --polli-color-tier-soft: oklch(0.83 0.13 55);
9
+ --polli-color-tier-deep: #7c3f1e;
10
+ }
11
+
12
+ @theme inline {
13
+ --color-paid-pale: var(--polli-color-paid-pale);
14
+ --color-paid-soft: var(--polli-color-paid-soft);
15
+ --color-paid-deep: var(--polli-color-paid-deep);
16
+ --color-tier-pale: var(--polli-color-tier-pale);
17
+ --color-tier-soft: var(--polli-color-tier-soft);
18
+ --color-tier-deep: var(--polli-color-tier-deep);
19
+ }
20
+
21
+ .polli-wallet-chip-paid {
22
+ background-color: var(--polli-color-paid-pale);
23
+ color: var(--polli-color-paid-deep);
24
+ }
25
+
26
+ .polli-wallet-chip-tier {
27
+ background-color: var(--polli-color-tier-pale);
28
+ color: var(--polli-color-tier-deep);
29
+ }
30
+
31
+ .polli-wallet-panel-paid {
32
+ background-color: color-mix(
33
+ in oklab,
34
+ var(--polli-color-paid-pale) 60%,
35
+ transparent
36
+ );
37
+ color: var(--polli-color-paid-deep);
38
+ }
39
+
40
+ .polli-wallet-panel-tier {
41
+ background-color: color-mix(
42
+ in oklab,
43
+ var(--polli-color-tier-pale) 60%,
44
+ transparent
45
+ );
46
+ color: var(--polli-color-tier-deep);
47
+ }
48
+
49
+ .polli-wallet-dot-paid {
50
+ background-color: var(--polli-color-paid-soft);
51
+ }
52
+
53
+ .polli-wallet-dot-tier {
54
+ background-color: var(--polli-color-tier-soft);
55
+ }
56
+
57
+ .polli-wallet-text-paid {
58
+ color: var(--polli-color-paid-deep);
59
+ }
60
+
61
+ .polli-wallet-text-tier {
62
+ color: var(--polli-color-tier-deep);
63
+ }
64
+
65
+ .polli-wallet-balance-value {
66
+ font-size: 2.25rem;
67
+ }
68
+
69
+ @media (min-width: 640px) {
70
+ .polli-wallet-balance-value {
71
+ font-size: 3rem;
72
+ }
73
+ }