@rolemodel/optics 2.5.0 → 2.6.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 (67) hide show
  1. package/.agents/skills/github-release/SKILL.md +143 -0
  2. package/.github/workflows/linting.yml +2 -0
  3. package/.prettierignore +3 -0
  4. package/.yarn/install-state.gz +0 -0
  5. package/CHANGELOG.md +47 -0
  6. package/README.md +16 -0
  7. package/build_token_json.js +2 -1
  8. package/dist/README.md +16 -0
  9. package/dist/css/components/table.css +10 -0
  10. package/dist/css/core/tokens/base_color_tokens.css +74 -0
  11. package/dist/css/core/tokens/base_tokens.css +3 -345
  12. package/dist/css/core/tokens/index.css +2 -1
  13. package/dist/css/core/tokens/oklch/base_color_tokens.css +74 -0
  14. package/dist/css/core/tokens/oklch/index.css +3 -0
  15. package/dist/css/core/tokens/oklch/scale_color_tokens.css +1498 -0
  16. package/dist/css/core/tokens/shared_tokens.css +272 -0
  17. package/dist/css/optics+feather_icons.css +84 -73
  18. package/dist/css/optics+feather_icons.min.css +1 -1
  19. package/dist/css/optics+lucide_icons.css +84 -73
  20. package/dist/css/optics+lucide_icons.min.css +1 -1
  21. package/dist/css/optics+material_outlined_variable.css +84 -73
  22. package/dist/css/optics+material_outlined_variable.min.css +1 -1
  23. package/dist/css/optics+no_icons.css +84 -73
  24. package/dist/css/optics+no_icons.min.css +1 -1
  25. package/dist/css/optics+phosphor_icons.css +84 -73
  26. package/dist/css/optics+phosphor_icons.min.css +1 -1
  27. package/dist/css/optics+tabler_icons.css +84 -73
  28. package/dist/css/optics+tabler_icons.min.css +1 -1
  29. package/dist/css/optics-oklch+feather_icons.css +6566 -0
  30. package/dist/css/optics-oklch+feather_icons.min.css +1 -0
  31. package/dist/css/optics-oklch+lucide_icons.css +13598 -0
  32. package/dist/css/optics-oklch+lucide_icons.min.css +1 -0
  33. package/dist/css/optics-oklch+material_outlined_variable.css +5636 -0
  34. package/dist/css/optics-oklch+material_outlined_variable.min.css +1 -0
  35. package/dist/css/optics-oklch+no_icons.css +5627 -0
  36. package/dist/css/optics-oklch+no_icons.min.css +1 -0
  37. package/dist/css/optics-oklch+phosphor_icons.css +5671 -0
  38. package/dist/css/optics-oklch+phosphor_icons.min.css +1 -0
  39. package/dist/css/optics-oklch+tabler_icons.css +5638 -0
  40. package/dist/css/optics-oklch+tabler_icons.min.css +1 -0
  41. package/dist/css/optics-oklch.css +5640 -0
  42. package/dist/css/optics-oklch.min.css +1 -0
  43. package/dist/css/optics.css +84 -73
  44. package/dist/css/optics.min.css +1 -1
  45. package/dist/package.json +10 -6
  46. package/dist/tokens/tokens.json +16 -16
  47. package/dist/tools/check-contrast.cjs +46 -0
  48. package/dist/tools/contrast/builds/build.cjs +44 -0
  49. package/dist/tools/contrast/builds/hsl-build.cjs +11 -0
  50. package/dist/tools/contrast/builds/oklch-build.cjs +11 -0
  51. package/dist/tools/contrast/calc-expression.cjs +68 -0
  52. package/dist/tools/contrast/check-error.cjs +4 -0
  53. package/dist/tools/contrast/color-pair.cjs +35 -0
  54. package/dist/tools/contrast/colors/color.cjs +41 -0
  55. package/dist/tools/contrast/colors/function-color.cjs +46 -0
  56. package/dist/tools/contrast/colors/hex-color.cjs +19 -0
  57. package/dist/tools/contrast/colors/hsl-color.cjs +25 -0
  58. package/dist/tools/contrast/colors/oklch-color.cjs +36 -0
  59. package/dist/tools/contrast/colors/themed-color.cjs +37 -0
  60. package/dist/tools/contrast/contrast-check.cjs +36 -0
  61. package/dist/tools/contrast/contrast-reporter.cjs +43 -0
  62. package/dist/tools/contrast/contrast-result.cjs +15 -0
  63. package/dist/tools/contrast/css-syntax.cjs +23 -0
  64. package/dist/tools/contrast/stylesheet.cjs +174 -0
  65. package/dist/tools/contrast/theme.cjs +84 -0
  66. package/dist/tools/contrast/tool-options.cjs +43 -0
  67. package/package.json +10 -6
@@ -0,0 +1,143 @@
1
+ ---
2
+ name: github-release
3
+ description: Draft, write, and publish an Optics release on GitHub — checks the version bump, resolves the previous tag, generates notes from the release.yml categories, adds a plain-language line under each PR, and publishes, which ships the package to npm and GitHub Packages and redeploys the docs site. Use this whenever the user mentions cutting a release, bumping the version, drafting or writing release notes, publishing to npm, "what's going out", or updating the CHANGELOG for a release — even if they don't say the words "release notes".
4
+ ---
5
+
6
+ # Optics Release
7
+
8
+ Adapted from the `github-release` skill in RoleModel/bgea_volunteer_care.
9
+
10
+ A release is two steps, with a person in between:
11
+
12
+ 1. **Draft** — check the version, write the notes, save an unpublished draft.
13
+ 2. **Publish** — only once the user says go. Publishing ships the package.
14
+
15
+ Keep them apart. Publishing a release fires `deploy-to-npm.yml` and `deploy-to-ghp.yml`, which
16
+ publish `@rolemodel/optics` to npm and GitHub Packages. An npm version number can never be
17
+ reused, so a mistake means another release.
18
+
19
+ | | |
20
+ | -------- | --------------------------------------------------------------- |
21
+ | Tag | `v2.5.0` (semver, lowercase `v`) |
22
+ | Title | Same as the tag |
23
+ | Baseline | The latest published release |
24
+ | Ships | The tip of `main` |
25
+ | Notes | The categories in `.github/release.yml`, one line under each PR |
26
+
27
+ ---
28
+
29
+ ## Phase 1 — Draft
30
+
31
+ ### 1. Check the version bump is on main
32
+
33
+ The version is bumped in a pull request, not at release time. Before drafting, `main` must have:
34
+
35
+ - `package.json` `"version"` set to the new number
36
+ - The three `.storybook/assets/*.html` example pages pointing at the new CDN version
37
+ - A `## [X.Y.Z] - YYYY-MM-DD` section at the top of `CHANGELOG.md`
38
+
39
+ ```bash
40
+ git fetch origin --tags
41
+ git show origin/main:package.json | grep '"version"'
42
+ grep -o 'optics@[0-9.]*' .storybook/assets/*.html
43
+ gh release list --limit 3
44
+ ```
45
+
46
+ If the version on `main` is not higher than the latest release, stop. Offer to open the bump PR
47
+ instead. Pick the number from what changed: breaking changes are a major bump, anything new is a
48
+ minor bump, and fixes only are a patch.
49
+
50
+ ### 2. Get the change list
51
+
52
+ ```bash
53
+ gh api repos/RoleModel/optics/releases/generate-notes \
54
+ -f tag_name=v<new> -f target_commitish=main -f previous_tag_name=<latest release tag> \
55
+ --jq .body
56
+ ```
57
+
58
+ GitHub sorts PRs into the `.github/release.yml` categories by label. Act on:
59
+
60
+ - **Unlabeled Changes (please categorize these)** — label each PR on GitHub, then generate again.
61
+ Don't ship this heading.
62
+ - **A PR listed twice** — GitHub puts a PR in the first category that matches. Move it only if
63
+ that category is wrong for what it did.
64
+ - **Commits with no PR** — `git log <latest tag>..origin/main --oneline` shows them. Mention one
65
+ only if it changed the shipped CSS.
66
+
67
+ Report what you found, for example "6 PRs: 1 component, 1 dependency, 4 docs; 1 unlabeled".
68
+
69
+ ### 3. Write a line under each PR
70
+
71
+ The readers are developers who use Optics in their apps. Under each PR, add one indented line
72
+ that says what changed for them: the class, token, or variable name, and what it now does. The
73
+ PR body's **Why?** and **What Changed** sections are the best source.
74
+
75
+ | Weak | Strong |
76
+ | ---------------------- | -------------------------------------------------------------------------------------------- |
77
+ | Update icon libraries | The icon library addons point at the latest versions, so every icon in each set is available |
78
+ | Fix documentation site | Fixed the sidebar examples and the switch syntax example on the documentation site |
79
+
80
+ - Dependency PRs: say whether they change the shipped CSS. They usually don't.
81
+ - A PR with nothing to explain (an admin or repo setting) can stand without a line.
82
+ - Keep GitHub's **New Contributors** and **Full Changelog** lines.
83
+
84
+ ### 4. Match the CHANGELOG
85
+
86
+ The `CHANGELOG.md` section for this version should list the same PRs in the same categories.
87
+ If it is missing one, say so. The fix is a follow-up PR, not an edit during the release.
88
+
89
+ ### 5. Create the draft
90
+
91
+ ```bash
92
+ gh release create v<new> --draft --title "v<new>" --notes-file <path> --target main
93
+ ```
94
+
95
+ A draft creates no tag and fires no workflow, so it is safe to redo (`gh release edit`,
96
+ `gh release delete`). Show the user the URL and print the full notes in the chat. Then stop.
97
+
98
+ ---
99
+
100
+ ## Phase 2 — Publish
101
+
102
+ Only after the user says to publish.
103
+
104
+ ```bash
105
+ gh release edit v<new> --draft=false --latest
106
+ ```
107
+
108
+ Then check the three release workflows:
109
+
110
+ ```bash
111
+ gh run list --workflow deploy-to-npm.yml --limit 1
112
+ gh run list --workflow deploy-to-ghp.yml --limit 1
113
+ gh run list --workflow publish-storybook.yml --limit 1
114
+ ```
115
+
116
+ - `publish-storybook.yml` runs on `release: created`. GitHub does not send `created` when a
117
+ draft is published, so the docs site likely did not redeploy. Run it:
118
+ `gh workflow run publish-storybook.yml --ref main`
119
+ - `deploy-to-npm.yml` publishes with npm Trusted Publishing (OIDC), so there is no token. If it
120
+ fails with `E404` or `ENEEDAUTH`, the trusted publisher on npmjs.com (package Settings → Trusted
121
+ Publisher) doesn't match this repo and workflow file. Someone with npm admin access fixes it
122
+ there. Never switch back to an `NPM_TOKEN` that bypasses 2FA.
123
+ - To retry, `gh run rerun <run id> --failed` builds from the tag with the workflow file as it was
124
+ at the tag. If the workflow was fixed after the tag, use
125
+ `gh workflow run deploy-to-npm.yml --ref main` instead, and only if `main` has no CSS changes
126
+ since the tag.
127
+
128
+ Confirm the package is out:
129
+
130
+ ```bash
131
+ npm view @rolemodel/optics version
132
+ ```
133
+
134
+ Finally, give the user the notes as a copyable block for Slack, without the Full Changelog link.
135
+
136
+ ---
137
+
138
+ ## Guardrails
139
+
140
+ - **Never publish without the user's go-ahead.** It ships a package version that can't be taken
141
+ back.
142
+ - **Never release from a branch.** The target is always `main`, after the bump PR has merged.
143
+ - **Never invent a PR or what it did.** If a PR body is thin, say the line is a guess and ask.
@@ -29,6 +29,8 @@ jobs:
29
29
  run: yarn lint:css
30
30
  - name: Run Prettier
31
31
  run: yarn prettier-check
32
+ - name: Run Tests
33
+ run: yarn test
32
34
  - name: Build CSS
33
35
  run: yarn build:css
34
36
  - name: Build Tokens
package/.prettierignore CHANGED
@@ -3,5 +3,8 @@ tools/templates
3
3
  .yarn/*
4
4
  optics-design-system.code-workspace
5
5
 
6
+ # Claude Code settings and worktrees (each worktree is a full checkout)
7
+ .claude/
8
+
6
9
  # Generated docs
7
10
  llms-docs
Binary file
package/CHANGELOG.md CHANGED
@@ -4,6 +4,53 @@ All notable changes to this project will be documented in this file.
4
4
 
5
5
  This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [2.6.0] - 2026-10-21
8
+
9
+ ### Theme Token Changes
10
+
11
+ - Add an opt-in OKLCH color build by @Jeremy-Walton in https://github.com/RoleModel/optics/pull/368
12
+ - A new `optics-oklch.css` build (and one per icon set, such as `optics-oklch+lucide_icons.css`) defines every color token with `oklch()`. To switch, replace `optics` with `optics-oklch` in your import. The HSL build stays the default and is unchanged, and `core/tokens/base_tokens.css` still includes the color tokens for apps that import it directly. Apps can also run the new `optics-check-contrast` command in CI to check their theme's text contrast. See [OKLCH Colors](https://docs.optics.rolemodel.design/?path=/docs/overview-oklch-colors--docs) and [Contrast Checker](https://docs.optics.rolemodel.design/?path=/docs/tools-contrast-checker--docs)
13
+
14
+ ### Dependencies
15
+
16
+ - Update transitive dependencies to resolve Dependabot alerts by @Jeremy-Walton in https://github.com/RoleModel/optics/pull/367
17
+ - Development dependencies were updated in the lockfile. It does not affect the shipped CSS.
18
+
19
+ ### Repository Changes
20
+
21
+ - Add an opt-in OKLCH color build by @Jeremy-Walton in https://github.com/RoleModel/optics/pull/368
22
+ - Added tests for the contrast checker, which `yarn test` and the Linting CI workflow now run. The docs build now creates the llms docs before Storybook.
23
+
24
+ ### Documentation Changes
25
+
26
+ - Add an opt-in OKLCH color build by @Jeremy-Walton in https://github.com/RoleModel/optics/pull/368
27
+ - Added an [OKLCH Colors](https://docs.optics.rolemodel.design/?path=/docs/overview-oklch-colors--docs) page, a Tools section with the [Contrast Checker](https://docs.optics.rolemodel.design/?path=/docs/tools-contrast-checker--docs) page, an HSL / OKLCH toggle in the documentation site toolbar, and an OKLCH template on the Color Scale page.
28
+
29
+ **Full Changelog**: https://github.com/RoleModel/optics/compare/v2.5.1...v2.6.0
30
+
31
+ ## [2.5.1] - 2026-10-01
32
+
33
+ ### Component Changes
34
+
35
+ - Update table classes for consistency by @Jeremy-Walton in https://github.com/RoleModel/optics/pull/364
36
+ - The table modifiers now put the modifier name before its value: `.table--layout-auto`, `.table--layout-fixed`, `.table--density-default`, `.table--density-comfortable`, `.table--density-compact`, `.table--striped-even` and `.table--striped-odd`. The old names (such as `.table--comfortable-density`) still work, so no change is needed.
37
+
38
+ ### Dependencies
39
+
40
+ - Bump brace-expansion from 1.1.16 to 1.1.21 by @dependabot[bot] in https://github.com/RoleModel/optics/pull/361
41
+ - A development dependency was updated in the lockfile. It does not affect the shipped CSS.
42
+ - Bump undici from 7.29.0 to 7.30.0 by @dependabot[bot] in https://github.com/RoleModel/optics/pull/362
43
+ - A development dependency was updated in the lockfile. It does not affect the shipped CSS.
44
+
45
+ ### Repository Changes
46
+
47
+ - Add a github-release skill by @dallasbpeters in https://github.com/RoleModel/optics/pull/360
48
+ - Added a Claude Code skill that runs the same release steps every time.
49
+ - Publish to npm with Trusted Publishing by @dallasbpeters in https://github.com/RoleModel/optics/pull/363
50
+ - The package is now published to npm with Trusted Publishing, so no npm token is stored. Each published version now has provenance, which shows the GitHub workflow that built it.
51
+
52
+ **Full Changelog**: https://github.com/RoleModel/optics/compare/v2.5.0...v2.5.1
53
+
7
54
  ## [2.5.0] - 2026-09-30
8
55
 
9
56
  ### Component Changes
package/README.md CHANGED
@@ -40,6 +40,8 @@ You can add this import to the top of your root level `css` file.
40
40
  @import '@rolemodel/optics/dist/css/optics.min.css'; /* If you want a single file with all the styles in it. */
41
41
  ```
42
42
 
43
+ An OKLCH build is also available. See [OKLCH Colors](https://docs.optics.rolemodel.design/?path=/docs/overview-oklch-colors--docs).
44
+
43
45
  ### Importing without a compiler
44
46
 
45
47
  To use Optics without compilation, use a CDN like [jsDelivr](https://www.jsdelivr.com/) or [unpkg](https://unpkg.com/).
@@ -58,6 +60,20 @@ Add a link in your HTML head or an `@import` to the top of your root level `css`
58
60
 
59
61
  Note: You can use this method to use Optics with [CodePen](https://codepen.io/). In a CodePen project, go to `Settings > CSS`, find the section for adding external stylesheets, and add the CDN link as a resource.
60
62
 
63
+ ### Checking theme contrast
64
+
65
+ After customizing your theme, add `optics-check-contrast` to your CI to check that text on every color scale step passes WCAG AA:
66
+
67
+ ```json
68
+ {
69
+ "scripts": {
70
+ "check-contrast": "optics-check-contrast app/assets/stylesheets/theme.css"
71
+ }
72
+ }
73
+ ```
74
+
75
+ See [Contrast Checker](https://docs.optics.rolemodel.design/?path=/docs/tools-contrast-checker--docs) for options.
76
+
61
77
  ## Documentation
62
78
 
63
79
  We use [Storybook](https://storybook.js.org/docs/html/get-started/introduction) as a way to provide informative and interactive documentation.
@@ -132,7 +132,8 @@ try {
132
132
  .filter((directoryEntry) => directoryEntry.isFile() && directoryEntry.name !== 'index.css')
133
133
  .forEach((directoryEntry) => {
134
134
  const fileContents = fs.readFileSync(`${source}/${directoryEntry.name}`)
135
- const matches = fileContents.toString().match(/^\s*--.*?(?=;)/gm)
135
+ // Import-only files like base_tokens.css declare no variables.
136
+ const matches = fileContents.toString().match(/^\s*--.*?(?=;)/gm) ?? []
136
137
  matches.forEach((match) => {
137
138
  const [key, value] = match.split(':')
138
139
  variables = addToJson(splitKey(key.trim()), variables, value.trim())
package/dist/README.md CHANGED
@@ -40,6 +40,8 @@ You can add this import to the top of your root level `css` file.
40
40
  @import '@rolemodel/optics/dist/css/optics.min.css'; /* If you want a single file with all the styles in it. */
41
41
  ```
42
42
 
43
+ An OKLCH build is also available. See [OKLCH Colors](https://docs.optics.rolemodel.design/?path=/docs/overview-oklch-colors--docs).
44
+
43
45
  ### Importing without a compiler
44
46
 
45
47
  To use Optics without compilation, use a CDN like [jsDelivr](https://www.jsdelivr.com/) or [unpkg](https://unpkg.com/).
@@ -58,6 +60,20 @@ Add a link in your HTML head or an `@import` to the top of your root level `css`
58
60
 
59
61
  Note: You can use this method to use Optics with [CodePen](https://codepen.io/). In a CodePen project, go to `Settings > CSS`, find the section for adding external stylesheets, and add the CDN link as a resource.
60
62
 
63
+ ### Checking theme contrast
64
+
65
+ After customizing your theme, add `optics-check-contrast` to your CI to check that text on every color scale step passes WCAG AA:
66
+
67
+ ```json
68
+ {
69
+ "scripts": {
70
+ "check-contrast": "optics-check-contrast app/assets/stylesheets/theme.css"
71
+ }
72
+ }
73
+ ```
74
+
75
+ See [Contrast Checker](https://docs.optics.rolemodel.design/?path=/docs/tools-contrast-checker--docs) for options.
76
+
61
77
  ## Documentation
62
78
 
63
79
  We use [Storybook](https://storybook.js.org/docs/html/get-started/introduction) as a way to provide informative and interactive documentation.
@@ -81,28 +81,37 @@
81
81
  }
82
82
 
83
83
  /* Layout Modifiers */
84
+ /* The *-layout names are kept for backwards compatibility */
85
+ &.table--layout-auto,
84
86
  &.table--auto-layout {
85
87
  table-layout: auto;
86
88
  }
87
89
 
90
+ &.table--layout-fixed,
88
91
  &.table--fixed-layout {
89
92
  table-layout: fixed;
90
93
  }
91
94
 
92
95
  /* Table Density Modifiers */
96
+ /* The *-density names are kept for backwards compatibility */
97
+ &.table--density-default,
93
98
  &.table--default-density {
94
99
  --__op-table-cell-height: var(--_op-table-cell-height-default);
95
100
  }
96
101
 
102
+ &.table--density-comfortable,
97
103
  &.table--comfortable-density {
98
104
  --__op-table-cell-height: var(--_op-table-cell-height-comfortable);
99
105
  }
100
106
 
107
+ &.table--density-compact,
101
108
  &.table--compact-density {
102
109
  --__op-table-cell-height: var(--_op-table-cell-height-compact);
103
110
  }
104
111
 
105
112
  /* Striped Modifiers */
113
+ /* The *-striped names are kept for backwards compatibility */
114
+ &.table--striped-even,
106
115
  &.table--even-striped {
107
116
  tbody tr:nth-child(even) {
108
117
  background-color: var(--op-color-neutral-plus-seven);
@@ -110,6 +119,7 @@
110
119
  }
111
120
  }
112
121
 
122
+ &.table--striped-odd,
113
123
  &.table--odd-striped {
114
124
  tbody tr:nth-child(odd) {
115
125
  background-color: var(--op-color-neutral-plus-seven);
@@ -0,0 +1,74 @@
1
+ :root {
2
+ /* Color HSLs
3
+ A theme comprised of a primary, neutral, warning, danger, info, and notice colors.
4
+ */
5
+
6
+ /* Basic Colors */
7
+
8
+ /**
9
+ * @tokens Basic Colors
10
+ * @presenter Color
11
+ */
12
+ --op-color-white: hsl(0deg 100% 100%);
13
+ --op-color-black: hsl(0deg 0% 0%);
14
+
15
+ /**
16
+ * @tokens Primary Colors
17
+ * @presenter Color
18
+ */
19
+ --op-color-primary-h: 216;
20
+ --op-color-primary-s: 58%;
21
+ --op-color-primary-l: 48%;
22
+
23
+ /**
24
+ * @tokens Neutral Colors
25
+ * @presenter Color
26
+ */
27
+ --op-color-neutral-h: var(--op-color-primary-h);
28
+ --op-color-neutral-s: 4%;
29
+ --op-color-neutral-l: var(--op-color-primary-l);
30
+
31
+ /**
32
+ * @tokens Alerts Warning Colors
33
+ * @presenter Color
34
+ */
35
+ --op-color-alerts-warning-h: 47;
36
+ --op-color-alerts-warning-s: 100%;
37
+ --op-color-alerts-warning-l: 61%;
38
+
39
+ /**
40
+ * @tokens Alerts Danger Colors
41
+ * @presenter Color
42
+ */
43
+ --op-color-alerts-danger-h: 0;
44
+ --op-color-alerts-danger-s: 99%;
45
+ --op-color-alerts-danger-l: 76%;
46
+
47
+ /**
48
+ * @tokens Alerts Info Colors
49
+ * @presenter Color
50
+ */
51
+ --op-color-alerts-info-h: 216;
52
+ --op-color-alerts-info-s: 58%;
53
+ --op-color-alerts-info-l: 48%;
54
+
55
+ /**
56
+ * @tokens Alerts Notice Colors
57
+ * @presenter Color
58
+ */
59
+ --op-color-alerts-notice-h: 130;
60
+ --op-color-alerts-notice-s: 61%;
61
+ --op-color-alerts-notice-l: 64%;
62
+
63
+ /* Shadows */
64
+
65
+ /**
66
+ * @tokens Shadows
67
+ * @presenter Shadow
68
+ */
69
+ --op-shadow-x-small: 0 1px 2px hsl(0deg 0% 0% / 3%), 0 1px 3px hsl(0deg 0% 0% / 15%);
70
+ --op-shadow-small: 0 1px 2px hsl(0deg 0% 0% / 3%), 0 2px 6px hsl(0deg 0% 0% / 15%);
71
+ --op-shadow-medium: 0 4px 8px hsl(0deg 0% 0% / 15%), 0 1px 3px hsl(0deg 0% 0% / 3%);
72
+ --op-shadow-large: 0 6px 10px hsl(0deg 0% 0% / 15%), 0 2px 3px hsl(0deg 0% 0% / 3%);
73
+ --op-shadow-x-large: 0 8px 12px hsl(0deg 0% 0% / 15%), 0 4px 4px hsl(0deg 0% 0% / 3%);
74
+ }