tc-dazzle-ui 1.10.13 → 1.11.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +118 -54
- package/dist/components/Atoms/Button/Button.d.ts +3 -13
- package/dist/components/Atoms/Button/index.d.ts +2 -2
- package/dist/components/Atoms/ButtonGroup/ButtonGroup.d.ts +20 -0
- package/dist/components/Atoms/ButtonGroup/index.d.ts +2 -0
- package/dist/components/Atoms/IconButton/IconButton.d.ts +5 -1
- package/dist/components/Atoms/IconButton/index.d.ts +1 -1
- package/dist/components/Atoms/index.d.ts +5 -3
- package/dist/components/Foundation/ColorPalette/ColorPalette.d.ts +16 -0
- package/dist/components/Foundation/ColorPalette/index.d.ts +2 -0
- package/dist/components/Foundation/index.d.ts +2 -0
- package/dist/components/Organisms/PageHeader/PageHeader.d.ts +1 -1
- package/dist/components/Organisms/RightPanel/RightPanel.d.ts +14 -0
- package/dist/components/Organisms/RightPanel/index.d.ts +2 -0
- package/dist/components/Organisms/index.d.ts +2 -0
- package/dist/index.esm.js +25 -44
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +24 -45
- package/dist/index.js.map +1 -1
- package/dist/index.umd.js +28 -43
- package/dist/index.umd.js.map +1 -1
- package/dist/lib/browser.d.ts +2 -2
- package/dist/lib/index.d.ts +3 -3
- package/dist/lib/web-components.d.ts +1 -2
- package/dist/styles.css +1 -1
- package/dist/web-components.css +1 -1
- package/dist/web-components.umd.js +11 -35
- package/dist/web-components.umd.js.map +1 -1
- package/package.json +86 -86
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
React components and Web Components for the TeamConnect Design System.
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/tc-dazzle-ui)
|
|
6
|
-
[](https://github.com/
|
|
6
|
+
[](https://github.com/itsfinnynj/tc-dazzle-ui/blob/main/LICENSE)
|
|
7
7
|
|
|
8
8
|
## 📦 Installation
|
|
9
9
|
|
|
@@ -16,16 +16,38 @@ npm install tc-dazzle-ui
|
|
|
16
16
|
### React Components
|
|
17
17
|
|
|
18
18
|
```tsx
|
|
19
|
-
import {
|
|
19
|
+
import {
|
|
20
|
+
Button,
|
|
21
|
+
Input,
|
|
22
|
+
MainHeader,
|
|
23
|
+
GlobalHeader,
|
|
24
|
+
Sidebar,
|
|
25
|
+
PageHeader,
|
|
26
|
+
Footer,
|
|
27
|
+
Layout
|
|
28
|
+
} from 'tc-dazzle-ui';
|
|
20
29
|
import 'tc-dazzle-ui/dist/styles.css';
|
|
21
30
|
|
|
22
31
|
function App() {
|
|
23
32
|
return (
|
|
24
|
-
<
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
33
|
+
<Layout
|
|
34
|
+
header={
|
|
35
|
+
<>
|
|
36
|
+
<MainHeader onLogoClick={() => {}} />
|
|
37
|
+
<GlobalHeader tabs={[{ id: 'home', label: 'Home' }]} activeTabId="home" />
|
|
38
|
+
</>
|
|
39
|
+
}
|
|
40
|
+
sidebar={
|
|
41
|
+
<Sidebar
|
|
42
|
+
sections={[
|
|
43
|
+
{ id: 'section1', title: 'Section 1', items: [{ id: 'item1', label: 'Item 1' }] }
|
|
44
|
+
]}
|
|
45
|
+
activeItemId="item1"
|
|
46
|
+
onItemClick={(item) => console.log(item)}
|
|
47
|
+
/>
|
|
48
|
+
}
|
|
49
|
+
main={<div>Your content here</div>}
|
|
50
|
+
/>
|
|
29
51
|
);
|
|
30
52
|
}
|
|
31
53
|
```
|
|
@@ -111,17 +133,30 @@ npm test
|
|
|
111
133
|
|
|
112
134
|
```
|
|
113
135
|
src/
|
|
114
|
-
├── components/
|
|
115
|
-
│ ├──
|
|
116
|
-
│ ├──
|
|
117
|
-
│ ├──
|
|
118
|
-
│ ├──
|
|
119
|
-
│ ├──
|
|
120
|
-
│
|
|
121
|
-
├──
|
|
122
|
-
├──
|
|
123
|
-
|
|
124
|
-
|
|
136
|
+
├── components/
|
|
137
|
+
│ ├── Atoms/ # Basic UI elements
|
|
138
|
+
│ │ ├── Button/ # Button, ButtonGroup
|
|
139
|
+
│ │ ├── Input/ # Input fields
|
|
140
|
+
│ │ ├── Icons/ # Icon components
|
|
141
|
+
│ │ ├── Logo/ # Logo component
|
|
142
|
+
│ │ ├── IconButton/ # Icon buttons
|
|
143
|
+
│ │ ├── FilterDropdown/
|
|
144
|
+
│ │ ├── GlobalSearch/
|
|
145
|
+
│ │ └── Tab/
|
|
146
|
+
│ ├── Molecules/ # Composite components
|
|
147
|
+
│ │ ├── DropdownMenu/
|
|
148
|
+
│ │ ├── HeaderMenu/
|
|
149
|
+
│ │ └── Search/
|
|
150
|
+
│ ├── Organisms/ # Complex components
|
|
151
|
+
│ │ ├── MainHeader/ # Main application header
|
|
152
|
+
│ │ ├── GlobalHeader/# Secondary header with tabs
|
|
153
|
+
│ │ ├── Sidebar/ # Resizable navigation sidebar
|
|
154
|
+
│ │ ├── PageHeader/ # Page title and actions
|
|
155
|
+
│ │ └── Footer/ # Footer with Mitratech logo
|
|
156
|
+
│ └── Templates/
|
|
157
|
+
│ └── Layout/ # Main layout wrapper
|
|
158
|
+
├── styles/ # Global styles and CSS variables
|
|
159
|
+
└── lib/ # Library exports
|
|
125
160
|
```
|
|
126
161
|
|
|
127
162
|
## � Web Components
|
|
@@ -172,37 +207,66 @@ After building the project, include the bundle in your HTML:
|
|
|
172
207
|
|
|
173
208
|
After running `npm start`, visit `/web-components-demo.html` to see the web components in action.
|
|
174
209
|
|
|
175
|
-
##
|
|
176
|
-
|
|
177
|
-
###
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
210
|
+
## 🎯 Components
|
|
211
|
+
|
|
212
|
+
### Atoms
|
|
213
|
+
|
|
214
|
+
| Component | Description |
|
|
215
|
+
|-----------|-------------|
|
|
216
|
+
| `Button` | Primary, secondary, text variants with icon support |
|
|
217
|
+
| `ButtonGroup` | Button with dropdown menu |
|
|
218
|
+
| `Input` | Text input with various states |
|
|
219
|
+
| `IconButton` | Icon-only buttons |
|
|
220
|
+
| `FilterDropdown` | Dropdown filter component |
|
|
221
|
+
| `GlobalSearch` | Search with suggestions |
|
|
222
|
+
| `Logo` | TeamConnect logo |
|
|
223
|
+
| `Tab` | Tab navigation item |
|
|
224
|
+
| `Icons` | InfoIcon, SearchIcon, ChevronDownIcon, etc. |
|
|
225
|
+
|
|
226
|
+
### Molecules
|
|
227
|
+
|
|
228
|
+
| Component | Description |
|
|
229
|
+
|-----------|-------------|
|
|
230
|
+
| `DropdownMenu` | Dropdown menu with items |
|
|
231
|
+
| `HeaderMenu` | Header navigation menu |
|
|
232
|
+
| `Search` | Search input with filter |
|
|
233
|
+
|
|
234
|
+
### Organisms
|
|
235
|
+
|
|
236
|
+
| Component | Description |
|
|
237
|
+
|-----------|-------------|
|
|
238
|
+
| `MainHeader` | Main application header with logo, search, and navigation |
|
|
239
|
+
| `GlobalHeader` | Secondary header with tabs and properties button |
|
|
240
|
+
| `Sidebar` | Resizable navigation sidebar with collapsible sections |
|
|
241
|
+
| `PageHeader` | Page title with breadcrumbs and action buttons |
|
|
242
|
+
| `Footer` | Footer with copyright, links, and Mitratech logo |
|
|
243
|
+
|
|
244
|
+
### Templates
|
|
245
|
+
|
|
246
|
+
| Component | Description |
|
|
247
|
+
|-----------|-------------|
|
|
248
|
+
| `Layout` | Main layout wrapper with header, sidebar, content, and optional right panel |
|
|
249
|
+
|
|
250
|
+
### Footer Component
|
|
251
|
+
|
|
252
|
+
```tsx
|
|
253
|
+
import { Footer } from 'tc-dazzle-ui';
|
|
254
|
+
|
|
255
|
+
<Footer
|
|
256
|
+
copyrightText="Copyright © 2024 Mitratech Holdings, Inc. All Rights Reserved."
|
|
257
|
+
links={[
|
|
258
|
+
{ id: 'terms', label: 'Terms of Service', href: '/terms' },
|
|
259
|
+
{ id: 'privacy', label: 'Privacy Policy', href: '/privacy', variant: 'underline' },
|
|
260
|
+
]}
|
|
261
|
+
showLogo={true}
|
|
262
|
+
/>
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
**Footer Props:**
|
|
266
|
+
- `copyrightText` - Copyright text (default: "Copyright © 2024 Mitratech Holdings, Inc. All Rights Reserved.")
|
|
267
|
+
- `links` - Array of FooterLink objects with `id`, `label`, `href`/`onClick`, and `variant` ('default' | 'bordered' | 'underline')
|
|
268
|
+
- `showLogo` - Show Mitratech logo (default: true)
|
|
269
|
+
- `className` - Additional CSS classes
|
|
206
270
|
|
|
207
271
|
## 🎨 Design Tokens
|
|
208
272
|
|
|
@@ -211,12 +275,12 @@ The design system uses CSS custom properties for consistent theming:
|
|
|
211
275
|
```css
|
|
212
276
|
:root {
|
|
213
277
|
--primary-dark: #001a35;
|
|
214
|
-
--
|
|
278
|
+
--primary-main: #0067d2;
|
|
279
|
+
--text-primary: #212121;
|
|
215
280
|
--text-secondary: #47535f;
|
|
216
|
-
--border-primary: #
|
|
281
|
+
--border-primary: #e2e2e2;
|
|
217
282
|
--background-light: #f9fafc;
|
|
218
|
-
--font-family: '
|
|
219
|
-
/* ... and more */
|
|
283
|
+
--font-family: 'Poppins', sans-serif;
|
|
220
284
|
}
|
|
221
285
|
```
|
|
222
286
|
|
|
@@ -260,7 +324,7 @@ The layout is responsive and works across different screen sizes. The sidebar an
|
|
|
260
324
|
|
|
261
325
|
## 📄 License
|
|
262
326
|
|
|
263
|
-
Copyright 1999-
|
|
327
|
+
Copyright 1999-2025 Mitratech Holdings, Inc. All Rights Reserved.
|
|
264
328
|
|
|
265
329
|
## 🤝 Contributing
|
|
266
330
|
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import './Button.css';
|
|
3
|
-
export type ButtonVariant = 'primary' | 'secondary' | '
|
|
4
|
-
export type
|
|
3
|
+
export type ButtonVariant = 'primary' | 'secondary' | 'tertiary';
|
|
4
|
+
export type ButtonColor = 'primary' | 'error' | 'warning' | 'info' | 'success' | 'inherit';
|
|
5
5
|
export interface ButtonProps {
|
|
6
6
|
label?: string;
|
|
7
7
|
variant?: ButtonVariant;
|
|
8
|
+
color?: ButtonColor;
|
|
8
9
|
disabled?: boolean;
|
|
9
10
|
showStartIcon?: boolean;
|
|
10
11
|
showEndIcon?: boolean;
|
|
@@ -14,16 +15,5 @@ export interface ButtonProps {
|
|
|
14
15
|
onClick?: () => void;
|
|
15
16
|
className?: string;
|
|
16
17
|
}
|
|
17
|
-
export interface ButtonGroupProps {
|
|
18
|
-
label?: string;
|
|
19
|
-
variant?: ButtonVariant;
|
|
20
|
-
disabled?: boolean;
|
|
21
|
-
showStartIcon?: boolean;
|
|
22
|
-
startIcon?: React.ReactNode;
|
|
23
|
-
onButtonClick?: () => void;
|
|
24
|
-
onDropdownClick?: () => void;
|
|
25
|
-
className?: string;
|
|
26
|
-
}
|
|
27
18
|
export declare const Button: React.FC<ButtonProps>;
|
|
28
|
-
export declare const ButtonGroup: React.FC<ButtonGroupProps>;
|
|
29
19
|
export default Button;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { Button
|
|
2
|
-
export type { ButtonProps,
|
|
1
|
+
export { Button } from './Button';
|
|
2
|
+
export type { ButtonProps, ButtonVariant, ButtonColor } from './Button';
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { ButtonVariant, ButtonColor } from '../Button';
|
|
3
|
+
import './ButtonGroup.css';
|
|
4
|
+
export type ButtonGroupVariant = ButtonVariant;
|
|
5
|
+
export type ButtonGroupColor = ButtonColor;
|
|
6
|
+
export interface ButtonGroupProps {
|
|
7
|
+
label?: string;
|
|
8
|
+
variant?: ButtonGroupVariant;
|
|
9
|
+
color?: ButtonGroupColor;
|
|
10
|
+
disabled?: boolean;
|
|
11
|
+
icon?: React.ReactNode;
|
|
12
|
+
startIcon?: React.ReactNode;
|
|
13
|
+
showStartIcon?: boolean;
|
|
14
|
+
onButtonClick?: () => void;
|
|
15
|
+
onIconClick?: () => void;
|
|
16
|
+
iconAriaLabel?: string;
|
|
17
|
+
className?: string;
|
|
18
|
+
}
|
|
19
|
+
export declare const ButtonGroup: React.FC<ButtonGroupProps>;
|
|
20
|
+
export default ButtonGroup;
|
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import './IconButton.css';
|
|
3
3
|
export type IconButtonSize = 'small' | 'medium' | 'large';
|
|
4
|
-
export type
|
|
4
|
+
export type IconButtonVariant = 'primary' | 'secondary' | 'tertiary';
|
|
5
|
+
export type IconButtonColor = 'primary' | 'error' | 'warning' | 'info' | 'success' | 'inherit';
|
|
5
6
|
export type IconButtonState = 'enabled' | 'hover' | 'disabled';
|
|
6
7
|
export interface IconButtonProps {
|
|
7
8
|
icon?: React.ReactNode;
|
|
8
9
|
size?: IconButtonSize;
|
|
10
|
+
variant?: IconButtonVariant;
|
|
9
11
|
color?: IconButtonColor;
|
|
10
12
|
disabled?: boolean;
|
|
13
|
+
showArrow?: boolean;
|
|
14
|
+
arrowIcon?: React.ReactNode;
|
|
11
15
|
onClick?: () => void;
|
|
12
16
|
ariaLabel?: string;
|
|
13
17
|
className?: string;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export { IconButton } from './IconButton';
|
|
2
|
-
export type { IconButtonProps, IconButtonSize, IconButtonColor, IconButtonState } from './IconButton';
|
|
2
|
+
export type { IconButtonProps, IconButtonSize, IconButtonVariant, IconButtonColor, IconButtonState } from './IconButton';
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
export { Button
|
|
2
|
-
export type { ButtonProps,
|
|
1
|
+
export { Button } from './Button';
|
|
2
|
+
export type { ButtonProps, ButtonVariant, ButtonColor } from './Button';
|
|
3
|
+
export { ButtonGroup } from './ButtonGroup';
|
|
4
|
+
export type { ButtonGroupProps, ButtonGroupVariant, ButtonGroupColor } from './ButtonGroup';
|
|
3
5
|
export { Input } from './Input';
|
|
4
6
|
export type { InputProps, InputType } from './Input';
|
|
5
7
|
export { FilterDropdown } from './FilterDropdown';
|
|
@@ -7,7 +9,7 @@ export type { FilterDropdownProps, FilterDropdownOption, FilterDropdownSize, Fil
|
|
|
7
9
|
export { GlobalSearch } from './GlobalSearch';
|
|
8
10
|
export type { GlobalSearchProps, GlobalSearchOption } from './GlobalSearch';
|
|
9
11
|
export { IconButton } from './IconButton';
|
|
10
|
-
export type { IconButtonProps, IconButtonSize, IconButtonColor, IconButtonState } from './IconButton';
|
|
12
|
+
export type { IconButtonProps, IconButtonSize, IconButtonVariant, IconButtonColor, IconButtonState } from './IconButton';
|
|
11
13
|
export { InfoIcon, SearchIcon, ChevronDownIcon, ChevronUpIcon, CaretDownIcon, CloseIcon, MenuIcon, CheckIcon, PlusIcon, MinusIcon, EditIcon, DeleteIcon, SettingsIcon, UserIcon, HomeIcon, ArrowLeftIcon, ArrowRightIcon, ArrowUpIcon, ArrowDownIcon, StarIcon, StarOutlineIcon, FilterIcon, SortIcon, RefreshIcon, DownloadIcon, UploadIcon, CopyIcon, CalendarIcon, ClockIcon, EmailIcon, PhoneIcon, LockIcon, UnlockIcon, EyeIcon, EyeOffIcon, NotificationIcon, WarningIcon, ErrorIcon, SuccessIcon, HelpIcon, LinkIcon, AttachmentIcon, FolderIcon, FileIcon, PrintIcon, ShareIcon, MoreVerticalIcon, MoreHorizontalIcon, ExpandIcon, CollapseIcon, FullscreenIcon, FullscreenExitIcon } from './Icons';
|
|
12
14
|
export type { IconProps, IconSize } from './Icons';
|
|
13
15
|
export { Logo } from './Logo';
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import './ColorPalette.css';
|
|
3
|
+
export interface ColorSwatch {
|
|
4
|
+
name: string;
|
|
5
|
+
hex: string;
|
|
6
|
+
}
|
|
7
|
+
export interface ColorSection {
|
|
8
|
+
title: string;
|
|
9
|
+
colors: ColorSwatch[];
|
|
10
|
+
}
|
|
11
|
+
export interface ColorPaletteProps {
|
|
12
|
+
sections: ColorSection[];
|
|
13
|
+
className?: string;
|
|
14
|
+
}
|
|
15
|
+
export declare const ColorPalette: React.FC<ColorPaletteProps>;
|
|
16
|
+
export default ColorPalette;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import './RightPanel.css';
|
|
3
|
+
export interface RightPanelProps {
|
|
4
|
+
onWidthChange?: (width: number) => void;
|
|
5
|
+
onToggle?: (isOpen: boolean) => void;
|
|
6
|
+
defaultWidth?: number;
|
|
7
|
+
minWidth?: number;
|
|
8
|
+
maxWidth?: number;
|
|
9
|
+
defaultOpen?: boolean;
|
|
10
|
+
className?: string;
|
|
11
|
+
children?: React.ReactNode;
|
|
12
|
+
}
|
|
13
|
+
export declare const RightPanel: React.FC<RightPanelProps>;
|
|
14
|
+
export default RightPanel;
|
|
@@ -8,3 +8,5 @@ export { PageHeader } from './PageHeader';
|
|
|
8
8
|
export type { PageHeaderProps, PageHeaderAction, PageHeaderBadge } from './PageHeader';
|
|
9
9
|
export { Footer } from './Footer';
|
|
10
10
|
export type { FooterProps, FooterLink } from './Footer';
|
|
11
|
+
export { RightPanel } from './RightPanel';
|
|
12
|
+
export type { RightPanelProps } from './RightPanel';
|
package/dist/index.esm.js
CHANGED
|
@@ -2,17 +2,26 @@ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
|
2
2
|
import o, { forwardRef, useState, useRef, useEffect, useCallback } from 'react';
|
|
3
3
|
import { createRoot } from 'react-dom/client';
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
5
|
+
const Button = ({ label = 'Button', variant = 'primary', color = 'primary', disabled = false, showStartIcon = false, showEndIcon = false, showLabel = true, startIcon, endIcon, onClick, className = '', }) => {
|
|
6
|
+
const buttonClass = [
|
|
7
|
+
'tc-button',
|
|
8
|
+
`tc-button--${variant}`,
|
|
9
|
+
`tc-button--color-${color}`,
|
|
10
|
+
className,
|
|
11
|
+
].filter(Boolean).join(' ').trim();
|
|
12
|
+
return (jsxs("button", { className: buttonClass, disabled: disabled, onClick: onClick, type: "button", children: [showStartIcon && startIcon && (jsx("span", { className: "tc-button__icon", children: startIcon })), showLabel && (jsx("span", { className: "tc-button__label", children: label })), showEndIcon && endIcon && (jsx("span", { className: "tc-button__icon", children: endIcon }))] }));
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
const IconButton = ({ icon, size = 'medium', variant = 'tertiary', color = 'primary', disabled = false, showArrow = false, arrowIcon, onClick, ariaLabel = 'Icon button', className = '', }) => {
|
|
16
|
+
const buttonClass = [
|
|
17
|
+
'tc-icon-button',
|
|
18
|
+
`tc-icon-button--${size}`,
|
|
19
|
+
`tc-icon-button--${variant}`,
|
|
20
|
+
`tc-icon-button--color-${color}`,
|
|
21
|
+
showArrow ? 'tc-icon-button--with-arrow' : '',
|
|
22
|
+
className,
|
|
23
|
+
].filter(Boolean).join(' ').trim();
|
|
24
|
+
return (jsxs("button", { type: "button", className: buttonClass, onClick: onClick, disabled: disabled, "aria-label": ariaLabel, children: [jsx("span", { className: "tc-icon-button__icon", children: icon }), showArrow && (jsx("span", { className: "tc-icon-button__arrow", children: arrowIcon || (jsx("svg", { viewBox: "0 0 10 6", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: jsx("path", { d: "M1 1L5 5L9 1", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", strokeLinejoin: "round" }) })) }))] }));
|
|
16
25
|
};
|
|
17
26
|
|
|
18
27
|
// Arrow Icon for Prefix/Suffix
|
|
@@ -135,7 +144,7 @@ const FilterDropdown = ({ value, defaultValue, options = [], placeholder = 'All'
|
|
|
135
144
|
};
|
|
136
145
|
|
|
137
146
|
// Search Icon SVG
|
|
138
|
-
const SearchIcon$
|
|
147
|
+
const SearchIcon$1 = ({ className }) => (jsx("svg", { className: className, viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: jsx("path", { d: "M15.5 14H14.71L14.43 13.73C15.41 12.59 16 11.11 16 9.5C16 5.91 13.09 3 9.5 3C5.91 3 3 5.91 3 9.5C3 13.09 5.91 16 9.5 16C11.11 16 12.59 15.41 13.73 14.43L14 14.71V15.5L19 20.49L20.49 19L15.5 14ZM9.5 14C7.01 14 5 11.99 5 9.5C5 7.01 7.01 5 9.5 5C11.99 5 14 7.01 14 9.5C14 11.99 11.99 14 9.5 14Z", fill: "currentColor" }) }));
|
|
139
148
|
// Chevron Down Icon SVG
|
|
140
149
|
const ChevronDownIcon$1 = ({ className }) => (jsx("svg", { className: className, viewBox: "0 0 10 5", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", children: jsx("path", { d: "M0 0L5 5L10 0H0Z" }) }));
|
|
141
150
|
const GlobalSearch = ({ placeholder = 'Search', filterPlaceholder = 'All', filterOptions = [], filterValue: controlledFilterValue, searchValue: controlledSearchValue, disabled = false, onSearch, onFilterChange, onSubmit, className = '', }) => {
|
|
@@ -206,23 +215,7 @@ const GlobalSearch = ({ placeholder = 'Search', filterPlaceholder = 'All', filte
|
|
|
206
215
|
classes.push(className);
|
|
207
216
|
return classes.join(' ');
|
|
208
217
|
};
|
|
209
|
-
return (jsxs("div", { className: getContainerClasses(), children: [jsxs("div", { ref: filterRef, className: `tc-global-search__filter ${isFilterOpen ? 'tc-global-search__filter--open' : ''}`, children: [jsxs("button", { type: "button", className: "tc-global-search__filter-trigger", onClick: handleFilterToggle, disabled: disabled, "aria-expanded": isFilterOpen, "aria-haspopup": "listbox", children: [jsx("span", { className: "tc-global-search__filter-label", children: getFilterLabel() }), jsx("div", { className: "tc-global-search__filter-icon", children: jsx(ChevronDownIcon$1, {}) })] }), isFilterOpen && filterOptions.length > 0 && (jsx("div", { className: "tc-global-search__filter-menu", role: "listbox", children: filterOptions.map((option) => (jsx("div", { className: `tc-global-search__filter-option ${filterValue === option.value ? 'tc-global-search__filter-option--selected' : ''}`, role: "option", "aria-selected": filterValue === option.value, onClick: () => handleFilterSelect(option.value), children: option.label }, option.value))) }))] }), jsx("div", { className: "tc-global-search__input-wrapper", children: jsx("input", { ref: inputRef, type: "text", className: "tc-global-search__input", placeholder: placeholder, value: searchValue, onChange: handleSearchChange, onKeyDown: handleKeyDown, onFocus: () => setIsFocused(true), onBlur: () => setIsFocused(false), disabled: disabled }) }), jsx("button", { type: "button", className: "tc-global-search__button", onClick: handleSearchSubmit, disabled: disabled, "aria-label": "Search", children: jsx(SearchIcon$
|
|
210
|
-
};
|
|
211
|
-
|
|
212
|
-
// Default Search Icon SVG
|
|
213
|
-
const SearchIcon$1 = ({ className }) => (jsx("svg", { className: className, viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: jsx("path", { d: "M15.5 14H14.71L14.43 13.73C15.41 12.59 16 11.11 16 9.5C16 5.91 13.09 3 9.5 3C5.91 3 3 5.91 3 9.5C3 13.09 5.91 16 9.5 16C11.11 16 12.59 15.41 13.73 14.43L14 14.71V15.5L19 20.49L20.49 19L15.5 14ZM9.5 14C7.01 14 5 11.99 5 9.5C5 7.01 7.01 5 9.5 5C11.99 5 14 7.01 14 9.5C14 11.99 11.99 14 9.5 14Z", fill: "currentColor" }) }));
|
|
214
|
-
const IconButton = ({ icon, size = 'medium', color = 'default', disabled = false, onClick, ariaLabel = 'Icon button', className = '', }) => {
|
|
215
|
-
const getButtonClasses = () => {
|
|
216
|
-
const classes = ['tc-icon-button'];
|
|
217
|
-
classes.push(`tc-icon-button--${size}`);
|
|
218
|
-
classes.push(`tc-icon-button--${color}`);
|
|
219
|
-
if (disabled)
|
|
220
|
-
classes.push('tc-icon-button--disabled');
|
|
221
|
-
if (className)
|
|
222
|
-
classes.push(className);
|
|
223
|
-
return classes.join(' ');
|
|
224
|
-
};
|
|
225
|
-
return (jsx("button", { type: "button", className: getButtonClasses(), onClick: onClick, disabled: disabled, "aria-label": ariaLabel, children: jsx("span", { className: "tc-icon-button__icon", children: icon || jsx(SearchIcon$1, {}) }) }));
|
|
218
|
+
return (jsxs("div", { className: getContainerClasses(), children: [jsxs("div", { ref: filterRef, className: `tc-global-search__filter ${isFilterOpen ? 'tc-global-search__filter--open' : ''}`, children: [jsxs("button", { type: "button", className: "tc-global-search__filter-trigger", onClick: handleFilterToggle, disabled: disabled, "aria-expanded": isFilterOpen, "aria-haspopup": "listbox", children: [jsx("span", { className: "tc-global-search__filter-label", children: getFilterLabel() }), jsx("div", { className: "tc-global-search__filter-icon", children: jsx(ChevronDownIcon$1, {}) })] }), isFilterOpen && filterOptions.length > 0 && (jsx("div", { className: "tc-global-search__filter-menu", role: "listbox", children: filterOptions.map((option) => (jsx("div", { className: `tc-global-search__filter-option ${filterValue === option.value ? 'tc-global-search__filter-option--selected' : ''}`, role: "option", "aria-selected": filterValue === option.value, onClick: () => handleFilterSelect(option.value), children: option.label }, option.value))) }))] }), jsx("div", { className: "tc-global-search__input-wrapper", children: jsx("input", { ref: inputRef, type: "text", className: "tc-global-search__input", placeholder: placeholder, value: searchValue, onChange: handleSearchChange, onKeyDown: handleKeyDown, onFocus: () => setIsFocused(true), onBlur: () => setIsFocused(false), disabled: disabled }) }), jsx("button", { type: "button", className: "tc-global-search__button", onClick: handleSearchSubmit, disabled: disabled, "aria-label": "Search", children: jsx(SearchIcon$1, {}) })] }));
|
|
226
219
|
};
|
|
227
220
|
|
|
228
221
|
// Base Icon wrapper component
|
|
@@ -308,7 +301,7 @@ const Search = ({ placeholder = 'Search', filterPlaceholder = 'All', filterOptio
|
|
|
308
301
|
const handleInfoClick = () => {
|
|
309
302
|
onInfoClick === null || onInfoClick === void 0 ? void 0 : onInfoClick();
|
|
310
303
|
};
|
|
311
|
-
return (jsxs("div", { className: `tc-search ${className}`.trim(), children: [jsx(GlobalSearch, { placeholder: placeholder, filterPlaceholder: filterPlaceholder, filterOptions: filterOptions, filterValue: controlledFilterValue !== undefined ? controlledFilterValue : filterValue, searchValue: controlledSearchValue !== undefined ? controlledSearchValue : searchValue, disabled: disabled, onSearch: handleSearch, onFilterChange: handleFilterChange, onSubmit: handleSubmit }), showInfoIcon && (jsx(IconButton, { icon: jsx(InfoIcon, { size: "medium" }), size: "medium", color: "
|
|
304
|
+
return (jsxs("div", { className: `tc-search ${className}`.trim(), children: [jsx(GlobalSearch, { placeholder: placeholder, filterPlaceholder: filterPlaceholder, filterOptions: filterOptions, filterValue: controlledFilterValue !== undefined ? controlledFilterValue : filterValue, searchValue: controlledSearchValue !== undefined ? controlledSearchValue : searchValue, disabled: disabled, onSearch: handleSearch, onFilterChange: handleFilterChange, onSubmit: handleSubmit }), showInfoIcon && (jsx(IconButton, { icon: jsx(InfoIcon, { size: "medium" }), size: "medium", color: "inherit", onClick: handleInfoClick, disabled: disabled, ariaLabel: "More information", className: "tc-search__info-button" }))] }));
|
|
312
305
|
};
|
|
313
306
|
|
|
314
307
|
// Chevron Right Icon for submenu indicator
|
|
@@ -817,6 +810,7 @@ const TCButton = s(Button, {
|
|
|
817
810
|
props: {
|
|
818
811
|
label: 'string',
|
|
819
812
|
variant: 'string',
|
|
813
|
+
color: 'string',
|
|
820
814
|
disabled: 'boolean',
|
|
821
815
|
showStartIcon: 'boolean',
|
|
822
816
|
showEndIcon: 'boolean',
|
|
@@ -824,16 +818,6 @@ const TCButton = s(Button, {
|
|
|
824
818
|
className: 'string',
|
|
825
819
|
},
|
|
826
820
|
});
|
|
827
|
-
// Convert ButtonGroup to Web Component
|
|
828
|
-
const TCButtonGroup = s(ButtonGroup, {
|
|
829
|
-
props: {
|
|
830
|
-
label: 'string',
|
|
831
|
-
variant: 'string',
|
|
832
|
-
disabled: 'boolean',
|
|
833
|
-
showStartIcon: 'boolean',
|
|
834
|
-
className: 'string',
|
|
835
|
-
},
|
|
836
|
-
});
|
|
837
821
|
// Convert Input to Web Component
|
|
838
822
|
const TCInput = s(Input, {
|
|
839
823
|
props: {
|
|
@@ -856,9 +840,6 @@ function registerWebComponents() {
|
|
|
856
840
|
if (!customElements.get('tc-button')) {
|
|
857
841
|
customElements.define('tc-button', TCButton);
|
|
858
842
|
}
|
|
859
|
-
if (!customElements.get('tc-button-group')) {
|
|
860
|
-
customElements.define('tc-button-group', TCButtonGroup);
|
|
861
|
-
}
|
|
862
843
|
if (!customElements.get('tc-input')) {
|
|
863
844
|
customElements.define('tc-input', TCInput);
|
|
864
845
|
}
|
|
@@ -867,5 +848,5 @@ function registerWebComponents() {
|
|
|
867
848
|
// Auto-register when loaded in browser
|
|
868
849
|
registerWebComponents();
|
|
869
850
|
|
|
870
|
-
export { Button,
|
|
851
|
+
export { Button, CaretDownIcon, ChevronDownIcon, ChevronUpIcon, DropdownMenu, FilterDropdown, Footer, GlobalHeader, GlobalSearch, HeaderMenu, IconButton, InfoIcon, Input, Layout, Logo, MainHeader, PageHeader, SearchIcon, Sidebar, TCButton, TCInput, Tab, defaultIcons, registerWebComponents };
|
|
871
852
|
//# sourceMappingURL=index.esm.js.map
|