@rolemodel/optics 2.4.0 → 2.5.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.
@@ -7,6 +7,7 @@
7
7
  *::after {
8
8
  box-sizing: border-box;
9
9
  }
10
+
10
11
  /* Remove default margin */
11
12
  body,
12
13
  h1,
@@ -20,31 +21,37 @@ dl,
20
21
  dd {
21
22
  margin: 0;
22
23
  }
24
+
23
25
  /* Remove list styles on ul, ol elements with a list role, which suggests default styling will be removed */
24
26
  ul[role="list"],
25
27
  ol[role="list"] {
26
28
  list-style: none;
27
29
  }
30
+
28
31
  /* Set core root defaults */
29
32
  html:focus-within {
30
33
  scroll-behavior: smooth;
31
34
  }
35
+
32
36
  /* Set core body defaults */
33
37
  body {
34
38
  min-height: 100vh;
35
39
  text-rendering: optimizeSpeed;
36
40
  line-height: 1.5;
37
41
  }
42
+
38
43
  /* A elements that don't have a class get default styles */
39
44
  a:not([class]) {
40
45
  text-decoration-skip-ink: auto;
41
46
  }
47
+
42
48
  /* Make images easier to work with */
43
49
  img,
44
50
  picture {
45
51
  max-width: 100%;
46
52
  display: block;
47
53
  }
54
+
48
55
  /* Inherit fonts for inputs and buttons */
49
56
  input,
50
57
  button,
@@ -52,6 +59,7 @@ textarea,
52
59
  select {
53
60
  font: inherit;
54
61
  }
62
+
55
63
  /* Remove all animations and transitions for people that prefer not to see them */
56
64
  @media (prefers-reduced-motion: reduce) {
57
65
  html:focus-within {
@@ -66,6 +74,7 @@ select {
66
74
  scroll-behavior: auto !important;
67
75
  }
68
76
  }
77
+
69
78
  /* Fonts */
70
79
  /*
71
80
  Noto Sans supports:
@@ -73,13 +82,16 @@ Noto Sans supports:
73
82
  font-stretch: {anything between 62.5% and 100%}
74
83
  font-style: {normal or italic}
75
84
  */
85
+
76
86
  /*
77
87
  Noto Serif supports:
78
88
  font-weight: {anything between 100 and 900}
79
89
  font-stretch: {anything between 62.5% and 100%}
80
90
  font-style: {normal or italic}
81
91
  */
92
+
82
93
  /* Noto Sans and Noto Serif */
94
+
83
95
  /* Tokens */
84
96
  :root {
85
97
  /* Color HSLs
@@ -400,6 +412,7 @@ Noto Sans supports:
400
412
  var(--op-input-inner-focus) var(--op-color-alerts-notice-plus-two),
401
413
  var(--op-input-outer-focus) var(--op-color-alerts-notice-plus-five);
402
414
  }
415
+
403
416
  /* Animations */
404
417
  @keyframes rm-slide-in-out-flash {
405
418
  /*
@@ -1879,10 +1892,12 @@ Noto Sans supports:
1879
1892
  --op-color-on-background: var(--op-color-neutral-on-plus-eight);
1880
1893
  --op-color-on-background-alt: var(--op-color-neutral-on-plus-eight-alt);
1881
1894
  }
1895
+
1882
1896
  /* Force Light Mode */
1883
1897
  :root[data-theme-mode='light'] {
1884
1898
  color-scheme: only light;
1885
1899
  }
1900
+
1886
1901
  /* Force Dark Mode */
1887
1902
  :root[data-theme-mode='dark'] {
1888
1903
  color-scheme: only dark;
@@ -1902,6 +1917,7 @@ Noto Sans supports:
1902
1917
  */
1903
1918
  --op-encoded-images-dropdown-arrow: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iOSIgdmlld0JveD0iMCAwIDEyIDkiIGZpbGw9IiNmZmYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik02IDguMzc1MDFMMCAyLjM3NTAxTDEuNCAwLjk3NTAwNkw2IDUuNTc1MDFMMTAuNiAwLjk3NTAwNkwxMiAyLjM3NTAxTDYgOC4zNzUwMVoiIGZpbGw9IiNmZmYiLz4KPC9zdmc+Cg==');
1904
1919
  }
1920
+
1905
1921
  @media (prefers-color-scheme: dark) {
1906
1922
  :root:not([data-theme-mode='light']) {
1907
1923
  /**
@@ -1920,13 +1936,16 @@ Noto Sans supports:
1920
1936
  --op-encoded-images-dropdown-arrow: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iOSIgdmlld0JveD0iMCAwIDEyIDkiIGZpbGw9IiNmZmYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik02IDguMzc1MDFMMCAyLjM3NTAxTDEuNCAwLjk3NTAwNkw2IDUuNTc1MDFMMTAuNiAwLjk3NTAwNkwxMiAyLjM3NTAxTDYgOC4zNzUwMVoiIGZpbGw9IiNmZmYiLz4KPC9zdmc+Cg==');
1921
1937
  }
1922
1938
  }
1939
+
1923
1940
  /* Base styles and utilities */
1924
1941
  /* After a reset, introduce base element styles specific to this system */
1942
+
1925
1943
  html {
1926
1944
  overflow: hidden; /* Needed to prevent flash messages and panels from causing overflow */
1927
1945
  font-family: var(--op-font-family);
1928
1946
  font-size: 62.5%; /* 1rem = 10px */
1929
1947
  }
1948
+
1930
1949
  body {
1931
1950
  overflow: auto;
1932
1951
  background: var(--op-color-background);
@@ -1934,14 +1953,17 @@ body {
1934
1953
  color: var(--op-color-on-background);
1935
1954
  font-size: var(--op-font-medium);
1936
1955
  }
1956
+
1937
1957
  button {
1938
1958
  background: none;
1939
1959
  cursor: pointer;
1940
1960
  }
1961
+
1941
1962
  button,
1942
1963
  input[type='submit'] {
1943
1964
  border: 0;
1944
1965
  }
1966
+
1945
1967
  label {
1946
1968
  display: inline-block;
1947
1969
 
@@ -1949,9 +1971,11 @@ label {
1949
1971
  cursor: pointer;
1950
1972
  }
1951
1973
  }
1974
+
1952
1975
  a {
1953
1976
  color: var(--op-color-primary-original);
1954
1977
  }
1978
+
1955
1979
  blockquote,
1956
1980
  dl,
1957
1981
  dd,
@@ -1965,6 +1989,7 @@ figure,
1965
1989
  pre {
1966
1990
  margin: 0;
1967
1991
  }
1992
+
1968
1993
  h1,
1969
1994
  h2,
1970
1995
  h3,
@@ -1974,28 +1999,36 @@ h6 {
1974
1999
  font-weight: var(--op-font-weight-normal);
1975
2000
  margin-block: 0 var(--op-space-small);
1976
2001
  }
2002
+
1977
2003
  h1 {
1978
2004
  font-size: var(--op-font-3x-large);
1979
2005
  }
2006
+
1980
2007
  h2 {
1981
2008
  font-size: var(--op-font-2x-large);
1982
2009
  }
2010
+
1983
2011
  h3 {
1984
2012
  font-size: var(--op-font-large);
1985
2013
  }
2014
+
1986
2015
  h4 {
1987
2016
  font-size: var(--op-font-medium);
1988
2017
  }
2018
+
1989
2019
  h5 {
1990
2020
  font-size: var(--op-font-small);
1991
2021
  }
2022
+
1992
2023
  h6 {
1993
2024
  font-size: var(--op-font-x-small);
1994
2025
  }
2026
+
1995
2027
  p {
1996
2028
  font-size: var(--op-font-medium);
1997
2029
  margin-block-end: var(--op-space-small);
1998
2030
  }
2031
+
1999
2032
  small {
2000
2033
  font-size: var(--op-font-small);
2001
2034
  }
@@ -2005,11 +2038,13 @@ small {
2005
2038
  grid-template-columns: auto 1fr auto;
2006
2039
  inline-size: 100%;
2007
2040
  }
2041
+
2008
2042
  .app-body {
2009
2043
  display: flex;
2010
2044
  overflow: auto;
2011
2045
  flex-direction: column;
2012
2046
  }
2047
+
2013
2048
  .app__header {
2014
2049
  position: sticky;
2015
2050
  z-index: var(--op-z-index-header);
@@ -2017,6 +2052,7 @@ small {
2017
2052
  flex-shrink: 0;
2018
2053
  inset-block-start: 0;
2019
2054
  }
2055
+
2020
2056
  .app__content {
2021
2057
  flex-grow: 1;
2022
2058
  padding: 0 var(--op-space-large);
@@ -2024,12 +2060,14 @@ small {
2024
2060
  inline-size: 100%;
2025
2061
  max-inline-size: var(--op-breakpoint-medium);
2026
2062
  }
2063
+
2027
2064
  .app__content-no-margin {
2028
2065
  flex-grow: 1;
2029
2066
  padding: 0 var(--op-space-large);
2030
2067
  inline-size: 100%;
2031
2068
  overflow-y: auto;
2032
2069
  }
2070
+
2033
2071
  .app__footer {
2034
2072
  position: sticky;
2035
2073
  z-index: var(--op-z-index-footer);
@@ -2037,6 +2075,7 @@ small {
2037
2075
  flex-shrink: 0;
2038
2076
  inset-block-end: 0;
2039
2077
  }
2078
+
2040
2079
  /*
2041
2080
  <html lang='en'>
2042
2081
  <head>...</head>
@@ -2051,6 +2090,7 @@ small {
2051
2090
  </body>
2052
2091
  </html>
2053
2092
  */
2093
+
2054
2094
  :root:has(.op-page) {
2055
2095
  /* Reset existing Optics layout */
2056
2096
  overflow: unset;
@@ -2068,6 +2108,7 @@ small {
2068
2108
  min-block-size: 100%;
2069
2109
  }
2070
2110
  }
2111
+
2071
2112
  .op-page {
2072
2113
  display: grid;
2073
2114
  grid-template-areas: 'sidebar-left main sidebar-right';
@@ -2142,6 +2183,7 @@ small {
2142
2183
  }
2143
2184
  }
2144
2185
  /* Container Properties */
2186
+
2145
2187
  .container {
2146
2188
  inline-size: 100%;
2147
2189
  margin-block: 0;
@@ -2150,304 +2192,408 @@ small {
2150
2192
  padding-block: 0;
2151
2193
  padding-inline: var(--op-space-large);
2152
2194
  }
2195
+
2153
2196
  .container--sm {
2154
2197
  max-inline-size: var(--op-breakpoint-small);
2155
2198
  }
2199
+
2156
2200
  .container--md-padding {
2157
2201
  padding: 0 var(--op-space-medium);
2158
2202
  }
2203
+
2159
2204
  .container--sm-padding {
2160
2205
  padding: 0 var(--op-space-small);
2161
2206
  }
2207
+
2162
2208
  .container--xs {
2163
2209
  max-inline-size: var(--op-breakpoint-x-small);
2164
2210
  }
2211
+
2165
2212
  /* Width Properties */
2213
+
2166
2214
  .full-width {
2167
2215
  inline-size: 100%;
2168
2216
  }
2217
+
2169
2218
  .half-width {
2170
2219
  inline-size: 50%;
2171
2220
  }
2221
+
2172
2222
  .four-fifths-width {
2173
2223
  inline-size: calc(100% * 4 / 5);
2174
2224
  }
2225
+
2175
2226
  .three-fifths-width {
2176
2227
  inline-size: calc(100% * 3 / 5);
2177
2228
  }
2229
+
2178
2230
  .two-fifths-width {
2179
2231
  inline-size: calc(100% * 2 / 5);
2180
2232
  }
2233
+
2181
2234
  .one-fifth-width {
2182
2235
  inline-size: calc(100% * 1 / 5);
2183
2236
  }
2237
+
2184
2238
  .three-quarters-width {
2185
2239
  inline-size: calc(100% * 3 / 4);
2186
2240
  }
2241
+
2187
2242
  .one-quarter-width {
2188
2243
  inline-size: calc(100% * 1 / 4);
2189
2244
  }
2245
+
2190
2246
  .two-thirds-width {
2191
2247
  inline-size: calc(100% * 2 / 3);
2192
2248
  }
2249
+
2193
2250
  .one-third-width {
2194
2251
  inline-size: calc(100% * 1 / 3);
2195
2252
  }
2253
+
2196
2254
  /* Flex Properties */
2255
+
2197
2256
  .flex {
2198
2257
  display: flex;
2199
2258
  }
2259
+
2200
2260
  .flex-col {
2201
2261
  flex-direction: column;
2202
2262
  }
2263
+
2203
2264
  .flex-row {
2204
2265
  flex-direction: row;
2205
2266
  }
2267
+
2206
2268
  .flex-wrap {
2207
2269
  flex-wrap: wrap;
2208
2270
  }
2271
+
2209
2272
  .flex-no-wrap {
2210
2273
  flex-wrap: nowrap;
2211
2274
  }
2275
+
2212
2276
  .flex-grow-1 {
2213
2277
  flex-grow: 1;
2214
2278
  }
2279
+
2215
2280
  /* Gap Properties */
2216
2281
  .gap-none {
2217
2282
  gap: 0;
2218
2283
 
2219
2284
  --op-gap: 0;
2220
2285
  }
2286
+
2221
2287
  .gap-xxs {
2222
2288
  gap: var(--op-space-2x-small);
2223
2289
 
2224
2290
  --op-gap: var(--op-space-2x-small);
2225
2291
  }
2292
+
2226
2293
  .gap-xs {
2227
2294
  gap: var(--op-space-x-small);
2228
2295
 
2229
2296
  --op-gap: var(--op-space-x-small);
2230
2297
  }
2298
+
2231
2299
  .gap-sm {
2232
2300
  gap: var(--op-space-small);
2233
2301
 
2234
2302
  --op-gap: var(--op-space-small);
2235
2303
  }
2304
+
2236
2305
  .gap-md {
2237
2306
  gap: var(--op-space-medium);
2238
2307
 
2239
2308
  --op-gap: var(--op-space-medium);
2240
2309
  }
2310
+
2241
2311
  .gap-lg {
2242
2312
  gap: var(--op-space-large);
2243
2313
 
2244
2314
  --op-gap: var(--op-space-large);
2245
2315
  }
2316
+
2246
2317
  .gap-xl {
2247
2318
  gap: var(--op-space-x-large);
2248
2319
 
2249
2320
  --op-gap: var(--op-space-x-large);
2250
2321
  }
2322
+
2251
2323
  /* Justify Content */
2324
+
2252
2325
  .justify-start {
2253
2326
  justify-content: flex-start;
2254
2327
  }
2328
+
2255
2329
  .justify-center {
2256
2330
  justify-content: center;
2257
2331
  }
2332
+
2258
2333
  .justify-end {
2259
2334
  justify-content: flex-end;
2260
2335
  }
2336
+
2261
2337
  .justify-between {
2262
2338
  justify-content: space-between;
2263
2339
  }
2340
+
2264
2341
  .justify-around {
2265
2342
  justify-content: space-around;
2266
2343
  }
2344
+
2267
2345
  /* Align Items */
2346
+
2268
2347
  .items-stretch {
2269
2348
  align-items: stretch;
2270
2349
  }
2350
+
2271
2351
  .items-start {
2272
2352
  align-items: flex-start;
2273
2353
  }
2354
+
2274
2355
  .items-center {
2275
2356
  align-items: center;
2276
2357
  }
2358
+
2277
2359
  .items-end {
2278
2360
  align-items: flex-end;
2279
2361
  }
2362
+
2280
2363
  .items-baseline {
2281
2364
  align-items: baseline;
2282
2365
  }
2366
+
2283
2367
  /* Align Self */
2368
+
2284
2369
  .self-auto {
2285
2370
  align-self: auto;
2286
2371
  }
2372
+
2287
2373
  .self-start {
2288
2374
  align-self: flex-start;
2289
2375
  }
2376
+
2290
2377
  .self-center {
2291
2378
  align-self: center;
2292
2379
  }
2380
+
2293
2381
  .self-end {
2294
2382
  align-self: flex-end;
2295
2383
  }
2384
+
2296
2385
  .self-stretch {
2297
2386
  align-self: stretch;
2298
2387
  }
2388
+
2299
2389
  .self-baseline {
2300
2390
  align-self: baseline;
2301
2391
  }
2392
+
2302
2393
  /* Text Alignment */
2394
+
2303
2395
  .text-left {
2304
2396
  text-align: start;
2305
2397
  }
2398
+
2306
2399
  .text-center {
2307
2400
  text-align: center;
2308
2401
  }
2402
+
2309
2403
  .text-right {
2310
2404
  text-align: end;
2311
2405
  }
2406
+
2312
2407
  .text-justify {
2313
2408
  text-align: justify;
2314
2409
  }
2410
+
2315
2411
  /* Box Margin */
2412
+
2316
2413
  .margin-xl {
2317
2414
  margin: var(--op-space-x-large);
2318
2415
  }
2416
+
2319
2417
  .margin-lg {
2320
2418
  margin: var(--op-space-large);
2321
2419
  }
2420
+
2322
2421
  .margin-md {
2323
2422
  margin: var(--op-space-medium);
2324
2423
  }
2424
+
2325
2425
  .margin-sm {
2326
2426
  margin: var(--op-space-small);
2327
2427
  }
2428
+
2328
2429
  .margin-xs {
2329
2430
  margin: var(--op-space-x-small);
2330
2431
  }
2432
+
2331
2433
  .margin-none {
2332
2434
  margin: 0;
2333
2435
  }
2436
+
2334
2437
  .margin-auto {
2335
2438
  margin: auto;
2336
2439
  }
2440
+
2337
2441
  /* Vertical Margin */
2442
+
2338
2443
  .margin-y-xl {
2339
2444
  margin-block: var(--op-space-x-large);
2340
2445
  }
2446
+
2341
2447
  .margin-y-lg {
2342
2448
  margin-block: var(--op-space-large);
2343
2449
  }
2450
+
2344
2451
  .margin-y-md {
2345
2452
  margin-block: var(--op-space-medium);
2346
2453
  }
2454
+
2347
2455
  .margin-y-sm {
2348
2456
  margin-block: var(--op-space-small);
2349
2457
  }
2458
+
2350
2459
  .margin-y-xs {
2351
2460
  margin-block: var(--op-space-x-small);
2352
2461
  }
2462
+
2353
2463
  .margin-y-none {
2354
2464
  margin-block: 0;
2355
2465
  }
2466
+
2356
2467
  /* Horizontal Margin */
2468
+
2357
2469
  .margin-x-xl {
2358
2470
  margin-inline: var(--op-space-x-large);
2359
2471
  }
2472
+
2360
2473
  .margin-x-lg {
2361
2474
  margin-inline: var(--op-space-large);
2362
2475
  }
2476
+
2363
2477
  .margin-x-md {
2364
2478
  margin-inline: var(--op-space-medium);
2365
2479
  }
2480
+
2366
2481
  .margin-x-sm {
2367
2482
  margin-inline: var(--op-space-small);
2368
2483
  }
2484
+
2369
2485
  .margin-x-xs {
2370
2486
  margin-inline: var(--op-space-x-small);
2371
2487
  }
2488
+
2372
2489
  .margin-x-none {
2373
2490
  margin-inline: 0;
2374
2491
  }
2492
+
2375
2493
  /* Top Margin */
2494
+
2376
2495
  .margin-top-xl {
2377
2496
  margin-block-start: var(--op-space-x-large);
2378
2497
  }
2498
+
2379
2499
  .margin-top-lg {
2380
2500
  margin-block-start: var(--op-space-large);
2381
2501
  }
2502
+
2382
2503
  .margin-top-md {
2383
2504
  margin-block-start: var(--op-space-medium);
2384
2505
  }
2506
+
2385
2507
  .margin-top-sm {
2386
2508
  margin-block-start: var(--op-space-small);
2387
2509
  }
2510
+
2388
2511
  .margin-top-xs {
2389
2512
  margin-block-start: var(--op-space-x-small);
2390
2513
  }
2514
+
2391
2515
  .margin-top-none {
2392
2516
  margin-block-start: 0;
2393
2517
  }
2518
+
2394
2519
  /* Bottom Margin */
2520
+
2395
2521
  .margin-bottom-xl {
2396
2522
  margin-block-end: var(--op-space-x-large);
2397
2523
  }
2524
+
2398
2525
  .margin-bottom-lg {
2399
2526
  margin-block-end: var(--op-space-large);
2400
2527
  }
2528
+
2401
2529
  .margin-bottom-md {
2402
2530
  margin-block-end: var(--op-space-medium);
2403
2531
  }
2532
+
2404
2533
  .margin-bottom-sm {
2405
2534
  margin-block-end: var(--op-space-small);
2406
2535
  }
2536
+
2407
2537
  .margin-bottom-xs {
2408
2538
  margin-block-end: var(--op-space-x-small);
2409
2539
  }
2540
+
2410
2541
  .margin-bottom-none {
2411
2542
  margin-block-end: 0;
2412
2543
  }
2544
+
2413
2545
  /* Right Margin */
2546
+
2414
2547
  .margin-right-xl {
2415
2548
  margin-inline-end: var(--op-space-x-large);
2416
2549
  }
2550
+
2417
2551
  .margin-right-lg {
2418
2552
  margin-inline-end: var(--op-space-large);
2419
2553
  }
2554
+
2420
2555
  .margin-right-md {
2421
2556
  margin-inline-end: var(--op-space-medium);
2422
2557
  }
2558
+
2423
2559
  .margin-right-sm {
2424
2560
  margin-inline-end: var(--op-space-small);
2425
2561
  }
2562
+
2426
2563
  .margin-right-xs {
2427
2564
  margin-inline-end: var(--op-space-x-small);
2428
2565
  }
2566
+
2429
2567
  .margin-right-none {
2430
2568
  margin-inline-start: 0;
2431
2569
  }
2570
+
2432
2571
  /* Left Margin */
2572
+
2433
2573
  .margin-left-xl {
2434
2574
  margin-inline-start: var(--op-space-x-large);
2435
2575
  }
2576
+
2436
2577
  .margin-left-lg {
2437
2578
  margin-inline-start: var(--op-space-large);
2438
2579
  }
2580
+
2439
2581
  .margin-left-md {
2440
2582
  margin-inline-start: var(--op-space-medium);
2441
2583
  }
2584
+
2442
2585
  .margin-left-sm {
2443
2586
  margin-inline-start: var(--op-space-small);
2444
2587
  }
2588
+
2445
2589
  .margin-left-xs {
2446
2590
  margin-inline-start: var(--op-space-x-small);
2447
2591
  }
2592
+
2448
2593
  .margin-left-none {
2449
2594
  margin-inline-start: 0;
2450
2595
  }
2596
+
2451
2597
  /*
2452
2598
  Accessibility
2453
2599
  Use the following class to hide accessibility text that is needed for screen readers but needs to be hidden from regular users.
@@ -2461,7 +2607,9 @@ small {
2461
2607
  clip: rect(1px, 1px, 1px, 1px);
2462
2608
  inline-size: 1px;
2463
2609
  }
2610
+
2464
2611
  /* Advanced Layout Utilities */
2612
+
2465
2613
  /* Equivalent to .flex.flex-col.gap-md */
2466
2614
  .op-stack {
2467
2615
  display: flex;
@@ -2474,6 +2622,7 @@ small {
2474
2622
  gap: var(--op-space-medium);
2475
2623
  }
2476
2624
  }
2625
+
2477
2626
  /* Equivalent to .flex.flex-wrap.items-center.gap-md */
2478
2627
  .op-cluster {
2479
2628
  display: flex;
@@ -2487,6 +2636,7 @@ small {
2487
2636
  gap: var(--op-space-medium);
2488
2637
  }
2489
2638
  }
2639
+
2490
2640
  /* Equivalent to .flex.flex-wrap.items-center.justify-between.gap-md */
2491
2641
  .op-split {
2492
2642
  display: flex;
@@ -2501,6 +2651,7 @@ small {
2501
2651
  gap: var(--op-space-medium);
2502
2652
  }
2503
2653
  }
2654
+
2504
2655
  /*
2505
2656
  side by side layout with a small area and a large area
2506
2657
  similar to .flex with a .flex-grow-1 within it, but with a more semantic name and wrap handling.
@@ -2534,6 +2685,7 @@ small {
2534
2685
  flex-grow: 999;
2535
2686
  }
2536
2687
  }
2688
+
2537
2689
  /* Grid Layout */
2538
2690
  .op-grid {
2539
2691
  --_op-grid-min-column-size: var(--op-space-4x-large);
@@ -2572,12 +2724,14 @@ small {
2572
2724
  --_op-grid-max-column-size: calc(100% / 7);
2573
2725
  }
2574
2726
  }
2727
+
2575
2728
  /* Frame */
2576
2729
  @property --_op-frame-inline-size {
2577
2730
  inherits: true;
2578
2731
  initial-value: 100%;
2579
2732
  syntax: '<length> | <percentage>';
2580
2733
  }
2734
+
2581
2735
  .op-frame {
2582
2736
  display: flex;
2583
2737
  overflow: hidden;
@@ -2629,6 +2783,7 @@ small {
2629
2783
  aspect-ratio: 2 / 3;
2630
2784
  }
2631
2785
  }
2786
+
2632
2787
  /* Components */
2633
2788
  .accordion {
2634
2789
  /* Public API (customizable component options) */
@@ -3387,6 +3542,7 @@ small {
3387
3542
  }
3388
3543
  }
3389
3544
  }
3545
+
3390
3546
  .btn-group-toolbar {
3391
3547
  display: flex;
3392
3548
  flex-wrap: wrap;
@@ -3500,6 +3656,7 @@ small {
3500
3656
  }
3501
3657
  }
3502
3658
  }
3659
+
3503
3660
  /* stylelint-disable no-descending-specificity */
3504
3661
  .confirm-dialog {
3505
3662
  /* Public API (customizable component options) */
@@ -3687,6 +3844,7 @@ small {
3687
3844
  /* stylelint-enable selector-no-vendor-prefix */
3688
3845
  }
3689
3846
  }
3847
+
3690
3848
  /* Radio or Checkbox Form Control */
3691
3849
  .form-control:is([type='radio'], [type='checkbox']) {
3692
3850
  /* Public API (customizable component options) */
@@ -3705,6 +3863,7 @@ small {
3705
3863
  align-self: center;
3706
3864
  }
3707
3865
  }
3866
+
3708
3867
  /* Any Form Control that is not a radio or checkbox */
3709
3868
  .form-control:not([type='radio'], [type='checkbox']) {
3710
3869
  /* Public API (customizable component options) */
@@ -3767,6 +3926,7 @@ small {
3767
3926
  }
3768
3927
  }
3769
3928
  }
3929
+
3770
3930
  /* Color Form Control */
3771
3931
  .form-control[type='color'] {
3772
3932
  padding: var(--op-space-2x-small);
@@ -3781,6 +3941,7 @@ small {
3781
3941
  border-radius: var(--op-radius-medium);
3782
3942
  }
3783
3943
  }
3944
+
3784
3945
  /* File Form Control */
3785
3946
  .form-control[type='file'] {
3786
3947
  padding-block: 0;
@@ -3816,6 +3977,7 @@ small {
3816
3977
  --__op-btn-height: calc(var(--__op-btn-base-height) - var(--op-space-x-small));
3817
3978
  }
3818
3979
  }
3980
+
3819
3981
  select.form-control:not([multiple], [type='radio'], [type='checkbox']) {
3820
3982
  appearance: none;
3821
3983
  background-image: var(--op-encoded-images-dropdown-arrow);
@@ -3827,14 +3989,17 @@ select.form-control:not([multiple], [type='radio'], [type='checkbox']) {
3827
3989
  cursor: pointer;
3828
3990
  padding-inline-end: var(--op-space-3x-large);
3829
3991
  }
3992
+
3830
3993
  select.form-control[multiple] {
3831
3994
  min-block-size: calc(2 * var(--__op-form-control-height));
3832
3995
  }
3996
+
3833
3997
  textarea.form-control:not([type='radio'], [type='checkbox']) {
3834
3998
  block-size: calc(2 * var(--__op-form-control-height));
3835
3999
  max-inline-size: 100%;
3836
4000
  min-block-size: var(--__op-form-control-height);
3837
4001
  }
4002
+
3838
4003
  .form-label {
3839
4004
  color: var(--op-color-on-background);
3840
4005
  font-size: var(--op-font-x-small);
@@ -3842,16 +4007,19 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3842
4007
  letter-spacing: var(--op-letter-spacing-label);
3843
4008
  line-height: var(--op-line-height-base);
3844
4009
  }
4010
+
3845
4011
  .form-error {
3846
4012
  color: var(--op-color-alerts-danger-base);
3847
4013
  font-size: var(--op-font-x-small);
3848
4014
  inline-size: fit-content;
3849
4015
  }
4016
+
3850
4017
  .form-hint {
3851
4018
  display: block;
3852
4019
  font-size: var(--op-font-small);
3853
4020
  font-style: italic;
3854
4021
  }
4022
+
3855
4023
  .form-error-summary {
3856
4024
  padding: var(--op-space-large);
3857
4025
  border-radius: var(--op-radius-large);
@@ -3868,6 +4036,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3868
4036
  margin-block-end: 0;
3869
4037
  }
3870
4038
  }
4039
+
3871
4040
  .form-group {
3872
4041
  display: grid;
3873
4042
  align-content: baseline;
@@ -3898,6 +4067,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3898
4067
  }
3899
4068
  }
3900
4069
  }
4070
+
3901
4071
  .form-group--inline {
3902
4072
  align-items: center;
3903
4073
 
@@ -3919,6 +4089,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3919
4089
  }
3920
4090
  /* stylelint-enable no-descending-specificity */
3921
4091
  }
4092
+
3922
4093
  .form-group--error {
3923
4094
  /* stylelint-disable no-descending-specificity */
3924
4095
  .form-control {
@@ -4008,6 +4179,13 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
4008
4179
  --_op-icon-optical-size-large: 40;
4009
4180
  --_op-icon-optical-size-x-large: 48;
4010
4181
 
4182
+ /* SVG (.icon--svg) */
4183
+ --_op-icon-stroke-width-light: 1;
4184
+ --_op-icon-stroke-width-normal: 1.5;
4185
+ --_op-icon-stroke-width-semi-bold: 2;
4186
+ --_op-icon-stroke-width-bold: 2.5;
4187
+ --_op-icon-svg-opacity-low-emphasis: 0.6;
4188
+
4011
4189
  /* Private API (component option defaults) */
4012
4190
  --__op-icon-weight: var(--_op-icon-weight-normal);
4013
4191
  --__op-icon-fill: var(--_op-icon-fill-outlined);
@@ -4035,18 +4213,22 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
4035
4213
  /* Weight Modifiers */
4036
4214
  &.icon--weight-light {
4037
4215
  --__op-icon-weight: var(--_op-icon-weight-light);
4216
+ --__op-icon-stroke-width: var(--_op-icon-stroke-width-light);
4038
4217
  }
4039
4218
 
4040
4219
  &.icon--weight-normal {
4041
4220
  --__op-icon-weight: var(--_op-icon-weight-normal);
4221
+ --__op-icon-stroke-width: var(--_op-icon-stroke-width-normal);
4042
4222
  }
4043
4223
 
4044
4224
  &.icon--weight-semi-bold {
4045
4225
  --__op-icon-weight: var(--_op-icon-weight-semi-bold);
4226
+ --__op-icon-stroke-width: var(--_op-icon-stroke-width-semi-bold);
4046
4227
  }
4047
4228
 
4048
4229
  &.icon--weight-bold {
4049
4230
  --__op-icon-weight: var(--_op-icon-weight-bold);
4231
+ --__op-icon-stroke-width: var(--_op-icon-stroke-width-bold);
4050
4232
  }
4051
4233
 
4052
4234
  /* Emphasis */
@@ -4082,7 +4264,27 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
4082
4264
  --__op-icon-font-size: var(--_op-icon-font-size-x-large);
4083
4265
  --__op-icon-optical-size: var(--_op-icon-optical-size-x-large);
4084
4266
  }
4267
+
4268
+ /* SVG Modifier: an inline SVG instead of a font glyph, e.g. `icon icon--svg icon--large` */
4269
+ &.icon--svg {
4270
+ svg {
4271
+ display: block;
4272
+ block-size: 100%;
4273
+ inline-size: 100%;
4274
+ }
4275
+
4276
+ /* A rule on the <svg> root cannot beat a stroke-width attribute on a child, so target the attribute.
4277
+ With no weight modifier the set keeps the widths it was drawn with. */
4278
+ &:is(.icon--weight-light, .icon--weight-normal, .icon--weight-semi-bold, .icon--weight-bold) svg [stroke-width] {
4279
+ stroke-width: var(--__op-icon-stroke-width);
4280
+ }
4281
+
4282
+ &.icon--low-emphasis {
4283
+ opacity: var(--_op-icon-svg-opacity-low-emphasis);
4284
+ }
4285
+ }
4085
4286
  }
4287
+
4086
4288
  /* Material Icons class provided by the Google Fonts CDN */
4087
4289
  .material-symbols-outlined {
4088
4290
  font-variation-settings:
@@ -4092,6 +4294,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
4092
4294
  'opsz' var(--__op-icon-optical-size);
4093
4295
  font-weight: unset;
4094
4296
  }
4297
+
4095
4298
  /* Custom SVG Icons app specific */
4096
4299
  .custom-icons {
4097
4300
  svg {
@@ -4141,6 +4344,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
4141
4344
  }
4142
4345
  }
4143
4346
  }
4347
+
4144
4348
  .modal {
4145
4349
  /* Public API (customizable component options) */
4146
4350
  --_op-modal-width: calc(141 * var(--op-size-unit)); /* 564px */
@@ -4186,6 +4390,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
4186
4390
  gap: var(--op-space-small);
4187
4391
  }
4188
4392
  }
4393
+
4189
4394
  dialog.modal {
4190
4395
  padding: 0;
4191
4396
  border: none;
@@ -4218,6 +4423,7 @@ dialog.modal {
4218
4423
  }
4219
4424
  }
4220
4425
  }
4426
+
4221
4427
  @starting-style {
4222
4428
  dialog.modal[open] {
4223
4429
  transform: scale(0.7);
@@ -4725,6 +4931,7 @@ dialog.modal {
4725
4931
  --__op-spinner-track-width: var(--_op-spinner-track-width-large);
4726
4932
  }
4727
4933
  }
4934
+
4728
4935
  @keyframes spinner {
4729
4936
  to {
4730
4937
  transform: rotate(360deg);
@@ -4841,6 +5048,7 @@ dialog.modal {
4841
5048
  display: flex;
4842
5049
  align-items: center;
4843
5050
  }
5051
+
4844
5052
  .tab {
4845
5053
  /* Public API */
4846
5054
  --_op-tab-font-small: var(--op-font-x-small);
@@ -5273,6 +5481,7 @@ dialog.modal {
5273
5481
  }
5274
5482
  }
5275
5483
  /* Inspired by https://blog.logrocket.com/creating-beautiful-tooltips-with-only-css/ */
5484
+
5276
5485
  [data-tooltip-text] {
5277
5486
  /* Public API (customizable component options) */
5278
5487
  --_op-tooltip-max-width: calc(50 * var(--op-size-unit)); /* 200px */