oneslash-design-system 1.2.11 → 1.2.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/.claude/settings.local.json +9 -0
  2. package/.eslintrc.json +3 -0
  3. package/components/alert.tsx +132 -0
  4. package/components/button.tsx +120 -0
  5. package/components/checkBox.tsx +60 -0
  6. package/components/emptyBox.tsx +33 -0
  7. package/components/iconButton.tsx +103 -0
  8. package/components/loadingScreen.tsx +30 -0
  9. package/components/menu.tsx +35 -0
  10. package/components/menuItem.tsx +117 -0
  11. package/components/modal.tsx +85 -0
  12. package/components/navigation.tsx +27 -0
  13. package/components/popover.tsx +69 -0
  14. package/components/radioGroup.tsx +50 -0
  15. package/components/select.tsx +253 -0
  16. package/components/tab.tsx +85 -0
  17. package/components/tableCell.tsx +15 -0
  18. package/components/tableContainer.tsx +15 -0
  19. package/components/tableHeader.tsx +15 -0
  20. package/components/tableHeaderCell.tsx +15 -0
  21. package/components/tableRow.tsx +15 -0
  22. package/components/tabsContainer.tsx +23 -0
  23. package/components/tag.tsx +81 -0
  24. package/components/textField.tsx +116 -0
  25. package/components/textarea.tsx +120 -0
  26. package/components/timeStamp.tsx +65 -0
  27. package/components/tooltip.tsx +66 -0
  28. package/components/userImage.tsx +64 -0
  29. package/designTokens.js +234 -0
  30. package/dist/components/loadingScreen.jsx +2 -2
  31. package/dist/components/menuItem.d.ts +2 -8
  32. package/dist/components/menuItem.jsx +14 -34
  33. package/dist/components/tag.d.ts +2 -1
  34. package/dist/components/tag.jsx +22 -22
  35. package/index.css +8 -0
  36. package/index.ts +21 -0
  37. package/next.config.mjs +4 -0
  38. package/package.json +4 -28
  39. package/postcss.config.mjs +8 -0
  40. package/tailwind.config.ts +232 -0
  41. package/tsconfig.json +37 -0
  42. package/dist/tsconfig.tsbuildinfo +0 -1
@@ -0,0 +1,234 @@
1
+ // design tokens definitions
2
+ module.exports = {
3
+ colors: {
4
+ // light
5
+ light:{
6
+ text:{
7
+ primary: '#000000',
8
+ secondary: '#6D6D6D',
9
+ disabled: '#9E9E9E',
10
+ contrast: '#ffffff',
11
+ },
12
+ accent:{
13
+ main: '#EEAE03',
14
+ dark: '#CE8602',
15
+ light: '#FFDD43',
16
+ contrast: '#000000',
17
+ },
18
+ primary:{
19
+ main: '#454545',
20
+ dark: '#262626',
21
+ light: '#888888',
22
+ },
23
+ secondary:{
24
+ main: '#B0B0B0',
25
+ dark: '#888888',
26
+ light: '#D1D1D1',
27
+ },
28
+ error:{
29
+ main: '#D32F2F',
30
+ dark: '#B22323',
31
+ light: '#F27777',
32
+ },
33
+ warning:{
34
+ main: '#EF6C00',
35
+ dark: '#CC5302',
36
+ light: '#FFA732',
37
+ },
38
+ info:{
39
+ main: '#0087D4',
40
+ dark: '#006BAB',
41
+ light: '#2CC1FF',
42
+ },
43
+ success:{
44
+ main: '#328736',
45
+ dark: '#2A6B2D',
46
+ light: '#67C16B',
47
+ },
48
+ background:{
49
+ default: '#e8e8e8',
50
+ accent100:'#f1f1f1',
51
+ accent200:'#f7f7f7',
52
+ accent300:'#FFFFFF',
53
+ },
54
+ action:{
55
+ active: '#888888',
56
+ hover: '#F3F3F3',
57
+ selected: '#E3E3E3',
58
+ disabledBackground: '#D1D1D1',
59
+ disabled: '#B0B0B0',
60
+ },
61
+ actionBackground:{
62
+ enabled: '#FFFFFF',
63
+ hovered: '#FFFFFF',
64
+ selected: '#FFFFFF',
65
+ disabled: '#EEEEEE',
66
+ },
67
+ actionOutlinedBorder:{
68
+ enabled: '#888888',
69
+ hovered: '#CDCDCD',
70
+ selected: '#E8E8E8',
71
+ disabled: '#B0B0B0',
72
+ },
73
+ misc:{
74
+ divider: '#D1D1D1',
75
+ },
76
+ },
77
+
78
+ // dark
79
+ dark:{
80
+ text:{
81
+ primary: '#eeeeee',
82
+ secondary: '#B0B0B0',
83
+ disabled: '#6D6D6D',
84
+ contrast: '#000000',
85
+ },
86
+ accent:{
87
+ main: '#FFCD29',
88
+ dark: '#CE8602',
89
+ light: '#FFDD43',
90
+ contrast: '#000000',
91
+ },
92
+ primary:{
93
+ main: '#D5D5D5',
94
+ dark: '#E9E9E9',
95
+ light: '#9A9A9A',
96
+ },
97
+ secondary:{
98
+ main: '#4F4F4F',
99
+ dark: '#454545',
100
+ light: '#6D6D6D',
101
+ },
102
+ error:{
103
+ main: '#E74C4C',
104
+ dark: '#B22323',
105
+ light: '#F27777',
106
+ },
107
+ warning:{
108
+ main: '#FF8C0A',
109
+ dark: '#CC5302',
110
+ light: '#FFA732',
111
+ },
112
+ info:{
113
+ main: '#00AFFF',
114
+ dark: '#006BAB',
115
+ light: '#2CC1FF',
116
+ },
117
+ success:{
118
+ main: '#42A547',
119
+ dark: '#2A6B2D',
120
+ light: '#67C16B',
121
+ },
122
+ background:{
123
+ default: '#262626',
124
+ accent100:'#333333',
125
+ accent200:'#454545',
126
+ accent300:'#4F4F4F',
127
+ },
128
+ action:{
129
+ active: '#171717',
130
+ hover: '#3D3D3D',
131
+ selected: '#4E4E4E',
132
+ disabledBackground: '#3C3C3C',
133
+ disabled: '#383838',
134
+ },
135
+ actionBackground:{
136
+ enabled: '#FFFFFF',
137
+ hovered: '#FFFFFF',
138
+ selected: '#FFFFFF',
139
+ disabled: '#383838',
140
+ },
141
+ actionOutlinedBorder:{
142
+ enabled: '#7B7B7B',
143
+ hovered: '#2F2F2F',
144
+ selected: '#404040',
145
+ disabled: '#383838',
146
+ },
147
+ misc:{
148
+ divider: '#404040',
149
+ },
150
+ },
151
+ },
152
+
153
+ spacing: {
154
+ small: '4px',
155
+ medium: '8px',
156
+ large: '16px',
157
+ },
158
+
159
+ typography: {
160
+ family: 'Inter, sans-serif',
161
+ h1: {
162
+ weight: '300',
163
+ size: '96px',
164
+ lineHeight: '120%',
165
+ letterSpacing: '-1.5px',
166
+ },
167
+ h2: {
168
+ weight: '300',
169
+ size: '60px',
170
+ lineHeight: '120%',
171
+ letterSpacing: '-0.5px',
172
+ },
173
+ h3: {
174
+ weight: '400',
175
+ size: '48px',
176
+ lineHeight: '120%',
177
+ letterSpacing: '0px',
178
+ },
179
+ h4: {
180
+ weight: '400',
181
+ size: '34px',
182
+ lineHeight: '120%',
183
+ letterSpacing: '0.3px',
184
+ },
185
+ h5: {
186
+ weight: '400',
187
+ size: '24px',
188
+ lineHeight: '120%',
189
+ letterSpacing: '0px',
190
+ },
191
+ h6: {
192
+ weight: '500',
193
+ size: '20px',
194
+ lineHeight: '150%',
195
+ letterSpacing: '0.2px',
196
+ },
197
+ subtitle1: {
198
+ weight: '500',
199
+ size: '16px',
200
+ lineHeight: '150%',
201
+ letterSpacing: '0.2px',
202
+ },
203
+ subtitle2: {
204
+ weight: '500',
205
+ size: '14px',
206
+ lineHeight: '150%',
207
+ letterSpacing: '0.1px',
208
+ },
209
+ body1: {
210
+ weight: '400',
211
+ size: '16px',
212
+ lineHeight: '150%',
213
+ letterSpacing: '0.2px',
214
+ },
215
+ body2: {
216
+ weight: '400',
217
+ size: '14px',
218
+ lineHeight: '150%',
219
+ letterSpacing: '0.2px',
220
+ },
221
+ caption: {
222
+ weight: '400',
223
+ size: '12px',
224
+ lineHeight: '150%',
225
+ letterSpacing: '0.5px',
226
+ },
227
+ alignments: {
228
+ left: 'left',
229
+ center: 'center',
230
+ right: 'right',
231
+ justify: 'justify',
232
+ },
233
+ },
234
+ };
@@ -2,7 +2,7 @@
2
2
  import React from 'react';
3
3
  export default function LoadingScreen() {
4
4
  return (<div className="flex justify-center items-center h-full w-full min-h-[200px]">
5
- <div className="w-12 h-12 border-4 border-t-transparent border-light-text-primary dark:border-dark-text-primary dark:border-t-transparent rounded-full animate-spin"></div>
5
+ <div className="w-12 h-12 border-4 border-t-transparent border-light-accent-main rounded-full animate-spin"></div>
6
6
  </div>);
7
7
  }
8
8
  ;
@@ -14,6 +14,6 @@ export function LoadingSmall(_a) {
14
14
  small: 'w-5 h-5 border-2', // 20px, slightly thinner border
15
15
  };
16
16
  return (<div className="flex justify-center items-center">
17
- <div className={"border-t-transparent border-light-text-primary dark:border-dark-text-primary dark:border-t-transparent rounded-full animate-spin ".concat(spinnerSizeClasses[size])}/>
17
+ <div className={"border-t-transparent border-light-accent-main rounded-full animate-spin ".concat(spinnerSizeClasses[size])}/>
18
18
  </div>);
19
19
  }
@@ -1,4 +1,4 @@
1
- import React, { JSX } from 'react';
1
+ import { JSX } from 'react';
2
2
  interface MenuItemProps {
3
3
  href?: string;
4
4
  iconName?: string;
@@ -8,12 +8,6 @@ interface MenuItemProps {
8
8
  isSelected?: boolean;
9
9
  onClick?: any;
10
10
  className?: string;
11
- size?: 'medium' | 'large';
12
- tag?: {
13
- label: React.ReactNode;
14
- iconName?: string;
15
- };
16
- iconRight?: string;
17
11
  }
18
- export default function MenuItem({ href, iconName, userHandle, userImgUrl, label, isSelected, onClick, className, size, tag, iconRight, }: MenuItemProps): JSX.Element;
12
+ export default function MenuItem({ href, iconName, userHandle, userImgUrl, label, isSelected, onClick, className, }: MenuItemProps): JSX.Element;
19
13
  export {};
@@ -38,12 +38,10 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
38
38
  import React, { useState, useEffect, useCallback } from 'react';
39
39
  import NextLink from 'next/link';
40
40
  import UserImage from './userImage';
41
- import Tag from './tag';
42
41
  export default function MenuItem(_a) {
43
42
  var _this = this;
44
- var href = _a.href, iconName = _a.iconName, userHandle = _a.userHandle, userImgUrl = _a.userImgUrl, label = _a.label, isSelected = _a.isSelected, onClick = _a.onClick, _b = _a.className, className = _b === void 0 ? '' : _b, _c = _a.size, size = _c === void 0 ? 'medium' : _c, tag = _a.tag, iconRight = _a.iconRight;
45
- var _d = useState(null), IconLeft = _d[0], setIconLeft = _d[1];
46
- var _e = useState(null), IconRight = _e[0], setIconRight = _e[1];
43
+ var href = _a.href, iconName = _a.iconName, userHandle = _a.userHandle, userImgUrl = _a.userImgUrl, label = _a.label, isSelected = _a.isSelected, onClick = _a.onClick, _b = _a.className, className = _b === void 0 ? '' : _b;
44
+ var _c = useState(null), IconLeft = _c[0], setIconLeft = _c[1];
47
45
  var loadIcon = useCallback(function (iconName) { return __awaiter(_this, void 0, void 0, function () {
48
46
  var module_1, IconComponent, error_1;
49
47
  return __generator(this, function (_a) {
@@ -69,47 +67,29 @@ export default function MenuItem(_a) {
69
67
  }); }, []);
70
68
  useEffect(function () {
71
69
  var fetchIcon = function () { return __awaiter(_this, void 0, void 0, function () {
72
- var _a, _b;
73
- return __generator(this, function (_c) {
74
- switch (_c.label) {
70
+ var _a;
71
+ return __generator(this, function (_b) {
72
+ switch (_b.label) {
75
73
  case 0:
76
74
  if (!iconName) return [3 /*break*/, 2];
77
75
  _a = setIconLeft;
78
76
  return [4 /*yield*/, loadIcon(iconName)];
79
77
  case 1:
80
- _a.apply(void 0, [_c.sent()]);
81
- _c.label = 2;
82
- case 2:
83
- if (!iconRight) return [3 /*break*/, 4];
84
- _b = setIconRight;
85
- return [4 /*yield*/, loadIcon(iconRight)];
86
- case 3:
87
- _b.apply(void 0, [_c.sent()]);
88
- _c.label = 4;
89
- case 4: return [2 /*return*/];
78
+ _a.apply(void 0, [_b.sent()]);
79
+ _b.label = 2;
80
+ case 2: return [2 /*return*/];
90
81
  }
91
82
  });
92
83
  }); };
93
84
  fetchIcon();
94
- }, [iconName, iconRight, loadIcon]);
95
- // Size-based icon and text classes
96
- var iconSize = size === 'large' ? 'w-6 h-6' : 'w-5 h-5';
97
- var labelClass = size === 'large' ? 'text-body1' : 'text-body2';
98
- var tagSize = size === 'large' ? 'medium' : 'small';
99
- var content = (<div className={"\n flex items-center p-2 rounded-[8px] cursor-pointer justify-between transition-colors duration-200 ease-in-out\n ".concat(isSelected
85
+ }, [iconName, loadIcon]);
86
+ var content = (<div className={"\n flex items-center space-x-2 p-2 rounded-[8px] cursor-pointer justify-start transition-colors duration-200 ease-in-out\n ".concat(isSelected
100
87
  ? 'bg-light-background-accent300 dark:bg-dark-background-accent300 hover:bg-light-background-accent200 dark:hover:bg-dark-background-accent200'
101
88
  : 'hover:bg-light-background-accent200 hover:dark:bg-dark-background-accent200', "\n ").concat(className, "\n ")} style={{ width: '100%' }} onClick={onClick}>
102
- {/* Left group: icon/userImg + label + tag with 8px gap */}
103
- <div className="flex items-center gap-1">
104
- {userImgUrl ? (<UserImage userHandle={userHandle || ''} userImgUrl={userImgUrl}/>) : (IconLeft && (<IconLeft className={"".concat(iconSize, " text-light-text-secondary dark:text-dark-text-secondary")}/>))}
105
- <span className={"whitespace-nowrap ".concat(labelClass, " text-light-text-primary dark:text-dark-text-primary")}>
106
- {label}
107
- </span>
108
- {tag && (<Tag variant="contained" size={tagSize} label={tag.label} iconName={tag.iconName}/>)}
109
- </div>
110
-
111
- {/* Right icon aligned to the right */}
112
- {IconRight && (<IconRight className={"".concat(iconSize, " text-light-text-secondary dark:text-dark-text-secondary flex-shrink-0")}/>)}
89
+ {userImgUrl ? (<UserImage userHandle={userHandle || ''} userImgUrl={userImgUrl}/>) : (IconLeft && (<IconLeft className="w-6 h-6 text-light-text-secondary dark:text-dark-text-secondary"/>))}
90
+ <span className="whitespace-nowrap text-body1 px-2 text-light-text-primary dark:text-dark-text-primary">
91
+ {label}
92
+ </span>
113
93
  </div>);
114
94
  return href ? <NextLink href={href}>{content}</NextLink> : content;
115
95
  }
@@ -7,6 +7,7 @@ interface TagProps {
7
7
  label: React.ReactNode;
8
8
  iconName?: keyof typeof HeroIcons;
9
9
  onClick?: React.MouseEventHandler<HTMLDivElement>;
10
+ color?: 'default' | 'info';
10
11
  }
11
- export default function Tag({ variant, size, state, label, iconName, onClick, }: TagProps): JSX.Element;
12
+ export default function Tag({ variant, size, state, label, iconName, onClick, color, }: TagProps): JSX.Element;
12
13
  export {};
@@ -2,9 +2,9 @@
2
2
  import React, { useState, useEffect } from 'react';
3
3
  import * as HeroIcons from '@heroicons/react/24/outline';
4
4
  export default function Tag(_a) {
5
- var variant = _a.variant, size = _a.size, _b = _a.state, state = _b === void 0 ? 'enabled' : _b, label = _a.label, iconName = _a.iconName, onClick = _a.onClick;
6
- var _c = useState(false), isHovered = _c[0], setIsHovered = _c[1];
7
- var _d = useState(null), Icon = _d[0], setIcon = _d[1];
5
+ var variant = _a.variant, size = _a.size, _b = _a.state, state = _b === void 0 ? 'enabled' : _b, label = _a.label, iconName = _a.iconName, onClick = _a.onClick, _c = _a.color, color = _c === void 0 ? 'default' : _c;
6
+ var _d = useState(false), isHovered = _d[0], setIsHovered = _d[1];
7
+ var _e = useState(null), Icon = _e[0], setIcon = _e[1];
8
8
  // Load icon directly from HeroIcons
9
9
  useEffect(function () {
10
10
  if (iconName) {
@@ -13,30 +13,30 @@ export default function Tag(_a) {
13
13
  }, [iconName]);
14
14
  // Size and padding
15
15
  var sizeClasses = size === 'medium' ? 'text-body2 px-2 py-1' : 'text-caption px-2 py-[3px]';
16
- // Selected state styles
17
- var isSelected = state === 'selected';
18
16
  // Background color
19
- var bgClasses = isSelected && variant === 'contained'
20
- ? 'bg-light-accent-main dark:bg-dark-accent-main'
21
- : variant === 'contained'
22
- ? 'bg-light-background-accent300 dark:bg-dark-background-accent300'
23
- : '';
17
+ var bgClasses = variant === 'contained'
18
+ ? (color === 'info'
19
+ ? 'bg-light-info-main dark:bg-dark-info-main'
20
+ : 'bg-light-background-accent300 dark:bg-dark-background-accent300')
21
+ : '';
24
22
  // Font color
25
- var fontClasses = isSelected
26
- ? 'text-white'
23
+ var fontClasses = variant === 'textOnly'
24
+ ? (color === 'info'
25
+ ? 'text-light-info-main dark:text-dark-info-main'
26
+ : 'text-light-text-primary dark:text-dark-text-primary')
27
27
  : 'text-light-text-primary dark:text-dark-text-primary';
28
- // Border styles
29
- var borderClasses = isSelected && variant === 'textOnly'
30
- ? 'border border-light-accent-main dark:border-dark-accent-main'
31
- : variant === 'contained'
32
- ? 'border border-light-misc-divider dark:border-dark-misc-divider'
33
- : '';
34
- // Hover (only when not selected and onClick is provided)
35
- var hoverClasses = !isSelected && variant === 'contained' && isHovered && onClick
28
+ // Border for contained variant
29
+ var borderClasses = variant === 'contained'
30
+ ? 'border border-light-misc-divider dark:border-dark-misc-divider'
31
+ : '';
32
+ // State and hover
33
+ var stateClasses = state === 'selected'
34
+ ? 'bg-light-accent-main dark:bg-dark-accent-main text-white'
35
+ : 'cursor-pointer';
36
+ var hoverClasses = variant === 'contained' && isHovered
36
37
  ? 'bg-light-background-accent200 dark:bg-dark-background-accent200'
37
38
  : '';
38
- var cursorClass = onClick && !isSelected ? 'cursor-pointer' : '';
39
- return (<div className={"\n flex items-center space-x-1 rounded-full\n ".concat(sizeClasses, " ").concat(bgClasses, " ").concat(fontClasses, " ").concat(borderClasses, " ").concat(hoverClasses, " ").concat(cursorClass, "\n transition-colors duration-200 ease-in-out\n ")} onMouseEnter={function () { return onClick && setIsHovered(true); }} onMouseLeave={function () { return onClick && setIsHovered(false); }} onClick={onClick}>
39
+ return (<div className={"\n flex items-center space-x-1 rounded-full \n ".concat(sizeClasses, " ").concat(bgClasses, " ").concat(fontClasses, " ").concat(borderClasses, " ").concat(stateClasses, " ").concat(hoverClasses, "\n transition-colors duration-200 ease-in-out\n ")} onMouseEnter={function () { return setIsHovered(true); }} onMouseLeave={function () { return setIsHovered(false); }} onClick={onClick}>
40
40
  {Icon && <Icon className="w-4 h-4"/>}
41
41
  <span>{label}</span>
42
42
  </div>);
package/index.css ADDED
@@ -0,0 +1,8 @@
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
4
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500&display=swap');
5
+
6
+ body {
7
+ font-family: 'Inter', sans-serif;
8
+ }
package/index.ts ADDED
@@ -0,0 +1,21 @@
1
+ import './index.css';
2
+ import './designTokens';
3
+
4
+ export * from './components/alert';
5
+ export * from './components/button';
6
+ export * from './components/checkBox';
7
+ export * from './components/emptyBox';
8
+ export * from './components/iconButton';
9
+ export * from './components/loadingScreen';
10
+ export * from './components/menu';
11
+ export * from './components/menuItem';
12
+ export * from './components/modal';
13
+ export * from './components/navigation';
14
+ export * from './components/popover';
15
+ export * from './components/select';
16
+ export * from './components/tab';
17
+ export * from './components/tag';
18
+ export * from './components/textField';
19
+ export * from './components/timeStamp'
20
+ export * from './components/tooltip';
21
+ export * from './components/userImage';
@@ -0,0 +1,4 @@
1
+ /** @type {import('next').NextConfig} */
2
+ const nextConfig = {};
3
+
4
+ export default nextConfig;
package/package.json CHANGED
@@ -1,46 +1,25 @@
1
1
  {
2
2
  "name": "oneslash-design-system",
3
3
  "description": "A design system for the Oneslash projects",
4
- "version": "1.2.11",
4
+ "version": "1.2.13",
5
5
  "private": false,
6
6
  "main": "./dist/index.js",
7
7
  "types": "./dist/index.d.ts",
8
- "exports": {
9
- ".": {
10
- "types": "./dist/index.d.ts",
11
- "default": "./dist/index.js"
12
- },
13
- "./components/*": {
14
- "types": "./dist/components/*.d.ts",
15
- "default": "./dist/components/*.jsx"
16
- },
17
- "./designTokens": {
18
- "types": "./dist/designTokens.d.ts",
19
- "default": "./dist/designTokens.js"
20
- },
21
- "./styles": "./dist/output.css",
22
- "./dist/*": "./dist/*"
23
- },
24
- "files": [
25
- "dist"
26
- ],
27
8
  "scripts": {
28
9
  "dev": "next dev",
29
10
  "build": "tsc && postcss index.css -o dist/output.css",
30
11
  "build:css": "postcss index.css -o dist/output.css",
31
- "watch": "tsc --watch",
32
12
  "start": "next start",
33
13
  "lint": "next lint"
34
14
  },
35
15
  "dependencies": {
36
16
  "@heroicons/react": "^2.2.0",
37
17
  "@popperjs/core": "^2.11.8",
18
+ "next": "14.2.13",
19
+ "react": "^18",
20
+ "react-dom": "^18",
38
21
  "react-popper": "^2.3.0"
39
22
  },
40
- "peerDependencies": {
41
- "react": "^18 || ^19",
42
- "react-dom": "^18 || ^19"
43
- },
44
23
  "devDependencies": {
45
24
  "@types/node": "20.16.10",
46
25
  "@types/react": "18.3.10",
@@ -48,11 +27,8 @@
48
27
  "autoprefixer": "^10.4.20",
49
28
  "eslint": "^8",
50
29
  "eslint-config-next": "14.2.13",
51
- "next": "14.2.13",
52
30
  "postcss": "^8",
53
31
  "postcss-cli": "^11.0.0",
54
- "react": "^18",
55
- "react-dom": "^18",
56
32
  "tailwind-scrollbar": "^3.1.0",
57
33
  "tailwindcss": "^3.4.1",
58
34
  "typescript": "5.6.2"
@@ -0,0 +1,8 @@
1
+ /** @type {import('postcss-load-config').Config} */
2
+ const config = {
3
+ plugins: {
4
+ tailwindcss: {},
5
+ },
6
+ };
7
+
8
+ export default config;