@pollinations/ui 0.1.0-alpha.0 → 0.1.0-alpha.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 (64) hide show
  1. package/README.md +28 -65
  2. package/dist/{Chip-SM52sUbZ.d.cts → Chip-CQCq34kS.d.cts} +1 -1
  3. package/dist/{Chip-C5impfYd.d.ts → Chip-Cj4xG7Te.d.ts} +1 -1
  4. package/dist/{compositions/app-user.cjs → app-user-menu/sdk.cjs} +148 -148
  5. package/dist/app-user-menu/sdk.cjs.map +1 -0
  6. package/dist/{compositions/app-user.js → app-user-menu/sdk.js} +127 -127
  7. package/dist/app-user-menu/sdk.js.map +1 -0
  8. package/dist/app.css +94 -3
  9. package/dist/auth/index.cjs +2 -2
  10. package/dist/auth/index.cjs.map +1 -1
  11. package/dist/auth/index.js +2 -2
  12. package/dist/auth/index.js.map +1 -1
  13. package/dist/{models → gen}/index.cjs +40 -71
  14. package/dist/gen/index.cjs.map +1 -0
  15. package/dist/gen/index.d.cts +35 -0
  16. package/dist/gen/index.d.ts +35 -0
  17. package/dist/{models → gen}/index.js +31 -66
  18. package/dist/gen/index.js.map +1 -0
  19. package/dist/index.cjs +1594 -1142
  20. package/dist/index.cjs.map +1 -1
  21. package/dist/index.d.cts +268 -178
  22. package/dist/index.d.ts +268 -178
  23. package/dist/index.js +1581 -1134
  24. package/dist/index.js.map +1 -1
  25. package/dist/styles.css +1 -1
  26. package/dist/theme-jRPPBmld.d.cts +20 -0
  27. package/dist/theme-jRPPBmld.d.ts +20 -0
  28. package/dist/wallet/index.cjs +4 -4
  29. package/dist/wallet/index.cjs.map +1 -1
  30. package/dist/wallet/index.d.cts +2 -2
  31. package/dist/wallet/index.d.ts +2 -2
  32. package/dist/wallet/index.js +4 -4
  33. package/dist/wallet/index.js.map +1 -1
  34. package/package.json +9 -24
  35. package/dist/Button-BvLF_Km2.d.cts +0 -26
  36. package/dist/Button-DQAZzvyQ.d.ts +0 -26
  37. package/dist/auth/sdk.cjs +0 -221
  38. package/dist/auth/sdk.cjs.map +0 -1
  39. package/dist/auth/sdk.d.cts +0 -53
  40. package/dist/auth/sdk.d.ts +0 -53
  41. package/dist/auth/sdk.js +0 -188
  42. package/dist/auth/sdk.js.map +0 -1
  43. package/dist/compositions/app-user.cjs.map +0 -1
  44. package/dist/compositions/app-user.js.map +0 -1
  45. package/dist/modality/index.cjs +0 -86
  46. package/dist/modality/index.cjs.map +0 -1
  47. package/dist/modality/index.d.cts +0 -26
  48. package/dist/modality/index.d.ts +0 -26
  49. package/dist/modality/index.js +0 -59
  50. package/dist/modality/index.js.map +0 -1
  51. package/dist/models/index.cjs.map +0 -1
  52. package/dist/models/index.d.cts +0 -22
  53. package/dist/models/index.d.ts +0 -22
  54. package/dist/models/index.js.map +0 -1
  55. package/dist/theme-VMRlhqST.d.cts +0 -9
  56. package/dist/theme-VMRlhqST.d.ts +0 -9
  57. package/dist/wallet/sdk.cjs +0 -206
  58. package/dist/wallet/sdk.cjs.map +0 -1
  59. package/dist/wallet/sdk.d.cts +0 -33
  60. package/dist/wallet/sdk.d.ts +0 -33
  61. package/dist/wallet/sdk.js +0 -175
  62. package/dist/wallet/sdk.js.map +0 -1
  63. /package/dist/{compositions/app-user.d.cts → app-user-menu/sdk.d.cts} +0 -0
  64. /package/dist/{compositions/app-user.d.ts → app-user-menu/sdk.d.ts} +0 -0
@@ -1,9 +1,6 @@
1
- // src/compositions/app-user/AppUserMenu.tsx
1
+ // src/modules/app-user-menu/AppUserMenu.tsx
2
2
  import { useAuthActions as useAuthActions2 } from "@pollinations/sdk/react";
3
3
 
4
- // src/modules/auth/LoginButton.tsx
5
- import { useAuthActions, useAuthState } from "@pollinations/sdk/react";
6
-
7
4
  // src/lib/cn.ts
8
5
  import { clsx } from "clsx";
9
6
  import { extendTailwindMerge } from "tailwind-merge";
@@ -12,8 +9,111 @@ function cn(...inputs) {
12
9
  return twMerge(clsx(...inputs));
13
10
  }
14
11
 
15
- // src/primitives/Button.tsx
12
+ // src/primitives/ChevronIcon.tsx
16
13
  import { jsx } from "react/jsx-runtime";
14
+ var ChevronIcon = ({ expanded, className }) => /* @__PURE__ */ jsx(
15
+ "svg",
16
+ {
17
+ "aria-hidden": "true",
18
+ width: "12",
19
+ height: "12",
20
+ viewBox: "0 0 12 12",
21
+ className: cn(
22
+ "polli:shrink-0 polli:transition-transform polli:duration-200 polli:ease-out",
23
+ expanded && "polli:rotate-180",
24
+ className
25
+ ),
26
+ children: /* @__PURE__ */ jsx(
27
+ "path",
28
+ {
29
+ d: "M3 4.5 6 7.5l3-3",
30
+ fill: "none",
31
+ stroke: "currentColor",
32
+ strokeLinecap: "round",
33
+ strokeLinejoin: "round",
34
+ strokeWidth: "1.5"
35
+ }
36
+ )
37
+ }
38
+ );
39
+
40
+ // src/primitives/Dropdown.tsx
41
+ import { Popover } from "@ark-ui/react/popover";
42
+ import { Portal } from "@ark-ui/react/portal";
43
+ import { useState } from "react";
44
+ import { jsx as jsx2, jsxs } from "react/jsx-runtime";
45
+ var DEFAULT_PANEL = "polli:rounded-lg polli:border polli:border-theme-border polli:bg-theme-bg-pale polli:shadow-lg";
46
+ var Dropdown = ({
47
+ theme,
48
+ trigger,
49
+ children,
50
+ align = "start",
51
+ open: openProp,
52
+ onOpenChange,
53
+ className
54
+ }) => {
55
+ const [internalOpen, setInternalOpen] = useState(false);
56
+ const isControlled = openProp !== void 0;
57
+ const open = isControlled ? openProp : internalOpen;
58
+ const setOpen = (next) => {
59
+ if (!isControlled) setInternalOpen(next);
60
+ onOpenChange?.(next);
61
+ };
62
+ return /* @__PURE__ */ jsxs(
63
+ Popover.Root,
64
+ {
65
+ open,
66
+ onOpenChange: (details) => setOpen(details.open),
67
+ positioning: {
68
+ placement: align === "end" ? "bottom-end" : "bottom-start"
69
+ },
70
+ children: [
71
+ /* @__PURE__ */ jsx2(Popover.Trigger, { asChild: true, children: trigger(open) }),
72
+ /* @__PURE__ */ jsx2(Portal, { children: /* @__PURE__ */ jsx2(Popover.Positioner, { children: /* @__PURE__ */ jsx2(
73
+ Popover.Content,
74
+ {
75
+ "data-theme": theme,
76
+ className: cn(
77
+ "polli:z-50 polli:overflow-hidden polli:focus:outline-none",
78
+ DEFAULT_PANEL,
79
+ className
80
+ ),
81
+ children: typeof children === "function" ? children(() => setOpen(false)) : children
82
+ }
83
+ ) }) })
84
+ ]
85
+ }
86
+ );
87
+ };
88
+
89
+ // src/primitives/DropdownItem.tsx
90
+ import { jsx as jsx3 } from "react/jsx-runtime";
91
+ function DropdownItem({
92
+ as,
93
+ className,
94
+ children,
95
+ ...rest
96
+ }) {
97
+ const Component = as || "button";
98
+ return /* @__PURE__ */ jsx3(
99
+ Component,
100
+ {
101
+ ...Component === "button" ? { type: "button" } : void 0,
102
+ ...rest,
103
+ className: cn(
104
+ "polli-control polli:flex polli:w-full polli:cursor-pointer polli:items-center polli:gap-2 polli:rounded-lg polli:bg-transparent polli:px-3 polli:py-2 polli:text-left polli:text-sm polli:font-medium polli:text-theme-text-base polli:no-underline polli:transition-colors polli:hover:bg-theme-bg-hover polli:focus-visible:bg-theme-bg-hover",
105
+ className
106
+ ),
107
+ children
108
+ }
109
+ );
110
+ }
111
+
112
+ // src/modules/auth/LoginButton.tsx
113
+ import { useAuthActions, useAuthState } from "@pollinations/sdk/react";
114
+
115
+ // src/primitives/Button.tsx
116
+ import { jsx as jsx4 } from "react/jsx-runtime";
17
117
  var sizes = {
18
118
  sm: "polli:px-2 polli:pt-0.5 polli:pb-1",
19
119
  md: "polli:px-4 polli:pt-1.5 polli:pb-2",
@@ -50,7 +150,7 @@ function Button({
50
150
  ...buttonProps
51
151
  }) {
52
152
  const Component = as || "button";
53
- return /* @__PURE__ */ jsx(
153
+ return /* @__PURE__ */ jsx4(
54
154
  Component,
55
155
  {
56
156
  "data-theme": intent ? void 0 : theme,
@@ -70,17 +170,17 @@ function Button({
70
170
  }
71
171
 
72
172
  // src/modules/auth/LoginButton.tsx
73
- import { jsx as jsx2 } from "react/jsx-runtime";
173
+ import { jsx as jsx5 } from "react/jsx-runtime";
74
174
  function LoginButton({ children, ...buttonProps }) {
75
175
  const { isLoggedIn } = useAuthState();
76
176
  const { login } = useAuthActions();
77
177
  if (isLoggedIn) return null;
78
- return /* @__PURE__ */ jsx2(Button, { ...buttonProps, onClick: () => login(), children });
178
+ return /* @__PURE__ */ jsx5(Button, { ...buttonProps, onClick: () => login(), children });
79
179
  }
80
180
 
81
181
  // src/modules/auth/UserAvatar.tsx
82
182
  import { useAccountProfile, useAuthState as useAuthState2 } from "@pollinations/sdk/react";
83
- import { jsx as jsx3 } from "react/jsx-runtime";
183
+ import { jsx as jsx6 } from "react/jsx-runtime";
84
184
  var sizeClass = {
85
185
  sm: "polli:w-6 polli:h-6 polli:text-xs",
86
186
  md: "polli:w-9 polli:h-9 polli:text-sm",
@@ -104,7 +204,7 @@ function UserAvatar({ size = "md", className }) {
104
204
  className
105
205
  );
106
206
  if (profile?.image) {
107
- return /* @__PURE__ */ jsx3(
207
+ return /* @__PURE__ */ jsx6(
108
208
  "img",
109
209
  {
110
210
  "data-polli": "user-avatar",
@@ -116,7 +216,7 @@ function UserAvatar({ size = "md", className }) {
116
216
  }
117
217
  const label = profile?.name ? initials(profile.name) : null;
118
218
  if (!label) return null;
119
- return /* @__PURE__ */ jsx3(
219
+ return /* @__PURE__ */ jsx6(
120
220
  "div",
121
221
  {
122
222
  "data-polli": "user-avatar",
@@ -130,41 +230,41 @@ function UserAvatar({ size = "md", className }) {
130
230
 
131
231
  // src/modules/auth/UserName.tsx
132
232
  import { useAccountProfile as useAccountProfile2, useAuthState as useAuthState3 } from "@pollinations/sdk/react";
133
- import { jsx as jsx4 } from "react/jsx-runtime";
233
+ import { jsx as jsx7 } from "react/jsx-runtime";
134
234
  function UserName({ className }) {
135
235
  const { isLoggedIn } = useAuthState3();
136
236
  const { data: profile } = useAccountProfile2({ enabled: isLoggedIn });
137
237
  if (!isLoggedIn || !profile) return null;
138
238
  const display = profile.name || profile.githubUsername;
139
239
  if (!display) return null;
140
- return /* @__PURE__ */ jsx4("span", { "data-polli": "user-name", className, children: display });
240
+ return /* @__PURE__ */ jsx7("span", { "data-polli": "user-name", className, children: display });
141
241
  }
142
242
 
143
243
  // src/modules/auth/WhenLoggedIn.tsx
144
244
  import { useAuthState as useAuthState4 } from "@pollinations/sdk/react";
145
245
  import { Fragment } from "react";
146
- import { jsx as jsx5 } from "react/jsx-runtime";
246
+ import { jsx as jsx8 } from "react/jsx-runtime";
147
247
  function WhenLoggedIn({ children }) {
148
248
  const { isLoggedIn } = useAuthState4();
149
249
  if (!isLoggedIn) return null;
150
- return /* @__PURE__ */ jsx5(Fragment, { children });
250
+ return /* @__PURE__ */ jsx8(Fragment, { children });
151
251
  }
152
252
 
153
253
  // src/modules/auth/WhenLoggedOut.tsx
154
254
  import { useAuthState as useAuthState5 } from "@pollinations/sdk/react";
155
255
  import { Fragment as Fragment2 } from "react";
156
- import { jsx as jsx6 } from "react/jsx-runtime";
256
+ import { jsx as jsx9 } from "react/jsx-runtime";
157
257
  function WhenLoggedOut({ children }) {
158
258
  const { isLoggedIn } = useAuthState5();
159
259
  if (isLoggedIn) return null;
160
- return /* @__PURE__ */ jsx6(Fragment2, { children });
260
+ return /* @__PURE__ */ jsx9(Fragment2, { children });
161
261
  }
162
262
 
163
263
  // src/modules/wallet/Balance.tsx
164
264
  import { useAccountBalance, useAuthState as useAuthState6 } from "@pollinations/sdk/react";
165
265
 
166
266
  // src/primitives/Chip.tsx
167
- import { jsx as jsx7 } from "react/jsx-runtime";
267
+ import { jsx as jsx10 } from "react/jsx-runtime";
168
268
  var chipSizes = {
169
269
  sm: "polli:px-2 polli:py-0.5 polli:text-xs",
170
270
  md: "polli:px-2.5 polli:py-0.5 polli:text-sm",
@@ -173,10 +273,10 @@ var chipSizes = {
173
273
  var intentClasses2 = {
174
274
  news: "polli:bg-intent-news-bg-light polli:text-intent-news-text",
175
275
  alpha: "polli:bg-intent-alpha-bg-light polli:text-intent-alpha-text",
176
- neutral: "polli:border polli:border-gray-400/70 polli:bg-gray-100/80 polli:text-gray-900",
177
- success: "polli:border polli:border-intent-success-border polli:bg-intent-success-bg-light polli:text-intent-success-text",
178
- warning: "polli:border polli:border-intent-warning-border polli:bg-intent-warning-bg-light polli:text-intent-warning-text",
179
- danger: "polli:border polli:border-intent-danger-border polli:bg-intent-danger-bg-light polli:text-intent-danger-text"
276
+ neutral: "polli:bg-ink-100/80 polli:text-ink-900",
277
+ success: "polli:bg-intent-success-bg-light polli:text-intent-success-text",
278
+ warning: "polli:bg-intent-warning-bg-light polli:text-intent-warning-text",
279
+ danger: "polli:bg-intent-danger-bg-light polli:text-intent-danger-text"
180
280
  };
181
281
  var Chip = ({
182
282
  theme,
@@ -187,7 +287,7 @@ var Chip = ({
187
287
  ...rest
188
288
  }) => {
189
289
  const intentClass = intent ? intentClasses2[intent] : "polli:bg-theme-bg-active polli:text-theme-text-strong";
190
- return /* @__PURE__ */ jsx7(
290
+ return /* @__PURE__ */ jsx10(
191
291
  "span",
192
292
  {
193
293
  ...rest,
@@ -233,12 +333,12 @@ function formatPollen(value) {
233
333
  }
234
334
 
235
335
  // src/modules/wallet/Balance.tsx
236
- import { jsxs } from "react/jsx-runtime";
336
+ import { jsxs as jsxs2 } from "react/jsx-runtime";
237
337
  function Balance({ className } = {}) {
238
338
  const { isLoggedIn } = useAuthState6();
239
339
  const { data: balance } = useAccountBalance({ enabled: isLoggedIn });
240
340
  if (!isLoggedIn || balance == null) return null;
241
- return /* @__PURE__ */ jsxs(
341
+ return /* @__PURE__ */ jsxs2(
242
342
  Chip,
243
343
  {
244
344
  "data-polli": "balance",
@@ -251,107 +351,7 @@ function Balance({ className } = {}) {
251
351
  );
252
352
  }
253
353
 
254
- // src/primitives/ChevronIcon.tsx
255
- import { jsx as jsx8 } from "react/jsx-runtime";
256
- var ChevronIcon = ({ expanded, className }) => /* @__PURE__ */ jsx8(
257
- "svg",
258
- {
259
- "aria-hidden": "true",
260
- width: "12",
261
- height: "12",
262
- viewBox: "0 0 12 12",
263
- className: cn(
264
- "polli:shrink-0 polli:transition-transform polli:duration-200 polli:ease-out",
265
- expanded && "polli:rotate-180",
266
- className
267
- ),
268
- children: /* @__PURE__ */ jsx8(
269
- "path",
270
- {
271
- d: "M3 4.5 6 7.5l3-3",
272
- fill: "none",
273
- stroke: "currentColor",
274
- strokeLinecap: "round",
275
- strokeLinejoin: "round",
276
- strokeWidth: "1.5"
277
- }
278
- )
279
- }
280
- );
281
-
282
- // src/primitives/Dropdown.tsx
283
- import { Popover } from "@ark-ui/react/popover";
284
- import { Portal } from "@ark-ui/react/portal";
285
- import { useState } from "react";
286
- import { jsx as jsx9, jsxs as jsxs2 } from "react/jsx-runtime";
287
- var DEFAULT_PANEL = "polli:rounded-lg polli:border polli:border-theme-border polli:bg-theme-bg-pale polli:shadow-lg";
288
- var Dropdown = ({
289
- theme,
290
- trigger,
291
- children,
292
- align = "start",
293
- open: openProp,
294
- onOpenChange,
295
- className
296
- }) => {
297
- const [internalOpen, setInternalOpen] = useState(false);
298
- const isControlled = openProp !== void 0;
299
- const open = isControlled ? openProp : internalOpen;
300
- const setOpen = (next) => {
301
- if (!isControlled) setInternalOpen(next);
302
- onOpenChange?.(next);
303
- };
304
- return /* @__PURE__ */ jsxs2(
305
- Popover.Root,
306
- {
307
- open,
308
- onOpenChange: (details) => setOpen(details.open),
309
- positioning: {
310
- placement: align === "end" ? "bottom-end" : "bottom-start"
311
- },
312
- children: [
313
- /* @__PURE__ */ jsx9(Popover.Trigger, { asChild: true, children: trigger(open) }),
314
- /* @__PURE__ */ jsx9(Portal, { children: /* @__PURE__ */ jsx9(Popover.Positioner, { children: /* @__PURE__ */ jsx9(
315
- Popover.Content,
316
- {
317
- "data-theme": theme,
318
- className: cn(
319
- "polli:z-50 polli:overflow-hidden polli:focus:outline-none",
320
- DEFAULT_PANEL,
321
- className
322
- ),
323
- children: typeof children === "function" ? children(() => setOpen(false)) : children
324
- }
325
- ) }) })
326
- ]
327
- }
328
- );
329
- };
330
-
331
- // src/primitives/DropdownItem.tsx
332
- import { jsx as jsx10 } from "react/jsx-runtime";
333
- function DropdownItem({
334
- as,
335
- className,
336
- children,
337
- ...rest
338
- }) {
339
- const Component = as || "button";
340
- return /* @__PURE__ */ jsx10(
341
- Component,
342
- {
343
- ...Component === "button" ? { type: "button" } : void 0,
344
- ...rest,
345
- className: cn(
346
- "polli-control polli:flex polli:w-full polli:cursor-pointer polli:items-center polli:gap-2 polli:rounded-lg polli:bg-transparent polli:px-3 polli:py-2 polli:text-left polli:text-sm polli:font-medium polli:text-theme-text-base polli:no-underline polli:transition-colors polli:hover:bg-theme-bg-hover polli:focus-visible:bg-theme-bg-hover",
347
- className
348
- ),
349
- children
350
- }
351
- );
352
- }
353
-
354
- // src/compositions/app-user/AppUserMenu.tsx
354
+ // src/modules/app-user-menu/AppUserMenu.tsx
355
355
  import { jsx as jsx11, jsxs as jsxs3 } from "react/jsx-runtime";
356
356
  var defaultLabels = {
357
357
  authorize: "Authorize app",
@@ -466,4 +466,4 @@ export {
466
466
  AppUserMenu,
467
467
  isEmbeddedContext
468
468
  };
469
- //# sourceMappingURL=app-user.js.map
469
+ //# sourceMappingURL=sdk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/modules/app-user-menu/AppUserMenu.tsx","../../src/lib/cn.ts","../../src/primitives/ChevronIcon.tsx","../../src/primitives/Dropdown.tsx","../../src/primitives/DropdownItem.tsx","../../src/modules/auth/LoginButton.tsx","../../src/primitives/Button.tsx","../../src/modules/auth/UserAvatar.tsx","../../src/modules/auth/UserName.tsx","../../src/modules/auth/WhenLoggedIn.tsx","../../src/modules/auth/WhenLoggedOut.tsx","../../src/modules/wallet/Balance.tsx","../../src/primitives/Chip.tsx","../../src/modules/wallet/format-pollen.ts"],"sourcesContent":["import { useAuthActions } from \"@pollinations/sdk/react\";\nimport { ChevronIcon } from \"../../primitives/ChevronIcon.tsx\";\nimport { Dropdown } from \"../../primitives/Dropdown.tsx\";\nimport { DropdownItem } from \"../../primitives/DropdownItem.tsx\";\nimport {\n LoginButton,\n UserAvatar,\n UserName,\n WhenLoggedIn,\n WhenLoggedOut,\n} from \"../auth/sdk.ts\";\nimport { Balance } from \"../wallet/sdk.ts\";\n\nexport type AppUserMenuLabels = {\n authorize: string;\n appUserMenu: string;\n topUpAccount: string;\n logout: string;\n};\n\nexport type AppUserMenuProps = {\n dashboardHref: string;\n labels?: Partial<AppUserMenuLabels>;\n hiddenWhenEmbedded?: boolean;\n embedQueryParam?: string;\n};\n\nconst defaultLabels: AppUserMenuLabels = {\n authorize: \"Authorize app\",\n appUserMenu: \"App user menu\",\n topUpAccount: \"Top up account\",\n logout: \"Log out from this app\",\n};\n\nexport function isEmbeddedContext(embedQueryParam = \"embed\"): boolean {\n if (typeof window === \"undefined\") return false;\n const search = new URLSearchParams(window.location.search);\n if (search.get(embedQueryParam) === \"1\") return true;\n try {\n return window.self !== window.top;\n } catch {\n return true;\n }\n}\n\nexport function AppUserMenu({\n dashboardHref,\n labels: labelOverrides,\n hiddenWhenEmbedded = false,\n embedQueryParam = \"embed\",\n}: AppUserMenuProps) {\n if (hiddenWhenEmbedded && isEmbeddedContext(embedQueryParam)) return null;\n\n return (\n <AppUserMenuContent\n dashboardHref={dashboardHref}\n labels={labelOverrides}\n />\n );\n}\n\nfunction AppUserMenuContent({\n dashboardHref,\n labels: labelOverrides,\n}: Pick<AppUserMenuProps, \"dashboardHref\" | \"labels\">) {\n const labels = { ...defaultLabels, ...labelOverrides };\n const { logout } = useAuthActions();\n\n return (\n <div data-theme=\"amber\" className=\"polli:flex polli:justify-end\">\n <WhenLoggedOut>\n <LoginButton theme=\"amber\">{labels.authorize}</LoginButton>\n </WhenLoggedOut>\n\n <WhenLoggedIn>\n <Dropdown\n theme=\"amber\"\n align=\"end\"\n className=\"polli:w-64 polli:p-1\"\n trigger={(open) => (\n <button\n type=\"button\"\n data-theme=\"amber\"\n aria-label={labels.appUserMenu}\n className=\"polli-control polli:flex polli:min-w-0 polli:items-center polli:gap-2 polli:rounded-full polli:bg-theme-bg-active polli:py-1 polli:pl-1 polli:pr-3 polli:text-theme-text-base polli:shadow-sm polli:transition-colors polli:hover:bg-theme-bg-hover\"\n >\n <UserAvatar\n size=\"md\"\n className=\"polli:h-8 polli:w-8\"\n />\n <span className=\"polli:flex polli:min-w-0 polli:flex-col polli:items-start polli:leading-tight\">\n <UserName className=\"polli:max-w-32 polli:truncate polli:text-sm polli:font-semibold\" />\n <Balance className=\"polli:bg-transparent polli:px-0 polli:py-0 polli:text-xs polli:text-theme-text-base\" />\n </span>\n <ChevronIcon\n expanded={open}\n className=\"polli:h-4 polli:w-4 polli:text-theme-text-base\"\n />\n </button>\n )}\n >\n {(close) => (\n <div\n data-theme=\"amber\"\n className=\"polli:flex polli:flex-col\"\n >\n <DropdownItem\n as=\"a\"\n href={dashboardHref}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={close}\n >\n {labels.topUpAccount}\n </DropdownItem>\n <DropdownItem\n type=\"button\"\n onClick={() => {\n close();\n logout();\n }}\n >\n {labels.logout}\n </DropdownItem>\n </div>\n )}\n </Dropdown>\n </WhenLoggedIn>\n </div>\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 { FC } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\ntype ChevronIconProps = {\n /** Rotate 180° when expanded/open. */\n expanded?: boolean;\n className?: string;\n};\n\n/**\n * Canonical chevron used for collapsibles, dropdown triggers, and select pills\n * across the app. One icon everywhere.\n */\nexport const ChevronIcon: FC<ChevronIconProps> = ({ expanded, className }) => (\n <svg\n aria-hidden=\"true\"\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 12 12\"\n className={cn(\n \"polli:shrink-0 polli:transition-transform polli:duration-200 polli:ease-out\",\n expanded && \"polli:rotate-180\",\n className,\n )}\n >\n <path\n d=\"M3 4.5 6 7.5l3-3\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth=\"1.5\"\n />\n </svg>\n);\n","import { Popover } from \"@ark-ui/react/popover\";\nimport { Portal } from \"@ark-ui/react/portal\";\nimport type { FC, ReactNode } from \"react\";\nimport { useState } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport type { ThemeName } from \"../theme.ts\";\n\nconst DEFAULT_PANEL =\n \"polli:rounded-lg polli:border polli:border-theme-border polli:bg-theme-bg-pale polli:shadow-lg\";\n\nexport type DropdownProps = {\n theme: ThemeName;\n /** Trigger element; receives the current open state (e.g. to rotate a chevron). */\n trigger: (open: boolean) => ReactNode;\n /** Panel content. As a function, receives `close` to dismiss after a selection. */\n children: ReactNode | ((close: () => void) => ReactNode);\n /** Panel placement relative to the trigger. */\n align?: \"start\" | \"end\";\n /** Controlled open state. Omit to let the Dropdown manage its own. */\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** Appended after the surface (widths, padding, max-height…). */\n className?: string;\n};\n\nexport const Dropdown: FC<DropdownProps> = ({\n theme,\n trigger,\n children,\n align = \"start\",\n open: openProp,\n onOpenChange,\n className,\n}) => {\n const [internalOpen, setInternalOpen] = useState(false);\n const isControlled = openProp !== undefined;\n const open = isControlled ? openProp : internalOpen;\n\n const setOpen = (next: boolean) => {\n if (!isControlled) setInternalOpen(next);\n onOpenChange?.(next);\n };\n\n return (\n <Popover.Root\n open={open}\n onOpenChange={(details) => setOpen(details.open)}\n positioning={{\n placement: align === \"end\" ? \"bottom-end\" : \"bottom-start\",\n }}\n >\n <Popover.Trigger asChild>{trigger(open)}</Popover.Trigger>\n <Portal>\n <Popover.Positioner>\n <Popover.Content\n data-theme={theme}\n className={cn(\n \"polli:z-50 polli:overflow-hidden polli:focus:outline-none\",\n DEFAULT_PANEL,\n className,\n )}\n >\n {typeof children === \"function\"\n ? children(() => setOpen(false))\n : children}\n </Popover.Content>\n </Popover.Positioner>\n </Portal>\n </Popover.Root>\n );\n};\n","import type { PropsWithChildren } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\n\ntype BaseDropdownItemProps = {\n className?: string;\n};\n\nexport type DropdownItemProps<T extends React.ElementType = \"button\"> =\n PropsWithChildren<BaseDropdownItemProps> & {\n as?: T;\n } & Omit<\n React.ComponentPropsWithoutRef<T>,\n keyof BaseDropdownItemProps | \"as\"\n >;\n\nexport function DropdownItem<T extends React.ElementType = \"button\">({\n as,\n className,\n children,\n ...rest\n}: DropdownItemProps<T>) {\n const Component: React.ElementType = as || \"button\";\n return (\n <Component\n {...(Component === \"button\" ? { type: \"button\" } : undefined)}\n {...rest}\n className={cn(\n \"polli-control polli:flex polli:w-full polli:cursor-pointer polli:items-center polli:gap-2 polli:rounded-lg polli:bg-transparent polli:px-3 polli:py-2 polli:text-left polli:text-sm polli:font-medium polli:text-theme-text-base polli:no-underline polli:transition-colors polli:hover:bg-theme-bg-hover polli:focus-visible:bg-theme-bg-hover\",\n className,\n )}\n >\n {children}\n </Component>\n );\n}\n","import { useAuthActions, useAuthState } from \"@pollinations/sdk/react\";\nimport type { ReactNode } from \"react\";\nimport { Button, type ButtonProps } from \"../../primitives/Button.tsx\";\n\nexport type LoginButtonProps = Omit<\n ButtonProps<\"button\">,\n \"as\" | \"onClick\" | \"children\"\n> & {\n children: ReactNode;\n};\n\n/** Button that kicks off the auth redirect. `null` when already logged in. */\nexport function LoginButton({ children, ...buttonProps }: LoginButtonProps) {\n const { isLoggedIn } = useAuthState();\n const { login } = useAuthActions();\n if (isLoggedIn) return null;\n return (\n <Button {...buttonProps} onClick={() => login()}>\n {children}\n </Button>\n );\n}\n","import type { PropsWithChildren } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport type { ThemeName } from \"../theme.ts\";\n\n/** Button only supports `danger`. Label/status color recipes live on Chip. */\ntype ButtonIntent = \"danger\";\n\nconst sizes = {\n sm: \"polli:px-2 polli:pt-0.5 polli:pb-1\",\n md: \"polli:px-4 polli:pt-1.5 polli:pb-2\",\n lg: \"polli:px-6 polli:py-3\",\n} as const;\n\n// Cascade-driven base — reads [data-theme] vars.\nconst themeClasses =\n \"polli:bg-theme-bg-active polli:text-theme-text-base \" +\n \"polli:hover:bg-theme-bg-hover polli:transition-colors\";\n\n// Single intent: danger. Soft recipe — light tile + deep text, slightly\n// deeper bg on hover. No filled CTAs anywhere.\nconst intentClasses: Record<ButtonIntent, string> = {\n danger:\n \"polli:bg-intent-danger-bg-light polli:text-intent-danger-text \" +\n \"polli:hover:bg-intent-danger-bg-hover polli:transition-colors\",\n};\n\ntype BaseButtonProps = {\n /** Override the cascade theme for this button's subtree. Ignored when `intent` is set. */\n theme?: ThemeName;\n /** Only `\"danger\"` for now. */\n intent?: ButtonIntent;\n size?: keyof typeof sizes;\n className?: string;\n disabled?: boolean;\n};\n\nconst buttonClasses = ({\n theme: _theme,\n intent,\n size,\n className,\n disabled,\n}: BaseButtonProps & { disabled?: boolean }) => {\n const colorClasses = intent ? intentClasses[intent] : themeClasses;\n return cn(\n \"polli-control polli:inline-flex polli:items-center polli:justify-center polli:rounded-full polli:self-center polli:font-medium polli:leading-normal polli:box-border\",\n disabled\n ? \"polli:opacity-50 polli:cursor-not-allowed\"\n : \"polli:hover:filter polli:hover:brightness-105 polli:cursor-pointer\",\n colorClasses,\n sizes[size || \"md\"],\n className,\n );\n};\n\nexport type ButtonProps<T extends React.ElementType = \"button\"> =\n PropsWithChildren<BaseButtonProps> & {\n as?: T;\n } & Omit<React.ComponentPropsWithoutRef<T>, keyof BaseButtonProps | \"as\">;\n\nexport function Button<T extends React.ElementType = \"button\">({\n as,\n children,\n theme,\n intent,\n size,\n className,\n disabled,\n ...buttonProps\n}: ButtonProps<T>) {\n const Component: React.ElementType = as || \"button\";\n\n return (\n <Component\n // Cascade override only applies when `intent` is unset.\n data-theme={intent ? undefined : theme}\n data-intent={intent}\n className={buttonClasses({\n theme,\n intent,\n size,\n className,\n disabled,\n })}\n disabled={disabled}\n {...buttonProps}\n >\n {children}\n </Component>\n );\n}\n","import { useAccountProfile, useAuthState } from \"@pollinations/sdk/react\";\nimport { cn } from \"../../lib/cn.ts\";\n\nexport type UserAvatarProps = {\n size?: \"sm\" | \"md\" | \"lg\";\n className?: string;\n};\n\nconst sizeClass = {\n sm: \"polli:w-6 polli:h-6 polli:text-xs\",\n md: \"polli:w-9 polli:h-9 polli:text-sm\",\n lg: \"polli:w-12 polli:h-12 polli:text-base\",\n} as const;\n\nfunction initials(name: string): string | null {\n const parts = name.trim().split(/\\s+/).filter(Boolean);\n if (parts.length === 0) return null;\n if (parts.length === 1) return parts[0].slice(0, 2).toUpperCase() || null;\n const first = parts[0][0] ?? \"\";\n const last = parts[parts.length - 1][0] ?? \"\";\n return (first + last).toUpperCase() || null;\n}\n\n/** Avatar from `profile.image`, or initials from `profile.name`. `null` otherwise. */\nexport function UserAvatar({ size = \"md\", className }: UserAvatarProps) {\n const { isLoggedIn } = useAuthState();\n const { data: profile } = useAccountProfile({ enabled: isLoggedIn });\n if (!isLoggedIn) return null;\n\n const base = cn(\n \"polli:inline-flex polli:items-center polli:justify-center polli:rounded-full polli:overflow-hidden polli:bg-theme-bg-pale polli:text-theme-text-strong polli:font-semibold polli:select-none\",\n sizeClass[size],\n className,\n );\n\n if (profile?.image) {\n return (\n <img\n data-polli=\"user-avatar\"\n src={profile.image}\n alt={profile.name ?? \"\"}\n className={base}\n />\n );\n }\n const label = profile?.name ? initials(profile.name) : null;\n if (!label) return null;\n return (\n <div\n data-polli=\"user-avatar\"\n role=\"img\"\n aria-label={profile?.name ?? undefined}\n className={base}\n >\n {label}\n </div>\n );\n}\n","import { useAccountProfile, useAuthState } from \"@pollinations/sdk/react\";\n\nexport type UserNameProps = { className?: string };\n\n/**\n * Renders the user's display name. Falls back to GitHub username when the\n * `profile` scope was not granted (or `name` is empty). `null` when logged\n * out, or when neither name nor GitHub username is available.\n */\nexport function UserName({ className }: UserNameProps) {\n const { isLoggedIn } = useAuthState();\n const { data: profile } = useAccountProfile({ enabled: isLoggedIn });\n if (!isLoggedIn || !profile) return null;\n const display = profile.name || profile.githubUsername;\n if (!display) return null;\n return (\n <span data-polli=\"user-name\" className={className}>\n {display}\n </span>\n );\n}\n","import { useAuthState } from \"@pollinations/sdk/react\";\nimport { Fragment, type ReactNode } from \"react\";\n\nexport type WhenLoggedInProps = { children: ReactNode };\n\n/** Renders `children` only when a user is signed in. */\nexport function WhenLoggedIn({ children }: WhenLoggedInProps) {\n const { isLoggedIn } = useAuthState();\n if (!isLoggedIn) return null;\n return <Fragment>{children}</Fragment>;\n}\n","import { useAuthState } from \"@pollinations/sdk/react\";\nimport { Fragment, type ReactNode } from \"react\";\n\nexport type WhenLoggedOutProps = { children: ReactNode };\n\n/** Renders `children` only when no user is signed in. */\nexport function WhenLoggedOut({ children }: WhenLoggedOutProps) {\n const { isLoggedIn } = useAuthState();\n if (isLoggedIn) return null;\n return <Fragment>{children}</Fragment>;\n}\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 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-intent-news-bg-light polli:text-intent-news-text\",\n alpha: \"polli:bg-intent-alpha-bg-light polli:text-intent-alpha-text\",\n neutral: \"polli:bg-ink-100/80 polli:text-ink-900\",\n success: \"polli:bg-intent-success-bg-light polli:text-intent-success-text\",\n warning: \"polli:bg-intent-warning-bg-light polli:text-intent-warning-text\",\n danger: \"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","// 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"],"mappings":"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","names":["useAuthActions","jsx","jsx","jsx","jsx","useAuthState","jsx","useAuthState","useAccountProfile","useAuthState","jsx","useAuthState","jsx","useAuthState","Fragment","jsx","useAuthState","jsx","intentClasses","jsxs","useAuthState","jsx","jsxs","useAuthActions"]}
package/dist/app.css CHANGED
@@ -5,6 +5,8 @@
5
5
  /* Tailwind utility surface for Pollinations UI app classes.
6
6
  Values stay anchored to package-owned `--polli-*` tokens. */
7
7
  @theme inline {
8
+ --color-*: initial;
9
+
8
10
  --font-heading: var(--polli-font-heading);
9
11
  --font-subheading: var(--polli-font-subheading);
10
12
  --font-body: var(--polli-font-body);
@@ -12,6 +14,24 @@
12
14
  --text-micro: var(--polli-text-micro);
13
15
  --text-base: var(--polli-text-base);
14
16
 
17
+ --color-transparent: transparent;
18
+ --color-current: currentColor;
19
+ --color-inherit: inherit;
20
+
21
+ --color-brand-dark: var(--polli-color-brand-dark);
22
+
23
+ --color-ink-50: var(--polli-color-ink-50);
24
+ --color-ink-100: var(--polli-color-ink-100);
25
+ --color-ink-200: var(--polli-color-ink-200);
26
+ --color-ink-300: var(--polli-color-ink-300);
27
+ --color-ink-400: var(--polli-color-ink-400);
28
+ --color-ink-500: var(--polli-color-ink-500);
29
+ --color-ink-600: var(--polli-color-ink-600);
30
+ --color-ink-700: var(--polli-color-ink-700);
31
+ --color-ink-800: var(--polli-color-ink-800);
32
+ --color-ink-900: var(--polli-color-ink-900);
33
+ --color-ink-950: var(--polli-color-ink-950);
34
+
15
35
  --color-theme-text-base: var(--polli-color-text-base);
16
36
  --color-theme-text-strong: var(--polli-color-text-strong);
17
37
  --color-theme-text-soft: var(--polli-color-text-soft);
@@ -23,9 +43,80 @@
23
43
  --color-theme-bg-pale: var(--polli-color-bg-pale);
24
44
 
25
45
  --color-intent-danger-bg-light: var(--polli-color-danger-bg-light);
46
+ --color-intent-danger-bg-hover: var(--polli-color-danger-bg-hover);
26
47
  --color-intent-danger-text: var(--polli-color-danger-text);
27
48
  --color-intent-danger-border: var(--polli-color-danger-border);
28
- --color-surface-white: var(--polli-color-surface-white);
49
+ --color-intent-danger-50: var(--polli-color-danger-bg-light);
50
+ --color-intent-danger-200: var(--polli-color-danger-border);
51
+ --color-intent-danger-500: var(--polli-color-danger-text);
52
+ --color-intent-danger-600: var(--polli-color-danger-text);
53
+ --color-intent-danger-700: var(--polli-color-danger-text);
54
+ --color-intent-danger-800: var(--polli-color-danger-text);
55
+
56
+ --color-intent-success-bg-light: var(--polli-color-success-bg-light);
57
+ --color-intent-success-text: var(--polli-color-success-text);
58
+ --color-intent-success-100: var(--polli-color-success-bg-light);
59
+ --color-intent-success-600: var(--polli-color-success-text);
60
+ --color-intent-success-700: var(--polli-color-success-text);
61
+ --color-intent-success-800: var(--polli-color-success-text);
62
+
63
+ --color-intent-warning-bg-light: var(--polli-color-warning-bg-light);
64
+ --color-intent-warning-text: var(--polli-color-warning-text);
65
+
66
+ --color-intent-news-bg-light: var(--polli-color-news-bg-light);
67
+ --color-intent-news-text: var(--polli-color-news-text);
68
+
69
+ --color-intent-alpha-bg-light: var(--polli-color-alpha-bg-light);
70
+ --color-intent-alpha-text: var(--polli-color-alpha-text);
71
+
72
+ --color-surface-opaque: var(--polli-color-surface-opaque);
73
+ --color-surface-translucent: var(--polli-color-surface-translucent);
74
+ --color-surface-white: var(--polli-color-surface-translucent);
75
+
76
+ --color-accent-amber-50: var(--polli-color-accent-amber-50);
77
+ --color-accent-amber-100: var(--polli-color-accent-amber-100);
78
+ --color-accent-amber-200: var(--polli-color-accent-amber-200);
79
+ --color-accent-amber-300: var(--polli-color-accent-amber-300);
80
+ --color-accent-amber-400: var(--polli-color-accent-amber-400);
81
+ --color-accent-amber-500: var(--polli-color-accent-amber-500);
82
+ --color-accent-amber-600: var(--polli-color-accent-amber-600);
83
+ --color-accent-amber-700: var(--polli-color-accent-amber-700);
84
+ --color-accent-amber-800: var(--polli-color-accent-amber-800);
85
+ --color-accent-amber-900: var(--polli-color-accent-amber-900);
86
+ --color-accent-amber-950: var(--polli-color-accent-amber-950);
87
+
88
+ --color-accent-blue-50: var(--polli-color-accent-blue-50);
89
+ --color-accent-blue-100: var(--polli-color-accent-blue-100);
90
+ --color-accent-blue-200: var(--polli-color-accent-blue-200);
91
+ --color-accent-blue-300: var(--polli-color-accent-blue-300);
92
+ --color-accent-blue-400: var(--polli-color-accent-blue-400);
93
+ --color-accent-blue-500: var(--polli-color-accent-blue-500);
94
+ --color-accent-blue-600: var(--polli-color-accent-blue-600);
95
+ --color-accent-blue-700: var(--polli-color-accent-blue-700);
96
+ --color-accent-blue-800: var(--polli-color-accent-blue-800);
97
+ --color-accent-blue-900: var(--polli-color-accent-blue-900);
98
+ --color-accent-blue-950: var(--polli-color-accent-blue-950);
99
+
100
+ --color-accent-emerald-100: var(--polli-color-accent-emerald-100);
101
+ --color-accent-emerald-600: var(--polli-color-accent-emerald-600);
102
+
103
+ --color-accent-teal-100: var(--polli-color-accent-teal-100);
104
+ --color-accent-teal-200: var(--polli-color-accent-teal-200);
105
+ --color-accent-teal-700: var(--polli-color-accent-teal-700);
106
+
107
+ --color-accent-violet-100: var(--polli-color-accent-violet-100);
108
+ --color-accent-violet-300: var(--polli-color-accent-violet-300);
109
+ --color-accent-violet-400: var(--polli-color-accent-violet-400);
110
+ --color-accent-violet-600: var(--polli-color-accent-violet-600);
111
+ --color-accent-violet-700: var(--polli-color-accent-violet-700);
112
+ --color-accent-violet-800: var(--polli-color-accent-violet-800);
113
+ --color-accent-violet-950: var(--polli-color-accent-violet-950);
114
+
115
+ --color-accent-purple-600: var(--polli-color-accent-purple-600);
116
+ --color-accent-purple-700: var(--polli-color-accent-purple-700);
117
+ --color-accent-purple-800: var(--polli-color-accent-purple-800);
118
+
119
+ --color-accent-pink-500: var(--polli-color-accent-pink-500);
29
120
  }
30
121
 
31
122
  @layer base {
@@ -41,12 +132,12 @@
41
132
  }
42
133
 
43
134
  html.polli-ui-root * {
44
- @apply border-gray-800;
135
+ @apply border-ink-800;
45
136
  }
46
137
 
47
138
  body.polli-ui-body {
48
139
  max-width: 800px;
49
- @apply mx-auto min-h-screen overflow-x-hidden bg-emerald-100 px-4 pt-4 pb-8 font-body font-medium text-base text-green-950 sm:px-6 md:px-8;
140
+ @apply mx-auto min-h-screen overflow-x-hidden bg-theme-bg-pale px-4 pt-4 pb-8 font-body font-medium text-base text-theme-text-strong sm:px-6 md:px-8;
50
141
  }
51
142
 
52
143
  html.polli-ui-shell,
@@ -90,7 +90,7 @@ var Dialog = ({
90
90
  import_dialog.Dialog.Backdrop,
91
91
  {
92
92
  className: cn(
93
- "polli:fixed polli:inset-0 polli:z-[100] polli:bg-gray-950/50",
93
+ "polli:fixed polli:inset-0 polli:z-[100] polli:bg-ink-950/50",
94
94
  backdropClassName
95
95
  )
96
96
  }
@@ -111,7 +111,7 @@ var Dialog = ({
111
111
  "aria-label": ariaLabel,
112
112
  "aria-labelledby": labelledBy,
113
113
  className: cn(
114
- "polli:my-auto polli:w-full polli:overflow-hidden polli:rounded-lg polli:border-2 polli:border-theme-border polli:bg-white polli:shadow-lg polli:outline-none polli:focus:outline-none polli:focus-visible:outline-none",
114
+ "polli:my-auto polli:w-full polli:overflow-hidden polli:rounded-lg polli:border-2 polli:border-theme-border polli:bg-surface-opaque polli:shadow-lg polli:outline-none polli:focus:outline-none polli:focus-visible:outline-none",
115
115
  sizeClasses[size],
116
116
  contentClassName
117
117
  ),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/modules/auth/index.ts","../../src/primitives/Dialog.tsx","../../src/lib/cn.ts","../../src/modules/auth/AuthModal.tsx"],"sourcesContent":["export {\n AuthInfoCard,\n type AuthInfoCardProps,\n AuthModal,\n AuthModalHeader,\n type AuthModalHeaderProps,\n AuthModalLoading,\n type AuthModalProps,\n ErrorBanner,\n} from \"./AuthModal.tsx\";\n","import { Dialog as ArkDialog } from \"@ark-ui/react/dialog\";\nimport { Portal } from \"@ark-ui/react/portal\";\nimport type { FC, ReactNode } from \"react\";\nimport { useRef } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport type { ThemeName } from \"../theme.ts\";\n\nconst sizeClasses = {\n sm: \"polli:max-w-md\",\n md: \"polli:max-w-xl\",\n lg: \"polli:max-w-2xl\",\n} as const;\n\nexport type DialogProps = {\n open: boolean;\n onOpenChange?: (open: boolean) => void;\n trigger?: ReactNode;\n triggerAsChild?: boolean;\n triggerClassName?: string;\n title?: ReactNode;\n titleClassName?: string;\n ariaLabel?: string;\n labelledBy?: string;\n theme?: ThemeName;\n size?: keyof typeof sizeClasses;\n showBackdrop?: boolean;\n backdropClassName?: string;\n positionerClassName?: string;\n contentClassName?: string;\n children: ReactNode;\n};\n\nexport const Dialog: FC<DialogProps> = ({\n open,\n onOpenChange,\n trigger,\n triggerAsChild = false,\n triggerClassName,\n title,\n titleClassName,\n ariaLabel,\n labelledBy,\n theme = \"blue\",\n size = \"md\",\n showBackdrop = true,\n backdropClassName,\n positionerClassName,\n contentClassName,\n children,\n}) => {\n const contentRef = useRef<HTMLDivElement>(null);\n\n return (\n <ArkDialog.Root\n open={open}\n initialFocusEl={() => contentRef.current}\n onOpenChange={(details) => onOpenChange?.(details.open)}\n >\n {trigger && (\n <ArkDialog.Trigger\n asChild={triggerAsChild}\n className={triggerClassName}\n >\n {trigger}\n </ArkDialog.Trigger>\n )}\n <Portal>\n {showBackdrop && (\n <ArkDialog.Backdrop\n className={cn(\n \"polli:fixed polli:inset-0 polli:z-[100] polli:bg-gray-950/50\",\n backdropClassName,\n )}\n />\n )}\n <ArkDialog.Positioner\n data-theme={theme}\n className={cn(\n \"polli:fixed polli:inset-0 polli:z-[110] polli:flex polli:h-dvh polli:items-start polli:justify-center polli:overflow-hidden polli:p-4\",\n positionerClassName,\n )}\n >\n <ArkDialog.Content\n ref={contentRef}\n data-theme={theme}\n aria-label={ariaLabel}\n aria-labelledby={labelledBy}\n className={cn(\n \"polli:my-auto polli:w-full polli:overflow-hidden polli:rounded-lg polli:border-2 polli:border-theme-border polli:bg-white polli:shadow-lg polli:outline-none polli:focus:outline-none polli:focus-visible:outline-none\",\n sizeClasses[size],\n contentClassName,\n )}\n >\n {title && (\n <DialogTitle\n className={cn(\n \"polli:px-6 polli:pt-6 polli:font-subheading polli:text-xl polli:text-theme-text-strong\",\n titleClassName,\n )}\n >\n {title}\n </DialogTitle>\n )}\n {children}\n </ArkDialog.Content>\n </ArkDialog.Positioner>\n </Portal>\n </ArkDialog.Root>\n );\n};\n\nexport const DialogTitle = ArkDialog.Title;\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 { CSSProperties, ReactNode } from \"react\";\nimport logoUrl from \"../../assets/logo.svg\";\nimport { Dialog } from \"../../primitives/Dialog.tsx\";\n\nconst authLogoMaskUrl = `url('${logoUrl}')`;\n\nconst authLogoMask: CSSProperties = {\n WebkitMaskImage: authLogoMaskUrl,\n WebkitMaskPosition: \"center\",\n WebkitMaskRepeat: \"no-repeat\",\n WebkitMaskSize: \"contain\",\n maskImage: authLogoMaskUrl,\n maskPosition: \"center\",\n maskRepeat: \"no-repeat\",\n maskSize: \"contain\",\n};\n\nexport type AuthModalProps = {\n children: ReactNode;\n dialog?: {\n label?: string;\n labelledBy?: string;\n };\n tone?: \"default\" | \"error\";\n};\n\nexport function AuthModal({\n children,\n dialog,\n tone = \"default\",\n}: AuthModalProps) {\n const borderClass =\n tone === \"error\"\n ? \"polli:border-intent-danger-border\"\n : \"polli:border-theme-border\";\n return (\n <Dialog\n open\n theme=\"amber\"\n showBackdrop={false}\n ariaLabel={dialog?.label}\n labelledBy={dialog?.labelledBy}\n positionerClassName=\"polli:items-start polli:overflow-y-auto polli:bg-theme-bg-pale\"\n contentClassName={`polli:bg-surface-white polli:border-2 ${borderClass} polli:rounded-lg polli:shadow-lg polli:max-w-xl polli:w-full polli:my-auto`}\n >\n {children}\n </Dialog>\n );\n}\n\nexport type AuthModalHeaderProps = {\n children?: ReactNode;\n};\n\nexport function AuthModalHeader({ children }: AuthModalHeaderProps) {\n const logo = (\n <a\n href=\"https://pollinations.ai\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n tabIndex={-1}\n className=\"polli:block polli:shrink-0 polli:text-theme-text-strong polli:focus:outline-none\"\n aria-label=\"pollinations.ai\"\n >\n <span className=\"polli:sr-only\">pollinations.ai</span>\n <span\n aria-hidden=\"true\"\n className=\"polli:block polli:h-8 polli:w-8 polli:bg-current\"\n style={authLogoMask}\n />\n </a>\n );\n if (!children) {\n return (\n <div className=\"polli:flex polli:justify-start polli:px-6 polli:pt-6\">\n {logo}\n </div>\n );\n }\n return (\n <div className=\"polli:px-6 polli:pt-6 polli:pb-2\">\n <div className=\"polli:flex polli:items-center polli:justify-between polli:gap-3\">\n {logo}\n {children}\n </div>\n </div>\n );\n}\n\nexport function AuthModalLoading() {\n return (\n <AuthModal>\n <AuthModalHeader />\n <div className=\"polli:px-8 polli:pt-2 polli:pb-8 polli:text-center\">\n <p className=\"polli:text-theme-text-strong\">Loading...</p>\n </div>\n </AuthModal>\n );\n}\n\nexport function ErrorBanner({ children }: { children: ReactNode }) {\n return (\n <div className=\"polli:rounded-lg polli:border-2 polli:border-intent-danger-border polli:bg-intent-danger-bg-light polli:p-4\">\n <p className=\"polli:text-sm polli:text-intent-danger-text\">\n {children}\n </p>\n </div>\n );\n}\n\nexport type AuthInfoCardProps = {\n title?: string;\n children: ReactNode;\n};\n\nexport function AuthInfoCard({\n title = \"Authorize\",\n children,\n}: AuthInfoCardProps) {\n return (\n <div className=\"polli:rounded-lg polli:border-2 polli:border-theme-border polli:bg-theme-bg-pale polli:p-4\">\n <p className=\"polli:mb-2 polli:font-body polli:text-xs polli:font-semibold polli:tracking-wide polli:text-theme-text-soft\">\n {title}\n </p>\n {children}\n </div>\n );\n}\n"],"mappings":"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","names":["ArkDialog","import_jsx_runtime"]}
1
+ {"version":3,"sources":["../../src/modules/auth/index.ts","../../src/primitives/Dialog.tsx","../../src/lib/cn.ts","../../src/modules/auth/AuthModal.tsx"],"sourcesContent":["export {\n AuthInfoCard,\n type AuthInfoCardProps,\n AuthModal,\n AuthModalHeader,\n type AuthModalHeaderProps,\n AuthModalLoading,\n type AuthModalProps,\n ErrorBanner,\n} from \"./AuthModal.tsx\";\n","import { Dialog as ArkDialog } from \"@ark-ui/react/dialog\";\nimport { Portal } from \"@ark-ui/react/portal\";\nimport type { FC, ReactNode } from \"react\";\nimport { useRef } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport type { ThemeName } from \"../theme.ts\";\n\nconst sizeClasses = {\n sm: \"polli:max-w-md\",\n md: \"polli:max-w-xl\",\n lg: \"polli:max-w-2xl\",\n} as const;\n\nexport type DialogProps = {\n open: boolean;\n onOpenChange?: (open: boolean) => void;\n trigger?: ReactNode;\n triggerAsChild?: boolean;\n triggerClassName?: string;\n title?: ReactNode;\n titleClassName?: string;\n ariaLabel?: string;\n labelledBy?: string;\n theme?: ThemeName;\n size?: keyof typeof sizeClasses;\n showBackdrop?: boolean;\n backdropClassName?: string;\n positionerClassName?: string;\n contentClassName?: string;\n children: ReactNode;\n};\n\nexport const Dialog: FC<DialogProps> = ({\n open,\n onOpenChange,\n trigger,\n triggerAsChild = false,\n triggerClassName,\n title,\n titleClassName,\n ariaLabel,\n labelledBy,\n theme = \"blue\",\n size = \"md\",\n showBackdrop = true,\n backdropClassName,\n positionerClassName,\n contentClassName,\n children,\n}) => {\n const contentRef = useRef<HTMLDivElement>(null);\n\n return (\n <ArkDialog.Root\n open={open}\n initialFocusEl={() => contentRef.current}\n onOpenChange={(details) => onOpenChange?.(details.open)}\n >\n {trigger && (\n <ArkDialog.Trigger\n asChild={triggerAsChild}\n className={triggerClassName}\n >\n {trigger}\n </ArkDialog.Trigger>\n )}\n <Portal>\n {showBackdrop && (\n <ArkDialog.Backdrop\n className={cn(\n \"polli:fixed polli:inset-0 polli:z-[100] polli:bg-ink-950/50\",\n backdropClassName,\n )}\n />\n )}\n <ArkDialog.Positioner\n data-theme={theme}\n className={cn(\n \"polli:fixed polli:inset-0 polli:z-[110] polli:flex polli:h-dvh polli:items-start polli:justify-center polli:overflow-hidden polli:p-4\",\n positionerClassName,\n )}\n >\n <ArkDialog.Content\n ref={contentRef}\n data-theme={theme}\n aria-label={ariaLabel}\n aria-labelledby={labelledBy}\n className={cn(\n \"polli:my-auto polli:w-full polli:overflow-hidden polli:rounded-lg polli:border-2 polli:border-theme-border polli:bg-surface-opaque polli:shadow-lg polli:outline-none polli:focus:outline-none polli:focus-visible:outline-none\",\n sizeClasses[size],\n contentClassName,\n )}\n >\n {title && (\n <DialogTitle\n className={cn(\n \"polli:px-6 polli:pt-6 polli:font-subheading polli:text-xl polli:text-theme-text-strong\",\n titleClassName,\n )}\n >\n {title}\n </DialogTitle>\n )}\n {children}\n </ArkDialog.Content>\n </ArkDialog.Positioner>\n </Portal>\n </ArkDialog.Root>\n );\n};\n\nexport const DialogTitle = ArkDialog.Title;\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 { CSSProperties, ReactNode } from \"react\";\nimport logoUrl from \"../../assets/logo.svg\";\nimport { Dialog } from \"../../primitives/Dialog.tsx\";\n\nconst authLogoMaskUrl = `url('${logoUrl}')`;\n\nconst authLogoMask: CSSProperties = {\n WebkitMaskImage: authLogoMaskUrl,\n WebkitMaskPosition: \"center\",\n WebkitMaskRepeat: \"no-repeat\",\n WebkitMaskSize: \"contain\",\n maskImage: authLogoMaskUrl,\n maskPosition: \"center\",\n maskRepeat: \"no-repeat\",\n maskSize: \"contain\",\n};\n\nexport type AuthModalProps = {\n children: ReactNode;\n dialog?: {\n label?: string;\n labelledBy?: string;\n };\n tone?: \"default\" | \"error\";\n};\n\nexport function AuthModal({\n children,\n dialog,\n tone = \"default\",\n}: AuthModalProps) {\n const borderClass =\n tone === \"error\"\n ? \"polli:border-intent-danger-border\"\n : \"polli:border-theme-border\";\n return (\n <Dialog\n open\n theme=\"amber\"\n showBackdrop={false}\n ariaLabel={dialog?.label}\n labelledBy={dialog?.labelledBy}\n positionerClassName=\"polli:items-start polli:overflow-y-auto polli:bg-theme-bg-pale\"\n contentClassName={`polli:bg-surface-white polli:border-2 ${borderClass} polli:rounded-lg polli:shadow-lg polli:max-w-xl polli:w-full polli:my-auto`}\n >\n {children}\n </Dialog>\n );\n}\n\nexport type AuthModalHeaderProps = {\n children?: ReactNode;\n};\n\nexport function AuthModalHeader({ children }: AuthModalHeaderProps) {\n const logo = (\n <a\n href=\"https://pollinations.ai\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n tabIndex={-1}\n className=\"polli:block polli:shrink-0 polli:text-theme-text-strong polli:focus:outline-none\"\n aria-label=\"pollinations.ai\"\n >\n <span className=\"polli:sr-only\">pollinations.ai</span>\n <span\n aria-hidden=\"true\"\n className=\"polli:block polli:h-8 polli:w-8 polli:bg-current\"\n style={authLogoMask}\n />\n </a>\n );\n if (!children) {\n return (\n <div className=\"polli:flex polli:justify-start polli:px-6 polli:pt-6\">\n {logo}\n </div>\n );\n }\n return (\n <div className=\"polli:px-6 polli:pt-6 polli:pb-2\">\n <div className=\"polli:flex polli:items-center polli:justify-between polli:gap-3\">\n {logo}\n {children}\n </div>\n </div>\n );\n}\n\nexport function AuthModalLoading() {\n return (\n <AuthModal>\n <AuthModalHeader />\n <div className=\"polli:px-8 polli:pt-2 polli:pb-8 polli:text-center\">\n <p className=\"polli:text-theme-text-strong\">Loading...</p>\n </div>\n </AuthModal>\n );\n}\n\nexport function ErrorBanner({ children }: { children: ReactNode }) {\n return (\n <div className=\"polli:rounded-lg polli:border-2 polli:border-intent-danger-border polli:bg-intent-danger-bg-light polli:p-4\">\n <p className=\"polli:text-sm polli:text-intent-danger-text\">\n {children}\n </p>\n </div>\n );\n}\n\nexport type AuthInfoCardProps = {\n title?: string;\n children: ReactNode;\n};\n\nexport function AuthInfoCard({\n title = \"Authorize\",\n children,\n}: AuthInfoCardProps) {\n return (\n <div className=\"polli:rounded-lg polli:border-2 polli:border-theme-border polli:bg-theme-bg-pale polli:p-4\">\n <p className=\"polli:mb-2 polli:font-body polli:text-xs polli:font-semibold polli:tracking-wide polli:text-theme-text-soft\">\n {title}\n </p>\n {children}\n </div>\n );\n}\n"],"mappings":"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","names":["ArkDialog","import_jsx_runtime"]}