Frontend
React

React

React, a remarkable open-source front-end JavaScript library, empowers developers to craft stunning user interfaces or UI components. Facebook and an engaged community of developers and companies ensure its maintenance. In the development of single-page or mobile applications, React serves as an exceptional foundation.

Here at Lucky Media, we're smitten with React for web/desktop projects and React Native for mobile applications.

Websites

Get off to a flying start with our phenomenal Next Starter (opens in a new tab) powered by Next.js.

Our Next Starter is a fantastic boilerplate that includes:

  • TailwindCSS
  • Self-hosted Google Fonts via FontSource (opens in a new tab)
  • Prettier and ESLint
  • Husky with pre-commit hooks for linting and fixing
  • Responsive menu-ready Layout Component
  • React Inline SVG for rendering SVGs
  • JS Config aliases

Components

We champion the use of tiny, composable Components woven with Tailwind to construct resilient UIs.

Take a peek at this Text Component example utilizing React:

import React from 'react'
 
const Paragraph = ({ children, className, ...props }) => {
    return (
    <p {...props} className={`font-medium text-base text-gray-200 ${className}`}>
      {children}
    </p>
    )
}

Now, feast your eyes on this Button component with multiple sizes and variants:

import React, { forwardRef } from 'react'
import { cls } from '../utils/helpers'
 
const classes = {
    base: 'focus:outline-none transition ease-in-out duration-300',
    disabled: 'opacity-50 cursor-not-allowed',
    pill: 'rounded-full',
    size: {
        small: 'px-2 py-1 text-sm',
        normal: 'px-4 py-2',
        large: 'px-8 py-3 text-lg'
    },
    variant: {
        primary: 'bg-blue-500 hover:bg-blue-800 focus:ring-2 focus:ring-blue-500 focus:ring-opacity-50 text-white',
        secondary: 'bg-gray-200 hover:bg-gray-800 focus:ring-2 focus:ring-gray-500 focus:ring-opacity-50 text-gray-900 hover:text-white',
        danger: 'bg-red-500 hover:bg-red-800 focus:ring-2 focus:ring-red-500 focus:ring-opacity-50 text-white'
    }
}
 
const Button = forwardRef(
    (
        {
            children,
            type = 'button',
            className,
            variant = 'primary',
            size = 'normal',
            pill,
            disabled = false,
            ...props
        }, ref
    ) => (
        <button
            ref={ref}
            disabled={disabled}
            type={type}
            className={cls(`
                ${classes.base}
                ${classes.size[size]}
                ${classes.variant[variant]}
                ${pill && classes.pill}
                ${disabled && classes.disabled}
                ${className}
            `)}
            {...props}
        >
            {children}
        </button>
    ));
 
export default Button

With the cls function, class rendering becomes a breeze while keeping the whitespace tidy. Here's the code for this handy function:

export const cls = (input) =>
    input
        .replace(/\s+/gm, " ")
        .split(" ")
        .filter((cond) => typeof cond === "string")
        .join(" ")
        .trim();