Skip to content

Commit 7ca682c

Browse files
committed
fix: postcss apply directive
1 parent a0b119d commit 7ca682c

File tree

5 files changed

+45
-20
lines changed

5 files changed

+45
-20
lines changed

.stylelintrc.mjs

+1
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,6 @@ export default {
1414
],
1515
'alpha-value-notation': 'number',
1616
'font-family-name-quotes': 'always-unless-keyword',
17+
'at-rule-no-unknown': [true, { ignoreAtRules: ['apply'] }], // Allow @apply directive to inline existing utility classes into a class name
1718
},
1819
};

.vscode/css-data.json

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"version": 1.1,
3+
"atDirectives": [
4+
{ "name": "@apply", "description": "Allow @apply directive to inline existing utility classes into a class name" }
5+
]
6+
}

.vscode/settings.json

+1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
"source.organizeImports.biome": "explicit"
88
},
99
"editor.defaultFormatter": "biomejs.biome",
10+
"css.customData": ["./.vscode/css-data.json"],
1011
"[css]": {
1112
"editor.defaultFormatter": "esbenp.prettier-vscode"
1213
},

packages/css/button.css

+18-20
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
--dsc-button-padding-inline: var(--ds-spacing-4);
1010
--dsc-button-size: var(--ds-sizing-12);
1111

12+
/* @apply ds-focus; */
13+
1214
align-items: center;
1315
background: var(--dsc-button-background);
1416
border-radius: var(--ds-border-radius-md);
@@ -27,14 +29,14 @@
2729
text-align: inherit;
2830
text-decoration: none;
2931

30-
&[data-size="sm"] {
32+
&[data-size='sm'] {
3133
--dsc-button-gap: var(--ds-sizing-1);
3234
--dsc-button-padding-block: var(--ds-spacing-2);
3335
--dsc-button-padding-inline: var(--ds-spacing-3);
3436
--dsc-button-size: var(--ds-sizing-10);
3537
}
3638

37-
&[data-size="lg"] {
39+
&[data-size='lg'] {
3840
--dsc-button-padding-block: var(--ds-spacing-3);
3941
--dsc-button-padding-inline: var(--ds-spacing-5);
4042
--dsc-button-size: var(--ds-sizing-14);
@@ -52,7 +54,7 @@
5254
/**
5355
* Variants
5456
*/
55-
&[data-variant="secondary"] {
57+
&[data-variant='secondary'] {
5658
--dsc-button-background--active: var(--ds-color-accent-surface-hover);
5759
--dsc-button-background--hover: var(--ds-color-accent-surface-default);
5860
--dsc-button-background: transparent;
@@ -62,7 +64,7 @@
6264
--dsc-button-color: var(--ds-color-accent-text-subtle);
6365
}
6466

65-
&[data-variant="tertiary"] {
67+
&[data-variant='tertiary'] {
6668
--dsc-button-background--active: var(--ds-color-accent-surface-hover);
6769
--dsc-button-background--hover: var(--ds-color-accent-surface-default);
6870
--dsc-button-background: transparent;
@@ -75,14 +77,14 @@
7577
/**
7678
* Colors
7779
*/
78-
&[data-color="neutral"] {
80+
&[data-color='neutral'] {
7981
--dsc-button-background--active: var(--ds-color-neutral-base-active);
8082
--dsc-button-background--hover: var(--ds-color-neutral-base-hover);
8183
--dsc-button-background: var(--ds-color-neutral-base-default);
8284
--dsc-button-color: var(--ds-color-neutral-contrast-default);
8385
}
8486

85-
&[data-color="neutral"][data-variant="secondary"] {
87+
&[data-color='neutral'][data-variant='secondary'] {
8688
--dsc-button-background--active: var(--ds-color-neutral-surface-hover);
8789
--dsc-button-background--hover: var(--ds-color-neutral-surface-default);
8890
--dsc-button-background: transparent;
@@ -92,7 +94,7 @@
9294
--dsc-button-color: var(--ds-color-neutral-text-subtle);
9395
}
9496

95-
&[data-color="neutral"][data-variant="tertiary"] {
97+
&[data-color='neutral'][data-variant='tertiary'] {
9698
--dsc-button-background--active: var(--ds-color-neutral-surface-hover);
9799
--dsc-button-background--hover: var(--ds-color-neutral-surface-default);
98100
--dsc-button-background: transparent;
@@ -101,14 +103,14 @@
101103
--dsc-button-color: var(--ds-color-neutral-text-subtle);
102104
}
103105

104-
&[data-color="danger"] {
106+
&[data-color='danger'] {
105107
--dsc-button-background--active: var(--ds-color-danger-base-active);
106108
--dsc-button-background--hover: var(--ds-color-danger-base-hover);
107109
--dsc-button-background: var(--ds-color-danger-base-default);
108110
--dsc-button-color: var(--ds-color-danger-contrast-default);
109111
}
110112

111-
&[data-color="danger"][data-variant="secondary"] {
113+
&[data-color='danger'][data-variant='secondary'] {
112114
--dsc-button-background--active: var(--ds-color-danger-surface-hover);
113115
--dsc-button-background--hover: var(--ds-color-danger-surface-default);
114116
--dsc-button-background: transparent;
@@ -118,7 +120,7 @@
118120
--dsc-button-color: var(--ds-color-danger-text-subtle);
119121
}
120122

121-
&[data-color="danger"][data-variant="tertiary"] {
123+
&[data-color='danger'][data-variant='tertiary'] {
122124
--dsc-button-background--active: var(--ds-color-danger-surface-hover);
123125
--dsc-button-background--hover: var(--ds-color-danger-surface-default);
124126
--dsc-button-background: transparent;
@@ -131,27 +133,23 @@
131133
* States
132134
*/
133135

134-
@media (hover: hover) and (pointer: fine) { /* Only use hover for non-touch devices to prevent sticky-hovering */
135-
&:not(:disabled, [aria-disabled="true"], [aria-busy="true"]):hover {
136+
@media (hover: hover) and (pointer: fine) {
137+
/* Only use hover for non-touch devices to prevent sticky-hovering */
138+
&:not(:disabled, [aria-disabled='true'], [aria-busy='true']):hover {
136139
background: var(--dsc-button-background--hover);
137140
}
138141
}
139142

140-
&[aria-busy="true"] {
143+
&[aria-busy='true'] {
141144
cursor: progress;
142145
}
143146

144-
&:focus-visible {
145-
box-shadow: var(--dsc-focus-boxShadow);
146-
}
147-
148-
&:is(:disabled, [aria-disabled="true"]) {
147+
&:is(:disabled, [aria-disabled='true']) {
149148
cursor: not-allowed;
150149
opacity: var(--ds-disabled-opacity);
151150
}
152151

153-
&:not(:disabled, [aria-disabled="true"], [aria-busy="true"]):active {
152+
&:not(:disabled, [aria-disabled='true'], [aria-busy='true']):active {
154153
background-color: var(--dsc-button-background--active);
155154
}
156155
}
157-

packages/css/postcss.config.js

+19
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,29 @@
11
module.exports = {
22
plugins: [
33
require('postcss-import'),
4+
postcssApply(),
45
require('postcss-nesting'),
56
require('cssnano')({
67
preset: 'default',
78
}),
89
require('autoprefixer'),
910
],
1011
};
12+
13+
function postcssApply() {
14+
return {
15+
postcssPlugin: '@apply', // Add support for @apply directive to enable inlining utility classes
16+
AtRule: {
17+
apply: (rule) => {
18+
rule.root().walkRules((from) => {
19+
if (from.selector.startsWith(`.${rule.params}`))
20+
rule.replaceWith(
21+
from.clone({
22+
selector: from.selector.replace(`.${rule.params}`, '&'),
23+
}),
24+
);
25+
});
26+
},
27+
},
28+
};
29+
}

0 commit comments

Comments
 (0)