start-ui-web
start-ui-web copied to clipboard
๐ Start UI [web] is an opinionated UI starter with ๐ฆ TypeScript, โ๏ธ React, โซ๏ธ NextJS, โก๏ธ Chakra UI, ๐ฆ tRPC, โฒ Prisma, ๐๏ธ TanStack Query, ๐ Storybook, ๐ญ Playwright,๐ React Hook Form,โฝFrom the...
๐ Start UI [web] is an opinionated frontend starter repository created & maintained by the BearStudio Team and other contributors. It represents our team's up-to-date stack that we use when creating web apps for our clients.
Getting Started
npx create-start-ui@latest --web myApp
That will scaffold a new folder with the latest version of ๐ Start UI [web] ๐
Then just go to the created folder and start the dev server.
cd myApp
yarn dev
Technology
- ๐ฆ TypeScript
- โ๏ธ React
- โฒ NextJS (with Static Export)
- ๐ Storybook
- โ๏ธ React Router
- โก๏ธ Chakra UI
- โ๏ธ React Query
- ๐ Formiz
- ๐ฅ React Error Boundary
- โญ๏ธ React Icons
- ๐ React i18next
- ๐ฝ React Select
- ๐ข React Currency Input Field
- โ Axios
- ๐ Day.js
- ๐ฎ Cypress
๐ Technology Choices
โน๏ธ API calls are mapped on a JHipster backend application.
Features
- Reponsive layout / navigation.
- Sign / Sign Up / Password recovery screens.
- Account profile / Change Password screens.
- Users management admin screens (CRUD).
- Multi-languages (English & French built-in).
- Custom Chakra UI theme with preview of customized components in Storybook.
- Extra UI components with Storybook documentation.
- Fields components for Formiz.
- Dark mode support with Storybook toggle.
- App version & Environment name in the UI.
- API Schema documentation via Swagger UI React.
- API Mocking with persisting state via MirageJS.
Installation
yarn install
yarn build
Development
yarn dev
Storybook
yarn storybook
Update theme typing
When adding or updating theme components, component variations, sizes, colors and other theme foundations, you can extend the internal theme typings to provide nice autocomplete.
Just run the following command after updating the theme:
yarn theme:generate-typing
Generate custom icons components from svg files
Put the custom svg files into the src/components/Icons/svg-sources
folder and then run the following command:
yarn theme:generate-icons
โ ๏ธ All svg icons should be svg files prefixed by
icon-
(example:icon-externel-link
) with 24x24px size, only one shape and filled with#000
color (will be replaced bycurrentColor
).
Development with MirageJS (mock)
This is the default behavior.
Do not set the NEXT_PUBLIC_API_BASE_URL
variable in the .env
file at the root of the project.
Development with a JHipster backend
Create a .env
file at the root of the project with the following content:
NEXT_PUBLIC_API_BASE_URL=http://localhost:8080/api
Show hint on development environments
Setup the NEXT_PUBLIC_DEV_ENV_NAME
env variable with the name of the environment.
NEXT_PUBLIC_DEV_ENV_NAME=staging
NEXT_PUBLIC_DEV_ENV_COLOR_SCHEME=teal
API Documentation
API documentation is accessible by admins in the app with Swagger-UI.
yarn docs:build
This will build the json documentation from the main file /src/mocks/openapi/openapi.yaml
.
Translations
Setup the i18n Ally extension
We recommended using the i18n Ally plugin for VS Code for translations management.
Create or edit the .vscode/settings.json
file with the following settings:
{
"i18n-ally.localesPaths": ["src/locales"],
"i18n-ally.keystyle": "nested",
"i18n-ally.enabledFrameworks": ["general", "react", "i18next"],
"i18n-ally.namespace": true,
"i18n-ally.defaultNamespace": "common",
"i18n-ally.extract.autoDetect": true,
"i18n-ally.keysInUse": ["common.languages.*"]
}
Guidelines for translations
- Use namespaces
t('namespace:translationKey')
and nestingt('namespace:this.is.nested')
.
// Example for translations available in account.json
t('account:data.firstname.label')
- For fields and data translations use a
data
object.
// account.json
{
"data": {
"firstname": {
"label": "First Name",
"required": "First Name is required",
},
}
}
// React
t('account:data.firstname.label')
t('account:data.firstname.required')
- For user feedbacks, use a
feedbacks
object withactionSuccess
&actionError
keys containing eachtitle
anddescription
(optional).
// account.json
{
"resetPassword": {
"feedbacks": {
"confirmSuccess": {
"title": "Your password has been reset",
"description": "You can now login"
},
"confirmError": {
"title": "Reset password failed"
}
}
}
}
// React
t('account:resetPassword.feedbacks.updateSuccess.title')
t('account:resetPassword.feedbacks.updateSuccess.description')
t('account:resetPassword.feedbacks.updateError.title')
- For user actions, use an
actions
object.
// account.json
{
"resetPassword": {
"actions": {
"send": "Send Email",
"reset": "Reset Password"
}
}
}
// React
t('account:resetPassword.actions.send')
t('account:resetPassword.actions.reset')
- Use the common workspace only for VERY generic translations. By default, use specific namespaces to allow easy update on large code base without unwanted side-effects.
Production
NodeJS (recommended)
yarn install
yarn storybook:build # Optional: Will expose the Storybook at `/storybook`
yarn build
yarn start
Docker
- Build the Docker image (replace
start-ui-web
with your project name)
docker build -t start-ui-web .
- Run the Docker image (replace
start-ui-web
with your project name)
docker run -p 80:3000 start-ui-web
Application will be exposed on port 80 (http://localhost)
Static files
yarn storybook:build # Optional: Will expose the Storybook at `/storybook/index.html`
yarn static:build
Then expose the /out
folder.
๐ก You will need to setup your server to rewrite all /app/*
urls to serve the app.html
file.
Using Apache as your web server
If you are using apache to statically deploy your app, you can use the following configuration for public/.htaccess
:
# public/.htaccess
Options -MultiViews
RewriteEngine On
# Rewrite /app/* to app.html
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule "^app/" "app.html" [QSA,L]
Technology Choices
React
React is a JavaScript library created in 2013 to build reactive user interfaces. At the time of writing, React is probably the front end library the most used to create new projects and has a huge community which is beneficial for the maintainability of the project in terms of developers and online resources.
Next.js
Next.js gives you the best developer experience with all the features you need for production: hybrid static & server rendering, TypeScript support, smart bundling, route pre-fetching, and more. No config needed.
React Router
Next.js is bundled with its own router, but at the time of writing those lines, it does not allow nested routes using a shared layout.
TypeScript
JavaScript is a not typed language. TypeScript is here to help add static type definition. TypeScript helps a lot when it comes to types, interfaces and define contract between functions which helps a lot for a reliable documentation. No worry, the TypeScript adoption is incremental and writing in TypeScript is not mandatory to use Start UI, but it is a good practice to do so to avoid bugs in the future.
React Query
React Query is a powerful tool
to do efficient data synchronization for React. No need of Redux
or another global state manager anymore. Usable with fetch
,
axios
, or graphql-request
,
React Query will do the work and is agnostic of the method you will use.
Storybook
Storybook is an Open Source tool to help you develop framework agnostic components in isolation and document them.
Chakra UI
Chakra UI is a simple, modular, composable and accessible component library that is highly customizable.
Formiz
To create React forms, there is a lot of libraries out there. Formiz will help you create React forms with ease! Composable, headless & with built-in multi steps.
Cypress
Cypress is a tool for end-to-end, component and unit test