@rolemodel/optics 2.3.1 → 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.
Files changed (36) hide show
  1. package/.github/workflows/deploy-to-ghp.yml +2 -2
  2. package/.github/workflows/deploy-to-npm.yml +9 -5
  3. package/.github/workflows/linting.yml +5 -3
  4. package/.github/workflows/publish-storybook.yml +4 -4
  5. package/.prettierignore +3 -0
  6. package/.yarn/install-state.gz +0 -0
  7. package/CHANGELOG.md +1740 -0
  8. package/README.md +16 -0
  9. package/context7.json +4 -0
  10. package/dist/README.md +16 -0
  11. package/dist/css/addons/fonts/lucide_icons.css +6380 -3081
  12. package/dist/css/addons/fonts/phosphor_icons.css +8 -7
  13. package/dist/css/addons/fonts/tabler_icons.css +2 -1
  14. package/dist/css/components/accordion.css +1 -1
  15. package/dist/css/components/icon.css +30 -0
  16. package/dist/css/components/index.css +26 -26
  17. package/dist/css/components/text_pair.css +5 -1
  18. package/dist/css/core/fonts/index.css +2 -2
  19. package/dist/css/core/tokens/index.css +2 -2
  20. package/dist/css/core/utilities.css +157 -10
  21. package/dist/css/optics+feather_icons.css +600 -12
  22. package/dist/css/optics+feather_icons.min.css +1 -1
  23. package/dist/css/optics+lucide_icons.css +6748 -3088
  24. package/dist/css/optics+lucide_icons.min.css +1 -1
  25. package/dist/css/optics+material_outlined_variable.css +370 -12
  26. package/dist/css/optics+material_outlined_variable.min.css +1 -1
  27. package/dist/css/optics+no_icons.css +370 -12
  28. package/dist/css/optics+no_icons.min.css +1 -1
  29. package/dist/css/optics+phosphor_icons.css +381 -19
  30. package/dist/css/optics+phosphor_icons.min.css +1 -1
  31. package/dist/css/optics+tabler_icons.css +373 -13
  32. package/dist/css/optics+tabler_icons.min.css +1 -1
  33. package/dist/css/optics.css +371 -12
  34. package/dist/css/optics.min.css +1 -1
  35. package/dist/package.json +19 -16
  36. package/package.json +19 -16
@@ -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,299 +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 */
2281
+ .gap-none {
2282
+ gap: 0;
2283
+
2284
+ --op-gap: 0;
2285
+ }
2286
+
2216
2287
  .gap-xxs {
2217
2288
  gap: var(--op-space-2x-small);
2218
2289
 
2219
2290
  --op-gap: var(--op-space-2x-small);
2220
2291
  }
2292
+
2221
2293
  .gap-xs {
2222
2294
  gap: var(--op-space-x-small);
2223
2295
 
2224
2296
  --op-gap: var(--op-space-x-small);
2225
2297
  }
2298
+
2226
2299
  .gap-sm {
2227
2300
  gap: var(--op-space-small);
2228
2301
 
2229
2302
  --op-gap: var(--op-space-small);
2230
2303
  }
2304
+
2231
2305
  .gap-md {
2232
2306
  gap: var(--op-space-medium);
2233
2307
 
2234
2308
  --op-gap: var(--op-space-medium);
2235
2309
  }
2310
+
2236
2311
  .gap-lg {
2237
2312
  gap: var(--op-space-large);
2238
2313
 
2239
2314
  --op-gap: var(--op-space-large);
2240
2315
  }
2316
+
2241
2317
  .gap-xl {
2242
2318
  gap: var(--op-space-x-large);
2243
2319
 
2244
2320
  --op-gap: var(--op-space-x-large);
2245
2321
  }
2322
+
2246
2323
  /* Justify Content */
2324
+
2247
2325
  .justify-start {
2248
2326
  justify-content: flex-start;
2249
2327
  }
2328
+
2250
2329
  .justify-center {
2251
2330
  justify-content: center;
2252
2331
  }
2332
+
2253
2333
  .justify-end {
2254
2334
  justify-content: flex-end;
2255
2335
  }
2336
+
2256
2337
  .justify-between {
2257
2338
  justify-content: space-between;
2258
2339
  }
2340
+
2259
2341
  .justify-around {
2260
2342
  justify-content: space-around;
2261
2343
  }
2344
+
2262
2345
  /* Align Items */
2346
+
2263
2347
  .items-stretch {
2264
2348
  align-items: stretch;
2265
2349
  }
2350
+
2266
2351
  .items-start {
2267
2352
  align-items: flex-start;
2268
2353
  }
2354
+
2269
2355
  .items-center {
2270
2356
  align-items: center;
2271
2357
  }
2358
+
2272
2359
  .items-end {
2273
2360
  align-items: flex-end;
2274
2361
  }
2362
+
2275
2363
  .items-baseline {
2276
2364
  align-items: baseline;
2277
2365
  }
2366
+
2278
2367
  /* Align Self */
2368
+
2279
2369
  .self-auto {
2280
2370
  align-self: auto;
2281
2371
  }
2372
+
2282
2373
  .self-start {
2283
2374
  align-self: flex-start;
2284
2375
  }
2376
+
2285
2377
  .self-center {
2286
2378
  align-self: center;
2287
2379
  }
2380
+
2288
2381
  .self-end {
2289
2382
  align-self: flex-end;
2290
2383
  }
2384
+
2291
2385
  .self-stretch {
2292
2386
  align-self: stretch;
2293
2387
  }
2388
+
2294
2389
  .self-baseline {
2295
2390
  align-self: baseline;
2296
2391
  }
2392
+
2297
2393
  /* Text Alignment */
2394
+
2298
2395
  .text-left {
2299
2396
  text-align: start;
2300
2397
  }
2398
+
2301
2399
  .text-center {
2302
2400
  text-align: center;
2303
2401
  }
2402
+
2304
2403
  .text-right {
2305
2404
  text-align: end;
2306
2405
  }
2406
+
2307
2407
  .text-justify {
2308
2408
  text-align: justify;
2309
2409
  }
2410
+
2310
2411
  /* Box Margin */
2412
+
2311
2413
  .margin-xl {
2312
2414
  margin: var(--op-space-x-large);
2313
2415
  }
2416
+
2314
2417
  .margin-lg {
2315
2418
  margin: var(--op-space-large);
2316
2419
  }
2420
+
2317
2421
  .margin-md {
2318
2422
  margin: var(--op-space-medium);
2319
2423
  }
2424
+
2320
2425
  .margin-sm {
2321
2426
  margin: var(--op-space-small);
2322
2427
  }
2428
+
2323
2429
  .margin-xs {
2324
2430
  margin: var(--op-space-x-small);
2325
2431
  }
2432
+
2326
2433
  .margin-none {
2327
2434
  margin: 0;
2328
2435
  }
2436
+
2329
2437
  .margin-auto {
2330
2438
  margin: auto;
2331
2439
  }
2440
+
2332
2441
  /* Vertical Margin */
2442
+
2333
2443
  .margin-y-xl {
2334
2444
  margin-block: var(--op-space-x-large);
2335
2445
  }
2446
+
2336
2447
  .margin-y-lg {
2337
2448
  margin-block: var(--op-space-large);
2338
2449
  }
2450
+
2339
2451
  .margin-y-md {
2340
2452
  margin-block: var(--op-space-medium);
2341
2453
  }
2454
+
2342
2455
  .margin-y-sm {
2343
2456
  margin-block: var(--op-space-small);
2344
2457
  }
2458
+
2345
2459
  .margin-y-xs {
2346
2460
  margin-block: var(--op-space-x-small);
2347
2461
  }
2462
+
2348
2463
  .margin-y-none {
2349
2464
  margin-block: 0;
2350
2465
  }
2466
+
2351
2467
  /* Horizontal Margin */
2468
+
2352
2469
  .margin-x-xl {
2353
2470
  margin-inline: var(--op-space-x-large);
2354
2471
  }
2472
+
2355
2473
  .margin-x-lg {
2356
2474
  margin-inline: var(--op-space-large);
2357
2475
  }
2476
+
2358
2477
  .margin-x-md {
2359
2478
  margin-inline: var(--op-space-medium);
2360
2479
  }
2480
+
2361
2481
  .margin-x-sm {
2362
2482
  margin-inline: var(--op-space-small);
2363
2483
  }
2484
+
2364
2485
  .margin-x-xs {
2365
2486
  margin-inline: var(--op-space-x-small);
2366
2487
  }
2488
+
2367
2489
  .margin-x-none {
2368
2490
  margin-inline: 0;
2369
2491
  }
2492
+
2370
2493
  /* Top Margin */
2494
+
2371
2495
  .margin-top-xl {
2372
2496
  margin-block-start: var(--op-space-x-large);
2373
2497
  }
2498
+
2374
2499
  .margin-top-lg {
2375
2500
  margin-block-start: var(--op-space-large);
2376
2501
  }
2502
+
2377
2503
  .margin-top-md {
2378
2504
  margin-block-start: var(--op-space-medium);
2379
2505
  }
2506
+
2380
2507
  .margin-top-sm {
2381
2508
  margin-block-start: var(--op-space-small);
2382
2509
  }
2510
+
2383
2511
  .margin-top-xs {
2384
2512
  margin-block-start: var(--op-space-x-small);
2385
2513
  }
2514
+
2386
2515
  .margin-top-none {
2387
2516
  margin-block-start: 0;
2388
2517
  }
2518
+
2389
2519
  /* Bottom Margin */
2520
+
2390
2521
  .margin-bottom-xl {
2391
2522
  margin-block-end: var(--op-space-x-large);
2392
2523
  }
2524
+
2393
2525
  .margin-bottom-lg {
2394
2526
  margin-block-end: var(--op-space-large);
2395
2527
  }
2528
+
2396
2529
  .margin-bottom-md {
2397
2530
  margin-block-end: var(--op-space-medium);
2398
2531
  }
2532
+
2399
2533
  .margin-bottom-sm {
2400
2534
  margin-block-end: var(--op-space-small);
2401
2535
  }
2536
+
2402
2537
  .margin-bottom-xs {
2403
2538
  margin-block-end: var(--op-space-x-small);
2404
2539
  }
2540
+
2405
2541
  .margin-bottom-none {
2406
2542
  margin-block-end: 0;
2407
2543
  }
2544
+
2408
2545
  /* Right Margin */
2546
+
2409
2547
  .margin-right-xl {
2410
2548
  margin-inline-end: var(--op-space-x-large);
2411
2549
  }
2550
+
2412
2551
  .margin-right-lg {
2413
2552
  margin-inline-end: var(--op-space-large);
2414
2553
  }
2554
+
2415
2555
  .margin-right-md {
2416
2556
  margin-inline-end: var(--op-space-medium);
2417
2557
  }
2558
+
2418
2559
  .margin-right-sm {
2419
2560
  margin-inline-end: var(--op-space-small);
2420
2561
  }
2562
+
2421
2563
  .margin-right-xs {
2422
2564
  margin-inline-end: var(--op-space-x-small);
2423
2565
  }
2566
+
2424
2567
  .margin-right-none {
2425
2568
  margin-inline-start: 0;
2426
2569
  }
2570
+
2427
2571
  /* Left Margin */
2572
+
2428
2573
  .margin-left-xl {
2429
2574
  margin-inline-start: var(--op-space-x-large);
2430
2575
  }
2576
+
2431
2577
  .margin-left-lg {
2432
2578
  margin-inline-start: var(--op-space-large);
2433
2579
  }
2580
+
2434
2581
  .margin-left-md {
2435
2582
  margin-inline-start: var(--op-space-medium);
2436
2583
  }
2584
+
2437
2585
  .margin-left-sm {
2438
2586
  margin-inline-start: var(--op-space-small);
2439
2587
  }
2588
+
2440
2589
  .margin-left-xs {
2441
2590
  margin-inline-start: var(--op-space-x-small);
2442
2591
  }
2592
+
2443
2593
  .margin-left-none {
2444
2594
  margin-inline-start: 0;
2445
2595
  }
2596
+
2446
2597
  /*
2447
2598
  Accessibility
2448
2599
  Use the following class to hide accessibility text that is needed for screen readers but needs to be hidden from regular users.
@@ -2456,34 +2607,183 @@ small {
2456
2607
  clip: rect(1px, 1px, 1px, 1px);
2457
2608
  inline-size: 1px;
2458
2609
  }
2610
+
2459
2611
  /* Advanced Layout Utilities */
2612
+
2460
2613
  /* Equivalent to .flex.flex-col.gap-md */
2461
2614
  .op-stack {
2462
2615
  display: flex;
2463
2616
  flex-direction: column;
2617
+ margin-block: 0;
2618
+ margin-inline: 0;
2619
+
2620
+ /* zero specificity. Lets utilities override */
2621
+ :where(&) {
2622
+ gap: var(--op-space-medium);
2623
+ }
2464
2624
  }
2465
- :where(.op-stack) {
2466
- gap: var(--op-space-medium);
2467
- }
2625
+
2468
2626
  /* Equivalent to .flex.flex-wrap.items-center.gap-md */
2469
2627
  .op-cluster {
2470
2628
  display: flex;
2471
2629
  flex-wrap: wrap;
2630
+ margin-block: 0;
2631
+ margin-inline: 0;
2632
+
2633
+ /* zero specificity. Lets utilities override */
2634
+ :where(&) {
2635
+ align-items: center;
2636
+ gap: var(--op-space-medium);
2637
+ }
2472
2638
  }
2473
- :where(.op-cluster) {
2474
- align-items: center;
2475
- gap: var(--op-space-medium);
2476
- }
2639
+
2477
2640
  /* Equivalent to .flex.flex-wrap.items-center.justify-between.gap-md */
2478
2641
  .op-split {
2479
2642
  display: flex;
2480
2643
  flex-wrap: wrap;
2481
2644
  justify-content: space-between;
2645
+ margin-block: 0;
2646
+ margin-inline: 0;
2647
+
2648
+ /* zero specificity. Lets utilities override */
2649
+ :where(&) {
2650
+ align-items: center;
2651
+ gap: var(--op-space-medium);
2652
+ }
2482
2653
  }
2483
- :where(.op-split) {
2484
- align-items: center;
2485
- gap: var(--op-space-medium);
2654
+
2655
+ /*
2656
+ side by side layout with a small area and a large area
2657
+ similar to .flex with a .flex-grow-1 within it, but with a more semantic name and wrap handling.
2658
+
2659
+ |[] [ ]|
2660
+ |[ ] []| with end
2661
+ */
2662
+ .op-flank {
2663
+ display: flex;
2664
+ margin-block: 0;
2665
+ margin-inline: 0;
2666
+
2667
+ /* zero specificity. Lets utilities override */
2668
+ :where(&) {
2669
+ flex-wrap: wrap;
2670
+ align-items: center;
2671
+ gap: var(--op-space-medium);
2672
+ }
2673
+
2674
+ /* Small area */
2675
+ &:not(.op-flank--end) > :first-child,
2676
+ &.op-flank--end > :last-child {
2677
+ flex-basis: auto;
2678
+ flex-grow: 1;
2679
+ }
2680
+
2681
+ /* Large area */
2682
+ &:not(.op-flank--end) > :last-child,
2683
+ &.op-flank--end > :first-child {
2684
+ flex-basis: 0;
2685
+ flex-grow: 999;
2686
+ }
2687
+ }
2688
+
2689
+ /* Grid Layout */
2690
+ .op-grid {
2691
+ --_op-grid-min-column-size: var(--op-space-4x-large);
2692
+ --_op-grid-max-column-size: 0px;
2693
+
2694
+ display: grid;
2695
+ grid-template-columns: repeat(
2696
+ auto-fit,
2697
+ minmax(max(var(--_op-grid-min-column-size), var(--_op-grid-max-column-size)), 1fr)
2698
+ );
2699
+ margin-block: 0;
2700
+ margin-inline: 0;
2701
+
2702
+ /* zero specificity. Lets utilities override */
2703
+ :where(&) {
2704
+ gap: var(--op-space-medium);
2705
+ }
2706
+
2707
+ &.op-grid--2-column {
2708
+ --_op-grid-max-column-size: calc(100% / 3);
2709
+ }
2710
+
2711
+ &.op-grid--3-column {
2712
+ --_op-grid-max-column-size: calc(100% / 4);
2713
+ }
2714
+
2715
+ &.op-grid--4-column {
2716
+ --_op-grid-max-column-size: calc(100% / 5);
2717
+ }
2718
+
2719
+ &.op-grid--5-column {
2720
+ --_op-grid-max-column-size: calc(100% / 6);
2721
+ }
2722
+
2723
+ &.op-grid--6-column {
2724
+ --_op-grid-max-column-size: calc(100% / 7);
2725
+ }
2726
+ }
2727
+
2728
+ /* Frame */
2729
+ @property --_op-frame-inline-size {
2730
+ inherits: true;
2731
+ initial-value: 100%;
2732
+ syntax: '<length> | <percentage>';
2486
2733
  }
2734
+
2735
+ .op-frame {
2736
+ display: flex;
2737
+ overflow: hidden;
2738
+ border-radius: inherit;
2739
+ aspect-ratio: 1 / 1;
2740
+ margin-block: 0;
2741
+ margin-inline: 0;
2742
+ max-inline-size: var(--_op-frame-inline-size);
2743
+
2744
+ :where(&) {
2745
+ align-items: center;
2746
+ justify-content: center;
2747
+ }
2748
+
2749
+ > img,
2750
+ > video {
2751
+ block-size: 100%;
2752
+ inline-size: 100%;
2753
+ object-fit: cover;
2754
+ }
2755
+
2756
+ /* aspect ratio */
2757
+
2758
+ &.op-frame--square {
2759
+ aspect-ratio: 1 / 1;
2760
+ }
2761
+
2762
+ &.op-frame--landscape {
2763
+ aspect-ratio: 16 / 9;
2764
+ }
2765
+
2766
+ &.op-frame--portrait {
2767
+ aspect-ratio: 9 / 16;
2768
+ }
2769
+
2770
+ &.op-frame--4-3 {
2771
+ aspect-ratio: 4 / 3;
2772
+ }
2773
+
2774
+ &.op-frame--3-4 {
2775
+ aspect-ratio: 3 / 4;
2776
+ }
2777
+
2778
+ &.op-frame--3-2 {
2779
+ aspect-ratio: 3 / 2;
2780
+ }
2781
+
2782
+ &.op-frame--2-3 {
2783
+ aspect-ratio: 2 / 3;
2784
+ }
2785
+ }
2786
+
2487
2787
  /* Components */
2488
2788
  .accordion {
2489
2789
  /* Public API (customizable component options) */
@@ -2530,7 +2830,7 @@ small {
2530
2830
  }
2531
2831
 
2532
2832
  &[open] {
2533
- summary .accordion__marker {
2833
+ > summary .accordion__marker {
2534
2834
  rotate: 0.25turn;
2535
2835
  }
2536
2836
 
@@ -3242,6 +3542,7 @@ small {
3242
3542
  }
3243
3543
  }
3244
3544
  }
3545
+
3245
3546
  .btn-group-toolbar {
3246
3547
  display: flex;
3247
3548
  flex-wrap: wrap;
@@ -3355,6 +3656,7 @@ small {
3355
3656
  }
3356
3657
  }
3357
3658
  }
3659
+
3358
3660
  /* stylelint-disable no-descending-specificity */
3359
3661
  .confirm-dialog {
3360
3662
  /* Public API (customizable component options) */
@@ -3542,6 +3844,7 @@ small {
3542
3844
  /* stylelint-enable selector-no-vendor-prefix */
3543
3845
  }
3544
3846
  }
3847
+
3545
3848
  /* Radio or Checkbox Form Control */
3546
3849
  .form-control:is([type='radio'], [type='checkbox']) {
3547
3850
  /* Public API (customizable component options) */
@@ -3560,6 +3863,7 @@ small {
3560
3863
  align-self: center;
3561
3864
  }
3562
3865
  }
3866
+
3563
3867
  /* Any Form Control that is not a radio or checkbox */
3564
3868
  .form-control:not([type='radio'], [type='checkbox']) {
3565
3869
  /* Public API (customizable component options) */
@@ -3622,6 +3926,7 @@ small {
3622
3926
  }
3623
3927
  }
3624
3928
  }
3929
+
3625
3930
  /* Color Form Control */
3626
3931
  .form-control[type='color'] {
3627
3932
  padding: var(--op-space-2x-small);
@@ -3636,6 +3941,7 @@ small {
3636
3941
  border-radius: var(--op-radius-medium);
3637
3942
  }
3638
3943
  }
3944
+
3639
3945
  /* File Form Control */
3640
3946
  .form-control[type='file'] {
3641
3947
  padding-block: 0;
@@ -3671,6 +3977,7 @@ small {
3671
3977
  --__op-btn-height: calc(var(--__op-btn-base-height) - var(--op-space-x-small));
3672
3978
  }
3673
3979
  }
3980
+
3674
3981
  select.form-control:not([multiple], [type='radio'], [type='checkbox']) {
3675
3982
  appearance: none;
3676
3983
  background-image: var(--op-encoded-images-dropdown-arrow);
@@ -3682,14 +3989,17 @@ select.form-control:not([multiple], [type='radio'], [type='checkbox']) {
3682
3989
  cursor: pointer;
3683
3990
  padding-inline-end: var(--op-space-3x-large);
3684
3991
  }
3992
+
3685
3993
  select.form-control[multiple] {
3686
3994
  min-block-size: calc(2 * var(--__op-form-control-height));
3687
3995
  }
3996
+
3688
3997
  textarea.form-control:not([type='radio'], [type='checkbox']) {
3689
3998
  block-size: calc(2 * var(--__op-form-control-height));
3690
3999
  max-inline-size: 100%;
3691
4000
  min-block-size: var(--__op-form-control-height);
3692
4001
  }
4002
+
3693
4003
  .form-label {
3694
4004
  color: var(--op-color-on-background);
3695
4005
  font-size: var(--op-font-x-small);
@@ -3697,16 +4007,19 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3697
4007
  letter-spacing: var(--op-letter-spacing-label);
3698
4008
  line-height: var(--op-line-height-base);
3699
4009
  }
4010
+
3700
4011
  .form-error {
3701
4012
  color: var(--op-color-alerts-danger-base);
3702
4013
  font-size: var(--op-font-x-small);
3703
4014
  inline-size: fit-content;
3704
4015
  }
4016
+
3705
4017
  .form-hint {
3706
4018
  display: block;
3707
4019
  font-size: var(--op-font-small);
3708
4020
  font-style: italic;
3709
4021
  }
4022
+
3710
4023
  .form-error-summary {
3711
4024
  padding: var(--op-space-large);
3712
4025
  border-radius: var(--op-radius-large);
@@ -3723,6 +4036,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3723
4036
  margin-block-end: 0;
3724
4037
  }
3725
4038
  }
4039
+
3726
4040
  .form-group {
3727
4041
  display: grid;
3728
4042
  align-content: baseline;
@@ -3753,6 +4067,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3753
4067
  }
3754
4068
  }
3755
4069
  }
4070
+
3756
4071
  .form-group--inline {
3757
4072
  align-items: center;
3758
4073
 
@@ -3774,6 +4089,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3774
4089
  }
3775
4090
  /* stylelint-enable no-descending-specificity */
3776
4091
  }
4092
+
3777
4093
  .form-group--error {
3778
4094
  /* stylelint-disable no-descending-specificity */
3779
4095
  .form-control {
@@ -3863,6 +4179,13 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3863
4179
  --_op-icon-optical-size-large: 40;
3864
4180
  --_op-icon-optical-size-x-large: 48;
3865
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
+
3866
4189
  /* Private API (component option defaults) */
3867
4190
  --__op-icon-weight: var(--_op-icon-weight-normal);
3868
4191
  --__op-icon-fill: var(--_op-icon-fill-outlined);
@@ -3890,18 +4213,22 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3890
4213
  /* Weight Modifiers */
3891
4214
  &.icon--weight-light {
3892
4215
  --__op-icon-weight: var(--_op-icon-weight-light);
4216
+ --__op-icon-stroke-width: var(--_op-icon-stroke-width-light);
3893
4217
  }
3894
4218
 
3895
4219
  &.icon--weight-normal {
3896
4220
  --__op-icon-weight: var(--_op-icon-weight-normal);
4221
+ --__op-icon-stroke-width: var(--_op-icon-stroke-width-normal);
3897
4222
  }
3898
4223
 
3899
4224
  &.icon--weight-semi-bold {
3900
4225
  --__op-icon-weight: var(--_op-icon-weight-semi-bold);
4226
+ --__op-icon-stroke-width: var(--_op-icon-stroke-width-semi-bold);
3901
4227
  }
3902
4228
 
3903
4229
  &.icon--weight-bold {
3904
4230
  --__op-icon-weight: var(--_op-icon-weight-bold);
4231
+ --__op-icon-stroke-width: var(--_op-icon-stroke-width-bold);
3905
4232
  }
3906
4233
 
3907
4234
  /* Emphasis */
@@ -3937,7 +4264,27 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3937
4264
  --__op-icon-font-size: var(--_op-icon-font-size-x-large);
3938
4265
  --__op-icon-optical-size: var(--_op-icon-optical-size-x-large);
3939
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
+ }
3940
4286
  }
4287
+
3941
4288
  /* Material Icons class provided by the Google Fonts CDN */
3942
4289
  .material-symbols-outlined {
3943
4290
  font-variation-settings:
@@ -3947,6 +4294,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3947
4294
  'opsz' var(--__op-icon-optical-size);
3948
4295
  font-weight: unset;
3949
4296
  }
4297
+
3950
4298
  /* Custom SVG Icons app specific */
3951
4299
  .custom-icons {
3952
4300
  svg {
@@ -3996,6 +4344,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3996
4344
  }
3997
4345
  }
3998
4346
  }
4347
+
3999
4348
  .modal {
4000
4349
  /* Public API (customizable component options) */
4001
4350
  --_op-modal-width: calc(141 * var(--op-size-unit)); /* 564px */
@@ -4041,6 +4390,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
4041
4390
  gap: var(--op-space-small);
4042
4391
  }
4043
4392
  }
4393
+
4044
4394
  dialog.modal {
4045
4395
  padding: 0;
4046
4396
  border: none;
@@ -4073,6 +4423,7 @@ dialog.modal {
4073
4423
  }
4074
4424
  }
4075
4425
  }
4426
+
4076
4427
  @starting-style {
4077
4428
  dialog.modal[open] {
4078
4429
  transform: scale(0.7);
@@ -4580,6 +4931,7 @@ dialog.modal {
4580
4931
  --__op-spinner-track-width: var(--_op-spinner-track-width-large);
4581
4932
  }
4582
4933
  }
4934
+
4583
4935
  @keyframes spinner {
4584
4936
  to {
4585
4937
  transform: rotate(360deg);
@@ -4696,6 +5048,7 @@ dialog.modal {
4696
5048
  display: flex;
4697
5049
  align-items: center;
4698
5050
  }
5051
+
4699
5052
  .tab {
4700
5053
  /* Public API */
4701
5054
  --_op-tab-font-small: var(--op-font-x-small);
@@ -5080,7 +5433,11 @@ dialog.modal {
5080
5433
 
5081
5434
  display: flex;
5082
5435
  flex-direction: column;
5083
- gap: var(--op-space-x-small);
5436
+
5437
+ /* zero specificity. Lets utilities override */
5438
+ :where(&) {
5439
+ gap: var(--op-space-x-small);
5440
+ }
5084
5441
 
5085
5442
  &.text-pair--inline {
5086
5443
  flex-direction: row;
@@ -5124,6 +5481,7 @@ dialog.modal {
5124
5481
  }
5125
5482
  }
5126
5483
  /* Inspired by https://blog.logrocket.com/creating-beautiful-tooltips-with-only-css/ */
5484
+
5127
5485
  [data-tooltip-text] {
5128
5486
  /* Public API (customizable component options) */
5129
5487
  --_op-tooltip-max-width: calc(50 * var(--op-size-unit)); /* 200px */