@factorialco/f0-react 6.16.4 → 6.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/{ChatPdfThumbnail-EVLovDW-.js → ChatPdfThumbnail-DdPRW2xr.js} +1 -1
  2. package/dist/{CoachmarkProvider-DfS7IRK9.js → CoachmarkProvider-Yo6VbRUb.js} +307 -307
  3. package/dist/{DocumentToolbar-HA9MYQbd.js → DocumentToolbar-VMnMOO8Y.js} +2 -2
  4. package/dist/{DocxViewer-CtHcR3US.js → DocxViewer-YF2qWqQu.js} +2 -2
  5. package/dist/{F0AiProcessingOverlay-D1INKpAu.js → F0AiProcessingOverlay-DGmMluEM.js} +926 -902
  6. package/dist/{F0CanvasPanel-l9XN-GPt.js → F0CanvasPanel-BJ0RZgzU.js} +20986 -20964
  7. package/dist/{F0VideoPlayer-BHSZqtHU.js → F0VideoPlayer-Dtu1LSWa.js} +1 -1
  8. package/dist/{SheetViewer-gFnyK7Mg.js → SheetViewer-BKy8FZoh.js} +2 -2
  9. package/dist/{TextViewer-LpYzKXC-.js → TextViewer-C-QQBMN0.js} +2 -2
  10. package/dist/ai.d.ts +22 -8
  11. package/dist/ai.js +2 -2
  12. package/dist/component-status.d.ts +6 -6
  13. package/dist/component-status.js +1 -1
  14. package/dist/experimental.d.ts +213 -24
  15. package/dist/experimental.js +8522 -7226
  16. package/dist/f0.d.ts +40 -9
  17. package/dist/f0.js +10 -10
  18. package/dist/i18n-provider-defaults.d.ts +15 -6
  19. package/dist/i18n-provider-defaults.js +9 -0
  20. package/dist/index-CuwoW_XN.js +4 -0
  21. package/dist/{index-ClY9V1c_.js → index-D7axIRz9.js} +3 -3
  22. package/dist/{pdfWorker-CZRWb53a.js → pdfWorker-D8KOM8K7.js} +2 -2
  23. package/dist/styles.css +1 -1
  24. package/icons/app/BellOff.d.ts +4 -0
  25. package/icons/app/BellOff.d.ts.map +1 -0
  26. package/icons/app/BellOff.js +5 -0
  27. package/icons/app/Forward.d.ts +4 -0
  28. package/icons/app/Forward.d.ts.map +1 -0
  29. package/icons/app/Forward.js +5 -0
  30. package/icons/app/Reply.js +1 -1
  31. package/icons/app/index.d.ts +2 -0
  32. package/icons/app/index.d.ts.map +1 -1
  33. package/icons/app/index.js +2 -0
  34. package/package.json +2 -2
  35. package/dist/index-Iwx3hTan.js +0 -4
@@ -172,9 +172,14 @@ declare const actionButtonVariants: readonly ["default", "outline", "critical",
172
172
 
173
173
  declare interface ActionCommonProps {
174
174
  /**
175
- * Tooltip
175
+ * Tooltip. A string is the description on its own; the object form adds a
176
+ * bold first line above it — for "which control this is" over "what it holds",
177
+ * the same two-line shape `F0Select`'s trigger tooltip uses.
176
178
  */
177
- tooltip?: string | false;
179
+ tooltip?: string | false | {
180
+ label?: string;
181
+ description: string;
182
+ };
178
183
  /**
179
184
  * The variant of the action.
180
185
  */
@@ -1389,6 +1394,8 @@ declare type ButtonDropdownItem<T = string> = {
1389
1394
  };
1390
1395
 
1391
1396
  declare type ButtonInternalProps = Pick<ActionProps, "size" | "disabled" | "className" | "pressed" | "compact" | "tooltip" | "fontSize"> & DataAttributes & {
1397
+ /** Native button behavior. */
1398
+ type?: ButtonType;
1392
1399
  /**
1393
1400
  * The aria-label of the button if not provided title or label will be used.
1394
1401
  */
@@ -2330,9 +2337,10 @@ export declare const chipVariants: (props?: ({
2330
2337
  className?: ClassValue;
2331
2338
  })) | undefined) => string;
2332
2339
 
2333
- export declare function ClockInControls({ trackedMinutes, remainingMinutes, data, labels, locationId, locations, canShowLocation, locationSelectorDisabled, onClockIn, onClockOut, onBreak, breakTypes, onChangeBreakTypeId, canShowBreakButton, canSeeGraph, canSeeRemainingTime, onChangeLocationId, canShowProject, projectSelectorElement, locationSelectorElement, breakTypeName, }: ClockInControlsProps): JSX_2.Element;
2340
+ export declare function ClockInControls({ trackedMinutes, remainingMinutes, data, labels, locationId, locations, canShowLocation, locationSelectorDisabled, onClockIn, onClockOut, onBreak, breakTypes, onChangeBreakTypeId, canShowBreakButton, canSeeGraph, canSeeRemainingTime, onChangeLocationId, canShowProject, projectSelectorElement, locationSelectorElement, projects, projectId, onChangeProjectId, projectSelectorDisabled, projectRequired, locationRequired, breakTypeName, onBreakPromote, variant, loading, }: ClockInControlsProps): JSX_2.Element;
2334
2341
 
2335
- export declare interface ClockInControlsProps {
2342
+ /** Everything both variants take, on the same terms. */
2343
+ declare interface ClockInControlsBaseProps {
2336
2344
  /** Optional remaining time in minutes */
2337
2345
  remainingMinutes?: number;
2338
2346
  /** Clock in entries data */
@@ -2354,14 +2362,26 @@ export declare interface ClockInControlsProps {
2354
2362
  selectProject: string;
2355
2363
  paid: string;
2356
2364
  unpaid: string;
2365
+ /**
2366
+ * Placeholders for the pickers' search boxes (`horizontal-bar` only).
2367
+ * Optional: without them the pickers fall back to F0Select's own wording.
2368
+ */
2369
+ searchProject?: string;
2370
+ searchLocation?: string;
2357
2371
  };
2372
+ /** The selected location — a leaf, when the list nests. */
2358
2373
  locationId?: string;
2359
2374
  onChangeLocationId: Dispatch<string>;
2360
- locations: {
2361
- id: string;
2362
- name: string;
2363
- icon: IconType;
2364
- }[];
2375
+ /**
2376
+ * The locations to offer. Each may carry `sublocations`, two or three levels
2377
+ * deep (location → workplace → work area), and selection is then a leaf.
2378
+ *
2379
+ * Nesting is drawn by the `horizontal-bar` variant, which owns its picker. The
2380
+ * `default` variant's built-in select is flat and offers only the top level — it
2381
+ * has `locationSelectorElement` for a consumer's own drill-in instead — though
2382
+ * it still DISPLAYS a selected leaf wherever it sits in the tree.
2383
+ */
2384
+ locations: ClockInLocation[];
2365
2385
  breakTypes?: BreakType[];
2366
2386
  onChangeBreakTypeId?: Dispatch<string>;
2367
2387
  canShowLocation?: boolean;
@@ -2376,7 +2396,36 @@ export declare interface ClockInControlsProps {
2376
2396
  /** Callback when Break button is clicked */
2377
2397
  onBreak?: (breakTypeId?: string) => void;
2378
2398
  canShowProject?: boolean;
2379
- projectSelectorElement?: React.ReactNode;
2399
+ breakTypeName?: string;
2400
+ /**
2401
+ * On a break, which action gets the primary button — the other becomes an
2402
+ * icon-only outline beside it.
2403
+ *
2404
+ * Unset, it follows the day: `"clock-out"` once you're into overtime (the hours
2405
+ * are done, so ending them is the useful move), `"resume"` while there are hours
2406
+ * left. Set it to pin one regardless.
2407
+ */
2408
+ onBreakPromote?: "resume" | "clock-out";
2409
+ /**
2410
+ * Draws a placeholder shaped like the chosen `variant` instead of the
2411
+ * controls — for when the day itself hasn't arrived yet. Prefer it over
2412
+ * rendering a zeroed-out day: `trackedMinutes={0}` with no `data` is a real
2413
+ * state ("clocked out, nothing tracked"), not a missing one.
2414
+ */
2415
+ loading?: boolean;
2416
+ }
2417
+
2418
+ /**
2419
+ * The `default` variant, where the consumer may bring its OWN location and
2420
+ * project controls as nodes: this is the arrangement Factorial already ships,
2421
+ * and both slots are in use (e.g. a drill-in location selector).
2422
+ */
2423
+ declare interface ClockInControlsDefaultProps extends ClockInControlsBaseProps {
2424
+ /**
2425
+ * The status and its controls beside the circular `ClockInGraph`, with the
2426
+ * location/project row underneath.
2427
+ */
2428
+ variant?: "default";
2380
2429
  /**
2381
2430
  * Optional custom location control. When provided, it replaces the built-in
2382
2431
  * flat location `F0Select` (in both the editable clocked-out state and the
@@ -2385,19 +2434,130 @@ export declare interface ClockInControlsProps {
2385
2434
  * owns its data and editable/disabled state, mirroring `projectSelectorElement`.
2386
2435
  */
2387
2436
  locationSelectorElement?: React.ReactNode;
2388
- breakTypeName?: string;
2437
+ projectSelectorElement?: React.ReactNode;
2438
+ projects?: never;
2439
+ projectId?: never;
2440
+ onChangeProjectId?: never;
2441
+ projectSelectorDisabled?: never;
2442
+ /** Only the `horizontal-bar` variant owns the pickers, so only it can relax them. */
2443
+ projectRequired?: never;
2444
+ locationRequired?: never;
2445
+ }
2446
+
2447
+ /**
2448
+ * The `horizontal-bar` variant, which owns BOTH selectors.
2449
+ *
2450
+ * The custom-render slots are typed away here (`never`) on purpose: this
2451
+ * arrangement puts the two pickers on one line with the day's controls, and a
2452
+ * consumer-supplied node in either slot is what would break that line — so it
2453
+ * takes DATA instead and renders the pickers itself. Location becomes an
2454
+ * `F0ButtonDropdown`, projects an `F0Select` whose groups are the subprojects.
2455
+ */
2456
+ declare interface ClockInControlsHorizontalBarProps extends ClockInControlsBaseProps {
2457
+ /**
2458
+ * The Home-widget shape from the custom-home prototype: four full-width rows,
2459
+ * each pinning its two halves to the tile's ends — status + running total on
2460
+ * one line, the day as a horizontal bar, when it started and what is left of
2461
+ * it, then the location and the controls. Fits a narrow rail, where the 160px
2462
+ * ring does not.
2463
+ */
2464
+ variant: "horizontal-bar";
2465
+ /** Not available in this variant — pass `locations` and let it render them. */
2466
+ locationSelectorElement?: never;
2467
+ /** Not available in this variant — pass `projects` and let it render them. */
2468
+ projectSelectorElement?: never;
2469
+ /** The projects to offer, each optionally with its own subprojects. */
2470
+ projects?: ClockInProject[];
2471
+ /** The selected project — or subproject, since selection is always a leaf. */
2472
+ projectId?: string;
2473
+ onChangeProjectId?: Dispatch<string>;
2474
+ projectSelectorDisabled?: boolean;
2475
+ /**
2476
+ * Whether a project must be chosen to clock in. When it isn't, the picker
2477
+ * offers a clear affordance and reports the empty string once cleared.
2478
+ * Defaults to `true` — the stricter reading, and the behaviour before there
2479
+ * was any way to clear.
2480
+ */
2481
+ projectRequired?: boolean;
2482
+ /** The same for the location. Defaults to `true`. */
2483
+ locationRequired?: boolean;
2389
2484
  }
2390
2485
 
2486
+ export declare type ClockInControlsProps = ClockInControlsDefaultProps | ClockInControlsHorizontalBarProps;
2487
+
2488
+ /**
2489
+ * How the pieces are laid out. Both variants show the same day, run the same
2490
+ * state machine and use the same controls — only their arrangement differs.
2491
+ */
2492
+ export declare type ClockInControlsVariant = "default" | "horizontal-bar";
2493
+
2391
2494
  declare interface ClockInGraphProps {
2392
2495
  trackedMinutes?: number;
2393
2496
  data?: {
2394
2497
  from: Date;
2395
2498
  to: Date;
2396
2499
  variant: ClockInStatus;
2500
+ /**
2501
+ * EXTRA context for this stretch of the day, beyond its state — which break,
2502
+ * which task.
2503
+ *
2504
+ * The `horizontal-bar` geometry already tells you when a stretch ran and how
2505
+ * long it lasted when you hover it; this is appended after a `•`, so pass only
2506
+ * what that doesn't already say. The ring has nowhere to put either and
2507
+ * ignores them.
2508
+ */
2509
+ label?: string;
2397
2510
  }[];
2398
2511
  remainingMinutes?: number;
2512
+ /**
2513
+ * - `ring` — the 160px dial, with the running total and the day's two ends
2514
+ * inside it.
2515
+ * - `horizontal-bar` — the same day as a full-width 6px rail, and nothing
2516
+ * else: a line that thin has nowhere to put the numbers, so in this variant
2517
+ * the layout around it carries them (see `ClockInControls`).
2518
+ */
2519
+ variant?: ClockInGraphVariant;
2399
2520
  }
2400
2521
 
2522
+ /**
2523
+ * The geometry the day is drawn in. Same segments, same colours, same
2524
+ * `normalizeData` either way — only the shape differs.
2525
+ */
2526
+ declare type ClockInGraphVariant = "ring" | "horizontal-bar";
2527
+
2528
+ /**
2529
+ * A place you can clock in from, and — optionally — the places INSIDE it.
2530
+ *
2531
+ * Up to two or three levels is what this is for: location → workplace → work
2532
+ * area (Office → Barcelona → Llucuna A-3). Selection is always a LEAF: a location
2533
+ * with `sublocations` is clocked into through one of them, one without is clocked
2534
+ * into directly. The icon is usually only worth setting at the top (Office, Home,
2535
+ * Business trip) — deeper levels inherit the nearest one above them.
2536
+ */
2537
+ export declare type ClockInLocation = {
2538
+ id: string;
2539
+ name: string;
2540
+ icon?: IconType;
2541
+ /** The level below. When present, this location itself is not selectable. */
2542
+ sublocations?: ClockInLocation[];
2543
+ };
2544
+
2545
+ /**
2546
+ * A project as the `horizontal-bar` variant takes it, and — optionally — the work
2547
+ * inside it.
2548
+ *
2549
+ * Selection is always a LEAF: a project with `subprojects` is booked through one
2550
+ * of them, a project without them is booked directly. That rule is what lets the
2551
+ * picker show the hierarchy with F0Select's own group headings rather than an
2552
+ * invented indent — a parent is a heading, not an option.
2553
+ */
2554
+ export declare type ClockInProject = {
2555
+ id: string;
2556
+ name: string;
2557
+ /** The level below. When present, the parent itself is not selectable. */
2558
+ subprojects?: ClockInProject[];
2559
+ };
2560
+
2401
2561
  declare type ClockInStatus = "clocked-in" | "break" | "clocked-out";
2402
2562
 
2403
2563
  /**
@@ -4152,6 +4312,7 @@ declare const defaultTranslations: {
4152
4312
  readonly closeSearch: "Close search";
4153
4313
  readonly noResults: "No chats found";
4154
4314
  readonly backToLatest: "Jump to latest";
4315
+ readonly online: "Online";
4155
4316
  readonly muted: "Muted";
4156
4317
  readonly mute: "Mute";
4157
4318
  readonly unmute: "Unmute";
@@ -4254,6 +4415,14 @@ declare const defaultTranslations: {
4254
4415
  readonly one: "{{count}} unread";
4255
4416
  readonly other: "{{count}} unread";
4256
4417
  };
4418
+ readonly unreadChatsAbove: {
4419
+ readonly one: "{{count}} unread chat above";
4420
+ readonly other: "{{count}} unread chats above";
4421
+ };
4422
+ readonly unreadChatsBelow: {
4423
+ readonly one: "{{count}} unread chat below";
4424
+ readonly other: "{{count}} unread chats below";
4425
+ };
4257
4426
  readonly emptyConversation: "No messages yet";
4258
4427
  readonly emptyConversationDescription: "Send a message to start the conversation.";
4259
4428
  readonly error: "Couldn't load this conversation";
@@ -5619,7 +5788,6 @@ export declare type F0ChatChannel = {
5619
5788
  avatar: AvatarVariant;
5620
5789
  /** DM only — the other person's presence. */
5621
5790
  presence?: "online" | "offline";
5622
- muted?: boolean;
5623
5791
  /**
5624
5792
  * Whether the conversation is pinned (favourited) by the current user. Drives
5625
5793
  * the header pin toggle and lets the host surface a "Pinned" group in the
@@ -6060,8 +6228,8 @@ export declare type F0ChatRuntime = {
6060
6228
  /**
6061
6229
  * Toggle the conversation's muted state for the current user. Transport
6062
6230
  * capability only — the header no longer auto-renders a Mute action; the
6063
- * host surfaces one via {@link F0ChatHeaderAction} (the header still shows
6064
- * the `channel.muted` status icon either way). factorial →
6231
+ * host surfaces one via {@link F0ChatHeaderAction}. The current muted state
6232
+ * is represented like any other entry in `channel.statuses`. factorial →
6065
6233
  * `channel.mute()` / `channel.unmute()`.
6066
6234
  */
6067
6235
  toggleMute?: () => void | Promise<void>;
@@ -6086,6 +6254,10 @@ export declare type F0ChatSearchResult = {
6086
6254
  id: string;
6087
6255
  };
6088
6256
 
6257
+ export declare type F0ChatSenderColor = (typeof f0ChatSenderColors)[number];
6258
+
6259
+ export declare const f0ChatSenderColors: readonly ["viridian", "malibu", "yellow", "purple", "lilac", "barbie", "smoke", "army", "flubber", "indigo", "camel", "radical", "orange", "red", "grass"];
6260
+
6089
6261
  export declare type F0ChatSendInput = {
6090
6262
  body: string;
6091
6263
  attachments?: F0ChatAttachment[];
@@ -6159,6 +6331,12 @@ export declare type F0ChatUser = {
6159
6331
  id: string;
6160
6332
  name: string;
6161
6333
  avatar?: AvatarVariant;
6334
+ /**
6335
+ * Stable sender accent. For photo avatars, choose the palette hue closest to
6336
+ * the image's dominant colour so the name and incoming bubble feel related.
6337
+ * When omitted, F0 uses the same name hash as a generated person avatar.
6338
+ */
6339
+ avatarColor?: F0ChatSenderColor;
6162
6340
  /** Secondary line for the hover card (e.g. job title). */
6163
6341
  subtitle?: string;
6164
6342
  /** Link to the person's profile, shown as "View profile" in the hover card. */
@@ -6952,6 +7130,15 @@ declare type F0SelectItemObject<T, R = unknown> = {
6952
7130
  type?: "item";
6953
7131
  value: T;
6954
7132
  label: string;
7133
+ /**
7134
+ * What the TRIGGER shows once this item is selected, when that has to differ
7135
+ * from the row's own `label`. The row is read in the context the list gives it
7136
+ * — under a group header, beside its siblings — and the trigger has none of
7137
+ * that, so a label that is clear in the list can be ambiguous on its own
7138
+ * ("Tokens", once the "Design system" header is gone). Give the trigger the
7139
+ * full path there and leave the row short. Defaults to `label`.
7140
+ */
7141
+ selectedLabel?: string;
6955
7142
  description?: string;
6956
7143
  /** Short token shown next to the label (e.g. a dial code) */
6957
7144
  metadata?: F0SelectItemMetadata;
@@ -10718,8 +10905,10 @@ export declare type SidebarChat = {
10718
10905
  /** When true, the name is replaced by a live "Writing…" label. */
10719
10906
  typing?: boolean;
10720
10907
  presence?: SidebarChatPresence;
10721
- /** Status icon shown to the right of the name. People only. */
10908
+ /** Single status icon shown to the right of the conversation name. */
10722
10909
  status?: SidebarChatStatus;
10910
+ /** Multiple status icons. Takes precedence over `status` when provided. */
10911
+ statuses?: SidebarChatStatus[];
10723
10912
  /** Epoch ms of the last activity; used for ordering. */
10724
10913
  lastActivityAt?: number;
10725
10914
  /** Whether the chat is pinned (favourited) — selects the solid pin icon. */
@@ -10858,9 +11047,9 @@ export declare type SidebarChatProviderProps = {
10858
11047
  };
10859
11048
 
10860
11049
  /**
10861
- * Status shown as a small icon avatar to the right of a person's name (people
10862
- * only). The consumer fully controls it — pass any icon with an accessible
10863
- * label. F0 does not hardcode any set of statuses.
11050
+ * Status shown as a small icon to the right of a conversation name. The
11051
+ * consumer fully controls it — pass any icon with an accessible label. F0
11052
+ * does not hardcode any set of statuses.
10864
11053
  */
10865
11054
  export declare type SidebarChatStatus = {
10866
11055
  icon: IconType;
@@ -12964,10 +13153,8 @@ declare module "@tiptap/core" {
12964
13153
 
12965
13154
  declare module "@tiptap/core" {
12966
13155
  interface Commands<ReturnType> {
12967
- indent: {
12968
- setIndent: (level: number) => ReturnType;
12969
- unsetIndent: () => ReturnType;
12970
- outdent: () => ReturnType;
13156
+ moodTracker: {
13157
+ insertMoodTracker: (data: MoodTrackerData) => ReturnType;
12971
13158
  };
12972
13159
  }
12973
13160
  }
@@ -12975,8 +13162,10 @@ declare module "@tiptap/core" {
12975
13162
 
12976
13163
  declare module "@tiptap/core" {
12977
13164
  interface Commands<ReturnType> {
12978
- moodTracker: {
12979
- insertMoodTracker: (data: MoodTrackerData) => ReturnType;
13165
+ indent: {
13166
+ setIndent: (level: number) => ReturnType;
13167
+ unsetIndent: () => ReturnType;
13168
+ outdent: () => ReturnType;
12980
13169
  };
12981
13170
  }
12982
13171
  }