glassine-paper 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/README.md +85 -0
- package/lib/AppBar.d.ts +81 -0
- package/lib/AppBar.d.ts.map +1 -0
- package/lib/AppBar.js +85 -0
- package/lib/AppBar.js.map +1 -0
- package/lib/Button.d.ts +89 -0
- package/lib/Button.d.ts.map +1 -0
- package/lib/Button.js +83 -0
- package/lib/Button.js.map +1 -0
- package/lib/Menu.d.ts +59 -0
- package/lib/Menu.d.ts.map +1 -0
- package/lib/Menu.js +49 -0
- package/lib/Menu.js.map +1 -0
- package/lib/NavDrawer.d.ts +63 -0
- package/lib/NavDrawer.d.ts.map +1 -0
- package/lib/NavDrawer.js +55 -0
- package/lib/NavDrawer.js.map +1 -0
- package/lib/Slider.d.ts +70 -0
- package/lib/Slider.d.ts.map +1 -0
- package/lib/Slider.js +104 -0
- package/lib/Slider.js.map +1 -0
- package/lib/Tabs.d.ts +50 -0
- package/lib/Tabs.d.ts.map +1 -0
- package/lib/Tabs.js +42 -0
- package/lib/Tabs.js.map +1 -0
- package/lib/TextField.d.ts +68 -0
- package/lib/TextField.d.ts.map +1 -0
- package/lib/TextField.js +52 -0
- package/lib/TextField.js.map +1 -0
- package/lib/Toolbar.d.ts +62 -0
- package/lib/Toolbar.d.ts.map +1 -0
- package/lib/Toolbar.js +54 -0
- package/lib/Toolbar.js.map +1 -0
- package/lib/glassine-paper.min.css +1 -0
- package/lib/glassine-paper.min.css.map +1 -0
- package/lib/index.d.ts +11 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +11 -0
- package/lib/index.js.map +1 -0
- package/package.json +89 -0
package/lib/NavDrawer.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React, {} from 'react';
|
|
3
|
+
const NavDrawerItem = ({ key, id, label, leadingIcon, trailingIcon, divider = false, active = false, hidden = false, disabled = false, onClick, href, }) => {
|
|
4
|
+
const classes = [
|
|
5
|
+
active ? 'active' : '',
|
|
6
|
+
hidden ? 'hidden' : '',
|
|
7
|
+
disabled ? 'disabled' : '',
|
|
8
|
+
].join(' ');
|
|
9
|
+
return divider ? (_jsx("hr", {})) : href ? (_jsxs("a", { id: id, className: classes, href: href, children: [leadingIcon, label, trailingIcon] }, key)) : (_jsxs("button", { id: id, className: classes, onClick: onClick, children: [leadingIcon, label, trailingIcon] }, key));
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Material Design 3 NavDrawer component
|
|
13
|
+
*
|
|
14
|
+
* @param props NavDrawerProps
|
|
15
|
+
* @param props.id Element id
|
|
16
|
+
* @param props.items Array of NavDrawerItem configurations
|
|
17
|
+
* @param props.items[].key Unique key for the item
|
|
18
|
+
* @param props.items[].id Element id for the item
|
|
19
|
+
* @param props.items[].label Label text
|
|
20
|
+
* @param props.items[].leadingIcon Leading icon element
|
|
21
|
+
* @param props.items[].trailingIcon Trailing icon element
|
|
22
|
+
* @param props.items[].divider Show as divider (renders hr element)
|
|
23
|
+
* @param props.items[].active Active state
|
|
24
|
+
* @param props.items[].hidden Hidden state
|
|
25
|
+
* @param props.items[].disabled Disabled state
|
|
26
|
+
* @param props.items[].onClick Click handler
|
|
27
|
+
* @param props.items[].href Link URL (renders as anchor tag)
|
|
28
|
+
* @param props.className Additional CSS class names
|
|
29
|
+
* @param props.style Custom inline styles
|
|
30
|
+
* @returns JSX.Element
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* <NavDrawer
|
|
34
|
+
* id="example-nav-drawer"
|
|
35
|
+
* items={[
|
|
36
|
+
* {
|
|
37
|
+
* leadingIcon: {<svg>...</svg>},
|
|
38
|
+
* label: "Item 1",
|
|
39
|
+
* trailingIcon: {<svg>...</svg>},
|
|
40
|
+
* active: true,
|
|
41
|
+
* onClick: () => {},
|
|
42
|
+
* },
|
|
43
|
+
* { divider: true },
|
|
44
|
+
* {
|
|
45
|
+
* label: "Item 2",
|
|
46
|
+
* href: "...",
|
|
47
|
+
* },
|
|
48
|
+
* ]}
|
|
49
|
+
* />
|
|
50
|
+
*/
|
|
51
|
+
export const NavDrawer = ({ id, items = [], className, style = {}, }) => {
|
|
52
|
+
return (_jsx("div", { id: id, className: `nav-drawer ${className || ''}`, style: style, children: Array.from(items).map((item, index) => (_jsx(NavDrawerItem, { ...item }, item.key || index))) }));
|
|
53
|
+
};
|
|
54
|
+
export default NavDrawer;
|
|
55
|
+
//# sourceMappingURL=NavDrawer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NavDrawer.js","sourceRoot":"","sources":["../src/components/NavDrawer.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,EAAsC,MAAM,OAAO,CAAC;AAuBlE,MAAM,aAAa,GAAiC,CAAC,EACnD,GAAG,EACH,EAAE,EACF,KAAK,EACL,WAAW,EACX,YAAY,EACZ,OAAO,GAAG,KAAK,EACf,MAAM,GAAG,KAAK,EACd,MAAM,GAAG,KAAK,EACd,QAAQ,GAAG,KAAK,EAChB,OAAO,EACP,IAAI,GACL,EAAE,EAAE;IACH,MAAM,OAAO,GAAG;QACd,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;QACtB,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;QACtB,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE;KAC3B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACZ,OAAO,OAAO,CAAC,CAAC,CAAC,CACf,cAAM,CACP,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CACT,aAAa,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,aAChD,WAAW,EACX,KAAK,EACL,YAAY,KAHP,GAAG,CAIP,CACL,CAAC,CAAC,CAAC,CACF,kBAAkB,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,aAC3D,WAAW,EACX,KAAK,EACL,YAAY,KAHF,GAAG,CAIP,CACV,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,MAAM,CAAC,MAAM,SAAS,GAA6B,CAAC,EAClD,EAAE,EACF,KAAK,GAAG,EAAE,EACV,SAAS,EACT,KAAK,GAAG,EAAE,GACX,EAAE,EAAE;IACH,OAAO,CACL,cAAK,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,cAAc,SAAS,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,YAClE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CACtC,KAAC,aAAa,OAA6B,IAAI,IAA3B,IAAI,CAAC,GAAG,IAAI,KAAK,CAAc,CACpD,CAAC,GACE,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,SAAS,CAAC"}
|
package/lib/Slider.d.ts
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import React, { type CSSProperties } from 'react';
|
|
2
|
+
export interface SliderOption {
|
|
3
|
+
value: number;
|
|
4
|
+
key?: string;
|
|
5
|
+
}
|
|
6
|
+
export interface SliderProps {
|
|
7
|
+
id?: string;
|
|
8
|
+
name?: string;
|
|
9
|
+
min?: number;
|
|
10
|
+
max?: number;
|
|
11
|
+
step?: number;
|
|
12
|
+
value: number;
|
|
13
|
+
size?: 'xs' | 'sm' | 'md';
|
|
14
|
+
orientation?: 'horizontal' | 'top-bottom' | 'bottom-top';
|
|
15
|
+
showValueIndicator?: boolean;
|
|
16
|
+
options?: SliderOption[];
|
|
17
|
+
onChange?: (value: number) => void;
|
|
18
|
+
className?: string;
|
|
19
|
+
style?: CSSProperties;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Material Design 3 Slider component
|
|
23
|
+
*
|
|
24
|
+
* @param props SliderProps
|
|
25
|
+
* @param props.id Input id attribute
|
|
26
|
+
* @param props.name Input name attribute
|
|
27
|
+
* @param props.min Minimum value
|
|
28
|
+
* @param props.max Maximum value
|
|
29
|
+
* @param props.step Step increment
|
|
30
|
+
* @param props.value Current value
|
|
31
|
+
* @param props.size Size variant: 'xs', 'sm', or 'md'
|
|
32
|
+
* @param props.orientation Orientation: 'horizontal', 'top-bottom', or 'bottom-top'
|
|
33
|
+
* @param props.showValueIndicator Show value indicator
|
|
34
|
+
* @param props.options Datalist options array
|
|
35
|
+
* @param props.options[].value Option value
|
|
36
|
+
* @param props.options[].key Optional unique key for the option
|
|
37
|
+
* @param props.onChange Change handler function
|
|
38
|
+
* @param props.className Additional CSS class names
|
|
39
|
+
* @param props.style Custom inline styles
|
|
40
|
+
* @returns JSX.Element
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* <Slider
|
|
44
|
+
* value={50}
|
|
45
|
+
* min={0}
|
|
46
|
+
* max={100}
|
|
47
|
+
* step={10}
|
|
48
|
+
* showValueIndicator
|
|
49
|
+
* options={[
|
|
50
|
+
* { value: 0 },
|
|
51
|
+
* { value: 25 },
|
|
52
|
+
* { value: 50 },
|
|
53
|
+
* { value: 75 },
|
|
54
|
+
* { value: 100 }
|
|
55
|
+
* ]}
|
|
56
|
+
* onChange={(value) => console.log(value)}
|
|
57
|
+
* style={{ width: "16em"}}
|
|
58
|
+
* />
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* <Slider
|
|
62
|
+
* value={30}
|
|
63
|
+
* orientation="top-bottom"
|
|
64
|
+
* size="md"
|
|
65
|
+
* style={{ height: "16em"}}
|
|
66
|
+
* />
|
|
67
|
+
*/
|
|
68
|
+
export declare const Slider: React.FC<SliderProps>;
|
|
69
|
+
export default Slider;
|
|
70
|
+
//# sourceMappingURL=Slider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Slider.d.ts","sourceRoot":"","sources":["../src/components/Slider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAqB,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAErE,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,WAAW,CAAC,EAAE,YAAY,GAAG,YAAY,GAAG,YAAY,CAAC;IACzD,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,WAAW,CAwGxC,CAAC;AAEF,eAAe,MAAM,CAAC"}
|
package/lib/Slider.js
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React, { useEffect, useRef } from 'react';
|
|
3
|
+
/**
|
|
4
|
+
* Material Design 3 Slider component
|
|
5
|
+
*
|
|
6
|
+
* @param props SliderProps
|
|
7
|
+
* @param props.id Input id attribute
|
|
8
|
+
* @param props.name Input name attribute
|
|
9
|
+
* @param props.min Minimum value
|
|
10
|
+
* @param props.max Maximum value
|
|
11
|
+
* @param props.step Step increment
|
|
12
|
+
* @param props.value Current value
|
|
13
|
+
* @param props.size Size variant: 'xs', 'sm', or 'md'
|
|
14
|
+
* @param props.orientation Orientation: 'horizontal', 'top-bottom', or 'bottom-top'
|
|
15
|
+
* @param props.showValueIndicator Show value indicator
|
|
16
|
+
* @param props.options Datalist options array
|
|
17
|
+
* @param props.options[].value Option value
|
|
18
|
+
* @param props.options[].key Optional unique key for the option
|
|
19
|
+
* @param props.onChange Change handler function
|
|
20
|
+
* @param props.className Additional CSS class names
|
|
21
|
+
* @param props.style Custom inline styles
|
|
22
|
+
* @returns JSX.Element
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* <Slider
|
|
26
|
+
* value={50}
|
|
27
|
+
* min={0}
|
|
28
|
+
* max={100}
|
|
29
|
+
* step={10}
|
|
30
|
+
* showValueIndicator
|
|
31
|
+
* options={[
|
|
32
|
+
* { value: 0 },
|
|
33
|
+
* { value: 25 },
|
|
34
|
+
* { value: 50 },
|
|
35
|
+
* { value: 75 },
|
|
36
|
+
* { value: 100 }
|
|
37
|
+
* ]}
|
|
38
|
+
* onChange={(value) => console.log(value)}
|
|
39
|
+
* style={{ width: "16em"}}
|
|
40
|
+
* />
|
|
41
|
+
*
|
|
42
|
+
* @example
|
|
43
|
+
* <Slider
|
|
44
|
+
* value={30}
|
|
45
|
+
* orientation="top-bottom"
|
|
46
|
+
* size="md"
|
|
47
|
+
* style={{ height: "16em"}}
|
|
48
|
+
* />
|
|
49
|
+
*/
|
|
50
|
+
export const Slider = ({ id, name, min = 0, max = 100, step = 1, value, size = 'sm', orientation = 'horizontal', showValueIndicator = false, options = [], onChange, className = '', style = {}, }) => {
|
|
51
|
+
const sliderRef = useRef(null);
|
|
52
|
+
const inputRef = useRef(null);
|
|
53
|
+
// Update progress and datalist on value change
|
|
54
|
+
useEffect(() => {
|
|
55
|
+
if (!sliderRef.current || !inputRef.current)
|
|
56
|
+
return;
|
|
57
|
+
const valueRatio = (value - min) / (max - min);
|
|
58
|
+
const ratio = `${max > min ? valueRatio * 100 : 0}%`;
|
|
59
|
+
sliderRef.current.style.setProperty('--slider-progress', ratio);
|
|
60
|
+
Object.entries(style).forEach(([key, value]) => {
|
|
61
|
+
sliderRef.current?.style.setProperty(key, value);
|
|
62
|
+
});
|
|
63
|
+
// Update datalist options
|
|
64
|
+
if (options.length > 0) {
|
|
65
|
+
const datalistOptions = sliderRef.current.querySelectorAll('.option');
|
|
66
|
+
datalistOptions.forEach((option) => {
|
|
67
|
+
const optionValue = Number(option.getAttribute('value'));
|
|
68
|
+
if (optionValue < value) {
|
|
69
|
+
option.classList.add('lower');
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
option.classList.remove('lower');
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
if (showValueIndicator) {
|
|
77
|
+
const indicator = sliderRef.current.querySelector('.value-indicator');
|
|
78
|
+
if (indicator) {
|
|
79
|
+
const inputRect = inputRef.current.getBoundingClientRect();
|
|
80
|
+
const sliderRect = sliderRef.current.getBoundingClientRect();
|
|
81
|
+
// Position the indicator
|
|
82
|
+
indicator.style.left = `${(inputRect.left - sliderRect.left) * 3 + (inputRect.width - (inputRect.left - sliderRect.left) * 3) * valueRatio}px`;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}, [value, min, max, options, style, showValueIndicator]);
|
|
86
|
+
const handleInput = (e) => {
|
|
87
|
+
const newValue = Number(e.target.value);
|
|
88
|
+
if (onChange) {
|
|
89
|
+
onChange(newValue);
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
const classes = [
|
|
93
|
+
'slider',
|
|
94
|
+
size !== 'sm' ? size : '',
|
|
95
|
+
orientation !== 'horizontal' ? orientation : '',
|
|
96
|
+
className,
|
|
97
|
+
]
|
|
98
|
+
.filter(Boolean)
|
|
99
|
+
.join(' ');
|
|
100
|
+
const datalistId = id ? `${id}-list` : undefined;
|
|
101
|
+
return (_jsxs("div", { ref: sliderRef, className: classes, children: [showValueIndicator && _jsx("div", { className: "value-indicator", children: value }), _jsx("input", { ref: inputRef, id: id, name: name, type: "range", min: min, max: max, step: step, value: value, onChange: handleInput, list: datalistId }), options.length > 0 && (_jsx("div", { className: "datalist", id: datalistId, children: options.map((option) => (_jsx("div", { className: "option", "data-key": option.key ?? option.value, "data-value": option.value }, option.key ?? option.value))) }))] }));
|
|
102
|
+
};
|
|
103
|
+
export default Slider;
|
|
104
|
+
//# sourceMappingURL=Slider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Slider.js","sourceRoot":"","sources":["../src/components/Slider.tsx"],"names":[],"mappings":"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"}
|
package/lib/Tabs.d.ts
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import React, { type ReactNode, type CSSProperties } from 'react';
|
|
2
|
+
export interface TabItemProps {
|
|
3
|
+
key?: string | number;
|
|
4
|
+
id?: string;
|
|
5
|
+
label: string;
|
|
6
|
+
leadingIcon?: ReactNode;
|
|
7
|
+
active?: boolean;
|
|
8
|
+
disabled?: boolean;
|
|
9
|
+
onClick?: () => void;
|
|
10
|
+
href?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface TabsProps {
|
|
13
|
+
id?: string;
|
|
14
|
+
items: Iterable<TabItemProps>;
|
|
15
|
+
style?: CSSProperties;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Material Design 3 Tabs component
|
|
19
|
+
*
|
|
20
|
+
* @param props TabsProps
|
|
21
|
+
* @param props.id Element id
|
|
22
|
+
* @param props.items Array of TabItem configurations
|
|
23
|
+
* @param props.items[].key Unique key for the item
|
|
24
|
+
* @param props.items[].id Element id for the item
|
|
25
|
+
* @param props.items[].label Label text
|
|
26
|
+
* @param props.items[].leadingIcon Leading icon element
|
|
27
|
+
* @param props.items[].active Active state
|
|
28
|
+
* @param props.items[].disabled Disabled state
|
|
29
|
+
* @param props.items[].onClick Click handler
|
|
30
|
+
* @param props.items[].href Link URL (renders as anchor tag)
|
|
31
|
+
* @param props.style Custom inline styles
|
|
32
|
+
* @returns JSX.Element
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* <Tabs
|
|
36
|
+
* id="example-tabs"
|
|
37
|
+
* items={[
|
|
38
|
+
* {
|
|
39
|
+
* leadingIcon: {<svg>...</svg>},
|
|
40
|
+
* label: "Item 1",
|
|
41
|
+
* },
|
|
42
|
+
* {
|
|
43
|
+
* label: "Item 2",
|
|
44
|
+
* },
|
|
45
|
+
* ]}
|
|
46
|
+
* />
|
|
47
|
+
*/
|
|
48
|
+
export declare const Tabs: React.FC<TabsProps>;
|
|
49
|
+
export default Tabs;
|
|
50
|
+
//# sourceMappingURL=Tabs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tabs.d.ts","sourceRoot":"","sources":["../src/components/Tabs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAElE,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC9B,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAyBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,eAAO,MAAM,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,SAAS,CAQpC,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
package/lib/Tabs.js
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import React, {} from 'react';
|
|
3
|
+
const TabItem = ({ key, id, leadingIcon, label, active = false, onClick, href, }) => {
|
|
4
|
+
const classes = [active ? 'active' : ''].join(' ');
|
|
5
|
+
return href ? (_jsxs("a", { id: id, className: classes, href: href, children: [leadingIcon, label] }, key)) : (_jsxs("button", { id: id, className: classes, onClick: onClick, children: [leadingIcon, label] }, key));
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Material Design 3 Tabs component
|
|
9
|
+
*
|
|
10
|
+
* @param props TabsProps
|
|
11
|
+
* @param props.id Element id
|
|
12
|
+
* @param props.items Array of TabItem configurations
|
|
13
|
+
* @param props.items[].key Unique key for the item
|
|
14
|
+
* @param props.items[].id Element id for the item
|
|
15
|
+
* @param props.items[].label Label text
|
|
16
|
+
* @param props.items[].leadingIcon Leading icon element
|
|
17
|
+
* @param props.items[].active Active state
|
|
18
|
+
* @param props.items[].disabled Disabled state
|
|
19
|
+
* @param props.items[].onClick Click handler
|
|
20
|
+
* @param props.items[].href Link URL (renders as anchor tag)
|
|
21
|
+
* @param props.style Custom inline styles
|
|
22
|
+
* @returns JSX.Element
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* <Tabs
|
|
26
|
+
* id="example-tabs"
|
|
27
|
+
* items={[
|
|
28
|
+
* {
|
|
29
|
+
* leadingIcon: {<svg>...</svg>},
|
|
30
|
+
* label: "Item 1",
|
|
31
|
+
* },
|
|
32
|
+
* {
|
|
33
|
+
* label: "Item 2",
|
|
34
|
+
* },
|
|
35
|
+
* ]}
|
|
36
|
+
* />
|
|
37
|
+
*/
|
|
38
|
+
export const Tabs = ({ id, items = [], style = {} }) => {
|
|
39
|
+
return (_jsx("div", { id: id, className: "tabs", style: style, children: Array.from(items).map((item, index) => (_jsx(TabItem, { ...item }, item.key || index))) }));
|
|
40
|
+
};
|
|
41
|
+
export default Tabs;
|
|
42
|
+
//# sourceMappingURL=Tabs.js.map
|
package/lib/Tabs.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tabs.js","sourceRoot":"","sources":["../src/components/Tabs.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,EAAsC,MAAM,OAAO,CAAC;AAmBlE,MAAM,OAAO,GAA2B,CAAC,EACvC,GAAG,EACH,EAAE,EACF,WAAW,EACX,KAAK,EACL,MAAM,GAAG,KAAK,EACd,OAAO,EACP,IAAI,GACL,EAAE,EAAE;IACH,MAAM,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnD,OAAO,IAAI,CAAC,CAAC,CAAC,CACZ,aAAa,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,aAChD,WAAW,EACX,KAAK,KAFA,GAAG,CAGP,CACL,CAAC,CAAC,CAAC,CACF,kBAAkB,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,aAC3D,WAAW,EACX,KAAK,KAFK,GAAG,CAGP,CACV,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,CAAC,MAAM,IAAI,GAAwB,CAAC,EAAE,EAAE,EAAE,KAAK,GAAG,EAAE,EAAE,KAAK,GAAG,EAAE,EAAE,EAAE,EAAE;IAC1E,OAAO,CACL,cAAK,EAAE,EAAE,EAAE,EAAE,SAAS,EAAC,MAAM,EAAC,KAAK,EAAE,KAAK,YACvC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CACtC,KAAC,OAAO,OAA6B,IAAI,IAA3B,IAAI,CAAC,GAAG,IAAI,KAAK,CAAc,CAC9C,CAAC,GACE,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,IAAI,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import React, { type ReactNode, type CSSProperties } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* TextField component props
|
|
4
|
+
*/
|
|
5
|
+
export interface TextFieldProps {
|
|
6
|
+
id?: string;
|
|
7
|
+
name?: string;
|
|
8
|
+
variant?: 'filled' | 'outlined';
|
|
9
|
+
type?: 'text' | 'email' | 'number' | 'password' | 'tel' | 'url';
|
|
10
|
+
label: string;
|
|
11
|
+
placeholder?: string;
|
|
12
|
+
value?: string | number;
|
|
13
|
+
error?: boolean;
|
|
14
|
+
disabled?: boolean;
|
|
15
|
+
supportingText?: string;
|
|
16
|
+
leadingIcon?: ReactNode;
|
|
17
|
+
trailingIcon?: ReactNode;
|
|
18
|
+
onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;
|
|
19
|
+
onBlur?: (e: React.FocusEvent<HTMLInputElement>) => void;
|
|
20
|
+
onFocus?: (e: React.FocusEvent<HTMLInputElement>) => void;
|
|
21
|
+
className?: string;
|
|
22
|
+
style?: CSSProperties;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Material Design 3 TextField component
|
|
26
|
+
*
|
|
27
|
+
* @param props TextFieldProps
|
|
28
|
+
* @param props.id Input id attribute
|
|
29
|
+
* @param props.name Input name attribute
|
|
30
|
+
* @param props.variant Variant of the text field: 'filled' or 'outlined'
|
|
31
|
+
* @param props.type Input type: 'text', 'email', 'number', 'password', 'tel', or 'url'
|
|
32
|
+
* @param props.label Label text
|
|
33
|
+
* @param props.placeholder Placeholder text (should match label)
|
|
34
|
+
* @param props.value Current value
|
|
35
|
+
* @param props.error Error state
|
|
36
|
+
* @param props.disabled Disabled state
|
|
37
|
+
* @param props.supportingText Supporting text or error message
|
|
38
|
+
* @param props.leadingIcon Leading icon element
|
|
39
|
+
* @param props.trailingIcon Trailing icon element
|
|
40
|
+
* @param props.onChange Change handler
|
|
41
|
+
* @param props.onBlur Blur handler
|
|
42
|
+
* @param props.onFocus Focus handler
|
|
43
|
+
* @param props.className Additional CSS class names
|
|
44
|
+
* @param props.style Custom inline styles
|
|
45
|
+
* @returns JSX.Element
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* <TextField
|
|
49
|
+
* variant="filled"
|
|
50
|
+
* label="Email"
|
|
51
|
+
* placeholder="Email"
|
|
52
|
+
* type="email"
|
|
53
|
+
* supportingText="Enter your email address"
|
|
54
|
+
* />
|
|
55
|
+
*
|
|
56
|
+
* @example
|
|
57
|
+
* <TextField
|
|
58
|
+
* variant="outlined"
|
|
59
|
+
* label="Password"
|
|
60
|
+
* placeholder="Password"
|
|
61
|
+
* type="password"
|
|
62
|
+
* error={true}
|
|
63
|
+
* supportingText="Password is required"
|
|
64
|
+
* />
|
|
65
|
+
*/
|
|
66
|
+
export declare const TextField: React.FC<TextFieldProps>;
|
|
67
|
+
export default TextField;
|
|
68
|
+
//# sourceMappingURL=TextField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextField.d.ts","sourceRoot":"","sources":["../src/components/TextField.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAElE;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;IAChC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,GAAG,KAAK,CAAC;IAChE,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,YAAY,CAAC,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IAC5D,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IACzD,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,cAAc,CAyC9C,CAAC;AAEF,eAAe,SAAS,CAAC"}
|
package/lib/TextField.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React, {} from 'react';
|
|
3
|
+
/**
|
|
4
|
+
* Material Design 3 TextField component
|
|
5
|
+
*
|
|
6
|
+
* @param props TextFieldProps
|
|
7
|
+
* @param props.id Input id attribute
|
|
8
|
+
* @param props.name Input name attribute
|
|
9
|
+
* @param props.variant Variant of the text field: 'filled' or 'outlined'
|
|
10
|
+
* @param props.type Input type: 'text', 'email', 'number', 'password', 'tel', or 'url'
|
|
11
|
+
* @param props.label Label text
|
|
12
|
+
* @param props.placeholder Placeholder text (should match label)
|
|
13
|
+
* @param props.value Current value
|
|
14
|
+
* @param props.error Error state
|
|
15
|
+
* @param props.disabled Disabled state
|
|
16
|
+
* @param props.supportingText Supporting text or error message
|
|
17
|
+
* @param props.leadingIcon Leading icon element
|
|
18
|
+
* @param props.trailingIcon Trailing icon element
|
|
19
|
+
* @param props.onChange Change handler
|
|
20
|
+
* @param props.onBlur Blur handler
|
|
21
|
+
* @param props.onFocus Focus handler
|
|
22
|
+
* @param props.className Additional CSS class names
|
|
23
|
+
* @param props.style Custom inline styles
|
|
24
|
+
* @returns JSX.Element
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* <TextField
|
|
28
|
+
* variant="filled"
|
|
29
|
+
* label="Email"
|
|
30
|
+
* placeholder="Email"
|
|
31
|
+
* type="email"
|
|
32
|
+
* supportingText="Enter your email address"
|
|
33
|
+
* />
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* <TextField
|
|
37
|
+
* variant="outlined"
|
|
38
|
+
* label="Password"
|
|
39
|
+
* placeholder="Password"
|
|
40
|
+
* type="password"
|
|
41
|
+
* error={true}
|
|
42
|
+
* supportingText="Password is required"
|
|
43
|
+
* />
|
|
44
|
+
*/
|
|
45
|
+
export const TextField = ({ id, name, variant = 'outlined', type = 'text', label, value, error = false, disabled = false, supportingText, leadingIcon, trailingIcon, onChange, onBlur, onFocus, className = '', style = {}, }) => {
|
|
46
|
+
const classes = ['textfield', variant, error ? 'error' : '', className]
|
|
47
|
+
.filter(Boolean)
|
|
48
|
+
.join(' ');
|
|
49
|
+
return (_jsxs("div", { className: classes, style: style, children: [leadingIcon && leadingIcon, _jsx("label", { children: label }), _jsx("input", { id: id, name: name, type: type, value: value, placeholder: label, disabled: disabled, onChange: onChange, onBlur: onBlur, onFocus: onFocus }), trailingIcon && trailingIcon, supportingText && _jsx("div", { children: supportingText })] }));
|
|
50
|
+
};
|
|
51
|
+
export default TextField;
|
|
52
|
+
//# sourceMappingURL=TextField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TextField.js","sourceRoot":"","sources":["../src/components/TextField.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,EAAsC,MAAM,OAAO,CAAC;AAyBlE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,MAAM,CAAC,MAAM,SAAS,GAA6B,CAAC,EAClD,EAAE,EACF,IAAI,EACJ,OAAO,GAAG,UAAU,EACpB,IAAI,GAAG,MAAM,EACb,KAAK,EACL,KAAK,EACL,KAAK,GAAG,KAAK,EACb,QAAQ,GAAG,KAAK,EAChB,cAAc,EACd,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,MAAM,EACN,OAAO,EACP,SAAS,GAAG,EAAE,EACd,KAAK,GAAG,EAAE,GACX,EAAE,EAAE;IACH,MAAM,OAAO,GAAG,CAAC,WAAW,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,SAAS,CAAC;SACpE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,GAAG,CAAC,CAAC;IAEb,OAAO,CACL,eAAK,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,aAClC,WAAW,IAAI,WAAW,EAC3B,0BAAQ,KAAK,GAAS,EACtB,gBACE,EAAE,EAAE,EAAE,EACN,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,KAAK,EACZ,WAAW,EAAE,KAAK,EAClB,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,OAAO,GAChB,EACD,YAAY,IAAI,YAAY,EAC5B,cAAc,IAAI,wBAAM,cAAc,GAAO,IAC1C,CACP,CAAC;AACJ,CAAC,CAAC;AAEF,eAAe,SAAS,CAAC"}
|
package/lib/Toolbar.d.ts
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import React, { type ReactNode, type CSSProperties } from 'react';
|
|
2
|
+
export interface ToolbarItemProps {
|
|
3
|
+
key?: string | number;
|
|
4
|
+
id?: string;
|
|
5
|
+
label?: string;
|
|
6
|
+
icon?: ReactNode;
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
onClick?: () => void;
|
|
9
|
+
href?: string;
|
|
10
|
+
toggle?: boolean;
|
|
11
|
+
checked?: boolean;
|
|
12
|
+
primary?: boolean;
|
|
13
|
+
fab?: boolean;
|
|
14
|
+
}
|
|
15
|
+
export interface ToolbarProps {
|
|
16
|
+
id?: string;
|
|
17
|
+
items: Iterable<ToolbarItemProps>;
|
|
18
|
+
variant?: 'docked' | 'floating';
|
|
19
|
+
color?: 'standard' | 'vibrant';
|
|
20
|
+
style?: CSSProperties;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Material Design 3 Toolbar component
|
|
24
|
+
*
|
|
25
|
+
* @param props ToolbarProps
|
|
26
|
+
* @param props.id Element id
|
|
27
|
+
* @param props.items Array of ToolbarItem configurations
|
|
28
|
+
* @param props.items[].key Unique key for the item
|
|
29
|
+
* @param props.items[].id Element id for the item
|
|
30
|
+
* @param props.items[].label Label text
|
|
31
|
+
* @param props.items[].icon Icon element
|
|
32
|
+
* @param props.items[].disabled Disabled state
|
|
33
|
+
* @param props.items[].onClick Click handler
|
|
34
|
+
* @param props.items[].href Link URL (renders as anchor tag)
|
|
35
|
+
* @param props.items[].toggle Renders as toggle button if true
|
|
36
|
+
* @param props.items[].checked Toggle button checked state
|
|
37
|
+
* @param props.items[].primary Primary button styling if true
|
|
38
|
+
* @param props.items[].fab Renders as floating action button if true on floating toolbars
|
|
39
|
+
* @param props.variant Toolbar variant: 'docked' or 'floating'
|
|
40
|
+
* @param props.color Toolbar color scheme: 'standard' or 'vibrant'
|
|
41
|
+
* @param props.style Custom inline styles
|
|
42
|
+
* @returns JSX.Element
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* <Toolbar
|
|
46
|
+
* id="example-toolbar"
|
|
47
|
+
* items={[
|
|
48
|
+
* {
|
|
49
|
+
* icon: {<svg>...</svg>},
|
|
50
|
+
* onClick: () => {},
|
|
51
|
+
* },
|
|
52
|
+
* { divider: true },
|
|
53
|
+
* {
|
|
54
|
+
* icon: {<svg>...</svg>},
|
|
55
|
+
* href: "...",
|
|
56
|
+
* },
|
|
57
|
+
* ]}
|
|
58
|
+
* />
|
|
59
|
+
*/
|
|
60
|
+
export declare const Toolbar: React.FC<ToolbarProps>;
|
|
61
|
+
export default Toolbar;
|
|
62
|
+
//# sourceMappingURL=Toolbar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Toolbar.d.ts","sourceRoot":"","sources":["../src/components/Toolbar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,MAAM,OAAO,CAAC;AAElE,MAAM,WAAW,gBAAgB;IAC/B,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,SAAS,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IAClC,OAAO,CAAC,EAAE,QAAQ,GAAG,UAAU,CAAC;IAChC,KAAK,CAAC,EAAE,UAAU,GAAG,SAAS,CAAC;IAC/B,KAAK,CAAC,EAAE,aAAa,CAAC;CACvB;AAoDD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,eAAO,MAAM,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,YAAY,CA+B1C,CAAC;AAEF,eAAe,OAAO,CAAC"}
|
package/lib/Toolbar.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React, {} from 'react';
|
|
3
|
+
const ToolbarItem = ({ key, id, label, icon, disabled = false, onClick, href, toggle = false, checked = false, primary = false, fab = false, }) => {
|
|
4
|
+
const classes = [disabled ? 'disabled' : '', primary ? 'primary' : ''].join(' ');
|
|
5
|
+
return fab ? (_jsx("button", { id: id, className: `fab sm`, disabled: disabled, onClick: onClick, children: icon }, key)) : toggle ? (_jsxs("label", { id: id, className: classes, children: [_jsx("input", { type: "checkbox", disabled: disabled, onClick: onClick, checked: checked }), icon, label] }, key)) : href ? (_jsxs("a", { id: id, className: classes, href: href, children: [icon, label] }, key)) : (_jsxs("button", { id: id, className: classes, onClick: onClick, children: [icon, label] }, key));
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Material Design 3 Toolbar component
|
|
9
|
+
*
|
|
10
|
+
* @param props ToolbarProps
|
|
11
|
+
* @param props.id Element id
|
|
12
|
+
* @param props.items Array of ToolbarItem configurations
|
|
13
|
+
* @param props.items[].key Unique key for the item
|
|
14
|
+
* @param props.items[].id Element id for the item
|
|
15
|
+
* @param props.items[].label Label text
|
|
16
|
+
* @param props.items[].icon Icon element
|
|
17
|
+
* @param props.items[].disabled Disabled state
|
|
18
|
+
* @param props.items[].onClick Click handler
|
|
19
|
+
* @param props.items[].href Link URL (renders as anchor tag)
|
|
20
|
+
* @param props.items[].toggle Renders as toggle button if true
|
|
21
|
+
* @param props.items[].checked Toggle button checked state
|
|
22
|
+
* @param props.items[].primary Primary button styling if true
|
|
23
|
+
* @param props.items[].fab Renders as floating action button if true on floating toolbars
|
|
24
|
+
* @param props.variant Toolbar variant: 'docked' or 'floating'
|
|
25
|
+
* @param props.color Toolbar color scheme: 'standard' or 'vibrant'
|
|
26
|
+
* @param props.style Custom inline styles
|
|
27
|
+
* @returns JSX.Element
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* <Toolbar
|
|
31
|
+
* id="example-toolbar"
|
|
32
|
+
* items={[
|
|
33
|
+
* {
|
|
34
|
+
* icon: {<svg>...</svg>},
|
|
35
|
+
* onClick: () => {},
|
|
36
|
+
* },
|
|
37
|
+
* { divider: true },
|
|
38
|
+
* {
|
|
39
|
+
* icon: {<svg>...</svg>},
|
|
40
|
+
* href: "...",
|
|
41
|
+
* },
|
|
42
|
+
* ]}
|
|
43
|
+
* />
|
|
44
|
+
*/
|
|
45
|
+
export const Toolbar = ({ id, items = [], style, variant = 'docked', color = 'standard', }) => {
|
|
46
|
+
const classes = ['toolbar', variant, color].join(' ');
|
|
47
|
+
return variant === 'floating' ? (_jsxs("div", { className: "toolbar-container", style: style, children: [_jsx("div", { id: id, className: classes, children: Array.from(items)
|
|
48
|
+
.filter((item) => !item.fab)
|
|
49
|
+
.map((item, index) => (_jsx(ToolbarItem, { ...item }, item.key || index))) }), Array.from(items)
|
|
50
|
+
.filter((item) => item.fab)
|
|
51
|
+
.map((item, index) => (_jsx(ToolbarItem, { ...item }, item.key || index)))] })) : (_jsx("div", { id: id, className: classes, style: style, children: Array.from(items).map((item, index) => (_jsx(ToolbarItem, { ...item, fab: false }, item.key || index))) }));
|
|
52
|
+
};
|
|
53
|
+
export default Toolbar;
|
|
54
|
+
//# sourceMappingURL=Toolbar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Toolbar.js","sourceRoot":"","sources":["../src/components/Toolbar.tsx"],"names":[],"mappings":"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"}
|