@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
  Noto Sans supports:
@@ -74,12 +83,14 @@ Noto Sans supports:
74
83
  font-stretch: {anything between 62.5% and 100%}
75
84
  font-style: {normal or italic}
76
85
  */
86
+
77
87
  /*
78
88
  Noto Serif supports:
79
89
  font-weight: {anything between 100 and 900}
80
90
  font-stretch: {anything between 62.5% and 100%}
81
91
  font-style: {normal or italic}
82
92
  */
93
+
83
94
  /* Noto Sans and Noto Serif */
84
95
  /*
85
96
  See all icons at: https://fonts.google.com/icons?icon.set=Material+Symbols
@@ -89,6 +100,7 @@ Noto Sans supports:
89
100
  fill set through: font-variation-settings: 'FILL' {0|1}
90
101
  emphasis set through: font-variation-settings: 'GRAD' {-50|0|200}
91
102
  */
103
+
92
104
  /* Tokens */
93
105
  :root {
94
106
  /* Color HSLs
@@ -409,6 +421,7 @@ Noto Sans supports:
409
421
  var(--op-input-inner-focus) var(--op-color-alerts-notice-plus-two),
410
422
  var(--op-input-outer-focus) var(--op-color-alerts-notice-plus-five);
411
423
  }
424
+
412
425
  /* Animations */
413
426
  @keyframes rm-slide-in-out-flash {
414
427
  /*
@@ -1888,10 +1901,12 @@ Noto Sans supports:
1888
1901
  --op-color-on-background: var(--op-color-neutral-on-plus-eight);
1889
1902
  --op-color-on-background-alt: var(--op-color-neutral-on-plus-eight-alt);
1890
1903
  }
1904
+
1891
1905
  /* Force Light Mode */
1892
1906
  :root[data-theme-mode='light'] {
1893
1907
  color-scheme: only light;
1894
1908
  }
1909
+
1895
1910
  /* Force Dark Mode */
1896
1911
  :root[data-theme-mode='dark'] {
1897
1912
  color-scheme: only dark;
@@ -1911,6 +1926,7 @@ Noto Sans supports:
1911
1926
  */
1912
1927
  --op-encoded-images-dropdown-arrow: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iOSIgdmlld0JveD0iMCAwIDEyIDkiIGZpbGw9IiNmZmYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik02IDguMzc1MDFMMCAyLjM3NTAxTDEuNCAwLjk3NTAwNkw2IDUuNTc1MDFMMTAuNiAwLjk3NTAwNkwxMiAyLjM3NTAxTDYgOC4zNzUwMVoiIGZpbGw9IiNmZmYiLz4KPC9zdmc+Cg==');
1913
1928
  }
1929
+
1914
1930
  @media (prefers-color-scheme: dark) {
1915
1931
  :root:not([data-theme-mode='light']) {
1916
1932
  /**
@@ -1929,13 +1945,16 @@ Noto Sans supports:
1929
1945
  --op-encoded-images-dropdown-arrow: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iOSIgdmlld0JveD0iMCAwIDEyIDkiIGZpbGw9IiNmZmYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik02IDguMzc1MDFMMCAyLjM3NTAxTDEuNCAwLjk3NTAwNkw2IDUuNTc1MDFMMTAuNiAwLjk3NTAwNkwxMiAyLjM3NTAxTDYgOC4zNzUwMVoiIGZpbGw9IiNmZmYiLz4KPC9zdmc+Cg==');
1930
1946
  }
1931
1947
  }
1948
+
1932
1949
  /* Base styles and utilities */
1933
1950
  /* After a reset, introduce base element styles specific to this system */
1951
+
1934
1952
  html {
1935
1953
  overflow: hidden; /* Needed to prevent flash messages and panels from causing overflow */
1936
1954
  font-family: var(--op-font-family);
1937
1955
  font-size: 62.5%; /* 1rem = 10px */
1938
1956
  }
1957
+
1939
1958
  body {
1940
1959
  overflow: auto;
1941
1960
  background: var(--op-color-background);
@@ -1943,14 +1962,17 @@ body {
1943
1962
  color: var(--op-color-on-background);
1944
1963
  font-size: var(--op-font-medium);
1945
1964
  }
1965
+
1946
1966
  button {
1947
1967
  background: none;
1948
1968
  cursor: pointer;
1949
1969
  }
1970
+
1950
1971
  button,
1951
1972
  input[type='submit'] {
1952
1973
  border: 0;
1953
1974
  }
1975
+
1954
1976
  label {
1955
1977
  display: inline-block;
1956
1978
 
@@ -1958,9 +1980,11 @@ label {
1958
1980
  cursor: pointer;
1959
1981
  }
1960
1982
  }
1983
+
1961
1984
  a {
1962
1985
  color: var(--op-color-primary-original);
1963
1986
  }
1987
+
1964
1988
  blockquote,
1965
1989
  dl,
1966
1990
  dd,
@@ -1974,6 +1998,7 @@ figure,
1974
1998
  pre {
1975
1999
  margin: 0;
1976
2000
  }
2001
+
1977
2002
  h1,
1978
2003
  h2,
1979
2004
  h3,
@@ -1983,28 +2008,36 @@ h6 {
1983
2008
  font-weight: var(--op-font-weight-normal);
1984
2009
  margin-block: 0 var(--op-space-small);
1985
2010
  }
2011
+
1986
2012
  h1 {
1987
2013
  font-size: var(--op-font-3x-large);
1988
2014
  }
2015
+
1989
2016
  h2 {
1990
2017
  font-size: var(--op-font-2x-large);
1991
2018
  }
2019
+
1992
2020
  h3 {
1993
2021
  font-size: var(--op-font-large);
1994
2022
  }
2023
+
1995
2024
  h4 {
1996
2025
  font-size: var(--op-font-medium);
1997
2026
  }
2027
+
1998
2028
  h5 {
1999
2029
  font-size: var(--op-font-small);
2000
2030
  }
2031
+
2001
2032
  h6 {
2002
2033
  font-size: var(--op-font-x-small);
2003
2034
  }
2035
+
2004
2036
  p {
2005
2037
  font-size: var(--op-font-medium);
2006
2038
  margin-block-end: var(--op-space-small);
2007
2039
  }
2040
+
2008
2041
  small {
2009
2042
  font-size: var(--op-font-small);
2010
2043
  }
@@ -2014,11 +2047,13 @@ small {
2014
2047
  grid-template-columns: auto 1fr auto;
2015
2048
  inline-size: 100%;
2016
2049
  }
2050
+
2017
2051
  .app-body {
2018
2052
  display: flex;
2019
2053
  overflow: auto;
2020
2054
  flex-direction: column;
2021
2055
  }
2056
+
2022
2057
  .app__header {
2023
2058
  position: sticky;
2024
2059
  z-index: var(--op-z-index-header);
@@ -2026,6 +2061,7 @@ small {
2026
2061
  flex-shrink: 0;
2027
2062
  inset-block-start: 0;
2028
2063
  }
2064
+
2029
2065
  .app__content {
2030
2066
  flex-grow: 1;
2031
2067
  padding: 0 var(--op-space-large);
@@ -2033,12 +2069,14 @@ small {
2033
2069
  inline-size: 100%;
2034
2070
  max-inline-size: var(--op-breakpoint-medium);
2035
2071
  }
2072
+
2036
2073
  .app__content-no-margin {
2037
2074
  flex-grow: 1;
2038
2075
  padding: 0 var(--op-space-large);
2039
2076
  inline-size: 100%;
2040
2077
  overflow-y: auto;
2041
2078
  }
2079
+
2042
2080
  .app__footer {
2043
2081
  position: sticky;
2044
2082
  z-index: var(--op-z-index-footer);
@@ -2046,6 +2084,7 @@ small {
2046
2084
  flex-shrink: 0;
2047
2085
  inset-block-end: 0;
2048
2086
  }
2087
+
2049
2088
  /*
2050
2089
  <html lang='en'>
2051
2090
  <head>...</head>
@@ -2060,6 +2099,7 @@ small {
2060
2099
  </body>
2061
2100
  </html>
2062
2101
  */
2102
+
2063
2103
  :root:has(.op-page) {
2064
2104
  /* Reset existing Optics layout */
2065
2105
  overflow: unset;
@@ -2077,6 +2117,7 @@ small {
2077
2117
  min-block-size: 100%;
2078
2118
  }
2079
2119
  }
2120
+
2080
2121
  .op-page {
2081
2122
  display: grid;
2082
2123
  grid-template-areas: 'sidebar-left main sidebar-right';
@@ -2151,6 +2192,7 @@ small {
2151
2192
  }
2152
2193
  }
2153
2194
  /* Container Properties */
2195
+
2154
2196
  .container {
2155
2197
  inline-size: 100%;
2156
2198
  margin-block: 0;
@@ -2159,304 +2201,408 @@ small {
2159
2201
  padding-block: 0;
2160
2202
  padding-inline: var(--op-space-large);
2161
2203
  }
2204
+
2162
2205
  .container--sm {
2163
2206
  max-inline-size: var(--op-breakpoint-small);
2164
2207
  }
2208
+
2165
2209
  .container--md-padding {
2166
2210
  padding: 0 var(--op-space-medium);
2167
2211
  }
2212
+
2168
2213
  .container--sm-padding {
2169
2214
  padding: 0 var(--op-space-small);
2170
2215
  }
2216
+
2171
2217
  .container--xs {
2172
2218
  max-inline-size: var(--op-breakpoint-x-small);
2173
2219
  }
2220
+
2174
2221
  /* Width Properties */
2222
+
2175
2223
  .full-width {
2176
2224
  inline-size: 100%;
2177
2225
  }
2226
+
2178
2227
  .half-width {
2179
2228
  inline-size: 50%;
2180
2229
  }
2230
+
2181
2231
  .four-fifths-width {
2182
2232
  inline-size: calc(100% * 4 / 5);
2183
2233
  }
2234
+
2184
2235
  .three-fifths-width {
2185
2236
  inline-size: calc(100% * 3 / 5);
2186
2237
  }
2238
+
2187
2239
  .two-fifths-width {
2188
2240
  inline-size: calc(100% * 2 / 5);
2189
2241
  }
2242
+
2190
2243
  .one-fifth-width {
2191
2244
  inline-size: calc(100% * 1 / 5);
2192
2245
  }
2246
+
2193
2247
  .three-quarters-width {
2194
2248
  inline-size: calc(100% * 3 / 4);
2195
2249
  }
2250
+
2196
2251
  .one-quarter-width {
2197
2252
  inline-size: calc(100% * 1 / 4);
2198
2253
  }
2254
+
2199
2255
  .two-thirds-width {
2200
2256
  inline-size: calc(100% * 2 / 3);
2201
2257
  }
2258
+
2202
2259
  .one-third-width {
2203
2260
  inline-size: calc(100% * 1 / 3);
2204
2261
  }
2262
+
2205
2263
  /* Flex Properties */
2264
+
2206
2265
  .flex {
2207
2266
  display: flex;
2208
2267
  }
2268
+
2209
2269
  .flex-col {
2210
2270
  flex-direction: column;
2211
2271
  }
2272
+
2212
2273
  .flex-row {
2213
2274
  flex-direction: row;
2214
2275
  }
2276
+
2215
2277
  .flex-wrap {
2216
2278
  flex-wrap: wrap;
2217
2279
  }
2280
+
2218
2281
  .flex-no-wrap {
2219
2282
  flex-wrap: nowrap;
2220
2283
  }
2284
+
2221
2285
  .flex-grow-1 {
2222
2286
  flex-grow: 1;
2223
2287
  }
2288
+
2224
2289
  /* Gap Properties */
2225
2290
  .gap-none {
2226
2291
  gap: 0;
2227
2292
 
2228
2293
  --op-gap: 0;
2229
2294
  }
2295
+
2230
2296
  .gap-xxs {
2231
2297
  gap: var(--op-space-2x-small);
2232
2298
 
2233
2299
  --op-gap: var(--op-space-2x-small);
2234
2300
  }
2301
+
2235
2302
  .gap-xs {
2236
2303
  gap: var(--op-space-x-small);
2237
2304
 
2238
2305
  --op-gap: var(--op-space-x-small);
2239
2306
  }
2307
+
2240
2308
  .gap-sm {
2241
2309
  gap: var(--op-space-small);
2242
2310
 
2243
2311
  --op-gap: var(--op-space-small);
2244
2312
  }
2313
+
2245
2314
  .gap-md {
2246
2315
  gap: var(--op-space-medium);
2247
2316
 
2248
2317
  --op-gap: var(--op-space-medium);
2249
2318
  }
2319
+
2250
2320
  .gap-lg {
2251
2321
  gap: var(--op-space-large);
2252
2322
 
2253
2323
  --op-gap: var(--op-space-large);
2254
2324
  }
2325
+
2255
2326
  .gap-xl {
2256
2327
  gap: var(--op-space-x-large);
2257
2328
 
2258
2329
  --op-gap: var(--op-space-x-large);
2259
2330
  }
2331
+
2260
2332
  /* Justify Content */
2333
+
2261
2334
  .justify-start {
2262
2335
  justify-content: flex-start;
2263
2336
  }
2337
+
2264
2338
  .justify-center {
2265
2339
  justify-content: center;
2266
2340
  }
2341
+
2267
2342
  .justify-end {
2268
2343
  justify-content: flex-end;
2269
2344
  }
2345
+
2270
2346
  .justify-between {
2271
2347
  justify-content: space-between;
2272
2348
  }
2349
+
2273
2350
  .justify-around {
2274
2351
  justify-content: space-around;
2275
2352
  }
2353
+
2276
2354
  /* Align Items */
2355
+
2277
2356
  .items-stretch {
2278
2357
  align-items: stretch;
2279
2358
  }
2359
+
2280
2360
  .items-start {
2281
2361
  align-items: flex-start;
2282
2362
  }
2363
+
2283
2364
  .items-center {
2284
2365
  align-items: center;
2285
2366
  }
2367
+
2286
2368
  .items-end {
2287
2369
  align-items: flex-end;
2288
2370
  }
2371
+
2289
2372
  .items-baseline {
2290
2373
  align-items: baseline;
2291
2374
  }
2375
+
2292
2376
  /* Align Self */
2377
+
2293
2378
  .self-auto {
2294
2379
  align-self: auto;
2295
2380
  }
2381
+
2296
2382
  .self-start {
2297
2383
  align-self: flex-start;
2298
2384
  }
2385
+
2299
2386
  .self-center {
2300
2387
  align-self: center;
2301
2388
  }
2389
+
2302
2390
  .self-end {
2303
2391
  align-self: flex-end;
2304
2392
  }
2393
+
2305
2394
  .self-stretch {
2306
2395
  align-self: stretch;
2307
2396
  }
2397
+
2308
2398
  .self-baseline {
2309
2399
  align-self: baseline;
2310
2400
  }
2401
+
2311
2402
  /* Text Alignment */
2403
+
2312
2404
  .text-left {
2313
2405
  text-align: start;
2314
2406
  }
2407
+
2315
2408
  .text-center {
2316
2409
  text-align: center;
2317
2410
  }
2411
+
2318
2412
  .text-right {
2319
2413
  text-align: end;
2320
2414
  }
2415
+
2321
2416
  .text-justify {
2322
2417
  text-align: justify;
2323
2418
  }
2419
+
2324
2420
  /* Box Margin */
2421
+
2325
2422
  .margin-xl {
2326
2423
  margin: var(--op-space-x-large);
2327
2424
  }
2425
+
2328
2426
  .margin-lg {
2329
2427
  margin: var(--op-space-large);
2330
2428
  }
2429
+
2331
2430
  .margin-md {
2332
2431
  margin: var(--op-space-medium);
2333
2432
  }
2433
+
2334
2434
  .margin-sm {
2335
2435
  margin: var(--op-space-small);
2336
2436
  }
2437
+
2337
2438
  .margin-xs {
2338
2439
  margin: var(--op-space-x-small);
2339
2440
  }
2441
+
2340
2442
  .margin-none {
2341
2443
  margin: 0;
2342
2444
  }
2445
+
2343
2446
  .margin-auto {
2344
2447
  margin: auto;
2345
2448
  }
2449
+
2346
2450
  /* Vertical Margin */
2451
+
2347
2452
  .margin-y-xl {
2348
2453
  margin-block: var(--op-space-x-large);
2349
2454
  }
2455
+
2350
2456
  .margin-y-lg {
2351
2457
  margin-block: var(--op-space-large);
2352
2458
  }
2459
+
2353
2460
  .margin-y-md {
2354
2461
  margin-block: var(--op-space-medium);
2355
2462
  }
2463
+
2356
2464
  .margin-y-sm {
2357
2465
  margin-block: var(--op-space-small);
2358
2466
  }
2467
+
2359
2468
  .margin-y-xs {
2360
2469
  margin-block: var(--op-space-x-small);
2361
2470
  }
2471
+
2362
2472
  .margin-y-none {
2363
2473
  margin-block: 0;
2364
2474
  }
2475
+
2365
2476
  /* Horizontal Margin */
2477
+
2366
2478
  .margin-x-xl {
2367
2479
  margin-inline: var(--op-space-x-large);
2368
2480
  }
2481
+
2369
2482
  .margin-x-lg {
2370
2483
  margin-inline: var(--op-space-large);
2371
2484
  }
2485
+
2372
2486
  .margin-x-md {
2373
2487
  margin-inline: var(--op-space-medium);
2374
2488
  }
2489
+
2375
2490
  .margin-x-sm {
2376
2491
  margin-inline: var(--op-space-small);
2377
2492
  }
2493
+
2378
2494
  .margin-x-xs {
2379
2495
  margin-inline: var(--op-space-x-small);
2380
2496
  }
2497
+
2381
2498
  .margin-x-none {
2382
2499
  margin-inline: 0;
2383
2500
  }
2501
+
2384
2502
  /* Top Margin */
2503
+
2385
2504
  .margin-top-xl {
2386
2505
  margin-block-start: var(--op-space-x-large);
2387
2506
  }
2507
+
2388
2508
  .margin-top-lg {
2389
2509
  margin-block-start: var(--op-space-large);
2390
2510
  }
2511
+
2391
2512
  .margin-top-md {
2392
2513
  margin-block-start: var(--op-space-medium);
2393
2514
  }
2515
+
2394
2516
  .margin-top-sm {
2395
2517
  margin-block-start: var(--op-space-small);
2396
2518
  }
2519
+
2397
2520
  .margin-top-xs {
2398
2521
  margin-block-start: var(--op-space-x-small);
2399
2522
  }
2523
+
2400
2524
  .margin-top-none {
2401
2525
  margin-block-start: 0;
2402
2526
  }
2527
+
2403
2528
  /* Bottom Margin */
2529
+
2404
2530
  .margin-bottom-xl {
2405
2531
  margin-block-end: var(--op-space-x-large);
2406
2532
  }
2533
+
2407
2534
  .margin-bottom-lg {
2408
2535
  margin-block-end: var(--op-space-large);
2409
2536
  }
2537
+
2410
2538
  .margin-bottom-md {
2411
2539
  margin-block-end: var(--op-space-medium);
2412
2540
  }
2541
+
2413
2542
  .margin-bottom-sm {
2414
2543
  margin-block-end: var(--op-space-small);
2415
2544
  }
2545
+
2416
2546
  .margin-bottom-xs {
2417
2547
  margin-block-end: var(--op-space-x-small);
2418
2548
  }
2549
+
2419
2550
  .margin-bottom-none {
2420
2551
  margin-block-end: 0;
2421
2552
  }
2553
+
2422
2554
  /* Right Margin */
2555
+
2423
2556
  .margin-right-xl {
2424
2557
  margin-inline-end: var(--op-space-x-large);
2425
2558
  }
2559
+
2426
2560
  .margin-right-lg {
2427
2561
  margin-inline-end: var(--op-space-large);
2428
2562
  }
2563
+
2429
2564
  .margin-right-md {
2430
2565
  margin-inline-end: var(--op-space-medium);
2431
2566
  }
2567
+
2432
2568
  .margin-right-sm {
2433
2569
  margin-inline-end: var(--op-space-small);
2434
2570
  }
2571
+
2435
2572
  .margin-right-xs {
2436
2573
  margin-inline-end: var(--op-space-x-small);
2437
2574
  }
2575
+
2438
2576
  .margin-right-none {
2439
2577
  margin-inline-start: 0;
2440
2578
  }
2579
+
2441
2580
  /* Left Margin */
2581
+
2442
2582
  .margin-left-xl {
2443
2583
  margin-inline-start: var(--op-space-x-large);
2444
2584
  }
2585
+
2445
2586
  .margin-left-lg {
2446
2587
  margin-inline-start: var(--op-space-large);
2447
2588
  }
2589
+
2448
2590
  .margin-left-md {
2449
2591
  margin-inline-start: var(--op-space-medium);
2450
2592
  }
2593
+
2451
2594
  .margin-left-sm {
2452
2595
  margin-inline-start: var(--op-space-small);
2453
2596
  }
2597
+
2454
2598
  .margin-left-xs {
2455
2599
  margin-inline-start: var(--op-space-x-small);
2456
2600
  }
2601
+
2457
2602
  .margin-left-none {
2458
2603
  margin-inline-start: 0;
2459
2604
  }
2605
+
2460
2606
  /*
2461
2607
  Accessibility
2462
2608
  Use the following class to hide accessibility text that is needed for screen readers but needs to be hidden from regular users.
@@ -2470,7 +2616,9 @@ small {
2470
2616
  clip: rect(1px, 1px, 1px, 1px);
2471
2617
  inline-size: 1px;
2472
2618
  }
2619
+
2473
2620
  /* Advanced Layout Utilities */
2621
+
2474
2622
  /* Equivalent to .flex.flex-col.gap-md */
2475
2623
  .op-stack {
2476
2624
  display: flex;
@@ -2483,6 +2631,7 @@ small {
2483
2631
  gap: var(--op-space-medium);
2484
2632
  }
2485
2633
  }
2634
+
2486
2635
  /* Equivalent to .flex.flex-wrap.items-center.gap-md */
2487
2636
  .op-cluster {
2488
2637
  display: flex;
@@ -2496,6 +2645,7 @@ small {
2496
2645
  gap: var(--op-space-medium);
2497
2646
  }
2498
2647
  }
2648
+
2499
2649
  /* Equivalent to .flex.flex-wrap.items-center.justify-between.gap-md */
2500
2650
  .op-split {
2501
2651
  display: flex;
@@ -2510,6 +2660,7 @@ small {
2510
2660
  gap: var(--op-space-medium);
2511
2661
  }
2512
2662
  }
2663
+
2513
2664
  /*
2514
2665
  side by side layout with a small area and a large area
2515
2666
  similar to .flex with a .flex-grow-1 within it, but with a more semantic name and wrap handling.
@@ -2543,6 +2694,7 @@ small {
2543
2694
  flex-grow: 999;
2544
2695
  }
2545
2696
  }
2697
+
2546
2698
  /* Grid Layout */
2547
2699
  .op-grid {
2548
2700
  --_op-grid-min-column-size: var(--op-space-4x-large);
@@ -2581,12 +2733,14 @@ small {
2581
2733
  --_op-grid-max-column-size: calc(100% / 7);
2582
2734
  }
2583
2735
  }
2736
+
2584
2737
  /* Frame */
2585
2738
  @property --_op-frame-inline-size {
2586
2739
  inherits: true;
2587
2740
  initial-value: 100%;
2588
2741
  syntax: '<length> | <percentage>';
2589
2742
  }
2743
+
2590
2744
  .op-frame {
2591
2745
  display: flex;
2592
2746
  overflow: hidden;
@@ -2638,6 +2792,7 @@ small {
2638
2792
  aspect-ratio: 2 / 3;
2639
2793
  }
2640
2794
  }
2795
+
2641
2796
  /* Components */
2642
2797
  .accordion {
2643
2798
  /* Public API (customizable component options) */
@@ -3396,6 +3551,7 @@ small {
3396
3551
  }
3397
3552
  }
3398
3553
  }
3554
+
3399
3555
  .btn-group-toolbar {
3400
3556
  display: flex;
3401
3557
  flex-wrap: wrap;
@@ -3509,6 +3665,7 @@ small {
3509
3665
  }
3510
3666
  }
3511
3667
  }
3668
+
3512
3669
  /* stylelint-disable no-descending-specificity */
3513
3670
  .confirm-dialog {
3514
3671
  /* Public API (customizable component options) */
@@ -3696,6 +3853,7 @@ small {
3696
3853
  /* stylelint-enable selector-no-vendor-prefix */
3697
3854
  }
3698
3855
  }
3856
+
3699
3857
  /* Radio or Checkbox Form Control */
3700
3858
  .form-control:is([type='radio'], [type='checkbox']) {
3701
3859
  /* Public API (customizable component options) */
@@ -3714,6 +3872,7 @@ small {
3714
3872
  align-self: center;
3715
3873
  }
3716
3874
  }
3875
+
3717
3876
  /* Any Form Control that is not a radio or checkbox */
3718
3877
  .form-control:not([type='radio'], [type='checkbox']) {
3719
3878
  /* Public API (customizable component options) */
@@ -3776,6 +3935,7 @@ small {
3776
3935
  }
3777
3936
  }
3778
3937
  }
3938
+
3779
3939
  /* Color Form Control */
3780
3940
  .form-control[type='color'] {
3781
3941
  padding: var(--op-space-2x-small);
@@ -3790,6 +3950,7 @@ small {
3790
3950
  border-radius: var(--op-radius-medium);
3791
3951
  }
3792
3952
  }
3953
+
3793
3954
  /* File Form Control */
3794
3955
  .form-control[type='file'] {
3795
3956
  padding-block: 0;
@@ -3825,6 +3986,7 @@ small {
3825
3986
  --__op-btn-height: calc(var(--__op-btn-base-height) - var(--op-space-x-small));
3826
3987
  }
3827
3988
  }
3989
+
3828
3990
  select.form-control:not([multiple], [type='radio'], [type='checkbox']) {
3829
3991
  appearance: none;
3830
3992
  background-image: var(--op-encoded-images-dropdown-arrow);
@@ -3836,14 +3998,17 @@ select.form-control:not([multiple], [type='radio'], [type='checkbox']) {
3836
3998
  cursor: pointer;
3837
3999
  padding-inline-end: var(--op-space-3x-large);
3838
4000
  }
4001
+
3839
4002
  select.form-control[multiple] {
3840
4003
  min-block-size: calc(2 * var(--__op-form-control-height));
3841
4004
  }
4005
+
3842
4006
  textarea.form-control:not([type='radio'], [type='checkbox']) {
3843
4007
  block-size: calc(2 * var(--__op-form-control-height));
3844
4008
  max-inline-size: 100%;
3845
4009
  min-block-size: var(--__op-form-control-height);
3846
4010
  }
4011
+
3847
4012
  .form-label {
3848
4013
  color: var(--op-color-on-background);
3849
4014
  font-size: var(--op-font-x-small);
@@ -3851,16 +4016,19 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3851
4016
  letter-spacing: var(--op-letter-spacing-label);
3852
4017
  line-height: var(--op-line-height-base);
3853
4018
  }
4019
+
3854
4020
  .form-error {
3855
4021
  color: var(--op-color-alerts-danger-base);
3856
4022
  font-size: var(--op-font-x-small);
3857
4023
  inline-size: fit-content;
3858
4024
  }
4025
+
3859
4026
  .form-hint {
3860
4027
  display: block;
3861
4028
  font-size: var(--op-font-small);
3862
4029
  font-style: italic;
3863
4030
  }
4031
+
3864
4032
  .form-error-summary {
3865
4033
  padding: var(--op-space-large);
3866
4034
  border-radius: var(--op-radius-large);
@@ -3877,6 +4045,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3877
4045
  margin-block-end: 0;
3878
4046
  }
3879
4047
  }
4048
+
3880
4049
  .form-group {
3881
4050
  display: grid;
3882
4051
  align-content: baseline;
@@ -3907,6 +4076,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3907
4076
  }
3908
4077
  }
3909
4078
  }
4079
+
3910
4080
  .form-group--inline {
3911
4081
  align-items: center;
3912
4082
 
@@ -3928,6 +4098,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3928
4098
  }
3929
4099
  /* stylelint-enable no-descending-specificity */
3930
4100
  }
4101
+
3931
4102
  .form-group--error {
3932
4103
  /* stylelint-disable no-descending-specificity */
3933
4104
  .form-control {
@@ -4017,6 +4188,13 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
4017
4188
  --_op-icon-optical-size-large: 40;
4018
4189
  --_op-icon-optical-size-x-large: 48;
4019
4190
 
4191
+ /* SVG (.icon--svg) */
4192
+ --_op-icon-stroke-width-light: 1;
4193
+ --_op-icon-stroke-width-normal: 1.5;
4194
+ --_op-icon-stroke-width-semi-bold: 2;
4195
+ --_op-icon-stroke-width-bold: 2.5;
4196
+ --_op-icon-svg-opacity-low-emphasis: 0.6;
4197
+
4020
4198
  /* Private API (component option defaults) */
4021
4199
  --__op-icon-weight: var(--_op-icon-weight-normal);
4022
4200
  --__op-icon-fill: var(--_op-icon-fill-outlined);
@@ -4044,18 +4222,22 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
4044
4222
  /* Weight Modifiers */
4045
4223
  &.icon--weight-light {
4046
4224
  --__op-icon-weight: var(--_op-icon-weight-light);
4225
+ --__op-icon-stroke-width: var(--_op-icon-stroke-width-light);
4047
4226
  }
4048
4227
 
4049
4228
  &.icon--weight-normal {
4050
4229
  --__op-icon-weight: var(--_op-icon-weight-normal);
4230
+ --__op-icon-stroke-width: var(--_op-icon-stroke-width-normal);
4051
4231
  }
4052
4232
 
4053
4233
  &.icon--weight-semi-bold {
4054
4234
  --__op-icon-weight: var(--_op-icon-weight-semi-bold);
4235
+ --__op-icon-stroke-width: var(--_op-icon-stroke-width-semi-bold);
4055
4236
  }
4056
4237
 
4057
4238
  &.icon--weight-bold {
4058
4239
  --__op-icon-weight: var(--_op-icon-weight-bold);
4240
+ --__op-icon-stroke-width: var(--_op-icon-stroke-width-bold);
4059
4241
  }
4060
4242
 
4061
4243
  /* Emphasis */
@@ -4091,7 +4273,27 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
4091
4273
  --__op-icon-font-size: var(--_op-icon-font-size-x-large);
4092
4274
  --__op-icon-optical-size: var(--_op-icon-optical-size-x-large);
4093
4275
  }
4276
+
4277
+ /* SVG Modifier: an inline SVG instead of a font glyph, e.g. `icon icon--svg icon--large` */
4278
+ &.icon--svg {
4279
+ svg {
4280
+ display: block;
4281
+ block-size: 100%;
4282
+ inline-size: 100%;
4283
+ }
4284
+
4285
+ /* A rule on the <svg> root cannot beat a stroke-width attribute on a child, so target the attribute.
4286
+ With no weight modifier the set keeps the widths it was drawn with. */
4287
+ &:is(.icon--weight-light, .icon--weight-normal, .icon--weight-semi-bold, .icon--weight-bold) svg [stroke-width] {
4288
+ stroke-width: var(--__op-icon-stroke-width);
4289
+ }
4290
+
4291
+ &.icon--low-emphasis {
4292
+ opacity: var(--_op-icon-svg-opacity-low-emphasis);
4293
+ }
4294
+ }
4094
4295
  }
4296
+
4095
4297
  /* Material Icons class provided by the Google Fonts CDN */
4096
4298
  .material-symbols-outlined {
4097
4299
  font-variation-settings:
@@ -4101,6 +4303,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
4101
4303
  'opsz' var(--__op-icon-optical-size);
4102
4304
  font-weight: unset;
4103
4305
  }
4306
+
4104
4307
  /* Custom SVG Icons app specific */
4105
4308
  .custom-icons {
4106
4309
  svg {
@@ -4150,6 +4353,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
4150
4353
  }
4151
4354
  }
4152
4355
  }
4356
+
4153
4357
  .modal {
4154
4358
  /* Public API (customizable component options) */
4155
4359
  --_op-modal-width: calc(141 * var(--op-size-unit)); /* 564px */
@@ -4195,6 +4399,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
4195
4399
  gap: var(--op-space-small);
4196
4400
  }
4197
4401
  }
4402
+
4198
4403
  dialog.modal {
4199
4404
  padding: 0;
4200
4405
  border: none;
@@ -4227,6 +4432,7 @@ dialog.modal {
4227
4432
  }
4228
4433
  }
4229
4434
  }
4435
+
4230
4436
  @starting-style {
4231
4437
  dialog.modal[open] {
4232
4438
  transform: scale(0.7);
@@ -4734,6 +4940,7 @@ dialog.modal {
4734
4940
  --__op-spinner-track-width: var(--_op-spinner-track-width-large);
4735
4941
  }
4736
4942
  }
4943
+
4737
4944
  @keyframes spinner {
4738
4945
  to {
4739
4946
  transform: rotate(360deg);
@@ -4850,6 +5057,7 @@ dialog.modal {
4850
5057
  display: flex;
4851
5058
  align-items: center;
4852
5059
  }
5060
+
4853
5061
  .tab {
4854
5062
  /* Public API */
4855
5063
  --_op-tab-font-small: var(--op-font-x-small);
@@ -5282,6 +5490,7 @@ dialog.modal {
5282
5490
  }
5283
5491
  }
5284
5492
  /* Inspired by https://blog.logrocket.com/creating-beautiful-tooltips-with-only-css/ */
5493
+
5285
5494
  [data-tooltip-text] {
5286
5495
  /* Public API (customizable component options) */
5287
5496
  --_op-tooltip-max-width: calc(50 * var(--op-size-unit)); /* 200px */