tailwind-typescript-plugin 1.4.1-beta.1 → 1.4.1-beta.11

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 (69) hide show
  1. package/CHANGELOG.md +73 -0
  2. package/README.md +206 -34
  3. package/lib/core/interfaces.d.ts +2 -2
  4. package/lib/core/interfaces.d.ts.map +1 -1
  5. package/lib/core/types.d.ts +19 -1
  6. package/lib/core/types.d.ts.map +1 -1
  7. package/lib/extractors/BaseExtractor.d.ts +49 -2
  8. package/lib/extractors/BaseExtractor.d.ts.map +1 -1
  9. package/lib/extractors/BaseExtractor.js +184 -5
  10. package/lib/extractors/BaseExtractor.js.map +1 -1
  11. package/lib/extractors/CvaExtractor.js +1 -1
  12. package/lib/extractors/CvaExtractor.js.map +1 -1
  13. package/lib/extractors/ExpressionExtractor.d.ts.map +1 -1
  14. package/lib/extractors/ExpressionExtractor.js +35 -5
  15. package/lib/extractors/ExpressionExtractor.js.map +1 -1
  16. package/lib/extractors/JsxAttributeExtractor.js +1 -1
  17. package/lib/extractors/JsxAttributeExtractor.js.map +1 -1
  18. package/lib/extractors/TailwindVariantsExtractor.d.ts.map +1 -1
  19. package/lib/extractors/TailwindVariantsExtractor.js +1 -5
  20. package/lib/extractors/TailwindVariantsExtractor.js.map +1 -1
  21. package/lib/extractors/VariableReferenceExtractor.d.ts.map +1 -1
  22. package/lib/extractors/VariableReferenceExtractor.js +21 -0
  23. package/lib/extractors/VariableReferenceExtractor.js.map +1 -1
  24. package/lib/infrastructure/TailwindConflictDetector.d.ts +28 -18
  25. package/lib/infrastructure/TailwindConflictDetector.d.ts.map +1 -1
  26. package/lib/infrastructure/TailwindConflictDetector.js +216 -486
  27. package/lib/infrastructure/TailwindConflictDetector.js.map +1 -1
  28. package/lib/infrastructure/TailwindValidator.d.ts +15 -0
  29. package/lib/infrastructure/TailwindValidator.d.ts.map +1 -1
  30. package/lib/infrastructure/TailwindValidator.js +84 -5
  31. package/lib/infrastructure/TailwindValidator.js.map +1 -1
  32. package/lib/infrastructure/TailwindValidator.spec.js +194 -0
  33. package/lib/infrastructure/TailwindValidator.spec.js.map +1 -1
  34. package/lib/plugin/TailwindTypescriptPlugin.d.ts +26 -0
  35. package/lib/plugin/TailwindTypescriptPlugin.d.ts.map +1 -1
  36. package/lib/plugin/TailwindTypescriptPlugin.js +185 -1
  37. package/lib/plugin/TailwindTypescriptPlugin.js.map +1 -1
  38. package/lib/services/ClassNameExtractionService.d.ts +2 -2
  39. package/lib/services/ClassNameExtractionService.d.ts.map +1 -1
  40. package/lib/services/ClassNameExtractionService.js.map +1 -1
  41. package/lib/services/CompletionService.d.ts +113 -0
  42. package/lib/services/CompletionService.d.ts.map +1 -0
  43. package/lib/services/CompletionService.js +488 -0
  44. package/lib/services/CompletionService.js.map +1 -0
  45. package/lib/services/CompletionService.spec.d.ts +2 -0
  46. package/lib/services/CompletionService.spec.d.ts.map +1 -0
  47. package/lib/services/CompletionService.spec.js +1039 -0
  48. package/lib/services/CompletionService.spec.js.map +1 -0
  49. package/lib/services/ConflictClassDetection.spec.js +24 -19
  50. package/lib/services/ConflictClassDetection.spec.js.map +1 -1
  51. package/lib/services/DuplicateClassDetection.spec.js +41 -60
  52. package/lib/services/DuplicateClassDetection.spec.js.map +1 -1
  53. package/lib/services/PluginConfigService.d.ts +2 -1
  54. package/lib/services/PluginConfigService.d.ts.map +1 -1
  55. package/lib/services/PluginConfigService.js +19 -12
  56. package/lib/services/PluginConfigService.js.map +1 -1
  57. package/lib/services/ValidationService.d.ts +4 -2
  58. package/lib/services/ValidationService.d.ts.map +1 -1
  59. package/lib/services/ValidationService.js +10 -7
  60. package/lib/services/ValidationService.js.map +1 -1
  61. package/package.json +4 -2
  62. package/lib/extractors/StringLiteralExtractor.d.ts +0 -12
  63. package/lib/extractors/StringLiteralExtractor.d.ts.map +0 -1
  64. package/lib/extractors/StringLiteralExtractor.js +0 -21
  65. package/lib/extractors/StringLiteralExtractor.js.map +0 -1
  66. package/lib/services/ClassNameExtractionService.original.d.ts +0 -20
  67. package/lib/services/ClassNameExtractionService.original.d.ts.map +0 -1
  68. package/lib/services/ClassNameExtractionService.original.js +0 -48
  69. package/lib/services/ClassNameExtractionService.original.js.map +0 -1
@@ -0,0 +1,488 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CompletionService = void 0;
4
+ /**
5
+ * Service that provides autocompletion for Tailwind CSS class names
6
+ *
7
+ * Provides completions when:
8
+ * - Cursor is inside a className attribute's string literal
9
+ * - Cursor is inside a utility function argument (clsx, cn, classnames, etc.)
10
+ * - Cursor is inside tv() or cva() class strings
11
+ *
12
+ * Features:
13
+ * - Filters completions based on what's already typed
14
+ * - Excludes classes already present in the same className
15
+ * - Handles space-separated class lists properly
16
+ */
17
+ class CompletionService {
18
+ constructor(validator, logger, config) {
19
+ this.validator = validator;
20
+ this.logger = logger;
21
+ this.config = config;
22
+ /** Cached sorted class list for faster completion generation */
23
+ this.cachedClassList = null;
24
+ // Build a set of utility function names for quick lookup
25
+ this.utilityFunctionNames = new Set(config.utilityFunctions.map(f => (typeof f === 'string' ? f : f.name)));
26
+ // Add variant functions based on config
27
+ if (config.tailwindVariantsEnabled) {
28
+ this.utilityFunctionNames.add('tv');
29
+ }
30
+ if (config.classVarianceAuthorityEnabled) {
31
+ this.utilityFunctionNames.add('cva');
32
+ }
33
+ this.logger.log(`[CompletionService] Initialized with utility functions: ${Array.from(this.utilityFunctionNames).join(', ')}`);
34
+ }
35
+ /**
36
+ * Get completions at the given position
37
+ */
38
+ getCompletionsAtPosition(typescript, sourceFile, position, existingCompletions) {
39
+ const context = this.getCompletionContext(typescript, sourceFile, position);
40
+ if (!context.isInClassNameContext) {
41
+ this.logger.log('[CompletionService] Not in className context, returning original completions');
42
+ return existingCompletions;
43
+ }
44
+ this.logger.log(`[CompletionService] In className context, prefix="${context.currentPrefix}", existingClasses=${context.existingClasses.size}`);
45
+ const tailwindCompletions = this.generateCompletions(typescript, context);
46
+ if (tailwindCompletions.length === 0) {
47
+ return existingCompletions;
48
+ }
49
+ // Create completion info with Tailwind classes
50
+ const completionInfo = {
51
+ isGlobalCompletion: false,
52
+ isMemberCompletion: false,
53
+ isNewIdentifierLocation: false,
54
+ entries: tailwindCompletions
55
+ };
56
+ return completionInfo;
57
+ }
58
+ /**
59
+ * Get completion entry details for a specific completion item
60
+ * Formats the documentation with markdown CSS code blocks for syntax highlighting
61
+ */
62
+ getCompletionEntryDetails(typescript, sourceFile, position, entryName) {
63
+ // Check if this is a Tailwind class completion
64
+ if (!this.isTailwindClass(entryName)) {
65
+ return undefined;
66
+ }
67
+ // Get the CSS for this class
68
+ const cssResults = this.validator.getCssForClasses([entryName]);
69
+ const css = cssResults[0];
70
+ const documentation = [];
71
+ if (css) {
72
+ // Format the CSS with proper structure like Tailwind IntelliSense
73
+ const formattedCss = this.formatCssForDisplay(css);
74
+ // Use markdown code block for syntax highlighting
75
+ documentation.push({
76
+ kind: 'text',
77
+ text: '```css\n' + formattedCss + '\n```'
78
+ });
79
+ }
80
+ // Extract just the declarations for the detail (short summary)
81
+ const detail = css ? this.extractCssDeclarations(css) : undefined;
82
+ // Check if this is a color class for the icon
83
+ const isColor = this.isColorClass(entryName);
84
+ return {
85
+ name: entryName,
86
+ kind: typescript.ScriptElementKind.string,
87
+ // Set 'color' kindModifier for color classes so VS Code shows color icon
88
+ kindModifiers: isColor ? 'color' : '',
89
+ displayParts: detail ? [{ kind: 'text', text: detail }] : [{ kind: 'text', text: entryName }],
90
+ documentation
91
+ };
92
+ }
93
+ /**
94
+ * Format CSS output for display in the completion documentation
95
+ * Transforms the raw Tailwind CSS output into a nicely formatted rule block
96
+ */
97
+ formatCssForDisplay(css) {
98
+ // The CSS from Tailwind typically looks like:
99
+ // .flex { display: flex; }
100
+ // We want to format it nicely with proper indentation
101
+ // First, let's clean up and format the CSS
102
+ const formatted = css.trim();
103
+ // If it's already well-formatted, return as-is
104
+ if (formatted.includes('\n')) {
105
+ return formatted;
106
+ }
107
+ // Single-line CSS: format it nicely
108
+ // Match pattern: .selector { declarations }
109
+ const singleLineMatch = formatted.match(/^([^{]+)\{([^}]+)\}$/);
110
+ if (singleLineMatch) {
111
+ const selector = singleLineMatch[1].trim();
112
+ const declarations = singleLineMatch[2].trim();
113
+ // Split declarations and format each on its own line
114
+ const declParts = declarations
115
+ .split(';')
116
+ .map(d => d.trim())
117
+ .filter(d => d.length > 0);
118
+ if (declParts.length === 1) {
119
+ // Single declaration: keep on one line
120
+ return `${selector} {\n ${declParts[0]};\n}`;
121
+ }
122
+ else {
123
+ // Multiple declarations: each on its own line
124
+ const formattedDecls = declParts.map(d => ` ${d};`).join('\n');
125
+ return `${selector} {\n${formattedDecls}\n}`;
126
+ }
127
+ }
128
+ return formatted;
129
+ }
130
+ /**
131
+ * Extract just the CSS declarations from a CSS rule for the detail summary
132
+ * e.g., ".flex { display: flex; }" -> "display: flex;"
133
+ */
134
+ extractCssDeclarations(css) {
135
+ // Match the content inside the curly braces
136
+ const match = css.match(/\{([^}]+)\}/);
137
+ if (match) {
138
+ // Clean up the declarations
139
+ return (match[1]
140
+ .trim()
141
+ .split(';')
142
+ .map(d => d.trim())
143
+ .filter(d => d.length > 0)
144
+ .join('; ') + ';');
145
+ }
146
+ return css.trim();
147
+ }
148
+ /**
149
+ * Check if a name is a valid Tailwind class
150
+ */
151
+ isTailwindClass(name) {
152
+ return this.validator.isValidClass(name);
153
+ }
154
+ /**
155
+ * Analyze the source file at the given position to determine completion context
156
+ */
157
+ getCompletionContext(typescript, sourceFile, position) {
158
+ const defaultContext = {
159
+ isInClassNameContext: false,
160
+ currentPrefix: '',
161
+ prefixStart: position,
162
+ stringStart: position,
163
+ existingClasses: new Set()
164
+ };
165
+ // Find the node at the current position
166
+ let node = this.findNodeAtPosition(typescript, sourceFile, position);
167
+ if (!node) {
168
+ this.logger.log(`[CompletionService] No node found at position ${position}`);
169
+ return defaultContext;
170
+ }
171
+ this.logger.log(`[CompletionService] Found node kind: ${typescript.SyntaxKind[node.kind]} at position ${position}`);
172
+ // If we found a JsxAttribute, look for its string literal initializer
173
+ if (typescript.isJsxAttribute(node)) {
174
+ const initializer = node.initializer;
175
+ if (initializer && typescript.isStringLiteral(initializer)) {
176
+ node = initializer;
177
+ this.logger.log(`[CompletionService] Found string literal in JsxAttribute initializer`);
178
+ }
179
+ }
180
+ // Check if we're in a string literal
181
+ if (!typescript.isStringLiteral(node) && !typescript.isNoSubstitutionTemplateLiteral(node)) {
182
+ this.logger.log(`[CompletionService] Node is not a string literal: ${typescript.SyntaxKind[node.kind]}`);
183
+ return defaultContext;
184
+ }
185
+ // Check if this string is in a className context
186
+ if (!this.isClassNameContext(typescript, node)) {
187
+ this.logger.log(`[CompletionService] Node is not in className context`);
188
+ return defaultContext;
189
+ }
190
+ // We're in a className context! Now extract the completion details
191
+ const stringContent = node.text;
192
+ const stringStart = node.getStart(sourceFile) + 1; // +1 to skip the opening quote
193
+ const positionInString = position - stringStart;
194
+ // Handle cursor at or before string start
195
+ if (positionInString < 0) {
196
+ return defaultContext;
197
+ }
198
+ // Find the current "word" being typed (from last space to cursor)
199
+ const textBeforeCursor = stringContent.substring(0, positionInString);
200
+ const lastSpaceIndex = textBeforeCursor.lastIndexOf(' ');
201
+ const currentPrefix = lastSpaceIndex === -1 ? textBeforeCursor : textBeforeCursor.substring(lastSpaceIndex + 1);
202
+ const prefixStart = stringStart + (lastSpaceIndex === -1 ? 0 : lastSpaceIndex + 1);
203
+ // Get all existing classes in this attribute (for duplicate filtering)
204
+ const existingClasses = new Set(stringContent.split(/\s+/).filter(c => c.length > 0));
205
+ // Remove the current prefix from existing classes if it's a partial match
206
+ // (so we can still suggest completions for partially typed classes)
207
+ if (currentPrefix) {
208
+ existingClasses.delete(currentPrefix);
209
+ }
210
+ return {
211
+ isInClassNameContext: true,
212
+ currentPrefix,
213
+ prefixStart,
214
+ stringStart,
215
+ existingClasses
216
+ };
217
+ }
218
+ /**
219
+ * Find the deepest node at the given position
220
+ * Uses TypeScript's built-in method which handles edge cases better
221
+ */
222
+ findNodeAtPosition(typescript, sourceFile, position) {
223
+ function find(node) {
224
+ // Use getStart without sourceFile to include trivia, which helps with edge positions
225
+ const start = node.getStart(sourceFile);
226
+ const end = node.getEnd();
227
+ // Position must be within the node's range (inclusive of end for completions)
228
+ if (position < start || position > end) {
229
+ return undefined;
230
+ }
231
+ // Check children first to find the deepest matching node
232
+ let result;
233
+ typescript.forEachChild(node, child => {
234
+ const found = find(child);
235
+ if (found) {
236
+ result = found;
237
+ }
238
+ });
239
+ return result || node;
240
+ }
241
+ return find(sourceFile);
242
+ }
243
+ /**
244
+ * Check if a string literal node is in a className-like context
245
+ */
246
+ isClassNameContext(typescript, node) {
247
+ const parent = node.parent;
248
+ // Case 1: JSX attribute like className="..."
249
+ if (typescript.isJsxAttribute(parent)) {
250
+ const attrName = parent.name.getText();
251
+ return this.isClassNameAttribute(attrName);
252
+ }
253
+ // Case 2: Property assignment like { className: "..." }
254
+ // But only return true here - we need to fall through for properties inside tv()/cva() like base/variants
255
+ if (typescript.isPropertyAssignment(parent)) {
256
+ const propName = parent.name.getText();
257
+ if (this.isClassNameAttribute(propName)) {
258
+ return true;
259
+ }
260
+ // Fall through to check if this property is inside a utility function call
261
+ }
262
+ // Case 3: Inside a call expression (utility function like clsx, cn, etc.)
263
+ // Check parent chain for call expression
264
+ let current = node;
265
+ while (current.parent) {
266
+ current = current.parent;
267
+ if (typescript.isCallExpression(current)) {
268
+ const callName = this.getCallExpressionName(typescript, current);
269
+ if (callName && this.isUtilityFunction(callName)) {
270
+ return true;
271
+ }
272
+ }
273
+ // Case 4: Inside tv() or cva() variant definitions (property assignments within these calls)
274
+ if (typescript.isPropertyAssignment(current)) {
275
+ const parentCall = this.findParentCallExpression(typescript, current);
276
+ if (parentCall) {
277
+ const callName = this.getCallExpressionName(typescript, parentCall);
278
+ if (callName && this.isUtilityFunction(callName)) {
279
+ return true;
280
+ }
281
+ }
282
+ }
283
+ // Stop at certain boundaries
284
+ if (typescript.isBlock(current) ||
285
+ typescript.isSourceFile(current) ||
286
+ typescript.isFunctionDeclaration(current) ||
287
+ typescript.isArrowFunction(current)) {
288
+ break;
289
+ }
290
+ }
291
+ return false;
292
+ }
293
+ /**
294
+ * Check if an attribute name is a className-like attribute
295
+ */
296
+ isClassNameAttribute(name) {
297
+ const classNameAttributes = [
298
+ 'className',
299
+ 'class',
300
+ 'classname', // case variations
301
+ 'classList'
302
+ ];
303
+ return classNameAttributes.includes(name) || classNameAttributes.includes(name.toLowerCase());
304
+ }
305
+ /**
306
+ * Check if a function name is a configured utility function for class names
307
+ */
308
+ isUtilityFunction(name) {
309
+ return this.utilityFunctionNames.has(name);
310
+ }
311
+ /**
312
+ * Get the name of a call expression
313
+ */
314
+ getCallExpressionName(typescript, callExpr) {
315
+ const expr = callExpr.expression;
316
+ if (typescript.isIdentifier(expr)) {
317
+ return expr.text;
318
+ }
319
+ if (typescript.isPropertyAccessExpression(expr)) {
320
+ return expr.name.text;
321
+ }
322
+ return undefined;
323
+ }
324
+ /**
325
+ * Find the parent call expression of a node
326
+ */
327
+ findParentCallExpression(typescript, node) {
328
+ let current = node.parent;
329
+ while (current) {
330
+ if (typescript.isCallExpression(current)) {
331
+ return current;
332
+ }
333
+ if (typescript.isBlock(current) ||
334
+ typescript.isSourceFile(current) ||
335
+ typescript.isFunctionDeclaration(current)) {
336
+ break;
337
+ }
338
+ current = current.parent;
339
+ }
340
+ return undefined;
341
+ }
342
+ /**
343
+ * Generate completion entries for Tailwind classes
344
+ */
345
+ generateCompletions(typescript, context) {
346
+ // Get all classes from the validator
347
+ const allClasses = this.getClassList();
348
+ const prefix = context.currentPrefix.toLowerCase();
349
+ // Filter and create completion entries
350
+ const entries = [];
351
+ for (const className of allClasses) {
352
+ // Skip classes that are already in the attribute
353
+ if (context.existingClasses.has(className)) {
354
+ continue;
355
+ }
356
+ // Filter by prefix if one is being typed
357
+ if (prefix && !className.toLowerCase().startsWith(prefix)) {
358
+ continue;
359
+ }
360
+ // Check if this is a color-related class
361
+ const isColorClass = this.isColorClass(className);
362
+ entries.push({
363
+ name: className,
364
+ kind: typescript.ScriptElementKind.string,
365
+ // VS Code recognizes 'color' kindModifier and shows a color icon
366
+ kindModifiers: isColorClass ? 'color' : '',
367
+ sortText: this.getSortText(className, prefix),
368
+ insertText: className,
369
+ replacementSpan: {
370
+ start: context.prefixStart,
371
+ length: context.currentPrefix.length
372
+ }
373
+ });
374
+ }
375
+ this.logger.log(`[CompletionService] Generated ${entries.length} completions for prefix "${prefix}"`);
376
+ return entries;
377
+ }
378
+ /**
379
+ * Get the cached class list, initializing if necessary
380
+ */
381
+ getClassList() {
382
+ if (this.cachedClassList === null) {
383
+ this.cachedClassList = this.validator.getAllClasses().sort();
384
+ this.logger.log(`[CompletionService] Cached ${this.cachedClassList.length} classes`);
385
+ }
386
+ return this.cachedClassList;
387
+ }
388
+ /**
389
+ * Clear the cached class list (call when design system reloads)
390
+ */
391
+ clearCache() {
392
+ this.cachedClassList = null;
393
+ }
394
+ /**
395
+ * Check if a class name is related to colors
396
+ * Uses a pattern-based approach to detect color classes efficiently
397
+ */
398
+ isColorClass(className) {
399
+ // Color-related prefixes in Tailwind CSS
400
+ // These patterns match classes that typically set colors
401
+ const colorPrefixes = [
402
+ 'bg-', // background-color
403
+ 'text-', // color (text color)
404
+ 'border-', // border-color (but not border-0, border-2, etc.)
405
+ 'ring-', // ring-color (but not ring-0, ring-1, etc.)
406
+ 'outline-', // outline-color (but not outline-0, outline-1, etc.)
407
+ 'shadow-', // box-shadow colors (but not shadow-sm, shadow-lg, etc.)
408
+ 'accent-', // accent-color
409
+ 'caret-', // caret-color
410
+ 'fill-', // SVG fill
411
+ 'stroke-', // SVG stroke
412
+ 'from-', // gradient from color
413
+ 'via-', // gradient via color
414
+ 'to-', // gradient to color
415
+ 'divide-', // divide color (but not divide-x, divide-y)
416
+ 'placeholder-', // placeholder color
417
+ 'decoration-' // text-decoration-color
418
+ ];
419
+ // Check if class starts with any color prefix
420
+ const hasColorPrefix = colorPrefixes.some(prefix => className.startsWith(prefix));
421
+ if (!hasColorPrefix) {
422
+ return false;
423
+ }
424
+ // Filter out non-color variants of these prefixes
425
+ // These are utilities that use the same prefix but aren't colors
426
+ const nonColorPatterns = [
427
+ // Border utilities that aren't colors
428
+ /^border-[0-8]$/,
429
+ /^border-(collapse|separate|spacing|none|hidden|solid|dashed|dotted|double)$/,
430
+ /^border-(x|y|t|r|b|l|s|e)-[0-8]$/,
431
+ // Ring utilities that aren't colors
432
+ /^ring-[0-8]$/,
433
+ /^ring-(inset|offset-[0-8])$/,
434
+ // Outline utilities that aren't colors
435
+ /^outline-[0-8]$/,
436
+ /^outline-(none|dashed|dotted|double|offset-[0-8])$/,
437
+ // Shadow utilities that aren't colors
438
+ /^shadow-(sm|md|lg|xl|2xl|inner|none)$/,
439
+ // Divide utilities that aren't colors
440
+ /^divide-(x|y)(-[0-8]|-reverse)?$/,
441
+ /^divide-(solid|dashed|dotted|double|none)$/,
442
+ // Text utilities that aren't colors (sizes, alignment, etc.)
443
+ /^text-(xs|sm|base|lg|xl|[2-9]xl|left|center|right|justify|start|end|wrap|nowrap|balance|pretty)$/,
444
+ // Stroke width
445
+ /^stroke-[0-2]$/,
446
+ // Decoration utilities that aren't colors
447
+ /^decoration-(slice|clone|solid|double|dotted|dashed|wavy|auto|from-font|[0-8])$/
448
+ ];
449
+ // If it matches any non-color pattern, it's not a color class
450
+ if (nonColorPatterns.some(pattern => pattern.test(className))) {
451
+ return false;
452
+ }
453
+ // Additional check: color classes typically have a color name or number
454
+ // e.g., bg-red-500, text-blue-200, border-gray-300
455
+ // or named colors like bg-white, text-black, bg-transparent
456
+ const afterPrefix = className.replace(/^[a-z]+-/, '');
457
+ // Common color indicators
458
+ const colorIndicators = [
459
+ // Color names
460
+ /^(slate|gray|zinc|neutral|stone|red|orange|amber|yellow|lime|green|emerald|teal|cyan|sky|blue|indigo|violet|purple|fuchsia|pink|rose)-\d+$/,
461
+ // Special colors
462
+ /^(black|white|transparent|current|inherit)$/,
463
+ // Arbitrary colors
464
+ /^\[.*\]$/,
465
+ // Opacity variants on colors
466
+ /^.*\/\d+$/
467
+ ];
468
+ return colorIndicators.some(pattern => pattern.test(afterPrefix));
469
+ }
470
+ /**
471
+ * Generate sort text for completion ordering
472
+ * Classes that start with the prefix get priority
473
+ */
474
+ getSortText(className, prefix) {
475
+ // Exact match gets highest priority
476
+ if (className === prefix) {
477
+ return '0' + className;
478
+ }
479
+ // Prefix match gets high priority
480
+ if (prefix && className.toLowerCase().startsWith(prefix.toLowerCase())) {
481
+ return '1' + className;
482
+ }
483
+ // Everything else sorted alphabetically
484
+ return '2' + className;
485
+ }
486
+ }
487
+ exports.CompletionService = CompletionService;
488
+ //# sourceMappingURL=CompletionService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CompletionService.js","sourceRoot":"","sources":["../../src/services/CompletionService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=CompletionService.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CompletionService.spec.d.ts","sourceRoot":"","sources":["../../src/services/CompletionService.spec.ts"],"names":[],"mappings":""}