@tangle-network/sandbox-ui 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +68 -0
- package/dist/auth.d.ts +57 -0
- package/dist/auth.js +14 -0
- package/dist/branding-DCi5VEik.d.ts +13 -0
- package/dist/button-BidTtuRS.d.ts +15 -0
- package/dist/chat.d.ts +121 -0
- package/dist/chat.js +25 -0
- package/dist/chunk-2UHPE5T7.js +201 -0
- package/dist/chunk-4EIWPJMJ.js +545 -0
- package/dist/chunk-6MQIDUPA.js +502 -0
- package/dist/chunk-B26TQ7SA.js +47 -0
- package/dist/chunk-E6FS7R4X.js +109 -0
- package/dist/chunk-GRYHFH5O.js +110 -0
- package/dist/chunk-HMND7JPA.js +868 -0
- package/dist/chunk-HRMUF35V.js +19 -0
- package/dist/chunk-HYEAX3DC.js +822 -0
- package/dist/chunk-KMXV7DDX.js +174 -0
- package/dist/chunk-KYY2X6LY.js +318 -0
- package/dist/chunk-L6ZDH5F4.js +334 -0
- package/dist/chunk-LTFK464G.js +103 -0
- package/dist/chunk-M34OA6PQ.js +233 -0
- package/dist/chunk-M6VLC32S.js +219 -0
- package/dist/chunk-MCGKDCOR.js +173 -0
- package/dist/chunk-NI2EI43H.js +294 -0
- package/dist/chunk-OU4TRNQZ.js +173 -0
- package/dist/chunk-QD4QE5P5.js +40 -0
- package/dist/chunk-QSQBDR3N.js +180 -0
- package/dist/chunk-RQHJBTEU.js +10 -0
- package/dist/chunk-U62G5TS7.js +472 -0
- package/dist/chunk-ZOL2TR5M.js +475 -0
- package/dist/dashboard.d.ts +111 -0
- package/dist/dashboard.js +26 -0
- package/dist/editor.d.ts +196 -0
- package/dist/editor.js +713 -0
- package/dist/expanded-tool-detail-OkXGqTHe.d.ts +52 -0
- package/dist/files.d.ts +66 -0
- package/dist/files.js +11 -0
- package/dist/hooks.d.ts +22 -0
- package/dist/hooks.js +107 -0
- package/dist/index.d.ts +107 -0
- package/dist/index.js +551 -0
- package/dist/markdown.d.ts +55 -0
- package/dist/markdown.js +17 -0
- package/dist/pages.d.ts +89 -0
- package/dist/pages.js +1181 -0
- package/dist/parts-CyGkM6Fp.d.ts +50 -0
- package/dist/primitives.d.ts +189 -0
- package/dist/primitives.js +161 -0
- package/dist/run-CtFZ6s-D.d.ts +41 -0
- package/dist/run.d.ts +14 -0
- package/dist/run.js +29 -0
- package/dist/sidecar-CFU2W9j1.d.ts +8 -0
- package/dist/stores.d.ts +28 -0
- package/dist/stores.js +49 -0
- package/dist/terminal.d.ts +44 -0
- package/dist/terminal.js +160 -0
- package/dist/tool-call-feed-D5Ume-Pt.d.ts +66 -0
- package/dist/tool-display-BvsVW_Ur.d.ts +32 -0
- package/dist/types.d.ts +6 -0
- package/dist/types.js +0 -0
- package/dist/usage-chart-DINgSVL5.d.ts +60 -0
- package/dist/use-sidecar-auth-Bb0-w3lX.d.ts +339 -0
- package/dist/utils.d.ts +28 -0
- package/dist/utils.js +28 -0
- package/dist/workspace.d.ts +113 -0
- package/dist/workspace.js +15 -0
- package/package.json +174 -0
- package/src/styles/globals.css +230 -0
- package/src/styles/tokens.css +73 -0
- package/tailwind.config.cjs +99 -0
package/dist/utils.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import {
|
|
2
|
+
copyText,
|
|
3
|
+
timeAgo
|
|
4
|
+
} from "./chunk-QD4QE5P5.js";
|
|
5
|
+
import {
|
|
6
|
+
formatDuration,
|
|
7
|
+
truncateText
|
|
8
|
+
} from "./chunk-HRMUF35V.js";
|
|
9
|
+
import {
|
|
10
|
+
TOOL_CATEGORY_ICONS,
|
|
11
|
+
getToolCategory,
|
|
12
|
+
getToolDisplayMetadata,
|
|
13
|
+
getToolErrorText
|
|
14
|
+
} from "./chunk-QSQBDR3N.js";
|
|
15
|
+
import {
|
|
16
|
+
cn
|
|
17
|
+
} from "./chunk-RQHJBTEU.js";
|
|
18
|
+
export {
|
|
19
|
+
TOOL_CATEGORY_ICONS,
|
|
20
|
+
cn,
|
|
21
|
+
copyText,
|
|
22
|
+
formatDuration,
|
|
23
|
+
getToolCategory,
|
|
24
|
+
getToolDisplayMetadata,
|
|
25
|
+
getToolErrorText,
|
|
26
|
+
timeAgo,
|
|
27
|
+
truncateText
|
|
28
|
+
};
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
interface WorkspaceLayoutProps {
|
|
5
|
+
/** Left sidebar content (file tree, navigation) */
|
|
6
|
+
left?: ReactNode;
|
|
7
|
+
/** Left sidebar header */
|
|
8
|
+
leftHeader?: ReactNode;
|
|
9
|
+
/** Center main content */
|
|
10
|
+
center: ReactNode;
|
|
11
|
+
/** Center header (session name, etc.) */
|
|
12
|
+
centerHeader?: ReactNode;
|
|
13
|
+
/** Center footer (input bar) */
|
|
14
|
+
centerFooter?: ReactNode;
|
|
15
|
+
/** Right panel content (preview, editor) */
|
|
16
|
+
right?: ReactNode;
|
|
17
|
+
/** Right panel header */
|
|
18
|
+
rightHeader?: ReactNode;
|
|
19
|
+
/** Bottom panel (terminal) */
|
|
20
|
+
bottom?: ReactNode;
|
|
21
|
+
/** Default left panel state */
|
|
22
|
+
defaultLeftOpen?: boolean;
|
|
23
|
+
/** Default right panel state */
|
|
24
|
+
defaultRightOpen?: boolean;
|
|
25
|
+
/** Default bottom panel state */
|
|
26
|
+
defaultBottomOpen?: boolean;
|
|
27
|
+
className?: string;
|
|
28
|
+
}
|
|
29
|
+
declare function WorkspaceLayout({ left, leftHeader, center, centerHeader, centerFooter, right, rightHeader, bottom, defaultLeftOpen, defaultRightOpen, defaultBottomOpen, className, }: WorkspaceLayoutProps): react_jsx_runtime.JSX.Element;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* StatusBar — bottom bar with model selector, context badges, credits.
|
|
33
|
+
*/
|
|
34
|
+
interface ContextBadge {
|
|
35
|
+
id: string;
|
|
36
|
+
label: string;
|
|
37
|
+
count?: number;
|
|
38
|
+
}
|
|
39
|
+
interface StatusBarProps {
|
|
40
|
+
modelLabel?: string;
|
|
41
|
+
onModelClick?: () => void;
|
|
42
|
+
credits?: number;
|
|
43
|
+
contextBadges?: ContextBadge[];
|
|
44
|
+
onRemoveBadge?: (id: string) => void;
|
|
45
|
+
status?: "connected" | "connecting" | "disconnected" | "provisioning";
|
|
46
|
+
className?: string;
|
|
47
|
+
}
|
|
48
|
+
declare function StatusBar({ modelLabel, onModelClick, credits, contextBadges, onRemoveBadge, status, className, }: StatusBarProps): react_jsx_runtime.JSX.Element;
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* StatusBanner — full-width notification banner for connection/provisioning states.
|
|
52
|
+
*/
|
|
53
|
+
type BannerType = "provisioning" | "connecting" | "error" | "success" | "info";
|
|
54
|
+
interface StatusBannerProps {
|
|
55
|
+
type: BannerType;
|
|
56
|
+
message: string;
|
|
57
|
+
detail?: string;
|
|
58
|
+
onDismiss?: () => void;
|
|
59
|
+
className?: string;
|
|
60
|
+
}
|
|
61
|
+
declare function StatusBanner({ type, message, detail, onDismiss, className }: StatusBannerProps): react_jsx_runtime.JSX.Element;
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* AuditResults — structured pass/fail display for form audits.
|
|
65
|
+
*/
|
|
66
|
+
interface AuditCheck {
|
|
67
|
+
label: string;
|
|
68
|
+
expected: string | number;
|
|
69
|
+
actual?: string | number | null;
|
|
70
|
+
passed: boolean;
|
|
71
|
+
tolerance?: number;
|
|
72
|
+
fieldPath?: string;
|
|
73
|
+
}
|
|
74
|
+
interface FormAudit {
|
|
75
|
+
formId: string;
|
|
76
|
+
formName?: string;
|
|
77
|
+
found: boolean;
|
|
78
|
+
checks: AuditCheck[];
|
|
79
|
+
passed: number;
|
|
80
|
+
failed: number;
|
|
81
|
+
}
|
|
82
|
+
interface AuditResultsProps {
|
|
83
|
+
forms: FormAudit[];
|
|
84
|
+
crossFormChecks?: AuditCheck[];
|
|
85
|
+
overallScore?: number;
|
|
86
|
+
className?: string;
|
|
87
|
+
}
|
|
88
|
+
declare function AuditResults({ forms, crossFormChecks, overallScore, className }: AuditResultsProps): react_jsx_runtime.JSX.Element;
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Terminal — read-only terminal output panel.
|
|
92
|
+
*
|
|
93
|
+
* Shows agent's bash command output with basic ANSI color support.
|
|
94
|
+
* Collapsible, auto-scrolls to bottom.
|
|
95
|
+
*/
|
|
96
|
+
interface TerminalLine {
|
|
97
|
+
id: string;
|
|
98
|
+
text: string;
|
|
99
|
+
type: "command" | "stdout" | "stderr" | "system";
|
|
100
|
+
timestamp?: number;
|
|
101
|
+
}
|
|
102
|
+
interface TerminalProps {
|
|
103
|
+
lines: TerminalLine[];
|
|
104
|
+
title?: string;
|
|
105
|
+
isCollapsed?: boolean;
|
|
106
|
+
onToggle?: () => void;
|
|
107
|
+
onClose?: () => void;
|
|
108
|
+
maxHeight?: number;
|
|
109
|
+
className?: string;
|
|
110
|
+
}
|
|
111
|
+
declare function TerminalPanel({ lines, title, isCollapsed, onToggle, onClose, maxHeight, className, }: TerminalProps): react_jsx_runtime.JSX.Element;
|
|
112
|
+
|
|
113
|
+
export { type AuditCheck, AuditResults, type AuditResultsProps, type BannerType, type ContextBadge, type FormAudit, StatusBanner, type StatusBannerProps, StatusBar, type StatusBarProps, type TerminalLine, TerminalPanel, type TerminalProps, WorkspaceLayout, type WorkspaceLayoutProps };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AuditResults,
|
|
3
|
+
StatusBanner,
|
|
4
|
+
StatusBar,
|
|
5
|
+
TerminalPanel,
|
|
6
|
+
WorkspaceLayout
|
|
7
|
+
} from "./chunk-KYY2X6LY.js";
|
|
8
|
+
import "./chunk-RQHJBTEU.js";
|
|
9
|
+
export {
|
|
10
|
+
AuditResults,
|
|
11
|
+
StatusBanner,
|
|
12
|
+
StatusBar,
|
|
13
|
+
TerminalPanel,
|
|
14
|
+
WorkspaceLayout
|
|
15
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@tangle-network/sandbox-ui",
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "Unified UI component library for Tangle Sandbox — primitives, chat, dashboard, terminal, editor, and workspace components",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts"
|
|
12
|
+
},
|
|
13
|
+
"./primitives": {
|
|
14
|
+
"import": "./dist/primitives.js",
|
|
15
|
+
"types": "./dist/primitives.d.ts"
|
|
16
|
+
},
|
|
17
|
+
"./chat": {
|
|
18
|
+
"import": "./dist/chat.js",
|
|
19
|
+
"types": "./dist/chat.d.ts"
|
|
20
|
+
},
|
|
21
|
+
"./run": {
|
|
22
|
+
"import": "./dist/run.js",
|
|
23
|
+
"types": "./dist/run.d.ts"
|
|
24
|
+
},
|
|
25
|
+
"./workspace": {
|
|
26
|
+
"import": "./dist/workspace.js",
|
|
27
|
+
"types": "./dist/workspace.d.ts"
|
|
28
|
+
},
|
|
29
|
+
"./files": {
|
|
30
|
+
"import": "./dist/files.js",
|
|
31
|
+
"types": "./dist/files.d.ts"
|
|
32
|
+
},
|
|
33
|
+
"./dashboard": {
|
|
34
|
+
"import": "./dist/dashboard.js",
|
|
35
|
+
"types": "./dist/dashboard.d.ts"
|
|
36
|
+
},
|
|
37
|
+
"./editor": {
|
|
38
|
+
"import": "./dist/editor.js",
|
|
39
|
+
"types": "./dist/editor.d.ts"
|
|
40
|
+
},
|
|
41
|
+
"./terminal": {
|
|
42
|
+
"import": "./dist/terminal.js",
|
|
43
|
+
"types": "./dist/terminal.d.ts"
|
|
44
|
+
},
|
|
45
|
+
"./markdown": {
|
|
46
|
+
"import": "./dist/markdown.js",
|
|
47
|
+
"types": "./dist/markdown.d.ts"
|
|
48
|
+
},
|
|
49
|
+
"./auth": {
|
|
50
|
+
"import": "./dist/auth.js",
|
|
51
|
+
"types": "./dist/auth.d.ts"
|
|
52
|
+
},
|
|
53
|
+
"./pages": {
|
|
54
|
+
"import": "./dist/pages.js",
|
|
55
|
+
"types": "./dist/pages.d.ts"
|
|
56
|
+
},
|
|
57
|
+
"./hooks": {
|
|
58
|
+
"import": "./dist/hooks.js",
|
|
59
|
+
"types": "./dist/hooks.d.ts"
|
|
60
|
+
},
|
|
61
|
+
"./stores": {
|
|
62
|
+
"import": "./dist/stores.js",
|
|
63
|
+
"types": "./dist/stores.d.ts"
|
|
64
|
+
},
|
|
65
|
+
"./types": {
|
|
66
|
+
"import": "./dist/types.js",
|
|
67
|
+
"types": "./dist/types.d.ts"
|
|
68
|
+
},
|
|
69
|
+
"./utils": {
|
|
70
|
+
"import": "./dist/utils.js",
|
|
71
|
+
"types": "./dist/utils.d.ts"
|
|
72
|
+
},
|
|
73
|
+
"./styles": "./dist/styles.css",
|
|
74
|
+
"./globals.css": "./src/styles/globals.css",
|
|
75
|
+
"./tailwind": "./tailwind.config.cjs"
|
|
76
|
+
},
|
|
77
|
+
"files": [
|
|
78
|
+
"dist",
|
|
79
|
+
"src/styles",
|
|
80
|
+
"tailwind.config.cjs"
|
|
81
|
+
],
|
|
82
|
+
"scripts": {
|
|
83
|
+
"build": "tsup",
|
|
84
|
+
"dev": "tsup --watch",
|
|
85
|
+
"typecheck": "tsc --noEmit"
|
|
86
|
+
},
|
|
87
|
+
"peerDependencies": {
|
|
88
|
+
"react": "^18 || ^19",
|
|
89
|
+
"react-dom": "^18 || ^19"
|
|
90
|
+
},
|
|
91
|
+
"peerDependenciesMeta": {
|
|
92
|
+
"@xterm/xterm": {
|
|
93
|
+
"optional": true
|
|
94
|
+
},
|
|
95
|
+
"@xterm/addon-fit": {
|
|
96
|
+
"optional": true
|
|
97
|
+
},
|
|
98
|
+
"@xterm/addon-web-links": {
|
|
99
|
+
"optional": true
|
|
100
|
+
},
|
|
101
|
+
"@tanstack/react-query": {
|
|
102
|
+
"optional": true
|
|
103
|
+
},
|
|
104
|
+
"nanostores": {
|
|
105
|
+
"optional": true
|
|
106
|
+
},
|
|
107
|
+
"@nanostores/react": {
|
|
108
|
+
"optional": true
|
|
109
|
+
},
|
|
110
|
+
"@hocuspocus/provider": {
|
|
111
|
+
"optional": true
|
|
112
|
+
},
|
|
113
|
+
"@tiptap/core": {
|
|
114
|
+
"optional": true
|
|
115
|
+
},
|
|
116
|
+
"@tiptap/react": {
|
|
117
|
+
"optional": true
|
|
118
|
+
},
|
|
119
|
+
"@tiptap/starter-kit": {
|
|
120
|
+
"optional": true
|
|
121
|
+
},
|
|
122
|
+
"@tiptap/extension-collaboration": {
|
|
123
|
+
"optional": true
|
|
124
|
+
},
|
|
125
|
+
"@tiptap/extension-collaboration-cursor": {
|
|
126
|
+
"optional": true
|
|
127
|
+
},
|
|
128
|
+
"yjs": {
|
|
129
|
+
"optional": true
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
"dependencies": {
|
|
133
|
+
"@radix-ui/react-avatar": "^1.1.0",
|
|
134
|
+
"@radix-ui/react-collapsible": "^1.1.0",
|
|
135
|
+
"@radix-ui/react-dialog": "^1.1.0",
|
|
136
|
+
"@radix-ui/react-dropdown-menu": "^2.1.0",
|
|
137
|
+
"@radix-ui/react-label": "^2.1.0",
|
|
138
|
+
"@radix-ui/react-progress": "^1.1.0",
|
|
139
|
+
"@radix-ui/react-select": "^2.1.0",
|
|
140
|
+
"@radix-ui/react-slot": "^1.1.0",
|
|
141
|
+
"@radix-ui/react-switch": "^1.1.0",
|
|
142
|
+
"@radix-ui/react-tabs": "^1.1.0",
|
|
143
|
+
"@radix-ui/react-toast": "^1.2.0",
|
|
144
|
+
"class-variance-authority": "^0.7.0",
|
|
145
|
+
"clsx": "^2.1.1",
|
|
146
|
+
"lucide-react": "^0.469.0",
|
|
147
|
+
"react-markdown": "^10.1.0",
|
|
148
|
+
"react-pdf": "^9.2.1",
|
|
149
|
+
"rehype-sanitize": "^6.0.0",
|
|
150
|
+
"remark-gfm": "^4.0.1",
|
|
151
|
+
"tailwind-merge": "^3.0.2"
|
|
152
|
+
},
|
|
153
|
+
"devDependencies": {
|
|
154
|
+
"@hocuspocus/provider": "^3.4.4",
|
|
155
|
+
"@nanostores/react": "^1.1.0",
|
|
156
|
+
"@tanstack/react-query": "^5.91.0",
|
|
157
|
+
"@tiptap/core": "^3.20.4",
|
|
158
|
+
"@tiptap/extension-collaboration": "^3.20.4",
|
|
159
|
+
"@tiptap/extension-collaboration-cursor": "^2.26.2",
|
|
160
|
+
"@tiptap/react": "^3.20.4",
|
|
161
|
+
"@tiptap/starter-kit": "^3.20.4",
|
|
162
|
+
"@types/react": "^19.1.2",
|
|
163
|
+
"@xterm/addon-fit": "^0.11.0",
|
|
164
|
+
"@xterm/addon-web-links": "^0.12.0",
|
|
165
|
+
"@xterm/xterm": "^6.0.0",
|
|
166
|
+
"nanostores": "^1.2.0",
|
|
167
|
+
"react": "^19.1.0",
|
|
168
|
+
"react-dom": "^19.1.0",
|
|
169
|
+
"tailwindcss": "^4.1.4",
|
|
170
|
+
"tsup": "^8.4.0",
|
|
171
|
+
"typescript": "^5.8.3",
|
|
172
|
+
"yjs": "^13.6.30"
|
|
173
|
+
}
|
|
174
|
+
}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
@tailwind base;
|
|
2
|
+
@tailwind components;
|
|
3
|
+
@tailwind utilities;
|
|
4
|
+
|
|
5
|
+
@layer base {
|
|
6
|
+
:root {
|
|
7
|
+
--background: 0 0% 98%;
|
|
8
|
+
--foreground: 0 0% 9%;
|
|
9
|
+
--card: 0 0% 100%;
|
|
10
|
+
--card-foreground: 0 0% 9%;
|
|
11
|
+
--popover: 0 0% 100%;
|
|
12
|
+
--popover-foreground: 0 0% 9%;
|
|
13
|
+
--primary: 270 80% 55%;
|
|
14
|
+
--primary-foreground: 0 0% 100%;
|
|
15
|
+
--secondary: 0 0% 94%;
|
|
16
|
+
--secondary-foreground: 0 0% 20%;
|
|
17
|
+
--muted: 0 0% 94%;
|
|
18
|
+
--muted-foreground: 0 0% 40%;
|
|
19
|
+
--accent: 0 0% 94%;
|
|
20
|
+
--accent-foreground: 0 0% 9%;
|
|
21
|
+
--destructive: 0 84% 60%;
|
|
22
|
+
--destructive-foreground: 0 0% 100%;
|
|
23
|
+
--border: 0 0% 88%;
|
|
24
|
+
--input: 0 0% 88%;
|
|
25
|
+
--ring: 270 80% 55%;
|
|
26
|
+
--radius: 0.625rem;
|
|
27
|
+
|
|
28
|
+
/* Product accent colors -- Tangle purple */
|
|
29
|
+
--sandbox: 270 80% 55%;
|
|
30
|
+
--sandbox-glow: 270 75% 58%;
|
|
31
|
+
|
|
32
|
+
/* Status colors */
|
|
33
|
+
--success: 142 71% 40%;
|
|
34
|
+
--warning: 38 92% 45%;
|
|
35
|
+
--error: 0 84% 55%;
|
|
36
|
+
--info: 217 91% 55%;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.dark {
|
|
40
|
+
--background: 0 0% 5%;
|
|
41
|
+
--foreground: 0 0% 96%;
|
|
42
|
+
--card: 0 0% 8%;
|
|
43
|
+
--card-foreground: 0 0% 96%;
|
|
44
|
+
--popover: 0 0% 8%;
|
|
45
|
+
--popover-foreground: 0 0% 96%;
|
|
46
|
+
--primary: 0 0% 96%;
|
|
47
|
+
--primary-foreground: 0 0% 9%;
|
|
48
|
+
--secondary: 0 0% 14%;
|
|
49
|
+
--secondary-foreground: 0 0% 96%;
|
|
50
|
+
--muted: 0 0% 14%;
|
|
51
|
+
--muted-foreground: 0 0% 72%;
|
|
52
|
+
--accent: 0 0% 16%;
|
|
53
|
+
--accent-foreground: 0 0% 96%;
|
|
54
|
+
--destructive: 0 62.8% 30.6%;
|
|
55
|
+
--destructive-foreground: 0 0% 96%;
|
|
56
|
+
--border: 0 0% 18%;
|
|
57
|
+
--input: 0 0% 18%;
|
|
58
|
+
--ring: 0 0% 83.1%;
|
|
59
|
+
|
|
60
|
+
--sandbox: 270 95% 65%;
|
|
61
|
+
--sandbox-glow: 270 90% 66%;
|
|
62
|
+
|
|
63
|
+
--success: 142 71% 45%;
|
|
64
|
+
--warning: 38 92% 50%;
|
|
65
|
+
--error: 0 84% 60%;
|
|
66
|
+
--info: 217 91% 60%;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
* {
|
|
70
|
+
@apply border-border;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
body {
|
|
74
|
+
@apply bg-background text-foreground antialiased;
|
|
75
|
+
font-feature-settings:
|
|
76
|
+
"rlig" 1,
|
|
77
|
+
"calt" 1;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/* Custom scrollbar */
|
|
81
|
+
::-webkit-scrollbar {
|
|
82
|
+
width: 8px;
|
|
83
|
+
height: 8px;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
::-webkit-scrollbar-track {
|
|
87
|
+
@apply bg-transparent;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
::-webkit-scrollbar-thumb {
|
|
91
|
+
@apply bg-border rounded-full;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
::-webkit-scrollbar-thumb:hover {
|
|
95
|
+
@apply bg-muted-foreground/50;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
@layer utilities {
|
|
100
|
+
/* Gradient text -- Tangle purple */
|
|
101
|
+
.text-gradient-sandbox {
|
|
102
|
+
@apply bg-clip-text text-transparent bg-gradient-to-r from-purple-400 to-violet-400;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/* Glow effects */
|
|
106
|
+
.glow-sandbox {
|
|
107
|
+
box-shadow: 0 0 40px -10px hsl(var(--sandbox) / 0.4);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/* Glass effect */
|
|
111
|
+
.glass {
|
|
112
|
+
@apply bg-card/80 backdrop-blur-xl border border-border/50;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/* Subtle noise texture */
|
|
116
|
+
.noise {
|
|
117
|
+
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noise'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.8' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noise)'/%3E%3C/svg%3E");
|
|
118
|
+
opacity: 0.02;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/* Terminal styling */
|
|
122
|
+
.terminal-cursor {
|
|
123
|
+
@apply inline-block w-2 h-5 bg-foreground animate-pulse;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/* Shimmer animation */
|
|
127
|
+
.shimmer {
|
|
128
|
+
background: linear-gradient(
|
|
129
|
+
90deg,
|
|
130
|
+
hsl(var(--muted)) 0%,
|
|
131
|
+
hsl(var(--accent)) 50%,
|
|
132
|
+
hsl(var(--muted)) 100%
|
|
133
|
+
);
|
|
134
|
+
background-size: 200% 100%;
|
|
135
|
+
animation: shimmer 2s infinite;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
@keyframes shimmer {
|
|
139
|
+
0% {
|
|
140
|
+
background-position: -200% 0;
|
|
141
|
+
}
|
|
142
|
+
100% {
|
|
143
|
+
background-position: 200% 0;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/* Fade in animation */
|
|
148
|
+
.animate-in {
|
|
149
|
+
animation: fade-in 0.3s ease-out;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
@keyframes fade-in {
|
|
153
|
+
from {
|
|
154
|
+
opacity: 0;
|
|
155
|
+
transform: translateY(10px);
|
|
156
|
+
}
|
|
157
|
+
to {
|
|
158
|
+
opacity: 1;
|
|
159
|
+
transform: translateY(0);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/* Pulse ring animation */
|
|
164
|
+
.pulse-ring {
|
|
165
|
+
@apply relative;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
.pulse-ring::before {
|
|
169
|
+
content: "";
|
|
170
|
+
@apply absolute inset-0 rounded-full;
|
|
171
|
+
animation: pulse-ring 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
@keyframes pulse-ring {
|
|
175
|
+
0%,
|
|
176
|
+
100% {
|
|
177
|
+
box-shadow: 0 0 0 0 currentColor;
|
|
178
|
+
opacity: 0.4;
|
|
179
|
+
}
|
|
180
|
+
50% {
|
|
181
|
+
box-shadow: 0 0 0 8px currentColor;
|
|
182
|
+
opacity: 0;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/* Fonts -- Inter (UI) + JetBrains Mono (code).
|
|
188
|
+
Using @font-face with font-display: swap to avoid render-blocking. */
|
|
189
|
+
@font-face {
|
|
190
|
+
font-family: "Inter";
|
|
191
|
+
src: url("https://fonts.gstatic.com/s/inter/v18/UcCO3FwrK3iLTeHuS_nVMrMxCp50SjIw2boKoduKmMEVuLyfAZ9hiA.woff2") format("woff2");
|
|
192
|
+
font-weight: 300;
|
|
193
|
+
font-style: normal;
|
|
194
|
+
font-display: swap;
|
|
195
|
+
}
|
|
196
|
+
@font-face {
|
|
197
|
+
font-family: "Inter";
|
|
198
|
+
src: url("https://fonts.gstatic.com/s/inter/v18/UcCO3FwrK3iLTeHuS_nVMrMxCp50SjIw2boKoduKmMEVuLyfAZ9hiA.woff2") format("woff2");
|
|
199
|
+
font-weight: 400;
|
|
200
|
+
font-style: normal;
|
|
201
|
+
font-display: swap;
|
|
202
|
+
}
|
|
203
|
+
@font-face {
|
|
204
|
+
font-family: "Inter";
|
|
205
|
+
src: url("https://fonts.gstatic.com/s/inter/v18/UcCO3FwrK3iLTeHuS_nVMrMxCp50SjIw2boKoduKmMEVuI2fAZ9hiA.woff2") format("woff2");
|
|
206
|
+
font-weight: 500;
|
|
207
|
+
font-style: normal;
|
|
208
|
+
font-display: swap;
|
|
209
|
+
}
|
|
210
|
+
@font-face {
|
|
211
|
+
font-family: "Inter";
|
|
212
|
+
src: url("https://fonts.gstatic.com/s/inter/v18/UcCO3FwrK3iLTeHuS_nVMrMxCp50SjIw2boKoduKmMEVuFuYAZ9hiA.woff2") format("woff2");
|
|
213
|
+
font-weight: 700;
|
|
214
|
+
font-style: normal;
|
|
215
|
+
font-display: swap;
|
|
216
|
+
}
|
|
217
|
+
@font-face {
|
|
218
|
+
font-family: "JetBrains Mono";
|
|
219
|
+
src: url("https://fonts.gstatic.com/s/jetbrainsmono/v18/tDbY2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKxTOlOV.woff2") format("woff2");
|
|
220
|
+
font-weight: 400;
|
|
221
|
+
font-style: normal;
|
|
222
|
+
font-display: swap;
|
|
223
|
+
}
|
|
224
|
+
@font-face {
|
|
225
|
+
font-family: "JetBrains Mono";
|
|
226
|
+
src: url("https://fonts.gstatic.com/s/jetbrainsmono/v18/tDbY2o-flEEny0FZhsfKu5WU4zr3E_BX0PnT8RD8yKxTPlOV.woff2") format("woff2");
|
|
227
|
+
font-weight: 500;
|
|
228
|
+
font-style: normal;
|
|
229
|
+
font-display: swap;
|
|
230
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/* Tangle Design System Tokens */
|
|
2
|
+
|
|
3
|
+
:root {
|
|
4
|
+
/* Brand gradient */
|
|
5
|
+
--tangle-gradient: linear-gradient(135deg, #8E59FF, #6888F9);
|
|
6
|
+
--tangle-gradient-text: linear-gradient(45deg, #5f5bee, #465cd2);
|
|
7
|
+
|
|
8
|
+
/* Backgrounds */
|
|
9
|
+
--bg-root: #000000;
|
|
10
|
+
--bg-dark: #1f1d2b;
|
|
11
|
+
--bg-card: #161425;
|
|
12
|
+
--bg-elevated: #1e1c30;
|
|
13
|
+
--bg-section: #171528;
|
|
14
|
+
--bg-input: #141428;
|
|
15
|
+
--bg-hover: #1a1a30;
|
|
16
|
+
|
|
17
|
+
/* Text */
|
|
18
|
+
--text-primary: #ffffff;
|
|
19
|
+
--text-secondary: #aab0bc;
|
|
20
|
+
--text-muted: #6b7094;
|
|
21
|
+
|
|
22
|
+
/* Brand */
|
|
23
|
+
--brand-primary: #605dba;
|
|
24
|
+
--brand-strong: #6941c6;
|
|
25
|
+
--brand-cool: #6172f3;
|
|
26
|
+
--brand-glow: #9e77ed;
|
|
27
|
+
--brand-purple: #7f56d9;
|
|
28
|
+
--brand-vibrant: #4a3aff;
|
|
29
|
+
|
|
30
|
+
/* Borders */
|
|
31
|
+
--border-subtle: rgba(255, 255, 255, 0.06);
|
|
32
|
+
--border-default: rgba(255, 255, 255, 0.08);
|
|
33
|
+
--border-hover: rgba(255, 255, 255, 0.1);
|
|
34
|
+
--border-accent: rgba(142, 89, 255, 0.2);
|
|
35
|
+
--border-accent-hover: rgba(142, 89, 255, 0.4);
|
|
36
|
+
|
|
37
|
+
/* Buttons */
|
|
38
|
+
--btn-primary-bg: #1e116e;
|
|
39
|
+
--btn-primary-hover: #281ca5;
|
|
40
|
+
--btn-cta-bg: #ffffff;
|
|
41
|
+
--btn-cta-text: #1d1d1d;
|
|
42
|
+
|
|
43
|
+
/* Code syntax */
|
|
44
|
+
--code-keyword: #c084fc;
|
|
45
|
+
--code-string: #a78bfa;
|
|
46
|
+
--code-function: #60a5fa;
|
|
47
|
+
--code-number: #fcd34d;
|
|
48
|
+
--code-success: #4ade80;
|
|
49
|
+
--code-comment: rgba(255, 255, 255, 0.25);
|
|
50
|
+
--code-error: #f87171;
|
|
51
|
+
|
|
52
|
+
/* Shadows */
|
|
53
|
+
--shadow-card: 0 4px 24px rgba(0, 0, 0, 0.3), 0 0 0 1px rgba(142, 89, 255, 0.1);
|
|
54
|
+
--shadow-dropdown: 0 20px 60px rgba(0, 0, 0, 0.5);
|
|
55
|
+
--shadow-glow: 0 0 40px rgba(130, 99, 255, 0.15);
|
|
56
|
+
|
|
57
|
+
/* Radii */
|
|
58
|
+
--radius-sm: 8px;
|
|
59
|
+
--radius-md: 12px;
|
|
60
|
+
--radius-lg: 1.25rem;
|
|
61
|
+
--radius-xl: 1.5rem;
|
|
62
|
+
--radius-pill: 48px;
|
|
63
|
+
--radius-full: 62.5rem;
|
|
64
|
+
|
|
65
|
+
/* Transitions */
|
|
66
|
+
--transition-fast: 0.15s ease;
|
|
67
|
+
--transition-default: 0.2s ease;
|
|
68
|
+
--transition-medium: 0.3s ease;
|
|
69
|
+
|
|
70
|
+
/* Fonts */
|
|
71
|
+
--font-sans: 'Satoshi', ui-sans-serif, system-ui, sans-serif;
|
|
72
|
+
--font-mono: 'JetBrains Mono', ui-monospace, monospace;
|
|
73
|
+
}
|