@timbal-ai/timbal-react 1.1.0 → 1.3.0

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 (43) hide show
  1. package/CHANGELOG.md +28 -1
  2. package/LICENSE +201 -0
  3. package/README.md +20 -11
  4. package/dist/app.cjs +1675 -1218
  5. package/dist/app.d.cts +22 -6
  6. package/dist/app.d.ts +22 -6
  7. package/dist/app.esm.js +26 -8
  8. package/dist/{chart-artifact-BZp7nmaf.d.ts → chart-artifact-Q5QgMtbj.d.ts} +107 -28
  9. package/dist/{chart-artifact-CX-rh9nq.d.cts → chart-artifact-WDEW9dHT.d.cts} +107 -28
  10. package/dist/{chat-DCms8pJ_.d.cts → chat-ClmzWzCX.d.cts} +2 -0
  11. package/dist/{chat-DCms8pJ_.d.ts → chat-ClmzWzCX.d.ts} +2 -0
  12. package/dist/chat.cjs +868 -511
  13. package/dist/chat.d.cts +1 -1
  14. package/dist/chat.d.ts +1 -1
  15. package/dist/chat.esm.js +3 -3
  16. package/dist/{chunk-YXZ22OJN.esm.js → chunk-GQBYZRD7.esm.js} +670 -402
  17. package/dist/{chunk-XCM3V6RK.esm.js → chunk-OFWC4MIY.esm.js} +2 -2
  18. package/dist/{chunk-6HWMJNZT.esm.js → chunk-OH23AX2V.esm.js} +757 -56
  19. package/dist/{chunk-4AKJ6FKE.esm.js → chunk-QU7ET55D.esm.js} +120 -23
  20. package/dist/{chunk-FRZOEYBO.esm.js → chunk-THBA27QY.esm.js} +4 -4
  21. package/dist/{chunk-JEAUF54A.esm.js → chunk-UCGVL7ZY.esm.js} +1 -1
  22. package/dist/{chunk-P3KDAYX6.esm.js → chunk-VXMM2HX7.esm.js} +1 -1
  23. package/dist/{chunk-TK2AGIME.esm.js → chunk-YCXN67SD.esm.js} +565 -480
  24. package/dist/{pill-segmented-tabs-Ba5q0feL.d.cts → circular-progress-Ci8L-Hfa.d.cts} +230 -6
  25. package/dist/{pill-segmented-tabs-Ba5q0feL.d.ts → circular-progress-Ci8L-Hfa.d.ts} +230 -6
  26. package/dist/index.cjs +2850 -1689
  27. package/dist/index.d.cts +5 -5
  28. package/dist/index.d.ts +5 -5
  29. package/dist/index.esm.js +41 -11
  30. package/dist/studio.cjs +1089 -732
  31. package/dist/studio.d.cts +2 -2
  32. package/dist/studio.d.ts +2 -2
  33. package/dist/studio.esm.js +5 -5
  34. package/dist/styles.css +14 -16
  35. package/dist/ui.cjs +880 -71
  36. package/dist/ui.d.cts +1 -1
  37. package/dist/ui.d.ts +1 -1
  38. package/dist/ui.esm.js +28 -4
  39. package/dist/{welcome-CRqOPKMp.d.cts → welcome-BFGRoNfK.d.cts} +1 -1
  40. package/dist/{welcome-DlHUa3OL.d.ts → welcome-DXqsGTwH.d.ts} +1 -1
  41. package/package.json +1 -1
  42. package/vite/local-dev.d.ts +5 -1
  43. package/vite/local-dev.mjs +17 -13
@@ -95,6 +95,33 @@ var TIMBAL_V2_SHADOW = {
95
95
  ghost: "",
96
96
  link: ""
97
97
  };
98
+ var TIMBAL_V2_PRIMARY_SURFACE = cn(
99
+ TIMBAL_V2_PRIMARY_GRADIENT,
100
+ TIMBAL_V2_SHADOW.primary,
101
+ TIMBAL_V2_BORDER.primary
102
+ );
103
+ var TIMBAL_V2_PRIMARY_PILL_ROOT = cn(
104
+ "relative box-border inline-flex items-center justify-center overflow-hidden rounded-full border-0 bg-transparent p-0 font-normal shadow-none transition duration-200 ease-in-out",
105
+ TIMBAL_V2_SHADOW.primary,
106
+ TIMBAL_V2_BORDER.primary
107
+ );
108
+ var TIMBAL_V2_PRIMARY_PILL_FILL_LAYER = cn(
109
+ "pointer-events-none absolute inset-0 transition duration-200 ease-in-out",
110
+ "bg-gradient-to-b from-primary-fill-from to-primary-fill-to",
111
+ "group-hover/avatar:from-primary-fill-hover-from group-hover/avatar:to-primary-fill-hover-to",
112
+ "group-active/avatar:from-primary-fill-active-from group-active/avatar:to-primary-fill-active-to"
113
+ );
114
+ var TIMBAL_V2_SECONDARY_PILL_ROOT = cn(
115
+ "relative box-border inline-flex items-center justify-center overflow-hidden rounded-full bg-transparent p-0 font-normal shadow-none transition duration-200 ease-in-out",
116
+ TIMBAL_V2_SHADOW.secondary,
117
+ TIMBAL_V2_BORDER.secondary
118
+ );
119
+ var TIMBAL_V2_SECONDARY_PILL_FILL_LAYER = cn(
120
+ "pointer-events-none absolute inset-0 transition duration-200 ease-in-out",
121
+ TIMBAL_V2_ELEVATED_GRADIENT,
122
+ "group-hover/avatar:from-secondary-fill-hover-from group-hover/avatar:to-secondary-fill-hover-to",
123
+ "group-active/avatar:from-secondary-fill-active-from group-active/avatar:to-secondary-fill-active-to"
124
+ );
98
125
  var TIMBAL_V2_SWITCH_TRACK_OFF = cn(
99
126
  TIMBAL_V2_ELEVATED_GRADIENT,
100
127
  "border border-border shadow-card"
@@ -521,25 +548,74 @@ function DialogFooter({ className, ...props }) {
521
548
  }
522
549
 
523
550
  // src/ui/avatar.tsx
551
+ import * as React2 from "react";
524
552
  import { Avatar as AvatarPrimitive } from "radix-ui";
525
- import { jsx as jsx5 } from "react/jsx-runtime";
553
+ import { jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
554
+ var AVATAR_PRIMARY_FALLBACK_CLASS = cn(
555
+ TIMBAL_V2_SECONDARY_PILL_ROOT,
556
+ TIMBAL_V2_LABEL.secondary,
557
+ "font-medium"
558
+ );
559
+ var AVATAR_SECONDARY_FILL_STYLE = {
560
+ backgroundImage: "linear-gradient(to bottom, var(--elevated-from), var(--elevated-to))"
561
+ };
562
+ var AvatarChromeContext = React2.createContext(
563
+ null
564
+ );
565
+ function useAvatarChrome() {
566
+ return React2.useContext(AvatarChromeContext);
567
+ }
568
+ function isBrandedVariant(variant) {
569
+ return variant === "secondary" || variant === "primary" || variant === "chart";
570
+ }
571
+ function avatarChartVariantClass(_seed) {
572
+ return AVATAR_PRIMARY_FALLBACK_CLASS;
573
+ }
574
+ var AVATAR_SIZE_CLASS = {
575
+ default: "size-8",
576
+ sm: "size-6",
577
+ lg: "size-10"
578
+ };
526
579
  function Avatar({
527
580
  className,
528
581
  size = "default",
582
+ variant: rootVariant,
583
+ children,
529
584
  ...props
530
585
  }) {
531
- return /* @__PURE__ */ jsx5(
586
+ const [chrome, setChrome] = React2.useState(rootVariant ?? "muted");
587
+ React2.useLayoutEffect(() => {
588
+ if (rootVariant !== void 0) {
589
+ setChrome(rootVariant);
590
+ }
591
+ }, [rootVariant]);
592
+ const branded = isBrandedVariant(chrome);
593
+ return /* @__PURE__ */ jsx5(AvatarChromeContext.Provider, { value: { chrome, setChrome }, children: /* @__PURE__ */ jsxs4(
532
594
  AvatarPrimitive.Root,
533
595
  {
534
596
  "data-slot": "avatar",
535
597
  "data-size": size,
598
+ "data-variant": branded ? "secondary" : chrome,
536
599
  className: cn(
537
- "group/avatar relative flex size-8 shrink-0 overflow-hidden rounded-full select-none data-[size=lg]:size-10 data-[size=sm]:size-6",
600
+ "group/avatar relative shrink-0 select-none",
601
+ AVATAR_SIZE_CLASS[size],
602
+ branded ? TIMBAL_V2_SECONDARY_PILL_ROOT : "flex overflow-hidden rounded-full",
538
603
  className
539
604
  ),
540
- ...props
605
+ ...props,
606
+ children: [
607
+ branded ? /* @__PURE__ */ jsx5(
608
+ "span",
609
+ {
610
+ "aria-hidden": true,
611
+ className: TIMBAL_V2_SECONDARY_PILL_FILL_LAYER,
612
+ style: AVATAR_SECONDARY_FILL_STYLE
613
+ }
614
+ ) : null,
615
+ children
616
+ ]
541
617
  }
542
- );
618
+ ) });
543
619
  }
544
620
  function AvatarImage({
545
621
  className,
@@ -549,36 +625,56 @@ function AvatarImage({
549
625
  AvatarPrimitive.Image,
550
626
  {
551
627
  "data-slot": "avatar-image",
552
- className: cn("aspect-square size-full", className),
628
+ className: cn(
629
+ "relative z-10 aspect-square size-full rounded-full object-cover",
630
+ className
631
+ ),
553
632
  ...props
554
633
  }
555
634
  );
556
635
  }
557
636
  function AvatarFallback({
558
637
  className,
638
+ variant = "muted",
639
+ seed: _seed,
640
+ children,
641
+ style,
559
642
  ...props
560
643
  }) {
644
+ const chromeCtx = useAvatarChrome();
645
+ React2.useLayoutEffect(() => {
646
+ chromeCtx?.setChrome(variant);
647
+ }, [chromeCtx, variant]);
648
+ const branded = isBrandedVariant(variant);
561
649
  return /* @__PURE__ */ jsx5(
562
650
  AvatarPrimitive.Fallback,
563
651
  {
564
652
  "data-slot": "avatar-fallback",
653
+ "data-variant": branded ? "secondary" : variant,
565
654
  className: cn(
566
- "bg-muted text-muted-foreground flex size-full items-center justify-center rounded-full text-sm group-data-[size=sm]/avatar:text-xs",
655
+ "relative z-10 flex size-full items-center justify-center rounded-full",
656
+ branded ? cn(
657
+ "bg-transparent font-medium",
658
+ TIMBAL_V2_LABEL.secondary,
659
+ "text-sm group-data-[size=sm]/avatar:text-xs"
660
+ ) : "bg-muted font-normal text-muted-foreground text-sm group-data-[size=sm]/avatar:text-xs",
567
661
  className
568
662
  ),
569
- ...props
663
+ style,
664
+ ...props,
665
+ children
570
666
  }
571
667
  );
572
668
  }
573
669
 
574
670
  // src/ui/chart.tsx
575
- import * as React2 from "react";
671
+ import * as React3 from "react";
576
672
  import * as RechartsPrimitive from "recharts";
577
- import { Fragment, jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
673
+ import { Fragment, jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
578
674
  var THEMES = { light: "", dark: ".dark" };
579
- var ChartContext = React2.createContext(null);
675
+ var ChartContext = React3.createContext(null);
580
676
  function useChart() {
581
- const context = React2.useContext(ChartContext);
677
+ const context = React3.useContext(ChartContext);
582
678
  if (!context) {
583
679
  throw new Error("useChart must be used within a <ChartContainer />");
584
680
  }
@@ -591,9 +687,9 @@ function ChartContainer({
591
687
  config,
592
688
  ...props
593
689
  }) {
594
- const uniqueId = React2.useId();
690
+ const uniqueId = React3.useId();
595
691
  const chartId = `chart-${id || uniqueId.replace(/:/g, "")}`;
596
- return /* @__PURE__ */ jsx6(ChartContext.Provider, { value: { config }, children: /* @__PURE__ */ jsxs4(
692
+ return /* @__PURE__ */ jsx6(ChartContext.Provider, { value: { config }, children: /* @__PURE__ */ jsxs5(
597
693
  "div",
598
694
  {
599
695
  "data-slot": "chart",
@@ -652,7 +748,7 @@ function ChartTooltipContent({
652
748
  labelKey
653
749
  }) {
654
750
  const { config } = useChart();
655
- const tooltipLabel = React2.useMemo(() => {
751
+ const tooltipLabel = React3.useMemo(() => {
656
752
  if (hideLabel || !payload?.length) {
657
753
  return null;
658
754
  }
@@ -672,7 +768,7 @@ function ChartTooltipContent({
672
768
  return null;
673
769
  }
674
770
  const nestLabel = payload.length === 1 && indicator !== "dot";
675
- return /* @__PURE__ */ jsxs4(
771
+ return /* @__PURE__ */ jsxs5(
676
772
  "div",
677
773
  {
678
774
  className: cn(
@@ -693,7 +789,7 @@ function ChartTooltipContent({
693
789
  "[&>svg]:text-muted-foreground flex w-full flex-wrap items-stretch gap-2 [&>svg]:h-2.5 [&>svg]:w-2.5",
694
790
  indicator === "dot" && "items-center"
695
791
  ),
696
- children: formatter && item?.value !== void 0 && item.name ? formatter(item.value, item.name, item, index, item.payload) : /* @__PURE__ */ jsxs4(Fragment, { children: [
792
+ children: formatter && item?.value !== void 0 && item.name ? formatter(item.value, item.name, item, index, item.payload) : /* @__PURE__ */ jsxs5(Fragment, { children: [
697
793
  itemConfig?.icon ? /* @__PURE__ */ jsx6(itemConfig.icon, {}) : !hideIndicator && /* @__PURE__ */ jsx6(
698
794
  "div",
699
795
  {
@@ -712,7 +808,7 @@ function ChartTooltipContent({
712
808
  }
713
809
  }
714
810
  ),
715
- /* @__PURE__ */ jsxs4(
811
+ /* @__PURE__ */ jsxs5(
716
812
  "div",
717
813
  {
718
814
  className: cn(
@@ -720,7 +816,7 @@ function ChartTooltipContent({
720
816
  nestLabel ? "items-end" : "items-center"
721
817
  ),
722
818
  children: [
723
- /* @__PURE__ */ jsxs4("div", { className: "grid gap-1.5", children: [
819
+ /* @__PURE__ */ jsxs5("div", { className: "grid gap-1.5", children: [
724
820
  nestLabel ? tooltipLabel : null,
725
821
  /* @__PURE__ */ jsx6("span", { className: "text-muted-foreground", children: itemConfig?.label || item.name })
726
822
  ] }),
@@ -760,10 +856,10 @@ function ChartLegendContent({
760
856
  children: payload.filter((item) => item.type !== "none").map((item, index) => {
761
857
  const key = `${nameKey || item.dataKey || "value"}`;
762
858
  const itemConfig = getPayloadConfigFromPayload(config, item, key);
763
- return /* @__PURE__ */ jsxs4(
859
+ return /* @__PURE__ */ jsxs5(
764
860
  "div",
765
861
  {
766
- className: "[&>svg]:text-muted-foreground flex items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3",
862
+ className: "[&>svg]:text-muted-foreground flex min-w-0 max-w-[8rem] items-center gap-1.5 [&>svg]:h-3 [&>svg]:w-3",
767
863
  children: [
768
864
  itemConfig?.icon && !hideIcon ? /* @__PURE__ */ jsx6(itemConfig.icon, {}) : /* @__PURE__ */ jsx6(
769
865
  "div",
@@ -772,7 +868,7 @@ function ChartLegendContent({
772
868
  style: { backgroundColor: item.color }
773
869
  }
774
870
  ),
775
- itemConfig?.label
871
+ /* @__PURE__ */ jsx6("span", { className: "min-w-0 truncate", children: itemConfig?.label ?? (item.value != null ? String(item.value) : null) })
776
872
  ]
777
873
  },
778
874
  `${item.value ?? index}`
@@ -851,7 +947,6 @@ export {
851
947
  TIMBAL_V2_SECONDARY_CHROME,
852
948
  TIMBAL_V2_LOGO_TILE,
853
949
  TimbalV2Button,
854
- buttonVariants,
855
950
  Button,
856
951
  CONTROL_SIZE,
857
952
  controlSurfaceClass,
@@ -874,6 +969,8 @@ export {
874
969
  DialogDescription,
875
970
  DialogHeader,
876
971
  DialogFooter,
972
+ AVATAR_PRIMARY_FALLBACK_CLASS,
973
+ avatarChartVariantClass,
877
974
  Avatar,
878
975
  AvatarImage,
879
976
  AvatarFallback,
@@ -20,7 +20,7 @@ import {
20
20
  } from "./chunk-QIABF4KB.esm.js";
21
21
  import {
22
22
  WorkforceSelector
23
- } from "./chunk-XCM3V6RK.esm.js";
23
+ } from "./chunk-OFWC4MIY.esm.js";
24
24
  import {
25
25
  Composer,
26
26
  TimbalChat,
@@ -43,10 +43,10 @@ import {
43
43
  studioTopbarIconPillClass,
44
44
  studioTopbarPillHeightClass,
45
45
  useTimbalRuntime
46
- } from "./chunk-YXZ22OJN.esm.js";
46
+ } from "./chunk-GQBYZRD7.esm.js";
47
47
  import {
48
48
  PillSegmentedTabs
49
- } from "./chunk-P3KDAYX6.esm.js";
49
+ } from "./chunk-VXMM2HX7.esm.js";
50
50
  import {
51
51
  Avatar,
52
52
  AvatarFallback,
@@ -56,7 +56,7 @@ import {
56
56
  TooltipContent,
57
57
  TooltipTrigger,
58
58
  cn
59
- } from "./chunk-4AKJ6FKE.esm.js";
59
+ } from "./chunk-QU7ET55D.esm.js";
60
60
 
61
61
  // src/hooks/use-workforces.ts
62
62
  import { useEffect, useMemo, useRef, useState } from "react";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  cn
3
- } from "./chunk-4AKJ6FKE.esm.js";
3
+ } from "./chunk-QU7ET55D.esm.js";
4
4
 
5
5
  // src/ui/checkbox.tsx
6
6
  import { Checkbox as CheckboxPrimitive } from "radix-ui";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  cn
3
- } from "./chunk-4AKJ6FKE.esm.js";
3
+ } from "./chunk-QU7ET55D.esm.js";
4
4
 
5
5
  // src/ui/pill-segmented-tabs.tsx
6
6
  import {