@trismegisto/spine 3.3.2 → 3.3.4

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 (60) hide show
  1. package/README.md +15 -2
  2. package/fesm2022/trismegisto-spine-audit.mjs +6 -6
  3. package/fesm2022/trismegisto-spine-audit.mjs.map +1 -1
  4. package/fesm2022/{trismegisto-spine-auto-service-auto-service-client.component-BAfeLyTB.mjs → trismegisto-spine-auto-service-auto-service-client.component-kAXaCM5W.mjs} +8 -8
  5. package/fesm2022/{trismegisto-spine-auto-service-auto-service-client.component-BAfeLyTB.mjs.map → trismegisto-spine-auto-service-auto-service-client.component-kAXaCM5W.mjs.map} +1 -1
  6. package/fesm2022/{trismegisto-spine-auto-service-auto-service-groups.component-BYjIQ9ID.mjs → trismegisto-spine-auto-service-auto-service-groups.component-DE2QIGRH.mjs} +251 -85
  7. package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-DE2QIGRH.mjs.map +1 -0
  8. package/fesm2022/{trismegisto-spine-auto-service-auto-service-news-page.component-CBemH4hr.mjs → trismegisto-spine-auto-service-auto-service-news-page.component-BW7BJ0oD.mjs} +2 -2
  9. package/fesm2022/{trismegisto-spine-auto-service-auto-service-news-page.component-CBemH4hr.mjs.map → trismegisto-spine-auto-service-auto-service-news-page.component-BW7BJ0oD.mjs.map} +1 -1
  10. package/fesm2022/{trismegisto-spine-auto-service-auto-service-ratings-page.component-C_THGTkw.mjs → trismegisto-spine-auto-service-auto-service-ratings-page.component-CHPU-QLJ.mjs} +2 -2
  11. package/fesm2022/{trismegisto-spine-auto-service-auto-service-ratings-page.component-C_THGTkw.mjs.map → trismegisto-spine-auto-service-auto-service-ratings-page.component-CHPU-QLJ.mjs.map} +1 -1
  12. package/fesm2022/trismegisto-spine-auto-service-auto-service-suggestions-page.component-CkiCTmXD.mjs +3733 -0
  13. package/fesm2022/trismegisto-spine-auto-service-auto-service-suggestions-page.component-CkiCTmXD.mjs.map +1 -0
  14. package/fesm2022/{trismegisto-spine-auto-service-auto-service.component-QsIQ61w2.mjs → trismegisto-spine-auto-service-auto-service.component-D58Ht9PH.mjs} +7 -7
  15. package/fesm2022/{trismegisto-spine-auto-service-auto-service.component-QsIQ61w2.mjs.map → trismegisto-spine-auto-service-auto-service.component-D58Ht9PH.mjs.map} +1 -1
  16. package/fesm2022/{trismegisto-spine-auto-service-groups.technical-_jQrg1Qh.mjs → trismegisto-spine-auto-service-groups.technical-CB1D3ANC.mjs} +12 -3
  17. package/fesm2022/trismegisto-spine-auto-service-groups.technical-CB1D3ANC.mjs.map +1 -0
  18. package/fesm2022/{trismegisto-spine-auto-service-groups.usage-OvWjNeeT.mjs → trismegisto-spine-auto-service-groups.usage-De2MhlE7.mjs} +7 -2
  19. package/fesm2022/{trismegisto-spine-auto-service-groups.usage-OvWjNeeT.mjs.map → trismegisto-spine-auto-service-groups.usage-De2MhlE7.mjs.map} +1 -1
  20. package/fesm2022/{trismegisto-spine-auto-service-home.component-rQ3dIGIE.mjs → trismegisto-spine-auto-service-home.component-9WvXOH3l.mjs} +7 -4
  21. package/fesm2022/trismegisto-spine-auto-service-home.component-9WvXOH3l.mjs.map +1 -0
  22. package/fesm2022/{trismegisto-spine-auto-service-suggestions.technical-BtUK6sKD.mjs → trismegisto-spine-auto-service-suggestions.technical-CGBBzAR8.mjs} +14 -1
  23. package/fesm2022/{trismegisto-spine-auto-service-suggestions.technical-BtUK6sKD.mjs.map → trismegisto-spine-auto-service-suggestions.technical-CGBBzAR8.mjs.map} +1 -1
  24. package/fesm2022/{trismegisto-spine-auto-service-suggestions.usage-BwO9Hjsx.mjs → trismegisto-spine-auto-service-suggestions.usage-DnAJS-Z0.mjs} +26 -3
  25. package/fesm2022/trismegisto-spine-auto-service-suggestions.usage-DnAJS-Z0.mjs.map +1 -0
  26. package/fesm2022/trismegisto-spine-auto-service.mjs +25 -12
  27. package/fesm2022/trismegisto-spine-auto-service.mjs.map +1 -1
  28. package/fesm2022/trismegisto-spine-graphql.mjs +3 -1
  29. package/fesm2022/trismegisto-spine-graphql.mjs.map +1 -1
  30. package/fesm2022/trismegisto-spine-layout-suggestions-page.component-CEKMqera.mjs +532 -0
  31. package/fesm2022/trismegisto-spine-layout-suggestions-page.component-CEKMqera.mjs.map +1 -0
  32. package/fesm2022/trismegisto-spine-layout-trismegisto-spine-layout-DiAfxIGP.mjs +8764 -0
  33. package/fesm2022/trismegisto-spine-layout-trismegisto-spine-layout-DiAfxIGP.mjs.map +1 -0
  34. package/fesm2022/trismegisto-spine-layout.mjs +1 -7662
  35. package/fesm2022/trismegisto-spine-layout.mjs.map +1 -1
  36. package/fesm2022/trismegisto-spine-notification.mjs +1 -1
  37. package/fesm2022/trismegisto-spine-notification.mjs.map +1 -1
  38. package/fesm2022/trismegisto-spine-routing.mjs +16 -3
  39. package/fesm2022/trismegisto-spine-routing.mjs.map +1 -1
  40. package/fesm2022/trismegisto-spine-shell.mjs +4 -2
  41. package/fesm2022/trismegisto-spine-shell.mjs.map +1 -1
  42. package/fesm2022/trismegisto-spine-side-panel.mjs +1 -1
  43. package/fesm2022/trismegisto-spine-side-panel.mjs.map +1 -1
  44. package/fesm2022/trismegisto-spine.mjs +813 -38
  45. package/fesm2022/trismegisto-spine.mjs.map +1 -1
  46. package/package.json +6 -6
  47. package/types/trismegisto-spine-auto-service.d.ts +20 -4
  48. package/types/trismegisto-spine-auto-service.d.ts.map +1 -1
  49. package/types/trismegisto-spine-layout.d.ts +1200 -74
  50. package/types/trismegisto-spine-layout.d.ts.map +1 -1
  51. package/types/trismegisto-spine-routing.d.ts.map +1 -1
  52. package/types/trismegisto-spine-shell.d.ts.map +1 -1
  53. package/types/trismegisto-spine.d.ts +350 -14
  54. package/types/trismegisto-spine.d.ts.map +1 -1
  55. package/fesm2022/trismegisto-spine-auto-service-auto-service-groups.component-BYjIQ9ID.mjs.map +0 -1
  56. package/fesm2022/trismegisto-spine-auto-service-auto-service-suggestions-page.component-DIeunpQ9.mjs +0 -2123
  57. package/fesm2022/trismegisto-spine-auto-service-auto-service-suggestions-page.component-DIeunpQ9.mjs.map +0 -1
  58. package/fesm2022/trismegisto-spine-auto-service-groups.technical-_jQrg1Qh.mjs.map +0 -1
  59. package/fesm2022/trismegisto-spine-auto-service-home.component-rQ3dIGIE.mjs.map +0 -1
  60. package/fesm2022/trismegisto-spine-auto-service-suggestions.usage-BwO9Hjsx.mjs.map +0 -1
@@ -104,6 +104,31 @@ function mergeGroup(group) {
104
104
  };
105
105
  }
106
106
 
107
+ const pages = new Map();
108
+ /** Registra (ou troca) uma página do spine. Chamado no bootstrap, por quem liga o recurso (ex.: `provideShell`). */
109
+ function registerSpineBuiltinPage(page) {
110
+ if (page.route.route_redirect)
111
+ pages.set(page.route.route_redirect, page);
112
+ }
113
+ /** A página do spine no endereço (sem query/fragmento), ou null. */
114
+ function spineBuiltinPageAt(url) {
115
+ const path = (url.split(/[?#]/)[0] || '/').replace(/\/+$/, '') || '/';
116
+ return pages.get(path) ?? null;
117
+ }
118
+ /** A página do spine pelo `router_id` sintético (o que o distribuidor recebe), ou null. */
119
+ function spineBuiltinPageById(routerId) {
120
+ if (!routerId)
121
+ return null;
122
+ for (const page of pages.values())
123
+ if (page.route.router_id === routerId)
124
+ return page;
125
+ return null;
126
+ }
127
+ /** Só para testes: esquece as páginas registradas. */
128
+ function clearSpineBuiltinPages() {
129
+ pages.clear();
130
+ }
131
+
107
132
  /**
108
133
  * Ponto único de import dos componentes standalone do `@trismegisto/angular` usados nos templates do
109
134
  * spine. O DS novo é standalone-only (sem agregador), então este array cumpre o mesmo papel prático:
@@ -331,7 +356,7 @@ function applySpineFavicon(doc, href) {
331
356
  return link;
332
357
  }
333
358
 
334
- /** Os 115 ícones que o spine usa por dentro. */
359
+ /** Os 125 ícones que o spine usa por dentro. */
335
360
  const SPINE_ICONS = [
336
361
  { "name": "accessibility-1", "body": "<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><circle cx=\"12\" cy=\"7.6\" r=\"1.4\"/><path d=\"M7.5 10.5l4.5.8 4.5-.8M12 11.3v2.4M12 13.7l-2 3.6M12 13.7l2 3.6\"/>", "solid": true, "categories": ["essential"] },
337
362
  { "name": "alarm-clock", "body": "<circle cx=\"12\" cy=\"13\" r=\"7\"/><path d=\"M12 9.5v3.8l2.2 1.5M4 6.5l3-2.5M20 6.5l-3-2.5\"/>", "solid": true, "categories": ["essential"] },
@@ -341,6 +366,7 @@ const SPINE_ICONS = [
341
366
  { "name": "applications", "body": "<rect x=\"4\" y=\"4\" width=\"6.5\" height=\"6.5\" rx=\"1.5\"/><rect x=\"13.5\" y=\"4\" width=\"6.5\" height=\"6.5\" rx=\"1.5\"/><rect x=\"4\" y=\"13.5\" width=\"6.5\" height=\"6.5\" rx=\"1.5\"/><rect x=\"13.5\" y=\"13.5\" width=\"6.5\" height=\"6.5\" rx=\"1.5\"/>", "solid": true, "categories": ["technology"] },
342
367
  { "name": "archive", "body": "<rect x=\"3.5\" y=\"4.5\" width=\"17\" height=\"4.5\" rx=\"1.5\"/><path d=\"M5 9v9a2 2 0 0 0 2 2h10a2 2 0 0 0 2-2V9M10 13h4\"/>", "solid": true, "categories": ["technology"] },
343
368
  { "name": "arrow", "body": "<path d=\"M12 19V5M8.1 8.9L12 5l3.9 3.9\"/>", "categories": ["foundation"], "aliases": ["arrow-mini"] },
369
+ { "name": "arrow-send", "body": "<path d=\"M21 3L10.5 13.5M21 3l-6.5 18-4-7.5L3 9.5z\"/>" },
344
370
  { "name": "assign-user", "body": "<circle cx=\"9.5\" cy=\"8\" r=\"3.5\"/><path d=\"M3 20c.7-3.4 3.2-5.5 6.5-5.5 1.7 0 3 .5 4 1.2\"/><path d=\"M14.5 17.5h6M17.5 14.5l3 3-3 3\"/>", "solid": true, "categories": ["technology"] },
345
371
  { "name": "authenticator", "body": "<rect x=\"7\" y=\"2.5\" width=\"10\" height=\"19\" rx=\"2.5\"/><path d=\"M10.5 18.5h3\"/><path d=\"M9.8 10.5l1.8 1.8 3-3.3\"/>" },
346
372
  { "name": "ballon-question", "body": "<path d=\"M5.5 4.5h13A2.5 2.5 0 0 1 21 7v8a2.5 2.5 0 0 1-2.5 2.5H12L7.5 21v-3.5h-2A2.5 2.5 0 0 1 3 15V7a2.5 2.5 0 0 1 2.5-2.5z\"/><path d=\"M10 9a2 2 0 1 1 3 1.7c-.7.4-1 .8-1 1.5\"/><path d=\"M12 14.8h.01\"/>" },
@@ -353,6 +379,8 @@ const SPINE_ICONS = [
353
379
  { "name": "bug", "body": "<ellipse cx=\"12\" cy=\"13.5\" rx=\"4.5\" ry=\"6\"/><path d=\"M9.5 7.5a2.5 2.5 0 0 1 5 0M12 7.5v12M7.5 11H4M16.5 11H20M7.5 16H4.5M16.5 16h3M8 8L5.5 5.5M16 8l2.5-2.5\"/>", "solid": true, "categories": ["essential"] },
354
380
  { "name": "calendar", "body": "<rect x=\"4\" y=\"5.5\" width=\"16\" height=\"14\" rx=\"2.5\"/><path d=\"M4 10h16M8.5 3.5v4M15.5 3.5v4\"/>", "solid": true, "categories": ["foundation", "social"], "aliases": ["calendar-mini"] },
355
381
  { "name": "calendar-check", "body": "<rect x=\"4\" y=\"5.5\" width=\"16\" height=\"14\" rx=\"2.5\"/><path d=\"M4 10h16M8.5 3.5v4M15.5 3.5v4\"/><path d=\"M8.8 14.8l2.2 2.2 4.2-4.2\"/>" },
382
+ { "name": "calendar-days", "body": "<rect x=\"4\" y=\"5.5\" width=\"16\" height=\"14\" rx=\"2.5\"/><path d=\"M4 10h16M8.5 3.5v4M15.5 3.5v4\"/><path d=\"M8 14h.01M12 14h.01M16 14h.01M8 17h.01M12 17h.01\"/>" },
383
+ { "name": "chat-bubble", "body": "<path d=\"M12 4.5c4.7 0 8.5 3 8.5 7s-3.8 7-8.5 7c-1 0-1.9-.1-2.8-.4L5 20l1.2-3.6C4.6 15.3 3.5 13.7 3.5 11.5c0-4 3.8-7 8.5-7z\"/>", "solid": true, "categories": ["social"] },
356
384
  { "name": "check", "body": "<path d=\"M5 12.5l4.5 4.5L19 7.5\"/>", "categories": ["foundation"], "aliases": ["check-mini"] },
357
385
  { "name": "check-circle", "body": "<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><path d=\"M8 12.3l2.8 2.8 5.2-5.6\"/>", "solid": true, "categories": ["foundation"], "aliases": ["check-circle-mini"] },
358
386
  { "name": "circle", "body": "<circle cx=\"12\" cy=\"12\" r=\"8.5\"/>", "solid": true, "categories": ["essential"] },
@@ -365,8 +393,10 @@ const SPINE_ICONS = [
365
393
  { "name": "comment-message", "body": "<path d=\"M5.5 4.5h13A2.5 2.5 0 0 1 21 7v8a2.5 2.5 0 0 1-2.5 2.5H12L7.5 21v-3.5h-2A2.5 2.5 0 0 1 3 15V7a2.5 2.5 0 0 1 2.5-2.5z\"/><path d=\"M8 9.5h8M8 12.5h5\"/>" },
366
394
  { "name": "computer", "body": "<rect x=\"3\" y=\"5\" width=\"12\" height=\"9\" rx=\"1.5\"/><path d=\"M7 18h4M9 14v4\"/><rect x=\"17\" y=\"4.5\" width=\"4\" height=\"15\" rx=\"1.5\"/><path d=\"M19 16.5h.01\"/>", "solid": true, "categories": ["technology"] },
367
395
  { "name": "copy", "body": "<rect x=\"9\" y=\"7\" width=\"11\" height=\"13.5\" rx=\"2\"/><path d=\"M12 12h5M12 15.5h5M15 7V5.5a2 2 0 0 0-2-2H6.5a2 2 0 0 0-2 2V16a2 2 0 0 0 2 2H9\"/>", "solid": true, "categories": ["essential"] },
396
+ { "name": "dashboard", "body": "<rect x=\"3.5\" y=\"3.5\" width=\"7\" height=\"9\" rx=\"1.5\"/><rect x=\"13.5\" y=\"3.5\" width=\"7\" height=\"5\" rx=\"1.5\"/><rect x=\"3.5\" y=\"15.5\" width=\"7\" height=\"5\" rx=\"1.5\"/><rect x=\"13.5\" y=\"11.5\" width=\"7\" height=\"9\" rx=\"1.5\"/>", "solid": true, "categories": ["technology"] },
368
397
  { "name": "density-comfortable", "body": "<path d=\"M12 10V3.5M8.5 7L12 3.5 15.5 7M12 14v6.5M8.5 17l3.5 3.5 3.5-3.5\"/>", "categories": ["foundation"], "aliases": ["density-expand", "spacing-comfortable"] },
369
398
  { "name": "density-compact", "body": "<path d=\"M12 3v6.5M8.5 6l3.5 3.5L15.5 6M12 21v-6.5M8.5 18l3.5-3.5 3.5 3.5M6 12h12\"/>", "categories": ["foundation"], "aliases": ["density-collapse", "spacing-compact"] },
399
+ { "name": "details", "body": "<path d=\"M5 7h.01\"/><path d=\"M5 12h.01\"/><path d=\"M5 17h.01\"/><path d=\"M9 7H20M9 12H20M9 17H20\"/>", "solid": true, "categories": ["essential"] },
370
400
  { "name": "devices", "body": "<rect x=\"3\" y=\"5\" width=\"13\" height=\"9.5\" rx=\"1.5\"/><path d=\"M7 18.5h5M9.5 14.5v4\"/><rect x=\"17.5\" y=\"9\" width=\"3.5\" height=\"9\" rx=\"1.2\"/>", "solid": true, "categories": ["technology"] },
371
401
  { "name": "doc-list", "body": "<path d=\"M7.5 3.5h6l4.5 4.5v11.5a1.5 1.5 0 0 1-1.5 1.5h-9A1.5 1.5 0 0 1 6 19.5v-14A1.5 1.5 0 0 1 7.5 3.5z\"/><path d=\"M13.5 3.5V8H18\"/><path d=\"M9.5 12.5h.01\"/><path d=\"M9.5 15.5h.01\"/><path d=\"M9.5 18.5h.01\"/><path d=\"M12.5 12.5H15M12.5 15.5H15M12.5 18.5H15\"/>" },
372
402
  { "name": "download", "body": "<path d=\"M12 4v11M7.5 10.5l4.5 4.5 4.5-4.5M5 16v3.5h14V16\"/>", "categories": ["essential"] },
@@ -399,6 +429,7 @@ const SPINE_ICONS = [
399
429
  { "name": "link", "body": "<g transform=\"rotate(-45 12 12)\"><path d=\"M9 8.5H7a3.5 3.5 0 0 0 0 7h2\"/><path d=\"M15 8.5h2a3.5 3.5 0 0 1 0 7h-2\"/><path d=\"M9.5 12h5\"/></g>", "categories": ["technology"] },
400
430
  { "name": "list", "body": "<path d=\"M4 6h16M4 12h16M4 18h10\"/>", "solid": true, "categories": ["essential"] },
401
431
  { "name": "list-check", "body": "<path d=\"M11 6h9M11 12h9M11 18h9\"/><path d=\"M3.5 6.2l1.4 1.4 2.8-3M3.5 12.2l1.4 1.4 2.8-3M3.5 18.2l1.4 1.4 2.8-3\"/>" },
432
+ { "name": "lock-close", "body": "<rect x=\"6\" y=\"10.5\" width=\"12\" height=\"9.5\" rx=\"2.5\"/><path d=\"M8.5 10.5V7.5a3.5 3.5 0 0 1 7 0v3\"/><circle cx=\"12\" cy=\"14.2\" r=\"1.4\"/><path d=\"M12 15.6v1.8\"/>", "categories": ["essential"] },
402
433
  { "name": "login", "body": "<path d=\"M14 4.5h4a2 2 0 0 1 2 2v11a2 2 0 0 1-2 2h-4\"/><path d=\"M3.5 12L14 12M10.82 15.18L14 12L10.82 8.82\"/>", "solid": true, "categories": ["essential"] },
403
434
  { "name": "logout", "body": "<path d=\"M10 4.5H6a2 2 0 0 0-2 2v11a2 2 0 0 0 2 2h4\"/><path d=\"M10 12L20.5 12M17.32 15.18L20.5 12L17.32 8.82\"/>", "solid": true, "categories": ["essential"] },
404
435
  { "name": "magnifying-glass", "body": "<circle cx=\"9.5\" cy=\"9.5\" r=\"5.5\"/><path d=\"M13.8 13.8L20 20\"/><path d=\"M6.8 9a2.8 2.8 0 0 1 2.7-2.7\"/>" },
@@ -409,8 +440,10 @@ const SPINE_ICONS = [
409
440
  { "name": "moon", "body": "<path d=\"M19.5 14.5A8 8 0 1 1 9.5 4.5a6.5 6.5 0 0 0 10 10z\"/>", "solid": true, "categories": ["essential"] },
410
441
  { "name": "new", "body": "<path d=\"M12 3.5c.5 4.5 2.5 6.5 8 8.5-5.5 2-7.5 4-8 8.5-.5-4.5-2.5-6.5-8-8.5 5.5-2 7.5-4 8-8.5z\"/>", "solid": true, "categories": ["essential"] },
411
442
  { "name": "node", "body": "<polygon points=\"12 3.5 19.36 7.75 19.36 16.25 12 20.5 4.64 16.25 4.64 7.75\"/><circle cx=\"12\" cy=\"12\" r=\"2.5\"/>", "categories": ["technology"] },
443
+ { "name": "nodes", "body": "<circle cx=\"12\" cy=\"5\" r=\"2\"/><circle cx=\"5.5\" cy=\"19\" r=\"2\"/><circle cx=\"18.5\" cy=\"19\" r=\"2\"/><path d=\"M11 6.8L6.5 17.2M13 6.8l4.5 10.4M7.5 19h9\"/>", "categories": ["technology"] },
412
444
  { "name": "note", "body": "<path d=\"M5 4.5h14v10l-5 5H5z\"/><path d=\"M19 14.5h-5v5\"/><path d=\"M8 9h8M8 12.5h5\"/>", "solid": true, "categories": ["essential"] },
413
445
  { "name": "pencil", "body": "<path d=\"M4.5 19.5l.8-4.3L16 4.5a2 2 0 0 1 2.8 0l.7.7a2 2 0 0 1 0 2.8L8.8 18.7z\"/><path d=\"M13.5 7l3.5 3.5\"/>", "solid": true, "categories": ["essential"] },
446
+ { "name": "play", "body": "<polygon points=\"8 5.5 18.5 12 8 18.5\"/>", "solid": true, "categories": ["media"] },
414
447
  { "name": "plugin", "body": "<path d=\"M6.5 8h11v3a5.5 5.5 0 0 1-11 0z\"/><path d=\"M9.5 3.5V8M14.5 3.5V8\"/><path d=\"M12 16.5v4\"/>", "solid": true, "categories": ["technology"] },
415
448
  { "name": "plus", "body": "<path d=\"M12 5v14M5 12h14\"/>", "categories": ["essential"] },
416
449
  { "name": "pop-out", "body": "<path d=\"M10 5H6a2 2 0 0 0-2 2v11a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2v-4\"/><path d=\"M14 4h6v6M20 4l-9 9\"/>", "categories": ["essential"] },
@@ -427,8 +460,10 @@ const SPINE_ICONS = [
427
460
  { "name": "sort-vertical", "body": "<path d=\"M12 4v16M8.500 7.500L12 4l3.500 3.500M8.500 16.500L12 20l3.500-3.500\"/>", "categories": ["foundation"] },
428
461
  { "name": "star", "body": "<polygon points=\"12 3.5 14.3 8.84 20.08 9.37 15.72 13.21 17 18.88 12 15.91 7 18.88 8.28 13.21 3.92 9.37 9.7 8.84\"/>", "solid": true, "categories": ["social"], "aliases": ["star-fill", "empty-star", "full-star"] },
429
462
  { "name": "sun", "body": "<circle cx=\"12\" cy=\"12\" r=\"4\"/><path d=\"M19.00 12.00L21.00 12.00M16.95 16.95L18.36 18.36M12.00 19.00L12.00 21.00M7.05 16.95L5.64 18.36M5.00 12.00L3.00 12.00M7.05 7.05L5.64 5.64M12.00 5.00L12.00 3.00M16.95 7.05L18.36 5.64\"/>", "solid": true, "categories": ["essential"] },
463
+ { "name": "table", "body": "<rect x=\"3.5\" y=\"5\" width=\"17\" height=\"14\" rx=\"2.5\"/><path d=\"M3.500 10h17M3.500 14.500h17M10 10v9\"/>", "categories": ["essential"] },
430
464
  { "name": "tag", "body": "<path d=\"M3.5 12.5V5.5a2 2 0 0 1 2-2h7l8 8a2 2 0 0 1 0 2.8l-6.2 6.2a2 2 0 0 1-2.8 0z\"/><path d=\"M8 8h.01\"/>", "solid": true, "categories": ["essential"] },
431
465
  { "name": "target", "body": "<circle cx=\"12\" cy=\"12\" r=\"8.5\"/><circle cx=\"12\" cy=\"12\" r=\"4.5\"/><path d=\"M12 12h.01\"/>", "solid": true, "categories": ["essential"] },
466
+ { "name": "tasks", "body": "<path d=\"M4 6.500l1.500 1.500L8 5.500M4 12.500L5.500 14 8 11.500M4 18.500L5.500 20 8 17.500M11 7h9M11 13h9M11 19h9\"/>", "solid": true, "categories": ["social"] },
432
467
  { "name": "text", "body": "<path d=\"M5 6.5V4.5h14v2M12 4.5v15M9.5 19.5h5\"/>", "categories": ["text-edit"] },
433
468
  { "name": "thumbs-up", "body": "<rect x=\"4\" y=\"11\" width=\"4\" height=\"9\" rx=\"1\"/><path d=\"M8 11l3-6.5a2 2 0 0 1 3 1.8L13.5 10H18a2 2 0 0 1 2 2.3l-1 5.7a2 2 0 0 1-2 1.7H8z\"/>", "solid": true, "categories": ["social"] },
434
469
  { "name": "timeline", "body": "<circle cx=\"5.5\" cy=\"12\" r=\"2.2\"/><circle cx=\"12\" cy=\"12\" r=\"2.2\"/><circle cx=\"18.5\" cy=\"12\" r=\"2.2\"/><path d=\"M7.7 12h2.1M14.2 12h2.1M12 9.8V5M5.5 14.2V19M18.5 14.2V19\"/>", "categories": ["essential"] },
@@ -504,6 +539,7 @@ const IDLE_SUFFIX = 'idle_minutes';
504
539
  const START_PAGE_SUFFIX = 'start_page';
505
540
  const NOTICES_SUFFIX = 'notices';
506
541
  const BROWSER_NOTICES_SUFFIX = 'browser_notices';
542
+ const SPLIT_TABS_SUFFIX = 'split_tabs';
507
543
  /** Minutos de inatividade oferecidos em "Encerrar por inatividade" (0 = nunca). */
508
544
  const SPINE_IDLE_OPTIONS = [0, 5, 15, 30, 60];
509
545
  const CHANNEL_BASE = 'spine_preferences';
@@ -514,6 +550,8 @@ const CHANNEL_BASE = 'spine_preferences';
514
550
  * (`HermesZoomService.setTextScale`), movimento (`HermesMotionService.setPreference`) e o interruptor dos
515
551
  * atalhos de tecla única (WCAG 2.1.4) do `HermesShortcutService`.
516
552
  *
553
+ * Guarda ainda se a área de abas pode ser dividida em painéis (`splitTabs`, desligado por padrão).
554
+ *
517
555
  * Também guarda as preferências dos recursos opcionais (`SpineFeatures`): minutos de inatividade, tela inicial,
518
556
  * tipos de aviso ligados e o aviso do navegador.
519
557
  *
@@ -567,6 +605,7 @@ class SpinePreferencesService {
567
605
  this.startPageKey = `${this.ns ? `hermes_${this.ns}` : 'hermes'}_${START_PAGE_SUFFIX}`;
568
606
  this.noticesKey = `${this.ns ? `hermes_${this.ns}` : 'hermes'}_${NOTICES_SUFFIX}`;
569
607
  this.browserNoticesKey = `${this.ns ? `hermes_${this.ns}` : 'hermes'}_${BROWSER_NOTICES_SUFFIX}`;
608
+ this.splitTabsKey = `${this.ns ? `hermes_${this.ns}` : 'hermes'}_${SPLIT_TABS_SUFFIX}`;
570
609
  /** Encerrar a sessão depois de tantos minutos sem uso (0 = nunca). Os limites do app (`SpineFeatures.idleTimeout`)
571
610
  * são aplicados por quem usa o valor (`SpineIdleService`), não aqui. */
572
611
  this.idleMinutes = signal(toIdleMinutes(this.read(this.idleKey)), ...(ngDevMode ? [{ debugName: "idleMinutes" }] : /* istanbul ignore next */ []));
@@ -576,6 +615,8 @@ class SpinePreferencesService {
576
615
  this.noticeTypes = signal(toNoticeTypes(this.read(this.noticesKey)), ...(ngDevMode ? [{ debugName: "noticeTypes" }] : /* istanbul ignore next */ []));
577
616
  /** Aviso do navegador (Notification API) quando a aba está em segundo plano. */
578
617
  this.browserNotices = signal(this.read(this.browserNoticesKey) === 'on', ...(ngDevMode ? [{ debugName: "browserNotices" }] : /* istanbul ignore next */ []));
618
+ /** Dividir a área de abas em painéis (lado a lado ou empilhados). Padrão: desligado, um painel só. */
619
+ this.splitTabs = signal(this.read(this.splitTabsKey) === 'on', ...(ngDevMode ? [{ debugName: "splitTabs" }] : /* istanbul ignore next */ []));
579
620
  /** Idiomas oferecidos na configuração, cada um com o nome no próprio idioma (padrão de mercado). */
580
621
  this.languages = [
581
622
  // check-strings: off — cada idioma escrito no próprio idioma (padrão de mercado), igual em todo catálogo.
@@ -608,6 +649,8 @@ class SpinePreferencesService {
608
649
  this.noticeTypes.set(toNoticeTypes(JSON.stringify(e.data.value ?? {})));
609
650
  if (e.data?.type === 'BROWSER_NOTICES_CHANGED')
610
651
  this.browserNotices.set(e.data.value === true);
652
+ if (e.data?.type === 'SPLIT_TABS_CHANGED')
653
+ this.splitTabs.set(e.data.value === true);
611
654
  });
612
655
  }
613
656
  // Escolha salva vale desde a primeira tela (o layout injeta este serviço no boot).
@@ -729,6 +772,12 @@ class SpinePreferencesService {
729
772
  this.write(this.browserNoticesKey, enabled ? 'on' : '');
730
773
  this.channel?.postMessage({ type: 'BROWSER_NOTICES_CHANGED', value: enabled });
731
774
  }
775
+ /** Liga/desliga a divisão da área de abas em painéis, guarda e avisa as outras abas. */
776
+ setSplitTabs(enabled) {
777
+ this.splitTabs.set(enabled);
778
+ this.write(this.splitTabsKey, enabled ? 'on' : '');
779
+ this.channel?.postMessage({ type: 'SPLIT_TABS_CHANGED', value: enabled });
780
+ }
732
781
  setTimeZone(value) {
733
782
  this.timeZone.set(value);
734
783
  this.write(this.timeZoneKey, value);
@@ -1153,6 +1202,14 @@ function applyRuntimeEnvironment(environment) {
1153
1202
 
1154
1203
  const SPINE_MESSAGES_PT_BR = {
1155
1204
  meta: { locale: 'pt-BR' },
1205
+ inbox: {
1206
+ title: 'Notificações',
1207
+ button: { zero: 'Notificações', one: 'Notificações, {count} nova', other: 'Notificações, {count} novas' },
1208
+ empty: 'Nada novo por aqui.',
1209
+ error: 'Não foi possível carregar as notificações.',
1210
+ retry: 'Tentar de novo',
1211
+ news: { one: '{count} novidade', other: '{count} novidades' },
1212
+ },
1156
1213
  header: {
1157
1214
  home: 'Início',
1158
1215
  apps: 'Aplicações',
@@ -1189,6 +1246,7 @@ const SPINE_MESSAGES_PT_BR = {
1189
1246
  modules: 'Módulos',
1190
1247
  moduleNavigation: 'Navegação de {module}',
1191
1248
  apps: 'Aplicações',
1249
+ openInNewTab: 'Abrir em nova aba',
1192
1250
  },
1193
1251
  pageBar: {
1194
1252
  favorite: 'Favoritar esta página',
@@ -1360,6 +1418,7 @@ const SPINE_MESSAGES_PT_BR = {
1360
1418
  goFavorite: 'Ir para o favorito nº 1 a 9',
1361
1419
  history: 'Voltar / avançar no histórico',
1362
1420
  openSettings: 'Abrir as configurações',
1421
+ toggleSidebar: 'Abrir / recolher o menu lateral',
1363
1422
  toggleTheme: 'Alternar tema claro / escuro',
1364
1423
  fullscreen: 'Tela cheia',
1365
1424
  logout: 'Sair (logout)',
@@ -1391,6 +1450,9 @@ const SPINE_MESSAGES_PT_BR = {
1391
1450
  sidebarDescription: 'Como o menu lateral abre e fecha.',
1392
1451
  sidebarKeywords: 'sidebar navegação barra lateral',
1393
1452
  sidebarHelp: 'Automático: abre ao aproximar o ponteiro. Fixo: fica sempre aberto. Compacto: mostra só os ícones.',
1453
+ splitTabs: 'Dividir abas',
1454
+ splitTabsDescription: 'Abrir painéis lado a lado ou um abaixo do outro, cada um com suas abas. Desligado, as abas abertas ficam num painel só.',
1455
+ splitTabsKeywords: 'dividir tela painéis lado a lado abas comparar split',
1394
1456
  sidebarAuto: 'Automático',
1395
1457
  sidebarFixed: 'Fixo',
1396
1458
  sidebarCompact: 'Compacto',
@@ -1461,7 +1523,7 @@ const SPINE_MESSAGES_PT_BR = {
1461
1523
  favoritesCleared: 'Favoritos apagados.',
1462
1524
  restorePreferences: 'Preferências',
1463
1525
  restorePreferencesDescription: 'Aparência, acessibilidade e formatos voltam ao padrão.',
1464
- restorePreferencesHelp: 'Voltam ao padrão: tema, cor principal, densidade, fonte, menu lateral, tamanho do texto, animações, formato de hora e primeiro dia da semana. Idioma, fuso horário e atalhos de tecla única ficam como estão.',
1526
+ restorePreferencesHelp: 'Voltam ao padrão: tema, cor principal, densidade, fonte, menu lateral, dividir abas, tamanho do texto, animações, formato de hora e primeiro dia da semana. Idioma, fuso horário e atalhos de tecla única ficam como estão.',
1465
1527
  restorePreferencesKeywords: 'restaurar padrão redefinir reset preferências',
1466
1528
  restore: 'Restaurar padrão',
1467
1529
  confirmRestore: 'Confirmar',
@@ -1599,7 +1661,14 @@ const SPINE_MESSAGES_PT_BR = {
1599
1661
  back: 'Voltar aos grupos',
1600
1662
  you: 'você',
1601
1663
  membersCount: { zero: 'Nenhum membro', one: '{count} membro', other: '{count} membros' },
1664
+ matchesCount: { zero: 'Nenhum membro encontrado', one: '{count} membro encontrado', other: '{count} membros encontrados' },
1602
1665
  empty: 'Nenhum membro neste grupo.',
1666
+ noMatches: 'Nenhum membro encontrado para essa busca.',
1667
+ filterMembers: 'Buscar membro',
1668
+ loadingProgress: 'Carregando membros… {loaded} de {total}',
1669
+ partialResults: 'A lista ainda está carregando: o resultado pode crescer.',
1670
+ loadIncomplete: 'Não foi possível carregar todos os membros ({loaded} de {total}).',
1671
+ retry: 'Tentar de novo',
1603
1672
  readOnly: 'Como membro, você só vê quem está no grupo.',
1604
1673
  addMember: 'Incluir membro',
1605
1674
  addHeading: 'Incluir em {group}',
@@ -1951,6 +2020,10 @@ const SPINE_MESSAGES_PT_BR = {
1951
2020
  memberSearch: 'Buscar membro...',
1952
2021
  membersOf: 'Membros do grupo {group}',
1953
2022
  noMembersShort: 'Nenhum membro.',
2023
+ noMembersMatch: 'Nenhum membro encontrado para essa busca.',
2024
+ membersLoadingProgress: 'Carregando membros… {loaded} de {total}',
2025
+ membersPartialResults: 'A lista e a busca ainda podem crescer.',
2026
+ membersLoadIncomplete: 'Não foi possível carregar todos os membros ({loaded} de {total}).',
1954
2027
  newMember: 'Novo',
1955
2028
  addedBy: 'por {user}',
1956
2029
  removal: 'Remoção',
@@ -2520,8 +2593,6 @@ const SPINE_MESSAGES_PT_BR = {
2520
2593
  kindFilter: 'Tipo',
2521
2594
  allKinds: 'Todos os tipos',
2522
2595
  refresh: 'Atualizar',
2523
- boardEmpty: 'Nenhuma sugestão ainda',
2524
- boardEmptyHint: 'Os pedidos feitos pelo botão "Sugerir melhoria" das telas aparecem aqui.',
2525
2596
  boardFiltered: '{shown} de {total} sugestões',
2526
2597
  loadError: 'Não foi possível carregar as sugestões.',
2527
2598
  moveError: 'Não foi possível mover a sugestão. O quadro foi recarregado.',
@@ -2539,7 +2610,7 @@ const SPINE_MESSAGES_PT_BR = {
2539
2610
  eventComment: '{actor} comentou',
2540
2611
  someone: 'Alguém',
2541
2612
  comment: 'Comentário para quem pediu',
2542
- commentHint: 'A pessoa vê em "Minhas sugestões".',
2613
+ commentHint: 'Quem pediu vê na página "Sugestões do app".',
2543
2614
  commentSend: 'Comentar',
2544
2615
  commentSent: 'Comentário enviado.',
2545
2616
  commentError: 'Não foi possível enviar o comentário.',
@@ -2641,16 +2712,10 @@ const SPINE_MESSAGES_PT_BR = {
2641
2712
  menuLabel: 'Rótulos',
2642
2713
  menuNoLabels: 'Nenhum rótulo no app',
2643
2714
  menuPriority: 'Prioridade',
2644
- menuCover: 'Selecionar capa',
2645
2715
  menuArchive: 'Arquivar',
2646
2716
  menuRestore: 'Restaurar no quadro',
2647
2717
  menuDelete: 'Excluir',
2648
- cover: 'Capa',
2649
- coverSolid: 'Cores',
2650
- coverGradient: 'Gradientes',
2651
- coverRemove: 'Remover capa',
2652
- coverName: 'Cor {n}',
2653
- gradientName: 'Gradiente {n}',
2718
+ labelColorName: 'Cor {n}',
2654
2719
  linkCopied: 'Link copiado.',
2655
2720
  keyCopied: 'Chave copiada.',
2656
2721
  copyError: 'Não foi possível copiar.',
@@ -2676,7 +2741,7 @@ const SPINE_MESSAGES_PT_BR = {
2676
2741
  checklistUp: 'Subir "{text}"',
2677
2742
  checklistDown: 'Descer "{text}"',
2678
2743
  tabComments: 'Comentários',
2679
- tabActivity: 'Atividades',
2744
+ tabActivity: 'Histórico',
2680
2745
  commentsEmpty: 'Sem comentários ainda.',
2681
2746
  activityEmpty: 'Sem atividades ainda.',
2682
2747
  commentInternal: 'Só para a equipe (interno: quem pediu não vê)',
@@ -2792,11 +2857,245 @@ const SPINE_MESSAGES_PT_BR = {
2792
2857
  mergedHere: 'Agrupadas aqui',
2793
2858
  mergedFrom: '{key} agrupada em {target}',
2794
2859
  mergedFromHint: 'Pedidos iguais viraram um só: você acompanha por esta.',
2860
+ buttonMenu: 'Sugestões',
2861
+ openPage: 'Ver sugestões do app',
2862
+ screenPick: 'Tela',
2863
+ screenPickHint: 'A tela que deve mudar. Se ela ainda não existe, escolha "Nova tela".',
2864
+ screenPickPlaceholder: 'Busque pelo nome da tela',
2865
+ newScreenOption: 'Nova tela (ainda não existe)',
2866
+ newScreenName: 'Nome da nova tela',
2867
+ newScreenHint: 'Como você chamaria a tela e em que parte do menu ela ficaria.',
2868
+ newScreenRequired: 'Diga o nome da nova tela.',
2869
+ newScreenTag: 'Nova tela',
2870
+ waiting: { solicitante: 'Aguardando solicitante', responsaveis: 'Aguardando responsáveis' },
2871
+ waitingFilter: 'Aguardando',
2872
+ waitingAny: 'Qualquer situação',
2873
+ waitingClear: 'Ninguém (conversa em dia)',
2874
+ waitingSaved: 'Situação da conversa atualizada.',
2875
+ menuWaiting: 'Aguardando',
2876
+ groupFilter: 'Grupo',
2877
+ allGroups: 'Todos os grupos',
2878
+ requestingGroups: 'Grupos solicitantes',
2879
+ noGroups: 'Sem grupo (criada pela equipe)',
2880
+ unread: { zero: 'nenhuma nova', one: '{count} nova', other: '{count} novas' },
2881
+ fromRequester: 'Solicitante',
2882
+ cardChecklist: { one: '{count} atividade ({done}/{count})', other: '{count} atividades ({done}/{count})' },
2883
+ requestedByName: 'Pedida por {name}',
2884
+ tabSummary: 'Resumo',
2885
+ chatAuthor: '{name} ({role})',
2886
+ chatSendHint: 'Enter envia; Shift+Enter quebra a linha.',
2887
+ inbox: {
2888
+ label: 'Sugestões',
2889
+ comment: '{name}: {comment}',
2890
+ status: '{name} mudou o status para {status}',
2891
+ },
2892
+ page: {
2893
+ title: 'Sugestões do app',
2894
+ allTitle: 'Todas as sugestões',
2895
+ statusPart: '{count} {status}',
2896
+ description: 'Acompanhe o que você pediu, o que seu grupo pediu e as sugestões em que você está envolvido, e converse com os responsáveis.',
2897
+ reasons: { autor: 'Minhas', relator: 'Agrupadas', envolvido: 'Envolvido', responsavel: 'Responsável', grupo: 'Do meu grupo' },
2898
+ reasonHints: {
2899
+ autor: 'Você pediu esta sugestão.',
2900
+ relator: 'Um pedido seu foi agrupado nesta sugestão.',
2901
+ envolvido: 'A equipe incluiu você como envolvido.',
2902
+ responsavel: 'Você é responsável por esta sugestão.',
2903
+ grupo: 'Alguém do seu grupo pediu esta sugestão.',
2904
+ },
2905
+ reasonFilter: 'Por que vejo',
2906
+ allReasons: 'Todas',
2907
+ needsYou: 'Precisam da sua resposta',
2908
+ sorts: { activity: 'Atividade recente', recent: 'Mais novas', votes: 'Mais apoiadas' },
2909
+ empty: 'Nenhuma sugestão por aqui ainda.',
2910
+ emptyHint: 'Peça uma melhoria em "Sugerir melhoria": ela aparece aqui com a conversa.',
2911
+ emptyFiltered: 'Nenhuma sugestão com esses filtros.',
2912
+ error: 'Não foi possível carregar as sugestões.',
2913
+ count: { one: '{count} sugestão', other: '{count} sugestões' },
2914
+ pickOne: 'Escolha uma sugestão para ver os detalhes e a conversa.',
2915
+ notFound: 'Sugestão não encontrada, ou você não tem acesso a ela.',
2916
+ conversation: 'Conversa',
2917
+ conversationEmpty: 'Ninguém escreveu ainda.',
2918
+ conversationError: 'Não foi possível carregar a conversa.',
2919
+ olderMessages: 'Mensagens anteriores',
2920
+ reply: 'Sua mensagem',
2921
+ replyPlaceholder: 'Responda aos responsáveis, dê mais detalhes…',
2922
+ replySend: 'Enviar',
2923
+ replyError: 'Não foi possível enviar a mensagem.',
2924
+ readOnly: 'Você acompanha esta sugestão pelo seu grupo: dá para apoiar, mas a conversa é só de quem pediu, dos envolvidos e dos responsáveis.',
2925
+ team: 'Equipe',
2926
+ you: 'Você',
2927
+ groups: 'Grupos',
2928
+ details: 'Detalhes',
2929
+ listLabel: 'Sugestões',
2930
+ filtersLabel: 'Filtros',
2931
+ waitingYou: 'Os responsáveis aguardam a sua resposta.',
2932
+ waitingTeam: 'Aguardando os responsáveis.',
2933
+ },
2934
+ planning: {
2935
+ viewSummary: 'Resumo',
2936
+ viewTasks: 'Tarefas',
2937
+ viewPlanning: 'Planejamento',
2938
+ viewSchedule: 'Cronograma',
2939
+ viewRisks: 'Riscos',
2940
+ viewWorkflow: 'Fluxo',
2941
+ loadError: 'Não foi possível carregar o planejamento.',
2942
+ saveError: 'Não foi possível salvar. Tente de novo.',
2943
+ retry: 'Tentar de novo',
2944
+ save: 'Salvar',
2945
+ cancel: 'Cancelar',
2946
+ delete: 'Excluir',
2947
+ edit: 'Editar',
2948
+ points: 'Pontos',
2949
+ pointsValue: { zero: '0 pts', one: '{count} pt', other: '{count} pts' },
2950
+ noEstimate: 'Sem estimativa',
2951
+ backlog: 'Backlog',
2952
+ noSprint: 'Nenhuma sprint em andamento.',
2953
+ unassigned: 'Sem responsável',
2954
+ dateRange: '{start} a {end}',
2955
+ summary: {
2956
+ activeSprint: 'Sprint em andamento',
2957
+ sprintPoints: '{done} de {total} pts concluídos',
2958
+ sprintCapacity: 'Capacidade: {capacity} pts',
2959
+ openTasks: 'Tarefas abertas',
2960
+ overdue: 'Vencidas',
2961
+ mine: 'Minhas tarefas',
2962
+ mineEmpty: 'Nada aberto atribuído a você.',
2963
+ deadlines: 'Prazos dos próximos 7 dias',
2964
+ deadlinesEmpty: 'Nenhum prazo vencido ou nos próximos 7 dias.',
2965
+ topRisks: 'Riscos altos',
2966
+ topRisksEmpty: 'Nenhum risco alto em aberto.',
2967
+ riskScore: 'Probabilidade {likelihood} · impacto {impact}',
2968
+ nextMilestone: 'Próximo marco',
2969
+ nextMilestoneEmpty: 'Nenhum marco à frente.',
2970
+ },
2971
+ tasks: {
2972
+ viewLabel: 'Mostrar como',
2973
+ viewList: 'Lista',
2974
+ viewTable: 'Tabela',
2975
+ listLabel: 'Tarefas abertas',
2976
+ gridCaption: 'Tarefas abertas do app',
2977
+ count: { zero: 'Nenhuma tarefa aberta', one: '{count} tarefa aberta', other: '{count} tarefas abertas' },
2978
+ open: 'Abrir',
2979
+ emptyHeading: 'Nenhuma tarefa aberta',
2980
+ emptyBody: 'As tarefas em análise, planejadas e em desenvolvimento aparecem aqui.',
2981
+ key: 'Chave',
2982
+ title: 'Título',
2983
+ status: 'Status',
2984
+ priority: 'Prioridade',
2985
+ assignee: 'Responsável',
2986
+ sprint: 'Sprint',
2987
+ due: 'Prazo',
2988
+ },
2989
+ sprints: {
2990
+ heading: 'Backlog e sprints',
2991
+ hint: 'Arraste uma tarefa para uma sprint ou de volta ao backlog.',
2992
+ readOnlyClosed: 'Sprints encerradas ficam só para consulta.',
2993
+ new: 'Nova sprint',
2994
+ start: 'Iniciar',
2995
+ close: 'Encerrar',
2996
+ state: { planned: 'Planejada', active: 'Em andamento', closed: 'Encerrada' },
2997
+ closeHeading: 'Encerrar {name}?',
2998
+ closeMessage: 'As tarefas não concluídas voltam ao backlog.',
2999
+ deleteHeading: 'Excluir {name}?',
3000
+ deleteMessage: 'As tarefas dela voltam ao backlog.',
3001
+ newHeading: 'Nova sprint',
3002
+ editHeading: 'Editar sprint',
3003
+ name: 'Nome',
3004
+ nameRequired: 'Informe o nome da sprint.',
3005
+ goal: 'Meta',
3006
+ start_date: 'Início',
3007
+ end_date: 'Fim',
3008
+ datesRequired: 'Informe o início e o fim.',
3009
+ datesOrder: 'O fim não pode ser antes do início.',
3010
+ capacity: 'Capacidade (pts)',
3011
+ activeExists: 'Já existe uma sprint em andamento: encerre-a antes de iniciar outra.',
3012
+ moved: '{key} foi para {target}.',
3013
+ progressHeading: 'Andamento de {name}',
3014
+ done: 'Concluído',
3015
+ committed: 'Comprometido',
3016
+ capacityUse: 'Uso da capacidade',
3017
+ burndownCaption: 'Burndown de {name}: pontos restantes por dia',
3018
+ day: 'Dia',
3019
+ ideal: 'Ideal',
3020
+ remaining: 'Restante',
3021
+ closed: 'Sprints encerradas',
3022
+ },
3023
+ schedule: {
3024
+ heading: 'Cronograma',
3025
+ label: 'Cronograma das tarefas',
3026
+ hint: 'Arraste uma barra para mudar o início e o prazo. Só aparecem as tarefas com data.',
3027
+ milestones: 'Marcos',
3028
+ newMilestone: 'Novo marco',
3029
+ milestoneTitle: 'Título',
3030
+ milestoneDate: 'Data',
3031
+ milestoneRequired: 'Informe o título e a data do marco.',
3032
+ removeMilestone: 'Excluir o marco {title}',
3033
+ rescheduled: '{key}: datas salvas.',
3034
+ conflicts: '{key} começa antes de terminar: {list}.',
3035
+ workloadHeading: 'Carga da equipe',
3036
+ workloadLabel: 'Pontos por pessoa nas próximas 4 semanas',
3037
+ workloadHint: 'Capacidade de referência: {capacity} pts por pessoa por semana.',
3038
+ week: 'Semana de {date}',
3039
+ noPeople: 'Ninguém tem tarefa com data e responsável.',
3040
+ },
3041
+ risks: {
3042
+ heading: 'Riscos',
3043
+ label: 'Riscos das tarefas do app',
3044
+ hint: 'Cada risco é de uma tarefa. Clique numa célula da matriz para filtrar a lista; clique num risco para editar.',
3045
+ new: 'Novo risco',
3046
+ newHeading: 'Novo risco',
3047
+ editHeading: 'Editar risco',
3048
+ title: 'Risco',
3049
+ titleRequired: 'Descreva o risco.',
3050
+ owner: 'Dono',
3051
+ status: 'Status',
3052
+ mitigation: 'Mitigação',
3053
+ deleteHeading: 'Excluir este risco?',
3054
+ statuses: { identified: 'Identificado', mitigating: 'Em mitigação', closed: 'Encerrado' },
3055
+ task: 'Tarefa',
3056
+ taskPlaceholder: 'Escolha a tarefa ameaçada',
3057
+ taskRequired: 'Escolha a tarefa do risco.',
3058
+ noTask: 'Sem tarefa',
3059
+ level: 'Risco',
3060
+ levels: { low: 'Baixo', medium: 'Médio', high: 'Alto', critical: 'Crítico' },
3061
+ ofTask: 'Riscos',
3062
+ add: 'Adicionar risco',
3063
+ empty: 'Nenhum risco nesta tarefa.',
3064
+ },
3065
+ workflow: {
3066
+ heading: 'Fluxo das sugestões',
3067
+ hint: 'Os status que quem pede acompanha em "Minhas sugestões". O fluxo é o mesmo para todos os apps.',
3068
+ label: 'Fluxo dos status das sugestões',
3069
+ count: { zero: 'Nenhuma no quadro', one: '{count} no quadro', other: '{count} no quadro' },
3070
+ plan: 'Planejar',
3071
+ start: 'Começar',
3072
+ finish: 'Concluir',
3073
+ refuse: 'Recusar',
3074
+ reopen: 'Reabrir',
3075
+ },
3076
+ detail: {
3077
+ estimate: 'Pontos',
3078
+ sprint: 'Sprint',
3079
+ backlogOption: 'Backlog (sem sprint)',
3080
+ dependsOn: 'Depende de',
3081
+ dependsOnPlaceholder: 'Buscar tarefa',
3082
+ dependencyCycle: 'Essa dependência formaria um ciclo entre as tarefas.',
3083
+ blockedBy: 'Bloqueada por {list}',
3084
+ },
3085
+ },
2795
3086
  },
2796
3087
  };
2797
3088
 
2798
3089
  const SPINE_MESSAGES_EN = {
2799
3090
  meta: { locale: 'en' },
3091
+ inbox: {
3092
+ title: 'Notifications',
3093
+ button: { zero: 'Notifications', one: 'Notifications, {count} new', other: 'Notifications, {count} new' },
3094
+ empty: 'Nothing new here.',
3095
+ error: 'Could not load the notifications.',
3096
+ retry: 'Try again',
3097
+ news: { one: '{count} update', other: '{count} updates' },
3098
+ },
2800
3099
  header: {
2801
3100
  home: 'Home',
2802
3101
  apps: 'Applications',
@@ -2833,6 +3132,7 @@ const SPINE_MESSAGES_EN = {
2833
3132
  modules: 'Modules',
2834
3133
  moduleNavigation: '{module} navigation',
2835
3134
  apps: 'Applications',
3135
+ openInNewTab: 'Open in new tab',
2836
3136
  },
2837
3137
  pageBar: {
2838
3138
  favorite: 'Add this page to favorites',
@@ -3004,6 +3304,7 @@ const SPINE_MESSAGES_EN = {
3004
3304
  goFavorite: 'Go to favorite no. 1 to 9',
3005
3305
  history: 'Back / forward in history',
3006
3306
  openSettings: 'Open settings',
3307
+ toggleSidebar: 'Open / collapse the side menu',
3007
3308
  toggleTheme: 'Toggle light / dark theme',
3008
3309
  fullscreen: 'Full screen',
3009
3310
  logout: 'Sign out',
@@ -3035,6 +3336,9 @@ const SPINE_MESSAGES_EN = {
3035
3336
  sidebarDescription: 'How the side menu opens and closes.',
3036
3337
  sidebarKeywords: 'sidebar navigation side bar',
3037
3338
  sidebarHelp: 'Automatic: opens when the pointer approaches. Fixed: always open. Compact: shows only the icons.',
3339
+ splitTabs: 'Split tabs',
3340
+ splitTabsDescription: 'Open panels side by side or one below the other, each with its own tabs. Off, the open tabs stay in a single panel.',
3341
+ splitTabsKeywords: 'split screen panels side by side tabs compare',
3038
3342
  sidebarAuto: 'Automatic',
3039
3343
  sidebarFixed: 'Fixed',
3040
3344
  sidebarCompact: 'Compact',
@@ -3105,7 +3409,7 @@ const SPINE_MESSAGES_EN = {
3105
3409
  favoritesCleared: 'Favorites cleared.',
3106
3410
  restorePreferences: 'Preferences',
3107
3411
  restorePreferencesDescription: 'Appearance, accessibility and formats go back to the defaults.',
3108
- restorePreferencesHelp: 'Back to the defaults: theme, main color, density, font, side menu, text size, animations, time format and first day of the week. Language, time zone and single-key shortcuts stay as they are.',
3412
+ restorePreferencesHelp: 'Back to the defaults: theme, main color, density, font, side menu, split tabs, text size, animations, time format and first day of the week. Language, time zone and single-key shortcuts stay as they are.',
3109
3413
  restorePreferencesKeywords: 'restore default reset preferences',
3110
3414
  restore: 'Restore defaults',
3111
3415
  confirmRestore: 'Confirm',
@@ -3243,7 +3547,14 @@ const SPINE_MESSAGES_EN = {
3243
3547
  back: 'Back to groups',
3244
3548
  you: 'you',
3245
3549
  membersCount: { zero: 'No members', one: '{count} member', other: '{count} members' },
3550
+ matchesCount: { zero: 'No members found', one: '{count} member found', other: '{count} members found' },
3246
3551
  empty: 'No members in this group.',
3552
+ noMatches: 'No member matches this search.',
3553
+ filterMembers: 'Search members',
3554
+ loadingProgress: 'Loading members… {loaded} of {total}',
3555
+ partialResults: 'The list is still loading: the result may grow.',
3556
+ loadIncomplete: "Couldn't load all members ({loaded} of {total}).",
3557
+ retry: 'Try again',
3247
3558
  readOnly: 'As a member, you can only see who is in the group.',
3248
3559
  addMember: 'Add member',
3249
3560
  addHeading: 'Add to {group}',
@@ -3595,6 +3906,10 @@ const SPINE_MESSAGES_EN = {
3595
3906
  memberSearch: 'Search members...',
3596
3907
  membersOf: 'Members of group {group}',
3597
3908
  noMembersShort: 'No members.',
3909
+ noMembersMatch: 'No member matches this search.',
3910
+ membersLoadingProgress: 'Loading members… {loaded} of {total}',
3911
+ membersPartialResults: 'The list and the search may still grow.',
3912
+ membersLoadIncomplete: "Couldn't load all members ({loaded} of {total}).",
3598
3913
  newMember: 'New',
3599
3914
  addedBy: 'by {user}',
3600
3915
  removal: 'Removal',
@@ -4164,8 +4479,6 @@ const SPINE_MESSAGES_EN = {
4164
4479
  kindFilter: 'Type',
4165
4480
  allKinds: 'All types',
4166
4481
  refresh: 'Refresh',
4167
- boardEmpty: 'No suggestions yet',
4168
- boardEmptyHint: 'Requests made with the "Suggest an improvement" button on each page show up here.',
4169
4482
  boardFiltered: '{shown} of {total} suggestions',
4170
4483
  loadError: 'Could not load the suggestions.',
4171
4484
  moveError: 'Could not move the suggestion. The board was reloaded.',
@@ -4183,7 +4496,7 @@ const SPINE_MESSAGES_EN = {
4183
4496
  eventComment: '{actor} commented',
4184
4497
  someone: 'Someone',
4185
4498
  comment: 'Comment for the requester',
4186
- commentHint: 'The person sees it in "My suggestions".',
4499
+ commentHint: 'The requester sees it on the "App suggestions" page.',
4187
4500
  commentSend: 'Comment',
4188
4501
  commentSent: 'Comment sent.',
4189
4502
  commentError: 'Could not send the comment.',
@@ -4285,16 +4598,10 @@ const SPINE_MESSAGES_EN = {
4285
4598
  menuLabel: 'Labels',
4286
4599
  menuNoLabels: 'No labels in this app',
4287
4600
  menuPriority: 'Priority',
4288
- menuCover: 'Choose cover',
4289
4601
  menuArchive: 'Archive',
4290
4602
  menuRestore: 'Restore to the board',
4291
4603
  menuDelete: 'Delete',
4292
- cover: 'Cover',
4293
- coverSolid: 'Colors',
4294
- coverGradient: 'Gradients',
4295
- coverRemove: 'Remove cover',
4296
- coverName: 'Color {n}',
4297
- gradientName: 'Gradient {n}',
4604
+ labelColorName: 'Color {n}',
4298
4605
  linkCopied: 'Link copied.',
4299
4606
  keyCopied: 'Key copied.',
4300
4607
  copyError: 'Could not copy.',
@@ -4320,7 +4627,7 @@ const SPINE_MESSAGES_EN = {
4320
4627
  checklistUp: 'Move "{text}" up',
4321
4628
  checklistDown: 'Move "{text}" down',
4322
4629
  tabComments: 'Comments',
4323
- tabActivity: 'Activity',
4630
+ tabActivity: 'History',
4324
4631
  commentsEmpty: 'No comments yet.',
4325
4632
  activityEmpty: 'No activity yet.',
4326
4633
  commentInternal: 'Team only (internal: the requester does not see it)',
@@ -4436,11 +4743,245 @@ const SPINE_MESSAGES_EN = {
4436
4743
  mergedHere: 'Merged here',
4437
4744
  mergedFrom: '{key} merged into {target}',
4438
4745
  mergedFromHint: 'Identical requests became one: follow it here.',
4746
+ buttonMenu: 'Suggestions',
4747
+ openPage: 'View app suggestions',
4748
+ screenPick: 'Screen',
4749
+ screenPickHint: 'The screen that should change. If it does not exist yet, choose "New screen".',
4750
+ screenPickPlaceholder: 'Search by screen name',
4751
+ newScreenOption: 'New screen (does not exist yet)',
4752
+ newScreenName: 'New screen name',
4753
+ newScreenHint: 'What you would call the screen and where in the menu it would go.',
4754
+ newScreenRequired: 'Name the new screen.',
4755
+ newScreenTag: 'New screen',
4756
+ waiting: { solicitante: 'Waiting on requester', responsaveis: 'Waiting on assignees' },
4757
+ waitingFilter: 'Waiting on',
4758
+ waitingAny: 'Any',
4759
+ waitingClear: 'Nobody (conversation up to date)',
4760
+ waitingSaved: 'Conversation status updated.',
4761
+ menuWaiting: 'Waiting on',
4762
+ groupFilter: 'Group',
4763
+ allGroups: 'All groups',
4764
+ requestingGroups: 'Requesting groups',
4765
+ noGroups: 'No group (created by the team)',
4766
+ unread: { zero: 'none new', one: '{count} new', other: '{count} new' },
4767
+ fromRequester: 'Requester',
4768
+ cardChecklist: { one: '{count} task ({done}/{count})', other: '{count} tasks ({done}/{count})' },
4769
+ requestedByName: 'Requested by {name}',
4770
+ tabSummary: 'Summary',
4771
+ chatAuthor: '{name} ({role})',
4772
+ chatSendHint: 'Enter sends; Shift+Enter adds a line break.',
4773
+ inbox: {
4774
+ label: 'Suggestions',
4775
+ comment: '{name}: {comment}',
4776
+ status: '{name} changed the status to {status}',
4777
+ },
4778
+ page: {
4779
+ title: 'App suggestions',
4780
+ allTitle: 'All suggestions',
4781
+ statusPart: '{count} {status}',
4782
+ description: 'Follow what you asked for, what your group asked for and the suggestions you are involved in, and talk to the assignees.',
4783
+ reasons: { autor: 'Mine', relator: 'Merged', envolvido: 'Involved', responsavel: 'Assignee', grupo: 'My group' },
4784
+ reasonHints: {
4785
+ autor: 'You asked for this suggestion.',
4786
+ relator: 'A request of yours was merged into this suggestion.',
4787
+ envolvido: 'The team added you as involved.',
4788
+ responsavel: 'You are an assignee of this suggestion.',
4789
+ grupo: 'Someone in your group asked for this suggestion.',
4790
+ },
4791
+ reasonFilter: 'Why I see it',
4792
+ allReasons: 'All',
4793
+ needsYou: 'Need your reply',
4794
+ sorts: { activity: 'Recent activity', recent: 'Newest', votes: 'Most supported' },
4795
+ empty: 'No suggestions here yet.',
4796
+ emptyHint: 'Ask for an improvement in "Suggest an improvement": it shows up here with the conversation.',
4797
+ emptyFiltered: 'No suggestions match these filters.',
4798
+ error: 'Could not load the suggestions.',
4799
+ count: { one: '{count} suggestion', other: '{count} suggestions' },
4800
+ pickOne: 'Pick a suggestion to see its details and conversation.',
4801
+ notFound: 'Suggestion not found, or you do not have access to it.',
4802
+ conversation: 'Conversation',
4803
+ conversationEmpty: 'Nobody has written yet.',
4804
+ conversationError: 'Could not load the conversation.',
4805
+ olderMessages: 'Older messages',
4806
+ reply: 'Your message',
4807
+ replyPlaceholder: 'Reply to the assignees, add more details…',
4808
+ replySend: 'Send',
4809
+ replyError: 'Could not send the message.',
4810
+ readOnly: 'You follow this suggestion through your group: you can support it, but the conversation belongs to the requesters, the people involved and the assignees.',
4811
+ team: 'Team',
4812
+ you: 'You',
4813
+ groups: 'Groups',
4814
+ details: 'Details',
4815
+ listLabel: 'Suggestions',
4816
+ filtersLabel: 'Filters',
4817
+ waitingYou: 'The assignees are waiting for your reply.',
4818
+ waitingTeam: 'Waiting on the assignees.',
4819
+ },
4820
+ planning: {
4821
+ viewSummary: 'Summary',
4822
+ viewTasks: 'Tasks',
4823
+ viewPlanning: 'Planning',
4824
+ viewSchedule: 'Schedule',
4825
+ viewRisks: 'Risks',
4826
+ viewWorkflow: 'Workflow',
4827
+ loadError: 'Could not load the planning.',
4828
+ saveError: 'Could not save. Try again.',
4829
+ retry: 'Try again',
4830
+ save: 'Save',
4831
+ cancel: 'Cancel',
4832
+ delete: 'Delete',
4833
+ edit: 'Edit',
4834
+ points: 'Points',
4835
+ pointsValue: { zero: '0 pts', one: '{count} pt', other: '{count} pts' },
4836
+ noEstimate: 'No estimate',
4837
+ backlog: 'Backlog',
4838
+ noSprint: 'No sprint in progress.',
4839
+ unassigned: 'Unassigned',
4840
+ dateRange: '{start} to {end}',
4841
+ summary: {
4842
+ activeSprint: 'Sprint in progress',
4843
+ sprintPoints: '{done} of {total} pts done',
4844
+ sprintCapacity: 'Capacity: {capacity} pts',
4845
+ openTasks: 'Open tasks',
4846
+ overdue: 'Overdue',
4847
+ mine: 'My tasks',
4848
+ mineEmpty: 'Nothing open assigned to you.',
4849
+ deadlines: 'Due in the next 7 days',
4850
+ deadlinesEmpty: 'Nothing overdue or due in the next 7 days.',
4851
+ topRisks: 'High risks',
4852
+ topRisksEmpty: 'No open high risk.',
4853
+ riskScore: 'Likelihood {likelihood} · impact {impact}',
4854
+ nextMilestone: 'Next milestone',
4855
+ nextMilestoneEmpty: 'No milestone ahead.',
4856
+ },
4857
+ tasks: {
4858
+ viewLabel: 'Show as',
4859
+ viewList: 'List',
4860
+ viewTable: 'Table',
4861
+ listLabel: 'Open tasks',
4862
+ gridCaption: 'Open tasks of the app',
4863
+ count: { zero: 'No open task', one: '{count} open task', other: '{count} open tasks' },
4864
+ open: 'Open',
4865
+ emptyHeading: 'No open task',
4866
+ emptyBody: 'Tasks under review, planned and in development show up here.',
4867
+ key: 'Key',
4868
+ title: 'Title',
4869
+ status: 'Status',
4870
+ priority: 'Priority',
4871
+ assignee: 'Assignee',
4872
+ sprint: 'Sprint',
4873
+ due: 'Due',
4874
+ },
4875
+ sprints: {
4876
+ heading: 'Backlog and sprints',
4877
+ hint: 'Drag a task into a sprint or back to the backlog.',
4878
+ readOnlyClosed: 'Closed sprints are read only.',
4879
+ new: 'New sprint',
4880
+ start: 'Start',
4881
+ close: 'Close',
4882
+ state: { planned: 'Planned', active: 'In progress', closed: 'Closed' },
4883
+ closeHeading: 'Close {name}?',
4884
+ closeMessage: 'Tasks that are not done go back to the backlog.',
4885
+ deleteHeading: 'Delete {name}?',
4886
+ deleteMessage: 'Its tasks go back to the backlog.',
4887
+ newHeading: 'New sprint',
4888
+ editHeading: 'Edit sprint',
4889
+ name: 'Name',
4890
+ nameRequired: 'Enter the sprint name.',
4891
+ goal: 'Goal',
4892
+ start_date: 'Start',
4893
+ end_date: 'End',
4894
+ datesRequired: 'Enter the start and the end.',
4895
+ datesOrder: 'The end cannot be before the start.',
4896
+ capacity: 'Capacity (pts)',
4897
+ activeExists: 'A sprint is already in progress: close it before starting another one.',
4898
+ moved: '{key} moved to {target}.',
4899
+ progressHeading: 'Progress of {name}',
4900
+ done: 'Done',
4901
+ committed: 'Committed',
4902
+ capacityUse: 'Capacity used',
4903
+ burndownCaption: 'Burndown of {name}: points left per day',
4904
+ day: 'Day',
4905
+ ideal: 'Ideal',
4906
+ remaining: 'Remaining',
4907
+ closed: 'Closed sprints',
4908
+ },
4909
+ schedule: {
4910
+ heading: 'Schedule',
4911
+ label: 'Task schedule',
4912
+ hint: 'Drag a bar to change the start and the due date. Only tasks with a date show up.',
4913
+ milestones: 'Milestones',
4914
+ newMilestone: 'New milestone',
4915
+ milestoneTitle: 'Title',
4916
+ milestoneDate: 'Date',
4917
+ milestoneRequired: 'Enter the milestone title and date.',
4918
+ removeMilestone: 'Delete the milestone {title}',
4919
+ rescheduled: '{key}: dates saved.',
4920
+ conflicts: '{key} starts before these finish: {list}.',
4921
+ workloadHeading: 'Team workload',
4922
+ workloadLabel: 'Points per person over the next 4 weeks',
4923
+ workloadHint: 'Reference capacity: {capacity} pts per person per week.',
4924
+ week: 'Week of {date}',
4925
+ noPeople: 'Nobody has a task with a date and an assignee.',
4926
+ },
4927
+ risks: {
4928
+ heading: 'Risks',
4929
+ label: 'Risks of the app tasks',
4930
+ hint: 'Each risk belongs to a task. Click a matrix cell to filter the list; click a risk to edit it.',
4931
+ new: 'New risk',
4932
+ newHeading: 'New risk',
4933
+ editHeading: 'Edit risk',
4934
+ title: 'Risk',
4935
+ titleRequired: 'Describe the risk.',
4936
+ owner: 'Owner',
4937
+ status: 'Status',
4938
+ mitigation: 'Mitigation',
4939
+ deleteHeading: 'Delete this risk?',
4940
+ statuses: { identified: 'Identified', mitigating: 'Mitigating', closed: 'Closed' },
4941
+ task: 'Task',
4942
+ taskPlaceholder: 'Choose the task at risk',
4943
+ taskRequired: 'Choose the task of the risk.',
4944
+ noTask: 'No task',
4945
+ level: 'Risk',
4946
+ levels: { low: 'Low', medium: 'Medium', high: 'High', critical: 'Critical' },
4947
+ ofTask: 'Risks',
4948
+ add: 'Add risk',
4949
+ empty: 'No risks on this task.',
4950
+ },
4951
+ workflow: {
4952
+ heading: 'Suggestion workflow',
4953
+ hint: 'The statuses requesters follow in "My suggestions". The workflow is the same for every app.',
4954
+ label: 'Suggestion status workflow',
4955
+ count: { zero: 'None on the board', one: '{count} on the board', other: '{count} on the board' },
4956
+ plan: 'Plan',
4957
+ start: 'Start',
4958
+ finish: 'Finish',
4959
+ refuse: 'Decline',
4960
+ reopen: 'Reopen',
4961
+ },
4962
+ detail: {
4963
+ estimate: 'Points',
4964
+ sprint: 'Sprint',
4965
+ backlogOption: 'Backlog (no sprint)',
4966
+ dependsOn: 'Depends on',
4967
+ dependsOnPlaceholder: 'Search task',
4968
+ dependencyCycle: 'This dependency would create a cycle between the tasks.',
4969
+ blockedBy: 'Blocked by {list}',
4970
+ },
4971
+ },
4439
4972
  },
4440
4973
  };
4441
4974
 
4442
4975
  const SPINE_MESSAGES_ES = {
4443
4976
  meta: { locale: 'es' },
4977
+ inbox: {
4978
+ title: 'Notificaciones',
4979
+ button: { zero: 'Notificaciones', one: 'Notificaciones, {count} nueva', other: 'Notificaciones, {count} nuevas' },
4980
+ empty: 'Nada nuevo por aquí.',
4981
+ error: 'No se pudieron cargar las notificaciones.',
4982
+ retry: 'Intentar de nuevo',
4983
+ news: { one: '{count} novedad', other: '{count} novedades' },
4984
+ },
4444
4985
  header: {
4445
4986
  home: 'Inicio',
4446
4987
  apps: 'Aplicaciones',
@@ -4477,6 +5018,7 @@ const SPINE_MESSAGES_ES = {
4477
5018
  modules: 'Módulos',
4478
5019
  moduleNavigation: 'Navegación de {module}',
4479
5020
  apps: 'Aplicaciones',
5021
+ openInNewTab: 'Abrir en una pestaña nueva',
4480
5022
  },
4481
5023
  pageBar: {
4482
5024
  favorite: 'Agregar esta página a favoritos',
@@ -4648,6 +5190,7 @@ const SPINE_MESSAGES_ES = {
4648
5190
  goFavorite: 'Ir al favorito n.º 1 a 9',
4649
5191
  history: 'Atrás / adelante en el historial',
4650
5192
  openSettings: 'Abrir la configuración',
5193
+ toggleSidebar: 'Abrir / contraer el menú lateral',
4651
5194
  toggleTheme: 'Alternar tema claro / oscuro',
4652
5195
  fullscreen: 'Pantalla completa',
4653
5196
  logout: 'Salir (cerrar sesión)',
@@ -4679,6 +5222,9 @@ const SPINE_MESSAGES_ES = {
4679
5222
  sidebarDescription: 'Cómo se abre y se cierra el menú lateral.',
4680
5223
  sidebarKeywords: 'sidebar navegación barra lateral',
4681
5224
  sidebarHelp: 'Automático: se abre al acercar el puntero. Fijo: siempre abierto. Compacto: muestra solo los íconos.',
5225
+ splitTabs: 'Dividir pestañas',
5226
+ splitTabsDescription: 'Abrir paneles lado a lado o uno debajo del otro, cada uno con sus pestañas. Desactivado, las pestañas abiertas quedan en un solo panel.',
5227
+ splitTabsKeywords: 'dividir pantalla paneles lado a lado pestañas comparar split',
4682
5228
  sidebarAuto: 'Automático',
4683
5229
  sidebarFixed: 'Fijo',
4684
5230
  sidebarCompact: 'Compacto',
@@ -4749,7 +5295,7 @@ const SPINE_MESSAGES_ES = {
4749
5295
  favoritesCleared: 'Favoritos borrados.',
4750
5296
  restorePreferences: 'Preferencias',
4751
5297
  restorePreferencesDescription: 'Apariencia, accesibilidad y formatos vuelven a los valores predeterminados.',
4752
- restorePreferencesHelp: 'Vuelven a lo predeterminado: tema, color principal, densidad, fuente, menú lateral, tamaño del texto, animaciones, formato de hora y primer día de la semana. El idioma, la zona horaria y los atajos de una sola tecla se mantienen.',
5298
+ restorePreferencesHelp: 'Vuelven a lo predeterminado: tema, color principal, densidad, fuente, menú lateral, dividir pestañas, tamaño del texto, animaciones, formato de hora y primer día de la semana. El idioma, la zona horaria y los atajos de una sola tecla se mantienen.',
4753
5299
  restorePreferencesKeywords: 'restaurar predeterminado restablecer reset preferencias',
4754
5300
  restore: 'Restaurar',
4755
5301
  confirmRestore: 'Confirmar',
@@ -4887,7 +5433,14 @@ const SPINE_MESSAGES_ES = {
4887
5433
  back: 'Volver a los grupos',
4888
5434
  you: 'tú',
4889
5435
  membersCount: { zero: 'Ningún miembro', one: '{count} miembro', other: '{count} miembros' },
5436
+ matchesCount: { zero: 'Ningún miembro encontrado', one: '{count} miembro encontrado', other: '{count} miembros encontrados' },
4890
5437
  empty: 'Ningún miembro en este grupo.',
5438
+ noMatches: 'Ningún miembro coincide con esta búsqueda.',
5439
+ filterMembers: 'Buscar miembro',
5440
+ loadingProgress: 'Cargando miembros… {loaded} de {total}',
5441
+ partialResults: 'La lista todavía está cargando: el resultado puede crecer.',
5442
+ loadIncomplete: 'No se pudieron cargar todos los miembros ({loaded} de {total}).',
5443
+ retry: 'Intentar de nuevo',
4891
5444
  readOnly: 'Como miembro, solo ves quién está en el grupo.',
4892
5445
  addMember: 'Incluir miembro',
4893
5446
  addHeading: 'Incluir en {group}',
@@ -5239,6 +5792,10 @@ const SPINE_MESSAGES_ES = {
5239
5792
  memberSearch: 'Buscar miembro...',
5240
5793
  membersOf: 'Miembros del grupo {group}',
5241
5794
  noMembersShort: 'Ningún miembro.',
5795
+ noMembersMatch: 'Ningún miembro coincide con esta búsqueda.',
5796
+ membersLoadingProgress: 'Cargando miembros… {loaded} de {total}',
5797
+ membersPartialResults: 'La lista y la búsqueda todavía pueden crecer.',
5798
+ membersLoadIncomplete: 'No se pudieron cargar todos los miembros ({loaded} de {total}).',
5242
5799
  newMember: 'Nuevo',
5243
5800
  addedBy: 'por {user}',
5244
5801
  removal: 'Eliminación',
@@ -5808,8 +6365,6 @@ const SPINE_MESSAGES_ES = {
5808
6365
  kindFilter: 'Tipo',
5809
6366
  allKinds: 'Todos los tipos',
5810
6367
  refresh: 'Actualizar',
5811
- boardEmpty: 'Todavía no hay sugerencias',
5812
- boardEmptyHint: 'Los pedidos hechos con el botón "Sugerir una mejora" de las pantallas aparecen aquí.',
5813
6368
  boardFiltered: '{shown} de {total} sugerencias',
5814
6369
  loadError: 'No fue posible cargar las sugerencias.',
5815
6370
  moveError: 'No fue posible mover la sugerencia. El tablero se recargó.',
@@ -5827,7 +6382,7 @@ const SPINE_MESSAGES_ES = {
5827
6382
  eventComment: '{actor} comentó',
5828
6383
  someone: 'Alguien',
5829
6384
  comment: 'Comentario para quien la pidió',
5830
- commentHint: 'La persona lo ve en "Mis sugerencias".',
6385
+ commentHint: 'Quien la pidió lo ve en la página "Sugerencias de la app".',
5831
6386
  commentSend: 'Comentar',
5832
6387
  commentSent: 'Comentario enviado.',
5833
6388
  commentError: 'No fue posible enviar el comentario.',
@@ -5929,16 +6484,10 @@ const SPINE_MESSAGES_ES = {
5929
6484
  menuLabel: 'Etiquetas',
5930
6485
  menuNoLabels: 'Ninguna etiqueta en la aplicación',
5931
6486
  menuPriority: 'Prioridad',
5932
- menuCover: 'Elegir portada',
5933
6487
  menuArchive: 'Archivar',
5934
6488
  menuRestore: 'Restaurar en el tablero',
5935
6489
  menuDelete: 'Eliminar',
5936
- cover: 'Portada',
5937
- coverSolid: 'Colores',
5938
- coverGradient: 'Degradados',
5939
- coverRemove: 'Quitar portada',
5940
- coverName: 'Color {n}',
5941
- gradientName: 'Degradado {n}',
6490
+ labelColorName: 'Color {n}',
5942
6491
  linkCopied: 'Enlace copiado.',
5943
6492
  keyCopied: 'Clave copiada.',
5944
6493
  copyError: 'No fue posible copiar.',
@@ -5964,7 +6513,7 @@ const SPINE_MESSAGES_ES = {
5964
6513
  checklistUp: 'Subir "{text}"',
5965
6514
  checklistDown: 'Bajar "{text}"',
5966
6515
  tabComments: 'Comentarios',
5967
- tabActivity: 'Actividades',
6516
+ tabActivity: 'Historial',
5968
6517
  commentsEmpty: 'Todavía sin comentarios.',
5969
6518
  activityEmpty: 'Todavía sin actividades.',
5970
6519
  commentInternal: 'Solo para el equipo (interno: quien la pidió no lo ve)',
@@ -6080,6 +6629,232 @@ const SPINE_MESSAGES_ES = {
6080
6629
  mergedHere: 'Agrupadas aquí',
6081
6630
  mergedFrom: '{key} agrupada en {target}',
6082
6631
  mergedFromHint: 'Pedidos iguales se volvieron uno: sígalo por esta.',
6632
+ buttonMenu: 'Sugerencias',
6633
+ openPage: 'Ver sugerencias de la app',
6634
+ screenPick: 'Pantalla',
6635
+ screenPickHint: 'La pantalla que debe cambiar. Si todavía no existe, elija "Nueva pantalla".',
6636
+ screenPickPlaceholder: 'Busque por el nombre de la pantalla',
6637
+ newScreenOption: 'Nueva pantalla (todavía no existe)',
6638
+ newScreenName: 'Nombre de la nueva pantalla',
6639
+ newScreenHint: 'Cómo llamaría a la pantalla y en qué parte del menú quedaría.',
6640
+ newScreenRequired: 'Indique el nombre de la nueva pantalla.',
6641
+ newScreenTag: 'Nueva pantalla',
6642
+ waiting: { solicitante: 'Esperando al solicitante', responsaveis: 'Esperando a los responsables' },
6643
+ waitingFilter: 'Esperando',
6644
+ waitingAny: 'Cualquier situación',
6645
+ waitingClear: 'Nadie (conversación al día)',
6646
+ waitingSaved: 'Situación de la conversación actualizada.',
6647
+ menuWaiting: 'Esperando',
6648
+ groupFilter: 'Grupo',
6649
+ allGroups: 'Todos los grupos',
6650
+ requestingGroups: 'Grupos solicitantes',
6651
+ noGroups: 'Sin grupo (creada por el equipo)',
6652
+ unread: { zero: 'ninguna nueva', one: '{count} nueva', other: '{count} nuevas' },
6653
+ fromRequester: 'Solicitante',
6654
+ cardChecklist: { one: '{count} actividad ({done}/{count})', other: '{count} actividades ({done}/{count})' },
6655
+ requestedByName: 'Pedida por {name}',
6656
+ tabSummary: 'Resumen',
6657
+ chatAuthor: '{name} ({role})',
6658
+ chatSendHint: 'Enter envía; Shift+Enter agrega un salto de línea.',
6659
+ inbox: {
6660
+ label: 'Sugerencias',
6661
+ comment: '{name}: {comment}',
6662
+ status: '{name} cambió el estado a {status}',
6663
+ },
6664
+ page: {
6665
+ title: 'Sugerencias de la app',
6666
+ allTitle: 'Todas las sugerencias',
6667
+ statusPart: '{count} {status}',
6668
+ description: 'Siga lo que usted pidió, lo que pidió su grupo y las sugerencias en las que está involucrado, y converse con los responsables.',
6669
+ reasons: { autor: 'Mías', relator: 'Agrupadas', envolvido: 'Involucrado', responsavel: 'Responsable', grupo: 'De mi grupo' },
6670
+ reasonHints: {
6671
+ autor: 'Usted pidió esta sugerencia.',
6672
+ relator: 'Un pedido suyo fue agrupado en esta sugerencia.',
6673
+ envolvido: 'El equipo lo incluyó como involucrado.',
6674
+ responsavel: 'Usted es responsable de esta sugerencia.',
6675
+ grupo: 'Alguien de su grupo pidió esta sugerencia.',
6676
+ },
6677
+ reasonFilter: 'Por qué la veo',
6678
+ allReasons: 'Todas',
6679
+ needsYou: 'Necesitan su respuesta',
6680
+ sorts: { activity: 'Actividad reciente', recent: 'Más nuevas', votes: 'Más apoyadas' },
6681
+ empty: 'Todavía no hay sugerencias aquí.',
6682
+ emptyHint: 'Pida una mejora en "Sugerir mejora": aparece aquí con la conversación.',
6683
+ emptyFiltered: 'Ninguna sugerencia con esos filtros.',
6684
+ error: 'No fue posible cargar las sugerencias.',
6685
+ count: { one: '{count} sugerencia', other: '{count} sugerencias' },
6686
+ pickOne: 'Elija una sugerencia para ver los detalles y la conversación.',
6687
+ notFound: 'Sugerencia no encontrada, o usted no tiene acceso a ella.',
6688
+ conversation: 'Conversación',
6689
+ conversationEmpty: 'Nadie escribió todavía.',
6690
+ conversationError: 'No fue posible cargar la conversación.',
6691
+ olderMessages: 'Mensajes anteriores',
6692
+ reply: 'Su mensaje',
6693
+ replyPlaceholder: 'Responda a los responsables, dé más detalles…',
6694
+ replySend: 'Enviar',
6695
+ replyError: 'No fue posible enviar el mensaje.',
6696
+ readOnly: 'Usted sigue esta sugerencia por su grupo: puede apoyarla, pero la conversación es solo de quienes la pidieron, los involucrados y los responsables.',
6697
+ team: 'Equipo',
6698
+ you: 'Usted',
6699
+ groups: 'Grupos',
6700
+ details: 'Detalles',
6701
+ listLabel: 'Sugerencias',
6702
+ filtersLabel: 'Filtros',
6703
+ waitingYou: 'Los responsables esperan su respuesta.',
6704
+ waitingTeam: 'Esperando a los responsables.',
6705
+ },
6706
+ planning: {
6707
+ viewSummary: 'Resumen',
6708
+ viewTasks: 'Tareas',
6709
+ viewPlanning: 'Planificación',
6710
+ viewSchedule: 'Cronograma',
6711
+ viewRisks: 'Riesgos',
6712
+ viewWorkflow: 'Flujo',
6713
+ loadError: 'No se pudo cargar la planificación.',
6714
+ saveError: 'No se pudo guardar. Inténtalo de nuevo.',
6715
+ retry: 'Intentar de nuevo',
6716
+ save: 'Guardar',
6717
+ cancel: 'Cancelar',
6718
+ delete: 'Eliminar',
6719
+ edit: 'Editar',
6720
+ points: 'Puntos',
6721
+ pointsValue: { zero: '0 pts', one: '{count} pt', other: '{count} pts' },
6722
+ noEstimate: 'Sin estimación',
6723
+ backlog: 'Backlog',
6724
+ noSprint: 'Ningún sprint en curso.',
6725
+ unassigned: 'Sin responsable',
6726
+ dateRange: '{start} a {end}',
6727
+ summary: {
6728
+ activeSprint: 'Sprint en curso',
6729
+ sprintPoints: '{done} de {total} pts terminados',
6730
+ sprintCapacity: 'Capacidad: {capacity} pts',
6731
+ openTasks: 'Tareas abiertas',
6732
+ overdue: 'Vencidas',
6733
+ mine: 'Mis tareas',
6734
+ mineEmpty: 'Nada abierto asignado a ti.',
6735
+ deadlines: 'Plazos de los próximos 7 días',
6736
+ deadlinesEmpty: 'Ningún plazo vencido ni en los próximos 7 días.',
6737
+ topRisks: 'Riesgos altos',
6738
+ topRisksEmpty: 'Ningún riesgo alto abierto.',
6739
+ riskScore: 'Probabilidad {likelihood} · impacto {impact}',
6740
+ nextMilestone: 'Próximo hito',
6741
+ nextMilestoneEmpty: 'Ningún hito por delante.',
6742
+ },
6743
+ tasks: {
6744
+ viewLabel: 'Mostrar como',
6745
+ viewList: 'Lista',
6746
+ viewTable: 'Tabla',
6747
+ listLabel: 'Tareas abiertas',
6748
+ gridCaption: 'Tareas abiertas de la app',
6749
+ count: { zero: 'Ninguna tarea abierta', one: '{count} tarea abierta', other: '{count} tareas abiertas' },
6750
+ open: 'Abrir',
6751
+ emptyHeading: 'Ninguna tarea abierta',
6752
+ emptyBody: 'Las tareas en análisis, planificadas y en desarrollo aparecen aquí.',
6753
+ key: 'Clave',
6754
+ title: 'Título',
6755
+ status: 'Estado',
6756
+ priority: 'Prioridad',
6757
+ assignee: 'Responsable',
6758
+ sprint: 'Sprint',
6759
+ due: 'Plazo',
6760
+ },
6761
+ sprints: {
6762
+ heading: 'Backlog y sprints',
6763
+ hint: 'Arrastra una tarea a un sprint o de vuelta al backlog.',
6764
+ readOnlyClosed: 'Los sprints cerrados son solo de consulta.',
6765
+ new: 'Nuevo sprint',
6766
+ start: 'Iniciar',
6767
+ close: 'Cerrar',
6768
+ state: { planned: 'Planificado', active: 'En curso', closed: 'Cerrado' },
6769
+ closeHeading: '¿Cerrar {name}?',
6770
+ closeMessage: 'Las tareas no terminadas vuelven al backlog.',
6771
+ deleteHeading: '¿Eliminar {name}?',
6772
+ deleteMessage: 'Sus tareas vuelven al backlog.',
6773
+ newHeading: 'Nuevo sprint',
6774
+ editHeading: 'Editar sprint',
6775
+ name: 'Nombre',
6776
+ nameRequired: 'Indica el nombre del sprint.',
6777
+ goal: 'Objetivo',
6778
+ start_date: 'Inicio',
6779
+ end_date: 'Fin',
6780
+ datesRequired: 'Indica el inicio y el fin.',
6781
+ datesOrder: 'El fin no puede ser antes del inicio.',
6782
+ capacity: 'Capacidad (pts)',
6783
+ activeExists: 'Ya hay un sprint en curso: ciérralo antes de iniciar otro.',
6784
+ moved: '{key} pasó a {target}.',
6785
+ progressHeading: 'Avance de {name}',
6786
+ done: 'Terminado',
6787
+ committed: 'Comprometido',
6788
+ capacityUse: 'Uso de la capacidad',
6789
+ burndownCaption: 'Burndown de {name}: puntos restantes por día',
6790
+ day: 'Día',
6791
+ ideal: 'Ideal',
6792
+ remaining: 'Restante',
6793
+ closed: 'Sprints cerrados',
6794
+ },
6795
+ schedule: {
6796
+ heading: 'Cronograma',
6797
+ label: 'Cronograma de las tareas',
6798
+ hint: 'Arrastra una barra para cambiar el inicio y el plazo. Solo aparecen las tareas con fecha.',
6799
+ milestones: 'Hitos',
6800
+ newMilestone: 'Nuevo hito',
6801
+ milestoneTitle: 'Título',
6802
+ milestoneDate: 'Fecha',
6803
+ milestoneRequired: 'Indica el título y la fecha del hito.',
6804
+ removeMilestone: 'Eliminar el hito {title}',
6805
+ rescheduled: '{key}: fechas guardadas.',
6806
+ conflicts: '{key} empieza antes de que terminen: {list}.',
6807
+ workloadHeading: 'Carga del equipo',
6808
+ workloadLabel: 'Puntos por persona en las próximas 4 semanas',
6809
+ workloadHint: 'Capacidad de referencia: {capacity} pts por persona por semana.',
6810
+ week: 'Semana del {date}',
6811
+ noPeople: 'Nadie tiene una tarea con fecha y responsable.',
6812
+ },
6813
+ risks: {
6814
+ heading: 'Riesgos',
6815
+ label: 'Riesgos de las tareas de la app',
6816
+ hint: 'Cada riesgo es de una tarea. Haz clic en una celda de la matriz para filtrar la lista; haz clic en un riesgo para editarlo.',
6817
+ new: 'Nuevo riesgo',
6818
+ newHeading: 'Nuevo riesgo',
6819
+ editHeading: 'Editar riesgo',
6820
+ title: 'Riesgo',
6821
+ titleRequired: 'Describe el riesgo.',
6822
+ owner: 'Dueño',
6823
+ status: 'Estado',
6824
+ mitigation: 'Mitigación',
6825
+ deleteHeading: '¿Eliminar este riesgo?',
6826
+ statuses: { identified: 'Identificado', mitigating: 'En mitigación', closed: 'Cerrado' },
6827
+ task: 'Tarea',
6828
+ taskPlaceholder: 'Elige la tarea amenazada',
6829
+ taskRequired: 'Elige la tarea del riesgo.',
6830
+ noTask: 'Sin tarea',
6831
+ level: 'Riesgo',
6832
+ levels: { low: 'Bajo', medium: 'Medio', high: 'Alto', critical: 'Crítico' },
6833
+ ofTask: 'Riesgos',
6834
+ add: 'Agregar riesgo',
6835
+ empty: 'Ningún riesgo en esta tarea.',
6836
+ },
6837
+ workflow: {
6838
+ heading: 'Flujo de las sugerencias',
6839
+ hint: 'Los estados que quien pide sigue en "Mis sugerencias". El flujo es el mismo para todas las apps.',
6840
+ label: 'Flujo de estados de las sugerencias',
6841
+ count: { zero: 'Ninguna en el tablero', one: '{count} en el tablero', other: '{count} en el tablero' },
6842
+ plan: 'Planificar',
6843
+ start: 'Empezar',
6844
+ finish: 'Terminar',
6845
+ refuse: 'Rechazar',
6846
+ reopen: 'Reabrir',
6847
+ },
6848
+ detail: {
6849
+ estimate: 'Puntos',
6850
+ sprint: 'Sprint',
6851
+ backlogOption: 'Backlog (sin sprint)',
6852
+ dependsOn: 'Depende de',
6853
+ dependsOnPlaceholder: 'Buscar tarea',
6854
+ dependencyCycle: 'Esta dependencia formaría un ciclo entre las tareas.',
6855
+ blockedBy: 'Bloqueada por {list}',
6856
+ },
6857
+ },
6083
6858
  },
6084
6859
  };
6085
6860
 
@@ -6138,5 +6913,5 @@ function provideSpineMessages(config) {
6138
6913
  * Generated bundle index. Do not edit.
6139
6914
  */
6140
6915
 
6141
- export { APP_PACKAGE_INFO, DensityService, HERMES_DS_IMPORTS, SPINE_ADMIN_API, SPINE_CONFIG, SPINE_DEFAULT_LOGO, SPINE_I18N_CONFIG, SPINE_ICONS, SPINE_IDLE_OPTIONS, SPINE_MESSAGES, SPINE_MESSAGES_EN, SPINE_MESSAGES_ES, SPINE_MESSAGES_PT_BR, SPINE_USER_STORAGE_KEYS, SpinePreferencesService, SpineQuickAccessService, SpineUserStorage, ThemePresetService, ThemeService, applyRuntimeEnvironment, applySpineFavicon, currentSpineMessages, mergeRouteTree, provideSpineMessages, provideUi, resolveSpineLogo, routerIdOf, spineRoutesOf };
6916
+ export { APP_PACKAGE_INFO, DensityService, HERMES_DS_IMPORTS, SPINE_ADMIN_API, SPINE_CONFIG, SPINE_DEFAULT_LOGO, SPINE_I18N_CONFIG, SPINE_ICONS, SPINE_IDLE_OPTIONS, SPINE_MESSAGES, SPINE_MESSAGES_EN, SPINE_MESSAGES_ES, SPINE_MESSAGES_PT_BR, SPINE_USER_STORAGE_KEYS, SpinePreferencesService, SpineQuickAccessService, SpineUserStorage, ThemePresetService, ThemeService, applyRuntimeEnvironment, applySpineFavicon, clearSpineBuiltinPages, currentSpineMessages, mergeRouteTree, provideSpineMessages, provideUi, registerSpineBuiltinPage, resolveSpineLogo, routerIdOf, spineBuiltinPageAt, spineBuiltinPageById, spineRoutesOf };
6142
6917
  //# sourceMappingURL=trismegisto-spine.mjs.map