selectors.mjs 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463
  1. import htmlTags from 'html-tags';
  2. import uniteSets from '../utils/uniteSets.mjs';
  3. /** @type {ReadonlySet<string>} */
  4. const deprecatedHtmlTypeSelectors = new Set([
  5. 'acronym',
  6. 'applet',
  7. 'basefont',
  8. 'big',
  9. 'bgsound',
  10. 'blink',
  11. 'center',
  12. 'content',
  13. 'dir',
  14. 'font',
  15. 'frame',
  16. 'frameset',
  17. 'isindex',
  18. 'keygen',
  19. 'listing',
  20. 'marquee',
  21. 'multicol',
  22. 'nextid',
  23. 'nobr',
  24. 'noembed',
  25. 'noframes',
  26. 'plaintext',
  27. 'param',
  28. 'popup',
  29. 'selectmenu',
  30. 'shadow',
  31. 'spacer',
  32. 'strike',
  33. 'tt',
  34. 'xmp',
  35. ]);
  36. // typecasting htmlTags to be more generic; see https://github.com/stylelint/stylelint/pull/6013 for discussion
  37. /** @type {ReadonlySet<string>} */
  38. const standardHtmlTypeSelectors = new Set(htmlTags);
  39. /** @type {ReadonlySet<string>} */
  40. const experimentalHtmlTypeSelectors = new Set([
  41. 'fencedframe',
  42. 'listbox',
  43. 'model',
  44. 'portal',
  45. 'selectedcontent',
  46. 'selectlist',
  47. ]);
  48. /** @type {ReadonlySet<string>} */
  49. export const htmlTypeSelectors = uniteSets(
  50. deprecatedHtmlTypeSelectors,
  51. standardHtmlTypeSelectors,
  52. experimentalHtmlTypeSelectors,
  53. );
  54. /** @type {ReadonlySet<string>} */
  55. export const deprecatedSvgTypeSelectors = new Set([
  56. 'altGlyph',
  57. 'altGlyphDef',
  58. 'altGlyphItem',
  59. 'cursor',
  60. 'font',
  61. 'font-face',
  62. 'font-face-format',
  63. 'font-face-name',
  64. 'font-face-src',
  65. 'font-face-uri',
  66. 'glyph',
  67. 'glyphRef',
  68. 'hatchPath',
  69. 'hkern',
  70. 'missing-glyph',
  71. 'tref',
  72. 'vkern',
  73. ]);
  74. /** @type {ReadonlySet<string>} */
  75. export const mixedCaseSvgTypeSelectors = new Set([
  76. 'altGlyph',
  77. 'altGlyphDef',
  78. 'altGlyphItem',
  79. 'animateColor',
  80. 'animateMotion',
  81. 'animateTransform',
  82. 'clipPath',
  83. 'feBlend',
  84. 'feColorMatrix',
  85. 'feComponentTransfer',
  86. 'feComposite',
  87. 'feConvolveMatrix',
  88. 'feDiffuseLighting',
  89. 'feDisplacementMap',
  90. 'feDistantLight',
  91. 'feDropShadow',
  92. 'feFlood',
  93. 'feFuncA',
  94. 'feFuncB',
  95. 'feFuncG',
  96. 'feFuncR',
  97. 'feGaussianBlur',
  98. 'feImage',
  99. 'feMerge',
  100. 'feMergeNode',
  101. 'feMorphology',
  102. 'feOffset',
  103. 'fePointLight',
  104. 'feSpecularLighting',
  105. 'feSpotLight',
  106. 'feTile',
  107. 'feTurbulence',
  108. 'foreignObject',
  109. 'glyphRef',
  110. 'hatchPath',
  111. 'linearGradient',
  112. 'radialGradient',
  113. 'textPath',
  114. ]);
  115. /**
  116. * These are the ones that can have single-colon notation
  117. *
  118. * @type {ReadonlySet<string>}
  119. */
  120. export const levelOneAndTwoPseudoElements = new Set([
  121. 'before',
  122. 'after',
  123. 'first-line',
  124. 'first-letter',
  125. ]);
  126. /** @type {ReadonlySet<string>} */
  127. export const shadowTreePseudoElements = new Set(['part']);
  128. /** @type {ReadonlySet<string>} */
  129. export const webkitScrollbarPseudoElements = new Set([
  130. '-webkit-resizer',
  131. '-webkit-scrollbar',
  132. '-webkit-scrollbar-button',
  133. '-webkit-scrollbar-corner',
  134. '-webkit-scrollbar-thumb',
  135. '-webkit-scrollbar-track',
  136. '-webkit-scrollbar-track-piece',
  137. ]);
  138. /** @type {ReadonlySet<string>} */
  139. const vendorSpecificPseudoElements = uniteSets(webkitScrollbarPseudoElements, [
  140. '-moz-focus-inner',
  141. '-moz-focus-outer',
  142. '-moz-list-bullet',
  143. '-moz-meter-bar',
  144. '-moz-placeholder',
  145. '-moz-progress-bar',
  146. '-moz-range-progress',
  147. '-moz-range-thumb',
  148. '-moz-range-track',
  149. '-ms-browse',
  150. '-ms-check',
  151. '-ms-clear',
  152. '-ms-expand',
  153. '-ms-fill',
  154. '-ms-fill-lower',
  155. '-ms-fill-upper',
  156. '-ms-reveal',
  157. '-ms-thumb',
  158. '-ms-ticks-after',
  159. '-ms-ticks-before',
  160. '-ms-tooltip',
  161. '-ms-track',
  162. '-ms-value',
  163. '-webkit-color-swatch',
  164. '-webkit-color-swatch-wrapper',
  165. '-webkit-calendar-picker-indicator',
  166. '-webkit-clear-button',
  167. '-webkit-date-and-time-value',
  168. '-webkit-datetime-edit',
  169. '-webkit-datetime-edit-ampm-field',
  170. '-webkit-datetime-edit-day-field',
  171. '-webkit-datetime-edit-fields-wrapper',
  172. '-webkit-datetime-edit-hour-field',
  173. '-webkit-datetime-edit-millisecond-field',
  174. '-webkit-datetime-edit-minute-field',
  175. '-webkit-datetime-edit-month-field',
  176. '-webkit-datetime-edit-second-field',
  177. '-webkit-datetime-edit-text',
  178. '-webkit-datetime-edit-week-field',
  179. '-webkit-datetime-edit-year-field',
  180. '-webkit-details-marker',
  181. '-webkit-distributed',
  182. '-webkit-file-upload-button',
  183. '-webkit-input-placeholder',
  184. '-webkit-keygen-select',
  185. '-webkit-meter-bar',
  186. '-webkit-meter-even-less-good-value',
  187. '-webkit-meter-inner-element',
  188. '-webkit-meter-optimum-value',
  189. '-webkit-meter-suboptimum-value',
  190. '-webkit-meter-horizontal-bar',
  191. '-webkit-meter-horizontal-optimum-value',
  192. '-webkit-meter-horizontal-suboptimal-value',
  193. '-webkit-meter-horizontal-even-less-good-value',
  194. '-webkit-meter-vertical-bar',
  195. '-webkit-meter-vertical-optimum-value',
  196. '-webkit-meter-vertical-suboptimal-value',
  197. '-webkit-meter-vertical-even-less-good-value',
  198. '-webkit-progress-bar',
  199. '-webkit-progress-inner-element',
  200. '-webkit-progress-value',
  201. '-webkit-search-cancel-button',
  202. '-webkit-search-decoration',
  203. '-webkit-search-results-button',
  204. '-webkit-search-results-decoration',
  205. '-webkit-slider-runnable-track',
  206. '-webkit-slider-thumb',
  207. '-webkit-textfield-decoration-container',
  208. '-webkit-validation-bubble',
  209. '-webkit-validation-bubble-arrow',
  210. '-webkit-validation-bubble-arrow-clipper',
  211. '-webkit-validation-bubble-heading',
  212. '-webkit-validation-bubble-message',
  213. '-webkit-validation-bubble-text-block',
  214. ]);
  215. /** @type {ReadonlySet<string>} */
  216. export const deprecatedPseudoElements = new Set(['shadow']);
  217. /** @type {ReadonlySet<string>} */
  218. export const pseudoElements = uniteSets(
  219. levelOneAndTwoPseudoElements,
  220. vendorSpecificPseudoElements,
  221. shadowTreePseudoElements,
  222. deprecatedPseudoElements,
  223. [
  224. 'backdrop',
  225. 'checkmark',
  226. 'clear-icon',
  227. 'color-swatch',
  228. 'content',
  229. 'cue',
  230. 'details-content',
  231. 'field-component',
  232. 'field-separator',
  233. 'field-text',
  234. 'file-selector-button',
  235. 'grammar-error',
  236. 'highlight',
  237. 'marker',
  238. 'picker-icon',
  239. 'picker',
  240. 'placeholder',
  241. 'scroll-marker-group',
  242. 'scroll-marker',
  243. 'search-text',
  244. 'selection',
  245. 'slider-fill',
  246. 'slider-thumb',
  247. 'slider-track',
  248. 'slotted',
  249. 'spelling-error',
  250. 'step-control',
  251. 'step-down',
  252. 'step-up',
  253. 'target-text',
  254. 'view-transition-group',
  255. 'view-transition-image-pair',
  256. 'view-transition-new',
  257. 'view-transition-old',
  258. 'view-transition',
  259. ],
  260. );
  261. /** @type {ReadonlySet<string>} */
  262. export const aNPlusBNotationPseudoClasses = new Set([
  263. 'nth-column',
  264. 'nth-last-column',
  265. 'nth-last-of-type',
  266. 'nth-of-type',
  267. ]);
  268. /** @type {ReadonlySet<string>} */
  269. export const aNPlusBOfSNotationPseudoClasses = new Set(['nth-child', 'nth-last-child']);
  270. /** @type {ReadonlySet<string>} */
  271. export const atRulePagePseudoClasses = new Set([
  272. 'first',
  273. 'right',
  274. 'left',
  275. 'blank',
  276. 'recto',
  277. 'verso',
  278. 'nth',
  279. ]);
  280. /** @type {ReadonlySet<string>} */
  281. export const linguisticPseudoClasses = new Set(['dir', 'lang']);
  282. /** @type {ReadonlySet<string>} */
  283. export const logicalCombinationsPseudoClasses = new Set(['has', 'is', 'matches', 'not', 'where']);
  284. /** @type {ReadonlySet<string>} */
  285. export const deprecatedPseudoClasses = new Set([
  286. 'contains',
  287. 'drop',
  288. 'focus-ring',
  289. 'fullscreen-ancestor',
  290. 'matches',
  291. 'popup-open',
  292. 'top-layer',
  293. 'user-error',
  294. ]);
  295. /** @type {ReadonlySet<string>} */
  296. const vendorSpecificPseudoClasses = new Set([
  297. '-khtml-drag',
  298. '-moz-any',
  299. '-moz-any-link',
  300. '-moz-bound-element',
  301. '-moz-broken',
  302. '-moz-dir',
  303. '-moz-drag-over',
  304. '-moz-empty-except-children-with-localname',
  305. '-moz-first-node',
  306. '-moz-focusring',
  307. '-moz-full-screen',
  308. '-moz-full-screen-ancestor',
  309. '-moz-is-html',
  310. '-moz-last-node',
  311. '-moz-loading',
  312. '-moz-meter-optimum',
  313. '-moz-meter-sub-optimum',
  314. '-moz-meter-sub-sub-optimum',
  315. '-moz-only-whitespace',
  316. '-moz-placeholder',
  317. '-moz-read-only',
  318. '-moz-read-write',
  319. '-moz-submit-invalid',
  320. '-moz-suppressed',
  321. '-moz-table-border-nonzero',
  322. '-moz-ui-invalid',
  323. '-moz-ui-valid',
  324. '-moz-user-disabled',
  325. '-moz-window-inactive',
  326. '-ms-fullscreen',
  327. '-ms-input-placeholder',
  328. '-webkit-drag',
  329. '-webkit-any',
  330. '-webkit-any-link',
  331. '-webkit-autofill',
  332. '-webkit-full-screen',
  333. '-webkit-full-screen-ancestor',
  334. ]);
  335. /**
  336. * @see https://webkit.org/blog/363/styling-scrollbars/
  337. * @type {ReadonlySet<string>}
  338. */
  339. export const webkitScrollbarPseudoClasses = new Set([
  340. 'horizontal',
  341. 'vertical',
  342. 'decrement',
  343. 'increment',
  344. 'start',
  345. 'end',
  346. 'double-button',
  347. 'single-button',
  348. 'no-button',
  349. 'corner-present',
  350. 'window-inactive',
  351. ]);
  352. /**
  353. * @see https://www.w3.org/TR/selectors-4/#resource-pseudos
  354. * @type {ReadonlySet<string>}
  355. */
  356. const resourceStatePseudoClasses = new Set([
  357. 'buffering',
  358. 'muted',
  359. 'paused',
  360. 'playing',
  361. 'seeking',
  362. 'stalled',
  363. 'volume-locked',
  364. ]);
  365. /** @type {ReadonlySet<string>} */
  366. export const pseudoClasses = uniteSets(
  367. aNPlusBNotationPseudoClasses,
  368. linguisticPseudoClasses,
  369. logicalCombinationsPseudoClasses,
  370. aNPlusBOfSNotationPseudoClasses,
  371. resourceStatePseudoClasses,
  372. vendorSpecificPseudoClasses,
  373. deprecatedPseudoClasses,
  374. [
  375. 'active-view-transition-type',
  376. 'active-view-transition',
  377. 'active',
  378. 'any-link',
  379. 'autofill',
  380. /*
  381. introduced the 10/05/2016 by 8c808d0
  382. as of 2024 it is still not supported by any browser
  383. */
  384. 'blank',
  385. 'checked',
  386. 'current',
  387. 'default',
  388. 'defined',
  389. 'disabled',
  390. 'empty',
  391. 'enabled',
  392. 'even-less-good-value',
  393. 'first-child',
  394. 'first-of-type',
  395. 'focus-visible',
  396. 'focus-within',
  397. 'focus',
  398. 'fullscreen',
  399. 'future',
  400. 'has-slotted',
  401. 'heading',
  402. 'high-value',
  403. 'host-context',
  404. 'host',
  405. 'hover',
  406. 'in-range',
  407. 'indeterminate',
  408. 'invalid',
  409. 'last-child',
  410. 'last-of-type',
  411. 'link',
  412. 'low-value',
  413. 'modal',
  414. 'only-child',
  415. 'only-of-type',
  416. 'open',
  417. 'optimal-value',
  418. 'optional',
  419. 'out-of-range',
  420. 'past',
  421. 'picture-in-picture',
  422. 'placeholder-shown',
  423. 'popover-open',
  424. 'read-only',
  425. 'read-write',
  426. 'required',
  427. 'root',
  428. 'scope',
  429. 'state',
  430. 'suboptimal-value',
  431. 'target',
  432. 'unchecked',
  433. 'unresolved',
  434. 'user-invalid',
  435. 'user-valid',
  436. 'valid',
  437. 'visited',
  438. 'window-inactive', // for ::selection (chrome)
  439. ],
  440. );