@luxfi/ui 8.2.7 → 8.2.9
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 +2 -31
- package/dist/site/components/header/mobile-nav-menu-ai.js +1 -26
- 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 +25 -330
- package/dist/site/components/header/mobile.js +20 -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/company.d.ts +3 -3
- 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/icon-button.cjs
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
var gui = require('@hanzo/gui');
|
|
4
4
|
var React = require('react');
|
|
5
|
-
var
|
|
5
|
+
var skeleton_cjs = require('./skeleton.cjs');
|
|
6
6
|
var jsxRuntime = require('react/jsx-runtime');
|
|
7
7
|
|
|
8
8
|
function _interopNamespace(e) {
|
|
@@ -26,60 +26,6 @@ function _interopNamespace(e) {
|
|
|
26
26
|
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
27
27
|
|
|
28
28
|
// src/icon-button.tsx
|
|
29
|
-
var SKELETON_CLASSES = "lux-skeleton rounded-sm";
|
|
30
|
-
var Skeleton = React__namespace.forwardRef(
|
|
31
|
-
function Skeleton2(props, ref) {
|
|
32
|
-
const { loading = true, asChild, className, children, style, ...rest } = props;
|
|
33
|
-
if (!loading) {
|
|
34
|
-
if (asChild && React__namespace.isValidElement(children)) return children;
|
|
35
|
-
return /* @__PURE__ */ jsxRuntime.jsx(ui.Box, { ref, className, style, ...rest, children });
|
|
36
|
-
}
|
|
37
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
38
|
-
"div",
|
|
39
|
-
{
|
|
40
|
-
ref,
|
|
41
|
-
"data-loading": true,
|
|
42
|
-
...ui.sx(
|
|
43
|
-
SKELETON_CLASSES,
|
|
44
|
-
asChild || children ? "[&_*]:invisible" : "min-h-5",
|
|
45
|
-
className
|
|
46
|
-
),
|
|
47
|
-
style,
|
|
48
|
-
...rest,
|
|
49
|
-
children
|
|
50
|
-
}
|
|
51
|
-
);
|
|
52
|
-
}
|
|
53
|
-
);
|
|
54
|
-
React__namespace.forwardRef(
|
|
55
|
-
function SkeletonCircle2(props, ref) {
|
|
56
|
-
const { size = 40, loading = true, className, ...rest } = props;
|
|
57
|
-
const dimension = typeof size === "number" ? `${size}px` : size;
|
|
58
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
59
|
-
Skeleton,
|
|
60
|
-
{
|
|
61
|
-
ref,
|
|
62
|
-
loading,
|
|
63
|
-
...ui.sx("rounded-full shrink-0", className),
|
|
64
|
-
style: { width: dimension, height: dimension, ...rest.style },
|
|
65
|
-
...rest
|
|
66
|
-
}
|
|
67
|
-
);
|
|
68
|
-
}
|
|
69
|
-
);
|
|
70
|
-
React__namespace.forwardRef(
|
|
71
|
-
function SkeletonText2(props, ref) {
|
|
72
|
-
const { noOfLines = 3, loading = true, className, ...rest } = props;
|
|
73
|
-
return /* @__PURE__ */ jsxRuntime.jsx(ui.Box, { ref, className: ui.cn("flex w-full flex-col gap-2", className), ...rest, children: Array.from({ length: noOfLines }).map((_, index) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
74
|
-
Skeleton,
|
|
75
|
-
{
|
|
76
|
-
loading,
|
|
77
|
-
...ui.sx(ui.cn("h-4", index === noOfLines - 1 && "max-w-[80%]"))
|
|
78
|
-
},
|
|
79
|
-
index
|
|
80
|
-
)) });
|
|
81
|
-
}
|
|
82
|
-
);
|
|
83
29
|
var IconButtonFrame = gui.styled(gui.View, {
|
|
84
30
|
name: "LuxIconButton",
|
|
85
31
|
render: /* @__PURE__ */ jsxRuntime.jsx("button", { type: "button" }),
|
|
@@ -220,7 +166,7 @@ var IconButton = React__namespace.forwardRef(
|
|
|
220
166
|
}
|
|
221
167
|
);
|
|
222
168
|
if (loadingSkeleton) {
|
|
223
|
-
return /* @__PURE__ */ jsxRuntime.jsx(Skeleton, { loading: loadingSkeleton, asChild: true, ref, children: button });
|
|
169
|
+
return /* @__PURE__ */ jsxRuntime.jsx(skeleton_cjs.Skeleton, { loading: loadingSkeleton, asChild: true, ref, children: button });
|
|
224
170
|
}
|
|
225
171
|
return button;
|
|
226
172
|
}
|
package/dist/icon-button.js
CHANGED
|
@@ -1,63 +1,9 @@
|
|
|
1
1
|
import { styled, View } from '@hanzo/gui';
|
|
2
2
|
import * as React from 'react';
|
|
3
|
-
import {
|
|
3
|
+
import { Skeleton } from './skeleton.js';
|
|
4
4
|
import { jsx } from 'react/jsx-runtime';
|
|
5
5
|
|
|
6
6
|
// src/icon-button.tsx
|
|
7
|
-
var SKELETON_CLASSES = "lux-skeleton rounded-sm";
|
|
8
|
-
var Skeleton = React.forwardRef(
|
|
9
|
-
function Skeleton2(props, ref) {
|
|
10
|
-
const { loading = true, asChild, className, children, style, ...rest } = props;
|
|
11
|
-
if (!loading) {
|
|
12
|
-
if (asChild && React.isValidElement(children)) return children;
|
|
13
|
-
return /* @__PURE__ */ jsx(Box, { ref, className, style, ...rest, children });
|
|
14
|
-
}
|
|
15
|
-
return /* @__PURE__ */ jsx(
|
|
16
|
-
"div",
|
|
17
|
-
{
|
|
18
|
-
ref,
|
|
19
|
-
"data-loading": true,
|
|
20
|
-
...sx(
|
|
21
|
-
SKELETON_CLASSES,
|
|
22
|
-
asChild || children ? "[&_*]:invisible" : "min-h-5",
|
|
23
|
-
className
|
|
24
|
-
),
|
|
25
|
-
style,
|
|
26
|
-
...rest,
|
|
27
|
-
children
|
|
28
|
-
}
|
|
29
|
-
);
|
|
30
|
-
}
|
|
31
|
-
);
|
|
32
|
-
React.forwardRef(
|
|
33
|
-
function SkeletonCircle2(props, ref) {
|
|
34
|
-
const { size = 40, loading = true, className, ...rest } = props;
|
|
35
|
-
const dimension = typeof size === "number" ? `${size}px` : size;
|
|
36
|
-
return /* @__PURE__ */ jsx(
|
|
37
|
-
Skeleton,
|
|
38
|
-
{
|
|
39
|
-
ref,
|
|
40
|
-
loading,
|
|
41
|
-
...sx("rounded-full shrink-0", className),
|
|
42
|
-
style: { width: dimension, height: dimension, ...rest.style },
|
|
43
|
-
...rest
|
|
44
|
-
}
|
|
45
|
-
);
|
|
46
|
-
}
|
|
47
|
-
);
|
|
48
|
-
React.forwardRef(
|
|
49
|
-
function SkeletonText2(props, ref) {
|
|
50
|
-
const { noOfLines = 3, loading = true, className, ...rest } = props;
|
|
51
|
-
return /* @__PURE__ */ jsx(Box, { ref, className: cn("flex w-full flex-col gap-2", className), ...rest, children: Array.from({ length: noOfLines }).map((_, index) => /* @__PURE__ */ jsx(
|
|
52
|
-
Skeleton,
|
|
53
|
-
{
|
|
54
|
-
loading,
|
|
55
|
-
...sx(cn("h-4", index === noOfLines - 1 && "max-w-[80%]"))
|
|
56
|
-
},
|
|
57
|
-
index
|
|
58
|
-
)) });
|
|
59
|
-
}
|
|
60
|
-
);
|
|
61
7
|
var IconButtonFrame = styled(View, {
|
|
62
8
|
name: "LuxIconButton",
|
|
63
9
|
render: /* @__PURE__ */ jsx("button", { type: "button" }),
|
package/dist/identity.cjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
5
|
-
require('
|
|
6
|
-
var
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var iam_cjs = require('./iam.cjs');
|
|
6
|
+
var provider_cjs = require('./provider.cjs');
|
|
7
7
|
var jsxRuntime = require('react/jsx-runtime');
|
|
8
8
|
|
|
9
9
|
function _interopNamespace(e) {
|
|
@@ -24,222 +24,8 @@ function _interopNamespace(e) {
|
|
|
24
24
|
return Object.freeze(n);
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
var
|
|
27
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
28
28
|
|
|
29
|
-
// src/white-label.ts
|
|
30
|
-
var LUX_BRAND = {
|
|
31
|
-
lux: "#7000FF",
|
|
32
|
-
zoo: "#6C5EFB",
|
|
33
|
-
hanzo: "#EA580C",
|
|
34
|
-
pars: "#1C3879"};
|
|
35
|
-
var PARS_GOLD = "#C8A45C";
|
|
36
|
-
var ORGS = {
|
|
37
|
-
lux: {
|
|
38
|
-
org: "lux",
|
|
39
|
-
name: "Lux",
|
|
40
|
-
domain: "lux.network",
|
|
41
|
-
iamDomain: "lux.id",
|
|
42
|
-
accent: LUX_BRAND.lux,
|
|
43
|
-
accentForeground: "#FFFFFF"
|
|
44
|
-
},
|
|
45
|
-
zoo: {
|
|
46
|
-
org: "zoo",
|
|
47
|
-
name: "Zoo",
|
|
48
|
-
domain: "zoo.ngo",
|
|
49
|
-
// Zoo's issuer is `zoolabs.id` — the one row where it is not `<org>.id`,
|
|
50
|
-
// and the one every hand-rolled branding map gets wrong. `id.zoo.network`
|
|
51
|
-
// ANSWERS, which is why it keeps being copied around, but it is an alias:
|
|
52
|
-
// its own discovery document advertises
|
|
53
|
-
// issuer https://zoolabs.id
|
|
54
|
-
// authorization_endpoint https://zoolabs.id/v1/iam/oauth/authorize
|
|
55
|
-
// jwks_uri https://zoolabs.id/v1/iam/.well-known/jwks
|
|
56
|
-
// so a client configured on the alias validates `iss` against a string the
|
|
57
|
-
// IdP never emits and rejects every token it is given — the exact shape of
|
|
58
|
-
// the lux.id outage. `zoo.id` is not an IdP at all (no discovery document).
|
|
59
|
-
iamDomain: "zoolabs.id",
|
|
60
|
-
accent: LUX_BRAND.zoo,
|
|
61
|
-
accentForeground: "#FFFFFF"
|
|
62
|
-
},
|
|
63
|
-
bootnode: {
|
|
64
|
-
org: "bootnode",
|
|
65
|
-
name: "Bootnode",
|
|
66
|
-
domain: "bootno.de",
|
|
67
|
-
iamDomain: "id.bootno.de",
|
|
68
|
-
accent: LUX_BRAND.lux,
|
|
69
|
-
accentForeground: "#FFFFFF"
|
|
70
|
-
},
|
|
71
|
-
hanzo: {
|
|
72
|
-
org: "hanzo",
|
|
73
|
-
name: "Hanzo",
|
|
74
|
-
domain: "hanzo.ai",
|
|
75
|
-
iamDomain: "hanzo.id",
|
|
76
|
-
accent: LUX_BRAND.hanzo,
|
|
77
|
-
accentForeground: "#FFFFFF"
|
|
78
|
-
},
|
|
79
|
-
pars: {
|
|
80
|
-
org: "pars",
|
|
81
|
-
name: "Pars",
|
|
82
|
-
domain: "pars.id",
|
|
83
|
-
iamDomain: "pars.id",
|
|
84
|
-
accent: LUX_BRAND.pars,
|
|
85
|
-
accentForeground: PARS_GOLD
|
|
86
|
-
}
|
|
87
|
-
};
|
|
88
|
-
var DOMAIN_ORG = [
|
|
89
|
-
["lux.network", "lux"],
|
|
90
|
-
["lux.cloud", "lux"],
|
|
91
|
-
["lux.id", "lux"],
|
|
92
|
-
["lux.finance", "lux"],
|
|
93
|
-
["lux.market", "lux"],
|
|
94
|
-
["lux.exchange", "lux"],
|
|
95
|
-
["zoo.ngo", "zoo"],
|
|
96
|
-
["zoo.network", "zoo"],
|
|
97
|
-
["zoo.cloud", "zoo"],
|
|
98
|
-
["zoolabs.id", "zoo"],
|
|
99
|
-
["hanzo.ai", "hanzo"],
|
|
100
|
-
["hanzo.cloud", "hanzo"],
|
|
101
|
-
["hanzo.id", "hanzo"],
|
|
102
|
-
["pars.id", "pars", "app"],
|
|
103
|
-
["pars.network", "pars", "app"],
|
|
104
|
-
["parsdao.org", "pars", "app"],
|
|
105
|
-
["bootno.de", "bootnode", "platform"]
|
|
106
|
-
];
|
|
107
|
-
var DEFAULT_ORG = "lux";
|
|
108
|
-
function normalizeHost(host) {
|
|
109
|
-
const noPort = host.trim().toLowerCase().split(":")[0] ?? "";
|
|
110
|
-
return noPort.replace(/\.$/, "");
|
|
111
|
-
}
|
|
112
|
-
function isUnder(host, domain) {
|
|
113
|
-
return host === domain || host.endsWith(`.${domain}`);
|
|
114
|
-
}
|
|
115
|
-
function matchDomain(host) {
|
|
116
|
-
let best;
|
|
117
|
-
for (const entry of DOMAIN_ORG) {
|
|
118
|
-
if (isUnder(host, entry[0]) && (!best || entry[0].length > best[0].length)) {
|
|
119
|
-
best = entry;
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
return best;
|
|
123
|
-
}
|
|
124
|
-
function appSlug(host, domain, pinned) {
|
|
125
|
-
if (pinned) return pinned;
|
|
126
|
-
const sub = host === domain ? "" : host.slice(0, -(domain.length + 1));
|
|
127
|
-
const leftmost = sub.split(".")[0] ?? "";
|
|
128
|
-
if (leftmost && leftmost !== "www") return leftmost;
|
|
129
|
-
const label = domain.split(".")[0] ?? "";
|
|
130
|
-
const tld = domain.split(".").slice(1).join(".");
|
|
131
|
-
return tld.split(".")[0] || label;
|
|
132
|
-
}
|
|
133
|
-
function isLocal(host) {
|
|
134
|
-
return host === "localhost" || host.endsWith(".localhost") || host === "127.0.0.1" || host === "0.0.0.0" || host === "[::1]" || host.endsWith(".local");
|
|
135
|
-
}
|
|
136
|
-
function resolveWhiteLabel(host) {
|
|
137
|
-
const h = normalizeHost(host ?? "");
|
|
138
|
-
const match = h ? matchDomain(h) : void 0;
|
|
139
|
-
const org = match ? match[1] : DEFAULT_ORG;
|
|
140
|
-
const identity = ORGS[org];
|
|
141
|
-
const app = match ? appSlug(h, match[0], match[2]) : h && isLocal(h) ? "local" : "app";
|
|
142
|
-
return {
|
|
143
|
-
...identity,
|
|
144
|
-
host: h,
|
|
145
|
-
app,
|
|
146
|
-
theme: `dark_${org}`,
|
|
147
|
-
issuer: `https://${identity.iamDomain}`,
|
|
148
|
-
clientId: `${org}-${app}`
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
// src/iam.ts
|
|
153
|
-
var IamError = class extends Error {
|
|
154
|
-
constructor(message, status, unauthenticated) {
|
|
155
|
-
super(message);
|
|
156
|
-
this.name = "IamError";
|
|
157
|
-
this.status = status;
|
|
158
|
-
this.unauthenticated = unauthenticated;
|
|
159
|
-
}
|
|
160
|
-
};
|
|
161
|
-
var SIGNED_OUT = /please sign in|authentication required|unauthorized/i;
|
|
162
|
-
function isSignedOut(status, msg) {
|
|
163
|
-
return status === 401 || SIGNED_OUT.test(msg);
|
|
164
|
-
}
|
|
165
|
-
function iamBase(host) {
|
|
166
|
-
const wl = typeof host === "object" && host !== null ? host : resolveWhiteLabel(host);
|
|
167
|
-
return `${wl.issuer}/v1/iam`;
|
|
168
|
-
}
|
|
169
|
-
async function read(call, verb, params) {
|
|
170
|
-
const url = new URL(`${call.base}/${verb}`);
|
|
171
|
-
for (const [k, v] of Object.entries(params)) url.searchParams.set(k, String(v));
|
|
172
|
-
let res;
|
|
173
|
-
try {
|
|
174
|
-
res = await fetch(url.toString(), {
|
|
175
|
-
method: "GET",
|
|
176
|
-
// The bearer is the whole credential. IAM does not allow credentialed
|
|
177
|
-
// CORS, so sending cookies would only get the response blocked.
|
|
178
|
-
headers: call.token ? { Authorization: `Bearer ${call.token}` } : {},
|
|
179
|
-
signal: call.signal
|
|
180
|
-
});
|
|
181
|
-
} catch (e) {
|
|
182
|
-
throw new IamError(e instanceof Error ? e.message : "IAM unreachable", 0, false);
|
|
183
|
-
}
|
|
184
|
-
const body = await res.json().catch(() => ({}));
|
|
185
|
-
const msg = typeof body.msg === "string" ? body.msg : "";
|
|
186
|
-
if (!res.ok || body.status === "error") {
|
|
187
|
-
throw new IamError(msg || `IAM ${verb} failed (${res.status})`, res.status, isSignedOut(res.status, msg));
|
|
188
|
-
}
|
|
189
|
-
return body.data;
|
|
190
|
-
}
|
|
191
|
-
var IAM_PAGE_SIZE = 20;
|
|
192
|
-
var iam = {
|
|
193
|
-
/** The signed-in principal, or null when there is no session. */
|
|
194
|
-
async account(call) {
|
|
195
|
-
try {
|
|
196
|
-
const data = await read(call, "get-account", {});
|
|
197
|
-
return data && data.name ? data : null;
|
|
198
|
-
} catch (e) {
|
|
199
|
-
if (e instanceof IamError && e.unauthenticated) return null;
|
|
200
|
-
throw e;
|
|
201
|
-
}
|
|
202
|
-
},
|
|
203
|
-
/**
|
|
204
|
-
* One page of the orgs the principal can see. IAM scopes the read to the
|
|
205
|
-
* caller's authority, so a normal member gets their own org and a super
|
|
206
|
-
* admin gets the tenant list — the page never has to decide.
|
|
207
|
-
*/
|
|
208
|
-
async organizations(call, page = 0, query = "", pageSize = IAM_PAGE_SIZE) {
|
|
209
|
-
const params = {
|
|
210
|
-
owner: "admin",
|
|
211
|
-
// IAM orgs live under the reserved `admin` owner
|
|
212
|
-
p: page + 1,
|
|
213
|
-
// the backend page is 1-based
|
|
214
|
-
pageSize,
|
|
215
|
-
sortField: "name",
|
|
216
|
-
sortOrder: "ascending"
|
|
217
|
-
};
|
|
218
|
-
const q = query.trim();
|
|
219
|
-
if (q) {
|
|
220
|
-
params.field = "name";
|
|
221
|
-
params.value = q;
|
|
222
|
-
}
|
|
223
|
-
return await read(call, "get-organizations", params) ?? [];
|
|
224
|
-
},
|
|
225
|
-
/** One organization by name. */
|
|
226
|
-
async organization(call, name) {
|
|
227
|
-
return await read(call, "get-organization", { id: `admin/${name}` }) ?? null;
|
|
228
|
-
},
|
|
229
|
-
/** Members of an organization. */
|
|
230
|
-
async users(call, org) {
|
|
231
|
-
return await read(call, "get-users", { owner: org }) ?? [];
|
|
232
|
-
},
|
|
233
|
-
/** The organization's projects — IAM keys this read by `organization`. */
|
|
234
|
-
async projects(call, org) {
|
|
235
|
-
return await read(call, "get-organization-projects", { organization: org }) ?? [];
|
|
236
|
-
}
|
|
237
|
-
};
|
|
238
|
-
new reactQuery.QueryClient({
|
|
239
|
-
defaultOptions: { queries: { refetchOnWindowFocus: false, retry: 1, staleTime: 3e4 } }
|
|
240
|
-
});
|
|
241
|
-
var WhiteLabelContext = React2__namespace.default.createContext(resolveWhiteLabel(""));
|
|
242
|
-
var useWhiteLabel = () => React2__namespace.default.useContext(WhiteLabelContext);
|
|
243
29
|
var IAM_TOKEN_KEY = "hanzo_iam_access_token";
|
|
244
30
|
function storedToken() {
|
|
245
31
|
if (typeof window === "undefined") return null;
|
|
@@ -280,23 +66,23 @@ function writeScope(host, kind, value) {
|
|
|
280
66
|
} catch {
|
|
281
67
|
}
|
|
282
68
|
}
|
|
283
|
-
var IdentityContext =
|
|
69
|
+
var IdentityContext = React__namespace.createContext(null);
|
|
284
70
|
var IdentityProvider = ({
|
|
285
71
|
children,
|
|
286
72
|
auth = defaultAuth,
|
|
287
73
|
loginPath = "/login"
|
|
288
74
|
}) => {
|
|
289
|
-
const whiteLabel = useWhiteLabel();
|
|
290
|
-
const base =
|
|
291
|
-
const [status, setStatus] =
|
|
292
|
-
const [account, setAccount] =
|
|
293
|
-
const [orgs, setOrgs] =
|
|
294
|
-
const [projects, setProjects] =
|
|
295
|
-
const [error, setError] =
|
|
296
|
-
const [orgName, setOrgName] =
|
|
297
|
-
const [projectName, setProjectName] =
|
|
298
|
-
const [epoch, setEpoch] =
|
|
299
|
-
|
|
75
|
+
const whiteLabel = provider_cjs.useWhiteLabel();
|
|
76
|
+
const base = React__namespace.useMemo(() => iam_cjs.iamBase(whiteLabel), [whiteLabel]);
|
|
77
|
+
const [status, setStatus] = React__namespace.useState("loading");
|
|
78
|
+
const [account, setAccount] = React__namespace.useState(null);
|
|
79
|
+
const [orgs, setOrgs] = React__namespace.useState([]);
|
|
80
|
+
const [projects, setProjects] = React__namespace.useState([]);
|
|
81
|
+
const [error, setError] = React__namespace.useState(null);
|
|
82
|
+
const [orgName, setOrgName] = React__namespace.useState(null);
|
|
83
|
+
const [projectName, setProjectName] = React__namespace.useState(null);
|
|
84
|
+
const [epoch, setEpoch] = React__namespace.useState(0);
|
|
85
|
+
React__namespace.useEffect(() => {
|
|
300
86
|
const ac = new AbortController();
|
|
301
87
|
let live = true;
|
|
302
88
|
void (async () => {
|
|
@@ -310,7 +96,7 @@ var IdentityProvider = ({
|
|
|
310
96
|
}
|
|
311
97
|
const call = { base, token, signal: ac.signal };
|
|
312
98
|
try {
|
|
313
|
-
const me = await iam.account(call);
|
|
99
|
+
const me = await iam_cjs.iam.account(call);
|
|
314
100
|
if (!live) return;
|
|
315
101
|
if (!me) {
|
|
316
102
|
setStatus("anonymous");
|
|
@@ -319,8 +105,8 @@ var IdentityProvider = ({
|
|
|
319
105
|
return;
|
|
320
106
|
}
|
|
321
107
|
setAccount(me);
|
|
322
|
-
const rows = await iam.organizations(call).catch((e) => {
|
|
323
|
-
if (e instanceof IamError && !e.unauthenticated) return [{ owner: "admin", name: me.owner }];
|
|
108
|
+
const rows = await iam_cjs.iam.organizations(call).catch((e) => {
|
|
109
|
+
if (e instanceof iam_cjs.IamError && !e.unauthenticated) return [{ owner: "admin", name: me.owner }];
|
|
324
110
|
throw e;
|
|
325
111
|
});
|
|
326
112
|
if (!live) return;
|
|
@@ -329,7 +115,7 @@ var IdentityProvider = ({
|
|
|
329
115
|
setError(null);
|
|
330
116
|
} catch (e) {
|
|
331
117
|
if (!live || ac.signal.aborted) return;
|
|
332
|
-
if (e instanceof IamError && e.unauthenticated) {
|
|
118
|
+
if (e instanceof iam_cjs.IamError && e.unauthenticated) {
|
|
333
119
|
setStatus("anonymous");
|
|
334
120
|
setAccount(null);
|
|
335
121
|
setOrgs([]);
|
|
@@ -344,12 +130,12 @@ var IdentityProvider = ({
|
|
|
344
130
|
ac.abort();
|
|
345
131
|
};
|
|
346
132
|
}, [base, auth, epoch]);
|
|
347
|
-
const org =
|
|
133
|
+
const org = React__namespace.useMemo(() => {
|
|
348
134
|
if (orgs.length === 0) return null;
|
|
349
135
|
const saved = orgName ?? readScope(whiteLabel.host, "org");
|
|
350
136
|
return orgs.find((o) => o.name === saved) ?? orgs.find((o) => o.name === account?.owner) ?? orgs[0];
|
|
351
137
|
}, [orgs, orgName, account, whiteLabel.host]);
|
|
352
|
-
|
|
138
|
+
React__namespace.useEffect(() => {
|
|
353
139
|
if (!org) {
|
|
354
140
|
setProjects([]);
|
|
355
141
|
return;
|
|
@@ -359,7 +145,7 @@ var IdentityProvider = ({
|
|
|
359
145
|
void (async () => {
|
|
360
146
|
const token = await (auth.token ?? storedToken)();
|
|
361
147
|
if (!live || !token) return;
|
|
362
|
-
const rows = await iam.projects({ base, token, signal: ac.signal }, org.name).catch(() => []);
|
|
148
|
+
const rows = await iam_cjs.iam.projects({ base, token, signal: ac.signal }, org.name).catch(() => []);
|
|
363
149
|
if (live) setProjects(rows);
|
|
364
150
|
})();
|
|
365
151
|
return () => {
|
|
@@ -367,12 +153,12 @@ var IdentityProvider = ({
|
|
|
367
153
|
ac.abort();
|
|
368
154
|
};
|
|
369
155
|
}, [base, auth, org, epoch]);
|
|
370
|
-
const project =
|
|
156
|
+
const project = React__namespace.useMemo(() => {
|
|
371
157
|
if (projects.length === 0) return null;
|
|
372
158
|
const saved = projectName ?? readScope(whiteLabel.host, "project");
|
|
373
159
|
return projects.find((p) => p.name === saved) ?? projects.find((p) => p.isDefault) ?? projects[0];
|
|
374
160
|
}, [projects, projectName, whiteLabel.host]);
|
|
375
|
-
const value =
|
|
161
|
+
const value = React__namespace.useMemo(() => ({
|
|
376
162
|
status,
|
|
377
163
|
account,
|
|
378
164
|
orgs,
|
|
@@ -404,9 +190,9 @@ var IdentityProvider = ({
|
|
|
404
190
|
return /* @__PURE__ */ jsxRuntime.jsx(IdentityContext.Provider, { value, children });
|
|
405
191
|
};
|
|
406
192
|
function useIdentity() {
|
|
407
|
-
const ctx =
|
|
408
|
-
const whiteLabel = useWhiteLabel();
|
|
409
|
-
const fallback =
|
|
193
|
+
const ctx = React__namespace.useContext(IdentityContext);
|
|
194
|
+
const whiteLabel = provider_cjs.useWhiteLabel();
|
|
195
|
+
const fallback = React__namespace.useMemo(() => ({
|
|
410
196
|
status: "anonymous",
|
|
411
197
|
account: null,
|
|
412
198
|
orgs: [],
|