@proappstore/sdk 1.9.0 → 1.12.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 +118 -3
- package/dist/hooks.d.ts +11 -0
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +73 -2
- package/dist/hooks.js.map +1 -1
- package/dist/shell.d.ts +10 -2
- package/dist/shell.d.ts.map +1 -1
- package/dist/shell.js +24 -69
- package/dist/shell.js.map +1 -1
- package/dist/ui-primitives.d.ts +33 -0
- package/dist/ui-primitives.d.ts.map +1 -0
- package/dist/ui-primitives.js +153 -0
- package/dist/ui-primitives.js.map +1 -0
- package/dist/ui.d.ts +65 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +275 -0
- package/dist/ui.js.map +1 -0
- package/package.json +6 -2
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @proappstore/sdk
|
|
2
2
|
|
|
3
|
-
Unified SDK for paid apps on **proappstore.online**. Includes everything from `@freeappstore/sdk` (auth, kv, counters, rooms, proxy) plus
|
|
3
|
+
Unified SDK for paid apps on **proappstore.online**. Includes everything from `@freeappstore/sdk` (auth, kv, counters, rooms, proxy) plus per-app SQL database, file storage, maps & routing, subscriptions, license keys, push notifications, SMS, server-side AI, and multi-tenant helpers.
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
@@ -133,9 +133,9 @@ const license = await app.license.current()
|
|
|
133
133
|
const valid = await app.license.validate('LIC-ABC-123')
|
|
134
134
|
```
|
|
135
135
|
|
|
136
|
-
### Maps (Geocoding + Embeds)
|
|
136
|
+
### Maps (Geocoding, Routing + Embeds)
|
|
137
137
|
|
|
138
|
-
Address-to-coordinates and map embeds. Powered by OpenStreetMap/Nominatim. No Google API keys needed.
|
|
138
|
+
Address-to-coordinates, driving directions, and map embeds. Powered by OpenStreetMap/Nominatim/OSRM. No Google API keys needed.
|
|
139
139
|
|
|
140
140
|
```ts
|
|
141
141
|
// Geocode an address
|
|
@@ -145,6 +145,15 @@ const results = await app.maps.geocode('Times Square, New York')
|
|
|
145
145
|
// Reverse geocode
|
|
146
146
|
const place = await app.maps.reverseGeocode(40.758, -73.985)
|
|
147
147
|
|
|
148
|
+
// Driving route between two points
|
|
149
|
+
const route = await app.maps.route(
|
|
150
|
+
{ lat: 40.758, lng: -73.985 }, // from
|
|
151
|
+
{ lat: 40.748, lng: -73.986 }, // to
|
|
152
|
+
)
|
|
153
|
+
// route.geometry — GeoJSON LineString ([lng, lat] pairs)
|
|
154
|
+
// route.distanceMeters
|
|
155
|
+
// route.durationSeconds
|
|
156
|
+
|
|
148
157
|
// Embed map in iframe
|
|
149
158
|
<iframe src={app.maps.embedUrl(40.758, -73.985)} />
|
|
150
159
|
|
|
@@ -192,6 +201,112 @@ app.usage.flush() // final ping (called automatically on pagehide)
|
|
|
192
201
|
|
|
193
202
|
What we record (also documented at <https://proappstore.online/privacy#usage-analytics>): per `(app, user, day)` rollups of session-seconds and API calls. No event-by-event logs, no IP, nothing while the tab is hidden or the user is signed out.
|
|
194
203
|
|
|
204
|
+
### Notifications (Web Push)
|
|
205
|
+
|
|
206
|
+
Push notifications to your users. Subscribe from the browser, send targeted or broadcast pushes from your app (creator-only).
|
|
207
|
+
|
|
208
|
+
```ts
|
|
209
|
+
// User side — subscribe to push notifications
|
|
210
|
+
await app.notifications.subscribe() // requests permission + registers SW
|
|
211
|
+
await app.notifications.unsubscribe()
|
|
212
|
+
const subscribed = await app.notifications.isSubscribed()
|
|
213
|
+
const permission = app.notifications.getPermission() // 'granted' | 'denied' | 'default'
|
|
214
|
+
|
|
215
|
+
// Creator side — send notifications
|
|
216
|
+
await app.notifications.send('user-123', {
|
|
217
|
+
title: 'Event starting!',
|
|
218
|
+
body: 'The meetup begins in 10 minutes.',
|
|
219
|
+
url: '/events/evt-1', // opens on click
|
|
220
|
+
})
|
|
221
|
+
|
|
222
|
+
// Broadcast to all subscribers
|
|
223
|
+
await app.notifications.broadcast({
|
|
224
|
+
title: 'New feature!',
|
|
225
|
+
body: 'Check out the new map view.',
|
|
226
|
+
})
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
Your app needs a service worker for push. Save `Notifications.getServiceWorkerScript()` as `/sw.js`, or append it to an existing one:
|
|
230
|
+
|
|
231
|
+
```ts
|
|
232
|
+
import { Notifications } from '@proappstore/sdk'
|
|
233
|
+
|
|
234
|
+
// Generate sw.js content
|
|
235
|
+
const swCode = Notifications.getServiceWorkerScript()
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
### SMS
|
|
239
|
+
|
|
240
|
+
Send text messages via the platform (Twilio-backed server-side). The platform owns the Twilio credentials — your app never sees them. Creator-only. Numbers must be E.164 format (`+15551234567`).
|
|
241
|
+
|
|
242
|
+
```ts
|
|
243
|
+
// Send to one recipient
|
|
244
|
+
await app.sms.send('+15551234567', 'Your reservation is confirmed!')
|
|
245
|
+
|
|
246
|
+
// Broadcast to many
|
|
247
|
+
await app.sms.broadcast(
|
|
248
|
+
['+15551234567', '+15559876543'],
|
|
249
|
+
'Meetup starts in 30 minutes!',
|
|
250
|
+
)
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
### AI (Server-side LLM + Embeddings)
|
|
254
|
+
|
|
255
|
+
Workers AI — text generation, chat, and embeddings included in the platform subscription. No per-app key management; the platform handles billing.
|
|
256
|
+
|
|
257
|
+
```ts
|
|
258
|
+
// Text generation
|
|
259
|
+
const { text } = await app.ai.generate('Write a haiku about coding')
|
|
260
|
+
|
|
261
|
+
// With model selection: 'fast' (Llama-3.1-8B) or 'smart' (Llama-3.3-70B)
|
|
262
|
+
const { text } = await app.ai.generate('Summarize this article...', {
|
|
263
|
+
model: 'smart',
|
|
264
|
+
maxTokens: 512,
|
|
265
|
+
temperature: 0.7,
|
|
266
|
+
})
|
|
267
|
+
|
|
268
|
+
// Multi-turn chat
|
|
269
|
+
const { text } = await app.ai.chat([
|
|
270
|
+
{ role: 'system', content: 'You are a helpful event planner.' },
|
|
271
|
+
{ role: 'user', content: 'Suggest a venue for 50 people in SF.' },
|
|
272
|
+
])
|
|
273
|
+
|
|
274
|
+
// Embeddings — for search, recommendations, clustering
|
|
275
|
+
const { vectors } = await app.ai.embed('vinyasa flow')
|
|
276
|
+
// vectors[0] is a 1024-dim float array
|
|
277
|
+
|
|
278
|
+
// Batch embeddings with model selection: 'm3' (multilingual, 1024-dim) or 'base' (English, 768-dim)
|
|
279
|
+
const { vectors, dimensions } = await app.ai.embed(
|
|
280
|
+
['yoga', 'pilates', 'meditation'],
|
|
281
|
+
{ model: 'base' },
|
|
282
|
+
)
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
### Tenant Scope (Multi-tenant helpers)
|
|
286
|
+
|
|
287
|
+
Safe-by-default CRUD helpers for multi-tenant tables. Auto-injects `tenant_id` on inserts and auto-scopes all reads/writes — prevents accidental cross-tenant data leaks.
|
|
288
|
+
|
|
289
|
+
```ts
|
|
290
|
+
// Create a scoped handle for a specific tenant
|
|
291
|
+
const tx = app.db.tenant('studio-123')
|
|
292
|
+
|
|
293
|
+
// All operations are automatically scoped to tenant_id = 'studio-123'
|
|
294
|
+
await tx.insert('clients', { id: 'c-1', name: 'Alice' })
|
|
295
|
+
const alice = await tx.find('clients', { id: 'c-1' })
|
|
296
|
+
const all = await tx.findMany('clients')
|
|
297
|
+
const count = await tx.count('clients')
|
|
298
|
+
await tx.update('clients', { id: 'c-1' }, { name: 'Alicia' })
|
|
299
|
+
await tx.delete('clients', { id: 'c-1' })
|
|
300
|
+
|
|
301
|
+
// Escape hatch — raw SQL with tenant_id available
|
|
302
|
+
const { rows } = await tx.db.query(
|
|
303
|
+
'SELECT * FROM clients WHERE name LIKE ? AND tenant_id = ?',
|
|
304
|
+
['A%', tx.tenantId],
|
|
305
|
+
)
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
Your multi-tenant tables must have a `tenant_id TEXT` column. TenantScope doesn't replace `app.db.query` / `app.db.execute` — use those for joins, aggregates, or cross-tenant admin queries.
|
|
309
|
+
|
|
195
310
|
## React Hooks (recommended)
|
|
196
311
|
|
|
197
312
|
Hooks give you full control over your UI while the platform handles auth, subscriptions, and gating. Import from `@proappstore/sdk/hooks`.
|
package/dist/hooks.d.ts
CHANGED
|
@@ -2,6 +2,17 @@ import type { ProAppStore } from './index.js';
|
|
|
2
2
|
import type { Subscription } from './types.js';
|
|
3
3
|
export type { User } from '@freeappstore/sdk';
|
|
4
4
|
export type { NotificationPayload, SendResult } from './notifications.js';
|
|
5
|
+
type ThemePreference = 'light' | 'dark' | 'system';
|
|
6
|
+
type ResolvedTheme = 'light' | 'dark';
|
|
7
|
+
/**
|
|
8
|
+
* Theme hook — zero-provider. Reads/writes localStorage, applies data-theme on <html>.
|
|
9
|
+
* Shared with FAS SDK (vendored, same localStorage key).
|
|
10
|
+
*/
|
|
11
|
+
export declare function useTheme(): {
|
|
12
|
+
theme: ResolvedTheme;
|
|
13
|
+
preference: ThemePreference;
|
|
14
|
+
setPreference: (pref: ThemePreference) => void;
|
|
15
|
+
};
|
|
5
16
|
/**
|
|
6
17
|
* Auth state + actions. The primary way apps interact with platform identity.
|
|
7
18
|
*
|
package/dist/hooks.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,YAAY,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAC9C,YAAY,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,YAAY,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAC9C,YAAY,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAO1E,KAAK,eAAe,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;AACnD,KAAK,aAAa,GAAG,OAAO,GAAG,MAAM,CAAC;AAwDtC;;;GAGG;AACH,wBAAgB,QAAQ;;;0BAGmB,eAAe;EASzD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,WAAW;;;;;;EAuB1C;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,WAAW;;;;wBAiBJ,MAAM;;EAapD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,WAAW;;;;;;EAoCnD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE;;;;;;;;wBAhF5B,MAAM;;EA+GpD"}
|
package/dist/hooks.js
CHANGED
|
@@ -1,4 +1,72 @@
|
|
|
1
|
-
import { useState, useEffect, useCallback } from 'react';
|
|
1
|
+
import { useState, useEffect, useCallback, useSyncExternalStore } from 'react';
|
|
2
|
+
// ---------------------------------------------------------------------------
|
|
3
|
+
// useTheme — vendored from @freeappstore/sdk/hooks
|
|
4
|
+
// ---------------------------------------------------------------------------
|
|
5
|
+
const THEME_KEY = 'fas:theme';
|
|
6
|
+
const themeListeners = new Set();
|
|
7
|
+
function getSystemTheme() {
|
|
8
|
+
if (typeof window === 'undefined')
|
|
9
|
+
return 'light';
|
|
10
|
+
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
|
|
11
|
+
}
|
|
12
|
+
function getStoredPreference() {
|
|
13
|
+
if (typeof window === 'undefined')
|
|
14
|
+
return 'system';
|
|
15
|
+
const stored = window.localStorage.getItem(THEME_KEY);
|
|
16
|
+
if (stored === 'light' || stored === 'dark' || stored === 'system')
|
|
17
|
+
return stored;
|
|
18
|
+
return 'system';
|
|
19
|
+
}
|
|
20
|
+
function resolveTheme(pref) {
|
|
21
|
+
return pref === 'system' ? getSystemTheme() : pref;
|
|
22
|
+
}
|
|
23
|
+
function applyTheme(theme) {
|
|
24
|
+
if (typeof document === 'undefined')
|
|
25
|
+
return;
|
|
26
|
+
document.documentElement.setAttribute('data-theme', theme);
|
|
27
|
+
document.documentElement.classList.toggle('dark', theme === 'dark');
|
|
28
|
+
}
|
|
29
|
+
function notifyThemeListeners() {
|
|
30
|
+
for (const fn of themeListeners)
|
|
31
|
+
fn();
|
|
32
|
+
}
|
|
33
|
+
if (typeof window !== 'undefined') {
|
|
34
|
+
applyTheme(resolveTheme(getStoredPreference()));
|
|
35
|
+
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', () => {
|
|
36
|
+
if (getStoredPreference() === 'system') {
|
|
37
|
+
applyTheme(getSystemTheme());
|
|
38
|
+
notifyThemeListeners();
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
function subscribeTheme(cb) {
|
|
43
|
+
themeListeners.add(cb);
|
|
44
|
+
return () => themeListeners.delete(cb);
|
|
45
|
+
}
|
|
46
|
+
function getThemeSnapshot() {
|
|
47
|
+
const preference = getStoredPreference();
|
|
48
|
+
return { theme: resolveTheme(preference), preference };
|
|
49
|
+
}
|
|
50
|
+
let cachedSnapshot = getThemeSnapshot();
|
|
51
|
+
function getSnapshot() {
|
|
52
|
+
return cachedSnapshot;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Theme hook — zero-provider. Reads/writes localStorage, applies data-theme on <html>.
|
|
56
|
+
* Shared with FAS SDK (vendored, same localStorage key).
|
|
57
|
+
*/
|
|
58
|
+
export function useTheme() {
|
|
59
|
+
const snapshot = useSyncExternalStore(subscribeTheme, getSnapshot, getSnapshot);
|
|
60
|
+
const setPreference = useCallback((pref) => {
|
|
61
|
+
if (typeof window === 'undefined')
|
|
62
|
+
return;
|
|
63
|
+
window.localStorage.setItem(THEME_KEY, pref);
|
|
64
|
+
applyTheme(resolveTheme(pref));
|
|
65
|
+
cachedSnapshot = getThemeSnapshot();
|
|
66
|
+
notifyThemeListeners();
|
|
67
|
+
}, []);
|
|
68
|
+
return { theme: snapshot.theme, preference: snapshot.preference, setPreference };
|
|
69
|
+
}
|
|
2
70
|
/**
|
|
3
71
|
* Auth state + actions. The primary way apps interact with platform identity.
|
|
4
72
|
*
|
|
@@ -129,6 +197,9 @@ export function useProNotifications(app) {
|
|
|
129
197
|
export function useProGate(app, opts) {
|
|
130
198
|
const auth = useProAuth(app);
|
|
131
199
|
const sub = useProSubscription(app);
|
|
200
|
+
// allowFree defaults to true while the platform has no payments wired up —
|
|
201
|
+
// see ProShell for the matching default. Flip back when Stripe is live.
|
|
202
|
+
const allowFree = opts?.allowFree ?? true;
|
|
132
203
|
let gate;
|
|
133
204
|
if (auth.loading || (auth.user && sub.loading)) {
|
|
134
205
|
gate = 'loading';
|
|
@@ -136,7 +207,7 @@ export function useProGate(app, opts) {
|
|
|
136
207
|
else if (!auth.user) {
|
|
137
208
|
gate = 'signed-out';
|
|
138
209
|
}
|
|
139
|
-
else if (!
|
|
210
|
+
else if (!allowFree && !sub.isPro) {
|
|
140
211
|
gate = 'no-subscription';
|
|
141
212
|
}
|
|
142
213
|
else {
|
package/dist/hooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAQ/E,8EAA8E;AAC9E,mDAAmD;AACnD,8EAA8E;AAE9E,MAAM,SAAS,GAAG,WAAW,CAAC;AAI9B,MAAM,cAAc,GAAG,IAAI,GAAG,EAAc,CAAC;AAE7C,SAAS,cAAc;IACrB,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,OAAO,CAAC;IAClD,OAAO,MAAM,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;AACtF,CAAC;AAED,SAAS,mBAAmB;IAC1B,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,QAAQ,CAAC;IACnD,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACtD,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC;IAClF,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,YAAY,CAAC,IAAqB;IACzC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACrD,CAAC;AAED,SAAS,UAAU,CAAC,KAAoB;IACtC,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO;IAC5C,QAAQ,CAAC,eAAe,CAAC,YAAY,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IAC3D,QAAQ,CAAC,eAAe,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,KAAK,MAAM,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,oBAAoB;IAC3B,KAAK,MAAM,EAAE,IAAI,cAAc;QAAE,EAAE,EAAE,CAAC;AACxC,CAAC;AAED,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;IAClC,UAAU,CAAC,YAAY,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC;IAChD,MAAM,CAAC,UAAU,CAAC,8BAA8B,CAAC,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,EAAE;QAChF,IAAI,mBAAmB,EAAE,KAAK,QAAQ,EAAE,CAAC;YACvC,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC;YAC7B,oBAAoB,EAAE,CAAC;QACzB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CAAC,EAAc;IACpC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACvB,OAAO,GAAG,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,gBAAgB;IACvB,MAAM,UAAU,GAAG,mBAAmB,EAAE,CAAC;IACzC,OAAO,EAAE,KAAK,EAAE,YAAY,CAAC,UAAU,CAAC,EAAE,UAAU,EAAE,CAAC;AACzD,CAAC;AAED,IAAI,cAAc,GAAG,gBAAgB,EAAE,CAAC;AAExC,SAAS,WAAW;IAClB,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,QAAQ;IACtB,MAAM,QAAQ,GAAG,oBAAoB,CAAC,cAAc,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;IAEhF,MAAM,aAAa,GAAG,WAAW,CAAC,CAAC,IAAqB,EAAE,EAAE;QAC1D,IAAI,OAAO,MAAM,KAAK,WAAW;YAAE,OAAO;QAC1C,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC7C,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/B,cAAc,GAAG,gBAAgB,EAAE,CAAC;QACpC,oBAAoB,EAAE,CAAC;IACzB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,aAAa,EAAE,CAAC;AACnF,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,UAAU,CAAC,GAAgB;IACzC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE7C,SAAS,CAAC,GAAG,EAAE;QACb,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;QACjD,OAAO,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAEV,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAE7D,MAAM,aAAa,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAC3C,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;YACjC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACV,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;IACrB,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAEV,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;AAC3D,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAgB;IACjD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAsB,IAAI,CAAC,CAAC;IAC5E,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE7C,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;YACpB,UAAU,CAAC,KAAK,CAAC,CAAC;YAClB,OAAO;QACT,CAAC;QACD,GAAG,CAAC,YAAY,CAAC,MAAM,EAAE;aACtB,IAAI,CAAC,eAAe,CAAC;aACrB,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;aACf,OAAO,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IACtC,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAEzB,MAAM,KAAK,GAAG,YAAY,EAAE,MAAM,KAAK,QAAQ,CAAC;IAEhD,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE,OAAgB,EAAE,EAAE;QACrD,MAAM,GAAG,CAAC,YAAY,CAAC,YAAY,CAAC;YAClC,OAAO,EAAE,OAAO,IAAI,mBAAmB;YACvC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,YAAY;YAClG,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI;SAChC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAEV,MAAM,aAAa,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAC3C,MAAM,GAAG,CAAC,YAAY,CAAC,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC1D,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAEV,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;AAClE,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,mBAAmB,CAAC,GAAgB;IAClD,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAC1C,GAAG,CAAC,aAAa,CAAC,aAAa,EAAE,CAClC,CAAC;IACF,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IACxD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE7C,SAAS,CAAC,GAAG,EAAE;QACb,GAAG,CAAC,aAAa,CAAC,YAAY,EAAE;aAC7B,IAAI,CAAC,eAAe,CAAC;aACrB,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;aACf,OAAO,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;IACtC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAEV,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACvC,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;YACpC,eAAe,CAAC,IAAI,CAAC,CAAC;YACtB,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC,CAAC;QACnD,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAEV,MAAM,WAAW,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACzC,UAAU,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;YACtC,eAAe,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;gBAAS,CAAC;YACT,UAAU,CAAC,KAAK,CAAC,CAAC;QACpB,CAAC;IACH,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAEV,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;AACvE,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,UAAU,CAAC,GAAgB,EAAE,IAA8B;IACzE,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC7B,MAAM,GAAG,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAEpC,2EAA2E;IAC3E,wEAAwE;IACxE,MAAM,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,IAAI,CAAC;IAE1C,IAAI,IAA4D,CAAC;IAEjE,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/C,IAAI,GAAG,SAAS,CAAC;IACnB,CAAC;SAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACtB,IAAI,GAAG,YAAY,CAAC;IACtB,CAAC;SAAM,IAAI,CAAC,SAAS,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;QACpC,IAAI,GAAG,iBAAiB,CAAC;IAC3B,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,OAAO,CAAC;IACjB,CAAC;IAED,OAAO;QACL,IAAI;QACJ,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,YAAY,EAAE,GAAG,CAAC,YAAY;QAC9B,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,OAAO,EAAE,GAAG,CAAC,OAAO;QACpB,aAAa,EAAE,GAAG,CAAC,aAAa;KACjC,CAAC;AACJ,CAAC"}
|
package/dist/shell.d.ts
CHANGED
|
@@ -7,8 +7,15 @@ export interface ProShellProps {
|
|
|
7
7
|
children: ReactNode;
|
|
8
8
|
/** App name shown in the topbar. */
|
|
9
9
|
appName?: string;
|
|
10
|
-
/**
|
|
10
|
+
/**
|
|
11
|
+
* If true, allow free users to see the app (no subscription gate).
|
|
12
|
+
*
|
|
13
|
+
* Default: true while the platform has no payments wired up — every PAS app
|
|
14
|
+
* is free to use. Flip the default back to false once Stripe billing is live.
|
|
15
|
+
*/
|
|
11
16
|
allowFree?: boolean;
|
|
17
|
+
/** Show theme toggle in the profile menu. Default: true. */
|
|
18
|
+
showThemeToggle?: boolean;
|
|
12
19
|
}
|
|
13
20
|
/**
|
|
14
21
|
* ProShell — platform-level Shell for all ProAppStore apps.
|
|
@@ -17,6 +24,7 @@ export interface ProShellProps {
|
|
|
17
24
|
* - Auth initialization + sign-in gate
|
|
18
25
|
* - Subscription check + upgrade wall (unless allowFree=true)
|
|
19
26
|
* - Topbar with avatar, app name, menu (sign out, delete account, manage billing)
|
|
27
|
+
* - Theme support via CSS custom properties
|
|
20
28
|
* - Only renders children when all gates pass
|
|
21
29
|
*
|
|
22
30
|
* Usage:
|
|
@@ -35,5 +43,5 @@ export interface ProShellProps {
|
|
|
35
43
|
* }
|
|
36
44
|
* ```
|
|
37
45
|
*/
|
|
38
|
-
export declare function ProShell({ app, children, appName, allowFree }: ProShellProps): import("react/jsx-runtime").JSX.Element;
|
|
46
|
+
export declare function ProShell({ app, children, appName, allowFree, showThemeToggle }: ProShellProps): import("react/jsx-runtime").JSX.Element;
|
|
39
47
|
//# sourceMappingURL=shell.d.ts.map
|
package/dist/shell.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../src/shell.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../src/shell.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAI9C,MAAM,WAAW,aAAa;IAC5B,mDAAmD;IACnD,GAAG,EAAE,WAAW,CAAC;IACjB,6EAA6E;IAC7E,QAAQ,EAAE,SAAS,CAAC;IACpB,oCAAoC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,4DAA4D;IAC5D,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAID;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,QAAQ,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAgB,EAAE,eAAsB,EAAE,EAAE,aAAa,2CA6D3G"}
|
package/dist/shell.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { useState, useEffect, useCallback } from 'react';
|
|
3
|
+
import { ProfileMenu, SignInButton, ProBadge, GateScreen } from './ui.js';
|
|
3
4
|
/**
|
|
4
5
|
* ProShell — platform-level Shell for all ProAppStore apps.
|
|
5
6
|
*
|
|
@@ -7,6 +8,7 @@ import { useState, useEffect, useCallback } from 'react';
|
|
|
7
8
|
* - Auth initialization + sign-in gate
|
|
8
9
|
* - Subscription check + upgrade wall (unless allowFree=true)
|
|
9
10
|
* - Topbar with avatar, app name, menu (sign out, delete account, manage billing)
|
|
11
|
+
* - Theme support via CSS custom properties
|
|
10
12
|
* - Only renders children when all gates pass
|
|
11
13
|
*
|
|
12
14
|
* Usage:
|
|
@@ -25,11 +27,10 @@ import { useState, useEffect, useCallback } from 'react';
|
|
|
25
27
|
* }
|
|
26
28
|
* ```
|
|
27
29
|
*/
|
|
28
|
-
export function ProShell({ app, children, appName, allowFree =
|
|
30
|
+
export function ProShell({ app, children, appName, allowFree = true, showThemeToggle = true }) {
|
|
29
31
|
const [user, setUser] = useState(app.auth.user);
|
|
30
32
|
const [subscription, setSubscription] = useState(null);
|
|
31
33
|
const [gate, setGate] = useState('loading');
|
|
32
|
-
const [menuOpen, setMenuOpen] = useState(false);
|
|
33
34
|
useEffect(() => {
|
|
34
35
|
app.auth.init();
|
|
35
36
|
return app.auth.onChange((u) => {
|
|
@@ -38,93 +39,47 @@ export function ProShell({ app, children, appName, allowFree = false }) {
|
|
|
38
39
|
setGate('signed-out');
|
|
39
40
|
});
|
|
40
41
|
}, [app]);
|
|
41
|
-
// Check subscription after auth
|
|
42
|
+
// Check subscription after auth.
|
|
42
43
|
useEffect(() => {
|
|
43
44
|
if (!user)
|
|
44
45
|
return;
|
|
45
|
-
if (allowFree) {
|
|
46
|
-
setGate('ready');
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
46
|
app.subscription.status().then((sub) => {
|
|
50
47
|
setSubscription(sub);
|
|
51
|
-
if (sub?.status === 'active') {
|
|
48
|
+
if (allowFree || sub?.status === 'active') {
|
|
52
49
|
setGate('ready');
|
|
53
50
|
}
|
|
54
51
|
else {
|
|
55
52
|
setGate('no-subscription');
|
|
56
53
|
}
|
|
57
54
|
}).catch(() => {
|
|
58
|
-
|
|
55
|
+
setSubscription(null);
|
|
56
|
+
setGate(allowFree ? 'ready' : 'no-subscription');
|
|
59
57
|
});
|
|
60
58
|
}, [user, app, allowFree]);
|
|
61
|
-
const handleSignOut = useCallback(() => {
|
|
62
|
-
app.auth.signOut();
|
|
63
|
-
setMenuOpen(false);
|
|
64
|
-
}, [app]);
|
|
65
|
-
const handleDeleteAccount = useCallback(async () => {
|
|
66
|
-
if (!confirm('Delete your account? This permanently removes ALL your data across ALL apps and cancels your subscription. This cannot be undone.'))
|
|
67
|
-
return;
|
|
68
|
-
if (!confirm('Are you absolutely sure? Type thinking... Last chance.'))
|
|
69
|
-
return;
|
|
70
|
-
// Delete all KV data
|
|
71
|
-
try {
|
|
72
|
-
const keys = await app.kv.list();
|
|
73
|
-
for (const key of keys) {
|
|
74
|
-
await app.kv.delete(key);
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
catch { }
|
|
78
|
-
app.auth.signOut();
|
|
79
|
-
setMenuOpen(false);
|
|
80
|
-
}, [app]);
|
|
81
|
-
const handleManageBilling = useCallback(async () => {
|
|
82
|
-
try {
|
|
83
|
-
await app.subscription.openPortal(window.location.href);
|
|
84
|
-
}
|
|
85
|
-
catch { }
|
|
86
|
-
setMenuOpen(false);
|
|
87
|
-
}, [app]);
|
|
88
|
-
const handleUpgrade = useCallback(async () => {
|
|
89
|
-
await app.subscription.openCheckout({
|
|
90
|
-
priceId: 'price_pro_monthly',
|
|
91
|
-
successUrl: window.location.href + '?upgraded=1',
|
|
92
|
-
cancelUrl: window.location.href,
|
|
93
|
-
});
|
|
94
|
-
}, [app]);
|
|
95
59
|
// --- Gates ---
|
|
96
|
-
if (gate
|
|
97
|
-
return _jsx(
|
|
98
|
-
}
|
|
99
|
-
if (gate === 'signed-out') {
|
|
100
|
-
return (_jsx("div", { style: styles.center, children: _jsxs("div", { style: styles.card, children: [_jsx("h1", { style: styles.heading, children: appName || 'ProAppStore' }), _jsx("p", { style: styles.muted, children: "Sign in to your ProAppStore account to continue." }), _jsx("button", { onClick: () => app.auth.signIn(), style: styles.primaryBtn, children: "Sign in with GitHub" }), _jsx("p", { style: { ...styles.muted, fontSize: '0.75rem', marginTop: '0.75rem' }, children: "One account for all Pro apps." })] }) }));
|
|
101
|
-
}
|
|
102
|
-
if (gate === 'no-subscription') {
|
|
103
|
-
return (_jsx("div", { style: styles.center, children: _jsxs("div", { style: styles.card, children: [_jsx("h1", { style: styles.heading, children: "Pro subscription required" }), _jsxs("p", { style: styles.muted, children: [appName || 'This app', " requires an active ProAppStore subscription ($9/month)."] }), _jsx("button", { onClick: handleUpgrade, style: styles.primaryBtn, children: "Subscribe to Pro" }), _jsx("button", { onClick: handleSignOut, style: styles.ghostBtn, children: "Sign out" })] }) }));
|
|
60
|
+
if (gate !== 'ready') {
|
|
61
|
+
return _jsx(GateScreen, { gate: gate, app: app, appName: appName });
|
|
104
62
|
}
|
|
105
63
|
// --- Ready: render app with topbar ---
|
|
106
|
-
return (_jsxs("div", { style: styles.shell, children: [_jsxs("header", { style: styles.topbar, children: [_jsxs("div", { style: styles.topbarLeft, children: [_jsx("a", { href: "https://proappstore.online", style: styles.logoLink, children: "Pro" }), appName && _jsx("span", { style: styles.appName, children: appName })
|
|
64
|
+
return (_jsxs("div", { style: styles.shell, children: [_jsxs("header", { style: styles.topbar, children: [_jsxs("div", { style: styles.topbarLeft, children: [_jsx("a", { href: "https://proappstore.online", style: styles.logoLink, children: "Pro" }), appName && _jsx("span", { style: styles.appName, children: appName }), subscription?.status === 'active' && _jsx(ProBadge, {})] }), _jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '0.5rem' }, children: [!user && _jsx(SignInButton, { app: app, label: "Sign in" }), user && _jsx(ProfileMenu, { app: app, showThemeToggle: showThemeToggle })] })] }), _jsx("main", { style: styles.main, children: children }), _jsxs("footer", { style: styles.footer, children: ["Part of", ' ', _jsx("a", { href: "https://proappstore.online", style: { color: 'var(--accent, #7c3aed)', fontWeight: 600, textDecoration: 'none' }, children: "ProAppStore" })] })] }));
|
|
107
65
|
}
|
|
108
|
-
// --- Inline styles (no Tailwind dependency — works in any app) ---
|
|
109
66
|
const styles = {
|
|
110
67
|
shell: { minHeight: '100dvh', display: 'flex', flexDirection: 'column' },
|
|
111
|
-
topbar: {
|
|
68
|
+
topbar: {
|
|
69
|
+
display: 'flex', alignItems: 'center', justifyContent: 'space-between',
|
|
70
|
+
padding: '0.5rem 1rem',
|
|
71
|
+
borderBottom: '1px solid var(--border, #e2e8f0)',
|
|
72
|
+
background: 'var(--surface, #ffffff)',
|
|
73
|
+
position: 'sticky', top: 0, zIndex: 50,
|
|
74
|
+
},
|
|
112
75
|
topbarLeft: { display: 'flex', alignItems: 'center', gap: '0.75rem' },
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
appName: { fontSize: '0.85rem', fontWeight: 600, color: '#444' },
|
|
116
|
-
avatarBtn: { background: 'none', border: '2px solid #e5e5e5', borderRadius: '50%', padding: 0, cursor: 'pointer', width: 32, height: 32, overflow: 'hidden' },
|
|
117
|
-
avatar: { width: '100%', height: '100%', borderRadius: '50%' },
|
|
118
|
-
menu: { position: 'absolute', top: 40, right: 0, background: '#fff', border: '1px solid #e5e5e5', borderRadius: '0.75rem', boxShadow: '0 4px 20px rgba(0,0,0,0.1)', minWidth: 180, padding: '0.5rem 0', zIndex: 100 },
|
|
119
|
-
menuHeader: { padding: '0.5rem 1rem', borderBottom: '1px solid #f0f0f0', display: 'flex', alignItems: 'center', gap: '0.5rem', fontSize: '0.85rem' },
|
|
120
|
-
menuItem: { display: 'block', width: '100%', padding: '0.5rem 1rem', background: 'none', border: 'none', textAlign: 'left', fontSize: '0.85rem', cursor: 'pointer', color: '#333' },
|
|
121
|
-
proBadge: { fontSize: '0.6rem', fontWeight: 700, background: '#7c3aed', color: '#fff', padding: '0.1rem 0.4rem', borderRadius: '0.25rem' },
|
|
122
|
-
center: { minHeight: '100dvh', display: 'flex', alignItems: 'center', justifyContent: 'center', padding: '2rem' },
|
|
123
|
-
card: { maxWidth: 400, textAlign: 'center' },
|
|
124
|
-
heading: { fontSize: '1.5rem', fontWeight: 800, marginBottom: '0.5rem', color: '#111' },
|
|
125
|
-
muted: { color: '#666', fontSize: '0.9rem', marginBottom: '1rem' },
|
|
126
|
-
primaryBtn: { background: '#7c3aed', color: '#fff', border: 'none', padding: '0.75rem 2rem', borderRadius: '0.75rem', fontSize: '0.9rem', fontWeight: 700, cursor: 'pointer', marginTop: '0.5rem' },
|
|
127
|
-
ghostBtn: { background: 'none', color: '#666', border: 'none', padding: '0.5rem 1rem', fontSize: '0.8rem', cursor: 'pointer', marginTop: '0.5rem' },
|
|
76
|
+
logoLink: { fontWeight: 800, fontSize: '1rem', color: 'var(--accent, #7c3aed)', textDecoration: 'none' },
|
|
77
|
+
appName: { fontSize: '0.85rem', fontWeight: 600, color: 'var(--muted, #64748b)' },
|
|
128
78
|
main: { flex: 1, display: 'flex', flexDirection: 'column' },
|
|
79
|
+
footer: {
|
|
80
|
+
padding: '1rem', textAlign: 'center', fontSize: '0.75rem',
|
|
81
|
+
color: 'var(--muted, #64748b)',
|
|
82
|
+
borderTop: '1px solid var(--border, #e2e8f0)',
|
|
83
|
+
},
|
|
129
84
|
};
|
|
130
85
|
//# sourceMappingURL=shell.js.map
|
package/dist/shell.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../src/shell.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAkB,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../src/shell.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI primitives vendored from @freeappstore/sdk/ui.
|
|
3
|
+
* PAS-specific: accent defaults to purple (#7c3aed) instead of blue.
|
|
4
|
+
*
|
|
5
|
+
* Vendor convention: copied from FAS, not imported cross-store.
|
|
6
|
+
* Bug fixes propagate via manual port.
|
|
7
|
+
*/
|
|
8
|
+
import { type ReactNode } from 'react';
|
|
9
|
+
import type { ProAppStore } from './index.js';
|
|
10
|
+
import type { User } from '@freeappstore/sdk';
|
|
11
|
+
export interface AvatarProps {
|
|
12
|
+
user: User | null;
|
|
13
|
+
size?: number;
|
|
14
|
+
}
|
|
15
|
+
export declare function Avatar({ user, size }: AvatarProps): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
export interface SignInButtonProps {
|
|
17
|
+
app: ProAppStore;
|
|
18
|
+
label?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function SignInButton({ app, label }: SignInButtonProps): import("react/jsx-runtime").JSX.Element;
|
|
21
|
+
export declare function ThemeToggle(): import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
export interface ProfileMenuProps {
|
|
23
|
+
app: ProAppStore;
|
|
24
|
+
showThemeToggle?: boolean;
|
|
25
|
+
children?: ReactNode;
|
|
26
|
+
}
|
|
27
|
+
export declare function ProfileMenu({ app, showThemeToggle, children }: ProfileMenuProps): import("react/jsx-runtime").JSX.Element | null;
|
|
28
|
+
export interface ProfilePageProps {
|
|
29
|
+
app: ProAppStore;
|
|
30
|
+
showThemeToggle?: boolean;
|
|
31
|
+
}
|
|
32
|
+
export declare function ProfilePage({ app, showThemeToggle }: ProfilePageProps): import("react/jsx-runtime").JSX.Element;
|
|
33
|
+
//# sourceMappingURL=ui-primitives.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-primitives.d.ts","sourceRoot":"","sources":["../src/ui-primitives.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAA4C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACjF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAQ9C,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,MAAM,CAAC,EAAE,IAAI,EAAE,IAAS,EAAE,EAAE,WAAW,2CAuBtD;AAMD,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,WAAW,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,YAAY,CAAC,EAAE,GAAG,EAAE,KAA6B,EAAE,EAAE,iBAAiB,2CAerF;AAMD,wBAAgB,WAAW,4CAwC1B;AAMD,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,WAAW,CAAC;IACjB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,wBAAgB,WAAW,CAAC,EAAE,GAAG,EAAE,eAAsB,EAAE,QAAQ,EAAE,EAAE,gBAAgB,kDAkEtF;AAaD,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,WAAW,CAAC;IACjB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,WAAW,CAAC,EAAE,GAAG,EAAE,eAAsB,EAAE,EAAE,gBAAgB,2CAwG5E"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* UI primitives vendored from @freeappstore/sdk/ui.
|
|
4
|
+
* PAS-specific: accent defaults to purple (#7c3aed) instead of blue.
|
|
5
|
+
*
|
|
6
|
+
* Vendor convention: copied from FAS, not imported cross-store.
|
|
7
|
+
* Bug fixes propagate via manual port.
|
|
8
|
+
*/
|
|
9
|
+
import { useState, useEffect, useCallback, useRef } from 'react';
|
|
10
|
+
import { useProAuth } from './hooks.js';
|
|
11
|
+
import { useTheme } from './hooks.js';
|
|
12
|
+
export function Avatar({ user, size = 32 }) {
|
|
13
|
+
if (user?.avatarUrl) {
|
|
14
|
+
return (_jsx("img", { src: user.avatarUrl, alt: user.login, width: size, height: size, style: { borderRadius: '50%', display: 'block' } }));
|
|
15
|
+
}
|
|
16
|
+
const initial = user?.login?.charAt(0).toUpperCase() ?? '?';
|
|
17
|
+
return (_jsx("div", { style: {
|
|
18
|
+
width: size, height: size, borderRadius: '50%',
|
|
19
|
+
background: 'var(--accent, #7c3aed)', color: '#fff',
|
|
20
|
+
display: 'flex', alignItems: 'center', justifyContent: 'center',
|
|
21
|
+
fontSize: size * 0.45, fontWeight: 700,
|
|
22
|
+
}, children: initial }));
|
|
23
|
+
}
|
|
24
|
+
export function SignInButton({ app, label = 'Sign in with GitHub' }) {
|
|
25
|
+
return (_jsx("button", { onClick: () => app.auth.signIn(), style: {
|
|
26
|
+
background: 'var(--accent, #7c3aed)', color: '#fff',
|
|
27
|
+
border: 'none', padding: '0.6rem 1.5rem',
|
|
28
|
+
borderRadius: 'var(--radius, 0.75rem)',
|
|
29
|
+
fontSize: '0.9rem', fontWeight: 700,
|
|
30
|
+
cursor: 'pointer', fontFamily: 'inherit',
|
|
31
|
+
}, children: label }));
|
|
32
|
+
}
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
// ThemeToggle
|
|
35
|
+
// ---------------------------------------------------------------------------
|
|
36
|
+
export function ThemeToggle() {
|
|
37
|
+
const { theme, preference, setPreference } = useTheme();
|
|
38
|
+
const cycle = useCallback(() => {
|
|
39
|
+
const order = ['system', 'light', 'dark'];
|
|
40
|
+
const idx = order.indexOf(preference);
|
|
41
|
+
setPreference(order[(idx + 1) % order.length]);
|
|
42
|
+
}, [preference, setPreference]);
|
|
43
|
+
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" }) }));
|
|
44
|
+
return (_jsx("button", { onClick: cycle, "aria-label": `Theme: ${preference}`, title: `Theme: ${preference}`, style: {
|
|
45
|
+
width: 36, height: 36,
|
|
46
|
+
borderRadius: 'var(--radius, 0.75rem)',
|
|
47
|
+
border: '1px solid var(--border, #e2e8f0)',
|
|
48
|
+
background: 'var(--surface, #ffffff)',
|
|
49
|
+
color: 'var(--ink, #1e293b)',
|
|
50
|
+
display: 'inline-flex', alignItems: 'center', justifyContent: 'center',
|
|
51
|
+
cursor: 'pointer', padding: 0, fontFamily: 'inherit',
|
|
52
|
+
}, children: icon }));
|
|
53
|
+
}
|
|
54
|
+
export function ProfileMenu({ app, showThemeToggle = true, children }) {
|
|
55
|
+
const { user, signOut, deleteAccount } = useProAuth(app);
|
|
56
|
+
const [open, setOpen] = useState(false);
|
|
57
|
+
const ref = useRef(null);
|
|
58
|
+
useEffect(() => {
|
|
59
|
+
if (!open)
|
|
60
|
+
return;
|
|
61
|
+
const handler = (e) => {
|
|
62
|
+
if (ref.current && !ref.current.contains(e.target))
|
|
63
|
+
setOpen(false);
|
|
64
|
+
};
|
|
65
|
+
document.addEventListener('mousedown', handler);
|
|
66
|
+
return () => document.removeEventListener('mousedown', handler);
|
|
67
|
+
}, [open]);
|
|
68
|
+
if (!user)
|
|
69
|
+
return null;
|
|
70
|
+
const handleSignOut = () => { signOut(); setOpen(false); };
|
|
71
|
+
const handleDelete = async () => {
|
|
72
|
+
if (!confirm('Delete your account? This permanently removes ALL your data across ALL apps. This cannot be undone.'))
|
|
73
|
+
return;
|
|
74
|
+
if (!confirm('Are you absolutely sure? Last chance.'))
|
|
75
|
+
return;
|
|
76
|
+
await deleteAccount();
|
|
77
|
+
setOpen(false);
|
|
78
|
+
};
|
|
79
|
+
return (_jsxs("div", { ref: ref, style: { position: 'relative' }, children: [_jsx("button", { onClick: () => setOpen(!open), style: {
|
|
80
|
+
background: 'none', border: '2px solid var(--border, #e2e8f0)',
|
|
81
|
+
borderRadius: '50%', padding: 0, cursor: 'pointer',
|
|
82
|
+
width: 32, height: 32, overflow: 'hidden', display: 'block',
|
|
83
|
+
}, children: _jsx(Avatar, { user: user, size: 28 }) }), open && (_jsxs("div", { style: {
|
|
84
|
+
position: 'absolute', top: 40, right: 0,
|
|
85
|
+
background: 'var(--surface, #ffffff)',
|
|
86
|
+
border: '1px solid var(--border, #e2e8f0)',
|
|
87
|
+
borderRadius: 'var(--radius, 0.75rem)',
|
|
88
|
+
boxShadow: '0 4px 20px rgba(0,0,0,0.1)',
|
|
89
|
+
minWidth: 200, padding: '0.5rem 0', zIndex: 100,
|
|
90
|
+
}, children: [_jsx("div", { style: {
|
|
91
|
+
padding: '0.5rem 1rem',
|
|
92
|
+
borderBottom: '1px solid var(--border, #e2e8f0)',
|
|
93
|
+
fontSize: '0.85rem', fontWeight: 700,
|
|
94
|
+
color: 'var(--ink, #1e293b)',
|
|
95
|
+
}, children: user.login }), showThemeToggle && (_jsxs("div", { style: { padding: '0.5rem 1rem', borderBottom: '1px solid var(--border, #e2e8f0)', display: 'flex', alignItems: 'center', justifyContent: 'space-between' }, children: [_jsx("span", { style: { fontSize: '0.85rem', color: 'var(--muted, #64748b)' }, children: "Theme" }), _jsx(ThemeToggle, {})] })), children, _jsx("button", { onClick: handleSignOut, style: menuItemStyle, children: "Sign out" }), _jsx("button", { onClick: handleDelete, style: { ...menuItemStyle, color: '#dc2626' }, children: "Delete account" })] }))] }));
|
|
96
|
+
}
|
|
97
|
+
const menuItemStyle = {
|
|
98
|
+
display: 'block', width: '100%', padding: '0.5rem 1rem',
|
|
99
|
+
background: 'none', border: 'none', textAlign: 'left',
|
|
100
|
+
fontSize: '0.85rem', cursor: 'pointer',
|
|
101
|
+
color: 'var(--ink, #1e293b)', fontFamily: 'inherit',
|
|
102
|
+
};
|
|
103
|
+
export function ProfilePage({ app, showThemeToggle = true }) {
|
|
104
|
+
const { user, loading, signIn, signOut, deleteAccount } = useProAuth(app);
|
|
105
|
+
const { preference, setPreference } = useTheme();
|
|
106
|
+
if (loading) {
|
|
107
|
+
return _jsx("div", { style: { padding: '2rem', textAlign: 'center', color: 'var(--muted, #64748b)' }, children: "Loading..." });
|
|
108
|
+
}
|
|
109
|
+
if (!user) {
|
|
110
|
+
return (_jsxs("div", { style: { padding: '2rem', textAlign: 'center' }, children: [_jsx("p", { style: { color: 'var(--muted, #64748b)', marginBottom: '1rem' }, children: "Sign in to view your profile." }), _jsx(SignInButton, { app: app })] }));
|
|
111
|
+
}
|
|
112
|
+
const handleDelete = async () => {
|
|
113
|
+
if (!confirm('Delete your account? This permanently removes ALL your data across ALL apps. This cannot be undone.'))
|
|
114
|
+
return;
|
|
115
|
+
if (!confirm('Are you absolutely sure? Last chance.'))
|
|
116
|
+
return;
|
|
117
|
+
await deleteAccount();
|
|
118
|
+
};
|
|
119
|
+
const themeOptions = [
|
|
120
|
+
{ value: 'system', label: 'System' },
|
|
121
|
+
{ value: 'light', label: 'Light' },
|
|
122
|
+
{ value: 'dark', label: 'Dark' },
|
|
123
|
+
];
|
|
124
|
+
return (_jsxs("div", { style: { maxWidth: 480, margin: '0 auto', padding: '2rem 1rem' }, children: [_jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '1rem', marginBottom: '2rem' }, children: [_jsx(Avatar, { user: user, size: 64 }), _jsxs("div", { children: [_jsx("div", { style: { fontSize: '1.25rem', fontWeight: 700, color: 'var(--ink-strong, var(--ink, #0f172a))' }, children: user.login }), _jsx("div", { style: { fontSize: '0.85rem', color: 'var(--muted, #64748b)' }, children: "ProAppStore account" })] })] }), showThemeToggle && (_jsxs("div", { style: {
|
|
125
|
+
background: 'var(--surface, #ffffff)',
|
|
126
|
+
border: '1px solid var(--border, #e2e8f0)',
|
|
127
|
+
borderRadius: 'var(--radius, 0.75rem)',
|
|
128
|
+
padding: '1.25rem', marginBottom: '1rem',
|
|
129
|
+
}, children: [_jsx("div", { style: { fontSize: '0.9rem', fontWeight: 700, marginBottom: '0.75rem', color: 'var(--ink, #1e293b)' }, children: "Appearance" }), _jsx("div", { style: { display: 'flex', gap: '0.5rem' }, children: themeOptions.map((opt) => (_jsx("button", { onClick: () => setPreference(opt.value), style: {
|
|
130
|
+
flex: 1, padding: '0.5rem',
|
|
131
|
+
borderRadius: 'var(--radius-sm, 0.5rem)',
|
|
132
|
+
border: preference === opt.value ? '2px solid var(--accent, #7c3aed)' : '1px solid var(--border, #e2e8f0)',
|
|
133
|
+
background: preference === opt.value ? 'var(--accent-soft, #f5f3ff)' : 'transparent',
|
|
134
|
+
color: preference === opt.value ? 'var(--accent, #7c3aed)' : 'var(--muted, #64748b)',
|
|
135
|
+
fontWeight: preference === opt.value ? 700 : 500,
|
|
136
|
+
fontSize: '0.85rem', cursor: 'pointer', fontFamily: 'inherit',
|
|
137
|
+
}, children: opt.label }, opt.value))) })] })), _jsx("button", { onClick: signOut, style: {
|
|
138
|
+
width: '100%', padding: '0.75rem',
|
|
139
|
+
borderRadius: 'var(--radius, 0.75rem)',
|
|
140
|
+
border: '1px solid var(--border, #e2e8f0)',
|
|
141
|
+
background: 'var(--surface, #ffffff)',
|
|
142
|
+
color: 'var(--ink, #1e293b)',
|
|
143
|
+
fontSize: '0.9rem', fontWeight: 600,
|
|
144
|
+
cursor: 'pointer', marginBottom: '1.5rem', fontFamily: 'inherit',
|
|
145
|
+
}, children: "Sign out" }), _jsxs("div", { style: { border: '1px solid #fecaca', borderRadius: 'var(--radius, 0.75rem)', padding: '1.25rem' }, children: [_jsx("div", { style: { fontSize: '0.9rem', fontWeight: 700, color: '#dc2626', marginBottom: '0.5rem' }, children: "Danger zone" }), _jsx("p", { style: { fontSize: '0.85rem', color: 'var(--muted, #64748b)', marginBottom: '0.75rem' }, children: "Permanently delete your account and all data across all apps." }), _jsx("button", { onClick: handleDelete, style: {
|
|
146
|
+
padding: '0.5rem 1rem',
|
|
147
|
+
borderRadius: 'var(--radius-sm, 0.5rem)',
|
|
148
|
+
border: '1px solid #dc2626', background: 'transparent',
|
|
149
|
+
color: '#dc2626', fontSize: '0.85rem', fontWeight: 600,
|
|
150
|
+
cursor: 'pointer', fontFamily: 'inherit',
|
|
151
|
+
}, children: "Delete account" })] })] }));
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=ui-primitives.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-primitives.js","sourceRoot":"","sources":["../src/ui-primitives.tsx"],"names":[],"mappings":"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"}
|
package/dist/ui.d.ts
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @proappstore/sdk/ui — Full UI component library for Pro apps.
|
|
3
|
+
*
|
|
4
|
+
* Re-exports base primitives (Avatar, SignInButton, ThemeToggle, ProfileMenu)
|
|
5
|
+
* plus Pro-specific components: ProBadge, UpgradeCard, BillingButton,
|
|
6
|
+
* SubscriptionStatus, ProProfilePage.
|
|
7
|
+
*/
|
|
8
|
+
import { type ReactNode } from 'react';
|
|
9
|
+
import type { ProAppStore } from './index.js';
|
|
10
|
+
export { Avatar, ThemeToggle } from './ui-primitives.js';
|
|
11
|
+
export type { AvatarProps } from './ui-primitives.js';
|
|
12
|
+
export interface SignInButtonProps {
|
|
13
|
+
app: ProAppStore;
|
|
14
|
+
label?: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function SignInButton({ app, label }: SignInButtonProps): import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
export interface ProBadgeProps {
|
|
18
|
+
size?: 'sm' | 'md' | 'lg';
|
|
19
|
+
}
|
|
20
|
+
/** Purple "PRO" badge. Shows subscription tier. */
|
|
21
|
+
export declare function ProBadge({ size }: ProBadgeProps): import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
export interface SubscriptionStatusProps {
|
|
23
|
+
app: ProAppStore;
|
|
24
|
+
showUpgrade?: boolean;
|
|
25
|
+
}
|
|
26
|
+
/** Inline subscription status: PRO badge or "Free" with optional upgrade link. */
|
|
27
|
+
export declare function SubscriptionStatus({ app, showUpgrade }: SubscriptionStatusProps): import("react/jsx-runtime").JSX.Element;
|
|
28
|
+
export interface UpgradeCardProps {
|
|
29
|
+
app: ProAppStore;
|
|
30
|
+
title?: string;
|
|
31
|
+
description?: string;
|
|
32
|
+
priceLabel?: string;
|
|
33
|
+
features?: string[];
|
|
34
|
+
}
|
|
35
|
+
/** Styled card prompting the user to upgrade to Pro. */
|
|
36
|
+
export declare function UpgradeCard({ app, title, description, priceLabel, features, }: UpgradeCardProps): import("react/jsx-runtime").JSX.Element;
|
|
37
|
+
export interface BillingButtonProps {
|
|
38
|
+
app: ProAppStore;
|
|
39
|
+
label?: string;
|
|
40
|
+
variant?: 'primary' | 'secondary' | 'ghost';
|
|
41
|
+
}
|
|
42
|
+
/** Button that opens the Stripe billing portal. */
|
|
43
|
+
export declare function BillingButton({ app, label, variant }: BillingButtonProps): import("react/jsx-runtime").JSX.Element;
|
|
44
|
+
export interface ProfileMenuProps {
|
|
45
|
+
app: ProAppStore;
|
|
46
|
+
showThemeToggle?: boolean;
|
|
47
|
+
showBilling?: boolean;
|
|
48
|
+
children?: ReactNode;
|
|
49
|
+
}
|
|
50
|
+
/** Avatar button that opens dropdown with Pro features: badge, billing, theme, sign out. */
|
|
51
|
+
export declare function ProfileMenu({ app, showThemeToggle, showBilling, children }: ProfileMenuProps): import("react/jsx-runtime").JSX.Element | null;
|
|
52
|
+
export interface ProProfilePageProps {
|
|
53
|
+
app: ProAppStore;
|
|
54
|
+
showThemeToggle?: boolean;
|
|
55
|
+
}
|
|
56
|
+
/** Full-page profile/settings with subscription info, billing, theme, danger zone. */
|
|
57
|
+
export declare function ProProfilePage({ app, showThemeToggle }: ProProfilePageProps): import("react/jsx-runtime").JSX.Element;
|
|
58
|
+
export interface GateScreenProps {
|
|
59
|
+
gate: 'loading' | 'signed-out' | 'no-subscription';
|
|
60
|
+
app: ProAppStore;
|
|
61
|
+
appName?: string | undefined;
|
|
62
|
+
}
|
|
63
|
+
/** Renders the appropriate gate screen (loading, sign-in, or upgrade). */
|
|
64
|
+
export declare function GateScreen({ gate, app, appName }: GateScreenProps): import("react/jsx-runtime").JSX.Element;
|
|
65
|
+
//# sourceMappingURL=ui.d.ts.map
|
package/dist/ui.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../src/ui.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAA4C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACjF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAM9C,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACzD,YAAY,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAMtD,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,WAAW,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,YAAY,CAAC,EAAE,GAAG,EAAE,KAA6B,EAAE,EAAE,iBAAiB,2CAmBrF;AAMD,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;CAC3B;AAED,mDAAmD;AACnD,wBAAgB,QAAQ,CAAC,EAAE,IAAW,EAAE,EAAE,aAAa,2CAsBtD;AAMD,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,WAAW,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,kFAAkF;AAClF,wBAAgB,kBAAkB,CAAC,EAAE,GAAG,EAAE,WAAkB,EAAE,EAAE,uBAAuB,2CA4CtF;AAMD,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,WAAW,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,wDAAwD;AACxD,wBAAgB,WAAW,CAAC,EAC1B,GAAG,EACH,KAAwB,EACxB,WAAoE,EACpE,UAAuB,EACvB,QAAwG,GACzG,EAAE,gBAAgB,2CAuDlB;AAMD,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,WAAW,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,OAAO,CAAC;CAC7C;AAED,mDAAmD;AACnD,wBAAgB,aAAa,CAAC,EAAE,GAAG,EAAE,KAAwB,EAAE,OAAqB,EAAE,EAAE,kBAAkB,2CAiCzG;AAMD,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,WAAW,CAAC;IACjB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,4FAA4F;AAC5F,wBAAgB,WAAW,CAAC,EAAE,GAAG,EAAE,eAAsB,EAAE,WAAkB,EAAE,QAAQ,EAAE,EAAE,gBAAgB,kDAoF1G;AA+CD,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,WAAW,CAAC;IACjB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,sFAAsF;AACtF,wBAAgB,cAAc,CAAC,EAAE,GAAG,EAAE,eAAsB,EAAE,EAAE,mBAAmB,2CAqJlF;AAMD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,SAAS,GAAG,YAAY,GAAG,iBAAiB,CAAC;IACnD,GAAG,EAAE,WAAW,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC9B;AAED,0EAA0E;AAC1E,wBAAgB,UAAU,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,eAAe,2CAsCjE"}
|
package/dist/ui.js
ADDED
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* @proappstore/sdk/ui — Full UI component library for Pro apps.
|
|
4
|
+
*
|
|
5
|
+
* Re-exports base primitives (Avatar, SignInButton, ThemeToggle, ProfileMenu)
|
|
6
|
+
* plus Pro-specific components: ProBadge, UpgradeCard, BillingButton,
|
|
7
|
+
* SubscriptionStatus, ProProfilePage.
|
|
8
|
+
*/
|
|
9
|
+
import { useState, useEffect, useCallback, useRef } from 'react';
|
|
10
|
+
import { useProAuth, useProSubscription, useTheme } from './hooks.js';
|
|
11
|
+
// Re-export base primitives
|
|
12
|
+
export { Avatar, ThemeToggle } from './ui-primitives.js';
|
|
13
|
+
export function SignInButton({ app, label = 'Sign in with GitHub' }) {
|
|
14
|
+
return (_jsx("button", { onClick: () => app.auth.signIn(), style: {
|
|
15
|
+
background: 'var(--accent, #7c3aed)',
|
|
16
|
+
color: '#fff',
|
|
17
|
+
border: 'none',
|
|
18
|
+
padding: '0.6rem 1.5rem',
|
|
19
|
+
borderRadius: 'var(--radius, 0.75rem)',
|
|
20
|
+
fontSize: '0.9rem',
|
|
21
|
+
fontWeight: 700,
|
|
22
|
+
cursor: 'pointer',
|
|
23
|
+
fontFamily: 'inherit',
|
|
24
|
+
}, children: label }));
|
|
25
|
+
}
|
|
26
|
+
/** Purple "PRO" badge. Shows subscription tier. */
|
|
27
|
+
export function ProBadge({ size = 'sm' }) {
|
|
28
|
+
const sizes = {
|
|
29
|
+
sm: { fontSize: '0.6rem', padding: '0.1rem 0.4rem' },
|
|
30
|
+
md: { fontSize: '0.7rem', padding: '0.2rem 0.5rem' },
|
|
31
|
+
lg: { fontSize: '0.8rem', padding: '0.25rem 0.6rem' },
|
|
32
|
+
};
|
|
33
|
+
return (_jsx("span", { style: {
|
|
34
|
+
...sizes[size],
|
|
35
|
+
fontWeight: 700,
|
|
36
|
+
background: 'var(--accent, #7c3aed)',
|
|
37
|
+
color: '#fff',
|
|
38
|
+
borderRadius: '0.25rem',
|
|
39
|
+
textTransform: 'uppercase',
|
|
40
|
+
letterSpacing: '0.03em',
|
|
41
|
+
whiteSpace: 'nowrap',
|
|
42
|
+
display: 'inline-flex',
|
|
43
|
+
alignItems: 'center',
|
|
44
|
+
}, children: "PRO" }));
|
|
45
|
+
}
|
|
46
|
+
/** Inline subscription status: PRO badge or "Free" with optional upgrade link. */
|
|
47
|
+
export function SubscriptionStatus({ app, showUpgrade = true }) {
|
|
48
|
+
const { subscription, isPro, loading, upgrade } = useProSubscription(app);
|
|
49
|
+
if (loading) {
|
|
50
|
+
return _jsx("span", { style: { fontSize: '0.85rem', color: 'var(--muted, #64748b)' }, children: "..." });
|
|
51
|
+
}
|
|
52
|
+
if (isPro) {
|
|
53
|
+
const renewal = subscription?.cancelAtPeriodEnd
|
|
54
|
+
? 'Cancels at period end'
|
|
55
|
+
: subscription?.currentPeriodEnd
|
|
56
|
+
? `Renews ${new Date(subscription.currentPeriodEnd).toLocaleDateString()}`
|
|
57
|
+
: '';
|
|
58
|
+
return (_jsxs("span", { style: { display: 'inline-flex', alignItems: 'center', gap: '0.4rem' }, children: [_jsx(ProBadge, { size: "md" }), renewal && _jsx("span", { style: { fontSize: '0.75rem', color: 'var(--muted, #64748b)' }, children: renewal })] }));
|
|
59
|
+
}
|
|
60
|
+
return (_jsxs("span", { style: { display: 'inline-flex', alignItems: 'center', gap: '0.5rem' }, children: [_jsx("span", { style: { fontSize: '0.85rem', color: 'var(--muted, #64748b)' }, children: "Free plan" }), showUpgrade && (_jsx("button", { onClick: () => upgrade(), style: {
|
|
61
|
+
background: 'none',
|
|
62
|
+
border: '1px solid var(--accent, #7c3aed)',
|
|
63
|
+
color: 'var(--accent, #7c3aed)',
|
|
64
|
+
padding: '0.2rem 0.6rem',
|
|
65
|
+
borderRadius: 'var(--radius-sm, 0.5rem)',
|
|
66
|
+
fontSize: '0.75rem',
|
|
67
|
+
fontWeight: 600,
|
|
68
|
+
cursor: 'pointer',
|
|
69
|
+
fontFamily: 'inherit',
|
|
70
|
+
}, children: "Upgrade" }))] }));
|
|
71
|
+
}
|
|
72
|
+
/** Styled card prompting the user to upgrade to Pro. */
|
|
73
|
+
export function UpgradeCard({ app, title = 'Upgrade to Pro', description = 'Unlock all premium features with a Pro subscription.', priceLabel = '$9/month', features = ['Cloud sync across devices', 'AI-powered features', 'Unlimited storage', 'Priority support'], }) {
|
|
74
|
+
const { upgrade } = useProSubscription(app);
|
|
75
|
+
return (_jsxs("div", { style: {
|
|
76
|
+
background: 'var(--surface, #ffffff)',
|
|
77
|
+
border: '1px solid var(--accent, #7c3aed)',
|
|
78
|
+
borderRadius: 'var(--radius, 0.75rem)',
|
|
79
|
+
padding: '1.75rem',
|
|
80
|
+
maxWidth: 400,
|
|
81
|
+
}, children: [_jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '0.5rem', marginBottom: '0.5rem' }, children: [_jsx("h3", { style: { fontSize: '1.25rem', fontWeight: 800, color: 'var(--ink-strong, var(--ink, #0f172a))', margin: 0 }, children: title }), _jsx(ProBadge, { size: "md" })] }), _jsx("p", { style: { fontSize: '0.9rem', color: 'var(--muted, #64748b)', marginBottom: '1rem' }, children: description }), features.length > 0 && (_jsx("ul", { style: { listStyle: 'none', padding: 0, margin: '0 0 1.25rem' }, children: features.map((f, i) => (_jsxs("li", { style: {
|
|
82
|
+
padding: '0.35rem 0',
|
|
83
|
+
fontSize: '0.85rem',
|
|
84
|
+
color: 'var(--ink, #1e293b)',
|
|
85
|
+
borderBottom: '1px solid var(--border, #e2e8f0)',
|
|
86
|
+
display: 'flex',
|
|
87
|
+
alignItems: 'center',
|
|
88
|
+
gap: '0.5rem',
|
|
89
|
+
}, children: [_jsx("span", { style: { color: 'var(--accent, #7c3aed)', fontWeight: 700 }, children: "+" }), f] }, i))) })), _jsxs("button", { onClick: () => upgrade(), style: {
|
|
90
|
+
width: '100%',
|
|
91
|
+
background: 'var(--accent, #7c3aed)',
|
|
92
|
+
color: '#fff',
|
|
93
|
+
border: 'none',
|
|
94
|
+
padding: '0.75rem',
|
|
95
|
+
borderRadius: 'var(--radius, 0.75rem)',
|
|
96
|
+
fontSize: '0.9rem',
|
|
97
|
+
fontWeight: 700,
|
|
98
|
+
cursor: 'pointer',
|
|
99
|
+
fontFamily: 'inherit',
|
|
100
|
+
}, children: ["Subscribe \u2014 ", priceLabel] })] }));
|
|
101
|
+
}
|
|
102
|
+
/** Button that opens the Stripe billing portal. */
|
|
103
|
+
export function BillingButton({ app, label = 'Manage billing', variant = 'secondary' }) {
|
|
104
|
+
const [loading, setLoading] = useState(false);
|
|
105
|
+
const handleClick = useCallback(async () => {
|
|
106
|
+
setLoading(true);
|
|
107
|
+
try {
|
|
108
|
+
await app.subscription.openPortal(window.location.href);
|
|
109
|
+
}
|
|
110
|
+
catch { }
|
|
111
|
+
finally {
|
|
112
|
+
setLoading(false);
|
|
113
|
+
}
|
|
114
|
+
}, [app]);
|
|
115
|
+
const baseStyle = {
|
|
116
|
+
padding: '0.6rem 1.25rem',
|
|
117
|
+
borderRadius: 'var(--radius, 0.75rem)',
|
|
118
|
+
fontSize: '0.85rem',
|
|
119
|
+
fontWeight: 600,
|
|
120
|
+
cursor: loading ? 'wait' : 'pointer',
|
|
121
|
+
fontFamily: 'inherit',
|
|
122
|
+
opacity: loading ? 0.7 : 1,
|
|
123
|
+
};
|
|
124
|
+
const variants = {
|
|
125
|
+
primary: { ...baseStyle, background: 'var(--accent, #7c3aed)', color: '#fff', border: 'none' },
|
|
126
|
+
secondary: { ...baseStyle, background: 'transparent', color: 'var(--ink, #1e293b)', border: '1px solid var(--border, #e2e8f0)' },
|
|
127
|
+
ghost: { ...baseStyle, background: 'none', color: 'var(--accent, #7c3aed)', border: 'none', padding: '0.4rem 0.75rem' },
|
|
128
|
+
};
|
|
129
|
+
return (_jsx("button", { onClick: handleClick, disabled: loading, style: variants[variant], children: loading ? 'Opening...' : label }));
|
|
130
|
+
}
|
|
131
|
+
/** Avatar button that opens dropdown with Pro features: badge, billing, theme, sign out. */
|
|
132
|
+
export function ProfileMenu({ app, showThemeToggle = true, showBilling = true, children }) {
|
|
133
|
+
const { user, signOut, deleteAccount } = useProAuth(app);
|
|
134
|
+
const { subscription, isPro, manageBilling } = useProSubscription(app);
|
|
135
|
+
const [open, setOpen] = useState(false);
|
|
136
|
+
const ref = useRef(null);
|
|
137
|
+
useEffect(() => {
|
|
138
|
+
if (!open)
|
|
139
|
+
return;
|
|
140
|
+
const handler = (e) => {
|
|
141
|
+
if (ref.current && !ref.current.contains(e.target))
|
|
142
|
+
setOpen(false);
|
|
143
|
+
};
|
|
144
|
+
document.addEventListener('mousedown', handler);
|
|
145
|
+
return () => document.removeEventListener('mousedown', handler);
|
|
146
|
+
}, [open]);
|
|
147
|
+
if (!user)
|
|
148
|
+
return null;
|
|
149
|
+
const handleSignOut = () => { signOut(); setOpen(false); };
|
|
150
|
+
const handleBilling = async () => { await manageBilling(); setOpen(false); };
|
|
151
|
+
const handleDelete = async () => {
|
|
152
|
+
const subClause = subscription?.status === 'active' ? ' and cancels your subscription' : '';
|
|
153
|
+
if (!confirm(`Delete your account? This permanently removes ALL your data across ALL apps${subClause}. This cannot be undone.`))
|
|
154
|
+
return;
|
|
155
|
+
if (!confirm('Are you absolutely sure? Last chance.'))
|
|
156
|
+
return;
|
|
157
|
+
await deleteAccount();
|
|
158
|
+
setOpen(false);
|
|
159
|
+
};
|
|
160
|
+
return (_jsxs("div", { ref: ref, style: { position: 'relative' }, children: [_jsx("button", { onClick: () => setOpen(!open), style: {
|
|
161
|
+
background: 'none',
|
|
162
|
+
border: '2px solid var(--border, #e2e8f0)',
|
|
163
|
+
borderRadius: '50%',
|
|
164
|
+
padding: 0,
|
|
165
|
+
cursor: 'pointer',
|
|
166
|
+
width: 32,
|
|
167
|
+
height: 32,
|
|
168
|
+
overflow: 'hidden',
|
|
169
|
+
display: 'block',
|
|
170
|
+
}, children: user.avatarUrl ? (_jsx("img", { src: user.avatarUrl, alt: user.login, width: 28, height: 28, style: { borderRadius: '50%', display: 'block' } })) : (_jsx("div", { style: { width: 28, height: 28, borderRadius: '50%', background: 'var(--accent, #7c3aed)', color: '#fff', display: 'flex', alignItems: 'center', justifyContent: 'center', fontSize: 13, fontWeight: 700 }, children: user.login.charAt(0).toUpperCase() })) }), open && (_jsxs("div", { style: {
|
|
171
|
+
position: 'absolute', top: 40, right: 0,
|
|
172
|
+
background: 'var(--surface, #ffffff)',
|
|
173
|
+
border: '1px solid var(--border, #e2e8f0)',
|
|
174
|
+
borderRadius: 'var(--radius, 0.75rem)',
|
|
175
|
+
boxShadow: '0 4px 20px rgba(0,0,0,0.1)',
|
|
176
|
+
minWidth: 220, padding: '0.5rem 0', zIndex: 100,
|
|
177
|
+
}, children: [_jsxs("div", { style: { padding: '0.5rem 1rem', borderBottom: '1px solid var(--border, #e2e8f0)', display: 'flex', alignItems: 'center', gap: '0.5rem' }, children: [_jsx("strong", { style: { fontSize: '0.85rem', color: 'var(--ink, #1e293b)' }, children: user.login }), isPro && _jsx(ProBadge, {})] }), showThemeToggle && (_jsxs("div", { style: { padding: '0.5rem 1rem', borderBottom: '1px solid var(--border, #e2e8f0)', display: 'flex', alignItems: 'center', justifyContent: 'space-between' }, children: [_jsx("span", { style: { fontSize: '0.85rem', color: 'var(--muted, #64748b)' }, children: "Theme" }), _jsx(ThemeToggleInline, {})] })), showBilling && isPro && (_jsx("button", { onClick: handleBilling, style: menuItemStyle, children: "Manage billing" })), children, _jsx("button", { onClick: handleSignOut, style: menuItemStyle, children: "Sign out" }), _jsx("button", { onClick: handleDelete, style: { ...menuItemStyle, color: '#dc2626' }, children: "Delete account" })] }))] }));
|
|
178
|
+
}
|
|
179
|
+
/** Inline theme toggle for menu (imports from same file to avoid circular) */
|
|
180
|
+
function ThemeToggleInline() {
|
|
181
|
+
const { theme, preference, setPreference } = useTheme();
|
|
182
|
+
const cycle = useCallback(() => {
|
|
183
|
+
const order = ['system', 'light', 'dark'];
|
|
184
|
+
const idx = order.indexOf(preference);
|
|
185
|
+
setPreference(order[(idx + 1) % order.length]);
|
|
186
|
+
}, [preference, setPreference]);
|
|
187
|
+
const icon = theme === 'dark' ? (_jsxs("svg", { width: "16", height: "16", 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: "16", height: "16", 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" }) }));
|
|
188
|
+
return (_jsx("button", { onClick: cycle, "aria-label": `Theme: ${preference}`, style: {
|
|
189
|
+
width: 32, height: 32, borderRadius: 'var(--radius-sm, 0.5rem)',
|
|
190
|
+
border: '1px solid var(--border, #e2e8f0)', background: 'var(--surface, #ffffff)',
|
|
191
|
+
color: 'var(--ink, #1e293b)', display: 'inline-flex', alignItems: 'center',
|
|
192
|
+
justifyContent: 'center', cursor: 'pointer', padding: 0, fontFamily: 'inherit',
|
|
193
|
+
}, children: icon }));
|
|
194
|
+
}
|
|
195
|
+
const menuItemStyle = {
|
|
196
|
+
display: 'block', width: '100%', padding: '0.5rem 1rem',
|
|
197
|
+
background: 'none', border: 'none', textAlign: 'left',
|
|
198
|
+
fontSize: '0.85rem', cursor: 'pointer',
|
|
199
|
+
color: 'var(--ink, #1e293b)', fontFamily: 'inherit',
|
|
200
|
+
};
|
|
201
|
+
/** Full-page profile/settings with subscription info, billing, theme, danger zone. */
|
|
202
|
+
export function ProProfilePage({ app, showThemeToggle = true }) {
|
|
203
|
+
const { user, loading, signOut, deleteAccount } = useProAuth(app);
|
|
204
|
+
const { subscription, isPro, loading: subLoading, upgrade, manageBilling } = useProSubscription(app);
|
|
205
|
+
const { preference, setPreference } = useTheme();
|
|
206
|
+
if (loading) {
|
|
207
|
+
return _jsx("div", { style: { padding: '2rem', textAlign: 'center', color: 'var(--muted, #64748b)' }, children: "Loading..." });
|
|
208
|
+
}
|
|
209
|
+
if (!user) {
|
|
210
|
+
return (_jsxs("div", { style: { padding: '2rem', textAlign: 'center' }, children: [_jsx("p", { style: { color: 'var(--muted, #64748b)', marginBottom: '1rem' }, children: "Sign in to view your profile." }), _jsx(SignInButton, { app: app })] }));
|
|
211
|
+
}
|
|
212
|
+
const handleDelete = async () => {
|
|
213
|
+
const subClause = subscription?.status === 'active' ? ' and cancels your subscription' : '';
|
|
214
|
+
if (!confirm(`Delete your account? This permanently removes ALL your data across ALL apps${subClause}. This cannot be undone.`))
|
|
215
|
+
return;
|
|
216
|
+
if (!confirm('Are you absolutely sure? Last chance.'))
|
|
217
|
+
return;
|
|
218
|
+
await deleteAccount();
|
|
219
|
+
};
|
|
220
|
+
const themeOptions = [
|
|
221
|
+
{ value: 'system', label: 'System' },
|
|
222
|
+
{ value: 'light', label: 'Light' },
|
|
223
|
+
{ value: 'dark', label: 'Dark' },
|
|
224
|
+
];
|
|
225
|
+
return (_jsxs("div", { style: { maxWidth: 520, margin: '0 auto', padding: '2rem 1rem' }, children: [_jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '1rem', marginBottom: '2rem' }, children: [user.avatarUrl ? (_jsx("img", { src: user.avatarUrl, alt: user.login, width: 64, height: 64, style: { borderRadius: '50%' } })) : (_jsx("div", { style: { width: 64, height: 64, borderRadius: '50%', background: 'var(--accent, #7c3aed)', color: '#fff', display: 'flex', alignItems: 'center', justifyContent: 'center', fontSize: 28, fontWeight: 700 }, children: user.login.charAt(0).toUpperCase() })), _jsxs("div", { children: [_jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '0.5rem' }, children: [_jsx("span", { style: { fontSize: '1.25rem', fontWeight: 700, color: 'var(--ink-strong, var(--ink, #0f172a))' }, children: user.login }), isPro && _jsx(ProBadge, { size: "md" })] }), _jsx("div", { style: { fontSize: '0.85rem', color: 'var(--muted, #64748b)' }, children: "ProAppStore account" })] })] }), _jsx(Section, { title: "Subscription", children: subLoading ? (_jsx("p", { style: { fontSize: '0.85rem', color: 'var(--muted, #64748b)' }, children: "Loading..." })) : isPro ? (_jsxs("div", { children: [_jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '0.5rem', marginBottom: '0.75rem' }, children: [_jsx(ProBadge, { size: "lg" }), _jsx("span", { style: { fontSize: '0.9rem', fontWeight: 600, color: 'var(--ink, #1e293b)' }, children: "Active" })] }), subscription?.currentPeriodEnd && (_jsxs("p", { style: { fontSize: '0.82rem', color: 'var(--muted, #64748b)', marginBottom: '0.75rem' }, children: [subscription.cancelAtPeriodEnd ? 'Cancels' : 'Renews', " on ", new Date(subscription.currentPeriodEnd).toLocaleDateString()] })), _jsx(BillingButton, { app: app, variant: "secondary" })] })) : (_jsxs("div", { children: [_jsx("p", { style: { fontSize: '0.85rem', color: 'var(--muted, #64748b)', marginBottom: '0.75rem' }, children: "You're on the free plan. Upgrade to unlock all premium features." }), _jsx("button", { onClick: () => upgrade(), style: {
|
|
226
|
+
background: 'var(--accent, #7c3aed)', color: '#fff', border: 'none',
|
|
227
|
+
padding: '0.6rem 1.25rem', borderRadius: 'var(--radius, 0.75rem)',
|
|
228
|
+
fontSize: '0.85rem', fontWeight: 700, cursor: 'pointer', fontFamily: 'inherit',
|
|
229
|
+
}, children: "Upgrade to Pro \u2014 $9/mo" })] })) }), showThemeToggle && (_jsx(Section, { title: "Appearance", children: _jsx("div", { style: { display: 'flex', gap: '0.5rem' }, children: themeOptions.map((opt) => (_jsx("button", { onClick: () => setPreference(opt.value), style: {
|
|
230
|
+
flex: 1, padding: '0.5rem',
|
|
231
|
+
borderRadius: 'var(--radius-sm, 0.5rem)',
|
|
232
|
+
border: preference === opt.value ? '2px solid var(--accent, #7c3aed)' : '1px solid var(--border, #e2e8f0)',
|
|
233
|
+
background: preference === opt.value ? 'var(--accent-soft, #f5f3ff)' : 'transparent',
|
|
234
|
+
color: preference === opt.value ? 'var(--accent, #7c3aed)' : 'var(--muted, #64748b)',
|
|
235
|
+
fontWeight: preference === opt.value ? 700 : 500,
|
|
236
|
+
fontSize: '0.85rem', cursor: 'pointer', fontFamily: 'inherit',
|
|
237
|
+
}, children: opt.label }, opt.value))) }) })), _jsx("button", { onClick: signOut, style: {
|
|
238
|
+
width: '100%', padding: '0.75rem',
|
|
239
|
+
borderRadius: 'var(--radius, 0.75rem)',
|
|
240
|
+
border: '1px solid var(--border, #e2e8f0)',
|
|
241
|
+
background: 'var(--surface, #ffffff)',
|
|
242
|
+
color: 'var(--ink, #1e293b)',
|
|
243
|
+
fontSize: '0.9rem', fontWeight: 600,
|
|
244
|
+
cursor: 'pointer', marginBottom: '1.5rem', fontFamily: 'inherit',
|
|
245
|
+
}, children: "Sign out" }), _jsxs("div", { style: { border: '1px solid #fecaca', borderRadius: 'var(--radius, 0.75rem)', padding: '1.25rem' }, children: [_jsx("div", { style: { fontSize: '0.9rem', fontWeight: 700, color: '#dc2626', marginBottom: '0.5rem' }, children: "Danger zone" }), _jsxs("p", { style: { fontSize: '0.85rem', color: 'var(--muted, #64748b)', marginBottom: '0.75rem' }, children: ["Permanently delete your account and all data across all apps.", isPro && ' Your subscription will be cancelled.'] }), _jsx("button", { onClick: handleDelete, style: {
|
|
246
|
+
padding: '0.5rem 1rem', borderRadius: 'var(--radius-sm, 0.5rem)',
|
|
247
|
+
border: '1px solid #dc2626', background: 'transparent',
|
|
248
|
+
color: '#dc2626', fontSize: '0.85rem', fontWeight: 600,
|
|
249
|
+
cursor: 'pointer', fontFamily: 'inherit',
|
|
250
|
+
}, children: "Delete account" })] })] }));
|
|
251
|
+
}
|
|
252
|
+
/** Renders the appropriate gate screen (loading, sign-in, or upgrade). */
|
|
253
|
+
export function GateScreen({ gate, app, appName }) {
|
|
254
|
+
if (gate === 'loading') {
|
|
255
|
+
return (_jsx("div", { style: { minHeight: '100dvh', display: 'flex', alignItems: 'center', justifyContent: 'center' }, children: _jsx("p", { style: { color: 'var(--muted, #64748b)' }, children: "Loading..." }) }));
|
|
256
|
+
}
|
|
257
|
+
if (gate === 'signed-out') {
|
|
258
|
+
return (_jsx("div", { style: { minHeight: '100dvh', display: 'flex', alignItems: 'center', justifyContent: 'center', padding: '2rem' }, children: _jsxs("div", { style: { maxWidth: 400, textAlign: 'center' }, children: [_jsx("h1", { style: { fontSize: '1.5rem', fontWeight: 800, marginBottom: '0.5rem', color: 'var(--ink, #1e293b)' }, children: appName || 'ProAppStore' }), _jsx("p", { style: { color: 'var(--muted, #64748b)', fontSize: '0.9rem', marginBottom: '1rem' }, children: "Sign in to your ProAppStore account to continue." }), _jsx(SignInButton, { app: app }), _jsx("p", { style: { color: 'var(--muted, #64748b)', fontSize: '0.75rem', marginTop: '0.75rem' }, children: "One account for all Pro apps." })] }) }));
|
|
259
|
+
}
|
|
260
|
+
// no-subscription
|
|
261
|
+
return (_jsx("div", { style: { minHeight: '100dvh', display: 'flex', alignItems: 'center', justifyContent: 'center', padding: '2rem' }, children: _jsx(UpgradeCard, { app: app, title: "Pro subscription required", description: `${appName || 'This app'} requires an active ProAppStore subscription.` }) }));
|
|
262
|
+
}
|
|
263
|
+
// ---------------------------------------------------------------------------
|
|
264
|
+
// Section helper (internal)
|
|
265
|
+
// ---------------------------------------------------------------------------
|
|
266
|
+
function Section({ title, children }) {
|
|
267
|
+
return (_jsxs("div", { style: {
|
|
268
|
+
background: 'var(--surface, #ffffff)',
|
|
269
|
+
border: '1px solid var(--border, #e2e8f0)',
|
|
270
|
+
borderRadius: 'var(--radius, 0.75rem)',
|
|
271
|
+
padding: '1.25rem',
|
|
272
|
+
marginBottom: '1rem',
|
|
273
|
+
}, children: [_jsx("div", { style: { fontSize: '0.9rem', fontWeight: 700, marginBottom: '0.75rem', color: 'var(--ink, #1e293b)' }, children: title }), children] }));
|
|
274
|
+
}
|
|
275
|
+
//# sourceMappingURL=ui.js.map
|
package/dist/ui.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui.js","sourceRoot":"","sources":["../src/ui.tsx"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@proappstore/sdk",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.12.0",
|
|
4
4
|
"description": "Browser SDK for paid apps on proappstore.online — subscriptions, license keys, premium modules.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -18,6 +18,10 @@
|
|
|
18
18
|
"./hooks": {
|
|
19
19
|
"types": "./dist/hooks.d.ts",
|
|
20
20
|
"import": "./dist/hooks.js"
|
|
21
|
+
},
|
|
22
|
+
"./ui": {
|
|
23
|
+
"types": "./dist/ui.d.ts",
|
|
24
|
+
"import": "./dist/ui.js"
|
|
21
25
|
}
|
|
22
26
|
},
|
|
23
27
|
"repository": {
|
|
@@ -30,7 +34,7 @@
|
|
|
30
34
|
"README.md"
|
|
31
35
|
],
|
|
32
36
|
"dependencies": {
|
|
33
|
-
"@freeappstore/sdk": "^0.
|
|
37
|
+
"@freeappstore/sdk": "^0.8.0"
|
|
34
38
|
},
|
|
35
39
|
"peerDependencies": {
|
|
36
40
|
"react": "^18.0.0 || ^19.0.0"
|