@xenide-io/the-old-ui-theme 0.3.0 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-5HSOBJ4F.mjs +5968 -0
- package/dist/{index-D1RTT2Ap.d.mts → index-BgG8Homu.d.mts} +419 -2
- package/dist/{index-D1RTT2Ap.d.ts → index-BgG8Homu.d.ts} +419 -2
- package/dist/index.d.mts +198 -95
- package/dist/index.d.ts +198 -95
- package/dist/index.js +2995 -1136
- package/dist/index.mjs +629 -735
- package/dist/ui.d.mts +1 -1
- package/dist/ui.d.ts +1 -1
- package/dist/ui.js +1986 -156
- package/dist/ui.mjs +76 -3
- package/package.json +4 -14
- package/src/app/globals.css +976 -2
- package/src/components/charts/index.ts +9 -8
- package/src/components/charts/quill/BarChart.tsx +85 -0
- package/src/components/charts/quill/FunnelChart.tsx +49 -0
- package/src/components/charts/quill/InsightShell.tsx +27 -0
- package/src/components/charts/quill/MetricCard.tsx +44 -0
- package/src/components/charts/quill/PieChart.tsx +81 -0
- package/src/components/charts/quill/Sparkline.tsx +57 -0
- package/src/components/charts/quill/TimeSeriesLineChart.tsx +62 -0
- package/src/components/charts/quill/index.ts +9 -0
- package/src/components/icons/icons.tsx +2 -0
- package/src/components/icons/index.ts +3 -0
- package/src/components/icons/lemon-brand-icons.tsx +16 -0
- package/src/components/icons/lemon-category-icons.tsx +72 -0
- package/src/components/icons/lemon-icons.tsx +57 -0
- package/src/components/sections/IconShowcase.tsx +110 -7
- package/src/components/sections/NewComponentsShowcase.tsx +1052 -0
- package/src/components/sections/ProductLayoutsShowcase.tsx +57 -117
- package/src/components/sections/QuillChartShowcase.tsx +92 -0
- package/src/components/sections/QuillDashboardShowcase.tsx +149 -0
- package/src/components/sections/SidebarShowcase.tsx +152 -0
- package/src/components/sections/TableShowcase.tsx +2 -0
- package/src/components/sections/TooltipShowcase.tsx +19 -25
- package/src/components/ui/AlertDialog.tsx +62 -0
- package/src/components/ui/AppLayout.tsx +27 -0
- package/src/components/ui/Autocomplete.tsx +106 -0
- package/src/components/ui/Banner.tsx +63 -0
- package/src/components/ui/ButtonGroup.tsx +16 -0
- package/src/components/ui/Chip.tsx +46 -0
- package/src/components/ui/Collapsible.tsx +46 -0
- package/src/components/ui/Combobox.tsx +119 -0
- package/src/components/ui/ContextMenu.tsx +81 -0
- package/src/components/ui/DataTable.tsx +133 -0
- package/src/components/ui/DatePicker.tsx +96 -0
- package/src/components/ui/Dialog.tsx +75 -0
- package/src/components/ui/Divider.tsx +39 -0
- package/src/components/ui/Dot.tsx +32 -0
- package/src/components/ui/InputGroup.tsx +16 -0
- package/src/components/ui/Lettermark.tsx +47 -0
- package/src/components/ui/Link.tsx +32 -0
- package/src/components/ui/LoadingBar.tsx +25 -0
- package/src/components/ui/Menubar.tsx +66 -0
- package/src/components/ui/Metric.tsx +34 -0
- package/src/components/ui/NumberField.tsx +76 -0
- package/src/components/ui/Popover.tsx +73 -0
- package/src/components/ui/ProgressCircle.tsx +63 -0
- package/src/components/ui/Resizable.tsx +71 -0
- package/src/components/ui/Row.tsx +51 -0
- package/src/components/ui/ScrollArea.tsx +54 -0
- package/src/components/ui/Sidebar.tsx +77 -0
- package/src/components/ui/Snack.tsx +48 -0
- package/src/components/ui/Spinner.tsx +30 -0
- package/src/components/ui/Splotch.tsx +33 -0
- package/src/components/ui/Table.tsx +2 -0
- package/src/components/ui/Tag.tsx +65 -0
- package/src/components/ui/Toggle.tsx +62 -0
- package/src/components/ui/Tooltip.test.tsx +58 -0
- package/src/components/ui/Tooltip.tsx +211 -0
- package/src/components/ui/Widget.tsx +31 -0
- package/src/components/ui/index.ts +275 -21
- package/dist/chunk-FDMD3IIN.mjs +0 -3831
- package/src/components/charts/ph-insight-charts.tsx +0 -162
- package/src/components/dashboard/DashboardFiltersBar.tsx +0 -19
- package/src/components/dashboard/DashboardGrid.tsx +0 -23
- package/src/components/dashboard/DashboardInsightPlaceholder.tsx +0 -37
- package/src/components/dashboard/DashboardKpiCard.tsx +0 -25
- package/src/components/dashboard/DashboardToolbar.tsx +0 -23
- package/src/components/dashboard/DashboardWell.tsx +0 -10
- package/src/components/dashboard/InsightMiniCard.tsx +0 -26
- package/src/components/dashboard/InsightShell.tsx +0 -37
- package/src/components/dashboard/InsightShellHeader.tsx +0 -22
- package/src/components/dashboard/MiniTrendBars.tsx +0 -51
- package/src/components/dashboard/index.ts +0 -31
- package/src/components/dashboard/types.ts +0 -9
- package/src/components/sections/ChartShowcase.tsx +0 -190
- package/src/components/sections/DashboardShowcase.tsx +0 -191
- package/src/components/sections/StatShowcase.tsx +0 -129
package/dist/index.mjs
CHANGED
|
@@ -1,27 +1,42 @@
|
|
|
1
|
+
"use client";
|
|
1
2
|
import {
|
|
2
3
|
Accordion,
|
|
3
4
|
Alert,
|
|
5
|
+
AlertDialog,
|
|
6
|
+
AppLayout,
|
|
4
7
|
AuthCard,
|
|
5
8
|
AuthDivider,
|
|
6
9
|
AuthLayout,
|
|
10
|
+
Autocomplete,
|
|
7
11
|
Avatar,
|
|
8
12
|
AvatarGroup,
|
|
9
13
|
Badge,
|
|
14
|
+
Banner,
|
|
10
15
|
Breadcrumbs,
|
|
11
16
|
Button,
|
|
12
17
|
ButtonChrome,
|
|
18
|
+
ButtonGroup,
|
|
13
19
|
CANONICAL_ICONS,
|
|
14
20
|
Calendar,
|
|
15
21
|
Caption,
|
|
16
22
|
Card,
|
|
17
23
|
ChatBubble,
|
|
18
24
|
Checkbox,
|
|
25
|
+
Chip,
|
|
19
26
|
CodeBlock,
|
|
27
|
+
Collapsible,
|
|
20
28
|
CollapsibleSection,
|
|
29
|
+
Combobox,
|
|
21
30
|
CommandPalette,
|
|
22
31
|
ComponentDocs,
|
|
32
|
+
ContextMenu,
|
|
23
33
|
DEFAULT_THEME_ID,
|
|
34
|
+
DataTable,
|
|
35
|
+
DatePicker,
|
|
36
|
+
Dialog,
|
|
24
37
|
Display,
|
|
38
|
+
Divider,
|
|
39
|
+
Dot,
|
|
25
40
|
Drawer,
|
|
26
41
|
DropdownButton,
|
|
27
42
|
DropdownItem,
|
|
@@ -41,93 +56,232 @@ import {
|
|
|
41
56
|
H4,
|
|
42
57
|
H5,
|
|
43
58
|
HoverCard,
|
|
59
|
+
Icon123,
|
|
60
|
+
IconAI,
|
|
61
|
+
IconAction,
|
|
44
62
|
IconActivity,
|
|
63
|
+
IconAdsClick,
|
|
64
|
+
IconAndroidOS,
|
|
65
|
+
IconAppleIOS,
|
|
66
|
+
IconArchive,
|
|
45
67
|
IconAreaChart,
|
|
46
68
|
IconArrowDown,
|
|
47
69
|
IconArrowUp,
|
|
70
|
+
IconAtSign,
|
|
71
|
+
IconBadge,
|
|
48
72
|
IconBase,
|
|
49
73
|
IconBell,
|
|
50
74
|
IconBellOff,
|
|
75
|
+
IconBinary,
|
|
76
|
+
IconBlank,
|
|
77
|
+
IconBold,
|
|
51
78
|
IconBolt,
|
|
79
|
+
IconBook,
|
|
80
|
+
IconBookmarkBorder,
|
|
52
81
|
IconBox,
|
|
82
|
+
IconBranch,
|
|
83
|
+
IconBug,
|
|
53
84
|
IconByName,
|
|
85
|
+
IconCalculate,
|
|
86
|
+
IconCalendar,
|
|
87
|
+
IconCalendarDay,
|
|
54
88
|
IconCancel,
|
|
89
|
+
IconCart,
|
|
90
|
+
IconChat,
|
|
55
91
|
IconCheck,
|
|
56
92
|
IconCheckCircle,
|
|
93
|
+
IconCheckboxChecked,
|
|
57
94
|
IconChevronDown,
|
|
58
95
|
IconChevronLeft,
|
|
59
96
|
IconChevronRight,
|
|
97
|
+
IconChrome,
|
|
60
98
|
IconClipboardEdit,
|
|
99
|
+
IconClock,
|
|
61
100
|
IconClose,
|
|
101
|
+
IconCloud,
|
|
62
102
|
IconCodePreview,
|
|
103
|
+
IconCoffee,
|
|
63
104
|
IconCohort,
|
|
64
105
|
IconCommandCursor,
|
|
106
|
+
IconConfetti,
|
|
65
107
|
IconCopy,
|
|
108
|
+
IconCrown,
|
|
66
109
|
IconCumulativeChart,
|
|
67
110
|
IconDataReel,
|
|
68
111
|
IconDatabase,
|
|
112
|
+
IconDevices,
|
|
113
|
+
IconDocument,
|
|
69
114
|
IconDownload,
|
|
115
|
+
IconDownloadCloud,
|
|
116
|
+
IconDragHandle,
|
|
70
117
|
IconEdit,
|
|
71
118
|
IconErrorOutline,
|
|
119
|
+
IconEvent,
|
|
72
120
|
IconEventStream,
|
|
73
121
|
IconExclamation,
|
|
74
122
|
IconExperimentSplit,
|
|
123
|
+
IconExternalLink,
|
|
124
|
+
IconEye,
|
|
125
|
+
IconEyeHidden,
|
|
126
|
+
IconFacebook,
|
|
75
127
|
IconFeatureGate,
|
|
128
|
+
IconFeedback,
|
|
129
|
+
IconFile,
|
|
130
|
+
IconFilter,
|
|
131
|
+
IconFingerprint,
|
|
132
|
+
IconFirefox,
|
|
76
133
|
IconFlag,
|
|
77
134
|
IconFlare,
|
|
78
135
|
IconFlask,
|
|
136
|
+
IconFolder,
|
|
137
|
+
IconForward,
|
|
138
|
+
IconFullScreen,
|
|
139
|
+
IconFunnelHorizontal,
|
|
140
|
+
IconFunnelVertical,
|
|
141
|
+
IconGear,
|
|
142
|
+
IconGhost,
|
|
79
143
|
IconGift,
|
|
144
|
+
IconGitlab,
|
|
145
|
+
IconGlobe,
|
|
146
|
+
IconGoogle,
|
|
80
147
|
IconGridView,
|
|
148
|
+
IconGroupedEvents,
|
|
149
|
+
IconGroups,
|
|
81
150
|
IconHandClick,
|
|
151
|
+
IconHash,
|
|
152
|
+
IconHeadphones,
|
|
153
|
+
IconHeart,
|
|
154
|
+
IconHeatmap,
|
|
82
155
|
IconHome,
|
|
156
|
+
IconHomeFilled,
|
|
157
|
+
IconHourglass,
|
|
158
|
+
IconImage,
|
|
159
|
+
IconInbox,
|
|
83
160
|
IconInfo,
|
|
161
|
+
IconInfoFilled,
|
|
84
162
|
IconInsightBoard,
|
|
163
|
+
IconItalic,
|
|
164
|
+
IconKey,
|
|
165
|
+
IconKeyFilled,
|
|
166
|
+
IconLaptop,
|
|
85
167
|
IconLayers,
|
|
168
|
+
IconLayout,
|
|
169
|
+
IconLifeBuoy,
|
|
170
|
+
IconLightBulb,
|
|
171
|
+
IconLink,
|
|
172
|
+
IconLinkBreak,
|
|
173
|
+
IconLinux,
|
|
86
174
|
IconListView,
|
|
175
|
+
IconLocation,
|
|
176
|
+
IconLock,
|
|
87
177
|
IconLogout,
|
|
178
|
+
IconMacOS,
|
|
88
179
|
IconMail,
|
|
180
|
+
IconMap,
|
|
181
|
+
IconMapPin,
|
|
182
|
+
IconMaximize,
|
|
183
|
+
IconMegaphone,
|
|
184
|
+
IconMenu,
|
|
185
|
+
IconMic,
|
|
186
|
+
IconMicrosoftTeams,
|
|
187
|
+
IconMinimize,
|
|
188
|
+
IconMinus,
|
|
189
|
+
IconMonitor,
|
|
89
190
|
IconMoon,
|
|
191
|
+
IconMoonFilled,
|
|
192
|
+
IconMoreHorizontal,
|
|
193
|
+
IconMoreVertical,
|
|
194
|
+
IconMusic,
|
|
195
|
+
IconNavigation,
|
|
196
|
+
IconNodeJS,
|
|
197
|
+
IconOffline,
|
|
90
198
|
IconOldWindow,
|
|
199
|
+
IconOpenInApp,
|
|
200
|
+
IconOpenInNew,
|
|
201
|
+
IconPalette,
|
|
91
202
|
IconPanelRight,
|
|
203
|
+
IconPaperclip,
|
|
204
|
+
IconPauseCircle,
|
|
205
|
+
IconPeople,
|
|
206
|
+
IconPercent,
|
|
92
207
|
IconPerson,
|
|
208
|
+
IconPhone,
|
|
209
|
+
IconPin,
|
|
93
210
|
IconPlayCircle,
|
|
94
211
|
IconPlus,
|
|
95
212
|
IconPremium,
|
|
213
|
+
IconPreview,
|
|
214
|
+
IconPrinter,
|
|
96
215
|
IconQueryEditor,
|
|
97
216
|
IconQueryStack,
|
|
217
|
+
IconQuestionAnswer,
|
|
98
218
|
IconRadar,
|
|
219
|
+
IconRadioButtonUnchecked,
|
|
99
220
|
IconRecording,
|
|
221
|
+
IconRedo,
|
|
222
|
+
IconRefresh,
|
|
223
|
+
IconReplay,
|
|
100
224
|
IconReplayFrame,
|
|
225
|
+
IconReply,
|
|
226
|
+
IconReport,
|
|
101
227
|
IconRobot,
|
|
102
228
|
IconRocket,
|
|
229
|
+
IconSafari,
|
|
103
230
|
IconSave,
|
|
104
231
|
IconSearch,
|
|
232
|
+
IconSelectAll,
|
|
105
233
|
IconSelectEvents,
|
|
106
234
|
IconShoppingCart,
|
|
235
|
+
IconSkipBackward,
|
|
236
|
+
IconSkipEnd,
|
|
237
|
+
IconSkipStart,
|
|
238
|
+
IconSlack,
|
|
239
|
+
IconSlackExternal,
|
|
107
240
|
IconSpinner,
|
|
241
|
+
IconStamphog,
|
|
108
242
|
IconStar,
|
|
243
|
+
IconStore,
|
|
109
244
|
IconSubArrowRight,
|
|
245
|
+
IconSubtitles,
|
|
246
|
+
IconSubtitlesOff,
|
|
110
247
|
IconSun,
|
|
111
248
|
IconSurveyCard,
|
|
112
249
|
IconSurveys,
|
|
250
|
+
IconSwapHoriz,
|
|
113
251
|
IconSync,
|
|
114
252
|
IconTableChart,
|
|
115
253
|
IconTerminal,
|
|
254
|
+
IconTextSize,
|
|
116
255
|
IconToggle,
|
|
117
256
|
IconTrash,
|
|
257
|
+
IconTrendingDown,
|
|
258
|
+
IconTrendingFlat,
|
|
259
|
+
IconTrendingFlatDown,
|
|
118
260
|
IconTuning,
|
|
261
|
+
IconUnverifiedEvent,
|
|
119
262
|
IconUpload,
|
|
263
|
+
IconVerifiedEvent,
|
|
264
|
+
IconVerticalAlignCenter,
|
|
120
265
|
IconVolume,
|
|
121
266
|
IconVolumeOff,
|
|
267
|
+
IconWeb,
|
|
268
|
+
IconWindows,
|
|
122
269
|
Indicator,
|
|
123
270
|
Input,
|
|
271
|
+
InputGroup,
|
|
124
272
|
Kbd,
|
|
125
273
|
Label,
|
|
126
274
|
Lead,
|
|
275
|
+
Lettermark,
|
|
276
|
+
Link,
|
|
127
277
|
Loader,
|
|
278
|
+
LoadingBar,
|
|
128
279
|
LoadingState,
|
|
280
|
+
Menubar,
|
|
281
|
+
Metric,
|
|
129
282
|
Modal,
|
|
130
283
|
Mono,
|
|
284
|
+
NumberField,
|
|
131
285
|
OLD_UI_ICONS,
|
|
132
286
|
Overline,
|
|
133
287
|
P,
|
|
@@ -135,10 +289,15 @@ import {
|
|
|
135
289
|
PH_ICON_ALIASES,
|
|
136
290
|
Pagination,
|
|
137
291
|
Panel,
|
|
292
|
+
Popover,
|
|
138
293
|
Progress,
|
|
294
|
+
ProgressCircle,
|
|
139
295
|
Radio,
|
|
140
296
|
Range,
|
|
141
297
|
Rating,
|
|
298
|
+
Resizable,
|
|
299
|
+
Row,
|
|
300
|
+
ScrollArea,
|
|
142
301
|
SearchGroup,
|
|
143
302
|
SearchInput,
|
|
144
303
|
SegmentedControl,
|
|
@@ -146,9 +305,13 @@ import {
|
|
|
146
305
|
SettingsLayout,
|
|
147
306
|
SettingsNav,
|
|
148
307
|
ShowcaseWrapper,
|
|
308
|
+
Sidebar,
|
|
149
309
|
Skeleton,
|
|
150
310
|
Small,
|
|
311
|
+
Snack,
|
|
151
312
|
SortMenu,
|
|
313
|
+
Spinner,
|
|
314
|
+
Splotch,
|
|
152
315
|
Stat,
|
|
153
316
|
Stepper,
|
|
154
317
|
THEMES,
|
|
@@ -156,6 +319,7 @@ import {
|
|
|
156
319
|
THEME_INIT_SCRIPT,
|
|
157
320
|
Table,
|
|
158
321
|
Tabs,
|
|
322
|
+
Tag,
|
|
159
323
|
Terminal,
|
|
160
324
|
Textarea,
|
|
161
325
|
ThemeDomSync,
|
|
@@ -165,6 +329,11 @@ import {
|
|
|
165
329
|
Toast,
|
|
166
330
|
ToastStack,
|
|
167
331
|
Toggle,
|
|
332
|
+
ToggleButton,
|
|
333
|
+
ToggleGroup,
|
|
334
|
+
Tooltip,
|
|
335
|
+
TooltipProvider,
|
|
336
|
+
Widget,
|
|
168
337
|
cn,
|
|
169
338
|
createIconBase,
|
|
170
339
|
createIconBasePath,
|
|
@@ -172,467 +341,18 @@ import {
|
|
|
172
341
|
isThemeId,
|
|
173
342
|
persistTheme,
|
|
174
343
|
readStoredTheme
|
|
175
|
-
} from "./chunk-
|
|
344
|
+
} from "./chunk-5HSOBJ4F.mjs";
|
|
176
345
|
import {
|
|
177
|
-
__objRest,
|
|
178
346
|
__spreadProps,
|
|
179
347
|
__spreadValues
|
|
180
348
|
} from "./chunk-FWCSY2DS.mjs";
|
|
181
349
|
|
|
182
|
-
// src/components/charts/
|
|
183
|
-
import {
|
|
184
|
-
|
|
185
|
-
// src/lib/chart/register-chartjs.ts
|
|
186
|
-
import {
|
|
187
|
-
ArcElement,
|
|
188
|
-
BarController,
|
|
189
|
-
BarElement,
|
|
190
|
-
CategoryScale,
|
|
191
|
-
Chart as ChartJS,
|
|
192
|
-
DoughnutController,
|
|
193
|
-
Legend,
|
|
194
|
-
LinearScale,
|
|
195
|
-
PolarAreaController,
|
|
196
|
-
RadialLinearScale,
|
|
197
|
-
Title,
|
|
198
|
-
Tooltip
|
|
199
|
-
} from "chart.js";
|
|
200
|
-
function synchroniseChartJsFontFamily() {
|
|
201
|
-
if (typeof document === "undefined") {
|
|
202
|
-
return;
|
|
203
|
-
}
|
|
204
|
-
const family = window.getComputedStyle(document.body).fontFamily;
|
|
205
|
-
const trimmed = family == null ? void 0 : family.trim();
|
|
206
|
-
if (trimmed) {
|
|
207
|
-
ChartJS.defaults.font.family = trimmed;
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
ChartJS.register(
|
|
211
|
-
CategoryScale,
|
|
212
|
-
LinearScale,
|
|
213
|
-
RadialLinearScale,
|
|
214
|
-
BarController,
|
|
215
|
-
BarElement,
|
|
216
|
-
DoughnutController,
|
|
217
|
-
PolarAreaController,
|
|
218
|
-
ArcElement,
|
|
219
|
-
Title,
|
|
220
|
-
Tooltip,
|
|
221
|
-
Legend
|
|
222
|
-
);
|
|
223
|
-
synchroniseChartJsFontFamily();
|
|
224
|
-
|
|
225
|
-
// src/components/charts/ph-insight-charts.tsx
|
|
226
|
-
import { Bar, Doughnut, PolarArea } from "react-chartjs-2";
|
|
227
|
-
|
|
228
|
-
// src/lib/chart/with-alpha.ts
|
|
229
|
-
function withAlpha(color, alpha) {
|
|
230
|
-
const trimmed = color.trim();
|
|
231
|
-
const hex8 = trimmed.match(/^#([\da-f]{8})$/i);
|
|
232
|
-
if (hex8 == null ? void 0 : hex8[1]) {
|
|
233
|
-
const n = hex8[1];
|
|
234
|
-
const r = parseInt(n.slice(0, 2), 16);
|
|
235
|
-
const g = parseInt(n.slice(2, 4), 16);
|
|
236
|
-
const b = parseInt(n.slice(4, 6), 16);
|
|
237
|
-
return `rgba(${r}, ${g}, ${b}, ${alpha})`;
|
|
238
|
-
}
|
|
239
|
-
const hexLong = trimmed.match(/^#([\da-f]{6})$/i);
|
|
240
|
-
if (hexLong == null ? void 0 : hexLong[1]) {
|
|
241
|
-
const n = hexLong[1];
|
|
242
|
-
const r = parseInt(n.slice(0, 2), 16);
|
|
243
|
-
const g = parseInt(n.slice(2, 4), 16);
|
|
244
|
-
const b = parseInt(n.slice(4, 6), 16);
|
|
245
|
-
return `rgba(${r}, ${g}, ${b}, ${alpha})`;
|
|
246
|
-
}
|
|
247
|
-
const hexShort = trimmed.match(/^#([\da-f]{3})$/i);
|
|
248
|
-
if (hexShort == null ? void 0 : hexShort[1]) {
|
|
249
|
-
const [, h] = hexShort;
|
|
250
|
-
const r = parseInt(h[0] + h[0], 16);
|
|
251
|
-
const g = parseInt(h[1] + h[1], 16);
|
|
252
|
-
const b = parseInt(h[2] + h[2], 16);
|
|
253
|
-
return `rgba(${r}, ${g}, ${b}, ${alpha})`;
|
|
254
|
-
}
|
|
255
|
-
return trimmed;
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
// src/lib/chart/ph-chart-options.ts
|
|
259
|
-
function readAppRadiusPx() {
|
|
260
|
-
if (typeof document === "undefined") {
|
|
261
|
-
return 6;
|
|
262
|
-
}
|
|
263
|
-
const raw = getComputedStyle(document.documentElement).getPropertyValue("--ph-radius-app").trim();
|
|
264
|
-
const n = Number.parseFloat(raw);
|
|
265
|
-
if (!Number.isFinite(n)) {
|
|
266
|
-
return 6;
|
|
267
|
-
}
|
|
268
|
-
return raw.endsWith("rem") ? n * 16 : n;
|
|
269
|
-
}
|
|
270
|
-
function buildInsightLegend(tokens) {
|
|
271
|
-
return {
|
|
272
|
-
display: true,
|
|
273
|
-
position: "bottom",
|
|
274
|
-
labels: {
|
|
275
|
-
color: tokens.text,
|
|
276
|
-
boxWidth: 10,
|
|
277
|
-
boxHeight: 10,
|
|
278
|
-
padding: 14,
|
|
279
|
-
usePointStyle: true,
|
|
280
|
-
font: { size: 12 }
|
|
281
|
-
}
|
|
282
|
-
};
|
|
283
|
-
}
|
|
284
|
-
function buildInsightTooltipLine(tokens) {
|
|
285
|
-
return {
|
|
286
|
-
backgroundColor: tokens.surface,
|
|
287
|
-
titleColor: tokens.text,
|
|
288
|
-
bodyColor: tokens.textMuted,
|
|
289
|
-
borderColor: tokens.borderStrong,
|
|
290
|
-
borderWidth: 1,
|
|
291
|
-
padding: 12,
|
|
292
|
-
cornerRadius: readAppRadiusPx(),
|
|
293
|
-
displayColors: true,
|
|
294
|
-
caretPadding: 8,
|
|
295
|
-
titleSpacing: 6,
|
|
296
|
-
bodySpacing: 6,
|
|
297
|
-
multiKeyBackground: tokens.surface
|
|
298
|
-
};
|
|
299
|
-
}
|
|
300
|
-
function buildInsightTooltipBar(tokens) {
|
|
301
|
-
return buildInsightTooltipLine(tokens);
|
|
302
|
-
}
|
|
303
|
-
function radialLegend(tokens) {
|
|
304
|
-
return {
|
|
305
|
-
display: true,
|
|
306
|
-
position: "bottom",
|
|
307
|
-
labels: {
|
|
308
|
-
color: tokens.text,
|
|
309
|
-
boxWidth: 10,
|
|
310
|
-
boxHeight: 10,
|
|
311
|
-
padding: 14,
|
|
312
|
-
usePointStyle: true,
|
|
313
|
-
font: { size: 12 }
|
|
314
|
-
}
|
|
315
|
-
};
|
|
316
|
-
}
|
|
317
|
-
function radialInsightTooltip(tokens) {
|
|
318
|
-
return {
|
|
319
|
-
backgroundColor: tokens.surface,
|
|
320
|
-
titleColor: tokens.text,
|
|
321
|
-
bodyColor: tokens.textMuted,
|
|
322
|
-
borderColor: tokens.borderStrong,
|
|
323
|
-
borderWidth: 1,
|
|
324
|
-
padding: 12,
|
|
325
|
-
cornerRadius: readAppRadiusPx(),
|
|
326
|
-
displayColors: true,
|
|
327
|
-
caretPadding: 8,
|
|
328
|
-
titleSpacing: 6,
|
|
329
|
-
bodySpacing: 6,
|
|
330
|
-
multiKeyBackground: tokens.surface
|
|
331
|
-
};
|
|
332
|
-
}
|
|
333
|
-
function buildVerticalBarDemo(tokens) {
|
|
334
|
-
return {
|
|
335
|
-
type: "bar",
|
|
336
|
-
data: {
|
|
337
|
-
labels: ["Chrome", "Safari", "Firefox", "Edge", "Other"],
|
|
338
|
-
datasets: [
|
|
339
|
-
{
|
|
340
|
-
label: "Unique users",
|
|
341
|
-
data: [18400, 12100, 4200, 3100, 900],
|
|
342
|
-
backgroundColor: withAlpha(tokens.series[0], 0.85),
|
|
343
|
-
borderColor: tokens.borderStrong,
|
|
344
|
-
borderWidth: 1,
|
|
345
|
-
borderRadius: 4
|
|
346
|
-
}
|
|
347
|
-
]
|
|
348
|
-
},
|
|
349
|
-
options: {
|
|
350
|
-
responsive: true,
|
|
351
|
-
maintainAspectRatio: false,
|
|
352
|
-
plugins: {
|
|
353
|
-
legend: { display: false },
|
|
354
|
-
tooltip: buildInsightTooltipBar(tokens)
|
|
355
|
-
},
|
|
356
|
-
scales: {
|
|
357
|
-
x: {
|
|
358
|
-
border: { display: false },
|
|
359
|
-
ticks: { color: tokens.textMuted, font: { size: 11 } },
|
|
360
|
-
grid: { display: false }
|
|
361
|
-
},
|
|
362
|
-
y: {
|
|
363
|
-
beginAtZero: true,
|
|
364
|
-
border: { display: false },
|
|
365
|
-
ticks: { color: tokens.textMuted, font: { size: 11 } },
|
|
366
|
-
grid: { color: tokens.grid }
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
}
|
|
370
|
-
};
|
|
371
|
-
}
|
|
372
|
-
function buildHorizontalBarDemo(tokens) {
|
|
373
|
-
return {
|
|
374
|
-
type: "bar",
|
|
375
|
-
data: {
|
|
376
|
-
labels: [
|
|
377
|
-
"/project/settings",
|
|
378
|
-
"/insights/new",
|
|
379
|
-
"/feature-flags",
|
|
380
|
-
"/dashboard",
|
|
381
|
-
"/session-replay"
|
|
382
|
-
],
|
|
383
|
-
datasets: [
|
|
384
|
-
{
|
|
385
|
-
label: "Pageviews",
|
|
386
|
-
data: [12800, 9400, 7200, 6100, 4300],
|
|
387
|
-
backgroundColor: [
|
|
388
|
-
withAlpha(tokens.series[0], 0.85),
|
|
389
|
-
withAlpha(tokens.series[1], 0.85),
|
|
390
|
-
withAlpha(tokens.series[2], 0.85),
|
|
391
|
-
withAlpha(tokens.series[3], 0.85),
|
|
392
|
-
withAlpha(tokens.series[4], 0.85)
|
|
393
|
-
],
|
|
394
|
-
borderWidth: 0,
|
|
395
|
-
borderRadius: 4
|
|
396
|
-
}
|
|
397
|
-
]
|
|
398
|
-
},
|
|
399
|
-
options: {
|
|
400
|
-
indexAxis: "y",
|
|
401
|
-
responsive: true,
|
|
402
|
-
maintainAspectRatio: false,
|
|
403
|
-
plugins: {
|
|
404
|
-
legend: { display: false },
|
|
405
|
-
tooltip: buildInsightTooltipBar(tokens)
|
|
406
|
-
},
|
|
407
|
-
scales: {
|
|
408
|
-
x: {
|
|
409
|
-
beginAtZero: true,
|
|
410
|
-
border: { display: false },
|
|
411
|
-
grid: { color: tokens.grid },
|
|
412
|
-
ticks: { color: tokens.textMuted, font: { size: 11 } }
|
|
413
|
-
},
|
|
414
|
-
y: {
|
|
415
|
-
border: { display: false },
|
|
416
|
-
grid: { display: false },
|
|
417
|
-
ticks: { color: tokens.textMuted, font: { size: 11 } }
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
}
|
|
421
|
-
};
|
|
422
|
-
}
|
|
423
|
-
function buildStackedBarDemo(tokens) {
|
|
424
|
-
return {
|
|
425
|
-
type: "bar",
|
|
426
|
-
data: {
|
|
427
|
-
labels: ["US", "GB", "DE", "AU", "IN"],
|
|
428
|
-
datasets: [
|
|
429
|
-
{
|
|
430
|
-
label: "Direct",
|
|
431
|
-
data: [120, 98, 45, 40, 210],
|
|
432
|
-
backgroundColor: withAlpha(tokens.series[0], 0.92),
|
|
433
|
-
borderRadius: 4
|
|
434
|
-
},
|
|
435
|
-
{
|
|
436
|
-
label: "Organic search",
|
|
437
|
-
data: [80, 72, 38, 30, 160],
|
|
438
|
-
backgroundColor: withAlpha(tokens.series[1], 0.92),
|
|
439
|
-
borderRadius: 4
|
|
440
|
-
},
|
|
441
|
-
{
|
|
442
|
-
label: "Referral",
|
|
443
|
-
data: [44, 22, 18, 12, 90],
|
|
444
|
-
backgroundColor: withAlpha(tokens.series[2], 0.92),
|
|
445
|
-
borderRadius: 4
|
|
446
|
-
}
|
|
447
|
-
]
|
|
448
|
-
},
|
|
449
|
-
options: {
|
|
450
|
-
responsive: true,
|
|
451
|
-
maintainAspectRatio: false,
|
|
452
|
-
plugins: {
|
|
453
|
-
legend: buildInsightLegend(tokens),
|
|
454
|
-
tooltip: buildInsightTooltipBar(tokens)
|
|
455
|
-
},
|
|
456
|
-
scales: {
|
|
457
|
-
x: {
|
|
458
|
-
stacked: true,
|
|
459
|
-
border: { display: false },
|
|
460
|
-
grid: { display: false },
|
|
461
|
-
ticks: { color: tokens.textMuted, font: { size: 11 } }
|
|
462
|
-
},
|
|
463
|
-
y: {
|
|
464
|
-
stacked: true,
|
|
465
|
-
beginAtZero: true,
|
|
466
|
-
border: { display: false },
|
|
467
|
-
grid: { color: tokens.grid },
|
|
468
|
-
ticks: { color: tokens.textMuted, font: { size: 11 } }
|
|
469
|
-
}
|
|
470
|
-
}
|
|
471
|
-
}
|
|
472
|
-
};
|
|
473
|
-
}
|
|
474
|
-
function buildDoughnutDemo(tokens) {
|
|
475
|
-
return {
|
|
476
|
-
type: "doughnut",
|
|
477
|
-
data: {
|
|
478
|
-
labels: ["Direct", "Organic search", "Referral", "Paid", "Other"],
|
|
479
|
-
datasets: [
|
|
480
|
-
{
|
|
481
|
-
label: "Channel mix",
|
|
482
|
-
data: [42, 28, 14, 10, 6],
|
|
483
|
-
backgroundColor: [
|
|
484
|
-
withAlpha(tokens.series[0], 0.88),
|
|
485
|
-
withAlpha(tokens.series[1], 0.88),
|
|
486
|
-
withAlpha(tokens.series[2], 0.88),
|
|
487
|
-
withAlpha(tokens.series[3], 0.88),
|
|
488
|
-
withAlpha(tokens.series[4], 0.88)
|
|
489
|
-
],
|
|
490
|
-
borderColor: tokens.surface,
|
|
491
|
-
borderWidth: 2,
|
|
492
|
-
hoverOffset: 6
|
|
493
|
-
}
|
|
494
|
-
]
|
|
495
|
-
},
|
|
496
|
-
options: {
|
|
497
|
-
responsive: true,
|
|
498
|
-
maintainAspectRatio: false,
|
|
499
|
-
cutout: "62%",
|
|
500
|
-
plugins: {
|
|
501
|
-
legend: radialLegend(tokens),
|
|
502
|
-
tooltip: radialInsightTooltip(tokens)
|
|
503
|
-
}
|
|
504
|
-
}
|
|
505
|
-
};
|
|
506
|
-
}
|
|
507
|
-
function buildPolarAreaDemo(tokens) {
|
|
508
|
-
return {
|
|
509
|
-
type: "polarArea",
|
|
510
|
-
data: {
|
|
511
|
-
labels: ["Chrome", "Safari", "Firefox", "Edge", "Other"],
|
|
512
|
-
datasets: [
|
|
513
|
-
{
|
|
514
|
-
label: "Browser share",
|
|
515
|
-
data: [52, 24, 12, 8, 4],
|
|
516
|
-
backgroundColor: [
|
|
517
|
-
withAlpha(tokens.series[0], 0.72),
|
|
518
|
-
withAlpha(tokens.series[1], 0.72),
|
|
519
|
-
withAlpha(tokens.series[2], 0.72),
|
|
520
|
-
withAlpha(tokens.series[3], 0.72),
|
|
521
|
-
withAlpha(tokens.series[4], 0.72)
|
|
522
|
-
],
|
|
523
|
-
borderWidth: 1,
|
|
524
|
-
borderColor: tokens.surface
|
|
525
|
-
}
|
|
526
|
-
]
|
|
527
|
-
},
|
|
528
|
-
options: {
|
|
529
|
-
responsive: true,
|
|
530
|
-
maintainAspectRatio: false,
|
|
531
|
-
scales: {
|
|
532
|
-
r: {
|
|
533
|
-
ticks: {
|
|
534
|
-
color: tokens.textMuted,
|
|
535
|
-
backdropColor: tokens.surface,
|
|
536
|
-
font: { size: 10 }
|
|
537
|
-
},
|
|
538
|
-
grid: {
|
|
539
|
-
color: tokens.grid
|
|
540
|
-
},
|
|
541
|
-
angleLines: {
|
|
542
|
-
color: tokens.grid
|
|
543
|
-
},
|
|
544
|
-
pointLabels: {
|
|
545
|
-
color: tokens.textMuted,
|
|
546
|
-
font: { size: 11 }
|
|
547
|
-
}
|
|
548
|
-
}
|
|
549
|
-
},
|
|
550
|
-
plugins: {
|
|
551
|
-
legend: {
|
|
552
|
-
display: false
|
|
553
|
-
},
|
|
554
|
-
tooltip: radialInsightTooltip(tokens)
|
|
555
|
-
}
|
|
556
|
-
}
|
|
557
|
-
};
|
|
558
|
-
}
|
|
559
|
-
|
|
560
|
-
// src/lib/chart/use-ph-chart-tokens.ts
|
|
561
|
-
import { useEffect, useRef, useState } from "react";
|
|
562
|
-
|
|
563
|
-
// src/lib/chart/ph-chart-tokens.ts
|
|
564
|
-
var FALLBACK_CHART_TOKENS = {
|
|
565
|
-
series: ["#1d4aff", "#621da6", "#42827e", "#ce0e74", "#f14f58", "#529a0a", "#fe729e"],
|
|
566
|
-
grid: "hsl(78 13% 85%)",
|
|
567
|
-
text: "hsl(0 0% 25%)",
|
|
568
|
-
textMuted: "hsl(0 0% 42%)",
|
|
569
|
-
surface: "#ffffff",
|
|
570
|
-
borderStrong: "hsl(69 8% 65%)",
|
|
571
|
-
accent: "hsl(19deg 100% 48%)"
|
|
572
|
-
};
|
|
573
|
-
function readCssVar(el, key) {
|
|
574
|
-
return getComputedStyle(el).getPropertyValue(key).trim();
|
|
575
|
-
}
|
|
576
|
-
function readChartTokens(root) {
|
|
577
|
-
if (typeof document === "undefined") {
|
|
578
|
-
return FALLBACK_CHART_TOKENS;
|
|
579
|
-
}
|
|
580
|
-
const el = root != null ? root : document.documentElement;
|
|
581
|
-
const series = [1, 2, 3, 4, 5, 6, 7].map((index) => {
|
|
582
|
-
const raw = readCssVar(el, `--ph-data-${index}`);
|
|
583
|
-
return raw !== "" ? raw : FALLBACK_CHART_TOKENS.series[index - 1];
|
|
584
|
-
});
|
|
585
|
-
const grid = readCssVar(el, "--ph-border") || FALLBACK_CHART_TOKENS.grid;
|
|
586
|
-
const text = readCssVar(el, "--ph-text-secondary") || FALLBACK_CHART_TOKENS.text;
|
|
587
|
-
const textMuted = readCssVar(el, "--ph-text-tertiary") || FALLBACK_CHART_TOKENS.textMuted;
|
|
588
|
-
const surface = readCssVar(el, "--ph-surface") || FALLBACK_CHART_TOKENS.surface;
|
|
589
|
-
const borderStrong = readCssVar(el, "--ph-border-strong") || FALLBACK_CHART_TOKENS.borderStrong;
|
|
590
|
-
const accent = readCssVar(el, "--ph-accent") || FALLBACK_CHART_TOKENS.accent;
|
|
591
|
-
return { series, grid, text, textMuted, surface, borderStrong, accent };
|
|
592
|
-
}
|
|
593
|
-
|
|
594
|
-
// src/lib/chart/use-ph-chart-tokens.ts
|
|
595
|
-
function tokensEqual(a, b) {
|
|
596
|
-
if (a.series.length !== b.series.length) return false;
|
|
597
|
-
for (let i = 0; i < a.series.length; i++) {
|
|
598
|
-
if (a.series[i] !== b.series[i]) return false;
|
|
599
|
-
}
|
|
600
|
-
return a.grid === b.grid && a.text === b.text && a.textMuted === b.textMuted && a.surface === b.surface && a.borderStrong === b.borderStrong && a.accent === b.accent;
|
|
601
|
-
}
|
|
602
|
-
function useChartTokens() {
|
|
603
|
-
const [tokens, setTokens] = useState(FALLBACK_CHART_TOKENS);
|
|
604
|
-
const tokensRef = useRef(FALLBACK_CHART_TOKENS);
|
|
605
|
-
useEffect(() => {
|
|
606
|
-
const root = document.documentElement;
|
|
607
|
-
const refresh = () => {
|
|
608
|
-
const next = readChartTokens(root);
|
|
609
|
-
if (!tokensEqual(tokensRef.current, next)) {
|
|
610
|
-
tokensRef.current = next;
|
|
611
|
-
setTokens(next);
|
|
612
|
-
}
|
|
613
|
-
};
|
|
614
|
-
refresh();
|
|
615
|
-
const observer = new MutationObserver(refresh);
|
|
616
|
-
observer.observe(root, { attributes: true, attributeFilter: ["data-theme"] });
|
|
617
|
-
return () => observer.disconnect();
|
|
618
|
-
}, []);
|
|
619
|
-
return tokens;
|
|
620
|
-
}
|
|
621
|
-
|
|
622
|
-
// src/lib/hog-charts-lite/build-theme.ts
|
|
623
|
-
function buildHogChartTheme(tokens) {
|
|
624
|
-
return {
|
|
625
|
-
colors: tokens.series.slice(),
|
|
626
|
-
backgroundColor: tokens.surface,
|
|
627
|
-
axisColor: tokens.textMuted,
|
|
628
|
-
gridColor: tokens.grid,
|
|
629
|
-
crosshairColor: tokens.borderStrong
|
|
630
|
-
};
|
|
631
|
-
}
|
|
350
|
+
// src/components/charts/quill/TimeSeriesLineChart.tsx
|
|
351
|
+
import { useMemo as useMemo2 } from "react";
|
|
632
352
|
|
|
633
353
|
// src/lib/hog-charts-lite/CanvasTrendLineChart.tsx
|
|
634
354
|
import { scaleLinear, scalePoint } from "d3-scale";
|
|
635
|
-
import { useCallback, useEffect
|
|
355
|
+
import { useCallback, useEffect, useMemo, useRef, useState } from "react";
|
|
636
356
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
637
357
|
var HOG_LITE_DEFAULT_MARGINS = { top: 16, right: 16, bottom: 32, left: 48 };
|
|
638
358
|
function resolveDisplayedSeries(series, palette) {
|
|
@@ -687,11 +407,11 @@ function CanvasTrendLineChart({
|
|
|
687
407
|
showCrosshair = true,
|
|
688
408
|
className = ""
|
|
689
409
|
}) {
|
|
690
|
-
const containerRef =
|
|
691
|
-
const canvasRef =
|
|
692
|
-
const [size, setSize] =
|
|
693
|
-
const [hoverIndex, setHoverIndex] =
|
|
694
|
-
|
|
410
|
+
const containerRef = useRef(null);
|
|
411
|
+
const canvasRef = useRef(null);
|
|
412
|
+
const [size, setSize] = useState({ width: 0, height: 0 });
|
|
413
|
+
const [hoverIndex, setHoverIndex] = useState(null);
|
|
414
|
+
useEffect(() => {
|
|
695
415
|
const el = containerRef.current;
|
|
696
416
|
if (!el) {
|
|
697
417
|
return;
|
|
@@ -878,7 +598,7 @@ function CanvasTrendLineChart({
|
|
|
878
598
|
}
|
|
879
599
|
}
|
|
880
600
|
}, [hoverIndex, labels, resolved, showCrosshair, showGrid, size.height, size.width, theme]);
|
|
881
|
-
|
|
601
|
+
useEffect(() => {
|
|
882
602
|
draw();
|
|
883
603
|
}, [draw]);
|
|
884
604
|
const onMouseMove = (event) => {
|
|
@@ -962,322 +682,347 @@ function CanvasTrendLineChart({
|
|
|
962
682
|
] });
|
|
963
683
|
}
|
|
964
684
|
|
|
965
|
-
// src/
|
|
966
|
-
import {
|
|
967
|
-
var
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
|
|
685
|
+
// src/lib/chart/use-ph-chart-tokens.ts
|
|
686
|
+
import { useEffect as useEffect2, useState as useState2 } from "react";
|
|
687
|
+
var DEFAULT_TOKENS = {
|
|
688
|
+
series: ["#1d4aff", "#621da6", "#42827e", "#ce0e74", "#f14f58", "#529a0a", "#fe729e"],
|
|
689
|
+
muted: "hsl(220 9% 90%)",
|
|
690
|
+
surface: "#ffffff"
|
|
691
|
+
};
|
|
692
|
+
function readTokens() {
|
|
693
|
+
if (typeof document === "undefined") return DEFAULT_TOKENS;
|
|
694
|
+
const style = getComputedStyle(document.documentElement);
|
|
695
|
+
const read = (key, fallback) => style.getPropertyValue(key).trim() || fallback;
|
|
696
|
+
return {
|
|
697
|
+
series: [
|
|
698
|
+
read("--ph-data-1", DEFAULT_TOKENS.series[0]),
|
|
699
|
+
read("--ph-data-2", DEFAULT_TOKENS.series[1]),
|
|
700
|
+
read("--ph-data-3", DEFAULT_TOKENS.series[2]),
|
|
701
|
+
read("--ph-data-4", DEFAULT_TOKENS.series[3]),
|
|
702
|
+
read("--ph-data-5", DEFAULT_TOKENS.series[4]),
|
|
703
|
+
read("--ph-data-6", DEFAULT_TOKENS.series[5]),
|
|
704
|
+
read("--ph-data-7", DEFAULT_TOKENS.series[6])
|
|
705
|
+
],
|
|
706
|
+
muted: read("--ph-muted", DEFAULT_TOKENS.muted),
|
|
707
|
+
surface: read("--ph-surface", DEFAULT_TOKENS.surface)
|
|
708
|
+
};
|
|
709
|
+
}
|
|
710
|
+
function useChartTokens() {
|
|
711
|
+
const [tokens, setTokens] = useState2(DEFAULT_TOKENS);
|
|
712
|
+
useEffect2(() => {
|
|
713
|
+
setTokens(readTokens());
|
|
714
|
+
}, []);
|
|
715
|
+
return tokens;
|
|
716
|
+
}
|
|
717
|
+
|
|
718
|
+
// src/lib/hog-charts-lite/build-theme.ts
|
|
719
|
+
function buildHogChartTheme(tokens) {
|
|
720
|
+
return {
|
|
721
|
+
colors: tokens.series.slice(),
|
|
722
|
+
backgroundColor: tokens.surface,
|
|
723
|
+
axisColor: tokens.textMuted,
|
|
724
|
+
gridColor: tokens.grid,
|
|
725
|
+
crosshairColor: tokens.borderStrong
|
|
726
|
+
};
|
|
972
727
|
}
|
|
973
|
-
|
|
728
|
+
|
|
729
|
+
// src/components/charts/quill/TimeSeriesLineChart.tsx
|
|
730
|
+
import { jsx as jsx2 } from "react/jsx-runtime";
|
|
731
|
+
function TimeSeriesLineChart({
|
|
732
|
+
series,
|
|
733
|
+
labels,
|
|
734
|
+
className,
|
|
735
|
+
showGrid = true,
|
|
736
|
+
showCrosshair = true,
|
|
737
|
+
height = 280
|
|
738
|
+
}) {
|
|
739
|
+
const tokens = useChartTokens();
|
|
740
|
+
const theme = useMemo2(() => buildHogChartTheme(tokens), [tokens]);
|
|
741
|
+
const resolved = useMemo2(
|
|
742
|
+
() => series.map((s, i) => {
|
|
743
|
+
var _a;
|
|
744
|
+
return {
|
|
745
|
+
key: s.key,
|
|
746
|
+
label: s.label,
|
|
747
|
+
data: s.data,
|
|
748
|
+
color: (_a = s.color) != null ? _a : tokens.series[i % tokens.series.length]
|
|
749
|
+
};
|
|
750
|
+
}),
|
|
751
|
+
[series, tokens.series]
|
|
752
|
+
);
|
|
974
753
|
return /* @__PURE__ */ jsx2(
|
|
975
754
|
"div",
|
|
976
755
|
{
|
|
977
|
-
className:
|
|
978
|
-
|
|
756
|
+
className: cn("relative w-full", className),
|
|
757
|
+
style: { height, minHeight: 220 },
|
|
758
|
+
children: /* @__PURE__ */ jsx2(
|
|
759
|
+
CanvasTrendLineChart,
|
|
760
|
+
{
|
|
761
|
+
labels,
|
|
762
|
+
series: resolved,
|
|
763
|
+
theme,
|
|
764
|
+
showGrid,
|
|
765
|
+
showCrosshair,
|
|
766
|
+
className: "h-full min-h-[220px]"
|
|
767
|
+
}
|
|
768
|
+
)
|
|
979
769
|
}
|
|
980
770
|
);
|
|
981
771
|
}
|
|
982
|
-
|
|
983
|
-
|
|
772
|
+
|
|
773
|
+
// src/components/charts/quill/BarChart.tsx
|
|
774
|
+
import { useMemo as useMemo3 } from "react";
|
|
775
|
+
import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
776
|
+
function BarChart({ series, labels, className, height = 280 }) {
|
|
984
777
|
const tokens = useChartTokens();
|
|
985
|
-
const
|
|
986
|
-
const
|
|
987
|
-
|
|
778
|
+
const groupCount = labels.length;
|
|
779
|
+
const barCount = series.length;
|
|
780
|
+
const { maxVal, chartData } = useMemo3(() => {
|
|
781
|
+
let mx = 0;
|
|
782
|
+
const flat = series.flatMap((s) => s.data);
|
|
783
|
+
for (const v of flat) if (v > mx) mx = v;
|
|
784
|
+
return {
|
|
785
|
+
maxVal: mx || 1,
|
|
786
|
+
chartData: series.map((s, i) => {
|
|
787
|
+
var _a;
|
|
788
|
+
return {
|
|
789
|
+
label: s.label,
|
|
790
|
+
color: (_a = s.color) != null ? _a : tokens.series[i % tokens.series.length],
|
|
791
|
+
values: s.data
|
|
792
|
+
};
|
|
793
|
+
})
|
|
794
|
+
};
|
|
795
|
+
}, [series, tokens.series]);
|
|
796
|
+
const padding = { top: 16, right: 8, bottom: 24, left: 8 };
|
|
797
|
+
const innerW = 400 - padding.left - padding.right;
|
|
798
|
+
const innerH = height - padding.top - padding.bottom;
|
|
799
|
+
const groupW = innerW / groupCount;
|
|
800
|
+
const barW = Math.max(4, groupW * 0.7 / barCount);
|
|
801
|
+
const gap = groupW * 0.15;
|
|
802
|
+
return /* @__PURE__ */ jsx3("div", { className: cn("relative w-full", className), style: { height }, children: /* @__PURE__ */ jsxs2("svg", { viewBox: `0 0 400 ${height}`, className: "h-full w-full", preserveAspectRatio: "xMidYMid meet", suppressHydrationWarning: true, children: [
|
|
803
|
+
chartData.map(
|
|
804
|
+
(bar, bi) => bar.values.map((v, li) => {
|
|
805
|
+
const x = padding.left + li * groupW + gap / 2 + bi * barW;
|
|
806
|
+
const barH = v / maxVal * (innerH - 4);
|
|
807
|
+
const y = padding.top + innerH - barH;
|
|
808
|
+
return /* @__PURE__ */ jsx3(
|
|
809
|
+
"rect",
|
|
810
|
+
{
|
|
811
|
+
x,
|
|
812
|
+
y,
|
|
813
|
+
width: barW,
|
|
814
|
+
height: barH,
|
|
815
|
+
fill: bar.color,
|
|
816
|
+
rx: 2,
|
|
817
|
+
children: /* @__PURE__ */ jsx3("title", { children: `${bar.label}: ${v}` })
|
|
818
|
+
},
|
|
819
|
+
`${bi}-${li}`
|
|
820
|
+
);
|
|
821
|
+
})
|
|
822
|
+
),
|
|
823
|
+
labels.map((l, i) => /* @__PURE__ */ jsx3(
|
|
824
|
+
"text",
|
|
988
825
|
{
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
826
|
+
x: padding.left + i * groupW + groupW / 2,
|
|
827
|
+
y: height - 4,
|
|
828
|
+
textAnchor: "middle",
|
|
829
|
+
className: "fill-ph-mutedtext",
|
|
830
|
+
fontSize: "10",
|
|
831
|
+
children: l
|
|
994
832
|
},
|
|
995
|
-
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
data: [920, 990, 940, 1040, 1012, 540, 510],
|
|
999
|
-
color: tokens.series[1],
|
|
1000
|
-
stroke: { pattern: [5, 5] }
|
|
1001
|
-
}
|
|
1002
|
-
],
|
|
1003
|
-
[tokens.series]
|
|
1004
|
-
);
|
|
1005
|
-
if (!mounted) {
|
|
1006
|
-
return /* @__PURE__ */ jsx2(ChartSkeleton, {});
|
|
1007
|
-
}
|
|
1008
|
-
return /* @__PURE__ */ jsx2("div", { className: "relative h-[280px] w-full min-h-[220px]", children: /* @__PURE__ */ jsx2(
|
|
1009
|
-
CanvasTrendLineChart,
|
|
1010
|
-
{
|
|
1011
|
-
labels: DEMO_LABELS,
|
|
1012
|
-
series,
|
|
1013
|
-
theme,
|
|
1014
|
-
showGrid: true,
|
|
1015
|
-
showCrosshair: true,
|
|
1016
|
-
className: "h-full min-h-[220px]"
|
|
1017
|
-
}
|
|
1018
|
-
) });
|
|
1019
|
-
}
|
|
1020
|
-
function InsightVerticalBarChart() {
|
|
1021
|
-
const mounted = useClientMounted();
|
|
1022
|
-
const tokens = useChartTokens();
|
|
1023
|
-
const config = useMemo2(() => buildVerticalBarDemo(tokens), [tokens]);
|
|
1024
|
-
if (!mounted) {
|
|
1025
|
-
return /* @__PURE__ */ jsx2(ChartSkeleton, {});
|
|
1026
|
-
}
|
|
1027
|
-
return /* @__PURE__ */ jsx2("div", { className: "relative h-[280px] w-full min-h-[220px]", children: /* @__PURE__ */ jsx2(Bar, { data: config.data, options: config.options, redraw: false }) });
|
|
1028
|
-
}
|
|
1029
|
-
function InsightHorizontalBarChart() {
|
|
1030
|
-
const mounted = useClientMounted();
|
|
1031
|
-
const tokens = useChartTokens();
|
|
1032
|
-
const config = useMemo2(() => buildHorizontalBarDemo(tokens), [tokens]);
|
|
1033
|
-
if (!mounted) {
|
|
1034
|
-
return /* @__PURE__ */ jsx2(ChartSkeleton, { className: "h-[320px]" });
|
|
1035
|
-
}
|
|
1036
|
-
return /* @__PURE__ */ jsx2("div", { className: "relative h-[320px] w-full min-h-[260px]", children: /* @__PURE__ */ jsx2(Bar, { data: config.data, options: config.options, redraw: false }) });
|
|
1037
|
-
}
|
|
1038
|
-
function InsightStackedBarChart() {
|
|
1039
|
-
const mounted = useClientMounted();
|
|
1040
|
-
const tokens = useChartTokens();
|
|
1041
|
-
const config = useMemo2(() => buildStackedBarDemo(tokens), [tokens]);
|
|
1042
|
-
if (!mounted) {
|
|
1043
|
-
return /* @__PURE__ */ jsx2(ChartSkeleton, { className: "h-[300px]" });
|
|
1044
|
-
}
|
|
1045
|
-
return /* @__PURE__ */ jsx2("div", { className: "relative h-[300px] w-full min-h-[240px]", children: /* @__PURE__ */ jsx2(Bar, { data: config.data, options: config.options, redraw: false }) });
|
|
1046
|
-
}
|
|
1047
|
-
function InsightDoughnutChart() {
|
|
1048
|
-
const mounted = useClientMounted();
|
|
1049
|
-
const tokens = useChartTokens();
|
|
1050
|
-
const config = useMemo2(() => buildDoughnutDemo(tokens), [tokens]);
|
|
1051
|
-
if (!mounted) {
|
|
1052
|
-
return /* @__PURE__ */ jsx2(ChartSkeleton, { className: "h-[260px]" });
|
|
1053
|
-
}
|
|
1054
|
-
return /* @__PURE__ */ jsx2("div", { className: "relative mx-auto h-[260px] w-full max-w-[280px] min-h-[220px]", children: /* @__PURE__ */ jsx2(Doughnut, { data: config.data, options: config.options, redraw: false }) });
|
|
1055
|
-
}
|
|
1056
|
-
function InsightPolarAreaChart() {
|
|
1057
|
-
const mounted = useClientMounted();
|
|
1058
|
-
const tokens = useChartTokens();
|
|
1059
|
-
const config = useMemo2(() => buildPolarAreaDemo(tokens), [tokens]);
|
|
1060
|
-
if (!mounted) {
|
|
1061
|
-
return /* @__PURE__ */ jsx2(ChartSkeleton, { className: "h-[280px]" });
|
|
1062
|
-
}
|
|
1063
|
-
return /* @__PURE__ */ jsx2("div", { className: "relative mx-auto h-[280px] w-full max-w-[320px] min-h-[240px]", children: /* @__PURE__ */ jsx2(PolarArea, { data: config.data, options: config.options, redraw: false }) });
|
|
833
|
+
l
|
|
834
|
+
))
|
|
835
|
+
] }) });
|
|
1064
836
|
}
|
|
1065
837
|
|
|
1066
|
-
// src/components/
|
|
1067
|
-
import {
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
1071
|
-
}
|
|
1072
|
-
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
838
|
+
// src/components/charts/quill/PieChart.tsx
|
|
839
|
+
import { useMemo as useMemo4 } from "react";
|
|
840
|
+
import { jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
|
|
841
|
+
function PieChart({ slices, className, size = 200 }) {
|
|
842
|
+
const tokens = useChartTokens();
|
|
843
|
+
const { total, segments } = useMemo4(() => {
|
|
844
|
+
const t = slices.reduce((s, sl) => s + Math.max(0, sl.value), 0);
|
|
845
|
+
let cum = 0;
|
|
846
|
+
const segs = slices.map((sl, i) => {
|
|
847
|
+
var _a;
|
|
848
|
+
const start = cum;
|
|
849
|
+
const val = Math.max(0, sl.value);
|
|
850
|
+
cum += val;
|
|
851
|
+
return __spreadProps(__spreadValues({}, sl), {
|
|
852
|
+
color: (_a = sl.color) != null ? _a : tokens.series[i % tokens.series.length],
|
|
853
|
+
startAngle: start / t * 360,
|
|
854
|
+
endAngle: cum / t * 360,
|
|
855
|
+
pct: t > 0 ? val / t * 100 : 0
|
|
856
|
+
});
|
|
857
|
+
});
|
|
858
|
+
return { total: t, segments: segs };
|
|
859
|
+
}, [slices, tokens.series]);
|
|
860
|
+
const cx = size / 2;
|
|
861
|
+
const cy = size / 2;
|
|
862
|
+
const r = size * 0.38;
|
|
863
|
+
const ir = r * 0.6;
|
|
864
|
+
const polarToCart = (angleDeg, radius) => {
|
|
865
|
+
const rad = (angleDeg - 90) * Math.PI / 180;
|
|
866
|
+
return { x: cx + radius * Math.cos(rad), y: cy + radius * Math.sin(rad) };
|
|
867
|
+
};
|
|
868
|
+
const describeArc = (start, end) => {
|
|
869
|
+
if (end - start >= 359.9) {
|
|
870
|
+
const p1 = polarToCart(start, r);
|
|
871
|
+
const p2 = polarToCart(start + 179.9, r);
|
|
872
|
+
const p3 = polarToCart(start + 359.9, r);
|
|
873
|
+
return `M${p1.x},${p1.y} A${r},${r} 0 0,1 ${p2.x},${p2.y} A${r},${r} 0 0,1 ${p3.x},${p3.y} Z`;
|
|
874
|
+
}
|
|
875
|
+
const s = polarToCart(start, r);
|
|
876
|
+
const e = polarToCart(end, r);
|
|
877
|
+
const si = polarToCart(start, ir);
|
|
878
|
+
const ei = polarToCart(end, ir);
|
|
879
|
+
const large = end - start > 180 ? 1 : 0;
|
|
880
|
+
return `M${s.x},${s.y} A${r},${r} 0 ${large},1 ${e.x},${e.y} L${ei.x},${ei.y} A${ir},${ir} 0 ${large},0 ${si.x},${si.y} Z`;
|
|
881
|
+
};
|
|
882
|
+
return /* @__PURE__ */ jsxs3("div", { className: cn("relative", className), style: { width: size, height: size }, children: [
|
|
883
|
+
/* @__PURE__ */ jsxs3("svg", { viewBox: `0 0 ${size} ${size}`, className: "h-full w-full", suppressHydrationWarning: true, children: [
|
|
884
|
+
segments.map((s) => /* @__PURE__ */ jsx4("path", { d: describeArc(s.startAngle, s.endAngle), fill: s.color, children: /* @__PURE__ */ jsx4("title", { children: `${s.label}: ${s.pct.toFixed(1)}%` }) }, s.key)),
|
|
885
|
+
/* @__PURE__ */ jsx4("circle", { cx, cy, r: ir, fill: "var(--ph-surface)" })
|
|
1080
886
|
] }),
|
|
1081
|
-
|
|
887
|
+
/* @__PURE__ */ jsx4("div", { className: "absolute inset-0 flex items-center justify-center pointer-events-none", children: /* @__PURE__ */ jsx4("span", { className: "text-lg font-bold text-ph-ink tabular-nums", children: slices.length }) })
|
|
1082
888
|
] });
|
|
1083
889
|
}
|
|
1084
890
|
|
|
1085
|
-
// src/components/
|
|
891
|
+
// src/components/charts/quill/Sparkline.tsx
|
|
892
|
+
import { useMemo as useMemo5 } from "react";
|
|
1086
893
|
import { jsx as jsx5 } from "react/jsx-runtime";
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
"
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
)
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
}
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
var _b = _a, { label, value, footer, icon, className, children } = _b, props = __objRest(_b, ["label", "value", "footer", "icon", "className", "children"]);
|
|
1122
|
-
return /* @__PURE__ */ jsxs3("article", __spreadProps(__spreadValues({ className: cn("ph-stat", className) }, props), { children: [
|
|
1123
|
-
icon != null ? /* @__PURE__ */ jsx7("div", { className: "mb-2 [&>svg]:h-7 [&>svg]:w-7", children: icon }) : null,
|
|
1124
|
-
/* @__PURE__ */ jsx7("div", { className: "ph-stat-label", children: label }),
|
|
1125
|
-
/* @__PURE__ */ jsx7("div", { className: "ph-stat-val", children: value }),
|
|
1126
|
-
footer != null ? /* @__PURE__ */ jsx7("p", { className: "mt-1 text-xs text-ph-subtle", children: footer }) : null,
|
|
1127
|
-
children
|
|
1128
|
-
] }));
|
|
1129
|
-
}
|
|
1130
|
-
|
|
1131
|
-
// src/components/dashboard/DashboardInsightPlaceholder.tsx
|
|
1132
|
-
import { jsx as jsx8 } from "react/jsx-runtime";
|
|
1133
|
-
function DashboardInsightPlaceholder(_a) {
|
|
1134
|
-
var _b = _a, {
|
|
1135
|
-
label = "Add insight",
|
|
1136
|
-
className,
|
|
1137
|
-
children,
|
|
1138
|
-
type = "button"
|
|
1139
|
-
} = _b, props = __objRest(_b, [
|
|
1140
|
-
"label",
|
|
1141
|
-
"className",
|
|
1142
|
-
"children",
|
|
1143
|
-
"type"
|
|
1144
|
-
]);
|
|
1145
|
-
return /* @__PURE__ */ jsx8(
|
|
1146
|
-
"button",
|
|
1147
|
-
__spreadProps(__spreadValues({
|
|
1148
|
-
type,
|
|
1149
|
-
"aria-label": label,
|
|
1150
|
-
className: cn(
|
|
1151
|
-
"ph-dashboard-placeholder group text-left outline-none transition",
|
|
1152
|
-
"focus-visible:ring-2 focus-visible:ring-ph-brand focus-visible:ring-offset-2",
|
|
1153
|
-
className
|
|
1154
|
-
)
|
|
1155
|
-
}, props), {
|
|
1156
|
-
children: children != null ? children : /* @__PURE__ */ jsx8("span", { className: "font-medium text-ph-subtle group-hover:text-ph-ink", children: label })
|
|
1157
|
-
})
|
|
894
|
+
function Sparkline({
|
|
895
|
+
data,
|
|
896
|
+
color,
|
|
897
|
+
className,
|
|
898
|
+
width = 80,
|
|
899
|
+
height = 32,
|
|
900
|
+
strokeWidth = 2
|
|
901
|
+
}) {
|
|
902
|
+
const tokens = useChartTokens();
|
|
903
|
+
const resolvedColor = color != null ? color : tokens.series[0];
|
|
904
|
+
const path = useMemo5(() => {
|
|
905
|
+
if (data.length < 2) return "";
|
|
906
|
+
const min = Math.min(...data);
|
|
907
|
+
const max = Math.max(...data);
|
|
908
|
+
const range = max - min || 1;
|
|
909
|
+
const xStep = width / (data.length - 1);
|
|
910
|
+
return data.map((v, i) => {
|
|
911
|
+
const x = i * xStep;
|
|
912
|
+
const y = height - (v - min) / range * (height - 4) - 2;
|
|
913
|
+
return `${i === 0 ? "M" : "L"}${x},${y}`;
|
|
914
|
+
}).join(" ");
|
|
915
|
+
}, [data, width, height]);
|
|
916
|
+
if (data.length < 2) return null;
|
|
917
|
+
return /* @__PURE__ */ jsx5(
|
|
918
|
+
"svg",
|
|
919
|
+
{
|
|
920
|
+
className: cn("shrink-0", className),
|
|
921
|
+
width,
|
|
922
|
+
height,
|
|
923
|
+
viewBox: `0 0 ${width} ${height}`,
|
|
924
|
+
"aria-hidden": true,
|
|
925
|
+
suppressHydrationWarning: true,
|
|
926
|
+
children: /* @__PURE__ */ jsx5("path", { d: path, fill: "none", stroke: resolvedColor, strokeWidth, strokeLinecap: "round", strokeLinejoin: "round" })
|
|
927
|
+
}
|
|
1158
928
|
);
|
|
1159
929
|
}
|
|
1160
930
|
|
|
1161
|
-
// src/components/
|
|
1162
|
-
import { jsx as
|
|
1163
|
-
function
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1173
|
-
"children
|
|
1174
|
-
|
|
1175
|
-
|
|
1176
|
-
|
|
1177
|
-
|
|
1178
|
-
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
style: { background: ribbon },
|
|
1182
|
-
"aria-hidden": true
|
|
1183
|
-
}
|
|
1184
|
-
) : null,
|
|
1185
|
-
/* @__PURE__ */ jsx9("div", { className: cn("flex min-w-0 flex-1 flex-col gap-3 p-4", bodyClassName), children })
|
|
1186
|
-
] }));
|
|
1187
|
-
}
|
|
1188
|
-
|
|
1189
|
-
// src/components/dashboard/InsightShellHeader.tsx
|
|
1190
|
-
import { jsx as jsx10, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
1191
|
-
function InsightShellHeader({ title, subtitle, actions, className }) {
|
|
1192
|
-
return /* @__PURE__ */ jsxs5("header", { className: cn("flex gap-3", actions != null ? "items-start justify-between" : "", className), children: [
|
|
1193
|
-
/* @__PURE__ */ jsxs5("div", { className: "min-w-0 flex-1", children: [
|
|
1194
|
-
/* @__PURE__ */ jsx10("h4", { className: "font-semibold leading-snug text-ph-ink", children: title }),
|
|
1195
|
-
subtitle != null ? /* @__PURE__ */ jsx10("p", { className: "mt-0.5 text-xs text-ph-mutedtext", children: subtitle }) : null
|
|
931
|
+
// src/components/charts/quill/MetricCard.tsx
|
|
932
|
+
import { jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
|
|
933
|
+
function MetricCard({
|
|
934
|
+
value,
|
|
935
|
+
label,
|
|
936
|
+
change,
|
|
937
|
+
sparklineData,
|
|
938
|
+
icon,
|
|
939
|
+
className
|
|
940
|
+
}) {
|
|
941
|
+
var _a;
|
|
942
|
+
return /* @__PURE__ */ jsxs4("div", { className: cn("ph-metric", className), children: [
|
|
943
|
+
/* @__PURE__ */ jsxs4("div", { className: "ph-metric__header", children: [
|
|
944
|
+
icon && /* @__PURE__ */ jsx6("span", { className: "ph-metric__icon", children: icon }),
|
|
945
|
+
/* @__PURE__ */ jsx6("span", { className: "ph-metric__label", children: label }),
|
|
946
|
+
change && /* @__PURE__ */ jsxs4(Badge, { variant: ((_a = change.positive) != null ? _a : change.value >= 0) ? "success" : "danger", children: [
|
|
947
|
+
change.value >= 0 ? "+" : "",
|
|
948
|
+
change.value,
|
|
949
|
+
"%"
|
|
950
|
+
] })
|
|
1196
951
|
] }),
|
|
1197
|
-
|
|
952
|
+
/* @__PURE__ */ jsx6("div", { className: "ph-metric__value", children: value }),
|
|
953
|
+
sparklineData && sparklineData.length > 0 && /* @__PURE__ */ jsx6("div", { className: "mt-2", children: /* @__PURE__ */ jsx6(Sparkline, { data: sparklineData }) })
|
|
1198
954
|
] });
|
|
1199
955
|
}
|
|
1200
956
|
|
|
1201
|
-
// src/components/
|
|
1202
|
-
import {
|
|
1203
|
-
|
|
1204
|
-
function
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1215
|
-
})
|
|
1216
|
-
|
|
1217
|
-
|
|
1218
|
-
|
|
1219
|
-
|
|
1220
|
-
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
|
|
957
|
+
// src/components/charts/quill/FunnelChart.tsx
|
|
958
|
+
import { useMemo as useMemo6 } from "react";
|
|
959
|
+
import { jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
|
|
960
|
+
function FunnelChart({ steps, className }) {
|
|
961
|
+
const tokens = useChartTokens();
|
|
962
|
+
const maxCount = useMemo6(() => Math.max(...steps.map((s) => s.count)), [steps]);
|
|
963
|
+
return /* @__PURE__ */ jsx7("div", { className: cn("space-y-2", className), suppressHydrationWarning: true, children: steps.map((step, i) => {
|
|
964
|
+
const pct = step.count / maxCount * 100;
|
|
965
|
+
const prev = i > 0 ? steps[i - 1].count : step.count;
|
|
966
|
+
const dropoff = prev > 0 ? (prev - step.count) / prev * 100 : 0;
|
|
967
|
+
return /* @__PURE__ */ jsxs5("div", { className: "space-y-1", children: [
|
|
968
|
+
/* @__PURE__ */ jsxs5("div", { className: "flex items-center justify-between text-sm", children: [
|
|
969
|
+
/* @__PURE__ */ jsx7("span", { className: "font-medium text-ph-ink", children: step.label }),
|
|
970
|
+
/* @__PURE__ */ jsx7("span", { className: "tabular-nums text-ph-subtle", children: step.count.toLocaleString() })
|
|
971
|
+
] }),
|
|
972
|
+
/* @__PURE__ */ jsx7("div", { className: "relative h-8 overflow-hidden rounded-md", style: { background: tokens.muted }, children: /* @__PURE__ */ jsx7(
|
|
973
|
+
"div",
|
|
974
|
+
{
|
|
975
|
+
className: "h-full rounded-md transition-all duration-500",
|
|
976
|
+
style: { width: `${pct}%`, background: i === 0 ? tokens.series[0] : tokens.series[i % tokens.series.length] }
|
|
977
|
+
}
|
|
978
|
+
) }),
|
|
979
|
+
i > 0 && dropoff > 0 && /* @__PURE__ */ jsxs5("p", { className: "text-xs text-ph-danger", children: [
|
|
980
|
+
"-",
|
|
981
|
+
dropoff.toFixed(1),
|
|
982
|
+
"% dropoff"
|
|
983
|
+
] })
|
|
984
|
+
] }, step.label);
|
|
1229
985
|
}) });
|
|
1230
986
|
}
|
|
1231
|
-
|
|
1232
|
-
// src/components/dashboard/InsightMiniCard.tsx
|
|
1233
|
-
import { jsx as jsx12, jsxs as jsxs6 } from "react/jsx-runtime";
|
|
1234
|
-
function InsightMiniCard(_a) {
|
|
1235
|
-
var _b = _a, {
|
|
1236
|
-
title,
|
|
1237
|
-
subtitle,
|
|
1238
|
-
heights,
|
|
1239
|
-
ribbonColour
|
|
1240
|
-
} = _b, shellProps = __objRest(_b, [
|
|
1241
|
-
"title",
|
|
1242
|
-
"subtitle",
|
|
1243
|
-
"heights",
|
|
1244
|
-
"ribbonColour"
|
|
1245
|
-
]);
|
|
1246
|
-
return /* @__PURE__ */ jsxs6(InsightShell, __spreadProps(__spreadValues({ ribbonColour }, shellProps), { children: [
|
|
1247
|
-
/* @__PURE__ */ jsx12(InsightShellHeader, { title, subtitle }),
|
|
1248
|
-
/* @__PURE__ */ jsx12(MiniTrendBars, { heights })
|
|
1249
|
-
] }));
|
|
1250
|
-
}
|
|
1251
987
|
export {
|
|
1252
988
|
Accordion,
|
|
1253
989
|
Alert,
|
|
990
|
+
AlertDialog,
|
|
991
|
+
AppLayout,
|
|
1254
992
|
AuthCard,
|
|
1255
993
|
AuthDivider,
|
|
1256
994
|
AuthLayout,
|
|
995
|
+
Autocomplete,
|
|
1257
996
|
Avatar,
|
|
1258
997
|
AvatarGroup,
|
|
1259
998
|
Badge,
|
|
999
|
+
Banner,
|
|
1000
|
+
BarChart,
|
|
1260
1001
|
Breadcrumbs,
|
|
1261
1002
|
Button,
|
|
1262
1003
|
ButtonChrome,
|
|
1004
|
+
ButtonGroup,
|
|
1263
1005
|
CANONICAL_ICONS,
|
|
1264
1006
|
Calendar,
|
|
1265
1007
|
Caption,
|
|
1266
1008
|
Card,
|
|
1267
1009
|
ChatBubble,
|
|
1268
1010
|
Checkbox,
|
|
1011
|
+
Chip,
|
|
1269
1012
|
CodeBlock,
|
|
1013
|
+
Collapsible,
|
|
1270
1014
|
CollapsibleSection,
|
|
1015
|
+
Combobox,
|
|
1271
1016
|
CommandPalette,
|
|
1272
1017
|
ComponentDocs,
|
|
1018
|
+
ContextMenu,
|
|
1273
1019
|
DEFAULT_THEME_ID,
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
DashboardKpiCard,
|
|
1278
|
-
DashboardToolbar,
|
|
1279
|
-
DashboardWell,
|
|
1020
|
+
DataTable,
|
|
1021
|
+
DatePicker,
|
|
1022
|
+
Dialog,
|
|
1280
1023
|
Display,
|
|
1024
|
+
Divider,
|
|
1025
|
+
Dot,
|
|
1281
1026
|
Drawer,
|
|
1282
1027
|
DropdownButton,
|
|
1283
1028
|
DropdownItem,
|
|
@@ -1291,110 +1036,241 @@ export {
|
|
|
1291
1036
|
FilterControls,
|
|
1292
1037
|
FilterMenu,
|
|
1293
1038
|
FormField,
|
|
1039
|
+
FunnelChart,
|
|
1294
1040
|
H1,
|
|
1295
1041
|
H2,
|
|
1296
1042
|
H3,
|
|
1297
1043
|
H4,
|
|
1298
1044
|
H5,
|
|
1299
|
-
HogTrendLineChart,
|
|
1300
1045
|
HoverCard,
|
|
1301
1046
|
IconBase as Icon,
|
|
1047
|
+
Icon123,
|
|
1048
|
+
IconAI,
|
|
1049
|
+
IconAction,
|
|
1302
1050
|
IconActivity,
|
|
1051
|
+
IconAdsClick,
|
|
1052
|
+
IconAndroidOS,
|
|
1053
|
+
IconAppleIOS,
|
|
1054
|
+
IconArchive,
|
|
1303
1055
|
IconAreaChart,
|
|
1304
1056
|
IconArrowDown,
|
|
1305
1057
|
IconArrowUp,
|
|
1058
|
+
IconAtSign,
|
|
1059
|
+
IconBadge,
|
|
1306
1060
|
IconBase,
|
|
1307
1061
|
IconBell,
|
|
1308
1062
|
IconBellOff,
|
|
1063
|
+
IconBinary,
|
|
1064
|
+
IconBlank,
|
|
1065
|
+
IconBold,
|
|
1309
1066
|
IconBolt,
|
|
1067
|
+
IconBook,
|
|
1068
|
+
IconBookmarkBorder,
|
|
1310
1069
|
IconBox,
|
|
1070
|
+
IconBranch,
|
|
1071
|
+
IconBug,
|
|
1311
1072
|
IconByName,
|
|
1073
|
+
IconCalculate,
|
|
1074
|
+
IconCalendar,
|
|
1075
|
+
IconCalendarDay,
|
|
1312
1076
|
IconCancel,
|
|
1077
|
+
IconCart,
|
|
1078
|
+
IconChat,
|
|
1313
1079
|
IconCheck,
|
|
1314
1080
|
IconCheckCircle,
|
|
1081
|
+
IconCheckboxChecked,
|
|
1315
1082
|
IconChevronDown,
|
|
1316
1083
|
IconChevronLeft,
|
|
1317
1084
|
IconChevronRight,
|
|
1085
|
+
IconChrome,
|
|
1318
1086
|
IconClipboardEdit,
|
|
1087
|
+
IconClock,
|
|
1319
1088
|
IconClose,
|
|
1089
|
+
IconCloud,
|
|
1320
1090
|
IconCodePreview,
|
|
1091
|
+
IconCoffee,
|
|
1321
1092
|
IconCohort,
|
|
1322
1093
|
IconCommandCursor,
|
|
1094
|
+
IconConfetti,
|
|
1323
1095
|
IconCopy,
|
|
1096
|
+
IconCrown,
|
|
1324
1097
|
IconCumulativeChart,
|
|
1325
1098
|
IconDataReel,
|
|
1326
1099
|
IconDatabase,
|
|
1100
|
+
IconDevices,
|
|
1101
|
+
IconDocument,
|
|
1327
1102
|
IconDownload,
|
|
1103
|
+
IconDownloadCloud,
|
|
1104
|
+
IconDragHandle,
|
|
1328
1105
|
IconEdit,
|
|
1329
1106
|
IconErrorOutline,
|
|
1107
|
+
IconEvent,
|
|
1330
1108
|
IconEventStream,
|
|
1331
1109
|
IconExclamation,
|
|
1332
1110
|
IconExperimentSplit,
|
|
1111
|
+
IconExternalLink,
|
|
1112
|
+
IconEye,
|
|
1113
|
+
IconEyeHidden,
|
|
1114
|
+
IconFacebook,
|
|
1333
1115
|
IconFeatureGate,
|
|
1116
|
+
IconFeedback,
|
|
1117
|
+
IconFile,
|
|
1118
|
+
IconFilter,
|
|
1119
|
+
IconFingerprint,
|
|
1120
|
+
IconFirefox,
|
|
1334
1121
|
IconFlag,
|
|
1335
1122
|
IconFlare,
|
|
1336
1123
|
IconFlask,
|
|
1124
|
+
IconFolder,
|
|
1125
|
+
IconForward,
|
|
1126
|
+
IconFullScreen,
|
|
1127
|
+
IconFunnelHorizontal,
|
|
1128
|
+
IconFunnelVertical,
|
|
1129
|
+
IconGear,
|
|
1130
|
+
IconGhost,
|
|
1337
1131
|
IconGift,
|
|
1132
|
+
IconGitlab,
|
|
1133
|
+
IconGlobe,
|
|
1134
|
+
IconGoogle,
|
|
1338
1135
|
IconGridView,
|
|
1136
|
+
IconGroupedEvents,
|
|
1137
|
+
IconGroups,
|
|
1339
1138
|
IconHandClick,
|
|
1139
|
+
IconHash,
|
|
1140
|
+
IconHeadphones,
|
|
1141
|
+
IconHeart,
|
|
1142
|
+
IconHeatmap,
|
|
1340
1143
|
IconHome,
|
|
1144
|
+
IconHomeFilled,
|
|
1145
|
+
IconHourglass,
|
|
1146
|
+
IconImage,
|
|
1147
|
+
IconInbox,
|
|
1341
1148
|
IconInfo,
|
|
1149
|
+
IconInfoFilled,
|
|
1342
1150
|
IconInsightBoard,
|
|
1151
|
+
IconItalic,
|
|
1152
|
+
IconKey,
|
|
1153
|
+
IconKeyFilled,
|
|
1154
|
+
IconLaptop,
|
|
1343
1155
|
IconLayers,
|
|
1156
|
+
IconLayout,
|
|
1157
|
+
IconLifeBuoy,
|
|
1158
|
+
IconLightBulb,
|
|
1159
|
+
IconLink,
|
|
1160
|
+
IconLinkBreak,
|
|
1161
|
+
IconLinux,
|
|
1344
1162
|
IconListView,
|
|
1163
|
+
IconLocation,
|
|
1164
|
+
IconLock,
|
|
1345
1165
|
IconLogout,
|
|
1166
|
+
IconMacOS,
|
|
1346
1167
|
IconMail,
|
|
1168
|
+
IconMap,
|
|
1169
|
+
IconMapPin,
|
|
1170
|
+
IconMaximize,
|
|
1171
|
+
IconMegaphone,
|
|
1172
|
+
IconMenu,
|
|
1173
|
+
IconMic,
|
|
1174
|
+
IconMicrosoftTeams,
|
|
1175
|
+
IconMinimize,
|
|
1176
|
+
IconMinus,
|
|
1177
|
+
IconMonitor,
|
|
1347
1178
|
IconMoon,
|
|
1179
|
+
IconMoonFilled,
|
|
1180
|
+
IconMoreHorizontal,
|
|
1181
|
+
IconMoreVertical,
|
|
1182
|
+
IconMusic,
|
|
1183
|
+
IconNavigation,
|
|
1184
|
+
IconNodeJS,
|
|
1185
|
+
IconOffline,
|
|
1348
1186
|
IconOldWindow,
|
|
1187
|
+
IconOpenInApp,
|
|
1188
|
+
IconOpenInNew,
|
|
1189
|
+
IconPalette,
|
|
1349
1190
|
IconPanelRight,
|
|
1191
|
+
IconPaperclip,
|
|
1192
|
+
IconPauseCircle,
|
|
1193
|
+
IconPeople,
|
|
1194
|
+
IconPercent,
|
|
1350
1195
|
IconPerson,
|
|
1196
|
+
IconPhone,
|
|
1197
|
+
IconPin,
|
|
1351
1198
|
IconPlayCircle,
|
|
1352
1199
|
IconPlus,
|
|
1353
1200
|
IconPremium,
|
|
1201
|
+
IconPreview,
|
|
1202
|
+
IconPrinter,
|
|
1354
1203
|
IconQueryEditor,
|
|
1355
1204
|
IconQueryStack,
|
|
1205
|
+
IconQuestionAnswer,
|
|
1356
1206
|
IconRadar,
|
|
1207
|
+
IconRadioButtonUnchecked,
|
|
1357
1208
|
IconRecording,
|
|
1209
|
+
IconRedo,
|
|
1210
|
+
IconRefresh,
|
|
1211
|
+
IconReplay,
|
|
1358
1212
|
IconReplayFrame,
|
|
1213
|
+
IconReply,
|
|
1214
|
+
IconReport,
|
|
1359
1215
|
IconRobot,
|
|
1360
1216
|
IconRocket,
|
|
1217
|
+
IconSafari,
|
|
1361
1218
|
IconSave,
|
|
1362
1219
|
IconSearch,
|
|
1220
|
+
IconSelectAll,
|
|
1363
1221
|
IconSelectEvents,
|
|
1364
1222
|
IconShoppingCart,
|
|
1223
|
+
IconSkipBackward,
|
|
1224
|
+
IconSkipEnd,
|
|
1225
|
+
IconSkipStart,
|
|
1226
|
+
IconSlack,
|
|
1227
|
+
IconSlackExternal,
|
|
1365
1228
|
IconSpinner,
|
|
1229
|
+
IconStamphog,
|
|
1366
1230
|
IconStar,
|
|
1231
|
+
IconStore,
|
|
1367
1232
|
IconSubArrowRight,
|
|
1233
|
+
IconSubtitles,
|
|
1234
|
+
IconSubtitlesOff,
|
|
1368
1235
|
IconSun,
|
|
1369
1236
|
IconSurveyCard,
|
|
1370
1237
|
IconSurveys,
|
|
1238
|
+
IconSwapHoriz,
|
|
1371
1239
|
IconSync,
|
|
1372
1240
|
IconTableChart,
|
|
1373
1241
|
IconTerminal,
|
|
1242
|
+
IconTextSize,
|
|
1374
1243
|
IconToggle,
|
|
1375
1244
|
IconTrash,
|
|
1245
|
+
IconTrendingDown,
|
|
1246
|
+
IconTrendingFlat,
|
|
1247
|
+
IconTrendingFlatDown,
|
|
1376
1248
|
IconTuning,
|
|
1249
|
+
IconUnverifiedEvent,
|
|
1377
1250
|
IconUpload,
|
|
1251
|
+
IconVerifiedEvent,
|
|
1252
|
+
IconVerticalAlignCenter,
|
|
1378
1253
|
IconVolume,
|
|
1379
1254
|
IconVolumeOff,
|
|
1255
|
+
IconWeb,
|
|
1256
|
+
IconWindows,
|
|
1380
1257
|
Indicator,
|
|
1381
1258
|
Input,
|
|
1382
|
-
|
|
1383
|
-
InsightHorizontalBarChart,
|
|
1384
|
-
InsightMiniCard,
|
|
1385
|
-
InsightPolarAreaChart,
|
|
1386
|
-
InsightShell,
|
|
1387
|
-
InsightShellHeader,
|
|
1388
|
-
InsightStackedBarChart,
|
|
1389
|
-
InsightVerticalBarChart,
|
|
1259
|
+
InputGroup,
|
|
1390
1260
|
Kbd,
|
|
1391
1261
|
Label,
|
|
1392
1262
|
Lead,
|
|
1263
|
+
Lettermark,
|
|
1264
|
+
Link,
|
|
1393
1265
|
Loader,
|
|
1266
|
+
LoadingBar,
|
|
1394
1267
|
LoadingState,
|
|
1395
|
-
|
|
1268
|
+
Menubar,
|
|
1269
|
+
Metric,
|
|
1270
|
+
MetricCard,
|
|
1396
1271
|
Modal,
|
|
1397
1272
|
Mono,
|
|
1273
|
+
NumberField,
|
|
1398
1274
|
OLD_UI_ICONS,
|
|
1399
1275
|
Overline,
|
|
1400
1276
|
P,
|
|
@@ -1402,10 +1278,16 @@ export {
|
|
|
1402
1278
|
PH_ICON_ALIASES,
|
|
1403
1279
|
Pagination,
|
|
1404
1280
|
Panel,
|
|
1281
|
+
PieChart,
|
|
1282
|
+
Popover,
|
|
1405
1283
|
Progress,
|
|
1284
|
+
ProgressCircle,
|
|
1406
1285
|
Radio,
|
|
1407
1286
|
Range,
|
|
1408
1287
|
Rating,
|
|
1288
|
+
Resizable,
|
|
1289
|
+
Row,
|
|
1290
|
+
ScrollArea,
|
|
1409
1291
|
SearchGroup,
|
|
1410
1292
|
SearchInput,
|
|
1411
1293
|
SegmentedControl,
|
|
@@ -1413,9 +1295,14 @@ export {
|
|
|
1413
1295
|
SettingsLayout,
|
|
1414
1296
|
SettingsNav,
|
|
1415
1297
|
ShowcaseWrapper,
|
|
1298
|
+
Sidebar,
|
|
1416
1299
|
Skeleton,
|
|
1417
1300
|
Small,
|
|
1301
|
+
Snack,
|
|
1418
1302
|
SortMenu,
|
|
1303
|
+
Sparkline,
|
|
1304
|
+
Spinner,
|
|
1305
|
+
Splotch,
|
|
1419
1306
|
Stat,
|
|
1420
1307
|
Stepper,
|
|
1421
1308
|
THEMES,
|
|
@@ -1423,15 +1310,22 @@ export {
|
|
|
1423
1310
|
THEME_INIT_SCRIPT,
|
|
1424
1311
|
Table,
|
|
1425
1312
|
Tabs,
|
|
1313
|
+
Tag,
|
|
1426
1314
|
Terminal,
|
|
1427
1315
|
Textarea,
|
|
1428
1316
|
ThemeDomSync,
|
|
1429
1317
|
ThemeManager,
|
|
1430
1318
|
ThemeSwitcher,
|
|
1319
|
+
TimeSeriesLineChart,
|
|
1431
1320
|
Timeline,
|
|
1432
1321
|
Toast,
|
|
1433
1322
|
ToastStack,
|
|
1434
1323
|
Toggle,
|
|
1324
|
+
ToggleButton,
|
|
1325
|
+
ToggleGroup,
|
|
1326
|
+
Tooltip,
|
|
1327
|
+
TooltipProvider,
|
|
1328
|
+
Widget,
|
|
1435
1329
|
createIconBase,
|
|
1436
1330
|
createIconBasePath,
|
|
1437
1331
|
getTheme,
|