bubble-chart-js 1.0.19 → 2.0.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 +1 -1
- package/demo/glassmorphism.html +323 -0
- package/demo/index.html +739 -0
- package/dist/bubbleChart.cjs.js +1 -1
- package/dist/bubbleChart.esm.js +1 -1
- package/dist/bubbleChart.umd.js +1 -1
- package/docs/documentation.html +438 -0
- package/docs/examples.html +689 -0
- package/docs/index.html +432 -0
- package/docs/landing_test.html +337 -0
- package/docs/playground.html +345 -0
- package/docs/process_html.js +105 -0
- package/docs/temp/5a86d.html +248 -0
- package/docs/temp/b0cbe.html +276 -0
- package/docs/temp/docs_desktop.html +341 -0
- package/docs/temp/docs_mobile.html +291 -0
- package/docs/temp/examples_desktop.html +372 -0
- package/docs/temp/examples_mobile.html +317 -0
- package/docs/temp/landing_desktop.html +337 -0
- package/docs/temp/landing_mobile.html +270 -0
- package/docs/temp/playground_desktop.html +283 -0
- package/docs/temp/playground_mobile.html +236 -0
- package/examples/test.html +194 -0
- package/examples/test2.html +103 -0
- package/package.json +7 -3
- package/scripts/generate-fixtures.ts +45 -0
- package/spec/config-defaults.json +16 -0
- package/spec/fixtures/3-bubbles.expected.json +27 -0
- package/spec/fixtures/3-bubbles.input.json +10 -0
- package/spec/fixtures/equal-values.expected.json +34 -0
- package/spec/fixtures/equal-values.input.json +11 -0
- package/spec/fixtures/many-bubbles.expected.json +76 -0
- package/spec/fixtures/many-bubbles.input.json +17 -0
- package/spec/fixtures/single-bubble.expected.json +13 -0
- package/spec/fixtures/single-bubble.input.json +8 -0
- package/spec/physics.json +11 -0
- package/tsconfig.scripts.json +8 -0
- package/dist/canvas.d.ts +0 -5
- package/dist/constants/app-constants.d.ts +0 -3
- package/dist/constants/physics.d.ts +0 -10
- package/dist/core/renderer.d.ts +0 -2
- package/dist/features/text-wrapper.d.ts +0 -2
- package/dist/features/tooltip.d.ts +0 -6
- package/dist/index.d.ts +0 -8
- package/dist/models/internal/data-item-info.d.ts +0 -7
- package/dist/models/public/bubble-chart.d.ts +0 -6
- package/dist/models/public/config/bubble-appearance.d.ts +0 -26
- package/dist/models/public/config/font-options.d.ts +0 -46
- package/dist/models/public/config/interaction-options.d.ts +0 -6
- package/dist/models/public/config/tooltip-config.d.ts +0 -4
- package/dist/models/public/config/tooltip-options.d.ts +0 -170
- package/dist/models/public/configuration.d.ts +0 -30
- package/dist/models/public/data-item.d.ts +0 -8
- package/dist/services/chart-service.d.ts +0 -5
- package/dist/services/render-service.d.ts +0 -3
- package/dist/utils/config.d.ts +0 -12
- package/dist/utils/helper.d.ts +0 -2
- package/dist/utils/validation.d.ts +0 -5
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
|
|
3
|
+
<html class="dark" lang="en"><head>
|
|
4
|
+
<meta charset="utf-8"/>
|
|
5
|
+
<meta content="width=device-width, initial-scale=1.0" name="viewport"/>
|
|
6
|
+
<title>Playground | bubble-chart-js</title>
|
|
7
|
+
<script src="https://cdn.tailwindcss.com?plugins=forms,container-queries"></script>
|
|
8
|
+
<link href="https://fonts.googleapis.com/css2?family=Manrope:wght@400;700;800&family=Inter:wght@400;500;600&family=Space+Grotesk:wght@400;500;700&display=swap" rel="stylesheet"/>
|
|
9
|
+
<link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:wght,FILL@100..700,0..1&display=swap" rel="stylesheet"/>
|
|
10
|
+
<link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:wght,FILL@100..700,0..1&display=swap" rel="stylesheet"/>
|
|
11
|
+
<script id="tailwind-config">
|
|
12
|
+
tailwind.config = {
|
|
13
|
+
darkMode: "class",
|
|
14
|
+
theme: {
|
|
15
|
+
extend: {
|
|
16
|
+
colors: {
|
|
17
|
+
"surface": "#090e1c",
|
|
18
|
+
"on-tertiary-container": "#005b29",
|
|
19
|
+
"on-error": "#490006",
|
|
20
|
+
"on-surface-variant": "#a6aabf",
|
|
21
|
+
"outline-variant": "#434759",
|
|
22
|
+
"surface-tint": "#72dcff",
|
|
23
|
+
"on-secondary-fixed": "#580078",
|
|
24
|
+
"surface-container": "#13192b",
|
|
25
|
+
"tertiary-fixed-dim": "#33ec7b",
|
|
26
|
+
"surface-container-highest": "#1e253b",
|
|
27
|
+
"error-container": "#9f0519",
|
|
28
|
+
"on-primary-fixed-variant": "#004c5e",
|
|
29
|
+
"on-tertiary-fixed-variant": "#00662e",
|
|
30
|
+
"inverse-surface": "#faf8ff",
|
|
31
|
+
"on-secondary-container": "#f1bfff",
|
|
32
|
+
"primary-fixed": "#00d2ff",
|
|
33
|
+
"on-surface": "#e1e4fa",
|
|
34
|
+
"secondary": "#dd8bfb",
|
|
35
|
+
"surface-variant": "#1e253b",
|
|
36
|
+
"primary-fixed-dim": "#00c3ed",
|
|
37
|
+
"surface-bright": "#242b43",
|
|
38
|
+
"on-primary-fixed": "#002c38",
|
|
39
|
+
"error-dim": "#d7383b",
|
|
40
|
+
"surface-dim": "#090e1c",
|
|
41
|
+
"on-secondary": "#4c0068",
|
|
42
|
+
"tertiary-dim": "#33ec7b",
|
|
43
|
+
"background": "#090e1c",
|
|
44
|
+
"secondary-dim": "#ce7eec",
|
|
45
|
+
"inverse-on-surface": "#505466",
|
|
46
|
+
"secondary-fixed-dim": "#ebadff",
|
|
47
|
+
"inverse-primary": "#00687f",
|
|
48
|
+
"tertiary": "#a6ffb5",
|
|
49
|
+
"on-error-container": "#ffa8a3",
|
|
50
|
+
"on-tertiary-fixed": "#00461e",
|
|
51
|
+
"tertiary-container": "#49fb87",
|
|
52
|
+
"surface-container-high": "#181f33",
|
|
53
|
+
"error": "#ff716c",
|
|
54
|
+
"primary-dim": "#00c3ed",
|
|
55
|
+
"secondary-container": "#6e208c",
|
|
56
|
+
"on-tertiary": "#00652e",
|
|
57
|
+
"on-primary": "#004c5e",
|
|
58
|
+
"surface-container-low": "#0d1323",
|
|
59
|
+
"on-primary-container": "#004253",
|
|
60
|
+
"outline": "#707588",
|
|
61
|
+
"on-background": "#e1e4fa",
|
|
62
|
+
"surface-container-lowest": "#000000",
|
|
63
|
+
"primary-container": "#00d2ff",
|
|
64
|
+
"on-secondary-fixed-variant": "#792c97",
|
|
65
|
+
"primary": "#72dcff",
|
|
66
|
+
"tertiary-fixed": "#49fb87",
|
|
67
|
+
"secondary-fixed": "#f2c1ff"
|
|
68
|
+
},
|
|
69
|
+
fontFamily: {
|
|
70
|
+
"headline": ["Manrope"],
|
|
71
|
+
"body": ["Inter"],
|
|
72
|
+
"label": ["Space Grotesk"]
|
|
73
|
+
},
|
|
74
|
+
borderRadius: {"DEFAULT": "0.25rem", "lg": "0.5rem", "xl": "0.75rem", "full": "9999px"},
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
}
|
|
78
|
+
</script>
|
|
79
|
+
<style>
|
|
80
|
+
.glass-panel {
|
|
81
|
+
background: rgba(30, 37, 59, 0.6);
|
|
82
|
+
backdrop-filter: blur(12px);
|
|
83
|
+
}
|
|
84
|
+
.material-symbols-outlined {
|
|
85
|
+
font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24;
|
|
86
|
+
}
|
|
87
|
+
.code-shadow {
|
|
88
|
+
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.4);
|
|
89
|
+
}
|
|
90
|
+
/* Custom range slider styling */
|
|
91
|
+
input[type=range] {
|
|
92
|
+
-webkit-appearance: none;
|
|
93
|
+
background: transparent;
|
|
94
|
+
}
|
|
95
|
+
input[type=range]::-webkit-slider-runnable-track {
|
|
96
|
+
width: 100%;
|
|
97
|
+
height: 4px;
|
|
98
|
+
background: #434759;
|
|
99
|
+
border-radius: 2px;
|
|
100
|
+
}
|
|
101
|
+
input[type=range]::-webkit-slider-thumb {
|
|
102
|
+
-webkit-appearance: none;
|
|
103
|
+
height: 16px;
|
|
104
|
+
width: 16px;
|
|
105
|
+
border-radius: 50%;
|
|
106
|
+
background: #72dcff;
|
|
107
|
+
margin-top: -6px;
|
|
108
|
+
box-shadow: 0 0 10px rgba(114, 220, 255, 0.5);
|
|
109
|
+
}
|
|
110
|
+
</style>
|
|
111
|
+
</head>
|
|
112
|
+
<body class="bg-background text-on-surface font-body overflow-hidden">
|
|
113
|
+
<!-- TopNavBar -->
|
|
114
|
+
<header class="fixed top-0 w-full z-50 bg-[#090e1c]/60 backdrop-blur-xl shadow-[0_20px_40px_rgba(0,0,0,0.4)]">
|
|
115
|
+
<nav class="flex justify-between items-center h-16 px-8 max-w-7xl mx-auto">
|
|
116
|
+
<div class="flex items-center gap-8">
|
|
117
|
+
<span class="text-xl font-black text-[#72dcff] tracking-tighter font-headline">bubble-chart-js</span>
|
|
118
|
+
<div class="hidden md:flex gap-6 font-headline font-bold tracking-tight">
|
|
119
|
+
<a class="text-[#e1e4fa] opacity-80 hover:text-[#dd8bfb] transition-colors duration-300" href="#">Docs</a>
|
|
120
|
+
<a class="text-[#e1e4fa] opacity-80 hover:text-[#dd8bfb] transition-colors duration-300" href="#">Examples</a>
|
|
121
|
+
<a class="text-[#72dcff] border-b-2 border-[#72dcff] pb-1 hover:text-[#dd8bfb] transition-colors duration-300" href="#">Playground</a>
|
|
122
|
+
<a class="text-[#e1e4fa] opacity-80 hover:text-[#dd8bfb] transition-colors duration-300" href="#">GitHub</a>
|
|
123
|
+
</div>
|
|
124
|
+
</div>
|
|
125
|
+
<div class="flex items-center gap-4">
|
|
126
|
+
<button class="p-2 text-[#e1e4fa] hover:text-[#dd8bfb] transition-colors">
|
|
127
|
+
<span class="material-symbols-outlined">dark_mode</span>
|
|
128
|
+
</button>
|
|
129
|
+
<button class="bg-gradient-to-br from-primary to-primary-fixed-variant px-5 py-2 rounded-lg text-on-primary-fixed font-headline font-bold text-sm hover:shadow-[0_0_15px_rgba(114,220,255,0.4)] transition-all active:scale-95 duration-200">
|
|
130
|
+
Get Started
|
|
131
|
+
</button>
|
|
132
|
+
</div>
|
|
133
|
+
</nav>
|
|
134
|
+
</header>
|
|
135
|
+
<main class="pt-16 h-screen flex flex-col md:flex-row">
|
|
136
|
+
<!-- Left: Config Editor -->
|
|
137
|
+
<section class="w-full md:w-[450px] bg-surface-container border-r border-outline-variant/15 flex flex-col h-full z-10">
|
|
138
|
+
<!-- Header/Tabs -->
|
|
139
|
+
<div class="p-6 pb-2">
|
|
140
|
+
<span class="font-label text-xs uppercase tracking-[0.2em] text-secondary font-bold">Workspace</span>
|
|
141
|
+
<h1 class="text-2xl font-headline font-extrabold text-on-surface mt-1">Config Editor</h1>
|
|
142
|
+
</div>
|
|
143
|
+
<div class="flex-1 overflow-y-auto px-6 space-y-8 py-4 custom-scrollbar">
|
|
144
|
+
<!-- JSON Code Area -->
|
|
145
|
+
<div class="space-y-3">
|
|
146
|
+
<div class="flex justify-between items-center">
|
|
147
|
+
<span class="font-label text-[10px] uppercase text-on-surface-variant tracking-widest">chart-config.json</span>
|
|
148
|
+
<span class="text-[10px] text-tertiary">Live Sync Active</span>
|
|
149
|
+
</div>
|
|
150
|
+
<div class="bg-surface-container-lowest rounded-xl p-4 code-shadow font-mono text-sm leading-relaxed border border-outline-variant/10">
|
|
151
|
+
<div class="text-secondary">{</div>
|
|
152
|
+
<div class="pl-4">
|
|
153
|
+
<span class="text-primary">"renderer"</span>: <span class="text-tertiary">"canvas"</span>,
|
|
154
|
+
</div>
|
|
155
|
+
<div class="pl-4">
|
|
156
|
+
<span class="text-primary">"count"</span>: <span class="text-tertiary">150</span>,
|
|
157
|
+
</div>
|
|
158
|
+
<div class="pl-4">
|
|
159
|
+
<span class="text-primary">"physics"</span>: {
|
|
160
|
+
</div>
|
|
161
|
+
<div class="pl-8">
|
|
162
|
+
<span class="text-primary">"gravity"</span>: <span class="text-tertiary">0.05</span>,
|
|
163
|
+
</div>
|
|
164
|
+
<div class="pl-8">
|
|
165
|
+
<span class="text-primary">"friction"</span>: <span class="text-tertiary">0.98</span>
|
|
166
|
+
</div>
|
|
167
|
+
<div class="pl-4 text-secondary">}</div>
|
|
168
|
+
<div class="text-secondary">}</div>
|
|
169
|
+
</div>
|
|
170
|
+
</div>
|
|
171
|
+
<!-- Control Panel Forms -->
|
|
172
|
+
<div class="glass-panel p-6 rounded-xl space-y-6">
|
|
173
|
+
<!-- Renderer Toggle -->
|
|
174
|
+
<div class="space-y-3">
|
|
175
|
+
<label class="font-label text-xs uppercase text-on-surface-variant font-bold">Renderer toggle</label>
|
|
176
|
+
<div class="grid grid-cols-2 bg-surface-container-highest p-1 rounded-lg">
|
|
177
|
+
<button class="bg-primary text-on-primary-fixed text-xs font-bold py-2 rounded-md transition-all">SVG</button>
|
|
178
|
+
<button class="text-on-surface-variant text-xs font-bold py-2 rounded-md hover:text-on-surface">Canvas</button>
|
|
179
|
+
</div>
|
|
180
|
+
</div>
|
|
181
|
+
<!-- Bubble Count Slider -->
|
|
182
|
+
<div class="space-y-3">
|
|
183
|
+
<div class="flex justify-between items-center">
|
|
184
|
+
<label class="font-label text-xs uppercase text-on-surface-variant font-bold">Bubble count</label>
|
|
185
|
+
<span class="text-xs font-mono text-primary">150</span>
|
|
186
|
+
</div>
|
|
187
|
+
<input class="w-full" max="500" min="10" type="range" value="150"/>
|
|
188
|
+
</div>
|
|
189
|
+
<!-- Physics Toggle -->
|
|
190
|
+
<div class="flex justify-between items-center">
|
|
191
|
+
<label class="font-label text-xs uppercase text-on-surface-variant font-bold">Physics simulation</label>
|
|
192
|
+
<button class="relative inline-flex h-6 w-11 items-center rounded-full bg-primary">
|
|
193
|
+
<span class="inline-block h-4 w-4 translate-x-6 transform rounded-full bg-on-primary-fixed transition"></span>
|
|
194
|
+
</button>
|
|
195
|
+
</div>
|
|
196
|
+
<!-- Theme Switch -->
|
|
197
|
+
<div class="space-y-3">
|
|
198
|
+
<label class="font-label text-xs uppercase text-on-surface-variant font-bold">Visual Theme</label>
|
|
199
|
+
<select class="w-full bg-surface-container-highest border-none rounded-lg text-sm text-on-surface focus:ring-1 focus:ring-primary py-3">
|
|
200
|
+
<option>Neon Observatory (Default)</option>
|
|
201
|
+
<option>Atmospheric Depth</option>
|
|
202
|
+
<option>Midnight Terminal</option>
|
|
203
|
+
</select>
|
|
204
|
+
</div>
|
|
205
|
+
</div>
|
|
206
|
+
<!-- Export Action -->
|
|
207
|
+
<button class="w-full py-4 glass-panel border border-primary/20 rounded-xl text-primary font-headline font-bold text-sm flex items-center justify-center gap-2 hover:bg-primary/5 transition-all group">
|
|
208
|
+
<span class="material-symbols-outlined text-sm group-hover:rotate-45 transition-transform">send</span>
|
|
209
|
+
Export Implementation
|
|
210
|
+
</button>
|
|
211
|
+
</div>
|
|
212
|
+
</section>
|
|
213
|
+
<!-- Right: Live Chart Preview -->
|
|
214
|
+
<section class="flex-1 relative bg-surface-dim overflow-hidden flex items-center justify-center">
|
|
215
|
+
<!-- Background Gradients -->
|
|
216
|
+
<div class="absolute inset-0 overflow-hidden pointer-events-none">
|
|
217
|
+
<div class="absolute -top-1/4 -right-1/4 w-1/2 h-1/2 bg-primary/10 blur-[120px] rounded-full"></div>
|
|
218
|
+
<div class="absolute -bottom-1/4 -left-1/4 w-1/2 h-1/2 bg-secondary/10 blur-[120px] rounded-full"></div>
|
|
219
|
+
</div>
|
|
220
|
+
<!-- Floating Bubble Elements (Visual Mockup) -->
|
|
221
|
+
<div class="absolute inset-0 flex items-center justify-center p-12">
|
|
222
|
+
<div class="relative w-full h-full glass-panel rounded-3xl overflow-hidden border border-outline-variant/10 shadow-[0_40px_80px_rgba(0,0,0,0.6)] flex items-center justify-center">
|
|
223
|
+
<!-- Decorative Mock Bubbles -->
|
|
224
|
+
<div class="absolute w-24 h-24 rounded-full bg-gradient-to-br from-primary/40 to-transparent blur-sm border border-primary/30 top-[15%] left-[20%]"></div>
|
|
225
|
+
<div class="absolute w-40 h-40 rounded-full bg-gradient-to-br from-secondary/30 to-transparent blur-md border border-secondary/20 bottom-[10%] right-[15%]"></div>
|
|
226
|
+
<div class="absolute w-16 h-16 rounded-full bg-gradient-to-br from-tertiary/40 to-transparent blur-sm border border-tertiary/30 top-[60%] left-[45%]"></div>
|
|
227
|
+
<div class="absolute w-12 h-12 rounded-full bg-on-surface/5 backdrop-blur-md border border-on-surface/20 top-[40%] right-[30%]"></div>
|
|
228
|
+
<div class="absolute w-32 h-32 rounded-full bg-primary-fixed-dim/20 blur-xl bottom-[40%] left-[10%]"></div>
|
|
229
|
+
<!-- Live Indicator -->
|
|
230
|
+
<div class="absolute top-6 left-6 flex items-center gap-2 bg-surface-container-lowest/40 backdrop-blur-md px-3 py-1.5 rounded-full border border-outline-variant/10">
|
|
231
|
+
<span class="w-2 h-2 rounded-full bg-tertiary animate-pulse"></span>
|
|
232
|
+
<span class="font-label text-[10px] uppercase font-bold tracking-widest">Live Rendering</span>
|
|
233
|
+
</div>
|
|
234
|
+
<!-- Zoom Controls Overlay -->
|
|
235
|
+
<div class="absolute bottom-6 right-6 flex flex-col gap-2">
|
|
236
|
+
<button class="w-10 h-10 glass-panel rounded-lg flex items-center justify-center hover:bg-surface-bright transition-colors border border-outline-variant/10">
|
|
237
|
+
<span class="material-symbols-outlined text-on-surface-variant">add</span>
|
|
238
|
+
</button>
|
|
239
|
+
<button class="w-10 h-10 glass-panel rounded-lg flex items-center justify-center hover:bg-surface-bright transition-colors border border-outline-variant/10">
|
|
240
|
+
<span class="material-symbols-outlined text-on-surface-variant">remove</span>
|
|
241
|
+
</button>
|
|
242
|
+
<button class="w-10 h-10 glass-panel rounded-lg flex items-center justify-center hover:bg-surface-bright transition-colors border border-outline-variant/10">
|
|
243
|
+
<span class="material-symbols-outlined text-on-surface-variant">refresh</span>
|
|
244
|
+
</button>
|
|
245
|
+
</div>
|
|
246
|
+
<!-- Empty Space for "Simulation" -->
|
|
247
|
+
<div class="text-center space-y-4">
|
|
248
|
+
<div class="font-headline font-black text-6xl text-on-surface/5 pointer-events-none select-none">
|
|
249
|
+
BUBBLE_CANVAS_v2
|
|
250
|
+
</div>
|
|
251
|
+
<p class="font-label text-on-surface-variant/40 tracking-[0.4em] uppercase text-xs">Awaiting data stream</p>
|
|
252
|
+
</div>
|
|
253
|
+
</div>
|
|
254
|
+
</div>
|
|
255
|
+
<!-- Tooltip Overlay (Interaction Mockup) -->
|
|
256
|
+
<div class="absolute top-[25%] left-[60%] glass-panel p-4 rounded-xl border border-primary/30 shadow-2xl z-20 pointer-events-none">
|
|
257
|
+
<div class="flex items-center gap-3">
|
|
258
|
+
<div class="w-10 h-10 rounded-full bg-primary/20 flex items-center justify-center border border-primary/50">
|
|
259
|
+
<span class="material-symbols-outlined text-primary" data-weight="fill">bubble_chart</span>
|
|
260
|
+
</div>
|
|
261
|
+
<div>
|
|
262
|
+
<div class="text-[10px] font-label text-secondary font-bold uppercase tracking-widest">Node ID: 492</div>
|
|
263
|
+
<div class="text-sm font-headline font-bold text-on-surface">Momentum: 0.84</div>
|
|
264
|
+
</div>
|
|
265
|
+
</div>
|
|
266
|
+
</div>
|
|
267
|
+
</section>
|
|
268
|
+
</main>
|
|
269
|
+
<!-- Footer Area (Condensed for Playground) -->
|
|
270
|
+
<footer class="fixed bottom-0 left-0 right-0 z-50 bg-[#090e1c] border-t border-[#434759]/15">
|
|
271
|
+
<div class="flex justify-between items-center h-10 px-6 max-w-7xl mx-auto">
|
|
272
|
+
<div class="flex gap-4">
|
|
273
|
+
<span class="font-label text-[10px] text-[#e1e4fa]/60 tracking-widest uppercase">FPS: 60.2</span>
|
|
274
|
+
<span class="font-label text-[10px] text-[#e1e4fa]/60 tracking-widest uppercase">Nodes: 150</span>
|
|
275
|
+
<span class="font-label text-[10px] text-[#e1e4fa]/60 tracking-widest uppercase">Heap: 12.4MB</span>
|
|
276
|
+
</div>
|
|
277
|
+
<div class="flex gap-6 items-center">
|
|
278
|
+
<a class="text-[10px] font-label uppercase text-[#e1e4fa]/60 hover:text-[#dd8bfb] transition-colors" href="#">v2.4.0-alpha</a>
|
|
279
|
+
<a class="text-[10px] font-label uppercase text-[#e1e4fa]/60 hover:text-[#dd8bfb] transition-colors" href="#">Report Issue</a>
|
|
280
|
+
</div>
|
|
281
|
+
</div>
|
|
282
|
+
</footer>
|
|
283
|
+
</body></html>
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
|
|
3
|
+
<html class="dark" lang="en"><head>
|
|
4
|
+
<meta charset="utf-8"/>
|
|
5
|
+
<meta content="width=device-width, initial-scale=1.0" name="viewport"/>
|
|
6
|
+
<title>Luminous Orbit | Interactive Playground</title>
|
|
7
|
+
<script src="https://cdn.tailwindcss.com?plugins=forms,container-queries"></script>
|
|
8
|
+
<link href="https://fonts.googleapis.com/css2?family=Manrope:wght@400;700;800&family=Inter:wght@400;500;600&family=Space+Grotesk:wght@400;700&display=swap" rel="stylesheet"/>
|
|
9
|
+
<link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:wght,FILL@100..700,0..1&display=swap" rel="stylesheet"/>
|
|
10
|
+
<link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:wght,FILL@100..700,0..1&display=swap" rel="stylesheet"/>
|
|
11
|
+
<script id="tailwind-config">
|
|
12
|
+
tailwind.config = {
|
|
13
|
+
darkMode: "class",
|
|
14
|
+
theme: {
|
|
15
|
+
extend: {
|
|
16
|
+
colors: {
|
|
17
|
+
"tertiary": "#a6ffb5",
|
|
18
|
+
"surface-container": "#13192b",
|
|
19
|
+
"on-background": "#e1e4fa",
|
|
20
|
+
"primary-dim": "#00c3ed",
|
|
21
|
+
"surface-container-highest": "#1e253b",
|
|
22
|
+
"on-secondary-fixed-variant": "#792c97",
|
|
23
|
+
"on-error-container": "#ffa8a3",
|
|
24
|
+
"secondary": "#dd8bfb",
|
|
25
|
+
"primary-container": "#00d2ff",
|
|
26
|
+
"outline-variant": "#434759",
|
|
27
|
+
"on-surface-variant": "#a6aabf",
|
|
28
|
+
"surface": "#090e1c",
|
|
29
|
+
"primary-fixed": "#00d2ff",
|
|
30
|
+
"inverse-surface": "#faf8ff",
|
|
31
|
+
"on-primary-fixed": "#002c38",
|
|
32
|
+
"secondary-container": "#6e208c",
|
|
33
|
+
"on-primary-container": "#004253",
|
|
34
|
+
"on-secondary-container": "#f1bfff",
|
|
35
|
+
"on-primary": "#004c5e",
|
|
36
|
+
"background": "#090e1c",
|
|
37
|
+
"on-tertiary-container": "#005b29",
|
|
38
|
+
"tertiary-fixed": "#49fb87",
|
|
39
|
+
"error-container": "#9f0519",
|
|
40
|
+
"secondary-dim": "#ce7eec",
|
|
41
|
+
"surface-container-high": "#181f33",
|
|
42
|
+
"inverse-on-surface": "#505466",
|
|
43
|
+
"error-dim": "#d7383b",
|
|
44
|
+
"tertiary-fixed-dim": "#33ec7b",
|
|
45
|
+
"tertiary-container": "#49fb87",
|
|
46
|
+
"on-surface": "#e1e4fa",
|
|
47
|
+
"on-tertiary": "#00652e",
|
|
48
|
+
"outline": "#707588",
|
|
49
|
+
"primary": "#72dcff",
|
|
50
|
+
"on-tertiary-fixed-variant": "#00662e",
|
|
51
|
+
"on-primary-fixed-variant": "#004c5e",
|
|
52
|
+
"secondary-fixed-dim": "#ebadff",
|
|
53
|
+
"secondary-fixed": "#f2c1ff",
|
|
54
|
+
"on-error": "#490006",
|
|
55
|
+
"error": "#ff716c",
|
|
56
|
+
"on-secondary-fixed": "#580078",
|
|
57
|
+
"surface-container-low": "#0d1323",
|
|
58
|
+
"surface-tint": "#72dcff",
|
|
59
|
+
"surface-variant": "#1e253b",
|
|
60
|
+
"surface-container-lowest": "#000000",
|
|
61
|
+
"on-tertiary-fixed": "#00461e",
|
|
62
|
+
"primary-fixed-dim": "#00c3ed",
|
|
63
|
+
"inverse-primary": "#00687f",
|
|
64
|
+
"surface-bright": "#242b43",
|
|
65
|
+
"tertiary-dim": "#33ec7b",
|
|
66
|
+
"surface-dim": "#090e1c",
|
|
67
|
+
"on-secondary": "#4c0068"
|
|
68
|
+
},
|
|
69
|
+
fontFamily: {
|
|
70
|
+
"headline": ["Manrope"],
|
|
71
|
+
"body": ["Inter"],
|
|
72
|
+
"label": ["Space Grotesk"]
|
|
73
|
+
},
|
|
74
|
+
borderRadius: {"DEFAULT": "0.25rem", "lg": "0.5rem", "xl": "0.75rem", "full": "9999px"},
|
|
75
|
+
},
|
|
76
|
+
},
|
|
77
|
+
}
|
|
78
|
+
</script>
|
|
79
|
+
<style>
|
|
80
|
+
.material-symbols-outlined {
|
|
81
|
+
font-variation-settings: 'FILL' 0, 'wght' 400, 'GRAD' 0, 'opsz' 24;
|
|
82
|
+
}
|
|
83
|
+
body {
|
|
84
|
+
background-color: #090e1c;
|
|
85
|
+
color: #e1e4fa;
|
|
86
|
+
}
|
|
87
|
+
.glass-panel {
|
|
88
|
+
background: rgba(30, 37, 59, 0.6);
|
|
89
|
+
backdrop-filter: blur(12px);
|
|
90
|
+
}
|
|
91
|
+
.primary-gradient {
|
|
92
|
+
background: linear-gradient(135deg, #72dcff 0%, #00d2ff 100%);
|
|
93
|
+
}
|
|
94
|
+
.no-scrollbar::-webkit-scrollbar {
|
|
95
|
+
display: none;
|
|
96
|
+
}
|
|
97
|
+
</style>
|
|
98
|
+
<style>
|
|
99
|
+
body {
|
|
100
|
+
min-height: max(884px, 100dvh);
|
|
101
|
+
}
|
|
102
|
+
</style>
|
|
103
|
+
</head>
|
|
104
|
+
<body class="font-body selection:bg-secondary/30">
|
|
105
|
+
<!-- TopAppBar -->
|
|
106
|
+
<nav class="fixed top-0 w-full z-50 flex justify-between items-center px-6 h-16 bg-[#090e1c] shadow-[0_20px_40px_rgba(0,0,0,0.4)]">
|
|
107
|
+
<div class="flex items-center gap-3">
|
|
108
|
+
<span class="material-symbols-outlined text-[#72dcff]" data-icon="bubble_chart">bubble_chart</span>
|
|
109
|
+
<span class="font-['Manrope'] font-bold tracking-tight text-xl font-black text-[#72dcff] tracking-tighter uppercase">Luminous Orbit</span>
|
|
110
|
+
</div>
|
|
111
|
+
<button class="text-[#e1e4fa]/60 hover:bg-[#72dcff]/10 hover:backdrop-blur-md transition-all active:scale-95 p-2 rounded-xl">
|
|
112
|
+
<span class="material-symbols-outlined" data-icon="settings">settings</span>
|
|
113
|
+
</button>
|
|
114
|
+
</nav>
|
|
115
|
+
<main class="pt-16 pb-32 px-4 flex flex-col gap-6">
|
|
116
|
+
<!-- Live Chart Preview (Signature Component) -->
|
|
117
|
+
<section class="mt-4">
|
|
118
|
+
<div class="flex items-center justify-between mb-3 px-2">
|
|
119
|
+
<span class="font-label text-[10px] uppercase tracking-widest text-secondary font-bold">Live Rendering Preview</span>
|
|
120
|
+
<span class="flex items-center gap-1.5 text-[10px] text-tertiary">
|
|
121
|
+
<span class="w-1.5 h-1.5 rounded-full bg-tertiary shadow-[0_0_8px_#a6ffb5]"></span>
|
|
122
|
+
STABLE 60FPS
|
|
123
|
+
</span>
|
|
124
|
+
</div>
|
|
125
|
+
<div class="relative w-full aspect-square rounded-2xl overflow-hidden bg-surface-container-low shadow-2xl group">
|
|
126
|
+
<div class="absolute inset-0 opacity-20 pointer-events-none" style="background-image: radial-gradient(circle at 2px 2px, #707588 1px, transparent 0); background-size: 24px 24px;"></div>
|
|
127
|
+
<!-- Abstract Bubble Chart Visualization -->
|
|
128
|
+
<div class="absolute inset-0 flex items-center justify-center p-8">
|
|
129
|
+
<div class="relative w-full h-full">
|
|
130
|
+
<!-- Simulated Bubbles -->
|
|
131
|
+
<div class="absolute top-[20%] left-[30%] w-24 h-24 rounded-full bg-primary/20 backdrop-blur-md border border-primary/30 flex items-center justify-center shadow-[0_0_30px_rgba(114,220,255,0.2)]">
|
|
132
|
+
<span class="text-[10px] font-label text-primary">ID: 082</span>
|
|
133
|
+
</div>
|
|
134
|
+
<div class="absolute top-[50%] left-[60%] w-32 h-32 rounded-full bg-secondary/20 backdrop-blur-md border border-secondary/30 flex items-center justify-center shadow-[0_0_40px_rgba(221,139,251,0.2)]">
|
|
135
|
+
<span class="text-[10px] font-label text-secondary">ID: 114</span>
|
|
136
|
+
</div>
|
|
137
|
+
<div class="absolute top-[10%] left-[65%] w-16 h-16 rounded-full bg-tertiary/20 backdrop-blur-md border border-tertiary/30 flex items-center justify-center shadow-[0_0_20px_rgba(166,255,181,0.2)]">
|
|
138
|
+
</div>
|
|
139
|
+
<div class="absolute top-[70%] left-[15%] w-20 h-20 rounded-full bg-primary/10 backdrop-blur-sm border border-primary/20"></div>
|
|
140
|
+
</div>
|
|
141
|
+
</div>
|
|
142
|
+
<div class="absolute bottom-4 left-4 glass-panel px-3 py-1.5 rounded-lg border border-outline-variant/15">
|
|
143
|
+
<span class="font-label text-[10px] text-on-surface-variant uppercase tracking-tighter">Current: <span class="text-on-surface">Canvas-2D</span></span>
|
|
144
|
+
</div>
|
|
145
|
+
</div>
|
|
146
|
+
</section>
|
|
147
|
+
<!-- Simulation Controls Panel -->
|
|
148
|
+
<section class="bg-surface-container-high rounded-2xl p-5 shadow-lg">
|
|
149
|
+
<div class="flex items-center gap-2 mb-6">
|
|
150
|
+
<span class="material-symbols-outlined text-primary text-xl" data-icon="tune">tune</span>
|
|
151
|
+
<h2 class="font-headline text-lg font-bold">Simulation Controls</h2>
|
|
152
|
+
</div>
|
|
153
|
+
<div class="space-y-6">
|
|
154
|
+
<!-- Segmented Control -->
|
|
155
|
+
<div>
|
|
156
|
+
<label class="font-label text-[10px] text-on-surface-variant uppercase tracking-widest block mb-3">Renderer Engine</label>
|
|
157
|
+
<div class="flex p-1 bg-surface-container-highest rounded-xl border border-outline-variant/10">
|
|
158
|
+
<button class="flex-1 py-2 text-sm font-medium rounded-lg bg-primary-container text-on-primary-container transition-all">SVG</button>
|
|
159
|
+
<button class="flex-1 py-2 text-sm font-medium rounded-lg text-on-surface-variant hover:text-on-surface transition-all">Canvas</button>
|
|
160
|
+
</div>
|
|
161
|
+
</div>
|
|
162
|
+
<!-- Bubble Count Slider -->
|
|
163
|
+
<div>
|
|
164
|
+
<div class="flex justify-between items-center mb-2">
|
|
165
|
+
<label class="font-label text-[10px] text-on-surface-variant uppercase tracking-widest">Bubble Density</label>
|
|
166
|
+
<span class="text-sm font-bold text-primary">124</span>
|
|
167
|
+
</div>
|
|
168
|
+
<input class="w-full h-1.5 bg-surface-container-highest rounded-full appearance-none accent-primary cursor-pointer" type="range"/>
|
|
169
|
+
</div>
|
|
170
|
+
<!-- Physics Toggle -->
|
|
171
|
+
<div class="flex items-center justify-between py-2">
|
|
172
|
+
<div>
|
|
173
|
+
<span class="text-sm font-semibold block">Enable Global Physics</span>
|
|
174
|
+
<span class="text-[11px] text-on-surface-variant">Collisions & gravitational pull</span>
|
|
175
|
+
</div>
|
|
176
|
+
<button class="w-12 h-6 rounded-full bg-tertiary-container relative transition-colors">
|
|
177
|
+
<span class="absolute right-1 top-1 w-4 h-4 bg-on-tertiary rounded-full"></span>
|
|
178
|
+
</button>
|
|
179
|
+
</div>
|
|
180
|
+
</div>
|
|
181
|
+
</section>
|
|
182
|
+
<!-- Config Editor Section -->
|
|
183
|
+
<section>
|
|
184
|
+
<div class="flex items-center justify-between mb-3 px-2">
|
|
185
|
+
<div class="flex items-center gap-2">
|
|
186
|
+
<span class="material-symbols-outlined text-secondary text-xl" data-icon="code">code</span>
|
|
187
|
+
<h2 class="font-headline text-lg font-bold">Config Editor</h2>
|
|
188
|
+
</div>
|
|
189
|
+
<button class="text-primary text-xs font-label uppercase tracking-wider flex items-center gap-1">
|
|
190
|
+
Expand
|
|
191
|
+
<span class="material-symbols-outlined text-sm" data-icon="unfold_more">unfold_more</span>
|
|
192
|
+
</button>
|
|
193
|
+
</div>
|
|
194
|
+
<div class="bg-surface-container-lowest rounded-2xl border border-outline-variant/10 overflow-hidden font-mono text-[13px] leading-relaxed p-4 shadow-2xl">
|
|
195
|
+
<div class="flex gap-4">
|
|
196
|
+
<div class="text-outline-variant select-none">
|
|
197
|
+
1<br/>2<br/>3<br/>4<br/>5<br/>6<br/>7
|
|
198
|
+
</div>
|
|
199
|
+
<div class="text-on-surface-variant no-scrollbar overflow-x-auto whitespace-nowrap">
|
|
200
|
+
<span class="text-secondary">const</span> <span class="text-primary">config</span> = {<br/>
|
|
201
|
+
<span class="text-tertiary">engine</span>: <span class="text-on-secondary-container">'canvas'</span>,<br/>
|
|
202
|
+
<span class="text-tertiary">repulsion</span>: <span class="text-secondary">0.45</span>,<br/>
|
|
203
|
+
<span class="text-tertiary">gravity</span>: <span class="text-secondary">0.02</span>,<br/>
|
|
204
|
+
<span class="text-tertiary">blur</span>: <span class="text-primary">true</span>,<br/>
|
|
205
|
+
<span class="text-tertiary">theme</span>: <span class="text-on-secondary-container">'neon'</span><br/>
|
|
206
|
+
};
|
|
207
|
+
</div>
|
|
208
|
+
</div>
|
|
209
|
+
</div>
|
|
210
|
+
</section>
|
|
211
|
+
</main>
|
|
212
|
+
<!-- Floating Action Button: Export Implementation -->
|
|
213
|
+
<button class="fixed bottom-24 right-6 primary-gradient p-4 rounded-2xl shadow-[0_10px_30px_rgba(0,210,255,0.4)] flex items-center justify-center text-on-primary-fixed hover:scale-105 active:scale-95 transition-transform z-50">
|
|
214
|
+
<span class="material-symbols-outlined mr-2" data-icon="download">download</span>
|
|
215
|
+
<span class="font-bold text-sm">Export Code</span>
|
|
216
|
+
</button>
|
|
217
|
+
<!-- BottomNavBar -->
|
|
218
|
+
<nav class="fixed bottom-0 w-full z-50 flex justify-around items-center px-4 pb-6 pt-2 bg-[#1e253b]/60 backdrop-blur-xl shadow-[0_-10px_30px_rgba(0,0,0,0.3)] rounded-t-2xl">
|
|
219
|
+
<a class="flex flex-col items-center justify-center text-[#e1e4fa]/50 hover:text-[#dd8bfb] transition-colors active:scale-90 duration-150" href="#">
|
|
220
|
+
<span class="material-symbols-outlined" data-icon="visibility">visibility</span>
|
|
221
|
+
<span class="font-['Space_Grotesk'] text-[10px] uppercase tracking-widest mt-1">Preview</span>
|
|
222
|
+
</a>
|
|
223
|
+
<a class="flex flex-col items-center justify-center text-[#72dcff] bg-[#72dcff]/10 rounded-xl py-1 px-3 active:scale-90 duration-150" href="#">
|
|
224
|
+
<span class="material-symbols-outlined" data-icon="tune">tune</span>
|
|
225
|
+
<span class="font-['Space_Grotesk'] text-[10px] uppercase tracking-widest mt-1">Simulate</span>
|
|
226
|
+
</a>
|
|
227
|
+
<a class="flex flex-col items-center justify-center text-[#e1e4fa]/50 hover:text-[#dd8bfb] transition-colors active:scale-90 duration-150" href="#">
|
|
228
|
+
<span class="material-symbols-outlined" data-icon="code">code</span>
|
|
229
|
+
<span class="font-['Space_Grotesk'] text-[10px] uppercase tracking-widest mt-1">Editor</span>
|
|
230
|
+
</a>
|
|
231
|
+
<a class="flex flex-col items-center justify-center text-[#e1e4fa]/50 hover:text-[#dd8bfb] transition-colors active:scale-90 duration-150" href="#">
|
|
232
|
+
<span class="material-symbols-outlined" data-icon="menu_book">menu_book</span>
|
|
233
|
+
<span class="font-['Space_Grotesk'] text-[10px] uppercase tracking-widest mt-1">Docs</span>
|
|
234
|
+
</a>
|
|
235
|
+
</nav>
|
|
236
|
+
</body></html>
|