UNPKG

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