export default { "@astryx.pagination.label": { "defaultMessage": "Pagination", "description": "Aria label for the pagination navigation region." }, "@astryx.pagination.previous": { "defaultMessage": "Go to previous page", "description": "Aria label for the previous-page button." }, "@astryx.pagination.next": { "defaultMessage": "Go to next page", "description": "Aria label for the next-page button." }, "@astryx.pagination.previousBy": { "defaultMessage": "Go back {step, number} {step, plural, one {page} other {pages}}", "description": "Aria label for the previous button when it advances more than one page per click (the `step` prop > 1). `step` is the number of pages skipped." }, "@astryx.pagination.nextBy": { "defaultMessage": "Go forward {step, number} {step, plural, one {page} other {pages}}", "description": "Aria label for the next button when it advances more than one page per click (the `step` prop > 1). `step` is the number of pages skipped." }, "@astryx.pagination.first": { "defaultMessage": "Go to first page", "description": "Aria label for the first-page button (« double chevron) in the input pagination variant." }, "@astryx.pagination.last": { "defaultMessage": "Go to last page", "description": "Aria label for the last-page button (» double chevron) in the input pagination variant." }, "@astryx.pagination.goToPage": { "defaultMessage": "Go to page {page, number}", "description": "Aria label for an individual page-number button. `page` is 1-based." }, "@astryx.pagination.goToPageInput": { "defaultMessage": "Go to page", "description": "Aria label for the editable page/row number box in the input pagination variant. No number — the box holds the value itself." }, "@astryx.pagination.pageLabel": { "defaultMessage": "Page", "description": "Visible label before the editable box in the input pagination variant. Example: \"Page [ 1 ] / 10\"." }, "@astryx.pagination.ofTotalPages": { "defaultMessage": "/ {total, number}", "description": "Visible total shown after the editable box in the input pagination variant. Example: the \"/ 10\" in \"Page [ 1 ] / 10\"." }, "@astryx.pagination.pageIndicators": { "defaultMessage": "Page indicators", "description": "Aria label for the dots-variant page-indicator group." }, "@astryx.pagination.itemsPerPage": { "defaultMessage": "Items per page", "description": "Label for the page-size selector." }, "@astryx.pagination.count": { "defaultMessage": "{from, number}–{to, number} of {total, number}", "description": "Visible range-of-total text on a pagination bar. Example: \"1–20 of 347\"; the en-dash is translator's choice." }, "@astryx.pagination.pageOfTotal": { "defaultMessage": "Page {current, number} of {total, number}", "description": "Visible \"Page X of Y\" text on the compact pagination variant; also announced by screen readers. Keep short — sits in a compact toolbar." }, "@astryx.pagination.pageAnnounce": { "defaultMessage": "Page {current, number}", "description": "Screen-reader announcement when a page changes and total is unknown." }, "@astryx.powersearch.editor.field": { "defaultMessage": "Field", "description": "Noun form-label above the field-picker dropdown in the PowerSearch filter-builder popover (which data column to filter on). Not an action." }, "@astryx.powersearch.editor.operator": { "defaultMessage": "Operator", "description": "Noun form-label above the operator dropdown in the PowerSearch filter-builder popover. Refers to a comparison verb (\"is\", \"contains\"), not a math or phone operator." }, "@astryx.powersearch.editor.addFilter": { "defaultMessage": "+ Add filter", "description": "Button label inside a group in the PowerSearch filter-builder; adds another filter row (e.g. \"Status = Active\"). The leading \"+ \" is a plus-sign character." }, "@astryx.powersearch.editor.removeFilter": { "defaultMessage": "Remove filter", "description": "Screen-reader-only label on the \"×\" icon button next to a filter row in the PowerSearch editor; removes that row. Imperative verb." }, "@astryx.powersearch.editor.groupOperator": { "defaultMessage": "Group operator", "description": "Screen-reader-only label for the AND/OR toggle that combines sibling filters inside a filter group. Sighted users see just \"AND\" or \"OR\"." }, "@astryx.powersearch.editor.group": { "defaultMessage": "Group", "description": "Fallback noun label shown on a nested filter-group chip when no AND/OR combining operator has been chosen. Use the noun (\"a cluster\"), not the verb \"to group\"." }, "@astryx.powersearch.editor.delete": { "defaultMessage": "Delete", "description": "Button label inside the PowerSearch filter-editor popover; deletes the currently-edited filter row. Imperative verb form." }, "@astryx.powersearch.editor.cancel": { "defaultMessage": "Cancel", "description": "Button label inside the PowerSearch filter-editor popover; closes the popover and discards pending edits. Imperative verb form." }, "@astryx.powersearch.editor.apply": { "defaultMessage": "Apply", "description": "Primary button label inside the PowerSearch filter-editor popover; confirms the edited filter. Imperative verb; consumers may override to \"Save\"." }, "@astryx.powersearch.valueEditor.value": { "defaultMessage": "Value", "description": "Noun form-label above a single free-text/number input in the PowerSearch value editor (e.g. the \"acme\" in `Name contains acme`). Not a verb or \"worth\"." }, "@astryx.powersearch.valueEditor.values": { "defaultMessage": "Values", "description": "Plural noun form-label above a multi-value chip input in the PowerSearch value editor. Should match its singular counterpart `Value` in your language." }, "@astryx.powersearch.valueEditor.time": { "defaultMessage": "Time", "description": "Noun form-label above a time-of-day (HH:MM) picker in the PowerSearch value editor. Clock time, not duration or era." }, "@astryx.powersearch.valueEditor.date": { "defaultMessage": "Date", "description": "Noun form-label above a calendar-date picker in the PowerSearch value editor. Calendar date, not romantic date or fruit." }, "@astryx.powersearch.valueEditor.relativeDate": { "defaultMessage": "Relative date", "description": "Label for the relative-date selector (e.g. \"Last 7 days\") in the PowerSearch value editor." }, "@astryx.powersearch.valueEditor.startDate": { "defaultMessage": "Start date", "description": "Noun form-label above the start-of-range date picker in the PowerSearch value editor. Pairs with `End date` — keep the two parallel in your language." }, "@astryx.powersearch.valueEditor.endDate": { "defaultMessage": "End date", "description": "Noun form-label above the end-of-range date picker in the PowerSearch value editor. Pairs with `Start date` — keep the two parallel." }, "@astryx.powersearch.valueEditor.entities": { "defaultMessage": "Entities", "description": "\"Entities\" is jargon — plural noun form-label above an entity picker (people, teams, projects). Prefer a natural collective like \"items\" if your language has no equivalent." }, "@astryx.powersearch.valueEditor.searchPlaceholder": { "defaultMessage": "Search…", "description": "Placeholder inside the search input in the PowerSearch entity/typeahead picker. Imperative verb; trailing `…` is one character." }, "@astryx.powersearch.valueEditor.enterValuePlaceholder": { "defaultMessage": "Enter value…", "description": "Placeholder inside a free-text single-value input in the PowerSearch value editor. Imperative verb; trailing `…` is one character." }, "@astryx.powersearch.valueEditor.addValuesPlaceholder": { "defaultMessage": "Add values…", "description": "Placeholder inside a multi-value chip input where the user types items and presses Enter to add each as a chip. Imperative verb; trailing `…` is one character." }, "@astryx.powersearch.valueEditor.enterNumberPlaceholder": { "defaultMessage": "Enter number…", "description": "Placeholder inside a numeric input in the PowerSearch value editor. Imperative verb; trailing `…` is one character." }, "@astryx.powersearch.valueEditor.selectValuesPlaceholder": { "defaultMessage": "Select values…", "description": "Placeholder on a dropdown for choosing values from a fixed enum list in the PowerSearch value editor. Imperative verb (user selects, not types)." }, "@astryx.powersearch.operator.contains": { "defaultMessage": "contains", "description": "PowerSearch string operator, rendered inline as ` contains ` (e.g. `Name contains acme`). Lowercase verb form." }, "@astryx.powersearch.operator.notContains": { "defaultMessage": "does not contain", "description": "PowerSearch negated string operator. Example: `Name does not contain test`. Lowercase; pairs with `contains`." }, "@astryx.powersearch.operator.startsWith": { "defaultMessage": "starts with", "description": "PowerSearch string prefix operator. Example: `Email starts with admin@`. Lowercase." }, "@astryx.powersearch.operator.notStartsWith": { "defaultMessage": "does not start with", "description": "PowerSearch negated prefix operator. Example: `Email does not start with test`. Lowercase; pairs with `starts with`." }, "@astryx.powersearch.operator.endsWith": { "defaultMessage": "ends with", "description": "PowerSearch string suffix operator. Example: `Email ends with @meta.com`. Lowercase." }, "@astryx.powersearch.operator.notEndsWith": { "defaultMessage": "does not end with", "description": "PowerSearch negated suffix operator. Example: `Email does not end with @gmail.com`. Lowercase; pairs with `ends with`." }, "@astryx.powersearch.operator.is": { "defaultMessage": "is", "description": "PowerSearch equality operator for strings/enums. Example: `Status is Active`. Separate from `operator.equals` (numbers) — translations may diverge." }, "@astryx.powersearch.operator.isNot": { "defaultMessage": "is not", "description": "PowerSearch inequality operator for strings/enums. Example: `Status is not Draft`. Pairs with `is`; separate from `operator.notEquals`." }, "@astryx.powersearch.operator.equals": { "defaultMessage": "is", "description": "PowerSearch numeric equality operator. Example: `Age is 30`. Ships same English \"is\" as `operator.is` but is separate so numbers may diverge (e.g. \"equals\")." }, "@astryx.powersearch.operator.notEquals": { "defaultMessage": "is not", "description": "PowerSearch numeric inequality operator. Example: `Count is not 0`. Same divergence option as `operator.equals`." }, "@astryx.powersearch.operator.greaterThan": { "defaultMessage": "is greater than", "description": "PowerSearch numeric operator, strictly greater than. Example: `Age is greater than 18`. Lowercase." }, "@astryx.powersearch.operator.lessThan": { "defaultMessage": "is less than", "description": "PowerSearch numeric operator, strictly less than. Example: `Priority is less than 5`. Lowercase." }, "@astryx.powersearch.operator.greaterThanOrEqual": { "defaultMessage": "is greater than or equal to", "description": "PowerSearch numeric operator, ≥. Example: `Age is greater than or equal to 21`. A shorter form (e.g. \"≥\") is fine if idiomatic." }, "@astryx.powersearch.operator.lessThanOrEqual": { "defaultMessage": "is less than or equal to", "description": "PowerSearch numeric operator, ≤. Example: `Priority is less than or equal to 3`. A shorter form is fine if idiomatic." }, "@astryx.powersearch.operator.before": { "defaultMessage": "is before", "description": "PowerSearch date operator, strictly earlier. Example: `Created is before 2024-01-01`. Temporal, not spatial." }, "@astryx.powersearch.operator.after": { "defaultMessage": "is after", "description": "PowerSearch date operator, strictly later. Example: `Updated is after 2024-06-01`. Temporal." }, "@astryx.powersearch.operator.between": { "defaultMessage": "is between", "description": "PowerSearch date operator, inclusive range. Example: `Created is between 2024-01-01 and 2024-06-30`. The `and ` portion is composed separately." }, "@astryx.powersearch.operator.isTrue": { "defaultMessage": "is true", "description": "PowerSearch boolean operator: matches truthy. Example: `Is admin is true`. Pairs with `is false`; field may be affirmative or a yes/no question." }, "@astryx.powersearch.operator.isFalse": { "defaultMessage": "is false", "description": "PowerSearch boolean operator: matches falsy. Example: `Is admin is false`. Pairs with `is true`." }, "@astryx.powersearch.operator.isAnyOf": { "defaultMessage": "is any of", "description": "PowerSearch list operator: value is in the set. Example: `Status is any of [Active, Paused, Draft]`. The value list is composed separately; pairs with `is none of`." }, "@astryx.powersearch.operator.isNoneOf": { "defaultMessage": "is none of", "description": "PowerSearch negated list operator: value not in the set. Example: `Status is none of [Archived, Deleted]`. Pairs with `is any of`." }, "@astryx.powersearch.valueEditor.itemsCount": { "defaultMessage": "{count, number} {count, plural, one {item} other {items}}", "description": "Overflow summary on a compact filter chip when the list of selected items is too long. Example: `3 items` or `1 item`." }, "@astryx.powersearch.valueEditor.entitiesCount": { "defaultMessage": "{count, number} {count, plural, one {entity} other {entities}}", "description": "Overflow summary on a compact filter chip when the list of selected entities is too long. Example: `5 entities` or `1 entity`. Pair with `itemsCount` translation." }, "@astryx.powersearch.valueEditor.dateRange": { "defaultMessage": "date range", "description": "Fallback lowercase noun rendered inline in a filter chip when a date-range value can't be formatted (e.g. `Created is between date range`). Keep lowercase." }, "@astryx.powersearch.valueEditor.filtersCount": { "defaultMessage": "{count, number} {count, plural, one {filter} other {filters}}", "description": "Summary inside a filter chip when the value is a nested set of filters. Example: `3 filters` or `1 filter`." }, "@astryx.powersearch.resultCount": { "defaultMessage": "{count, number} {count, plural, one {result} other {results}}", "description": "Live result-count text next to the PowerSearch input, announced to screen readers on change. Example: `12 results`, `1 result`; keep compact." }, "@astryx.alertDialog.cancel": { "defaultMessage": "Cancel", "description": "Button label on the secondary/dismiss button of an AlertDialog (modal confirmation). Imperative verb; consumers usually override with task-specific text." }, "@astryx.appShell.mobileNavigation": { "defaultMessage": "Mobile navigation", "description": "Screen-reader-only accessible name for the mobile-only navigation region on small viewports. \"Mobile\" = phone/tablet (small screen), not \"movable\"." }, "@astryx.appShell.skipToContent": { "defaultMessage": "Skip to content", "description": "Text of the skip link — the first focusable element on the page, visible only while keyboard-focused. Activating it jumps focus past the navigation to the main content area. Imperative verb; keep short." }, "@astryx.avatar.nameWithStatus": { "defaultMessage": "{name}, {status}", "description": "Screen-reader accessible name for an Avatar showing a status indicator; composes the person's name with the status label, e.g. \"Jane Doe, Online\". {name} = the avatar's name/alt text, {status} = the status dot's label. Adjust separator and order per locale." }, "@astryx.avatarGroup.label": { "defaultMessage": "Avatars", "description": "Screen-reader-only fallback name for a horizontal cluster of user avatar images. Plural noun; consumers usually override with \"Team members\", \"Attendees\", etc." }, "@astryx.avatarGroup.keyboardHint": { "defaultMessage": "Use arrow keys to move between avatars", "description": "Screen-reader-only instruction attached (via aria-describedby) to a group of interactive avatars that share a single Tab stop. Tells keyboard users the Left/Right arrow keys move focus between the avatars. Only announced when the group has interactive (link/button) avatars." }, "@astryx.avatarGroup.overflow": { "defaultMessage": "{count, number} more", "description": "Accessible name for the \"+N\" overflow indicator at the end of an AvatarGroup — announces how many additional avatars are not shown. Example: `5 more`. The visible \"+N\" text is unaffected; this is the aria-label only." }, "@astryx.banner.dismiss": { "defaultMessage": "Dismiss", "description": "\"Dismiss\" = close/hide this notification (not \"reject a person\"). Tooltip on the small X button on a Banner, and its aria label when the banner's title is not plain text." }, "@astryx.banner.dismissTitled": { "defaultMessage": "{dismiss} {title}", "description": "Aria label on the small X button on a Banner, naming which banner it closes so stacked banners are distinguishable. `{dismiss}` is the already-translated tooltip text from `banner.dismiss`; keep it verbatim in the message so visible and accessible labels match. `{title}` is the banner's own title text — example: `Dismiss Upload failed`. Reorder the placeholders freely." }, "@astryx.calendar.previousMonth": { "defaultMessage": "Previous month", "description": "Screen-reader-only label on the left-arrow button in a Calendar's month header (navigates one month back). Pairs with `calendar.nextMonth`." }, "@astryx.calendar.nextMonth": { "defaultMessage": "Next month", "description": "Screen-reader-only label on the right-arrow button in a Calendar's month header (navigates one month forward). Pairs with `calendar.previousMonth`." }, "@astryx.calendar.daySelected": { "defaultMessage": "{date}, selected", "description": "Accessible name for the Calendar day button that is the current single-mode selection. `{date}` is the localized full date, e.g. \"Thursday, January 15, 2026\". The trailing state word tells screen-reader users the focused day is selected." }, "@astryx.calendar.dayRangeStart": { "defaultMessage": "{date}, range start", "description": "Accessible name for the Calendar day button that begins the selected date range (or the first pick of an in-progress range). `{date}` is the localized full date." }, "@astryx.calendar.dayRangeEnd": { "defaultMessage": "{date}, range end", "description": "Accessible name for the Calendar day button that ends the selected date range. `{date}` is the localized full date. Pairs with `calendar.dayRangeStart`." }, "@astryx.calendar.dayRangeStartAndEnd": { "defaultMessage": "{date}, range start and range end", "description": "Accessible name for a Calendar day button that both begins and ends a completed one-day range. `{date}` is the localized full date." }, "@astryx.calendar.dayInRange": { "defaultMessage": "{date}, in range", "description": "Accessible name for a Calendar day button strictly inside the selected date range (not an endpoint). `{date}` is the localized full date." }, "@astryx.calendar.rangeStartAnnounce": { "defaultMessage": "Start date {date}. Select an end date.", "description": "Screen-reader announcement after the first pick of a Calendar range selection. `{date}` is the localized full date. Prompts the user that a second pick completes the range." }, "@astryx.calendar.rangeCompleteAnnounce": { "defaultMessage": "Selected range: {start} to {end}.", "description": "Screen-reader announcement after the second pick completes a Calendar range selection. `{start}` and `{end}` are localized full dates in chronological order." }, "@astryx.calendar.rangeClearedAnnounce": { "defaultMessage": "Cleared start date {date}. Select a start date.", "description": "Screen-reader announcement when the user clicks the in-progress range start again, which clears it instead of completing a zero-length range. `{date}` is the localized full date." }, "@astryx.carousel.label": { "defaultMessage": "Carousel", "description": "Screen-reader-only fallback name for a horizontally-scrolling row of items. If \"carousel\" is unfamiliar in your locale, prefer the standard term (e.g. \"slider\")." }, "@astryx.carousel.scrollLeft": { "defaultMessage": "Scroll left", "description": "Screen-reader-only label on the left arrow button in a Carousel. Pairs with `carousel.scrollRight`; in RTL locales, coordinate the two so left/right match layout." }, "@astryx.carousel.scrollRight": { "defaultMessage": "Scroll right", "description": "Screen-reader-only label on the right arrow button in a Carousel. Pairs with `carousel.scrollLeft`; same RTL note." }, "@astryx.carousel.slideLabel": { "defaultMessage": "Slide {current, number} of {total, number}", "description": "Screen-reader accessible name for one slide in a Carousel, giving its position. `current` is the 1-based slide number; `total` is the slide count." }, "@astryx.chart.label": { "defaultMessage": "Chart", "description": "Generic screen-reader name for a Chart with no primary series and no consumer-supplied title. Noun (a data visualization), not a verb." }, "@astryx.chart.labelWithSeries": { "defaultMessage": "Chart of {series} by {xKey}", "description": "Generated screen-reader name for a Chart without a consumer-supplied title. `{series}` is a locale-formatted list of series labels; `{xKey}` is the consumer's horizontal data-field name." }, "@astryx.chart.dataTableCaption": { "defaultMessage": "{label} data", "description": "Screen-reader-only caption for the small-data table that mirrors a Chart. `{label}` is the Chart's resolved accessible name." }, "@astryx.chartLegend.label": { "defaultMessage": "Chart legend", "description": "Screen-reader-only accessible name for the list of series labels and swatches rendered by ChartLegend." }, "@astryx.chat.status.sending": { "defaultMessage": "Sending", "description": "Chat send-status caption under an outgoing message while it is being transmitted. Part of the set sending → sent → delivered → read (or failed) — keep tense/aspect consistent." }, "@astryx.chat.status.sent": { "defaultMessage": "Sent", "description": "Chat send-status caption shown once the message reaches the server. Part of the set sending → **sent** → delivered → read (or failed) — keep tense consistent." }, "@astryx.chat.status.delivered": { "defaultMessage": "Delivered", "description": "Chat send-status caption shown once the recipient's device received the message. Part of the set sending → sent → **delivered** → read (or failed)." }, "@astryx.chat.status.read": { "defaultMessage": "Read", "description": "Chat send-status caption shown once the recipient opened the message. English past-participle (\"has been read\", /rɛd/), not the present verb — part of the set sending → sent → delivered → **read**." }, "@astryx.chat.status.failed": { "defaultMessage": "Failed", "description": "Chat send-status caption shown when the send attempt errored. Part of the set — the terminal failure branch, orthogonal to the sent → delivered → read success track." }, "@astryx.chat.messageAriaLabel": { "defaultMessage": "Message {status}", "description": "Screen-reader-only accessible name for a chat message row. `{status}` interpolates the localized status word (e.g. `Message sent`, `Message delivered`) — reorder if needed." }, "@astryx.chat.pastedText.expand": { "defaultMessage": "Expand", "description": "Button label on a chip in the chat composer representing a long pasted text block; clicking reveals full content. \"Expand\" here means reveal more, not grow physically." }, "@astryx.checkboxList.item.checkbox": { "defaultMessage": "Checkbox", "description": "Localized hidden text used internally when a rich visible label names the checkbox through aria-labelledby. It does not become the computed name; callers must provide aria-label when rich content has no text." }, "@astryx.commandPalette.emptySearch": { "defaultMessage": "No results", "description": "Fallback empty-state text inside a CommandPalette when the user's query has no matches. Very short (2 words); neutral tone." }, "@astryx.commandPalette.emptyBootstrap": { "defaultMessage": "Type to search", "description": "Onboarding empty-state text shown inside a CommandPalette on first open, before the user has typed anything. Imperative sentence fragment." }, "@astryx.commandPalette.resultCount": { "defaultMessage": "{count, number} {count, plural, one {result} other {results}}", "description": "Screen-reader-only announcement of how many commands match the CommandPalette query as the user types. Example: `12 results`, `1 result`; keep compact." }, "@astryx.commandPalette.noResultsFor": { "defaultMessage": "No results for {query}", "description": "Screen-reader-only announcement when a CommandPalette query matches nothing. `{query}` is the user's verbatim search text; keep it last if your language allows so truncation-by-AT still conveys the outcome." }, "@astryx.commandPalette.loading": { "defaultMessage": "Loading", "description": "Screen-reader-only announcement that a CommandPalette search has started and results are being fetched. Present-progressive form; matches the visible spinner." }, "@astryx.dateRangeInput.presetDateRanges": { "defaultMessage": "Preset date ranges", "description": "Screen-reader-only accessible name for the sidebar of quick-pick preset ranges inside a DateRangeInput popover (e.g. \"Last 7 days\", \"This month\")." }, "@astryx.dateTimeInput.timePlaceholder": { "defaultMessage": "Select a time", "description": "Grey placeholder inside the empty time-of-day slot in a DateTimeInput. \"Time\" = clock time (HH:MM), not duration." }, "@astryx.dialog.close": { "defaultMessage": "Close", "description": "\"Close\" = shut/dismiss the dialog, not \"nearby\" (English homograph). Aria label AND tooltip on the X at the top-right of a Dialog." }, "@astryx.dropdownMenu.label": { "defaultMessage": "Menu", "description": "Screen-reader-only fallback name for a dropdown menu popover. Very generic; consumers usually override. Noun (\"a menu\"), not the imperative." }, "@astryx.dropdownMenu.back": { "defaultMessage": "Back", "description": "Button label that returns from a nested action list to its parent inside a DropdownMenu bottom sheet. Imperative navigation action." }, "@astryx.lightbox.close": { "defaultMessage": "Close", "description": "\"Close\" = shut/dismiss (not \"nearby\"). Screen-reader-only label on the X button that dismisses a Lightbox." }, "@astryx.lightbox.previous": { "defaultMessage": "Previous", "description": "Screen-reader-only label on the left-arrow button in a Lightbox (navigates to previous media item). Pairs with `lightbox.next`." }, "@astryx.lightbox.next": { "defaultMessage": "Next", "description": "Screen-reader-only label on the right-arrow button in a Lightbox (navigates to next media item). Pairs with `lightbox.previous`." }, "@astryx.chatTypingIndicator.one": { "defaultMessage": "{name} is typing…", "description": "Politely announced status naming the single person currently typing in a chat. `name` is a display name supplied by the app. Present-progressive form; the trailing ellipsis is the single … character." }, "@astryx.chatTypingIndicator.many": { "defaultMessage": "{names} are typing…", "description": "Politely announced status when more than one person is typing in a chat. `names` is already joined for the locale by Intl.ListFormat, so translations must not add their own conjunction — place `{names}` where the joined list belongs." }, "@astryx.chatTypingIndicator.others": { "defaultMessage": "{count, number} {count, plural, one {other} other {others}}", "description": "Overflow element for the chat typing status when three or more people type: the first name is shown and the rest collapse into this phrase, which is then joined to the name by Intl.ListFormat. Renders as the last list item, e.g. \"Ana and 2 others\"." }, "@astryx.listInput.emptyTitle": { "defaultMessage": "No {itemName}s yet", "description": "EmptyState title shown inside a lab ListInput when its collection has no records. `{itemName}` is the consumer's singular noun for one record (e.g. \"guest\"); the source appends a literal \"s\" to pluralize it, which only works for regular English plurals. If your language cannot pluralize an interpolated noun this way, rephrase around `{itemName}` instead (e.g. \"No {itemName} added yet\")." }, "@astryx.listInput.emptyDescription": { "defaultMessage": "Add a {itemName} to get started.", "description": "EmptyState supporting text shown inside a lab ListInput when its collection has no records. `{itemName}` is the consumer's singular noun for one record (e.g. \"guest\")." }, "@astryx.listInput.addItem": { "defaultMessage": "Add {itemName}", "description": "Accessible label on the button that appends a new record to a lab ListInput. `{itemName}` is the consumer's singular noun for one record (e.g. \"guest\")." }, "@astryx.listInput.removeItem": { "defaultMessage": "Remove {itemName} {position, number}", "description": "Accessible label and tooltip on the button that deletes one record from a lab ListInput. `{itemName}` is the consumer's singular noun for one record; `{position}` is its 1-based row number (e.g. \"Remove guest 2\")." }, "@astryx.listInput.removeUnavailable": { "defaultMessage": "Remove is unavailable while the list is disabled", "description": "Tooltip shown on the Remove button when the ListInput is disabled or loading, explaining why the action cannot be performed." }, "@astryx.listInput.reorderItem": { "defaultMessage": "Reorder {itemName} {position, number}", "description": "Accessible label on the drag-handle button that reorders one record in a lab ListInput. `{itemName}` is the consumer's singular noun for one record; `{position}` is its 1-based row number (e.g. \"Reorder guest 2\")." }, "@astryx.listInput.fieldLabelWithPosition": { "defaultMessage": "{header}, {itemName} {position, number} of {total, number}", "description": "Accessible name for a field inside a lab ListInput row after the first row, disambiguating repeated column labels. `{header}` is the column's own label (e.g. \"Name\"); `{itemName}` is the consumer's singular noun for one record; `{position}`/`{total}` are the row's 1-based index and the total row count (e.g. \"Name, guest 2 of 3\")." }, "@astryx.listInput.reorderInstructions": { "defaultMessage": "Use Arrow Up or Arrow Down to move this item one position. Press Space or Enter to pick it up for extended keyboard reordering.", "description": "Visually-hidden instructions describing how to use a lab ListInput row's keyboard reorder handle, referenced via aria-describedby from every reorder button." }, "@astryx.listInput.announceAdded": { "defaultMessage": "Added {itemName} {position, number}.", "description": "Screen-reader-only live announcement after a new record is appended to a lab ListInput. `{itemName}` is the consumer's singular noun for one record; `{position}` is the new record's 1-based row number." }, "@astryx.listInput.announceRemoved": { "defaultMessage": "Removed {itemName} {position, number}.", "description": "Screen-reader-only live announcement after a record is deleted from a lab ListInput. `{itemName}` is the consumer's singular noun for one record; `{position}` is the removed record's former 1-based row number." }, "@astryx.listInput.announceGrabbed": { "defaultMessage": "{itemName} {position, number} grabbed. Use arrow keys to move, Space or Enter to drop, and Escape to cancel.", "description": "Screen-reader-only live announcement when a lab ListInput record's keyboard reorder handle enters extended \"lift\" mode. `{itemName}` is the consumer's singular noun for one record; `{position}` is its 1-based row number." }, "@astryx.listInput.announceMovedToPosition": { "defaultMessage": "{itemName} moved to position {position, number} of {total, number}.", "description": "Screen-reader-only live announcement each time a lab ListInput record's reorder position changes (arrow-key step, keyboard lift-mode preview, or pointer drag). `{itemName}` is the consumer's singular noun for one record; `{position}`/`{total}` are the record's new 1-based position and the total row count." }, "@astryx.listInput.announceReorderCancelled": { "defaultMessage": "Reordering cancelled.", "description": "Screen-reader-only live announcement when a lab ListInput reorder in progress is cancelled (Escape key, blur, or the collection becoming disabled/loading mid-drag)." }, "@astryx.listInput.announceReturnedToPosition": { "defaultMessage": "{itemName} returned to position {position, number}.", "description": "Screen-reader-only live announcement when a lab ListInput reorder is committed without the record's position actually changing. `{itemName}` is the consumer's singular noun for one record; `{position}` is its unchanged 1-based row number." }, "@astryx.listInput.announceDropped": { "defaultMessage": "{itemName} dropped at position {position, number} of {total, number}.", "description": "Screen-reader-only live announcement when a lab ListInput reorder is committed with the record's position actually changing. `{itemName}` is the consumer's singular noun for one record; `{position}`/`{total}` are its new 1-based position and the total row count." }, "@astryx.listInput.announceAlreadyAtBoundary": { "defaultMessage": "This {itemName} is already {boundary, select, first {first} last {last} other {}}.", "description": "Screen-reader-only live announcement when an arrow-key reorder attempt has no effect because the record is already at that end of the list. `{itemName}` is the consumer's singular noun for one record; `{boundary}` is always exactly \"first\" or \"last\"." }, "@astryx.markdown.taskList": { "defaultMessage": "Task list", "description": "Screen-reader-only accessible name for a GitHub-flavored Markdown task list (rendered from `- [ ] item` / `- [x] done` syntax)." }, "@astryx.markdown.table": { "defaultMessage": "Table", "description": "Screen-reader-only accessible name for a table rendered inside a Markdown block. Noun (\"a table\"), not the verb. Separate from `@astryx.table.label` — translations may diverge." }, "@astryx.mobileNav.closeNavigation": { "defaultMessage": "Close navigation", "description": "Screen-reader-only label on the X/close button that dismisses the MobileNav overlay. Pairs with `mobileNav.toggle.open`." }, "@astryx.multiSelector.selectAll": { "defaultMessage": "Select all", "description": "Label on the checkbox/toggle at the top of a MultiSelector dropdown that selects every option. \"All\" is a determiner here (as in \"all the options\"), not the pronoun." }, "@astryx.multiSelector.searchPlaceholder": { "defaultMessage": "Search…", "description": "Placeholder inside the search input at the top of a MultiSelector's dropdown panel. Imperative verb; trailing `…` is one character." }, "@astryx.multiSelector.searchOptions": { "defaultMessage": "Search options", "description": "Screen-reader-only accessible name for that same search input inside a MultiSelector." }, "@astryx.multiSelector.empty": { "defaultMessage": "No options", "description": "Shown in a MultiSelector's dropdown panel when it was given no options at all, and announced in a polite live region on open. Very short (2 words); neutral tone, not error-y." }, "@astryx.multiSelector.selectAllPartiallySelected": { "defaultMessage": "{label}, partially selected", "description": "Accessible name for the MultiSelector select-all option while only some options are selected. `{label}` is the visible select-all label (e.g. \"Select all\"). ARIA forbids aria-selected=\"mixed\" on options, so the indeterminate state is conveyed through the name instead. \"Partially\" = some but not all." }, "@astryx.popover.close": { "defaultMessage": "Close popover", "description": "\"Close\" = shut/dismiss, not \"nearby\". Screen-reader-only label on the close button inside a Popover." }, "@astryx.selector.searchPlaceholder": { "defaultMessage": "Search…", "description": "Placeholder inside the search input at the top of a Selector's dropdown panel (for filtering options). Imperative verb; trailing `…` is one character." }, "@astryx.selector.searchOptions": { "defaultMessage": "Search options", "description": "\"Options\" = the list of choices in the dropdown. Screen-reader-only accessible name for the search input inside a Selector." }, "@astryx.selector.empty": { "defaultMessage": "No options", "description": "Shown in a Selector's dropdown panel when it was given no options at all, and announced in a polite live region on open. Very short (2 words); neutral tone, not error-y." }, "@astryx.sideNav.label": { "defaultMessage": "Side navigation", "description": "Screen-reader-only accessible name for the primary vertical sidebar nav (usually on the left)." }, "@astryx.sideNav.resizeSidebar": { "defaultMessage": "Resize sidebar", "description": "Screen-reader-only label on the vertical drag handle at the right edge of the SideNav that lets the user resize the sidebar's width." }, "@astryx.sideNav.heading.openMenu": { "defaultMessage": "Open menu", "description": "Screen-reader-only label on the `⋯` overflow-menu button embedded in a SideNav section heading. Same string as `topNav.heading.openMenu` — translations may share." }, "@astryx.tabList.label": { "defaultMessage": "Tabs", "description": "Screen-reader-only fallback name for a horizontal tab bar. Plural noun; \"Tabs\" here = UI tab panels, not browser tabs or the Tab key." }, "@astryx.table.label": { "defaultMessage": "Table", "description": "Fallback screen-reader-only accessible name for a data-table region when the consumer provides none. Noun (\"a table\"), not the verb \"to table\"." }, "@astryx.table.noData": { "defaultMessage": "No data", "description": "Fallback empty-state text in the table body when there are zero rows. Neutral tone (not error-y); consumers commonly override with something specific like \"No results\"." }, "@astryx.table.filter.allPlaceholder": { "defaultMessage": "All", "description": "Placeholder on a per-column filter dropdown when nothing is selected, meaning \"no filter — all rows match\". Determiner form (as in \"all values\"), not the pronoun." }, "@astryx.table.filter.reset": { "defaultMessage": "Reset", "description": "Button label inside a table's filter panel/popover; clears pending filter values back to defaults. Imperative verb." }, "@astryx.table.filter.apply": { "defaultMessage": "Apply", "description": "Primary button label inside a table's filter panel/popover; commits pending filter values. Imperative verb; pairs with `Reset`." }, "@astryx.table.rowStatus.columnHeader": { "defaultMessage": "Row status", "description": "Screen-reader-only column header for the narrow status-indicator gutter a Table gains from useTableRowStatus. Sighted users see a blank gutter; assistive tech announces this as the column name." }, "@astryx.table.selection.selectAllRows": { "defaultMessage": "Select all rows", "description": "Aria label for the \"select all rows\" checkbox in a Table header." }, "@astryx.table.selection.selectRow": { "defaultMessage": "Select row", "description": "Aria label for the \"select row\" checkbox on a Table row." }, "@astryx.table.selection.selectRowNamed": { "defaultMessage": "Select {label}", "description": "Aria label for a Table row's selection checkbox when a per-row label is available (via getRowLabel). `label` is the row's human-readable identity, e.g. \"Alice\"." }, "@astryx.table.sort.ascending": { "defaultMessage": "Sort ascending", "description": "Screen-reader-only label on a column header button that will sort the column ascending. Part of a set with `sort.descending` and `sort.clear` — keep parallel." }, "@astryx.table.sort.descending": { "defaultMessage": "Sort descending", "description": "Screen-reader-only label on a column header button that will sort the column descending. Part of a set with `sort.ascending` and `sort.clear`." }, "@astryx.table.sort.clear": { "defaultMessage": "Clear sort", "description": "Screen-reader-only label on a column header button that will remove the current sort. \"Clear\" here means remove, not transparent. Part of the sort set." }, "@astryx.table.sort.direction.ascending": { "defaultMessage": "ascending", "description": "Localized direction word interpolated as `direction` into @astryx.table.sort.sortedBy and @astryx.table.sort.sortedByWithPriority." }, "@astryx.table.sort.direction.descending": { "defaultMessage": "descending", "description": "Localized direction word interpolated as `direction` into @astryx.table.sort.sortedBy and @astryx.table.sort.sortedByWithPriority." }, "@astryx.table.sort.sortBy": { "defaultMessage": "Sort by {label}", "description": "Aria label for a sortable Table header button when the column is unsorted. `label` is the column header text." }, "@astryx.table.sort.sortedBy": { "defaultMessage": "Sort by {label}, sorted {direction}", "description": "Aria label for a sorted Table header button. `direction` is the localized direction word from @astryx.table.sort.direction.*." }, "@astryx.table.sort.sortedByWithPriority": { "defaultMessage": "Sort by {label}, sorted {direction}, priority {rank, number} of {total, number}", "description": "Aria label for a sorted Table header button in multi-sort. `rank` is the 1-based position of this column in the sort order; `total` is the number of sorted columns." }, "@astryx.toast.dismiss": { "defaultMessage": "Dismiss notification", "description": "Screen-reader-only label on the X button of a Toast (transient notification popup). Distinct from `banner.dismiss` (persistent banner)." }, "@astryx.toast.viewport": { "defaultMessage": "Notifications", "description": "Screen-reader-only accessible name for the invisible landmark region hosting the stack of Toast popups (usually pinned to a screen corner)." }, "@astryx.tokenizer.clearAll": { "defaultMessage": "Clear all", "description": "Label on the \"×\" button that removes every token/chip from a Tokenizer input. Imperative verb + determiner \"all\"; short." }, "@astryx.topNav.heading.openMenu": { "defaultMessage": "Open menu", "description": "Screen-reader-only label on the `⋯` overflow button in a TopNav section heading. Kept separate from `sideNav.heading.openMenu` so translations may diverge." }, "@astryx.topNav.landmarkLabel": { "defaultMessage": "Top navigation", "description": "Default accessible name (aria-label) for the