DEV Community

Konnor Rogers
Konnor Rogers

Posted on

Using Shoelace with Vite Rails

Purpose

To provide a reusable reference for myself to add Shoelace to a ViteRails project.

Setup ViteRails

I will not cover this here. Instead go check out the ViteRails documentation here: https://vite-ruby.netlify.app/guide/
And come back once youre all setup!

Install Packages

1.) Install Shoelace and rollup-plugin-copy via yarn

yarn install @shoelace-style/shoelace rollup-plugin-copy

Setup CSS entrypoint file

When using vite I usually have a file called:

app/frontend/entrypoints/application.css

This is my entrypoint CSS file.

Heres what it should look like:

/* app/frontend/entrypoints/application.css */
@import '@shoelace-style/shoelace/dist/shoelace/themes/base.css';

/* if you want to use the dark theme, uncomment this */
/* @import '@shoelace-style/shoelace/dist/shoelace/themes/dark.css'; */
Enter fullscreen mode Exit fullscreen mode

Setup JS entrypoint file

In Vite, you will also have a app/frontend/entrypoints/application.js file. In this file, add the following lines:

// app/frontend/entrypoints/application.js

import './application.css'

// import shoelace components here

import { setBasePath } from '@shoelace-style/shoelace/dist/utilities/base-path.js'

const mode = import.meta.env.MODE || "development"

const paths = {
  production: "",
  development: "-dev",
  test: "-test"
}

let rootUrl = `/vite${paths[mode]}`
setBasePath(rootUrl)
Enter fullscreen mode Exit fullscreen mode

Setup vite.config.ts

Finally, setup your vite.config.ts like so:

// vite.config.ts

import { defineConfig } from 'vite'
import RubyPlugin from 'vite-plugin-ruby'
import * as path from "path"
import copy from 'rollup-plugin-copy';

const mode = process.env.NODE_ENV || "development"

const paths = {
  production: ``,
  development: `-dev`,
  test: `-test`
}
const vitePath = `public/vite${paths[mode]}/assets`

export default defineConfig({
  build: {
    rollupOptions: {
      plugins: [
        copy({
          targets: [
            {
              src: path.resolve(__dirname, 'node_modules/@shoelace-style/shoelace/dist/assets/icons'),
              dest: path.resolve(__dirname, vitePath)
            }
          ],
          // https://github.com/vitejs/vite/issues/1231
          hook: 'writeBundle'
        })
      ]
    }
  },
  plugins: [
    RubyPlugin(),
  ],
})
Enter fullscreen mode Exit fullscreen mode

and BAM! youre good to go!

Sorry this was so brief and I don't have any examples to share, this was a quick down and dirty that I may revise in the future.

Top comments (1)

Collapse
 
marcushwz profile image
MarcusZ

Hi, thank you for writing this. Do you have an updated version of how you would do it?

After following the guide, a few things I have to change:

  1. The css is from '@shoelace-style/shoelace/dist/themes/light.css';

Also, I couldn't get the icons to work, I think that is related to how the basePath is set. How did you do it on local development? Do you recommend installing shoelace via CDN or bundling?