Project Icon

rainbow-sprinkles

为 vanilla-extract 提供动态主题驱动的样式属性工具

Rainbow Sprinkles 是一个基于 vanilla-extract 的样式属性工具,支持动态主题和自定义 CSS 属性。它生成的 CSS 体积更小,支持灵活的动态值和内联样式变量。该工具保留了 TypeScript 编辑器提示功能,适用于追求高度定制和性能的前端开发项目。

彩虹糖霜 🧁

vanilla-extract 提供动态、主题驱动的样式属性

发布 许可证: MIT 贡献者公约 维护者

彩虹糖霜的工作方式类似于 @vanilla-extract/sprinkles。与 sprinkles 一样,它在构建时生成自定义 CSS 实用类。而 sprinkles 需要预定义可用值列表,彩虹糖霜使用 CSS 自定义属性,通过内联样式变量分配允许动态值。

与 sprinkles 相比:

  • 彩虹糖霜生成的 CSS 更少。 对于每个属性,Sprinkles 生成的 CSS 量级是 [预定义值] * [可能的条件]。彩虹糖霜生成的 CSS 只随条件数量增加而增加。
  • 支持动态值。 彩虹糖霜使用动态内联样式分配来设置每个属性的值。你仍然可以获得 TypeScript 编辑器的建议,但可以使用该属性的任何有效 CSS 值。

function App() {
  return (
    // 使用预定义值
    <Box bg="$blue50" margin="$large">
      {/* 或任何有效的 CSS 值 */}
      <Box textAlign="center" fontSize="30px">
        Hello world!
      </Box>
    </Box>
  );
}

在这里查看 Stackblitz 演示!


设置

安装彩虹糖霜。

npm install rainbow-sprinkles

创建一个 rainbow-sprinkles.css.ts 文件,然后创建并导出你的 rainbowSprinkles 函数:

// rainbow-sprinkles.css.ts
import { defineProperties, createRainbowSprinkles } from 'rainbow-sprinkles';

// 或导入主题(例如 `createTheme`、`createThemeContract`)
const vars = {
  space: {
    none: '0',
    small: '4px',
    medium: '8px',
    large: '16px',
    // 等等
  },
  colors: {
    blue50: '#eff6ff',
    blue100: '#dbeafe',
    blue200: '#bfdbfe',
    gray700: '#374151',
    gray800: '#1f2937',
    gray900: '#111827',
    // 等等
  },
};

const responsiveProperties = defineProperties({
  conditions: {
    mobile: {},
    tablet: { '@media': 'screen and (min-width: 768px)' },
    desktop: { '@media': 'screen and (min-width: 1024px)' },
  },
  defaultCondition: 'mobile',
  dynamicProperties: {
    // 定义预设值,将自动提示
    color: vars.colors,
    backgroundColor: vars.colors,
    margin: vars.space,
    marginTop: vars.space,
    marginLeft: vars.space,
    marginRight: vars.space,
    marginBottom: vars.space,
    // 可以使用任何 CSS 值
    display: true,
    textAlign: true,
    flexDirection: true,
    justifyContent: true,
    alignItems: true,
  },
  staticProperties: {
    // 构建不使用 CSS 变量的实用类
    display: ['block', 'flex', 'inline-block', 'inline-flex'],
  },
  shorthands: {
    bg: ['backgroundColor'],
    m: ['margin'],
    mr: ['marginRight'],
    ml: ['marginLeft'],
    mt: ['marginTop'],
    mb: ['marginBottom'],
    marginX: ['marginLeft', 'marginRight'],
    marginY: ['marginTop', 'marginBottom'],
    mx: ['marginLeft', 'marginRight'],
    my: ['marginTop', 'marginBottom'],
  },
});

export const rainbowSprinkles = createRainbowSprinkles(responsiveProperties);

export type Sprinkles = Parameters<typeof rainbowSprinkles>[0];

然后在你的"宿主"组件中进行设置(在这个例子中是一个 Box 组件):

// Box.tsx
import { rainbowSprinkles, Sprinkles } from './rainbow-sprinkles.css';

interface BoxProps extends Sprinkles {
  children?: React.ReactNode;
}

export const Box = ({ children, ...props }: BoxProps) => {
  const { className, style, otherProps } = rainbowSprinkles(props);

  return (
    <div className={className} style={style} {...otherProps}>
      {children}
    </div>
  );
};

🎉 准备就绪!

// App.tsx
import { Box } from './Box';

function App() {
  return (
    // 使用预定义值
    <Box bg="$blue50" margin="$medium $large">
      {/* 或任何有效的 CSS 值 */}
      <Box textAlign="center" fontSize={{ mobile: '16px', desktop: '32px' }}>
        Hello world!
      </Box>
    </Box>
  );
}

CSS 层

你可以为给定的属性集定义一个 CSS 层

// rainbow-sprinkles.css.ts
import { layer } from '@vanilla-extract/css';
import { defineProperties } from 'rainbow-sprinkles';

export const sprinklesLayer = layer();

const properties = defineProperties({
  '@layer': sprinklesLayer
  // 等等
});

dynamicPropertiesstaticProperties

支持动态值的一个代价是我们必须增加文档的大小。不是仅仅向元素添加一个类来添加样式,而是同时添加一个实用类和内联样式分配。虽然这种设置在许多情况下仍会产生更小的整体包大小,但一些大型应用可能会观察到特定 CSS 属性和值组合的频繁重复出现。在这些情况下,可以在初始配置中将这些组合设置在 staticProperties 中。staticProperties 将生成典型的 CSS 实用类。Rainbow Sprinkles 的运行时部分将优先使用 staticProperties 创建的 CSS 类,而不应用任何内联样式分配。

这里有一个可能有价值的场景示例。你的组织设置了 Rainbow Sprinkles 并得到了广泛采用。你的指标显示最常用的属性/值组合是 display="flex" 和使用应用主题变量的 margin。你可以运行一个实验来评估将这些属性/值组合设为静态是否能改善包大小。

createRainbowSprinkles({
  dynamicProperties: {
    // 仍然支持任意值
    display: true,
    margin: true,
  },
  staticProperties: {
    // 同时生成固定的 CSS 类
    display: ['flex'],
    margin: vars.space,
  },
});

贡献

贡献是使开源社区成为学习、激励和创造的绝佳场所的原因。我们非常感谢你做出的任何贡献。有关详细的贡献指南,请参阅 CONTRIBUTING.md

致谢

  • Vanilla Extract 创造了创新且可配置的 CSS 预处理器
  • Styled System 发明了主题驱动的样式属性
  • Homebase,Wayfair 的设计系统,提供了有趣的问题来解决

许可证

根据 MIT 许可证分发。更多信息请参见 LICENSE

联系方式

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号