thucdangvan020999 commited on
Commit
b43c43c
·
verified ·
1 Parent(s): 85e547c

Upload index.html with huggingface_hub

Browse files
Files changed (1) hide show
  1. index.html +1122 -19
index.html CHANGED
@@ -1,19 +1,1122 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
19
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title>Vietnam Economic Growth Report 2025</title>
7
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/7.0.0/css/all.min.css">
8
+ <style>
9
+ :root {
10
+ --primary: #06705c;
11
+ --secondary: #34b88b;
12
+ --accent: #fedb41;
13
+ --danger: #dc3545;
14
+ --bg: #f9fafb;
15
+ --card-bg: #fff;
16
+ --text-main: #232931;
17
+ --text-muted: #8993a4;
18
+ --border: #e2e8f0;
19
+ --shadow: 0 2px 12px rgba(6,112,92,0.06);
20
+ --radius: 1.25rem;
21
+ --toc-width: 340px;
22
+ --toc-width-m: 80vw;
23
+ --header-h: 64px;
24
+ --font-main: 'Inter', 'Segoe UI', Arial, sans-serif;
25
+ --font-mono: 'Menlo', 'Consolas', monospace;
26
+ }
27
+
28
+ html { scroll-behavior: smooth }
29
+ body {
30
+ margin: 0;
31
+ font-family: var(--font-main);
32
+ font-size: clamp(1rem, 2vw, 1.17rem);
33
+ background: var(--bg);
34
+ color: var(--text-main);
35
+ }
36
+
37
+ header {
38
+ background: var(--primary);
39
+ color: #fff;
40
+ position: sticky;
41
+ top: 0; left: 0; z-index: 20;
42
+ box-shadow: 0 2px 12px rgba(6,112,92,0.04);
43
+ display: flex;
44
+ align-items: center;
45
+ height: var(--header-h);
46
+ padding: 0 clamp(1.3rem, 4vw, 3.8rem);
47
+ gap: 1.2rem;
48
+ }
49
+ header .logo {
50
+ font-size: 1.7rem;
51
+ font-weight: 800;
52
+ letter-spacing: 0.03em;
53
+ }
54
+ header .report-subtitle {
55
+ color: var(--accent);
56
+ font-size: 1rem;
57
+ font-weight: 400;
58
+ margin-left: .3rem;
59
+ opacity: .85;
60
+ letter-spacing: 0.01em;
61
+ }
62
+ header .search-wrap {
63
+ flex: 1 1 auto;
64
+ display: flex;
65
+ align-items: center;
66
+ justify-content: flex-end;
67
+ max-width: 420px;
68
+ }
69
+ .search-box {
70
+ width: 100%;
71
+ max-width: 280px;
72
+ position: relative;
73
+ }
74
+ .search-box input {
75
+ width: 100%;
76
+ padding: 0.5rem 2.1rem 0.5rem 1rem;
77
+ border-radius: 100px;
78
+ border: none;
79
+ background: #fff;
80
+ color: var(--text-main);
81
+ font-size: 1rem;
82
+ box-shadow: 0 1px 8px rgba(0,0,0,0.04);
83
+ outline: none;
84
+ transition: background .2s;
85
+ }
86
+ .search-box .fa-search {
87
+ position: absolute; right: .7rem; top: 50%; transform: translateY(-50%);
88
+ color: var(--text-muted);
89
+ font-size: 1rem;
90
+ pointer-events: none;
91
+ }
92
+
93
+ main {
94
+ max-width: 1100px;
95
+ margin: clamp(1.2rem, 3vw, 3.6rem) auto;
96
+ display: flex;
97
+ gap: 2.2rem;
98
+ }
99
+ nav#toc {
100
+ position: sticky;
101
+ top: calc(var(--header-h) + 1.5rem);
102
+ align-self: flex-start;
103
+ width: var(--toc-width);
104
+ background: var(--card-bg);
105
+ border-radius: var(--radius);
106
+ box-shadow: var(--shadow);
107
+ padding: 1.4rem 1.2rem 1.8rem;
108
+ margin-bottom: 2rem;
109
+ z-index: 5;
110
+ max-height: calc(100vh - var(--header-h) - 2rem);
111
+ overflow-y: auto;
112
+ font-size: 1rem;
113
+ transition: width .3s;
114
+ }
115
+ nav#toc h2 {
116
+ font-size: 1.09rem;
117
+ margin: 0 0 .9em .1em;
118
+ color: var(--primary);
119
+ font-weight: 600;
120
+ letter-spacing: 0.01em;
121
+ }
122
+ nav#toc ul {
123
+ list-style: none;
124
+ margin: 0; padding: 0 0 0 .2em;
125
+ }
126
+ nav#toc ul li {
127
+ margin: .2em 0;
128
+ }
129
+ nav#toc ul li a {
130
+ text-decoration: none;
131
+ color: var(--text-main);
132
+ transition: color .18s;
133
+ padding: .13em .18em;
134
+ border-radius: 5px;
135
+ display: inline-block;
136
+ }
137
+ nav#toc ul ul {
138
+ margin-left: 1.3em;
139
+ border-left: 2px solid #f2f6f5;
140
+ padding-left: .5em;
141
+ }
142
+ nav#toc ul li a.active,
143
+ nav#toc ul li a:focus-visible {
144
+ background: var(--secondary);
145
+ color: var(--accent);
146
+ font-weight: 600;
147
+ }
148
+ @media (max-width: 1024px) {
149
+ main { flex-direction: column; }
150
+ nav#toc {
151
+ width: var(--toc-width-m);
152
+ max-width: 95vw;
153
+ margin: 0 auto 2rem auto;
154
+ position: static;
155
+ box-shadow: 0 3px 18px #06705c10;
156
+ }
157
+ }
158
+ @media (max-width: 768px) {
159
+ main { padding: 0 0.6rem; }
160
+ nav#toc {
161
+ width: 100%;
162
+ max-width: 100vw;
163
+ padding: 1.1rem 0.6rem 1.5rem;
164
+ font-size: 0.97rem;
165
+ }
166
+ }
167
+
168
+ section, .card-section {
169
+ background: var(--card-bg);
170
+ border-radius: var(--radius);
171
+ box-shadow: var(--shadow);
172
+ padding: clamp(1.2rem, 2vw, 2.5rem);
173
+ margin-bottom: 2.5rem;
174
+ min-width: 0;
175
+ }
176
+ section h2, .card-section h2 { margin-top: 0; font-weight: 700; color: var(--primary);}
177
+ section h3 { color: var(--secondary); font-weight: 600; margin-top: 2em; }
178
+ section h4 { color: var(--primary); font-weight: 600; }
179
+ section summary, .card-section summary {
180
+ font-size: 1.07rem;
181
+ font-weight: 600;
182
+ cursor: pointer;
183
+ color: var(--primary);
184
+ background: #ededf7;
185
+ border-radius: .5em;
186
+ padding: .4em .8em;
187
+ margin-bottom: .7em;
188
+ }
189
+ section details > summary::-webkit-details-marker {
190
+ display: none;
191
+ }
192
+
193
+ .data-charts {
194
+ display: grid;
195
+ grid-template-columns: 1fr 1fr;
196
+ gap: 2.2rem 2.8rem;
197
+ margin-top: 0.5em;
198
+ margin-bottom: 1em;
199
+ }
200
+ .charts-flex {
201
+ display: flex;
202
+ gap: 2.5rem;
203
+ flex-wrap: wrap;
204
+ margin-bottom: 1em
205
+ }
206
+ .chart-card {
207
+ background: var(--bg);
208
+ border-radius: 1rem;
209
+ box-shadow: 0 2px 8px #06705c0e;
210
+ padding: 1.3rem 1.3rem 1rem;
211
+ max-width: 100%;
212
+ flex: 1 1 310px;
213
+ min-width: 270px;
214
+ }
215
+ .chart-title {
216
+ font-size: 1rem;
217
+ color: var(--primary);
218
+ font-weight: 500;
219
+ margin-bottom: .6em;
220
+ letter-spacing: 0.01em;
221
+ display: flex; align-items: center; gap: .5em;
222
+ }
223
+
224
+ @container chart-card (max-width: 350px) {
225
+ .chart-card { padding: .8rem; }
226
+ .chart-title { font-size: .94rem }
227
+ }
228
+
229
+ .stats-grid {
230
+ display: grid;
231
+ grid-template-columns: repeat(auto-fit, minmax(185px, 1fr));
232
+ gap: .8rem 1.7rem;
233
+ margin: 1.5em 0 2.5em 0;
234
+ }
235
+ .stat-block {
236
+ background: #e6f5f1;
237
+ border-radius: 1em;
238
+ padding: .93em 1.1em;
239
+ text-align: center;
240
+ font-size: 1.04rem;
241
+ color: var(--primary);
242
+ font-weight: 500;
243
+ min-width: 0;
244
+ }
245
+ .stat-value {
246
+ display: block;
247
+ font-weight: bold;
248
+ font-size: 1.25em;
249
+ color: var(--secondary);
250
+ margin-bottom: .27em;
251
+ letter-spacing: 0.01em;
252
+ }
253
+ .stat-label {
254
+ color: var(--text-muted);
255
+ font-size: .99em;
256
+ font-weight: 500;
257
+ }
258
+
259
+ .findings-table-wrap {
260
+ width: 100%;
261
+ overflow-x: auto;
262
+ margin: 1.2em 0 1.6em 0;
263
+ }
264
+ table.research-table {
265
+ width: 100%;
266
+ border-collapse: collapse;
267
+ background: #fbfbfe;
268
+ border-radius: .9em;
269
+ overflow: hidden;
270
+ box-shadow: 0 2px 8px #06705c15;
271
+ font-size: 1em;
272
+ }
273
+ table.research-table th, table.research-table td {
274
+ padding: .6em .8em;
275
+ text-align: left;
276
+ border-bottom: 1px solid #f1f7f5;
277
+ }
278
+ table.research-table th {
279
+ background: #e6f5f1;
280
+ color: var(--primary);
281
+ cursor: pointer;
282
+ font-weight: 600;
283
+ position: relative;
284
+ overflow: visible;
285
+ user-select: none;
286
+ }
287
+ table.research-table th.sorted-asc:after,
288
+ table.research-table th.sorted-desc:after {
289
+ content: '';
290
+ border: solid var(--primary);
291
+ border-width: 0 2px 2px 0;
292
+ display: inline-block;
293
+ padding: 2px;
294
+ margin-left: .38em;
295
+ transform: rotate(-135deg);
296
+ }
297
+ table.research-table th.sorted-desc:after {
298
+ transform: rotate(45deg);
299
+ margin-top: .1em;
300
+ }
301
+ table.research-table tr:last-child td { border: none; }
302
+ table.research-table tbody tr:hover { background: #f9fdfb; }
303
+
304
+ .filter-controls {
305
+ display: flex;
306
+ gap: 1.2em;
307
+ align-items: center;
308
+ margin-bottom: 1em;
309
+ margin-top: .7em;
310
+ flex-wrap: wrap;
311
+ }
312
+ .filter-chip {
313
+ background: #f1f5f9;
314
+ color: var(--primary);
315
+ padding: .33em .85em;
316
+ border-radius: 100px;
317
+ font-weight: 500;
318
+ cursor: pointer;
319
+ transition: background .14s;
320
+ border: 1px solid #e1ede8;
321
+ margin-right: .3em;
322
+ user-select: none;
323
+ }
324
+ .filter-chip.selected, .filter-chip.active {
325
+ background: var(--secondary);
326
+ color: #fff;
327
+ border-color: var(--secondary);
328
+ }
329
+
330
+ details {
331
+ margin-top: 1.3em;
332
+ margin-bottom: .1em;
333
+ }
334
+ .progress-track {
335
+ width: 100%; background: #e6f5f1; border-radius: 6px; height: 8px;
336
+ margin-top: 1.0em; margin-bottom: 1.2em;
337
+ position: relative;
338
+ overflow: hidden;
339
+ }
340
+ .progress-bar {
341
+ background: var(--secondary);
342
+ height: 100%;
343
+ border-radius: 6px;
344
+ width: 0; min-width: 8%;
345
+ transition: width 1.2s cubic-bezier(.27, .86, .44, 1.22);
346
+ }
347
+
348
+
349
+ .export-actions {
350
+ margin: 1.25em 0 .9em auto;
351
+ display: flex;
352
+ align-items: center;
353
+ gap: 1em;
354
+ justify-content: flex-end;
355
+ }
356
+ .export-actions button {
357
+ background: var(--secondary);
358
+ color: #fff;
359
+ border: none;
360
+ border-radius: 7px;
361
+ font-size: .97em;
362
+ font-family: inherit;
363
+ font-weight: 500;
364
+ padding: 0.5em 1.15em;
365
+ margin: 0;
366
+ transition: background .18s;
367
+ cursor: pointer;
368
+ display: flex;
369
+ align-items: center;
370
+ gap: .45em;
371
+ }
372
+ .export-actions button:hover {
373
+ background: var(--primary);
374
+ }
375
+ .clipboard-status {
376
+ color: var(--primary);
377
+ font-size: .98em;
378
+ background: #edeffb;
379
+ border-radius: 7px;
380
+ padding: .25em .7em;
381
+ margin-left: .8em;
382
+ animation: fadeinout 2.1s linear 1;
383
+ opacity: 1;
384
+ display: inline-block;
385
+ vertical-align: middle;
386
+ }
387
+ @keyframes fadeinout {
388
+ from { opacity: 0; }
389
+ 10%,80% { opacity: 1; }
390
+ to { opacity: 0; }
391
+ }
392
+
393
+ /* Typography & links */
394
+ h1 {
395
+ font-size: clamp(1.8rem, 4vw, 2.3rem);
396
+ color: var(--primary);
397
+ font-weight: 800;
398
+ margin-bottom: .25em;
399
+ line-height: 1.18;
400
+ letter-spacing: -0.01em;
401
+ }
402
+ h2 { font-size: clamp(1.2rem,2vw,1.45rem)}
403
+ h3 { font-size: clamp(1.09rem,1.4vw,1.13rem)}
404
+ h4 { font-size: clamp(0.99rem,1vw,1.05rem)}
405
+ p, ul, ol { line-height: 1.8; font-size: 1em }
406
+ ul, ol { padding-left: 1.7em; }
407
+ a { color: var(--primary); transition: color .2s }
408
+ a:hover { color: var(--secondary); }
409
+
410
+ .highlight {
411
+ background: var(--accent);
412
+ color: #052e26;
413
+ padding: .13em .32em;
414
+ border-radius: .35em;
415
+ font-size: .98em;
416
+ font-weight: 500;
417
+ margin: 0 .13em;
418
+ }
419
+
420
+ blockquote {
421
+ border-left: 4px solid var(--secondary);
422
+ background: #e6f5f1;
423
+ color: var(--primary);
424
+ font-size: 1.05em;
425
+ padding: .9em 1.6em .9em 1em;
426
+ margin: 1.5em 0;
427
+ border-radius: .9em;
428
+ font-style: italic;
429
+ }
430
+
431
+ /* Citation list */
432
+ .sources-list {
433
+ font-size: .96em;
434
+ color: var(--text-muted);
435
+ background: #f1f7f8;
436
+ border-radius: .9em;
437
+ padding: 1.3em 1em 1.3em 1.45em;
438
+ margin: 1em 0;
439
+ border-left: 6px solid var(--secondary);
440
+ }
441
+ .sources-list ol {
442
+ margin: 0;
443
+ padding-left: 1.8em;
444
+ }
445
+ .sources-list li {
446
+ margin-bottom: .57em;
447
+ line-height: 1.6;
448
+ }
449
+
450
+ /* Utilities */
451
+ .sr-only {
452
+ position: absolute;
453
+ left: -9000px; width: 1px; height: 1px; overflow: hidden;
454
+ }
455
+ .mb-0 { margin-bottom: 0 !important }
456
+
457
+ /* Responsive @ 768 and below */
458
+ @media (max-width: 768px) {
459
+ header, main {
460
+ padding-left: .5em; padding-right: .5em;
461
+ }
462
+ section, .card-section {
463
+ padding: 1em .7em;
464
+ }
465
+ .data-charts { grid-template-columns: 1fr; gap: 2rem }
466
+ .charts-flex { flex-direction: column; gap: 1.2rem }
467
+ }
468
+ @media (max-width: 500px) {
469
+ h1 { font-size: 1.25rem }
470
+ nav#toc { font-size: .95rem; padding:.7rem }
471
+ }
472
+ </style>
473
+ </head>
474
+ <body>
475
+ <header>
476
+ <span class="logo" aria-label="Vietnam Economic Growth Report 2025">
477
+ <i class="fa-sharp fa-solid fa-chart-line"></i>
478
+ Vietnam 2025
479
+ </span>
480
+ <span class="report-subtitle">Economic Growth Report</span>
481
+ <div class="search-wrap">
482
+ <form class="search-box" id="site-search" autocomplete="off">
483
+ <input type="search" placeholder="Search the report…" id="searchInput" aria-label="Search" />
484
+ <i class="fas fa-search"></i>
485
+ </form>
486
+ </div>
487
+ </header>
488
+ <main>
489
+ <!-- Table of Contents -->
490
+ <nav id="toc" aria-label="Table of Contents">
491
+ <h2><i class="fa-regular fa-list-alt"></i> Table of Contents</h2>
492
+ <ul>
493
+ <li><a href="#executive-summary">Executive Summary</a></li>
494
+ <li>
495
+ <a href="#key-economic-indicators">Key Economic Indicators</a>
496
+ <ul>
497
+ <li><a href="#gdp-growth-performance">GDP Growth Performance</a></li>
498
+ <li><a href="#inflation-rate">Inflation Rate</a></li>
499
+ <li><a href="#unemployment-rate">Unemployment Rate</a></li>
500
+ <li><a href="#foreign-direct-investment">Foreign Direct Investment (FDI)</a></li>
501
+ </ul>
502
+ </li>
503
+ <li>
504
+ <a href="#sectoral-analysis">Sectoral Analysis</a>
505
+ </li>
506
+ <li>
507
+ <a href="#challenges-risk-factors">Challenges & Risk Factors</a>
508
+ </li>
509
+ <li>
510
+ <a href="#historical-comparison">Historical Comparison</a>
511
+ </li>
512
+ <li>
513
+ <a href="#economic-outlook-projections">Economic Outlook & Projections</a>
514
+ </li>
515
+ <li>
516
+ <a href="#conclusion">Conclusion</a>
517
+ </li>
518
+ <li>
519
+ <a href="#sources-citations">Sources & Citations</a>
520
+ </li>
521
+ </ul>
522
+ </nav>
523
+ <!-- Report content -->
524
+ <section>
525
+ <h1 id="executive-summary">
526
+ Executive Summary
527
+ </h1>
528
+ <div class="progress-track" title="2025 GDP H1 Progress Toward Target">
529
+ <div class="progress-bar" id="gdp-progress"></div>
530
+ </div>
531
+ <p>
532
+ Vietnam's economy continues to demonstrate robust growth momentum in 2025, with GDP expanding <span class="highlight">7.96%</span> in Q2 2025 compared to the same period last year. H1 2025 saw GDP growth of <span class="highlight">7.52%</span>—the strongest first-half showing since 2011—led by <span class="highlight">industry</span> and <span class="highlight">services</span>. Vietnam sustained high growth despite <b>global trade tensions</b> and new <b>US tariffs</b>, confirming its position as a resilient, dynamic economy in Southeast Asia.
533
+ </p>
534
+ </section>
535
+ <section id="key-economic-indicators">
536
+ <h2>
537
+ Key Economic Indicators 2025
538
+ </h2>
539
+ <div class="stats-grid">
540
+ <div class="stat-block">
541
+ <span class="stat-value">7.96%</span>
542
+ <span class="stat-label">Q2 GDP YoY Growth</span>
543
+ </div>
544
+ <div class="stat-block">
545
+ <span class="stat-value">7.52%</span>
546
+ <span class="stat-label">H1 2025 GDP Growth</span>
547
+ </div>
548
+ <div class="stat-block">
549
+ <span class="stat-value">3.57%</span>
550
+ <span class="stat-label">June 2025 Inflation</span>
551
+ </div>
552
+ <div class="stat-block">
553
+ <span class="stat-value">2.20%</span>
554
+ <span class="stat-label">Q1 2025 Unemployment</span>
555
+ </div>
556
+ <div class="stat-block">
557
+ <span class="stat-value">$21.5B</span>
558
+ <span class="stat-label">H1 2025 FDI</span>
559
+ </div>
560
+ </div>
561
+ <div class="data-charts" id="key-indicators-charts" style="margin-bottom:1.2rem;">
562
+ <div class="chart-card">
563
+ <div class="chart-title">
564
+ <i class="fa-solid fa-chart-line"></i> GDP Growth Q1–Q2 2025
565
+ </div>
566
+ <canvas id="gdpGrowthChart" width="360" height="170" aria-label="GDP Growth 2025"></canvas>
567
+ <div class="chart-caption" style="font-size:.95em; color:var(--text-muted);margin-top:.4em;">
568
+ GDP growth rates by quarter in 2025. <span style="color:var(--secondary)">Government target: 8.3–8.5%</span>
569
+ </div>
570
+ </div>
571
+ <div class="chart-card">
572
+ <div class="chart-title">
573
+ <i class="fa-solid fa-chart-bar"></i> 2025 GDP Forecasts
574
+ </div>
575
+ <canvas id="gdpForecastChart" width="360" height="170" aria-label="GDP Forecasts"></canvas>
576
+ <div class="chart-caption" style="font-size:.94em; color:var(--text-muted)">
577
+ Diverse projections from major institutions and official targets.
578
+ </div>
579
+ </div>
580
+ </div>
581
+ <details open>
582
+ <summary id="gdp-growth-performance">GDP Growth Performance</summary>
583
+ <ul>
584
+ <li><strong>Q1 2025:</strong> <span class="highlight">6.9%</span> year-on-year growth</li>
585
+ <li><strong>Q2 2025:</strong> <span class="highlight">7.96%</span> year-on-year growth</li>
586
+ <li><strong>H1 2025:</strong> <span class="highlight">7.52%</span> (highest H1 since 2011)</li>
587
+ </ul>
588
+ <ul>
589
+ <li><strong>World Bank 2025 forecast:</strong> <span class="highlight">5.8%</span></li>
590
+ <li><strong>ADB 2025 forecast:</strong> <span class="highlight">6.6%</span> (up from 6.3%)</li>
591
+ <li><strong>IMF 2025 forecast:</strong> <span class="highlight">5.2%</span></li>
592
+ <li><strong>Government target:</strong> <span class="highlight">8.3–8.5%</span></li>
593
+ </ul>
594
+ </details>
595
+ <details>
596
+ <summary id="inflation-rate">Inflation Rate</summary>
597
+ <ul>
598
+ <li><strong>May 2025:</strong> <span class="highlight">3.24%</span></li>
599
+ <li><strong>June 2025:</strong> <span class="highlight">3.57%</span> (highest YTD)</li>
600
+ <li><strong>IMF 2025 forecast:</strong> <span class="highlight">2.9%</span></li>
601
+ <li><strong>ADB 2025 forecast:</strong> <span class="highlight">4.0%</span></li>
602
+ </ul>
603
+ <p>
604
+ Inflation remains well-controlled within the 3-4.5% target range, minimizing risks to real incomes and domestic demand.
605
+ </p>
606
+ </details>
607
+ <details>
608
+ <summary id="unemployment-rate">Unemployment Rate</summary>
609
+ <ul>
610
+ <li><strong>Q1 2025:</strong> <span class="highlight">2.20%</span> (down from 2.22% in Q4 2024)</li>
611
+ </ul>
612
+ <p>
613
+ Unemployment is at historic lows, reflecting a resilient labor market and strong consumption fundamentals.
614
+ </p>
615
+ </details>
616
+ <details>
617
+ <summary id="foreign-direct-investment">Foreign Direct Investment (FDI)</summary>
618
+ <ul>
619
+ <li><strong>First 5 months 2025 registered capital:</strong> <span class="highlight">$18.4B</span> (up 51% YoY)</li>
620
+ <li><strong>First 5 months 2025 disbursed capital:</strong> <span class="highlight">$8.9B</span></li>
621
+ <li><strong>First half 2025 FDI:</strong> <span class="highlight">$21.51B</span> (up 32.6% YoY)</li>
622
+ </ul>
623
+ <p>
624
+ Surging FDI signals continued international confidence in Vietnam's policy framework, market opportunity, and supply chain resilience.
625
+ </p>
626
+ </details>
627
+ </section>
628
+ <section id="sectoral-analysis">
629
+ <h2>Sectoral Analysis</h2>
630
+ <div class="charts-flex">
631
+ <div class="chart-card">
632
+ <div class="chart-title"><i class="fa-solid fa-chart-pie"></i> Sector Contributions (H1 2025)</div>
633
+ <canvas id="sectorPieChart" width="320" height="180" aria-label="Sector Contributions"></canvas>
634
+ </div>
635
+ <div class="chart-card" style="max-width:420px">
636
+ <div class="chart-title"><i class="fa-solid fa-basket-shopping"></i> Retail Sales Growth</div>
637
+ <canvas id="retailBarChart" width="320" height="180" aria-label="Retail Sales"></canvas>
638
+ </div>
639
+ </div>
640
+ <ul>
641
+ <li><b>Services sector</b>: Largest contributor to GDP growth</li>
642
+ <li><b>Manufacturing sector</b>: Maintains a positive trajectory</li>
643
+ <li><b>Export industries</b>: Remain the backbone of economic expansion</li>
644
+ <li>
645
+ <b>Banking sector</b>: Projected to see a <span class="highlight">17%</span> increase in earnings driven by <span class="highlight">15%</span> credit growth
646
+ </li>
647
+ </ul>
648
+ <blockquote>
649
+ Retail sales in Q1 2025: <b>1.708 quadrillion VND</b> (~<span class="highlight">$66.83 billion</span>), a <span class="highlight">9.9%</span> YoY increase.
650
+ </blockquote>
651
+ </section>
652
+ <section id="challenges-risk-factors">
653
+ <h2>Challenges and Risk Factors</h2>
654
+ <div class="findings-table-wrap">
655
+ <table class="research-table" id="challenges-table">
656
+ <thead>
657
+ <tr>
658
+ <th>Risk Factor</th>
659
+ <th>Implication</th>
660
+ <th>Relevance 2025</th>
661
+ </tr>
662
+ </thead>
663
+ <tbody>
664
+ <tr>
665
+ <td>Global Trade Tensions</td>
666
+ <td>Disrupt export momentum, limit overseas demand</td>
667
+ <td>High</td>
668
+ </tr>
669
+ <tr>
670
+ <td>US Tariff Policies</td>
671
+ <td>Pressure export-oriented businesses</td>
672
+ <td>High</td>
673
+ </tr>
674
+ <tr>
675
+ <td>Geopolitical Instability</td>
676
+ <td>Increase business uncertainty, risk premiums</td>
677
+ <td>Medium</td>
678
+ </tr>
679
+ <tr>
680
+ <td>FDI Overdependence</td>
681
+ <td>Potential for inflation; vulnerability to capital flow shifts</td>
682
+ <td>Medium</td>
683
+ </tr>
684
+ <tr>
685
+ <td>Macroeconomic Stability</td>
686
+ <td>Rising public debt, inflation risk</td>
687
+ <td>Medium</td>
688
+ </tr>
689
+ </tbody>
690
+ </table>
691
+ </div>
692
+ <p>
693
+ Policymakers must balance <b>ambitious growth</b> targets with prudent oversight of capital flows, currency, and fiscal policy to ensure continued resilience.
694
+ </p>
695
+ </section>
696
+ <section id="historical-comparison">
697
+ <h2>Historical Comparison</h2>
698
+ <div class="charts-flex">
699
+ <div class="chart-card" style="flex:1 1 340px;min-width:220px;">
700
+ <div class="chart-title"><i class="fa-solid fa-timeline"></i> GDP Growth Q1 YoY (2020–2025)</div>
701
+ <canvas id="histGdpChart" width="320" height="180" aria-label="Historical GDP Growth"></canvas>
702
+ </div>
703
+ <div style="flex:2 1 380px;">
704
+ <ul>
705
+ <li><b>2024:</b> GDP grew <span class="highlight">7.1%</span></li>
706
+ <li><b>2025 (forecast):</b> Growth may moderate amid external headwinds</li>
707
+ <li><b>Long-term:</b> Vietnam’s fundamentals remain <span class="highlight">resilient</span> despite short-term volatility</li>
708
+ </ul>
709
+ <blockquote>
710
+ Year-on-year GDP Q1 growth rates (2020–2025): <span class="highlight">3.21%</span>, <span class="highlight">4.85%</span>, <span class="highlight">5.42%</span>, <span class="highlight">3.46%</span>, <span class="highlight">5.98%</span>, <span class="highlight">6.93%</span>
711
+ </blockquote>
712
+ </div>
713
+ </div>
714
+ </section>
715
+ <section id="economic-outlook-projections">
716
+ <h2>Economic Outlook and Projections</h2>
717
+ <details open>
718
+ <summary>Near-term Prospects (2025)</summary>
719
+ <p>
720
+ The economy started 2025 strongly, delivering <span class="highlight">6.9%</span> YoY GDP growth in Q1.
721
+ However, the landscape is more challenging due to external headwinds. The government’s ambitious growth
722
+ target (<span class="highlight">8.3–8.5%</span>) contrasts with more modest global forecasts, but robust
723
+ FDI, low unemployment, and resilient demand support continued solid performance.
724
+ </p>
725
+ </details>
726
+ <details>
727
+ <summary>Key Supporting Factors</summary>
728
+ <ul>
729
+ <li><strong>Robust FDI inflows</strong></li>
730
+ <li><strong>Low unemployment</strong> sustains domestic consumption</li>
731
+ <li><strong>Controlled inflation</strong> protects real incomes</li>
732
+ <li><strong>Export competitiveness</strong> despite trade challenges</li>
733
+ <li><strong>Parliamentary Support</strong>: Growth target raised from 6.5% to "at least 8%"</li>
734
+ </ul>
735
+ </details>
736
+ <details>
737
+ <summary>Risk Mitigation Strategies</summary>
738
+ <ul>
739
+ <li>Diversify export markets</li>
740
+ <li>Strengthen domestic demand</li>
741
+ <li>Bolster economic resilience</li>
742
+ <li>Maintain macroeconomic stability</li>
743
+ <li>Provide space for fiscal policy to offset global shocks</li>
744
+ </ul>
745
+ </details>
746
+ </section>
747
+ <section id="conclusion">
748
+ <h2>Conclusion</h2>
749
+ <p>
750
+ Vietnam's 2025 economic performance highlights the nation's resilience and growth prospects. While facing ongoing
751
+ <span class="highlight">global challenges</span>, the economy benefits from strong fundamentals: <b>low unemployment</b>, <b>controlled inflation</b>, and <b>surging FDI</b>.
752
+ The divergence between official and international forecasts underlines a cautiously optimistic outlook. Ambitious
753
+ GDP targets rely on continued FDI confidence. The government's determination sets the stage for higher growth
754
+ in subsequent years.
755
+ </p>
756
+ </section>
757
+ <section id="sources-citations">
758
+ <h2>Sources and Citations</h2>
759
+ <div class="export-actions">
760
+ <button id="btn-copy-sources"><i class="fa-solid fa-copy"></i> Copy Citations</button>
761
+ <button id="btn-export-pdf"><i class="fa-solid fa-file-pdf"></i> Export to PDF</button>
762
+ </div>
763
+ <div class="sources-list" id="citations-list">
764
+ <ol>
765
+ <li>Trading Economics - Vietnam GDP Annual Growth Rate &nbsp; <a href="https://tradingeconomics.com/vietnam/gdp-growth-annual" target="_blank">[Link]</a></li>
766
+ <li>IMF - Vietnam Country Profile &nbsp; <a href="https://www.imf.org/en/Countries/VNM" target="_blank">[Link]</a></li>
767
+ <li>World Economics - Vietnam GDP Estimates &nbsp; <a href="https://www.worldeconomics.com/GDP/Vietnam.gdp" target="_blank">[Link]</a></li>
768
+ <li>General Statistics Office &nbsp; <a href="https://www.gso.gov.vn/en/" target="_blank">[Link]</a></li>
769
+ <li>Wikipedia - Economy of Vietnam &nbsp; <a href="https://en.wikipedia.org/wiki/Economy_of_Vietnam" target="_blank">[Link]</a></li>
770
+ <li>IMF - Vietnam and the IMF &nbsp; <a href="https://www.imf.org/en/Countries/VNM" target="_blank">[Link]</a></li>
771
+ <li>FocusEconomics - Vietnam Economic Indicators &nbsp; <a href="https://www.focus-economics.com/countries/vietnam" target="_blank">[Link]</a></li>
772
+ <li>National Statistics Office of Vietnam &nbsp; <a href="https://www.gso.gov.vn/en/data-and-statistics/" target="_blank">[Link]</a></li>
773
+ <li>VietnamNet - Economic News &nbsp; <a href="https://vietnamnet.vn/" target="_blank">[Link]</a></li>
774
+ <li>IMF - Article IV Mission Reports &nbsp; <a href="https://www.imf.org/en/Publications/CR" target="_blank">[Link]</a></li>
775
+ <li>Vietnam Briefing &nbsp; <a href="https://www.vietnam-briefing.com/" target="_blank">[Link]</a></li>
776
+ <li>Vietnam Investment Review &nbsp; <a href="https://vir.com.vn/" target="_blank">[Link]</a></li>
777
+ <li>Trading Economics - Vietnam Foreign Direct Investment &nbsp; <a href="https://tradingeconomics.com/vietnam/foreign-direct-investment" target="_blank">[Link]</a></li>
778
+ <li>White & Case - Regional Economic Outlook &nbsp; <a href="https://www.whitecase.com/" target="_blank">[Link]</a></li>
779
+ <li>Vietnam Economic Times &nbsp; <a href="https://vneconomictimes.com/" target="_blank">[Link]</a></li>
780
+ <li>ADB - Vietnam Country Partnership &nbsp; <a href="https://www.adb.org/countries/viet-nam/main" target="_blank">[Link]</a></li>
781
+ <li>Ministry of Planning and Investment &nbsp; <a href="https://www.mpi.gov.vn/en/" target="_blank">[Link]</a></li>
782
+ </ol>
783
+ </div>
784
+ </section>
785
+ </main>
786
+ <script>
787
+ // Table of Contents - highlight on scroll, smooth scroll
788
+ (function tocScrollHighlight() {
789
+ const tocLinks = Array.from(document.querySelectorAll('#toc a'));
790
+ const headings = tocLinks.map(l => {
791
+ try { return document.querySelector(decodeURIComponent(l.hash)) } catch { return null }
792
+ });
793
+ let activeIdx = -1;
794
+ function onScroll() {
795
+ let found = -1;
796
+ for (let i=0; i<headings.length; ++i) {
797
+ const el = headings[i];
798
+ if (!el) continue;
799
+ const rect = el.getBoundingClientRect();
800
+ if (rect.top < window.innerHeight * 0.18) found = i;
801
+ }
802
+ if (found >= 0 && found !== activeIdx) {
803
+ tocLinks.forEach(l=>l.classList.remove('active'));
804
+ tocLinks[found].classList.add('active');
805
+ activeIdx = found;
806
+ }
807
+ }
808
+ onScroll();
809
+ window.addEventListener('scroll', onScroll, {passive:true});
810
+ // Smooth scroll
811
+ tocLinks.forEach(link => {
812
+ link.addEventListener('click', e => {
813
+ const target = document.querySelector(decodeURIComponent(link.hash));
814
+ if (target) {
815
+ e.preventDefault();
816
+ target.scrollIntoView({behavior:"smooth",block:"start"});
817
+ setTimeout(()=>link.focus(), 800);
818
+ }
819
+ })
820
+ })
821
+ })();
822
+
823
+ // Progress bar: GDP H1 vs Target (between 7.52% and target 8.5%)
824
+ (function gdpProgress(){
825
+ const val = 7.52, target = 8.5, min = 0, w = Math.max(Math.min((val-min)/(target-min)*100, 100), 2);
826
+ document.getElementById('gdp-progress').style.width = w+'%';
827
+ })();
828
+
829
+ // Charts: Use canvas API for simple bar/line/pie charts (no frameworks)
830
+ // Helper: drawBarChart, drawLineChart, drawPieChart
831
+
832
+ function drawBarChart(ctx, {labels, values, colors, yMax, grid=true, units="%"}){
833
+ const w = ctx.canvas.width, h = ctx.canvas.height;
834
+ ctx.clearRect(0,0,w,h);
835
+ const m = {l:40, r:14, t:16, b:36};
836
+ const chartW = w-m.l-m.r, chartH = h-m.t-m.b;
837
+ const N = values.length;
838
+ yMax = yMax || Math.max(...values, 1);
839
+
840
+ if (grid) for (let k=0;k<=5;++k) {
841
+ let y = m.t + chartH*k/5;
842
+ ctx.strokeStyle="#e6f5f1"; ctx.lineWidth=1; ctx.beginPath();
843
+ ctx.moveTo(m.l, y); ctx.lineTo(w-m.r, y); ctx.stroke();
844
+ ctx.font="10px Inter"; ctx.fillStyle="#b8cbc3";
845
+ ctx.textAlign="right"; ctx.textBaseline="middle";
846
+ ctx.fillText((yMax*(1-k/5)).toFixed(1)+units, m.l-4, y);
847
+ }
848
+ for(let i=0; i<N; ++i){
849
+ let x = m.l + chartW/N*i + chartW/(2*N), barW = chartW/(N*1.5);
850
+ let barH = values[i]/yMax*chartH;
851
+ ctx.save();
852
+ ctx.beginPath();
853
+ ctx.fillStyle = colors[i%colors.length] || "#07ac9b";
854
+ ctx.shadowColor="#06a08622"; ctx.shadowBlur=6;
855
+ ctx.roundRect(x-barW/2, m.t+chartH-barH, barW, barH, 6);
856
+ ctx.fill(); ctx.restore();
857
+
858
+ ctx.font="11px Inter"; ctx.textAlign="center"; ctx.fillStyle="#2b3d33";
859
+ ctx.fillText(labels[i], x, h-m.b+13);
860
+ ctx.font="bold 12px Inter"; ctx.fillStyle=colors[i%colors.length];
861
+ ctx.fillText(values[i].toFixed(2)+units, x, m.t+chartH-barH-10);
862
+ }
863
+ }
864
+ function drawLineChart(ctx, {labels, values, color="#06705c", dots=true, fill='#e6f5f1', yMax, units="%"}) {
865
+ const w = ctx.canvas.width, h = ctx.canvas.height;
866
+ ctx.clearRect(0,0,w,h);
867
+ const m = {l:42, r:20, t:22, b:36};
868
+ const chartW = w-m.l-m.r, chartH = h-m.t-m.b;
869
+ const N = values.length;
870
+ yMax = yMax || Math.max(...values, 1) * 1.15;
871
+ // grid lines
872
+ for (let k=0;k<=5;++k) {
873
+ let y = m.t + chartH*k/5;
874
+ ctx.strokeStyle="#e6f5f1"; ctx.lineWidth=1; ctx.beginPath();
875
+ ctx.moveTo(m.l, y); ctx.lineTo(w-m.r, y); ctx.stroke();
876
+ ctx.font="10px Inter"; ctx.fillStyle="#b8cbc3";
877
+ ctx.textAlign="right"; ctx.textBaseline="middle";
878
+ ctx.fillText((yMax*(1-k/5)).toFixed(1)+units, m.l-5, y);
879
+ }
880
+ // Line
881
+ ctx.save();
882
+ ctx.beginPath();
883
+ for(let i=0; i<N; ++i) {
884
+ let x = m.l + chartW/(N-1)*i, y = m.t+chartH - chartH*values[i]/yMax;
885
+ if (i===0) ctx.moveTo(x,y); else ctx.lineTo(x,y);
886
+ }
887
+ ctx.strokeStyle=color; ctx.lineWidth=2.6; ctx.shadowColor=color+'33'; ctx.shadowBlur=2;
888
+ ctx.stroke();
889
+ // Fill under curve
890
+ if (fill) {
891
+ ctx.lineTo(m.l+chartW, m.t+chartH);
892
+ ctx.lineTo(m.l, m.t+chartH);
893
+ ctx.closePath();
894
+ ctx.globalAlpha=.17;
895
+ ctx.fillStyle=fill;
896
+ ctx.fill();
897
+ ctx.globalAlpha=1;
898
+ }
899
+ ctx.restore();
900
+ // Dots
901
+ if (dots) {
902
+ for(let i=0; i<N; ++i) {
903
+ let x = m.l + chartW/(N-1)*i, y = m.t+chartH - chartH*values[i]/yMax;
904
+ ctx.beginPath();
905
+ ctx.arc(x,y,5,0,2*Math.PI);
906
+ ctx.fillStyle=color; ctx.shadowColor=color+'11'; ctx.shadowBlur=2; ctx.fill(); ctx.shadowBlur=0;
907
+ ctx.font="bold 12px Inter";
908
+ ctx.fillStyle=color; ctx.textAlign="center"; ctx.textBaseline="bottom";
909
+ ctx.fillText(values[i].toFixed(2)+units, x, y-7);
910
+ }
911
+ }
912
+ // X labels
913
+ for(let i=0; i<N; ++i) {
914
+ let x = m.l + chartW/(N-1)*i;
915
+ ctx.font="11px Inter"; ctx.fillStyle="#2b3d33";
916
+ ctx.textAlign="center"; ctx.textBaseline="top";
917
+ ctx.fillText(labels[i], x, h-m.b+7);
918
+ }
919
+ }
920
+ function drawPieChart(ctx, {labels, values, colors}) {
921
+ ctx.clearRect(0,0,ctx.canvas.width,ctx.canvas.height);
922
+ const w=ctx.canvas.width, h=ctx.canvas.height;
923
+ const cx=w/2, cy=h/2.2, r= Math.min(w,h)/2.25;
924
+ const total = values.reduce((a,b)=>a+b,0);
925
+ let a0 = -Math.PI/2;
926
+ ctx.save();
927
+ for(let i=0; i<values.length; ++i){
928
+ const frac=values[i]/total, a1=a0+frac*2*Math.PI;
929
+ ctx.beginPath();
930
+ ctx.moveTo(cx,cy); ctx.arc(cx,cy,r,a0,a1,false); ctx.closePath();
931
+ ctx.fillStyle=colors[i%colors.length]; ctx.shadowColor=colors[i%colors.length]+'24'; ctx.shadowBlur=7;
932
+ ctx.fill(); ctx.shadowBlur=0;
933
+ // labels
934
+ const theta=(a0+a1)/2, lx=cx+Math.cos(theta)*r*0.65,ly=cy+Math.sin(theta)*r*0.65;
935
+ ctx.font="bold 13px Inter"; ctx.fillStyle=colors[i%colors.length];
936
+ ctx.textAlign="center"; ctx.textBaseline="middle";
937
+ ctx.fillText(labels[i], lx,ly);
938
+ a0=a1;
939
+ }
940
+ ctx.restore();
941
+ }
942
+ // Chart 1: GDP Growth 2025 Q1, Q2, H1 (Line)
943
+ drawLineChart(document.getElementById('gdpGrowthChart').getContext('2d'), {
944
+ labels: ['Q1','Q2','H1 Target'],
945
+ values: [6.9,7.96,8.5],
946
+ color: "#34b88b",
947
+ units: '%',
948
+ fill: "#bdfae5",
949
+ yMax: 9
950
+ });
951
+ // Chart 2: GDP Forecasts (Bar)
952
+ drawBarChart(document.getElementById('gdpForecastChart').getContext('2d'), {
953
+ labels: ['World Bank','ADB','IMF','Gov Target'],
954
+ values: [5.8,6.6,5.2,8.5],
955
+ colors: ['#39ad9e','#12847d','#198754','#fedb41'],
956
+ yMax: 9
957
+ });
958
+ // Sector Pie Chart
959
+ drawPieChart(document.getElementById('sectorPieChart').getContext('2d'),{
960
+ labels:['Services','Manufacturing','Exports','Banking'],
961
+ values:[44, 28, 19, 9],
962
+ colors:['#06705c','#2bc4a3','#fedb41','#bcc9cc']
963
+ });
964
+ // Retail Sales Bar
965
+ drawBarChart(document.getElementById('retailBarChart').getContext('2d'),{
966
+ labels:['Q1\'24','Q1\'25'],
967
+ values:[60.76,66.83],
968
+ colors:['#bcc9cc','#06705c'],
969
+ yMax: 70,
970
+ units:' B$'
971
+ });
972
+ // Historical GDP Growth
973
+ drawLineChart(document.getElementById('histGdpChart').getContext('2d'),{
974
+ labels: ['2020','2021','2022','2023','2024','2025'],
975
+ values: [3.21,4.85,5.42,3.46,5.98,6.93],
976
+ color: "#ffa638",
977
+ fill: "#fedb4187",
978
+ yMax: 8,
979
+ units:'%'
980
+ });
981
+
982
+ // Table sorting
983
+ (function sortableTables(){
984
+ document.querySelectorAll('table.research-table').forEach(table=>{
985
+ const ths = table.tHead?.rows[0]?.cells;
986
+ if (!ths) return;
987
+ for(let c=0;c<ths.length;++c){
988
+ ths[c].addEventListener('click',()=>{
989
+ const dir = (ths[c].classList.contains('sorted-asc')) ? -1 : 1;
990
+ Array.from(ths).forEach(th=>th.classList.remove('sorted-asc','sorted-desc'));
991
+ ths[c].classList.add(dir>0?'sorted-asc':'sorted-desc');
992
+ const rows = Array.from(table.tBodies[0].rows);
993
+ rows.sort((a,b)=>{
994
+ let vA=a.cells[c].textContent.trim().toLowerCase(),
995
+ vB=b.cells[c].textContent.trim().toLowerCase();
996
+ const numA=parseFloat(vA),numB=parseFloat(vB);
997
+ if(!isNaN(numA)&&!isNaN(numB)) return dir*(numA-numB);
998
+ if(vA<vB) return -1*dir; if(vA>vB) return 1*dir; return 0;
999
+ });
1000
+ rows.forEach(row=>table.tBodies[0].appendChild(row));
1001
+ });
1002
+ }
1003
+ });
1004
+ })();
1005
+
1006
+ // Section collapsing/expanding - remember open state in localStorage
1007
+ (function persistentDetails(){
1008
+ document.querySelectorAll("section details, .card-section details").forEach(details=>{
1009
+ let key='details-'+location.pathname+'-'+details.querySelector('summary')?.textContent.trim();
1010
+ // Restore state
1011
+ if(localStorage.getItem(key)!==null)
1012
+ details.open=localStorage.getItem(key)==='1';
1013
+ details.addEventListener('toggle',()=>localStorage.setItem(key,details.open?'1':'0'));
1014
+ });
1015
+ })();
1016
+
1017
+ // Clipboard copy for citations
1018
+ (function citationsClipboard(){
1019
+ const btn = document.getElementById('btn-copy-sources');
1020
+ const div = document.getElementById('citations-list');
1021
+ btn.addEventListener('click', async()=>{
1022
+ const text = Array.from(div.querySelectorAll('ol>li')).map(li=>{
1023
+ return "- "+li.textContent.replace(/\s*\[Link\]\s*/,'')+" "+li.querySelector('a')?.href;
1024
+ }).join('\n');
1025
+ try{
1026
+ await navigator.clipboard.writeText(text);
1027
+ showStatus(btn, "Citations copied!");
1028
+ }catch(e){
1029
+ showStatus(btn, "Could not copy.", true);
1030
+ }
1031
+ });
1032
+ function showStatus(parent, msg, err){
1033
+ let el = document.createElement('span');
1034
+ el.className='clipboard-status';
1035
+ if(err) el.style.color='var(--danger)';
1036
+ el.textContent=msg;
1037
+ parent.after(el);
1038
+ setTimeout(()=>el.remove(),1600);
1039
+ }
1040
+ })();
1041
+
1042
+ // Export PDF: Use print() to offer PDF download
1043
+ (function exportPdf(){
1044
+ document.getElementById('btn-export-pdf').addEventListener('click', function(){
1045
+ window.print();
1046
+ });
1047
+ })();
1048
+
1049
+ // Search functionality - highlight matches, scroll to section
1050
+ (function siteSearch(){
1051
+ const input = document.getElementById('searchInput');
1052
+ let lastHl = [];
1053
+ function clearHl() {
1054
+ lastHl.forEach(span=>{ // Restore original text
1055
+ let p=span.parentNode;
1056
+ p.replaceChild(document.createTextNode(span.textContent), span);
1057
+ p.normalize();
1058
+ }); lastHl=[];
1059
+ }
1060
+ function highlightWords(s) {
1061
+ if(s.length<2) return clearHl();
1062
+ clearHl();
1063
+ const walker = document.createTreeWalker(document.querySelector('main'),NodeFilter.SHOW_TEXT,null);
1064
+ const term = s.toLowerCase();
1065
+ let foundOnce=false;
1066
+ while(walker.nextNode()) {
1067
+ let t = walker.currentNode;
1068
+ if(!/\S/.test(t.data)||t.parentElement.closest('header,nav,#citations-list')) continue;
1069
+ let idx = t.data.toLowerCase().indexOf(term);
1070
+ if(idx >= 0) {
1071
+ foundOnce=true;
1072
+ const span=document.createElement('mark');
1073
+ span.style.background="#fedb41";
1074
+ span.style.color="#232931";
1075
+ span.style.padding=".05em .16em";
1076
+ span.style.fontWeight='600';
1077
+ span.textContent=t.data.substr(idx,s.length);
1078
+ let after = t.splitText(idx);
1079
+ after.splitText(s.length);
1080
+ after.parentNode.replaceChild(span, after);
1081
+ lastHl.push(span);
1082
+ }
1083
+ }
1084
+ if(foundOnce && lastHl[0]) lastHl[0].scrollIntoView({behavior:'smooth',block:'center'});
1085
+ }
1086
+ input.addEventListener('input', e=> highlightWords(e.target.value));
1087
+ document.getElementById('site-search').addEventListener('submit', e=>{e.preventDefault()});
1088
+ })();
1089
+
1090
+ // IntersectionObserver: Fade-in effect for sections on scroll-in
1091
+ (function fadeInSections(){
1092
+ if(!('IntersectionObserver' in window)) return;
1093
+ const observer = new IntersectionObserver(entries=>{
1094
+ entries.forEach(entry=>{
1095
+ if(entry.isIntersecting){
1096
+ entry.target.style.transition="opacity 1.2s cubic-bezier(.3,.6,.13,1)";
1097
+ entry.target.style.opacity=1;
1098
+ observer.unobserve(entry.target);
1099
+ }
1100
+ });
1101
+ },{threshold:.18});
1102
+ document.querySelectorAll('main > section').forEach(sec=>{
1103
+ sec.style.opacity=0;
1104
+ observer.observe(sec);
1105
+ });
1106
+ })();
1107
+
1108
+ // Filter for table example (future extension)
1109
+ // (Currently not needed)
1110
+
1111
+ // Accessibility: Set ARIA for details
1112
+ document.querySelectorAll('details').forEach(d=>{
1113
+ const s = d.querySelector('summary');
1114
+ if(s) {
1115
+ s.setAttribute("aria-expanded",d.open ? "true" : "false");
1116
+ d.addEventListener('toggle',()=> s.setAttribute("aria-expanded",d.open ? "true" : "false"));
1117
+ }
1118
+ });
1119
+
1120
+ </script>
1121
+ </body>
1122
+ </html>