@coopdigital/styles 0.44.0 → 0.45.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 (56) hide show
  1. package/README.md +3 -3
  2. package/dist/components/AlertBanner.css +1 -1
  3. package/dist/components/Button.css +1 -1
  4. package/dist/components/Card.css +1 -1
  5. package/dist/components/Checkbox.css +1 -1
  6. package/dist/components/DatePicker.css +1 -1
  7. package/dist/components/Expandable.css +1 -1
  8. package/dist/components/Pill.css +1 -1
  9. package/dist/components/Searchbox.css +1 -1
  10. package/dist/components/Select.css +1 -1
  11. package/dist/components/Signpost.css +1 -1
  12. package/dist/components/SkipNav.css +1 -1
  13. package/dist/components/Tag.css +1 -1
  14. package/dist/components/TextInput.css +1 -1
  15. package/dist/components/Textarea.css +1 -1
  16. package/dist/components.css +1 -1
  17. package/dist/form.css +1 -1
  18. package/dist/foundations.css +1 -0
  19. package/dist/required-utilities.css +1 -0
  20. package/dist/typography/misc.css +1 -1
  21. package/dist/typography/text.css +1 -1
  22. package/dist/typography.css +1 -1
  23. package/dist/vars/colors.css +1 -1
  24. package/dist/vars.css +1 -1
  25. package/package.json +2 -2
  26. package/presets/uno/__tests__/rules.test.js +101 -0
  27. package/presets/uno/index.js +166 -39
  28. package/presets/uno/rules.js +72 -0
  29. package/src/components/AlertBanner.scss +9 -9
  30. package/src/components/Button.scss +42 -92
  31. package/src/components/Card.scss +7 -10
  32. package/src/components/Checkbox.scss +1 -1
  33. package/src/components/DatePicker.scss +2 -2
  34. package/src/components/Expandable.scss +7 -1
  35. package/src/components/Pill.scss +12 -12
  36. package/src/components/Searchbox.scss +35 -39
  37. package/src/components/Select.scss +2 -2
  38. package/src/components/Signpost.scss +9 -9
  39. package/src/components/SkipNav.scss +1 -1
  40. package/src/components/Tag.scss +3 -3
  41. package/src/components/TextInput.scss +5 -5
  42. package/src/components/Textarea.scss +7 -7
  43. package/src/form.scss +29 -22
  44. package/src/{main.scss → foundations.scss} +1 -1
  45. package/src/required-utilities.scss +36 -0
  46. package/src/typography/misc.scss +2 -2
  47. package/src/typography/text.scss +51 -6
  48. package/src/vars/colors.scss +89 -58
  49. package/src/vars.scss +0 -2
  50. package/dist/main.css +0 -1
  51. package/dist/required-backgrounds.css +0 -1
  52. package/dist/vars/colors-notifications.css +0 -1
  53. package/dist/vars/colors-palette.css +0 -0
  54. package/src/required-backgrounds.scss +0 -7
  55. package/src/vars/colors-notifications.scss +0 -14
  56. package/src/vars/colors-palette.scss +0 -54
@@ -0,0 +1,101 @@
1
+ import { describe, test, expect } from "vitest"
2
+ import { bgColorRule, borderColorRule } from "../rules"
3
+
4
+ const theme = {
5
+ colors: {
6
+ "brand-blue": "var(--color-brand-blue)",
7
+ red: {
8
+ 100: "var(--color-red-100)",
9
+ 500: "var(--color-red-500)",
10
+ DEFAULT: "var(--color-red-500)",
11
+ },
12
+ blue: {
13
+ DEFAULT: "var(--color-blue-500)",
14
+ },
15
+ teal: "var(--color-teal-500)",
16
+ },
17
+ }
18
+
19
+ describe("Test makeColorRule()", () => {
20
+ const bgRule = bgColorRule
21
+ const borderRule = borderColorRule
22
+
23
+ function runRule(rule, className) {
24
+ const [regex, handler] = rule
25
+ const match = className.match(regex)
26
+ if (!match) return null
27
+ return handler(match, { theme })
28
+ }
29
+
30
+ // ---------------------------
31
+ // Flat color tests
32
+ // ---------------------------
33
+
34
+ test("bg-brand-blue uses flat color var", () => {
35
+ const result = runRule(bgRule, "bg-brand-blue")
36
+ expect(result).toEqual({
37
+ "--bg-color": "var(--color-brand-blue)",
38
+ "background-color": "var(--color-brand-blue)",
39
+ })
40
+ })
41
+
42
+ test("bg-teal uses flat color but different var name", () => {
43
+ const result = runRule(bgRule, "bg-teal")
44
+ expect(result).toEqual({
45
+ "--bg-color": "var(--color-teal-500)",
46
+ "background-color": "var(--color-teal-500)",
47
+ })
48
+ })
49
+
50
+ // ---------------------------
51
+ // Nested color tests
52
+ // ---------------------------
53
+
54
+ test("bg-red-500 resolves nested shade", () => {
55
+ const result = runRule(bgRule, "bg-red-500")
56
+ expect(result).toEqual({
57
+ "--bg-color": "var(--color-red-500)",
58
+ "background-color": "var(--color-red-500)",
59
+ })
60
+ })
61
+
62
+ test("bg-red falls back to DEFAULT shade", () => {
63
+ const result = runRule(bgRule, "bg-red")
64
+ expect(result).toEqual({
65
+ "--bg-color": "var(--color-red-500)",
66
+ "background-color": "var(--color-red-500)",
67
+ })
68
+ })
69
+
70
+ // ---------------------------
71
+ // Rule not matching
72
+ // ---------------------------
73
+
74
+ test("bg-red-200 returns undefined as 200 shade doesn't exist", () => {
75
+ const result = runRule(bgRule, "bg-red-200")
76
+ expect(result).toBeUndefined()
77
+ })
78
+
79
+ test("non-existent bg-yellow returns nothing", () => {
80
+ const result = runRule(bgRule, "bg-yellow")
81
+ expect(result).toBeUndefined()
82
+ })
83
+
84
+ test("wrong prefix does not match the regex (bg!=border)", () => {
85
+ const result = runRule(bgRule, "border-red-500")
86
+ expect(result).toBeNull()
87
+ })
88
+
89
+ // ---------------------------
90
+ // Border rule test
91
+ // ---------------------------
92
+
93
+ test("border-red-100 uses border props", () => {
94
+ const result = runRule(borderRule, "border-red-100")
95
+ expect(result).toEqual({
96
+ "--border-color": "var(--color-red-100)",
97
+ "border-color": "var(--color-red-100)",
98
+ })
99
+ })
100
+ })
101
+ ;``
@@ -1,4 +1,19 @@
1
1
  import { definePreset } from "unocss"
2
+ import { bgColorRule, borderColorRule } from "./rules"
3
+
4
+ function generateTertiaryColors() {
5
+ const hues = ["blue", "green", "lilac", "orange", "pink", "purple", "red", "yellow"]
6
+ const variants = ["light", "tint", "dark"]
7
+ const out = {}
8
+ for (const h of hues) {
9
+ for (const v of variants) {
10
+ const key = `${v}-${h}` // e.g. "light-blue"
11
+ const cssVar = `var(--color-${key})`
12
+ out[key] = cssVar
13
+ }
14
+ }
15
+ return out
16
+ }
2
17
 
3
18
  const presetCoop = definePreset(() => {
4
19
  return {
@@ -8,52 +23,82 @@ const presetCoop = definePreset(() => {
8
23
  ...theme,
9
24
  breakpoints: {
10
25
  ...theme.breakpoints,
11
- lg: "1024px",
12
- md: "768px",
26
+ xxs: "320px",
27
+ xs: "414px",
13
28
  sm: "600px",
29
+ md: "768px",
30
+ lg: "1024px",
14
31
  xl: "1312px",
15
- xs: "414px",
16
32
  xxl: "1536px",
17
- xxs: "320px",
18
33
  },
19
34
  colors: {
20
35
  ...theme.colors,
21
- blue: "var(--color-blue)",
22
36
  "brand-blue": "var(--color-brand-blue)",
23
- "dark-blue": "var(--color-dark-blue)",
24
- "dark-green": "var(--color-dark-green)",
25
- "dark-grey": "var(--color-dark-grey)",
26
- "dark-lilac": "var(--color-dark-lilac)",
27
- "dark-orange": "var(--color-dark-orange)",
28
- "dark-pink": "var(--color-dark-pink)",
29
- "dark-purple": "var(--color-dark-purple)",
30
- "dark-red": "var(--color-dark-red)",
31
- "dark-yellow": "var(--color-dark-yellow)",
32
- green: "var(--color-green)",
33
- "light-blue": "var(--color-light-blue)",
34
- "light-green": "var(--color-light-green)",
35
- "light-grey": "var(--color-light-grey)",
36
- "light-lilac": "var(--color-light-lilac)",
37
- "light-orange": "var(--color-light-orange)",
38
- "light-pink": "var(--color-light-pink)",
39
- "light-purple": "var(--color-light-purple)",
40
- "light-red": "var(--color-light-red)",
41
- "light-yellow": "var(--color-light-yellow)",
42
- "mid-dark-grey": "var(--color-mid-dark-grey)",
43
- "mid-grey": "var(--color-mid-grey)",
44
- "mid-light-grey": "var(--color-mid-light-grey)",
45
- "offer-red": "var(--color-offer-red)",
46
- red: "var(--color-offer-red)",
47
- "tint-blue": "var(--color-tint-blue)",
48
- "tint-brown": "var(--color-tint-brown)",
49
- "tint-green": "var(--color-tint-green)",
50
- "tint-grey": "var(--color-tint-grey)",
51
- "tint-lilac": "var(--color-tint-lilac)",
52
- "tint-orange": "var(--color-tint-orange)",
53
- "tint-pink": "var(--color-tint-pink)",
54
- "tint-purple": "var(--color-tint-purple)",
55
- "tint-red": "var(--color-tint-red)",
56
- "tint-yellow": "var(--color-tint-yellow)",
37
+ // BLUES
38
+ blue: {
39
+ 500: "var(--color-blue-500)",
40
+ 700: "var(--color-blue-700)",
41
+ DEFAULT: "var(--color-blue)",
42
+ },
43
+ // REDS
44
+ red: {
45
+ 500: "var(--color-red-500)",
46
+ 100: "var(--color-red-100)",
47
+ DEFAULT: "var(--color-red)",
48
+ },
49
+ // PURPLES
50
+ purple: {
51
+ 500: "var(--color-purple-500)",
52
+ DEFAULT: "var(--color-purple)",
53
+ },
54
+ // YELLOWS
55
+ yellow: {
56
+ 500: "var(--color-yellow-500)",
57
+ 100: "var(--color-yellow-100)",
58
+ DEFAULT: "var(--color-yellow)",
59
+ },
60
+ // GREENS
61
+ green: {
62
+ 500: "var(--color-green-500)",
63
+ 100: "var(--color-green-100)",
64
+ DEFAULT: "var(--color-green)",
65
+ },
66
+ // TEALS
67
+ teal: {
68
+ 500: "var(--color-teal-500)",
69
+ DEFAULT: "var(--color-teal)",
70
+ },
71
+ // NEUTRALS
72
+ white: "var(--color-white)",
73
+ black: "var(--color-black)",
74
+ "grey-warm": {
75
+ 100: "var(--color-grey-warm-100)",
76
+ 500: "var(--color-grey-warm-500)",
77
+ 900: "var(--color-grey-warm-900)",
78
+ DEFAULT: "var(--color-grey-warm)",
79
+ },
80
+ "grey-cool": {
81
+ 100: "var(--color-grey-cool-100)",
82
+ 500: "var(--color-grey-cool-500)",
83
+ 900: "var(--color-grey-cool-900)",
84
+ DEFAULT: "var(--color-grey-cool)",
85
+ },
86
+ grey: {
87
+ 900: "var(--color-grey-900)",
88
+ 800: "var(--color-grey-800)",
89
+ 700: "var(--color-grey-700)",
90
+ 600: "var(--color-grey-600)",
91
+ 500: "var(--color-grey-500)",
92
+ 400: "var(--color-grey-400)",
93
+ 300: "var(--color-grey-300)",
94
+ 200: "var(--color-grey-200)",
95
+ 100: "var(--color-grey-100)",
96
+ DEFAULT: "var(--color-grey)",
97
+ },
98
+ // TERTIARY colours: tints, lights and darks
99
+ ...generateTertiaryColors(),
100
+ "tint-brown": "var(--color-grey-warm-100)",
101
+ "tint-grey": "var(--color-grey-200)",
57
102
  },
58
103
  }
59
104
  },
@@ -67,6 +112,31 @@ const presetCoop = definePreset(() => {
67
112
  ],
68
113
  ["font-headline", { "font-family": "'Co-opHeadline', 'Impact Fallback', sans-serif" }],
69
114
 
115
+ [
116
+ /^(bg|border)-(.*)$/,
117
+ function* ([, rule, color], { theme }) {
118
+ const root = color.split("-")[0]
119
+
120
+ // console.log(root, color)
121
+
122
+ if (root in theme.colors || color in theme.colors) {
123
+ const cssVar = `var(--color-${color})`
124
+ //const cssVar = extractColorVarName(value)
125
+ switch (rule) {
126
+ case "bg":
127
+ yield { "background-color": cssVar, "--bg-color": cssVar }
128
+ break
129
+ case "border":
130
+ yield { "border-color": cssVar, "--border-color": cssVar }
131
+ break
132
+ }
133
+ }
134
+ },
135
+ ],
136
+
137
+ //bgColorRule,
138
+ //borderColorRule,
139
+
70
140
  /*
71
141
  To support presetWind3 and presetWind4 and probably future presets
72
142
  we decided to use rules instead of editing font-size inside theme
@@ -98,6 +168,63 @@ const presetCoop = definePreset(() => {
98
168
  "flex-center-between": "flex justify-between items-center",
99
169
  "flex-responsive": "flex flex-col md:flex-row",
100
170
  "flex-stack-vertical": "flex flex-col gap-4",
171
+
172
+ // SEMANTIC COLORS
173
+
174
+ // Blues
175
+ "text-link": "text-blue-500",
176
+ //"text-button-secondary2": "text-blue-700",
177
+ //"bg-button-primary2": "bg-blue-700",
178
+ "icon-brand-blue": "fill-brand-blue",
179
+
180
+ // Teal
181
+ //"text-button-secondary": "text-teal",
182
+ //"bg-button-primary": "bg-teal",
183
+
184
+ // Reds
185
+ "text-offer": "text-red-500",
186
+ "text-error": "text-red-500",
187
+ "bg-offer": "bg-red-500",
188
+ "bg-error": "bg-red-500",
189
+ "bg-error-light": "bg-red-100",
190
+ "border-offer": "border-red-500",
191
+ "border-error": "border-red-500",
192
+
193
+ // Purples
194
+ "border-focus-ring": "border-purple-500",
195
+
196
+ // Whites
197
+ "text-inverse": "text-white",
198
+ "icon-inverse": "fill-white",
199
+
200
+ // Greys
201
+ "text-primary": "text-grey-900",
202
+ "text-secondary": "text-grey-800",
203
+ "bg-primary": "bg-white",
204
+ "bg-secondary": "bg-grey-200",
205
+ // "bg-membership": "bg-tint-blue",
206
+ "bg-footer": "bg-grey-900",
207
+ "bg-footer-light": "bg-grey-cool-100", // bg-footer-shop
208
+ // "bg-neutral-warm": "bg-grey-warm-100",
209
+ "border-divider": "border-grey-600",
210
+
211
+ // Yellows
212
+ "border-alert": "border-yellow-500",
213
+ "bg-alert-light": "bg-yellow-100",
214
+
215
+ // Greens
216
+ "text-success": "text-green-500",
217
+ "border-success": "border-green-500",
218
+ "bg-success-light": "bg-green-100",
219
+
220
+ // Tertiaries
221
+ "text-brand-red": "text-dark-red",
222
+ "text-brand-orange": "text-dark-orange",
223
+ "text-brand-yellow": "text-dark-yellow",
224
+ "text-brand-green": "text-dark-green",
225
+ "text-brand-lilac": "text-dark-purple",
226
+ "text-brand-purple": "text-dark-lilac",
227
+ "text-brand-pink": "text-dark-pink",
101
228
  },
102
229
  ],
103
230
  }
@@ -0,0 +1,72 @@
1
+ function extractColorVarName(value) {
2
+ const match = /var\(\s*(--[^)]+)\s*\)/.exec(value)
3
+ return match ? match[1] : null
4
+ }
5
+
6
+ function makeColorRule(prefix, props) {
7
+ const regex = new RegExp(`^${prefix}-(.+)$`)
8
+
9
+ return [
10
+ regex,
11
+ ([, token], ctx) => {
12
+ const colors = ctx.theme && ctx.theme.colors
13
+ if (!colors) return
14
+
15
+ let value = null
16
+
17
+ //
18
+ // 1. True flat colors — must NOT be an object
19
+ //
20
+ if (token in colors && typeof colors[token] !== "object") {
21
+ value = colors[token]
22
+ }
23
+ //
24
+ // 2. Nested colors (object) eg: red-500 or red (DEFAULT)
25
+ //
26
+ else {
27
+ const parts = token.split("-")
28
+ const shade = parts.pop() // "500"
29
+ const name = parts.join("-") || token
30
+
31
+ const colorObj = colors[name]
32
+
33
+ if (colorObj && typeof colorObj === "object") {
34
+ // Normalize keys to strings
35
+ const keys = Object.keys(colorObj).map(String)
36
+
37
+ let selectedShade = null
38
+
39
+ // If the user-specified shade exists → use it
40
+ if (keys.includes(shade)) {
41
+ selectedShade = shade
42
+ }
43
+ // If user DID NOT specify a shade (like "bg-red") → use DEFAULT
44
+ else if (token === name) {
45
+ // example: token="red", name="red"
46
+ if (keys.includes("DEFAULT")) {
47
+ selectedShade = "DEFAULT"
48
+ }
49
+ }
50
+
51
+ // If no matching shade found → undefined
52
+ if (selectedShade === null) return
53
+
54
+ value = colorObj[selectedShade]
55
+ }
56
+ }
57
+
58
+ if (!value) return
59
+
60
+ const varName = extractColorVarName(value)
61
+ if (!varName) return
62
+
63
+ const out = {}
64
+ props.forEach((prop) => (out[prop] = `var(${varName})`))
65
+ return out
66
+ },
67
+ ]
68
+ }
69
+
70
+ export const bgColorRule = makeColorRule("bg", ["--bg-color", "background-color"])
71
+
72
+ export const borderColorRule = makeColorRule("border", ["--border-color", "border-color"])
@@ -1,7 +1,7 @@
1
1
  .coop-alert-banner {
2
- --bg-color: var(--color-orange-alert-light);
3
- --text-color: var(--color-text-default);
4
- --border-left: solid 0.25rem var(--color-orange-alert);
2
+ --alert-bg-color: var(--color-alert-light);
3
+ --alert-text-color: var(--color-text-default);
4
+ --alert-border-left: solid 0.25rem var(--color-alert);
5
5
 
6
6
  display: flex;
7
7
  flex-direction: column;
@@ -9,16 +9,16 @@
9
9
 
10
10
  width: 100%;
11
11
  padding: var(--spacing-16);
12
- border-left: var(--border-left);
12
+ border-left: var(--alert-border-left);
13
13
 
14
- color: var(--text-color);
14
+ color: var(--alert-text-color);
15
15
 
16
- background-color: var(--bg-color);
16
+ background-color: var(--alert-bg-color);
17
17
 
18
18
  &[data-variant="black"] {
19
- --bg-color: var(--color-black);
20
- --text-color: var(--color-white);
21
- --border-left: 0;
19
+ --alert-bg-color: var(--color-black);
20
+ --alert-text-color: var(--color-white);
21
+ --alert-border-left: 0;
22
22
  }
23
23
 
24
24
  a {
@@ -1,49 +1,14 @@
1
- @use "sass:map";
2
1
  @use "../breakpoints.scss" as *;
3
2
  @use "../keyframes/spinner";
4
3
 
5
- $variants: (
6
- "blue": (
7
- bg-color: var(--color-blue),
8
- text-color: var(--color-white),
9
- ),
10
- "white": (
11
- bg-color: var(--color-white),
12
- text-color: var(--color-black),
13
- ),
14
- "grey": (
15
- bg-color: var(--color-grey),
16
- text-color: var(--color-black),
17
- ),
18
- "green-ghost": (
19
- bg-color: transparent,
20
- text-color: var(--color-green),
21
- border: 2px solid var(--color-green),
22
- ),
23
- "blue-ghost": (
24
- bg-color: transparent,
25
- text-color: var(--color-blue),
26
- border: 2px solid var(--color-blue),
27
- ),
28
- "white-ghost": (
29
- bg-color: transparent,
30
- text-color: var(--color-white),
31
- border: 2px solid var(--color-white),
32
- ),
33
- "grey-ghost": (
34
- bg-color: transparent,
35
- text-color: var(--color-grey),
36
- border: 2px solid var(--color-grey),
37
- ),
38
- );
39
-
40
4
  .coop-button {
41
- --bg-color: var(--color-green);
42
- --text-color: var(--color-white);
43
- --font-size: var(--text-size-18);
44
- --border: 0;
45
- --padding: 0 var(--spacing-24);
46
- --height: var(--spacing-48);
5
+ --button-font-size: var(--text-size-18);
6
+ --button-border-color: var(--border-color, transparent);
7
+ --button-padding-y: 0;
8
+ --button-padding-x: var(--spacing-24);
9
+ --button-padding: var(--button-padding-y) var(--button-padding-x);
10
+ --button-height: var(--spacing-48);
11
+ --button-bg-color: var(--bg-color, var(--color-teal));
47
12
 
48
13
  cursor: pointer;
49
14
 
@@ -53,44 +18,37 @@ $variants: (
53
18
  justify-content: center;
54
19
 
55
20
  width: max-content;
56
- height: var(--height);
57
- min-height: var(--height);
58
- padding: var(--padding);
59
- border: var(--border);
21
+ height: var(--button-height);
22
+ min-height: var(--button-height);
23
+ padding: var(--button-padding);
24
+ border-style: solid;
25
+ border-width: 0;
60
26
  border-radius: var(--ui-border-radius-lg);
61
27
 
62
- font-size: var(--font-size);
28
+ font-size: var(--button-font-size);
63
29
  font-weight: 500;
64
30
  line-height: var(--type-line-height-default);
65
- color: var(--text-color);
66
31
  text-align: center;
67
- text-decoration: underline;
68
- text-decoration-color: transparent;
69
32
 
70
- background: var(--bg-color);
33
+ background: var(--button-bg-color);
71
34
 
72
35
  transition: 0.1s ease-out;
73
- transition-property: background-color, color, text-decoration-color;
36
+ transition-property: background-color, color, border-color;
74
37
 
75
38
  /* SIZES */
76
39
  &[data-size="sm"] {
77
- --padding: 0 var(--spacing-16);
78
- --height: var(--spacing-40);
79
- --font-size: var(--text-size-16);
40
+ --button-padding-x: var(--spacing-16);
41
+ --button-height: var(--spacing-40);
42
+ --button-font-size: var(--text-size-16);
80
43
  }
81
44
 
82
45
  &[data-size="lg"] {
83
- --padding: 0 var(--spacing-32);
84
- --height: var(--spacing-56);
85
- --font-size: var(--text-size-20);
46
+ --button-padding-x: var(--spacing-32);
47
+ --button-height: var(--spacing-56);
48
+ --button-font-size: var(--text-size-20);
86
49
  }
87
50
 
88
- // &[data-size="xl"] {
89
- // --min-height: var(--spacing-60);
90
- // }
91
-
92
51
  &:is(a) {
93
- color: var(--text-color);
94
52
  text-decoration-color: transparent;
95
53
  }
96
54
 
@@ -99,24 +57,13 @@ $variants: (
99
57
  outline-offset: 3px;
100
58
  }
101
59
 
102
- &[aria-disabled],
103
- &:disabled {
104
- --bg-color: var(--color-mid-grey);
105
- --text-color: var(--color-white);
106
- --border: 0;
107
-
108
- cursor: not-allowed;
109
- outline: 0;
110
- }
111
-
112
60
  &:not([data-loading], [aria-disabled], :disabled):hover {
113
- color: var(--text-color);
114
- text-decoration-color: var(--text-color);
115
- background-color: hsl(from var(--bg-color) h s calc(l - 5));
61
+ text-decoration: solid underline currentColor;
62
+ background-color: hsl(from var(--button-bg-color) h s calc(l - 5));
116
63
  }
117
64
 
118
65
  &:not([data-loading], [aria-disabled], :disabled):active {
119
- background-color: hsl(from var(--bg-color) h s calc(l - 10));
66
+ background-color: hsl(from var(--button-bg-color) h s calc(l - 10));
120
67
  }
121
68
 
122
69
  /* FULL WIDTH */
@@ -134,26 +81,29 @@ $variants: (
134
81
  }
135
82
  }
136
83
 
137
- > * {
138
- pointer-events: none;
84
+ &[data-variant="ghost"] {
85
+ --button-bg-color: transparent;
86
+ --button-border-color: var(--border-color, var(--color-teal));
87
+ --button-padding: var(--button-padding-y) calc(var(--button-padding-x) - 2px);
88
+
89
+ border-color: var(--button-border-color);
90
+ border-width: 2px;
91
+ color: var(--button-border-color);
139
92
  }
140
93
 
141
- /* MEDIA QUERIES */
94
+ &[aria-disabled],
95
+ &:disabled {
96
+ cursor: not-allowed;
142
97
 
143
- // @media (min-width: $mq-medium) {
144
- // --padding-x: var(--spacing-40);
145
- // }
98
+ border: 0;
146
99
 
147
- /* VARIANTS */
100
+ color: var(--color-white);
148
101
 
149
- @each $variant, $colors in $variants {
150
- &[data-variant="#{$variant}"]:not([aria-disabled], &:disabled) {
151
- --bg-color: #{map.get($colors, "bg-color")};
152
- --text-color: #{map.get($colors, "text-color")};
102
+ background: var(--color-grey-600);
103
+ outline: 0;
104
+ }
153
105
 
154
- @if map.has-key($colors, "border") {
155
- --border: #{map.get($colors, "border")};
156
- }
157
- }
106
+ > * {
107
+ pointer-events: none;
158
108
  }
159
109
  }
@@ -2,10 +2,8 @@
2
2
 
3
3
  .coop-card {
4
4
  --card-direction: column;
5
- --image-max-width: 100%;
6
- --image-border-radius: var(--ui-border-radius-lg) var(--ui-border-radius-lg) 0 0;
7
- --label-bg: none;
8
- --card-bg: var(--color-white);
5
+ --card-image-max-width: 100%;
6
+ --card-image-border-radius: var(--ui-border-radius-lg) var(--ui-border-radius-lg) 0 0;
9
7
 
10
8
  position: relative;
11
9
 
@@ -14,7 +12,6 @@
14
12
 
15
13
  border-radius: var(--ui-border-radius-lg);
16
14
 
17
- background: var(--card-bg);
18
15
  box-shadow: var(--ui-shadow);
19
16
 
20
17
  transition: box-shadow var(--ui-transition-hover);
@@ -22,23 +19,23 @@
22
19
  &[data-orientation="horizontal"] {
23
20
  @media (min-width: $mq-medium) {
24
21
  --card-direction: row;
25
- --image-max-width: calc(100% / 3);
26
- --image-border-radius: var(--ui-border-radius-lg) 0 0 var(--ui-border-radius-lg);
22
+ --card-image-max-width: calc(100% / 3);
23
+ --card-image-border-radius: var(--ui-border-radius-lg) 0 0 var(--ui-border-radius-lg);
27
24
  }
28
25
  }
29
26
 
30
27
  &[data-orientation="horizontal"][data-image-pos="right"] {
31
28
  @media (min-width: $mq-medium) {
32
29
  --card-direction: row-reverse;
33
- --image-border-radius: 0 var(--ui-border-radius-lg) var(--ui-border-radius-lg) 0;
30
+ --card-image-border-radius: 0 var(--ui-border-radius-lg) var(--ui-border-radius-lg) 0;
34
31
  }
35
32
  }
36
33
 
37
34
  picture {
38
35
  overflow: hidden;
39
- max-width: var(--image-max-width);
36
+ max-width: var(--card-image-max-width);
40
37
  margin: 0;
41
- border-radius: var(--image-border-radius);
38
+ border-radius: var(--card-image-border-radius);
42
39
 
43
40
  img {
44
41
  width: 100%;