@factorialco/f0-react 4.70.2 → 4.72.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.
@@ -821,6 +821,10 @@ blurArea?: "l" | "r" | "lr";
821
821
 
822
822
  export declare const AreaChartWidget: ForwardRefExoticComponent<Omit<AreaChartWidgetProps & RefAttributes<HTMLDivElement>, "ref"> & RefAttributes<HTMLElement | SVGElement>>;
823
823
 
824
+ export declare type AttendeesDisplay = (typeof attendeesDisplays)[number];
825
+
826
+ export declare const attendeesDisplays: readonly ["auto", "avatars", "count"];
827
+
824
828
  /**
825
829
  * Upper bound for the resolved page size, so a very tall container never
826
830
  * fetches an unreasonably large page.
@@ -3326,6 +3330,40 @@ declare const defaultTranslations: {
3326
3330
  readonly language: "Language";
3327
3331
  readonly audio: "Audio";
3328
3332
  };
3333
+ readonly meetingCard: {
3334
+ readonly today: "Today";
3335
+ readonly yesterday: "Yesterday";
3336
+ readonly tomorrow: "Tomorrow";
3337
+ readonly inProgress: "In progress";
3338
+ readonly inProgressTitle: "Call in progress";
3339
+ readonly summarizing: "Summarizing";
3340
+ readonly finished: "Finished";
3341
+ readonly cancelled: "Cancelled";
3342
+ readonly startingNow: "Starting now";
3343
+ readonly startsIn: {
3344
+ readonly one: "In {{count}} min";
3345
+ readonly other: "In {{count}} mins";
3346
+ };
3347
+ readonly startedAgo: {
3348
+ readonly one: "{{count}} min ago";
3349
+ readonly other: "{{count}} mins ago";
3350
+ };
3351
+ readonly invited: {
3352
+ readonly one: "{{count}} guest";
3353
+ readonly other: "{{count}} guests";
3354
+ };
3355
+ readonly inside: {
3356
+ readonly one: "{{count}} inside";
3357
+ readonly other: "{{count}} inside";
3358
+ };
3359
+ readonly duration: {
3360
+ readonly one: "{{count}} min";
3361
+ readonly other: "{{count}} mins";
3362
+ };
3363
+ readonly attendees: "Attendees";
3364
+ readonly join: "Join";
3365
+ readonly summary: "Summary";
3366
+ };
3329
3367
  readonly actions: {
3330
3368
  readonly add: "Add";
3331
3369
  readonly edit: "Edit";
@@ -5998,6 +6036,77 @@ declare type F0LinkProps = Omit<ActionLinkProps, "variant" | "href"> & {
5998
6036
  href?: string;
5999
6037
  };
6000
6038
 
6039
+ /**
6040
+ * @experimental This is an experimental component, use it at your own risk.
6041
+ */
6042
+ export declare const F0MeetingCard: WithDataTestIdReturnType_2<ForwardRefExoticComponent<F0MeetingCardProps & RefAttributes<HTMLDivElement>> & {
6043
+ Skeleton: ({ compact }: {
6044
+ compact?: boolean;
6045
+ }) => JSX_2.Element;
6046
+ }>;
6047
+
6048
+ export declare interface F0MeetingCardProps extends WithDataTestIdProps, DataAttributes_2 {
6049
+ /** Lifecycle of the meeting. See {@link meetingStates}. */
6050
+ state: MeetingState;
6051
+ /**
6052
+ * The meeting title. When omitted, an in-progress meeting falls back to the
6053
+ * "Call in progress" headline so the row still says what it is.
6054
+ */
6055
+ title?: string;
6056
+ /**
6057
+ * Dense layout for embedding the card inline or in a tight list: the headline
6058
+ * and the relative time sit on one line (wrapping when they don't fit),
6059
+ * attendees shrink to `xs`, and the footer band is dropped so the state travels
6060
+ * with the headline. The join button keeps the same emphasis as in the regular
6061
+ * layout.
6062
+ * @default false
6063
+ */
6064
+ compact?: boolean;
6065
+ /** When the meeting starts. Drives the date line, the countdown and the join window. */
6066
+ startsAt: Date;
6067
+ /** When the meeting ends. Only used for the duration label. */
6068
+ endsAt?: Date;
6069
+ /**
6070
+ * Reference instant for every time-derived label. Defaults to the current time
6071
+ * at render — the card never ticks on its own, so pass a fixed value to keep
6072
+ * stories and tests deterministic, and re-render to refresh.
6073
+ */
6074
+ now?: Date;
6075
+ /**
6076
+ * Known attendees, internal and external. May be a subset of the real
6077
+ * invitation list — pass `invitedCount` for the true total.
6078
+ */
6079
+ attendees?: MeetingAttendee[];
6080
+ /** Total number of invited people, when `attendees` is a truncated list. */
6081
+ invitedCount?: number;
6082
+ /** How many attendees are currently in the meeting. Only used while in progress. */
6083
+ presentCount?: number;
6084
+ /**
6085
+ * Whether attendees render as stacked avatars or as a plain count.
6086
+ * `"auto"` shows avatars while the meeting is in progress (who is in the room
6087
+ * matters) and a count otherwise (how many were invited matters).
6088
+ * @default "auto"
6089
+ */
6090
+ attendeesDisplay?: AttendeesDisplay;
6091
+ /**
6092
+ * How many avatars to show before collapsing the rest into a `+N` counter.
6093
+ * @default 3
6094
+ */
6095
+ maxAvatars?: number;
6096
+ /**
6097
+ * Short recap of the meeting. Rendered in full, and only once the meeting is
6098
+ * `finished`.
6099
+ */
6100
+ summary?: string;
6101
+ /** Join affordance. Only rendered while the meeting is scheduled or in progress. */
6102
+ join?: MeetingJoin;
6103
+ /**
6104
+ * Extra footer buttons — e.g. a "Transcript" action whose destination the
6105
+ * consumer owns.
6106
+ */
6107
+ secondaryActions?: CardSecondaryAction[];
6108
+ }
6109
+
6001
6110
  declare type F0Message = {
6002
6111
  id: string;
6003
6112
  role: "user" | "assistant" | "system" | "tool";
@@ -7742,6 +7851,54 @@ declare interface LocalizedOption<T> {
7742
7851
 
7743
7852
  export declare const MAX_EXPANDED_ACTIONS = 2;
7744
7853
 
7854
+ /**
7855
+ * A meeting participant. Internal attendees are employees, so they carry a
7856
+ * first/last name and an optional picture. External attendees are identified by
7857
+ * whatever the invitation exposed — a display name, an email, or both — and
7858
+ * always render as initials.
7859
+ */
7860
+ export declare type MeetingAttendee = {
7861
+ type: "internal";
7862
+ firstName: string;
7863
+ lastName: string;
7864
+ src?: string;
7865
+ email?: string;
7866
+ } | {
7867
+ type: "external";
7868
+ name?: string;
7869
+ email?: string;
7870
+ };
7871
+
7872
+ export declare interface MeetingJoin {
7873
+ /** Called when the Join button is pressed. */
7874
+ onJoin?: () => void;
7875
+ /** Navigates to the meeting room instead of handling the click. */
7876
+ href?: string;
7877
+ /**
7878
+ * How many minutes before `startsAt` the meeting can be joined.
7879
+ * @default 10
7880
+ */
7881
+ windowMinutes?: number;
7882
+ /**
7883
+ * Forces the button into its disabled state regardless of the join window —
7884
+ * e.g. while the room is still being provisioned.
7885
+ */
7886
+ disabled?: boolean;
7887
+ /** Overrides the default "Join" label. */
7888
+ label?: string;
7889
+ }
7890
+
7891
+ export declare type MeetingState = (typeof meetingStates)[number];
7892
+
7893
+ /**
7894
+ * Lifecycle of the meeting. It is always **controlled** — only the backend knows
7895
+ * whether a meeting really started, ended or is still being summarised, so the
7896
+ * card never infers it from the clock. Time-derived presentation (the countdown,
7897
+ * the elapsed label, whether Join is actionable) is computed from `startsAt` and
7898
+ * `now`.
7899
+ */
7900
+ export declare const meetingStates: readonly ["scheduled", "inProgress", "summarizing", "finished", "cancelled"];
7901
+
7745
7902
  export declare type MentionedUser = {
7746
7903
  id: string | number;
7747
7904
  label: string;