@freeappstore/sdk 0.7.1 → 0.9.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/LICENSE +21 -0
- package/README.md +35 -0
- package/dist/hooks.d.ts +40 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +110 -0
- package/dist/hooks.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/roles.d.ts +53 -0
- package/dist/roles.d.ts.map +1 -0
- package/dist/roles.js +117 -0
- package/dist/roles.js.map +1 -0
- package/dist/ui.d.ts +43 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +237 -0
- package/dist/ui.js.map +1 -0
- package/package.json +24 -6
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 FreeAppStore
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -140,6 +140,41 @@ 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
|
+
### React Hooks
|
|
144
|
+
|
|
145
|
+
Import from `@freeappstore/sdk/hooks`. Requires React 18+ as a peer dependency.
|
|
146
|
+
|
|
147
|
+
```tsx
|
|
148
|
+
import { useAuth, useTheme } from '@freeappstore/sdk/hooks';
|
|
149
|
+
|
|
150
|
+
function App() {
|
|
151
|
+
const { user, loading, signIn, signOut, deleteAccount } = useAuth(fas);
|
|
152
|
+
const { theme, preference, setPreference } = useTheme();
|
|
153
|
+
// ...
|
|
154
|
+
}
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### UI Components
|
|
158
|
+
|
|
159
|
+
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
|
+
|
|
161
|
+
```tsx
|
|
162
|
+
import { FasShell, Avatar, SignInButton, ThemeToggle, ProfileMenu, ProfilePage } from '@freeappstore/sdk/ui';
|
|
163
|
+
|
|
164
|
+
// Zero-config shell
|
|
165
|
+
<FasShell app={fas} appName="My App">
|
|
166
|
+
<MyApp />
|
|
167
|
+
</FasShell>
|
|
168
|
+
|
|
169
|
+
// Or use individual components
|
|
170
|
+
<Avatar user={user} size={32} />
|
|
171
|
+
<ThemeToggle />
|
|
172
|
+
<ProfileMenu app={fas} />
|
|
173
|
+
<ProfilePage app={fas} />
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
Full docs: [freeappstore.online/docs/ui](https://freeappstore.online/docs/ui)
|
|
177
|
+
|
|
143
178
|
## License
|
|
144
179
|
|
|
145
180
|
MIT.
|
package/dist/hooks.d.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { FreeAppStore } from './index.js';
|
|
2
|
+
import type { User } from './types.js';
|
|
3
|
+
export type { User } from './types.js';
|
|
4
|
+
type ThemePreference = 'light' | 'dark' | 'system';
|
|
5
|
+
type ResolvedTheme = 'light' | 'dark';
|
|
6
|
+
/**
|
|
7
|
+
* Theme hook — zero-provider. Reads/writes localStorage, applies data-theme on <html>.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* ```tsx
|
|
11
|
+
* const { theme, preference, setPreference } = useTheme()
|
|
12
|
+
* // theme: 'light' | 'dark' (resolved)
|
|
13
|
+
* // preference: 'light' | 'dark' | 'system' (user's choice)
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export declare function useTheme(): {
|
|
17
|
+
theme: ResolvedTheme;
|
|
18
|
+
preference: ThemePreference;
|
|
19
|
+
setPreference: (pref: ThemePreference) => void;
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* Auth state + actions. The primary way apps interact with platform identity.
|
|
23
|
+
*
|
|
24
|
+
* Usage:
|
|
25
|
+
* ```tsx
|
|
26
|
+
* const { user, loading, signIn, signOut, deleteAccount } = useAuth(fas)
|
|
27
|
+
* if (loading) return <Spinner />
|
|
28
|
+
* if (!user) return <button onClick={signIn}>Sign in</button>
|
|
29
|
+
* return <p>Welcome, {user.login}!</p>
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export declare function useAuth(app: FreeAppStore): {
|
|
33
|
+
user: User | null;
|
|
34
|
+
loading: boolean;
|
|
35
|
+
signIn: () => void;
|
|
36
|
+
signOut: () => void;
|
|
37
|
+
deleteAccount: () => Promise<void>;
|
|
38
|
+
hasRole: (role: string) => Promise<boolean>;
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEvC,YAAY,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAIvC,KAAK,eAAe,GAAG,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;AACnD,KAAK,aAAa,GAAG,OAAO,GAAG,MAAM,CAAC;AA4DtC;;;;;;;;;GASG;AACH,wBAAgB,QAAQ;;;0BAGmB,eAAe;EASzD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,YAAY;;;;;;oBAuB9B,MAAM;EAKhB"}
|
package/dist/hooks.js
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { useSyncExternalStore, useState, useEffect, useCallback } from 'react';
|
|
2
|
+
const THEME_KEY = 'fas:theme';
|
|
3
|
+
// Shared theme state — all useTheme() callers share this via DOM + localStorage
|
|
4
|
+
const themeListeners = new Set();
|
|
5
|
+
function getSystemTheme() {
|
|
6
|
+
if (typeof window === 'undefined')
|
|
7
|
+
return 'light';
|
|
8
|
+
return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
|
|
9
|
+
}
|
|
10
|
+
function getStoredPreference() {
|
|
11
|
+
if (typeof window === 'undefined')
|
|
12
|
+
return 'system';
|
|
13
|
+
const stored = window.localStorage.getItem(THEME_KEY);
|
|
14
|
+
if (stored === 'light' || stored === 'dark' || stored === 'system')
|
|
15
|
+
return stored;
|
|
16
|
+
return 'system';
|
|
17
|
+
}
|
|
18
|
+
function resolveTheme(pref) {
|
|
19
|
+
return pref === 'system' ? getSystemTheme() : pref;
|
|
20
|
+
}
|
|
21
|
+
function applyTheme(theme) {
|
|
22
|
+
if (typeof document === 'undefined')
|
|
23
|
+
return;
|
|
24
|
+
document.documentElement.setAttribute('data-theme', theme);
|
|
25
|
+
// Also toggle the 'dark' class used by the store sites' CSS
|
|
26
|
+
document.documentElement.classList.toggle('dark', theme === 'dark');
|
|
27
|
+
}
|
|
28
|
+
function notifyThemeListeners() {
|
|
29
|
+
for (const fn of themeListeners)
|
|
30
|
+
fn();
|
|
31
|
+
}
|
|
32
|
+
// Initialize on first import (browser only)
|
|
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
|
+
// Stable reference for useSyncExternalStore — only changes when listeners fire
|
|
51
|
+
let cachedSnapshot = getThemeSnapshot();
|
|
52
|
+
function getSnapshot() {
|
|
53
|
+
return cachedSnapshot;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Theme hook — zero-provider. Reads/writes localStorage, applies data-theme on <html>.
|
|
57
|
+
*
|
|
58
|
+
* Usage:
|
|
59
|
+
* ```tsx
|
|
60
|
+
* const { theme, preference, setPreference } = useTheme()
|
|
61
|
+
* // theme: 'light' | 'dark' (resolved)
|
|
62
|
+
* // preference: 'light' | 'dark' | 'system' (user's choice)
|
|
63
|
+
* ```
|
|
64
|
+
*/
|
|
65
|
+
export function useTheme() {
|
|
66
|
+
const snapshot = useSyncExternalStore(subscribeTheme, getSnapshot, getSnapshot);
|
|
67
|
+
const setPreference = useCallback((pref) => {
|
|
68
|
+
if (typeof window === 'undefined')
|
|
69
|
+
return;
|
|
70
|
+
window.localStorage.setItem(THEME_KEY, pref);
|
|
71
|
+
applyTheme(resolveTheme(pref));
|
|
72
|
+
cachedSnapshot = getThemeSnapshot();
|
|
73
|
+
notifyThemeListeners();
|
|
74
|
+
}, []);
|
|
75
|
+
return { theme: snapshot.theme, preference: snapshot.preference, setPreference };
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Auth state + actions. The primary way apps interact with platform identity.
|
|
79
|
+
*
|
|
80
|
+
* Usage:
|
|
81
|
+
* ```tsx
|
|
82
|
+
* const { user, loading, signIn, signOut, deleteAccount } = useAuth(fas)
|
|
83
|
+
* if (loading) return <Spinner />
|
|
84
|
+
* if (!user) return <button onClick={signIn}>Sign in</button>
|
|
85
|
+
* return <p>Welcome, {user.login}!</p>
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
export function useAuth(app) {
|
|
89
|
+
const [user, setUser] = useState(app.auth.user);
|
|
90
|
+
const [loading, setLoading] = useState(true);
|
|
91
|
+
useEffect(() => {
|
|
92
|
+
app.auth.init().finally(() => setLoading(false));
|
|
93
|
+
return app.auth.onChange(setUser);
|
|
94
|
+
}, [app]);
|
|
95
|
+
const signIn = useCallback(() => app.auth.signIn(), [app]);
|
|
96
|
+
const signOut = useCallback(() => app.auth.signOut(), [app]);
|
|
97
|
+
const deleteAccount = useCallback(async () => {
|
|
98
|
+
try {
|
|
99
|
+
const keys = await app.kv.list();
|
|
100
|
+
for (const key of keys) {
|
|
101
|
+
await app.kv.delete(key).catch(() => { });
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch { }
|
|
105
|
+
app.auth.signOut();
|
|
106
|
+
}, [app]);
|
|
107
|
+
const hasRole = useCallback((role) => app.roles.check(role), [app]);
|
|
108
|
+
return { user, loading, signIn, signOut, deleteAccount, hasRole };
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,OAAO,CAAC;AAM/E,MAAM,SAAS,GAAG,WAAW,CAAC;AAK9B,gFAAgF;AAChF,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,4DAA4D;IAC5D,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,4CAA4C;AAC5C,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,+EAA+E;AAC/E,IAAI,cAAc,GAAG,gBAAgB,EAAE,CAAC;AAExC,SAAS,WAAW;IAClB,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;;;;;;;;GASG;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,OAAO,CAAC,GAAiB;IACvC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAc,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7D,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,MAAM,OAAO,GAAG,WAAW,CACzB,CAAC,IAAY,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EACvC,CAAC,GAAG,CAAC,CACN,CAAC;IAEF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,EAAE,CAAC;AACpE,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,12 +3,15 @@ import { Counters } from './counters.js';
|
|
|
3
3
|
import { Collections } from './db.js';
|
|
4
4
|
import { Kv } from './kv.js';
|
|
5
5
|
import { ApiProxy } from './proxy.js';
|
|
6
|
+
import { Roles } from './roles.js';
|
|
6
7
|
import { Rooms } from './rooms.js';
|
|
7
8
|
import type { FasInitOptions } from './types.js';
|
|
8
9
|
export type { AuthProvider } from './auth.js';
|
|
9
10
|
export type { Collection, QueryOptions, QueryResult } from './db.js';
|
|
10
11
|
export { Collections } from './db.js';
|
|
11
12
|
export type { ConnectionState, Room, RoomMessage, RoomPeer } from './rooms.js';
|
|
13
|
+
export type { RoleAssignment, DefaultRole } from './roles.js';
|
|
14
|
+
export { DEFAULT_ROLES } from './roles.js';
|
|
12
15
|
export type { FasInitOptions, Unsubscribe, User } from './types.js';
|
|
13
16
|
/** Root SDK instance — provides auth, kv, collections, counters, rooms, and proxy sub-clients. */
|
|
14
17
|
export declare class FreeAppStore {
|
|
@@ -18,6 +21,7 @@ export declare class FreeAppStore {
|
|
|
18
21
|
readonly counters: Counters;
|
|
19
22
|
readonly rooms: Rooms;
|
|
20
23
|
readonly proxy: ApiProxy;
|
|
24
|
+
readonly roles: Roles;
|
|
21
25
|
constructor(opts: FasInitOptions);
|
|
22
26
|
}
|
|
23
27
|
/** 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,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,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;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AACtC,YAAY,EAAE,eAAe,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC/E,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAEpE,kGAAkG;AAClG,qBAAa,YAAY;IACvB,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC;IAChB,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;gBAEV,IAAI,EAAE,cAAc;CAUjC;AAED,gEAAgE;AAChE,wBAAgB,OAAO,CAAC,IAAI,EAAE,cAAc,GAAG,YAAY,CAE1D"}
|
package/dist/index.js
CHANGED
|
@@ -3,8 +3,10 @@ import { Counters } from './counters.js';
|
|
|
3
3
|
import { Collections } from './db.js';
|
|
4
4
|
import { Kv } from './kv.js';
|
|
5
5
|
import { ApiProxy } from './proxy.js';
|
|
6
|
+
import { Roles } from './roles.js';
|
|
6
7
|
import { Rooms } from './rooms.js';
|
|
7
8
|
export { Collections } from './db.js';
|
|
9
|
+
export { DEFAULT_ROLES } from './roles.js';
|
|
8
10
|
/** Root SDK instance — provides auth, kv, collections, counters, rooms, and proxy sub-clients. */
|
|
9
11
|
export class FreeAppStore {
|
|
10
12
|
auth;
|
|
@@ -13,6 +15,7 @@ export class FreeAppStore {
|
|
|
13
15
|
counters;
|
|
14
16
|
rooms;
|
|
15
17
|
proxy;
|
|
18
|
+
roles;
|
|
16
19
|
constructor(opts) {
|
|
17
20
|
const apiBase = opts.apiBase ?? 'https://api.freeappstore.online';
|
|
18
21
|
this.auth = new Auth(opts.appId, apiBase);
|
|
@@ -21,6 +24,7 @@ export class FreeAppStore {
|
|
|
21
24
|
this.counters = new Counters(opts.appId, apiBase, this.auth);
|
|
22
25
|
this.rooms = new Rooms(opts.appId, apiBase, this.auth);
|
|
23
26
|
this.proxy = new ApiProxy(opts.appId, apiBase, this.auth);
|
|
27
|
+
this.roles = new Roles(opts.appId, apiBase, this.auth);
|
|
24
28
|
}
|
|
25
29
|
}
|
|
26
30
|
/** 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;AAKnC,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,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,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"}
|
package/dist/roles.d.ts
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
interface AuthLike {
|
|
2
|
+
token: string | null;
|
|
3
|
+
handleUnauthorized(): void;
|
|
4
|
+
}
|
|
5
|
+
export interface RoleAssignment {
|
|
6
|
+
userId: string;
|
|
7
|
+
roleName: string;
|
|
8
|
+
grantedBy: string | null;
|
|
9
|
+
grantedAt: number;
|
|
10
|
+
}
|
|
11
|
+
/** Default roles provided by the platform. Devs can add custom roles. */
|
|
12
|
+
export declare const DEFAULT_ROLES: readonly ["owner", "member", "moderator", "editor", "viewer"];
|
|
13
|
+
export type DefaultRole = (typeof DEFAULT_ROLES)[number];
|
|
14
|
+
/**
|
|
15
|
+
* App-level RBAC — assign, revoke, and check roles for users in your app.
|
|
16
|
+
*
|
|
17
|
+
* Default roles (no configuration needed):
|
|
18
|
+
* owner — auto-assigned to app creator, full control
|
|
19
|
+
* member — basic authenticated access
|
|
20
|
+
* moderator — content moderation, user management
|
|
21
|
+
* editor — CRUD on app data, not settings
|
|
22
|
+
* viewer — read-only access
|
|
23
|
+
*
|
|
24
|
+
* Custom roles: pass any string to assign/revoke/check.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* await app.roles.assign('gh:123', 'moderator')
|
|
28
|
+
* const has = await app.roles.check('moderator')
|
|
29
|
+
* const mods = await app.roles.list('moderator')
|
|
30
|
+
* await app.roles.revoke('gh:123', 'moderator')
|
|
31
|
+
*/
|
|
32
|
+
export declare class Roles {
|
|
33
|
+
private readonly appId;
|
|
34
|
+
private readonly apiBase;
|
|
35
|
+
private readonly auth;
|
|
36
|
+
constructor(appId: string, apiBase: string, auth: AuthLike);
|
|
37
|
+
/** Assign a role to a user. Caller must be app owner or admin. */
|
|
38
|
+
assign(userId: string, role: string): Promise<void>;
|
|
39
|
+
/** Revoke a role from a user. Caller must be app owner or admin. */
|
|
40
|
+
revoke(userId: string, role: string): Promise<void>;
|
|
41
|
+
/** Check if the current user has a specific role in this app. */
|
|
42
|
+
check(role: string): Promise<boolean>;
|
|
43
|
+
/** List all role assignments for this app. Caller must be app owner or admin. */
|
|
44
|
+
listAll(): Promise<RoleAssignment[]>;
|
|
45
|
+
/** List all users with a specific role. Caller must be app owner or admin. */
|
|
46
|
+
list(role: string): Promise<RoleAssignment[]>;
|
|
47
|
+
/** Get the current user's roles in this app. */
|
|
48
|
+
myRoles(): Promise<string[]>;
|
|
49
|
+
private post;
|
|
50
|
+
private del;
|
|
51
|
+
}
|
|
52
|
+
export {};
|
|
53
|
+
//# sourceMappingURL=roles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roles.d.ts","sourceRoot":"","sources":["../src/roles.ts"],"names":[],"mappings":"AAAA,UAAU,QAAQ;IAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,kBAAkB,IAAI,IAAI,CAAC;CAC5B;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,yEAAyE;AACzE,eAAO,MAAM,aAAa,+DAAgE,CAAC;AAC3F,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC;AAEzD;;;;;;;;;;;;;;;;;GAiBG;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,QAAQ;IAGjC,kEAAkE;IAC5D,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzD,oEAAoE;IAC9D,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIzD,iEAAiE;IAC3D,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAY3C,iFAAiF;IAC3E,OAAO,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;IAa1C,8EAA8E;IACxE,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAKnD,gDAAgD;IAC1C,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YAYpB,IAAI;YAeJ,GAAG;CAclB"}
|
package/dist/roles.js
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/** Default roles provided by the platform. Devs can add custom roles. */
|
|
2
|
+
export const DEFAULT_ROLES = ['owner', 'member', 'moderator', 'editor', 'viewer'];
|
|
3
|
+
/**
|
|
4
|
+
* App-level RBAC — assign, revoke, and check roles for users in your app.
|
|
5
|
+
*
|
|
6
|
+
* Default roles (no configuration needed):
|
|
7
|
+
* owner — auto-assigned to app creator, full control
|
|
8
|
+
* member — basic authenticated access
|
|
9
|
+
* moderator — content moderation, user management
|
|
10
|
+
* editor — CRUD on app data, not settings
|
|
11
|
+
* viewer — read-only access
|
|
12
|
+
*
|
|
13
|
+
* Custom roles: pass any string to assign/revoke/check.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* await app.roles.assign('gh:123', 'moderator')
|
|
17
|
+
* const has = await app.roles.check('moderator')
|
|
18
|
+
* const mods = await app.roles.list('moderator')
|
|
19
|
+
* await app.roles.revoke('gh:123', 'moderator')
|
|
20
|
+
*/
|
|
21
|
+
export class Roles {
|
|
22
|
+
appId;
|
|
23
|
+
apiBase;
|
|
24
|
+
auth;
|
|
25
|
+
constructor(appId, apiBase, auth) {
|
|
26
|
+
this.appId = appId;
|
|
27
|
+
this.apiBase = apiBase;
|
|
28
|
+
this.auth = auth;
|
|
29
|
+
}
|
|
30
|
+
/** Assign a role to a user. Caller must be app owner or admin. */
|
|
31
|
+
async assign(userId, role) {
|
|
32
|
+
await this.post(`/v1/apps/${encodeURIComponent(this.appId)}/roles`, { userId, role });
|
|
33
|
+
}
|
|
34
|
+
/** Revoke a role from a user. Caller must be app owner or admin. */
|
|
35
|
+
async revoke(userId, role) {
|
|
36
|
+
await this.del(`/v1/apps/${encodeURIComponent(this.appId)}/roles`, { userId, role });
|
|
37
|
+
}
|
|
38
|
+
/** Check if the current user has a specific role in this app. */
|
|
39
|
+
async check(role) {
|
|
40
|
+
const token = this.auth.token;
|
|
41
|
+
if (!token)
|
|
42
|
+
return false;
|
|
43
|
+
const res = await fetch(`${this.apiBase}/v1/apps/${encodeURIComponent(this.appId)}/roles/check/${encodeURIComponent(role)}`, { headers: { Authorization: `Bearer ${token}` } });
|
|
44
|
+
if (!res.ok)
|
|
45
|
+
return false;
|
|
46
|
+
const data = (await res.json());
|
|
47
|
+
return data.has;
|
|
48
|
+
}
|
|
49
|
+
/** List all role assignments for this app. Caller must be app owner or admin. */
|
|
50
|
+
async listAll() {
|
|
51
|
+
const token = this.auth.token;
|
|
52
|
+
if (!token)
|
|
53
|
+
throw new Error('Not signed in.');
|
|
54
|
+
const res = await fetch(`${this.apiBase}/v1/apps/${encodeURIComponent(this.appId)}/roles`, { headers: { Authorization: `Bearer ${token}` } });
|
|
55
|
+
if (res.status === 401) {
|
|
56
|
+
this.auth.handleUnauthorized();
|
|
57
|
+
throw new Error('Not signed in.');
|
|
58
|
+
}
|
|
59
|
+
if (!res.ok)
|
|
60
|
+
throw new Error(`roles.listAll failed: ${res.status}`);
|
|
61
|
+
const data = (await res.json());
|
|
62
|
+
return data.roles;
|
|
63
|
+
}
|
|
64
|
+
/** List all users with a specific role. Caller must be app owner or admin. */
|
|
65
|
+
async list(role) {
|
|
66
|
+
const all = await this.listAll();
|
|
67
|
+
return all.filter((r) => r.roleName === role);
|
|
68
|
+
}
|
|
69
|
+
/** Get the current user's roles in this app. */
|
|
70
|
+
async myRoles() {
|
|
71
|
+
const token = this.auth.token;
|
|
72
|
+
if (!token)
|
|
73
|
+
return [];
|
|
74
|
+
const res = await fetch(`${this.apiBase}/v1/apps/${encodeURIComponent(this.appId)}/roles/me`, { headers: { Authorization: `Bearer ${token}` } });
|
|
75
|
+
if (!res.ok)
|
|
76
|
+
return [];
|
|
77
|
+
const data = (await res.json());
|
|
78
|
+
return data.roles;
|
|
79
|
+
}
|
|
80
|
+
async post(path, body) {
|
|
81
|
+
const token = this.auth.token;
|
|
82
|
+
if (!token)
|
|
83
|
+
throw new Error('Not signed in.');
|
|
84
|
+
const res = await fetch(this.apiBase + path, {
|
|
85
|
+
method: 'POST',
|
|
86
|
+
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
|
|
87
|
+
body: JSON.stringify(body),
|
|
88
|
+
});
|
|
89
|
+
if (res.status === 401) {
|
|
90
|
+
this.auth.handleUnauthorized();
|
|
91
|
+
throw new Error('Not signed in.');
|
|
92
|
+
}
|
|
93
|
+
if (!res.ok) {
|
|
94
|
+
const text = await res.text().catch(() => '');
|
|
95
|
+
throw new Error(`${path} failed: ${res.status} ${text}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
async del(path, body) {
|
|
99
|
+
const token = this.auth.token;
|
|
100
|
+
if (!token)
|
|
101
|
+
throw new Error('Not signed in.');
|
|
102
|
+
const res = await fetch(this.apiBase + path, {
|
|
103
|
+
method: 'DELETE',
|
|
104
|
+
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
|
|
105
|
+
body: JSON.stringify(body),
|
|
106
|
+
});
|
|
107
|
+
if (res.status === 401) {
|
|
108
|
+
this.auth.handleUnauthorized();
|
|
109
|
+
throw new Error('Not signed in.');
|
|
110
|
+
}
|
|
111
|
+
if (!res.ok) {
|
|
112
|
+
const text = await res.text().catch(() => '');
|
|
113
|
+
throw new Error(`${path} failed: ${res.status} ${text}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=roles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"roles.js","sourceRoot":"","sources":["../src/roles.ts"],"names":[],"mappings":"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"}
|
package/dist/ui.d.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
import type { FreeAppStore } from './index.js';
|
|
3
|
+
import type { User } from './types.js';
|
|
4
|
+
export interface AvatarProps {
|
|
5
|
+
user: User | null;
|
|
6
|
+
size?: number;
|
|
7
|
+
}
|
|
8
|
+
/** GitHub avatar with fallback to colored initial circle. */
|
|
9
|
+
export declare function Avatar({ user, size }: AvatarProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
export interface SignInButtonProps {
|
|
11
|
+
app: FreeAppStore;
|
|
12
|
+
label?: string;
|
|
13
|
+
}
|
|
14
|
+
/** Platform-branded sign-in button. Calls app.auth.signIn(). */
|
|
15
|
+
export declare function SignInButton({ app, label }: SignInButtonProps): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
/** Sun/moon toggle button. Cycles: system -> light -> dark. */
|
|
17
|
+
export declare function ThemeToggle(): import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
export interface ProfileMenuProps {
|
|
19
|
+
app: FreeAppStore;
|
|
20
|
+
showThemeToggle?: boolean;
|
|
21
|
+
children?: ReactNode;
|
|
22
|
+
}
|
|
23
|
+
/** Avatar button that opens dropdown: username, theme toggle, sign out, delete account. */
|
|
24
|
+
export declare function ProfileMenu({ app, showThemeToggle, children }: ProfileMenuProps): import("react/jsx-runtime").JSX.Element | null;
|
|
25
|
+
export interface ProfilePageProps {
|
|
26
|
+
app: FreeAppStore;
|
|
27
|
+
showThemeToggle?: boolean;
|
|
28
|
+
}
|
|
29
|
+
/** Full-page settings view: avatar, username, theme selector, sign out, delete account. */
|
|
30
|
+
export declare function ProfilePage({ app, showThemeToggle }: ProfilePageProps): import("react/jsx-runtime").JSX.Element;
|
|
31
|
+
export interface FasShellProps {
|
|
32
|
+
app: FreeAppStore;
|
|
33
|
+
children: ReactNode;
|
|
34
|
+
appName?: string;
|
|
35
|
+
requireAuth?: boolean;
|
|
36
|
+
showThemeToggle?: boolean;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Full wrapper: sticky topbar (logo + app name + ProfileMenu or SignInButton),
|
|
40
|
+
* main content area, "Part of FreeAppStore" footer. Optional auth gate.
|
|
41
|
+
*/
|
|
42
|
+
export declare function FasShell({ app, children, appName, requireAuth, showThemeToggle }: FasShellProps): import("react/jsx-runtime").JSX.Element;
|
|
43
|
+
//# 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,OAAO,EAA4C,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACjF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAOvC,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,4CAqD1B;AAMD,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,YAAY,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AAED,2FAA2F;AAC3F,wBAAgB,WAAW,CAAC,EAAE,GAAG,EAAE,eAAsB,EAAE,QAAQ,EAAE,EAAE,gBAAgB,kDA8EtF;AAmBD,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,YAAY,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,2FAA2F;AAC3F,wBAAgB,WAAW,CAAC,EAAE,GAAG,EAAE,eAAsB,EAAE,EAAE,gBAAgB,2CA4H5E;AAMD,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,YAAY,CAAC;IAClB,QAAQ,EAAE,SAAS,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAmB,EAAE,eAAsB,EAAE,EAAE,aAAa,2CAoF9G"}
|
package/dist/ui.js
ADDED
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useEffect, useCallback, useRef } from 'react';
|
|
3
|
+
import { useAuth, useTheme } from './hooks.js';
|
|
4
|
+
/** GitHub avatar with fallback to colored initial circle. */
|
|
5
|
+
export function Avatar({ user, size = 32 }) {
|
|
6
|
+
if (user?.avatarUrl) {
|
|
7
|
+
return (_jsx("img", { src: user.avatarUrl, alt: user.login, width: size, height: size, style: {
|
|
8
|
+
borderRadius: '50%',
|
|
9
|
+
display: 'block',
|
|
10
|
+
} }));
|
|
11
|
+
}
|
|
12
|
+
const initial = user?.login?.charAt(0).toUpperCase() ?? '?';
|
|
13
|
+
return (_jsx("div", { style: {
|
|
14
|
+
width: size,
|
|
15
|
+
height: size,
|
|
16
|
+
borderRadius: '50%',
|
|
17
|
+
background: 'var(--accent, #2563eb)',
|
|
18
|
+
color: '#fff',
|
|
19
|
+
display: 'flex',
|
|
20
|
+
alignItems: 'center',
|
|
21
|
+
justifyContent: 'center',
|
|
22
|
+
fontSize: size * 0.45,
|
|
23
|
+
fontWeight: 700,
|
|
24
|
+
}, children: initial }));
|
|
25
|
+
}
|
|
26
|
+
/** Platform-branded sign-in button. Calls app.auth.signIn(). */
|
|
27
|
+
export function SignInButton({ app, label = 'Sign in with GitHub' }) {
|
|
28
|
+
return (_jsx("button", { onClick: () => app.auth.signIn(), style: {
|
|
29
|
+
background: 'var(--accent, #2563eb)',
|
|
30
|
+
color: '#fff',
|
|
31
|
+
border: 'none',
|
|
32
|
+
padding: '0.6rem 1.5rem',
|
|
33
|
+
borderRadius: 'var(--radius, 0.75rem)',
|
|
34
|
+
fontSize: '0.9rem',
|
|
35
|
+
fontWeight: 700,
|
|
36
|
+
cursor: 'pointer',
|
|
37
|
+
fontFamily: 'inherit',
|
|
38
|
+
}, children: label }));
|
|
39
|
+
}
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
// ThemeToggle
|
|
42
|
+
// ---------------------------------------------------------------------------
|
|
43
|
+
/** Sun/moon toggle button. Cycles: system -> light -> dark. */
|
|
44
|
+
export function ThemeToggle() {
|
|
45
|
+
const { theme, preference, setPreference } = useTheme();
|
|
46
|
+
const cycle = useCallback(() => {
|
|
47
|
+
const order = ['system', 'light', 'dark'];
|
|
48
|
+
const idx = order.indexOf(preference);
|
|
49
|
+
setPreference(order[(idx + 1) % order.length]);
|
|
50
|
+
}, [preference, setPreference]);
|
|
51
|
+
// Sun icon for dark mode, moon for light
|
|
52
|
+
const icon = theme === 'dark' ? (
|
|
53
|
+
// Sun
|
|
54
|
+
_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" })] })) : (
|
|
55
|
+
// Moon
|
|
56
|
+
_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" }) }));
|
|
57
|
+
return (_jsx("button", { onClick: cycle, "aria-label": `Theme: ${preference}`, title: `Theme: ${preference}`, style: {
|
|
58
|
+
width: 36,
|
|
59
|
+
height: 36,
|
|
60
|
+
borderRadius: 'var(--radius, 0.75rem)',
|
|
61
|
+
border: '1px solid var(--border, #e2e8f0)',
|
|
62
|
+
background: 'var(--surface, #ffffff)',
|
|
63
|
+
color: 'var(--ink, #1e293b)',
|
|
64
|
+
display: 'inline-flex',
|
|
65
|
+
alignItems: 'center',
|
|
66
|
+
justifyContent: 'center',
|
|
67
|
+
cursor: 'pointer',
|
|
68
|
+
padding: 0,
|
|
69
|
+
fontFamily: 'inherit',
|
|
70
|
+
}, children: icon }));
|
|
71
|
+
}
|
|
72
|
+
/** Avatar button that opens dropdown: username, theme toggle, sign out, delete account. */
|
|
73
|
+
export function ProfileMenu({ app, showThemeToggle = true, children }) {
|
|
74
|
+
const { user, signOut, deleteAccount } = useAuth(app);
|
|
75
|
+
const [open, setOpen] = useState(false);
|
|
76
|
+
const ref = useRef(null);
|
|
77
|
+
// Close on outside click
|
|
78
|
+
useEffect(() => {
|
|
79
|
+
if (!open)
|
|
80
|
+
return;
|
|
81
|
+
const handler = (e) => {
|
|
82
|
+
if (ref.current && !ref.current.contains(e.target))
|
|
83
|
+
setOpen(false);
|
|
84
|
+
};
|
|
85
|
+
document.addEventListener('mousedown', handler);
|
|
86
|
+
return () => document.removeEventListener('mousedown', handler);
|
|
87
|
+
}, [open]);
|
|
88
|
+
if (!user)
|
|
89
|
+
return null;
|
|
90
|
+
const handleSignOut = () => { signOut(); setOpen(false); };
|
|
91
|
+
const handleDelete = async () => {
|
|
92
|
+
if (!confirm('Delete your account? This permanently removes ALL your data across ALL apps. This cannot be undone.'))
|
|
93
|
+
return;
|
|
94
|
+
if (!confirm('Are you absolutely sure? Last chance.'))
|
|
95
|
+
return;
|
|
96
|
+
await deleteAccount();
|
|
97
|
+
setOpen(false);
|
|
98
|
+
};
|
|
99
|
+
return (_jsxs("div", { ref: ref, style: { position: 'relative' }, children: [_jsx("button", { onClick: () => setOpen(!open), style: {
|
|
100
|
+
background: 'none',
|
|
101
|
+
border: '2px solid var(--border, #e2e8f0)',
|
|
102
|
+
borderRadius: '50%',
|
|
103
|
+
padding: 0,
|
|
104
|
+
cursor: 'pointer',
|
|
105
|
+
width: 32,
|
|
106
|
+
height: 32,
|
|
107
|
+
overflow: 'hidden',
|
|
108
|
+
display: 'block',
|
|
109
|
+
}, children: _jsx(Avatar, { user: user, size: 28 }) }), open && (_jsxs("div", { style: {
|
|
110
|
+
position: 'absolute',
|
|
111
|
+
top: 40,
|
|
112
|
+
right: 0,
|
|
113
|
+
background: 'var(--surface, #ffffff)',
|
|
114
|
+
border: '1px solid var(--border, #e2e8f0)',
|
|
115
|
+
borderRadius: 'var(--radius, 0.75rem)',
|
|
116
|
+
boxShadow: '0 4px 20px rgba(0,0,0,0.1)',
|
|
117
|
+
minWidth: 200,
|
|
118
|
+
padding: '0.5rem 0',
|
|
119
|
+
zIndex: 100,
|
|
120
|
+
}, children: [_jsx("div", { style: {
|
|
121
|
+
padding: '0.5rem 1rem',
|
|
122
|
+
borderBottom: '1px solid var(--border, #e2e8f0)',
|
|
123
|
+
fontSize: '0.85rem',
|
|
124
|
+
fontWeight: 700,
|
|
125
|
+
color: 'var(--ink, #1e293b)',
|
|
126
|
+
}, 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" })] }))] }));
|
|
127
|
+
}
|
|
128
|
+
const menuItemStyle = {
|
|
129
|
+
display: 'block',
|
|
130
|
+
width: '100%',
|
|
131
|
+
padding: '0.5rem 1rem',
|
|
132
|
+
background: 'none',
|
|
133
|
+
border: 'none',
|
|
134
|
+
textAlign: 'left',
|
|
135
|
+
fontSize: '0.85rem',
|
|
136
|
+
cursor: 'pointer',
|
|
137
|
+
color: 'var(--ink, #1e293b)',
|
|
138
|
+
fontFamily: 'inherit',
|
|
139
|
+
};
|
|
140
|
+
/** Full-page settings view: avatar, username, theme selector, sign out, delete account. */
|
|
141
|
+
export function ProfilePage({ app, showThemeToggle = true }) {
|
|
142
|
+
const { user, loading, signIn, signOut, deleteAccount } = useAuth(app);
|
|
143
|
+
const { preference, setPreference } = useTheme();
|
|
144
|
+
if (loading) {
|
|
145
|
+
return _jsx("div", { style: { padding: '2rem', textAlign: 'center', color: 'var(--muted, #64748b)' }, children: "Loading..." });
|
|
146
|
+
}
|
|
147
|
+
if (!user) {
|
|
148
|
+
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 })] }));
|
|
149
|
+
}
|
|
150
|
+
const handleDelete = async () => {
|
|
151
|
+
if (!confirm('Delete your account? This permanently removes ALL your data across ALL apps. This cannot be undone.'))
|
|
152
|
+
return;
|
|
153
|
+
if (!confirm('Are you absolutely sure? Last chance.'))
|
|
154
|
+
return;
|
|
155
|
+
await deleteAccount();
|
|
156
|
+
};
|
|
157
|
+
const themeOptions = [
|
|
158
|
+
{ value: 'system', label: 'System' },
|
|
159
|
+
{ value: 'light', label: 'Light' },
|
|
160
|
+
{ value: 'dark', label: 'Dark' },
|
|
161
|
+
];
|
|
162
|
+
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: "FreeAppStore account" })] })] }), showThemeToggle && (_jsxs("div", { style: {
|
|
163
|
+
background: 'var(--surface, #ffffff)',
|
|
164
|
+
border: '1px solid var(--border, #e2e8f0)',
|
|
165
|
+
borderRadius: 'var(--radius, 0.75rem)',
|
|
166
|
+
padding: '1.25rem',
|
|
167
|
+
marginBottom: '1rem',
|
|
168
|
+
}, 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: {
|
|
169
|
+
flex: 1,
|
|
170
|
+
padding: '0.5rem',
|
|
171
|
+
borderRadius: 'var(--radius-sm, 0.5rem)',
|
|
172
|
+
border: preference === opt.value ? '2px solid var(--accent, #2563eb)' : '1px solid var(--border, #e2e8f0)',
|
|
173
|
+
background: preference === opt.value ? 'var(--accent-soft, #eff6ff)' : 'transparent',
|
|
174
|
+
color: preference === opt.value ? 'var(--accent, #2563eb)' : 'var(--muted, #64748b)',
|
|
175
|
+
fontWeight: preference === opt.value ? 700 : 500,
|
|
176
|
+
fontSize: '0.85rem',
|
|
177
|
+
cursor: 'pointer',
|
|
178
|
+
fontFamily: 'inherit',
|
|
179
|
+
}, children: opt.label }, opt.value))) })] })), _jsx("button", { onClick: signOut, style: {
|
|
180
|
+
width: '100%',
|
|
181
|
+
padding: '0.75rem',
|
|
182
|
+
borderRadius: 'var(--radius, 0.75rem)',
|
|
183
|
+
border: '1px solid var(--border, #e2e8f0)',
|
|
184
|
+
background: 'var(--surface, #ffffff)',
|
|
185
|
+
color: 'var(--ink, #1e293b)',
|
|
186
|
+
fontSize: '0.9rem',
|
|
187
|
+
fontWeight: 600,
|
|
188
|
+
cursor: 'pointer',
|
|
189
|
+
marginBottom: '1.5rem',
|
|
190
|
+
fontFamily: 'inherit',
|
|
191
|
+
}, children: "Sign out" }), _jsxs("div", { style: {
|
|
192
|
+
border: '1px solid #fecaca',
|
|
193
|
+
borderRadius: 'var(--radius, 0.75rem)',
|
|
194
|
+
padding: '1.25rem',
|
|
195
|
+
}, 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: {
|
|
196
|
+
padding: '0.5rem 1rem',
|
|
197
|
+
borderRadius: 'var(--radius-sm, 0.5rem)',
|
|
198
|
+
border: '1px solid #dc2626',
|
|
199
|
+
background: 'transparent',
|
|
200
|
+
color: '#dc2626',
|
|
201
|
+
fontSize: '0.85rem',
|
|
202
|
+
fontWeight: 600,
|
|
203
|
+
cursor: 'pointer',
|
|
204
|
+
fontFamily: 'inherit',
|
|
205
|
+
}, children: "Delete account" })] })] }));
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Full wrapper: sticky topbar (logo + app name + ProfileMenu or SignInButton),
|
|
209
|
+
* main content area, "Part of FreeAppStore" footer. Optional auth gate.
|
|
210
|
+
*/
|
|
211
|
+
export function FasShell({ app, children, appName, requireAuth = false, showThemeToggle = true }) {
|
|
212
|
+
const { user, loading } = useAuth(app);
|
|
213
|
+
if (loading) {
|
|
214
|
+
return _jsx("div", { style: { minHeight: '100dvh', display: 'flex', alignItems: 'center', justifyContent: 'center' }, children: _jsx("p", { style: { color: 'var(--muted, #64748b)' }, children: "Loading..." }) });
|
|
215
|
+
}
|
|
216
|
+
if (requireAuth && !user) {
|
|
217
|
+
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 || 'FreeAppStore' }), _jsx("p", { style: { color: 'var(--muted, #64748b)', fontSize: '0.9rem', marginBottom: '1rem' }, children: "Sign in to continue." }), _jsx(SignInButton, { app: app }), _jsx("p", { style: { color: 'var(--muted, #64748b)', fontSize: '0.75rem', marginTop: '0.75rem' }, children: "One account for all Free apps." })] }) }));
|
|
218
|
+
}
|
|
219
|
+
return (_jsxs("div", { style: { minHeight: '100dvh', display: 'flex', flexDirection: 'column' }, children: [_jsxs("header", { style: {
|
|
220
|
+
display: 'flex',
|
|
221
|
+
alignItems: 'center',
|
|
222
|
+
justifyContent: 'space-between',
|
|
223
|
+
padding: '0.5rem 1rem',
|
|
224
|
+
borderBottom: '1px solid var(--border, #e2e8f0)',
|
|
225
|
+
background: 'var(--surface, #ffffff)',
|
|
226
|
+
position: 'sticky',
|
|
227
|
+
top: 0,
|
|
228
|
+
zIndex: 50,
|
|
229
|
+
}, children: [_jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '0.75rem' }, children: [_jsx("a", { href: "https://freeappstore.online", style: { fontWeight: 800, fontSize: '1rem', color: 'var(--accent, #2563eb)', textDecoration: 'none' }, children: "Free" }), appName && _jsx("span", { style: { fontSize: '0.85rem', fontWeight: 600, color: 'var(--muted, #64748b)' }, children: appName })] }), _jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '0.5rem' }, children: [showThemeToggle && !user && _jsx(ThemeToggle, {}), user ? (_jsx(ProfileMenu, { app: app, showThemeToggle: showThemeToggle })) : (_jsx(SignInButton, { app: app, label: "Sign in" }))] })] }), _jsx("main", { style: { flex: 1, display: 'flex', flexDirection: 'column' }, children: children }), _jsxs("footer", { style: {
|
|
230
|
+
padding: '1rem',
|
|
231
|
+
textAlign: 'center',
|
|
232
|
+
fontSize: '0.75rem',
|
|
233
|
+
color: 'var(--muted, #64748b)',
|
|
234
|
+
borderTop: '1px solid var(--border, #e2e8f0)',
|
|
235
|
+
}, children: ["Part of", ' ', _jsx("a", { href: "https://freeappstore.online", style: { color: 'var(--accent, #2563eb)', fontWeight: 600, textDecoration: 'none' }, children: "FreeAppStore" })] })] }));
|
|
236
|
+
}
|
|
237
|
+
//# 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": "@freeappstore/sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "Browser SDK for free apps on freeappstore.online — auth, per-user KV, light realtime rooms, secret-injecting proxy for third-party APIs.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -10,6 +10,14 @@
|
|
|
10
10
|
".": {
|
|
11
11
|
"types": "./dist/index.d.ts",
|
|
12
12
|
"import": "./dist/index.js"
|
|
13
|
+
},
|
|
14
|
+
"./hooks": {
|
|
15
|
+
"types": "./dist/hooks.d.ts",
|
|
16
|
+
"import": "./dist/hooks.js"
|
|
17
|
+
},
|
|
18
|
+
"./ui": {
|
|
19
|
+
"types": "./dist/ui.d.ts",
|
|
20
|
+
"import": "./dist/ui.js"
|
|
13
21
|
}
|
|
14
22
|
},
|
|
15
23
|
"homepage": "https://github.com/freeappstore-online/platform#readme",
|
|
@@ -37,12 +45,22 @@
|
|
|
37
45
|
"dist",
|
|
38
46
|
"README.md"
|
|
39
47
|
],
|
|
40
|
-
"
|
|
41
|
-
"
|
|
42
|
-
|
|
48
|
+
"peerDependencies": {
|
|
49
|
+
"react": "^18.0.0 || ^19.0.0"
|
|
50
|
+
},
|
|
51
|
+
"peerDependenciesMeta": {
|
|
52
|
+
"react": {
|
|
53
|
+
"optional": true
|
|
54
|
+
}
|
|
43
55
|
},
|
|
44
56
|
"devDependencies": {
|
|
57
|
+
"@types/react": "^19.0.0",
|
|
58
|
+
"react": "^19.0.0",
|
|
45
59
|
"typescript": "^5.7.0"
|
|
46
60
|
},
|
|
47
|
-
"sideEffects": false
|
|
48
|
-
|
|
61
|
+
"sideEffects": false,
|
|
62
|
+
"scripts": {
|
|
63
|
+
"build": "tsc",
|
|
64
|
+
"typecheck": "tsc --noEmit"
|
|
65
|
+
}
|
|
66
|
+
}
|