@mastra/playground-ui 51.3.0-alpha.1 → 51.3.0-alpha.3

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 CHANGED
@@ -1,5 +1,24 @@
1
1
  # @mastra/playground-ui
2
2
 
3
+ ## 51.3.0-alpha.3
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [[`b8cb683`](https://github.com/mastra-ai/mastra/commit/b8cb683ba66499df254ddd1f7edd8cae3f89d2e7)]:
8
+ - @mastra/core@1.63.1-alpha.3
9
+ - @mastra/client-js@1.42.3-alpha.3
10
+ - @mastra/react@1.4.8-alpha.3
11
+
12
+ ## 51.3.0-alpha.2
13
+
14
+ ### Patch Changes
15
+
16
+ - Updated dependencies [[`0885364`](https://github.com/mastra-ai/mastra/commit/0885364c2fc7fa31febcfc444fc1ba5231ac1257)]:
17
+ - @mastra/core@1.63.1-alpha.2
18
+ - @mastra/memory@1.28.1-alpha.1
19
+ - @mastra/client-js@1.42.3-alpha.2
20
+ - @mastra/react@1.4.8-alpha.2
21
+
3
22
  ## 51.3.0-alpha.1
4
23
 
5
24
  ### Patch Changes
@@ -47,7 +47,7 @@ const ComposerBox = React.forwardRef(
47
47
  ref,
48
48
  "data-slot": "composer-box",
49
49
  className: utils_cn.cn(
50
- "duration-normal @container relative mx-auto mt-auto w-full max-w-3xl overflow-hidden rounded-[22px] border border-border2/40 bg-surface3 transition-colors focus-within:border-border2",
50
+ "@container relative mx-auto mt-auto w-full max-w-3xl overflow-hidden rounded-[22px] border border-border2/40 bg-surface3 transition-colors duration-normal focus-within:border-border2",
51
51
  className
52
52
  ),
53
53
  ...props,
@@ -1 +1 @@
1
- {"version":3,"file":"Composer.cjs.js","sources":["../../src/ds/components/Composer/use-composer-pointer-angle.ts","../../src/ds/components/Composer/composer.tsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\n/** Aims the composer ring at the cursor without re-rendering on every move. */\nexport function useComposerPointerAngle(enabled: boolean) {\n const elementRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const element = elementRef.current;\n if (!element || !enabled) return;\n\n let animationFrame: number | undefined;\n let clientX = 0;\n let clientY = 0;\n\n const paintAngle = () => {\n animationFrame = undefined;\n const bounds = element.getBoundingClientRect();\n const radians = Math.atan2(\n clientY - (bounds.top + bounds.height / 2),\n clientX - (bounds.left + bounds.width / 2),\n );\n // conic-gradient starts at 12 o'clock, atan2 at 3 o'clock\n element.style.setProperty('--composer-ring-angle', `${(radians * 180) / Math.PI + 90}deg`);\n };\n\n const trackPointer = (event: PointerEvent) => {\n clientX = event.clientX;\n clientY = event.clientY;\n animationFrame ??= requestAnimationFrame(paintAngle);\n };\n\n window.addEventListener('pointermove', trackPointer, { passive: true });\n return () => {\n window.removeEventListener('pointermove', trackPointer);\n if (animationFrame !== undefined) cancelAnimationFrame(animationFrame);\n };\n }, [enabled]);\n\n return elementRef;\n}\n","import type { ComponentPropsWithoutRef } from 'react';\nimport { forwardRef } from 'react';\n\nimport { ScrollArea } from '../ScrollArea';\nimport { useComposerPointerAngle } from './use-composer-pointer-angle';\nimport { cn } from '@/lib/utils';\n\nimport './composer-ring.css';\nimport './composer-sending.css';\n\nexport type ComposerProps = ComponentPropsWithoutRef<'form'>;\n\nexport interface ComposerInputProps extends ComponentPropsWithoutRef<'textarea'> {\n /** Maximum height of the scrolling input viewport. */\n maxHeight?: string;\n}\n\nexport const Composer = forwardRef<HTMLFormElement, ComposerProps>(({ children, ...props }, ref) => (\n <form ref={ref} data-slot=\"composer\" {...props}>\n {children}\n </form>\n));\nComposer.displayName = 'Composer';\n\nexport interface ComposerBoxProps extends ComponentPropsWithoutRef<'div'> {\n sendingPulseKey?: number;\n}\n\nexport const ComposerBox = forwardRef<HTMLDivElement, ComposerBoxProps>(\n ({ children, className, sendingPulseKey = 0, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"composer-box\"\n className={cn(\n 'duration-normal @container relative mx-auto mt-auto w-full max-w-3xl overflow-hidden rounded-[22px] border border-border2/40 bg-surface3 transition-colors focus-within:border-border2',\n className,\n )}\n {...props}\n >\n <ComposerSendingPulse pulseKey={sendingPulseKey} />\n <div className=\"relative z-10\">{children}</div>\n </div>\n ),\n);\nComposerBox.displayName = 'ComposerBox';\n\nexport interface ComposerRingProps extends ComponentPropsWithoutRef<'div'> {\n busy?: boolean;\n}\n\n/**\n * Edge for the composer box it wraps: a conic arc lit under the cursor on hover,\n * spinning on its own while the agent runs, never both at once. Wraps rather\n * than decorates because the box clips its overflow and would cut the arc off.\n */\nexport const ComposerRing = ({ busy = false, className, ...props }: ComposerRingProps) => {\n const ringRef = useComposerPointerAngle(!busy);\n\n return (\n <div\n ref={ringRef}\n data-slot=\"composer-ring\"\n data-busy={busy ? 'true' : 'false'}\n className={cn('composer-ring relative mx-auto w-full max-w-3xl rounded-[23px] p-px', className)}\n {...props}\n />\n );\n};\nComposerRing.displayName = 'ComposerRing';\n\nexport const ComposerAttachments = forwardRef<HTMLDivElement, ComponentPropsWithoutRef<'div'>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n role=\"region\"\n data-slot=\"composer-attachments\"\n className={cn('mx-auto w-full max-w-3xl pb-2', className)}\n {...props}\n />\n ),\n);\nComposerAttachments.displayName = 'ComposerAttachments';\n\nexport const ComposerInput = forwardRef<HTMLTextAreaElement, ComposerInputProps>(\n ({ className, maxHeight = '212px', ...props }, ref) => (\n <ScrollArea maxHeight={maxHeight}>\n <textarea\n ref={ref}\n data-slot=\"composer-input\"\n className={cn(\n 'min-h-17 field-sizing-content w-full resize-none overflow-hidden bg-transparent px-3 pt-3 pb-2 text-ui-lg leading-ui-lg text-neutral6 outline-hidden placeholder:text-neutral3 focus:outline-hidden disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n />\n </ScrollArea>\n ),\n);\nComposerInput.displayName = 'ComposerInput';\n\nexport const ComposerActions = forwardRef<HTMLDivElement, ComponentPropsWithoutRef<'div'>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n role=\"region\"\n data-slot=\"composer-actions\"\n className={cn('flex flex-wrap-reverse items-center justify-between gap-2 px-1.5 pb-1.5', className)}\n {...props}\n />\n ),\n);\nComposerActions.displayName = 'ComposerActions';\n\nconst ComposerGradientColumn = ({ className }: { className?: string }) => (\n <div className={cn('flex size-full flex-col -space-y-3', className)}>\n <div className=\"bg-accent1 w-full flex-1 blur-xl\" />\n <div className=\"bg-accent1Dark w-full flex-1 blur-xl\" />\n <div className=\"bg-accent1 w-full flex-1 blur-xl\" />\n <div className=\"bg-accent1Darker w-full flex-1 blur-xl\" />\n </div>\n);\n\nconst ComposerSendingPulse = ({ pulseKey }: { pulseKey: number }) => {\n if (pulseKey === 0) return null;\n\n return (\n <div\n key={pulseKey}\n aria-hidden=\"true\"\n data-slot=\"composer-sending-pulse\"\n className=\"composer-sending pointer-events-none absolute top-0 left-[-10%] z-0 flex h-10 w-[120%] transform-gpu\"\n >\n <ComposerGradientColumn />\n <ComposerGradientColumn className=\"-translate-y-2\" />\n <ComposerGradientColumn />\n </div>\n );\n};\n"],"names":["useRef","useEffect","forwardRef","jsx","jsxs","cn","ScrollArea"],"mappings":";;;;;;;;;AAGO,SAAS,wBAAwB,OAAA,EAAkB;AACxD,EAAA,MAAM,UAAA,GAAaA,aAAuB,IAAI,CAAA;AAE9C,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,MAAM,UAAU,UAAA,CAAW,OAAA;AAC3B,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,EAAS;AAE1B,IAAA,IAAI,cAAA;AACJ,IAAA,IAAI,OAAA,GAAU,CAAA;AACd,IAAA,IAAI,OAAA,GAAU,CAAA;AAEd,IAAA,MAAM,aAAa,MAAM;AACvB,MAAA,cAAA,GAAiB,MAAA;AACjB,MAAA,MAAM,MAAA,GAAS,QAAQ,qBAAA,EAAsB;AAC7C,MAAA,MAAM,UAAU,IAAA,CAAK,KAAA;AAAA,QACnB,OAAA,IAAW,MAAA,CAAO,GAAA,GAAM,MAAA,CAAO,MAAA,GAAS,CAAA,CAAA;AAAA,QACxC,OAAA,IAAW,MAAA,CAAO,IAAA,GAAO,MAAA,CAAO,KAAA,GAAQ,CAAA;AAAA,OAC1C;AAEA,MAAA,OAAA,CAAQ,KAAA,CAAM,YAAY,uBAAA,EAAyB,CAAA,EAAI,UAAU,GAAA,GAAO,IAAA,CAAK,EAAA,GAAK,EAAE,CAAA,GAAA,CAAK,CAAA;AAAA,IAC3F,CAAA;AAEA,IAAA,MAAM,YAAA,GAAe,CAAC,KAAA,KAAwB;AAC5C,MAAA,OAAA,GAAU,KAAA,CAAM,OAAA;AAChB,MAAA,OAAA,GAAU,KAAA,CAAM,OAAA;AAChB,MAAA,cAAA,KAAmB,sBAAsB,UAAU,CAAA;AAAA,IACrD,CAAA;AAEA,IAAA,MAAA,CAAO,iBAAiB,aAAA,EAAe,YAAA,EAAc,EAAE,OAAA,EAAS,MAAM,CAAA;AACtE,IAAA,OAAO,MAAM;AACX,MAAA,MAAA,CAAO,mBAAA,CAAoB,eAAe,YAAY,CAAA;AACtD,MAAA,IAAI,cAAA,KAAmB,MAAA,EAAW,oBAAA,CAAqB,cAAc,CAAA;AAAA,IACvE,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,OAAO,CAAC,CAAA;AAEZ,EAAA,OAAO,UAAA;AACT;;ACtBO,MAAM,WAAWC,gBAAA,CAA2C,CAAC,EAAE,QAAA,EAAU,GAAG,KAAA,EAAM,EAAG,GAAA,qBAC1FC,cAAA,CAAC,UAAK,GAAA,EAAU,WAAA,EAAU,YAAY,GAAG,KAAA,EACtC,UACH,CACD;AACD,QAAA,CAAS,WAAA,GAAc,UAAA;AAMhB,MAAM,WAAA,GAAcD,gBAAA;AAAA,EACzB,CAAC,EAAE,QAAA,EAAU,SAAA,EAAW,kBAAkB,CAAA,EAAG,GAAG,KAAA,EAAM,EAAG,GAAA,qBACvDE,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,WAAA,EAAU,cAAA;AAAA,MACV,SAAA,EAAWC,WAAA;AAAA,QACT,wLAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG,KAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAAF,cAAA,CAAC,oBAAA,EAAA,EAAqB,UAAU,eAAA,EAAiB,CAAA;AAAA,wBACjDA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,eAAA,EAAiB,QAAA,EAAS;AAAA;AAAA;AAAA;AAG/C;AACA,WAAA,CAAY,WAAA,GAAc,aAAA;AAWnB,MAAM,YAAA,GAAe,CAAC,EAAE,IAAA,GAAO,OAAO,SAAA,EAAW,GAAG,OAAM,KAAyB;AACxF,EAAA,MAAM,OAAA,GAAU,uBAAA,CAAwB,CAAC,IAAI,CAAA;AAE7C,EAAA,uBACEA,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,OAAA;AAAA,MACL,WAAA,EAAU,eAAA;AAAA,MACV,WAAA,EAAW,OAAO,MAAA,GAAS,OAAA;AAAA,MAC3B,SAAA,EAAWE,WAAA,CAAG,qEAAA,EAAuE,SAAS,CAAA;AAAA,MAC7F,GAAG;AAAA;AAAA,GACN;AAEJ;AACA,YAAA,CAAa,WAAA,GAAc,cAAA;AAEpB,MAAM,mBAAA,GAAsBH,gBAAA;AAAA,EACjC,CAAC,EAAE,SAAA,EAAW,GAAG,KAAA,IAAS,GAAA,qBACxBC,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,IAAA,EAAK,QAAA;AAAA,MACL,WAAA,EAAU,sBAAA;AAAA,MACV,SAAA,EAAWE,WAAA,CAAG,+BAAA,EAAiC,SAAS,CAAA;AAAA,MACvD,GAAG;AAAA;AAAA;AAGV;AACA,mBAAA,CAAoB,WAAA,GAAc,qBAAA;AAE3B,MAAM,aAAA,GAAgBH,gBAAA;AAAA,EAC3B,CAAC,EAAE,SAAA,EAAW,SAAA,GAAY,OAAA,EAAS,GAAG,KAAA,EAAM,EAAG,GAAA,qBAC7CC,cAAA,CAACG,qBAAA,EAAA,EAAW,SAAA,EACV,QAAA,kBAAAH,cAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,WAAA,EAAU,gBAAA;AAAA,MACV,SAAA,EAAWE,WAAA;AAAA,QACT,qPAAA;AAAA,QACA;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN,EACF;AAEJ;AACA,aAAA,CAAc,WAAA,GAAc,eAAA;AAErB,MAAM,eAAA,GAAkBH,gBAAA;AAAA,EAC7B,CAAC,EAAE,SAAA,EAAW,GAAG,KAAA,IAAS,GAAA,qBACxBC,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,GAAA;AAAA,MACA,IAAA,EAAK,QAAA;AAAA,MACL,WAAA,EAAU,kBAAA;AAAA,MACV,SAAA,EAAWE,WAAA,CAAG,yEAAA,EAA2E,SAAS,CAAA;AAAA,MACjG,GAAG;AAAA;AAAA;AAGV;AACA,eAAA,CAAgB,WAAA,GAAc,iBAAA;AAE9B,MAAM,sBAAA,GAAyB,CAAC,EAAE,SAAA,EAAU,qBAC1CD,eAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAWC,WAAA,CAAG,oCAAA,EAAsC,SAAS,CAAA,EAChE,QAAA,EAAA;AAAA,kBAAAF,cAAA,CAAC,KAAA,EAAA,EAAI,WAAU,kCAAA,EAAmC,CAAA;AAAA,kBAClDA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sCAAA,EAAuC,CAAA;AAAA,kBACtDA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,kCAAA,EAAmC,CAAA;AAAA,kBAClDA,cAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,wCAAA,EAAyC;AAAA,CAAA,EAC1D,CAAA;AAGF,MAAM,oBAAA,GAAuB,CAAC,EAAE,QAAA,EAAS,KAA4B;AACnE,EAAA,IAAI,QAAA,KAAa,GAAG,OAAO,IAAA;AAE3B,EAAA,uBACEC,eAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MAEC,aAAA,EAAY,MAAA;AAAA,MACZ,WAAA,EAAU,wBAAA;AAAA,MACV,SAAA,EAAU,sGAAA;AAAA,MAEV,QAAA,EAAA;AAAA,wBAAAD,cAAA,CAAC,sBAAA,EAAA,EAAuB,CAAA;AAAA,wBACxBA,cAAA,CAAC,sBAAA,EAAA,EAAuB,SAAA,EAAU,gBAAA,EAAiB,CAAA;AAAA,uCAClD,sBAAA,EAAA,EAAuB;AAAA;AAAA,KAAA;AAAA,IAPnB;AAAA,GAQP;AAEJ,CAAA;;;;;;;;;"}
1
+ {"version":3,"file":"Composer.cjs.js","sources":["../../src/ds/components/Composer/use-composer-pointer-angle.ts","../../src/ds/components/Composer/composer.tsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\n/** Aims the composer ring at the cursor without re-rendering on every move. */\nexport function useComposerPointerAngle(enabled: boolean) {\n const elementRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const element = elementRef.current;\n if (!element || !enabled) return;\n\n let animationFrame: number | undefined;\n let clientX = 0;\n let clientY = 0;\n\n const paintAngle = () => {\n animationFrame = undefined;\n const bounds = element.getBoundingClientRect();\n const radians = Math.atan2(\n clientY - (bounds.top + bounds.height / 2),\n clientX - (bounds.left + bounds.width / 2),\n );\n // conic-gradient starts at 12 o'clock, atan2 at 3 o'clock\n element.style.setProperty('--composer-ring-angle', `${(radians * 180) / Math.PI + 90}deg`);\n };\n\n const trackPointer = (event: PointerEvent) => {\n clientX = event.clientX;\n clientY = event.clientY;\n animationFrame ??= requestAnimationFrame(paintAngle);\n };\n\n window.addEventListener('pointermove', trackPointer, { passive: true });\n return () => {\n window.removeEventListener('pointermove', trackPointer);\n if (animationFrame !== undefined) cancelAnimationFrame(animationFrame);\n };\n }, [enabled]);\n\n return elementRef;\n}\n","import type { ComponentPropsWithoutRef } from 'react';\nimport { forwardRef } from 'react';\n\nimport { ScrollArea } from '../ScrollArea';\nimport { useComposerPointerAngle } from './use-composer-pointer-angle';\nimport { cn } from '@/lib/utils';\n\nimport './composer-ring.css';\nimport './composer-sending.css';\n\nexport type ComposerProps = ComponentPropsWithoutRef<'form'>;\n\nexport interface ComposerInputProps extends ComponentPropsWithoutRef<'textarea'> {\n /** Maximum height of the scrolling input viewport. */\n maxHeight?: string;\n}\n\nexport const Composer = forwardRef<HTMLFormElement, ComposerProps>(({ children, ...props }, ref) => (\n <form ref={ref} data-slot=\"composer\" {...props}>\n {children}\n </form>\n));\nComposer.displayName = 'Composer';\n\nexport interface ComposerBoxProps extends ComponentPropsWithoutRef<'div'> {\n sendingPulseKey?: number;\n}\n\nexport const ComposerBox = forwardRef<HTMLDivElement, ComposerBoxProps>(\n ({ children, className, sendingPulseKey = 0, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"composer-box\"\n className={cn(\n '@container relative mx-auto mt-auto w-full max-w-3xl overflow-hidden rounded-[22px] border border-border2/40 bg-surface3 transition-colors duration-normal focus-within:border-border2',\n className,\n )}\n {...props}\n >\n <ComposerSendingPulse pulseKey={sendingPulseKey} />\n <div className=\"relative z-10\">{children}</div>\n </div>\n ),\n);\nComposerBox.displayName = 'ComposerBox';\n\nexport interface ComposerRingProps extends ComponentPropsWithoutRef<'div'> {\n busy?: boolean;\n}\n\n/**\n * Edge for the composer box it wraps: a conic arc lit under the cursor on hover,\n * spinning on its own while the agent runs, never both at once. Wraps rather\n * than decorates because the box clips its overflow and would cut the arc off.\n */\nexport const ComposerRing = ({ busy = false, className, ...props }: ComposerRingProps) => {\n const ringRef = useComposerPointerAngle(!busy);\n\n return (\n <div\n ref={ringRef}\n data-slot=\"composer-ring\"\n data-busy={busy ? 'true' : 'false'}\n className={cn('composer-ring relative mx-auto w-full max-w-3xl rounded-[23px] p-px', className)}\n {...props}\n />\n );\n};\nComposerRing.displayName = 'ComposerRing';\n\nexport const ComposerAttachments = forwardRef<HTMLDivElement, ComponentPropsWithoutRef<'div'>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n role=\"region\"\n data-slot=\"composer-attachments\"\n className={cn('mx-auto w-full max-w-3xl pb-2', className)}\n {...props}\n />\n ),\n);\nComposerAttachments.displayName = 'ComposerAttachments';\n\nexport const ComposerInput = forwardRef<HTMLTextAreaElement, ComposerInputProps>(\n ({ className, maxHeight = '212px', ...props }, ref) => (\n <ScrollArea maxHeight={maxHeight}>\n <textarea\n ref={ref}\n data-slot=\"composer-input\"\n className={cn(\n 'min-h-17 field-sizing-content w-full resize-none overflow-hidden bg-transparent px-3 pt-3 pb-2 text-ui-lg leading-ui-lg text-neutral6 outline-hidden placeholder:text-neutral3 focus:outline-hidden disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n />\n </ScrollArea>\n ),\n);\nComposerInput.displayName = 'ComposerInput';\n\nexport const ComposerActions = forwardRef<HTMLDivElement, ComponentPropsWithoutRef<'div'>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n role=\"region\"\n data-slot=\"composer-actions\"\n className={cn('flex flex-wrap-reverse items-center justify-between gap-2 px-1.5 pb-1.5', className)}\n {...props}\n />\n ),\n);\nComposerActions.displayName = 'ComposerActions';\n\nconst ComposerGradientColumn = ({ className }: { className?: string }) => (\n <div className={cn('flex size-full flex-col -space-y-3', className)}>\n <div className=\"bg-accent1 w-full flex-1 blur-xl\" />\n <div className=\"bg-accent1Dark w-full flex-1 blur-xl\" />\n <div className=\"bg-accent1 w-full flex-1 blur-xl\" />\n <div className=\"bg-accent1Darker w-full flex-1 blur-xl\" />\n </div>\n);\n\nconst ComposerSendingPulse = ({ pulseKey }: { pulseKey: number }) => {\n if (pulseKey === 0) return null;\n\n return (\n <div\n key={pulseKey}\n aria-hidden=\"true\"\n data-slot=\"composer-sending-pulse\"\n className=\"composer-sending pointer-events-none absolute top-0 left-[-10%] z-0 flex h-10 w-[120%] transform-gpu\"\n >\n <ComposerGradientColumn />\n <ComposerGradientColumn className=\"-translate-y-2\" />\n <ComposerGradientColumn />\n </div>\n );\n};\n"],"names":["useRef","useEffect","forwardRef","jsx","jsxs","cn","ScrollArea"],"mappings":"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"}
@@ -43,7 +43,7 @@ const ComposerBox = forwardRef(
43
43
  ref,
44
44
  "data-slot": "composer-box",
45
45
  className: cn(
46
- "duration-normal @container relative mx-auto mt-auto w-full max-w-3xl overflow-hidden rounded-[22px] border border-border2/40 bg-surface3 transition-colors focus-within:border-border2",
46
+ "@container relative mx-auto mt-auto w-full max-w-3xl overflow-hidden rounded-[22px] border border-border2/40 bg-surface3 transition-colors duration-normal focus-within:border-border2",
47
47
  className
48
48
  ),
49
49
  ...props,
@@ -1 +1 @@
1
- {"version":3,"file":"Composer.es.js","sources":["../../src/ds/components/Composer/use-composer-pointer-angle.ts","../../src/ds/components/Composer/composer.tsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\n/** Aims the composer ring at the cursor without re-rendering on every move. */\nexport function useComposerPointerAngle(enabled: boolean) {\n const elementRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const element = elementRef.current;\n if (!element || !enabled) return;\n\n let animationFrame: number | undefined;\n let clientX = 0;\n let clientY = 0;\n\n const paintAngle = () => {\n animationFrame = undefined;\n const bounds = element.getBoundingClientRect();\n const radians = Math.atan2(\n clientY - (bounds.top + bounds.height / 2),\n clientX - (bounds.left + bounds.width / 2),\n );\n // conic-gradient starts at 12 o'clock, atan2 at 3 o'clock\n element.style.setProperty('--composer-ring-angle', `${(radians * 180) / Math.PI + 90}deg`);\n };\n\n const trackPointer = (event: PointerEvent) => {\n clientX = event.clientX;\n clientY = event.clientY;\n animationFrame ??= requestAnimationFrame(paintAngle);\n };\n\n window.addEventListener('pointermove', trackPointer, { passive: true });\n return () => {\n window.removeEventListener('pointermove', trackPointer);\n if (animationFrame !== undefined) cancelAnimationFrame(animationFrame);\n };\n }, [enabled]);\n\n return elementRef;\n}\n","import type { ComponentPropsWithoutRef } from 'react';\nimport { forwardRef } from 'react';\n\nimport { ScrollArea } from '../ScrollArea';\nimport { useComposerPointerAngle } from './use-composer-pointer-angle';\nimport { cn } from '@/lib/utils';\n\nimport './composer-ring.css';\nimport './composer-sending.css';\n\nexport type ComposerProps = ComponentPropsWithoutRef<'form'>;\n\nexport interface ComposerInputProps extends ComponentPropsWithoutRef<'textarea'> {\n /** Maximum height of the scrolling input viewport. */\n maxHeight?: string;\n}\n\nexport const Composer = forwardRef<HTMLFormElement, ComposerProps>(({ children, ...props }, ref) => (\n <form ref={ref} data-slot=\"composer\" {...props}>\n {children}\n </form>\n));\nComposer.displayName = 'Composer';\n\nexport interface ComposerBoxProps extends ComponentPropsWithoutRef<'div'> {\n sendingPulseKey?: number;\n}\n\nexport const ComposerBox = forwardRef<HTMLDivElement, ComposerBoxProps>(\n ({ children, className, sendingPulseKey = 0, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"composer-box\"\n className={cn(\n 'duration-normal @container relative mx-auto mt-auto w-full max-w-3xl overflow-hidden rounded-[22px] border border-border2/40 bg-surface3 transition-colors focus-within:border-border2',\n className,\n )}\n {...props}\n >\n <ComposerSendingPulse pulseKey={sendingPulseKey} />\n <div className=\"relative z-10\">{children}</div>\n </div>\n ),\n);\nComposerBox.displayName = 'ComposerBox';\n\nexport interface ComposerRingProps extends ComponentPropsWithoutRef<'div'> {\n busy?: boolean;\n}\n\n/**\n * Edge for the composer box it wraps: a conic arc lit under the cursor on hover,\n * spinning on its own while the agent runs, never both at once. Wraps rather\n * than decorates because the box clips its overflow and would cut the arc off.\n */\nexport const ComposerRing = ({ busy = false, className, ...props }: ComposerRingProps) => {\n const ringRef = useComposerPointerAngle(!busy);\n\n return (\n <div\n ref={ringRef}\n data-slot=\"composer-ring\"\n data-busy={busy ? 'true' : 'false'}\n className={cn('composer-ring relative mx-auto w-full max-w-3xl rounded-[23px] p-px', className)}\n {...props}\n />\n );\n};\nComposerRing.displayName = 'ComposerRing';\n\nexport const ComposerAttachments = forwardRef<HTMLDivElement, ComponentPropsWithoutRef<'div'>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n role=\"region\"\n data-slot=\"composer-attachments\"\n className={cn('mx-auto w-full max-w-3xl pb-2', className)}\n {...props}\n />\n ),\n);\nComposerAttachments.displayName = 'ComposerAttachments';\n\nexport const ComposerInput = forwardRef<HTMLTextAreaElement, ComposerInputProps>(\n ({ className, maxHeight = '212px', ...props }, ref) => (\n <ScrollArea maxHeight={maxHeight}>\n <textarea\n ref={ref}\n data-slot=\"composer-input\"\n className={cn(\n 'min-h-17 field-sizing-content w-full resize-none overflow-hidden bg-transparent px-3 pt-3 pb-2 text-ui-lg leading-ui-lg text-neutral6 outline-hidden placeholder:text-neutral3 focus:outline-hidden disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n />\n </ScrollArea>\n ),\n);\nComposerInput.displayName = 'ComposerInput';\n\nexport const ComposerActions = forwardRef<HTMLDivElement, ComponentPropsWithoutRef<'div'>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n role=\"region\"\n data-slot=\"composer-actions\"\n className={cn('flex flex-wrap-reverse items-center justify-between gap-2 px-1.5 pb-1.5', className)}\n {...props}\n />\n ),\n);\nComposerActions.displayName = 'ComposerActions';\n\nconst ComposerGradientColumn = ({ className }: { className?: string }) => (\n <div className={cn('flex size-full flex-col -space-y-3', className)}>\n <div className=\"bg-accent1 w-full flex-1 blur-xl\" />\n <div className=\"bg-accent1Dark w-full flex-1 blur-xl\" />\n <div className=\"bg-accent1 w-full flex-1 blur-xl\" />\n <div className=\"bg-accent1Darker w-full flex-1 blur-xl\" />\n </div>\n);\n\nconst ComposerSendingPulse = ({ pulseKey }: { pulseKey: number }) => {\n if (pulseKey === 0) return null;\n\n return (\n <div\n key={pulseKey}\n aria-hidden=\"true\"\n data-slot=\"composer-sending-pulse\"\n className=\"composer-sending pointer-events-none absolute top-0 left-[-10%] z-0 flex h-10 w-[120%] transform-gpu\"\n >\n <ComposerGradientColumn />\n <ComposerGradientColumn className=\"-translate-y-2\" />\n <ComposerGradientColumn />\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Composer.es.js","sources":["../../src/ds/components/Composer/use-composer-pointer-angle.ts","../../src/ds/components/Composer/composer.tsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\n/** Aims the composer ring at the cursor without re-rendering on every move. */\nexport function useComposerPointerAngle(enabled: boolean) {\n const elementRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const element = elementRef.current;\n if (!element || !enabled) return;\n\n let animationFrame: number | undefined;\n let clientX = 0;\n let clientY = 0;\n\n const paintAngle = () => {\n animationFrame = undefined;\n const bounds = element.getBoundingClientRect();\n const radians = Math.atan2(\n clientY - (bounds.top + bounds.height / 2),\n clientX - (bounds.left + bounds.width / 2),\n );\n // conic-gradient starts at 12 o'clock, atan2 at 3 o'clock\n element.style.setProperty('--composer-ring-angle', `${(radians * 180) / Math.PI + 90}deg`);\n };\n\n const trackPointer = (event: PointerEvent) => {\n clientX = event.clientX;\n clientY = event.clientY;\n animationFrame ??= requestAnimationFrame(paintAngle);\n };\n\n window.addEventListener('pointermove', trackPointer, { passive: true });\n return () => {\n window.removeEventListener('pointermove', trackPointer);\n if (animationFrame !== undefined) cancelAnimationFrame(animationFrame);\n };\n }, [enabled]);\n\n return elementRef;\n}\n","import type { ComponentPropsWithoutRef } from 'react';\nimport { forwardRef } from 'react';\n\nimport { ScrollArea } from '../ScrollArea';\nimport { useComposerPointerAngle } from './use-composer-pointer-angle';\nimport { cn } from '@/lib/utils';\n\nimport './composer-ring.css';\nimport './composer-sending.css';\n\nexport type ComposerProps = ComponentPropsWithoutRef<'form'>;\n\nexport interface ComposerInputProps extends ComponentPropsWithoutRef<'textarea'> {\n /** Maximum height of the scrolling input viewport. */\n maxHeight?: string;\n}\n\nexport const Composer = forwardRef<HTMLFormElement, ComposerProps>(({ children, ...props }, ref) => (\n <form ref={ref} data-slot=\"composer\" {...props}>\n {children}\n </form>\n));\nComposer.displayName = 'Composer';\n\nexport interface ComposerBoxProps extends ComponentPropsWithoutRef<'div'> {\n sendingPulseKey?: number;\n}\n\nexport const ComposerBox = forwardRef<HTMLDivElement, ComposerBoxProps>(\n ({ children, className, sendingPulseKey = 0, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"composer-box\"\n className={cn(\n '@container relative mx-auto mt-auto w-full max-w-3xl overflow-hidden rounded-[22px] border border-border2/40 bg-surface3 transition-colors duration-normal focus-within:border-border2',\n className,\n )}\n {...props}\n >\n <ComposerSendingPulse pulseKey={sendingPulseKey} />\n <div className=\"relative z-10\">{children}</div>\n </div>\n ),\n);\nComposerBox.displayName = 'ComposerBox';\n\nexport interface ComposerRingProps extends ComponentPropsWithoutRef<'div'> {\n busy?: boolean;\n}\n\n/**\n * Edge for the composer box it wraps: a conic arc lit under the cursor on hover,\n * spinning on its own while the agent runs, never both at once. Wraps rather\n * than decorates because the box clips its overflow and would cut the arc off.\n */\nexport const ComposerRing = ({ busy = false, className, ...props }: ComposerRingProps) => {\n const ringRef = useComposerPointerAngle(!busy);\n\n return (\n <div\n ref={ringRef}\n data-slot=\"composer-ring\"\n data-busy={busy ? 'true' : 'false'}\n className={cn('composer-ring relative mx-auto w-full max-w-3xl rounded-[23px] p-px', className)}\n {...props}\n />\n );\n};\nComposerRing.displayName = 'ComposerRing';\n\nexport const ComposerAttachments = forwardRef<HTMLDivElement, ComponentPropsWithoutRef<'div'>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n role=\"region\"\n data-slot=\"composer-attachments\"\n className={cn('mx-auto w-full max-w-3xl pb-2', className)}\n {...props}\n />\n ),\n);\nComposerAttachments.displayName = 'ComposerAttachments';\n\nexport const ComposerInput = forwardRef<HTMLTextAreaElement, ComposerInputProps>(\n ({ className, maxHeight = '212px', ...props }, ref) => (\n <ScrollArea maxHeight={maxHeight}>\n <textarea\n ref={ref}\n data-slot=\"composer-input\"\n className={cn(\n 'min-h-17 field-sizing-content w-full resize-none overflow-hidden bg-transparent px-3 pt-3 pb-2 text-ui-lg leading-ui-lg text-neutral6 outline-hidden placeholder:text-neutral3 focus:outline-hidden disabled:cursor-not-allowed disabled:opacity-50',\n className,\n )}\n {...props}\n />\n </ScrollArea>\n ),\n);\nComposerInput.displayName = 'ComposerInput';\n\nexport const ComposerActions = forwardRef<HTMLDivElement, ComponentPropsWithoutRef<'div'>>(\n ({ className, ...props }, ref) => (\n <div\n ref={ref}\n role=\"region\"\n data-slot=\"composer-actions\"\n className={cn('flex flex-wrap-reverse items-center justify-between gap-2 px-1.5 pb-1.5', className)}\n {...props}\n />\n ),\n);\nComposerActions.displayName = 'ComposerActions';\n\nconst ComposerGradientColumn = ({ className }: { className?: string }) => (\n <div className={cn('flex size-full flex-col -space-y-3', className)}>\n <div className=\"bg-accent1 w-full flex-1 blur-xl\" />\n <div className=\"bg-accent1Dark w-full flex-1 blur-xl\" />\n <div className=\"bg-accent1 w-full flex-1 blur-xl\" />\n <div className=\"bg-accent1Darker w-full flex-1 blur-xl\" />\n </div>\n);\n\nconst ComposerSendingPulse = ({ pulseKey }: { pulseKey: number }) => {\n if (pulseKey === 0) return null;\n\n return (\n <div\n key={pulseKey}\n aria-hidden=\"true\"\n data-slot=\"composer-sending-pulse\"\n className=\"composer-sending pointer-events-none absolute top-0 left-[-10%] z-0 flex h-10 w-[120%] transform-gpu\"\n >\n <ComposerGradientColumn />\n <ComposerGradientColumn className=\"-translate-y-2\" />\n <ComposerGradientColumn />\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
4
4
 
5
5
  const logsDataList = require('../logs-data-list-Xayqbjw4.cjs');
6
6
  const dataListSkeleton = require('../data-list-skeleton-BHBSIQHN.cjs');
7
+ require('react');
7
8
 
8
9
 
9
10
 
@@ -1 +1 @@
1
- {"version":3,"file":"LogsDataList.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"}
1
+ {"version":3,"file":"LogsDataList.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;"}
@@ -1,3 +1,4 @@
1
1
  export { L as LogsDataList } from '../logs-data-list-DRXJ89IZ.js';
2
2
  export { D as LogsDataListSkeleton } from '../data-list-skeleton-DDO_OE14.js';
3
+ import 'react';
3
4
  //# sourceMappingURL=LogsDataList.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LogsDataList.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
1
+ {"version":3,"file":"LogsDataList.es.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
package/dist/style.css CHANGED
@@ -2036,22 +2036,6 @@
2036
2036
  height: 30vh;
2037
2037
  }
2038
2038
 
2039
- .h-\[32rem\] {
2040
- height: 32rem;
2041
- }
2042
-
2043
- .h-\[34rem\] {
2044
- height: 34rem;
2045
- }
2046
-
2047
- .h-\[36rem\] {
2048
- height: 36rem;
2049
- }
2050
-
2051
- .h-\[38rem\] {
2052
- height: 38rem;
2053
- }
2054
-
2055
2039
  .h-\[160px\] {
2056
2040
  height: 160px;
2057
2041
  }
@@ -2289,10 +2273,6 @@
2289
2273
  min-height: var(--spacing-72);
2290
2274
  }
2291
2275
 
2292
- .min-h-\[34rem\] {
2293
- min-height: 34rem;
2294
- }
2295
-
2296
2276
  .min-h-\[70cqh\] {
2297
2277
  min-height: 70cqh;
2298
2278
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@mastra/playground-ui",
3
3
  "type": "module",
4
- "version": "51.3.0-alpha.1",
4
+ "version": "51.3.0-alpha.3",
5
5
  "description": "Mastra Playground components",
6
6
  "sideEffects": [
7
7
  "**/*.css"
@@ -161,8 +161,8 @@
161
161
  "react": ">=19.0.0",
162
162
  "react-dom": ">=19.0.0",
163
163
  "tailwindcss": "^4.0.0",
164
- "@mastra/client-js": "^1.42.3-alpha.1",
165
- "@mastra/react": "1.4.8-alpha.1"
164
+ "@mastra/client-js": "^1.42.3-alpha.3",
165
+ "@mastra/react": "1.4.8-alpha.3"
166
166
  },
167
167
  "devDependencies": {
168
168
  "@storybook/addon-a11y": "^10.4.1",
@@ -202,11 +202,11 @@
202
202
  "vite-plugin-dts": "^4.5.4",
203
203
  "vite-plugin-lib-inject-css": "^2.2.2",
204
204
  "vitest": "4.1.10",
205
- "@mastra/client-js": "^1.42.3-alpha.1",
206
- "@mastra/core": "1.63.1-alpha.1",
207
- "@mastra/memory": "1.28.1-alpha.0",
208
- "@mastra/react": "1.4.8-alpha.1",
209
- "@internal/lint": "0.0.127"
205
+ "@internal/lint": "0.0.127",
206
+ "@mastra/client-js": "^1.42.3-alpha.3",
207
+ "@mastra/core": "1.63.1-alpha.3",
208
+ "@mastra/memory": "1.28.1-alpha.1",
209
+ "@mastra/react": "1.4.8-alpha.3"
210
210
  },
211
211
  "homepage": "https://mastra.ai",
212
212
  "repository": {