@eifi1/ui-kit 0.13.0 → 0.14.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/README.md +5 -5
- package/dist/components/amount-input.d.ts +6 -0
- package/dist/components/amount-input.js +35 -5
- package/dist/components/amount-input.js.map +1 -1
- package/dist/components/error-boundary.d.ts +8 -1
- package/dist/components/error-boundary.js +18 -2
- package/dist/components/error-boundary.js.map +1 -1
- package/dist/components/numpad-sheet.d.ts +7 -3
- package/dist/components/numpad-sheet.js +4 -3
- package/dist/components/numpad-sheet.js.map +1 -1
- package/dist/components/page-header.d.ts +55 -2
- package/dist/components/page-header.js +34 -3
- package/dist/components/page-header.js.map +1 -1
- package/dist/components/text.js.map +1 -1
- package/dist/components/tooltip.d.ts +31 -0
- package/dist/components/tooltip.js +33 -0
- package/dist/components/tooltip.js.map +1 -1
- package/dist/feedback/feedback-thread.d.ts +87 -6
- package/dist/feedback/feedback-thread.js +134 -58
- package/dist/feedback/feedback-thread.js.map +1 -1
- package/dist/feedback.d.ts +1 -1
- package/dist/i18n/locales/de.js +3 -1
- package/dist/i18n/locales/de.js.map +1 -1
- package/dist/i18n/locales/es.js +2 -1
- package/dist/i18n/locales/es.js.map +1 -1
- package/dist/i18n/locales/fr.js +2 -1
- package/dist/i18n/locales/fr.js.map +1 -1
- package/dist/i18n/locales/hu.js +2 -1
- package/dist/i18n/locales/hu.js.map +1 -1
- package/dist/i18n/locales/it.js +2 -1
- package/dist/i18n/locales/it.js.map +1 -1
- package/dist/i18n/locales/zh.js +2 -1
- package/dist/i18n/locales/zh.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/lib/format.js +1 -1
- package/dist/lib/format.js.map +1 -1
- package/dist/rhf/fields.d.ts +3 -1
- package/dist/rhf/fields.js.map +1 -1
- package/package.json +1 -1
- package/src/components/amount-input.tsx +73 -7
- package/src/components/error-boundary.tsx +33 -3
- package/src/components/numpad-sheet.tsx +13 -4
- package/src/components/page-header.tsx +98 -3
- package/src/components/text.tsx +2 -1
- package/src/components/tooltip.tsx +109 -2
- package/src/feedback/feedback-thread.tsx +229 -37
- package/src/i18n/locales/de.ts +2 -0
- package/src/i18n/locales/es.ts +1 -0
- package/src/i18n/locales/fr.ts +1 -0
- package/src/i18n/locales/hu.ts +1 -0
- package/src/i18n/locales/it.ts +1 -0
- package/src/i18n/locales/zh.ts +1 -0
- package/src/lib/format.ts +3 -1
- package/src/rhf/fields.tsx +3 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/feedback/feedback-thread.tsx"],"sourcesContent":["import { useEffect, useImperativeHandle, useLayoutEffect, useRef, useState, useSyncExternalStore } from \"react\";\nimport type { ReactNode, Ref } from \"react\";\nimport { Paperclip, Send } from \"lucide-react\";\nimport { cn } from \"../lib/cn\";\nimport { formatRelativeTime } from \"../lib/format\";\nimport { Button, EmptyState, Spinner, Textarea } from \"../components/ui\";\nimport { Skeleton } from \"../components/skeleton\";\nimport { Tooltip } from \"../components/tooltip\";\nimport { useKitFileLabels, useKitLabels, useKitLocale } from \"../i18n/kit-labels\";\nimport { FeedbackAttachmentField } from \"./feedback-attachment\";\nimport type { FeedbackNoteAttachment } from \"./feedback-inbox\";\nimport type { FeedbackAttachmentLabels } from \"./feedback-dialog\";\n\n/**\n * The conversation under a report: who said what, when, with what attached — and the\n * box to answer in.\n *\n * Both apps had written it by hand. kastlan's feedback page grew a comment list of\n * bordered boxes with `slate-*` literals (feedback-page.tsx, \"keksdose left this\n * unbuilt\"), and keksdose built the same thing a second time for support\n * (support-thread.tsx) with sides, bubbles and a composer that clears only what it\n * sent. This is that second one, generalised: the kit owns the look and the\n * behaviour, the app owns the data, the upload and every word it does not share.\n *\n * **Own vs other** is the caller's per message (`own`), not a comparison the kit makes\n * against a user id: whose message sits at the END side depends on who is reading,\n * and only the app knows that (keksdose's support thread labelled a member's question\n * \"Du\" in the admin panel the first time round, by reading the wrong field).\n *\n * **Redaction.** A thread is somebody's words about their own data — exactly what a\n * host's demo / screen-share mode blurs. Bodies, authors and attachments carry\n * `data-private` (the attribute `Tooltip redact` and `StatTile sensitive` use) unless\n * `redact={false}`.\n *\n * **RTL.** Sides are logical — `justify-end` is the reading end, and the bubble's\n * tucked corner is `rounded-ee` / `rounded-es` — and each body is `dir=\"auto\"`, so a\n * Hebrew reply in an English thread (or the reverse) lays out as its own language.\n */\n\n/* ── Labels ───────────────────────────────────────────────────────────────── */\n\n/** The `feedbackThread` namespace of `<UiKitProvider labels>`. */\nexport interface FeedbackThreadLabels {\n /** Accessible name of the message list. */\n thread: string;\n empty: string;\n loading: string;\n /** Author line of an `own` message that has no `author` of its own. */\n you: string;\n /** The badge beside a `staff` author. */\n staff: string;\n /** Accessible name of a message's attachment list. */\n attachments: string;\n}\n\nexport const DEFAULT_FEEDBACK_THREAD_LABELS: FeedbackThreadLabels = {\n thread: \"Comments\",\n empty: \"No comments yet\",\n loading: \"Loading comments…\",\n you: \"You\",\n staff: \"Staff\",\n attachments: \"Attachments\",\n};\n\n/** The `feedbackComposer` namespace of `<UiKitProvider labels>`. The attach buttons'\n * words are `feedbackAttachment`'s, shared with the dialog and the note editor. */\nexport interface FeedbackComposerLabels {\n /** Accessible name of the text box. */\n field: string;\n placeholder: string;\n send: string;\n /** The shortcut line, given the platform's modifier (\"Ctrl\" or \"⌘\"). */\n sendHint: (modifier: string) => string;\n}\n\nexport const DEFAULT_FEEDBACK_COMPOSER_LABELS: FeedbackComposerLabels = {\n field: \"Write a comment\",\n placeholder: \"Write a comment…\",\n send: \"Send\",\n sendHint: (modifier) => `${modifier} + Enter to send`,\n};\n\n/* ── Thread ───────────────────────────────────────────────────────────────── */\n\nexport interface FeedbackThreadAttachment {\n id?: string | number;\n name: string;\n /** Where to open it. Left out, the attachment is listed by name only. */\n url?: string;\n /** MIME type; an `image/*` with a `url` is shown as a thumbnail. */\n type?: string;\n /** Bytes, shown beside a non-image. */\n size?: number;\n}\n\nexport interface FeedbackThreadMessage {\n id: string | number;\n /** Who wrote it. Left out on an `own` message, it reads \"You\". */\n author?: ReactNode;\n /** A `Date`, an ISO string or epoch ms. */\n createdAt: Date | string | number;\n body: string;\n attachments?: readonly FeedbackThreadAttachment[];\n /** Written by whoever is reading: sits at the end side, in the brand tint. */\n own?: boolean;\n /** Written by the team rather than a user: gets the \"Staff\" badge. */\n staff?: boolean;\n}\n\nexport interface FeedbackThreadProps {\n messages: readonly FeedbackThreadMessage[];\n loading?: boolean;\n /** Replaces the default \"No comments yet\". */\n empty?: ReactNode;\n /**\n * Draw one attachment yourself — for files behind auth, which a plain `<img src>`\n * cannot fetch (kastlan's `AuthedImage`), or a lightbox. The default is a thumbnail\n * link for an image with a `url`, a file link otherwise.\n */\n renderAttachment?: (attachment: FeedbackThreadAttachment, message: FeedbackThreadMessage) => ReactNode;\n /** Tag bodies, authors and attachments `data-private`. Default true. */\n redact?: boolean;\n /** \"Now\" for the relative times — pin it in tests and stories. Default: the clock. */\n now?: Date | number;\n /** Overrides the provider's locale for the times. */\n locale?: string;\n labels?: Partial<FeedbackThreadLabels>;\n className?: string;\n}\n\nexport function FeedbackThread({\n messages,\n loading = false,\n empty,\n renderAttachment,\n redact = true,\n now,\n locale: localeProp,\n labels: labelsProp,\n className,\n}: FeedbackThreadProps) {\n const labels = useKitLabels(\"feedbackThread\", DEFAULT_FEEDBACK_THREAD_LABELS, labelsProp);\n const locale = useKitLocale(localeProp);\n const file = useKitFileLabels();\n const priv = redact ? \"\" : undefined;\n const clock = useMinuteClock(now === undefined);\n const reference = now === undefined ? clock : +now;\n\n if (loading && messages.length === 0) {\n return <Skeleton lines={3} label={labels.loading} className={className} />;\n }\n if (messages.length === 0) {\n return (\n <EmptyState\n variant=\"inline\"\n size=\"sm\"\n title={empty ?? labels.empty}\n className={cn(\"justify-start\", className)}\n />\n );\n }\n\n return (\n <ol aria-label={labels.thread} aria-busy={loading || undefined} className={cn(\"space-y-3\", className)}>\n {messages.map((message) => {\n const date = toDate(message.createdAt);\n const author = message.author ?? (message.own ? labels.you : null);\n const attachments = message.attachments ?? [];\n return (\n <li\n key={message.id}\n className={cn(\"flex\", message.own ? \"justify-end\" : \"justify-start\")}\n data-own={message.own ? \"\" : undefined}\n >\n <article\n className={cn(\n \"max-w-[85%] min-w-0 rounded-lg px-3 py-2 text-sm\",\n message.own\n ? \"rounded-ee-sm bg-[var(--brand-bg)]\"\n : \"rounded-es-sm bg-[var(--bg-surface-2)]\",\n )}\n >\n <header className=\"mb-0.5 flex flex-wrap items-center gap-x-2 gap-y-0.5 text-[11px] text-[var(--text-muted)]\">\n {author != null && (\n <span data-private={priv} className=\"font-medium text-[var(--text-secondary)]\">\n {author}\n </span>\n )}\n {message.staff && (\n <span className=\"rounded border border-[var(--border)] bg-[var(--bg-surface)] px-1 text-[10px] font-medium uppercase tracking-wide text-[var(--text-secondary)]\">\n {labels.staff}\n </span>\n )}\n {date && (\n // The kit's Tooltip, not a native title: one tooltip look app-wide\n // (keksdose F0 / dev#523).\n <Tooltip label={new Intl.DateTimeFormat(locale, { dateStyle: \"full\", timeStyle: \"short\" }).format(date)}>\n <time dateTime={date.toISOString()} className=\"tabular-nums\">\n {formatRelativeTime(date, {\n now: reference,\n locale,\n // Past the kit's day steps it is a date: \"2 weeks ago\" makes\n // the reader do arithmetic the date already did.\n absoluteAfterDays: 6.5,\n })}\n </time>\n </Tooltip>\n )}\n </header>\n {message.body && (\n <p\n data-private={priv}\n dir=\"auto\"\n className=\"whitespace-pre-wrap break-words text-start text-[var(--text-primary)]\"\n >\n {message.body}\n </p>\n )}\n {attachments.length > 0 && (\n <ul aria-label={labels.attachments} data-private={priv} className=\"mt-2 flex flex-wrap gap-2\">\n {attachments.map((attachment, index) => (\n <li key={attachment.id ?? `${index}-${attachment.name}`} className=\"min-w-0\">\n {renderAttachment ? (\n renderAttachment(attachment, message)\n ) : (\n <DefaultAttachment attachment={attachment} size={file.size} />\n )}\n </li>\n ))}\n </ul>\n )}\n </article>\n </li>\n );\n })}\n </ol>\n );\n}\n\nfunction DefaultAttachment({\n attachment,\n size,\n}: {\n attachment: FeedbackThreadAttachment;\n size: (bytes: number) => string;\n}) {\n const { name, url, type } = attachment;\n if (url && type?.startsWith(\"image/\")) {\n return (\n <a href={url} target=\"_blank\" rel=\"noopener noreferrer\" className=\"block\">\n <img\n src={url}\n alt={name}\n loading=\"lazy\"\n className=\"h-20 w-20 rounded border border-[var(--border)] object-cover\"\n />\n </a>\n );\n }\n const content = (\n <>\n <Paperclip className=\"size-3.5 shrink-0\" aria-hidden />\n <span className=\"truncate\">{name}</span>\n {attachment.size !== undefined && (\n <span className=\"shrink-0 text-[var(--text-muted)]\">{size(attachment.size)}</span>\n )}\n </>\n );\n const chip =\n \"inline-flex max-w-full items-center gap-1 rounded border border-[var(--border)] bg-[var(--bg-surface)] px-2 py-1 text-xs text-[var(--text-secondary)]\";\n return url ? (\n <a href={url} target=\"_blank\" rel=\"noopener noreferrer\" className={cn(chip, \"hover:bg-[var(--bg-hover)]\")}>\n {content}\n </a>\n ) : (\n <span className={chip}>{content}</span>\n );\n}\n\n/** The time, refreshed once a minute while `active`, so \"2 minutes ago\" does not stay\n * \"just now\" on a page left open. Read in state rather than in render, which must be\n * pure. */\nfunction useMinuteClock(active: boolean): number {\n const [time, setTime] = useState(() => Date.now());\n useEffect(() => {\n if (!active) return;\n const id = setInterval(() => setTime(Date.now()), 60_000);\n return () => clearInterval(id);\n }, [active]);\n return time;\n}\n\nfunction toDate(value: Date | string | number): Date | null {\n const date = value instanceof Date ? value : new Date(value);\n return Number.isNaN(date.getTime()) ? null : date;\n}\n\n/* ── Composer ─────────────────────────────────────────────────────────────── */\n\n/** What the composer's attach control takes — {@link FeedbackNoteAttachment} with the\n * labels optional, since the field reads `feedbackAttachment` from the provider. */\nexport type FeedbackComposerAttachment = Omit<FeedbackNoteAttachment, \"labels\"> & {\n labels?: Partial<FeedbackAttachmentLabels>;\n};\n\nexport interface FeedbackComposerProps {\n /**\n * Send the comment. Return the promise: the box clears when it RESOLVES, and only of\n * what was sent — text typed while it was in flight stays. A rejection keeps\n * everything for a retry (surface the error yourself; the composer stays quiet).\n */\n onSend: (body: string, attachment: File | null) => void | Promise<unknown>;\n /** The send is in flight: a spinner on the button and no second send. */\n pending?: boolean;\n /** Offer one picture with the comment (file, paste or `onCaptureScreenshot`).\n * `true` for the defaults. Left out, the composer is text only. */\n attachment?: boolean | FeedbackComposerAttachment;\n /** Rendered INSTEAD of the composer — the thread is closed, or read-only for this\n * reader. */\n disabledReason?: ReactNode;\n rows?: number;\n /**\n * The box's hint, over the `placeholder` label — keksdose F9: an admin answering a\n * support ticket is asked something else (\"Reply to Anna…\") than a member adding to\n * their own report, and one provider-wide label cannot say both.\n */\n placeholder?: string;\n /**\n * The draft, controlled — for a host that keeps it itself (saves it per ticket,\n * prefills a template). Left out, the composer keeps its own. Either way a send\n * that resolves clears only what was sent: controlled, that is an\n * `onValueChange(\"\")` the host receives like any keystroke, and only if the draft\n * is still the one that went out.\n */\n value?: string;\n /** Every change to the draft — typing, {@link FeedbackComposerHandle.insertText}, the\n * clear after a send. Required to change a controlled `value`. */\n onValueChange?: (value: string) => void;\n /** {@link FeedbackComposerHandle}: put text into the draft from outside (canned-reply\n * chips) or focus the box. */\n ref?: Ref<FeedbackComposerHandle>;\n labels?: Partial<FeedbackComposerLabels>;\n className?: string;\n}\n\n/**\n * What a {@link FeedbackComposer} `ref` holds.\n *\n * keksdose F9: the support admin answers the same five questions all day and wants\n * chips above the box (\"Thanks, fixed in the next release\") that drop their text in\n * where the caret is. A controlled `value` alone cannot do that well — the host sees\n * the string, not the caret, so it could only append — so the composer, which owns\n * the textarea, does the splice.\n */\nexport interface FeedbackComposerHandle {\n /**\n * Insert `text` at the caret, replacing any selection (the caret the box last had:\n * a click on a chip blurs it, and the selection survives the blur), then focus the\n * box with the caret after the inserted text so the reply can go on. Nothing is\n * added around it — put a space or a newline in `text` if the reply needs one. A\n * no-op while `disabledReason` replaces the box.\n */\n insertText: (text: string) => void;\n focus: () => void;\n}\n\nconst noSubscribe = () => () => {};\nconst isApple = () =>\n typeof navigator !== \"undefined\" && /Mac|iPhone|iPad|iPod/i.test(navigator.platform || navigator.userAgent);\n\n/**\n * The answer box under a {@link FeedbackThread}: a textarea, an optional picture,\n * and Send — Ctrl/⌘+Enter sends, the shortcut the report dialog and the note editor\n * use, so the habit carries across the feature. Plain Enter is a new line: feedback is\n * written in paragraphs, unlike a chat.\n */\nexport function FeedbackComposer({\n onSend,\n pending = false,\n attachment,\n disabledReason,\n rows = 3,\n placeholder,\n value,\n onValueChange,\n ref,\n labels: labelsProp,\n className,\n}: FeedbackComposerProps) {\n const labels = useKitLabels(\"feedbackComposer\", DEFAULT_FEEDBACK_COMPOSER_LABELS, labelsProp);\n const [ownDraft, setOwnDraft] = useState(\"\");\n const controlled = value !== undefined;\n const draft = controlled ? value : ownDraft;\n const [file, setFile] = useState<File | null>(null);\n const root = useRef<HTMLDivElement>(null);\n const box = useRef<HTMLTextAreaElement>(null);\n // The draft as of the last commit. The send's `.then` and `insertText` run after\n // renders their closure did not see — text typed while the send was in flight, a\n // second chip clicked before the first one's render — and must not act on a stale\n // string (for a controlled draft there is no updater function to lean on).\n const latest = useRef(draft);\n useLayoutEffect(() => {\n latest.current = draft;\n });\n // Where the caret goes once an inserted text has rendered.\n const caret = useRef<number | null>(null);\n useLayoutEffect(() => {\n const el = box.current;\n if (caret.current === null || !el) return;\n el.focus();\n el.setSelectionRange(caret.current, caret.current);\n caret.current = null;\n });\n\n const setDraft = (next: string) => {\n latest.current = next;\n if (!controlled) setOwnDraft(next);\n onValueChange?.(next);\n };\n\n useImperativeHandle(ref, () => ({\n insertText: (text) => {\n const el = box.current;\n if (!el) return;\n const current = latest.current;\n // A second insert before the first has rendered goes after the first, not at the\n // textarea's not-yet-moved caret. Otherwise the textarea's selection, which may\n // be past the end of a controlled value the host has just shortened: clamp it.\n const pending = caret.current;\n const start = Math.min(pending ?? el.selectionStart ?? current.length, current.length);\n const end = pending ?? Math.max(start, Math.min(el.selectionEnd ?? start, current.length));\n caret.current = start + text.length;\n setDraft(current.slice(0, start) + text + current.slice(end));\n },\n focus: () => box.current?.focus(),\n }));\n // The server snapshot is \"Ctrl\"; the client corrects it after hydration.\n const modifier = useSyncExternalStore(\n noSubscribe,\n () => (isApple() ? \"⌘\" : \"Ctrl\"),\n () => \"Ctrl\",\n );\n\n if (disabledReason != null && disabledReason !== false) {\n return <p className={cn(\"text-xs text-[var(--text-muted)]\", className)}>{disabledReason}</p>;\n }\n\n const canSend = draft.trim().length > 0 && !pending;\n const send = () => {\n if (!canSend) return;\n const sentDraft = draft;\n const sentFile = file;\n Promise.resolve(onSend(draft.trim(), file))\n .then(() => {\n if (latest.current === sentDraft) setDraft(\"\");\n setFile((current) => (current === sentFile ? null : current));\n })\n .catch(() => {});\n };\n\n const config = attachment === true ? {} : attachment || null;\n\n return (\n <div ref={root} className={cn(\"space-y-2\", className)}>\n <Textarea\n rows={rows}\n dir=\"auto\"\n aria-label={labels.field}\n ref={box}\n placeholder={placeholder ?? labels.placeholder}\n value={draft}\n onChange={(event) => setDraft(event.target.value)}\n onKeyDown={(event) => {\n if ((event.ctrlKey || event.metaKey) && event.key === \"Enter\") {\n event.preventDefault();\n send();\n }\n }}\n />\n <div className=\"flex flex-wrap items-end justify-between gap-2\">\n {config ? (\n <FeedbackAttachmentField\n value={file}\n onChange={setFile}\n labels={config.labels}\n accept={config.accept}\n maxBytes={config.maxBytes}\n onError={config.onError}\n onCaptureScreenshot={config.onCaptureScreenshot}\n // The box is this field's sibling; a paste in it bubbles to `root`.\n pasteFrom={root}\n />\n ) : (\n <span />\n )}\n <div className=\"ms-auto flex items-center gap-2\">\n <span className=\"text-xs text-[var(--text-placeholder)]\">{labels.sendHint(modifier)}</span>\n <Button onClick={send} disabled={!canSend} aria-busy={pending || undefined}>\n {pending ? (\n <Spinner label={null} className=\"size-4\" />\n ) : (\n <Send className=\"size-4 rtl:-scale-x-100\" aria-hidden />\n )}\n {labels.send}\n </Button>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["pending"]}
|
|
1
|
+
{"version":3,"sources":["../../src/feedback/feedback-thread.tsx"],"sourcesContent":["import { useEffect, useImperativeHandle, useLayoutEffect, useRef, useState, useSyncExternalStore } from \"react\";\nimport type { ReactNode, Ref } from \"react\";\nimport { Paperclip, Send } from \"lucide-react\";\nimport { cn } from \"../lib/cn\";\nimport { formatDate, formatRelativeTime } from \"../lib/format\";\nimport { Button, EmptyState, Spinner, Textarea } from \"../components/ui\";\nimport { Skeleton } from \"../components/skeleton\";\nimport { Tooltip } from \"../components/tooltip\";\nimport { useKitFileLabels, useKitLabels, useKitLocale } from \"../i18n/kit-labels\";\nimport { FeedbackAttachmentField } from \"./feedback-attachment\";\nimport type { FeedbackNoteAttachment } from \"./feedback-inbox\";\nimport type { FeedbackAttachmentLabels } from \"./feedback-dialog\";\n\n/**\n * The conversation under a report: who said what, when, with what attached — and the\n * box to answer in.\n *\n * Both apps had written it by hand. kastlan's feedback page grew a comment list of\n * bordered boxes with `slate-*` literals (feedback-page.tsx, \"keksdose left this\n * unbuilt\"), and keksdose built the same thing a second time for support\n * (support-thread.tsx) with sides, bubbles and a composer that clears only what it\n * sent. This is that second one, generalised: the kit owns the look and the\n * behaviour, the app owns the data, the upload and every word it does not share.\n *\n * **Own vs other** is the caller's per message (`own`), not a comparison the kit makes\n * against a user id: whose message sits at the END side depends on who is reading,\n * and only the app knows that (keksdose's support thread labelled a member's question\n * \"Du\" in the admin panel the first time round, by reading the wrong field).\n *\n * **Redaction.** A thread is somebody's words about their own data — exactly what a\n * host's demo / screen-share mode blurs. Bodies, authors and attachments carry\n * `data-private` (the attribute `Tooltip redact` and `StatTile sensitive` use) unless\n * `redact={false}`.\n *\n * **RTL.** Sides are logical — `justify-end` is the reading end, and the bubble's\n * tucked corner is `rounded-ee` / `rounded-es` — and each body is `dir=\"auto\"`, so a\n * Hebrew reply in an English thread (or the reverse) lays out as its own language.\n *\n * **A chat, too** (keksdose G4/G5). keksdose's support chat is the same conversation\n * read the chat way: status lines between the messages (\"Closed automatically\",\n * \"Reopened\"), a day line where the date changes, clock times under it, Enter to send\n * and several files uploaded ahead of the send. Each of those is an opt-in here\n * (`kind: \"event\"`, `daySeparators`, `timeFormat=\"clock\"`, `sendOn=\"enter\"`,\n * `attachmentSlot` + `canSend`), so the feedback thread's defaults stay as they were.\n */\n\n/* ── Labels ───────────────────────────────────────────────────────────────── */\n\n/** The `feedbackThread` namespace of `<UiKitProvider labels>`. */\nexport interface FeedbackThreadLabels {\n /** Accessible name of the message list. */\n thread: string;\n empty: string;\n loading: string;\n /** Author line of an `own` message that has no `author` of its own. */\n you: string;\n /** The badge beside a `staff` author. */\n staff: string;\n /** Accessible name of a message's attachment list. */\n attachments: string;\n}\n\nexport const DEFAULT_FEEDBACK_THREAD_LABELS: FeedbackThreadLabels = {\n thread: \"Comments\",\n empty: \"No comments yet\",\n loading: \"Loading comments…\",\n you: \"You\",\n staff: \"Staff\",\n attachments: \"Attachments\",\n};\n\n/** The `feedbackComposer` namespace of `<UiKitProvider labels>`. The attach buttons'\n * words are `feedbackAttachment`'s, shared with the dialog and the note editor. */\nexport interface FeedbackComposerLabels {\n /** Accessible name of the text box. */\n field: string;\n placeholder: string;\n send: string;\n /** The shortcut line, given the platform's modifier (\"Ctrl\" or \"⌘\"). */\n sendHint: (modifier: string) => string;\n /** The shortcut line under `sendOn=\"enter\"` (keksdose G5): Enter sends, so say how a\n * new line is made. */\n sendHintEnter: string;\n}\n\nexport const DEFAULT_FEEDBACK_COMPOSER_LABELS: FeedbackComposerLabels = {\n field: \"Write a comment\",\n placeholder: \"Write a comment…\",\n send: \"Send\",\n sendHint: (modifier) => `${modifier} + Enter to send`,\n sendHintEnter: \"Enter to send, Shift + Enter for a new line\",\n};\n\n/* ── Thread ───────────────────────────────────────────────────────────────── */\n\nexport interface FeedbackThreadAttachment {\n id?: string | number;\n name: string;\n /** Where to open it. Left out, the attachment is listed by name only. */\n url?: string;\n /** MIME type; an `image/*` with a `url` is shown as a thumbnail. */\n type?: string;\n /** Bytes, shown beside a non-image. */\n size?: number;\n}\n\nexport interface FeedbackThreadMessage {\n /** Leave out, or `\"message\"`. `\"event\"` is a {@link FeedbackThreadEvent}. */\n kind?: \"message\";\n id: string | number;\n /** Who wrote it. Left out on an `own` message, it reads \"You\". */\n author?: ReactNode;\n /** A `Date`, an ISO string or epoch ms. */\n createdAt: Date | string | number;\n body: string;\n attachments?: readonly FeedbackThreadAttachment[];\n /** Written by whoever is reading: sits at the end side, in the brand tint. */\n own?: boolean;\n /** Written by the team rather than a user: gets the \"Staff\" badge. */\n staff?: boolean;\n}\n\n/**\n * A line in the thread that nobody wrote — \"Closed automatically\", \"Marked as\n * resolved\", \"Reopened\" — drawn centred and muted with its time, no author, no side,\n * no bubble.\n *\n * keksdose G4: its support chat interleaves these with the messages, and as a message\n * they came out as a bubble from nobody at the start side, which reads as the member\n * having said \"resolved\". Word it for the READER, as with `own`: the app knows whether\n * \"you reopened it\" or \"Anna reopened it\" is true for the person looking.\n *\n * The text is the app's, not somebody's words about their data, so it is NOT tagged\n * `data-private`; one that names a person can wrap the name in its own\n * `<span data-private>` (`body` is a node for that reason).\n */\nexport interface FeedbackThreadEvent {\n kind: \"event\";\n id: string | number;\n /** A `Date`, an ISO string or epoch ms. */\n createdAt: Date | string | number;\n body: ReactNode;\n}\n\n/** One row of a {@link FeedbackThread}: a message, or an event line between them. */\nexport type FeedbackThreadItem = FeedbackThreadMessage | FeedbackThreadEvent;\n\nexport interface FeedbackThreadProps {\n /** Oldest first. Event lines ({@link FeedbackThreadEvent}) sit among the messages. */\n messages: readonly FeedbackThreadItem[];\n loading?: boolean;\n /** Replaces the default \"No comments yet\". */\n empty?: ReactNode;\n /**\n * Draw one attachment yourself — for files behind auth, which a plain `<img src>`\n * cannot fetch (kastlan's `AuthedImage`), or a lightbox. The default is a thumbnail\n * link for an image with a `url`, a file link otherwise.\n */\n renderAttachment?: (attachment: FeedbackThreadAttachment, message: FeedbackThreadMessage) => ReactNode;\n /** Tag bodies, authors and attachments `data-private`. Default true. */\n redact?: boolean;\n /**\n * How a row's time reads. `\"relative\"` (default): \"5 minutes ago\", a date past six\n * days — right for a report's comments, read days apart. `\"clock\"`: the time of day\n * in the locale (\"14:05\", \"2:05 PM\") — the chat look, keksdose G4; pair it with\n * `daySeparators`, which say which day that clock time is on. Either way the full\n * date and time is in the Tooltip.\n */\n timeFormat?: \"relative\" | \"clock\";\n /**\n * A centred day line before the first row and wherever the next row is on another\n * calendar day (the device's zone): \"Today\", \"Yesterday\", else the date — keksdose\n * G4. \"Today\" / \"Yesterday\" are `Intl.RelativeTimeFormat`'s own words in the kit\n * locale, so there is no label to translate. Default false.\n */\n daySeparators?: boolean;\n /** \"Now\" for the relative times and the day lines — pin it in tests and stories.\n * Default: the clock. */\n now?: Date | number;\n /** Overrides the provider's locale for the times. */\n locale?: string;\n labels?: Partial<FeedbackThreadLabels>;\n className?: string;\n}\n\nexport function FeedbackThread({\n messages,\n loading = false,\n empty,\n renderAttachment,\n redact = true,\n now,\n locale: localeProp,\n timeFormat = \"relative\",\n daySeparators = false,\n labels: labelsProp,\n className,\n}: FeedbackThreadProps) {\n const labels = useKitLabels(\"feedbackThread\", DEFAULT_FEEDBACK_THREAD_LABELS, labelsProp);\n const locale = useKitLocale(localeProp);\n const file = useKitFileLabels();\n const priv = redact ? \"\" : undefined;\n const clock = useMinuteClock(now === undefined);\n const reference = now === undefined ? clock : +now;\n\n if (loading && messages.length === 0) {\n return <Skeleton lines={3} label={labels.loading} className={className} />;\n }\n if (messages.length === 0) {\n return (\n <EmptyState\n variant=\"inline\"\n size=\"sm\"\n title={empty ?? labels.empty}\n className={cn(\"justify-start\", className)}\n />\n );\n }\n\n // Per row, the calendar day of the last readable date up to it — what a day line\n // compares against.\n const days: (number | null)[] = [];\n for (const message of messages) {\n const date = toDate(message.createdAt);\n days.push(date ? dayNumber(date) : (days.at(-1) ?? null));\n }\n\n return (\n <ol aria-label={labels.thread} aria-busy={loading || undefined} className={cn(\"space-y-3\", className)}>\n {messages.flatMap((message, index) => {\n const date = toDate(message.createdAt);\n const time = date && (\n // The kit's Tooltip, not a native title: one tooltip look app-wide\n // (keksdose F0 / dev#523).\n <Tooltip label={new Intl.DateTimeFormat(locale, { dateStyle: \"full\", timeStyle: \"short\" }).format(date)}>\n <time dateTime={date.toISOString()} className=\"tabular-nums\">\n {timeFormat === \"clock\"\n ? formatDate(date, \"time\", { locale })\n : formatRelativeTime(date, {\n now: reference,\n locale,\n // Past the kit's day steps it is a date: \"2 weeks ago\" makes\n // the reader do arithmetic the date already did.\n absoluteAfterDays: 6.5,\n })}\n </time>\n </Tooltip>\n );\n const rows: ReactNode[] = [];\n const day = date && dayNumber(date);\n // Against the last row WITH a readable date: an unparseable one neither starts\n // a day nor hides the next change.\n if (daySeparators && date && day !== days[index - 1]) {\n rows.push(<DaySeparator key={`day-${message.id}`} date={date} now={reference} locale={locale} />);\n }\n if (message.kind === \"event\") {\n // A list item like the rest, so \"Reopened\" is read in its place, but not an\n // article: an article is somebody's post, and this has no author.\n rows.push(\n <li\n key={message.id}\n data-event=\"\"\n className=\"flex flex-wrap items-baseline justify-center gap-x-2 px-4 text-center text-xs text-[var(--text-muted)]\"\n >\n <span>{message.body}</span>\n {time && <span className=\"text-[11px]\">{time}</span>}\n </li>,\n );\n return rows;\n }\n const author = message.author ?? (message.own ? labels.you : null);\n const attachments = message.attachments ?? [];\n rows.push(\n <li\n key={message.id}\n className={cn(\"flex\", message.own ? \"justify-end\" : \"justify-start\")}\n data-own={message.own ? \"\" : undefined}\n >\n <article\n className={cn(\n \"max-w-[85%] min-w-0 rounded-lg px-3 py-2 text-sm\",\n message.own\n ? \"rounded-ee-sm bg-[var(--brand-bg)]\"\n : \"rounded-es-sm bg-[var(--bg-surface-2)]\",\n )}\n >\n <header className=\"mb-0.5 flex flex-wrap items-center gap-x-2 gap-y-0.5 text-[11px] text-[var(--text-muted)]\">\n {author != null && (\n <span data-private={priv} className=\"font-medium text-[var(--text-secondary)]\">\n {author}\n </span>\n )}\n {message.staff && (\n <span className=\"rounded border border-[var(--border)] bg-[var(--bg-surface)] px-1 text-[10px] font-medium uppercase tracking-wide text-[var(--text-secondary)]\">\n {labels.staff}\n </span>\n )}\n {time}\n </header>\n {message.body && (\n <p\n data-private={priv}\n dir=\"auto\"\n className=\"whitespace-pre-wrap break-words text-start text-[var(--text-primary)]\"\n >\n {message.body}\n </p>\n )}\n {attachments.length > 0 && (\n <ul aria-label={labels.attachments} data-private={priv} className=\"mt-2 flex flex-wrap gap-2\">\n {attachments.map((attachment, index) => (\n <li key={attachment.id ?? `${index}-${attachment.name}`} className=\"min-w-0\">\n {renderAttachment ? (\n renderAttachment(attachment, message)\n ) : (\n <DefaultAttachment attachment={attachment} size={file.size} />\n )}\n </li>\n ))}\n </ul>\n )}\n </article>\n </li>,\n );\n return rows;\n })}\n </ol>\n );\n}\n\nfunction DefaultAttachment({\n attachment,\n size,\n}: {\n attachment: FeedbackThreadAttachment;\n size: (bytes: number) => string;\n}) {\n const { name, url, type } = attachment;\n if (url && type?.startsWith(\"image/\")) {\n return (\n <a href={url} target=\"_blank\" rel=\"noopener noreferrer\" className=\"block\">\n <img\n src={url}\n alt={name}\n loading=\"lazy\"\n className=\"h-20 w-20 rounded border border-[var(--border)] object-cover\"\n />\n </a>\n );\n }\n const content = (\n <>\n <Paperclip className=\"size-3.5 shrink-0\" aria-hidden />\n <span className=\"truncate\">{name}</span>\n {attachment.size !== undefined && (\n <span className=\"shrink-0 text-[var(--text-muted)]\">{size(attachment.size)}</span>\n )}\n </>\n );\n const chip =\n \"inline-flex max-w-full items-center gap-1 rounded border border-[var(--border)] bg-[var(--bg-surface)] px-2 py-1 text-xs text-[var(--text-secondary)]\";\n return url ? (\n <a href={url} target=\"_blank\" rel=\"noopener noreferrer\" className={cn(chip, \"hover:bg-[var(--bg-hover)]\")}>\n {content}\n </a>\n ) : (\n <span className={chip}>{content}</span>\n );\n}\n\n/** The time, refreshed once a minute while `active`, so \"2 minutes ago\" does not stay\n * \"just now\" on a page left open. Read in state rather than in render, which must be\n * pure. */\nfunction useMinuteClock(active: boolean): number {\n const [time, setTime] = useState(() => Date.now());\n useEffect(() => {\n if (!active) return;\n const id = setInterval(() => setTime(Date.now()), 60_000);\n return () => clearInterval(id);\n }, [active]);\n return time;\n}\n\n/** The local calendar day as one number (20260926), for \"same day?\" and keys. */\nfunction dayNumber(date: Date): number {\n return date.getFullYear() * 10_000 + (date.getMonth() + 1) * 100 + date.getDate();\n}\n\n/**\n * The day line of `daySeparators` (keksdose G4): \"Today\" / \"Yesterday\" from\n * `Intl.RelativeTimeFormat` (`numeric: \"auto\"`) — the locale's own words, capitalised\n * for a line that stands alone (\"heute\" → \"Heute\"; a script without case is left as\n * is) — else the weekday and date, with the year only when it is not this one.\n *\n * Counted in calendar days, not 24-hour spans: 23:50 yesterday is \"Yesterday\" at\n * 00:10 today.\n */\nfunction DaySeparator({ date, now, locale }: { date: Date; now: number; locale: string | undefined }) {\n const today = new Date(now);\n const days = Math.round(\n (Date.UTC(date.getFullYear(), date.getMonth(), date.getDate()) -\n Date.UTC(today.getFullYear(), today.getMonth(), today.getDate())) /\n 86_400_000,\n );\n let label: string;\n if (days === 0 || days === -1) {\n const word = new Intl.RelativeTimeFormat(locale, { numeric: \"auto\" }).format(days + 0, \"day\");\n label = word.charAt(0).toLocaleUpperCase(locale) + word.slice(1);\n } else {\n label = formatDate(\n date,\n {\n weekday: \"long\",\n day: \"numeric\",\n month: \"long\",\n ...(date.getFullYear() === today.getFullYear() ? null : { year: \"numeric\" }),\n },\n { locale },\n );\n }\n const y = String(date.getFullYear()).padStart(4, \"0\");\n const m = String(date.getMonth() + 1).padStart(2, \"0\");\n const d = String(date.getDate()).padStart(2, \"0\");\n return (\n <li data-day-separator=\"\" className=\"flex items-center gap-3 py-1 text-xs text-[var(--text-muted)]\">\n <span aria-hidden className=\"h-px flex-1 bg-[var(--border)]\" />\n <time dateTime={`${y}-${m}-${d}`} className=\"font-medium\">\n {label}\n </time>\n <span aria-hidden className=\"h-px flex-1 bg-[var(--border)]\" />\n </li>\n );\n}\n\nfunction toDate(value: Date | string | number): Date | null {\n const date = value instanceof Date ? value : new Date(value);\n return Number.isNaN(date.getTime()) ? null : date;\n}\n\n/* ── Composer ─────────────────────────────────────────────────────────────── */\n\n/** What the composer's attach control takes — {@link FeedbackNoteAttachment} with the\n * labels optional, since the field reads `feedbackAttachment` from the provider. */\nexport type FeedbackComposerAttachment = Omit<FeedbackNoteAttachment, \"labels\"> & {\n labels?: Partial<FeedbackAttachmentLabels>;\n};\n\nexport interface FeedbackComposerProps {\n /**\n * Send the comment. Return the promise: the box clears when it RESOLVES, and only of\n * what was sent — text typed while it was in flight stays. A rejection keeps\n * everything for a retry (surface the error yourself; the composer stays quiet).\n *\n * `attachment` is the built-in field's one picture. Files the host uploaded ahead\n * (`attachmentSlot`) are the host's state, read by the host here — and `body` may be\n * `\"\"` when `canSend` let an attachments-only message go.\n */\n onSend: (body: string, attachment: File | null) => void | Promise<unknown>;\n /** The send is in flight: a spinner on the button and no second send. */\n pending?: boolean;\n /** Offer one picture with the comment (file, paste or `onCaptureScreenshot`).\n * `true` for the defaults. Left out, the composer is text only. */\n attachment?: boolean | FeedbackComposerAttachment;\n /**\n * The host's own attach control, in the row with Send where the built-in field sits\n * (after it, if both are on) — keksdose G5: its support chat uploads up to N files\n * AHEAD of the send and sends their refs, which one `File` in `onSend` cannot carry.\n * The slot is the host's picker plus the chips of what is uploaded; the upload, the\n * refs and clearing them once `onSend` resolves stay with the host. Pair it with\n * `canSend`.\n */\n attachmentSlot?: ReactNode;\n /**\n * Whether Send is enabled, over the composer's own rule (some text in the box) —\n * for state the composer cannot see, i.e. `attachmentSlot`'s (keksdose G5): `true`\n * with files ready makes an empty draft sendable (`onSend(\"\", null)`), `false` while\n * an upload is still running holds even a written reply back. Left out, the text\n * decides. `pending` blocks a send either way.\n */\n canSend?: boolean;\n /**\n * Which key sends. `\"mod-enter\"` (default): Ctrl/⌘+Enter, the report dialog's and\n * note editor's shortcut, with plain Enter a new line — feedback is written in\n * paragraphs. `\"enter\"`: the chat way (keksdose G5) — Enter sends, Shift+Enter is a\n * new line, Ctrl/⌘+Enter still sends; an Enter that confirms an IME composition\n * (Japanese, Chinese input) is the IME's, never a send.\n */\n sendOn?: \"mod-enter\" | \"enter\";\n /** Rendered INSTEAD of the composer — the thread is closed, or read-only for this\n * reader. */\n disabledReason?: ReactNode;\n rows?: number;\n /**\n * The box's hint, over the `placeholder` label — keksdose F9: an admin answering a\n * support ticket is asked something else (\"Reply to Anna…\") than a member adding to\n * their own report, and one provider-wide label cannot say both.\n */\n placeholder?: string;\n /**\n * The draft, controlled — for a host that keeps it itself (saves it per ticket,\n * prefills a template). Left out, the composer keeps its own. Either way a send\n * that resolves clears only what was sent: controlled, that is an\n * `onValueChange(\"\")` the host receives like any keystroke, and only if the draft\n * is still the one that went out.\n */\n value?: string;\n /** Every change to the draft — typing, {@link FeedbackComposerHandle.insertText}, the\n * clear after a send. Required to change a controlled `value`. */\n onValueChange?: (value: string) => void;\n /** {@link FeedbackComposerHandle}: put text into the draft from outside (canned-reply\n * chips) or focus the box. */\n ref?: Ref<FeedbackComposerHandle>;\n labels?: Partial<FeedbackComposerLabels>;\n className?: string;\n}\n\n/**\n * What a {@link FeedbackComposer} `ref` holds.\n *\n * keksdose F9: the support admin answers the same five questions all day and wants\n * chips above the box (\"Thanks, fixed in the next release\") that drop their text in\n * where the caret is. A controlled `value` alone cannot do that well — the host sees\n * the string, not the caret, so it could only append — so the composer, which owns\n * the textarea, does the splice.\n */\nexport interface FeedbackComposerHandle {\n /**\n * Insert `text` at the caret, replacing any selection (the caret the box last had:\n * a click on a chip blurs it, and the selection survives the blur), then focus the\n * box with the caret after the inserted text so the reply can go on. Nothing is\n * added around it — put a space or a newline in `text` if the reply needs one. A\n * no-op while `disabledReason` replaces the box.\n */\n insertText: (text: string) => void;\n focus: () => void;\n}\n\nconst noSubscribe = () => () => {};\nconst isApple = () =>\n typeof navigator !== \"undefined\" && /Mac|iPhone|iPad|iPod/i.test(navigator.platform || navigator.userAgent);\n\n/**\n * The answer box under a {@link FeedbackThread}: a textarea, an optional picture,\n * and Send — Ctrl/⌘+Enter sends, the shortcut the report dialog and the note editor\n * use, so the habit carries across the feature. Plain Enter is a new line: feedback is\n * written in paragraphs, unlike a chat — which `sendOn=\"enter\"` is for (keksdose G5).\n */\nexport function FeedbackComposer({\n onSend,\n pending = false,\n attachment,\n attachmentSlot,\n canSend: canSendProp,\n sendOn = \"mod-enter\",\n disabledReason,\n rows = 3,\n placeholder,\n value,\n onValueChange,\n ref,\n labels: labelsProp,\n className,\n}: FeedbackComposerProps) {\n const labels = useKitLabels(\"feedbackComposer\", DEFAULT_FEEDBACK_COMPOSER_LABELS, labelsProp);\n const [ownDraft, setOwnDraft] = useState(\"\");\n const controlled = value !== undefined;\n const draft = controlled ? value : ownDraft;\n const [file, setFile] = useState<File | null>(null);\n const root = useRef<HTMLDivElement>(null);\n const box = useRef<HTMLTextAreaElement>(null);\n // The draft as of the last commit. The send's `.then` and `insertText` run after\n // renders their closure did not see — text typed while the send was in flight, a\n // second chip clicked before the first one's render — and must not act on a stale\n // string (for a controlled draft there is no updater function to lean on).\n const latest = useRef(draft);\n useLayoutEffect(() => {\n latest.current = draft;\n });\n // Where the caret goes once an inserted text has rendered.\n const caret = useRef<number | null>(null);\n useLayoutEffect(() => {\n const el = box.current;\n if (caret.current === null || !el) return;\n el.focus();\n el.setSelectionRange(caret.current, caret.current);\n caret.current = null;\n });\n\n const setDraft = (next: string) => {\n latest.current = next;\n if (!controlled) setOwnDraft(next);\n onValueChange?.(next);\n };\n\n useImperativeHandle(ref, () => ({\n insertText: (text) => {\n const el = box.current;\n if (!el) return;\n const current = latest.current;\n // A second insert before the first has rendered goes after the first, not at the\n // textarea's not-yet-moved caret. Otherwise the textarea's selection, which may\n // be past the end of a controlled value the host has just shortened: clamp it.\n const pending = caret.current;\n const start = Math.min(pending ?? el.selectionStart ?? current.length, current.length);\n const end = pending ?? Math.max(start, Math.min(el.selectionEnd ?? start, current.length));\n caret.current = start + text.length;\n setDraft(current.slice(0, start) + text + current.slice(end));\n },\n focus: () => box.current?.focus(),\n }));\n // The server snapshot is \"Ctrl\"; the client corrects it after hydration.\n const modifier = useSyncExternalStore(\n noSubscribe,\n () => (isApple() ? \"⌘\" : \"Ctrl\"),\n () => \"Ctrl\",\n );\n\n if (disabledReason != null && disabledReason !== false) {\n return <p className={cn(\"text-xs text-[var(--text-muted)]\", className)}>{disabledReason}</p>;\n }\n\n const canSend = (canSendProp ?? draft.trim().length > 0) && !pending;\n const send = () => {\n if (!canSend) return;\n const sentDraft = draft;\n const sentFile = file;\n Promise.resolve(onSend(draft.trim(), file))\n .then(() => {\n if (latest.current === sentDraft) setDraft(\"\");\n setFile((current) => (current === sentFile ? null : current));\n })\n .catch(() => {});\n };\n\n const config = attachment === true ? {} : attachment || null;\n\n return (\n <div ref={root} className={cn(\"space-y-2\", className)}>\n <Textarea\n rows={rows}\n dir=\"auto\"\n aria-label={labels.field}\n ref={box}\n placeholder={placeholder ?? labels.placeholder}\n value={draft}\n onChange={(event) => setDraft(event.target.value)}\n onKeyDown={(event) => {\n if (event.key !== \"Enter\") return;\n const mod = event.ctrlKey || event.metaKey;\n // Under \"enter\": plain Enter sends, Shift+Enter falls through to the\n // textarea's new line, and an Enter that ends an IME composition is the\n // IME's (keyCode 229 is how Safari reports it after the composition ended).\n const chat =\n sendOn === \"enter\" &&\n !event.shiftKey &&\n !event.altKey &&\n !event.nativeEvent.isComposing &&\n event.keyCode !== 229;\n if (mod || chat) {\n event.preventDefault();\n send();\n }\n }}\n />\n <div className=\"flex flex-wrap items-end justify-between gap-2\">\n {config || attachmentSlot != null ? (\n <div className=\"flex min-w-0 flex-wrap items-end gap-2\">\n {config && (\n <FeedbackAttachmentField\n value={file}\n onChange={setFile}\n labels={config.labels}\n accept={config.accept}\n maxBytes={config.maxBytes}\n onError={config.onError}\n onCaptureScreenshot={config.onCaptureScreenshot}\n // The box is this field's sibling; a paste in it bubbles to `root`.\n pasteFrom={root}\n />\n )}\n {attachmentSlot}\n </div>\n ) : (\n <span />\n )}\n <div className=\"ms-auto flex items-center gap-2\">\n <span className=\"text-xs text-[var(--text-placeholder)]\">\n {sendOn === \"enter\" ? labels.sendHintEnter : labels.sendHint(modifier)}\n </span>\n <Button onClick={send} disabled={!canSend} aria-busy={pending || undefined}>\n {pending ? (\n <Spinner label={null} className=\"size-4\" />\n ) : (\n <Send className=\"size-4 rtl:-scale-x-100\" aria-hidden />\n )}\n {labels.send}\n </Button>\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["index","pending"]}
|
package/dist/feedback.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { DEFAULT_ATTACHMENT_ACCEPT, DEFAULT_FEEDBACK_ATTACHMENT_LABELS, DEFAULT_MAX_ATTACHMENT_BYTES, FeedbackAttachmentField, FeedbackAttachmentFieldLabels, pastedName } from './feedback/feedback-attachment.js';
|
|
2
2
|
export { DEFAULT_FEEDBACK_DIALOG_LABELS, FeedbackAttachmentLabels, FeedbackCategoryOption, FeedbackDialog, FeedbackDialogLabels, FeedbackDialogTextLabels, FeedbackSubmission } from './feedback/feedback-dialog.js';
|
|
3
3
|
export { FEEDBACK_CATEGORY_META, FEEDBACK_CATEGORY_ORDER, FEEDBACK_STATUS_META, FEEDBACK_STATUS_ORDER, FeedbackCategory, FeedbackCategoryBadge, FeedbackDetail, FeedbackDetailSection, FeedbackNoteAttachment, FeedbackNoteEditor, FeedbackProse, FeedbackStatus, FeedbackStatusBadge, FeedbackStatusTransitions, feedbackCategoryRank, nextFeedbackStatus, selectableFeedbackStatuses, visibleFeedbackStatuses } from './feedback/feedback-inbox.js';
|
|
4
|
-
export { DEFAULT_FEEDBACK_COMPOSER_LABELS, DEFAULT_FEEDBACK_THREAD_LABELS, FeedbackComposer, FeedbackComposerAttachment, FeedbackComposerHandle, FeedbackComposerLabels, FeedbackComposerProps, FeedbackThread, FeedbackThreadAttachment, FeedbackThreadLabels, FeedbackThreadMessage, FeedbackThreadProps } from './feedback/feedback-thread.js';
|
|
4
|
+
export { DEFAULT_FEEDBACK_COMPOSER_LABELS, DEFAULT_FEEDBACK_THREAD_LABELS, FeedbackComposer, FeedbackComposerAttachment, FeedbackComposerHandle, FeedbackComposerLabels, FeedbackComposerProps, FeedbackThread, FeedbackThreadAttachment, FeedbackThreadEvent, FeedbackThreadItem, FeedbackThreadLabels, FeedbackThreadMessage, FeedbackThreadProps } from './feedback/feedback-thread.js';
|
|
5
5
|
import 'react';
|
|
6
6
|
import 'lucide-react';
|
package/dist/i18n/locales/de.js
CHANGED
|
@@ -35,7 +35,9 @@ function uiKitLabelsDe(numberLocale = "de-DE") {
|
|
|
35
35
|
placeholder: "Kommentar schreiben\u2026",
|
|
36
36
|
send: "Senden",
|
|
37
37
|
// German keyboards label the key "Strg".
|
|
38
|
-
sendHint: (modifier) => `${modifier === "Ctrl" ? "Strg" : modifier} + Enter zum Senden
|
|
38
|
+
sendHint: (modifier) => `${modifier === "Ctrl" ? "Strg" : modifier} + Enter zum Senden`,
|
|
39
|
+
// "Umschalt", the German key label, as in the table's sort hint.
|
|
40
|
+
sendHintEnter: "Enter zum Senden, Umschalt + Enter f\xFCr neue Zeile"
|
|
39
41
|
},
|
|
40
42
|
accountSettings: {
|
|
41
43
|
profile: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/i18n/locales/de.ts"],"sourcesContent":["import { formatFileSize } from \"../kit-labels\";\nimport type { UiKitLabels } from \"../kit-labels\";\n\n/**\n * The kit's words in German: every namespace of {@link UiKitLabels}, for\n * `<UiKitProvider labels={UI_KIT_LABELS_DE}>`.\n *\n * Self-contained on purpose — nothing but the kit's own `formatFileSize` — so it works\n * as a starting point to copy and adjust. Counts and sizes are formatted with\n * `de-DE` digits; {@link uiKitLabelsDe} takes another number locale\n * (e.g. `\"de-CH\"` for 1’234) without touching the words.\n */\nexport function uiKitLabelsDe(numberLocale = \"de-DE\"): UiKitLabels {\n const num = new Intl.NumberFormat(numberLocale);\n const n = (value: number) => num.format(value);\n\n return {\n feedbackAttachment: {\n attachmentAdd: \"Bild anhängen\",\n attachmentCapture: \"Screenshot aufnehmen\",\n attachmentPaste: \"…oder einen Screenshot aus der Zwischenablage einfügen.\",\n attachmentRemove: \"Anhang entfernen\",\n },\n feedbackDialog: {\n title: \"Feedback senden\",\n category: \"Kategorie\",\n subject: \"Betreff\",\n body: \"Was ist passiert?\",\n attachment: \"Screenshot\",\n submitHint: \"Strg/⌘ + Enter zum Senden\",\n cancel: \"Abbrechen\",\n save: \"Senden\",\n },\n feedbackThread: {\n thread: \"Kommentare\",\n empty: \"Noch keine Kommentare\",\n loading: \"Kommentare werden geladen…\",\n // The reader's own messages. \"Ich\" rather than \"Sie\"/\"Du\": it is the same word in\n // both registers, so the informal catalogue inherits it unchanged.\n you: \"Ich\",\n staff: \"Team\",\n attachments: \"Anhänge\",\n },\n feedbackComposer: {\n field: \"Kommentar schreiben\",\n placeholder: \"Kommentar schreiben…\",\n send: \"Senden\",\n // German keyboards label the key \"Strg\".\n sendHint: (modifier) => `${modifier === \"Ctrl\" ? \"Strg\" : modifier} + Enter zum Senden`,\n },\n accountSettings: {\n profile: {\n title: \"Profil\",\n email: \"E-Mail\",\n role: \"Rolle\",\n memberSince: \"Mitglied seit\",\n displayName: \"Anzeigename\",\n save: \"Speichern\",\n },\n password: {\n title: \"Passwort ändern\",\n current: \"Aktuelles Passwort\",\n next: \"Neues Passwort\",\n confirm: \"Neues Passwort bestätigen\",\n submit: \"Passwort ändern\",\n tooShort: \"Das neue Passwort ist zu kurz.\",\n mismatch: \"Die Passwörter stimmen nicht überein.\",\n },\n twoFactor: {\n status: \"Zwei-Faktor-Authentifizierung\",\n enabledText: \"Aktiv\",\n disabledText: \"Inaktiv\",\n enable: \"Zwei-Faktor-Authentifizierung einrichten\",\n scanHint: \"Diesen Code mit der Authenticator-App scannen und den angezeigten Code eingeben.\",\n codeLabel: \"Bestätigungscode\",\n verify: \"Bestätigen und aktivieren\",\n disableSection: \"Zwei-Faktor-Authentifizierung deaktivieren\",\n password: \"Aktuelles Passwort\",\n disable: \"Deaktivieren\",\n qrAlt: \"QR-Code für die Authenticator-App\",\n secretHint: \"Scannen nicht möglich? Stattdessen diesen Schlüssel in der App eingeben:\",\n copySecret: \"Schlüssel kopieren\",\n },\n passkeys: {\n title: \"Passkeys\",\n description: \"Mit Fingerabdruck, Gesichtserkennung oder Geräte-PIN statt Passwort anmelden.\",\n empty: \"Noch keine Passkeys\",\n loading: \"Passkeys werden geladen…\",\n list: \"Registrierte Passkeys\",\n nameLabel: \"Name (optional)\",\n namePlaceholder: \"z. B. Laptop, Handy\",\n add: \"Passkey hinzufügen\",\n adding: \"Warten auf das Gerät…\",\n rename: \"Umbenennen\",\n renameItem: (name) => `${name} umbenennen`,\n renameField: (name) => `Neuer Name für ${name}`,\n save: \"Speichern\",\n cancel: \"Abbrechen\",\n delete: \"Löschen\",\n deleteItem: (name) => `${name} löschen`,\n deleteConfirm: (name) => `„${name}“ löschen? Eine Anmeldung damit ist dann nicht mehr möglich.`,\n confirmDelete: \"Passkey löschen\",\n created: (date) => `Hinzugefügt am ${date}`,\n lastUsed: (date) => `Zuletzt verwendet am ${date}`,\n neverUsed: \"Noch nie verwendet\",\n },\n },\n measuredGrid: {\n view: \"Tabellenansicht\",\n cellsView: \"Zellen\",\n textView: \"Text\",\n addRow: \"Zeile hinzufügen\",\n removeRow: (row) => `Zeile ${row} entfernen`,\n clear: \"Tabelle leeren\",\n pasteHint: \"Einen Block aus einer Tabellenkalkulation in eine beliebige Zelle einfügen\",\n cell: (column, row) => `${column}, Zeile ${row}`,\n rowNumber: \"Zeile\",\n rowActions: \"Zeilenaktionen\",\n keyboardHint:\n \"Pfeiltasten wechseln zwischen Zellen. Tippen ersetzt eine Zelle, F2 bearbeitet sie, Escape macht die Bearbeitung rückgängig. Enter geht nach unten und fügt am Ende eine Zeile hinzu.\",\n lineError: (line) => `Zeile ${line} konnte nicht gelesen werden`,\n points: (count) => (count === 1 ? \"1 Punkt\" : `${count} Punkte`),\n problems: (count) =>\n count === 1 ? \"1 Zelle ist keine Zahl\" : `${count} Zellen sind keine Zahlen`,\n },\n pageContents: { title: \"Auf dieser Seite\" },\n common: {\n dismiss: \"Schließen\",\n close: \"Schließen\",\n clear: \"Leeren\",\n search: \"Suchen\",\n done: \"Fertig\",\n cancel: \"Abbrechen\",\n save: \"Speichern\",\n back: \"Zurück\",\n next: \"Weiter\",\n remove: \"Entfernen\",\n loading: \"Wird geladen…\",\n noResults: \"Keine Ergebnisse\",\n fieldValue: (field, value) => `${field}: ${value}`,\n opensInNewTab: \"öffnet in einem neuen Tab\",\n },\n dataTable: {\n columns: \"Spalten\",\n selectAllRows: \"Alle Zeilen auswählen\",\n sortHint: \"Klicken zum Sortieren · Umschalt-Klick für weitere Sortierung\",\n filter: \"Filter\",\n close: \"Schließen\",\n selectRow: \"Zeile auswählen\",\n autoSize: \"Spaltenbreiten anpassen\",\n loading: \"Wird geladen…\",\n filters: \"Filter\",\n // Resets every active filter; \"Alle löschen\" would read as deleting the filters.\n clearAll: \"Alle zurücksetzen\",\n done: \"Fertig\",\n pageSize: \"Zeilen pro Seite\",\n // Sits among 10 / 25 / 50 counting \"Zeilen\", so the plural \"Alle\", not \"Alles\".\n pageSizeAll: \"Alle\",\n prevPage: \"Vorherige Seite\",\n nextPage: \"Nächste Seite\",\n clearFilter: \"Filter zurücksetzen\",\n filterPlaceholder: \"Filtern…\",\n selectFilter: \"Auswählen\",\n selectAll: \"Alle\",\n selectNone: \"Keine\",\n dateFrom: \"Von\",\n dateTo: \"Bis\",\n numberMin: \"Min.\",\n numberMax: \"Max.\",\n numberAbs: \"Betrag\",\n presets: {\n today: \"Heute\",\n yesterday: \"Gestern\",\n this_week: \"Diese Woche\",\n last_week: \"Letzte Woche\",\n last_7_days: \"Letzte 7 Tage\",\n last_30_days: \"Letzte 30 Tage\",\n this_month: \"Dieser Monat\",\n last_month: \"Letzter Monat\",\n last_3_months: \"Letzte 3 Monate\",\n ytd: \"Seit Jahresbeginn\",\n last_year: \"Letztes Jahr\",\n },\n table: \"Datentabelle\",\n filterResults: (shown, total) =>\n `${n(shown)} von ${n(total)} ${total === 1 ? \"Zeile\" : \"Zeilen\"}`,\n sortedAscending: (column) => `Sortiert nach ${column}, aufsteigend`,\n sortedDescending: (column) => `Sortiert nach ${column}, absteigend`,\n sortCleared: (column) => `Sortierung nach ${column} aufgehoben`,\n pageChanged: (page, totalPages) => `Seite ${n(page)} von ${n(totalPages)}`,\n pageRange: (from, to, total) => `${n(from)}–${n(to)} / ${n(total)}`,\n rowCount: (total) => n(total),\n columnsCount: (visible, total) => `Spalten (${n(visible)}/${n(total)})`,\n empty: \"Keine Einträge\",\n actions: \"Aktionen\",\n edit: \"Bearbeiten\",\n delete: \"Löschen\",\n booleanTrue: \"Ja\",\n booleanFalse: \"Nein\",\n booleanUnset: \"Nicht festgelegt\",\n },\n miniCalendar: {\n previousMonth: \"Vorheriger Monat\",\n nextMonth: \"Nächster Monat\",\n // Already formatted in the provider's locale (\"Montag, 14. September 2026\").\n day: (date) => date,\n chooseStart: \"Startdatum wählen\",\n chooseEnd: \"Enddatum wählen\",\n startSelected: (date) => `${date} als Startdatum gewählt. Wählen Sie jetzt ein Enddatum.`,\n rangeSelected: (from, to) =>\n `Zeitraum ${from} bis ${to} gewählt. Wählen Sie ein Startdatum, um neu zu beginnen.`,\n },\n calendarHeatmap: {\n grid: \"Tageswerte\",\n day: (date, value) => `${date}: ${value}`,\n less: \"Weniger\",\n more: \"Mehr\",\n truncated: (count) =>\n `Die neuesten Tage werden angezeigt; ${n(count)} ${count === 1 ? \"früherer Tag wird\" : \"frühere Tage werden\"} nicht angezeigt.`,\n },\n datePicker: {\n apply: \"Übernehmen\",\n cancel: \"Abbrechen\",\n presets: \"Schnellauswahl\",\n panel: \"Datum wählen\",\n rangePanel: \"Zeitraum wählen\",\n clear: \"Leeren\",\n previousDay: \"Vorheriger Tag\",\n nextDay: \"Nächster Tag\",\n today: \"Heute\",\n },\n monthPicker: {\n previousYear: \"Vorheriges Jahr\",\n nextYear: \"Nächstes Jahr\",\n panel: \"Monat wählen\",\n month: (monthYear) => monthYear,\n previousMonth: \"Vorheriger Monat\",\n nextMonth: \"Nächster Monat\",\n today: \"Heute\",\n },\n popover: {\n panel: \"Aufklappfenster\",\n },\n combobox: {\n search: \"Suchen\",\n noResults: \"Keine Ergebnisse\",\n clear: \"Leeren\",\n loading: \"Wird geladen…\",\n create: (query) => `„${query}“ anlegen`,\n selectedCount: (count) => `${n(count)} ausgewählt`,\n loadError: \"Ergebnisse konnten nicht geladen werden\",\n resultCount: (count) => `${n(count)} ${count === 1 ? \"Ergebnis\" : \"Ergebnisse\"}`,\n // \"Zeichen\" is the same in singular and plural.\n minChars: (count) => `Mindestens ${n(count)} Zeichen eingeben`,\n },\n multiSelect: {\n search: \"Suchen\",\n selectAll: \"Alle auswählen\",\n clear: \"Leeren\",\n all: \"Alle\",\n // The bare count, as in English: the trigger has always shown just the number.\n selectedCount: (count) => n(count),\n },\n calculator: {\n open: \"Taschenrechner öffnen\",\n panel: \"Taschenrechner\",\n calculation: \"Rechnung\",\n backspace: \"Rücktaste\",\n clear: \"Löschen\",\n equals: \"Ist gleich\",\n done: \"Fertig\",\n plus: \"Plus\",\n minus: \"Minus\",\n times: \"Mal\",\n divide: \"Geteilt durch\",\n decimal: \"Dezimaltrennzeichen\",\n },\n currency: {\n currency: \"Währung\",\n search: \"Währung suchen\",\n },\n chipInput: {\n // The value is arbitrary user text, quoted as a citation, so the participle agrees\n // with the implied \"Eintrag\" whatever the chip says.\n added: (value) => `„${value}“ hinzugefügt`,\n removed: (value) => `„${value}“ entfernt`,\n remove: \"Entfernen\",\n // `von` governs the dative, visible only in the plural: \"von 1 Eintrag\", \"von 2 Einträgen\".\n atLimit: (max) => `Grenze von ${n(max)} ${max === 1 ? \"Eintrag\" : \"Einträgen\"} erreicht`,\n duplicate: (value) => `„${value}“ steht bereits in der Liste`,\n },\n swatchPicker: {\n none: \"Keine Farbe\",\n mixed: \"Gemischt: Die ausgewählten Elemente haben unterschiedliche Farben\",\n },\n iconPicker: {\n none: \"Kein Symbol\",\n mixed: \"Gemischt: Die ausgewählten Elemente haben unterschiedliche Symbole\",\n search: \"Symbole suchen\",\n noResults: \"Keine passenden Symbole\",\n resultCount: (count) => `${n(count)} ${count === 1 ? \"Symbol\" : \"Symbole\"}`,\n },\n fieldSync: {\n synced: \"Gespeichert\",\n edited: \"Nicht gespeicherte Änderungen\",\n pending: \"Wird gespeichert…\",\n error: \"Speichern fehlgeschlagen\",\n retry: \"Erneut versuchen\",\n },\n passwordReveal: {\n show: \"Passwort anzeigen\",\n hide: \"Passwort verbergen\",\n },\n dangerConfirm: {\n arm: \"Löschen…\",\n confirm: \"Löschen\",\n cancel: \"Abbrechen\",\n prompt: \"Dies kann nicht rückgängig gemacht werden.\",\n password: \"Passwort\",\n phrase: (phrase) => `Geben Sie zur Bestätigung „${phrase}“ ein`,\n },\n tabs: {\n // \"Tab\" is what German UIs say; \"Registerkarte\" reads like a 1990s manual.\n add: \"Tab hinzufügen\",\n remove: (tab) => `${tab} entfernen`,\n },\n appShell: {\n collapse: \"Seitenleiste einklappen\",\n expand: \"Seitenleiste ausklappen\",\n toggleGroup: (groupLabel) => `${groupLabel}: Seiten`,\n },\n topBar: {\n theme: \"Theme wechseln\",\n palette: \"Darstellungsvorlage\",\n language: \"Sprache\",\n switchRole: \"Rolle wechseln\",\n role: (value) => `Rolle: ${value}`,\n },\n pickerSheet: {\n close: \"Schließen\",\n },\n dialogFrame: {\n close: \"Schließen\",\n },\n bulkActionBar: {\n selected: (count) => `${n(count)} ausgewählt`,\n clear: \"Auswahl aufheben\",\n cleared: \"Auswahl aufgehoben\",\n },\n swipeableRow: {\n actions: \"Zeilenaktionen\",\n },\n file: {\n // The kit's own `Intl` unit formatting, pinned to this locale (\"3,4 MB\").\n size: (bytes) => formatFileSize(bytes, numberLocale),\n },\n filePicker: {\n dropzone: \"Datei-Upload\",\n browse: \"Durchsuchen\",\n empty: \"Datei hier ablegen\",\n emptyMultiple: \"Dateien hier ablegen\",\n hint: (accept) => (accept ? `Erlaubt: ${accept}` : \"Beliebiger Dateityp\"),\n busy: \"Wird hochgeladen…\",\n rejectedPick: (count) =>\n count === 1\n ? \"Die Datei wurde nicht hinzugefügt\"\n : `Keine der ${count} Dateien wurde hinzugefügt`,\n rejectedType: (name) => `„${name}“ hat einen nicht unterstützten Dateityp`,\n rejectedTypeOnly: (accept) => `Nur ${accept}-Dateien`,\n rejectedSize: (name, maxSize) => `„${name}“ ist größer als ${maxSize}`,\n rejectedCount: (name, maxFiles) =>\n `„${name}“ wurde nicht hinzugefügt: höchstens ${n(maxFiles)} ${maxFiles === 1 ? \"Datei\" : \"Dateien\"}`,\n rejectedInvalid: (name) => `„${name}“ kann hier nicht verwendet werden`,\n rejectedMany: (count) =>\n count === 1\n ? \"1 Datei wurde nicht hinzugefügt\"\n : `${n(count)} Dateien wurden nicht hinzugefügt`,\n selected: (count, firstName) =>\n count === 1 ? `„${firstName}“ ausgewählt` : `${n(count)} Dateien ausgewählt`,\n remove: (name) => `„${name}“ entfernen`,\n clearAll: \"Alle Dateien entfernen\",\n removed: (name) => `„${name}“ entfernt`,\n cleared: \"Alle Dateien entfernt\",\n },\n wizard: {\n done: \"Fertig\",\n cancel: \"Abbrechen\",\n back: \"Zurück\",\n next: \"Weiter\",\n skip: \"Überspringen\",\n finish: \"Abschließen\",\n submitting: \"Wird erstellt…\",\n steps: \"Schritte\",\n step: (current, total) => `Schritt ${n(current)} von ${n(total)}`,\n cancelTitle: \"Formular verwerfen?\",\n confirmCancel: \"Ihre Eingaben gehen verloren.\",\n cancelConfirmLabel: \"Verwerfen\",\n cancelDismissLabel: \"Weiter bearbeiten\",\n reviewTitle: \"Überprüfen\",\n edit: \"Bearbeiten\",\n missingRequired: \"Bitte füllen Sie alle Pflichtfelder aus.\",\n genericError: \"Ein Fehler ist aufgetreten\",\n },\n tour: {\n next: \"Weiter\",\n back: \"Zurück\",\n skip: \"Überspringen\",\n done: \"Fertig\",\n awaitClickHint: \"Klicken Sie auf das hervorgehobene Element, um fortzufahren\",\n step: (current, total) => `${n(current)} / ${n(total)}`,\n },\n commandPalette: {\n clear: \"Suche löschen\",\n submit: \"Suchen\",\n close: \"Schließen\",\n placeholder: \"Suchen…\",\n empty: \"Keine Ergebnisse\",\n loading: \"Wird gesucht…\",\n dialog: \"Suche\",\n error: \"Die Suche ist fehlgeschlagen. Bitte erneut versuchen.\",\n },\n globalSearch: {\n trigger: \"Suche\",\n placeholder: \"Suchen oder springen zu…\",\n shortcut: (keys) => `Suche (${keys})`,\n suggestions: \"Vorschläge\",\n results: \"Ergebnisse\",\n },\n sparkline: {\n rising: (first, last) => `Steigend von ${first} auf ${last}`,\n falling: (first, last) => `Fallend von ${first} auf ${last}`,\n flat: (value) => `Unverändert bei ${value}`,\n single: (value) => `Ein Wert: ${value}`,\n noData: \"Keine Daten\",\n named: (name, summary) => `${name}: ${summary}`,\n },\n statTile: {\n // `amount` arrives formatted and unsigned (\"5 %\", \"1.200 €\").\n increase: (amount) => `Um ${amount} gestiegen`,\n decrease: (amount) => `Um ${amount} gesunken`,\n unchanged: \"Keine Veränderung\",\n better: (change) => `${change} (besser)`,\n worse: (change) => `${change} (schlechter)`,\n noValue: \"Keine Daten\",\n loading: \"Wird geladen…\",\n },\n signaturePad: {\n label: \"Unterschrift\",\n instructions: \"Unterschreiben Sie im Feld mit der Maus, dem Finger oder einem Stift.\",\n typedFallbackHint: \"Wenn Sie nicht zeichnen können, geben Sie stattdessen Ihren Namen ein.\",\n empty: \"Noch nichts gezeichnet\",\n signed: \"Unterschrift gezeichnet\",\n undo: \"Letzten Strich rückgängig machen\",\n clear: \"Leeren\",\n save: \"Unterschrift speichern\",\n useTyped: \"Stattdessen Namen eingeben\",\n useDrawn: \"Stattdessen zeichnen\",\n typedName: \"Vollständiger Name\",\n cleared: \"Unterschrift gelöscht\",\n undone: \"Letzter Strich entfernt\",\n viewEmpty: \"Nicht unterschrieben\",\n viewDrawn: \"Handschriftliche Unterschrift\",\n viewTyped: (name) => `Unterschrieben mit dem eingegebenen Namen ${name}`,\n },\n passwordStrength: {\n tooShort: \"Zu kurz\",\n weak: \"Schwach\",\n fair: \"Mittel\",\n good: \"Gut\",\n strong: \"Stark\",\n announcement: (level) => `Passwortstärke: ${level}`,\n // \"Zeichen\" is the same in singular and plural. The English default does not\n // format these counts, so neither does this file.\n ruleLength: (minLength) => `Mindestens ${minLength} Zeichen`,\n ruleCase: \"Groß- und Kleinbuchstaben\",\n ruleDigit: \"Eine Ziffer\",\n ruleSymbol: \"Ein Sonderzeichen\",\n optional: (rule) => `${rule} (optional)`,\n met: \"Erfüllt:\",\n notMet: \"Nicht erfüllt:\",\n tooLong: (maxBytes) =>\n `Höchstens ${maxBytes} Zeichen (Buchstaben mit Akzent und Emojis zählen mehrfach).`,\n },\n seriesChart: {\n resetZoom: \"Zoom zurücksetzen\",\n zoomHint:\n \"Zum Zoomen ziehen: Eine annähernd quadratische Auswahl zoomt beide Achsen, eine lange, schmale nur ihre eigene. Doppelklick setzt zurück.\",\n empty: \"Keine Daten\",\n legend: \"Datenreihen\",\n points: \"Diagrammwerte\",\n },\n pieChart: {\n slices: \"Diagrammsegmente\",\n slice: (label, value, percent) => `${label}: ${value} (${percent})`,\n total: \"Gesamt\",\n empty: \"Keine Daten\",\n legend: \"Kategorien\",\n },\n confirmDialog: {\n confirm: \"Bestätigen\",\n cancel: \"Abbrechen\",\n },\n floatingPanel: {\n close: \"Schließen\",\n badge: (count) => `${n(count)} neu`,\n },\n copyButton: {\n copy: \"Kopieren\",\n copied: \"Kopiert\",\n failed: \"Kopieren fehlgeschlagen\",\n copiedAnnouncement: \"In die Zwischenablage kopiert\",\n failedAnnouncement: \"Kopieren in die Zwischenablage fehlgeschlagen\",\n },\n list: {\n unread: \"Ungelesen\",\n opensInNewTab: \"öffnet in einem neuen Tab\",\n },\n breadcrumbs: {\n label: \"Brotkrümelnavigation\",\n showAll: \"Vollständigen Pfad anzeigen\",\n },\n toast: {\n close: \"Benachrichtigung schließen\",\n notifications: \"Benachrichtigungen\",\n undo: \"Rückgängig\",\n redo: \"Wiederholen\",\n },\n form: {\n save: \"Speichern\",\n cancel: \"Abbrechen\",\n },\n descriptionList: {\n empty: \"—\",\n },\n lineItems: {\n add: \"Zeile hinzufügen\",\n remove: (row) => `Zeile ${row} entfernen`,\n confirmRemove: (row) => `Zeile ${row} entfernen? Zum Bestätigen erneut drücken`,\n row: (row) => `Zeile ${row}`,\n cell: (column, row) => `${column}, Zeile ${row}`,\n totals: \"Summe\",\n },\n progressBar: {\n unlimited: \"Unbegrenzt\",\n overLimit: (amount) => `${amount} über dem Limit`,\n },\n signedAmount: {\n positive: (amount) => `plus ${amount}`,\n negative: (amount) => `minus ${amount}`,\n },\n errorBoundary: {\n title: \"Etwas ist schiefgelaufen\",\n message: \"Dieser Teil der Seite konnte nicht angezeigt werden. Bitte erneut versuchen oder die Seite neu laden.\",\n retry: \"Erneut versuchen\",\n details: \"Fehlerdetails\",\n reload: \"Neu laden\",\n updateTitle: \"Eine neue Version ist verfügbar\",\n updateMessage: \"Ein Teil der App hat sich seit dem Laden dieser Seite geändert. Zum Aktualisieren die Seite neu laden.\",\n offlineTitle: \"Keine Internetverbindung\",\n offlineMessage: \"Diese Seite konnte ohne Verbindung nicht geladen werden. Nach dem Wiederherstellen der Verbindung die Seite neu laden.\",\n copyReport: \"Fehlerbericht kopieren\",\n reported: \"Der Fehler wurde automatisch gemeldet.\",\n reportedAs: (reference) => `Gemeldet unter ${reference}`,\n },\n authedImage: {\n loading: \"Bild wird geladen…\",\n loadError: \"Bild konnte nicht geladen werden\",\n failedImage: (alt) => `${alt}: Bild konnte nicht geladen werden`,\n },\n imageGrid: {\n list: \"Bilder\",\n item: (index, count) => `Bild ${n(index)} von ${n(count)}`,\n actions: (name) => `Aktionen für ${name}`,\n },\n lightbox: {\n dialog: \"Bildansicht\",\n close: \"Schließen\",\n previous: \"Vorheriges Bild\",\n next: \"Nächstes Bild\",\n counter: (index, count) => `${n(index)} / ${n(count)}`,\n position: (index, count) => `Bild ${n(index)} von ${n(count)}`,\n download: \"Herunterladen\",\n zoom: \"Zoomen\",\n noPreview: \"Für diese Datei ist keine Vorschau verfügbar\",\n openInNewTab: \"In neuem Tab öffnen\",\n },\n };\n}\n\nexport const UI_KIT_LABELS_DE: UiKitLabels = uiKitLabelsDe();\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/i18n/locales/de.ts"],"sourcesContent":["import { formatFileSize } from \"../kit-labels\";\nimport type { UiKitLabels } from \"../kit-labels\";\n\n/**\n * The kit's words in German: every namespace of {@link UiKitLabels}, for\n * `<UiKitProvider labels={UI_KIT_LABELS_DE}>`.\n *\n * Self-contained on purpose — nothing but the kit's own `formatFileSize` — so it works\n * as a starting point to copy and adjust. Counts and sizes are formatted with\n * `de-DE` digits; {@link uiKitLabelsDe} takes another number locale\n * (e.g. `\"de-CH\"` for 1’234) without touching the words.\n */\nexport function uiKitLabelsDe(numberLocale = \"de-DE\"): UiKitLabels {\n const num = new Intl.NumberFormat(numberLocale);\n const n = (value: number) => num.format(value);\n\n return {\n feedbackAttachment: {\n attachmentAdd: \"Bild anhängen\",\n attachmentCapture: \"Screenshot aufnehmen\",\n attachmentPaste: \"…oder einen Screenshot aus der Zwischenablage einfügen.\",\n attachmentRemove: \"Anhang entfernen\",\n },\n feedbackDialog: {\n title: \"Feedback senden\",\n category: \"Kategorie\",\n subject: \"Betreff\",\n body: \"Was ist passiert?\",\n attachment: \"Screenshot\",\n submitHint: \"Strg/⌘ + Enter zum Senden\",\n cancel: \"Abbrechen\",\n save: \"Senden\",\n },\n feedbackThread: {\n thread: \"Kommentare\",\n empty: \"Noch keine Kommentare\",\n loading: \"Kommentare werden geladen…\",\n // The reader's own messages. \"Ich\" rather than \"Sie\"/\"Du\": it is the same word in\n // both registers, so the informal catalogue inherits it unchanged.\n you: \"Ich\",\n staff: \"Team\",\n attachments: \"Anhänge\",\n },\n feedbackComposer: {\n field: \"Kommentar schreiben\",\n placeholder: \"Kommentar schreiben…\",\n send: \"Senden\",\n // German keyboards label the key \"Strg\".\n sendHint: (modifier) => `${modifier === \"Ctrl\" ? \"Strg\" : modifier} + Enter zum Senden`,\n // \"Umschalt\", the German key label, as in the table's sort hint.\n sendHintEnter: \"Enter zum Senden, Umschalt + Enter für neue Zeile\",\n },\n accountSettings: {\n profile: {\n title: \"Profil\",\n email: \"E-Mail\",\n role: \"Rolle\",\n memberSince: \"Mitglied seit\",\n displayName: \"Anzeigename\",\n save: \"Speichern\",\n },\n password: {\n title: \"Passwort ändern\",\n current: \"Aktuelles Passwort\",\n next: \"Neues Passwort\",\n confirm: \"Neues Passwort bestätigen\",\n submit: \"Passwort ändern\",\n tooShort: \"Das neue Passwort ist zu kurz.\",\n mismatch: \"Die Passwörter stimmen nicht überein.\",\n },\n twoFactor: {\n status: \"Zwei-Faktor-Authentifizierung\",\n enabledText: \"Aktiv\",\n disabledText: \"Inaktiv\",\n enable: \"Zwei-Faktor-Authentifizierung einrichten\",\n scanHint: \"Diesen Code mit der Authenticator-App scannen und den angezeigten Code eingeben.\",\n codeLabel: \"Bestätigungscode\",\n verify: \"Bestätigen und aktivieren\",\n disableSection: \"Zwei-Faktor-Authentifizierung deaktivieren\",\n password: \"Aktuelles Passwort\",\n disable: \"Deaktivieren\",\n qrAlt: \"QR-Code für die Authenticator-App\",\n secretHint: \"Scannen nicht möglich? Stattdessen diesen Schlüssel in der App eingeben:\",\n copySecret: \"Schlüssel kopieren\",\n },\n passkeys: {\n title: \"Passkeys\",\n description: \"Mit Fingerabdruck, Gesichtserkennung oder Geräte-PIN statt Passwort anmelden.\",\n empty: \"Noch keine Passkeys\",\n loading: \"Passkeys werden geladen…\",\n list: \"Registrierte Passkeys\",\n nameLabel: \"Name (optional)\",\n namePlaceholder: \"z. B. Laptop, Handy\",\n add: \"Passkey hinzufügen\",\n adding: \"Warten auf das Gerät…\",\n rename: \"Umbenennen\",\n renameItem: (name) => `${name} umbenennen`,\n renameField: (name) => `Neuer Name für ${name}`,\n save: \"Speichern\",\n cancel: \"Abbrechen\",\n delete: \"Löschen\",\n deleteItem: (name) => `${name} löschen`,\n deleteConfirm: (name) => `„${name}“ löschen? Eine Anmeldung damit ist dann nicht mehr möglich.`,\n confirmDelete: \"Passkey löschen\",\n created: (date) => `Hinzugefügt am ${date}`,\n lastUsed: (date) => `Zuletzt verwendet am ${date}`,\n neverUsed: \"Noch nie verwendet\",\n },\n },\n measuredGrid: {\n view: \"Tabellenansicht\",\n cellsView: \"Zellen\",\n textView: \"Text\",\n addRow: \"Zeile hinzufügen\",\n removeRow: (row) => `Zeile ${row} entfernen`,\n clear: \"Tabelle leeren\",\n pasteHint: \"Einen Block aus einer Tabellenkalkulation in eine beliebige Zelle einfügen\",\n cell: (column, row) => `${column}, Zeile ${row}`,\n rowNumber: \"Zeile\",\n rowActions: \"Zeilenaktionen\",\n keyboardHint:\n \"Pfeiltasten wechseln zwischen Zellen. Tippen ersetzt eine Zelle, F2 bearbeitet sie, Escape macht die Bearbeitung rückgängig. Enter geht nach unten und fügt am Ende eine Zeile hinzu.\",\n lineError: (line) => `Zeile ${line} konnte nicht gelesen werden`,\n points: (count) => (count === 1 ? \"1 Punkt\" : `${count} Punkte`),\n problems: (count) =>\n count === 1 ? \"1 Zelle ist keine Zahl\" : `${count} Zellen sind keine Zahlen`,\n },\n pageContents: { title: \"Auf dieser Seite\" },\n common: {\n dismiss: \"Schließen\",\n close: \"Schließen\",\n clear: \"Leeren\",\n search: \"Suchen\",\n done: \"Fertig\",\n cancel: \"Abbrechen\",\n save: \"Speichern\",\n back: \"Zurück\",\n next: \"Weiter\",\n remove: \"Entfernen\",\n loading: \"Wird geladen…\",\n noResults: \"Keine Ergebnisse\",\n fieldValue: (field, value) => `${field}: ${value}`,\n opensInNewTab: \"öffnet in einem neuen Tab\",\n },\n dataTable: {\n columns: \"Spalten\",\n selectAllRows: \"Alle Zeilen auswählen\",\n sortHint: \"Klicken zum Sortieren · Umschalt-Klick für weitere Sortierung\",\n filter: \"Filter\",\n close: \"Schließen\",\n selectRow: \"Zeile auswählen\",\n autoSize: \"Spaltenbreiten anpassen\",\n loading: \"Wird geladen…\",\n filters: \"Filter\",\n // Resets every active filter; \"Alle löschen\" would read as deleting the filters.\n clearAll: \"Alle zurücksetzen\",\n done: \"Fertig\",\n pageSize: \"Zeilen pro Seite\",\n // Sits among 10 / 25 / 50 counting \"Zeilen\", so the plural \"Alle\", not \"Alles\".\n pageSizeAll: \"Alle\",\n prevPage: \"Vorherige Seite\",\n nextPage: \"Nächste Seite\",\n clearFilter: \"Filter zurücksetzen\",\n filterPlaceholder: \"Filtern…\",\n selectFilter: \"Auswählen\",\n selectAll: \"Alle\",\n selectNone: \"Keine\",\n dateFrom: \"Von\",\n dateTo: \"Bis\",\n numberMin: \"Min.\",\n numberMax: \"Max.\",\n numberAbs: \"Betrag\",\n presets: {\n today: \"Heute\",\n yesterday: \"Gestern\",\n this_week: \"Diese Woche\",\n last_week: \"Letzte Woche\",\n last_7_days: \"Letzte 7 Tage\",\n last_30_days: \"Letzte 30 Tage\",\n this_month: \"Dieser Monat\",\n last_month: \"Letzter Monat\",\n last_3_months: \"Letzte 3 Monate\",\n ytd: \"Seit Jahresbeginn\",\n last_year: \"Letztes Jahr\",\n },\n table: \"Datentabelle\",\n filterResults: (shown, total) =>\n `${n(shown)} von ${n(total)} ${total === 1 ? \"Zeile\" : \"Zeilen\"}`,\n sortedAscending: (column) => `Sortiert nach ${column}, aufsteigend`,\n sortedDescending: (column) => `Sortiert nach ${column}, absteigend`,\n sortCleared: (column) => `Sortierung nach ${column} aufgehoben`,\n pageChanged: (page, totalPages) => `Seite ${n(page)} von ${n(totalPages)}`,\n pageRange: (from, to, total) => `${n(from)}–${n(to)} / ${n(total)}`,\n rowCount: (total) => n(total),\n columnsCount: (visible, total) => `Spalten (${n(visible)}/${n(total)})`,\n empty: \"Keine Einträge\",\n actions: \"Aktionen\",\n edit: \"Bearbeiten\",\n delete: \"Löschen\",\n booleanTrue: \"Ja\",\n booleanFalse: \"Nein\",\n booleanUnset: \"Nicht festgelegt\",\n },\n miniCalendar: {\n previousMonth: \"Vorheriger Monat\",\n nextMonth: \"Nächster Monat\",\n // Already formatted in the provider's locale (\"Montag, 14. September 2026\").\n day: (date) => date,\n chooseStart: \"Startdatum wählen\",\n chooseEnd: \"Enddatum wählen\",\n startSelected: (date) => `${date} als Startdatum gewählt. Wählen Sie jetzt ein Enddatum.`,\n rangeSelected: (from, to) =>\n `Zeitraum ${from} bis ${to} gewählt. Wählen Sie ein Startdatum, um neu zu beginnen.`,\n },\n calendarHeatmap: {\n grid: \"Tageswerte\",\n day: (date, value) => `${date}: ${value}`,\n less: \"Weniger\",\n more: \"Mehr\",\n truncated: (count) =>\n `Die neuesten Tage werden angezeigt; ${n(count)} ${count === 1 ? \"früherer Tag wird\" : \"frühere Tage werden\"} nicht angezeigt.`,\n },\n datePicker: {\n apply: \"Übernehmen\",\n cancel: \"Abbrechen\",\n presets: \"Schnellauswahl\",\n panel: \"Datum wählen\",\n rangePanel: \"Zeitraum wählen\",\n clear: \"Leeren\",\n previousDay: \"Vorheriger Tag\",\n nextDay: \"Nächster Tag\",\n today: \"Heute\",\n },\n monthPicker: {\n previousYear: \"Vorheriges Jahr\",\n nextYear: \"Nächstes Jahr\",\n panel: \"Monat wählen\",\n month: (monthYear) => monthYear,\n previousMonth: \"Vorheriger Monat\",\n nextMonth: \"Nächster Monat\",\n today: \"Heute\",\n },\n popover: {\n panel: \"Aufklappfenster\",\n },\n combobox: {\n search: \"Suchen\",\n noResults: \"Keine Ergebnisse\",\n clear: \"Leeren\",\n loading: \"Wird geladen…\",\n create: (query) => `„${query}“ anlegen`,\n selectedCount: (count) => `${n(count)} ausgewählt`,\n loadError: \"Ergebnisse konnten nicht geladen werden\",\n resultCount: (count) => `${n(count)} ${count === 1 ? \"Ergebnis\" : \"Ergebnisse\"}`,\n // \"Zeichen\" is the same in singular and plural.\n minChars: (count) => `Mindestens ${n(count)} Zeichen eingeben`,\n },\n multiSelect: {\n search: \"Suchen\",\n selectAll: \"Alle auswählen\",\n clear: \"Leeren\",\n all: \"Alle\",\n // The bare count, as in English: the trigger has always shown just the number.\n selectedCount: (count) => n(count),\n },\n calculator: {\n open: \"Taschenrechner öffnen\",\n panel: \"Taschenrechner\",\n calculation: \"Rechnung\",\n backspace: \"Rücktaste\",\n clear: \"Löschen\",\n equals: \"Ist gleich\",\n done: \"Fertig\",\n plus: \"Plus\",\n minus: \"Minus\",\n times: \"Mal\",\n divide: \"Geteilt durch\",\n decimal: \"Dezimaltrennzeichen\",\n },\n currency: {\n currency: \"Währung\",\n search: \"Währung suchen\",\n },\n chipInput: {\n // The value is arbitrary user text, quoted as a citation, so the participle agrees\n // with the implied \"Eintrag\" whatever the chip says.\n added: (value) => `„${value}“ hinzugefügt`,\n removed: (value) => `„${value}“ entfernt`,\n remove: \"Entfernen\",\n // `von` governs the dative, visible only in the plural: \"von 1 Eintrag\", \"von 2 Einträgen\".\n atLimit: (max) => `Grenze von ${n(max)} ${max === 1 ? \"Eintrag\" : \"Einträgen\"} erreicht`,\n duplicate: (value) => `„${value}“ steht bereits in der Liste`,\n },\n swatchPicker: {\n none: \"Keine Farbe\",\n mixed: \"Gemischt: Die ausgewählten Elemente haben unterschiedliche Farben\",\n },\n iconPicker: {\n none: \"Kein Symbol\",\n mixed: \"Gemischt: Die ausgewählten Elemente haben unterschiedliche Symbole\",\n search: \"Symbole suchen\",\n noResults: \"Keine passenden Symbole\",\n resultCount: (count) => `${n(count)} ${count === 1 ? \"Symbol\" : \"Symbole\"}`,\n },\n fieldSync: {\n synced: \"Gespeichert\",\n edited: \"Nicht gespeicherte Änderungen\",\n pending: \"Wird gespeichert…\",\n error: \"Speichern fehlgeschlagen\",\n retry: \"Erneut versuchen\",\n },\n passwordReveal: {\n show: \"Passwort anzeigen\",\n hide: \"Passwort verbergen\",\n },\n dangerConfirm: {\n arm: \"Löschen…\",\n confirm: \"Löschen\",\n cancel: \"Abbrechen\",\n prompt: \"Dies kann nicht rückgängig gemacht werden.\",\n password: \"Passwort\",\n phrase: (phrase) => `Geben Sie zur Bestätigung „${phrase}“ ein`,\n },\n tabs: {\n // \"Tab\" is what German UIs say; \"Registerkarte\" reads like a 1990s manual.\n add: \"Tab hinzufügen\",\n remove: (tab) => `${tab} entfernen`,\n },\n appShell: {\n collapse: \"Seitenleiste einklappen\",\n expand: \"Seitenleiste ausklappen\",\n toggleGroup: (groupLabel) => `${groupLabel}: Seiten`,\n },\n topBar: {\n theme: \"Theme wechseln\",\n palette: \"Darstellungsvorlage\",\n language: \"Sprache\",\n switchRole: \"Rolle wechseln\",\n role: (value) => `Rolle: ${value}`,\n },\n pickerSheet: {\n close: \"Schließen\",\n },\n dialogFrame: {\n close: \"Schließen\",\n },\n bulkActionBar: {\n selected: (count) => `${n(count)} ausgewählt`,\n clear: \"Auswahl aufheben\",\n cleared: \"Auswahl aufgehoben\",\n },\n swipeableRow: {\n actions: \"Zeilenaktionen\",\n },\n file: {\n // The kit's own `Intl` unit formatting, pinned to this locale (\"3,4 MB\").\n size: (bytes) => formatFileSize(bytes, numberLocale),\n },\n filePicker: {\n dropzone: \"Datei-Upload\",\n browse: \"Durchsuchen\",\n empty: \"Datei hier ablegen\",\n emptyMultiple: \"Dateien hier ablegen\",\n hint: (accept) => (accept ? `Erlaubt: ${accept}` : \"Beliebiger Dateityp\"),\n busy: \"Wird hochgeladen…\",\n rejectedPick: (count) =>\n count === 1\n ? \"Die Datei wurde nicht hinzugefügt\"\n : `Keine der ${count} Dateien wurde hinzugefügt`,\n rejectedType: (name) => `„${name}“ hat einen nicht unterstützten Dateityp`,\n rejectedTypeOnly: (accept) => `Nur ${accept}-Dateien`,\n rejectedSize: (name, maxSize) => `„${name}“ ist größer als ${maxSize}`,\n rejectedCount: (name, maxFiles) =>\n `„${name}“ wurde nicht hinzugefügt: höchstens ${n(maxFiles)} ${maxFiles === 1 ? \"Datei\" : \"Dateien\"}`,\n rejectedInvalid: (name) => `„${name}“ kann hier nicht verwendet werden`,\n rejectedMany: (count) =>\n count === 1\n ? \"1 Datei wurde nicht hinzugefügt\"\n : `${n(count)} Dateien wurden nicht hinzugefügt`,\n selected: (count, firstName) =>\n count === 1 ? `„${firstName}“ ausgewählt` : `${n(count)} Dateien ausgewählt`,\n remove: (name) => `„${name}“ entfernen`,\n clearAll: \"Alle Dateien entfernen\",\n removed: (name) => `„${name}“ entfernt`,\n cleared: \"Alle Dateien entfernt\",\n },\n wizard: {\n done: \"Fertig\",\n cancel: \"Abbrechen\",\n back: \"Zurück\",\n next: \"Weiter\",\n skip: \"Überspringen\",\n finish: \"Abschließen\",\n submitting: \"Wird erstellt…\",\n steps: \"Schritte\",\n step: (current, total) => `Schritt ${n(current)} von ${n(total)}`,\n cancelTitle: \"Formular verwerfen?\",\n confirmCancel: \"Ihre Eingaben gehen verloren.\",\n cancelConfirmLabel: \"Verwerfen\",\n cancelDismissLabel: \"Weiter bearbeiten\",\n reviewTitle: \"Überprüfen\",\n edit: \"Bearbeiten\",\n missingRequired: \"Bitte füllen Sie alle Pflichtfelder aus.\",\n genericError: \"Ein Fehler ist aufgetreten\",\n },\n tour: {\n next: \"Weiter\",\n back: \"Zurück\",\n skip: \"Überspringen\",\n done: \"Fertig\",\n awaitClickHint: \"Klicken Sie auf das hervorgehobene Element, um fortzufahren\",\n step: (current, total) => `${n(current)} / ${n(total)}`,\n },\n commandPalette: {\n clear: \"Suche löschen\",\n submit: \"Suchen\",\n close: \"Schließen\",\n placeholder: \"Suchen…\",\n empty: \"Keine Ergebnisse\",\n loading: \"Wird gesucht…\",\n dialog: \"Suche\",\n error: \"Die Suche ist fehlgeschlagen. Bitte erneut versuchen.\",\n },\n globalSearch: {\n trigger: \"Suche\",\n placeholder: \"Suchen oder springen zu…\",\n shortcut: (keys) => `Suche (${keys})`,\n suggestions: \"Vorschläge\",\n results: \"Ergebnisse\",\n },\n sparkline: {\n rising: (first, last) => `Steigend von ${first} auf ${last}`,\n falling: (first, last) => `Fallend von ${first} auf ${last}`,\n flat: (value) => `Unverändert bei ${value}`,\n single: (value) => `Ein Wert: ${value}`,\n noData: \"Keine Daten\",\n named: (name, summary) => `${name}: ${summary}`,\n },\n statTile: {\n // `amount` arrives formatted and unsigned (\"5 %\", \"1.200 €\").\n increase: (amount) => `Um ${amount} gestiegen`,\n decrease: (amount) => `Um ${amount} gesunken`,\n unchanged: \"Keine Veränderung\",\n better: (change) => `${change} (besser)`,\n worse: (change) => `${change} (schlechter)`,\n noValue: \"Keine Daten\",\n loading: \"Wird geladen…\",\n },\n signaturePad: {\n label: \"Unterschrift\",\n instructions: \"Unterschreiben Sie im Feld mit der Maus, dem Finger oder einem Stift.\",\n typedFallbackHint: \"Wenn Sie nicht zeichnen können, geben Sie stattdessen Ihren Namen ein.\",\n empty: \"Noch nichts gezeichnet\",\n signed: \"Unterschrift gezeichnet\",\n undo: \"Letzten Strich rückgängig machen\",\n clear: \"Leeren\",\n save: \"Unterschrift speichern\",\n useTyped: \"Stattdessen Namen eingeben\",\n useDrawn: \"Stattdessen zeichnen\",\n typedName: \"Vollständiger Name\",\n cleared: \"Unterschrift gelöscht\",\n undone: \"Letzter Strich entfernt\",\n viewEmpty: \"Nicht unterschrieben\",\n viewDrawn: \"Handschriftliche Unterschrift\",\n viewTyped: (name) => `Unterschrieben mit dem eingegebenen Namen ${name}`,\n },\n passwordStrength: {\n tooShort: \"Zu kurz\",\n weak: \"Schwach\",\n fair: \"Mittel\",\n good: \"Gut\",\n strong: \"Stark\",\n announcement: (level) => `Passwortstärke: ${level}`,\n // \"Zeichen\" is the same in singular and plural. The English default does not\n // format these counts, so neither does this file.\n ruleLength: (minLength) => `Mindestens ${minLength} Zeichen`,\n ruleCase: \"Groß- und Kleinbuchstaben\",\n ruleDigit: \"Eine Ziffer\",\n ruleSymbol: \"Ein Sonderzeichen\",\n optional: (rule) => `${rule} (optional)`,\n met: \"Erfüllt:\",\n notMet: \"Nicht erfüllt:\",\n tooLong: (maxBytes) =>\n `Höchstens ${maxBytes} Zeichen (Buchstaben mit Akzent und Emojis zählen mehrfach).`,\n },\n seriesChart: {\n resetZoom: \"Zoom zurücksetzen\",\n zoomHint:\n \"Zum Zoomen ziehen: Eine annähernd quadratische Auswahl zoomt beide Achsen, eine lange, schmale nur ihre eigene. Doppelklick setzt zurück.\",\n empty: \"Keine Daten\",\n legend: \"Datenreihen\",\n points: \"Diagrammwerte\",\n },\n pieChart: {\n slices: \"Diagrammsegmente\",\n slice: (label, value, percent) => `${label}: ${value} (${percent})`,\n total: \"Gesamt\",\n empty: \"Keine Daten\",\n legend: \"Kategorien\",\n },\n confirmDialog: {\n confirm: \"Bestätigen\",\n cancel: \"Abbrechen\",\n },\n floatingPanel: {\n close: \"Schließen\",\n badge: (count) => `${n(count)} neu`,\n },\n copyButton: {\n copy: \"Kopieren\",\n copied: \"Kopiert\",\n failed: \"Kopieren fehlgeschlagen\",\n copiedAnnouncement: \"In die Zwischenablage kopiert\",\n failedAnnouncement: \"Kopieren in die Zwischenablage fehlgeschlagen\",\n },\n list: {\n unread: \"Ungelesen\",\n opensInNewTab: \"öffnet in einem neuen Tab\",\n },\n breadcrumbs: {\n label: \"Brotkrümelnavigation\",\n showAll: \"Vollständigen Pfad anzeigen\",\n },\n toast: {\n close: \"Benachrichtigung schließen\",\n notifications: \"Benachrichtigungen\",\n undo: \"Rückgängig\",\n redo: \"Wiederholen\",\n },\n form: {\n save: \"Speichern\",\n cancel: \"Abbrechen\",\n },\n descriptionList: {\n empty: \"—\",\n },\n lineItems: {\n add: \"Zeile hinzufügen\",\n remove: (row) => `Zeile ${row} entfernen`,\n confirmRemove: (row) => `Zeile ${row} entfernen? Zum Bestätigen erneut drücken`,\n row: (row) => `Zeile ${row}`,\n cell: (column, row) => `${column}, Zeile ${row}`,\n totals: \"Summe\",\n },\n progressBar: {\n unlimited: \"Unbegrenzt\",\n overLimit: (amount) => `${amount} über dem Limit`,\n },\n signedAmount: {\n positive: (amount) => `plus ${amount}`,\n negative: (amount) => `minus ${amount}`,\n },\n errorBoundary: {\n title: \"Etwas ist schiefgelaufen\",\n message: \"Dieser Teil der Seite konnte nicht angezeigt werden. Bitte erneut versuchen oder die Seite neu laden.\",\n retry: \"Erneut versuchen\",\n details: \"Fehlerdetails\",\n reload: \"Neu laden\",\n updateTitle: \"Eine neue Version ist verfügbar\",\n updateMessage: \"Ein Teil der App hat sich seit dem Laden dieser Seite geändert. Zum Aktualisieren die Seite neu laden.\",\n offlineTitle: \"Keine Internetverbindung\",\n offlineMessage: \"Diese Seite konnte ohne Verbindung nicht geladen werden. Nach dem Wiederherstellen der Verbindung die Seite neu laden.\",\n copyReport: \"Fehlerbericht kopieren\",\n reported: \"Der Fehler wurde automatisch gemeldet.\",\n reportedAs: (reference) => `Gemeldet unter ${reference}`,\n },\n authedImage: {\n loading: \"Bild wird geladen…\",\n loadError: \"Bild konnte nicht geladen werden\",\n failedImage: (alt) => `${alt}: Bild konnte nicht geladen werden`,\n },\n imageGrid: {\n list: \"Bilder\",\n item: (index, count) => `Bild ${n(index)} von ${n(count)}`,\n actions: (name) => `Aktionen für ${name}`,\n },\n lightbox: {\n dialog: \"Bildansicht\",\n close: \"Schließen\",\n previous: \"Vorheriges Bild\",\n next: \"Nächstes Bild\",\n counter: (index, count) => `${n(index)} / ${n(count)}`,\n position: (index, count) => `Bild ${n(index)} von ${n(count)}`,\n download: \"Herunterladen\",\n zoom: \"Zoomen\",\n noPreview: \"Für diese Datei ist keine Vorschau verfügbar\",\n openInNewTab: \"In neuem Tab öffnen\",\n },\n };\n}\n\nexport const UI_KIT_LABELS_DE: UiKitLabels = uiKitLabelsDe();\n"],"mappings":"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","names":[]}
|
package/dist/i18n/locales/es.js
CHANGED
|
@@ -33,7 +33,8 @@ function uiKitLabelsEs(numberLocale = "es-ES") {
|
|
|
33
33
|
field: "Escribe un comentario",
|
|
34
34
|
placeholder: "Escribe un comentario\u2026",
|
|
35
35
|
send: "Enviar",
|
|
36
|
-
sendHint: (modifier) => `${modifier} + Intro para enviar
|
|
36
|
+
sendHint: (modifier) => `${modifier} + Intro para enviar`,
|
|
37
|
+
sendHintEnter: "Intro para enviar, May\xFAs + Intro para una nueva l\xEDnea"
|
|
37
38
|
},
|
|
38
39
|
accountSettings: {
|
|
39
40
|
profile: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/i18n/locales/es.ts"],"sourcesContent":["import { formatFileSize } from \"../kit-labels\";\nimport type { UiKitLabels } from \"../kit-labels\";\n\n/**\n * The kit's words in Spanish: every namespace of {@link UiKitLabels}, for\n * `<UiKitProvider labels={UI_KIT_LABELS_ES}>`.\n *\n * Self-contained on purpose — nothing but the kit's own `formatFileSize` — so it works\n * as a starting point to copy and adjust. Counts and sizes are formatted with\n * `es-ES` digits; {@link uiKitLabelsEs} takes another number locale\n * (e.g. `\"de-CH\"` for 1’234) without touching the words.\n */\nexport function uiKitLabelsEs(numberLocale = \"es-ES\"): UiKitLabels {\n const num = new Intl.NumberFormat(numberLocale);\n const n = (value: number) => num.format(value);\n const plural = (count: number, one: string, many: string) => (count === 1 ? one : many);\n\n return {\n feedbackAttachment: {\n attachmentAdd: \"Adjuntar imagen\",\n attachmentCapture: \"Capturar pantalla\",\n attachmentPaste: \"…o pega una captura de pantalla desde el portapapeles.\",\n attachmentRemove: \"Quitar adjunto\",\n },\n feedbackDialog: {\n title: \"Enviar comentarios\",\n category: \"Categoría\",\n subject: \"Asunto\",\n body: \"¿Qué ha pasado?\",\n attachment: \"Captura de pantalla\",\n submitHint: \"Ctrl/⌘ + Intro para enviar\",\n cancel: \"Cancelar\",\n save: \"Enviar\",\n },\n feedbackThread: {\n thread: \"Comentarios\",\n empty: \"Aún no hay comentarios\",\n loading: \"Cargando comentarios…\",\n you: \"Tú\",\n staff: \"Equipo\",\n attachments: \"Adjuntos\",\n },\n feedbackComposer: {\n field: \"Escribe un comentario\",\n placeholder: \"Escribe un comentario…\",\n send: \"Enviar\",\n sendHint: (modifier) => `${modifier} + Intro para enviar`,\n },\n accountSettings: {\n profile: {\n title: \"Perfil\",\n email: \"Correo electrónico\",\n role: \"Rol\",\n memberSince: \"Miembro desde\",\n displayName: \"Nombre visible\",\n save: \"Guardar\",\n },\n password: {\n title: \"Cambiar contraseña\",\n current: \"Contraseña actual\",\n next: \"Nueva contraseña\",\n confirm: \"Confirmar nueva contraseña\",\n submit: \"Cambiar contraseña\",\n tooShort: \"La nueva contraseña es demasiado corta.\",\n mismatch: \"Las contraseñas no coinciden.\",\n },\n twoFactor: {\n status: \"Verificación en dos pasos\",\n enabledText: \"Activada\",\n disabledText: \"Desactivada\",\n enable: \"Configurar la verificación en dos pasos\",\n scanHint: \"Escanea este código con tu app de autenticación e introduce el código que muestra.\",\n codeLabel: \"Código de verificación\",\n verify: \"Verificar y activar\",\n disableSection: \"Desactivar la verificación en dos pasos\",\n password: \"Contraseña actual\",\n disable: \"Desactivar\",\n qrAlt: \"Código QR para tu app de autenticación\",\n secretHint: \"¿No puedes escanearlo? Introduce esta clave en la app:\",\n copySecret: \"Copiar clave\",\n },\n passkeys: {\n title: \"Llaves de acceso\",\n description: \"Inicia sesión con tu huella, tu cara o el PIN del dispositivo en lugar de una contraseña.\",\n empty: \"Aún no hay llaves de acceso\",\n loading: \"Cargando llaves de acceso…\",\n list: \"Tus llaves de acceso\",\n nameLabel: \"Nombre (opcional)\",\n namePlaceholder: \"p. ej. Portátil, Móvil\",\n add: \"Añadir llave de acceso\",\n adding: \"Esperando al dispositivo…\",\n rename: \"Cambiar nombre\",\n renameItem: (name) => `Cambiar nombre de ${name}`,\n renameField: (name) => `Nuevo nombre para ${name}`,\n save: \"Guardar\",\n cancel: \"Cancelar\",\n delete: \"Eliminar\",\n deleteItem: (name) => `Eliminar ${name}`,\n deleteConfirm: (name) => `¿Eliminar «${name}»? Ya no podrás iniciar sesión con ella.`,\n confirmDelete: \"Eliminar llave de acceso\",\n created: (date) => `Añadida el ${date}`,\n lastUsed: (date) => `Último uso: ${date}`,\n neverUsed: \"Nunca usada\",\n },\n },\n measuredGrid: {\n view: \"Vista de tabla\",\n cellsView: \"Celdas\",\n textView: \"Texto\",\n addRow: \"Añadir fila\",\n removeRow: (row) => `Quitar la fila ${row}`,\n clear: \"Vaciar tabla\",\n pasteHint: \"Pega un bloque de una hoja de cálculo en cualquier celda\",\n cell: (column, row) => `${column}, fila ${row}`,\n rowNumber: \"Fila\",\n rowActions: \"Acciones de fila\",\n keyboardHint:\n \"Las flechas mueven entre celdas. Escribe para reemplazar una celda, F2 para editarla, Escape para deshacer la edición. Intro baja y añade una fila al final.\",\n lineError: (line) => `No se pudo leer la línea ${line}`,\n points: (count) => (count === 1 ? \"1 punto\" : `${count} puntos`),\n problems: (count) =>\n count === 1 ? \"1 celda no es un número\" : `${count} celdas no son números`,\n },\n pageContents: { title: \"En esta página\" },\n common: {\n dismiss: \"Cerrar\",\n close: \"Cerrar\",\n clear: \"Borrar\",\n search: \"Buscar\",\n done: \"Listo\",\n cancel: \"Cancelar\",\n save: \"Guardar\",\n back: \"Atrás\",\n next: \"Siguiente\",\n remove: \"Quitar\",\n loading: \"Cargando…\",\n noResults: \"Sin resultados\",\n fieldValue: (field, value) => `${field}: ${value}`,\n opensInNewTab: \"se abre en una pestaña nueva\",\n },\n dataTable: {\n columns: \"Columnas\",\n selectAllRows: \"Seleccionar todas las filas\",\n sortHint: \"Haz clic para ordenar · Mayús+clic para añadir un criterio\",\n filter: \"Filtrar\",\n close: \"Cerrar\",\n selectRow: \"Seleccionar fila\",\n autoSize: \"Ajustar ancho de columnas\",\n loading: \"Cargando…\",\n filters: \"Filtros\",\n clearAll: \"Borrar todo\",\n done: \"Listo\",\n pageSize: \"Filas por página\",\n pageSizeAll: \"Todas\",\n prevPage: \"Página anterior\",\n nextPage: \"Página siguiente\",\n clearFilter: \"Borrar filtro\",\n filterPlaceholder: \"Filtrar…\",\n selectFilter: \"Seleccionar\",\n selectAll: \"Todos\",\n selectNone: \"Ninguno\",\n dateFrom: \"Desde\",\n dateTo: \"Hasta\",\n numberMin: \"Mín.\",\n numberMax: \"Máx.\",\n numberAbs: \"Valor absoluto\",\n presets: {\n today: \"Hoy\",\n yesterday: \"Ayer\",\n this_week: \"Esta semana\",\n last_week: \"Semana pasada\",\n last_7_days: \"Últimos 7 días\",\n last_30_days: \"Últimos 30 días\",\n this_month: \"Este mes\",\n last_month: \"Mes pasado\",\n last_3_months: \"Últimos 3 meses\",\n ytd: \"En lo que va de año\",\n last_year: \"Año pasado\",\n },\n table: \"Tabla de datos\",\n filterResults: (shown, total) =>\n `${n(shown)} de ${n(total)} ${plural(total, \"fila\", \"filas\")}`,\n sortedAscending: (column) => `Ordenado por ${column}, ascendente`,\n sortedDescending: (column) => `Ordenado por ${column}, descendente`,\n sortCleared: (column) => `Orden por ${column} eliminado`,\n pageChanged: (page, totalPages) => `Página ${n(page)} de ${n(totalPages)}`,\n pageRange: (from, to, total) => `${n(from)}–${n(to)} / ${n(total)}`,\n rowCount: (total) => n(total),\n columnsCount: (visible, total) => `Columnas (${n(visible)}/${n(total)})`,\n empty: \"No hay entradas\",\n actions: \"Acciones\",\n edit: \"Editar\",\n delete: \"Eliminar\",\n booleanTrue: \"Sí\",\n booleanFalse: \"No\",\n booleanUnset: \"Sin definir\",\n },\n miniCalendar: {\n previousMonth: \"Mes anterior\",\n nextMonth: \"Mes siguiente\",\n // Already formatted in the provider's locale (\"lunes, 14 de septiembre de 2026\").\n day: (date) => date,\n chooseStart: \"Elige una fecha de inicio\",\n chooseEnd: \"Elige una fecha de fin\",\n // \"Fecha\" is feminine; the date follows a label rather than being the subject of\n // a participle it cannot agree with.\n startSelected: (date) => `Fecha de inicio: ${date}. Elige una fecha de fin.`,\n rangeSelected: (from, to) =>\n `Periodo seleccionado: del ${from} al ${to}. Elige una fecha de inicio para empezar de nuevo.`,\n },\n monthPicker: {\n previousYear: \"Año anterior\",\n nextYear: \"Año siguiente\",\n panel: \"Elegir un mes\",\n month: (monthYear) => monthYear,\n previousMonth: \"Mes anterior\",\n nextMonth: \"Mes siguiente\",\n today: \"Hoy\",\n },\n calendarHeatmap: {\n grid: \"Valores diarios\",\n day: (date, value) => `${date}: ${value}`,\n less: \"Menos\",\n more: \"Más\",\n truncated: (count) =>\n `Se muestran los días más recientes; ${count === 1 ? \"no se muestra 1 día anterior\" : `no se muestran ${n(count)} días anteriores`}.`,\n },\n datePicker: {\n apply: \"Aplicar\",\n cancel: \"Cancelar\",\n presets: \"Rangos rápidos\",\n panel: \"Elegir una fecha\",\n rangePanel: \"Elegir un intervalo de fechas\",\n clear: \"Borrar\",\n previousDay: \"Día anterior\",\n nextDay: \"Día siguiente\",\n today: \"Hoy\",\n },\n popover: {\n panel: \"Ventana emergente\",\n },\n combobox: {\n search: \"Buscar\",\n noResults: \"Sin resultados\",\n clear: \"Borrar\",\n loading: \"Cargando…\",\n create: (query) => `Crear «${query}»`,\n selectedCount: (count) => `${n(count)} ${plural(count, \"seleccionado\", \"seleccionados\")}`,\n loadError: \"No se han podido cargar los resultados\",\n resultCount: (count) => `${n(count)} ${plural(count, \"resultado\", \"resultados\")}`,\n minChars: (count) =>\n `Escribe al menos ${n(count)} ${plural(count, \"carácter\", \"caracteres\")}`,\n },\n multiSelect: {\n search: \"Buscar\",\n selectAll: \"Seleccionar todo\",\n clear: \"Borrar\",\n all: \"Todos\",\n // The bare count, as in English: the trigger has always shown just the number.\n selectedCount: (count) => n(count),\n },\n calculator: {\n open: \"Abrir calculadora\",\n panel: \"Calculadora\",\n calculation: \"Cálculo\",\n backspace: \"Retroceso\",\n clear: \"Borrar\",\n equals: \"Igual\",\n done: \"Listo\",\n plus: \"Más\",\n minus: \"Menos\",\n times: \"Por\",\n divide: \"Entre\",\n decimal: \"Separador decimal\",\n },\n currency: {\n currency: \"Moneda\",\n search: \"Buscar moneda\",\n },\n chipInput: {\n added: (value) => `«${value}» añadido`,\n removed: (value) => `«${value}» quitado`,\n remove: \"Quitar\",\n atLimit: (max) => `Límite de ${n(max)} ${plural(max, \"elemento\", \"elementos\")} alcanzado`,\n duplicate: (value) => `«${value}» ya está en la lista`,\n },\n swatchPicker: {\n none: \"Sin color\",\n mixed: \"Mixto: los elementos seleccionados tienen colores distintos\",\n },\n iconPicker: {\n none: \"Sin icono\",\n mixed: \"Mixto: los elementos seleccionados tienen iconos distintos\",\n search: \"Buscar iconos\",\n noResults: \"Ningún icono coincide\",\n resultCount: (count) => `${n(count)} ${plural(count, \"icono\", \"iconos\")}`,\n },\n fieldSync: {\n synced: \"Guardado\",\n edited: \"Cambios sin guardar\",\n pending: \"Guardando…\",\n error: \"No se pudo guardar\",\n retry: \"Reintentar\",\n },\n passwordReveal: {\n show: \"Mostrar contraseña\",\n hide: \"Ocultar contraseña\",\n },\n dangerConfirm: {\n arm: \"Eliminar…\",\n confirm: \"Eliminar\",\n cancel: \"Cancelar\",\n prompt: \"Esta acción no se puede deshacer.\",\n password: \"Contraseña\",\n phrase: (phrase) => `Escribe «${phrase}» para confirmar`,\n },\n tabs: {\n add: \"Añadir pestaña\",\n remove: (tab) => `Quitar ${tab}`,\n },\n appShell: {\n collapse: \"Contraer barra lateral\",\n expand: \"Expandir barra lateral\",\n toggleGroup: (groupLabel) => `${groupLabel}: páginas`,\n },\n topBar: {\n theme: \"Cambiar de tema\",\n palette: \"Ajuste de apariencia\",\n language: \"Idioma\",\n switchRole: \"Cambiar de rol\",\n role: (value) => `Rol: ${value}`,\n },\n pickerSheet: {\n close: \"Cerrar\",\n },\n dialogFrame: {\n close: \"Cerrar\",\n },\n bulkActionBar: {\n selected: (count) => `${n(count)} ${count === 1 ? \"seleccionado\" : \"seleccionados\"}`,\n clear: \"Borrar selección\",\n cleared: \"Selección borrada\",\n },\n swipeableRow: {\n actions: \"Acciones de la fila\",\n },\n file: {\n // The kit's own `Intl` unit formatting, pinned to this locale (\"3,4 MB\").\n size: (bytes) => formatFileSize(bytes, numberLocale),\n },\n filePicker: {\n dropzone: \"Carga de archivos\",\n browse: \"Examinar\",\n empty: \"Suelte un archivo aquí\",\n emptyMultiple: \"Suelte archivos aquí\",\n hint: (accept) => (accept ? `Aceptados: ${accept}` : \"Cualquier tipo de archivo\"),\n busy: \"Subiendo…\",\n rejectedPick: (count) =>\n count === 1 ? \"El archivo no se añadió\" : `No se añadió ninguno de los ${count} archivos`,\n rejectedType: (name) => `El tipo de archivo de «${name}» no es compatible`,\n rejectedTypeOnly: (accept) => `Solo archivos ${accept}`,\n rejectedSize: (name, maxSize) => `«${name}» supera ${maxSize}`,\n rejectedCount: (name, maxFiles) =>\n `«${name}» no se ha añadido: como máximo ${n(maxFiles)} ${plural(maxFiles, \"archivo\", \"archivos\")}`,\n rejectedInvalid: (name) => `«${name}» no se puede usar aquí`,\n rejectedMany: (count) =>\n count === 1 ? \"1 archivo no se ha añadido\" : `${n(count)} archivos no se han añadido`,\n selected: (count, firstName) =>\n count === 1 ? `«${firstName}» seleccionado` : `${n(count)} archivos seleccionados`,\n remove: (name) => `Quitar «${name}»`,\n clearAll: \"Quitar todos los archivos\",\n removed: (name) => `«${name}» quitado`,\n cleared: \"Se han quitado todos los archivos\",\n },\n wizard: {\n done: \"Listo\",\n cancel: \"Cancelar\",\n back: \"Atrás\",\n next: \"Siguiente\",\n skip: \"Omitir\",\n finish: \"Finalizar\",\n submitting: \"Creando…\",\n steps: \"Pasos\",\n step: (current, total) => `Paso ${n(current)} de ${n(total)}`,\n cancelTitle: \"¿Descartar este formulario?\",\n confirmCancel: \"Se perderán los datos introducidos.\",\n cancelConfirmLabel: \"Descartar\",\n cancelDismissLabel: \"Seguir editando\",\n reviewTitle: \"Revisión\",\n edit: \"Editar\",\n missingRequired: \"Rellena todos los campos obligatorios.\",\n genericError: \"Se ha producido un error\",\n },\n tour: {\n next: \"Siguiente\",\n back: \"Atrás\",\n skip: \"Omitir\",\n done: \"Listo\",\n awaitClickHint: \"Haz clic en el elemento resaltado para continuar\",\n step: (current, total) => `${n(current)} / ${n(total)}`,\n },\n commandPalette: {\n clear: \"Borrar búsqueda\",\n submit: \"Buscar\",\n close: \"Cerrar\",\n placeholder: \"Buscar…\",\n empty: \"Sin resultados\",\n loading: \"Buscando…\",\n dialog: \"Búsqueda\",\n error: \"La búsqueda ha fallado. Inténtelo de nuevo.\",\n },\n globalSearch: {\n trigger: \"Buscar\",\n placeholder: \"Buscar o ir a…\",\n shortcut: (keys) => `Buscar (${keys})`,\n suggestions: \"Pruebe\",\n results: \"Resultados\",\n },\n sparkline: {\n rising: (first, last) => `Sube de ${first} a ${last}`,\n falling: (first, last) => `Baja de ${first} a ${last}`,\n flat: (value) => `Estable en ${value}`,\n single: (value) => `Un único valor: ${value}`,\n noData: \"Sin datos\",\n named: (name, summary) => `${name}: ${summary}`,\n },\n statTile: {\n increase: (amount) => `Sube ${amount}`,\n decrease: (amount) => `Baja ${amount}`,\n unchanged: \"Sin cambios\",\n better: (change) => `${change} (favorable)`,\n worse: (change) => `${change} (desfavorable)`,\n noValue: \"Sin datos\",\n loading: \"Cargando…\",\n },\n signaturePad: {\n label: \"Firma\",\n instructions: \"Firma en el recuadro con el ratón, el dedo o un lápiz.\",\n typedFallbackHint: \"Si no puedes dibujar, escribe tu nombre.\",\n empty: \"Aún no hay nada dibujado\",\n signed: \"Firma dibujada\",\n undo: \"Deshacer el último trazo\",\n clear: \"Borrar\",\n save: \"Guardar firma\",\n useTyped: \"Escribir el nombre\",\n useDrawn: \"Dibujar la firma\",\n typedName: \"Nombre completo\",\n cleared: \"Firma borrada\",\n undone: \"Último trazo eliminado\",\n viewEmpty: \"Sin firmar\",\n viewDrawn: \"Firma manuscrita\",\n viewTyped: (name) => `Firmado con el nombre escrito ${name}`,\n },\n passwordStrength: {\n // Agrees with \"contraseña\" (feminine).\n tooShort: \"Demasiado corta\",\n weak: \"Débil\",\n fair: \"Aceptable\",\n good: \"Buena\",\n strong: \"Fuerte\",\n announcement: (level) => `Seguridad de la contraseña: ${level}`,\n // Unformatted, as in the English default.\n ruleLength: (minLength) =>\n `Al menos ${minLength} ${plural(minLength, \"carácter\", \"caracteres\")}`,\n ruleCase: \"Mayúsculas y minúsculas\",\n ruleDigit: \"Un número\",\n ruleSymbol: \"Un símbolo\",\n optional: (rule) => `${rule} (opcional)`,\n met: \"Cumplido:\",\n notMet: \"No cumplido:\",\n tooLong: (maxBytes) =>\n `Como máximo ${maxBytes} ${plural(maxBytes, \"carácter\", \"caracteres\")} (las letras con tilde y los emojis cuentan como más de uno).`,\n },\n seriesChart: {\n resetZoom: \"Restablecer zoom\",\n zoomHint:\n \"Arrastra para ampliar: una selección más o menos cuadrada amplía ambos ejes; una larga y estrecha, solo el suyo. Haz doble clic para restablecer.\",\n empty: \"Sin datos\",\n legend: \"Series\",\n points: \"Valores del gráfico\",\n },\n pieChart: {\n slices: \"Sectores del gráfico\",\n slice: (label, value, percent) => `${label}: ${value} (${percent})`,\n total: \"Total\",\n empty: \"Sin datos\",\n legend: \"Categorías\",\n },\n confirmDialog: {\n confirm: \"Confirmar\",\n cancel: \"Cancelar\",\n },\n floatingPanel: {\n close: \"Cerrar\",\n badge: (count) => `${n(count)} ${plural(count, \"nuevo\", \"nuevos\")}`,\n },\n copyButton: {\n copy: \"Copiar\",\n copied: \"Copiado\",\n failed: \"No se pudo copiar\",\n copiedAnnouncement: \"Copiado al portapapeles\",\n failedAnnouncement: \"No se pudo copiar al portapapeles\",\n },\n list: {\n unread: \"No leído\",\n opensInNewTab: \"se abre en una pestaña nueva\",\n },\n breadcrumbs: {\n label: \"Ruta de navegación\",\n showAll: \"Mostrar la ruta completa\",\n },\n toast: {\n close: \"Cerrar notificación\",\n notifications: \"Notificaciones\",\n undo: \"Deshacer\",\n redo: \"Rehacer\",\n },\n form: {\n save: \"Guardar\",\n cancel: \"Cancelar\",\n },\n descriptionList: {\n empty: \"—\",\n },\n lineItems: {\n add: \"Añadir fila\",\n remove: (row) => `Eliminar fila ${row}`,\n confirmRemove: (row) => `¿Eliminar fila ${row}? Pulsa de nuevo para confirmar`,\n row: (row) => `Fila ${row}`,\n cell: (column, row) => `${column}, fila ${row}`,\n totals: \"Total\",\n },\n progressBar: {\n unlimited: \"Ilimitado\",\n overLimit: (amount) => `${amount} por encima del límite`,\n },\n signedAmount: {\n positive: (amount) => `más ${amount}`,\n negative: (amount) => `menos ${amount}`,\n },\n errorBoundary: {\n title: \"Algo salió mal\",\n message: \"No se pudo mostrar esta parte de la página. Inténtelo de nuevo o recargue la página.\",\n retry: \"Reintentar\",\n details: \"Detalles del error\",\n reload: \"Recargar\",\n updateTitle: \"Hay una nueva versión disponible\",\n updateMessage: \"Una parte de la aplicación ha cambiado desde que se cargó esta página. Recárguela para obtener la nueva versión.\",\n offlineTitle: \"Sin conexión\",\n offlineMessage: \"No se pudo cargar esta página sin conexión. Vuelva a conectarse y recargue la página.\",\n copyReport: \"Copiar informe de error\",\n reported: \"El error se ha notificado automáticamente.\",\n reportedAs: (reference) => `Notificado con la referencia ${reference}`,\n },\n authedImage: {\n loading: \"Cargando imagen…\",\n loadError: \"No se pudo cargar la imagen\",\n failedImage: (alt) => `${alt}: no se pudo cargar la imagen`,\n },\n imageGrid: {\n list: \"Imágenes\",\n item: (index, count) => `Imagen ${n(index)} de ${n(count)}`,\n actions: (name) => `Acciones para ${name}`,\n },\n lightbox: {\n dialog: \"Visor de imágenes\",\n close: \"Cerrar\",\n previous: \"Imagen anterior\",\n next: \"Imagen siguiente\",\n counter: (index, count) => `${n(index)} / ${n(count)}`,\n position: (index, count) => `Imagen ${n(index)} de ${n(count)}`,\n download: \"Descargar\",\n zoom: \"Ampliar\",\n noPreview: \"No hay vista previa disponible para este archivo\",\n openInNewTab: \"Abrir en una pestaña nueva\",\n },\n };\n}\n\nexport const UI_KIT_LABELS_ES: UiKitLabels = uiKitLabelsEs();\n"],"mappings":";AAAA,SAAS,sBAAsB;AAYxB,SAAS,cAAc,eAAe,SAAsB;AACjE,QAAM,MAAM,IAAI,KAAK,aAAa,YAAY;AAC9C,QAAM,IAAI,CAAC,UAAkB,IAAI,OAAO,KAAK;AAC7C,QAAM,SAAS,CAAC,OAAe,KAAa,SAAkB,UAAU,IAAI,MAAM;AAElF,SAAO;AAAA,IACL,oBAAoB;AAAA,MAClB,eAAe;AAAA,MACf,mBAAmB;AAAA,MACnB,iBAAiB;AAAA,MACjB,kBAAkB;AAAA,IACpB;AAAA,IACA,gBAAgB;AAAA,MACd,OAAO;AAAA,MACP,UAAU;AAAA,MACV,SAAS;AAAA,MACT,MAAM;AAAA,MACN,YAAY;AAAA,MACZ,YAAY;AAAA,MACZ,QAAQ;AAAA,MACR,MAAM;AAAA,IACR;AAAA,IACA,gBAAgB;AAAA,MACd,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,SAAS;AAAA,MACT,KAAK;AAAA,MACL,OAAO;AAAA,MACP,aAAa;AAAA,IACf;AAAA,IACA,kBAAkB;AAAA,MAChB,OAAO;AAAA,MACP,aAAa;AAAA,MACb,MAAM;AAAA,MACN,UAAU,CAAC,aAAa,GAAG,QAAQ;AAAA,IACrC;AAAA,IACA,iBAAiB;AAAA,MACf,SAAS;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,QACP,MAAM;AAAA,QACN,aAAa;AAAA,QACb,aAAa;AAAA,QACb,MAAM;AAAA,MACR;AAAA,MACA,UAAU;AAAA,QACR,OAAO;AAAA,QACP,SAAS;AAAA,QACT,MAAM;AAAA,QACN,SAAS;AAAA,QACT,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,UAAU;AAAA,MACZ;AAAA,MACA,WAAW;AAAA,QACT,QAAQ;AAAA,QACR,aAAa;AAAA,QACb,cAAc;AAAA,QACd,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,gBAAgB;AAAA,QAChB,UAAU;AAAA,QACV,SAAS;AAAA,QACT,OAAO;AAAA,QACP,YAAY;AAAA,QACZ,YAAY;AAAA,MACd;AAAA,MACA,UAAU;AAAA,QACR,OAAO;AAAA,QACP,aAAa;AAAA,QACb,OAAO;AAAA,QACP,SAAS;AAAA,QACT,MAAM;AAAA,QACN,WAAW;AAAA,QACX,iBAAiB;AAAA,QACjB,KAAK;AAAA,QACL,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,YAAY,CAAC,SAAS,qBAAqB,IAAI;AAAA,QAC/C,aAAa,CAAC,SAAS,qBAAqB,IAAI;AAAA,QAChD,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,YAAY,CAAC,SAAS,YAAY,IAAI;AAAA,QACtC,eAAe,CAAC,SAAS,oBAAc,IAAI;AAAA,QAC3C,eAAe;AAAA,QACf,SAAS,CAAC,SAAS,iBAAc,IAAI;AAAA,QACrC,UAAU,CAAC,SAAS,kBAAe,IAAI;AAAA,QACvC,WAAW;AAAA,MACb;AAAA,IACF;AAAA,IACA,cAAc;AAAA,MACZ,MAAM;AAAA,MACN,WAAW;AAAA,MACX,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,WAAW,CAAC,QAAQ,kBAAkB,GAAG;AAAA,MACzC,OAAO;AAAA,MACP,WAAW;AAAA,MACX,MAAM,CAAC,QAAQ,QAAQ,GAAG,MAAM,UAAU,GAAG;AAAA,MAC7C,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,cACE;AAAA,MACF,WAAW,CAAC,SAAS,+BAA4B,IAAI;AAAA,MACrD,QAAQ,CAAC,UAAW,UAAU,IAAI,YAAY,GAAG,KAAK;AAAA,MACtD,UAAU,CAAC,UACT,UAAU,IAAI,+BAA4B,GAAG,KAAK;AAAA,IACtD;AAAA,IACA,cAAc,EAAE,OAAO,oBAAiB;AAAA,IACxC,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,WAAW;AAAA,MACX,YAAY,CAAC,OAAO,UAAU,GAAG,KAAK,KAAK,KAAK;AAAA,MAChD,eAAe;AAAA,IACjB;AAAA,IACA,WAAW;AAAA,MACT,SAAS;AAAA,MACT,eAAe;AAAA,MACf,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,WAAW;AAAA,MACX,UAAU;AAAA,MACV,SAAS;AAAA,MACT,SAAS;AAAA,MACT,UAAU;AAAA,MACV,MAAM;AAAA,MACN,UAAU;AAAA,MACV,aAAa;AAAA,MACb,UAAU;AAAA,MACV,UAAU;AAAA,MACV,aAAa;AAAA,MACb,mBAAmB;AAAA,MACnB,cAAc;AAAA,MACd,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,WAAW;AAAA,MACX,WAAW;AAAA,MACX,SAAS;AAAA,QACP,OAAO;AAAA,QACP,WAAW;AAAA,QACX,WAAW;AAAA,QACX,WAAW;AAAA,QACX,aAAa;AAAA,QACb,cAAc;AAAA,QACd,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,eAAe;AAAA,QACf,KAAK;AAAA,QACL,WAAW;AAAA,MACb;AAAA,MACA,OAAO;AAAA,MACP,eAAe,CAAC,OAAO,UACrB,GAAG,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,OAAO,OAAO,QAAQ,OAAO,CAAC;AAAA,MAC9D,iBAAiB,CAAC,WAAW,gBAAgB,MAAM;AAAA,MACnD,kBAAkB,CAAC,WAAW,gBAAgB,MAAM;AAAA,MACpD,aAAa,CAAC,WAAW,aAAa,MAAM;AAAA,MAC5C,aAAa,CAAC,MAAM,eAAe,aAAU,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC;AAAA,MACxE,WAAW,CAAC,MAAM,IAAI,UAAU,GAAG,EAAE,IAAI,CAAC,SAAI,EAAE,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;AAAA,MACjE,UAAU,CAAC,UAAU,EAAE,KAAK;AAAA,MAC5B,cAAc,CAAC,SAAS,UAAU,aAAa,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC;AAAA,MACrE,OAAO;AAAA,MACP,SAAS;AAAA,MACT,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,cAAc;AAAA,MACd,cAAc;AAAA,IAChB;AAAA,IACA,cAAc;AAAA,MACZ,eAAe;AAAA,MACf,WAAW;AAAA;AAAA,MAEX,KAAK,CAAC,SAAS;AAAA,MACf,aAAa;AAAA,MACb,WAAW;AAAA;AAAA;AAAA,MAGX,eAAe,CAAC,SAAS,oBAAoB,IAAI;AAAA,MACjD,eAAe,CAAC,MAAM,OACpB,6BAA6B,IAAI,OAAO,EAAE;AAAA,IAC9C;AAAA,IACA,aAAa;AAAA,MACX,cAAc;AAAA,MACd,UAAU;AAAA,MACV,OAAO;AAAA,MACP,OAAO,CAAC,cAAc;AAAA,MACtB,eAAe;AAAA,MACf,WAAW;AAAA,MACX,OAAO;AAAA,IACT;AAAA,IACA,iBAAiB;AAAA,MACf,MAAM;AAAA,MACN,KAAK,CAAC,MAAM,UAAU,GAAG,IAAI,KAAK,KAAK;AAAA,MACvC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,WAAW,CAAC,UACV,6CAAuC,UAAU,IAAI,oCAAiC,kBAAkB,EAAE,KAAK,CAAC,qBAAkB;AAAA,IACtI;AAAA,IACA,YAAY;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,OAAO;AAAA,MACP,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,aAAa;AAAA,MACb,SAAS;AAAA,MACT,OAAO;AAAA,IACT;AAAA,IACA,SAAS;AAAA,MACP,OAAO;AAAA,IACT;AAAA,IACA,UAAU;AAAA,MACR,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,MACT,QAAQ,CAAC,UAAU,aAAU,KAAK;AAAA,MAClC,eAAe,CAAC,UAAU,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,OAAO,gBAAgB,eAAe,CAAC;AAAA,MACvF,WAAW;AAAA,MACX,aAAa,CAAC,UAAU,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,OAAO,aAAa,YAAY,CAAC;AAAA,MAC/E,UAAU,CAAC,UACT,oBAAoB,EAAE,KAAK,CAAC,IAAI,OAAO,OAAO,eAAY,YAAY,CAAC;AAAA,IAC3E;AAAA,IACA,aAAa;AAAA,MACX,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,OAAO;AAAA,MACP,KAAK;AAAA;AAAA,MAEL,eAAe,CAAC,UAAU,EAAE,KAAK;AAAA,IACnC;AAAA,IACA,YAAY;AAAA,MACV,MAAM;AAAA,MACN,OAAO;AAAA,MACP,aAAa;AAAA,MACb,WAAW;AAAA,MACX,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,MACN,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,SAAS;AAAA,IACX;AAAA,IACA,UAAU;AAAA,MACR,UAAU;AAAA,MACV,QAAQ;AAAA,IACV;AAAA,IACA,WAAW;AAAA,MACT,OAAO,CAAC,UAAU,OAAI,KAAK;AAAA,MAC3B,SAAS,CAAC,UAAU,OAAI,KAAK;AAAA,MAC7B,QAAQ;AAAA,MACR,SAAS,CAAC,QAAQ,gBAAa,EAAE,GAAG,CAAC,IAAI,OAAO,KAAK,YAAY,WAAW,CAAC;AAAA,MAC7E,WAAW,CAAC,UAAU,OAAI,KAAK;AAAA,IACjC;AAAA,IACA,cAAc;AAAA,MACZ,MAAM;AAAA,MACN,OAAO;AAAA,IACT;AAAA,IACA,YAAY;AAAA,MACV,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,aAAa,CAAC,UAAU,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,OAAO,SAAS,QAAQ,CAAC;AAAA,IACzE;AAAA,IACA,WAAW;AAAA,MACT,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,OAAO;AAAA,MACP,OAAO;AAAA,IACT;AAAA,IACA,gBAAgB;AAAA,MACd,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,IACA,eAAe;AAAA,MACb,KAAK;AAAA,MACL,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,QAAQ,CAAC,WAAW,eAAY,MAAM;AAAA,IACxC;AAAA,IACA,MAAM;AAAA,MACJ,KAAK;AAAA,MACL,QAAQ,CAAC,QAAQ,UAAU,GAAG;AAAA,IAChC;AAAA,IACA,UAAU;AAAA,MACR,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,aAAa,CAAC,eAAe,GAAG,UAAU;AAAA,IAC5C;AAAA,IACA,QAAQ;AAAA,MACN,OAAO;AAAA,MACP,SAAS;AAAA,MACT,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,MAAM,CAAC,UAAU,QAAQ,KAAK;AAAA,IAChC;AAAA,IACA,aAAa;AAAA,MACX,OAAO;AAAA,IACT;AAAA,IACA,aAAa;AAAA,MACX,OAAO;AAAA,IACT;AAAA,IACA,eAAe;AAAA,MACb,UAAU,CAAC,UAAU,GAAG,EAAE,KAAK,CAAC,IAAI,UAAU,IAAI,iBAAiB,eAAe;AAAA,MAClF,OAAO;AAAA,MACP,SAAS;AAAA,IACX;AAAA,IACA,cAAc;AAAA,MACZ,SAAS;AAAA,IACX;AAAA,IACA,MAAM;AAAA;AAAA,MAEJ,MAAM,CAAC,UAAU,eAAe,OAAO,YAAY;AAAA,IACrD;AAAA,IACA,YAAY;AAAA,MACV,UAAU;AAAA,MACV,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,eAAe;AAAA,MACf,MAAM,CAAC,WAAY,SAAS,cAAc,MAAM,KAAK;AAAA,MACrD,MAAM;AAAA,MACN,cAAc,CAAC,UACb,UAAU,IAAI,kCAA4B,qCAA+B,KAAK;AAAA,MAChF,cAAc,CAAC,SAAS,6BAA0B,IAAI;AAAA,MACtD,kBAAkB,CAAC,WAAW,iBAAiB,MAAM;AAAA,MACrD,cAAc,CAAC,MAAM,YAAY,OAAI,IAAI,eAAY,OAAO;AAAA,MAC5D,eAAe,CAAC,MAAM,aACpB,OAAI,IAAI,4CAAmC,EAAE,QAAQ,CAAC,IAAI,OAAO,UAAU,WAAW,UAAU,CAAC;AAAA,MACnG,iBAAiB,CAAC,SAAS,OAAI,IAAI;AAAA,MACnC,cAAc,CAAC,UACb,UAAU,IAAI,kCAA+B,GAAG,EAAE,KAAK,CAAC;AAAA,MAC1D,UAAU,CAAC,OAAO,cAChB,UAAU,IAAI,OAAI,SAAS,sBAAmB,GAAG,EAAE,KAAK,CAAC;AAAA,MAC3D,QAAQ,CAAC,SAAS,cAAW,IAAI;AAAA,MACjC,UAAU;AAAA,MACV,SAAS,CAAC,SAAS,OAAI,IAAI;AAAA,MAC3B,SAAS;AAAA,IACX;AAAA,IACA,QAAQ;AAAA,MACN,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,OAAO;AAAA,MACP,MAAM,CAAC,SAAS,UAAU,QAAQ,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC;AAAA,MAC3D,aAAa;AAAA,MACb,eAAe;AAAA,MACf,oBAAoB;AAAA,MACpB,oBAAoB;AAAA,MACpB,aAAa;AAAA,MACb,MAAM;AAAA,MACN,iBAAiB;AAAA,MACjB,cAAc;AAAA,IAChB;AAAA,IACA,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,gBAAgB;AAAA,MAChB,MAAM,CAAC,SAAS,UAAU,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC;AAAA,IACvD;AAAA,IACA,gBAAgB;AAAA,MACd,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,aAAa;AAAA,MACb,OAAO;AAAA,MACP,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,IACA,cAAc;AAAA,MACZ,SAAS;AAAA,MACT,aAAa;AAAA,MACb,UAAU,CAAC,SAAS,WAAW,IAAI;AAAA,MACnC,aAAa;AAAA,MACb,SAAS;AAAA,IACX;AAAA,IACA,WAAW;AAAA,MACT,QAAQ,CAAC,OAAO,SAAS,WAAW,KAAK,MAAM,IAAI;AAAA,MACnD,SAAS,CAAC,OAAO,SAAS,WAAW,KAAK,MAAM,IAAI;AAAA,MACpD,MAAM,CAAC,UAAU,cAAc,KAAK;AAAA,MACpC,QAAQ,CAAC,UAAU,sBAAmB,KAAK;AAAA,MAC3C,QAAQ;AAAA,MACR,OAAO,CAAC,MAAM,YAAY,GAAG,IAAI,KAAK,OAAO;AAAA,IAC/C;AAAA,IACA,UAAU;AAAA,MACR,UAAU,CAAC,WAAW,QAAQ,MAAM;AAAA,MACpC,UAAU,CAAC,WAAW,QAAQ,MAAM;AAAA,MACpC,WAAW;AAAA,MACX,QAAQ,CAAC,WAAW,GAAG,MAAM;AAAA,MAC7B,OAAO,CAAC,WAAW,GAAG,MAAM;AAAA,MAC5B,SAAS;AAAA,MACT,SAAS;AAAA,IACX;AAAA,IACA,cAAc;AAAA,MACZ,OAAO;AAAA,MACP,cAAc;AAAA,MACd,mBAAmB;AAAA,MACnB,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,OAAO;AAAA,MACP,MAAM;AAAA,MACN,UAAU;AAAA,MACV,UAAU;AAAA,MACV,WAAW;AAAA,MACX,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,WAAW;AAAA,MACX,WAAW,CAAC,SAAS,iCAAiC,IAAI;AAAA,IAC5D;AAAA,IACA,kBAAkB;AAAA;AAAA,MAEhB,UAAU;AAAA,MACV,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,cAAc,CAAC,UAAU,kCAA+B,KAAK;AAAA;AAAA,MAE7D,YAAY,CAAC,cACX,YAAY,SAAS,IAAI,OAAO,WAAW,eAAY,YAAY,CAAC;AAAA,MACtE,UAAU;AAAA,MACV,WAAW;AAAA,MACX,YAAY;AAAA,MACZ,UAAU,CAAC,SAAS,GAAG,IAAI;AAAA,MAC3B,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,SAAS,CAAC,aACR,kBAAe,QAAQ,IAAI,OAAO,UAAU,eAAY,YAAY,CAAC;AAAA,IACzE;AAAA,IACA,aAAa;AAAA,MACX,WAAW;AAAA,MACX,UACE;AAAA,MACF,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,QAAQ;AAAA,IACV;AAAA,IACA,UAAU;AAAA,MACR,QAAQ;AAAA,MACR,OAAO,CAAC,OAAO,OAAO,YAAY,GAAG,KAAK,KAAK,KAAK,KAAK,OAAO;AAAA,MAChE,OAAO;AAAA,MACP,OAAO;AAAA,MACP,QAAQ;AAAA,IACV;AAAA,IACA,eAAe;AAAA,MACb,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,IACA,eAAe;AAAA,MACb,OAAO;AAAA,MACP,OAAO,CAAC,UAAU,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,OAAO,SAAS,QAAQ,CAAC;AAAA,IACnE;AAAA,IACA,YAAY;AAAA,MACV,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,oBAAoB;AAAA,MACpB,oBAAoB;AAAA,IACtB;AAAA,IACA,MAAM;AAAA,MACJ,QAAQ;AAAA,MACR,eAAe;AAAA,IACjB;AAAA,IACA,aAAa;AAAA,MACX,OAAO;AAAA,MACP,SAAS;AAAA,IACX;AAAA,IACA,OAAO;AAAA,MACL,OAAO;AAAA,MACP,eAAe;AAAA,MACf,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,IACA,MAAM;AAAA,MACJ,MAAM;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,IACA,iBAAiB;AAAA,MACf,OAAO;AAAA,IACT;AAAA,IACA,WAAW;AAAA,MACT,KAAK;AAAA,MACL,QAAQ,CAAC,QAAQ,iBAAiB,GAAG;AAAA,MACrC,eAAe,CAAC,QAAQ,qBAAkB,GAAG;AAAA,MAC7C,KAAK,CAAC,QAAQ,QAAQ,GAAG;AAAA,MACzB,MAAM,CAAC,QAAQ,QAAQ,GAAG,MAAM,UAAU,GAAG;AAAA,MAC7C,QAAQ;AAAA,IACV;AAAA,IACA,aAAa;AAAA,MACX,WAAW;AAAA,MACX,WAAW,CAAC,WAAW,GAAG,MAAM;AAAA,IAClC;AAAA,IACA,cAAc;AAAA,MACZ,UAAU,CAAC,WAAW,UAAO,MAAM;AAAA,MACnC,UAAU,CAAC,WAAW,SAAS,MAAM;AAAA,IACvC;AAAA,IACA,eAAe;AAAA,MACb,OAAO;AAAA,MACP,SAAS;AAAA,MACT,OAAO;AAAA,MACP,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,eAAe;AAAA,MACf,cAAc;AAAA,MACd,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ,UAAU;AAAA,MACV,YAAY,CAAC,cAAc,gCAAgC,SAAS;AAAA,IACtE;AAAA,IACA,aAAa;AAAA,MACX,SAAS;AAAA,MACT,WAAW;AAAA,MACX,aAAa,CAAC,QAAQ,GAAG,GAAG;AAAA,IAC9B;AAAA,IACA,WAAW;AAAA,MACT,MAAM;AAAA,MACN,MAAM,CAAC,OAAO,UAAU,UAAU,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC;AAAA,MACzD,SAAS,CAAC,SAAS,iBAAiB,IAAI;AAAA,IAC1C;AAAA,IACA,UAAU;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SAAS,CAAC,OAAO,UAAU,GAAG,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC;AAAA,MACpD,UAAU,CAAC,OAAO,UAAU,UAAU,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC;AAAA,MAC7D,UAAU;AAAA,MACV,MAAM;AAAA,MACN,WAAW;AAAA,MACX,cAAc;AAAA,IAChB;AAAA,EACF;AACF;AAEO,MAAM,mBAAgC,cAAc;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/i18n/locales/es.ts"],"sourcesContent":["import { formatFileSize } from \"../kit-labels\";\nimport type { UiKitLabels } from \"../kit-labels\";\n\n/**\n * The kit's words in Spanish: every namespace of {@link UiKitLabels}, for\n * `<UiKitProvider labels={UI_KIT_LABELS_ES}>`.\n *\n * Self-contained on purpose — nothing but the kit's own `formatFileSize` — so it works\n * as a starting point to copy and adjust. Counts and sizes are formatted with\n * `es-ES` digits; {@link uiKitLabelsEs} takes another number locale\n * (e.g. `\"de-CH\"` for 1’234) without touching the words.\n */\nexport function uiKitLabelsEs(numberLocale = \"es-ES\"): UiKitLabels {\n const num = new Intl.NumberFormat(numberLocale);\n const n = (value: number) => num.format(value);\n const plural = (count: number, one: string, many: string) => (count === 1 ? one : many);\n\n return {\n feedbackAttachment: {\n attachmentAdd: \"Adjuntar imagen\",\n attachmentCapture: \"Capturar pantalla\",\n attachmentPaste: \"…o pega una captura de pantalla desde el portapapeles.\",\n attachmentRemove: \"Quitar adjunto\",\n },\n feedbackDialog: {\n title: \"Enviar comentarios\",\n category: \"Categoría\",\n subject: \"Asunto\",\n body: \"¿Qué ha pasado?\",\n attachment: \"Captura de pantalla\",\n submitHint: \"Ctrl/⌘ + Intro para enviar\",\n cancel: \"Cancelar\",\n save: \"Enviar\",\n },\n feedbackThread: {\n thread: \"Comentarios\",\n empty: \"Aún no hay comentarios\",\n loading: \"Cargando comentarios…\",\n you: \"Tú\",\n staff: \"Equipo\",\n attachments: \"Adjuntos\",\n },\n feedbackComposer: {\n field: \"Escribe un comentario\",\n placeholder: \"Escribe un comentario…\",\n send: \"Enviar\",\n sendHint: (modifier) => `${modifier} + Intro para enviar`,\n sendHintEnter: \"Intro para enviar, Mayús + Intro para una nueva línea\",\n },\n accountSettings: {\n profile: {\n title: \"Perfil\",\n email: \"Correo electrónico\",\n role: \"Rol\",\n memberSince: \"Miembro desde\",\n displayName: \"Nombre visible\",\n save: \"Guardar\",\n },\n password: {\n title: \"Cambiar contraseña\",\n current: \"Contraseña actual\",\n next: \"Nueva contraseña\",\n confirm: \"Confirmar nueva contraseña\",\n submit: \"Cambiar contraseña\",\n tooShort: \"La nueva contraseña es demasiado corta.\",\n mismatch: \"Las contraseñas no coinciden.\",\n },\n twoFactor: {\n status: \"Verificación en dos pasos\",\n enabledText: \"Activada\",\n disabledText: \"Desactivada\",\n enable: \"Configurar la verificación en dos pasos\",\n scanHint: \"Escanea este código con tu app de autenticación e introduce el código que muestra.\",\n codeLabel: \"Código de verificación\",\n verify: \"Verificar y activar\",\n disableSection: \"Desactivar la verificación en dos pasos\",\n password: \"Contraseña actual\",\n disable: \"Desactivar\",\n qrAlt: \"Código QR para tu app de autenticación\",\n secretHint: \"¿No puedes escanearlo? Introduce esta clave en la app:\",\n copySecret: \"Copiar clave\",\n },\n passkeys: {\n title: \"Llaves de acceso\",\n description: \"Inicia sesión con tu huella, tu cara o el PIN del dispositivo en lugar de una contraseña.\",\n empty: \"Aún no hay llaves de acceso\",\n loading: \"Cargando llaves de acceso…\",\n list: \"Tus llaves de acceso\",\n nameLabel: \"Nombre (opcional)\",\n namePlaceholder: \"p. ej. Portátil, Móvil\",\n add: \"Añadir llave de acceso\",\n adding: \"Esperando al dispositivo…\",\n rename: \"Cambiar nombre\",\n renameItem: (name) => `Cambiar nombre de ${name}`,\n renameField: (name) => `Nuevo nombre para ${name}`,\n save: \"Guardar\",\n cancel: \"Cancelar\",\n delete: \"Eliminar\",\n deleteItem: (name) => `Eliminar ${name}`,\n deleteConfirm: (name) => `¿Eliminar «${name}»? Ya no podrás iniciar sesión con ella.`,\n confirmDelete: \"Eliminar llave de acceso\",\n created: (date) => `Añadida el ${date}`,\n lastUsed: (date) => `Último uso: ${date}`,\n neverUsed: \"Nunca usada\",\n },\n },\n measuredGrid: {\n view: \"Vista de tabla\",\n cellsView: \"Celdas\",\n textView: \"Texto\",\n addRow: \"Añadir fila\",\n removeRow: (row) => `Quitar la fila ${row}`,\n clear: \"Vaciar tabla\",\n pasteHint: \"Pega un bloque de una hoja de cálculo en cualquier celda\",\n cell: (column, row) => `${column}, fila ${row}`,\n rowNumber: \"Fila\",\n rowActions: \"Acciones de fila\",\n keyboardHint:\n \"Las flechas mueven entre celdas. Escribe para reemplazar una celda, F2 para editarla, Escape para deshacer la edición. Intro baja y añade una fila al final.\",\n lineError: (line) => `No se pudo leer la línea ${line}`,\n points: (count) => (count === 1 ? \"1 punto\" : `${count} puntos`),\n problems: (count) =>\n count === 1 ? \"1 celda no es un número\" : `${count} celdas no son números`,\n },\n pageContents: { title: \"En esta página\" },\n common: {\n dismiss: \"Cerrar\",\n close: \"Cerrar\",\n clear: \"Borrar\",\n search: \"Buscar\",\n done: \"Listo\",\n cancel: \"Cancelar\",\n save: \"Guardar\",\n back: \"Atrás\",\n next: \"Siguiente\",\n remove: \"Quitar\",\n loading: \"Cargando…\",\n noResults: \"Sin resultados\",\n fieldValue: (field, value) => `${field}: ${value}`,\n opensInNewTab: \"se abre en una pestaña nueva\",\n },\n dataTable: {\n columns: \"Columnas\",\n selectAllRows: \"Seleccionar todas las filas\",\n sortHint: \"Haz clic para ordenar · Mayús+clic para añadir un criterio\",\n filter: \"Filtrar\",\n close: \"Cerrar\",\n selectRow: \"Seleccionar fila\",\n autoSize: \"Ajustar ancho de columnas\",\n loading: \"Cargando…\",\n filters: \"Filtros\",\n clearAll: \"Borrar todo\",\n done: \"Listo\",\n pageSize: \"Filas por página\",\n pageSizeAll: \"Todas\",\n prevPage: \"Página anterior\",\n nextPage: \"Página siguiente\",\n clearFilter: \"Borrar filtro\",\n filterPlaceholder: \"Filtrar…\",\n selectFilter: \"Seleccionar\",\n selectAll: \"Todos\",\n selectNone: \"Ninguno\",\n dateFrom: \"Desde\",\n dateTo: \"Hasta\",\n numberMin: \"Mín.\",\n numberMax: \"Máx.\",\n numberAbs: \"Valor absoluto\",\n presets: {\n today: \"Hoy\",\n yesterday: \"Ayer\",\n this_week: \"Esta semana\",\n last_week: \"Semana pasada\",\n last_7_days: \"Últimos 7 días\",\n last_30_days: \"Últimos 30 días\",\n this_month: \"Este mes\",\n last_month: \"Mes pasado\",\n last_3_months: \"Últimos 3 meses\",\n ytd: \"En lo que va de año\",\n last_year: \"Año pasado\",\n },\n table: \"Tabla de datos\",\n filterResults: (shown, total) =>\n `${n(shown)} de ${n(total)} ${plural(total, \"fila\", \"filas\")}`,\n sortedAscending: (column) => `Ordenado por ${column}, ascendente`,\n sortedDescending: (column) => `Ordenado por ${column}, descendente`,\n sortCleared: (column) => `Orden por ${column} eliminado`,\n pageChanged: (page, totalPages) => `Página ${n(page)} de ${n(totalPages)}`,\n pageRange: (from, to, total) => `${n(from)}–${n(to)} / ${n(total)}`,\n rowCount: (total) => n(total),\n columnsCount: (visible, total) => `Columnas (${n(visible)}/${n(total)})`,\n empty: \"No hay entradas\",\n actions: \"Acciones\",\n edit: \"Editar\",\n delete: \"Eliminar\",\n booleanTrue: \"Sí\",\n booleanFalse: \"No\",\n booleanUnset: \"Sin definir\",\n },\n miniCalendar: {\n previousMonth: \"Mes anterior\",\n nextMonth: \"Mes siguiente\",\n // Already formatted in the provider's locale (\"lunes, 14 de septiembre de 2026\").\n day: (date) => date,\n chooseStart: \"Elige una fecha de inicio\",\n chooseEnd: \"Elige una fecha de fin\",\n // \"Fecha\" is feminine; the date follows a label rather than being the subject of\n // a participle it cannot agree with.\n startSelected: (date) => `Fecha de inicio: ${date}. Elige una fecha de fin.`,\n rangeSelected: (from, to) =>\n `Periodo seleccionado: del ${from} al ${to}. Elige una fecha de inicio para empezar de nuevo.`,\n },\n monthPicker: {\n previousYear: \"Año anterior\",\n nextYear: \"Año siguiente\",\n panel: \"Elegir un mes\",\n month: (monthYear) => monthYear,\n previousMonth: \"Mes anterior\",\n nextMonth: \"Mes siguiente\",\n today: \"Hoy\",\n },\n calendarHeatmap: {\n grid: \"Valores diarios\",\n day: (date, value) => `${date}: ${value}`,\n less: \"Menos\",\n more: \"Más\",\n truncated: (count) =>\n `Se muestran los días más recientes; ${count === 1 ? \"no se muestra 1 día anterior\" : `no se muestran ${n(count)} días anteriores`}.`,\n },\n datePicker: {\n apply: \"Aplicar\",\n cancel: \"Cancelar\",\n presets: \"Rangos rápidos\",\n panel: \"Elegir una fecha\",\n rangePanel: \"Elegir un intervalo de fechas\",\n clear: \"Borrar\",\n previousDay: \"Día anterior\",\n nextDay: \"Día siguiente\",\n today: \"Hoy\",\n },\n popover: {\n panel: \"Ventana emergente\",\n },\n combobox: {\n search: \"Buscar\",\n noResults: \"Sin resultados\",\n clear: \"Borrar\",\n loading: \"Cargando…\",\n create: (query) => `Crear «${query}»`,\n selectedCount: (count) => `${n(count)} ${plural(count, \"seleccionado\", \"seleccionados\")}`,\n loadError: \"No se han podido cargar los resultados\",\n resultCount: (count) => `${n(count)} ${plural(count, \"resultado\", \"resultados\")}`,\n minChars: (count) =>\n `Escribe al menos ${n(count)} ${plural(count, \"carácter\", \"caracteres\")}`,\n },\n multiSelect: {\n search: \"Buscar\",\n selectAll: \"Seleccionar todo\",\n clear: \"Borrar\",\n all: \"Todos\",\n // The bare count, as in English: the trigger has always shown just the number.\n selectedCount: (count) => n(count),\n },\n calculator: {\n open: \"Abrir calculadora\",\n panel: \"Calculadora\",\n calculation: \"Cálculo\",\n backspace: \"Retroceso\",\n clear: \"Borrar\",\n equals: \"Igual\",\n done: \"Listo\",\n plus: \"Más\",\n minus: \"Menos\",\n times: \"Por\",\n divide: \"Entre\",\n decimal: \"Separador decimal\",\n },\n currency: {\n currency: \"Moneda\",\n search: \"Buscar moneda\",\n },\n chipInput: {\n added: (value) => `«${value}» añadido`,\n removed: (value) => `«${value}» quitado`,\n remove: \"Quitar\",\n atLimit: (max) => `Límite de ${n(max)} ${plural(max, \"elemento\", \"elementos\")} alcanzado`,\n duplicate: (value) => `«${value}» ya está en la lista`,\n },\n swatchPicker: {\n none: \"Sin color\",\n mixed: \"Mixto: los elementos seleccionados tienen colores distintos\",\n },\n iconPicker: {\n none: \"Sin icono\",\n mixed: \"Mixto: los elementos seleccionados tienen iconos distintos\",\n search: \"Buscar iconos\",\n noResults: \"Ningún icono coincide\",\n resultCount: (count) => `${n(count)} ${plural(count, \"icono\", \"iconos\")}`,\n },\n fieldSync: {\n synced: \"Guardado\",\n edited: \"Cambios sin guardar\",\n pending: \"Guardando…\",\n error: \"No se pudo guardar\",\n retry: \"Reintentar\",\n },\n passwordReveal: {\n show: \"Mostrar contraseña\",\n hide: \"Ocultar contraseña\",\n },\n dangerConfirm: {\n arm: \"Eliminar…\",\n confirm: \"Eliminar\",\n cancel: \"Cancelar\",\n prompt: \"Esta acción no se puede deshacer.\",\n password: \"Contraseña\",\n phrase: (phrase) => `Escribe «${phrase}» para confirmar`,\n },\n tabs: {\n add: \"Añadir pestaña\",\n remove: (tab) => `Quitar ${tab}`,\n },\n appShell: {\n collapse: \"Contraer barra lateral\",\n expand: \"Expandir barra lateral\",\n toggleGroup: (groupLabel) => `${groupLabel}: páginas`,\n },\n topBar: {\n theme: \"Cambiar de tema\",\n palette: \"Ajuste de apariencia\",\n language: \"Idioma\",\n switchRole: \"Cambiar de rol\",\n role: (value) => `Rol: ${value}`,\n },\n pickerSheet: {\n close: \"Cerrar\",\n },\n dialogFrame: {\n close: \"Cerrar\",\n },\n bulkActionBar: {\n selected: (count) => `${n(count)} ${count === 1 ? \"seleccionado\" : \"seleccionados\"}`,\n clear: \"Borrar selección\",\n cleared: \"Selección borrada\",\n },\n swipeableRow: {\n actions: \"Acciones de la fila\",\n },\n file: {\n // The kit's own `Intl` unit formatting, pinned to this locale (\"3,4 MB\").\n size: (bytes) => formatFileSize(bytes, numberLocale),\n },\n filePicker: {\n dropzone: \"Carga de archivos\",\n browse: \"Examinar\",\n empty: \"Suelte un archivo aquí\",\n emptyMultiple: \"Suelte archivos aquí\",\n hint: (accept) => (accept ? `Aceptados: ${accept}` : \"Cualquier tipo de archivo\"),\n busy: \"Subiendo…\",\n rejectedPick: (count) =>\n count === 1 ? \"El archivo no se añadió\" : `No se añadió ninguno de los ${count} archivos`,\n rejectedType: (name) => `El tipo de archivo de «${name}» no es compatible`,\n rejectedTypeOnly: (accept) => `Solo archivos ${accept}`,\n rejectedSize: (name, maxSize) => `«${name}» supera ${maxSize}`,\n rejectedCount: (name, maxFiles) =>\n `«${name}» no se ha añadido: como máximo ${n(maxFiles)} ${plural(maxFiles, \"archivo\", \"archivos\")}`,\n rejectedInvalid: (name) => `«${name}» no se puede usar aquí`,\n rejectedMany: (count) =>\n count === 1 ? \"1 archivo no se ha añadido\" : `${n(count)} archivos no se han añadido`,\n selected: (count, firstName) =>\n count === 1 ? `«${firstName}» seleccionado` : `${n(count)} archivos seleccionados`,\n remove: (name) => `Quitar «${name}»`,\n clearAll: \"Quitar todos los archivos\",\n removed: (name) => `«${name}» quitado`,\n cleared: \"Se han quitado todos los archivos\",\n },\n wizard: {\n done: \"Listo\",\n cancel: \"Cancelar\",\n back: \"Atrás\",\n next: \"Siguiente\",\n skip: \"Omitir\",\n finish: \"Finalizar\",\n submitting: \"Creando…\",\n steps: \"Pasos\",\n step: (current, total) => `Paso ${n(current)} de ${n(total)}`,\n cancelTitle: \"¿Descartar este formulario?\",\n confirmCancel: \"Se perderán los datos introducidos.\",\n cancelConfirmLabel: \"Descartar\",\n cancelDismissLabel: \"Seguir editando\",\n reviewTitle: \"Revisión\",\n edit: \"Editar\",\n missingRequired: \"Rellena todos los campos obligatorios.\",\n genericError: \"Se ha producido un error\",\n },\n tour: {\n next: \"Siguiente\",\n back: \"Atrás\",\n skip: \"Omitir\",\n done: \"Listo\",\n awaitClickHint: \"Haz clic en el elemento resaltado para continuar\",\n step: (current, total) => `${n(current)} / ${n(total)}`,\n },\n commandPalette: {\n clear: \"Borrar búsqueda\",\n submit: \"Buscar\",\n close: \"Cerrar\",\n placeholder: \"Buscar…\",\n empty: \"Sin resultados\",\n loading: \"Buscando…\",\n dialog: \"Búsqueda\",\n error: \"La búsqueda ha fallado. Inténtelo de nuevo.\",\n },\n globalSearch: {\n trigger: \"Buscar\",\n placeholder: \"Buscar o ir a…\",\n shortcut: (keys) => `Buscar (${keys})`,\n suggestions: \"Pruebe\",\n results: \"Resultados\",\n },\n sparkline: {\n rising: (first, last) => `Sube de ${first} a ${last}`,\n falling: (first, last) => `Baja de ${first} a ${last}`,\n flat: (value) => `Estable en ${value}`,\n single: (value) => `Un único valor: ${value}`,\n noData: \"Sin datos\",\n named: (name, summary) => `${name}: ${summary}`,\n },\n statTile: {\n increase: (amount) => `Sube ${amount}`,\n decrease: (amount) => `Baja ${amount}`,\n unchanged: \"Sin cambios\",\n better: (change) => `${change} (favorable)`,\n worse: (change) => `${change} (desfavorable)`,\n noValue: \"Sin datos\",\n loading: \"Cargando…\",\n },\n signaturePad: {\n label: \"Firma\",\n instructions: \"Firma en el recuadro con el ratón, el dedo o un lápiz.\",\n typedFallbackHint: \"Si no puedes dibujar, escribe tu nombre.\",\n empty: \"Aún no hay nada dibujado\",\n signed: \"Firma dibujada\",\n undo: \"Deshacer el último trazo\",\n clear: \"Borrar\",\n save: \"Guardar firma\",\n useTyped: \"Escribir el nombre\",\n useDrawn: \"Dibujar la firma\",\n typedName: \"Nombre completo\",\n cleared: \"Firma borrada\",\n undone: \"Último trazo eliminado\",\n viewEmpty: \"Sin firmar\",\n viewDrawn: \"Firma manuscrita\",\n viewTyped: (name) => `Firmado con el nombre escrito ${name}`,\n },\n passwordStrength: {\n // Agrees with \"contraseña\" (feminine).\n tooShort: \"Demasiado corta\",\n weak: \"Débil\",\n fair: \"Aceptable\",\n good: \"Buena\",\n strong: \"Fuerte\",\n announcement: (level) => `Seguridad de la contraseña: ${level}`,\n // Unformatted, as in the English default.\n ruleLength: (minLength) =>\n `Al menos ${minLength} ${plural(minLength, \"carácter\", \"caracteres\")}`,\n ruleCase: \"Mayúsculas y minúsculas\",\n ruleDigit: \"Un número\",\n ruleSymbol: \"Un símbolo\",\n optional: (rule) => `${rule} (opcional)`,\n met: \"Cumplido:\",\n notMet: \"No cumplido:\",\n tooLong: (maxBytes) =>\n `Como máximo ${maxBytes} ${plural(maxBytes, \"carácter\", \"caracteres\")} (las letras con tilde y los emojis cuentan como más de uno).`,\n },\n seriesChart: {\n resetZoom: \"Restablecer zoom\",\n zoomHint:\n \"Arrastra para ampliar: una selección más o menos cuadrada amplía ambos ejes; una larga y estrecha, solo el suyo. Haz doble clic para restablecer.\",\n empty: \"Sin datos\",\n legend: \"Series\",\n points: \"Valores del gráfico\",\n },\n pieChart: {\n slices: \"Sectores del gráfico\",\n slice: (label, value, percent) => `${label}: ${value} (${percent})`,\n total: \"Total\",\n empty: \"Sin datos\",\n legend: \"Categorías\",\n },\n confirmDialog: {\n confirm: \"Confirmar\",\n cancel: \"Cancelar\",\n },\n floatingPanel: {\n close: \"Cerrar\",\n badge: (count) => `${n(count)} ${plural(count, \"nuevo\", \"nuevos\")}`,\n },\n copyButton: {\n copy: \"Copiar\",\n copied: \"Copiado\",\n failed: \"No se pudo copiar\",\n copiedAnnouncement: \"Copiado al portapapeles\",\n failedAnnouncement: \"No se pudo copiar al portapapeles\",\n },\n list: {\n unread: \"No leído\",\n opensInNewTab: \"se abre en una pestaña nueva\",\n },\n breadcrumbs: {\n label: \"Ruta de navegación\",\n showAll: \"Mostrar la ruta completa\",\n },\n toast: {\n close: \"Cerrar notificación\",\n notifications: \"Notificaciones\",\n undo: \"Deshacer\",\n redo: \"Rehacer\",\n },\n form: {\n save: \"Guardar\",\n cancel: \"Cancelar\",\n },\n descriptionList: {\n empty: \"—\",\n },\n lineItems: {\n add: \"Añadir fila\",\n remove: (row) => `Eliminar fila ${row}`,\n confirmRemove: (row) => `¿Eliminar fila ${row}? Pulsa de nuevo para confirmar`,\n row: (row) => `Fila ${row}`,\n cell: (column, row) => `${column}, fila ${row}`,\n totals: \"Total\",\n },\n progressBar: {\n unlimited: \"Ilimitado\",\n overLimit: (amount) => `${amount} por encima del límite`,\n },\n signedAmount: {\n positive: (amount) => `más ${amount}`,\n negative: (amount) => `menos ${amount}`,\n },\n errorBoundary: {\n title: \"Algo salió mal\",\n message: \"No se pudo mostrar esta parte de la página. Inténtelo de nuevo o recargue la página.\",\n retry: \"Reintentar\",\n details: \"Detalles del error\",\n reload: \"Recargar\",\n updateTitle: \"Hay una nueva versión disponible\",\n updateMessage: \"Una parte de la aplicación ha cambiado desde que se cargó esta página. Recárguela para obtener la nueva versión.\",\n offlineTitle: \"Sin conexión\",\n offlineMessage: \"No se pudo cargar esta página sin conexión. Vuelva a conectarse y recargue la página.\",\n copyReport: \"Copiar informe de error\",\n reported: \"El error se ha notificado automáticamente.\",\n reportedAs: (reference) => `Notificado con la referencia ${reference}`,\n },\n authedImage: {\n loading: \"Cargando imagen…\",\n loadError: \"No se pudo cargar la imagen\",\n failedImage: (alt) => `${alt}: no se pudo cargar la imagen`,\n },\n imageGrid: {\n list: \"Imágenes\",\n item: (index, count) => `Imagen ${n(index)} de ${n(count)}`,\n actions: (name) => `Acciones para ${name}`,\n },\n lightbox: {\n dialog: \"Visor de imágenes\",\n close: \"Cerrar\",\n previous: \"Imagen anterior\",\n next: \"Imagen siguiente\",\n counter: (index, count) => `${n(index)} / ${n(count)}`,\n position: (index, count) => `Imagen ${n(index)} de ${n(count)}`,\n download: \"Descargar\",\n zoom: \"Ampliar\",\n noPreview: \"No hay vista previa disponible para este archivo\",\n openInNewTab: \"Abrir en una pestaña nueva\",\n },\n };\n}\n\nexport const UI_KIT_LABELS_ES: UiKitLabels = uiKitLabelsEs();\n"],"mappings":"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","names":[]}
|
package/dist/i18n/locales/fr.js
CHANGED
|
@@ -33,7 +33,8 @@ function uiKitLabelsFr(numberLocale = "fr-FR") {
|
|
|
33
33
|
field: "\xC9crire un commentaire",
|
|
34
34
|
placeholder: "\xC9crire un commentaire\u2026",
|
|
35
35
|
send: "Envoyer",
|
|
36
|
-
sendHint: (modifier) => `${modifier} + Entr\xE9e pour envoyer
|
|
36
|
+
sendHint: (modifier) => `${modifier} + Entr\xE9e pour envoyer`,
|
|
37
|
+
sendHintEnter: "Entr\xE9e pour envoyer, Maj + Entr\xE9e pour aller \xE0 la ligne"
|
|
37
38
|
},
|
|
38
39
|
accountSettings: {
|
|
39
40
|
profile: {
|