Skip to content

Commit 0d4e7c7

Browse files
Hide decls in details for some --tw-* properties (#1397)
Fixes #1391 - [x] Needs tests
1 parent 0e16829 commit 0d4e7c7

File tree

3 files changed

+90
-16
lines changed

3 files changed

+90
-16
lines changed

packages/tailwindcss-language-server/tests/completions/completions.test.js

Lines changed: 49 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -983,7 +983,7 @@ defineTest({
983983
})
984984

985985
defineTest({
986-
name: 'Completions for outline and border utilities have simplified details',
986+
name: 'Completions for several utilities have simplified details',
987987
fs: {
988988
'app.css': css`
989989
@import 'tailwindcss';
@@ -993,24 +993,59 @@ defineTest({
993993
handle: async ({ client }) => {
994994
let document = await client.open({
995995
lang: 'html',
996-
text: html`<div class="border-0 outline-0"></div>`,
996+
text: html`<div class=""></div>`,
997997
})
998998

999-
// <div class="border-0 outline-0"></div>
1000-
// ^
1001-
let completionA = await document.completions({ line: 0, character: 20 })
999+
// <div class=""></div>
1000+
// ^
1001+
let list = await document.completions({ line: 0, character: 12 })
1002+
let items = list?.items ?? []
1003+
1004+
let map = {
1005+
'border-0': 'border-width: 0px;',
1006+
'outline-0': 'outline-width: 0px;',
1007+
'leading-0': 'line-height: 0rem /* 0px */;',
1008+
'duration-1000': 'transition-duration: 1000ms;',
1009+
'font-bold': 'font-weight: 700;',
1010+
'ease-linear': 'transition-timing-function: linear;',
1011+
'ease-initial': '--tw-ease: initial;',
1012+
1013+
'space-x-0':
1014+
'margin-inline-start: calc(0rem /* 0px */ * var(--tw-space-x-reverse)); margin-inline-end: calc(0rem /* 0px */ * calc(1 - var(--tw-space-x-reverse)));',
1015+
'space-y-0':
1016+
'margin-block-start: calc(0rem /* 0px */ * var(--tw-space-y-reverse)); margin-block-end: calc(0rem /* 0px */ * calc(1 - var(--tw-space-y-reverse)));',
1017+
'divide-x-0':
1018+
'border-inline-start-width: calc(0px * var(--tw-divide-x-reverse)); border-inline-end-width: calc(0px * calc(1 - var(--tw-divide-x-reverse)));',
1019+
'divide-y-0':
1020+
'border-top-width: calc(0px * var(--tw-divide-y-reverse)); border-bottom-width: calc(0px * calc(1 - var(--tw-divide-y-reverse)));',
1021+
1022+
'tracking-wide': 'letter-spacing: 0.025em;',
1023+
1024+
'from-red-500': '--tw-gradient-from: oklch(63.7% 0.237 25.331);',
1025+
'via-red-500': '--tw-gradient-via: oklch(63.7% 0.237 25.331);',
1026+
'to-red-500': '--tw-gradient-to: oklch(63.7% 0.237 25.331);',
1027+
1028+
'scale-100': '--tw-scale-x: 100%; --tw-scale-y: 100%; --tw-scale-z: 100%;',
1029+
'scale-z-100': '--tw-scale-z: 100%;',
1030+
1031+
'translate-1': '--tw-translate-x: 0.25rem /* 4px */; --tw-translate-y: 0.25rem /* 4px */;',
1032+
'translate-z-1': '--tw-translate-z: 0.25rem /* 4px */;',
1033+
1034+
'bg-conic-0':
1035+
'--tw-gradient-position: from 0deg in oklab; background-image: conic-gradient(var(--tw-gradient-stops));',
1036+
}
10021037

1003-
// <div class="border-0 outline-0"></div>
1004-
// ^
1005-
let completionB = await document.completions({ line: 0, character: 30 })
1038+
let requests = await Promise.all(
1039+
Object.keys(map).map(async (label) => {
1040+
let item = items.find((item) => item.label === label)
1041+
if (!item) throw new Error(`Item not found for label: ${label}`)
10061042

1007-
let border = completionA?.items.find((item) => item.label === 'border-0')
1008-
let outline = completionB?.items.find((item) => item.label === 'outline-0')
1043+
let resolved = await client.conn.sendRequest('completionItem/resolve', item)
10091044

1010-
let borderResolved = await client.conn.sendRequest('completionItem/resolve', border)
1011-
let outlineResolved = await client.conn.sendRequest('completionItem/resolve', outline)
1045+
return [label, resolved.detail]
1046+
}),
1047+
)
10121048

1013-
expect(borderResolved).toMatchObject({ detail: 'border-width: 0px;' })
1014-
expect(outlineResolved).toMatchObject({ detail: 'outline-width: 0px;' })
1049+
expect(Object.fromEntries(requests)).toEqual(map)
10151050
},
10161051
})

packages/tailwindcss-language-service/src/completionProvider.ts

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2304,15 +2304,53 @@ export async function resolveCompletionItem(
23042304
if (rule.name === 'supports' && rule.params === '(-moz-orient: inline)') {
23052305
rule.remove()
23062306
}
2307+
2308+
if (
2309+
rule.name === 'supports' &&
2310+
rule.params === '(background-image: linear-gradient(in lab, red, red))'
2311+
) {
2312+
rule.remove()
2313+
}
23072314
})
23082315

2316+
let ignoredValues = new Set([
2317+
'var(--tw-border-style)',
2318+
'var(--tw-outline-style)',
2319+
'var(--tw-translate-x) var(--tw-translate-y)',
2320+
'var(--tw-translate-x) var(--tw-translate-y) var(--tw-translate-z)',
2321+
'var(--tw-scale-x) var(--tw-scale-y)',
2322+
'var(--tw-scale-x) var(--tw-scale-y) var(--tw-scale-z)',
2323+
])
2324+
23092325
base.walkDecls((node) => {
2310-
if (node.value === 'var(--tw-border-style)') return
2311-
if (node.value === 'var(--tw-outline-style)') return
2326+
if (ignoredValues.has(node.value)) return
23122327

23132328
decls.push(node)
23142329
})
23152330

2331+
// TODO: Hardcoding this list is really unfortunate. We should be able
2332+
// to handle this in Tailwind CSS itself.
2333+
function isOtherDecl(node: postcss.Declaration) {
2334+
if (node.prop === '--tw-leading') return false
2335+
if (node.prop === '--tw-duration') return false
2336+
if (node.prop === '--tw-ease') return false
2337+
if (node.prop === '--tw-font-weight') return false
2338+
if (node.prop === '--tw-gradient-via-stops') return false
2339+
if (node.prop === '--tw-gradient-stops') return false
2340+
if (node.prop === '--tw-tracking') return false
2341+
if (node.prop === '--tw-space-x-reverse' && node.value === '0') return false
2342+
if (node.prop === '--tw-space-y-reverse' && node.value === '0') return false
2343+
if (node.prop === '--tw-divide-x-reverse' && node.value === '0') return false
2344+
if (node.prop === '--tw-divide-y-reverse' && node.value === '0') return false
2345+
2346+
return true
2347+
}
2348+
2349+
// We want to remove these decls from details *as long as they're not the only one*
2350+
if (decls.some(isOtherDecl)) {
2351+
decls = decls.filter(isOtherDecl)
2352+
}
2353+
23162354
item.detail = await jit.stringifyDecls(state, postcss.rule({ selectors: [], nodes: decls }))
23172355
} else {
23182356
item.detail = `${rules.length} rules`

packages/vscode-tailwindcss/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
- Bump bundled CSS language service ([#1395](https://github.com/tailwindlabs/tailwindcss-intellisense/pull/1395))
66
- Fix infinite loop when resolving completion details with recursive theme keys ([#1400](https://github.com/tailwindlabs/tailwindcss-intellisense/pull/1400))
7+
- Simplify completion details for more utilities ([#1397](https://github.com/tailwindlabs/tailwindcss-intellisense/pull/1397))
78

89
## 0.14.20
910

0 commit comments

Comments
 (0)