@akonwi/mica 0.1.1 → 0.2.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.
- package/README.md +2 -2
- package/mica.css +119 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -28,7 +28,7 @@ form validation) comes from the browser, not from a runtime.
|
|
|
28
28
|
first-class distribution channel, not a workaround:
|
|
29
29
|
|
|
30
30
|
```sh
|
|
31
|
-
curl -O https://raw.githubusercontent.com/akonwi/mica/v0.1
|
|
31
|
+
curl -O https://raw.githubusercontent.com/akonwi/mica/v0.2.1/mica.css
|
|
32
32
|
```
|
|
33
33
|
|
|
34
34
|
**npm** — for toolchains:
|
|
@@ -44,7 +44,7 @@ import "@akonwi/mica/mica.css";
|
|
|
44
44
|
**CDN** — for trying it out:
|
|
45
45
|
|
|
46
46
|
```html
|
|
47
|
-
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@akonwi/mica@0.
|
|
47
|
+
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@akonwi/mica@0.2/mica.css">
|
|
48
48
|
```
|
|
49
49
|
|
|
50
50
|
## The three tiers
|
package/mica.css
CHANGED
|
@@ -616,6 +616,63 @@
|
|
|
616
616
|
}
|
|
617
617
|
}
|
|
618
618
|
|
|
619
|
+
/* segmented control: native radios fused into one control. The input
|
|
620
|
+
remains the form/keyboard/AT primitive; the label carries the visual
|
|
621
|
+
state because inputs cannot safely own pseudo-elements. */
|
|
622
|
+
:where(m-segmented) {
|
|
623
|
+
display: inline-flex;
|
|
624
|
+
inline-size: fit-content;
|
|
625
|
+
border: 1px solid var(--color-border-strong);
|
|
626
|
+
border-radius: var(--radius-sm);
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
:where(m-segmented) > :where(label) {
|
|
630
|
+
position: relative;
|
|
631
|
+
display: grid;
|
|
632
|
+
place-items: center;
|
|
633
|
+
min-block-size: var(--control-height);
|
|
634
|
+
padding-inline: var(--space-sm);
|
|
635
|
+
margin: 0;
|
|
636
|
+
font-size: 0.875rem;
|
|
637
|
+
font-weight: 400;
|
|
638
|
+
line-height: 1;
|
|
639
|
+
cursor: pointer;
|
|
640
|
+
user-select: none;
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
:where(m-segmented) > :where(label + label) {
|
|
644
|
+
border-inline-start: 1px solid var(--color-border-strong);
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
:where(m-segmented) > :where(label) > :where(input[type="radio"]) {
|
|
648
|
+
position: absolute;
|
|
649
|
+
inline-size: 1px;
|
|
650
|
+
block-size: 1px;
|
|
651
|
+
margin: -1px;
|
|
652
|
+
padding: 0;
|
|
653
|
+
overflow: hidden;
|
|
654
|
+
clip-path: inset(50%);
|
|
655
|
+
white-space: nowrap;
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
:where(m-segmented) > :where(label):has(> input:checked) {
|
|
659
|
+
background: var(--color-primary);
|
|
660
|
+
color: var(--color-on-primary);
|
|
661
|
+
font-weight: 600;
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
:where(m-segmented) > :where(label):has(> input:focus-visible) {
|
|
665
|
+
outline: var(--focus-ring-width) solid var(--focus-ring-color);
|
|
666
|
+
outline-offset: var(--focus-ring-offset);
|
|
667
|
+
z-index: 1;
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
:where(m-segmented) > :where(label):has(> input:disabled) {
|
|
671
|
+
color: var(--color-text-muted);
|
|
672
|
+
cursor: not-allowed;
|
|
673
|
+
opacity: 0.55;
|
|
674
|
+
}
|
|
675
|
+
|
|
619
676
|
/* switch: a checkbox wearing a track; the thumb is a positioned
|
|
620
677
|
gradient (pseudo-elements don't render on inputs). square, per the
|
|
621
678
|
design language — a solid linear-gradient block */
|
|
@@ -664,6 +721,57 @@
|
|
|
664
721
|
cursor: not-allowed;
|
|
665
722
|
}
|
|
666
723
|
|
|
724
|
+
/* --- badge: quiet metadata, not a control ------------------------ */
|
|
725
|
+
:where(m-badge) {
|
|
726
|
+
display: inline-flex;
|
|
727
|
+
align-items: center;
|
|
728
|
+
justify-content: center;
|
|
729
|
+
min-inline-size: var(--m-badge-min-width, auto);
|
|
730
|
+
min-block-size: 1.5rem;
|
|
731
|
+
padding-inline: var(--m-badge-padding, var(--space-xs));
|
|
732
|
+
border: 1px solid var(--m-badge-border, var(--color-border));
|
|
733
|
+
border-radius: var(--radius-sm);
|
|
734
|
+
background: var(--m-badge-background, transparent);
|
|
735
|
+
color: var(--m-badge-color, var(--color-text-muted));
|
|
736
|
+
font-family: var(--m-badge-font, inherit);
|
|
737
|
+
font-size: 0.75rem;
|
|
738
|
+
font-weight: 500;
|
|
739
|
+
font-variant-numeric: var(--m-badge-numerals, normal);
|
|
740
|
+
line-height: 1;
|
|
741
|
+
white-space: nowrap;
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
:where(m-badge[variant="primary"]) {
|
|
745
|
+
--m-badge-border: var(--color-primary);
|
|
746
|
+
--m-badge-background: var(--color-primary);
|
|
747
|
+
--m-badge-color: var(--color-on-primary);
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
:where(m-badge[variant="success"]) {
|
|
751
|
+
--m-badge-border: var(--color-success-border);
|
|
752
|
+
--m-badge-background: var(--color-success-surface);
|
|
753
|
+
--m-badge-color: var(--color-success-text);
|
|
754
|
+
}
|
|
755
|
+
|
|
756
|
+
:where(m-badge[variant="warning"]) {
|
|
757
|
+
--m-badge-border: var(--color-warn-border);
|
|
758
|
+
--m-badge-background: var(--color-warn-surface);
|
|
759
|
+
--m-badge-color: var(--color-warn-text);
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
:where(m-badge[variant="danger"]) {
|
|
763
|
+
--m-badge-border: var(--color-danger-border);
|
|
764
|
+
--m-badge-background: var(--color-danger-surface);
|
|
765
|
+
--m-badge-color: var(--color-danger-text);
|
|
766
|
+
}
|
|
767
|
+
|
|
768
|
+
:where(m-badge[count]) {
|
|
769
|
+
--m-badge-min-width: 1.5rem;
|
|
770
|
+
--m-badge-padding: var(--space-2xs);
|
|
771
|
+
--m-badge-font: var(--font-mono);
|
|
772
|
+
--m-badge-numerals: tabular-nums;
|
|
773
|
+
}
|
|
774
|
+
|
|
667
775
|
/* --- content: tables, lists, code, quotes ------------------------ */
|
|
668
776
|
:where(table) {
|
|
669
777
|
inline-size: 100%;
|
|
@@ -1335,7 +1443,18 @@
|
|
|
1335
1443
|
background: var(--neutral-3);
|
|
1336
1444
|
border-radius: var(--radius-md);
|
|
1337
1445
|
|
|
1446
|
+
/* Graceful collapse: labels never wrap inside a tab — when the rail
|
|
1447
|
+
is narrower than its tabs it scrolls horizontally instead. The
|
|
1448
|
+
thin scrollbar is the overflow affordance on platforms that show
|
|
1449
|
+
one; scroll chaining stays contained. */
|
|
1450
|
+
max-inline-size: 100%;
|
|
1451
|
+
overflow-x: auto;
|
|
1452
|
+
overscroll-behavior-x: contain;
|
|
1453
|
+
scrollbar-width: thin;
|
|
1454
|
+
|
|
1338
1455
|
& > :where(button) {
|
|
1456
|
+
flex-shrink: 0;
|
|
1457
|
+
white-space: nowrap;
|
|
1339
1458
|
block-size: var(--control-height-sm);
|
|
1340
1459
|
padding-inline: var(--space-sm);
|
|
1341
1460
|
border: 0;
|