mm-math 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/css/style.css ADDED
@@ -0,0 +1,615 @@
1
+ *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
2
+
3
+ :root {
4
+ --accent: #2563eb;
5
+ --accent-h: #1d4ed8;
6
+ --text: #111827;
7
+ --muted: #6b7280;
8
+ --border: #e5e7eb;
9
+ --surface: #f9fafb;
10
+ --radius: 10px;
11
+ --shadow: 0 1px 3px rgba(0,0,0,.08), 0 1px 2px rgba(0,0,0,.05);
12
+ --shadow-lg: 0 4px 20px rgba(0,0,0,.10);
13
+ }
14
+
15
+ body {
16
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
17
+ color: var(--text);
18
+ background: #fff;
19
+ line-height: 1.5;
20
+ }
21
+
22
+ a { color: inherit; text-decoration: none; }
23
+
24
+ /* ── Header ── */
25
+ .site-header {
26
+ position: sticky;
27
+ top: 0;
28
+ z-index: 100;
29
+ background: #fff;
30
+ border-bottom: 1px solid var(--border);
31
+ padding: 0 24px;
32
+ }
33
+
34
+ .header-inner {
35
+ max-width: 1200px;
36
+ margin: 0 auto;
37
+ height: 56px;
38
+ display: flex;
39
+ align-items: center;
40
+ gap: 20px;
41
+ }
42
+
43
+ .logo-link {
44
+ display: flex;
45
+ align-items: center;
46
+ gap: 10px;
47
+ font-weight: 700;
48
+ font-size: 1.1rem;
49
+ letter-spacing: -0.02em;
50
+ }
51
+
52
+ .logo-img {
53
+ height: 40px;
54
+ width: auto;
55
+ border-radius: 8px;
56
+ }
57
+
58
+ .site-nav {
59
+ margin-left: auto;
60
+ display: flex;
61
+ align-items: center;
62
+ gap: 8px;
63
+ }
64
+
65
+ .site-nav a {
66
+ padding: 6px 14px;
67
+ border-radius: 6px;
68
+ font-size: 0.875rem;
69
+ font-weight: 500;
70
+ color: var(--muted);
71
+ transition: background .15s, color .15s;
72
+ }
73
+
74
+ .site-nav a:hover,
75
+ .site-nav a.active {
76
+ background: var(--surface);
77
+ color: var(--text);
78
+ }
79
+
80
+ /* ── Search ── */
81
+ .search-wrap {
82
+ position: relative;
83
+ max-width: 480px;
84
+ width: 100%;
85
+ }
86
+
87
+ .search-wrap svg {
88
+ position: absolute;
89
+ left: 12px;
90
+ top: 50%;
91
+ transform: translateY(-50%);
92
+ color: var(--muted);
93
+ pointer-events: none;
94
+ }
95
+
96
+ .search-input {
97
+ width: 100%;
98
+ padding: 10px 14px 10px 40px;
99
+ border: 1.5px solid var(--border);
100
+ border-radius: 8px;
101
+ font-size: 0.9rem;
102
+ outline: none;
103
+ transition: border-color .15s, box-shadow .15s;
104
+ background: var(--surface);
105
+ }
106
+
107
+ .search-input:focus {
108
+ border-color: var(--accent);
109
+ box-shadow: 0 0 0 3px rgba(37,99,235,.12);
110
+ background: #fff;
111
+ }
112
+
113
+ /* ── Category filter ── */
114
+ .category-filters {
115
+ display: flex;
116
+ gap: 8px;
117
+ flex-wrap: wrap;
118
+ }
119
+
120
+ .cat-btn {
121
+ padding: 6px 16px;
122
+ border-radius: 999px;
123
+ border: 1.5px solid var(--border);
124
+ background: #fff;
125
+ font-size: 0.82rem;
126
+ font-weight: 500;
127
+ color: var(--muted);
128
+ cursor: pointer;
129
+ transition: all .15s;
130
+ }
131
+
132
+ .cat-btn:hover {
133
+ border-color: var(--accent);
134
+ color: var(--accent);
135
+ }
136
+
137
+ .cat-btn.active {
138
+ background: var(--accent);
139
+ border-color: var(--accent);
140
+ color: #fff;
141
+ }
142
+
143
+ /* ── Game grid ── */
144
+ .game-grid {
145
+ display: grid;
146
+ grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
147
+ gap: 16px;
148
+ }
149
+
150
+ .game-card {
151
+ border-radius: var(--radius);
152
+ overflow: hidden;
153
+ border: 1px solid var(--border);
154
+ transition: transform .15s, box-shadow .15s;
155
+ cursor: pointer;
156
+ background: #fff;
157
+ }
158
+
159
+ .game-card:hover {
160
+ transform: translateY(-2px);
161
+ box-shadow: var(--shadow-lg);
162
+ }
163
+
164
+ .game-card-thumb {
165
+ width: 100%;
166
+ aspect-ratio: 4/3;
167
+ object-fit: cover;
168
+ background: var(--surface);
169
+ display: block;
170
+ }
171
+
172
+ .game-card-thumb-placeholder {
173
+ width: 100%;
174
+ aspect-ratio: 4/3;
175
+ background: linear-gradient(135deg, #e0e7ff 0%, #dbeafe 100%);
176
+ display: flex;
177
+ align-items: center;
178
+ justify-content: center;
179
+ font-size: 2rem;
180
+ }
181
+
182
+ .game-card-body {
183
+ padding: 10px 12px 12px;
184
+ }
185
+
186
+ .game-card-name {
187
+ font-size: 0.875rem;
188
+ font-weight: 600;
189
+ margin-bottom: 4px;
190
+ white-space: nowrap;
191
+ overflow: hidden;
192
+ text-overflow: ellipsis;
193
+ }
194
+
195
+ .cat-badge {
196
+ display: inline-block;
197
+ padding: 2px 8px;
198
+ border-radius: 999px;
199
+ font-size: 0.72rem;
200
+ font-weight: 600;
201
+ text-transform: uppercase;
202
+ letter-spacing: .04em;
203
+ }
204
+
205
+ .cat-badge.Action { background: #fee2e2; color: #b91c1c; }
206
+ .cat-badge.Sports { background: #d1fae5; color: #065f46; }
207
+ .cat-badge.Racing { background: #fef3c7; color: #92400e; }
208
+ .cat-badge.Multiplayer { background: #ede9fe; color: #5b21b6; }
209
+ .cat-badge.Puzzle { background: #dbeafe; color: #1e40af; }
210
+ .cat-badge.Casual { background: #fce7f3; color: #9d174d; }
211
+
212
+ /* ── Game of the Day ── */
213
+ .gotd-card {
214
+ display: flex;
215
+ align-items: center;
216
+ gap: 20px;
217
+ padding: 20px;
218
+ border-radius: var(--radius);
219
+ border: 1px solid var(--border);
220
+ background: linear-gradient(135deg, #eff6ff 0%, #f0fdf4 100%);
221
+ text-decoration: none;
222
+ color: var(--text);
223
+ transition: box-shadow .15s;
224
+ }
225
+
226
+ .gotd-card:hover { box-shadow: var(--shadow-lg); }
227
+
228
+ .gotd-thumb {
229
+ width: 140px;
230
+ height: 105px;
231
+ object-fit: cover;
232
+ border-radius: 8px;
233
+ flex-shrink: 0;
234
+ background: var(--surface);
235
+ }
236
+
237
+ .gotd-thumb-placeholder {
238
+ width: 140px;
239
+ height: 105px;
240
+ border-radius: 8px;
241
+ background: linear-gradient(135deg, #c7d2fe 0%, #bfdbfe 100%);
242
+ display: flex;
243
+ align-items: center;
244
+ justify-content: center;
245
+ font-size: 2.5rem;
246
+ flex-shrink: 0;
247
+ }
248
+
249
+ .gotd-label {
250
+ font-size: 0.72rem;
251
+ font-weight: 700;
252
+ text-transform: uppercase;
253
+ letter-spacing: .08em;
254
+ color: var(--accent);
255
+ margin-bottom: 6px;
256
+ }
257
+
258
+ .gotd-name {
259
+ font-size: 1.3rem;
260
+ font-weight: 700;
261
+ letter-spacing: -0.02em;
262
+ margin-bottom: 6px;
263
+ }
264
+
265
+ .gotd-play-btn {
266
+ display: inline-flex;
267
+ align-items: center;
268
+ gap: 6px;
269
+ padding: 8px 18px;
270
+ background: var(--accent);
271
+ color: #fff;
272
+ border-radius: 8px;
273
+ font-size: 0.875rem;
274
+ font-weight: 600;
275
+ margin-top: 8px;
276
+ transition: background .15s;
277
+ }
278
+
279
+ .gotd-play-btn:hover { background: var(--accent-h); }
280
+
281
+ /* ── Containers ── */
282
+ .container {
283
+ max-width: 1200px;
284
+ margin: 0 auto;
285
+ padding: 0 24px;
286
+ }
287
+
288
+ .section { margin-bottom: 40px; }
289
+
290
+ .section-title {
291
+ font-size: 0.75rem;
292
+ font-weight: 700;
293
+ text-transform: uppercase;
294
+ letter-spacing: .08em;
295
+ color: var(--muted);
296
+ margin-bottom: 12px;
297
+ }
298
+
299
+ /* ── Modal / PIN overlay ── */
300
+ .pin-overlay {
301
+ position: fixed;
302
+ inset: 0;
303
+ background: rgba(0,0,0,.5);
304
+ display: flex;
305
+ align-items: center;
306
+ justify-content: center;
307
+ z-index: 999;
308
+ backdrop-filter: blur(4px);
309
+ }
310
+
311
+ .pin-overlay.hidden { display: none; }
312
+
313
+ .pin-box {
314
+ background: #fff;
315
+ border-radius: 16px;
316
+ padding: 32px;
317
+ width: 320px;
318
+ box-shadow: 0 24px 60px rgba(0,0,0,.2);
319
+ text-align: center;
320
+ }
321
+
322
+ .pin-box h2 {
323
+ font-size: 1.1rem;
324
+ font-weight: 700;
325
+ margin-bottom: 6px;
326
+ }
327
+
328
+ .pin-box p {
329
+ font-size: 0.85rem;
330
+ color: var(--muted);
331
+ margin-bottom: 20px;
332
+ }
333
+
334
+ .pin-dots {
335
+ display: flex;
336
+ justify-content: center;
337
+ gap: 12px;
338
+ margin-bottom: 24px;
339
+ }
340
+
341
+ .pin-dot {
342
+ width: 14px;
343
+ height: 14px;
344
+ border-radius: 50%;
345
+ border: 2px solid var(--border);
346
+ background: transparent;
347
+ transition: background .15s, border-color .15s;
348
+ }
349
+
350
+ .pin-dot.filled {
351
+ background: var(--accent);
352
+ border-color: var(--accent);
353
+ }
354
+
355
+ .pin-dot.error {
356
+ background: #ef4444;
357
+ border-color: #ef4444;
358
+ }
359
+
360
+ .pin-keypad {
361
+ display: grid;
362
+ grid-template-columns: repeat(3, 1fr);
363
+ gap: 8px;
364
+ margin-bottom: 16px;
365
+ }
366
+
367
+ .pin-key {
368
+ padding: 14px;
369
+ border: none;
370
+ border-radius: 10px;
371
+ background: var(--surface);
372
+ font-size: 1.1rem;
373
+ font-weight: 500;
374
+ cursor: pointer;
375
+ transition: background .1s;
376
+ }
377
+
378
+ .pin-key:hover { background: #e5e7eb; }
379
+ .pin-key:active { background: #d1d5db; }
380
+
381
+ .pin-key.delete {
382
+ background: transparent;
383
+ color: var(--muted);
384
+ font-size: 0.9rem;
385
+ }
386
+
387
+ .pin-cancel {
388
+ font-size: 0.85rem;
389
+ color: var(--muted);
390
+ cursor: pointer;
391
+ border: none;
392
+ background: none;
393
+ padding: 8px;
394
+ }
395
+
396
+ .pin-cancel:hover { color: var(--text); }
397
+
398
+ .pin-error {
399
+ font-size: 0.82rem;
400
+ color: #ef4444;
401
+ min-height: 1.2em;
402
+ margin-bottom: 8px;
403
+ }
404
+
405
+ /* ── Admin table ── */
406
+ .admin-table {
407
+ width: 100%;
408
+ border-collapse: collapse;
409
+ font-size: 0.875rem;
410
+ }
411
+
412
+ .admin-table th {
413
+ text-align: left;
414
+ padding: 10px 12px;
415
+ border-bottom: 2px solid var(--border);
416
+ font-size: 0.75rem;
417
+ font-weight: 600;
418
+ text-transform: uppercase;
419
+ letter-spacing: .05em;
420
+ color: var(--muted);
421
+ }
422
+
423
+ .admin-table td {
424
+ padding: 10px 12px;
425
+ border-bottom: 1px solid var(--border);
426
+ vertical-align: middle;
427
+ }
428
+
429
+ .admin-table tr:hover td { background: var(--surface); }
430
+
431
+ /* ── Form ── */
432
+ .form-grid {
433
+ display: grid;
434
+ grid-template-columns: 1fr 1fr;
435
+ gap: 14px;
436
+ }
437
+
438
+ .form-group { display: flex; flex-direction: column; gap: 5px; }
439
+ .form-group.full { grid-column: 1 / -1; }
440
+
441
+ .form-group label {
442
+ font-size: 0.8rem;
443
+ font-weight: 600;
444
+ color: var(--muted);
445
+ text-transform: uppercase;
446
+ letter-spacing: .04em;
447
+ }
448
+
449
+ .form-group input,
450
+ .form-group select {
451
+ padding: 9px 12px;
452
+ border: 1.5px solid var(--border);
453
+ border-radius: 8px;
454
+ font-size: 0.9rem;
455
+ outline: none;
456
+ transition: border-color .15s;
457
+ }
458
+
459
+ .form-group input:focus,
460
+ .form-group select:focus {
461
+ border-color: var(--accent);
462
+ box-shadow: 0 0 0 3px rgba(37,99,235,.1);
463
+ }
464
+
465
+ /* ── Buttons ── */
466
+ .btn {
467
+ display: inline-flex;
468
+ align-items: center;
469
+ gap: 6px;
470
+ padding: 9px 18px;
471
+ border: none;
472
+ border-radius: 8px;
473
+ font-size: 0.875rem;
474
+ font-weight: 600;
475
+ cursor: pointer;
476
+ transition: background .15s, opacity .15s;
477
+ }
478
+
479
+ .btn-primary { background: var(--accent); color: #fff; }
480
+ .btn-primary:hover { background: var(--accent-h); }
481
+
482
+ .btn-ghost {
483
+ background: transparent;
484
+ color: var(--muted);
485
+ border: 1.5px solid var(--border);
486
+ }
487
+ .btn-ghost:hover { color: var(--text); border-color: #9ca3af; }
488
+
489
+ .btn-danger { background: #fee2e2; color: #b91c1c; }
490
+ .btn-danger:hover { background: #fecaca; }
491
+
492
+ .btn-sm { padding: 5px 12px; font-size: 0.8rem; }
493
+
494
+ /* ── Toggle switch ── */
495
+ .toggle {
496
+ position: relative;
497
+ display: inline-block;
498
+ width: 38px;
499
+ height: 22px;
500
+ }
501
+
502
+ .toggle input { opacity: 0; width: 0; height: 0; }
503
+
504
+ .toggle-slider {
505
+ position: absolute;
506
+ inset: 0;
507
+ border-radius: 999px;
508
+ background: #d1d5db;
509
+ cursor: pointer;
510
+ transition: background .2s;
511
+ }
512
+
513
+ .toggle-slider::before {
514
+ content: '';
515
+ position: absolute;
516
+ height: 16px;
517
+ width: 16px;
518
+ left: 3px;
519
+ bottom: 3px;
520
+ border-radius: 50%;
521
+ background: #fff;
522
+ transition: transform .2s;
523
+ box-shadow: 0 1px 3px rgba(0,0,0,.2);
524
+ }
525
+
526
+ .toggle input:checked + .toggle-slider { background: var(--accent); }
527
+ .toggle input:checked + .toggle-slider::before { transform: translateX(16px); }
528
+
529
+ /* ── Stats ── */
530
+ .stats-grid {
531
+ display: grid;
532
+ grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
533
+ gap: 12px;
534
+ }
535
+
536
+ .stat-card {
537
+ padding: 16px;
538
+ border: 1px solid var(--border);
539
+ border-radius: var(--radius);
540
+ background: var(--surface);
541
+ }
542
+
543
+ .stat-value {
544
+ font-size: 1.8rem;
545
+ font-weight: 700;
546
+ letter-spacing: -0.03em;
547
+ }
548
+
549
+ .stat-label {
550
+ font-size: 0.78rem;
551
+ color: var(--muted);
552
+ margin-top: 2px;
553
+ }
554
+
555
+ /* ── Card section ── */
556
+ .card {
557
+ background: #fff;
558
+ border: 1px solid var(--border);
559
+ border-radius: var(--radius);
560
+ padding: 24px;
561
+ margin-bottom: 20px;
562
+ }
563
+
564
+ .card-title {
565
+ font-size: 0.8rem;
566
+ font-weight: 600;
567
+ text-transform: uppercase;
568
+ letter-spacing: .06em;
569
+ color: var(--muted);
570
+ margin-bottom: 18px;
571
+ }
572
+
573
+ /* ── Feedback ── */
574
+ .feedback {
575
+ font-size: 0.85rem;
576
+ font-weight: 500;
577
+ min-height: 1.2em;
578
+ margin-top: 10px;
579
+ }
580
+ .feedback.ok { color: #15803d; }
581
+ .feedback.error { color: #b91c1c; }
582
+
583
+ /* ── No-results ── */
584
+ .no-results {
585
+ grid-column: 1 / -1;
586
+ text-align: center;
587
+ padding: 60px 0;
588
+ color: var(--muted);
589
+ font-size: 0.9rem;
590
+ }
591
+
592
+ /* ── Responsive ── */
593
+ @media (max-width: 640px) {
594
+ .form-grid { grid-template-columns: 1fr; }
595
+ .gotd-card { flex-direction: column; }
596
+ .gotd-thumb, .gotd-thumb-placeholder { width: 100%; height: 180px; }
597
+ .game-grid { grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); }
598
+ .header-inner { gap: 12px; }
599
+ }
600
+
601
+ .cat-badge.Adventure { background: #d1fae5; color: #065f46; }
602
+ .cat-badge.Classic { background: #fef3c7; color: #92400e; }
603
+ .cat-badge.Strategy { background: #e0e7ff; color: #3730a3; }
604
+
605
+ .nav-calc-btn {
606
+ display: flex;
607
+ align-items: center;
608
+ justify-content: center;
609
+ padding: 6px 10px;
610
+ border-radius: 6px;
611
+ color: var(--muted);
612
+ transition: background .15s, color .15s;
613
+ }
614
+ .nav-calc-btn:hover { background: var(--surface); color: var(--text); }
615
+