linkfeed-pro 1.0.7

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 (65) hide show
  1. package/.claude/settings.local.json +9 -0
  2. package/.output/chrome-mv3/_locales/de/messages.json +214 -0
  3. package/.output/chrome-mv3/_locales/en/messages.json +214 -0
  4. package/.output/chrome-mv3/_locales/es/messages.json +214 -0
  5. package/.output/chrome-mv3/_locales/fr/messages.json +214 -0
  6. package/.output/chrome-mv3/_locales/hi/messages.json +214 -0
  7. package/.output/chrome-mv3/_locales/id/messages.json +214 -0
  8. package/.output/chrome-mv3/_locales/it/messages.json +214 -0
  9. package/.output/chrome-mv3/_locales/nl/messages.json +214 -0
  10. package/.output/chrome-mv3/_locales/pl/messages.json +214 -0
  11. package/.output/chrome-mv3/_locales/pt_BR/messages.json +214 -0
  12. package/.output/chrome-mv3/_locales/pt_PT/messages.json +214 -0
  13. package/.output/chrome-mv3/_locales/tr/messages.json +214 -0
  14. package/.output/chrome-mv3/assets/popup-Z_g1HFs5.css +1 -0
  15. package/.output/chrome-mv3/background.js +42 -0
  16. package/.output/chrome-mv3/chunks/popup-IxiPwS1E.js +42 -0
  17. package/.output/chrome-mv3/content-scripts/content.js +179 -0
  18. package/.output/chrome-mv3/icon-128.png +0 -0
  19. package/.output/chrome-mv3/icon-16.png +0 -0
  20. package/.output/chrome-mv3/icon-48.png +0 -0
  21. package/.output/chrome-mv3/icon.svg +9 -0
  22. package/.output/chrome-mv3/manifest.json +1 -0
  23. package/.output/chrome-mv3/popup.html +247 -0
  24. package/.wxt/eslint-auto-imports.mjs +56 -0
  25. package/.wxt/tsconfig.json +28 -0
  26. package/.wxt/types/globals.d.ts +15 -0
  27. package/.wxt/types/i18n.d.ts +593 -0
  28. package/.wxt/types/imports-module.d.ts +20 -0
  29. package/.wxt/types/imports.d.ts +50 -0
  30. package/.wxt/types/paths.d.ts +32 -0
  31. package/.wxt/wxt.d.ts +7 -0
  32. package/entrypoints/background.ts +112 -0
  33. package/entrypoints/content.ts +656 -0
  34. package/entrypoints/popup/main.ts +452 -0
  35. package/entrypoints/popup/modules/auth-modal.ts +219 -0
  36. package/entrypoints/popup/modules/settings.ts +78 -0
  37. package/entrypoints/popup/modules/ui-state.ts +95 -0
  38. package/entrypoints/popup/style.css +844 -0
  39. package/entrypoints/popup.html +261 -0
  40. package/lib/constants.ts +9 -0
  41. package/lib/device-meta.ts +173 -0
  42. package/lib/i18n.ts +201 -0
  43. package/lib/license.ts +470 -0
  44. package/lib/selectors.ts +24 -0
  45. package/lib/storage.ts +95 -0
  46. package/lib/telemetry.ts +94 -0
  47. package/package.json +30 -0
  48. package/public/_locales/de/messages.json +214 -0
  49. package/public/_locales/en/messages.json +214 -0
  50. package/public/_locales/es/messages.json +214 -0
  51. package/public/_locales/fr/messages.json +214 -0
  52. package/public/_locales/hi/messages.json +214 -0
  53. package/public/_locales/id/messages.json +214 -0
  54. package/public/_locales/it/messages.json +214 -0
  55. package/public/_locales/nl/messages.json +214 -0
  56. package/public/_locales/pl/messages.json +214 -0
  57. package/public/_locales/pt_BR/messages.json +214 -0
  58. package/public/_locales/pt_PT/messages.json +214 -0
  59. package/public/_locales/tr/messages.json +214 -0
  60. package/public/icon-128.png +0 -0
  61. package/public/icon-16.png +0 -0
  62. package/public/icon-48.png +0 -0
  63. package/public/icon.svg +9 -0
  64. package/tsconfig.json +3 -0
  65. package/wxt.config.ts +50 -0
@@ -0,0 +1,844 @@
1
+ /* Base Reset & Variables */
2
+ :root {
3
+ --popup-height: 528px;
4
+ --bg-primary: #09090b;
5
+ /* zinc-950 */
6
+ --bg-secondary: #18181b;
7
+ /* zinc-900 */
8
+ --bg-tertiary: #27272a;
9
+ /* zinc-800 */
10
+ --text-primary: #f4f4f5;
11
+ /* zinc-100 */
12
+ --text-secondary: #a1a1aa;
13
+ /* zinc-400 */
14
+ --accent-primary: #3b82f6;
15
+ /* blue-500 */
16
+ --accent-hover: #2563eb;
17
+ /* blue-600 */
18
+ --border-color: #27272a;
19
+ /* zinc-800 */
20
+ --success: #10b981;
21
+ --radius-sm: 6px;
22
+ --radius-md: 12px;
23
+ --radius-lg: 16px;
24
+ --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
25
+ --transition: all 0.2s cubic-bezier(0.16, 1, 0.3, 1);
26
+ }
27
+
28
+ * {
29
+ margin: 0;
30
+ padding: 0;
31
+ box-sizing: border-box;
32
+ }
33
+
34
+ html {
35
+ width: 340px;
36
+ height: var(--popup-height);
37
+ min-height: var(--popup-height);
38
+ max-height: var(--popup-height);
39
+ }
40
+
41
+ body {
42
+ width: 340px;
43
+ height: var(--popup-height);
44
+ min-height: var(--popup-height);
45
+ max-height: var(--popup-height);
46
+ background-color: var(--bg-primary);
47
+ color: var(--text-primary);
48
+ font-family: var(--font-sans);
49
+ -webkit-font-smoothing: antialiased;
50
+ padding: 16px;
51
+ display: flex;
52
+ flex-direction: column;
53
+ overflow: hidden;
54
+ user-select: none;
55
+ -webkit-user-select: none;
56
+ cursor: default;
57
+ }
58
+
59
+ #hide-view,
60
+ #display-view,
61
+ #settings-view {
62
+ flex: 1;
63
+ min-height: 0;
64
+ }
65
+
66
+ /* Allow selection in inputs and specific display areas */
67
+ input,
68
+ textarea,
69
+ [contenteditable="true"],
70
+ .selectable-text,
71
+ #modal-email-display {
72
+ user-select: text;
73
+ -webkit-user-select: text;
74
+ }
75
+
76
+ /* Header */
77
+ .header {
78
+ margin: 0 -16px 16px;
79
+ padding: 0 16px 14px;
80
+ border-bottom: 1px solid var(--border-color);
81
+ display: flex;
82
+ align-items: center;
83
+ justify-content: space-between;
84
+ }
85
+
86
+ .brand {
87
+ display: flex;
88
+ flex-direction: column;
89
+ align-items: flex-start;
90
+ gap: 4px;
91
+ text-decoration: none;
92
+ }
93
+
94
+ .brand:hover {
95
+ opacity: 0.8;
96
+ }
97
+
98
+ .brand-icon {
99
+ width: 48px;
100
+ height: 48px;
101
+ background: linear-gradient(135deg, var(--accent-primary), var(--accent-hover));
102
+ border-radius: 14px;
103
+ display: grid;
104
+ place-items: center;
105
+ color: white;
106
+ font-weight: 700;
107
+ font-size: 26px;
108
+ box-shadow: 0 8px 24px rgba(59, 130, 246, 0.35);
109
+ }
110
+
111
+ .brand-text {
112
+ display: flex;
113
+ flex-direction: column;
114
+ align-items: flex-start;
115
+ gap: 2px;
116
+ }
117
+
118
+ .brand-text h1 {
119
+ font-size: 22px;
120
+ font-weight: 700;
121
+ color: var(--text-primary);
122
+ letter-spacing: -0.5px;
123
+ }
124
+
125
+ .brand-text h1 span {
126
+ background: linear-gradient(135deg, var(--accent-primary), #60a5fa);
127
+ -webkit-background-clip: text;
128
+ background-clip: text;
129
+ -webkit-text-fill-color: transparent;
130
+ }
131
+
132
+ .brand-text p {
133
+ font-size: 12px;
134
+ color: var(--text-secondary);
135
+ font-weight: 500;
136
+ }
137
+
138
+ /* Header Toggle Button */
139
+ .global-toggle-btn {
140
+ cursor: pointer;
141
+ display: flex;
142
+ align-items: center;
143
+ }
144
+
145
+ .header-actions {
146
+ display: flex;
147
+ align-items: center;
148
+ gap: 8px;
149
+ }
150
+
151
+ .header-actions > .global-toggle-btn {
152
+ margin-left: 6px;
153
+ }
154
+
155
+ .global-toggle-btn input {
156
+ display: none;
157
+ }
158
+
159
+ .header-btn {
160
+ cursor: pointer;
161
+ width: 32px;
162
+ height: 32px;
163
+ border: none;
164
+ background-color: var(--bg-tertiary);
165
+ }
166
+
167
+ .header-btn:hover {
168
+ background-color: #3f3f46;
169
+ }
170
+
171
+ .header-btn.active {
172
+ background-color: var(--accent-primary);
173
+ color: white;
174
+ }
175
+
176
+ .global-toggle-btn input:checked~.header-btn {
177
+ background-color: var(--accent-primary);
178
+ color: white;
179
+ }
180
+
181
+ /* Settings Container */
182
+ .settings-container {
183
+ display: flex;
184
+ flex-direction: column;
185
+ gap: 12px;
186
+ transition: var(--transition);
187
+ }
188
+
189
+ .settings-container.disabled {
190
+ opacity: 0.5;
191
+ pointer-events: none;
192
+ filter: grayscale(1);
193
+ }
194
+
195
+ .settings-view {
196
+ display: flex;
197
+ flex-direction: column;
198
+ gap: 10px;
199
+ height: 100%;
200
+ }
201
+
202
+ .settings-panel {
203
+ background-color: var(--bg-secondary);
204
+ border: 1px solid var(--border-color);
205
+ border-radius: var(--radius-sm);
206
+ padding: 16px;
207
+ display: flex;
208
+ flex-direction: column;
209
+ gap: 10px;
210
+ }
211
+
212
+ .settings-panel h2 {
213
+ font-size: 16px;
214
+ font-weight: 700;
215
+ color: var(--text-primary);
216
+ }
217
+
218
+ .settings-label {
219
+ font-size: 13px;
220
+ font-weight: 500;
221
+ color: var(--text-primary);
222
+ }
223
+
224
+ .settings-help {
225
+ color: var(--text-secondary);
226
+ font-size: 12px;
227
+ line-height: 1.4;
228
+ }
229
+
230
+ .subscription-row {
231
+ display: flex;
232
+ align-items: center;
233
+ justify-content: space-between;
234
+ gap: 8px;
235
+ }
236
+
237
+ .subscription-status-badge {
238
+ display: inline-flex;
239
+ align-items: center;
240
+ justify-content: center;
241
+ padding: 4px 10px;
242
+ border-radius: 999px;
243
+ border: 1px solid transparent;
244
+ font-size: 12px;
245
+ font-weight: 700;
246
+ line-height: 1;
247
+ }
248
+
249
+ .subscription-status-free {
250
+ background: rgba(100, 116, 139, 0.1);
251
+ color: #94a3b8;
252
+ border-color: rgba(100, 116, 139, 0.3);
253
+ }
254
+
255
+ .subscription-status-trial {
256
+ background: rgba(59, 130, 246, 0.1);
257
+ color: #60a5fa;
258
+ border-color: rgba(59, 130, 246, 0.3);
259
+ }
260
+
261
+ .subscription-status-active {
262
+ background: rgba(34, 197, 94, 0.1);
263
+ color: #4ade80;
264
+ border-color: rgba(34, 197, 94, 0.3);
265
+ }
266
+
267
+ .subscription-status-expired {
268
+ background: rgba(245, 158, 11, 0.1);
269
+ color: #fbbf24;
270
+ border-color: rgba(245, 158, 11, 0.3);
271
+ }
272
+
273
+ .settings-actions {
274
+ display: flex;
275
+ flex-direction: column;
276
+ gap: 8px;
277
+ margin-top: 2px;
278
+ }
279
+
280
+ .settings-btn {
281
+ width: 100%;
282
+ border-radius: 10px;
283
+ border: 1px solid var(--border-color);
284
+ padding: 10px 12px;
285
+ font-size: 13px;
286
+ font-weight: 600;
287
+ cursor: pointer;
288
+ transition: var(--transition);
289
+ }
290
+
291
+ .settings-btn.secondary {
292
+ background: var(--bg-primary);
293
+ color: var(--text-primary);
294
+ }
295
+
296
+ .settings-btn.secondary:hover {
297
+ border-color: #3f3f46;
298
+ }
299
+
300
+ .settings-btn.primary {
301
+ background: linear-gradient(135deg, var(--accent-primary), var(--accent-hover));
302
+ border-color: transparent;
303
+ color: #fff;
304
+ }
305
+
306
+ .settings-btn.primary:hover {
307
+ opacity: 0.92;
308
+ }
309
+
310
+ .settings-btn:disabled {
311
+ opacity: 0.65;
312
+ cursor: not-allowed;
313
+ }
314
+
315
+ .settings-footer {
316
+ position: relative;
317
+ margin: auto -16px 0;
318
+ height: 10px;
319
+ min-height: 10px;
320
+ max-height: 10px;
321
+ padding: 0 16px;
322
+ color: var(--text-secondary);
323
+ font-size: 9px;
324
+ font-weight: 600;
325
+ line-height: normal;
326
+ letter-spacing: 0.2px;
327
+ text-align: center;
328
+ }
329
+
330
+ .settings-footer::before {
331
+ content: "";
332
+ position: absolute;
333
+ top: 0;
334
+ left: 0;
335
+ right: 0;
336
+ height: 1px;
337
+ background: var(--border-color);
338
+ }
339
+
340
+ .settings-footer #settings-version-value {
341
+ position: absolute;
342
+ top: 2px;
343
+ right: 0;
344
+ bottom: 0;
345
+ left: 0;
346
+ display: flex;
347
+ align-items: center;
348
+ justify-content: center;
349
+ opacity: 0.92;
350
+ line-height: 1;
351
+ transform: translateY(6px);
352
+ }
353
+
354
+ .locale-select-wrap {
355
+ position: relative;
356
+ }
357
+
358
+ .locale-select {
359
+ width: 100%;
360
+ border: 1px solid var(--border-color);
361
+ border-radius: 10px;
362
+ background: var(--bg-primary);
363
+ color: var(--text-primary);
364
+ font-size: 13px;
365
+ font-weight: 500;
366
+ line-height: 1.2;
367
+ padding: 12px 52px 12px 14px;
368
+ outline: none;
369
+ appearance: none;
370
+ -webkit-appearance: none;
371
+ -moz-appearance: none;
372
+ transition: var(--transition);
373
+ cursor: pointer;
374
+ }
375
+
376
+ .locale-select:hover {
377
+ border-color: #3f3f46;
378
+ }
379
+
380
+ .locale-select:focus {
381
+ border-color: var(--accent-primary);
382
+ box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.18);
383
+ }
384
+
385
+ .locale-select-caret {
386
+ position: absolute;
387
+ right: 10px;
388
+ top: 50%;
389
+ transform: translateY(-50%);
390
+ width: 28px;
391
+ height: 28px;
392
+ border-radius: 8px;
393
+ background: var(--bg-tertiary);
394
+ color: var(--text-secondary);
395
+ display: flex;
396
+ align-items: center;
397
+ justify-content: center;
398
+ pointer-events: none;
399
+ transition: var(--transition);
400
+ }
401
+
402
+ .locale-select-caret svg {
403
+ width: 14px;
404
+ height: 14px;
405
+ }
406
+
407
+ .locale-select-wrap:focus-within .locale-select-caret {
408
+ background: rgba(59, 130, 246, 0.18);
409
+ color: #8cb7ff;
410
+ }
411
+
412
+ /* Feature Cards */
413
+ .setting-card {
414
+ background-color: var(--bg-secondary);
415
+ border: 1px solid var(--border-color);
416
+ border-radius: var(--radius-sm);
417
+ padding: 12px;
418
+ display: flex;
419
+ align-items: center;
420
+ justify-content: space-between;
421
+ transition: var(--transition);
422
+ cursor: pointer;
423
+ min-height: 48px;
424
+ }
425
+
426
+ .setting-card:hover {
427
+ border-color: #3f3f46;
428
+ }
429
+
430
+ .setting-card input[type="checkbox"] {
431
+ display: none;
432
+ }
433
+
434
+ .setting-label {
435
+ font-size: 13px;
436
+ font-weight: 500;
437
+ color: var(--text-primary);
438
+ flex: 1;
439
+ }
440
+
441
+ .icon-btn {
442
+ width: 24px;
443
+ height: 24px;
444
+ display: flex;
445
+ align-items: center;
446
+ justify-content: center;
447
+ border-radius: 6px;
448
+ color: var(--text-secondary);
449
+ background-color: var(--bg-tertiary);
450
+ transition: var(--transition);
451
+ }
452
+
453
+ .setting-card input:checked~.icon-btn {
454
+ background-color: var(--accent-primary);
455
+ color: white;
456
+ }
457
+
458
+ .icon-btn svg {
459
+ width: 16px;
460
+ height: 16px;
461
+ }
462
+
463
+ /* Status Badge */
464
+ .status-badge {
465
+ padding: 0;
466
+ border-radius: 0;
467
+ font-size: inherit;
468
+ /* Inherit form H1 */
469
+ font-weight: 700;
470
+ text-transform: none;
471
+ letter-spacing: 0.5px;
472
+ margin-left: 6px;
473
+ background: none;
474
+ cursor: pointer;
475
+ position: relative;
476
+ /* Reset gradient clip from generic span rule if needed, or leverage it */
477
+ -webkit-background-clip: text;
478
+ background-clip: text;
479
+ -webkit-text-fill-color: transparent;
480
+ }
481
+
482
+ .status-badge:hover {
483
+ opacity: 0.8;
484
+ }
485
+
486
+ /* Custom Tooltip */
487
+ .status-badge::after {
488
+ content: attr(data-title);
489
+ position: absolute;
490
+ top: 100%;
491
+ left: 50%;
492
+ transform: translateX(-50%);
493
+ background: #18181b;
494
+ /* zinc-900 */
495
+ border: 1px solid #27272a;
496
+ /* zinc-800 */
497
+ color: #f4f4f5;
498
+ /* zinc-100 */
499
+ padding: 4px 8px;
500
+ border-radius: 6px;
501
+ font-size: 11px;
502
+ white-space: nowrap;
503
+ opacity: 0;
504
+ pointer-events: none;
505
+ transition: none;
506
+ /* Instant */
507
+ margin-top: 8px;
508
+ z-index: 100;
509
+ font-weight: 500;
510
+ text-transform: none;
511
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.5);
512
+ -webkit-text-fill-color: #f4f4f5;
513
+ /* Reset fill for tooltip text */
514
+ }
515
+
516
+ .status-badge:hover::after {
517
+ opacity: 1;
518
+ }
519
+
520
+ .status-badge.free {
521
+ background: linear-gradient(135deg, var(--accent-primary), #60a5fa);
522
+ -webkit-background-clip: text;
523
+ background-clip: text;
524
+ }
525
+
526
+ .status-badge.trial {
527
+ background: linear-gradient(135deg, var(--accent-primary), #60a5fa);
528
+ -webkit-background-clip: text;
529
+ background-clip: text;
530
+ }
531
+
532
+ .status-badge.pro {
533
+ background: linear-gradient(135deg, var(--accent-primary), #60a5fa);
534
+ -webkit-background-clip: text;
535
+ background-clip: text;
536
+ }
537
+
538
+ /* Hidden class */
539
+ .hidden {
540
+ display: none !important;
541
+ }
542
+
543
+ /* ============================
544
+ PREMIUM FEATURE CLICKABLE
545
+ ============================ */
546
+ /* Locked Features Styling */
547
+ .premium-feature.locked {
548
+ opacity: 0.6;
549
+ /* Slightly transparent */
550
+ cursor: pointer;
551
+ /* Do NOT apply grayscale to the whole container, as we want the PRO badge blue */
552
+ }
553
+
554
+ /* Apply grayscale to specific children when locked */
555
+ .premium-feature.locked .setting-label,
556
+ .premium-feature.locked .icon-btn,
557
+ .premium-feature.locked input,
558
+ .premium-feature.locked .slider-track,
559
+ .premium-feature.locked .value-display,
560
+ .premium-feature.locked input[type=range]::-webkit-slider-thumb {
561
+ filter: grayscale(1);
562
+ opacity: 0.7;
563
+ }
564
+
565
+ /* Ensure PRO badge remains distinct and properly positioned */
566
+ .premium-feature .pro-badge {
567
+ /* Move to left of text using Flexbox order */
568
+ order: -1;
569
+ margin-right: 8px;
570
+ /* Spacing between badge and text */
571
+ margin-left: 0;
572
+
573
+ /* Ensure color is preserved (no grayscale) */
574
+ filter: none;
575
+ opacity: 1;
576
+ }
577
+
578
+ .premium-feature.locked:hover {
579
+ opacity: 0.8;
580
+ background-color: var(--bg-tertiary);
581
+ border-color: var(--accent-primary);
582
+ }
583
+
584
+ .premium-feature.locked input,
585
+ .premium-feature.locked .slider-track {
586
+ pointer-events: none;
587
+ }
588
+
589
+ /* ============================
590
+ MODAL OVERLAY
591
+ ============================ */
592
+ .modal-overlay {
593
+ position: fixed;
594
+ top: 0;
595
+ left: 0;
596
+ right: 0;
597
+ bottom: 0;
598
+ background: rgba(0, 0, 0, 0.8);
599
+ backdrop-filter: blur(4px);
600
+ display: flex;
601
+ align-items: center;
602
+ justify-content: center;
603
+ z-index: 1000;
604
+ padding: 16px;
605
+ }
606
+
607
+ .modal-content {
608
+ background: var(--bg-secondary);
609
+ border: 1px solid var(--border-color);
610
+ border-radius: var(--radius-lg);
611
+ padding: 24px;
612
+ width: 100%;
613
+ max-width: 320px;
614
+ position: relative;
615
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
616
+ }
617
+
618
+ .modal-close {
619
+ position: absolute;
620
+ top: 12px;
621
+ right: 12px;
622
+ background: none;
623
+ border: none;
624
+ color: var(--text-secondary);
625
+ font-size: 24px;
626
+ cursor: pointer;
627
+ padding: 4px 8px;
628
+ line-height: 1;
629
+ border-radius: var(--radius-sm);
630
+ transition: var(--transition);
631
+ }
632
+
633
+ .modal-close:hover {
634
+ color: var(--text-primary);
635
+ background: var(--bg-tertiary);
636
+ }
637
+
638
+ .modal-step h2 {
639
+ font-size: 18px;
640
+ font-weight: 700;
641
+ color: var(--text-primary);
642
+ margin-bottom: 8px;
643
+ text-align: center;
644
+ }
645
+
646
+ .modal-desc {
647
+ font-size: 13px;
648
+ color: var(--text-secondary);
649
+ text-align: center;
650
+ margin-bottom: 20px;
651
+ line-height: 1.5;
652
+ }
653
+
654
+ .modal-step input[type="email"] {
655
+ width: 100%;
656
+ padding: 12px 14px;
657
+ background: var(--bg-primary);
658
+ border: 1px solid var(--border-color);
659
+ border-radius: var(--radius-sm);
660
+ color: var(--text-primary);
661
+ font-size: 14px;
662
+ outline: none;
663
+ transition: border-color 0.2s;
664
+ margin-bottom: 12px;
665
+ }
666
+
667
+ .modal-step input:focus {
668
+ border-color: var(--accent-primary);
669
+ }
670
+
671
+ .modal-step input::placeholder {
672
+ color: var(--text-secondary);
673
+ }
674
+
675
+
676
+ .modal-btn {
677
+ width: 100%;
678
+ padding: 12px 16px;
679
+ border: none;
680
+ border-radius: var(--radius-sm);
681
+ cursor: pointer;
682
+ font-weight: 600;
683
+ font-size: 14px;
684
+ transition: opacity 0.2s, transform 0.1s;
685
+ }
686
+
687
+ .modal-btn.primary {
688
+ background: linear-gradient(135deg, var(--accent-primary), var(--accent-hover));
689
+ color: white;
690
+ box-shadow: 0 4px 12px rgba(59, 130, 246, 0.3);
691
+ }
692
+
693
+ .modal-btn.primary:hover {
694
+ opacity: 0.9;
695
+ transform: translateY(-1px);
696
+ }
697
+
698
+ .modal-btn.primary:active {
699
+ transform: translateY(0);
700
+ }
701
+
702
+ .modal-btn:disabled {
703
+ opacity: 0.6;
704
+ cursor: not-allowed;
705
+ transform: none;
706
+ }
707
+
708
+ .modal-error {
709
+ color: #ef4444;
710
+ font-size: 12px;
711
+ text-align: center;
712
+ margin-top: 8px;
713
+ margin-bottom: 8px;
714
+ }
715
+
716
+ .modal-link-btn {
717
+ background: none;
718
+ border: none;
719
+ color: var(--text-secondary);
720
+ font-size: 12px;
721
+ cursor: pointer;
722
+ padding: 8px;
723
+ margin-top: 8px;
724
+ display: block;
725
+ width: 100%;
726
+ text-align: center;
727
+ }
728
+
729
+ .modal-link-btn:hover {
730
+ color: var(--text-primary);
731
+ text-decoration: underline;
732
+ }
733
+
734
+ .modal-footer {
735
+ margin-top: 20px;
736
+ padding-top: 16px;
737
+ border-top: 1px solid var(--border-color);
738
+ text-align: center;
739
+ }
740
+
741
+ .modal-footer p {
742
+ font-size: 11px;
743
+ color: var(--text-secondary);
744
+ }
745
+
746
+ .modal-footer a {
747
+ color: var(--accent-primary);
748
+ text-decoration: none;
749
+ }
750
+
751
+ .modal-footer a:hover {
752
+ text-decoration: underline;
753
+ }
754
+
755
+ /* Slider Section */
756
+ .slider-section {
757
+ margin-top: 0;
758
+ padding: 10px 12px;
759
+ background-color: var(--bg-secondary);
760
+ border: 1px solid var(--border-color);
761
+ border-radius: var(--radius-sm);
762
+ display: flex;
763
+ flex-direction: column;
764
+ justify-content: center;
765
+ gap: 8px;
766
+ min-height: 56px;
767
+ }
768
+
769
+ .section-top {
770
+ display: flex;
771
+ justify-content: space-between;
772
+ align-items: center;
773
+ }
774
+
775
+ .section-label {
776
+ font-size: 13px;
777
+ font-weight: 500;
778
+ color: var(--text-primary);
779
+ }
780
+
781
+ input[type=range] {
782
+ -webkit-appearance: none;
783
+ width: 100%;
784
+ background: transparent;
785
+ cursor: pointer;
786
+ }
787
+
788
+ input[type=range]:focus {
789
+ outline: none;
790
+ }
791
+
792
+ input[type=range]::-webkit-slider-runnable-track {
793
+ width: 100%;
794
+ height: 4px;
795
+ cursor: pointer;
796
+ background: var(--bg-tertiary);
797
+ border-radius: 2px;
798
+ background-image: repeating-linear-gradient(90deg, var(--bg-tertiary) 0px, var(--bg-tertiary) calc(10% - 1px), var(--border-color) calc(10% - 1px), var(--border-color) 10%);
799
+ }
800
+
801
+ input[type=range]::-webkit-slider-thumb {
802
+ height: 12px;
803
+ width: 12px;
804
+ border-radius: 50%;
805
+ background: var(--accent-primary);
806
+ cursor: pointer;
807
+ -webkit-appearance: none;
808
+ margin-top: -4px;
809
+ box-shadow: 0 1px 3px #0000004d;
810
+ transition: transform .1s ease, box-shadow .1s ease;
811
+ }
812
+
813
+ input[type=range]:active::-webkit-slider-thumb {
814
+ transform: scale(1.2);
815
+ box-shadow: 0 0 0 4px #0a66c233;
816
+ }
817
+
818
+ .value-display {
819
+ font-size: 12px;
820
+ font-weight: 500;
821
+ color: var(--accent-primary);
822
+ font-variant-numeric: tabular-nums;
823
+ margin-left: auto;
824
+ opacity: .9;
825
+ }
826
+
827
+ .pro-badge {
828
+ background: rgba(59, 130, 246, 0.15);
829
+ color: #3b82f6;
830
+ padding: 2px 6px;
831
+ border-radius: 4px;
832
+ font-size: 9px;
833
+ font-weight: 700;
834
+ text-transform: uppercase;
835
+ letter-spacing: 0.5px;
836
+ margin-left: auto;
837
+ margin-right: 8px;
838
+ }
839
+
840
+ /* Loading state */
841
+ .loading {
842
+ opacity: 0.7;
843
+ pointer-events: none;
844
+ }