@akonwi/mica 0.9.0 → 0.11.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/mica.css CHANGED
@@ -764,6 +764,68 @@
764
764
  --m-badge-color: var(--color-danger-text);
765
765
  }
766
766
 
767
+ /* Callouts are CSS-only content. Variants never imply role=alert.
768
+ Optional icons and dismissal controls are authored, not generated.
769
+ For a neutral panel with colored emphasis, override --callout-background
770
+ and --callout-border to the shared surface and border roles. */
771
+ :where(m-callout) {
772
+ --callout-background: var(--color-surface-raised);
773
+ --callout-border: var(--color-border);
774
+ --callout-emphasis: var(--color-text);
775
+ display: flex;
776
+ align-items: flex-start;
777
+ gap: var(--callout-gap, var(--space-sm));
778
+ padding: var(--callout-padding, var(--space-md));
779
+ border: 1px solid var(--callout-border);
780
+ border-radius: var(--radius-md);
781
+ background: var(--callout-background);
782
+ color: var(--color-text);
783
+ font-size: var(--callout-font-size, .875rem);
784
+ line-height: var(--callout-line-height, 1.5);
785
+ }
786
+ :where(m-callout[variant="success"]) {
787
+ --callout-background: var(--color-success-surface);
788
+ --callout-border: var(--color-success-border);
789
+ --callout-emphasis: var(--color-success-text);
790
+ }
791
+ :where(m-callout[variant="warning"]) {
792
+ --callout-background: var(--color-warn-surface);
793
+ --callout-border: var(--color-warn-border);
794
+ --callout-emphasis: var(--color-warn-text);
795
+ }
796
+ :where(m-callout[variant="danger"]) {
797
+ --callout-background: var(--color-danger-surface);
798
+ --callout-border: var(--color-danger-border);
799
+ --callout-emphasis: var(--color-danger-text);
800
+ }
801
+ :where(m-callout[hidden]) { display: none; }
802
+ :where(m-callout > [data-callout-body]) { flex: 1; min-inline-size: 0; overflow-wrap: anywhere; }
803
+ :where(m-callout [data-callout-title]) {
804
+ margin: 0 0 var(--space-2xs);
805
+ color: var(--callout-emphasis);
806
+ font: inherit;
807
+ font-weight: var(--callout-title-weight, 600);
808
+ }
809
+ :where(m-callout > [data-callout-body] > p:not([data-callout-title])) { margin: 0; }
810
+ :where(m-callout > [data-callout-body] > p + p) { margin-block-start: var(--space-xs); }
811
+ :where(m-callout a) { color: var(--callout-emphasis); }
812
+ :where(m-callout > [data-callout-icon]) {
813
+ inline-size: var(--callout-icon-size, 1.125rem);
814
+ block-size: var(--callout-icon-size, 1.125rem);
815
+ flex: 0 0 auto;
816
+ margin-block-start: var(--callout-icon-offset, .125rem);
817
+ color: var(--callout-emphasis);
818
+ }
819
+ :where(m-callout [data-callout-actions]) { display: flex; flex-wrap: wrap; gap: var(--space-xs); margin-block-start: var(--space-sm); }
820
+ :where(m-callout > button[data-callout-dismiss]) {
821
+ flex: 0 0 auto;
822
+ inline-size: var(--callout-dismiss-size, 2rem);
823
+ block-size: var(--callout-dismiss-size, 2rem);
824
+ padding: 0;
825
+ margin-block-start: calc(-1 * var(--space-2xs));
826
+ margin-inline-end: calc(-1 * var(--space-2xs));
827
+ }
828
+
767
829
  :where(m-badge[count]) {
768
830
  --m-badge-min-width: 1.5rem;
769
831
  --m-badge-padding: var(--space-2xs);
@@ -847,6 +909,85 @@
847
909
  );
848
910
  }
849
911
 
912
+ /* --- skeleton: quiet CSS-only loading placeholder ---------------- */
913
+ :where(m-skeleton) {
914
+ display: block;
915
+ flex: none;
916
+ inline-size: var(--skeleton-width, 100%);
917
+ block-size: var(--skeleton-height, 0.75rem);
918
+ overflow: hidden;
919
+ border-radius: var(--skeleton-radius, var(--radius-md));
920
+ background-color: var(--color-surface-raised);
921
+ animation: mica-skeleton-pulse 1.6s ease-in-out infinite alternate;
922
+ }
923
+
924
+ @keyframes mica-skeleton-pulse {
925
+ to {
926
+ background-color: var(--color-border);
927
+ }
928
+ }
929
+
930
+ @media (prefers-reduced-motion: reduce) {
931
+ :where(m-skeleton) {
932
+ animation: none;
933
+ background-color: var(--color-border);
934
+ }
935
+ }
936
+
937
+ /* --- stat grid: semantic summaries in a fused frame -------------- */
938
+ :where(dl.stat-grid) {
939
+ display: flex;
940
+ flex-wrap: wrap;
941
+ gap: 1px;
942
+ margin-block: 0;
943
+ padding: 1px;
944
+ overflow: hidden;
945
+ border-radius: var(--radius-md);
946
+ background: var(--color-border);
947
+ }
948
+
949
+ :where(dl.stat-grid) > :where(div.stat) {
950
+ display: flex;
951
+ flex-direction: column;
952
+ flex: 1 1 min(100%, 8rem);
953
+ gap: var(--space-sm);
954
+ min-inline-size: 0;
955
+ padding: var(--space-md);
956
+ background: var(--color-surface);
957
+ }
958
+
959
+ :where(dl.stat-grid) > :where(div.stat) > :where(dt) {
960
+ color: var(--color-text-muted);
961
+ font-size: 0.75rem;
962
+ font-weight: 500;
963
+ line-height: 1.4;
964
+ }
965
+
966
+ :where(dl.stat-grid) > :where(div.stat) > :where(dd) {
967
+ display: flex;
968
+ flex-direction: column;
969
+ flex: 1 1 auto;
970
+ gap: var(--space-2xs);
971
+ min-inline-size: 0;
972
+ margin-block: 0;
973
+ }
974
+
975
+ :where(dl.stat-grid) > :where(div.stat) > :where(dd) > :first-child {
976
+ color: var(--color-text);
977
+ font-size: 1.5rem;
978
+ font-weight: 600;
979
+ font-variant-numeric: tabular-nums;
980
+ line-height: 1.2;
981
+ overflow-wrap: anywhere;
982
+ }
983
+
984
+ :where(dl.stat-grid) > :where(div.stat) > :where(dd) > :where(small) {
985
+ margin-block-start: auto;
986
+ color: var(--color-text-muted);
987
+ font-size: 0.75rem;
988
+ line-height: 1.4;
989
+ }
990
+
850
991
  /* --- content: tables, lists, code, quotes ------------------------ */
851
992
  :where(table) {
852
993
  inline-size: 100%;
@@ -983,6 +1124,71 @@
983
1124
  background: var(--color-danger);
984
1125
  }
985
1126
 
1127
+ /* --- stepper: framed sequence controls --------------------------- *
1128
+ * Mica owns only the fused layout. Consumers own labels, disabled
1129
+ * state, events, routing, and value changes. The frame deliberately does
1130
+ * not clip overflow: native focus rings must remain fully visible.
1131
+ * ------------------------------------------------------------------ */
1132
+ :where(m-stepper) {
1133
+ display: grid;
1134
+ grid-template-columns: auto minmax(0, 1fr) auto;
1135
+ align-items: stretch;
1136
+ min-inline-size: 0;
1137
+ border: 1px solid var(--color-border-strong);
1138
+ border-radius: var(--radius-md);
1139
+ background: var(--color-surface);
1140
+ }
1141
+
1142
+ :where(m-stepper:has(> [data-reset])) {
1143
+ grid-template-columns: auto minmax(0, 1fr) auto auto;
1144
+ }
1145
+
1146
+ :where(m-stepper) > :where(button) {
1147
+ border: 0;
1148
+ border-radius: 0;
1149
+ background: transparent;
1150
+
1151
+ &:focus-visible {
1152
+ z-index: 1;
1153
+ }
1154
+ }
1155
+
1156
+ :where(m-stepper) > :where(button:first-child) {
1157
+ border-start-start-radius: inherit;
1158
+ border-end-start-radius: inherit;
1159
+ }
1160
+
1161
+ :where(m-stepper) > :where(button:last-child) {
1162
+ border-start-end-radius: inherit;
1163
+ border-end-end-radius: inherit;
1164
+ }
1165
+
1166
+ :where(m-stepper) > :where([data-step]) {
1167
+ inline-size: var(--control-height);
1168
+ padding-inline: 0;
1169
+ }
1170
+
1171
+ :where(m-stepper) > :where(:nth-child(2)) {
1172
+ display: grid;
1173
+ place-items: center;
1174
+ min-inline-size: 0;
1175
+ block-size: var(--control-height);
1176
+ padding-inline: var(--space-sm);
1177
+ overflow: hidden;
1178
+ border-inline: 1px solid var(--color-border);
1179
+ background: var(--color-surface-raised);
1180
+ color: var(--color-text);
1181
+ font-size: 0.875rem;
1182
+ font-weight: 600;
1183
+ text-align: center;
1184
+ text-overflow: ellipsis;
1185
+ white-space: nowrap;
1186
+ }
1187
+
1188
+ :where(m-stepper) > :where([data-reset]) {
1189
+ border-inline-start: 1px solid var(--color-border);
1190
+ }
1191
+
986
1192
  /* --- dialog: modal + drawer --------------------------------------- *
987
1193
  * The browser brings focus trapping, Esc, top layer, ::backdrop, and
988
1194
  * form[method=dialog] closing. Invoker commands (commandfor/command)
@@ -1535,38 +1741,136 @@
1535
1741
  /* --- tabs: m-tabs + tabs.js (JS-enhanced) ------------------------------ *
1536
1742
  * without the module: inert nav, all panels visible in order —
1537
1743
  * complete content. with it: tablist semantics + roving focus.
1538
- * shadcn segmented look: muted track, surface active tab.
1744
+ * default: muted track + surface active tab. variant="underline":
1745
+ * quiet rail + accent selection line; behavior stays identical.
1539
1746
  * ------------------------------------------------------------------ */
1540
1747
  :where(m-tabs) {
1748
+ --m-tabs-rail-gap: var(--space-2xs);
1749
+ --m-tabs-rail-padding: var(--space-2xs);
1750
+ --m-tabs-rail-border: none;
1751
+ --m-tabs-rail-radius: var(--radius-md);
1752
+ --m-tabs-rail-background: var(--neutral-3);
1753
+ --m-tabs-overflow-cover: var(--neutral-3);
1754
+ --m-tabs-overflow-duration: 0.15s;
1755
+ --m-tabs-overflow-marker: color-mix(in oklch, var(--color-text-muted) 70%, transparent);
1756
+ --m-tabs-overflow-start-gutter: 0px;
1757
+ --m-tabs-overflow-end-gutter: 0px;
1758
+ --m-tabs-overflow-start: 0;
1759
+ --m-tabs-overflow-end: 0;
1760
+ --m-tabs-tab-radius: var(--radius-sm);
1761
+ --m-tabs-tab-edge-padding: var(--space-sm);
1762
+ --m-tabs-tab-focus-offset: var(--focus-ring-offset);
1763
+ --m-tabs-tab-selected-background: var(--color-surface);
1764
+ --m-tabs-tab-selected-shadow: 0 1px 2px oklch(0 0 0 / 0.08);
1541
1765
  display: block;
1542
1766
  }
1543
1767
 
1768
+ :where(m-tabs[variant="underline"]) {
1769
+ --m-tabs-rail-gap: 0;
1770
+ --m-tabs-rail-padding: 0;
1771
+ --m-tabs-rail-border: 1px solid var(--color-border);
1772
+ --m-tabs-rail-radius: 0;
1773
+ --m-tabs-rail-background: transparent;
1774
+ --m-tabs-overflow-cover: var(--color-surface);
1775
+ --m-tabs-tab-radius: 0;
1776
+ --m-tabs-tab-edge-padding: 0;
1777
+ --m-tabs-tab-focus-offset: -2px;
1778
+ --m-tabs-tab-selected-background: transparent;
1779
+ --m-tabs-tab-selected-shadow: inset 0 -2px var(--color-accent);
1780
+ }
1781
+
1544
1782
  :where(m-tabs) > :where(nav) {
1545
1783
  display: inline-flex;
1546
- gap: var(--space-2xs);
1547
- padding: var(--space-2xs);
1548
- background: var(--neutral-3);
1549
- border-radius: var(--radius-md);
1784
+ gap: var(--m-tabs-rail-gap);
1785
+ padding: var(--m-tabs-rail-padding);
1786
+ border-block-end: var(--m-tabs-rail-border);
1787
+ border-radius: var(--m-tabs-rail-radius);
1788
+ background: var(--m-tabs-rail-background);
1550
1789
 
1551
1790
  /* Graceful collapse: labels never wrap inside a tab — when the rail
1552
- is narrower than its tabs it scrolls horizontally instead. The
1553
- thin scrollbar is the overflow affordance on platforms that show
1554
- one; scroll chaining stays contained. */
1791
+ is narrower than its tabs it scrolls horizontally instead. Before
1792
+ enhancement, the native scrollbar remains the overflow affordance.
1793
+ tabs.js hides it, activates sticky direction markers in clear
1794
+ gutters, and reveals a selected tab within those gutters. Scroll
1795
+ chaining stays contained. */
1555
1796
  max-inline-size: 100%;
1556
1797
  overflow-x: auto;
1557
1798
  overscroll-behavior-x: contain;
1558
1799
  scrollbar-width: thin;
1559
1800
 
1801
+ &[role="tablist"] {
1802
+ scrollbar-width: none;
1803
+ }
1804
+
1805
+ &::before,
1806
+ &::after {
1807
+ content: "";
1808
+ position: sticky;
1809
+ z-index: 1;
1810
+ align-self: stretch;
1811
+ background-color: var(--m-tabs-overflow-cover);
1812
+ background-position: center;
1813
+ background-size: 6px 10px;
1814
+ background-repeat: no-repeat;
1815
+ pointer-events: none;
1816
+ }
1817
+
1818
+ &::before {
1819
+ inset-inline-start: 0;
1820
+ flex: 0 0 var(--space-md);
1821
+ margin-inline-end: calc(var(--m-tabs-overflow-start-gutter) - var(--space-md));
1822
+ opacity: var(--m-tabs-overflow-start);
1823
+ background-image: conic-gradient(from 45deg at left center,
1824
+ var(--m-tabs-overflow-marker) 0 25%, transparent 0);
1825
+ transition:
1826
+ opacity var(--m-tabs-overflow-duration),
1827
+ margin-inline-end var(--m-tabs-overflow-duration);
1828
+ }
1829
+
1830
+ &::after {
1831
+ inset-inline-end: 0;
1832
+ flex: 0 0 var(--space-md);
1833
+ margin-inline-start: calc(var(--m-tabs-overflow-end-gutter) - var(--space-md));
1834
+ opacity: var(--m-tabs-overflow-end);
1835
+ background-image: conic-gradient(from 225deg at right center,
1836
+ var(--m-tabs-overflow-marker) 0 25%, transparent 0);
1837
+ transition:
1838
+ opacity var(--m-tabs-overflow-duration),
1839
+ margin-inline-start var(--m-tabs-overflow-duration);
1840
+ }
1841
+
1842
+ &:dir(rtl)::before {
1843
+ background-image: conic-gradient(from 225deg at right center,
1844
+ var(--m-tabs-overflow-marker) 0 25%, transparent 0);
1845
+ }
1846
+
1847
+ &:dir(rtl)::after {
1848
+ background-image: conic-gradient(from 45deg at left center,
1849
+ var(--m-tabs-overflow-marker) 0 25%, transparent 0);
1850
+ }
1851
+
1560
1852
  & > :where(button) {
1561
1853
  flex-shrink: 0;
1562
1854
  white-space: nowrap;
1563
1855
  block-size: var(--control-height-sm);
1564
1856
  padding-inline: var(--space-sm);
1565
1857
  border: 0;
1566
- border-radius: var(--radius-sm);
1858
+ border-radius: var(--m-tabs-tab-radius);
1567
1859
  background: transparent;
1568
1860
  color: var(--color-text-muted);
1569
1861
 
1862
+ &:first-of-type {
1863
+ padding-inline-start: var(--m-tabs-tab-edge-padding);
1864
+ }
1865
+
1866
+ &:last-of-type {
1867
+ padding-inline-end: var(--m-tabs-tab-edge-padding);
1868
+ }
1869
+
1870
+ &:focus-visible {
1871
+ outline-offset: var(--m-tabs-tab-focus-offset);
1872
+ }
1873
+
1570
1874
  /* :not() guards mirror the base button states (house rule) */
1571
1875
  &:hover:not(:disabled, [aria-disabled="true"]),
1572
1876
  &:active:not(:disabled, [aria-disabled="true"]) {
@@ -1575,19 +1879,25 @@
1575
1879
  }
1576
1880
 
1577
1881
  &[aria-selected="true"] {
1578
- background: var(--color-surface);
1882
+ background: var(--m-tabs-tab-selected-background);
1579
1883
  color: var(--color-text);
1580
- box-shadow: 0 1px 2px oklch(0 0 0 / 0.08);
1884
+ box-shadow: var(--m-tabs-tab-selected-shadow);
1581
1885
 
1582
1886
  &:hover:not(:disabled, [aria-disabled="true"]),
1583
1887
  &:active:not(:disabled, [aria-disabled="true"]) {
1584
- background: var(--color-surface);
1888
+ background: var(--m-tabs-tab-selected-background);
1585
1889
  color: var(--color-text);
1586
1890
  }
1587
1891
  }
1588
1892
  }
1589
1893
  }
1590
1894
 
1895
+ /* Vendor pseudo gets its own rule: one unknown selector in a list
1896
+ invalidates the whole list. */
1897
+ :where(m-tabs) > :where(nav[role="tablist"])::-webkit-scrollbar {
1898
+ display: none;
1899
+ }
1900
+
1591
1901
  :where(m-tabs) > :where(section) {
1592
1902
  padding-block: var(--space-md);
1593
1903
  }
@@ -1763,6 +2073,556 @@
1763
2073
  display: block;
1764
2074
  }
1765
2075
 
2076
+ /* --- header navigation: native links + optional header.js collapse --- */
2077
+ :where(m-header) {
2078
+ container: m-header / inline-size;
2079
+ display: flex;
2080
+ flex-wrap: wrap;
2081
+ align-items: center;
2082
+ gap: var(--header-gap, var(--space-md));
2083
+ padding: var(--header-pad, var(--space-sm)) var(--header-gutter, var(--space-md));
2084
+ border-block-end: 1px solid var(--color-border);
2085
+ background: var(--color-surface);
2086
+ color: var(--color-text);
2087
+ }
2088
+ :where(m-header > [data-brand]) {
2089
+ display: inline-flex;
2090
+ align-items: center;
2091
+ gap: var(--space-xs);
2092
+ min-block-size: var(--control-height);
2093
+ color: var(--color-text);
2094
+ font-weight: var(--header-strong-weight, 650);
2095
+ text-decoration: none;
2096
+ overflow-wrap: anywhere;
2097
+ }
2098
+ :where(m-header > nav) {
2099
+ display: flex;
2100
+ flex: 1 1 auto;
2101
+ flex-wrap: wrap;
2102
+ align-items: center;
2103
+ gap: var(--space-2xs);
2104
+ min-inline-size: 0;
2105
+ justify-content: var(--header-nav-align, start);
2106
+ }
2107
+ :where(m-header[align="end"]) { --header-nav-align: end; }
2108
+ :where(m-header > nav > a) {
2109
+ display: inline-flex;
2110
+ align-items: center;
2111
+ min-block-size: var(--control-height);
2112
+ padding: var(--space-2xs) var(--space-sm);
2113
+ border-radius: var(--radius-md);
2114
+ color: var(--color-text-muted);
2115
+ font-size: var(--header-font-size, .875rem);
2116
+ font-weight: var(--header-font-weight, 500);
2117
+ text-decoration: none;
2118
+ overflow-wrap: anywhere;
2119
+ }
2120
+ :where(m-header > nav > a):hover:not([aria-disabled="true"]) { background: var(--color-surface-raised); color: var(--color-text); }
2121
+ :where(m-header > nav > a)[aria-current="page"]{ background: var(--color-surface-raised); color: var(--color-text); font-weight: var(--header-strong-weight, 650); }
2122
+ :where(m-header > nav > a)[aria-disabled="true"]{ color: var(--color-text-muted); opacity: .5; }
2123
+ :where(m-header > [data-actions]) { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-xs); margin-inline-start: auto; }
2124
+ /* A small enhancement switches the same nav between inline and native
2125
+ popover. Without script, all links stay visible in the wrapping header. */
2126
+ :where(m-header > [data-menu]) { display: none; }
2127
+ :where(m-header > nav > [data-compact]) { display: none; }
2128
+ :where(m-header[data-m-header-collapsed]) { flex-wrap: nowrap; }
2129
+ :where(m-header[data-m-header-collapsed] > [data-brand]) { min-inline-size: 0; }
2130
+ :where(m-header[data-m-header-collapsed] > [data-actions]) { display: none; }
2131
+ :where(m-header[data-m-header-collapsed] > [data-menu]) { display: inline-flex; margin-inline-start: auto; flex: none; }
2132
+ :where(m-header > nav[popover]):not(:popover-open) { display: none; }
2133
+ :where(m-header > nav[popover]):popover-open{
2134
+ display: flex;
2135
+ flex-direction: column;
2136
+ flex-wrap: nowrap;
2137
+ justify-content: start;
2138
+ align-items: stretch;
2139
+ gap: var(--space-2xs);
2140
+ position: fixed;
2141
+ position-area: none;
2142
+ max-inline-size: none;
2143
+ scale: 1;
2144
+ inset: auto;
2145
+ top: var(--m-header-menu-top);
2146
+ left: var(--m-header-menu-left);
2147
+ width: var(--m-header-menu-width);
2148
+ max-block-size: var(--m-header-menu-height);
2149
+ overflow-y: auto;
2150
+ margin: 0;
2151
+ padding: var(--space-xs);
2152
+ border: 1px solid var(--color-border-strong);
2153
+ border-radius: var(--radius-md);
2154
+ background: var(--color-surface-overlay);
2155
+ color: var(--color-text);
2156
+ box-shadow: none;
2157
+ opacity: 1;
2158
+ transform: none;
2159
+ transition: none;
2160
+ animation: none;
2161
+ }
2162
+ :where(m-header > nav[popover] > a) { min-block-size: var(--header-target-height, 2.75rem); flex-shrink: 0; }
2163
+ :where(m-header > nav[popover] > [data-compact]) { display: inline-flex; }
2164
+ :where(m-header > nav[popover] > :not([data-compact]) + [data-compact]) { border-block-start: 1px solid var(--color-border); }
2165
+ :where(m-header > [data-menu] svg) { inline-size: 1rem; block-size: 1rem; }
2166
+
2167
+
2168
+ :where(m-header > [data-menu]) { --m-header-collapse: 0; }
2169
+ @container m-header (inline-size < 40rem) {
2170
+ :where(m-header > [data-menu]) { --m-header-collapse: 1; }
2171
+ }
2172
+
2173
+
2174
+ /* Navigation disclosures: native details remain usable without header.js.
2175
+ Enhancement adds floating placement; mobile keeps content in flow.
2176
+ Panel contents are authored links and layouts, never ARIA menu widgets. */
2177
+ :where(m-header > nav[data-navigation-menu]) {
2178
+ --nav-panel-width: 34rem;
2179
+ --nav-panel-gap: var(--space-xs);
2180
+ --nav-panel-pad: var(--space-xs);
2181
+ --nav-panel-link-pad: var(--space-sm);
2182
+ --nav-panel-description-size: .8125rem;
2183
+ --nav-panel-heading-size: .6875rem;
2184
+ --nav-panel-z: 10;
2185
+ }
2186
+ :where(m-header > nav[data-navigation-menu] > details) { margin: 0; padding: 0; border: 0; background: none; max-inline-size: 100%; }
2187
+ :where(m-header > nav[data-navigation-menu] > details)::details-content { transition: none; overflow: visible; }
2188
+ :where(m-header > nav[data-navigation-menu] > details > summary) {
2189
+ display: flex;
2190
+ align-items: center;
2191
+ gap: var(--space-xs);
2192
+ min-block-size: var(--control-height);
2193
+ padding: var(--space-2xs) var(--space-sm);
2194
+ font-size: var(--header-font-size, .875rem);
2195
+ font-weight: var(--header-font-weight, 500);
2196
+ color: var(--color-text-muted);
2197
+ border-radius: var(--radius-md);
2198
+ }
2199
+ :where(m-header > nav[data-navigation-menu] > details > summary):hover {
2200
+ text-decoration: none; color: var(--color-text); background: var(--color-surface-raised);
2201
+ }
2202
+ :where(m-header > nav[data-navigation-menu] > details)[open] > :where(summary) {
2203
+ color: var(--color-text); background: var(--color-surface-raised);
2204
+ }
2205
+ :where(m-header > nav[data-navigation-menu] [data-nav-panel]) {
2206
+ inline-size: min(var(--nav-panel-width), var(--m-nav-max-width, calc(100vw - 2 * var(--nav-panel-gap))));
2207
+ max-inline-size: 100%;
2208
+ max-block-size: var(--m-nav-height, none);
2209
+ margin: 0;
2210
+ padding: var(--nav-panel-pad);
2211
+ row-gap: var(--nav-panel-gap);
2212
+ border: 1px solid var(--color-border);
2213
+ border-radius: var(--radius-md);
2214
+ background: var(--color-surface-overlay);
2215
+ overflow: auto;
2216
+ }
2217
+ :where(m-header > nav[data-m-navigation-ready] > details > [data-nav-panel]) {
2218
+ position: fixed; z-index: var(--nav-panel-z);
2219
+ left: var(--m-nav-left); top: var(--m-nav-top);
2220
+ }
2221
+ :where(m-header > nav[data-navigation-menu] [data-nav-panel] a) {
2222
+ display: block;
2223
+ padding: var(--nav-panel-link-pad);
2224
+ border-radius: var(--radius-md);
2225
+ color: var(--color-text);
2226
+ text-decoration: none;
2227
+ font-size: var(--header-font-size, .875rem);
2228
+ overflow-wrap: anywhere;
2229
+ }
2230
+ :where(m-header > nav[data-navigation-menu] [data-nav-panel] a):hover:not([aria-disabled="true"]),
2231
+ :where(m-header > nav[data-navigation-menu] [data-nav-panel] a)[aria-current="page"] { background: var(--color-surface-raised); }
2232
+ :where(m-header > nav[data-navigation-menu] [data-nav-panel] a)[aria-disabled="true"] { opacity: .5; }
2233
+ :where(m-header > nav[data-navigation-menu] [data-nav-panel] strong) { display: block; font-weight: var(--header-strong-weight, 650); }
2234
+ :where(m-header > nav[data-navigation-menu] [data-nav-panel] small) {
2235
+ display: block; margin-block-start: var(--space-2xs);
2236
+ font-size: var(--nav-panel-description-size); color: var(--color-text-muted);
2237
+ }
2238
+ :where(m-header > nav[data-navigation-menu] [data-nav-panel] h2) {
2239
+ margin: 0; padding: var(--nav-panel-link-pad);
2240
+ font-size: var(--nav-panel-heading-size); font-weight: var(--header-font-weight, 500); color: var(--color-text-muted);
2241
+ }
2242
+ :where(m-header[data-m-header-collapsed] > nav[data-navigation-menu] > details) { flex-shrink: 0; }
2243
+ :where(m-header[data-m-header-collapsed] > nav[data-navigation-menu] > details > summary) { min-block-size: var(--header-target-height, 2.75rem); }
2244
+ :where(m-header[data-m-header-collapsed] > nav[data-navigation-menu] > details > [data-nav-panel]) {
2245
+ position: static; inline-size: auto; max-block-size: none;
2246
+ margin: var(--space-xs) var(--space-sm); padding: 0 0 0 var(--space-xs);
2247
+ padding-inline: var(--space-xs) 0;
2248
+ border: 0; border-inline-start: 1px solid var(--color-border);
2249
+ border-radius: 0; background: transparent; overflow: visible;
2250
+ }
2251
+
2252
+ /* Data collections: application-owned rows and state, native table semantics.
2253
+ Column widths and sticky offsets are authored for the application's schema.
2254
+ Selection actions replace filters; keep filters inert while selection is active.
2255
+ For a taller action set, increase --table-toolbar-min-height to reserve space. */
2256
+ :where(:root) {
2257
+ --table-font-size: .8125rem;
2258
+ --table-padding: var(--space-lg);
2259
+ --table-cell-padding: var(--space-sm);
2260
+ --table-min-width: 54rem;
2261
+ --table-toolbar-min-height: 0px;
2262
+ --table-selected-background: var(--color-surface-raised);
2263
+ --table-edge-width: var(--space-md);
2264
+ --table-edge-color: color-mix(in oklch, var(--color-text) 14%, transparent);
2265
+ --table-state-padding: var(--space-2xl);
2266
+ }
2267
+ :where([data-data-table]) { container: mica-table / inline-size; background: var(--color-surface); border: 1px solid var(--color-border); min-inline-size: 0; }
2268
+ :where([data-table-heading]) { display:flex; justify-content:space-between; align-items:center; gap:var(--space-md); padding:var(--table-padding) var(--table-padding) var(--space-sm); }
2269
+ :where([data-table-heading] > button) { flex-shrink:0; white-space:nowrap; }
2270
+ :where([data-table-heading] h2) { margin:0; font-size:var(--table-heading-size, 1.375rem); }
2271
+ :where([data-table-heading] p) { margin:var(--space-2xs) 0 0; color:var(--color-text-muted); font-size:var(--table-font-size); }
2272
+ :where([data-table-toolbar]) { position:relative; min-block-size:var(--table-toolbar-min-height); }
2273
+ :where([data-table-filters], [data-table-selection]) { display:flex; flex-wrap:wrap; align-items:center; gap:var(--space-xs); padding:var(--space-sm) var(--table-padding); }
2274
+ :where([data-table-filters] [data-table-search]) { flex:1; min-inline-size:12rem; }
2275
+ :where([data-table-search] input) { inline-size:100%; }
2276
+ :where([data-table-filters] select) { max-inline-size:11rem; }
2277
+ :where([data-table-filters] button) { white-space:nowrap; }
2278
+ :where([data-table-selection]) { position:absolute; inset:0; align-content:center; gap:var(--space-sm); font-size:var(--table-font-size); }
2279
+ :where([data-table-toolbar]):has(> [data-table-selection]:not([hidden])) > :where([data-table-filters]) { visibility:hidden; }
2280
+ :where([data-table-selection] [data-table-clear]) { margin-inline-start:auto; }
2281
+ :where([data-data-table] [hidden], [data-pagination] [hidden], [data-table-selection][hidden], [data-table-filters] [hidden], [data-table] [hidden]) { display:none; }
2282
+ :where(m-table-scroll) { display:block; position:relative; min-inline-size:0; }
2283
+ :where(m-table-scroll)::before, :where(m-table-scroll)::after { content:''; position:absolute; inset-block:1px; inline-size:var(--table-edge-width); z-index:4; pointer-events:none; opacity:0; }
2284
+ :where(m-table-scroll)::before { left:var(--m-table-edge-left, 0px); background:linear-gradient(to right,var(--table-edge-color),transparent); }
2285
+ :where(m-table-scroll)::after { right:var(--m-table-edge-right, 0px); background:linear-gradient(to left,var(--table-edge-color),transparent); }
2286
+ :where(m-table-scroll[data-m-overflow-left])::before, :where(m-table-scroll[data-m-overflow-right])::after { opacity:1; }
2287
+ :where([data-table-region]) { position:relative; overflow:auto; overscroll-behavior:contain; border-block:1px solid var(--color-border); }
2288
+ :where(table[data-table]) { margin:0; inline-size:100%; min-inline-size:var(--table-min-width, 54rem); border-collapse:separate; border-spacing:0; table-layout:fixed; }
2289
+ :where([data-table] th, [data-table] td) { padding:var(--table-cell-padding, var(--space-sm)); vertical-align:middle; font-size:var(--table-font-size, .8125rem); }
2290
+ :where([data-table] thead th) { background:var(--color-surface-raised); color:var(--color-text-muted); font-weight:500; border-block-end:1px solid var(--color-border); }
2291
+ :where([data-table] th button) { display:inline-flex; align-items:center; gap:var(--space-xs); padding:0; min-block-size:var(--table-sort-target, 2rem); border:0; background:none; color:inherit; font:inherit; text-align:inherit; white-space:nowrap; }
2292
+ :where([data-table] th[aria-sort]) button { color:var(--color-text); }
2293
+ :where([data-table] td a) { color:var(--color-text); font-weight:600; text-decoration:none; }
2294
+ :where([data-table] td) a:hover { text-decoration:underline; }
2295
+ :where([data-table-description]) { display:block; color:var(--color-text-muted); margin-block-start:var(--space-2xs); font-size:var(--table-description-size, .75rem); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
2296
+ :where([data-table] tbody tr:last-child td) { border-block-end:0; }
2297
+ :where([data-table] tbody tr[data-selected]) > td { background:var(--table-selected-background, var(--color-surface-raised)); }
2298
+ :where([data-table-state]) { padding:var(--table-state-padding, var(--space-2xl)) var(--table-padding, var(--space-lg)); text-align:center; white-space:normal; }
2299
+ :where([data-table-state] strong) { display:block; color:var(--color-text); font-size:var(--table-state-font-size, 1rem); }
2300
+ :where([data-table-state] p) { margin-block:var(--space-xs) var(--space-md); color:var(--color-text-muted); }
2301
+ :where([data-table-region][data-state] table) { min-inline-size:100%; table-layout:auto; }
2302
+ :where([data-table-region][data-state] thead) { display:none; }
2303
+ :where([data-table-footer]) { container: mica-pagination / inline-size; display:flex; align-items:center; justify-content:space-between; flex-wrap:wrap; gap:var(--space-md); padding:var(--space-md) var(--table-padding); font-size:var(--table-font-size); }
2304
+ :where([data-page-meta]) { display:flex; align-items:center; gap:var(--space-md); flex-wrap:wrap; color:var(--color-text-muted); }
2305
+ :where([data-page-size]) { display:flex; align-items:center; gap:var(--space-xs); }
2306
+ :where([data-page-size] select) { inline-size:auto; min-block-size:2rem; padding-block:var(--space-2xs); font-size:1rem; }
2307
+ :where(nav[data-pagination]) { --pagination-target:2.125rem; --pagination-font-size:.8125rem; display:flex; flex-wrap:wrap; align-items:center; gap:var(--space-2xs); }
2308
+ :where([data-pagination] > a, [data-pagination] > button, [data-pagination] > [aria-disabled]) { display:inline-flex; justify-content:center; align-items:center; min-inline-size:var(--pagination-target); min-block-size:var(--pagination-target); padding:var(--space-2xs) var(--space-xs); border:0; background:transparent; color:var(--color-text); font-size:var(--pagination-font-size); text-decoration:none; }
2309
+ :where([data-pagination]) > a:hover { background:var(--color-surface-raised); }
2310
+ :where([data-pagination]) > [aria-current=page] { background:var(--color-surface-raised); font-weight:650; color:var(--color-text); }
2311
+ :where([data-pagination]) > :is([aria-disabled=true], :disabled) { color:var(--color-text-muted); cursor:default; }
2312
+ :where([data-page-status]) { display:none; color:var(--color-text-muted); font-size:var(--pagination-font-size); }
2313
+ @container mica-table (max-width:44rem) {
2314
+ :where([data-table-heading]) { padding:var(--space-md); }
2315
+ :where([data-table-filters]) { padding:0 var(--space-md) var(--space-sm); }
2316
+ :where([data-table-search]) { flex-basis:100%; }
2317
+ :where([data-table-filters] select) { flex:1; min-inline-size:0; max-inline-size:none; }
2318
+ :where([data-table-selection]) { padding-inline:var(--space-md); }
2319
+ :where([data-table-footer]) { padding:var(--space-md); gap:var(--space-sm); }
2320
+ :where([data-table] [data-table-sticky]) { position:sticky; inset-inline-start:var(--table-sticky-offset, 0px); background:var(--color-surface); z-index:1; }
2321
+ :where([data-table] thead [data-table-sticky]) { background:var(--color-surface-raised); z-index:3; }
2322
+ }
2323
+ /* A compact status is opt-in: include data-page-status to let numbered
2324
+ links collapse. Without it, every authored page link remains visible. */
2325
+ @container mica-pagination (max-width:40rem) {
2326
+ :where([data-page-meta]) { inline-size:100%; justify-content:space-between; gap:var(--space-xs); }
2327
+ :where([data-pagination]):has([data-page-status]) { inline-size:100%; justify-content:space-between; }
2328
+ :where([data-pagination]):has([data-page-status]) > :is([data-page-number], [data-page-ellipsis]) { display:none; }
2329
+ :where([data-pagination] [data-page-status]) { display:block; }
2330
+ }
2331
+
2332
+ /* Breadcrumbs: native hierarchy with decorative separators. The current
2333
+ page is plain text; nothing is automatically removed on narrow screens.
2334
+ Override --breadcrumb-current-weight or --breadcrumb-separator-color
2335
+ to tune emphasis without changing the authored trail. */
2336
+ :where(nav[data-breadcrumbs]) {
2337
+ --breadcrumb-font-size: .8125rem;
2338
+ --breadcrumb-gap: var(--space-xs);
2339
+ --breadcrumb-row-gap: var(--space-2xs);
2340
+ --breadcrumb-current-weight: 500;
2341
+ --breadcrumb-separator-size: .3rem;
2342
+ --breadcrumb-separator-color: var(--color-text-muted);
2343
+ --breadcrumb-menu-width: 14rem;
2344
+ --breadcrumb-overflow-font-size: 1rem;
2345
+ --breadcrumb-menu-target: 2.25rem;
2346
+ --breadcrumb-menu-z: 5;
2347
+ font-size: var(--breadcrumb-font-size);
2348
+ line-height: 1.5;
2349
+ color: var(--color-text-muted);
2350
+ }
2351
+ :where(nav[data-breadcrumbs] ol) {
2352
+ display: flex; align-items: center; flex-wrap: wrap;
2353
+ list-style: none; margin: 0; padding: 0;
2354
+ column-gap: var(--breadcrumb-gap); row-gap: var(--breadcrumb-row-gap);
2355
+ }
2356
+ :where(nav[data-breadcrumbs] li) {
2357
+ display: flex; align-items: center; gap: var(--breadcrumb-gap);
2358
+ min-inline-size: 0; max-inline-size: 100%;
2359
+ }
2360
+ :where(nav[data-breadcrumbs] > ol > li + li)::before {
2361
+ content: ''; display: block; flex: none;
2362
+ inline-size: var(--breadcrumb-separator-size); block-size: var(--breadcrumb-separator-size);
2363
+ border: solid var(--breadcrumb-separator-color); border-width: 1px 1px 0 0;
2364
+ transform: rotate(45deg); margin-inline: var(--space-2xs);
2365
+ }
2366
+ :where(nav[data-breadcrumbs]:dir(rtl) > ol > li + li)::before { transform: rotate(225deg); }
2367
+ :where(nav[data-breadcrumbs] a) {
2368
+ color: var(--color-text-muted); text-decoration: none;
2369
+ overflow-wrap: anywhere; padding-block: var(--space-2xs);
2370
+ }
2371
+ :where(nav[data-breadcrumbs] a):hover { text-decoration: underline; color: var(--color-text); }
2372
+ :where(nav[data-breadcrumbs] [aria-current="page"]) {
2373
+ color: var(--color-text); font-weight: var(--breadcrumb-current-weight);
2374
+ overflow-wrap: anywhere; padding-block: var(--space-2xs);
2375
+ }
2376
+ :where(m-breadcrumb-overflow) { display: block; min-inline-size: 0; }
2377
+ :where(nav[data-breadcrumbs] details) { position: relative; margin: 0; border: 0; padding: 0; flex: none; }
2378
+ :where(nav[data-breadcrumbs] summary) {
2379
+ display: grid; place-items: center;
2380
+ inline-size: var(--breadcrumb-menu-target); min-block-size: var(--breadcrumb-menu-target);
2381
+ padding: 0; list-style: none; font-size: var(--breadcrumb-overflow-font-size);
2382
+ font-weight: var(--breadcrumb-current-weight); border-radius: var(--radius-md);
2383
+ color: var(--color-text-muted); cursor: pointer;
2384
+ }
2385
+ :where(nav[data-breadcrumbs] summary)::-webkit-details-marker { display: none; }
2386
+ :where(nav[data-breadcrumbs] summary)::after { display: none; }
2387
+ :where(nav[data-breadcrumbs] summary):hover,
2388
+ :where(nav[data-breadcrumbs] details)[open] > :where(summary) {
2389
+ background: var(--color-surface-raised); color: var(--color-text); text-decoration: none;
2390
+ }
2391
+ :where(nav[data-breadcrumbs] details)::details-content { transition: none; overflow: visible; }
2392
+ :where(nav[data-breadcrumbs] [data-breadcrumb-menu]) {
2393
+ position: absolute; inset-block-start: 100%; inset-inline-start: 0;
2394
+ inline-size: var(--breadcrumb-menu-width); max-inline-size: calc(100vw - var(--space-2xl));
2395
+ max-block-size: var(--m-breadcrumb-height, none); overflow: auto;
2396
+ z-index: var(--breadcrumb-menu-z); display: flex; flex-direction: column;
2397
+ align-items: stretch; flex-wrap: nowrap; gap: 0;
2398
+ margin: var(--space-2xs) 0 0; padding: var(--space-xs);
2399
+ border: 1px solid var(--color-border); border-radius: var(--radius-md);
2400
+ background: var(--color-surface-overlay);
2401
+ }
2402
+ :where(m-breadcrumb-overflow[data-m-breadcrumb-ready] [data-breadcrumb-menu]) {
2403
+ position: fixed; inset: auto; left: var(--m-breadcrumb-left); top: var(--m-breadcrumb-top);
2404
+ }
2405
+ :where(nav[data-breadcrumbs] [data-breadcrumb-menu] li) { display: block; max-inline-size: none; flex: none; }
2406
+ :where(nav[data-breadcrumbs] [data-breadcrumb-menu] a) {
2407
+ display: block; padding: var(--space-xs); min-block-size: var(--breadcrumb-menu-target);
2408
+ }
2409
+ :where(nav[data-breadcrumbs] [data-breadcrumb-menu] a):hover { background: var(--color-surface-raised); text-decoration: none; }
2410
+
2411
+ /* Bottom navigation is ordinary site navigation, not a tab widget.
2412
+ Place it in the last row of an app shell; no fixed positioning or
2413
+ breakpoint is imposed. For emphasis without fill, override
2414
+ --bottom-nav-active-background: transparent on the nav. */
2415
+ :where(nav[data-bottom-nav]) {
2416
+ --bottom-nav-pad: var(--space-xs);
2417
+ --bottom-nav-gap: var(--space-2xs);
2418
+ --bottom-nav-target-height: 3.5rem;
2419
+ --bottom-nav-font-size: .75rem;
2420
+ --bottom-nav-font-weight: 500;
2421
+ --bottom-nav-active-weight: 650;
2422
+ --bottom-nav-icon-size: 1.125rem;
2423
+ --bottom-nav-active-background: var(--color-surface-raised);
2424
+ display: flex;
2425
+ gap: var(--bottom-nav-gap);
2426
+ padding: var(--bottom-nav-pad);
2427
+ padding-block-end: max(var(--bottom-nav-pad), env(safe-area-inset-bottom));
2428
+ /* Safe-area insets are physical, even in an RTL document. */
2429
+ padding-left: max(var(--bottom-nav-pad), env(safe-area-inset-left));
2430
+ padding-right: max(var(--bottom-nav-pad), env(safe-area-inset-right));
2431
+ border-block-start: 1px solid var(--color-border);
2432
+ background: var(--color-surface);
2433
+ }
2434
+ :where(nav[data-bottom-nav]:not(:has([data-bottom-icon]))) {
2435
+ --bottom-nav-target-height: 2.75rem;
2436
+ --bottom-nav-font-size: .8125rem;
2437
+ }
2438
+ :where(nav[data-bottom-nav] > a) {
2439
+ display: flex;
2440
+ flex: 1;
2441
+ flex-direction: column;
2442
+ justify-content: center;
2443
+ align-items: center;
2444
+ gap: var(--bottom-nav-gap);
2445
+ min-inline-size: 0;
2446
+ min-block-size: var(--bottom-nav-target-height);
2447
+ padding: var(--space-xs) var(--space-2xs);
2448
+ border-radius: var(--radius-md);
2449
+ color: var(--color-text-muted);
2450
+ font-size: var(--bottom-nav-font-size);
2451
+ font-weight: var(--bottom-nav-font-weight);
2452
+ line-height: 1.25;
2453
+ text-align: center;
2454
+ text-decoration: none;
2455
+ overflow-wrap: anywhere;
2456
+ }
2457
+ :where(nav[data-bottom-nav] > a):hover:not([aria-disabled="true"]) {
2458
+ background: var(--color-surface-raised);
2459
+ color: var(--color-text);
2460
+ }
2461
+ :where(nav[data-bottom-nav] > a)[aria-current="page"] {
2462
+ background: var(--bottom-nav-active-background);
2463
+ color: var(--color-text);
2464
+ font-weight: var(--bottom-nav-active-weight);
2465
+ }
2466
+ :where(nav[data-bottom-nav] > a)[aria-disabled="true"] { opacity: .45; cursor: default; }
2467
+ :where(nav[data-bottom-nav] [data-bottom-icon]) {
2468
+ inline-size: var(--bottom-nav-icon-size);
2469
+ block-size: var(--bottom-nav-icon-size);
2470
+ flex: none;
2471
+ }
2472
+
2473
+ /* --- sidebar: authored navigation, optional sidebar.js shell behavior --- */
2474
+ :where(m-sidebar-layout) {
2475
+ --sidebar-width: 15.5rem;
2476
+ --sidebar-rail-width: 3.75rem;
2477
+ --sidebar-mobile-width: 18rem;
2478
+ --sidebar-pad: var(--space-xs);
2479
+ --sidebar-icon-size: 1rem;
2480
+ --sidebar-font-size: .875rem;
2481
+ --sidebar-group-size: .6875rem;
2482
+ --sidebar-subnav-size: .8125rem;
2483
+ --sidebar-active-weight: 600;
2484
+ --sidebar-close-size: 2.75rem;
2485
+ --sidebar-inset: 0px;
2486
+ --sidebar-content-border: 0px;
2487
+ --sidebar-edge: 1px;
2488
+ display: grid;
2489
+ grid-template-columns: var(--m-sidebar-track, var(--sidebar-width)) minmax(0, 1fr);
2490
+ block-size: var(--sidebar-height, 100svh);
2491
+ min-block-size: 0;
2492
+ background: var(--color-surface-raised);
2493
+ }
2494
+ :where(m-sidebar-layout[variant="inset"]) {
2495
+ --sidebar-inset: var(--space-xs);
2496
+ --sidebar-content-border: 1px;
2497
+ --sidebar-edge: 0px;
2498
+ }
2499
+ :where(m-sidebar-layout > [data-sidebar-main]) {
2500
+ min-inline-size: 0;
2501
+ min-block-size: 0;
2502
+ overflow: auto;
2503
+ margin-block: var(--sidebar-inset);
2504
+ margin-inline: 0 var(--sidebar-inset);
2505
+ border: var(--sidebar-content-border) solid var(--color-border);
2506
+ background: var(--color-surface);
2507
+ }
2508
+ :where(m-sidebar) {
2509
+ display: flex;
2510
+ flex-direction: column;
2511
+ min-inline-size: 0;
2512
+ min-block-size: 0;
2513
+ block-size: 100%;
2514
+ padding: var(--sidebar-pad, var(--space-xs));
2515
+ border-inline-end: var(--sidebar-edge, 1px) solid var(--color-border);
2516
+ background: var(--color-surface-raised);
2517
+ }
2518
+ :where(m-sidebar > header, m-sidebar > footer) { flex: none; }
2519
+ :where(m-sidebar > header) { display: flex; align-items: center; }
2520
+ :where(m-sidebar > nav) {
2521
+ flex: 1 1 auto;
2522
+ min-block-size: 0;
2523
+ overflow-y: auto;
2524
+ overscroll-behavior: contain;
2525
+ padding-block: var(--space-md);
2526
+ }
2527
+ :where(m-sidebar > nav section) { margin: 0 0 var(--space-lg); }
2528
+ :where(m-sidebar > nav h2) {
2529
+ margin: 0;
2530
+ padding: var(--space-xs);
2531
+ font-size: var(--sidebar-group-size, .6875rem);
2532
+ font-weight: 500;
2533
+ color: var(--color-text-muted);
2534
+ }
2535
+ :where(m-sidebar [data-sidebar-item], m-sidebar [data-sidebar-subnav] > a) {
2536
+ display: flex;
2537
+ align-items: center;
2538
+ gap: var(--space-xs);
2539
+ min-block-size: var(--control-height);
2540
+ block-size: auto;
2541
+ padding: var(--space-xs);
2542
+ border: 0;
2543
+ border-radius: var(--radius-md);
2544
+ background: transparent;
2545
+ color: var(--color-text-muted);
2546
+ font-size: var(--sidebar-font-size, .875rem);
2547
+ text-decoration: none;
2548
+ text-align: start;
2549
+ }
2550
+ :where(m-sidebar [data-sidebar-item], m-sidebar [data-sidebar-subnav] > a):hover:not(:disabled, [aria-disabled="true"]) {
2551
+ color: var(--color-text);
2552
+ background: var(--color-surface);
2553
+ }
2554
+ :where(m-sidebar a)[aria-current="page"] {
2555
+ color: var(--color-text);
2556
+ background: var(--color-surface);
2557
+ font-weight: var(--sidebar-active-weight, 600);
2558
+ /* Active is a quiet fill, never a framed button. */
2559
+ box-shadow: none;
2560
+ }
2561
+ :where(m-sidebar [data-sidebar-item])[aria-disabled="true"] { opacity: .45; }
2562
+ :where(m-sidebar [data-sidebar-icon]) {
2563
+ inline-size: var(--sidebar-icon-size, 1rem);
2564
+ block-size: var(--sidebar-icon-size, 1rem);
2565
+ flex: none;
2566
+ object-fit: contain;
2567
+ }
2568
+ :where(m-sidebar [data-sidebar-label]) { flex: 1; min-inline-size: 0; }
2569
+ :where(m-sidebar [data-sidebar-badge]) { margin-inline-start: auto; color: var(--color-text-muted); font-size: var(--sidebar-subnav-size, .8125rem); }
2570
+ :where(m-sidebar > header > [data-sidebar-item], m-sidebar > footer > [data-sidebar-item]) { inline-size: 100%; }
2571
+ :where(m-sidebar details) { margin: 0; padding: 0; border: 0; background: none; }
2572
+ :where(m-sidebar summary) { cursor: pointer; list-style: none; }
2573
+ :where(m-sidebar summary)::-webkit-details-marker { display: none; }
2574
+ :where(m-sidebar summary)::after { display: none; }
2575
+ :where(m-sidebar [data-sidebar-chevron]) { inline-size: var(--space-sm); block-size: var(--space-sm); flex: none; }
2576
+ :where(m-sidebar details)[open] > :where(summary) > :where([data-sidebar-chevron]) { transform: rotate(90deg); }
2577
+ :where(m-sidebar [data-sidebar-subnav]) {
2578
+ margin: var(--space-2xs) 0 var(--space-xs) var(--sidebar-icon-size, 1rem);
2579
+ margin-inline: var(--sidebar-icon-size, 1rem) 0;
2580
+ padding: 0;
2581
+ padding-inline-start: var(--space-md);
2582
+ border-inline-start: 1px solid var(--color-border);
2583
+ }
2584
+ :where(m-sidebar [data-sidebar-subnav] > a) { font-size: var(--sidebar-subnav-size, .8125rem); }
2585
+ :where([data-sidebar-toggle], [data-sidebar-close]) { display: none; }
2586
+ :where(m-sidebar-layout[data-m-sidebar-rail]) { --m-sidebar-track: var(--sidebar-rail-width); }
2587
+ :where(m-sidebar-layout[data-m-sidebar-rail] m-sidebar) :where([data-sidebar-label], [data-sidebar-badge], h2, [data-sidebar-chevron], [data-sidebar-subnav]) { display: none; }
2588
+ :where(m-sidebar-layout[data-m-sidebar-rail] m-sidebar [data-sidebar-item]) { justify-content: center; }
2589
+ :where(m-sidebar-layout[data-m-sidebar-rail] m-sidebar details:has([aria-current="page"]) > summary) { color: var(--color-text); background: var(--color-surface); }
2590
+ :where(m-sidebar-layout[data-m-sidebar-can-rail] [data-sidebar-toggle], m-sidebar-layout[data-m-sidebar-mobile] [data-sidebar-toggle]) { display: inline-flex; }
2591
+ :where(m-sidebar-layout[data-m-sidebar-mobile]) { grid-template-columns: minmax(0, 1fr); --sidebar-inset: 0px; --sidebar-content-border: 0px; }
2592
+ :where(dialog[data-sidebar-dialog]) {
2593
+ position: fixed;
2594
+ inset: 0 auto 0 0;
2595
+ inset-inline: 0 auto;
2596
+ margin: 0;
2597
+ padding: 0;
2598
+ inline-size: min(var(--sidebar-mobile-width, 18rem), calc(100vw - var(--space-2xl)));
2599
+ max-inline-size: none;
2600
+ block-size: 100dvh;
2601
+ max-block-size: 100dvh;
2602
+ border: 0;
2603
+ border-radius: 0;
2604
+ background: var(--color-surface-raised);
2605
+ opacity: 1;
2606
+ scale: 1;
2607
+ transform: none;
2608
+ transition: none;
2609
+ animation: none;
2610
+ }
2611
+ :where(dialog[data-sidebar-dialog])::backdrop { transition: none; }
2612
+ :where(dialog[data-sidebar-dialog] > m-sidebar) {
2613
+ flex: 1 1 auto;
2614
+ overflow: hidden;
2615
+ border: 0;
2616
+ padding: var(--sidebar-pad, var(--space-xs));
2617
+ padding-block-start: max(var(--sidebar-pad, var(--space-xs)), env(safe-area-inset-top));
2618
+ padding-block-end: max(var(--sidebar-pad, var(--space-xs)), env(safe-area-inset-bottom));
2619
+ }
2620
+ :where(dialog[data-sidebar-dialog] m-sidebar > header > [data-sidebar-item]) { flex: 1; inline-size: 0; min-inline-size: 0; }
2621
+ :where(dialog[data-sidebar-dialog] [data-sidebar-close]) { display: inline-flex; flex: none; inline-size: var(--sidebar-close-size, 2.75rem); block-size: var(--sidebar-close-size, 2.75rem); padding: var(--space-xs); }
2622
+ @media (max-width: 44rem) {
2623
+ :where(m-sidebar-layout:not([data-m-sidebar-ready])) { grid-template-columns: minmax(0, 1fr); block-size: auto; }
2624
+ }
2625
+
1766
2626
  /* --- visually hidden: off-screen, still announced ------------------ *
1767
2627
  *
1768
2628
  * The one utility mica ships, and an accessibility primitive rather