@freeappstore/sdk 0.10.0 → 0.11.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.
- package/README.md +38 -11
- package/dist/email.d.ts +27 -0
- package/dist/email.d.ts.map +1 -0
- package/dist/email.js +46 -0
- package/dist/email.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/keys.d.ts +40 -0
- package/dist/keys.d.ts.map +1 -0
- package/dist/keys.js +58 -0
- package/dist/keys.js.map +1 -0
- package/dist/ui/components.d.ts +99 -0
- package/dist/ui/components.d.ts.map +1 -0
- package/dist/ui/components.js +78 -0
- package/dist/ui/components.js.map +1 -0
- package/dist/ui/core.d.ts +19 -0
- package/dist/ui/core.d.ts.map +1 -0
- package/dist/ui/core.js +123 -0
- package/dist/ui/core.js.map +1 -0
- package/dist/ui/index.d.ts +7 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +4 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/layout.d.ts +25 -0
- package/dist/ui/layout.d.ts.map +1 -0
- package/dist/ui/layout.js +137 -0
- package/dist/ui/layout.js.map +1 -0
- package/dist/ui.d.ts +1 -44
- package/dist/ui.d.ts.map +1 -1
- package/dist/ui.js +3 -292
- package/dist/ui.js.map +1 -1
- package/package.json +2 -2
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 {
|
|
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
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
<
|
|
171
|
-
<
|
|
172
|
-
<
|
|
173
|
-
<
|
|
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/
|
|
203
|
+
Full docs: [freeappstore.online/skills.md](https://freeappstore.online/skills.md)
|
|
177
204
|
|
|
178
205
|
## For AI Agents
|
|
179
206
|
|
package/dist/email.d.ts
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Auth } from './auth.js';
|
|
2
|
+
/**
|
|
3
|
+
* App transactional email via the platform's Resend integration.
|
|
4
|
+
*
|
|
5
|
+
* Apps don't need their own email provider. The platform sends on behalf
|
|
6
|
+
* of the app using the platform's Resend account.
|
|
7
|
+
*
|
|
8
|
+
* Rate limit: 100 emails/day per app (free tier).
|
|
9
|
+
*/
|
|
10
|
+
export declare class Email {
|
|
11
|
+
private readonly appId;
|
|
12
|
+
private readonly apiBase;
|
|
13
|
+
private readonly auth;
|
|
14
|
+
constructor(appId: string, apiBase: string, auth: Auth);
|
|
15
|
+
/**
|
|
16
|
+
* Send a transactional email.
|
|
17
|
+
*
|
|
18
|
+
* @param to - recipient email address
|
|
19
|
+
* @param subject - email subject (max 200 chars, auto-prefixed with [appId])
|
|
20
|
+
* @param opts - email body (at least one of html or text required)
|
|
21
|
+
*/
|
|
22
|
+
send(to: string, subject: string, opts: {
|
|
23
|
+
html?: string;
|
|
24
|
+
text?: string;
|
|
25
|
+
}): Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=email.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../src/email.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC;;;;;;;GAOG;AACH,qBAAa,KAAK;IAEd,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;;;;;;OAMG;IACG,IAAI,CACR,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,MAAM,EACf,IAAI,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GACrC,OAAO,CAAC,IAAI,CAAC;CAuBjB"}
|
package/dist/email.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* App transactional email via the platform's Resend integration.
|
|
3
|
+
*
|
|
4
|
+
* Apps don't need their own email provider. The platform sends on behalf
|
|
5
|
+
* of the app using the platform's Resend account.
|
|
6
|
+
*
|
|
7
|
+
* Rate limit: 100 emails/day per app (free tier).
|
|
8
|
+
*/
|
|
9
|
+
export class Email {
|
|
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
|
+
* Send a transactional email.
|
|
20
|
+
*
|
|
21
|
+
* @param to - recipient email address
|
|
22
|
+
* @param subject - email subject (max 200 chars, auto-prefixed with [appId])
|
|
23
|
+
* @param opts - email body (at least one of html or text required)
|
|
24
|
+
*/
|
|
25
|
+
async send(to, subject, opts) {
|
|
26
|
+
if (!this.auth.token) {
|
|
27
|
+
throw new Error('email.send: not signed in. Call fas.auth.signIn() first.');
|
|
28
|
+
}
|
|
29
|
+
if (!opts.html && !opts.text) {
|
|
30
|
+
throw new Error('email.send: at least one of html or text is required.');
|
|
31
|
+
}
|
|
32
|
+
const res = await fetch(`${this.apiBase}/v1/apps/${encodeURIComponent(this.appId)}/email/send`, {
|
|
33
|
+
method: 'POST',
|
|
34
|
+
headers: {
|
|
35
|
+
Authorization: `Bearer ${this.auth.token}`,
|
|
36
|
+
'Content-Type': 'application/json',
|
|
37
|
+
},
|
|
38
|
+
body: JSON.stringify({ to, subject, ...opts }),
|
|
39
|
+
});
|
|
40
|
+
if (!res.ok) {
|
|
41
|
+
const data = (await res.json().catch(() => ({})));
|
|
42
|
+
throw new Error(`email.send failed: ${data.error ?? res.statusText}`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=email.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email.js","sourceRoot":"","sources":["../src/email.ts"],"names":[],"mappings":"AAEA;;;;;;;GAOG;AACH,MAAM,OAAO,KAAK;IAEG;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;;;;;;OAMG;IACH,KAAK,CAAC,IAAI,CACR,EAAU,EACV,OAAe,EACf,IAAsC;QAEtC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC9E,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,GAAG,IAAI,CAAC,OAAO,YAAY,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,EACtE;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;gBAC1C,cAAc,EAAE,kBAAkB;aACnC;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,CAAC;SAC/C,CACF,CAAC;QACF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAuB,CAAC;YACxE,MAAM,IAAI,KAAK,CAAC,sBAAsB,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;CACF"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { Auth } from './auth.js';
|
|
2
2
|
import { Counters } from './counters.js';
|
|
3
3
|
import { Collections } from './db.js';
|
|
4
|
+
import { Email } from './email.js';
|
|
5
|
+
import { Keys } from './keys.js';
|
|
4
6
|
import { Kv } from './kv.js';
|
|
5
7
|
import { ApiProxy } from './proxy.js';
|
|
6
8
|
import { Roles } from './roles.js';
|
|
@@ -22,6 +24,8 @@ export declare class FreeAppStore {
|
|
|
22
24
|
readonly rooms: Rooms;
|
|
23
25
|
readonly proxy: ApiProxy;
|
|
24
26
|
readonly roles: Roles;
|
|
27
|
+
readonly keys: Keys;
|
|
28
|
+
readonly email: Email;
|
|
25
29
|
constructor(opts: FasInitOptions);
|
|
26
30
|
}
|
|
27
31
|
/** Create a new FreeAppStore SDK instance for the given app. */
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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;
|
|
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,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,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;IACpB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;gBAEV,IAAI,EAAE,cAAc;CAYjC;AAED,gEAAgE;AAChE,wBAAgB,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,YAAY,CAE1D"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { Auth } from './auth.js';
|
|
2
2
|
import { Counters } from './counters.js';
|
|
3
3
|
import { Collections } from './db.js';
|
|
4
|
+
import { Email } from './email.js';
|
|
5
|
+
import { Keys } from './keys.js';
|
|
4
6
|
import { Kv } from './kv.js';
|
|
5
7
|
import { ApiProxy } from './proxy.js';
|
|
6
8
|
import { Roles } from './roles.js';
|
|
@@ -16,6 +18,8 @@ export class FreeAppStore {
|
|
|
16
18
|
rooms;
|
|
17
19
|
proxy;
|
|
18
20
|
roles;
|
|
21
|
+
keys;
|
|
22
|
+
email;
|
|
19
23
|
constructor(opts) {
|
|
20
24
|
const apiBase = opts.apiBase ?? 'https://api.freeappstore.online';
|
|
21
25
|
this.auth = new Auth(opts.appId, apiBase);
|
|
@@ -25,6 +29,8 @@ export class FreeAppStore {
|
|
|
25
29
|
this.rooms = new Rooms(opts.appId, apiBase, this.auth);
|
|
26
30
|
this.proxy = new ApiProxy(opts.appId, apiBase, this.auth);
|
|
27
31
|
this.roles = new Roles(opts.appId, apiBase, this.auth);
|
|
32
|
+
this.keys = new Keys(opts.appId, apiBase, this.auth);
|
|
33
|
+
this.email = new Email(opts.appId, apiBase, this.auth);
|
|
28
34
|
}
|
|
29
35
|
}
|
|
30
36
|
/** 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,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,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;IACX,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;QACvD,IAAI,CAAC,IAAI,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,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"}
|
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
|
package/dist/keys.js.map
ADDED
|
@@ -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"}
|