tc-dazzle-ui 1.0.0 → 1.2.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.
Files changed (44) hide show
  1. package/dist/components/Atoms/Button/Button.d.ts +29 -0
  2. package/dist/components/Atoms/Button/index.d.ts +2 -0
  3. package/dist/components/Atoms/FilterDropdown/FilterDropdown.d.ts +20 -0
  4. package/dist/components/Atoms/FilterDropdown/index.d.ts +2 -0
  5. package/dist/components/Atoms/GlobalSearch/GlobalSearch.d.ts +20 -0
  6. package/dist/components/Atoms/GlobalSearch/index.d.ts +2 -0
  7. package/dist/components/Atoms/IconButton/IconButton.d.ts +16 -0
  8. package/dist/components/Atoms/IconButton/index.d.ts +2 -0
  9. package/dist/components/Atoms/Icons/Icons.d.ts +14 -0
  10. package/dist/components/Atoms/Icons/index.d.ts +2 -0
  11. package/dist/components/Atoms/Input/Input.d.ts +24 -0
  12. package/dist/components/Atoms/Input/index.d.ts +3 -0
  13. package/dist/components/Atoms/Logo/Logo.d.ts +13 -0
  14. package/dist/components/Atoms/Logo/index.d.ts +2 -0
  15. package/dist/components/Atoms/index.d.ts +14 -0
  16. package/dist/components/Molecules/DropdownMenu/DropdownMenu.d.ts +16 -0
  17. package/dist/components/Molecules/DropdownMenu/index.d.ts +2 -0
  18. package/dist/components/Molecules/HeaderMenu/HeaderMenu.d.ts +18 -0
  19. package/dist/components/Molecules/HeaderMenu/index.d.ts +2 -0
  20. package/dist/components/Molecules/Search/Search.d.ts +19 -0
  21. package/dist/components/Molecules/Search/index.d.ts +2 -0
  22. package/dist/components/Molecules/index.d.ts +6 -0
  23. package/dist/components/Organisms/MainHeader/MainHeader.d.ts +20 -0
  24. package/dist/components/Organisms/MainHeader/index.d.ts +2 -0
  25. package/dist/components/Organisms/index.d.ts +2 -0
  26. package/dist/components/TC Dazzle UI/FilterDropdown/FilterDropdown.d.ts +20 -0
  27. package/dist/components/TC Dazzle UI/FilterDropdown/index.d.ts +2 -0
  28. package/dist/components/TC Dazzle UI/GlobalSearch/GlobalSearch.d.ts +20 -0
  29. package/dist/components/TC Dazzle UI/GlobalSearch/index.d.ts +2 -0
  30. package/dist/components/TC Dazzle UI/IconButton/IconButton.d.ts +16 -0
  31. package/dist/components/TC Dazzle UI/IconButton/index.d.ts +2 -0
  32. package/dist/components/TC Dazzle UI/Icons/Icons.d.ts +13 -0
  33. package/dist/components/TC Dazzle UI/Icons/index.d.ts +2 -0
  34. package/dist/components/TC Dazzle UI/index.d.ts +8 -0
  35. package/dist/index.esm.js +334 -8
  36. package/dist/index.esm.js.map +1 -1
  37. package/dist/index.js +346 -6
  38. package/dist/index.js.map +1 -1
  39. package/dist/lib/index.d.ts +20 -4
  40. package/dist/styles.css +1 -1
  41. package/dist/web-components.css +1 -1
  42. package/dist/web-components.umd.js +46 -16
  43. package/dist/web-components.umd.js.map +1 -1
  44. package/package.json +1 -1
package/dist/index.esm.js CHANGED
@@ -1,24 +1,24 @@
1
1
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
- import o, { forwardRef, useState } from 'react';
2
+ import o, { forwardRef, useState, useRef, useEffect } from 'react';
3
3
  import { createRoot } from 'react-dom/client';
4
4
 
5
5
  // Caret Down Icon SVG
6
- const CaretDownIcon = ({ className }) => (jsx("svg", { className: className, viewBox: "0 0 10 6", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", children: jsx("path", { d: "M5 6L0 0H10L5 6Z" }) }));
6
+ const CaretDownIcon$1 = ({ className }) => (jsx("svg", { className: className, viewBox: "0 0 10 6", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", children: jsx("path", { d: "M5 6L0 0H10L5 6Z" }) }));
7
7
  // Single Button Component
8
8
  const Button = ({ label = 'Button', variant = 'primary', disabled = false, showStartIcon = true, showEndIcon = true, showLabel = true, startIcon, endIcon, onClick, className = '', }) => {
9
9
  const buttonClass = `tc-button tc-button--${variant} ${className}`.trim();
10
- return (jsxs("button", { className: `${buttonClass} tc-button-main`, disabled: disabled, onClick: onClick, type: "button", children: [showStartIcon && (jsx("span", { className: "tc-button__icon", children: startIcon || jsx(CaretDownIcon, {}) })), showLabel && (jsx("span", { className: "tc-button__label", children: label })), showEndIcon && (jsx("span", { className: "tc-button__caret", children: endIcon || jsx(CaretDownIcon, {}) }))] }));
10
+ return (jsxs("button", { className: `${buttonClass} tc-button-main`, disabled: disabled, onClick: onClick, type: "button", children: [showStartIcon && (jsx("span", { className: "tc-button__icon", children: startIcon || jsx(CaretDownIcon$1, {}) })), showLabel && (jsx("span", { className: "tc-button__label", children: label })), showEndIcon && (jsx("span", { className: "tc-button__caret", children: endIcon || jsx(CaretDownIcon$1, {}) }))] }));
11
11
  };
12
12
  // Button Group Component (Button with Dropdown)
13
13
  const ButtonGroup = ({ label = 'Button', variant = 'primary', disabled = false, showStartIcon = true, startIcon, onButtonClick, onDropdownClick, className = '', }) => {
14
14
  const buttonClass = `tc-button tc-button--${variant}`;
15
- return (jsxs("div", { className: `tc-button-group ${className}`.trim(), children: [jsxs("button", { className: `${buttonClass} tc-button-main`, disabled: disabled, onClick: onButtonClick, type: "button", children: [showStartIcon && (jsx("span", { className: "tc-button__icon", children: startIcon || jsx(CaretDownIcon, {}) })), jsx("span", { className: "tc-button__label", children: label })] }), jsx("div", { className: "tc-button-divider" }), jsx("button", { className: `${buttonClass} tc-button-dropdown`, disabled: disabled, onClick: onDropdownClick, type: "button", "aria-label": "Open dropdown menu", children: jsx("span", { className: "tc-button__caret", children: jsx(CaretDownIcon, {}) }) })] }));
15
+ return (jsxs("div", { className: `tc-button-group ${className}`.trim(), children: [jsxs("button", { className: `${buttonClass} tc-button-main`, disabled: disabled, onClick: onButtonClick, type: "button", children: [showStartIcon && (jsx("span", { className: "tc-button__icon", children: startIcon || jsx(CaretDownIcon$1, {}) })), jsx("span", { className: "tc-button__label", children: label })] }), jsx("div", { className: "tc-button-divider" }), jsx("button", { className: `${buttonClass} tc-button-dropdown`, disabled: disabled, onClick: onDropdownClick, type: "button", "aria-label": "Open dropdown menu", children: jsx("span", { className: "tc-button__caret", children: jsx(CaretDownIcon$1, {}) }) })] }));
16
16
  };
17
17
 
18
18
  // Arrow Icon for Prefix/Suffix
19
19
  const ArrowIcon = () => (jsx("svg", { viewBox: "0 0 16 16", fill: "#0067d2", xmlns: "http://www.w3.org/2000/svg", children: jsx("path", { d: "M8 2L14 8L8 14M14 8H2", stroke: "#0067d2", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", fill: "none" }) }));
20
20
  // Chevron Down Icon for Dropdown
21
- const ChevronDownIcon = () => (jsx("svg", { viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: jsx("path", { d: "M4 6L8 10L12 6", stroke: "#242a30", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) }));
21
+ const ChevronDownIcon$3 = () => (jsx("svg", { viewBox: "0 0 16 16", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: jsx("path", { d: "M4 6L8 10L12 6", stroke: "#242a30", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round" }) }));
22
22
  const Input = forwardRef(({ label = 'Label', placeholder = '', value, defaultValue, type = 'text', inputType = 'enabled', disabled = false, error = false, helperText, prefixIcon, suffixIcon, dropdownValue = 'Update this...', onChange, onFocus, onBlur, onDropdownClick, className = '', }, ref) => {
23
23
  const [isFocused, setIsFocused] = useState(false);
24
24
  const isDisabled = disabled || inputType === 'disabled';
@@ -49,10 +49,334 @@ const Input = forwardRef(({ label = 'Label', placeholder = '', value, defaultVal
49
49
  classes.push('tc-input--error');
50
50
  return classes.join(' ');
51
51
  };
52
- return (jsx("div", { className: `tc-input-wrapper ${className}`.trim(), children: jsxs("div", { className: "tc-input-field", children: [jsxs("div", { className: "tc-input-form-field", children: [jsx("div", { className: "tc-input-label-container", children: jsx("label", { className: "tc-input-label", children: label }) }), jsxs("div", { className: "tc-input-container", children: [isPrefixed && (jsx("div", { className: "tc-input-addon tc-input-addon--prefix", children: jsx("div", { className: "tc-input-icon", children: prefixIcon || jsx(ArrowIcon, {}) }) })), jsx("div", { className: getInputClasses(), children: jsx("div", { className: "tc-input-content", children: isDropdown ? (jsxs(Fragment, { children: [jsx("span", { className: "tc-input-placeholder", onClick: onDropdownClick, children: dropdownValue }), jsx("div", { className: "tc-input-dropdown-icon", children: jsx(ChevronDownIcon, {}) })] })) : (jsx("input", { ref: ref, type: type, placeholder: placeholder, value: value, defaultValue: defaultValue, disabled: isDisabled, onChange: onChange, onFocus: handleFocus, onBlur: handleBlur })) }) }), isSuffixed && (jsx("div", { className: "tc-input-addon tc-input-addon--suffix", children: jsx("div", { className: "tc-input-icon", children: suffixIcon || jsx(ArrowIcon, {}) }) }))] })] }), helperText && (jsx("span", { className: `tc-input-helper ${error ? 'tc-input-helper--error' : ''}`, children: helperText }))] }) }));
52
+ return (jsx("div", { className: `tc-input-wrapper ${className}`.trim(), children: jsxs("div", { className: "tc-input-field", children: [jsxs("div", { className: "tc-input-form-field", children: [jsx("div", { className: "tc-input-label-container", children: jsx("label", { className: "tc-input-label", children: label }) }), jsxs("div", { className: "tc-input-container", children: [isPrefixed && (jsx("div", { className: "tc-input-addon tc-input-addon--prefix", children: jsx("div", { className: "tc-input-icon", children: prefixIcon || jsx(ArrowIcon, {}) }) })), jsx("div", { className: getInputClasses(), children: jsx("div", { className: "tc-input-content", children: isDropdown ? (jsxs(Fragment, { children: [jsx("span", { className: "tc-input-placeholder", onClick: onDropdownClick, children: dropdownValue }), jsx("div", { className: "tc-input-dropdown-icon", children: jsx(ChevronDownIcon$3, {}) })] })) : (jsx("input", { ref: ref, type: type, placeholder: placeholder, value: value, defaultValue: defaultValue, disabled: isDisabled, onChange: onChange, onFocus: handleFocus, onBlur: handleBlur })) }) }), isSuffixed && (jsx("div", { className: "tc-input-addon tc-input-addon--suffix", children: jsx("div", { className: "tc-input-icon", children: suffixIcon || jsx(ArrowIcon, {}) }) }))] })] }), helperText && (jsx("span", { className: `tc-input-helper ${error ? 'tc-input-helper--error' : ''}`, children: helperText }))] }) }));
53
53
  });
54
54
  Input.displayName = 'Input';
55
55
 
56
+ // Chevron Down Icon SVG
57
+ const ChevronDownIcon$2 = ({ 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" }) }));
58
+ const FilterDropdown = ({ value, defaultValue, options = [], placeholder = 'All', size = 'small', disabled = false, onChange, className = '', }) => {
59
+ const [isOpen, setIsOpen] = useState(false);
60
+ const [selectedValue, setSelectedValue] = useState(value || defaultValue || '');
61
+ const [isFocused, setIsFocused] = useState(false);
62
+ const dropdownRef = useRef(null);
63
+ // Update selected value when controlled value changes
64
+ useEffect(() => {
65
+ if (value !== undefined) {
66
+ setSelectedValue(value);
67
+ }
68
+ }, [value]);
69
+ // Close dropdown when clicking outside
70
+ useEffect(() => {
71
+ const handleClickOutside = (event) => {
72
+ if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
73
+ setIsOpen(false);
74
+ setIsFocused(false);
75
+ }
76
+ };
77
+ document.addEventListener('mousedown', handleClickOutside);
78
+ return () => document.removeEventListener('mousedown', handleClickOutside);
79
+ }, []);
80
+ const handleToggle = () => {
81
+ if (!disabled) {
82
+ setIsOpen(!isOpen);
83
+ setIsFocused(true);
84
+ }
85
+ };
86
+ const handleSelect = (optionValue) => {
87
+ setSelectedValue(optionValue);
88
+ setIsOpen(false);
89
+ onChange === null || onChange === void 0 ? void 0 : onChange(optionValue);
90
+ };
91
+ const handleKeyDown = (event) => {
92
+ if (disabled)
93
+ return;
94
+ switch (event.key) {
95
+ case 'Enter':
96
+ case ' ':
97
+ event.preventDefault();
98
+ setIsOpen(!isOpen);
99
+ break;
100
+ case 'Escape':
101
+ setIsOpen(false);
102
+ break;
103
+ case 'ArrowDown':
104
+ event.preventDefault();
105
+ if (!isOpen) {
106
+ setIsOpen(true);
107
+ }
108
+ break;
109
+ }
110
+ };
111
+ const getDisplayLabel = () => {
112
+ if (selectedValue) {
113
+ const selectedOption = options.find(opt => opt.value === selectedValue);
114
+ return (selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.label) || selectedValue;
115
+ }
116
+ return placeholder;
117
+ };
118
+ const getContainerClasses = () => {
119
+ const classes = ['tc-filter-dropdown'];
120
+ classes.push(`tc-filter-dropdown--${size}`);
121
+ if (disabled)
122
+ classes.push('tc-filter-dropdown--disabled');
123
+ if (isFocused || isOpen)
124
+ classes.push('tc-filter-dropdown--focused');
125
+ if (isOpen)
126
+ classes.push('tc-filter-dropdown--open');
127
+ if (className)
128
+ classes.push(className);
129
+ return classes.join(' ');
130
+ };
131
+ return (jsxs("div", { ref: dropdownRef, className: getContainerClasses(), tabIndex: disabled ? -1 : 0, role: "combobox", "aria-expanded": isOpen, "aria-haspopup": "listbox", "aria-disabled": disabled, onClick: handleToggle, onKeyDown: handleKeyDown, onFocus: () => setIsFocused(true), onBlur: () => !isOpen && setIsFocused(false), children: [jsxs("div", { className: "tc-filter-dropdown__trigger", children: [jsx("span", { className: "tc-filter-dropdown__label", children: getDisplayLabel() }), jsx("div", { className: "tc-filter-dropdown__icon", children: jsx(ChevronDownIcon$2, {}) })] }), isOpen && options.length > 0 && (jsx("div", { className: "tc-filter-dropdown__menu", role: "listbox", children: options.map((option) => (jsx("div", { className: `tc-filter-dropdown__option ${selectedValue === option.value ? 'tc-filter-dropdown__option--selected' : ''}`, role: "option", "aria-selected": selectedValue === option.value, onClick: (e) => {
132
+ e.stopPropagation();
133
+ handleSelect(option.value);
134
+ }, children: option.label }, option.value))) }))] }));
135
+ };
136
+
137
+ // Search Icon SVG
138
+ const SearchIcon$2 = ({ 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
+ // Chevron Down Icon SVG
140
+ 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
+ const GlobalSearch = ({ placeholder = 'Search', filterPlaceholder = 'All', filterOptions = [], filterValue: controlledFilterValue, searchValue: controlledSearchValue, disabled = false, onSearch, onFilterChange, onSubmit, className = '', }) => {
142
+ const [isFilterOpen, setIsFilterOpen] = useState(false);
143
+ const [filterValue, setFilterValue] = useState(controlledFilterValue || '');
144
+ const [searchValue, setSearchValue] = useState(controlledSearchValue || '');
145
+ const [isFocused, setIsFocused] = useState(false);
146
+ const filterRef = useRef(null);
147
+ const inputRef = useRef(null);
148
+ // Update values when controlled props change
149
+ useEffect(() => {
150
+ if (controlledFilterValue !== undefined) {
151
+ setFilterValue(controlledFilterValue);
152
+ }
153
+ }, [controlledFilterValue]);
154
+ useEffect(() => {
155
+ if (controlledSearchValue !== undefined) {
156
+ setSearchValue(controlledSearchValue);
157
+ }
158
+ }, [controlledSearchValue]);
159
+ // Close filter dropdown when clicking outside
160
+ useEffect(() => {
161
+ const handleClickOutside = (event) => {
162
+ if (filterRef.current && !filterRef.current.contains(event.target)) {
163
+ setIsFilterOpen(false);
164
+ }
165
+ };
166
+ document.addEventListener('mousedown', handleClickOutside);
167
+ return () => document.removeEventListener('mousedown', handleClickOutside);
168
+ }, []);
169
+ const handleFilterToggle = () => {
170
+ if (!disabled) {
171
+ setIsFilterOpen(!isFilterOpen);
172
+ }
173
+ };
174
+ const handleFilterSelect = (value) => {
175
+ setFilterValue(value);
176
+ setIsFilterOpen(false);
177
+ onFilterChange === null || onFilterChange === void 0 ? void 0 : onFilterChange(value);
178
+ };
179
+ const handleSearchChange = (e) => {
180
+ const value = e.target.value;
181
+ setSearchValue(value);
182
+ onSearch === null || onSearch === void 0 ? void 0 : onSearch(value);
183
+ };
184
+ const handleSearchSubmit = () => {
185
+ onSubmit === null || onSubmit === void 0 ? void 0 : onSubmit(searchValue, filterValue);
186
+ };
187
+ const handleKeyDown = (e) => {
188
+ if (e.key === 'Enter') {
189
+ handleSearchSubmit();
190
+ }
191
+ };
192
+ const getFilterLabel = () => {
193
+ if (filterValue) {
194
+ const selectedOption = filterOptions.find(opt => opt.value === filterValue);
195
+ return (selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.label) || filterValue;
196
+ }
197
+ return filterPlaceholder;
198
+ };
199
+ const getContainerClasses = () => {
200
+ const classes = ['tc-global-search'];
201
+ if (disabled)
202
+ classes.push('tc-global-search--disabled');
203
+ if (isFocused)
204
+ classes.push('tc-global-search--focused');
205
+ if (className)
206
+ classes.push(className);
207
+ return classes.join(' ');
208
+ };
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$2, {}) })] }));
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, {}) }) }));
226
+ };
227
+
228
+ // Base Icon wrapper component
229
+ const IconWrapper = ({ size = 'medium', color, className = '', children, }) => {
230
+ const getSizeClass = () => {
231
+ switch (size) {
232
+ case 'small':
233
+ return 'tc-icon--small';
234
+ case 'large':
235
+ return 'tc-icon--large';
236
+ default:
237
+ return 'tc-icon--medium';
238
+ }
239
+ };
240
+ return (jsx("span", { className: `tc-icon ${getSizeClass()} ${className}`.trim(), style: color ? { color } : undefined, children: children }));
241
+ };
242
+ // Info Icon
243
+ const InfoIcon = (props) => (jsx(IconWrapper, { ...props, children: jsx("svg", { viewBox: "0 0 18 18", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: jsx("path", { d: "M9 1.5C4.86 1.5 1.5 4.86 1.5 9C1.5 13.14 4.86 16.5 9 16.5C13.14 16.5 16.5 13.14 16.5 9C16.5 4.86 13.14 1.5 9 1.5ZM9.75 12.75H8.25V8.25H9.75V12.75ZM9.75 6.75H8.25V5.25H9.75V6.75Z", fill: "currentColor" }) }) }));
244
+ // Search Icon
245
+ const SearchIcon = (props) => (jsx(IconWrapper, { ...props, children: jsx("svg", { 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" }) }) }));
246
+ // Chevron Down Icon
247
+ const ChevronDownIcon = (props) => (jsx(IconWrapper, { ...props, children: jsx("svg", { viewBox: "0 0 10 6", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: jsx("path", { d: "M0 0L5 5L10 0H0Z", fill: "currentColor" }) }) }));
248
+ // Chevron Up Icon
249
+ const ChevronUpIcon = (props) => (jsx(IconWrapper, { ...props, children: jsx("svg", { viewBox: "0 0 10 6", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: jsx("path", { d: "M10 6L5 1L0 6H10Z", fill: "currentColor" }) }) }));
250
+ // Caret Down Icon
251
+ const CaretDownIcon = (props) => (jsx(IconWrapper, { ...props, children: jsx("svg", { viewBox: "0 0 10 6", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: jsx("path", { d: "M5 6L0 0H10L5 6Z", fill: "currentColor" }) }) }));
252
+ // TeamConnect Logo Icon (honeycomb hexagon pattern)
253
+ const TeamConnectIcon = (props) => (jsx(IconWrapper, { ...props, children: jsxs("svg", { viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [jsx("path", { d: "M5.5 4L8 2.5L10.5 4V7L8 8.5L5.5 7V4Z", fill: "#E91E63" }), jsx("path", { d: "M10.5 4L13 2.5L15.5 4V7L13 8.5L10.5 7V4Z", fill: "#9C27B0" }), jsx("path", { d: "M3 8.5L5.5 7L8 8.5V11.5L5.5 13L3 11.5V8.5Z", fill: "#7B1FA2" }), jsx("path", { d: "M8 8.5L10.5 7L13 8.5V11.5L10.5 13L8 11.5V8.5Z", fill: "#673AB7" }), jsx("path", { d: "M13 8.5L15.5 7L18 8.5V11.5L15.5 13L13 11.5V8.5Z", fill: "#3F51B5" }), jsx("path", { d: "M5.5 13L8 11.5L10.5 13V16L8 17.5L5.5 16V13Z", fill: "#303F9F" }), jsx("path", { d: "M10.5 13L13 11.5L15.5 13V16L13 17.5L10.5 16V13Z", fill: "#1A237E" })] }) }));
254
+
255
+ // TeamConnect Logo Icon (honeycomb hexagon pattern)
256
+ const LogoIcon = ({ className }) => (jsxs("svg", { className: className, viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: [jsx("path", { d: "M5.5 4L8 2.5L10.5 4V7L8 8.5L5.5 7V4Z", fill: "#E91E63" }), jsx("path", { d: "M10.5 4L13 2.5L15.5 4V7L13 8.5L10.5 7V4Z", fill: "#9C27B0" }), jsx("path", { d: "M3 8.5L5.5 7L8 8.5V11.5L5.5 13L3 11.5V8.5Z", fill: "#7B1FA2" }), jsx("path", { d: "M8 8.5L10.5 7L13 8.5V11.5L10.5 13L8 11.5V8.5Z", fill: "#673AB7" }), jsx("path", { d: "M13 8.5L15.5 7L18 8.5V11.5L15.5 13L13 11.5V8.5Z", fill: "#3F51B5" }), jsx("path", { d: "M5.5 13L8 11.5L10.5 13V16L8 17.5L5.5 16V13Z", fill: "#303F9F" }), jsx("path", { d: "M10.5 13L13 11.5L15.5 13V16L13 17.5L10.5 16V13Z", fill: "#1A237E" })] }));
257
+ const Logo = ({ size = 'medium', variant = 'full', showSandbox = false, className = '', onClick, }) => {
258
+ const getSizeClass = () => {
259
+ switch (size) {
260
+ case 'small':
261
+ return 'tc-logo--small';
262
+ case 'large':
263
+ return 'tc-logo--large';
264
+ default:
265
+ return 'tc-logo--medium';
266
+ }
267
+ };
268
+ return (jsxs("div", { className: `tc-logo ${getSizeClass()} ${className}`.trim(), onClick: onClick, role: onClick ? 'button' : undefined, tabIndex: onClick ? 0 : undefined, onKeyDown: onClick ? (e) => {
269
+ if (e.key === 'Enter' || e.key === ' ') {
270
+ e.preventDefault();
271
+ onClick();
272
+ }
273
+ } : undefined, children: [jsx(LogoIcon, { className: "tc-logo__icon" }), variant === 'full' && (jsxs("span", { className: "tc-logo__text", children: [jsx("span", { className: "tc-logo__text-team", children: "Team" }), jsx("span", { className: "tc-logo__text-connect", children: "Connect" }), showSandbox && (jsx("span", { className: "tc-logo__text-sandbox", children: "SANDBOX" }))] }))] }));
274
+ };
275
+
276
+ const Search = ({ placeholder = 'Search', filterPlaceholder = 'All', filterOptions = [
277
+ { value: 'all', label: 'All' },
278
+ ], filterValue: controlledFilterValue, searchValue: controlledSearchValue, disabled = false, showInfoIcon = true, onSearch, onFilterChange, onSubmit, onInfoClick, className = '', }) => {
279
+ const [filterValue, setFilterValue] = useState(controlledFilterValue || '');
280
+ const [searchValue, setSearchValue] = useState(controlledSearchValue || '');
281
+ const handleFilterChange = (value) => {
282
+ setFilterValue(value);
283
+ onFilterChange === null || onFilterChange === void 0 ? void 0 : onFilterChange(value);
284
+ };
285
+ const handleSearch = (value) => {
286
+ setSearchValue(value);
287
+ onSearch === null || onSearch === void 0 ? void 0 : onSearch(value);
288
+ };
289
+ const handleSubmit = (search, filter) => {
290
+ onSubmit === null || onSubmit === void 0 ? void 0 : onSubmit(search, filter);
291
+ };
292
+ const handleInfoClick = () => {
293
+ onInfoClick === null || onInfoClick === void 0 ? void 0 : onInfoClick();
294
+ };
295
+ 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: "default", onClick: handleInfoClick, disabled: disabled, ariaLabel: "More information", className: "tc-search__info-button" }))] }));
296
+ };
297
+
298
+ // Default Wrench Icon (from Figma design)
299
+ const WrenchIcon = ({ className }) => (jsx("svg", { className: className, viewBox: "0 0 14 14", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", children: jsx("path", { d: "M13.6 3.5C13.4 3.3 13.1 3.3 12.9 3.5L10.5 5.9L8.1 3.5L10.5 1.1C10.7 0.9 10.7 0.6 10.5 0.4C9.3 -0.4 7.7 -0.1 6.6 1C5.7 1.9 5.4 3.2 5.8 4.3L0.4 9.7C-0.1 10.2 -0.1 11 0.4 11.5L2.5 13.6C3 14.1 3.8 14.1 4.3 13.6L9.7 8.2C10.8 8.6 12.1 8.3 13 7.4C14.1 6.3 14.4 4.7 13.6 3.5Z" }) }));
300
+ const DropdownMenu = ({ items, selectedId, onItemClick, className = '', }) => {
301
+ const handleItemClick = (item) => {
302
+ var _a;
303
+ (_a = item.onClick) === null || _a === void 0 ? void 0 : _a.call(item);
304
+ onItemClick === null || onItemClick === void 0 ? void 0 : onItemClick(item);
305
+ };
306
+ return (jsx("div", { className: `tc-dropdown-menu ${className}`.trim(), children: items.map((item, index) => {
307
+ const isSelected = item.id === selectedId;
308
+ const isLast = index === items.length - 1;
309
+ return (jsx("div", { className: `tc-dropdown-menu__item ${isSelected ? 'tc-dropdown-menu__item--selected' : ''} ${isLast ? 'tc-dropdown-menu__item--last' : ''}`, onClick: () => handleItemClick(item), role: "menuitem", tabIndex: 0, onKeyDown: (e) => {
310
+ if (e.key === 'Enter' || e.key === ' ') {
311
+ e.preventDefault();
312
+ handleItemClick(item);
313
+ }
314
+ }, children: jsxs("div", { className: "tc-dropdown-menu__link", children: [jsx("span", { className: "tc-dropdown-menu__icon", children: item.icon || jsx(WrenchIcon, {}) }), jsx("span", { className: "tc-dropdown-menu__label", children: item.label })] }) }, item.id));
315
+ }) }));
316
+ };
317
+
318
+ // Default Icons based on Figma design
319
+ const BookmarkIcon = () => (jsx("svg", { viewBox: "0 0 18 18", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", children: jsx("path", { d: "M14 2H4C2.9 2 2 2.9 2 4V16L9 13L16 16V4C16 2.9 15.1 2 14 2Z" }) }));
320
+ const RecentIcon = () => (jsx("svg", { viewBox: "0 0 18 18", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", children: jsx("path", { d: "M9 1C4.58 1 1 4.58 1 9C1 13.42 4.58 17 9 17C13.42 17 17 13.42 17 9C17 4.58 13.42 1 9 1ZM9 15C5.69 15 3 12.31 3 9C3 5.69 5.69 3 9 3C12.31 3 15 5.69 15 9C15 12.31 12.31 15 9 15ZM9.5 5H8V10L12.25 12.52L13 11.24L9.5 9.15V5Z" }) }));
321
+ const AllIcon = () => (jsx("svg", { viewBox: "0 0 21 18", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", children: jsx("path", { d: "M0 10H4V6H0V10ZM0 16H4V12H0V16ZM0 4H4V0H0V4ZM6 10H21V6H6V10ZM6 16H21V12H6V16ZM6 0V4H21V0H6Z" }) }));
322
+ const ToolsIcon = () => (jsx("svg", { viewBox: "0 0 18 18", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", children: jsx("path", { d: "M16.89 5.21L14.12 7.98L10.02 3.88L12.79 1.11C11.15 0.37 9.14 0.69 7.79 2.04C6.32 3.51 6.07 5.75 7.04 7.49L1.04 13.49C0.26 14.27 0.26 15.53 1.04 16.31C1.82 17.09 3.08 17.09 3.86 16.31L9.86 10.31C11.6 11.28 13.84 11.03 15.31 9.56C16.66 8.21 16.98 6.2 16.24 4.56L16.89 5.21Z" }) }));
323
+ const HelpIcon = () => (jsx("svg", { viewBox: "0 0 18 18", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", children: jsx("path", { d: "M9 1C4.58 1 1 4.58 1 9C1 13.42 4.58 17 9 17C13.42 17 17 13.42 17 9C17 4.58 13.42 1 9 1ZM10 14H8V12H10V14ZM11.07 8.25L10.17 9.17C9.45 9.9 9 10.5 9 12H7V11.5C7 10.4 7.45 9.4 8.17 8.67L9.41 7.41C9.78 7.05 10 6.55 10 6C10 4.9 9.1 4 8 4C6.9 4 6 4.9 6 6H4C4 3.79 5.79 2 8 2C10.21 2 12 3.79 12 6C12 6.88 11.64 7.68 11.07 8.25Z" }) }));
324
+ const ClientIcon = () => (jsx("svg", { viewBox: "0 0 18 18", fill: "currentColor", xmlns: "http://www.w3.org/2000/svg", children: jsx("path", { d: "M9 9C11.21 9 13 7.21 13 5C13 2.79 11.21 1 9 1C6.79 1 5 2.79 5 5C5 7.21 6.79 9 9 9ZM9 11C6.33 11 1 12.34 1 15V17H17V15C17 12.34 11.67 11 9 11Z" }) }));
325
+ const defaultIcons = {
326
+ bookmarks: jsx(BookmarkIcon, {}),
327
+ recent: jsx(RecentIcon, {}),
328
+ all: jsx(AllIcon, {}),
329
+ tools: jsx(ToolsIcon, {}),
330
+ help: jsx(HelpIcon, {}),
331
+ client: jsx(ClientIcon, {}),
332
+ };
333
+ const HeaderMenu = ({ items, onItemClick, onDropdownItemClick, className = '', }) => {
334
+ const [openMenuId, setOpenMenuId] = useState(null);
335
+ const menuRef = useRef(null);
336
+ // Close dropdown when clicking outside
337
+ useEffect(() => {
338
+ const handleClickOutside = (event) => {
339
+ if (menuRef.current && !menuRef.current.contains(event.target)) {
340
+ setOpenMenuId(null);
341
+ }
342
+ };
343
+ document.addEventListener('mousedown', handleClickOutside);
344
+ return () => document.removeEventListener('mousedown', handleClickOutside);
345
+ }, []);
346
+ const handleItemClick = (item) => {
347
+ if (item.dropdownItems && item.dropdownItems.length > 0) {
348
+ setOpenMenuId(openMenuId === item.id ? null : item.id);
349
+ }
350
+ onItemClick === null || onItemClick === void 0 ? void 0 : onItemClick(item);
351
+ };
352
+ const handleDropdownItemClick = (menuItem, dropdownItem) => {
353
+ setOpenMenuId(null);
354
+ onDropdownItemClick === null || onDropdownItemClick === void 0 ? void 0 : onDropdownItemClick(menuItem, dropdownItem);
355
+ };
356
+ return (jsx("div", { ref: menuRef, className: `tc-header-menu ${className}`.trim(), children: items.map((item) => {
357
+ const isOpen = openMenuId === item.id;
358
+ const hasDropdown = item.dropdownItems && item.dropdownItems.length > 0;
359
+ return (jsxs("div", { className: "tc-header-menu__item-wrapper", children: [jsxs("button", { className: `tc-header-menu__item ${isOpen ? 'tc-header-menu__item--active' : ''}`, onClick: () => handleItemClick(item), type: "button", "aria-expanded": hasDropdown ? isOpen : undefined, "aria-haspopup": hasDropdown ? 'menu' : undefined, children: [jsx("span", { className: "tc-header-menu__icon", children: item.icon || defaultIcons[item.id.toLowerCase()] || jsx(BookmarkIcon, {}) }), jsx("span", { className: "tc-header-menu__label", children: item.label })] }), hasDropdown && isOpen && (jsx("div", { className: "tc-header-menu__dropdown", children: jsx(DropdownMenu, { items: item.dropdownItems, onItemClick: (dropdownItem) => handleDropdownItemClick(item, dropdownItem) }) }))] }, item.id));
360
+ }) }));
361
+ };
362
+
363
+ // Default menu items matching the Figma design
364
+ const defaultMenuItems = [
365
+ { id: 'bookmarks', label: 'Bookmarks', dropdownItems: [] },
366
+ { id: 'recent', label: 'Recent', dropdownItems: [] },
367
+ { id: 'all', label: 'All', dropdownItems: [] },
368
+ { id: 'tools', label: 'Tools', dropdownItems: [] },
369
+ { id: 'help', label: 'Help', dropdownItems: [] },
370
+ { id: 'client', label: 'Client', dropdownItems: [] },
371
+ ];
372
+ // Default filter options
373
+ const defaultFilterOptions = [
374
+ { value: 'all', label: 'All' },
375
+ ];
376
+ const MainHeader = ({ showSandbox = true, menuItems = defaultMenuItems, searchFilterOptions = defaultFilterOptions, searchPlaceholder = 'Search', searchFilterPlaceholder = 'All', onLogoClick, onSearch, onMenuItemClick, onDropdownItemClick, onInfoClick, className = '', }) => {
377
+ return (jsxs("header", { className: `tc-main-header ${className}`.trim(), children: [jsx("div", { className: "tc-main-header__logo", children: jsx(Logo, { size: "medium", showSandbox: showSandbox, onClick: onLogoClick }) }), jsx("div", { className: "tc-main-header__search", children: jsx(Search, { placeholder: searchPlaceholder, filterPlaceholder: searchFilterPlaceholder, filterOptions: searchFilterOptions, onSubmit: onSearch, onInfoClick: onInfoClick }) }), jsx("div", { className: "tc-main-header__menu", children: jsx(HeaderMenu, { items: menuItems, onItemClick: onMenuItemClick, onDropdownItemClick: onDropdownItemClick }) })] }));
378
+ };
379
+
56
380
  var x = Object.defineProperty;
57
381
  var T = (t, e, s) => e in t ? x(t, e, { enumerable: !0, configurable: !0, writable: !0, value: s }) : t[e] = s;
58
382
  var d = (t, e, s) => T(t, typeof e != "symbol" ? e + "" : e, s);
@@ -265,7 +589,9 @@ function registerWebComponents() {
265
589
  customElements.define('tc-input', TCInput);
266
590
  }
267
591
  }
268
- }
592
+ }
593
+ // Auto-register when loaded in browser
594
+ registerWebComponents();
269
595
 
270
- export { Button, ButtonGroup, Input, TCButton, TCButtonGroup, TCInput, registerWebComponents };
596
+ export { Button, ButtonGroup, CaretDownIcon, ChevronDownIcon, ChevronUpIcon, DropdownMenu, FilterDropdown, GlobalSearch, HeaderMenu, IconButton, InfoIcon, Input, Logo, MainHeader, SearchIcon, TCButton, TCButtonGroup, TCInput, TeamConnectIcon, defaultIcons, registerWebComponents };
271
597
  //# sourceMappingURL=index.esm.js.map