@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
@@ -1,11 +1,11 @@
1
1
 
2
2
  @import 'https://fonts.googleapis.com/css2?family=Noto+Sans:ital,wdth,wght@0,62.5..100,100..900;1,62.5..100,100..900&family=Noto+Serif:ital,wdth,wght@0,62.5..100,100..900;1,62.5..100,100..900&display=swap';
3
- @import 'https://unpkg.com/@phosphor-icons/web@2.1.1/src/regular/style.css';
4
- @import 'https://unpkg.com/@phosphor-icons/web@2.1.1/src/thin/style.css';
5
- @import 'https://unpkg.com/@phosphor-icons/web@2.1.1/src/light/style.css';
6
- @import 'https://unpkg.com/@phosphor-icons/web@2.1.1/src/bold/style.css';
7
- @import 'https://unpkg.com/@phosphor-icons/web@2.1.1/src/fill/style.css';
8
- @import 'https://unpkg.com/@phosphor-icons/web@2.1.1/src/duotone/style.css';
3
+ @import 'https://unpkg.com/@phosphor-icons/web@2.1.2/src/regular/style.css';
4
+ @import 'https://unpkg.com/@phosphor-icons/web@2.1.2/src/thin/style.css';
5
+ @import 'https://unpkg.com/@phosphor-icons/web@2.1.2/src/light/style.css';
6
+ @import 'https://unpkg.com/@phosphor-icons/web@2.1.2/src/bold/style.css';
7
+ @import 'https://unpkg.com/@phosphor-icons/web@2.1.2/src/fill/style.css';
8
+ @import 'https://unpkg.com/@phosphor-icons/web@2.1.2/src/duotone/style.css';
9
9
  /* Third party Vendors */
10
10
  /* Box sizing rules */
11
11
  *,
@@ -13,6 +13,7 @@
13
13
  *::after {
14
14
  box-sizing: border-box;
15
15
  }
16
+
16
17
  /* Remove default margin */
17
18
  body,
18
19
  h1,
@@ -26,31 +27,37 @@ dl,
26
27
  dd {
27
28
  margin: 0;
28
29
  }
30
+
29
31
  /* Remove list styles on ul, ol elements with a list role, which suggests default styling will be removed */
30
32
  ul[role="list"],
31
33
  ol[role="list"] {
32
34
  list-style: none;
33
35
  }
36
+
34
37
  /* Set core root defaults */
35
38
  html:focus-within {
36
39
  scroll-behavior: smooth;
37
40
  }
41
+
38
42
  /* Set core body defaults */
39
43
  body {
40
44
  min-height: 100vh;
41
45
  text-rendering: optimizeSpeed;
42
46
  line-height: 1.5;
43
47
  }
48
+
44
49
  /* A elements that don't have a class get default styles */
45
50
  a:not([class]) {
46
51
  text-decoration-skip-ink: auto;
47
52
  }
53
+
48
54
  /* Make images easier to work with */
49
55
  img,
50
56
  picture {
51
57
  max-width: 100%;
52
58
  display: block;
53
59
  }
60
+
54
61
  /* Inherit fonts for inputs and buttons */
55
62
  input,
56
63
  button,
@@ -58,6 +65,7 @@ textarea,
58
65
  select {
59
66
  font: inherit;
60
67
  }
68
+
61
69
  /* Remove all animations and transitions for people that prefer not to see them */
62
70
  @media (prefers-reduced-motion: reduce) {
63
71
  html:focus-within {
@@ -72,6 +80,7 @@ select {
72
80
  scroll-behavior: auto !important;
73
81
  }
74
82
  }
83
+
75
84
  /* Fonts */
76
85
  /*
77
86
  Noto Sans supports:
@@ -79,18 +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://phosphoricons.com/
91
- Current version: 2.1.1
102
+ See Changelog at: https://github.com/phosphor-icons/web/releases
103
+ Current version: 2.1.2
92
104
  */
105
+
93
106
  /* Note: the important tag is how Phosphor sets up the fonts which is why we replicate them here */
107
+
94
108
  /* Phosphor Icons */
95
109
  .ph {
96
110
  font-weight: unset;
@@ -117,9 +131,11 @@ Noto Sans supports:
117
131
  font-family: 'Phosphor-Bold' !important;
118
132
  }
119
133
  }
134
+
120
135
  .ph-duotone {
121
136
  font-weight: unset;
122
137
  }
138
+
123
139
  /* Tokens */
124
140
  :root {
125
141
  /* Color HSLs
@@ -440,6 +456,7 @@ Noto Sans supports:
440
456
  var(--op-input-inner-focus) var(--op-color-alerts-notice-plus-two),
441
457
  var(--op-input-outer-focus) var(--op-color-alerts-notice-plus-five);
442
458
  }
459
+
443
460
  /* Animations */
444
461
  @keyframes rm-slide-in-out-flash {
445
462
  /*
@@ -1919,10 +1936,12 @@ Noto Sans supports:
1919
1936
  --op-color-on-background: var(--op-color-neutral-on-plus-eight);
1920
1937
  --op-color-on-background-alt: var(--op-color-neutral-on-plus-eight-alt);
1921
1938
  }
1939
+
1922
1940
  /* Force Light Mode */
1923
1941
  :root[data-theme-mode='light'] {
1924
1942
  color-scheme: only light;
1925
1943
  }
1944
+
1926
1945
  /* Force Dark Mode */
1927
1946
  :root[data-theme-mode='dark'] {
1928
1947
  color-scheme: only dark;
@@ -1942,6 +1961,7 @@ Noto Sans supports:
1942
1961
  */
1943
1962
  --op-encoded-images-dropdown-arrow: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iOSIgdmlld0JveD0iMCAwIDEyIDkiIGZpbGw9IiNmZmYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik02IDguMzc1MDFMMCAyLjM3NTAxTDEuNCAwLjk3NTAwNkw2IDUuNTc1MDFMMTAuNiAwLjk3NTAwNkwxMiAyLjM3NTAxTDYgOC4zNzUwMVoiIGZpbGw9IiNmZmYiLz4KPC9zdmc+Cg==');
1944
1963
  }
1964
+
1945
1965
  @media (prefers-color-scheme: dark) {
1946
1966
  :root:not([data-theme-mode='light']) {
1947
1967
  /**
@@ -1960,13 +1980,16 @@ Noto Sans supports:
1960
1980
  --op-encoded-images-dropdown-arrow: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTIiIGhlaWdodD0iOSIgdmlld0JveD0iMCAwIDEyIDkiIGZpbGw9IiNmZmYiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxwYXRoIGQ9Ik02IDguMzc1MDFMMCAyLjM3NTAxTDEuNCAwLjk3NTAwNkw2IDUuNTc1MDFMMTAuNiAwLjk3NTAwNkwxMiAyLjM3NTAxTDYgOC4zNzUwMVoiIGZpbGw9IiNmZmYiLz4KPC9zdmc+Cg==');
1961
1981
  }
1962
1982
  }
1983
+
1963
1984
  /* Base styles and utilities */
1964
1985
  /* After a reset, introduce base element styles specific to this system */
1986
+
1965
1987
  html {
1966
1988
  overflow: hidden; /* Needed to prevent flash messages and panels from causing overflow */
1967
1989
  font-family: var(--op-font-family);
1968
1990
  font-size: 62.5%; /* 1rem = 10px */
1969
1991
  }
1992
+
1970
1993
  body {
1971
1994
  overflow: auto;
1972
1995
  background: var(--op-color-background);
@@ -1974,14 +1997,17 @@ body {
1974
1997
  color: var(--op-color-on-background);
1975
1998
  font-size: var(--op-font-medium);
1976
1999
  }
2000
+
1977
2001
  button {
1978
2002
  background: none;
1979
2003
  cursor: pointer;
1980
2004
  }
2005
+
1981
2006
  button,
1982
2007
  input[type='submit'] {
1983
2008
  border: 0;
1984
2009
  }
2010
+
1985
2011
  label {
1986
2012
  display: inline-block;
1987
2013
 
@@ -1989,9 +2015,11 @@ label {
1989
2015
  cursor: pointer;
1990
2016
  }
1991
2017
  }
2018
+
1992
2019
  a {
1993
2020
  color: var(--op-color-primary-original);
1994
2021
  }
2022
+
1995
2023
  blockquote,
1996
2024
  dl,
1997
2025
  dd,
@@ -2005,6 +2033,7 @@ figure,
2005
2033
  pre {
2006
2034
  margin: 0;
2007
2035
  }
2036
+
2008
2037
  h1,
2009
2038
  h2,
2010
2039
  h3,
@@ -2014,28 +2043,36 @@ h6 {
2014
2043
  font-weight: var(--op-font-weight-normal);
2015
2044
  margin-block: 0 var(--op-space-small);
2016
2045
  }
2046
+
2017
2047
  h1 {
2018
2048
  font-size: var(--op-font-3x-large);
2019
2049
  }
2050
+
2020
2051
  h2 {
2021
2052
  font-size: var(--op-font-2x-large);
2022
2053
  }
2054
+
2023
2055
  h3 {
2024
2056
  font-size: var(--op-font-large);
2025
2057
  }
2058
+
2026
2059
  h4 {
2027
2060
  font-size: var(--op-font-medium);
2028
2061
  }
2062
+
2029
2063
  h5 {
2030
2064
  font-size: var(--op-font-small);
2031
2065
  }
2066
+
2032
2067
  h6 {
2033
2068
  font-size: var(--op-font-x-small);
2034
2069
  }
2070
+
2035
2071
  p {
2036
2072
  font-size: var(--op-font-medium);
2037
2073
  margin-block-end: var(--op-space-small);
2038
2074
  }
2075
+
2039
2076
  small {
2040
2077
  font-size: var(--op-font-small);
2041
2078
  }
@@ -2045,11 +2082,13 @@ small {
2045
2082
  grid-template-columns: auto 1fr auto;
2046
2083
  inline-size: 100%;
2047
2084
  }
2085
+
2048
2086
  .app-body {
2049
2087
  display: flex;
2050
2088
  overflow: auto;
2051
2089
  flex-direction: column;
2052
2090
  }
2091
+
2053
2092
  .app__header {
2054
2093
  position: sticky;
2055
2094
  z-index: var(--op-z-index-header);
@@ -2057,6 +2096,7 @@ small {
2057
2096
  flex-shrink: 0;
2058
2097
  inset-block-start: 0;
2059
2098
  }
2099
+
2060
2100
  .app__content {
2061
2101
  flex-grow: 1;
2062
2102
  padding: 0 var(--op-space-large);
@@ -2064,12 +2104,14 @@ small {
2064
2104
  inline-size: 100%;
2065
2105
  max-inline-size: var(--op-breakpoint-medium);
2066
2106
  }
2107
+
2067
2108
  .app__content-no-margin {
2068
2109
  flex-grow: 1;
2069
2110
  padding: 0 var(--op-space-large);
2070
2111
  inline-size: 100%;
2071
2112
  overflow-y: auto;
2072
2113
  }
2114
+
2073
2115
  .app__footer {
2074
2116
  position: sticky;
2075
2117
  z-index: var(--op-z-index-footer);
@@ -2077,6 +2119,7 @@ small {
2077
2119
  flex-shrink: 0;
2078
2120
  inset-block-end: 0;
2079
2121
  }
2122
+
2080
2123
  /*
2081
2124
  <html lang='en'>
2082
2125
  <head>...</head>
@@ -2091,6 +2134,7 @@ small {
2091
2134
  </body>
2092
2135
  </html>
2093
2136
  */
2137
+
2094
2138
  :root:has(.op-page) {
2095
2139
  /* Reset existing Optics layout */
2096
2140
  overflow: unset;
@@ -2108,6 +2152,7 @@ small {
2108
2152
  min-block-size: 100%;
2109
2153
  }
2110
2154
  }
2155
+
2111
2156
  .op-page {
2112
2157
  display: grid;
2113
2158
  grid-template-areas: 'sidebar-left main sidebar-right';
@@ -2182,6 +2227,7 @@ small {
2182
2227
  }
2183
2228
  }
2184
2229
  /* Container Properties */
2230
+
2185
2231
  .container {
2186
2232
  inline-size: 100%;
2187
2233
  margin-block: 0;
@@ -2190,299 +2236,408 @@ small {
2190
2236
  padding-block: 0;
2191
2237
  padding-inline: var(--op-space-large);
2192
2238
  }
2239
+
2193
2240
  .container--sm {
2194
2241
  max-inline-size: var(--op-breakpoint-small);
2195
2242
  }
2243
+
2196
2244
  .container--md-padding {
2197
2245
  padding: 0 var(--op-space-medium);
2198
2246
  }
2247
+
2199
2248
  .container--sm-padding {
2200
2249
  padding: 0 var(--op-space-small);
2201
2250
  }
2251
+
2202
2252
  .container--xs {
2203
2253
  max-inline-size: var(--op-breakpoint-x-small);
2204
2254
  }
2255
+
2205
2256
  /* Width Properties */
2257
+
2206
2258
  .full-width {
2207
2259
  inline-size: 100%;
2208
2260
  }
2261
+
2209
2262
  .half-width {
2210
2263
  inline-size: 50%;
2211
2264
  }
2265
+
2212
2266
  .four-fifths-width {
2213
2267
  inline-size: calc(100% * 4 / 5);
2214
2268
  }
2269
+
2215
2270
  .three-fifths-width {
2216
2271
  inline-size: calc(100% * 3 / 5);
2217
2272
  }
2273
+
2218
2274
  .two-fifths-width {
2219
2275
  inline-size: calc(100% * 2 / 5);
2220
2276
  }
2277
+
2221
2278
  .one-fifth-width {
2222
2279
  inline-size: calc(100% * 1 / 5);
2223
2280
  }
2281
+
2224
2282
  .three-quarters-width {
2225
2283
  inline-size: calc(100% * 3 / 4);
2226
2284
  }
2285
+
2227
2286
  .one-quarter-width {
2228
2287
  inline-size: calc(100% * 1 / 4);
2229
2288
  }
2289
+
2230
2290
  .two-thirds-width {
2231
2291
  inline-size: calc(100% * 2 / 3);
2232
2292
  }
2293
+
2233
2294
  .one-third-width {
2234
2295
  inline-size: calc(100% * 1 / 3);
2235
2296
  }
2297
+
2236
2298
  /* Flex Properties */
2299
+
2237
2300
  .flex {
2238
2301
  display: flex;
2239
2302
  }
2303
+
2240
2304
  .flex-col {
2241
2305
  flex-direction: column;
2242
2306
  }
2307
+
2243
2308
  .flex-row {
2244
2309
  flex-direction: row;
2245
2310
  }
2311
+
2246
2312
  .flex-wrap {
2247
2313
  flex-wrap: wrap;
2248
2314
  }
2315
+
2249
2316
  .flex-no-wrap {
2250
2317
  flex-wrap: nowrap;
2251
2318
  }
2319
+
2252
2320
  .flex-grow-1 {
2253
2321
  flex-grow: 1;
2254
2322
  }
2323
+
2255
2324
  /* Gap Properties */
2325
+ .gap-none {
2326
+ gap: 0;
2327
+
2328
+ --op-gap: 0;
2329
+ }
2330
+
2256
2331
  .gap-xxs {
2257
2332
  gap: var(--op-space-2x-small);
2258
2333
 
2259
2334
  --op-gap: var(--op-space-2x-small);
2260
2335
  }
2336
+
2261
2337
  .gap-xs {
2262
2338
  gap: var(--op-space-x-small);
2263
2339
 
2264
2340
  --op-gap: var(--op-space-x-small);
2265
2341
  }
2342
+
2266
2343
  .gap-sm {
2267
2344
  gap: var(--op-space-small);
2268
2345
 
2269
2346
  --op-gap: var(--op-space-small);
2270
2347
  }
2348
+
2271
2349
  .gap-md {
2272
2350
  gap: var(--op-space-medium);
2273
2351
 
2274
2352
  --op-gap: var(--op-space-medium);
2275
2353
  }
2354
+
2276
2355
  .gap-lg {
2277
2356
  gap: var(--op-space-large);
2278
2357
 
2279
2358
  --op-gap: var(--op-space-large);
2280
2359
  }
2360
+
2281
2361
  .gap-xl {
2282
2362
  gap: var(--op-space-x-large);
2283
2363
 
2284
2364
  --op-gap: var(--op-space-x-large);
2285
2365
  }
2366
+
2286
2367
  /* Justify Content */
2368
+
2287
2369
  .justify-start {
2288
2370
  justify-content: flex-start;
2289
2371
  }
2372
+
2290
2373
  .justify-center {
2291
2374
  justify-content: center;
2292
2375
  }
2376
+
2293
2377
  .justify-end {
2294
2378
  justify-content: flex-end;
2295
2379
  }
2380
+
2296
2381
  .justify-between {
2297
2382
  justify-content: space-between;
2298
2383
  }
2384
+
2299
2385
  .justify-around {
2300
2386
  justify-content: space-around;
2301
2387
  }
2388
+
2302
2389
  /* Align Items */
2390
+
2303
2391
  .items-stretch {
2304
2392
  align-items: stretch;
2305
2393
  }
2394
+
2306
2395
  .items-start {
2307
2396
  align-items: flex-start;
2308
2397
  }
2398
+
2309
2399
  .items-center {
2310
2400
  align-items: center;
2311
2401
  }
2402
+
2312
2403
  .items-end {
2313
2404
  align-items: flex-end;
2314
2405
  }
2406
+
2315
2407
  .items-baseline {
2316
2408
  align-items: baseline;
2317
2409
  }
2410
+
2318
2411
  /* Align Self */
2412
+
2319
2413
  .self-auto {
2320
2414
  align-self: auto;
2321
2415
  }
2416
+
2322
2417
  .self-start {
2323
2418
  align-self: flex-start;
2324
2419
  }
2420
+
2325
2421
  .self-center {
2326
2422
  align-self: center;
2327
2423
  }
2424
+
2328
2425
  .self-end {
2329
2426
  align-self: flex-end;
2330
2427
  }
2428
+
2331
2429
  .self-stretch {
2332
2430
  align-self: stretch;
2333
2431
  }
2432
+
2334
2433
  .self-baseline {
2335
2434
  align-self: baseline;
2336
2435
  }
2436
+
2337
2437
  /* Text Alignment */
2438
+
2338
2439
  .text-left {
2339
2440
  text-align: start;
2340
2441
  }
2442
+
2341
2443
  .text-center {
2342
2444
  text-align: center;
2343
2445
  }
2446
+
2344
2447
  .text-right {
2345
2448
  text-align: end;
2346
2449
  }
2450
+
2347
2451
  .text-justify {
2348
2452
  text-align: justify;
2349
2453
  }
2454
+
2350
2455
  /* Box Margin */
2456
+
2351
2457
  .margin-xl {
2352
2458
  margin: var(--op-space-x-large);
2353
2459
  }
2460
+
2354
2461
  .margin-lg {
2355
2462
  margin: var(--op-space-large);
2356
2463
  }
2464
+
2357
2465
  .margin-md {
2358
2466
  margin: var(--op-space-medium);
2359
2467
  }
2468
+
2360
2469
  .margin-sm {
2361
2470
  margin: var(--op-space-small);
2362
2471
  }
2472
+
2363
2473
  .margin-xs {
2364
2474
  margin: var(--op-space-x-small);
2365
2475
  }
2476
+
2366
2477
  .margin-none {
2367
2478
  margin: 0;
2368
2479
  }
2480
+
2369
2481
  .margin-auto {
2370
2482
  margin: auto;
2371
2483
  }
2484
+
2372
2485
  /* Vertical Margin */
2486
+
2373
2487
  .margin-y-xl {
2374
2488
  margin-block: var(--op-space-x-large);
2375
2489
  }
2490
+
2376
2491
  .margin-y-lg {
2377
2492
  margin-block: var(--op-space-large);
2378
2493
  }
2494
+
2379
2495
  .margin-y-md {
2380
2496
  margin-block: var(--op-space-medium);
2381
2497
  }
2498
+
2382
2499
  .margin-y-sm {
2383
2500
  margin-block: var(--op-space-small);
2384
2501
  }
2502
+
2385
2503
  .margin-y-xs {
2386
2504
  margin-block: var(--op-space-x-small);
2387
2505
  }
2506
+
2388
2507
  .margin-y-none {
2389
2508
  margin-block: 0;
2390
2509
  }
2510
+
2391
2511
  /* Horizontal Margin */
2512
+
2392
2513
  .margin-x-xl {
2393
2514
  margin-inline: var(--op-space-x-large);
2394
2515
  }
2516
+
2395
2517
  .margin-x-lg {
2396
2518
  margin-inline: var(--op-space-large);
2397
2519
  }
2520
+
2398
2521
  .margin-x-md {
2399
2522
  margin-inline: var(--op-space-medium);
2400
2523
  }
2524
+
2401
2525
  .margin-x-sm {
2402
2526
  margin-inline: var(--op-space-small);
2403
2527
  }
2528
+
2404
2529
  .margin-x-xs {
2405
2530
  margin-inline: var(--op-space-x-small);
2406
2531
  }
2532
+
2407
2533
  .margin-x-none {
2408
2534
  margin-inline: 0;
2409
2535
  }
2536
+
2410
2537
  /* Top Margin */
2538
+
2411
2539
  .margin-top-xl {
2412
2540
  margin-block-start: var(--op-space-x-large);
2413
2541
  }
2542
+
2414
2543
  .margin-top-lg {
2415
2544
  margin-block-start: var(--op-space-large);
2416
2545
  }
2546
+
2417
2547
  .margin-top-md {
2418
2548
  margin-block-start: var(--op-space-medium);
2419
2549
  }
2550
+
2420
2551
  .margin-top-sm {
2421
2552
  margin-block-start: var(--op-space-small);
2422
2553
  }
2554
+
2423
2555
  .margin-top-xs {
2424
2556
  margin-block-start: var(--op-space-x-small);
2425
2557
  }
2558
+
2426
2559
  .margin-top-none {
2427
2560
  margin-block-start: 0;
2428
2561
  }
2562
+
2429
2563
  /* Bottom Margin */
2564
+
2430
2565
  .margin-bottom-xl {
2431
2566
  margin-block-end: var(--op-space-x-large);
2432
2567
  }
2568
+
2433
2569
  .margin-bottom-lg {
2434
2570
  margin-block-end: var(--op-space-large);
2435
2571
  }
2572
+
2436
2573
  .margin-bottom-md {
2437
2574
  margin-block-end: var(--op-space-medium);
2438
2575
  }
2576
+
2439
2577
  .margin-bottom-sm {
2440
2578
  margin-block-end: var(--op-space-small);
2441
2579
  }
2580
+
2442
2581
  .margin-bottom-xs {
2443
2582
  margin-block-end: var(--op-space-x-small);
2444
2583
  }
2584
+
2445
2585
  .margin-bottom-none {
2446
2586
  margin-block-end: 0;
2447
2587
  }
2588
+
2448
2589
  /* Right Margin */
2590
+
2449
2591
  .margin-right-xl {
2450
2592
  margin-inline-end: var(--op-space-x-large);
2451
2593
  }
2594
+
2452
2595
  .margin-right-lg {
2453
2596
  margin-inline-end: var(--op-space-large);
2454
2597
  }
2598
+
2455
2599
  .margin-right-md {
2456
2600
  margin-inline-end: var(--op-space-medium);
2457
2601
  }
2602
+
2458
2603
  .margin-right-sm {
2459
2604
  margin-inline-end: var(--op-space-small);
2460
2605
  }
2606
+
2461
2607
  .margin-right-xs {
2462
2608
  margin-inline-end: var(--op-space-x-small);
2463
2609
  }
2610
+
2464
2611
  .margin-right-none {
2465
2612
  margin-inline-start: 0;
2466
2613
  }
2614
+
2467
2615
  /* Left Margin */
2616
+
2468
2617
  .margin-left-xl {
2469
2618
  margin-inline-start: var(--op-space-x-large);
2470
2619
  }
2620
+
2471
2621
  .margin-left-lg {
2472
2622
  margin-inline-start: var(--op-space-large);
2473
2623
  }
2624
+
2474
2625
  .margin-left-md {
2475
2626
  margin-inline-start: var(--op-space-medium);
2476
2627
  }
2628
+
2477
2629
  .margin-left-sm {
2478
2630
  margin-inline-start: var(--op-space-small);
2479
2631
  }
2632
+
2480
2633
  .margin-left-xs {
2481
2634
  margin-inline-start: var(--op-space-x-small);
2482
2635
  }
2636
+
2483
2637
  .margin-left-none {
2484
2638
  margin-inline-start: 0;
2485
2639
  }
2640
+
2486
2641
  /*
2487
2642
  Accessibility
2488
2643
  Use the following class to hide accessibility text that is needed for screen readers but needs to be hidden from regular users.
@@ -2496,34 +2651,183 @@ small {
2496
2651
  clip: rect(1px, 1px, 1px, 1px);
2497
2652
  inline-size: 1px;
2498
2653
  }
2654
+
2499
2655
  /* Advanced Layout Utilities */
2656
+
2500
2657
  /* Equivalent to .flex.flex-col.gap-md */
2501
2658
  .op-stack {
2502
2659
  display: flex;
2503
2660
  flex-direction: column;
2661
+ margin-block: 0;
2662
+ margin-inline: 0;
2663
+
2664
+ /* zero specificity. Lets utilities override */
2665
+ :where(&) {
2666
+ gap: var(--op-space-medium);
2667
+ }
2504
2668
  }
2505
- :where(.op-stack) {
2506
- gap: var(--op-space-medium);
2507
- }
2669
+
2508
2670
  /* Equivalent to .flex.flex-wrap.items-center.gap-md */
2509
2671
  .op-cluster {
2510
2672
  display: flex;
2511
2673
  flex-wrap: wrap;
2674
+ margin-block: 0;
2675
+ margin-inline: 0;
2676
+
2677
+ /* zero specificity. Lets utilities override */
2678
+ :where(&) {
2679
+ align-items: center;
2680
+ gap: var(--op-space-medium);
2681
+ }
2512
2682
  }
2513
- :where(.op-cluster) {
2514
- align-items: center;
2515
- gap: var(--op-space-medium);
2516
- }
2683
+
2517
2684
  /* Equivalent to .flex.flex-wrap.items-center.justify-between.gap-md */
2518
2685
  .op-split {
2519
2686
  display: flex;
2520
2687
  flex-wrap: wrap;
2521
2688
  justify-content: space-between;
2689
+ margin-block: 0;
2690
+ margin-inline: 0;
2691
+
2692
+ /* zero specificity. Lets utilities override */
2693
+ :where(&) {
2694
+ align-items: center;
2695
+ gap: var(--op-space-medium);
2696
+ }
2522
2697
  }
2523
- :where(.op-split) {
2524
- align-items: center;
2525
- gap: var(--op-space-medium);
2698
+
2699
+ /*
2700
+ side by side layout with a small area and a large area
2701
+ similar to .flex with a .flex-grow-1 within it, but with a more semantic name and wrap handling.
2702
+
2703
+ |[] [ ]|
2704
+ |[ ] []| with end
2705
+ */
2706
+ .op-flank {
2707
+ display: flex;
2708
+ margin-block: 0;
2709
+ margin-inline: 0;
2710
+
2711
+ /* zero specificity. Lets utilities override */
2712
+ :where(&) {
2713
+ flex-wrap: wrap;
2714
+ align-items: center;
2715
+ gap: var(--op-space-medium);
2716
+ }
2717
+
2718
+ /* Small area */
2719
+ &:not(.op-flank--end) > :first-child,
2720
+ &.op-flank--end > :last-child {
2721
+ flex-basis: auto;
2722
+ flex-grow: 1;
2723
+ }
2724
+
2725
+ /* Large area */
2726
+ &:not(.op-flank--end) > :last-child,
2727
+ &.op-flank--end > :first-child {
2728
+ flex-basis: 0;
2729
+ flex-grow: 999;
2730
+ }
2731
+ }
2732
+
2733
+ /* Grid Layout */
2734
+ .op-grid {
2735
+ --_op-grid-min-column-size: var(--op-space-4x-large);
2736
+ --_op-grid-max-column-size: 0px;
2737
+
2738
+ display: grid;
2739
+ grid-template-columns: repeat(
2740
+ auto-fit,
2741
+ minmax(max(var(--_op-grid-min-column-size), var(--_op-grid-max-column-size)), 1fr)
2742
+ );
2743
+ margin-block: 0;
2744
+ margin-inline: 0;
2745
+
2746
+ /* zero specificity. Lets utilities override */
2747
+ :where(&) {
2748
+ gap: var(--op-space-medium);
2749
+ }
2750
+
2751
+ &.op-grid--2-column {
2752
+ --_op-grid-max-column-size: calc(100% / 3);
2753
+ }
2754
+
2755
+ &.op-grid--3-column {
2756
+ --_op-grid-max-column-size: calc(100% / 4);
2757
+ }
2758
+
2759
+ &.op-grid--4-column {
2760
+ --_op-grid-max-column-size: calc(100% / 5);
2761
+ }
2762
+
2763
+ &.op-grid--5-column {
2764
+ --_op-grid-max-column-size: calc(100% / 6);
2765
+ }
2766
+
2767
+ &.op-grid--6-column {
2768
+ --_op-grid-max-column-size: calc(100% / 7);
2769
+ }
2770
+ }
2771
+
2772
+ /* Frame */
2773
+ @property --_op-frame-inline-size {
2774
+ inherits: true;
2775
+ initial-value: 100%;
2776
+ syntax: '<length> | <percentage>';
2777
+ }
2778
+
2779
+ .op-frame {
2780
+ display: flex;
2781
+ overflow: hidden;
2782
+ border-radius: inherit;
2783
+ aspect-ratio: 1 / 1;
2784
+ margin-block: 0;
2785
+ margin-inline: 0;
2786
+ max-inline-size: var(--_op-frame-inline-size);
2787
+
2788
+ :where(&) {
2789
+ align-items: center;
2790
+ justify-content: center;
2791
+ }
2792
+
2793
+ > img,
2794
+ > video {
2795
+ block-size: 100%;
2796
+ inline-size: 100%;
2797
+ object-fit: cover;
2798
+ }
2799
+
2800
+ /* aspect ratio */
2801
+
2802
+ &.op-frame--square {
2803
+ aspect-ratio: 1 / 1;
2804
+ }
2805
+
2806
+ &.op-frame--landscape {
2807
+ aspect-ratio: 16 / 9;
2808
+ }
2809
+
2810
+ &.op-frame--portrait {
2811
+ aspect-ratio: 9 / 16;
2812
+ }
2813
+
2814
+ &.op-frame--4-3 {
2815
+ aspect-ratio: 4 / 3;
2816
+ }
2817
+
2818
+ &.op-frame--3-4 {
2819
+ aspect-ratio: 3 / 4;
2820
+ }
2821
+
2822
+ &.op-frame--3-2 {
2823
+ aspect-ratio: 3 / 2;
2824
+ }
2825
+
2826
+ &.op-frame--2-3 {
2827
+ aspect-ratio: 2 / 3;
2828
+ }
2526
2829
  }
2830
+
2527
2831
  /* Components */
2528
2832
  .accordion {
2529
2833
  /* Public API (customizable component options) */
@@ -2570,7 +2874,7 @@ small {
2570
2874
  }
2571
2875
 
2572
2876
  &[open] {
2573
- summary .accordion__marker {
2877
+ > summary .accordion__marker {
2574
2878
  rotate: 0.25turn;
2575
2879
  }
2576
2880
 
@@ -3282,6 +3586,7 @@ small {
3282
3586
  }
3283
3587
  }
3284
3588
  }
3589
+
3285
3590
  .btn-group-toolbar {
3286
3591
  display: flex;
3287
3592
  flex-wrap: wrap;
@@ -3395,6 +3700,7 @@ small {
3395
3700
  }
3396
3701
  }
3397
3702
  }
3703
+
3398
3704
  /* stylelint-disable no-descending-specificity */
3399
3705
  .confirm-dialog {
3400
3706
  /* Public API (customizable component options) */
@@ -3582,6 +3888,7 @@ small {
3582
3888
  /* stylelint-enable selector-no-vendor-prefix */
3583
3889
  }
3584
3890
  }
3891
+
3585
3892
  /* Radio or Checkbox Form Control */
3586
3893
  .form-control:is([type='radio'], [type='checkbox']) {
3587
3894
  /* Public API (customizable component options) */
@@ -3600,6 +3907,7 @@ small {
3600
3907
  align-self: center;
3601
3908
  }
3602
3909
  }
3910
+
3603
3911
  /* Any Form Control that is not a radio or checkbox */
3604
3912
  .form-control:not([type='radio'], [type='checkbox']) {
3605
3913
  /* Public API (customizable component options) */
@@ -3662,6 +3970,7 @@ small {
3662
3970
  }
3663
3971
  }
3664
3972
  }
3973
+
3665
3974
  /* Color Form Control */
3666
3975
  .form-control[type='color'] {
3667
3976
  padding: var(--op-space-2x-small);
@@ -3676,6 +3985,7 @@ small {
3676
3985
  border-radius: var(--op-radius-medium);
3677
3986
  }
3678
3987
  }
3988
+
3679
3989
  /* File Form Control */
3680
3990
  .form-control[type='file'] {
3681
3991
  padding-block: 0;
@@ -3711,6 +4021,7 @@ small {
3711
4021
  --__op-btn-height: calc(var(--__op-btn-base-height) - var(--op-space-x-small));
3712
4022
  }
3713
4023
  }
4024
+
3714
4025
  select.form-control:not([multiple], [type='radio'], [type='checkbox']) {
3715
4026
  appearance: none;
3716
4027
  background-image: var(--op-encoded-images-dropdown-arrow);
@@ -3722,14 +4033,17 @@ select.form-control:not([multiple], [type='radio'], [type='checkbox']) {
3722
4033
  cursor: pointer;
3723
4034
  padding-inline-end: var(--op-space-3x-large);
3724
4035
  }
4036
+
3725
4037
  select.form-control[multiple] {
3726
4038
  min-block-size: calc(2 * var(--__op-form-control-height));
3727
4039
  }
4040
+
3728
4041
  textarea.form-control:not([type='radio'], [type='checkbox']) {
3729
4042
  block-size: calc(2 * var(--__op-form-control-height));
3730
4043
  max-inline-size: 100%;
3731
4044
  min-block-size: var(--__op-form-control-height);
3732
4045
  }
4046
+
3733
4047
  .form-label {
3734
4048
  color: var(--op-color-on-background);
3735
4049
  font-size: var(--op-font-x-small);
@@ -3737,16 +4051,19 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3737
4051
  letter-spacing: var(--op-letter-spacing-label);
3738
4052
  line-height: var(--op-line-height-base);
3739
4053
  }
4054
+
3740
4055
  .form-error {
3741
4056
  color: var(--op-color-alerts-danger-base);
3742
4057
  font-size: var(--op-font-x-small);
3743
4058
  inline-size: fit-content;
3744
4059
  }
4060
+
3745
4061
  .form-hint {
3746
4062
  display: block;
3747
4063
  font-size: var(--op-font-small);
3748
4064
  font-style: italic;
3749
4065
  }
4066
+
3750
4067
  .form-error-summary {
3751
4068
  padding: var(--op-space-large);
3752
4069
  border-radius: var(--op-radius-large);
@@ -3763,6 +4080,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3763
4080
  margin-block-end: 0;
3764
4081
  }
3765
4082
  }
4083
+
3766
4084
  .form-group {
3767
4085
  display: grid;
3768
4086
  align-content: baseline;
@@ -3793,6 +4111,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3793
4111
  }
3794
4112
  }
3795
4113
  }
4114
+
3796
4115
  .form-group--inline {
3797
4116
  align-items: center;
3798
4117
 
@@ -3814,6 +4133,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3814
4133
  }
3815
4134
  /* stylelint-enable no-descending-specificity */
3816
4135
  }
4136
+
3817
4137
  .form-group--error {
3818
4138
  /* stylelint-disable no-descending-specificity */
3819
4139
  .form-control {
@@ -3903,6 +4223,13 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3903
4223
  --_op-icon-optical-size-large: 40;
3904
4224
  --_op-icon-optical-size-x-large: 48;
3905
4225
 
4226
+ /* SVG (.icon--svg) */
4227
+ --_op-icon-stroke-width-light: 1;
4228
+ --_op-icon-stroke-width-normal: 1.5;
4229
+ --_op-icon-stroke-width-semi-bold: 2;
4230
+ --_op-icon-stroke-width-bold: 2.5;
4231
+ --_op-icon-svg-opacity-low-emphasis: 0.6;
4232
+
3906
4233
  /* Private API (component option defaults) */
3907
4234
  --__op-icon-weight: var(--_op-icon-weight-normal);
3908
4235
  --__op-icon-fill: var(--_op-icon-fill-outlined);
@@ -3930,18 +4257,22 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3930
4257
  /* Weight Modifiers */
3931
4258
  &.icon--weight-light {
3932
4259
  --__op-icon-weight: var(--_op-icon-weight-light);
4260
+ --__op-icon-stroke-width: var(--_op-icon-stroke-width-light);
3933
4261
  }
3934
4262
 
3935
4263
  &.icon--weight-normal {
3936
4264
  --__op-icon-weight: var(--_op-icon-weight-normal);
4265
+ --__op-icon-stroke-width: var(--_op-icon-stroke-width-normal);
3937
4266
  }
3938
4267
 
3939
4268
  &.icon--weight-semi-bold {
3940
4269
  --__op-icon-weight: var(--_op-icon-weight-semi-bold);
4270
+ --__op-icon-stroke-width: var(--_op-icon-stroke-width-semi-bold);
3941
4271
  }
3942
4272
 
3943
4273
  &.icon--weight-bold {
3944
4274
  --__op-icon-weight: var(--_op-icon-weight-bold);
4275
+ --__op-icon-stroke-width: var(--_op-icon-stroke-width-bold);
3945
4276
  }
3946
4277
 
3947
4278
  /* Emphasis */
@@ -3977,7 +4308,27 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3977
4308
  --__op-icon-font-size: var(--_op-icon-font-size-x-large);
3978
4309
  --__op-icon-optical-size: var(--_op-icon-optical-size-x-large);
3979
4310
  }
4311
+
4312
+ /* SVG Modifier: an inline SVG instead of a font glyph, e.g. `icon icon--svg icon--large` */
4313
+ &.icon--svg {
4314
+ svg {
4315
+ display: block;
4316
+ block-size: 100%;
4317
+ inline-size: 100%;
4318
+ }
4319
+
4320
+ /* A rule on the <svg> root cannot beat a stroke-width attribute on a child, so target the attribute.
4321
+ With no weight modifier the set keeps the widths it was drawn with. */
4322
+ &:is(.icon--weight-light, .icon--weight-normal, .icon--weight-semi-bold, .icon--weight-bold) svg [stroke-width] {
4323
+ stroke-width: var(--__op-icon-stroke-width);
4324
+ }
4325
+
4326
+ &.icon--low-emphasis {
4327
+ opacity: var(--_op-icon-svg-opacity-low-emphasis);
4328
+ }
4329
+ }
3980
4330
  }
4331
+
3981
4332
  /* Material Icons class provided by the Google Fonts CDN */
3982
4333
  .material-symbols-outlined {
3983
4334
  font-variation-settings:
@@ -3987,6 +4338,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
3987
4338
  'opsz' var(--__op-icon-optical-size);
3988
4339
  font-weight: unset;
3989
4340
  }
4341
+
3990
4342
  /* Custom SVG Icons app specific */
3991
4343
  .custom-icons {
3992
4344
  svg {
@@ -4036,6 +4388,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
4036
4388
  }
4037
4389
  }
4038
4390
  }
4391
+
4039
4392
  .modal {
4040
4393
  /* Public API (customizable component options) */
4041
4394
  --_op-modal-width: calc(141 * var(--op-size-unit)); /* 564px */
@@ -4081,6 +4434,7 @@ textarea.form-control:not([type='radio'], [type='checkbox']) {
4081
4434
  gap: var(--op-space-small);
4082
4435
  }
4083
4436
  }
4437
+
4084
4438
  dialog.modal {
4085
4439
  padding: 0;
4086
4440
  border: none;
@@ -4113,6 +4467,7 @@ dialog.modal {
4113
4467
  }
4114
4468
  }
4115
4469
  }
4470
+
4116
4471
  @starting-style {
4117
4472
  dialog.modal[open] {
4118
4473
  transform: scale(0.7);
@@ -4620,6 +4975,7 @@ dialog.modal {
4620
4975
  --__op-spinner-track-width: var(--_op-spinner-track-width-large);
4621
4976
  }
4622
4977
  }
4978
+
4623
4979
  @keyframes spinner {
4624
4980
  to {
4625
4981
  transform: rotate(360deg);
@@ -4736,6 +5092,7 @@ dialog.modal {
4736
5092
  display: flex;
4737
5093
  align-items: center;
4738
5094
  }
5095
+
4739
5096
  .tab {
4740
5097
  /* Public API */
4741
5098
  --_op-tab-font-small: var(--op-font-x-small);
@@ -5120,7 +5477,11 @@ dialog.modal {
5120
5477
 
5121
5478
  display: flex;
5122
5479
  flex-direction: column;
5123
- gap: var(--op-space-x-small);
5480
+
5481
+ /* zero specificity. Lets utilities override */
5482
+ :where(&) {
5483
+ gap: var(--op-space-x-small);
5484
+ }
5124
5485
 
5125
5486
  &.text-pair--inline {
5126
5487
  flex-direction: row;
@@ -5164,6 +5525,7 @@ dialog.modal {
5164
5525
  }
5165
5526
  }
5166
5527
  /* Inspired by https://blog.logrocket.com/creating-beautiful-tooltips-with-only-css/ */
5528
+
5167
5529
  [data-tooltip-text] {
5168
5530
  /* Public API (customizable component options) */
5169
5531
  --_op-tooltip-max-width: calc(50 * var(--op-size-unit)); /* 200px */