doom-design-system 0.1.0
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.
- package/README.md +50 -0
- package/dist/DesignSystemProvider.d.ts +7 -0
- package/dist/DesignSystemProvider.js +13 -0
- package/dist/components/ActionRow/ActionRow.d.ts +9 -0
- package/dist/components/ActionRow/ActionRow.js +47 -0
- package/dist/components/ActionRow/index.d.ts +1 -0
- package/dist/components/ActionRow/index.js +1 -0
- package/dist/components/Badge/Badge.d.ts +8 -0
- package/dist/components/Badge/Badge.js +57 -0
- package/dist/components/Badge/index.d.ts +1 -0
- package/dist/components/Badge/index.js +1 -0
- package/dist/components/Button/Button.d.ts +9 -0
- package/dist/components/Button/Button.js +110 -0
- package/dist/components/Button/index.d.ts +1 -0
- package/dist/components/Button/index.js +1 -0
- package/dist/components/Card/Card.d.ts +8 -0
- package/dist/components/Card/Card.js +28 -0
- package/dist/components/Card/index.d.ts +1 -0
- package/dist/components/Card/index.js +1 -0
- package/dist/components/Dropdown/Dropdown.d.ts +11 -0
- package/dist/components/Dropdown/Dropdown.js +47 -0
- package/dist/components/Dropdown/index.d.ts +1 -0
- package/dist/components/Dropdown/index.js +1 -0
- package/dist/components/Form/Form.d.ts +14 -0
- package/dist/components/Form/Form.js +24 -0
- package/dist/components/Form/index.d.ts +1 -0
- package/dist/components/Form/index.js +1 -0
- package/dist/components/Icon/index.d.ts +25 -0
- package/dist/components/Icon/index.js +41 -0
- package/dist/components/Input/Input.d.ts +12 -0
- package/dist/components/Input/Input.js +129 -0
- package/dist/components/Input/index.d.ts +1 -0
- package/dist/components/Input/index.js +1 -0
- package/dist/components/Layout/Layout.d.ts +17 -0
- package/dist/components/Layout/Layout.js +37 -0
- package/dist/components/Layout/index.d.ts +1 -0
- package/dist/components/Layout/index.js +1 -0
- package/dist/components/Link/Link.d.ts +11 -0
- package/dist/components/Link/Link.js +78 -0
- package/dist/components/Link/index.d.ts +1 -0
- package/dist/components/Link/index.js +1 -0
- package/dist/components/Modal/Modal.d.ts +22 -0
- package/dist/components/Modal/Modal.js +89 -0
- package/dist/components/Modal/index.d.ts +1 -0
- package/dist/components/Modal/index.js +1 -0
- package/dist/components/Page/Page.d.ts +13 -0
- package/dist/components/Page/Page.js +27 -0
- package/dist/components/Page/index.d.ts +1 -0
- package/dist/components/Page/index.js +1 -0
- package/dist/components/Popover/Popover.d.ts +11 -0
- package/dist/components/Popover/Popover.js +91 -0
- package/dist/components/Popover/index.d.ts +1 -0
- package/dist/components/Popover/index.js +1 -0
- package/dist/components/ProgressBar/ProgressBar.d.ts +12 -0
- package/dist/components/ProgressBar/ProgressBar.js +42 -0
- package/dist/components/ProgressBar/index.d.ts +1 -0
- package/dist/components/ProgressBar/index.js +1 -0
- package/dist/components/Select/Select.d.ts +12 -0
- package/dist/components/Select/Select.js +202 -0
- package/dist/components/Select/index.d.ts +1 -0
- package/dist/components/Select/index.js +1 -0
- package/dist/components/Skeleton/Skeleton.d.ts +8 -0
- package/dist/components/Skeleton/Skeleton.js +65 -0
- package/dist/components/Skeleton/index.d.ts +1 -0
- package/dist/components/Skeleton/index.js +1 -0
- package/dist/components/SplitButton/SplitButton.d.ts +12 -0
- package/dist/components/SplitButton/SplitButton.js +90 -0
- package/dist/components/SplitButton/index.d.ts +1 -0
- package/dist/components/SplitButton/index.js +1 -0
- package/dist/components/Table/Table.d.ts +19 -0
- package/dist/components/Table/Table.js +176 -0
- package/dist/components/Table/index.d.ts +1 -0
- package/dist/components/Table/index.js +1 -0
- package/dist/components/Tabs/Tabs.d.ts +34 -0
- package/dist/components/Tabs/Tabs.js +94 -0
- package/dist/components/Tabs/index.d.ts +1 -0
- package/dist/components/Tabs/index.js +1 -0
- package/dist/components/Text/Text.d.ts +14 -0
- package/dist/components/Text/Text.js +123 -0
- package/dist/components/Text/index.d.ts +1 -0
- package/dist/components/Text/index.js +1 -0
- package/dist/components/Textarea/Textarea.d.ts +3 -0
- package/dist/components/Textarea/Textarea.js +30 -0
- package/dist/components/Textarea/index.d.ts +1 -0
- package/dist/components/Textarea/index.js +1 -0
- package/dist/components/Toast/Toast.d.ts +14 -0
- package/dist/components/Toast/Toast.js +109 -0
- package/dist/components/Toast/index.d.ts +1 -0
- package/dist/components/Toast/index.js +1 -0
- package/dist/fonts.d.ts +1 -0
- package/dist/fonts.js +6 -0
- package/dist/index.d.ts +24 -0
- package/dist/index.js +24 -0
- package/dist/styles/index.d.ts +3 -0
- package/dist/styles/index.js +3 -0
- package/dist/styles/reset.d.ts +1 -0
- package/dist/styles/reset.js +29 -0
- package/dist/styles/theme.d.ts +1 -0
- package/dist/styles/theme.js +11 -0
- package/dist/styles/themes/ThemeProvider.d.ts +13 -0
- package/dist/styles/themes/ThemeProvider.js +37 -0
- package/dist/styles/themes/actions.d.ts +3 -0
- package/dist/styles/themes/actions.js +16 -0
- package/dist/styles/themes/definitions.d.ts +211 -0
- package/dist/styles/themes/definitions.js +48 -0
- package/dist/styles/themes/index.d.ts +3 -0
- package/dist/styles/themes/index.js +3 -0
- package/dist/styles/utilities.d.ts +1 -0
- package/dist/styles/utilities.js +184 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +46 -0
package/README.md
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Doom Design System
|
|
2
|
+
|
|
3
|
+
A modern, premium design system built with React, Next.js, and Emotion.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install doom-design-system
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Usage
|
|
12
|
+
|
|
13
|
+
Wrap your application with the `DesignSystemProvider` to ensure all styles and themes are applied correctly.
|
|
14
|
+
|
|
15
|
+
```tsx
|
|
16
|
+
import { DesignSystemProvider } from 'doom-design-system';
|
|
17
|
+
|
|
18
|
+
export default function App({ Component, pageProps }) {
|
|
19
|
+
return (
|
|
20
|
+
<DesignSystemProvider>
|
|
21
|
+
<Component {...pageProps} />
|
|
22
|
+
</DesignSystemProvider>
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
### Importing Components
|
|
28
|
+
|
|
29
|
+
```tsx
|
|
30
|
+
import { Button, Card, Text } from 'doom-design-system';
|
|
31
|
+
|
|
32
|
+
function MyComponent() {
|
|
33
|
+
return (
|
|
34
|
+
<Card>
|
|
35
|
+
<Text variant="h2">Hello World</Text>
|
|
36
|
+
<Button variant="primary">Click Me</Button>
|
|
37
|
+
</Card>
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Requirements
|
|
43
|
+
|
|
44
|
+
This library requires the following peer dependencies:
|
|
45
|
+
|
|
46
|
+
- React >= 19
|
|
47
|
+
- Next.js >= 15
|
|
48
|
+
- @emotion/react
|
|
49
|
+
- @emotion/styled
|
|
50
|
+
- lucide-react
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ThemeKey } from './styles/themes';
|
|
3
|
+
export declare function DesignSystemProvider({ children, initialTheme, withBody }: {
|
|
4
|
+
children: React.ReactNode;
|
|
5
|
+
initialTheme?: ThemeKey;
|
|
6
|
+
withBody?: boolean;
|
|
7
|
+
}): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Global } from '@emotion/react';
|
|
4
|
+
import { resetStyles, utilityStyles } from './styles';
|
|
5
|
+
import { ThemeProvider } from './styles/themes';
|
|
6
|
+
import { defaultFont } from './fonts';
|
|
7
|
+
export function DesignSystemProvider({ children, initialTheme = 'default', withBody = false }) {
|
|
8
|
+
const content = (_jsxs(ThemeProvider, { initialTheme: initialTheme, children: [_jsx(Global, { styles: [resetStyles, utilityStyles] }), children] }));
|
|
9
|
+
if (withBody) {
|
|
10
|
+
return (_jsx("body", { className: defaultFont.variable, children: content }));
|
|
11
|
+
}
|
|
12
|
+
return (_jsx("div", { className: defaultFont.variable, style: { display: 'contents' }, children: content }));
|
|
13
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
interface ActionRowProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
3
|
+
icon: React.ReactNode;
|
|
4
|
+
title: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
onClick?: () => void;
|
|
7
|
+
}
|
|
8
|
+
export declare function ActionRow({ icon, title, description, onClick, className, ...props }: ActionRowProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
3
|
+
var t = {};
|
|
4
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
5
|
+
t[p] = s[p];
|
|
6
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
7
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
8
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
9
|
+
t[p[i]] = s[p[i]];
|
|
10
|
+
}
|
|
11
|
+
return t;
|
|
12
|
+
};
|
|
13
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
14
|
+
import styled from '@emotion/styled';
|
|
15
|
+
import { Text } from '../Text/Text';
|
|
16
|
+
import { Flex } from '../Layout/Layout';
|
|
17
|
+
import { ChevronRight } from 'lucide-react';
|
|
18
|
+
// Extend Flex to add interactive styles
|
|
19
|
+
const StyledActionRow = styled(Flex) `
|
|
20
|
+
padding: 1.5rem;
|
|
21
|
+
cursor: pointer;
|
|
22
|
+
transition: background-color 0.2s ease;
|
|
23
|
+
border-bottom: var(--border-width) solid var(--card-border);
|
|
24
|
+
|
|
25
|
+
&:last-child {
|
|
26
|
+
border-bottom: none;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
&:hover {
|
|
30
|
+
background-color: rgba(var(--muted-rgb, 113, 128, 150), 0.1);
|
|
31
|
+
}
|
|
32
|
+
`;
|
|
33
|
+
const IconWrapper = styled.div `
|
|
34
|
+
width: 48px;
|
|
35
|
+
height: 48px;
|
|
36
|
+
background: var(--primary);
|
|
37
|
+
color: var(--primary-foreground);
|
|
38
|
+
display: flex;
|
|
39
|
+
align-items: center;
|
|
40
|
+
justify-content: center;
|
|
41
|
+
border-radius: var(--radius);
|
|
42
|
+
flex-shrink: 0;
|
|
43
|
+
`;
|
|
44
|
+
export function ActionRow(_a) {
|
|
45
|
+
var { icon, title, description, onClick, className } = _a, props = __rest(_a, ["icon", "title", "description", "onClick", "className"]);
|
|
46
|
+
return (_jsxs(StyledActionRow, Object.assign({ align: "center", gap: "1.5rem", onClick: onClick, className: className }, props, { children: [_jsx(IconWrapper, { children: icon }), _jsxs(Flex, { direction: "column", gap: "0.25rem", style: { flex: 1 }, children: [_jsx(Text, { variant: "h6", weight: "bold", children: title }), description && (_jsx(Text, { color: "muted", variant: "small", children: description }))] }), _jsx(ChevronRight, { size: 20, strokeWidth: 2.5, style: { color: 'var(--muted-foreground)' } })] })));
|
|
47
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './ActionRow';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './ActionRow';
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
type BadgeVariant = 'primary' | 'success' | 'warning' | 'error' | 'secondary';
|
|
3
|
+
interface BadgeProps extends React.HTMLAttributes<HTMLSpanElement> {
|
|
4
|
+
variant?: BadgeVariant;
|
|
5
|
+
children: React.ReactNode;
|
|
6
|
+
}
|
|
7
|
+
export declare function Badge({ variant, children, ...props }: BadgeProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
'use client';
|
|
3
|
+
'use client';
|
|
4
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
5
|
+
var t = {};
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
9
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
10
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
11
|
+
t[p[i]] = s[p[i]];
|
|
12
|
+
}
|
|
13
|
+
return t;
|
|
14
|
+
};
|
|
15
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
16
|
+
import styled from '@emotion/styled';
|
|
17
|
+
import { css } from '@emotion/react';
|
|
18
|
+
const StyledBadge = styled.span `
|
|
19
|
+
display: inline-flex;
|
|
20
|
+
align-items: center;
|
|
21
|
+
padding: 0.25rem 0.75rem;
|
|
22
|
+
border-radius: 9999px;
|
|
23
|
+
font-size: 0.75rem;
|
|
24
|
+
font-weight: 700;
|
|
25
|
+
text-transform: uppercase;
|
|
26
|
+
border: 2px solid var(--card-border);
|
|
27
|
+
box-shadow: 2px 2px 0px 0px var(--card-border);
|
|
28
|
+
|
|
29
|
+
${props => props.variant === 'primary' && css `
|
|
30
|
+
background-color: var(--primary);
|
|
31
|
+
color: var(--primary-foreground);
|
|
32
|
+
`}
|
|
33
|
+
|
|
34
|
+
${props => props.variant === 'success' && css `
|
|
35
|
+
background-color: var(--success);
|
|
36
|
+
color: var(--card-bg);
|
|
37
|
+
`}
|
|
38
|
+
|
|
39
|
+
${props => props.variant === 'warning' && css `
|
|
40
|
+
background-color: var(--warning);
|
|
41
|
+
color: var(--card-bg);
|
|
42
|
+
`}
|
|
43
|
+
|
|
44
|
+
${props => props.variant === 'error' && css `
|
|
45
|
+
background-color: var(--error);
|
|
46
|
+
color: var(--card-bg);
|
|
47
|
+
`}
|
|
48
|
+
|
|
49
|
+
${props => props.variant === 'secondary' && css `
|
|
50
|
+
background-color: var(--secondary);
|
|
51
|
+
color: var(--secondary-foreground);
|
|
52
|
+
`}
|
|
53
|
+
`;
|
|
54
|
+
export function Badge(_a) {
|
|
55
|
+
var { variant = 'primary', children } = _a, props = __rest(_a, ["variant", "children"]);
|
|
56
|
+
return (_jsx(StyledBadge, Object.assign({ variant: variant }, props, { children: children })));
|
|
57
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Badge';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Badge';
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
type ButtonVariant = 'primary' | 'secondary' | 'ghost' | 'outline' | 'success';
|
|
3
|
+
type ButtonSize = 'sm' | 'md' | 'lg';
|
|
4
|
+
interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
|
|
5
|
+
variant?: ButtonVariant;
|
|
6
|
+
size?: ButtonSize;
|
|
7
|
+
}
|
|
8
|
+
export declare function Button({ children, variant, size, ...props }: ButtonProps): import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
3
|
+
var t = {};
|
|
4
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
5
|
+
t[p] = s[p];
|
|
6
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
7
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
8
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
9
|
+
t[p[i]] = s[p[i]];
|
|
10
|
+
}
|
|
11
|
+
return t;
|
|
12
|
+
};
|
|
13
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
14
|
+
import styled from '@emotion/styled';
|
|
15
|
+
import { css } from '@emotion/react';
|
|
16
|
+
const StyledButton = styled.button `
|
|
17
|
+
display: inline-flex;
|
|
18
|
+
align-items: center;
|
|
19
|
+
justify-content: center;
|
|
20
|
+
border-radius: var(--radius);
|
|
21
|
+
font-weight: 700;
|
|
22
|
+
text-transform: uppercase;
|
|
23
|
+
letter-spacing: 0.05em;
|
|
24
|
+
transition: all 0.1s ease;
|
|
25
|
+
cursor: pointer;
|
|
26
|
+
border: var(--border-width) solid var(--card-border);
|
|
27
|
+
box-shadow: var(--shadow-hard);
|
|
28
|
+
background-color: var(--card-bg);
|
|
29
|
+
color: var(--foreground);
|
|
30
|
+
font-size: var(--text-base);
|
|
31
|
+
|
|
32
|
+
&:hover {
|
|
33
|
+
transform: translate(-2px, -2px);
|
|
34
|
+
box-shadow: var(--shadow-hover);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
&:active {
|
|
38
|
+
transform: translate(0px, 0px);
|
|
39
|
+
box-shadow: 0px 0px 0px 0px var(--card-border);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
&:disabled {
|
|
43
|
+
opacity: 0.6;
|
|
44
|
+
cursor: not-allowed;
|
|
45
|
+
transform: none;
|
|
46
|
+
box-shadow: var(--shadow-hard);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/* Variants */
|
|
50
|
+
${props => props.variant === 'primary' && css `
|
|
51
|
+
background-color: var(--primary);
|
|
52
|
+
color: var(--primary-foreground);
|
|
53
|
+
&:hover {
|
|
54
|
+
filter: brightness(1.1);
|
|
55
|
+
}
|
|
56
|
+
`}
|
|
57
|
+
|
|
58
|
+
${props => props.variant === 'secondary' && css `
|
|
59
|
+
background-color: var(--secondary);
|
|
60
|
+
color: var(--secondary-foreground);
|
|
61
|
+
&:hover {
|
|
62
|
+
filter: brightness(1.1);
|
|
63
|
+
}
|
|
64
|
+
`}
|
|
65
|
+
|
|
66
|
+
${props => props.variant === 'success' && css `
|
|
67
|
+
background-color: var(--success);
|
|
68
|
+
color: var(--card-bg);
|
|
69
|
+
&:hover {
|
|
70
|
+
filter: brightness(1.1);
|
|
71
|
+
}
|
|
72
|
+
`}
|
|
73
|
+
|
|
74
|
+
${props => props.variant === 'outline' && css `
|
|
75
|
+
background-color: transparent;
|
|
76
|
+
/* Outline is default style basically */
|
|
77
|
+
`}
|
|
78
|
+
|
|
79
|
+
${props => props.variant === 'ghost' && css `
|
|
80
|
+
background-color: transparent;
|
|
81
|
+
border-color: transparent;
|
|
82
|
+
box-shadow: none;
|
|
83
|
+
&:hover {
|
|
84
|
+
background-color: color-mix(in srgb, var(--primary), transparent 90%);
|
|
85
|
+
color: var(--primary);
|
|
86
|
+
transform: none;
|
|
87
|
+
box-shadow: none;
|
|
88
|
+
}
|
|
89
|
+
`}
|
|
90
|
+
|
|
91
|
+
/* Sizes */
|
|
92
|
+
${props => props.size === 'sm' && css `
|
|
93
|
+
padding: 0.25rem 0.5rem;
|
|
94
|
+
font-size: var(--text-sm);
|
|
95
|
+
`}
|
|
96
|
+
|
|
97
|
+
${props => props.size === 'md' && css `
|
|
98
|
+
padding: 0.75rem 1.5rem;
|
|
99
|
+
font-size: var(--text-base);
|
|
100
|
+
`}
|
|
101
|
+
|
|
102
|
+
${props => props.size === 'lg' && css `
|
|
103
|
+
padding: 1rem 2rem;
|
|
104
|
+
font-size: var(--text-lg);
|
|
105
|
+
`}
|
|
106
|
+
`;
|
|
107
|
+
export function Button(_a) {
|
|
108
|
+
var { children, variant = 'primary', size = 'md' } = _a, props = __rest(_a, ["children", "variant", "size"]);
|
|
109
|
+
return (_jsx(StyledButton, Object.assign({ variant: variant, size: size }, props, { children: children })));
|
|
110
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Button';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Button';
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
interface CardProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
3
|
+
children: React.ReactNode;
|
|
4
|
+
as?: React.ElementType;
|
|
5
|
+
disabled?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function Card({ children, className, as, ...props }: CardProps): import("react/jsx-runtime").JSX.Element;
|
|
8
|
+
export {};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
'use client';
|
|
3
|
+
'use client';
|
|
4
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
5
|
+
var t = {};
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
9
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
10
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
11
|
+
t[p[i]] = s[p[i]];
|
|
12
|
+
}
|
|
13
|
+
return t;
|
|
14
|
+
};
|
|
15
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
16
|
+
import styled from '@emotion/styled';
|
|
17
|
+
const StyledCard = styled.div `
|
|
18
|
+
background-color: var(--card-bg);
|
|
19
|
+
border: var(--border-width) solid var(--card-border);
|
|
20
|
+
border-radius: var(--radius);
|
|
21
|
+
padding: 1.5rem;
|
|
22
|
+
box-shadow: var(--shadow-hard);
|
|
23
|
+
min-width: 0; /* Safe default for grid/flex items */
|
|
24
|
+
`;
|
|
25
|
+
export function Card(_a) {
|
|
26
|
+
var { children, className, as } = _a, props = __rest(_a, ["children", "className", "as"]);
|
|
27
|
+
return (_jsx(StyledCard, Object.assign({ as: as, className: className }, props, { children: children })));
|
|
28
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Card';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Card';
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
interface DropdownItemType {
|
|
2
|
+
label: string;
|
|
3
|
+
onClick: () => void;
|
|
4
|
+
}
|
|
5
|
+
interface DropdownProps {
|
|
6
|
+
triggerLabel: string;
|
|
7
|
+
items: DropdownItemType[];
|
|
8
|
+
variant?: 'primary' | 'secondary';
|
|
9
|
+
}
|
|
10
|
+
export declare function Dropdown({ triggerLabel, items, variant }: DropdownProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useState } from 'react';
|
|
4
|
+
import styled from '@emotion/styled';
|
|
5
|
+
import { Button, Popover } from '../..';
|
|
6
|
+
const StyledDropdownMenu = styled.div `
|
|
7
|
+
background: var(--card-bg);
|
|
8
|
+
border: var(--border-width) solid var(--primary);
|
|
9
|
+
border-radius: var(--radius);
|
|
10
|
+
box-shadow: var(--shadow-hover);
|
|
11
|
+
min-width: 200px;
|
|
12
|
+
overflow: hidden;
|
|
13
|
+
display: flex;
|
|
14
|
+
flex-direction: column;
|
|
15
|
+
gap: 0.25rem;
|
|
16
|
+
padding: 0.25rem;
|
|
17
|
+
`;
|
|
18
|
+
const DropdownItem = styled.button `
|
|
19
|
+
text-align: left;
|
|
20
|
+
padding: 0.75rem 1rem;
|
|
21
|
+
background: transparent;
|
|
22
|
+
border: none;
|
|
23
|
+
color: var(--foreground);
|
|
24
|
+
cursor: pointer;
|
|
25
|
+
border-radius: calc(var(--radius) - 2px);
|
|
26
|
+
font-size: var(--text-base);
|
|
27
|
+
transition: background-color 0.2s;
|
|
28
|
+
|
|
29
|
+
&:hover {
|
|
30
|
+
background-color: color-mix(in srgb, var(--primary), transparent 85%);
|
|
31
|
+
color: var(--primary);
|
|
32
|
+
}
|
|
33
|
+
`;
|
|
34
|
+
// Create a styled version of Button to handle the active state locally
|
|
35
|
+
const TriggerButton = styled(Button) `
|
|
36
|
+
&[aria-expanded="true"] {
|
|
37
|
+
transform: translate(-2px, -2px);
|
|
38
|
+
box-shadow: var(--shadow-hover);
|
|
39
|
+
}
|
|
40
|
+
`;
|
|
41
|
+
export function Dropdown({ triggerLabel, items, variant = 'primary' }) {
|
|
42
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
43
|
+
return (_jsx(Popover, { isOpen: isOpen, onClose: () => setIsOpen(false), placement: "bottom-start", trigger: _jsxs(TriggerButton, { variant: variant, onClick: () => setIsOpen(!isOpen), "aria-expanded": isOpen, children: [triggerLabel, " ", _jsx("span", { style: { marginLeft: '0.5rem', fontSize: '0.8em' }, children: "\u25BC" })] }), content: _jsx(StyledDropdownMenu, { children: items.map((item, index) => (_jsx(DropdownItem, { onClick: () => {
|
|
44
|
+
item.onClick();
|
|
45
|
+
setIsOpen(false);
|
|
46
|
+
}, children: item.label }, index))) }) }));
|
|
47
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Dropdown';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Dropdown';
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
interface FormProps extends React.FormHTMLAttributes<HTMLFormElement> {
|
|
3
|
+
children: React.ReactNode;
|
|
4
|
+
}
|
|
5
|
+
export declare function Form({ children, className, style, ...props }: FormProps): import("react/jsx-runtime").JSX.Element;
|
|
6
|
+
interface FormGroupProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
7
|
+
children: React.ReactNode;
|
|
8
|
+
}
|
|
9
|
+
export declare function FormGroup({ children, className, style, ...props }: FormGroupProps): import("react/jsx-runtime").JSX.Element;
|
|
10
|
+
interface LabelProps extends React.LabelHTMLAttributes<HTMLLabelElement> {
|
|
11
|
+
children: React.ReactNode;
|
|
12
|
+
}
|
|
13
|
+
export declare function Label({ children, className, style, ...props }: LabelProps): import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
2
|
+
var t = {};
|
|
3
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
4
|
+
t[p] = s[p];
|
|
5
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
6
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
7
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
8
|
+
t[p[i]] = s[p[i]];
|
|
9
|
+
}
|
|
10
|
+
return t;
|
|
11
|
+
};
|
|
12
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
13
|
+
export function Form(_a) {
|
|
14
|
+
var { children, className = '', style } = _a, props = __rest(_a, ["children", "className", "style"]);
|
|
15
|
+
return (_jsx("form", Object.assign({ className: className, style: Object.assign({ display: 'flex', flexDirection: 'column', gap: '1.5rem' }, style) }, props, { children: children })));
|
|
16
|
+
}
|
|
17
|
+
export function FormGroup(_a) {
|
|
18
|
+
var { children, className = '', style } = _a, props = __rest(_a, ["children", "className", "style"]);
|
|
19
|
+
return (_jsx("div", Object.assign({ className: className, style: Object.assign({ display: 'flex', flexDirection: 'column', gap: '0.5rem' }, style) }, props, { children: children })));
|
|
20
|
+
}
|
|
21
|
+
export function Label(_a) {
|
|
22
|
+
var { children, className = '', style } = _a, props = __rest(_a, ["children", "className", "style"]);
|
|
23
|
+
return (_jsx("label", Object.assign({ className: className, style: Object.assign({ fontWeight: 700, fontSize: '0.9rem', color: '#000000', textTransform: 'uppercase', letterSpacing: '0.05em' }, style) }, props, { children: children })));
|
|
24
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Form';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './Form';
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Icon component using Lucide React
|
|
3
|
+
*
|
|
4
|
+
* Usage examples:
|
|
5
|
+
*
|
|
6
|
+
* import { Home, User, Settings } from 'lucide-react';
|
|
7
|
+
*
|
|
8
|
+
* <Home />
|
|
9
|
+
* <User size={24} strokeWidth={2.5} />
|
|
10
|
+
* <Settings className="text-primary" />
|
|
11
|
+
*
|
|
12
|
+
* Common icons for finance app:
|
|
13
|
+
* - DollarSign, TrendingUp, TrendingDown
|
|
14
|
+
* - PiggyBank, Wallet, CreditCard
|
|
15
|
+
* - ArrowUpRight, ArrowDownRight
|
|
16
|
+
* - Plus, Minus, X, Check
|
|
17
|
+
* - Settings, User, LogOut
|
|
18
|
+
* - ChevronDown, ChevronUp, ChevronLeft, ChevronRight
|
|
19
|
+
* - Calendar, Clock
|
|
20
|
+
* - BarChart3, LineChart, PieChart
|
|
21
|
+
* - AlertTriangle, Info, CheckCircle2, XCircle
|
|
22
|
+
*
|
|
23
|
+
* For bold neubrutalism style, use strokeWidth={2.5} or strokeWidth={3}
|
|
24
|
+
*/
|
|
25
|
+
export { Home, Settings, LogOut, User, DollarSign, TrendingUp, TrendingDown, PiggyBank, Wallet, CreditCard, Banknote, Plus, Minus, X, Check, Edit, Trash2, Save, ArrowUpRight, ArrowDownRight, ChevronDown, ChevronUp, ChevronLeft, ChevronRight, Calendar, Clock, BarChart3, LineChart, PieChart, TrendingUp as ChartUp, AlertTriangle, Info, CheckCircle2, XCircle, AlertCircle, Search, Filter, Download, Upload, Eye, EyeOff, MoreVertical, MoreHorizontal, } from 'lucide-react';
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Icon component using Lucide React
|
|
3
|
+
*
|
|
4
|
+
* Usage examples:
|
|
5
|
+
*
|
|
6
|
+
* import { Home, User, Settings } from 'lucide-react';
|
|
7
|
+
*
|
|
8
|
+
* <Home />
|
|
9
|
+
* <User size={24} strokeWidth={2.5} />
|
|
10
|
+
* <Settings className="text-primary" />
|
|
11
|
+
*
|
|
12
|
+
* Common icons for finance app:
|
|
13
|
+
* - DollarSign, TrendingUp, TrendingDown
|
|
14
|
+
* - PiggyBank, Wallet, CreditCard
|
|
15
|
+
* - ArrowUpRight, ArrowDownRight
|
|
16
|
+
* - Plus, Minus, X, Check
|
|
17
|
+
* - Settings, User, LogOut
|
|
18
|
+
* - ChevronDown, ChevronUp, ChevronLeft, ChevronRight
|
|
19
|
+
* - Calendar, Clock
|
|
20
|
+
* - BarChart3, LineChart, PieChart
|
|
21
|
+
* - AlertTriangle, Info, CheckCircle2, XCircle
|
|
22
|
+
*
|
|
23
|
+
* For bold neubrutalism style, use strokeWidth={2.5} or strokeWidth={3}
|
|
24
|
+
*/
|
|
25
|
+
export {
|
|
26
|
+
// Navigation
|
|
27
|
+
Home, Settings, LogOut, User,
|
|
28
|
+
// Finance
|
|
29
|
+
DollarSign, TrendingUp, TrendingDown, PiggyBank, Wallet, CreditCard, Banknote,
|
|
30
|
+
// Actions
|
|
31
|
+
Plus, Minus, X, Check, Edit, Trash2, Save,
|
|
32
|
+
// Arrows & Chevrons
|
|
33
|
+
ArrowUpRight, ArrowDownRight, ChevronDown, ChevronUp, ChevronLeft, ChevronRight,
|
|
34
|
+
// Time
|
|
35
|
+
Calendar, Clock,
|
|
36
|
+
// Charts
|
|
37
|
+
BarChart3, LineChart, PieChart, TrendingUp as ChartUp,
|
|
38
|
+
// Status
|
|
39
|
+
AlertTriangle, Info, CheckCircle2, XCircle, AlertCircle,
|
|
40
|
+
// Misc
|
|
41
|
+
Search, Filter, Download, Upload, Eye, EyeOff, MoreVertical, MoreHorizontal, } from 'lucide-react';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
interface InputProps extends React.InputHTMLAttributes<HTMLInputElement> {
|
|
3
|
+
label?: string;
|
|
4
|
+
error?: string;
|
|
5
|
+
helperText?: string;
|
|
6
|
+
startAdornment?: React.ReactNode;
|
|
7
|
+
endAdornment?: React.ReactNode;
|
|
8
|
+
format?: (value: string | number | readonly string[] | undefined) => string;
|
|
9
|
+
validate?: (value: string | number | readonly string[] | undefined) => string | undefined;
|
|
10
|
+
}
|
|
11
|
+
export declare function Input({ label, error: errorProp, helperText, startAdornment, endAdornment, style, className, format, validate, onBlur, onFocus, value, ...props }: InputProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export {};
|