Skip to content

Commit 2c1a520

Browse files
author
Brad Cornes
committed
add @tailwind completions
1 parent 6f5a942 commit 2c1a520

File tree

1 file changed

+74
-1
lines changed

1 file changed

+74
-1
lines changed

packages/tailwindcss-language-server/src/providers/completionProvider.ts

Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,78 @@ function provideCssHelperCompletions(
306306
}
307307
}
308308

309+
// TODO: vary items based on Tailwind version
310+
function provideTailwindDirectiveCompletions(
311+
state: State,
312+
{ position, textDocument }: CompletionParams
313+
): CompletionList {
314+
let doc = state.editor.documents.get(textDocument.uri)
315+
316+
if (!isCssContext(doc, position)) {
317+
return null
318+
}
319+
320+
let text = doc.getText({
321+
start: { line: position.line, character: 0 },
322+
end: position,
323+
})
324+
325+
const match = text.match(/^\s*@tailwind\s+(?<partial>[^\s]*)$/i)
326+
327+
if (match === null) return null
328+
329+
return {
330+
isIncomplete: false,
331+
items: [
332+
{
333+
label: 'base',
334+
documentation: {
335+
kind: MarkupKind.Markdown,
336+
value:
337+
'This injects Tailwind’s base styles and any base styles registered by plugins.\n\n[Tailwind CSS Documentation](https://tailwindcss.com/docs/functions-and-directives/#tailwind)',
338+
},
339+
},
340+
{
341+
label: 'components',
342+
documentation: {
343+
kind: MarkupKind.Markdown,
344+
value:
345+
'This injects Tailwind’s component classes and any component classes registered by plugins.\n\n[Tailwind CSS Documentation](https://tailwindcss.com/docs/functions-and-directives/#tailwind)',
346+
},
347+
},
348+
{
349+
label: 'utilities',
350+
documentation: {
351+
kind: MarkupKind.Markdown,
352+
value:
353+
'This injects Tailwind’s utility classes and any utility classes registered by plugins.\n\n[Tailwind CSS Documentation](https://tailwindcss.com/docs/functions-and-directives/#tailwind)',
354+
},
355+
},
356+
{
357+
label: 'screens',
358+
documentation: {
359+
kind: MarkupKind.Markdown,
360+
value:
361+
'Use this directive to control where Tailwind injects the responsive variations of each utility.\n\nIf omitted, Tailwind will append these classes to the very end of your stylesheet by default.\n\n[Tailwind CSS Documentation](https://tailwindcss.com/docs/functions-and-directives/#tailwind)',
362+
},
363+
},
364+
].map((item) => ({
365+
...item,
366+
kind: CompletionItemKind.Constant,
367+
textEdit: {
368+
newText: item.label,
369+
range: {
370+
start: {
371+
line: position.line,
372+
character: position.character - match.groups.partial.length,
373+
},
374+
end: position,
375+
},
376+
},
377+
})),
378+
}
379+
}
380+
309381
function provideVariantsDirectiveCompletions(
310382
state: State,
311383
{ position, textDocument }: CompletionParams
@@ -561,7 +633,8 @@ export async function provideCompletions(
561633
provideCssHelperCompletions(state, params) ||
562634
provideCssDirectiveCompletions(state, params) ||
563635
provideScreenDirectiveCompletions(state, params) ||
564-
provideVariantsDirectiveCompletions(state, params)
636+
provideVariantsDirectiveCompletions(state, params) ||
637+
provideTailwindDirectiveCompletions(state, params)
565638

566639
if (result) return result
567640

0 commit comments

Comments
 (0)