Code Monkey home page Code Monkey logo

panda-plugin-ct's Introduction

panda-plugin-ct

Allows aliases to tokens without generating alias-level class names.

The plugin allows you to structure your tokens in a way makes sense to you, and does not need to adhere to Panda's token structure.

// panda.config.ts

import { defineConfig } from '@pandacss/dev';
import { pluginComponentTokens } from 'panda-plugin-ct';

export default defineConfig({
  plugins: [
    pluginComponentTokens({
      alert: {
        background: 'red.500',
        text: 'gray.100',
      },
    }),
  ],
});
// Component code

import { css, ct } from "../../styled-system/css";

<div className={css({
  display: 'flex',
  // Token paths are fully typed
  background: ct('alert.background')
})}>

Which will produce:

<!-- With ct -->
<div class="d_flex bg_red.500" />

<!-- With Panda's semanticTokens -->
<div class="d_flex bg_alert.background" />
/* With ct */
--colors-red-500: #ef4444;

/* With Panda's semanticTokens */
--colors-alert-background: var(--colors-red-500);

.d_flex {
  display: flex;
}

/* With ct */
.bg_red\.500 {
  background: var(--colors-red-500);
}

/* With Panda's semanticTokens */
.bg_alert\.background {
  background: var(--colors-alert-background);
}

Supported syntax

This plugin supports aliasing to Panda's object syntax via a value key, just as you would define semantic tokens in Panda's theme. Anything Panda supports will work, including raw values.

export default defineConfig({
  plugins: [
    pluginComponentTokens({
      alert: {
        background: {
          value: {
            base: 'red.500',
            lg: 'blue.500',
          },
        },
        text: {
          value: '#111',
        },
      },
    }),
  ],
});
<div className={css({
  background: ct('alert.background'),
  color: ct('alert.text'),
})}>

Produces:

<div class="bg_red.500 lg:bg_blue.500 text_#111" />

Further optimization

This plugin generates a performant JS runtime to map paths to their respective class names. This runtime can be completely removed using @pandabox/unplugin, with a transformer exported from this package. Your bundler's config will need to be modified to achieve this.

Example Next.js config:

import unplugin from '@pandabox/unplugin';
import { transform } from 'panda-plugin-ct';

// Your token object
// This should be the same as the object you supplied to the Panda plugin
const tokens = {};

/** @type {import('next').NextConfig} */
const nextConfig = {
  reactStrictMode: true,
  webpack: (config) => {
    config.plugins.push(
      unplugin.webpack({
        transform: transform(tokens),
      }),
    );
    return config;
  },
};

export default nextConfig;

Acknowledgement

  • Jimmy โ€“ for the idea and motivation behind the plugin
  • Alex โ€“ for providing feedback with the plugin's internals and functionality

panda-plugin-ct's People

Contributors

jonambas avatar renovate[bot] avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.