@nxgt/material 3.70.0 → 3.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.
- package/CHANGELOG.md +75 -0
- package/README.md +9 -6
- package/dist/{alert-dialog-CBkWG32g.js → alert-dialog-A8K8zai1.js} +1 -1
- package/dist/{async-slice-CNZ3N55P.js → async-slice-B8933IHY.js} +1 -1
- package/dist/{button-D3qzqDY_.js → button-C8moFnIT.js} +1 -1
- package/dist/charts.js +3 -3
- package/dist/{chip-CMTe4sQd.js → chip-B6AY1E91.js} +2 -2
- package/dist/{code-editor-Cs7mz1J-.js → code-editor-DQZIKL54.js} +5 -5
- package/dist/code-editor.js +5 -5
- package/dist/{code-language-items-D_QMgjVy.js → code-language-items-8VL0aMKG.js} +2 -2
- package/dist/components/ui/collections/server-table/server-table-phone-row.css +6 -0
- package/dist/components/ui/display/code/code-moonlight.css +37 -0
- package/dist/components/ui/fields/attributes/attribute-values-form/attribute-values-form.css +5 -0
- package/dist/{components-BbWcozcj.js → components-EHdmrvV4.js} +20862 -19924
- package/dist/components.js +28 -28
- package/dist/{dialog-B3BSdRci.js → dialog-WuLTwxkr.js} +5 -5
- package/dist/dnd.js +1 -1
- package/dist/{dropdown-menu-BaupOWgS.js → dropdown-menu-tadySeGH.js} +1 -1
- package/dist/editor.js +35 -35
- package/dist/{empty-state-B2Um5UpI.js → empty-state-ZYiFSSBQ.js} +2 -2
- package/dist/{field-blur-1XLyxRPr.js → field-blur-BYR0yE5L.js} +1 -1
- package/dist/{field-blur-context-XNvCDnMT.js → field-blur-context-bEhByoK-.js} +1 -1
- package/dist/{hooks-BU21Jpaa.js → hooks-GpwD8iDu.js} +2 -2
- package/dist/hooks.js +3 -3
- package/dist/{hover-card-Bvm3svX9.js → hover-card-BowaI_ra.js} +1 -1
- package/dist/i18n.js +3 -3
- package/dist/{icon-badge-wip9bfa2.js → icon-badge-B1B0Lg02.js} +3 -3
- package/dist/{icon-button-QwIeBTdw.js → icon-button-BbGU17cb.js} +1 -1
- package/dist/lib/components/ui/actions/fab/fab-dock-inset.d.ts +29 -0
- package/dist/lib/components/ui/actions/fab/fab-dock.d.ts +6 -1
- package/dist/lib/components/ui/collections/data-table/select-checkbox.d.ts +3 -2
- package/dist/lib/components/ui/collections/filter/use-filter-field-config.d.ts +3 -0
- package/dist/lib/components/ui/collections/index.d.ts +1 -0
- package/dist/lib/components/ui/collections/record-actions-menu/index.d.ts +2 -0
- package/dist/lib/components/ui/collections/record-actions-menu/record-actions-dialogs.d.ts +15 -0
- package/dist/lib/components/ui/collections/record-actions-menu/record-actions-menu.d.ts +72 -0
- package/dist/lib/components/ui/collections/record-actions-menu/record-actions-rules.d.ts +68 -0
- package/dist/lib/components/ui/collections/record-actions-menu/record-actions-words.d.ts +52 -0
- package/dist/lib/components/ui/collections/record-actions-menu/use-record-actions.d.ts +51 -0
- package/dist/lib/components/ui/collections/record-actions-menu/use-record-flight.d.ts +16 -0
- package/dist/lib/components/ui/collections/row-menu/row-menu-column.d.ts +4 -0
- package/dist/lib/components/ui/collections/row-menu/row-menu.d.ts +1 -1
- package/dist/lib/components/ui/collections/server-table/partials/server-table-band-classes.d.ts +7 -5
- package/dist/lib/components/ui/collections/server-table/partials/server-table-column-sorting.d.ts +7 -0
- package/dist/lib/components/ui/collections/server-table/types.d.ts +3 -1
- package/dist/lib/components/ui/display/markdown/markdown.d.ts +12 -1
- package/dist/lib/components/ui/display/markdown/markdown.utils.d.ts +2 -0
- package/dist/lib/components/ui/display/markdown/mermaid-csp-scope.d.ts +8 -0
- package/dist/lib/components/ui/display/markdown/mermaid-markup.d.ts +20 -0
- package/dist/lib/components/ui/display/markdown/partials/markdown-code.d.ts +5 -1
- package/dist/lib/components/ui/feedback/confirm-dialog/action-refusal.d.ts +24 -0
- package/dist/lib/components/ui/feedback/confirm-dialog/confirm-alert.d.ts +17 -0
- package/dist/lib/components/ui/feedback/confirm-dialog/confirm-description.d.ts +10 -0
- package/dist/lib/components/ui/feedback/confirm-dialog/confirm-dialog.d.ts +24 -2
- package/dist/lib/components/ui/feedback/confirm-dialog/confirm-refusal.d.ts +7 -0
- package/dist/lib/components/ui/feedback/confirm-dialog/index.d.ts +1 -0
- package/dist/lib/components/ui/feedback/confirm-dialog/use-confirm-action.d.ts +6 -0
- package/dist/lib/components/ui/feedback/index.d.ts +1 -0
- package/dist/lib/components/ui/feedback/stale-notice/index.d.ts +1 -0
- package/dist/lib/components/ui/feedback/stale-notice/stale-notice.d.ts +15 -0
- package/dist/lib/components/ui/fields/attributes/attribute-values-form-field-set/attribute-values-form-field-set.d.ts +5 -1
- package/dist/lib/components/ui/fields/contacts/contact-dialog.d.ts +8 -2
- package/dist/lib/components/ui/fields/contacts/contacts-dialog-form-field.d.ts +4 -1
- package/dist/lib/components/ui/fields/contacts/contacts-editor.d.ts +15 -2
- package/dist/lib/components/ui/fields/contacts/contacts-form-field.d.ts +6 -1
- package/dist/lib/components/ui/fields/contacts/logic/offered-types.d.ts +3 -0
- package/dist/lib/components/ui/fields/contacts/models.d.ts +2 -0
- package/dist/lib/components/ui/fields/contacts/partials/contact-fields.d.ts +4 -2
- package/dist/lib/components/ui/fields/contacts/partials/contact-groups.d.ts +4 -2
- package/dist/lib/components/ui/fields/contacts/partials/contact-row.d.ts +4 -2
- package/dist/lib/components/ui/fields/contacts/partials/phone-sheet.d.ts +4 -2
- package/dist/lib/components/ui/fields/contacts/partials/quick-add.d.ts +4 -2
- package/dist/lib/components/ui/fields/contacts/partials/row-actions.d.ts +3 -1
- package/dist/lib/components/ui/fields/contacts/placeholders.d.ts +1 -1
- package/dist/lib/components/ui/forms/index.d.ts +1 -0
- package/dist/lib/components/ui/forms/use-server-field-errors.d.ts +21 -0
- package/dist/lib/components/ui/layout/index.d.ts +1 -0
- package/dist/lib/components/ui/layout/record-page/index.d.ts +2 -0
- package/dist/lib/components/ui/layout/record-page/record-details.d.ts +40 -0
- package/dist/lib/components/ui/layout/record-page/record-page.d.ts +27 -0
- package/dist/lib/components/ui/media/upload/network-upload-field/network-upload-field.d.ts +5 -0
- package/dist/lib/components/ui/media/upload/network-upload-field/partials/network-upload-field-items.d.ts +2 -1
- package/dist/lib/components/ui/media/upload/network-upload-field/upload-constraints.d.ts +10 -2
- package/dist/lib/components/ui/overlays/dialog/dialog-body-overflow.d.ts +7 -0
- package/dist/lib/components/ui/overlays/dialog/dialog-body.d.ts +10 -0
- package/dist/lib/components/ui/overlays/dialog/dialog-variants.d.ts +4 -0
- package/dist/lib/components/ui/overlays/dialog/dialog.d.ts +1 -0
- package/dist/lib/components/ui/widgets/chat/chat-conversation-item.d.ts +8 -2
- package/dist/lib/components/ui/widgets/chat/chat-markdown.d.ts +4 -0
- package/dist/lib/components/ui/widgets/chat/chat-message-list.d.ts +8 -1
- package/dist/lib/components/ui/widgets/chat/index.d.ts +2 -0
- package/dist/lib/components/ui/widgets/chat/partials/chat-conversation-item-text.d.ts +2 -1
- package/dist/lib/components/ui/widgets/chat/partials/chat-empty-thread.d.ts +2 -0
- package/dist/lib/components/ui/widgets/chat/proposal/chat-action-proposal-parts.d.ts +24 -0
- package/dist/lib/components/ui/widgets/chat/proposal/chat-action-proposal.d.ts +39 -0
- package/dist/lib/components/ui/widgets/chat/proposal/chat-action-proposal.rules.d.ts +17 -0
- package/dist/lib/components/ui/widgets/chat/proposal/chat-tool-activity.d.ts +16 -0
- package/dist/lib/i18n/resources/en/en.d.ts +47 -0
- package/dist/lib/i18n/resources/en/material.json.d.ts +47 -0
- package/dist/lib/i18n/resources/fr/fr.d.ts +47 -0
- package/dist/lib/i18n/resources/fr/material.json.d.ts +47 -0
- package/dist/lib/i18n/resources/resources.d.ts +94 -0
- package/dist/lib/i18n/translator.d.ts +1 -1
- package/dist/lib/print/output/to-pdf-element.d.ts +6 -0
- package/dist/lib.js +1 -1
- package/dist/main.js +42 -42
- package/dist/map.js +8 -8
- package/dist/material.css +1 -1
- package/dist/pdf-reader.js +1 -1
- package/dist/print.js +135 -131
- package/dist/{public-BuGgOtAl.js → public-CFj2qn7l.js} +9 -9
- package/dist/{rich-code-block-DdHqzzek.js → rich-code-block-B7Teg7-e.js} +5 -5
- package/dist/{sortable-provider-DMyaSfZZ.js → sortable-provider-y5sFhRDj.js} +2 -2
- package/dist/{spinner-ByYdcukU.js → spinner-C5Kb6MWu.js} +1 -1
- package/dist/theme-picker.js +2 -2
- package/dist/{theme-toggle-DB3aZZnO.js → theme-toggle-B1JZg7mU.js} +1 -1
- package/dist/{toolbar-items-DbzIKjo7.js → toolbar-items-m_1FTFPQ.js} +3 -3
- package/dist/{translate-material-Dh7MYkHT.js → translate-material-D1ndrd7a.js} +1 -1
- package/dist/{translator-Byhohi1S.js → translator-CtEC_AQa.js} +94 -0
- package/dist/{typography-rUf0mE5a.js → typography-prQHb3gI.js} +1 -1
- package/dist/{use-chat-composer-uUUTRB3Z.js → use-chat-composer-DBiyNXvL.js} +107 -107
- package/dist/{use-heading-spy-CVzW2NM3.js → use-heading-spy-Bzj5mIUZ.js} +179 -87
- package/dist/{use-material-translation-BAYyZOcH.js → use-material-translation-C6H0B4kE.js} +1 -1
- package/dist/{use-return-focus-CQAuk9kh.js → use-return-focus-CkUX1HFl.js} +1 -1
- package/docs/components/buttons-and-actions.md +24 -0
- package/docs/components/data-display.md +33 -0
- package/docs/components/data-table-filter-and-lists.md +117 -5
- package/docs/components/feedback-and-status.md +58 -2
- package/docs/components/form-fields.md +63 -3
- package/docs/components/media-and-files.md +4 -1
- package/docs/components/navigation-and-layout.md +58 -0
- package/docs/components/overlays-and-menus.md +20 -1
- package/docs/components/rich-widgets.md +35 -2
- package/docs/guides/cards-and-tiles.md +4 -2
- package/docs/guides/csp.md +44 -6
- package/docs/guides/forms.md +59 -7
- package/docs/guides/i18n.md +7 -6
- package/docs/guides/printing.md +17 -7
- package/docs/previews/data-table-filter-lists-recordactionsmenu.webp +0 -0
- package/docs/previews/feedback-status-stalenotice.webp +0 -0
- package/docs/previews/media-files-networkuploadfield.webp +0 -0
- package/docs/previews/media-files-s3uploadfield.webp +0 -0
- package/docs/previews/media-files-uploadfield.webp +0 -0
- package/docs/previews/navigation-layout-recordpage.webp +0 -0
- package/docs/previews/rich-widgets-chat-action-proposal.webp +0 -0
- package/docs/roadmap.md +11 -1
- package/docs/troubleshooting.md +126 -8
- package/lib/components/ui/collections/server-table/server-table-phone-row.css +6 -0
- package/lib/components/ui/display/code/code-moonlight.css +37 -0
- package/lib/components/ui/fields/attributes/attribute-values-form/attribute-values-form.css +5 -0
- package/package.json +3 -2
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { ActivityContentProps } from '../app-shell/activity-content.js';
|
|
3
|
+
export type RecordPageProps = Omit<ActivityContentProps, 'aside' | 'asideLabel' | 'asideLabelledBy' | 'asideStack' | 'asideClassName' | 'asideSide'> & {
|
|
4
|
+
/**
|
|
5
|
+
* The record's facts, usually a {@link RecordDetails}: a side panel from
|
|
6
|
+
* `asideFrom` (`xl` by default), sticky under the app bar, and stacked
|
|
7
|
+
* below it. A `complementary` landmark named by `detailsLabel`.
|
|
8
|
+
*/
|
|
9
|
+
details?: ReactNode;
|
|
10
|
+
/** The side panel's accessible name (`aria-label`), such as "Item details". */
|
|
11
|
+
detailsLabel?: string;
|
|
12
|
+
/** The id of the heading inside the details that names the panel. */
|
|
13
|
+
detailsLabelledBy?: string;
|
|
14
|
+
/** Where the details go below `asideFrom`: `'after'` the content (default) or `'before'` it. */
|
|
15
|
+
detailsStack?: 'before' | 'after';
|
|
16
|
+
/** Classes for the side panel itself. */
|
|
17
|
+
detailsClassName?: string;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* RecordPage - the page of one record: a header card (`header`, or `title`,
|
|
21
|
+
* `subtitle` and `actions`), the content, and the record's facts (`details`,
|
|
22
|
+
* a {@link RecordDetails}) as a side panel from `xl` that stacks after the
|
|
23
|
+
* content, or before it, below. It composes `ActivityContent`, so `width`,
|
|
24
|
+
* `notice`, `inset`, `titleAs` and the others work as there; only the side
|
|
25
|
+
* panel's props are renamed `details*`. A layout: no data, no state.
|
|
26
|
+
*/
|
|
27
|
+
export declare function RecordPage({ details, detailsLabel, detailsLabelledBy, detailsStack, detailsClassName, ...props }: RecordPageProps): import("react").JSX.Element;
|
|
@@ -5,6 +5,11 @@ export type NetworkUploadFieldProps = {
|
|
|
5
5
|
error?: boolean;
|
|
6
6
|
disabled?: boolean;
|
|
7
7
|
accept?: string;
|
|
8
|
+
/**
|
|
9
|
+
* What the drop zone's hint says about `accept`, instead of the names
|
|
10
|
+
* derived from it (`JPEG, PNG, WebP`). `""` hides the type part.
|
|
11
|
+
*/
|
|
12
|
+
acceptLabel?: string;
|
|
8
13
|
maxSize?: number;
|
|
9
14
|
maxFiles?: number;
|
|
10
15
|
/**
|
|
@@ -5,6 +5,7 @@ export type NetworkUploadFieldItemsProps = {
|
|
|
5
5
|
inputId: string;
|
|
6
6
|
multiple: boolean;
|
|
7
7
|
accept?: string;
|
|
8
|
+
acceptLabel?: string;
|
|
8
9
|
disabled?: boolean;
|
|
9
10
|
error?: boolean;
|
|
10
11
|
/** The drop zone's own error description, when it carries the error. */
|
|
@@ -13,4 +14,4 @@ export type NetworkUploadFieldItemsProps = {
|
|
|
13
14
|
maxFiles?: number;
|
|
14
15
|
};
|
|
15
16
|
/** The field's files, then the drop zone while there is room for one more. */
|
|
16
|
-
export declare function NetworkUploadFieldItems({ field, inputId, multiple, accept, disabled, error, errorId, maxSize, maxFiles, }: NetworkUploadFieldItemsProps): import("react").JSX.Element;
|
|
17
|
+
export declare function NetworkUploadFieldItems({ field, inputId, multiple, accept, acceptLabel, disabled, error, errorId, maxSize, maxFiles, }: NetworkUploadFieldItemsProps): import("react").JSX.Element;
|
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
import { UploadMessageTranslate } from './network-upload-field.utils.js';
|
|
2
2
|
export type UploadConstraintOptions = {
|
|
3
3
|
accept?: string;
|
|
4
|
+
/** Replaces the names derived from `accept` in the limits line. */
|
|
5
|
+
acceptLabel?: string;
|
|
4
6
|
maxSize?: number;
|
|
5
7
|
maxFiles?: number;
|
|
6
8
|
};
|
|
7
9
|
/**
|
|
8
|
-
* The
|
|
10
|
+
* The `accept` list as short names: `image/jpeg,image/png` becomes
|
|
11
|
+
* `JPEG, PNG`, `image/*` becomes `Images`. Entries it does not know stay as
|
|
12
|
+
* given; repeats are shown once.
|
|
13
|
+
*/
|
|
14
|
+
export declare function formatAcceptNames(accept: string, t: UploadMessageTranslate): string;
|
|
15
|
+
/**
|
|
16
|
+
* The drop zone's limits line, e.g. `Images · Max 2 MB · Up to 3 files`,
|
|
9
17
|
* in the language `t` translates to. Empty when there is no limit.
|
|
10
18
|
*/
|
|
11
|
-
export declare function formatUploadConstraints({ accept, maxSize, maxFiles }: UploadConstraintOptions, t: UploadMessageTranslate): string;
|
|
19
|
+
export declare function formatUploadConstraints({ accept, acceptLabel, maxSize, maxFiles }: UploadConstraintOptions, t: UploadMessageTranslate): string;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Sets `data-overflow-start` / `data-overflow-end` on a scroll box: content is hidden above / below. */
|
|
2
|
+
export declare function measureOverflow(el: HTMLElement): void;
|
|
3
|
+
/**
|
|
4
|
+
* Keeps the flags current while the box resizes, a child resizes, or a child
|
|
5
|
+
* is added or removed. Returns the cleanup that disconnects both observers.
|
|
6
|
+
*/
|
|
7
|
+
export declare function watchOverflow(el: HTMLElement): () => void;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { ComponentProps } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* The part of a long dialog that scrolls on its own: `DialogContent` becomes a
|
|
4
|
+
* clipped flex column around it, so the header and the `DialogFooter` stay in
|
|
5
|
+
* view. A hairline shows on the edge where content is hidden beneath the
|
|
6
|
+
* header or the footer, and not otherwise. Give it an `aria-label` or `aria-labelledby` and it is
|
|
7
|
+
* a named region.
|
|
8
|
+
*/
|
|
9
|
+
declare function DialogBody({ className, children, onScroll, ref, ...props }: ComponentProps<'div'>): import("react").JSX.Element;
|
|
10
|
+
export { DialogBody };
|
|
@@ -3,6 +3,10 @@ import { VariantProps } from 'class-variance-authority';
|
|
|
3
3
|
* DialogContent's layout: centred, at most the viewport less a margin.
|
|
4
4
|
* Its look and motion are `nxgt-dialog` (dialog.css), in the `components`
|
|
5
5
|
* layer, so a utility in `className` still wins (`rounded-lg`, `bg-background`).
|
|
6
|
+
* With a `DialogBody` as a direct child it becomes a clipped flex column, so
|
|
7
|
+
* only the body scrolls; without one nothing changes. `--dialog-px` (1.5rem,
|
|
8
|
+
* the `p-6` side padding) is what the body bleeds by: set it with a `p-*` of
|
|
9
|
+
* your own (`p-4 [--dialog-px:1rem]`).
|
|
6
10
|
*/
|
|
7
11
|
export declare const dialogContentVariants: (props?: ({
|
|
8
12
|
size?: "lg" | "md" | "sm" | "xl" | "full" | null | undefined;
|
|
@@ -16,6 +16,7 @@ type DialogContentProps = ComponentProps<typeof DialogPrimitive.Content> & Dialo
|
|
|
16
16
|
container?: HTMLElement | null;
|
|
17
17
|
};
|
|
18
18
|
declare function DialogContent({ className, children, onInteractOutside, onPointerDownOutside, onFocusOutside, onOpenAutoFocus, onCloseAutoFocus, onEscapeKeyDown, size, mobilePresentation, scrim, container, ref, ...props }: DialogContentProps): import("react").JSX.Element;
|
|
19
|
+
export { DialogBody } from './dialog-body.js';
|
|
19
20
|
export { DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from './dialog-parts.js';
|
|
20
21
|
export type { DialogScrim } from './dialog-variants.js';
|
|
21
22
|
export type { DialogContentProps };
|
|
@@ -3,7 +3,13 @@ import { StatusTone } from '../../display/status-indicator/status-indicator.js';
|
|
|
3
3
|
export type ChatConversationItemProps = {
|
|
4
4
|
avatarSrc?: string;
|
|
5
5
|
avatarFallback?: ReactNode;
|
|
6
|
+
/**
|
|
7
|
+
* The conversation's name. A string also becomes the `title` attribute of
|
|
8
|
+
* the clipped line, so the full text stays readable on hover.
|
|
9
|
+
*/
|
|
6
10
|
title: ReactNode;
|
|
11
|
+
/** The full text of a clipped `title` that is not a string (a node). */
|
|
12
|
+
titleText?: string;
|
|
7
13
|
preview?: ReactNode;
|
|
8
14
|
timestamp?: ReactNode;
|
|
9
15
|
unreadCount?: number;
|
|
@@ -13,5 +19,5 @@ export type ChatConversationItemProps = {
|
|
|
13
19
|
status?: StatusTone;
|
|
14
20
|
/** Shows a typing line instead of the preview. */
|
|
15
21
|
isTyping?: boolean;
|
|
16
|
-
} & Omit<ComponentProps<'button'>, 'children'>;
|
|
17
|
-
export declare function ChatConversationItem({ avatarSrc, avatarFallback, title, preview, timestamp, unreadCount, isActive, isLoading, status, isTyping, className, ...props }: ChatConversationItemProps): import("react").JSX.Element;
|
|
22
|
+
} & Omit<ComponentProps<'button'>, 'children' | 'title'>;
|
|
23
|
+
export declare function ChatConversationItem({ avatarSrc, avatarFallback, title, titleText, preview, timestamp, unreadCount, isActive, isLoading, status, isTyping, className, ...props }: ChatConversationItemProps): import("react").JSX.Element;
|
|
@@ -2,5 +2,9 @@ import { ComponentProps } from 'react';
|
|
|
2
2
|
export { sanitizeHref } from '../../display/markdown/markdown.utils.js';
|
|
3
3
|
export type ChatMarkdownProps = {
|
|
4
4
|
content: string;
|
|
5
|
+
/** KaTeX maths, default `true`; see `Markdown`. */
|
|
6
|
+
math?: boolean;
|
|
7
|
+
/** Mermaid diagrams, default `true`; see `Markdown`. */
|
|
8
|
+
mermaid?: boolean;
|
|
5
9
|
} & Omit<ComponentProps<'div'>, 'children'>;
|
|
6
10
|
export declare function ChatMarkdown({ content, className, ...props }: ChatMarkdownProps): import("react").JSX.Element;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ComponentProps, ReactNode } from 'react';
|
|
2
|
+
import { ScrollArea } from '../../primitives/scroll-area/scroll-area.js';
|
|
2
3
|
import { ChatDensity, ChatLayout } from './chat-layout-context.js';
|
|
3
4
|
export type ChatMessageListProps = {
|
|
4
5
|
isTyping?: boolean;
|
|
@@ -14,5 +15,11 @@ export type ChatMessageListProps = {
|
|
|
14
15
|
/** `comfortable` (default) or `compact`, for every `ChatMessage` inside. */
|
|
15
16
|
density?: ChatDensity;
|
|
16
17
|
children?: ReactNode;
|
|
18
|
+
/**
|
|
19
|
+
* Attributes for the scrolling element itself. It is a tab stop by default
|
|
20
|
+
* (`tabIndex={0}`), so a keyboard reader can scroll a transcript that holds
|
|
21
|
+
* nothing focusable; pass `tabIndex={-1}` to opt out.
|
|
22
|
+
*/
|
|
23
|
+
viewportProps?: ComponentProps<typeof ScrollArea>['viewportProps'];
|
|
17
24
|
} & Omit<ComponentProps<'div'>, 'children' | 'dir'>;
|
|
18
|
-
export declare function ChatMessageList({ isTyping, typingLabel, typingAvatar, emptyState, scrollToBottomLabel, showScrollToBottom, bottomThreshold, layout, density, children, className, ...props }: ChatMessageListProps): import("react").JSX.Element;
|
|
25
|
+
export declare function ChatMessageList({ isTyping, typingLabel, typingAvatar, emptyState, scrollToBottomLabel, showScrollToBottom, bottomThreshold, layout, density, children, className, viewportProps, ...props }: ChatMessageListProps): import("react").JSX.Element;
|
|
@@ -15,4 +15,6 @@ export * from './chat-typing-indicator.js';
|
|
|
15
15
|
export * from './chat-widget.js';
|
|
16
16
|
export * from './partials/chat-composer-attachment-chip.js';
|
|
17
17
|
export * from './partials/chat-composer-attachments.js';
|
|
18
|
+
export * from './proposal/chat-action-proposal.js';
|
|
19
|
+
export * from './proposal/chat-tool-activity.js';
|
|
18
20
|
export * from './use-chat-composer-attachments.js';
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { ReactNode } from 'react';
|
|
2
2
|
/** The title, timestamp, preview (or typing line) and unread badge of a conversation row. */
|
|
3
|
-
export declare function ChatConversationItemText({ title, preview, timestamp, unreadCount, isActive, isTyping, }: {
|
|
3
|
+
export declare function ChatConversationItemText({ title, titleText, preview, timestamp, unreadCount, isActive, isTyping, }: {
|
|
4
4
|
title: ReactNode;
|
|
5
|
+
titleText?: string;
|
|
5
6
|
preview?: ReactNode;
|
|
6
7
|
timestamp?: ReactNode;
|
|
7
8
|
unreadCount?: number;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ReactNode, RefObject } from 'react';
|
|
2
|
+
import { ChatActionProposalStatus } from './chat-action-proposal.rules.js';
|
|
3
|
+
export declare function ProposalFailure({ code, message, }: {
|
|
4
|
+
code?: string;
|
|
5
|
+
message?: ReactNode;
|
|
6
|
+
}): import("react").JSX.Element | null;
|
|
7
|
+
export declare function ProposalButtons({ actions, onConfirm, onReject, confirmLabel, rejectLabel, busy, locked, }: {
|
|
8
|
+
actions?: ReactNode;
|
|
9
|
+
onConfirm?: () => void;
|
|
10
|
+
onReject?: () => void;
|
|
11
|
+
confirmLabel?: string;
|
|
12
|
+
rejectLabel?: string;
|
|
13
|
+
busy: boolean;
|
|
14
|
+
locked: boolean;
|
|
15
|
+
}): import("react").JSX.Element;
|
|
16
|
+
export declare function Deadline({ at, status, }: {
|
|
17
|
+
at: Date | string | number;
|
|
18
|
+
status: ChatActionProposalStatus;
|
|
19
|
+
}): import("react").JSX.Element | null;
|
|
20
|
+
export declare function ProposalHeader({ toolLabel, status, statusRef, }: {
|
|
21
|
+
toolLabel?: ReactNode;
|
|
22
|
+
status: ChatActionProposalStatus;
|
|
23
|
+
statusRef: RefObject<HTMLSpanElement | null>;
|
|
24
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { ComponentProps, ReactNode } from 'react';
|
|
2
|
+
import { ChatActionProposalStatus } from './chat-action-proposal.rules.js';
|
|
3
|
+
export type { ChatActionProposalStatus };
|
|
4
|
+
export type ChatActionProposalProps = {
|
|
5
|
+
/** What the assistant wants to do, in a few words. */
|
|
6
|
+
title: ReactNode;
|
|
7
|
+
/** The effect in plain words: what will change, and for whom. */
|
|
8
|
+
summary?: ReactNode;
|
|
9
|
+
/** The tool behind the action (a name, a badge, an icon with a name). */
|
|
10
|
+
toolLabel?: ReactNode;
|
|
11
|
+
/** Extra detail under the summary (a list of the records touched). */
|
|
12
|
+
children?: ReactNode;
|
|
13
|
+
/** The last moment to answer; written in the active language. */
|
|
14
|
+
deadline?: Date | string | number;
|
|
15
|
+
/** Default `pending`. Only `pending` shows the buttons. */
|
|
16
|
+
status?: ChatActionProposalStatus;
|
|
17
|
+
/** A `failed` proposal: the code the tool returned, shown beside the message. */
|
|
18
|
+
failureCode?: string;
|
|
19
|
+
/** A `failed` proposal: why, in words. */
|
|
20
|
+
failureMessage?: ReactNode;
|
|
21
|
+
/** The confirm button. With neither this nor `actions`, no buttons. */
|
|
22
|
+
onConfirm?: () => void;
|
|
23
|
+
/** The reject button. */
|
|
24
|
+
onReject?: () => void;
|
|
25
|
+
confirmLabel?: string;
|
|
26
|
+
rejectLabel?: string;
|
|
27
|
+
/** An answer is being sent: both buttons are disabled and Confirm shows its spinner. */
|
|
28
|
+
busy?: boolean;
|
|
29
|
+
/** Disables both buttons without the spinner (a read-only viewer). */
|
|
30
|
+
disabled?: boolean;
|
|
31
|
+
/** Replaces the two buttons (a split button, a reason dialog's trigger). Shown while `pending` only. */
|
|
32
|
+
actions?: ReactNode;
|
|
33
|
+
} & Omit<ComponentProps<'section'>, 'title' | 'children'>;
|
|
34
|
+
/**
|
|
35
|
+
* A card in a chat thread for an action an assistant proposes and the user
|
|
36
|
+
* confirms or rejects. Once answered, the focus moves to the status line so
|
|
37
|
+
* a screen reader reads the outcome.
|
|
38
|
+
*/
|
|
39
|
+
export declare function ChatActionProposal({ title, summary, toolLabel, children, deadline, status, failureCode, failureMessage, onConfirm, onReject, confirmLabel, rejectLabel, busy, disabled, actions, className, ...props }: ChatActionProposalProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { IconName } from '@fortawesome/fontawesome-common-types';
|
|
2
|
+
import { BadgeTone } from '../../../display/badge/badge.js';
|
|
3
|
+
/** Where a proposed action stands. Only `pending` can still be answered. */
|
|
4
|
+
export type ChatActionProposalStatus = 'pending' | 'running' | 'confirmed' | 'failed' | 'rejected' | 'expired';
|
|
5
|
+
type StatusLook = {
|
|
6
|
+
tone: BadgeTone;
|
|
7
|
+
icon: IconName;
|
|
8
|
+
label: string;
|
|
9
|
+
};
|
|
10
|
+
/** Each status: a tone, an icon and its English fallback (`material.chat.proposal.status.<status>`). Colour is never the only signal. */
|
|
11
|
+
export declare const PROPOSAL_STATUS: Record<ChatActionProposalStatus, StatusLook>;
|
|
12
|
+
/** The buttons show only while the proposal waits for an answer. */
|
|
13
|
+
export declare function proposalAnswerable(status: ChatActionProposalStatus): boolean;
|
|
14
|
+
/** The state of a tool step in a message list. */
|
|
15
|
+
export type ChatToolActivityState = 'running' | 'ok' | 'failed';
|
|
16
|
+
export declare const TOOL_STATE: Record<ChatToolActivityState, StatusLook>;
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ComponentProps, ReactNode } from 'react';
|
|
2
|
+
import { ChatToolActivityState } from './chat-action-proposal.rules.js';
|
|
3
|
+
export type { ChatToolActivityState };
|
|
4
|
+
export type ChatToolActivityProps = {
|
|
5
|
+
/** The tool's name (`search_students`) or a friendly label. */
|
|
6
|
+
name: ReactNode;
|
|
7
|
+
/** Default `running`. */
|
|
8
|
+
state?: ChatToolActivityState;
|
|
9
|
+
/** A short result or error under the name. */
|
|
10
|
+
detail?: ReactNode;
|
|
11
|
+
} & Omit<ComponentProps<'div'>, 'children'>;
|
|
12
|
+
/**
|
|
13
|
+
* One compact row for a tool step the assistant took, inside a
|
|
14
|
+
* `ChatMessageList`: the name, then Running, Done or Failed with its icon.
|
|
15
|
+
*/
|
|
16
|
+
export declare function ChatToolActivity({ name, state, detail, className, ...props }: ChatToolActivityProps): import("react").JSX.Element;
|
|
@@ -119,6 +119,13 @@ export declare const en: {
|
|
|
119
119
|
"on-this-page": string;
|
|
120
120
|
};
|
|
121
121
|
upload: {
|
|
122
|
+
accept: {
|
|
123
|
+
images: string;
|
|
124
|
+
audio: string;
|
|
125
|
+
video: string;
|
|
126
|
+
text: string;
|
|
127
|
+
application: string;
|
|
128
|
+
};
|
|
122
129
|
dropzone: {
|
|
123
130
|
idle: string;
|
|
124
131
|
"at-capacity": string;
|
|
@@ -129,6 +136,7 @@ export declare const en: {
|
|
|
129
136
|
retry: string;
|
|
130
137
|
remove: string;
|
|
131
138
|
"replace-named": string;
|
|
139
|
+
"remove-named": string;
|
|
132
140
|
failed: string;
|
|
133
141
|
"error-status": string;
|
|
134
142
|
"error-status-code": string;
|
|
@@ -253,6 +261,25 @@ export declare const en: {
|
|
|
253
261
|
open: string;
|
|
254
262
|
close: string;
|
|
255
263
|
};
|
|
264
|
+
proposal: {
|
|
265
|
+
status: {
|
|
266
|
+
pending: string;
|
|
267
|
+
running: string;
|
|
268
|
+
confirmed: string;
|
|
269
|
+
failed: string;
|
|
270
|
+
rejected: string;
|
|
271
|
+
expired: string;
|
|
272
|
+
};
|
|
273
|
+
confirm: string;
|
|
274
|
+
reject: string;
|
|
275
|
+
"respond-by": string;
|
|
276
|
+
"expired-at": string;
|
|
277
|
+
};
|
|
278
|
+
tool: {
|
|
279
|
+
running: string;
|
|
280
|
+
ok: string;
|
|
281
|
+
failed: string;
|
|
282
|
+
};
|
|
256
283
|
};
|
|
257
284
|
gallery: {
|
|
258
285
|
label: string;
|
|
@@ -1370,6 +1397,11 @@ export declare const en: {
|
|
|
1370
1397
|
stay: string;
|
|
1371
1398
|
leave: string;
|
|
1372
1399
|
};
|
|
1400
|
+
"stale-notice": {
|
|
1401
|
+
title: string;
|
|
1402
|
+
description: string;
|
|
1403
|
+
reload: string;
|
|
1404
|
+
};
|
|
1373
1405
|
"load-more": {
|
|
1374
1406
|
shown: string;
|
|
1375
1407
|
"shown-count": string;
|
|
@@ -3006,5 +3038,20 @@ export declare const en: {
|
|
|
3006
3038
|
label: string;
|
|
3007
3039
|
column: string;
|
|
3008
3040
|
};
|
|
3041
|
+
"record-actions": {
|
|
3042
|
+
archive: string;
|
|
3043
|
+
restore: string;
|
|
3044
|
+
delete: string;
|
|
3045
|
+
archived: string;
|
|
3046
|
+
restored: string;
|
|
3047
|
+
undo: string;
|
|
3048
|
+
failed: string;
|
|
3049
|
+
"archive-title": string;
|
|
3050
|
+
"archive-description": string;
|
|
3051
|
+
"archive-confirm": string;
|
|
3052
|
+
"delete-title": string;
|
|
3053
|
+
"delete-description": string;
|
|
3054
|
+
"delete-confirm": string;
|
|
3055
|
+
};
|
|
3009
3056
|
};
|
|
3010
3057
|
};
|
|
@@ -109,6 +109,13 @@ declare const _default: {
|
|
|
109
109
|
"on-this-page": "On this page"
|
|
110
110
|
},
|
|
111
111
|
"upload": {
|
|
112
|
+
"accept": {
|
|
113
|
+
"images": "Images",
|
|
114
|
+
"audio": "Audio",
|
|
115
|
+
"video": "Videos",
|
|
116
|
+
"text": "Text files",
|
|
117
|
+
"application": "Documents"
|
|
118
|
+
},
|
|
112
119
|
"dropzone": {
|
|
113
120
|
"idle": "Drag & drop files here, or click to browse",
|
|
114
121
|
"at-capacity": "Maximum number of files reached",
|
|
@@ -119,6 +126,7 @@ declare const _default: {
|
|
|
119
126
|
"retry": "Retry",
|
|
120
127
|
"remove": "Remove",
|
|
121
128
|
"replace-named": "Replace {name}",
|
|
129
|
+
"remove-named": "Remove {name}",
|
|
122
130
|
"failed": "Upload failed",
|
|
123
131
|
"error-status": "Upload failed with status {status}",
|
|
124
132
|
"error-status-code": "Upload failed with status {status} ({code})",
|
|
@@ -242,6 +250,25 @@ declare const _default: {
|
|
|
242
250
|
"widget": {
|
|
243
251
|
"open": "Open chat",
|
|
244
252
|
"close": "Close chat"
|
|
253
|
+
},
|
|
254
|
+
"proposal": {
|
|
255
|
+
"status": {
|
|
256
|
+
"pending": "Awaiting your answer",
|
|
257
|
+
"running": "Running",
|
|
258
|
+
"confirmed": "Confirmed",
|
|
259
|
+
"failed": "Failed",
|
|
260
|
+
"rejected": "Rejected",
|
|
261
|
+
"expired": "Expired"
|
|
262
|
+
},
|
|
263
|
+
"confirm": "Confirm",
|
|
264
|
+
"reject": "Reject",
|
|
265
|
+
"respond-by": "Respond by",
|
|
266
|
+
"expired-at": "Expired on"
|
|
267
|
+
},
|
|
268
|
+
"tool": {
|
|
269
|
+
"running": "Running",
|
|
270
|
+
"ok": "Done",
|
|
271
|
+
"failed": "Failed"
|
|
245
272
|
}
|
|
246
273
|
},
|
|
247
274
|
"gallery": {
|
|
@@ -1360,6 +1387,11 @@ declare const _default: {
|
|
|
1360
1387
|
"stay": "Stay",
|
|
1361
1388
|
"leave": "Leave"
|
|
1362
1389
|
},
|
|
1390
|
+
"stale-notice": {
|
|
1391
|
+
"title": "This record changed",
|
|
1392
|
+
"description": "Someone else saved this record before you. What you typed is kept. Reload the record to see their version.",
|
|
1393
|
+
"reload": "Reload the record"
|
|
1394
|
+
},
|
|
1363
1395
|
"load-more": {
|
|
1364
1396
|
"shown": "Showing {shown} of {total}",
|
|
1365
1397
|
"shown-count": "{shown, plural, one {# shown} other {# shown}}",
|
|
@@ -2995,6 +3027,21 @@ declare const _default: {
|
|
|
2995
3027
|
"row-menu": {
|
|
2996
3028
|
"label": "Actions for {name}",
|
|
2997
3029
|
"column": "Actions"
|
|
3030
|
+
},
|
|
3031
|
+
"record-actions": {
|
|
3032
|
+
"archive": "Archive",
|
|
3033
|
+
"restore": "Restore",
|
|
3034
|
+
"delete": "Delete permanently",
|
|
3035
|
+
"archived": "{name} archived",
|
|
3036
|
+
"restored": "{name} restored",
|
|
3037
|
+
"undo": "Undo",
|
|
3038
|
+
"failed": "The action failed.",
|
|
3039
|
+
"archive-title": "Archive {name}?",
|
|
3040
|
+
"archive-description": "{name} will be hidden. You can restore it later.",
|
|
3041
|
+
"archive-confirm": "Archive",
|
|
3042
|
+
"delete-title": "Delete {name} permanently?",
|
|
3043
|
+
"delete-description": "This cannot be undone.",
|
|
3044
|
+
"delete-confirm": "Delete permanently"
|
|
2998
3045
|
}
|
|
2999
3046
|
}
|
|
3000
3047
|
;
|
|
@@ -119,6 +119,13 @@ export declare const fr: {
|
|
|
119
119
|
"on-this-page": string;
|
|
120
120
|
};
|
|
121
121
|
upload: {
|
|
122
|
+
accept: {
|
|
123
|
+
images: string;
|
|
124
|
+
audio: string;
|
|
125
|
+
video: string;
|
|
126
|
+
text: string;
|
|
127
|
+
application: string;
|
|
128
|
+
};
|
|
122
129
|
dropzone: {
|
|
123
130
|
idle: string;
|
|
124
131
|
"at-capacity": string;
|
|
@@ -129,6 +136,7 @@ export declare const fr: {
|
|
|
129
136
|
retry: string;
|
|
130
137
|
remove: string;
|
|
131
138
|
"replace-named": string;
|
|
139
|
+
"remove-named": string;
|
|
132
140
|
failed: string;
|
|
133
141
|
"error-status": string;
|
|
134
142
|
"error-status-code": string;
|
|
@@ -253,6 +261,25 @@ export declare const fr: {
|
|
|
253
261
|
open: string;
|
|
254
262
|
close: string;
|
|
255
263
|
};
|
|
264
|
+
proposal: {
|
|
265
|
+
status: {
|
|
266
|
+
pending: string;
|
|
267
|
+
running: string;
|
|
268
|
+
confirmed: string;
|
|
269
|
+
failed: string;
|
|
270
|
+
rejected: string;
|
|
271
|
+
expired: string;
|
|
272
|
+
};
|
|
273
|
+
confirm: string;
|
|
274
|
+
reject: string;
|
|
275
|
+
"respond-by": string;
|
|
276
|
+
"expired-at": string;
|
|
277
|
+
};
|
|
278
|
+
tool: {
|
|
279
|
+
running: string;
|
|
280
|
+
ok: string;
|
|
281
|
+
failed: string;
|
|
282
|
+
};
|
|
256
283
|
};
|
|
257
284
|
gallery: {
|
|
258
285
|
label: string;
|
|
@@ -1370,6 +1397,11 @@ export declare const fr: {
|
|
|
1370
1397
|
stay: string;
|
|
1371
1398
|
leave: string;
|
|
1372
1399
|
};
|
|
1400
|
+
"stale-notice": {
|
|
1401
|
+
title: string;
|
|
1402
|
+
description: string;
|
|
1403
|
+
reload: string;
|
|
1404
|
+
};
|
|
1373
1405
|
"load-more": {
|
|
1374
1406
|
shown: string;
|
|
1375
1407
|
"shown-count": string;
|
|
@@ -3006,5 +3038,20 @@ export declare const fr: {
|
|
|
3006
3038
|
label: string;
|
|
3007
3039
|
column: string;
|
|
3008
3040
|
};
|
|
3041
|
+
"record-actions": {
|
|
3042
|
+
archive: string;
|
|
3043
|
+
restore: string;
|
|
3044
|
+
delete: string;
|
|
3045
|
+
archived: string;
|
|
3046
|
+
restored: string;
|
|
3047
|
+
undo: string;
|
|
3048
|
+
failed: string;
|
|
3049
|
+
"archive-title": string;
|
|
3050
|
+
"archive-description": string;
|
|
3051
|
+
"archive-confirm": string;
|
|
3052
|
+
"delete-title": string;
|
|
3053
|
+
"delete-description": string;
|
|
3054
|
+
"delete-confirm": string;
|
|
3055
|
+
};
|
|
3009
3056
|
};
|
|
3010
3057
|
};
|
|
@@ -109,6 +109,13 @@ declare const _default: {
|
|
|
109
109
|
"on-this-page": "Sur cette page"
|
|
110
110
|
},
|
|
111
111
|
"upload": {
|
|
112
|
+
"accept": {
|
|
113
|
+
"images": "Images",
|
|
114
|
+
"audio": "Audio",
|
|
115
|
+
"video": "Vidéos",
|
|
116
|
+
"text": "Fichiers texte",
|
|
117
|
+
"application": "Documents"
|
|
118
|
+
},
|
|
112
119
|
"dropzone": {
|
|
113
120
|
"idle": "Glissez-déposez des fichiers ici, ou cliquez pour parcourir",
|
|
114
121
|
"at-capacity": "Nombre maximum de fichiers atteint",
|
|
@@ -119,6 +126,7 @@ declare const _default: {
|
|
|
119
126
|
"retry": "Réessayer",
|
|
120
127
|
"remove": "Supprimer",
|
|
121
128
|
"replace-named": "Remplacer {name}",
|
|
129
|
+
"remove-named": "Supprimer {name}",
|
|
122
130
|
"failed": "Échec de l'envoi",
|
|
123
131
|
"error-status": "Échec de l'envoi (statut {status})",
|
|
124
132
|
"error-status-code": "Échec de l'envoi (statut {status}, {code})",
|
|
@@ -242,6 +250,25 @@ declare const _default: {
|
|
|
242
250
|
"widget": {
|
|
243
251
|
"open": "Ouvrir la discussion",
|
|
244
252
|
"close": "Fermer la discussion"
|
|
253
|
+
},
|
|
254
|
+
"proposal": {
|
|
255
|
+
"status": {
|
|
256
|
+
"pending": "En attente de votre réponse",
|
|
257
|
+
"running": "En cours",
|
|
258
|
+
"confirmed": "Confirmée",
|
|
259
|
+
"failed": "Échec",
|
|
260
|
+
"rejected": "Refusée",
|
|
261
|
+
"expired": "Expirée"
|
|
262
|
+
},
|
|
263
|
+
"confirm": "Confirmer",
|
|
264
|
+
"reject": "Refuser",
|
|
265
|
+
"respond-by": "Répondre avant le",
|
|
266
|
+
"expired-at": "Expirée le"
|
|
267
|
+
},
|
|
268
|
+
"tool": {
|
|
269
|
+
"running": "En cours",
|
|
270
|
+
"ok": "Terminé",
|
|
271
|
+
"failed": "Échec"
|
|
245
272
|
}
|
|
246
273
|
},
|
|
247
274
|
"gallery": {
|
|
@@ -1360,6 +1387,11 @@ declare const _default: {
|
|
|
1360
1387
|
"stay": "Rester",
|
|
1361
1388
|
"leave": "Quitter"
|
|
1362
1389
|
},
|
|
1390
|
+
"stale-notice": {
|
|
1391
|
+
"title": "Cet enregistrement a changé",
|
|
1392
|
+
"description": "Quelqu’un d’autre a enregistré cet enregistrement avant vous. Ce que vous avez saisi est conservé. Rechargez l’enregistrement pour voir sa version.",
|
|
1393
|
+
"reload": "Recharger l’enregistrement"
|
|
1394
|
+
},
|
|
1363
1395
|
"load-more": {
|
|
1364
1396
|
"shown": "Affichage de {shown} sur {total}",
|
|
1365
1397
|
"shown-count": "{shown, plural, one {# affiché} other {# affichés}}",
|
|
@@ -2995,6 +3027,21 @@ declare const _default: {
|
|
|
2995
3027
|
"row-menu": {
|
|
2996
3028
|
"label": "Actions pour {name}",
|
|
2997
3029
|
"column": "Actions"
|
|
3030
|
+
},
|
|
3031
|
+
"record-actions": {
|
|
3032
|
+
"archive": "Archiver",
|
|
3033
|
+
"restore": "Restaurer",
|
|
3034
|
+
"delete": "Supprimer définitivement",
|
|
3035
|
+
"archived": "{name} archivé",
|
|
3036
|
+
"restored": "{name} restauré",
|
|
3037
|
+
"undo": "Annuler",
|
|
3038
|
+
"failed": "L’action a échoué.",
|
|
3039
|
+
"archive-title": "Archiver {name} ?",
|
|
3040
|
+
"archive-description": "{name} sera masqué. Vous pourrez le restaurer plus tard.",
|
|
3041
|
+
"archive-confirm": "Archiver",
|
|
3042
|
+
"delete-title": "Supprimer {name} définitivement ?",
|
|
3043
|
+
"delete-description": "Cette action est irréversible.",
|
|
3044
|
+
"delete-confirm": "Supprimer définitivement"
|
|
2998
3045
|
}
|
|
2999
3046
|
}
|
|
3000
3047
|
;
|