@stackoverflow/stacks 0.70.0 → 0.73.1

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 (45) hide show
  1. package/README.md +1 -1
  2. package/dist/css/stacks.css +1742 -681
  3. package/dist/css/stacks.min.css +1 -1
  4. package/dist/js/stacks.js +167 -92
  5. package/dist/js/stacks.min.js +1 -1
  6. package/lib/css/atomic/_stacks-borders.less +18 -0
  7. package/lib/css/atomic/_stacks-flex.less +2 -7
  8. package/lib/css/atomic/_stacks-grid.less +2 -0
  9. package/lib/css/atomic/_stacks-misc.less +6 -2
  10. package/lib/css/atomic/_stacks-typography.less +23 -8
  11. package/lib/css/base/_stacks-configuration-dynamic.less +5 -15
  12. package/lib/css/components/_stacks-activity-indicator.less +26 -2
  13. package/lib/css/components/_stacks-avatars.less +9 -0
  14. package/lib/css/components/_stacks-badges.less +18 -6
  15. package/lib/css/components/_stacks-breadcrumbs.less +2 -0
  16. package/lib/css/components/_stacks-button-groups.less +11 -0
  17. package/lib/css/components/_stacks-buttons.less +111 -10
  18. package/lib/css/components/_stacks-cards.less +9 -13
  19. package/lib/css/components/_stacks-code-blocks.less +1 -1
  20. package/lib/css/components/_stacks-inputs.less +78 -9
  21. package/lib/css/components/_stacks-link-previews.less +7 -3
  22. package/lib/css/components/_stacks-links.less +25 -2
  23. package/lib/css/components/_stacks-menu.less +4 -4
  24. package/lib/css/components/_stacks-modals.less +1 -1
  25. package/lib/css/components/_stacks-navigation.less +18 -0
  26. package/lib/css/components/_stacks-notices.less +40 -3
  27. package/lib/css/components/_stacks-page-titles.less +1 -1
  28. package/lib/css/components/_stacks-pagination.less +4 -2
  29. package/lib/css/components/_stacks-popovers.less +22 -2
  30. package/lib/css/components/_stacks-post-summary.less +134 -3
  31. package/lib/css/components/_stacks-progress-bars.less +29 -6
  32. package/lib/css/components/_stacks-prose.less +16 -2
  33. package/lib/css/components/_stacks-tables.less +10 -6
  34. package/lib/css/components/_stacks-tags.less +22 -19
  35. package/lib/css/components/_stacks-toggle-switches.less +12 -0
  36. package/lib/css/components/_stacks-topbar.less +440 -0
  37. package/lib/css/components/_stacks-uploader.less +22 -0
  38. package/lib/css/components/_stacks-widget-static.less +15 -3
  39. package/lib/css/exports/_stacks-constants-colors.less +443 -35
  40. package/lib/css/exports/_stacks-constants-helpers.less +1 -2
  41. package/lib/css/exports/_stacks-mixins.less +26 -0
  42. package/lib/css/stacks-dynamic.less +0 -1
  43. package/lib/css/stacks-static.less +15 -0
  44. package/lib/ts/controllers/s-tooltip.ts +4 -0
  45. package/package.json +15 -12
@@ -11,7 +11,6 @@
11
11
  // ----------------------------------------------------------------------------
12
12
 
13
13
  #stacks-internals #responsify('.d-block', { display: block !important; });
14
- @media print { .print\:d-block { display: block !important; } }
15
14
  #stacks-internals #responsify('.d-flex', { display: flex !important; });
16
15
  #stacks-internals #responsify('.d-inline-flex', { display: inline-flex !important; });
17
16
  #stacks-internals #responsify('.d-grid', { display: grid !important; });
@@ -21,7 +20,6 @@
21
20
  .d-table { display: table !important; }
22
21
  .d-table-cell { display: table-cell !important; }
23
22
  #stacks-internals #responsify('.d-none', { display: none !important; });
24
- @media print { .print\:d-none { display: none !important; } }
25
23
  .d-unset { display: unset !important; }
26
24
 
27
25
  // ============================================================================
@@ -336,3 +334,9 @@
336
334
  // -- Delays
337
335
  .t-delay { transition-delay: 0.25s !important; }
338
336
  .t-delay-unset { transition-delay: 0s !important; }
337
+
338
+ // ============================================================================
339
+ // $ TABLE LAYOUT
340
+ // ----------------------------------------------------------------------------
341
+ .tl-fixed { table-layout: fixed !important; }
342
+ .tl-auto { table-layout: auto !important; }
@@ -63,7 +63,7 @@ p {
63
63
  &.has-border {
64
64
  width: 100%;
65
65
  padding: @su4 0;
66
- border-top: 1px solid var(--black-100);
66
+ border-top: 1px solid var(--bc-medium);
67
67
  }
68
68
  }
69
69
 
@@ -194,11 +194,6 @@ p {
194
194
  .wb-unset { word-break: unset !important; }
195
195
 
196
196
  // -- Overflow Wrap
197
- // This property will create a line break only if an entire word cannot be
198
- // placed on its own line without overflowing. This was formerly called
199
- // word-wrap, which was an unprefixed Microsoft vendor property implemented
200
- // by most browsers. Word-wrap is still a supported alias, but can be removed
201
- // once we no longer support IE11.
202
197
  .ow-normal {
203
198
  overflow-wrap: normal !important;
204
199
  word-wrap: normal !important;
@@ -224,8 +219,6 @@ p {
224
219
  word-wrap: unset !important;
225
220
  }
226
221
 
227
- .ww-break-word { word-wrap: break-word !important; }
228
-
229
222
  // -- Hyphenation
230
223
  .hyphens-none { hyphens: none !important; }
231
224
  .hyphens-auto {
@@ -235,9 +228,31 @@ p {
235
228
  }
236
229
  .hyphens-unset { hyphens: unset !important; }
237
230
 
231
+ // -- Break word
232
+ .break-word {
233
+ word-break: break-word !important;
234
+ word-wrap: break-word !important;
235
+ overflow-wrap: break-word !important;
236
+ -webkit-hyphens: auto !important;
237
+ -moz-hyphens: auto !important;
238
+ -ms-hyphens: auto !important;
239
+ hyphens: auto !important;
240
+ }
241
+
238
242
  // ============================================================================
239
243
  // $ LISTS
240
244
  // ----------------------------------------------------------------------------
245
+ ul,
246
+ ol {
247
+ padding: 0;
248
+ margin-left: 2.8em;
249
+
250
+ ul,
251
+ ol {
252
+ margin-bottom: 0;
253
+ }
254
+ }
255
+
241
256
  .list-reset {
242
257
  list-style: none;
243
258
  margin: 0;
@@ -74,27 +74,17 @@
74
74
 
75
75
  // DEPRECATED will be removed in a future release
76
76
  // Tags
77
- @tags-border: transparent;
78
- @tags-background: var(--powder-100);
79
- @tags-color: var(--powder-700);
80
- @tags-hover-border: transparent;
81
- @tags-hover-background: var(--powder-200);
82
- @tags-hover-color: var(--powder-800);
83
- @tags-selected-border: transparent;
84
- @tags-selected-background: var(--powder-400);
85
- @tags-selected-color: var(--powder-900);
86
-
87
- @tags-moderator-border: var(--red-100);
77
+ @tags-moderator-border: var(--red-200);
88
78
  @tags-moderator-background: var(--red-050);
89
- @tags-moderator-color: var(--red-600);
90
- @tags-moderator-hover-border: var(--red-200);
79
+ @tags-moderator-color: var(--red-800);
80
+ @tags-moderator-hover-border: var(--red-300);
91
81
  @tags-moderator-hover-background: var(--red-100);
92
- @tags-moderator-hover-color: var(--red-700);
82
+ @tags-moderator-hover-color: var(--red-900);
93
83
  @tags-moderator-selected-border: var(--red-400);
94
84
  @tags-moderator-selected-background: var(--red-200);
95
85
  @tags-moderator-selected-color: var(--red-800);
96
86
 
97
- @tags-required-border: var(--black-200);
87
+ @tags-required-border: var(--bc-darker);
98
88
  @tags-required-background: var(--black-075);
99
89
  @tags-required-color: var(--black-700);
100
90
  @tags-required-hover-border: var(--black-300);
@@ -13,9 +13,33 @@
13
13
 
14
14
  .s-activity-indicator {
15
15
  display: inline-block;
16
- width: @su12;
16
+ min-width: @su12;
17
17
  height: @su12;
18
+ padding-left: @su4;
19
+ padding-right: @su4;
20
+ line-height: 1.1; // Custom line-height to satisfy 1x screens
18
21
  background-color: var(--theme-secondary-400);
19
22
  box-shadow: 0 0 0 @su4 var(--focus-ring);
20
- border-radius: 100%;
23
+ border-radius: 1000px;
24
+ font-size: @fs-fine;
25
+ font-weight: 600;
26
+ color: @white;
27
+ text-transform: uppercase;
28
+
29
+ .highcontrast-mode({ color: var(--white); });
30
+ }
31
+
32
+ .s-activity-indicator__success {
33
+ background-color: var(--green-500);
34
+ box-shadow: 0 0 0 @su4 var(--focus-ring-success);
35
+ }
36
+
37
+ .s-activity-indicator__warning {
38
+ background-color: var(--yellow-600);
39
+ box-shadow: 0 0 0 @su4 var(--focus-ring-warning);
40
+ }
41
+
42
+ .s-activity-indicator__danger {
43
+ background-color: var(--red-500);
44
+ box-shadow: 0 0 0 @su4 var(--focus-ring-error);
21
45
  }
@@ -26,6 +26,15 @@
26
26
  background-size: 100%;
27
27
  vertical-align: bottom; // Make our avatars play more nicely with text next to it.
28
28
 
29
+ .highcontrast-mode({
30
+ background-color: var(--black);
31
+ box-shadow: 0 0 0 1px var(--black);
32
+
33
+ .s-avatar--letter {
34
+ color: var(--white);
35
+ }
36
+ });
37
+
29
38
  .s-avatar--letter {
30
39
  display: block; // Make sure we're treating the letter as a block-level element
31
40
  color: @white; // Force a light appearance of text rendering
@@ -20,10 +20,6 @@
20
20
  border-color: @border;
21
21
  background-color: @background;
22
22
  color: @color;
23
-
24
- .s-tag--dismiss {
25
- background-color: transparent;
26
- }
27
23
  }
28
24
 
29
25
  // ===========================================================================
@@ -46,7 +42,7 @@
46
42
  vertical-align: middle;
47
43
  white-space: nowrap;
48
44
 
49
- .badge-styles(var(--black-100), var(--black-050), var(--black-700));
45
+ .badge-styles(var(--bc-medium), var(--black-050), var(--black-700));
50
46
 
51
47
  a&:hover {
52
48
  text-decoration: none;
@@ -93,6 +89,14 @@
93
89
  .s-badge__bronze {
94
90
  .badge-styles(var(--bronze-darker), var(--bronze-lighter), var(--black-700));
95
91
  }
92
+ .s-badge__gold,
93
+ .s-badge__silver,
94
+ .s-badge__bronze {
95
+ .highcontrast-mode({
96
+ border-color: currentColor;
97
+ color: var(--black-900);
98
+ });
99
+ }
96
100
 
97
101
  // $$ Number Counts
98
102
  // ---------------------------------------------------------------------------
@@ -101,15 +105,19 @@
101
105
  }
102
106
  .s-badge__votes {
103
107
  .badge-styles(var(--black-150), var(--white), var(--black-700));
108
+
109
+ .highcontrast-mode({ border-color: currentColor; });
104
110
  }
105
111
  .s-badge__answered {
106
112
  .badge-styles(transparent, var(--green-400), var(--white));
107
113
  }
108
114
  .s-badge__rep {
109
115
  .badge-styles(var(--green-400), var(--white), var(--green-500));
116
+ .highcontrast-mode({ border-color: currentColor; });
110
117
  }
111
118
  .s-badge__rep-down {
112
119
  .badge-styles(var(--red-400), var(--white), var(--red-500));
120
+ .highcontrast-mode({ border-color: currentColor; });
113
121
  }
114
122
  .s-badge__important {
115
123
  .badge-styles(transparent, var(--red-600), var(--white));
@@ -119,9 +127,11 @@
119
127
  // ---------------------------------------------------------------------------
120
128
  .s-badge__admin {
121
129
  .badge-styles(var(--theme-primary-200), var(--theme-primary-075), var(--theme-primary-800));
130
+ .highcontrast-mode({ border-color: currentColor; });
122
131
  }
123
132
  .s-badge__moderator {
124
133
  .badge-styles(var(--theme-secondary-200), var(--theme-secondary-075), var(--theme-secondary-800));
134
+ .highcontrast-mode({ border-color: currentColor; });
125
135
 
126
136
  &:before {
127
137
  --s-badge-moderator-icon: url("data:image/svg+xml,%3Csvg width='12' height='14' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5.528.746c.257-.329.675-.327.93 0l4.42 5.66c.258.329.257.864 0 1.192l-4.42 5.66c-.256.328-.674.327-.93 0l-4.42-5.66c-.257-.329-.256-.865 0-1.192l4.42-5.66z' fill='%23fff'/%3E%3C/svg%3E");
@@ -157,9 +167,11 @@
157
167
  margin-top: 0;
158
168
  }
159
169
  }
170
+
160
171
  .s-badge__staff {
161
172
  // Staff badges are always "Stack Overflow Orange"
162
- .badge-styles(var(--orange-200), var(--orange-100), var(--orange-900));
173
+ .badge-styles(var(--orange-300), var(--orange-100), var(--orange-900));
174
+ .highcontrast-mode({ border-color: currentColor; });
163
175
  }
164
176
 
165
177
  // $$ Award Count
@@ -26,6 +26,8 @@
26
26
  margin-right: @su4;
27
27
  margin-left: @su4;
28
28
 
29
+ .highcontrast-mode({ color: var(--black-350); });
30
+
29
31
  #stacks-internals #screen-sm({
30
32
  margin-right: @su2;
31
33
  margin-left: @su2;
@@ -48,6 +48,17 @@
48
48
  z-index: @zi-selected;
49
49
  }
50
50
 
51
+ .highcontrast-mode({
52
+ &.is-selected {
53
+ background-color: var(--black-400);
54
+ color: var(--white);
55
+
56
+ .s-btn--number {
57
+ color: var(--black);
58
+ }
59
+ }
60
+ });
61
+
51
62
  &:active {
52
63
  z-index: @zi-active;
53
64
  }
@@ -34,6 +34,14 @@
34
34
  cursor: pointer;
35
35
  user-select: none;
36
36
 
37
+ .highcontrast-mode({
38
+ border-color: currentColor;
39
+
40
+ &:not(.s-btn__link):not(.s-btn__unset) {
41
+ text-decoration: none;
42
+ }
43
+ });
44
+
37
45
  button &,
38
46
  button[type="submit"] &,
39
47
  button[type="reset"] & {
@@ -150,6 +158,8 @@
150
158
  font-size: @fs-caption;
151
159
  line-height: @lh-xs;
152
160
  background-color: currentColor;
161
+
162
+ .highcontrast-mode({ opacity: 0.8; });
153
163
  }
154
164
 
155
165
  .s-btn--number {
@@ -159,7 +169,8 @@
159
169
 
160
170
  .s-btn__primary:not(.is-selected) .s-btn--number,
161
171
  .s-btn__danger.s-btn__filled:not(.is-selected) .s-btn--number {
162
- .dark-mode({ color: @black; });
172
+ .dark-mode({ color: var(--white); });
173
+ .highcontrast-mode({ color: var(--black); });
163
174
  }
164
175
 
165
176
  // ============================================================================
@@ -201,6 +212,12 @@
201
212
  box-shadow: none;
202
213
  }
203
214
 
215
+ &:focus {
216
+ .highcontrast-mode({
217
+ box-shadow: 0 0 0 @su4 var(--focus-ring);
218
+ });
219
+ }
220
+
204
221
  &.is-selected {
205
222
  color: var(--theme-button-filled-selected-color);
206
223
  background-color: var(--theme-button-filled-selected-background-color);
@@ -216,6 +233,12 @@
216
233
  #stacks-internals #load-config();
217
234
  color: @button-muted-color;
218
235
 
236
+ .highcontrast-mode({
237
+ &.s-btn__filled {
238
+ border-color: transparent;
239
+ }
240
+ });
241
+
219
242
  &:hover,
220
243
  &:focus,
221
244
  &:active {
@@ -258,6 +281,16 @@
258
281
 
259
282
  .dark-mode({ box-shadow: none; });
260
283
 
284
+ .highcontrast-mode({
285
+ background-color: var(--black-400);
286
+ border-color: transparent;
287
+ color: var(--white);
288
+
289
+ .s-btn--number {
290
+ color: var(--black);
291
+ }
292
+ });
293
+
261
294
  &:hover,
262
295
  &:focus,
263
296
  &:active {
@@ -272,6 +305,7 @@
272
305
 
273
306
  &:focus {
274
307
  box-shadow: 0 0 0 @su4 var(--focus-ring-muted);
308
+ .highcontrast-mode({ box-shadow: 0 0 0 @su4 var(--focus-ring-muted); });
275
309
  }
276
310
 
277
311
  &.is-selected {
@@ -279,6 +313,14 @@
279
313
  background-color: @button-muted-filled-selected-background-color;
280
314
  box-shadow: none;
281
315
 
316
+ .highcontrast-mode({
317
+ background-color: var(--black-700);
318
+
319
+ .s-btn--number {
320
+ color: var(--black);
321
+ }
322
+ });
323
+
282
324
  &:focus {
283
325
  box-shadow: 0 0 0 @su4 var(--focus-ring-muted);
284
326
  }
@@ -293,6 +335,12 @@
293
335
  #stacks-internals #load-config();
294
336
  color: @button-danger-color;
295
337
 
338
+ .highcontrast-mode({
339
+ &.s-btn__filled {
340
+ border-color: transparent;
341
+ }
342
+ });
343
+
296
344
  &:hover,
297
345
  &:focus,
298
346
  &:active {
@@ -306,6 +354,7 @@
306
354
 
307
355
  &:focus {
308
356
  box-shadow: 0 0 0 @su4 var(--focus-ring-error);
357
+ .highcontrast-mode({ box-shadow: 0 0 0 @su4 var(--focus-ring-error); });
309
358
  }
310
359
 
311
360
  &.is-selected {
@@ -335,6 +384,18 @@
335
384
 
336
385
  .dark-mode({ box-shadow: none; });
337
386
 
387
+ .highcontrast-mode({
388
+ color: var(--white);
389
+
390
+ &:focus {
391
+ box-shadow: 0 0 0 @su4 var(--focus-ring-error);
392
+ }
393
+
394
+ .s-btn--number {
395
+ color: var(--black);
396
+ }
397
+ });
398
+
338
399
  &:hover,
339
400
  &:focus,
340
401
  &:active {
@@ -359,6 +420,11 @@
359
420
  &:focus {
360
421
  box-shadow: 0 0 0 @su4 var(--focus-ring-error);
361
422
  }
423
+ .highcontrast-mode({
424
+ .s-btn--number {
425
+ color: var(--black);
426
+ }
427
+ });
362
428
  }
363
429
 
364
430
  .s-btn--number {
@@ -375,7 +441,19 @@
375
441
  background-color: var(--theme-button-primary-background-color);
376
442
  box-shadow: inset 0 1px 0 0 hsla(0, 0%, 100%, 0.4);
377
443
 
378
- .dark-mode({ box-shadow: none; });
444
+ .dark-mode({
445
+ box-shadow: none;
446
+
447
+ &:not(.is-selected) {
448
+ color: var(--black);
449
+ }
450
+ });
451
+ .highcontrast-mode({
452
+ &:not(.is-selected) {
453
+ border-color: transparent;
454
+ color: var(--white);
455
+ }
456
+ });
379
457
 
380
458
  &:hover,
381
459
  &:focus,
@@ -389,6 +467,12 @@
389
467
  box-shadow: none;
390
468
  }
391
469
 
470
+ &:focus {
471
+ .highcontrast-mode({
472
+ box-shadow: 0 0 0 @su4 var(--focus-ring);
473
+ });
474
+ }
475
+
392
476
  &.is-selected {
393
477
  color: var(--theme-button-primary-selected-color);
394
478
  background-color: var(--theme-button-primary-selected-background-color);
@@ -403,22 +487,25 @@
403
487
  // $ MISC STYLES
404
488
  // ============================================================================
405
489
  .s-btn__google {
406
- border-color: var(--black-100);
490
+ border-color: var(--bc-medium);
407
491
  background-color: var(--white);
408
492
  color: var(--black-700);
409
493
 
410
494
  &:hover,
411
495
  &:focus {
412
- border-color: var(--black-150);
496
+ border-color: var(--bc-darker);
413
497
  background-color: var(--black-025);
414
498
  color: var(--black-800);
415
499
  }
416
500
 
417
501
  &:active {
418
- border-color: var(--black-200);
419
502
  background-color: var(--black-050);
420
503
  color: var(--black-900);
421
504
  }
505
+
506
+ &:focus {
507
+ box-shadow: 0 0 0 @su4 var(--focus-ring-muted);
508
+ }
422
509
  }
423
510
 
424
511
  .s-btn__facebook {
@@ -426,6 +513,8 @@
426
513
  background-color: #385499;
427
514
  color: #fff;
428
515
 
516
+ .highcontrast-mode({ border-color: transparent; });
517
+
429
518
  &:hover,
430
519
  &:focus {
431
520
  background-color: darken(#385499, 5%);
@@ -442,6 +531,8 @@
442
531
  background-color: var(--black-750);
443
532
  color: var(--white);
444
533
 
534
+ .highcontrast-mode({ border-color: transparent; });
535
+
445
536
  &:hover,
446
537
  &:focus {
447
538
  background-color: var(--black-800);
@@ -452,11 +543,16 @@
452
543
  background-color: var(--black-900);
453
544
  color: var(--white);
454
545
  }
546
+
547
+ &:focus {
548
+ box-shadow: 0 0 0 @su4 var(--focus-ring-muted);
549
+ }
455
550
  }
456
551
 
457
552
  .s-btn__unset,
458
553
  .s-btn__unset:hover,
459
- .s-btn__unset:active {
554
+ .s-btn__unset:active,
555
+ .s-btn__unset:focus {
460
556
  padding: 0;
461
557
  border: none;
462
558
  outline: none;
@@ -469,10 +565,6 @@
469
565
  user-select: auto;
470
566
  }
471
567
 
472
- .s-btn__unset:focus {
473
- color: unset;
474
- }
475
-
476
568
  .s-btn__link {
477
569
  display: inline;
478
570
  padding: 0;
@@ -491,6 +583,15 @@
491
583
  &:focus,
492
584
  &[disabled] {
493
585
  background: none;
586
+ box-shadow: none;
587
+ }
588
+
589
+ &.s-btn__dropdown {
590
+ padding-right: 0.9em;
591
+
592
+ &:after {
593
+ right: 0;
594
+ }
494
595
  }
495
596
  }
496
597
 
@@ -15,7 +15,7 @@
15
15
  // ----------------------------------------------------------------------------
16
16
  .s-card {
17
17
  padding: @su12;
18
- border: 1px solid var(--black-100);
18
+ border: 1px solid var(--bc-medium);
19
19
  border-radius: @br-sm;
20
20
  background-color: var(--white);
21
21
 
@@ -24,25 +24,21 @@
24
24
  }
25
25
  }
26
26
 
27
- // ============================================================================
28
- // $ LINKED CARDS
29
- // ----------------------------------------------------------------------------
30
- a.s-card:not(.s-card__muted) {
31
- &:hover,
32
- &:focus,
33
- &:active {
34
- border-color: var(--black-200);
35
- }
36
- }
37
-
38
27
  // ============================================================================
39
28
  // $ MODIFIERS
40
29
  // ----------------------------------------------------------------------------
41
30
  .s-card__muted {
42
- border-color: var(--black-075);
31
+ border-color: var(--bc-light);
43
32
 
44
33
  // Dim only the first child card content
45
34
  > * {
46
35
  opacity: 0.65;
47
36
  }
48
37
  }
38
+
39
+ // ============================================================================
40
+ // $ LINKED CARDS
41
+ // ----------------------------------------------------------------------------
42
+ a.s-card {
43
+ text-decoration: none !important;
44
+ }
@@ -115,7 +115,7 @@ pre.s-code-block .s-code-block--line-numbers {
115
115
  text-align: right;
116
116
  border-width: 0;
117
117
  border-style: solid;
118
- border-color: var(--black-100);
118
+ border-color: var(--bc-medium);
119
119
  border-right-width: 1px;
120
120
  margin: -@su12;
121
121
  margin-right: @su12;