pure-react-ui 1.4.6 → 1.4.7

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 (40) hide show
  1. package/README.md +85 -47
  2. package/lib/components/Button/Button.css +170 -0
  3. package/lib/components/Button/Button.d.ts +11 -0
  4. package/lib/components/Button/Button.d.ts.map +1 -0
  5. package/lib/components/Button/Button.js +30 -0
  6. package/lib/components/Button/Button.js.map +1 -0
  7. package/lib/components/Card/Card.css +116 -0
  8. package/lib/components/Card/Card.d.ts +16 -0
  9. package/lib/components/Card/Card.d.ts.map +1 -0
  10. package/lib/components/Card/Card.js +29 -0
  11. package/lib/components/Card/Card.js.map +1 -0
  12. package/lib/components/Modal/Modal.css +197 -0
  13. package/lib/components/Modal/Modal.d.ts +16 -0
  14. package/lib/components/Modal/Modal.d.ts.map +1 -0
  15. package/lib/components/Modal/Modal.js +45 -0
  16. package/lib/components/Modal/Modal.js.map +1 -0
  17. package/lib/index.d.ts +7 -0
  18. package/lib/index.d.ts.map +1 -0
  19. package/lib/index.js +4 -0
  20. package/lib/index.js.map +1 -0
  21. package/package.json +38 -58
  22. package/dist/components/Button/Button.d.ts +0 -5
  23. package/dist/components/Button/Button.d.ts.map +0 -1
  24. package/dist/components/Button/Button.types.d.ts +0 -14
  25. package/dist/components/Button/Button.types.d.ts.map +0 -1
  26. package/dist/components/Button/index.d.ts +0 -2
  27. package/dist/components/Button/index.d.ts.map +0 -1
  28. package/dist/dist/index.css +0 -1
  29. package/dist/index.css +0 -1
  30. package/dist/index.d.ts +0 -2
  31. package/dist/index.d.ts.map +0 -1
  32. package/dist/index.esm.css +0 -1
  33. package/dist/index.esm.js +0 -25
  34. package/dist/index.esm.js.map +0 -1
  35. package/dist/index.js +0 -27
  36. package/dist/index.js.map +0 -1
  37. package/dist/setupTests.d.ts +0 -2
  38. package/dist/setupTests.d.ts.map +0 -1
  39. package/src/styles/index.css +0 -81
  40. package/src/styles/variables.css +0 -80
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Pure React UI
2
2
 
3
- A modern, accessible React UI component library with TypeScript support.
3
+ A pure React UI component library built with TypeScript. No external dependencies required (except React and ReactDOM as peer dependencies).
4
4
 
5
5
  ## Installation
6
6
 
@@ -8,57 +8,95 @@ A modern, accessible React UI component library with TypeScript support.
8
8
  npm install pure-react-ui
9
9
  ```
10
10
 
11
- ## Usage
12
-
13
- ```jsx
14
- import React from 'react';
15
- import { PureButton } from 'pure-react-ui';
16
- import 'pure-react-ui/src/styles/index.css'; // Import the CSS variables
17
-
18
- function App() {
19
- return (
20
- <div>
21
- <PureButton variant="primary" size="md">
22
- Click me
23
- </PureButton>
24
-
25
- <PureButton variant="secondary" size="lg" fullWidth>
26
- Full Width Button
27
- </PureButton>
28
-
29
- <PureButton variant="outline" size="sm" loading>
30
- Loading...
31
- </PureButton>
32
- </div>
33
- );
34
- }
35
-
36
- export default App;
11
+ ## Components
12
+
13
+ ### Button
14
+
15
+ A versatile button component with multiple variants and sizes.
16
+
17
+ ```tsx
18
+ import { Button } from 'pure-react-ui';
19
+
20
+ <Button variant="primary" size="medium" onClick={handleClick}>
21
+ Click Me
22
+ </Button>
37
23
  ```
38
24
 
39
- ## Components
25
+ **Props:**
26
+ - `variant`: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info' (default: 'primary')
27
+ - `size`: 'small' | 'medium' | 'large' (default: 'medium')
28
+ - `fullWidth`: boolean (default: false)
29
+ - `loading`: boolean (default: false)
30
+ - All standard button HTML attributes
31
+
32
+ ### Card
33
+
34
+ A flexible card component for displaying content.
35
+
36
+ ```tsx
37
+ import { Card } from 'pure-react-ui';
38
+
39
+ <Card
40
+ title="Card Title"
41
+ subtitle="Card Subtitle"
42
+ image="/path/to/image.jpg"
43
+ hoverable
44
+ shadow="medium"
45
+ >
46
+ Card content goes here
47
+ </Card>
48
+ ```
49
+
50
+ **Props:**
51
+ - `title`: string (optional)
52
+ - `subtitle`: string (optional)
53
+ - `image`: string (optional)
54
+ - `imageAlt`: string (optional)
55
+ - `footer`: React.ReactNode (optional)
56
+ - `hoverable`: boolean (default: false)
57
+ - `shadow`: 'none' | 'small' | 'medium' | 'large' (default: 'medium')
58
+ - `onClick`: () => void (optional)
59
+
60
+ ### Modal
61
+
62
+ A modal dialog component with overlay and keyboard support.
63
+
64
+ ```tsx
65
+ import { Modal } from 'pure-react-ui';
66
+
67
+ <Modal
68
+ isOpen={isOpen}
69
+ onClose={() => setIsOpen(false)}
70
+ title="Modal Title"
71
+ size="medium"
72
+ >
73
+ Modal content goes here
74
+ </Modal>
75
+ ```
76
+
77
+ **Props:**
78
+ - `isOpen`: boolean (required)
79
+ - `onClose`: () => void (required)
80
+ - `title`: string (optional)
81
+ - `size`: 'small' | 'medium' | 'large' | 'fullscreen' (default: 'medium')
82
+ - `closeOnOverlayClick`: boolean (default: true)
83
+ - `closeOnEscape`: boolean (default: true)
84
+ - `showCloseButton`: boolean (default: true)
85
+
86
+ ## Styling
40
87
 
41
- ### PureButton
88
+ All components include their own CSS files and use CSS classes with the `pure-` prefix. The CSS files are automatically imported with each component. You can also style them by targeting these classes:
42
89
 
43
- A versatile button component with multiple variants, sizes, and states.
90
+ - **Button**: `pure-button`, `pure-button--primary`, `pure-button--secondary`, etc.
91
+ - **Card**: `pure-card`, `pure-card--hoverable`, `pure-card--shadow-medium`, etc.
92
+ - **Modal**: `pure-modal`, `pure-modal__overlay`, `pure-modal__header`, etc.
44
93
 
45
- #### Props
94
+ Each component has its own CSS file located in:
95
+ - `lib/components/Button/Button.css`
96
+ - `lib/components/Card/Card.css`
97
+ - `lib/components/Modal/Modal.css`
46
98
 
47
- - `variant`: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'outline' | 'ghost'
48
- - `size`: 'sm' | 'md' | 'lg'
49
- - `fullWidth`: boolean
50
- - `loading`: boolean
51
- - `disabled`: boolean
52
- - `leftIcon`: ReactNode
53
- - `rightIcon`: ReactNode
54
- - Plus all standard button props
99
+ ## License
55
100
 
56
- ## Features
101
+ MIT
57
102
 
58
- - TypeScript support with full type definitions
59
- - Accessible design with proper ARIA attributes
60
- - CSS variables for easy theming
61
- - Multiple variants and sizes
62
- - Loading and disabled states
63
- - Icon support
64
- - Responsive design
@@ -0,0 +1,170 @@
1
+ /* Pure Button Component Styles */
2
+ .pure-button {
3
+ display: inline-flex;
4
+ align-items: center;
5
+ justify-content: center;
6
+ gap: 0.5rem;
7
+ padding: 0.625rem 1.25rem;
8
+ font-size: 1rem;
9
+ font-weight: 500;
10
+ line-height: 1.5;
11
+ text-align: center;
12
+ text-decoration: none;
13
+ white-space: nowrap;
14
+ vertical-align: middle;
15
+ cursor: pointer;
16
+ user-select: none;
17
+ border: 1px solid transparent;
18
+ border-radius: 0.375rem;
19
+ transition: all 0.2s ease-in-out;
20
+ background-color: #007bff;
21
+ color: #ffffff;
22
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
23
+ }
24
+
25
+ .pure-button:hover:not(.pure-button--disabled) {
26
+ background-color: #0056b3;
27
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15);
28
+ transform: translateY(-1px);
29
+ }
30
+
31
+ .pure-button:active:not(.pure-button--disabled) {
32
+ transform: translateY(0);
33
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
34
+ }
35
+
36
+ .pure-button:focus {
37
+ outline: none;
38
+ box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.25);
39
+ }
40
+
41
+ /* Variants */
42
+ .pure-button--primary {
43
+ background-color: #007bff;
44
+ color: #ffffff;
45
+ border-color: #007bff;
46
+ }
47
+
48
+ .pure-button--primary:hover:not(.pure-button--disabled) {
49
+ background-color: #0056b3;
50
+ border-color: #0056b3;
51
+ }
52
+
53
+ .pure-button--secondary {
54
+ background-color: #6c757d;
55
+ color: #ffffff;
56
+ border-color: #6c757d;
57
+ }
58
+
59
+ .pure-button--secondary:hover:not(.pure-button--disabled) {
60
+ background-color: #545b62;
61
+ border-color: #545b62;
62
+ }
63
+
64
+ .pure-button--success {
65
+ background-color: #28a745;
66
+ color: #ffffff;
67
+ border-color: #28a745;
68
+ }
69
+
70
+ .pure-button--success:hover:not(.pure-button--disabled) {
71
+ background-color: #218838;
72
+ border-color: #218838;
73
+ }
74
+
75
+ .pure-button--danger {
76
+ background-color: #dc3545;
77
+ color: #ffffff;
78
+ border-color: #dc3545;
79
+ }
80
+
81
+ .pure-button--danger:hover:not(.pure-button--disabled) {
82
+ background-color: #c82333;
83
+ border-color: #c82333;
84
+ }
85
+
86
+ .pure-button--warning {
87
+ background-color: #ffc107;
88
+ color: #212529;
89
+ border-color: #ffc107;
90
+ }
91
+
92
+ .pure-button--warning:hover:not(.pure-button--disabled) {
93
+ background-color: #e0a800;
94
+ border-color: #e0a800;
95
+ }
96
+
97
+ .pure-button--info {
98
+ background-color: #17a2b8;
99
+ color: #ffffff;
100
+ border-color: #17a2b8;
101
+ }
102
+
103
+ .pure-button--info:hover:not(.pure-button--disabled) {
104
+ background-color: #138496;
105
+ border-color: #138496;
106
+ }
107
+
108
+ /* Sizes */
109
+ .pure-button--small {
110
+ padding: 0.375rem 0.75rem;
111
+ font-size: 0.875rem;
112
+ }
113
+
114
+ .pure-button--medium {
115
+ padding: 0.625rem 1.25rem;
116
+ font-size: 1rem;
117
+ }
118
+
119
+ .pure-button--large {
120
+ padding: 0.875rem 1.75rem;
121
+ font-size: 1.125rem;
122
+ }
123
+
124
+ /* Full Width */
125
+ .pure-button--full-width {
126
+ width: 100%;
127
+ }
128
+
129
+ /* Loading State */
130
+ .pure-button--loading {
131
+ position: relative;
132
+ pointer-events: none;
133
+ }
134
+
135
+ .pure-button__spinner {
136
+ display: inline-block;
137
+ width: 1rem;
138
+ height: 1rem;
139
+ border: 2px solid currentColor;
140
+ border-right-color: transparent;
141
+ border-radius: 50%;
142
+ animation: pure-button-spin 0.6s linear infinite;
143
+ }
144
+
145
+ @keyframes pure-button-spin {
146
+ to {
147
+ transform: rotate(360deg);
148
+ }
149
+ }
150
+
151
+ .pure-button__content {
152
+ display: inline-flex;
153
+ align-items: center;
154
+ gap: 0.5rem;
155
+ }
156
+
157
+ /* Disabled State */
158
+ .pure-button--disabled,
159
+ .pure-button:disabled {
160
+ opacity: 0.65;
161
+ cursor: not-allowed;
162
+ pointer-events: none;
163
+ }
164
+
165
+ .pure-button--disabled:hover,
166
+ .pure-button:disabled:hover {
167
+ transform: none;
168
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
169
+ }
170
+
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ import './Button.css';
3
+ export interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {
4
+ variant?: 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'info';
5
+ size?: 'small' | 'medium' | 'large';
6
+ fullWidth?: boolean;
7
+ loading?: boolean;
8
+ children: React.ReactNode;
9
+ }
10
+ export declare const Button: React.FC<ButtonProps>;
11
+ //# sourceMappingURL=Button.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../../../src/components/Button/Button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,cAAc,CAAC;AAEtB,MAAM,WAAW,WAAY,SAAQ,KAAK,CAAC,oBAAoB,CAAC,iBAAiB,CAAC;IAChF,OAAO,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAC;IAC9E,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CA+CxC,CAAC"}
@@ -0,0 +1,30 @@
1
+ import React from 'react';
2
+ import './Button.css';
3
+ export const Button = ({ variant = 'primary', size = 'medium', fullWidth = false, loading = false, disabled, children, className = '', onClick, ...props }) => {
4
+ const baseClass = 'pure-button';
5
+ const variantClass = `pure-button--${variant}`;
6
+ const sizeClass = `pure-button--${size}`;
7
+ const fullWidthClass = fullWidth ? 'pure-button--full-width' : '';
8
+ const loadingClass = loading ? 'pure-button--loading' : '';
9
+ const disabledClass = (disabled || loading) ? 'pure-button--disabled' : '';
10
+ const combinedClassName = [
11
+ baseClass,
12
+ variantClass,
13
+ sizeClass,
14
+ fullWidthClass,
15
+ loadingClass,
16
+ disabledClass,
17
+ className
18
+ ].filter(Boolean).join(' ');
19
+ const handleClick = (e) => {
20
+ if (disabled || loading) {
21
+ e.preventDefault();
22
+ return;
23
+ }
24
+ onClick?.(e);
25
+ };
26
+ return (React.createElement("button", { className: combinedClassName, disabled: disabled || loading, onClick: handleClick, ...props },
27
+ loading && React.createElement("span", { className: "pure-button__spinner" }),
28
+ React.createElement("span", { className: "pure-button__content" }, children)));
29
+ };
30
+ //# sourceMappingURL=Button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Button.js","sourceRoot":"","sources":["../../../src/components/Button/Button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,cAAc,CAAC;AAUtB,MAAM,CAAC,MAAM,MAAM,GAA0B,CAAC,EAC5C,OAAO,GAAG,SAAS,EACnB,IAAI,GAAG,QAAQ,EACf,SAAS,GAAG,KAAK,EACjB,OAAO,GAAG,KAAK,EACf,QAAQ,EACR,QAAQ,EACR,SAAS,GAAG,EAAE,EACd,OAAO,EACP,GAAG,KAAK,EACT,EAAE,EAAE;IACH,MAAM,SAAS,GAAG,aAAa,CAAC;IAChC,MAAM,YAAY,GAAG,gBAAgB,OAAO,EAAE,CAAC;IAC/C,MAAM,SAAS,GAAG,gBAAgB,IAAI,EAAE,CAAC;IACzC,MAAM,cAAc,GAAG,SAAS,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE,CAAC;IAClE,MAAM,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3D,MAAM,aAAa,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,EAAE,CAAC;IAE3E,MAAM,iBAAiB,GAAG;QACxB,SAAS;QACT,YAAY;QACZ,SAAS;QACT,cAAc;QACd,YAAY;QACZ,aAAa;QACb,SAAS;KACV,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE5B,MAAM,WAAW,GAAG,CAAC,CAAsC,EAAE,EAAE;QAC7D,IAAI,QAAQ,IAAI,OAAO,EAAE,CAAC;YACxB,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,OAAO;QACT,CAAC;QACD,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;IACf,CAAC,CAAC;IAEF,OAAO,CACL,gCACE,SAAS,EAAE,iBAAiB,EAC5B,QAAQ,EAAE,QAAQ,IAAI,OAAO,EAC7B,OAAO,EAAE,WAAW,KAChB,KAAK;QAER,OAAO,IAAI,8BAAM,SAAS,EAAC,sBAAsB,GAAG;QACrD,8BAAM,SAAS,EAAC,sBAAsB,IAAE,QAAQ,CAAQ,CACjD,CACV,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,116 @@
1
+ /* Pure Card Component Styles */
2
+ .pure-card {
3
+ display: flex;
4
+ flex-direction: column;
5
+ background-color: #ffffff;
6
+ border: 1px solid #e0e0e0;
7
+ border-radius: 0.5rem;
8
+ overflow: hidden;
9
+ transition: all 0.3s ease-in-out;
10
+ }
11
+
12
+ /* Shadow Variants */
13
+ .pure-card--shadow-none {
14
+ box-shadow: none;
15
+ }
16
+
17
+ .pure-card--shadow-small {
18
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
19
+ }
20
+
21
+ .pure-card--shadow-medium {
22
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1), 0 2px 4px rgba(0, 0, 0, 0.06);
23
+ }
24
+
25
+ .pure-card--shadow-large {
26
+ box-shadow: 0 10px 15px rgba(0, 0, 0, 0.1), 0 4px 6px rgba(0, 0, 0, 0.05);
27
+ }
28
+
29
+ /* Hoverable */
30
+ .pure-card--hoverable:hover {
31
+ transform: translateY(-4px);
32
+ box-shadow: 0 12px 24px rgba(0, 0, 0, 0.15), 0 6px 12px rgba(0, 0, 0, 0.1);
33
+ }
34
+
35
+ /* Clickable */
36
+ .pure-card--clickable {
37
+ cursor: pointer;
38
+ }
39
+
40
+ .pure-card--clickable:active {
41
+ transform: translateY(-2px);
42
+ }
43
+
44
+ /* Image Container */
45
+ .pure-card__image-container {
46
+ width: 100%;
47
+ overflow: hidden;
48
+ background-color: #f5f5f5;
49
+ }
50
+
51
+ .pure-card__image {
52
+ width: 100%;
53
+ height: auto;
54
+ display: block;
55
+ object-fit: cover;
56
+ transition: transform 0.3s ease-in-out;
57
+ }
58
+
59
+ .pure-card--hoverable:hover .pure-card__image {
60
+ transform: scale(1.05);
61
+ }
62
+
63
+ /* Header */
64
+ .pure-card__header {
65
+ padding: 1.25rem 1.5rem 0.75rem;
66
+ border-bottom: 1px solid #f0f0f0;
67
+ }
68
+
69
+ .pure-card__title {
70
+ margin: 0 0 0.5rem 0;
71
+ font-size: 1.25rem;
72
+ font-weight: 600;
73
+ line-height: 1.4;
74
+ color: #212529;
75
+ }
76
+
77
+ .pure-card__subtitle {
78
+ margin: 0;
79
+ font-size: 0.875rem;
80
+ line-height: 1.5;
81
+ color: #6c757d;
82
+ }
83
+
84
+ /* Body */
85
+ .pure-card__body {
86
+ padding: 1.5rem;
87
+ flex: 1;
88
+ color: #495057;
89
+ line-height: 1.6;
90
+ }
91
+
92
+ /* Footer */
93
+ .pure-card__footer {
94
+ padding: 0.75rem 1.5rem;
95
+ border-top: 1px solid #f0f0f0;
96
+ background-color: #fafafa;
97
+ display: flex;
98
+ align-items: center;
99
+ justify-content: flex-end;
100
+ gap: 0.5rem;
101
+ }
102
+
103
+ /* Responsive */
104
+ @media (max-width: 768px) {
105
+ .pure-card__header,
106
+ .pure-card__body,
107
+ .pure-card__footer {
108
+ padding-left: 1rem;
109
+ padding-right: 1rem;
110
+ }
111
+
112
+ .pure-card__title {
113
+ font-size: 1.125rem;
114
+ }
115
+ }
116
+
@@ -0,0 +1,16 @@
1
+ import React from 'react';
2
+ import './Card.css';
3
+ export interface CardProps {
4
+ title?: string;
5
+ subtitle?: string;
6
+ image?: string;
7
+ imageAlt?: string;
8
+ footer?: React.ReactNode;
9
+ hoverable?: boolean;
10
+ shadow?: 'none' | 'small' | 'medium' | 'large';
11
+ className?: string;
12
+ children: React.ReactNode;
13
+ onClick?: () => void;
14
+ }
15
+ export declare const Card: React.FC<CardProps>;
16
+ //# sourceMappingURL=Card.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Card.d.ts","sourceRoot":"","sources":["../../../src/components/Card/Card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,YAAY,CAAC;AAEpB,MAAM,WAAW,SAAS;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,eAAO,MAAM,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,SAAS,CAsDpC,CAAC"}
@@ -0,0 +1,29 @@
1
+ import React from 'react';
2
+ import './Card.css';
3
+ export const Card = ({ title, subtitle, image, imageAlt, footer, hoverable = false, shadow = 'medium', className = '', children, onClick }) => {
4
+ const baseClass = 'pure-card';
5
+ const hoverableClass = hoverable ? 'pure-card--hoverable' : '';
6
+ const shadowClass = `pure-card--shadow-${shadow}`;
7
+ const clickableClass = onClick ? 'pure-card--clickable' : '';
8
+ const combinedClassName = [
9
+ baseClass,
10
+ hoverableClass,
11
+ shadowClass,
12
+ clickableClass,
13
+ className
14
+ ].filter(Boolean).join(' ');
15
+ const handleClick = () => {
16
+ if (onClick) {
17
+ onClick();
18
+ }
19
+ };
20
+ return (React.createElement("div", { className: combinedClassName, onClick: handleClick },
21
+ image && (React.createElement("div", { className: "pure-card__image-container" },
22
+ React.createElement("img", { src: image, alt: imageAlt || title || 'Card image', className: "pure-card__image" }))),
23
+ (title || subtitle) && (React.createElement("div", { className: "pure-card__header" },
24
+ title && React.createElement("h3", { className: "pure-card__title" }, title),
25
+ subtitle && React.createElement("p", { className: "pure-card__subtitle" }, subtitle))),
26
+ React.createElement("div", { className: "pure-card__body" }, children),
27
+ footer && (React.createElement("div", { className: "pure-card__footer" }, footer))));
28
+ };
29
+ //# sourceMappingURL=Card.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Card.js","sourceRoot":"","sources":["../../../src/components/Card/Card.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,YAAY,CAAC;AAepB,MAAM,CAAC,MAAM,IAAI,GAAwB,CAAC,EACxC,KAAK,EACL,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,MAAM,EACN,SAAS,GAAG,KAAK,EACjB,MAAM,GAAG,QAAQ,EACjB,SAAS,GAAG,EAAE,EACd,QAAQ,EACR,OAAO,EACR,EAAE,EAAE;IACH,MAAM,SAAS,GAAG,WAAW,CAAC;IAC9B,MAAM,cAAc,GAAG,SAAS,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/D,MAAM,WAAW,GAAG,qBAAqB,MAAM,EAAE,CAAC;IAClD,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,CAAC;IAE7D,MAAM,iBAAiB,GAAG;QACxB,SAAS;QACT,cAAc;QACd,WAAW;QACX,cAAc;QACd,SAAS;KACV,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE5B,MAAM,WAAW,GAAG,GAAG,EAAE;QACvB,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CACL,6BAAK,SAAS,EAAE,iBAAiB,EAAE,OAAO,EAAE,WAAW;QACpD,KAAK,IAAI,CACR,6BAAK,SAAS,EAAC,4BAA4B;YACzC,6BAAK,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,IAAI,KAAK,IAAI,YAAY,EAAE,SAAS,EAAC,kBAAkB,GAAG,CACpF,CACP;QACA,CAAC,KAAK,IAAI,QAAQ,CAAC,IAAI,CACtB,6BAAK,SAAS,EAAC,mBAAmB;YAC/B,KAAK,IAAI,4BAAI,SAAS,EAAC,kBAAkB,IAAE,KAAK,CAAM;YACtD,QAAQ,IAAI,2BAAG,SAAS,EAAC,qBAAqB,IAAE,QAAQ,CAAK,CAC1D,CACP;QACD,6BAAK,SAAS,EAAC,iBAAiB,IAC7B,QAAQ,CACL;QACL,MAAM,IAAI,CACT,6BAAK,SAAS,EAAC,mBAAmB,IAC/B,MAAM,CACH,CACP,CACG,CACP,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,197 @@
1
+ /* Pure Modal Component Styles */
2
+ .pure-modal__overlay {
3
+ position: fixed;
4
+ top: 0;
5
+ left: 0;
6
+ right: 0;
7
+ bottom: 0;
8
+ background-color: rgba(0, 0, 0, 0.5);
9
+ display: flex;
10
+ align-items: center;
11
+ justify-content: center;
12
+ z-index: 1000;
13
+ padding: 1rem;
14
+ animation: pure-modal-overlay-fade-in 0.2s ease-out;
15
+ overflow-y: auto;
16
+ }
17
+
18
+ @keyframes pure-modal-overlay-fade-in {
19
+ from {
20
+ opacity: 0;
21
+ }
22
+ to {
23
+ opacity: 1;
24
+ }
25
+ }
26
+
27
+ .pure-modal {
28
+ background-color: #ffffff;
29
+ border-radius: 0.5rem;
30
+ box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
31
+ display: flex;
32
+ flex-direction: column;
33
+ max-height: 90vh;
34
+ width: 100%;
35
+ animation: pure-modal-slide-in 0.3s ease-out;
36
+ position: relative;
37
+ overflow: hidden;
38
+ }
39
+
40
+ @keyframes pure-modal-slide-in {
41
+ from {
42
+ opacity: 0;
43
+ transform: translateY(-20px) scale(0.95);
44
+ }
45
+ to {
46
+ opacity: 1;
47
+ transform: translateY(0) scale(1);
48
+ }
49
+ }
50
+
51
+ /* Size Variants */
52
+ .pure-modal--small {
53
+ max-width: 400px;
54
+ }
55
+
56
+ .pure-modal--medium {
57
+ max-width: 600px;
58
+ }
59
+
60
+ .pure-modal--large {
61
+ max-width: 900px;
62
+ }
63
+
64
+ .pure-modal--fullscreen {
65
+ max-width: 100%;
66
+ max-height: 100vh;
67
+ height: 100vh;
68
+ border-radius: 0;
69
+ margin: 0;
70
+ }
71
+
72
+ /* Header */
73
+ .pure-modal__header {
74
+ display: flex;
75
+ align-items: center;
76
+ justify-content: space-between;
77
+ padding: 1.5rem;
78
+ border-bottom: 1px solid #e0e0e0;
79
+ flex-shrink: 0;
80
+ }
81
+
82
+ .pure-modal__title {
83
+ margin: 0;
84
+ font-size: 1.5rem;
85
+ font-weight: 600;
86
+ line-height: 1.4;
87
+ color: #212529;
88
+ flex: 1;
89
+ }
90
+
91
+ .pure-modal__close-button {
92
+ display: flex;
93
+ align-items: center;
94
+ justify-content: center;
95
+ width: 2rem;
96
+ height: 2rem;
97
+ padding: 0;
98
+ margin-left: 1rem;
99
+ background: transparent;
100
+ border: none;
101
+ border-radius: 0.25rem;
102
+ cursor: pointer;
103
+ color: #6c757d;
104
+ transition: all 0.2s ease-in-out;
105
+ flex-shrink: 0;
106
+ }
107
+
108
+ .pure-modal__close-button:hover {
109
+ background-color: #f0f0f0;
110
+ color: #212529;
111
+ }
112
+
113
+ .pure-modal__close-button:active {
114
+ background-color: #e0e0e0;
115
+ }
116
+
117
+ .pure-modal__close-button:focus {
118
+ outline: none;
119
+ box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.25);
120
+ }
121
+
122
+ .pure-modal__close-icon {
123
+ font-size: 1.5rem;
124
+ line-height: 1;
125
+ font-weight: 300;
126
+ }
127
+
128
+ /* Body */
129
+ .pure-modal__body {
130
+ padding: 1.5rem;
131
+ overflow-y: auto;
132
+ flex: 1;
133
+ color: #495057;
134
+ line-height: 1.6;
135
+ }
136
+
137
+ /* Responsive */
138
+ @media (max-width: 768px) {
139
+ .pure-modal__overlay {
140
+ padding: 0;
141
+ align-items: flex-end;
142
+ }
143
+
144
+ .pure-modal {
145
+ max-height: 95vh;
146
+ border-radius: 0.5rem 0.5rem 0 0;
147
+ animation: pure-modal-slide-up 0.3s ease-out;
148
+ }
149
+
150
+ @keyframes pure-modal-slide-up {
151
+ from {
152
+ opacity: 0;
153
+ transform: translateY(100%);
154
+ }
155
+ to {
156
+ opacity: 1;
157
+ transform: translateY(0);
158
+ }
159
+ }
160
+
161
+ .pure-modal--small,
162
+ .pure-modal--medium,
163
+ .pure-modal--large {
164
+ max-width: 100%;
165
+ }
166
+
167
+ .pure-modal__header {
168
+ padding: 1rem 1.25rem;
169
+ }
170
+
171
+ .pure-modal__title {
172
+ font-size: 1.25rem;
173
+ }
174
+
175
+ .pure-modal__body {
176
+ padding: 1.25rem;
177
+ }
178
+ }
179
+
180
+ /* Scrollbar Styling */
181
+ .pure-modal__body::-webkit-scrollbar {
182
+ width: 8px;
183
+ }
184
+
185
+ .pure-modal__body::-webkit-scrollbar-track {
186
+ background: #f1f1f1;
187
+ }
188
+
189
+ .pure-modal__body::-webkit-scrollbar-thumb {
190
+ background: #c1c1c1;
191
+ border-radius: 4px;
192
+ }
193
+
194
+ .pure-modal__body::-webkit-scrollbar-thumb:hover {
195
+ background: #a8a8a8;
196
+ }
197
+
@@ -0,0 +1,16 @@
1
+ import React from 'react';
2
+ import './Modal.css';
3
+ export interface ModalProps {
4
+ isOpen: boolean;
5
+ onClose: () => void;
6
+ title?: string;
7
+ size?: 'small' | 'medium' | 'large' | 'fullscreen';
8
+ closeOnOverlayClick?: boolean;
9
+ closeOnEscape?: boolean;
10
+ showCloseButton?: boolean;
11
+ className?: string;
12
+ overlayClassName?: string;
13
+ children: React.ReactNode;
14
+ }
15
+ export declare const Modal: React.FC<ModalProps>;
16
+ //# sourceMappingURL=Modal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Modal.d.ts","sourceRoot":"","sources":["../../../src/components/Modal/Modal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4B,MAAM,OAAO,CAAC;AACjD,OAAO,aAAa,CAAC;AAErB,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,YAAY,CAAC;IACnD,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,eAAO,MAAM,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,UAAU,CA4EtC,CAAC"}
@@ -0,0 +1,45 @@
1
+ import React, { useEffect, useRef } from 'react';
2
+ import './Modal.css';
3
+ export const Modal = ({ isOpen, onClose, title, size = 'medium', closeOnOverlayClick = true, closeOnEscape = true, showCloseButton = true, className = '', overlayClassName = '', children }) => {
4
+ const modalRef = useRef(null);
5
+ const overlayRef = useRef(null);
6
+ useEffect(() => {
7
+ if (!isOpen)
8
+ return;
9
+ const handleEscape = (e) => {
10
+ if (closeOnEscape && e.key === 'Escape') {
11
+ onClose();
12
+ }
13
+ };
14
+ const handleClickOutside = (e) => {
15
+ if (closeOnOverlayClick &&
16
+ overlayRef.current &&
17
+ modalRef.current &&
18
+ e.target === overlayRef.current) {
19
+ onClose();
20
+ }
21
+ };
22
+ document.addEventListener('keydown', handleEscape);
23
+ document.addEventListener('mousedown', handleClickOutside);
24
+ document.body.style.overflow = 'hidden';
25
+ return () => {
26
+ document.removeEventListener('keydown', handleEscape);
27
+ document.removeEventListener('mousedown', handleClickOutside);
28
+ document.body.style.overflow = '';
29
+ };
30
+ }, [isOpen, closeOnEscape, closeOnOverlayClick, onClose]);
31
+ if (!isOpen)
32
+ return null;
33
+ const baseClass = 'pure-modal';
34
+ const sizeClass = `pure-modal--${size}`;
35
+ const combinedClassName = [baseClass, sizeClass, className].filter(Boolean).join(' ');
36
+ const combinedOverlayClassName = ['pure-modal__overlay', overlayClassName].filter(Boolean).join(' ');
37
+ return (React.createElement("div", { className: combinedOverlayClassName, ref: overlayRef },
38
+ React.createElement("div", { className: combinedClassName, ref: modalRef },
39
+ (title || showCloseButton) && (React.createElement("div", { className: "pure-modal__header" },
40
+ title && React.createElement("h2", { className: "pure-modal__title" }, title),
41
+ showCloseButton && (React.createElement("button", { className: "pure-modal__close-button", onClick: onClose, "aria-label": "Close modal" },
42
+ React.createElement("span", { className: "pure-modal__close-icon" }, "\u00D7"))))),
43
+ React.createElement("div", { className: "pure-modal__body" }, children))));
44
+ };
45
+ //# sourceMappingURL=Modal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Modal.js","sourceRoot":"","sources":["../../../src/components/Modal/Modal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,aAAa,CAAC;AAerB,MAAM,CAAC,MAAM,KAAK,GAAyB,CAAC,EAC1C,MAAM,EACN,OAAO,EACP,KAAK,EACL,IAAI,GAAG,QAAQ,EACf,mBAAmB,GAAG,IAAI,EAC1B,aAAa,GAAG,IAAI,EACpB,eAAe,GAAG,IAAI,EACtB,SAAS,GAAG,EAAE,EACd,gBAAgB,GAAG,EAAE,EACrB,QAAQ,EACT,EAAE,EAAE;IACH,MAAM,QAAQ,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;IAEhD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,MAAM,YAAY,GAAG,CAAC,CAAgB,EAAE,EAAE;YACxC,IAAI,aAAa,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;gBACxC,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,CAAC;QAEF,MAAM,kBAAkB,GAAG,CAAC,CAAa,EAAE,EAAE;YAC3C,IACE,mBAAmB;gBACnB,UAAU,CAAC,OAAO;gBAClB,QAAQ,CAAC,OAAO;gBAChB,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,OAAO,EAC/B,CAAC;gBACD,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,CAAC;QAEF,QAAQ,CAAC,gBAAgB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;QACnD,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;QAC3D,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAExC,OAAO,GAAG,EAAE;YACV,QAAQ,CAAC,mBAAmB,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;YACtD,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAAC;YAC9D,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC;QACpC,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,mBAAmB,EAAE,OAAO,CAAC,CAAC,CAAC;IAE1D,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,MAAM,SAAS,GAAG,YAAY,CAAC;IAC/B,MAAM,SAAS,GAAG,eAAe,IAAI,EAAE,CAAC;IACxC,MAAM,iBAAiB,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtF,MAAM,wBAAwB,GAAG,CAAC,qBAAqB,EAAE,gBAAgB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAErG,OAAO,CACL,6BAAK,SAAS,EAAE,wBAAwB,EAAE,GAAG,EAAE,UAAU;QACvD,6BAAK,SAAS,EAAE,iBAAiB,EAAE,GAAG,EAAE,QAAQ;YAC7C,CAAC,KAAK,IAAI,eAAe,CAAC,IAAI,CAC7B,6BAAK,SAAS,EAAC,oBAAoB;gBAChC,KAAK,IAAI,4BAAI,SAAS,EAAC,mBAAmB,IAAE,KAAK,CAAM;gBACvD,eAAe,IAAI,CAClB,gCACE,SAAS,EAAC,0BAA0B,EACpC,OAAO,EAAE,OAAO,gBACL,aAAa;oBAExB,8BAAM,SAAS,EAAC,wBAAwB,aAAS,CAC1C,CACV,CACG,CACP;YACD,6BAAK,SAAS,EAAC,kBAAkB,IAC9B,QAAQ,CACL,CACF,CACF,CACP,CAAC;AACJ,CAAC,CAAC"}
package/lib/index.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ export { Button } from './components/Button/Button';
2
+ export type { ButtonProps } from './components/Button/Button';
3
+ export { Card } from './components/Card/Card';
4
+ export type { CardProps } from './components/Card/Card';
5
+ export { Modal } from './components/Modal/Modal';
6
+ export type { ModalProps } from './components/Modal/Modal';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACpD,YAAY,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE9D,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,YAAY,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAExD,OAAO,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AACjD,YAAY,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC"}
package/lib/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { Button } from './components/Button/Button';
2
+ export { Card } from './components/Card/Card';
3
+ export { Modal } from './components/Modal/Modal';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AAGpD,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAG9C,OAAO,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC"}
package/package.json CHANGED
@@ -1,58 +1,38 @@
1
- {
2
- "name": "pure-react-ui",
3
- "version": "1.4.6",
4
- "description": "A modern, accessible React UI component library with TypeScript",
5
- "main": "dist/index.js",
6
- "module": "dist/index.esm.js",
7
- "types": "dist/index.d.ts",
8
- "style": "src/styles/index.css",
9
- "type": "module",
10
- "files": [
11
- "dist",
12
- "src/styles"
13
- ],
14
- "scripts": {
15
- "build": "rollup -c",
16
- "test": "jest",
17
- "test:watch": "jest --watch",
18
- "lint": "eslint src --ext .ts,.tsx",
19
- "format": "prettier --write \"src/**/*.{ts,tsx,css}\"",
20
- "prepublishOnly": "npm run build"
21
- },
22
- "keywords": [
23
- "react",
24
- "ui",
25
- "components",
26
- "typescript",
27
- "component-library"
28
- ],
29
- "author": "Asad",
30
- "license": "ISC",
31
- "peerDependencies": {
32
- "react": "^19.2.3",
33
- "react-dom": "^19.2.3"
34
- },
35
- "devDependencies": {
36
- "@rollup/plugin-commonjs": "^29.0.0",
37
- "@rollup/plugin-node-resolve": "^16.0.3",
38
- "@rollup/plugin-typescript": "^12.3.0",
39
- "@testing-library/jest-dom": "^6.9.1",
40
- "@testing-library/react": "^16.3.1",
41
- "@types/jest": "^30.0.0",
42
- "@types/react": "^19.2.7",
43
- "@types/react-dom": "^19.2.3",
44
- "@typescript-eslint/eslint-plugin": "^8.51.0",
45
- "@typescript-eslint/parser": "^8.51.0",
46
- "eslint": "^9.39.2",
47
- "jest": "^30.2.0",
48
- "jest-environment-jsdom": "^30.2.0",
49
- "postcss": "^8.5.6",
50
- "prettier": "^3.7.4",
51
- "rollup": "^4.54.0",
52
- "rollup-plugin-peer-deps-external": "^2.2.4",
53
- "rollup-plugin-postcss": "^4.0.2",
54
- "ts-jest": "^29.4.6",
55
- "tslib": "^2.8.1",
56
- "typescript": "^5.9.3"
57
- }
58
- }
1
+ {
2
+ "name": "pure-react-ui",
3
+ "version": "1.4.7",
4
+ "description": "A pure React UI component library with Button, Card, and Modal components",
5
+ "main": "lib/index.js",
6
+ "types": "lib/index.d.ts",
7
+ "files": [
8
+ "lib",
9
+ "README.md"
10
+ ],
11
+ "scripts": {
12
+ "build": "tsc && node scripts/copy-css.js",
13
+ "prepublishOnly": "npm run build",
14
+ "test": "echo \"Error: no test specified\" && exit 1"
15
+ },
16
+ "keywords": [
17
+ "react",
18
+ "typescript",
19
+ "ui",
20
+ "components",
21
+ "button",
22
+ "card",
23
+ "modal",
24
+ "pure"
25
+ ],
26
+ "author": "",
27
+ "license": "MIT",
28
+ "peerDependencies": {
29
+ "react": ">=16.8.0",
30
+ "react-dom": ">=16.8.0"
31
+ },
32
+ "devDependencies": {
33
+ "@types/react": "^18.2.0",
34
+ "@types/react-dom": "^18.2.0",
35
+ "typescript": "^5.0.0"
36
+ }
37
+ }
38
+
@@ -1,5 +0,0 @@
1
- import React from 'react';
2
- import { ButtonProps } from './Button.types';
3
- import "../../styles/variables.css";
4
- export declare const PureButton: React.FC<ButtonProps>;
5
- //# sourceMappingURL=Button.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../../../src/components/Button/Button.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,OAAO,4BAA4B,CAAC;AAEpC,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CAmD5C,CAAC"}
@@ -1,14 +0,0 @@
1
- import { ButtonHTMLAttributes, ReactNode } from 'react';
2
- export type ButtonVariant = 'primary' | 'secondary' | 'success' | 'danger' | 'warning' | 'outline' | 'ghost';
3
- export type ButtonSize = 'sm' | 'md' | 'lg';
4
- export interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
5
- variant?: ButtonVariant;
6
- size?: ButtonSize;
7
- fullWidth?: boolean;
8
- loading?: boolean;
9
- disabled?: boolean;
10
- children: ReactNode;
11
- leftIcon?: ReactNode;
12
- rightIcon?: ReactNode;
13
- }
14
- //# sourceMappingURL=Button.types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Button.types.d.ts","sourceRoot":"","sources":["../../../src/components/Button/Button.types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAExD,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,CAAC;AAC7G,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE5C,MAAM,WAAW,WAAY,SAAQ,oBAAoB,CAAC,iBAAiB,CAAC;IAC1E,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB"}
@@ -1,2 +0,0 @@
1
- export { PureButton } from './Button';
2
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/Button/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC"}
@@ -1 +0,0 @@
1
- .Button-module_button__2ZuB7{align-items:center;border:none;border-radius:var(--pure-radius-md);cursor:pointer;display:inline-flex;font-family:var(--pure-font-family);font-size:var(--pure-font-size-md);font-weight:500;gap:var(--pure-spacing-sm);justify-content:center;overflow:hidden;position:relative;text-decoration:none;transition:all var(--pure-transition-base)}.Button-module_button--primary__0eqDM{background-color:var(--pure-color-primary);color:var(--pure-color-white)}.Button-module_button--primary__0eqDM:hover:not(:disabled){background-color:var(--pure-color-primary-hover)}.Button-module_button--secondary__iK3TS{background-color:var(--pure-color-secondary);color:var(--pure-color-white)}.Button-module_button--secondary__iK3TS:hover:not(:disabled){background-color:var(--pure-color-secondary-hover)}.Button-module_button--success__1WVzM{background-color:var(--pure-color-success);color:var(--pure-color-white)}.Button-module_button--success__1WVzM:hover:not(:disabled){background-color:var(--pure-color-success-hover)}.Button-module_button--danger__y2uGS{background-color:var(--pure-color-danger);color:var(--pure-color-white)}.Button-module_button--danger__y2uGS:hover:not(:disabled){background-color:var(--pure-color-danger-hover)}.Button-module_button--warning__cp3iP{background-color:var(--pure-color-warning);color:var(--pure-color-white)}.Button-module_button--warning__cp3iP:hover:not(:disabled){background-color:var(--pure-color-warning-hover)}.Button-module_button--outline__eVhnr{background-color:transparent;border:1px solid var(--pure-color-primary);color:var(--pure-color-primary)}.Button-module_button--outline__eVhnr:hover:not(:disabled){background-color:var(--pure-color-primary-light)}.Button-module_button--ghost__nktSD{background-color:transparent;color:var(--pure-color-primary)}.Button-module_button--ghost__nktSD:hover:not(:disabled){background-color:var(--pure-color-primary-light)}.Button-module_button--sm__-XOLs{font-size:var(--pure-font-size-sm);padding:var(--pure-spacing-xs) var(--pure-spacing-sm)}.Button-module_button--md__-GRga{font-size:var(--pure-font-size-md);padding:var(--pure-spacing-sm) var(--pure-spacing-md)}.Button-module_button--lg__p-URz{font-size:var(--pure-font-size-lg);padding:var(--pure-spacing-md) var(--pure-spacing-lg)}.Button-module_button--full-width__XyuwA{width:100%}.Button-module_button--loading__lNyfH{opacity:.8;pointer-events:none}.Button-module_button__2ZuB7:disabled{cursor:not-allowed;opacity:.6}.Button-module_button__icon__e6c-f,.Button-module_button__text__JjFiL{align-items:center;display:flex;justify-content:center}.Button-module_button__spinner__1soI4{height:20px;position:absolute;width:20px}.Button-module_spinner__ZExvW{animation:Button-module_rotate__TQjyl 2s linear infinite;height:100%;width:100%}.Button-module_spinner-path__Zk3SN{stroke:currentColor;stroke-linecap:round;animation:Button-module_dash__NItHE 1.5s ease-in-out infinite}@keyframes Button-module_rotate__TQjyl{to{transform:rotate(1turn)}}@keyframes Button-module_dash__NItHE{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}to{stroke-dasharray:90,150;stroke-dashoffset:-124}}:root{--pure-color-primary:#2563eb;--pure-color-primary-hover:#1d4ed8;--pure-color-primary-light:#dbeafe;--pure-color-secondary:#64748b;--pure-color-secondary-hover:#475569;--pure-color-secondary-light:#f1f5f9;--pure-color-success:#10b981;--pure-color-success-hover:#059669;--pure-color-success-light:#d1fae5;--pure-color-danger:#ef4444;--pure-color-danger-hover:#dc2626;--pure-color-danger-light:#fee2e2;--pure-color-warning:#f59e0b;--pure-color-warning-hover:#d97706;--pure-color-warning-light:#fef3c7;--pure-color-info:#3b82f6;--pure-color-info-hover:#2563eb;--pure-color-info-light:#dbeafe;--pure-color-white:#fff;--pure-color-black:#000;--pure-color-gray-50:#f9fafb;--pure-color-gray-100:#f3f4f6;--pure-color-gray-200:#e5e7eb;--pure-color-gray-300:#d1d5db;--pure-color-gray-400:#9ca3af;--pure-color-gray-500:#6b7280;--pure-color-gray-600:#4b5563;--pure-color-gray-700:#374151;--pure-color-gray-800:#1f2937;--pure-color-gray-900:#111827;--pure-spacing-xs:0.25rem;--pure-spacing-sm:0.5rem;--pure-spacing-md:1rem;--pure-spacing-lg:1.5rem;--pure-spacing-xl:2rem;--pure-spacing-2xl:3rem;--pure-radius-sm:0.25rem;--pure-radius-md:0.375rem;--pure-radius-lg:0.5rem;--pure-radius-xl:0.75rem;--pure-radius-full:9999px;--pure-shadow-sm:0 1px 2px 0 rgba(0,0,0,.05);--pure-shadow-md:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06);--pure-shadow-lg:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05);--pure-shadow-xl:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04);--pure-font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Roboto","Oxygen","Ubuntu","Cantarell","Fira Sans","Droid Sans","Helvetica Neue",sans-serif;--pure-font-size-xs:0.75rem;--pure-font-size-sm:0.875rem;--pure-font-size-md:1rem;--pure-font-size-lg:1.125rem;--pure-font-size-xl:1.25rem;--pure-font-size-2xl:1.5rem;--pure-transition-fast:150ms ease-in-out;--pure-transition-base:200ms ease-in-out;--pure-transition-slow:300ms ease-in-out;--pure-z-dropdown:1000;--pure-z-modal:1050;--pure-z-tooltip:1100}
package/dist/index.css DELETED
@@ -1 +0,0 @@
1
- .Button-module__button___2ZuB7{align-items:center;border:none;border-radius:var(--pure-radius-md);cursor:pointer;display:inline-flex;font-family:var(--pure-font-family);font-size:var(--pure-font-size-md);font-weight:500;gap:var(--pure-spacing-sm);justify-content:center;overflow:hidden;position:relative;text-decoration:none;transition:all var(--pure-transition-base)}.Button-module__button--primary___0eqDM{background-color:var(--pure-color-primary);color:var(--pure-color-white)}.Button-module__button--primary___0eqDM:hover:not(:disabled){background-color:var(--pure-color-primary-hover)}.Button-module__button--secondary___iK3TS{background-color:var(--pure-color-secondary);color:var(--pure-color-white)}.Button-module__button--secondary___iK3TS:hover:not(:disabled){background-color:var(--pure-color-secondary-hover)}.Button-module__button--success___1WVzM{background-color:var(--pure-color-success);color:var(--pure-color-white)}.Button-module__button--success___1WVzM:hover:not(:disabled){background-color:var(--pure-color-success-hover)}.Button-module__button--danger___y2uGS{background-color:var(--pure-color-danger);color:var(--pure-color-white)}.Button-module__button--danger___y2uGS:hover:not(:disabled){background-color:var(--pure-color-danger-hover)}.Button-module__button--warning___cp3iP{background-color:var(--pure-color-warning);color:var(--pure-color-white)}.Button-module__button--warning___cp3iP:hover:not(:disabled){background-color:var(--pure-color-warning-hover)}.Button-module__button--outline___eVhnr{background-color:transparent;border:1px solid var(--pure-color-primary);color:var(--pure-color-primary)}.Button-module__button--outline___eVhnr:hover:not(:disabled){background-color:var(--pure-color-primary-light)}.Button-module__button--ghost___nktSD{background-color:transparent;color:var(--pure-color-primary)}.Button-module__button--ghost___nktSD:hover:not(:disabled){background-color:var(--pure-color-primary-light)}.Button-module__button--sm___-XOLs{font-size:var(--pure-font-size-sm);padding:var(--pure-spacing-xs) var(--pure-spacing-sm)}.Button-module__button--md___-GRga{font-size:var(--pure-font-size-md);padding:var(--pure-spacing-sm) var(--pure-spacing-md)}.Button-module__button--lg___p-URz{font-size:var(--pure-font-size-lg);padding:var(--pure-spacing-md) var(--pure-spacing-lg)}.Button-module__button--full-width___XyuwA{width:100%}.Button-module__button--loading___lNyfH{opacity:.8;pointer-events:none}.Button-module__button___2ZuB7:disabled{cursor:not-allowed;opacity:.6}.Button-module__button__icon___e6c-f,.Button-module__button__text___JjFiL{align-items:center;display:flex;justify-content:center}.Button-module__button__spinner___1soI4{height:20px;position:absolute;width:20px}.Button-module__spinner___ZExvW{animation:Button-module__rotate___TQjyl 2s linear infinite;height:100%;width:100%}.Button-module__spinner-path___Zk3SN{stroke:currentColor;stroke-linecap:round;animation:Button-module__dash___NItHE 1.5s ease-in-out infinite}@keyframes Button-module__rotate___TQjyl{to{transform:rotate(1turn)}}@keyframes Button-module__dash___NItHE{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}to{stroke-dasharray:90,150;stroke-dashoffset:-124}}:root{--pure-color-primary:#2563eb;--pure-color-primary-hover:#1d4ed8;--pure-color-primary-light:#dbeafe;--pure-color-secondary:#64748b;--pure-color-secondary-hover:#475569;--pure-color-secondary-light:#f1f5f9;--pure-color-success:#10b981;--pure-color-success-hover:#059669;--pure-color-success-light:#d1fae5;--pure-color-danger:#ef4444;--pure-color-danger-hover:#dc2626;--pure-color-danger-light:#fee2e2;--pure-color-warning:#f59e0b;--pure-color-warning-hover:#d97706;--pure-color-warning-light:#fef3c7;--pure-color-info:#3b82f6;--pure-color-info-hover:#2563eb;--pure-color-info-light:#dbeafe;--pure-color-white:#fff;--pure-color-black:#000;--pure-color-gray-50:#f9fafb;--pure-color-gray-100:#f3f4f6;--pure-color-gray-200:#e5e7eb;--pure-color-gray-300:#d1d5db;--pure-color-gray-400:#9ca3af;--pure-color-gray-500:#6b7280;--pure-color-gray-600:#4b5563;--pure-color-gray-700:#374151;--pure-color-gray-800:#1f2937;--pure-color-gray-900:#111827;--pure-spacing-xs:0.25rem;--pure-spacing-sm:0.5rem;--pure-spacing-md:1rem;--pure-spacing-lg:1.5rem;--pure-spacing-xl:2rem;--pure-spacing-2xl:3rem;--pure-radius-sm:0.25rem;--pure-radius-md:0.375rem;--pure-radius-lg:0.5rem;--pure-radius-xl:0.75rem;--pure-radius-full:9999px;--pure-shadow-sm:0 1px 2px 0 rgba(0,0,0,.05);--pure-shadow-md:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06);--pure-shadow-lg:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05);--pure-shadow-xl:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04);--pure-font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Roboto","Oxygen","Ubuntu","Cantarell","Fira Sans","Droid Sans","Helvetica Neue",sans-serif;--pure-font-size-xs:0.75rem;--pure-font-size-sm:0.875rem;--pure-font-size-md:1rem;--pure-font-size-lg:1.125rem;--pure-font-size-xl:1.25rem;--pure-font-size-2xl:1.5rem;--pure-transition-fast:150ms ease-in-out;--pure-transition-base:200ms ease-in-out;--pure-transition-slow:300ms ease-in-out;--pure-z-dropdown:1000;--pure-z-modal:1050;--pure-z-tooltip:1100}
package/dist/index.d.ts DELETED
@@ -1,2 +0,0 @@
1
- export { PureButton } from './components/Button';
2
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC"}
@@ -1 +0,0 @@
1
- .Button-module__button___2ZuB7{align-items:center;border:none;border-radius:var(--pure-radius-md);cursor:pointer;display:inline-flex;font-family:var(--pure-font-family);font-size:var(--pure-font-size-md);font-weight:500;gap:var(--pure-spacing-sm);justify-content:center;overflow:hidden;position:relative;text-decoration:none;transition:all var(--pure-transition-base)}.Button-module__button--primary___0eqDM{background-color:var(--pure-color-primary);color:var(--pure-color-white)}.Button-module__button--primary___0eqDM:hover:not(:disabled){background-color:var(--pure-color-primary-hover)}.Button-module__button--secondary___iK3TS{background-color:var(--pure-color-secondary);color:var(--pure-color-white)}.Button-module__button--secondary___iK3TS:hover:not(:disabled){background-color:var(--pure-color-secondary-hover)}.Button-module__button--success___1WVzM{background-color:var(--pure-color-success);color:var(--pure-color-white)}.Button-module__button--success___1WVzM:hover:not(:disabled){background-color:var(--pure-color-success-hover)}.Button-module__button--danger___y2uGS{background-color:var(--pure-color-danger);color:var(--pure-color-white)}.Button-module__button--danger___y2uGS:hover:not(:disabled){background-color:var(--pure-color-danger-hover)}.Button-module__button--warning___cp3iP{background-color:var(--pure-color-warning);color:var(--pure-color-white)}.Button-module__button--warning___cp3iP:hover:not(:disabled){background-color:var(--pure-color-warning-hover)}.Button-module__button--outline___eVhnr{background-color:transparent;border:1px solid var(--pure-color-primary);color:var(--pure-color-primary)}.Button-module__button--outline___eVhnr:hover:not(:disabled){background-color:var(--pure-color-primary-light)}.Button-module__button--ghost___nktSD{background-color:transparent;color:var(--pure-color-primary)}.Button-module__button--ghost___nktSD:hover:not(:disabled){background-color:var(--pure-color-primary-light)}.Button-module__button--sm___-XOLs{font-size:var(--pure-font-size-sm);padding:var(--pure-spacing-xs) var(--pure-spacing-sm)}.Button-module__button--md___-GRga{font-size:var(--pure-font-size-md);padding:var(--pure-spacing-sm) var(--pure-spacing-md)}.Button-module__button--lg___p-URz{font-size:var(--pure-font-size-lg);padding:var(--pure-spacing-md) var(--pure-spacing-lg)}.Button-module__button--full-width___XyuwA{width:100%}.Button-module__button--loading___lNyfH{opacity:.8;pointer-events:none}.Button-module__button___2ZuB7:disabled{cursor:not-allowed;opacity:.6}.Button-module__button__icon___e6c-f,.Button-module__button__text___JjFiL{align-items:center;display:flex;justify-content:center}.Button-module__button__spinner___1soI4{height:20px;position:absolute;width:20px}.Button-module__spinner___ZExvW{animation:Button-module__rotate___TQjyl 2s linear infinite;height:100%;width:100%}.Button-module__spinner-path___Zk3SN{stroke:currentColor;stroke-linecap:round;animation:Button-module__dash___NItHE 1.5s ease-in-out infinite}@keyframes Button-module__rotate___TQjyl{to{transform:rotate(1turn)}}@keyframes Button-module__dash___NItHE{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}to{stroke-dasharray:90,150;stroke-dashoffset:-124}}:root{--pure-color-primary:#2563eb;--pure-color-primary-hover:#1d4ed8;--pure-color-primary-light:#dbeafe;--pure-color-secondary:#64748b;--pure-color-secondary-hover:#475569;--pure-color-secondary-light:#f1f5f9;--pure-color-success:#10b981;--pure-color-success-hover:#059669;--pure-color-success-light:#d1fae5;--pure-color-danger:#ef4444;--pure-color-danger-hover:#dc2626;--pure-color-danger-light:#fee2e2;--pure-color-warning:#f59e0b;--pure-color-warning-hover:#d97706;--pure-color-warning-light:#fef3c7;--pure-color-info:#3b82f6;--pure-color-info-hover:#2563eb;--pure-color-info-light:#dbeafe;--pure-color-white:#fff;--pure-color-black:#000;--pure-color-gray-50:#f9fafb;--pure-color-gray-100:#f3f4f6;--pure-color-gray-200:#e5e7eb;--pure-color-gray-300:#d1d5db;--pure-color-gray-400:#9ca3af;--pure-color-gray-500:#6b7280;--pure-color-gray-600:#4b5563;--pure-color-gray-700:#374151;--pure-color-gray-800:#1f2937;--pure-color-gray-900:#111827;--pure-spacing-xs:0.25rem;--pure-spacing-sm:0.5rem;--pure-spacing-md:1rem;--pure-spacing-lg:1.5rem;--pure-spacing-xl:2rem;--pure-spacing-2xl:3rem;--pure-radius-sm:0.25rem;--pure-radius-md:0.375rem;--pure-radius-lg:0.5rem;--pure-radius-xl:0.75rem;--pure-radius-full:9999px;--pure-shadow-sm:0 1px 2px 0 rgba(0,0,0,.05);--pure-shadow-md:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06);--pure-shadow-lg:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05);--pure-shadow-xl:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04);--pure-font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","Roboto","Oxygen","Ubuntu","Cantarell","Fira Sans","Droid Sans","Helvetica Neue",sans-serif;--pure-font-size-xs:0.75rem;--pure-font-size-sm:0.875rem;--pure-font-size-md:1rem;--pure-font-size-lg:1.125rem;--pure-font-size-xl:1.25rem;--pure-font-size-2xl:1.5rem;--pure-transition-fast:150ms ease-in-out;--pure-transition-base:200ms ease-in-out;--pure-transition-slow:300ms ease-in-out;--pure-z-dropdown:1000;--pure-z-modal:1050;--pure-z-tooltip:1100}
package/dist/index.esm.js DELETED
@@ -1,25 +0,0 @@
1
- import React from 'react';
2
-
3
- var styles = {"button":"Button-module__button___2ZuB7","button--primary":"Button-module__button--primary___0eqDM","button--secondary":"Button-module__button--secondary___iK3TS","button--success":"Button-module__button--success___1WVzM","button--danger":"Button-module__button--danger___y2uGS","button--warning":"Button-module__button--warning___cp3iP","button--outline":"Button-module__button--outline___eVhnr","button--ghost":"Button-module__button--ghost___nktSD","button--sm":"Button-module__button--sm___-XOLs","button--md":"Button-module__button--md___-GRga","button--lg":"Button-module__button--lg___p-URz","button--full-width":"Button-module__button--full-width___XyuwA","button--loading":"Button-module__button--loading___lNyfH","button__icon":"Button-module__button__icon___e6c-f","button__text":"Button-module__button__text___JjFiL","button__spinner":"Button-module__button__spinner___1soI4","spinner":"Button-module__spinner___ZExvW","rotate":"Button-module__rotate___TQjyl","spinner-path":"Button-module__spinner-path___Zk3SN","dash":"Button-module__dash___NItHE"};
4
-
5
- const PureButton = ({ variant = 'primary', size = 'md', fullWidth = false, loading = false, disabled = false, children, leftIcon, rightIcon, className = '', ...props }) => {
6
- const classes = [
7
- styles.button,
8
- styles[`button--${variant}`],
9
- styles[`button--${size}`],
10
- fullWidth && styles['button--full-width'],
11
- loading && styles['button--loading'],
12
- className
13
- ].filter(Boolean).join(' ');
14
- return (React.createElement("button", { className: classes, disabled: disabled || loading, ...props },
15
- loading && (React.createElement("span", { className: styles['button__spinner'] },
16
- React.createElement("svg", { className: styles['spinner'], viewBox: "0 0 50 50" },
17
- React.createElement("circle", { className: styles['spinner-path'], cx: "25", cy: "25", r: "20", fill: "none", strokeWidth: "4" })))),
18
- !loading && leftIcon && (React.createElement("span", { className: styles['button__icon'] }, leftIcon)),
19
- React.createElement("span", { className: styles['button__text'] }, children),
20
- !loading && rightIcon && (React.createElement("span", { className: styles['button__icon'] }, rightIcon))));
21
- };
22
- PureButton.displayName = 'PureButton';
23
-
24
- export { PureButton };
25
- //# sourceMappingURL=index.esm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.esm.js","sources":["../src/components/Button/Button.tsx"],"sourcesContent":["import React from 'react';\r\nimport { ButtonProps } from './Button.types';\r\nimport styles from \"./Button.module.css\";\r\nimport \"../../styles/variables.css\";\r\n\r\nexport const PureButton: React.FC<ButtonProps> = ({\r\n variant = 'primary',\r\n size = 'md',\r\n fullWidth = false,\r\n loading = false,\r\n disabled = false,\r\n children,\r\n leftIcon,\r\n rightIcon,\r\n className = '',\r\n ...props\r\n}) => {\r\n const classes = [\r\n styles.button,\r\n styles[`button--${variant}`],\r\n styles[`button--${size}`],\r\n fullWidth && styles['button--full-width'],\r\n loading && styles['button--loading'],\r\n className\r\n ].filter(Boolean).join(' ');\r\n\r\n return (\r\n <button\r\n className={classes}\r\n disabled={disabled || loading}\r\n {...props}\r\n >\r\n {loading && (\r\n <span className={styles['button__spinner']}>\r\n {/* Loading spinner */}\r\n <svg className={styles['spinner']} viewBox=\"0 0 50 50\">\r\n <circle\r\n className={styles['spinner-path']}\r\n cx=\"25\"\r\n cy=\"25\"\r\n r=\"20\"\r\n fill=\"none\"\r\n strokeWidth=\"4\"\r\n />\r\n </svg>\r\n </span>\r\n )}\r\n {!loading && leftIcon && (\r\n <span className={styles['button__icon']}>{leftIcon}</span>\r\n )}\r\n <span className={styles['button__text']}>{children}</span>\r\n {!loading && rightIcon && (\r\n <span className={styles['button__icon']}>{rightIcon}</span>\r\n )}\r\n </button>\r\n );\r\n};\r\n\r\nPureButton.displayName = 'PureButton';"],"names":[],"mappings":";;;;AAKO,MAAM,UAAU,GAA0B,CAAC,EAC9C,OAAO,GAAG,SAAS,EACnB,IAAI,GAAG,IAAI,EACX,SAAS,GAAG,KAAK,EACjB,OAAO,GAAG,KAAK,EACf,QAAQ,GAAG,KAAK,EAChB,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,SAAS,GAAG,EAAE,EACd,GAAG,KAAK,EACX,KAAI;AACD,IAAA,MAAM,OAAO,GAAG;AACZ,QAAA,MAAM,CAAC,MAAM;AACb,QAAA,MAAM,CAAC,CAAA,QAAA,EAAW,OAAO,CAAA,CAAE,CAAC;AAC5B,QAAA,MAAM,CAAC,CAAA,QAAA,EAAW,IAAI,CAAA,CAAE,CAAC;AACzB,QAAA,SAAS,IAAI,MAAM,CAAC,oBAAoB,CAAC;AACzC,QAAA,OAAO,IAAI,MAAM,CAAC,iBAAiB,CAAC;QACpC;KACH,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AAE3B,IAAA,QACI,KAAA,CAAA,aAAA,CAAA,QAAA,EAAA,EACI,SAAS,EAAE,OAAO,EAClB,QAAQ,EAAE,QAAQ,IAAI,OAAO,EAAA,GACzB,KAAK,EAAA;QAER,OAAO,KACJ,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAE,MAAM,CAAC,iBAAiB,CAAC,EAAA;YAEtC,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,OAAO,EAAC,WAAW,EAAA;AAClD,gBAAA,KAAA,CAAA,aAAA,CAAA,QAAA,EAAA,EACI,SAAS,EAAE,MAAM,CAAC,cAAc,CAAC,EACjC,EAAE,EAAC,IAAI,EACP,EAAE,EAAC,IAAI,EACP,CAAC,EAAC,IAAI,EACN,IAAI,EAAC,MAAM,EACX,WAAW,EAAC,GAAG,EAAA,CACjB,CACA,CACH,CACV;AACA,QAAA,CAAC,OAAO,IAAI,QAAQ,KACjB,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAE,MAAM,CAAC,cAAc,CAAC,EAAA,EAAG,QAAQ,CAAQ,CAC7D;QACD,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAE,MAAM,CAAC,cAAc,CAAC,EAAA,EAAG,QAAQ,CAAQ;AACzD,QAAA,CAAC,OAAO,IAAI,SAAS,KAClB,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAE,MAAM,CAAC,cAAc,CAAC,EAAA,EAAG,SAAS,CAAQ,CAC9D,CACI;AAEjB;AAEA,UAAU,CAAC,WAAW,GAAG,YAAY;;;;"}
package/dist/index.js DELETED
@@ -1,27 +0,0 @@
1
- 'use strict';
2
-
3
- var React = require('react');
4
-
5
- var styles = {"button":"Button-module__button___2ZuB7","button--primary":"Button-module__button--primary___0eqDM","button--secondary":"Button-module__button--secondary___iK3TS","button--success":"Button-module__button--success___1WVzM","button--danger":"Button-module__button--danger___y2uGS","button--warning":"Button-module__button--warning___cp3iP","button--outline":"Button-module__button--outline___eVhnr","button--ghost":"Button-module__button--ghost___nktSD","button--sm":"Button-module__button--sm___-XOLs","button--md":"Button-module__button--md___-GRga","button--lg":"Button-module__button--lg___p-URz","button--full-width":"Button-module__button--full-width___XyuwA","button--loading":"Button-module__button--loading___lNyfH","button__icon":"Button-module__button__icon___e6c-f","button__text":"Button-module__button__text___JjFiL","button__spinner":"Button-module__button__spinner___1soI4","spinner":"Button-module__spinner___ZExvW","rotate":"Button-module__rotate___TQjyl","spinner-path":"Button-module__spinner-path___Zk3SN","dash":"Button-module__dash___NItHE"};
6
-
7
- const PureButton = ({ variant = 'primary', size = 'md', fullWidth = false, loading = false, disabled = false, children, leftIcon, rightIcon, className = '', ...props }) => {
8
- const classes = [
9
- styles.button,
10
- styles[`button--${variant}`],
11
- styles[`button--${size}`],
12
- fullWidth && styles['button--full-width'],
13
- loading && styles['button--loading'],
14
- className
15
- ].filter(Boolean).join(' ');
16
- return (React.createElement("button", { className: classes, disabled: disabled || loading, ...props },
17
- loading && (React.createElement("span", { className: styles['button__spinner'] },
18
- React.createElement("svg", { className: styles['spinner'], viewBox: "0 0 50 50" },
19
- React.createElement("circle", { className: styles['spinner-path'], cx: "25", cy: "25", r: "20", fill: "none", strokeWidth: "4" })))),
20
- !loading && leftIcon && (React.createElement("span", { className: styles['button__icon'] }, leftIcon)),
21
- React.createElement("span", { className: styles['button__text'] }, children),
22
- !loading && rightIcon && (React.createElement("span", { className: styles['button__icon'] }, rightIcon))));
23
- };
24
- PureButton.displayName = 'PureButton';
25
-
26
- exports.PureButton = PureButton;
27
- //# sourceMappingURL=index.js.map
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sources":["../src/components/Button/Button.tsx"],"sourcesContent":["import React from 'react';\r\nimport { ButtonProps } from './Button.types';\r\nimport styles from \"./Button.module.css\";\r\nimport \"../../styles/variables.css\";\r\n\r\nexport const PureButton: React.FC<ButtonProps> = ({\r\n variant = 'primary',\r\n size = 'md',\r\n fullWidth = false,\r\n loading = false,\r\n disabled = false,\r\n children,\r\n leftIcon,\r\n rightIcon,\r\n className = '',\r\n ...props\r\n}) => {\r\n const classes = [\r\n styles.button,\r\n styles[`button--${variant}`],\r\n styles[`button--${size}`],\r\n fullWidth && styles['button--full-width'],\r\n loading && styles['button--loading'],\r\n className\r\n ].filter(Boolean).join(' ');\r\n\r\n return (\r\n <button\r\n className={classes}\r\n disabled={disabled || loading}\r\n {...props}\r\n >\r\n {loading && (\r\n <span className={styles['button__spinner']}>\r\n {/* Loading spinner */}\r\n <svg className={styles['spinner']} viewBox=\"0 0 50 50\">\r\n <circle\r\n className={styles['spinner-path']}\r\n cx=\"25\"\r\n cy=\"25\"\r\n r=\"20\"\r\n fill=\"none\"\r\n strokeWidth=\"4\"\r\n />\r\n </svg>\r\n </span>\r\n )}\r\n {!loading && leftIcon && (\r\n <span className={styles['button__icon']}>{leftIcon}</span>\r\n )}\r\n <span className={styles['button__text']}>{children}</span>\r\n {!loading && rightIcon && (\r\n <span className={styles['button__icon']}>{rightIcon}</span>\r\n )}\r\n </button>\r\n );\r\n};\r\n\r\nPureButton.displayName = 'PureButton';"],"names":[],"mappings":";;;;;;AAKO,MAAM,UAAU,GAA0B,CAAC,EAC9C,OAAO,GAAG,SAAS,EACnB,IAAI,GAAG,IAAI,EACX,SAAS,GAAG,KAAK,EACjB,OAAO,GAAG,KAAK,EACf,QAAQ,GAAG,KAAK,EAChB,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,SAAS,GAAG,EAAE,EACd,GAAG,KAAK,EACX,KAAI;AACD,IAAA,MAAM,OAAO,GAAG;AACZ,QAAA,MAAM,CAAC,MAAM;AACb,QAAA,MAAM,CAAC,CAAA,QAAA,EAAW,OAAO,CAAA,CAAE,CAAC;AAC5B,QAAA,MAAM,CAAC,CAAA,QAAA,EAAW,IAAI,CAAA,CAAE,CAAC;AACzB,QAAA,SAAS,IAAI,MAAM,CAAC,oBAAoB,CAAC;AACzC,QAAA,OAAO,IAAI,MAAM,CAAC,iBAAiB,CAAC;QACpC;KACH,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AAE3B,IAAA,QACI,KAAA,CAAA,aAAA,CAAA,QAAA,EAAA,EACI,SAAS,EAAE,OAAO,EAClB,QAAQ,EAAE,QAAQ,IAAI,OAAO,EAAA,GACzB,KAAK,EAAA;QAER,OAAO,KACJ,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAE,MAAM,CAAC,iBAAiB,CAAC,EAAA;YAEtC,KAAA,CAAA,aAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE,OAAO,EAAC,WAAW,EAAA;AAClD,gBAAA,KAAA,CAAA,aAAA,CAAA,QAAA,EAAA,EACI,SAAS,EAAE,MAAM,CAAC,cAAc,CAAC,EACjC,EAAE,EAAC,IAAI,EACP,EAAE,EAAC,IAAI,EACP,CAAC,EAAC,IAAI,EACN,IAAI,EAAC,MAAM,EACX,WAAW,EAAC,GAAG,EAAA,CACjB,CACA,CACH,CACV;AACA,QAAA,CAAC,OAAO,IAAI,QAAQ,KACjB,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAE,MAAM,CAAC,cAAc,CAAC,EAAA,EAAG,QAAQ,CAAQ,CAC7D;QACD,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAE,MAAM,CAAC,cAAc,CAAC,EAAA,EAAG,QAAQ,CAAQ;AACzD,QAAA,CAAC,OAAO,IAAI,SAAS,KAClB,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAE,MAAM,CAAC,cAAc,CAAC,EAAA,EAAG,SAAS,CAAQ,CAC9D,CACI;AAEjB;AAEA,UAAU,CAAC,WAAW,GAAG,YAAY;;;;"}
@@ -1,2 +0,0 @@
1
- import '@testing-library/jest-dom';
2
- //# sourceMappingURL=setupTests.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"setupTests.d.ts","sourceRoot":"","sources":["../src/setupTests.ts"],"names":[],"mappings":"AAAA,OAAO,2BAA2B,CAAC"}
@@ -1,81 +0,0 @@
1
- /* CSS Variables */
2
- :root {
3
- /* Colors */
4
- --pure-color-primary: #2563eb;
5
- --pure-color-primary-hover: #1d4ed8;
6
- --pure-color-primary-light: #dbeafe;
7
-
8
- --pure-color-secondary: #64748b;
9
- --pure-color-secondary-hover: #475569;
10
- --pure-color-secondary-light: #f1f5f9;
11
-
12
- --pure-color-success: #10b981;
13
- --pure-color-success-hover: #059669;
14
- --pure-color-success-light: #d1fae5;
15
-
16
- --pure-color-danger: #ef4444;
17
- --pure-color-danger-hover: #dc2626;
18
- --pure-color-danger-light: #fee2e2;
19
-
20
- --pure-color-warning: #f59e0b;
21
- --pure-color-warning-hover: #d97706;
22
- --pure-color-warning-light: #fef3c7;
23
-
24
- --pure-color-info: #3b82f6;
25
- --pure-color-info-hover: #2563eb;
26
- --pure-color-info-light: #dbeafe;
27
-
28
- /* Neutrals */
29
- --pure-color-white: #ffffff;
30
- --pure-color-black: #000000;
31
- --pure-color-gray-50: #f9fafb;
32
- --pure-color-gray-100: #f3f4f6;
33
- --pure-color-gray-200: #e5e7eb;
34
- --pure-color-gray-300: #d1d5db;
35
- --pure-color-gray-400: #9ca3af;
36
- --pure-color-gray-500: #6b7280;
37
- --pure-color-gray-600: #4b5563;
38
- --pure-color-gray-700: #374151;
39
- --pure-color-gray-800: #1f2937;
40
- --pure-color-gray-900: #111827;
41
-
42
- /* Spacing */
43
- --pure-spacing-xs: 0.25rem;
44
- --pure-spacing-sm: 0.5rem;
45
- --pure-spacing-md: 1rem;
46
- --pure-spacing-lg: 1.5rem;
47
- --pure-spacing-xl: 2rem;
48
- --pure-spacing-2xl: 3rem;
49
-
50
- /* Border Radius */
51
- --pure-radius-sm: 0.25rem;
52
- --pure-radius-md: 0.375rem;
53
- --pure-radius-lg: 0.5rem;
54
- --pure-radius-xl: 0.75rem;
55
- --pure-radius-full: 9999px;
56
-
57
- /* Shadows */
58
- --pure-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
59
- --pure-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
60
- --pure-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
61
- --pure-shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
62
-
63
- /* Typography */
64
- --pure-font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
65
- --pure-font-size-xs: 0.75rem;
66
- --pure-font-size-sm: 0.875rem;
67
- --pure-font-size-md: 1rem;
68
- --pure-font-size-lg: 1.125rem;
69
- --pure-font-size-xl: 1.25rem;
70
- --pure-font-size-2xl: 1.5rem;
71
-
72
- /* Transitions */
73
- --pure-transition-fast: 150ms ease-in-out;
74
- --pure-transition-base: 200ms ease-in-out;
75
- --pure-transition-slow: 300ms ease-in-out;
76
-
77
- /* Z-index */
78
- --pure-z-dropdown: 1000;
79
- --pure-z-modal: 1050;
80
- --pure-z-tooltip: 1100;
81
- }
@@ -1,80 +0,0 @@
1
- :root {
2
- /* Colors */
3
- --pure-color-primary: #2563eb;
4
- --pure-color-primary-hover: #1d4ed8;
5
- --pure-color-primary-light: #dbeafe;
6
-
7
- --pure-color-secondary: #64748b;
8
- --pure-color-secondary-hover: #475569;
9
- --pure-color-secondary-light: #f1f5f9;
10
-
11
- --pure-color-success: #10b981;
12
- --pure-color-success-hover: #059669;
13
- --pure-color-success-light: #d1fae5;
14
-
15
- --pure-color-danger: #ef4444;
16
- --pure-color-danger-hover: #dc2626;
17
- --pure-color-danger-light: #fee2e2;
18
-
19
- --pure-color-warning: #f59e0b;
20
- --pure-color-warning-hover: #d97706;
21
- --pure-color-warning-light: #fef3c7;
22
-
23
- --pure-color-info: #3b82f6;
24
- --pure-color-info-hover: #2563eb;
25
- --pure-color-info-light: #dbeafe;
26
-
27
- /* Neutrals */
28
- --pure-color-white: #ffffff;
29
- --pure-color-black: #000000;
30
- --pure-color-gray-50: #f9fafb;
31
- --pure-color-gray-100: #f3f4f6;
32
- --pure-color-gray-200: #e5e7eb;
33
- --pure-color-gray-300: #d1d5db;
34
- --pure-color-gray-400: #9ca3af;
35
- --pure-color-gray-500: #6b7280;
36
- --pure-color-gray-600: #4b5563;
37
- --pure-color-gray-700: #374151;
38
- --pure-color-gray-800: #1f2937;
39
- --pure-color-gray-900: #111827;
40
-
41
- /* Spacing */
42
- --pure-spacing-xs: 0.25rem;
43
- --pure-spacing-sm: 0.5rem;
44
- --pure-spacing-md: 1rem;
45
- --pure-spacing-lg: 1.5rem;
46
- --pure-spacing-xl: 2rem;
47
- --pure-spacing-2xl: 3rem;
48
-
49
- /* Border Radius */
50
- --pure-radius-sm: 0.25rem;
51
- --pure-radius-md: 0.375rem;
52
- --pure-radius-lg: 0.5rem;
53
- --pure-radius-xl: 0.75rem;
54
- --pure-radius-full: 9999px;
55
-
56
- /* Shadows */
57
- --pure-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
58
- --pure-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
59
- --pure-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
60
- --pure-shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
61
-
62
- /* Typography */
63
- --pure-font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;
64
- --pure-font-size-xs: 0.75rem;
65
- --pure-font-size-sm: 0.875rem;
66
- --pure-font-size-md: 1rem;
67
- --pure-font-size-lg: 1.125rem;
68
- --pure-font-size-xl: 1.25rem;
69
- --pure-font-size-2xl: 1.5rem;
70
-
71
- /* Transitions */
72
- --pure-transition-fast: 150ms ease-in-out;
73
- --pure-transition-base: 200ms ease-in-out;
74
- --pure-transition-slow: 300ms ease-in-out;
75
-
76
- /* Z-index */
77
- --pure-z-dropdown: 1000;
78
- --pure-z-modal: 1050;
79
- --pure-z-tooltip: 1100;
80
- }