@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.
Files changed (92) hide show
  1. package/README.md +195 -0
  2. package/dist/assets/grid.webp.js +3 -0
  3. package/dist/components/credits-button/index.d.ts +8 -0
  4. package/dist/components/credits-button/index.js +40 -0
  5. package/dist/components/icon/index.d.ts +7 -0
  6. package/dist/components/icon/index.js +32 -0
  7. package/dist/components/icon-button/index.d.ts +9 -0
  8. package/dist/components/icon-button/index.js +36 -0
  9. package/dist/components/img-uploader/index.d.ts +19 -0
  10. package/dist/components/img-uploader/index.js +107 -0
  11. package/dist/components/img-viewer/index.d.ts +16 -0
  12. package/dist/components/img-viewer/index.js +80 -0
  13. package/dist/components/index.d.ts +9 -0
  14. package/dist/components/loadable/index.d.ts +8 -0
  15. package/dist/components/loadable/index.js +67 -0
  16. package/dist/components/loading/assets/loading.webp.js +3 -0
  17. package/dist/components/loading/index.d.ts +16 -0
  18. package/dist/components/loading/index.js +85 -0
  19. package/dist/components/model-uploader/index.d.ts +17 -0
  20. package/dist/components/model-uploader/index.js +93 -0
  21. package/dist/components/tree/index.d.ts +14 -0
  22. package/dist/components/tree/index.js +50 -0
  23. package/dist/components/tree/node.d.ts +23 -0
  24. package/dist/components/tree/node.js +185 -0
  25. package/dist/index.d.ts +4 -0
  26. package/dist/index.js +43 -0
  27. package/dist/style.css +1193 -0
  28. package/dist/theme.d.ts +2 -0
  29. package/dist/theme.js +96 -0
  30. package/dist/tokens/materials.d.ts +4 -0
  31. package/dist/tokens/materials.js +4 -0
  32. package/dist/tokens/nexus.d.ts +51 -0
  33. package/dist/tokens/nexus.js +42 -0
  34. package/dist/ui/avatar/index.d.ts +11 -0
  35. package/dist/ui/avatar/index.js +55 -0
  36. package/dist/ui/badge/index.d.ts +2 -0
  37. package/dist/ui/badge/index.js +45 -0
  38. package/dist/ui/button.d.ts +8 -0
  39. package/dist/ui/button.js +61 -0
  40. package/dist/ui/carousel/index.d.ts +43 -0
  41. package/dist/ui/carousel/index.js +186 -0
  42. package/dist/ui/checkbox/index.d.ts +4 -0
  43. package/dist/ui/checkbox/index.js +34 -0
  44. package/dist/ui/collapsible/index.d.ts +9 -0
  45. package/dist/ui/collapsible/index.js +7 -0
  46. package/dist/ui/dialog/confirm.d.ts +20 -0
  47. package/dist/ui/dialog/confirm.js +80 -0
  48. package/dist/ui/dialog/dialog.d.ts +26 -0
  49. package/dist/ui/dialog/dialog.js +97 -0
  50. package/dist/ui/dialog/index.d.ts +2 -0
  51. package/dist/ui/drawer.d.ts +22 -0
  52. package/dist/ui/drawer.js +98 -0
  53. package/dist/ui/form.d.ts +33 -0
  54. package/dist/ui/form.js +138 -0
  55. package/dist/ui/index.d.ts +24 -0
  56. package/dist/ui/input-otp.d.ts +14 -0
  57. package/dist/ui/input-otp.js +73 -0
  58. package/dist/ui/label.d.ts +4 -0
  59. package/dist/ui/label.js +32 -0
  60. package/dist/ui/masonry/index.d.ts +13 -0
  61. package/dist/ui/masonry/index.js +45 -0
  62. package/dist/ui/popover/index.d.ts +15 -0
  63. package/dist/ui/popover/index.js +78 -0
  64. package/dist/ui/progress.d.ts +6 -0
  65. package/dist/ui/progress.js +48 -0
  66. package/dist/ui/select/index.d.ts +21 -0
  67. package/dist/ui/select/index.js +127 -0
  68. package/dist/ui/slider/index.d.ts +9 -0
  69. package/dist/ui/slider/index.js +87 -0
  70. package/dist/ui/snap-input.d.ts +7 -0
  71. package/dist/ui/snap-input.js +38 -0
  72. package/dist/ui/sonner.d.ts +5 -0
  73. package/dist/ui/sonner.js +50 -0
  74. package/dist/ui/switch.d.ts +4 -0
  75. package/dist/ui/switch.js +33 -0
  76. package/dist/ui/table/index.d.ts +22 -0
  77. package/dist/ui/table/index.js +70 -0
  78. package/dist/ui/tabs/index.d.ts +12 -0
  79. package/dist/ui/tabs/index.js +60 -0
  80. package/dist/ui/toggle/index.d.ts +2 -0
  81. package/dist/ui/toggle/toggle-group.d.ts +9 -0
  82. package/dist/ui/toggle/toggle-group.js +54 -0
  83. package/dist/ui/toggle/toggle.d.ts +11 -0
  84. package/dist/ui/toggle/toggle.js +45 -0
  85. package/dist/ui/tooltip/index.d.ts +17 -0
  86. package/dist/ui/tooltip/index.js +68 -0
  87. package/dist/utils/config.d.ts +2 -0
  88. package/dist/utils/config.js +48 -0
  89. package/dist/utils/index.d.ts +2 -0
  90. package/dist/utils/utils.d.ts +8 -0
  91. package/dist/utils/utils.js +91 -0
  92. package/package.json +148 -0
@@ -0,0 +1,3 @@
1
+ const loading = "data:image/webp;base64,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";
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 };
@@ -0,0 +1,4 @@
1
+ export * from './components';
2
+ export * from './theme';
3
+ export * from './ui';
4
+ export * from './utils';
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 };