@tonyarbor/components 0.2.0 → 0.4.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/dist/Avatar.d.mts +42 -0
- package/dist/Avatar.d.ts +42 -0
- package/dist/Avatar.js +158 -0
- package/dist/Avatar.js.map +1 -0
- package/dist/Avatar.mjs +7 -0
- package/dist/Avatar.mjs.map +1 -0
- package/dist/Banner.d.mts +59 -0
- package/dist/Banner.d.ts +59 -0
- package/dist/Banner.js +222 -0
- package/dist/Banner.js.map +1 -0
- package/dist/Banner.mjs +7 -0
- package/dist/Banner.mjs.map +1 -0
- package/dist/Breadcrumbs.d.mts +51 -0
- package/dist/Breadcrumbs.d.ts +51 -0
- package/dist/Breadcrumbs.js +276 -0
- package/dist/Breadcrumbs.js.map +1 -0
- package/dist/Breadcrumbs.mjs +7 -0
- package/dist/Breadcrumbs.mjs.map +1 -0
- package/dist/Checkbox.d.mts +4 -0
- package/dist/Checkbox.d.ts +4 -0
- package/dist/Checkbox.js +45 -16
- package/dist/Checkbox.js.map +1 -1
- package/dist/Checkbox.mjs +1 -1
- package/dist/DatePicker.d.mts +68 -0
- package/dist/DatePicker.d.ts +68 -0
- package/dist/DatePicker.js +490 -0
- package/dist/DatePicker.js.map +1 -0
- package/dist/DatePicker.mjs +7 -0
- package/dist/DatePicker.mjs.map +1 -0
- package/dist/Pagination.d.mts +36 -0
- package/dist/Pagination.d.ts +36 -0
- package/dist/Pagination.js +301 -0
- package/dist/Pagination.js.map +1 -0
- package/dist/Pagination.mjs +7 -0
- package/dist/Pagination.mjs.map +1 -0
- package/dist/Radio.js +32 -12
- package/dist/Radio.js.map +1 -1
- package/dist/Radio.mjs +1 -1
- package/dist/SearchGlobal.d.mts +45 -0
- package/dist/SearchGlobal.d.ts +45 -0
- package/dist/SearchGlobal.js +209 -0
- package/dist/SearchGlobal.js.map +1 -0
- package/dist/SearchGlobal.mjs +7 -0
- package/dist/SearchGlobal.mjs.map +1 -0
- package/dist/SearchOnPage.d.mts +45 -0
- package/dist/SearchOnPage.d.ts +45 -0
- package/dist/SearchOnPage.js +171 -0
- package/dist/SearchOnPage.js.map +1 -0
- package/dist/SearchOnPage.mjs +7 -0
- package/dist/SearchOnPage.mjs.map +1 -0
- package/dist/Table.d.mts +80 -0
- package/dist/Table.d.ts +80 -0
- package/dist/Table.js +347 -0
- package/dist/Table.js.map +1 -0
- package/dist/Table.mjs +8 -0
- package/dist/Table.mjs.map +1 -0
- package/dist/TableControls.d.mts +76 -0
- package/dist/TableControls.d.ts +76 -0
- package/dist/TableControls.js +461 -0
- package/dist/TableControls.js.map +1 -0
- package/dist/TableControls.mjs +7 -0
- package/dist/TableControls.mjs.map +1 -0
- package/dist/TableFooterPagination.d.mts +56 -0
- package/dist/TableFooterPagination.d.ts +56 -0
- package/dist/TableFooterPagination.js +499 -0
- package/dist/TableFooterPagination.js.map +1 -0
- package/dist/TableFooterPagination.mjs +7 -0
- package/dist/TableFooterPagination.mjs.map +1 -0
- package/dist/Tabs.d.mts +50 -0
- package/dist/Tabs.d.ts +50 -0
- package/dist/Tabs.js +187 -0
- package/dist/Tabs.js.map +1 -0
- package/dist/Tabs.mjs +7 -0
- package/dist/Tabs.mjs.map +1 -0
- package/dist/TextArea.d.mts +64 -0
- package/dist/TextArea.d.ts +64 -0
- package/dist/TextArea.js +171 -0
- package/dist/TextArea.js.map +1 -0
- package/dist/TextArea.mjs +7 -0
- package/dist/TextArea.mjs.map +1 -0
- package/dist/Toast.d.mts +48 -0
- package/dist/Toast.d.ts +48 -0
- package/dist/Toast.js +169 -0
- package/dist/Toast.js.map +1 -0
- package/dist/Toast.mjs +7 -0
- package/dist/Toast.mjs.map +1 -0
- package/dist/Toggle.d.mts +48 -0
- package/dist/Toggle.d.ts +48 -0
- package/dist/Toggle.js +291 -0
- package/dist/Toggle.js.map +1 -0
- package/dist/Toggle.mjs +7 -0
- package/dist/Toggle.mjs.map +1 -0
- package/dist/Tooltip.d.mts +32 -0
- package/dist/Tooltip.d.ts +32 -0
- package/dist/Tooltip.js +109 -0
- package/dist/Tooltip.js.map +1 -0
- package/dist/Tooltip.mjs +7 -0
- package/dist/Tooltip.mjs.map +1 -0
- package/dist/chunk-52TG3BFX.mjs +463 -0
- package/dist/chunk-52TG3BFX.mjs.map +1 -0
- package/dist/chunk-AI2U34CF.mjs +159 -0
- package/dist/chunk-AI2U34CF.mjs.map +1 -0
- package/dist/chunk-B7RX3TPX.mjs +135 -0
- package/dist/chunk-B7RX3TPX.mjs.map +1 -0
- package/dist/chunk-C25FFMRQ.mjs +255 -0
- package/dist/chunk-C25FFMRQ.mjs.map +1 -0
- package/dist/{chunk-BCYJIUQX.mjs → chunk-CUTYEIFE.mjs} +47 -18
- package/dist/chunk-CUTYEIFE.mjs.map +1 -0
- package/dist/chunk-DULH2KRW.mjs +133 -0
- package/dist/chunk-DULH2KRW.mjs.map +1 -0
- package/dist/chunk-G5NVKF2G.mjs +434 -0
- package/dist/chunk-G5NVKF2G.mjs.map +1 -0
- package/dist/chunk-JSG27ZZS.mjs +122 -0
- package/dist/chunk-JSG27ZZS.mjs.map +1 -0
- package/dist/{chunk-ARBHNHO7.mjs → chunk-M6DVBEEL.mjs} +33 -13
- package/dist/chunk-M6DVBEEL.mjs.map +1 -0
- package/dist/chunk-MBUMR2XJ.mjs +135 -0
- package/dist/chunk-MBUMR2XJ.mjs.map +1 -0
- package/dist/chunk-MNH2TGUX.mjs +73 -0
- package/dist/chunk-MNH2TGUX.mjs.map +1 -0
- package/dist/chunk-RQP6ZGD7.mjs +240 -0
- package/dist/chunk-RQP6ZGD7.mjs.map +1 -0
- package/dist/chunk-RRMG2SSZ.mjs +265 -0
- package/dist/chunk-RRMG2SSZ.mjs.map +1 -0
- package/dist/chunk-U4JXKZZG.mjs +186 -0
- package/dist/chunk-U4JXKZZG.mjs.map +1 -0
- package/dist/chunk-UPBHDBAK.mjs +173 -0
- package/dist/chunk-UPBHDBAK.mjs.map +1 -0
- package/dist/chunk-W55QJIAN.mjs +467 -0
- package/dist/chunk-W55QJIAN.mjs.map +1 -0
- package/dist/chunk-YV4OXFIM.mjs +151 -0
- package/dist/chunk-YV4OXFIM.mjs.map +1 -0
- package/dist/index.d.mts +15 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +3414 -30
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +63 -3
- package/package.json +78 -1
- package/dist/chunk-ARBHNHO7.mjs.map +0 -1
- package/dist/chunk-BCYJIUQX.mjs.map +0 -1
package/dist/Tabs.d.ts
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
interface TabItem {
|
|
4
|
+
/**
|
|
5
|
+
* The label text for the tab
|
|
6
|
+
*/
|
|
7
|
+
label: string;
|
|
8
|
+
/**
|
|
9
|
+
* Optional icon component
|
|
10
|
+
*/
|
|
11
|
+
icon?: React.ReactNode;
|
|
12
|
+
/**
|
|
13
|
+
* Value to identify this tab
|
|
14
|
+
*/
|
|
15
|
+
value: string;
|
|
16
|
+
}
|
|
17
|
+
interface TabsProps {
|
|
18
|
+
/**
|
|
19
|
+
* Array of tab items to display
|
|
20
|
+
*/
|
|
21
|
+
tabs: TabItem[];
|
|
22
|
+
/**
|
|
23
|
+
* Currently active tab value
|
|
24
|
+
*/
|
|
25
|
+
activeTab?: string;
|
|
26
|
+
/**
|
|
27
|
+
* Callback when tab is clicked
|
|
28
|
+
*/
|
|
29
|
+
onTabChange?: (value: string) => void;
|
|
30
|
+
/**
|
|
31
|
+
* Custom className
|
|
32
|
+
*/
|
|
33
|
+
className?: string;
|
|
34
|
+
/**
|
|
35
|
+
* Custom style
|
|
36
|
+
*/
|
|
37
|
+
style?: React.CSSProperties;
|
|
38
|
+
/**
|
|
39
|
+
* Test ID for testing
|
|
40
|
+
*/
|
|
41
|
+
'data-testid'?: string;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Tabs component - Arbor Design System
|
|
45
|
+
*
|
|
46
|
+
* Horizontal tabs with support for icons and various states.
|
|
47
|
+
*/
|
|
48
|
+
declare const Tabs: React.ForwardRefExoticComponent<TabsProps & React.RefAttributes<HTMLDivElement>>;
|
|
49
|
+
|
|
50
|
+
export { type TabItem, Tabs, type TabsProps };
|
package/dist/Tabs.js
ADDED
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
|
|
30
|
+
// src/Tabs/index.ts
|
|
31
|
+
var Tabs_exports = {};
|
|
32
|
+
__export(Tabs_exports, {
|
|
33
|
+
Tabs: () => Tabs
|
|
34
|
+
});
|
|
35
|
+
module.exports = __toCommonJS(Tabs_exports);
|
|
36
|
+
|
|
37
|
+
// src/Tabs/Tabs.tsx
|
|
38
|
+
var React = __toESM(require("react"));
|
|
39
|
+
var import_clsx = require("clsx");
|
|
40
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
41
|
+
var tabsContainerStyles = {
|
|
42
|
+
display: "flex",
|
|
43
|
+
alignItems: "flex-start",
|
|
44
|
+
gap: "12px",
|
|
45
|
+
borderBottom: "1px solid #f8f8f8",
|
|
46
|
+
paddingBottom: "1px",
|
|
47
|
+
width: "100%"
|
|
48
|
+
};
|
|
49
|
+
var tabItemWrapperStyles = {
|
|
50
|
+
display: "flex",
|
|
51
|
+
flexDirection: "column",
|
|
52
|
+
alignItems: "center",
|
|
53
|
+
cursor: "pointer",
|
|
54
|
+
position: "relative"
|
|
55
|
+
};
|
|
56
|
+
var tabItemStyles = {
|
|
57
|
+
display: "flex",
|
|
58
|
+
alignItems: "center",
|
|
59
|
+
justifyContent: "center",
|
|
60
|
+
gap: "8px",
|
|
61
|
+
padding: "8px 12px",
|
|
62
|
+
borderRadius: "8px",
|
|
63
|
+
fontSize: "14px",
|
|
64
|
+
lineHeight: "1.5",
|
|
65
|
+
fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif",
|
|
66
|
+
outline: "none",
|
|
67
|
+
transition: "all 0.2s ease-in-out",
|
|
68
|
+
userSelect: "none"
|
|
69
|
+
};
|
|
70
|
+
var underlineStyles = {
|
|
71
|
+
width: "100%",
|
|
72
|
+
height: "2px",
|
|
73
|
+
borderTopLeftRadius: "4px",
|
|
74
|
+
borderTopRightRadius: "4px",
|
|
75
|
+
transition: "background-color 0.2s ease-in-out"
|
|
76
|
+
};
|
|
77
|
+
var Tabs = React.forwardRef(
|
|
78
|
+
({
|
|
79
|
+
tabs,
|
|
80
|
+
activeTab,
|
|
81
|
+
onTabChange,
|
|
82
|
+
className,
|
|
83
|
+
style,
|
|
84
|
+
"data-testid": dataTestId
|
|
85
|
+
}, ref) => {
|
|
86
|
+
const [hoveredTab, setHoveredTab] = React.useState(null);
|
|
87
|
+
const [focusedTab, setFocusedTab] = React.useState(null);
|
|
88
|
+
const currentActiveTab = activeTab || (tabs.length > 0 ? tabs[0].value : "");
|
|
89
|
+
const handleTabClick = (value) => {
|
|
90
|
+
onTabChange?.(value);
|
|
91
|
+
};
|
|
92
|
+
const handleKeyDown = (e, value) => {
|
|
93
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
94
|
+
e.preventDefault();
|
|
95
|
+
handleTabClick(value);
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
99
|
+
"div",
|
|
100
|
+
{
|
|
101
|
+
ref,
|
|
102
|
+
className: (0, import_clsx.clsx)("arbor-tabs", className),
|
|
103
|
+
style: { ...tabsContainerStyles, ...style },
|
|
104
|
+
"data-testid": dataTestId,
|
|
105
|
+
role: "tablist",
|
|
106
|
+
children: tabs.map((tab) => {
|
|
107
|
+
const isActive = tab.value === currentActiveTab;
|
|
108
|
+
const isHovered = tab.value === hoveredTab;
|
|
109
|
+
const isFocused = tab.value === focusedTab;
|
|
110
|
+
const getTextColor = () => {
|
|
111
|
+
if (isActive) {
|
|
112
|
+
return "#0e8a0e";
|
|
113
|
+
}
|
|
114
|
+
if (isHovered) {
|
|
115
|
+
return "#202020";
|
|
116
|
+
}
|
|
117
|
+
return "#2f2f2f";
|
|
118
|
+
};
|
|
119
|
+
const getFontWeight = () => {
|
|
120
|
+
return isActive ? 600 : 500;
|
|
121
|
+
};
|
|
122
|
+
const getUnderlineColor = () => {
|
|
123
|
+
if (isActive) {
|
|
124
|
+
return "#0e8a0e";
|
|
125
|
+
}
|
|
126
|
+
if (isHovered) {
|
|
127
|
+
return "#d1d1d1";
|
|
128
|
+
}
|
|
129
|
+
return "transparent";
|
|
130
|
+
};
|
|
131
|
+
const getBoxShadow = () => {
|
|
132
|
+
if (isFocused) {
|
|
133
|
+
return "0px 0px 0px 3px #3cad51";
|
|
134
|
+
}
|
|
135
|
+
return void 0;
|
|
136
|
+
};
|
|
137
|
+
const tabItemStylesCombined = {
|
|
138
|
+
...tabItemStyles,
|
|
139
|
+
color: getTextColor(),
|
|
140
|
+
fontWeight: getFontWeight(),
|
|
141
|
+
boxShadow: getBoxShadow(),
|
|
142
|
+
backgroundColor: isFocused ? "rgba(255, 255, 255, 0.01)" : "transparent"
|
|
143
|
+
};
|
|
144
|
+
const underlineStylesCombined = {
|
|
145
|
+
...underlineStyles,
|
|
146
|
+
backgroundColor: getUnderlineColor()
|
|
147
|
+
};
|
|
148
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
149
|
+
"div",
|
|
150
|
+
{
|
|
151
|
+
style: tabItemWrapperStyles,
|
|
152
|
+
onMouseEnter: () => setHoveredTab(tab.value),
|
|
153
|
+
onMouseLeave: () => setHoveredTab(null),
|
|
154
|
+
children: [
|
|
155
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
156
|
+
"div",
|
|
157
|
+
{
|
|
158
|
+
role: "tab",
|
|
159
|
+
"aria-selected": isActive,
|
|
160
|
+
tabIndex: isActive ? 0 : -1,
|
|
161
|
+
onClick: () => handleTabClick(tab.value),
|
|
162
|
+
onKeyDown: (e) => handleKeyDown(e, tab.value),
|
|
163
|
+
onFocus: () => setFocusedTab(tab.value),
|
|
164
|
+
onBlur: () => setFocusedTab(null),
|
|
165
|
+
style: tabItemStylesCombined,
|
|
166
|
+
children: [
|
|
167
|
+
tab.icon && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { style: { display: "flex", alignItems: "center" }, children: tab.icon }),
|
|
168
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("span", { children: tab.label })
|
|
169
|
+
]
|
|
170
|
+
}
|
|
171
|
+
),
|
|
172
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: underlineStylesCombined })
|
|
173
|
+
]
|
|
174
|
+
},
|
|
175
|
+
tab.value
|
|
176
|
+
);
|
|
177
|
+
})
|
|
178
|
+
}
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
);
|
|
182
|
+
Tabs.displayName = "Tabs";
|
|
183
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
184
|
+
0 && (module.exports = {
|
|
185
|
+
Tabs
|
|
186
|
+
});
|
|
187
|
+
//# sourceMappingURL=Tabs.js.map
|
package/dist/Tabs.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/Tabs/index.ts","../src/Tabs/Tabs.tsx"],"sourcesContent":["export { Tabs } from './Tabs';\nexport type { TabsProps, TabItem } from './Tabs';\n","import * as React from 'react';\nimport { clsx } from 'clsx';\n\nexport interface TabItem {\n /**\n * The label text for the tab\n */\n label: string;\n /**\n * Optional icon component\n */\n icon?: React.ReactNode;\n /**\n * Value to identify this tab\n */\n value: string;\n}\n\nexport interface TabsProps {\n /**\n * Array of tab items to display\n */\n tabs: TabItem[];\n /**\n * Currently active tab value\n */\n activeTab?: string;\n /**\n * Callback when tab is clicked\n */\n onTabChange?: (value: string) => void;\n /**\n * Custom className\n */\n className?: string;\n /**\n * Custom style\n */\n style?: React.CSSProperties;\n /**\n * Test ID for testing\n */\n 'data-testid'?: string;\n}\n\nconst tabsContainerStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'flex-start',\n gap: '12px',\n borderBottom: '1px solid #f8f8f8',\n paddingBottom: '1px',\n width: '100%',\n};\n\nconst tabItemWrapperStyles: React.CSSProperties = {\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n cursor: 'pointer',\n position: 'relative',\n};\n\nconst tabItemStyles: React.CSSProperties = {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '8px',\n padding: '8px 12px',\n borderRadius: '8px',\n fontSize: '14px',\n lineHeight: '1.5',\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n outline: 'none',\n transition: 'all 0.2s ease-in-out',\n userSelect: 'none' as const,\n};\n\nconst underlineStyles: React.CSSProperties = {\n width: '100%',\n height: '2px',\n borderTopLeftRadius: '4px',\n borderTopRightRadius: '4px',\n transition: 'background-color 0.2s ease-in-out',\n};\n\n/**\n * Tabs component - Arbor Design System\n *\n * Horizontal tabs with support for icons and various states.\n */\nexport const Tabs = React.forwardRef<HTMLDivElement, TabsProps>(\n (\n {\n tabs,\n activeTab,\n onTabChange,\n className,\n style,\n 'data-testid': dataTestId,\n },\n ref\n ) => {\n const [hoveredTab, setHoveredTab] = React.useState<string | null>(null);\n const [focusedTab, setFocusedTab] = React.useState<string | null>(null);\n\n // Determine the active tab (first tab by default)\n const currentActiveTab = activeTab || (tabs.length > 0 ? tabs[0].value : '');\n\n const handleTabClick = (value: string) => {\n onTabChange?.(value);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent, value: string) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleTabClick(value);\n }\n };\n\n return (\n <div\n ref={ref}\n className={clsx('arbor-tabs', className)}\n style={{ ...tabsContainerStyles, ...style }}\n data-testid={dataTestId}\n role=\"tablist\"\n >\n {tabs.map((tab) => {\n const isActive = tab.value === currentActiveTab;\n const isHovered = tab.value === hoveredTab;\n const isFocused = tab.value === focusedTab;\n\n // Determine text color\n const getTextColor = (): string => {\n if (isActive) {\n return '#0e8a0e'; // Active green\n }\n if (isHovered) {\n return '#202020'; // Hover darker grey\n }\n return '#2f2f2f'; // Default grey\n };\n\n // Determine font weight\n const getFontWeight = (): number => {\n return isActive ? 600 : 500; // Semibold for active, medium for inactive\n };\n\n // Determine underline color\n const getUnderlineColor = (): string => {\n if (isActive) {\n return '#0e8a0e'; // Active green\n }\n if (isHovered) {\n return '#d1d1d1'; // Hover grey\n }\n return 'transparent'; // Default transparent\n };\n\n // Get box shadow for focus ring\n const getBoxShadow = (): string | undefined => {\n if (isFocused) {\n return '0px 0px 0px 3px #3cad51';\n }\n return undefined;\n };\n\n const tabItemStylesCombined: React.CSSProperties = {\n ...tabItemStyles,\n color: getTextColor(),\n fontWeight: getFontWeight(),\n boxShadow: getBoxShadow(),\n backgroundColor: isFocused ? 'rgba(255, 255, 255, 0.01)' : 'transparent',\n };\n\n const underlineStylesCombined: React.CSSProperties = {\n ...underlineStyles,\n backgroundColor: getUnderlineColor(),\n };\n\n return (\n <div\n key={tab.value}\n style={tabItemWrapperStyles}\n onMouseEnter={() => setHoveredTab(tab.value)}\n onMouseLeave={() => setHoveredTab(null)}\n >\n <div\n role=\"tab\"\n aria-selected={isActive}\n tabIndex={isActive ? 0 : -1}\n onClick={() => handleTabClick(tab.value)}\n onKeyDown={(e) => handleKeyDown(e, tab.value)}\n onFocus={() => setFocusedTab(tab.value)}\n onBlur={() => setFocusedTab(null)}\n style={tabItemStylesCombined}\n >\n {tab.icon && (\n <span style={{ display: 'flex', alignItems: 'center' }}>\n {tab.icon}\n </span>\n )}\n <span>{tab.label}</span>\n </div>\n <div style={underlineStylesCombined} />\n </div>\n );\n })}\n </div>\n );\n }\n);\n\nTabs.displayName = 'Tabs';\n"],"mappings":"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","names":[]}
|
package/dist/Tabs.mjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
interface TextAreaProps {
|
|
4
|
+
/**
|
|
5
|
+
* The label for the textarea
|
|
6
|
+
*/
|
|
7
|
+
label?: string;
|
|
8
|
+
/**
|
|
9
|
+
* Placeholder text
|
|
10
|
+
*/
|
|
11
|
+
placeholder?: string;
|
|
12
|
+
/**
|
|
13
|
+
* Current value
|
|
14
|
+
*/
|
|
15
|
+
value?: string;
|
|
16
|
+
/**
|
|
17
|
+
* Change handler
|
|
18
|
+
*/
|
|
19
|
+
onChange?: (e: React.ChangeEvent<HTMLTextAreaElement>) => void;
|
|
20
|
+
/**
|
|
21
|
+
* Validation state - affects border color
|
|
22
|
+
*/
|
|
23
|
+
state?: 'default' | 'success' | 'error';
|
|
24
|
+
/**
|
|
25
|
+
* Error message (implies error state)
|
|
26
|
+
*/
|
|
27
|
+
error?: string;
|
|
28
|
+
/**
|
|
29
|
+
* Helper text shown below input
|
|
30
|
+
*/
|
|
31
|
+
helperText?: string;
|
|
32
|
+
/**
|
|
33
|
+
* Whether the textarea is disabled
|
|
34
|
+
*/
|
|
35
|
+
disabled?: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Number of rows (affects height)
|
|
38
|
+
*/
|
|
39
|
+
rows?: number;
|
|
40
|
+
/**
|
|
41
|
+
* Custom className
|
|
42
|
+
*/
|
|
43
|
+
className?: string;
|
|
44
|
+
/**
|
|
45
|
+
* Custom style
|
|
46
|
+
*/
|
|
47
|
+
style?: React.CSSProperties;
|
|
48
|
+
/**
|
|
49
|
+
* Test ID for testing
|
|
50
|
+
*/
|
|
51
|
+
'data-testid'?: string;
|
|
52
|
+
/**
|
|
53
|
+
* Name attribute for form submission
|
|
54
|
+
*/
|
|
55
|
+
name?: string;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* TextArea component - Arbor Design System
|
|
59
|
+
*
|
|
60
|
+
* A multi-line text input with label, helper text, and validation states.
|
|
61
|
+
*/
|
|
62
|
+
declare const TextArea: React.ForwardRefExoticComponent<TextAreaProps & React.RefAttributes<HTMLTextAreaElement>>;
|
|
63
|
+
|
|
64
|
+
export { TextArea, type TextAreaProps };
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
interface TextAreaProps {
|
|
4
|
+
/**
|
|
5
|
+
* The label for the textarea
|
|
6
|
+
*/
|
|
7
|
+
label?: string;
|
|
8
|
+
/**
|
|
9
|
+
* Placeholder text
|
|
10
|
+
*/
|
|
11
|
+
placeholder?: string;
|
|
12
|
+
/**
|
|
13
|
+
* Current value
|
|
14
|
+
*/
|
|
15
|
+
value?: string;
|
|
16
|
+
/**
|
|
17
|
+
* Change handler
|
|
18
|
+
*/
|
|
19
|
+
onChange?: (e: React.ChangeEvent<HTMLTextAreaElement>) => void;
|
|
20
|
+
/**
|
|
21
|
+
* Validation state - affects border color
|
|
22
|
+
*/
|
|
23
|
+
state?: 'default' | 'success' | 'error';
|
|
24
|
+
/**
|
|
25
|
+
* Error message (implies error state)
|
|
26
|
+
*/
|
|
27
|
+
error?: string;
|
|
28
|
+
/**
|
|
29
|
+
* Helper text shown below input
|
|
30
|
+
*/
|
|
31
|
+
helperText?: string;
|
|
32
|
+
/**
|
|
33
|
+
* Whether the textarea is disabled
|
|
34
|
+
*/
|
|
35
|
+
disabled?: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Number of rows (affects height)
|
|
38
|
+
*/
|
|
39
|
+
rows?: number;
|
|
40
|
+
/**
|
|
41
|
+
* Custom className
|
|
42
|
+
*/
|
|
43
|
+
className?: string;
|
|
44
|
+
/**
|
|
45
|
+
* Custom style
|
|
46
|
+
*/
|
|
47
|
+
style?: React.CSSProperties;
|
|
48
|
+
/**
|
|
49
|
+
* Test ID for testing
|
|
50
|
+
*/
|
|
51
|
+
'data-testid'?: string;
|
|
52
|
+
/**
|
|
53
|
+
* Name attribute for form submission
|
|
54
|
+
*/
|
|
55
|
+
name?: string;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* TextArea component - Arbor Design System
|
|
59
|
+
*
|
|
60
|
+
* A multi-line text input with label, helper text, and validation states.
|
|
61
|
+
*/
|
|
62
|
+
declare const TextArea: React.ForwardRefExoticComponent<TextAreaProps & React.RefAttributes<HTMLTextAreaElement>>;
|
|
63
|
+
|
|
64
|
+
export { TextArea, type TextAreaProps };
|
package/dist/TextArea.js
ADDED
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
|
|
30
|
+
// src/TextArea/index.ts
|
|
31
|
+
var TextArea_exports = {};
|
|
32
|
+
__export(TextArea_exports, {
|
|
33
|
+
TextArea: () => TextArea
|
|
34
|
+
});
|
|
35
|
+
module.exports = __toCommonJS(TextArea_exports);
|
|
36
|
+
|
|
37
|
+
// src/TextArea/TextArea.tsx
|
|
38
|
+
var React = __toESM(require("react"));
|
|
39
|
+
var import_clsx = require("clsx");
|
|
40
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
41
|
+
var labelStyles = {
|
|
42
|
+
fontSize: "13px",
|
|
43
|
+
fontWeight: 600,
|
|
44
|
+
color: "#2f2f2f",
|
|
45
|
+
marginBottom: "0px",
|
|
46
|
+
display: "block",
|
|
47
|
+
fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
|
|
48
|
+
};
|
|
49
|
+
var textareaWrapperStyles = {
|
|
50
|
+
position: "relative",
|
|
51
|
+
width: "100%"
|
|
52
|
+
};
|
|
53
|
+
var textareaStyles = {
|
|
54
|
+
width: "100%",
|
|
55
|
+
minHeight: "72px",
|
|
56
|
+
padding: "8px",
|
|
57
|
+
fontSize: "13px",
|
|
58
|
+
fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif",
|
|
59
|
+
border: "1px solid",
|
|
60
|
+
borderRadius: "8px",
|
|
61
|
+
outline: "none",
|
|
62
|
+
resize: "vertical",
|
|
63
|
+
transition: "all 0.2s ease-in-out",
|
|
64
|
+
lineHeight: "1.5"
|
|
65
|
+
};
|
|
66
|
+
var helperTextStyles = {
|
|
67
|
+
fontSize: "13px",
|
|
68
|
+
marginTop: "4px",
|
|
69
|
+
fontFamily: "'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif"
|
|
70
|
+
};
|
|
71
|
+
var TextArea = React.forwardRef(
|
|
72
|
+
({
|
|
73
|
+
label,
|
|
74
|
+
placeholder,
|
|
75
|
+
value,
|
|
76
|
+
onChange,
|
|
77
|
+
state = "default",
|
|
78
|
+
error,
|
|
79
|
+
helperText,
|
|
80
|
+
disabled = false,
|
|
81
|
+
rows = 3,
|
|
82
|
+
className,
|
|
83
|
+
style,
|
|
84
|
+
"data-testid": dataTestId,
|
|
85
|
+
name
|
|
86
|
+
}, ref) => {
|
|
87
|
+
const [isFocused, setIsFocused] = React.useState(false);
|
|
88
|
+
const [isHovered, setIsHovered] = React.useState(false);
|
|
89
|
+
const textareaId = React.useId();
|
|
90
|
+
const actualState = error ? "error" : state;
|
|
91
|
+
const getBorderColor = () => {
|
|
92
|
+
if (disabled) {
|
|
93
|
+
return "#dfdfdf";
|
|
94
|
+
}
|
|
95
|
+
if (actualState === "error") {
|
|
96
|
+
return "#c93232";
|
|
97
|
+
}
|
|
98
|
+
if (actualState === "success") {
|
|
99
|
+
return "#0e8a0e";
|
|
100
|
+
}
|
|
101
|
+
if (isFocused) {
|
|
102
|
+
return "#0e8a0e";
|
|
103
|
+
}
|
|
104
|
+
if (isHovered) {
|
|
105
|
+
return "#7e7e7e";
|
|
106
|
+
}
|
|
107
|
+
return "#dfdfdf";
|
|
108
|
+
};
|
|
109
|
+
const getBackgroundColor = () => {
|
|
110
|
+
if (disabled) {
|
|
111
|
+
return "#efefef";
|
|
112
|
+
}
|
|
113
|
+
return "#ffffff";
|
|
114
|
+
};
|
|
115
|
+
const getBoxShadow = () => {
|
|
116
|
+
if (isFocused && !disabled) {
|
|
117
|
+
if (actualState === "error") {
|
|
118
|
+
return "0px 0px 0px 3px rgba(201, 50, 50, 0.2)";
|
|
119
|
+
}
|
|
120
|
+
return "0px 0px 0px 3px #3cad51";
|
|
121
|
+
}
|
|
122
|
+
return void 0;
|
|
123
|
+
};
|
|
124
|
+
const textareaStylesCombined = {
|
|
125
|
+
...textareaStyles,
|
|
126
|
+
borderColor: getBorderColor(),
|
|
127
|
+
backgroundColor: getBackgroundColor(),
|
|
128
|
+
boxShadow: getBoxShadow(),
|
|
129
|
+
color: disabled ? "#7e7e7e" : "#2f2f2f",
|
|
130
|
+
cursor: disabled ? "not-allowed" : "text"
|
|
131
|
+
};
|
|
132
|
+
const helperColor = error ? "#c93232" : actualState === "success" ? "#0e8a0e" : "#595959";
|
|
133
|
+
return /* @__PURE__ */ (0, import_jsx_runtime.jsxs)(
|
|
134
|
+
"div",
|
|
135
|
+
{
|
|
136
|
+
className: (0, import_clsx.clsx)("arbor-textarea-wrapper", className),
|
|
137
|
+
style,
|
|
138
|
+
"data-testid": dataTestId,
|
|
139
|
+
children: [
|
|
140
|
+
label && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("label", { htmlFor: textareaId, style: labelStyles, children: label }),
|
|
141
|
+
label && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { height: "8px" } }),
|
|
142
|
+
/* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: textareaWrapperStyles, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
|
|
143
|
+
"textarea",
|
|
144
|
+
{
|
|
145
|
+
ref,
|
|
146
|
+
id: textareaId,
|
|
147
|
+
name,
|
|
148
|
+
placeholder,
|
|
149
|
+
value,
|
|
150
|
+
onChange,
|
|
151
|
+
disabled,
|
|
152
|
+
rows,
|
|
153
|
+
onFocus: () => setIsFocused(true),
|
|
154
|
+
onBlur: () => setIsFocused(false),
|
|
155
|
+
onMouseEnter: () => setIsHovered(true),
|
|
156
|
+
onMouseLeave: () => setIsHovered(false),
|
|
157
|
+
style: textareaStylesCombined
|
|
158
|
+
}
|
|
159
|
+
) }),
|
|
160
|
+
(error || helperText) && /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { style: { ...helperTextStyles, color: helperColor }, role: error ? "alert" : void 0, children: error || helperText })
|
|
161
|
+
]
|
|
162
|
+
}
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
);
|
|
166
|
+
TextArea.displayName = "TextArea";
|
|
167
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
168
|
+
0 && (module.exports = {
|
|
169
|
+
TextArea
|
|
170
|
+
});
|
|
171
|
+
//# sourceMappingURL=TextArea.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/TextArea/index.ts","../src/TextArea/TextArea.tsx"],"sourcesContent":["export { TextArea } from './TextArea';\nexport type { TextAreaProps } from './TextArea';\n","import * as React from 'react';\nimport { clsx } from 'clsx';\n\nexport interface TextAreaProps {\n /**\n * The label for the textarea\n */\n label?: string;\n /**\n * Placeholder text\n */\n placeholder?: string;\n /**\n * Current value\n */\n value?: string;\n /**\n * Change handler\n */\n onChange?: (e: React.ChangeEvent<HTMLTextAreaElement>) => void;\n /**\n * Validation state - affects border color\n */\n state?: 'default' | 'success' | 'error';\n /**\n * Error message (implies error state)\n */\n error?: string;\n /**\n * Helper text shown below input\n */\n helperText?: string;\n /**\n * Whether the textarea is disabled\n */\n disabled?: boolean;\n /**\n * Number of rows (affects height)\n */\n rows?: number;\n /**\n * Custom className\n */\n className?: string;\n /**\n * Custom style\n */\n style?: React.CSSProperties;\n /**\n * Test ID for testing\n */\n 'data-testid'?: string;\n /**\n * Name attribute for form submission\n */\n name?: string;\n}\n\nconst labelStyles: React.CSSProperties = {\n fontSize: '13px',\n fontWeight: 600,\n color: '#2f2f2f',\n marginBottom: '0px',\n display: 'block',\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n};\n\nconst textareaWrapperStyles: React.CSSProperties = {\n position: 'relative',\n width: '100%',\n};\n\nconst textareaStyles: React.CSSProperties = {\n width: '100%',\n minHeight: '72px',\n padding: '8px',\n fontSize: '13px',\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n border: '1px solid',\n borderRadius: '8px',\n outline: 'none',\n resize: 'vertical',\n transition: 'all 0.2s ease-in-out',\n lineHeight: '1.5',\n};\n\nconst helperTextStyles: React.CSSProperties = {\n fontSize: '13px',\n marginTop: '4px',\n fontFamily: \"'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif\",\n};\n\n/**\n * TextArea component - Arbor Design System\n *\n * A multi-line text input with label, helper text, and validation states.\n */\nexport const TextArea = React.forwardRef<HTMLTextAreaElement, TextAreaProps>(\n (\n {\n label,\n placeholder,\n value,\n onChange,\n state = 'default',\n error,\n helperText,\n disabled = false,\n rows = 3,\n className,\n style,\n 'data-testid': dataTestId,\n name,\n },\n ref\n ) => {\n const [isFocused, setIsFocused] = React.useState(false);\n const [isHovered, setIsHovered] = React.useState(false);\n const textareaId = React.useId();\n\n // Determine the actual state (error overrides state prop)\n const actualState = error ? 'error' : state;\n\n // Get border color based on state and interactions\n const getBorderColor = (): string => {\n if (disabled) {\n return '#dfdfdf';\n }\n\n if (actualState === 'error') {\n return '#c93232';\n }\n\n if (actualState === 'success') {\n return '#0e8a0e';\n }\n\n if (isFocused) {\n return '#0e8a0e';\n }\n\n if (isHovered) {\n return '#7e7e7e';\n }\n\n return '#dfdfdf';\n };\n\n // Get background color\n const getBackgroundColor = (): string => {\n if (disabled) {\n return '#efefef';\n }\n return '#ffffff';\n };\n\n // Get box shadow (focus ring)\n const getBoxShadow = (): string | undefined => {\n if (isFocused && !disabled) {\n if (actualState === 'error') {\n return '0px 0px 0px 3px rgba(201, 50, 50, 0.2)';\n }\n return '0px 0px 0px 3px #3cad51';\n }\n return undefined;\n };\n\n const textareaStylesCombined: React.CSSProperties = {\n ...textareaStyles,\n borderColor: getBorderColor(),\n backgroundColor: getBackgroundColor(),\n boxShadow: getBoxShadow(),\n color: disabled ? '#7e7e7e' : '#2f2f2f',\n cursor: disabled ? 'not-allowed' : 'text',\n };\n\n const helperColor = error ? '#c93232' : actualState === 'success' ? '#0e8a0e' : '#595959';\n\n return (\n <div\n className={clsx('arbor-textarea-wrapper', className)}\n style={style}\n data-testid={dataTestId}\n >\n {label && (\n <label htmlFor={textareaId} style={labelStyles}>\n {label}\n </label>\n )}\n {label && <div style={{ height: '8px' }} />}\n <div style={textareaWrapperStyles}>\n <textarea\n ref={ref}\n id={textareaId}\n name={name}\n placeholder={placeholder}\n value={value}\n onChange={onChange}\n disabled={disabled}\n rows={rows}\n onFocus={() => setIsFocused(true)}\n onBlur={() => setIsFocused(false)}\n onMouseEnter={() => setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n style={textareaStylesCombined}\n />\n </div>\n {(error || helperText) && (\n <div style={{ ...helperTextStyles, color: helperColor }} role={error ? 'alert' : undefined}>\n {error || helperText}\n </div>\n )}\n </div>\n );\n }\n);\n\nTextArea.displayName = 'TextArea';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,YAAuB;AACvB,kBAAqB;AAkLf;AAzHN,IAAM,cAAmC;AAAA,EACvC,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,cAAc;AAAA,EACd,SAAS;AAAA,EACT,YAAY;AACd;AAEA,IAAM,wBAA6C;AAAA,EACjD,UAAU;AAAA,EACV,OAAO;AACT;AAEA,IAAM,iBAAsC;AAAA,EAC1C,OAAO;AAAA,EACP,WAAW;AAAA,EACX,SAAS;AAAA,EACT,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,YAAY;AACd;AAEA,IAAM,mBAAwC;AAAA,EAC5C,UAAU;AAAA,EACV,WAAW;AAAA,EACX,YAAY;AACd;AAOO,IAAM,WAAiB;AAAA,EAC5B,CACE;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA,eAAe;AAAA,IACf;AAAA,EACF,GACA,QACG;AACH,UAAM,CAAC,WAAW,YAAY,IAAU,eAAS,KAAK;AACtD,UAAM,CAAC,WAAW,YAAY,IAAU,eAAS,KAAK;AACtD,UAAM,aAAmB,YAAM;AAG/B,UAAM,cAAc,QAAQ,UAAU;AAGtC,UAAM,iBAAiB,MAAc;AACnC,UAAI,UAAU;AACZ,eAAO;AAAA,MACT;AAEA,UAAI,gBAAgB,SAAS;AAC3B,eAAO;AAAA,MACT;AAEA,UAAI,gBAAgB,WAAW;AAC7B,eAAO;AAAA,MACT;AAEA,UAAI,WAAW;AACb,eAAO;AAAA,MACT;AAEA,UAAI,WAAW;AACb,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT;AAGA,UAAM,qBAAqB,MAAc;AACvC,UAAI,UAAU;AACZ,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAGA,UAAM,eAAe,MAA0B;AAC7C,UAAI,aAAa,CAAC,UAAU;AAC1B,YAAI,gBAAgB,SAAS;AAC3B,iBAAO;AAAA,QACT;AACA,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAEA,UAAM,yBAA8C;AAAA,MAClD,GAAG;AAAA,MACH,aAAa,eAAe;AAAA,MAC5B,iBAAiB,mBAAmB;AAAA,MACpC,WAAW,aAAa;AAAA,MACxB,OAAO,WAAW,YAAY;AAAA,MAC9B,QAAQ,WAAW,gBAAgB;AAAA,IACrC;AAEA,UAAM,cAAc,QAAQ,YAAY,gBAAgB,YAAY,YAAY;AAEhF,WACE;AAAA,MAAC;AAAA;AAAA,QACC,eAAW,kBAAK,0BAA0B,SAAS;AAAA,QACnD;AAAA,QACA,eAAa;AAAA,QAEZ;AAAA,mBACC,4CAAC,WAAM,SAAS,YAAY,OAAO,aAChC,iBACH;AAAA,UAED,SAAS,4CAAC,SAAI,OAAO,EAAE,QAAQ,MAAM,GAAG;AAAA,UACzC,4CAAC,SAAI,OAAO,uBACV;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA,IAAI;AAAA,cACJ;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,SAAS,MAAM,aAAa,IAAI;AAAA,cAChC,QAAQ,MAAM,aAAa,KAAK;AAAA,cAChC,cAAc,MAAM,aAAa,IAAI;AAAA,cACrC,cAAc,MAAM,aAAa,KAAK;AAAA,cACtC,OAAO;AAAA;AAAA,UACT,GACF;AAAA,WACE,SAAS,eACT,4CAAC,SAAI,OAAO,EAAE,GAAG,kBAAkB,OAAO,YAAY,GAAG,MAAM,QAAQ,UAAU,QAC9E,mBAAS,YACZ;AAAA;AAAA;AAAA,IAEJ;AAAA,EAEJ;AACF;AAEA,SAAS,cAAc;","names":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/Toast.d.mts
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
|
|
3
|
+
interface ToastProps {
|
|
4
|
+
/**
|
|
5
|
+
* The variant of the toast
|
|
6
|
+
*/
|
|
7
|
+
variant: 'information' | 'danger' | 'warning' | 'success' | 'caution';
|
|
8
|
+
/**
|
|
9
|
+
* The message to display
|
|
10
|
+
*/
|
|
11
|
+
message: string;
|
|
12
|
+
/**
|
|
13
|
+
* Callback when close button is clicked
|
|
14
|
+
*/
|
|
15
|
+
onClose?: () => void;
|
|
16
|
+
/**
|
|
17
|
+
* Custom className
|
|
18
|
+
*/
|
|
19
|
+
className?: string;
|
|
20
|
+
/**
|
|
21
|
+
* Custom style
|
|
22
|
+
*/
|
|
23
|
+
style?: React.CSSProperties;
|
|
24
|
+
/**
|
|
25
|
+
* Test ID for testing
|
|
26
|
+
*/
|
|
27
|
+
'data-testid'?: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Toast component - Arbor Design System
|
|
31
|
+
*
|
|
32
|
+
* A notification toast with different variants for different message types.
|
|
33
|
+
*
|
|
34
|
+
* IMPORTANT: Toasts are designed to overlay content in the top-right corner.
|
|
35
|
+
* Use absolute/fixed positioning to display them above page content.
|
|
36
|
+
*
|
|
37
|
+
* For inline notifications that flow with page content, use the Banner component instead.
|
|
38
|
+
*
|
|
39
|
+
* Example usage with positioning:
|
|
40
|
+
* ```tsx
|
|
41
|
+
* <div style={{ position: 'fixed', top: '24px', right: '24px', zIndex: 1000 }}>
|
|
42
|
+
* <Toast variant="success" message="Changes saved!" onClose={() => {}} />
|
|
43
|
+
* </div>
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
declare const Toast: React.ForwardRefExoticComponent<ToastProps & React.RefAttributes<HTMLDivElement>>;
|
|
47
|
+
|
|
48
|
+
export { Toast, type ToastProps };
|