@mastra/playground-ui 64.0.0 → 65.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/README.md +10 -2
  2. package/components.css +340 -0
  3. package/dist/code-DJReJPSX.cjs.map +1 -1
  4. package/dist/code-DLuATvYu.js.map +1 -1
  5. package/dist/components/Breadcrumb.cjs.js +4 -2
  6. package/dist/components/Breadcrumb.cjs.js.map +1 -1
  7. package/dist/components/Breadcrumb.es.js +5 -3
  8. package/dist/components/Breadcrumb.es.js.map +1 -1
  9. package/dist/domains/chat/tools/badges/workflow-badge.cjs.js +2 -0
  10. package/dist/domains/chat/tools/badges/workflow-badge.cjs.js.map +1 -1
  11. package/dist/domains/chat/tools/badges/workflow-badge.es.js +2 -0
  12. package/dist/domains/chat/tools/badges/workflow-badge.es.js.map +1 -1
  13. package/dist/domains/datasets/components/save-as-dataset-item-dialog.cjs.js +104 -92
  14. package/dist/domains/datasets/components/save-as-dataset-item-dialog.cjs.js.map +1 -1
  15. package/dist/domains/datasets/components/save-as-dataset-item-dialog.es.js +105 -93
  16. package/dist/domains/datasets/components/save-as-dataset-item-dialog.es.js.map +1 -1
  17. package/dist/domains/observability/components/add-trace-mocks-to-item-dialog.cjs.js +3 -3
  18. package/dist/domains/observability/components/add-trace-mocks-to-item-dialog.es.js +3 -3
  19. package/dist/domains/observability/components/trace-as-item-dialog.cjs.js +6 -10
  20. package/dist/domains/observability/components/trace-as-item-dialog.cjs.js.map +1 -1
  21. package/dist/domains/observability/components/trace-as-item-dialog.es.js +7 -11
  22. package/dist/domains/observability/components/trace-as-item-dialog.es.js.map +1 -1
  23. package/dist/domains/scores/components/score-as-item-dialog.cjs.js +3 -9
  24. package/dist/domains/scores/components/score-as-item-dialog.cjs.js.map +1 -1
  25. package/dist/domains/scores/components/score-as-item-dialog.es.js +4 -10
  26. package/dist/domains/scores/components/score-as-item-dialog.es.js.map +1 -1
  27. package/dist/domains/scores/components/score-data-panel.cjs.js +9 -1
  28. package/dist/domains/scores/components/score-data-panel.cjs.js.map +1 -1
  29. package/dist/domains/scores/components/score-data-panel.es.js +9 -1
  30. package/dist/domains/scores/components/score-data-panel.es.js.map +1 -1
  31. package/dist/domains/traces/components/thread-view-by-trace.cjs.js +1 -0
  32. package/dist/domains/traces/components/thread-view-by-trace.cjs.js.map +1 -1
  33. package/dist/domains/traces/components/thread-view-by-trace.es.js +1 -0
  34. package/dist/domains/traces/components/thread-view-by-trace.es.js.map +1 -1
  35. package/dist/domains/traces/components/trace-data-panel.cjs.js +1 -0
  36. package/dist/domains/traces/components/trace-data-panel.cjs.js.map +1 -1
  37. package/dist/domains/traces/components/trace-data-panel.es.js +1 -0
  38. package/dist/domains/traces/components/trace-data-panel.es.js.map +1 -1
  39. package/dist/domains/workflows/workflow/workflow-input-data.cjs.js +1 -0
  40. package/dist/domains/workflows/workflow/workflow-input-data.cjs.js.map +1 -1
  41. package/dist/domains/workflows/workflow/workflow-input-data.es.js +1 -0
  42. package/dist/domains/workflows/workflow/workflow-input-data.es.js.map +1 -1
  43. package/dist/primitives/raised-surface.cjs.js.map +1 -1
  44. package/dist/primitives/raised-surface.es.js.map +1 -1
  45. package/dist/src/domains/datasets/components/index.d.ts +1 -1
  46. package/dist/src/domains/datasets/components/save-as-dataset-item-dialog.d.ts +14 -3
  47. package/dist/src/domains/observability/components/trace-as-item-dialog.d.ts +5 -3
  48. package/dist/src/domains/scores/components/score-as-item-dialog.d.ts +3 -3
  49. package/dist/src/ds/components/Breadcrumb/Breadcrumb.d.ts +2 -2
  50. package/dist/src/ds/components/Code/code.d.ts +1 -1
  51. package/dist/src/ds/primitives/raised-surface.d.ts +1 -1
  52. package/dist/style.css +22 -19
  53. package/dist/toast.css +1 -1
  54. package/dist/tokens.cjs.js.map +1 -1
  55. package/dist/tokens.es.js.map +1 -1
  56. package/dist/use-text-highlight.css +4 -4
  57. package/package.json +16 -12
  58. package/sources.css +1 -0
  59. package/theme/code.css +17 -0
  60. package/theme/surfaces.css +2 -2
  61. package/theme.css +2 -0
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-input-data.es.js","sources":["../../../../src/domains/workflows/workflow/workflow-input-data.tsx"],"sourcesContent":["import { Play } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { useRef, useState } from 'react';\nimport type { ZodSchema } from 'zod';\n\nimport { createProcessorInput, parseProcessorDraft } from './input/processor-input';\nimport type { ProcessorDraft } from './input/processor-input';\nimport { WorkflowJsonInput } from './input/workflow-json-input';\nimport { WorkflowProcessorInput } from './input/workflow-processor-input';\nimport { WorkflowInputTypeToggle } from './workflow-input-type-toggle';\nimport type { WorkflowInputType } from './workflow-input-type-toggle';\nimport { Button } from '@/ds/components/Button';\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/ds/components/Collapsible';\nimport { DisclosureChevron } from '@/ds/components/DisclosureChevron';\nimport { Txt } from '@/ds/components/Txt';\nimport { Icon } from '@/ds/icons/Icon';\nimport { DynamicForm } from '@/lib/form';\nimport { getFormShapeError, parseJsonDraft, validateJsonDraft } from '@/lib/form/json-draft';\nimport type { JsonDraftValue } from '@/lib/form/json-draft';\nimport { cn } from '@/utils/cn';\n\nexport interface WorkflowInputDataProps {\n schema: ZodSchema;\n defaultValues?: unknown;\n isSubmitLoading: boolean;\n submitButtonLabel: string;\n onSubmit: (data: any) => void;\n children?: React.ReactNode;\n isProcessorWorkflow?: boolean;\n submitActions?: React.ReactNode;\n leftActions?: React.ReactNode;\n headingSlot?: ReactNode;\n collapsible?: boolean;\n submitButtonIcon?: ReactNode;\n submitButtonVariant?: React.ComponentProps<typeof Button>['variant'];\n submitButtonFullWidth?: boolean;\n hideInputTypeLabel?: boolean;\n inputTypeLabel?: string;\n hideHeading?: boolean;\n}\n\ntype InputDraft =\n | { type: 'json'; value: string }\n | { type: 'form'; value: unknown }\n | { type: 'simple'; value: ProcessorDraft };\n\nconst defaultSubmitIcon = (\n <Icon>\n <Play />\n </Icon>\n);\n\nfunction createInitialDraft(defaultValues: unknown, isProcessorWorkflow: boolean | undefined): InputDraft {\n if (!isProcessorWorkflow) return { type: 'form', value: defaultValues };\n const input = defaultValues ?? createProcessorInput();\n const draft = parseProcessorDraft(input);\n return draft ? { type: 'simple', value: draft } : { type: 'json', value: JSON.stringify(input, null, 2) };\n}\n\nexport const WorkflowInputData = ({\n schema,\n defaultValues,\n isSubmitLoading,\n submitButtonLabel,\n onSubmit,\n children,\n isProcessorWorkflow,\n submitActions,\n leftActions,\n headingSlot,\n collapsible = true,\n submitButtonIcon = defaultSubmitIcon,\n submitButtonVariant = 'primary',\n submitButtonFullWidth,\n hideInputTypeLabel,\n inputTypeLabel = 'Run input',\n hideHeading,\n}: WorkflowInputDataProps) => {\n const [draft, setDraft] = useState(() => createInitialDraft(defaultValues, isProcessorWorkflow));\n // The Form view is uncontrolled: state here would only re-render this tree on every keystroke.\n const formValues = useRef<unknown>(defaultValues);\n const [errors, setErrors] = useState<string[]>([]);\n\n function readDraftValue(): JsonDraftValue {\n if (draft.type === 'json') return parseJsonDraft(draft.value);\n return { ok: true, value: draft.type === 'form' ? formValues.current : draft.value };\n }\n\n function submitJsonDraft(text: string) {\n const result = validateJsonDraft(schema, text);\n if (result.ok) onSubmit(result.value);\n else setErrors(result.errors);\n }\n\n function changeInputType(type: WorkflowInputType) {\n if (type === draft.type) return;\n setErrors([]);\n const current = readDraftValue();\n if (!current.ok) return setErrors([current.error]);\n if (type === 'json') {\n return setDraft({ type, value: JSON.stringify(current.value === undefined ? {} : current.value, null, 2) });\n }\n if (type === 'simple') {\n const processorDraft = parseProcessorDraft(current.value);\n if (processorDraft) return setDraft({ type, value: processorDraft });\n return setErrors([\n 'Simple input requires a messages array with text parts and a string phase. Correct the JSON first.',\n ]);\n }\n const formShapeError = getFormShapeError(schema, current.value);\n return formShapeError ? setErrors([formShapeError]) : setDraft({ type, value: current.value });\n }\n\n const defaultHeading = (\n <Txt as=\"span\" variant=\"subheading\" tone=\"ink\">\n Trigger a run\n </Txt>\n );\n const toggleSitsInLabelRow = !collapsible && !hideHeading;\n const toggleSitsAboveInput = collapsible || hideHeading || hideInputTypeLabel;\n const inputTypeToggle = (\n <WorkflowInputTypeToggle\n value={draft.type}\n onChange={changeInputType}\n disabled={isSubmitLoading}\n includeSimple={isProcessorWorkflow}\n compact={toggleSitsInLabelRow}\n />\n );\n\n const body = (\n <>\n {!hideInputTypeLabel && (\n <div className=\"flex justify-between gap-3 px-5 py-3\">\n <Txt as=\"p\" variant=\"caption\" tone=\"muted\">\n {inputTypeLabel}\n </Txt>\n {toggleSitsInLabelRow && <div className=\"shrink-0\">{inputTypeToggle}</div>}\n </div>\n )}\n\n <div className=\"px-5\">\n {toggleSitsAboveInput && <div className=\"pb-4\">{inputTypeToggle}</div>}\n\n <div\n className={cn('pb-4', {\n 'pointer-events-none opacity-50': isSubmitLoading,\n })}\n >\n {draft.type === 'json' ? (\n <WorkflowJsonInput\n value={draft.value}\n onChange={value => {\n setDraft({ type: 'json', value });\n setErrors([]);\n }}\n errors={errors}\n isSubmitLoading={isSubmitLoading}\n submitButtonLabel={submitButtonLabel}\n submitButtonIcon={submitButtonIcon}\n submitButtonVariant={submitButtonVariant}\n submitButtonFullWidth={submitButtonFullWidth}\n onSubmit={() => submitJsonDraft(draft.value)}\n submitActions={submitActions}\n leftActions={leftActions}\n >\n {children}\n </WorkflowJsonInput>\n ) : draft.type === 'simple' && isProcessorWorkflow ? (\n <WorkflowProcessorInput\n schema={schema}\n value={draft.value}\n onChange={value => setDraft({ type: 'simple', value })}\n isSubmitLoading={isSubmitLoading}\n submitButtonLabel={submitButtonLabel}\n submitButtonIcon={submitButtonIcon}\n submitButtonVariant={submitButtonVariant}\n submitButtonFullWidth={submitButtonFullWidth}\n onSubmit={onSubmit}\n submitActions={submitActions}\n leftActions={leftActions}\n >\n {children}\n </WorkflowProcessorInput>\n ) : (\n <WorkflowFormInput\n schema={schema}\n onValuesChange={value => {\n formValues.current = value;\n }}\n defaultValues={draft.value}\n isSubmitLoading={isSubmitLoading}\n submitButtonLabel={submitButtonLabel}\n submitButtonIcon={submitButtonIcon}\n submitButtonVariant={submitButtonVariant}\n submitButtonFullWidth={submitButtonFullWidth}\n onSubmit={onSubmit}\n submitActions={submitActions}\n leftActions={leftActions}\n >\n {children}\n </WorkflowFormInput>\n )}\n </div>\n </div>\n </>\n );\n\n if (!collapsible) {\n return (\n <>\n {!hideHeading && <div className=\"border-b border-border pb-3\">{headingSlot ?? defaultHeading}</div>}\n <div>{body}</div>\n </>\n );\n }\n\n return (\n <Collapsible defaultOpen>\n <CollapsibleTrigger className=\"flex w-full items-center gap-2 pb-3 text-left\">\n <DisclosureChevron direction=\"right\" className=\"size-4 text-muted-foreground\" />\n {headingSlot ?? defaultHeading}\n </CollapsibleTrigger>\n\n <CollapsibleContent keepMounted>{body}</CollapsibleContent>\n </Collapsible>\n );\n};\n\nconst WorkflowFormInput = ({\n schema,\n defaultValues,\n isSubmitLoading,\n submitButtonLabel,\n onSubmit,\n children,\n submitActions,\n leftActions,\n submitButtonIcon,\n submitButtonVariant,\n submitButtonFullWidth,\n onValuesChange,\n}: WorkflowInputDataProps & { onValuesChange: (value: unknown) => void }) => (\n <DynamicForm\n schema={schema}\n defaultValues={defaultValues}\n onValuesChange={onValuesChange}\n isSubmitLoading={isSubmitLoading}\n submitButtonLabel={submitButtonLabel}\n submitButtonIcon={submitButtonIcon}\n submitButtonVariant={submitButtonVariant}\n submitButtonFullWidth={submitButtonFullWidth}\n onSubmit={onSubmit}\n readOnly={isSubmitLoading}\n submitActions={submitActions}\n leftActions={leftActions}\n >\n {children}\n </DynamicForm>\n);\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workflow-input-data.es.js","sources":["../../../../src/domains/workflows/workflow/workflow-input-data.tsx"],"sourcesContent":["import { Play } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport { useRef, useState } from 'react';\nimport type { ZodSchema } from 'zod';\n\nimport { createProcessorInput, parseProcessorDraft } from './input/processor-input';\nimport type { ProcessorDraft } from './input/processor-input';\nimport { WorkflowJsonInput } from './input/workflow-json-input';\nimport { WorkflowProcessorInput } from './input/workflow-processor-input';\nimport { WorkflowInputTypeToggle } from './workflow-input-type-toggle';\nimport type { WorkflowInputType } from './workflow-input-type-toggle';\nimport { Button } from '@/ds/components/Button';\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/ds/components/Collapsible';\nimport { DisclosureChevron } from '@/ds/components/DisclosureChevron';\nimport { Txt } from '@/ds/components/Txt';\nimport { Icon } from '@/ds/icons/Icon';\nimport { DynamicForm } from '@/lib/form';\nimport { getFormShapeError, parseJsonDraft, validateJsonDraft } from '@/lib/form/json-draft';\nimport type { JsonDraftValue } from '@/lib/form/json-draft';\nimport { cn } from '@/utils/cn';\n\nexport interface WorkflowInputDataProps {\n schema: ZodSchema;\n defaultValues?: unknown;\n isSubmitLoading: boolean;\n submitButtonLabel: string;\n onSubmit: (data: any) => void;\n children?: React.ReactNode;\n isProcessorWorkflow?: boolean;\n submitActions?: React.ReactNode;\n leftActions?: React.ReactNode;\n headingSlot?: ReactNode;\n collapsible?: boolean;\n submitButtonIcon?: ReactNode;\n submitButtonVariant?: React.ComponentProps<typeof Button>['variant'];\n submitButtonFullWidth?: boolean;\n hideInputTypeLabel?: boolean;\n inputTypeLabel?: string;\n hideHeading?: boolean;\n}\n\ntype InputDraft =\n | { type: 'json'; value: string }\n | { type: 'form'; value: unknown }\n | { type: 'simple'; value: ProcessorDraft };\n\nconst defaultSubmitIcon = (\n <Icon>\n <Play />\n </Icon>\n);\n\nfunction createInitialDraft(defaultValues: unknown, isProcessorWorkflow: boolean | undefined): InputDraft {\n if (!isProcessorWorkflow) return { type: 'form', value: defaultValues };\n const input = defaultValues ?? createProcessorInput();\n const draft = parseProcessorDraft(input);\n return draft ? { type: 'simple', value: draft } : { type: 'json', value: JSON.stringify(input, null, 2) };\n}\n\nexport const WorkflowInputData = ({\n schema,\n defaultValues,\n isSubmitLoading,\n submitButtonLabel,\n onSubmit,\n children,\n isProcessorWorkflow,\n submitActions,\n leftActions,\n headingSlot,\n collapsible = true,\n submitButtonIcon = defaultSubmitIcon,\n submitButtonVariant = 'primary',\n submitButtonFullWidth,\n hideInputTypeLabel,\n inputTypeLabel = 'Run input',\n hideHeading,\n}: WorkflowInputDataProps) => {\n const [draft, setDraft] = useState(() => createInitialDraft(defaultValues, isProcessorWorkflow));\n // The Form view is uncontrolled: state here would only re-render this tree on every keystroke.\n const formValues = useRef<unknown>(defaultValues);\n const [errors, setErrors] = useState<string[]>([]);\n\n function readDraftValue(): JsonDraftValue {\n if (draft.type === 'json') return parseJsonDraft(draft.value);\n return { ok: true, value: draft.type === 'form' ? formValues.current : draft.value };\n }\n\n function submitJsonDraft(text: string) {\n const result = validateJsonDraft(schema, text);\n if (result.ok) onSubmit(result.value);\n else setErrors(result.errors);\n }\n\n function changeInputType(type: WorkflowInputType) {\n if (type === draft.type) return;\n setErrors([]);\n const current = readDraftValue();\n if (!current.ok) return setErrors([current.error]);\n if (type === 'json') {\n return setDraft({ type, value: JSON.stringify(current.value === undefined ? {} : current.value, null, 2) });\n }\n if (type === 'simple') {\n const processorDraft = parseProcessorDraft(current.value);\n if (processorDraft) return setDraft({ type, value: processorDraft });\n return setErrors([\n 'Simple input requires a messages array with text parts and a string phase. Correct the JSON first.',\n ]);\n }\n const formShapeError = getFormShapeError(schema, current.value);\n return formShapeError ? setErrors([formShapeError]) : setDraft({ type, value: current.value });\n }\n\n const defaultHeading = (\n <Txt as=\"span\" variant=\"subheading\" tone=\"ink\">\n Trigger a run\n </Txt>\n );\n const toggleSitsInLabelRow = !collapsible && !hideHeading;\n const toggleSitsAboveInput = collapsible || hideHeading || hideInputTypeLabel;\n const inputTypeToggle = (\n <WorkflowInputTypeToggle\n value={draft.type}\n onChange={changeInputType}\n disabled={isSubmitLoading}\n includeSimple={isProcessorWorkflow}\n compact={toggleSitsInLabelRow}\n />\n );\n\n const body = (\n <>\n {!hideInputTypeLabel && (\n <div className=\"flex justify-between gap-3 px-5 py-3\">\n <Txt as=\"p\" variant=\"caption\" tone=\"muted\">\n {inputTypeLabel}\n </Txt>\n {toggleSitsInLabelRow && <div className=\"shrink-0\">{inputTypeToggle}</div>}\n </div>\n )}\n\n <div className=\"px-5\">\n {toggleSitsAboveInput && <div className=\"pb-4\">{inputTypeToggle}</div>}\n\n <div\n className={cn('pb-4', {\n 'pointer-events-none opacity-50': isSubmitLoading,\n })}\n >\n {draft.type === 'json' ? (\n <WorkflowJsonInput\n value={draft.value}\n onChange={value => {\n setDraft({ type: 'json', value });\n setErrors([]);\n }}\n errors={errors}\n isSubmitLoading={isSubmitLoading}\n submitButtonLabel={submitButtonLabel}\n submitButtonIcon={submitButtonIcon}\n submitButtonVariant={submitButtonVariant}\n submitButtonFullWidth={submitButtonFullWidth}\n onSubmit={() => submitJsonDraft(draft.value)}\n submitActions={submitActions}\n leftActions={leftActions}\n >\n {children}\n </WorkflowJsonInput>\n ) : draft.type === 'simple' && isProcessorWorkflow ? (\n <WorkflowProcessorInput\n schema={schema}\n value={draft.value}\n onChange={value => setDraft({ type: 'simple', value })}\n isSubmitLoading={isSubmitLoading}\n submitButtonLabel={submitButtonLabel}\n submitButtonIcon={submitButtonIcon}\n submitButtonVariant={submitButtonVariant}\n submitButtonFullWidth={submitButtonFullWidth}\n onSubmit={onSubmit}\n submitActions={submitActions}\n leftActions={leftActions}\n >\n {children}\n </WorkflowProcessorInput>\n ) : (\n <WorkflowFormInput\n schema={schema}\n onValuesChange={value => {\n formValues.current = value;\n }}\n defaultValues={draft.value}\n isSubmitLoading={isSubmitLoading}\n submitButtonLabel={submitButtonLabel}\n submitButtonIcon={submitButtonIcon}\n submitButtonVariant={submitButtonVariant}\n submitButtonFullWidth={submitButtonFullWidth}\n onSubmit={onSubmit}\n submitActions={submitActions}\n leftActions={leftActions}\n >\n {children}\n </WorkflowFormInput>\n )}\n </div>\n </div>\n </>\n );\n\n if (!collapsible) {\n return (\n <>\n {!hideHeading && <div className=\"border-b border-border pb-3\">{headingSlot ?? defaultHeading}</div>}\n <div>{body}</div>\n </>\n );\n }\n\n return (\n <Collapsible defaultOpen>\n <CollapsibleTrigger className=\"flex w-full items-center gap-2 pb-3 text-left\">\n <DisclosureChevron direction=\"right\" className=\"size-4 text-muted-foreground\" />\n {headingSlot ?? defaultHeading}\n </CollapsibleTrigger>\n\n <CollapsibleContent keepMounted>{body}</CollapsibleContent>\n </Collapsible>\n );\n};\n\nconst WorkflowFormInput = ({\n schema,\n defaultValues,\n isSubmitLoading,\n submitButtonLabel,\n onSubmit,\n children,\n submitActions,\n leftActions,\n submitButtonIcon,\n submitButtonVariant,\n submitButtonFullWidth,\n onValuesChange,\n}: WorkflowInputDataProps & { onValuesChange: (value: unknown) => void }) => (\n <DynamicForm\n schema={schema}\n defaultValues={defaultValues}\n onValuesChange={onValuesChange}\n isSubmitLoading={isSubmitLoading}\n submitButtonLabel={submitButtonLabel}\n submitButtonIcon={submitButtonIcon}\n submitButtonVariant={submitButtonVariant}\n submitButtonFullWidth={submitButtonFullWidth}\n onSubmit={onSubmit}\n readOnly={isSubmitLoading}\n submitActions={submitActions}\n leftActions={leftActions}\n >\n {children}\n </DynamicForm>\n);\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"raised-surface.cjs.js","sources":["../../src/ds/primitives/raised-surface.ts"],"sourcesContent":["/**\n * Two recipes, because elevation encodes distance from the canvas and there are\n * only two distances in this product.\n *\n * A *raised* surface sits in the flow — card, list panel, settings container,\n * table head, app frame. It lifts a couple of pixels, which is also what keeps\n * it honest: a tile in a grid inside a scroller is clipped by that scroller, so\n * a shadow that bleeds further than the tile's own clearance gets sliced into a\n * hard line along the container edge.\n *\n * An *overlay* is detached — popover, dropdown, dialog, drawer, tooltip. It is\n * never clipped, has to separate from arbitrary content beneath it, and so\n * carries the long falloff.\n *\n * Both recipes carry a `--surface-rim` inset edge, a top highlight in dark,\n * and elevation drops. Adding a CSS border on that same edge doubles it.\n * Content dividers use `--border`; frame headers use `border-surface-rim`\n * and stay inside the inset pixel reserved by MainCard.\n *\n * Radius is deliberately absent — it belongs to the family (`rounded-xl` for a\n * popup, `rounded-studio-frame` for the app frame).\n *\n * A raised surface pins its own fill across states. Interaction is expressed by\n * the state layer below, never by swapping the background: `Button`'s variants\n * all drive `background-color` on hover, and a raised surface wearing one would\n * otherwise turn translucent mid-hover and composite over the canvas. A call\n * site that genuinely wants another fill still overrides it, since its own\n * classes come after these.\n */\nconst fieldsOnSurface =\n '[--field:var(--field-on-surface)] [--field-disabled:var(--field-on-surface)] [--field-rim:var(--field-rim-on-surface)]';\nconst fieldsOnDialog =\n '[--field:var(--field-on-surface)] [--field-disabled:var(--field-on-surface)] [--field-rim:var(--surface-rim)]';\nconst fieldsOnPage = '[--field:var(--card)] [--field-disabled:var(--fill-subtle)] [--field-rim:var(--surface-rim)]';\n\nexport const raisedSurfaceStyle = 'bg-card hover:bg-card active:bg-card shadow-raised ' + fieldsOnSurface;\n\nexport const overlaySurfaceStyle = 'bg-card shadow-overlay ' + fieldsOnSurface;\n\nexport const dialogSurfaceStyle = 'bg-dialog shadow-overlay ' + fieldsOnDialog;\n\n/**\n * The app frame and the panels docked beside it. Same elevation as a card, one\n * step lower fill: a frame is a hole cut in the rail, and what sits inside it —\n * cards, fields, tables — needs a step to rise above. `Card` is for that\n * content, never for the frame around it.\n */\nexport const frameSurfaceStyle = 'bg-background shadow-raised ' + fieldsOnPage;\n\n/**\n * The frame's fill without its elevation, for a frame that is raised only at\n * some breakpoints: `MainCard` is flat page content below `lg`.\n */\nexport const frameFillStyle = 'bg-background ' + fieldsOnPage;\n\n/**\n * Interaction states for a surface that already carries an opaque fill. The\n * `state-layer` utility in `src/index.css` holds the reasoning and the measured\n * numbers: the rung has to be layered, never swapped into `background-color`.\n */\nexport const surfaceStateLayerStyle = 'state-layer';\n\n/**\n * Same layer, driven by an ancestor marked `group` rather than the surface\n * itself. A utility cannot read an ancestor's state, so this one stays composed\n * from variants — `isolate` and the negative z-index do the same job as the\n * utility's, and `inset-px` likewise keeps the inset rim visible.\n */\nexport const surfaceGroupStateLayerStyle =\n 'relative isolate before:pointer-events-none before:absolute before:-z-1 before:inset-px before:rounded-[inherit] before:transition-colors before:duration-fast motion-reduce:before:transition-none group-hover:before:bg-fill-subtle group-focus-visible:before:bg-fill-subtle';\n"],"names":[],"mappings":";;;;AA6BA,MAAM,eAAA,GACJ,wHAAA;AACF,MAAM,cAAA,GACJ,+GAAA;AACF,MAAM,YAAA,GAAe,8FAAA;AAEd,MAAM,qBAAqB,qDAAA,GAAwD;AAEnF,MAAM,sBAAsB,yBAAA,GAA4B;AAExD,MAAM,qBAAqB,2BAAA,GAA8B;AAQzD,MAAM,oBAAoB,8BAAA,GAAiC;AAM3D,MAAM,iBAAiB,gBAAA,GAAmB;AAO1C,MAAM,sBAAA,GAAyB;AAQ/B,MAAM,2BAAA,GACX;;;;;;;;;;"}
1
+ {"version":3,"file":"raised-surface.cjs.js","sources":["../../src/ds/primitives/raised-surface.ts"],"sourcesContent":["/**\n * Two recipes, because elevation encodes distance from the canvas and there are\n * only two distances in this product.\n *\n * A *raised* surface sits in the flow — card, list panel, settings container,\n * table head, app frame. It lifts a couple of pixels, which is also what keeps\n * it honest: a tile in a grid inside a scroller is clipped by that scroller, so\n * a shadow that bleeds further than the tile's own clearance gets sliced into a\n * hard line along the container edge.\n *\n * An *overlay* is detached — popover, dropdown, dialog, drawer, tooltip. It is\n * never clipped, has to separate from arbitrary content beneath it, and so\n * carries the long falloff.\n *\n * Both recipes carry a `--surface-rim` inset edge, a top highlight in dark,\n * and elevation drops. Adding a CSS border on that same edge doubles it.\n * Content dividers use `--border`; frame headers use `border-surface-rim`\n * and stay inside the inset pixel reserved by MainCard.\n *\n * Radius is deliberately absent — it belongs to the family (`rounded-xl` for a\n * popup, `rounded-studio-frame` for the app frame).\n *\n * A raised surface pins its own fill across states. Interaction is expressed by\n * the state layer below, never by swapping the background: `Button`'s variants\n * all drive `background-color` on hover, and a raised surface wearing one would\n * otherwise turn translucent mid-hover and composite over the canvas. A call\n * site that genuinely wants another fill still overrides it, since its own\n * classes come after these.\n */\nconst fieldsOnSurface =\n '[--field:var(--field-on-surface)] [--field-disabled:var(--field-on-surface)] [--field-rim:var(--field-rim-on-surface)]';\nconst fieldsOnDialog =\n '[--field:var(--field-on-surface)] [--field-disabled:var(--field-on-surface)] [--field-rim:var(--surface-rim)]';\nconst fieldsOnPage = '[--field:var(--card)] [--field-disabled:var(--fill-subtle)] [--field-rim:var(--surface-rim)]';\n\nexport const raisedSurfaceStyle = 'bg-card hover:bg-card active:bg-card shadow-raised ' + fieldsOnSurface;\n\nexport const overlaySurfaceStyle = 'bg-card shadow-overlay ' + fieldsOnSurface;\n\nexport const dialogSurfaceStyle = 'bg-dialog shadow-overlay ' + fieldsOnDialog;\n\n/**\n * The app frame and the panels docked beside it. Same elevation as a card, one\n * step lower fill: a frame is a hole cut in the rail, and what sits inside it —\n * cards, fields, tables — needs a step to rise above. `Card` is for that\n * content, never for the frame around it.\n */\nexport const frameSurfaceStyle = 'bg-background shadow-raised ' + fieldsOnPage;\n\n/**\n * The frame's fill without its elevation, for a frame that is raised only at\n * some breakpoints: `MainCard` is flat page content below `lg`.\n */\nexport const frameFillStyle = 'bg-background ' + fieldsOnPage;\n\n/**\n * Interaction states for a surface that already carries an opaque fill. The\n * `state-layer` utility in `components.css` holds the reasoning and the measured\n * numbers: the rung has to be layered, never swapped into `background-color`.\n */\nexport const surfaceStateLayerStyle = 'state-layer';\n\n/**\n * Same layer, driven by an ancestor marked `group` rather than the surface\n * itself. A utility cannot read an ancestor's state, so this one stays composed\n * from variants — `isolate` and the negative z-index do the same job as the\n * utility's, and `inset-px` likewise keeps the inset rim visible.\n */\nexport const surfaceGroupStateLayerStyle =\n 'relative isolate before:pointer-events-none before:absolute before:-z-1 before:inset-px before:rounded-[inherit] before:transition-colors before:duration-fast motion-reduce:before:transition-none group-hover:before:bg-fill-subtle group-focus-visible:before:bg-fill-subtle';\n"],"names":[],"mappings":";;;;AA6BA,MAAM,eAAA,GACJ,wHAAA;AACF,MAAM,cAAA,GACJ,+GAAA;AACF,MAAM,YAAA,GAAe,8FAAA;AAEd,MAAM,qBAAqB,qDAAA,GAAwD;AAEnF,MAAM,sBAAsB,yBAAA,GAA4B;AAExD,MAAM,qBAAqB,2BAAA,GAA8B;AAQzD,MAAM,oBAAoB,8BAAA,GAAiC;AAM3D,MAAM,iBAAiB,gBAAA,GAAmB;AAO1C,MAAM,sBAAA,GAAyB;AAQ/B,MAAM,2BAAA,GACX;;;;;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"raised-surface.es.js","sources":["../../src/ds/primitives/raised-surface.ts"],"sourcesContent":["/**\n * Two recipes, because elevation encodes distance from the canvas and there are\n * only two distances in this product.\n *\n * A *raised* surface sits in the flow — card, list panel, settings container,\n * table head, app frame. It lifts a couple of pixels, which is also what keeps\n * it honest: a tile in a grid inside a scroller is clipped by that scroller, so\n * a shadow that bleeds further than the tile's own clearance gets sliced into a\n * hard line along the container edge.\n *\n * An *overlay* is detached — popover, dropdown, dialog, drawer, tooltip. It is\n * never clipped, has to separate from arbitrary content beneath it, and so\n * carries the long falloff.\n *\n * Both recipes carry a `--surface-rim` inset edge, a top highlight in dark,\n * and elevation drops. Adding a CSS border on that same edge doubles it.\n * Content dividers use `--border`; frame headers use `border-surface-rim`\n * and stay inside the inset pixel reserved by MainCard.\n *\n * Radius is deliberately absent — it belongs to the family (`rounded-xl` for a\n * popup, `rounded-studio-frame` for the app frame).\n *\n * A raised surface pins its own fill across states. Interaction is expressed by\n * the state layer below, never by swapping the background: `Button`'s variants\n * all drive `background-color` on hover, and a raised surface wearing one would\n * otherwise turn translucent mid-hover and composite over the canvas. A call\n * site that genuinely wants another fill still overrides it, since its own\n * classes come after these.\n */\nconst fieldsOnSurface =\n '[--field:var(--field-on-surface)] [--field-disabled:var(--field-on-surface)] [--field-rim:var(--field-rim-on-surface)]';\nconst fieldsOnDialog =\n '[--field:var(--field-on-surface)] [--field-disabled:var(--field-on-surface)] [--field-rim:var(--surface-rim)]';\nconst fieldsOnPage = '[--field:var(--card)] [--field-disabled:var(--fill-subtle)] [--field-rim:var(--surface-rim)]';\n\nexport const raisedSurfaceStyle = 'bg-card hover:bg-card active:bg-card shadow-raised ' + fieldsOnSurface;\n\nexport const overlaySurfaceStyle = 'bg-card shadow-overlay ' + fieldsOnSurface;\n\nexport const dialogSurfaceStyle = 'bg-dialog shadow-overlay ' + fieldsOnDialog;\n\n/**\n * The app frame and the panels docked beside it. Same elevation as a card, one\n * step lower fill: a frame is a hole cut in the rail, and what sits inside it —\n * cards, fields, tables — needs a step to rise above. `Card` is for that\n * content, never for the frame around it.\n */\nexport const frameSurfaceStyle = 'bg-background shadow-raised ' + fieldsOnPage;\n\n/**\n * The frame's fill without its elevation, for a frame that is raised only at\n * some breakpoints: `MainCard` is flat page content below `lg`.\n */\nexport const frameFillStyle = 'bg-background ' + fieldsOnPage;\n\n/**\n * Interaction states for a surface that already carries an opaque fill. The\n * `state-layer` utility in `src/index.css` holds the reasoning and the measured\n * numbers: the rung has to be layered, never swapped into `background-color`.\n */\nexport const surfaceStateLayerStyle = 'state-layer';\n\n/**\n * Same layer, driven by an ancestor marked `group` rather than the surface\n * itself. A utility cannot read an ancestor's state, so this one stays composed\n * from variants — `isolate` and the negative z-index do the same job as the\n * utility's, and `inset-px` likewise keeps the inset rim visible.\n */\nexport const surfaceGroupStateLayerStyle =\n 'relative isolate before:pointer-events-none before:absolute before:-z-1 before:inset-px before:rounded-[inherit] before:transition-colors before:duration-fast motion-reduce:before:transition-none group-hover:before:bg-fill-subtle group-focus-visible:before:bg-fill-subtle';\n"],"names":[],"mappings":"AA6BA,MAAM,eAAA,GACJ,wHAAA;AACF,MAAM,cAAA,GACJ,+GAAA;AACF,MAAM,YAAA,GAAe,8FAAA;AAEd,MAAM,qBAAqB,qDAAA,GAAwD;AAEnF,MAAM,sBAAsB,yBAAA,GAA4B;AAExD,MAAM,qBAAqB,2BAAA,GAA8B;AAQzD,MAAM,oBAAoB,8BAAA,GAAiC;AAM3D,MAAM,iBAAiB,gBAAA,GAAmB;AAO1C,MAAM,sBAAA,GAAyB;AAQ/B,MAAM,2BAAA,GACX;;;;"}
1
+ {"version":3,"file":"raised-surface.es.js","sources":["../../src/ds/primitives/raised-surface.ts"],"sourcesContent":["/**\n * Two recipes, because elevation encodes distance from the canvas and there are\n * only two distances in this product.\n *\n * A *raised* surface sits in the flow — card, list panel, settings container,\n * table head, app frame. It lifts a couple of pixels, which is also what keeps\n * it honest: a tile in a grid inside a scroller is clipped by that scroller, so\n * a shadow that bleeds further than the tile's own clearance gets sliced into a\n * hard line along the container edge.\n *\n * An *overlay* is detached — popover, dropdown, dialog, drawer, tooltip. It is\n * never clipped, has to separate from arbitrary content beneath it, and so\n * carries the long falloff.\n *\n * Both recipes carry a `--surface-rim` inset edge, a top highlight in dark,\n * and elevation drops. Adding a CSS border on that same edge doubles it.\n * Content dividers use `--border`; frame headers use `border-surface-rim`\n * and stay inside the inset pixel reserved by MainCard.\n *\n * Radius is deliberately absent — it belongs to the family (`rounded-xl` for a\n * popup, `rounded-studio-frame` for the app frame).\n *\n * A raised surface pins its own fill across states. Interaction is expressed by\n * the state layer below, never by swapping the background: `Button`'s variants\n * all drive `background-color` on hover, and a raised surface wearing one would\n * otherwise turn translucent mid-hover and composite over the canvas. A call\n * site that genuinely wants another fill still overrides it, since its own\n * classes come after these.\n */\nconst fieldsOnSurface =\n '[--field:var(--field-on-surface)] [--field-disabled:var(--field-on-surface)] [--field-rim:var(--field-rim-on-surface)]';\nconst fieldsOnDialog =\n '[--field:var(--field-on-surface)] [--field-disabled:var(--field-on-surface)] [--field-rim:var(--surface-rim)]';\nconst fieldsOnPage = '[--field:var(--card)] [--field-disabled:var(--fill-subtle)] [--field-rim:var(--surface-rim)]';\n\nexport const raisedSurfaceStyle = 'bg-card hover:bg-card active:bg-card shadow-raised ' + fieldsOnSurface;\n\nexport const overlaySurfaceStyle = 'bg-card shadow-overlay ' + fieldsOnSurface;\n\nexport const dialogSurfaceStyle = 'bg-dialog shadow-overlay ' + fieldsOnDialog;\n\n/**\n * The app frame and the panels docked beside it. Same elevation as a card, one\n * step lower fill: a frame is a hole cut in the rail, and what sits inside it —\n * cards, fields, tables — needs a step to rise above. `Card` is for that\n * content, never for the frame around it.\n */\nexport const frameSurfaceStyle = 'bg-background shadow-raised ' + fieldsOnPage;\n\n/**\n * The frame's fill without its elevation, for a frame that is raised only at\n * some breakpoints: `MainCard` is flat page content below `lg`.\n */\nexport const frameFillStyle = 'bg-background ' + fieldsOnPage;\n\n/**\n * Interaction states for a surface that already carries an opaque fill. The\n * `state-layer` utility in `components.css` holds the reasoning and the measured\n * numbers: the rung has to be layered, never swapped into `background-color`.\n */\nexport const surfaceStateLayerStyle = 'state-layer';\n\n/**\n * Same layer, driven by an ancestor marked `group` rather than the surface\n * itself. A utility cannot read an ancestor's state, so this one stays composed\n * from variants — `isolate` and the negative z-index do the same job as the\n * utility's, and `inset-px` likewise keeps the inset rim visible.\n */\nexport const surfaceGroupStateLayerStyle =\n 'relative isolate before:pointer-events-none before:absolute before:-z-1 before:inset-px before:rounded-[inherit] before:transition-colors before:duration-fast motion-reduce:before:transition-none group-hover:before:bg-fill-subtle group-focus-visible:before:bg-fill-subtle';\n"],"names":[],"mappings":"AA6BA,MAAM,eAAA,GACJ,wHAAA;AACF,MAAM,cAAA,GACJ,+GAAA;AACF,MAAM,YAAA,GAAe,8FAAA;AAEd,MAAM,qBAAqB,qDAAA,GAAwD;AAEnF,MAAM,sBAAsB,yBAAA,GAA4B;AAExD,MAAM,qBAAqB,2BAAA,GAA8B;AAQzD,MAAM,oBAAoB,8BAAA,GAAiC;AAM3D,MAAM,iBAAiB,gBAAA,GAAmB;AAO1C,MAAM,sBAAA,GAAyB;AAQ/B,MAAM,2BAAA,GACX;;;;"}
@@ -1 +1 @@
1
- export { SaveAsDatasetItemDialog, type SaveAsDatasetItemDialogProps } from './save-as-dataset-item-dialog';
1
+ export { SaveAsDatasetItemDialog, type SaveAsDatasetItemDialogProps, type CreateDatasetDialogRenderProps, } from './save-as-dataset-item-dialog';
@@ -1,5 +1,10 @@
1
1
  import { ReactNode } from 'react';
2
- import { SideDialogRootProps } from '../../../ds/components/SideDialog';
2
+ import { DataPanelProps } from '../../../ds/components/DataPanel';
3
+ export type CreateDatasetDialogRenderProps = {
4
+ open: boolean;
5
+ onOpenChange: (open: boolean) => void;
6
+ onSuccess: (datasetId: string) => void;
7
+ };
3
8
  export type SaveAsDatasetItemDialogProps = {
4
9
  initialInput: string;
5
10
  initialGroundTruth: string;
@@ -12,10 +17,16 @@ export type SaveAsDatasetItemDialogProps = {
12
17
  breadcrumb: ReactNode;
13
18
  isOpen: boolean;
14
19
  onClose: () => void;
15
- level?: SideDialogRootProps['level'];
20
+ /** Sibling-drawer elevation (see `DataPanel`); render after the panel it covers. */
21
+ depth?: DataPanelProps['depth'];
16
22
  source?: {
17
23
  type: 'csv' | 'json' | 'trace' | 'llm' | 'experiment-result' | 'candidate-screener';
18
24
  referenceId?: string;
19
25
  };
26
+ /**
27
+ * Renders a create-dataset dialog. When set, the Dataset select offers "Create dataset" as its
28
+ * first option and selects the new dataset once created.
29
+ */
30
+ renderCreateDatasetDialog?: (props: CreateDatasetDialogRenderProps) => ReactNode;
20
31
  };
21
- export declare function SaveAsDatasetItemDialog({ initialInput, initialGroundTruth, initialTrajectory, trajectoryLoading, initialToolMocks, breadcrumb, isOpen, onClose, level, source, }: SaveAsDatasetItemDialogProps): import("react").JSX.Element;
32
+ export declare function SaveAsDatasetItemDialog({ initialInput, initialGroundTruth, initialTrajectory, trajectoryLoading, initialToolMocks, breadcrumb, isOpen, onClose, depth, source, renderCreateDatasetDialog, }: SaveAsDatasetItemDialogProps): import("react").JSX.Element;
@@ -1,5 +1,6 @@
1
+ import { SaveAsDatasetItemDialogProps } from '../../datasets';
1
2
  import { SpanRecord } from '../../traces/types';
2
- import { SideDialogRootProps } from '../../../ds/components/SideDialog';
3
+ import { DataPanelProps } from '../../../ds/components/DataPanel';
3
4
  type TraceAsItemDialogProps = {
4
5
  /** Full span record — if provided, used directly (no fetch). */
5
6
  traceDetails?: SpanRecord;
@@ -8,7 +9,8 @@ type TraceAsItemDialogProps = {
8
9
  traceId?: string;
9
10
  isOpen: boolean;
10
11
  onClose: () => void;
11
- level?: SideDialogRootProps['level'];
12
+ depth?: DataPanelProps['depth'];
13
+ renderCreateDatasetDialog?: SaveAsDatasetItemDialogProps['renderCreateDatasetDialog'];
12
14
  };
13
- export declare function TraceAsItemDialog({ traceDetails: externalTraceDetails, rootSpanId, traceId, isOpen, onClose, level, }: TraceAsItemDialogProps): import("react").JSX.Element;
15
+ export declare function TraceAsItemDialog({ traceDetails: externalTraceDetails, rootSpanId, traceId, isOpen, onClose, depth, renderCreateDatasetDialog, }: TraceAsItemDialogProps): import("react").JSX.Element;
14
16
  export {};
@@ -1,12 +1,12 @@
1
1
  import { ClientScoreRowData } from '@mastra/client-js';
2
2
  import { ScoreRowData } from '@mastra/core/evals';
3
- import { SideDialogRootProps } from '../../../ds/components/SideDialog';
3
+ import { DataPanelProps } from '../../../ds/components/DataPanel';
4
4
  type ScoreForDatasetItem = ScoreRowData | ClientScoreRowData;
5
5
  export type ScoreAsItemDialogProps = {
6
6
  score?: ScoreForDatasetItem;
7
7
  isOpen: boolean;
8
8
  onClose: () => void;
9
- level?: SideDialogRootProps['level'];
9
+ depth?: DataPanelProps['depth'];
10
10
  };
11
- export declare function ScoreAsItemDialog({ score, isOpen, onClose, level }: ScoreAsItemDialogProps): import("react").JSX.Element;
11
+ export declare function ScoreAsItemDialog({ score, isOpen, onClose, depth }: ScoreAsItemDialogProps): import("react").JSX.Element;
12
12
  export {};
@@ -24,7 +24,7 @@ export interface CrumbProps {
24
24
  action?: React.ReactNode;
25
25
  /**
26
26
  * Entity switcher rendered next to the label; spread `crumbSwitcherTriggerProps` on it.
27
- * On the current crumb there is nowhere to navigate, so its hit area covers the whole crumb.
27
+ * When the crumb doesn't navigate (current crumb, or no `to`), its hit area covers the whole crumb.
28
28
  */
29
29
  switcher?: React.ReactNode;
30
30
  'data-testid'?: string;
@@ -32,4 +32,4 @@ export interface CrumbProps {
32
32
  export declare const CrumbSkeleton: (props: {
33
33
  "data-testid"?: string;
34
34
  }) => React.JSX.Element;
35
- export declare const Crumb: ({ className, as, isCurrent, action, switcher, icon, isLoading, children, ...props }: CrumbProps) => React.JSX.Element;
35
+ export declare const Crumb: ({ className, as, to, isCurrent, action, switcher, icon, isLoading, children, ...props }: CrumbProps) => React.JSX.Element;
@@ -8,7 +8,7 @@ export interface CodeProps extends React.HTMLAttributes<HTMLPreElement> {
8
8
  /**
9
9
  * Low-level shiki token renderer shared by `CodeBlock` and `MarkdownRenderer`.
10
10
  * Dual-theme colors stay as `--shiki-light` / `--shiki-dark` CSS variables on
11
- * each token span; the `.shiki-token` class (index.css) picks the variant from
11
+ * each token span; the `.shiki-token` class (components.css) picks the variant from
12
12
  * the `.dark` root class, so theme switching is pure CSS — no ThemeProvider
13
13
  * required. Renders plain text while highlighting is pending or when the
14
14
  * language is missing/unknown.
@@ -15,7 +15,7 @@ export declare const frameSurfaceStyle: string;
15
15
  export declare const frameFillStyle: string;
16
16
  /**
17
17
  * Interaction states for a surface that already carries an opaque fill. The
18
- * `state-layer` utility in `src/index.css` holds the reasoning and the measured
18
+ * `state-layer` utility in `components.css` holds the reasoning and the measured
19
19
  * numbers: the rung has to be layered, never swapped into `background-color`.
20
20
  */
21
21
  export declare const surfaceStateLayerStyle = "state-layer";
package/dist/style.css CHANGED
@@ -193,8 +193,6 @@
193
193
  --color-brand-blue: #6ccdfb;
194
194
  --color-brand-red: #ff4758;
195
195
  --color-brand-yellow: #e7e67b;
196
- --color-warning-subtle: var(--warning-subtle);
197
- --color-warning-indicator: var(--warning-indicator);
198
196
  --color-scrim: var(--scrim);
199
197
  --color-surface-overlay-soft: var(--surface-overlay-soft);
200
198
  --color-surface-overlay-strong: var(--surface-overlay-strong);
@@ -279,7 +277,6 @@
279
277
  --duration-slow: .3s;
280
278
  --ease-out-custom: cubic-bezier(.33, 1, .68, 1);
281
279
  --color-background: var(--background);
282
- --color-sidebar: var(--sidebar);
283
280
  }
284
281
  }
285
282
 
@@ -3919,6 +3916,12 @@
3919
3916
  animation: var(--animate-spin);
3920
3917
  }
3921
3918
 
3919
+ .time-input::-webkit-calendar-picker-indicator {
3920
+ cursor: pointer;
3921
+ filter: invert(50%);
3922
+ background: url("/icons/clock.svg") center / 1em 1em no-repeat;
3923
+ }
3924
+
3922
3925
  .cursor-col-resize {
3923
3926
  cursor: col-resize;
3924
3927
  }
@@ -14180,6 +14183,22 @@ html.light {
14180
14183
  --chart-sequential-5: var(--purple-500);
14181
14184
  }
14182
14185
 
14186
+ :root {
14187
+ --syntax-string: var(--green-300);
14188
+ --syntax-keyword: var(--red-400);
14189
+ --syntax-literal: var(--amber-300);
14190
+ --syntax-name: var(--cyan-300);
14191
+ --syntax-link: var(--blue-400);
14192
+ }
14193
+
14194
+ html.light {
14195
+ --syntax-string: var(--green-700);
14196
+ --syntax-keyword: var(--red-600);
14197
+ --syntax-literal: var(--amber-800);
14198
+ --syntax-name: var(--cyan-800);
14199
+ --syntax-link: var(--blue-600);
14200
+ }
14201
+
14183
14202
  :root {
14184
14203
  --fill-tint: 100%;
14185
14204
  --fill-subtle: oklch(var(--fill-tint) 0 0 / 4%);
@@ -14292,22 +14311,6 @@ html.light {
14292
14311
  --placeholder: var(--gray-7);
14293
14312
  }
14294
14313
 
14295
- .cm-editor {
14296
- --syntax-string: var(--green-300);
14297
- --syntax-keyword: var(--red-400);
14298
- --syntax-literal: var(--amber-300);
14299
- --syntax-name: var(--cyan-300);
14300
- --syntax-link: var(--blue-400);
14301
- }
14302
-
14303
- html.light .cm-editor {
14304
- --syntax-string: var(--green-700);
14305
- --syntax-keyword: var(--red-600);
14306
- --syntax-literal: var(--amber-800);
14307
- --syntax-name: var(--cyan-800);
14308
- --syntax-link: var(--blue-600);
14309
- }
14310
-
14311
14314
  .thread-viewport > [data-radix-scroll-area-content] {
14312
14315
  background-color: inherit;
14313
14316
  flex-direction: column;
package/dist/toast.css CHANGED
@@ -1,5 +1,5 @@
1
1
  /* Toast tokens live here — only consumed by `.mastra-toaster` so they don't need to ship in
2
- index.css for every component. The bg/border alias theme-scoped status roles, so the single
2
+ components.css for every component. The bg/border alias theme-scoped status roles, so the single
3
3
  :root declaration flips with the theme. */
4
4
  :root {
5
5
  --toast-success-bg: var(--success-subtle);
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.cjs.js","sources":["../src/ds/tokens/animations.ts","../src/ds/tokens/borders.ts","../src/ds/tokens/fonts.ts","../src/ds/tokens/shadows.ts","../src/ds/tokens/sizes.ts"],"sourcesContent":["/** Named duration rungs, one per `@utility duration-*` in `theme/motion.css`. Tailwind cannot\n * infer a custom utility, so `lib/tw-merge-config.ts` registers these names to keep\n * `duration-fast` and `duration-slow` from both surviving a merge. */\nexport const Durations = ['fast', 'normal', 'slow'] as const;\n\n/** Entrance played by anything the reader watches arrive. Defined in `ds/components/Arrival/arrival.css`. */\nexport const ARRIVING_CLASS = 'mastra-arriving';\n\n/** How long that entrance runs, and so how long a word counts as new. Kept in step with `arrival.css`. */\nexport const ARRIVING_MS = 800;\n","export const BorderRadius = {\n none: 'var(--radius-none)',\n sm: 'var(--radius-sm)',\n md: 'var(--radius-md)',\n lg: 'var(--radius-lg)',\n xl: 'var(--radius-xl)',\n};\n","// Every `--text-*` role in `theme/typography.css`, in scale order. `lib/tw-merge-config.ts`\n// turns this list into the `font-size` conflict group, so one role class cleanly replaces\n// another in `cn()`; a role added to the CSS and missing here silently stops deduping.\n// `theme-export.test.ts` holds the two sides in step.\n//\n// A role is a complete text style: the size arrives with the weight, line height and\n// tracking declared beside it in the CSS. Components pick a role; they never assemble one,\n// and nothing mirrors those values here — the foundations story reads them off the element.\nexport const TextRoles = [\n 'hero',\n 'lead',\n 'display',\n 'title',\n 'heading',\n 'subheading',\n 'body',\n 'label',\n 'card-title',\n 'card-title-tight',\n 'card-title-strong',\n 'body-sm',\n 'column',\n 'caption',\n 'eyebrow',\n 'meta',\n] as const;\n\nexport type TextRole = (typeof TextRoles)[number];\n\n/** SVG/canvas text can't read CSS tokens; these mirror `meta` (10px) and `caption` (12px). */\nexport const CHART_TICK_FONT_SIZE = 10;\nexport const CHART_LABEL_FONT_SIZE = 12;\n","// The `shadow-raised` / `shadow-overlay` utilities compose lip + rim + drops on\n// the element (see `src/index.css`); these are the drop layers they pull in.\nexport const Shadows = {\n raised: 'var(--elevation-raised)',\n overlay: 'var(--elevation-overlay)',\n input: 'var(--elevation-raised)',\n};\n","export const Sizes = {\n 'icon-xs': '12px',\n 'icon-sm': '14px',\n 'icon-md': '16px',\n 'icon-lg': '20px',\n 'control-sm': '1.75rem',\n 'control-md': '1.875rem',\n 'control-lg': '2rem',\n 'header-default': '40px',\n 'table-header': '28px',\n 'table-row': '40px',\n 'table-row-small': '32px',\n 'avatar-sm': '24px',\n 'avatar-md': '32px',\n 'avatar-lg': '40px',\n dropdown: '300px',\n};\n"],"names":[],"mappings":";;;;;;AAGO,MAAM,SAAA,GAAY,CAAC,MAAA,EAAQ,QAAA,EAAU,MAAM;AAG3C,MAAM,cAAA,GAAiB;AAGvB,MAAM,WAAA,GAAc;;ACTpB,MAAM,YAAA,GAAe;AAAA,EAC1B,IAAA,EAAM,oBAAA;AAAA,EACN,EAAA,EAAI,kBAAA;AAAA,EACJ,EAAA,EAAI,kBAAA;AAAA,EACJ,EAAA,EAAI,kBAAA;AAAA,EACJ,EAAA,EAAI;AACN;;ACEO,MAAM,SAAA,GAAY;AAAA,EACvB,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,kBAAA;AAAA,EACA,mBAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF;AAKO,MAAM,oBAAA,GAAuB;AAC7B,MAAM,qBAAA,GAAwB;;AC7B9B,MAAM,OAAA,GAAU;AAAA,EACrB,MAAA,EAAQ,yBAAA;AAAA,EACR,OAAA,EAAS,0BAAA;AAAA,EACT,KAAA,EAAO;AACT;;ACNO,MAAM,KAAA,GAAQ;AAAA,EACnB,SAAA,EAAW,MAAA;AAAA,EACX,SAAA,EAAW,MAAA;AAAA,EACX,SAAA,EAAW,MAAA;AAAA,EACX,SAAA,EAAW,MAAA;AAAA,EACX,YAAA,EAAc,SAAA;AAAA,EACd,YAAA,EAAc,UAAA;AAAA,EACd,YAAA,EAAc,MAAA;AAAA,EACd,gBAAA,EAAkB,MAAA;AAAA,EAClB,cAAA,EAAgB,MAAA;AAAA,EAChB,WAAA,EAAa,MAAA;AAAA,EACb,iBAAA,EAAmB,MAAA;AAAA,EACnB,WAAA,EAAa,MAAA;AAAA,EACb,WAAA,EAAa,MAAA;AAAA,EACb,WAAA,EAAa,MAAA;AAAA,EACb,QAAA,EAAU;AACZ;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"tokens.cjs.js","sources":["../src/ds/tokens/animations.ts","../src/ds/tokens/borders.ts","../src/ds/tokens/fonts.ts","../src/ds/tokens/shadows.ts","../src/ds/tokens/sizes.ts"],"sourcesContent":["/** Named duration rungs, one per `@utility duration-*` in `theme/motion.css`. Tailwind cannot\n * infer a custom utility, so `lib/tw-merge-config.ts` registers these names to keep\n * `duration-fast` and `duration-slow` from both surviving a merge. */\nexport const Durations = ['fast', 'normal', 'slow'] as const;\n\n/** Entrance played by anything the reader watches arrive. Defined in `ds/components/Arrival/arrival.css`. */\nexport const ARRIVING_CLASS = 'mastra-arriving';\n\n/** How long that entrance runs, and so how long a word counts as new. Kept in step with `arrival.css`. */\nexport const ARRIVING_MS = 800;\n","export const BorderRadius = {\n none: 'var(--radius-none)',\n sm: 'var(--radius-sm)',\n md: 'var(--radius-md)',\n lg: 'var(--radius-lg)',\n xl: 'var(--radius-xl)',\n};\n","// Every `--text-*` role in `theme/typography.css`, in scale order. `lib/tw-merge-config.ts`\n// turns this list into the `font-size` conflict group, so one role class cleanly replaces\n// another in `cn()`; a role added to the CSS and missing here silently stops deduping.\n// `theme-export.test.ts` holds the two sides in step.\n//\n// A role is a complete text style: the size arrives with the weight, line height and\n// tracking declared beside it in the CSS. Components pick a role; they never assemble one,\n// and nothing mirrors those values here — the foundations story reads them off the element.\nexport const TextRoles = [\n 'hero',\n 'lead',\n 'display',\n 'title',\n 'heading',\n 'subheading',\n 'body',\n 'label',\n 'card-title',\n 'card-title-tight',\n 'card-title-strong',\n 'body-sm',\n 'column',\n 'caption',\n 'eyebrow',\n 'meta',\n] as const;\n\nexport type TextRole = (typeof TextRoles)[number];\n\n/** SVG/canvas text can't read CSS tokens; these mirror `meta` (10px) and `caption` (12px). */\nexport const CHART_TICK_FONT_SIZE = 10;\nexport const CHART_LABEL_FONT_SIZE = 12;\n","// The `shadow-raised` / `shadow-overlay` utilities compose lip + rim + drops on\n// the element (see `components.css`); these are the drop layers they pull in.\nexport const Shadows = {\n raised: 'var(--elevation-raised)',\n overlay: 'var(--elevation-overlay)',\n input: 'var(--elevation-raised)',\n};\n","export const Sizes = {\n 'icon-xs': '12px',\n 'icon-sm': '14px',\n 'icon-md': '16px',\n 'icon-lg': '20px',\n 'control-sm': '1.75rem',\n 'control-md': '1.875rem',\n 'control-lg': '2rem',\n 'header-default': '40px',\n 'table-header': '28px',\n 'table-row': '40px',\n 'table-row-small': '32px',\n 'avatar-sm': '24px',\n 'avatar-md': '32px',\n 'avatar-lg': '40px',\n dropdown: '300px',\n};\n"],"names":[],"mappings":";;;;;;AAGO,MAAM,SAAA,GAAY,CAAC,MAAA,EAAQ,QAAA,EAAU,MAAM;AAG3C,MAAM,cAAA,GAAiB;AAGvB,MAAM,WAAA,GAAc;;ACTpB,MAAM,YAAA,GAAe;AAAA,EAC1B,IAAA,EAAM,oBAAA;AAAA,EACN,EAAA,EAAI,kBAAA;AAAA,EACJ,EAAA,EAAI,kBAAA;AAAA,EACJ,EAAA,EAAI,kBAAA;AAAA,EACJ,EAAA,EAAI;AACN;;ACEO,MAAM,SAAA,GAAY;AAAA,EACvB,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,kBAAA;AAAA,EACA,mBAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF;AAKO,MAAM,oBAAA,GAAuB;AAC7B,MAAM,qBAAA,GAAwB;;AC7B9B,MAAM,OAAA,GAAU;AAAA,EACrB,MAAA,EAAQ,yBAAA;AAAA,EACR,OAAA,EAAS,0BAAA;AAAA,EACT,KAAA,EAAO;AACT;;ACNO,MAAM,KAAA,GAAQ;AAAA,EACnB,SAAA,EAAW,MAAA;AAAA,EACX,SAAA,EAAW,MAAA;AAAA,EACX,SAAA,EAAW,MAAA;AAAA,EACX,SAAA,EAAW,MAAA;AAAA,EACX,YAAA,EAAc,SAAA;AAAA,EACd,YAAA,EAAc,UAAA;AAAA,EACd,YAAA,EAAc,MAAA;AAAA,EACd,gBAAA,EAAkB,MAAA;AAAA,EAClB,cAAA,EAAgB,MAAA;AAAA,EAChB,WAAA,EAAa,MAAA;AAAA,EACb,iBAAA,EAAmB,MAAA;AAAA,EACnB,WAAA,EAAa,MAAA;AAAA,EACb,WAAA,EAAa,MAAA;AAAA,EACb,WAAA,EAAa,MAAA;AAAA,EACb,QAAA,EAAU;AACZ;;;;;;;;;;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"tokens.es.js","sources":["../src/ds/tokens/animations.ts","../src/ds/tokens/borders.ts","../src/ds/tokens/fonts.ts","../src/ds/tokens/shadows.ts","../src/ds/tokens/sizes.ts"],"sourcesContent":["/** Named duration rungs, one per `@utility duration-*` in `theme/motion.css`. Tailwind cannot\n * infer a custom utility, so `lib/tw-merge-config.ts` registers these names to keep\n * `duration-fast` and `duration-slow` from both surviving a merge. */\nexport const Durations = ['fast', 'normal', 'slow'] as const;\n\n/** Entrance played by anything the reader watches arrive. Defined in `ds/components/Arrival/arrival.css`. */\nexport const ARRIVING_CLASS = 'mastra-arriving';\n\n/** How long that entrance runs, and so how long a word counts as new. Kept in step with `arrival.css`. */\nexport const ARRIVING_MS = 800;\n","export const BorderRadius = {\n none: 'var(--radius-none)',\n sm: 'var(--radius-sm)',\n md: 'var(--radius-md)',\n lg: 'var(--radius-lg)',\n xl: 'var(--radius-xl)',\n};\n","// Every `--text-*` role in `theme/typography.css`, in scale order. `lib/tw-merge-config.ts`\n// turns this list into the `font-size` conflict group, so one role class cleanly replaces\n// another in `cn()`; a role added to the CSS and missing here silently stops deduping.\n// `theme-export.test.ts` holds the two sides in step.\n//\n// A role is a complete text style: the size arrives with the weight, line height and\n// tracking declared beside it in the CSS. Components pick a role; they never assemble one,\n// and nothing mirrors those values here — the foundations story reads them off the element.\nexport const TextRoles = [\n 'hero',\n 'lead',\n 'display',\n 'title',\n 'heading',\n 'subheading',\n 'body',\n 'label',\n 'card-title',\n 'card-title-tight',\n 'card-title-strong',\n 'body-sm',\n 'column',\n 'caption',\n 'eyebrow',\n 'meta',\n] as const;\n\nexport type TextRole = (typeof TextRoles)[number];\n\n/** SVG/canvas text can't read CSS tokens; these mirror `meta` (10px) and `caption` (12px). */\nexport const CHART_TICK_FONT_SIZE = 10;\nexport const CHART_LABEL_FONT_SIZE = 12;\n","// The `shadow-raised` / `shadow-overlay` utilities compose lip + rim + drops on\n// the element (see `src/index.css`); these are the drop layers they pull in.\nexport const Shadows = {\n raised: 'var(--elevation-raised)',\n overlay: 'var(--elevation-overlay)',\n input: 'var(--elevation-raised)',\n};\n","export const Sizes = {\n 'icon-xs': '12px',\n 'icon-sm': '14px',\n 'icon-md': '16px',\n 'icon-lg': '20px',\n 'control-sm': '1.75rem',\n 'control-md': '1.875rem',\n 'control-lg': '2rem',\n 'header-default': '40px',\n 'table-header': '28px',\n 'table-row': '40px',\n 'table-row-small': '32px',\n 'avatar-sm': '24px',\n 'avatar-md': '32px',\n 'avatar-lg': '40px',\n dropdown: '300px',\n};\n"],"names":[],"mappings":";;AAGO,MAAM,SAAA,GAAY,CAAC,MAAA,EAAQ,QAAA,EAAU,MAAM;AAG3C,MAAM,cAAA,GAAiB;AAGvB,MAAM,WAAA,GAAc;;ACTpB,MAAM,YAAA,GAAe;AAAA,EAC1B,IAAA,EAAM,oBAAA;AAAA,EACN,EAAA,EAAI,kBAAA;AAAA,EACJ,EAAA,EAAI,kBAAA;AAAA,EACJ,EAAA,EAAI,kBAAA;AAAA,EACJ,EAAA,EAAI;AACN;;ACEO,MAAM,SAAA,GAAY;AAAA,EACvB,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,kBAAA;AAAA,EACA,mBAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF;AAKO,MAAM,oBAAA,GAAuB;AAC7B,MAAM,qBAAA,GAAwB;;AC7B9B,MAAM,OAAA,GAAU;AAAA,EACrB,MAAA,EAAQ,yBAAA;AAAA,EACR,OAAA,EAAS,0BAAA;AAAA,EACT,KAAA,EAAO;AACT;;ACNO,MAAM,KAAA,GAAQ;AAAA,EACnB,SAAA,EAAW,MAAA;AAAA,EACX,SAAA,EAAW,MAAA;AAAA,EACX,SAAA,EAAW,MAAA;AAAA,EACX,SAAA,EAAW,MAAA;AAAA,EACX,YAAA,EAAc,SAAA;AAAA,EACd,YAAA,EAAc,UAAA;AAAA,EACd,YAAA,EAAc,MAAA;AAAA,EACd,gBAAA,EAAkB,MAAA;AAAA,EAClB,cAAA,EAAgB,MAAA;AAAA,EAChB,WAAA,EAAa,MAAA;AAAA,EACb,iBAAA,EAAmB,MAAA;AAAA,EACnB,WAAA,EAAa,MAAA;AAAA,EACb,WAAA,EAAa,MAAA;AAAA,EACb,WAAA,EAAa,MAAA;AAAA,EACb,QAAA,EAAU;AACZ;;;;"}
1
+ {"version":3,"file":"tokens.es.js","sources":["../src/ds/tokens/animations.ts","../src/ds/tokens/borders.ts","../src/ds/tokens/fonts.ts","../src/ds/tokens/shadows.ts","../src/ds/tokens/sizes.ts"],"sourcesContent":["/** Named duration rungs, one per `@utility duration-*` in `theme/motion.css`. Tailwind cannot\n * infer a custom utility, so `lib/tw-merge-config.ts` registers these names to keep\n * `duration-fast` and `duration-slow` from both surviving a merge. */\nexport const Durations = ['fast', 'normal', 'slow'] as const;\n\n/** Entrance played by anything the reader watches arrive. Defined in `ds/components/Arrival/arrival.css`. */\nexport const ARRIVING_CLASS = 'mastra-arriving';\n\n/** How long that entrance runs, and so how long a word counts as new. Kept in step with `arrival.css`. */\nexport const ARRIVING_MS = 800;\n","export const BorderRadius = {\n none: 'var(--radius-none)',\n sm: 'var(--radius-sm)',\n md: 'var(--radius-md)',\n lg: 'var(--radius-lg)',\n xl: 'var(--radius-xl)',\n};\n","// Every `--text-*` role in `theme/typography.css`, in scale order. `lib/tw-merge-config.ts`\n// turns this list into the `font-size` conflict group, so one role class cleanly replaces\n// another in `cn()`; a role added to the CSS and missing here silently stops deduping.\n// `theme-export.test.ts` holds the two sides in step.\n//\n// A role is a complete text style: the size arrives with the weight, line height and\n// tracking declared beside it in the CSS. Components pick a role; they never assemble one,\n// and nothing mirrors those values here — the foundations story reads them off the element.\nexport const TextRoles = [\n 'hero',\n 'lead',\n 'display',\n 'title',\n 'heading',\n 'subheading',\n 'body',\n 'label',\n 'card-title',\n 'card-title-tight',\n 'card-title-strong',\n 'body-sm',\n 'column',\n 'caption',\n 'eyebrow',\n 'meta',\n] as const;\n\nexport type TextRole = (typeof TextRoles)[number];\n\n/** SVG/canvas text can't read CSS tokens; these mirror `meta` (10px) and `caption` (12px). */\nexport const CHART_TICK_FONT_SIZE = 10;\nexport const CHART_LABEL_FONT_SIZE = 12;\n","// The `shadow-raised` / `shadow-overlay` utilities compose lip + rim + drops on\n// the element (see `components.css`); these are the drop layers they pull in.\nexport const Shadows = {\n raised: 'var(--elevation-raised)',\n overlay: 'var(--elevation-overlay)',\n input: 'var(--elevation-raised)',\n};\n","export const Sizes = {\n 'icon-xs': '12px',\n 'icon-sm': '14px',\n 'icon-md': '16px',\n 'icon-lg': '20px',\n 'control-sm': '1.75rem',\n 'control-md': '1.875rem',\n 'control-lg': '2rem',\n 'header-default': '40px',\n 'table-header': '28px',\n 'table-row': '40px',\n 'table-row-small': '32px',\n 'avatar-sm': '24px',\n 'avatar-md': '32px',\n 'avatar-lg': '40px',\n dropdown: '300px',\n};\n"],"names":[],"mappings":";;AAGO,MAAM,SAAA,GAAY,CAAC,MAAA,EAAQ,QAAA,EAAU,MAAM;AAG3C,MAAM,cAAA,GAAiB;AAGvB,MAAM,WAAA,GAAc;;ACTpB,MAAM,YAAA,GAAe;AAAA,EAC1B,IAAA,EAAM,oBAAA;AAAA,EACN,EAAA,EAAI,kBAAA;AAAA,EACJ,EAAA,EAAI,kBAAA;AAAA,EACJ,EAAA,EAAI,kBAAA;AAAA,EACJ,EAAA,EAAI;AACN;;ACEO,MAAM,SAAA,GAAY;AAAA,EACvB,MAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,SAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,kBAAA;AAAA,EACA,mBAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF;AAKO,MAAM,oBAAA,GAAuB;AAC7B,MAAM,qBAAA,GAAwB;;AC7B9B,MAAM,OAAA,GAAU;AAAA,EACrB,MAAA,EAAQ,yBAAA;AAAA,EACR,OAAA,EAAS,0BAAA;AAAA,EACT,KAAA,EAAO;AACT;;ACNO,MAAM,KAAA,GAAQ;AAAA,EACnB,SAAA,EAAW,MAAA;AAAA,EACX,SAAA,EAAW,MAAA;AAAA,EACX,SAAA,EAAW,MAAA;AAAA,EACX,SAAA,EAAW,MAAA;AAAA,EACX,YAAA,EAAc,SAAA;AAAA,EACd,YAAA,EAAc,UAAA;AAAA,EACd,YAAA,EAAc,MAAA;AAAA,EACd,gBAAA,EAAkB,MAAA;AAAA,EAClB,cAAA,EAAgB,MAAA;AAAA,EAChB,WAAA,EAAa,MAAA;AAAA,EACb,iBAAA,EAAmB,MAAA;AAAA,EACnB,WAAA,EAAa,MAAA;AAAA,EACb,WAAA,EAAa,MAAA;AAAA,EACb,WAAA,EAAa,MAAA;AAAA,EACb,QAAA,EAAU;AACZ;;;;"}
@@ -3,14 +3,14 @@
3
3
  and text-shadow are honoured by `::highlight()` — border, padding and border-radius are
4
4
  ignored by the spec, so the highlight cannot have rounded corners. */
5
5
  ::highlight(search-result) {
6
- background-color: var(--color-warning-indicator);
7
- color: var(--color-sidebar);
6
+ background-color: var(--warning-indicator);
7
+ color: var(--sidebar);
8
8
  }
9
9
 
10
10
  /* The indirect match is a hint, not the answer: same hue, muted pairing (`warning-subtle`
11
11
  background with `warning-indicator` text) so it reads as related
12
12
  to the direct highlight without competing with it. Both themes define the pair. */
13
13
  ::highlight(search-result-indirect) {
14
- background-color: var(--color-warning-subtle);
15
- color: var(--color-warning-indicator);
14
+ background-color: var(--warning-subtle);
15
+ color: var(--warning-indicator);
16
16
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@mastra/playground-ui",
3
3
  "type": "module",
4
- "version": "64.0.0",
4
+ "version": "65.0.0-alpha.1",
5
5
  "description": "Mastra Playground components",
6
6
  "sideEffects": [
7
7
  "**/*.css"
@@ -9,11 +9,15 @@
9
9
  "files": [
10
10
  "dist",
11
11
  "theme.css",
12
+ "components.css",
13
+ "sources.css",
12
14
  "theme"
13
15
  ],
14
16
  "exports": {
15
17
  "./style.css": "./dist/style.css",
16
18
  "./theme.css": "./theme.css",
19
+ "./components.css": "./components.css",
20
+ "./sources.css": "./sources.css",
17
21
  "./tokens": {
18
22
  "import": {
19
23
  "types": "./dist/tokens.d.ts",
@@ -170,6 +174,7 @@
170
174
  "@mcp-ui/client": "^7.1.0",
171
175
  "@pierre/diffs": "1.5.1",
172
176
  "@radix-ui/react-visually-hidden": "^1.2.4",
177
+ "@tailwindcss/typography": "^0.5.19",
173
178
  "@tanstack/react-virtual": "^3.13.22",
174
179
  "@uiw/codemirror-theme-dracula": "^4.25.11",
175
180
  "@uiw/react-codemirror": "^4.25.11",
@@ -191,6 +196,7 @@
191
196
  "shiki": "^1.29.2",
192
197
  "sonner": "^2.0.7",
193
198
  "superjson": "^2.2.6",
199
+ "tw-animate-css": "^1.4.0",
194
200
  "use-debounce": "^10.1.0",
195
201
  "zod": "^3.25.0"
196
202
  },
@@ -202,9 +208,9 @@
202
208
  "react": ">=19.0.0",
203
209
  "react-dom": ">=19.0.0",
204
210
  "tailwindcss": "^4.0.0",
205
- "@mastra/ai-sdk": "^1.11.1",
206
- "@mastra/react": "1.11.0",
207
- "@mastra/client-js": "^1.55.0"
211
+ "@mastra/ai-sdk": "^1.11.2-alpha.0",
212
+ "@mastra/client-js": "^1.56.0-alpha.1",
213
+ "@mastra/react": "1.11.1-alpha.1"
208
214
  },
209
215
  "devDependencies": {
210
216
  "@modelcontextprotocol/sdk": "^1.32.1",
@@ -215,7 +221,6 @@
215
221
  "@stryker-mutator/core": "10.0.0",
216
222
  "@stryker-mutator/vitest-runner": "10.0.0",
217
223
  "@tailwindcss/postcss": "^4.3.3",
218
- "@tailwindcss/typography": "^0.5.19",
219
224
  "@tailwindcss/vite": "4.3.3",
220
225
  "@tanstack/react-query": "^5.90.21",
221
226
  "@testing-library/react": "^16.3.2",
@@ -243,19 +248,18 @@
243
248
  "storybook": "^10.6.0",
244
249
  "tailwind-merge": "^3.5.0",
245
250
  "tailwindcss": "4.3.3",
246
- "tw-animate-css": "^1.4.0",
247
251
  "typescript": "^7.0.2",
248
252
  "vite": "^7.3.1",
249
253
  "vite-plugin-dts": "^4.5.4",
250
254
  "vite-plugin-lib-inject-css": "^2.2.2",
251
255
  "vitest": "4.1.11",
252
- "@mastra/client-js": "^1.55.0",
253
256
  "@internal/lint": "0.0.144",
254
- "@mastra/memory": "1.38.0",
255
- "@mastra/react": "1.11.0",
256
- "@mastra/schema-compat": "1.3.15",
257
- "@mastra/core": "1.78.0",
258
- "@mastra/ai-sdk": "1.11.1"
257
+ "@mastra/ai-sdk": "1.11.2-alpha.0",
258
+ "@mastra/client-js": "^1.56.0-alpha.1",
259
+ "@mastra/react": "1.11.1-alpha.1",
260
+ "@mastra/schema-compat": "1.3.16-alpha.0",
261
+ "@mastra/core": "1.79.0-alpha.1",
262
+ "@mastra/memory": "1.39.0-alpha.0"
259
263
  },
260
264
  "homepage": "https://mastra.ai",
261
265
  "repository": {
package/sources.css ADDED
@@ -0,0 +1 @@
1
+ @source './dist/**/*.js';
package/theme/code.css ADDED
@@ -0,0 +1,17 @@
1
+ /* Syntax highlight roles the CodeMirror themes read, one chromatic ramp step per role. */
2
+
3
+ :root {
4
+ --syntax-string: var(--green-300);
5
+ --syntax-keyword: var(--red-400);
6
+ --syntax-literal: var(--amber-300);
7
+ --syntax-name: var(--cyan-300);
8
+ --syntax-link: var(--blue-400);
9
+ }
10
+
11
+ html.light {
12
+ --syntax-string: var(--green-700);
13
+ --syntax-keyword: var(--red-600);
14
+ --syntax-literal: var(--amber-800);
15
+ --syntax-name: var(--cyan-800);
16
+ --syntax-link: var(--blue-600);
17
+ }
@@ -100,7 +100,7 @@
100
100
  * overlay (popover, dropdown, dialog, drawer, tooltip).
101
101
  *
102
102
  * These are the drop layers only. The `shadow-raised` / `shadow-overlay`
103
- * utilities in `src/index.css` assemble lip + rim + drops on the element
103
+ * utilities in `components.css` assemble lip + rim + drops on the element
104
104
  * itself, which is what lets a state repaint the rim: a custom property
105
105
  * holding `var(--surface-rim)` would be substituted here, on the root, and
106
106
  * every descendant would inherit the finished string.
@@ -117,7 +117,7 @@
117
117
  * `border` beside it, which would read as two lines — and is why a field and
118
118
  * a card can be the same material. Hover does not touch it: the rim is the
119
119
  * loudest part of a borderless surface, so a pointer wash goes through
120
- * `--surface-tint` (see `src/index.css`) and leaves the boundary alone.
120
+ * `--surface-tint` (see `components.css`) and leaves the boundary alone.
121
121
  *
122
122
  * The rim is inset, so it cannot be clipped: the app frame and every
123
123
  * ScrollArea viewport are `overflow-hidden`, and an outer ring on a surface
package/theme.css CHANGED
@@ -10,6 +10,7 @@
10
10
  * colors raw ramps — background, gray, gray-alpha, chromatic hues, Mastra brand
11
11
  * status status, badge, and product roles
12
12
  * data-viz chart series and span-type hues
13
+ * code syntax highlight roles
13
14
  * surfaces fill ladder, boundary ladder, elevation, scrim
14
15
  * typography text roles and font families
15
16
  * scale spacing multiplier, named rungs, radii, breakpoints
@@ -23,6 +24,7 @@
23
24
  @import './theme/colors.css';
24
25
  @import './theme/status.css';
25
26
  @import './theme/data-viz.css';
27
+ @import './theme/code.css';
26
28
  @import './theme/surfaces.css';
27
29
  @import './theme/typography.css';
28
30
  @import './theme/scale.css';