@luxfi/ui 8.2.7 → 8.2.8
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/dist/3d-model-viewer.cjs +25 -421
- package/dist/3d-model-viewer.js +20 -416
- package/dist/accordion.cjs +3 -10
- package/dist/accordion.js +2 -10
- package/dist/advanced-navigation-bar.cjs +5 -401
- package/dist/advanced-navigation-bar.js +5 -401
- package/dist/ai-agents.cjs +45 -890
- package/dist/ai-agents.js +8 -834
- package/dist/ai-assistant.cjs +13 -740
- package/dist/ai-assistant.js +10 -738
- package/dist/ai-chat.cjs +24 -770
- package/dist/ai-chat.js +18 -765
- package/dist/ai-code.cjs +67 -923
- package/dist/ai-code.js +49 -905
- package/dist/ai-playground.cjs +25 -801
- package/dist/ai-playground.js +18 -795
- package/dist/ai-tools.cjs +22 -767
- package/dist/ai-tools.js +15 -761
- package/dist/ai-vision.cjs +41 -993
- package/dist/ai-vision.js +30 -983
- package/dist/ai-voice-settings.cjs +35 -1006
- package/dist/ai-voice-settings.js +32 -1004
- package/dist/ai-voice.cjs +51 -1024
- package/dist/ai-voice.js +9 -963
- package/dist/alert.cjs +11 -129
- package/dist/alert.js +8 -127
- package/dist/announcement.cjs +6 -402
- package/dist/announcement.js +6 -402
- package/dist/app-switcher-navigation-bar.cjs +5 -401
- package/dist/app-switcher-navigation-bar.js +5 -401
- package/dist/apple-cards-carousel.cjs +84 -480
- package/dist/apple-cards-carousel.js +19 -415
- package/dist/auth.cjs +10 -387
- package/dist/auth.js +7 -385
- package/dist/avatar.cjs +2 -9
- package/dist/avatar.js +2 -10
- package/dist/badge.cjs +8 -228
- package/dist/badge.js +5 -210
- package/dist/button.cjs +14 -67
- package/dist/button.js +12 -65
- package/dist/chrome.cjs +29 -493
- package/dist/chrome.js +9 -474
- package/dist/code-block.cjs +16 -664
- package/dist/code-block.js +13 -662
- package/dist/code-compare.cjs +28 -1302
- package/dist/code-compare.js +18 -1293
- package/dist/code-diff.cjs +21 -669
- package/dist/code-diff.js +17 -666
- package/dist/code-editor.cjs +13 -409
- package/dist/code-editor.js +12 -408
- package/dist/code-explorer.cjs +14 -456
- package/dist/code-explorer.js +13 -456
- package/dist/code-preview.cjs +31 -983
- package/dist/code-preview.js +23 -976
- package/dist/code-snippet.cjs +19 -667
- package/dist/code-snippet.js +14 -663
- package/dist/code-terminal.cjs +24 -485
- package/dist/code-terminal.js +19 -481
- package/dist/collapsible.cjs +13 -347
- package/dist/collapsible.js +11 -330
- package/dist/color-picker.cjs +8 -450
- package/dist/color-picker.js +7 -450
- package/dist/combobox.cjs +6 -402
- package/dist/combobox.js +6 -402
- package/dist/communication-navigation-bar.cjs +7 -403
- package/dist/communication-navigation-bar.js +5 -401
- package/dist/dashboard-navigation-bar.cjs +6 -402
- package/dist/dashboard-navigation-bar.js +5 -401
- package/dist/dialog-stack.cjs +5 -401
- package/dist/dialog-stack.js +5 -401
- package/dist/dialog.cjs +13 -70
- package/dist/dialog.js +13 -70
- package/dist/drawer.cjs +23 -99
- package/dist/drawer.js +19 -96
- package/dist/e-commerce-navigation-bar.cjs +7 -403
- package/dist/e-commerce-navigation-bar.js +5 -401
- package/dist/editor.cjs +9 -405
- package/dist/editor.js +6 -402
- package/dist/iam.cjs +2 -123
- package/dist/iam.js +1 -122
- package/dist/icon-button.cjs +2 -56
- package/dist/icon-button.js +1 -55
- package/dist/identity.cjs +28 -242
- package/dist/identity.js +20 -235
- package/dist/image-crop.cjs +10 -406
- package/dist/image-crop.js +7 -403
- package/dist/image.cjs +14 -83
- package/dist/image.js +13 -67
- package/dist/index.cjs +1868 -38770
- package/dist/index.js +174 -38320
- package/dist/input-group.cjs +3 -10
- package/dist/input-group.js +2 -10
- package/dist/item.cjs +2 -27
- package/dist/item.js +1 -22
- package/dist/kanban.cjs +25 -751
- package/dist/kanban.js +15 -742
- package/dist/limelight-nav.cjs +10 -452
- package/dist/limelight-nav.js +9 -452
- package/dist/link.cjs +11 -80
- package/dist/link.js +6 -60
- package/dist/lux.config.cjs +14 -32
- package/dist/lux.config.js +3 -26
- package/dist/menu.cjs +5 -13
- package/dist/menu.js +1 -9
- package/dist/message-dock.cjs +5 -401
- package/dist/message-dock.js +5 -401
- package/dist/mini-calendar.cjs +7 -403
- package/dist/mini-calendar.js +6 -402
- package/dist/music-player.cjs +30 -528
- package/dist/music-player.js +22 -520
- package/dist/next.cjs +8 -89
- package/dist/next.js +3 -86
- package/dist/popover.cjs +17 -74
- package/dist/popover.js +16 -73
- package/dist/progress-circle.cjs +3 -10
- package/dist/progress-circle.js +2 -10
- package/dist/provider.cjs +7 -176
- package/dist/provider.js +4 -174
- package/dist/select.cjs +36 -89
- package/dist/select.js +35 -88
- package/dist/sidebar.cjs +22 -493
- package/dist/sidebar.js +17 -489
- package/dist/site/commerce/ui/context.cjs +9 -214
- package/dist/site/commerce/ui/context.js +6 -215
- package/dist/site/components/analytics.cjs +2 -42
- package/dist/site/components/analytics.js +1 -37
- package/dist/site/components/auth/callback.cjs +2 -8
- package/dist/site/components/auth/callback.js +1 -7
- package/dist/site/components/auth/login-panel.cjs +15 -74
- package/dist/site/components/auth/login-panel.js +12 -73
- package/dist/site/components/auth/login.cjs +2 -6
- package/dist/site/components/auth/login.js +1 -5
- package/dist/site/components/auth/widget.cjs +2 -6
- package/dist/site/components/auth/widget.js +1 -5
- package/dist/site/components/commerce/bag-button.cjs +2 -3
- package/dist/site/components/commerce/bag-button.js +2 -3
- package/dist/site/components/commerce/buy-button.cjs +2 -11
- package/dist/site/components/commerce/buy-button.js +1 -10
- package/dist/site/components/commerce/checkout-button.cjs +2 -3
- package/dist/site/components/commerce/checkout-button.js +2 -3
- package/dist/site/components/commerce/checkout-panel/desktop-cp.cjs +15 -173
- package/dist/site/components/commerce/checkout-panel/desktop-cp.js +14 -174
- package/dist/site/components/commerce/checkout-panel/index.cjs +9 -400
- package/dist/site/components/commerce/checkout-panel/index.js +10 -403
- package/dist/site/components/commerce/checkout-panel/mobile-cp.cjs +15 -236
- package/dist/site/components/commerce/checkout-panel/mobile-cp.js +13 -237
- package/dist/site/components/commerce/desktop-bag-popup.cjs +7 -8
- package/dist/site/components/commerce/desktop-bag-popup.js +3 -8
- package/dist/site/components/commerce/drawer/index.cjs +15 -289
- package/dist/site/components/commerce/drawer/index.js +10 -290
- package/dist/site/components/commerce/drawer/micro.cjs +8 -115
- package/dist/site/components/commerce/drawer/micro.js +4 -115
- package/dist/site/components/commerce/drawer/shell.cjs +2 -10
- package/dist/site/components/commerce/drawer/shell.js +2 -10
- package/dist/site/components/contact-dialog/index.cjs +6 -69
- package/dist/site/components/contact-dialog/index.js +7 -71
- package/dist/site/components/drawer-margin.cjs +2 -10
- package/dist/site/components/drawer-margin.js +2 -10
- package/dist/site/components/footer.cjs +11 -81
- package/dist/site/components/footer.js +8 -80
- package/dist/site/components/header/desktop.cjs +18 -374
- package/dist/site/components/header/desktop.js +12 -355
- package/dist/site/components/header/index.cjs +9 -674
- package/dist/site/components/header/index.js +8 -657
- package/dist/site/components/header/mobile-bag-drawer.cjs +6 -71
- package/dist/site/components/header/mobile-bag-drawer.js +5 -74
- package/dist/site/components/header/mobile-nav-menu-ai.cjs +25 -28
- package/dist/site/components/header/mobile-nav-menu-ai.js +24 -27
- package/dist/site/components/header/mobile-nav-menu-item.cjs +6 -60
- package/dist/site/components/header/mobile-nav-menu-item.js +6 -61
- package/dist/site/components/header/mobile-nav-menu.cjs +7 -110
- package/dist/site/components/header/mobile-nav-menu.js +7 -112
- package/dist/site/components/header/mobile.cjs +48 -330
- package/dist/site/components/header/mobile.js +42 -330
- package/dist/site/components/icons/index.cjs +34 -35
- package/dist/site/components/icons/index.js +5 -33
- package/dist/site/components/index.cjs +118 -1961
- package/dist/site/components/index.js +23 -1951
- package/dist/site/components/mini-chart/index.cjs +7 -90
- package/dist/site/components/mini-chart/index.js +1 -92
- package/dist/site/components/mini-chart/wrapper.cjs +7 -76
- package/dist/site/components/mini-chart/wrapper.js +4 -77
- package/dist/site/components/not-found/index.cjs +9 -819
- package/dist/site/components/not-found/index.js +8 -802
- package/dist/site/components/security/index.cjs +9 -819
- package/dist/site/components/security/index.js +8 -802
- package/dist/site/next/analytics/index.cjs +16 -49
- package/dist/site/next/analytics/index.js +3 -49
- package/dist/site/next/analytics/pixel-analytics.cjs +23 -8
- package/dist/site/next/analytics/pixel-analytics.js +4 -8
- package/dist/site/next/index.cjs +13 -140
- package/dist/site/next/index.js +2 -140
- package/dist/site/root-layout/index.cjs +12 -1435
- package/dist/site/root-layout/index.css +0 -133
- package/dist/site/root-layout/index.js +12 -1416
- package/dist/site/site-def/footer/community.cjs +11 -27
- package/dist/site/site-def/footer/community.js +2 -18
- package/dist/site/site-def/footer/index.cjs +38 -218
- package/dist/site/site-def/footer/index.js +14 -215
- package/dist/site/site-def/index.cjs +28 -620
- package/dist/site/site-def/index.js +3 -624
- package/dist/table.cjs +20 -338
- package/dist/table.js +19 -338
- package/dist/tabs.cjs +3 -10
- package/dist/tabs.js +1 -9
- package/dist/tag.cjs +9 -270
- package/dist/tag.js +6 -268
- package/dist/tags.cjs +6 -314
- package/dist/tags.js +5 -314
- package/dist/textarea.cjs +4 -50
- package/dist/textarea.js +3 -49
- package/dist/tooltip.cjs +15 -34
- package/dist/tooltip.js +13 -33
- package/dist/vite.cjs +3 -82
- package/dist/vite.js +1 -80
- package/package.json +1 -1
- package/dist/index.css +0 -132
- package/dist/site/components/auth/login-panel.css +0 -4
- package/dist/site/components/commerce/bag-button.css +0 -4
- package/dist/site/components/commerce/checkout-button.css +0 -4
- package/dist/site/components/commerce/checkout-panel/desktop-cp.css +0 -132
- package/dist/site/components/commerce/checkout-panel/index.css +0 -132
- package/dist/site/components/commerce/checkout-panel/mobile-cp.css +0 -132
- package/dist/site/components/commerce/desktop-bag-popup.css +0 -4
- package/dist/site/components/commerce/drawer/index.css +0 -132
- package/dist/site/components/commerce/drawer/micro.css +0 -4
- package/dist/site/components/header/desktop.css +0 -4
- package/dist/site/components/header/index.css +0 -132
- package/dist/site/components/header/mobile-bag-drawer.css +0 -4
- package/dist/site/components/header/mobile-nav-menu-ai.css +0 -132
- package/dist/site/components/header/mobile-nav-menu-item.css +0 -132
- package/dist/site/components/header/mobile-nav-menu.css +0 -132
- package/dist/site/components/header/mobile.css +0 -132
- package/dist/site/components/icons/index.css +0 -4
- package/dist/site/components/index.css +0 -132
- package/dist/site/components/not-found/index.css +0 -132
- package/dist/site/components/security/index.css +0 -132
- package/dist/site/site-def/footer/community.css +0 -4
- package/dist/site/site-def/footer/index.css +0 -4
- package/dist/site/site-def/index.css +0 -4
package/dist/auth.js
CHANGED
|
@@ -1,389 +1,11 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { configureIam, handleCallback, logout, startLogin } from '@hanzo/iam/browser';
|
|
3
3
|
import { Box } from '@hanzo/ui';
|
|
4
|
-
import * as
|
|
5
|
-
import
|
|
6
|
-
import '
|
|
7
|
-
import { QueryClient } from '@tanstack/react-query';
|
|
4
|
+
import * as React from 'react';
|
|
5
|
+
import { IdentityProvider } from './identity.js';
|
|
6
|
+
import { useWhiteLabel } from './provider.js';
|
|
8
7
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
9
8
|
|
|
10
|
-
// src/white-label.ts
|
|
11
|
-
var LUX_BRAND = {
|
|
12
|
-
lux: "#7000FF",
|
|
13
|
-
zoo: "#6C5EFB",
|
|
14
|
-
hanzo: "#EA580C",
|
|
15
|
-
pars: "#1C3879"};
|
|
16
|
-
var PARS_GOLD = "#C8A45C";
|
|
17
|
-
var ORGS = {
|
|
18
|
-
lux: {
|
|
19
|
-
org: "lux",
|
|
20
|
-
name: "Lux",
|
|
21
|
-
domain: "lux.network",
|
|
22
|
-
iamDomain: "lux.id",
|
|
23
|
-
accent: LUX_BRAND.lux,
|
|
24
|
-
accentForeground: "#FFFFFF"
|
|
25
|
-
},
|
|
26
|
-
zoo: {
|
|
27
|
-
org: "zoo",
|
|
28
|
-
name: "Zoo",
|
|
29
|
-
domain: "zoo.ngo",
|
|
30
|
-
// Zoo's issuer is `zoolabs.id` — the one row where it is not `<org>.id`,
|
|
31
|
-
// and the one every hand-rolled branding map gets wrong. `id.zoo.network`
|
|
32
|
-
// ANSWERS, which is why it keeps being copied around, but it is an alias:
|
|
33
|
-
// its own discovery document advertises
|
|
34
|
-
// issuer https://zoolabs.id
|
|
35
|
-
// authorization_endpoint https://zoolabs.id/v1/iam/oauth/authorize
|
|
36
|
-
// jwks_uri https://zoolabs.id/v1/iam/.well-known/jwks
|
|
37
|
-
// so a client configured on the alias validates `iss` against a string the
|
|
38
|
-
// IdP never emits and rejects every token it is given — the exact shape of
|
|
39
|
-
// the lux.id outage. `zoo.id` is not an IdP at all (no discovery document).
|
|
40
|
-
iamDomain: "zoolabs.id",
|
|
41
|
-
accent: LUX_BRAND.zoo,
|
|
42
|
-
accentForeground: "#FFFFFF"
|
|
43
|
-
},
|
|
44
|
-
bootnode: {
|
|
45
|
-
org: "bootnode",
|
|
46
|
-
name: "Bootnode",
|
|
47
|
-
domain: "bootno.de",
|
|
48
|
-
iamDomain: "id.bootno.de",
|
|
49
|
-
accent: LUX_BRAND.lux,
|
|
50
|
-
accentForeground: "#FFFFFF"
|
|
51
|
-
},
|
|
52
|
-
hanzo: {
|
|
53
|
-
org: "hanzo",
|
|
54
|
-
name: "Hanzo",
|
|
55
|
-
domain: "hanzo.ai",
|
|
56
|
-
iamDomain: "hanzo.id",
|
|
57
|
-
accent: LUX_BRAND.hanzo,
|
|
58
|
-
accentForeground: "#FFFFFF"
|
|
59
|
-
},
|
|
60
|
-
pars: {
|
|
61
|
-
org: "pars",
|
|
62
|
-
name: "Pars",
|
|
63
|
-
domain: "pars.id",
|
|
64
|
-
iamDomain: "pars.id",
|
|
65
|
-
accent: LUX_BRAND.pars,
|
|
66
|
-
accentForeground: PARS_GOLD
|
|
67
|
-
}
|
|
68
|
-
};
|
|
69
|
-
var DOMAIN_ORG = [
|
|
70
|
-
["lux.network", "lux"],
|
|
71
|
-
["lux.cloud", "lux"],
|
|
72
|
-
["lux.id", "lux"],
|
|
73
|
-
["lux.finance", "lux"],
|
|
74
|
-
["lux.market", "lux"],
|
|
75
|
-
["lux.exchange", "lux"],
|
|
76
|
-
["zoo.ngo", "zoo"],
|
|
77
|
-
["zoo.network", "zoo"],
|
|
78
|
-
["zoo.cloud", "zoo"],
|
|
79
|
-
["zoolabs.id", "zoo"],
|
|
80
|
-
["hanzo.ai", "hanzo"],
|
|
81
|
-
["hanzo.cloud", "hanzo"],
|
|
82
|
-
["hanzo.id", "hanzo"],
|
|
83
|
-
["pars.id", "pars", "app"],
|
|
84
|
-
["pars.network", "pars", "app"],
|
|
85
|
-
["parsdao.org", "pars", "app"],
|
|
86
|
-
["bootno.de", "bootnode", "platform"]
|
|
87
|
-
];
|
|
88
|
-
var DEFAULT_ORG = "lux";
|
|
89
|
-
function normalizeHost(host) {
|
|
90
|
-
const noPort = host.trim().toLowerCase().split(":")[0] ?? "";
|
|
91
|
-
return noPort.replace(/\.$/, "");
|
|
92
|
-
}
|
|
93
|
-
function isUnder(host, domain) {
|
|
94
|
-
return host === domain || host.endsWith(`.${domain}`);
|
|
95
|
-
}
|
|
96
|
-
function matchDomain(host) {
|
|
97
|
-
let best;
|
|
98
|
-
for (const entry of DOMAIN_ORG) {
|
|
99
|
-
if (isUnder(host, entry[0]) && (!best || entry[0].length > best[0].length)) {
|
|
100
|
-
best = entry;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
return best;
|
|
104
|
-
}
|
|
105
|
-
function appSlug(host, domain, pinned) {
|
|
106
|
-
if (pinned) return pinned;
|
|
107
|
-
const sub = host === domain ? "" : host.slice(0, -(domain.length + 1));
|
|
108
|
-
const leftmost = sub.split(".")[0] ?? "";
|
|
109
|
-
if (leftmost && leftmost !== "www") return leftmost;
|
|
110
|
-
const label = domain.split(".")[0] ?? "";
|
|
111
|
-
const tld = domain.split(".").slice(1).join(".");
|
|
112
|
-
return tld.split(".")[0] || label;
|
|
113
|
-
}
|
|
114
|
-
function isLocal(host) {
|
|
115
|
-
return host === "localhost" || host.endsWith(".localhost") || host === "127.0.0.1" || host === "0.0.0.0" || host === "[::1]" || host.endsWith(".local");
|
|
116
|
-
}
|
|
117
|
-
function resolveWhiteLabel(host) {
|
|
118
|
-
const h = normalizeHost(host ?? "");
|
|
119
|
-
const match = h ? matchDomain(h) : void 0;
|
|
120
|
-
const org = match ? match[1] : DEFAULT_ORG;
|
|
121
|
-
const identity = ORGS[org];
|
|
122
|
-
const app = match ? appSlug(h, match[0], match[2]) : h && isLocal(h) ? "local" : "app";
|
|
123
|
-
return {
|
|
124
|
-
...identity,
|
|
125
|
-
host: h,
|
|
126
|
-
app,
|
|
127
|
-
theme: `dark_${org}`,
|
|
128
|
-
issuer: `https://${identity.iamDomain}`,
|
|
129
|
-
clientId: `${org}-${app}`
|
|
130
|
-
};
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
// src/iam.ts
|
|
134
|
-
var IamError = class extends Error {
|
|
135
|
-
constructor(message, status, unauthenticated) {
|
|
136
|
-
super(message);
|
|
137
|
-
this.name = "IamError";
|
|
138
|
-
this.status = status;
|
|
139
|
-
this.unauthenticated = unauthenticated;
|
|
140
|
-
}
|
|
141
|
-
};
|
|
142
|
-
var SIGNED_OUT = /please sign in|authentication required|unauthorized/i;
|
|
143
|
-
function isSignedOut(status, msg) {
|
|
144
|
-
return status === 401 || SIGNED_OUT.test(msg);
|
|
145
|
-
}
|
|
146
|
-
function iamBase(host) {
|
|
147
|
-
const wl = typeof host === "object" && host !== null ? host : resolveWhiteLabel(host);
|
|
148
|
-
return `${wl.issuer}/v1/iam`;
|
|
149
|
-
}
|
|
150
|
-
async function read(call, verb, params) {
|
|
151
|
-
const url = new URL(`${call.base}/${verb}`);
|
|
152
|
-
for (const [k, v] of Object.entries(params)) url.searchParams.set(k, String(v));
|
|
153
|
-
let res;
|
|
154
|
-
try {
|
|
155
|
-
res = await fetch(url.toString(), {
|
|
156
|
-
method: "GET",
|
|
157
|
-
// The bearer is the whole credential. IAM does not allow credentialed
|
|
158
|
-
// CORS, so sending cookies would only get the response blocked.
|
|
159
|
-
headers: call.token ? { Authorization: `Bearer ${call.token}` } : {},
|
|
160
|
-
signal: call.signal
|
|
161
|
-
});
|
|
162
|
-
} catch (e) {
|
|
163
|
-
throw new IamError(e instanceof Error ? e.message : "IAM unreachable", 0, false);
|
|
164
|
-
}
|
|
165
|
-
const body = await res.json().catch(() => ({}));
|
|
166
|
-
const msg = typeof body.msg === "string" ? body.msg : "";
|
|
167
|
-
if (!res.ok || body.status === "error") {
|
|
168
|
-
throw new IamError(msg || `IAM ${verb} failed (${res.status})`, res.status, isSignedOut(res.status, msg));
|
|
169
|
-
}
|
|
170
|
-
return body.data;
|
|
171
|
-
}
|
|
172
|
-
var IAM_PAGE_SIZE = 20;
|
|
173
|
-
var iam = {
|
|
174
|
-
/** The signed-in principal, or null when there is no session. */
|
|
175
|
-
async account(call) {
|
|
176
|
-
try {
|
|
177
|
-
const data = await read(call, "get-account", {});
|
|
178
|
-
return data && data.name ? data : null;
|
|
179
|
-
} catch (e) {
|
|
180
|
-
if (e instanceof IamError && e.unauthenticated) return null;
|
|
181
|
-
throw e;
|
|
182
|
-
}
|
|
183
|
-
},
|
|
184
|
-
/**
|
|
185
|
-
* One page of the orgs the principal can see. IAM scopes the read to the
|
|
186
|
-
* caller's authority, so a normal member gets their own org and a super
|
|
187
|
-
* admin gets the tenant list — the page never has to decide.
|
|
188
|
-
*/
|
|
189
|
-
async organizations(call, page = 0, query = "", pageSize = IAM_PAGE_SIZE) {
|
|
190
|
-
const params = {
|
|
191
|
-
owner: "admin",
|
|
192
|
-
// IAM orgs live under the reserved `admin` owner
|
|
193
|
-
p: page + 1,
|
|
194
|
-
// the backend page is 1-based
|
|
195
|
-
pageSize,
|
|
196
|
-
sortField: "name",
|
|
197
|
-
sortOrder: "ascending"
|
|
198
|
-
};
|
|
199
|
-
const q = query.trim();
|
|
200
|
-
if (q) {
|
|
201
|
-
params.field = "name";
|
|
202
|
-
params.value = q;
|
|
203
|
-
}
|
|
204
|
-
return await read(call, "get-organizations", params) ?? [];
|
|
205
|
-
},
|
|
206
|
-
/** One organization by name. */
|
|
207
|
-
async organization(call, name) {
|
|
208
|
-
return await read(call, "get-organization", { id: `admin/${name}` }) ?? null;
|
|
209
|
-
},
|
|
210
|
-
/** Members of an organization. */
|
|
211
|
-
async users(call, org) {
|
|
212
|
-
return await read(call, "get-users", { owner: org }) ?? [];
|
|
213
|
-
},
|
|
214
|
-
/** The organization's projects — IAM keys this read by `organization`. */
|
|
215
|
-
async projects(call, org) {
|
|
216
|
-
return await read(call, "get-organization-projects", { organization: org }) ?? [];
|
|
217
|
-
}
|
|
218
|
-
};
|
|
219
|
-
new QueryClient({
|
|
220
|
-
defaultOptions: { queries: { refetchOnWindowFocus: false, retry: 1, staleTime: 3e4 } }
|
|
221
|
-
});
|
|
222
|
-
var WhiteLabelContext = React2__default.createContext(resolveWhiteLabel(""));
|
|
223
|
-
var useWhiteLabel = () => React2__default.useContext(WhiteLabelContext);
|
|
224
|
-
var IAM_TOKEN_KEY = "hanzo_iam_access_token";
|
|
225
|
-
function storedToken() {
|
|
226
|
-
if (typeof window === "undefined") return null;
|
|
227
|
-
for (const store of [window.sessionStorage, window.localStorage]) {
|
|
228
|
-
try {
|
|
229
|
-
const t = store.getItem(IAM_TOKEN_KEY);
|
|
230
|
-
if (t) return t;
|
|
231
|
-
} catch {
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
return null;
|
|
235
|
-
}
|
|
236
|
-
function clearStoredTokens() {
|
|
237
|
-
if (typeof window === "undefined") return;
|
|
238
|
-
for (const store of [window.sessionStorage, window.localStorage]) {
|
|
239
|
-
try {
|
|
240
|
-
for (const k of ["access_token", "refresh_token", "id_token", "expires_at"]) {
|
|
241
|
-
store.removeItem(`hanzo_iam_${k}`);
|
|
242
|
-
}
|
|
243
|
-
} catch {
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
var defaultAuth = {};
|
|
248
|
-
var scopeKey = (host, kind) => `lux-ui:${kind}:${host}`;
|
|
249
|
-
function readScope(host, kind) {
|
|
250
|
-
if (typeof window === "undefined") return null;
|
|
251
|
-
try {
|
|
252
|
-
return window.localStorage.getItem(scopeKey(host, kind));
|
|
253
|
-
} catch {
|
|
254
|
-
return null;
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
function writeScope(host, kind, value) {
|
|
258
|
-
if (typeof window === "undefined") return;
|
|
259
|
-
try {
|
|
260
|
-
window.localStorage.setItem(scopeKey(host, kind), value);
|
|
261
|
-
} catch {
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
var IdentityContext = React2.createContext(null);
|
|
265
|
-
var IdentityProvider = ({
|
|
266
|
-
children,
|
|
267
|
-
auth = defaultAuth,
|
|
268
|
-
loginPath = "/login"
|
|
269
|
-
}) => {
|
|
270
|
-
const whiteLabel = useWhiteLabel();
|
|
271
|
-
const base = React2.useMemo(() => iamBase(whiteLabel), [whiteLabel]);
|
|
272
|
-
const [status, setStatus] = React2.useState("loading");
|
|
273
|
-
const [account, setAccount] = React2.useState(null);
|
|
274
|
-
const [orgs, setOrgs] = React2.useState([]);
|
|
275
|
-
const [projects, setProjects] = React2.useState([]);
|
|
276
|
-
const [error, setError] = React2.useState(null);
|
|
277
|
-
const [orgName, setOrgName] = React2.useState(null);
|
|
278
|
-
const [projectName, setProjectName] = React2.useState(null);
|
|
279
|
-
const [epoch, setEpoch] = React2.useState(0);
|
|
280
|
-
React2.useEffect(() => {
|
|
281
|
-
const ac = new AbortController();
|
|
282
|
-
let live = true;
|
|
283
|
-
void (async () => {
|
|
284
|
-
const token = await (auth.token ?? storedToken)();
|
|
285
|
-
if (!live) return;
|
|
286
|
-
if (!token) {
|
|
287
|
-
setStatus("anonymous");
|
|
288
|
-
setAccount(null);
|
|
289
|
-
setOrgs([]);
|
|
290
|
-
return;
|
|
291
|
-
}
|
|
292
|
-
const call = { base, token, signal: ac.signal };
|
|
293
|
-
try {
|
|
294
|
-
const me = await iam.account(call);
|
|
295
|
-
if (!live) return;
|
|
296
|
-
if (!me) {
|
|
297
|
-
setStatus("anonymous");
|
|
298
|
-
setAccount(null);
|
|
299
|
-
setOrgs([]);
|
|
300
|
-
return;
|
|
301
|
-
}
|
|
302
|
-
setAccount(me);
|
|
303
|
-
const rows = await iam.organizations(call).catch((e) => {
|
|
304
|
-
if (e instanceof IamError && !e.unauthenticated) return [{ owner: "admin", name: me.owner }];
|
|
305
|
-
throw e;
|
|
306
|
-
});
|
|
307
|
-
if (!live) return;
|
|
308
|
-
setOrgs(rows);
|
|
309
|
-
setStatus("ready");
|
|
310
|
-
setError(null);
|
|
311
|
-
} catch (e) {
|
|
312
|
-
if (!live || ac.signal.aborted) return;
|
|
313
|
-
if (e instanceof IamError && e.unauthenticated) {
|
|
314
|
-
setStatus("anonymous");
|
|
315
|
-
setAccount(null);
|
|
316
|
-
setOrgs([]);
|
|
317
|
-
return;
|
|
318
|
-
}
|
|
319
|
-
setStatus("error");
|
|
320
|
-
setError(e instanceof Error ? e.message : "Could not reach IAM.");
|
|
321
|
-
}
|
|
322
|
-
})();
|
|
323
|
-
return () => {
|
|
324
|
-
live = false;
|
|
325
|
-
ac.abort();
|
|
326
|
-
};
|
|
327
|
-
}, [base, auth, epoch]);
|
|
328
|
-
const org = React2.useMemo(() => {
|
|
329
|
-
if (orgs.length === 0) return null;
|
|
330
|
-
const saved = orgName ?? readScope(whiteLabel.host, "org");
|
|
331
|
-
return orgs.find((o) => o.name === saved) ?? orgs.find((o) => o.name === account?.owner) ?? orgs[0];
|
|
332
|
-
}, [orgs, orgName, account, whiteLabel.host]);
|
|
333
|
-
React2.useEffect(() => {
|
|
334
|
-
if (!org) {
|
|
335
|
-
setProjects([]);
|
|
336
|
-
return;
|
|
337
|
-
}
|
|
338
|
-
const ac = new AbortController();
|
|
339
|
-
let live = true;
|
|
340
|
-
void (async () => {
|
|
341
|
-
const token = await (auth.token ?? storedToken)();
|
|
342
|
-
if (!live || !token) return;
|
|
343
|
-
const rows = await iam.projects({ base, token, signal: ac.signal }, org.name).catch(() => []);
|
|
344
|
-
if (live) setProjects(rows);
|
|
345
|
-
})();
|
|
346
|
-
return () => {
|
|
347
|
-
live = false;
|
|
348
|
-
ac.abort();
|
|
349
|
-
};
|
|
350
|
-
}, [base, auth, org, epoch]);
|
|
351
|
-
const project = React2.useMemo(() => {
|
|
352
|
-
if (projects.length === 0) return null;
|
|
353
|
-
const saved = projectName ?? readScope(whiteLabel.host, "project");
|
|
354
|
-
return projects.find((p) => p.name === saved) ?? projects.find((p) => p.isDefault) ?? projects[0];
|
|
355
|
-
}, [projects, projectName, whiteLabel.host]);
|
|
356
|
-
const value = React2.useMemo(() => ({
|
|
357
|
-
status,
|
|
358
|
-
account,
|
|
359
|
-
orgs,
|
|
360
|
-
org,
|
|
361
|
-
projects,
|
|
362
|
-
project,
|
|
363
|
-
error,
|
|
364
|
-
whiteLabel,
|
|
365
|
-
setOrg: (name) => {
|
|
366
|
-
writeScope(whiteLabel.host, "org", name);
|
|
367
|
-
setOrgName(name);
|
|
368
|
-
setProjectName(null);
|
|
369
|
-
},
|
|
370
|
-
setProject: (name) => {
|
|
371
|
-
writeScope(whiteLabel.host, "project", name);
|
|
372
|
-
setProjectName(name);
|
|
373
|
-
},
|
|
374
|
-
signIn: () => {
|
|
375
|
-
if (auth.signIn) return auth.signIn();
|
|
376
|
-
if (typeof window !== "undefined") window.location.assign(loginPath);
|
|
377
|
-
},
|
|
378
|
-
signOut: () => {
|
|
379
|
-
if (auth.signOut) return auth.signOut();
|
|
380
|
-
clearStoredTokens();
|
|
381
|
-
if (typeof window !== "undefined") window.location.assign(loginPath);
|
|
382
|
-
},
|
|
383
|
-
reload: () => setEpoch((n) => n + 1)
|
|
384
|
-
}), [status, account, orgs, org, projects, project, error, whiteLabel, auth, loginPath]);
|
|
385
|
-
return /* @__PURE__ */ jsx(IdentityContext.Provider, { value, children });
|
|
386
|
-
};
|
|
387
9
|
var CALLBACK_PATH = "/auth/callback";
|
|
388
10
|
function configureAuth(wl) {
|
|
389
11
|
if (typeof window === "undefined") return;
|
|
@@ -399,7 +21,7 @@ function configureAuth(wl) {
|
|
|
399
21
|
function useAuth(defaultRedirect = "/") {
|
|
400
22
|
const whiteLabel = useWhiteLabel();
|
|
401
23
|
configureAuth(whiteLabel);
|
|
402
|
-
return
|
|
24
|
+
return React.useMemo(() => ({
|
|
403
25
|
signIn: (redirect = defaultRedirect) => void startLogin({ redirect }),
|
|
404
26
|
signOut: () => void logout(),
|
|
405
27
|
complete: () => handleCallback(),
|
|
@@ -408,7 +30,7 @@ function useAuth(defaultRedirect = "/") {
|
|
|
408
30
|
}
|
|
409
31
|
var AuthProvider = ({ children, redirect = "/", onSignOut }) => {
|
|
410
32
|
const auth = useAuth(redirect);
|
|
411
|
-
const identityAuth =
|
|
33
|
+
const identityAuth = React.useMemo(() => ({
|
|
412
34
|
signIn: () => auth.signIn(redirect),
|
|
413
35
|
signOut: () => {
|
|
414
36
|
onSignOut?.();
|
|
@@ -424,8 +46,8 @@ var AuthCallback = ({
|
|
|
424
46
|
retryPath = "/login"
|
|
425
47
|
}) => {
|
|
426
48
|
const auth = useAuth();
|
|
427
|
-
const [error, setError] =
|
|
428
|
-
|
|
49
|
+
const [error, setError] = React.useState(null);
|
|
50
|
+
React.useEffect(() => {
|
|
429
51
|
let live = true;
|
|
430
52
|
void (async () => {
|
|
431
53
|
try {
|
package/dist/avatar.cjs
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
var gui = require('@hanzo/gui');
|
|
5
5
|
var React = require('react');
|
|
6
|
+
var ink_js = require('./ink.js');
|
|
6
7
|
var jsxRuntime = require('react/jsx-runtime');
|
|
7
8
|
|
|
8
9
|
function _interopNamespace(e) {
|
|
@@ -25,14 +26,6 @@ function _interopNamespace(e) {
|
|
|
25
26
|
|
|
26
27
|
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
27
28
|
|
|
28
|
-
var ink = (children, Wrap = gui.Text, props = {}) => {
|
|
29
|
-
let hasText = false;
|
|
30
|
-
React.Children.forEach(children, (child) => {
|
|
31
|
-
if (typeof child === "string" || typeof child === "number") hasText = true;
|
|
32
|
-
});
|
|
33
|
-
if (!hasText) return children;
|
|
34
|
-
return React.Children.map(children, (child) => typeof child === "string" || typeof child === "number" ? React.createElement(Wrap, props, child) : child);
|
|
35
|
-
};
|
|
36
29
|
var SIZE = {
|
|
37
30
|
xs: { width: 24, height: 24, fontSize: 10 },
|
|
38
31
|
sm: { width: 32, height: 32, fontSize: 12 },
|
|
@@ -126,7 +119,7 @@ var AvatarFallback = React__namespace.forwardRef(
|
|
|
126
119
|
alignItems: "center",
|
|
127
120
|
justifyContent: "center",
|
|
128
121
|
...rest,
|
|
129
|
-
children: ink(children ?? (name != null ? getInitials(name) : icon), void 0, { fontWeight: "500" })
|
|
122
|
+
children: ink_js.ink(children ?? (name != null ? getInitials(name) : icon), void 0, { fontWeight: "500" })
|
|
130
123
|
}
|
|
131
124
|
);
|
|
132
125
|
}
|
package/dist/avatar.js
CHANGED
|
@@ -1,17 +1,9 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { Avatar as Avatar$1,
|
|
2
|
+
import { Avatar as Avatar$1, XStack } from '@hanzo/gui';
|
|
3
3
|
import * as React from 'react';
|
|
4
|
-
import {
|
|
4
|
+
import { ink } from './ink.js';
|
|
5
5
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
6
6
|
|
|
7
|
-
var ink = (children, Wrap = Text, props = {}) => {
|
|
8
|
-
let hasText = false;
|
|
9
|
-
Children.forEach(children, (child) => {
|
|
10
|
-
if (typeof child === "string" || typeof child === "number") hasText = true;
|
|
11
|
-
});
|
|
12
|
-
if (!hasText) return children;
|
|
13
|
-
return Children.map(children, (child) => typeof child === "string" || typeof child === "number" ? createElement(Wrap, props, child) : child);
|
|
14
|
-
};
|
|
15
7
|
var SIZE = {
|
|
16
8
|
xs: { width: 24, height: 24, fontSize: 10 },
|
|
17
9
|
sm: { width: 32, height: 32, fontSize: 12 },
|