Skip to content

Commit 01f37e2

Browse files
author
Brad Cornes
committed
add @screen completion item detail
1 parent 2cd6b79 commit 01f37e2

File tree

2 files changed

+49
-5
lines changed

2 files changed

+49
-5
lines changed

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

+14-5
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { isHtmlContext } from '../util/html'
1414
import { isCssContext } from '../util/css'
1515
import { findLast, findJsxStrings, arrFindLast } from '../util/find'
1616
import { stringifyConfigValue, stringifyCss } from '../util/stringify'
17+
import { stringifyScreen, Screen } from '../util/screens'
1718
import isObject from '../util/isObject'
1819
import * as emmetHelper from 'emmet-helper'
1920
import { isValidLocationForEmmetAbbreviation } from '../util/isValidLocationForEmmetAbbreviation'
@@ -380,6 +381,7 @@ function provideScreenDirectiveCompletions(
380381
items: Object.keys(screens).map((screen) => ({
381382
label: screen,
382383
kind: CompletionItemKind.Constant,
384+
data: 'screen',
383385
textEdit: {
384386
newText: screen,
385387
range: {
@@ -564,11 +566,18 @@ export function resolveCompletionItem(
564566
state: State,
565567
item: CompletionItem
566568
): CompletionItem {
567-
if (
568-
item.data === 'helper' ||
569-
item.data === 'directive' ||
570-
item.data === 'variant'
571-
) {
569+
if (['helper', 'directive', 'variant'].includes(item.data)) {
570+
return item
571+
}
572+
573+
if (item.data === 'screen') {
574+
let screens = dlv(
575+
state.config,
576+
['theme', 'screens'],
577+
dlv(state.config, ['screens'], {})
578+
)
579+
if (!isObject(screens)) screens = {}
580+
item.detail = stringifyScreen(screens[item.label] as Screen)
572581
return item
573582
}
574583

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import isObject from './isObject'
2+
3+
export type MinMaxScreen = {
4+
min?: string
5+
max?: string
6+
}
7+
8+
export type RawScreen = {
9+
raw: string
10+
}
11+
12+
export type Screen = string | RawScreen | MinMaxScreen | MinMaxScreen[]
13+
14+
function isRawScreen(screen: unknown): screen is RawScreen {
15+
return isObject(screen) && (screen as RawScreen).raw !== undefined
16+
}
17+
18+
export function stringifyScreen(screen: Screen): string {
19+
if (!screen) return
20+
if (typeof screen === 'string') return `@media (min-width: ${screen})`
21+
if (isRawScreen(screen)) {
22+
return `@media ${(screen as RawScreen).raw}`
23+
}
24+
let str = (Array.isArray(screen) ? screen : [screen])
25+
.map((range) => {
26+
return [
27+
typeof range.min === 'string' ? `(min-width: ${range.min})` : null,
28+
typeof range.max === 'string' ? `(max-width: ${range.max})` : null,
29+
]
30+
.filter(Boolean)
31+
.join(' and ')
32+
})
33+
.join(', ')
34+
return str ? `@media ${str}` : undefined
35+
}

0 commit comments

Comments
 (0)