@coral-ui/react 0.1.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/index.d.ts +139 -0
- package/dist/index.js +1060 -0
- package/dist/index.js.map +1 -0
- package/package.json +27 -0
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import React__default, { ReactNode } from 'react';
|
|
4
|
+
import { Theme, ToggleButtonProps, AvatarProps } from '@fluentui/react-components';
|
|
5
|
+
export { Button, Tab, TabList, ToggleButton } from '@fluentui/react-components';
|
|
6
|
+
import * as _fluentui_react_icons from '@fluentui/react-icons';
|
|
7
|
+
|
|
8
|
+
type CoralColorScheme = "light" | "dark";
|
|
9
|
+
type CoralProviderProps = {
|
|
10
|
+
children: React.ReactNode;
|
|
11
|
+
theme?: Theme | CoralColorScheme;
|
|
12
|
+
};
|
|
13
|
+
declare function CoralProvider({ children, theme }: CoralProviderProps): react_jsx_runtime.JSX.Element;
|
|
14
|
+
|
|
15
|
+
declare const coralLightTheme: Theme;
|
|
16
|
+
declare const coralDarkTheme: Theme;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @component
|
|
20
|
+
* @name Header
|
|
21
|
+
* @description A header component for displaying a logo, title, and optional subtitle.
|
|
22
|
+
*
|
|
23
|
+
* @prop {React.ReactNode} [logo] - Custom logo (defaults to Microsoft icon).
|
|
24
|
+
* @prop {string} [title="Microsoft"] - Main title text.
|
|
25
|
+
* @prop {string} [subtitle] - Optional subtitle displayed next to the title.
|
|
26
|
+
* @prop {React.ReactNode} [children] - Optional header toolbar (e.g., buttons, menus).
|
|
27
|
+
*/
|
|
28
|
+
type HeaderProps = {
|
|
29
|
+
logo?: React__default.ReactNode;
|
|
30
|
+
title?: string;
|
|
31
|
+
subtitle?: string;
|
|
32
|
+
children?: React__default.ReactNode;
|
|
33
|
+
};
|
|
34
|
+
declare const Header: React__default.FC<HeaderProps>;
|
|
35
|
+
|
|
36
|
+
interface HeaderToolsProps {
|
|
37
|
+
children?: React__default.ReactNode;
|
|
38
|
+
}
|
|
39
|
+
declare const HeaderTools: React__default.FC<HeaderToolsProps>;
|
|
40
|
+
|
|
41
|
+
type ToggleButtonButtonProps = Extract<ToggleButtonProps, {
|
|
42
|
+
as?: "button";
|
|
43
|
+
}>;
|
|
44
|
+
type PanelToggleProps = Omit<ToggleButtonButtonProps, "as" | "checked" | "defaultChecked" | "icon" | "onClick"> & {
|
|
45
|
+
panelID: string;
|
|
46
|
+
icon?: ToggleButtonButtonProps["icon"];
|
|
47
|
+
onClick?: React__default.MouseEventHandler<HTMLButtonElement>;
|
|
48
|
+
};
|
|
49
|
+
declare const PanelToggle: React__default.FC<PanelToggleProps>;
|
|
50
|
+
|
|
51
|
+
declare const CoralShellColumn: React__default.FC<{
|
|
52
|
+
children: React__default.ReactNode;
|
|
53
|
+
}>;
|
|
54
|
+
|
|
55
|
+
declare const CoralShellRow: React__default.FC<{
|
|
56
|
+
children: React__default.ReactNode;
|
|
57
|
+
}>;
|
|
58
|
+
|
|
59
|
+
interface PanelLeftProps {
|
|
60
|
+
panelWidth?: number;
|
|
61
|
+
panelResize?: boolean;
|
|
62
|
+
children?: ReactNode;
|
|
63
|
+
}
|
|
64
|
+
declare const PanelLeft: React__default.FC<PanelLeftProps>;
|
|
65
|
+
|
|
66
|
+
interface PanelToolbarProps {
|
|
67
|
+
icon?: ReactNode;
|
|
68
|
+
title?: string | null;
|
|
69
|
+
/** If provided, the title area becomes a link */
|
|
70
|
+
linkTo?: string;
|
|
71
|
+
/** Optional: for real nav, you can prevent full page reload */
|
|
72
|
+
onLinkClick?: (e: React__default.MouseEvent<HTMLAnchorElement>) => void;
|
|
73
|
+
children?: ReactNode;
|
|
74
|
+
}
|
|
75
|
+
declare const PanelToolbar: React__default.FC<PanelToolbarProps>;
|
|
76
|
+
|
|
77
|
+
interface PanelRightProps {
|
|
78
|
+
panelWidth?: number;
|
|
79
|
+
panelResize?: boolean;
|
|
80
|
+
panelID: string;
|
|
81
|
+
defaultClosed?: boolean;
|
|
82
|
+
children?: ReactNode;
|
|
83
|
+
}
|
|
84
|
+
declare const PanelRight: React__default.FC<PanelRightProps>;
|
|
85
|
+
|
|
86
|
+
interface ContentProps {
|
|
87
|
+
children?: ReactNode;
|
|
88
|
+
}
|
|
89
|
+
declare const Content: React__default.FC<ContentProps>;
|
|
90
|
+
|
|
91
|
+
type PanelNavProps = {
|
|
92
|
+
/** Controlled open state */
|
|
93
|
+
value?: boolean;
|
|
94
|
+
/** Uncontrolled initial open state */
|
|
95
|
+
defaultValue?: boolean;
|
|
96
|
+
/** Back-compat alias (prefer defaultValue) */
|
|
97
|
+
defaultOpen?: boolean;
|
|
98
|
+
/** Called when open state changes */
|
|
99
|
+
onValueChange?: (ev: React.MouseEvent | React.KeyboardEvent, data: {
|
|
100
|
+
value: boolean;
|
|
101
|
+
}) => void;
|
|
102
|
+
/** Optional section label shown in the header */
|
|
103
|
+
title?: string;
|
|
104
|
+
/** Optional: disable expand/collapse */
|
|
105
|
+
disabled?: boolean;
|
|
106
|
+
children?: React.ReactNode;
|
|
107
|
+
className?: string;
|
|
108
|
+
};
|
|
109
|
+
declare function PanelNav({ value, defaultValue, defaultOpen, onValueChange, title, disabled, children, className, }: PanelNavProps): react_jsx_runtime.JSX.Element;
|
|
110
|
+
|
|
111
|
+
type PanelNavItemProps = {
|
|
112
|
+
title: string;
|
|
113
|
+
icon?: React.ReactNode;
|
|
114
|
+
/** Identifier (useful if parent manages selection) */
|
|
115
|
+
value?: string;
|
|
116
|
+
/** Marks the item as selected */
|
|
117
|
+
selected?: boolean;
|
|
118
|
+
disabled?: boolean;
|
|
119
|
+
onSelect?: (ev: React.MouseEvent<HTMLButtonElement>, data: {
|
|
120
|
+
value?: string;
|
|
121
|
+
}) => void;
|
|
122
|
+
/** Back-compat */
|
|
123
|
+
active?: boolean;
|
|
124
|
+
onClick?: React.MouseEventHandler<HTMLButtonElement>;
|
|
125
|
+
className?: string;
|
|
126
|
+
};
|
|
127
|
+
declare function PanelNavItem({ title, icon, value, selected, active, disabled, onSelect, onClick, className, }: PanelNavItemProps): react_jsx_runtime.JSX.Element;
|
|
128
|
+
|
|
129
|
+
interface PanelUserCardProps extends AvatarProps {
|
|
130
|
+
name: string;
|
|
131
|
+
alias?: string;
|
|
132
|
+
}
|
|
133
|
+
declare const PanelUserCard: React__default.FC<PanelUserCardProps>;
|
|
134
|
+
|
|
135
|
+
declare const _default: {
|
|
136
|
+
bundleIcon: (FilledIcon: _fluentui_react_icons.FluentIcon, RegularIcon: _fluentui_react_icons.FluentIcon) => _fluentui_react_icons.FluentIcon;
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
export { Content, type CoralColorScheme, CoralProvider, type CoralProviderProps, CoralShellColumn, CoralShellRow, Header, HeaderTools, _default as LeafOne, PanelLeft, PanelNav, PanelNavItem, PanelRight, PanelToggle, PanelToolbar, PanelUserCard as UserCard, coralDarkTheme, coralLightTheme };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,1060 @@
|
|
|
1
|
+
// src/provider/CoralProvider.tsx
|
|
2
|
+
import { FluentProvider } from "@fluentui/react-components";
|
|
3
|
+
|
|
4
|
+
// src/theme/theme.ts
|
|
5
|
+
import { createLightTheme, createDarkTheme } from "@fluentui/react-components";
|
|
6
|
+
var brand = {
|
|
7
|
+
10: "#09000C",
|
|
8
|
+
20: "#280045",
|
|
9
|
+
30: "#36006E",
|
|
10
|
+
40: "#3D0098",
|
|
11
|
+
50: "#3500CD",
|
|
12
|
+
60: "#0112FF",
|
|
13
|
+
70: "#2735FF",
|
|
14
|
+
80: "#3C4CFF",
|
|
15
|
+
90: "#4E5FFF",
|
|
16
|
+
100: "#5E72FF",
|
|
17
|
+
110: "#6F83FF",
|
|
18
|
+
120: "#7F94FF",
|
|
19
|
+
130: "#90A5FF",
|
|
20
|
+
140: "#A1B6FF",
|
|
21
|
+
150: "#B4C6FF",
|
|
22
|
+
160: "#dbe5ff"
|
|
23
|
+
};
|
|
24
|
+
var coralLightTheme = createLightTheme(brand);
|
|
25
|
+
var coralDarkTheme = createDarkTheme(brand);
|
|
26
|
+
|
|
27
|
+
// src/provider/CoralProvider.tsx
|
|
28
|
+
import { jsx } from "react/jsx-runtime";
|
|
29
|
+
function CoralProvider({ children, theme = coralLightTheme }) {
|
|
30
|
+
const resolvedTheme = typeof theme === "string" ? theme === "dark" ? coralDarkTheme : coralLightTheme : theme;
|
|
31
|
+
return /* @__PURE__ */ jsx(FluentProvider, { theme: resolvedTheme, children });
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// src/index.ts
|
|
35
|
+
import { Button as Button3, ToggleButton as ToggleButton2, Tab, TabList } from "@fluentui/react-components";
|
|
36
|
+
|
|
37
|
+
// src/components/Header/Header.tsx
|
|
38
|
+
import { Avatar, Subtitle2 } from "@fluentui/react-components";
|
|
39
|
+
|
|
40
|
+
// src/imports/MsftColor.tsx
|
|
41
|
+
import { jsx as jsx2, jsxs } from "react/jsx-runtime";
|
|
42
|
+
var MicrosoftLogo = () => {
|
|
43
|
+
return /* @__PURE__ */ jsxs(
|
|
44
|
+
"svg",
|
|
45
|
+
{
|
|
46
|
+
width: "32",
|
|
47
|
+
height: "32",
|
|
48
|
+
viewBox: "0 0 32 32",
|
|
49
|
+
fill: "none",
|
|
50
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
51
|
+
children: [
|
|
52
|
+
/* @__PURE__ */ jsx2("path", { d: "M5.04349 5.04349H15.4783V15.4783H5.04349V5.04349Z", fill: "#F35325" }),
|
|
53
|
+
/* @__PURE__ */ jsx2("path", { d: "M16.5217 5.04349H26.9565V15.4783H16.5217V5.04349Z", fill: "#81BC06" }),
|
|
54
|
+
/* @__PURE__ */ jsx2("path", { d: "M5.04349 16.5217H15.4783V26.9565H5.04349V16.5217Z", fill: "#05A6F0" }),
|
|
55
|
+
/* @__PURE__ */ jsx2("path", { d: "M16.5217 16.5217H26.9565V26.9565H16.5217V16.5217Z", fill: "#FFBA08" })
|
|
56
|
+
]
|
|
57
|
+
}
|
|
58
|
+
);
|
|
59
|
+
};
|
|
60
|
+
var MsftColor_default = MicrosoftLogo;
|
|
61
|
+
|
|
62
|
+
// src/components/Header/Header.tsx
|
|
63
|
+
import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
64
|
+
var Header = ({ logo, title = "Microsoft", subtitle, children }) => {
|
|
65
|
+
return /* @__PURE__ */ jsxs2(
|
|
66
|
+
"header",
|
|
67
|
+
{
|
|
68
|
+
style: {
|
|
69
|
+
display: "flex",
|
|
70
|
+
justifyContent: "space-between",
|
|
71
|
+
alignItems: "center",
|
|
72
|
+
width: "100%",
|
|
73
|
+
backgroundColor: "var(--colorNeutralBackgroundAlpha)",
|
|
74
|
+
borderBottom: "1px solid var(--colorNeutralStroke2)",
|
|
75
|
+
padding: "16px",
|
|
76
|
+
height: "64px",
|
|
77
|
+
boxSizing: "border-box",
|
|
78
|
+
gap: "12px"
|
|
79
|
+
},
|
|
80
|
+
"data-figma-component": "Header",
|
|
81
|
+
children: [
|
|
82
|
+
/* @__PURE__ */ jsxs2(
|
|
83
|
+
"div",
|
|
84
|
+
{
|
|
85
|
+
style: {
|
|
86
|
+
display: "flex",
|
|
87
|
+
justifyContent: "space-between",
|
|
88
|
+
alignItems: "center",
|
|
89
|
+
gap: "8px"
|
|
90
|
+
},
|
|
91
|
+
children: [
|
|
92
|
+
/* @__PURE__ */ jsx3(
|
|
93
|
+
Avatar,
|
|
94
|
+
{
|
|
95
|
+
shape: "square",
|
|
96
|
+
color: "neutral",
|
|
97
|
+
icon: { children: logo || /* @__PURE__ */ jsx3(MsftColor_default, {}) }
|
|
98
|
+
}
|
|
99
|
+
),
|
|
100
|
+
/* @__PURE__ */ jsxs2(Subtitle2, { style: { whiteSpace: "nowrap", marginTop: "-2px" }, children: [
|
|
101
|
+
title,
|
|
102
|
+
subtitle && /* @__PURE__ */ jsxs2("span", { style: { fontWeight: "400" }, children: [
|
|
103
|
+
" | ",
|
|
104
|
+
subtitle
|
|
105
|
+
] })
|
|
106
|
+
] })
|
|
107
|
+
]
|
|
108
|
+
}
|
|
109
|
+
),
|
|
110
|
+
children
|
|
111
|
+
]
|
|
112
|
+
}
|
|
113
|
+
);
|
|
114
|
+
};
|
|
115
|
+
var Header_default = Header;
|
|
116
|
+
|
|
117
|
+
// src/components/Header/HeaderTools.tsx
|
|
118
|
+
import { Toolbar } from "@fluentui/react-components";
|
|
119
|
+
import { jsx as jsx4 } from "react/jsx-runtime";
|
|
120
|
+
var HeaderTools = ({ children }) => {
|
|
121
|
+
return /* @__PURE__ */ jsx4(
|
|
122
|
+
Toolbar,
|
|
123
|
+
{
|
|
124
|
+
style: {
|
|
125
|
+
display: "flex",
|
|
126
|
+
flex: "0",
|
|
127
|
+
alignItems: "center",
|
|
128
|
+
flexDirection: "row-reverse",
|
|
129
|
+
padding: "4px 0"
|
|
130
|
+
},
|
|
131
|
+
children
|
|
132
|
+
}
|
|
133
|
+
);
|
|
134
|
+
};
|
|
135
|
+
var HeaderTools_default = HeaderTools;
|
|
136
|
+
|
|
137
|
+
// src/components/Panels/PanelToggle.tsx
|
|
138
|
+
import { useEffect, useState } from "react";
|
|
139
|
+
import { ToggleButton } from "@fluentui/react-components";
|
|
140
|
+
|
|
141
|
+
// src/imports/bundleicons.tsx
|
|
142
|
+
import {
|
|
143
|
+
ArrowExitFilled,
|
|
144
|
+
ArrowExitRegular,
|
|
145
|
+
BeakerFilled,
|
|
146
|
+
BeakerRegular,
|
|
147
|
+
BookmarkFilled,
|
|
148
|
+
BookmarkRegular,
|
|
149
|
+
CodeFilled,
|
|
150
|
+
CodeRegular,
|
|
151
|
+
CubeFilled,
|
|
152
|
+
CubeRegular,
|
|
153
|
+
DesignIdeasFilled,
|
|
154
|
+
DesignIdeasRegular,
|
|
155
|
+
DrawerArrowDownloadFilled,
|
|
156
|
+
DrawerArrowDownloadRegular,
|
|
157
|
+
FlowFilled,
|
|
158
|
+
FlowRegular,
|
|
159
|
+
FolderOpenFilled,
|
|
160
|
+
FolderOpenRegular,
|
|
161
|
+
LeafOneFilled,
|
|
162
|
+
LeafOneRegular,
|
|
163
|
+
LinkFilled,
|
|
164
|
+
LinkRegular,
|
|
165
|
+
OpenFilled,
|
|
166
|
+
OpenRegular,
|
|
167
|
+
OrganizationHorizontalFilled,
|
|
168
|
+
OrganizationHorizontalRegular,
|
|
169
|
+
PanelLeftContractFilled,
|
|
170
|
+
PanelLeftContractRegular,
|
|
171
|
+
PanelLeftExpandFilled,
|
|
172
|
+
PanelLeftExpandRegular,
|
|
173
|
+
PanelRightContractFilled,
|
|
174
|
+
PanelRightContractRegular,
|
|
175
|
+
PanelRightExpandFilled,
|
|
176
|
+
PanelRightExpandRegular,
|
|
177
|
+
PersonFilled,
|
|
178
|
+
PersonRegular,
|
|
179
|
+
PersonFeedbackFilled,
|
|
180
|
+
PersonFeedbackRegular,
|
|
181
|
+
SearchFilled,
|
|
182
|
+
SearchRegular,
|
|
183
|
+
SendFilled,
|
|
184
|
+
SendRegular,
|
|
185
|
+
ShareFilled,
|
|
186
|
+
ShareRegular,
|
|
187
|
+
TreeDeciduousFilled,
|
|
188
|
+
TreeDeciduousRegular,
|
|
189
|
+
TreeEvergreenFilled,
|
|
190
|
+
TreeEvergreenRegular,
|
|
191
|
+
WeatherMoonFilled,
|
|
192
|
+
WeatherMoonRegular,
|
|
193
|
+
WeatherSunnyFilled,
|
|
194
|
+
WeatherSunnyRegular,
|
|
195
|
+
DismissFilled,
|
|
196
|
+
DismissRegular,
|
|
197
|
+
DocumentSparkleFilled,
|
|
198
|
+
DocumentSparkleRegular,
|
|
199
|
+
SparkleFilled,
|
|
200
|
+
SparkleRegular,
|
|
201
|
+
StarFilled,
|
|
202
|
+
StarRegular,
|
|
203
|
+
MoreHorizontalFilled,
|
|
204
|
+
MoreHorizontalRegular,
|
|
205
|
+
bundleIcon,
|
|
206
|
+
CopyFilled,
|
|
207
|
+
CopyRegular,
|
|
208
|
+
HistoryFilled,
|
|
209
|
+
HistoryRegular,
|
|
210
|
+
TaskListSquareLtrFilled,
|
|
211
|
+
TaskListSquareLtrRegular
|
|
212
|
+
} from "@fluentui/react-icons";
|
|
213
|
+
var TaskListSquareLtr = bundleIcon(TaskListSquareLtrFilled, TaskListSquareLtrRegular);
|
|
214
|
+
var History = bundleIcon(HistoryFilled, HistoryRegular);
|
|
215
|
+
var Copy = bundleIcon(CopyFilled, CopyRegular);
|
|
216
|
+
var Send = bundleIcon(SendFilled, SendRegular);
|
|
217
|
+
var MoreHorizontal = bundleIcon(MoreHorizontalFilled, MoreHorizontalRegular);
|
|
218
|
+
var ArrowExit = bundleIcon(ArrowExitFilled, ArrowExitRegular);
|
|
219
|
+
var Bookmark = bundleIcon(BookmarkFilled, BookmarkRegular);
|
|
220
|
+
var Sparkle = bundleIcon(SparkleFilled, SparkleRegular);
|
|
221
|
+
var Star = bundleIcon(StarFilled, StarRegular);
|
|
222
|
+
var DocumentSparkle = bundleIcon(DocumentSparkleFilled, DocumentSparkleRegular);
|
|
223
|
+
var Dismiss = bundleIcon(DismissFilled, DismissRegular);
|
|
224
|
+
var DrawerArrowDownload = bundleIcon(DrawerArrowDownloadFilled, DrawerArrowDownloadRegular);
|
|
225
|
+
var Beaker = bundleIcon(BeakerFilled, BeakerRegular);
|
|
226
|
+
var Code = bundleIcon(CodeFilled, CodeRegular);
|
|
227
|
+
var Cube = bundleIcon(CubeFilled, CubeRegular);
|
|
228
|
+
var DesignIdeas = bundleIcon(DesignIdeasFilled, DesignIdeasRegular);
|
|
229
|
+
var Flow = bundleIcon(FlowFilled, FlowRegular);
|
|
230
|
+
var FolderOpen = bundleIcon(FolderOpenFilled, FolderOpenRegular);
|
|
231
|
+
var LeafOne = bundleIcon(LeafOneFilled, LeafOneRegular);
|
|
232
|
+
var Link = bundleIcon(LinkFilled, LinkRegular);
|
|
233
|
+
var Open = bundleIcon(OpenFilled, OpenRegular);
|
|
234
|
+
var OrganizationHorizontal = bundleIcon(
|
|
235
|
+
OrganizationHorizontalFilled,
|
|
236
|
+
OrganizationHorizontalRegular
|
|
237
|
+
);
|
|
238
|
+
var PanelLeftContract = bundleIcon(
|
|
239
|
+
PanelLeftContractFilled,
|
|
240
|
+
PanelLeftContractRegular
|
|
241
|
+
);
|
|
242
|
+
var PanelLeftExpand = bundleIcon(
|
|
243
|
+
PanelLeftExpandFilled,
|
|
244
|
+
PanelLeftExpandRegular
|
|
245
|
+
);
|
|
246
|
+
var PanelRightContract = bundleIcon(
|
|
247
|
+
PanelRightContractFilled,
|
|
248
|
+
PanelRightContractRegular
|
|
249
|
+
);
|
|
250
|
+
var PanelRightExpand = bundleIcon(
|
|
251
|
+
PanelRightExpandFilled,
|
|
252
|
+
PanelRightExpandRegular
|
|
253
|
+
);
|
|
254
|
+
var Person = bundleIcon(PersonFilled, PersonRegular);
|
|
255
|
+
var PersonFeedback = bundleIcon(
|
|
256
|
+
PersonFeedbackFilled,
|
|
257
|
+
PersonFeedbackRegular
|
|
258
|
+
);
|
|
259
|
+
var Search = bundleIcon(SearchFilled, SearchRegular);
|
|
260
|
+
var Share = bundleIcon(ShareFilled, ShareRegular);
|
|
261
|
+
var TreeDeciduous = bundleIcon(
|
|
262
|
+
TreeDeciduousFilled,
|
|
263
|
+
TreeDeciduousRegular
|
|
264
|
+
);
|
|
265
|
+
var TreeEvergreen = bundleIcon(
|
|
266
|
+
TreeEvergreenFilled,
|
|
267
|
+
TreeEvergreenRegular
|
|
268
|
+
);
|
|
269
|
+
var WeatherMoon = bundleIcon(WeatherMoonFilled, WeatherMoonRegular);
|
|
270
|
+
var WeatherSunny = bundleIcon(WeatherSunnyFilled, WeatherSunnyRegular);
|
|
271
|
+
var bundleicons_default = { bundleIcon };
|
|
272
|
+
|
|
273
|
+
// src/components/eventbus.tsx
|
|
274
|
+
var EventBus = class {
|
|
275
|
+
constructor() {
|
|
276
|
+
this.events = {};
|
|
277
|
+
this.panelWidth = 400;
|
|
278
|
+
this.activePanel = null;
|
|
279
|
+
}
|
|
280
|
+
on(event, callback) {
|
|
281
|
+
if (!this.events[event]) {
|
|
282
|
+
this.events[event] = [];
|
|
283
|
+
}
|
|
284
|
+
this.events[event].push(callback);
|
|
285
|
+
}
|
|
286
|
+
off(event, callback) {
|
|
287
|
+
if (!this.events[event]) return;
|
|
288
|
+
this.events[event] = this.events[event].filter((cb) => cb !== callback);
|
|
289
|
+
}
|
|
290
|
+
emit(event, ...args) {
|
|
291
|
+
if (!this.events[event]) return;
|
|
292
|
+
this.events[event].forEach((callback) => callback(...args));
|
|
293
|
+
}
|
|
294
|
+
// Panel control
|
|
295
|
+
setActivePanel(panelID) {
|
|
296
|
+
this.activePanel = panelID;
|
|
297
|
+
this.emit("setActivePanel", panelID);
|
|
298
|
+
}
|
|
299
|
+
getActivePanel() {
|
|
300
|
+
return this.activePanel;
|
|
301
|
+
}
|
|
302
|
+
// Shared panel width
|
|
303
|
+
setPanelWidth(width) {
|
|
304
|
+
this.panelWidth = width;
|
|
305
|
+
this.emit("panelWidthChanged", width);
|
|
306
|
+
}
|
|
307
|
+
getPanelWidth() {
|
|
308
|
+
return this.panelWidth;
|
|
309
|
+
}
|
|
310
|
+
};
|
|
311
|
+
var eventBus = new EventBus();
|
|
312
|
+
var eventbus_default = eventBus;
|
|
313
|
+
|
|
314
|
+
// src/components/Panels/PanelToggle.tsx
|
|
315
|
+
import { jsx as jsx5 } from "react/jsx-runtime";
|
|
316
|
+
var PanelToggle = ({
|
|
317
|
+
panelID,
|
|
318
|
+
icon,
|
|
319
|
+
onClick,
|
|
320
|
+
...rest
|
|
321
|
+
}) => {
|
|
322
|
+
const [activePanel, setActivePanel] = useState(
|
|
323
|
+
() => eventbus_default.getActivePanel()
|
|
324
|
+
);
|
|
325
|
+
useEffect(() => {
|
|
326
|
+
const handleActivePanel = (panel) => {
|
|
327
|
+
setActivePanel(panel);
|
|
328
|
+
};
|
|
329
|
+
eventbus_default.on("setActivePanel", handleActivePanel);
|
|
330
|
+
return () => {
|
|
331
|
+
eventbus_default.off("setActivePanel", handleActivePanel);
|
|
332
|
+
};
|
|
333
|
+
}, []);
|
|
334
|
+
const isActive = activePanel === panelID;
|
|
335
|
+
const resolvedIcon = icon !== void 0 ? icon : isActive ? /* @__PURE__ */ jsx5(PanelRightContract, {}) : /* @__PURE__ */ jsx5(PanelRightExpand, {});
|
|
336
|
+
const handleClick = (event) => {
|
|
337
|
+
const next = isActive ? null : panelID;
|
|
338
|
+
eventbus_default.setActivePanel(next);
|
|
339
|
+
onClick?.(event);
|
|
340
|
+
};
|
|
341
|
+
return /* @__PURE__ */ jsx5(
|
|
342
|
+
ToggleButton,
|
|
343
|
+
{
|
|
344
|
+
...rest,
|
|
345
|
+
checked: isActive,
|
|
346
|
+
onClick: handleClick,
|
|
347
|
+
icon: resolvedIcon,
|
|
348
|
+
"aria-pressed": isActive
|
|
349
|
+
}
|
|
350
|
+
);
|
|
351
|
+
};
|
|
352
|
+
var PanelToggle_default = PanelToggle;
|
|
353
|
+
|
|
354
|
+
// src/components/Layout/CoralShellColumn.tsx
|
|
355
|
+
import { jsx as jsx6 } from "react/jsx-runtime";
|
|
356
|
+
var CoralShellColumn = ({ children }) => {
|
|
357
|
+
return /* @__PURE__ */ jsx6(
|
|
358
|
+
"div",
|
|
359
|
+
{
|
|
360
|
+
style: {
|
|
361
|
+
display: "flex",
|
|
362
|
+
flexDirection: "column",
|
|
363
|
+
height: "100vh",
|
|
364
|
+
overflow: "hidden",
|
|
365
|
+
backgroundColor: "var(--colorNeutralBackground3)"
|
|
366
|
+
},
|
|
367
|
+
children
|
|
368
|
+
}
|
|
369
|
+
);
|
|
370
|
+
};
|
|
371
|
+
var CoralShellColumn_default = CoralShellColumn;
|
|
372
|
+
|
|
373
|
+
// src/components/Layout/CoralShellRow.tsx
|
|
374
|
+
import { jsx as jsx7 } from "react/jsx-runtime";
|
|
375
|
+
var CoralShellRow = ({ children }) => {
|
|
376
|
+
return /* @__PURE__ */ jsx7(
|
|
377
|
+
"div",
|
|
378
|
+
{
|
|
379
|
+
style: {
|
|
380
|
+
display: "flex",
|
|
381
|
+
flex: 1,
|
|
382
|
+
overflow: "hidden"
|
|
383
|
+
},
|
|
384
|
+
children
|
|
385
|
+
}
|
|
386
|
+
);
|
|
387
|
+
};
|
|
388
|
+
var CoralShellRow_default = CoralShellRow;
|
|
389
|
+
|
|
390
|
+
// src/components/Panels/PanelLeft.tsx
|
|
391
|
+
import React2, {
|
|
392
|
+
useState as useState2,
|
|
393
|
+
useEffect as useEffect2,
|
|
394
|
+
isValidElement
|
|
395
|
+
} from "react";
|
|
396
|
+
|
|
397
|
+
// src/components/Panels/PanelToolbar.tsx
|
|
398
|
+
import { Body1Strong } from "@fluentui/react-components";
|
|
399
|
+
import { jsx as jsx8, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
400
|
+
var PanelToolbar = ({
|
|
401
|
+
icon,
|
|
402
|
+
title,
|
|
403
|
+
linkTo,
|
|
404
|
+
onLinkClick,
|
|
405
|
+
children
|
|
406
|
+
}) => {
|
|
407
|
+
const TitleContent = /* @__PURE__ */ jsxs3(
|
|
408
|
+
"div",
|
|
409
|
+
{
|
|
410
|
+
className: "panelTitle",
|
|
411
|
+
style: {
|
|
412
|
+
display: "flex",
|
|
413
|
+
alignItems: "center",
|
|
414
|
+
gap: "6px",
|
|
415
|
+
flexShrink: 1,
|
|
416
|
+
overflow: "hidden",
|
|
417
|
+
minWidth: 0
|
|
418
|
+
},
|
|
419
|
+
children: [
|
|
420
|
+
icon && /* @__PURE__ */ jsx8(
|
|
421
|
+
"div",
|
|
422
|
+
{
|
|
423
|
+
style: {
|
|
424
|
+
flexShrink: 0,
|
|
425
|
+
display: "flex",
|
|
426
|
+
alignItems: "center"
|
|
427
|
+
},
|
|
428
|
+
children: icon
|
|
429
|
+
}
|
|
430
|
+
),
|
|
431
|
+
title && /* @__PURE__ */ jsx8(
|
|
432
|
+
Body1Strong,
|
|
433
|
+
{
|
|
434
|
+
style: {
|
|
435
|
+
whiteSpace: "nowrap",
|
|
436
|
+
overflow: "hidden",
|
|
437
|
+
textOverflow: "ellipsis"
|
|
438
|
+
},
|
|
439
|
+
children: title
|
|
440
|
+
}
|
|
441
|
+
)
|
|
442
|
+
]
|
|
443
|
+
}
|
|
444
|
+
);
|
|
445
|
+
const Title = linkTo ? /* @__PURE__ */ jsx8(
|
|
446
|
+
"a",
|
|
447
|
+
{
|
|
448
|
+
href: linkTo,
|
|
449
|
+
onClick: onLinkClick,
|
|
450
|
+
style: {
|
|
451
|
+
textDecoration: "none",
|
|
452
|
+
color: "inherit",
|
|
453
|
+
display: "flex",
|
|
454
|
+
alignItems: "center",
|
|
455
|
+
minWidth: 0,
|
|
456
|
+
flexShrink: 1
|
|
457
|
+
},
|
|
458
|
+
children: TitleContent
|
|
459
|
+
}
|
|
460
|
+
) : TitleContent;
|
|
461
|
+
return /* @__PURE__ */ jsxs3(
|
|
462
|
+
"div",
|
|
463
|
+
{
|
|
464
|
+
className: "panelToolbar",
|
|
465
|
+
style: {
|
|
466
|
+
display: "flex",
|
|
467
|
+
alignItems: "center",
|
|
468
|
+
gap: "8px",
|
|
469
|
+
padding: "16px",
|
|
470
|
+
boxSizing: "border-box",
|
|
471
|
+
height: "56px"
|
|
472
|
+
},
|
|
473
|
+
children: [
|
|
474
|
+
(icon || title) && Title,
|
|
475
|
+
/* @__PURE__ */ jsx8(
|
|
476
|
+
"div",
|
|
477
|
+
{
|
|
478
|
+
className: "panelTools",
|
|
479
|
+
style: {
|
|
480
|
+
display: "flex",
|
|
481
|
+
alignItems: "center",
|
|
482
|
+
flexGrow: 1,
|
|
483
|
+
justifyContent: "flex-end",
|
|
484
|
+
minWidth: 0
|
|
485
|
+
},
|
|
486
|
+
children
|
|
487
|
+
}
|
|
488
|
+
)
|
|
489
|
+
]
|
|
490
|
+
}
|
|
491
|
+
);
|
|
492
|
+
};
|
|
493
|
+
var PanelToolbar_default = PanelToolbar;
|
|
494
|
+
|
|
495
|
+
// src/components/Panels/PanelFooter.tsx
|
|
496
|
+
import { jsx as jsx9 } from "react/jsx-runtime";
|
|
497
|
+
var PanelFooter = ({ children }) => {
|
|
498
|
+
return /* @__PURE__ */ jsx9(
|
|
499
|
+
"div",
|
|
500
|
+
{
|
|
501
|
+
style: {
|
|
502
|
+
padding: "24px 16px",
|
|
503
|
+
width: "100%"
|
|
504
|
+
},
|
|
505
|
+
children
|
|
506
|
+
}
|
|
507
|
+
);
|
|
508
|
+
};
|
|
509
|
+
PanelFooter.displayName = "PanelFooter";
|
|
510
|
+
var PanelFooter_default = PanelFooter;
|
|
511
|
+
|
|
512
|
+
// src/components/Panels/PanelLeft.tsx
|
|
513
|
+
import { jsx as jsx10, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
514
|
+
var PanelLeft = ({
|
|
515
|
+
panelWidth = 500,
|
|
516
|
+
panelResize = true,
|
|
517
|
+
children
|
|
518
|
+
}) => {
|
|
519
|
+
const [width, setWidth] = useState2(panelWidth);
|
|
520
|
+
const [isHandleHovered, setIsHandleHovered] = useState2(false);
|
|
521
|
+
useEffect2(() => {
|
|
522
|
+
setWidth(panelWidth);
|
|
523
|
+
}, [panelWidth]);
|
|
524
|
+
const handleMouseDown = (e) => {
|
|
525
|
+
if (!panelResize) return;
|
|
526
|
+
const startX = e.clientX;
|
|
527
|
+
const startWidth = width;
|
|
528
|
+
const onMouseMove = (moveEvent) => {
|
|
529
|
+
const newWidth = Math.min(
|
|
530
|
+
500,
|
|
531
|
+
Math.max(256, startWidth + (moveEvent.clientX - startX))
|
|
532
|
+
);
|
|
533
|
+
setWidth(newWidth);
|
|
534
|
+
};
|
|
535
|
+
const onMouseUp = () => {
|
|
536
|
+
document.removeEventListener("mousemove", onMouseMove);
|
|
537
|
+
document.removeEventListener("mouseup", onMouseUp);
|
|
538
|
+
document.body.style.userSelect = "";
|
|
539
|
+
};
|
|
540
|
+
document.addEventListener("mousemove", onMouseMove);
|
|
541
|
+
document.addEventListener("mouseup", onMouseUp);
|
|
542
|
+
document.body.style.userSelect = "none";
|
|
543
|
+
};
|
|
544
|
+
const childrenArray = React2.Children.toArray(children);
|
|
545
|
+
const toolbar = childrenArray.find(
|
|
546
|
+
(child) => isValidElement(child) && child.type === PanelToolbar_default
|
|
547
|
+
);
|
|
548
|
+
const footer = childrenArray.find(
|
|
549
|
+
(child) => isValidElement(child) && child.type === PanelFooter_default
|
|
550
|
+
);
|
|
551
|
+
const content = childrenArray.filter(
|
|
552
|
+
(child) => !(isValidElement(child) && (child.type === PanelToolbar_default || child.type === PanelFooter_default))
|
|
553
|
+
);
|
|
554
|
+
return /* @__PURE__ */ jsxs4(
|
|
555
|
+
"div",
|
|
556
|
+
{
|
|
557
|
+
className: "panelLeft",
|
|
558
|
+
style: {
|
|
559
|
+
width: `${width}px`,
|
|
560
|
+
display: "flex",
|
|
561
|
+
flexDirection: "column",
|
|
562
|
+
backgroundColor: "var(--colorNeutralBackground4)",
|
|
563
|
+
height: "100%",
|
|
564
|
+
boxSizing: "border-box",
|
|
565
|
+
position: "relative",
|
|
566
|
+
borderRight: panelResize ? isHandleHovered ? "2px solid var(--colorNeutralStroke2)" : "1px solid var(--colorNeutralStroke2)" : "none"
|
|
567
|
+
},
|
|
568
|
+
children: [
|
|
569
|
+
toolbar && /* @__PURE__ */ jsx10("div", { style: { flexShrink: 0 }, children: toolbar }),
|
|
570
|
+
/* @__PURE__ */ jsx10(
|
|
571
|
+
"div",
|
|
572
|
+
{
|
|
573
|
+
className: "panelContent",
|
|
574
|
+
style: {
|
|
575
|
+
flex: 1,
|
|
576
|
+
overflowY: "auto",
|
|
577
|
+
overflowX: "hidden",
|
|
578
|
+
boxSizing: "border-box"
|
|
579
|
+
},
|
|
580
|
+
children: content
|
|
581
|
+
}
|
|
582
|
+
),
|
|
583
|
+
footer && /* @__PURE__ */ jsx10("div", { children: footer }),
|
|
584
|
+
panelResize && /* @__PURE__ */ jsx10(
|
|
585
|
+
"div",
|
|
586
|
+
{
|
|
587
|
+
className: "resizeHandle",
|
|
588
|
+
onMouseDown: handleMouseDown,
|
|
589
|
+
onMouseEnter: () => setIsHandleHovered(true),
|
|
590
|
+
onMouseLeave: () => setIsHandleHovered(false),
|
|
591
|
+
style: {
|
|
592
|
+
position: "absolute",
|
|
593
|
+
top: 0,
|
|
594
|
+
right: 0,
|
|
595
|
+
width: "2px",
|
|
596
|
+
height: "100%",
|
|
597
|
+
cursor: "ew-resize",
|
|
598
|
+
zIndex: 1,
|
|
599
|
+
backgroundColor: isHandleHovered ? "var(--colorNeutralStroke2)" : "transparent"
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
)
|
|
603
|
+
]
|
|
604
|
+
}
|
|
605
|
+
);
|
|
606
|
+
};
|
|
607
|
+
var PanelLeft_default = PanelLeft;
|
|
608
|
+
|
|
609
|
+
// src/components/Panels/PanelRight.tsx
|
|
610
|
+
import React3, { useState as useState3, useEffect as useEffect3 } from "react";
|
|
611
|
+
import { jsx as jsx11, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
612
|
+
var PanelRight = ({
|
|
613
|
+
panelWidth = 325,
|
|
614
|
+
// Default width if not provided
|
|
615
|
+
panelResize = true,
|
|
616
|
+
panelID,
|
|
617
|
+
defaultClosed = false,
|
|
618
|
+
children
|
|
619
|
+
}) => {
|
|
620
|
+
const [isActive, setIsActive] = useState3(false);
|
|
621
|
+
const [width, setWidth] = useState3(panelWidth);
|
|
622
|
+
const [isHandleHovered, setIsHandleHovered] = useState3(false);
|
|
623
|
+
useEffect3(() => {
|
|
624
|
+
if (eventbus_default.getPanelWidth() === 400) {
|
|
625
|
+
eventbus_default.setPanelWidth(panelWidth);
|
|
626
|
+
}
|
|
627
|
+
setWidth(eventbus_default.getPanelWidth());
|
|
628
|
+
const handleActivePanel = (panel) => {
|
|
629
|
+
setIsActive(panel === panelID);
|
|
630
|
+
};
|
|
631
|
+
const handleWidthChange = (newWidth) => {
|
|
632
|
+
setWidth(newWidth);
|
|
633
|
+
};
|
|
634
|
+
eventbus_default.on("setActivePanel", handleActivePanel);
|
|
635
|
+
eventbus_default.on("panelWidthChanged", handleWidthChange);
|
|
636
|
+
const currentActive = eventbus_default.getActivePanel();
|
|
637
|
+
const shouldActivate = !defaultClosed && currentActive === null;
|
|
638
|
+
const nextActive = shouldActivate ? panelID : currentActive;
|
|
639
|
+
if (shouldActivate) {
|
|
640
|
+
eventbus_default.setActivePanel(panelID);
|
|
641
|
+
} else {
|
|
642
|
+
setIsActive(currentActive === panelID);
|
|
643
|
+
}
|
|
644
|
+
eventbus_default.emit("panelInitState", {
|
|
645
|
+
panelID,
|
|
646
|
+
panelType: panelID,
|
|
647
|
+
isActive: nextActive === panelID
|
|
648
|
+
});
|
|
649
|
+
return () => {
|
|
650
|
+
eventbus_default.off("setActivePanel", handleActivePanel);
|
|
651
|
+
eventbus_default.off("panelWidthChanged", handleWidthChange);
|
|
652
|
+
};
|
|
653
|
+
}, [panelID, panelWidth, defaultClosed]);
|
|
654
|
+
const handleMouseDown = (e) => {
|
|
655
|
+
if (!panelResize) return;
|
|
656
|
+
const startX = e.clientX;
|
|
657
|
+
const startWidth = width;
|
|
658
|
+
const onMouseMove = (moveEvent) => {
|
|
659
|
+
const newWidth = Math.min(
|
|
660
|
+
500,
|
|
661
|
+
// Max width
|
|
662
|
+
Math.max(256, startWidth - (moveEvent.clientX - startX))
|
|
663
|
+
// Min width
|
|
664
|
+
);
|
|
665
|
+
setWidth(newWidth);
|
|
666
|
+
eventbus_default.setPanelWidth(newWidth);
|
|
667
|
+
};
|
|
668
|
+
const onMouseUp = () => {
|
|
669
|
+
document.removeEventListener("mousemove", onMouseMove);
|
|
670
|
+
document.removeEventListener("mouseup", onMouseUp);
|
|
671
|
+
document.body.style.userSelect = "";
|
|
672
|
+
};
|
|
673
|
+
document.addEventListener("mousemove", onMouseMove);
|
|
674
|
+
document.addEventListener("mouseup", onMouseUp);
|
|
675
|
+
document.body.style.userSelect = "none";
|
|
676
|
+
};
|
|
677
|
+
if (!isActive) return null;
|
|
678
|
+
const childrenArray = React3.Children.toArray(children);
|
|
679
|
+
const toolbar = childrenArray.find(
|
|
680
|
+
(child) => React3.isValidElement(child) && child.type === PanelToolbar_default
|
|
681
|
+
);
|
|
682
|
+
const content = childrenArray.filter(
|
|
683
|
+
(child) => !(React3.isValidElement(child) && child.type === PanelToolbar_default)
|
|
684
|
+
);
|
|
685
|
+
return /* @__PURE__ */ jsxs5(
|
|
686
|
+
"div",
|
|
687
|
+
{
|
|
688
|
+
className: "panelRight",
|
|
689
|
+
style: {
|
|
690
|
+
width: `${width}px`,
|
|
691
|
+
display: "flex",
|
|
692
|
+
flexDirection: "column",
|
|
693
|
+
backgroundColor: "var(--colorNeutralBackground3)",
|
|
694
|
+
height: "100%",
|
|
695
|
+
boxSizing: "border-box",
|
|
696
|
+
position: "relative",
|
|
697
|
+
borderLeft: panelResize ? isHandleHovered ? "2px solid var(--colorNeutralStroke2)" : "1px solid var(--colorNeutralStroke2)" : "none"
|
|
698
|
+
},
|
|
699
|
+
children: [
|
|
700
|
+
toolbar && /* @__PURE__ */ jsx11("div", { style: { flexShrink: 0 }, children: toolbar }),
|
|
701
|
+
/* @__PURE__ */ jsx11(
|
|
702
|
+
"div",
|
|
703
|
+
{
|
|
704
|
+
className: "panelContent",
|
|
705
|
+
style: {
|
|
706
|
+
flex: 1,
|
|
707
|
+
overflowY: "auto"
|
|
708
|
+
},
|
|
709
|
+
children: content
|
|
710
|
+
}
|
|
711
|
+
),
|
|
712
|
+
panelResize && /* @__PURE__ */ jsx11(
|
|
713
|
+
"div",
|
|
714
|
+
{
|
|
715
|
+
className: "resizeHandle",
|
|
716
|
+
onMouseDown: handleMouseDown,
|
|
717
|
+
onMouseEnter: () => setIsHandleHovered(true),
|
|
718
|
+
onMouseLeave: () => setIsHandleHovered(false),
|
|
719
|
+
style: {
|
|
720
|
+
position: "absolute",
|
|
721
|
+
top: 0,
|
|
722
|
+
left: 0,
|
|
723
|
+
width: "2px",
|
|
724
|
+
height: "100%",
|
|
725
|
+
cursor: "ew-resize",
|
|
726
|
+
zIndex: 1,
|
|
727
|
+
backgroundColor: isHandleHovered ? "var(--colorNeutralStroke2)" : "transparent"
|
|
728
|
+
}
|
|
729
|
+
}
|
|
730
|
+
)
|
|
731
|
+
]
|
|
732
|
+
}
|
|
733
|
+
);
|
|
734
|
+
};
|
|
735
|
+
var PanelRight_default = PanelRight;
|
|
736
|
+
|
|
737
|
+
// src/components/Content/Content.tsx
|
|
738
|
+
import React4 from "react";
|
|
739
|
+
import { jsx as jsx12, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
740
|
+
var Content = ({ children }) => {
|
|
741
|
+
const childrenArray = React4.Children.toArray(children);
|
|
742
|
+
const toolbar = childrenArray.find(
|
|
743
|
+
(child) => React4.isValidElement(child) && child.type === PanelToolbar_default
|
|
744
|
+
);
|
|
745
|
+
const content = childrenArray.filter(
|
|
746
|
+
(child) => !(React4.isValidElement(child) && child.type === PanelToolbar_default)
|
|
747
|
+
);
|
|
748
|
+
return /* @__PURE__ */ jsxs6(
|
|
749
|
+
"div",
|
|
750
|
+
{
|
|
751
|
+
className: "content",
|
|
752
|
+
style: {
|
|
753
|
+
display: "flex",
|
|
754
|
+
flex: "1",
|
|
755
|
+
flexDirection: "column",
|
|
756
|
+
height: "100%",
|
|
757
|
+
boxSizing: "border-box",
|
|
758
|
+
position: "relative",
|
|
759
|
+
minWidth: "320px"
|
|
760
|
+
},
|
|
761
|
+
children: [
|
|
762
|
+
toolbar && /* @__PURE__ */ jsx12("div", { style: { flexShrink: 0 }, children: toolbar }),
|
|
763
|
+
/* @__PURE__ */ jsx12(
|
|
764
|
+
"div",
|
|
765
|
+
{
|
|
766
|
+
className: "panelContent",
|
|
767
|
+
style: {
|
|
768
|
+
display: "flex",
|
|
769
|
+
flexDirection: "column",
|
|
770
|
+
flex: 1,
|
|
771
|
+
width: "100%",
|
|
772
|
+
overflow: "hidden",
|
|
773
|
+
// prevent double scrollbars
|
|
774
|
+
minHeight: 0
|
|
775
|
+
// allow child to shrink properly
|
|
776
|
+
},
|
|
777
|
+
children: content
|
|
778
|
+
}
|
|
779
|
+
)
|
|
780
|
+
]
|
|
781
|
+
}
|
|
782
|
+
);
|
|
783
|
+
};
|
|
784
|
+
var Content_default = Content;
|
|
785
|
+
|
|
786
|
+
// src/components/PanelNav/PanelNav.tsx
|
|
787
|
+
import * as React5 from "react";
|
|
788
|
+
import {
|
|
789
|
+
makeStyles,
|
|
790
|
+
shorthands,
|
|
791
|
+
tokens,
|
|
792
|
+
Button,
|
|
793
|
+
Body1Strong as Body1Strong2
|
|
794
|
+
} from "@fluentui/react-components";
|
|
795
|
+
import { ChevronDown20Regular } from "@fluentui/react-icons";
|
|
796
|
+
import { jsx as jsx13, jsxs as jsxs7 } from "react/jsx-runtime";
|
|
797
|
+
var useStyles = makeStyles({
|
|
798
|
+
root: {
|
|
799
|
+
display: "flex",
|
|
800
|
+
flexDirection: "column",
|
|
801
|
+
minWidth: 0,
|
|
802
|
+
margin: "8px"
|
|
803
|
+
},
|
|
804
|
+
headerButton: {
|
|
805
|
+
display: "grid",
|
|
806
|
+
gridTemplateColumns: "1fr auto",
|
|
807
|
+
alignItems: "center",
|
|
808
|
+
columnGap: tokens.spacingHorizontalS,
|
|
809
|
+
...shorthands.padding(tokens.spacingVerticalS, tokens.spacingHorizontalS),
|
|
810
|
+
...shorthands.borderRadius(tokens.borderRadiusLarge),
|
|
811
|
+
...shorthands.border("1px", "solid", "transparent"),
|
|
812
|
+
color: tokens.colorNeutralForeground4,
|
|
813
|
+
boxSizing: "border-box",
|
|
814
|
+
height: "48px",
|
|
815
|
+
width: "100%",
|
|
816
|
+
justifyContent: "unset",
|
|
817
|
+
transitionProperty: "color",
|
|
818
|
+
transitionDuration: ".3s",
|
|
819
|
+
":hover": {
|
|
820
|
+
color: tokens.colorNeutralForeground1
|
|
821
|
+
}
|
|
822
|
+
},
|
|
823
|
+
title: {
|
|
824
|
+
minWidth: 0,
|
|
825
|
+
whiteSpace: "nowrap",
|
|
826
|
+
overflow: "hidden",
|
|
827
|
+
textOverflow: "ellipsis",
|
|
828
|
+
textAlign: "left"
|
|
829
|
+
},
|
|
830
|
+
chevron: {
|
|
831
|
+
transitionProperty: "transform",
|
|
832
|
+
transitionDuration: tokens.durationNormal,
|
|
833
|
+
transitionTimingFunction: tokens.curveEasyEase,
|
|
834
|
+
transform: "rotate(-90deg)"
|
|
835
|
+
},
|
|
836
|
+
chevronOpen: {
|
|
837
|
+
transform: "rotate(0deg)"
|
|
838
|
+
},
|
|
839
|
+
items: {
|
|
840
|
+
display: "flex",
|
|
841
|
+
flexDirection: "column"
|
|
842
|
+
},
|
|
843
|
+
itemsCollapsed: {
|
|
844
|
+
display: "none"
|
|
845
|
+
}
|
|
846
|
+
});
|
|
847
|
+
function useControllableBooleanState(params) {
|
|
848
|
+
const { value, defaultValue, onChange } = params;
|
|
849
|
+
const [uncontrolled, setUncontrolled] = React5.useState(defaultValue);
|
|
850
|
+
const isControlled = value !== void 0;
|
|
851
|
+
const current = isControlled ? value : uncontrolled;
|
|
852
|
+
const set = React5.useCallback(
|
|
853
|
+
(ev, next) => {
|
|
854
|
+
if (!isControlled) setUncontrolled(next);
|
|
855
|
+
onChange?.(ev, next);
|
|
856
|
+
},
|
|
857
|
+
[isControlled, onChange]
|
|
858
|
+
);
|
|
859
|
+
return [current, set];
|
|
860
|
+
}
|
|
861
|
+
function PanelNav({
|
|
862
|
+
value,
|
|
863
|
+
defaultValue,
|
|
864
|
+
defaultOpen,
|
|
865
|
+
onValueChange,
|
|
866
|
+
title,
|
|
867
|
+
disabled = false,
|
|
868
|
+
children,
|
|
869
|
+
className
|
|
870
|
+
}) {
|
|
871
|
+
const styles = useStyles();
|
|
872
|
+
const initial = defaultValue ?? defaultOpen ?? false;
|
|
873
|
+
const [open, setOpen] = useControllableBooleanState({
|
|
874
|
+
value,
|
|
875
|
+
defaultValue: initial,
|
|
876
|
+
onChange: (ev, next) => onValueChange?.(ev, { value: next })
|
|
877
|
+
});
|
|
878
|
+
const toggle = React5.useCallback(
|
|
879
|
+
(ev) => {
|
|
880
|
+
if (disabled) return;
|
|
881
|
+
setOpen(ev, !open);
|
|
882
|
+
},
|
|
883
|
+
[disabled, open, setOpen]
|
|
884
|
+
);
|
|
885
|
+
const resolvedTitle = title ?? "Section";
|
|
886
|
+
return /* @__PURE__ */ jsxs7("div", { className: [styles.root, className].filter(Boolean).join(" "), children: [
|
|
887
|
+
/* @__PURE__ */ jsx13(
|
|
888
|
+
Button,
|
|
889
|
+
{
|
|
890
|
+
appearance: "transparent",
|
|
891
|
+
disabled,
|
|
892
|
+
className: styles.headerButton,
|
|
893
|
+
"aria-expanded": open,
|
|
894
|
+
onClick: (ev) => toggle(ev),
|
|
895
|
+
icon: /* @__PURE__ */ jsx13(
|
|
896
|
+
ChevronDown20Regular,
|
|
897
|
+
{
|
|
898
|
+
className: [styles.chevron, open ? styles.chevronOpen : ""].join(" ")
|
|
899
|
+
}
|
|
900
|
+
),
|
|
901
|
+
iconPosition: "after",
|
|
902
|
+
children: /* @__PURE__ */ jsx13(Body1Strong2, { className: styles.title, children: resolvedTitle })
|
|
903
|
+
}
|
|
904
|
+
),
|
|
905
|
+
/* @__PURE__ */ jsx13("div", { className: open ? styles.items : styles.itemsCollapsed, children })
|
|
906
|
+
] });
|
|
907
|
+
}
|
|
908
|
+
|
|
909
|
+
// src/components/PanelNav/PanelNavItem.tsx
|
|
910
|
+
import {
|
|
911
|
+
Button as Button2,
|
|
912
|
+
makeStyles as makeStyles2,
|
|
913
|
+
shorthands as shorthands2,
|
|
914
|
+
tokens as tokens2,
|
|
915
|
+
Subtitle2 as Subtitle22
|
|
916
|
+
} from "@fluentui/react-components";
|
|
917
|
+
import { jsx as jsx14, jsxs as jsxs8 } from "react/jsx-runtime";
|
|
918
|
+
var useStyles2 = makeStyles2({
|
|
919
|
+
root: {
|
|
920
|
+
width: "100%",
|
|
921
|
+
justifyContent: "flex-start",
|
|
922
|
+
textAlign: "left",
|
|
923
|
+
...shorthands2.padding(tokens2.spacingVerticalM, tokens2.spacingHorizontalM),
|
|
924
|
+
...shorthands2.borderRadius(tokens2.borderRadiusLarge),
|
|
925
|
+
...shorthands2.border("1px", "solid", "transparent"),
|
|
926
|
+
boxSizing: "border-box",
|
|
927
|
+
backgroundColor: "transparent",
|
|
928
|
+
color: tokens2.colorNeutralForeground1,
|
|
929
|
+
":hover": {
|
|
930
|
+
backgroundColor: tokens2.colorNeutralBackground2
|
|
931
|
+
},
|
|
932
|
+
":active": {
|
|
933
|
+
backgroundColor: tokens2.colorNeutralBackground3
|
|
934
|
+
},
|
|
935
|
+
":focus-visible": {
|
|
936
|
+
outlineStyle: "solid",
|
|
937
|
+
outlineWidth: tokens2.strokeWidthThick,
|
|
938
|
+
outlineColor: tokens2.colorStrokeFocus2,
|
|
939
|
+
outlineOffset: "2px"
|
|
940
|
+
}
|
|
941
|
+
},
|
|
942
|
+
selected: {
|
|
943
|
+
backgroundColor: tokens2.colorNeutralBackground2,
|
|
944
|
+
...shorthands2.border("1px", "solid", tokens2.colorBrandStroke1),
|
|
945
|
+
":hover": {
|
|
946
|
+
backgroundColor: tokens2.colorNeutralBackground2
|
|
947
|
+
},
|
|
948
|
+
":active": {
|
|
949
|
+
backgroundColor: tokens2.colorNeutralBackground3
|
|
950
|
+
}
|
|
951
|
+
},
|
|
952
|
+
content: {
|
|
953
|
+
display: "grid",
|
|
954
|
+
gridTemplateColumns: "auto 1fr",
|
|
955
|
+
alignItems: "center",
|
|
956
|
+
columnGap: tokens2.spacingHorizontalS,
|
|
957
|
+
minWidth: 0,
|
|
958
|
+
width: "100%"
|
|
959
|
+
},
|
|
960
|
+
icon: {
|
|
961
|
+
display: "flex",
|
|
962
|
+
alignItems: "center",
|
|
963
|
+
color: "inherit"
|
|
964
|
+
},
|
|
965
|
+
title: {
|
|
966
|
+
minWidth: 0,
|
|
967
|
+
whiteSpace: "nowrap",
|
|
968
|
+
overflow: "hidden",
|
|
969
|
+
textOverflow: "ellipsis"
|
|
970
|
+
}
|
|
971
|
+
});
|
|
972
|
+
function PanelNavItem({
|
|
973
|
+
title,
|
|
974
|
+
icon,
|
|
975
|
+
value,
|
|
976
|
+
selected,
|
|
977
|
+
active,
|
|
978
|
+
disabled = false,
|
|
979
|
+
onSelect,
|
|
980
|
+
onClick,
|
|
981
|
+
className
|
|
982
|
+
}) {
|
|
983
|
+
const styles = useStyles2();
|
|
984
|
+
const isSelected = selected ?? active ?? false;
|
|
985
|
+
return /* @__PURE__ */ jsx14(
|
|
986
|
+
Button2,
|
|
987
|
+
{
|
|
988
|
+
appearance: "subtle",
|
|
989
|
+
disabled,
|
|
990
|
+
className: [styles.root, isSelected ? styles.selected : "", className ?? ""].filter(Boolean).join(" "),
|
|
991
|
+
"aria-current": isSelected ? "page" : void 0,
|
|
992
|
+
onClick: (ev) => {
|
|
993
|
+
onClick?.(ev);
|
|
994
|
+
onSelect?.(ev, { value });
|
|
995
|
+
},
|
|
996
|
+
children: /* @__PURE__ */ jsxs8("span", { className: styles.content, children: [
|
|
997
|
+
icon ? /* @__PURE__ */ jsx14("span", { className: styles.icon, children: icon }) : null,
|
|
998
|
+
/* @__PURE__ */ jsx14(Subtitle22, { className: styles.title, children: title })
|
|
999
|
+
] })
|
|
1000
|
+
}
|
|
1001
|
+
);
|
|
1002
|
+
}
|
|
1003
|
+
|
|
1004
|
+
// src/components/Panels/UserCard.tsx
|
|
1005
|
+
import {
|
|
1006
|
+
Avatar as Avatar2,
|
|
1007
|
+
Body1Strong as Body1Strong3,
|
|
1008
|
+
Caption1
|
|
1009
|
+
} from "@fluentui/react-components";
|
|
1010
|
+
import { jsx as jsx15, jsxs as jsxs9 } from "react/jsx-runtime";
|
|
1011
|
+
var PanelUserCard = ({ name, alias, ...avatarProps }) => {
|
|
1012
|
+
return /* @__PURE__ */ jsxs9(
|
|
1013
|
+
"div",
|
|
1014
|
+
{
|
|
1015
|
+
style: {
|
|
1016
|
+
display: "flex",
|
|
1017
|
+
gap: "12px",
|
|
1018
|
+
alignItems: "center",
|
|
1019
|
+
margin: "16px"
|
|
1020
|
+
},
|
|
1021
|
+
children: [
|
|
1022
|
+
/* @__PURE__ */ jsx15(
|
|
1023
|
+
Avatar2,
|
|
1024
|
+
{
|
|
1025
|
+
name,
|
|
1026
|
+
...avatarProps
|
|
1027
|
+
}
|
|
1028
|
+
),
|
|
1029
|
+
/* @__PURE__ */ jsxs9("div", { style: { display: "flex", flexDirection: "column" }, children: [
|
|
1030
|
+
/* @__PURE__ */ jsx15(Body1Strong3, { children: name }),
|
|
1031
|
+
alias && /* @__PURE__ */ jsx15(Caption1, { style: { color: "var(--colorNeutralForeground3)" }, children: alias })
|
|
1032
|
+
] })
|
|
1033
|
+
]
|
|
1034
|
+
}
|
|
1035
|
+
);
|
|
1036
|
+
};
|
|
1037
|
+
var UserCard_default = PanelUserCard;
|
|
1038
|
+
export {
|
|
1039
|
+
Button3 as Button,
|
|
1040
|
+
Content_default as Content,
|
|
1041
|
+
CoralProvider,
|
|
1042
|
+
CoralShellColumn_default as CoralShellColumn,
|
|
1043
|
+
CoralShellRow_default as CoralShellRow,
|
|
1044
|
+
Header_default as Header,
|
|
1045
|
+
HeaderTools_default as HeaderTools,
|
|
1046
|
+
bundleicons_default as LeafOne,
|
|
1047
|
+
PanelLeft_default as PanelLeft,
|
|
1048
|
+
PanelNav,
|
|
1049
|
+
PanelNavItem,
|
|
1050
|
+
PanelRight_default as PanelRight,
|
|
1051
|
+
PanelToggle_default as PanelToggle,
|
|
1052
|
+
PanelToolbar_default as PanelToolbar,
|
|
1053
|
+
Tab,
|
|
1054
|
+
TabList,
|
|
1055
|
+
ToggleButton2 as ToggleButton,
|
|
1056
|
+
UserCard_default as UserCard,
|
|
1057
|
+
coralDarkTheme,
|
|
1058
|
+
coralLightTheme
|
|
1059
|
+
};
|
|
1060
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/provider/CoralProvider.tsx","../src/theme/theme.ts","../src/index.ts","../src/components/Header/Header.tsx","../src/imports/MsftColor.tsx","../src/components/Header/HeaderTools.tsx","../src/components/Panels/PanelToggle.tsx","../src/imports/bundleicons.tsx","../src/components/eventbus.tsx","../src/components/Layout/CoralShellColumn.tsx","../src/components/Layout/CoralShellRow.tsx","../src/components/Panels/PanelLeft.tsx","../src/components/Panels/PanelToolbar.tsx","../src/components/Panels/PanelFooter.tsx","../src/components/Panels/PanelRight.tsx","../src/components/Content/Content.tsx","../src/components/PanelNav/PanelNav.tsx","../src/components/PanelNav/PanelNavItem.tsx","../src/components/Panels/UserCard.tsx"],"sourcesContent":["import * as React from \"react\";\r\nimport { FluentProvider, type Theme } from \"@fluentui/react-components\";\r\nimport { coralLightTheme, coralDarkTheme } from \"../theme/theme\";\r\n\r\nexport type CoralColorScheme = \"light\" | \"dark\";\r\n\r\nexport type CoralProviderProps = {\r\n children: React.ReactNode;\r\n theme?: Theme | CoralColorScheme;\r\n};\r\n\r\nexport function CoralProvider({ children, theme = coralLightTheme }: CoralProviderProps) {\r\n const resolvedTheme =\r\n typeof theme === \"string\" ? (theme === \"dark\" ? coralDarkTheme : coralLightTheme) : theme;\r\n\r\n return <FluentProvider theme={resolvedTheme}>{children}</FluentProvider>;\r\n}","import { createLightTheme, createDarkTheme, type Theme } from '@fluentui/react-components';\r\n\r\nconst brand = {\r\n  10: \"#09000C\",\r\n  20: \"#280045\",\r\n  30: \"#36006E\",\r\n  40: \"#3D0098\",\r\n  50: \"#3500CD\",\r\n  60: \"#0112FF\",\r\n  70: \"#2735FF\",\r\n  80: \"#3C4CFF\",\r\n  90: \"#4E5FFF\",\r\n  100: \"#5E72FF\",\r\n  110: \"#6F83FF\",\r\n  120: \"#7F94FF\",\r\n  130: \"#90A5FF\",\r\n  140: \"#A1B6FF\",\r\n  150: \"#B4C6FF\",\r\n  160: \"#dbe5ff\",\r\n} as const;\r\n\r\nexport const coralLightTheme: Theme = createLightTheme(brand as any);\r\nexport const coralDarkTheme: Theme = createDarkTheme(brand as any);\r\n","export * from './provider/CoralProvider';\r\nexport * from './theme/theme';\r\n\r\n\r\n// re-export Fluent temporarily (so apps import from Coral)\r\nexport { Button, ToggleButton, Tab, TabList } from '@fluentui/react-components';\r\n\r\n// Components (default exports -> named re-exports)\r\nexport { default as Header } from \"./components/Header/Header\";\r\nexport { default as HeaderTools } from \"./components/Header/HeaderTools\";\r\nexport { default as PanelToggle } from \"./components/Panels/PanelToggle\";\n\r\nexport { default as CoralShellColumn } from \"./components/Layout/CoralShellColumn\";\r\nexport { default as CoralShellRow } from \"./components/Layout/CoralShellRow\";\r\n\r\nexport { default as PanelLeft } from \"./components/Panels/PanelLeft\";\r\nexport { default as PanelToolbar } from \"./components/Panels/PanelToolbar\";\r\nexport { default as PanelRight } from \"./components/Panels/PanelRight\";\r\n\r\nexport { default as Content } from \"./components/Content/Content\";\r\nexport { PanelNav } from \"./components/PanelNav/PanelNav\";\r\nexport { PanelNavItem } from \"./components/PanelNav/PanelNavItem\";\r\nexport { default as UserCard } from \"./components/Panels/UserCard\";\r\n\r\n// icons (export LeafOne as a component)\r\nexport { default as LeafOne } from './imports/bundleicons';\r\n","import React from \"react\";\r\nimport { Avatar, Subtitle2 } from \"@fluentui/react-components\";\r\nimport MsftColor from \"../../imports/MsftColor\"; // Default icon component\r\n\r\n/**\r\n * @component\r\n * @name Header\r\n * @description A header component for displaying a logo, title, and optional subtitle.\r\n * \r\n * @prop {React.ReactNode} [logo] - Custom logo (defaults to Microsoft icon).\r\n * @prop {string} [title=\"Microsoft\"] - Main title text.\r\n * @prop {string} [subtitle] - Optional subtitle displayed next to the title.\r\n * @prop {React.ReactNode} [children] - Optional header toolbar (e.g., buttons, menus).\r\n */\r\ntype HeaderProps = {\r\n logo?: React.ReactNode;\r\n title?: string;\r\n subtitle?: string;\r\n children?: React.ReactNode;\r\n};\r\n\r\nconst Header: React.FC<HeaderProps> = ({ logo, title = \"Microsoft\", subtitle, children }) => {\r\n return (\r\n <header\r\n style={{\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n width: \"100%\",\r\n backgroundColor: \"var(--colorNeutralBackgroundAlpha)\",\r\n borderBottom: \"1px solid var(--colorNeutralStroke2)\",\r\n padding: \"16px\",\r\n height: \"64px\",\r\n boxSizing: \"border-box\",\r\n gap: \"12px\",\r\n }}\r\n data-figma-component=\"Header\"\r\n >\r\n <div\r\n style={{\r\n display: \"flex\",\r\n justifyContent: \"space-between\",\r\n alignItems: \"center\",\r\n gap: \"8px\",\r\n }}\r\n >\r\n {/* Render custom logo or default MsftColor logo */}\r\n <Avatar \r\n shape=\"square\" \r\n color=\"neutral\" \r\n icon={{ children: logo || <MsftColor /> }} \r\n />\r\n\r\n {/* Render title and optional subtitle */}\r\n <Subtitle2 style={{ whiteSpace: \"nowrap\", marginTop: \"-2px\" }}>\r\n {title}\r\n {subtitle && (\r\n <span style={{ fontWeight: \"400\" }}> | {subtitle}</span>\r\n )}\r\n </Subtitle2>\r\n </div>\r\n\r\n {/* HEADER TOOLBAR (rendered only if passed as a child) */}\r\n {children}\r\n </header>\r\n );\r\n};\r\n\r\nexport default Header;\r\n","import React from 'react';\r\n\r\nconst MicrosoftLogo: React.FC = () => {\r\n return (\r\n <svg\r\n width=\"32\"\r\n height=\"32\"\r\n viewBox=\"0 0 32 32\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path d=\"M5.04349 5.04349H15.4783V15.4783H5.04349V5.04349Z\" fill=\"#F35325\" />\r\n <path d=\"M16.5217 5.04349H26.9565V15.4783H16.5217V5.04349Z\" fill=\"#81BC06\" />\r\n <path d=\"M5.04349 16.5217H15.4783V26.9565H5.04349V16.5217Z\" fill=\"#05A6F0\" />\r\n <path d=\"M16.5217 16.5217H26.9565V26.9565H16.5217V16.5217Z\" fill=\"#FFBA08\" />\r\n </svg>\r\n );\r\n};\r\n\r\nexport default MicrosoftLogo;\r\n","import React from \"react\";\nimport { Toolbar } from \"@fluentui/react-components\";\n\r\n\r\ninterface HeaderToolsProps {\r\n children?: React.ReactNode;\r\n}\r\n\r\nconst HeaderTools: React.FC<HeaderToolsProps> = ({ children }) => {\r\n\r\n\r\n return (\r\n <Toolbar\r\n style={{\r\n display: \"flex\",\r\n flex: \"0\",\r\n alignItems: \"center\",\r\n flexDirection: \"row-reverse\",\r\n padding: \"4px 0\",\r\n }}\r\n >\r\n {children}\r\n </Toolbar>\r\n );\r\n};\r\n\r\nexport default HeaderTools;\r\n","import React, { useEffect, useState } from \"react\";\nimport { ToggleButton } from \"@fluentui/react-components\";\nimport type { ToggleButtonProps } from \"@fluentui/react-components\";\nimport { PanelRightContract, PanelRightExpand } from \"../../imports/bundleicons.js\";\nimport eventBus from \"../eventbus.js\";\n\ntype ToggleButtonButtonProps = Extract<ToggleButtonProps, { as?: \"button\" }>;\n\ntype PanelToggleProps = Omit<\n ToggleButtonButtonProps,\n \"as\" | \"checked\" | \"defaultChecked\" | \"icon\" | \"onClick\"\n> & {\n panelID: string;\n icon?: ToggleButtonButtonProps[\"icon\"];\n onClick?: React.MouseEventHandler<HTMLButtonElement>;\n};\n\nconst PanelToggle: React.FC<PanelToggleProps> = ({\n panelID,\n icon,\n onClick,\n ...rest\n}) => {\n const [activePanel, setActivePanel] = useState<string | null>(() =>\n eventBus.getActivePanel()\n );\n\n useEffect(() => {\n const handleActivePanel = (panel: string | null) => {\n setActivePanel(panel);\n };\n\n eventBus.on(\"setActivePanel\", handleActivePanel);\n\n return () => {\n eventBus.off(\"setActivePanel\", handleActivePanel);\n };\n }, []);\n\n const isActive = activePanel === panelID;\n\n const resolvedIcon = icon !== undefined\n ? icon\n : isActive\n ? <PanelRightContract />\n : <PanelRightExpand />;\n\n const handleClick: React.MouseEventHandler<HTMLButtonElement> = (event) => {\n const next = isActive ? null : panelID;\n eventBus.setActivePanel(next);\n onClick?.(event);\n };\n\n return (\n <ToggleButton\n {...rest}\n checked={isActive}\n onClick={handleClick}\n icon={resolvedIcon}\n aria-pressed={isActive}\n />\n );\n};\n\nexport default PanelToggle;\n","//DEV NOTES:\r\n//It's recommended to create bundleIcons for icons that nest within Fluent components and then import them into your project.\r\n// See full catalog of icons at https://react.fluentui.dev/?path=/docs/icons-catalog--docs.\r\n\r\nimport {\r\n ArrowExitFilled,\r\n ArrowExitRegular,\r\n BeakerFilled,\r\n BeakerRegular,\r\n BookmarkFilled,\r\n BookmarkRegular,\r\n CodeFilled,\r\n CodeRegular,\r\n CubeFilled,\r\n CubeRegular,\r\n DesignIdeasFilled,\r\n DesignIdeasRegular,\r\n DrawerArrowDownloadFilled,\r\n DrawerArrowDownloadRegular,\r\n FlowFilled,\r\n FlowRegular,\r\n FolderOpenFilled,\r\n FolderOpenRegular,\r\n LeafOneFilled,\r\n LeafOneRegular,\r\n LinkFilled,\r\n LinkRegular,\r\n OpenFilled,\r\n OpenRegular,\r\n OrganizationHorizontalFilled,\r\n OrganizationHorizontalRegular,\r\n PanelLeftContractFilled,\r\n PanelLeftContractRegular,\r\n PanelLeftExpandFilled,\r\n PanelLeftExpandRegular,\r\n PanelRightContractFilled,\r\n PanelRightContractRegular,\r\n PanelRightExpandFilled,\r\n PanelRightExpandRegular,\r\n PersonFilled,\r\n PersonRegular,\r\n PersonFeedbackFilled,\r\n PersonFeedbackRegular,\r\n SearchFilled,\r\n SearchRegular,\r\n SendFilled,\r\n SendRegular,\r\n ShareFilled,\r\n ShareRegular,\r\n TreeDeciduousFilled,\r\n TreeDeciduousRegular,\r\n TreeEvergreenFilled,\r\n TreeEvergreenRegular,\r\n WeatherMoonFilled,\r\n WeatherMoonRegular,\r\n WeatherSunnyFilled,\r\n WeatherSunnyRegular,\r\n DismissFilled,\r\n DismissRegular,\r\n DocumentSparkleFilled,\r\n DocumentSparkleRegular,\r\n SparkleFilled,\r\n SparkleRegular,\r\n StarFilled,\r\n StarRegular,\r\n MoreHorizontalFilled,\r\n MoreHorizontalRegular,\r\n bundleIcon,\r\n CopyFilled,\r\n CopyRegular,\r\n HistoryFilled,\r\n HistoryRegular,\r\n TaskListSquareLtrFilled,\r\n TaskListSquareLtrRegular,\r\n\r\n } from \"@fluentui/react-icons\";\r\n \r\n export const TaskListSquareLtr = bundleIcon(TaskListSquareLtrFilled, TaskListSquareLtrRegular);\r\n export const History = bundleIcon(HistoryFilled, HistoryRegular);\r\n export const Copy = bundleIcon(CopyFilled, CopyRegular);\r\n export const Send = bundleIcon(SendFilled, SendRegular);\r\n export const MoreHorizontal = bundleIcon(MoreHorizontalFilled, MoreHorizontalRegular);\r\n export const ArrowExit = bundleIcon(ArrowExitFilled, ArrowExitRegular);\r\n export const Bookmark = bundleIcon(BookmarkFilled, BookmarkRegular);\r\n export const Sparkle = bundleIcon(SparkleFilled, SparkleRegular);\r\n export const Star = bundleIcon(StarFilled, StarRegular);\r\n export const DocumentSparkle = bundleIcon(DocumentSparkleFilled, DocumentSparkleRegular);\r\n export const Dismiss = bundleIcon(DismissFilled, DismissRegular);\r\n export const DrawerArrowDownload = bundleIcon(DrawerArrowDownloadFilled, DrawerArrowDownloadRegular);\r\n export const Beaker = bundleIcon(BeakerFilled, BeakerRegular);\r\n export const Code = bundleIcon(CodeFilled, CodeRegular);\r\n export const Cube = bundleIcon(CubeFilled, CubeRegular);\r\n export const DesignIdeas = bundleIcon(DesignIdeasFilled, DesignIdeasRegular);\r\n export const Flow = bundleIcon(FlowFilled, FlowRegular);\r\n export const FolderOpen = bundleIcon(FolderOpenFilled, FolderOpenRegular);\r\n export const LeafOne = bundleIcon(LeafOneFilled, LeafOneRegular);\r\n export const Link = bundleIcon(LinkFilled, LinkRegular);\r\n export const Open = bundleIcon(OpenFilled, OpenRegular);\r\n export const OrganizationHorizontal = bundleIcon(\r\n OrganizationHorizontalFilled,\r\n OrganizationHorizontalRegular\r\n );\r\n export const PanelLeftContract = bundleIcon(\r\n PanelLeftContractFilled,\r\n PanelLeftContractRegular\r\n );\r\n export const PanelLeftExpand = bundleIcon(\r\n PanelLeftExpandFilled,\r\n PanelLeftExpandRegular\r\n );\r\n export const PanelRightContract = bundleIcon(\r\n PanelRightContractFilled,\r\n PanelRightContractRegular\r\n );\r\n export const PanelRightExpand = bundleIcon(\r\n PanelRightExpandFilled,\r\n PanelRightExpandRegular\r\n );\r\n export const Person = bundleIcon(PersonFilled, PersonRegular);\r\n export const PersonFeedback = bundleIcon(\r\n PersonFeedbackFilled,\r\n PersonFeedbackRegular\r\n );\r\n export const Search = bundleIcon(SearchFilled, SearchRegular);\r\n export const Share = bundleIcon(ShareFilled, ShareRegular);\r\n export const TreeDeciduous = bundleIcon(\r\n TreeDeciduousFilled,\r\n TreeDeciduousRegular\r\n );\r\n export const TreeEvergreen = bundleIcon(\r\n TreeEvergreenFilled,\r\n TreeEvergreenRegular\r\n );\r\n export const WeatherMoon = bundleIcon(WeatherMoonFilled, WeatherMoonRegular);\r\n export const WeatherSunny = bundleIcon(WeatherSunnyFilled, WeatherSunnyRegular);\r\n \r\n export default {bundleIcon}\r\n ","type EventCallback = (...args: any[]) => void;\r\n\r\nclass EventBus {\r\n private events: { [key: string]: EventCallback[] } = {};\r\n private panelWidth: number = 400;\n private activePanel: string | null = null;\n\r\n on(event: string, callback: EventCallback) {\r\n if (!this.events[event]) {\r\n this.events[event] = [];\r\n }\r\n this.events[event].push(callback);\r\n }\r\n\r\n off(event: string, callback: EventCallback) {\r\n if (!this.events[event]) return;\r\n this.events[event] = this.events[event].filter(cb => cb !== callback);\r\n }\r\n\r\n emit(event: string, ...args: any[]) {\r\n if (!this.events[event]) return;\r\n this.events[event].forEach(callback => callback(...args));\r\n }\r\n\r\n // Panel control\r\n setActivePanel(panelID: string | null) {\n this.activePanel = panelID;\n this.emit(\"setActivePanel\", panelID);\n }\n\n getActivePanel(): string | null {\n return this.activePanel;\n }\n\r\n // Shared panel width\r\n setPanelWidth(width: number) {\r\n this.panelWidth = width;\r\n this.emit(\"panelWidthChanged\", width);\r\n }\r\n\r\n getPanelWidth(): number {\r\n return this.panelWidth;\r\n }\r\n}\r\n\r\nconst eventBus = new EventBus();\r\nexport default eventBus;\r\n","// coral.config/components/Layout/CoralShellColumn.tsx\r\n// Structural wrapper for top-level app layout (vertical orientation)\r\n\r\nimport React from \"react\";\r\n\r\nconst CoralShellColumn: React.FC<{ children: React.ReactNode }> = ({ children }) => {\r\n return (\r\n <div\r\n style={{\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n height: \"100vh\",\r\n overflow: \"hidden\",\r\n backgroundColor: \"var(--colorNeutralBackground3)\",\r\n }}\r\n >\r\n {children}\r\n </div>\r\n );\r\n};\r\n\r\nexport default CoralShellColumn;\r\n\r\n\r\n\r\n","// coral.config/components/Layout/CoralShellRow.tsx\r\n// Structural wrapper for main workspace layout (horizontal split)\r\n\r\nimport React from \"react\";\r\n\r\nconst CoralShellRow: React.FC<{ children: React.ReactNode }> = ({ children }) => {\r\n return (\r\n <div\r\n style={{\r\n display: \"flex\",\r\n flex: 1,\r\n overflow: \"hidden\",\r\n }}\r\n >\r\n {children}\r\n </div>\r\n );\r\n};\r\n\r\nexport default CoralShellRow;","import React, {\r\n useState,\r\n useEffect,\r\n ReactNode,\r\n ReactElement,\r\n isValidElement,\r\n} from \"react\";\r\nimport PanelToolbar from \"./PanelToolbar.js\";\nimport PanelFooter from \"./PanelFooter\"; // 👈 new\r\nimport {\r\n Avatar,\r\n Body1,\r\n Body1Strong,\r\n Caption1,\r\n} from \"@fluentui/react-components\";\r\n\r\ninterface PanelLeftProps {\r\n panelWidth?: number;\r\n panelResize?: boolean;\r\n children?: ReactNode;\r\n}\r\n\r\nconst PanelLeft: React.FC<PanelLeftProps> = ({\r\n panelWidth = 500,\r\n panelResize = true,\r\n children,\r\n}) => {\r\n const [width, setWidth] = useState(panelWidth);\r\n const [isHandleHovered, setIsHandleHovered] = useState(false);\r\n\r\n useEffect(() => {\r\n setWidth(panelWidth);\r\n }, [panelWidth]);\r\n\r\n const handleMouseDown = (e: React.MouseEvent<HTMLDivElement>) => {\r\n if (!panelResize) return;\r\n\r\n const startX = e.clientX;\r\n const startWidth = width;\r\n\r\n const onMouseMove = (moveEvent: MouseEvent) => {\r\n const newWidth = Math.min(\r\n 500,\r\n Math.max(256, startWidth + (moveEvent.clientX - startX))\r\n );\r\n setWidth(newWidth);\r\n };\r\n\r\n const onMouseUp = () => {\r\n document.removeEventListener(\"mousemove\", onMouseMove);\r\n document.removeEventListener(\"mouseup\", onMouseUp);\r\n document.body.style.userSelect = \"\";\r\n };\r\n\r\n document.addEventListener(\"mousemove\", onMouseMove);\r\n document.addEventListener(\"mouseup\", onMouseUp);\r\n document.body.style.userSelect = \"none\";\r\n };\r\n\r\n const childrenArray = React.Children.toArray(children) as ReactElement[];\r\n const toolbar = childrenArray.find(\r\n (child) => isValidElement(child) && child.type === PanelToolbar\r\n );\r\n const footer = childrenArray.find(\r\n (child) => isValidElement(child) && child.type === PanelFooter\r\n );\r\n const content = childrenArray.filter(\r\n (child) =>\r\n !(\r\n isValidElement(child) &&\r\n (child.type === PanelToolbar || child.type === PanelFooter)\r\n )\r\n );\r\n\r\n return (\r\n <div\r\n className=\"panelLeft\"\r\n style={{\r\n width: `${width}px`,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n backgroundColor: \"var(--colorNeutralBackground4)\",\r\n height: \"100%\",\r\n boxSizing: \"border-box\",\r\n position: \"relative\",\r\n borderRight: panelResize\r\n ? isHandleHovered\r\n ? \"2px solid var(--colorNeutralStroke2)\"\r\n : \"1px solid var(--colorNeutralStroke2)\"\r\n : \"none\",\r\n }}\r\n >\r\n {toolbar && <div style={{ flexShrink: 0 }}>{toolbar}</div>}\r\n\r\n <div\r\n className=\"panelContent\"\r\n style={{\r\n flex: 1,\r\n overflowY: \"auto\",\r\n overflowX: \"hidden\",\r\n boxSizing: \"border-box\",\r\n }}\r\n >\r\n {content}\r\n </div>\r\n\r\n {footer && <div>{footer}</div>}\r\n\r\n {panelResize && (\r\n <div\r\n className=\"resizeHandle\"\r\n onMouseDown={handleMouseDown}\r\n onMouseEnter={() => setIsHandleHovered(true)}\r\n onMouseLeave={() => setIsHandleHovered(false)}\r\n style={{\r\n position: \"absolute\",\r\n top: 0,\r\n right: 0,\r\n width: \"2px\",\r\n height: \"100%\",\r\n cursor: \"ew-resize\",\r\n zIndex: 1,\r\n backgroundColor: isHandleHovered\r\n ? \"var(--colorNeutralStroke2)\"\r\n : \"transparent\",\r\n }}\r\n />\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default PanelLeft;\r\n","import React, { ReactNode } from \"react\";\nimport { Body1Strong } from \"@fluentui/react-components\";\n\nexport interface PanelToolbarProps {\n icon?: ReactNode;\n title?: string | null;\n\n /** If provided, the title area becomes a link */\n linkTo?: string;\n\n /** Optional: for real nav, you can prevent full page reload */\n onLinkClick?: (e: React.MouseEvent<HTMLAnchorElement>) => void;\n\n children?: ReactNode;\n}\n\nconst PanelToolbar: React.FC<PanelToolbarProps> = ({\n icon,\n title,\n linkTo,\n onLinkClick,\n children,\n}) => {\n const TitleContent = (\n <div\n className=\"panelTitle\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"6px\",\n flexShrink: 1,\n overflow: \"hidden\",\n minWidth: 0,\n }}\n >\n {icon && (\n <div\n style={{\n flexShrink: 0,\n display: \"flex\",\n alignItems: \"center\",\n }}\n >\n {icon}\n </div>\n )}\n\n {title && (\n <Body1Strong\n style={{\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n }}\n >\n {title}\n </Body1Strong>\n )}\n </div>\n );\n\n const Title = linkTo ? (\n <a\n href={linkTo}\n onClick={onLinkClick}\n style={{\n textDecoration: \"none\",\n color: \"inherit\",\n display: \"flex\",\n alignItems: \"center\",\n minWidth: 0,\n flexShrink: 1,\n }}\n >\n {TitleContent}\n </a>\n ) : (\n TitleContent\n );\n\n return (\n <div\n className=\"panelToolbar\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: \"8px\",\n padding: \"16px\",\n boxSizing: \"border-box\",\n height: \"56px\",\n }}\n >\n {(icon || title) && Title}\n\n <div\n className=\"panelTools\"\n style={{\n display: \"flex\",\n alignItems: \"center\",\n flexGrow: 1,\n justifyContent: \"flex-end\",\n minWidth: 0,\n }}\n >\n {children}\n </div>\n </div>\n );\n};\n\nexport default PanelToolbar;\n","import React from \"react\";\r\n\r\nconst PanelFooter: React.FC<{ children: React.ReactNode }> = ({ children }) => {\r\n return (\r\n <div\r\n style={{\r\n padding: \"24px 16px\",\r\n width:'100%'\r\n }}\r\n >\r\n {children}\r\n </div>\r\n );\r\n};\r\n\r\nPanelFooter.displayName = \"PanelFooter\";\r\n\r\nexport default PanelFooter;\r\n","import React, { useState, useEffect, ReactNode, ReactElement } from \"react\";\r\nimport eventBus from \"../eventbus.js\";\r\nimport PanelToolbar from \"./PanelToolbar.js\"; // Import to identify toolbar\n\r\ninterface PanelRightProps {\n panelWidth?: number; // Optional width of the panel\n panelResize?: boolean; // Whether resizing is enabled\n panelID: string; // Panel identifier to match PanelToggle\n defaultClosed?: boolean;\n children?: ReactNode;\n}\n\r\nconst PanelRight: React.FC<PanelRightProps> = ({\r\n panelWidth = 325, // Default width if not provided\n panelResize = true,\n panelID,\n defaultClosed = false,\n children,\n}) => {\n const [isActive, setIsActive] = useState(false);\n const [width, setWidth] = useState<number>(panelWidth); // Initial width from props or default\n const [isHandleHovered, setIsHandleHovered] = useState(false);\n\n useEffect(() => {\n // Initialize shared width if not already set in the EventBus\r\n if (eventBus.getPanelWidth() === 400) {\r\n eventBus.setPanelWidth(panelWidth); // Use the provided panelWidth prop\r\n }\r\n setWidth(eventBus.getPanelWidth()); // Set the current width from EventBus\r\n\r\n const handleActivePanel = (panel: string | null) => {\n setIsActive(panel === panelID); // Check if this panelID matches the active panel\n };\n\r\n const handleWidthChange = (newWidth: number) => {\r\n setWidth(newWidth); // Update width when EventBus notifies\r\n };\r\n\r\n eventBus.on(\"setActivePanel\", handleActivePanel);\n eventBus.on(\"panelWidthChanged\", handleWidthChange);\n\n const currentActive = eventBus.getActivePanel();\n const shouldActivate = !defaultClosed && currentActive === null;\n const nextActive = shouldActivate ? panelID : currentActive;\n\n if (shouldActivate) {\n eventBus.setActivePanel(panelID);\n } else {\n setIsActive(currentActive === panelID);\n }\n\n eventBus.emit(\"panelInitState\", {\n panelID,\n panelType: panelID,\n isActive: nextActive === panelID,\n });\n\r\n return () => {\r\n eventBus.off(\"setActivePanel\", handleActivePanel);\n eventBus.off(\"panelWidthChanged\", handleWidthChange);\n };\n }, [panelID, panelWidth, defaultClosed]);\n\n const handleMouseDown = (e: React.MouseEvent<HTMLDivElement>) => {\n if (!panelResize) return;\r\n\r\n const startX = e.clientX;\r\n const startWidth = width;\r\n\r\n const onMouseMove = (moveEvent: MouseEvent) => {\r\n const newWidth = Math.min(\r\n 500, // Max width\r\n Math.max(256, startWidth - (moveEvent.clientX - startX)) // Min width\r\n );\r\n setWidth(newWidth);\r\n eventBus.setPanelWidth(newWidth); // Persist the new width in EventBus\r\n };\r\n\r\n const onMouseUp = () => {\r\n document.removeEventListener(\"mousemove\", onMouseMove);\r\n document.removeEventListener(\"mouseup\", onMouseUp);\r\n document.body.style.userSelect = \"\";\r\n };\r\n\r\n document.addEventListener(\"mousemove\", onMouseMove);\r\n document.addEventListener(\"mouseup\", onMouseUp);\r\n\r\n document.body.style.userSelect = \"none\";\r\n };\r\n\r\n if (!isActive) return null; // Do not render if not active\r\n\r\n const childrenArray = React.Children.toArray(children) as ReactElement[];\r\n const toolbar = childrenArray.find(\n (child) => React.isValidElement(child) && child.type === PanelToolbar\n );\n const content = childrenArray.filter(\n (child) => !(React.isValidElement(child) && child.type === PanelToolbar)\n );\n\r\n return (\r\n <div\r\n className=\"panelRight\"\r\n style={{\r\n width: `${width}px`,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n backgroundColor: \"var(--colorNeutralBackground3)\",\r\n height: \"100%\",\r\n boxSizing: \"border-box\",\r\n position: \"relative\",\r\n borderLeft: panelResize\r\n ? isHandleHovered\r\n ? \"2px solid var(--colorNeutralStroke2)\"\r\n : \"1px solid var(--colorNeutralStroke2)\"\r\n : \"none\",\r\n }}\r\n >\r\n {toolbar && <div style={{ flexShrink: 0 }}>{toolbar}</div>}\r\n\r\n <div\r\n className=\"panelContent\"\r\n style={{\r\n flex: 1,\r\n overflowY: \"auto\",\r\n }}\r\n >\r\n {content}\r\n </div>\r\n\r\n {panelResize && (\r\n <div\r\n className=\"resizeHandle\"\r\n onMouseDown={handleMouseDown}\r\n onMouseEnter={() => setIsHandleHovered(true)}\r\n onMouseLeave={() => setIsHandleHovered(false)}\r\n style={{\r\n position: \"absolute\",\r\n top: 0,\r\n left: 0,\r\n width: \"2px\",\r\n height: \"100%\",\r\n cursor: \"ew-resize\",\r\n zIndex: 1,\r\n backgroundColor: isHandleHovered\r\n ? \"var(--colorNeutralStroke2)\"\r\n : \"transparent\",\r\n }}\r\n />\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default PanelRight;\n","import React, { useState, ReactNode, ReactElement } from \"react\";\r\nimport PanelToolbar from \"../Panels/PanelToolbar.js\"; // Import to identify toolbar\n\r\ninterface ContentProps {\r\n children?: ReactNode;\r\n}\r\n\r\nconst Content: React.FC<ContentProps> = ({ children }) => {\r\n const childrenArray = React.Children.toArray(children) as ReactElement[];\r\n const toolbar = childrenArray.find(\r\n (child) => React.isValidElement(child) && child.type === PanelToolbar\r\n );\r\n const content = childrenArray.filter(\r\n (child) => !(React.isValidElement(child) && child.type === PanelToolbar)\r\n );\r\n\r\n return (\r\n <div\r\n className=\"content\"\r\n style={{\r\n display: \"flex\",\r\n flex: \"1\",\r\n flexDirection: \"column\",\r\n height: \"100%\",\r\n boxSizing: \"border-box\",\r\n position: \"relative\",\r\n minWidth: '320px',\r\n\r\n }}\r\n >\r\n {toolbar && <div style={{ flexShrink: 0 }}>{toolbar}</div>}\r\n\r\n <div\r\n className=\"panelContent\"\r\n style={{\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n flex: 1,\r\n width:'100%',\r\n\r\n \r\n overflow: \"hidden\", // prevent double scrollbars\r\n minHeight: 0, // allow child to shrink properly\r\n }}\r\n >\r\n {content}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default Content;\r\n","// src/components/PanelNav/PanelNav.tsx\r\nimport * as React from \"react\";\r\nimport {\r\n makeStyles,\r\n shorthands,\r\n tokens,\r\n Button,\r\n Body1Strong,\r\n} from \"@fluentui/react-components\";\r\nimport { ChevronDown20Regular } from \"@fluentui/react-icons\";\r\n\r\nexport type PanelNavProps = {\r\n /** Controlled open state */\r\n value?: boolean;\r\n /** Uncontrolled initial open state */\r\n defaultValue?: boolean;\r\n\r\n /** Back-compat alias (prefer defaultValue) */\r\n defaultOpen?: boolean;\r\n\r\n /** Called when open state changes */\r\n onValueChange?: (ev: React.MouseEvent | React.KeyboardEvent, data: { value: boolean }) => void;\r\n\r\n /** Optional section label shown in the header */\r\n title?: string;\r\n\r\n /** Optional: disable expand/collapse */\r\n disabled?: boolean;\r\n\r\n children?: React.ReactNode;\r\n className?: string;\r\n};\r\n\r\nconst useStyles = makeStyles({\r\n root: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n minWidth: 0,\r\n margin: \"8px\",\r\n },\r\n\r\n headerButton: {\r\n display: \"grid\",\r\n gridTemplateColumns: \"1fr auto\",\r\n alignItems: \"center\",\r\n columnGap: tokens.spacingHorizontalS,\r\n ...shorthands.padding(tokens.spacingVerticalS, tokens.spacingHorizontalS),\r\n ...shorthands.borderRadius(tokens.borderRadiusLarge),\r\n ...shorthands.border(\"1px\", \"solid\", \"transparent\"),\r\n color: tokens.colorNeutralForeground4,\r\n boxSizing: \"border-box\",\r\n height: \"48px\",\r\n width: \"100%\",\r\n justifyContent: \"unset\",\r\n\r\n transitionProperty: \"color\",\r\n transitionDuration: \".3s\",\r\n\r\n \":hover\": {\r\n color: tokens.colorNeutralForeground1,\r\n },\r\n },\r\n\r\n title: {\r\n minWidth: 0,\r\n whiteSpace: \"nowrap\",\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n textAlign: \"left\",\r\n },\r\n\r\n chevron: {\r\n transitionProperty: \"transform\",\r\n transitionDuration: tokens.durationNormal,\r\n transitionTimingFunction: tokens.curveEasyEase,\r\n transform: \"rotate(-90deg)\",\r\n },\r\n\r\n chevronOpen: {\r\n transform: \"rotate(0deg)\",\r\n },\r\n\r\n items: {\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n },\r\n\r\n itemsCollapsed: {\r\n display: \"none\",\r\n },\r\n});\r\n\r\nfunction useControllableBooleanState<E extends React.SyntheticEvent>(params: {\r\n value?: boolean;\r\n defaultValue: boolean;\r\n onChange?: (ev: E, next: boolean) => void;\r\n}) {\r\n const { value, defaultValue, onChange } = params;\r\n const [uncontrolled, setUncontrolled] = React.useState(defaultValue);\r\n const isControlled = value !== undefined;\r\n const current = isControlled ? value : uncontrolled;\r\n\r\n const set = React.useCallback(\r\n (ev: E, next: boolean) => {\r\n if (!isControlled) setUncontrolled(next);\r\n onChange?.(ev, next);\r\n },\r\n [isControlled, onChange],\r\n );\r\n\r\n return [current, set] as const;\r\n}\r\n\r\nexport function PanelNav({\r\n value,\r\n defaultValue,\r\n defaultOpen,\r\n onValueChange,\r\n title,\r\n disabled = false,\r\n children,\r\n className,\r\n}: PanelNavProps) {\r\n const styles = useStyles();\r\n\r\n const initial = defaultValue ?? defaultOpen ?? false;\r\n\r\n const [open, setOpen] = useControllableBooleanState<\r\n React.MouseEvent<HTMLButtonElement> | React.KeyboardEvent<HTMLButtonElement>\r\n >({\r\n value,\r\n defaultValue: initial,\r\n onChange: (ev, next) => onValueChange?.(ev, { value: next }),\r\n });\r\n\r\n const toggle = React.useCallback(\r\n (ev: React.MouseEvent<HTMLButtonElement> | React.KeyboardEvent<HTMLButtonElement>) => {\r\n if (disabled) return;\r\n setOpen(ev, !open);\r\n },\r\n [disabled, open, setOpen],\r\n );\r\n\r\n const resolvedTitle = title ?? \"Section\";\r\n\r\n return (\r\n <div className={[styles.root, className].filter(Boolean).join(\" \")}>\r\n <Button\r\n appearance=\"transparent\"\r\n disabled={disabled}\r\n className={styles.headerButton}\r\n aria-expanded={open}\r\n onClick={(ev) => toggle(ev)}\r\n icon={\r\n <ChevronDown20Regular\r\n className={[styles.chevron, open ? styles.chevronOpen : \"\"].join(\" \")}\r\n />\r\n }\r\n // icon at end instead of start\r\n iconPosition=\"after\"\r\n >\r\n <Body1Strong className={styles.title}>{resolvedTitle}</Body1Strong>\r\n </Button>\r\n\r\n <div className={open ? styles.items : styles.itemsCollapsed}>{children}</div>\r\n </div>\r\n );\r\n}\r\n","// src/components/PanelNav/PanelNavItem.tsx\r\nimport * as React from \"react\";\r\nimport {\r\n Button,\r\n makeStyles,\r\n shorthands,\r\n tokens,\r\n Subtitle2,\r\n} from \"@fluentui/react-components\";\r\n\r\nexport type PanelNavItemProps = {\r\n title: string;\r\n icon?: React.ReactNode;\r\n\r\n /** Identifier (useful if parent manages selection) */\r\n value?: string;\r\n\r\n /** Marks the item as selected */\r\n selected?: boolean;\r\n\r\n disabled?: boolean;\r\n\r\n onSelect?: (ev: React.MouseEvent<HTMLButtonElement>, data: { value?: string }) => void;\r\n\r\n /** Back-compat */\r\n active?: boolean;\r\n onClick?: React.MouseEventHandler<HTMLButtonElement>;\r\n\r\n className?: string;\r\n};\r\n\r\nconst useStyles = makeStyles({\r\n root: {\r\n width: \"100%\",\r\n justifyContent: \"flex-start\",\r\n textAlign: \"left\",\r\n ...shorthands.padding(tokens.spacingVerticalM, tokens.spacingHorizontalM),\r\n ...shorthands.borderRadius(tokens.borderRadiusLarge),\r\n ...shorthands.border(\"1px\", \"solid\", \"transparent\"),\r\n boxSizing: \"border-box\",\r\n backgroundColor: \"transparent\",\r\n color: tokens.colorNeutralForeground1,\r\n\r\n \":hover\": {\r\n backgroundColor: tokens.colorNeutralBackground2,\r\n },\r\n\r\n \":active\": {\r\n backgroundColor: tokens.colorNeutralBackground3,\r\n },\r\n\r\n \":focus-visible\": {\r\n outlineStyle: \"solid\",\r\n outlineWidth: tokens.strokeWidthThick,\r\n outlineColor: tokens.colorStrokeFocus2,\r\n outlineOffset: \"2px\",\r\n },\r\n },\r\n\r\n selected: {\r\n backgroundColor: tokens.colorNeutralBackground2,\r\n ...shorthands.border(\"1px\", \"solid\", tokens.colorBrandStroke1),\r\n\r\n \":hover\": {\r\n backgroundColor: tokens.colorNeutralBackground2,\r\n },\r\n\r\n \":active\": {\r\n backgroundColor: tokens.colorNeutralBackground3,\r\n },\r\n },\r\n\r\n content: {\r\n display: \"grid\",\r\n gridTemplateColumns: \"auto 1fr\",\r\n alignItems: \"center\",\r\n columnGap: tokens.spacingHorizontalS,\r\n minWidth: 0,\r\n width: \"100%\",\r\n },\r\n\r\n icon: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n color: \"inherit\",\r\n },\r\n\r\n title: {\r\n minWidth: 0,\r\n whiteSpace: \"nowrap\",\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n },\r\n});\r\n\r\nexport function PanelNavItem({\r\n title,\r\n icon,\r\n value,\r\n selected,\r\n active,\r\n disabled = false,\r\n onSelect,\r\n onClick,\r\n className,\r\n}: PanelNavItemProps) {\r\n const styles = useStyles();\r\n\r\n const isSelected = selected ?? active ?? false;\r\n\r\n return (\r\n <Button\r\n appearance=\"subtle\"\r\n disabled={disabled}\r\n className={[styles.root, isSelected ? styles.selected : \"\", className ?? \"\"]\r\n .filter(Boolean)\r\n .join(\" \")}\r\n aria-current={isSelected ? \"page\" : undefined}\r\n onClick={(ev) => {\r\n onClick?.(ev);\r\n onSelect?.(ev, { value });\r\n }}\r\n >\r\n <span className={styles.content}>\r\n {icon ? <span className={styles.icon}>{icon}</span> : null}\r\n <Subtitle2 className={styles.title}>{title}</Subtitle2>\r\n </span>\r\n </Button>\r\n );\r\n}\r\n","import React from \"react\";\r\nimport {\r\n Avatar,\r\n AvatarProps,\r\n Body1Strong,\r\n Caption1,\r\n} from \"@fluentui/react-components\";\r\n\r\ninterface PanelUserCardProps extends AvatarProps {\r\n name: string; // required for both Avatar and label\r\n alias?: string; // optional sub-label\r\n}\r\n\r\nconst PanelUserCard: React.FC<PanelUserCardProps> = ({ name, alias, ...avatarProps }) => {\r\n return (\r\n <div\r\n style={{\r\n display: \"flex\",\r\n gap: \"12px\",\r\n alignItems: \"center\",\r\n margin: \"16px\",\r\n }}\r\n >\r\n <Avatar\r\n name={name}\r\n {...avatarProps}\r\n />\r\n <div style={{ display: \"flex\", flexDirection: \"column\" }}>\r\n <Body1Strong>{name}</Body1Strong>\r\n {alias && (\r\n <Caption1 style={{ color: \"var(--colorNeutralForeground3)\" }}>\r\n {alias}\r\n </Caption1>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\n\r\nexport default PanelUserCard;\r\n"],"mappings":"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","names":["Button","ToggleButton","jsx","jsx","jsxs","jsx","jsx","jsx","jsx","React","useState","useEffect","jsx","jsxs","jsx","jsx","jsxs","useState","useEffect","React","React","useState","useEffect","jsx","jsxs","useState","useEffect","React","React","jsx","jsxs","React","React","Body1Strong","jsx","jsxs","Button","makeStyles","shorthands","tokens","Subtitle2","jsx","jsxs","useStyles","Avatar","Body1Strong","jsx","jsxs"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@coral-ui/react",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": false,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"exports": {
|
|
7
|
+
".": {
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"import": "./dist/index.js"
|
|
10
|
+
}
|
|
11
|
+
},
|
|
12
|
+
"files": [
|
|
13
|
+
"dist", "README.md", "LICENSE"
|
|
14
|
+
],
|
|
15
|
+
"sideEffects": false,
|
|
16
|
+
"peerDependencies": {
|
|
17
|
+
"react": "^19.0.0",
|
|
18
|
+
"react-dom": "^19.0.0"
|
|
19
|
+
},
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "tsup",
|
|
22
|
+
"dev": "tsup --watch"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"@fluentui/react-icons": "^2.0.318"
|
|
26
|
+
}
|
|
27
|
+
}
|