@proteos/ui 0.42.2 → 0.42.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/dist/index.cjs +373 -157
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +152 -2
- package/dist/index.d.ts +152 -2
- package/dist/index.js +366 -159
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
- package/src/components/channel-icon/channel-icon.stories.tsx +44 -0
- package/src/components/channel-icon/channel-icon.test.tsx +26 -0
- package/src/components/channel-icon/channel-icon.tsx +67 -0
- package/src/components/channel-icon/index.ts +2 -0
- package/src/components/draft-message-card/draft-message-card.stories.tsx +94 -0
- package/src/components/draft-message-card/draft-message-card.test.tsx +43 -0
- package/src/components/draft-message-card/draft-message-card.tsx +111 -0
- package/src/components/draft-message-card/draft-message-review.test.tsx +170 -0
- package/src/components/draft-message-card/draft-message-review.tsx +197 -0
- package/src/components/draft-message-card/index.ts +7 -0
- package/src/components/draft-message-composer/draft-message-composer.tsx +1 -17
- package/src/components/draft-message-composer/draft-status.ts +49 -0
- package/src/components/draft-message-composer/index.ts +7 -0
- package/src/index.ts +2 -0
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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(
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
3202
|
-
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
3864
|
-
/* @__PURE__ */ jsxs("div", { className:
|
|
3865
|
-
/* @__PURE__ */ jsx("span", { className:
|
|
3866
|
-
/* @__PURE__ */ jsxs("span", { className:
|
|
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:
|
|
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:
|
|
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
|
|
3969
|
-
return /* @__PURE__ */ jsxs("div", { className: cn(
|
|
3970
|
-
icon ? /* @__PURE__ */ jsx("div", { className:
|
|
3971
|
-
/* @__PURE__ */ jsx("div", { className:
|
|
3972
|
-
description ? /* @__PURE__ */ jsx("div", { className:
|
|
3973
|
-
action ? /* @__PURE__ */ jsx("div", { className:
|
|
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
|
|
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(
|
|
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
|
|
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(
|
|
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:
|
|
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
|
|
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
|
-
|
|
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
|
|
6891
|
+
const styles3 = tabsStyles({ size });
|
|
6685
6892
|
return /* @__PURE__ */ jsx(
|
|
6686
6893
|
Tabs$1,
|
|
6687
6894
|
{
|
|
6688
6895
|
...props,
|
|
6689
|
-
className: (rp) => cn(
|
|
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
|
|
6902
|
+
const styles3 = tabsStyles({ size });
|
|
6696
6903
|
return /* @__PURE__ */ jsx(
|
|
6697
6904
|
TabList,
|
|
6698
6905
|
{
|
|
6699
6906
|
...props,
|
|
6700
|
-
className: (rp) => cn(
|
|
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
|
|
6913
|
+
const styles3 = tabsStyles({ size });
|
|
6707
6914
|
return /* @__PURE__ */ jsx(
|
|
6708
6915
|
Tab,
|
|
6709
6916
|
{
|
|
6710
6917
|
...props,
|
|
6711
|
-
className: (rp) => cn(
|
|
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
|
|
6924
|
+
const styles3 = tabsStyles({});
|
|
6718
6925
|
return /* @__PURE__ */ jsx(
|
|
6719
6926
|
TabPanel,
|
|
6720
6927
|
{
|
|
6721
6928
|
...props,
|
|
6722
|
-
className: (rp) => cn(
|
|
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
|
|
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
|
-
|
|
6767
|
-
|
|
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
|
|
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
|
-
|
|
6805
|
-
|
|
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
|