UNPKG

13 kBJavaScriptView Raw
1'use strict';
2
3const _ = require('lodash');
4
5const keywordSets = {};
6
7keywordSets.nonLengthUnits = new Set([
8 // Relative length units
9 '%',
10 // Time length units
11 's',
12 'ms',
13 // Angle
14 'deg',
15 'grad',
16 'turn',
17 'rad',
18 // Frequency
19 'Hz',
20 'kHz',
21 // Resolution
22 'dpi',
23 'dpcm',
24 'dppx',
25]);
26
27keywordSets.lengthUnits = new Set([
28 // Relative length units
29 'em',
30 'ex',
31 'ch',
32 'rem',
33 // Viewport-percentage lengths
34 'vh',
35 'vw',
36 'vmin',
37 'vmax',
38 'vm',
39 // Absolute length units
40 'px',
41 'mm',
42 'cm',
43 'in',
44 'pt',
45 'pc',
46 'q',
47 // Flexible length units
48 'fr',
49]);
50
51keywordSets.units = uniteSets(keywordSets.nonLengthUnits, keywordSets.lengthUnits);
52
53keywordSets.colorFunctionNames = new Set(['rgb', 'rgba', 'hsl', 'hsla', 'hwb', 'gray']);
54
55keywordSets.camelCaseFunctionNames = new Set([
56 'translateX',
57 'translateY',
58 'translateZ',
59 'scaleX',
60 'scaleY',
61 'scaleZ',
62 'rotateX',
63 'rotateY',
64 'rotateZ',
65 'skewX',
66 'skewY',
67]);
68
69keywordSets.basicKeywords = new Set(['initial', 'inherit', 'unset']);
70
71keywordSets.systemFontValues = uniteSets(keywordSets.basicKeywords, [
72 'caption',
73 'icon',
74 'menu',
75 'message-box',
76 'small-caption',
77 'status-bar',
78]);
79
80keywordSets.fontFamilyKeywords = uniteSets(keywordSets.basicKeywords, [
81 'serif',
82 'sans-serif',
83 'cursive',
84 'fantasy',
85 'monospace',
86 'system-ui',
87]);
88
89keywordSets.fontWeightRelativeKeywords = new Set(['bolder', 'lighter']);
90
91keywordSets.fontWeightAbsoluteKeywords = new Set(['bold']);
92
93keywordSets.fontWeightNumericKeywords = new Set([
94 '100',
95 '200',
96 '300',
97 '400',
98 '500',
99 '600',
100 '700',
101 '800',
102 '900',
103]);
104
105keywordSets.fontWeightKeywords = uniteSets(
106 keywordSets.basicKeywords,
107 keywordSets.fontWeightRelativeKeywords,
108 keywordSets.fontWeightAbsoluteKeywords,
109 keywordSets.fontWeightNumericKeywords,
110);
111
112keywordSets.animationNameKeywords = uniteSets(keywordSets.basicKeywords, ['none']);
113
114keywordSets.animationTimingFunctionKeywords = uniteSets(keywordSets.basicKeywords, [
115 'linear',
116 'ease',
117 'ease-in',
118 'ease-in-out',
119 'ease-out',
120 'step-start',
121 'step-end',
122 'steps',
123 'cubic-bezier',
124]);
125
126keywordSets.animationIterationCountKeywords = new Set(['infinite']);
127
128keywordSets.animationDirectionKeywords = uniteSets(keywordSets.basicKeywords, [
129 'normal',
130 'reverse',
131 'alternate',
132 'alternate-reverse',
133]);
134
135keywordSets.animationFillModeKeywords = new Set(['none', 'forwards', 'backwards', 'both']);
136
137keywordSets.animationPlayStateKeywords = uniteSets(keywordSets.basicKeywords, [
138 'running',
139 'paused',
140]);
141
142// cf. https://developer.mozilla.org/en-US/docs/Web/CSS/animation
143keywordSets.animationShorthandKeywords = uniteSets(
144 keywordSets.basicKeywords,
145 keywordSets.animationNameKeywords,
146 keywordSets.animationTimingFunctionKeywords,
147 keywordSets.animationIterationCountKeywords,
148 keywordSets.animationDirectionKeywords,
149 keywordSets.animationFillModeKeywords,
150 keywordSets.animationPlayStateKeywords,
151);
152
153// These are the ones that can have single-colon notation
154keywordSets.levelOneAndTwoPseudoElements = new Set([
155 'before',
156 'after',
157 'first-line',
158 'first-letter',
159]);
160
161// These are the ones that require double-colon notation
162keywordSets.levelThreePseudoElements = new Set([
163 'before',
164 'after',
165 'first-line',
166 'first-letter',
167 'selection',
168 'spelling-error',
169 'grammar-error',
170 'backdrop',
171 'marker',
172 'placeholder',
173 'shadow',
174 'slotted',
175 'content',
176]);
177
178keywordSets.vendorSpecificPseudoElements = new Set([
179 '-moz-progress-bar',
180 '-moz-range-progress',
181 '-moz-range-thumb',
182 '-moz-range-track',
183 '-ms-browse',
184 '-ms-check',
185 '-ms-clear',
186 '-ms-expand',
187 '-ms-fill',
188 '-ms-fill-lower',
189 '-ms-fill-upper',
190 '-ms-reveal',
191 '-ms-thumb',
192 '-ms-ticks-after',
193 '-ms-ticks-before',
194 '-ms-tooltip',
195 '-ms-track',
196 '-ms-value',
197 '-webkit-progress-bar',
198 '-webkit-progress-value',
199 '-webkit-slider-runnable-track',
200 '-webkit-slider-thumb',
201]);
202
203keywordSets.pseudoElements = uniteSets(
204 keywordSets.levelOneAndTwoPseudoElements,
205 keywordSets.levelThreePseudoElements,
206 keywordSets.vendorSpecificPseudoElements,
207);
208
209keywordSets.aNPlusBNotationPseudoClasses = new Set([
210 'nth-child',
211 'nth-column',
212 'nth-last-child',
213 'nth-last-column',
214 'nth-last-of-type',
215 'nth-of-type',
216]);
217
218keywordSets.linguisticPseudoClasses = new Set(['dir', 'lang']);
219
220keywordSets.atRulePagePseudoClasses = new Set(['first', 'right', 'left', 'blank']);
221
222keywordSets.otherPseudoClasses = new Set([
223 'active',
224 'any-link',
225 'blank',
226 'checked',
227 'contains',
228 'current',
229 'default',
230 'defined',
231 'disabled',
232 'drop',
233 'empty',
234 'enabled',
235 'first-child',
236 'first-of-type',
237 'focus',
238 'focus-ring',
239 'focus-within',
240 'focus-visible',
241 'fullscreen',
242 'future',
243 'has',
244 'host',
245 'host-context',
246 'hover',
247 'indeterminate',
248 'in-range',
249 'invalid',
250 'is',
251 'last-child',
252 'last-of-type',
253 'link',
254 'matches',
255 'not',
256 'only-child',
257 'only-of-type',
258 'optional',
259 'out-of-range',
260 'past',
261 'placeholder-shown',
262 'playing',
263 'paused',
264 'read-only',
265 'read-write',
266 'required',
267 'root',
268 'scope',
269 'target',
270 'user-error',
271 'user-invalid',
272 'val',
273 'valid',
274 'visited',
275]);
276
277keywordSets.webkitProprietaryPseudoElements = new Set([
278 'scrollbar',
279 'scrollbar-button',
280 'scrollbar-track',
281 'scrollbar-track-piece',
282 'scrollbar-thumb',
283 'scrollbar-corner',
284 'resize',
285]);
286
287keywordSets.webkitProprietaryPseudoClasses = new Set([
288 'horizontal',
289 'vertical',
290 'decrement',
291 'increment',
292 'start',
293 'end',
294 'double-button',
295 'single-button',
296 'no-button',
297 'corner-present',
298 'window-inactive',
299]);
300
301keywordSets.pseudoClasses = uniteSets(
302 keywordSets.aNPlusBNotationPseudoClasses,
303 keywordSets.linguisticPseudoClasses,
304 keywordSets.otherPseudoClasses,
305);
306
307keywordSets.shorthandTimeProperties = new Set(['transition', 'animation']);
308
309keywordSets.longhandTimeProperties = new Set([
310 'transition-duration',
311 'transition-delay',
312 'animation-duration',
313 'animation-delay',
314]);
315
316keywordSets.timeProperties = uniteSets(
317 keywordSets.shorthandTimeProperties,
318 keywordSets.longhandTimeProperties,
319);
320
321keywordSets.camelCaseKeywords = new Set([
322 'optimizeSpeed',
323 'optimizeQuality',
324 'optimizeLegibility',
325 'geometricPrecision',
326 'currentColor',
327 'crispEdges',
328 'visiblePainted',
329 'visibleFill',
330 'visibleStroke',
331 'sRGB',
332 'linearRGB',
333]);
334
335// https://developer.mozilla.org/docs/Web/CSS/counter-increment
336keywordSets.counterIncrementKeywords = uniteSets(keywordSets.basicKeywords, ['none']);
337
338keywordSets.counterResetKeywords = uniteSets(keywordSets.basicKeywords, ['none']);
339
340keywordSets.gridRowKeywords = uniteSets(keywordSets.basicKeywords, ['auto', 'span']);
341
342keywordSets.gridColumnKeywords = uniteSets(keywordSets.basicKeywords, ['auto', 'span']);
343
344keywordSets.gridAreaKeywords = uniteSets(keywordSets.basicKeywords, ['auto', 'span']);
345
346// https://developer.mozilla.org/ru/docs/Web/CSS/list-style-type
347keywordSets.listStyleTypeKeywords = uniteSets(keywordSets.basicKeywords, [
348 'none',
349 'disc',
350 'circle',
351 'square',
352 'decimal',
353 'cjk-decimal',
354 'decimal-leading-zero',
355 'lower-roman',
356 'upper-roman',
357 'lower-greek',
358 'lower-alpha',
359 'lower-latin',
360 'upper-alpha',
361 'upper-latin',
362 'arabic-indic',
363 'armenian',
364 'bengali',
365 'cambodian',
366 'cjk-earthly-branch',
367 'cjk-ideographic',
368 'devanagari',
369 'ethiopic-numeric',
370 'georgian',
371 'gujarati',
372 'gurmukhi',
373 'hebrew',
374 'hiragana',
375 'hiragana-iroha',
376 'japanese-formal',
377 'japanese-informal',
378 'kannada',
379 'katakana',
380 'katakana-iroha',
381 'khmer',
382 'korean-hangul-formal',
383 'korean-hanja-formal',
384 'korean-hanja-informal',
385 'lao',
386 'lower-armenian',
387 'malayalam',
388 'mongolian',
389 'myanmar',
390 'oriya',
391 'persian',
392 'simp-chinese-formal',
393 'simp-chinese-informal',
394 'tamil',
395 'telugu',
396 'thai',
397 'tibetan',
398 'trad-chinese-formal',
399 'trad-chinese-informal',
400 'upper-armenian',
401 'disclosure-open',
402 'disclosure-closed',
403 // Non-standard extensions (without prefixe)
404 'ethiopic-halehame',
405 'ethiopic-halehame-am',
406 'ethiopic-halehame-ti-er',
407 'ethiopic-halehame-ti-et',
408 'hangul',
409 'hangul-consonant',
410 'urdu',
411]);
412
413keywordSets.listStylePositionKeywords = uniteSets(keywordSets.basicKeywords, ['inside', 'outside']);
414
415keywordSets.listStyleImageKeywords = uniteSets(keywordSets.basicKeywords, ['none']);
416
417keywordSets.listStyleShorthandKeywords = uniteSets(
418 keywordSets.basicKeywords,
419 keywordSets.listStyleTypeKeywords,
420 keywordSets.listStylePositionKeywords,
421 keywordSets.listStyleImageKeywords,
422);
423
424keywordSets.fontStyleKeywords = uniteSets(keywordSets.basicKeywords, [
425 'normal',
426 'italic',
427 'oblique',
428]);
429
430keywordSets.fontVariantKeywords = uniteSets(keywordSets.basicKeywords, [
431 'normal',
432 'none',
433 'historical-forms',
434 'none',
435 'common-ligatures',
436 'no-common-ligatures',
437 'discretionary-ligatures',
438 'no-discretionary-ligatures',
439 'historical-ligatures',
440 'no-historical-ligatures',
441 'contextual',
442 'no-contextual',
443 'small-caps',
444 'small-caps',
445 'all-small-caps',
446 'petite-caps',
447 'all-petite-caps',
448 'unicase',
449 'titling-caps',
450 'lining-nums',
451 'oldstyle-nums',
452 'proportional-nums',
453 'tabular-nums',
454 'diagonal-fractions',
455 'stacked-fractions',
456 'ordinal',
457 'slashed-zero',
458 'jis78',
459 'jis83',
460 'jis90',
461 'jis04',
462 'simplified',
463 'traditional',
464 'full-width',
465 'proportional-width',
466 'ruby',
467]);
468
469keywordSets.fontStretchKeywords = uniteSets(keywordSets.basicKeywords, [
470 'semi-condensed',
471 'condensed',
472 'extra-condensed',
473 'ultra-condensed',
474 'semi-expanded',
475 'expanded',
476 'extra-expanded',
477 'ultra-expanded',
478]);
479
480keywordSets.fontSizeKeywords = uniteSets(keywordSets.basicKeywords, [
481 'xx-small',
482 'x-small',
483 'small',
484 'medium',
485 'large',
486 'x-large',
487 'xx-large',
488 'larger',
489 'smaller',
490]);
491
492keywordSets.lineHeightKeywords = uniteSets(keywordSets.basicKeywords, ['normal']);
493
494keywordSets.fontShorthandKeywords = uniteSets(
495 keywordSets.basicKeywords,
496 keywordSets.fontStyleKeywords,
497 keywordSets.fontVariantKeywords,
498 keywordSets.fontWeightKeywords,
499 keywordSets.fontStretchKeywords,
500 keywordSets.fontSizeKeywords,
501 keywordSets.lineHeightKeywords,
502 keywordSets.fontFamilyKeywords,
503);
504
505keywordSets.keyframeSelectorKeywords = new Set(['from', 'to']);
506
507// https://www.w3.org/TR/css-page-3/#syntax-page-selector
508keywordSets.pageMarginAtRules = new Set([
509 'top-left-corner',
510 'top-left',
511 'top-center',
512 'top-right',
513 'top-right-corner',
514 'bottom-left-corner',
515 'bottom-left',
516 'bottom-center',
517 'bottom-right',
518 'bottom-right-corner',
519 'left-top',
520 'left-middle',
521 'left-bottom',
522 'right-top',
523 'right-middle',
524 'right-bottom',
525]);
526
527// https://developer.mozilla.org/en/docs/Web/CSS/At-rule
528keywordSets.atRules = uniteSets(keywordSets.pageMarginAtRules, [
529 'apply',
530 'annotation',
531 'character-variant',
532 'charset',
533 'counter-style',
534 'custom-media',
535 'custom-selector',
536 'document',
537 'font-face',
538 'font-feature-values',
539 'import',
540 'keyframes',
541 'media',
542 'namespace',
543 'nest',
544 'ornaments',
545 'page',
546 'styleset',
547 'stylistic',
548 'supports',
549 'swash',
550 'viewport',
551]);
552
553// https://drafts.csswg.org/mediaqueries/#descdef-media-update
554keywordSets.deprecatedMediaFeatureNames = new Set([
555 'device-aspect-ratio',
556 'device-height',
557 'device-width',
558 'max-device-aspect-ratio',
559 'max-device-height',
560 'max-device-width',
561 'min-device-aspect-ratio',
562 'min-device-height',
563 'min-device-width',
564]);
565
566// https://drafts.csswg.org/mediaqueries/#descdef-media-update
567keywordSets.mediaFeatureNames = uniteSets(keywordSets.deprecatedMediaFeatureNames, [
568 'any-hover',
569 'any-pointer',
570 'aspect-ratio',
571 'color',
572 'color-gamut',
573 'color-index',
574 'grid',
575 'height',
576 'hover',
577 'inverted-colors',
578 'light-level',
579 'max-aspect-ratio',
580 'max-color',
581 'max-color-index',
582 'max-height',
583 'max-monochrome',
584 'max-resolution',
585 'max-width',
586 'min-aspect-ratio',
587 'min-color',
588 'min-color-index',
589 'min-height',
590 'min-monochrome',
591 'min-resolution',
592 'min-width',
593 'monochrome',
594 'orientation',
595 'overflow-block',
596 'overflow-inline',
597 'pointer',
598 'prefers-color-scheme',
599 'prefers-reduced-motion',
600 'prefers-reduced-transparency',
601 'resolution',
602 'scan',
603 'scripting',
604 'update',
605 'width',
606]);
607
608// https://www.w3.org/TR/CSS22/ui.html#system-colors
609keywordSets.systemColors = new Set([
610 'activeborder',
611 'activecaption',
612 'appworkspace',
613 'background',
614 'buttonface',
615 'buttonhighlight',
616 'buttonshadow',
617 'buttontext',
618 'captiontext',
619 'graytext',
620 'highlight',
621 'highlighttext',
622 'inactiveborder',
623 'inactivecaption',
624 'inactivecaptiontext',
625 'infobackground',
626 'infotext',
627 'menu',
628 'menutext',
629 'scrollbar',
630 'threeddarkshadow',
631 'threedface',
632 'threedhighlight',
633 'threedlightshadow',
634 'threedshadow',
635 'window',
636 'windowframe',
637 'windowtext',
638]);
639
640// htmlTags includes only "standard" tags. So we augment it with older tags etc.
641keywordSets.nonStandardHtmlTags = new Set([
642 'acronym',
643 'applet',
644 'basefont',
645 'big',
646 'blink',
647 'center',
648 'content',
649 'dir',
650 'font',
651 'frame',
652 'frameset',
653 'hgroup',
654 'isindex',
655 'keygen',
656 'listing',
657 'marquee',
658 'noembed',
659 'plaintext',
660 'spacer',
661 'strike',
662 'tt',
663 'xmp',
664]);
665
666function uniteSets() {
667 const sets = Array.from(arguments);
668
669 return new Set(
670 sets.reduce((result, set) => {
671 return result.concat(_.toArray(set));
672 }, []),
673 );
674}
675
676module.exports = keywordSets;