modify-selectors.test.js 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import selectorParser from 'postcss-selector-parser'
  2. import { run, html, css } from './util/run'
  3. test('modify selectors', () => {
  4. let config = {
  5. darkMode: 'class',
  6. content: [
  7. {
  8. raw: html`
  9. <div class="font-bold"></div>
  10. <div class="foo:font-bold"></div>
  11. <div class="foo:hover:font-bold"></div>
  12. <div class="sm:foo:font-bold"></div>
  13. <div class="md:foo:focus:font-bold"></div>
  14. <div class="markdown">
  15. <p>Lorem ipsum dolor sit amet...</p>
  16. </div>
  17. <div class="foo:markdown">
  18. <p>Lorem ipsum dolor sit amet...</p>
  19. </div>
  20. <div class="foo:visited:markdown">
  21. <p>Lorem ipsum dolor sit amet...</p>
  22. </div>
  23. <div class="lg:foo:disabled:markdown">
  24. <p>Lorem ipsum dolor sit amet...</p>
  25. </div>
  26. `,
  27. },
  28. ],
  29. corePlugins: { preflight: false },
  30. theme: {},
  31. plugins: [
  32. function ({ addVariant }) {
  33. addVariant('foo', ({ modifySelectors, separator }) => {
  34. modifySelectors(({ selector }) => {
  35. return selectorParser((selectors) => {
  36. selectors.walkClasses((classNode) => {
  37. classNode.value = `foo${separator}${classNode.value}`
  38. classNode.parent.insertBefore(classNode, selectorParser().astSync(`.foo `))
  39. })
  40. }).processSync(selector)
  41. })
  42. })
  43. },
  44. ],
  45. }
  46. let input = css`
  47. @tailwind components;
  48. @tailwind utilities;
  49. @layer components {
  50. .markdown > p {
  51. margin-top: 12px;
  52. }
  53. }
  54. `
  55. return run(input, config).then((result) => {
  56. expect(result.css).toMatchFormattedCss(css`
  57. .markdown > p {
  58. margin-top: 12px;
  59. }
  60. .font-bold {
  61. font-weight: 700;
  62. }
  63. .foo .foo\:markdown > p,
  64. .foo .foo\:visited\:markdown:visited > p {
  65. margin-top: 12px;
  66. }
  67. @media (min-width: 1024px) {
  68. .foo .lg\:foo\:disabled\:markdown:disabled > p {
  69. margin-top: 12px;
  70. }
  71. }
  72. .foo .foo\:font-bold,
  73. .foo .foo\:hover\:font-bold:hover {
  74. font-weight: 700;
  75. }
  76. @media (min-width: 640px) {
  77. .foo .sm\:foo\:font-bold {
  78. font-weight: 700;
  79. }
  80. }
  81. @media (min-width: 768px) {
  82. .foo .md\:foo\:focus\:font-bold:focus {
  83. font-weight: 700;
  84. }
  85. }
  86. `)
  87. })
  88. })