@alfadocs/ui-kit-debug 1.130.2 → 1.131.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/dist/_chunks/bill-line-table-DHKb_O7c.js +2000 -0
  2. package/dist/_chunks/bill-line-table-DHKb_O7c.js.map +1 -0
  3. package/dist/_chunks/{data-grid-C9xlUMLt.js → data-grid-B2oaI7Lt.js} +2345 -2328
  4. package/dist/_chunks/data-grid-B2oaI7Lt.js.map +1 -0
  5. package/dist/_chunks/{default-tabs-BryvhiHv.js → default-tabs-DbebYO04.js} +3 -3
  6. package/dist/_chunks/{default-tabs-BryvhiHv.js.map → default-tabs-DbebYO04.js.map} +1 -1
  7. package/dist/_chunks/{invoice-upload-list-868v1oDe.js → invoice-upload-list-B5aMffTy.js} +21 -21
  8. package/dist/_chunks/{invoice-upload-list-868v1oDe.js.map → invoice-upload-list-B5aMffTy.js.map} +1 -1
  9. package/dist/_chunks/{toolbar-BK6S9PhI.js → toolbar-CfdoJzMV.js} +2 -2
  10. package/dist/_chunks/{toolbar-BK6S9PhI.js.map → toolbar-CfdoJzMV.js.map} +1 -1
  11. package/dist/_chunks/{warehouse-load-summary-DkAKXcw0.js → warehouse-load-summary-CMMYzTDv.js} +75 -66
  12. package/dist/_chunks/warehouse-load-summary-CMMYzTDv.js.map +1 -0
  13. package/dist/agent-catalog.json +10 -10
  14. package/dist/agent-i18n/en.json +3 -3
  15. package/dist/browser-support.js +1 -1
  16. package/dist/components/_shared/decimal.d.ts +2 -0
  17. package/dist/components/_shared/decimal.d.ts.map +1 -1
  18. package/dist/components/bill-line-table/bill-line-table.agent.d.ts.map +1 -1
  19. package/dist/components/bill-line-table/bill-line-table.columns.d.ts +4 -0
  20. package/dist/components/bill-line-table/bill-line-table.columns.d.ts.map +1 -1
  21. package/dist/components/bill-line-table/bill-line-table.d.ts.map +1 -1
  22. package/dist/components/bill-line-table/bill-line-table.header.d.ts +6 -0
  23. package/dist/components/bill-line-table/bill-line-table.header.d.ts.map +1 -1
  24. package/dist/components/bill-line-table/bill-line-table.invoice-cell.d.ts +6 -0
  25. package/dist/components/bill-line-table/bill-line-table.invoice-cell.d.ts.map +1 -0
  26. package/dist/components/bill-line-table/bill-line-table.model.d.ts +23 -10
  27. package/dist/components/bill-line-table/bill-line-table.model.d.ts.map +1 -1
  28. package/dist/components/bill-line-table/bill-line-table.scope.d.ts +56 -0
  29. package/dist/components/bill-line-table/bill-line-table.scope.d.ts.map +1 -0
  30. package/dist/components/bill-line-table/bill-line-table.types.d.ts +90 -10
  31. package/dist/components/bill-line-table/bill-line-table.types.d.ts.map +1 -1
  32. package/dist/components/bill-line-table/bill-line-table.variants.d.ts +2 -0
  33. package/dist/components/bill-line-table/bill-line-table.variants.d.ts.map +1 -1
  34. package/dist/components/bill-line-table/index.d.ts +3 -2
  35. package/dist/components/bill-line-table/index.d.ts.map +1 -1
  36. package/dist/components/bill-line-table/index.js +20 -18
  37. package/dist/components/bill-table/index.js +1 -1
  38. package/dist/components/data-grid/body.d.ts.map +1 -1
  39. package/dist/components/data-grid/data-grid.d.ts.map +1 -1
  40. package/dist/components/data-grid/data-grid.variants.d.ts.map +1 -1
  41. package/dist/components/data-grid/index.js +2 -2
  42. package/dist/components/data-grid/types.d.ts +6 -0
  43. package/dist/components/data-grid/types.d.ts.map +1 -1
  44. package/dist/components/data-grid/use-data-grid-engine.d.ts.map +1 -1
  45. package/dist/components/invoice-upload-list/index.js +1 -1
  46. package/dist/components/invoice-upload-list/invoice-upload-list.d.ts.map +1 -1
  47. package/dist/components/warehouse-load-summary/index.js +1 -1
  48. package/dist/components/warehouse-load-summary/warehouse-load-summary.d.ts.map +1 -1
  49. package/dist/core.css +1 -1
  50. package/dist/decimal/index.js +32 -28
  51. package/dist/decimal/index.js.map +1 -1
  52. package/dist/host-compat.css +4 -1
  53. package/dist/index.js +1060 -1058
  54. package/dist/tokens.css +1 -1
  55. package/package.json +1 -1
  56. package/dist/_chunks/bill-line-table-CzYzg-Qh.js +0 -1757
  57. package/dist/_chunks/bill-line-table-CzYzg-Qh.js.map +0 -1
  58. package/dist/_chunks/data-grid-C9xlUMLt.js.map +0 -1
  59. package/dist/_chunks/warehouse-load-summary-DkAKXcw0.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"toolbar-BK6S9PhI.js","sources":["../../src/components/data-grid/toolbar.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* DataGridToolbar: the shared table toolbar parts over DataGrid. */\n/* */\n/* The parts live in `_shared/table-toolbar/` and reach the grid only */\n/* through its `TableToolbarSeam` (`./toolbar-seam.ts`). Inside the */\n/* grid's `toolbar` slot they find it through `DataGridContext`; a */\n/* toolbar lifted into a page header uses `DataGridToolbarProvider`. */\n/* Callbacks get a `ToolbarActionContext` (ids and an export snapshot), */\n/* never an engine API. No AG Grid, no DataTable import. */\n/* -------------------------------------------------------------------- */\n\nimport { forwardRef, useCallback, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { TableToolbarProvider } from '../_shared/table-toolbar/context';\nimport {\n exportFileName,\n snapshotToTable,\n writeTablePdf,\n writeTableXlsx,\n} from '../_shared/table-toolbar/export-files';\nimport {\n actionContextOf,\n createTableToolbarParts,\n} from '../_shared/table-toolbar/parts';\nimport type { TableToolbarSeam } from '../_shared/table-toolbar/seam';\nimport { isDevelopment } from '../_shared/is-development';\nimport {\n dataGridMountSignal,\n getDataGridToolbarSeam,\n useDataGridContext,\n} from './grid-context';\nimport { dataGridSeamCaption } from './toolbar-seam';\nimport type {\n DataGridExportFormat,\n DataGridHandle,\n DataGridToolbarBulkActionProps,\n DataGridToolbarColumnToggleProps,\n DataGridToolbarExportMenuItemProps,\n DataGridToolbarExportMenuProps,\n DataGridToolbarFacetFilterProps,\n DataGridToolbarFilterChipsProps,\n DataGridToolbarPrintProps,\n DataGridToolbarProviderProps,\n DataGridToolbarQuickSearchProps,\n DataGridToolbarRefreshProps,\n DataGridToolbarRootProps,\n} from './types';\n\n/** The grid's own seam when the part sits in its `toolbar` slot. */\nfunction useSlotSeam(): TableToolbarSeam | null {\n return useDataGridContext()?.toolbarSeam ?? null;\n}\n\n/* ------------------------------------------------------------------ */\n/* Lifted toolbar: DataGridToolbarProvider */\n/* ------------------------------------------------------------------ */\n\n/** A seam with nothing behind it, for a lifted toolbar whose grid has not\n * mounted yet: reads are empty, writes do nothing, `isReady()` is false. */\nconst UNBOUND_SEAM: TableToolbarSeam = {\n features: {\n syncsFilterInputs: true,\n exportsAllRows: false,\n keyboardReorder: true,\n },\n isReady: () => false,\n subscribe: () => () => {},\n getColumns: () => [],\n setColumnVisible: () => {},\n moveColumn: () => {},\n getQuickFilter: () => '',\n setQuickFilter: () => {},\n getFilterModel: () => ({}),\n setColumnFilter: () => {},\n clearAllFilters: () => {},\n setFacet: () => {},\n getFacet: () => null,\n getSelectionCount: () => 0,\n getSelectedRowIds: () => [],\n getExportSnapshot: () => undefined,\n exportCsv: () => {},\n print: () => {},\n};\n\ninterface Bound {\n handle: DataGridHandle | null;\n seam: TableToolbarSeam | null;\n}\n\n/**\n * For a toolbar outside the grid (a page header). Binds to whatever\n * `getGrid()` returns, once after mount and again whenever any DataGrid\n * mounts or unmounts (`dataGridMountSignal`): no polling. Until a grid is\n * bound the parts are inert.\n */\nexport function DataGridToolbarProvider({\n getGrid,\n children,\n}: DataGridToolbarProviderProps) {\n const [bound, setBound] = useState<Bound>({ handle: null, seam: null });\n useEffect(() => {\n const resolve = () => {\n const handle = getGrid() ?? null;\n const seam = getDataGridToolbarSeam(handle);\n setBound((prev) =>\n prev.handle === handle && prev.seam === seam ? prev : { handle, seam },\n );\n };\n resolve();\n return dataGridMountSignal.subscribe(resolve);\n }, [getGrid]);\n return (\n <TableToolbarProvider seam={bound.seam ?? UNBOUND_SEAM}>\n {children}\n </TableToolbarProvider>\n );\n}\n\n/**\n * Builds the toolbar and its parts. One call, at module level, marked pure:\n * a bundler drops it (and every shared part, DropdownMenu, Tag and Kbd with\n * it) from an app that imports `DataGrid` without `DataGridToolbar`.\n */\nfunction createDataGridToolbar() {\n const parts = createTableToolbarParts({\n prefix: 'DataGrid.Toolbar',\n missingProvider: (caller) =>\n `${caller} must be rendered in a DataGrid's \\`toolbar\\` slot or inside <DataGridToolbarProvider>.`,\n useEngineSeam: useSlotSeam,\n });\n\n /* ---- Root ---- */\n\n const Root = forwardRef<HTMLDivElement, DataGridToolbarRootProps>(\n (props, ref) => {\n const slotSeam = useSlotSeam();\n const root = (\n <parts.Root ref={ref} data-component=\"data-grid-toolbar\" {...props} />\n );\n // In the grid's slot, the grid's own seam is the nearest one, even\n // under a lifted provider for another grid.\n return slotSeam ? (\n <TableToolbarProvider seam={slotSeam}>{root}</TableToolbarProvider>\n ) : (\n root\n );\n },\n );\n Root.displayName = 'DataGrid.Toolbar';\n\n /* ---- Parts with DataGrid-shaped props ---- */\n\n const QuickSearch = (props: DataGridToolbarQuickSearchProps) => (\n <parts.QuickSearch {...props} />\n );\n QuickSearch.displayName = 'DataGrid.Toolbar.QuickSearch';\n\n const FilterChips = (_props: DataGridToolbarFilterChipsProps) => (\n <parts.FilterChips />\n );\n FilterChips.displayName = 'DataGrid.Toolbar.FilterChips';\n\n /**\n * Pills for one `select` column (or, in server mode, a host key). Any other\n * field renders nothing and warns in development: v9 would evaluate a set\n * model with the column's own (wrong) filter fn.\n */\n const FacetFilter = ({\n field,\n options,\n label,\n }: DataGridToolbarFacetFilterProps) => {\n const seam = parts.useSeam('FacetFilter');\n const column = seam.getColumns().find((c) => c.id === field);\n // A DataGrid seam exports every row exactly in client mode, so a host key\n // (no column) is allowed when it does not.\n const allowed = !seam.isReady()\n ? true\n : column\n ? column.filterKind === 'select' && !column.masked\n : !seam.features.exportsAllRows;\n useEffect(() => {\n if (!allowed && isDevelopment()) {\n console.warn(\n `DataGridToolbar.FacetFilter: \"${field}\" is not a column with filter { kind: 'select' }` +\n ' (or a host key in server mode); the pills are not rendered.',\n );\n }\n }, [allowed, field]);\n if (!allowed) return null;\n return <parts.FacetFilter field={field} options={options} label={label} />;\n };\n FacetFilter.displayName = 'DataGrid.Toolbar.FacetFilter';\n\n const ColumnToggle = forwardRef<\n HTMLButtonElement,\n DataGridToolbarColumnToggleProps\n >((props, ref) => <parts.ColumnToggle ref={ref} {...props} />);\n ColumnToggle.displayName = 'DataGrid.Toolbar.ColumnToggle';\n\n const Print = forwardRef<HTMLButtonElement, DataGridToolbarPrintProps>(\n (props, ref) => <parts.Print ref={ref} {...props} />,\n );\n Print.displayName = 'DataGrid.Toolbar.Print';\n\n const Refresh = forwardRef<HTMLButtonElement, DataGridToolbarRefreshProps>(\n (props, ref) => <parts.Refresh ref={ref} {...props} />,\n );\n Refresh.displayName = 'DataGrid.Toolbar.Refresh';\n\n const BulkAction = forwardRef<\n HTMLButtonElement,\n DataGridToolbarBulkActionProps\n >((props, ref) => <parts.BulkAction ref={ref} {...props} />);\n BulkAction.displayName = 'DataGrid.Toolbar.BulkAction';\n\n const DEFAULT_EXPORT_ITEMS: Exclude<DataGridExportFormat, 'custom'>[] = [\n 'csv',\n 'xlsx',\n 'pdf',\n ];\n\n /**\n * One export item. Built-ins write every filtered row (client mode); in\n * server mode the grid holds one page, so they render disabled with the\n * reason. `custom` always runs and gets the action context.\n */\n const ExportMenuItem = (props: DataGridToolbarExportMenuItemProps) => {\n const { t } = useTranslation('ui');\n const seam = parts.useSeam('ExportMenu.Item');\n const builtIn = props.format !== 'custom';\n const disabled = builtIn && !seam.features.exportsAllRows;\n const handleSelect = useCallback(() => {\n if (props.format === 'custom') {\n props.onExport(actionContextOf(seam));\n return;\n }\n const snapshot = seam.getExportSnapshot();\n if (!snapshot) return;\n const fileName =\n props.fileName ??\n exportFileName(dataGridSeamCaption(seam), props.format);\n if (props.format === 'csv') {\n seam.exportCsv(fileName);\n return;\n }\n const table = snapshotToTable(snapshot);\n if (props.format === 'xlsx') void writeTableXlsx(table, { fileName });\n else void writeTablePdf(table, { fileName });\n }, [props, seam]);\n return (\n <parts.ExportMenuItemBase\n format={props.format}\n label={props.label}\n onSelect={handleSelect}\n disabled={disabled}\n description={\n disabled ? t('dataGrid.toolbar.exportPageOnly') : undefined\n }\n />\n );\n };\n ExportMenuItem.displayName = 'DataGrid.Toolbar.ExportMenu.Item';\n\n const ExportMenu = forwardRef<\n HTMLButtonElement,\n DataGridToolbarExportMenuProps\n >(({ children, ...rest }, ref) => (\n <parts.ExportMenu ref={ref} {...rest}>\n {children ??\n DEFAULT_EXPORT_ITEMS.map((f) => <ExportMenuItem key={f} format={f} />)}\n </parts.ExportMenu>\n ));\n ExportMenu.displayName = 'DataGrid.Toolbar.ExportMenu';\n\n // These leaves render a single DS <IconButton> trigger, so IconButtonGroup\n // accepts them as direct children (see its rendersIconButton DEV check).\n for (const leaf of [ColumnToggle, Print, Refresh, ExportMenu]) {\n (leaf as { rendersIconButton?: boolean }).rendersIconButton = true;\n }\n // Folded into a group's \"More\" menu, Print and Refresh render the shared\n // part's menu item (their action is not an onClick prop).\n Object.assign(Print, { overflowMenuItem: parts.Print.overflowMenuItem });\n Object.assign(Refresh, { overflowMenuItem: parts.Refresh.overflowMenuItem });\n\n const FilterBar = parts.FilterBar;\n const Actions = parts.Actions;\n\n return Object.assign(Root, {\n FilterBar,\n Actions,\n QuickSearch,\n FilterChips,\n FacetFilter,\n ColumnToggle,\n ExportMenu: Object.assign(ExportMenu, { Item: ExportMenuItem }),\n Print,\n Refresh,\n BulkAction,\n });\n}\n\n/**\n * The DataGrid toolbar. Put it in the grid's `toolbar` prop, or lift it into\n * a page header under `DataGridToolbarProvider`.\n */\nexport const DataGridToolbar = /* @__PURE__ */ createDataGridToolbar();\n"],"names":["useSlotSeam","_a","useDataGridContext","UNBOUND_SEAM","DataGridToolbarProvider","getGrid","children","bound","setBound","useState","useEffect","resolve","handle","seam","getDataGridToolbarSeam","prev","dataGridMountSignal","TableToolbarProvider","createDataGridToolbar","parts","createTableToolbarParts","caller","Root","forwardRef","props","ref","slotSeam","root","jsx","QuickSearch","FilterChips","_props","FacetFilter","field","options","label","column","c","allowed","isDevelopment","ColumnToggle","Print","Refresh","BulkAction","DEFAULT_EXPORT_ITEMS","ExportMenuItem","t","useTranslation","disabled","handleSelect","useCallback","actionContextOf","snapshot","fileName","exportFileName","dataGridSeamCaption","table","snapshotToTable","writeTableXlsx","writeTablePdf","ExportMenu","rest","f","leaf","FilterBar","Actions","DataGridToolbar"],"mappings":"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"}
1
+ {"version":3,"file":"toolbar-CfdoJzMV.js","sources":["../../src/components/data-grid/toolbar.tsx"],"sourcesContent":["/* -------------------------------------------------------------------- */\n/* DataGridToolbar: the shared table toolbar parts over DataGrid. */\n/* */\n/* The parts live in `_shared/table-toolbar/` and reach the grid only */\n/* through its `TableToolbarSeam` (`./toolbar-seam.ts`). Inside the */\n/* grid's `toolbar` slot they find it through `DataGridContext`; a */\n/* toolbar lifted into a page header uses `DataGridToolbarProvider`. */\n/* Callbacks get a `ToolbarActionContext` (ids and an export snapshot), */\n/* never an engine API. No AG Grid, no DataTable import. */\n/* -------------------------------------------------------------------- */\n\nimport { forwardRef, useCallback, useEffect, useState } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { TableToolbarProvider } from '../_shared/table-toolbar/context';\nimport {\n exportFileName,\n snapshotToTable,\n writeTablePdf,\n writeTableXlsx,\n} from '../_shared/table-toolbar/export-files';\nimport {\n actionContextOf,\n createTableToolbarParts,\n} from '../_shared/table-toolbar/parts';\nimport type { TableToolbarSeam } from '../_shared/table-toolbar/seam';\nimport { isDevelopment } from '../_shared/is-development';\nimport {\n dataGridMountSignal,\n getDataGridToolbarSeam,\n useDataGridContext,\n} from './grid-context';\nimport { dataGridSeamCaption } from './toolbar-seam';\nimport type {\n DataGridExportFormat,\n DataGridHandle,\n DataGridToolbarBulkActionProps,\n DataGridToolbarColumnToggleProps,\n DataGridToolbarExportMenuItemProps,\n DataGridToolbarExportMenuProps,\n DataGridToolbarFacetFilterProps,\n DataGridToolbarFilterChipsProps,\n DataGridToolbarPrintProps,\n DataGridToolbarProviderProps,\n DataGridToolbarQuickSearchProps,\n DataGridToolbarRefreshProps,\n DataGridToolbarRootProps,\n} from './types';\n\n/** The grid's own seam when the part sits in its `toolbar` slot. */\nfunction useSlotSeam(): TableToolbarSeam | null {\n return useDataGridContext()?.toolbarSeam ?? null;\n}\n\n/* ------------------------------------------------------------------ */\n/* Lifted toolbar: DataGridToolbarProvider */\n/* ------------------------------------------------------------------ */\n\n/** A seam with nothing behind it, for a lifted toolbar whose grid has not\n * mounted yet: reads are empty, writes do nothing, `isReady()` is false. */\nconst UNBOUND_SEAM: TableToolbarSeam = {\n features: {\n syncsFilterInputs: true,\n exportsAllRows: false,\n keyboardReorder: true,\n },\n isReady: () => false,\n subscribe: () => () => {},\n getColumns: () => [],\n setColumnVisible: () => {},\n moveColumn: () => {},\n getQuickFilter: () => '',\n setQuickFilter: () => {},\n getFilterModel: () => ({}),\n setColumnFilter: () => {},\n clearAllFilters: () => {},\n setFacet: () => {},\n getFacet: () => null,\n getSelectionCount: () => 0,\n getSelectedRowIds: () => [],\n getExportSnapshot: () => undefined,\n exportCsv: () => {},\n print: () => {},\n};\n\ninterface Bound {\n handle: DataGridHandle | null;\n seam: TableToolbarSeam | null;\n}\n\n/**\n * For a toolbar outside the grid (a page header). Binds to whatever\n * `getGrid()` returns, once after mount and again whenever any DataGrid\n * mounts or unmounts (`dataGridMountSignal`): no polling. Until a grid is\n * bound the parts are inert.\n */\nexport function DataGridToolbarProvider({\n getGrid,\n children,\n}: DataGridToolbarProviderProps) {\n const [bound, setBound] = useState<Bound>({ handle: null, seam: null });\n useEffect(() => {\n const resolve = () => {\n const handle = getGrid() ?? null;\n const seam = getDataGridToolbarSeam(handle);\n setBound((prev) =>\n prev.handle === handle && prev.seam === seam ? prev : { handle, seam },\n );\n };\n resolve();\n return dataGridMountSignal.subscribe(resolve);\n }, [getGrid]);\n return (\n <TableToolbarProvider seam={bound.seam ?? UNBOUND_SEAM}>\n {children}\n </TableToolbarProvider>\n );\n}\n\n/**\n * Builds the toolbar and its parts. One call, at module level, marked pure:\n * a bundler drops it (and every shared part, DropdownMenu, Tag and Kbd with\n * it) from an app that imports `DataGrid` without `DataGridToolbar`.\n */\nfunction createDataGridToolbar() {\n const parts = createTableToolbarParts({\n prefix: 'DataGrid.Toolbar',\n missingProvider: (caller) =>\n `${caller} must be rendered in a DataGrid's \\`toolbar\\` slot or inside <DataGridToolbarProvider>.`,\n useEngineSeam: useSlotSeam,\n });\n\n /* ---- Root ---- */\n\n const Root = forwardRef<HTMLDivElement, DataGridToolbarRootProps>(\n (props, ref) => {\n const slotSeam = useSlotSeam();\n const root = (\n <parts.Root ref={ref} data-component=\"data-grid-toolbar\" {...props} />\n );\n // In the grid's slot, the grid's own seam is the nearest one, even\n // under a lifted provider for another grid.\n return slotSeam ? (\n <TableToolbarProvider seam={slotSeam}>{root}</TableToolbarProvider>\n ) : (\n root\n );\n },\n );\n Root.displayName = 'DataGrid.Toolbar';\n\n /* ---- Parts with DataGrid-shaped props ---- */\n\n const QuickSearch = (props: DataGridToolbarQuickSearchProps) => (\n <parts.QuickSearch {...props} />\n );\n QuickSearch.displayName = 'DataGrid.Toolbar.QuickSearch';\n\n const FilterChips = (_props: DataGridToolbarFilterChipsProps) => (\n <parts.FilterChips />\n );\n FilterChips.displayName = 'DataGrid.Toolbar.FilterChips';\n\n /**\n * Pills for one `select` column (or, in server mode, a host key). Any other\n * field renders nothing and warns in development: v9 would evaluate a set\n * model with the column's own (wrong) filter fn.\n */\n const FacetFilter = ({\n field,\n options,\n label,\n }: DataGridToolbarFacetFilterProps) => {\n const seam = parts.useSeam('FacetFilter');\n const column = seam.getColumns().find((c) => c.id === field);\n // A DataGrid seam exports every row exactly in client mode, so a host key\n // (no column) is allowed when it does not.\n const allowed = !seam.isReady()\n ? true\n : column\n ? column.filterKind === 'select' && !column.masked\n : !seam.features.exportsAllRows;\n useEffect(() => {\n if (!allowed && isDevelopment()) {\n console.warn(\n `DataGridToolbar.FacetFilter: \"${field}\" is not a column with filter { kind: 'select' }` +\n ' (or a host key in server mode); the pills are not rendered.',\n );\n }\n }, [allowed, field]);\n if (!allowed) return null;\n return <parts.FacetFilter field={field} options={options} label={label} />;\n };\n FacetFilter.displayName = 'DataGrid.Toolbar.FacetFilter';\n\n const ColumnToggle = forwardRef<\n HTMLButtonElement,\n DataGridToolbarColumnToggleProps\n >((props, ref) => <parts.ColumnToggle ref={ref} {...props} />);\n ColumnToggle.displayName = 'DataGrid.Toolbar.ColumnToggle';\n\n const Print = forwardRef<HTMLButtonElement, DataGridToolbarPrintProps>(\n (props, ref) => <parts.Print ref={ref} {...props} />,\n );\n Print.displayName = 'DataGrid.Toolbar.Print';\n\n const Refresh = forwardRef<HTMLButtonElement, DataGridToolbarRefreshProps>(\n (props, ref) => <parts.Refresh ref={ref} {...props} />,\n );\n Refresh.displayName = 'DataGrid.Toolbar.Refresh';\n\n const BulkAction = forwardRef<\n HTMLButtonElement,\n DataGridToolbarBulkActionProps\n >((props, ref) => <parts.BulkAction ref={ref} {...props} />);\n BulkAction.displayName = 'DataGrid.Toolbar.BulkAction';\n\n const DEFAULT_EXPORT_ITEMS: Exclude<DataGridExportFormat, 'custom'>[] = [\n 'csv',\n 'xlsx',\n 'pdf',\n ];\n\n /**\n * One export item. Built-ins write every filtered row (client mode); in\n * server mode the grid holds one page, so they render disabled with the\n * reason. `custom` always runs and gets the action context.\n */\n const ExportMenuItem = (props: DataGridToolbarExportMenuItemProps) => {\n const { t } = useTranslation('ui');\n const seam = parts.useSeam('ExportMenu.Item');\n const builtIn = props.format !== 'custom';\n const disabled = builtIn && !seam.features.exportsAllRows;\n const handleSelect = useCallback(() => {\n if (props.format === 'custom') {\n props.onExport(actionContextOf(seam));\n return;\n }\n const snapshot = seam.getExportSnapshot();\n if (!snapshot) return;\n const fileName =\n props.fileName ??\n exportFileName(dataGridSeamCaption(seam), props.format);\n if (props.format === 'csv') {\n seam.exportCsv(fileName);\n return;\n }\n const table = snapshotToTable(snapshot);\n if (props.format === 'xlsx') void writeTableXlsx(table, { fileName });\n else void writeTablePdf(table, { fileName });\n }, [props, seam]);\n return (\n <parts.ExportMenuItemBase\n format={props.format}\n label={props.label}\n onSelect={handleSelect}\n disabled={disabled}\n description={\n disabled ? t('dataGrid.toolbar.exportPageOnly') : undefined\n }\n />\n );\n };\n ExportMenuItem.displayName = 'DataGrid.Toolbar.ExportMenu.Item';\n\n const ExportMenu = forwardRef<\n HTMLButtonElement,\n DataGridToolbarExportMenuProps\n >(({ children, ...rest }, ref) => (\n <parts.ExportMenu ref={ref} {...rest}>\n {children ??\n DEFAULT_EXPORT_ITEMS.map((f) => <ExportMenuItem key={f} format={f} />)}\n </parts.ExportMenu>\n ));\n ExportMenu.displayName = 'DataGrid.Toolbar.ExportMenu';\n\n // These leaves render a single DS <IconButton> trigger, so IconButtonGroup\n // accepts them as direct children (see its rendersIconButton DEV check).\n for (const leaf of [ColumnToggle, Print, Refresh, ExportMenu]) {\n (leaf as { rendersIconButton?: boolean }).rendersIconButton = true;\n }\n // Folded into a group's \"More\" menu, Print and Refresh render the shared\n // part's menu item (their action is not an onClick prop).\n Object.assign(Print, { overflowMenuItem: parts.Print.overflowMenuItem });\n Object.assign(Refresh, { overflowMenuItem: parts.Refresh.overflowMenuItem });\n\n const FilterBar = parts.FilterBar;\n const Actions = parts.Actions;\n\n return Object.assign(Root, {\n FilterBar,\n Actions,\n QuickSearch,\n FilterChips,\n FacetFilter,\n ColumnToggle,\n ExportMenu: Object.assign(ExportMenu, { Item: ExportMenuItem }),\n Print,\n Refresh,\n BulkAction,\n });\n}\n\n/**\n * The DataGrid toolbar. Put it in the grid's `toolbar` prop, or lift it into\n * a page header under `DataGridToolbarProvider`.\n */\nexport const DataGridToolbar = /* @__PURE__ */ createDataGridToolbar();\n"],"names":["useSlotSeam","_a","useDataGridContext","UNBOUND_SEAM","DataGridToolbarProvider","getGrid","children","bound","setBound","useState","useEffect","resolve","handle","seam","getDataGridToolbarSeam","prev","dataGridMountSignal","TableToolbarProvider","createDataGridToolbar","parts","createTableToolbarParts","caller","Root","forwardRef","props","ref","slotSeam","root","jsx","QuickSearch","FilterChips","_props","FacetFilter","field","options","label","column","c","allowed","isDevelopment","ColumnToggle","Print","Refresh","BulkAction","DEFAULT_EXPORT_ITEMS","ExportMenuItem","t","useTranslation","disabled","handleSelect","useCallback","actionContextOf","snapshot","fileName","exportFileName","dataGridSeamCaption","table","snapshotToTable","writeTableXlsx","writeTablePdf","ExportMenu","rest","f","leaf","FilterBar","Actions","DataGridToolbar"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { jsx as t, jsxs as l, Fragment as _ } from "react/jsx-runtime";
2
- import { useId as W, useRef as C, useEffect as j, useMemo as I } from "react";
1
+ import { jsx as r, jsxs as i, Fragment as _ } from "react/jsx-runtime";
2
+ import { useId as W, useRef as C, useEffect as j, useMemo as N } from "react";
3
3
  import { useTranslation as R } from "react-i18next";
4
4
  import { u as U } from "./registry-DvAUVLHh.js";
5
5
  import { A as m } from "./alert-C4WKViaS.js";
@@ -13,23 +13,23 @@ const V = /* @__PURE__ */ new Set([
13
13
  "invoicesLoaded",
14
14
  "filesWithErrors"
15
15
  ]);
16
- function L(a) {
16
+ function w(a) {
17
17
  return typeof a == "number" && Number.isFinite(a) && a >= 0;
18
18
  }
19
19
  function B(a, s) {
20
20
  const o = [];
21
- for (const r of $) {
22
- if (s === "invoice" && O.has(r)) continue;
23
- const d = a[r];
24
- if (!L(d)) continue;
21
+ for (const t of $) {
22
+ if (s === "invoice" && O.has(t)) continue;
23
+ const d = a[t];
24
+ if (!w(d)) continue;
25
25
  const n = Math.trunc(d);
26
- n === 0 && V.has(r) || o.push({ key: r, count: n });
26
+ n === 0 && V.has(t) || o.push({ key: t, count: n });
27
27
  }
28
28
  return o;
29
29
  }
30
30
  function Y(a, s, o) {
31
31
  if (a) return a;
32
- const d = (s.filesWithErrors ?? 0) > 0 || o.length > 0, n = L(s.invoicesLoaded) && s.invoicesLoaded >= 1 || L(s.linesLoaded) && s.linesLoaded >= 1;
32
+ const d = (s.filesWithErrors ?? 0) > 0 || o.length > 0, n = w(s.invoicesLoaded) && s.invoicesLoaded >= 1 || w(s.linesLoaded) && s.linesLoaded >= 1;
33
33
  return d ? n ? "partial" : "error" : n ? "success" : "unchanged";
34
34
  }
35
35
  const z = {
@@ -64,7 +64,7 @@ const z = {
64
64
  description: "Each failed file row emits its id as data-file-id."
65
65
  }
66
66
  }
67
- }, N = {
67
+ }, I = {
68
68
  success: "success",
69
69
  partial: "warning",
70
70
  error: "error",
@@ -72,103 +72,112 @@ const z = {
72
72
  }, G = [], S = {
73
73
  filesWithErrors: "destructive"
74
74
  };
75
- function re({
75
+ function te({
76
76
  counts: a,
77
77
  scope: s = "batch",
78
78
  outcome: o,
79
- failedFiles: r = G,
79
+ failedFiles: t = G,
80
80
  headingLevel: d = 2,
81
81
  focusOnMount: n = !0,
82
- actions: f,
82
+ actions: p,
83
83
  variant: E = "full",
84
84
  id: h,
85
- className: b
85
+ className: x
86
86
  }) {
87
- const { t: c, i18n: T } = R("ui"), g = T.language, w = W(), v = C(null);
87
+ const { t: c, i18n: T } = R("ui"), g = T.language, L = W(), v = C(null);
88
88
  j(() => {
89
89
  var e;
90
90
  n && ((e = v.current) == null || e.focus({ preventScroll: !0 }));
91
91
  }, [n]);
92
- const u = I(() => B(a, s), [a, s]), i = Y(o, a, r), A = I(
92
+ const u = N(() => B(a, s), [a, s]), l = Y(o, a, t), A = N(
93
93
  () => ({
94
94
  getCounts: () => Object.fromEntries(u.map((e) => [e.key, e.count])),
95
- getFailedFileIds: () => r.map((e) => e.id)
95
+ getFailedFileIds: () => t.map((e) => e.id)
96
96
  }),
97
- [u, r]
97
+ [u, t]
98
98
  );
99
99
  U(z, A, h);
100
- const y = c(`warehouseLoadSummary.title.${s}.${i}`, {
101
- defaultValue: K[s][i]
102
- }), F = u.filter((e) => e.count > 0).map((e) => D(c, g, e.key, e.count)), p = P(F, g);
103
- return E === "banner" ? /* @__PURE__ */ t(
100
+ const b = c(`warehouseLoadSummary.title.${s}.${l}`, {
101
+ defaultValue: K[s][l]
102
+ }), F = u.filter((e) => e.count > 0).map((e) => D(c, g, e.key, e.count)), f = P(F, g);
103
+ return E === "banner" ? /* @__PURE__ */ r(
104
104
  "div",
105
105
  {
106
106
  "data-component": "warehouse-load-summary",
107
107
  "data-component-id": h,
108
- "data-outcome": i,
108
+ "data-outcome": l,
109
109
  "data-variant": "banner",
110
- className: b,
111
- children: /* @__PURE__ */ t(
110
+ className: x,
111
+ children: /* @__PURE__ */ r(
112
112
  m,
113
113
  {
114
- variant: N[i],
114
+ variant: I[l],
115
115
  announce: n ? "off" : "polite",
116
- children: /* @__PURE__ */ l("div", { className: "ds:flex ds:flex-wrap ds:items-center ds:gap-x-[var(--spacing-xs)] ds:gap-y-[var(--spacing-xs)]", children: [
117
- /* @__PURE__ */ t(
118
- m.Title,
119
- {
120
- ref: v,
121
- tabIndex: -1,
122
- className: "ds:outline-none",
123
- as: `h${d}`,
124
- children: y
125
- }
126
- ),
127
- p ? /* @__PURE__ */ l(_, { children: [
128
- /* @__PURE__ */ t("span", { "aria-hidden": "true", children: "·" }),
129
- /* @__PURE__ */ t("p", { className: "type-body-sm ds:m-0", children: p })
130
- ] }) : null,
131
- f ? /* @__PURE__ */ t("div", { className: "ds:ms-auto ds:flex ds:flex-wrap ds:justify-end ds:gap-[var(--spacing-sm)]", children: f }) : null
116
+ children: /* @__PURE__ */ i("div", { className: "ds:flex ds:flex-wrap ds:items-center ds:gap-x-[var(--spacing-xs)] ds:gap-y-[var(--spacing-xs)]", children: [
117
+ /* @__PURE__ */ i("div", { className: "ds:min-w-0", children: [
118
+ /* @__PURE__ */ r(
119
+ m.Title,
120
+ {
121
+ ref: v,
122
+ tabIndex: -1,
123
+ className: "ds:inline ds:outline-none",
124
+ as: `h${d}`,
125
+ children: b
126
+ }
127
+ ),
128
+ f ? /* @__PURE__ */ i(_, { children: [
129
+ /* @__PURE__ */ r(
130
+ "span",
131
+ {
132
+ "aria-hidden": "true",
133
+ className: "ds:mx-[var(--spacing-xs)]",
134
+ children: "·"
135
+ }
136
+ ),
137
+ /* @__PURE__ */ r("p", { className: "type-body-sm ds:m-0 ds:inline", children: f })
138
+ ] }) : null
139
+ ] }),
140
+ p ? /* @__PURE__ */ r("div", { className: "ds:ms-auto ds:flex ds:flex-wrap ds:justify-end ds:gap-[var(--spacing-sm)]", children: p }) : null
132
141
  ] })
133
142
  }
134
143
  )
135
144
  }
136
- ) : /* @__PURE__ */ l(
145
+ ) : /* @__PURE__ */ i(
137
146
  "div",
138
147
  {
139
148
  "data-component": "warehouse-load-summary",
140
149
  "data-component-id": h,
141
- "data-outcome": i,
142
- className: ["ds:flex ds:flex-col ds:gap-[var(--spacing-md)]", b].filter(Boolean).join(" "),
150
+ "data-outcome": l,
151
+ className: ["ds:flex ds:flex-col ds:gap-[var(--spacing-md)]", x].filter(Boolean).join(" "),
143
152
  children: [
144
- /* @__PURE__ */ l(
153
+ /* @__PURE__ */ i(
145
154
  m,
146
155
  {
147
- variant: N[i],
156
+ variant: I[l],
148
157
  announce: n ? "off" : "polite",
149
158
  children: [
150
- /* @__PURE__ */ t(
159
+ /* @__PURE__ */ r(
151
160
  m.Title,
152
161
  {
153
162
  ref: v,
154
163
  tabIndex: -1,
155
164
  className: "ds:outline-none",
156
165
  as: `h${d}`,
157
- children: y
166
+ children: b
158
167
  }
159
168
  ),
160
- p ? /* @__PURE__ */ t(m.Description, { children: p }) : null
169
+ f ? /* @__PURE__ */ r(m.Description, { children: f }) : null
161
170
  ]
162
171
  }
163
172
  ),
164
- u.length > 0 ? /* @__PURE__ */ t(
173
+ u.length > 0 ? /* @__PURE__ */ r(
165
174
  H,
166
175
  {
167
176
  "aria-label": c("warehouseLoadSummary.counts", {
168
177
  defaultValue: "Load counts"
169
178
  }),
170
179
  maxColumns: 4,
171
- children: u.map(({ key: e, count: x }) => /* @__PURE__ */ t(
180
+ children: u.map(({ key: e, count: y }) => /* @__PURE__ */ r(
172
181
  k,
173
182
  {
174
183
  variant: "outlined",
@@ -176,43 +185,43 @@ function re({
176
185
  label: c(`warehouseLoadSummary.stat.${e}`, {
177
186
  defaultValue: M[e]
178
187
  }),
179
- value: x,
188
+ value: y,
180
189
  locale: g,
181
- intent: x > 0 && e in S ? S[e] : "foreground"
190
+ intent: y > 0 && e in S ? S[e] : "foreground"
182
191
  },
183
192
  e
184
193
  ))
185
194
  }
186
195
  ) : null,
187
- r.length > 0 ? /* @__PURE__ */ l(
196
+ t.length > 0 ? /* @__PURE__ */ i(
188
197
  "div",
189
198
  {
190
199
  role: "group",
191
- "aria-labelledby": w,
200
+ "aria-labelledby": L,
192
201
  className: "ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]",
193
202
  children: [
194
- /* @__PURE__ */ t(
203
+ /* @__PURE__ */ r(
195
204
  Z,
196
205
  {
197
206
  as: `h${Math.min(d + 1, 6)}`,
198
- id: w,
207
+ id: L,
199
208
  children: c("warehouseLoadSummary.failedFiles", {
200
209
  defaultValue: "Files that could not be loaded"
201
210
  })
202
211
  }
203
212
  ),
204
- /* @__PURE__ */ t(
213
+ /* @__PURE__ */ r(
205
214
  "ul",
206
215
  {
207
216
  role: "list",
208
217
  className: "ds:m-0 ds:flex ds:list-none ds:flex-col ds:gap-[var(--spacing-xs)] ds:p-0",
209
- children: r.map((e) => /* @__PURE__ */ l(
218
+ children: t.map((e) => /* @__PURE__ */ i(
210
219
  "li",
211
220
  {
212
221
  "data-file-id": e.id,
213
222
  className: "ds:flex ds:flex-col ds:break-words ds:border-s-[length:var(--border-width-md)] ds:border-s-[color:var(--destructive)] ds:ps-[var(--spacing-sm)]",
214
223
  children: [
215
- /* @__PURE__ */ t(
224
+ /* @__PURE__ */ r(
216
225
  "span",
217
226
  {
218
227
  dir: "auto",
@@ -220,7 +229,7 @@ function re({
220
229
  children: e.fileName
221
230
  }
222
231
  ),
223
- /* @__PURE__ */ t(
232
+ /* @__PURE__ */ r(
224
233
  "span",
225
234
  {
226
235
  dir: "auto",
@@ -237,7 +246,7 @@ function re({
237
246
  ]
238
247
  }
239
248
  ) : null,
240
- f ? /* @__PURE__ */ t("div", { className: "ds:flex ds:flex-wrap ds:justify-end ds:gap-[var(--spacing-sm)]", children: f }) : null
249
+ p ? /* @__PURE__ */ r("div", { className: "ds:flex ds:flex-wrap ds:justify-end ds:gap-[var(--spacing-sm)]", children: p }) : null
241
250
  ]
242
251
  }
243
252
  );
@@ -280,10 +289,10 @@ function Z({
280
289
  id: s,
281
290
  children: o
282
291
  }) {
283
- return /* @__PURE__ */ t(a, { id: s, className: "type-label ds:m-0 ds:text-[var(--foreground)]", children: o });
292
+ return /* @__PURE__ */ r(a, { id: s, className: "type-label ds:m-0 ds:text-[var(--foreground)]", children: o });
284
293
  }
285
294
  export {
286
- re as W,
295
+ te as W,
287
296
  z as w
288
297
  };
289
- //# sourceMappingURL=warehouse-load-summary-DkAKXcw0.js.map
298
+ //# sourceMappingURL=warehouse-load-summary-CMMYzTDv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"warehouse-load-summary-CMMYzTDv.js","sources":["../../src/components/warehouse-load-summary/model.ts","../../src/components/warehouse-load-summary/warehouse-load-summary.agent.ts","../../src/components/warehouse-load-summary/warehouse-load-summary.tsx"],"sourcesContent":["import { WAREHOUSE_COUNT_KEYS } from '../_shared/warehouse-load';\nimport type {\n WarehouseCountKey,\n WarehouseLoadCounts,\n WarehouseLoadFailedFile,\n WarehouseLoadOutcome,\n WarehouseLoadScope,\n} from './types';\n\n/** Counts that hide at zero (nothing to report). */\nconst HIDE_AT_ZERO: ReadonlySet<WarehouseCountKey> = new Set([\n 'itemsUpdated',\n 'filesWithErrors',\n]);\n/** Counts a single-invoice summary leaves out. */\nconst BATCH_ONLY: ReadonlySet<WarehouseCountKey> = new Set([\n 'invoicesLoaded',\n 'filesWithErrors',\n]);\n\nfunction usable(value: number | undefined): value is number {\n return typeof value === 'number' && Number.isFinite(value) && value >= 0;\n}\n\n/** The counts to show, in vocabulary order. */\nexport function visibleCounts(\n counts: WarehouseLoadCounts,\n scope: WarehouseLoadScope,\n): Array<{ key: WarehouseCountKey; count: number }> {\n const out: Array<{ key: WarehouseCountKey; count: number }> = [];\n for (const key of WAREHOUSE_COUNT_KEYS) {\n if (scope === 'invoice' && BATCH_ONLY.has(key)) continue;\n const value = counts[key];\n if (!usable(value)) continue;\n const count = Math.trunc(value);\n if (count === 0 && HIDE_AT_ZERO.has(key)) continue;\n out.push({ key, count });\n }\n return out;\n}\n\nexport function resolveOutcome(\n outcome: WarehouseLoadOutcome | undefined,\n counts: WarehouseLoadCounts,\n failedFiles: ReadonlyArray<WarehouseLoadFailedFile>,\n): WarehouseLoadOutcome {\n if (outcome) return outcome;\n const errors = counts.filesWithErrors ?? 0;\n const failed = errors > 0 || failedFiles.length > 0;\n const loaded =\n (usable(counts.invoicesLoaded) && counts.invoicesLoaded >= 1) ||\n (usable(counts.linesLoaded) && counts.linesLoaded >= 1);\n if (failed) return loaded ? 'partial' : 'error';\n return loaded ? 'success' : 'unchanged';\n}\n","/* -------------------------------------------------------------------- */\n/* Agent adapter: WarehouseLoadSummary. */\n/* Read-only display. State is counts and ids; no actions, because the */\n/* host's `actions` slot owns every button. */\n/* -------------------------------------------------------------------- */\n\nimport type { AgentAdapter } from '../../agent/types';\nimport type { WarehouseLoadSummaryHandle } from './types';\n\nexport const warehouseLoadSummaryAgent: AgentAdapter<WarehouseLoadSummaryHandle> =\n {\n id: 'warehouse-load-summary',\n capabilities: [],\n state: {\n counts: {\n type: 'Record<string, number>',\n description:\n 'The counts shown, by key (invoicesLoaded, itemsCreated, itemsUpdated, linesLoaded, linesAlreadyLoaded, linesSkipped, filesWithErrors). Hidden counts are absent.',\n read: (handle) => handle.getCounts(),\n },\n failedFileIds: {\n type: 'string[]',\n description:\n 'Ids of the failed files listed. File names and error texts are not read.',\n read: (handle) => handle.getFailedFileIds(),\n },\n },\n actions: {},\n domHooks: {\n root: {\n attr: 'data-component',\n value: 'warehouse-load-summary',\n description: 'Marks the summary root.',\n },\n instanceId: {\n attr: 'data-component-id',\n sourceProp: 'id',\n description: 'Sourced from the id prop.',\n },\n item: {\n attr: 'data-file-id',\n description: 'Each failed file row emits its id as data-file-id.',\n },\n },\n };\n","import { useEffect, useId, useMemo, useRef, type ReactNode } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { useAgentRegistration } from '../../agent';\nimport { Alert } from '../alert';\nimport { Stat } from '../stat';\nimport { StatGroup } from '../stat-group';\nimport { warehouseCountLabel } from '../_shared/warehouse-load';\nimport { visibleCounts, resolveOutcome } from './model';\nimport { warehouseLoadSummaryAgent } from './warehouse-load-summary.agent';\nimport type {\n WarehouseCountKey,\n WarehouseLoadFailedFile,\n WarehouseLoadOutcome,\n WarehouseLoadSummaryHandle,\n WarehouseLoadSummaryProps,\n} from './types';\n\nconst ALERT_VARIANT = {\n success: 'success',\n partial: 'warning',\n error: 'error',\n unchanged: 'info',\n} as const satisfies Record<WarehouseLoadOutcome, string>;\n\nconst NO_FAILED_FILES: ReadonlyArray<WarehouseLoadFailedFile> = [];\n\nconst STAT_INTENT = {\n filesWithErrors: 'destructive',\n} as const satisfies Partial<Record<WarehouseCountKey, string>>;\n\n/**\n * What a warehouse load produced: a heading by outcome, one tile per count\n * and the files that failed. Displays only; the platform counts.\n */\nexport function WarehouseLoadSummary({\n counts,\n scope = 'batch',\n outcome,\n failedFiles = NO_FAILED_FILES,\n headingLevel = 2,\n focusOnMount = true,\n actions,\n variant = 'full',\n id,\n className,\n}: WarehouseLoadSummaryProps) {\n const { t, i18n } = useTranslation('ui');\n const language = i18n.language;\n const headingId = useId();\n const titleRef = useRef<HTMLHeadingElement>(null);\n\n // The summary replaces the review step, so focus would drop to <body>.\n // Focusing the heading makes screen readers read the result (WCAG 2.4.3,\n // 4.1.3); the Alert then stays silent so it is not read twice.\n useEffect(() => {\n if (focusOnMount) titleRef.current?.focus({ preventScroll: true });\n }, [focusOnMount]);\n\n const shown = useMemo(() => visibleCounts(counts, scope), [counts, scope]);\n const resolved = resolveOutcome(outcome, counts, failedFiles);\n\n const handle = useMemo<WarehouseLoadSummaryHandle>(\n () => ({\n getCounts: () => Object.fromEntries(shown.map((c) => [c.key, c.count])),\n getFailedFileIds: () => failedFiles.map((f) => f.id),\n }),\n [shown, failedFiles],\n );\n useAgentRegistration(warehouseLoadSummaryAgent, handle, id);\n\n const title = t(`warehouseLoadSummary.title.${scope}.${resolved}`, {\n defaultValue: DEFAULT_TITLES[scope][resolved],\n });\n const sentence = shown\n .filter((c) => c.count > 0)\n .map((c) => warehouseCountLabel(t, language, c.key, c.count));\n const description = formatList(sentence, language);\n\n if (variant === 'banner') {\n // One line above a table: heading, a neutral dot, the sentence, then the\n // host actions. No cards, no failed-files list. The dot is punctuation\n // that reads the same in every language, so no new string is needed.\n return (\n <div\n data-component=\"warehouse-load-summary\"\n data-component-id={id}\n data-outcome={resolved}\n data-variant=\"banner\"\n className={className}\n >\n <Alert\n variant={ALERT_VARIANT[resolved]}\n announce={focusOnMount ? 'off' : 'polite'}\n >\n <div className=\"ds:flex ds:flex-wrap ds:items-center ds:gap-x-[var(--spacing-xs)] ds:gap-y-[var(--spacing-xs)]\">\n {/* One run of text: when it is too long for the line it wraps\n like a sentence, and the dot never ends a line on its own. */}\n <div className=\"ds:min-w-0\">\n <Alert.Title\n ref={titleRef}\n tabIndex={-1}\n className=\"ds:inline ds:outline-none\"\n as={`h${headingLevel}` as const}\n >\n {title}\n </Alert.Title>\n {description ? (\n <>\n <span\n aria-hidden=\"true\"\n className=\"ds:mx-[var(--spacing-xs)]\"\n >\n ·\n </span>\n <p className=\"type-body-sm ds:m-0 ds:inline\">{description}</p>\n </>\n ) : null}\n </div>\n {actions ? (\n <div className=\"ds:ms-auto ds:flex ds:flex-wrap ds:justify-end ds:gap-[var(--spacing-sm)]\">\n {actions}\n </div>\n ) : null}\n </div>\n </Alert>\n </div>\n );\n }\n\n return (\n <div\n data-component=\"warehouse-load-summary\"\n data-component-id={id}\n data-outcome={resolved}\n className={['ds:flex ds:flex-col ds:gap-[var(--spacing-md)]', className]\n .filter(Boolean)\n .join(' ')}\n >\n <Alert\n variant={ALERT_VARIANT[resolved]}\n announce={focusOnMount ? 'off' : 'polite'}\n >\n <Alert.Title\n ref={titleRef}\n tabIndex={-1}\n className=\"ds:outline-none\"\n as={`h${headingLevel}` as const}\n >\n {title}\n </Alert.Title>\n {description ? (\n <Alert.Description>{description}</Alert.Description>\n ) : null}\n </Alert>\n\n {shown.length > 0 ? (\n <StatGroup\n aria-label={t('warehouseLoadSummary.counts', {\n defaultValue: 'Load counts',\n })}\n maxColumns={4}\n >\n {shown.map(({ key, count }) => (\n <Stat\n key={key}\n variant=\"outlined\"\n size=\"sm\"\n label={t(`warehouseLoadSummary.stat.${key}`, {\n defaultValue: DEFAULT_STAT_LABELS[key],\n })}\n value={count}\n locale={language}\n intent={\n count > 0 && key in STAT_INTENT\n ? STAT_INTENT[key as keyof typeof STAT_INTENT]\n : 'foreground'\n }\n />\n ))}\n </StatGroup>\n ) : null}\n\n {failedFiles.length > 0 ? (\n <div\n role=\"group\"\n aria-labelledby={headingId}\n className=\"ds:flex ds:flex-col ds:gap-[var(--spacing-xs)]\"\n >\n <SubHeading\n as={`h${Math.min(headingLevel + 1, 6)}` as 'h3'}\n id={headingId}\n >\n {t('warehouseLoadSummary.failedFiles', {\n defaultValue: 'Files that could not be loaded',\n })}\n </SubHeading>\n {/* eslint-disable-next-line jsx-a11y/no-redundant-roles -- Safari drops list semantics under list-none */}\n <ul\n role=\"list\"\n className=\"ds:m-0 ds:flex ds:list-none ds:flex-col ds:gap-[var(--spacing-xs)] ds:p-0\"\n >\n {failedFiles.map((file) => (\n <li\n key={file.id}\n data-file-id={file.id}\n className=\"ds:flex ds:flex-col ds:break-words ds:border-s-[length:var(--border-width-md)] ds:border-s-[color:var(--destructive)] ds:ps-[var(--spacing-sm)]\"\n >\n <span\n dir=\"auto\"\n className=\"type-label ds:text-[var(--foreground)]\"\n >\n {file.fileName}\n </span>\n <span\n dir=\"auto\"\n className=\"type-meta ds:text-[var(--muted-foreground)]\"\n >\n {file.error}\n </span>\n </li>\n ))}\n </ul>\n </div>\n ) : null}\n\n {actions ? (\n <div className=\"ds:flex ds:flex-wrap ds:justify-end ds:gap-[var(--spacing-sm)]\">\n {actions}\n </div>\n ) : null}\n </div>\n );\n}\n\nconst DEFAULT_TITLES = {\n invoice: {\n success: 'Invoice loaded',\n partial: 'Invoice loaded with warnings',\n error: 'The invoice could not be loaded',\n unchanged: 'Nothing new to load',\n },\n batch: {\n success: 'Invoices loaded',\n partial: 'Invoices loaded, some files failed',\n error: 'No invoices were loaded',\n unchanged: 'Nothing new to load',\n },\n} as const;\n\nconst DEFAULT_STAT_LABELS = {\n invoicesLoaded: 'Invoices loaded',\n itemsCreated: 'Items created',\n itemsUpdated: 'Items updated',\n linesLoaded: 'Lines loaded',\n linesAlreadyLoaded: 'Lines already loaded',\n linesSkipped: 'Lines skipped',\n filesWithErrors: 'Files with errors',\n} as const satisfies Record<WarehouseCountKey, string>;\n\nfunction formatList(parts: string[], language: string | undefined): string {\n if (parts.length === 0) return '';\n try {\n return new Intl.ListFormat(language, {\n style: 'long',\n type: 'conjunction',\n }).format(parts);\n } catch {\n return parts.join(', ');\n }\n}\n\nfunction SubHeading({\n as: Tag,\n id,\n children,\n}: {\n as: 'h3' | 'h4' | 'h5' | 'h6';\n id: string;\n children: ReactNode;\n}) {\n return (\n <Tag id={id} className=\"type-label ds:m-0 ds:text-[var(--foreground)]\">\n {children}\n </Tag>\n );\n}\n"],"names":["HIDE_AT_ZERO","BATCH_ONLY","usable","value","visibleCounts","counts","scope","out","key","WAREHOUSE_COUNT_KEYS","count","resolveOutcome","outcome","failedFiles","failed","loaded","warehouseLoadSummaryAgent","handle","ALERT_VARIANT","NO_FAILED_FILES","STAT_INTENT","WarehouseLoadSummary","headingLevel","focusOnMount","actions","variant","id","className","t","i18n","useTranslation","language","headingId","useId","titleRef","useRef","useEffect","_a","shown","useMemo","resolved","c","f","useAgentRegistration","title","DEFAULT_TITLES","sentence","warehouseCountLabel","description","formatList","jsx","Alert","jsxs","Fragment","StatGroup","Stat","DEFAULT_STAT_LABELS","SubHeading","file","parts","Tag","children"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "packageVersion": "1.130.2",
3
+ "packageVersion": "1.131.0",
4
4
  "components": [
5
5
  {
6
6
  "kind": "component",
@@ -1179,20 +1179,20 @@
1179
1179
  "state": [
1180
1180
  {
1181
1181
  "name": "lines",
1182
- "type": "Array<{ id, lineNumber, matchState, selected, selectable, readOnly, quantityLocked, itemKind, itemId, quantity, removesStock, warningCodes, invalid }>",
1183
- "description": "Every invoice line in invoice order, with what Confirm will do with it. matchState is one of matched, newItem, itemToUpdate (a matched line whose price, VAT or discount will change; counted inside matchedCount), skip or alreadyLoaded. Quantities are exact decimal text as shown, unsigned; there are no descriptions or names.",
1182
+ "type": "Array<{ id, invoiceId, sourceLineId, lineNumber, matchState, selected, selectable, readOnly, quantityLocked, itemKind, itemId, quantity, removesStock, warningCodes, invalid }>",
1183
+ "description": "Every invoice line in invoice order, with what Confirm will do with it. matchState is one of matched, newItem, itemToUpdate (a matched line whose price, VAT or discount will change; counted inside matchedCount), skip or alreadyLoaded. Quantities are exact decimal text as shown, unsigned; there are no descriptions or names. With several invoices (the invoices prop) id is the row key built from invoiceId and the line id, invoiceId names the invoice and sourceLineId is the host's own line id; every lineId argument below is a row key.",
1184
1184
  "descriptionKey": "ui.agent.billLineTable.state.lines"
1185
1185
  },
1186
1186
  {
1187
1187
  "name": "selection",
1188
1188
  "type": "string[]",
1189
- "description": "Ids of the ticked lines: the lines Confirm will load.",
1189
+ "description": "Ids (row keys with several invoices) of the ticked lines: the lines Confirm will load.",
1190
1190
  "descriptionKey": "ui.agent.billLineTable.state.selection"
1191
1191
  },
1192
1192
  {
1193
1193
  "name": "summary",
1194
- "type": "{ lineCount, selectedCount, matchedCount, newItemCount, itemUpdateCount, skippedCount, alreadyLoadedCount, warningLineCount, invoiceLoaded, invalidCount, net, vat, gross, canConfirm, dirty }",
1195
- "description": "Counts and totals of the ticked lines. net, vat and gross are exact decimal text with 2 places (\"14.58\"). canConfirm is false while no line is ticked, a ticked line cannot load, or the invoice is already loaded (invoiceLoaded).",
1194
+ "type": "{ lineCount, invoiceCount, selectedInvoiceCount, selectedCount, matchedCount, newItemCount, itemUpdateCount, skippedCount, alreadyLoadedCount, warningLineCount, invoiceLoaded, invalidCount, net, vat, gross, canConfirm, dirty }",
1195
+ "description": "Counts and totals of the ticked lines. net, vat and gross are exact decimal text with 2 places (\"14.58\"). canConfirm is false while no line is ticked, a ticked line cannot load, or every invoice is already loaded (invoiceLoaded). With several invoices the counts cover the invoices still open, and a credit note counts against net, vat and gross.",
1196
1196
  "descriptionKey": "ui.agent.billLineTable.state.summary"
1197
1197
  },
1198
1198
  {
@@ -1297,7 +1297,7 @@
1297
1297
  ],
1298
1298
  "additionalProperties": false
1299
1299
  },
1300
- "returns": "{ id, lineNumber, matchState, selected, selectable, readOnly, quantityLocked, itemKind, itemId, quantity, removesStock, warningCodes, invalid }",
1300
+ "returns": "{ id, invoiceId, sourceLineId, lineNumber, matchState, selected, selectable, readOnly, quantityLocked, itemKind, itemId, quantity, removesStock, warningCodes, invalid }",
1301
1301
  "idempotent": true,
1302
1302
  "errors": [
1303
1303
  "UNKNOWN_LINE",
@@ -1345,7 +1345,7 @@
1345
1345
  ],
1346
1346
  "additionalProperties": false
1347
1347
  },
1348
- "returns": "{ id, lineNumber, matchState, selected, selectable, readOnly, quantityLocked, itemKind, itemId, quantity, removesStock, warningCodes, invalid }",
1348
+ "returns": "{ id, invoiceId, sourceLineId, lineNumber, matchState, selected, selectable, readOnly, quantityLocked, itemKind, itemId, quantity, removesStock, warningCodes, invalid }",
1349
1349
  "idempotent": true,
1350
1350
  "errors": [
1351
1351
  "UNKNOWN_LINE",
@@ -1378,7 +1378,7 @@
1378
1378
  ],
1379
1379
  "additionalProperties": false
1380
1380
  },
1381
- "returns": "{ id, lineNumber, matchState, selected, selectable, readOnly, quantityLocked, itemKind, itemId, quantity, removesStock, warningCodes, invalid }",
1381
+ "returns": "{ id, invoiceId, sourceLineId, lineNumber, matchState, selected, selectable, readOnly, quantityLocked, itemKind, itemId, quantity, removesStock, warningCodes, invalid }",
1382
1382
  "idempotent": true,
1383
1383
  "errors": [
1384
1384
  "UNKNOWN_LINE",
@@ -1436,7 +1436,7 @@
1436
1436
  "item": {
1437
1437
  "attr": "data-row-id",
1438
1438
  "sourceProp": "lines[].id",
1439
- "description": "BillLine.id on each body row (written by DataGrid). The only line datum in the DOM."
1439
+ "description": "BillLine.id on each body row (written by DataGrid), or the row key with several invoices. The only line datum in the DOM."
1440
1440
  }
1441
1441
  }
1442
1442
  },
@@ -128,9 +128,9 @@
128
128
  },
129
129
  "billLineTable": {
130
130
  "state": {
131
- "lines": "Every invoice line in invoice order, with what Confirm will do with it. matchState is one of matched, newItem, itemToUpdate (a matched line whose price, VAT or discount will change; counted inside matchedCount), skip or alreadyLoaded. Quantities are exact decimal text as shown, unsigned; there are no descriptions or names.",
132
- "selection": "Ids of the ticked lines: the lines Confirm will load.",
133
- "summary": "Counts and totals of the ticked lines. net, vat and gross are exact decimal text with 2 places (\"14.58\"). canConfirm is false while no line is ticked, a ticked line cannot load, or the invoice is already loaded (invoiceLoaded).",
131
+ "lines": "Every invoice line in invoice order, with what Confirm will do with it. matchState is one of matched, newItem, itemToUpdate (a matched line whose price, VAT or discount will change; counted inside matchedCount), skip or alreadyLoaded. Quantities are exact decimal text as shown, unsigned; there are no descriptions or names. With several invoices (the invoices prop) id is the row key built from invoiceId and the line id, invoiceId names the invoice and sourceLineId is the host's own line id; every lineId argument below is a row key.",
132
+ "selection": "Ids (row keys with several invoices) of the ticked lines: the lines Confirm will load.",
133
+ "summary": "Counts and totals of the ticked lines. net, vat and gross are exact decimal text with 2 places (\"14.58\"). canConfirm is false while no line is ticked, a ticked line cannot load, or every invoice is already loaded (invoiceLoaded). With several invoices the counts cover the invoices still open, and a credit note counts against net, vat and gross.",
134
134
  "invalidLineIds": "Ticked lines that cannot load as they are: an empty or zero quantity, an item no longer in the warehouse, or an error from the server."
135
135
  },
136
136
  "actions": {
@@ -1,2 +1,2 @@
1
- /* @alfadocs/ui-kit 1.130.2 browser-support.js. Generated by scripts/build-browser-support.mjs: do not edit. */
1
+ /* @alfadocs/ui-kit 1.131.0 browser-support.js. Generated by scripts/build-browser-support.mjs: do not edit. */
2
2
  (function(){var j=[{id:"class-static-block",syntax:"{ class Probe { static { } } }"},{id:"object-has-own",check:function(e){return typeof e.Object.hasOwn=="function"}},{id:"structured-clone",check:function(e){return typeof e.structuredClone=="function"}}],C="alfadocs-browser-support",B="alfadocs:browser-support",R="AlfadocsBrowserSupport",U="AlfadocsBrowserSupportConfig",E="alfadocs.browserSupport.dismissedAt",D="alfadocs-browser-support",P="alfadocs-browser-support-title",A=0,W=1440*60*1e3,f="__alfadocsBrowserSupportProbe";function F(e){var r=e.document.currentScript;return r&&(r.nonce||r.getAttribute("nonce"))||""}function _(e,r,a){var t=e.document,o=t.createElement("script");a&&o.setAttribute("nonce",a),o.text=r;var s=t.head||t.documentElement;s.appendChild(o),s.removeChild(o)}function I(e,r){var a=F(e);if(!a)try{return new e.Function(r),!0}catch(o){if(o&&o.name==="SyntaxError")return!1}var t=e;try{return t[f]=0,_(e,"window."+f+" = 1;",a),t[f]!==1?null:(_(e,r+"\nwindow."+f+" = 2;",a),t[f]===2)}catch(o){return null}finally{delete t[f]}}function T(e,r){for(var a=[],t=!1,o=0;o<r.length;o++){var s=r[o],n=!0;if(s.syntax!==void 0)n=I(e,s.syntax);else if(s.check)try{n=s.check(e)}catch(i){n=!1}n===null?t=!0:n||a.push(s.id)}return a.length?a:t?null:a}function N(e,r){var a=String(e||"").toLowerCase().split(/[-_]/)[0];return a==="cn"&&(a="zh"),r.indexOf(a)>=0?a:r.indexOf("en")>=0?"en":r[0]}function M(e){var r=e.userAgent||"";return/iPad|iPhone|iPod/.test(r)?"ios":/Macintosh/.test(r)?(e.maxTouchPoints||0)>1?"ios":"mac":"other"}var w=[["Edge",/\b(?:Edg|EdgA|EdgiOS)\/(\d+)/],["Opera",/\b(?:OPR|OPT)\/(\d+)/],["Samsung Internet",/\bSamsungBrowser\/(\d+)/],["Firefox",/\b(?:Firefox|FxiOS)\/(\d+)/],["Chrome",/\b(?:Chrome|CriOS)\/(\d+)/],["Safari",/\bVersion\/(\d+(?:\.\d+)?)[\s\S]*\bSafari\//]];function L(e,r){for(var a=e.userAgent||"",t=0;t<w.length;t++){var o=w[t][1].exec(a);if(o){var s=w[t][0];if(r==="ios"&&s!=="Safari"){var n=/OS (\d+(?:_\d+)?) like Mac OS X/.exec(a),i=/iPhone|iPod/.test(a)?"iOS":"iPadOS";return{name:s,label:s+" ("+i+(n?" "+n[1].replace("_","."):"")+")"}}return{name:s,label:s+" "+o[1]}}}return null}function S(e,r,a){return e.replace(new RegExp("\\{\\{"+r+"\\}\\}","g"),function(){return a})}function H(e,r){if(!e||!/^\d{4}-\d{2}-\d{2}$/.test(e))return null;var a=new Date(e+"T00:00:00Z");if(isNaN(a.getTime()))return null;try{var t=r==="en"?"en-GB":r==="pt"?"pt-PT":r;return a.toLocaleDateString(t,{day:"numeric",month:"long",year:"numeric",timeZone:"UTC"})}catch(o){return e}}function G(e,r,a,t){var o=a?S(e.title,"browser",a.label):e.titleUnknown,s=t?S(e.reasonWithDate,"date",t):e.reason,n=r==="ios"?e.steps.ios:r==="mac"&&a&&a.name==="Safari"?e.steps.macSafari:a?S(e.steps.other,"browser",a.name):e.steps.otherUnknown;return{title:o,text:s+" "+n}}function q(e){return e&&(/^https:\/\//i.test(e)||/^\/(?![/\\])/.test(e))?e:null}var z="http://www.w3.org/2000/svg";function y(e,r){for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&e.setAttribute(a,r[a])}function V(e,r){var a=e.createElementNS(z,"svg");y(a,r.attrs);for(var t=0;t<r.children.length;t++){var o=e.createElementNS(z,r.children[t].tag);y(o,r.children[t].attrs),a.appendChild(o)}return a}function p(e,r,a,t){var o=e.createElement(r);return o.className=a,t!==void 0&&o.appendChild(e.createTextNode(t)),o}function Z(e,r){var a=C,t=r.messages,o=G(t,r.device,r.browser,r.supportEnds),s=p(e,"div",a+" "+a+"--"+r.placement);if(s.setAttribute("data-component","browser-support-alert"),s.setAttribute("data-placement",r.placement),s.setAttribute("role",r.placement==="page"?"alert":"status"),s.setAttribute("lang",r.locale),s.setAttribute("dir",r.locale==="ar"?"rtl":"ltr"),r.icon){var n=p(e,"span",a+"__icon");n.setAttribute("aria-hidden","true"),n.appendChild(V(e,r.icon)),s.appendChild(n)}var i=p(e,"div",a+"__body"),l=p(e,"p",a+"__title",o.title);A+=1,l.id=P+"-"+A,r.placement==="page"&&(l.setAttribute("role","heading"),l.setAttribute("aria-level","2")),i.appendChild(l),i.appendChild(p(e,"p",a+"__text",o.text));var b=q(r.helpHref);if(b){var h=p(e,"a",a+"__link",t.help);h.setAttribute("href",b),i.appendChild(h)}s.appendChild(i);var u=r.onDismiss;if(r.placement==="banner"&&u){var d=p(e,"button",a+"__dismiss",t.dismiss);d.setAttribute("type","button"),d.setAttribute("aria-describedby",l.id);var g=u;d.addEventListener("click",function(){s.parentNode&&s.parentNode.removeChild(s),g()}),s.appendChild(d)}return s}function J(e){var r={},a=e.document.currentScript;a&&a.getAttribute&&(r.placement=a.getAttribute("data-placement")||void 0,r.locale=a.getAttribute("data-locale")||void 0,r.helpHref=a.getAttribute("data-help-href")||void 0,r.supportEnds=a.getAttribute("data-support-ends")||void 0);var t=e[U];return t&&(r.placement||(r.placement=t.placement),r.locale||(r.locale=t.locale),r.helpHref||(r.helpHref=t.helpHref),r.supportEnds||(r.supportEnds=t.supportEnds)),r}function K(e,r){try{var a=Number(e.localStorage.getItem(E));return a>0&&r-a<W}catch(t){return!1}}function Y(e,r){try{e.localStorage.setItem(E,String(r))}catch(a){}}function $(e,r){try{var a;if(typeof e.CustomEvent=="function")a=new e.CustomEvent(B,{detail:r});else{var t=e.document.createEvent("CustomEvent");t.initCustomEvent(B,!1,!1,r),a=t}e.dispatchEvent(a)}catch(o){}}function Q(e,r){var a=e.document.body,t=a.style.paddingBottom,o=0;try{o=parseFloat(e.getComputedStyle(a).paddingBottom)||0}catch(n){o=0}function s(){if(r.parentNode){var n=e.innerHeight-r.getBoundingClientRect().top;a.style.paddingBottom=Math.max(0,o+n)+"px"}}return s(),e.addEventListener("resize",s),function(){e.removeEventListener("resize",s),a.style.paddingBottom=t}}function X(e,r){e.document.body?r():e.document.addEventListener("DOMContentLoaded",r)}function O(e,r,a){var t=a&&a.now!==void 0?a.now:new e.Date().getTime(),o=a&&a.requirements||j,s=J(e),n=s.placement==="page"?"page":"banner",i=new RegExp("[?&]"+D+"=preview(&|$)").test(e.location.search||""),l=T(e,o),b=l===null?null:l.length===0,h=M(e.navigator),u=L(e.navigator,h),d={supported:b,missing:l||[],shown:!1,placement:n,preview:i,browser:u?u.label:null};e[R]=d;var g=i||b===!1&&!(n==="banner"&&K(e,t));if(!g)return d;var m=N(s.locale||e.document.documentElement.getAttribute("lang"),r.locales);return X(e,function(){var c=e.document;if(!c.querySelector("."+C)){var x=c.createElement("style");x.appendChild(c.createTextNode(r.css)),(c.head||c.documentElement).appendChild(x);var k=function(){},v=Z(c,{placement:n,locale:m,messages:r.messages[m],device:h,browser:u,supportEnds:H(s.supportEnds,m),helpHref:s.helpHref,icon:r.icon,onDismiss:function(){k(),i||Y(e,new e.Date().getTime())}});n==="page"?c.body.insertBefore(v,c.body.firstChild):(c.body.appendChild(v),k=Q(e,v)),d.shown=!0,$(e,d)}}),d}O(window,{css:".alfadocs-browser-support{--ad-bs-surface:#fff9eb;--ad-bs-border:#fac634;--ad-bs-text:#695316;--ad-bs-ring:#6761e5;--ad-bs-shadow:0 10px 30px #0000000f;--ad-bs-font:'Space Grotesk', 'Noto Sans SC', 'Noto Sans JP', 'Noto Sans Arabic', 'Noto Sans Devanagari', ui-sans-serif, system-ui, sans-serif;--ad-bs-font-size:16px;--ad-bs-line-height:1.6;--ad-bs-weight:600;--ad-bs-radius:8px;--ad-bs-border-width:1px;--ad-bs-space:16px;--ad-bs-space-sm:8px;--ad-bs-space-xs:4px;--ad-bs-icon:20px;--ad-bs-target:44px;--ad-bs-focus-width:2px;--ad-bs-focus-offset:2px;--ad-bs-page-width:640px;--ad-bs-z:80}\n.theme-accessible .alfadocs-browser-support{--ad-bs-surface:#f0eee8;--ad-bs-border:#695316;--ad-bs-ring:#39357e;--ad-bs-font:'Lexend', 'Noto Sans SC', 'Noto Sans JP', 'Noto Sans Arabic', 'Noto Sans Devanagari', ui-sans-serif, system-ui, sans-serif;--ad-bs-font-size:18px;--ad-bs-target:48px;--ad-bs-focus-width:3px;--ad-bs-focus-offset:3px}\n.theme-dark .alfadocs-browser-support{--ad-bs-surface:#3e3d50;--ad-bs-text:#fdedc0;--ad-bs-ring:#e040fb;--ad-bs-shadow:0 10px 30px #0006}\n.theme-dark.theme-accessible .alfadocs-browser-support{--ad-bs-surface:#2e2e3d;--ad-bs-border:#fdedc0;--ad-bs-text:#fdedc0;--ad-bs-ring:#fa76fc;--ad-bs-shadow:0 10px 30px #0006;--ad-bs-font:'Lexend', 'Noto Sans SC', 'Noto Sans JP', 'Noto Sans Arabic', 'Noto Sans Devanagari', ui-sans-serif, system-ui, sans-serif;--ad-bs-font-size:18px;--ad-bs-line-height:1.6;--ad-bs-weight:600;--ad-bs-radius:8px;--ad-bs-border-width:1px;--ad-bs-space:16px;--ad-bs-space-sm:8px;--ad-bs-space-xs:4px;--ad-bs-icon:20px;--ad-bs-target:48px;--ad-bs-focus-width:3px;--ad-bs-focus-offset:3px;--ad-bs-page-width:640px;--ad-bs-z:80}\n.alfadocs-browser-support,.alfadocs-browser-support *{box-sizing:border-box}\n.alfadocs-browser-support{display:flex;flex-wrap:wrap;align-items:flex-start;padding:var(--ad-bs-space);border:var(--ad-bs-border-width) solid var(--ad-bs-border);border-radius:var(--ad-bs-radius);background:var(--ad-bs-surface);color:var(--ad-bs-text);font-family:var(--ad-bs-font);font-size:var(--ad-bs-font-size);line-height:var(--ad-bs-line-height);text-align:start}\n.alfadocs-browser-support--page{width:calc(100% - var(--ad-bs-space) - var(--ad-bs-space));max-width:var(--ad-bs-page-width);margin-block-start:var(--ad-bs-space);margin-block-end:var(--ad-bs-space);margin-inline-start:auto;margin-inline-end:auto}\n.alfadocs-browser-support--banner{position:fixed;z-index:var(--ad-bs-z);bottom:var(--ad-bs-space);inset-inline-start:var(--ad-bs-space);width:calc(100% - var(--ad-bs-space) - var(--ad-bs-space));max-height:calc(100% - var(--ad-bs-space) - var(--ad-bs-space));overflow-y:auto;box-shadow:var(--ad-bs-shadow)}\n.alfadocs-browser-support__icon{flex:none;display:inline-flex;margin-inline-end:var(--ad-bs-space-sm)}\n.alfadocs-browser-support__icon svg{display:block;width:var(--ad-bs-icon);height:var(--ad-bs-icon)}\n.alfadocs-browser-support__body{flex:1 1 calc(var(--ad-bs-space) * 12);min-width:0;padding-inline-end:var(--ad-bs-space)}\n.alfadocs-browser-support__title,.alfadocs-browser-support__text{margin:0;font-size:inherit;line-height:inherit}\n.alfadocs-browser-support__title,.alfadocs-browser-support__link,.alfadocs-browser-support__dismiss{font-weight:var(--ad-bs-weight)}\n.alfadocs-browser-support__text{margin-block-start:var(--ad-bs-space-xs)}\n.alfadocs-browser-support .alfadocs-browser-support__link,.alfadocs-browser-support .alfadocs-browser-support__link:hover,.alfadocs-browser-support .alfadocs-browser-support__link:focus{display:inline-flex;align-items:center;min-height:var(--ad-bs-target);color:inherit;text-decoration:underline}\n.alfadocs-browser-support__dismiss{flex:none;min-height:var(--ad-bs-target);margin:0;margin-inline-start:auto;padding-block-start:0;padding-block-end:0;padding-inline-start:var(--ad-bs-space);padding-inline-end:var(--ad-bs-space);border:var(--ad-bs-border-width) solid currentColor;border-radius:var(--ad-bs-radius);background:transparent;color:inherit;font-family:inherit;font-size:inherit;line-height:inherit;cursor:pointer}\n.alfadocs-browser-support .alfadocs-browser-support__link:focus,.alfadocs-browser-support .alfadocs-browser-support__dismiss:focus{outline:var(--ad-bs-focus-width) solid var(--ad-bs-ring);outline-offset:var(--ad-bs-focus-offset);box-shadow:0 0 0 var(--ad-bs-focus-offset) var(--ad-bs-surface),0 0 0 calc(var(--ad-bs-focus-offset) + var(--ad-bs-focus-width)) var(--ad-bs-ring)}\n.alfadocs-browser-support .alfadocs-browser-support__link:focus:not(:focus-visible),.alfadocs-browser-support .alfadocs-browser-support__dismiss:focus:not(:focus-visible){outline:none;box-shadow:none}\n@media (forced-colors:active){.alfadocs-browser-support{border-color:CanvasText}.alfadocs-browser-support__dismiss{border-color:ButtonText}}\n@media print{.alfadocs-browser-support--banner{display:none}}",icon:{attrs:{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"lucide lucide-triangle-alert","aria-hidden":"true",focusable:"false"},children:[{tag:"path",attrs:{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3"}},{tag:"path",attrs:{d:"M12 9v4"}},{tag:"path",attrs:{d:"M12 17h.01"}}]},locales:["en","it","de","ar","fr","es","pt","nl","ro","sq","tr","pl","sv","ru","el","ja","zh","hi"],messages:{en:{title:"{{browser}} is out of date",titleUnknown:"Your browser is out of date",reason:"Older browsers miss security fixes, and Alfadocs will soon stop supporting this one.",reasonWithDate:"Older browsers miss security fixes, and Alfadocs will stop supporting this one on {{date}}.",steps:{ios:"Go to Settings, then General, then Software Update. If no update is offered, this device is too old for Alfadocs.",macSafari:"Update macOS to get a newer Safari, or use the latest Chrome or Firefox.",other:"Update {{browser}} to its latest version.",otherUnknown:"Install the latest version of Chrome, Edge or Firefox."},help:"How to update",dismiss:"Hide for today"},it:{title:"Il browser {{browser}} \xE8 obsoleto",titleUnknown:"Il tuo browser \xE8 obsoleto",reason:"I browser vecchi non ricevono le correzioni di sicurezza e Alfadocs smetter\xE0 presto di supportare questo browser.",reasonWithDate:"I browser vecchi non ricevono le correzioni di sicurezza e Alfadocs smetter\xE0 di supportare questo browser il {{date}}.",steps:{ios:"Apri Impostazioni, poi Generali, poi Aggiornamento software. Se non viene proposto alcun aggiornamento, questo dispositivo \xE8 troppo vecchio per Alfadocs.",macSafari:"Aggiorna macOS per avere un Safari pi\xF9 recente, oppure usa l'ultima versione di Chrome o Firefox.",other:"Aggiorna {{browser}} all'ultima versione.",otherUnknown:"Installa l'ultima versione di Chrome, Edge o Firefox."},help:"Come aggiornare",dismiss:"Nascondi per oggi"},de:{title:"Der Browser {{browser}} ist veraltet",titleUnknown:"Ihr Browser ist veraltet",reason:"\xC4lteren Browsern fehlen Sicherheitsupdates, und Alfadocs wird diesen Browser bald nicht mehr unterst\xFCtzen.",reasonWithDate:"\xC4lteren Browsern fehlen Sicherheitsupdates, und Alfadocs wird diesen Browser am {{date}} nicht mehr unterst\xFCtzen.",steps:{ios:"\xD6ffnen Sie Einstellungen, dann Allgemein, dann Softwareupdate. Wird kein Update angeboten, ist dieses Ger\xE4t zu alt f\xFCr Alfadocs.",macSafari:"Aktualisieren Sie macOS, um ein neueres Safari zu erhalten, oder verwenden Sie die neueste Version von Chrome oder Firefox.",other:"Aktualisieren Sie {{browser}} auf die neueste Version.",otherUnknown:"Installieren Sie die neueste Version von Chrome, Edge oder Firefox."},help:"So aktualisieren Sie",dismiss:"F\xFCr heute ausblenden"},ar:{title:"\u0627\u0644\u0645\u062A\u0635\u0641\u062D {{browser}} \u0642\u062F\u064A\u0645",titleUnknown:"\u0645\u062A\u0635\u0641\u062D\u0643 \u0642\u062F\u064A\u0645",reason:"\u0627\u0644\u0645\u062A\u0635\u0641\u062D\u0627\u062A \u0627\u0644\u0642\u062F\u064A\u0645\u0629 \u062A\u0641\u062A\u0642\u0631 \u0625\u0644\u0649 \u0625\u0635\u0644\u0627\u062D\u0627\u062A \u0627\u0644\u0623\u0645\u0627\u0646\u060C \u0648\u0633\u064A\u062A\u0648\u0642\u0641 Alfadocs \u0642\u0631\u064A\u0628\u064B\u0627 \u0639\u0646 \u062F\u0639\u0645 \u0647\u0630\u0627 \u0627\u0644\u0645\u062A\u0635\u0641\u062D.",reasonWithDate:"\u0627\u0644\u0645\u062A\u0635\u0641\u062D\u0627\u062A \u0627\u0644\u0642\u062F\u064A\u0645\u0629 \u062A\u0641\u062A\u0642\u0631 \u0625\u0644\u0649 \u0625\u0635\u0644\u0627\u062D\u0627\u062A \u0627\u0644\u0623\u0645\u0627\u0646\u060C \u0648\u0633\u064A\u062A\u0648\u0642\u0641 Alfadocs \u0639\u0646 \u062F\u0639\u0645 \u0647\u0630\u0627 \u0627\u0644\u0645\u062A\u0635\u0641\u062D \u0628\u062A\u0627\u0631\u064A\u062E {{date}}.",steps:{ios:"\u0627\u0641\u062A\u062D \u0627\u0644\u0625\u0639\u062F\u0627\u062F\u0627\u062A\u060C \u062B\u0645 \u0639\u0627\u0645\u060C \u062B\u0645 \u062A\u062D\u062F\u064A\u062B \u0627\u0644\u0628\u0631\u0646\u0627\u0645\u062C. \u0625\u0630\u0627 \u0644\u0645 \u064A\u0638\u0647\u0631 \u0623\u064A \u062A\u062D\u062F\u064A\u062B\u060C \u0641\u0647\u0630\u0627 \u0627\u0644\u062C\u0647\u0627\u0632 \u0642\u062F\u064A\u0645 \u062C\u062F\u064B\u0627 \u0644\u062A\u0634\u063A\u064A\u0644 Alfadocs.",macSafari:"\u062D\u062F\u0651\u062B macOS \u0644\u0644\u062D\u0635\u0648\u0644 \u0639\u0644\u0649 \u0625\u0635\u062F\u0627\u0631 \u0623\u062D\u062F\u062B \u0645\u0646 Safari\u060C \u0623\u0648 \u0627\u0633\u062A\u062E\u062F\u0645 \u0623\u062D\u062F\u062B \u0625\u0635\u062F\u0627\u0631 \u0645\u0646 Chrome \u0623\u0648 Firefox.",other:"\u062D\u062F\u0651\u062B {{browser}} \u0625\u0644\u0649 \u0623\u062D\u062F\u062B \u0625\u0635\u062F\u0627\u0631.",otherUnknown:"\u062B\u0628\u0651\u062A \u0623\u062D\u062F\u062B \u0625\u0635\u062F\u0627\u0631 \u0645\u0646 Chrome \u0623\u0648 Edge \u0623\u0648 Firefox."},help:"\u0643\u064A\u0641\u064A\u0629 \u0627\u0644\u062A\u062D\u062F\u064A\u062B",dismiss:"\u0625\u062E\u0641\u0627\u0621 \u0644\u0644\u064A\u0648\u0645"},fr:{title:"Le navigateur {{browser}} est obsol\xE8te",titleUnknown:"Votre navigateur est obsol\xE8te",reason:"Les anciens navigateurs ne re\xE7oivent pas les correctifs de s\xE9curit\xE9, et Alfadocs ne prendra bient\xF4t plus en charge celui-ci.",reasonWithDate:"Les anciens navigateurs ne re\xE7oivent pas les correctifs de s\xE9curit\xE9, et Alfadocs ne prendra plus en charge celui-ci le {{date}}.",steps:{ios:"Ouvrez R\xE9glages, puis G\xE9n\xE9ral, puis Mise \xE0 jour logicielle. Si aucune mise \xE0 jour n'est propos\xE9e, cet appareil est trop ancien pour Alfadocs.",macSafari:"Mettez \xE0 jour macOS pour obtenir un Safari plus r\xE9cent, ou utilisez la derni\xE8re version de Chrome ou de Firefox.",other:"Mettez \xE0 jour {{browser}} vers sa derni\xE8re version.",otherUnknown:"Installez la derni\xE8re version de Chrome, Edge ou Firefox."},help:"Comment mettre \xE0 jour",dismiss:"Masquer pour aujourd'hui"},es:{title:"El navegador {{browser}} est\xE1 desactualizado",titleUnknown:"Su navegador est\xE1 desactualizado",reason:"Los navegadores antiguos carecen de correcciones de seguridad, y pronto Alfadocs dejar\xE1 de admitir este navegador.",reasonWithDate:"Los navegadores antiguos carecen de correcciones de seguridad, y Alfadocs dejar\xE1 de admitir este navegador el {{date}}.",steps:{ios:"Abra Ajustes, luego General y despu\xE9s Actualizaci\xF3n de software. Si no se ofrece ninguna actualizaci\xF3n, este dispositivo es demasiado antiguo para Alfadocs.",macSafari:"Actualice macOS para obtener un Safari m\xE1s reciente, o use la \xFAltima versi\xF3n de Chrome o Firefox.",other:"Actualice {{browser}} a su \xFAltima versi\xF3n.",otherUnknown:"Instale la \xFAltima versi\xF3n de Chrome, Edge o Firefox."},help:"C\xF3mo actualizar",dismiss:"Ocultar por hoy"},pt:{title:"O navegador {{browser}} est\xE1 desatualizado",titleUnknown:"O seu navegador est\xE1 desatualizado",reason:"Os navegadores antigos n\xE3o recebem corre\xE7\xF5es de seguran\xE7a e o Alfadocs deixar\xE1 em breve de suportar este navegador.",reasonWithDate:"Os navegadores antigos n\xE3o recebem corre\xE7\xF5es de seguran\xE7a e o Alfadocs deixar\xE1 de suportar este navegador a {{date}}.",steps:{ios:"Abra Defini\xE7\xF5es, depois Geral e depois Atualiza\xE7\xE3o de Software. Se n\xE3o for oferecida nenhuma atualiza\xE7\xE3o, este dispositivo \xE9 demasiado antigo para o Alfadocs.",macSafari:"Atualize o macOS para obter um Safari mais recente, ou use a vers\xE3o mais recente do Chrome ou do Firefox.",other:"Atualize {{browser}} para a vers\xE3o mais recente.",otherUnknown:"Instale a vers\xE3o mais recente do Chrome, Edge ou Firefox."},help:"Como atualizar",dismiss:"Ocultar por hoje"},nl:{title:"De browser {{browser}} is verouderd",titleUnknown:"Deze browser is verouderd",reason:"Oude browsers missen beveiligingsupdates en Alfadocs stopt binnenkort met de ondersteuning van deze browser.",reasonWithDate:"Oude browsers missen beveiligingsupdates en Alfadocs stopt op {{date}} met de ondersteuning van deze browser.",steps:{ios:"Open Instellingen, dan Algemeen, dan Software-update. Als er geen update wordt aangeboden, is dit apparaat te oud voor Alfadocs.",macSafari:"Werk macOS bij voor een nieuwere Safari, of gebruik de nieuwste versie van Chrome of Firefox.",other:"Werk {{browser}} bij naar de nieuwste versie.",otherUnknown:"Installeer de nieuwste versie van Chrome, Edge of Firefox."},help:"Zo werk je bij",dismiss:"Vandaag verbergen"},ro:{title:"Browserul {{browser}} este \xEEnvechit",titleUnknown:"Browserul dumneavoastr\u0103 este \xEEnvechit",reason:"Browserele vechi nu primesc actualiz\u0103ri de securitate, iar \xEEn cur\xE2nd Alfadocs nu va mai suporta acest browser.",reasonWithDate:"Browserele vechi nu primesc actualiz\u0103ri de securitate, iar Alfadocs nu va mai suporta acest browser \xEEncep\xE2nd cu {{date}}.",steps:{ios:"Deschide\u021Bi Set\u0103ri, apoi General, apoi Actualizare software. Dac\u0103 nu este oferit\u0103 nicio actualizare, acest dispozitiv este prea vechi pentru Alfadocs.",macSafari:"Actualiza\u021Bi macOS pentru a ob\u021Bine un Safari mai nou sau folosi\u021Bi cea mai recent\u0103 versiune de Chrome sau Firefox.",other:"Actualiza\u021Bi {{browser}} la cea mai recent\u0103 versiune.",otherUnknown:"Instala\u021Bi cea mai recent\u0103 versiune de Chrome, Edge sau Firefox."},help:"Cum actualiza\u021Bi",dismiss:"Ascunde\u021Bi pentru azi"},sq:{title:"Shfletuesi {{browser}} \xEBsht\xEB i vjetruar",titleUnknown:"Shfletuesi juaj \xEBsht\xEB i vjetruar",reason:"Shfletuesit e vjet\xEBr nuk marrin p\xEBrdit\xEBsime sigurie dhe Alfadocs s\xEB shpejti do t\xEB ndaloj\xEB mb\xEBshtetjen e k\xEBtij shfletuesi.",reasonWithDate:"Shfletuesit e vjet\xEBr nuk marrin p\xEBrdit\xEBsime sigurie dhe Alfadocs do t\xEB ndaloj\xEB mb\xEBshtetjen e k\xEBtij shfletuesi m\xEB {{date}}.",steps:{ios:"Hapni Cil\xEBsimet (Settings), pastaj T\xEB p\xEBrgjithshme (General), pastaj P\xEBrdit\xEBsimi i softuerit (Software Update). N\xEBse nuk ofrohet asnj\xEB p\xEBrdit\xEBsim, kjo pajisje \xEBsht\xEB shum\xEB e vjet\xEBr p\xEBr Alfadocs.",macSafari:"P\xEBrdit\xEBsoni macOS p\xEBr t\xEB pasur nj\xEB Safari m\xEB t\xEB ri, ose p\xEBrdorni versionin m\xEB t\xEB fundit t\xEB Chrome ose Firefox.",other:"P\xEBrdit\xEBsoni {{browser}} n\xEB versionin m\xEB t\xEB fundit.",otherUnknown:"Instaloni versionin m\xEB t\xEB fundit t\xEB Chrome, Edge ose Firefox."},help:"Si t\xEB p\xEBrdit\xEBsoni",dismiss:"Fshihni p\xEBr sot"},tr:{title:"{{browser}} taray\u0131c\u0131s\u0131 g\xFCncel de\u011Fil",titleUnknown:"Taray\u0131c\u0131n\u0131z g\xFCncel de\u011Fil",reason:"Eski taray\u0131c\u0131larda g\xFCvenlik d\xFCzeltmeleri bulunmaz ve Alfadocs yak\u0131nda bu taray\u0131c\u0131y\u0131 desteklemeyi b\u0131rakacak.",reasonWithDate:"Eski taray\u0131c\u0131larda g\xFCvenlik d\xFCzeltmeleri bulunmaz ve Alfadocs {{date}} tarihinde bu taray\u0131c\u0131y\u0131 desteklemeyi b\u0131rakacak.",steps:{ios:"Ayarlar'\u0131, ard\u0131ndan Genel'i, ard\u0131ndan Yaz\u0131l\u0131m G\xFCncelleme'yi a\xE7\u0131n. G\xFCncelleme sunulmuyorsa bu cihaz Alfadocs i\xE7in \xE7ok eski.",macSafari:"Daha yeni bir Safari i\xE7in macOS'i g\xFCncelleyin veya Chrome ya da Firefox'un en son s\xFCr\xFCm\xFCn\xFC kullan\u0131n.",other:"{{browser}} taray\u0131c\u0131s\u0131n\u0131 en son s\xFCr\xFCme g\xFCncelleyin.",otherUnknown:"Chrome, Edge veya Firefox'un en son s\xFCr\xFCm\xFCn\xFC y\xFCkleyin."},help:"Nas\u0131l g\xFCncellenir",dismiss:"Bug\xFCn gizle"},pl:{title:"Przegl\u0105darka {{browser}} jest nieaktualna",titleUnknown:"Twoja przegl\u0105darka jest nieaktualna",reason:"Starsze przegl\u0105darki nie dostaj\u0105 poprawek zabezpiecze\u0144, a Alfadocs wkr\xF3tce przestanie obs\u0142ugiwa\u0107 t\u0119 przegl\u0105dark\u0119.",reasonWithDate:"Starsze przegl\u0105darki nie dostaj\u0105 poprawek zabezpiecze\u0144, a Alfadocs przestanie obs\u0142ugiwa\u0107 t\u0119 przegl\u0105dark\u0119 {{date}}.",steps:{ios:"Otw\xF3rz Ustawienia, potem Og\xF3lne, potem Aktualizacja oprogramowania. Je\u015Bli nie ma dost\u0119pnej aktualizacji, to urz\u0105dzenie jest zbyt stare dla Alfadocs.",macSafari:"Zaktualizuj macOS, aby dosta\u0107 nowsz\u0105 wersj\u0119 Safari, albo u\u017Cyj najnowszej wersji Chrome lub Firefox.",other:"Zaktualizuj przegl\u0105dark\u0119 {{browser}} do najnowszej wersji.",otherUnknown:"Zainstaluj najnowsz\u0105 wersj\u0119 Chrome, Edge lub Firefox."},help:"Jak zaktualizowa\u0107",dismiss:"Ukryj na dzi\u015B"},sv:{title:"Webbl\xE4saren {{browser}} \xE4r f\xF6r\xE5ldrad",titleUnknown:"Din webbl\xE4sare \xE4r f\xF6r\xE5ldrad",reason:"\xC4ldre webbl\xE4sare saknar s\xE4kerhetsfixar, och Alfadocs slutar snart att st\xF6dja den h\xE4r webbl\xE4saren.",reasonWithDate:"\xC4ldre webbl\xE4sare saknar s\xE4kerhetsfixar, och Alfadocs slutar st\xF6dja den h\xE4r webbl\xE4saren den {{date}}.",steps:{ios:"\xD6ppna Inst\xE4llningar, sedan Allm\xE4nt och sedan Programuppdatering. Om ingen uppdatering erbjuds \xE4r den h\xE4r enheten f\xF6r gammal f\xF6r Alfadocs.",macSafari:"Uppdatera macOS f\xF6r att f\xE5 en nyare Safari, eller anv\xE4nd den senaste versionen av Chrome eller Firefox.",other:"Uppdatera {{browser}} till den senaste versionen.",otherUnknown:"Installera den senaste versionen av Chrome, Edge eller Firefox."},help:"S\xE5 uppdaterar du",dismiss:"D\xF6lj f\xF6r idag"},ru:{title:"\u0411\u0440\u0430\u0443\u0437\u0435\u0440 {{browser}} \u0443\u0441\u0442\u0430\u0440\u0435\u043B",titleUnknown:"\u0412\u0430\u0448 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0443\u0441\u0442\u0430\u0440\u0435\u043B",reason:"\u0412 \u0441\u0442\u0430\u0440\u044B\u0445 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\u0445 \u043D\u0435\u0442 \u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0439 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438, \u0438 Alfadocs \u0441\u043A\u043E\u0440\u043E \u043F\u0435\u0440\u0435\u0441\u0442\u0430\u043D\u0435\u0442 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044C \u044D\u0442\u043E\u0442 \u0431\u0440\u0430\u0443\u0437\u0435\u0440.",reasonWithDate:"\u0412 \u0441\u0442\u0430\u0440\u044B\u0445 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\u0445 \u043D\u0435\u0442 \u0438\u0441\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0439 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438, \u0438 Alfadocs \u043F\u0435\u0440\u0435\u0441\u0442\u0430\u043D\u0435\u0442 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044C \u044D\u0442\u043E\u0442 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u0441 {{date}}.",steps:{ios:"\u041E\u0442\u043A\u0440\u043E\u0439\u0442\u0435 \xAB\u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438\xBB, \u0437\u0430\u0442\u0435\u043C \xAB\u041E\u0441\u043D\u043E\u0432\u043D\u044B\u0435\xBB, \u0437\u0430\u0442\u0435\u043C \xAB\u041E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u0435 \u041F\u041E\xBB. \u0415\u0441\u043B\u0438 \u043E\u0431\u043D\u043E\u0432\u043B\u0435\u043D\u0438\u0435 \u043D\u0435 \u043F\u0440\u0435\u0434\u043B\u0430\u0433\u0430\u0435\u0442\u0441\u044F, \u044D\u0442\u043E \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u043E \u0441\u043B\u0438\u0448\u043A\u043E\u043C \u0441\u0442\u0430\u0440\u043E\u0435 \u0434\u043B\u044F Alfadocs.",macSafari:"\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u0435 macOS, \u0447\u0442\u043E\u0431\u044B \u043F\u043E\u043B\u0443\u0447\u0438\u0442\u044C \u0431\u043E\u043B\u0435\u0435 \u043D\u043E\u0432\u0443\u044E \u0432\u0435\u0440\u0441\u0438\u044E Safari, \u0438\u043B\u0438 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u044E\u044E \u0432\u0435\u0440\u0441\u0438\u044E Chrome \u0438\u043B\u0438 Firefox.",other:"\u041E\u0431\u043D\u043E\u0432\u0438\u0442\u0435 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 {{browser}} \u0434\u043E \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0438.",otherUnknown:"\u0423\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u0442\u0435 \u043F\u043E\u0441\u043B\u0435\u0434\u043D\u044E\u044E \u0432\u0435\u0440\u0441\u0438\u044E Chrome, Edge \u0438\u043B\u0438 Firefox."},help:"\u041A\u0430\u043A \u043E\u0431\u043D\u043E\u0432\u0438\u0442\u044C",dismiss:"\u0421\u043A\u0440\u044B\u0442\u044C \u043D\u0430 \u0441\u0435\u0433\u043E\u0434\u043D\u044F"},el:{title:"\u03A4\u03BF \u03C0\u03C1\u03CC\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1 \u03C0\u03B5\u03C1\u03B9\u03AE\u03B3\u03B7\u03C3\u03B7\u03C2 {{browser}} \u03B5\u03AF\u03BD\u03B1\u03B9 \u03BE\u03B5\u03C0\u03B5\u03C1\u03B1\u03C3\u03BC\u03AD\u03BD\u03BF",titleUnknown:"\u03A4\u03BF \u03C0\u03C1\u03CC\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1 \u03C0\u03B5\u03C1\u03B9\u03AE\u03B3\u03B7\u03C3\u03AE\u03C2 \u03C3\u03B1\u03C2 \u03B5\u03AF\u03BD\u03B1\u03B9 \u03BE\u03B5\u03C0\u03B5\u03C1\u03B1\u03C3\u03BC\u03AD\u03BD\u03BF",reason:"\u03A4\u03B1 \u03C0\u03B1\u03BB\u03B9\u03AC \u03C0\u03C1\u03BF\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03B1 \u03C0\u03B5\u03C1\u03B9\u03AE\u03B3\u03B7\u03C3\u03B7\u03C2 \u03B4\u03B5\u03BD \u03AD\u03C7\u03BF\u03C5\u03BD \u03C4\u03B9\u03C2 \u03B4\u03B9\u03BF\u03C1\u03B8\u03CE\u03C3\u03B5\u03B9\u03C2 \u03B1\u03C3\u03C6\u03B1\u03BB\u03B5\u03AF\u03B1\u03C2 \u03BA\u03B1\u03B9 \u03C4\u03BF Alfadocs \u03B8\u03B1 \u03C3\u03C4\u03B1\u03BC\u03B1\u03C4\u03AE\u03C3\u03B5\u03B9 \u03C3\u03CD\u03BD\u03C4\u03BF\u03BC\u03B1 \u03BD\u03B1 \u03C5\u03C0\u03BF\u03C3\u03C4\u03B7\u03C1\u03AF\u03B6\u03B5\u03B9 \u03B1\u03C5\u03C4\u03CC \u03C4\u03BF \u03C0\u03C1\u03CC\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1 \u03C0\u03B5\u03C1\u03B9\u03AE\u03B3\u03B7\u03C3\u03B7\u03C2.",reasonWithDate:"\u03A4\u03B1 \u03C0\u03B1\u03BB\u03B9\u03AC \u03C0\u03C1\u03BF\u03B3\u03C1\u03AC\u03BC\u03BC\u03B1\u03C4\u03B1 \u03C0\u03B5\u03C1\u03B9\u03AE\u03B3\u03B7\u03C3\u03B7\u03C2 \u03B4\u03B5\u03BD \u03AD\u03C7\u03BF\u03C5\u03BD \u03C4\u03B9\u03C2 \u03B4\u03B9\u03BF\u03C1\u03B8\u03CE\u03C3\u03B5\u03B9\u03C2 \u03B1\u03C3\u03C6\u03B1\u03BB\u03B5\u03AF\u03B1\u03C2 \u03BA\u03B1\u03B9 \u03C4\u03BF Alfadocs \u03B8\u03B1 \u03C3\u03C4\u03B1\u03BC\u03B1\u03C4\u03AE\u03C3\u03B5\u03B9 \u03BD\u03B1 \u03C5\u03C0\u03BF\u03C3\u03C4\u03B7\u03C1\u03AF\u03B6\u03B5\u03B9 \u03B1\u03C5\u03C4\u03CC \u03C4\u03BF \u03C0\u03C1\u03CC\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1 \u03C0\u03B5\u03C1\u03B9\u03AE\u03B3\u03B7\u03C3\u03B7\u03C2 \u03C3\u03C4\u03B9\u03C2 {{date}}.",steps:{ios:"\u0391\u03BD\u03BF\u03AF\u03BE\u03C4\u03B5 \u03C4\u03B9\u03C2 \u03A1\u03C5\u03B8\u03BC\u03AF\u03C3\u03B5\u03B9\u03C2, \u03BC\u03B5\u03C4\u03AC \u0393\u03B5\u03BD\u03B9\u03BA\u03AC \u03BA\u03B1\u03B9 \u03BC\u03B5\u03C4\u03AC \u0395\u03BD\u03B7\u03BC\u03AD\u03C1\u03C9\u03C3\u03B7 \u03BB\u03BF\u03B3\u03B9\u03C3\u03BC\u03B9\u03BA\u03BF\u03CD. \u0391\u03BD \u03B4\u03B5\u03BD \u03C0\u03C1\u03BF\u03C3\u03C6\u03AD\u03C1\u03B5\u03C4\u03B1\u03B9 \u03B5\u03BD\u03B7\u03BC\u03AD\u03C1\u03C9\u03C3\u03B7, \u03B1\u03C5\u03C4\u03AE \u03B7 \u03C3\u03C5\u03C3\u03BA\u03B5\u03C5\u03AE \u03B5\u03AF\u03BD\u03B1\u03B9 \u03C0\u03BF\u03BB\u03CD \u03C0\u03B1\u03BB\u03B9\u03AC \u03B3\u03B9\u03B1 \u03C4\u03BF Alfadocs.",macSafari:"\u0395\u03BD\u03B7\u03BC\u03B5\u03C1\u03CE\u03C3\u03C4\u03B5 \u03C4\u03BF macOS \u03B3\u03B9\u03B1 \u03BD\u03B1 \u03B1\u03C0\u03BF\u03BA\u03C4\u03AE\u03C3\u03B5\u03C4\u03B5 \u03BD\u03B5\u03CC\u03C4\u03B5\u03C1\u03BF Safari \u03AE \u03C7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03AE\u03C3\u03C4\u03B5 \u03C4\u03B7\u03BD \u03C0\u03B9\u03BF \u03C0\u03C1\u03CC\u03C3\u03C6\u03B1\u03C4\u03B7 \u03AD\u03BA\u03B4\u03BF\u03C3\u03B7 \u03C4\u03BF\u03C5 Chrome \u03AE \u03C4\u03BF\u03C5 Firefox.",other:"\u0395\u03BD\u03B7\u03BC\u03B5\u03C1\u03CE\u03C3\u03C4\u03B5 \u03C4\u03BF \u03C0\u03C1\u03CC\u03B3\u03C1\u03B1\u03BC\u03BC\u03B1 \u03C0\u03B5\u03C1\u03B9\u03AE\u03B3\u03B7\u03C3\u03B7\u03C2 {{browser}} \u03C3\u03C4\u03B7\u03BD \u03C0\u03B9\u03BF \u03C0\u03C1\u03CC\u03C3\u03C6\u03B1\u03C4\u03B7 \u03AD\u03BA\u03B4\u03BF\u03C3\u03B7.",otherUnknown:"\u0395\u03B3\u03BA\u03B1\u03C4\u03B1\u03C3\u03C4\u03AE\u03C3\u03C4\u03B5 \u03C4\u03B7\u03BD \u03C0\u03B9\u03BF \u03C0\u03C1\u03CC\u03C3\u03C6\u03B1\u03C4\u03B7 \u03AD\u03BA\u03B4\u03BF\u03C3\u03B7 \u03C4\u03BF\u03C5 Chrome, \u03C4\u03BF\u03C5 Edge \u03AE \u03C4\u03BF\u03C5 Firefox."},help:"\u03A0\u03CE\u03C2 \u03BD\u03B1 \u03B5\u03BD\u03B7\u03BC\u03B5\u03C1\u03CE\u03C3\u03B5\u03C4\u03B5",dismiss:"\u0391\u03C0\u03CC\u03BA\u03C1\u03C5\u03C8\u03B7 \u03B3\u03B9\u03B1 \u03C3\u03AE\u03BC\u03B5\u03C1\u03B1"},ja:{title:"{{browser}}\u306F\u53E4\u304F\u306A\u3063\u3066\u3044\u307E\u3059",titleUnknown:"\u304A\u4F7F\u3044\u306E\u30D6\u30E9\u30A6\u30B6\u306F\u53E4\u304F\u306A\u3063\u3066\u3044\u307E\u3059",reason:"\u53E4\u3044\u30D6\u30E9\u30A6\u30B6\u306B\u306F\u30BB\u30AD\u30E5\u30EA\u30C6\u30A3\u4FEE\u6B63\u304C\u63D0\u4F9B\u3055\u308C\u307E\u305B\u3093\u3002Alfadocs\u3082\u9593\u3082\u306A\u304F\u3053\u306E\u30D6\u30E9\u30A6\u30B6\u306E\u30B5\u30DD\u30FC\u30C8\u3092\u7D42\u4E86\u3057\u307E\u3059\u3002",reasonWithDate:"\u53E4\u3044\u30D6\u30E9\u30A6\u30B6\u306B\u306F\u30BB\u30AD\u30E5\u30EA\u30C6\u30A3\u4FEE\u6B63\u304C\u63D0\u4F9B\u3055\u308C\u307E\u305B\u3093\u3002Alfadocs\u306F{{date}}\u306B\u3053\u306E\u30D6\u30E9\u30A6\u30B6\u306E\u30B5\u30DD\u30FC\u30C8\u3092\u7D42\u4E86\u3057\u307E\u3059\u3002",steps:{ios:"\u300C\u8A2D\u5B9A\u300D\u3001\u300C\u4E00\u822C\u300D\u3001\u300C\u30BD\u30D5\u30C8\u30A6\u30A7\u30A2\u30FB\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u300D\u306E\u9806\u306B\u958B\u304D\u307E\u3059\u3002\u30A2\u30C3\u30D7\u30C7\u30FC\u30C8\u304C\u8868\u793A\u3055\u308C\u306A\u3044\u5834\u5408\u3001\u3053\u306E\u30C7\u30D0\u30A4\u30B9\u306FAlfadocs\u306B\u5BFE\u5FDC\u3059\u308B\u306B\u306F\u53E4\u3059\u304E\u307E\u3059\u3002",macSafari:"macOS\u3092\u66F4\u65B0\u3057\u3066\u65B0\u3057\u3044Safari\u3092\u5165\u624B\u3059\u308B\u304B\u3001\u6700\u65B0\u306EChrome\u307E\u305F\u306FFirefox\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044\u3002",other:"{{browser}}\u3092\u6700\u65B0\u30D0\u30FC\u30B8\u30E7\u30F3\u306B\u66F4\u65B0\u3057\u3066\u304F\u3060\u3055\u3044\u3002",otherUnknown:"Chrome\u3001Edge\u3001\u307E\u305F\u306FFirefox\u306E\u6700\u65B0\u30D0\u30FC\u30B8\u30E7\u30F3\u3092\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3057\u3066\u304F\u3060\u3055\u3044\u3002"},help:"\u66F4\u65B0\u65B9\u6CD5",dismiss:"\u4ECA\u65E5\u306F\u975E\u8868\u793A"},zh:{title:"{{browser}} \u5DF2\u8FC7\u65F6",titleUnknown:"\u60A8\u7684\u6D4F\u89C8\u5668\u5DF2\u8FC7\u65F6",reason:"\u65E7\u7248\u6D4F\u89C8\u5668\u7F3A\u5C11\u5B89\u5168\u4FEE\u590D\uFF0CAlfadocs \u4E5F\u5373\u5C06\u505C\u6B62\u652F\u6301\u6B64\u6D4F\u89C8\u5668\u3002",reasonWithDate:"\u65E7\u7248\u6D4F\u89C8\u5668\u7F3A\u5C11\u5B89\u5168\u4FEE\u590D\uFF0CAlfadocs \u5C06\u4E8E {{date}} \u505C\u6B62\u652F\u6301\u6B64\u6D4F\u89C8\u5668\u3002",steps:{ios:"\u4F9D\u6B21\u6253\u5F00\u201C\u8BBE\u7F6E\u201D\u3001\u201C\u901A\u7528\u201D\u3001\u201C\u8F6F\u4EF6\u66F4\u65B0\u201D\u3002\u5982\u679C\u6CA1\u6709\u53EF\u7528\u66F4\u65B0\uFF0C\u8BF4\u660E\u6B64\u8BBE\u5907\u592A\u65E7\uFF0C\u65E0\u6CD5\u4F7F\u7528 Alfadocs\u3002",macSafari:"\u8BF7\u66F4\u65B0 macOS \u4EE5\u83B7\u5F97\u66F4\u65B0\u7248\u672C\u7684 Safari\uFF0C\u6216\u4F7F\u7528\u6700\u65B0\u7248 Chrome \u6216 Firefox\u3002",other:"\u8BF7\u5C06 {{browser}} \u66F4\u65B0\u5230\u6700\u65B0\u7248\u672C\u3002",otherUnknown:"\u8BF7\u5B89\u88C5\u6700\u65B0\u7248 Chrome\u3001Edge \u6216 Firefox\u3002"},help:"\u5982\u4F55\u66F4\u65B0",dismiss:"\u4ECA\u65E5\u9690\u85CF"},hi:{title:"{{browser}} \u092C\u094D\u0930\u093E\u0909\u091C\u093C\u0930 \u092A\u0941\u0930\u093E\u0928\u093E \u0939\u094B \u091A\u0941\u0915\u093E \u0939\u0948",titleUnknown:"\u0906\u092A\u0915\u093E \u092C\u094D\u0930\u093E\u0909\u091C\u093C\u0930 \u092A\u0941\u0930\u093E\u0928\u093E \u0939\u094B \u091A\u0941\u0915\u093E \u0939\u0948",reason:"\u092A\u0941\u0930\u093E\u0928\u0947 \u092C\u094D\u0930\u093E\u0909\u091C\u093C\u0930 \u092E\u0947\u0902 \u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0938\u0941\u0927\u093E\u0930 \u0928\u0939\u0940\u0902 \u092E\u093F\u0932\u0924\u0947, \u0914\u0930 Alfadocs \u091C\u0932\u094D\u0926 \u0939\u0940 \u0907\u0938 \u092C\u094D\u0930\u093E\u0909\u091C\u093C\u0930 \u0915\u094B \u0938\u092A\u094B\u0930\u094D\u091F \u0915\u0930\u0928\u093E \u092C\u0902\u0926 \u0915\u0930 \u0926\u0947\u0917\u093E\u0964",reasonWithDate:"\u092A\u0941\u0930\u093E\u0928\u0947 \u092C\u094D\u0930\u093E\u0909\u091C\u093C\u0930 \u092E\u0947\u0902 \u0938\u0941\u0930\u0915\u094D\u0937\u093E \u0938\u0941\u0927\u093E\u0930 \u0928\u0939\u0940\u0902 \u092E\u093F\u0932\u0924\u0947, \u0914\u0930 Alfadocs {{date}} \u0915\u094B \u0907\u0938 \u092C\u094D\u0930\u093E\u0909\u091C\u093C\u0930 \u0915\u094B \u0938\u092A\u094B\u0930\u094D\u091F \u0915\u0930\u0928\u093E \u092C\u0902\u0926 \u0915\u0930 \u0926\u0947\u0917\u093E\u0964",steps:{ios:"\u0938\u0947\u091F\u093F\u0902\u0917 \u0916\u094B\u0932\u0947\u0902, \u092B\u093F\u0930 \u0938\u093E\u092E\u093E\u0928\u094D\u092F, \u092B\u093F\u0930 \u0938\u0949\u092B\u093C\u094D\u091F\u0935\u0947\u092F\u0930 \u0905\u092A\u0921\u0947\u091F\u0964 \u0905\u0917\u0930 \u0915\u094B\u0908 \u0905\u092A\u0921\u0947\u091F \u0928\u0939\u0940\u0902 \u092E\u093F\u0932\u0924\u093E, \u0924\u094B \u092F\u0939 \u0921\u093F\u0935\u093E\u0907\u0938 Alfadocs \u0915\u0947 \u0932\u093F\u090F \u092C\u0939\u0941\u0924 \u092A\u0941\u0930\u093E\u0928\u093E \u0939\u0948\u0964",macSafari:"\u0928\u092F\u093E Safari \u092A\u093E\u0928\u0947 \u0915\u0947 \u0932\u093F\u090F macOS \u0905\u092A\u0921\u0947\u091F \u0915\u0930\u0947\u0902, \u092F\u093E Chrome \u092F\u093E Firefox \u0915\u093E \u0928\u0935\u0940\u0928\u0924\u092E \u0938\u0902\u0938\u094D\u0915\u0930\u0923 \u0907\u0938\u094D\u0924\u0947\u092E\u093E\u0932 \u0915\u0930\u0947\u0902\u0964",other:"{{browser}} \u0915\u094B \u0909\u0938\u0915\u0947 \u0928\u0935\u0940\u0928\u0924\u092E \u0938\u0902\u0938\u094D\u0915\u0930\u0923 \u092E\u0947\u0902 \u0905\u092A\u0921\u0947\u091F \u0915\u0930\u0947\u0902\u0964",otherUnknown:"Chrome, Edge \u092F\u093E Firefox \u0915\u093E \u0928\u0935\u0940\u0928\u0924\u092E \u0938\u0902\u0938\u094D\u0915\u0930\u0923 \u0907\u0902\u0938\u094D\u091F\u0949\u0932 \u0915\u0930\u0947\u0902\u0964"},help:"\u0905\u092A\u0921\u0947\u091F \u0915\u0948\u0938\u0947 \u0915\u0930\u0947\u0902",dismiss:"\u0906\u091C \u0915\u0947 \u0932\u093F\u090F \u091B\u093F\u092A\u093E\u090F\u0902"}}});})();
@@ -138,6 +138,8 @@ export declare function divideDecimal(a: ScaledDecimal, b: ScaledDecimal, scale:
138
138
  /** The exact sum at the largest scale given (a totals footer). `null` when
139
139
  * the result is not a safe integer. An empty list sums to 0. */
140
140
  export declare function sumDecimals(values: readonly ScaledDecimal[]): ScaledDecimal | null;
141
+ /** The same value with the opposite sign (zero stays zero). */
142
+ export declare function negateDecimal(value: ScaledDecimal): ScaledDecimal;
141
143
  /** Compare by value, whatever the scales: "1.50" equals "1.5". */
142
144
  export declare function compareDecimal(a: ScaledDecimal, b: ScaledDecimal): -1 | 0 | 1;
143
145
  /**