@mastra/playground-ui 48.0.0-alpha.1 → 48.0.0-alpha.13
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/CHANGELOG.md +141 -0
- package/dist/components/DataList.cjs.js +4 -4
- package/dist/components/DataList.es.js +4 -4
- package/dist/components/EnvironmentVariablesEditor.cjs.js +1 -1
- package/dist/components/EnvironmentVariablesEditor.es.js +1 -1
- package/dist/components/LogsDataList.cjs.js +2 -2
- package/dist/components/LogsDataList.es.js +2 -2
- package/dist/components/MarkdownRenderer.cjs.js +1 -1
- package/dist/components/MarkdownRenderer.es.js +1 -1
- package/dist/components/ai/plan.cjs.js +1 -1
- package/dist/components/ai/plan.es.js +1 -1
- package/dist/{data-list-B3P5IlxV.cjs → data-list-Cb-piK4z.cjs} +2 -2
- package/dist/{data-list-B3P5IlxV.cjs.map → data-list-Cb-piK4z.cjs.map} +1 -1
- package/dist/{data-list-CZC8N3I4.js → data-list-CnQRIUyN.js} +2 -2
- package/dist/{data-list-CZC8N3I4.js.map → data-list-CnQRIUyN.js.map} +1 -1
- package/dist/{data-list-skeleton-ClGPuUja.cjs → data-list-skeleton--tiF5mjH.cjs} +4 -4
- package/dist/data-list-skeleton--tiF5mjH.cjs.map +1 -0
- package/dist/{data-list-skeleton-BDQEjCWH.js → data-list-skeleton-DeEqsrIz.js} +4 -4
- package/dist/data-list-skeleton-DeEqsrIz.js.map +1 -0
- package/dist/{data-list-top-cell-Dfg0AKmr.cjs → data-list-top-cell-CU8KoWys.cjs} +8 -3
- package/dist/data-list-top-cell-CU8KoWys.cjs.map +1 -0
- package/dist/{data-list-top-cell-S98SdRsx.js → data-list-top-cell-D9VTy6Sk.js} +8 -3
- package/dist/data-list-top-cell-D9VTy6Sk.js.map +1 -0
- package/dist/domains/logs/components/logs-list-view.cjs.js +2 -2
- package/dist/domains/logs/components/logs-list-view.es.js +2 -2
- package/dist/domains/metrics/components/memory-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/memory-card-view.es.js +1 -1
- package/dist/domains/metrics/components/model-usage-cost-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/model-usage-cost-card-view.es.js +1 -1
- package/dist/domains/metrics/components/scores-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/scores-card-view.es.js +1 -1
- package/dist/domains/metrics/drilldown.cjs.js +1 -1
- package/dist/domains/metrics/drilldown.cjs.js.map +1 -1
- package/dist/domains/metrics/drilldown.es.js +1 -1
- package/dist/domains/metrics/drilldown.es.js.map +1 -1
- package/dist/domains/metrics/hooks/use-metrics.cjs.js.map +1 -1
- package/dist/domains/metrics/hooks/use-metrics.es.js.map +1 -1
- package/dist/domains/traces/components/trace-data-panel-view.cjs.js +4 -4
- package/dist/domains/traces/components/trace-data-panel-view.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-data-panel-view.es.js +4 -4
- package/dist/domains/traces/components/trace-data-panel-view.es.js.map +1 -1
- package/dist/domains/traces/components/traces-list-view.cjs.js +3 -3
- package/dist/domains/traces/components/traces-list-view.es.js +3 -3
- package/dist/ee/signals/components/signals-empty-state.cjs.js +1 -1
- package/dist/ee/signals/components/signals-empty-state.cjs.js.map +1 -1
- package/dist/ee/signals/components/signals-empty-state.es.js +1 -1
- package/dist/ee/signals/components/signals-empty-state.es.js.map +1 -1
- package/dist/ee/topics/components/topic-trace-summary-list.cjs.js +1 -1
- package/dist/ee/topics/components/topic-trace-summary-list.es.js +1 -1
- package/dist/icons/GithubIcon.cjs.js +7 -10
- package/dist/icons/GithubIcon.cjs.js.map +1 -1
- package/dist/icons/GithubIcon.es.js +8 -11
- package/dist/icons/GithubIcon.es.js.map +1 -1
- package/dist/icons/LinearIcon.cjs.js +10 -0
- package/dist/icons/LinearIcon.cjs.js.map +1 -0
- package/dist/icons/LinearIcon.d.ts +2 -0
- package/dist/icons/LinearIcon.es.js +6 -0
- package/dist/icons/LinearIcon.es.js.map +1 -0
- package/dist/icons/SlackIcon.cjs.js +39 -0
- package/dist/icons/SlackIcon.cjs.js.map +1 -0
- package/dist/icons/SlackIcon.d.ts +2 -0
- package/dist/icons/SlackIcon.es.js +35 -0
- package/dist/icons/SlackIcon.es.js.map +1 -0
- package/dist/{logs-data-list-C9Q9MHsz.js → logs-data-list-CAa2nwZC.js} +2 -2
- package/dist/{logs-data-list-C9Q9MHsz.js.map → logs-data-list-CAa2nwZC.js.map} +1 -1
- package/dist/{logs-data-list-DTt_DmNk.cjs → logs-data-list-DWf9fEtC.cjs} +2 -2
- package/dist/{logs-data-list-DTt_DmNk.cjs.map → logs-data-list-DWf9fEtC.cjs.map} +1 -1
- package/dist/{markdown-renderer-CqAR8lve.js → markdown-renderer-Bi2fWeoF.js} +15 -2
- package/dist/markdown-renderer-Bi2fWeoF.js.map +1 -0
- package/dist/{markdown-renderer-CfWz5SWN.cjs → markdown-renderer-DwfNrhEH.cjs} +15 -2
- package/dist/markdown-renderer-DwfNrhEH.cjs.map +1 -0
- package/dist/src/domains/metrics/drilldown.d.ts +1 -1
- package/dist/src/domains/metrics/hooks/use-metrics.d.ts +1 -1
- package/dist/src/ds/components/DataList/data-list-root.d.ts +13 -1
- package/dist/src/ds/components/DataList/data-list-skeleton.d.ts +3 -1
- package/dist/src/ds/icons/LinearIcon.d.ts +2 -0
- package/dist/src/ds/icons/SlackIcon.d.ts +2 -0
- package/dist/src/ds/icons/index.d.ts +2 -0
- package/dist/{traces-data-list-a3sYTxch.js → traces-data-list-DtuaCDES.js} +3 -3
- package/dist/{traces-data-list-a3sYTxch.js.map → traces-data-list-DtuaCDES.js.map} +1 -1
- package/dist/{traces-data-list-D3TOjHkm.cjs → traces-data-list-vsvvvEiP.cjs} +3 -3
- package/dist/{traces-data-list-D3TOjHkm.cjs.map → traces-data-list-vsvvvEiP.cjs.map} +1 -1
- package/package.json +7 -7
- package/dist/data-list-skeleton-BDQEjCWH.js.map +0 -1
- package/dist/data-list-skeleton-ClGPuUja.cjs.map +0 -1
- package/dist/data-list-top-cell-Dfg0AKmr.cjs.map +0 -1
- package/dist/data-list-top-cell-S98SdRsx.js.map +0 -1
- package/dist/markdown-renderer-CfWz5SWN.cjs.map +0 -1
- package/dist/markdown-renderer-CqAR8lve.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-list-top-cell-CU8KoWys.cjs","sources":["../src/ds/components/DataList/shared.ts","../src/ds/components/DataList/data-list-cells.tsx","../src/ds/components/DataList/data-list-next-page-loading.tsx","../src/ds/components/DataList/data-list-no-match.tsx","../src/ds/components/DataList/data-list-root.tsx","../src/ds/components/DataList/data-list-row-wrapper-context.ts","../src/ds/components/DataList/data-list-row-button.tsx","../src/ds/components/DataList/data-list-row-link.tsx","../src/ds/components/DataList/data-list-row-wrapper.tsx","../src/ds/components/DataList/data-list-spacer.tsx","../src/ds/components/DataList/data-list-top.tsx","../src/ds/components/DataList/data-list-top-cell.tsx"],"sourcesContent":["/**\n * Row-level styling for the element that participates in the row sibling\n * chain — applied to `DataList.RowButton` / `DataList.RowLink` when used\n * standalone, and to `DataList.RowWrapper` when used as a shell around them.\n *\n * Contains the `.data-list-row` marker class (used by the sibling-aware\n * separator rules), the full-width separator treatment, and rounded corners.\n */\nexport const dataListRowOuterStyles = [\n 'data-list-row col-span-full relative mt-[3px] mb-1',\n 'after:absolute after:inset-x-[-0.25rem] after:bottom-[-0.25rem] after:h-px after:bg-border1 after:content-[\"\"] after:pointer-events-none',\n '[&:has(+.data-list-subheader)]:after:hidden [&:not(:has(~.data-list-row))]:after:hidden',\n 'transition-colors duration-200 rounded-lg',\n] as const;\n\nexport const dataListRowInteractiveStyles = [\n 'grid grid-cols-subgrid gap-8 px-5 outline-none cursor-pointer',\n 'hover:bg-surface4 focus-visible:bg-surface4 focus-visible:ring-1 focus-visible:ring-inset focus-visible:ring-accent1',\n 'transition-colors duration-200 rounded-lg',\n] as const;\n\nexport const dataListRowStyles = ['mx-1', ...dataListRowInteractiveStyles, ...dataListRowOuterStyles] as const;\n\nexport const dataListRowStaticStyles = ['mx-1 grid grid-cols-subgrid gap-8 px-5', ...dataListRowOuterStyles] as const;\n\nimport { cva } from 'class-variance-authority';\n\nexport type DataListSticky = 'start';\n\nexport const dataListStickyStartStyles = [\n 'data-list-sticky-start sticky left-0 z-10 isolate self-stretch overflow-visible',\n 'after:absolute after:-right-4 after:top-1/2 after:-translate-y-1/2 after:h-4 after:w-px after:bg-border2 after:content-[\"\"] after:pointer-events-none',\n] as const;\n\n/** Tone for a single row. `error` lays a subtle, theme-aware destructive tint\n * over whatever background the row already has. */\nexport type DataListRowVariant = 'default' | 'error';\n\n/**\n * Per-row tone. Kept as a `.ts` cva (safe to export — no react-refresh concern).\n * The error tint uses `!` so it wins over borderless table root-level styling\n * (higher-specificity descendant rules) and over the base row hover.\n */\nexport const dataListRowVariants = cva('', {\n variants: {\n variant: {\n default: '',\n error: 'bg-notice-destructive/10! hover:bg-notice-destructive/15!',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n});\n\n/**\n * Layout/state modifiers shared by interactive row primitives\n * (`DataList.RowButton`, `DataList.RowLink`).\n */\nexport type DataListRowSharedProps = {\n /** Row tone — `error` applies a subtle destructive background tint. */\n variant?: DataListRowVariant;\n /**\n * Drop the row's default left margin. Use when the row is wrapped in a\n * `DataList.RowWrapper` that owns the leading inset (e.g. for selection rows where\n * the checkbox cell sits on the left).\n */\n flushLeft?: boolean;\n /**\n * Drop the row's default right margin. Use when the row is wrapped in a\n * `DataList.RowWrapper` that owns the trailing inset (e.g. for rows with a\n * trailing actions cell on the right).\n */\n flushRight?: boolean;\n /**\n * Place the row starting at this column line. Defaults to column 1. Use\n * when the row sits beside a leading cell that owns column 1.\n */\n colStart?: number;\n /**\n * Place the row ending at this column line (use negative values to count\n * from the end, e.g. `-2`). Defaults to `-1` (the last line). Use when the\n * row sits beside a trailing cell that owns the last column.\n */\n colEnd?: number;\n /**\n * Apply the highlighted background. Use to mark the row that is currently\n * featured (e.g. the row whose detail is open in a side panel).\n */\n featured?: boolean;\n};\n","import { format, isToday } from 'date-fns';\nimport { Children, cloneElement, isValidElement } from 'react';\nimport type { ComponentPropsWithoutRef, ElementType, ReactNode } from 'react';\nimport { dataListStickyStartStyles } from './shared';\nimport type { DataListSticky } from './shared';\nimport { Checkbox } from '@/ds/components/Checkbox';\nimport { cn } from '@/lib/utils';\n\nexport type DataListCellProps = {\n children?: ReactNode;\n className?: string;\n height?: 'default' | 'compact';\n /**\n * HTML element rendered for the cell. Defaults to `span`. Use `'label'` when\n * the cell wraps a labelable control (e.g. a Checkbox), so the whole cell\n * area acts as the click/hover target.\n */\n as?: ElementType;\n /**\n * Pins the cell to the horizontal start edge of the list while the list\n * scrolls sideways.\n */\n sticky?: DataListSticky;\n} & Omit<ComponentPropsWithoutRef<'div'>, 'children' | 'className'>;\n\nexport function DataListCell({ children, className, height = 'default', as, sticky, ...rest }: DataListCellProps) {\n const Component = as || 'span';\n return (\n <Component\n className={cn(\n 'relative grid max-w-full min-w-0 items-center overflow-hidden text-ui-md whitespace-nowrap text-neutral3 empty:before:text-neutral2 empty:before:content-[\"—\"]',\n height === 'compact' ? 'py-1.5' : 'py-2.5',\n sticky === 'start' && dataListStickyStartStyles,\n className,\n )}\n {...rest}\n >\n {children}\n </Component>\n );\n}\n\nconst dataListTruncateContentStyles =\n 'block min-w-0 max-w-full truncate empty:before:content-[\"—\"] empty:before:text-neutral2 [&>*]:min-w-0 [&>*]:max-w-full [&>*]:overflow-hidden [&>*]:text-ellipsis [&>*]:whitespace-nowrap';\nconst dataListInlineTextTruncateStyles = 'min-w-0 flex-1 truncate';\n\nfunction DataListInlineText({ children }: { children: string | number }) {\n return <span className={dataListInlineTextTruncateStyles}>{children}</span>;\n}\n\nfunction DataListTruncatedTextNodes({ children }: { children: ReactNode }) {\n return Children.map(children, child => {\n if (typeof child === 'string' || typeof child === 'number') {\n return <DataListInlineText>{child}</DataListInlineText>;\n }\n\n return child;\n });\n}\n\nfunction DataListTruncatedCellContent({ children }: { children: ReactNode }) {\n return Children.map(children, child => {\n if (!isValidElement<{ children?: ReactNode; className?: string }>(child) || typeof child.type !== 'string') {\n return child;\n }\n\n return cloneElement(child, {\n className: cn('max-w-full min-w-0 overflow-hidden', child.props.className),\n children: <DataListTruncatedTextNodes>{child.props.children}</DataListTruncatedTextNodes>,\n });\n });\n}\n\nexport function DataListTextCell({ children, className, ...rest }: DataListCellProps) {\n return (\n <DataListCell className={className} {...rest}>\n <span className={dataListTruncateContentStyles}>\n <DataListTruncatedCellContent>{children}</DataListTruncatedCellContent>\n </span>\n </DataListCell>\n );\n}\n\nexport function DataListNameCell({ children, className }: DataListCellProps) {\n return (\n <DataListCell className={cn('text-left text-neutral4', className)}>\n <span className={dataListTruncateContentStyles}>\n <DataListTruncatedCellContent>{children}</DataListTruncatedCellContent>\n </span>\n </DataListCell>\n );\n}\n\nexport function DataListDescriptionCell({ children, className }: DataListCellProps) {\n return (\n <DataListCell className={cn('text-neutral2', className)}>\n <span className={dataListTruncateContentStyles}>\n <DataListTruncatedCellContent>{children}</DataListTruncatedCellContent>\n </span>\n </DataListCell>\n );\n}\n\nexport type DataListRowHeaderCellProps = Omit<DataListCellProps, 'sticky'>;\n\nexport function DataListRowHeaderCell({ children, className, ...rest }: DataListRowHeaderCellProps) {\n return (\n <DataListCell\n sticky=\"start\"\n className={cn(\n 'data-list-row-header -mr-4 -ml-5 w-auto max-w-none rounded-l-md pr-4 pl-5 text-left text-ui-sm font-semibold tracking-tight text-neutral2',\n className,\n )}\n {...rest}\n >\n <span className={cn(dataListTruncateContentStyles, 'relative z-10 w-full')}>\n <DataListTruncatedCellContent>{children}</DataListTruncatedCellContent>\n </span>\n </DataListCell>\n );\n}\n\nexport type DataListNumberCellProps = DataListCellProps & {\n /**\n * Emphasizes the value with a brighter tone and semibold weight — use for the\n * primary metric in a row (e.g. a total or headline number).\n */\n highlight?: boolean;\n};\n\n/**\n * Right-aligned numeric cell with tabular figures, for metric and summary\n * tables. Defaults to `compact` height to match those layouts; pass `highlight`\n * for the emphasized column.\n */\nexport function DataListNumberCell({\n children,\n className,\n highlight,\n height = 'compact',\n ...rest\n}: DataListNumberCellProps) {\n return (\n <DataListCell\n height={height}\n className={cn(\n 'justify-items-end text-right text-ui-sm tabular-nums',\n highlight ? 'font-semibold text-neutral4' : 'text-neutral3',\n className,\n )}\n {...rest}\n >\n {children}\n </DataListCell>\n );\n}\n\nfunction getShortId(id: string | undefined): string {\n if (!id) return '';\n return id.length > 8 ? id.slice(0, 8) : id;\n}\n\nexport interface DataListIdCellProps {\n id: string;\n}\n\nexport function DataListIdCell({ id }: DataListIdCellProps) {\n return (\n <DataListCell height=\"compact\" className=\"text-ui-smd text-neutral3 font-mono\">\n {getShortId(id)}\n </DataListCell>\n );\n}\n\nexport interface DataListSelectCellProps {\n checked: boolean;\n /**\n * Called when the checkbox is clicked. Receives the click event's `shiftKey`\n * so callers can implement range-select. The event's propagation is stopped\n * before `onToggle` runs, so the host row's `onClick` doesn't fire.\n */\n onToggle: (shiftKey: boolean) => void;\n /** Disable the checkbox, e.g. while a selection mutation is in flight. */\n disabled?: boolean;\n 'aria-label'?: string;\n}\n\nexport function DataListSelectCell({ checked, onToggle, disabled, ...rest }: DataListSelectCellProps) {\n return (\n <DataListCell\n as=\"label\"\n height=\"compact\"\n className={cn(\n 'size-8 justify-items-center self-center overflow-visible px-0 py-0!',\n disabled ? 'cursor-not-allowed' : 'cursor-pointer',\n )}\n onClick={e => e.stopPropagation()}\n >\n <Checkbox\n checked={checked}\n disabled={disabled}\n onCheckedChange={() => {}} // no-op: selection handled by onClick to capture shiftKey\n onClick={e => {\n e.stopPropagation();\n // Base UI's Checkbox.Root is a `<span>`, so clicks still fire while\n // disabled — guard here instead of relying on `:disabled` semantics.\n if (disabled) return;\n onToggle(e.shiftKey);\n }}\n aria-label={rest['aria-label']}\n />\n </DataListCell>\n );\n}\n\nexport interface DataListMonoCellProps {\n children: ReactNode;\n /** Override classes on the inner span (e.g. swap the default `text-neutral3` tone). */\n className?: string;\n /** Cell vertical padding. Defaults to `compact` to match other identifier cells. */\n height?: 'default' | 'compact';\n}\n\n/**\n * Mono-typography cell with truncation. Shared by any column that\n * shows code-like text (input previews, JSON summaries, identifiers, etc.).\n */\nexport function DataListMonoCell({ children, className, height = 'compact' }: DataListMonoCellProps) {\n return (\n <DataListCell height={height}>\n <span\n className={cn(\n 'block max-w-full min-w-0 truncate font-mono text-ui-smd text-neutral3 empty:before:content-[\"—\"]',\n className,\n )}\n >\n {children}\n </span>\n </DataListCell>\n );\n}\n\nfunction toDate(value: Date | string): Date | null {\n const date = value instanceof Date ? value : new Date(value);\n return isNaN(date.getTime()) ? null : date;\n}\n\nexport interface DataListDateCellProps {\n timestamp: Date | string;\n}\n\n/** Compact date cell — `Today` or `MMM dd` (e.g. `May 19`). */\nexport function DataListDateCell({ timestamp }: DataListDateCellProps) {\n const date = toDate(timestamp);\n return (\n <DataListCell height=\"compact\" className=\"text-ui-smd text-neutral2\">\n {date ? (isToday(date) ? 'Today' : format(date, 'MMM dd')) : null}\n </DataListCell>\n );\n}\n\nexport interface DataListTimeCellProps {\n timestamp: Date | string;\n}\n\n/** Compact monospace time cell — `HH:mm:ss.SSS` with the millisecond portion tinted. */\nexport function DataListTimeCell({ timestamp }: DataListTimeCellProps) {\n const date = toDate(timestamp);\n return (\n <DataListCell height=\"compact\" className=\"text-ui-smd text-neutral3 flex font-mono\">\n {date ? (\n <>\n {format(date, 'HH:mm:ss')}\n <span className=\"text-neutral2\">.{String(date.getMilliseconds()).padStart(3, '0')}</span>\n </>\n ) : null}\n </DataListCell>\n );\n}\n","import { cn } from '@/lib/utils';\n\nexport type DataListNextPageLoadingProps = {\n isLoading?: boolean;\n hasMore?: boolean;\n setEndOfListElement?: (element: HTMLDivElement | null) => void;\n loadingText?: string;\n};\n\nexport function DataListNextPageLoading({\n isLoading,\n setEndOfListElement,\n hasMore,\n loadingText = 'Loading more data...',\n}: DataListNextPageLoadingProps) {\n if (!setEndOfListElement) {\n return null;\n }\n\n return (\n <div\n ref={setEndOfListElement}\n className={cn('col-span-full flex min-h-1 justify-center text-ui-md text-neutral3 opacity-50', {\n 'py-4': isLoading,\n 'py-0': !hasMore,\n })}\n >\n {isLoading && loadingText}\n </div>\n );\n}\n","import type { ComponentPropsWithoutRef } from 'react';\nimport { cn } from '@/lib/utils';\n\nexport type DataListNoMatchProps = ComponentPropsWithoutRef<'div'> & {\n message?: string;\n};\n\nexport function DataListNoMatch({\n message = 'Nothing matches your search',\n className,\n ...props\n}: DataListNoMatchProps) {\n return (\n <div\n className={cn('col-span-full flex flex-col items-center justify-center gap-2 py-12 text-neutral3', className)}\n {...props}\n >\n <p className=\"text-ui-md\">{message}</p>\n </div>\n );\n}\n","import { cva } from 'class-variance-authority';\nimport type { CSSProperties, ReactNode, RefObject } from 'react';\nimport { ScrollArea } from '@/ds/components/ScrollArea/scroll-area';\nimport type { ScrollAreaMask, ScrollAreaProps } from '@/ds/components/ScrollArea/scroll-area';\nimport { cn } from '@/lib/utils';\n\n/**\n * Visual treatment for the whole list.\n *\n * - `striped`: borderless and full-bleed, zebra-striped rows (every other row\n * tinted), contrasting sticky header band, no row separators.\n * - `lined`: borderless and full-bleed like `striped`, but rows stay transparent\n * and use subtle separators instead of zebra tints.\n */\nexport type DataListVariant = 'striped' | 'lined';\n\n/**\n * Horizontal sizing of the list grid.\n *\n * - `content`: the grid is as wide as its widest content (`w-max`) and the\n * ScrollArea scrolls horizontally when it exceeds the container.\n * - `container`: the grid fills the container width and never exceeds it;\n * flexible tracks (`minmax(0, 1fr)`) shrink so truncating cells ellipsize\n * instead of widening the table.\n */\nexport type DataListFit = 'content' | 'container';\nexport type DataListStickyHeaderBackground = 'tinted' | 'surface' | 'transparent';\ntype DataListStickyHeaderBackgroundValue = { background: string; hoverBackground: string };\n\nexport type DataListRootProps = Omit<ScrollAreaProps, 'children' | 'orientation' | 'mask' | 'viewportRef'> & {\n children: ReactNode;\n columns: string;\n variant?: DataListVariant;\n /** Grid width behavior; defaults to `content` (existing horizontal-scroll sizing). */\n fit?: DataListFit;\n /**\n * Shared fill for the sticky top header and sticky row-header column.\n * `tinted` is an opaque equivalent of the former `neutral6/10` tint, so sticky\n * headers do not reveal scrolled content beneath them.\n */\n stickyHeaderBackground?: DataListStickyHeaderBackground;\n /**\n * Edge fades from the underlying ScrollArea. DataList keeps the top fade off\n * by default so it does not fade the sticky top header.\n */\n mask?: ScrollAreaMask;\n /**\n * Ref to the scroll container — pass this to TanStack Virtual's\n * `getScrollElement` when virtualizing. Without it, the ScrollArea viewport\n * scrolls normally.\n */\n scrollRef?: RefObject<HTMLDivElement | null>;\n};\n\nconst stickyHeaderBackgroundValues = {\n tinted: {\n background: 'color-mix(in oklch, var(--surface1), var(--neutral6) 10%)',\n hoverBackground: 'color-mix(in oklch, var(--surface1), var(--neutral6) 14%)',\n },\n surface: {\n background: 'var(--surface2)',\n hoverBackground: 'color-mix(in oklch, var(--surface2), var(--neutral6) 10%)',\n },\n transparent: {\n background: 'transparent',\n hoverBackground: 'transparent',\n },\n} satisfies Record<DataListStickyHeaderBackground, DataListStickyHeaderBackgroundValue>;\n\ntype DataListRootStyle = CSSProperties & {\n '--data-list-sticky-header-background'?: string;\n '--data-list-sticky-header-hover-background'?: string;\n};\n\nfunction getDataListMask(mask: ScrollAreaMask | undefined): ScrollAreaMask {\n if (mask === undefined) return { top: false };\n if (typeof mask === 'object') return { top: false, ...mask };\n\n return mask;\n}\n\n/**\n * Root grid styling per `variant`. Kept module-private (an exported cva in a\n * `.tsx` trips react-refresh). The borderless table treatments are driven\n * entirely from the root with CSS descendant selectors on the `.data-list-top` /\n * `.data-list-row` markers - the header and row primitives stay untouched, no JS\n * per-row index:\n * - no container fill or border: rows composite over any view.\n * - `gap-y-px`: a uniform 1px gap between every grid track (header and rows).\n * - header: a contrasting band that owns the radius (the container no longer\n * rounds/clips) — `rounded-t-xl` top, `rounded-b-md` bottom to match the rows\n * sitting below the 1px gap, no hairline.\n * - rows: full-bleed, `rounded-md` (last row included); rows zero\n * their own margins so the grid gap is the only spacing.\n * - striped adds translucent zebra tints with `:even`; hover & focus use `!` so\n * they still win over root-level row styling.\n */\nconst borderlessTableStyles = [\n 'gap-y-px',\n // A shared opaque tint gives both column headers and sticky row headers the\n // same treatment without revealing scrolled content beneath sticky surfaces.\n '[&_.data-list-top]:mx-0 [&_.data-list-top]:bg-[var(--data-list-sticky-header-background)] [&_.data-list-top]:after:hidden',\n '[&_.data-list-top]:rounded-t-xl [&_.data-list-top]:rounded-b-md',\n // header column separators: a short, faint vertical line centered in the gap\n // to the left of every header cell but the first. A `before` pseudo (not a\n // `border-l` + padding) keeps header text aligned with the row cells below.\n // The cell's default `overflow-hidden` would clip a gap-positioned pseudo, so\n // these cells switch to `overflow-visible`; the title text still truncates via\n // its inner `truncate` span, so nothing else spills.\n '[&_.data-list-top>*:not(:first-child)]:relative [&_.data-list-top>*:not(:first-child)]:overflow-visible',\n '[&_.data-list-top>*:not(:first-child)]:before:absolute [&_.data-list-top>*:not(:first-child)]:before:-left-4 [&_.data-list-top>*:not(:first-child)]:before:top-1/2 [&_.data-list-top>*:not(:first-child)]:before:-translate-y-1/2 [&_.data-list-top>*:not(:first-child)]:before:h-4 [&_.data-list-top>*:not(:first-child)]:before:w-px [&_.data-list-top>*:not(:first-child)]:before:bg-border2 [&_.data-list-top>*:not(:first-child)]:before:content-[\"\"]',\n '[&_.data-list-row]:mx-0 [&_.data-list-row]:my-0 [&_.data-list-row]:rounded-md',\n '[&_.data-list-row]:hover:bg-surface-overlay-strong!',\n '[&_.data-list-row]:focus-visible:bg-surface-overlay-strong!',\n '[&_.data-list-row>.data-list-sticky-start]:bg-[var(--data-list-sticky-header-background)]',\n '[&_.data-list-row>.data-list-sticky-start]:after:right-0',\n '[&_.data-list-row:hover>.data-list-sticky-start]:bg-[var(--data-list-sticky-header-hover-background)]',\n '[&_.data-list-row:focus-visible>.data-list-sticky-start]:bg-[var(--data-list-sticky-header-hover-background)]',\n '[&_.data-list-row:focus-within>.data-list-sticky-start]:bg-[var(--data-list-sticky-header-hover-background)]',\n '[&_.data-list-top>.data-list-sticky-start]:after:right-0',\n '[&_.data-list-top>.data-list-sticky-start+*]:before:hidden',\n] as const;\n\nconst dataListFitClasses: Record<DataListFit, string> = {\n content: 'w-max max-w-none min-w-full',\n container: 'w-full max-w-full',\n};\n\nconst dataListRootVariants = cva(cn('grid content-start'), {\n variants: {\n variant: {\n striped: cn(\n ...borderlessTableStyles,\n '[&_.data-list-row]:after:hidden',\n '[&_.data-list-row]:even:bg-surface-overlay-soft',\n ),\n lined: cn(\n ...borderlessTableStyles,\n '[&_.data-list-row]:after:pointer-events-none [&_.data-list-row]:after:absolute [&_.data-list-row]:after:h-px [&_.data-list-row]:after:content-[\"\"]',\n '[&_.data-list-row]:after:inset-x-2 [&_.data-list-row]:after:-bottom-px [&_.data-list-row]:after:bg-neutral6/10',\n ),\n },\n },\n defaultVariants: {\n variant: 'lined',\n },\n});\n\nexport function DataListRoot({\n children,\n columns,\n className,\n variant = 'lined',\n fit = 'content',\n stickyHeaderBackground = 'tinted',\n mask,\n scrollRef,\n ...props\n}: DataListRootProps) {\n const stickyHeaderColors = stickyHeaderBackgroundValues[stickyHeaderBackground];\n const gridStyle: DataListRootStyle = {\n '--data-list-sticky-header-background': stickyHeaderColors.background,\n '--data-list-sticky-header-hover-background': stickyHeaderColors.hoverBackground,\n gridTemplateColumns: columns,\n };\n\n const grid = (\n <div\n // Lists scroll inside the ScrollArea viewport (below); the grid just lays out.\n className={cn(dataListRootVariants({ variant }), dataListFitClasses[fit])}\n style={gridStyle}\n >\n {children}\n </div>\n );\n\n // DataList uses the DS ScrollArea: an overlay scrollbar (no reserved gutter,\n // so the sticky header spans the full width and both top corners clip cleanly)\n // plus the default edge fades. When the list virtualizes it passes a\n // `scrollRef`; forwarding it as `viewportRef` makes the virtualizer scroll\n // this viewport.\n //\n // `rounded-t-xl` clips the viewport top. Masks default to every overflowing\n // edge except the top — a top fade would fade the opaque sticky header.\n return (\n <ScrollArea\n {...props}\n orientation=\"both\"\n mask={getDataListMask(mask)}\n viewportRef={scrollRef}\n viewPortClassName=\"max-h-[inherit]\"\n className={cn('size-full rounded-t-xl', className)}\n >\n {grid}\n </ScrollArea>\n );\n}\n","import { createContext, useContext } from 'react';\n\nexport const DataListRowWrapperContext = createContext(false);\n\nexport function useDataListRowWrapperContext() {\n return useContext(DataListRowWrapperContext);\n}\n","import { forwardRef } from 'react';\nimport type { ComponentPropsWithoutRef } from 'react';\nimport { useDataListRowWrapperContext } from './data-list-row-wrapper-context';\nimport { dataListRowInteractiveStyles, dataListRowStyles, dataListRowVariants } from './shared';\nimport type { DataListRowSharedProps } from './shared';\nimport { cn } from '@/lib/utils';\n\nexport type DataListRowButtonProps = ComponentPropsWithoutRef<'button'> & DataListRowSharedProps;\n\n/**\n * Forwarded ref + spread props so virtualizers (`useVirtualizer.measureElement`)\n * can attach a ref and `data-index` to each rendered row.\n */\nexport const DataListRowButton = forwardRef<HTMLButtonElement, DataListRowButtonProps>(\n (\n {\n children,\n className,\n type = 'button',\n flushLeft,\n flushRight,\n colStart,\n colEnd,\n featured,\n variant,\n style,\n ...rest\n },\n ref,\n ) => {\n const isWrapped = useDataListRowWrapperContext();\n const hasColumnOverride = colStart !== undefined || colEnd !== undefined;\n const resolvedStyle = hasColumnOverride ? { ...style, gridColumn: `${colStart ?? 1} / ${colEnd ?? -1}` } : style;\n return (\n <button\n ref={ref}\n type={type}\n className={cn(\n ...(isWrapped ? dataListRowInteractiveStyles : dataListRowStyles),\n 'text-left',\n !isWrapped && flushLeft && 'ml-0!',\n !isWrapped && flushRight && 'mr-0!',\n // `!` so the selection fill wins over borderless table root styling\n // (higher-specificity descendant rules); same color in `default`.\n featured && 'bg-surface4!',\n dataListRowVariants({ variant }),\n className,\n )}\n style={resolvedStyle}\n {...rest}\n >\n {children}\n </button>\n );\n },\n);\n\nDataListRowButton.displayName = 'DataListRowButton';\n","import type { CSSProperties, ReactNode } from 'react';\nimport { useDataListRowWrapperContext } from './data-list-row-wrapper-context';\nimport { dataListRowInteractiveStyles, dataListRowStyles, dataListRowVariants } from './shared';\nimport type { DataListRowSharedProps } from './shared';\nimport type { LinkComponent } from '@/ds/types/link-component';\nimport { cn } from '@/lib/utils';\n\nexport type DataListRowLinkProps = DataListRowSharedProps & {\n children: ReactNode;\n to: string;\n className?: string;\n style?: CSSProperties;\n LinkComponent?: LinkComponent;\n};\n\nexport function DataListRowLink({\n children,\n to,\n className,\n style,\n LinkComponent: Link = 'a',\n flushLeft,\n flushRight,\n colStart,\n colEnd,\n featured,\n variant,\n}: DataListRowLinkProps) {\n const isWrapped = useDataListRowWrapperContext();\n const hasColumnOverride = colStart !== undefined || colEnd !== undefined;\n const resolvedStyle = hasColumnOverride ? { ...style, gridColumn: `${colStart ?? 1} / ${colEnd ?? -1}` } : style;\n return (\n <Link\n href={to}\n className={cn(\n ...(isWrapped ? dataListRowInteractiveStyles : dataListRowStyles),\n !isWrapped && flushLeft && 'ml-0!',\n !isWrapped && flushRight && 'mr-0!',\n // `!` so the selection fill wins over borderless table root styling\n // (higher-specificity descendant rules); same color in `default`.\n featured && 'bg-surface4!',\n dataListRowVariants({ variant }),\n className,\n )}\n style={resolvedStyle}\n >\n {children}\n </Link>\n );\n}\n","import { forwardRef } from 'react';\nimport type { ComponentPropsWithoutRef } from 'react';\nimport { DataListRowWrapperContext } from './data-list-row-wrapper-context';\nimport { dataListRowOuterStyles } from './shared';\nimport { cn } from '@/lib/utils';\n\nexport type DataListRowWrapperProps = ComponentPropsWithoutRef<'div'>;\n\n/**\n * Non-interactive grid wrapper. Used to host a leading or trailing cell (e.g. a\n * selection checkbox or row actions) alongside a `DataList.RowButton` so\n * hover/focus/click only apply to the button portion. For standalone\n * interactive rows, use `DataList.RowButton` directly without this wrapper.\n *\n * Carries the row-level border + `.data-list-row` marker so separators and\n * sibling-aware rules behave the same in wrapped and standalone rows.\n */\nexport const DataListRowWrapper = forwardRef<HTMLDivElement, DataListRowWrapperProps>(\n ({ children, className, ...rest }, ref) => {\n return (\n <DataListRowWrapperContext.Provider value>\n <div\n ref={ref}\n className={cn('mx-1 grid grid-cols-subgrid gap-0', ...dataListRowOuterStyles, className)}\n {...rest}\n >\n {children}\n </div>\n </DataListRowWrapperContext.Provider>\n );\n },\n);\n\nDataListRowWrapper.displayName = 'DataListRowWrapper';\n","export type DataListSpacerProps = {\n /** Pixel height of the spacer. Pass 0 to render nothing. */\n height: number;\n};\n\n/**\n * Pads top/bottom of the visible window when virtualizing — preserves the\n * grid's total scroll height for the rows that aren't currently rendered.\n * Spans the full grid width so it doesn't disturb column layout.\n */\nexport function DataListSpacer({ height }: DataListSpacerProps) {\n if (height <= 0) return null;\n return <div className=\"col-span-full\" style={{ height }} />;\n}\n","import type { ComponentPropsWithoutRef } from 'react';\nimport { cn } from '@/lib/utils';\n\nexport type DataListTopProps = ComponentPropsWithoutRef<'div'> & {\n /**\n * Switch to a \"leading cell\" layout: drops the default gap between children\n * and the default left padding, so a leading cell (e.g. `TopSelectCell`)\n * sits flush against the grid edge and an inner `TopCells` group owns the\n * remaining column spacing. Mirrors how `Row` + `RowButton` compose.\n */\n hasLeadingCell?: boolean;\n};\n\nexport function DataListTop({ children, className, hasLeadingCell, ...props }: DataListTopProps) {\n return (\n <div\n className={cn(\n 'data-list-top sticky top-0 z-20 col-span-full mx-1 grid grid-cols-subgrid gap-8 bg-surface2 px-5 after:pointer-events-none after:absolute after:-inset-x-1 after:bottom-0 after:h-px after:bg-border1 after:content-[\"\"]',\n hasLeadingCell && 'gap-0 pl-0!',\n className,\n )}\n {...props}\n >\n {children}\n </div>\n );\n}\n","import type { ComponentPropsWithoutRef, ElementType, ReactNode } from 'react';\nimport { forwardRef } from 'react';\nimport { dataListStickyStartStyles } from './shared';\nimport type { DataListSticky } from './shared';\nimport { Checkbox } from '@/ds/components/Checkbox';\nimport { Tooltip, TooltipTrigger, TooltipContent } from '@/ds/components/Tooltip';\nimport { cn } from '@/lib/utils';\n\nexport type DataListTopCellProps = {\n children: ReactNode;\n className?: string;\n /**\n * HTML element rendered for the top cell. Defaults to `span`. Use `'label'`\n * when the cell wraps a labelable control (e.g. a select-all Checkbox).\n */\n as?: ElementType;\n /** Pins the top cell to the horizontal start edge while the list scrolls sideways. */\n sticky?: DataListSticky;\n} & Omit<ComponentPropsWithoutRef<'div'>, 'children' | 'className' | 'ref'>;\n\nexport const DataListTopCell = forwardRef<HTMLSpanElement, DataListTopCellProps>(\n ({ children, className, as, sticky, ...rest }, ref) => {\n const Component = as || 'span';\n const isText = typeof children === 'string' || typeof children === 'number';\n return (\n <Component\n ref={ref}\n className={cn(\n 'flex h-8 max-w-full min-w-0 items-center overflow-hidden py-1 text-ui-sm font-semibold tracking-tight whitespace-nowrap text-neutral2',\n sticky === 'start' && dataListStickyStartStyles,\n sticky === 'start' && '-mr-4 -ml-5 w-auto max-w-none rounded-tl-xl rounded-bl-md pr-4 pl-5',\n sticky === 'start' && 'z-20 bg-[var(--data-list-sticky-header-background)]',\n className,\n )}\n {...rest}\n >\n {/* Plain string/number titles truncate with an ellipsis; element children\n (icons, smart long/short labels, checkboxes) render as-is. */}\n {isText ? <span className=\"min-w-0 truncate\">{children}</span> : children}\n </Component>\n );\n },\n);\n\nexport type DataListTopCellWithTooltipProps = {\n children: ReactNode;\n tooltip: ReactNode;\n className?: string;\n};\n\nexport function DataListTopCellWithTooltip({ children, tooltip, className }: DataListTopCellWithTooltipProps) {\n return (\n <Tooltip>\n <TooltipTrigger>\n <DataListTopCell className={className}>{children}</DataListTopCell>\n </TooltipTrigger>\n <TooltipContent>{tooltip}</TooltipContent>\n </Tooltip>\n );\n}\n\nexport type DataListTopCellSmartProps = {\n long: ReactNode;\n short: ReactNode;\n tooltip?: string;\n breakpoint?: 'sm' | 'md' | 'lg' | 'xl' | '2xl';\n className?: string;\n};\n\nconst breakpointClasses: Record<'sm' | 'md' | 'lg' | 'xl' | '2xl', { show: string; hide: string }> = {\n sm: { show: 'hidden sm:inline-flex', hide: 'inline-flex sm:hidden' },\n md: { show: 'hidden md:inline-flex', hide: 'inline-flex md:hidden' },\n lg: { show: 'hidden lg:inline-flex', hide: 'inline-flex lg:hidden' },\n xl: { show: 'hidden xl:inline-flex', hide: 'inline-flex xl:hidden' },\n '2xl': { show: 'hidden 2xl:inline-flex', hide: 'inline-flex 2xl:hidden' },\n};\n\nexport function DataListTopCellSmart({\n long,\n short,\n tooltip,\n breakpoint = '2xl',\n className,\n}: DataListTopCellSmartProps) {\n const tooltipText = tooltip ?? (typeof long === 'string' ? long : undefined);\n const bp = breakpointClasses[breakpoint];\n\n const content = (\n <>\n <span className={cn('items-center gap-1', bp.show)}>{long}</span>\n <span className={cn('items-center gap-1', bp.hide)}>{short}</span>\n </>\n );\n\n if (tooltipText) {\n return (\n <DataListTopCellWithTooltip tooltip={tooltipText} className={cn('flex [&_svg]:size-[1.3em]', className)}>\n {content}\n </DataListTopCellWithTooltip>\n );\n }\n\n return <DataListTopCell className={cn('flex [&_svg]:size-[1.3em]', className)}>{content}</DataListTopCell>;\n}\n\nexport interface DataListTopSelectCellProps {\n /** Pass `'indeterminate'` when some — but not all — rows are selected. */\n checked: boolean | 'indeterminate';\n /** Toggles the global selection. Typically clears when fully selected, otherwise selects all. */\n onToggle: () => void;\n 'aria-label'?: string;\n}\n\nexport function DataListTopSelectCell({ checked, onToggle, ...rest }: DataListTopSelectCellProps) {\n return (\n <DataListTopCell\n as=\"label\"\n className=\"w-8 cursor-pointer justify-center overflow-visible px-0 py-0!\"\n onClick={e => e.stopPropagation()}\n >\n <Checkbox checked={checked} onCheckedChange={() => onToggle()} aria-label={rest['aria-label']} />\n </DataListTopCell>\n );\n}\n"],"names":["cva","jsx","cn","Children","isValidElement","cloneElement","Checkbox","isToday","format","jsxs","Fragment","ScrollArea","createContext","useContext","forwardRef","tooltip","Tooltip","TooltipTrigger","TooltipContent"],"mappings":"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"}
|
|
@@ -268,7 +268,11 @@ const borderlessTableStyles = [
|
|
|
268
268
|
"[&_.data-list-top>.data-list-sticky-start]:after:right-0",
|
|
269
269
|
"[&_.data-list-top>.data-list-sticky-start+*]:before:hidden"
|
|
270
270
|
];
|
|
271
|
-
const
|
|
271
|
+
const dataListFitClasses = {
|
|
272
|
+
content: "w-max max-w-none min-w-full",
|
|
273
|
+
container: "w-full max-w-full"
|
|
274
|
+
};
|
|
275
|
+
const dataListRootVariants = cva(cn("grid content-start"), {
|
|
272
276
|
variants: {
|
|
273
277
|
variant: {
|
|
274
278
|
striped: cn(
|
|
@@ -292,6 +296,7 @@ function DataListRoot({
|
|
|
292
296
|
columns,
|
|
293
297
|
className,
|
|
294
298
|
variant = "lined",
|
|
299
|
+
fit = "content",
|
|
295
300
|
stickyHeaderBackground = "tinted",
|
|
296
301
|
mask,
|
|
297
302
|
scrollRef,
|
|
@@ -306,7 +311,7 @@ function DataListRoot({
|
|
|
306
311
|
const grid = /* @__PURE__ */ jsx(
|
|
307
312
|
"div",
|
|
308
313
|
{
|
|
309
|
-
className: dataListRootVariants({ variant }),
|
|
314
|
+
className: cn(dataListRootVariants({ variant }), dataListFitClasses[fit]),
|
|
310
315
|
style: gridStyle,
|
|
311
316
|
children
|
|
312
317
|
}
|
|
@@ -508,4 +513,4 @@ function DataListTopSelectCell({ checked, onToggle, ...rest }) {
|
|
|
508
513
|
}
|
|
509
514
|
|
|
510
515
|
export { DataListRoot as D, DataListCell as a, DataListMonoCell as b, DataListNextPageLoading as c, DataListTimeCell as d, DataListDateCell as e, DataListNoMatch as f, DataListSpacer as g, DataListRowLink as h, DataListRowButton as i, DataListRowWrapper as j, DataListTopCellSmart as k, DataListTopCellWithTooltip as l, DataListTopCell as m, DataListTop as n, DataListIdCell as o, dataListRowVariants as p, dataListRowStaticStyles as q, DataListTopSelectCell as r, DataListSelectCell as s, DataListNumberCell as t, useDataListRowWrapperContext as u, DataListRowHeaderCell as v, DataListDescriptionCell as w, DataListNameCell as x, DataListTextCell as y };
|
|
511
|
-
//# sourceMappingURL=data-list-top-cell-
|
|
516
|
+
//# sourceMappingURL=data-list-top-cell-D9VTy6Sk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-list-top-cell-D9VTy6Sk.js","sources":["../src/ds/components/DataList/shared.ts","../src/ds/components/DataList/data-list-cells.tsx","../src/ds/components/DataList/data-list-next-page-loading.tsx","../src/ds/components/DataList/data-list-no-match.tsx","../src/ds/components/DataList/data-list-root.tsx","../src/ds/components/DataList/data-list-row-wrapper-context.ts","../src/ds/components/DataList/data-list-row-button.tsx","../src/ds/components/DataList/data-list-row-link.tsx","../src/ds/components/DataList/data-list-row-wrapper.tsx","../src/ds/components/DataList/data-list-spacer.tsx","../src/ds/components/DataList/data-list-top.tsx","../src/ds/components/DataList/data-list-top-cell.tsx"],"sourcesContent":["/**\n * Row-level styling for the element that participates in the row sibling\n * chain — applied to `DataList.RowButton` / `DataList.RowLink` when used\n * standalone, and to `DataList.RowWrapper` when used as a shell around them.\n *\n * Contains the `.data-list-row` marker class (used by the sibling-aware\n * separator rules), the full-width separator treatment, and rounded corners.\n */\nexport const dataListRowOuterStyles = [\n 'data-list-row col-span-full relative mt-[3px] mb-1',\n 'after:absolute after:inset-x-[-0.25rem] after:bottom-[-0.25rem] after:h-px after:bg-border1 after:content-[\"\"] after:pointer-events-none',\n '[&:has(+.data-list-subheader)]:after:hidden [&:not(:has(~.data-list-row))]:after:hidden',\n 'transition-colors duration-200 rounded-lg',\n] as const;\n\nexport const dataListRowInteractiveStyles = [\n 'grid grid-cols-subgrid gap-8 px-5 outline-none cursor-pointer',\n 'hover:bg-surface4 focus-visible:bg-surface4 focus-visible:ring-1 focus-visible:ring-inset focus-visible:ring-accent1',\n 'transition-colors duration-200 rounded-lg',\n] as const;\n\nexport const dataListRowStyles = ['mx-1', ...dataListRowInteractiveStyles, ...dataListRowOuterStyles] as const;\n\nexport const dataListRowStaticStyles = ['mx-1 grid grid-cols-subgrid gap-8 px-5', ...dataListRowOuterStyles] as const;\n\nimport { cva } from 'class-variance-authority';\n\nexport type DataListSticky = 'start';\n\nexport const dataListStickyStartStyles = [\n 'data-list-sticky-start sticky left-0 z-10 isolate self-stretch overflow-visible',\n 'after:absolute after:-right-4 after:top-1/2 after:-translate-y-1/2 after:h-4 after:w-px after:bg-border2 after:content-[\"\"] after:pointer-events-none',\n] as const;\n\n/** Tone for a single row. `error` lays a subtle, theme-aware destructive tint\n * over whatever background the row already has. */\nexport type DataListRowVariant = 'default' | 'error';\n\n/**\n * Per-row tone. Kept as a `.ts` cva (safe to export — no react-refresh concern).\n * The error tint uses `!` so it wins over borderless table root-level styling\n * (higher-specificity descendant rules) and over the base row hover.\n */\nexport const dataListRowVariants = cva('', {\n variants: {\n variant: {\n default: '',\n error: 'bg-notice-destructive/10! hover:bg-notice-destructive/15!',\n },\n },\n defaultVariants: {\n variant: 'default',\n },\n});\n\n/**\n * Layout/state modifiers shared by interactive row primitives\n * (`DataList.RowButton`, `DataList.RowLink`).\n */\nexport type DataListRowSharedProps = {\n /** Row tone — `error` applies a subtle destructive background tint. */\n variant?: DataListRowVariant;\n /**\n * Drop the row's default left margin. Use when the row is wrapped in a\n * `DataList.RowWrapper` that owns the leading inset (e.g. for selection rows where\n * the checkbox cell sits on the left).\n */\n flushLeft?: boolean;\n /**\n * Drop the row's default right margin. Use when the row is wrapped in a\n * `DataList.RowWrapper` that owns the trailing inset (e.g. for rows with a\n * trailing actions cell on the right).\n */\n flushRight?: boolean;\n /**\n * Place the row starting at this column line. Defaults to column 1. Use\n * when the row sits beside a leading cell that owns column 1.\n */\n colStart?: number;\n /**\n * Place the row ending at this column line (use negative values to count\n * from the end, e.g. `-2`). Defaults to `-1` (the last line). Use when the\n * row sits beside a trailing cell that owns the last column.\n */\n colEnd?: number;\n /**\n * Apply the highlighted background. Use to mark the row that is currently\n * featured (e.g. the row whose detail is open in a side panel).\n */\n featured?: boolean;\n};\n","import { format, isToday } from 'date-fns';\nimport { Children, cloneElement, isValidElement } from 'react';\nimport type { ComponentPropsWithoutRef, ElementType, ReactNode } from 'react';\nimport { dataListStickyStartStyles } from './shared';\nimport type { DataListSticky } from './shared';\nimport { Checkbox } from '@/ds/components/Checkbox';\nimport { cn } from '@/lib/utils';\n\nexport type DataListCellProps = {\n children?: ReactNode;\n className?: string;\n height?: 'default' | 'compact';\n /**\n * HTML element rendered for the cell. Defaults to `span`. Use `'label'` when\n * the cell wraps a labelable control (e.g. a Checkbox), so the whole cell\n * area acts as the click/hover target.\n */\n as?: ElementType;\n /**\n * Pins the cell to the horizontal start edge of the list while the list\n * scrolls sideways.\n */\n sticky?: DataListSticky;\n} & Omit<ComponentPropsWithoutRef<'div'>, 'children' | 'className'>;\n\nexport function DataListCell({ children, className, height = 'default', as, sticky, ...rest }: DataListCellProps) {\n const Component = as || 'span';\n return (\n <Component\n className={cn(\n 'relative grid max-w-full min-w-0 items-center overflow-hidden text-ui-md whitespace-nowrap text-neutral3 empty:before:text-neutral2 empty:before:content-[\"—\"]',\n height === 'compact' ? 'py-1.5' : 'py-2.5',\n sticky === 'start' && dataListStickyStartStyles,\n className,\n )}\n {...rest}\n >\n {children}\n </Component>\n );\n}\n\nconst dataListTruncateContentStyles =\n 'block min-w-0 max-w-full truncate empty:before:content-[\"—\"] empty:before:text-neutral2 [&>*]:min-w-0 [&>*]:max-w-full [&>*]:overflow-hidden [&>*]:text-ellipsis [&>*]:whitespace-nowrap';\nconst dataListInlineTextTruncateStyles = 'min-w-0 flex-1 truncate';\n\nfunction DataListInlineText({ children }: { children: string | number }) {\n return <span className={dataListInlineTextTruncateStyles}>{children}</span>;\n}\n\nfunction DataListTruncatedTextNodes({ children }: { children: ReactNode }) {\n return Children.map(children, child => {\n if (typeof child === 'string' || typeof child === 'number') {\n return <DataListInlineText>{child}</DataListInlineText>;\n }\n\n return child;\n });\n}\n\nfunction DataListTruncatedCellContent({ children }: { children: ReactNode }) {\n return Children.map(children, child => {\n if (!isValidElement<{ children?: ReactNode; className?: string }>(child) || typeof child.type !== 'string') {\n return child;\n }\n\n return cloneElement(child, {\n className: cn('max-w-full min-w-0 overflow-hidden', child.props.className),\n children: <DataListTruncatedTextNodes>{child.props.children}</DataListTruncatedTextNodes>,\n });\n });\n}\n\nexport function DataListTextCell({ children, className, ...rest }: DataListCellProps) {\n return (\n <DataListCell className={className} {...rest}>\n <span className={dataListTruncateContentStyles}>\n <DataListTruncatedCellContent>{children}</DataListTruncatedCellContent>\n </span>\n </DataListCell>\n );\n}\n\nexport function DataListNameCell({ children, className }: DataListCellProps) {\n return (\n <DataListCell className={cn('text-left text-neutral4', className)}>\n <span className={dataListTruncateContentStyles}>\n <DataListTruncatedCellContent>{children}</DataListTruncatedCellContent>\n </span>\n </DataListCell>\n );\n}\n\nexport function DataListDescriptionCell({ children, className }: DataListCellProps) {\n return (\n <DataListCell className={cn('text-neutral2', className)}>\n <span className={dataListTruncateContentStyles}>\n <DataListTruncatedCellContent>{children}</DataListTruncatedCellContent>\n </span>\n </DataListCell>\n );\n}\n\nexport type DataListRowHeaderCellProps = Omit<DataListCellProps, 'sticky'>;\n\nexport function DataListRowHeaderCell({ children, className, ...rest }: DataListRowHeaderCellProps) {\n return (\n <DataListCell\n sticky=\"start\"\n className={cn(\n 'data-list-row-header -mr-4 -ml-5 w-auto max-w-none rounded-l-md pr-4 pl-5 text-left text-ui-sm font-semibold tracking-tight text-neutral2',\n className,\n )}\n {...rest}\n >\n <span className={cn(dataListTruncateContentStyles, 'relative z-10 w-full')}>\n <DataListTruncatedCellContent>{children}</DataListTruncatedCellContent>\n </span>\n </DataListCell>\n );\n}\n\nexport type DataListNumberCellProps = DataListCellProps & {\n /**\n * Emphasizes the value with a brighter tone and semibold weight — use for the\n * primary metric in a row (e.g. a total or headline number).\n */\n highlight?: boolean;\n};\n\n/**\n * Right-aligned numeric cell with tabular figures, for metric and summary\n * tables. Defaults to `compact` height to match those layouts; pass `highlight`\n * for the emphasized column.\n */\nexport function DataListNumberCell({\n children,\n className,\n highlight,\n height = 'compact',\n ...rest\n}: DataListNumberCellProps) {\n return (\n <DataListCell\n height={height}\n className={cn(\n 'justify-items-end text-right text-ui-sm tabular-nums',\n highlight ? 'font-semibold text-neutral4' : 'text-neutral3',\n className,\n )}\n {...rest}\n >\n {children}\n </DataListCell>\n );\n}\n\nfunction getShortId(id: string | undefined): string {\n if (!id) return '';\n return id.length > 8 ? id.slice(0, 8) : id;\n}\n\nexport interface DataListIdCellProps {\n id: string;\n}\n\nexport function DataListIdCell({ id }: DataListIdCellProps) {\n return (\n <DataListCell height=\"compact\" className=\"text-ui-smd text-neutral3 font-mono\">\n {getShortId(id)}\n </DataListCell>\n );\n}\n\nexport interface DataListSelectCellProps {\n checked: boolean;\n /**\n * Called when the checkbox is clicked. Receives the click event's `shiftKey`\n * so callers can implement range-select. The event's propagation is stopped\n * before `onToggle` runs, so the host row's `onClick` doesn't fire.\n */\n onToggle: (shiftKey: boolean) => void;\n /** Disable the checkbox, e.g. while a selection mutation is in flight. */\n disabled?: boolean;\n 'aria-label'?: string;\n}\n\nexport function DataListSelectCell({ checked, onToggle, disabled, ...rest }: DataListSelectCellProps) {\n return (\n <DataListCell\n as=\"label\"\n height=\"compact\"\n className={cn(\n 'size-8 justify-items-center self-center overflow-visible px-0 py-0!',\n disabled ? 'cursor-not-allowed' : 'cursor-pointer',\n )}\n onClick={e => e.stopPropagation()}\n >\n <Checkbox\n checked={checked}\n disabled={disabled}\n onCheckedChange={() => {}} // no-op: selection handled by onClick to capture shiftKey\n onClick={e => {\n e.stopPropagation();\n // Base UI's Checkbox.Root is a `<span>`, so clicks still fire while\n // disabled — guard here instead of relying on `:disabled` semantics.\n if (disabled) return;\n onToggle(e.shiftKey);\n }}\n aria-label={rest['aria-label']}\n />\n </DataListCell>\n );\n}\n\nexport interface DataListMonoCellProps {\n children: ReactNode;\n /** Override classes on the inner span (e.g. swap the default `text-neutral3` tone). */\n className?: string;\n /** Cell vertical padding. Defaults to `compact` to match other identifier cells. */\n height?: 'default' | 'compact';\n}\n\n/**\n * Mono-typography cell with truncation. Shared by any column that\n * shows code-like text (input previews, JSON summaries, identifiers, etc.).\n */\nexport function DataListMonoCell({ children, className, height = 'compact' }: DataListMonoCellProps) {\n return (\n <DataListCell height={height}>\n <span\n className={cn(\n 'block max-w-full min-w-0 truncate font-mono text-ui-smd text-neutral3 empty:before:content-[\"—\"]',\n className,\n )}\n >\n {children}\n </span>\n </DataListCell>\n );\n}\n\nfunction toDate(value: Date | string): Date | null {\n const date = value instanceof Date ? value : new Date(value);\n return isNaN(date.getTime()) ? null : date;\n}\n\nexport interface DataListDateCellProps {\n timestamp: Date | string;\n}\n\n/** Compact date cell — `Today` or `MMM dd` (e.g. `May 19`). */\nexport function DataListDateCell({ timestamp }: DataListDateCellProps) {\n const date = toDate(timestamp);\n return (\n <DataListCell height=\"compact\" className=\"text-ui-smd text-neutral2\">\n {date ? (isToday(date) ? 'Today' : format(date, 'MMM dd')) : null}\n </DataListCell>\n );\n}\n\nexport interface DataListTimeCellProps {\n timestamp: Date | string;\n}\n\n/** Compact monospace time cell — `HH:mm:ss.SSS` with the millisecond portion tinted. */\nexport function DataListTimeCell({ timestamp }: DataListTimeCellProps) {\n const date = toDate(timestamp);\n return (\n <DataListCell height=\"compact\" className=\"text-ui-smd text-neutral3 flex font-mono\">\n {date ? (\n <>\n {format(date, 'HH:mm:ss')}\n <span className=\"text-neutral2\">.{String(date.getMilliseconds()).padStart(3, '0')}</span>\n </>\n ) : null}\n </DataListCell>\n );\n}\n","import { cn } from '@/lib/utils';\n\nexport type DataListNextPageLoadingProps = {\n isLoading?: boolean;\n hasMore?: boolean;\n setEndOfListElement?: (element: HTMLDivElement | null) => void;\n loadingText?: string;\n};\n\nexport function DataListNextPageLoading({\n isLoading,\n setEndOfListElement,\n hasMore,\n loadingText = 'Loading more data...',\n}: DataListNextPageLoadingProps) {\n if (!setEndOfListElement) {\n return null;\n }\n\n return (\n <div\n ref={setEndOfListElement}\n className={cn('col-span-full flex min-h-1 justify-center text-ui-md text-neutral3 opacity-50', {\n 'py-4': isLoading,\n 'py-0': !hasMore,\n })}\n >\n {isLoading && loadingText}\n </div>\n );\n}\n","import type { ComponentPropsWithoutRef } from 'react';\nimport { cn } from '@/lib/utils';\n\nexport type DataListNoMatchProps = ComponentPropsWithoutRef<'div'> & {\n message?: string;\n};\n\nexport function DataListNoMatch({\n message = 'Nothing matches your search',\n className,\n ...props\n}: DataListNoMatchProps) {\n return (\n <div\n className={cn('col-span-full flex flex-col items-center justify-center gap-2 py-12 text-neutral3', className)}\n {...props}\n >\n <p className=\"text-ui-md\">{message}</p>\n </div>\n );\n}\n","import { cva } from 'class-variance-authority';\nimport type { CSSProperties, ReactNode, RefObject } from 'react';\nimport { ScrollArea } from '@/ds/components/ScrollArea/scroll-area';\nimport type { ScrollAreaMask, ScrollAreaProps } from '@/ds/components/ScrollArea/scroll-area';\nimport { cn } from '@/lib/utils';\n\n/**\n * Visual treatment for the whole list.\n *\n * - `striped`: borderless and full-bleed, zebra-striped rows (every other row\n * tinted), contrasting sticky header band, no row separators.\n * - `lined`: borderless and full-bleed like `striped`, but rows stay transparent\n * and use subtle separators instead of zebra tints.\n */\nexport type DataListVariant = 'striped' | 'lined';\n\n/**\n * Horizontal sizing of the list grid.\n *\n * - `content`: the grid is as wide as its widest content (`w-max`) and the\n * ScrollArea scrolls horizontally when it exceeds the container.\n * - `container`: the grid fills the container width and never exceeds it;\n * flexible tracks (`minmax(0, 1fr)`) shrink so truncating cells ellipsize\n * instead of widening the table.\n */\nexport type DataListFit = 'content' | 'container';\nexport type DataListStickyHeaderBackground = 'tinted' | 'surface' | 'transparent';\ntype DataListStickyHeaderBackgroundValue = { background: string; hoverBackground: string };\n\nexport type DataListRootProps = Omit<ScrollAreaProps, 'children' | 'orientation' | 'mask' | 'viewportRef'> & {\n children: ReactNode;\n columns: string;\n variant?: DataListVariant;\n /** Grid width behavior; defaults to `content` (existing horizontal-scroll sizing). */\n fit?: DataListFit;\n /**\n * Shared fill for the sticky top header and sticky row-header column.\n * `tinted` is an opaque equivalent of the former `neutral6/10` tint, so sticky\n * headers do not reveal scrolled content beneath them.\n */\n stickyHeaderBackground?: DataListStickyHeaderBackground;\n /**\n * Edge fades from the underlying ScrollArea. DataList keeps the top fade off\n * by default so it does not fade the sticky top header.\n */\n mask?: ScrollAreaMask;\n /**\n * Ref to the scroll container — pass this to TanStack Virtual's\n * `getScrollElement` when virtualizing. Without it, the ScrollArea viewport\n * scrolls normally.\n */\n scrollRef?: RefObject<HTMLDivElement | null>;\n};\n\nconst stickyHeaderBackgroundValues = {\n tinted: {\n background: 'color-mix(in oklch, var(--surface1), var(--neutral6) 10%)',\n hoverBackground: 'color-mix(in oklch, var(--surface1), var(--neutral6) 14%)',\n },\n surface: {\n background: 'var(--surface2)',\n hoverBackground: 'color-mix(in oklch, var(--surface2), var(--neutral6) 10%)',\n },\n transparent: {\n background: 'transparent',\n hoverBackground: 'transparent',\n },\n} satisfies Record<DataListStickyHeaderBackground, DataListStickyHeaderBackgroundValue>;\n\ntype DataListRootStyle = CSSProperties & {\n '--data-list-sticky-header-background'?: string;\n '--data-list-sticky-header-hover-background'?: string;\n};\n\nfunction getDataListMask(mask: ScrollAreaMask | undefined): ScrollAreaMask {\n if (mask === undefined) return { top: false };\n if (typeof mask === 'object') return { top: false, ...mask };\n\n return mask;\n}\n\n/**\n * Root grid styling per `variant`. Kept module-private (an exported cva in a\n * `.tsx` trips react-refresh). The borderless table treatments are driven\n * entirely from the root with CSS descendant selectors on the `.data-list-top` /\n * `.data-list-row` markers - the header and row primitives stay untouched, no JS\n * per-row index:\n * - no container fill or border: rows composite over any view.\n * - `gap-y-px`: a uniform 1px gap between every grid track (header and rows).\n * - header: a contrasting band that owns the radius (the container no longer\n * rounds/clips) — `rounded-t-xl` top, `rounded-b-md` bottom to match the rows\n * sitting below the 1px gap, no hairline.\n * - rows: full-bleed, `rounded-md` (last row included); rows zero\n * their own margins so the grid gap is the only spacing.\n * - striped adds translucent zebra tints with `:even`; hover & focus use `!` so\n * they still win over root-level row styling.\n */\nconst borderlessTableStyles = [\n 'gap-y-px',\n // A shared opaque tint gives both column headers and sticky row headers the\n // same treatment without revealing scrolled content beneath sticky surfaces.\n '[&_.data-list-top]:mx-0 [&_.data-list-top]:bg-[var(--data-list-sticky-header-background)] [&_.data-list-top]:after:hidden',\n '[&_.data-list-top]:rounded-t-xl [&_.data-list-top]:rounded-b-md',\n // header column separators: a short, faint vertical line centered in the gap\n // to the left of every header cell but the first. A `before` pseudo (not a\n // `border-l` + padding) keeps header text aligned with the row cells below.\n // The cell's default `overflow-hidden` would clip a gap-positioned pseudo, so\n // these cells switch to `overflow-visible`; the title text still truncates via\n // its inner `truncate` span, so nothing else spills.\n '[&_.data-list-top>*:not(:first-child)]:relative [&_.data-list-top>*:not(:first-child)]:overflow-visible',\n '[&_.data-list-top>*:not(:first-child)]:before:absolute [&_.data-list-top>*:not(:first-child)]:before:-left-4 [&_.data-list-top>*:not(:first-child)]:before:top-1/2 [&_.data-list-top>*:not(:first-child)]:before:-translate-y-1/2 [&_.data-list-top>*:not(:first-child)]:before:h-4 [&_.data-list-top>*:not(:first-child)]:before:w-px [&_.data-list-top>*:not(:first-child)]:before:bg-border2 [&_.data-list-top>*:not(:first-child)]:before:content-[\"\"]',\n '[&_.data-list-row]:mx-0 [&_.data-list-row]:my-0 [&_.data-list-row]:rounded-md',\n '[&_.data-list-row]:hover:bg-surface-overlay-strong!',\n '[&_.data-list-row]:focus-visible:bg-surface-overlay-strong!',\n '[&_.data-list-row>.data-list-sticky-start]:bg-[var(--data-list-sticky-header-background)]',\n '[&_.data-list-row>.data-list-sticky-start]:after:right-0',\n '[&_.data-list-row:hover>.data-list-sticky-start]:bg-[var(--data-list-sticky-header-hover-background)]',\n '[&_.data-list-row:focus-visible>.data-list-sticky-start]:bg-[var(--data-list-sticky-header-hover-background)]',\n '[&_.data-list-row:focus-within>.data-list-sticky-start]:bg-[var(--data-list-sticky-header-hover-background)]',\n '[&_.data-list-top>.data-list-sticky-start]:after:right-0',\n '[&_.data-list-top>.data-list-sticky-start+*]:before:hidden',\n] as const;\n\nconst dataListFitClasses: Record<DataListFit, string> = {\n content: 'w-max max-w-none min-w-full',\n container: 'w-full max-w-full',\n};\n\nconst dataListRootVariants = cva(cn('grid content-start'), {\n variants: {\n variant: {\n striped: cn(\n ...borderlessTableStyles,\n '[&_.data-list-row]:after:hidden',\n '[&_.data-list-row]:even:bg-surface-overlay-soft',\n ),\n lined: cn(\n ...borderlessTableStyles,\n '[&_.data-list-row]:after:pointer-events-none [&_.data-list-row]:after:absolute [&_.data-list-row]:after:h-px [&_.data-list-row]:after:content-[\"\"]',\n '[&_.data-list-row]:after:inset-x-2 [&_.data-list-row]:after:-bottom-px [&_.data-list-row]:after:bg-neutral6/10',\n ),\n },\n },\n defaultVariants: {\n variant: 'lined',\n },\n});\n\nexport function DataListRoot({\n children,\n columns,\n className,\n variant = 'lined',\n fit = 'content',\n stickyHeaderBackground = 'tinted',\n mask,\n scrollRef,\n ...props\n}: DataListRootProps) {\n const stickyHeaderColors = stickyHeaderBackgroundValues[stickyHeaderBackground];\n const gridStyle: DataListRootStyle = {\n '--data-list-sticky-header-background': stickyHeaderColors.background,\n '--data-list-sticky-header-hover-background': stickyHeaderColors.hoverBackground,\n gridTemplateColumns: columns,\n };\n\n const grid = (\n <div\n // Lists scroll inside the ScrollArea viewport (below); the grid just lays out.\n className={cn(dataListRootVariants({ variant }), dataListFitClasses[fit])}\n style={gridStyle}\n >\n {children}\n </div>\n );\n\n // DataList uses the DS ScrollArea: an overlay scrollbar (no reserved gutter,\n // so the sticky header spans the full width and both top corners clip cleanly)\n // plus the default edge fades. When the list virtualizes it passes a\n // `scrollRef`; forwarding it as `viewportRef` makes the virtualizer scroll\n // this viewport.\n //\n // `rounded-t-xl` clips the viewport top. Masks default to every overflowing\n // edge except the top — a top fade would fade the opaque sticky header.\n return (\n <ScrollArea\n {...props}\n orientation=\"both\"\n mask={getDataListMask(mask)}\n viewportRef={scrollRef}\n viewPortClassName=\"max-h-[inherit]\"\n className={cn('size-full rounded-t-xl', className)}\n >\n {grid}\n </ScrollArea>\n );\n}\n","import { createContext, useContext } from 'react';\n\nexport const DataListRowWrapperContext = createContext(false);\n\nexport function useDataListRowWrapperContext() {\n return useContext(DataListRowWrapperContext);\n}\n","import { forwardRef } from 'react';\nimport type { ComponentPropsWithoutRef } from 'react';\nimport { useDataListRowWrapperContext } from './data-list-row-wrapper-context';\nimport { dataListRowInteractiveStyles, dataListRowStyles, dataListRowVariants } from './shared';\nimport type { DataListRowSharedProps } from './shared';\nimport { cn } from '@/lib/utils';\n\nexport type DataListRowButtonProps = ComponentPropsWithoutRef<'button'> & DataListRowSharedProps;\n\n/**\n * Forwarded ref + spread props so virtualizers (`useVirtualizer.measureElement`)\n * can attach a ref and `data-index` to each rendered row.\n */\nexport const DataListRowButton = forwardRef<HTMLButtonElement, DataListRowButtonProps>(\n (\n {\n children,\n className,\n type = 'button',\n flushLeft,\n flushRight,\n colStart,\n colEnd,\n featured,\n variant,\n style,\n ...rest\n },\n ref,\n ) => {\n const isWrapped = useDataListRowWrapperContext();\n const hasColumnOverride = colStart !== undefined || colEnd !== undefined;\n const resolvedStyle = hasColumnOverride ? { ...style, gridColumn: `${colStart ?? 1} / ${colEnd ?? -1}` } : style;\n return (\n <button\n ref={ref}\n type={type}\n className={cn(\n ...(isWrapped ? dataListRowInteractiveStyles : dataListRowStyles),\n 'text-left',\n !isWrapped && flushLeft && 'ml-0!',\n !isWrapped && flushRight && 'mr-0!',\n // `!` so the selection fill wins over borderless table root styling\n // (higher-specificity descendant rules); same color in `default`.\n featured && 'bg-surface4!',\n dataListRowVariants({ variant }),\n className,\n )}\n style={resolvedStyle}\n {...rest}\n >\n {children}\n </button>\n );\n },\n);\n\nDataListRowButton.displayName = 'DataListRowButton';\n","import type { CSSProperties, ReactNode } from 'react';\nimport { useDataListRowWrapperContext } from './data-list-row-wrapper-context';\nimport { dataListRowInteractiveStyles, dataListRowStyles, dataListRowVariants } from './shared';\nimport type { DataListRowSharedProps } from './shared';\nimport type { LinkComponent } from '@/ds/types/link-component';\nimport { cn } from '@/lib/utils';\n\nexport type DataListRowLinkProps = DataListRowSharedProps & {\n children: ReactNode;\n to: string;\n className?: string;\n style?: CSSProperties;\n LinkComponent?: LinkComponent;\n};\n\nexport function DataListRowLink({\n children,\n to,\n className,\n style,\n LinkComponent: Link = 'a',\n flushLeft,\n flushRight,\n colStart,\n colEnd,\n featured,\n variant,\n}: DataListRowLinkProps) {\n const isWrapped = useDataListRowWrapperContext();\n const hasColumnOverride = colStart !== undefined || colEnd !== undefined;\n const resolvedStyle = hasColumnOverride ? { ...style, gridColumn: `${colStart ?? 1} / ${colEnd ?? -1}` } : style;\n return (\n <Link\n href={to}\n className={cn(\n ...(isWrapped ? dataListRowInteractiveStyles : dataListRowStyles),\n !isWrapped && flushLeft && 'ml-0!',\n !isWrapped && flushRight && 'mr-0!',\n // `!` so the selection fill wins over borderless table root styling\n // (higher-specificity descendant rules); same color in `default`.\n featured && 'bg-surface4!',\n dataListRowVariants({ variant }),\n className,\n )}\n style={resolvedStyle}\n >\n {children}\n </Link>\n );\n}\n","import { forwardRef } from 'react';\nimport type { ComponentPropsWithoutRef } from 'react';\nimport { DataListRowWrapperContext } from './data-list-row-wrapper-context';\nimport { dataListRowOuterStyles } from './shared';\nimport { cn } from '@/lib/utils';\n\nexport type DataListRowWrapperProps = ComponentPropsWithoutRef<'div'>;\n\n/**\n * Non-interactive grid wrapper. Used to host a leading or trailing cell (e.g. a\n * selection checkbox or row actions) alongside a `DataList.RowButton` so\n * hover/focus/click only apply to the button portion. For standalone\n * interactive rows, use `DataList.RowButton` directly without this wrapper.\n *\n * Carries the row-level border + `.data-list-row` marker so separators and\n * sibling-aware rules behave the same in wrapped and standalone rows.\n */\nexport const DataListRowWrapper = forwardRef<HTMLDivElement, DataListRowWrapperProps>(\n ({ children, className, ...rest }, ref) => {\n return (\n <DataListRowWrapperContext.Provider value>\n <div\n ref={ref}\n className={cn('mx-1 grid grid-cols-subgrid gap-0', ...dataListRowOuterStyles, className)}\n {...rest}\n >\n {children}\n </div>\n </DataListRowWrapperContext.Provider>\n );\n },\n);\n\nDataListRowWrapper.displayName = 'DataListRowWrapper';\n","export type DataListSpacerProps = {\n /** Pixel height of the spacer. Pass 0 to render nothing. */\n height: number;\n};\n\n/**\n * Pads top/bottom of the visible window when virtualizing — preserves the\n * grid's total scroll height for the rows that aren't currently rendered.\n * Spans the full grid width so it doesn't disturb column layout.\n */\nexport function DataListSpacer({ height }: DataListSpacerProps) {\n if (height <= 0) return null;\n return <div className=\"col-span-full\" style={{ height }} />;\n}\n","import type { ComponentPropsWithoutRef } from 'react';\nimport { cn } from '@/lib/utils';\n\nexport type DataListTopProps = ComponentPropsWithoutRef<'div'> & {\n /**\n * Switch to a \"leading cell\" layout: drops the default gap between children\n * and the default left padding, so a leading cell (e.g. `TopSelectCell`)\n * sits flush against the grid edge and an inner `TopCells` group owns the\n * remaining column spacing. Mirrors how `Row` + `RowButton` compose.\n */\n hasLeadingCell?: boolean;\n};\n\nexport function DataListTop({ children, className, hasLeadingCell, ...props }: DataListTopProps) {\n return (\n <div\n className={cn(\n 'data-list-top sticky top-0 z-20 col-span-full mx-1 grid grid-cols-subgrid gap-8 bg-surface2 px-5 after:pointer-events-none after:absolute after:-inset-x-1 after:bottom-0 after:h-px after:bg-border1 after:content-[\"\"]',\n hasLeadingCell && 'gap-0 pl-0!',\n className,\n )}\n {...props}\n >\n {children}\n </div>\n );\n}\n","import type { ComponentPropsWithoutRef, ElementType, ReactNode } from 'react';\nimport { forwardRef } from 'react';\nimport { dataListStickyStartStyles } from './shared';\nimport type { DataListSticky } from './shared';\nimport { Checkbox } from '@/ds/components/Checkbox';\nimport { Tooltip, TooltipTrigger, TooltipContent } from '@/ds/components/Tooltip';\nimport { cn } from '@/lib/utils';\n\nexport type DataListTopCellProps = {\n children: ReactNode;\n className?: string;\n /**\n * HTML element rendered for the top cell. Defaults to `span`. Use `'label'`\n * when the cell wraps a labelable control (e.g. a select-all Checkbox).\n */\n as?: ElementType;\n /** Pins the top cell to the horizontal start edge while the list scrolls sideways. */\n sticky?: DataListSticky;\n} & Omit<ComponentPropsWithoutRef<'div'>, 'children' | 'className' | 'ref'>;\n\nexport const DataListTopCell = forwardRef<HTMLSpanElement, DataListTopCellProps>(\n ({ children, className, as, sticky, ...rest }, ref) => {\n const Component = as || 'span';\n const isText = typeof children === 'string' || typeof children === 'number';\n return (\n <Component\n ref={ref}\n className={cn(\n 'flex h-8 max-w-full min-w-0 items-center overflow-hidden py-1 text-ui-sm font-semibold tracking-tight whitespace-nowrap text-neutral2',\n sticky === 'start' && dataListStickyStartStyles,\n sticky === 'start' && '-mr-4 -ml-5 w-auto max-w-none rounded-tl-xl rounded-bl-md pr-4 pl-5',\n sticky === 'start' && 'z-20 bg-[var(--data-list-sticky-header-background)]',\n className,\n )}\n {...rest}\n >\n {/* Plain string/number titles truncate with an ellipsis; element children\n (icons, smart long/short labels, checkboxes) render as-is. */}\n {isText ? <span className=\"min-w-0 truncate\">{children}</span> : children}\n </Component>\n );\n },\n);\n\nexport type DataListTopCellWithTooltipProps = {\n children: ReactNode;\n tooltip: ReactNode;\n className?: string;\n};\n\nexport function DataListTopCellWithTooltip({ children, tooltip, className }: DataListTopCellWithTooltipProps) {\n return (\n <Tooltip>\n <TooltipTrigger>\n <DataListTopCell className={className}>{children}</DataListTopCell>\n </TooltipTrigger>\n <TooltipContent>{tooltip}</TooltipContent>\n </Tooltip>\n );\n}\n\nexport type DataListTopCellSmartProps = {\n long: ReactNode;\n short: ReactNode;\n tooltip?: string;\n breakpoint?: 'sm' | 'md' | 'lg' | 'xl' | '2xl';\n className?: string;\n};\n\nconst breakpointClasses: Record<'sm' | 'md' | 'lg' | 'xl' | '2xl', { show: string; hide: string }> = {\n sm: { show: 'hidden sm:inline-flex', hide: 'inline-flex sm:hidden' },\n md: { show: 'hidden md:inline-flex', hide: 'inline-flex md:hidden' },\n lg: { show: 'hidden lg:inline-flex', hide: 'inline-flex lg:hidden' },\n xl: { show: 'hidden xl:inline-flex', hide: 'inline-flex xl:hidden' },\n '2xl': { show: 'hidden 2xl:inline-flex', hide: 'inline-flex 2xl:hidden' },\n};\n\nexport function DataListTopCellSmart({\n long,\n short,\n tooltip,\n breakpoint = '2xl',\n className,\n}: DataListTopCellSmartProps) {\n const tooltipText = tooltip ?? (typeof long === 'string' ? long : undefined);\n const bp = breakpointClasses[breakpoint];\n\n const content = (\n <>\n <span className={cn('items-center gap-1', bp.show)}>{long}</span>\n <span className={cn('items-center gap-1', bp.hide)}>{short}</span>\n </>\n );\n\n if (tooltipText) {\n return (\n <DataListTopCellWithTooltip tooltip={tooltipText} className={cn('flex [&_svg]:size-[1.3em]', className)}>\n {content}\n </DataListTopCellWithTooltip>\n );\n }\n\n return <DataListTopCell className={cn('flex [&_svg]:size-[1.3em]', className)}>{content}</DataListTopCell>;\n}\n\nexport interface DataListTopSelectCellProps {\n /** Pass `'indeterminate'` when some — but not all — rows are selected. */\n checked: boolean | 'indeterminate';\n /** Toggles the global selection. Typically clears when fully selected, otherwise selects all. */\n onToggle: () => void;\n 'aria-label'?: string;\n}\n\nexport function DataListTopSelectCell({ checked, onToggle, ...rest }: DataListTopSelectCellProps) {\n return (\n <DataListTopCell\n as=\"label\"\n className=\"w-8 cursor-pointer justify-center overflow-visible px-0 py-0!\"\n onClick={e => e.stopPropagation()}\n >\n <Checkbox checked={checked} onCheckedChange={() => onToggle()} aria-label={rest['aria-label']} />\n </DataListTopCell>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -5,8 +5,8 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
5
5
|
const jsxRuntime = require('react/jsx-runtime');
|
|
6
6
|
const reactVirtual = require('@tanstack/react-virtual');
|
|
7
7
|
const React = require('react');
|
|
8
|
-
const logsDataList = require('../../../logs-data-list-
|
|
9
|
-
const dataListSkeleton = require('../../../data-list-skeleton
|
|
8
|
+
const logsDataList = require('../../../logs-data-list-DWf9fEtC.cjs');
|
|
9
|
+
const dataListSkeleton = require('../../../data-list-skeleton--tiF5mjH.cjs');
|
|
10
10
|
|
|
11
11
|
const COLUMNS = "6rem 9rem 5rem 10rem minmax(8rem,1fr) minmax(8rem,1fr)";
|
|
12
12
|
const ROW_HEIGHT = 36;
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
2
|
import { useVirtualizer } from '@tanstack/react-virtual';
|
|
3
3
|
import { useRef, useEffect } from 'react';
|
|
4
|
-
import { L as LogsDataList } from '../../../logs-data-list-
|
|
5
|
-
import { D as DataListSkeleton } from '../../../data-list-skeleton-
|
|
4
|
+
import { L as LogsDataList } from '../../../logs-data-list-CAa2nwZC.js';
|
|
5
|
+
import { D as DataListSkeleton } from '../../../data-list-skeleton-DeEqsrIz.js';
|
|
6
6
|
|
|
7
7
|
const COLUMNS = "6rem 9rem 5rem 10rem minmax(8rem,1fr) minmax(8rem,1fr)";
|
|
8
8
|
const ROW_HEIGHT = 36;
|
|
@@ -4,7 +4,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
4
4
|
|
|
5
5
|
const jsxRuntime = require('react/jsx-runtime');
|
|
6
6
|
const React = require('react');
|
|
7
|
-
const dataList = require('../../../data-list-
|
|
7
|
+
const dataList = require('../../../data-list-Cb-piK4z.cjs');
|
|
8
8
|
const metricsCard = require('../../../metrics-card-DmbKNY3U.cjs');
|
|
9
9
|
const tabsContent = require('../../../tabs-content-wBU5qmb6.cjs');
|
|
10
10
|
const tabsTab = require('../../../tabs-tab-BkUCE-4E.cjs');
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
2
2
|
import { useState } from 'react';
|
|
3
|
-
import { D as DataList } from '../../../data-list-
|
|
3
|
+
import { D as DataList } from '../../../data-list-CnQRIUyN.js';
|
|
4
4
|
import { M as MetricsCard } from '../../../metrics-card-C0lGcxb9.js';
|
|
5
5
|
import { T as TabContent } from '../../../tabs-content-XUh680fO.js';
|
|
6
6
|
import { b as Tabs, a as TabList, T as Tab } from '../../../tabs-tab-DDGltcUc.js';
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
4
4
|
|
|
5
5
|
const jsxRuntime = require('react/jsx-runtime');
|
|
6
|
-
const dataList = require('../../../data-list-
|
|
6
|
+
const dataList = require('../../../data-list-Cb-piK4z.cjs');
|
|
7
7
|
const metricsCard = require('../../../metrics-card-DmbKNY3U.cjs');
|
|
8
8
|
const domains_metrics_components_metricsUtils = require('./metrics-utils.cjs.js');
|
|
9
9
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
2
|
-
import { D as DataList } from '../../../data-list-
|
|
2
|
+
import { D as DataList } from '../../../data-list-CnQRIUyN.js';
|
|
3
3
|
import { M as MetricsCard } from '../../../metrics-card-C0lGcxb9.js';
|
|
4
4
|
import { formatCost, METRICS_DATA_LIST_PROPS } from './metrics-utils.es.js';
|
|
5
5
|
|
|
@@ -4,7 +4,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
|
4
4
|
|
|
5
5
|
const jsxRuntime = require('react/jsx-runtime');
|
|
6
6
|
const React = require('react');
|
|
7
|
-
const dataList = require('../../../data-list-
|
|
7
|
+
const dataList = require('../../../data-list-Cb-piK4z.cjs');
|
|
8
8
|
const metricsCard = require('../../../metrics-card-DmbKNY3U.cjs');
|
|
9
9
|
const metricsLineChart = require('../../../metrics-line-chart-B_0w522y.cjs');
|
|
10
10
|
const tabsContent = require('../../../tabs-content-wBU5qmb6.cjs');
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
2
|
import { useMemo } from 'react';
|
|
3
|
-
import { D as DataList } from '../../../data-list-
|
|
3
|
+
import { D as DataList } from '../../../data-list-CnQRIUyN.js';
|
|
4
4
|
import { M as MetricsCard } from '../../../metrics-card-C0lGcxb9.js';
|
|
5
5
|
import { M as MetricsLineChart } from '../../../metrics-line-chart-DudirJsu.js';
|
|
6
6
|
import { T as TabContent } from '../../../tabs-content-XUh680fO.js';
|
|
@@ -65,7 +65,7 @@ function buildTracesDrilldownUrl({
|
|
|
65
65
|
customRange,
|
|
66
66
|
dashboardFilter,
|
|
67
67
|
scope,
|
|
68
|
-
tracesBasePath = "/
|
|
68
|
+
tracesBasePath = "/traces"
|
|
69
69
|
}) {
|
|
70
70
|
const params = new URLSearchParams();
|
|
71
71
|
params.set(domains_traces_traceFilters.TRACE_LIST_MODE_PARAM, "branches");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drilldown.cjs.js","sources":["../../../src/domains/metrics/drilldown.ts"],"sourcesContent":["import type { EntityType } from '@mastra/core/observability';\nimport {\n LOGS_DATE_FROM_PARAM,\n LOGS_DATE_PRESET_PARAM,\n LOGS_DATE_TO_PARAM,\n LOGS_PROPERTY_FILTER_PARAM_BY_FIELD,\n LOGS_ROOT_ENTITY_TYPE_PARAM,\n} from '../logs/log-filters';\nimport type { LogsDatePreset } from '../logs/log-filters';\nimport {\n TRACE_DATE_FROM_PARAM,\n TRACE_DATE_PRESET_PARAM,\n TRACE_DATE_TO_PARAM,\n TRACE_LIST_MODE_PARAM,\n TRACE_PROPERTY_FILTER_PARAM_BY_FIELD,\n TRACE_ROOT_ENTITY_TYPE_PARAM,\n TRACE_STATUS_PARAM,\n} from '../traces/trace-filters';\nimport type { TraceDatePreset } from '../traces/types';\nimport type { DatePreset, DateRange } from './hooks/use-metrics';\nimport type { MetricsDimensionalFilter } from './metrics-filters';\n\n/** Map the metrics date preset (`24h`, `3d`, …) to the equivalent traces /\n * logs preset (`last-24h`, `last-3d`, …). `'custom'` is passed through and\n * explicit from/to dates are serialized separately. Returns `undefined` for\n * presets we can't translate — in that case we omit the date preset and rely\n * on concrete `from`/`to` timestamps. */\nfunction mapPreset(preset: DatePreset): TraceDatePreset | LogsDatePreset | undefined {\n switch (preset) {\n case '24h':\n return 'last-24h';\n case '3d':\n return 'last-3d';\n case '7d':\n return 'last-7d';\n case '14d':\n return 'last-14d';\n case '30d':\n return 'last-30d';\n case 'custom':\n return 'custom';\n default:\n return undefined;\n }\n}\n\n/** Narrow time window for a single chart node. Callers pass concrete start/end\n * Dates (typically bucket boundaries); these bypass the preset. */\nexport type DrilldownWindow = {\n from: Date;\n to: Date;\n};\n\n/** Narrow a raw timestamp into the time-series bucket window that surrounds\n * it. For a chart with `interval = 1h`, clicking a node at 14:37Z drills into\n * 14:00Z → 15:00Z. For `1d`, the corresponding UTC day. */\nexport function narrowWindowToBucket(tsMs: number, interval: '1h' | '1d'): DrilldownWindow {\n if (interval === '1h') {\n const from = new Date(tsMs);\n from.setUTCMinutes(0, 0, 0);\n const to = new Date(from.getTime() + 60 * 60 * 1000);\n return { from, to };\n }\n const from = new Date(tsMs);\n from.setUTCHours(0, 0, 0, 0);\n const to = new Date(from.getTime() + 24 * 60 * 60 * 1000);\n return { from, to };\n}\n\n/** Fields a card may use to scope the drilldown. Only the pieces the caller\n * knows are attached; everything else falls through to the current dashboard\n * filters. `status` is only valid for traces. */\nexport type DrilldownScope = {\n rootEntityType?: EntityType;\n entityName?: string;\n threadId?: string;\n resourceId?: string;\n model?: string;\n provider?: string;\n /** Trace-only. Valid for drill-downs from \"errors\" segments. */\n status?: 'running' | 'success' | 'error';\n /** Overrides date preset with explicit window bounds. */\n window?: DrilldownWindow;\n};\n\ntype BuildArgs = {\n /** Current metrics dashboard preset. */\n preset: DatePreset;\n /** Current metrics dashboard custom range (only honoured when preset === 'custom'). */\n customRange?: DateRange;\n /** Dashboard-level dimensional filters (environment, serviceName, tags, etc.). */\n dashboardFilter: MetricsDimensionalFilter;\n /** Per-card scoping applied on top of dashboard filters. */\n scope: DrilldownScope;\n /** Override the Traces page base path. Defaults to `/observability` (mastra Studio). */\n tracesBasePath?: string;\n /** Override the Logs page base path. Defaults to `/logs` (mastra Studio). */\n logsBasePath?: string;\n};\n\nfunction applyDate(\n params: URLSearchParams,\n presetKey: string,\n fromKey: string,\n toKey: string,\n preset: DatePreset,\n customRange: DateRange | undefined,\n window: DrilldownWindow | undefined,\n): void {\n // A concrete window always wins — it's a precise node-level drilldown.\n if (window) {\n params.set(presetKey, 'custom');\n params.set(fromKey, window.from.toISOString());\n params.set(toKey, window.to.toISOString());\n return;\n }\n if (preset === 'custom') {\n params.set(presetKey, 'custom');\n if (customRange?.from) params.set(fromKey, customRange.from.toISOString());\n if (customRange?.to) params.set(toKey, customRange.to.toISOString());\n return;\n }\n const mapped = mapPreset(preset);\n if (mapped) params.set(presetKey, mapped);\n}\n\nfunction setIfDefined(params: URLSearchParams, key: string, value: string | undefined | null): void {\n if (typeof value === 'string' && value.length > 0) {\n params.set(key, value);\n }\n}\n\nfunction appendArray(params: URLSearchParams, key: string, values: string[] | undefined): void {\n if (!Array.isArray(values) || values.length === 0) return;\n for (const v of values) if (v) params.append(key, v);\n}\n\n/** Build a relative URL to the Traces page pre-filtered by the dashboard\n * filters + per-card scope. */\nexport function buildTracesDrilldownUrl({\n preset,\n customRange,\n dashboardFilter,\n scope,\n tracesBasePath = '/observability',\n}: BuildArgs): string {\n const params = new URLSearchParams();\n params.set(TRACE_LIST_MODE_PARAM, 'branches');\n\n applyDate(\n params,\n TRACE_DATE_PRESET_PARAM,\n TRACE_DATE_FROM_PARAM,\n TRACE_DATE_TO_PARAM,\n preset,\n customRange,\n scope.window,\n );\n\n // Scope overrides dashboard filter when both are present.\n const rootEntityType = scope.rootEntityType ?? dashboardFilter.rootEntityType;\n if (rootEntityType) params.set(TRACE_ROOT_ENTITY_TYPE_PARAM, rootEntityType);\n\n if (scope.status) params.set(TRACE_STATUS_PARAM, scope.status);\n\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.entityName, scope.entityName ?? dashboardFilter.entityName);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.threadId, scope.threadId ?? dashboardFilter.threadId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.resourceId, scope.resourceId ?? dashboardFilter.resourceId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.entityId, dashboardFilter.entityId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.runId, dashboardFilter.runId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.sessionId, dashboardFilter.sessionId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.requestId, dashboardFilter.requestId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.userId, dashboardFilter.userId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.organizationId, dashboardFilter.organizationId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.experimentId, dashboardFilter.experimentId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.serviceName, dashboardFilter.serviceName);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.environment, dashboardFilter.environment);\n appendArray(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.tags, dashboardFilter.tags);\n\n const query = params.toString();\n return query ? `${tracesBasePath}?${query}` : tracesBasePath;\n}\n\n/** Build a relative URL to the Logs page pre-filtered by the dashboard filters\n * + per-card scope. Useful for \"View errors in logs\" affordances. */\nexport function buildLogsDrilldownUrl({\n preset,\n customRange,\n dashboardFilter,\n scope,\n logsBasePath = '/logs',\n}: BuildArgs): string {\n const params = new URLSearchParams();\n\n applyDate(\n params,\n LOGS_DATE_PRESET_PARAM,\n LOGS_DATE_FROM_PARAM,\n LOGS_DATE_TO_PARAM,\n preset,\n customRange,\n scope.window,\n );\n\n const rootEntityType = scope.rootEntityType ?? dashboardFilter.rootEntityType;\n if (rootEntityType) params.set(LOGS_ROOT_ENTITY_TYPE_PARAM, rootEntityType);\n\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.entityName, scope.entityName ?? dashboardFilter.entityName);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.threadId, scope.threadId ?? dashboardFilter.threadId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.resourceId, scope.resourceId ?? dashboardFilter.resourceId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.runId, dashboardFilter.runId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.sessionId, dashboardFilter.sessionId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.requestId, dashboardFilter.requestId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.userId, dashboardFilter.userId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.organizationId, dashboardFilter.organizationId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.experimentId, dashboardFilter.experimentId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.serviceName, dashboardFilter.serviceName);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.environment, dashboardFilter.environment);\n appendArray(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.tags, dashboardFilter.tags);\n\n // Error drill-ins always target log level=error. Status filter isn't valid\n // for logs, so we translate `status: 'error'` to `filterLevel=error`.\n if (scope.status === 'error') {\n params.append(LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.level, 'error');\n }\n\n const query = params.toString();\n return query ? `${logsBasePath}?${query}` : logsBasePath;\n}\n"],"names":["from","to","TRACE_LIST_MODE_PARAM","TRACE_DATE_PRESET_PARAM","TRACE_DATE_FROM_PARAM","TRACE_DATE_TO_PARAM","TRACE_ROOT_ENTITY_TYPE_PARAM","TRACE_STATUS_PARAM","TRACE_PROPERTY_FILTER_PARAM_BY_FIELD","LOGS_DATE_PRESET_PARAM","LOGS_DATE_FROM_PARAM","LOGS_DATE_TO_PARAM","LOGS_ROOT_ENTITY_TYPE_PARAM","LOGS_PROPERTY_FILTER_PARAM_BY_FIELD"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"drilldown.cjs.js","sources":["../../../src/domains/metrics/drilldown.ts"],"sourcesContent":["import type { EntityType } from '@mastra/core/observability';\nimport {\n LOGS_DATE_FROM_PARAM,\n LOGS_DATE_PRESET_PARAM,\n LOGS_DATE_TO_PARAM,\n LOGS_PROPERTY_FILTER_PARAM_BY_FIELD,\n LOGS_ROOT_ENTITY_TYPE_PARAM,\n} from '../logs/log-filters';\nimport type { LogsDatePreset } from '../logs/log-filters';\nimport {\n TRACE_DATE_FROM_PARAM,\n TRACE_DATE_PRESET_PARAM,\n TRACE_DATE_TO_PARAM,\n TRACE_LIST_MODE_PARAM,\n TRACE_PROPERTY_FILTER_PARAM_BY_FIELD,\n TRACE_ROOT_ENTITY_TYPE_PARAM,\n TRACE_STATUS_PARAM,\n} from '../traces/trace-filters';\nimport type { TraceDatePreset } from '../traces/types';\nimport type { DatePreset, DateRange } from './hooks/use-metrics';\nimport type { MetricsDimensionalFilter } from './metrics-filters';\n\n/** Map the metrics date preset (`24h`, `3d`, …) to the equivalent traces /\n * logs preset (`last-24h`, `last-3d`, …). `'custom'` is passed through and\n * explicit from/to dates are serialized separately. Returns `undefined` for\n * presets we can't translate — in that case we omit the date preset and rely\n * on concrete `from`/`to` timestamps. */\nfunction mapPreset(preset: DatePreset): TraceDatePreset | LogsDatePreset | undefined {\n switch (preset) {\n case '24h':\n return 'last-24h';\n case '3d':\n return 'last-3d';\n case '7d':\n return 'last-7d';\n case '14d':\n return 'last-14d';\n case '30d':\n return 'last-30d';\n case 'custom':\n return 'custom';\n default:\n return undefined;\n }\n}\n\n/** Narrow time window for a single chart node. Callers pass concrete start/end\n * Dates (typically bucket boundaries); these bypass the preset. */\nexport type DrilldownWindow = {\n from: Date;\n to: Date;\n};\n\n/** Narrow a raw timestamp into the time-series bucket window that surrounds\n * it. For a chart with `interval = 1h`, clicking a node at 14:37Z drills into\n * 14:00Z → 15:00Z. For `1d`, the corresponding UTC day. */\nexport function narrowWindowToBucket(tsMs: number, interval: '1h' | '1d'): DrilldownWindow {\n if (interval === '1h') {\n const from = new Date(tsMs);\n from.setUTCMinutes(0, 0, 0);\n const to = new Date(from.getTime() + 60 * 60 * 1000);\n return { from, to };\n }\n const from = new Date(tsMs);\n from.setUTCHours(0, 0, 0, 0);\n const to = new Date(from.getTime() + 24 * 60 * 60 * 1000);\n return { from, to };\n}\n\n/** Fields a card may use to scope the drilldown. Only the pieces the caller\n * knows are attached; everything else falls through to the current dashboard\n * filters. `status` is only valid for traces. */\nexport type DrilldownScope = {\n rootEntityType?: EntityType;\n entityName?: string;\n threadId?: string;\n resourceId?: string;\n model?: string;\n provider?: string;\n /** Trace-only. Valid for drill-downs from \"errors\" segments. */\n status?: 'running' | 'success' | 'error';\n /** Overrides date preset with explicit window bounds. */\n window?: DrilldownWindow;\n};\n\ntype BuildArgs = {\n /** Current metrics dashboard preset. */\n preset: DatePreset;\n /** Current metrics dashboard custom range (only honoured when preset === 'custom'). */\n customRange?: DateRange;\n /** Dashboard-level dimensional filters (environment, serviceName, tags, etc.). */\n dashboardFilter: MetricsDimensionalFilter;\n /** Per-card scoping applied on top of dashboard filters. */\n scope: DrilldownScope;\n /** Override the Traces page base path. Defaults to `/traces` (mastra Studio). */\n tracesBasePath?: string;\n /** Override the Logs page base path. Defaults to `/logs` (mastra Studio). */\n logsBasePath?: string;\n};\n\nfunction applyDate(\n params: URLSearchParams,\n presetKey: string,\n fromKey: string,\n toKey: string,\n preset: DatePreset,\n customRange: DateRange | undefined,\n window: DrilldownWindow | undefined,\n): void {\n // A concrete window always wins — it's a precise node-level drilldown.\n if (window) {\n params.set(presetKey, 'custom');\n params.set(fromKey, window.from.toISOString());\n params.set(toKey, window.to.toISOString());\n return;\n }\n if (preset === 'custom') {\n params.set(presetKey, 'custom');\n if (customRange?.from) params.set(fromKey, customRange.from.toISOString());\n if (customRange?.to) params.set(toKey, customRange.to.toISOString());\n return;\n }\n const mapped = mapPreset(preset);\n if (mapped) params.set(presetKey, mapped);\n}\n\nfunction setIfDefined(params: URLSearchParams, key: string, value: string | undefined | null): void {\n if (typeof value === 'string' && value.length > 0) {\n params.set(key, value);\n }\n}\n\nfunction appendArray(params: URLSearchParams, key: string, values: string[] | undefined): void {\n if (!Array.isArray(values) || values.length === 0) return;\n for (const v of values) if (v) params.append(key, v);\n}\n\n/** Build a relative URL to the Traces page pre-filtered by the dashboard\n * filters + per-card scope. */\nexport function buildTracesDrilldownUrl({\n preset,\n customRange,\n dashboardFilter,\n scope,\n tracesBasePath = '/traces',\n}: BuildArgs): string {\n const params = new URLSearchParams();\n params.set(TRACE_LIST_MODE_PARAM, 'branches');\n\n applyDate(\n params,\n TRACE_DATE_PRESET_PARAM,\n TRACE_DATE_FROM_PARAM,\n TRACE_DATE_TO_PARAM,\n preset,\n customRange,\n scope.window,\n );\n\n // Scope overrides dashboard filter when both are present.\n const rootEntityType = scope.rootEntityType ?? dashboardFilter.rootEntityType;\n if (rootEntityType) params.set(TRACE_ROOT_ENTITY_TYPE_PARAM, rootEntityType);\n\n if (scope.status) params.set(TRACE_STATUS_PARAM, scope.status);\n\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.entityName, scope.entityName ?? dashboardFilter.entityName);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.threadId, scope.threadId ?? dashboardFilter.threadId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.resourceId, scope.resourceId ?? dashboardFilter.resourceId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.entityId, dashboardFilter.entityId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.runId, dashboardFilter.runId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.sessionId, dashboardFilter.sessionId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.requestId, dashboardFilter.requestId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.userId, dashboardFilter.userId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.organizationId, dashboardFilter.organizationId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.experimentId, dashboardFilter.experimentId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.serviceName, dashboardFilter.serviceName);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.environment, dashboardFilter.environment);\n appendArray(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.tags, dashboardFilter.tags);\n\n const query = params.toString();\n return query ? `${tracesBasePath}?${query}` : tracesBasePath;\n}\n\n/** Build a relative URL to the Logs page pre-filtered by the dashboard filters\n * + per-card scope. Useful for \"View errors in logs\" affordances. */\nexport function buildLogsDrilldownUrl({\n preset,\n customRange,\n dashboardFilter,\n scope,\n logsBasePath = '/logs',\n}: BuildArgs): string {\n const params = new URLSearchParams();\n\n applyDate(\n params,\n LOGS_DATE_PRESET_PARAM,\n LOGS_DATE_FROM_PARAM,\n LOGS_DATE_TO_PARAM,\n preset,\n customRange,\n scope.window,\n );\n\n const rootEntityType = scope.rootEntityType ?? dashboardFilter.rootEntityType;\n if (rootEntityType) params.set(LOGS_ROOT_ENTITY_TYPE_PARAM, rootEntityType);\n\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.entityName, scope.entityName ?? dashboardFilter.entityName);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.threadId, scope.threadId ?? dashboardFilter.threadId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.resourceId, scope.resourceId ?? dashboardFilter.resourceId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.runId, dashboardFilter.runId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.sessionId, dashboardFilter.sessionId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.requestId, dashboardFilter.requestId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.userId, dashboardFilter.userId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.organizationId, dashboardFilter.organizationId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.experimentId, dashboardFilter.experimentId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.serviceName, dashboardFilter.serviceName);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.environment, dashboardFilter.environment);\n appendArray(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.tags, dashboardFilter.tags);\n\n // Error drill-ins always target log level=error. Status filter isn't valid\n // for logs, so we translate `status: 'error'` to `filterLevel=error`.\n if (scope.status === 'error') {\n params.append(LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.level, 'error');\n }\n\n const query = params.toString();\n return query ? `${logsBasePath}?${query}` : logsBasePath;\n}\n"],"names":["from","to","TRACE_LIST_MODE_PARAM","TRACE_DATE_PRESET_PARAM","TRACE_DATE_FROM_PARAM","TRACE_DATE_TO_PARAM","TRACE_ROOT_ENTITY_TYPE_PARAM","TRACE_STATUS_PARAM","TRACE_PROPERTY_FILTER_PARAM_BY_FIELD","LOGS_DATE_PRESET_PARAM","LOGS_DATE_FROM_PARAM","LOGS_DATE_TO_PARAM","LOGS_ROOT_ENTITY_TYPE_PARAM","LOGS_PROPERTY_FILTER_PARAM_BY_FIELD"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drilldown.es.js","sources":["../../../src/domains/metrics/drilldown.ts"],"sourcesContent":["import type { EntityType } from '@mastra/core/observability';\nimport {\n LOGS_DATE_FROM_PARAM,\n LOGS_DATE_PRESET_PARAM,\n LOGS_DATE_TO_PARAM,\n LOGS_PROPERTY_FILTER_PARAM_BY_FIELD,\n LOGS_ROOT_ENTITY_TYPE_PARAM,\n} from '../logs/log-filters';\nimport type { LogsDatePreset } from '../logs/log-filters';\nimport {\n TRACE_DATE_FROM_PARAM,\n TRACE_DATE_PRESET_PARAM,\n TRACE_DATE_TO_PARAM,\n TRACE_LIST_MODE_PARAM,\n TRACE_PROPERTY_FILTER_PARAM_BY_FIELD,\n TRACE_ROOT_ENTITY_TYPE_PARAM,\n TRACE_STATUS_PARAM,\n} from '../traces/trace-filters';\nimport type { TraceDatePreset } from '../traces/types';\nimport type { DatePreset, DateRange } from './hooks/use-metrics';\nimport type { MetricsDimensionalFilter } from './metrics-filters';\n\n/** Map the metrics date preset (`24h`, `3d`, …) to the equivalent traces /\n * logs preset (`last-24h`, `last-3d`, …). `'custom'` is passed through and\n * explicit from/to dates are serialized separately. Returns `undefined` for\n * presets we can't translate — in that case we omit the date preset and rely\n * on concrete `from`/`to` timestamps. */\nfunction mapPreset(preset: DatePreset): TraceDatePreset | LogsDatePreset | undefined {\n switch (preset) {\n case '24h':\n return 'last-24h';\n case '3d':\n return 'last-3d';\n case '7d':\n return 'last-7d';\n case '14d':\n return 'last-14d';\n case '30d':\n return 'last-30d';\n case 'custom':\n return 'custom';\n default:\n return undefined;\n }\n}\n\n/** Narrow time window for a single chart node. Callers pass concrete start/end\n * Dates (typically bucket boundaries); these bypass the preset. */\nexport type DrilldownWindow = {\n from: Date;\n to: Date;\n};\n\n/** Narrow a raw timestamp into the time-series bucket window that surrounds\n * it. For a chart with `interval = 1h`, clicking a node at 14:37Z drills into\n * 14:00Z → 15:00Z. For `1d`, the corresponding UTC day. */\nexport function narrowWindowToBucket(tsMs: number, interval: '1h' | '1d'): DrilldownWindow {\n if (interval === '1h') {\n const from = new Date(tsMs);\n from.setUTCMinutes(0, 0, 0);\n const to = new Date(from.getTime() + 60 * 60 * 1000);\n return { from, to };\n }\n const from = new Date(tsMs);\n from.setUTCHours(0, 0, 0, 0);\n const to = new Date(from.getTime() + 24 * 60 * 60 * 1000);\n return { from, to };\n}\n\n/** Fields a card may use to scope the drilldown. Only the pieces the caller\n * knows are attached; everything else falls through to the current dashboard\n * filters. `status` is only valid for traces. */\nexport type DrilldownScope = {\n rootEntityType?: EntityType;\n entityName?: string;\n threadId?: string;\n resourceId?: string;\n model?: string;\n provider?: string;\n /** Trace-only. Valid for drill-downs from \"errors\" segments. */\n status?: 'running' | 'success' | 'error';\n /** Overrides date preset with explicit window bounds. */\n window?: DrilldownWindow;\n};\n\ntype BuildArgs = {\n /** Current metrics dashboard preset. */\n preset: DatePreset;\n /** Current metrics dashboard custom range (only honoured when preset === 'custom'). */\n customRange?: DateRange;\n /** Dashboard-level dimensional filters (environment, serviceName, tags, etc.). */\n dashboardFilter: MetricsDimensionalFilter;\n /** Per-card scoping applied on top of dashboard filters. */\n scope: DrilldownScope;\n /** Override the Traces page base path. Defaults to `/observability` (mastra Studio). */\n tracesBasePath?: string;\n /** Override the Logs page base path. Defaults to `/logs` (mastra Studio). */\n logsBasePath?: string;\n};\n\nfunction applyDate(\n params: URLSearchParams,\n presetKey: string,\n fromKey: string,\n toKey: string,\n preset: DatePreset,\n customRange: DateRange | undefined,\n window: DrilldownWindow | undefined,\n): void {\n // A concrete window always wins — it's a precise node-level drilldown.\n if (window) {\n params.set(presetKey, 'custom');\n params.set(fromKey, window.from.toISOString());\n params.set(toKey, window.to.toISOString());\n return;\n }\n if (preset === 'custom') {\n params.set(presetKey, 'custom');\n if (customRange?.from) params.set(fromKey, customRange.from.toISOString());\n if (customRange?.to) params.set(toKey, customRange.to.toISOString());\n return;\n }\n const mapped = mapPreset(preset);\n if (mapped) params.set(presetKey, mapped);\n}\n\nfunction setIfDefined(params: URLSearchParams, key: string, value: string | undefined | null): void {\n if (typeof value === 'string' && value.length > 0) {\n params.set(key, value);\n }\n}\n\nfunction appendArray(params: URLSearchParams, key: string, values: string[] | undefined): void {\n if (!Array.isArray(values) || values.length === 0) return;\n for (const v of values) if (v) params.append(key, v);\n}\n\n/** Build a relative URL to the Traces page pre-filtered by the dashboard\n * filters + per-card scope. */\nexport function buildTracesDrilldownUrl({\n preset,\n customRange,\n dashboardFilter,\n scope,\n tracesBasePath = '/observability',\n}: BuildArgs): string {\n const params = new URLSearchParams();\n params.set(TRACE_LIST_MODE_PARAM, 'branches');\n\n applyDate(\n params,\n TRACE_DATE_PRESET_PARAM,\n TRACE_DATE_FROM_PARAM,\n TRACE_DATE_TO_PARAM,\n preset,\n customRange,\n scope.window,\n );\n\n // Scope overrides dashboard filter when both are present.\n const rootEntityType = scope.rootEntityType ?? dashboardFilter.rootEntityType;\n if (rootEntityType) params.set(TRACE_ROOT_ENTITY_TYPE_PARAM, rootEntityType);\n\n if (scope.status) params.set(TRACE_STATUS_PARAM, scope.status);\n\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.entityName, scope.entityName ?? dashboardFilter.entityName);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.threadId, scope.threadId ?? dashboardFilter.threadId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.resourceId, scope.resourceId ?? dashboardFilter.resourceId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.entityId, dashboardFilter.entityId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.runId, dashboardFilter.runId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.sessionId, dashboardFilter.sessionId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.requestId, dashboardFilter.requestId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.userId, dashboardFilter.userId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.organizationId, dashboardFilter.organizationId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.experimentId, dashboardFilter.experimentId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.serviceName, dashboardFilter.serviceName);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.environment, dashboardFilter.environment);\n appendArray(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.tags, dashboardFilter.tags);\n\n const query = params.toString();\n return query ? `${tracesBasePath}?${query}` : tracesBasePath;\n}\n\n/** Build a relative URL to the Logs page pre-filtered by the dashboard filters\n * + per-card scope. Useful for \"View errors in logs\" affordances. */\nexport function buildLogsDrilldownUrl({\n preset,\n customRange,\n dashboardFilter,\n scope,\n logsBasePath = '/logs',\n}: BuildArgs): string {\n const params = new URLSearchParams();\n\n applyDate(\n params,\n LOGS_DATE_PRESET_PARAM,\n LOGS_DATE_FROM_PARAM,\n LOGS_DATE_TO_PARAM,\n preset,\n customRange,\n scope.window,\n );\n\n const rootEntityType = scope.rootEntityType ?? dashboardFilter.rootEntityType;\n if (rootEntityType) params.set(LOGS_ROOT_ENTITY_TYPE_PARAM, rootEntityType);\n\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.entityName, scope.entityName ?? dashboardFilter.entityName);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.threadId, scope.threadId ?? dashboardFilter.threadId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.resourceId, scope.resourceId ?? dashboardFilter.resourceId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.runId, dashboardFilter.runId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.sessionId, dashboardFilter.sessionId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.requestId, dashboardFilter.requestId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.userId, dashboardFilter.userId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.organizationId, dashboardFilter.organizationId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.experimentId, dashboardFilter.experimentId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.serviceName, dashboardFilter.serviceName);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.environment, dashboardFilter.environment);\n appendArray(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.tags, dashboardFilter.tags);\n\n // Error drill-ins always target log level=error. Status filter isn't valid\n // for logs, so we translate `status: 'error'` to `filterLevel=error`.\n if (scope.status === 'error') {\n params.append(LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.level, 'error');\n }\n\n const query = params.toString();\n return query ? `${logsBasePath}?${query}` : logsBasePath;\n}\n"],"names":["from","to"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"drilldown.es.js","sources":["../../../src/domains/metrics/drilldown.ts"],"sourcesContent":["import type { EntityType } from '@mastra/core/observability';\nimport {\n LOGS_DATE_FROM_PARAM,\n LOGS_DATE_PRESET_PARAM,\n LOGS_DATE_TO_PARAM,\n LOGS_PROPERTY_FILTER_PARAM_BY_FIELD,\n LOGS_ROOT_ENTITY_TYPE_PARAM,\n} from '../logs/log-filters';\nimport type { LogsDatePreset } from '../logs/log-filters';\nimport {\n TRACE_DATE_FROM_PARAM,\n TRACE_DATE_PRESET_PARAM,\n TRACE_DATE_TO_PARAM,\n TRACE_LIST_MODE_PARAM,\n TRACE_PROPERTY_FILTER_PARAM_BY_FIELD,\n TRACE_ROOT_ENTITY_TYPE_PARAM,\n TRACE_STATUS_PARAM,\n} from '../traces/trace-filters';\nimport type { TraceDatePreset } from '../traces/types';\nimport type { DatePreset, DateRange } from './hooks/use-metrics';\nimport type { MetricsDimensionalFilter } from './metrics-filters';\n\n/** Map the metrics date preset (`24h`, `3d`, …) to the equivalent traces /\n * logs preset (`last-24h`, `last-3d`, …). `'custom'` is passed through and\n * explicit from/to dates are serialized separately. Returns `undefined` for\n * presets we can't translate — in that case we omit the date preset and rely\n * on concrete `from`/`to` timestamps. */\nfunction mapPreset(preset: DatePreset): TraceDatePreset | LogsDatePreset | undefined {\n switch (preset) {\n case '24h':\n return 'last-24h';\n case '3d':\n return 'last-3d';\n case '7d':\n return 'last-7d';\n case '14d':\n return 'last-14d';\n case '30d':\n return 'last-30d';\n case 'custom':\n return 'custom';\n default:\n return undefined;\n }\n}\n\n/** Narrow time window for a single chart node. Callers pass concrete start/end\n * Dates (typically bucket boundaries); these bypass the preset. */\nexport type DrilldownWindow = {\n from: Date;\n to: Date;\n};\n\n/** Narrow a raw timestamp into the time-series bucket window that surrounds\n * it. For a chart with `interval = 1h`, clicking a node at 14:37Z drills into\n * 14:00Z → 15:00Z. For `1d`, the corresponding UTC day. */\nexport function narrowWindowToBucket(tsMs: number, interval: '1h' | '1d'): DrilldownWindow {\n if (interval === '1h') {\n const from = new Date(tsMs);\n from.setUTCMinutes(0, 0, 0);\n const to = new Date(from.getTime() + 60 * 60 * 1000);\n return { from, to };\n }\n const from = new Date(tsMs);\n from.setUTCHours(0, 0, 0, 0);\n const to = new Date(from.getTime() + 24 * 60 * 60 * 1000);\n return { from, to };\n}\n\n/** Fields a card may use to scope the drilldown. Only the pieces the caller\n * knows are attached; everything else falls through to the current dashboard\n * filters. `status` is only valid for traces. */\nexport type DrilldownScope = {\n rootEntityType?: EntityType;\n entityName?: string;\n threadId?: string;\n resourceId?: string;\n model?: string;\n provider?: string;\n /** Trace-only. Valid for drill-downs from \"errors\" segments. */\n status?: 'running' | 'success' | 'error';\n /** Overrides date preset with explicit window bounds. */\n window?: DrilldownWindow;\n};\n\ntype BuildArgs = {\n /** Current metrics dashboard preset. */\n preset: DatePreset;\n /** Current metrics dashboard custom range (only honoured when preset === 'custom'). */\n customRange?: DateRange;\n /** Dashboard-level dimensional filters (environment, serviceName, tags, etc.). */\n dashboardFilter: MetricsDimensionalFilter;\n /** Per-card scoping applied on top of dashboard filters. */\n scope: DrilldownScope;\n /** Override the Traces page base path. Defaults to `/traces` (mastra Studio). */\n tracesBasePath?: string;\n /** Override the Logs page base path. Defaults to `/logs` (mastra Studio). */\n logsBasePath?: string;\n};\n\nfunction applyDate(\n params: URLSearchParams,\n presetKey: string,\n fromKey: string,\n toKey: string,\n preset: DatePreset,\n customRange: DateRange | undefined,\n window: DrilldownWindow | undefined,\n): void {\n // A concrete window always wins — it's a precise node-level drilldown.\n if (window) {\n params.set(presetKey, 'custom');\n params.set(fromKey, window.from.toISOString());\n params.set(toKey, window.to.toISOString());\n return;\n }\n if (preset === 'custom') {\n params.set(presetKey, 'custom');\n if (customRange?.from) params.set(fromKey, customRange.from.toISOString());\n if (customRange?.to) params.set(toKey, customRange.to.toISOString());\n return;\n }\n const mapped = mapPreset(preset);\n if (mapped) params.set(presetKey, mapped);\n}\n\nfunction setIfDefined(params: URLSearchParams, key: string, value: string | undefined | null): void {\n if (typeof value === 'string' && value.length > 0) {\n params.set(key, value);\n }\n}\n\nfunction appendArray(params: URLSearchParams, key: string, values: string[] | undefined): void {\n if (!Array.isArray(values) || values.length === 0) return;\n for (const v of values) if (v) params.append(key, v);\n}\n\n/** Build a relative URL to the Traces page pre-filtered by the dashboard\n * filters + per-card scope. */\nexport function buildTracesDrilldownUrl({\n preset,\n customRange,\n dashboardFilter,\n scope,\n tracesBasePath = '/traces',\n}: BuildArgs): string {\n const params = new URLSearchParams();\n params.set(TRACE_LIST_MODE_PARAM, 'branches');\n\n applyDate(\n params,\n TRACE_DATE_PRESET_PARAM,\n TRACE_DATE_FROM_PARAM,\n TRACE_DATE_TO_PARAM,\n preset,\n customRange,\n scope.window,\n );\n\n // Scope overrides dashboard filter when both are present.\n const rootEntityType = scope.rootEntityType ?? dashboardFilter.rootEntityType;\n if (rootEntityType) params.set(TRACE_ROOT_ENTITY_TYPE_PARAM, rootEntityType);\n\n if (scope.status) params.set(TRACE_STATUS_PARAM, scope.status);\n\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.entityName, scope.entityName ?? dashboardFilter.entityName);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.threadId, scope.threadId ?? dashboardFilter.threadId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.resourceId, scope.resourceId ?? dashboardFilter.resourceId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.entityId, dashboardFilter.entityId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.runId, dashboardFilter.runId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.sessionId, dashboardFilter.sessionId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.requestId, dashboardFilter.requestId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.userId, dashboardFilter.userId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.organizationId, dashboardFilter.organizationId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.experimentId, dashboardFilter.experimentId);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.serviceName, dashboardFilter.serviceName);\n setIfDefined(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.environment, dashboardFilter.environment);\n appendArray(params, TRACE_PROPERTY_FILTER_PARAM_BY_FIELD.tags, dashboardFilter.tags);\n\n const query = params.toString();\n return query ? `${tracesBasePath}?${query}` : tracesBasePath;\n}\n\n/** Build a relative URL to the Logs page pre-filtered by the dashboard filters\n * + per-card scope. Useful for \"View errors in logs\" affordances. */\nexport function buildLogsDrilldownUrl({\n preset,\n customRange,\n dashboardFilter,\n scope,\n logsBasePath = '/logs',\n}: BuildArgs): string {\n const params = new URLSearchParams();\n\n applyDate(\n params,\n LOGS_DATE_PRESET_PARAM,\n LOGS_DATE_FROM_PARAM,\n LOGS_DATE_TO_PARAM,\n preset,\n customRange,\n scope.window,\n );\n\n const rootEntityType = scope.rootEntityType ?? dashboardFilter.rootEntityType;\n if (rootEntityType) params.set(LOGS_ROOT_ENTITY_TYPE_PARAM, rootEntityType);\n\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.entityName, scope.entityName ?? dashboardFilter.entityName);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.threadId, scope.threadId ?? dashboardFilter.threadId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.resourceId, scope.resourceId ?? dashboardFilter.resourceId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.runId, dashboardFilter.runId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.sessionId, dashboardFilter.sessionId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.requestId, dashboardFilter.requestId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.userId, dashboardFilter.userId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.organizationId, dashboardFilter.organizationId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.experimentId, dashboardFilter.experimentId);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.serviceName, dashboardFilter.serviceName);\n setIfDefined(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.environment, dashboardFilter.environment);\n appendArray(params, LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.tags, dashboardFilter.tags);\n\n // Error drill-ins always target log level=error. Status filter isn't valid\n // for logs, so we translate `status: 'error'` to `filterLevel=error`.\n if (scope.status === 'error') {\n params.append(LOGS_PROPERTY_FILTER_PARAM_BY_FIELD.level, 'error');\n }\n\n const query = params.toString();\n return query ? `${logsBasePath}?${query}` : logsBasePath;\n}\n"],"names":["from","to"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-metrics.cjs.js","sources":["../../../../src/domains/metrics/hooks/use-metrics.tsx"],"sourcesContent":["/* eslint-disable react-refresh/only-export-components */\nimport { format } from 'date-fns';\nimport { createContext, useContext, useMemo } from 'react';\nimport type { ReactNode } from 'react';\n\nimport { buildMetricsDimensionalFilter } from '../metrics-filters';\nimport type { MetricsDimensionalFilter } from '../metrics-filters';\nimport type { PropertyFilterToken } from '@/ds/components/PropertyFilter/types';\n\nconst DATE_PRESETS = [\n { label: 'Last 24 hours', value: '24h' },\n { label: 'Last 3 days', value: '3d' },\n { label: 'Last 7 days', value: '7d' },\n { label: 'Last 14 days', value: '14d' },\n { label: 'Last 30 days', value: '30d' },\n] as const;\n\nexport type DatePreset = (typeof DATE_PRESETS)[number]['value'] | 'custom';\n\nexport { DATE_PRESETS };\n\nconst VALID_PRESETS = new Set<string>(DATE_PRESETS.map(p => p.value));\n\nexport function isValidPreset(value: string | null | undefined): value is DatePreset {\n return typeof value === 'string' && (VALID_PRESETS.has(value) || value === 'custom');\n}\n\nexport type DateRange = { from?: Date; to?: Date };\n\n/** Internal — all state is derived from the URL-backed props the owner passes.\n * There is intentionally no local mirror; keeping a mirror caused URL ↔ state\n * feedback loops that re-rendered the entire metrics tree on every keystroke.\n */\ntype MetricsContextValue = {\n datePreset: DatePreset;\n setDatePreset: (v: DatePreset) => void;\n customRange: DateRange | undefined;\n setCustomRange: (v: DateRange | undefined) => void;\n dateRangeLabel: string;\n filterTokens: PropertyFilterToken[];\n setFilterTokens: (tokens: PropertyFilterToken[]) => void;\n dimensionalFilter: MetricsDimensionalFilter;\n /** Stable JSON representation of `dimensionalFilter`, safe for query keys. */\n dimensionalFilterKey: string;\n /** Base path drilldown links should target for the Traces page. */\n tracesBasePath: string | undefined;\n /** Base path drilldown links should target for the Logs page. */\n logsBasePath: string | undefined;\n};\n\nexport const MetricsContext = createContext<MetricsContextValue>({\n datePreset: '24h',\n setDatePreset: () => {},\n customRange: undefined,\n setCustomRange: () => {},\n dateRangeLabel: 'Last 24 hours',\n filterTokens: [],\n setFilterTokens: () => {},\n dimensionalFilter: {},\n dimensionalFilterKey: '{}',\n tracesBasePath: undefined,\n logsBasePath: undefined,\n});\n\nexport function useMetrics() {\n return useContext(MetricsContext);\n}\n\nfunction getDateRangeLabel(preset: DatePreset, customRange: DateRange | undefined) {\n if (preset !== 'custom') {\n return DATE_PRESETS.find(p => p.value === preset)?.label ?? preset;\n }\n if (customRange?.from) {\n if (customRange.to) {\n return `${format(customRange.from, 'MMM d, yyyy')} – ${format(customRange.to, 'MMM d, yyyy')}`;\n }\n return format(customRange.from, 'MMM d, yyyy');\n }\n return 'Custom range';\n}\n\n/**\n * URL-driven metrics provider.\n *\n * The owner (page) is expected to:\n * - pass the current `preset` / `filterTokens` derived from `useSearchParams`\n * - pass `onPresetChange` / `onFilterTokensChange` that update the URL\n *\n * The provider never stores its own copies — changes round-trip through the URL\n * exactly once, which keeps re-renders bounded no matter how much data is on\n * screen.\n */\nexport function MetricsProvider({\n children,\n preset,\n filterTokens,\n onPresetChange,\n onFilterTokensChange,\n customRange,\n onCustomRangeChange,\n tracesBasePath,\n logsBasePath,\n}: {\n children: ReactNode;\n preset: DatePreset;\n filterTokens: PropertyFilterToken[];\n onPresetChange: (preset: DatePreset) => void;\n onFilterTokensChange: (tokens: PropertyFilterToken[]) => void;\n customRange?: DateRange;\n onCustomRangeChange?: (range: DateRange | undefined) => void;\n /** Base path for drilldown links to the Traces page. Defaults to `/
|
|
1
|
+
{"version":3,"file":"use-metrics.cjs.js","sources":["../../../../src/domains/metrics/hooks/use-metrics.tsx"],"sourcesContent":["/* eslint-disable react-refresh/only-export-components */\nimport { format } from 'date-fns';\nimport { createContext, useContext, useMemo } from 'react';\nimport type { ReactNode } from 'react';\n\nimport { buildMetricsDimensionalFilter } from '../metrics-filters';\nimport type { MetricsDimensionalFilter } from '../metrics-filters';\nimport type { PropertyFilterToken } from '@/ds/components/PropertyFilter/types';\n\nconst DATE_PRESETS = [\n { label: 'Last 24 hours', value: '24h' },\n { label: 'Last 3 days', value: '3d' },\n { label: 'Last 7 days', value: '7d' },\n { label: 'Last 14 days', value: '14d' },\n { label: 'Last 30 days', value: '30d' },\n] as const;\n\nexport type DatePreset = (typeof DATE_PRESETS)[number]['value'] | 'custom';\n\nexport { DATE_PRESETS };\n\nconst VALID_PRESETS = new Set<string>(DATE_PRESETS.map(p => p.value));\n\nexport function isValidPreset(value: string | null | undefined): value is DatePreset {\n return typeof value === 'string' && (VALID_PRESETS.has(value) || value === 'custom');\n}\n\nexport type DateRange = { from?: Date; to?: Date };\n\n/** Internal — all state is derived from the URL-backed props the owner passes.\n * There is intentionally no local mirror; keeping a mirror caused URL ↔ state\n * feedback loops that re-rendered the entire metrics tree on every keystroke.\n */\ntype MetricsContextValue = {\n datePreset: DatePreset;\n setDatePreset: (v: DatePreset) => void;\n customRange: DateRange | undefined;\n setCustomRange: (v: DateRange | undefined) => void;\n dateRangeLabel: string;\n filterTokens: PropertyFilterToken[];\n setFilterTokens: (tokens: PropertyFilterToken[]) => void;\n dimensionalFilter: MetricsDimensionalFilter;\n /** Stable JSON representation of `dimensionalFilter`, safe for query keys. */\n dimensionalFilterKey: string;\n /** Base path drilldown links should target for the Traces page. */\n tracesBasePath: string | undefined;\n /** Base path drilldown links should target for the Logs page. */\n logsBasePath: string | undefined;\n};\n\nexport const MetricsContext = createContext<MetricsContextValue>({\n datePreset: '24h',\n setDatePreset: () => {},\n customRange: undefined,\n setCustomRange: () => {},\n dateRangeLabel: 'Last 24 hours',\n filterTokens: [],\n setFilterTokens: () => {},\n dimensionalFilter: {},\n dimensionalFilterKey: '{}',\n tracesBasePath: undefined,\n logsBasePath: undefined,\n});\n\nexport function useMetrics() {\n return useContext(MetricsContext);\n}\n\nfunction getDateRangeLabel(preset: DatePreset, customRange: DateRange | undefined) {\n if (preset !== 'custom') {\n return DATE_PRESETS.find(p => p.value === preset)?.label ?? preset;\n }\n if (customRange?.from) {\n if (customRange.to) {\n return `${format(customRange.from, 'MMM d, yyyy')} – ${format(customRange.to, 'MMM d, yyyy')}`;\n }\n return format(customRange.from, 'MMM d, yyyy');\n }\n return 'Custom range';\n}\n\n/**\n * URL-driven metrics provider.\n *\n * The owner (page) is expected to:\n * - pass the current `preset` / `filterTokens` derived from `useSearchParams`\n * - pass `onPresetChange` / `onFilterTokensChange` that update the URL\n *\n * The provider never stores its own copies — changes round-trip through the URL\n * exactly once, which keeps re-renders bounded no matter how much data is on\n * screen.\n */\nexport function MetricsProvider({\n children,\n preset,\n filterTokens,\n onPresetChange,\n onFilterTokensChange,\n customRange,\n onCustomRangeChange,\n tracesBasePath,\n logsBasePath,\n}: {\n children: ReactNode;\n preset: DatePreset;\n filterTokens: PropertyFilterToken[];\n onPresetChange: (preset: DatePreset) => void;\n onFilterTokensChange: (tokens: PropertyFilterToken[]) => void;\n customRange?: DateRange;\n onCustomRangeChange?: (range: DateRange | undefined) => void;\n /** Base path for drilldown links to the Traces page. Defaults to `/traces` when omitted. */\n tracesBasePath?: string;\n /** Base path for drilldown links to the Logs page. Defaults to `/logs` when omitted. */\n logsBasePath?: string;\n}) {\n // Stable key for memo dependencies — the parent may re-create the tokens\n // array on every render (e.g. from `useMemo(... , [searchParams])`), but the\n // *content* usually doesn't change.\n const filterTokensKey = useMemo(() => JSON.stringify(filterTokens), [filterTokens]);\n\n // Intentional: re-pin only when the serialized content changes, not on every\n // parent render that allocates a new array.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const stableFilterTokens = useMemo(() => filterTokens, [filterTokensKey]);\n\n const dimensionalFilter = useMemo(() => buildMetricsDimensionalFilter(stableFilterTokens), [stableFilterTokens]);\n\n const dimensionalFilterKey = useMemo(() => JSON.stringify(dimensionalFilter), [dimensionalFilter]);\n\n const dateRangeLabel = getDateRangeLabel(preset, customRange);\n\n const value = useMemo<MetricsContextValue>(\n () => ({\n datePreset: preset,\n setDatePreset: onPresetChange,\n customRange,\n setCustomRange: onCustomRangeChange ?? (() => {}),\n dateRangeLabel,\n filterTokens: stableFilterTokens,\n setFilterTokens: onFilterTokensChange,\n dimensionalFilter,\n dimensionalFilterKey,\n tracesBasePath,\n logsBasePath,\n }),\n [\n preset,\n onPresetChange,\n customRange,\n onCustomRangeChange,\n dateRangeLabel,\n stableFilterTokens,\n onFilterTokensChange,\n dimensionalFilter,\n dimensionalFilterKey,\n tracesBasePath,\n logsBasePath,\n ],\n );\n\n return <MetricsContext.Provider value={value}>{children}</MetricsContext.Provider>;\n}\n"],"names":["createContext","useContext","format","useMemo","buildMetricsDimensionalFilter","jsx"],"mappings":"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"}
|