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