Skip to content

Instantly share code, notes, and snippets.

@onmax
Created April 19, 2022 17:21
Show Gist options
  • Save onmax/6e626ac62d8f5edb9b4f1a9ffac13227 to your computer and use it in GitHub Desktop.
Save onmax/6e626ac62d8f5edb9b4f1a9ffac13227 to your computer and use it in GitHub Desktop.
A custom UnoCSS rule to be able to select items like `nth-2:text-blue` or `nth-9:rounded-9`
import { defineConfig, toEscapedSelector: e } from 'unocss'
// See it in action:
// https://unocss.antfu.me/?html=DwVwNgBAdgLgFgWgEwC4YFMAeMECMwjrTwIDMKuA5ngUZQE4CWAJhAywgMYD2YAzmQgAHMAENO6BIwwBbARNjp6ERH07106KACgIetqKEJMCACwA%2BXRGBhG5gJKyIARmAB6W5b027j9DIgkd08rHwcnUmC7bXdwcyA&config=JYWwDg9gTgLgBAbzgEwKYDNgDtUGEJaYDmANHDBAKIDOAxgIZirIDKqANqrRVAFxyo4AXzjooEEHADkAVywRa1alIBQK1AA9IsFBnoz28NJhz5CwIgAoEKuHCgHU1fgG1bduC4D0APSwwACwAdAFpLIOQAagBKIN5LADoAKmiAEi8yemoATyxaOEsXMmQyKABdMgQoegB3Nk5uaDJaAmoYB25cFhYyIlQcap4haLgAXgA%2BRDh3DzgWrDb7RzG4WvpgeEs%2BgfoeBLB6KGpUABUIAGt%2Byyho6JmPKFQYGSgsOAADVIRUa9r6rh40REkySvH8ARCtACwHYyEsX2QwymXwcnBcAAYyi4AExlERCd73IQVdxlFTDIA&options=N4IgzgLgTglgxhEAuaBXApgXyA
export default defineConfig({
rules: [
[/^nth\-(\d+)\:(.*)$/, async ([, d, r], {rawSelector, constructCSS, generator}) => {
const rule = await (generator.parseToken(r))
return `${e(rawSelector)} > *:nth-child(${d}) { ${rule[0][2]} }`
}],
]
})
@jojojojojoj5564656465465

Amazing but now you can do [&>li]:text-red

@jojojojojoj5564656465465

Could you give me your opinion on mine :

    [
      /^flex-(row|col)-(\d)$/,
      ([, direction, number]) => {
        function dd(d: 'row' | 'col'): string {
          if (d === 'row') {
            return 'row'
          } else {
            return 'column'
          }
        }
        function area(n: number): string[] {
          let position: string[]
          switch (n) {
            case 1:
              position = ['start', 'start']
              break
            case 2:
              position = ['center', 'start']
              break
            case 3:
              position = ['end', 'start']
              break
            case 4:
              position = ['start', 'center']
              break
            case 5:
              position = ['center', 'center']
              break
            case 6:
              position = ['end', 'center']
              break
            case 7:
              position = ['start', 'end']
              break
            case 8:
              position = ['center', 'end']
              break
            case 9:
              position = ['end', 'end']
              break

            default:
              position = []
              break
          }
          return position
        }

        let direction2 = dd(direction as 'row' | 'col')
        let number2 = area(Number(number))
        return {
          display: 'flex',
          'flex-direction': direction2,
          'justify-content': number2[0],
          'align-items': number2[1],
        }
      },
    ]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment