elementdrawing 1.0.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/LICENSE +21 -0
- package/dist/elementdrawing.min.js +3 -0
- package/dist/elementdrawing.min.js.LICENSE.txt +8 -0
- package/dist/elementdrawing.min.js.map +1 -0
- package/dist/index.html +1 -0
- package/package.json +127 -0
- package/src/core/bridge.h +855 -0
- package/src/core/diff.c +900 -0
- package/src/core/element.c +1078 -0
- package/src/core/event.c +813 -0
- package/src/core/fiber.c +1027 -0
- package/src/core/hooks.c +919 -0
- package/src/core/renderer.c +963 -0
- package/src/core/scheduler.c +702 -0
- package/src/core/state.c +803 -0
- package/src/css/animations.css +779 -0
- package/src/css/base.css +615 -0
- package/src/css/components.css +1311 -0
- package/src/css/tailwind.css +370 -0
- package/src/css/themes.css +517 -0
- package/src/css/utilities.css +475 -0
- package/src/index.js +746 -0
- package/src/js/animation.js +655 -0
- package/src/js/dom.js +665 -0
- package/src/js/events.js +585 -0
- package/src/js/http.js +446 -0
- package/src/js/index.js +26 -0
- package/src/js/router.js +483 -0
- package/src/js/store.js +539 -0
- package/src/js/utils.js +593 -0
- package/src/js/validator.js +529 -0
- package/src/jsx/components/Accordion.jsx +210 -0
- package/src/jsx/components/Alert.jsx +169 -0
- package/src/jsx/components/Avatar.jsx +214 -0
- package/src/jsx/components/Badge.jsx +136 -0
- package/src/jsx/components/Breadcrumb.jsx +200 -0
- package/src/jsx/components/Button.jsx +188 -0
- package/src/jsx/components/Card.jsx +192 -0
- package/src/jsx/components/Carousel.jsx +278 -0
- package/src/jsx/components/Checkbox.jsx +215 -0
- package/src/jsx/components/Dialog.jsx +242 -0
- package/src/jsx/components/Drawer.jsx +190 -0
- package/src/jsx/components/Dropdown.jsx +268 -0
- package/src/jsx/components/Form.jsx +274 -0
- package/src/jsx/components/Input.jsx +285 -0
- package/src/jsx/components/Menu.jsx +276 -0
- package/src/jsx/components/Modal.jsx +274 -0
- package/src/jsx/components/Navbar.jsx +292 -0
- package/src/jsx/components/Pagination.jsx +268 -0
- package/src/jsx/components/Progress.jsx +252 -0
- package/src/jsx/components/Radio.jsx +208 -0
- package/src/jsx/components/Select.jsx +397 -0
- package/src/jsx/components/Sidebar.jsx +250 -0
- package/src/jsx/components/Slider.jsx +310 -0
- package/src/jsx/components/Spinner.jsx +198 -0
- package/src/jsx/components/Switch.jsx +201 -0
- package/src/jsx/components/Table.jsx +332 -0
- package/src/jsx/components/Tabs.jsx +227 -0
- package/src/jsx/components/Textarea.jsx +212 -0
- package/src/jsx/components/Toast.jsx +270 -0
- package/src/jsx/components/Tooltip.jsx +178 -0
- package/src/jsx/components/Typography.jsx +299 -0
- package/src/jsx/components/index.jsx +70 -0
- package/src/jsx/core/element.js +3 -0
- package/src/jsx/hooks/index.js +356 -0
- package/src/jsx/hooks/useCallback.js +472 -0
- package/src/jsx/hooks/useContext.js +586 -0
- package/src/jsx/hooks/useEffect.js +704 -0
- package/src/jsx/hooks/useLayoutEffect.js +508 -0
- package/src/jsx/hooks/useMemo.js +689 -0
- package/src/jsx/hooks/useReducer.js +729 -0
- package/src/jsx/hooks/useRef.js +542 -0
- package/src/jsx/hooks/useState.js +854 -0
- package/src/jsx/runtime/commit.js +903 -0
- package/src/jsx/runtime/createElement.js +860 -0
- package/src/jsx/runtime/index.js +356 -0
- package/src/jsx/runtime/reconcile.js +687 -0
- package/src/jsx/runtime/render.js +914 -0
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Badge Component for ElementDrawing Framework
|
|
3
|
+
* Supports variants, sizes, dot, count, overflow, standalone, positioned on parent
|
|
4
|
+
*/
|
|
5
|
+
const ED = require('../core/element');
|
|
6
|
+
|
|
7
|
+
const BADGE_VARIANTS = {
|
|
8
|
+
default: 'ed-bg-gray-500 ed-text-white',
|
|
9
|
+
primary: 'ed-bg-blue-500 ed-text-white',
|
|
10
|
+
success: 'ed-bg-green-500 ed-text-white',
|
|
11
|
+
warning: 'ed-bg-yellow-500 ed-text-white',
|
|
12
|
+
danger: 'ed-bg-red-500 ed-text-white',
|
|
13
|
+
info: 'ed-bg-cyan-500 ed-text-white',
|
|
14
|
+
secondary: 'ed-bg-gray-200 ed-text-gray-800',
|
|
15
|
+
outline: 'ed-bg-transparent ed-border-2 ed-border-current ed-text-gray-600',
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
const BADGE_SIZES = {
|
|
19
|
+
xs: 'ed-text-[10px] ed-min-w-[14px] ed-h-[14px] ed-px-1',
|
|
20
|
+
sm: 'ed-text-xs ed-min-w-[18px] ed-h-[18px] ed-px-1.5',
|
|
21
|
+
md: 'ed-text-xs ed-min-w-[20px] ed-h-[20px] ed-px-2',
|
|
22
|
+
lg: 'ed-text-sm ed-min-w-[24px] ed-h-[24px] ed-px-2.5',
|
|
23
|
+
xl: 'ed-text-base ed-min-w-[28px] ed-h-[28px] ed-px-3',
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const DOT_SIZES = {
|
|
27
|
+
xs: 'ed-w-1.5 ed-h-1.5',
|
|
28
|
+
sm: 'ed-w-2 ed-h-2',
|
|
29
|
+
md: 'ed-w-2.5 ed-h-2.5',
|
|
30
|
+
lg: 'ed-w-3 ed-h-3',
|
|
31
|
+
xl: 'ed-w-3.5 ed-h-3.5',
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
const POSITION_CLASSES = {
|
|
35
|
+
'top-right': 'ed-top-0 ed-right-0 ed--translate-y-1/2 ed-translate-x-1/2',
|
|
36
|
+
'top-left': 'ed-top-0 ed-left-0 ed--translate-y-1/2 ed--translate-x-1/2',
|
|
37
|
+
'bottom-right': 'ed-bottom-0 ed-right-0 ed-translate-y-1/2 ed-translate-x-1/2',
|
|
38
|
+
'bottom-left': 'ed-bottom-0 ed-left-0 ed-translate-y-1/2 ed--translate-x-1/2',
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
function Badge(props) {
|
|
42
|
+
const {
|
|
43
|
+
children,
|
|
44
|
+
count,
|
|
45
|
+
overflowCount = 99,
|
|
46
|
+
dot = false,
|
|
47
|
+
variant = 'danger',
|
|
48
|
+
color,
|
|
49
|
+
size = 'md',
|
|
50
|
+
position = 'top-right',
|
|
51
|
+
offset,
|
|
52
|
+
className = '',
|
|
53
|
+
style = {},
|
|
54
|
+
showZero = false,
|
|
55
|
+
hidden = false,
|
|
56
|
+
standalone = false,
|
|
57
|
+
maxNumber,
|
|
58
|
+
processing = false,
|
|
59
|
+
title,
|
|
60
|
+
onClick,
|
|
61
|
+
} = props;
|
|
62
|
+
|
|
63
|
+
if (hidden) return children || null;
|
|
64
|
+
|
|
65
|
+
const overflow = maxNumber || overflowCount;
|
|
66
|
+
const displayCount = typeof count === 'number' && count > overflow ? `${overflow}+` : count;
|
|
67
|
+
const shouldShow = dot || count > 0 || (count === 0 && showZero) || count === undefined;
|
|
68
|
+
|
|
69
|
+
if (!shouldShow && !standalone) return children || null;
|
|
70
|
+
|
|
71
|
+
const variantClass = color
|
|
72
|
+
? ''
|
|
73
|
+
: BADGE_VARIANTS[variant] || BADGE_VARIANTS.danger;
|
|
74
|
+
|
|
75
|
+
const sizeClass = dot
|
|
76
|
+
? DOT_SIZES[size] || DOT_SIZES.md
|
|
77
|
+
: BADGE_SIZES[size] || BADGE_SIZES.md;
|
|
78
|
+
|
|
79
|
+
const positionClass = children
|
|
80
|
+
? POSITION_CLASSES[position] || POSITION_CLASSES['top-right']
|
|
81
|
+
: '';
|
|
82
|
+
|
|
83
|
+
const badgeClasses = [
|
|
84
|
+
'ed-inline-flex ed-items-center ed-justify-center ed-rounded-full ed-font-medium ed-whitespace-nowrap',
|
|
85
|
+
dot ? '' : 'ed-leading-none',
|
|
86
|
+
variantClass,
|
|
87
|
+
sizeClass,
|
|
88
|
+
children ? 'ed-absolute' : '',
|
|
89
|
+
positionClass,
|
|
90
|
+
processing ? 'ed-animate-pulse' : '',
|
|
91
|
+
onClick ? 'ed-cursor-pointer' : '',
|
|
92
|
+
'ed-badge',
|
|
93
|
+
className,
|
|
94
|
+
].filter(Boolean).join(' ');
|
|
95
|
+
|
|
96
|
+
const badgeStyle = {
|
|
97
|
+
...(color ? { backgroundColor: color, color: '#fff' } : {}),
|
|
98
|
+
...(offset ? { marginTop: offset[1], marginRight: offset[0] } : {}),
|
|
99
|
+
...style,
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
const badgeContent = dot
|
|
103
|
+
? null
|
|
104
|
+
: displayCount !== undefined
|
|
105
|
+
? String(displayCount)
|
|
106
|
+
: null;
|
|
107
|
+
|
|
108
|
+
const badgeElement = shouldShow
|
|
109
|
+
? ED.createElement('span', {
|
|
110
|
+
className: badgeClasses,
|
|
111
|
+
style: badgeStyle,
|
|
112
|
+
title: title || (typeof count === 'number' ? String(count) : undefined),
|
|
113
|
+
onClick,
|
|
114
|
+
children: badgeContent,
|
|
115
|
+
})
|
|
116
|
+
: null;
|
|
117
|
+
|
|
118
|
+
if (standalone) {
|
|
119
|
+
return badgeElement;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if (!children) {
|
|
123
|
+
return badgeElement;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return ED.createElement('span', {
|
|
127
|
+
className: 'ed-relative ed-inline-flex ed-align-top',
|
|
128
|
+
children: [children, badgeElement],
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
Badge.displayName = 'Badge';
|
|
133
|
+
Badge.VARIANTS = BADGE_VARIANTS;
|
|
134
|
+
Badge.SIZES = BADGE_SIZES;
|
|
135
|
+
|
|
136
|
+
module.exports = Badge;
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Breadcrumb Component for ElementDrawing Framework
|
|
3
|
+
* Supports separator customization, max items, dropdown overflow, icon items, active state
|
|
4
|
+
*/
|
|
5
|
+
const ED = require('../core/element');
|
|
6
|
+
|
|
7
|
+
function BreadcrumbItem(props) {
|
|
8
|
+
const {
|
|
9
|
+
children,
|
|
10
|
+
href,
|
|
11
|
+
onClick,
|
|
12
|
+
icon,
|
|
13
|
+
active = false,
|
|
14
|
+
className = '',
|
|
15
|
+
style = {},
|
|
16
|
+
separator,
|
|
17
|
+
dropdownItems = [],
|
|
18
|
+
onDropdownClick,
|
|
19
|
+
} = props;
|
|
20
|
+
|
|
21
|
+
const itemClasses = [
|
|
22
|
+
'ed-inline-flex ed-items-center ed-text-sm',
|
|
23
|
+
active
|
|
24
|
+
? 'ed-text-gray-500 ed-font-medium ed-cursor-default'
|
|
25
|
+
: 'ed-text-gray-700 hover:ed-text-blue-600 ed-cursor-pointer',
|
|
26
|
+
'ed-transition-colors ed-duration-200',
|
|
27
|
+
className,
|
|
28
|
+
].filter(Boolean).join(' ');
|
|
29
|
+
|
|
30
|
+
const iconElement = icon
|
|
31
|
+
? ED.createElement('span', {
|
|
32
|
+
className: 'ed-mr-1.5 ed-flex ed-items-center ed-justify-center ed-w-4 ed-h-4',
|
|
33
|
+
children: typeof icon === 'string' ? ED.createElement('i', { className: icon }) : icon,
|
|
34
|
+
})
|
|
35
|
+
: null;
|
|
36
|
+
|
|
37
|
+
const dropdownElement = dropdownItems.length > 0
|
|
38
|
+
? ED.createElement('div', { className: 'ed-relative ed-group ed-inline-flex' }, [
|
|
39
|
+
ED.createElement('span', { className: 'ed-flex ed-items-center ed-gap-1', key: 'trigger' }, [
|
|
40
|
+
iconElement,
|
|
41
|
+
ED.createElement('span', null, children),
|
|
42
|
+
ED.createElement('svg', {
|
|
43
|
+
key: 'arrow',
|
|
44
|
+
className: 'ed-w-3 ed-h-3 ed-text-gray-400',
|
|
45
|
+
fill: 'none', viewBox: '0 0 24 24', stroke: 'currentColor',
|
|
46
|
+
children: ED.createElement('path', { strokeLinecap: 'round', strokeLinejoin: 'round', strokeWidth: 2, d: 'M19 9l-7 7-7-7' }),
|
|
47
|
+
}),
|
|
48
|
+
]),
|
|
49
|
+
ED.createElement('div', {
|
|
50
|
+
key: 'dropdown',
|
|
51
|
+
className: 'ed-absolute ed-left-0 ed-top-full ed-mt-1 ed-w-40 ed-bg-white ed-rounded-md ed-shadow-lg ed-border ed-border-gray-200 ed-opacity-0 ed-invisible group-hover:ed-opacity-100 group-hover:ed-visible ed-transition-all ed-duration-200 ed-z-50',
|
|
52
|
+
children: dropdownItems.map((item, idx) =>
|
|
53
|
+
ED.createElement('a', {
|
|
54
|
+
key: idx,
|
|
55
|
+
href: item.href || '#',
|
|
56
|
+
className: 'ed-block ed-px-3 ed-py-2 ed-text-sm ed-text-gray-700 hover:ed-bg-gray-50 ed-transition-colors',
|
|
57
|
+
onClick: (e) => { e.preventDefault(); onDropdownClick?.(item); },
|
|
58
|
+
children: [
|
|
59
|
+
item.icon ? ED.createElement('i', { className: `ed-mr-2 ${item.icon}`, key: 'icon' }) : null,
|
|
60
|
+
item.label || item.title,
|
|
61
|
+
].filter(Boolean),
|
|
62
|
+
})
|
|
63
|
+
),
|
|
64
|
+
}),
|
|
65
|
+
])
|
|
66
|
+
: null;
|
|
67
|
+
|
|
68
|
+
if (active) {
|
|
69
|
+
return ED.createElement('span', {
|
|
70
|
+
className: itemClasses,
|
|
71
|
+
style,
|
|
72
|
+
'aria-current': 'page',
|
|
73
|
+
children: [iconElement, ED.createElement('span', null, children)],
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (dropdownElement) {
|
|
78
|
+
return ED.createElement('span', { className: itemClasses, style, children: dropdownElement });
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
if (href) {
|
|
82
|
+
return ED.createElement('a', {
|
|
83
|
+
href,
|
|
84
|
+
className: itemClasses,
|
|
85
|
+
style,
|
|
86
|
+
onClick,
|
|
87
|
+
children: [iconElement, ED.createElement('span', null, children)],
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return ED.createElement('span', {
|
|
92
|
+
className: itemClasses,
|
|
93
|
+
style,
|
|
94
|
+
onClick,
|
|
95
|
+
children: [iconElement, ED.createElement('span', null, children)],
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
BreadcrumbItem.displayName = 'BreadcrumbItem';
|
|
100
|
+
|
|
101
|
+
function Breadcrumb(props) {
|
|
102
|
+
const {
|
|
103
|
+
children,
|
|
104
|
+
items = [],
|
|
105
|
+
separator = '/',
|
|
106
|
+
separatorIcon,
|
|
107
|
+
maxItems,
|
|
108
|
+
className = '',
|
|
109
|
+
style = {},
|
|
110
|
+
renderItem,
|
|
111
|
+
} = props;
|
|
112
|
+
|
|
113
|
+
const separatorElement = separatorIcon
|
|
114
|
+
? ED.createElement('span', {
|
|
115
|
+
className: 'ed-mx-2 ed-text-gray-400 ed-flex ed-items-center',
|
|
116
|
+
children: typeof separatorIcon === 'string'
|
|
117
|
+
? ED.createElement('i', { className: separatorIcon })
|
|
118
|
+
: separatorIcon,
|
|
119
|
+
})
|
|
120
|
+
: ED.createElement('span', {
|
|
121
|
+
className: 'ed-mx-2 ed-text-gray-400 ed-select-none',
|
|
122
|
+
}, separator);
|
|
123
|
+
|
|
124
|
+
const breadcrumbItems = items.length > 0
|
|
125
|
+
? items.map((item, idx) => {
|
|
126
|
+
const isLast = idx === items.length - 1;
|
|
127
|
+
return {
|
|
128
|
+
...item,
|
|
129
|
+
active: isLast,
|
|
130
|
+
key: item.key || idx,
|
|
131
|
+
};
|
|
132
|
+
})
|
|
133
|
+
: (Array.isArray(children) ? children : [children]).map((child, idx) => child);
|
|
134
|
+
|
|
135
|
+
const allItems = breadcrumbItems;
|
|
136
|
+
|
|
137
|
+
let displayItems = allItems;
|
|
138
|
+
let overflowItems = [];
|
|
139
|
+
|
|
140
|
+
if (maxItems && allItems.length > maxItems) {
|
|
141
|
+
const start = allItems.slice(0, 1);
|
|
142
|
+
const end = allItems.slice(-(maxItems - 1));
|
|
143
|
+
overflowItems = allItems.slice(1, -(maxItems - 1));
|
|
144
|
+
displayItems = [
|
|
145
|
+
start[0],
|
|
146
|
+
{ key: 'overflow', label: '...', dropdownItems: overflowItems, isOverflow: true },
|
|
147
|
+
...end,
|
|
148
|
+
];
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const renderBreadcrumbItem = (item, idx) => {
|
|
152
|
+
if (item && item.isOverflow) {
|
|
153
|
+
return ED.createElement(BreadcrumbItem, {
|
|
154
|
+
key: 'overflow',
|
|
155
|
+
dropdownItems: overflowItems,
|
|
156
|
+
children: '...',
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if (items.length > 0) {
|
|
161
|
+
const renderedItem = renderItem
|
|
162
|
+
? renderItem(item, idx)
|
|
163
|
+
: ED.createElement(BreadcrumbItem, {
|
|
164
|
+
key: item.key || idx,
|
|
165
|
+
href: item.href,
|
|
166
|
+
onClick: item.onClick,
|
|
167
|
+
icon: item.icon,
|
|
168
|
+
active: item.active,
|
|
169
|
+
children: item.label || item.title,
|
|
170
|
+
});
|
|
171
|
+
return renderedItem;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
return item;
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
const breadcrumbElements = displayItems.map((item, idx) => {
|
|
178
|
+
const rendered = renderBreadcrumbItem(item, idx);
|
|
179
|
+
const isLast = idx === displayItems.length - 1;
|
|
180
|
+
return ED.createElement(ED.Fragment, { key: idx },
|
|
181
|
+
rendered,
|
|
182
|
+
!isLast ? separatorElement : null,
|
|
183
|
+
);
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
return ED.createElement('nav', {
|
|
187
|
+
'aria-label': 'Breadcrumb',
|
|
188
|
+
className: `ed-flex ed-items-center ed-flex-wrap ed-py-2 ${className}`,
|
|
189
|
+
style,
|
|
190
|
+
children: ED.createElement('ol', {
|
|
191
|
+
className: 'ed-flex ed-items-center ed-gap-0 ed-list-none ed-m-0 ed-p-0',
|
|
192
|
+
children: breadcrumbElements,
|
|
193
|
+
}),
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
Breadcrumb.displayName = 'Breadcrumb';
|
|
198
|
+
Breadcrumb.Item = BreadcrumbItem;
|
|
199
|
+
|
|
200
|
+
module.exports = Breadcrumb;
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Button Component for ElementDrawing Framework
|
|
3
|
+
* Supports variants, sizes, loading, icons, disabled, ripple, full-width
|
|
4
|
+
*/
|
|
5
|
+
const ED = require('../core/element');
|
|
6
|
+
|
|
7
|
+
const BUTTON_VARIANTS = {
|
|
8
|
+
primary: 'ed-bg-blue-600 ed-text-white hover:ed-bg-blue-700 focus:ed-ring-blue-500 active:ed-bg-blue-800',
|
|
9
|
+
secondary: 'ed-bg-gray-200 ed-text-gray-800 hover:ed-bg-gray-300 focus:ed-ring-gray-400 active:ed-bg-gray-400',
|
|
10
|
+
success: 'ed-bg-green-600 ed-text-white hover:ed-bg-green-700 focus:ed-ring-green-500 active:ed-bg-green-800',
|
|
11
|
+
warning: 'ed-bg-yellow-500 ed-text-white hover:ed-bg-yellow-600 focus:ed-ring-yellow-400 active:ed-bg-yellow-700',
|
|
12
|
+
danger: 'ed-bg-red-600 ed-text-white hover:ed-bg-red-700 focus:ed-ring-red-500 active:ed-bg-red-800',
|
|
13
|
+
ghost: 'ed-bg-transparent ed-text-gray-700 hover:ed-bg-gray-100 focus:ed-ring-gray-300 active:ed-bg-gray-200',
|
|
14
|
+
link: 'ed-bg-transparent ed-text-blue-600 hover:ed-text-blue-800 hover:ed-underline focus:ed-ring-blue-300 ed-p-0 ed-shadow-none',
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
const BUTTON_SIZES = {
|
|
18
|
+
xs: 'ed-text-xs ed-px-2 ed-py-1 ed-rounded',
|
|
19
|
+
sm: 'ed-text-sm ed-px-3 ed-py-1.5 ed-rounded-md',
|
|
20
|
+
md: 'ed-text-sm ed-px-4 ed-py-2 ed-rounded-md',
|
|
21
|
+
lg: 'ed-text-base ed-px-5 ed-py-2.5 ed-rounded-lg',
|
|
22
|
+
xl: 'ed-text-lg ed-px-6 ed-py-3 ed-rounded-lg',
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
const ICON_SIZES = {
|
|
26
|
+
xs: 'ed-w-3 ed-h-3',
|
|
27
|
+
sm: 'ed-w-4 ed-h-4',
|
|
28
|
+
md: 'ed-w-4 ed-h-4',
|
|
29
|
+
lg: 'ed-w-5 ed-h-5',
|
|
30
|
+
xl: 'ed-w-6 ed-h-6',
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
function Button(props) {
|
|
34
|
+
const {
|
|
35
|
+
children,
|
|
36
|
+
variant = 'primary',
|
|
37
|
+
size = 'md',
|
|
38
|
+
loading = false,
|
|
39
|
+
loadingText = '',
|
|
40
|
+
icon,
|
|
41
|
+
iconRight,
|
|
42
|
+
disabled = false,
|
|
43
|
+
ripple = true,
|
|
44
|
+
fullWidth = false,
|
|
45
|
+
type = 'button',
|
|
46
|
+
htmlType = 'button',
|
|
47
|
+
className = '',
|
|
48
|
+
style = {},
|
|
49
|
+
onClick,
|
|
50
|
+
onMouseEnter,
|
|
51
|
+
onMouseLeave,
|
|
52
|
+
onFocus,
|
|
53
|
+
onBlur,
|
|
54
|
+
id,
|
|
55
|
+
name,
|
|
56
|
+
value,
|
|
57
|
+
autoFocus = false,
|
|
58
|
+
tabIndex,
|
|
59
|
+
ariaLabel,
|
|
60
|
+
ariaDisabled,
|
|
61
|
+
role,
|
|
62
|
+
round = false,
|
|
63
|
+
block = false,
|
|
64
|
+
danger: isDanger = false,
|
|
65
|
+
href,
|
|
66
|
+
target,
|
|
67
|
+
shape,
|
|
68
|
+
} = props;
|
|
69
|
+
|
|
70
|
+
const isDisabled = disabled || loading;
|
|
71
|
+
const variantClass = BUTTON_VARIANTS[variant] || BUTTON_VARIANTS.primary;
|
|
72
|
+
const sizeClass = BUTTON_SIZES[size] || BUTTON_SIZES.md;
|
|
73
|
+
const iconSizeClass = ICON_SIZES[size] || ICON_SIZES.md;
|
|
74
|
+
|
|
75
|
+
const baseClasses = [
|
|
76
|
+
'ed-inline-flex ed-items-center ed-justify-center ed-font-medium',
|
|
77
|
+
'ed-transition-all ed-duration-200 ed-ease-in-out',
|
|
78
|
+
'ed-select-none ed-whitespace-nowrap ed-relative ed-overflow-hidden',
|
|
79
|
+
'focus:ed-outline-none focus:ed-ring-2 focus:ed-ring-offset-2',
|
|
80
|
+
variantClass,
|
|
81
|
+
sizeClass,
|
|
82
|
+
round ? 'ed-rounded-full' : '',
|
|
83
|
+
fullWidth || block ? 'ed-w-full' : '',
|
|
84
|
+
isDisabled ? 'ed-opacity-60 ed-cursor-not-allowed ed-pointer-events-none' : 'ed-cursor-pointer',
|
|
85
|
+
isDanger && variant === 'primary' ? 'ed-bg-red-600 hover:ed-bg-red-700 focus:ed-ring-red-500' : '',
|
|
86
|
+
className,
|
|
87
|
+
].filter(Boolean).join(' ');
|
|
88
|
+
|
|
89
|
+
const spinnerElement = loading
|
|
90
|
+
? ED.createElement('svg', {
|
|
91
|
+
className: `ed-animate-spin ${iconSizeClass} ${children || loadingText ? 'ed--ml-1 ed-mr-2' : ''}`,
|
|
92
|
+
xmlns: 'http://www.w3.org/2000/svg',
|
|
93
|
+
fill: 'none',
|
|
94
|
+
viewBox: '0 0 24 24',
|
|
95
|
+
children: [
|
|
96
|
+
ED.createElement('circle', {
|
|
97
|
+
key: 'spin-bg',
|
|
98
|
+
className: 'ed-opacity-25',
|
|
99
|
+
cx: '12', cy: '12', r: '10',
|
|
100
|
+
stroke: 'currentColor', strokeWidth: '4',
|
|
101
|
+
}),
|
|
102
|
+
ED.createElement('path', {
|
|
103
|
+
key: 'spin-fg',
|
|
104
|
+
className: 'ed-opacity-75',
|
|
105
|
+
fill: 'currentColor',
|
|
106
|
+
d: 'M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z',
|
|
107
|
+
}),
|
|
108
|
+
],
|
|
109
|
+
})
|
|
110
|
+
: null;
|
|
111
|
+
|
|
112
|
+
const iconElement = icon && !loading
|
|
113
|
+
? ED.createElement('span', {
|
|
114
|
+
className: `ed-inline-flex ed-items-center ${iconSizeClass} ${children ? 'ed-mr-2' : ''}`,
|
|
115
|
+
children: typeof icon === 'string'
|
|
116
|
+
? ED.createElement('i', { className: icon })
|
|
117
|
+
: icon,
|
|
118
|
+
})
|
|
119
|
+
: null;
|
|
120
|
+
|
|
121
|
+
const iconRightElement = iconRight && !loading
|
|
122
|
+
? ED.createElement('span', {
|
|
123
|
+
className: `ed-inline-flex ed-items-center ${iconSizeClass} ${children ? 'ed-ml-2' : ''}`,
|
|
124
|
+
children: typeof iconRight === 'string'
|
|
125
|
+
? ED.createElement('i', { className: iconRight })
|
|
126
|
+
: iconRight,
|
|
127
|
+
})
|
|
128
|
+
: null;
|
|
129
|
+
|
|
130
|
+
const rippleContainer = ripple && !isDisabled
|
|
131
|
+
? ED.createElement('span', {
|
|
132
|
+
className: 'ed-absolute ed-inset-0 ed-overflow-hidden ed-rounded-inherit ed-pointer-events-none',
|
|
133
|
+
'data-ripple': 'true',
|
|
134
|
+
})
|
|
135
|
+
: null;
|
|
136
|
+
|
|
137
|
+
const contentElement = loading && loadingText
|
|
138
|
+
? ED.createElement('span', { className: 'ed-truncate' }, loadingText)
|
|
139
|
+
: children
|
|
140
|
+
? ED.createElement('span', { className: 'ed-truncate' }, children)
|
|
141
|
+
: null;
|
|
142
|
+
|
|
143
|
+
const buttonChildren = [
|
|
144
|
+
spinnerElement,
|
|
145
|
+
iconElement,
|
|
146
|
+
contentElement,
|
|
147
|
+
iconRightElement,
|
|
148
|
+
rippleContainer,
|
|
149
|
+
].filter(Boolean);
|
|
150
|
+
|
|
151
|
+
const buttonProps = {
|
|
152
|
+
id,
|
|
153
|
+
name,
|
|
154
|
+
value,
|
|
155
|
+
type: htmlType || type,
|
|
156
|
+
className: baseClasses,
|
|
157
|
+
style,
|
|
158
|
+
disabled: isDisabled,
|
|
159
|
+
autoFocus,
|
|
160
|
+
tabIndex: tabIndex ?? (isDisabled ? -1 : undefined),
|
|
161
|
+
'aria-label': ariaLabel,
|
|
162
|
+
'aria-disabled': ariaDisabled ?? isDisabled,
|
|
163
|
+
role: role || 'button',
|
|
164
|
+
onClick: isDisabled ? undefined : onClick,
|
|
165
|
+
onMouseEnter,
|
|
166
|
+
onMouseLeave,
|
|
167
|
+
onFocus,
|
|
168
|
+
onBlur,
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
if (href && !isDisabled) {
|
|
172
|
+
return ED.createElement('a', {
|
|
173
|
+
...buttonProps,
|
|
174
|
+
href,
|
|
175
|
+
target,
|
|
176
|
+
rel: target === '_blank' ? 'noopener noreferrer' : undefined,
|
|
177
|
+
children: buttonChildren,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
return ED.createElement('button', { ...buttonProps, children: buttonChildren });
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
Button.displayName = 'Button';
|
|
185
|
+
Button.VARIANTS = BUTTON_VARIANTS;
|
|
186
|
+
Button.SIZES = BUTTON_SIZES;
|
|
187
|
+
|
|
188
|
+
module.exports = Button;
|