@openyida/yidacli 0.1.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.
@@ -0,0 +1,1102 @@
1
+ // ============================================================
2
+ // 状态管理
3
+ // ============================================================
4
+
5
+ const FORM_UUID = 'FORM-XXX';
6
+ const APP_TYPE = 'APP_XXX';
7
+
8
+ // 报名动态数据
9
+ const REGISTRATION_NOTICES = [
10
+ '刚刚:张总来自字节跳动完成报名',
11
+ '1分钟前:李经理来自腾讯完成报名',
12
+ '2分钟前:王总来自华为完成报名',
13
+ '3分钟前:陈总来自阿里巴巴完成报名',
14
+ '4分钟前:刘总来自百度完成报名',
15
+ '5分钟前:赵经理来自小米完成报名',
16
+ '刚刚:孙总来自蔚来汽车完成报名',
17
+ '1分钟前:周总来自理想汽车完成报名',
18
+ ];
19
+
20
+ const _customState = {
21
+ // 倒计时
22
+ countdownDays: 0,
23
+ countdownHours: 0,
24
+ countdownMinutes: 0,
25
+ countdownSeconds: 0,
26
+ // 报名动态
27
+ currentNoticeIndex: 0,
28
+ noticeVisible: true,
29
+ // 报名人数
30
+ registeredCount: 3847,
31
+ // 表单状态
32
+ isSubmitting: false,
33
+ isSubmitted: false,
34
+ submitError: '',
35
+ // 表单字段(非受控,仅静默存储)
36
+ formName: '',
37
+ formCompany: '',
38
+ formPosition: '',
39
+ formEmail: '',
40
+ // 进度条
41
+ totalSeats: 5000,
42
+ };
43
+
44
+ export function getCustomState(key) {
45
+ if (key) return _customState[key];
46
+ return { ..._customState };
47
+ }
48
+
49
+ export function setCustomState(newState) {
50
+ Object.keys(newState).forEach(function(key) {
51
+ _customState[key] = newState[key];
52
+ });
53
+ this.forceUpdate();
54
+ }
55
+
56
+ export function forceUpdate() {
57
+ this.setState({ timestamp: new Date().getTime() });
58
+ }
59
+
60
+ // ============================================================
61
+ // 生命周期
62
+ // ============================================================
63
+
64
+ export function didMount() {
65
+ // 启动倒计时
66
+ this.updateCountdown();
67
+ _customState._countdownTimer = setInterval(function() {
68
+ this.updateCountdown();
69
+ }.bind(this), 1000);
70
+
71
+ // 启动报名动态轮播
72
+ _customState._noticeTimer = setInterval(function() {
73
+ var nextIndex = (_customState.currentNoticeIndex + 1) % REGISTRATION_NOTICES.length;
74
+ this.setCustomState({ currentNoticeIndex: nextIndex, noticeVisible: true });
75
+ }.bind(this), 4000);
76
+
77
+ // 数字跳动效果:报名人数随机小幅增加
78
+ _customState._countTimer = setInterval(function() {
79
+ if (Math.random() > 0.7) {
80
+ this.setCustomState({ registeredCount: _customState.registeredCount + 1 });
81
+ }
82
+ }.bind(this), 8000);
83
+ }
84
+
85
+ export function didUnmount() {
86
+ clearInterval(_customState._countdownTimer);
87
+ clearInterval(_customState._noticeTimer);
88
+ clearInterval(_customState._countTimer);
89
+ }
90
+
91
+ export function updateCountdown() {
92
+ // 目标时间:2026年3月15日 14:00 GMT+8
93
+ var targetTime = new Date('2026-03-15T14:00:00+08:00').getTime();
94
+ var now = new Date().getTime();
95
+ var diff = targetTime - now;
96
+
97
+ if (diff <= 0) {
98
+ this.setCustomState({ countdownDays: 0, countdownHours: 0, countdownMinutes: 0, countdownSeconds: 0 });
99
+ return;
100
+ }
101
+
102
+ var days = Math.floor(diff / (1000 * 60 * 60 * 24));
103
+ var hours = Math.floor((diff % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
104
+ var minutes = Math.floor((diff % (1000 * 60 * 60)) / (1000 * 60));
105
+ var seconds = Math.floor((diff % (1000 * 60)) / 1000);
106
+
107
+ this.setCustomState({ countdownDays: days, countdownHours: hours, countdownMinutes: minutes, countdownSeconds: seconds });
108
+ }
109
+
110
+ /**
111
+ * 滚动到报名表单
112
+ */
113
+ export function scrollToForm() {
114
+ var formEl = document.getElementById('registration-form');
115
+ if (formEl) {
116
+ formEl.scrollIntoView({ behavior: 'smooth', block: 'center' });
117
+ }
118
+ }
119
+
120
+ /**
121
+ * 处理表单提交
122
+ */
123
+ export function handleSubmit(e) {
124
+ e.preventDefault();
125
+
126
+ // 获取表单值
127
+ var name = _customState.formName || '';
128
+ var company = _customState.formCompany || '';
129
+ var position = _customState.formPosition || '';
130
+ var email = _customState.formEmail || '';
131
+
132
+ // 表单验证
133
+ if (!name.trim()) {
134
+ this.setCustomState({ submitError: '请输入您的姓名' });
135
+ return;
136
+ }
137
+ if (!company.trim()) {
138
+ this.setCustomState({ submitError: '请输入您的公司名称' });
139
+ return;
140
+ }
141
+ if (!position || position === '请选择') {
142
+ this.setCustomState({ submitError: '请选择您的职位' });
143
+ return;
144
+ }
145
+ if (!email.trim()) {
146
+ this.setCustomState({ submitError: '请输入工作邮箱' });
147
+ return;
148
+ }
149
+ // 简单邮箱格式验证
150
+ var emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
151
+ if (!emailRegex.test(email)) {
152
+ this.setCustomState({ submitError: '请输入有效的邮箱地址' });
153
+ return;
154
+ }
155
+
156
+ // 清除错误,设置提交中状态
157
+ this.setCustomState({ isSubmitting: true, submitError: '' });
158
+
159
+ // 保存到宜搭表单
160
+ var appType = window.pageConfig && window.pageConfig.appType;
161
+ var formUuid = 'FORM-76402507C605423DA55BB8C934E2B31509D5';
162
+
163
+ this.utils.yida.saveFormData({
164
+ formUuid: formUuid,
165
+ appType: appType,
166
+ formDataJson: JSON.stringify({
167
+ textField_8904dr89: name,
168
+ textField_8904s2zw: company,
169
+ textField_8904xumu: position,
170
+ textField_8904fybo: email,
171
+ textField_8904e54g: '未来视野2026发布会',
172
+ dateField_8904yv3d: new Date().getTime(),
173
+ }),
174
+ }).then(function(res) {
175
+ // 提交成功
176
+ this.setCustomState({ isSubmitting: false, isSubmitted: true });
177
+ this.utils.toast({ title: '报名成功!', type: 'success' });
178
+
179
+ // 清空表单
180
+ _customState.formName = '';
181
+ _customState.formCompany = '';
182
+ _customState.formPosition = '';
183
+ _customState.formEmail = '';
184
+ var nameInput = document.getElementById('field-name');
185
+ var companyInput = document.getElementById('field-company');
186
+ var positionInput = document.getElementById('field-position');
187
+ var emailInput = document.getElementById('field-email');
188
+ if (nameInput) nameInput.value = '';
189
+ if (companyInput) companyInput.value = '';
190
+ if (positionInput) positionInput.value = '请选择';
191
+ if (emailInput) emailInput.value = '';
192
+ }.bind(this)).catch(function(err) {
193
+ // 提交失败
194
+ this.setCustomState({ isSubmitting: false, submitError: err.message || '提交失败,请稍后重试' });
195
+ this.utils.toast({ title: err.message || '提交失败', type: 'error' });
196
+ }.bind(this));
197
+ }
198
+
199
+ // ============================================================
200
+ // 渲染
201
+ // ============================================================
202
+
203
+ export function renderJsx() {
204
+ var state = _customState;
205
+ var { timestamp } = this.state;
206
+
207
+ var remainingSeats = state.totalSeats - state.registeredCount;
208
+ var progressPercent = Math.round((state.registeredCount / state.totalSeats) * 100);
209
+
210
+ // ---- 颜色 & 样式常量 ----
211
+ var colors = {
212
+ bgDeep: '#0B0F19',
213
+ bgCard: 'rgba(255,255,255,0.05)',
214
+ bgCardHover: 'rgba(255,255,255,0.08)',
215
+ neonBlue: '#3B82F6',
216
+ electricPurple: '#8B5CF6',
217
+ cyberPink: '#EC4899',
218
+ energyOrange: '#F59E0B',
219
+ white: '#FFFFFF',
220
+ whiteAlpha60: 'rgba(255,255,255,0.6)',
221
+ whiteAlpha30: 'rgba(255,255,255,0.3)',
222
+ glass: 'rgba(255,255,255,0.08)',
223
+ glassBorder: 'rgba(255,255,255,0.12)',
224
+ };
225
+
226
+ var styles = {
227
+ page: {
228
+ background: colors.bgDeep,
229
+ minHeight: '100vh',
230
+ fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'PingFang SC', sans-serif",
231
+ color: colors.white,
232
+ overflowX: 'hidden',
233
+ position: 'relative',
234
+ },
235
+ // 固定顶部栏
236
+ topBar: {
237
+ position: 'fixed',
238
+ top: 0,
239
+ left: 0,
240
+ right: 0,
241
+ zIndex: 100,
242
+ background: 'linear-gradient(135deg, rgba(11,15,25,0.95) 0%, rgba(124,58,237,0.15) 50%, rgba(236,72,153,0.1) 100%)',
243
+ backdropFilter: 'blur(20px)',
244
+ borderBottom: '1px solid ' + colors.glassBorder,
245
+ padding: '0 24px',
246
+ height: '64px',
247
+ display: 'flex',
248
+ alignItems: 'center',
249
+ justifyContent: 'space-between',
250
+ },
251
+ topBarLogo: {
252
+ fontSize: '18px',
253
+ fontWeight: '700',
254
+ background: 'linear-gradient(135deg, #3B82F6, #8B5CF6, #EC4899)',
255
+ WebkitBackgroundClip: 'text',
256
+ WebkitTextFillColor: 'transparent',
257
+ backgroundClip: 'text',
258
+ },
259
+ topBarRight: {
260
+ display: 'flex',
261
+ alignItems: 'center',
262
+ gap: '16px',
263
+ },
264
+ countdownWrap: {
265
+ display: 'flex',
266
+ alignItems: 'center',
267
+ gap: '6px',
268
+ fontSize: '13px',
269
+ color: colors.whiteAlpha60,
270
+ },
271
+ countdownUnit: {
272
+ background: colors.glass,
273
+ border: '1px solid ' + colors.glassBorder,
274
+ borderRadius: '6px',
275
+ padding: '4px 8px',
276
+ fontFamily: "'DIN Alternate', monospace",
277
+ fontWeight: '700',
278
+ fontSize: '16px',
279
+ color: colors.white,
280
+ minWidth: '36px',
281
+ textAlign: 'center',
282
+ },
283
+ topBarCta: {
284
+ background: 'linear-gradient(135deg, #EC4899, #F59E0B)',
285
+ border: 'none',
286
+ borderRadius: '8px',
287
+ padding: '8px 18px',
288
+ color: colors.white,
289
+ fontWeight: '600',
290
+ fontSize: '14px',
291
+ cursor: 'pointer',
292
+ whiteSpace: 'nowrap',
293
+ },
294
+ // Hero 区
295
+ hero: {
296
+ paddingTop: '64px',
297
+ minHeight: '100vh',
298
+ display: 'flex',
299
+ flexDirection: 'column',
300
+ alignItems: 'center',
301
+ justifyContent: 'center',
302
+ position: 'relative',
303
+ textAlign: 'center',
304
+ padding: '120px 24px 80px',
305
+ background: 'radial-gradient(ellipse 80% 60% at 50% 0%, rgba(139,92,246,0.2) 0%, transparent 70%), radial-gradient(ellipse 60% 40% at 80% 50%, rgba(59,130,246,0.15) 0%, transparent 60%), radial-gradient(ellipse 50% 40% at 20% 80%, rgba(236,72,153,0.1) 0%, transparent 60%)',
306
+ },
307
+ heroBadge: {
308
+ display: 'inline-block',
309
+ background: 'rgba(139,92,246,0.2)',
310
+ border: '1px solid rgba(139,92,246,0.4)',
311
+ borderRadius: '20px',
312
+ padding: '6px 16px',
313
+ fontSize: '13px',
314
+ color: '#A78BFA',
315
+ marginBottom: '24px',
316
+ letterSpacing: '0.05em',
317
+ },
318
+ heroTitle: {
319
+ fontSize: '56px',
320
+ fontWeight: '800',
321
+ lineHeight: '1.1',
322
+ marginBottom: '20px',
323
+ background: 'linear-gradient(135deg, #FFFFFF 0%, #A78BFA 50%, #EC4899 100%)',
324
+ WebkitBackgroundClip: 'text',
325
+ WebkitTextFillColor: 'transparent',
326
+ backgroundClip: 'text',
327
+ maxWidth: '800px',
328
+ },
329
+ heroSubtitle: {
330
+ fontSize: '18px',
331
+ color: colors.whiteAlpha60,
332
+ marginBottom: '32px',
333
+ maxWidth: '560px',
334
+ },
335
+ heroInfoCard: {
336
+ display: 'inline-flex',
337
+ alignItems: 'center',
338
+ gap: '24px',
339
+ background: colors.glass,
340
+ border: '1px solid ' + colors.glassBorder,
341
+ borderRadius: '12px',
342
+ padding: '14px 28px',
343
+ marginBottom: '36px',
344
+ fontSize: '14px',
345
+ color: colors.whiteAlpha60,
346
+ flexWrap: 'wrap',
347
+ justifyContent: 'center',
348
+ },
349
+ heroInfoItem: {
350
+ display: 'flex',
351
+ alignItems: 'center',
352
+ gap: '6px',
353
+ },
354
+ heroInfoDot: {
355
+ width: '6px',
356
+ height: '6px',
357
+ borderRadius: '50%',
358
+ background: '#8B5CF6',
359
+ flexShrink: 0,
360
+ },
361
+ heroBtnGroup: {
362
+ display: 'flex',
363
+ gap: '16px',
364
+ justifyContent: 'center',
365
+ marginBottom: '40px',
366
+ flexWrap: 'wrap',
367
+ },
368
+ btnPrimary: {
369
+ background: 'linear-gradient(135deg, #EC4899, #F59E0B)',
370
+ border: 'none',
371
+ borderRadius: '12px',
372
+ padding: '14px 32px',
373
+ color: colors.white,
374
+ fontWeight: '700',
375
+ fontSize: '16px',
376
+ cursor: 'pointer',
377
+ boxShadow: '0 0 30px rgba(236,72,153,0.4)',
378
+ },
379
+ btnSecondary: {
380
+ background: 'transparent',
381
+ border: '1px solid ' + colors.glassBorder,
382
+ borderRadius: '12px',
383
+ padding: '14px 32px',
384
+ color: colors.white,
385
+ fontWeight: '600',
386
+ fontSize: '16px',
387
+ cursor: 'pointer',
388
+ },
389
+ // 报名动态
390
+ noticeBanner: {
391
+ display: 'inline-flex',
392
+ alignItems: 'center',
393
+ gap: '10px',
394
+ background: 'rgba(59,130,246,0.1)',
395
+ border: '1px solid rgba(59,130,246,0.2)',
396
+ borderRadius: '24px',
397
+ padding: '8px 20px',
398
+ fontSize: '13px',
399
+ color: colors.whiteAlpha60,
400
+ },
401
+ noticeDot: {
402
+ width: '8px',
403
+ height: '8px',
404
+ borderRadius: '50%',
405
+ background: '#3B82F6',
406
+ flexShrink: 0,
407
+ boxShadow: '0 0 8px #3B82F6',
408
+ },
409
+ // 通用 section
410
+ section: {
411
+ padding: '80px 24px',
412
+ maxWidth: '1100px',
413
+ margin: '0 auto',
414
+ },
415
+ sectionTitle: {
416
+ fontSize: '36px',
417
+ fontWeight: '800',
418
+ textAlign: 'center',
419
+ marginBottom: '12px',
420
+ background: 'linear-gradient(135deg, #FFFFFF, #A78BFA)',
421
+ WebkitBackgroundClip: 'text',
422
+ WebkitTextFillColor: 'transparent',
423
+ backgroundClip: 'text',
424
+ },
425
+ sectionSubtitle: {
426
+ fontSize: '16px',
427
+ color: colors.whiteAlpha60,
428
+ textAlign: 'center',
429
+ marginBottom: '48px',
430
+ },
431
+ // 价值主张卡片
432
+ valueGrid: {
433
+ display: 'grid',
434
+ gridTemplateColumns: 'repeat(auto-fit, minmax(240px, 1fr))',
435
+ gap: '20px',
436
+ },
437
+ valueCard: {
438
+ background: colors.glass,
439
+ border: '1px solid ' + colors.glassBorder,
440
+ borderRadius: '16px',
441
+ padding: '28px 24px',
442
+ },
443
+ valueIcon: {
444
+ fontSize: '32px',
445
+ marginBottom: '16px',
446
+ },
447
+ valueCardTitle: {
448
+ fontSize: '18px',
449
+ fontWeight: '700',
450
+ marginBottom: '8px',
451
+ color: colors.white,
452
+ },
453
+ valueCardDesc: {
454
+ fontSize: '14px',
455
+ color: colors.whiteAlpha60,
456
+ lineHeight: '1.6',
457
+ },
458
+ valueBadge: {
459
+ display: 'inline-block',
460
+ background: 'rgba(245,158,11,0.15)',
461
+ border: '1px solid rgba(245,158,11,0.3)',
462
+ borderRadius: '6px',
463
+ padding: '2px 8px',
464
+ fontSize: '12px',
465
+ color: '#F59E0B',
466
+ marginTop: '10px',
467
+ },
468
+ // 议程时间轴
469
+ agendaList: {
470
+ display: 'flex',
471
+ flexDirection: 'column',
472
+ gap: '0',
473
+ position: 'relative',
474
+ },
475
+ agendaItem: {
476
+ display: 'flex',
477
+ gap: '20px',
478
+ paddingBottom: '28px',
479
+ position: 'relative',
480
+ },
481
+ agendaTimeCol: {
482
+ width: '120px',
483
+ flexShrink: 0,
484
+ textAlign: 'right',
485
+ },
486
+ agendaTime: {
487
+ fontSize: '13px',
488
+ color: '#8B5CF6',
489
+ fontFamily: 'monospace',
490
+ fontWeight: '600',
491
+ },
492
+ agendaLine: {
493
+ display: 'flex',
494
+ flexDirection: 'column',
495
+ alignItems: 'center',
496
+ width: '24px',
497
+ flexShrink: 0,
498
+ },
499
+ agendaDot: {
500
+ width: '12px',
501
+ height: '12px',
502
+ borderRadius: '50%',
503
+ background: 'linear-gradient(135deg, #8B5CF6, #EC4899)',
504
+ boxShadow: '0 0 12px rgba(139,92,246,0.6)',
505
+ flexShrink: 0,
506
+ },
507
+ agendaConnector: {
508
+ flex: 1,
509
+ width: '2px',
510
+ background: 'linear-gradient(to bottom, rgba(139,92,246,0.4), rgba(139,92,246,0.1))',
511
+ marginTop: '4px',
512
+ },
513
+ agendaContent: {
514
+ flex: 1,
515
+ paddingBottom: '8px',
516
+ },
517
+ agendaTitle: {
518
+ fontSize: '16px',
519
+ fontWeight: '600',
520
+ color: colors.white,
521
+ marginBottom: '4px',
522
+ },
523
+ agendaDesc: {
524
+ fontSize: '13px',
525
+ color: colors.whiteAlpha60,
526
+ },
527
+ // 嘉宾
528
+ speakerGrid: {
529
+ display: 'grid',
530
+ gridTemplateColumns: 'repeat(auto-fit, minmax(180px, 1fr))',
531
+ gap: '20px',
532
+ },
533
+ speakerCard: {
534
+ background: colors.glass,
535
+ border: '1px solid ' + colors.glassBorder,
536
+ borderRadius: '16px',
537
+ padding: '24px 20px',
538
+ textAlign: 'center',
539
+ },
540
+ speakerAvatar: {
541
+ width: '72px',
542
+ height: '72px',
543
+ borderRadius: '50%',
544
+ margin: '0 auto 14px',
545
+ display: 'flex',
546
+ alignItems: 'center',
547
+ justifyContent: 'center',
548
+ fontSize: '28px',
549
+ background: 'linear-gradient(135deg, rgba(139,92,246,0.3), rgba(236,72,153,0.3))',
550
+ border: '2px solid rgba(139,92,246,0.4)',
551
+ },
552
+ speakerName: {
553
+ fontSize: '16px',
554
+ fontWeight: '700',
555
+ color: colors.white,
556
+ marginBottom: '4px',
557
+ },
558
+ speakerTitle: {
559
+ fontSize: '12px',
560
+ color: colors.whiteAlpha60,
561
+ marginBottom: '10px',
562
+ },
563
+ speakerTag: {
564
+ display: 'inline-block',
565
+ background: 'rgba(139,92,246,0.15)',
566
+ border: '1px solid rgba(139,92,246,0.3)',
567
+ borderRadius: '6px',
568
+ padding: '2px 8px',
569
+ fontSize: '11px',
570
+ color: '#A78BFA',
571
+ },
572
+ speakerMystery: {
573
+ background: 'rgba(255,255,255,0.03)',
574
+ border: '1px dashed rgba(255,255,255,0.15)',
575
+ },
576
+ // 社交证明
577
+ logoWall: {
578
+ display: 'flex',
579
+ flexWrap: 'wrap',
580
+ gap: '16px',
581
+ justifyContent: 'center',
582
+ marginBottom: '48px',
583
+ },
584
+ logoItem: {
585
+ background: colors.glass,
586
+ border: '1px solid ' + colors.glassBorder,
587
+ borderRadius: '10px',
588
+ padding: '12px 24px',
589
+ fontSize: '15px',
590
+ fontWeight: '600',
591
+ color: colors.whiteAlpha60,
592
+ },
593
+ statsRow: {
594
+ display: 'flex',
595
+ justifyContent: 'center',
596
+ gap: '48px',
597
+ flexWrap: 'wrap',
598
+ marginBottom: '48px',
599
+ },
600
+ statItem: {
601
+ textAlign: 'center',
602
+ },
603
+ statNumber: {
604
+ fontSize: '40px',
605
+ fontWeight: '800',
606
+ background: 'linear-gradient(135deg, #3B82F6, #8B5CF6)',
607
+ WebkitBackgroundClip: 'text',
608
+ WebkitTextFillColor: 'transparent',
609
+ backgroundClip: 'text',
610
+ display: 'block',
611
+ },
612
+ statLabel: {
613
+ fontSize: '14px',
614
+ color: colors.whiteAlpha60,
615
+ marginTop: '4px',
616
+ },
617
+ // 报名表单区
618
+ formSection: {
619
+ padding: '80px 24px',
620
+ background: 'radial-gradient(ellipse 80% 60% at 50% 50%, rgba(139,92,246,0.12) 0%, transparent 70%)',
621
+ },
622
+ formCard: {
623
+ maxWidth: '560px',
624
+ margin: '0 auto',
625
+ background: 'rgba(255,255,255,0.04)',
626
+ border: '1px solid rgba(255,255,255,0.1)',
627
+ borderRadius: '24px',
628
+ padding: '40px',
629
+ backdropFilter: 'blur(20px)',
630
+ },
631
+ formHeader: {
632
+ textAlign: 'center',
633
+ marginBottom: '32px',
634
+ },
635
+ formTitle: {
636
+ fontSize: '28px',
637
+ fontWeight: '800',
638
+ color: colors.white,
639
+ marginBottom: '8px',
640
+ },
641
+ formSubtitle: {
642
+ fontSize: '14px',
643
+ color: colors.whiteAlpha60,
644
+ marginBottom: '16px',
645
+ },
646
+ progressBar: {
647
+ background: 'rgba(255,255,255,0.1)',
648
+ borderRadius: '4px',
649
+ height: '6px',
650
+ overflow: 'hidden',
651
+ marginBottom: '8px',
652
+ },
653
+ progressFill: {
654
+ height: '100%',
655
+ background: 'linear-gradient(90deg, #8B5CF6, #EC4899)',
656
+ borderRadius: '4px',
657
+ width: progressPercent + '%',
658
+ transition: 'width 0.5s ease',
659
+ },
660
+ progressLabel: {
661
+ fontSize: '12px',
662
+ color: '#EC4899',
663
+ textAlign: 'right',
664
+ },
665
+ formGroup: {
666
+ marginBottom: '16px',
667
+ },
668
+ formLabel: {
669
+ display: 'block',
670
+ fontSize: '13px',
671
+ color: colors.whiteAlpha60,
672
+ marginBottom: '6px',
673
+ fontWeight: '500',
674
+ },
675
+ formInput: {
676
+ width: '100%',
677
+ background: 'rgba(255,255,255,0.06)',
678
+ border: '1px solid rgba(255,255,255,0.12)',
679
+ borderRadius: '10px',
680
+ padding: '12px 16px',
681
+ color: colors.white,
682
+ fontSize: '15px',
683
+ outline: 'none',
684
+ boxSizing: 'border-box',
685
+ fontFamily: 'inherit',
686
+ },
687
+ formSelect: {
688
+ width: '100%',
689
+ background: 'rgba(20,20,35,0.9)',
690
+ border: '1px solid rgba(255,255,255,0.12)',
691
+ borderRadius: '10px',
692
+ padding: '12px 16px',
693
+ color: colors.white,
694
+ fontSize: '15px',
695
+ outline: 'none',
696
+ boxSizing: 'border-box',
697
+ fontFamily: 'inherit',
698
+ cursor: 'pointer',
699
+ },
700
+ submitBtn: {
701
+ width: '100%',
702
+ background: 'linear-gradient(135deg, #EC4899, #F59E0B)',
703
+ border: 'none',
704
+ borderRadius: '12px',
705
+ padding: '16px',
706
+ color: colors.white,
707
+ fontWeight: '700',
708
+ fontSize: '16px',
709
+ cursor: state.isSubmitting ? 'not-allowed' : 'pointer',
710
+ marginTop: '8px',
711
+ opacity: state.isSubmitting ? 0.7 : 1,
712
+ boxShadow: '0 0 30px rgba(236,72,153,0.3)',
713
+ },
714
+ securityNote: {
715
+ textAlign: 'center',
716
+ fontSize: '12px',
717
+ color: colors.whiteAlpha30,
718
+ marginTop: '12px',
719
+ },
720
+ errorMsg: {
721
+ background: 'rgba(239,68,68,0.1)',
722
+ border: '1px solid rgba(239,68,68,0.3)',
723
+ borderRadius: '8px',
724
+ padding: '10px 14px',
725
+ fontSize: '13px',
726
+ color: '#FCA5A5',
727
+ marginBottom: '12px',
728
+ },
729
+ // 成功状态
730
+ successCard: {
731
+ textAlign: 'center',
732
+ padding: '20px 0',
733
+ },
734
+ successIcon: {
735
+ fontSize: '64px',
736
+ marginBottom: '16px',
737
+ display: 'block',
738
+ },
739
+ successTitle: {
740
+ fontSize: '24px',
741
+ fontWeight: '800',
742
+ color: colors.white,
743
+ marginBottom: '8px',
744
+ },
745
+ successDesc: {
746
+ fontSize: '14px',
747
+ color: colors.whiteAlpha60,
748
+ marginBottom: '24px',
749
+ lineHeight: '1.6',
750
+ },
751
+ successActions: {
752
+ display: 'flex',
753
+ gap: '12px',
754
+ justifyContent: 'center',
755
+ flexWrap: 'wrap',
756
+ },
757
+ successBtn: {
758
+ background: colors.glass,
759
+ border: '1px solid ' + colors.glassBorder,
760
+ borderRadius: '10px',
761
+ padding: '10px 20px',
762
+ color: colors.white,
763
+ fontSize: '14px',
764
+ cursor: 'pointer',
765
+ fontWeight: '500',
766
+ },
767
+ // 分隔线
768
+ divider: {
769
+ height: '1px',
770
+ background: 'linear-gradient(90deg, transparent, rgba(255,255,255,0.08), transparent)',
771
+ margin: '0 24px',
772
+ },
773
+ // 底部
774
+ footer: {
775
+ textAlign: 'center',
776
+ padding: '40px 24px',
777
+ color: colors.whiteAlpha30,
778
+ fontSize: '13px',
779
+ },
780
+ };
781
+
782
+ var padZero = function(num) {
783
+ return num < 10 ? '0' + num : '' + num;
784
+ };
785
+
786
+ var agendaItems = [
787
+ { time: '14:00 - 14:10', title: '开场致辞', desc: '主持人开场,发布会正式启动' },
788
+ { time: '14:10 - 14:50', title: 'AI 重构商业逻辑', desc: '深度解析 AI 如何颠覆传统商业模式,2026 年的机遇与挑战' },
789
+ { time: '14:50 - 15:30', title: '碳中和圆桌论坛', desc: '行业领袖共话绿色科技与可持续发展路径' },
790
+ { time: '15:30 - 15:45', title: '中场休息 & VR 抽奖', desc: '互动抽奖,赢取价值万元科技礼品' },
791
+ { time: '15:45 - 16:30', title: '神秘新品发布', desc: '重磅产品首发,引领行业新风向' },
792
+ { time: '16:30 - 17:00', title: '互动问答 & 资料包', desc: '与嘉宾实时互动,领取独家白皮书资料包' },
793
+ ];
794
+
795
+ var speakers = [
796
+ { emoji: '👨‍💼', name: '张明远', title: 'CEO · 科技领袖', tag: 'AI战略', bio: '前谷歌中国区总裁,连续创业者' },
797
+ { emoji: '👩‍🔬', name: '李晓雯', title: 'CTO · 技术先锋', tag: '深度学习', bio: '斯坦福AI实验室博士,10年AI研究' },
798
+ { emoji: '🧑‍💻', name: '王浩然', title: '创始人 · 投资人', tag: '碳中和', bio: '绿色科技基金创始人,ESG专家' },
799
+ { emoji: '👨‍🎤', name: '神秘嘉宾', title: '3月10日揭晓', tag: '敬请期待', bio: '来自全球顶尖科技公司的重磅嘉宾', mystery: true },
800
+ { emoji: '🎭', name: '神秘嘉宾', title: '3月10日揭晓', tag: '敬请期待', bio: '颠覆性创新领域的行业引领者', mystery: true },
801
+ ];
802
+
803
+ var logos = ['华为', '腾讯', '阿里巴巴', '蔚来汽车', '理想汽车', '小米', '字节跳动', '百度'];
804
+
805
+ return (
806
+ <div style={styles.page}>
807
+ {/* 隐藏 timestamp,触发重渲染 */}
808
+ <div style={{ display: 'none' }}>{timestamp}</div>
809
+
810
+ {/* ===== 固定顶部栏 ===== */}
811
+ <div style={styles.topBar}>
812
+ <div style={styles.topBarLogo}>未来视野 2026</div>
813
+ <div style={styles.topBarRight}>
814
+ <div style={styles.countdownWrap}>
815
+ <span>距开播</span>
816
+ <span style={styles.countdownUnit}>{padZero(state.countdownDays)}</span>
817
+ <span>天</span>
818
+ <span style={styles.countdownUnit}>{padZero(state.countdownHours)}</span>
819
+ <span>时</span>
820
+ <span style={styles.countdownUnit}>{padZero(state.countdownMinutes)}</span>
821
+ <span>分</span>
822
+ <span style={styles.countdownUnit}>{padZero(state.countdownSeconds)}</span>
823
+ <span>秒</span>
824
+ </div>
825
+ <button style={styles.topBarCta} onClick={(e) => { this.scrollToForm(); }}>立即锁定席位</button>
826
+ </div>
827
+ </div>
828
+
829
+ {/* ===== Hero 区 ===== */}
830
+ <div style={styles.hero}>
831
+ <div style={styles.heroBadge}>🚀 2026年度科技趋势发布会 · 线上直播</div>
832
+ <div style={styles.heroTitle}>未来视野 2026</div>
833
+ <div style={styles.heroSubtitle}>与全球 5000+ 创新者共同预见下一个十年</div>
834
+
835
+ <div style={styles.heroInfoCard}>
836
+ <div style={styles.heroInfoItem}>
837
+ <div style={styles.heroInfoDot}></div>
838
+ <span>📅 2026年3月15日</span>
839
+ </div>
840
+ <div style={styles.heroInfoItem}>
841
+ <div style={styles.heroInfoDot}></div>
842
+ <span>⏰ 14:00 - 17:00 GMT+8</span>
843
+ </div>
844
+ <div style={styles.heroInfoItem}>
845
+ <div style={styles.heroInfoDot}></div>
846
+ <span>💻 线上直播 + 互动问答</span>
847
+ </div>
848
+ </div>
849
+
850
+ <div style={styles.heroBtnGroup}>
851
+ <button style={styles.btnPrimary} onClick={(e) => { this.scrollToForm(); }}>🎟 免费报名</button>
852
+ <button style={styles.btnSecondary} onClick={(e) => {
853
+ var el = document.getElementById('agenda-section');
854
+ if (el) el.scrollIntoView({ behavior: 'smooth' });
855
+ }}>查看议程 →</button>
856
+ </div>
857
+
858
+ <div style={styles.noticeBanner}>
859
+ <div style={styles.noticeDot}></div>
860
+ <span>{REGISTRATION_NOTICES[state.currentNoticeIndex]}</span>
861
+ </div>
862
+ </div>
863
+
864
+ <div style={styles.divider}></div>
865
+
866
+ {/* ===== 价值主张 ===== */}
867
+ <div style={styles.section}>
868
+ <div style={styles.sectionTitle}>为什么要参加?</div>
869
+ <div style={styles.sectionSubtitle}>四大核心价值,让这场发布会与众不同</div>
870
+ <div style={styles.valueGrid}>
871
+ <div style={styles.valueCard}>
872
+ <div style={styles.valueIcon}>📊</div>
873
+ <div style={styles.valueCardTitle}>趋势首发</div>
874
+ <div style={styles.valueCardDesc}>2026年度科技趋势白皮书独家首发,深度解析未来三年的行业变革方向。</div>
875
+ <div style={styles.valueBadge}>价值 ¥1,999</div>
876
+ </div>
877
+ <div style={styles.valueCard}>
878
+ <div style={styles.valueIcon}>🎤</div>
879
+ <div style={styles.valueCardTitle}>顶级嘉宾</div>
880
+ <div style={styles.valueCardDesc}>3位行业领袖 + 2位神秘大咖,汇聚全球最具影响力的科技思想者。</div>
881
+ <div style={styles.valueBadge}>3月10日揭晓</div>
882
+ </div>
883
+ <div style={styles.valueCard}>
884
+ <div style={styles.valueIcon}>🌐</div>
885
+ <div style={styles.valueCardTitle}>资源网络</div>
886
+ <div style={styles.valueCardDesc}>加入 5000+ 创新者社群,与全球顶尖创业者、投资人建立深度连接。</div>
887
+ <div style={styles.valueBadge}>终身会员</div>
888
+ </div>
889
+ <div style={styles.valueCard}>
890
+ <div style={styles.valueIcon}>⭐</div>
891
+ <div style={styles.valueCardTitle}>口碑保证</div>
892
+ <div style={styles.valueCardDesc}>往届参会者 92% 满意度,平均观看时长 2.5 小时,内容价值有目共睹。</div>
893
+ <div style={styles.valueBadge}>92% 满意度</div>
894
+ </div>
895
+ </div>
896
+ </div>
897
+
898
+ <div style={styles.divider}></div>
899
+
900
+ {/* ===== 议程时间轴 ===== */}
901
+ <div style={Object.assign({}, styles.section, { paddingTop: '80px' })} id="agenda-section">
902
+ <div style={styles.sectionTitle}>发布会议程</div>
903
+ <div style={styles.sectionSubtitle}>精心策划的3小时,每分钟都有价值</div>
904
+ <div style={styles.agendaList}>
905
+ {agendaItems.map(function(item, index) {
906
+ return (
907
+ <div key={index} style={styles.agendaItem}>
908
+ <div style={styles.agendaTimeCol}>
909
+ <div style={styles.agendaTime}>{item.time}</div>
910
+ </div>
911
+ <div style={styles.agendaLine}>
912
+ <div style={styles.agendaDot}></div>
913
+ {index < agendaItems.length - 1 && <div style={styles.agendaConnector}></div>}
914
+ </div>
915
+ <div style={styles.agendaContent}>
916
+ <div style={styles.agendaTitle}>{item.title}</div>
917
+ <div style={styles.agendaDesc}>{item.desc}</div>
918
+ </div>
919
+ </div>
920
+ );
921
+ })}
922
+ </div>
923
+ </div>
924
+
925
+ <div style={styles.divider}></div>
926
+
927
+ {/* ===== 嘉宾阵容 ===== */}
928
+ <div style={styles.section}>
929
+ <div style={styles.sectionTitle}>嘉宾阵容</div>
930
+ <div style={styles.sectionSubtitle}>汇聚全球最具影响力的科技思想领袖</div>
931
+ <div style={styles.speakerGrid}>
932
+ {speakers.map(function(speaker, index) {
933
+ return (
934
+ <div key={index} style={Object.assign({}, styles.speakerCard, speaker.mystery ? styles.speakerMystery : {})}>
935
+ <div style={styles.speakerAvatar}>
936
+ {speaker.mystery ? '❓' : speaker.emoji}
937
+ </div>
938
+ <div style={styles.speakerName}>{speaker.name}</div>
939
+ <div style={styles.speakerTitle}>{speaker.title}</div>
940
+ <div style={styles.speakerTag}>{speaker.tag}</div>
941
+ <div style={Object.assign({}, styles.agendaDesc, { marginTop: '10px', fontSize: '12px' })}>{speaker.bio}</div>
942
+ </div>
943
+ );
944
+ })}
945
+ </div>
946
+ </div>
947
+
948
+ <div style={styles.divider}></div>
949
+
950
+ {/* ===== 社交证明 ===== */}
951
+ <div style={styles.section}>
952
+ <div style={styles.sectionTitle}>他们都在参加</div>
953
+ <div style={styles.sectionSubtitle}>来自全球顶尖企业的创新者共同见证</div>
954
+
955
+ <div style={styles.statsRow}>
956
+ <div style={styles.statItem}>
957
+ <span style={styles.statNumber}>{state.registeredCount.toLocaleString()}</span>
958
+ <div style={styles.statLabel}>已报名人数</div>
959
+ </div>
960
+ <div style={styles.statItem}>
961
+ <span style={styles.statNumber}>92%</span>
962
+ <div style={styles.statLabel}>往届满意度</div>
963
+ </div>
964
+ <div style={styles.statItem}>
965
+ <span style={styles.statNumber}>2.5h</span>
966
+ <div style={styles.statLabel}>平均观看时长</div>
967
+ </div>
968
+ <div style={styles.statItem}>
969
+ <span style={styles.statNumber}>5000+</span>
970
+ <div style={styles.statLabel}>创新者社群</div>
971
+ </div>
972
+ </div>
973
+
974
+ <div style={styles.logoWall}>
975
+ {logos.map(function(logo, index) {
976
+ return (
977
+ <div key={index} style={styles.logoItem}>{logo}</div>
978
+ );
979
+ })}
980
+ </div>
981
+ </div>
982
+
983
+ <div style={styles.divider}></div>
984
+
985
+ {/* ===== 报名表单 ===== */}
986
+ <div style={styles.formSection} id="registration-form">
987
+ <div style={styles.formCard}>
988
+ {state.isSubmitted ? (
989
+ <div style={styles.successCard}>
990
+ <span style={styles.successIcon}>🎉</span>
991
+ <div style={styles.successTitle}>报名成功!</div>
992
+ <div style={styles.successDesc}>
993
+ 确认邮件已发送至您的邮箱<br/>
994
+ 请查收并添加日历提醒
995
+ </div>
996
+ <div style={styles.successActions}>
997
+ <button
998
+ style={styles.successBtn}
999
+ onClick={(e) => { this.utils.toast({ title: '白皮书预览将在活动前发送', type: 'info' }); }}
1000
+ >
1001
+ 📄 下载白皮书预览
1002
+ </button>
1003
+ <button
1004
+ style={styles.successBtn}
1005
+ onClick={(e) => { this.utils.toast({ title: '已复制分享链接', type: 'success' }); }}
1006
+ >
1007
+ 🔗 分享给好友
1008
+ </button>
1009
+ </div>
1010
+ </div>
1011
+ ) : (
1012
+ <div>
1013
+ <div style={styles.formHeader}>
1014
+ <div style={styles.formTitle}>🔒 锁定您的席位</div>
1015
+ <div style={styles.formSubtitle}>免费报名 · 仅限 5,000 人</div>
1016
+ <div style={styles.progressBar}>
1017
+ <div style={styles.progressFill}></div>
1018
+ </div>
1019
+ <div style={styles.progressLabel}>剩余 {remainingSeats.toLocaleString()} 个席位</div>
1020
+ </div>
1021
+
1022
+ {state.submitError ? (
1023
+ <div style={styles.errorMsg}>⚠️ {state.submitError}</div>
1024
+ ) : null}
1025
+
1026
+ <div style={styles.formGroup}>
1027
+ <label style={styles.formLabel}>姓名 *</label>
1028
+ <input
1029
+ id="field-name"
1030
+ style={styles.formInput}
1031
+ type="text"
1032
+ placeholder="请输入您的姓名"
1033
+ defaultValue=""
1034
+ onChange={function(e) { _customState.formName = e.target.value; }}
1035
+ />
1036
+ </div>
1037
+
1038
+ <div style={styles.formGroup}>
1039
+ <label style={styles.formLabel}>公司 *</label>
1040
+ <input
1041
+ id="field-company"
1042
+ style={styles.formInput}
1043
+ type="text"
1044
+ placeholder="请输入您的公司名称"
1045
+ defaultValue=""
1046
+ onChange={function(e) { _customState.formCompany = e.target.value; }}
1047
+ />
1048
+ </div>
1049
+
1050
+ <div style={styles.formGroup}>
1051
+ <label style={styles.formLabel}>职位 *</label>
1052
+ <select
1053
+ id="field-position"
1054
+ style={styles.formSelect}
1055
+ defaultValue="请选择"
1056
+ onChange={function(e) { _customState.formPosition = e.target.value; }}
1057
+ >
1058
+ <option value="请选择" disabled>请选择您的职位</option>
1059
+ <option value="CEO/创始人">CEO / 创始人</option>
1060
+ <option value="CTO/技术负责人">CTO / 技术负责人</option>
1061
+ <option value="产品经理">产品经理</option>
1062
+ <option value="市场营销">市场营销</option>
1063
+ <option value="投资人">投资人</option>
1064
+ <option value="其他">其他</option>
1065
+ </select>
1066
+ </div>
1067
+
1068
+ <div style={styles.formGroup}>
1069
+ <label style={styles.formLabel}>工作邮箱 *</label>
1070
+ <input
1071
+ id="field-email"
1072
+ style={styles.formInput}
1073
+ type="email"
1074
+ placeholder="请输入企业邮箱"
1075
+ defaultValue=""
1076
+ onChange={function(e) { _customState.formEmail = e.target.value; }}
1077
+ />
1078
+ </div>
1079
+
1080
+ <button
1081
+ style={styles.submitBtn}
1082
+ onClick={(e) => { this.handleSubmit(e); }}
1083
+ disabled={state.isSubmitting}
1084
+ >
1085
+ {state.isSubmitting ? '⏳ 提交中...' : '🚀 立即报名,获取专属席位'}
1086
+ </button>
1087
+
1088
+ <div style={styles.securityNote}>🔐 信息严格保密,不会用于任何商业推广</div>
1089
+ </div>
1090
+ )}
1091
+ </div>
1092
+ </div>
1093
+
1094
+ {/* ===== 底部 ===== */}
1095
+ <div style={styles.footer}>
1096
+ <div style={{ marginBottom: '8px', fontSize: '16px', fontWeight: '600', color: 'rgba(255,255,255,0.4)' }}>未来视野 2026</div>
1097
+ <div>© 2026 Future Vision Conference. All rights reserved.</div>
1098
+ <div style={{ marginTop: '8px' }}>2026年3月15日 14:00 - 17:00 GMT+8 · 线上直播</div>
1099
+ </div>
1100
+ </div>
1101
+ );
1102
+ }