@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
  Instead of hosting the font files locally which requires a compiler to handle them, we pull fonts
@@ -79,19 +88,23 @@ Noto Sans supports:
79
88
  font-stretch: {anything between 62.5% and 100%}
80
89
  font-style: {normal or italic}
81
90
  */
91
+
82
92
  /*
83
93
  Noto Serif supports:
84
94
  font-weight: {anything between 100 and 900}
85
95
  font-stretch: {anything between 62.5% and 100%}
86
96
  font-style: {normal or italic}
87
97
  */
98
+
88
99
  /* Noto Sans and Noto Serif */
89
100
  /*
90
101
  See all icons at: https://fonts.google.com/icons?icon.set=Material+Symbols
91
102
  This import of Material Symbols supports:
92
103
  font weight set through: font-variation-settings: 'wght' {100..700}
93
104
  */
105
+
94
106
  /* Material Symbols */
107
+
95
108
  /* Tokens */
96
109
  :root {
97
110
  /* Color HSLs
@@ -412,6 +425,7 @@ Noto Sans supports:
412
425
  var(--op-input-inner-focus) var(--op-color-alerts-notice-plus-two),
413
426
  var(--op-input-outer-focus) var(--op-color-alerts-notice-plus-five);
414
427
  }
428
+
415
429
  /* Animations */
416
430
  @keyframes rm-slide-in-out-flash {
417
431
  /*
@@ -1891,10 +1905,12 @@ Noto Sans supports:
1891
1905
  --op-color-on-background: var(--op-color-neutral-on-plus-eight);
1892
1906
  --op-color-on-background-alt: var(--op-color-neutral-on-plus-eight-alt);
1893
1907
  }
1908
+
1894
1909
  /* Force Light Mode */
1895
1910
  :root[data-theme-mode='light'] {
1896
1911
  color-scheme: only light;
1897
1912
  }
1913
+
1898
1914
  /* Force Dark Mode */
1899
1915
  :root[data-theme-mode='dark'] {
1900
1916
  color-scheme: only dark;
@@ -1914,6 +1930,7 @@ Noto Sans supports:
1914
1930
  */
1915
1931
  --op-encoded-images-dropdown-arrow: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iOSIgdmlld0JveD0iMCAwIDEyIDkiIGZpbGw9IiNmZmYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik02IDguMzc1MDFMMCAyLjM3NTAxTDEuNCAwLjk3NTAwNkw2IDUuNTc1MDFMMTAuNiAwLjk3NTAwNkwxMiAyLjM3NTAxTDYgOC4zNzUwMVoiIGZpbGw9IiNmZmYiLz4KPC9zdmc+Cg==');
1916
1932
  }
1933
+
1917
1934
  @media (prefers-color-scheme: dark) {
1918
1935
  :root:not([data-theme-mode='light']) {
1919
1936
  /**
@@ -1932,13 +1949,16 @@ Noto Sans supports:
1932
1949
  --op-encoded-images-dropdown-arrow: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iOSIgdmlld0JveD0iMCAwIDEyIDkiIGZpbGw9IiNmZmYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik02IDguMzc1MDFMMCAyLjM3NTAxTDEuNCAwLjk3NTAwNkw2IDUuNTc1MDFMMTAuNiAwLjk3NTAwNkwxMiAyLjM3NTAxTDYgOC4zNzUwMVoiIGZpbGw9IiNmZmYiLz4KPC9zdmc+Cg==');
1933
1950
  }
1934
1951
  }
1952
+
1935
1953
  /* Base styles and utilities */
1936
1954
  /* After a reset, introduce base element styles specific to this system */
1955
+
1937
1956
  html {
1938
1957
  overflow: hidden; /* Needed to prevent flash messages and panels from causing overflow */
1939
1958
  font-family: var(--op-font-family);
1940
1959
  font-size: 62.5%; /* 1rem = 10px */
1941
1960
  }
1961
+
1942
1962
  body {
1943
1963
  overflow: auto;
1944
1964
  background: var(--op-color-background);
@@ -1946,14 +1966,17 @@ body {
1946
1966
  color: var(--op-color-on-background);
1947
1967
  font-size: var(--op-font-medium);
1948
1968
  }
1969
+
1949
1970
  button {
1950
1971
  background: none;
1951
1972
  cursor: pointer;
1952
1973
  }
1974
+
1953
1975
  button,
1954
1976
  input[type='submit'] {
1955
1977
  border: 0;
1956
1978
  }
1979
+
1957
1980
  label {
1958
1981
  display: inline-block;
1959
1982
 
@@ -1961,9 +1984,11 @@ label {
1961
1984
  cursor: pointer;
1962
1985
  }
1963
1986
  }
1987
+
1964
1988
  a {
1965
1989
  color: var(--op-color-primary-original);
1966
1990
  }
1991
+
1967
1992
  blockquote,
1968
1993
  dl,
1969
1994
  dd,
@@ -1977,6 +2002,7 @@ figure,
1977
2002
  pre {
1978
2003
  margin: 0;
1979
2004
  }
2005
+
1980
2006
  h1,
1981
2007
  h2,
1982
2008
  h3,
@@ -1986,28 +2012,36 @@ h6 {
1986
2012
  font-weight: var(--op-font-weight-normal);
1987
2013
  margin-block: 0 var(--op-space-small);
1988
2014
  }
2015
+
1989
2016
  h1 {
1990
2017
  font-size: var(--op-font-3x-large);
1991
2018
  }
2019
+
1992
2020
  h2 {
1993
2021
  font-size: var(--op-font-2x-large);
1994
2022
  }
2023
+
1995
2024
  h3 {
1996
2025
  font-size: var(--op-font-large);
1997
2026
  }
2027
+
1998
2028
  h4 {
1999
2029
  font-size: var(--op-font-medium);
2000
2030
  }
2031
+
2001
2032
  h5 {
2002
2033
  font-size: var(--op-font-small);
2003
2034
  }
2035
+
2004
2036
  h6 {
2005
2037
  font-size: var(--op-font-x-small);
2006
2038
  }
2039
+
2007
2040
  p {
2008
2041
  font-size: var(--op-font-medium);
2009
2042
  margin-block-end: var(--op-space-small);
2010
2043
  }
2044
+
2011
2045
  small {
2012
2046
  font-size: var(--op-font-small);
2013
2047
  }
@@ -2017,11 +2051,13 @@ small {
2017
2051
  grid-template-columns: auto 1fr auto;
2018
2052
  inline-size: 100%;
2019
2053
  }
2054
+
2020
2055
  .app-body {
2021
2056
  display: flex;
2022
2057
  overflow: auto;
2023
2058
  flex-direction: column;
2024
2059
  }
2060
+
2025
2061
  .app__header {
2026
2062
  position: sticky;
2027
2063
  z-index: var(--op-z-index-header);
@@ -2029,6 +2065,7 @@ small {
2029
2065
  flex-shrink: 0;
2030
2066
  inset-block-start: 0;
2031
2067
  }
2068
+
2032
2069
  .app__content {
2033
2070
  flex-grow: 1;
2034
2071
  padding: 0 var(--op-space-large);
@@ -2036,12 +2073,14 @@ small {
2036
2073
  inline-size: 100%;
2037
2074
  max-inline-size: var(--op-breakpoint-medium);
2038
2075
  }
2076
+
2039
2077
  .app__content-no-margin {
2040
2078
  flex-grow: 1;
2041
2079
  padding: 0 var(--op-space-large);
2042
2080
  inline-size: 100%;
2043
2081
  overflow-y: auto;
2044
2082
  }
2083
+
2045
2084
  .app__footer {
2046
2085
  position: sticky;
2047
2086
  z-index: var(--op-z-index-footer);
@@ -2049,6 +2088,7 @@ small {
2049
2088
  flex-shrink: 0;
2050
2089
  inset-block-end: 0;
2051
2090
  }
2091
+
2052
2092
  /*
2053
2093
  <html lang='en'>
2054
2094
  <head>...</head>
@@ -2063,6 +2103,7 @@ small {
2063
2103
  </body>
2064
2104
  </html>
2065
2105
  */
2106
+
2066
2107
  :root:has(.op-page) {
2067
2108
  /* Reset existing Optics layout */
2068
2109
  overflow: unset;
@@ -2080,6 +2121,7 @@ small {
2080
2121
  min-block-size: 100%;
2081
2122
  }
2082
2123
  }
2124
+
2083
2125
  .op-page {
2084
2126
  display: grid;
2085
2127
  grid-template-areas: 'sidebar-left main sidebar-right';
@@ -2154,6 +2196,7 @@ small {
2154
2196
  }
2155
2197
  }
2156
2198
  /* Container Properties */
2199
+
2157
2200
  .container {
2158
2201
  inline-size: 100%;
2159
2202
  margin-block: 0;
@@ -2162,299 +2205,408 @@ small {
2162
2205
  padding-block: 0;
2163
2206
  padding-inline: var(--op-space-large);
2164
2207
  }
2208
+
2165
2209
  .container--sm {
2166
2210
  max-inline-size: var(--op-breakpoint-small);
2167
2211
  }
2212
+
2168
2213
  .container--md-padding {
2169
2214
  padding: 0 var(--op-space-medium);
2170
2215
  }
2216
+
2171
2217
  .container--sm-padding {
2172
2218
  padding: 0 var(--op-space-small);
2173
2219
  }
2220
+
2174
2221
  .container--xs {
2175
2222
  max-inline-size: var(--op-breakpoint-x-small);
2176
2223
  }
2224
+
2177
2225
  /* Width Properties */
2226
+
2178
2227
  .full-width {
2179
2228
  inline-size: 100%;
2180
2229
  }
2230
+
2181
2231
  .half-width {
2182
2232
  inline-size: 50%;
2183
2233
  }
2234
+
2184
2235
  .four-fifths-width {
2185
2236
  inline-size: calc(100% * 4 / 5);
2186
2237
  }
2238
+
2187
2239
  .three-fifths-width {
2188
2240
  inline-size: calc(100% * 3 / 5);
2189
2241
  }
2242
+
2190
2243
  .two-fifths-width {
2191
2244
  inline-size: calc(100% * 2 / 5);
2192
2245
  }
2246
+
2193
2247
  .one-fifth-width {
2194
2248
  inline-size: calc(100% * 1 / 5);
2195
2249
  }
2250
+
2196
2251
  .three-quarters-width {
2197
2252
  inline-size: calc(100% * 3 / 4);
2198
2253
  }
2254
+
2199
2255
  .one-quarter-width {
2200
2256
  inline-size: calc(100% * 1 / 4);
2201
2257
  }
2258
+
2202
2259
  .two-thirds-width {
2203
2260
  inline-size: calc(100% * 2 / 3);
2204
2261
  }
2262
+
2205
2263
  .one-third-width {
2206
2264
  inline-size: calc(100% * 1 / 3);
2207
2265
  }
2266
+
2208
2267
  /* Flex Properties */
2268
+
2209
2269
  .flex {
2210
2270
  display: flex;
2211
2271
  }
2272
+
2212
2273
  .flex-col {
2213
2274
  flex-direction: column;
2214
2275
  }
2276
+
2215
2277
  .flex-row {
2216
2278
  flex-direction: row;
2217
2279
  }
2280
+
2218
2281
  .flex-wrap {
2219
2282
  flex-wrap: wrap;
2220
2283
  }
2284
+
2221
2285
  .flex-no-wrap {
2222
2286
  flex-wrap: nowrap;
2223
2287
  }
2288
+
2224
2289
  .flex-grow-1 {
2225
2290
  flex-grow: 1;
2226
2291
  }
2292
+
2227
2293
  /* Gap Properties */
2294
+ .gap-none {
2295
+ gap: 0;
2296
+
2297
+ --op-gap: 0;
2298
+ }
2299
+
2228
2300
  .gap-xxs {
2229
2301
  gap: var(--op-space-2x-small);
2230
2302
 
2231
2303
  --op-gap: var(--op-space-2x-small);
2232
2304
  }
2305
+
2233
2306
  .gap-xs {
2234
2307
  gap: var(--op-space-x-small);
2235
2308
 
2236
2309
  --op-gap: var(--op-space-x-small);
2237
2310
  }
2311
+
2238
2312
  .gap-sm {
2239
2313
  gap: var(--op-space-small);
2240
2314
 
2241
2315
  --op-gap: var(--op-space-small);
2242
2316
  }
2317
+
2243
2318
  .gap-md {
2244
2319
  gap: var(--op-space-medium);
2245
2320
 
2246
2321
  --op-gap: var(--op-space-medium);
2247
2322
  }
2323
+
2248
2324
  .gap-lg {
2249
2325
  gap: var(--op-space-large);
2250
2326
 
2251
2327
  --op-gap: var(--op-space-large);
2252
2328
  }
2329
+
2253
2330
  .gap-xl {
2254
2331
  gap: var(--op-space-x-large);
2255
2332
 
2256
2333
  --op-gap: var(--op-space-x-large);
2257
2334
  }
2335
+
2258
2336
  /* Justify Content */
2337
+
2259
2338
  .justify-start {
2260
2339
  justify-content: flex-start;
2261
2340
  }
2341
+
2262
2342
  .justify-center {
2263
2343
  justify-content: center;
2264
2344
  }
2345
+
2265
2346
  .justify-end {
2266
2347
  justify-content: flex-end;
2267
2348
  }
2349
+
2268
2350
  .justify-between {
2269
2351
  justify-content: space-between;
2270
2352
  }
2353
+
2271
2354
  .justify-around {
2272
2355
  justify-content: space-around;
2273
2356
  }
2357
+
2274
2358
  /* Align Items */
2359
+
2275
2360
  .items-stretch {
2276
2361
  align-items: stretch;
2277
2362
  }
2363
+
2278
2364
  .items-start {
2279
2365
  align-items: flex-start;
2280
2366
  }
2367
+
2281
2368
  .items-center {
2282
2369
  align-items: center;
2283
2370
  }
2371
+
2284
2372
  .items-end {
2285
2373
  align-items: flex-end;
2286
2374
  }
2375
+
2287
2376
  .items-baseline {
2288
2377
  align-items: baseline;
2289
2378
  }
2379
+
2290
2380
  /* Align Self */
2381
+
2291
2382
  .self-auto {
2292
2383
  align-self: auto;
2293
2384
  }
2385
+
2294
2386
  .self-start {
2295
2387
  align-self: flex-start;
2296
2388
  }
2389
+
2297
2390
  .self-center {
2298
2391
  align-self: center;
2299
2392
  }
2393
+
2300
2394
  .self-end {
2301
2395
  align-self: flex-end;
2302
2396
  }
2397
+
2303
2398
  .self-stretch {
2304
2399
  align-self: stretch;
2305
2400
  }
2401
+
2306
2402
  .self-baseline {
2307
2403
  align-self: baseline;
2308
2404
  }
2405
+
2309
2406
  /* Text Alignment */
2407
+
2310
2408
  .text-left {
2311
2409
  text-align: start;
2312
2410
  }
2411
+
2313
2412
  .text-center {
2314
2413
  text-align: center;
2315
2414
  }
2415
+
2316
2416
  .text-right {
2317
2417
  text-align: end;
2318
2418
  }
2419
+
2319
2420
  .text-justify {
2320
2421
  text-align: justify;
2321
2422
  }
2423
+
2322
2424
  /* Box Margin */
2425
+
2323
2426
  .margin-xl {
2324
2427
  margin: var(--op-space-x-large);
2325
2428
  }
2429
+
2326
2430
  .margin-lg {
2327
2431
  margin: var(--op-space-large);
2328
2432
  }
2433
+
2329
2434
  .margin-md {
2330
2435
  margin: var(--op-space-medium);
2331
2436
  }
2437
+
2332
2438
  .margin-sm {
2333
2439
  margin: var(--op-space-small);
2334
2440
  }
2441
+
2335
2442
  .margin-xs {
2336
2443
  margin: var(--op-space-x-small);
2337
2444
  }
2445
+
2338
2446
  .margin-none {
2339
2447
  margin: 0;
2340
2448
  }
2449
+
2341
2450
  .margin-auto {
2342
2451
  margin: auto;
2343
2452
  }
2453
+
2344
2454
  /* Vertical Margin */
2455
+
2345
2456
  .margin-y-xl {
2346
2457
  margin-block: var(--op-space-x-large);
2347
2458
  }
2459
+
2348
2460
  .margin-y-lg {
2349
2461
  margin-block: var(--op-space-large);
2350
2462
  }
2463
+
2351
2464
  .margin-y-md {
2352
2465
  margin-block: var(--op-space-medium);
2353
2466
  }
2467
+
2354
2468
  .margin-y-sm {
2355
2469
  margin-block: var(--op-space-small);
2356
2470
  }
2471
+
2357
2472
  .margin-y-xs {
2358
2473
  margin-block: var(--op-space-x-small);
2359
2474
  }
2475
+
2360
2476
  .margin-y-none {
2361
2477
  margin-block: 0;
2362
2478
  }
2479
+
2363
2480
  /* Horizontal Margin */
2481
+
2364
2482
  .margin-x-xl {
2365
2483
  margin-inline: var(--op-space-x-large);
2366
2484
  }
2485
+
2367
2486
  .margin-x-lg {
2368
2487
  margin-inline: var(--op-space-large);
2369
2488
  }
2489
+
2370
2490
  .margin-x-md {
2371
2491
  margin-inline: var(--op-space-medium);
2372
2492
  }
2493
+
2373
2494
  .margin-x-sm {
2374
2495
  margin-inline: var(--op-space-small);
2375
2496
  }
2497
+
2376
2498
  .margin-x-xs {
2377
2499
  margin-inline: var(--op-space-x-small);
2378
2500
  }
2501
+
2379
2502
  .margin-x-none {
2380
2503
  margin-inline: 0;
2381
2504
  }
2505
+
2382
2506
  /* Top Margin */
2507
+
2383
2508
  .margin-top-xl {
2384
2509
  margin-block-start: var(--op-space-x-large);
2385
2510
  }
2511
+
2386
2512
  .margin-top-lg {
2387
2513
  margin-block-start: var(--op-space-large);
2388
2514
  }
2515
+
2389
2516
  .margin-top-md {
2390
2517
  margin-block-start: var(--op-space-medium);
2391
2518
  }
2519
+
2392
2520
  .margin-top-sm {
2393
2521
  margin-block-start: var(--op-space-small);
2394
2522
  }
2523
+
2395
2524
  .margin-top-xs {
2396
2525
  margin-block-start: var(--op-space-x-small);
2397
2526
  }
2527
+
2398
2528
  .margin-top-none {
2399
2529
  margin-block-start: 0;
2400
2530
  }
2531
+
2401
2532
  /* Bottom Margin */
2533
+
2402
2534
  .margin-bottom-xl {
2403
2535
  margin-block-end: var(--op-space-x-large);
2404
2536
  }
2537
+
2405
2538
  .margin-bottom-lg {
2406
2539
  margin-block-end: var(--op-space-large);
2407
2540
  }
2541
+
2408
2542
  .margin-bottom-md {
2409
2543
  margin-block-end: var(--op-space-medium);
2410
2544
  }
2545
+
2411
2546
  .margin-bottom-sm {
2412
2547
  margin-block-end: var(--op-space-small);
2413
2548
  }
2549
+
2414
2550
  .margin-bottom-xs {
2415
2551
  margin-block-end: var(--op-space-x-small);
2416
2552
  }
2553
+
2417
2554
  .margin-bottom-none {
2418
2555
  margin-block-end: 0;
2419
2556
  }
2557
+
2420
2558
  /* Right Margin */
2559
+
2421
2560
  .margin-right-xl {
2422
2561
  margin-inline-end: var(--op-space-x-large);
2423
2562
  }
2563
+
2424
2564
  .margin-right-lg {
2425
2565
  margin-inline-end: var(--op-space-large);
2426
2566
  }
2567
+
2427
2568
  .margin-right-md {
2428
2569
  margin-inline-end: var(--op-space-medium);
2429
2570
  }
2571
+
2430
2572
  .margin-right-sm {
2431
2573
  margin-inline-end: var(--op-space-small);
2432
2574
  }
2575
+
2433
2576
  .margin-right-xs {
2434
2577
  margin-inline-end: var(--op-space-x-small);
2435
2578
  }
2579
+
2436
2580
  .margin-right-none {
2437
2581
  margin-inline-start: 0;
2438
2582
  }
2583
+
2439
2584
  /* Left Margin */
2585
+
2440
2586
  .margin-left-xl {
2441
2587
  margin-inline-start: var(--op-space-x-large);
2442
2588
  }
2589
+
2443
2590
  .margin-left-lg {
2444
2591
  margin-inline-start: var(--op-space-large);
2445
2592
  }
2593
+
2446
2594
  .margin-left-md {
2447
2595
  margin-inline-start: var(--op-space-medium);
2448
2596
  }
2597
+
2449
2598
  .margin-left-sm {
2450
2599
  margin-inline-start: var(--op-space-small);
2451
2600
  }
2601
+
2452
2602
  .margin-left-xs {
2453
2603
  margin-inline-start: var(--op-space-x-small);
2454
2604
  }
2605
+
2455
2606
  .margin-left-none {
2456
2607
  margin-inline-start: 0;
2457
2608
  }
2609
+
2458
2610
  /*
2459
2611
  Accessibility
2460
2612
  Use the following class to hide accessibility text that is needed for screen readers but needs to be hidden from regular users.
@@ -2468,34 +2620,183 @@ small {
2468
2620
  clip: rect(1px, 1px, 1px, 1px);
2469
2621
  inline-size: 1px;
2470
2622
  }
2623
+
2471
2624
  /* Advanced Layout Utilities */
2625
+
2472
2626
  /* Equivalent to .flex.flex-col.gap-md */
2473
2627
  .op-stack {
2474
2628
  display: flex;
2475
2629
  flex-direction: column;
2630
+ margin-block: 0;
2631
+ margin-inline: 0;
2632
+
2633
+ /* zero specificity. Lets utilities override */
2634
+ :where(&) {
2635
+ gap: var(--op-space-medium);
2636
+ }
2476
2637
  }
2477
- :where(.op-stack) {
2478
- gap: var(--op-space-medium);
2479
- }
2638
+
2480
2639
  /* Equivalent to .flex.flex-wrap.items-center.gap-md */
2481
2640
  .op-cluster {
2482
2641
  display: flex;
2483
2642
  flex-wrap: wrap;
2643
+ margin-block: 0;
2644
+ margin-inline: 0;
2645
+
2646
+ /* zero specificity. Lets utilities override */
2647
+ :where(&) {
2648
+ align-items: center;
2649
+ gap: var(--op-space-medium);
2650
+ }
2484
2651
  }
2485
- :where(.op-cluster) {
2486
- align-items: center;
2487
- gap: var(--op-space-medium);
2488
- }
2652
+
2489
2653
  /* Equivalent to .flex.flex-wrap.items-center.justify-between.gap-md */
2490
2654
  .op-split {
2491
2655
  display: flex;
2492
2656
  flex-wrap: wrap;
2493
2657
  justify-content: space-between;
2658
+ margin-block: 0;
2659
+ margin-inline: 0;
2660
+
2661
+ /* zero specificity. Lets utilities override */
2662
+ :where(&) {
2663
+ align-items: center;
2664
+ gap: var(--op-space-medium);
2665
+ }
2494
2666
  }
2495
- :where(.op-split) {
2496
- align-items: center;
2497
- gap: var(--op-space-medium);
2667
+
2668
+ /*
2669
+ side by side layout with a small area and a large area
2670
+ similar to .flex with a .flex-grow-1 within it, but with a more semantic name and wrap handling.
2671
+
2672
+ |[] [ ]|
2673
+ |[ ] []| with end
2674
+ */
2675
+ .op-flank {
2676
+ display: flex;
2677
+ margin-block: 0;
2678
+ margin-inline: 0;
2679
+
2680
+ /* zero specificity. Lets utilities override */
2681
+ :where(&) {
2682
+ flex-wrap: wrap;
2683
+ align-items: center;
2684
+ gap: var(--op-space-medium);
2685
+ }
2686
+
2687
+ /* Small area */
2688
+ &:not(.op-flank--end) > :first-child,
2689
+ &.op-flank--end > :last-child {
2690
+ flex-basis: auto;
2691
+ flex-grow: 1;
2692
+ }
2693
+
2694
+ /* Large area */
2695
+ &:not(.op-flank--end) > :last-child,
2696
+ &.op-flank--end > :first-child {
2697
+ flex-basis: 0;
2698
+ flex-grow: 999;
2699
+ }
2700
+ }
2701
+
2702
+ /* Grid Layout */
2703
+ .op-grid {
2704
+ --_op-grid-min-column-size: var(--op-space-4x-large);
2705
+ --_op-grid-max-column-size: 0px;
2706
+
2707
+ display: grid;
2708
+ grid-template-columns: repeat(
2709
+ auto-fit,
2710
+ minmax(max(var(--_op-grid-min-column-size), var(--_op-grid-max-column-size)), 1fr)
2711
+ );
2712
+ margin-block: 0;
2713
+ margin-inline: 0;
2714
+
2715
+ /* zero specificity. Lets utilities override */
2716
+ :where(&) {
2717
+ gap: var(--op-space-medium);
2718
+ }
2719
+
2720
+ &.op-grid--2-column {
2721
+ --_op-grid-max-column-size: calc(100% / 3);
2722
+ }
2723
+
2724
+ &.op-grid--3-column {
2725
+ --_op-grid-max-column-size: calc(100% / 4);
2726
+ }
2727
+
2728
+ &.op-grid--4-column {
2729
+ --_op-grid-max-column-size: calc(100% / 5);
2730
+ }
2731
+
2732
+ &.op-grid--5-column {
2733
+ --_op-grid-max-column-size: calc(100% / 6);
2734
+ }
2735
+
2736
+ &.op-grid--6-column {
2737
+ --_op-grid-max-column-size: calc(100% / 7);
2738
+ }
2739
+ }
2740
+
2741
+ /* Frame */
2742
+ @property --_op-frame-inline-size {
2743
+ inherits: true;
2744
+ initial-value: 100%;
2745
+ syntax: '<length> | <percentage>';
2498
2746
  }
2747
+
2748
+ .op-frame {
2749
+ display: flex;
2750
+ overflow: hidden;
2751
+ border-radius: inherit;
2752
+ aspect-ratio: 1 / 1;
2753
+ margin-block: 0;
2754
+ margin-inline: 0;
2755
+ max-inline-size: var(--_op-frame-inline-size);
2756
+
2757
+ :where(&) {
2758
+ align-items: center;
2759
+ justify-content: center;
2760
+ }
2761
+
2762
+ > img,
2763
+ > video {
2764
+ block-size: 100%;
2765
+ inline-size: 100%;
2766
+ object-fit: cover;
2767
+ }
2768
+
2769
+ /* aspect ratio */
2770
+
2771
+ &.op-frame--square {
2772
+ aspect-ratio: 1 / 1;
2773
+ }
2774
+
2775
+ &.op-frame--landscape {
2776
+ aspect-ratio: 16 / 9;
2777
+ }
2778
+
2779
+ &.op-frame--portrait {
2780
+ aspect-ratio: 9 / 16;
2781
+ }
2782
+
2783
+ &.op-frame--4-3 {
2784
+ aspect-ratio: 4 / 3;
2785
+ }
2786
+
2787
+ &.op-frame--3-4 {
2788
+ aspect-ratio: 3 / 4;
2789
+ }
2790
+
2791
+ &.op-frame--3-2 {
2792
+ aspect-ratio: 3 / 2;
2793
+ }
2794
+
2795
+ &.op-frame--2-3 {
2796
+ aspect-ratio: 2 / 3;
2797
+ }
2798
+ }
2799
+
2499
2800
  /* Components */
2500
2801
  .accordion {
2501
2802
  /* Public API (customizable component options) */
@@ -2542,7 +2843,7 @@ small {
2542
2843
  }
2543
2844
 
2544
2845
  &[open] {
2545
- summary .accordion__marker {
2846
+ > summary .accordion__marker {
2546
2847
  rotate: 0.25turn;
2547
2848
  }
2548
2849
 
@@ -3254,6 +3555,7 @@ small {
3254
3555
  }
3255
3556
  }
3256
3557
  }
3558
+
3257
3559
  .btn-group-toolbar {
3258
3560
  display: flex;
3259
3561
  flex-wrap: wrap;
@@ -3367,6 +3669,7 @@ small {
3367
3669
  }
3368
3670
  }
3369
3671
  }
3672
+
3370
3673
  /* stylelint-disable no-descending-specificity */
3371
3674
  .confirm-dialog {
3372
3675
  /* Public API (customizable component options) */
@@ -3554,6 +3857,7 @@ small {
3554
3857
  /* stylelint-enable selector-no-vendor-prefix */
3555
3858
  }
3556
3859
  }
3860
+
3557
3861
  /* Radio or Checkbox Form Control */
3558
3862
  .form-control:is([type='radio'], [type='checkbox']) {
3559
3863
  /* Public API (customizable component options) */
@@ -3572,6 +3876,7 @@ small {
3572
3876
  align-self: center;
3573
3877
  }
3574
3878
  }
3879
+
3575
3880
  /* Any Form Control that is not a radio or checkbox */
3576
3881
  .form-control:not([type='radio'], [type='checkbox']) {
3577
3882
  /* Public API (customizable component options) */
@@ -3634,6 +3939,7 @@ small {
3634
3939
  }
3635
3940
  }
3636
3941
  }
3942
+
3637
3943
  /* Color Form Control */
3638
3944
  .form-control[type='color'] {
3639
3945
  padding: var(--op-space-2x-small);
@@ -3648,6 +3954,7 @@ small {
3648
3954
  border-radius: var(--op-radius-medium);
3649
3955
  }
3650
3956
  }
3957
+
3651
3958
  /* File Form Control */
3652
3959
  .form-control[type='file'] {
3653
3960
  padding-block: 0;
@@ -3683,6 +3990,7 @@ small {
3683
3990
  --__op-btn-height: calc(var(--__op-btn-base-height) - var(--op-space-x-small));
3684
3991
  }
3685
3992
  }
3993
+
3686
3994
  select.form-control:not([multiple], [type='radio'], [type='checkbox']) {
3687
3995
  appearance: none;
3688
3996
  background-image: var(--op-encoded-images-dropdown-arrow);
@@ -3694,14 +4002,17 @@ select.form-control:not([multiple], [type='radio'], [type='checkbox']) {
3694
4002
  cursor: pointer;
3695
4003
  padding-inline-end: var(--op-space-3x-large);
3696
4004
  }
4005
+
3697
4006
  select.form-control[multiple] {
3698
4007
  min-block-size: calc(2 * var(--__op-form-control-height));
3699
4008
  }
4009
+
3700
4010
  textarea.form-control:not([type='radio'], [type='checkbox']) {
3701
4011
  block-size: calc(2 * var(--__op-form-control-height));
3702
4012
  max-inline-size: 100%;
3703
4013
  min-block-size: var(--__op-form-control-height);
3704
4014
  }
4015
+
3705
4016
  .form-label {
3706
4017
  color: var(--op-color-on-background);
3707
4018
  font-size: var(--op-font-x-small);
@@ -3709,16 +4020,19 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3709
4020
  letter-spacing: var(--op-letter-spacing-label);
3710
4021
  line-height: var(--op-line-height-base);
3711
4022
  }
4023
+
3712
4024
  .form-error {
3713
4025
  color: var(--op-color-alerts-danger-base);
3714
4026
  font-size: var(--op-font-x-small);
3715
4027
  inline-size: fit-content;
3716
4028
  }
4029
+
3717
4030
  .form-hint {
3718
4031
  display: block;
3719
4032
  font-size: var(--op-font-small);
3720
4033
  font-style: italic;
3721
4034
  }
4035
+
3722
4036
  .form-error-summary {
3723
4037
  padding: var(--op-space-large);
3724
4038
  border-radius: var(--op-radius-large);
@@ -3735,6 +4049,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3735
4049
  margin-block-end: 0;
3736
4050
  }
3737
4051
  }
4052
+
3738
4053
  .form-group {
3739
4054
  display: grid;
3740
4055
  align-content: baseline;
@@ -3765,6 +4080,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3765
4080
  }
3766
4081
  }
3767
4082
  }
4083
+
3768
4084
  .form-group--inline {
3769
4085
  align-items: center;
3770
4086
 
@@ -3786,6 +4102,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3786
4102
  }
3787
4103
  /* stylelint-enable no-descending-specificity */
3788
4104
  }
4105
+
3789
4106
  .form-group--error {
3790
4107
  /* stylelint-disable no-descending-specificity */
3791
4108
  .form-control {
@@ -3875,6 +4192,13 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3875
4192
  --_op-icon-optical-size-large: 40;
3876
4193
  --_op-icon-optical-size-x-large: 48;
3877
4194
 
4195
+ /* SVG (.icon--svg) */
4196
+ --_op-icon-stroke-width-light: 1;
4197
+ --_op-icon-stroke-width-normal: 1.5;
4198
+ --_op-icon-stroke-width-semi-bold: 2;
4199
+ --_op-icon-stroke-width-bold: 2.5;
4200
+ --_op-icon-svg-opacity-low-emphasis: 0.6;
4201
+
3878
4202
  /* Private API (component option defaults) */
3879
4203
  --__op-icon-weight: var(--_op-icon-weight-normal);
3880
4204
  --__op-icon-fill: var(--_op-icon-fill-outlined);
@@ -3902,18 +4226,22 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3902
4226
  /* Weight Modifiers */
3903
4227
  &.icon--weight-light {
3904
4228
  --__op-icon-weight: var(--_op-icon-weight-light);
4229
+ --__op-icon-stroke-width: var(--_op-icon-stroke-width-light);
3905
4230
  }
3906
4231
 
3907
4232
  &.icon--weight-normal {
3908
4233
  --__op-icon-weight: var(--_op-icon-weight-normal);
4234
+ --__op-icon-stroke-width: var(--_op-icon-stroke-width-normal);
3909
4235
  }
3910
4236
 
3911
4237
  &.icon--weight-semi-bold {
3912
4238
  --__op-icon-weight: var(--_op-icon-weight-semi-bold);
4239
+ --__op-icon-stroke-width: var(--_op-icon-stroke-width-semi-bold);
3913
4240
  }
3914
4241
 
3915
4242
  &.icon--weight-bold {
3916
4243
  --__op-icon-weight: var(--_op-icon-weight-bold);
4244
+ --__op-icon-stroke-width: var(--_op-icon-stroke-width-bold);
3917
4245
  }
3918
4246
 
3919
4247
  /* Emphasis */
@@ -3949,7 +4277,27 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3949
4277
  --__op-icon-font-size: var(--_op-icon-font-size-x-large);
3950
4278
  --__op-icon-optical-size: var(--_op-icon-optical-size-x-large);
3951
4279
  }
4280
+
4281
+ /* SVG Modifier: an inline SVG instead of a font glyph, e.g. `icon icon--svg icon--large` */
4282
+ &.icon--svg {
4283
+ svg {
4284
+ display: block;
4285
+ block-size: 100%;
4286
+ inline-size: 100%;
4287
+ }
4288
+
4289
+ /* A rule on the <svg> root cannot beat a stroke-width attribute on a child, so target the attribute.
4290
+ With no weight modifier the set keeps the widths it was drawn with. */
4291
+ &:is(.icon--weight-light, .icon--weight-normal, .icon--weight-semi-bold, .icon--weight-bold) svg [stroke-width] {
4292
+ stroke-width: var(--__op-icon-stroke-width);
4293
+ }
4294
+
4295
+ &.icon--low-emphasis {
4296
+ opacity: var(--_op-icon-svg-opacity-low-emphasis);
4297
+ }
4298
+ }
3952
4299
  }
4300
+
3953
4301
  /* Material Icons class provided by the Google Fonts CDN */
3954
4302
  .material-symbols-outlined {
3955
4303
  font-variation-settings:
@@ -3959,6 +4307,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3959
4307
  'opsz' var(--__op-icon-optical-size);
3960
4308
  font-weight: unset;
3961
4309
  }
4310
+
3962
4311
  /* Custom SVG Icons app specific */
3963
4312
  .custom-icons {
3964
4313
  svg {
@@ -4008,6 +4357,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
4008
4357
  }
4009
4358
  }
4010
4359
  }
4360
+
4011
4361
  .modal {
4012
4362
  /* Public API (customizable component options) */
4013
4363
  --_op-modal-width: calc(141 * var(--op-size-unit)); /* 564px */
@@ -4053,6 +4403,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
4053
4403
  gap: var(--op-space-small);
4054
4404
  }
4055
4405
  }
4406
+
4056
4407
  dialog.modal {
4057
4408
  padding: 0;
4058
4409
  border: none;
@@ -4085,6 +4436,7 @@ dialog.modal {
4085
4436
  }
4086
4437
  }
4087
4438
  }
4439
+
4088
4440
  @starting-style {
4089
4441
  dialog.modal[open] {
4090
4442
  transform: scale(0.7);
@@ -4592,6 +4944,7 @@ dialog.modal {
4592
4944
  --__op-spinner-track-width: var(--_op-spinner-track-width-large);
4593
4945
  }
4594
4946
  }
4947
+
4595
4948
  @keyframes spinner {
4596
4949
  to {
4597
4950
  transform: rotate(360deg);
@@ -4708,6 +5061,7 @@ dialog.modal {
4708
5061
  display: flex;
4709
5062
  align-items: center;
4710
5063
  }
5064
+
4711
5065
  .tab {
4712
5066
  /* Public API */
4713
5067
  --_op-tab-font-small: var(--op-font-x-small);
@@ -5092,7 +5446,11 @@ dialog.modal {
5092
5446
 
5093
5447
  display: flex;
5094
5448
  flex-direction: column;
5095
- gap: var(--op-space-x-small);
5449
+
5450
+ /* zero specificity. Lets utilities override */
5451
+ :where(&) {
5452
+ gap: var(--op-space-x-small);
5453
+ }
5096
5454
 
5097
5455
  &.text-pair--inline {
5098
5456
  flex-direction: row;
@@ -5136,6 +5494,7 @@ dialog.modal {
5136
5494
  }
5137
5495
  }
5138
5496
  /* Inspired by https://blog.logrocket.com/creating-beautiful-tooltips-with-only-css/ */
5497
+
5139
5498
  [data-tooltip-text] {
5140
5499
  /* Public API (customizable component options) */
5141
5500
  --_op-tooltip-max-width: calc(50 * var(--op-size-unit)); /* 200px */