# XRPL Styles

This folder contains the source files for the XRP Ledger Dev Portal CSS. The optimized, minified version of these styles is `/static/css/devportal2024-v1.css`.

## Build Pipeline

The CSS build uses a modern optimization pipeline:

1. **Sass** - Compiles SCSS to CSS
2. **PostCSS** - Processes CSS with plugins:
  - **PurgeCSS** - Removes unused CSS (production only)
  - **Autoprefixer** - Adds vendor prefixes for browser compatibility
  - **cssnano** - Minifies and optimizes CSS (production only)


### Performance Improvements

The optimized build dramatically improves CSS delivery:

| Metric | Before | After | Improvement |
|  --- | --- | --- | --- |
| **Uncompressed** | 486.64 KB | 280.92 KB | **42% smaller** |
| **Gzipped (network)** | 71.14 KB | 43.32 KB | **39% smaller** |


This improves page load times, developer experience (DevTools filter: 60s → <1s), and reduces bandwidth costs.

## Prerequisites

All dependencies are automatically installed via NPM:

```sh
npm install
```

Key dependencies:

- `sass` - SCSS compiler
- `postcss-cli` - PostCSS command-line interface
- `@fullhuman/postcss-purgecss` - Removes unused CSS
- `autoprefixer` - Browser compatibility
- `cssnano` - CSS minification


## Building

### Production Build

For production deployments with full optimization:

```sh
npm run build-css
```

Includes: PurgeCSS, autoprefixer, minification (no source maps)

### Development Build

For local development with debugging:

```sh
npm run build-css:dev
```

Includes: Autoprefixer, source maps (no PurgeCSS for faster builds)

### Watch Mode

For continuous compilation during development:

```sh
npm run build-css:watch
```

Auto-rebuilds on file changes with source maps

### Analysis

To analyze the CSS bundle composition:

```sh
npm run analyze-css
```

This shows:

- Bundle size and selector counts
- Bootstrap component usage
- Custom component patterns
- Optimization recommendations


## Files Structure

### Main Entry Point

- `xrpl.scss` - Master file that imports all other SCSS files, Bootstrap, and defines variables


### Component Styles

Each `_*.scss` file contains styles for specific components:

- `_colors.scss` - Color palette and variables
- `_font-face.scss` - Font definitions
- `_font.scss` - Typography styles
- `_layout.scss` - Page layout and grid
- `_buttons.scss` - Button styles
- `_forms.scss` - Form controls
- `_cards.scss` - Card components
- `_nav-*.scss` - Navigation components (top-nav, side-nav)
- `_content.scss` - Content area styles
- `_blog.scss` - Blog-specific styles
- `_dev-tools.scss` - Developer tools styles
- `_rpc-tool.scss` - RPC tool interface
- `_tables.scss` - Table styles
- `_footer.scss` - Footer styles
- `_callouts.scss` - Callout/alert boxes
- `_diagrams.scss` - Diagram styles
- `_print.scss` - Print media styles
- `light/_light-theme.scss` - Light theme overrides


## Configuration

### PostCSS Configuration

The PostCSS pipeline is configured in `postcss.config.cjs` at the project root.

**PurgeCSS Safelist:**

- Scans all `.tsx`, `.md`, `.yaml`, and `.html` files for class names
- Preserves dynamically-added classes (Bootstrap JS components, CodeMirror, etc.)
- Keeps state classes (`active`, `disabled`, `show`, etc.)
- Only runs in production builds


### Sass Configuration

Sass is configured via command-line flags in `package.json`:

- `--load-path styles/scss` - Additional import paths
- `--source-map` - Generate source maps (dev only)


## Troubleshooting

### "Classes are missing after build"

If you find missing styles after a production build:

1. Check if the class is dynamically added via JavaScript
2. Add the class pattern to the safelist in `postcss.config.cjs`
3. Rebuild: `npm run build-css`


Example safelist patterns:

```js
deep: [
  /my-dynamic-class/, // Keeps .my-dynamic-class and children
]
```

### "Build is too slow"

For development, use:

```sh
npm run build-css:watch  # Watch mode (no PurgeCSS)
# or
npm run build-css:dev    # One-time dev build (no PurgeCSS)
```

### "Seeing Sass deprecation warnings"

The warnings about `@import` are from Bootstrap 5's use of legacy Sass syntax. They're harmless and will be resolved when Bootstrap updates to the new `@use` syntax.

## Adding New Styles

When adding new component styles:

1. Create `_component-name.scss` in this directory
2. Add `@import "_component-name.scss";` to `xrpl.scss`
3. If using dynamic classes, add them to the PurgeCSS safelist in `postcss.config.cjs`
4. Test: `npm run build-css:dev` (dev) and `npm run build-css` (prod)
5. Analyze: `npm run analyze-css`


## Further Reading

See `CSS-OPTIMIZATION.md` in the project root for detailed information about the optimization implementation and migration process.