[] = [
if (row.original.category === 'console') {
const { message } = row.original;
return (
-
+
{message}
);
@@ -323,14 +312,14 @@ export const breadcrumbColumns: ColumnDef[] = [
return {row.original.message}
;
}
- return Empty;
+ return Empty;
},
},
{
header: 'Timestamp',
size: 220,
cell: ({ row }) => (
-
+
),
@@ -371,7 +360,7 @@ export const headerColumns: ColumnDef<[string, string]>[] = [
header: 'Header',
size: 260,
cell: ({ row }) => (
-
+
{row.original[0]}
),
@@ -395,9 +384,7 @@ export const networkColumns: ColumnDef<{
accessorKey: 'label',
header: 'Label',
size: 260,
- cell: ({ row }) => (
-
{row.original.label}
- ),
+ cell: ({ row }) =>
{row.original.label},
},
{
size: UNDEFINED_WIDTH,
@@ -475,9 +462,9 @@ export const NetworkBody = ({
)}
) : body === '' ? (
-
{emptyMessage}
+
{emptyMessage}
) : (
-
{notCollectedMessage}
+
{notCollectedMessage}
)}
>
);
@@ -486,10 +473,6 @@ export const NetworkBody = ({
/**
* Keyboard shortcuts
*/
-export const Kbd = ({ children }: { children: string }) => (
-
{children}
-);
-
export const LogSidePanelKbdShortcuts = () => {
const [isDismissed, setDismissed] = useLocalStorage
(
'kbd-shortcuts-dismissed',
@@ -509,8 +492,8 @@ export const LogSidePanelKbdShortcuts = () => {
- Use ←
- → arrow keys or k
+ Use ←
+ → arrow keys or k
j to move through events
@@ -518,11 +501,7 @@ export const LogSidePanelKbdShortcuts = () => {
ESC to close
-
+
);
@@ -546,7 +525,7 @@ export const SourceMapsFtux = () => {
mt="xs"
onClose={() => setIsDismissed(true)}
>
-
+
Some of the stack frames are pointing to
minified files. Use hyperdx-cli to upload your source maps and see the
original code.
diff --git a/packages/app/src/Logo.tsx b/packages/app/src/Logo.tsx
index 181fd7662..ed2e755f5 100644
--- a/packages/app/src/Logo.tsx
+++ b/packages/app/src/Logo.tsx
@@ -31,16 +31,13 @@ export default function Logo({
};
return (
-
+
diff --git a/packages/app/src/NamespaceDetailsSidePanel.tsx b/packages/app/src/NamespaceDetailsSidePanel.tsx
index f414309ec..4ca8cc16e 100644
--- a/packages/app/src/NamespaceDetailsSidePanel.tsx
+++ b/packages/app/src/NamespaceDetailsSidePanel.tsx
@@ -43,12 +43,10 @@ const PodDetailsProperty = React.memo(
if (!value) return null;
return (
-
+
{label}
-
- {value}
-
+ {value}
);
},
diff --git a/packages/app/src/NavHoverDropdown.tsx b/packages/app/src/NavHoverDropdown.tsx
deleted file mode 100644
index 57856d760..000000000
--- a/packages/app/src/NavHoverDropdown.tsx
+++ /dev/null
@@ -1,17 +0,0 @@
-import { useState } from 'react';
-import { NavDropdown } from 'react-bootstrap';
-
-export default function NavHoverDropdown(
- props: React.ComponentProps
,
-) {
- const [show, setShow] = useState(false);
- return (
- setShow(v => !v)}
- onMouseEnter={() => setShow(true)}
- onMouseLeave={() => setShow(false)}
- />
- );
-}
diff --git a/packages/app/src/NodeDetailsSidePanel.tsx b/packages/app/src/NodeDetailsSidePanel.tsx
index f45c28e57..56d14353b 100644
--- a/packages/app/src/NodeDetailsSidePanel.tsx
+++ b/packages/app/src/NodeDetailsSidePanel.tsx
@@ -47,12 +47,10 @@ const PodDetailsProperty = React.memo(
if (!value) return null;
return (
-
+
{label}
-
- {value}
-
+ {value}
);
},
diff --git a/packages/app/src/OnboardingChecklist.tsx b/packages/app/src/OnboardingChecklist.tsx
index a805664f1..9d46f744d 100644
--- a/packages/app/src/OnboardingChecklist.tsx
+++ b/packages/app/src/OnboardingChecklist.tsx
@@ -146,19 +146,10 @@ const OnboardingChecklist = ({
}
return (
-
+
-
+
Get Started
setIsCollapsed(!isCollapsed)}
>
@@ -195,14 +186,14 @@ const OnboardingChecklist = ({
alignItems: 'center',
justifyContent: 'center',
border: step.isComplete
- ? '1px solid var(--mantine-color-green-6)'
- : 'none',
+ ? '1px solid var(--color-text-success)'
+ : '1px solid var(--color-border)',
backgroundColor: step.isComplete
? 'transparent'
- : 'var(--mantine-color-dark-5)',
+ : 'var(--color-bg-muted)',
color: step.isComplete
- ? 'var(--mantine-color-green-6)'
- : 'var(--mantine-color-gray-5)',
+ ? 'var(--color-text-success)'
+ : 'var(--color-text)',
flexShrink: 0,
}}
>
@@ -228,7 +219,6 @@ const OnboardingChecklist = ({
{step.title}
-
+
{step.description}
@@ -246,7 +236,7 @@ const OnboardingChecklist = ({
className="bi bi-arrow-right"
style={{
fontSize: 12,
- color: 'var(--mantine-color-gray-5)',
+ color: 'var(--color-text-muted)',
}}
/>
)}
@@ -267,7 +257,7 @@ const OnboardingChecklist = ({
borderRadius: 6,
cursor: 'pointer',
':hover': {
- backgroundColor: 'var(--mantine-color-dark-7)',
+ backgroundColor: 'var(--color-bg-muted)',
},
}}
>
@@ -288,7 +278,7 @@ const OnboardingChecklist = ({
borderRadius: 6,
cursor: 'pointer',
':hover': {
- backgroundColor: 'var(--mantine-color-dark-7)',
+ backgroundColor: 'var(--color-bg-hover)',
},
}}
>
diff --git a/packages/app/src/PlaybarSlider.tsx b/packages/app/src/PlaybarSlider.tsx
index 950324ad6..9fd01f558 100644
--- a/packages/app/src/PlaybarSlider.tsx
+++ b/packages/app/src/PlaybarSlider.tsx
@@ -61,10 +61,10 @@ export const PlaybarSlider = ({
className={styles.markerDot}
style={{
backgroundColor: mark.isSuccess
- ? 'var(--mantine-color-green-6)'
+ ? 'var(--color-text-success)'
: mark.isError
- ? 'var(--mantine-color-red-6)'
- : 'var(--mantine-color-gray-6)',
+ ? 'var(--color-text-danger)'
+ : 'var(--color-text-muted)',
left: `${((mark.ts - min) / (max - min)) * 100}%`,
}}
onClick={() => onChange(mark.ts)}
@@ -87,7 +87,7 @@ export const PlaybarSlider = ({
{markersContent}
-
+
{label}
-
- {value}
-
+ {value}
);
},
diff --git a/packages/app/src/SearchInputV2.tsx b/packages/app/src/SearchInputV2.tsx
index e338c25d7..3fc1e99f4 100644
--- a/packages/app/src/SearchInputV2.tsx
+++ b/packages/app/src/SearchInputV2.tsx
@@ -118,7 +118,7 @@ export default function SearchInputV2({
Full Text:
{
const newValue =
@@ -133,7 +133,7 @@ export default function SearchInputV2({
Substring:
{
const newValue =
@@ -148,7 +148,7 @@ export default function SearchInputV2({
Exact:
{
const newValue =
@@ -163,7 +163,7 @@ export default function SearchInputV2({
Not:
{
const newValue =
@@ -178,7 +178,7 @@ export default function SearchInputV2({
Existence:
{
const newValue =
@@ -193,7 +193,7 @@ export default function SearchInputV2({
Boolean:
{
const newValue =
diff --git a/packages/app/src/ServicesDashboardPage.tsx b/packages/app/src/ServicesDashboardPage.tsx
index 8bc3a665a..8ded5055f 100644
--- a/packages/app/src/ServicesDashboardPage.tsx
+++ b/packages/app/src/ServicesDashboardPage.tsx
@@ -24,6 +24,7 @@ import {
Text,
Tooltip,
} from '@mantine/core';
+import { IconPlayerPlay } from '@tabler/icons-react';
import {
ERROR_RATE_PERCENTAGE_NUMBER_FORMAT,
@@ -174,14 +175,12 @@ export function EndpointLatencyChart({
return (
-
- Request Latency
-
+ Request Latency
-
+
{event.formattedTimestamp}
diff --git a/packages/app/src/SessionSidePanel.tsx b/packages/app/src/SessionSidePanel.tsx
index 710242075..9b85871ff 100644
--- a/packages/app/src/SessionSidePanel.tsx
+++ b/packages/app/src/SessionSidePanel.tsx
@@ -1,5 +1,4 @@
import { useState } from 'react';
-import { Button } from 'react-bootstrap';
import CopyToClipboard from 'react-copy-to-clipboard';
import { useHotkeys } from 'react-hotkeys-hook';
import {
@@ -8,6 +7,7 @@ import {
SearchConditionLanguage,
TSource,
} from '@hyperdx/common-utils/dist/types';
+import { Button } from '@mantine/core';
import { Drawer } from '@mantine/core';
import { notifications } from '@mantine/notifications';
@@ -85,11 +85,10 @@ export default function SessionSidePanel({
styles={{
body: {
padding: 0,
- background: '#0F1216',
height: '100vh',
},
}}
- className="border-start border-dark"
+ className="border-start"
>
@@ -111,7 +110,7 @@ export default function SessionSidePanel({
{session?.sessionCount} Events
-
+
{
@@ -122,19 +121,19 @@ export default function SessionSidePanel({
}}
>
}
+ style={{ fontSize: '12px' }}
>
-
Share Session
diff --git a/packages/app/src/SessionSubpanel.tsx b/packages/app/src/SessionSubpanel.tsx
index 5cb51a7e7..a38ba6126 100644
--- a/packages/app/src/SessionSubpanel.tsx
+++ b/packages/app/src/SessionSubpanel.tsx
@@ -610,7 +610,7 @@ export default function SessionSubpanel({
{showRelativeTime ? (
<>
{formatmmss((focus?.ts ?? 0) - minTs)}
-
+
{' / '}
{formatmmss(maxTs - minTs)}
@@ -625,7 +625,7 @@ export default function SessionSubpanel({
-
+
{email || `Anonymous Session ${sessionId}`}
@@ -491,7 +491,7 @@ export default function SessionsPage() {
}}
/>
-
+
@@ -510,7 +510,7 @@ export default function SessionsPage() {
<>
{sessionSource && sessionSource.kind !== SourceKind.Session && (
}
+ icon={
}
color="gray"
py="xs"
mt="md"
@@ -544,7 +544,7 @@ function SessionSetupInstructions() {
return (
<>
-
+
Instructions
diff --git a/packages/app/src/TabItem.tsx b/packages/app/src/TabItem.tsx
index 1a8da8641..1863bead1 100644
--- a/packages/app/src/TabItem.tsx
+++ b/packages/app/src/TabItem.tsx
@@ -23,11 +23,13 @@ export default function TabItem({
{...props}
>
{children}
-
+
diff --git a/packages/app/src/TeamPage.tsx b/packages/app/src/TeamPage.tsx
index b4f64b289..f4f461c20 100644
--- a/packages/app/src/TeamPage.tsx
+++ b/packages/app/src/TeamPage.tsx
@@ -1,7 +1,6 @@
import { Fragment, useCallback, useMemo, useState } from 'react';
import Head from 'next/head';
import { HTTPError } from 'ky';
-import { Button as BSButton, Modal as BSModal } from 'react-bootstrap';
import { CopyToClipboard } from 'react-copy-to-clipboard';
import { SubmitHandler, useForm } from 'react-hook-form';
import { DEFAULT_METADATA_MAX_ROWS_TO_READ } from '@hyperdx/common-utils/dist/core/metadata';
@@ -18,7 +17,7 @@ import {
Group,
InputLabel,
Loader,
- Modal as MModal,
+ Modal,
Stack,
Table,
Text,
@@ -72,7 +71,7 @@ function InviteTeamMemberForm({
placeholder="you@company.com"
withAsterisk={false}
/>
-
+
The invite link will automatically expire after 30 days.
@@ -93,11 +92,9 @@ function ConnectionsSection() {
return (
-
- Connections
-
+ Connections
-
+
{connections?.map(c => (
@@ -119,7 +116,6 @@ function ConnectionsSection() {
{editedConnectionId !== c.id && (
setEditedConnectionId(c.id)}
size="sm"
>
@@ -129,7 +125,6 @@ function ConnectionsSection() {
{editedConnectionId === c.id && (
setEditedConnectionId(null)}
size="sm"
>
@@ -156,7 +151,6 @@ function ConnectionsSection() {
(IS_LOCAL_MODE ? (connections?.length ?? 0) < 1 : true) && (
setIsCreatingConnection(true)}
>
Add Connection
@@ -193,11 +187,9 @@ function SourcesSection() {
return (
-
- Sources
-
+ Sources
-
+
{sources?.map(s => (
<>
@@ -227,7 +219,6 @@ function SourcesSection() {
{editedSourceId !== s.id && (
setEditedSourceId(s.id)}
size="sm"
>
@@ -237,7 +228,6 @@ function SourcesSection() {
{editedSourceId === s.id && (
setEditedSourceId(null)}
size="sm"
>
@@ -264,11 +254,7 @@ function SourcesSection() {
/>
)}
{!IS_LOCAL_MODE && !isCreatingSource && (
- setIsCreatingSource(true)}
- color="gray.4"
- >
+ setIsCreatingSource(true)}>
Add Source
)}
@@ -467,15 +453,13 @@ function TeamMembersSection() {
return (
-
- Team
-
+ Team
- Team Members
+ Team Members
}
@@ -506,7 +490,7 @@ function TeamMembersSection() {
{member.email}
{member.hasPasswordAuth && (
-
+
Password Auth
)}
@@ -566,7 +550,7 @@ function TeamMembersSection() {
-
+
Pending Invite
@@ -602,7 +586,7 @@ function TeamMembersSection() {
- setTeamInviteModalShow(false)}
opened={teamInviteModalShow}
@@ -612,58 +596,56 @@ function TeamMembersSection() {
onSubmit={onSubmitTeamInviteForm}
isSubmitting={saveTeamInvitation.isPending}
/>
-
+
-
+ onClose={() =>
setDeleteTeamMemberConfirmationModalData({
mode: null,
id: null,
email: null,
})
}
- show={deleteTeamMemberConfirmationModalData.id != null}
+ opened={deleteTeamMemberConfirmationModalData.id != null}
size="lg"
+ title="Delete Team Member"
>
-
- Delete Team Member
-
+
+
Deleting this team member (
{deleteTeamMemberConfirmationModalData.email}) will revoke their
access to the team's resources and services. This action is not
reversible.
-
-
- setDeleteTeamMemberConfirmationModalData({
- mode: null,
- id: null,
- email: null,
- })
- }
- >
- Cancel
-
-
- deleteTeamMemberConfirmationModalData.id &&
- onConfirmDeleteTeamMember(
- deleteTeamMemberConfirmationModalData.id,
- )
- }
- >
- Confirm
-
-
-
+
+
+
+ setDeleteTeamMemberConfirmationModalData({
+ mode: null,
+ id: null,
+ email: null,
+ })
+ }
+ >
+ Cancel
+
+
+ deleteTeamMemberConfirmationModalData.id &&
+ onConfirmDeleteTeamMember(
+ deleteTeamMemberConfirmationModalData.id,
+ )
+ }
+ >
+ Confirm
+
+
+
+
);
}
@@ -741,11 +723,9 @@ function IntegrationsSection() {
return (
-
- Integrations
-
+ Integrations
-
+
Webhooks
@@ -770,7 +750,6 @@ function IntegrationsSection() {
<>
setEditedWebhookId(webhook._id)}
size="compact-xs"
leftSection={}
@@ -787,7 +766,6 @@ function IntegrationsSection() {
{editedWebhookId === webhook._id && (
setEditedWebhookId(null)}
size="compact-xs"
>
@@ -812,7 +790,7 @@ function IntegrationsSection() {
{!isAddWebhookModalOpen ? (
-
+
Add Webhook
) : (
@@ -866,11 +844,9 @@ function TeamNameSection() {
);
return (
-
- Team Name
-
+ Team Name
-
+
{isEditingTeamName ? (
) : (
- {team.name}
+ {team.name}
{hasAdminAccess && (
}
+ leftSection={}
onClick={() => {
setIsEditingTeamName(true);
}}
@@ -1022,12 +998,10 @@ function ClickhouseSettingForm({
return (
-
- {label}
-
+ {label}
{tooltip && (
-
+
@@ -1113,7 +1087,7 @@ function ClickhouseSettingForm({
}
+ leftSection={}
onClick={() => setIsEditing(true)}
>
Change
@@ -1136,11 +1110,9 @@ function TeamQueryConfigSection() {
return (
-
- ClickHouse Client Settings
-
+ ClickHouse Client Settings
-
+
+
{copied ? (
) : (
@@ -1254,14 +1226,10 @@ function ApiKeysSection() {
return (
-
- API Keys
-
+ API Keys
-
-
- Ingestion API Key
-
+
+ Ingestion API Key
{team?.apiKey && (
@@ -1276,7 +1244,7 @@ function ApiKeysSection() {
)}
- setRotateApiKeyConfirmationModalShow(false)}
@@ -1288,15 +1256,14 @@ function ApiKeysSection() {
}
>
-
+
Rotating the API key will invalidate your existing API key and
generate a new one for you. This action is not reversible.
setRotateApiKeyConfirmationModalShow(false)}
@@ -1305,7 +1272,7 @@ function ApiKeysSection() {
-
-
+
+
{!isLoadingMe && me != null && (
-
+
-
- Personal API Access Key
-
+ Personal API Access Key
diff --git a/packages/app/src/ThemeWrapper.tsx b/packages/app/src/ThemeWrapper.tsx
index 0a700b02f..b1d1c1fed 100644
--- a/packages/app/src/ThemeWrapper.tsx
+++ b/packages/app/src/ThemeWrapper.tsx
@@ -1,10 +1,13 @@
import React from 'react';
import {
+ ActionIcon,
Button,
MantineProvider,
+ MantineTheme,
MantineThemeOverride,
rem,
Select,
+ Text,
} from '@mantine/core';
import { Notifications } from '@mantine/notifications';
@@ -13,11 +16,11 @@ const makeTheme = ({
}: {
fontFamily?: string;
}): MantineThemeOverride => ({
- defaultRadius: 'xs',
cursorType: 'pointer',
fontFamily,
primaryColor: 'green',
primaryShade: 8,
+ autoContrast: true,
white: '#fff',
fontSizes: {
xxs: '11px',
@@ -37,18 +40,18 @@ const makeTheme = ({
xl: 'calc(2rem * var(--mantine-scale))',
},
colors: {
- // https://mantine.dev/colors-generator/?color=09D99C
+ // https://uicolors.app/generate/00c28a
green: [
- '#e2fff8',
- '#cefef0',
- '#a0fbe0',
- '#6df9cf',
- '#09D99C', // Toned Down
- '#2ff5b8',
- '#1ef5b3',
- '#09da9d',
+ '#eafff6',
+ '#cdfee7',
+ '#a0fad5',
+ '#63f2bf',
+ '#25e2a5',
'#00c28a',
- '#00a875',
+ '#00a475',
+ '#008362',
+ '#00674e',
+ '#005542',
],
// https://mantine.dev/colors-generator/?color=A1A1AA
// Customized with FAFAFA, D7D8DB, A1A1AA
@@ -75,7 +78,6 @@ const makeTheme = ({
'#1A1B1E',
'#141517',
'#101113',
- '#14171b',
],
},
headings: {
@@ -104,24 +106,99 @@ const makeTheme = ({
Select: Select.extend({
styles: {
input: {
- border: '1px solid var(--mantine-color-gray-7)',
+ border: '1px solid var(--color-border)',
},
},
}),
Input: {
styles: {
input: {
- border: '1px solid var(--mantine-color-gray-7)',
+ backgroundColor: 'var(--color-bg-field)',
+ border: '1px solid var(--color-border)',
},
},
},
Card: {
+ styles: (_theme: MantineTheme, props: { variant?: string }) => {
+ if (props.variant === 'muted') {
+ return {
+ root: {
+ backgroundColor: 'var(--color-bg-muted)',
+ border: '1px solid var(--color-border)',
+ },
+ };
+ }
+ return {
+ root: {
+ backgroundColor: 'var(--color-bg-body)',
+ },
+ };
+ },
+ },
+ Divider: {
styles: {
root: {
- backgroundColor: '#191B1F',
+ borderColor: 'var(--color-border)',
+ borderTopColor: 'var(--color-border)',
+ '--divider-color': 'var(--color-border)',
+ '--item-border-color': 'var(--color-border)',
},
},
},
+ Accordion: {
+ styles: {
+ control: {
+ '--item-border-color': 'var(--color-border)',
+ },
+ item: {
+ borderColor: 'var(--color-border)',
+ },
+ },
+ },
+ UnstyledButton: {
+ styles: {
+ root: {
+ '--item-border-color': 'var(--color-border)',
+ },
+ },
+ },
+ Paper: {
+ classNames: (_theme: MantineTheme, props: { variant?: string }) => {
+ if (props.variant === 'muted') {
+ return {
+ root: 'paper-muted',
+ };
+ }
+ return {};
+ },
+ styles: (_theme: MantineTheme, props: { variant?: string }) => {
+ if (props.variant === 'muted') {
+ return {
+ root: {
+ backgroundColor: 'var(--color-bg-muted)',
+ border: '1px solid var(--color-border)',
+ },
+ };
+ }
+ return {
+ root: {
+ border: '1px solid var(--color-border)',
+ },
+ };
+ },
+ },
+ Text: Text.extend({
+ styles: (theme, props) => {
+ if (props.variant === 'danger') {
+ return {
+ root: {
+ color: 'var(--color-text-danger)',
+ },
+ };
+ }
+ return {};
+ },
+ }),
Button: Button.extend({
vars: (theme, props) => {
if (props.size === 'xxs') {
@@ -137,20 +214,64 @@ const makeTheme = ({
return { root: {} };
},
}),
+ ActionIcon: ActionIcon.extend({
+ defaultProps: {
+ variant: 'subtle',
+ color: 'gray',
+ },
+ styles: (theme, props) => {
+ // Subtle variant stays transparent
+ if (props.variant === 'subtle') {
+ return {
+ root: {
+ backgroundColor: 'transparent',
+ color: 'var(--color-text)',
+ '&:hover': {
+ backgroundColor: 'var(--color-bg-hover)',
+ },
+ '&:active': {
+ backgroundColor: 'var(--color-bg-muted)',
+ },
+ },
+ };
+ }
+
+ // Default variant
+ if (props.variant === 'default') {
+ return {
+ root: {
+ backgroundColor: 'var(--color-bg-hover)',
+ color: 'var(--color-text)',
+ border: 'none',
+ '&:hover': {
+ backgroundColor: 'var(--color-bg-muted)',
+ },
+ '&:active': {
+ backgroundColor: 'var(--color-bg-muted)',
+ },
+ },
+ };
+ }
+
+ return {};
+ },
+ }),
},
});
export const ThemeWrapper = ({
fontFamily,
+ colorScheme = 'dark',
children,
}: {
fontFamily?: string;
+ colorScheme?: 'dark' | 'light';
children: React.ReactNode;
}) => {
const theme = React.useMemo(() => makeTheme({ fontFamily }), [fontFamily]);
return (
-
+
{children}
diff --git a/packages/app/src/TimelineChart.tsx b/packages/app/src/TimelineChart.tsx
index 9884f56fb..6434a8cfa 100644
--- a/packages/app/src/TimelineChart.tsx
+++ b/packages/app/src/TimelineChart.tsx
@@ -2,6 +2,7 @@ import { memo, RefObject, useEffect, useMemo, useRef, useState } from 'react';
import cx from 'classnames';
import { Tooltip } from '@mantine/core';
import { useVirtualizer } from '@tanstack/react-virtual';
+import { color } from '@uiw/react-codemirror';
import useResizable from './hooks/useResizable';
import { useDrag, usePrevious } from './utils';
@@ -165,12 +166,10 @@ function TimelineXAxis({
width: 1,
marginRight: -1,
marginLeft: i === 0 ? 0 : `${percSpacing.toFixed(6)}%`,
- background: 'rgba(255, 255, 255, 0.08)',
+ background: 'var(--color-bg-surface)',
}}
>
-
- {renderMs(i * interval)}
-
+ {renderMs(i * interval)}
,
);
}
@@ -338,6 +337,7 @@ type Row = {
style?: any;
type?: string;
className?: string;
+ isActive?: boolean;
};
export default function TimelineChart({
@@ -560,6 +560,7 @@ export default function TimelineChart({
'd-flex align-items-center overflow-hidden',
row.className,
styles.timelineRow,
+ row.isActive && styles.timelineRowActive,
)}`}
style={{
// position: 'absolute',
@@ -582,7 +583,7 @@ export default function TimelineChart({
{label}
{description && (
-
+
{description}
)}
@@ -87,7 +87,7 @@ export const UserPreferencesModal = ({
title={
<>
Preferences
-
+
Customize your experience
>
diff --git a/packages/app/src/components/ChartBox.tsx b/packages/app/src/components/ChartBox.tsx
index e5345dd7c..bb1cd6f8d 100644
--- a/packages/app/src/components/ChartBox.tsx
+++ b/packages/app/src/components/ChartBox.tsx
@@ -15,9 +15,9 @@ export function ChartBox({
width: '100%',
display: 'flex',
flexDirection: 'column',
- background:
- 'linear-gradient(180deg, rgba(250,250,250,0.018) 0%, rgba(250,250,250,0.008) 100%)',
- borderRadius: 2,
+ background: 'var(--color-bg-body)',
+ borderRadius: 'var(--mantine-radius-sm)',
+ border: '1px solid var(--color-border)',
...style,
}}
>
diff --git a/packages/app/src/components/ChartSQLPreview.tsx b/packages/app/src/components/ChartSQLPreview.tsx
index d3b00d671..c128a312b 100644
--- a/packages/app/src/components/ChartSQLPreview.tsx
+++ b/packages/app/src/components/ChartSQLPreview.tsx
@@ -4,6 +4,7 @@ import { sql } from '@codemirror/lang-sql';
import { format } from '@hyperdx/common-utils/dist/sqlFormatter';
import { ChartConfigWithDateRange } from '@hyperdx/common-utils/dist/types';
import { Button, Paper } from '@mantine/core';
+import { IconCheck, IconCopy } from '@tabler/icons-react';
import CodeMirror from '@uiw/react-codemirror';
import { useRenderedSqlChartConfig } from '@/hooks/useChartConfig';
@@ -19,20 +20,29 @@ function tryFormat(data?: string) {
}
}
-function CopyButton({ text = '' }: { text?: string }) {
+function CopyButton({
+ text = '',
+ size = 'md',
+}: {
+ text?: string;
+ size?: 'xs' | 'md';
+}) {
const [copied, setCopied] = useState(false);
+ const iconSize = size === 'xs' ? 14 : 16;
+ const buttonSize = size === 'xs' ? 'compact-xs' : 'sm';
+
return (
setCopied(true)}>
{copied ? (
-
+
) : (
-
+
)}
{copied ? 'Copied!' : 'Copy'}
@@ -44,10 +54,12 @@ export function SQLPreview({
data,
formatData = true,
enableCopy = false,
+ copyButtonSize = 'md',
}: {
data?: string;
formatData?: boolean;
enableCopy?: boolean;
+ copyButtonSize?: 'xs' | 'md';
}) {
const displayed = formatData ? tryFormat(data) : data;
@@ -66,7 +78,7 @@ export function SQLPreview({
extensions={[sql()]}
editable={false}
/>
- {enableCopy && }
+ {enableCopy && }
);
}
diff --git a/packages/app/src/components/ColorSwatchInput.tsx b/packages/app/src/components/ColorSwatchInput.tsx
index d52e7751f..83e0aca20 100644
--- a/packages/app/src/components/ColorSwatchInput.tsx
+++ b/packages/app/src/components/ColorSwatchInput.tsx
@@ -52,20 +52,15 @@ export const ColorSwatchInput = ({
size="compact-xs"
variant="light"
color="gray"
- bg="gray.8"
onClick={() => setOpened(o => !o)}
>
{value ? (
-
- Color
-
+ Color
) : (
-
- Choose color
-
+
Choose color
)}
diff --git a/packages/app/src/components/ConfirmDeleteMenu.tsx b/packages/app/src/components/ConfirmDeleteMenu.tsx
index 911964b7f..c0dfc71e1 100644
--- a/packages/app/src/components/ConfirmDeleteMenu.tsx
+++ b/packages/app/src/components/ConfirmDeleteMenu.tsx
@@ -8,7 +8,7 @@ export default function ConfirmDeleteMenu({
return (