@kwtv/components 0.2.0 → 0.4.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 +52 -9
  2. package/package.json +2 -2
  3. package/src/astro/Accordion.astro +10 -6
  4. package/src/astro/AccordionItem.astro +55 -45
  5. package/src/astro/ActiveFilterTags.astro +41 -28
  6. package/src/astro/Alert.astro +45 -41
  7. package/src/astro/Badge.astro +80 -76
  8. package/src/astro/Band.astro +104 -58
  9. package/src/astro/Breadcrumb.astro +38 -30
  10. package/src/astro/Button.astro +135 -129
  11. package/src/astro/Card.astro +72 -62
  12. package/src/astro/CartLine.astro +72 -58
  13. package/src/astro/Checkbox.astro +36 -32
  14. package/src/astro/Chip.astro +68 -64
  15. package/src/astro/ChipRail.astro +6 -1
  16. package/src/astro/DotGrid.astro +55 -42
  17. package/src/astro/EmptyState.astro +29 -23
  18. package/src/astro/FilterGroup.astro +29 -26
  19. package/src/astro/Filters.astro +57 -47
  20. package/src/astro/Footer.astro +195 -178
  21. package/src/astro/FooterColumn.astro +39 -35
  22. package/src/astro/Header.astro +80 -67
  23. package/src/astro/Icon.astro +4 -2
  24. package/src/astro/IconButton.astro +67 -61
  25. package/src/astro/Marquee.astro +43 -41
  26. package/src/astro/NavDropdown.astro +169 -149
  27. package/src/astro/NavLink.astro +59 -56
  28. package/src/astro/Newsletter.astro +64 -56
  29. package/src/astro/Pager.astro +71 -46
  30. package/src/astro/PickCard.astro +72 -68
  31. package/src/astro/ProductCard.astro +134 -119
  32. package/src/astro/Radio.astro +36 -32
  33. package/src/astro/Skeleton.astro +60 -42
  34. package/src/astro/Social.astro +26 -21
  35. package/src/astro/StepIndicator.astro +70 -54
  36. package/src/astro/Sticker.astro +74 -49
  37. package/src/astro/Swatch.astro +44 -40
  38. package/src/astro/SwipeCarousel.astro +5 -1
  39. package/src/astro/Table.astro +66 -56
  40. package/src/astro/TableCard.astro +45 -37
  41. package/src/astro/TextField.astro +104 -91
  42. package/src/astro/Totals.astro +39 -35
  43. package/src/react/Drawer.css +60 -56
  44. package/src/react/Drawer.tsx +1 -5
  45. package/src/react/Modal.css +97 -93
  46. package/src/react/Modal.tsx +4 -6
  47. package/src/react/NewsCarousel.css +108 -104
  48. package/src/react/NewsCarousel.tsx +7 -1
  49. package/src/react/QuantityStepper.css +84 -80
  50. package/src/react/Select.css +159 -155
  51. package/src/react/Select.tsx +8 -2
  52. package/src/react/Toast.css +128 -124
  53. package/src/react/Toast.tsx +38 -4
  54. package/src/styles/base.css +30 -26
  55. package/src/styles/controls.css +183 -179
  56. package/src/styles/motion.css +203 -199
@@ -15,7 +15,9 @@ const hasAction = Astro.slots.has("action");
15
15
 
16
16
  <div class={["ui-empty", className].filter(Boolean).join(" ")} {...rest}>
17
17
  <b class="ui-empty__title">{title}</b>
18
- <span class="ui-empty__body"><slot /></span>
18
+ <span class="ui-empty__body">
19
+ <slot />
20
+ </span>
19
21
  {hasAction && (
20
22
  <div class="ui-empty__action">
21
23
  <slot name="action" />
@@ -24,29 +26,33 @@ const hasAction = Astro.slots.has("action");
24
26
  </div>
25
27
 
26
28
  <style>
27
- .ui-empty {
28
- display: flex;
29
- flex-direction: column;
30
- align-items: flex-start;
31
- gap: var(--space-2);
32
- padding: var(--space-8) var(--space-6);
33
- border: 1px dashed var(--border-strong);
34
- border-radius: var(--radius-lg);
35
- background: var(--surface);
36
- }
29
+ @layer reset, tokens, base, components, motion, utilities;
37
30
 
38
- .ui-empty__title {
39
- font-size: var(--text-lg);
40
- font-weight: var(--weight-semibold);
41
- color: var(--text);
42
- }
31
+ @layer components {
32
+ .ui-empty {
33
+ display: flex;
34
+ flex-direction: column;
35
+ align-items: flex-start;
36
+ gap: var(--space-2);
37
+ padding: var(--space-8) var(--space-6);
38
+ border: 1px dashed var(--border-strong);
39
+ border-radius: var(--radius-lg);
40
+ background: var(--surface);
41
+ }
43
42
 
44
- .ui-empty__body {
45
- font-size: var(--text-sm);
46
- line-height: var(--leading-sm);
47
- color: var(--text-muted);
48
- }
43
+ .ui-empty__title {
44
+ font-size: var(--text-lg);
45
+ font-weight: var(--weight-semibold);
46
+ color: var(--text);
47
+ }
49
48
 
50
- /* The flex `gap` above already spaces the action from the body; an added
51
- margin here doubled that gap and threw off the rhythm between the two. */
49
+ .ui-empty__body {
50
+ font-size: var(--text-sm);
51
+ line-height: var(--leading-sm);
52
+ color: var(--text-muted);
53
+ }
54
+
55
+ /* The flex `gap` above already spaces the action from the body; an added */
56
+ /* margin here doubled that gap and threw off the rhythm between the two. */
57
+ }
52
58
  </style>
@@ -25,34 +25,37 @@ const classes = ["ui-filtergroup", className].filter(Boolean).join(" ");
25
25
  </fieldset>
26
26
 
27
27
  <style>
28
- .ui-filtergroup {
29
- margin: 0;
30
- padding: var(--space-3) 0 0;
31
- border: 0;
32
- /* More space above the rule than below it, so the rule belongs to this
33
- group's top edge. */
34
- margin-top: var(--space-4);
35
- border-top: 1px solid var(--border);
36
- }
28
+ @layer reset, tokens, base, components, motion, utilities;
37
29
 
38
- .ui-filtergroup:first-of-type {
39
- margin-top: 0;
40
- border-top: 0;
41
- padding-top: 0;
42
- }
30
+ @layer components {
31
+ .ui-filtergroup {
32
+ margin: 0;
33
+ padding: var(--space-3) 0 0;
34
+ border: 0;
35
+ /* More space above the rule than below it, so the rule belongs to this group's top edge. */
36
+ margin-top: var(--space-4);
37
+ border-top: 1px solid var(--border);
38
+ }
43
39
 
44
- .ui-filtergroup__title {
45
- padding: 0;
46
- margin-bottom: var(--space-2);
47
- font-family: var(--font-sans);
48
- font-size: var(--text-sm);
49
- font-weight: var(--weight-semibold);
50
- color: var(--text);
51
- }
40
+ .ui-filtergroup:first-of-type {
41
+ margin-top: 0;
42
+ border-top: 0;
43
+ padding-top: 0;
44
+ }
45
+
46
+ .ui-filtergroup__title {
47
+ padding: 0;
48
+ margin-bottom: var(--space-2);
49
+ font-family: var(--font-sans);
50
+ font-size: var(--text-sm);
51
+ font-weight: var(--weight-semibold);
52
+ color: var(--text);
53
+ }
52
54
 
53
- .ui-filtergroup__options {
54
- display: flex;
55
- flex-direction: column;
56
- gap: var(--space-2);
55
+ .ui-filtergroup__options {
56
+ display: flex;
57
+ flex-direction: column;
58
+ gap: var(--space-2);
59
+ }
57
60
  }
58
61
  </style>
@@ -23,62 +23,72 @@ const classes = ["ui-filters", className].filter(Boolean).join(" ");
23
23
  <aside class={classes} {...rest}>
24
24
  <div class="ui-filterbar">
25
25
  <span class="ui-eyebrow">Filters</span>
26
- {clearLabel && <slot name="clear"><button class="ui-filters__clear" type="button">{clearLabel}</button></slot>}
26
+ {clearLabel && (
27
+ <slot name="clear">
28
+ <button class="ui-filters__clear" type="button">
29
+ {clearLabel}
30
+ </button>
31
+ </slot>
32
+ )}
27
33
  </div>
28
34
  <slot />
29
35
  </aside>
30
36
 
31
37
  <style>
32
- .ui-filters {
33
- width: 232px;
34
- display: flex;
35
- flex-direction: column;
36
- }
38
+ @layer reset, tokens, base, components, motion, utilities;
37
39
 
38
- .ui-filterbar {
39
- display: flex;
40
- align-items: center;
41
- justify-content: space-between;
42
- gap: var(--space-3);
43
- padding-bottom: var(--space-3);
44
- margin-bottom: var(--space-1);
45
- }
40
+ @layer components {
41
+ .ui-filters {
42
+ width: 232px;
43
+ display: flex;
44
+ flex-direction: column;
45
+ }
46
46
 
47
- .ui-eyebrow {
48
- font-family: var(--font-mono);
49
- font-size: var(--text-2xs);
50
- font-weight: var(--weight-semibold);
51
- letter-spacing: var(--tracking-widest);
52
- text-transform: uppercase;
53
- color: var(--text-muted);
54
- }
47
+ .ui-filterbar {
48
+ display: flex;
49
+ align-items: center;
50
+ justify-content: space-between;
51
+ gap: var(--space-3);
52
+ padding-bottom: var(--space-3);
53
+ margin-bottom: var(--space-1);
54
+ }
55
55
 
56
- /* A ghost-weight clear action. Kept local so the sidebar needs no button
57
- import; the consumer may slot in a Button ghost instead. */
58
- .ui-filters__clear {
59
- padding: var(--space-1-5) var(--space-2);
60
- background: transparent;
61
- border: 0;
62
- border-radius: var(--radius-sm);
63
- font-family: var(--font-sans);
64
- font-size: var(--text-xs);
65
- font-weight: var(--weight-semibold);
66
- color: var(--link);
67
- cursor: pointer;
68
- }
69
- .ui-filters__clear:hover {
70
- background: var(--surface-hover);
71
- color: var(--link-hover);
72
- }
73
- .ui-filters__clear:focus-visible {
74
- outline: 2px solid var(--focus);
75
- outline-offset: 2px;
76
- box-shadow: 0 0 0 4px var(--focus-outer);
77
- }
56
+ .ui-eyebrow {
57
+ font-family: var(--font-mono);
58
+ font-size: var(--text-2xs);
59
+ font-weight: var(--weight-semibold);
60
+ letter-spacing: var(--tracking-widest);
61
+ text-transform: uppercase;
62
+ color: var(--text-muted);
63
+ }
78
64
 
79
- @media (max-width: 700px) {
80
- .ui-filters {
81
- width: 100%;
65
+ /* A ghost-weight clear action. Kept local so the sidebar needs no button */
66
+ /* import; the consumer may slot in a Button ghost instead. */
67
+ .ui-filters__clear {
68
+ padding: var(--space-1-5) var(--space-2);
69
+ background: transparent;
70
+ border: 0;
71
+ border-radius: var(--radius-sm);
72
+ font-family: var(--font-sans);
73
+ font-size: var(--text-xs);
74
+ font-weight: var(--weight-semibold);
75
+ color: var(--link);
76
+ cursor: pointer;
77
+ }
78
+ .ui-filters__clear:hover {
79
+ background: var(--surface-hover);
80
+ color: var(--link-hover);
81
+ }
82
+ .ui-filters__clear:focus-visible {
83
+ outline: 2px solid var(--focus);
84
+ outline-offset: 2px;
85
+ box-shadow: 0 0 0 4px var(--focus-outer);
86
+ }
87
+
88
+ @media (max-width: 700px) {
89
+ .ui-filters {
90
+ width: 100%;
91
+ }
82
92
  }
83
93
  }
84
94
  </style>
@@ -33,205 +33,222 @@ const classes = ["ui-footer", `ui-footer--${variant}`, className]
33
33
 
34
34
  <footer class={classes} {...rest}>
35
35
  <div class="ui-footer__brandblock">
36
- <div class="ui-footer__brand">{brandName}<slot name="brand-suffix" /></div>
37
- <div class="ui-footer__addr"><slot name="address" /></div>
38
- <div class="ui-footer__social"><slot name="social" /></div>
36
+ <div class="ui-footer__brand">
37
+ {brandName}
38
+ <slot name="brand-suffix" />
39
+ </div>
40
+ <div class="ui-footer__addr">
41
+ <slot name="address" />
42
+ </div>
43
+ <div class="ui-footer__social">
44
+ <slot name="social" />
45
+ </div>
39
46
  </div>
40
47
 
41
48
  <slot />
42
49
 
43
50
  <div class="ui-footer__bar">
44
- <span class="ui-footer__legal"><slot name="legal" /></span>
45
- <span class="ui-footer__policies"><slot name="policies" /></span>
51
+ <span class="ui-footer__legal">
52
+ <slot name="legal" />
53
+ </span>
54
+ <span class="ui-footer__policies">
55
+ <slot name="policies" />
56
+ </span>
46
57
  </div>
47
58
  </footer>
48
59
 
49
60
  <style>
50
- .ui-footer {
51
- display: grid;
52
- grid-template-columns: 1.5fr 1fr 1.3fr;
53
- gap: var(--space-10);
54
- padding: var(--space-10);
55
- background: var(--surface-inverse);
56
- color: var(--surface-inverse-fg);
57
- }
58
-
59
- .ui-footer__brandblock {
60
- display: flex;
61
- flex-direction: column;
62
- gap: var(--space-3);
63
- }
64
-
65
- .ui-footer__brand {
66
- font-family: var(--font-sans);
67
- font-size: var(--text-xl);
68
- font-weight: var(--weight-bold);
69
- letter-spacing: var(--tracking-tight);
70
- color: var(--ivory-xlight);
71
- }
72
- .ui-footer__brand :global(span) {
73
- font-weight: var(--weight-regular);
74
- color: var(--surface-inverse-muted);
75
- }
76
-
77
- .ui-footer__addr {
78
- font-size: var(--text-sm);
79
- line-height: var(--leading-sm);
80
- color: var(--surface-inverse-fg);
81
- }
82
- .ui-footer__addr :global(a) {
83
- color: inherit;
84
- text-decoration: underline;
85
- text-underline-offset: 2px;
86
- }
61
+ @layer reset, tokens, base, components, motion, utilities;
62
+
63
+ @layer components {
64
+ .ui-footer {
65
+ display: grid;
66
+ grid-template-columns: 1.5fr 1fr 1.3fr;
67
+ gap: var(--space-10);
68
+ padding: var(--space-10);
69
+ background: var(--surface-inverse);
70
+ color: var(--surface-inverse-fg);
71
+ }
87
72
 
88
- .ui-footer__social {
89
- display: flex;
90
- gap: var(--space-1);
91
- margin-top: var(--space-1);
92
- }
73
+ .ui-footer__brandblock {
74
+ display: flex;
75
+ flex-direction: column;
76
+ gap: var(--space-3);
77
+ }
93
78
 
94
- /* The bottom bar spans all columns. */
95
- .ui-footer__bar {
96
- grid-column: 1 / -1;
97
- display: flex;
98
- align-items: center;
99
- justify-content: space-between;
100
- gap: var(--space-4);
101
- flex-wrap: wrap;
102
- margin-top: var(--space-4);
103
- padding-top: var(--space-5);
104
- border-top: 1px solid var(--surface-inverse-border);
105
- font-size: var(--text-xs);
106
- color: var(--surface-inverse-muted);
107
- }
79
+ .ui-footer__brand {
80
+ font-family: var(--font-sans);
81
+ font-size: var(--text-xl);
82
+ font-weight: var(--weight-bold);
83
+ letter-spacing: var(--tracking-tight);
84
+ color: var(--ivory-xlight);
85
+ }
86
+ .ui-footer__brand :global(span) {
87
+ font-weight: var(--weight-regular);
88
+ color: var(--surface-inverse-muted);
89
+ }
108
90
 
109
- .ui-footer__policies {
110
- display: flex;
111
- flex-wrap: wrap;
112
- gap: var(--space-4);
113
- }
114
- .ui-footer__bar :global(a) {
115
- color: var(--surface-inverse-fg);
116
- text-decoration: underline;
117
- text-underline-offset: 2px;
118
- }
119
- .ui-footer__bar :global(a:hover) {
120
- color: var(--ivory-xlight);
121
- }
122
- .ui-footer__bar :global(a:focus-visible) {
123
- outline: 2px solid var(--ivory-xlight);
124
- outline-offset: 2px;
125
- border-radius: var(--radius-sm);
126
- }
91
+ .ui-footer__addr {
92
+ font-size: var(--text-sm);
93
+ line-height: var(--leading-sm);
94
+ color: var(--surface-inverse-fg);
95
+ }
96
+ .ui-footer__addr :global(a) {
97
+ color: inherit;
98
+ text-decoration: underline;
99
+ text-underline-offset: 2px;
100
+ }
127
101
 
128
- /* Pin the stacked state in component explorers and constrained shells. */
129
- .ui-footer--mobile {
130
- grid-template-columns: 1fr;
131
- gap: var(--space-6);
132
- padding: var(--space-6);
133
- border-radius: 0 0 var(--radius-lg) var(--radius-lg);
134
- }
135
- .ui-footer--mobile .ui-footer__bar {
136
- flex-direction: column;
137
- align-items: flex-start;
138
- gap: var(--space-3);
139
- margin-top: var(--space-2);
140
- padding-top: var(--space-5);
141
- }
142
- .ui-footer--mobile .ui-footer__policies {
143
- row-gap: var(--space-3);
144
- }
102
+ .ui-footer__social {
103
+ display: flex;
104
+ gap: var(--space-1);
105
+ margin-top: var(--space-1);
106
+ }
145
107
 
146
- /* The club-site footer interleaves contact details and social links on
147
- compact screens, so its brand block participates in the outer layout. */
148
- .ui-footer--mobile.ui-footer--site {
149
- display: flex;
150
- flex-direction: column;
151
- }
152
- .ui-footer--mobile.ui-footer--site .ui-footer__brandblock {
153
- display: contents;
154
- }
155
- .ui-footer--mobile.ui-footer--site .ui-footer__brand {
156
- order: 1;
157
- font-size: var(--text-lg);
158
- font-weight: var(--weight-regular);
159
- color: var(--surface-inverse-muted);
160
- }
161
- .ui-footer--mobile.ui-footer--site .ui-footer__addr {
162
- order: 2;
163
- }
164
- .ui-footer--mobile.ui-footer--site :global(.ui-footer__contact) {
165
- order: 3;
166
- gap: var(--space-2);
167
- margin-top: calc(var(--space-6) * -1 + var(--space-2));
168
- }
169
- .ui-footer--mobile.ui-footer--site :global(.ui-footer__contact .ui-footer__title),
170
- .ui-footer--mobile.ui-footer--site :global(.ui-footer__desktop-only) {
171
- display: none;
172
- }
173
- .ui-footer--mobile.ui-footer--site .ui-footer__social {
174
- order: 4;
175
- gap: var(--space-3);
176
- margin-top: var(--space-1);
177
- }
178
- .ui-footer--mobile.ui-footer--site .ui-footer__social :global(.ui-social) {
179
- width: 48px;
180
- height: 48px;
181
- border: 1px solid var(--surface-inverse-border);
182
- border-radius: var(--radius-full);
183
- }
184
- .ui-footer--mobile.ui-footer--site :global(.ui-footer__newsletter) {
185
- order: 5;
186
- gap: var(--space-4);
187
- margin-top: var(--space-4);
188
- }
189
- .ui-footer--mobile.ui-footer--site .ui-footer__bar {
190
- order: 6;
191
- }
192
- .ui-footer--mobile.ui-footer--site :global(.ui-news) {
193
- flex-direction: column;
194
- max-width: none;
195
- gap: var(--space-3);
196
- }
197
- .ui-footer--mobile.ui-footer--site :global(.ui-news__btn) {
198
- background: var(--ivory-xlight);
199
- }
108
+ /* The bottom bar spans all columns. */
109
+ .ui-footer__bar {
110
+ grid-column: 1 / -1;
111
+ display: flex;
112
+ align-items: center;
113
+ justify-content: space-between;
114
+ gap: var(--space-4);
115
+ flex-wrap: wrap;
116
+ margin-top: var(--space-4);
117
+ padding-top: var(--space-5);
118
+ border-top: 1px solid var(--surface-inverse-border);
119
+ font-size: var(--text-xs);
120
+ color: var(--surface-inverse-muted);
121
+ }
200
122
 
201
- .ui-footer--mobile.ui-footer--shop {
202
- gap: var(--space-6);
203
- }
204
- .ui-footer--mobile.ui-footer--shop .ui-footer__brandblock {
205
- gap: var(--space-5);
206
- }
207
- .ui-footer--mobile.ui-footer--shop .ui-footer__brand {
208
- font-size: var(--text-md);
209
- }
210
- .ui-footer--mobile.ui-footer--shop .ui-footer__brand :global(span) {
211
- font-weight: inherit;
212
- color: inherit;
213
- }
214
- .ui-footer--mobile.ui-footer--shop :global(.ui-footer__shop-links) {
215
- gap: var(--space-4);
216
- }
217
- .ui-footer--mobile.ui-footer--shop :global(.ui-footer__shop-links .ui-footer__title) {
218
- display: none;
219
- }
220
- .ui-footer--mobile.ui-footer--shop .ui-footer__social:empty {
221
- display: none;
222
- }
123
+ .ui-footer__policies {
124
+ display: flex;
125
+ flex-wrap: wrap;
126
+ gap: var(--space-4);
127
+ }
128
+ .ui-footer__bar :global(a) {
129
+ color: var(--surface-inverse-fg);
130
+ text-decoration: underline;
131
+ text-underline-offset: 2px;
132
+ }
133
+ .ui-footer__bar :global(a:hover) {
134
+ color: var(--ivory-xlight);
135
+ }
136
+ .ui-footer__bar :global(a:focus-visible) {
137
+ outline: 2px solid var(--ivory-xlight);
138
+ outline-offset: 2px;
139
+ border-radius: var(--radius-sm);
140
+ }
223
141
 
224
- /* Stacks on mobile. */
225
- @media (max-width: 700px) {
226
- .ui-footer:not(.ui-footer--mobile) {
142
+ /* Pin the stacked state in component explorers and constrained shells. */
143
+ .ui-footer--mobile {
227
144
  grid-template-columns: 1fr;
228
- gap: var(--space-8);
229
- padding: var(--space-6) var(--space-4);
145
+ gap: var(--space-6);
146
+ padding: var(--space-6);
147
+ border-radius: 0 0 var(--radius-lg) var(--radius-lg);
230
148
  }
231
- .ui-footer:not(.ui-footer--mobile) .ui-footer__bar {
149
+ .ui-footer--mobile .ui-footer__bar {
232
150
  flex-direction: column;
233
151
  align-items: flex-start;
234
152
  gap: var(--space-3);
153
+ margin-top: var(--space-2);
154
+ padding-top: var(--space-5);
155
+ }
156
+ .ui-footer--mobile .ui-footer__policies {
157
+ row-gap: var(--space-3);
158
+ }
159
+
160
+ /* The club-site footer interleaves contact details and social links on */
161
+ /* compact screens, so its brand block participates in the outer layout. */
162
+ .ui-footer--mobile.ui-footer--site {
163
+ display: flex;
164
+ flex-direction: column;
165
+ }
166
+ .ui-footer--mobile.ui-footer--site .ui-footer__brandblock {
167
+ display: contents;
168
+ }
169
+ .ui-footer--mobile.ui-footer--site .ui-footer__brand {
170
+ order: 1;
171
+ font-size: var(--text-lg);
172
+ font-weight: var(--weight-regular);
173
+ color: var(--surface-inverse-muted);
174
+ }
175
+ .ui-footer--mobile.ui-footer--site .ui-footer__addr {
176
+ order: 2;
177
+ }
178
+ .ui-footer--mobile.ui-footer--site :global(.ui-footer__contact) {
179
+ order: 3;
180
+ gap: var(--space-2);
181
+ margin-top: calc(var(--space-6) * -1 + var(--space-2));
182
+ }
183
+ .ui-footer--mobile.ui-footer--site
184
+ :global(.ui-footer__contact .ui-footer__title),
185
+ .ui-footer--mobile.ui-footer--site :global(.ui-footer__desktop-only) {
186
+ display: none;
187
+ }
188
+ .ui-footer--mobile.ui-footer--site .ui-footer__social {
189
+ order: 4;
190
+ gap: var(--space-3);
191
+ margin-top: var(--space-1);
192
+ }
193
+ .ui-footer--mobile.ui-footer--site .ui-footer__social :global(.ui-social) {
194
+ width: 48px;
195
+ height: 48px;
196
+ border: 1px solid var(--surface-inverse-border);
197
+ border-radius: var(--radius-full);
198
+ }
199
+ .ui-footer--mobile.ui-footer--site :global(.ui-footer__newsletter) {
200
+ order: 5;
201
+ gap: var(--space-4);
202
+ margin-top: var(--space-4);
203
+ }
204
+ .ui-footer--mobile.ui-footer--site .ui-footer__bar {
205
+ order: 6;
206
+ }
207
+ .ui-footer--mobile.ui-footer--site :global(.ui-news) {
208
+ flex-direction: column;
209
+ max-width: none;
210
+ gap: var(--space-3);
211
+ }
212
+ .ui-footer--mobile.ui-footer--site :global(.ui-news__btn) {
213
+ background: var(--ivory-xlight);
214
+ }
215
+
216
+ .ui-footer--mobile.ui-footer--shop {
217
+ gap: var(--space-6);
218
+ }
219
+ .ui-footer--mobile.ui-footer--shop .ui-footer__brandblock {
220
+ gap: var(--space-5);
221
+ }
222
+ .ui-footer--mobile.ui-footer--shop .ui-footer__brand {
223
+ font-size: var(--text-md);
224
+ }
225
+ .ui-footer--mobile.ui-footer--shop .ui-footer__brand :global(span) {
226
+ font-weight: inherit;
227
+ color: inherit;
228
+ }
229
+ .ui-footer--mobile.ui-footer--shop :global(.ui-footer__shop-links) {
230
+ gap: var(--space-4);
231
+ }
232
+ .ui-footer--mobile.ui-footer--shop
233
+ :global(.ui-footer__shop-links .ui-footer__title) {
234
+ display: none;
235
+ }
236
+ .ui-footer--mobile.ui-footer--shop .ui-footer__social:empty {
237
+ display: none;
238
+ }
239
+
240
+ /* Stacks on mobile. */
241
+ @media (max-width: 700px) {
242
+ .ui-footer:not(.ui-footer--mobile) {
243
+ grid-template-columns: 1fr;
244
+ gap: var(--space-8);
245
+ padding: var(--space-6) var(--space-4);
246
+ }
247
+ .ui-footer:not(.ui-footer--mobile) .ui-footer__bar {
248
+ flex-direction: column;
249
+ align-items: flex-start;
250
+ gap: var(--space-3);
251
+ }
235
252
  }
236
253
  }
237
254
  </style>