Skip to content

Styling in Jac#

This guide covers all styling approaches available in Jac web applications. Each approach is demonstrated with a complete, working counter application example.

Quick Navigation#

Available Examples#

Styling Approach Documentation Example Location
Pure CSS Traditional CSS with external stylesheet examples/css-styling/pure-css/
Tailwind CSS Utility-first CSS framework examples/css-styling/tailwind-example/
Sass/SCSS CSS preprocessor with variables, mixins, nesting examples/css-styling/sass-example/
Styled Components CSS-in-JS with styled-components examples/css-styling/styled-components/
JavaScript Styling Inline styles using JavaScript objects examples/css-styling/js-styling/
Material-UI React component library with Material Design examples/css-styling/material-ui/

Styling Approaches Overview#

Traditional CSS#

  • Pure CSS: Standard CSS with external stylesheets
  • Maximum control, minimal dependencies
  • Perfect for simple projects and learning

CSS Preprocessors#

  • Sass/SCSS: Variables, nesting, mixins, and functions
  • Better organization for large projects
  • DRY principles with reusable code

Utility-First CSS#

  • Tailwind CSS: On-demand utility classes
  • Rapid UI development
  • Consistent design system

CSS-in-JS Libraries#

  • Styled Components: CSS-in-JS with template literals
  • Component-scoped styles
  • Dynamic styling with props

  • JavaScript Styling: Inline styles using JavaScript objects

  • Programmatic style generation
  • Dynamic styles based on state

Component Libraries#

  • Material-UI: Comprehensive React component library
  • Pre-built, accessible components
  • Material Design system

Choosing the Right Approach#

Decision Matrix#

Approach Complexity Bundle Size Runtime Cost Best For
Pure CSS Low Small None Simple projects
Tailwind Medium Small* None Rapid development
Sass/SCSS Medium Small None Large projects
Styled Components Medium Medium Medium Component libraries
JavaScript Styling Low Small Low Dynamic styles
Material-UI Low Large Low Enterprise apps

*Tailwind bundle size is small after purging unused classes.

Quick Decision Guide#

Choose Pure CSS if:

  • Building a simple application
  • Wanting minimal dependencies
  • Learning CSS fundamentals

Choose Tailwind CSS if:

  • Building modern UIs quickly
  • Preferring utility classes
  • Needing responsive design

Choose Sass/SCSS if:

  • Working on large projects
  • Needing variables and mixins
  • Wanting better organization

Choose Styled Components if:

  • Wanting component-scoped styles
  • Needing dynamic styling
  • Preferring CSS-in-JS

Choose JavaScript Styling if:

  • Needing dynamic styles
  • Preferring JavaScript
  • Building component libraries

Choose Material-UI if:

  • Wanting pre-built components
  • Needing accessibility
  • Preferring Material Design

Import Syntax#

All styling approaches use the cl import syntax for client-side imports:

CSS Files#

# Pure CSS
cl import ".styles.css";

# Sass/SCSS
cl import ".styles.scss";

JavaScript Modules#

# Default export
cl import from .styles { default as styles }

# Named exports
cl import from .styled { Container, Card, Button }

External Packages#

# Styled Components
cl import from "styled-components" { default as styled }

# Material-UI
cl import from "@mui/material/Button" { default as Button }
cl import from "@mui/icons-material/Add" { default as AddIcon }

Running Examples#

Each example is a complete, runnable project:

# Navigate to example directory
cd jac_client/examples/css-styling/<example-name>

# Install dependencies
npm install

# Run the application
jac serve app.jac

Best Practices#

General Styling#

  1. Consistency: Choose one approach per project
  2. Performance: Consider bundle size and runtime cost
  3. Maintainability: Keep styles organized and documented
  4. Accessibility: Ensure styles don't break accessibility
  5. Responsive: Design mobile-first

CSS Files#

  1. Organization: Use comments to separate sections
  2. Naming: Use semantic class names (BEM, etc.)
  3. Specificity: Avoid overly specific selectors
  4. Variables: Use CSS custom properties for theming

CSS-in-JS#

  1. Scoping: Leverage component-scoped styles
  2. Performance: Memoize expensive styled components
  3. Theming: Use theme providers for global styles
  4. Props: Keep prop-based styling simple

Component Libraries#

  1. Customization: Use theme system for brand colors
  2. Variants: Prefer built-in variants when possible
  3. Composition: Compose components for flexibility
  4. Accessibility: Use accessible components by default

Resources#

Upcoming Styling Patterns

The following styling approaches are planned for documentation in Jac, but full code examples are coming soon: --- CSS-in-JS Libraries
  • Emotion: CSS-in-JS with similar API to styled-components
  • Styled JSX: CSS-in-JS (Next.js style)
CSS Modules
  • CSS Modules: Scoped CSS with local class names
Modern CSS
  • CSS Variables (Custom Properties): Native CSS variables for theming
  • PostCSS: CSS transformations and plugins
Component Libraries
  • Chakra UI: Modular and accessible component library
  • Ant Design: Enterprise-focused component library
  • Radix UI: Unstyled, accessible primitives
  • Mantine: Full-featured React components
CSS Frameworks
  • Bulma: Flexbox-based CSS framework
  • Foundation: Responsive framework
  • Semantic UI: Natural language class names
Zero-runtime CSS-in-JS
  • Vanilla Extract Type-safe, zero-runtime CSS-in-JS
  • Linaria Zero-runtime CSS-in-JS
  • Stitches CSS-in-JS with variants API
Utility-first
  • UnoCSS On-demand atomic CSS engine
Examples for these patterns will be added soon.

Contributing#

When adding new styling examples:

  1. Create a new directory in examples/css-styling/
  2. Include a complete working counter app
  3. Add a README.md with setup instructions
  4. Create a documentation file in docs/styling/
  5. Update this intro.md file
  6. Follow the existing example structure