@pollinations/ui 0.0.1 → 0.1.0-alpha.0

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 (65) hide show
  1. package/README.md +25 -16
  2. package/dist/{Button-DMJ2K6Gr.d.ts → Button-BvLF_Km2.d.cts} +4 -4
  3. package/dist/{Button-CNzpisJf.d.cts → Button-DQAZzvyQ.d.ts} +4 -4
  4. package/dist/{Chip-BS8ronOu.d.ts → Chip-C5impfYd.d.ts} +2 -2
  5. package/dist/{Chip-DyqWrq0r.d.cts → Chip-SM52sUbZ.d.cts} +2 -2
  6. package/dist/app.css +1 -1
  7. package/dist/auth/index.cjs +78 -71
  8. package/dist/auth/index.cjs.map +1 -1
  9. package/dist/auth/index.d.cts +1 -2
  10. package/dist/auth/index.d.ts +1 -2
  11. package/dist/auth/index.js +78 -71
  12. package/dist/auth/index.js.map +1 -1
  13. package/dist/auth/sdk.cjs +7 -6
  14. package/dist/auth/sdk.cjs.map +1 -1
  15. package/dist/auth/sdk.d.cts +2 -2
  16. package/dist/auth/sdk.d.ts +2 -2
  17. package/dist/auth/sdk.js +7 -6
  18. package/dist/auth/sdk.js.map +1 -1
  19. package/dist/compositions/app-user.cjs +497 -0
  20. package/dist/compositions/app-user.cjs.map +1 -0
  21. package/dist/compositions/app-user.d.cts +18 -0
  22. package/dist/compositions/app-user.d.ts +18 -0
  23. package/dist/compositions/app-user.js +469 -0
  24. package/dist/compositions/app-user.js.map +1 -0
  25. package/dist/index.cjs +1151 -312
  26. package/dist/index.cjs.map +1 -1
  27. package/dist/index.d.cts +146 -13
  28. package/dist/index.d.ts +146 -13
  29. package/dist/index.js +1109 -295
  30. package/dist/index.js.map +1 -1
  31. package/dist/modality/index.cjs +27 -56
  32. package/dist/modality/index.cjs.map +1 -1
  33. package/dist/modality/index.d.cts +13 -32
  34. package/dist/modality/index.d.ts +13 -32
  35. package/dist/modality/index.js +27 -55
  36. package/dist/modality/index.js.map +1 -1
  37. package/dist/models/index.cjs +508 -0
  38. package/dist/models/index.cjs.map +1 -0
  39. package/dist/models/index.d.cts +22 -0
  40. package/dist/models/index.d.ts +22 -0
  41. package/dist/models/index.js +486 -0
  42. package/dist/models/index.js.map +1 -0
  43. package/dist/styles.css +1 -1
  44. package/dist/theme-VMRlhqST.d.cts +9 -0
  45. package/dist/theme-VMRlhqST.d.ts +9 -0
  46. package/dist/wallet/index.cjs +17 -5
  47. package/dist/wallet/index.cjs.map +1 -1
  48. package/dist/wallet/index.d.cts +2 -2
  49. package/dist/wallet/index.d.ts +2 -2
  50. package/dist/wallet/index.js +17 -5
  51. package/dist/wallet/index.js.map +1 -1
  52. package/dist/wallet/sdk.cjs +6 -3
  53. package/dist/wallet/sdk.cjs.map +1 -1
  54. package/dist/wallet/sdk.js +6 -3
  55. package/dist/wallet/sdk.js.map +1 -1
  56. package/package.json +17 -10
  57. package/dist/showcase/index.cjs +0 -2851
  58. package/dist/showcase/index.cjs.map +0 -1
  59. package/dist/showcase/index.d.cts +0 -19
  60. package/dist/showcase/index.d.ts +0 -19
  61. package/dist/showcase/index.js +0 -2839
  62. package/dist/showcase/index.js.map +0 -1
  63. package/dist/theme-DfHMjWB7.d.cts +0 -16
  64. package/dist/theme-DfHMjWB7.d.ts +0 -16
  65. package/dist/wallet.css +0 -73
package/README.md CHANGED
@@ -6,8 +6,15 @@ core primitives and display recipes stay SDK-free.
6
6
 
7
7
  ## Install
8
8
 
9
+ > [!WARNING]
10
+ > **The `alpha` line (`0.1.0-alpha.x`) is unstable and breakage-prone.** It ships the in-progress design-system rebuild (new `--polli-color-*` token system, new primitives, renamed size props `sm|md|lg`) and its API may change between alpha versions without notice. The stable `latest` line is `0.0.2`. Opt into the alpha deliberately, and pin an exact version.
11
+
9
12
  ```bash
13
+ # stable (recommended)
10
14
  npm install @pollinations/ui
15
+
16
+ # alpha (in-progress rebuild — pin exactly)
17
+ npm install @pollinations/ui@alpha
11
18
  ```
12
19
 
13
20
  Install `@pollinations/sdk` too when using `@pollinations/ui/*/sdk`
@@ -87,11 +94,8 @@ The SVG sources use `currentColor`. Apps control the rendered color by inlining
87
94
  them or using them as masks. Root-level favicon, PWA icon, and SEO files stay
88
95
  app-owned.
89
96
 
90
- Wallet-specific colors and utilities live in a separate stylesheet:
91
-
92
- ```css
93
- @import "@pollinations/ui/wallet.css";
94
- ```
97
+ Wallet colors and utilities are bundled into the main stylesheet
98
+ (`@pollinations/ui/styles.css`) — no separate import needed.
95
99
 
96
100
  ## What's exported
97
101
 
@@ -109,22 +113,21 @@ Wallet-specific colors and utilities live in a separate stylesheet:
109
113
  These are intentionally bare wrappers around `useAuth*` hooks. They render
110
114
  the data and nothing else — no default copy, no default theme, no default
111
115
  intent. The app composes layout, copy, and color.
112
- - `@pollinations/ui/showcase` exports `DesignShowcase`, a package-owned
113
- internal preview surface for rendering primitives and tokens together.
114
116
  - `@pollinations/ui/wallet` exports SDK-free wallet-specific display helpers
115
117
  and recipes: `formatPollen`, `PaidChip`, `TierChip`, `WalletDot`,
116
118
  `WalletBalanceCard`, `PAID_BALANCE_CHART_COLOR`, and
117
119
  `TIER_BALANCE_CHART_COLOR`.
118
120
  - `@pollinations/ui/wallet/sdk` exports SDK-backed wallet components:
119
121
  `Balance`, `KeyBudget`, `KeyExpiry`, `KeyModels`, and `KeyPrefix`.
120
- - `@pollinations/ui/modality` exports model-modality color recipes and
121
- `ModalityButton`.
122
+ - `@pollinations/ui/modality` exports model-modality color recipes.
122
123
  - `@pollinations/ui/assets/*` exports canonical Pollinations source SVGs:
123
124
  `logo.svg` and `logo-wordmark.svg`.
124
- - **Design primitives** — `Button`, `Chip`, `ChevronIcon`, `Collapsible`,
125
- `CopyButton`, `Dialog`, `Dropdown`, `ExternalLinkButton`, `IconButton`,
126
- `InfoTip`, `Input`, `MultiSelect`, `PeriodPicker`, `ScrollArea`, `Section`,
127
- `Slider`, `StatCard`, `Surface`, `Switch`, `TabButton`, `Tooltip`.
125
+ - **Design primitives** — `Alert`, `Button`, `ButtonGroup`, `Chip`, `ChevronIcon`,
126
+ `Collapsible`, `CopyButton`, `Dialog`, `Dropdown`, `ExternalLinkButton`,
127
+ `IconButton`, `InfoTip`, `Input`, `MultiSelect`, `PeriodPicker`,
128
+ `ScrollArea`, `Section`, `Slider`, `StatCard`, `Surface`, `Switch`,
129
+ `Table`, `TableBody`, `TableCell`, `TableHead`, `TableHeaderCell`,
130
+ `TableRow`, `TabButton`, `Tooltip`.
128
131
  - **Helpers** — `cn`, `useScrollLock`, `currentPeriod`,
129
132
  `getPeriodBucketKeys`, `periodBucketKeyToDate`.
130
133
  - **Theme** — `themes` (runtime array of theme names), `ThemeName` (type).
@@ -140,8 +143,8 @@ from `@pollinations/sdk/react` (`useAccountKeyUsage`, `useAccountKey`,
140
143
  such as auth, wallet, and modality.
141
144
  - Public subpath exports (`@pollinations/ui/auth`,
142
145
  `@pollinations/ui/auth/sdk`, `@pollinations/ui/wallet`,
143
- `@pollinations/ui/wallet/sdk`, `@pollinations/ui/modality`,
144
- `@pollinations/ui/showcase`) are built directly from those modules.
146
+ `@pollinations/ui/wallet/sdk`, `@pollinations/ui/modality`) are built
147
+ directly from those modules.
145
148
 
146
149
  ## Theming
147
150
 
@@ -186,7 +189,7 @@ with host app tokens.
186
189
  | `--polli-text-base` | Base text size. |
187
190
  | `--polli-color-surface-white` | Translucent white surface. |
188
191
 
189
- Wallet tokens are public when `@pollinations/ui/wallet.css` is imported:
192
+ Wallet tokens are public (bundled into `@pollinations/ui/styles.css`):
190
193
 
191
194
  | Token | Purpose |
192
195
  | ----------------------------- | --------------------------------------------- |
@@ -204,6 +207,12 @@ Wallet tokens are public when `@pollinations/ui/wallet.css` is imported:
204
207
  | `--polli-color-danger-bg-light` | Error surface background. |
205
208
  | `--polli-color-danger-text` | Error text foreground. |
206
209
  | `--polli-color-danger-border` | Error border. |
210
+ | `--polli-color-success-bg-light` | Success surface background. |
211
+ | `--polli-color-success-text` | Success text foreground. |
212
+ | `--polli-color-success-border` | Success border. |
213
+ | `--polli-color-warning-bg-light` | Warning surface background. |
214
+ | `--polli-color-warning-text` | Warning text foreground. |
215
+ | `--polli-color-warning-border` | Warning border. |
207
216
 
208
217
  **Example:**
209
218
 
@@ -1,13 +1,13 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { PropsWithChildren } from 'react';
3
- import { T as ThemeName } from './theme-DfHMjWB7.js';
3
+ import { T as ThemeName } from './theme-VMRlhqST.cjs';
4
4
 
5
5
  /** Button only supports `danger`. Label/status color recipes live on Chip. */
6
6
  type ButtonIntent = "danger";
7
7
  declare const sizes: {
8
- readonly small: "polli:px-2 polli:pt-0.5 polli:pb-1";
9
- readonly medium: "polli:px-4 polli:pt-1.5 polli:pb-2";
10
- readonly large: "polli:px-6 polli:py-3";
8
+ readonly sm: "polli:px-2 polli:pt-0.5 polli:pb-1";
9
+ readonly md: "polli:px-4 polli:pt-1.5 polli:pb-2";
10
+ readonly lg: "polli:px-6 polli:py-3";
11
11
  };
12
12
  type BaseButtonProps = {
13
13
  /** Override the cascade theme for this button's subtree. Ignored when `intent` is set. */
@@ -1,13 +1,13 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import { PropsWithChildren } from 'react';
3
- import { T as ThemeName } from './theme-DfHMjWB7.cjs';
3
+ import { T as ThemeName } from './theme-VMRlhqST.js';
4
4
 
5
5
  /** Button only supports `danger`. Label/status color recipes live on Chip. */
6
6
  type ButtonIntent = "danger";
7
7
  declare const sizes: {
8
- readonly small: "polli:px-2 polli:pt-0.5 polli:pb-1";
9
- readonly medium: "polli:px-4 polli:pt-1.5 polli:pb-2";
10
- readonly large: "polli:px-6 polli:py-3";
8
+ readonly sm: "polli:px-2 polli:pt-0.5 polli:pb-1";
9
+ readonly md: "polli:px-4 polli:pt-1.5 polli:pb-2";
10
+ readonly lg: "polli:px-6 polli:py-3";
11
11
  };
12
12
  type BaseButtonProps = {
13
13
  /** Override the cascade theme for this button's subtree. Ignored when `intent` is set. */
@@ -1,8 +1,8 @@
1
1
  import { FC, ComponentPropsWithoutRef } from 'react';
2
- import { T as ThemeName } from './theme-DfHMjWB7.js';
2
+ import { T as ThemeName } from './theme-VMRlhqST.js';
3
3
 
4
4
  /** Semantic chip labels for status and metadata badges. */
5
- type ChipIntent = "news" | "alpha" | "neutral";
5
+ type ChipIntent = "news" | "alpha" | "neutral" | "success" | "warning" | "danger";
6
6
  declare const chipSizes: {
7
7
  readonly sm: "polli:px-2 polli:py-0.5 polli:text-xs";
8
8
  readonly md: "polli:px-2.5 polli:py-0.5 polli:text-sm";
@@ -1,8 +1,8 @@
1
1
  import { FC, ComponentPropsWithoutRef } from 'react';
2
- import { T as ThemeName } from './theme-DfHMjWB7.cjs';
2
+ import { T as ThemeName } from './theme-VMRlhqST.cjs';
3
3
 
4
4
  /** Semantic chip labels for status and metadata badges. */
5
- type ChipIntent = "news" | "alpha" | "neutral";
5
+ type ChipIntent = "news" | "alpha" | "neutral" | "success" | "warning" | "danger";
6
6
  declare const chipSizes: {
7
7
  readonly sm: "polli:px-2 polli:py-0.5 polli:text-xs";
8
8
  readonly md: "polli:px-2.5 polli:py-0.5 polli:text-sm";
package/dist/app.css CHANGED
@@ -1,5 +1,5 @@
1
1
  /** biome-ignore-all lint/suspicious/noUnknownAtRules: tailwind handles it */
2
- @import "@pollinations/ui/styles.css";
2
+ @import "./styles.css";
3
3
  @import "tailwindcss";
4
4
 
5
5
  /* Tailwind utility surface for Pollinations UI app classes.
@@ -34,6 +34,7 @@ var logo_default = 'data:image/svg+xml,<?xml version="1.0" encoding="utf-8"?>%0A
34
34
  // src/primitives/Dialog.tsx
35
35
  var import_dialog = require("@ark-ui/react/dialog");
36
36
  var import_portal = require("@ark-ui/react/portal");
37
+ var import_react = require("react");
37
38
 
38
39
  // src/lib/cn.ts
39
40
  var import_clsx = require("clsx");
@@ -67,76 +68,89 @@ var Dialog = ({
67
68
  positionerClassName,
68
69
  contentClassName,
69
70
  children
70
- }) => /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
71
- import_dialog.Dialog.Root,
72
- {
73
- open,
74
- onOpenChange: (details) => onOpenChange?.(details.open),
75
- children: [
76
- trigger && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
77
- import_dialog.Dialog.Trigger,
78
- {
79
- asChild: triggerAsChild,
80
- className: triggerClassName,
81
- children: trigger
82
- }
83
- ),
84
- /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_portal.Portal, { children: [
85
- showBackdrop && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
86
- import_dialog.Dialog.Backdrop,
71
+ }) => {
72
+ const contentRef = (0, import_react.useRef)(null);
73
+ return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
74
+ import_dialog.Dialog.Root,
75
+ {
76
+ open,
77
+ initialFocusEl: () => contentRef.current,
78
+ onOpenChange: (details) => onOpenChange?.(details.open),
79
+ children: [
80
+ trigger && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
81
+ import_dialog.Dialog.Trigger,
87
82
  {
88
- className: cn(
89
- "polli:fixed polli:inset-0 polli:z-[100] polli:bg-gray-950/50",
90
- backdropClassName
91
- )
83
+ asChild: triggerAsChild,
84
+ className: triggerClassName,
85
+ children: trigger
92
86
  }
93
87
  ),
94
- /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
95
- import_dialog.Dialog.Positioner,
96
- {
97
- className: cn(
98
- "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",
99
- positionerClassName
100
- ),
101
- children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
102
- import_dialog.Dialog.Content,
103
- {
104
- "data-theme": theme,
105
- "aria-label": ariaLabel,
106
- "aria-labelledby": labelledBy,
107
- className: cn(
108
- "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",
109
- sizeClasses[size],
110
- contentClassName
111
- ),
112
- children: [
113
- title && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
114
- DialogTitle,
115
- {
116
- className: cn(
117
- "polli:px-6 polli:pt-6 polli:font-subheading polli:text-xl polli:text-theme-text-strong",
118
- titleClassName
119
- ),
120
- children: title
121
- }
88
+ /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(import_portal.Portal, { children: [
89
+ showBackdrop && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
90
+ import_dialog.Dialog.Backdrop,
91
+ {
92
+ className: cn(
93
+ "polli:fixed polli:inset-0 polli:z-[100] polli:bg-gray-950/50",
94
+ backdropClassName
95
+ )
96
+ }
97
+ ),
98
+ /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
99
+ import_dialog.Dialog.Positioner,
100
+ {
101
+ "data-theme": theme,
102
+ className: cn(
103
+ "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",
104
+ positionerClassName
105
+ ),
106
+ children: /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
107
+ import_dialog.Dialog.Content,
108
+ {
109
+ ref: contentRef,
110
+ "data-theme": theme,
111
+ "aria-label": ariaLabel,
112
+ "aria-labelledby": labelledBy,
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",
115
+ sizeClasses[size],
116
+ contentClassName
122
117
  ),
123
- children
124
- ]
125
- }
126
- )
127
- }
128
- )
129
- ] })
130
- ]
131
- }
132
- );
118
+ children: [
119
+ title && /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
120
+ DialogTitle,
121
+ {
122
+ className: cn(
123
+ "polli:px-6 polli:pt-6 polli:font-subheading polli:text-xl polli:text-theme-text-strong",
124
+ titleClassName
125
+ ),
126
+ children: title
127
+ }
128
+ ),
129
+ children
130
+ ]
131
+ }
132
+ )
133
+ }
134
+ )
135
+ ] })
136
+ ]
137
+ }
138
+ );
139
+ };
133
140
  var DialogTitle = import_dialog.Dialog.Title;
134
141
 
135
142
  // src/modules/auth/AuthModal.tsx
136
143
  var import_jsx_runtime2 = require("react/jsx-runtime");
144
+ var authLogoMaskUrl = `url('${logo_default}')`;
137
145
  var authLogoMask = {
138
- WebkitMask: `url(${logo_default}) center / contain no-repeat`,
139
- mask: `url(${logo_default}) center / contain no-repeat`
146
+ WebkitMaskImage: authLogoMaskUrl,
147
+ WebkitMaskPosition: "center",
148
+ WebkitMaskRepeat: "no-repeat",
149
+ WebkitMaskSize: "contain",
150
+ maskImage: authLogoMaskUrl,
151
+ maskPosition: "center",
152
+ maskRepeat: "no-repeat",
153
+ maskSize: "contain"
140
154
  };
141
155
  function AuthModal({
142
156
  children,
@@ -165,7 +179,8 @@ function AuthModalHeader({ children }) {
165
179
  href: "https://pollinations.ai",
166
180
  target: "_blank",
167
181
  rel: "noopener noreferrer",
168
- className: "polli:block polli:shrink-0 polli:text-theme-text-strong",
182
+ tabIndex: -1,
183
+ className: "polli:block polli:shrink-0 polli:text-theme-text-strong polli:focus:outline-none",
169
184
  "aria-label": "pollinations.ai",
170
185
  children: [
171
186
  /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("span", { className: "polli:sr-only", children: "pollinations.ai" }),
@@ -199,18 +214,10 @@ function ErrorBanner({ children }) {
199
214
  }
200
215
  function AuthInfoCard({
201
216
  title = "Authorize",
202
- titleId,
203
217
  children
204
218
  }) {
205
219
  return /* @__PURE__ */ (0, import_jsx_runtime2.jsxs)("div", { className: "polli:rounded-lg polli:border-2 polli:border-theme-border polli:bg-theme-bg-pale polli:p-4", children: [
206
- /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
207
- "p",
208
- {
209
- id: titleId,
210
- className: "polli:mb-2 polli:font-body polli:text-xs polli:font-semibold polli:tracking-wide polli:text-theme-text-soft",
211
- children: title
212
- }
213
- ),
220
+ /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("p", { className: "polli:mb-2 polli:font-body polli:text-xs polli:font-semibold polli:tracking-wide polli:text-theme-text-soft", children: title }),
214
221
  children
215
222
  ] });
216
223
  }
@@ -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 { 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 <ArkDialog.Root\n open={open}\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 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 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\",\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\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 authLogoMask: CSSProperties = {\n WebkitMask: `url(${logoUrl}) center / contain no-repeat`,\n mask: `url(${logoUrl}) center / contain no-repeat`,\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 className=\"polli:block polli:shrink-0 polli:text-theme-text-strong\"\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 titleId?: string;\n children: ReactNode;\n};\n\nexport function AuthInfoCard({\n title = \"Authorize\",\n titleId,\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\n id={titleId}\n className=\"polli:mb-2 polli:font-body polli:text-xs polli:font-semibold polli:tracking-wide polli:text-theme-text-soft\"\n >\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-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"]}
@@ -20,9 +20,8 @@ declare function ErrorBanner({ children }: {
20
20
  }): react_jsx_runtime.JSX.Element;
21
21
  type AuthInfoCardProps = {
22
22
  title?: string;
23
- titleId?: string;
24
23
  children: ReactNode;
25
24
  };
26
- declare function AuthInfoCard({ title, titleId, children, }: AuthInfoCardProps): react_jsx_runtime.JSX.Element;
25
+ declare function AuthInfoCard({ title, children, }: AuthInfoCardProps): react_jsx_runtime.JSX.Element;
27
26
 
28
27
  export { AuthInfoCard, type AuthInfoCardProps, AuthModal, AuthModalHeader, type AuthModalHeaderProps, AuthModalLoading, type AuthModalProps, ErrorBanner };
@@ -20,9 +20,8 @@ declare function ErrorBanner({ children }: {
20
20
  }): react_jsx_runtime.JSX.Element;
21
21
  type AuthInfoCardProps = {
22
22
  title?: string;
23
- titleId?: string;
24
23
  children: ReactNode;
25
24
  };
26
- declare function AuthInfoCard({ title, titleId, children, }: AuthInfoCardProps): react_jsx_runtime.JSX.Element;
25
+ declare function AuthInfoCard({ title, children, }: AuthInfoCardProps): react_jsx_runtime.JSX.Element;
27
26
 
28
27
  export { AuthInfoCard, type AuthInfoCardProps, AuthModal, AuthModalHeader, type AuthModalHeaderProps, AuthModalLoading, type AuthModalProps, ErrorBanner };
@@ -4,6 +4,7 @@ var logo_default = 'data:image/svg+xml,<?xml version="1.0" encoding="utf-8"?>%0A
4
4
  // src/primitives/Dialog.tsx
5
5
  import { Dialog as ArkDialog } from "@ark-ui/react/dialog";
6
6
  import { Portal } from "@ark-ui/react/portal";
7
+ import { useRef } from "react";
7
8
 
8
9
  // src/lib/cn.ts
9
10
  import { clsx } from "clsx";
@@ -37,76 +38,89 @@ var Dialog = ({
37
38
  positionerClassName,
38
39
  contentClassName,
39
40
  children
40
- }) => /* @__PURE__ */ jsxs(
41
- ArkDialog.Root,
42
- {
43
- open,
44
- onOpenChange: (details) => onOpenChange?.(details.open),
45
- children: [
46
- trigger && /* @__PURE__ */ jsx(
47
- ArkDialog.Trigger,
48
- {
49
- asChild: triggerAsChild,
50
- className: triggerClassName,
51
- children: trigger
52
- }
53
- ),
54
- /* @__PURE__ */ jsxs(Portal, { children: [
55
- showBackdrop && /* @__PURE__ */ jsx(
56
- ArkDialog.Backdrop,
41
+ }) => {
42
+ const contentRef = useRef(null);
43
+ return /* @__PURE__ */ jsxs(
44
+ ArkDialog.Root,
45
+ {
46
+ open,
47
+ initialFocusEl: () => contentRef.current,
48
+ onOpenChange: (details) => onOpenChange?.(details.open),
49
+ children: [
50
+ trigger && /* @__PURE__ */ jsx(
51
+ ArkDialog.Trigger,
57
52
  {
58
- className: cn(
59
- "polli:fixed polli:inset-0 polli:z-[100] polli:bg-gray-950/50",
60
- backdropClassName
61
- )
53
+ asChild: triggerAsChild,
54
+ className: triggerClassName,
55
+ children: trigger
62
56
  }
63
57
  ),
64
- /* @__PURE__ */ jsx(
65
- ArkDialog.Positioner,
66
- {
67
- className: cn(
68
- "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",
69
- positionerClassName
70
- ),
71
- children: /* @__PURE__ */ jsxs(
72
- ArkDialog.Content,
73
- {
74
- "data-theme": theme,
75
- "aria-label": ariaLabel,
76
- "aria-labelledby": labelledBy,
77
- className: cn(
78
- "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",
79
- sizeClasses[size],
80
- contentClassName
81
- ),
82
- children: [
83
- title && /* @__PURE__ */ jsx(
84
- DialogTitle,
85
- {
86
- className: cn(
87
- "polli:px-6 polli:pt-6 polli:font-subheading polli:text-xl polli:text-theme-text-strong",
88
- titleClassName
89
- ),
90
- children: title
91
- }
58
+ /* @__PURE__ */ jsxs(Portal, { children: [
59
+ showBackdrop && /* @__PURE__ */ jsx(
60
+ ArkDialog.Backdrop,
61
+ {
62
+ className: cn(
63
+ "polli:fixed polli:inset-0 polli:z-[100] polli:bg-gray-950/50",
64
+ backdropClassName
65
+ )
66
+ }
67
+ ),
68
+ /* @__PURE__ */ jsx(
69
+ ArkDialog.Positioner,
70
+ {
71
+ "data-theme": theme,
72
+ className: cn(
73
+ "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",
74
+ positionerClassName
75
+ ),
76
+ children: /* @__PURE__ */ jsxs(
77
+ ArkDialog.Content,
78
+ {
79
+ ref: contentRef,
80
+ "data-theme": theme,
81
+ "aria-label": ariaLabel,
82
+ "aria-labelledby": labelledBy,
83
+ className: cn(
84
+ "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",
85
+ sizeClasses[size],
86
+ contentClassName
92
87
  ),
93
- children
94
- ]
95
- }
96
- )
97
- }
98
- )
99
- ] })
100
- ]
101
- }
102
- );
88
+ children: [
89
+ title && /* @__PURE__ */ jsx(
90
+ DialogTitle,
91
+ {
92
+ className: cn(
93
+ "polli:px-6 polli:pt-6 polli:font-subheading polli:text-xl polli:text-theme-text-strong",
94
+ titleClassName
95
+ ),
96
+ children: title
97
+ }
98
+ ),
99
+ children
100
+ ]
101
+ }
102
+ )
103
+ }
104
+ )
105
+ ] })
106
+ ]
107
+ }
108
+ );
109
+ };
103
110
  var DialogTitle = ArkDialog.Title;
104
111
 
105
112
  // src/modules/auth/AuthModal.tsx
106
113
  import { jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
114
+ var authLogoMaskUrl = `url('${logo_default}')`;
107
115
  var authLogoMask = {
108
- WebkitMask: `url(${logo_default}) center / contain no-repeat`,
109
- mask: `url(${logo_default}) center / contain no-repeat`
116
+ WebkitMaskImage: authLogoMaskUrl,
117
+ WebkitMaskPosition: "center",
118
+ WebkitMaskRepeat: "no-repeat",
119
+ WebkitMaskSize: "contain",
120
+ maskImage: authLogoMaskUrl,
121
+ maskPosition: "center",
122
+ maskRepeat: "no-repeat",
123
+ maskSize: "contain"
110
124
  };
111
125
  function AuthModal({
112
126
  children,
@@ -135,7 +149,8 @@ function AuthModalHeader({ children }) {
135
149
  href: "https://pollinations.ai",
136
150
  target: "_blank",
137
151
  rel: "noopener noreferrer",
138
- className: "polli:block polli:shrink-0 polli:text-theme-text-strong",
152
+ tabIndex: -1,
153
+ className: "polli:block polli:shrink-0 polli:text-theme-text-strong polli:focus:outline-none",
139
154
  "aria-label": "pollinations.ai",
140
155
  children: [
141
156
  /* @__PURE__ */ jsx2("span", { className: "polli:sr-only", children: "pollinations.ai" }),
@@ -169,18 +184,10 @@ function ErrorBanner({ children }) {
169
184
  }
170
185
  function AuthInfoCard({
171
186
  title = "Authorize",
172
- titleId,
173
187
  children
174
188
  }) {
175
189
  return /* @__PURE__ */ jsxs2("div", { className: "polli:rounded-lg polli:border-2 polli:border-theme-border polli:bg-theme-bg-pale polli:p-4", children: [
176
- /* @__PURE__ */ jsx2(
177
- "p",
178
- {
179
- id: titleId,
180
- className: "polli:mb-2 polli:font-body polli:text-xs polli:font-semibold polli:tracking-wide polli:text-theme-text-soft",
181
- children: title
182
- }
183
- ),
190
+ /* @__PURE__ */ jsx2("p", { className: "polli:mb-2 polli:font-body polli:text-xs polli:font-semibold polli:tracking-wide polli:text-theme-text-soft", children: title }),
184
191
  children
185
192
  ] });
186
193
  }