@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
@@ -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,299 +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 */
2290
+ .gap-none {
2291
+ gap: 0;
2292
+
2293
+ --op-gap: 0;
2294
+ }
2295
+
2225
2296
  .gap-xxs {
2226
2297
  gap: var(--op-space-2x-small);
2227
2298
 
2228
2299
  --op-gap: var(--op-space-2x-small);
2229
2300
  }
2301
+
2230
2302
  .gap-xs {
2231
2303
  gap: var(--op-space-x-small);
2232
2304
 
2233
2305
  --op-gap: var(--op-space-x-small);
2234
2306
  }
2307
+
2235
2308
  .gap-sm {
2236
2309
  gap: var(--op-space-small);
2237
2310
 
2238
2311
  --op-gap: var(--op-space-small);
2239
2312
  }
2313
+
2240
2314
  .gap-md {
2241
2315
  gap: var(--op-space-medium);
2242
2316
 
2243
2317
  --op-gap: var(--op-space-medium);
2244
2318
  }
2319
+
2245
2320
  .gap-lg {
2246
2321
  gap: var(--op-space-large);
2247
2322
 
2248
2323
  --op-gap: var(--op-space-large);
2249
2324
  }
2325
+
2250
2326
  .gap-xl {
2251
2327
  gap: var(--op-space-x-large);
2252
2328
 
2253
2329
  --op-gap: var(--op-space-x-large);
2254
2330
  }
2331
+
2255
2332
  /* Justify Content */
2333
+
2256
2334
  .justify-start {
2257
2335
  justify-content: flex-start;
2258
2336
  }
2337
+
2259
2338
  .justify-center {
2260
2339
  justify-content: center;
2261
2340
  }
2341
+
2262
2342
  .justify-end {
2263
2343
  justify-content: flex-end;
2264
2344
  }
2345
+
2265
2346
  .justify-between {
2266
2347
  justify-content: space-between;
2267
2348
  }
2349
+
2268
2350
  .justify-around {
2269
2351
  justify-content: space-around;
2270
2352
  }
2353
+
2271
2354
  /* Align Items */
2355
+
2272
2356
  .items-stretch {
2273
2357
  align-items: stretch;
2274
2358
  }
2359
+
2275
2360
  .items-start {
2276
2361
  align-items: flex-start;
2277
2362
  }
2363
+
2278
2364
  .items-center {
2279
2365
  align-items: center;
2280
2366
  }
2367
+
2281
2368
  .items-end {
2282
2369
  align-items: flex-end;
2283
2370
  }
2371
+
2284
2372
  .items-baseline {
2285
2373
  align-items: baseline;
2286
2374
  }
2375
+
2287
2376
  /* Align Self */
2377
+
2288
2378
  .self-auto {
2289
2379
  align-self: auto;
2290
2380
  }
2381
+
2291
2382
  .self-start {
2292
2383
  align-self: flex-start;
2293
2384
  }
2385
+
2294
2386
  .self-center {
2295
2387
  align-self: center;
2296
2388
  }
2389
+
2297
2390
  .self-end {
2298
2391
  align-self: flex-end;
2299
2392
  }
2393
+
2300
2394
  .self-stretch {
2301
2395
  align-self: stretch;
2302
2396
  }
2397
+
2303
2398
  .self-baseline {
2304
2399
  align-self: baseline;
2305
2400
  }
2401
+
2306
2402
  /* Text Alignment */
2403
+
2307
2404
  .text-left {
2308
2405
  text-align: start;
2309
2406
  }
2407
+
2310
2408
  .text-center {
2311
2409
  text-align: center;
2312
2410
  }
2411
+
2313
2412
  .text-right {
2314
2413
  text-align: end;
2315
2414
  }
2415
+
2316
2416
  .text-justify {
2317
2417
  text-align: justify;
2318
2418
  }
2419
+
2319
2420
  /* Box Margin */
2421
+
2320
2422
  .margin-xl {
2321
2423
  margin: var(--op-space-x-large);
2322
2424
  }
2425
+
2323
2426
  .margin-lg {
2324
2427
  margin: var(--op-space-large);
2325
2428
  }
2429
+
2326
2430
  .margin-md {
2327
2431
  margin: var(--op-space-medium);
2328
2432
  }
2433
+
2329
2434
  .margin-sm {
2330
2435
  margin: var(--op-space-small);
2331
2436
  }
2437
+
2332
2438
  .margin-xs {
2333
2439
  margin: var(--op-space-x-small);
2334
2440
  }
2441
+
2335
2442
  .margin-none {
2336
2443
  margin: 0;
2337
2444
  }
2445
+
2338
2446
  .margin-auto {
2339
2447
  margin: auto;
2340
2448
  }
2449
+
2341
2450
  /* Vertical Margin */
2451
+
2342
2452
  .margin-y-xl {
2343
2453
  margin-block: var(--op-space-x-large);
2344
2454
  }
2455
+
2345
2456
  .margin-y-lg {
2346
2457
  margin-block: var(--op-space-large);
2347
2458
  }
2459
+
2348
2460
  .margin-y-md {
2349
2461
  margin-block: var(--op-space-medium);
2350
2462
  }
2463
+
2351
2464
  .margin-y-sm {
2352
2465
  margin-block: var(--op-space-small);
2353
2466
  }
2467
+
2354
2468
  .margin-y-xs {
2355
2469
  margin-block: var(--op-space-x-small);
2356
2470
  }
2471
+
2357
2472
  .margin-y-none {
2358
2473
  margin-block: 0;
2359
2474
  }
2475
+
2360
2476
  /* Horizontal Margin */
2477
+
2361
2478
  .margin-x-xl {
2362
2479
  margin-inline: var(--op-space-x-large);
2363
2480
  }
2481
+
2364
2482
  .margin-x-lg {
2365
2483
  margin-inline: var(--op-space-large);
2366
2484
  }
2485
+
2367
2486
  .margin-x-md {
2368
2487
  margin-inline: var(--op-space-medium);
2369
2488
  }
2489
+
2370
2490
  .margin-x-sm {
2371
2491
  margin-inline: var(--op-space-small);
2372
2492
  }
2493
+
2373
2494
  .margin-x-xs {
2374
2495
  margin-inline: var(--op-space-x-small);
2375
2496
  }
2497
+
2376
2498
  .margin-x-none {
2377
2499
  margin-inline: 0;
2378
2500
  }
2501
+
2379
2502
  /* Top Margin */
2503
+
2380
2504
  .margin-top-xl {
2381
2505
  margin-block-start: var(--op-space-x-large);
2382
2506
  }
2507
+
2383
2508
  .margin-top-lg {
2384
2509
  margin-block-start: var(--op-space-large);
2385
2510
  }
2511
+
2386
2512
  .margin-top-md {
2387
2513
  margin-block-start: var(--op-space-medium);
2388
2514
  }
2515
+
2389
2516
  .margin-top-sm {
2390
2517
  margin-block-start: var(--op-space-small);
2391
2518
  }
2519
+
2392
2520
  .margin-top-xs {
2393
2521
  margin-block-start: var(--op-space-x-small);
2394
2522
  }
2523
+
2395
2524
  .margin-top-none {
2396
2525
  margin-block-start: 0;
2397
2526
  }
2527
+
2398
2528
  /* Bottom Margin */
2529
+
2399
2530
  .margin-bottom-xl {
2400
2531
  margin-block-end: var(--op-space-x-large);
2401
2532
  }
2533
+
2402
2534
  .margin-bottom-lg {
2403
2535
  margin-block-end: var(--op-space-large);
2404
2536
  }
2537
+
2405
2538
  .margin-bottom-md {
2406
2539
  margin-block-end: var(--op-space-medium);
2407
2540
  }
2541
+
2408
2542
  .margin-bottom-sm {
2409
2543
  margin-block-end: var(--op-space-small);
2410
2544
  }
2545
+
2411
2546
  .margin-bottom-xs {
2412
2547
  margin-block-end: var(--op-space-x-small);
2413
2548
  }
2549
+
2414
2550
  .margin-bottom-none {
2415
2551
  margin-block-end: 0;
2416
2552
  }
2553
+
2417
2554
  /* Right Margin */
2555
+
2418
2556
  .margin-right-xl {
2419
2557
  margin-inline-end: var(--op-space-x-large);
2420
2558
  }
2559
+
2421
2560
  .margin-right-lg {
2422
2561
  margin-inline-end: var(--op-space-large);
2423
2562
  }
2563
+
2424
2564
  .margin-right-md {
2425
2565
  margin-inline-end: var(--op-space-medium);
2426
2566
  }
2567
+
2427
2568
  .margin-right-sm {
2428
2569
  margin-inline-end: var(--op-space-small);
2429
2570
  }
2571
+
2430
2572
  .margin-right-xs {
2431
2573
  margin-inline-end: var(--op-space-x-small);
2432
2574
  }
2575
+
2433
2576
  .margin-right-none {
2434
2577
  margin-inline-start: 0;
2435
2578
  }
2579
+
2436
2580
  /* Left Margin */
2581
+
2437
2582
  .margin-left-xl {
2438
2583
  margin-inline-start: var(--op-space-x-large);
2439
2584
  }
2585
+
2440
2586
  .margin-left-lg {
2441
2587
  margin-inline-start: var(--op-space-large);
2442
2588
  }
2589
+
2443
2590
  .margin-left-md {
2444
2591
  margin-inline-start: var(--op-space-medium);
2445
2592
  }
2593
+
2446
2594
  .margin-left-sm {
2447
2595
  margin-inline-start: var(--op-space-small);
2448
2596
  }
2597
+
2449
2598
  .margin-left-xs {
2450
2599
  margin-inline-start: var(--op-space-x-small);
2451
2600
  }
2601
+
2452
2602
  .margin-left-none {
2453
2603
  margin-inline-start: 0;
2454
2604
  }
2605
+
2455
2606
  /*
2456
2607
  Accessibility
2457
2608
  Use the following class to hide accessibility text that is needed for screen readers but needs to be hidden from regular users.
@@ -2465,34 +2616,183 @@ small {
2465
2616
  clip: rect(1px, 1px, 1px, 1px);
2466
2617
  inline-size: 1px;
2467
2618
  }
2619
+
2468
2620
  /* Advanced Layout Utilities */
2621
+
2469
2622
  /* Equivalent to .flex.flex-col.gap-md */
2470
2623
  .op-stack {
2471
2624
  display: flex;
2472
2625
  flex-direction: column;
2626
+ margin-block: 0;
2627
+ margin-inline: 0;
2628
+
2629
+ /* zero specificity. Lets utilities override */
2630
+ :where(&) {
2631
+ gap: var(--op-space-medium);
2632
+ }
2473
2633
  }
2474
- :where(.op-stack) {
2475
- gap: var(--op-space-medium);
2476
- }
2634
+
2477
2635
  /* Equivalent to .flex.flex-wrap.items-center.gap-md */
2478
2636
  .op-cluster {
2479
2637
  display: flex;
2480
2638
  flex-wrap: wrap;
2639
+ margin-block: 0;
2640
+ margin-inline: 0;
2641
+
2642
+ /* zero specificity. Lets utilities override */
2643
+ :where(&) {
2644
+ align-items: center;
2645
+ gap: var(--op-space-medium);
2646
+ }
2481
2647
  }
2482
- :where(.op-cluster) {
2483
- align-items: center;
2484
- gap: var(--op-space-medium);
2485
- }
2648
+
2486
2649
  /* Equivalent to .flex.flex-wrap.items-center.justify-between.gap-md */
2487
2650
  .op-split {
2488
2651
  display: flex;
2489
2652
  flex-wrap: wrap;
2490
2653
  justify-content: space-between;
2654
+ margin-block: 0;
2655
+ margin-inline: 0;
2656
+
2657
+ /* zero specificity. Lets utilities override */
2658
+ :where(&) {
2659
+ align-items: center;
2660
+ gap: var(--op-space-medium);
2661
+ }
2491
2662
  }
2492
- :where(.op-split) {
2493
- align-items: center;
2494
- gap: var(--op-space-medium);
2663
+
2664
+ /*
2665
+ side by side layout with a small area and a large area
2666
+ similar to .flex with a .flex-grow-1 within it, but with a more semantic name and wrap handling.
2667
+
2668
+ |[] [ ]|
2669
+ |[ ] []| with end
2670
+ */
2671
+ .op-flank {
2672
+ display: flex;
2673
+ margin-block: 0;
2674
+ margin-inline: 0;
2675
+
2676
+ /* zero specificity. Lets utilities override */
2677
+ :where(&) {
2678
+ flex-wrap: wrap;
2679
+ align-items: center;
2680
+ gap: var(--op-space-medium);
2681
+ }
2682
+
2683
+ /* Small area */
2684
+ &:not(.op-flank--end) > :first-child,
2685
+ &.op-flank--end > :last-child {
2686
+ flex-basis: auto;
2687
+ flex-grow: 1;
2688
+ }
2689
+
2690
+ /* Large area */
2691
+ &:not(.op-flank--end) > :last-child,
2692
+ &.op-flank--end > :first-child {
2693
+ flex-basis: 0;
2694
+ flex-grow: 999;
2695
+ }
2696
+ }
2697
+
2698
+ /* Grid Layout */
2699
+ .op-grid {
2700
+ --_op-grid-min-column-size: var(--op-space-4x-large);
2701
+ --_op-grid-max-column-size: 0px;
2702
+
2703
+ display: grid;
2704
+ grid-template-columns: repeat(
2705
+ auto-fit,
2706
+ minmax(max(var(--_op-grid-min-column-size), var(--_op-grid-max-column-size)), 1fr)
2707
+ );
2708
+ margin-block: 0;
2709
+ margin-inline: 0;
2710
+
2711
+ /* zero specificity. Lets utilities override */
2712
+ :where(&) {
2713
+ gap: var(--op-space-medium);
2714
+ }
2715
+
2716
+ &.op-grid--2-column {
2717
+ --_op-grid-max-column-size: calc(100% / 3);
2718
+ }
2719
+
2720
+ &.op-grid--3-column {
2721
+ --_op-grid-max-column-size: calc(100% / 4);
2722
+ }
2723
+
2724
+ &.op-grid--4-column {
2725
+ --_op-grid-max-column-size: calc(100% / 5);
2726
+ }
2727
+
2728
+ &.op-grid--5-column {
2729
+ --_op-grid-max-column-size: calc(100% / 6);
2730
+ }
2731
+
2732
+ &.op-grid--6-column {
2733
+ --_op-grid-max-column-size: calc(100% / 7);
2734
+ }
2735
+ }
2736
+
2737
+ /* Frame */
2738
+ @property --_op-frame-inline-size {
2739
+ inherits: true;
2740
+ initial-value: 100%;
2741
+ syntax: '<length> | <percentage>';
2495
2742
  }
2743
+
2744
+ .op-frame {
2745
+ display: flex;
2746
+ overflow: hidden;
2747
+ border-radius: inherit;
2748
+ aspect-ratio: 1 / 1;
2749
+ margin-block: 0;
2750
+ margin-inline: 0;
2751
+ max-inline-size: var(--_op-frame-inline-size);
2752
+
2753
+ :where(&) {
2754
+ align-items: center;
2755
+ justify-content: center;
2756
+ }
2757
+
2758
+ > img,
2759
+ > video {
2760
+ block-size: 100%;
2761
+ inline-size: 100%;
2762
+ object-fit: cover;
2763
+ }
2764
+
2765
+ /* aspect ratio */
2766
+
2767
+ &.op-frame--square {
2768
+ aspect-ratio: 1 / 1;
2769
+ }
2770
+
2771
+ &.op-frame--landscape {
2772
+ aspect-ratio: 16 / 9;
2773
+ }
2774
+
2775
+ &.op-frame--portrait {
2776
+ aspect-ratio: 9 / 16;
2777
+ }
2778
+
2779
+ &.op-frame--4-3 {
2780
+ aspect-ratio: 4 / 3;
2781
+ }
2782
+
2783
+ &.op-frame--3-4 {
2784
+ aspect-ratio: 3 / 4;
2785
+ }
2786
+
2787
+ &.op-frame--3-2 {
2788
+ aspect-ratio: 3 / 2;
2789
+ }
2790
+
2791
+ &.op-frame--2-3 {
2792
+ aspect-ratio: 2 / 3;
2793
+ }
2794
+ }
2795
+
2496
2796
  /* Components */
2497
2797
  .accordion {
2498
2798
  /* Public API (customizable component options) */
@@ -2539,7 +2839,7 @@ small {
2539
2839
  }
2540
2840
 
2541
2841
  &[open] {
2542
- summary .accordion__marker {
2842
+ > summary .accordion__marker {
2543
2843
  rotate: 0.25turn;
2544
2844
  }
2545
2845
 
@@ -3251,6 +3551,7 @@ small {
3251
3551
  }
3252
3552
  }
3253
3553
  }
3554
+
3254
3555
  .btn-group-toolbar {
3255
3556
  display: flex;
3256
3557
  flex-wrap: wrap;
@@ -3364,6 +3665,7 @@ small {
3364
3665
  }
3365
3666
  }
3366
3667
  }
3668
+
3367
3669
  /* stylelint-disable no-descending-specificity */
3368
3670
  .confirm-dialog {
3369
3671
  /* Public API (customizable component options) */
@@ -3551,6 +3853,7 @@ small {
3551
3853
  /* stylelint-enable selector-no-vendor-prefix */
3552
3854
  }
3553
3855
  }
3856
+
3554
3857
  /* Radio or Checkbox Form Control */
3555
3858
  .form-control:is([type='radio'], [type='checkbox']) {
3556
3859
  /* Public API (customizable component options) */
@@ -3569,6 +3872,7 @@ small {
3569
3872
  align-self: center;
3570
3873
  }
3571
3874
  }
3875
+
3572
3876
  /* Any Form Control that is not a radio or checkbox */
3573
3877
  .form-control:not([type='radio'], [type='checkbox']) {
3574
3878
  /* Public API (customizable component options) */
@@ -3631,6 +3935,7 @@ small {
3631
3935
  }
3632
3936
  }
3633
3937
  }
3938
+
3634
3939
  /* Color Form Control */
3635
3940
  .form-control[type='color'] {
3636
3941
  padding: var(--op-space-2x-small);
@@ -3645,6 +3950,7 @@ small {
3645
3950
  border-radius: var(--op-radius-medium);
3646
3951
  }
3647
3952
  }
3953
+
3648
3954
  /* File Form Control */
3649
3955
  .form-control[type='file'] {
3650
3956
  padding-block: 0;
@@ -3680,6 +3986,7 @@ small {
3680
3986
  --__op-btn-height: calc(var(--__op-btn-base-height) - var(--op-space-x-small));
3681
3987
  }
3682
3988
  }
3989
+
3683
3990
  select.form-control:not([multiple], [type='radio'], [type='checkbox']) {
3684
3991
  appearance: none;
3685
3992
  background-image: var(--op-encoded-images-dropdown-arrow);
@@ -3691,14 +3998,17 @@ select.form-control:not([multiple], [type='radio'], [type='checkbox']) {
3691
3998
  cursor: pointer;
3692
3999
  padding-inline-end: var(--op-space-3x-large);
3693
4000
  }
4001
+
3694
4002
  select.form-control[multiple] {
3695
4003
  min-block-size: calc(2 * var(--__op-form-control-height));
3696
4004
  }
4005
+
3697
4006
  textarea.form-control:not([type='radio'], [type='checkbox']) {
3698
4007
  block-size: calc(2 * var(--__op-form-control-height));
3699
4008
  max-inline-size: 100%;
3700
4009
  min-block-size: var(--__op-form-control-height);
3701
4010
  }
4011
+
3702
4012
  .form-label {
3703
4013
  color: var(--op-color-on-background);
3704
4014
  font-size: var(--op-font-x-small);
@@ -3706,16 +4016,19 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3706
4016
  letter-spacing: var(--op-letter-spacing-label);
3707
4017
  line-height: var(--op-line-height-base);
3708
4018
  }
4019
+
3709
4020
  .form-error {
3710
4021
  color: var(--op-color-alerts-danger-base);
3711
4022
  font-size: var(--op-font-x-small);
3712
4023
  inline-size: fit-content;
3713
4024
  }
4025
+
3714
4026
  .form-hint {
3715
4027
  display: block;
3716
4028
  font-size: var(--op-font-small);
3717
4029
  font-style: italic;
3718
4030
  }
4031
+
3719
4032
  .form-error-summary {
3720
4033
  padding: var(--op-space-large);
3721
4034
  border-radius: var(--op-radius-large);
@@ -3732,6 +4045,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3732
4045
  margin-block-end: 0;
3733
4046
  }
3734
4047
  }
4048
+
3735
4049
  .form-group {
3736
4050
  display: grid;
3737
4051
  align-content: baseline;
@@ -3762,6 +4076,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3762
4076
  }
3763
4077
  }
3764
4078
  }
4079
+
3765
4080
  .form-group--inline {
3766
4081
  align-items: center;
3767
4082
 
@@ -3783,6 +4098,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3783
4098
  }
3784
4099
  /* stylelint-enable no-descending-specificity */
3785
4100
  }
4101
+
3786
4102
  .form-group--error {
3787
4103
  /* stylelint-disable no-descending-specificity */
3788
4104
  .form-control {
@@ -3872,6 +4188,13 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3872
4188
  --_op-icon-optical-size-large: 40;
3873
4189
  --_op-icon-optical-size-x-large: 48;
3874
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
+
3875
4198
  /* Private API (component option defaults) */
3876
4199
  --__op-icon-weight: var(--_op-icon-weight-normal);
3877
4200
  --__op-icon-fill: var(--_op-icon-fill-outlined);
@@ -3899,18 +4222,22 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3899
4222
  /* Weight Modifiers */
3900
4223
  &.icon--weight-light {
3901
4224
  --__op-icon-weight: var(--_op-icon-weight-light);
4225
+ --__op-icon-stroke-width: var(--_op-icon-stroke-width-light);
3902
4226
  }
3903
4227
 
3904
4228
  &.icon--weight-normal {
3905
4229
  --__op-icon-weight: var(--_op-icon-weight-normal);
4230
+ --__op-icon-stroke-width: var(--_op-icon-stroke-width-normal);
3906
4231
  }
3907
4232
 
3908
4233
  &.icon--weight-semi-bold {
3909
4234
  --__op-icon-weight: var(--_op-icon-weight-semi-bold);
4235
+ --__op-icon-stroke-width: var(--_op-icon-stroke-width-semi-bold);
3910
4236
  }
3911
4237
 
3912
4238
  &.icon--weight-bold {
3913
4239
  --__op-icon-weight: var(--_op-icon-weight-bold);
4240
+ --__op-icon-stroke-width: var(--_op-icon-stroke-width-bold);
3914
4241
  }
3915
4242
 
3916
4243
  /* Emphasis */
@@ -3946,7 +4273,27 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3946
4273
  --__op-icon-font-size: var(--_op-icon-font-size-x-large);
3947
4274
  --__op-icon-optical-size: var(--_op-icon-optical-size-x-large);
3948
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
+ }
3949
4295
  }
4296
+
3950
4297
  /* Material Icons class provided by the Google Fonts CDN */
3951
4298
  .material-symbols-outlined {
3952
4299
  font-variation-settings:
@@ -3956,6 +4303,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3956
4303
  'opsz' var(--__op-icon-optical-size);
3957
4304
  font-weight: unset;
3958
4305
  }
4306
+
3959
4307
  /* Custom SVG Icons app specific */
3960
4308
  .custom-icons {
3961
4309
  svg {
@@ -4005,6 +4353,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
4005
4353
  }
4006
4354
  }
4007
4355
  }
4356
+
4008
4357
  .modal {
4009
4358
  /* Public API (customizable component options) */
4010
4359
  --_op-modal-width: calc(141 * var(--op-size-unit)); /* 564px */
@@ -4050,6 +4399,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
4050
4399
  gap: var(--op-space-small);
4051
4400
  }
4052
4401
  }
4402
+
4053
4403
  dialog.modal {
4054
4404
  padding: 0;
4055
4405
  border: none;
@@ -4082,6 +4432,7 @@ dialog.modal {
4082
4432
  }
4083
4433
  }
4084
4434
  }
4435
+
4085
4436
  @starting-style {
4086
4437
  dialog.modal[open] {
4087
4438
  transform: scale(0.7);
@@ -4589,6 +4940,7 @@ dialog.modal {
4589
4940
  --__op-spinner-track-width: var(--_op-spinner-track-width-large);
4590
4941
  }
4591
4942
  }
4943
+
4592
4944
  @keyframes spinner {
4593
4945
  to {
4594
4946
  transform: rotate(360deg);
@@ -4705,6 +5057,7 @@ dialog.modal {
4705
5057
  display: flex;
4706
5058
  align-items: center;
4707
5059
  }
5060
+
4708
5061
  .tab {
4709
5062
  /* Public API */
4710
5063
  --_op-tab-font-small: var(--op-font-x-small);
@@ -5089,7 +5442,11 @@ dialog.modal {
5089
5442
 
5090
5443
  display: flex;
5091
5444
  flex-direction: column;
5092
- gap: var(--op-space-x-small);
5445
+
5446
+ /* zero specificity. Lets utilities override */
5447
+ :where(&) {
5448
+ gap: var(--op-space-x-small);
5449
+ }
5093
5450
 
5094
5451
  &.text-pair--inline {
5095
5452
  flex-direction: row;
@@ -5133,6 +5490,7 @@ dialog.modal {
5133
5490
  }
5134
5491
  }
5135
5492
  /* Inspired by https://blog.logrocket.com/creating-beautiful-tooltips-with-only-css/ */
5493
+
5136
5494
  [data-tooltip-text] {
5137
5495
  /* Public API (customizable component options) */
5138
5496
  --_op-tooltip-max-width: calc(50 * var(--op-size-unit)); /* 200px */