@sruim/nexus-design 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +195 -0
- package/dist/assets/grid.webp.js +3 -0
- package/dist/components/credits-button/index.d.ts +8 -0
- package/dist/components/credits-button/index.js +40 -0
- package/dist/components/icon/index.d.ts +7 -0
- package/dist/components/icon/index.js +32 -0
- package/dist/components/icon-button/index.d.ts +9 -0
- package/dist/components/icon-button/index.js +36 -0
- package/dist/components/img-uploader/index.d.ts +19 -0
- package/dist/components/img-uploader/index.js +107 -0
- package/dist/components/img-viewer/index.d.ts +16 -0
- package/dist/components/img-viewer/index.js +80 -0
- package/dist/components/index.d.ts +9 -0
- package/dist/components/loadable/index.d.ts +8 -0
- package/dist/components/loadable/index.js +67 -0
- package/dist/components/loading/assets/loading.webp.js +3 -0
- package/dist/components/loading/index.d.ts +16 -0
- package/dist/components/loading/index.js +85 -0
- package/dist/components/model-uploader/index.d.ts +17 -0
- package/dist/components/model-uploader/index.js +93 -0
- package/dist/components/tree/index.d.ts +14 -0
- package/dist/components/tree/index.js +50 -0
- package/dist/components/tree/node.d.ts +23 -0
- package/dist/components/tree/node.js +185 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +43 -0
- package/dist/style.css +1193 -0
- package/dist/theme.d.ts +2 -0
- package/dist/theme.js +96 -0
- package/dist/tokens/materials.d.ts +4 -0
- package/dist/tokens/materials.js +4 -0
- package/dist/tokens/nexus.d.ts +51 -0
- package/dist/tokens/nexus.js +42 -0
- package/dist/ui/avatar/index.d.ts +11 -0
- package/dist/ui/avatar/index.js +55 -0
- package/dist/ui/badge/index.d.ts +2 -0
- package/dist/ui/badge/index.js +45 -0
- package/dist/ui/button.d.ts +8 -0
- package/dist/ui/button.js +61 -0
- package/dist/ui/carousel/index.d.ts +43 -0
- package/dist/ui/carousel/index.js +186 -0
- package/dist/ui/checkbox/index.d.ts +4 -0
- package/dist/ui/checkbox/index.js +34 -0
- package/dist/ui/collapsible/index.d.ts +9 -0
- package/dist/ui/collapsible/index.js +7 -0
- package/dist/ui/dialog/confirm.d.ts +20 -0
- package/dist/ui/dialog/confirm.js +80 -0
- package/dist/ui/dialog/dialog.d.ts +26 -0
- package/dist/ui/dialog/dialog.js +97 -0
- package/dist/ui/dialog/index.d.ts +2 -0
- package/dist/ui/drawer.d.ts +22 -0
- package/dist/ui/drawer.js +98 -0
- package/dist/ui/form.d.ts +33 -0
- package/dist/ui/form.js +138 -0
- package/dist/ui/index.d.ts +24 -0
- package/dist/ui/input-otp.d.ts +14 -0
- package/dist/ui/input-otp.js +73 -0
- package/dist/ui/label.d.ts +4 -0
- package/dist/ui/label.js +32 -0
- package/dist/ui/masonry/index.d.ts +13 -0
- package/dist/ui/masonry/index.js +45 -0
- package/dist/ui/popover/index.d.ts +15 -0
- package/dist/ui/popover/index.js +78 -0
- package/dist/ui/progress.d.ts +6 -0
- package/dist/ui/progress.js +48 -0
- package/dist/ui/select/index.d.ts +21 -0
- package/dist/ui/select/index.js +127 -0
- package/dist/ui/slider/index.d.ts +9 -0
- package/dist/ui/slider/index.js +87 -0
- package/dist/ui/snap-input.d.ts +7 -0
- package/dist/ui/snap-input.js +38 -0
- package/dist/ui/sonner.d.ts +5 -0
- package/dist/ui/sonner.js +50 -0
- package/dist/ui/switch.d.ts +4 -0
- package/dist/ui/switch.js +33 -0
- package/dist/ui/table/index.d.ts +22 -0
- package/dist/ui/table/index.js +70 -0
- package/dist/ui/tabs/index.d.ts +12 -0
- package/dist/ui/tabs/index.js +60 -0
- package/dist/ui/toggle/index.d.ts +2 -0
- package/dist/ui/toggle/toggle-group.d.ts +9 -0
- package/dist/ui/toggle/toggle-group.js +54 -0
- package/dist/ui/toggle/toggle.d.ts +11 -0
- package/dist/ui/toggle/toggle.js +45 -0
- package/dist/ui/tooltip/index.d.ts +17 -0
- package/dist/ui/tooltip/index.js +68 -0
- package/dist/utils/config.d.ts +2 -0
- package/dist/utils/config.js +48 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/utils.d.ts +8 -0
- package/dist/utils/utils.js +91 -0
- package/package.json +148 -0
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
const loading = "data:image/webp;base64,UklGRmAQAABXRUJQVlA4WAoAAAAwAAAAfwAAfwAASUNDUMgBAAAAAAHIAAAAAAQwAABtbnRyUkdCIFhZWiAH4AABAAEAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkZXNjAAAA8AAAACRyWFlaAAABFAAAABRnWFlaAAABKAAAABRiWFlaAAABPAAAABR3dHB0AAABUAAAABRyVFJDAAABZAAAAChnVFJDAAABZAAAAChiVFJDAAABZAAAAChjcHJ0AAABjAAAADxtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJYWVogAAAAAAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9YWVogAAAAAAAA9tYAAQAAAADTLXBhcmEAAAAAAAQAAAACZmYAAPKnAAANWQAAE9AAAApbAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACAAAAAcAEcAbwBvAGcAbABlACAASQBuAGMALgAgADIAMAAxADZBTFBIqw0AAA3Qhm37+j+NdF1fJCQ0BlRgIAmVUbS+VmRcKeM+k3WnrI5SMrOudN0XWZe6a+repmiV/pMS4u72vV78fv/I///r+4iYABbntd937bUrr1vDdSpsPXjgwLe+9fiBx/i2eO2rvvfV1x7a8szWg1ufZRuA165ctXLNmhtXrn3ssY89tnmmrfieH/hBnn76m1sPgpGZAAmw8qab/vhNBx/97x+ZVa+8+5Vbv/b1ZxgISJAcBYyUpJtu/tWb3/7Wt86e7/7+X//yV75yKC1AiGGUeW0YyZRY9RN33fzRP5ybKa/4i8uffOoQ4Iggo0kyb5gYkGDXv+b3N//hxpnxij/PE08A4xACCQ0BOU1iXgOs4bbfv37DQzPh5X+eRx9LaEgihlEMwBoyJg0JkGgYZd39t214cNFds4FNjwIxtaGhHAfSmJqWJCRYA2TCuvtW3zu3qJb/8k9+cRMJ0BA4GuIo0x21lACEzHAUAV77zx98w/7F87K//oUvgGRCQiKjDaMkmTQEYBIYjmImmPffde/GRbL8z7zkc88OAI6YBBI6mpYY8xuABEhMT1j3Xzfduyiu/kef+SxkgI7I9EAgmTQcnWIQYoZACAmv+6t3zi28H/+Fz2wjw6QGwkADyHTE0MAcBTAJwEAagOyFb3zwDQvtnuWfOiRgWJKZEEOAozQQUkPQEDCMBgIRIvOuun/fhgW1/Hc2fSpIkDBk3hASgyQ0w5DSsBQSIAHD+29ev3/hXP3bH/8EQ0lgpmUIDSNmxhCYo4BhDRCAASQgCAivff3dcwvl6t/++NcIAXIcMjDJTJLJkIZxiHnNEJpmEgJIuPbB9XML4+rf+tg2MAwJScgkEyCZmgmQE9BAYEI2kCaQAmsfXD+3EF7wWx/ZjmEYwziMmA0jZpJgB7/11BMHtxw4UON1XbdmxQ03rgoDCaMhU5LEBFn7X9fPXbgX/NZHtmESJplhNBg0jHbofZ/69AHOcgtbtux/7NHrbvwTf3xdgCQiQgOQAAlrH1w/d6Ge8wcbt0uAZEw1hKCLxsMPffpJzu+jj33kIyt+7afWBpJMlRQQBFzzwPr9F+hvf2gbCARgCCRAwmf+9VNc0EcffsvaX/8NQCZDyGTehpvvWX9hfv1rnzADhEAyacKD//3NLMAPP7zxvt9gMiUlIZOU7r7t3gvx05d/sDCJHEZrGAXJ3vrvWKBzGza+/jcBAQGZFEzgdfseOn8v+MH3B2YIjMOoIYSf+w8s4LkNGz+01kCgaQkm8M/fMHfe/tH7jiQBkgmZ0XDoP3yFhT13x92/f0VMCjRgggir33j3/vP0F967HUcNAxzVUcjP/zMW/gMPv/F6MgGEBghM1v3GhvNz0/XvgYaYagwjkw3/68Msxrk7fvM+MZlqKCBwz5c2no/L/9y7ERqCjKkNceQBFuv9B/8ZQMikJFP9L/fuPw+v/cROSkcBTLJh5PBvs3gfePiN60QSEGTetXc/cG7P//53goSBNYQ5Dtt+h8W86d7/ulYmk8mc4n0PzZ3Tn36HmYTRQJD47D9kcc+tf3CNQEMmkBP04Ppz+YHDn8pIQ8hoiO3/kMU+t/5NKxURoYEQ8nY2nsMvvj0ACUhSR7uPxT/3J9+0QggMQyDl9RvO7s7Hd2AYmISR/Btm4aaHHoCGTEkAgdvceFa/9FamGgmG4UPMxgf3vw4RAZma8PoNZ3PDjp0SEhgG6bb3zwjuvet2gCQAQeB2Np7FL7zZMBKJBDiygZm5/p+vlIZ0IiHp/g3zPe+5jycNYTQkBo8wO+ceuh9ESBAakNv2b5rn598oYTIOSRDs/NQM4YFbbs8EM0GA7n7zPN/3REw3y0R+i5m64b4BkwZkavpX3zDtlU/vFIGAFEb5ALN14+bfoCFlMkFadevGKa/4LBmJAaH1v2cMG+5ZJZLJ/P76Q1Ne/lnO1oD8ILN27i33AA2QU1Jeu3E/8L1zRzCwCUDof88cHvzNBBAwmVy1bhNw20YJA0cBgw8xe+fm7qABSBBMuOstwNq5EAzM0cCNM4gNr28IlKkN0N1vhucu2wwQGDaM0q6ds2jjLasRICSFXMcca7/pBJCOZvppZvIb7iFJAQGE2zfyPV8eMTAZh1Gjj8ymjbcxgABNhNyyiTVzGpAk0NDuIzPq1lXMK5PCbR9mzWZLkDADnmRGv+UukhAIAdZuXrvr6OhQjmJMfWpWbbwdUyYlgdUrlx1BwobRETHYMsMgSRIJuWXNZhkRsoGAju2aVXOrViEgCCm57so9NRBgaekcM3tuHWcrYNdftSuTSWEU2DK7vnTzWU1fufSo0ESGQMdm16Zbzs21S4+CZJjjBHtm1/5V58a6ZUew5Cxths2tOw9csbcYGJ0wSGb3/lXnYR0Jo0PEvHu/rRCAcdbOrvM7kYTfDtadH8PAIGfd3LrzQZiQYRgsOzazDqw8D1/afSUZDDGZM23/l247t00hkyNDTO2qvTPLt/zUuf3BnitIwBqa4tJjs+tf/uTac3n4oj1XYJxtdt3W2cXP/t9z2PzIxUcuj6kymhjXzq6Lxkf/5X84q81/+tKL9q7GJhIM4Ip9M2uIR/7V/14730f+zpIl7bnCJAMMwqXL9s6ogeBLv/Cav3TTxEf+bpctcXzmOxzFUTNj8iVfn1EXnRnIHvnXW27kwOalS5dm7b1sqdFARmLw4m/MqmoYh9j/KMuWLQMYY+9qw1GyISZveGJGXXwax4tGSSaD4GsvBnAUDDCXXPuNmXQRxWRCgFO2XoPRQAaQDS98eiZdeipxFKAhIM7A118cQjiKJPWaj82mkzJVMiAn9nYFNMTUDL3smqdn0CWNJRBI0tAY8PgNYUw6ikE/9P4ZtOSEUjKZ4OhpgMduYNKsgcDR6w/smzkXXXqcxKYAYacmnl29NDMwGgLjpV+cOZcfBQgxksnOTBz7+g1mQOIo6fjHvnh8xly05JiBEQIknWbq518WCUiG0XDZne+cMcsPmUwPQ+DUtG9cvRRMwnEIg249MDdTLlpyDLCJhtKiefjYH8+MSQnM7tg4U567SyAkCQk5ybxPfC+QU5LEcVh79admyPJjY5mEOA6FcWy+bcdeSJJhYODoax7bPzMuXnYomWyIhlGJU5zlB+7EGjLAJGzpD75tZjx/zxkgwUgcgeHw2TzN9WlghiMCrP2u982IVUdOZ1qGUAN4+szZ8ME7hJjXIOEVJx6bCSsv2odZgmUacYSz/ibXB5IZEgb+wGM7ZsCS5btBEghMEs6cODs+dJsYkwaS0WU//a4Di+6Sq7ZLQCbJZHiIc/ym68jMOEu59O53H1hklzx/xykaMrMhptqxzoU3vZbpBqRhDSt+5N0HF9UlV28/KY4mZIZhHuCc92+6zcyQySSJFT/6oV2LaOnVz5yCJENIR8wOcR4/9d0rTSgnSBJZ/lNPfnHRrFr5zOnBQhrKpCGqo+fj+Ht+iqkSCBmOymtOfHqRXHPRs2eGEY3pltnQHs7r3I5XEUhCAJIUr/6eNx1cBJded2C3hM1jyGSHOM8fuWmlGTQQBglIK37kK48uuOet3nokgcRRpgbC6fN2/P/+3BIACUwmM+myV6x7y6EFtfzqo9vPJCSEkCQQ4y7O+/7P/iBJhgEYYOC4/K6tXzi0YJZcc+mzhxDCDMnMMNnHBXz0+CsswZBACCHpu27d9sVDC2LJc1fu2BMGIGGCI2aylwv6/jUvESBMIMAAE15yy/avbb9gK69dsnPHaSBDEkcwMIHDJy8M73j58ywxMzATSEJe/OLLNz+99wKsWnn1kS0HgIaMoYYRNEggTu3jAp94550rJDOQEEYFEoLnrLn+kh079u87D5etXnXlwf3bTplAAmECWReNkqd2csEPvOvHlmOAgQFDgQGYcPnznr/iOXv3nTpytKPAxZcsvWj5c5ac2bNv95kSk6QuGjFM0nEY8eROFuCBd/3oCgTChBw1MzNDiYtXr7p42VKWVqdOHD1z4NDxk4J4RgxHGc4MhIQk4antLMgD7/7RFeNAkqHjMGJoABYg84c4ignjkBAwjCaTGQlychsL9OC7f3jViGFSYgYmkJx1WkNCAIYlgMkokzYUHN/Jgj341le/OHQ0gTAdMYFMICdkHCgTY7oAAToikIEH97KAT7z3qlcbSCAkCZTSUGgJNARmgAFCCFAMlIaw5wgL+9MnXrWkYQQBHMURscwkMUjONoWY38yGxiFPb2PBb3rqx1eEQJiBhIAxNZB5TWLSkEAyYVQ4sYVFePBNt9wkARMQAiEJxACjQEKCEI46IgZYA9nuvSzOj+65c7kTmUkyXlROgdASA4mpDSQQQhie2MKiffbj614REmaSjjK/pWRYAkgGGNMNt+1nEZ947Ct/7PoRjakZjkMCZgnj4DgE4KiBgUmSh77JIj/0iUtfvjwEksRxGIfRACUkyAkMAzPDOLSVGfjVL1zzssszHTEbMhqIQJIGaAIcNWPqoa3MyK9+YcWtL5BxwFHCJDCZamBTwMCEA88wQ7dtOnzrC5aPZkKCkBFCQkMGGKSntu1lxh7etP3KNdddCokjJmCSxKQBiZzes/0os3jLM9+64kVXrI4EAhuCcAqYdGLXnhPM7h1P7zt1xfNWX3ExGBiTNsWTJ/Yd3s/MP7Jv1/59yy9ZvezySy+5eBkIRz127PSx4wdHFiUAVlA4IL4AAABQDQCdASqAAIAAPhkIg0EhBk/VAAQAYS0t3BgAfwAC2yfAH8A/AD9APz97/CS8rMaISl5fRC0zl3HYV0pa6ZqDShHfD0XAhozUi/mbghqxGGok+o9P6HZivo031hjEmug5XT1qVOV/9rV1V5KTl7DXDz4AAP64TseP///sRE//2FQMH///2Ibhdj///YhZv/zgVv/6Ju3846v5wGl/nAQBA/zfKujljf//+xCz7sKn384mf/s7Ch/nGBgiQAAA";
|
|
2
|
+
|
|
3
|
+
export { loading as default };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
declare const Root: React.ForwardRefExoticComponent<React.HtmlHTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
|
|
3
|
+
declare const Overlay: React.ForwardRefExoticComponent<React.HtmlHTMLAttributes<HTMLDivElement> & React.RefAttributes<HTMLDivElement>>;
|
|
4
|
+
declare const Icon: React.ForwardRefExoticComponent<React.HtmlHTMLAttributes<HTMLImageElement> & React.RefAttributes<HTMLImageElement>>;
|
|
5
|
+
interface LoadingProps {
|
|
6
|
+
className?: string;
|
|
7
|
+
children?: React.ReactNode;
|
|
8
|
+
}
|
|
9
|
+
interface Loading extends React.FC<LoadingProps> {
|
|
10
|
+
Root: typeof Root;
|
|
11
|
+
Overlay: typeof Overlay;
|
|
12
|
+
Icon: typeof Icon;
|
|
13
|
+
show: (loading?: React.ReactNode) => () => Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
declare const Loading: Loading;
|
|
16
|
+
export { Loading };
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { DeepGlass } from '../../tokens/materials.js';
|
|
3
|
+
import { cn } from '../../utils/config.js';
|
|
4
|
+
import { Portal } from '@radix-ui/react-portal';
|
|
5
|
+
import '../../ui/avatar/index.js';
|
|
6
|
+
import '../../ui/button.js';
|
|
7
|
+
import '../../ui/carousel/index.js';
|
|
8
|
+
import '../../ui/checkbox/index.js';
|
|
9
|
+
import '../../ui/collapsible/index.js';
|
|
10
|
+
import '../../ui/dialog/confirm.js';
|
|
11
|
+
import '../../ui/dialog/dialog.js';
|
|
12
|
+
import '../../ui/drawer.js';
|
|
13
|
+
import '../../ui/form.js';
|
|
14
|
+
import '../../ui/input-otp.js';
|
|
15
|
+
import '../../ui/label.js';
|
|
16
|
+
import React__default from 'react';
|
|
17
|
+
import '../../ui/popover/index.js';
|
|
18
|
+
import '../../ui/progress.js';
|
|
19
|
+
import '../../ui/select/index.js';
|
|
20
|
+
import '../../ui/slider/index.js';
|
|
21
|
+
import '../../ui/sonner.js';
|
|
22
|
+
import '../../ui/switch.js';
|
|
23
|
+
import '../../ui/table/index.js';
|
|
24
|
+
import '../../ui/tabs/index.js';
|
|
25
|
+
import '../../ui/toggle/toggle.js';
|
|
26
|
+
import '../../ui/toggle/toggle-group.js';
|
|
27
|
+
import '../../ui/tooltip/index.js';
|
|
28
|
+
import { createRoot } from 'react-dom/client';
|
|
29
|
+
import loading from './assets/loading.webp.js';
|
|
30
|
+
|
|
31
|
+
const Root = React__default.forwardRef(
|
|
32
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
33
|
+
"div",
|
|
34
|
+
{
|
|
35
|
+
ref,
|
|
36
|
+
className: cn(
|
|
37
|
+
"fixed inset-0 flex flex-col items-center justify-center z-60 pointer-events-auto",
|
|
38
|
+
className
|
|
39
|
+
),
|
|
40
|
+
...props
|
|
41
|
+
}
|
|
42
|
+
)
|
|
43
|
+
);
|
|
44
|
+
Root.displayName = "LoadingRoot";
|
|
45
|
+
const Overlay = React__default.forwardRef(
|
|
46
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx("div", { ref, className: cn("absolute inset-0", DeepGlass, className), ...props })
|
|
47
|
+
);
|
|
48
|
+
Overlay.displayName = "LoadingOverlay";
|
|
49
|
+
const Icon = React__default.forwardRef(
|
|
50
|
+
({ className, ...props }, ref) => /* @__PURE__ */ jsx(
|
|
51
|
+
"img",
|
|
52
|
+
{
|
|
53
|
+
ref,
|
|
54
|
+
className: cn("w-15% max-w-16 animate-spin aspect-square", className),
|
|
55
|
+
src: loading,
|
|
56
|
+
alt: "loading...",
|
|
57
|
+
...props
|
|
58
|
+
}
|
|
59
|
+
)
|
|
60
|
+
);
|
|
61
|
+
Icon.displayName = "LoadingIcon";
|
|
62
|
+
const Loading = ({ children, className }) => /* @__PURE__ */ jsxs(Root, { children: [
|
|
63
|
+
/* @__PURE__ */ jsx(Overlay, { className }),
|
|
64
|
+
children
|
|
65
|
+
] });
|
|
66
|
+
const PortalLoading = ({ children }) => /* @__PURE__ */ jsx(Portal, { asChild: true, children: children ? children : /* @__PURE__ */ jsx(Loading, { children: /* @__PURE__ */ jsx(Icon, {}) }) });
|
|
67
|
+
Loading.Icon = Icon;
|
|
68
|
+
Loading.Overlay = Overlay;
|
|
69
|
+
Loading.Root = Root;
|
|
70
|
+
Loading.show = (loading2) => {
|
|
71
|
+
if (window === void 0) {
|
|
72
|
+
console.warn("Dialog.show is not supported in Server Side");
|
|
73
|
+
return () => Promise.resolve();
|
|
74
|
+
}
|
|
75
|
+
let container = document.createDocumentFragment();
|
|
76
|
+
let root = createRoot(container);
|
|
77
|
+
root.render(/* @__PURE__ */ jsx(PortalLoading, { children: loading2 }));
|
|
78
|
+
return () => Promise.resolve().then(() => {
|
|
79
|
+
root?.unmount();
|
|
80
|
+
container = null;
|
|
81
|
+
root = null;
|
|
82
|
+
});
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
export { Loading };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
interface InputProps {
|
|
3
|
+
onChange: (file: File) => void;
|
|
4
|
+
}
|
|
5
|
+
interface Props {
|
|
6
|
+
className?: string;
|
|
7
|
+
icon?: string;
|
|
8
|
+
title?: string;
|
|
9
|
+
description?: string;
|
|
10
|
+
required?: boolean;
|
|
11
|
+
onChange: (file: File) => void;
|
|
12
|
+
}
|
|
13
|
+
interface IModelUploader extends React.FC<Props> {
|
|
14
|
+
Input: React.FC<InputProps>;
|
|
15
|
+
}
|
|
16
|
+
export declare const ModelUploader: IModelUploader;
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { FrostGlass } from '../../tokens/materials.js';
|
|
3
|
+
import '@radix-ui/react-portal';
|
|
4
|
+
import '../../ui/avatar/index.js';
|
|
5
|
+
import { cn } from '../../utils/config.js';
|
|
6
|
+
import { checkSize, checkType } from '../../utils/utils.js';
|
|
7
|
+
import '../../ui/button.js';
|
|
8
|
+
import '../../ui/carousel/index.js';
|
|
9
|
+
import '../../ui/checkbox/index.js';
|
|
10
|
+
import '../../ui/collapsible/index.js';
|
|
11
|
+
import '../../ui/dialog/confirm.js';
|
|
12
|
+
import '../../ui/dialog/dialog.js';
|
|
13
|
+
import '../../ui/drawer.js';
|
|
14
|
+
import '../../ui/form.js';
|
|
15
|
+
import '../../ui/input-otp.js';
|
|
16
|
+
import '../../ui/label.js';
|
|
17
|
+
import 'react';
|
|
18
|
+
import '../../ui/popover/index.js';
|
|
19
|
+
import '../../ui/progress.js';
|
|
20
|
+
import '../../ui/select/index.js';
|
|
21
|
+
import '../../ui/slider/index.js';
|
|
22
|
+
import '../../ui/sonner.js';
|
|
23
|
+
import '../../ui/switch.js';
|
|
24
|
+
import '../../ui/table/index.js';
|
|
25
|
+
import '../../ui/tabs/index.js';
|
|
26
|
+
import '../../ui/toggle/toggle.js';
|
|
27
|
+
import '../../ui/toggle/toggle-group.js';
|
|
28
|
+
import '../../ui/tooltip/index.js';
|
|
29
|
+
import grid from '../../assets/grid.webp.js';
|
|
30
|
+
import { Icon } from '../icon/index.js';
|
|
31
|
+
import { toast } from 'sonner';
|
|
32
|
+
|
|
33
|
+
const Input = ({ onChange }) => {
|
|
34
|
+
const handleChange = (e) => {
|
|
35
|
+
const model = e.target.files?.[0];
|
|
36
|
+
if (!model) return;
|
|
37
|
+
if (!checkSize(model, 50)) {
|
|
38
|
+
toast.error("The uploaded file size cannot exceed 50 MB");
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if (!checkType(model, "model")) {
|
|
42
|
+
toast.error("This file type is not supported.");
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
onChange(model);
|
|
46
|
+
e.target.value = "";
|
|
47
|
+
};
|
|
48
|
+
return /* @__PURE__ */ jsx(
|
|
49
|
+
"input",
|
|
50
|
+
{
|
|
51
|
+
className: "absolute inset-0 cursor-pointer opacity-0",
|
|
52
|
+
type: "file",
|
|
53
|
+
max: 1,
|
|
54
|
+
multiple: false,
|
|
55
|
+
accept: ".fbx,.obj,.stl,.glb",
|
|
56
|
+
onChange: handleChange
|
|
57
|
+
}
|
|
58
|
+
);
|
|
59
|
+
};
|
|
60
|
+
const BaseStyle = "relative size-full flex flex-col items-center justify-center overflow-hidden transition-colors duration-fast ease-smooth hover:bg-surface-hover";
|
|
61
|
+
const BorderStyle = cn("box-border border border-dashed border-white/20", FrostGlass);
|
|
62
|
+
const ModelUploader = ({
|
|
63
|
+
className,
|
|
64
|
+
icon,
|
|
65
|
+
title,
|
|
66
|
+
description,
|
|
67
|
+
required,
|
|
68
|
+
onChange
|
|
69
|
+
}) => {
|
|
70
|
+
return /* @__PURE__ */ jsxs("div", { className: cn(BaseStyle, BorderStyle, className), children: [
|
|
71
|
+
icon && /* @__PURE__ */ jsx(Icon, { className: "size-4", icon }),
|
|
72
|
+
title && /* @__PURE__ */ jsx("div", { className: "my-1 max-w-2/3 w-37.5 text-center text-wrap text-2.5 text-text-primary", children: title }),
|
|
73
|
+
description && /* @__PURE__ */ jsx("div", { className: "max-w-2/3 w-37.5 text-center text-wrap text-2.5 text-text-secondary", children: description }),
|
|
74
|
+
required && /* @__PURE__ */ jsx(
|
|
75
|
+
Icon,
|
|
76
|
+
{
|
|
77
|
+
className: "absolute right-3 top-3 size-6 text-status-error",
|
|
78
|
+
icon: "i-nexus:required-monotone"
|
|
79
|
+
}
|
|
80
|
+
),
|
|
81
|
+
/* @__PURE__ */ jsx(
|
|
82
|
+
"div",
|
|
83
|
+
{
|
|
84
|
+
className: "absolute left-0 top-0 z-0 size-full bg-contain bg-repeat",
|
|
85
|
+
style: { backgroundImage: `url(${grid})` }
|
|
86
|
+
}
|
|
87
|
+
),
|
|
88
|
+
/* @__PURE__ */ jsx(Input, { onChange })
|
|
89
|
+
] });
|
|
90
|
+
};
|
|
91
|
+
ModelUploader.Input = Input;
|
|
92
|
+
|
|
93
|
+
export { ModelUploader };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ITreeNode } from './node';
|
|
2
|
+
export type { ITreeNode } from './node';
|
|
3
|
+
interface Props {
|
|
4
|
+
data: ITreeNode[];
|
|
5
|
+
selected: string[];
|
|
6
|
+
expanded: string[];
|
|
7
|
+
readOnly?: boolean;
|
|
8
|
+
onDelete: (name: string) => void;
|
|
9
|
+
onNameChange: (name: string, value: string) => void;
|
|
10
|
+
onVisibleChange: (name: string) => void;
|
|
11
|
+
onSelectChange: (name: string) => void;
|
|
12
|
+
onExpandedChange: (name: string) => void;
|
|
13
|
+
}
|
|
14
|
+
export declare const Tree: React.FC<Props>;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useCallback } from 'react';
|
|
3
|
+
import { TreeNode } from './node.js';
|
|
4
|
+
|
|
5
|
+
const Tree = ({
|
|
6
|
+
data,
|
|
7
|
+
selected,
|
|
8
|
+
expanded,
|
|
9
|
+
readOnly,
|
|
10
|
+
onDelete,
|
|
11
|
+
onNameChange,
|
|
12
|
+
onVisibleChange,
|
|
13
|
+
onSelectChange,
|
|
14
|
+
onExpandedChange
|
|
15
|
+
}) => {
|
|
16
|
+
const renderTree = useCallback(
|
|
17
|
+
(nodes, level = 0) => {
|
|
18
|
+
return nodes.map((node) => /* @__PURE__ */ jsx(
|
|
19
|
+
TreeNode,
|
|
20
|
+
{
|
|
21
|
+
node,
|
|
22
|
+
level,
|
|
23
|
+
selected,
|
|
24
|
+
expanded,
|
|
25
|
+
readOnly,
|
|
26
|
+
onDelete,
|
|
27
|
+
onSelectChange,
|
|
28
|
+
onExpandedChange,
|
|
29
|
+
onNameChange,
|
|
30
|
+
onVisibleChange,
|
|
31
|
+
children: node.children && node.children.length && renderTree(node.children, level < 5 ? level + 1 : 5)
|
|
32
|
+
},
|
|
33
|
+
node.name
|
|
34
|
+
));
|
|
35
|
+
},
|
|
36
|
+
[
|
|
37
|
+
selected,
|
|
38
|
+
expanded,
|
|
39
|
+
readOnly,
|
|
40
|
+
onDelete,
|
|
41
|
+
onSelectChange,
|
|
42
|
+
onExpandedChange,
|
|
43
|
+
onNameChange,
|
|
44
|
+
onVisibleChange
|
|
45
|
+
]
|
|
46
|
+
);
|
|
47
|
+
return /* @__PURE__ */ jsx("ul", { className: "w-full list-none", children: renderTree(data) });
|
|
48
|
+
};
|
|
49
|
+
|
|
50
|
+
export { Tree };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
export interface ITreeNode {
|
|
3
|
+
name: string;
|
|
4
|
+
displayName: string;
|
|
5
|
+
visible: boolean;
|
|
6
|
+
disabled: boolean;
|
|
7
|
+
children: ITreeNode[];
|
|
8
|
+
}
|
|
9
|
+
interface Props {
|
|
10
|
+
node: ITreeNode;
|
|
11
|
+
selected: string[];
|
|
12
|
+
expanded: string[];
|
|
13
|
+
level: number;
|
|
14
|
+
readOnly?: boolean;
|
|
15
|
+
onDelete: (name: string) => void;
|
|
16
|
+
onNameChange: (name: string, value: string) => void;
|
|
17
|
+
onVisibleChange: (name: string) => void;
|
|
18
|
+
onSelectChange: (name: string) => void;
|
|
19
|
+
onExpandedChange: (name: string) => void;
|
|
20
|
+
children?: React.ReactNode;
|
|
21
|
+
}
|
|
22
|
+
export declare const TreeNode: React.FC<Props>;
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import '@radix-ui/react-portal';
|
|
3
|
+
import '../../ui/avatar/index.js';
|
|
4
|
+
import { cn } from '../../utils/config.js';
|
|
5
|
+
import '../../ui/button.js';
|
|
6
|
+
import '../../ui/carousel/index.js';
|
|
7
|
+
import '../../ui/checkbox/index.js';
|
|
8
|
+
import '../../ui/collapsible/index.js';
|
|
9
|
+
import '../../ui/dialog/confirm.js';
|
|
10
|
+
import '../../ui/dialog/dialog.js';
|
|
11
|
+
import '../../ui/drawer.js';
|
|
12
|
+
import '../../ui/form.js';
|
|
13
|
+
import '../../ui/input-otp.js';
|
|
14
|
+
import '../../ui/label.js';
|
|
15
|
+
import { useState, useRef, useMemo } from 'react';
|
|
16
|
+
import { Popover } from '../../ui/popover/index.js';
|
|
17
|
+
import '../../ui/progress.js';
|
|
18
|
+
import '../../ui/select/index.js';
|
|
19
|
+
import '../../ui/slider/index.js';
|
|
20
|
+
import { SnapInput } from '../../ui/snap-input.js';
|
|
21
|
+
import '../../ui/sonner.js';
|
|
22
|
+
import '../../ui/switch.js';
|
|
23
|
+
import '../../ui/table/index.js';
|
|
24
|
+
import '../../ui/tabs/index.js';
|
|
25
|
+
import '../../ui/toggle/toggle.js';
|
|
26
|
+
import '../../ui/toggle/toggle-group.js';
|
|
27
|
+
import '../../ui/tooltip/index.js';
|
|
28
|
+
import { Icon } from '../icon/index.js';
|
|
29
|
+
|
|
30
|
+
const TreeNode = ({
|
|
31
|
+
node,
|
|
32
|
+
selected,
|
|
33
|
+
expanded,
|
|
34
|
+
level,
|
|
35
|
+
readOnly,
|
|
36
|
+
onDelete,
|
|
37
|
+
onSelectChange,
|
|
38
|
+
onExpandedChange,
|
|
39
|
+
onNameChange,
|
|
40
|
+
onVisibleChange,
|
|
41
|
+
children
|
|
42
|
+
}) => {
|
|
43
|
+
const { name, displayName, visible, disabled } = node;
|
|
44
|
+
const isExpanded = expanded.includes(name);
|
|
45
|
+
const isSelected = selected.includes(name);
|
|
46
|
+
const canExpand = Boolean(children);
|
|
47
|
+
const [edit, setEdit] = useState(false);
|
|
48
|
+
const clickTimerRef = useRef(0);
|
|
49
|
+
const computedStyle = useMemo(() => {
|
|
50
|
+
if (disabled) return "opacity-50 cursor-not-allowed";
|
|
51
|
+
if (isSelected) return level ? "bg-core-blue/10" : "bg-core-blue/20";
|
|
52
|
+
if (visible) return level ? "hover:bg-surface-dim" : "hover:bg-surface-hover";
|
|
53
|
+
if (!visible) return "opacity-50";
|
|
54
|
+
return "";
|
|
55
|
+
}, [disabled, isSelected, visible, level]);
|
|
56
|
+
const Expanded = useMemo(() => {
|
|
57
|
+
return /* @__PURE__ */ jsx("div", { className: "size-3", children: canExpand && /* @__PURE__ */ jsx(
|
|
58
|
+
Icon,
|
|
59
|
+
{
|
|
60
|
+
className: "size-3 text-text-disabled data-[state=close]-rotate-180",
|
|
61
|
+
"data-state": isExpanded ? "open" : "close",
|
|
62
|
+
icon: "i-nexus:arrow-monotone",
|
|
63
|
+
onClick: (e) => {
|
|
64
|
+
e.stopPropagation();
|
|
65
|
+
e.preventDefault();
|
|
66
|
+
onExpandedChange(name);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
) });
|
|
70
|
+
}, [canExpand, isExpanded, name, onExpandedChange]);
|
|
71
|
+
const NamePart = useMemo(() => {
|
|
72
|
+
if (edit) {
|
|
73
|
+
return /* @__PURE__ */ jsx(
|
|
74
|
+
SnapInput,
|
|
75
|
+
{
|
|
76
|
+
className: "mx-1 h-7 min-w-0 border border-core-blue rounded-2 bg-transparent p-2 text-3 outline-none",
|
|
77
|
+
value: displayName,
|
|
78
|
+
autoFocus: true,
|
|
79
|
+
onChange: (value) => {
|
|
80
|
+
setEdit(false);
|
|
81
|
+
onNameChange(name, value);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
return /* @__PURE__ */ jsx("div", { className: "flex-1 truncate text-start text-3", children: displayName });
|
|
87
|
+
}, [displayName, edit, name, onNameChange]);
|
|
88
|
+
const Node = useMemo(() => {
|
|
89
|
+
return /* @__PURE__ */ jsxs(
|
|
90
|
+
"button",
|
|
91
|
+
{
|
|
92
|
+
className: "h-full flex flex-1 items-center justify-center gap-1 overflow-hidden",
|
|
93
|
+
disabled,
|
|
94
|
+
onClick: (e) => {
|
|
95
|
+
e.stopPropagation();
|
|
96
|
+
if (clickTimerRef.current) {
|
|
97
|
+
clearTimeout(clickTimerRef.current);
|
|
98
|
+
clickTimerRef.current = 0;
|
|
99
|
+
}
|
|
100
|
+
clickTimerRef.current = window.setTimeout(() => {
|
|
101
|
+
onSelectChange(name);
|
|
102
|
+
clickTimerRef.current = 0;
|
|
103
|
+
}, 100);
|
|
104
|
+
},
|
|
105
|
+
onDoubleClick: (e) => {
|
|
106
|
+
e.stopPropagation();
|
|
107
|
+
if (clickTimerRef.current) {
|
|
108
|
+
clearTimeout(clickTimerRef.current);
|
|
109
|
+
clickTimerRef.current = 0;
|
|
110
|
+
}
|
|
111
|
+
if (!readOnly) setEdit(true);
|
|
112
|
+
},
|
|
113
|
+
children: [
|
|
114
|
+
/* @__PURE__ */ jsx(
|
|
115
|
+
Icon,
|
|
116
|
+
{
|
|
117
|
+
className: "mr-2 flex-shrink-0 text-text-secondary",
|
|
118
|
+
icon: children ? "i-nexus:group-monotone" : "i-nexus:cube-monotone"
|
|
119
|
+
}
|
|
120
|
+
),
|
|
121
|
+
NamePart
|
|
122
|
+
]
|
|
123
|
+
}
|
|
124
|
+
);
|
|
125
|
+
}, [NamePart, children, disabled, name, onSelectChange, readOnly]);
|
|
126
|
+
const Visible = useMemo(() => {
|
|
127
|
+
return /* @__PURE__ */ jsx(
|
|
128
|
+
"button",
|
|
129
|
+
{
|
|
130
|
+
className: "rounded-1.5 p-1 hover:bg-surface-hover",
|
|
131
|
+
onClick: (e) => {
|
|
132
|
+
e.stopPropagation();
|
|
133
|
+
e.preventDefault();
|
|
134
|
+
onVisibleChange(name);
|
|
135
|
+
},
|
|
136
|
+
disabled,
|
|
137
|
+
children: /* @__PURE__ */ jsx(
|
|
138
|
+
Icon,
|
|
139
|
+
{
|
|
140
|
+
className: "size-4",
|
|
141
|
+
icon: visible ? "i-nexus:visible-monotone" : "i-nexus:invisible-monotone"
|
|
142
|
+
}
|
|
143
|
+
)
|
|
144
|
+
}
|
|
145
|
+
);
|
|
146
|
+
}, [disabled, name, onVisibleChange, visible]);
|
|
147
|
+
const Menu = useMemo(() => {
|
|
148
|
+
if (readOnly) return null;
|
|
149
|
+
return /* @__PURE__ */ jsxs(Popover, { children: [
|
|
150
|
+
/* @__PURE__ */ jsx(Popover.Trigger, { disabled, className: "rounded-1.5 p-1 hover:bg-surface-hover", children: /* @__PURE__ */ jsx(Icon, { className: "size-4", icon: "i-nexus:more-horizontal-monotone" }) }),
|
|
151
|
+
/* @__PURE__ */ jsx(Popover.Portal, { children: /* @__PURE__ */ jsx(Popover.Content, { className: "w-38 rounded-4 p-2", side: "bottom", align: "end", sideOffset: 6, children: /* @__PURE__ */ jsxs(
|
|
152
|
+
"button",
|
|
153
|
+
{
|
|
154
|
+
className: "w-full flex items-center gap-1 rounded-5 px-1.5 py-2 hover:bg-surface-hover",
|
|
155
|
+
onClick: () => onDelete(name),
|
|
156
|
+
disabled,
|
|
157
|
+
children: [
|
|
158
|
+
/* @__PURE__ */ jsx(Icon, { className: "size-4", icon: "i-nexus:delete-monotone" }),
|
|
159
|
+
/* @__PURE__ */ jsx("p", { className: "text-3", children: "Delete" })
|
|
160
|
+
]
|
|
161
|
+
}
|
|
162
|
+
) }) })
|
|
163
|
+
] });
|
|
164
|
+
}, [disabled, name, onDelete, readOnly]);
|
|
165
|
+
return /* @__PURE__ */ jsxs("li", { className: "tree-node relative w-full", children: [
|
|
166
|
+
/* @__PURE__ */ jsxs(
|
|
167
|
+
"div",
|
|
168
|
+
{
|
|
169
|
+
className: cn("flex items-center w-full h-8.5 cursor-pointer", computedStyle),
|
|
170
|
+
style: { paddingLeft: `${level * 1}rem` },
|
|
171
|
+
children: [
|
|
172
|
+
Expanded,
|
|
173
|
+
Node,
|
|
174
|
+
/* @__PURE__ */ jsxs("div", { className: "mr-3 flex gap-1", children: [
|
|
175
|
+
Visible,
|
|
176
|
+
Menu
|
|
177
|
+
] })
|
|
178
|
+
]
|
|
179
|
+
}
|
|
180
|
+
),
|
|
181
|
+
canExpand && isExpanded && /* @__PURE__ */ jsx("ul", { className: "w-full", children })
|
|
182
|
+
] });
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
export { TreeNode };
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export { CreditsButton } from './components/credits-button/index.js';
|
|
2
|
+
export { Icon } from './components/icon/index.js';
|
|
3
|
+
export { IconButton } from './components/icon-button/index.js';
|
|
4
|
+
export { ImgUploader } from './components/img-uploader/index.js';
|
|
5
|
+
export { ImgViewer } from './components/img-viewer/index.js';
|
|
6
|
+
export { Loadable } from './components/loadable/index.js';
|
|
7
|
+
export { Loading } from './components/loading/index.js';
|
|
8
|
+
export { ModelUploader } from './components/model-uploader/index.js';
|
|
9
|
+
export { Tree } from './components/tree/index.js';
|
|
10
|
+
export { theme } from './theme.js';
|
|
11
|
+
export * from '@radix-ui/react-portal';
|
|
12
|
+
export { Avatar } from './ui/avatar/index.js';
|
|
13
|
+
export { Badge } from './ui/badge/index.js';
|
|
14
|
+
export { Button } from './ui/button.js';
|
|
15
|
+
export { Carousel, useCarousel } from './ui/carousel/index.js';
|
|
16
|
+
export { Checkbox } from './ui/checkbox/index.js';
|
|
17
|
+
export { Collapsible } from './ui/collapsible/index.js';
|
|
18
|
+
export { Confirm } from './ui/dialog/confirm.js';
|
|
19
|
+
export { Dialog, Dialoger } from './ui/dialog/dialog.js';
|
|
20
|
+
export { Drawer } from './ui/drawer.js';
|
|
21
|
+
export { Form, useForm, useFormField } from './ui/form.js';
|
|
22
|
+
export { InputOTP } from './ui/input-otp.js';
|
|
23
|
+
export { Label } from './ui/label.js';
|
|
24
|
+
export { Masonry } from './ui/masonry/index.js';
|
|
25
|
+
export { Popover } from './ui/popover/index.js';
|
|
26
|
+
export { Progress } from './ui/progress.js';
|
|
27
|
+
export { Select } from './ui/select/index.js';
|
|
28
|
+
export { Slider } from './ui/slider/index.js';
|
|
29
|
+
export { SnapInput } from './ui/snap-input.js';
|
|
30
|
+
export { Toaster } from './ui/sonner.js';
|
|
31
|
+
export { Switch } from './ui/switch.js';
|
|
32
|
+
export { Table } from './ui/table/index.js';
|
|
33
|
+
export { Tabs } from './ui/tabs/index.js';
|
|
34
|
+
export { BaseStyle, ButtonStyle, NavigationStyle, Toggle, iconClassName } from './ui/toggle/toggle.js';
|
|
35
|
+
export { ToggleGroup } from './ui/toggle/toggle-group.js';
|
|
36
|
+
export { Tooltip } from './ui/tooltip/index.js';
|
|
37
|
+
export { cn } from './utils/config.js';
|
|
38
|
+
export { checkSize, checkType, copy, download, getSuffix, isMobileDevice, jump, sleep } from './utils/utils.js';
|
|
39
|
+
/* empty css */
|
|
40
|
+
export { useFormContext } from 'react-hook-form';
|
|
41
|
+
export { toast } from 'sonner';
|
|
42
|
+
import * as reactTable from '@tanstack/react-table';
|
|
43
|
+
export { reactTable as TanstackTable };
|