mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-09-22 13:39:35 +00:00
feat(frontend): added storybook with tailwind integration
chore(frontend): added some required radix components
This commit is contained in:
@@ -4,7 +4,14 @@ module.exports = {
|
|||||||
browser: true,
|
browser: true,
|
||||||
es2021: true
|
es2021: true
|
||||||
},
|
},
|
||||||
extends: ['airbnb', 'airbnb-typescript', 'airbnb/hooks', 'plugin:react/recommended', 'prettier'],
|
extends: [
|
||||||
|
'airbnb',
|
||||||
|
'airbnb-typescript',
|
||||||
|
'airbnb/hooks',
|
||||||
|
'plugin:react/recommended',
|
||||||
|
'prettier',
|
||||||
|
'plugin:storybook/recommended'
|
||||||
|
],
|
||||||
parserOptions: {
|
parserOptions: {
|
||||||
ecmaVersion: 'latest',
|
ecmaVersion: 'latest',
|
||||||
sourceType: 'module',
|
sourceType: 'module',
|
||||||
@@ -20,15 +27,27 @@ module.exports = {
|
|||||||
'import/prefer-default-export': 'off',
|
'import/prefer-default-export': 'off',
|
||||||
'react-hooks/exhaustive-deps': 'off',
|
'react-hooks/exhaustive-deps': 'off',
|
||||||
'@typescript-eslint/ban-ts-comment': 'warn',
|
'@typescript-eslint/ban-ts-comment': 'warn',
|
||||||
|
'react/jsx-props-no-spreading': 'off', // switched off for component building
|
||||||
// TODO: This rule will be switched ON after complete revamp of frontend
|
// TODO: This rule will be switched ON after complete revamp of frontend
|
||||||
'@typescript-eslint/no-explicit-any': 'off',
|
'@typescript-eslint/no-explicit-any': 'off',
|
||||||
'no-console': 'off',
|
'no-console': 'off',
|
||||||
'arrow-body-style': 'off',
|
'arrow-body-style': 'off',
|
||||||
'no-underscore-dangle': ['error', { allow: ['_id'] }],
|
'no-underscore-dangle': [
|
||||||
'jsx-a11y/anchor-is-valid': 'off', // all those <a> tags must be converted to label or a p component
|
'error',
|
||||||
|
{
|
||||||
|
allow: ['_id']
|
||||||
|
}
|
||||||
|
],
|
||||||
|
'jsx-a11y/anchor-is-valid': 'off',
|
||||||
|
// all those <a> tags must be converted to label or a p component
|
||||||
//
|
//
|
||||||
'react/require-default-props': 'off',
|
'react/require-default-props': 'off',
|
||||||
'react/jsx-filename-extension': [1, { extensions: ['.tsx', '.ts'] }],
|
'react/jsx-filename-extension': [
|
||||||
|
1,
|
||||||
|
{
|
||||||
|
extensions: ['.tsx', '.ts']
|
||||||
|
}
|
||||||
|
],
|
||||||
// TODO: turn this rule ON after migration. everything should use arrow functions
|
// TODO: turn this rule ON after migration. everything should use arrow functions
|
||||||
'react/function-component-definition': [
|
'react/function-component-definition': [
|
||||||
0,
|
0,
|
||||||
@@ -36,7 +55,12 @@ module.exports = {
|
|||||||
namedComponents: 'arrow-function'
|
namedComponents: 'arrow-function'
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
'react/no-unknown-property': ['error', { ignore: ['jsx'] }],
|
'react/no-unknown-property': [
|
||||||
|
'error',
|
||||||
|
{
|
||||||
|
ignore: ['jsx']
|
||||||
|
}
|
||||||
|
],
|
||||||
'@typescript-eslint/no-non-null-assertion': 'off',
|
'@typescript-eslint/no-non-null-assertion': 'off',
|
||||||
'simple-import-sort/exports': 'warn',
|
'simple-import-sort/exports': 'warn',
|
||||||
'simple-import-sort/imports': [
|
'simple-import-sort/imports': [
|
||||||
|
|||||||
21
frontend/.storybook/main.js
Normal file
21
frontend/.storybook/main.js
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
const path = require('path');
|
||||||
|
module.exports = {
|
||||||
|
stories: ['../src/**/*.mdx', '../src/**/*.stories.@(js|jsx|ts|tsx)'],
|
||||||
|
addons: [
|
||||||
|
'@storybook/addon-links',
|
||||||
|
'@storybook/addon-essentials',
|
||||||
|
'@storybook/addon-interactions',
|
||||||
|
'storybook-dark-mode',
|
||||||
|
'@storybook/addon-postcss'
|
||||||
|
],
|
||||||
|
framework: {
|
||||||
|
name: '@storybook/nextjs',
|
||||||
|
options: {}
|
||||||
|
},
|
||||||
|
core: {
|
||||||
|
disableTelemetry: true
|
||||||
|
},
|
||||||
|
docs: {
|
||||||
|
autodocs: 'tag'
|
||||||
|
}
|
||||||
|
};
|
||||||
11
frontend/.storybook/preview.js
Normal file
11
frontend/.storybook/preview.js
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
import '../src/styles/globals.css';
|
||||||
|
|
||||||
|
export const parameters = {
|
||||||
|
actions: { argTypesRegex: '^on[A-Z].*' },
|
||||||
|
controls: {
|
||||||
|
matchers: {
|
||||||
|
color: /(background|color)$/i,
|
||||||
|
date: /Date$/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
24236
frontend/package-lock.json
generated
24236
frontend/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,9 @@
|
|||||||
"start": "next start",
|
"start": "next start",
|
||||||
"start:docker": "next build && next start",
|
"start:docker": "next build && next start",
|
||||||
"lint": "eslint --fix --ext js,ts,tsx ./src",
|
"lint": "eslint --fix --ext js,ts,tsx ./src",
|
||||||
"type-check": "tsc --project tsconfig.json"
|
"type-check": "tsc --project tsconfig.json",
|
||||||
|
"storybook": "storybook dev -p 6006",
|
||||||
|
"build-storybook": "storybook build"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@emotion/css": "^11.10.0",
|
"@emotion/css": "^11.10.0",
|
||||||
@@ -18,6 +20,15 @@
|
|||||||
"@fortawesome/free-solid-svg-icons": "^6.1.2",
|
"@fortawesome/free-solid-svg-icons": "^6.1.2",
|
||||||
"@fortawesome/react-fontawesome": "^0.1.19",
|
"@fortawesome/react-fontawesome": "^0.1.19",
|
||||||
"@headlessui/react": "^1.6.6",
|
"@headlessui/react": "^1.6.6",
|
||||||
|
"@radix-ui/react-accordion": "^1.1.0",
|
||||||
|
"@radix-ui/react-alert-dialog": "^1.0.2",
|
||||||
|
"@radix-ui/react-dialog": "^1.0.2",
|
||||||
|
"@radix-ui/react-label": "^2.0.0",
|
||||||
|
"@radix-ui/react-popover": "^1.0.3",
|
||||||
|
"@radix-ui/react-progress": "^1.0.1",
|
||||||
|
"@radix-ui/react-select": "^1.2.0",
|
||||||
|
"@radix-ui/react-switch": "^1.0.1",
|
||||||
|
"@radix-ui/react-toast": "^1.1.2",
|
||||||
"@reduxjs/toolkit": "^1.8.3",
|
"@reduxjs/toolkit": "^1.8.3",
|
||||||
"@stripe/react-stripe-js": "^1.10.0",
|
"@stripe/react-stripe-js": "^1.10.0",
|
||||||
"@stripe/stripe-js": "^1.46.0",
|
"@stripe/stripe-js": "^1.46.0",
|
||||||
@@ -51,6 +62,7 @@
|
|||||||
"set-cookie-parser": "^2.5.1",
|
"set-cookie-parser": "^2.5.1",
|
||||||
"sharp": "^0.31.2",
|
"sharp": "^0.31.2",
|
||||||
"styled-components": "^5.3.5",
|
"styled-components": "^5.3.5",
|
||||||
|
"tailwind-merge": "^1.8.1",
|
||||||
"tweetnacl": "^1.0.3",
|
"tweetnacl": "^1.0.3",
|
||||||
"tweetnacl-util": "^0.15.1",
|
"tweetnacl-util": "^0.15.1",
|
||||||
"uuid": "^8.3.2",
|
"uuid": "^8.3.2",
|
||||||
@@ -58,6 +70,14 @@
|
|||||||
"yaml": "^2.2.0"
|
"yaml": "^2.2.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@storybook/addon-essentials": "^7.0.0-beta.30",
|
||||||
|
"@storybook/addon-interactions": "^7.0.0-beta.30",
|
||||||
|
"@storybook/addon-links": "^7.0.0-beta.30",
|
||||||
|
"@storybook/addon-postcss": "^2.0.0",
|
||||||
|
"@storybook/blocks": "^7.0.0-beta.30",
|
||||||
|
"@storybook/nextjs": "^7.0.0-beta.30",
|
||||||
|
"@storybook/react": "^7.0.0-beta.30",
|
||||||
|
"@storybook/testing-library": "^0.0.13",
|
||||||
"@tailwindcss/typography": "^0.5.4",
|
"@tailwindcss/typography": "^0.5.4",
|
||||||
"@types/jsrp": "^0.2.4",
|
"@types/jsrp": "^0.2.4",
|
||||||
"@types/node": "18.11.9",
|
"@types/node": "18.11.9",
|
||||||
@@ -77,8 +97,11 @@
|
|||||||
"eslint-plugin-react": "^7.32.0",
|
"eslint-plugin-react": "^7.32.0",
|
||||||
"eslint-plugin-react-hooks": "^4.6.0",
|
"eslint-plugin-react-hooks": "^4.6.0",
|
||||||
"eslint-plugin-simple-import-sort": "^8.0.0",
|
"eslint-plugin-simple-import-sort": "^8.0.0",
|
||||||
|
"eslint-plugin-storybook": "^0.6.10",
|
||||||
"postcss": "^8.4.14",
|
"postcss": "^8.4.14",
|
||||||
"prettier": "^2.8.3",
|
"prettier": "^2.8.3",
|
||||||
|
"storybook": "^7.0.0-beta.30",
|
||||||
|
"storybook-dark-mode": "^2.0.5",
|
||||||
"tailwindcss": "^3.1.4",
|
"tailwindcss": "^3.1.4",
|
||||||
"typescript": "^4.9.3"
|
"typescript": "^4.9.3"
|
||||||
}
|
}
|
||||||
|
|||||||
20
frontend/src/components/v2/Button/Button.stories.tsx
Normal file
20
frontend/src/components/v2/Button/Button.stories.tsx
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
import type { Meta, StoryObj } from '@storybook/react';
|
||||||
|
|
||||||
|
import { Button } from './Button';
|
||||||
|
|
||||||
|
const meta: Meta<typeof Button> = {
|
||||||
|
title: 'Components/Button',
|
||||||
|
component: Button,
|
||||||
|
tags: ['v2'],
|
||||||
|
argTypes: {}
|
||||||
|
};
|
||||||
|
|
||||||
|
export default meta;
|
||||||
|
type Story = StoryObj<typeof Button>;
|
||||||
|
|
||||||
|
// More on writing stories with args: https://storybook.js.org/docs/7.0/react/writing-stories/args
|
||||||
|
export const Primary: Story = {
|
||||||
|
args: {
|
||||||
|
children: 'Hello Infisical'
|
||||||
|
}
|
||||||
|
};
|
||||||
35
frontend/src/components/v2/Button/Button.tsx
Normal file
35
frontend/src/components/v2/Button/Button.tsx
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
import { ButtonHTMLAttributes, forwardRef, ReactNode } from 'react';
|
||||||
|
import { twMerge } from 'tailwind-merge';
|
||||||
|
|
||||||
|
type Props = {
|
||||||
|
children: ReactNode;
|
||||||
|
isDisabled?: boolean;
|
||||||
|
// loading state
|
||||||
|
isLoading?: boolean;
|
||||||
|
// various button sizes
|
||||||
|
size: 'sm' | 'md' | 'lg';
|
||||||
|
};
|
||||||
|
|
||||||
|
export type ButtonProps = ButtonHTMLAttributes<HTMLButtonElement> & Props;
|
||||||
|
|
||||||
|
export const Button = forwardRef<HTMLButtonElement, ButtonProps>(
|
||||||
|
({ children, isDisabled = false, className, ...props }, ref): JSX.Element => {
|
||||||
|
return (
|
||||||
|
<button
|
||||||
|
ref={ref}
|
||||||
|
aria-disabled={isDisabled}
|
||||||
|
type="button"
|
||||||
|
className={twMerge(
|
||||||
|
'bg-primary hover:opacity-80 transition-all text-sm px-4 py-2 font-bold rounded',
|
||||||
|
className
|
||||||
|
)}
|
||||||
|
disabled={isDisabled}
|
||||||
|
{...props}
|
||||||
|
>
|
||||||
|
{children}
|
||||||
|
</button>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
Button.displayName = 'Button';
|
||||||
1
frontend/src/components/v2/Button/index.tsx
Normal file
1
frontend/src/components/v2/Button/index.tsx
Normal file
@@ -0,0 +1 @@
|
|||||||
|
export { Button } from './Button';
|
||||||
Reference in New Issue
Block a user