active_hashcash 0.2.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +13 -0
  3. data/README.md +101 -14
  4. data/app/assets/config/active_hashcash_manifest.js +1 -0
  5. data/app/assets/javascripts/hashcash.js +257 -0
  6. data/app/assets/stylesheets/active_hashcash/application.css +15 -0
  7. data/app/controllers/active_hashcash/addresses_controller.rb +7 -0
  8. data/app/controllers/active_hashcash/application_controller.rb +4 -0
  9. data/app/controllers/active_hashcash/assets_controller.rb +34 -0
  10. data/app/controllers/active_hashcash/stamps_controller.rb +11 -0
  11. data/app/helpers/active_hashcash/addresses_helper.rb +4 -0
  12. data/app/helpers/active_hashcash/application_helper.rb +4 -0
  13. data/app/helpers/active_hashcash/stamps_helper.rb +4 -0
  14. data/app/jobs/active_hashcash/application_job.rb +4 -0
  15. data/app/mailers/active_hashcash/application_mailer.rb +6 -0
  16. data/app/models/active_hashcash/application_record.rb +5 -0
  17. data/app/models/active_hashcash/stamp.rb +70 -0
  18. data/app/views/active_hashcash/addresses/index.html.erb +17 -0
  19. data/app/views/active_hashcash/assets/_logo.svg.erb +1 -0
  20. data/app/views/active_hashcash/assets/_style.css +148 -0
  21. data/app/views/active_hashcash/assets/application.css.erb +1 -0
  22. data/app/views/active_hashcash/assets/ariato.css.erb +2 -0
  23. data/app/views/active_hashcash/assets/favicon.ico +0 -0
  24. data/app/views/active_hashcash/assets/favicon.svg.erb +1 -0
  25. data/app/views/active_hashcash/assets/vendor/_ariato_base.css +1297 -0
  26. data/app/views/active_hashcash/assets/vendor/_ariato_extra.css +1206 -0
  27. data/app/views/active_hashcash/stamps/_filters.html.erb +39 -0
  28. data/app/views/active_hashcash/stamps/index.html.erb +25 -0
  29. data/app/views/active_hashcash/stamps/show.html.erb +21 -0
  30. data/app/views/layouts/active_hashcash/application.html.erb +36 -0
  31. data/config/locales/de.yml +4 -0
  32. data/config/locales/en.yml +4 -0
  33. data/config/locales/es.yml +4 -0
  34. data/config/locales/fr.yml +4 -0
  35. data/config/locales/it.yml +4 -0
  36. data/config/locales/jp.yml +4 -0
  37. data/config/locales/pt.yml +4 -0
  38. data/config/routes.rb +6 -0
  39. data/db/migrate/20240215143453_create_active_hashcash_stamps.rb +25 -0
  40. data/lib/active_hashcash/engine.rb +2 -14
  41. data/lib/active_hashcash/version.rb +1 -1
  42. data/lib/active_hashcash.rb +35 -21
  43. data/lib/tasks/active_hashcash_tasks.rake +4 -0
  44. metadata +47 -26
  45. data/lib/active_hashcash/stamp.rb +0 -52
  46. data/lib/active_hashcash/store.rb +0 -25
@@ -0,0 +1,1206 @@
1
+ /*******************************************/
2
+ /* ariato extra */
3
+ /* https://github.com/BaseSecrete/ariato */
4
+ /*******************************************/
5
+
6
+ /*elements*/
7
+ progress[value] {
8
+ appearance: none;
9
+ border: 1px solid var(--color-grey-200);
10
+ border-radius: var(--border-radius-s, 0);
11
+ color: var(--color-info-500);
12
+ width: 100%;
13
+ height: var(--space-2x);
14
+ margin: calc(var(--space-2x) - 4px) 0 2px;
15
+
16
+ &::-webkit-progress-bar {
17
+ background-color: var(--color-grey-35);
18
+ border-radius: var(--border-radius-s, 0);
19
+ box-shadow: var(--box-inset-shadow-s);
20
+ }
21
+
22
+ &::-webkit-progress-value {
23
+ background-color: var(--color-info-500);
24
+ border-radius: 1px;
25
+ box-shadow: var(--box-inset-shadow-s);
26
+ }
27
+ }
28
+ input[type=range] {
29
+ appearance: none;
30
+ margin: 0;
31
+ width: 100%;
32
+ background: transparent;
33
+ border: 0;
34
+ box-shadow: 0 0 0 0;
35
+ padding-left: 0;
36
+ padding-right: 0;
37
+ &::-webkit-slider-runnable-track {
38
+ width: 100%;
39
+ height: var(--space);
40
+ cursor: pointer;
41
+ background: var(--color-grey-35);
42
+ border: 1px solid var(--color-grey-200);
43
+ border-radius: var(--border-radius-m);
44
+ outline: 0 none;
45
+ box-shadow: var(--box-inset-shadow-s);
46
+ }
47
+ &::-webkit-slider-thumb {
48
+ display: block;
49
+ box-shadow:
50
+ 0 -1px 1px 0 var(--color-shadow) inset,
51
+ 0 1px 1px 0 var(--color-light) inset,
52
+ var(--box-shadow-m);
53
+ border: 1px solid var(--color-grey-500);
54
+ height: var(--space-3x);
55
+ width: var(--space-3x);
56
+ border-radius: 50%;
57
+ background: var(--color-grey-200);
58
+ cursor: pointer;
59
+ appearance: none;
60
+ margin-top: -9px;
61
+ }
62
+ &:focus::-webkit-slider-runnable-track { background: var(--color-grey-50); }
63
+
64
+ &::-moz-range-track {
65
+ width: 100%;
66
+ height: var(--space);
67
+ cursor: pointer;
68
+ background: var(--color-grey-35);
69
+ border-radius:var(--border-radius-m, 0);
70
+ border: 1px solid var(--color-grey-200);
71
+ box-shadow: var(--box-inset-shadow-s);
72
+ }
73
+ &::-moz-range-thumb {
74
+ height: 24px;
75
+ width: 24px;
76
+ box-shadow:
77
+ 0 -1px 1px 0 var(--color-shadow) inset,
78
+ 0 1px 1px 0 var(--color-light) inset,
79
+ var(--box-shadow-m);
80
+ border: 1px solid var(--color-grey-500);
81
+
82
+ border-radius: 50%;
83
+ background: var(--color-grey-200);
84
+ cursor: pointer;
85
+ }
86
+ &::-ms-track {
87
+ width: 100%;
88
+ height: var(--space);
89
+ cursor: pointer;
90
+ background: transparent;
91
+ border-color: transparent;
92
+ border-width: 16px 0;
93
+ color: transparent;
94
+ }
95
+ &::-ms-fill-lower {
96
+ background: var(--color-info-500);
97
+ border: 0.2px solid var(--color-grey-200);
98
+ border-radius: 3.6px;
99
+ box-shadow: 1px 1px 1px var(--color-shadow), 0px 0px 1px var(--color-grey-200);
100
+ }
101
+ &::-ms-fill-upper {
102
+ background: #3071a9;
103
+ border: 0.2px solid var(--color-grey-200);
104
+ border-radius: 3.6px;
105
+ box-shadow: 1px 1px 1px var(--color-shadow), 0px 0px 1px var(--color-grey-20);
106
+ }
107
+ &::-ms-thumb {
108
+ box-shadow: 1px 1px 1px var(--color-shadow), 0px 0px 1px var(--color-grey-20);
109
+ border: 1px solid var(--color-grey-200);
110
+ height: 36px;
111
+ width: 16px;
112
+ border-radius: var(--border-radius-m, 0);
113
+ background: var(--color-grey-20);
114
+ cursor: pointer;
115
+ }
116
+ &:focus::-ms-fill-lower { background: var(--color-info-500); }
117
+ &:focus::-ms-fill-upper { background: var(--color-info-100); }
118
+ }
119
+ /* <meter> */
120
+
121
+ meter {
122
+ width: 100%;
123
+ height: var(--space-2x);
124
+ background: none; /* Required to get rid of the default background property */
125
+ background-color: var(--color-grey-35);
126
+ border: 1px solid var(--color-grey-200);
127
+ box-shadow: var(--box-inset-shadow-s);
128
+ border-radius: var(--border-radius-s);
129
+ appearance: none;
130
+ margin: calc(var(--space-2x) - 4px) 0 2px;
131
+ position: relative;
132
+ display: block;
133
+ }
134
+
135
+ meter span {
136
+ display: block;
137
+ margin-top: 0;
138
+ position: absolute;
139
+ top: -32px;
140
+ right: 0;
141
+ z-index: 1000;
142
+ background: var(--color-grey-20);
143
+ }
144
+
145
+ meter::-webkit-meter-bar {
146
+ background: none; /* Required to get rid of the default background property */
147
+ background-color: var(--color-grey-50);
148
+ border: 1px solid var(--color-grey-100);
149
+ border-radius: var(--border-radius-s);
150
+ box-shadow: 0 4px 4px -4px var(--color-shadow) inset;
151
+ }
152
+
153
+ meter::-webkit-meter-optimum-value {
154
+ -webkit-transition: width .5s;
155
+ background: var(--color-success-500);
156
+ border-radius: var(--border-radius-s);
157
+ }
158
+
159
+ meter::-webkit-meter-suboptimum-value {
160
+ -webkit-transition: width .5s;
161
+ background: var(--color-warning-500);
162
+ border-radius: var(--border-radius-s);
163
+ }
164
+
165
+ meter::-webkit-meter-even-less-good-value {
166
+ -webkit-transition: width .5s;
167
+ background: var(--color-danger-500);
168
+ border-radius: var(--border-radius-s);
169
+ }
170
+
171
+ meter::-moz-meter-bar {
172
+ border-radius: var(--border-radius-s);
173
+ background: var(--color-success-500);
174
+ }
175
+
176
+ meter::-moz-meter-optimum {
177
+ background: var(--color-success-500);
178
+ }
179
+
180
+ meter::-moz-meter-sub-optimum {
181
+ background: var(--color-warning-500);
182
+ }
183
+
184
+ meter::-moz-meter-sub-sub-optimum {
185
+ background: var(--color-danger-500);
186
+ }
187
+
188
+
189
+ /*components*/
190
+
191
+ .accordion {
192
+ margin: 0;
193
+ padding: 0;
194
+ transition: all ease-in-out 0.3s;
195
+
196
+ & > * + * { box-shadow: 0 -1px 0 0 var(--color-grey-50); }
197
+
198
+ & > button:has(+ [role="region"]) {
199
+ display: block;
200
+ position: relative;
201
+ width: 100%;
202
+ margin: 0;
203
+ background: none;
204
+ border-radius: 0;
205
+ box-shadow: 0 1px 0 0 var(--color-grey-300) inset;
206
+ color: var(--color-grey-700);
207
+ font-size: 1rem;
208
+ font-weight: 400;
209
+ text-align: left;
210
+
211
+ &::after {
212
+ content: "";
213
+ position: absolute;
214
+ right: 2em;
215
+ top: 50%;
216
+ width: 0.5rem;
217
+ height: 0.5rem;
218
+ border: solid var(--color-grey-300);
219
+ border-width: 0 2px 2px 0;
220
+ transform: translateY(-60%) rotate(45deg);
221
+ pointer-events: none;
222
+ transition: transform ease-in-out 0.2s;
223
+ }
224
+
225
+ &:hover,
226
+ &:focus {
227
+ box-shadow: 0 1px 0 0 var(--color-grey-300) inset;
228
+ background: none;
229
+ color: var(--color-grey-900);
230
+ &::after { border-color: var(--color-grey-500); }
231
+ }
232
+
233
+ &[aria-expanded="false"] {
234
+ background: transparent;
235
+ color: inherit;
236
+ }
237
+
238
+ &[aria-expanded="true"] {
239
+ background: transparent;
240
+ box-shadow: 0 1px 0 0 var(--color-grey-300) inset;
241
+ color: inherit;
242
+ &::after {
243
+ transform: translateY(-50%) rotate(-135deg);
244
+ border-color: var(--color-grey-500);
245
+ }
246
+ }
247
+ }
248
+ > [role="region"] {
249
+ margin: 0;
250
+ padding: 1em 1.5em;
251
+ }
252
+ }
253
+ [role="alert"] {
254
+ display: flex;
255
+ align-items: center;
256
+ color: var(--color-grey-600);
257
+ background: var(--color-grey-50);
258
+ border-left: var(--space-1-2) solid var(--color-grey-400);
259
+ border-radius: var(--border-radius-s, 0);
260
+ box-shadow: var(--box-shadow-m);
261
+ padding: calc(var(--space) * 1.5 ) var(--space-3x);
262
+
263
+ &:empty { display: none; }
264
+
265
+ & a:any-link {
266
+ color: inherit;
267
+ text-decoration: underline;
268
+ &:hover { color: var(--color-grey-800); }
269
+ }
270
+
271
+ & p {
272
+ color: inherit;
273
+ font-family: inherit;
274
+ font-size: 1rem;
275
+ padding: 0;
276
+ max-width: none;
277
+ }
278
+
279
+ & + * { margin-top: var(--space-6x); }
280
+
281
+ & > svg {
282
+ width: 24px;
283
+ height: 24px;
284
+ min-width: 24px;
285
+ margin-right: var(--space-3x);
286
+ fill: none;
287
+ stroke: currentColor;
288
+ stroke-width: 2;
289
+ stroke-linecap: round;
290
+ stroke-linejoin: round;
291
+ }
292
+
293
+ &.is-info {
294
+ background: var(--color-info-50);
295
+ color: var(--color-info-600);
296
+ border-color: var(--color-info-100);
297
+ border-left-color: var(--color-info-400);
298
+
299
+ & :any-link:hover { color: var(--color-info-700); }
300
+ & > svg { stroke: var(--color-info-500); }
301
+ }
302
+
303
+ &.is-success {
304
+ background: var(--color-success-50);
305
+ color: var(--color-success-600);
306
+ border-color: var(--color-success-100);
307
+ border-left-color: var(--color-success-400);
308
+
309
+ & :any-link:hover { color: var(--color-success-700); }
310
+ & > svg { stroke: var(--color-success-500); }
311
+ }
312
+
313
+ &.is-error {
314
+ background: var(--color-danger-50);
315
+ color: var(--color-danger-600);
316
+ border-color: var(--color-danger-100);
317
+ border-left-color: var(--color-danger-400);
318
+
319
+ & :any-link:hover { color: var(--color-danger-700); }
320
+ & > svg { stroke: var(--color-danger-500); }
321
+ }
322
+
323
+ &.is-warning {
324
+ background: var(--color-warning-50);
325
+ color: var(--color-warning-600);
326
+ border-color: var(--color-warning-100);
327
+ border-left-color: var(--color-warning-400);
328
+
329
+ & :any-link:hover { color: var(--color-warning-700); }
330
+ & > svg { stroke: var(--color-warning-500); }
331
+ }
332
+
333
+ * + & { margin-top: var(--space-3x); }
334
+ }
335
+ /* components/avatar.css */
336
+ .avatar,
337
+ a.avatar {
338
+ display: block;
339
+ position: relative;
340
+ height: var(--space-5x);
341
+ width: var(--space-5x);
342
+ background: var(--color-grey-50);
343
+ border-radius: 50%;
344
+ box-shadow: 0 0 0 var(--space-1-4) var(--color-bg);
345
+ overflow: hidden;
346
+ text-decoration: none;
347
+ text-align: center;
348
+ line-height: var(--space-5x);
349
+
350
+ &:after {
351
+ content: "";
352
+ position: absolute;
353
+ height: 100%;
354
+ width: 100%;
355
+ border-radius: 50%;
356
+ box-shadow: 0 1px 2px 0 var(--color-shadow) inset;
357
+ }
358
+
359
+ & img {
360
+ margin: 0;
361
+ position: absolute;
362
+ object-fit: cover;
363
+ left: 0;
364
+ height: 100%;
365
+ width: 100%;
366
+ }
367
+
368
+ &.is-large {
369
+ height: var(--space-9x);
370
+ width: var(--space-9x);
371
+ line-height: var(--space-9x);
372
+ }
373
+ }
374
+
375
+ .avatar-group {
376
+ padding: 0;
377
+
378
+ & li {
379
+ list-style-type: none;
380
+ height: var(--space-5x);
381
+
382
+ & + li { margin-left: calc(var(--space) * -1); }
383
+ }
384
+
385
+ & .avatar:hover { z-index: 20; }
386
+ }
387
+ .badge {
388
+ display: inline-block;
389
+ height: var(--space-2x);
390
+ padding: 0 var(--space-1-2);
391
+ position: relative;
392
+ background: var(--color-grey-50);
393
+ border-radius: var(--border-radius-m, 0);
394
+ box-shadow: var(--box-shadow-s);
395
+ color: var(--color-grey-700);
396
+ font-size: var(--font-size-30);
397
+ font-weight: 400;
398
+ line-height: var(--space-2x);
399
+ text-decoration: none;
400
+
401
+ & > svg {
402
+ width: 12px;
403
+ height: 12px;
404
+ min-width: 12px;
405
+ margin: 2px;
406
+ vertical-align: middle;
407
+ }
408
+
409
+ &.is-info {
410
+ background: var(--color-info-50);
411
+ color: var(--color-info-700);
412
+ }
413
+
414
+ &.is-success {
415
+ background: var(--color-success-50);
416
+ color: var(--color-success-700);
417
+ }
418
+
419
+ &.is-error {
420
+ background: var(--color-danger-50);
421
+ color: var(--color-danger-700);
422
+ }
423
+
424
+ &.is-warning {
425
+ background: var(--color-warning-50);
426
+ color: var(--color-warning-700);
427
+ }
428
+ }
429
+ .breadcrumb {
430
+ & ol {
431
+ margin: 0;
432
+ padding-left: 0;
433
+ list-style: none;
434
+ }
435
+ & li {
436
+ display: inline;
437
+ & + li::before {
438
+ content: '';
439
+ display: inline-block;
440
+ margin: 0 var(--space);
441
+ transform: rotate(20deg);
442
+ border-right: 1px solid var(--color-grey-400);
443
+ height: 0.75em;
444
+ }
445
+ &:last-child {
446
+ color: var(--color-grey-700);
447
+ font-weight: 700;
448
+ }
449
+ }
450
+ }
451
+ .carousel {
452
+ display: static;
453
+
454
+ & nav {
455
+ margin: 0;
456
+ padding: 0;
457
+ width: 100%;
458
+ text-align: center;
459
+ height: calc(var(--space) * 6);
460
+ display: block;
461
+ & [role="group"] {
462
+ display: inline-flex;
463
+ flex-direction: row;
464
+ margin: 0 auto;
465
+ width: auto;
466
+ & > * {
467
+ border-radius: 0;
468
+ margin: auto 0 0;
469
+ }
470
+ & > *:first-child { border-radius: var(--border-radius-m, 0) 0 0 var(--border-radius-m, 0); }
471
+ & > *:last-child { border-radius: 0 var(--border-radius-m, 0) var(--border-radius-m, 0) 0; }
472
+ }
473
+ }
474
+ }
475
+
476
+ .carousel__body {
477
+ width: 100%;
478
+ border-radius: 0 0 var(--border-radius-m, 0) var(--border-radius-m, 0);
479
+ }
480
+
481
+ [role="group"][aria-roledescription="slide"] {
482
+ display: none;
483
+ width: 100%;
484
+ &[aria-current="slide"] { display: block; }
485
+ }
486
+
487
+ .slide__image {
488
+ margin: 0;
489
+ padding: 0;
490
+ width: 100%;
491
+ & a {
492
+ margin: 0;
493
+ padding: 0;
494
+ & img {
495
+ margin: 0;
496
+ padding: 0;
497
+ display: block;
498
+ overflow: hidden;
499
+ max-height: 100%;
500
+ max-width: 100%;
501
+ }
502
+ }
503
+ }
504
+
505
+ .slide__body {
506
+ margin: 0;
507
+ padding: var(--space-2x);
508
+ width: 100%;
509
+ text-align: center;
510
+ & p { max-width: 100%; }
511
+ }
512
+ .dialog-backdrop {
513
+ height: 100vh;
514
+ width: 100%;
515
+ position: fixed;
516
+ top: 0;
517
+ left: 0;
518
+ background: var(--color-backdrop);
519
+ z-index: var(--z-40, 90);
520
+ animation: backdrop 0.1s cubic-bezier(0.165, 0.840, 0.440, 1.000);
521
+ -webkit-backdrop-filter: blur(4px);
522
+ backdrop-filter: blur(4px);
523
+ display: flex;
524
+ align-items: center;
525
+ justify-content: center;
526
+ }
527
+
528
+ [role="dialog"],
529
+ [role="alertdialog"] {
530
+ position: relative;
531
+ padding: var(--space-3x);
532
+ background-color: var(--color-grey-20);
533
+ border: 1px solid var(--color-grey-35);
534
+ border-radius: var(--border-radius-m, 0);
535
+ min-width: 480px;
536
+ max-width: 100%;
537
+ max-height: 100vh;
538
+ overflow-y: auto;
539
+ animation: modale 0.5s cubic-bezier(0.165, 0.840, 0.440, 1.000);
540
+
541
+ & > header {
542
+ width: calc(100% + var(--space-6x));
543
+ display: flex;
544
+ align-items: center;
545
+ border-radius: var(--border-radius-m, 0) var(--border-radius-m, 0) 0 0;
546
+ margin: calc(var(--space-3x) * -1) calc(var(--space-3x) * -1) calc(var(--space-3x) * 1);
547
+ padding: calc(var(--space) * 1.5 - 1px) calc(var(--space-3x) - 1px) calc(var(--space) * 1.5 - 1px);
548
+ border-bottom: 1px solid var(--color-grey-50);
549
+ color: var(--color-grey-500);
550
+
551
+ & button { margin-left: auto; }
552
+ }
553
+
554
+ > footer {
555
+ background: var(--color-grey-50);
556
+ width: calc(100% + var(--space-6x));
557
+ border-radius: 0 0 var(--border-radius-m, 0) var(--border-radius-m, 0);
558
+ margin: var(--space-3x) calc(var(--space-3x) * -1) calc(var(--space-3x) * -1);
559
+ padding: calc(var(--space) * 1.5 - 1px) calc(var(--space-3x) - 1px) calc(var(--space) * 1.5 - 1px);
560
+ border-top: 1px solid var(--color-grey-50);
561
+ }
562
+
563
+ @media screen and (min-width: 640px) {
564
+ min-width: 640px;
565
+ min-height: auto;
566
+ box-shadow: var(--box-shadow-l);
567
+ background-color: var(--color-grey-20);
568
+ }
569
+ }
570
+
571
+ @keyframes modale {
572
+ 0% {
573
+ top: -48px;
574
+ opacity: 0;
575
+ }
576
+ 100% {
577
+ top: 0;
578
+ opacity: 1;
579
+ }
580
+ }
581
+
582
+ @keyframes backdrop {
583
+ 0% {
584
+ opacity: 0;
585
+ }
586
+ 100% {
587
+ opacity: 1;
588
+ }
589
+ }
590
+ .grid-auto {
591
+ --gap: var(--space-3x);
592
+ --col-min-width: 240px;
593
+
594
+ display: grid;
595
+ grid-gap: var(--gap);
596
+ grid-template-columns: repeat(auto-fit, minmax(var(--col-min-width), 1fr));
597
+ width: 100%;
598
+ padding: 0;
599
+
600
+ & > * {
601
+ list-style-type: none;
602
+ margin: 0;
603
+ }
604
+
605
+ & * + *,
606
+ & * + .card {
607
+ margin-top: 0;
608
+ }
609
+
610
+ & + * {
611
+ margin-top: var(--space-3x);
612
+ }
613
+ }
614
+ [role="group"] {
615
+ display: flex;
616
+ align-items: flex-end;
617
+ border-radius: var(--border-radius-s, 0);
618
+ border-radius: 4px;
619
+ max-width: 100%;
620
+
621
+ & > * {
622
+ border-radius: 0;
623
+ margin: auto 0 0;
624
+ &.is-small,
625
+ &.is-large {
626
+ border-radius: 0;
627
+ }
628
+ &:first-child { border-radius: var(--border-radius-s, 0) 0 0 var(--border-radius-s, 0); }
629
+ &:last-child { border-radius: 0 var(--border-radius-s, 0) var(--border-radius-s, 0) 0; }
630
+ }
631
+ & > picture {
632
+ border-radius: 0;
633
+ margin: auto 0 0;
634
+ &:first-child,
635
+ &:last-child { border-radius: 0; }
636
+ }
637
+ & > .input {
638
+ margin: auto var(--space) 0 0;
639
+ &:last-child { margin: auto 0 0 0; }
640
+ }
641
+ & > label { margin: 0; }
642
+ &.is-block {
643
+ width: 100%;
644
+ & > * {
645
+ flex: 1;
646
+ }
647
+ }
648
+ }
649
+ .card {
650
+ background: var(--color-grey-20);
651
+ border: 0;
652
+ border-radius: var(--border-radius-s, 0);
653
+ box-shadow: 0 0 0 1px inset var(--color-grey-50), var(--box-shadow-s);
654
+ padding: var(--space-3x);
655
+ list-style-type: none;
656
+ overflow: hidden;
657
+
658
+ & > header {
659
+ display: flex;
660
+ align-items: center;
661
+ min-height: var(--space-6x);
662
+ width: calc(100% + var(--space-6x));
663
+ border-radius: var(--border-radius-m, 0) var(--border-radius-m, 0) 0 0;
664
+ padding: var(--space) var(--space-3x);
665
+ margin: calc(var(--space-3x) * -1) calc(var(--space-3x) * -1) calc(var(--space-3x) * 1);
666
+ box-shadow: 0 1px 0 0 var(--color-grey-50);
667
+ color: var(--color-grey-500);
668
+
669
+ & > * {
670
+ margin: 0 var(--space-1-2);
671
+ padding: 0;
672
+ text-transform: none;
673
+ letter-spacing: 0;
674
+ font-size: var(--font-size-50);
675
+ line-height: var(--space-3x);
676
+ }
677
+ }
678
+
679
+ & > picture {
680
+ margin: calc(var(--space-3x) * -1) calc(var(--space-3x) * -1) calc(var(--space-3x) * 1);
681
+ width: calc(100% + var(--space-6x));
682
+ }
683
+
684
+ & > footer {
685
+ box-shadow: 0 -1px 0 0 var(--color-grey-50);
686
+ border-radius: 0 0 var(--border-radius-m, 0) var(--border-radius-m, 0);
687
+ margin: var(--space-3x) calc(var(--space-3x) * -1) calc(var(--space-3x) * -1);
688
+ padding: var(--space-2x) calc(var(--space-3x) - 1px);
689
+ width: calc(100% + var(--space-6x));
690
+ }
691
+
692
+ & > aside {
693
+ background: var(--color-grey-50);
694
+ min-width: 300px;
695
+ padding: var(--space-3x);
696
+ }
697
+ }
698
+ /* components/menu.css */
699
+
700
+ [role="menu"] {
701
+ text-align: left;
702
+ color: var(--color-grey-500);
703
+ position: relative;
704
+ list-style-type: none;
705
+ margin: 0;
706
+ padding: 6px 0 18px;
707
+ text-transform: none;
708
+ font-size: var(--font-size-50);
709
+ letter-spacing: 0.03em;
710
+ & .menu__title {
711
+ font-weight: 700;
712
+ text-transform: uppercase;
713
+ letter-spacing: 0.1em;
714
+ font-size: var(--font-size-30);
715
+ display: inline-block;
716
+ transform: translateY(2px);
717
+ padding: 0 24px;
718
+ }
719
+ & [role="menu"] {
720
+ margin: 0 0 var(--space-3x, 1em);
721
+ padding: 0;
722
+ }
723
+
724
+ & li[role="menuitem"] {
725
+ display: flex;
726
+ flex-direction: column;
727
+ }
728
+
729
+ & a[role="menuitem"]:not(.button) {
730
+ padding: 0 24px;
731
+ margin: 0;
732
+ font-size: inherit;
733
+ text-decoration: none;
734
+ color: var(--color-grey-700);
735
+ display: flex;
736
+ align-items: center;
737
+ &:hover { color: var(--color-grey-800); }
738
+ &[aria-current="true"] {
739
+ background: var(--color-grey-100);
740
+ color: var(--color-info-700);
741
+ }
742
+ }
743
+
744
+ &.is-horizontal {
745
+ display: flex;
746
+ flex-wrap: wrap;
747
+ gap: var(--space-2x);
748
+ padding: 0;
749
+
750
+ & a[role="menuitem"]:not(.button) {
751
+ padding: 0;
752
+ }
753
+ }
754
+ }
755
+ .menubutton {
756
+ position: relative;
757
+ display: inline-block;
758
+
759
+ & > button,
760
+ & > input[type="submit"],
761
+ & > input[type="button"],
762
+ & > input[type="reset"],
763
+ & > [role="button"],
764
+ & > :any-link[role="button"] {
765
+ position: relative;
766
+ margin: 0;
767
+ &:after {
768
+ content: '';
769
+ margin-left: var(--space-2x);
770
+ display: block;
771
+ box-sizing: border-box;
772
+ width: 0.5em;
773
+ height: 0.5em;
774
+ border-bottom: 2px solid;
775
+ border-right: 2px solid;
776
+ transform: translateY(-0.1em) rotate(45deg);
777
+ transition: all 0.2s ease-in-out;
778
+ }
779
+ &[aria-expanded="true"]:after { transform: translateY(0.1em) rotate(-135deg); }
780
+ }
781
+ & > [role="menu"] {
782
+ position: absolute;
783
+ z-index: 1000;
784
+ top: var(--space-7x);
785
+ left: 0;
786
+ margin: 0;
787
+ padding: var(--space, 0) 0;
788
+ border-radius: var(--border-radius-m, 0);
789
+ width: auto;
790
+ background: var(--color-grey-00);
791
+ box-shadow: var(--box-shadow-l);
792
+ border: 1px solid var(--color-grey-50);
793
+ visibility: hidden;
794
+ opacity: 0;
795
+ transition: all .2s cubic-bezier(0,0.1,0.5,1);
796
+ transform: scaleY(0.833) skewX(2deg);
797
+ transform-origin: 100% 0%;
798
+ &:after,
799
+ &:before {
800
+ bottom: 100%;
801
+ left: var(--space-3x);
802
+ border: solid transparent;
803
+ content: "";
804
+ height: 0;
805
+ width: 0;
806
+ position: absolute;
807
+ pointer-events: none;
808
+ }
809
+ &:after {
810
+ border-color: transparent;
811
+ border-bottom-color: var(--color-grey-00);
812
+ border-width: 6px;
813
+ margin-left: -6px;
814
+ }
815
+ &:before {
816
+ border-color: transparent;
817
+ border-bottom-color: var(--color-grey-50);
818
+ border-width: 8px;
819
+ margin-left: -8px;
820
+ }
821
+ & [role="menuitem"] {
822
+ display: block;
823
+ padding: 0px 16px;
824
+ background: var(--color-grey-00);
825
+ &:hover,
826
+ &:focus {
827
+ background: var(--color-grey-50);
828
+ color: var(--color-grey-700);
829
+ }
830
+ }
831
+ &.is-right {
832
+ left: auto;
833
+ right: 0;
834
+ &:before {
835
+ right: 24px;
836
+ left: auto
837
+ }
838
+ }
839
+ }
840
+ & [aria-expanded="true"] + [role="menu"],
841
+ & > [role="menu"]:focus-within {
842
+ visibility: visible;
843
+ opacity: 1;
844
+ top: var(--space-6x);
845
+ top: var(--space-7x);
846
+ transform: scaleY(1) skewX(0deg);
847
+ }
848
+ }
849
+ ul[role="menubar"] {
850
+ display: flex;
851
+ align-items: center;
852
+ margin: 0;
853
+ padding: 0;
854
+ list-style: none;
855
+ & > li {
856
+ list-style: none;
857
+ margin: 0;
858
+ padding: 0;
859
+ position: relative;
860
+ }
861
+ & [role="separator"] {
862
+ padding-top: 0.15em;
863
+ background-position: center;
864
+ background-repeat: repeat-x;
865
+ }
866
+ & :any-link[role="menuitem"]{
867
+ &:not(.button) {
868
+ display: block;
869
+ padding: var(--space);
870
+ white-space: nowrap;
871
+ }
872
+ &[aria-haspopup="true"] {
873
+ padding-right: 24px;
874
+ &:after {
875
+ grid-area: select;
876
+ content: "";
877
+ width: var(--space);
878
+ height: var(--space-1-2);
879
+ position: absolute;
880
+ right: var(--space);
881
+ top: 20px;
882
+ background-color: var(--color-grey-400);
883
+ clip-path: polygon(100% 0%, 0 0%, 50% 100%);
884
+ }
885
+ }
886
+ }
887
+ & ul[role="menu"] {
888
+ display: none;
889
+ position: absolute;
890
+ z-index: 1000;
891
+ top: var(--space-5x);
892
+ left: var(--space);
893
+ margin: 0;
894
+ min-width: 180px;
895
+ padding: var(--space) 0;
896
+ border-radius: var(--border-radius-m, 0);
897
+ width: auto;
898
+ background: var(--color-grey-20);
899
+ box-shadow: var(--box-shadow-m, none);
900
+ border: 1px solid var(--color-grey-50);
901
+
902
+ &:before {
903
+ content: "";
904
+ position: absolute;
905
+ bottom: 100%;
906
+ left: var(--space-3x);
907
+ margin-left: -6px;
908
+ border-width: 6px;
909
+ border-style: solid;
910
+ border-color: transparent transparent var(--color-grey-50) transparent;
911
+ }
912
+ & li :any-link[role="menuitem"] {
913
+ display: block;
914
+ padding: 0 var(--space-2x);
915
+ background: var(--color-grey-20);
916
+ &:hover,
917
+ &:focus {
918
+ background: var(--color-grey-50);
919
+ }
920
+ }
921
+ }
922
+ & :any-link[role="menuitem"][aria-haspopup="true"]:hover ~ ul[role="menu"],
923
+ & ul[role="menu"]:hover {
924
+ display: block;
925
+ }
926
+ }
927
+
928
+
929
+
930
+
931
+ .slider {
932
+ position: relative;
933
+ cursor: pointer;
934
+ display: inline-block;
935
+ width: calc(var(--space-4x) - 2px);
936
+ height: calc(var(--space-2x) - 2px);
937
+ background-color: var(--color-grey-00);
938
+ box-shadow: 0 0 0 1px var(--color-grey-200),
939
+ var(--box-inset-shadow-s);
940
+ border-radius: var(--space);
941
+ margin-left: var(--space);
942
+ transition: .3s;
943
+
944
+ &::before {
945
+ position: absolute;
946
+ content: "";
947
+ height: 8px;
948
+ width: 8px;
949
+ border-radius: 4px;
950
+ left: 3px;
951
+ bottom: 3px;
952
+ background-color: var(--color-grey-300);
953
+ box-shadow: var(--box-shadow-m);
954
+ transition: .3s;
955
+ }
956
+ }
957
+
958
+ .switch {
959
+ position: relative;
960
+ display: flex;
961
+ width: auto;
962
+ line-height: 40px;
963
+ text-align: center;
964
+ padding: 0 24px 0 24px;
965
+
966
+ &:focus {
967
+ color: var(--color-grey-700);
968
+ outline: 2px solid var(--color-info-200);
969
+ }
970
+
971
+ &[aria-pressed="true"] {
972
+ & .slider {
973
+ background: var(--color-info-100);
974
+ box-shadow: 0 0 0 1px var(--color-info-400);
975
+
976
+ &::before {
977
+ transform: translateX(var(--space-2x));
978
+ background-color: var(--color-info-500);
979
+ }
980
+ }
981
+ }
982
+ }
983
+ [role="tablist"] {
984
+ display: flex;
985
+ box-shadow: 0 1px 0 0 var(--color-grey-100);
986
+ padding: 0;
987
+ margin: 0 0 -1px;
988
+ }
989
+
990
+ [role="tab"] {
991
+ padding: calc(var(--space) - 1px) var(--space-3x) calc(var(--space-2x) + 1px);
992
+ color: var(--color-grey-500);
993
+ cursor: pointer;
994
+ border: 0;
995
+ border-radius: var(--border-radius-m, 0) var(--border-radius-m, 0) 0 0;
996
+ list-style-type: none;
997
+ margin-bottom: 2px;
998
+ &:hover { color: var(--color-grey-600); }
999
+ &[aria-selected="true"],
1000
+ &[aria-selected="true"]:hover {
1001
+ cursor: default;
1002
+ background: var(--color-grey-20);
1003
+ color: var(--color-info-600);
1004
+ box-shadow:
1005
+ 0 2px 0 0 var(--color-grey-20),
1006
+ 0 0 0 1px var(--color-grey-100);
1007
+ }
1008
+ }
1009
+
1010
+ [role="tabpanel"] {
1011
+ padding: var(--space-3x);
1012
+ background: var(--color-grey-20);
1013
+ border: 0;
1014
+ box-shadow: 0 -1px 0 0 var(--color-grey-100);
1015
+ &[aria-hidden="true"] { display: none; }
1016
+ }
1017
+ [role="toolbar"] {
1018
+ display: inline-flex;
1019
+ align-items: center;
1020
+ padding: 0;
1021
+ position: relative;
1022
+ border-radius: 0;
1023
+ & > * {
1024
+ margin: 0 var(--space-2x) 0 0;
1025
+ &:last-child { margin: 0; }
1026
+ }
1027
+ & nav {
1028
+ margin: 0 0 0 auto;
1029
+ display: flex;
1030
+ align-items: center;
1031
+
1032
+ & > * { margin: 0 0 0 var(--space-2x); }
1033
+ }
1034
+ }
1035
+ input[type='checkbox'].is-switch {
1036
+ width: 32px;
1037
+ border-radius: 11px;
1038
+ background: var(--color-grey-20);
1039
+
1040
+ &::after {
1041
+ opacity: 1;
1042
+ left: 2px;
1043
+ top: 2px;
1044
+ border-radius: 50%;
1045
+ width: 10px;
1046
+ height: 10px;
1047
+ background: var(--color-grey-300);
1048
+ transform: translateX(var(--x, 0));
1049
+ border: 0;
1050
+ }
1051
+ &:checked {
1052
+ background: var(--color-info-500);
1053
+ --x: var(--space-2x);
1054
+ &::after {
1055
+ background: var(--color-grey-00);
1056
+ }
1057
+ }
1058
+ &:disabled:not(:checked) { background: var(--color-grey-200); }
1059
+ }
1060
+
1061
+ /* Aria states last loaded */
1062
+ /* design_tokens/states.css */
1063
+
1064
+ *[hidden=true] {
1065
+ display: none;
1066
+ }
1067
+
1068
+ /* hide visually but make it available to assistive technology. */
1069
+ .sr-only {
1070
+ border: 0 !important;
1071
+ clip: rect(1px, 1px, 1px, 1px) !important;
1072
+ -webkit-clip-path: inset(50%) !important;
1073
+ clip-path: inset(50%) !important;
1074
+ height: 1px !important;
1075
+ overflow: hidden !important;
1076
+ padding: 0 !important;
1077
+ position: absolute !important;
1078
+ width: 1px !important;
1079
+ white-space: nowrap !important;
1080
+ }
1081
+
1082
+ /* vendors */
1083
+ /* PRISM JS */
1084
+ code[class*="language-"],
1085
+ pre[class*="language-"] {
1086
+ color: var(--color-grey-500);
1087
+ background: var(--color-grey-50);
1088
+ text-shadow: none;
1089
+ font-family: var(--font-mono);
1090
+ font-size: 1rem;
1091
+ line-height: inherit;
1092
+ text-align: left;
1093
+ word-spacing: normal;
1094
+ word-wrap: normal;
1095
+ word-break: break-word;
1096
+ overflow: hidden;
1097
+ tab-size: 4;
1098
+ -webkit-hyphens: none;
1099
+ -moz-hyphens: none;
1100
+ -ms-hyphens: none;
1101
+ hyphens: none;
1102
+
1103
+ &::-moz-selection,
1104
+ &::selection {
1105
+ text-shadow: none;
1106
+ background: var(--color-info-100);
1107
+ }
1108
+
1109
+ @media print { text-shadow: none; }
1110
+ }
1111
+
1112
+ pre[class*="language-"] {
1113
+ padding: calc(var(--space) * 1 - 1px) 0 calc(var(--space) * 2 + 1px);
1114
+ margin: 0;
1115
+ overflow: auto;
1116
+ }
1117
+
1118
+ :not(pre) > code[class*="language-"],
1119
+ pre[class*="language-"] {
1120
+ background: var(--color-grey-50);
1121
+ padding: var(--space-3x);
1122
+ }
1123
+
1124
+ :not(pre) > code[class*="language-"] {
1125
+ padding: 0 var(--space-1-2, 0);
1126
+ border-radius: var(--border-radius-m, 0);
1127
+ white-space: normal;
1128
+ }
1129
+
1130
+ .token {
1131
+ &.comment,
1132
+ &.prolog,
1133
+ &.doctype,
1134
+ &.cdata {
1135
+ color: var(--color-grey-300);
1136
+ font-style: italic;
1137
+ opacity: 1;
1138
+ }
1139
+
1140
+ &.punctuation { color: var(--color-grey-400); }
1141
+
1142
+ &.namespace { opacity: .7; }
1143
+
1144
+ &.property,
1145
+ &.tag,
1146
+ &.boolean,
1147
+ &.number,
1148
+ &.constant,
1149
+ &.symbol,
1150
+ &.deleted {
1151
+ color: var(--color-danger-500);
1152
+ }
1153
+
1154
+ &.constant { color: var(--color-warning-500); }
1155
+
1156
+ &.selector,
1157
+ &.attr-name,
1158
+ &.string,
1159
+ &.char,
1160
+ &.builtin,
1161
+ &.inserted {
1162
+ color: var(--color-cyan-500);
1163
+ }
1164
+
1165
+ &.attr-name { color: var(--color-info-500); }
1166
+
1167
+ &.operator,
1168
+ &.entity,
1169
+ &.url,
1170
+ .language-css &.string,
1171
+ .style &.string {
1172
+ color: var(--color-grey-500);
1173
+ background: transparent;
1174
+ }
1175
+
1176
+ &.operator { color: var(--color-purple-500); }
1177
+
1178
+ &.atrule,
1179
+ &.keyword {
1180
+ color: var(--color-fuschia-500);
1181
+ }
1182
+
1183
+ &.attr-value {
1184
+ color: var(--color-cyan-500);
1185
+ }
1186
+
1187
+ &.function,
1188
+ &.class-name {
1189
+ color: var(--color-info-500);
1190
+ }
1191
+
1192
+ &.regex,
1193
+ &.important,
1194
+ &.variable {
1195
+ color: var(--color-warning-500);
1196
+ }
1197
+
1198
+ &.important,
1199
+ &.bold {
1200
+ font-weight: 700;
1201
+ }
1202
+
1203
+ &.italic { font-style: italic; }
1204
+
1205
+ &.entity { cursor: help; }
1206
+ }