@factorialco/f0-react 6.38.1 → 6.51.1

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 (27) hide show
  1. package/dist/{ChatPdfThumbnail-BylbDvdh.js → ChatPdfThumbnail-BtJNIR03.js} +1 -1
  2. package/dist/{CoachmarkProvider-DDlkiieh.js → CoachmarkProvider-D1crauDt.js} +17536 -17054
  3. package/dist/{DocumentToolbar-C73oFj5j.js → DocumentToolbar-CYIgumvP.js} +2 -2
  4. package/dist/{DocxViewer-DvhVvro8.js → DocxViewer-BYC6ILzw.js} +2 -2
  5. package/dist/{F0AiProcessingOverlay-O9iKzCzA.js → F0AiProcessingOverlay-B_jVVBb3.js} +1675 -1687
  6. package/dist/{F0CanvasPanel-x0HG1lL2.js → F0CanvasPanel-D9QM6A5c.js} +24585 -24368
  7. package/dist/{F0VideoPlayer-CNLDjvWx.js → F0VideoPlayer-Czdae49M.js} +1 -1
  8. package/dist/{LocationMap-B9uJiP6s.js → LocationMap-_ELkGzce.js} +1 -1
  9. package/dist/{SheetViewer-Cb3M0JfB.js → SheetViewer-rS-lxOWo.js} +2 -2
  10. package/dist/{TextViewer-zWnCj_Ll.js → TextViewer-D_ddwlEE.js} +2 -2
  11. package/dist/ai.d.ts +32 -8
  12. package/dist/ai.js +2 -2
  13. package/dist/component-status.d.ts +6 -6
  14. package/dist/component-status.js +4 -4
  15. package/dist/{experimental-AwqVvQnQ.js → experimental-BsGKnyna.js} +12830 -12549
  16. package/dist/experimental.d.ts +485 -35
  17. package/dist/experimental.js +210 -205
  18. package/dist/f0.d.ts +296 -32
  19. package/dist/f0.js +16453 -15755
  20. package/dist/i18n-provider-defaults.d.ts +16 -6
  21. package/dist/i18n-provider-defaults.js +11 -1
  22. package/dist/index-C3HrVTrD.js +4 -0
  23. package/dist/{index-B9tGQBrU.js → index-CBvQMzjP.js} +3 -3
  24. package/dist/{pdfWorker-Bb9OLhh-.js → pdfWorker-BpY_xYql.js} +2 -2
  25. package/dist/styles.css +1 -1
  26. package/package.json +1 -1
  27. package/dist/index-DfvLN3Ea.js +0 -4
@@ -40,6 +40,7 @@ import { DotTagCellValue as DotTagCellValue_2 } from './experimental';
40
40
  import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
41
41
  import { EmployeeItemProps } from './types';
42
42
  import { F0EmojiPickerProps as F0EmojiPickerProps_2 } from './types';
43
+ import { F0ENPSButtonProps as F0ENPSButtonProps_2 } from './types';
43
44
  import { F0PhoneInputProps as F0PhoneInputProps_2 } from './types';
44
45
  import { F0SegmentedControlProps as F0SegmentedControlProps_2 } from './types';
45
46
  import { F0SelectProps as F0SelectProps_2 } from './types';
@@ -1073,7 +1074,7 @@ declare interface BaseChipProps extends VariantProps<typeof chipVariants> {
1073
1074
 
1074
1075
  declare type BaseColor = keyof typeof baseColors;
1075
1076
 
1076
- export declare const BaseCommunityPost: ({ id, author, group, createdAt, title, description, onClick, mediaUrl, event, counters, reactions, inLabel, comment, actions, dropdownItems, noReactionsButton, descriptionExpandable, }: CommunityPostProps) => JSX_2.Element;
1077
+ export declare const BaseCommunityPost: ({ id, author, group, createdAt, title, description, onClick, mediaUrl, event, counters, reactions, inLabel, comment, actions, dropdownItems, noReactionsButton, descriptionExpandable, hideTitle, }: CommunityPostProps) => JSX_2.Element;
1077
1078
 
1078
1079
  /**
1079
1080
  * Base data adapter configuration for non-paginated collections
@@ -1539,6 +1540,20 @@ declare type ButtonSize = (typeof buttonSizes)[number];
1539
1540
 
1540
1541
  declare const buttonSizes: readonly ["sm", "md", "lg"];
1541
1542
 
1543
+ export declare type ButtonToggleColor = (typeof buttonToggleColors)[number];
1544
+
1545
+ /**
1546
+ * The colours a toggle can wear when selected, beyond F0's own selected teal.
1547
+ * Each one is an F0 semantic colour — the six statuses, then the five points of
1548
+ * the mood scale — so a coloured toggle carries the same meaning here as the
1549
+ * same colour does anywhere else in the product.
1550
+ */
1551
+ export declare const buttonToggleColors: readonly ["accent", "critical", "warning", "promote", "info", "positive", "mood-super-negative", "mood-negative", "mood-neutral", "mood-positive", "mood-super-positive"];
1552
+
1553
+ declare type ButtonToggleGroupSize = (typeof buttonToggleGroupSizes)[number];
1554
+
1555
+ declare const buttonToggleGroupSizes: readonly ["sm", "md", "lg"];
1556
+
1542
1557
  export declare type ButtonToggleSize = (typeof buttonToggleSizes)[number];
1543
1558
 
1544
1559
  export declare const buttonToggleSizes: readonly ["sm", "md", "lg"];
@@ -1961,6 +1976,9 @@ export declare interface CardSelectableMultipleProps<T extends CardSelectableVal
1961
1976
  isToggle?: boolean;
1962
1977
  /** When true, items are grouped in a single bordered container with dividers */
1963
1978
  grouped?: boolean;
1979
+ /** Standalone cards only: 12px padding instead of 16px. Grouped rows already
1980
+ * use 12px vertical padding, so they are unaffected. */
1981
+ compact?: boolean;
1964
1982
  }
1965
1983
 
1966
1984
  export declare interface CardSelectableSingleProps<T extends CardSelectableValue> {
@@ -1982,6 +2000,9 @@ export declare interface CardSelectableSingleProps<T extends CardSelectableValue
1982
2000
  isToggle?: boolean;
1983
2001
  /** When true, items are grouped in a single bordered container with dividers */
1984
2002
  grouped?: boolean;
2003
+ /** Standalone cards only: 12px padding instead of 16px. Grouped rows already
2004
+ * use 12px vertical padding, so they are unaffected. */
2005
+ compact?: boolean;
1985
2006
  }
1986
2007
 
1987
2008
  export declare type CardSelectableValue = string | number;
@@ -2002,7 +2023,7 @@ declare type CardVisualizationOptions<T, _Filters extends FiltersDefinition, _So
2002
2023
  /**
2003
2024
  * @experimental This is an experimental component use it at your own risk
2004
2025
  */
2005
- export declare const Carousel: WithDataTestIdReturnType_3<({ children, columns, showArrows, showDots, autoplay, delay, showPeek, doubleColumns, }: CarouselProps) => default_3.JSX.Element>;
2026
+ export declare const Carousel: WithDataTestIdReturnType_3<({ children, columns, showArrows, showDots, arrowsPlacement, arrowLabels, paging, autoplay, delay, showPeek, doubleColumns, }: CarouselProps) => default_3.JSX.Element>;
2006
2027
 
2007
2028
  declare interface CarouselBreakpoints {
2008
2029
  default?: ColumnNumber;
@@ -2013,10 +2034,70 @@ declare interface CarouselBreakpoints {
2013
2034
  xl?: ColumnNumber;
2014
2035
  }
2015
2036
 
2037
+ /**
2038
+ * A carousel whose slides are ONE PAGE of a longer list.
2039
+ *
2040
+ * A carousel can only reason about the slides it holds, so on its own it says
2041
+ * "there is no next one" the moment it reaches the last one it was given — which
2042
+ * is wrong when the list continues on the server. This is the missing half of
2043
+ * that answer, and it is deliberately the shape `useData` already returns for an
2044
+ * infinite-scroll source (`paginationInfo.hasMore`, `isLoadingMore`, `loadMore`),
2045
+ * so wiring one to the other is passing three fields across.
2046
+ */
2047
+ declare type CarouselPaging = {
2048
+ /** Whether the source has records past the slides currently mounted. */
2049
+ hasMore: boolean;
2050
+ /** A fetch for the next page is in flight. */
2051
+ isLoading?: boolean;
2052
+ /** Fetch the next page and APPEND it to the slides. */
2053
+ onLoadMore: () => void;
2054
+ /**
2055
+ * How many records the source holds ALTOGETHER, when it says — `useData`'s
2056
+ * `totalItems`. For anything that reports a position out loud ("3 of 11"):
2057
+ * without it the only number available is how many have been loaded, which
2058
+ * moves every time another page arrives.
2059
+ *
2060
+ * The carousel itself ignores it. Its dots describe the slides that exist, and
2061
+ * a dot for a page nobody has fetched would be a control that cannot be
2062
+ * pressed.
2063
+ */
2064
+ total?: number;
2065
+ };
2066
+
2016
2067
  declare interface CarouselProps {
2017
2068
  children: default_3.ReactNode;
2018
2069
  showArrows?: boolean;
2019
2070
  showDots?: boolean;
2071
+ /**
2072
+ * WHERE THE ARROWS GO.
2073
+ *
2074
+ * - `"overlay"` (the default) — pinned to the carousel's sides and revealed on
2075
+ * hover. Right for a full-bleed gallery, where the slides are the page.
2076
+ * - `"bottom"` — a row UNDER the slides, an arrow on each end with the dots
2077
+ * between them, always visible and always the same width. Use it whenever
2078
+ * the carousel sits inside something else — a widget, a card, a panel: side
2079
+ * overlays hang over whatever is beside the container, and a hover-only
2080
+ * control is one a touch user never finds.
2081
+ *
2082
+ * `"bottom"` puts the dots in that row, so `showDots` still decides whether
2083
+ * there are any.
2084
+ */
2085
+ arrowsPlacement?: "overlay" | "bottom";
2086
+ /** The arrows' accessible names. Defaults to "Previous" / "Next". */
2087
+ arrowLabels?: {
2088
+ previous?: string;
2089
+ next?: string;
2090
+ };
2091
+ /**
2092
+ * The slides are ONE PAGE of a longer list. Next then stays live at the end
2093
+ * and fetches the rest instead of going dead — see {@link CarouselPaging}, and
2094
+ * append the new records to `children` as they arrive.
2095
+ *
2096
+ * `arrowsPlacement: "bottom"` only: the overlay arrows are a hover affordance
2097
+ * over the slides, and a fetch you can't see you triggered is worse than no
2098
+ * fetch at all.
2099
+ */
2100
+ paging?: CarouselPaging;
2020
2101
  autoplay?: boolean;
2021
2102
  delay?: number;
2022
2103
  columns?: CarouselBreakpoints;
@@ -2859,7 +2940,7 @@ values: {
2859
2940
  }) => void) | undefined;
2860
2941
  } & RefAttributes<HTMLDivElement>, "ref"> & RefAttributes<HTMLElement | SVGElement>>>;
2861
2942
 
2862
- export declare const CommunityPost: (({ id, author, group, createdAt, title, description, onClick, mediaUrl, event, counters, reactions, inLabel, comment, actions, dropdownItems, noReactionsButton, descriptionExpandable, }: CommunityPostProps) => JSX_2.Element) & {
2943
+ export declare const CommunityPost: (({ id, author, group, createdAt, title, description, onClick, mediaUrl, event, counters, reactions, inLabel, comment, actions, dropdownItems, noReactionsButton, descriptionExpandable, hideTitle, }: CommunityPostProps) => JSX_2.Element) & {
2863
2944
  Skeleton: ({ withEvent, withImage, }: CommunityPostSkeletonProps) => JSX_2.Element;
2864
2945
  };
2865
2946
 
@@ -2898,10 +2979,30 @@ export declare type CommunityPostProps = {
2898
2979
  };
2899
2980
  actions?: CommunityPostAction[];
2900
2981
  noVideoPreload?: boolean;
2901
- onClick: (id: string) => void;
2982
+ /**
2983
+ * WHAT CLICKING THE POST DOES — and whether it does anything.
2984
+ *
2985
+ * OMIT IT once the post is the destination. In a feed the card is a way in, so
2986
+ * it takes a pointer cursor, a hover tint and a focus ring. Opened in a dialog
2987
+ * it is already what you came for, and every one of those says there is
2988
+ * somewhere further to go when there isn't: the tint follows the mouse across
2989
+ * a page you are reading, and clicking does nothing.
2990
+ */
2991
+ onClick?: (id: string) => void;
2902
2992
  noReactionsButton?: boolean;
2903
2993
  dropdownItems?: DropdownItem[];
2904
2994
  descriptionExpandable?: boolean;
2995
+ /**
2996
+ * Keeps the title as the post's ACCESSIBLE NAME but takes it out of the card —
2997
+ * for a container that already shows it, like a dialog carrying the post's
2998
+ * title in its own header. Without this the same words appear twice, an inch
2999
+ * apart.
3000
+ *
3001
+ * The title element stays in the DOM, `sr-only`: it is what the expanded
3002
+ * description points at (`aria-describedby`), so removing it would quietly
3003
+ * break that as well as the post's name.
3004
+ */
3005
+ hideTitle?: boolean;
2905
3006
  };
2906
3007
 
2907
3008
  export declare const CommunityPostSkeleton: ({ withEvent, withImage, }: CommunityPostSkeletonProps) => JSX_2.Element;
@@ -2911,6 +3012,56 @@ export declare type CommunityPostSkeletonProps = {
2911
3012
  withImage?: boolean;
2912
3013
  };
2913
3014
 
3015
+ /**
3016
+ * ONE POST as the Home card shows it — the shape a feed row keeps when it is
3017
+ * given a whole tile instead of a line.
3018
+ *
3019
+ * Deliberately NOT `CommunityPostProps`: that is the post as the Communities
3020
+ * page renders it, with its media, its reactions, its comment button and its own
3021
+ * overflow menu. Here the post is a PREVIEW you click through — anything you
3022
+ * can do to it, you do on the other side.
3023
+ */
3024
+ export declare interface CommunityPostSummary {
3025
+ id: string;
3026
+ title: string;
3027
+ /**
3028
+ * The post's body as the editor stored it (an HTML string), clamped to the
3029
+ * first few lines. Whatever links it contains are NOT clickable here: the
3030
+ * whole tile is one target (see {@link CommunityPostCard}), and a link inside
3031
+ * a link is neither valid nor operable.
3032
+ */
3033
+ description?: string;
3034
+ /**
3035
+ * The post's cover image, above the title.
3036
+ *
3037
+ * ALWAYS DRAWN AT {@link POST_IMAGE_RATIO} — the tile gives it the full width
3038
+ * of its column and takes its height from that ratio, cropping (`object-cover`)
3039
+ * whatever doesn't fit. A carousel is a ROW: a tile that sized itself to its
3040
+ * own image would put every title on a different line and move them all when
3041
+ * the page turned. So the frame is fixed and the picture fits into it.
3042
+ */
3043
+ imageUrl?: string;
3044
+ author?: {
3045
+ firstName: string;
3046
+ lastName: string;
3047
+ avatarUrl?: string;
3048
+ };
3049
+ createdAt: Date;
3050
+ /**
3051
+ * The counters under the author, ALREADY IN WORDS — "742 visits", "23
3052
+ * comments". Strings rather than numbers because the plural, the thousands
3053
+ * separator and the noun are all the app's locale, not this component's; the
3054
+ * same reason `CommunityPost` takes them this way.
3055
+ */
3056
+ counters?: {
3057
+ visits?: string;
3058
+ comments?: string;
3059
+ };
3060
+ /** Where the post lives. A `url` makes the tile a real anchor. */
3061
+ href?: string;
3062
+ onClick?: () => void;
3063
+ }
3064
+
2914
3065
  declare interface Company {
2915
3066
  id: string;
2916
3067
  name: string;
@@ -4080,6 +4231,8 @@ declare const defaultTranslations: {
4080
4231
  readonly hideAllColumns: "Hide all";
4081
4232
  readonly addColumn: "Add column";
4082
4233
  readonly removeColumn: "Remove column";
4234
+ readonly lockColumn: "Lock column: {{label}}";
4235
+ readonly unlockColumn: "Unlock column: {{label}}";
4083
4236
  };
4084
4237
  };
4085
4238
  readonly editableTable: {
@@ -4285,6 +4438,13 @@ declare const defaultTranslations: {
4285
4438
  readonly exporting: "Exporting…";
4286
4439
  };
4287
4440
  readonly dashboardItem: {
4441
+ /**
4442
+ * Deliberately not `ai.ask` ("Ask One" by default here, but hosts
4443
+ * override it — factorial renders it as plain "Ask" for the widget and
4444
+ * insight-card buttons). This menu entry needs the product name spelled
4445
+ * out, so it owns its own key.
4446
+ */
4447
+ readonly askOne: "Ask One";
4288
4448
  readonly chartType: "Chart type";
4289
4449
  readonly errorTitle: "Error loading data";
4290
4450
  readonly retry: "Retry";
@@ -4317,6 +4477,7 @@ declare const defaultTranslations: {
4317
4477
  readonly fileUploadBlockedSubmit: "Your message wasn't sent because one of the attachments failed to upload. Remove it or retry.";
4318
4478
  readonly tooManyFilesError: "You can attach up to {{maxFiles}} files at once";
4319
4479
  readonly dropFilesHere: "Drop your files here";
4480
+ readonly dropWidgetToDiscuss: "Drop here to discuss with One";
4320
4481
  readonly reply: "Reply";
4321
4482
  readonly removeQuote: "Remove quote";
4322
4483
  readonly clarifyingQuestion: {
@@ -5073,6 +5234,18 @@ declare type EditableTableColumnDefinition<R extends RecordType, Sortings extend
5073
5234
  * opens the calendar on that date.
5074
5235
  */
5075
5236
  dateConfig?: DateCellConfig | ((item: R) => DateCellConfig);
5237
+ /**
5238
+ * Configuration for `"disabled"` cells.
5239
+ *
5240
+ * By default a disabled cell keeps the same affordances as its editable
5241
+ * counterpart (leading icon, units, select chevron) so the column still
5242
+ * reads as its field type. Set `hideSelectChevron` when the column also
5243
+ * uses `editType: "select"` for other rows but the chevron shouldn't
5244
+ * appear here since the cell isn't interactive.
5245
+ */
5246
+ disabledConfig?: {
5247
+ hideSelectChevron?: boolean;
5248
+ };
5076
5249
  /**
5077
5250
  * Called after this cell's value changes. Use to compute derived values
5078
5251
  * and update other cells in the same row.
@@ -5732,6 +5905,37 @@ declare type F0ButtonToggleInternalProps = {
5732
5905
  * "expanded" - The button will show the icon and the label.
5733
5906
  */
5734
5907
  variant?: ButtonToggleVariant;
5908
+ /**
5909
+ * Tooltip shown on hover and on keyboard focus. A string is the description
5910
+ * on its own; the object form adds a bold first line above it — the same
5911
+ * shape `Action` takes.
5912
+ *
5913
+ * A compact toggle is a glyph with no visible text, so the tooltip is what
5914
+ * says out loud what it does. Setting it drops the native `title` (the
5915
+ * browser would otherwise draw its own bubble beside this one) and keeps the
5916
+ * accessible name.
5917
+ *
5918
+ * `instant` opens it on 100ms instead of the default 700ms. Reach for it when
5919
+ * the tooltip is the ONLY place the toggle's name is written — the default
5920
+ * wait is for a label that merely confirms what you can already read, and on
5921
+ * a bare glyph it withholds the whole thing.
5922
+ */
5923
+ tooltip?: string | {
5924
+ label?: string;
5925
+ description: string;
5926
+ instant?: boolean;
5927
+ };
5928
+ /**
5929
+ * Makes the toggle a member of a COLOURED SET: it wears this colour when
5930
+ * selected — fill, border and glyph — and stays a muted glyph when it isn't,
5931
+ * so one answer out of several is readable at a glance. Without it the toggle
5932
+ * uses F0's selected teal, like any other selected control.
5933
+ *
5934
+ * Only for a set whose members mean different things (a mood scale, a status
5935
+ * picker). A lone toggle, or a group where every item is the same kind of
5936
+ * thing, should stay on the default.
5937
+ */
5938
+ color?: ButtonToggleColor;
5735
5939
  /**
5736
5940
  * @private
5737
5941
  * Whether to show a border around the button toggle.
@@ -6479,6 +6683,72 @@ export declare type F0ChatVoiceAttachment = {
6479
6683
  name?: string;
6480
6684
  };
6481
6685
 
6686
+ /**
6687
+ * F0CommunityPostsCarousel — the Communities widget's content: the latest posts as
6688
+ * TILES you page through, two at a time on a main-column card and one in
6689
+ * anything narrower.
6690
+ *
6691
+ * A WIDE-COLUMN WIDGET. Two tiles side by side is the whole reason this exists
6692
+ * rather than a `list` slot — a post needs a title, four lines of its body and
6693
+ * its author to be worth previewing at all, and that does not fit a 396px rail.
6694
+ * Put it in the main column (`areas: ["main"]` in the catalog).
6695
+ *
6696
+ * THE PAGING IS UNDER THE TILES, not floating over them — `CarouselControls`,
6697
+ * the shared row: an arrow on each end, the dots between, its own `pt-4` above
6698
+ * it. Nothing about that row is this widget's, which is why it lives in
6699
+ * `ui/carousel` beside the overlay arrows rather than here.
6700
+ *
6701
+ * EVERY POST IT HOLDS IS IN THE DOM. Embla lays its slides out in a flex row and
6702
+ * transforms the track, so the slides off-screen are mounted and measured like
6703
+ * the ones you can see — there is no windowing here, and adding it would mean
6704
+ * the carousel could no longer measure its own snaps. That is the right trade
6705
+ * for what this shows: a handful of tiles, each one a title and four lines.
6706
+ *
6707
+ * It is `pagination` that keeps it a handful. A feed of two hundred posts is not
6708
+ * a longer carousel, it is a carousel that holds a PAGE and asks for the next
6709
+ * one when you reach the end — so what is mounted is bounded by how far the
6710
+ * reader actually walked rather than by how much the server has.
6711
+ */
6712
+ export declare const F0CommunityPostsCarousel: ({ posts, labels, loading, expectedItemsCount, pagination, }: F0CommunityPostsCarouselProps) => JSX_2.Element;
6713
+
6714
+ export declare interface F0CommunityPostsCarouselProps {
6715
+ posts: CommunityPostSummary[];
6716
+ /**
6717
+ * The controls' words — the two arrows' accessible names. There is no visible
6718
+ * text in this component's chrome, so these are what a screen reader reads and
6719
+ * what the tooltips say.
6720
+ */
6721
+ labels: {
6722
+ previous: string;
6723
+ next: string;
6724
+ };
6725
+ /**
6726
+ * Waiting on the FIRST posts: the same carousel with placeholder tiles in it,
6727
+ * so the widget is the height it will be once they land. How MANY it draws is
6728
+ * `expectedItemsCount`.
6729
+ *
6730
+ * This is the initial load only. A LATER page is `pagination`, and it does not
6731
+ * blank the tiles you are already reading.
6732
+ */
6733
+ loading?: boolean;
6734
+ /** How many placeholder tiles `loading` draws. Defaults to 2 — one screenful. */
6735
+ expectedItemsCount?: number;
6736
+ /**
6737
+ * THE POSTS ARE A PAGE, not the whole feed. Pass this and the Next arrow stays
6738
+ * live past the last mounted tile: reaching the end asks for the next page, and
6739
+ * the new posts are appended to `posts` by whoever owns them.
6740
+ *
6741
+ * It is `useData`'s infinite-scroll return, field for field — `hasMore` off
6742
+ * `paginationInfo`, `isLoadingMore`, `loadMore` — because that is where these
6743
+ * posts come from in an app. The component itself stays ignorant of data
6744
+ * sources: it takes posts and a way to ask for more.
6745
+ *
6746
+ * Omit it for a feed you already hold in full, which is what the widget's
6747
+ * "latest five" is.
6748
+ */
6749
+ pagination?: CarouselPaging;
6750
+ }
6751
+
6482
6752
  /**
6483
6753
  * @experimental This is an experimental component, use it at your own risk.
6484
6754
  */
@@ -6526,6 +6796,69 @@ export declare type F0EmojiPickerSize = (typeof f0EmojiPickerSizes)[number];
6526
6796
 
6527
6797
  export declare const f0EmojiPickerSizes: readonly ["sm", "md", "lg"];
6528
6798
 
6799
+ /**
6800
+ * @experimental This is an experimental component use it at your own risk
6801
+ */
6802
+ export declare const F0ENPSButton: WithDataTestIdReturnType_3< {
6803
+ ({ value, onChange, labels, icons, size, fullWidth, disabled, required, }: F0ENPSButtonProps_2): JSX_2.Element;
6804
+ displayName: string;
6805
+ }>;
6806
+
6807
+ export declare type F0ENPSButtonProps = {
6808
+ /**
6809
+ * The face that is answered, or `undefined` while the question is unanswered.
6810
+ */
6811
+ value?: Pulse;
6812
+ /**
6813
+ * Called with the answered face — or `undefined` when the answer is cleared,
6814
+ * which only `required: false` allows. Never called on mount.
6815
+ */
6816
+ onChange?: (value: Pulse | undefined) => void;
6817
+ /**
6818
+ * What each face means, worst to best. A face carries no visible text, so its
6819
+ * label is both the accessible name and the tooltip: word it as the answer the
6820
+ * person is giving ("Very bad"), never as a number or a position.
6821
+ *
6822
+ * Required, and required in full — the wording belongs to the question, so the
6823
+ * component holds no copy of its own: a mood check answers "Terrible", a
6824
+ * recommendation question answers "Not at all likely". Pass it already
6825
+ * translated.
6826
+ */
6827
+ labels: Record<Pulse, string>;
6828
+ /**
6829
+ * Override the face drawn for one or more points of the scale. Defaults to the
6830
+ * five `Face*` icons from `lib/mood` — the same ones `F0AvatarPulse` shows, so
6831
+ * an answer looks the same wherever it turns up.
6832
+ *
6833
+ * Swap them only when the question isn't about mood: a thumbs pair, a set of
6834
+ * stars. Keep the replacements a *set* that reads worst-to-best on its own —
6835
+ * five unrelated glyphs stop being a scale.
6836
+ */
6837
+ icons?: Partial<Record<Pulse, IconType>>;
6838
+ /**
6839
+ * The size of each face.
6840
+ * @default "lg"
6841
+ */
6842
+ size?: ButtonToggleGroupSize;
6843
+ /**
6844
+ * Whether the five faces stretch to fill the container. A widget's eNPS row
6845
+ * usually should — an equal split reads as one scale rather than five buttons.
6846
+ * @default true
6847
+ */
6848
+ fullWidth?: boolean;
6849
+ /**
6850
+ * Whether every face is disabled — a submitted answer, or a question that is
6851
+ * closed.
6852
+ * @default false
6853
+ */
6854
+ disabled?: boolean;
6855
+ /**
6856
+ * Whether an answer, once given, can be taken back by pressing it again.
6857
+ * @default false
6858
+ */
6859
+ required?: boolean;
6860
+ };
6861
+
6529
6862
  export declare type F0FileAction = {
6530
6863
  icon?: IconType;
6531
6864
  label: string;
@@ -7350,6 +7683,18 @@ export declare type F0ProgressSeriesSize = (typeof f0ProgressSeriesSizes)[number
7350
7683
 
7351
7684
  export declare const f0ProgressSeriesSizes: readonly ["sm", "md", "lg"];
7352
7685
 
7686
+ /**
7687
+ * Header for a resource detail page: avatar, title, description, status,
7688
+ * metadata and its primary, secondary and overflow actions.
7689
+ */
7690
+ declare const F0ResourceHeader: ({ avatar, title, description, primaryAction, secondaryActions, otherActions, status, metadata, deactivated, metadataRowGap, showBottomBorder, onClose, }: Props) => JSX_2.Element;
7691
+ export { F0ResourceHeader }
7692
+ export { F0ResourceHeader as ResourceHeader }
7693
+
7694
+ declare type F0ResourceHeaderProps = Props;
7695
+ export { F0ResourceHeaderProps }
7696
+ export { F0ResourceHeaderProps as ResourceHeaderProps }
7697
+
7353
7698
  /**
7354
7699
  * @experimental This is an experimental component, use it at your own risk
7355
7700
  */
@@ -8299,6 +8644,18 @@ export declare type GraphVisualizationOptions<R extends RecordType, Filters exte
8299
8644
  * the default entry view (roots expanded to `defaultExpandDepth`).
8300
8645
  */
8301
8646
  focusOnEntry?: string;
8647
+ /**
8648
+ * Id of a node to mark as **selected on entry** — the click-selection ring, so
8649
+ * a deep link lands on the graph looking the way a user's own click leaves it,
8650
+ * not just framed. Seeded on the first render; the selection then follows
8651
+ * normal clicks/keyboard (this is a one-shot entry seed, not a controlled
8652
+ * value). Pair it with `focusOnEntry` (usually the same id) so the node's
8653
+ * branch is expanded and framed — otherwise the ring isn't visible until its
8654
+ * branch is opened. Unlike `revealNodeId` (search) it sets the selection, not
8655
+ * the reveal highlight. Providing it puts the graph's selection in controlled
8656
+ * mode; omitting it leaves selection uncontrolled (the default).
8657
+ */
8658
+ initialSelectedNodeId?: string;
8302
8659
  /**
8303
8660
  * Resolves the ancestor path (root → … → matched node) for a node so it can
8304
8661
  * be revealed, returning the records in root-first order. Required for
@@ -8703,7 +9060,7 @@ export declare interface HomeSlotParamsMap {
8703
9060
  * `alert` and `status` are EXCLUSIVE — `Widget` throws when given both — so the
8704
9061
  * type says so rather than leaving it to blow up at runtime.
8705
9062
  */
8706
- export declare type HomeWidgetChrome = Pick<WidgetProps, "action" | "summaries"> & ({
9063
+ export declare type HomeWidgetChrome = Pick<WidgetProps, "action" | "summaries" | "headerControls"> & ({
8707
9064
  alert?: WidgetProps["alert"];
8708
9065
  status?: never;
8709
9066
  } | {
@@ -9024,6 +9381,27 @@ export declare type InfiniteScrollPaginatedResponse<TRecord> = BasePaginatedResp
9024
9381
  hasMore: boolean;
9025
9382
  };
9026
9383
 
9384
+ /**
9385
+ * Structured help copy for a labelled thing — a table column, a dashboard
9386
+ * widget. `link` is for what the description implies but cannot do: opening the
9387
+ * catalog entry the copy came from.
9388
+ */
9389
+ declare type InfoHintContent = {
9390
+ title: string;
9391
+ description: string;
9392
+ link?: {
9393
+ label: string;
9394
+ onClick: () => void;
9395
+ };
9396
+ /**
9397
+ * Accessible name for the icon trigger. Falls back to `label` on the host
9398
+ * and then to a generic "More information", so the trigger is never named
9399
+ * after the thing it describes alone — a name identical to the heading
9400
+ * beside it says nothing about what the control does.
9401
+ */
9402
+ label?: string;
9403
+ };
9404
+
9027
9405
  /**
9028
9406
  * @deprecated Renamed to `F0TextInput` to match the F0 input vocabulary
9029
9407
  * (any component where the user types text in a box has the `Input` suffix
@@ -11370,14 +11748,6 @@ export declare const resolveSlotRenderer: (entry: SlotRendererEntry | undefined)
11370
11748
  /** Resolves a header's params-driven parts against the params in hand. */
11371
11749
  export declare const resolveWidgetHeader: (header: HomeWidgetHeader | undefined, params?: WidgetParams) => WidgetProps["header"];
11372
11750
 
11373
- /**
11374
- * Header for a resource detail page: avatar, title, description, status,
11375
- * metadata and its primary, secondary and overflow actions.
11376
- */
11377
- export declare const ResourceHeader: ({ avatar, title, description, primaryAction, secondaryActions, otherActions, status, metadata, deactivated, metadataRowGap, showBottomBorder, onClose, }: Props) => JSX_2.Element;
11378
-
11379
- export declare type ResourceHeaderProps = Props;
11380
-
11381
11751
  declare type RestrictComponentProps = {
11382
11752
  identifier: string;
11383
11753
  allowedRoutes?: string[];
@@ -12127,7 +12497,22 @@ export declare const slotRowBleed: (ctx: HomeRenderCtx) => string;
12127
12497
  */
12128
12498
  export declare type SlotSkeletonRenderer<P = unknown> = (params: P, ctx: HomeSkeletonCtx) => ReactNode;
12129
12499
 
12130
- export declare function SlotWidget({ header, params, fullHeight, action, summaries, alert, status, slots, loading, slotRenderers, actions, flipped, onFlipBack, isDragging, ctx, }: SlotWidgetProps): JSX_2.Element;
12500
+ export declare function SlotWidget({ header, params, fullHeight, action, summaries, headerControls, alert, status, slots, loading, slotRenderers, actions, flipped, onFlipBack, isDragging, ctx, }: SlotWidgetProps): JSX_2.Element;
12501
+
12502
+ /**
12503
+ * A widget's CONTENT: the slot stack, with the dividers between slots and the
12504
+ * skeletons while it loads — everything `SlotWidget` draws, minus the card.
12505
+ *
12506
+ * Public because the frame is not always wanted. A surface that drills into a
12507
+ * widget (an overlay listing the tasks one of its grouped rows summarises) is
12508
+ * already a surface: wrapped in a `Widget` it would be a card inside a card,
12509
+ * with two borders and two paddings. Rendering the slots here keeps the rows
12510
+ * IDENTICAL to the widget's — same slots, same renderers — which composing them
12511
+ * by hand would not.
12512
+ *
12513
+ * Inside a card, prefer `SlotWidget`: it is this plus the frame.
12514
+ */
12515
+ export declare function SlotWidgetContent({ slots, loading, slotRenderers, ctx, }: Pick<SlotWidgetProps, "slots" | "loading" | "slotRenderers" | "ctx">): JSX_2.Element;
12131
12516
 
12132
12517
  /**
12133
12518
  * SlotWidget — one Home widget rendered from data: the f0 `Widget` frame (the
@@ -12445,19 +12830,16 @@ declare type TableColumnDefinition<R extends RecordType, Sortings extends Sortin
12445
12830
 
12446
12831
  declare function TableHead({ children, width, minWidth, sortState, onSortClick, onClick, info, infoIcon, sticky, hidden, highlighted, align, className, colSpan, }: TableHeadProps): JSX_2.Element;
12447
12832
 
12448
- declare type TableHeaderInfo = {
12449
- title: string;
12450
- description: string;
12451
- link?: {
12452
- label: string;
12453
- onClick: () => void;
12454
- };
12455
- /**
12456
- * Accessible name for the info-icon trigger. Defaults to the column label
12457
- * when the header's children are a string.
12458
- */
12459
- label?: string;
12460
- };
12833
+ /**
12834
+ * Structured help copy for a column header. The same shape every other
12835
+ * ⓘ affordance takes — see {@link InfoHintContent}, where `label` defaults to
12836
+ * the column label when the header's children are a string.
12837
+ *
12838
+ * A table-specific name for a shape that is no longer table-specific: the
12839
+ * canonical export is `InfoHintContent`, and this stays as an alias so
12840
+ * existing imports keep working.
12841
+ */
12842
+ declare type TableHeaderInfo = InfoHintContent;
12461
12843
 
12462
12844
  declare interface TableHeadProps {
12463
12845
  children: React.ReactNode;
@@ -12596,6 +12978,23 @@ declare type TableVisualizationOptions<R extends RecordType, _Filters extends Fi
12596
12978
  * `noRemoving` are never removable.
12597
12979
  */
12598
12980
  onRemoveColumn?: (columnId: ColId) => void;
12981
+ /**
12982
+ * The user-managed frozen columns in the column-settings popover. Locked
12983
+ * columns move into a sticky group on the left, stay visible, and cannot be
12984
+ * reordered or removed. Their array order controls their order in that group.
12985
+ * One visible managed column always remains unlocked as the table's
12986
+ * scrollable region; an all-locked input is normalized accordingly.
12987
+ *
12988
+ * Unlocking a column returns it to its saved position. Columns covered by
12989
+ * `frozenColumns` remain permanently locked before this managed group.
12990
+ */
12991
+ lockedColumnIds?: readonly ColId[];
12992
+ /**
12993
+ * Called with the complete set of user-managed locked column ids whenever a
12994
+ * user locks or unlocks a column. Passing this callback enables the lock
12995
+ * controls in the column-settings popover.
12996
+ */
12997
+ onLockedColumnIdsChange?: (columnIds: ColId[]) => void;
12599
12998
  /** Maps a row to a visual variant: `"striped"`, `"striked"`, or `"none"`. */
12600
12999
  referenceRowType?: (item: R) => ReferenceType;
12601
13000
  /**
@@ -13728,8 +14127,14 @@ export declare type WidgetAvatarsListItemProps = {
13728
14127
  * Selection follows the filter: if the selected row is filtered out, the first
13729
14128
  * remaining row takes over, so the preview always shows something the CTA can
13730
14129
  * actually add.
14130
+ *
14131
+ * ONE CATALOG, TWO COLUMNS. Pass the `area` the picker was opened for and the
14132
+ * same `widgets` list serves both: entries that declare `areas` are shown only
14133
+ * where they fit, entries that declare none are shown in both, and the preview
14134
+ * takes that column's width. So a Home keeps one list — the widgets it offers —
14135
+ * rather than two that have to be kept in step.
13731
14136
  */
13732
- export declare function WidgetCatalog({ isOpen, onClose, widgets, onAdd, groups, previewWidth, slotRenderers, title, }: WidgetCatalogProps): JSX_2.Element;
14137
+ export declare function WidgetCatalog({ isOpen, onClose, widgets, onAdd, groups, area, previewWidth, slotRenderers, title, }: WidgetCatalogProps): JSX_2.Element;
13733
14138
 
13734
14139
  /**
13735
14140
  * One DOMAIN in the picker: a heading the widgets under it belong to.
@@ -13784,6 +14189,21 @@ export declare interface WidgetCatalogItem {
13784
14189
  * nothing recommended there is no section.
13785
14190
  */
13786
14191
  recommended?: boolean;
14192
+ /**
14193
+ * WHICH COLUMNS this widget may be added to — the same two sides the layout
14194
+ * hands back from `onClickAddNewWidget`. The picker then shows it only when it
14195
+ * was opened for one of them (see `area`).
14196
+ *
14197
+ * OMIT IT for a widget that belongs in either, which is most of them: a
14198
+ * `list`-shaped card reads the same in a 396px rail and in the main column,
14199
+ * and saying so twice is how the two lists drift apart. Name the sides for the
14200
+ * widgets that genuinely cannot travel — a carousel of post cards needs the
14201
+ * main column's width, a 40px clock tile is built for the rail.
14202
+ *
14203
+ * A widget listed for NEITHER side (`[]`) is offered nowhere, which is a way to
14204
+ * retire an entry without deleting it.
14205
+ */
14206
+ areas?: WidgetContainerSide[];
13787
14207
  }
13788
14208
 
13789
14209
  export declare interface WidgetCatalogProps {
@@ -13798,9 +14218,22 @@ export declare interface WidgetCatalogProps {
13798
14218
  * and the list is flat — grouping is an offer, not a requirement.
13799
14219
  */
13800
14220
  groups?: WidgetCatalogGroup[];
14221
+ /**
14222
+ * WHICH COLUMN the picker was opened for — pass the side `onClickAddNewWidget`
14223
+ * handed you. It does two things: widgets that declare `areas` are filtered
14224
+ * down to the ones this column can hold, and the preview is capped to that
14225
+ * column's width by default (see {@link AREA_PREVIEW_WIDTH}).
14226
+ *
14227
+ * Omit it and the picker is what it has always been: every widget, previewed
14228
+ * at `previewWidth`. That is right for a Home with ONE place to put a widget;
14229
+ * a layout with two columns should say which one it is filling, or it will
14230
+ * offer the rail's clock for the main column and preview it at the wrong width.
14231
+ */
14232
+ area?: WidgetContainerSide;
13801
14233
  /**
13802
14234
  * Content width of the column this was opened from — the preview is capped
13803
- * to it, so a rail-bound widget previews at rail width.
14235
+ * to it, so a rail-bound widget previews at rail width. Defaults to the
14236
+ * `area`'s own width, and to the rail's when there is no `area`.
13804
14237
  */
13805
14238
  previewWidth?: number;
13806
14239
  /**
@@ -13956,6 +14389,23 @@ export declare interface WidgetProps {
13956
14389
  AIButton?: () => void;
13957
14390
  /** An overflow menu at the header's right, beside `link`. */
13958
14391
  actions?: DropdownItem[];
14392
+ /**
14393
+ * THE WIDGET'S OWN CONTROLS, in the header's top-right: what the card is
14394
+ * currently showing (a scope switcher), or what you can do from it without
14395
+ * leaving the page ("New post"). They act on the WIDGET.
14396
+ *
14397
+ * They sit to the LEFT of the overflow menu, which keeps its corner — the menu
14398
+ * is where every widget's items live, and a control that moved depending on
14399
+ * whether a card had a menu would be a different control each time.
14400
+ *
14401
+ * Keep it to one or two `sm` controls. This row is the TITLE'S first, and the
14402
+ * title gives up its width to whatever is put beside it: three buttons here
14403
+ * and a narrow card has no name left.
14404
+ *
14405
+ * NOT the way out of the widget — that is `header.link`, drawn as the title
14406
+ * itself — and NOT its call to action, which is `action`, in the footer.
14407
+ */
14408
+ headerControls?: ReactNode;
13959
14409
  }
13960
14410
 
13961
14411
  /**
@@ -14241,10 +14691,8 @@ declare module "@tiptap/core" {
14241
14691
 
14242
14692
  declare module "@tiptap/core" {
14243
14693
  interface Commands<ReturnType> {
14244
- videoEmbed: {
14245
- setVideoEmbed: (options: {
14246
- src: string;
14247
- }) => ReturnType;
14694
+ transcript: {
14695
+ insertTranscript: (data: TranscriptData) => ReturnType;
14248
14696
  };
14249
14697
  }
14250
14698
  }
@@ -14252,8 +14700,10 @@ declare module "@tiptap/core" {
14252
14700
 
14253
14701
  declare module "@tiptap/core" {
14254
14702
  interface Commands<ReturnType> {
14255
- transcript: {
14256
- insertTranscript: (data: TranscriptData) => ReturnType;
14703
+ videoEmbed: {
14704
+ setVideoEmbed: (options: {
14705
+ src: string;
14706
+ }) => ReturnType;
14257
14707
  };
14258
14708
  }
14259
14709
  }