Skip to content

alyssariah/legacy-design-bytes

Repository files navigation

Design Bites

What is this?

There are multiple UI libraries out there including Bootstrap, Angular Material, Material UI, ect. Storybook is a library that allows you to make your own UI Library. I want control over my UI library to tweak components without a lot of work. Therefore here is my library where I take the code I like and place it here for reusability. This repository is also guide to seting up a new project and environment with all my favorite tools.

Setup New Project

Vite Project with React

Get Started With Vite

  • Run in CLI npm create vite@latest
  • Name your new project
  • Choose react for the vite project
  • Go into your new project folder and run npm install
  • Run npm install react-dom react-router-dom sass react-icons
  • Create README.md in your root folder to start documentation
  • Add default server open to vite.config.js Vite Serever
    server: {
      open: '/',
    },
    
  • In the package.json, change script "dev" to "start"
  • Run CLI command npm start and React + Vite App should open up

Tailwind Setup

  • Install tailwind and other classes

    npm install -D tailwindcss postcss autoprefixer
    
  • Initiate tailwing config

    npx tailwindcss init -p
    
  • Tailwind config file

    /** @type {import('tailwindcss').Config} */
    module.exports = {
    content: [
      './src/**/*.{js,jsx,ts,tsx}',
      './src/**/**/*.{js,jsx,ts,tsx}',
      './src/**/**/**/*.{js,jsx,ts,tsx}',
    ],
    theme: {
      screens: {
        'sm': '500px',
        // => @media (min-width: 640px) { ... }
    
        'md': '768px',
        // => @media (min-width: 768px) { ... }
    
        'lg': '1024px',
        // => @media (min-width: 1024px) { ... }
    
        'xl': '1440px',
        // => @media (min-width: 1280px) { ... }
    
        '2xl': '1920px',
        // => @media (min-width: 1536px) { ... }
      },
      colors: {
        transparent: 'transparent',
        primary: 'var(--primary)',
        onPrimary: 'var(--on-primary)',
        primaryContainer: 'var(--primary-container)',
        onPrimaryContainer: 'var(--on-primary-container)',
        secondary: 'var(--secondary)',
        onSecondary: 'var(--on-secondary)',
        secondaryContainer: 'var(--secondary-container)',
        onSecondaryContainer: 'var(--on-secondary-container)',
        tertiary: 'var(--tertiary)',
        onTertiary: 'var(--on-tertiary)',
        tertiaryContainer: 'var(--tertiary-container)',
        onTertiaryContainer: 'var(--on-tertiary-container)',
        error: 'var(--error)',
        onError: 'var(--on-error)',
        errorContainer: 'var(--error-container)',
        onErrorContainer: 'var(--on-error-container)',
        background: 'var(--background)',
        onBackground: 'var(--on-background)',
        surfaceVariant: 'var(--surface-variant)',
        onSurfaceVariant: 'var(--on-surface-variant)',
        outline: 'var(--outline)',
        surface1: 'var(--surface-1)',
        surface2: 'var(--surface-2)',
        surface3: 'var(--surface-3)',
        surface4: 'var(--surface-4)',
        surface5: 'var(--surface-5)',
        navigation: 'var(--navigation-bar)',
        disabled: 'var(--disabled)',
      },
      fontFamily: {
        sans: ['Source Sans Pro', 'sans-serif'],
        serif: ['Merriweather', 'serif'],
      },
      fontSize: {
        'xs': '12px',
        'sm': '14px',
        'tiny': '12px',
        'base': '16px',
        'lg': '20px',
        'xl': '22px',
        '2xl': '24px',
        '3xl': '28px',
        '4xl': '32px',
        '5xl': '36px',
        '6xl': '45px',
        '7xl': '57px',
      },
      fontWeight: {
        'hairline': 100,
        'extra-light': 100,
        'thin': 200,
        'light': 300,
        'normal': 400,
        'medium': 500,
        'semibold': 600,
        'bold': 700,
        'extrabold': 800,
        'extra-bold': 800,
        'black': 900,
      },
      borderRadius: {
        'none': '0',
        'sm': '2px',
        'DEFAULT': '4px',
        'md': '6px',
        'lg': '8px',
        'xl': '12px',
        '2xl': '16px',
        '3xl': '24px',
        'full': '9999px',
        'large': '12px',
      },
    },
    plugins: [],
    };
    
  • Add tailwind classes to index.scss

    @tailwind base;
    @tailwind components;
    @tailwind utilities;
    

Prettier and ESLint

Dev Prettier and ESLint Setup

  • Run npm install eslint --save-dev
  • Create .eslintrc.json by running npx eslint --init
  • Follow directions to get started
  • Replace content in .eslintrc.js file with content in this .eslintrc.js or follow directions on Resource
  • Run npm install eslint-config-prettier eslint-plugin-prettier prettier --save-dev
  • Create .prettierrc and paste the below code:
{
  "semi": true,
  "tabWidth": 2,
  "printWidth": 100,
  "singleQuote": true,
  "trailingComma": "es5",
  "quoteProps": "consistent",
  "htmlWhitespaceSensitivity": "ignore"
}
  • Create .prettierignore and paste the below code:
node_modules
storybook-static
build
.github
  • Add the following scripts to your package.json:
"lint": "eslint .",
"lint:fix": "eslint --fix",
"format": "prettier --write './**/*.{js,jsx,ts,tsx,css,md,json}' --config ./.prettierrc",
  • Run scripts npm run format and npm run lint to make sure they are working

Husky and Lint Staged

Prettier Resource

  • Run git init
  • Connect to remote repo on github with git remote add origin REPO
  • Push code to main branch on remote repo
  • Run npx mrm@2 lint-staged to install husky and lint-staged. this will create a script in package.json and create .husky directory
  • Change lint-staged script in package.json to be:
  "lint-staged": {
    "**/*.{js,jsx}": [
      "npm run lint",
      "npm run format"
    ]
  },
  • Feel free to go into pre-commit file to add tests
  • Go ahead and git commit to see pre-commit hook work in action

Storybook

Storybook Blog Post @storybook/builder-vite Repo

  • Run npx sb init --builder @storybook/builder-vite
  • Change stories array in .storybook/main.js to be:
  "stories": [
    '../src/stories/*.stories.mdx',
    '../src/stories/*.stories.@(js|jsx|ts|tsx)',
    '../src/stories/**/*.stories.mdx',
    '../src/stories/**/*.stories.@(js|jsx|ts|tsx)',
    '../src/stories/**/**/*.stories.mdx',
    '../src/stories/**/**/*.stories.@(js|jsx|ts|tsx)',
    '../src/stories/**/**/**/*.stories.mdx',
    '../src/stories/**/**/**/*.stories.@(js|jsx|ts|tsx)'
  ],
  • Run npm install @storybook/addon-a11y --save-dev
  • Add the addon-a11y to the .storybook/main.js
  "addons": [
    "@storybook/addon-links",
    "@storybook/addon-essentials",
    "@storybook/addon-interactions",
    '@storybook/addon-a11y',
  ],
  • Run npm run storybook
  • Change css files to scss files
  • Drop scss folder into src folder
  • Change content in index.scss to the content in the index.scss
  • Delete stories folder and add in this stories folder
  • Rerun npm run storybook

Chromatic

  • Visit your chromatic account and add a new project with this new repo
  • Run npm install --save-dev chromatic
  • Run npx chromatic --project-token={TOKEN} and this should give you the option to create a chromatic script
  • Add in secrets for Project Token and Admin token in Github Repo
  • Push up changes to your remote repo
  • Create a github action called "chromatic.yml" and include the following for automatic deployment to chromatic on push to main
# Workflow name
name: 'Chromatic Deployment'

# Event for the workflow
on:
  push:
    branches: [ main ]

# List of jobs
jobs:
  test:
    # Operating System
    runs-on: ubuntu-latest
    # Job steps
    steps:
      - uses: actions/checkout@v1
      - run: yarn
        #👇 Adds Chromatic as a step in the workflow
      - uses: chromaui/action@v1
        # Options required for Chromatic's GitHub Action
        with:
          #👇 Chromatic projectToken, see https://storybook.js.org/tutorials/intro-to-storybook/react/en/deploy/ to obtain it
          projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
          token: ${{ secrets.ADMIN_TOKEN }}

  • View Github Action pass with new build in Chromatic

Dependencies

About

Personal reusable UI library based off design systems

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages