@reportwright/viewer 0.13.1 → 0.13.2-rc.2

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 (56) hide show
  1. package/CHANGELOG.md +51 -0
  2. package/README.md +146 -5
  3. package/dist/{chunk-B5ZCT3UK.js → chunk-4XZRLUHN.js} +73 -46
  4. package/dist/{chunk-B5ZCT3UK.js.map → chunk-4XZRLUHN.js.map} +2 -2
  5. package/dist/{chunk-XXTAPZO4.js → chunk-D7S5DL46.js} +2 -2
  6. package/dist/{chunk-ES2LYZ6S.js → chunk-DVJYE7HZ.js} +3 -3
  7. package/dist/chunk-GOCWG6FG.js +12 -12
  8. package/dist/chunk-GRYITZPG.js +23 -23
  9. package/dist/chunk-H422SRD3.js +21 -21
  10. package/dist/{chunk-PF4RFKX2.js → chunk-NARXO3DB.js} +3 -3
  11. package/dist/{chunk-PKXTMC4J.js → chunk-OED3YZYP.js} +5 -5
  12. package/dist/{chunk-ZGRJJ6OW.js → chunk-OMCWZYRI.js} +32 -17
  13. package/dist/chunk-OMCWZYRI.js.map +6 -0
  14. package/dist/chunk-U2ZY2NPQ.js +2 -2
  15. package/dist/designer.js +331 -135
  16. package/dist/designer.js.map +3 -3
  17. package/dist/engine.worker.bwip.js +4780 -51421
  18. package/dist/engine.worker.bwip.js.map +3 -3
  19. package/dist/engine.worker.js +5675 -59626
  20. package/dist/engine.worker.js.map +3 -3
  21. package/dist/pdfstreamworker.js +4 -0
  22. package/dist/peer/{chunk-7IP67PA6.js → chunk-4AFSC6JI.js} +48 -21
  23. package/dist/peer/{chunk-7IP67PA6.js.map → chunk-4AFSC6JI.js.map} +1 -1
  24. package/dist/peer/chunk-A6UXBSTP.js +21 -21
  25. package/dist/peer/{chunk-3EYYRJR4.js → chunk-FN3FXACD.js} +3 -3
  26. package/dist/peer/{chunk-WVQQCD4M.js → chunk-ILBTPBOA.js} +32 -17
  27. package/dist/peer/chunk-ILBTPBOA.js.map +6 -0
  28. package/dist/peer/{chunk-3XZY54LM.js → chunk-JQDW5OR3.js} +5 -5
  29. package/dist/peer/chunk-MXR6JBMP.js +2 -2
  30. package/dist/peer/chunk-N42DCZZA.js +12 -12
  31. package/dist/peer/{chunk-RKFP7SDY.js → chunk-OUTKMWFM.js} +3 -3
  32. package/dist/peer/{chunk-5RUNOIS7.js → chunk-VJLMUGUI.js} +2 -2
  33. package/dist/peer/chunk-ZS3J4WBH.js +23 -23
  34. package/dist/peer/designer.js +317 -122
  35. package/dist/peer/designer.js.map +3 -3
  36. package/dist/peer/engine.worker.bwip.js +4780 -51421
  37. package/dist/peer/engine.worker.bwip.js.map +3 -3
  38. package/dist/peer/engine.worker.js +5675 -59626
  39. package/dist/peer/engine.worker.js.map +3 -3
  40. package/dist/peer/pdfstreamworker.js +4 -0
  41. package/dist/peer/viewer.js +41 -9
  42. package/dist/peer/viewer.js.map +1 -1
  43. package/dist/viewer.d.ts +2 -0
  44. package/dist/viewer.js +41 -9
  45. package/dist/viewer.js.map +1 -1
  46. package/package.json +1 -1
  47. package/dist/chunk-ZGRJJ6OW.js.map +0 -6
  48. package/dist/peer/chunk-WVQQCD4M.js.map +0 -6
  49. /package/dist/{chunk-XXTAPZO4.js.map → chunk-D7S5DL46.js.map} +0 -0
  50. /package/dist/{chunk-ES2LYZ6S.js.map → chunk-DVJYE7HZ.js.map} +0 -0
  51. /package/dist/{chunk-PF4RFKX2.js.map → chunk-NARXO3DB.js.map} +0 -0
  52. /package/dist/{chunk-PKXTMC4J.js.map → chunk-OED3YZYP.js.map} +0 -0
  53. /package/dist/peer/{chunk-3EYYRJR4.js.map → chunk-FN3FXACD.js.map} +0 -0
  54. /package/dist/peer/{chunk-3XZY54LM.js.map → chunk-JQDW5OR3.js.map} +0 -0
  55. /package/dist/peer/{chunk-RKFP7SDY.js.map → chunk-OUTKMWFM.js.map} +0 -0
  56. /package/dist/peer/{chunk-5RUNOIS7.js.map → chunk-VJLMUGUI.js.map} +0 -0
@@ -0,0 +1,4 @@
1
+ // The streaming PDF's parallel paint worker is @reportwright/engine's (dist/pdfstreamworker.js). This stand-in ships so
2
+ // bundlers resolve new URL('./pdfstreamworker.js', import.meta.url) in this package.
3
+ const { parentPort } = globalThis.process.getBuiltinModule('node:worker_threads');
4
+ parentPort.on('message', (job) => parentPort.postMessage({ id: job.id, error: { message: 'exportPdfStream with parallel needs @reportwright/engine' } }));
@@ -22,7 +22,7 @@ import {
22
22
  serverPdfUrl,
23
23
  subsetter,
24
24
  usingWorker
25
- } from "./chunk-RKFP7SDY.js";
25
+ } from "./chunk-OUTKMWFM.js";
26
26
  import {
27
27
  NO_CJK_FONTS
28
28
  } from "../chunk-BR5K6SBL.js";
@@ -4727,8 +4727,8 @@ var r4_default = {
4727
4727
  // src/i18n/b2.js
4728
4728
  var LANGS = ["en", "hi", "es", "fr", "de", "ja", "zh", "pt-BR", "ar"];
4729
4729
  var ROWS = {
4730
- b2_skipBlank: ["Skip when the parameter is blank", "पैरामीटर खाली हो तो छोड़ें", "Omitir si el parámetro está vacío", "Ignorer si le paramètre est vide", "Überspringen, wenn der Parameter leer ist", "パラメーターが空のときはスキップ", "参数为空时跳过", "Ignorar quando o parâmetro estiver vazio", "تخطَّ عندما تكون المعلمة فا\
4731
- رغة"],
4730
+ b2_skipBlank: ["Skip when the parameter is blank", "पैरामीटर खाली हो तो छोड़ें", "Omitir si el parámetro está vacío", "Ignorer si le paramètre est vide", "Überspringen, wenn der Parameter leer ist", "パラメーターが空のときはスキップ", "参数为空时跳过", "Ignorar quando o parâmetro estiver vazio", ("تخطَّ عندما تكون المعلمة فا"+
4731
+ "رغة")],
4732
4732
  // viewer
4733
4733
  b2_pageOf: ["Page {n} of {total}", "पृष्ठ {n} / {total}", "Página {n} de {total}", "Page {n} sur {total}", "Seite {n} von {total}", "{total} ページ中 {n} ページ", "第 {n} 页,共 {total} 页", "Página {n} de {total}", "الصفحة {n} من {total}"],
4734
4734
  b2_pageN: ["Page {n}", "पृष्ठ {n}", "Página {n}", "Page {n}", "Seite {n}", "{n} ページ", "第 {n} 页", "Página {n}", "الصفحة {n}"],
@@ -4750,8 +4750,8 @@ var ROWS = {
4750
4750
  b2_view: ["View", "दृश्य", "Vista", "Affichage", "Ansicht", "表示", "视图", "Exibir", "عرض"],
4751
4751
  b2_previewGroup: ["Preview", "पूर्वावलोकन", "Vista previa", "Aperçu", "Vorschau", "プレビュー", "预览", "Visualização", "معاينة"],
4752
4752
  b2_insertItem: ["Insert: {item}", "डालें: {item}", "Insertar: {item}", "Insérer : {item}", "Einfügen: {item}", "挿入: {item}", "插入:{item}", "Inserir: {item}", "إدراج: {item}"],
4753
- b2_insertHint: ["Goes inside the selected list or container, else below the body", "चुनी गई सूची या कंटेनर के अंदर, वरना बॉडी के नीचे जाता है", "Va dentro de la lista o el contenedor seleccionado; si no, debajo del cuerpo", "Va dans la liste ou le conteneur sélectionné, sinon sous le corps", "Kommt in die a\
4754
- usgewählte Liste oder den Container, sonst unter den Hauptteil", "選択したリストやコンテナーの中に、なければ本文の下に入ります", "放入所选列表或容器中,否则放在正文下方", "Vai dentro da lista ou do contêiner selecionado; senão, abaixo do corpo", "يُدرج داخل القائمة أو الحاوية المحددة، وإلا أسفل المتن"],
4753
+ b2_insertHint: ["Goes inside the selected list or container, else below the body", "चुनी गई सूची या कंटेनर के अंदर, वरना बॉडी के नीचे जाता है", "Va dentro de la lista o el contenedor seleccionado; si no, debajo del cuerpo", "Va dans la liste ou le conteneur sélectionné, sinon sous le corps", ("Kommt in die a"+
4754
+ "usgewählte Liste oder den Container, sonst unter den Hauptteil"), "選択したリストやコンテナーの中に、なければ本文の下に入ります", "放入所选列表或容器中,否则放在正文下方", "Vai dentro da lista ou do contêiner selecionado; senão, abaixo do corpo", "يُدرج داخل القائمة أو الحاوية المحددة، وإلا أسفل المتن"],
4755
4755
  b2_toolbox: ["Toolbox", "टूलबॉक्स", "Herramientas", "Boîte à outils", "Werkzeuge", "ツールボックス", "工具箱", "Ferramentas", "الأدوات"],
4756
4756
  b2_data: ["Data", "डेटा", "Datos", "Données", "Daten", "データ", "数据", "Dados", "البيانات"],
4757
4757
  b2_outline: ["Outline", "रूपरेखा", "Esquema", "Structure", "Gliederung", "アウトライン", "大纲", "Estrutura", "المخطط"],
@@ -4766,15 +4766,34 @@ usgewählte Liste oder den Container, sonst unter den Hauptteil", "選択した
4766
4766
  b2_selCell: ["Cell in {name}", "{name} में सेल", "Celda de {name}", "Cellule de {name}", "Zelle in {name}", "{name} のセル", "{name} 中的单元格", "Célula em {name}", "خلية في {name}"],
4767
4767
  b2_pageInfo: ["Page {size} · {w} × {h} {unit}", "पृष्ठ {size} · {w} × {h} {unit}", "Página {size} · {w} × {h} {unit}", "Page {size} · {w} × {h} {unit}", "Seite {size} · {w} × {h} {unit}", "ページ {size} · {w} × {h} {unit}", "页面 {size} · {w} × {h} {unit}", "Página {size} · {w} × {h} {unit}", "الصفحة {size} · {w} × {h} {unit}"],
4768
4768
  // batch 9 (designer bugs)
4769
- b9_nothingToPaste: ["Nothing to paste: copy items in a designer first (Ctrl+C)", "चिपकाने को कुछ नहीं: पहले डिज़ाइनर में आइटम कॉपी करें (Ctrl+C)", "Nada que pegar: copie primero elementos en un diseñador (Ctrl+C)", "Rien à coller : copiez d’abord des éléments dans un concepteur (Ctrl+C)", "Nichts zum Einf\
4770
- ügen: zuerst Elemente in einem Designer kopieren (Strg+C)", "貼り付けるものがありません。先にデザイナーで項目をコピーしてください (Ctrl+C)", "没有可粘贴的内容:请先在设计器中复制项目 (Ctrl+C)", "Nada para colar: copie primeiro itens em um designer (Ctrl+C)", "لا شيء للصق: انسخ عناصر في مصمم أولاً (Ctrl+C)"],
4769
+ b9_nothingToPaste: ["Nothing to paste: copy items in a designer first (Ctrl+C)", "चिपकाने को कुछ नहीं: पहले डिज़ाइनर में आइटम कॉपी करें (Ctrl+C)", "Nada que pegar: copie primero elementos en un diseñador (Ctrl+C)", "Rien à coller : copiez d’abord des éléments dans un concepteur (Ctrl+C)", ("Nichts zum Einf"+
4770
+ "ügen: zuerst Elemente in einem Designer kopieren (Strg+C)"), "貼り付けるものがありません。先にデザイナーで項目をコピーしてください (Ctrl+C)", "没有可粘贴的内容:请先在设计器中复制项目 (Ctrl+C)", "Nada para colar: copie primeiro itens em um designer (Ctrl+C)", "لا شيء للصق: انسخ عناصر في مصمم أولاً (Ctrl+C)"],
4771
4771
  b9_itemLabel: ["{type} {name}, x {x}, y {y}", "{type} {name}, x {x}, y {y}", "{type} {name}, x {x}, y {y}", "{type} {name}, x {x}, y {y}", "{type} {name}, x {x}, y {y}", "{type} {name}、x {x}、y {y}", "{type} {name},x {x},y {y}", "{type} {name}, x {x}, y {y}", "{type} {name}، x {x}، y {y}"],
4772
4772
  b9_outlineKeys: ["Up and Down move between rows; Enter or Space selects (Shift adds); then Delete removes and the arrows move the selection on the page", "ऊपर और नीचे पंक्तियों के बीच जाते हैं; Enter या Space चुनता है (Shift जोड़ता है); फिर Delete हटाता है और तीर पेज पर चयन को खिसकाते हैं",
4773
- "Arriba y Abajo cambian de fila; Intro o Espacio selecciona (Mayús añade); luego Supr elimina y las flechas mueven la selección en la página", "Haut et Bas passent d’une ligne à l’autre ; Entrée ou Espace sélectionne (Maj ajoute) ; ensuite Suppr supprime et les flèches déplacent la sélection sur la page", "Auf und Ab wechseln die Zeile; Eingabe oder Leertaste wählt aus (Umschalt fü\
4774
- gt hinzu); dann löscht Entf und die Pfeile verschieben die Auswahl auf der Seite", "上下で行を移動、Enter または Space で選択 (Shift で追加)。その後 Delete で削除、矢印でページ上の選択を移動", "上下键在行间移动;Enter 或空格选择(Shift 添加);然后 Delete 删除,方向键在页面上移动所选项", "Cima e Baixo mudam de linha; Enter \
4775
- ou Espaço seleciona (Shift adiciona); depois Delete remove e as setas movem a seleção na página", "السهمان لأعلى ولأسفل للتنقل بين الصفوف؛ Enter أو المسافة للتحديد (Shift للإضافة)؛ ثم Delete للحذف والأسهم لتحريك التحديد في الصفحة"],
4773
+ "Arriba y Abajo cambian de fila; Intro o Espacio selecciona (Mayús añade); luego Supr elimina y las flechas mueven la selección en la página", "Haut et Bas passent d’une ligne à l’autre ; Entrée ou Espace sélectionne (Maj ajoute) ; ensuite Suppr supprime et les flèches déplacent la sélection sur la page", ("Auf und Ab wechseln die Zeile; Eingabe oder Leertaste wählt aus (Umschalt fü"+
4774
+ "gt hinzu); dann löscht Entf und die Pfeile verschieben die Auswahl auf der Seite"), "上下で行を移動、Enter または Space で選択 (Shift で追加)。その後 Delete で削除、矢印でページ上の選択を移動", "上下键在行间移动;Enter 或空格选择(Shift 添加);然后 Delete 删除,方向键在页面上移动所选项", ("Cima e Baixo mudam de linha; Enter "+
4775
+ "ou Espaço seleciona (Shift adiciona); depois Delete remove e as setas movem a seleção na página"), "السهمان لأعلى ولأسفل للتنقل بين الصفوف؛ Enter أو المسافة للتحديد (Shift للإضافة)؛ ثم Delete للحذف والأسهم لتحريك التحديد في الصفحة"],
4776
4776
  p_field_label: ["Label (the name a screen reader says)", "लेबल (स्क्रीन रीडर जो नाम बोलता है)", "Etiqueta (el nombre que dice un lector de pantalla)", "Libellé (le nom que lit un lecteur d’écran)", "Beschriftung (der Name, den ein Screenreader vorliest)", "ラベル (スクリーンリーダーが読み上げる名前)", "标签(屏幕阅读器读出的名称)",
4777
- "Rótulo (o nome que um leitor de tela diz)", "التسمية (الاسم الذي يقرؤه قارئ الشاشة)"]
4777
+ "Rótulo (o nome que um leitor de tela diz)", "التسمية (الاسم الذي يقرؤه قارئ الشاشة)"],
4778
+ // 0.13.2 (designer and viewer UI review)
4779
+ c132_nudge1: ["Nudge 1 pt (1 grid step with Snap to grid)", "1 pt खिसकाएँ (स्नैप टू ग्रिड के साथ 1 ग्रिड कदम)", "Desplazar 1 pt (1 paso de cuadrícula con Ajustar a la cuadrícula)", "Déplacer de 1 pt (1 pas de grille avec Aligner sur la grille)", "Um 1 pt verschieben (1 Rasterschritt mit „Am Raster ausrichten“)", ("1 pt 移動 (グリッ"+
4780
+ "ドにスナップ時は 1 目盛り)"), "微移 1 pt(启用对齐网格时为 1 个网格单位)", "Mover 1 pt (1 passo da grade com Ajustar à grade)", "تحريك 1 نقطة (خطوة شبكة واحدة مع المحاذاة إلى الشبكة)"],
4781
+ c132_nudge10: ["Nudge 10 pt (10 grid steps with Snap to grid)", "10 pt खिसकाएँ (स्नैप टू ग्रिड के साथ 10 ग्रिड कदम)", "Desplazar 10 pt (10 pasos de cuadrícula con Ajustar a la cuadrícula)", "Déplacer de 10 pt (10 pas de grille avec Aligner sur la grille)", "Um 10 pt verschieben (10 Rasterschritte mit „Am Raster ausrichten“)",
4782
+ "10 pt 移動 (グリッドにスナップ時は 10 目盛り)", "微移 10 pt(启用对齐网格时为 10 个网格单位)", "Mover 10 pt (10 passos da grade com Ajustar à grade)", "تحريك 10 نقاط (10 خطوات شبكة مع المحاذاة إلى الشبكة)"],
4783
+ c132_warnings: ["{n} warnings", "{n} चेतावनियाँ", "{n} advertencias", "{n} avertissements", "{n} Warnungen", "警告 {n} 件", "{n} 条警告", "{n} avisos", "{n} تحذيرات"],
4784
+ c132_warning1: ["1 warning", "1 चेतावनी", "1 advertencia", "1 avertissement", "1 Warnung", "警告 1 件", "1 条警告", "1 aviso", "تحذير واحد"],
4785
+ c132_detected: ["detected", "पहचाना गया", "detectado", "détecté", "erkannt", "検出", "已检测", "detectado", "مكتشف"],
4786
+ c132_detectedHint: ["Fields detected from the data, not declared in the data set (Edit declares them)", "डेटा से पहचाने गए फ़ील्ड, डेटा सेट में घोषित नहीं (संपादित करें उन्हें घोषित करता है)", ("Campos detectados en los datos, no declarados en el conjunto de datos "+
4787
+ "(Editar los declara)"), "Champs détectés dans les données, non déclarés dans le jeu de données (Modifier les déclare)", "Aus den Daten erkannte Felder, im Dataset nicht deklariert (Bearbeiten deklariert sie)", "データから検出したフィールド (データセットでは未宣言。編集で宣言できます)", "从数据中检测到的字段,未在数据集中声明(编辑可声明它们)",
4788
+ "Campos detectados nos dados, não declarados no conjunto de dados (Editar os declara)", "حقول مكتشفة من البيانات، غير معرّفة في مجموعة البيانات (التحرير يعرّفها)"],
4789
+ c132_moreInfo: ["More information", "अधिक जानकारी", "Más información", "Plus d’informations", "Weitere Informationen", "詳細情報", "更多信息", "Mais informações", "مزيد من المعلومات"],
4790
+ c132_liveParams: ["Apply parameters as the reader changes them (off: only when the reader clicks View report)", "पाठक के बदलते ही पैरामीटर लागू करें (बंद: केवल जब पाठक रिपोर्ट देखें पर क्लिक करे)", ("Aplicar los parámetros a medida que el lector los cambia (desactivado: "+
4791
+ "solo al hacer clic en Ver informe)"), "Appliquer les paramètres dès que le lecteur les change (désactivé : seulement quand il clique sur Afficher le rapport)", "Parameter anwenden, sobald der Leser sie ändert (aus: erst wenn er auf „Bericht anzeigen“ klickt)", "閲覧者が変更したらすぐにパラメーターを適用 (オフ: 「レポートを表示」をクリックしたときのみ)",
4792
+ "读者更改参数时立即应用(关闭:仅在读者点击“查看报表”时应用)", "Aplicar os parâmetros conforme o leitor os altera (desligado: só quando o leitor clica em Ver relatório)", "تطبيق المعلمات عند تغيير القارئ لها (عند الإيقاف: فقط عند النقر على عرض التقرير)"],
4793
+ c132_panelColumnsHint: ["For the whole report. On a wide screen, more than one column puts the panel above the pages, with the parameters in a grid; on a phone it stays one column.", "पूरी रिपोर्ट के लिए। चौड़ी स्क्रीन पर एक से अधिक कॉलम पैनल को पृष्ठों के ऊपर रखते हैं, पैरामीटर ग्रिड में; फ़ोन पर यह एक कॉलम रहता है।",
4794
+ "Para todo el informe. En una pantalla ancha, más de una columna pone el panel encima de las páginas, con los parámetros en cuadrícula; en un teléfono queda en una columna.", "Pour tout le rapport. Sur un écran large, plus d’une colonne place le panneau au-dessus des pages, avec les paramètres en grille ; sur un téléphone il reste sur une colonne.", ("Für den ganzen Bericht. Auf einem "+
4795
+ "breiten Bildschirm setzt mehr als eine Spalte das Feld über die Seiten, mit den Parametern im Raster; auf dem Telefon bleibt es einspaltig."), "レポート全体の設定です。広い画面では 2 列以上にするとパネルがページの上に表示され、パラメーターがグリッドに並びます。スマートフォンでは 1 列のままです。", ("适用于整个报表。在宽屏上,多于一列会把面板放在页面上方"+
4796
+ ",参数排成网格;在手机上仍为一列。"), "Para todo o relatório. Em uma tela larga, mais de uma coluna coloca o painel acima das páginas, com os parâmetros em grade; no celular ele fica em uma coluna.", "للتقرير كله. على شاشة عريضة، أكثر من عمود يضع اللوحة فوق الصفحات والمعلمات في شبكة؛ على الهاتف تبقى عمودًا واحدًا."]
4778
4797
  };
4779
4798
  var b2_default = Object.fromEntries(LANGS.map((l, i) => [l, Object.fromEntries(Object.entries(ROWS).map(([k, v]) => [k, v[i]]))]));
4780
4799
 
@@ -4842,7 +4861,7 @@ async function exportBlob(fmt, model, def, opt = {}) {
4842
4861
  if (fmt === "csv") return new Blob([(await import("./chunk-CFTFTV2O.js")).exportCsv(model, { locale: def.locale, currency: def.currency })], { type: "text/csv;charset=utf-8" });
4843
4862
  if (fmt === "html" && opt.interactive !== false && o.html === "interactive") {
4844
4863
  try {
4845
- const { exportInteractiveHtml } = await import("./chunk-3EYYRJR4.js");
4864
+ const { exportInteractiveHtml } = await import("./chunk-FN3FXACD.js");
4846
4865
  const { html } = await exportInteractiveHtml(def, { params: opt.params, reportId: opt.reportId, lang: opt.lang, model });
4847
4866
  return new Blob([html], { type: "text/html;charset=utf-8" });
4848
4867
  } catch (e) {
@@ -5005,7 +5024,8 @@ var P = {
5005
5024
  search: "M7 12a5 5 0 1 0 0-10 5 5 0 0 0 0 10zM14 14l-3.5-3.5",
5006
5025
  print: "M4.5 6V1.5h7V6M4.5 11.5h-2.5v-5.5h12v5.5h-2.5M4.5 9.5h7v5h-7z",
5007
5026
  download: "M8 2v8.5M4.5 7L8 10.5 11.5 7M2.5 13.5h11",
5008
- gear: "M8 10.2a2.2 2.2 0 1 0 0-4.4 2.2 2.2 0 0 0 0 4.4zM8 1.5v2M8 12.5v2M1.5 8h2M12.5 8h2M3.4 3.4l1.4 1.4M11.2 11.2l1.4 1.4M3.4 12.6l1.4-1.4M11.2 4.8l1.4-1.4",
5027
+ sliders: "M2 4h6M11 4h3M9.5 2.5v3M2 8h1.5M6.5 8h7.5M5 6.5v3M2 12h7.5M12.5 12h1.5M11 10.5v3",
5028
+ // Export options (a sun-like gear read as brightness)
5009
5029
  sidebar: "M2 2.5h12v11H2zM6 2.5v11",
5010
5030
  pages: "M3 1.5h7l3 3v10H3zM10 1.5v3h3M5.5 8h5M5.5 10.5h5",
5011
5031
  toc: "M2.5 4h1M6 4h7.5M2.5 8h1M6 8h7.5M2.5 12h1M6 12h7.5",
@@ -5148,7 +5168,7 @@ var urlWithDrill = (list) => {
5148
5168
  else u.searchParams.delete(DRILL_KEY);
5149
5169
  return u.toString();
5150
5170
  };
5151
- function ReportViewer({ definition: rootDef, reportId: rootReportId, params: rootParams, title, compact = false, autoRun = true, lang: langIn = "en", onDrill, exportHtmlOptions, toolbar, viewMode = "continuous", onExported, urlState = false, onReady, control, onEvent }) {
5171
+ function ReportViewer({ definition: rootDef, reportId: rootReportId, params: rootParams, title, compact = false, autoRun = true, lang: langIn = "en", onDrill, exportHtmlOptions, toolbar, viewMode = "continuous", onExported, urlState = false, onReady, control, onEvent, showWarnings = false }) {
5152
5172
  const lang = pickLang(langIn);
5153
5173
  const dir = dirOf(lang);
5154
5174
  const T = (k, v) => t(lang, k, v);
@@ -5172,6 +5192,7 @@ function ReportViewer({ definition: rootDef, reportId: rootReportId, params: roo
5172
5192
  onReady?.(error);
5173
5193
  }
5174
5194
  };
5195
+ const announce = useRef(null);
5175
5196
  const [note, setNote] = useState(null);
5176
5197
  const [zoom, setZoom] = useState(() => rootDef?.page?.size === "Pageless" ? "fit" : "page");
5177
5198
  const [current, setCurrent] = useState(1);
@@ -5243,8 +5264,7 @@ function ReportViewer({ definition: rootDef, reportId: rootReportId, params: roo
5243
5264
  setModel(m);
5244
5265
  const fonts = failed.length ? T("fontsDidNotLoad", { fonts: [...new Set(failed.map((f) => f.key))].join(", ") }) : null;
5245
5266
  setStatus({ state: "done", fonts });
5246
- ready(failed[0]?.error || null);
5247
- onEvent?.("ready", { pages: m.pages.length });
5267
+ announce.current = { error: failed[0]?.error || null, pages: m.pages.length };
5248
5268
  if (keepScroll) requestAnimationFrame(() => scroller.current?.scrollTo({ top }));
5249
5269
  else {
5250
5270
  setCurrent(1);
@@ -5635,6 +5655,13 @@ function ReportViewer({ definition: rootDef, reportId: rootReportId, params: roo
5635
5655
  useEffect(() => () => {
5636
5656
  if (control) control.current = null;
5637
5657
  }, [control]);
5658
+ useEffect(() => {
5659
+ const a = announce.current;
5660
+ if (!a) return;
5661
+ announce.current = null;
5662
+ ready(a.error);
5663
+ onEvent?.("ready", { pages: a.pages });
5664
+ });
5638
5665
  const lastEvent = useRef({ page: current, params: JSON.stringify(params) });
5639
5666
  useEffect(() => {
5640
5667
  if (lastEvent.current.page !== current) {
@@ -5772,7 +5799,7 @@ function ReportViewer({ definition: rootDef, reportId: rootReportId, params: roo
5772
5799
  {
5773
5800
  id: "exportOptions",
5774
5801
  group: "export",
5775
- node: /* @__PURE__ */ jsx3("span", { className: "vexp", children: /* @__PURE__ */ jsx3("button", { type: "button", className: "btn sm icon", "aria-label": T("exportOptions"), title: T("exportOptions"), "aria-expanded": xmenu, "aria-haspopup": "true", "data-testid": "export-options", onClick: () => setXmenu((v) => !v), children: /* @__PURE__ */ jsx3(Icon, { name: "gear" }) }) })
5802
+ node: /* @__PURE__ */ jsx3("span", { className: "vexp", children: /* @__PURE__ */ jsx3("button", { type: "button", className: "btn sm icon", "aria-label": T("exportOptions"), title: T("exportOptions"), "aria-expanded": xmenu, "aria-haspopup": "true", "data-testid": "export-options", onClick: () => setXmenu((v) => !v), children: /* @__PURE__ */ jsx3(Icon, { name: "sliders" }) }) })
5776
5803
  }
5777
5804
  ].filter(Boolean);
5778
5805
  const items = arrangeToolbar(builtIns, toolbar || {});
@@ -5999,7 +6026,7 @@ function ReportViewer({ definition: rootDef, reportId: rootReportId, params: roo
5999
6026
  h.text
6000
6027
  ] }, i))
6001
6028
  ] })),
6002
- /* @__PURE__ */ jsxs2("div", { className: "vpages", ref: scroller, role: "document", "aria-label": definition.name || T("ux_a11yReport"), onScroll, onClick, onTouchStart, onTouchEnd, children: [
6029
+ /* @__PURE__ */ jsxs2("div", { className: "vpages", ref: scroller, tabIndex: 0, role: "region", "aria-label": definition.name || T("ux_a11yReport"), onScroll, onClick, onTouchStart, onTouchEnd, children: [
6003
6030
  status.state === "error" && /* @__PURE__ */ jsxs2("div", { className: "vmsg error", role: "alert", children: [
6004
6031
  /* @__PURE__ */ jsx3("b", { children: T("didNotRun") }),
6005
6032
  /* @__PURE__ */ jsx3("br", {}),
@@ -6014,10 +6041,10 @@ function ReportViewer({ definition: rootDef, reportId: rootReportId, params: roo
6014
6041
  ] }),
6015
6042
  status.state === "running" && status.retry && /* @__PURE__ */ jsx3("div", { className: "vmsg", role: "status", "data-testid": "viewer-busy", children: T("r4_busyRetry", { n: status.retry.attempt, max: status.retry.max }) }),
6016
6043
  !model && status.state === "running" && !status.retry && /* @__PURE__ */ jsx3(Skeleton, { def: renderDef, scale: zoom === "fit" || narrow ? fitW / 600 : Math.min(fitW / 600, fitH / 850), T }),
6017
- model?.warnings?.length > 0 && // content cut off (past the page edge or bottom): the warnings open by themselves and the summary says so
6044
+ showWarnings && model?.warnings?.length > 0 && // content cut off (past the page edge or bottom): the warnings open by themselves and the summary says so
6018
6045
  /* @__PURE__ */ jsxs2("details", { className: "warnings", open: hasErrorCells || model.clipped?.length > 0 || void 0, "data-testid": "viewer-warnings", children: [
6019
6046
  /* @__PURE__ */ jsxs2("summary", { children: [
6020
- T("warnings", { n: model.warnings.length }),
6047
+ model.warnings.length === 1 ? T("c132_warning1") : T("c132_warnings", { n: model.warnings.length }),
6021
6048
  model.clipped?.length > 0 && /* @__PURE__ */ jsxs2("b", { "data-testid": "viewer-clipped", children: [
6022
6049
  " · ",
6023
6050
  T("r4_clipped", { n: model.clipped.length })
@@ -6066,4 +6093,4 @@ export {
6066
6093
  ReportViewer,
6067
6094
  uiFontCss
6068
6095
  };
6069
- //# sourceMappingURL=chunk-7IP67PA6.js.map
6096
+ //# sourceMappingURL=chunk-4AFSC6JI.js.map