UNPKG

13.1 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.shadowTreePseudoElements = new Set(['part']);
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 keywordSets.shadowTreePseudoElements,
208);
209
210keywordSets.aNPlusBNotationPseudoClasses = new Set([
211 'nth-child',
212 'nth-column',
213 'nth-last-child',
214 'nth-last-column',
215 'nth-last-of-type',
216 'nth-of-type',
217]);
218
219keywordSets.linguisticPseudoClasses = new Set(['dir', 'lang']);
220
221keywordSets.atRulePagePseudoClasses = new Set(['first', 'right', 'left', 'blank']);
222
223keywordSets.otherPseudoClasses = new Set([
224 'active',
225 'any-link',
226 'blank',
227 'checked',
228 'contains',
229 'current',
230 'default',
231 'defined',
232 'disabled',
233 'drop',
234 'empty',
235 'enabled',
236 'first-child',
237 'first-of-type',
238 'focus',
239 'focus-ring',
240 'focus-within',
241 'focus-visible',
242 'fullscreen',
243 'future',
244 'has',
245 'host',
246 'host-context',
247 'hover',
248 'indeterminate',
249 'in-range',
250 'invalid',
251 'is',
252 'last-child',
253 'last-of-type',
254 'link',
255 'matches',
256 'not',
257 'only-child',
258 'only-of-type',
259 'optional',
260 'out-of-range',
261 'past',
262 'placeholder-shown',
263 'playing',
264 'paused',
265 'read-only',
266 'read-write',
267 'required',
268 'root',
269 'scope',
270 'target',
271 'user-error',
272 'user-invalid',
273 'val',
274 'valid',
275 'visited',
276]);
277
278keywordSets.webkitProprietaryPseudoElements = new Set([
279 'scrollbar',
280 'scrollbar-button',
281 'scrollbar-track',
282 'scrollbar-track-piece',
283 'scrollbar-thumb',
284 'scrollbar-corner',
285 'resize',
286]);
287
288keywordSets.webkitProprietaryPseudoClasses = new Set([
289 'horizontal',
290 'vertical',
291 'decrement',
292 'increment',
293 'start',
294 'end',
295 'double-button',
296 'single-button',
297 'no-button',
298 'corner-present',
299 'window-inactive',
300]);
301
302keywordSets.pseudoClasses = uniteSets(
303 keywordSets.aNPlusBNotationPseudoClasses,
304 keywordSets.linguisticPseudoClasses,
305 keywordSets.otherPseudoClasses,
306);
307
308keywordSets.shorthandTimeProperties = new Set(['transition', 'animation']);
309
310keywordSets.longhandTimeProperties = new Set([
311 'transition-duration',
312 'transition-delay',
313 'animation-duration',
314 'animation-delay',
315]);
316
317keywordSets.timeProperties = uniteSets(
318 keywordSets.shorthandTimeProperties,
319 keywordSets.longhandTimeProperties,
320);
321
322keywordSets.camelCaseKeywords = new Set([
323 'optimizeSpeed',
324 'optimizeQuality',
325 'optimizeLegibility',
326 'geometricPrecision',
327 'currentColor',
328 'crispEdges',
329 'visiblePainted',
330 'visibleFill',
331 'visibleStroke',
332 'sRGB',
333 'linearRGB',
334]);
335
336// https://developer.mozilla.org/docs/Web/CSS/counter-increment
337keywordSets.counterIncrementKeywords = uniteSets(keywordSets.basicKeywords, ['none']);
338
339keywordSets.counterResetKeywords = uniteSets(keywordSets.basicKeywords, ['none']);
340
341keywordSets.gridRowKeywords = uniteSets(keywordSets.basicKeywords, ['auto', 'span']);
342
343keywordSets.gridColumnKeywords = uniteSets(keywordSets.basicKeywords, ['auto', 'span']);
344
345keywordSets.gridAreaKeywords = uniteSets(keywordSets.basicKeywords, ['auto', 'span']);
346
347// https://developer.mozilla.org/ru/docs/Web/CSS/list-style-type
348keywordSets.listStyleTypeKeywords = uniteSets(keywordSets.basicKeywords, [
349 'none',
350 'disc',
351 'circle',
352 'square',
353 'decimal',
354 'cjk-decimal',
355 'decimal-leading-zero',
356 'lower-roman',
357 'upper-roman',
358 'lower-greek',
359 'lower-alpha',
360 'lower-latin',
361 'upper-alpha',
362 'upper-latin',
363 'arabic-indic',
364 'armenian',
365 'bengali',
366 'cambodian',
367 'cjk-earthly-branch',
368 'cjk-ideographic',
369 'devanagari',
370 'ethiopic-numeric',
371 'georgian',
372 'gujarati',
373 'gurmukhi',
374 'hebrew',
375 'hiragana',
376 'hiragana-iroha',
377 'japanese-formal',
378 'japanese-informal',
379 'kannada',
380 'katakana',
381 'katakana-iroha',
382 'khmer',
383 'korean-hangul-formal',
384 'korean-hanja-formal',
385 'korean-hanja-informal',
386 'lao',
387 'lower-armenian',
388 'malayalam',
389 'mongolian',
390 'myanmar',
391 'oriya',
392 'persian',
393 'simp-chinese-formal',
394 'simp-chinese-informal',
395 'tamil',
396 'telugu',
397 'thai',
398 'tibetan',
399 'trad-chinese-formal',
400 'trad-chinese-informal',
401 'upper-armenian',
402 'disclosure-open',
403 'disclosure-closed',
404 // Non-standard extensions (without prefixe)
405 'ethiopic-halehame',
406 'ethiopic-halehame-am',
407 'ethiopic-halehame-ti-er',
408 'ethiopic-halehame-ti-et',
409 'hangul',
410 'hangul-consonant',
411 'urdu',
412]);
413
414keywordSets.listStylePositionKeywords = uniteSets(keywordSets.basicKeywords, ['inside', 'outside']);
415
416keywordSets.listStyleImageKeywords = uniteSets(keywordSets.basicKeywords, ['none']);
417
418keywordSets.listStyleShorthandKeywords = uniteSets(
419 keywordSets.basicKeywords,
420 keywordSets.listStyleTypeKeywords,
421 keywordSets.listStylePositionKeywords,
422 keywordSets.listStyleImageKeywords,
423);
424
425keywordSets.fontStyleKeywords = uniteSets(keywordSets.basicKeywords, [
426 'normal',
427 'italic',
428 'oblique',
429]);
430
431keywordSets.fontVariantKeywords = uniteSets(keywordSets.basicKeywords, [
432 'normal',
433 'none',
434 'historical-forms',
435 'none',
436 'common-ligatures',
437 'no-common-ligatures',
438 'discretionary-ligatures',
439 'no-discretionary-ligatures',
440 'historical-ligatures',
441 'no-historical-ligatures',
442 'contextual',
443 'no-contextual',
444 'small-caps',
445 'small-caps',
446 'all-small-caps',
447 'petite-caps',
448 'all-petite-caps',
449 'unicase',
450 'titling-caps',
451 'lining-nums',
452 'oldstyle-nums',
453 'proportional-nums',
454 'tabular-nums',
455 'diagonal-fractions',
456 'stacked-fractions',
457 'ordinal',
458 'slashed-zero',
459 'jis78',
460 'jis83',
461 'jis90',
462 'jis04',
463 'simplified',
464 'traditional',
465 'full-width',
466 'proportional-width',
467 'ruby',
468]);
469
470keywordSets.fontStretchKeywords = uniteSets(keywordSets.basicKeywords, [
471 'semi-condensed',
472 'condensed',
473 'extra-condensed',
474 'ultra-condensed',
475 'semi-expanded',
476 'expanded',
477 'extra-expanded',
478 'ultra-expanded',
479]);
480
481keywordSets.fontSizeKeywords = uniteSets(keywordSets.basicKeywords, [
482 'xx-small',
483 'x-small',
484 'small',
485 'medium',
486 'large',
487 'x-large',
488 'xx-large',
489 'larger',
490 'smaller',
491]);
492
493keywordSets.lineHeightKeywords = uniteSets(keywordSets.basicKeywords, ['normal']);
494
495keywordSets.fontShorthandKeywords = uniteSets(
496 keywordSets.basicKeywords,
497 keywordSets.fontStyleKeywords,
498 keywordSets.fontVariantKeywords,
499 keywordSets.fontWeightKeywords,
500 keywordSets.fontStretchKeywords,
501 keywordSets.fontSizeKeywords,
502 keywordSets.lineHeightKeywords,
503 keywordSets.fontFamilyKeywords,
504);
505
506keywordSets.keyframeSelectorKeywords = new Set(['from', 'to']);
507
508// https://www.w3.org/TR/css-page-3/#syntax-page-selector
509keywordSets.pageMarginAtRules = new Set([
510 'top-left-corner',
511 'top-left',
512 'top-center',
513 'top-right',
514 'top-right-corner',
515 'bottom-left-corner',
516 'bottom-left',
517 'bottom-center',
518 'bottom-right',
519 'bottom-right-corner',
520 'left-top',
521 'left-middle',
522 'left-bottom',
523 'right-top',
524 'right-middle',
525 'right-bottom',
526]);
527
528// https://developer.mozilla.org/en/docs/Web/CSS/At-rule
529keywordSets.atRules = uniteSets(keywordSets.pageMarginAtRules, [
530 'annotation',
531 'apply',
532 'character-variant',
533 'charset',
534 'counter-style',
535 'custom-media',
536 'custom-selector',
537 'document',
538 'font-face',
539 'font-feature-values',
540 'import',
541 'keyframes',
542 'media',
543 'namespace',
544 'nest',
545 'ornaments',
546 'page',
547 'styleset',
548 'stylistic',
549 'supports',
550 'swash',
551 'viewport',
552]);
553
554// https://drafts.csswg.org/mediaqueries/#descdef-media-update
555keywordSets.deprecatedMediaFeatureNames = new Set([
556 'device-aspect-ratio',
557 'device-height',
558 'device-width',
559 'max-device-aspect-ratio',
560 'max-device-height',
561 'max-device-width',
562 'min-device-aspect-ratio',
563 'min-device-height',
564 'min-device-width',
565]);
566
567// https://drafts.csswg.org/mediaqueries/#descdef-media-update
568keywordSets.mediaFeatureNames = uniteSets(keywordSets.deprecatedMediaFeatureNames, [
569 'any-hover',
570 'any-pointer',
571 'aspect-ratio',
572 'color',
573 'color-gamut',
574 'color-index',
575 'forced-colors',
576 'grid',
577 'height',
578 'hover',
579 'inverted-colors',
580 'light-level',
581 'max-aspect-ratio',
582 'max-color',
583 'max-color-index',
584 'max-height',
585 'max-monochrome',
586 'max-resolution',
587 'max-width',
588 'min-aspect-ratio',
589 'min-color',
590 'min-color-index',
591 'min-height',
592 'min-monochrome',
593 'min-resolution',
594 'min-width',
595 'monochrome',
596 'orientation',
597 'overflow-block',
598 'overflow-inline',
599 'pointer',
600 'prefers-color-scheme',
601 'prefers-reduced-motion',
602 'prefers-reduced-transparency',
603 'resolution',
604 'scan',
605 'scripting',
606 'update',
607 'width',
608]);
609
610// https://www.w3.org/TR/CSS22/ui.html#system-colors
611keywordSets.systemColors = new Set([
612 'activeborder',
613 'activecaption',
614 'appworkspace',
615 'background',
616 'buttonface',
617 'buttonhighlight',
618 'buttonshadow',
619 'buttontext',
620 'captiontext',
621 'graytext',
622 'highlight',
623 'highlighttext',
624 'inactiveborder',
625 'inactivecaption',
626 'inactivecaptiontext',
627 'infobackground',
628 'infotext',
629 'menu',
630 'menutext',
631 'scrollbar',
632 'threeddarkshadow',
633 'threedface',
634 'threedhighlight',
635 'threedlightshadow',
636 'threedshadow',
637 'window',
638 'windowframe',
639 'windowtext',
640]);
641
642// htmlTags includes only "standard" tags. So we augment it with older tags etc.
643keywordSets.nonStandardHtmlTags = new Set([
644 'acronym',
645 'applet',
646 'basefont',
647 'big',
648 'blink',
649 'center',
650 'content',
651 'dir',
652 'font',
653 'frame',
654 'frameset',
655 'hgroup',
656 'isindex',
657 'keygen',
658 'listing',
659 'marquee',
660 'noembed',
661 'plaintext',
662 'spacer',
663 'strike',
664 'tt',
665 'xmp',
666]);
667
668/**
669 * @param {(string[] | Set<string>)[]} args
670 */
671function uniteSets(...args) {
672 return new Set(
673 Array.from(args).reduce((/** @type {string[]} */ result, set) => {
674 return result.concat(Array.from(set));
675 }, []),
676 );
677}
678
679module.exports = keywordSets;