@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.
Files changed (89) hide show
  1. package/dist/chunk-5HSOBJ4F.mjs +5968 -0
  2. package/dist/{index-D1RTT2Ap.d.mts → index-BgG8Homu.d.mts} +419 -2
  3. package/dist/{index-D1RTT2Ap.d.ts → index-BgG8Homu.d.ts} +419 -2
  4. package/dist/index.d.mts +198 -95
  5. package/dist/index.d.ts +198 -95
  6. package/dist/index.js +2995 -1136
  7. package/dist/index.mjs +629 -735
  8. package/dist/ui.d.mts +1 -1
  9. package/dist/ui.d.ts +1 -1
  10. package/dist/ui.js +1986 -156
  11. package/dist/ui.mjs +76 -3
  12. package/package.json +4 -14
  13. package/src/app/globals.css +976 -2
  14. package/src/components/charts/index.ts +9 -8
  15. package/src/components/charts/quill/BarChart.tsx +85 -0
  16. package/src/components/charts/quill/FunnelChart.tsx +49 -0
  17. package/src/components/charts/quill/InsightShell.tsx +27 -0
  18. package/src/components/charts/quill/MetricCard.tsx +44 -0
  19. package/src/components/charts/quill/PieChart.tsx +81 -0
  20. package/src/components/charts/quill/Sparkline.tsx +57 -0
  21. package/src/components/charts/quill/TimeSeriesLineChart.tsx +62 -0
  22. package/src/components/charts/quill/index.ts +9 -0
  23. package/src/components/icons/icons.tsx +2 -0
  24. package/src/components/icons/index.ts +3 -0
  25. package/src/components/icons/lemon-brand-icons.tsx +16 -0
  26. package/src/components/icons/lemon-category-icons.tsx +72 -0
  27. package/src/components/icons/lemon-icons.tsx +57 -0
  28. package/src/components/sections/IconShowcase.tsx +110 -7
  29. package/src/components/sections/NewComponentsShowcase.tsx +1052 -0
  30. package/src/components/sections/ProductLayoutsShowcase.tsx +57 -117
  31. package/src/components/sections/QuillChartShowcase.tsx +92 -0
  32. package/src/components/sections/QuillDashboardShowcase.tsx +149 -0
  33. package/src/components/sections/SidebarShowcase.tsx +152 -0
  34. package/src/components/sections/TableShowcase.tsx +2 -0
  35. package/src/components/sections/TooltipShowcase.tsx +19 -25
  36. package/src/components/ui/AlertDialog.tsx +62 -0
  37. package/src/components/ui/AppLayout.tsx +27 -0
  38. package/src/components/ui/Autocomplete.tsx +106 -0
  39. package/src/components/ui/Banner.tsx +63 -0
  40. package/src/components/ui/ButtonGroup.tsx +16 -0
  41. package/src/components/ui/Chip.tsx +46 -0
  42. package/src/components/ui/Collapsible.tsx +46 -0
  43. package/src/components/ui/Combobox.tsx +119 -0
  44. package/src/components/ui/ContextMenu.tsx +81 -0
  45. package/src/components/ui/DataTable.tsx +133 -0
  46. package/src/components/ui/DatePicker.tsx +96 -0
  47. package/src/components/ui/Dialog.tsx +75 -0
  48. package/src/components/ui/Divider.tsx +39 -0
  49. package/src/components/ui/Dot.tsx +32 -0
  50. package/src/components/ui/InputGroup.tsx +16 -0
  51. package/src/components/ui/Lettermark.tsx +47 -0
  52. package/src/components/ui/Link.tsx +32 -0
  53. package/src/components/ui/LoadingBar.tsx +25 -0
  54. package/src/components/ui/Menubar.tsx +66 -0
  55. package/src/components/ui/Metric.tsx +34 -0
  56. package/src/components/ui/NumberField.tsx +76 -0
  57. package/src/components/ui/Popover.tsx +73 -0
  58. package/src/components/ui/ProgressCircle.tsx +63 -0
  59. package/src/components/ui/Resizable.tsx +71 -0
  60. package/src/components/ui/Row.tsx +51 -0
  61. package/src/components/ui/ScrollArea.tsx +54 -0
  62. package/src/components/ui/Sidebar.tsx +77 -0
  63. package/src/components/ui/Snack.tsx +48 -0
  64. package/src/components/ui/Spinner.tsx +30 -0
  65. package/src/components/ui/Splotch.tsx +33 -0
  66. package/src/components/ui/Table.tsx +2 -0
  67. package/src/components/ui/Tag.tsx +65 -0
  68. package/src/components/ui/Toggle.tsx +62 -0
  69. package/src/components/ui/Tooltip.test.tsx +58 -0
  70. package/src/components/ui/Tooltip.tsx +211 -0
  71. package/src/components/ui/Widget.tsx +31 -0
  72. package/src/components/ui/index.ts +275 -21
  73. package/dist/chunk-FDMD3IIN.mjs +0 -3831
  74. package/src/components/charts/ph-insight-charts.tsx +0 -162
  75. package/src/components/dashboard/DashboardFiltersBar.tsx +0 -19
  76. package/src/components/dashboard/DashboardGrid.tsx +0 -23
  77. package/src/components/dashboard/DashboardInsightPlaceholder.tsx +0 -37
  78. package/src/components/dashboard/DashboardKpiCard.tsx +0 -25
  79. package/src/components/dashboard/DashboardToolbar.tsx +0 -23
  80. package/src/components/dashboard/DashboardWell.tsx +0 -10
  81. package/src/components/dashboard/InsightMiniCard.tsx +0 -26
  82. package/src/components/dashboard/InsightShell.tsx +0 -37
  83. package/src/components/dashboard/InsightShellHeader.tsx +0 -22
  84. package/src/components/dashboard/MiniTrendBars.tsx +0 -51
  85. package/src/components/dashboard/index.ts +0 -31
  86. package/src/components/dashboard/types.ts +0 -9
  87. package/src/components/sections/ChartShowcase.tsx +0 -190
  88. package/src/components/sections/DashboardShowcase.tsx +0 -191
  89. 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-FDMD3IIN.mjs";
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/ph-insight-charts.tsx
183
- import { useEffect as useEffect3, useMemo as useMemo2, useState as useState3 } from "react";
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 as useEffect2, useMemo, useRef as useRef2, useState as useState2 } from "react";
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 = useRef2(null);
691
- const canvasRef = useRef2(null);
692
- const [size, setSize] = useState2({ width: 0, height: 0 });
693
- const [hoverIndex, setHoverIndex] = useState2(null);
694
- useEffect2(() => {
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
- useEffect2(() => {
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/components/charts/ph-insight-charts.tsx
966
- import { jsx as jsx2 } from "react/jsx-runtime";
967
- var DEMO_LABELS = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"];
968
- function useClientMounted() {
969
- const [mounted, setMounted] = useState3(false);
970
- useEffect3(() => setMounted(true), []);
971
- return mounted;
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
- function ChartSkeleton({ className = "h-[280px]" }) {
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: `w-full animate-pulse rounded-lemon bg-ph-muted ${className}`,
978
- "aria-hidden": true
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
- function HogTrendLineChart() {
983
- const mounted = useClientMounted();
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 theme = useMemo2(() => buildHogChartTheme(tokens), [tokens]);
986
- const series = useMemo2(
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
- key: "pageview",
990
- label: "$pageview",
991
- data: [4200, 5100, 4800, 6200, 5900, 3100, 2800],
992
- color: tokens.series[0],
993
- fill: { opacity: 0.35 }
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
- key: "signup",
997
- label: "signup_completed",
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/dashboard/DashboardWell.tsx
1067
- import { jsx as jsx3 } from "react/jsx-runtime";
1068
- function DashboardWell(_a) {
1069
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
1070
- return /* @__PURE__ */ jsx3("div", __spreadValues({ className: cn("ph-dashboard-well", className) }, props));
1071
- }
1072
-
1073
- // src/components/dashboard/DashboardToolbar.tsx
1074
- import { jsx as jsx4, jsxs as jsxs2 } from "react/jsx-runtime";
1075
- function DashboardToolbar({ title, description, actions, className }) {
1076
- return /* @__PURE__ */ jsxs2("div", { className: cn("flex flex-wrap items-baseline justify-between gap-4", className), children: [
1077
- /* @__PURE__ */ jsxs2("div", { className: "min-w-0", children: [
1078
- /* @__PURE__ */ jsx4("h3", { className: "text-lg font-bold text-ph-ink", children: title }),
1079
- description ? /* @__PURE__ */ jsx4("p", { className: "mt-0.5 text-sm text-ph-mutedtext", children: description }) : null
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
- actions != null ? /* @__PURE__ */ jsx4("div", { className: "flex shrink-0 flex-wrap items-center gap-2", children: actions }) : null
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/dashboard/DashboardGrid.tsx
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
- var presetClass = {
1088
- insights: "grid gap-4 md:grid-cols-2 xl:grid-cols-3",
1089
- dense: "grid gap-3 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4"
1090
- };
1091
- function DashboardGrid(_a) {
1092
- var _b = _a, {
1093
- preset = "insights",
1094
- className
1095
- } = _b, props = __objRest(_b, [
1096
- "preset",
1097
- "className"
1098
- ]);
1099
- return /* @__PURE__ */ jsx5("div", __spreadValues({ className: cn(presetClass[preset], className) }, props));
1100
- }
1101
-
1102
- // src/components/dashboard/DashboardFiltersBar.tsx
1103
- import { jsx as jsx6 } from "react/jsx-runtime";
1104
- function DashboardFiltersBar(_a) {
1105
- var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
1106
- return /* @__PURE__ */ jsx6(
1107
- "div",
1108
- __spreadValues({
1109
- className: cn(
1110
- "flex flex-wrap items-center gap-2 rounded-[var(--ph-radius-app)] border border-solid bg-ph-surface px-3 py-2 text-sm text-ph-subtle [border-color:var(--ph-border-control)]",
1111
- "[box-shadow:var(--ph-chrome-inset-face-top),var(--ph-chrome-inset-face-bottom),var(--ph-shadow-elevation-3000)]",
1112
- className
1113
- )
1114
- }, props)
1115
- );
1116
- }
1117
-
1118
- // src/components/dashboard/DashboardKpiCard.tsx
1119
- import { jsx as jsx7, jsxs as jsxs3 } from "react/jsx-runtime";
1120
- function DashboardKpiCard(_a) {
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/dashboard/InsightShell.tsx
1162
- import { jsx as jsx9, jsxs as jsxs4 } from "react/jsx-runtime";
1163
- function InsightShell(_a) {
1164
- var _b = _a, {
1165
- ribbonColour,
1166
- bodyClassName,
1167
- className,
1168
- children
1169
- } = _b, props = __objRest(_b, [
1170
- "ribbonColour",
1171
- "bodyClassName",
1172
- "className",
1173
- "children"
1174
- ]);
1175
- const ribbon = ribbonColour != null && String(ribbonColour).trim() !== "" ? String(ribbonColour).trim() : null;
1176
- return /* @__PURE__ */ jsxs4("article", __spreadProps(__spreadValues({ className: cn("ph-insight-shell flex-row", className) }, props), { children: [
1177
- ribbon != null ? /* @__PURE__ */ jsx9(
1178
- "div",
1179
- {
1180
- className: "ph-insight-shell__ribbon min-h-[7rem] shrink-0 self-stretch",
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
- actions != null ? /* @__PURE__ */ jsx10("div", { className: "flex shrink-0 items-center gap-1", children: actions }) : null
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/dashboard/MiniTrendBars.tsx
1202
- import { jsx as jsx11 } from "react/jsx-runtime";
1203
- var DEFAULT_SERIES_CYCLE = [1, 2, 3, 4, 5, 6, 7];
1204
- function clampPct(n) {
1205
- if (!Number.isFinite(n)) {
1206
- return 0;
1207
- }
1208
- return Math.max(0, Math.min(100, n));
1209
- }
1210
- function MiniTrendBars({
1211
- heights,
1212
- rowClassName = "h-28",
1213
- seriesResolver,
1214
- className
1215
- }) {
1216
- const resolveSeries = seriesResolver != null ? seriesResolver : ((i) => {
1217
- var _a;
1218
- return (_a = DEFAULT_SERIES_CYCLE[i % DEFAULT_SERIES_CYCLE.length]) != null ? _a : 1;
1219
- });
1220
- return /* @__PURE__ */ jsx11("div", { className: cn("flex items-end gap-0.5", rowClassName, className), children: heights.map((raw, i) => {
1221
- const pct = clampPct(raw);
1222
- const series = resolveSeries(i, pct);
1223
- const style = {
1224
- height: `${pct}%`,
1225
- background: `var(--ph-data-${String(series)})`,
1226
- minHeight: pct > 0 ? 4 : 0
1227
- };
1228
- return /* @__PURE__ */ jsx11("div", { className: "min-h-0 flex-1 rounded-t-[3px]", style }, `bar-${String(i)}`);
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
- DashboardFiltersBar,
1275
- DashboardGrid,
1276
- DashboardInsightPlaceholder,
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
- InsightDoughnutChart,
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
- MiniTrendBars,
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,