@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.
@@ -8,6 +8,7 @@
8
8
  *::after {
9
9
  box-sizing: border-box;
10
10
  }
11
+
11
12
  /* Remove default margin */
12
13
  body,
13
14
  h1,
@@ -21,31 +22,37 @@ dl,
21
22
  dd {
22
23
  margin: 0;
23
24
  }
25
+
24
26
  /* Remove list styles on ul, ol elements with a list role, which suggests default styling will be removed */
25
27
  ul[role="list"],
26
28
  ol[role="list"] {
27
29
  list-style: none;
28
30
  }
31
+
29
32
  /* Set core root defaults */
30
33
  html:focus-within {
31
34
  scroll-behavior: smooth;
32
35
  }
36
+
33
37
  /* Set core body defaults */
34
38
  body {
35
39
  min-height: 100vh;
36
40
  text-rendering: optimizeSpeed;
37
41
  line-height: 1.5;
38
42
  }
43
+
39
44
  /* A elements that don't have a class get default styles */
40
45
  a:not([class]) {
41
46
  text-decoration-skip-ink: auto;
42
47
  }
48
+
43
49
  /* Make images easier to work with */
44
50
  img,
45
51
  picture {
46
52
  max-width: 100%;
47
53
  display: block;
48
54
  }
55
+
49
56
  /* Inherit fonts for inputs and buttons */
50
57
  input,
51
58
  button,
@@ -53,6 +60,7 @@ textarea,
53
60
  select {
54
61
  font: inherit;
55
62
  }
63
+
56
64
  /* Remove all animations and transitions for people that prefer not to see them */
57
65
  @media (prefers-reduced-motion: reduce) {
58
66
  html:focus-within {
@@ -67,6 +75,7 @@ select {
67
75
  scroll-behavior: auto !important;
68
76
  }
69
77
  }
78
+
70
79
  /* Fonts */
71
80
  /*
72
81
  Instead of hosting the font files locally which requires a compiler to handle them, we pull fonts
@@ -79,19 +88,23 @@ Noto Sans supports:
79
88
  font-stretch: {anything between 62.5% and 100%}
80
89
  font-style: {normal or italic}
81
90
  */
91
+
82
92
  /*
83
93
  Noto Serif supports:
84
94
  font-weight: {anything between 100 and 900}
85
95
  font-stretch: {anything between 62.5% and 100%}
86
96
  font-style: {normal or italic}
87
97
  */
98
+
88
99
  /* Noto Sans and Noto Serif */
89
100
  /*
90
101
  See all icons at: https://fonts.google.com/icons?icon.set=Material+Symbols
91
102
  This import of Material Symbols supports:
92
103
  font weight set through: font-variation-settings: 'wght' {100..700}
93
104
  */
105
+
94
106
  /* Material Symbols */
107
+
95
108
  /* Tokens */
96
109
  :root {
97
110
  /* Color HSLs
@@ -412,6 +425,7 @@ Noto Sans supports:
412
425
  var(--op-input-inner-focus) var(--op-color-alerts-notice-plus-two),
413
426
  var(--op-input-outer-focus) var(--op-color-alerts-notice-plus-five);
414
427
  }
428
+
415
429
  /* Animations */
416
430
  @keyframes rm-slide-in-out-flash {
417
431
  /*
@@ -1891,10 +1905,12 @@ Noto Sans supports:
1891
1905
  --op-color-on-background: var(--op-color-neutral-on-plus-eight);
1892
1906
  --op-color-on-background-alt: var(--op-color-neutral-on-plus-eight-alt);
1893
1907
  }
1908
+
1894
1909
  /* Force Light Mode */
1895
1910
  :root[data-theme-mode='light'] {
1896
1911
  color-scheme: only light;
1897
1912
  }
1913
+
1898
1914
  /* Force Dark Mode */
1899
1915
  :root[data-theme-mode='dark'] {
1900
1916
  color-scheme: only dark;
@@ -1914,6 +1930,7 @@ Noto Sans supports:
1914
1930
  */
1915
1931
  --op-encoded-images-dropdown-arrow: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iOSIgdmlld0JveD0iMCAwIDEyIDkiIGZpbGw9IiNmZmYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik02IDguMzc1MDFMMCAyLjM3NTAxTDEuNCAwLjk3NTAwNkw2IDUuNTc1MDFMMTAuNiAwLjk3NTAwNkwxMiAyLjM3NTAxTDYgOC4zNzUwMVoiIGZpbGw9IiNmZmYiLz4KPC9zdmc+Cg==');
1916
1932
  }
1933
+
1917
1934
  @media (prefers-color-scheme: dark) {
1918
1935
  :root:not([data-theme-mode='light']) {
1919
1936
  /**
@@ -1932,13 +1949,16 @@ Noto Sans supports:
1932
1949
  --op-encoded-images-dropdown-arrow: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iOSIgdmlld0JveD0iMCAwIDEyIDkiIGZpbGw9IiNmZmYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik02IDguMzc1MDFMMCAyLjM3NTAxTDEuNCAwLjk3NTAwNkw2IDUuNTc1MDFMMTAuNiAwLjk3NTAwNkwxMiAyLjM3NTAxTDYgOC4zNzUwMVoiIGZpbGw9IiNmZmYiLz4KPC9zdmc+Cg==');
1933
1950
  }
1934
1951
  }
1952
+
1935
1953
  /* Base styles and utilities */
1936
1954
  /* After a reset, introduce base element styles specific to this system */
1955
+
1937
1956
  html {
1938
1957
  overflow: hidden; /* Needed to prevent flash messages and panels from causing overflow */
1939
1958
  font-family: var(--op-font-family);
1940
1959
  font-size: 62.5%; /* 1rem = 10px */
1941
1960
  }
1961
+
1942
1962
  body {
1943
1963
  overflow: auto;
1944
1964
  background: var(--op-color-background);
@@ -1946,14 +1966,17 @@ body {
1946
1966
  color: var(--op-color-on-background);
1947
1967
  font-size: var(--op-font-medium);
1948
1968
  }
1969
+
1949
1970
  button {
1950
1971
  background: none;
1951
1972
  cursor: pointer;
1952
1973
  }
1974
+
1953
1975
  button,
1954
1976
  input[type='submit'] {
1955
1977
  border: 0;
1956
1978
  }
1979
+
1957
1980
  label {
1958
1981
  display: inline-block;
1959
1982
 
@@ -1961,9 +1984,11 @@ label {
1961
1984
  cursor: pointer;
1962
1985
  }
1963
1986
  }
1987
+
1964
1988
  a {
1965
1989
  color: var(--op-color-primary-original);
1966
1990
  }
1991
+
1967
1992
  blockquote,
1968
1993
  dl,
1969
1994
  dd,
@@ -1977,6 +2002,7 @@ figure,
1977
2002
  pre {
1978
2003
  margin: 0;
1979
2004
  }
2005
+
1980
2006
  h1,
1981
2007
  h2,
1982
2008
  h3,
@@ -1986,28 +2012,36 @@ h6 {
1986
2012
  font-weight: var(--op-font-weight-normal);
1987
2013
  margin-block: 0 var(--op-space-small);
1988
2014
  }
2015
+
1989
2016
  h1 {
1990
2017
  font-size: var(--op-font-3x-large);
1991
2018
  }
2019
+
1992
2020
  h2 {
1993
2021
  font-size: var(--op-font-2x-large);
1994
2022
  }
2023
+
1995
2024
  h3 {
1996
2025
  font-size: var(--op-font-large);
1997
2026
  }
2027
+
1998
2028
  h4 {
1999
2029
  font-size: var(--op-font-medium);
2000
2030
  }
2031
+
2001
2032
  h5 {
2002
2033
  font-size: var(--op-font-small);
2003
2034
  }
2035
+
2004
2036
  h6 {
2005
2037
  font-size: var(--op-font-x-small);
2006
2038
  }
2039
+
2007
2040
  p {
2008
2041
  font-size: var(--op-font-medium);
2009
2042
  margin-block-end: var(--op-space-small);
2010
2043
  }
2044
+
2011
2045
  small {
2012
2046
  font-size: var(--op-font-small);
2013
2047
  }
@@ -2017,11 +2051,13 @@ small {
2017
2051
  grid-template-columns: auto 1fr auto;
2018
2052
  inline-size: 100%;
2019
2053
  }
2054
+
2020
2055
  .app-body {
2021
2056
  display: flex;
2022
2057
  overflow: auto;
2023
2058
  flex-direction: column;
2024
2059
  }
2060
+
2025
2061
  .app__header {
2026
2062
  position: sticky;
2027
2063
  z-index: var(--op-z-index-header);
@@ -2029,6 +2065,7 @@ small {
2029
2065
  flex-shrink: 0;
2030
2066
  inset-block-start: 0;
2031
2067
  }
2068
+
2032
2069
  .app__content {
2033
2070
  flex-grow: 1;
2034
2071
  padding: 0 var(--op-space-large);
@@ -2036,12 +2073,14 @@ small {
2036
2073
  inline-size: 100%;
2037
2074
  max-inline-size: var(--op-breakpoint-medium);
2038
2075
  }
2076
+
2039
2077
  .app__content-no-margin {
2040
2078
  flex-grow: 1;
2041
2079
  padding: 0 var(--op-space-large);
2042
2080
  inline-size: 100%;
2043
2081
  overflow-y: auto;
2044
2082
  }
2083
+
2045
2084
  .app__footer {
2046
2085
  position: sticky;
2047
2086
  z-index: var(--op-z-index-footer);
@@ -2049,6 +2088,7 @@ small {
2049
2088
  flex-shrink: 0;
2050
2089
  inset-block-end: 0;
2051
2090
  }
2091
+
2052
2092
  /*
2053
2093
  <html lang='en'>
2054
2094
  <head>...</head>
@@ -2063,6 +2103,7 @@ small {
2063
2103
  </body>
2064
2104
  </html>
2065
2105
  */
2106
+
2066
2107
  :root:has(.op-page) {
2067
2108
  /* Reset existing Optics layout */
2068
2109
  overflow: unset;
@@ -2080,6 +2121,7 @@ small {
2080
2121
  min-block-size: 100%;
2081
2122
  }
2082
2123
  }
2124
+
2083
2125
  .op-page {
2084
2126
  display: grid;
2085
2127
  grid-template-areas: 'sidebar-left main sidebar-right';
@@ -2154,6 +2196,7 @@ small {
2154
2196
  }
2155
2197
  }
2156
2198
  /* Container Properties */
2199
+
2157
2200
  .container {
2158
2201
  inline-size: 100%;
2159
2202
  margin-block: 0;
@@ -2162,304 +2205,408 @@ small {
2162
2205
  padding-block: 0;
2163
2206
  padding-inline: var(--op-space-large);
2164
2207
  }
2208
+
2165
2209
  .container--sm {
2166
2210
  max-inline-size: var(--op-breakpoint-small);
2167
2211
  }
2212
+
2168
2213
  .container--md-padding {
2169
2214
  padding: 0 var(--op-space-medium);
2170
2215
  }
2216
+
2171
2217
  .container--sm-padding {
2172
2218
  padding: 0 var(--op-space-small);
2173
2219
  }
2220
+
2174
2221
  .container--xs {
2175
2222
  max-inline-size: var(--op-breakpoint-x-small);
2176
2223
  }
2224
+
2177
2225
  /* Width Properties */
2226
+
2178
2227
  .full-width {
2179
2228
  inline-size: 100%;
2180
2229
  }
2230
+
2181
2231
  .half-width {
2182
2232
  inline-size: 50%;
2183
2233
  }
2234
+
2184
2235
  .four-fifths-width {
2185
2236
  inline-size: calc(100% * 4 / 5);
2186
2237
  }
2238
+
2187
2239
  .three-fifths-width {
2188
2240
  inline-size: calc(100% * 3 / 5);
2189
2241
  }
2242
+
2190
2243
  .two-fifths-width {
2191
2244
  inline-size: calc(100% * 2 / 5);
2192
2245
  }
2246
+
2193
2247
  .one-fifth-width {
2194
2248
  inline-size: calc(100% * 1 / 5);
2195
2249
  }
2250
+
2196
2251
  .three-quarters-width {
2197
2252
  inline-size: calc(100% * 3 / 4);
2198
2253
  }
2254
+
2199
2255
  .one-quarter-width {
2200
2256
  inline-size: calc(100% * 1 / 4);
2201
2257
  }
2258
+
2202
2259
  .two-thirds-width {
2203
2260
  inline-size: calc(100% * 2 / 3);
2204
2261
  }
2262
+
2205
2263
  .one-third-width {
2206
2264
  inline-size: calc(100% * 1 / 3);
2207
2265
  }
2266
+
2208
2267
  /* Flex Properties */
2268
+
2209
2269
  .flex {
2210
2270
  display: flex;
2211
2271
  }
2272
+
2212
2273
  .flex-col {
2213
2274
  flex-direction: column;
2214
2275
  }
2276
+
2215
2277
  .flex-row {
2216
2278
  flex-direction: row;
2217
2279
  }
2280
+
2218
2281
  .flex-wrap {
2219
2282
  flex-wrap: wrap;
2220
2283
  }
2284
+
2221
2285
  .flex-no-wrap {
2222
2286
  flex-wrap: nowrap;
2223
2287
  }
2288
+
2224
2289
  .flex-grow-1 {
2225
2290
  flex-grow: 1;
2226
2291
  }
2292
+
2227
2293
  /* Gap Properties */
2228
2294
  .gap-none {
2229
2295
  gap: 0;
2230
2296
 
2231
2297
  --op-gap: 0;
2232
2298
  }
2299
+
2233
2300
  .gap-xxs {
2234
2301
  gap: var(--op-space-2x-small);
2235
2302
 
2236
2303
  --op-gap: var(--op-space-2x-small);
2237
2304
  }
2305
+
2238
2306
  .gap-xs {
2239
2307
  gap: var(--op-space-x-small);
2240
2308
 
2241
2309
  --op-gap: var(--op-space-x-small);
2242
2310
  }
2311
+
2243
2312
  .gap-sm {
2244
2313
  gap: var(--op-space-small);
2245
2314
 
2246
2315
  --op-gap: var(--op-space-small);
2247
2316
  }
2317
+
2248
2318
  .gap-md {
2249
2319
  gap: var(--op-space-medium);
2250
2320
 
2251
2321
  --op-gap: var(--op-space-medium);
2252
2322
  }
2323
+
2253
2324
  .gap-lg {
2254
2325
  gap: var(--op-space-large);
2255
2326
 
2256
2327
  --op-gap: var(--op-space-large);
2257
2328
  }
2329
+
2258
2330
  .gap-xl {
2259
2331
  gap: var(--op-space-x-large);
2260
2332
 
2261
2333
  --op-gap: var(--op-space-x-large);
2262
2334
  }
2335
+
2263
2336
  /* Justify Content */
2337
+
2264
2338
  .justify-start {
2265
2339
  justify-content: flex-start;
2266
2340
  }
2341
+
2267
2342
  .justify-center {
2268
2343
  justify-content: center;
2269
2344
  }
2345
+
2270
2346
  .justify-end {
2271
2347
  justify-content: flex-end;
2272
2348
  }
2349
+
2273
2350
  .justify-between {
2274
2351
  justify-content: space-between;
2275
2352
  }
2353
+
2276
2354
  .justify-around {
2277
2355
  justify-content: space-around;
2278
2356
  }
2357
+
2279
2358
  /* Align Items */
2359
+
2280
2360
  .items-stretch {
2281
2361
  align-items: stretch;
2282
2362
  }
2363
+
2283
2364
  .items-start {
2284
2365
  align-items: flex-start;
2285
2366
  }
2367
+
2286
2368
  .items-center {
2287
2369
  align-items: center;
2288
2370
  }
2371
+
2289
2372
  .items-end {
2290
2373
  align-items: flex-end;
2291
2374
  }
2375
+
2292
2376
  .items-baseline {
2293
2377
  align-items: baseline;
2294
2378
  }
2379
+
2295
2380
  /* Align Self */
2381
+
2296
2382
  .self-auto {
2297
2383
  align-self: auto;
2298
2384
  }
2385
+
2299
2386
  .self-start {
2300
2387
  align-self: flex-start;
2301
2388
  }
2389
+
2302
2390
  .self-center {
2303
2391
  align-self: center;
2304
2392
  }
2393
+
2305
2394
  .self-end {
2306
2395
  align-self: flex-end;
2307
2396
  }
2397
+
2308
2398
  .self-stretch {
2309
2399
  align-self: stretch;
2310
2400
  }
2401
+
2311
2402
  .self-baseline {
2312
2403
  align-self: baseline;
2313
2404
  }
2405
+
2314
2406
  /* Text Alignment */
2407
+
2315
2408
  .text-left {
2316
2409
  text-align: start;
2317
2410
  }
2411
+
2318
2412
  .text-center {
2319
2413
  text-align: center;
2320
2414
  }
2415
+
2321
2416
  .text-right {
2322
2417
  text-align: end;
2323
2418
  }
2419
+
2324
2420
  .text-justify {
2325
2421
  text-align: justify;
2326
2422
  }
2423
+
2327
2424
  /* Box Margin */
2425
+
2328
2426
  .margin-xl {
2329
2427
  margin: var(--op-space-x-large);
2330
2428
  }
2429
+
2331
2430
  .margin-lg {
2332
2431
  margin: var(--op-space-large);
2333
2432
  }
2433
+
2334
2434
  .margin-md {
2335
2435
  margin: var(--op-space-medium);
2336
2436
  }
2437
+
2337
2438
  .margin-sm {
2338
2439
  margin: var(--op-space-small);
2339
2440
  }
2441
+
2340
2442
  .margin-xs {
2341
2443
  margin: var(--op-space-x-small);
2342
2444
  }
2445
+
2343
2446
  .margin-none {
2344
2447
  margin: 0;
2345
2448
  }
2449
+
2346
2450
  .margin-auto {
2347
2451
  margin: auto;
2348
2452
  }
2453
+
2349
2454
  /* Vertical Margin */
2455
+
2350
2456
  .margin-y-xl {
2351
2457
  margin-block: var(--op-space-x-large);
2352
2458
  }
2459
+
2353
2460
  .margin-y-lg {
2354
2461
  margin-block: var(--op-space-large);
2355
2462
  }
2463
+
2356
2464
  .margin-y-md {
2357
2465
  margin-block: var(--op-space-medium);
2358
2466
  }
2467
+
2359
2468
  .margin-y-sm {
2360
2469
  margin-block: var(--op-space-small);
2361
2470
  }
2471
+
2362
2472
  .margin-y-xs {
2363
2473
  margin-block: var(--op-space-x-small);
2364
2474
  }
2475
+
2365
2476
  .margin-y-none {
2366
2477
  margin-block: 0;
2367
2478
  }
2479
+
2368
2480
  /* Horizontal Margin */
2481
+
2369
2482
  .margin-x-xl {
2370
2483
  margin-inline: var(--op-space-x-large);
2371
2484
  }
2485
+
2372
2486
  .margin-x-lg {
2373
2487
  margin-inline: var(--op-space-large);
2374
2488
  }
2489
+
2375
2490
  .margin-x-md {
2376
2491
  margin-inline: var(--op-space-medium);
2377
2492
  }
2493
+
2378
2494
  .margin-x-sm {
2379
2495
  margin-inline: var(--op-space-small);
2380
2496
  }
2497
+
2381
2498
  .margin-x-xs {
2382
2499
  margin-inline: var(--op-space-x-small);
2383
2500
  }
2501
+
2384
2502
  .margin-x-none {
2385
2503
  margin-inline: 0;
2386
2504
  }
2505
+
2387
2506
  /* Top Margin */
2507
+
2388
2508
  .margin-top-xl {
2389
2509
  margin-block-start: var(--op-space-x-large);
2390
2510
  }
2511
+
2391
2512
  .margin-top-lg {
2392
2513
  margin-block-start: var(--op-space-large);
2393
2514
  }
2515
+
2394
2516
  .margin-top-md {
2395
2517
  margin-block-start: var(--op-space-medium);
2396
2518
  }
2519
+
2397
2520
  .margin-top-sm {
2398
2521
  margin-block-start: var(--op-space-small);
2399
2522
  }
2523
+
2400
2524
  .margin-top-xs {
2401
2525
  margin-block-start: var(--op-space-x-small);
2402
2526
  }
2527
+
2403
2528
  .margin-top-none {
2404
2529
  margin-block-start: 0;
2405
2530
  }
2531
+
2406
2532
  /* Bottom Margin */
2533
+
2407
2534
  .margin-bottom-xl {
2408
2535
  margin-block-end: var(--op-space-x-large);
2409
2536
  }
2537
+
2410
2538
  .margin-bottom-lg {
2411
2539
  margin-block-end: var(--op-space-large);
2412
2540
  }
2541
+
2413
2542
  .margin-bottom-md {
2414
2543
  margin-block-end: var(--op-space-medium);
2415
2544
  }
2545
+
2416
2546
  .margin-bottom-sm {
2417
2547
  margin-block-end: var(--op-space-small);
2418
2548
  }
2549
+
2419
2550
  .margin-bottom-xs {
2420
2551
  margin-block-end: var(--op-space-x-small);
2421
2552
  }
2553
+
2422
2554
  .margin-bottom-none {
2423
2555
  margin-block-end: 0;
2424
2556
  }
2557
+
2425
2558
  /* Right Margin */
2559
+
2426
2560
  .margin-right-xl {
2427
2561
  margin-inline-end: var(--op-space-x-large);
2428
2562
  }
2563
+
2429
2564
  .margin-right-lg {
2430
2565
  margin-inline-end: var(--op-space-large);
2431
2566
  }
2567
+
2432
2568
  .margin-right-md {
2433
2569
  margin-inline-end: var(--op-space-medium);
2434
2570
  }
2571
+
2435
2572
  .margin-right-sm {
2436
2573
  margin-inline-end: var(--op-space-small);
2437
2574
  }
2575
+
2438
2576
  .margin-right-xs {
2439
2577
  margin-inline-end: var(--op-space-x-small);
2440
2578
  }
2579
+
2441
2580
  .margin-right-none {
2442
2581
  margin-inline-start: 0;
2443
2582
  }
2583
+
2444
2584
  /* Left Margin */
2585
+
2445
2586
  .margin-left-xl {
2446
2587
  margin-inline-start: var(--op-space-x-large);
2447
2588
  }
2589
+
2448
2590
  .margin-left-lg {
2449
2591
  margin-inline-start: var(--op-space-large);
2450
2592
  }
2593
+
2451
2594
  .margin-left-md {
2452
2595
  margin-inline-start: var(--op-space-medium);
2453
2596
  }
2597
+
2454
2598
  .margin-left-sm {
2455
2599
  margin-inline-start: var(--op-space-small);
2456
2600
  }
2601
+
2457
2602
  .margin-left-xs {
2458
2603
  margin-inline-start: var(--op-space-x-small);
2459
2604
  }
2605
+
2460
2606
  .margin-left-none {
2461
2607
  margin-inline-start: 0;
2462
2608
  }
2609
+
2463
2610
  /*
2464
2611
  Accessibility
2465
2612
  Use the following class to hide accessibility text that is needed for screen readers but needs to be hidden from regular users.
@@ -2473,7 +2620,9 @@ small {
2473
2620
  clip: rect(1px, 1px, 1px, 1px);
2474
2621
  inline-size: 1px;
2475
2622
  }
2623
+
2476
2624
  /* Advanced Layout Utilities */
2625
+
2477
2626
  /* Equivalent to .flex.flex-col.gap-md */
2478
2627
  .op-stack {
2479
2628
  display: flex;
@@ -2486,6 +2635,7 @@ small {
2486
2635
  gap: var(--op-space-medium);
2487
2636
  }
2488
2637
  }
2638
+
2489
2639
  /* Equivalent to .flex.flex-wrap.items-center.gap-md */
2490
2640
  .op-cluster {
2491
2641
  display: flex;
@@ -2499,6 +2649,7 @@ small {
2499
2649
  gap: var(--op-space-medium);
2500
2650
  }
2501
2651
  }
2652
+
2502
2653
  /* Equivalent to .flex.flex-wrap.items-center.justify-between.gap-md */
2503
2654
  .op-split {
2504
2655
  display: flex;
@@ -2513,6 +2664,7 @@ small {
2513
2664
  gap: var(--op-space-medium);
2514
2665
  }
2515
2666
  }
2667
+
2516
2668
  /*
2517
2669
  side by side layout with a small area and a large area
2518
2670
  similar to .flex with a .flex-grow-1 within it, but with a more semantic name and wrap handling.
@@ -2546,6 +2698,7 @@ small {
2546
2698
  flex-grow: 999;
2547
2699
  }
2548
2700
  }
2701
+
2549
2702
  /* Grid Layout */
2550
2703
  .op-grid {
2551
2704
  --_op-grid-min-column-size: var(--op-space-4x-large);
@@ -2584,12 +2737,14 @@ small {
2584
2737
  --_op-grid-max-column-size: calc(100% / 7);
2585
2738
  }
2586
2739
  }
2740
+
2587
2741
  /* Frame */
2588
2742
  @property --_op-frame-inline-size {
2589
2743
  inherits: true;
2590
2744
  initial-value: 100%;
2591
2745
  syntax: '<length> | <percentage>';
2592
2746
  }
2747
+
2593
2748
  .op-frame {
2594
2749
  display: flex;
2595
2750
  overflow: hidden;
@@ -2641,6 +2796,7 @@ small {
2641
2796
  aspect-ratio: 2 / 3;
2642
2797
  }
2643
2798
  }
2799
+
2644
2800
  /* Components */
2645
2801
  .accordion {
2646
2802
  /* Public API (customizable component options) */
@@ -3399,6 +3555,7 @@ small {
3399
3555
  }
3400
3556
  }
3401
3557
  }
3558
+
3402
3559
  .btn-group-toolbar {
3403
3560
  display: flex;
3404
3561
  flex-wrap: wrap;
@@ -3512,6 +3669,7 @@ small {
3512
3669
  }
3513
3670
  }
3514
3671
  }
3672
+
3515
3673
  /* stylelint-disable no-descending-specificity */
3516
3674
  .confirm-dialog {
3517
3675
  /* Public API (customizable component options) */
@@ -3699,6 +3857,7 @@ small {
3699
3857
  /* stylelint-enable selector-no-vendor-prefix */
3700
3858
  }
3701
3859
  }
3860
+
3702
3861
  /* Radio or Checkbox Form Control */
3703
3862
  .form-control:is([type='radio'], [type='checkbox']) {
3704
3863
  /* Public API (customizable component options) */
@@ -3717,6 +3876,7 @@ small {
3717
3876
  align-self: center;
3718
3877
  }
3719
3878
  }
3879
+
3720
3880
  /* Any Form Control that is not a radio or checkbox */
3721
3881
  .form-control:not([type='radio'], [type='checkbox']) {
3722
3882
  /* Public API (customizable component options) */
@@ -3779,6 +3939,7 @@ small {
3779
3939
  }
3780
3940
  }
3781
3941
  }
3942
+
3782
3943
  /* Color Form Control */
3783
3944
  .form-control[type='color'] {
3784
3945
  padding: var(--op-space-2x-small);
@@ -3793,6 +3954,7 @@ small {
3793
3954
  border-radius: var(--op-radius-medium);
3794
3955
  }
3795
3956
  }
3957
+
3796
3958
  /* File Form Control */
3797
3959
  .form-control[type='file'] {
3798
3960
  padding-block: 0;
@@ -3828,6 +3990,7 @@ small {
3828
3990
  --__op-btn-height: calc(var(--__op-btn-base-height) - var(--op-space-x-small));
3829
3991
  }
3830
3992
  }
3993
+
3831
3994
  select.form-control:not([multiple], [type='radio'], [type='checkbox']) {
3832
3995
  appearance: none;
3833
3996
  background-image: var(--op-encoded-images-dropdown-arrow);
@@ -3839,14 +4002,17 @@ select.form-control:not([multiple], [type='radio'], [type='checkbox']) {
3839
4002
  cursor: pointer;
3840
4003
  padding-inline-end: var(--op-space-3x-large);
3841
4004
  }
4005
+
3842
4006
  select.form-control[multiple] {
3843
4007
  min-block-size: calc(2 * var(--__op-form-control-height));
3844
4008
  }
4009
+
3845
4010
  textarea.form-control:not([type='radio'], [type='checkbox']) {
3846
4011
  block-size: calc(2 * var(--__op-form-control-height));
3847
4012
  max-inline-size: 100%;
3848
4013
  min-block-size: var(--__op-form-control-height);
3849
4014
  }
4015
+
3850
4016
  .form-label {
3851
4017
  color: var(--op-color-on-background);
3852
4018
  font-size: var(--op-font-x-small);
@@ -3854,16 +4020,19 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3854
4020
  letter-spacing: var(--op-letter-spacing-label);
3855
4021
  line-height: var(--op-line-height-base);
3856
4022
  }
4023
+
3857
4024
  .form-error {
3858
4025
  color: var(--op-color-alerts-danger-base);
3859
4026
  font-size: var(--op-font-x-small);
3860
4027
  inline-size: fit-content;
3861
4028
  }
4029
+
3862
4030
  .form-hint {
3863
4031
  display: block;
3864
4032
  font-size: var(--op-font-small);
3865
4033
  font-style: italic;
3866
4034
  }
4035
+
3867
4036
  .form-error-summary {
3868
4037
  padding: var(--op-space-large);
3869
4038
  border-radius: var(--op-radius-large);
@@ -3880,6 +4049,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3880
4049
  margin-block-end: 0;
3881
4050
  }
3882
4051
  }
4052
+
3883
4053
  .form-group {
3884
4054
  display: grid;
3885
4055
  align-content: baseline;
@@ -3910,6 +4080,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3910
4080
  }
3911
4081
  }
3912
4082
  }
4083
+
3913
4084
  .form-group--inline {
3914
4085
  align-items: center;
3915
4086
 
@@ -3931,6 +4102,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3931
4102
  }
3932
4103
  /* stylelint-enable no-descending-specificity */
3933
4104
  }
4105
+
3934
4106
  .form-group--error {
3935
4107
  /* stylelint-disable no-descending-specificity */
3936
4108
  .form-control {
@@ -4020,6 +4192,13 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
4020
4192
  --_op-icon-optical-size-large: 40;
4021
4193
  --_op-icon-optical-size-x-large: 48;
4022
4194
 
4195
+ /* SVG (.icon--svg) */
4196
+ --_op-icon-stroke-width-light: 1;
4197
+ --_op-icon-stroke-width-normal: 1.5;
4198
+ --_op-icon-stroke-width-semi-bold: 2;
4199
+ --_op-icon-stroke-width-bold: 2.5;
4200
+ --_op-icon-svg-opacity-low-emphasis: 0.6;
4201
+
4023
4202
  /* Private API (component option defaults) */
4024
4203
  --__op-icon-weight: var(--_op-icon-weight-normal);
4025
4204
  --__op-icon-fill: var(--_op-icon-fill-outlined);
@@ -4047,18 +4226,22 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
4047
4226
  /* Weight Modifiers */
4048
4227
  &.icon--weight-light {
4049
4228
  --__op-icon-weight: var(--_op-icon-weight-light);
4229
+ --__op-icon-stroke-width: var(--_op-icon-stroke-width-light);
4050
4230
  }
4051
4231
 
4052
4232
  &.icon--weight-normal {
4053
4233
  --__op-icon-weight: var(--_op-icon-weight-normal);
4234
+ --__op-icon-stroke-width: var(--_op-icon-stroke-width-normal);
4054
4235
  }
4055
4236
 
4056
4237
  &.icon--weight-semi-bold {
4057
4238
  --__op-icon-weight: var(--_op-icon-weight-semi-bold);
4239
+ --__op-icon-stroke-width: var(--_op-icon-stroke-width-semi-bold);
4058
4240
  }
4059
4241
 
4060
4242
  &.icon--weight-bold {
4061
4243
  --__op-icon-weight: var(--_op-icon-weight-bold);
4244
+ --__op-icon-stroke-width: var(--_op-icon-stroke-width-bold);
4062
4245
  }
4063
4246
 
4064
4247
  /* Emphasis */
@@ -4094,7 +4277,27 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
4094
4277
  --__op-icon-font-size: var(--_op-icon-font-size-x-large);
4095
4278
  --__op-icon-optical-size: var(--_op-icon-optical-size-x-large);
4096
4279
  }
4280
+
4281
+ /* SVG Modifier: an inline SVG instead of a font glyph, e.g. `icon icon--svg icon--large` */
4282
+ &.icon--svg {
4283
+ svg {
4284
+ display: block;
4285
+ block-size: 100%;
4286
+ inline-size: 100%;
4287
+ }
4288
+
4289
+ /* A rule on the <svg> root cannot beat a stroke-width attribute on a child, so target the attribute.
4290
+ With no weight modifier the set keeps the widths it was drawn with. */
4291
+ &:is(.icon--weight-light, .icon--weight-normal, .icon--weight-semi-bold, .icon--weight-bold) svg [stroke-width] {
4292
+ stroke-width: var(--__op-icon-stroke-width);
4293
+ }
4294
+
4295
+ &.icon--low-emphasis {
4296
+ opacity: var(--_op-icon-svg-opacity-low-emphasis);
4297
+ }
4298
+ }
4097
4299
  }
4300
+
4098
4301
  /* Material Icons class provided by the Google Fonts CDN */
4099
4302
  .material-symbols-outlined {
4100
4303
  font-variation-settings:
@@ -4104,6 +4307,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
4104
4307
  'opsz' var(--__op-icon-optical-size);
4105
4308
  font-weight: unset;
4106
4309
  }
4310
+
4107
4311
  /* Custom SVG Icons app specific */
4108
4312
  .custom-icons {
4109
4313
  svg {
@@ -4153,6 +4357,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
4153
4357
  }
4154
4358
  }
4155
4359
  }
4360
+
4156
4361
  .modal {
4157
4362
  /* Public API (customizable component options) */
4158
4363
  --_op-modal-width: calc(141 * var(--op-size-unit)); /* 564px */
@@ -4198,6 +4403,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
4198
4403
  gap: var(--op-space-small);
4199
4404
  }
4200
4405
  }
4406
+
4201
4407
  dialog.modal {
4202
4408
  padding: 0;
4203
4409
  border: none;
@@ -4230,6 +4436,7 @@ dialog.modal {
4230
4436
  }
4231
4437
  }
4232
4438
  }
4439
+
4233
4440
  @starting-style {
4234
4441
  dialog.modal[open] {
4235
4442
  transform: scale(0.7);
@@ -4737,6 +4944,7 @@ dialog.modal {
4737
4944
  --__op-spinner-track-width: var(--_op-spinner-track-width-large);
4738
4945
  }
4739
4946
  }
4947
+
4740
4948
  @keyframes spinner {
4741
4949
  to {
4742
4950
  transform: rotate(360deg);
@@ -4853,6 +5061,7 @@ dialog.modal {
4853
5061
  display: flex;
4854
5062
  align-items: center;
4855
5063
  }
5064
+
4856
5065
  .tab {
4857
5066
  /* Public API */
4858
5067
  --_op-tab-font-small: var(--op-font-x-small);
@@ -5285,6 +5494,7 @@ dialog.modal {
5285
5494
  }
5286
5495
  }
5287
5496
  /* Inspired by https://blog.logrocket.com/creating-beautiful-tooltips-with-only-css/ */
5497
+
5288
5498
  [data-tooltip-text] {
5289
5499
  /* Public API (customizable component options) */
5290
5500
  --_op-tooltip-max-width: calc(50 * var(--op-size-unit)); /* 200px */