keywordSets.js 13 KB

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