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.
Files changed (58) hide show
  1. package/README.md +1 -1
  2. package/demo/glassmorphism.html +323 -0
  3. package/demo/index.html +739 -0
  4. package/dist/bubbleChart.cjs.js +1 -1
  5. package/dist/bubbleChart.esm.js +1 -1
  6. package/dist/bubbleChart.umd.js +1 -1
  7. package/docs/documentation.html +438 -0
  8. package/docs/examples.html +689 -0
  9. package/docs/index.html +432 -0
  10. package/docs/landing_test.html +337 -0
  11. package/docs/playground.html +345 -0
  12. package/docs/process_html.js +105 -0
  13. package/docs/temp/5a86d.html +248 -0
  14. package/docs/temp/b0cbe.html +276 -0
  15. package/docs/temp/docs_desktop.html +341 -0
  16. package/docs/temp/docs_mobile.html +291 -0
  17. package/docs/temp/examples_desktop.html +372 -0
  18. package/docs/temp/examples_mobile.html +317 -0
  19. package/docs/temp/landing_desktop.html +337 -0
  20. package/docs/temp/landing_mobile.html +270 -0
  21. package/docs/temp/playground_desktop.html +283 -0
  22. package/docs/temp/playground_mobile.html +236 -0
  23. package/examples/test.html +194 -0
  24. package/examples/test2.html +103 -0
  25. package/package.json +7 -3
  26. package/scripts/generate-fixtures.ts +45 -0
  27. package/spec/config-defaults.json +16 -0
  28. package/spec/fixtures/3-bubbles.expected.json +27 -0
  29. package/spec/fixtures/3-bubbles.input.json +10 -0
  30. package/spec/fixtures/equal-values.expected.json +34 -0
  31. package/spec/fixtures/equal-values.input.json +11 -0
  32. package/spec/fixtures/many-bubbles.expected.json +76 -0
  33. package/spec/fixtures/many-bubbles.input.json +17 -0
  34. package/spec/fixtures/single-bubble.expected.json +13 -0
  35. package/spec/fixtures/single-bubble.input.json +8 -0
  36. package/spec/physics.json +11 -0
  37. package/tsconfig.scripts.json +8 -0
  38. package/dist/canvas.d.ts +0 -5
  39. package/dist/constants/app-constants.d.ts +0 -3
  40. package/dist/constants/physics.d.ts +0 -10
  41. package/dist/core/renderer.d.ts +0 -2
  42. package/dist/features/text-wrapper.d.ts +0 -2
  43. package/dist/features/tooltip.d.ts +0 -6
  44. package/dist/index.d.ts +0 -8
  45. package/dist/models/internal/data-item-info.d.ts +0 -7
  46. package/dist/models/public/bubble-chart.d.ts +0 -6
  47. package/dist/models/public/config/bubble-appearance.d.ts +0 -26
  48. package/dist/models/public/config/font-options.d.ts +0 -46
  49. package/dist/models/public/config/interaction-options.d.ts +0 -6
  50. package/dist/models/public/config/tooltip-config.d.ts +0 -4
  51. package/dist/models/public/config/tooltip-options.d.ts +0 -170
  52. package/dist/models/public/configuration.d.ts +0 -30
  53. package/dist/models/public/data-item.d.ts +0 -8
  54. package/dist/services/chart-service.d.ts +0 -5
  55. package/dist/services/render-service.d.ts +0 -3
  56. package/dist/utils/config.d.ts +0 -12
  57. package/dist/utils/helper.d.ts +0 -2
  58. package/dist/utils/validation.d.ts +0 -5
@@ -0,0 +1,317 @@
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>Examples Gallery | BubbleChart.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;500;700;800&amp;family=Inter:wght@400;500;600&amp;family=Space+Grotesk:wght@400;500;700&amp;display=swap" rel="stylesheet"/>
9
+ <link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:wght,FILL@100..700,0..1&amp;display=swap" rel="stylesheet"/>
10
+ <link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:wght,FILL@100..700,0..1&amp;display=swap" rel="stylesheet"/>
11
+ <script id="tailwind-config">
12
+ tailwind.config = {
13
+ darkMode: "class",
14
+ theme: {
15
+ extend: {
16
+ colors: {
17
+ "tertiary-fixed-dim": "#33ec7b",
18
+ "on-surface-variant": "#a6aabf",
19
+ "surface": "#090e1c",
20
+ "secondary-fixed": "#f2c1ff",
21
+ "error": "#ff716c",
22
+ "on-primary-container": "#004253",
23
+ "on-tertiary-fixed-variant": "#00662e",
24
+ "on-error": "#490006",
25
+ "on-secondary-fixed-variant": "#792c97",
26
+ "error-container": "#9f0519",
27
+ "on-background": "#e1e4fa",
28
+ "on-tertiary-container": "#005b29",
29
+ "inverse-primary": "#00687f",
30
+ "primary-dim": "#00c3ed",
31
+ "primary": "#72dcff",
32
+ "inverse-surface": "#faf8ff",
33
+ "on-secondary": "#4c0068",
34
+ "surface-container-lowest": "#000000",
35
+ "background": "#090e1c",
36
+ "secondary-fixed-dim": "#ebadff",
37
+ "on-secondary-container": "#f1bfff",
38
+ "secondary": "#dd8bfb",
39
+ "primary-fixed": "#00d2ff",
40
+ "on-error-container": "#ffa8a3",
41
+ "tertiary-container": "#49fb87",
42
+ "surface-bright": "#242b43",
43
+ "on-primary-fixed": "#002c38",
44
+ "error-dim": "#d7383b",
45
+ "inverse-on-surface": "#505466",
46
+ "on-primary": "#004c5e",
47
+ "surface-container-low": "#0d1323",
48
+ "tertiary-dim": "#33ec7b",
49
+ "on-primary-fixed-variant": "#004c5e",
50
+ "secondary-container": "#6e208c",
51
+ "surface-variant": "#1e253b",
52
+ "on-secondary-fixed": "#580078",
53
+ "surface-container": "#13192b",
54
+ "primary-container": "#00d2ff",
55
+ "outline-variant": "#434759",
56
+ "surface-container-high": "#181f33",
57
+ "surface-dim": "#090e1c",
58
+ "tertiary": "#a6ffb5",
59
+ "on-tertiary": "#00652e",
60
+ "outline": "#707588",
61
+ "secondary-dim": "#ce7eec",
62
+ "on-surface": "#e1e4fa",
63
+ "tertiary-fixed": "#49fb87",
64
+ "surface-container-highest": "#1e253b",
65
+ "primary-fixed-dim": "#00c3ed",
66
+ "on-tertiary-fixed": "#00461e",
67
+ "surface-tint": "#72dcff"
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
+ .glass-card {
84
+ background: rgba(30, 37, 59, 0.6);
85
+ backdrop-filter: blur(12px);
86
+ }
87
+ .neon-glow-primary {
88
+ box-shadow: 0 0 20px rgba(114, 220, 255, 0.15);
89
+ }
90
+ .bubble-gradient {
91
+ background: linear-gradient(135deg, rgba(114, 220, 255, 0.2) 0%, rgba(221, 139, 251, 0.1) 100%);
92
+ }
93
+ </style>
94
+ <style>
95
+ body {
96
+ min-height: max(884px, 100dvh);
97
+ }
98
+ </style>
99
+ </head>
100
+ <body class="bg-background text-on-surface font-body selection:bg-primary/30 selection:text-primary">
101
+ <!-- TopAppBar -->
102
+ <header class="fixed top-0 w-full z-50 bg-[#090e1c]/60 backdrop-blur-xl flex justify-between items-center px-6 h-16 w-full shadow-2xl shadow-black/40">
103
+ <div class="flex items-center gap-3 active:scale-95 duration-200 transition-colors hover:bg-[#1e253b]/40 p-2 rounded-lg">
104
+ <span class="material-symbols-outlined text-[#72dcff]">menu</span>
105
+ </div>
106
+ <h1 class="text-xl font-extrabold tracking-tighter text-[#72dcff] font-manrope">BubbleChart.js</h1>
107
+ <div class="flex items-center gap-3 active:scale-95 duration-200 transition-colors hover:bg-[#1e253b]/40 p-2 rounded-lg">
108
+ <span class="material-symbols-outlined text-[#72dcff]">search</span>
109
+ </div>
110
+ </header>
111
+ <main class="pt-24 pb-32 px-6">
112
+ <!-- Hero Section -->
113
+ <section class="mb-12">
114
+ <div class="inline-block px-3 py-1 rounded-full bg-secondary-container/30 text-secondary text-[10px] font-label uppercase tracking-widest mb-4">
115
+ Curated Demos
116
+ </div>
117
+ <h2 class="text-4xl font-headline font-extrabold text-on-surface tracking-tight leading-tight mb-3">
118
+ Examples <span class="text-transparent bg-clip-text bg-gradient-to-r from-primary to-secondary">Gallery</span>
119
+ </h2>
120
+ <p class="text-on-surface-variant text-sm leading-relaxed max-w-[90%] font-body">
121
+ Explore a collection of interactive bubble layouts. High performance, beautifully rendered, and fully customizable.
122
+ </p>
123
+ </section>
124
+ <!-- Gallery Grid (Vertical Stack for Mobile) -->
125
+ <div class="flex flex-col gap-8">
126
+ <!-- Example 1: Basic -->
127
+ <article class="glass-card rounded-xl overflow-hidden border border-outline-variant/15 flex flex-col group">
128
+ <div class="h-48 bubble-gradient relative overflow-hidden flex items-center justify-center">
129
+ <div class="absolute w-24 h-24 rounded-full bg-primary/20 blur-2xl -top-4 -left-4"></div>
130
+ <div class="absolute w-16 h-16 rounded-full bg-secondary/20 blur-xl bottom-4 right-8"></div>
131
+ <!-- Mock Bubble UI -->
132
+ <div class="flex gap-2">
133
+ <div class="w-12 h-12 rounded-full border border-primary/40 bg-primary/10 flex items-center justify-center">
134
+ <span class="material-symbols-outlined text-primary text-sm">circle</span>
135
+ </div>
136
+ <div class="w-16 h-16 rounded-full border border-secondary/40 bg-secondary/10 flex items-center justify-center -mt-4">
137
+ <span class="material-symbols-outlined text-secondary text-lg">circle</span>
138
+ </div>
139
+ <div class="w-10 h-10 rounded-full border border-tertiary/40 bg-tertiary/10 flex items-center justify-center">
140
+ <span class="material-symbols-outlined text-tertiary text-xs">circle</span>
141
+ </div>
142
+ </div>
143
+ </div>
144
+ <div class="p-6">
145
+ <h3 class="text-lg font-headline font-bold text-on-surface mb-2">Basic bubble chart</h3>
146
+ <p class="text-on-surface-variant text-xs mb-6 font-body">The essential starter setup for hierarchical data visualization.</p>
147
+ <div class="flex gap-3">
148
+ <button class="flex-1 py-3 px-4 rounded-lg bg-gradient-to-r from-primary to-primary-container text-on-primary-fixed text-xs font-bold tracking-tight shadow-lg shadow-primary/20 active:translate-y-0.5 transition-all">
149
+ Quick Preview
150
+ </button>
151
+ <button class="w-12 h-11 rounded-lg bg-surface-variant/40 flex items-center justify-center border border-outline-variant/15 active:scale-95 transition-all">
152
+ <span class="material-symbols-outlined text-on-surface-variant">code</span>
153
+ </button>
154
+ </div>
155
+ </div>
156
+ </article>
157
+ <!-- Example 2: Glass Theme -->
158
+ <article class="glass-card rounded-xl overflow-hidden border border-outline-variant/15 flex flex-col group">
159
+ <div class="h-48 bg-surface-container-lowest relative overflow-hidden flex items-center justify-center">
160
+ <div class="absolute inset-0 opacity-30" style="background-image: radial-gradient(circle at 50% 50%, #72dcff 0%, transparent 60%);"></div>
161
+ <div class="w-32 h-32 rounded-2xl bg-white/5 backdrop-blur-md border border-white/10 flex items-center justify-center">
162
+ <div class="w-16 h-16 rounded-full bg-primary/40 blur-lg"></div>
163
+ </div>
164
+ </div>
165
+ <div class="p-6">
166
+ <h3 class="text-lg font-headline font-bold text-on-surface mb-2">Glass theme</h3>
167
+ <p class="text-on-surface-variant text-xs mb-6 font-body">Frosted glass effects applied to each data node for modern UIs.</p>
168
+ <div class="flex gap-3">
169
+ <button class="flex-1 py-3 px-4 rounded-lg bg-gradient-to-r from-primary to-primary-container text-on-primary-fixed text-xs font-bold tracking-tight shadow-lg shadow-primary/20 active:translate-y-0.5 transition-all">
170
+ Quick Preview
171
+ </button>
172
+ <button class="w-12 h-11 rounded-lg bg-surface-variant/40 flex items-center justify-center border border-outline-variant/15 active:scale-95 transition-all">
173
+ <span class="material-symbols-outlined text-on-surface-variant">code</span>
174
+ </button>
175
+ </div>
176
+ </div>
177
+ </article>
178
+ <!-- Example 3: Physics Layout -->
179
+ <article class="glass-card rounded-xl overflow-hidden border border-outline-variant/15 flex flex-col group">
180
+ <div class="h-48 bg-surface-container-low relative overflow-hidden flex items-center justify-center">
181
+ <div class="flex gap-4 items-center">
182
+ <div class="w-8 h-8 rounded-full bg-tertiary shadow-[0_0_15px_#a6ffb5]"></div>
183
+ <div class="w-6 h-6 rounded-full bg-secondary shadow-[0_0_10px_#dd8bfb]"></div>
184
+ <div class="w-10 h-10 rounded-full bg-primary shadow-[0_0_20px_#72dcff]"></div>
185
+ </div>
186
+ <!-- Vector lines connecting them -->
187
+ <svg class="absolute inset-0 w-full h-full opacity-20" viewbox="0 0 200 100">
188
+ <line stroke="white" stroke-width="1" x1="100" x2="60" y1="50" y2="30"></line>
189
+ <line stroke="white" stroke-width="1" x1="100" x2="140" y1="50" y2="70"></line>
190
+ </svg>
191
+ </div>
192
+ <div class="p-6">
193
+ <h3 class="text-lg font-headline font-bold text-on-surface mb-2">Physics layout</h3>
194
+ <p class="text-on-surface-variant text-xs mb-6 font-body">Dynamic collision detection and fluid motion animations.</p>
195
+ <div class="flex gap-3">
196
+ <button class="flex-1 py-3 px-4 rounded-lg bg-gradient-to-r from-primary to-primary-container text-on-primary-fixed text-xs font-bold tracking-tight shadow-lg shadow-primary/20 active:translate-y-0.5 transition-all">
197
+ Quick Preview
198
+ </button>
199
+ <button class="w-12 h-11 rounded-lg bg-surface-variant/40 flex items-center justify-center border border-outline-variant/15 active:scale-95 transition-all">
200
+ <span class="material-symbols-outlined text-on-surface-variant">code</span>
201
+ </button>
202
+ </div>
203
+ </div>
204
+ </article>
205
+ <!-- Example 4: Large Dataset -->
206
+ <article class="glass-card rounded-xl overflow-hidden border border-outline-variant/15 flex flex-col group">
207
+ <div class="h-48 bg-surface-container-high relative overflow-hidden p-4">
208
+ <div class="grid grid-cols-8 gap-1 h-full opacity-40">
209
+ <!-- Tiny mock bubbles -->
210
+ <div class="bg-primary/40 rounded-full aspect-square"></div>
211
+ <div class="bg-secondary/40 rounded-full aspect-square scale-75"></div>
212
+ <div class="bg-tertiary/40 rounded-full aspect-square"></div>
213
+ <div class="bg-primary/40 rounded-full aspect-square scale-50"></div>
214
+ <div class="bg-secondary/40 rounded-full aspect-square"></div>
215
+ <div class="bg-tertiary/40 rounded-full aspect-square scale-90"></div>
216
+ <div class="bg-primary/40 rounded-full aspect-square"></div>
217
+ <div class="bg-secondary/40 rounded-full aspect-square scale-110"></div>
218
+ <div class="bg-primary/40 rounded-full aspect-square scale-75"></div>
219
+ <div class="bg-secondary/40 rounded-full aspect-square"></div>
220
+ <div class="bg-tertiary/40 rounded-full aspect-square scale-50"></div>
221
+ <div class="bg-primary/40 rounded-full aspect-square scale-90"></div>
222
+ <div class="bg-secondary/40 rounded-full aspect-square"></div>
223
+ <div class="bg-tertiary/40 rounded-full aspect-square scale-125"></div>
224
+ <div class="bg-primary/40 rounded-full aspect-square"></div>
225
+ <div class="bg-secondary/40 rounded-full aspect-square scale-75"></div>
226
+ <div class="bg-tertiary/40 rounded-full aspect-square"></div>
227
+ <div class="bg-primary/40 rounded-full aspect-square scale-50"></div>
228
+ <div class="bg-secondary/40 rounded-full aspect-square"></div>
229
+ <div class="bg-tertiary/40 rounded-full aspect-square scale-90"></div>
230
+ <div class="bg-primary/40 rounded-full aspect-square"></div>
231
+ <div class="bg-secondary/40 rounded-full aspect-square scale-110"></div>
232
+ <div class="bg-primary/40 rounded-full aspect-square scale-75"></div>
233
+ <div class="bg-secondary/40 rounded-full aspect-square"></div>
234
+ </div>
235
+ </div>
236
+ <div class="p-6">
237
+ <h3 class="text-lg font-headline font-bold text-on-surface mb-2">Large dataset (100+)</h3>
238
+ <p class="text-on-surface-variant text-xs mb-6 font-body">Canvas-optimized rendering for thousands of nodes at 60fps.</p>
239
+ <div class="flex gap-3">
240
+ <button class="flex-1 py-3 px-4 rounded-lg bg-gradient-to-r from-primary to-primary-container text-on-primary-fixed text-xs font-bold tracking-tight shadow-lg shadow-primary/20 active:translate-y-0.5 transition-all">
241
+ Quick Preview
242
+ </button>
243
+ <button class="w-12 h-11 rounded-lg bg-surface-variant/40 flex items-center justify-center border border-outline-variant/15 active:scale-95 transition-all">
244
+ <span class="material-symbols-outlined text-on-surface-variant">code</span>
245
+ </button>
246
+ </div>
247
+ </div>
248
+ </article>
249
+ <!-- Example 5: Custom Colors -->
250
+ <article class="glass-card rounded-xl overflow-hidden border border-outline-variant/15 flex flex-col group">
251
+ <div class="h-48 bg-surface relative overflow-hidden flex items-center justify-center">
252
+ <div class="flex gap-2">
253
+ <div class="w-8 h-8 rounded bg-[#ff716c]"></div>
254
+ <div class="w-8 h-8 rounded bg-[#72dcff]"></div>
255
+ <div class="w-8 h-8 rounded bg-[#dd8bfb]"></div>
256
+ <div class="w-8 h-8 rounded bg-[#a6ffb5]"></div>
257
+ </div>
258
+ </div>
259
+ <div class="p-6">
260
+ <h3 class="text-lg font-headline font-bold text-on-surface mb-2">Custom colors</h3>
261
+ <p class="text-on-surface-variant text-xs mb-6 font-body">Easily map data attributes to brand-specific color palettes.</p>
262
+ <div class="flex gap-3">
263
+ <button class="flex-1 py-3 px-4 rounded-lg bg-gradient-to-r from-primary to-primary-container text-on-primary-fixed text-xs font-bold tracking-tight shadow-lg shadow-primary/20 active:translate-y-0.5 transition-all">
264
+ Quick Preview
265
+ </button>
266
+ <button class="w-12 h-11 rounded-lg bg-surface-variant/40 flex items-center justify-center border border-outline-variant/15 active:scale-95 transition-all">
267
+ <span class="material-symbols-outlined text-on-surface-variant">code</span>
268
+ </button>
269
+ </div>
270
+ </div>
271
+ </article>
272
+ <!-- Example 6: Interactive Events -->
273
+ <article class="glass-card rounded-xl overflow-hidden border border-outline-variant/15 flex flex-col group">
274
+ <div class="h-48 bg-[#000] relative overflow-hidden flex flex-col items-center justify-center">
275
+ <div class="w-20 h-20 rounded-full border-2 border-dashed border-primary/50 flex items-center justify-center">
276
+ <span class="material-symbols-outlined text-primary" style="font-variation-settings: 'FILL' 1;">touch_app</span>
277
+ </div>
278
+ <div class="mt-4 px-3 py-1 bg-primary/10 rounded-full border border-primary/20">
279
+ <span class="text-[10px] text-primary font-label uppercase">onClick() fired</span>
280
+ </div>
281
+ </div>
282
+ <div class="p-6">
283
+ <h3 class="text-lg font-headline font-bold text-on-surface mb-2">Interactive events</h3>
284
+ <p class="text-on-surface-variant text-xs mb-6 font-body">Deep dive into tap, hover, and drag events with native callbacks.</p>
285
+ <div class="flex gap-3">
286
+ <button class="flex-1 py-3 px-4 rounded-lg bg-gradient-to-r from-primary to-primary-container text-on-primary-fixed text-xs font-bold tracking-tight shadow-lg shadow-primary/20 active:translate-y-0.5 transition-all">
287
+ Quick Preview
288
+ </button>
289
+ <button class="w-12 h-11 rounded-lg bg-surface-variant/40 flex items-center justify-center border border-outline-variant/15 active:scale-95 transition-all">
290
+ <span class="material-symbols-outlined text-on-surface-variant">code</span>
291
+ </button>
292
+ </div>
293
+ </div>
294
+ </article>
295
+ </div>
296
+ </main>
297
+ <!-- BottomNavBar -->
298
+ <nav class="fixed bottom-0 left-0 w-full z-50 bg-[#090e1c]/80 backdrop-blur-2xl border-t border-[#434759]/15 flex justify-around items-center h-20 px-4 pb-safe shadow-[0_-10px_30px_rgba(0,0,0,0.5)]">
299
+ <div class="flex flex-col items-center justify-center text-[#e1e4fa]/50 px-3 py-1 hover:text-[#dd8bfb] transition-all active:translate-y-0.5 duration-150">
300
+ <span class="material-symbols-outlined">dashboard</span>
301
+ <span class="font-space-grotesk text-[10px] uppercase tracking-widest mt-1">Gallery</span>
302
+ </div>
303
+ <div class="flex flex-col items-center justify-center text-[#e1e4fa]/50 px-3 py-1 hover:text-[#dd8bfb] transition-all active:translate-y-0.5 duration-150">
304
+ <span class="material-symbols-outlined">description</span>
305
+ <span class="font-space-grotesk text-[10px] uppercase tracking-widest mt-1">Docs</span>
306
+ </div>
307
+ <!-- ACTIVE TAB: Examples -->
308
+ <div class="flex flex-col items-center justify-center text-[#72dcff] bg-[#72dcff]/10 rounded-xl px-3 py-1 active:translate-y-0.5 duration-150">
309
+ <span class="material-symbols-outlined">bubble_chart</span>
310
+ <span class="font-space-grotesk text-[10px] uppercase tracking-widest mt-1">Examples</span>
311
+ </div>
312
+ <div class="flex flex-col items-center justify-center text-[#e1e4fa]/50 px-3 py-1 hover:text-[#dd8bfb] transition-all active:translate-y-0.5 duration-150">
313
+ <span class="material-symbols-outlined">code</span>
314
+ <span class="font-space-grotesk text-[10px] uppercase tracking-widest mt-1">Code</span>
315
+ </div>
316
+ </nav>
317
+ </body></html>