@pollinations/ui 0.0.2 → 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 (59) hide show
  1. package/README.md +38 -71
  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/app-user-menu/sdk.cjs +497 -0
  5. package/dist/app-user-menu/sdk.cjs.map +1 -0
  6. package/dist/app-user-menu/sdk.d.cts +18 -0
  7. package/dist/app-user-menu/sdk.d.ts +18 -0
  8. package/dist/app-user-menu/sdk.js +469 -0
  9. package/dist/app-user-menu/sdk.js.map +1 -0
  10. package/dist/app.css +94 -3
  11. package/dist/auth/index.cjs +77 -62
  12. package/dist/auth/index.cjs.map +1 -1
  13. package/dist/auth/index.js +77 -62
  14. package/dist/auth/index.js.map +1 -1
  15. package/dist/gen/index.cjs +477 -0
  16. package/dist/gen/index.cjs.map +1 -0
  17. package/dist/gen/index.d.cts +35 -0
  18. package/dist/gen/index.d.ts +35 -0
  19. package/dist/gen/index.js +451 -0
  20. package/dist/gen/index.js.map +1 -0
  21. package/dist/index.cjs +1875 -761
  22. package/dist/index.cjs.map +1 -1
  23. package/dist/index.d.cts +294 -109
  24. package/dist/index.d.ts +294 -109
  25. package/dist/index.js +1889 -798
  26. package/dist/index.js.map +1 -1
  27. package/dist/styles.css +1 -1
  28. package/dist/theme-jRPPBmld.d.cts +20 -0
  29. package/dist/theme-jRPPBmld.d.ts +20 -0
  30. package/dist/wallet/index.cjs +17 -8
  31. package/dist/wallet/index.cjs.map +1 -1
  32. package/dist/wallet/index.d.cts +2 -2
  33. package/dist/wallet/index.d.ts +2 -2
  34. package/dist/wallet/index.js +17 -8
  35. package/dist/wallet/index.js.map +1 -1
  36. package/package.json +15 -18
  37. package/dist/Button-Bn8pGg6N.d.ts +0 -26
  38. package/dist/Button-CWUBCiIc.d.cts +0 -26
  39. package/dist/auth/sdk.cjs +0 -220
  40. package/dist/auth/sdk.cjs.map +0 -1
  41. package/dist/auth/sdk.d.cts +0 -53
  42. package/dist/auth/sdk.d.ts +0 -53
  43. package/dist/auth/sdk.js +0 -187
  44. package/dist/auth/sdk.js.map +0 -1
  45. package/dist/modality/index.cjs +0 -83
  46. package/dist/modality/index.cjs.map +0 -1
  47. package/dist/modality/index.d.cts +0 -25
  48. package/dist/modality/index.d.ts +0 -25
  49. package/dist/modality/index.js +0 -56
  50. package/dist/modality/index.js.map +0 -1
  51. package/dist/theme-VMRlhqST.d.cts +0 -9
  52. package/dist/theme-VMRlhqST.d.ts +0 -9
  53. package/dist/wallet/sdk.cjs +0 -206
  54. package/dist/wallet/sdk.cjs.map +0 -1
  55. package/dist/wallet/sdk.d.cts +0 -33
  56. package/dist/wallet/sdk.d.ts +0 -33
  57. package/dist/wallet/sdk.js +0 -175
  58. package/dist/wallet/sdk.js.map +0 -1
  59. package/dist/wallet.css +0 -73
@@ -0,0 +1,451 @@
1
+ // src/lib/cn.ts
2
+ import { clsx } from "clsx";
3
+ import { extendTailwindMerge } from "tailwind-merge";
4
+ var twMerge = extendTailwindMerge({ prefix: "polli" });
5
+ function cn(...inputs) {
6
+ return twMerge(clsx(...inputs));
7
+ }
8
+
9
+ // src/primitives/Button.tsx
10
+ import { jsx } from "react/jsx-runtime";
11
+ var sizes = {
12
+ sm: "polli:px-2 polli:pt-0.5 polli:pb-1",
13
+ md: "polli:px-4 polli:pt-1.5 polli:pb-2",
14
+ lg: "polli:px-6 polli:py-3"
15
+ };
16
+ var themeClasses = "polli:bg-theme-bg-active polli:text-theme-text-base polli:hover:bg-theme-bg-hover polli:transition-colors";
17
+ var intentClasses = {
18
+ danger: "polli:bg-intent-danger-bg-light polli:text-intent-danger-text polli:hover:bg-intent-danger-bg-hover polli:transition-colors"
19
+ };
20
+ var buttonClasses = ({
21
+ theme: _theme,
22
+ intent,
23
+ size,
24
+ className,
25
+ disabled
26
+ }) => {
27
+ const colorClasses = intent ? intentClasses[intent] : themeClasses;
28
+ return cn(
29
+ "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",
30
+ disabled ? "polli:opacity-50 polli:cursor-not-allowed" : "polli:hover:filter polli:hover:brightness-105 polli:cursor-pointer",
31
+ colorClasses,
32
+ sizes[size || "md"],
33
+ className
34
+ );
35
+ };
36
+ function Button({
37
+ as,
38
+ children,
39
+ theme,
40
+ intent,
41
+ size,
42
+ className,
43
+ disabled,
44
+ ...buttonProps
45
+ }) {
46
+ const Component = as || "button";
47
+ return /* @__PURE__ */ jsx(
48
+ Component,
49
+ {
50
+ "data-theme": intent ? void 0 : theme,
51
+ "data-intent": intent,
52
+ className: buttonClasses({
53
+ theme,
54
+ intent,
55
+ size,
56
+ className,
57
+ disabled
58
+ }),
59
+ disabled,
60
+ ...buttonProps,
61
+ children
62
+ }
63
+ );
64
+ }
65
+
66
+ // src/primitives/ChevronIcon.tsx
67
+ import { jsx as jsx2 } from "react/jsx-runtime";
68
+ var ChevronIcon = ({ expanded, className }) => /* @__PURE__ */ jsx2(
69
+ "svg",
70
+ {
71
+ "aria-hidden": "true",
72
+ width: "12",
73
+ height: "12",
74
+ viewBox: "0 0 12 12",
75
+ className: cn(
76
+ "polli:shrink-0 polli:transition-transform polli:duration-200 polli:ease-out",
77
+ expanded && "polli:rotate-180",
78
+ className
79
+ ),
80
+ children: /* @__PURE__ */ jsx2(
81
+ "path",
82
+ {
83
+ d: "M3 4.5 6 7.5l3-3",
84
+ fill: "none",
85
+ stroke: "currentColor",
86
+ strokeLinecap: "round",
87
+ strokeLinejoin: "round",
88
+ strokeWidth: "1.5"
89
+ }
90
+ )
91
+ }
92
+ );
93
+
94
+ // src/primitives/Chip.tsx
95
+ import { jsx as jsx3 } from "react/jsx-runtime";
96
+ var chipSizes = {
97
+ sm: "polli:px-2 polli:py-0.5 polli:text-xs",
98
+ md: "polli:px-2.5 polli:py-0.5 polli:text-sm",
99
+ lg: "polli:px-3 polli:py-1 polli:text-sm"
100
+ };
101
+ var intentClasses2 = {
102
+ news: "polli:bg-intent-news-bg-light polli:text-intent-news-text",
103
+ alpha: "polli:bg-intent-alpha-bg-light polli:text-intent-alpha-text",
104
+ neutral: "polli:bg-ink-100/80 polli:text-ink-900",
105
+ success: "polli:bg-intent-success-bg-light polli:text-intent-success-text",
106
+ warning: "polli:bg-intent-warning-bg-light polli:text-intent-warning-text",
107
+ danger: "polli:bg-intent-danger-bg-light polli:text-intent-danger-text"
108
+ };
109
+ var Chip = ({
110
+ theme,
111
+ intent,
112
+ size = "md",
113
+ className,
114
+ children,
115
+ ...rest
116
+ }) => {
117
+ const intentClass = intent ? intentClasses2[intent] : "polli:bg-theme-bg-active polli:text-theme-text-strong";
118
+ return /* @__PURE__ */ jsx3(
119
+ "span",
120
+ {
121
+ ...rest,
122
+ "data-theme": theme,
123
+ className: cn(
124
+ "polli:inline-flex polli:shrink-0 polli:items-center polli:gap-1 polli:rounded-lg polli:font-medium polli:leading-normal",
125
+ chipSizes[size],
126
+ intentClass,
127
+ className
128
+ ),
129
+ children
130
+ }
131
+ );
132
+ };
133
+
134
+ // src/primitives/Dropdown.tsx
135
+ import { Popover } from "@ark-ui/react/popover";
136
+ import { Portal } from "@ark-ui/react/portal";
137
+ import { useState } from "react";
138
+ import { jsx as jsx4, jsxs } from "react/jsx-runtime";
139
+ var DEFAULT_PANEL = "polli:rounded-lg polli:border polli:border-theme-border polli:bg-theme-bg-pale polli:shadow-lg";
140
+ var Dropdown = ({
141
+ theme,
142
+ trigger,
143
+ children,
144
+ align = "start",
145
+ open: openProp,
146
+ onOpenChange,
147
+ className
148
+ }) => {
149
+ const [internalOpen, setInternalOpen] = useState(false);
150
+ const isControlled = openProp !== void 0;
151
+ const open = isControlled ? openProp : internalOpen;
152
+ const setOpen = (next) => {
153
+ if (!isControlled) setInternalOpen(next);
154
+ onOpenChange?.(next);
155
+ };
156
+ return /* @__PURE__ */ jsxs(
157
+ Popover.Root,
158
+ {
159
+ open,
160
+ onOpenChange: (details) => setOpen(details.open),
161
+ positioning: {
162
+ placement: align === "end" ? "bottom-end" : "bottom-start"
163
+ },
164
+ children: [
165
+ /* @__PURE__ */ jsx4(Popover.Trigger, { asChild: true, children: trigger(open) }),
166
+ /* @__PURE__ */ jsx4(Portal, { children: /* @__PURE__ */ jsx4(Popover.Positioner, { children: /* @__PURE__ */ jsx4(
167
+ Popover.Content,
168
+ {
169
+ "data-theme": theme,
170
+ className: cn(
171
+ "polli:z-50 polli:overflow-hidden polli:focus:outline-none",
172
+ DEFAULT_PANEL,
173
+ className
174
+ ),
175
+ children: typeof children === "function" ? children(() => setOpen(false)) : children
176
+ }
177
+ ) }) })
178
+ ]
179
+ }
180
+ );
181
+ };
182
+
183
+ // src/primitives/ScrollArea.tsx
184
+ import {
185
+ forwardRef,
186
+ useCallback,
187
+ useEffect,
188
+ useRef
189
+ } from "react";
190
+ import { jsx as jsx5 } from "react/jsx-runtime";
191
+ var axisClasses = {
192
+ y: "polli:overflow-y-auto polli:overflow-x-hidden",
193
+ x: "polli:overflow-x-auto polli:overflow-y-hidden"
194
+ };
195
+ function assignRef(ref, value) {
196
+ if (typeof ref === "function") ref(value);
197
+ else if (ref) ref.current = value;
198
+ }
199
+ var ScrollArea = forwardRef(
200
+ ({ theme, axis = "y", className, children, ...rest }, externalRef) => {
201
+ const innerRef = useRef(null);
202
+ const setRef = useCallback(
203
+ (node) => {
204
+ innerRef.current = node;
205
+ assignRef(externalRef, node);
206
+ },
207
+ [externalRef]
208
+ );
209
+ useEffect(() => {
210
+ const element = innerRef.current;
211
+ if (!element) return;
212
+ let hideTimer = null;
213
+ const clearHideTimer = () => {
214
+ if (hideTimer !== null) {
215
+ window.clearTimeout(hideTimer);
216
+ hideTimer = null;
217
+ }
218
+ };
219
+ const show = () => {
220
+ element.dataset.scrollbarActive = "true";
221
+ clearHideTimer();
222
+ };
223
+ const hide = () => {
224
+ element.dataset.scrollbarActive = "false";
225
+ clearHideTimer();
226
+ };
227
+ const scheduleHide = () => {
228
+ clearHideTimer();
229
+ hideTimer = window.setTimeout(hide, 2e3);
230
+ };
231
+ const handleInteraction = () => {
232
+ show();
233
+ scheduleHide();
234
+ };
235
+ hide();
236
+ element.addEventListener("scroll", handleInteraction, {
237
+ passive: true
238
+ });
239
+ element.addEventListener("wheel", handleInteraction, {
240
+ passive: true
241
+ });
242
+ element.addEventListener("touchstart", handleInteraction, {
243
+ passive: true
244
+ });
245
+ element.addEventListener("pointerdown", handleInteraction);
246
+ element.addEventListener("keydown", handleInteraction);
247
+ element.addEventListener("focusin", handleInteraction);
248
+ element.addEventListener("focusout", scheduleHide);
249
+ return () => {
250
+ clearHideTimer();
251
+ element.removeEventListener("scroll", handleInteraction);
252
+ element.removeEventListener("wheel", handleInteraction);
253
+ element.removeEventListener("touchstart", handleInteraction);
254
+ element.removeEventListener("pointerdown", handleInteraction);
255
+ element.removeEventListener("keydown", handleInteraction);
256
+ element.removeEventListener("focusin", handleInteraction);
257
+ element.removeEventListener("focusout", scheduleHide);
258
+ };
259
+ }, []);
260
+ return /* @__PURE__ */ jsx5(
261
+ "div",
262
+ {
263
+ ...rest,
264
+ ref: setRef,
265
+ "data-theme": theme,
266
+ className: cn(
267
+ "polli-scrollbar-subtle polli:min-w-0 polli:max-w-full",
268
+ axisClasses[axis],
269
+ className
270
+ ),
271
+ children
272
+ }
273
+ );
274
+ }
275
+ );
276
+ ScrollArea.displayName = "ScrollArea";
277
+
278
+ // src/primitives/TabButton.tsx
279
+ import { jsx as jsx6 } from "react/jsx-runtime";
280
+ var sizeClasses = {
281
+ md: "polli:px-4 polli:py-1.5 polli:text-base",
282
+ sm: "polli:px-3 polli:py-1.5 polli:text-sm"
283
+ };
284
+ var variantClasses = {
285
+ default: {
286
+ base: "polli:border",
287
+ active: "polli:bg-theme-bg-active polli:text-theme-text-strong polli:border-theme-border",
288
+ inactive: "polli:bg-theme-bg-subtle polli:text-theme-text-base polli:border-theme-border polli:hover:bg-theme-bg-active"
289
+ },
290
+ ghost: {
291
+ base: "polli:border polli:border-transparent",
292
+ active: "polli:bg-theme-bg-active polli:text-theme-text-strong",
293
+ inactive: "polli:bg-transparent polli:text-theme-text-base polli:hover:bg-theme-bg-subtle polli:hover:text-theme-text-strong"
294
+ }
295
+ };
296
+ var TabButton = ({
297
+ theme,
298
+ active,
299
+ onClick,
300
+ children,
301
+ size = "md",
302
+ variant = "default",
303
+ ariaLabel,
304
+ disabled = false,
305
+ className
306
+ }) => {
307
+ const classes = variantClasses[variant];
308
+ return /* @__PURE__ */ jsx6(
309
+ "button",
310
+ {
311
+ type: "button",
312
+ "data-theme": theme,
313
+ onClick,
314
+ "aria-label": ariaLabel,
315
+ "aria-pressed": active,
316
+ disabled,
317
+ className: cn(
318
+ "polli-control polli:inline-flex polli:items-center polli:justify-center polli:rounded-full polli:font-medium polli:leading-normal polli:transition-all polli:duration-200",
319
+ classes.base,
320
+ active ? classes.active : classes.inactive,
321
+ disabled && "polli:cursor-not-allowed polli:opacity-50",
322
+ sizeClasses[size],
323
+ className
324
+ ),
325
+ children
326
+ }
327
+ );
328
+ };
329
+
330
+ // src/modules/gen/themes.ts
331
+ var MODALITY_THEMES = {
332
+ text: "blue",
333
+ image: "pink",
334
+ video: "teal",
335
+ audio: "amber",
336
+ realtime: "coral",
337
+ embedding: "violet"
338
+ };
339
+ function modalityTheme(category) {
340
+ return MODALITY_THEMES[category];
341
+ }
342
+ function normalize(category) {
343
+ const lower = category.toLowerCase();
344
+ if (lower === "images") return "image";
345
+ if (lower === "embeddings") return "embedding";
346
+ return lower in MODALITY_THEMES ? lower : null;
347
+ }
348
+ function getModalityTheme(category) {
349
+ const key = normalize(category);
350
+ return key ? MODALITY_THEMES[key] : null;
351
+ }
352
+
353
+ // src/modules/gen/ModelSelector.tsx
354
+ import { jsx as jsx7, jsxs as jsxs2 } from "react/jsx-runtime";
355
+ var CATEGORY_LABELS = {
356
+ image: "Image",
357
+ video: "Video",
358
+ text: "Text",
359
+ audio: "Audio",
360
+ embedding: "Embeddings",
361
+ realtime: "Realtime"
362
+ };
363
+ function categoryLabel(category) {
364
+ return CATEGORY_LABELS[category];
365
+ }
366
+ function displayModelName(model) {
367
+ return model.title;
368
+ }
369
+ function ModelSelector({
370
+ models,
371
+ category,
372
+ value,
373
+ isLoading = false,
374
+ onChange
375
+ }) {
376
+ const filteredModels = models.filter(
377
+ (model) => model.category === category
378
+ );
379
+ const currentModel = models.find((model) => model.id === value);
380
+ const theme = modalityTheme(category);
381
+ const modelLabel = currentModel ? displayModelName(currentModel) : "Select";
382
+ const accessibleLabel = currentModel ? `${CATEGORY_LABELS[category]} model: ${modelLabel}` : `Select ${CATEGORY_LABELS[category].toLowerCase()} model`;
383
+ return /* @__PURE__ */ jsx7(
384
+ Dropdown,
385
+ {
386
+ theme,
387
+ align: "end",
388
+ className: "polli:w-[min(24rem,calc(100vw-2rem))] polli:p-2",
389
+ trigger: (open) => /* @__PURE__ */ jsxs2(
390
+ Button,
391
+ {
392
+ type: "button",
393
+ theme,
394
+ "aria-label": accessibleLabel,
395
+ className: "polli:min-w-64 polli:max-w-full polli:self-start polli:justify-between polli:gap-2",
396
+ children: [
397
+ /* @__PURE__ */ jsx7("span", { className: "polli:truncate", children: modelLabel }),
398
+ /* @__PURE__ */ jsx7(ChevronIcon, { expanded: open })
399
+ ]
400
+ }
401
+ ),
402
+ children: (close) => isLoading ? /* @__PURE__ */ jsx7("p", { className: "polli:m-0 polli:px-2 polli:py-2 polli:text-sm polli:text-theme-text-soft", children: "Loading models..." }) : /* @__PURE__ */ jsx7(
403
+ ScrollArea,
404
+ {
405
+ theme,
406
+ className: "polli:max-h-64 polli:pr-2",
407
+ children: /* @__PURE__ */ jsx7("div", { className: "polli:flex polli:flex-col polli:gap-1", children: filteredModels.map((model) => {
408
+ const isActive = value === model.id;
409
+ return /* @__PURE__ */ jsxs2(
410
+ TabButton,
411
+ {
412
+ active: isActive,
413
+ theme: modalityTheme(model.category),
414
+ size: "sm",
415
+ variant: "ghost",
416
+ className: "polli:w-full polli:justify-between polli:text-left",
417
+ onClick: () => {
418
+ onChange(model.id);
419
+ close();
420
+ },
421
+ children: [
422
+ /* @__PURE__ */ jsx7("span", { className: "polli:truncate", children: displayModelName(model) }),
423
+ model.paidOnly && /* @__PURE__ */ jsx7(
424
+ Chip,
425
+ {
426
+ size: "sm",
427
+ className: cn(
428
+ "polli:shrink-0",
429
+ isActive && "polli:bg-surface-white"
430
+ ),
431
+ children: "paid"
432
+ }
433
+ )
434
+ ]
435
+ },
436
+ model.id
437
+ );
438
+ }) })
439
+ }
440
+ )
441
+ }
442
+ );
443
+ }
444
+ export {
445
+ CATEGORY_LABELS,
446
+ ModelSelector,
447
+ categoryLabel,
448
+ getModalityTheme,
449
+ modalityTheme
450
+ };
451
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/cn.ts","../../src/primitives/Button.tsx","../../src/primitives/ChevronIcon.tsx","../../src/primitives/Chip.tsx","../../src/primitives/Dropdown.tsx","../../src/primitives/ScrollArea.tsx","../../src/primitives/TabButton.tsx","../../src/modules/gen/themes.ts","../../src/modules/gen/ModelSelector.tsx"],"sourcesContent":["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 { 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 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 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","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 {\n type ComponentPropsWithoutRef,\n forwardRef,\n type MutableRefObject,\n type PropsWithChildren,\n type Ref,\n useCallback,\n useEffect,\n useRef,\n} from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport type { ThemeName } from \"../theme.ts\";\n\ntype ScrollAxis = \"y\" | \"x\";\n\nconst axisClasses: Record<ScrollAxis, string> = {\n y: \"polli:overflow-y-auto polli:overflow-x-hidden\",\n x: \"polli:overflow-x-auto polli:overflow-y-hidden\",\n};\n\ntype ScrollAreaOwnProps = {\n /** Override the ambient cascade theme for this scroller's thumb. */\n theme?: ThemeName;\n /** Scroll direction. Default `y`. */\n axis?: ScrollAxis;\n className?: string;\n};\n\nexport type ScrollAreaProps = PropsWithChildren<\n ScrollAreaOwnProps &\n Omit<ComponentPropsWithoutRef<\"div\">, keyof ScrollAreaOwnProps>\n>;\n\nfunction assignRef<T>(ref: Ref<T> | undefined, value: T | null) {\n if (typeof ref === \"function\") ref(value);\n else if (ref) (ref as MutableRefObject<T | null>).current = value;\n}\n\n/**\n * Themed auto-hide scroll container. Thumb color follows the nearest\n * `[data-theme=\"...\"]` ancestor; pass `theme` to override locally.\n */\nexport const ScrollArea = forwardRef<HTMLDivElement, ScrollAreaProps>(\n ({ theme, axis = \"y\", className, children, ...rest }, externalRef) => {\n const innerRef = useRef<HTMLDivElement | null>(null);\n\n const setRef = useCallback(\n (node: HTMLDivElement | null) => {\n innerRef.current = node;\n assignRef(externalRef, node);\n },\n [externalRef],\n );\n\n useEffect(() => {\n const element = innerRef.current;\n if (!element) return;\n\n let hideTimer: number | null = null;\n\n const clearHideTimer = () => {\n if (hideTimer !== null) {\n window.clearTimeout(hideTimer);\n hideTimer = null;\n }\n };\n\n const show = () => {\n element.dataset.scrollbarActive = \"true\";\n clearHideTimer();\n };\n\n const hide = () => {\n element.dataset.scrollbarActive = \"false\";\n clearHideTimer();\n };\n\n const scheduleHide = () => {\n clearHideTimer();\n hideTimer = window.setTimeout(hide, 2000);\n };\n\n const handleInteraction = () => {\n show();\n scheduleHide();\n };\n\n hide();\n\n element.addEventListener(\"scroll\", handleInteraction, {\n passive: true,\n });\n element.addEventListener(\"wheel\", handleInteraction, {\n passive: true,\n });\n element.addEventListener(\"touchstart\", handleInteraction, {\n passive: true,\n });\n element.addEventListener(\"pointerdown\", handleInteraction);\n element.addEventListener(\"keydown\", handleInteraction);\n element.addEventListener(\"focusin\", handleInteraction);\n element.addEventListener(\"focusout\", scheduleHide);\n\n return () => {\n clearHideTimer();\n element.removeEventListener(\"scroll\", handleInteraction);\n element.removeEventListener(\"wheel\", handleInteraction);\n element.removeEventListener(\"touchstart\", handleInteraction);\n element.removeEventListener(\"pointerdown\", handleInteraction);\n element.removeEventListener(\"keydown\", handleInteraction);\n element.removeEventListener(\"focusin\", handleInteraction);\n element.removeEventListener(\"focusout\", scheduleHide);\n };\n }, []);\n\n return (\n <div\n {...rest}\n ref={setRef}\n data-theme={theme}\n className={cn(\n \"polli-scrollbar-subtle polli:min-w-0 polli:max-w-full\",\n axisClasses[axis],\n className,\n )}\n >\n {children}\n </div>\n );\n },\n);\n\nScrollArea.displayName = \"ScrollArea\";\n","import type { FC, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.ts\";\nimport type { ThemeName } from \"../theme.ts\";\n\nexport type TabButtonProps = {\n active: boolean;\n onClick: () => void;\n children: ReactNode;\n /** Optional cascade override; defaults to inherited [data-theme]. */\n theme?: ThemeName;\n size?: \"md\" | \"sm\";\n variant?: \"default\" | \"ghost\";\n ariaLabel?: string;\n disabled?: boolean;\n className?: string;\n};\n\nconst sizeClasses = {\n md: \"polli:px-4 polli:py-1.5 polli:text-base\",\n sm: \"polli:px-3 polli:py-1.5 polli:text-sm\",\n} as const;\n\nconst variantClasses = {\n default: {\n base: \"polli:border\",\n active: \"polli:bg-theme-bg-active polli:text-theme-text-strong polli:border-theme-border\",\n inactive:\n \"polli:bg-theme-bg-subtle polli:text-theme-text-base polli:border-theme-border polli:hover:bg-theme-bg-active\",\n },\n ghost: {\n base: \"polli:border polli:border-transparent\",\n active: \"polli:bg-theme-bg-active polli:text-theme-text-strong\",\n inactive:\n \"polli:bg-transparent polli:text-theme-text-base polli:hover:bg-theme-bg-subtle polli:hover:text-theme-text-strong\",\n },\n} as const;\n\nexport const TabButton: FC<TabButtonProps> = ({\n theme,\n active,\n onClick,\n children,\n size = \"md\",\n variant = \"default\",\n ariaLabel,\n disabled = false,\n className,\n}) => {\n const classes = variantClasses[variant];\n return (\n <button\n type=\"button\"\n data-theme={theme}\n onClick={onClick}\n aria-label={ariaLabel}\n aria-pressed={active}\n disabled={disabled}\n className={cn(\n \"polli-control polli:inline-flex polli:items-center polli:justify-center polli:rounded-full polli:font-medium polli:leading-normal polli:transition-all polli:duration-200\",\n classes.base,\n active ? classes.active : classes.inactive,\n disabled && \"polli:cursor-not-allowed polli:opacity-50\",\n sizeClasses[size],\n className,\n )}\n >\n {children}\n </button>\n );\n};\n","/** Pollinations model modality to package theme mapping. */\nimport type { ModelCategory } from \"@pollinations/sdk\";\nimport type { ThemeName } from \"../../theme.ts\";\n\n/** A model modality is just a model category. Single source of truth: the SDK. */\nexport type Modality = ModelCategory;\n\nexport const MODALITY_THEMES: Record<ModelCategory, ThemeName> = {\n text: \"blue\",\n image: \"pink\",\n video: \"teal\",\n audio: \"amber\",\n realtime: \"coral\",\n embedding: \"violet\",\n};\n\n/** Theme for a known model category. Total — every category has a theme. */\nexport function modalityTheme(category: ModelCategory): ThemeName {\n return MODALITY_THEMES[category];\n}\n\n/** Map a human-typed category string to the canonical `ModelCategory` key. */\nfunction normalize(category: string): ModelCategory | null {\n const lower = category.toLowerCase();\n if (lower === \"images\") return \"image\";\n if (lower === \"embeddings\") return \"embedding\";\n return lower in MODALITY_THEMES ? (lower as ModelCategory) : null;\n}\n\n/** Theme for an untrusted category string (e.g. user input); null if unknown. */\nexport function getModalityTheme(category: string): ThemeName | null {\n const key = normalize(category);\n return key ? MODALITY_THEMES[key] : null;\n}\n","import type { ModelCategory } from \"@pollinations/sdk\";\nimport { cn } from \"../../lib/cn.ts\";\nimport { Button } from \"../../primitives/Button.tsx\";\nimport { ChevronIcon } from \"../../primitives/ChevronIcon.tsx\";\nimport { Chip } from \"../../primitives/Chip.tsx\";\nimport { Dropdown } from \"../../primitives/Dropdown.tsx\";\nimport { ScrollArea } from \"../../primitives/ScrollArea.tsx\";\nimport { TabButton } from \"../../primitives/TabButton.tsx\";\nimport { modalityTheme } from \"./themes.ts\";\n\nexport type ModelSelectorCategory = ModelCategory;\n\nexport type ModelSelectorItem = {\n id: string;\n name: string;\n title: string;\n description?: string;\n category: ModelSelectorCategory;\n paidOnly?: boolean;\n};\n\nexport type ModelSelectorProps = {\n models: readonly ModelSelectorItem[];\n category: ModelSelectorCategory;\n value: string;\n isLoading?: boolean;\n onChange: (modelId: string) => void;\n};\n\nexport const CATEGORY_LABELS: Record<ModelSelectorCategory, string> = {\n image: \"Image\",\n video: \"Video\",\n text: \"Text\",\n audio: \"Audio\",\n embedding: \"Embeddings\",\n realtime: \"Realtime\",\n};\n\n/** Human-readable label for a model category, e.g. \"embedding\" -> \"Embeddings\". */\nexport function categoryLabel(category: ModelSelectorCategory): string {\n return CATEGORY_LABELS[category];\n}\n\nfunction displayModelName(model: ModelSelectorItem): string {\n return model.title;\n}\n\nexport function ModelSelector({\n models,\n category,\n value,\n isLoading = false,\n onChange,\n}: ModelSelectorProps) {\n const filteredModels = models.filter(\n (model) => model.category === category,\n );\n const currentModel = models.find((model) => model.id === value);\n const theme = modalityTheme(category);\n const modelLabel = currentModel ? displayModelName(currentModel) : \"Select\";\n const accessibleLabel = currentModel\n ? `${CATEGORY_LABELS[category]} model: ${modelLabel}`\n : `Select ${CATEGORY_LABELS[category].toLowerCase()} model`;\n\n return (\n <Dropdown\n theme={theme}\n align=\"end\"\n className=\"polli:w-[min(24rem,calc(100vw-2rem))] polli:p-2\"\n trigger={(open) => (\n <Button\n type=\"button\"\n theme={theme}\n aria-label={accessibleLabel}\n className=\"polli:min-w-64 polli:max-w-full polli:self-start polli:justify-between polli:gap-2\"\n >\n <span className=\"polli:truncate\">{modelLabel}</span>\n <ChevronIcon expanded={open} />\n </Button>\n )}\n >\n {(close) =>\n isLoading ? (\n <p className=\"polli:m-0 polli:px-2 polli:py-2 polli:text-sm polli:text-theme-text-soft\">\n Loading models...\n </p>\n ) : (\n <ScrollArea\n theme={theme}\n className=\"polli:max-h-64 polli:pr-2\"\n >\n <div className=\"polli:flex polli:flex-col polli:gap-1\">\n {filteredModels.map((model) => {\n const isActive = value === model.id;\n return (\n <TabButton\n key={model.id}\n active={isActive}\n theme={modalityTheme(model.category)}\n size=\"sm\"\n variant=\"ghost\"\n className=\"polli:w-full polli:justify-between polli:text-left\"\n onClick={() => {\n onChange(model.id);\n close();\n }}\n >\n <span className=\"polli:truncate\">\n {displayModelName(model)}\n </span>\n {model.paidOnly && (\n <Chip\n size=\"sm\"\n className={cn(\n \"polli:shrink-0\",\n isActive &&\n \"polli:bg-surface-white\",\n )}\n >\n paid\n </Chip>\n )}\n </TabButton>\n );\n })}\n </div>\n </ScrollArea>\n )\n }\n </Dropdown>\n );\n}\n"],"mappings":"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","names":["jsx","jsx","intentClasses","jsx","jsx","jsx","jsx","jsxs"]}