@freeappstore/sdk 0.10.0 → 0.11.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.
package/README.md CHANGED
@@ -140,6 +140,23 @@ const res = await fas.proxy.fetch('api.openweathermap.org/data/2.5/weather?q=Lon
140
140
  const data = await res.json();
141
141
  ```
142
142
 
143
+ ### User API Key Vault
144
+
145
+ Users store their own API keys on the platform (encrypted AES-256-GCM). Apps never see plaintext keys.
146
+
147
+ ```ts
148
+ // Check if user has a key configured
149
+ const hasKey = await fas.keys.has('openai');
150
+
151
+ // Redirect to platform key management page
152
+ fas.keys.manage('openai');
153
+
154
+ // Check all configured providers
155
+ const keys = await fas.keys.status();
156
+ ```
157
+
158
+ Supported providers: OpenAI, Anthropic, Google AI, OpenRouter, Replicate, Stability AI, ElevenLabs, Stripe.
159
+
143
160
  ### React Hooks
144
161
 
145
162
  Import from `@freeappstore/sdk/hooks`. Requires React 18+ as a peer dependency.
@@ -159,21 +176,31 @@ function App() {
159
176
  Drop-in React components. Import from `@freeappstore/sdk/ui`. Components use CSS custom properties (`--ink`, `--accent`, etc.) to blend into your app's theme.
160
177
 
161
178
  ```tsx
162
- import { FasShell, Avatar, SignInButton, ThemeToggle, ProfileMenu, ProfilePage } from '@freeappstore/sdk/ui';
179
+ import {
180
+ FasShell, Avatar, SignInButton, ThemeToggle, ProfileMenu, ProfilePage,
181
+ Spinner, Badge, Card, Tabs, Modal, ConfirmDialog, EmptyState,
182
+ ProgressBar, SearchInput, ListRow, ErrorBoundary, KeyPrompt,
183
+ } from '@freeappstore/sdk/ui';
163
184
 
164
185
  // Zero-config shell
165
- <FasShell app={fas} appName="My App">
166
- <MyApp />
167
- </FasShell>
168
-
169
- // Or use individual components
170
- <Avatar user={user} size={32} />
171
- <ThemeToggle />
172
- <ProfileMenu app={fas} />
173
- <ProfilePage app={fas} />
186
+ <FasShell app={fas} appName="My App"><MyApp /></FasShell>
187
+
188
+ // Building blocks
189
+ <Spinner size={24} />
190
+ <Badge variant="success">Live</Badge>
191
+ <Card onClick={fn}>content</Card>
192
+ <Tabs tabs={[{key:'a',label:'A'}]} active="a" onChange={setTab} />
193
+ <Modal open={show} onClose={close} title="Settings">content</Modal>
194
+ <ConfirmDialog open={show} onConfirm={ok} onCancel={cancel} title="Delete?" message="Sure?" variant="danger" />
195
+ <EmptyState message="Nothing here yet" />
196
+ <ProgressBar value={75} label="Progress" />
197
+ <SearchInput value={q} onChange={setQ} />
198
+ <ListRow title="Item" subtitle="details" onClick={fn} />
199
+ <ErrorBoundary>{children}</ErrorBoundary>
200
+ <KeyPrompt app={fas} provider="openai" providerName="OpenAI" />
174
201
  ```
175
202
 
176
- Full docs: [freeappstore.online/docs/ui](https://freeappstore.online/docs/ui)
203
+ Full docs: [freeappstore.online/skills.md](https://freeappstore.online/skills.md)
177
204
 
178
205
  ## For AI Agents
179
206
 
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { Auth } from './auth.js';
2
2
  import { Counters } from './counters.js';
3
3
  import { Collections } from './db.js';
4
+ import { Keys } from './keys.js';
4
5
  import { Kv } from './kv.js';
5
6
  import { ApiProxy } from './proxy.js';
6
7
  import { Roles } from './roles.js';
@@ -22,6 +23,7 @@ export declare class FreeAppStore {
22
23
  readonly rooms: Rooms;
23
24
  readonly proxy: ApiProxy;
24
25
  readonly roles: Roles;
26
+ readonly keys: Keys;
25
27
  constructor(opts: FasInitOptions);
26
28
  }
27
29
  /** Create a new FreeAppStore SDK instance for the given app. */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,YAAY,EAAE,eAAe,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC/E,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEpE,kGAAkG;AAClG,qBAAa,YAAY;IACvB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC;IAChB,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;gBAEV,IAAI,EAAE,cAAc;CAUjC;AAED,gEAAgE;AAChE,wBAAgB,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,YAAY,CAE1D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,YAAY,EAAE,eAAe,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC/E,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEpE,kGAAkG;AAClG,qBAAa,YAAY;IACvB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC;IAChB,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;gBAER,IAAI,EAAE,cAAc;CAWjC;AAED,gEAAgE;AAChE,wBAAgB,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,YAAY,CAE1D"}
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { Auth } from './auth.js';
2
2
  import { Counters } from './counters.js';
3
3
  import { Collections } from './db.js';
4
+ import { Keys } from './keys.js';
4
5
  import { Kv } from './kv.js';
5
6
  import { ApiProxy } from './proxy.js';
6
7
  import { Roles } from './roles.js';
@@ -16,6 +17,7 @@ export class FreeAppStore {
16
17
  rooms;
17
18
  proxy;
18
19
  roles;
20
+ keys;
19
21
  constructor(opts) {
20
22
  const apiBase = opts.apiBase ?? 'https://api.freeappstore.online';
21
23
  this.auth = new Auth(opts.appId, apiBase);
@@ -25,6 +27,7 @@ export class FreeAppStore {
25
27
  this.rooms = new Rooms(opts.appId, apiBase, this.auth);
26
28
  this.proxy = new ApiProxy(opts.appId, apiBase, this.auth);
27
29
  this.roles = new Roles(opts.appId, apiBase, this.auth);
30
+ this.keys = new Keys(opts.appId, apiBase, this.auth);
28
31
  }
29
32
  }
30
33
  /** Create a new FreeAppStore SDK instance for the given app. */
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAKnC,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAGtC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG3C,kGAAkG;AAClG,MAAM,OAAO,YAAY;IACd,IAAI,CAAO;IACX,EAAE,CAAK;IACP,WAAW,CAAc;IACzB,QAAQ,CAAW;IACnB,KAAK,CAAQ;IACb,KAAK,CAAW;IAChB,KAAK,CAAQ;IAEtB,YAAY,IAAoB;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,iCAAiC,CAAC;QAClE,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACnE,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD,IAAI,CAAC,KAAK,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1D,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACzD,CAAC;CACF;AAED,gEAAgE;AAChE,MAAM,UAAU,OAAO,CAAC,IAAoB;IAC1C,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAKnC,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAGtC,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG3C,kGAAkG;AAClG,MAAM,OAAO,YAAY;IACd,IAAI,CAAO;IACX,EAAE,CAAK;IACP,WAAW,CAAc;IACzB,QAAQ,CAAW;IACnB,KAAK,CAAQ;IACb,KAAK,CAAW;IAChB,KAAK,CAAQ;IACb,IAAI,CAAO;IAEpB,YAAY,IAAoB;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,iCAAiC,CAAC;QAClE,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,EAAE,GAAG,IAAI,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACnE,IAAI,CAAC,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7D,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD,IAAI,CAAC,KAAK,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1D,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACvD,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC;CACF;AAED,gEAAgE;AAChE,MAAM,UAAU,OAAO,CAAC,IAAoB;IAC1C,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC"}
package/dist/keys.d.ts ADDED
@@ -0,0 +1,40 @@
1
+ import type { Auth } from './auth.js';
2
+ /**
3
+ * User API Key management. Keys are stored encrypted on the platform and
4
+ * injected server-side when apps call `fas.proxy.fetch()`. Apps never see
5
+ * the plaintext key.
6
+ *
7
+ * Key management happens on a platform-hosted page, not in the app UI.
8
+ * Apps use `fas.keys.manage()` to redirect users there.
9
+ */
10
+ export declare class Keys {
11
+ private readonly appId;
12
+ private readonly apiBase;
13
+ private readonly auth;
14
+ constructor(appId: string, apiBase: string, auth: Auth);
15
+ /**
16
+ * Open the platform's key management page. If a provider is specified,
17
+ * that provider's card will be highlighted on the page.
18
+ *
19
+ * The user manages their keys on the platform page and is redirected
20
+ * back to the app when done.
21
+ *
22
+ * @param provider - Optional provider to highlight (e.g. 'openai')
23
+ */
24
+ manage(provider?: string): void;
25
+ /**
26
+ * Check which providers the current user has keys configured for.
27
+ * Useful for showing "configure your API key" prompts in the app.
28
+ */
29
+ status(): Promise<Array<{
30
+ provider: string;
31
+ label: string | null;
32
+ createdAt: number;
33
+ lastUsedAt: number | null;
34
+ }>>;
35
+ /**
36
+ * Check if the user has a key for a specific provider.
37
+ */
38
+ has(provider: string): Promise<boolean>;
39
+ }
40
+ //# sourceMappingURL=keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC;;;;;;;GAOG;AACH,qBAAa,IAAI;IAEb,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAFJ,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,IAAI;IAG7B;;;;;;;;OAQG;IACH,MAAM,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAQ/B;;;OAGG;IACG,MAAM,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAC;IAUxH;;OAEG;IACG,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAI9C"}
package/dist/keys.js ADDED
@@ -0,0 +1,58 @@
1
+ /**
2
+ * User API Key management. Keys are stored encrypted on the platform and
3
+ * injected server-side when apps call `fas.proxy.fetch()`. Apps never see
4
+ * the plaintext key.
5
+ *
6
+ * Key management happens on a platform-hosted page, not in the app UI.
7
+ * Apps use `fas.keys.manage()` to redirect users there.
8
+ */
9
+ export class Keys {
10
+ appId;
11
+ apiBase;
12
+ auth;
13
+ constructor(appId, apiBase, auth) {
14
+ this.appId = appId;
15
+ this.apiBase = apiBase;
16
+ this.auth = auth;
17
+ }
18
+ /**
19
+ * Open the platform's key management page. If a provider is specified,
20
+ * that provider's card will be highlighted on the page.
21
+ *
22
+ * The user manages their keys on the platform page and is redirected
23
+ * back to the app when done.
24
+ *
25
+ * @param provider - Optional provider to highlight (e.g. 'openai')
26
+ */
27
+ manage(provider) {
28
+ const params = new URLSearchParams();
29
+ params.set('app', this.appId);
30
+ params.set('return', window.location.href);
31
+ if (provider)
32
+ params.set('provider', provider);
33
+ window.location.href = `${this.apiBase}/v1/keys?${params}`;
34
+ }
35
+ /**
36
+ * Check which providers the current user has keys configured for.
37
+ * Useful for showing "configure your API key" prompts in the app.
38
+ */
39
+ async status() {
40
+ if (!this.auth.token)
41
+ return [];
42
+ const res = await fetch(`${this.apiBase}/v1/keys/status`, {
43
+ headers: { Authorization: `Bearer ${this.auth.token}`, Accept: 'application/json' },
44
+ });
45
+ if (!res.ok)
46
+ return [];
47
+ const data = (await res.json());
48
+ return data.keys;
49
+ }
50
+ /**
51
+ * Check if the user has a key for a specific provider.
52
+ */
53
+ async has(provider) {
54
+ const keys = await this.status();
55
+ return keys.some((k) => k.provider === provider);
56
+ }
57
+ }
58
+ //# sourceMappingURL=keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../src/keys.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,OAAO,IAAI;IAEI;IACA;IACA;IAHnB,YACmB,KAAa,EACb,OAAe,EACf,IAAU;QAFV,UAAK,GAAL,KAAK,CAAQ;QACb,YAAO,GAAP,OAAO,CAAQ;QACf,SAAI,GAAJ,IAAI,CAAM;IAC1B,CAAC;IAEJ;;;;;;;;OAQG;IACH,MAAM,CAAC,QAAiB;QACtB,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,QAAQ;YAAE,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC/C,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,YAAY,MAAM,EAAE,CAAC;IAC7D,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,MAAM;QACV,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,iBAAiB,EAAE;YACxD,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE;SACpF,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA8G,CAAC;QAC7I,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,QAAgB;QACxB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IACnD,CAAC;CACF"}
@@ -0,0 +1,99 @@
1
+ import { Component, type ReactNode, type CSSProperties } from 'react';
2
+ import type { FreeAppStore } from '../index.js';
3
+ export interface SpinnerProps {
4
+ size?: number;
5
+ color?: string;
6
+ }
7
+ export declare function Spinner({ size, color }: SpinnerProps): import("react/jsx-runtime").JSX.Element;
8
+ export interface BadgeProps {
9
+ children: ReactNode;
10
+ variant?: 'default' | 'accent' | 'success' | 'warning' | 'danger';
11
+ style?: CSSProperties;
12
+ }
13
+ export declare function Badge({ children, variant, style: extraStyle }: BadgeProps): import("react/jsx-runtime").JSX.Element;
14
+ export interface CardProps {
15
+ children: ReactNode;
16
+ onClick?: () => void;
17
+ padding?: string;
18
+ style?: CSSProperties;
19
+ }
20
+ export declare function Card({ children, onClick, padding, style: extraStyle }: CardProps): import("react/jsx-runtime").JSX.Element;
21
+ export interface TabsProps {
22
+ tabs: Array<{
23
+ key: string;
24
+ label: string;
25
+ }>;
26
+ active: string;
27
+ onChange: (key: string) => void;
28
+ style?: CSSProperties;
29
+ }
30
+ export declare function Tabs({ tabs, active, onChange, style: extraStyle }: TabsProps): import("react/jsx-runtime").JSX.Element;
31
+ export interface ModalProps {
32
+ open: boolean;
33
+ onClose: () => void;
34
+ children: ReactNode;
35
+ title?: string;
36
+ maxWidth?: number;
37
+ }
38
+ export declare function Modal({ open, onClose, children, title, maxWidth }: ModalProps): import("react/jsx-runtime").JSX.Element | null;
39
+ export interface ConfirmDialogProps {
40
+ open: boolean;
41
+ onConfirm: () => void;
42
+ onCancel: () => void;
43
+ title: string;
44
+ message: string;
45
+ confirmLabel?: string;
46
+ variant?: 'danger' | 'default';
47
+ }
48
+ export declare function ConfirmDialog({ open, onConfirm, onCancel, title, message, confirmLabel, variant }: ConfirmDialogProps): import("react/jsx-runtime").JSX.Element;
49
+ export interface EmptyStateProps {
50
+ icon?: ReactNode;
51
+ title?: string;
52
+ message: string;
53
+ action?: ReactNode;
54
+ }
55
+ export declare function EmptyState({ icon, title, message, action }: EmptyStateProps): import("react/jsx-runtime").JSX.Element;
56
+ export interface ProgressBarProps {
57
+ value: number;
58
+ max?: number;
59
+ color?: string;
60
+ height?: number;
61
+ label?: string;
62
+ }
63
+ export declare function ProgressBar({ value, max, color, height, label }: ProgressBarProps): import("react/jsx-runtime").JSX.Element;
64
+ export interface SearchInputProps {
65
+ value: string;
66
+ onChange: (value: string) => void;
67
+ placeholder?: string;
68
+ style?: CSSProperties;
69
+ }
70
+ export declare function SearchInput({ value, onChange, placeholder, style: extraStyle }: SearchInputProps): import("react/jsx-runtime").JSX.Element;
71
+ export interface ListRowProps {
72
+ icon?: ReactNode;
73
+ title: string;
74
+ subtitle?: string;
75
+ trailing?: ReactNode;
76
+ onClick?: () => void;
77
+ }
78
+ export declare function ListRow({ icon, title, subtitle, trailing, onClick }: ListRowProps): import("react/jsx-runtime").JSX.Element;
79
+ export interface ErrorBoundaryProps {
80
+ children: ReactNode;
81
+ fallback?: ReactNode;
82
+ }
83
+ interface ErrorBoundaryState {
84
+ error: Error | null;
85
+ }
86
+ export declare class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {
87
+ state: ErrorBoundaryState;
88
+ static getDerivedStateFromError(error: Error): ErrorBoundaryState;
89
+ render(): string | number | bigint | boolean | import("react/jsx-runtime").JSX.Element | Iterable<ReactNode> | Promise<string | number | bigint | boolean | import("react").ReactPortal | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | null | undefined;
90
+ }
91
+ export interface KeyPromptProps {
92
+ app: FreeAppStore;
93
+ provider: string;
94
+ providerName?: string;
95
+ message?: string;
96
+ }
97
+ export declare function KeyPrompt({ app, provider, providerName, message }: KeyPromptProps): import("react/jsx-runtime").JSX.Element;
98
+ export {};
99
+ //# sourceMappingURL=components.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components.d.ts","sourceRoot":"","sources":["../../src/ui/components.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, Component } from 'react';
3
+ // Inject keyframes once
4
+ if (typeof document !== 'undefined' && !document.getElementById('fas-ui-keyframes')) {
5
+ const style = document.createElement('style');
6
+ style.id = 'fas-ui-keyframes';
7
+ style.textContent = '@keyframes fas-spin{to{transform:rotate(360deg)}}@keyframes fas-fade-in{from{opacity:0}to{opacity:1}}@keyframes fas-slide-up{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}';
8
+ document.head.appendChild(style);
9
+ }
10
+ export function Spinner({ size = 24, color = 'var(--accent, #2563eb)' }) {
11
+ return _jsx("div", { style: { width: size, height: size, border: '2px solid var(--border, #e2e8f0)', borderTopColor: color, borderRadius: '50%', animation: 'fas-spin 0.6s linear infinite' } });
12
+ }
13
+ const badgeColors = {
14
+ default: { bg: 'var(--surface, #f8fafc)', color: 'var(--muted, #64748b)', border: 'var(--border, #e2e8f0)' },
15
+ accent: { bg: 'var(--accent-soft, #eff6ff)', color: 'var(--accent, #2563eb)', border: 'var(--accent, #2563eb)' },
16
+ success: { bg: '#f0fdf4', color: '#16a34a', border: '#86efac' },
17
+ warning: { bg: '#fefce8', color: '#ca8a04', border: '#fde047' },
18
+ danger: { bg: '#fef2f2', color: '#dc2626', border: '#fecaca' },
19
+ };
20
+ export function Badge({ children, variant = 'default', style: extraStyle }) {
21
+ const c = badgeColors[variant] ?? badgeColors.default;
22
+ return (_jsx("span", { style: { display: 'inline-flex', alignItems: 'center', gap: '0.25rem', padding: '0.15rem 0.5rem', borderRadius: '9999px', fontSize: '0.75rem', fontWeight: 600, lineHeight: 1.4, background: c.bg, color: c.color, border: `1px solid ${c.border}`, ...extraStyle }, children: children }));
23
+ }
24
+ export function Card({ children, onClick, padding = '1rem', style: extraStyle }) {
25
+ const interactive = !!onClick;
26
+ const Tag = interactive ? 'button' : 'div';
27
+ return (_jsx(Tag, { onClick: onClick, style: { display: 'block', width: '100%', textAlign: 'left', padding, borderRadius: 'var(--radius, 0.75rem)', border: '1px solid var(--border, var(--line, #e2e8f0))', background: 'var(--surface, var(--panel, #ffffff))', cursor: interactive ? 'pointer' : undefined, fontFamily: 'inherit', fontSize: 'inherit', color: 'inherit', transition: 'border-color 0.15s', ...(interactive ? { outline: 'none' } : {}), ...extraStyle }, children: children }));
28
+ }
29
+ export function Tabs({ tabs, active, onChange, style: extraStyle }) {
30
+ return (_jsx("div", { style: { display: 'inline-flex', gap: '0.25rem', padding: '0.25rem', borderRadius: '9999px', border: '1px solid var(--border, var(--line, #e2e8f0))', background: 'var(--surface, var(--glass, #f8fafc))', ...extraStyle }, children: tabs.map((tab) => (_jsx("button", { onClick: () => onChange(tab.key), style: { padding: '0.35rem 0.85rem', borderRadius: '9999px', border: 'none', fontSize: '0.8rem', fontWeight: 600, cursor: 'pointer', fontFamily: 'inherit', transition: 'all 0.15s', background: active === tab.key ? 'var(--ink, #1e293b)' : 'transparent', color: active === tab.key ? 'var(--surface, #ffffff)' : 'var(--muted, #64748b)' }, children: tab.label }, tab.key))) }));
31
+ }
32
+ export function Modal({ open, onClose, children, title, maxWidth = 480 }) {
33
+ useEffect(() => {
34
+ if (!open)
35
+ return;
36
+ const handler = (e) => { if (e.key === 'Escape')
37
+ onClose(); };
38
+ document.addEventListener('keydown', handler);
39
+ return () => document.removeEventListener('keydown', handler);
40
+ }, [open, onClose]);
41
+ if (!open)
42
+ return null;
43
+ return (_jsx("div", { onClick: onClose, style: { position: 'fixed', inset: 0, zIndex: 999, background: 'rgba(0,0,0,0.5)', backdropFilter: 'blur(4px)', display: 'flex', alignItems: 'center', justifyContent: 'center', padding: '1rem', animation: 'fas-fade-in 0.15s' }, children: _jsxs("div", { onClick: (e) => e.stopPropagation(), style: { background: 'var(--surface, var(--panel, #ffffff))', border: '1px solid var(--border, var(--line, #e2e8f0))', borderRadius: 'var(--radius-lg, var(--radius, 0.75rem))', maxWidth, width: '100%', maxHeight: '85dvh', overflow: 'auto', animation: 'fas-slide-up 0.2s' }, children: [title && (_jsxs("div", { style: { display: 'flex', alignItems: 'center', justifyContent: 'space-between', padding: '1rem 1.25rem', borderBottom: '1px solid var(--border, var(--line, #e2e8f0))' }, children: [_jsx("h2", { style: { margin: 0, fontSize: '1rem', fontWeight: 700, color: 'var(--ink, #1e293b)' }, children: title }), _jsx("button", { onClick: onClose, "aria-label": "Close", style: { background: 'none', border: 'none', cursor: 'pointer', padding: '0.25rem', color: 'var(--muted, #64748b)', fontSize: '1.25rem', lineHeight: 1, fontFamily: 'inherit' }, children: "\u00D7" })] })), _jsx("div", { style: { padding: '1.25rem' }, children: children })] }) }));
44
+ }
45
+ export function ConfirmDialog({ open, onConfirm, onCancel, title, message, confirmLabel = 'Confirm', variant = 'default' }) {
46
+ const isDanger = variant === 'danger';
47
+ return (_jsxs(Modal, { open: open, onClose: onCancel, title: title, maxWidth: 400, children: [_jsx("p", { style: { fontSize: '0.9rem', color: 'var(--muted, #64748b)', margin: '0 0 1.25rem' }, children: message }), _jsxs("div", { style: { display: 'flex', gap: '0.5rem', justifyContent: 'flex-end' }, children: [_jsx("button", { onClick: onCancel, style: { padding: '0.5rem 1rem', borderRadius: 'var(--radius-sm, 0.5rem)', border: '1px solid var(--border, #e2e8f0)', background: 'transparent', color: 'var(--ink, #1e293b)', fontSize: '0.85rem', fontWeight: 600, cursor: 'pointer', fontFamily: 'inherit' }, children: "Cancel" }), _jsx("button", { onClick: onConfirm, style: { padding: '0.5rem 1rem', borderRadius: 'var(--radius-sm, 0.5rem)', border: 'none', fontSize: '0.85rem', fontWeight: 600, cursor: 'pointer', fontFamily: 'inherit', background: isDanger ? '#dc2626' : 'var(--accent, #2563eb)', color: '#fff' }, children: confirmLabel })] })] }));
48
+ }
49
+ export function EmptyState({ icon, title, message, action }) {
50
+ return (_jsxs("div", { style: { textAlign: 'center', padding: '3rem 1.5rem' }, children: [icon && _jsx("div", { style: { marginBottom: '0.75rem', color: 'var(--muted, #94a3b8)', fontSize: '2rem' }, children: icon }), title && _jsx("div", { style: { fontSize: '1rem', fontWeight: 700, color: 'var(--ink, #1e293b)', marginBottom: '0.35rem' }, children: title }), _jsx("p", { style: { fontSize: '0.85rem', color: 'var(--muted, #64748b)', margin: '0 0 1rem', maxWidth: 320, marginInline: 'auto' }, children: message }), action] }));
51
+ }
52
+ export function ProgressBar({ value, max = 100, color = 'var(--accent, #2563eb)', height = 8, label }) {
53
+ const pct = Math.min(100, Math.max(0, (value / max) * 100));
54
+ return (_jsxs("div", { children: [label && _jsx("div", { style: { fontSize: '0.75rem', fontWeight: 600, color: 'var(--muted, #64748b)', marginBottom: '0.35rem' }, children: label }), _jsx("div", { style: { width: '100%', height, borderRadius: height, background: 'var(--border, var(--line, #e2e8f0))', overflow: 'hidden' }, children: _jsx("div", { style: { width: `${pct}%`, height: '100%', borderRadius: height, background: color, transition: 'width 0.3s' } }) })] }));
55
+ }
56
+ export function SearchInput({ value, onChange, placeholder = 'Search...', style: extraStyle }) {
57
+ return (_jsxs("div", { style: { position: 'relative', ...extraStyle }, children: [_jsxs("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "none", stroke: "var(--muted, #64748b)", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", style: { position: 'absolute', left: 12, top: '50%', transform: 'translateY(-50%)', pointerEvents: 'none' }, children: [_jsx("circle", { cx: "11", cy: "11", r: "8" }), _jsx("line", { x1: "21", y1: "21", x2: "16.65", y2: "16.65" })] }), _jsx("input", { type: "text", value: value, onChange: (e) => onChange(e.currentTarget.value), placeholder: placeholder, style: { width: '100%', padding: '0.5rem 0.75rem 0.5rem 2.25rem', borderRadius: '9999px', border: '1px solid var(--border, var(--line, #e2e8f0))', background: 'var(--surface, var(--glass, #ffffff))', color: 'var(--ink, #1e293b)', fontSize: '0.85rem', fontFamily: 'inherit', outline: 'none' } })] }));
58
+ }
59
+ export function ListRow({ icon, title, subtitle, trailing, onClick }) {
60
+ const Tag = onClick ? 'button' : 'div';
61
+ return (_jsxs(Tag, { onClick: onClick, style: { display: 'flex', alignItems: 'center', gap: '0.75rem', width: '100%', padding: '0.65rem 0.75rem', background: 'none', border: 'none', borderBottom: '1px solid var(--border, var(--line, #e2e8f0))', textAlign: 'left', cursor: onClick ? 'pointer' : undefined, fontFamily: 'inherit', color: 'inherit' }, children: [icon && _jsx("div", { style: { flexShrink: 0, color: 'var(--muted, #64748b)' }, children: icon }), _jsxs("div", { style: { flex: 1, minWidth: 0 }, children: [_jsx("div", { style: { fontSize: '0.9rem', fontWeight: 600, color: 'var(--ink, #1e293b)', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }, children: title }), subtitle && _jsx("div", { style: { fontSize: '0.75rem', color: 'var(--muted, #64748b)', overflow: 'hidden', textOverflow: 'ellipsis', whiteSpace: 'nowrap' }, children: subtitle })] }), trailing && _jsx("div", { style: { flexShrink: 0 }, children: trailing })] }));
62
+ }
63
+ export class ErrorBoundary extends Component {
64
+ state = { error: null };
65
+ static getDerivedStateFromError(error) { return { error }; }
66
+ render() {
67
+ if (this.state.error) {
68
+ return this.props.fallback ?? (_jsxs("div", { style: { padding: '2rem', textAlign: 'center' }, children: [_jsx("p", { style: { color: '#dc2626', fontWeight: 700, marginBottom: '0.5rem' }, children: "Something went wrong" }), _jsx("p", { style: { color: 'var(--muted, #64748b)', fontSize: '0.85rem' }, children: this.state.error.message })] }));
69
+ }
70
+ return this.props.children;
71
+ }
72
+ }
73
+ export function KeyPrompt({ app, provider, providerName, message }) {
74
+ const name = providerName ?? provider;
75
+ const msg = message ?? `This app uses ${name} and needs your API key. Your key is stored securely on the FreeAppStore platform and is never visible to the app.`;
76
+ return (_jsxs("div", { style: { background: 'var(--surface, var(--panel, #f8fafc))', border: '1px solid var(--border, var(--line, #e2e8f0))', borderRadius: 'var(--radius, 0.75rem)', padding: '1.5rem', maxWidth: 420, margin: '2rem auto', textAlign: 'center' }, children: [_jsx("div", { style: { fontSize: '1.5rem', marginBottom: '0.5rem' }, children: _jsx("svg", { width: "28", height: "28", viewBox: "0 0 24 24", fill: "none", stroke: "var(--muted, #64748b)", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", style: { display: 'inline-block', verticalAlign: 'middle' }, children: _jsx("path", { d: "M21 2l-2 2m-7.61 7.61a5.5 5.5 0 1 1-7.778 7.778 5.5 5.5 0 0 1 7.777-7.777zm0 0L15.5 7.5m0 0l3 3L22 7l-3-3m-3.5 3.5L19 4" }) }) }), _jsxs("div", { style: { fontSize: '1rem', fontWeight: 700, color: 'var(--ink, #1e293b)', marginBottom: '0.5rem' }, children: [name, " API key required"] }), _jsx("p", { style: { fontSize: '0.85rem', color: 'var(--muted, #64748b)', margin: '0 0 1rem', lineHeight: 1.5 }, children: msg }), _jsxs("button", { onClick: () => app.keys.manage(provider), style: { background: 'var(--accent, #2563eb)', color: '#fff', border: 'none', padding: '0.6rem 1.5rem', borderRadius: 'var(--radius, 0.75rem)', fontSize: '0.9rem', fontWeight: 700, cursor: 'pointer', fontFamily: 'inherit' }, children: ["Configure ", name, " key"] })] }));
77
+ }
78
+ //# sourceMappingURL=components.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components.js","sourceRoot":"","sources":["../../src/ui/components.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { FreeAppStore } from '../index.js';
2
+ import type { User } from '../types.js';
3
+ export interface AvatarProps {
4
+ user: User | null;
5
+ size?: number;
6
+ }
7
+ /** GitHub avatar with fallback to colored initial circle. */
8
+ export declare function Avatar({ user, size }: AvatarProps): import("react/jsx-runtime").JSX.Element;
9
+ export interface SignInButtonProps {
10
+ app: FreeAppStore;
11
+ label?: string;
12
+ }
13
+ /** Platform-branded sign-in button. Calls app.auth.signIn(). */
14
+ export declare function SignInButton({ app, label }: SignInButtonProps): import("react/jsx-runtime").JSX.Element;
15
+ /** Sun/moon toggle button. Cycles: system -> light -> dark. */
16
+ export declare function ThemeToggle(): import("react/jsx-runtime").JSX.Element;
17
+ /** Text size toggle. Cycles: default -> large -> small. Shows A/A+/A-. */
18
+ export declare function TextSizeToggle(): import("react/jsx-runtime").JSX.Element;
19
+ //# sourceMappingURL=core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../src/ui/core.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAOxC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,6DAA6D;AAC7D,wBAAgB,MAAM,CAAC,EAAE,IAAI,EAAE,IAAS,EAAE,EAAE,WAAW,2CAmCtD;AAMD,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,YAAY,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,gEAAgE;AAChE,wBAAgB,YAAY,CAAC,EAAE,GAAG,EAAE,KAA6B,EAAE,EAAE,iBAAiB,2CAmBrF;AAMD,+DAA+D;AAC/D,wBAAgB,WAAW,4CAkD1B;AAyBD,0EAA0E;AAC1E,wBAAgB,cAAc,4CA6C7B"}
@@ -0,0 +1,123 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useEffect, useCallback } from 'react';
3
+ import { useTheme } from '../hooks.js';
4
+ /** GitHub avatar with fallback to colored initial circle. */
5
+ export function Avatar({ user, size = 32 }) {
6
+ if (user?.avatarUrl) {
7
+ return (_jsx("img", { src: user.avatarUrl, alt: user.login, width: size, height: size, style: {
8
+ borderRadius: '50%',
9
+ display: 'block',
10
+ } }));
11
+ }
12
+ const initial = user?.login?.charAt(0).toUpperCase() ?? '?';
13
+ return (_jsx("div", { style: {
14
+ width: size,
15
+ height: size,
16
+ borderRadius: '50%',
17
+ background: 'var(--accent, #2563eb)',
18
+ color: '#fff',
19
+ display: 'flex',
20
+ alignItems: 'center',
21
+ justifyContent: 'center',
22
+ fontSize: size * 0.45,
23
+ fontWeight: 700,
24
+ }, children: initial }));
25
+ }
26
+ /** Platform-branded sign-in button. Calls app.auth.signIn(). */
27
+ export function SignInButton({ app, label = 'Sign in with GitHub' }) {
28
+ return (_jsx("button", { onClick: () => app.auth.signIn(), style: {
29
+ background: 'var(--accent, #2563eb)',
30
+ color: '#fff',
31
+ border: 'none',
32
+ padding: '0.6rem 1.5rem',
33
+ borderRadius: 'var(--radius, 0.75rem)',
34
+ fontSize: '0.9rem',
35
+ fontWeight: 700,
36
+ cursor: 'pointer',
37
+ fontFamily: 'inherit',
38
+ }, children: label }));
39
+ }
40
+ // ---------------------------------------------------------------------------
41
+ // ThemeToggle
42
+ // ---------------------------------------------------------------------------
43
+ /** Sun/moon toggle button. Cycles: system -> light -> dark. */
44
+ export function ThemeToggle() {
45
+ const { theme, preference, setPreference } = useTheme();
46
+ const cycle = useCallback(() => {
47
+ const order = ['system', 'light', 'dark'];
48
+ const idx = order.indexOf(preference);
49
+ setPreference(order[(idx + 1) % order.length]);
50
+ }, [preference, setPreference]);
51
+ const icon = theme === 'dark' ? (_jsxs("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("circle", { cx: "12", cy: "12", r: "5" }), _jsx("line", { x1: "12", y1: "1", x2: "12", y2: "3" }), _jsx("line", { x1: "12", y1: "21", x2: "12", y2: "23" }), _jsx("line", { x1: "4.22", y1: "4.22", x2: "5.64", y2: "5.64" }), _jsx("line", { x1: "18.36", y1: "18.36", x2: "19.78", y2: "19.78" }), _jsx("line", { x1: "1", y1: "12", x2: "3", y2: "12" }), _jsx("line", { x1: "21", y1: "12", x2: "23", y2: "12" }), _jsx("line", { x1: "4.22", y1: "19.78", x2: "5.64", y2: "18.36" }), _jsx("line", { x1: "18.36", y1: "5.64", x2: "19.78", y2: "4.22" })] })) : (_jsx("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", children: _jsx("path", { d: "M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z" }) }));
52
+ return (_jsx("button", { onClick: cycle, "aria-label": `Theme: ${preference}`, title: `Theme: ${preference}`, style: {
53
+ width: 36,
54
+ height: 36,
55
+ borderRadius: 'var(--radius, 0.75rem)',
56
+ border: '1px solid var(--border, #e2e8f0)',
57
+ background: 'var(--surface, #ffffff)',
58
+ color: 'var(--ink, #1e293b)',
59
+ display: 'inline-flex',
60
+ alignItems: 'center',
61
+ justifyContent: 'center',
62
+ cursor: 'pointer',
63
+ padding: 0,
64
+ fontFamily: 'inherit',
65
+ }, children: icon }));
66
+ }
67
+ // ---------------------------------------------------------------------------
68
+ // TextSizeToggle
69
+ // ---------------------------------------------------------------------------
70
+ const TEXT_SIZE_KEY = 'stores-text-size';
71
+ function getTextSize() {
72
+ if (typeof window === 'undefined')
73
+ return 'default';
74
+ const stored = window.localStorage.getItem(TEXT_SIZE_KEY);
75
+ if (stored === 'lg' || stored === 'sm')
76
+ return stored;
77
+ return 'default';
78
+ }
79
+ function applyTextSize(size) {
80
+ if (typeof document === 'undefined')
81
+ return;
82
+ if (size === 'default') {
83
+ delete document.documentElement.dataset.text;
84
+ }
85
+ else {
86
+ document.documentElement.dataset.text = size;
87
+ }
88
+ }
89
+ /** Text size toggle. Cycles: default -> large -> small. Shows A/A+/A-. */
90
+ export function TextSizeToggle() {
91
+ const [size, setSize] = useState(getTextSize);
92
+ useEffect(() => {
93
+ applyTextSize(size);
94
+ }, [size]);
95
+ const cycle = useCallback(() => {
96
+ const order = ['default', 'lg', 'sm'];
97
+ const idx = order.indexOf(size);
98
+ const next = order[(idx + 1) % order.length];
99
+ setSize(next);
100
+ if (typeof window !== 'undefined') {
101
+ window.localStorage.setItem(TEXT_SIZE_KEY, next);
102
+ }
103
+ }, [size]);
104
+ const label = size === 'lg' ? 'A+' : size === 'sm' ? 'A\u2212' : 'A';
105
+ const title = size === 'lg' ? 'Text: large' : size === 'sm' ? 'Text: small' : 'Text: default';
106
+ return (_jsx("button", { onClick: cycle, "aria-label": title, title: title, style: {
107
+ width: 36,
108
+ height: 36,
109
+ borderRadius: 'var(--radius, 0.75rem)',
110
+ border: '1px solid var(--line, var(--border, #e2e8f0))',
111
+ background: 'var(--panel, var(--surface, #ffffff))',
112
+ color: 'var(--ink, #1e293b)',
113
+ display: 'inline-flex',
114
+ alignItems: 'center',
115
+ justifyContent: 'center',
116
+ cursor: 'pointer',
117
+ padding: 0,
118
+ fontFamily: 'inherit',
119
+ fontSize: '0.85rem',
120
+ fontWeight: 700,
121
+ }, children: label }));
122
+ }
123
+ //# sourceMappingURL=core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../../src/ui/core.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAGzD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAWvC,6DAA6D;AAC7D,MAAM,UAAU,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,EAAe;IACrD,IAAI,IAAI,EAAE,SAAS,EAAE,CAAC;QACpB,OAAO,CACL,cACE,GAAG,EAAE,IAAI,CAAC,SAAS,EACnB,GAAG,EAAE,IAAI,CAAC,KAAK,EACf,KAAK,EAAE,IAAI,EACX,MAAM,EAAE,IAAI,EACZ,KAAK,EAAE;gBACL,YAAY,EAAE,KAAK;gBACnB,OAAO,EAAE,OAAO;aACjB,GACD,CACH,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,GAAG,CAAC;IAC5D,OAAO,CACL,cACE,KAAK,EAAE;YACL,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,IAAI;YACZ,YAAY,EAAE,KAAK;YACnB,UAAU,EAAE,wBAAwB;YACpC,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,MAAM;YACf,UAAU,EAAE,QAAQ;YACpB,cAAc,EAAE,QAAQ;YACxB,QAAQ,EAAE,IAAI,GAAG,IAAI;YACrB,UAAU,EAAE,GAAG;SAChB,YAEA,OAAO,GACJ,CACP,CAAC;AACJ,CAAC;AAWD,gEAAgE;AAChE,MAAM,UAAU,YAAY,CAAC,EAAE,GAAG,EAAE,KAAK,GAAG,qBAAqB,EAAqB;IACpF,OAAO,CACL,iBACE,OAAO,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,EAChC,KAAK,EAAE;YACL,UAAU,EAAE,wBAAwB;YACpC,KAAK,EAAE,MAAM;YACb,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,eAAe;YACxB,YAAY,EAAE,wBAAwB;YACtC,QAAQ,EAAE,QAAQ;YAClB,UAAU,EAAE,GAAG;YACf,MAAM,EAAE,SAAS;YACjB,UAAU,EAAE,SAAS;SACtB,YAEA,KAAK,GACC,CACV,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E,+DAA+D;AAC/D,MAAM,UAAU,WAAW;IACzB,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,QAAQ,EAAE,CAAC;IAExD,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,MAAM,KAAK,GAAuC,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAC9E,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACtC,aAAa,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAE,CAAC,CAAC;IAClD,CAAC,EAAE,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC;IAEhC,MAAM,IAAI,GAAG,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,CAC9B,eAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,GAAG,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,aAC5I,iBAAQ,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,GAAG,GAAG,EAChC,eAAM,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,GAAG,EACtC,eAAM,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,GAAG,EACxC,eAAM,EAAE,EAAC,MAAM,EAAC,EAAE,EAAC,MAAM,EAAC,EAAE,EAAC,MAAM,EAAC,EAAE,EAAC,MAAM,GAAG,EAChD,eAAM,EAAE,EAAC,OAAO,EAAC,EAAE,EAAC,OAAO,EAAC,EAAE,EAAC,OAAO,EAAC,EAAE,EAAC,OAAO,GAAG,EACpD,eAAM,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,IAAI,GAAG,EACtC,eAAM,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,GAAG,EACxC,eAAM,EAAE,EAAC,MAAM,EAAC,EAAE,EAAC,OAAO,EAAC,EAAE,EAAC,MAAM,EAAC,EAAE,EAAC,OAAO,GAAG,EAClD,eAAM,EAAE,EAAC,OAAO,EAAC,EAAE,EAAC,MAAM,EAAC,EAAE,EAAC,OAAO,EAAC,EAAE,EAAC,MAAM,GAAG,IAC9C,CACP,CAAC,CAAC,CAAC,CACF,cAAK,KAAK,EAAC,IAAI,EAAC,MAAM,EAAC,IAAI,EAAC,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,MAAM,EAAC,MAAM,EAAC,cAAc,EAAC,WAAW,EAAC,GAAG,EAAC,aAAa,EAAC,OAAO,EAAC,cAAc,EAAC,OAAO,YAC5I,eAAM,CAAC,EAAC,iDAAiD,GAAG,GACxD,CACP,CAAC;IAEF,OAAO,CACL,iBACE,OAAO,EAAE,KAAK,gBACF,UAAU,UAAU,EAAE,EAClC,KAAK,EAAE,UAAU,UAAU,EAAE,EAC7B,KAAK,EAAE;YACL,KAAK,EAAE,EAAE;YACT,MAAM,EAAE,EAAE;YACV,YAAY,EAAE,wBAAwB;YACtC,MAAM,EAAE,kCAAkC;YAC1C,UAAU,EAAE,yBAAyB;YACrC,KAAK,EAAE,qBAAqB;YAC5B,OAAO,EAAE,aAAa;YACtB,UAAU,EAAE,QAAQ;YACpB,cAAc,EAAE,QAAQ;YACxB,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,CAAC;YACV,UAAU,EAAE,SAAS;SACtB,YAEA,IAAI,GACE,CACV,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E,MAAM,aAAa,GAAG,kBAAkB,CAAC;AAGzC,SAAS,WAAW;IAClB,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,SAAS,CAAC;IACpD,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC1D,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IACtD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,aAAa,CAAC,IAAc;IACnC,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO;IAC5C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,QAAQ,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC;IAC/C,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,cAAc;IAC5B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAW,WAAW,CAAC,CAAC;IAExD,SAAS,CAAC,GAAG,EAAE;QACb,aAAa,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,MAAM,KAAK,GAAe,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAE,CAAC;QAC9C,OAAO,CAAC,IAAI,CAAC,CAAC;QACd,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;YAClC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QACnD,CAAC;IACH,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAEX,MAAM,KAAK,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;IACrE,MAAM,KAAK,GAAG,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,eAAe,CAAC;IAE9F,OAAO,CACL,iBACE,OAAO,EAAE,KAAK,gBACF,KAAK,EACjB,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE;YACL,KAAK,EAAE,EAAE;YACT,MAAM,EAAE,EAAE;YACV,YAAY,EAAE,wBAAwB;YACtC,MAAM,EAAE,+CAA+C;YACvD,UAAU,EAAE,uCAAuC;YACnD,KAAK,EAAE,qBAAqB;YAC5B,OAAO,EAAE,aAAa;YACtB,UAAU,EAAE,QAAQ;YACpB,cAAc,EAAE,QAAQ;YACxB,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,CAAC;YACV,UAAU,EAAE,SAAS;YACrB,QAAQ,EAAE,SAAS;YACnB,UAAU,EAAE,GAAG;SAChB,YAEA,KAAK,GACC,CACV,CAAC;AACJ,CAAC"}