mirror of
https://github.com/lingble/twenty.git
synced 2025-10-30 12:22:29 +00:00
Setup the foundation for Twenty UI library. (#4423)
* feat: create a separate package for twenty-ui, extract the pill component with hard-coded theme values into it, and use the component inside twenty-front to complete the setup * feat: extract the light and the dark theme into twenty-ui and update the AppThemeProvider component inside twenty-front to consume themes from twenty-ui * fix: create a decorator inside preview.tsx to provide a default theme to storybook development server * fix: remove redundant type declarations and revert back the naming convention for theme declarations * fix: introduce a default value for pill label within the story for development server * fix: introduce the nx script into package.json for twenty-ui and resolve imports for theme type within the package * fix: remove the pill component from the twenty-front package along with the story for it * fix: revert the package versions to those before running the nx cli command for storybook init * feat: update readme to include details for building the ui library and starting the storybook development server * fix: include details about twenty-ui inside jest.config for twenty-front to complete front-jest job * - Added preview head for font - Added theme addon for light/dark switch - Added ComponentDecorator --------- Co-authored-by: Lucas Bordeau <bordeau.lucas@gmail.com>
This commit is contained in:
4
.gitignore
vendored
4
.gitignore
vendored
@@ -19,4 +19,6 @@
|
|||||||
coverage
|
coverage
|
||||||
.vercel
|
.vercel
|
||||||
|
|
||||||
**/**/logs/**
|
**/**/logs/**
|
||||||
|
|
||||||
|
storybook-static
|
||||||
47
nx.json
47
nx.json
@@ -2,38 +2,26 @@
|
|||||||
"targetDefaults": {
|
"targetDefaults": {
|
||||||
"build": {
|
"build": {
|
||||||
"cache": true,
|
"cache": true,
|
||||||
"dependsOn": [
|
"dependsOn": ["^build"]
|
||||||
"^build"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"start": {
|
"start": {
|
||||||
"cache": true,
|
"cache": true,
|
||||||
"dependsOn": [
|
"dependsOn": ["^build"]
|
||||||
"^build"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"lint": {
|
"lint": {
|
||||||
"cache": true
|
"cache": true
|
||||||
},
|
},
|
||||||
"test": {
|
"test": {
|
||||||
"cache": true,
|
"cache": true,
|
||||||
"dependsOn": [
|
"dependsOn": ["^build"]
|
||||||
"^build"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"test:e2e": {
|
"test:e2e": {
|
||||||
"cache": true,
|
"cache": true,
|
||||||
"dependsOn": [
|
"dependsOn": ["^build"]
|
||||||
"^build"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"@nx/jest:jest": {
|
"@nx/jest:jest": {
|
||||||
"cache": true,
|
"cache": true,
|
||||||
"inputs": [
|
"inputs": ["default", "^default", "{workspaceRoot}/jest.preset.js"],
|
||||||
"default",
|
|
||||||
"^default",
|
|
||||||
"{workspaceRoot}/jest.preset.js"
|
|
||||||
],
|
|
||||||
"options": {
|
"options": {
|
||||||
"passWithNoTests": true
|
"passWithNoTests": true
|
||||||
},
|
},
|
||||||
@@ -46,10 +34,7 @@
|
|||||||
},
|
},
|
||||||
"@nx/vite:test": {
|
"@nx/vite:test": {
|
||||||
"cache": true,
|
"cache": true,
|
||||||
"inputs": [
|
"inputs": ["default", "^default"]
|
||||||
"default",
|
|
||||||
"^default"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"installation": {
|
"installation": {
|
||||||
@@ -67,5 +52,23 @@
|
|||||||
"unitTestRunner": "none"
|
"unitTestRunner": "none"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"plugins": [
|
||||||
|
{
|
||||||
|
"plugin": "@nx/storybook/plugin",
|
||||||
|
"options": {
|
||||||
|
"buildStorybookTargetName": "build-storybook",
|
||||||
|
"serveStorybookTargetName": "storybook",
|
||||||
|
"testStorybookTargetName": "test-storybook",
|
||||||
|
"staticStorybookTargetName": "static-storybook"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"tasksRunnerOptions": {
|
||||||
|
"default": {
|
||||||
|
"options": {
|
||||||
|
"cacheableOperations": ["build-storybook"]
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
15
package.json
15
package.json
@@ -51,6 +51,7 @@
|
|||||||
"@sentry/tracing": "^7.99.0",
|
"@sentry/tracing": "^7.99.0",
|
||||||
"@sniptt/guards": "^0.2.0",
|
"@sniptt/guards": "^0.2.0",
|
||||||
"@stoplight/elements": "^8.0.5",
|
"@stoplight/elements": "^8.0.5",
|
||||||
|
"@storybook/icons": "^1.2.9",
|
||||||
"@swc/jest": "^0.2.29",
|
"@swc/jest": "^0.2.29",
|
||||||
"@tabler/icons-react": "^2.44.0",
|
"@tabler/icons-react": "^2.44.0",
|
||||||
"@types/facepaint": "^1.2.5",
|
"@types/facepaint": "^1.2.5",
|
||||||
@@ -192,22 +193,28 @@
|
|||||||
"@nx/jest": "17.2.8",
|
"@nx/jest": "17.2.8",
|
||||||
"@nx/js": "17.2.8",
|
"@nx/js": "17.2.8",
|
||||||
"@nx/react": "17.2.8",
|
"@nx/react": "17.2.8",
|
||||||
|
"@nx/storybook": "^17.2.8",
|
||||||
"@nx/vite": "17.2.8",
|
"@nx/vite": "17.2.8",
|
||||||
|
"@nx/web": "17.2.8",
|
||||||
"@storybook/addon-actions": "^7.6.3",
|
"@storybook/addon-actions": "^7.6.3",
|
||||||
"@storybook/addon-coverage": "^1.0.0",
|
"@storybook/addon-coverage": "^1.0.0",
|
||||||
"@storybook/addon-essentials": "^7.6.7",
|
"@storybook/addon-essentials": "^7.6.7",
|
||||||
"@storybook/addon-interactions": "^7.6.7",
|
"@storybook/addon-interactions": "^7.6.7",
|
||||||
"@storybook/addon-links": "^7.6.7",
|
"@storybook/addon-links": "^7.6.7",
|
||||||
"@storybook/addon-onboarding": "^1.0.10",
|
"@storybook/addon-onboarding": "^1.0.10",
|
||||||
"@storybook/addon-themes": "^7.6.7",
|
"@storybook/addon-themes": "^8.0.0",
|
||||||
"@storybook/blocks": "^7.6.3",
|
"@storybook/blocks": "^7.6.3",
|
||||||
|
"@storybook/core-server": "7.6.3",
|
||||||
|
"@storybook/jest": "^0.2.3",
|
||||||
"@storybook/react": "^7.6.3",
|
"@storybook/react": "^7.6.3",
|
||||||
"@storybook/react-vite": "^7.6.3",
|
"@storybook/react-vite": "^7.6.3",
|
||||||
"@storybook/test": "^7.6.3",
|
"@storybook/test": "^7.6.3",
|
||||||
"@storybook/test-runner": "^0.16.0",
|
"@storybook/test-runner": "^0.16.0",
|
||||||
|
"@storybook/testing-library": "^0.2.2",
|
||||||
"@stylistic/eslint-plugin": "^1.5.0",
|
"@stylistic/eslint-plugin": "^1.5.0",
|
||||||
"@swc-node/register": "~1.6.7",
|
"@swc-node/register": "~1.6.7",
|
||||||
"@swc/core": "~1.3.100",
|
"@swc/core": "~1.3.100",
|
||||||
|
"@swc/helpers": "~0.5.2",
|
||||||
"@testing-library/jest-dom": "^6.1.5",
|
"@testing-library/jest-dom": "^6.1.5",
|
||||||
"@testing-library/react": "14.0.0",
|
"@testing-library/react": "14.0.0",
|
||||||
"@types/apollo-upload-client": "^17.0.2",
|
"@types/apollo-upload-client": "^17.0.2",
|
||||||
@@ -245,6 +252,7 @@
|
|||||||
"@typescript-eslint/parser": "^6.10.0",
|
"@typescript-eslint/parser": "^6.10.0",
|
||||||
"@typescript-eslint/utils": "^6.9.1",
|
"@typescript-eslint/utils": "^6.9.1",
|
||||||
"@vitejs/plugin-react-swc": "^3.5.0",
|
"@vitejs/plugin-react-swc": "^3.5.0",
|
||||||
|
"@vitest/ui": "~0.34.6",
|
||||||
"chromatic": "^6.18.0",
|
"chromatic": "^6.18.0",
|
||||||
"concurrently": "^8.2.2",
|
"concurrently": "^8.2.2",
|
||||||
"cross-var": "^1.1.0",
|
"cross-var": "^1.1.0",
|
||||||
@@ -268,6 +276,7 @@
|
|||||||
"http-server": "^14.1.1",
|
"http-server": "^14.1.1",
|
||||||
"jest": "29.7.0",
|
"jest": "29.7.0",
|
||||||
"jest-environment-jsdom": "29.7.0",
|
"jest-environment-jsdom": "29.7.0",
|
||||||
|
"jest-environment-node": "^29.4.1",
|
||||||
"jest-fetch-mock": "^3.0.3",
|
"jest-fetch-mock": "^3.0.3",
|
||||||
"jsdom": "~22.1.0",
|
"jsdom": "~22.1.0",
|
||||||
"msw": "^2.0.11",
|
"msw": "^2.0.11",
|
||||||
@@ -290,7 +299,8 @@
|
|||||||
"vite": "^5.0.0",
|
"vite": "^5.0.0",
|
||||||
"vite-plugin-checker": "^0.6.2",
|
"vite-plugin-checker": "^0.6.2",
|
||||||
"vite-plugin-dts": "~2.3.0",
|
"vite-plugin-dts": "~2.3.0",
|
||||||
"vite-plugin-svgr": "^4.2.0"
|
"vite-plugin-svgr": "^4.2.0",
|
||||||
|
"vitest": "~0.34.6"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "^18.17.1",
|
"node": "^18.17.1",
|
||||||
@@ -315,6 +325,7 @@
|
|||||||
"packages/twenty-docs",
|
"packages/twenty-docs",
|
||||||
"packages/twenty-server",
|
"packages/twenty-server",
|
||||||
"packages/twenty-emails",
|
"packages/twenty-emails",
|
||||||
|
"packages/twenty-ui",
|
||||||
"packages/twenty-utils",
|
"packages/twenty-utils",
|
||||||
"packages/twenty-zapier",
|
"packages/twenty-zapier",
|
||||||
"packages/twenty-website",
|
"packages/twenty-website",
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ export default {
|
|||||||
moduleNameMapper: {
|
moduleNameMapper: {
|
||||||
'~/(.+)': '<rootDir>/src/$1',
|
'~/(.+)': '<rootDir>/src/$1',
|
||||||
'@/(.+)': '<rootDir>/src/modules/$1',
|
'@/(.+)': '<rootDir>/src/modules/$1',
|
||||||
|
'twenty-ui': '<rootDir>/../twenty-ui/src/index.ts',
|
||||||
'@testing/(.+)': '<rootDir>/src/testing/$1',
|
'@testing/(.+)': '<rootDir>/src/testing/$1',
|
||||||
'\\.(jpg|jpeg|png|gif|webp|svg|svg\\?react)$':
|
'\\.(jpg|jpeg|png|gif|webp|svg|svg\\?react)$':
|
||||||
'<rootDir>/__mocks__/imageMock.js',
|
'<rootDir>/__mocks__/imageMock.js',
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
import { ReactNode } from 'react';
|
import { ReactNode } from 'react';
|
||||||
import { useTheme } from '@emotion/react';
|
import { useTheme } from '@emotion/react';
|
||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
|
import { Pill } from 'twenty-ui';
|
||||||
|
|
||||||
import { IconChevronRight } from '@/ui/display/icon';
|
import { IconChevronRight } from '@/ui/display/icon';
|
||||||
import { IconComponent } from '@/ui/display/icon/types/IconComponent';
|
import { IconComponent } from '@/ui/display/icon/types/IconComponent';
|
||||||
import { Pill } from '@/ui/display/pill/components/Pill';
|
|
||||||
import { Card } from '@/ui/layout/card/components/Card';
|
import { Card } from '@/ui/layout/card/components/Card';
|
||||||
import { CardContent } from '@/ui/layout/card/components/CardContent';
|
import { CardContent } from '@/ui/layout/card/components/CardContent';
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import { css, useTheme } from '@emotion/react';
|
import { css, useTheme } from '@emotion/react';
|
||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
|
import { Pill } from 'twenty-ui';
|
||||||
|
|
||||||
import { IconComponent } from '@/ui/display/icon/types/IconComponent';
|
import { IconComponent } from '@/ui/display/icon/types/IconComponent';
|
||||||
import { Pill } from '@/ui/display/pill/components/Pill';
|
|
||||||
|
|
||||||
export type ButtonSize = 'medium' | 'small';
|
export type ButtonSize = 'medium' | 'small';
|
||||||
export type ButtonPosition = 'standalone' | 'left' | 'middle' | 'right';
|
export type ButtonPosition = 'standalone' | 'left' | 'middle' | 'right';
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
import * as React from 'react';
|
import * as React from 'react';
|
||||||
import { useTheme } from '@emotion/react';
|
import { useTheme } from '@emotion/react';
|
||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
|
import { Pill } from 'twenty-ui';
|
||||||
|
|
||||||
import { IconComponent } from '@/ui/display/icon/types/IconComponent';
|
import { IconComponent } from '@/ui/display/icon/types/IconComponent';
|
||||||
import { Pill } from '@/ui/display/pill/components/Pill';
|
|
||||||
|
|
||||||
type TabProps = {
|
type TabProps = {
|
||||||
id: string;
|
id: string;
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
import { ThemeProvider } from '@emotion/react';
|
import { ThemeProvider } from '@emotion/react';
|
||||||
|
import { THEME_DARK, THEME_LIGHT } from 'twenty-ui';
|
||||||
import { THEME_DARK } from '@/ui/theme/constants/ThemeDark';
|
|
||||||
import { THEME_LIGHT } from '@/ui/theme/constants/ThemeLight';
|
|
||||||
|
|
||||||
import { useColorScheme } from '../hooks/useColorScheme';
|
import { useColorScheme } from '../hooks/useColorScheme';
|
||||||
import { useSystemColorScheme } from '../hooks/useSystemColorScheme';
|
import { useSystemColorScheme } from '../hooks/useSystemColorScheme';
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
|
import { Pill } from 'twenty-ui';
|
||||||
|
|
||||||
import { IconArrowUpRight, IconBolt } from '@/ui/display/icon';
|
import { IconArrowUpRight, IconBolt } from '@/ui/display/icon';
|
||||||
import { Pill } from '@/ui/display/pill/components/Pill';
|
|
||||||
import { Button } from '@/ui/input/button/components/Button';
|
import { Button } from '@/ui/input/button/components/Button';
|
||||||
import { SettingsIntegration } from '~/pages/settings/integrations/types/SettingsIntegration';
|
import { SettingsIntegration } from '~/pages/settings/integrations/types/SettingsIntegration';
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,8 @@
|
|||||||
"baseUrl": ".",
|
"baseUrl": ".",
|
||||||
"paths": {
|
"paths": {
|
||||||
"@/*": ["src/modules/*"],
|
"@/*": ["src/modules/*"],
|
||||||
"~/*": ["src/*"]
|
"~/*": ["src/*"],
|
||||||
|
"twenty-ui": ["../twenty-ui/src/index.ts"]
|
||||||
},
|
},
|
||||||
|
|
||||||
/* Bundler mode */
|
/* Bundler mode */
|
||||||
@@ -27,7 +28,7 @@
|
|||||||
"noUnusedLocals": false,
|
"noUnusedLocals": false,
|
||||||
"noUnusedParameters": false,
|
"noUnusedParameters": false,
|
||||||
"noFallthroughCasesInSwitch": true,
|
"noFallthroughCasesInSwitch": true,
|
||||||
"forceConsistentCasingInFileNames": true
|
"forceConsistentCasingInFileNames": true,
|
||||||
},
|
},
|
||||||
"files": [],
|
"files": [],
|
||||||
"include": [],
|
"include": [],
|
||||||
|
|||||||
@@ -15,7 +15,6 @@ export * from './src/modules/ui/display/checkmark/components/AnimatedCheckmark'
|
|||||||
export * from './src/modules/ui/display/chip/components/Chip'
|
export * from './src/modules/ui/display/chip/components/Chip'
|
||||||
export * from './src/modules/ui/display/chip/components/EntityChip'
|
export * from './src/modules/ui/display/chip/components/EntityChip'
|
||||||
export * from './src/modules/ui/display/icon/components/IconAddressBook'
|
export * from './src/modules/ui/display/icon/components/IconAddressBook'
|
||||||
export * from './src/modules/ui/display/pill/components/Pill'
|
|
||||||
export * from './src/modules/ui/display/tag/components/Tag'
|
export * from './src/modules/ui/display/tag/components/Tag'
|
||||||
export * from './src/modules/ui/display/tooltip/AppTooltip'
|
export * from './src/modules/ui/display/tooltip/AppTooltip'
|
||||||
export * from './src/modules/ui/display/tooltip/OverflowingTextWithTooltip'
|
export * from './src/modules/ui/display/tooltip/OverflowingTextWithTooltip'
|
||||||
|
|||||||
25
packages/twenty-ui/.eslintrc.json
Normal file
25
packages/twenty-ui/.eslintrc.json
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"extends": ["../../.eslintrc.js"],
|
||||||
|
"ignorePatterns": ["!**/*", "storybook-static"],
|
||||||
|
"overrides": [
|
||||||
|
{
|
||||||
|
"files": ["*.ts", "*.tsx", "*.js", "*.jsx"],
|
||||||
|
"rules": {}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"files": ["*.ts", "*.tsx"],
|
||||||
|
"rules": {}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"files": ["*.js", "*.jsx"],
|
||||||
|
"rules": {}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"files": ["*.json"],
|
||||||
|
"parser": "jsonc-eslint-parser",
|
||||||
|
"rules": {
|
||||||
|
"@nx/dependency-checks": "error"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
1
packages/twenty-ui/.gitignore
vendored
Normal file
1
packages/twenty-ui/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
dist
|
||||||
24
packages/twenty-ui/.storybook/main.tsx
Normal file
24
packages/twenty-ui/.storybook/main.tsx
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
import { StorybookConfig } from '@storybook/react-vite';
|
||||||
|
|
||||||
|
const config: StorybookConfig = {
|
||||||
|
stories: ['../src/**/*.stories.@(js|jsx|ts|tsx|mdx)'],
|
||||||
|
addons: [
|
||||||
|
'@storybook/addon-essentials',
|
||||||
|
'@storybook/addon-interactions',
|
||||||
|
'@storybook/addon-themes',
|
||||||
|
],
|
||||||
|
framework: {
|
||||||
|
name: '@storybook/react-vite',
|
||||||
|
options: {
|
||||||
|
builder: {
|
||||||
|
viteConfigPath: 'vite.config.ts',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export default config;
|
||||||
|
|
||||||
|
// To customize your Vite configuration you can use the viteFinal field.
|
||||||
|
// Check https://storybook.js.org/docs/react/builders/vite#configuration
|
||||||
|
// and https://nx.dev/recipes/storybook/custom-builder-configs
|
||||||
34
packages/twenty-ui/.storybook/preview-head.html
Normal file
34
packages/twenty-ui/.storybook/preview-head.html
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
<link
|
||||||
|
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap"
|
||||||
|
rel="stylesheet"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/iframe-resizer/4.3.7/iframeResizer.contentWindow.min.js"></script>
|
||||||
|
|
||||||
|
<style type="text/css">
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
font-family: 'Inter', sans-serif;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
}
|
||||||
|
html {
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
.sbdocs-wrapper {
|
||||||
|
padding: 0 !important;
|
||||||
|
}
|
||||||
|
*::-webkit-scrollbar {
|
||||||
|
height: 4px;
|
||||||
|
width: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
*::-webkit-scrollbar-corner {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
*::-webkit-scrollbar-thumb {
|
||||||
|
background-color: transparent;
|
||||||
|
border-radius: 2px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
21
packages/twenty-ui/.storybook/preview.tsx
Normal file
21
packages/twenty-ui/.storybook/preview.tsx
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
import { ThemeProvider } from '@emotion/react';
|
||||||
|
import { withThemeFromJSXProvider } from '@storybook/addon-themes';
|
||||||
|
import { Preview, ReactRenderer } from '@storybook/react';
|
||||||
|
|
||||||
|
import { THEME_DARK, THEME_LIGHT } from '../src/theme/index';
|
||||||
|
|
||||||
|
const preview: Preview = {
|
||||||
|
// TODO: Add toggle for darkTheme.
|
||||||
|
decorators: [
|
||||||
|
withThemeFromJSXProvider<ReactRenderer>({
|
||||||
|
themes: {
|
||||||
|
light: THEME_LIGHT,
|
||||||
|
dark: THEME_DARK,
|
||||||
|
},
|
||||||
|
defaultTheme: 'light',
|
||||||
|
Provider: ThemeProvider,
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
};
|
||||||
|
|
||||||
|
export default preview;
|
||||||
15
packages/twenty-ui/README.md
Normal file
15
packages/twenty-ui/README.md
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# Twenty UI
|
||||||
|
|
||||||
|
This library was generated with [Nx](https://nx.dev).
|
||||||
|
|
||||||
|
## Building
|
||||||
|
|
||||||
|
Run `yarn nx build twenty-ui` to build the library.
|
||||||
|
|
||||||
|
## Storybook Server
|
||||||
|
|
||||||
|
Run `yarn nx start twenty-ui` to start the storybook development server on `localhost:6006`.
|
||||||
|
|
||||||
|
## Running unit tests
|
||||||
|
|
||||||
|
Run `yarn nx test twenty-ui` to execute the unit tests via [Jest](https://jestjs.io).
|
||||||
11
packages/twenty-ui/jest.config.ts
Normal file
11
packages/twenty-ui/jest.config.ts
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
/* eslint-disable */
|
||||||
|
export default {
|
||||||
|
displayName: 'twenty-ui',
|
||||||
|
preset: '../../jest.preset.js',
|
||||||
|
testEnvironment: 'node',
|
||||||
|
transform: {
|
||||||
|
'^.+\\.[tj]s$': ['ts-jest', { tsconfig: '<rootDir>/tsconfig.spec.json' }],
|
||||||
|
},
|
||||||
|
moduleFileExtensions: ['ts', 'js', 'html'],
|
||||||
|
coverageDirectory: '../../coverage/packages/twenty-ui',
|
||||||
|
};
|
||||||
12
packages/twenty-ui/package.json
Normal file
12
packages/twenty-ui/package.json
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"name": "twenty-ui",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"main": "./index.js",
|
||||||
|
"module": "./index.mjs",
|
||||||
|
"typings": "./index.d.ts",
|
||||||
|
"scripts": {
|
||||||
|
"nx": "NX_DEFAULT_PROJECT=twenty-ui node ../../node_modules/nx/bin/nx.js",
|
||||||
|
"start": "storybook dev -p 6006",
|
||||||
|
"build": "storybook build"
|
||||||
|
}
|
||||||
|
}
|
||||||
27
packages/twenty-ui/project.json
Normal file
27
packages/twenty-ui/project.json
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
"name": "twenty-ui",
|
||||||
|
"$schema": "../../node_modules/nx/schemas/project-schema.json",
|
||||||
|
"sourceRoot": "packages/twenty-ui/src",
|
||||||
|
"projectType": "library",
|
||||||
|
"targets": {
|
||||||
|
"build": {
|
||||||
|
"executor": "@nx/vite:build",
|
||||||
|
"outputs": ["{options.outputPath}"],
|
||||||
|
"options": {
|
||||||
|
"outputPath": "packages/twenty-ui/dist"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"lint": {
|
||||||
|
"executor": "@nx/eslint:lint",
|
||||||
|
"outputs": ["{options.outputFile}"]
|
||||||
|
},
|
||||||
|
"test": {
|
||||||
|
"executor": "@nx/jest:jest",
|
||||||
|
"outputs": ["{workspaceRoot}/coverage/{projectRoot}"],
|
||||||
|
"options": {
|
||||||
|
"jestConfig": "packages/twenty-ui/jest.config.ts"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"tags": []
|
||||||
|
}
|
||||||
@@ -1,16 +1,20 @@
|
|||||||
import { Meta, StoryObj } from '@storybook/react';
|
import { Meta, StoryObj } from '@storybook/react';
|
||||||
|
|
||||||
import { ComponentDecorator } from '~/testing/decorators/ComponentDecorator';
|
import { ComponentDecorator } from '../../testing/decorators/ComponentDecorator';
|
||||||
|
|
||||||
import { Pill } from '../Pill';
|
import { Pill } from './Pill';
|
||||||
|
|
||||||
const meta: Meta<typeof Pill> = {
|
const meta: Meta<typeof Pill> = {
|
||||||
title: 'UI/Display/Pill/Pill',
|
title: 'UI/Display/Pill/Pill',
|
||||||
component: Pill,
|
component: Pill,
|
||||||
decorators: [ComponentDecorator],
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export default meta;
|
export default meta;
|
||||||
type Story = StoryObj<typeof Pill>;
|
type Story = StoryObj<typeof Pill>;
|
||||||
|
|
||||||
export const Default: Story = {};
|
export const Default: Story = {
|
||||||
|
args: {
|
||||||
|
label: 'Soon',
|
||||||
|
},
|
||||||
|
decorators: [ComponentDecorator],
|
||||||
|
};
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import * as React from 'react';
|
||||||
import styled from '@emotion/styled';
|
import styled from '@emotion/styled';
|
||||||
|
|
||||||
type PillProps = {
|
type PillProps = {
|
||||||
@@ -21,6 +22,6 @@ const StyledPill = styled.span`
|
|||||||
padding: ${({ theme }) => `0 ${theme.spacing(2)}`};
|
padding: ${({ theme }) => `0 ${theme.spacing(2)}`};
|
||||||
`;
|
`;
|
||||||
|
|
||||||
export const Pill = ({ className, label }: PillProps) => (
|
export const Pill = ({ className, label }: PillProps) => {
|
||||||
<StyledPill className={className}>{label}</StyledPill>
|
return <StyledPill className={className}>{label}</StyledPill>;
|
||||||
);
|
};
|
||||||
1
packages/twenty-ui/src/components/index.ts
Normal file
1
packages/twenty-ui/src/components/index.ts
Normal file
@@ -0,0 +1 @@
|
|||||||
|
export { Pill } from './Pill/Pill';
|
||||||
5
packages/twenty-ui/src/emotion.d.ts
vendored
Normal file
5
packages/twenty-ui/src/emotion.d.ts
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
import { ThemeType } from './theme';
|
||||||
|
|
||||||
|
declare module '@emotion/react' {
|
||||||
|
export interface Theme extends ThemeType {}
|
||||||
|
}
|
||||||
2
packages/twenty-ui/src/index.ts
Normal file
2
packages/twenty-ui/src/index.ts
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
export * from './components';
|
||||||
|
export * from './theme';
|
||||||
28
packages/twenty-ui/src/testing/ComponentStorybookLayout.tsx
Normal file
28
packages/twenty-ui/src/testing/ComponentStorybookLayout.tsx
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
import styled from '@emotion/styled';
|
||||||
|
|
||||||
|
const StyledLayout = styled.div<{ width?: number }>`
|
||||||
|
background: ${({ theme }) => theme.background.primary};
|
||||||
|
border: 1px solid ${({ theme }) => theme.border.color.light};
|
||||||
|
border-radius: 5px;
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
|
||||||
|
height: fit-content;
|
||||||
|
max-width: calc(100% - 40px);
|
||||||
|
min-width: ${({ width }) => (width ? 'unset' : '300px')};
|
||||||
|
padding: 20px;
|
||||||
|
width: ${({ width }) => (width ? width + 'px' : 'fit-content')};
|
||||||
|
`;
|
||||||
|
|
||||||
|
type ComponentStorybookLayoutProps = {
|
||||||
|
width?: number;
|
||||||
|
children: JSX.Element;
|
||||||
|
};
|
||||||
|
|
||||||
|
export const ComponentStorybookLayout = ({
|
||||||
|
width,
|
||||||
|
children,
|
||||||
|
}: ComponentStorybookLayoutProps) => (
|
||||||
|
<StyledLayout width={width}>{children}</StyledLayout>
|
||||||
|
);
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
import { Decorator } from '@storybook/react';
|
||||||
|
|
||||||
|
import { ComponentStorybookLayout } from '../ComponentStorybookLayout';
|
||||||
|
|
||||||
|
export const ComponentDecorator: Decorator = (Story, context) => {
|
||||||
|
const { container } = context.parameters;
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ComponentStorybookLayout width={container?.width}>
|
||||||
|
<Story />
|
||||||
|
</ComponentStorybookLayout>
|
||||||
|
);
|
||||||
|
};
|
||||||
BIN
packages/twenty-ui/src/theme/assets/dark-noise.jpg
Normal file
BIN
packages/twenty-ui/src/theme/assets/dark-noise.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 25 KiB |
BIN
packages/twenty-ui/src/theme/assets/light-noise.png
Normal file
BIN
packages/twenty-ui/src/theme/assets/light-noise.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 9.4 KiB |
10
packages/twenty-ui/src/theme/constants/AccentDark.ts
Normal file
10
packages/twenty-ui/src/theme/constants/AccentDark.ts
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
import { COLOR } from './Colors';
|
||||||
|
|
||||||
|
export const ACCENT_DARK = {
|
||||||
|
primary: COLOR.blueAccent75,
|
||||||
|
secondary: COLOR.blueAccent80,
|
||||||
|
tertiary: COLOR.blueAccent85,
|
||||||
|
quaternary: COLOR.blueAccent90,
|
||||||
|
accent3570: COLOR.blueAccent70,
|
||||||
|
accent4060: COLOR.blueAccent60,
|
||||||
|
};
|
||||||
10
packages/twenty-ui/src/theme/constants/AccentLight.ts
Normal file
10
packages/twenty-ui/src/theme/constants/AccentLight.ts
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
import { COLOR } from './Colors';
|
||||||
|
|
||||||
|
export const ACCENT_LIGHT = {
|
||||||
|
primary: COLOR.blueAccent25,
|
||||||
|
secondary: COLOR.blueAccent20,
|
||||||
|
tertiary: COLOR.blueAccent15,
|
||||||
|
quaternary: COLOR.blueAccent10,
|
||||||
|
accent3570: COLOR.blueAccent35,
|
||||||
|
accent4060: COLOR.blueAccent40,
|
||||||
|
};
|
||||||
9
packages/twenty-ui/src/theme/constants/Animation.ts
Normal file
9
packages/twenty-ui/src/theme/constants/Animation.ts
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
export const ANIMATION = {
|
||||||
|
duration: {
|
||||||
|
instant: 0.075,
|
||||||
|
fast: 0.15,
|
||||||
|
normal: 0.3,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
export type AnimationDuration = 'instant' | 'fast' | 'normal';
|
||||||
27
packages/twenty-ui/src/theme/constants/BackgroundDark.ts
Normal file
27
packages/twenty-ui/src/theme/constants/BackgroundDark.ts
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
/* eslint-disable @nx/workspace-no-hardcoded-colors */
|
||||||
|
import DarkNoise from '../assets/dark-noise.jpg';
|
||||||
|
|
||||||
|
import { COLOR } from './Colors';
|
||||||
|
import { GRAY_SCALE } from './GrayScale';
|
||||||
|
import { RGBA } from './Rgba';
|
||||||
|
|
||||||
|
export const BACKGROUND_DARK = {
|
||||||
|
noisy: `url(${DarkNoise.toString()});`,
|
||||||
|
primary: GRAY_SCALE.gray85,
|
||||||
|
secondary: GRAY_SCALE.gray80,
|
||||||
|
tertiary: GRAY_SCALE.gray75,
|
||||||
|
quaternary: GRAY_SCALE.gray70,
|
||||||
|
danger: COLOR.red80,
|
||||||
|
transparent: {
|
||||||
|
primary: RGBA(GRAY_SCALE.gray85, 0.8),
|
||||||
|
secondary: RGBA(GRAY_SCALE.gray80, 0.8),
|
||||||
|
strong: RGBA(GRAY_SCALE.gray0, 0.14),
|
||||||
|
medium: RGBA(GRAY_SCALE.gray0, 0.1),
|
||||||
|
light: RGBA(GRAY_SCALE.gray0, 0.06),
|
||||||
|
lighter: RGBA(GRAY_SCALE.gray0, 0.03),
|
||||||
|
danger: RGBA(COLOR.red, 0.08),
|
||||||
|
},
|
||||||
|
overlay: RGBA(GRAY_SCALE.gray80, 0.8),
|
||||||
|
radialGradient: `radial-gradient(50% 62.62% at 50% 0%, #505050 0%, ${GRAY_SCALE.gray60} 100%)`,
|
||||||
|
radialGradientHover: `radial-gradient(76.32% 95.59% at 50% 0%, #505050 0%, ${GRAY_SCALE.gray60} 100%)`,
|
||||||
|
};
|
||||||
27
packages/twenty-ui/src/theme/constants/BackgroundLight.ts
Normal file
27
packages/twenty-ui/src/theme/constants/BackgroundLight.ts
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
/* eslint-disable @nx/workspace-no-hardcoded-colors */
|
||||||
|
import LightNoise from '../assets/light-noise.png';
|
||||||
|
|
||||||
|
import { COLOR } from './Colors';
|
||||||
|
import { GRAY_SCALE } from './GrayScale';
|
||||||
|
import { RGBA } from './Rgba';
|
||||||
|
|
||||||
|
export const BACKGROUND_LIGHT = {
|
||||||
|
noisy: `url(${LightNoise.toString()});`,
|
||||||
|
primary: GRAY_SCALE.gray0,
|
||||||
|
secondary: GRAY_SCALE.gray10,
|
||||||
|
tertiary: GRAY_SCALE.gray15,
|
||||||
|
quaternary: GRAY_SCALE.gray20,
|
||||||
|
danger: COLOR.red10,
|
||||||
|
transparent: {
|
||||||
|
primary: RGBA(GRAY_SCALE.gray0, 0.8),
|
||||||
|
secondary: RGBA(GRAY_SCALE.gray10, 0.8),
|
||||||
|
strong: RGBA(GRAY_SCALE.gray100, 0.16),
|
||||||
|
medium: RGBA(GRAY_SCALE.gray100, 0.08),
|
||||||
|
light: RGBA(GRAY_SCALE.gray100, 0.04),
|
||||||
|
lighter: RGBA(GRAY_SCALE.gray100, 0.02),
|
||||||
|
danger: RGBA(COLOR.red, 0.08),
|
||||||
|
},
|
||||||
|
overlay: RGBA(GRAY_SCALE.gray80, 0.8),
|
||||||
|
radialGradient: `radial-gradient(50% 62.62% at 50% 0%, #505050 0%, ${GRAY_SCALE.gray60} 100%)`,
|
||||||
|
radialGradientHover: `radial-gradient(76.32% 95.59% at 50% 0%, #505050 0%, ${GRAY_SCALE.gray60} 100%)`,
|
||||||
|
};
|
||||||
4
packages/twenty-ui/src/theme/constants/Blur.ts
Normal file
4
packages/twenty-ui/src/theme/constants/Blur.ts
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
export const BLUR = {
|
||||||
|
light: 'blur(6px)',
|
||||||
|
strong: 'blur(20px)',
|
||||||
|
};
|
||||||
10
packages/twenty-ui/src/theme/constants/BorderCommon.ts
Normal file
10
packages/twenty-ui/src/theme/constants/BorderCommon.ts
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
export const BORDER_COMMON = {
|
||||||
|
radius: {
|
||||||
|
xs: '2px',
|
||||||
|
sm: '4px',
|
||||||
|
md: '8px',
|
||||||
|
xl: '20px',
|
||||||
|
pill: '999px',
|
||||||
|
rounded: '100%',
|
||||||
|
},
|
||||||
|
};
|
||||||
15
packages/twenty-ui/src/theme/constants/BorderDark.ts
Normal file
15
packages/twenty-ui/src/theme/constants/BorderDark.ts
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
import { BORDER_COMMON } from './BorderCommon';
|
||||||
|
import { COLOR } from './Colors';
|
||||||
|
import { GRAY_SCALE } from './GrayScale';
|
||||||
|
|
||||||
|
export const BORDER_DARK = {
|
||||||
|
color: {
|
||||||
|
strong: GRAY_SCALE.gray55,
|
||||||
|
medium: GRAY_SCALE.gray65,
|
||||||
|
light: GRAY_SCALE.gray70,
|
||||||
|
secondaryInverted: GRAY_SCALE.gray35,
|
||||||
|
inverted: GRAY_SCALE.gray20,
|
||||||
|
danger: COLOR.red70,
|
||||||
|
},
|
||||||
|
...BORDER_COMMON,
|
||||||
|
};
|
||||||
15
packages/twenty-ui/src/theme/constants/BorderLight.ts
Normal file
15
packages/twenty-ui/src/theme/constants/BorderLight.ts
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
import { BORDER_COMMON } from './BorderCommon';
|
||||||
|
import { COLOR } from './Colors';
|
||||||
|
import { GRAY_SCALE } from './GrayScale';
|
||||||
|
|
||||||
|
export const BORDER_LIGHT = {
|
||||||
|
color: {
|
||||||
|
strong: GRAY_SCALE.gray25,
|
||||||
|
medium: GRAY_SCALE.gray20,
|
||||||
|
light: GRAY_SCALE.gray15,
|
||||||
|
secondaryInverted: GRAY_SCALE.gray50,
|
||||||
|
inverted: GRAY_SCALE.gray60,
|
||||||
|
danger: COLOR.red20,
|
||||||
|
},
|
||||||
|
...BORDER_COMMON,
|
||||||
|
};
|
||||||
18
packages/twenty-ui/src/theme/constants/BoxShadowDark.ts
Normal file
18
packages/twenty-ui/src/theme/constants/BoxShadowDark.ts
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
import { GRAY_SCALE } from './GrayScale';
|
||||||
|
import { RGBA } from './Rgba';
|
||||||
|
|
||||||
|
export const BOX_SHADOW_DARK = {
|
||||||
|
light: `0px 2px 4px 0px ${RGBA(
|
||||||
|
GRAY_SCALE.gray100,
|
||||||
|
0.04,
|
||||||
|
)}, 0px 0px 4px 0px ${RGBA(GRAY_SCALE.gray100, 0.08)}`,
|
||||||
|
strong: `2px 4px 16px 0px ${RGBA(
|
||||||
|
GRAY_SCALE.gray100,
|
||||||
|
0.16,
|
||||||
|
)}, 0px 2px 4px 0px ${RGBA(GRAY_SCALE.gray100, 0.08)}`,
|
||||||
|
underline: `0px 1px 0px 0px ${RGBA(GRAY_SCALE.gray100, 0.32)}`,
|
||||||
|
superHeavy: `2px 4px 16px 0px ${RGBA(
|
||||||
|
GRAY_SCALE.gray100,
|
||||||
|
0.12,
|
||||||
|
)}, 0px 2px 4px 0px ${RGBA(GRAY_SCALE.gray100, 0.04)}`,
|
||||||
|
};
|
||||||
21
packages/twenty-ui/src/theme/constants/BoxShadowLight.ts
Normal file
21
packages/twenty-ui/src/theme/constants/BoxShadowLight.ts
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
import { GRAY_SCALE } from './GrayScale';
|
||||||
|
import { RGBA } from './Rgba';
|
||||||
|
|
||||||
|
export const BOX_SHADOW_LIGHT = {
|
||||||
|
light: `0px 2px 4px 0px ${RGBA(
|
||||||
|
GRAY_SCALE.gray100,
|
||||||
|
0.04,
|
||||||
|
)}, 0px 0px 4px 0px ${RGBA(GRAY_SCALE.gray100, 0.08)}`,
|
||||||
|
strong: `2px 4px 16px 0px ${RGBA(
|
||||||
|
GRAY_SCALE.gray100,
|
||||||
|
0.12,
|
||||||
|
)}, 0px 2px 4px 0px ${RGBA(GRAY_SCALE.gray100, 0.04)}`,
|
||||||
|
underline: `0px 1px 0px 0px ${RGBA(GRAY_SCALE.gray100, 0.32)}`,
|
||||||
|
superHeavy: `0px 0px 8px 0px ${RGBA(
|
||||||
|
GRAY_SCALE.gray100,
|
||||||
|
0.16,
|
||||||
|
)}, 0px 8px 64px -16px ${RGBA(
|
||||||
|
GRAY_SCALE.gray100,
|
||||||
|
0.48,
|
||||||
|
)}, 0px 24px 56px -16px ${RGBA(GRAY_SCALE.gray100, 0.08)}`,
|
||||||
|
};
|
||||||
7
packages/twenty-ui/src/theme/constants/Colors.ts
Normal file
7
packages/twenty-ui/src/theme/constants/Colors.ts
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
import { MAIN_COLORS } from './MainColors';
|
||||||
|
import { SECONDARY_COLORS } from './SecondaryColors';
|
||||||
|
|
||||||
|
export const COLOR = {
|
||||||
|
...MAIN_COLORS,
|
||||||
|
...SECONDARY_COLORS,
|
||||||
|
};
|
||||||
17
packages/twenty-ui/src/theme/constants/FontCommon.ts
Normal file
17
packages/twenty-ui/src/theme/constants/FontCommon.ts
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
export const FONT_COMMON = {
|
||||||
|
size: {
|
||||||
|
xxs: '0.625rem',
|
||||||
|
xs: '0.85rem',
|
||||||
|
sm: '0.92rem',
|
||||||
|
md: '1rem',
|
||||||
|
lg: '1.23rem',
|
||||||
|
xl: '1.54rem',
|
||||||
|
xxl: '1.85rem',
|
||||||
|
},
|
||||||
|
weight: {
|
||||||
|
regular: 400,
|
||||||
|
medium: 500,
|
||||||
|
semiBold: 600,
|
||||||
|
},
|
||||||
|
family: 'Inter, sans-serif',
|
||||||
|
};
|
||||||
16
packages/twenty-ui/src/theme/constants/FontDark.ts
Normal file
16
packages/twenty-ui/src/theme/constants/FontDark.ts
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
import { COLOR } from './Colors';
|
||||||
|
import { FONT_COMMON } from './FontCommon';
|
||||||
|
import { GRAY_SCALE } from './GrayScale';
|
||||||
|
|
||||||
|
export const FONT_DARK = {
|
||||||
|
color: {
|
||||||
|
primary: GRAY_SCALE.gray20,
|
||||||
|
secondary: GRAY_SCALE.gray35,
|
||||||
|
tertiary: GRAY_SCALE.gray45,
|
||||||
|
light: GRAY_SCALE.gray50,
|
||||||
|
extraLight: GRAY_SCALE.gray55,
|
||||||
|
inverted: GRAY_SCALE.gray100,
|
||||||
|
danger: COLOR.red,
|
||||||
|
},
|
||||||
|
...FONT_COMMON,
|
||||||
|
};
|
||||||
16
packages/twenty-ui/src/theme/constants/FontLight.ts
Normal file
16
packages/twenty-ui/src/theme/constants/FontLight.ts
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
import { COLOR } from './Colors';
|
||||||
|
import { FONT_COMMON } from './FontCommon';
|
||||||
|
import { GRAY_SCALE } from './GrayScale';
|
||||||
|
|
||||||
|
export const FONT_LIGHT = {
|
||||||
|
color: {
|
||||||
|
primary: GRAY_SCALE.gray60,
|
||||||
|
secondary: GRAY_SCALE.gray50,
|
||||||
|
tertiary: GRAY_SCALE.gray40,
|
||||||
|
light: GRAY_SCALE.gray35,
|
||||||
|
extraLight: GRAY_SCALE.gray30,
|
||||||
|
inverted: GRAY_SCALE.gray0,
|
||||||
|
danger: COLOR.red,
|
||||||
|
},
|
||||||
|
...FONT_COMMON,
|
||||||
|
};
|
||||||
22
packages/twenty-ui/src/theme/constants/GrayScale.ts
Normal file
22
packages/twenty-ui/src/theme/constants/GrayScale.ts
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
/* eslint-disable @nx/workspace-no-hardcoded-colors */
|
||||||
|
export const GRAY_SCALE = {
|
||||||
|
gray100: '#000000',
|
||||||
|
gray90: '#141414',
|
||||||
|
gray85: '#171717',
|
||||||
|
gray80: '#1b1b1b',
|
||||||
|
gray75: '#1d1d1d',
|
||||||
|
gray70: '#222222',
|
||||||
|
gray65: '#292929',
|
||||||
|
gray60: '#333333',
|
||||||
|
gray55: '#4c4c4c',
|
||||||
|
gray50: '#666666',
|
||||||
|
gray45: '#818181',
|
||||||
|
gray40: '#999999',
|
||||||
|
gray35: '#b3b3b3',
|
||||||
|
gray30: '#cccccc',
|
||||||
|
gray25: '#d6d6d6',
|
||||||
|
gray20: '#ebebeb',
|
||||||
|
gray15: '#f1f1f1',
|
||||||
|
gray10: '#fcfcfc',
|
||||||
|
gray0: '#ffffff',
|
||||||
|
};
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
import { css } from '@emotion/react';
|
||||||
|
|
||||||
|
export const HOVER_BACKGROUND = (props: any) => css`
|
||||||
|
transition: background 0.1s ease;
|
||||||
|
&:hover {
|
||||||
|
background: ${props.theme.background.transparent.light};
|
||||||
|
}
|
||||||
|
`;
|
||||||
13
packages/twenty-ui/src/theme/constants/Icon.ts
Normal file
13
packages/twenty-ui/src/theme/constants/Icon.ts
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
export const ICON = {
|
||||||
|
size: {
|
||||||
|
sm: 14,
|
||||||
|
md: 16,
|
||||||
|
lg: 20,
|
||||||
|
xl: 40,
|
||||||
|
},
|
||||||
|
stroke: {
|
||||||
|
sm: 1.6,
|
||||||
|
md: 2,
|
||||||
|
lg: 2.5,
|
||||||
|
},
|
||||||
|
};
|
||||||
5
packages/twenty-ui/src/theme/constants/MainColorNames.ts
Normal file
5
packages/twenty-ui/src/theme/constants/MainColorNames.ts
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
import { MAIN_COLORS } from './MainColors';
|
||||||
|
|
||||||
|
export const MAIN_COLOR_NAMES = Object.keys(MAIN_COLORS) as ThemeColor[];
|
||||||
|
|
||||||
|
export type ThemeColor = keyof typeof MAIN_COLORS;
|
||||||
15
packages/twenty-ui/src/theme/constants/MainColors.ts
Normal file
15
packages/twenty-ui/src/theme/constants/MainColors.ts
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
/* eslint-disable @nx/workspace-no-hardcoded-colors */
|
||||||
|
import { GRAY_SCALE } from './GrayScale';
|
||||||
|
|
||||||
|
export const MAIN_COLORS = {
|
||||||
|
green: '#55ef3c',
|
||||||
|
turquoise: '#15de8f',
|
||||||
|
sky: '#00e0ff',
|
||||||
|
blue: '#1961ed',
|
||||||
|
purple: '#915ffd',
|
||||||
|
pink: '#f54bd0',
|
||||||
|
red: '#f83e3e',
|
||||||
|
orange: '#ff7222',
|
||||||
|
yellow: '#ffd338',
|
||||||
|
gray: GRAY_SCALE.gray30,
|
||||||
|
};
|
||||||
1
packages/twenty-ui/src/theme/constants/MobileViewport.ts
Normal file
1
packages/twenty-ui/src/theme/constants/MobileViewport.ts
Normal file
@@ -0,0 +1 @@
|
|||||||
|
export const MOBILE_VIEWPORT = 768;
|
||||||
7
packages/twenty-ui/src/theme/constants/Modal.ts
Normal file
7
packages/twenty-ui/src/theme/constants/Modal.ts
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
export const MODAL = {
|
||||||
|
size: {
|
||||||
|
sm: '300px',
|
||||||
|
md: '400px',
|
||||||
|
lg: '53%',
|
||||||
|
},
|
||||||
|
};
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
import { css } from '@emotion/react';
|
||||||
|
|
||||||
|
import { ThemeType } from '..';
|
||||||
|
|
||||||
|
export const OVERLAY_BACKGROUND = (props: { theme: ThemeType }) => css`
|
||||||
|
backdrop-filter: blur(8px);
|
||||||
|
background: ${props.theme.background.transparent.secondary};
|
||||||
|
box-shadow: ${props.theme.boxShadow.strong};
|
||||||
|
`;
|
||||||
8
packages/twenty-ui/src/theme/constants/Rgba.ts
Normal file
8
packages/twenty-ui/src/theme/constants/Rgba.ts
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
/* eslint-disable @nx/workspace-no-hardcoded-colors */
|
||||||
|
import hexRgb from 'hex-rgb';
|
||||||
|
|
||||||
|
export const RGBA = (hex: string, alpha: number) => {
|
||||||
|
return `rgba(${hexRgb(hex, { format: 'array' })
|
||||||
|
.slice(0, -1)
|
||||||
|
.join(',')},${alpha})`;
|
||||||
|
};
|
||||||
106
packages/twenty-ui/src/theme/constants/SecondaryColors.ts
Normal file
106
packages/twenty-ui/src/theme/constants/SecondaryColors.ts
Normal file
@@ -0,0 +1,106 @@
|
|||||||
|
/* eslint-disable @nx/workspace-no-hardcoded-colors */
|
||||||
|
import { GRAY_SCALE } from './GrayScale';
|
||||||
|
|
||||||
|
export const SECONDARY_COLORS = {
|
||||||
|
yellow80: '#2e2a1a',
|
||||||
|
yellow70: '#453d1e',
|
||||||
|
yellow60: '#746224',
|
||||||
|
yellow50: '#b99b2e',
|
||||||
|
yellow40: '#ffe074',
|
||||||
|
yellow30: '#ffedaf',
|
||||||
|
yellow20: '#fff6d7',
|
||||||
|
yellow10: '#fffbeb',
|
||||||
|
|
||||||
|
green80: '#1d2d1b',
|
||||||
|
green70: '#23421e',
|
||||||
|
green60: '#2a5822',
|
||||||
|
green50: '#42ae31',
|
||||||
|
green40: '#88f477',
|
||||||
|
green30: '#ccfac5',
|
||||||
|
green20: '#ddfcd8',
|
||||||
|
green10: '#eefdec',
|
||||||
|
|
||||||
|
turquoise80: '#172b23',
|
||||||
|
turquoise70: '#173f2f',
|
||||||
|
turquoise60: '#166747',
|
||||||
|
turquoise50: '#16a26b',
|
||||||
|
turquoise40: '#5be8b1',
|
||||||
|
turquoise30: '#a1f2d2',
|
||||||
|
turquoise20: '#d0f8e9',
|
||||||
|
turquoise10: '#e8fcf4',
|
||||||
|
|
||||||
|
sky80: '#152b2e',
|
||||||
|
sky70: '#123f45',
|
||||||
|
sky60: '#0e6874',
|
||||||
|
sky50: '#07a4b9',
|
||||||
|
sky40: '#4de9ff',
|
||||||
|
sky30: '#99f3ff',
|
||||||
|
sky20: '#ccf9ff',
|
||||||
|
sky10: '#e5fcff',
|
||||||
|
|
||||||
|
blue80: '#171e2c',
|
||||||
|
blue70: '#172642',
|
||||||
|
blue60: '#18356d',
|
||||||
|
blue50: '#184bad',
|
||||||
|
blue40: '#5e90f2',
|
||||||
|
blue30: '#a3c0f8',
|
||||||
|
blue20: '#d1dffb',
|
||||||
|
blue10: '#e8effd',
|
||||||
|
|
||||||
|
purple80: '#231e2e',
|
||||||
|
purple70: '#2f2545',
|
||||||
|
purple60: '#483473',
|
||||||
|
purple50: '#6c49b8',
|
||||||
|
purple40: '#b28ffe',
|
||||||
|
purple30: '#d3bffe',
|
||||||
|
purple20: '#e9dfff',
|
||||||
|
purple10: '#f4efff',
|
||||||
|
|
||||||
|
pink80: '#2d1c29',
|
||||||
|
pink70: '#43213c',
|
||||||
|
pink60: '#702c61',
|
||||||
|
pink50: '#b23b98',
|
||||||
|
pink40: '#f881de',
|
||||||
|
pink30: '#fbb7ec',
|
||||||
|
pink20: '#fddbf6',
|
||||||
|
pink10: '#feedfa',
|
||||||
|
|
||||||
|
red80: '#2d1b1b',
|
||||||
|
red70: '#441f1f',
|
||||||
|
red60: '#712727',
|
||||||
|
red50: '#b43232',
|
||||||
|
red40: '#fa7878',
|
||||||
|
red30: '#fcb2b2',
|
||||||
|
red20: '#fed8d8',
|
||||||
|
red10: '#feecec',
|
||||||
|
|
||||||
|
orange80: '#2e2018',
|
||||||
|
orange70: '#452919',
|
||||||
|
orange60: '#743b1b',
|
||||||
|
orange50: '#b9571f',
|
||||||
|
orange40: '#ff9c64',
|
||||||
|
orange30: '#ffc7a7',
|
||||||
|
orange20: '#ffe3d3',
|
||||||
|
orange10: '#fff1e9',
|
||||||
|
|
||||||
|
gray80: GRAY_SCALE.gray70,
|
||||||
|
gray70: GRAY_SCALE.gray65,
|
||||||
|
gray60: GRAY_SCALE.gray55,
|
||||||
|
gray50: GRAY_SCALE.gray40,
|
||||||
|
gray40: GRAY_SCALE.gray25,
|
||||||
|
gray30: GRAY_SCALE.gray20,
|
||||||
|
gray20: GRAY_SCALE.gray15,
|
||||||
|
gray10: GRAY_SCALE.gray10,
|
||||||
|
blueAccent90: '#141a25',
|
||||||
|
blueAccent85: '#151d2e',
|
||||||
|
blueAccent80: '#152037',
|
||||||
|
blueAccent75: '#16233f',
|
||||||
|
blueAccent70: '#17294a',
|
||||||
|
blueAccent60: '#18356d',
|
||||||
|
blueAccent40: '#a3c0f8',
|
||||||
|
blueAccent35: '#c8d9fb',
|
||||||
|
blueAccent25: '#dae6fc',
|
||||||
|
blueAccent20: '#e2ecfd',
|
||||||
|
blueAccent15: '#edf2fe',
|
||||||
|
blueAccent10: '#f5f9fd',
|
||||||
|
};
|
||||||
28
packages/twenty-ui/src/theme/constants/TagDark.ts
Normal file
28
packages/twenty-ui/src/theme/constants/TagDark.ts
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
import { COLOR } from './Colors';
|
||||||
|
|
||||||
|
export const TAG_DARK = {
|
||||||
|
text: {
|
||||||
|
green: COLOR.green10,
|
||||||
|
turquoise: COLOR.turquoise10,
|
||||||
|
sky: COLOR.sky10,
|
||||||
|
blue: COLOR.blue10,
|
||||||
|
purple: COLOR.purple10,
|
||||||
|
pink: COLOR.pink10,
|
||||||
|
red: COLOR.red10,
|
||||||
|
orange: COLOR.orange10,
|
||||||
|
yellow: COLOR.yellow10,
|
||||||
|
gray: COLOR.gray10,
|
||||||
|
},
|
||||||
|
background: {
|
||||||
|
green: COLOR.green60,
|
||||||
|
turquoise: COLOR.turquoise60,
|
||||||
|
sky: COLOR.sky60,
|
||||||
|
blue: COLOR.blue60,
|
||||||
|
purple: COLOR.purple60,
|
||||||
|
pink: COLOR.pink60,
|
||||||
|
red: COLOR.red60,
|
||||||
|
orange: COLOR.orange60,
|
||||||
|
yellow: COLOR.yellow60,
|
||||||
|
gray: COLOR.gray60,
|
||||||
|
},
|
||||||
|
};
|
||||||
28
packages/twenty-ui/src/theme/constants/TagLight.ts
Normal file
28
packages/twenty-ui/src/theme/constants/TagLight.ts
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
import { COLOR } from './Colors';
|
||||||
|
|
||||||
|
export const TAG_LIGHT = {
|
||||||
|
text: {
|
||||||
|
green: COLOR.green60,
|
||||||
|
turquoise: COLOR.turquoise60,
|
||||||
|
sky: COLOR.sky60,
|
||||||
|
blue: COLOR.blue60,
|
||||||
|
purple: COLOR.purple60,
|
||||||
|
pink: COLOR.pink60,
|
||||||
|
red: COLOR.red60,
|
||||||
|
orange: COLOR.orange60,
|
||||||
|
yellow: COLOR.yellow60,
|
||||||
|
gray: COLOR.gray60,
|
||||||
|
},
|
||||||
|
background: {
|
||||||
|
green: COLOR.green20,
|
||||||
|
turquoise: COLOR.turquoise20,
|
||||||
|
sky: COLOR.sky20,
|
||||||
|
blue: COLOR.blue20,
|
||||||
|
purple: COLOR.purple20,
|
||||||
|
pink: COLOR.pink20,
|
||||||
|
red: COLOR.red20,
|
||||||
|
orange: COLOR.orange20,
|
||||||
|
yellow: COLOR.yellow20,
|
||||||
|
gray: COLOR.gray20,
|
||||||
|
},
|
||||||
|
};
|
||||||
13
packages/twenty-ui/src/theme/constants/Text.ts
Normal file
13
packages/twenty-ui/src/theme/constants/Text.ts
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
export const TEXT = {
|
||||||
|
lineHeight: {
|
||||||
|
lg: 1.5,
|
||||||
|
md: 1.2,
|
||||||
|
},
|
||||||
|
|
||||||
|
iconSizeMedium: 16,
|
||||||
|
iconSizeSmall: 14,
|
||||||
|
|
||||||
|
iconStrikeLight: 1.6,
|
||||||
|
iconStrikeMedium: 2,
|
||||||
|
iconStrikeBold: 2.5,
|
||||||
|
};
|
||||||
21
packages/twenty-ui/src/theme/constants/TextInputStyle.ts
Normal file
21
packages/twenty-ui/src/theme/constants/TextInputStyle.ts
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
import { css } from '@emotion/react';
|
||||||
|
|
||||||
|
import { ThemeType } from '..';
|
||||||
|
|
||||||
|
export const TEXT_INPUT_STYLE = (props: { theme: ThemeType }) => css`
|
||||||
|
background-color: transparent;
|
||||||
|
border: none;
|
||||||
|
color: ${props.theme.font.color.primary};
|
||||||
|
font-family: ${props.theme.font.family};
|
||||||
|
font-size: inherit;
|
||||||
|
font-weight: inherit;
|
||||||
|
outline: none;
|
||||||
|
padding: ${props.theme.spacing(0)} ${props.theme.spacing(2)};
|
||||||
|
|
||||||
|
&::placeholder,
|
||||||
|
&::-webkit-input-placeholder {
|
||||||
|
color: ${props.theme.font.color.light};
|
||||||
|
font-family: ${props.theme.font.family};
|
||||||
|
font-weight: ${props.theme.font.weight.medium};
|
||||||
|
}
|
||||||
|
`;
|
||||||
44
packages/twenty-ui/src/theme/constants/ThemeCommon.ts
Normal file
44
packages/twenty-ui/src/theme/constants/ThemeCommon.ts
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
/* eslint-disable @nx/workspace-no-hardcoded-colors */
|
||||||
|
import { ANIMATION } from './Animation';
|
||||||
|
import { BLUR } from './Blur';
|
||||||
|
import { COLOR } from './Colors';
|
||||||
|
import { GRAY_SCALE } from './GrayScale';
|
||||||
|
import { ICON } from './Icon';
|
||||||
|
import { MODAL } from './Modal';
|
||||||
|
import { TEXT } from './Text';
|
||||||
|
|
||||||
|
export const THEME_COMMON = {
|
||||||
|
color: COLOR,
|
||||||
|
grayScale: GRAY_SCALE,
|
||||||
|
icon: ICON,
|
||||||
|
modal: MODAL,
|
||||||
|
text: TEXT,
|
||||||
|
blur: BLUR,
|
||||||
|
animation: ANIMATION,
|
||||||
|
snackBar: {
|
||||||
|
success: {
|
||||||
|
background: '#16A26B',
|
||||||
|
color: '#D0F8E9',
|
||||||
|
},
|
||||||
|
error: {
|
||||||
|
background: '#B43232',
|
||||||
|
color: '#FED8D8',
|
||||||
|
},
|
||||||
|
info: {
|
||||||
|
background: COLOR.gray80,
|
||||||
|
color: GRAY_SCALE.gray0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
spacingMultiplicator: 4,
|
||||||
|
spacing: (...args: number[]) =>
|
||||||
|
args.map((multiplicator) => `${multiplicator * 4}px`).join(' '),
|
||||||
|
betweenSiblingsGap: `2px`,
|
||||||
|
table: {
|
||||||
|
horizontalCellMargin: '8px',
|
||||||
|
checkboxColumnWidth: '32px',
|
||||||
|
horizontalCellPadding: '8px',
|
||||||
|
},
|
||||||
|
rightDrawerWidth: '500px',
|
||||||
|
clickableElementBackgroundTransition: 'background 0.1s ease',
|
||||||
|
lastLayerZIndex: 2147483647,
|
||||||
|
};
|
||||||
22
packages/twenty-ui/src/theme/constants/ThemeDark.ts
Normal file
22
packages/twenty-ui/src/theme/constants/ThemeDark.ts
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
import { ThemeType } from '..';
|
||||||
|
|
||||||
|
import { ACCENT_DARK } from './AccentDark';
|
||||||
|
import { BACKGROUND_DARK } from './BackgroundDark';
|
||||||
|
import { BORDER_DARK } from './BorderDark';
|
||||||
|
import { BOX_SHADOW_DARK } from './BoxShadowDark';
|
||||||
|
import { FONT_DARK } from './FontDark';
|
||||||
|
import { TAG_DARK } from './TagDark';
|
||||||
|
import { THEME_COMMON } from './ThemeCommon';
|
||||||
|
|
||||||
|
export const THEME_DARK: ThemeType = {
|
||||||
|
...THEME_COMMON,
|
||||||
|
...{
|
||||||
|
accent: ACCENT_DARK,
|
||||||
|
background: BACKGROUND_DARK,
|
||||||
|
border: BORDER_DARK,
|
||||||
|
tag: TAG_DARK,
|
||||||
|
boxShadow: BOX_SHADOW_DARK,
|
||||||
|
font: FONT_DARK,
|
||||||
|
name: 'dark',
|
||||||
|
},
|
||||||
|
};
|
||||||
20
packages/twenty-ui/src/theme/constants/ThemeLight.ts
Normal file
20
packages/twenty-ui/src/theme/constants/ThemeLight.ts
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
import { ACCENT_LIGHT } from './AccentLight';
|
||||||
|
import { BACKGROUND_LIGHT } from './BackgroundLight';
|
||||||
|
import { BORDER_LIGHT } from './BorderLight';
|
||||||
|
import { BOX_SHADOW_LIGHT } from './BoxShadowLight';
|
||||||
|
import { FONT_LIGHT } from './FontLight';
|
||||||
|
import { TAG_LIGHT } from './TagLight';
|
||||||
|
import { THEME_COMMON } from './ThemeCommon';
|
||||||
|
|
||||||
|
export const THEME_LIGHT = {
|
||||||
|
...THEME_COMMON,
|
||||||
|
...{
|
||||||
|
accent: ACCENT_LIGHT,
|
||||||
|
background: BACKGROUND_LIGHT,
|
||||||
|
border: BORDER_LIGHT,
|
||||||
|
tag: TAG_LIGHT,
|
||||||
|
boxShadow: BOX_SHADOW_LIGHT,
|
||||||
|
font: FONT_LIGHT,
|
||||||
|
name: 'light',
|
||||||
|
},
|
||||||
|
};
|
||||||
5
packages/twenty-ui/src/theme/index.ts
Normal file
5
packages/twenty-ui/src/theme/index.ts
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
import { THEME_DARK } from './constants/ThemeDark';
|
||||||
|
import { THEME_LIGHT } from './constants/ThemeLight';
|
||||||
|
|
||||||
|
export type ThemeType = typeof THEME_LIGHT;
|
||||||
|
export { THEME_DARK, THEME_LIGHT };
|
||||||
16
packages/twenty-ui/src/theme/provider/ThemeProvider.tsx
Normal file
16
packages/twenty-ui/src/theme/provider/ThemeProvider.tsx
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
// ThemeProvider.tsx
|
||||||
|
import * as React from 'react';
|
||||||
|
import { ThemeProvider as EmotionThemeProvider } from '@emotion/react';
|
||||||
|
|
||||||
|
import { ThemeType } from '..';
|
||||||
|
|
||||||
|
type ThemeProviderProps = {
|
||||||
|
theme: ThemeType;
|
||||||
|
children: React.ReactNode;
|
||||||
|
};
|
||||||
|
|
||||||
|
const ThemeProvider: React.FC<ThemeProviderProps> = ({ theme, children }) => {
|
||||||
|
return <EmotionThemeProvider theme={theme}>{children}</EmotionThemeProvider>;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default ThemeProvider;
|
||||||
26
packages/twenty-ui/tsconfig.json
Normal file
26
packages/twenty-ui/tsconfig.json
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"extends": "../../tsconfig.base.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"module": "commonjs",
|
||||||
|
"forceConsistentCasingInFileNames": true,
|
||||||
|
"strict": true,
|
||||||
|
"noImplicitOverride": true,
|
||||||
|
"noPropertyAccessFromIndexSignature": true,
|
||||||
|
"noImplicitReturns": true,
|
||||||
|
"noFallthroughCasesInSwitch": true,
|
||||||
|
"jsx": "react"
|
||||||
|
},
|
||||||
|
"files": [],
|
||||||
|
"include": [],
|
||||||
|
"references": [
|
||||||
|
{
|
||||||
|
"path": "./tsconfig.lib.json"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "./tsconfig.spec.json"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": "./tsconfig.storybook.json"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
18
packages/twenty-ui/tsconfig.lib.json
Normal file
18
packages/twenty-ui/tsconfig.lib.json
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"extends": "./tsconfig.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"outDir": "../../dist/out-tsc",
|
||||||
|
"declaration": true,
|
||||||
|
"types": ["node", "vite/client"]
|
||||||
|
},
|
||||||
|
"include": ["src/**/*.ts"],
|
||||||
|
"exclude": [
|
||||||
|
"jest.config.ts",
|
||||||
|
"src/**/*.spec.ts",
|
||||||
|
"src/**/*.test.ts",
|
||||||
|
"**/*.stories.ts",
|
||||||
|
"**/*.stories.js",
|
||||||
|
"**/*.stories.jsx",
|
||||||
|
"**/*.stories.tsx"
|
||||||
|
]
|
||||||
|
}
|
||||||
14
packages/twenty-ui/tsconfig.spec.json
Normal file
14
packages/twenty-ui/tsconfig.spec.json
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"extends": "./tsconfig.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"outDir": "../../dist/out-tsc",
|
||||||
|
"module": "commonjs",
|
||||||
|
"types": ["jest", "node"]
|
||||||
|
},
|
||||||
|
"include": [
|
||||||
|
"jest.config.ts",
|
||||||
|
"src/**/*.test.ts",
|
||||||
|
"src/**/*.spec.ts",
|
||||||
|
"src/**/*.d.ts"
|
||||||
|
]
|
||||||
|
}
|
||||||
32
packages/twenty-ui/tsconfig.storybook.json
Normal file
32
packages/twenty-ui/tsconfig.storybook.json
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
{
|
||||||
|
"extends": "./tsconfig.json",
|
||||||
|
"compilerOptions": {
|
||||||
|
"emitDecoratorMetadata": true,
|
||||||
|
"outDir": ""
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"../../node_modules/@nx/react/typings/styled-jsx.d.ts",
|
||||||
|
"../../node_modules/@nx/react/typings/cssmodule.d.ts",
|
||||||
|
"../../node_modules/@nx/react/typings/image.d.ts"
|
||||||
|
],
|
||||||
|
"exclude": [
|
||||||
|
"src/**/*.spec.ts",
|
||||||
|
"src/**/*.test.ts",
|
||||||
|
"src/**/*.spec.js",
|
||||||
|
"src/**/*.test.js",
|
||||||
|
"src/**/*.spec.tsx",
|
||||||
|
"src/**/*.test.tsx",
|
||||||
|
"src/**/*.spec.jsx",
|
||||||
|
"src/**/*.test.js"
|
||||||
|
],
|
||||||
|
"include": [
|
||||||
|
"src/**/*.stories.ts",
|
||||||
|
"src/**/*.stories.js",
|
||||||
|
"src/**/*.stories.jsx",
|
||||||
|
"src/**/*.stories.tsx",
|
||||||
|
"src/**/*.stories.mdx",
|
||||||
|
".storybook/*.js",
|
||||||
|
".storybook/*.ts",
|
||||||
|
".storybook/main.tsx"
|
||||||
|
]
|
||||||
|
}
|
||||||
47
packages/twenty-ui/vite.config.ts
Normal file
47
packages/twenty-ui/vite.config.ts
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
/// <reference types='vitest' />
|
||||||
|
import { nxViteTsPaths } from '@nx/vite/plugins/nx-tsconfig-paths.plugin';
|
||||||
|
import * as path from 'path';
|
||||||
|
import { defineConfig } from 'vite';
|
||||||
|
import dts from 'vite-plugin-dts';
|
||||||
|
|
||||||
|
export default defineConfig({
|
||||||
|
root: __dirname,
|
||||||
|
cacheDir: '../../node_modules/.vite/packages/twenty-ui',
|
||||||
|
|
||||||
|
plugins: [
|
||||||
|
nxViteTsPaths(),
|
||||||
|
dts({
|
||||||
|
entryRoot: 'src',
|
||||||
|
tsConfigFilePath: path.join(__dirname, 'tsconfig.lib.json'),
|
||||||
|
skipDiagnostics: true,
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
|
||||||
|
// Uncomment this if you are using workers.
|
||||||
|
// worker: {
|
||||||
|
// plugins: [ nxViteTsPaths() ],
|
||||||
|
// },
|
||||||
|
|
||||||
|
// Configuration for building your library.
|
||||||
|
// See: https://vitejs.dev/guide/build.html#library-mode
|
||||||
|
build: {
|
||||||
|
outDir: './dist',
|
||||||
|
reportCompressedSize: true,
|
||||||
|
commonjsOptions: {
|
||||||
|
transformMixedEsModules: true,
|
||||||
|
},
|
||||||
|
lib: {
|
||||||
|
// Could also be a dictionary or array of multiple entry points.
|
||||||
|
entry: 'src/index.ts',
|
||||||
|
name: 'twenty-ui',
|
||||||
|
fileName: 'index',
|
||||||
|
// Change this to the formats you want to support.
|
||||||
|
// Don't forget to update your package.json as well.
|
||||||
|
formats: ['es', 'cjs'],
|
||||||
|
},
|
||||||
|
rollupOptions: {
|
||||||
|
// External packages that should not be bundled into your library.
|
||||||
|
external: [],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
@@ -15,7 +15,8 @@
|
|||||||
"skipDefaultLibCheck": true,
|
"skipDefaultLibCheck": true,
|
||||||
"baseUrl": ".",
|
"baseUrl": ".",
|
||||||
"paths": {
|
"paths": {
|
||||||
"twenty-emails": ["packages/twenty-emails/src/index.ts"]
|
"twenty-emails": ["packages/twenty-emails/src/index.ts"],
|
||||||
|
"twenty-ui": ["packages/twenty-ui/src/index.ts"]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"exclude": ["node_modules", "tmp"]
|
"exclude": ["node_modules", "tmp"]
|
||||||
|
|||||||
Reference in New Issue
Block a user