@proteos/ui 0.42.2 → 0.43.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.
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { cn, Button, Skeleton } from './chunk-IKAX76MB.js';
2
2
  export { Button, Skeleton, buttonStyles, cn, skeletonStyles } from './chunk-IKAX76MB.js';
3
- import { Paperclip, BookText, Banknote, User, Link2, Braces, Brackets, ToggleLeft, CircleDot, Calendar, Hash, Type, File, FileImage, FileText, FileSpreadsheet, FileArchive, Loader2, X, ChevronDown, GripVertical, SendHorizontal, CircleX, Download, ChevronRight as ChevronRight$1, CircleCheck } from 'lucide-react';
3
+ import { Paperclip, BookText, Banknote, User, Link2, Braces, Brackets, ToggleLeft, CircleDot, Calendar, Hash, Type, File, FileImage, FileText, FileSpreadsheet, FileArchive, Loader2, X, AudioLines, Video, Mic, AtSign, MessagesSquare, Camera, Send, Linkedin, MessageCircle, Mail, ChevronDown, GripVertical, SendHorizontal, CircleX, Download, ChevronRight as ChevronRight$1, CircleCheck } from 'lucide-react';
4
4
  import { tv } from 'tailwind-variants';
5
5
  import { Tabs as Tabs$1, TabPanel, Tab, TabList, MenuTrigger as MenuTrigger$1, SubmenuTrigger as SubmenuTrigger$1, DialogTrigger, Popover as Popover$1, Dialog, DropZone, Text, FileTrigger, Heading, Label, ListBox, ListBoxItem, Breadcrumbs as Breadcrumbs$1, Breadcrumb, Link, Button as Button$1, Checkbox as Checkbox$1, CheckboxGroup as CheckboxGroup$1, FieldError, ComboBox, Input as Input$1, ComboBoxStateContext, Select as Select$1, DatePicker as DatePicker$1, Group, DateInput, DateSegment, SelectValue, ModalOverlay, Modal as Modal$1, TextField, Menu as Menu$1, MenuItem as MenuItem$1, Disclosure, DisclosurePanel, ProgressBar as ProgressBar$1, RadioGroup as RadioGroup$1, Radio as Radio$1, Separator as Separator$1, Switch as Switch$1, TextArea, TimeField as TimeField$1, TooltipTrigger as TooltipTrigger$1, Tooltip as Tooltip$1, Calendar as Calendar$1, CalendarGrid, CalendarGridHeader, CalendarHeaderCell, CalendarGridBody, CalendarCell, DatePickerStateContext } from 'react-aria-components';
6
6
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
@@ -586,7 +586,7 @@ function BadgeMultiSelect({
586
586
  autoFocus = false,
587
587
  className
588
588
  }) {
589
- const styles2 = fieldControlStyles({ size, invalid: isInvalid, appearance });
589
+ const styles3 = fieldControlStyles({ size, invalid: isInvalid, appearance });
590
590
  const focusWithin = appearance === "cell" ? "focus-within:border-accent focus-within:shadow-none" : "focus-within:border-accent focus-within:shadow-[var(--shadow-focus)]";
591
591
  const minHeight = appearance === "cell" ? "min-h-[29px]" : fieldMinHeight[size];
592
592
  const [isOpen, setIsOpen] = useState(false);
@@ -626,7 +626,7 @@ function BadgeMultiSelect({
626
626
  "data-invalid": isInvalid || void 0,
627
627
  "data-disabled": isDisabled || void 0,
628
628
  className: cn(
629
- styles2.box(),
629
+ styles3.box(),
630
630
  "flex flex-wrap items-center gap-1.5 cursor-pointer",
631
631
  minHeight,
632
632
  fieldChipPadding[size],
@@ -923,6 +923,29 @@ function CardFeatureTitle({ className, ...props }) {
923
923
  function CardBody({ className, ...props }) {
924
924
  return /* @__PURE__ */ jsx("div", { ...props, className: cn("text-[14px] leading-[1.55] text-ink-3", className) });
925
925
  }
926
+ var CHANNEL_ICONS = {
927
+ slack: Hash,
928
+ email: Mail,
929
+ whatsapp: MessageCircle,
930
+ linkedin: Linkedin,
931
+ telegram: Send,
932
+ instagram: Camera,
933
+ messenger: MessagesSquare,
934
+ x: AtSign,
935
+ meeting: Mic,
936
+ "zoom-meeting": Video,
937
+ "google-meet": Video,
938
+ "teams-meeting": Video,
939
+ "webex-meeting": Video,
940
+ adhoc: AudioLines
941
+ };
942
+ function channelIcon(channel) {
943
+ return CHANNEL_ICONS[channel] ?? MessagesSquare;
944
+ }
945
+ function ChannelIcon({ channel, className, label }) {
946
+ const Icon = channelIcon(channel);
947
+ return label !== void 0 ? /* @__PURE__ */ jsx(Icon, { className: cn("size-4", className), role: "img", "aria-label": label }) : /* @__PURE__ */ jsx(Icon, { className: cn("size-4", className), "aria-hidden": true });
948
+ }
926
949
  function Checkbox({ children, className, ...props }) {
927
950
  return /* @__PURE__ */ jsx(
928
951
  Checkbox$1,
@@ -1020,7 +1043,7 @@ function Combobox({
1020
1043
  allowsEmptyCollection = true,
1021
1044
  ...props
1022
1045
  }) {
1023
- const styles2 = fieldControlStyles({ size, appearance });
1046
+ const styles3 = fieldControlStyles({ size, appearance });
1024
1047
  const focusWithin = appearance === "cell" ? "focus-within:border-accent focus-within:shadow-none" : "focus-within:border-accent focus-within:shadow-[var(--shadow-focus)]";
1025
1048
  return /* @__PURE__ */ jsxs(
1026
1049
  ComboBox,
@@ -1039,7 +1062,7 @@ function Combobox({
1039
1062
  className: cn(
1040
1063
  // Box chrome on the wrapper; the inner <input> carries the padding
1041
1064
  // + font so the chevron button sits inside the same border + ring.
1042
- styles2.box(),
1065
+ styles3.box(),
1043
1066
  "flex items-center gap-1 pr-2",
1044
1067
  focusWithin,
1045
1068
  inputWrapperClassName
@@ -1051,7 +1074,7 @@ function Combobox({
1051
1074
  placeholder,
1052
1075
  className: cn(
1053
1076
  "flex-1 min-w-0 bg-transparent outline-none",
1054
- styles2.content(),
1077
+ styles3.content(),
1055
1078
  inputClassName
1056
1079
  )
1057
1080
  }
@@ -1491,16 +1514,16 @@ function CurrencyInput({
1491
1514
  onChange({ amount: nextAmount, currency_code: nextCode });
1492
1515
  };
1493
1516
  const selectedSymbol = currencyOptions.find((option) => option.code === code)?.symbol ?? code;
1494
- const styles2 = fieldControlStyles({ size, appearance, ...isInvalid ? { invalid: true } : {} });
1517
+ const styles3 = fieldControlStyles({ size, appearance, ...isInvalid ? { invalid: true } : {} });
1495
1518
  const focusWithin = appearance === "cell" ? "focus-within:border-accent focus-within:shadow-none" : "focus-within:border-accent focus-within:shadow-[var(--shadow-focus)]";
1496
1519
  return /* @__PURE__ */ jsxs("div", { className: cn("grid grid-cols-1 gap-1.5", className), children: [
1497
- /* @__PURE__ */ jsxs("div", { className: cn(styles2.box(), "flex items-center gap-1 pr-1", focusWithin), children: [
1520
+ /* @__PURE__ */ jsxs("div", { className: cn(styles3.box(), "flex items-center gap-1 pr-1", focusWithin), children: [
1498
1521
  /* @__PURE__ */ jsx(
1499
1522
  "input",
1500
1523
  {
1501
1524
  className: cn(
1502
1525
  "min-w-0 flex-1 bg-transparent text-ink outline-none tabular-nums",
1503
- styles2.content(),
1526
+ styles3.content(),
1504
1527
  // Sit a touch lower than a standard field by trimming the vertical
1505
1528
  // padding (cell mode keeps the fixed 29px row-editor height).
1506
1529
  appearance === "cell" ? "" : size === "sm" ? "py-1" : "py-1.5"
@@ -2574,7 +2597,7 @@ function DatePicker({
2574
2597
  className,
2575
2598
  ...props
2576
2599
  }) {
2577
- const styles2 = fieldControlStyles({ size, appearance });
2600
+ const styles3 = fieldControlStyles({ size, appearance });
2578
2601
  const focusWithin = appearance === "cell" ? "focus-within:border-accent focus-within:shadow-none" : "focus-within:border-accent focus-within:shadow-[var(--shadow-focus)]";
2579
2602
  return /* @__PURE__ */ jsxs(
2580
2603
  DatePicker$1,
@@ -2592,7 +2615,7 @@ function DatePicker({
2592
2615
  className: cn(
2593
2616
  // Box chrome on the wrapper; the DateInput inside carries padding +
2594
2617
  // font so the calendar trigger sits inside the same border + ring.
2595
- styles2.box(),
2618
+ styles3.box(),
2596
2619
  "flex items-center gap-1 pr-1",
2597
2620
  focusWithin
2598
2621
  ),
@@ -2602,7 +2625,7 @@ function DatePicker({
2602
2625
  {
2603
2626
  className: cn(
2604
2627
  "flex-1 flex items-center min-w-0 text-ink",
2605
- styles2.content(),
2628
+ styles3.content(),
2606
2629
  // Tabular alignment for date segments — overrides content's
2607
2630
  // font-sans on purpose.
2608
2631
  "font-mono"
@@ -2724,7 +2747,7 @@ function DateTimePicker({
2724
2747
  shouldCloseOnSelect = false,
2725
2748
  ...props
2726
2749
  }) {
2727
- const styles2 = fieldControlStyles({ size, appearance });
2750
+ const styles3 = fieldControlStyles({ size, appearance });
2728
2751
  const focusWithin = appearance === "cell" ? "focus-within:border-accent focus-within:shadow-none" : "focus-within:border-accent focus-within:shadow-[var(--shadow-focus)]";
2729
2752
  const timeGranularity = granularity === "day" ? "minute" : granularity;
2730
2753
  const { hourCycle } = props;
@@ -2747,7 +2770,7 @@ function DateTimePicker({
2747
2770
  className: cn(
2748
2771
  // Box chrome on the wrapper; the DateInput inside carries padding +
2749
2772
  // font so the calendar trigger sits inside the same border + ring.
2750
- styles2.box(),
2773
+ styles3.box(),
2751
2774
  "flex items-center gap-1 pr-1",
2752
2775
  focusWithin
2753
2776
  ),
@@ -2757,7 +2780,7 @@ function DateTimePicker({
2757
2780
  {
2758
2781
  className: cn(
2759
2782
  "flex-1 flex items-center min-w-0 text-ink",
2760
- styles2.content(),
2783
+ styles3.content(),
2761
2784
  // Tabular alignment for date/time segments — overrides content's
2762
2785
  // font-sans on purpose.
2763
2786
  "font-mono"
@@ -2817,6 +2840,69 @@ function DateTimePicker({
2817
2840
  }
2818
2841
  );
2819
2842
  }
2843
+ var draftMessageCardStyles = tv({
2844
+ slots: {
2845
+ root: [
2846
+ "flex items-center gap-2.5 rounded-md border border-accent/40 px-3 py-2",
2847
+ "bg-[color-mix(in_oklab,var(--color-accent)_6%,var(--color-surface))]"
2848
+ ],
2849
+ icon: [
2850
+ "grid size-8 shrink-0 place-items-center rounded-full text-accent",
2851
+ "bg-[color-mix(in_oklab,var(--color-accent)_12%,transparent)]"
2852
+ ],
2853
+ body: "min-w-0 flex-1",
2854
+ eyebrow: "font-mono text-[10px] uppercase tracking-[0.08em] text-accent",
2855
+ title: "truncate text-[13px] font-medium text-ink",
2856
+ recipients: "truncate text-[12px] text-ink-3",
2857
+ action: [
2858
+ "shrink-0 cursor-pointer rounded-sm border border-accent/50 px-2.5 py-1",
2859
+ "font-mono text-[11px] text-accent outline-none",
2860
+ "hover:bg-[color-mix(in_oklab,var(--color-accent)_12%,transparent)]",
2861
+ "focus-visible:shadow-[var(--shadow-focus)]",
2862
+ "disabled:cursor-default disabled:opacity-50"
2863
+ ],
2864
+ outcome: "shrink-0 font-mono text-[11px] text-ink-3"
2865
+ }
2866
+ });
2867
+ var styles = draftMessageCardStyles();
2868
+ var DRAFT_OUTCOME_LABEL = {
2869
+ sent: "Sent",
2870
+ rejected: "Rejected",
2871
+ failed: "Approved, but delivery failed"
2872
+ };
2873
+ function DraftMessageCard({
2874
+ channel,
2875
+ title,
2876
+ recipients,
2877
+ eyebrow = "Draft \u2014 awaiting review",
2878
+ previewLabel = "Review",
2879
+ outcome,
2880
+ onPreview,
2881
+ isPreviewDisabled = false,
2882
+ className
2883
+ }) {
2884
+ return /* @__PURE__ */ jsxs("div", { className: cn(styles.root(), className), children: [
2885
+ /* @__PURE__ */ jsx("span", { className: styles.icon(), children: /* @__PURE__ */ jsx(ChannelIcon, { channel }) }),
2886
+ /* @__PURE__ */ jsxs("div", { className: styles.body(), children: [
2887
+ /* @__PURE__ */ jsx("p", { className: styles.eyebrow(), children: eyebrow }),
2888
+ /* @__PURE__ */ jsx("p", { className: styles.title(), children: title }),
2889
+ recipients && recipients.length > 0 ? /* @__PURE__ */ jsxs("p", { className: styles.recipients(), children: [
2890
+ "To ",
2891
+ recipients.join(", ")
2892
+ ] }) : null
2893
+ ] }),
2894
+ outcome ? /* @__PURE__ */ jsx("span", { className: styles.outcome(), children: DRAFT_OUTCOME_LABEL[outcome] }) : /* @__PURE__ */ jsx(
2895
+ Button$1,
2896
+ {
2897
+ onPress: onPreview ?? (() => {
2898
+ }),
2899
+ isDisabled: isPreviewDisabled,
2900
+ className: styles.action(),
2901
+ children: previewLabel
2902
+ }
2903
+ )
2904
+ ] });
2905
+ }
2820
2906
 
2821
2907
  // src/components/draft-message-composer/create-draft-message-client.ts
2822
2908
  function createDraftMessageClient(conversation) {
@@ -2886,7 +2972,7 @@ function MultiSelect({
2886
2972
  appearance,
2887
2973
  className
2888
2974
  }) {
2889
- const styles2 = fieldControlStyles({ size, invalid: isInvalid, appearance });
2975
+ const styles3 = fieldControlStyles({ size, invalid: isInvalid, appearance });
2890
2976
  const focusWithin = appearance === "cell" ? "focus-within:border-accent focus-within:shadow-none" : "focus-within:border-accent focus-within:shadow-[var(--shadow-focus)]";
2891
2977
  const minHeight = appearance === "cell" ? "min-h-[29px]" : fieldMinHeight[size];
2892
2978
  const [isOpen, setIsOpen] = useState(false);
@@ -2933,7 +3019,7 @@ function MultiSelect({
2933
3019
  "data-invalid": isInvalid || void 0,
2934
3020
  "data-disabled": isDisabled || void 0,
2935
3021
  className: cn(
2936
- styles2.box(),
3022
+ styles3.box(),
2937
3023
  "flex flex-wrap items-center gap-1.5 cursor-pointer",
2938
3024
  minHeight,
2939
3025
  fieldChipPadding[size],
@@ -3183,7 +3269,7 @@ function Select({
3183
3269
  className,
3184
3270
  ...props
3185
3271
  }) {
3186
- const styles2 = fieldControlStyles({ size, appearance });
3272
+ const styles3 = fieldControlStyles({ size, appearance });
3187
3273
  return /* @__PURE__ */ jsxs(
3188
3274
  Select$1,
3189
3275
  {
@@ -3198,8 +3284,8 @@ function Select({
3198
3284
  Button$1,
3199
3285
  {
3200
3286
  className: cn(
3201
- styles2.box(),
3202
- styles2.content(),
3287
+ styles3.box(),
3288
+ styles3.content(),
3203
3289
  "flex items-center justify-between gap-3 text-left cursor-pointer",
3204
3290
  triggerClassName
3205
3291
  ),
@@ -3592,6 +3678,27 @@ function __resetDraftMessageOutcomes() {
3592
3678
  listenersByMessageId2.clear();
3593
3679
  lastOutcomeByMessageId.clear();
3594
3680
  }
3681
+
3682
+ // src/components/draft-message-composer/draft-status.ts
3683
+ var OUTCOME_BY_STATUS = {
3684
+ // `pending` is already handed to the transport — from the reviewer's side
3685
+ // the decision was "send".
3686
+ pending: "sent",
3687
+ sent: "sent",
3688
+ rejected: "rejected",
3689
+ failed: "failed"
3690
+ };
3691
+ function terminalKindFor(status) {
3692
+ if (status === "draft") return null;
3693
+ return OUTCOME_BY_STATUS[status] ?? "not-draft";
3694
+ }
3695
+ function draftOutcomeFor(status) {
3696
+ const kind = terminalKindFor(status);
3697
+ return kind === null || kind === "not-draft" ? null : kind;
3698
+ }
3699
+ function isDraftReviewOutcome(value) {
3700
+ return value === "sent" || value === "rejected" || value === "failed";
3701
+ }
3595
3702
  var draftMessageComposerStyles = tv({
3596
3703
  slots: {
3597
3704
  root: "flex flex-col gap-1.5",
@@ -3609,28 +3716,13 @@ var draftMessageComposerStyles = tv({
3609
3716
  error: "px-[18px] font-mono text-[11px] text-danger"
3610
3717
  }
3611
3718
  });
3612
- var styles = draftMessageComposerStyles();
3719
+ var styles2 = draftMessageComposerStyles();
3613
3720
  function sendRecipientsFromMessage(message, role) {
3614
3721
  return (message.recipients ?? []).filter((recipient) => recipient.role === role && !!recipient.external_id).map((recipient) => ({
3615
3722
  kind: "contact-address",
3616
3723
  external_id: recipient.external_id
3617
3724
  }));
3618
3725
  }
3619
- function terminalKindFor(status) {
3620
- switch (status) {
3621
- case "draft":
3622
- return null;
3623
- case "pending":
3624
- case "sent":
3625
- return "sent";
3626
- case "rejected":
3627
- return "rejected";
3628
- case "failed":
3629
- return "failed";
3630
- default:
3631
- return "not-draft";
3632
- }
3633
- }
3634
3726
  function DraftMessageComposer({
3635
3727
  messageId,
3636
3728
  client,
@@ -3840,10 +3932,10 @@ function DraftMessageComposer({
3840
3932
  [message?.attachments]
3841
3933
  );
3842
3934
  if (phase === "loading") {
3843
- return /* @__PURE__ */ jsx("div", { className: cn(styles.root(), className), children: /* @__PURE__ */ jsx("p", { className: styles.terminal(), children: "Loading draft\u2026" }) });
3935
+ return /* @__PURE__ */ jsx("div", { className: cn(styles2.root(), className), children: /* @__PURE__ */ jsx("p", { className: styles2.terminal(), children: "Loading draft\u2026" }) });
3844
3936
  }
3845
3937
  if (phase === "load-error") {
3846
- return /* @__PURE__ */ jsx("div", { className: cn(styles.root(), className), children: /* @__PURE__ */ jsxs("p", { className: styles.terminal(), children: [
3938
+ return /* @__PURE__ */ jsx("div", { className: cn(styles2.root(), className), children: /* @__PURE__ */ jsxs("p", { className: styles2.terminal(), children: [
3847
3939
  loadError ?? "Loading the draft failed.",
3848
3940
  " ",
3849
3941
  /* @__PURE__ */ jsx(
@@ -3858,12 +3950,12 @@ function DraftMessageComposer({
3858
3950
  }
3859
3951
  if (phase === "terminal" || !message) {
3860
3952
  const line = terminalKind === "sent" ? "This draft was sent." : terminalKind === "rejected" ? "This draft was rejected." : terminalKind === "failed" ? `Sending failed${message?.error ? ` \u2014 ${message.error}` : ""}.` : "This message is not a reviewable draft.";
3861
- return /* @__PURE__ */ jsx("div", { className: cn(styles.root(), className), "data-draft-terminal": terminalKind, children: /* @__PURE__ */ jsx("p", { className: styles.terminal(), children: line }) });
3953
+ return /* @__PURE__ */ jsx("div", { className: cn(styles2.root(), className), "data-draft-terminal": terminalKind, children: /* @__PURE__ */ jsx("p", { className: styles2.terminal(), children: line }) });
3862
3954
  }
3863
- return /* @__PURE__ */ jsxs("div", { className: cn(styles.root(), className), children: [
3864
- /* @__PURE__ */ jsxs("div", { className: styles.header(), children: [
3865
- /* @__PURE__ */ jsx("span", { className: styles.badge(), children: "Draft \xB7 awaiting review" }),
3866
- /* @__PURE__ */ jsxs("span", { className: styles.sender(), children: [
3955
+ return /* @__PURE__ */ jsxs("div", { className: cn(styles2.root(), className), children: [
3956
+ /* @__PURE__ */ jsxs("div", { className: styles2.header(), children: [
3957
+ /* @__PURE__ */ jsx("span", { className: styles2.badge(), children: "Draft \xB7 awaiting review" }),
3958
+ /* @__PURE__ */ jsxs("span", { className: styles2.sender(), children: [
3867
3959
  "from ",
3868
3960
  message.sender.name
3869
3961
  ] })
@@ -3894,11 +3986,11 @@ function DraftMessageComposer({
3894
3986
  showSendButton: showActions
3895
3987
  }
3896
3988
  ),
3897
- actionError ? /* @__PURE__ */ jsxs("p", { className: styles.error(), children: [
3989
+ actionError ? /* @__PURE__ */ jsxs("p", { className: styles2.error(), children: [
3898
3990
  actionError,
3899
3991
  " \u2014 your edits are kept."
3900
3992
  ] }) : null,
3901
- showActions ? /* @__PURE__ */ jsxs("div", { className: styles.actions(), children: [
3993
+ showActions ? /* @__PURE__ */ jsxs("div", { className: styles2.actions(), children: [
3902
3994
  isConfirmingReject ? /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
3903
3995
  /* @__PURE__ */ jsx("span", { className: "text-[12.5px] text-ink-3", children: "Reject draft?" }),
3904
3996
  /* @__PURE__ */ jsx(
@@ -3935,6 +4027,207 @@ function DraftMessageComposer({
3935
4027
  ] }) : null
3936
4028
  ] });
3937
4029
  }
4030
+ function Modal(props) {
4031
+ return /* @__PURE__ */ jsx(DialogTrigger, { ...props });
4032
+ }
4033
+ function ModalContent({
4034
+ children,
4035
+ className,
4036
+ modalClassName,
4037
+ isDismissable = true,
4038
+ ...props
4039
+ }) {
4040
+ return /* @__PURE__ */ jsx(
4041
+ ModalOverlay,
4042
+ {
4043
+ isDismissable,
4044
+ ...props,
4045
+ className: (renderProps) => cn(
4046
+ "fixed inset-0 z-50 flex items-center justify-center p-4",
4047
+ // Warm ink scrim — stays in the Proteos palette (no pure black).
4048
+ "bg-[color-mix(in_oklab,var(--color-ink)_40%,transparent)]",
4049
+ "entering:animate-in entering:fade-in-0 entering:duration-150",
4050
+ "exiting:animate-out exiting:fade-out-0 exiting:duration-100",
4051
+ typeof className === "function" ? className(renderProps) : className
4052
+ ),
4053
+ children: /* @__PURE__ */ jsx(
4054
+ Modal$1,
4055
+ {
4056
+ className: cn(
4057
+ "w-full max-w-lg",
4058
+ // Cap the panel at the viewport (minus the overlay's p-4) and lay it
4059
+ // out as a column so a tall body scrolls instead of overflowing the
4060
+ // screen. Short modals are unaffected — height still tracks content.
4061
+ "flex flex-col max-h-[calc(100dvh-2rem)]",
4062
+ "bg-surface border border-rule rounded-lg",
4063
+ "shadow-[var(--shadow-float)]",
4064
+ "entering:animate-in entering:zoom-in-95 entering:slide-in-from-top-2 entering:duration-150",
4065
+ "exiting:animate-out exiting:zoom-out-95 exiting:duration-100",
4066
+ modalClassName
4067
+ ),
4068
+ children: /* @__PURE__ */ jsx(Dialog, { className: "outline-none flex flex-col min-h-0 overflow-hidden", children })
4069
+ }
4070
+ )
4071
+ }
4072
+ );
4073
+ }
4074
+ function ModalHeader({ className, ...props }) {
4075
+ return /* @__PURE__ */ jsx("div", { ...props, className: cn("shrink-0 px-5 pt-5 pb-3 flex flex-col gap-1.5", className) });
4076
+ }
4077
+ function ModalTitle({ className, ...props }) {
4078
+ return /* @__PURE__ */ jsx(
4079
+ Heading,
4080
+ {
4081
+ slot: "title",
4082
+ ...props,
4083
+ className: cn(
4084
+ "font-sans font-medium text-[20px] leading-[1.25] tracking-[-0.015em] text-ink",
4085
+ className
4086
+ )
4087
+ }
4088
+ );
4089
+ }
4090
+ function ModalDescription({ className, ...props }) {
4091
+ return /* @__PURE__ */ jsx("p", { ...props, className: cn("text-[14px] leading-[1.55] text-ink-3", className) });
4092
+ }
4093
+ function ModalBody({ className, ...props }) {
4094
+ return /* @__PURE__ */ jsx(
4095
+ "div",
4096
+ {
4097
+ ...props,
4098
+ className: cn(
4099
+ // The scroll region: caps at the panel's spare height and scrolls when
4100
+ // the content is taller, leaving header + footer pinned.
4101
+ "min-h-0 overflow-y-auto px-5 py-3 flex flex-col gap-3 text-[14px] text-ink-2",
4102
+ className
4103
+ )
4104
+ }
4105
+ );
4106
+ }
4107
+ function ModalFooter({ className, ...props }) {
4108
+ return /* @__PURE__ */ jsx(
4109
+ "div",
4110
+ {
4111
+ ...props,
4112
+ className: cn("shrink-0 flex justify-end items-center gap-2", "px-5 pt-3 pb-5", className)
4113
+ }
4114
+ );
4115
+ }
4116
+ function DraftMessageReview({
4117
+ messageId,
4118
+ client,
4119
+ onPreview,
4120
+ onOutcome,
4121
+ onLoadError,
4122
+ modalTitle = "Review draft",
4123
+ modalClassName = "max-w-3xl",
4124
+ overlayClassName,
4125
+ previewLabel,
4126
+ className
4127
+ }) {
4128
+ const [message, setMessage] = useState(null);
4129
+ const [subject, setSubject] = useState("");
4130
+ const [isOpen, setIsOpen] = useState(false);
4131
+ const [isPreviewing, setIsPreviewing] = useState(false);
4132
+ const [outcome, setOutcome] = useState(null);
4133
+ const onOutcomeRef = useRef(onOutcome);
4134
+ onOutcomeRef.current = onOutcome;
4135
+ const onLoadErrorRef = useRef(onLoadError);
4136
+ onLoadErrorRef.current = onLoadError;
4137
+ const hasSettledRef = useRef(false);
4138
+ const settle = useCallback((next, settled) => {
4139
+ setOutcome(next);
4140
+ setIsOpen(false);
4141
+ if (hasSettledRef.current) return;
4142
+ hasSettledRef.current = true;
4143
+ onOutcomeRef.current?.(next, settled);
4144
+ }, []);
4145
+ useEffect(() => {
4146
+ let cancelled = false;
4147
+ void (async () => {
4148
+ try {
4149
+ const loaded = await client.getMessage(messageId);
4150
+ if (cancelled) return;
4151
+ setMessage(loaded);
4152
+ const terminal = draftOutcomeFor(loaded.status);
4153
+ if (terminal) {
4154
+ settle(terminal, loaded);
4155
+ return;
4156
+ }
4157
+ if (loaded.conversation_id) {
4158
+ const conversation = await client.getConversation(loaded.conversation_id);
4159
+ if (!cancelled) setSubject(conversation.subject ?? "");
4160
+ }
4161
+ } catch (error) {
4162
+ if (cancelled) return;
4163
+ onLoadErrorRef.current?.(error instanceof Error ? error : new Error(String(error)));
4164
+ }
4165
+ })();
4166
+ return () => {
4167
+ cancelled = true;
4168
+ };
4169
+ }, [client, messageId, settle]);
4170
+ const published = useDraftMessageOutcome(messageId);
4171
+ useEffect(() => {
4172
+ if (published) settle(published.type, published.message);
4173
+ }, [published, settle]);
4174
+ const preview = () => {
4175
+ if (!onPreview) {
4176
+ setIsOpen(true);
4177
+ return;
4178
+ }
4179
+ setIsPreviewing(true);
4180
+ void onPreview(messageId).then((result) => {
4181
+ if (result) settle(result);
4182
+ }).finally(() => setIsPreviewing(false));
4183
+ };
4184
+ if (!message) return null;
4185
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
4186
+ /* @__PURE__ */ jsx(
4187
+ DraftMessageCard,
4188
+ {
4189
+ channel: message.channel,
4190
+ title: titleFor(message, subject),
4191
+ recipients: toRecipients(message),
4192
+ outcome,
4193
+ onPreview: preview,
4194
+ isPreviewDisabled: isPreviewing,
4195
+ ...previewLabel !== void 0 ? { previewLabel } : {},
4196
+ ...className !== void 0 ? { className } : {}
4197
+ }
4198
+ ),
4199
+ onPreview ? null : /* @__PURE__ */ jsxs(
4200
+ ModalContent,
4201
+ {
4202
+ isOpen,
4203
+ onOpenChange: setIsOpen,
4204
+ modalClassName,
4205
+ ...overlayClassName !== void 0 ? { className: overlayClassName } : {},
4206
+ children: [
4207
+ /* @__PURE__ */ jsx(ModalHeader, { children: /* @__PURE__ */ jsx(ModalTitle, { children: modalTitle }) }),
4208
+ /* @__PURE__ */ jsx(ModalBody, { className: "min-h-0 overflow-y-auto", children: /* @__PURE__ */ jsx(
4209
+ DraftMessageComposer,
4210
+ {
4211
+ messageId,
4212
+ client,
4213
+ bodyClassName: "max-h-[55dvh]",
4214
+ onSent: (sent) => settle(draftOutcomeFor(sent.status) ?? "sent", sent),
4215
+ onRejected: (rejected) => settle("rejected", rejected),
4216
+ onFailed: (failed) => settle("failed", failed)
4217
+ }
4218
+ ) })
4219
+ ]
4220
+ }
4221
+ )
4222
+ ] });
4223
+ }
4224
+ function titleFor(message, subject) {
4225
+ const firstLine = message.content.find((block) => block.type === "text")?.text?.split("\n")[0];
4226
+ return subject || firstLine || "Draft message";
4227
+ }
4228
+ function toRecipients(message) {
4229
+ return (message.recipients ?? []).filter((recipient) => recipient.role === "to").map((recipient) => recipient.name || recipient.email || recipient.external_id).filter((label) => !!label);
4230
+ }
3938
4231
  var emptyStateStyles = tv({
3939
4232
  slots: {
3940
4233
  root: "flex flex-col items-center text-center px-6",
@@ -3965,12 +4258,12 @@ function EmptyState({
3965
4258
  size,
3966
4259
  className
3967
4260
  }) {
3968
- const styles2 = emptyStateStyles({ size });
3969
- return /* @__PURE__ */ jsxs("div", { className: cn(styles2.root(), className), children: [
3970
- icon ? /* @__PURE__ */ jsx("div", { className: styles2.art(), children: icon }) : null,
3971
- /* @__PURE__ */ jsx("div", { className: styles2.title(), children: title }),
3972
- description ? /* @__PURE__ */ jsx("div", { className: styles2.description(), children: description }) : null,
3973
- action ? /* @__PURE__ */ jsx("div", { className: styles2.actions(), children: action }) : null
4261
+ const styles3 = emptyStateStyles({ size });
4262
+ return /* @__PURE__ */ jsxs("div", { className: cn(styles3.root(), className), children: [
4263
+ icon ? /* @__PURE__ */ jsx("div", { className: styles3.art(), children: icon }) : null,
4264
+ /* @__PURE__ */ jsx("div", { className: styles3.title(), children: title }),
4265
+ description ? /* @__PURE__ */ jsx("div", { className: styles3.description(), children: description }) : null,
4266
+ action ? /* @__PURE__ */ jsx("div", { className: styles3.actions(), children: action }) : null
3974
4267
  ] });
3975
4268
  }
3976
4269
  function ErrorAnimation({ className }) {
@@ -4211,7 +4504,7 @@ function Input({
4211
4504
  className,
4212
4505
  ...props
4213
4506
  }) {
4214
- const styles2 = fieldControlStyles({ size, appearance, hasFocusRing });
4507
+ const styles3 = fieldControlStyles({ size, appearance, hasFocusRing });
4215
4508
  return /* @__PURE__ */ jsxs(
4216
4509
  TextField,
4217
4510
  {
@@ -4227,7 +4520,7 @@ function Input({
4227
4520
  {
4228
4521
  ...inputProps,
4229
4522
  placeholder: placeholder ?? "",
4230
- className: cn(styles2.box(), styles2.content(), inputClassName)
4523
+ className: cn(styles3.box(), styles3.content(), inputClassName)
4231
4524
  }
4232
4525
  ),
4233
4526
  description ? /* @__PURE__ */ jsx(Text, { slot: "description", className: fieldHintStyles, children: description }) : null,
@@ -4290,92 +4583,6 @@ function MenuItem({ icon, hasSubmenu, children, className, ...props }) {
4290
4583
  }
4291
4584
  );
4292
4585
  }
4293
- function Modal(props) {
4294
- return /* @__PURE__ */ jsx(DialogTrigger, { ...props });
4295
- }
4296
- function ModalContent({
4297
- children,
4298
- className,
4299
- modalClassName,
4300
- isDismissable = true,
4301
- ...props
4302
- }) {
4303
- return /* @__PURE__ */ jsx(
4304
- ModalOverlay,
4305
- {
4306
- isDismissable,
4307
- ...props,
4308
- className: (renderProps) => cn(
4309
- "fixed inset-0 z-50 flex items-center justify-center p-4",
4310
- // Warm ink scrim — stays in the Proteos palette (no pure black).
4311
- "bg-[color-mix(in_oklab,var(--color-ink)_40%,transparent)]",
4312
- "entering:animate-in entering:fade-in-0 entering:duration-150",
4313
- "exiting:animate-out exiting:fade-out-0 exiting:duration-100",
4314
- typeof className === "function" ? className(renderProps) : className
4315
- ),
4316
- children: /* @__PURE__ */ jsx(
4317
- Modal$1,
4318
- {
4319
- className: cn(
4320
- "w-full max-w-lg",
4321
- // Cap the panel at the viewport (minus the overlay's p-4) and lay it
4322
- // out as a column so a tall body scrolls instead of overflowing the
4323
- // screen. Short modals are unaffected — height still tracks content.
4324
- "flex flex-col max-h-[calc(100dvh-2rem)]",
4325
- "bg-surface border border-rule rounded-lg",
4326
- "shadow-[var(--shadow-float)]",
4327
- "entering:animate-in entering:zoom-in-95 entering:slide-in-from-top-2 entering:duration-150",
4328
- "exiting:animate-out exiting:zoom-out-95 exiting:duration-100",
4329
- modalClassName
4330
- ),
4331
- children: /* @__PURE__ */ jsx(Dialog, { className: "outline-none flex flex-col min-h-0 overflow-hidden", children })
4332
- }
4333
- )
4334
- }
4335
- );
4336
- }
4337
- function ModalHeader({ className, ...props }) {
4338
- return /* @__PURE__ */ jsx("div", { ...props, className: cn("shrink-0 px-5 pt-5 pb-3 flex flex-col gap-1.5", className) });
4339
- }
4340
- function ModalTitle({ className, ...props }) {
4341
- return /* @__PURE__ */ jsx(
4342
- Heading,
4343
- {
4344
- slot: "title",
4345
- ...props,
4346
- className: cn(
4347
- "font-sans font-medium text-[20px] leading-[1.25] tracking-[-0.015em] text-ink",
4348
- className
4349
- )
4350
- }
4351
- );
4352
- }
4353
- function ModalDescription({ className, ...props }) {
4354
- return /* @__PURE__ */ jsx("p", { ...props, className: cn("text-[14px] leading-[1.55] text-ink-3", className) });
4355
- }
4356
- function ModalBody({ className, ...props }) {
4357
- return /* @__PURE__ */ jsx(
4358
- "div",
4359
- {
4360
- ...props,
4361
- className: cn(
4362
- // The scroll region: caps at the panel's spare height and scrolls when
4363
- // the content is taller, leaving header + footer pinned.
4364
- "min-h-0 overflow-y-auto px-5 py-3 flex flex-col gap-3 text-[14px] text-ink-2",
4365
- className
4366
- )
4367
- }
4368
- );
4369
- }
4370
- function ModalFooter({ className, ...props }) {
4371
- return /* @__PURE__ */ jsx(
4372
- "div",
4373
- {
4374
- ...props,
4375
- className: cn("shrink-0 flex justify-end items-center gap-2", "px-5 pt-3 pb-5", className)
4376
- }
4377
- );
4378
- }
4379
4586
  var NavNestedContext = createContext(false);
4380
4587
  function useIsNested() {
4381
4588
  return useContext(NavNestedContext);
@@ -4862,7 +5069,7 @@ function SegmentedControl({
4862
5069
  orientation = "horizontal",
4863
5070
  ...props
4864
5071
  }) {
4865
- const styles2 = segmentedControlStyles({ size });
5072
+ const styles3 = segmentedControlStyles({ size });
4866
5073
  return /* @__PURE__ */ jsx(
4867
5074
  RadioGroup$1,
4868
5075
  {
@@ -4870,14 +5077,14 @@ function SegmentedControl({
4870
5077
  orientation,
4871
5078
  value: String(value),
4872
5079
  onChange: (next) => onChange(next),
4873
- className: cn(styles2.group(), className),
5080
+ className: cn(styles3.group(), className),
4874
5081
  children: options.map((option) => /* @__PURE__ */ jsx(
4875
5082
  Radio$1,
4876
5083
  {
4877
5084
  value: String(option.id),
4878
5085
  ...option.isDisabled ? { isDisabled: true } : {},
4879
5086
  ...autoFocus && option.id === value ? { autoFocus: true } : {},
4880
- className: styles2.segment(),
5087
+ className: styles3.segment(),
4881
5088
  children: option.label
4882
5089
  },
4883
5090
  String(option.id)
@@ -4900,7 +5107,7 @@ function TagInput({
4900
5107
  autoFocus = false,
4901
5108
  className
4902
5109
  }) {
4903
- const styles2 = fieldControlStyles({ size, invalid: isInvalid, appearance });
5110
+ const styles3 = fieldControlStyles({ size, invalid: isInvalid, appearance });
4904
5111
  const focusWithin = appearance === "cell" ? "focus-within:border-accent focus-within:shadow-none" : "focus-within:border-accent focus-within:shadow-[var(--shadow-focus)]";
4905
5112
  const minHeight = appearance === "cell" ? "min-h-[29px]" : fieldMinHeight[size];
4906
5113
  const inputRef = useRef(null);
@@ -4941,7 +5148,7 @@ function TagInput({
4941
5148
  "data-invalid": isInvalid || void 0,
4942
5149
  "data-disabled": isDisabled || void 0,
4943
5150
  className: cn(
4944
- styles2.box(),
5151
+ styles3.box(),
4945
5152
  "flex flex-wrap items-center gap-1",
4946
5153
  minHeight,
4947
5154
  fieldChipPadding[size],
@@ -6681,45 +6888,45 @@ var tabsStyles = tv({
6681
6888
  defaultVariants: { size: "md" }
6682
6889
  });
6683
6890
  function Root({ size, className, children, ...props }) {
6684
- const styles2 = tabsStyles({ size });
6891
+ const styles3 = tabsStyles({ size });
6685
6892
  return /* @__PURE__ */ jsx(
6686
6893
  Tabs$1,
6687
6894
  {
6688
6895
  ...props,
6689
- className: (rp) => cn(styles2.root(), typeof className === "function" ? className(rp) : className),
6896
+ className: (rp) => cn(styles3.root(), typeof className === "function" ? className(rp) : className),
6690
6897
  children
6691
6898
  }
6692
6899
  );
6693
6900
  }
6694
6901
  function List({ size, className, children, ...props }) {
6695
- const styles2 = tabsStyles({ size });
6902
+ const styles3 = tabsStyles({ size });
6696
6903
  return /* @__PURE__ */ jsx(
6697
6904
  TabList,
6698
6905
  {
6699
6906
  ...props,
6700
- className: (rp) => cn(styles2.list(), typeof className === "function" ? className(rp) : className),
6907
+ className: (rp) => cn(styles3.list(), typeof className === "function" ? className(rp) : className),
6701
6908
  children
6702
6909
  }
6703
6910
  );
6704
6911
  }
6705
6912
  function Trigger({ size, className, children, ...props }) {
6706
- const styles2 = tabsStyles({ size });
6913
+ const styles3 = tabsStyles({ size });
6707
6914
  return /* @__PURE__ */ jsx(
6708
6915
  Tab,
6709
6916
  {
6710
6917
  ...props,
6711
- className: (rp) => cn(styles2.trigger(), typeof className === "function" ? className(rp) : className),
6918
+ className: (rp) => cn(styles3.trigger(), typeof className === "function" ? className(rp) : className),
6712
6919
  children
6713
6920
  }
6714
6921
  );
6715
6922
  }
6716
6923
  function Panel({ className, children, ...props }) {
6717
- const styles2 = tabsStyles({});
6924
+ const styles3 = tabsStyles({});
6718
6925
  return /* @__PURE__ */ jsx(
6719
6926
  TabPanel,
6720
6927
  {
6721
6928
  ...props,
6722
- className: (rp) => cn(styles2.panel(), typeof className === "function" ? className(rp) : className),
6929
+ className: (rp) => cn(styles3.panel(), typeof className === "function" ? className(rp) : className),
6723
6930
  children
6724
6931
  }
6725
6932
  );
@@ -6743,7 +6950,7 @@ function Textarea({
6743
6950
  className,
6744
6951
  ...props
6745
6952
  }) {
6746
- const styles2 = fieldControlStyles({ size, appearance });
6953
+ const styles3 = fieldControlStyles({ size, appearance });
6747
6954
  return /* @__PURE__ */ jsxs(
6748
6955
  TextField,
6749
6956
  {
@@ -6763,8 +6970,8 @@ function Textarea({
6763
6970
  className: cn(
6764
6971
  // Same hairline chrome as Input, but allow vertical resize and set a
6765
6972
  // sensible minimum height so short content doesn't collapse.
6766
- styles2.box(),
6767
- styles2.content(),
6973
+ styles3.box(),
6974
+ styles3.content(),
6768
6975
  "min-h-[100px] resize-y",
6769
6976
  textareaClassName
6770
6977
  )
@@ -6785,7 +6992,7 @@ function TimeField({
6785
6992
  className,
6786
6993
  ...props
6787
6994
  }) {
6788
- const styles2 = fieldControlStyles({ size, appearance });
6995
+ const styles3 = fieldControlStyles({ size, appearance });
6789
6996
  const focusWithin = appearance === "cell" ? "focus-within:border-accent focus-within:shadow-none" : "focus-within:border-accent focus-within:shadow-[var(--shadow-focus)]";
6790
6997
  return /* @__PURE__ */ jsxs(
6791
6998
  TimeField$1,
@@ -6801,8 +7008,8 @@ function TimeField({
6801
7008
  DateInput,
6802
7009
  {
6803
7010
  className: cn(
6804
- styles2.box(),
6805
- styles2.content(),
7011
+ styles3.box(),
7012
+ styles3.content(),
6806
7013
  "flex items-center min-w-0 text-ink",
6807
7014
  // Tabular alignment for time segments — overrides content's
6808
7015
  // font-sans on purpose.
@@ -6857,6 +7064,6 @@ function Tooltip({ className, offset = 6, ...props }) {
6857
7064
  );
6858
7065
  }
6859
7066
 
6860
- export { ATTRIBUTE_TYPES, ATTRIBUTE_TYPE_ICONS, AttachmentChip, AttributePicker, AttributeType, AttributeTypeIcon, Avatar, AvatarGroup, Badge, BadgeMultiSelect, BooleanCell, Breadcrumbs, COLUMN_DRAG_KIND, Card, CardBody, CardContent, CardEyebrow, CardFeatureTitle, CardFooter, CardHeader, CardTitle, Checkbox, CheckboxGroup, ChipValue, Combobox, Command, CommandHint, CurrencyInput, DataTable, DataTableEmpty, DataTableError, DataTableSkeleton, DateCell, DatePicker, DateTimeCell, DateTimePicker, DraftMessageComposer, EmptyState, ErrorAnimation, FieldCaret, FileField, FileViewer, FileViewerFallbackCard, FilterRow, FilterValueInput, ImageAttachment, ImageLightbox, Input, Kbd, LinkCell, MAX_COMPOSER_ATTACHMENT_BYTES, Menu, MenuItem, MenuPopover, MenuTrigger, MessageComposer, Modal, ModalBody, ModalContent, ModalDescription, ModalFooter, ModalHeader, ModalTitle, MultiSelect, NavGroup, NavItem, NavSection, OPERATORS, OperatorPicker, PROTECTED_COMBOS, Popover, PopoverContent, PopoverPanelBody, PopoverPanelFooter, PopoverPanelHeader, PressableCard, ProgressBar, Radio, RadioGroup, RecipientSelect, RecordFilterBuilderPanel, RecordFilterButton, RecordFilterChips, RecordFilterEditor, RenderChipItemProvider, RenderValueInputProvider, SegmentedControl, Select, Separator, SubmenuTrigger, SuccessAnimation, Switch, Table, TableBody, TableCell, TableHeader, TableHeaderCell, TableHeaderSpacer, TableRow, TableScroller, Tabs, TagInput, Textarea, TimeField, Tooltip, TooltipTrigger, TruncateCell, __resetDraftMessageActions, __resetDraftMessageOutcomes, addLeaf as addFilterLeaf, addPendingLeaf, addSubgroup, arityOf, attachmentChipStyles, avatarGroupStyles, avatarStyles, badgeStyles, cardStyles2 as cardStyles, countLeaves, createDraftMessageClient, defaultValueFor, draftMessageComposerStyles, emptyStateStyles, fieldControlStyles, fieldErrorStyles, fieldHintStyles, fieldLabelStyles, fileViewerFallbackCardStyles, fileViewerStyles, formatFileSize, formatValue, iconForContentType, imageAttachmentStyles, imageLightboxStyles, isColumnDragData, isEditableTarget, isPreviewableImageName, makeActionsColumn, messageComposerStyles, navItemStyles, operatorById, operatorsForType, parseCombo, progressBarStyles, publishDraftMessageOutcome, rebaseRowOnFieldChange, rebaseRowOnOperatorChange, registerDraftMessageActions, removeLeaf, removeSubgroup, replaceLeaf, segmentedControlStyles, setJoiner, subscribeDraftMessageOutcome, tableCellStyles, tableHeaderCellStyles, tabsStyles, updateLeaf, updateSubgroup, useAttributeTypeIcon, useCommand, useDiscoveryActive, useDraftMessageActions, useDraftMessageOutcome, useEscapeKey, useInfiniteScrollSentinel, useRenderChipItem, useRenderValueInput, useShowDetails, viewerKindForContentType, wrapLeafInGroup };
7067
+ export { ATTRIBUTE_TYPES, ATTRIBUTE_TYPE_ICONS, AttachmentChip, AttributePicker, AttributeType, AttributeTypeIcon, Avatar, AvatarGroup, Badge, BadgeMultiSelect, BooleanCell, Breadcrumbs, COLUMN_DRAG_KIND, Card, CardBody, CardContent, CardEyebrow, CardFeatureTitle, CardFooter, CardHeader, CardTitle, ChannelIcon, Checkbox, CheckboxGroup, ChipValue, Combobox, Command, CommandHint, CurrencyInput, DRAFT_OUTCOME_LABEL, DataTable, DataTableEmpty, DataTableError, DataTableSkeleton, DateCell, DatePicker, DateTimeCell, DateTimePicker, DraftMessageCard, DraftMessageComposer, DraftMessageReview, EmptyState, ErrorAnimation, FieldCaret, FileField, FileViewer, FileViewerFallbackCard, FilterRow, FilterValueInput, ImageAttachment, ImageLightbox, Input, Kbd, LinkCell, MAX_COMPOSER_ATTACHMENT_BYTES, Menu, MenuItem, MenuPopover, MenuTrigger, MessageComposer, Modal, ModalBody, ModalContent, ModalDescription, ModalFooter, ModalHeader, ModalTitle, MultiSelect, NavGroup, NavItem, NavSection, OPERATORS, OperatorPicker, PROTECTED_COMBOS, Popover, PopoverContent, PopoverPanelBody, PopoverPanelFooter, PopoverPanelHeader, PressableCard, ProgressBar, Radio, RadioGroup, RecipientSelect, RecordFilterBuilderPanel, RecordFilterButton, RecordFilterChips, RecordFilterEditor, RenderChipItemProvider, RenderValueInputProvider, SegmentedControl, Select, Separator, SubmenuTrigger, SuccessAnimation, Switch, Table, TableBody, TableCell, TableHeader, TableHeaderCell, TableHeaderSpacer, TableRow, TableScroller, Tabs, TagInput, Textarea, TimeField, Tooltip, TooltipTrigger, TruncateCell, __resetDraftMessageActions, __resetDraftMessageOutcomes, addLeaf as addFilterLeaf, addPendingLeaf, addSubgroup, arityOf, attachmentChipStyles, avatarGroupStyles, avatarStyles, badgeStyles, cardStyles2 as cardStyles, channelIcon, countLeaves, createDraftMessageClient, defaultValueFor, draftMessageCardStyles, draftMessageComposerStyles, draftOutcomeFor, emptyStateStyles, fieldControlStyles, fieldErrorStyles, fieldHintStyles, fieldLabelStyles, fileViewerFallbackCardStyles, fileViewerStyles, formatFileSize, formatValue, iconForContentType, imageAttachmentStyles, imageLightboxStyles, isColumnDragData, isDraftReviewOutcome, isEditableTarget, isPreviewableImageName, makeActionsColumn, messageComposerStyles, navItemStyles, operatorById, operatorsForType, parseCombo, progressBarStyles, publishDraftMessageOutcome, rebaseRowOnFieldChange, rebaseRowOnOperatorChange, registerDraftMessageActions, removeLeaf, removeSubgroup, replaceLeaf, segmentedControlStyles, setJoiner, subscribeDraftMessageOutcome, tableCellStyles, tableHeaderCellStyles, tabsStyles, terminalKindFor, updateLeaf, updateSubgroup, useAttributeTypeIcon, useCommand, useDiscoveryActive, useDraftMessageActions, useDraftMessageOutcome, useEscapeKey, useInfiniteScrollSentinel, useRenderChipItem, useRenderValueInput, useShowDetails, viewerKindForContentType, wrapLeafInGroup };
6861
7068
  //# sourceMappingURL=index.js.map
6862
7069
  //# sourceMappingURL=index.js.map